20200407のGoに関する記事は9件です。

Go-twitter で相互フォローを実装する

Go-twitter で GET friendships/lookup で作成した lookup API を利用して、go-twitter で相互フォローを実装してみます。

twitterut.go
package 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 という名前にしてあります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

使い方は次回紹介します

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語でWebAssemblyを使う際の型変換

ちょっとつまづいたので、忘れないようにメモ代わりに書いておきます。
実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0

index.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型に変更後、型変換をする必要があります。
要注意ですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go言語】【短期】Qiitaの今読んでおくべき記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/25
1091
133
2 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22
969
64
3 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/13
3006
0
4 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05
640
51
5 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06
786
72
6 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29
656
27
7 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28
609
40
8 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15
863
23
9 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/03
1186
22
10 ゴリラ言語の読み方 mattn 20/03/26
20/03/26
356
356
11 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10
229
40
12 Go Modules propella 18/12/05
19/07/17
284
31
13 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05
240
33
14 GoのGCを10分で学ぼう  gold-kou 19/12/07
19/12/16
253
14
15 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19
145
73
16 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20
330
47
17 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24
359
14
18 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02
407
6
19 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25
675
4
20 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06
315
36
21 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09
821
24
22 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27
192
18
23 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18
154
30
24 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17
185
26
25 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05
219
17
26 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13
706
7
27 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10
177
24
28 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19
351
20
29 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04
184
19
30 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03
746
0
31 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17
106
34
32 【Go】print系関数の違い taji-taji 15/09/14
20/02/27
263
20
33 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30
279
18
34 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23
277
18
35 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20
209
21
36 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20
367
10
37 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01
285
5
38 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23
211
16
39 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29
188
29
40 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11
215
22
41 プログラムの複雑さを下げるため、条件分岐を減らす方法を考える developer-kikikaikai 20/02/28
20/03/01
144
144
42 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10
385
9
43 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07
194
10
44 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18
277
12
45 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30
212
12
46 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22
144
14
47 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16
244
15
48 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23
145
8
49 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11
211
13
50 Go 1.13時代のエラー実装者のお作法 shibukawa 19/12/02
19/12/02
193
15
51 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19
879
5
52 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31
203
22
53 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11
981
0
54 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/04
86
19
55 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29
322
11
56 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08
137
16
57 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20
103
12
58 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24
107
15
59 2019年末版:Chromebookを開発に使う shibukawa 19/12/13
20/03/13
137
19
60 goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド ramenjuniti 19/11/15
19/11/18
241
1
61 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22
633
1
62 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25
568
9
63 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/09
93
21
64 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05
159
13
65 GOのORMを分かりやすくまとめてみた【GORM公式ドキュメントの焼き回し】 gold-kou 19/05/06
20/03/17
69
28
66 なぜGoを研究で使うのか tetsuzawa 19/12/19
20/02/28
145
2
67 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07
127
12
68 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13
202
10
69 Goで書くClean Architecture API muroon 18/12/09
19/03/17
243
7
70 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04
222
8
71 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03
189
15
72 Goで超簡易版Twitterを作ってみました(初心者向け) kohama66 20/01/16
20/01/17
122
122
73 Goのinterfaceがわからない人へ rtok 19/05/21
19/07/13
52
28
74 Go 言語 testing チートシート nirasan 18/03/22
18/03/22
116
9
75 アプリ開発にgomobileを利用する(Android/iOS/Flutter) kabochapo 19/07/15
20/01/10
201
10
76 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27
286
2
77 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13
162
9
78 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/09
89
9
79 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11
311
5
80 Goでプロセス監視のTUIツールを作ったら便利だった件 gorilla0513 19/10/21
19/10/21
172
5
81 Golangのエラーハンドリングの基本 shoichiimamura 19/01/27
19/01/27
66
15
82 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/28
2216
4
83 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27
141
9
84 Golang フレームワーク比較 yumin 19/01/30
19/10/24
71
13
85 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19
193
8
86 Go言語でClean Architectureを実現して、gomockでテストしてみた ogady 19/06/27
20/01/25
47
28
87 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02
317
6
88 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21
118
8
89 CIで使えるコンテナの脆弱性スキャナ knqyf263 19/05/16
19/05/29
204
3
90 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03
229
6
91 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/18
93
9
92 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25
295
8
93 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13
241
0
94 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29
142
15
95 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21
102
7
96 はじめてのgo test marnie_ms4 17/03/28
18/12/25
92
6
97 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20
105
7
98 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/02
71
10
99 Go 2のgenerics/contract簡易まとめ lufia 18/09/18
19/09/19
162
8
100 io.Readerをすこれ ktnyt 19/11/24
19/11/30
75
6

  1. 1行目が総数。2行目が直近3ヵ月。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go言語】【短期】Qiitaの今読んでおくべき記事100選【毎週自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/25
1091
133
2 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22
969
64
3 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/13
3006
0
4 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05
640
51
5 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06
786
72
6 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29
656
27
7 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28
609
40
8 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15
863
23
9 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/03
1186
22
10 ゴリラ言語の読み方 mattn 20/03/26
20/03/26
356
356
11 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10
229
40
12 Go Modules propella 18/12/05
19/07/17
284
31
13 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05
240
33
14 GoのGCを10分で学ぼう  gold-kou 19/12/07
19/12/16
253
14
15 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19
145
73
16 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20
330
47
17 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24
359
14
18 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02
407
6
19 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25
675
4
20 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06
315
36
21 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09
821
24
22 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27
192
18
23 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18
154
30
24 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17
185
26
25 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05
219
17
26 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13
706
7
27 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10
177
24
28 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19
351
20
29 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04
184
19
30 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03
746
0
31 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17
106
34
32 【Go】print系関数の違い taji-taji 15/09/14
20/02/27
263
20
33 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30
279
18
34 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23
277
18
35 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20
209
21
36 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20
367
10
37 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01
285
5
38 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23
211
16
39 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29
188
29
40 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11
215
22
41 プログラムの複雑さを下げるため、条件分岐を減らす方法を考える developer-kikikaikai 20/02/28
20/03/01
144
144
42 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10
385
9
43 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07
194
10
44 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18
277
12
45 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30
212
12
46 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22
144
14
47 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16
244
15
48 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23
145
8
49 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11
211
13
50 Go 1.13時代のエラー実装者のお作法 shibukawa 19/12/02
19/12/02
193
15
51 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19
879
5
52 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31
203
22
53 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11
981
0
54 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/04
86
19
55 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29
322
11
56 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08
137
16
57 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20
103
12
58 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24
107
15
59 2019年末版:Chromebookを開発に使う shibukawa 19/12/13
20/03/13
137
19
60 goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド ramenjuniti 19/11/15
19/11/18
241
1
61 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22
633
1
62 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25
568
9
63 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/09
93
21
64 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05
159
13
65 GOのORMを分かりやすくまとめてみた【GORM公式ドキュメントの焼き回し】 gold-kou 19/05/06
20/03/17
69
28
66 なぜGoを研究で使うのか tetsuzawa 19/12/19
20/02/28
145
2
67 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07
127
12
68 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13
202
10
69 Goで書くClean Architecture API muroon 18/12/09
19/03/17
243
7
70 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04
222
8
71 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03
189
15
72 Goで超簡易版Twitterを作ってみました(初心者向け) kohama66 20/01/16
20/01/17
122
122
73 Goのinterfaceがわからない人へ rtok 19/05/21
19/07/13
52
28
74 Go 言語 testing チートシート nirasan 18/03/22
18/03/22
116
9
75 アプリ開発にgomobileを利用する(Android/iOS/Flutter) kabochapo 19/07/15
20/01/10
201
10
76 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27
286
2
77 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13
162
9
78 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/09
89
9
79 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11
311
5
80 Goでプロセス監視のTUIツールを作ったら便利だった件 gorilla0513 19/10/21
19/10/21
172
5
81 Golangのエラーハンドリングの基本 shoichiimamura 19/01/27
19/01/27
66
15
82 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/28
2216
4
83 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27
141
9
84 Golang フレームワーク比較 yumin 19/01/30
19/10/24
71
13
85 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19
193
8
86 Go言語でClean Architectureを実現して、gomockでテストしてみた ogady 19/06/27
20/01/25
47
28
87 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02
317
6
88 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21
118
8
89 CIで使えるコンテナの脆弱性スキャナ knqyf263 19/05/16
19/05/29
204
3
90 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03
229
6
91 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/18
93
9
92 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25
295
8
93 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13
241
0
94 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29
142
15
95 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21
102
7
96 はじめてのgo test marnie_ms4 17/03/28
18/12/25
92
6
97 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20
105
7
98 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/02
71
10
99 Go 2のgenerics/contract簡易まとめ lufia 18/09/18
19/09/19
162
8
100 io.Readerをすこれ ktnyt 19/11/24
19/11/30
75
6

  1. 1行目が総数。2行目が直近3ヵ月。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go言語】【長期】Qiitaの今読んでおくべき記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/13
3006
324
2 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/25
1091
506
3 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22
969
340
4 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05
640
254
5 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28
609
214
6 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/03
1186
178
7 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06
786
786
8 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03
746
79
9 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15
863
863
10 Go Modules propella 18/12/05
19/07/17
284
241
11 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06
315
114
12 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10
229
176
13 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29
656
656
14 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05
240
184
15 【Go】print系関数の違い taji-taji 15/09/14
20/02/27
263
85
16 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05
219
106
17 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11
981
59
18 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09
821
59
19 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20
330
169
20 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25
675
675
21 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04
184
103
22 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30
279
84
23 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01
285
70
24 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20
209
89
25 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23
277
83
26 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23
211
78
27 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27
192
125
28 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13
706
706
29 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11
215
65
30 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17
185
110
31 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19
351
94
32 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19
145
145
33 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20
367
71
34 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10
177
106
35 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18
154
109
36 ゴリラ言語の読み方 mattn 20/03/26
20/03/26
356
356
37 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30
212
63
38 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29
322
60
39 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25
568
50
40 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07
194
61
41 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13
241
53
42 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02
407
407
43 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19
879
15
44 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/28
2216
40
45 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10
385
83
46 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24
359
359
47 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11
211
56
48 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13
202
52
49 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05
159
63
50 GoのGCを10分で学ぼう  gold-kou 19/12/07
19/12/16
253
253
51 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22
633
12
52 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02
317
42
53 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11
311
37
54 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08
137
57
55 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16
244
63
56 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23
145
82
57 Go言語における埋め込みによるインタフェースの部分実装パターン tenntenn 13/09/18
18/01/16
312
30
58 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17
106
106
59 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13
162
46
60 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22
144
94
61 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24
107
65
62 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07
127
66
63 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29
188
188
64 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03
229
43
65 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19
193
45
66 Go net/httpパッケージの概要とHTTPクライアント実装例 jpshadowapps 14/07/11
14/11/11
306
37
67 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27
141
52
68 golang チートシート jca02266 15/01/15
15/01/19
305
24
69 Go Mockでインタフェースのモックを作ってテストする #golang tenntenn 15/08/23
15/08/24
179
34
70 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20
103
81
71 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31
203
57
72 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03
189
39
73 Goで書くClean Architecture API muroon 18/12/09
19/03/17
243
65
74 Go 言語 testing チートシート nirasan 18/03/22
18/03/22
116
59
75 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04
222
78
76 Go言語 スライスの確認 mizukmb 15/02/22
18/10/02
137
37
77 Golangで自分自身で定義したパッケージをインポートする方法あれこれ shopetan 15/10/18
15/10/19
119
40
78 ターミナル画面を勝手に共有して他人の作業を覗いてみる nashiox 15/12/23
16/01/01
264
4
79 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/04
86
77
80 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29
142
39
81 はじめてのgo test marnie_ms4 17/03/28
18/12/25
92
46
82 GOPATH は適当に決めて問題ない yuku_t 13/10/19
19/02/06
284
31
83 Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? ruiu 14/08/31
14/09/02
209
25
84 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18
277
277
85 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/18
93
45
86 goでスクレイピングするのにgoquery + bluemonday が最強な件 ryurock 16/02/22
16/02/22
243
17
87 Go言語の型とreflect atsaki 14/10/12
17/04/28
317
22
88 loggingについて話そう methane 15/11/09
15/11/09
195
33
89 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/09
93
66
90 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25
295
34
91 Go の Test に対する考え方 Jxck_ 13/12/09
13/12/10
571
14
92 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20
105
48
93 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27
286
286
94 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21
118
58
95 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/09
89
72
96 Gin(Golang)におけるHTMLテンプレート記述方法 lanevok 16/05/29
18/04/26
118
32
97 Go のクロスコンパイル環境構築 Jxck_ 14/07/04
14/08/29
462
25
98 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/02
71
48
99 Golangをgoenvを使ってインストールしてみた walkers 17/04/15
17/04/15
110
28
100 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21
102
60

  1. 1行目が総数。2行目が直近1年。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go言語】【長期】Qiitaの今読んでおくべき記事100選【毎週自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Go言語の初心者が見ると幸せになれる場所 #golang tenntenn 13/05/11
19/03/13
3006
324
2 他言語プログラマがgolangの基本を押さえる為のまとめ tfrcm 18/01/01
20/01/25
1091
506
3 他言語から来た人がGoを使い始めてすぐハマったこととその答え mumoshu 16/05/03
19/12/22
969
340
4 Awesome Go : 素晴らしい Go のフレームワーク・ライブラリ・ソフトウェアの数々 hatai 17/12/18
19/11/05
640
254
5 Go CodeReviewComments 日本語翻訳 #golang knsh14 16/08/18
19/11/28
609
214
6 本物の golang を... 本物の Gopher を、お見せしますよ。 mattn 15/12/16
17/02/03
1186
178
7 Dockerで立ち上げた開発環境をVS Codeで開く! yoskeoka 19/05/03
19/06/06
786
786
8 インタフェースの実装パターン #golang tenntenn 14/08/04
17/12/03
746
79
9 Goを始めて1年間で最高にお世話になったGo関連ブックマークを晒します。 po3rin 19/10/09
20/03/15
863
863
10 Go Modules propella 18/12/05
19/07/17
284
241
11 Go言語のエラーハンドリングについて nayuneko 16/05/06
19/12/06
315
114
12 Goにはディレクトリ構成のスタンダードがあるらしい。 sueken 18/06/10
18/06/10
229
176
13 [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選 gorilla0513 19/11/26
19/11/29
656
656
14 Webアプリ初心者がGo言語でサーバサイド(1. 簡単なHTTPサーバの実装) wsuzume 18/11/05
18/11/05
240
184
15 【Go】print系関数の違い taji-taji 15/09/14
20/02/27
263
85
16 【GORM】Go言語でORM触ってみた chan-p 16/12/29
19/09/05
219
106
17 Go言語で幸せになれる10のテクニック ksato9700 14/07/20
18/10/11
981
59
18 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 Maki-Daisuke 18/12/07
18/12/09
821
59
19 Go / Gin で超簡単なWebアプリを作る hyo_07 19/03/17
20/01/20
330
169
20 3分でできる!最高のDockerfileを書いたあとにやるべき1つのこと tomoyamachi 19/06/13
19/12/25
675
675
21 golang メソッドについてまとめてみた。 pei0804 16/08/17
17/08/04
184
103
22 Go言語でJSONに泣かないためのコーディングパターン msh5 16/11/13
16/12/30
279
84
23 依存関係管理ツールdep(golang) Azizim_A 17/09/13
18/03/01
285
70
24 Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ nirasan 16/09/05
18/02/20
209
89
25 Goを学びたての人が誤解しがちなtypeと構造体について #golang tenntenn 16/12/06
19/11/23
277
83
26 Go言語でJSONを扱う nayuneko 16/12/22
16/12/23
211
78
27 Go言語:文法基礎まとめ HiromuMasuda0228 18/06/17
18/06/27
192
125
28 Goコンパイラをゼロから作って147日でセルフホストを達成した DQNEO 19/05/20
20/03/13
706
706
29 Go 言語 reflect チートシート nirasan 16/09/27
19/07/11
215
65
30 golang contextの使い方とか概念(contextとは)的な話 marnie_ms4 18/07/23
19/07/17
185
110
31 Go言語開発を便利にするMakefileの書き方 yoskeoka 18/10/17
18/10/19
351
94
32 いまさらだけどgRPCに入門したので分かりやすくまとめてみた gold-kou 19/06/06
20/03/19
145
145
33 クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた yoshinori_hisakawa 18/08/19
18/08/20
367
71
34 Go言語で理解するJWT認証 実装ハンズオン po3rin 18/06/05
19/08/10
177
106
35 Goで始めるgRPC入門 marnie_ms4 18/06/05
19/09/18
154
109
36 ゴリラ言語の読み方 mattn 20/03/26
20/03/26
356
356
37 Goのarrayとsliceを理解するときがきた seihmd 17/03/14
17/11/30
212
63
38 オブジェクト指向言語としてGolangをやろうとするとハマること shibukawa 15/11/27
18/10/29
322
60
39 おい、peco もいいけど fzf 使えよ b4b4r07 15/10/29
16/10/25
568
50
40 【毎秒1万リクエスト!?】Go言語で始める爆速Webスクレイピング【Golang】 Azunyan1111 17/11/06
18/09/07
194
61
41 Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 tnoda_ 14/06/16
15/01/13
241
53
42 Goでヘキサゴナルアーキテクチャ rema424 19/11/17
20/03/02
407
407
43 Google Homeを使って4歳児とSlackで会話する方法 ikasamah 18/02/11
18/02/19
879
15
44 あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた sadayuki-matsuno 16/04/29
19/11/28
2216
40
45 チョットできるGoプログラマーになるための詳解GoDoc shibukawa 18/08/28
19/10/10
385
83
46 ゲームボーイのエミュレータをGoで作った話 Akatsuki_py 19/11/11
20/01/24
359
359
47 Golangのデバッガdelveの使い方 minamijoyo 17/05/11
18/01/11
211
56
48 Golangで外部コマンドを実行する方法まとめ tanksuzuki 16/03/08
16/09/13
202
52
49 init関数のふしぎ #golang tenntenn 16/12/05
18/11/05
159
63
50 GoのGCを10分で学ぼう  gold-kou 19/12/07
19/12/16
253
253
51 削除済(ID:c2908b672ea7bcaf0d73) trrrrrys 18/11/18
18/11/22
633
12
52 GoのChannelを使いこなせるようになるための手引 awakia 15/12/01
15/12/02
317
42
53 Go でツール書くときの Makefile 晒す dtan4 16/12/08
18/01/11
311
37
54 削除済(ID:50df1706db53cc07f105) moutend 17/04/21
20/02/08
137
57
55 Go言語関連書籍のまとめ yoskeoka 18/08/24
18/09/16
244
63
56 Go言語のInterfaceの考え方、Accept interfaces,return structs weloan 18/07/20
19/04/23
145
82
57 Go言語における埋め込みによるインタフェースの部分実装パターン tenntenn 13/09/18
18/01/16
312
30
58 VSCodeでGo言語の開発環境を構築する melty_go 19/06/05
19/06/17
106
106
59 Cognito UserPoolsのFederationの使い方と、そのJWTを独自APIサーバーで検証する方法 yoskeoka 18/01/07
19/02/13
162
46
60 fmt.Printfなんかこわくない rock619 18/12/06
19/05/22
144
94
61 Goのruneを理解するためのUnicode知識 seihmd 17/11/24
17/11/24
107
65
62 Goのpanicと向き合う。 nnao45 17/12/08
18/03/07
127
66
63 内部実装から理解するgRPC shoichiimamura 19/05/26
19/05/29
188
188
64 Go言語のFunctional Option Pattern weloan 17/03/15
17/04/03
229
43
65 Goでテストを書く(テストの実装パターン集) atotto 17/12/18
17/12/19
193
45
66 Go net/httpパッケージの概要とHTTPクライアント実装例 jpshadowapps 14/07/11
14/11/11
306
37
67 golangの高速な構造化ログライブラリ「zap」の使い方 emonuh 17/03/27
17/03/27
141
52
68 golang チートシート jca02266 15/01/15
15/01/19
305
24
69 Go Mockでインタフェースのモックを作ってテストする #golang tenntenn 15/08/23
15/08/24
179
34
70 【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み shoichiimamura 18/09/14
19/02/20
103
81
71 ちょっと良さげな負荷ツール vegeta をつかって分散負荷試験を実現してみる chidakiyo 18/08/31
18/08/31
203
57
72 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る yama-t 18/04/13
19/12/03
189
39
73 Goで書くClean Architecture API muroon 18/12/09
19/03/17
243
65
74 Go 言語 testing チートシート nirasan 18/03/22
18/03/22
116
59
75 Goの新しいerrors パッケージ xerrors sonatard 19/02/15
19/09/04
222
78
76 Go言語 スライスの確認 mizukmb 15/02/22
18/10/02
137
37
77 Golangで自分自身で定義したパッケージをインポートする方法あれこれ shopetan 15/10/18
15/10/19
119
40
78 ターミナル画面を勝手に共有して他人の作業を覗いてみる nashiox 15/12/23
16/01/01
264
4
79 [Golang] 文字列操作サンプル tchnkmr 18/11/18
19/03/04
86
77
80 GoでAPIサーバーの開発からデプロイまで oshiro 16/12/14
19/07/29
142
39
81 はじめてのgo test marnie_ms4 17/03/28
18/12/25
92
46
82 GOPATH は適当に決めて問題ない yuku_t 13/10/19
19/02/06
284
31
83 Goのtimeパッケージのリファレンスタイム(2006年1月2日)は何の日? ruiu 14/08/31
14/09/02
209
25
84 Go言語で扱えるデータフレーム厳選4つ mattn 19/12/17
19/12/18
277
277
85 Go初心者がさっくりAPIサーバを立てる teradonburi 17/07/22
19/11/18
93
45
86 goでスクレイピングするのにgoquery + bluemonday が最強な件 ryurock 16/02/22
16/02/22
243
17
87 Go言語の型とreflect atsaki 14/10/12
17/04/28
317
22
88 loggingについて話そう methane 15/11/09
15/11/09
195
33
89 ネットワークやTCP/IPやHTTPの基本(初学者向け) ryosuketter 18/12/08
18/12/09
93
66
90 trdsqlというコマンドラインツールを作った noborus 17/08/15
19/12/25
295
34
91 Go の Test に対する考え方 Jxck_ 13/12/09
13/12/10
571
14
92 GolangのWebフレームワークginのmiddlewareについての覚書 tobita0000 18/05/20
18/05/20
105
48
93 人を震えさせるツール「Dockle」の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に tomoyamachi 19/06/18
19/10/27
286
286
94 Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活 po3rin 18/10/20
18/10/21
118
58
95 Gin と GORM で作るオレオレ構成 API Asuforce 18/12/22
19/09/09
89
72
96 Gin(Golang)におけるHTMLテンプレート記述方法 lanevok 16/05/29
18/04/26
118
32
97 Go のクロスコンパイル環境構築 Jxck_ 14/07/04
14/08/29
462
25
98 goenvでgoをインストール 〜初心者向け〜 yut-kt 17/07/29
19/05/02
71
48
99 Golangをgoenvを使ってインストールしてみた walkers 17/04/15
17/04/15
110
28
100 GOPATH モードからモジュール対応モードへ移行せよ spiegel-im-spiegel 18/10/06
18/10/21
102
60

  1. 1行目が総数。2行目が直近1年。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python, Go, Rust で faiss を動かしてみた

はじめに

みなさん,コロナの渦中でいかがお過ごしでしょうか?不要不急の外出がなくなり持て余した時間を普段できない勉強や検証に当てようと,今回は最近勉強を始めた Go と Rust で faiss を使ってみることにしました.なお,faiss は faiss のちょっとニッチな機能紹介 でも紹介した Facebook Resarch が提供するお気に入りの近傍探索ライブラリです.

実装

それでは早速 python, Go, Rust の順で実装していきたいと思います.

python

まずは環境構築です.本家のインストールガイドに従えば基本的に問題なくモジュールがインストールされます.なお,conda でインストールする方法も書かれていますが,個人的に conda 環境には苦い思い出があるのでソースからビルドしました.
次にソースコードです.Go, Rust でも同様ですが,後からパフォーマンス計測をしたかったので,ログは json で出力するようにしています.また,各イテレーションでメモリを解放しないと,イテレーションごとにどんどんメモリが増え続けてしまったので,del 変数gc.collect() を最後に入れて強制的にメモリを解放するようにしています.

main.py
import 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.go
package 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.rs
use 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
add result

search
Screenshot_2020-04-07 Analyze Performance(2).png

どの言語でもデータ数の増加に対して線形に処理時間が長くなっています.add では3言語間でほぼ性能差はありませんでしたが,search では python だけ性能がよいという結果になりました.同じような wrapper なのだから性能差は出ないかなと思っていただけにちょっと意外でした.さらに,この性能差がデータ数に応じてどう変わるかを見るために Go の処理時間 / python の処理時間 をプロットすると

performance ratio

でデータ数によらず平均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 ではコンパイル方法が違っていたりするので,そこら辺が関わってくるのかなぁと考えています.今度はそこを深堀したら面白そうですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.go
package 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 を呼べないことに注意してください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む