branchをmergeしてからテストしてリリースする、という流れで開発からリリースまでのサイクルを回している。Actionsで自動化できないかと思い、実際やってみたところ意外と簡単にできたので、そこで得られた知識をこの記事にまとめる実際のコードと説明それでは実際のactionsのYAMLファイルをもとに細かく説明する。今回使用したYAMLファイルはここにあがっている。このYAMLに定義するべきものがonである。これはワークフローを実行するためのトリガーの定義である。今回の例だと以下のように、releaseがpublish(公開)されたらワークフローを動かすようにしている。branchにpushされたら、pull-requestが作成されたらなどをトリガーすることができる。詳細は以下の公式ドキュメントで詳しく説明されている。Helpjobsで実行する処理を定義するjobsの下に行いたい処理の名前(job_id)を書いて、その下に行いたい処理を記述していく。コマンドをshellで実行する。actions/checkout@v2環境変数のセット何かしら計算した結果を保存して、次のstepで参照できるようにしたいことがある。いう場合は環境変数をセットする。$NEXT_VERSION)"例えば上記のコードは以下の処理を行っている。GITHUB_REFにあるタグの値(refs/tags/0.1.0)を取得そこからバージョン部分を抜き出してCURRENT_VERSIONにセットperlで次のバージョンにインクリメントしてNEXT_VERSIONにセット::set-envを使って環境変数NEXT_VERSIONをセット構文が気持ち悪いが、set-envを使うことで環境変数をセットすることができ、後続のstepで参照することができる。TBD"上記のコードはpull-requestを作る例だが、GitHub上のリポジトリに対して何か操作を行う場合はGitHubのTokenが必要になる。定義されているGITHUB_TOKENを使用する。secretsはリポジトリの設定画面から自分で値をセットすることもできるので、秘匿したい文字列などはsecretsを通してstep内で使用するのが良い。Actionsの良いところは、デフォルトのsecretsとしてGITHUB_TOKENが定義されていて、GitHubのリポジトリに対して操作を行う場合はTokenのことを気にする必要がないことだと思う。ActionsのYAMLでは式を書くことができる。}}の中には式を書くことができる。ようなあらかじめ定義されているcontextsが使える。他にどのようなcontextsがあるかはドキュメントを読むと良い。定義されたfunctionsがあり、expressionの部分で呼び出すことが可能である。GitHubを見るとたくさんのActionがあることがわかると思う。他の人が作った汎用的なActionがたくさん転がっているので、これを見ているだけでも「ああこんなこともできるのか」と参考になるし、いろいろ組み合わせて面倒な作業を自動化することができる。Actionsはとてもオススメ。新年あけましておめでとうございます。年末年始はインフルエンザになって寝込んでいて、そういえば今年は厄年だったことを思い出しました。1/15になってだけど2020年の抱負をあらためて書いておこうと思います。1日6時間15分以上寝る昨年は1日6時間以上寝る、ということが目標だったので今年は15分長くしてみる。理想は1日7時間睡眠なので最終的にはこれを目指したい。アルゴリズムとデータ構造をもっと勉強する昨年途中で投げ出してしまったヤツ。解説をブログにアウトプットする。Graphオートマトンアウトプット1ヶ月に1つはちゃんとした記事を書く。昨年に引き続き継続は力なり、ということで。comment2019-12-232019年の振り返りReview2019年も早いものであっという間に終わってしまった。以下が2019年初頭に考えていた抱負だったので、これをベースに振り返りをしてみよう。journal.lampetty.netアウトプットちゃんとした記事を月に一つは書く!というの目標に対しては以下のように未達だったけど、合計25個の記事を書いたし、未達だったのは3月と10月だけだったのでほぼ達成と言って良いのではないかと。Calendarでも以下の記事を書いた。はてブやTwitterでもいろいろフィードバックされているのを見てとても勉強になったし、来年はもっとアウトプットしていこうという気持ちが強くなった。tech.mercari.com1日6時間以上寝るiPhoneのヘルスケアアプリによると各月の平均睡眠時間は以下のような結果だった。2,4,5,9月以外は達成できているし、実感として昨年より良く寝れていて毎日のパフォーマンスも上がっている気がする。6h13minアルゴリズムもっと勉強する以下のような結果だった。Graphは中途半端なところで終わっているので再開したい。暗号技術を勉強するこれはまったくやる暇がなかったのと、特に何かで必要なものではないので、目標設定をミスったかなという気がしている。☓これはそれぞれの項目でどこまでやるというゴールをちゃんと決めたほうが良かった。英語を再開するいつかは海外で働きたいと思っていて、自分の英語力をどう伸ばすかはずっと課題だったのでまずはIELTSを受けてみた。あり「6.0ぐらいはあるかなー」という予想を大きく下回っていた。自分の実力がわかったし、これまでやってきたDMM英会話ベースでデイリーニュースを読むみたいな学習法だと英語力は伸びないということがわかったので、来年からは違う方法(カランメソッド)でやっていこうと思う。5.0あと、2年前から伸び悩んでいたTOEICも受けてみたのだけど、2年前より30点だけスコアが上がっていて自己ベストを更新したのが嬉しかった。DMM英会話をやめて単語ぐらいしか真面目に勉強していなかったけど、それでもまだスコアが伸びる余地があるということが実感できた。何よりも40歳を過ぎても何かの能力・スコアが上がるという実感が得られたのが嬉しい。今年はほとんど本を読まなかった。真面目に読んだのは以下のみ。Googleを支える技術Googleの初期の検索システムの内部構造などについて詳しく書かれている本。わかりやすく説明してあって楽しく読めた。単行本(ソフトカバー)脳を鍛えるには運動しかない!運動後に何かを勉強すると学習効率が上がるなど、実験結果の事例から運動と脳の関係性について説明する本。運動することはメンタルヘルスにも良い影響があるということで、これを読んだあとから必ず週に2回はジムで有酸素運動をするようにしている。単行本(ソフトカバー)Go言語による並行処理Goの並行処理についてとにかく丁寧にわかりやすく解説している良い本。Goは一通り書けるけど、channelやgoroutineを使いこなせていないと感じている人にはぜひオススメしたい。IDEAハンズオンIntelliJについて詳しく解説してある本。独学で使っているIntelliJについて、体系的に学び直せたのは良かった。大型本エンジニアの知的生産術これが2019年の中でベストな本だった。読み終わっていないけど、どうすれば効率的に本を読めるかなどが体系的に書かれているし、すぐに実践できる内容でもある。息子も5歳になって、0歳〜2歳の時に比べると本当に手がかからなくなってきたように思う。元気に育っていてそれが一番ありがたいし(元気すぎて困る)、今年だけで以下のアビリティを習得している(すごい!)。自転車に乗れるようになった!ひらがなを全部読めるようになった自分の名前をひらがなで書けるようになった(体操の)前転と後転がすごく上手になったレゴをほぼ自分だけで組み立てられるようになった英単語を少しだけ覚え始めた箸を持てるようになった(練習中)また、奥さんの海外出張が今年も2回あったけど、去年よりはうまく乗り切れた気がする。去年は出張中は寂しくて泣いてしまう時が多かったけど、今年は1,2回しか泣かなかったし、なるべく休みの日は鉄道博物館とか、今までに行ったことがないところに連れて行って楽しくやれたんじゃないかと思う。まとめ2019年は2018年に比べると仕事も忙しかったけど、学びやアウトプットは昨年よりこなせたかなと思う。2020年も引き続き目標を明確にして頑張っていきたいなと思う。comment2019-12-19OpenCensusとhttptrace.ClientTraceを使ってHTTPリクエストのlatencyを可視化するGoはじめにみなさんこんにちは。2019の19日目の記事です。この記事はOpenCensusとhttptrace.ClientTraceを使ってHTTPリクエストの内部的なlatencyを可視化する話です。「内部的なlatency」というのは、HTTPリクエストの中で名前解決にどのぐらいかかったとか、コネクションを張るのにどのぐらいかかったなどです。この記事に記載しているコードは全てGitHubに上げてあります。Clientを使ってHTTPリクエストを大量に送る処理がありました。Regionで動いていて、そこからHTTPリクエストを日本にあるサーバーに送るというもので、この処理のlatencyが非常に気になっていました。そのため、HTTPリクエストのどの部分が遅いのかを可視化したいと思って調べたところ、OpenCensusとhttptrace.ClientTraceに行き着いたのでその紹介をしたいと思います。OpenCensusと分散トレーシング今回使うのはOpenCensusのTracingという機能です。いわゆる分散トレーシングと呼ばれるものですが、詳しく説明していると長くなるので、詳細は以下の記事を読んでみて下さい。OpenCensusや分散トレーシングについてとてもよくまとまっています。future-architect.github.ioSpan分散トレーシングではSpanというものを一つの処理の単位として登録します。func2を呼び出して、それぞれの関数でも新しくSpanを作っています。これをJaegerという分散トレーシングを可視化するソフトウェアで表示したものが以下になります。func2というようにSpanがツリー構造になっていて、それぞれのSpanでどのぐらい時間がかかっているかがわかると思います。この論理的にまとまったSpanたちがTraceと呼ばれています。httptrace.ClientTracehttprace.ClientTraceはHTTPリクエストの中で行われる以下の処理について、処理が開始したタイミングと終了したタイミングでコールバックを設定してイベントを受け取ることができるライブラリで、以下のようなコールバックが定義されています。詳しくはClientTraceのgodocを読むと良いでしょう。参考までに、以下に定義されているコールバックのコメントとその日本語訳を記載しておきます。failure.TLSHandshakeDoneは、TLSハンドシェイクの接続に成功している場合か、ハンドシェイクがerrorで失敗している場合のどちらでも、TLSハンドシェイクが完了した後に呼ばれる。headerそれぞれのリクエストヘッダーのが書き込まれた後に呼ばれる。ヘッダーが複数ある場合は何回も呼ばれることになる。headers.全てのリクエストヘッダーが書き込まれた後に呼ばれる。body.リクエストのBodyも含めてリクエストが書き込まれた後に呼ばれる。available.レスポンスヘッダーの最初の1バイトが読み込める状態になった時に呼ばれる試しにそれぞれのコールバック関数でfmt.Printするだけの簡単な実装を書いて実行してみると、以下のように出力されました。この順番でコールバックが呼ばれていることがわかります。Accept-EncodingWroteHeadersWroteRequestGotFirstResponseByteということで、httptrace.ClientTraceを使うとHTTPのコネクションの接続のタイミングやリクエストを送信したタイミングのイベントが受け取れるということがわかりました。httptrace.ClientTraceそれではOpenCensusの分散トレーシングとhttptrace.ClientTraceの2つを組み合わせてみましょう。以下のようにochttp.NewSpanAnnotatingClientTraceを使うことで、簡単にhttptrace.ClientTraceの情報をTraceのSpanに入れることができます。上記のプログラムを実行して、Jaegerに送られたSpanを可視化したものが以下のスクリーンショットになります。先ほど紹介したGetConnやDNSStartなどがどのぐらい時間がかかったかが相対的にわかるようになっています。かかっていることになります。これは以下の手順で見ることができます。ブラウザでjaegerを開くNewSpanAnnotatingClientTraceとspanAnnotator先ほどのNewSpanAnnotatingClientTraceでは、内部的にコールバックを定義したspanAnnotatorを用意して、これをhttptrace.ClientTraceのそれぞれのコールバックとして登録しています。spanAnnotatorはSpanを持っていて、それぞれのコールバック関数の中でSpanに対してAnnotationを登録しています。Annotationを登録する時にはtimestampも記録されているため、上のJaegerのスクリーンショットのように各コールバック関数のタイミングで相対的にどのぐらい時間がかかったのかがわかるようになっています。参考までに、以下はspanAnnotatorのDNSStartとDNSDoneのコードです。"DNSDone")}まとめOpenCensusとhttptrace.ClientTraceを組み合わせることで、HTTPリクエストの詳細なlatencyを可視化する方法を紹介しました。私の場合は、この情報を元にして「コネクションの確立に時間がかかっているから、KeepAliveを長い時間有効にしてなるべくコネクションを使いまわそう」という感じでパフォーマンスチューニングの役に立てています。この記事が何かしらのパフォーマンスチューニングの役に立てば嬉しいです。