- 1. 【Golang】構造体②メソッド
- 2. Go製のToolをHaskellで実装する
- 3. GoでGoogle Maps APIを使って場所の詳細情報を取得する(例:東京タワー)
- 4. 【Golang】構造体
- 5. Vuguに触れてみた(構文確認編)
- 6. Vuguに触れてみた(環境構築編)
- 7. pion/webrtc のexampleのタイムアウトを伸ばす
- 8. Go言語でAWS SNSにメッセージを送信する
- 9. goose設定ファイルに環境変数を読み込めない(Docker環境)
- 10. GitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
- 11. xerrorsの誤った使い方について
- 12. Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
- 13. 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
- 14. bykof/statefulを使って、Golangで状態遷移(State machine)を扱う
- 15. Cognito UserPoolsのAuthorizerをGoでデコードする
- 16. プロセスをあいまい検索してkillするツールをGoで作った
- 17. Diff+Historyコマンド=hifferで快適なターミナル作業しようぜ
- 18. 【Golang】newとmakeの違い
- 19. golang raceについて 競合チェック
- 20. [テスト入門]外部APIを実際に叩いたりしていませんか? GoでDIによるテストモック
【Golang】構造体②メソッド
#【Golang】構造体②メソッド
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//メソッドとポインタレシーバーと値レシーバー
//メソッド class内関数のselfを使えるようなイメージ(Goにはクラスが無い)
//コードがわかりやすいimport (
“fmt”
)//バーテックスを作成
type Vertex struct {
X, Y int
}//1
func Scale1(v *Vertex, i int) {
v.X = v.X * i
v.Y = v.Y * i
}//2
//メソッド
func (v Vertex) Area() int {
return v.X * v.Y
}//メソッド
//structのポインタを渡す 値を上書きする
//原則ポインタ型にする
//引数も渡す
func (v *Vertex) Scale2(i int) {
v.X = v.X * i
v.Y = v.Y * i
}fun
Go製のToolをHaskellで実装する
# 初めに
最近Haskellの学習としてGo製のToolをHaskellで実装するようにしています。
Haskellでなにかしら作りたいと考えていて、そういえばGo製のToolはよく作られているから面白そうなものありそうだなと思ったのがきっかけです。
mockサーバであるhttplabをHaskellで作ることにしました。
まだ100%の実装ができていないのですが、ある程度形ができたので記事を書くことにしました。
![screeencast.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217752/bd2e51db-1a92-a530-ec8c-75c9bf2718e6.gif)
ソースコードは[こちら](https://github.com/kwhrstr/httplabkell)にあります。
Haskellでbrickというライブラリを使っていますが、使い方等は[以前書いた記事](https://qiita.com/kwhrstr1206/items/25acf6eb3c43f
GoでGoogle Maps APIを使って場所の詳細情報を取得する(例:東京タワー)
# はじめに
GoでGoogleMapsAPIを使った記事があまりなかったので書いてみました。
GoogleMapsAPIには様々なAPIがあるのですが、今回は[Place](https://cloud.google.com/maps-platform/places?hl=ja)というAPIを使ってみたいと思います!Placeの詳細情報はこちら。
[Overview | Places API](https://developers.google.com/places/web-service/intro)# GCPで事前準備
GoogleMapsAPIを使うにはGCPのアカウント作成、プロジェクト作成、APIKEYの取得が必要です。以下からこれらを作成します。
[Google Cloud Platform](https://cloud.google.com/docs?hl=ja)詳しい手順はこちらが参考になります。
[Google Maps Platform APIキーの取得・発行について](https://www.zenrin-datacom.net/business/
【Golang】構造体
#【Golang】構造体
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//struct 構造体
//クラスのような感じimport (
“fmt”
)//struct
//型
//キャピタル=頭文字を大文字にする。小文字だと外部からアクセスできない
type Vertex struct {
X int
Y string
Z int
}//3 値を書き換える関数は、引数をポインタ型にする
//関数 Xを書き換える
//引数がポインタ型ではないので変わらない
func Changev(v Vertex) {
v.X = 100000
}//関数 Yを書き換える
//引数はポインタ型で渡す
func Changev2(v *Vertex) {
//本当は下記で書くといいが、
// (*v).X = 1000
//下記でも、自動で*vにしてくれる
v.X = 1000000
}func main() {
//1
//宣言
v := Ver
Vuguに触れてみた(構文確認編)
# はじめに
こちらは別記事([Vuguに触れてみた(環境構築編) ](https://qiita.com/inagacky/items/a1c8f13f0aa3c956ef5f
))の続きです。
今回は実際に構文確認しつつ、Vuguに触れていきたいと思います。Vuguに触れてみた(環境構築)のファイル構成前提で始めますので、ご了承ください。
また、今回作ったものに関しては下記リポジトリに置いています。(更新するかもです。)
https://github.com/inagacky/vugu_sample# 構文確認
まずは `root.vugu` を元に、色々と触れていこうと思います。
初期状態だと色々文言が入っていますので、削除してから始めています。## vg-if
`Show Button` というボタンをクリックすると、 `Show` というbool型の値が変わり、
`SAMPLE TEXT` という文言を表示するだけのコードです。“`go:root.vugu
Vuguに触れてみた(環境構築編) # はじめに
一時期小耳に挟んだ `Vugu` という技術について、今更ながら触れてみたので記事にしてみました。# Vuguとは
`Golang` で、 `Vue.js` っぽくフロントエンド を記述できるライブラリです。
`WebAssebmly` で実行されるのでコードの漏洩がなかったり、実行速度も比較的高速らしいです。
公式URLは下記
https://www.vugu.org/
`2020/04/26` に `v0.3.0` が出たようなので、まだまだ発展途上の技術ではあります。# 環境構築
環境構築だけなら、下記公式の手順を行なっていけばできます。
https://www.vugu.org/doc/start## 前提
`Golang` の `v1.14` 以上らしいので、予めインストールをお願いします。
Macで、homebrewを使っていれば、下記コマンドだけでGolangのインストール可能です。“`
% brew install go
“`
その他の方法に関しては、公式のインストールをご確認ください。
https://golang.org/doc/ipion/webrtc のexampleのタイムアウトを伸ばす
[pion](https://github.com/pion/webrtc) は Go で書かれた WebRTC 実装です。
これを試してみようとして、まずexampleを動かしてみようとしました。https://github.com/pion/webrtc/blob/master/examples/README.md
通信を行うときに両者でお互いの通信条件を取り交わす必要があります。これをシグナリングと呼んでいます。
WebRTCではシグナリングの方法は仕様で定めらていません。
ここのexamplesでは、それを「コピぺ」によって行うようになっています。(1) webページのフォームに表示された文字列をコピぺして実行ファイルの標準入力に食わせる。
(2) 実行ファイルの標準出力に出てきた文字列をコピぺしてwebページのもうひとつのフォームに入力する。
(3) webページ上の’Start Session’のボタンを押す。やってみると、これがなかなかうまくいきません。(3)のボタンを押す直前でタイムアウトしてしまいます。
コピペする文字列は百行近くある巨大なものなので、スGo言語でAWS SNSにメッセージを送信する
## 概要
Amazon Simple Notification Service(SNS)で、Go言語のSDKを使ってトピックに対してメッセージを送信します。## 環境
– Go : 1.14.3
– Mac OS X : 10.15.4
– AWS SDK for Go## シンプルな実装
“`go:シンプルなメッセージ送信
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sns”
)// TopicARNとRegionは環境に合わせます
const (
TopicARN = “arn:aws:sns:XXXXXXXXXXXXXXXXX”
AwsRegion = “XXXXXX”
)func main() {
// SNSクライアントの作成
mySession := session.Must(session.Negoose設定ファイルに環境変数を読み込めない(Docker環境)
# 概要
Docker環境でGo製マイグレーションツールのgooseを使用する際、設定ファイルである`dbconf.yml`が環境変数を読んでくれませんでした。### dbconf.yml
~~~yml
development:
driver: mymysql
open: $MYSQL_URI
~~~
環境変数は、**$変数**という形式で読み込んでくれるはずなのですが・・・([公式参照](https://bitbucket.org/liamstask/goose/src/master/))### Dockerfile
~~~dockerfile
FROM golang:1.14.2-alpineWORKDIR /go/src/server
COPY . .
ENV GO111MODULE=onRUN apk add –no-cache \
alpine-sdk=1.0-r0 \
&& go get github.com/pilu/fresh \
bitbucket.org/liamstask/goose/cGitHub Wikiの目次(ToC)をURLから作成してくれるツールをGo+Ginで作る
GitHubのWikiを充実させたい => 目次手書きで書くのが面倒!
ということでGo + [Gin](https://github.com/gin-gonic/gin)を使ってToCジェネレータを作成しました。
![Screen Shot 2020-05-24 at 23.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/d9111f6c-d22f-2d71-00b4-b60fbe249c6c.png)
GitHub WikiのURLを入力するとToC(Table of Contents(目次))を作成してくれます。
デプロイは [Zeit Vercel(旧 Zeit Now)](https://vercel.com/)で行おうとしたのですがうまくいきませんでした。(このサービスめっちゃ好きなので残念)
https://github.com/yousan/toc-generator/
## Gin
Goのウェブ用フレームワークです。ルーティングやテンプレートなどの機能xerrorsの誤った使い方について
# お題
Go 1.13 で `%w` によるログのラップが可能になった。
が、その方式でログ出力すると(エラー時の)スタックトレースが吐けない。
ので、スタックトレース吐くために [xerrors](https://godoc.org/golang.org/x/xerrors)パッケージが用意されている。
これで、エラー時にスタックトレース付きでログが吐ける。
といった話は、既にたくさん記事があるので、この`xerrors`パッケージをこうやって間違って使ってしまったという事例を2つほど。# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”
“`## # バックエンド
### # 言語 – Golang
“`
$ go version
go version go1.13.9 linux/amd64
“`### IDE – Goland
“`
GoLand 2020.1.2
Build #GO-201.Golang sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロード
sync.WaitGroupとsemaphoreを使って10並列で画像ダウンロードするサンプルスクリプトです。
並列実行数が10を超過しないように、semaphoreを使っています。便利です
[sync.semaphore](https://github.com/golang/sync/blob/master/semaphore/semaphore.go#L40) の実装を読んでみると面白いですよ[golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する](https://blog.lufia.org/entry/2018/01/26/141300) を参考にしつつ実装してみました
“`go:main.go
package mainimport (
“context”
“fmt”
“io”
“net/http”
“os”
“sync”“golang.org/x/sync/semaphore”
)var wg *sync.WaitGroup
var sm = semaphore.NewWeighted(10) //【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
## 【Go】構造体のフィールドに定義してある`_ struct{}`はどういう意味?
ライブラリのコードを読んでいると`_ struct{}`というフィールドが定義してある構造体をみかけることがありますが、これはどういう意味なのか?というお話です。
結論としては、これは構造体を初期化する際に、フィールド名の指定を強制する意図で宣言されています。
### blank identifierを用いた構造体の定義とComposite literalsによる構造体の初期化
“`go
type SomeType struct {
Field1 string
Field2 bool
_ struct{}
}
“``_`はblank identifierと呼ばれるものです。
これは、`dev/null`に似ていて、blank identifierに割当てられた値や宣言は、無害な方法で、~~虚無のブラックホールへと~~捨て去られます。(`_`がブラックホールの穴に見えてくる…)ここでは詳しく説明しませんが、[Effective Go](htt
bykof/statefulを使って、Golangで状態遷移(State machine)を扱う
## はじめに
ビジネスロジックを実装していると、状態の管理はいつもついて回ります。
この辺のgolangでの実装について、[bykof/stateful](https://github.com/bykof/stateful)がいい感じだったので紹介します。## [bykof/stateful](https://github.com/bykof/stateful)の使い方
例として、以下のようなとある注文システムの状態遷移図を実現してみます
![image.png](http://www.plantuml.com/plantuml/png/SoWkIImgAStDuKh9J2zABCXGo2zAIIrIgERYT79rz_JJjVFCSmQgY5R8IKnApR5L2axDIKqk2IZAJobDBb5IYBM6A_G7QKnDWQi4ynLICek0wlEBAY5g8QRXK0nH0fNIjGER2rVXd9YNd9g3LqbmHdu1q6L9EQcv1DHb5Y0v7UuiX0vhBgvQBeVKl1HWo000)
### 1. 状態を定義する
まずは状態遷移図の○部分
Cognito UserPoolsのAuthorizerをGoでデコードする
# 概要
* AWSのAPI Gatewayの認証にCognito UserPoolsのAuthorizerを用いるときに、API側でもユーザーの一意性を保つために認証します
* その際Cognitoから取得できるJWTのデコードが必要になるのでGo言語でのデコード方法についてまとめました
* クライアント側でAmplifyやリダイレクト後のURLなどを用いてCognitoからIDトークンを取得する方法については既知とします# Amazon Cognito ユーザープール認証
* Cognitoを用いたログインをクライアントから行うと、ユーザープールからJWT(JSON Web Token)が返されます
* JWTは**Base64**でエンコードされたJSON文字列であり、ユーザーに関する情報(クレーム)が含まれています
* (このBase64でエンコードされていると言う情報によりかなり苦しむことになりました…)
* エンコードされた文字列は`***.***.***`のように`ドット(.)`で3つのセクションに分けられています
* 3つのセクションはヘッダー、ペイロープロセスをあいまい検索してkillするツールをGoで作った
## はじめに
仕事しているとプロセスをkillすることがたまにあると思います。大体は`ps`、`awk`、`grep`で必要なプロセスIDを抽出して`kill`コマンドに渡していますが、
ぼくはそれがとても面倒に感じているので、あいまい検索してプロセスをkillしたいなと思って`fk(fuzzy-finder-killer)`ってコマンドを作りました。![](https://i.imgur.com/Q6ONFRz.gif)
## 導入と使い方
`go get github.com/skanehira/fk`もしくは[releases](https://github.com/skanehira/fk/releases)からバイナリをダウンロードしてください。使い方は `fk` を実行するだけです。
`fk` を実行するとあいまい検索できる状態になるので、任意の単語を入力して、`CTRL-i`で選択します。
`Enter`で選択済みのプロセスをkillします。キーバインドは次になります。
| key | description |
|——–|-Diff+Historyコマンド=hifferで快適なターミナル作業しようぜ
まず、こういう記事がありまして。
[テストに対する考え方「Testing Manifesto」を翻訳したので紹介します](https://nihonbuson.hatenadiary.jp/entry/TestingManifesto)
で、モヤっと
「俺らSIerは何で**全部設定してから最後にまとめてテスト**やるんだろう?
途中で設定崩れたり、最後一回きりの確認じゃ見過ごしも起こるよな。
もっと、**テスト駆動**っぽく作業すれば良いのに」とか思って、
“`
シェルをラップして一回設定したら、
その値が崩れないように裏でチェックして
お知らせしてくれるツール作ったら
臨時の手動設定/運用作業がすこぶる捗るな。
“`こういう事をピコーンと思いついてツイートしたわけです。
続いて“`
今度作ってみよう。
“`と書いてしまったのでニーズはわからんが、似たようなもの無いし、有言実行!
### 作ってみた。
## どんなのですかー
シェルをラップして、コマンドを実行したらその出力をハッシュで
記録しHistoryコマンドみたいにリストで持っておきます。【Golang】newとmakeの違い
#【Golang】newとmakeの違い
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。“`
package main
//new makeの違い
//new メモリーにポインタが入る空の領域を確保したい場合
//ここ調査import (
“fmt”
)type Person struct{
id int
name string
}func main() {
//アドレスだけ付与する
var p *int = new(int)
fmt.Println(p)
//>>0xc000016068
fmt.Println(**&p)
//>>0
fmt.Println(*p)
//>>0//メモリーはあるので、(0なので)カウントアップする
*p++
fmt.Println(*p)//まだアドレスがない
/*
var p2 *int
fmt.Println(p2)
//>>nil//アドレスはnilなのでエラーになる
*p2++
fmgolang raceについて 競合チェック
# golan raceについて試してみた
#### -raceをつけることで、競合チェックができる
“`race.go
package mainimport “fmt”
func main() {
c := make(chan bool)
m := make(map[string]string)
go func() {
m[“1”] = “a” // First conflicting access.
c <- true }() m["2"] = "b" // Second conflicting access. <-c for k, v := range m { fmt.Println(k, v) } } ``` 結果 ``` $ go run -race race.go ================== WARNING: DATA RACE Write at 0x00c00011c180 by goroutine 7: runtime.mapassign_faststr() /usr/local/Cellar/go[テスト入門]外部APIを実際に叩いたりしていませんか? GoでDIによるテストモック
# はじめに
TwitterAPIや形態素解析APIを使うサービスでテストをしたいときがあると思います。
また、レイヤードアーキテクチャ等で下層の処理を含めたテストしたいときがあると思います。
まさか、TwitterAPIを実際に叩いたりしたテストをしていませんか?このような場合はテストモックを使ってテストを行うのが一般的です。
Goではモックライブラリを使わずに、自前でモックすることが多いのです。テストと強気にでましたが、ここではユニットテストを指しています。
# 実装
以下のTwitterAPIクライアントをサービス層で利用するとします。“`go:twitter.go
package qiita_test_mockimport (
“net/url”“github.com/ChimeraCoder/anaconda”
)type ITwitterApiClient interface {
PostTweet(string, url.Values) (anaconda.Tweet, error)
}// Golangでよく見るanacondaのT
関連する記事
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた