- 投稿日:2020-04-07T23:52:17+09:00
Go-twitter で相互フォローを実装する
Go-twitter で GET friendships/lookup で作成した lookup API を利用して、go-twitter で相互フォローを実装してみます。
twitterut.gopackage twitterut import ( "bytes" "context" "fmt" "net/http" "strings" "cloud.google.com/go/logging" "github.com/dghubble/go-twitter/twitter" "github.com/dghubble/oauth1" "github.com/dghubble/sling" ) type Client struct { HTTPClient *http.Client *twitter.Client } func NewClient() *Client { config := oauth1.NewConfig("FIXME", "FIXME") token := oauth1.NewToken("FIXME", "FIXME") httpClient := config.Client(oauth1.NoContext, token) client := twitter.NewClient(httpClient) return &Client{ httpClient, client, } } func Followers(ctx context.Context, client *Client) ([]twitter.User, error) { var cursor int64 = -1 result := make([]twitter.User, 0, 2000) for { followers, _, err := client.Followers.List(&twitter.FollowerListParams{ Cursor: cursor, Count: 200, SkipStatus: twitter.Bool(true), IncludeUserEntities: twitter.Bool(false), }) if err != nil { return nil, err } result = append(result, followers.Users...) cursor = followers.NextCursor if cursor == 0 { break } } return result, nil } func Friends(ctx context.Context, client *Client) ([]twitter.User, error) { var cursor int64 = -1 result := make([]twitter.User, 0, 2000) for { friends, _, err := client.Friends.List(&twitter.FriendListParams{ Cursor: cursor, Count: 200, SkipStatus: twitter.Bool(true), IncludeUserEntities: twitter.Bool(false), }) if err != nil { return nil, err } result = append(result, friends.Users...) cursor = friends.NextCursor if cursor == 0 { break } } return result, nil } type FriendshipLookupStatus struct { Name string `json:"name"` ScreenName string `json:"screen_name"` ID int64 `json:"id"` IDStr string `json:"id_str"` Connections []string `json:"connections"` } type FriendshipLookupParams struct { UserID string `url:"user_id,omitempty"` ScreenName string `url:"screen_name,omitempty"` } func relevantError(httpError error, apiError twitter.APIError) error { if httpError != nil { return httpError } if apiError.Empty() { return nil } return apiError } func Lookup(ctx context.Context, client *Client, params *FriendshipLookupParams) ([]FriendshipLookupStatus, *http.Response, error) { s := sling.New().Client(client.HTTPClient).Base("https://api.twitter.com/1.1/").Path("friendships/") friendships := new([]FriendshipLookupStatus) apiError := new(twitter.APIError) resp, err := s.New().Get("lookup.json").QueryStruct(params).Receive(friendships, apiError) return *friendships, resp, relevantError(err, *apiError) } func Friendships(ctx context.Context, client *Client, users []twitter.User) ([]FriendshipLookupStatus, error) { result := make([]FriendshipLookupStatus, 0, len(users)) for i := 0; i < len(users); i += 100 { // GET friendships/lookup は一度のリクエストで 100 ユーザまで var buf bytes.Buffer unit := users[i:mathut.MinInt(i+100, len(users))] for _, user := range unit { stringut.AppendSplit(&buf, user.IDStr, ",") } friendships, _, err := Lookup(ctx, client, &FriendshipLookupParams{ UserID: buf.String(), }) if err != nil { return nil, err } result = append(result, friendships...) } return result, nil } func CreateFriendship(ctx context.Context, client *Client, targetID int64) (*twitter.User, error) { user, _, err := client.Friendships.Create(&twitter.FriendshipCreateParams{ UserID: targetID, }) if err != nil { return nil, err } return user, nil } func DestroyFriendship(ctx context.Context, client *Client, targetID int64) (*twitter.User, error) { user, _, err := client.Friendships.Destroy(&twitter.FriendshipDestroyParams{ UserID: targetID, }) if err != nil { return nil, err } return user, nil } func FollowEachOther(ctx context.Context, client *Client) { { // フォロワーの中で未フォローのユーザをフォロー followers, err := Followers(ctx, client) if err == nil { for i := range followers { if followers[i].Protected { // 鍵がかかっているユーザはフォローしない } else if !followers[i].Following { CreateFriendship(ctx, client, followers[i].ID) } } } } { // フォローユーザの中で自分をフォローしていないユーザをリムーブ friends, err := Friends(ctx, client) if err == nil { // 現在フォロー中のユーザ(friends)が 1500 を超える場合、Friendships はエラーを返します // (GET friendships/lookup が API 1 回の呼び出しで 100 ユーザまでしか取得できない、15 分の間で 15 回までしか API を呼び出せないため) // 1500 ユーザを超える場合 1500 単位で区切って残りは次回にする等の実装が必要ですが、ここでは単純のためやっていません friendships, err := Friendships(ctx, client, friends) if err == nil { for i := range friendships { followedBy := false for _, connection := range friendships[i].Connections { if strings.EqualFold(connection, "followed_by") { followedBy = true break } } if !followedBy { DestroyFriendship(ctx, client, friendships[i].ID) } } } } } }相互フォローって英語だとなんていうんだろ・・って調べたのですがよくわからなかったのでとりあえず FollowEachOther という名前にしてあります。
- 投稿日:2020-04-07T21:01:23+09:00
gRPC: prototoolからbufへの道 ~ vol. 1 ~
gRPC: prototoolからbufへの道 ~ vol. 1 ~
Bufとは
Protobufが技術的なメリットの良い選択になるだけでなく、非常に使いやすく決定が簡単になることです
機能
- 自動ファイル検出
- prototoolとは違い、任意に指定も可能
- 正確なlintとbreaking checkersの構成が選択可能になる
- lint: 40 breaking checkers: 50
- エラー出力はどのエディターでも簡単に解析可能
- コンパイルの高速化
- protoc: 4.3sに対して 4コアでbuf: 0.8s
- protocのプロトコルプラグインとして使用
Buf CLIツール
サポートされている機能
- 優れたAPI設計の選択と構造を強制するリンター
- ソースコードまたはワイヤレベルでの互換性を強制する重大な変更検出器
- FileDescriptorSetsの拡張機能であるイメージを生成する構成可能なファイルビルダー
インストール方法
brew tap bufbuild/buf brew install buf使い方は次回紹介します
- 投稿日:2020-04-07T16:19:09+09:00
Go言語でWebAssemblyを使う際の型変換
ちょっとつまづいたので、忘れないようにメモ代わりに書いておきます。
実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0index.html該当部分だけ表示 <body> <button type="submit" id="v1" onClick="action('100','result')">Action</button><br> <div id="result" >結果</div> </body>エラーになりますfunc act(this js.Value, i []js.Value) interface{} { value1 := i[0] value2 := i[0].String() value3 := i[0].Int() fmt.Println(reflect.TypeOf(value1)) //=> js.value fmt.Println(reflect.TypeOf(value2)) //=> String fmt.Println(reflect.TypeOf(value3)) //=> エラーとなる return nil }コンパイルは問題なく通りました。
これだと動くfunc act(this js.Value, i []js.Value) interface{} { value1 := i[0].String() int1, _ := strconv.Atoi(value1) ~~~~~~~~~~ }数値型で扱う際は、いったんStrign型に変更後、型変換をする必要があります。
要注意ですね。
- 投稿日:2020-04-07T10:57:19+09:00
【Go言語】【短期】Qiitaの今読んでおくべき記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/251091
1332 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22969
643 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/133006
04 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05640
515 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06786
726 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29656
277 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28609
408 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15863
239 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/031186
2210 ゴリラ言語の読み方 mattn 20/03/26
20/03/26356
35611 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10229
4012 Go Modules propella 18/12/05
19/07/17284
3113 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05240
3314 GoのGCを10分で学ぼう gold-kou 19/12/07
19/12/16253
1415 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19145
7316 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20330
4717 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24359
1418 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02407
619 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25675
420 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06315
3621 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09821
2422 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27192
1823 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18154
3024 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17185
2625 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05219
1726 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13706
727 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10177
2428 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19351
2029 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04184
1930 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03746
031 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17106
3432 【Go】print系関数の違い taji-taji 15/09/14
20/02/27263
2033 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30279
1834 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23277
1835 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20209
2136 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20367
1037 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01285
538 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23211
1639 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29188
2940 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11215
2241 プログラムの複雑さを下げるため、条件分岐を減らす方法を考える developer-kikikaikai 20/02/28
20/03/01144
14442 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10385
943 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07194
1044 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18277
1245 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30212
1246 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22144
1447 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16244
1548 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23145
849 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11211
1350 Go 1.13時代のエラー実装者のお作法 shibukawa 19/12/02
19/12/02193
1551 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19879
552 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31203
2253 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11981
054 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/0486
1955 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29322
1156 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08137
1657 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20103
1258 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24107
1559 2019年末版:Chromebookを開発に使う shibukawa 19/12/13
20/03/13137
1960 goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド ramenjuniti 19/11/15
19/11/18241
161 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22633
162 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25568
963 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/0993
2164 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05159
1365 GOのORMを分かりやすくまとめてみた【GORM公式ドキュメントの焼き回し】 gold-kou 19/05/06
20/03/1769
2866 なぜGoを研究で使うのか tetsuzawa 19/12/19
20/02/28145
267 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07127
1268 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13202
1069 Goで書くClean Architecture API muroon 18/12/09
19/03/17243
770 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04222
871 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03189
1572 Goで超簡易版Twitterを作ってみました(初心者向け) kohama66 20/01/16
20/01/17122
12273 Goのinterfaceがわからない人へ rtok 19/05/21
19/07/1352
2874 Go 言語 testing チートシート nirasan 18/03/22
18/03/22116
975 アプリ開発にgomobileを利用する(Android/iOS/Flutter) kabochapo 19/07/15
20/01/10201
1076 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27286
277 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13162
978 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/0989
979 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11311
580 Goでプロセス監視のTUIツールを作ったら便利だった件 gorilla0513 19/10/21
19/10/21172
581 Golangのエラーハンドリングの基本 shoichiimamura 19/01/27
19/01/2766
1582 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/282216
483 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27141
984 Golang フレームワーク比較 yumin 19/01/30
19/10/2471
1385 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19193
886 Go言語でClean Architectureを実現して、gomockでテストしてみた ogady 19/06/27
20/01/2547
2887 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02317
688 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21118
889 CIで使えるコンテナの脆弱性スキャナ knqyf263 19/05/16
19/05/29204
390 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03229
691 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/1893
992 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25295
893 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13241
094 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29142
1595 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21102
796 はじめてのgo test marnie_ms4 17/03/28
18/12/2592
697 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20105
798 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/0271
1099 Go 2のgenerics/contract簡易まとめ lufia 18/09/18
19/09/19162
8100 io.Readerをすこれ ktnyt 19/11/24
19/11/3075
6
1行目が総数。2行目が直近3ヵ月。 ↩
- 投稿日:2020-04-07T10:57:19+09:00
【Go言語】【短期】Qiitaの今読んでおくべき記事100選【毎週自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/251091
1332 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22969
643 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/133006
04 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05640
515 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06786
726 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29656
277 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28609
408 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15863
239 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/031186
2210 ゴリラ言語の読み方 mattn 20/03/26
20/03/26356
35611 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10229
4012 Go Modules propella 18/12/05
19/07/17284
3113 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05240
3314 GoのGCを10分で学ぼう gold-kou 19/12/07
19/12/16253
1415 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19145
7316 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20330
4717 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24359
1418 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02407
619 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25675
420 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06315
3621 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09821
2422 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27192
1823 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18154
3024 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17185
2625 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05219
1726 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13706
727 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10177
2428 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19351
2029 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04184
1930 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03746
031 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17106
3432 【Go】print系関数の違い taji-taji 15/09/14
20/02/27263
2033 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30279
1834 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23277
1835 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20209
2136 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20367
1037 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01285
538 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23211
1639 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29188
2940 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11215
2241 プログラムの複雑さを下げるため、条件分岐を減らす方法を考える developer-kikikaikai 20/02/28
20/03/01144
14442 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10385
943 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07194
1044 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18277
1245 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30212
1246 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22144
1447 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16244
1548 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23145
849 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11211
1350 Go 1.13時代のエラー実装者のお作法 shibukawa 19/12/02
19/12/02193
1551 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19879
552 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31203
2253 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11981
054 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/0486
1955 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29322
1156 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08137
1657 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20103
1258 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24107
1559 2019年末版:Chromebookを開発に使う shibukawa 19/12/13
20/03/13137
1960 goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド ramenjuniti 19/11/15
19/11/18241
161 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22633
162 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25568
963 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/0993
2164 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05159
1365 GOのORMを分かりやすくまとめてみた【GORM公式ドキュメントの焼き回し】 gold-kou 19/05/06
20/03/1769
2866 なぜGoを研究で使うのか tetsuzawa 19/12/19
20/02/28145
267 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07127
1268 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13202
1069 Goで書くClean Architecture API muroon 18/12/09
19/03/17243
770 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04222
871 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03189
1572 Goで超簡易版Twitterを作ってみました(初心者向け) kohama66 20/01/16
20/01/17122
12273 Goのinterfaceがわからない人へ rtok 19/05/21
19/07/1352
2874 Go 言語 testing チートシート nirasan 18/03/22
18/03/22116
975 アプリ開発にgomobileを利用する(Android/iOS/Flutter) kabochapo 19/07/15
20/01/10201
1076 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27286
277 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13162
978 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/0989
979 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11311
580 Goでプロセス監視のTUIツールを作ったら便利だった件 gorilla0513 19/10/21
19/10/21172
581 Golangのエラーハンドリングの基本 shoichiimamura 19/01/27
19/01/2766
1582 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/282216
483 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27141
984 Golang フレームワーク比較 yumin 19/01/30
19/10/2471
1385 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19193
886 Go言語でClean Architectureを実現して、gomockでテストしてみた ogady 19/06/27
20/01/2547
2887 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02317
688 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21118
889 CIで使えるコンテナの脆弱性スキャナ knqyf263 19/05/16
19/05/29204
390 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03229
691 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/1893
992 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25295
893 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13241
094 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29142
1595 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21102
796 はじめてのgo test marnie_ms4 17/03/28
18/12/2592
697 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20105
798 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/0271
1099 Go 2のgenerics/contract簡易まとめ lufia 18/09/18
19/09/19162
8100 io.Readerをすこれ ktnyt 19/11/24
19/11/3075
6
1行目が総数。2行目が直近3ヵ月。 ↩
- 投稿日:2020-04-07T10:57:18+09:00
【Go言語】【長期】Qiitaの今読んでおくべき記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/133006
3242 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/251091
5063 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22969
3404 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05640
2545 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28609
2146 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/031186
1787 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06786
7868 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03746
799 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15863
86310 Go Modules propella 18/12/05
19/07/17284
24111 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06315
11412 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10229
17613 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29656
65614 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05240
18415 【Go】print系関数の違い taji-taji 15/09/14
20/02/27263
8516 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05219
10617 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11981
5918 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09821
5919 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20330
16920 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25675
67521 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04184
10322 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30279
8423 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01285
7024 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20209
8925 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23277
8326 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23211
7827 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27192
12528 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13706
70629 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11215
6530 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17185
11031 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19351
9432 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19145
14533 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20367
7134 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10177
10635 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18154
10936 ゴリラ言語の読み方 mattn 20/03/26
20/03/26356
35637 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30212
6338 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29322
6039 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25568
5040 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07194
6141 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13241
5342 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02407
40743 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19879
1544 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/282216
4045 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10385
8346 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24359
35947 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11211
5648 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13202
5249 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05159
6350 GoのGCを10分で学ぼう gold-kou 19/12/07
19/12/16253
25351 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22633
1252 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02317
4253 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11311
3754 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08137
5755 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16244
6356 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23145
8257 Go言語における埋め込みによるインタフェースの部分実装パターン tenntenn 13/09/18
18/01/16312
3058 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17106
10659 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13162
4660 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22144
9461 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24107
6562 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07127
6663 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29188
18864 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03229
4365 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19193
4566 Go net/httpパッケージの概要とHTTPクライアント実装例 jpshadowapps 14/07/11
14/11/11306
3767 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27141
5268 golang チートシート jca02266 15/01/15
15/01/19305
2469 Go Mockでインタフェースのモックを作ってテストする #golang tenntenn 15/08/23
15/08/24179
3470 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20103
8171 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31203
5772 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03189
3973 Goで書くClean Architecture API muroon 18/12/09
19/03/17243
6574 Go 言語 testing チートシート nirasan 18/03/22
18/03/22116
5975 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04222
7876 Go言語 スライスの確認 mizukmb 15/02/22
18/10/02137
3777 Golangで自分自身で定義したパッケージをインポートする方法あれこれ shopetan 15/10/18
15/10/19119
4078 ターミナル画面を勝手に共有して他人の作業を覗いてみる nashiox 15/12/23
16/01/01264
479 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/0486
7780 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29142
3981 はじめてのgo test marnie_ms4 17/03/28
18/12/2592
4682 GOPATH は適当に決めて問題ない yuku_t 13/10/19
19/02/06284
3183 Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? ruiu 14/08/31
14/09/02209
2584 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18277
27785 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/1893
4586 goでスクレイピングするのにgoquery + bluemonday が最強な件 ryurock 16/02/22
16/02/22243
1787 Go言語の型とreflect atsaki 14/10/12
17/04/28317
2288 loggingについて話そう methane 15/11/09
15/11/09195
3389 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/0993
6690 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25295
3491 Go の Test に対する考え方 Jxck_ 13/12/09
13/12/10571
1492 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20105
4893 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27286
28694 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21118
5895 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/0989
7296 Gin(Golang)におけるHTMLテンプレート記述方法 lanevok 16/05/29
18/04/26118
3297 Go のクロスコンパイル環境構築 Jxck_ 14/07/04
14/08/29462
2598 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/0271
4899 Golangをgoenvを使ってインストールしてみた walkers 17/04/15
17/04/15110
28100 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21102
60
1行目が総数。2行目が直近1年。 ↩
- 投稿日:2020-04-07T10:57:18+09:00
【Go言語】【長期】Qiitaの今読んでおくべき記事100選【毎週自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/133006
3242 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/251091
5063 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22969
3404 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05640
2545 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28609
2146 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/031186
1787 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06786
7868 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03746
799 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15863
86310 Go Modules propella 18/12/05
19/07/17284
24111 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06315
11412 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10229
17613 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29656
65614 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05240
18415 【Go】print系関数の違い taji-taji 15/09/14
20/02/27263
8516 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05219
10617 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11981
5918 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09821
5919 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20330
16920 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25675
67521 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04184
10322 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30279
8423 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01285
7024 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20209
8925 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23277
8326 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23211
7827 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27192
12528 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13706
70629 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11215
6530 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17185
11031 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19351
9432 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19145
14533 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20367
7134 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10177
10635 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18154
10936 ゴリラ言語の読み方 mattn 20/03/26
20/03/26356
35637 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30212
6338 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29322
6039 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25568
5040 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07194
6141 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13241
5342 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02407
40743 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19879
1544 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/282216
4045 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10385
8346 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24359
35947 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11211
5648 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13202
5249 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05159
6350 GoのGCを10分で学ぼう gold-kou 19/12/07
19/12/16253
25351 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22633
1252 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02317
4253 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11311
3754 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08137
5755 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16244
6356 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23145
8257 Go言語における埋め込みによるインタフェースの部分実装パターン tenntenn 13/09/18
18/01/16312
3058 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17106
10659 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13162
4660 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22144
9461 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24107
6562 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07127
6663 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29188
18864 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03229
4365 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19193
4566 Go net/httpパッケージの概要とHTTPクライアント実装例 jpshadowapps 14/07/11
14/11/11306
3767 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27141
5268 golang チートシート jca02266 15/01/15
15/01/19305
2469 Go Mockでインタフェースのモックを作ってテストする #golang tenntenn 15/08/23
15/08/24179
3470 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20103
8171 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31203
5772 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03189
3973 Goで書くClean Architecture API muroon 18/12/09
19/03/17243
6574 Go 言語 testing チートシート nirasan 18/03/22
18/03/22116
5975 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04222
7876 Go言語 スライスの確認 mizukmb 15/02/22
18/10/02137
3777 Golangで自分自身で定義したパッケージをインポートする方法あれこれ shopetan 15/10/18
15/10/19119
4078 ターミナル画面を勝手に共有して他人の作業を覗いてみる nashiox 15/12/23
16/01/01264
479 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/0486
7780 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29142
3981 はじめてのgo test marnie_ms4 17/03/28
18/12/2592
4682 GOPATH は適当に決めて問題ない yuku_t 13/10/19
19/02/06284
3183 Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? ruiu 14/08/31
14/09/02209
2584 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18277
27785 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/1893
4586 goでスクレイピングするのにgoquery + bluemonday が最強な件 ryurock 16/02/22
16/02/22243
1787 Go言語の型とreflect atsaki 14/10/12
17/04/28317
2288 loggingについて話そう methane 15/11/09
15/11/09195
3389 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/0993
6690 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25295
3491 Go の Test に対する考え方 Jxck_ 13/12/09
13/12/10571
1492 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20105
4893 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27286
28694 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21118
5895 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/0989
7296 Gin(Golang)におけるHTMLテンプレート記述方法 lanevok 16/05/29
18/04/26118
3297 Go のクロスコンパイル環境構築 Jxck_ 14/07/04
14/08/29462
2598 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/0271
4899 Golangをgoenvを使ってインストールしてみた walkers 17/04/15
17/04/15110
28100 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21102
60
1行目が総数。2行目が直近1年。 ↩
- 投稿日:2020-04-07T08:48:50+09:00
python, Go, Rust で faiss を動かしてみた
はじめに
みなさん,コロナの渦中でいかがお過ごしでしょうか?不要不急の外出がなくなり持て余した時間を普段できない勉強や検証に当てようと,今回は最近勉強を始めた Go と Rust で faiss を使ってみることにしました.なお,faiss は faiss のちょっとニッチな機能紹介 でも紹介した Facebook Resarch が提供するお気に入りの近傍探索ライブラリです.
実装
それでは早速 python, Go, Rust の順で実装していきたいと思います.
python
まずは環境構築です.本家のインストールガイドに従えば基本的に問題なくモジュールがインストールされます.なお,
conda
でインストールする方法も書かれていますが,個人的にconda
環境には苦い思い出があるのでソースからビルドしました.
次にソースコードです.Go, Rust でも同様ですが,後からパフォーマンス計測をしたかったので,ログは json で出力するようにしています.また,各イテレーションでメモリを解放しないと,イテレーションごとにどんどんメモリが増え続けてしまったので,del 変数
とgc.collect()
を最後に入れて強制的にメモリを解放するようにしています.main.pyimport gc import logging import sys from time import time import faiss import numpy as np from pythonjsonlogger import jsonlogger def elapsed(f, *args, **kwargs): start = time() f(*args, **kwargs) elapsed_time = time() - start return elapsed_time if __name__ == '__main__': # Prepare log. logger = logging.getLogger() formatter = jsonlogger.JsonFormatter('(levelname) (asctime) (pathname) (lineno) (message)') handler = logging.StreamHandler(sys.stdout) handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) # Define basic information. d = 512 N = 1e6 nd = 10 nbs = np.arange(N / nd, N + 1, N / nd).astype(int) nq = 10 k = 5 # Start measuring performance. for i in range(100): for nb in nbs: # Prepare data. xb = np.random.rand(nb, 512).astype(np.float32) xq = np.random.rand(nq, 512).astype(np.float32) # Construct index. index = faiss.IndexFlatL2(d) # Evaluate performance. elapsed_add = elapsed(index.add, xb) elapsed_search = elapsed(index.search, xq, k) # Log performance. logger.info('end one iteration.', extra={ 'i': i, 'nb': nb, 'elapsed_add': elapsed_add, 'elapsed_search': elapsed_search }) # Force to free memory. del xb del xq del index gc.collect()Go
続いて Go です.こちらも環境構築から始めます.Go については,これだ!という faiss wrapper がなかったので,最もシンプルに wrap していそうな zhyon404/faiss を使うことにしました.このレポジトリでは Docker で環境が提供されている ので,README に従い
docker build
して環境を作りました.
次にソースコードです.Go でもログを json 出力にするためにlogrus.JSONFormatter
を使い,各イテレーションでのメモリ解放も実施しています.特に faiss の index は C の領域でメモリ確保しているので,なかなか解放されず,faiss_go.FaissIndexFree
というメソッドを見つけるまでは苦労しました.main.gopackage main import ( "github.com/facebookresearch/faiss/faiss_go" log "github.com/sirupsen/logrus" "math/rand" "os" "runtime" "runtime/debug" "time" ) func main() { // Prepare log. log.SetFormatter(&log.JSONFormatter{}) log.SetOutput(os.Stdout) // Define basic information. d := 512 nbs := []int{1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 1e6} nq := 10 k := 5 // Start measuring performance. for i := 0; i < 100; i++ { for _, nb := range nbs { // Prepare data. xb := make([]float32, d*nb) xq := make([]float32, d*nq) for i := 0; i < nb; i++ { for j := 0; j < d; j++ { xb[d*i+j] = rand.Float32() } } for i := 0; i < nq; i++ { for j := 0; j < d; j++ { xq[d*i+j] = rand.Float32() } } // Construct index. v := new(faiss_go.Faissindexflatl2) faiss_go.FaissIndexflatl2NewWith(&v, d) index := (*faiss_go.Faissindex)(v) // Evaluate performance. add_start := time.Now() faiss_go.FaissIndexAdd(index, nb, xb) add_end := time.Now() I := make([]int, k*nq) D := make([]float32, k*nq) search_start := time.Now() faiss_go.FaissIndexSearch(index, nq, xq, k, D, I) search_end := time.Now() // Log performance. log.WithFields(log.Fields{ "i": i, "nb": nb, "elapsed_add": add_end.Sub(add_start).Seconds(), "elapsed_search": search_end.Sub(search_start).Seconds(), }).Info("end one iteration.") // Force to free memory. faiss_go.FaissIndexFree(index) runtime.GC() debug.FreeOSMemory() } } }Rust
最後に Rust です.ここでも環境構築からです.faiss の wrapper は Docs.rs にも公開されている Enet4/faiss-rs を使うことにしました.基本的には README に従っていけばインストールできるのですが,
This will result in the dynamic library faiss_c ("libfaiss_c.so" in Linux), which needs to be installed in a place where your system will pick up. In Linux, try somewhere in the LD_LIBRARY_PATH environment variable, such as "/usr/lib", or try adding a new path to this variable.
とライブラリへのパス追加を忘れないことが重要です.また,環境によっては
LIBRARY_PATH
にも追加しないと動かないようです.
次にソースコードです.こちらも同様にログを json 出力するためにjson_logger
を使っています.サンプルに従いstruct
を定義していますが,もっとよい方法があるんじゃないかな?と考えています.また Rust の乱数生成が遅くパフォーマンス計測がしんどかったので Rustで乱数生成するときの処理速度の違い を参考にrand_xorshift
を使うようにしました.面白かったのは,python, Go とは異なり C 領域でのメモリ確保が絡んでくるにも関わらず,特にメモリ解放を意識することなく実装できたことです.Cargo.toml[package] name = "rust" version = "0.1.0" authors = [] edition = "2018" [dependencies] faiss = "0.8.0" json_logger = "0.1" log = "0.4" rand = "0.7" rand_xorshift = "0.2" rustc-serialize = "0.3"main.rsuse faiss::{Index, index_factory, MetricType}; use log::{info, LevelFilter}; use rand::{RngCore, SeedableRng}; use rand_xorshift::XorShiftRng; use rustc_serialize::json; use std::time::Instant; #[derive(RustcEncodable)] struct LogMessage<'a> { msg: &'a str, i: i32, nb: i32, elapsed_add: f32, elapsed_search: f32 } fn main() { // Prepare log. json_logger::init("faiss", LevelFilter::Info).unwrap(); // Define basic information. let d: i32 = 512; const N: i32 = 1_000_000; let nd: i32 = 10; let nbs: Vec<i32> = (N/nd..N+1).step_by((N/nd) as usize).collect(); let nq: i32 = 10; let k: usize = 5; let mut rng: XorShiftRng = SeedableRng::from_entropy(); // Start measuring performance. for i in 0..100 { for &nb in nbs.iter() { // Prepare data. let xb: Vec<f32> = (0..nb*d).map(|_| rng.next_u32() as f32 / u32::max_value() as f32).collect(); let xq: Vec<f32> = (0..nq*d).map(|_| rng.next_u32() as f32 / u32::max_value() as f32).collect(); // Construct index. let mut index = index_factory(d as u32, "Flat", MetricType::L2).unwrap(); // Evaluate performance. let start = Instant::now(); index.add(&xb).unwrap(); let elapsed_add = start.elapsed().as_micros() as f32 / 1e6; let start = Instant::now(); index.search(&xq, k).unwrap(); let elapsed_search = start.elapsed().as_micros() as f32 / 1e6; // Log performance. info!("{}", json::encode(&LogMessage { msg: "end one iteration.", i, nb, elapsed_add, elapsed_search }).unwrap()); } } }性能検証
まぁ python, GO, Rust のいずれを取っても faiss の C API を wrap しているだけなので,そこまで性能差は出ないだろうとは思いつつ,せっかく実装したのでパフォーマンス計測を実施することにしました.なお,行列演算ライブラリには OpenBLAS を用いて,環境は AWS EC2 の m5.large を用いて,AMI は
Canonical, Ubuntu, 18.04 LTS, amd64 bionic image build on 2020-01-12
で計測しました.
search と add について対象のデータ数を $10^5$ 〜 $10^6$ の間で動かす施行を100回ずつ行い,処理時間をデータ数ごとに平均したグラフが以下です.どの言語でもデータ数の増加に対して線形に処理時間が長くなっています.add では3言語間でほぼ性能差はありませんでしたが,search では python だけ性能がよいという結果になりました.同じような wrapper なのだから性能差は出ないかなと思っていただけにちょっと意外でした.さらに,この性能差がデータ数に応じてどう変わるかを見るために
Go の処理時間 / python の処理時間
をプロットするとでデータ数によらず平均1.44倍程度,Go, Rust の方が python よりも遅いようです.
まとめ
Facebook Research の近傍探索ライブラリである faiss を python, Go, Rust で使ってみて性能計測を行いました.同じライブラリを異なった言語で使ってみると,各言語のクセみたいなものが見えて面白かったです.特に Rust は C 領域で確保されたメモリでさえもちゃんと解放してくれるのは心強いなぁと感じました.C でゴリゴリ実装していた時代からはだいぶ言語も進化したんだなぁ.
また,性能に関しては,Go と Rust はほぼ同程度,python だけ 1.44 倍程度高速という結果を得ました.3言語とも C で書かれた faiss の wrapper であるという点で性能は同じだろうと想定していただけに驚きました.python だけ公式でサポートしていたり,python と Go/Rust ではコンパイル方法が違っていたりするので,そこら辺が関わってくるのかなぁと考えています.今度はそこを深堀したら面白そうですね!
- 投稿日:2020-04-07T00:25:44+09:00
Go-twitter で GET friendships/lookup
go-twitter で GET friendships/lookup.json を呼び出す際のサンプルです。
go-twitter は現在 GET friendships/show をサポートしていますが GET friendships/lookup はサポートされていないようです。show だと
Requests / 15-min window (user auth) 180
Requests / 15-min window (app auth) 15
つまり最大 180 ユーザlookup だと
Requests / 15-min window (user auth) 15
up to 100 are allowed in a single request.
つまり最大 15*100=1500 ユーザと一回の API コールで取得できるユーザ数が全然違うため、なるべくなら lookup を使いたいため頑張って実装してみました。
twitterut.gopackage twitterut import ( "bytes" "context" "fmt" "net/http" "strings" "github.com/dghubble/go-twitter/twitter" "github.com/dghubble/oauth1" "github.com/dghubble/sling" ) type Client struct { HTTPClient *http.Client *twitter.Client } func NewClient() *Client { config := oauth1.NewConfig("FIXME", "FIXME") token := oauth1.NewToken("FIXME", "FIXME") httpClient := config.Client(oauth1.NoContext, token) client := twitter.NewClient(httpClient) return &Client{ httpClient, client, } } type FriendshipLookupStatus struct { Name string `json:"name"` ScreenName string `json:"screen_name"` ID int64 `json:"id"` IDStr string `json:"id_str"` Connections []string `json:"connections"` } type FriendshipLookupParams struct { UserID string `url:"user_id,omitempty"` ScreenName string `url:"screen_name,omitempty"` } func relevantError(httpError error, apiError twitter.APIError) error { if httpError != nil { return httpError } if apiError.Empty() { return nil } return apiError } func Lookup(ctx context.Context, client *Client, params *FriendshipLookupParams) ([]FriendshipLookupStatus, *http.Response, error) { s := sling.New().Client(client.HTTPClient).Base("https://api.twitter.com/1.1/").Path("friendships/") friendships := new([]FriendshipLookupStatus) apiError := new(twitter.APIError) resp, err := s.New().Get("lookup.json").QueryStruct(params).Receive(friendships, apiError) return *friendships, resp, relevantError(err, *apiError) } func Friendships(ctx context.Context, client *Client, users []twitter.User) ([]FriendshipLookupStatus, error) { result := make([]FriendshipLookupStatus, 0, len(users)) for i := 0; i < len(users); i += 100 { // GET friendships/lookup は一度のリクエストで 100 ユーザまで var buf bytes.Buffer unit := users[i:mathut.MinInt(i+100, len(users))] for _, user := range unit { stringut.AppendSplit(&buf, user.IDStr, ",") } friendships, _, err := Lookup(ctx, client, &FriendshipLookupParams{ UserID: buf.String(), }) if err != nil { return nil, err } result = append(result, friendships...) } return result, nil }自分が試してたところ、このように twitter.NewClient する際の httpClient を取っておくことで、特にカスタマイズしなくとも lookup を呼び出せることを確認しました。
一回で 100 ユーザまで取れますが 15 分で 15 回までしか API を呼べないことに注意してください。