寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

golang

Go で Spanner とよろしくやるためにガチャガチャやっている話

この記事は Go Advent Calendar 2020 14日目 の記事です。 みなさん Go してますか? Spanner も触ってますか? 最近やっと部分的に本番環境で Spanner を利用し始めました。 Spanner のスキーマなどを git で管理しつつ、チーム内でレビューなどをしつつ運…

たった 60 分で Go の静的解析が理解できる神コンテンツ

タイトルの通りで 60 分ほどで静的解析が理解できるコンテンツを見つけたので共有。 静的解析ってなんじゃ? ASTってなんじゃ? って状態から、「なんとなく静的解析やれそう」になれたのでぜひ試してみてほしい。 静的解析をはじめよう - Gopherをさがせ!

# Go のテスト並列化してテストが速くなることを改めて確認してみた

Go のテストに並列機能があるので、それで単純に速度アップができるのかという点と、 parallel オプションで並列数操作したらちゃんと反映されるよね。という点を確認した。 早速ソースコード slow_test.go func Test_slow1(t *testing.T) { time.Sleep(3 * …

Goの標準機能で過去のバージョンをインストールする

自分個人の環境はいつも最新のGoを利用しているので特にgoenvなどのようなバージョンを切り替えるツールを使っていないのですが、Goのバージョンを切り替えて使いたい人もいるみたい。 体感的にgoenvを利用している人が多そうではありますが、Go標準に複数の…

Goで特定の関数を持つか/実装されているかチェックする方法

いまさらながら、なるほどーと思ったのでメモ。 go1.13のerrorsのUnwrap関数が以下のように実装されている // Unwrap returns the result of calling the Unwrap method on err, if err's // type contains an Unwrap method returning error. // Otherwise,…

GoのGraphQLライブラリのgqlgenのGetting startedをやってみた

この記事は こちら をなぞってみた記事になります。 GraphQLをこれから始めたいという方におすすめ gqlgenを利用してGraphQLサーバを実装する方法です。 todoのリストを返却する 新しいtodoを作成する 完了したtodoをマークする ちなみにココからの手順はgo …

Goでmain関数経由でもベンチマークする

Goはテストの機能としてベンチマークを測定する機能が標準で提供されています。 ただ、そのままだとテストコードを実行できる環境でしか実行ができなかったりするため、 main関数から実行したい場合もあるかと思います。 今回はmainからベンチマークを実行で…

goのプロファイラpprofを利用してパフォーマンスを計測する (GAE + ginもあり)

pprof とは Go言語のプロファイリングツール。 Web UIでフレームグラフや、関数の実行時間のグラフを見ることができる 通常のpprof利用方法 pprofの使い方として2つのパターンがあります。 runtime/pprof : ファイルにプロファイル情報を出力する net/http/…

今日 (2019/09/10) 現在のGAE/goをUPDATEする際の注意点、俺まとめ

Appengine/goが過渡期とでもいいましょうか、 日々変化も目まぐるしく、いろいろ気をつけるべき点もありそうなので雑にまとめました。 ご参考まで。(2019/09/10現在) GAE/go 1.9 は終わり 画像のとおりです。 警告: Go 1.9 ランタイム バージョンは非推奨…

goのベンチマークメモ

goのベンチマーク周りのメモです 2つのベンチマークの比較 godoc.org pprof のツール github.com goのパフォーマンス周りの資料(observability) bit.ly GoのSSA最適化 qiita.com おまけ 厳密なgofmt github.com go!

GAE/go1.11 で Stackdriver Profiler を使ってみる

appengine go1.11以降でgoでもプロファイラが使えるようなので初期設定だけやってみます。 内容的にはほぼ こちら の内容です。 Stackdriver Profiler は何ができるの? Goの場合には、CPU、ヒープ、競合、スレッドに関するプロファイリングが可能です。 そ…

Go で StartsWith/EndWith、前方一致/後方一致はないの?

Javaで育った私としては、前方一致/後方一致は StartsWith/EndWith というイメージが勝手にありますが、 goを書いているとたまにど忘れするので備忘録。 go での前方一致/後方一致 goでももちろん前方一致/後方一致のための関数は用意されています。 strings…

ab(ApacheBench) 的な負荷ツール hey を試す

ちょっとした負荷試験をしたい場合に、abが入っていればいいのですが、そうも行かない場合も多いので、go製で簡単にインストールできる hey を試します。 負荷ツールのタイプは2種類ある HTTPの負荷ツールには2タイプあります。 レスポンスが返される限り全…

モノレポ(mono repository)内でmodで管理しているアプリケーションをGAEにデプロイするために必要な2つのポイント

前回は モノレポ(mono repository)内でgoのmoduleを相対パスで利用する方法 という記事を書きましたが、今回はさらにモノレポで管理しているAppengineの複数のサービスをデプロイする方法になります。 なぜGAEのデプロイの記事が必要? 前回の記事を試した…

モノレポ(mono repository)内でgoのmoduleを相対パスで利用する方法

goの依存管理ツールはいろいろありますが、最新はGo Modules(mod)を利用することが多くなってきたと思います。 dep(vendor)を利用した依存解決の場合にはgopath配下にあればある程度柔軟に相対的に依存を解決できましたが、 modは普通に利用するとリポジトリ…

Appengineで初回1回だけ実行したい(設定の初期化)ときはwarmupを利用する

Appengine (GAE) はリクエストのイベントでインスタンスが起動されるので、通常のアプリケーションを実装した際に初回1回だけ実行する処理というのが普通に実装するとなかなか難しい。 特にDB(Datastore)アクセスなどが必要な場合にはrequestが無いとappen…

Raspberry Pi : goのインストールと設定を行う

Motivation 基本的には自分はgolangでプログラムを書くことが多いので、go入れておきます。 goのバイナリのダウンロード ここ のページからアーキテクチャが ARM のものを選択しましょう。 ブラウザからリンクを右クリックしてURLをコピーします 一応ホーム…

goでsliceのdeepcopyをする

タイトルのとおりなんですが、 goでsliceのディープコピーを作りたかったので。 やり方は以下。 orig := []string{"a", "b", "c", "d", "e", "f"} // 元sliceデータ fmt.Printf("%p, %v\n", orig, orig) // 0x10438150, [a b c d e f] copy := append([]stri…

Goでsliceをを結合する方法

Goのスライス同士を結合しようとした場合、 泥臭くループを回してappendをしようとしたあなた。ちょっと待って。✋ append のシグニチャをみてみる builtin.go を読んでみましょう func append(slice []Type, elems ...Type) []Type ほほう。 二つ目の引数は…

goで再帰的にディレクトリを作成する

goでディレクトリを作成する場合、 os.Mkdir("./hello", os.ModePerm) のような感じで簡単にディレクトリを作れますが、 深い階層まで再帰的にディレクトリを作成したい場合には以下の方法を利用します。 再帰的にディレクトリを作成する os.Mkdir は単一の…

constで定義した値(string)をポインタとして扱おうと思ったら怒られた

タイトルの通りですが、 goでconstで定義したstringの値をポインタとして渡したい箇所があり、 constで定義した値をそのまま渡そうと思ったら cannot take the address~~ みたいな形で怒られたのでメモ ざっくりとしたコード 具体的にはgoでS3のsdkを使って…

Goのio.Copyってio.CopyBufferってメソッドもあるし、バッファされてるんだっけ?

結論からいうと yes. です。 io.goのファイル内の実装で func Copy(dst Writer, src Reader) (written int64, err error) { return copyBuffer(dst, src, nil) } func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { if buf …

Appengineで本番環境のDatastoreのデータをローカルへ持ってくる方法

GCPUGのSlack で知ったネタの備忘録 本番環境のDatastoreのデータは appcfg.py を利用して取得することができる。 参考記事 : GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016 - Qiita おまけ make でこんな感じに実行してもいいみたい replilocal:…

Goでio.Readerをbyteのスライスやstringに変換する方法

goでio.Readerからbyteのスライスやstringに変換する書き方をたまに忘れてしまうのでメモ。 コード // io.Readerをbyteのスライスに変換 func StreamToByte(stream io.Reader) []byte { buf := new(bytes.Buffer) buf.ReadFrom(stream) return buf.Bytes() }…

忘れがちなGoでbyteをstringに変換する方法をベンチマークしてみた。

golangでbyteをstringに変換する処理はたびたび発生するのですが、 手抜きで fmt.Sprintf("%s", byte) などとやっちゃうこともあるのでそれぞれの書き方でどれが速いのか確認してみた。 1) Sprintfを使うパターン fmt.Sprintf("%s", data) 2) string() を使…

Macのhomebrewでgoのupdateを行ったらエラーが発生する。

そろそろ新しいgoが入るかなと思い、 brew update;brew upgrade コマンドを実行したところ、go1.9がインストールされたので、既存のプロジェクトのテストを試しに実行してみたところ以下のようなエラーが発生した。 flag provided but not defined: -goversi…

direnvで言語に最適な環境をセットアップする

direnv使い始めようとしてましたが、言語に最適な環境をセットアップする機能なんてあったんですね。 layout program_name :その言語用の開発環境をセットアップ Go言語であれば layout go のように.envrcに書けば良いわけですね。ふむふむ。

Golangでは構造体にメソッドを生やせる。

Go言語のソースコードを読んでいた時に関数の定義がわかりづらいのがあった。 どうやら構造体にメソッドを実装することが出来るっぽい。 func (レシーバ名 レシーバの型) 関数名(引数) (戻り値) 定義はこんな感じ。 // 構造体宣言 type User struct { name s…

Golangのswitch文は暗黙でcaseの最後にbreakが入る

題名の通り、Go言語のswitch文は暗黙でcaseの最後にbreakが入ります。 なので i := 1 switch i { case 1: fmt.Println("1") case 2: fmt.Println("2") default: fmt.Println("other") } と書くとcase 1にマッチし、case 2には入りません。 fallthrough 逆にc…

IntelliJ IDEAにgolangのプラグインをインストールする方法

Go プラグインのインストール IntelliJを起動した際に Configure > Plugin を選択する Browse Repositoriesのボタンを押下し、検索窓に go と入力する。 Go と書かれているプラグインをインストールする。 Goプロジェクトの作成 IntelliJを起動し、Create Ne…