『改訂2版 みんなのGo言語』を読んだ

夏休みを利用して読みました。初版は [2016-09-25-1] でじっくり読んで手も動かしたので、本当にさらっとね。 最近は Go のコードをほとんど書いてなくて、Go Modules に追いついている程度でした。ただ、それほど分からない情報もなかったので、ある意味答え合わせにはなった気がします。 例えば拙作の github-nippou で go-bindata から statik に乗り換えた のは、誤りでなかったなとか(P41)。 ちょうど設定ファイルのフォーマットをどうしようとか、置き場所を XDG Base Directory Specification に合わせようとか考えていたので、「2.8 設定ファイルの取り扱い(P45)」もタイムリーでした。 読んでて Interface 使ってコードを Testable にするだとか、HTTP Mock とか、課題をいろいろ思い出しました…。 相変わらずサラッと知識をアップデート出来るので、Go に興味ある人にはオススメの一冊です。

2019-08-16 (Fri) · masutaka

『Goならわかるシステムプログラミング』を読んだ

11 月から『Real World HTTP』[2017-11-28-1] と同時に読んでいたのに、 読み終わったのが今日になってしまった。意外とボリュームあったのと、 あと少しで読み終えられたのに油断して読み進めなかったせい。 本書のもとになった ASCII.jp のウェブ連載では、この書籍(※)の内容 とかぶらないように、実用性よりも低レベルの説明にフォーカスしたとい うのが実態です。 ※『Real World HTTP』 P332 にこう書かれているように、『Real World HTTP』と一部内容が被る ものの、低レイヤの話が大部分を占める。 一応私は組み込みエンジニア時代に open(3), ioctl(3), close(3) 等を 使ったデバイスドライバを書いたことがあるので(VxWorks だけど)、 ある程度想像力を働かせて読むことが出来た。 先の引用に書かれているとおり実用性は考慮されていないので、それを期 待すると期待はずれに終わると思う。あくまでエンジニアとしての知識を 深めるための技術書かと。 「第17章 Go言語とコンテナ」は面白そうだったので、あとで写経するかも。 以下、個人的なメモ。 P98 最近では、RESTful の究極形態(第4形態)として位置づけられる HATEOAS という考え方も広まりつつあります。 (中略) HATEOAS の原則に従った API を採用しているウェブサービスとしては GitHub があります。 『Web API: The Good Parts』[2015-04-09-2] に書いてあったようだけ ど頭に入ってなかった。Go言語は関係ない。 P285 Go言語の場合、ヒープに置くかスタックに置くかは、コンパイラが自動的 に判断します。new で作っても、その関数内でしか利用されなければスタッ クに確保されます。ローカル変数として宣言しても、そのポインタを他の 関数に渡したり、関数の返り値として返すような場合にはヒープに置かれ ます。そのためGo言語では、「ローカル変数のポインタを関数の返り値と して返すと、呼んだ側からアクセスしに行ったときにはもうスタックのフ レームが巻き戻されて無効なメモリになっており、実行時エラーで落ちる」 (中略)という C/C++ で起きるような問題は置きません。...

2017-12-31 (Sun) · masutaka

golang.tokyo #10 x WomenWhoGoTokyo に行ってきた #golangtokyo

golang.tokyo #10 x WomenWhoGoTokyo golang.tokyo #2 以来、久々に参加してきました。運営の皆様、ありがと うございました。 MacBook Air を持っていくのが面倒になったので、リュウドの折りたたみ キーボード [2010-11-15-1] を引っ張り出して持っていたけど、机がなく 使うのは断念。でもその分、聞くことに集中できた気はする。 テキスト審査 in Pairs ※ TODO: 資料が公開されたらここに貼る 後藤勝哉さん/株式会社エウレカ 後藤さんが高熱のため、同じエウレカの森川さんが代わりに発表。 業者などの悪徳ユーザを、サインアップやマッチング成立後にどのように 除外しているかのお話。 kagome という形態素解析ライブラリを使った go-jp-text-ripper を使っ てワードフィルタリングしている。go-jp-text-ripper の作者は、今回代 理で発表している森川さん! Kuromoji も使っていたんだっけかな。忘れた。他に正規表現や機械学習 も使っていて、相当泥臭い。 3か月でフィルタリングルールは使えなくなる。イタチごっこ。 怪しいものは通さない。Slack で CS に通知して、最終的には人間が確認 する。 現在はエンジニアも運用に関わっているとのこと。気になったので質問し てみた。 inerfaceとの付き合い micchieさん/WomenWhoGoTokyo 私は inerface は理解したつもりではいますが、実践で使ってないので、 多分まだ理解できていないでしょう…。 こういう使い捨てスクリプトはつい慣れた言語を使ってしまう。micchie さんの場合、PHP じゃなくて golang を使ったのはどういう意識だったの かな。 メルカリ カウルのマスタデータの更新 tenntennさん/株式会社ソウゾウ GCS 上の 50MB の TSV ファイルを分割しながら(行単位ではない!)、 RDS に入れていくお話。 Transfer の実装は気が狂いそうになるらしい。バイト列の処理はそこそ...

2017-11-16 (Thu) · masutaka

『スターティングGo言語』を読んだ

大変良い本でした。Kindle 版を購入しました。 1 年前に買って積んでいたのは勿体なかったですが、最近ようやく golang と向き合うようになったので、致し方なしか。 対応バージョンは 1.6 で最新の 1.9 より古いですが、golang は後方互 換性は保たれているので、あまり問題ないかと。 型や構文、よく使われるパッケージの説明など、網羅的に書いてあります。 ネット上の情報をつまむくらいなら、この本で学んだほうが良いと思いま すよ…。> 過去の自分 一番良かったところ 私は元々組み込みエンジニアで、clang に馴染みがあります。そういう意 味では、golang は馴染みやすくはあるのですが、ポインタまわりがどう もしっくり来ませんでした。 この本を読んで、その辺りを理解できて大変良かったです。 ・(*p)[i] の省略が p[i] であるなど、ポインタ記法を省略できる ・参照型(スライス、マップ、チャネル)はポインタを取り扱う型である ・配列は値、スライスは参照型。性質は 180 度異なる ・配列は値であるため、代入ではすべての要素のコピー(clang だとポイ ンタの代入) ・同じ理由で、関数の引数に渡すとコピーが作られ渡される 中でも、見た目が似ている配列とスライスが裏では全く違うことを知り、 腑に落ちました。 loading... if (localStorage.getItem("pref-theme") === "light") { const elements = document.getElementsByClassName('twitter-tweet'); for (let i = 0; i string 型は参照型ではありませんが、Immutable なポインタのような不 思議な振る舞いをします(clang だとほぼポインタ)。 ・string 型は内部的に「文字列の実体へのポインタ」と「文字列のバイ ト長」によって構成 ・string 型の値を、変数への再代入や関数の引数として使った場合であっ ても、文字列の実体が別のメモリ領域にコピーされることはない...

2017-10-30 (Mon) · masutaka

github-nippou を golang で書き換えて v4.0.1 リリースしてました

こちらのブログではアナウンスしてなかったので。 v4.0.0 のリリースノートになります。 https://github.com/masutaka/github-nippou/releases/tag/v4.0.0 その後 v4.0.1 も出しました。 https://github.com/masutaka/github-nippou/releases/tag/v4.0.1 体感として速くなったことと、Homebrew のエコシステムに乗れたことが、 自分としてもメリットに感じています。 リファクタリングしないと…。

2017-10-22 (Sun) · masutaka

golang の並列処理を Ruby と比較しながら学ぶ

一ヶ月ほど前に社内のインフラ共有会でタイトルの話をしました。記録の ために記事を書いておきます。 Gist に置いてある ので、コードは git clone で取得可能です。 $ git clone https://gist.github.com/c0a4234a5264c89655c40adcf7c27cb2.git Ruby 例えば Ruby で 30 個の処理をするコードがあったとします。こんな素朴 なコードです。それぞれ 3 秒かかる処理が 30 あるので、とても遅いです。 Thread を使って 5 並列にしました。明らかに速くなりました。 ついでにそれぞれの結果(というほどのものではありませんが)を results に代入し、最後にまとめて表示しました。 results は共有リソースになるので、Thread::Mutex#synchronize でロッ クをかけて安全に書き込んでいます。ロックをかけないと results に同 時に書き込まれるケースを救うことが出来ません。 parallel gem を使うと、ずいぶんとすっきり書くことが出来ます。 golang 直列処理に関しては、Ruby と同様に素朴です。goroutineNum(あとで説 明します)は常に 1 です。 何も考えずに heavyProcess() を goroutine で動かします。19 行目に “go " を追加しただけです。驚いたことに何も表示されずに終了します。 実は何も表示されなかったのは、goroutine の終了を待たずに main() が 終了してしまったためです。シェルのバックグラウンド実行(&)とよく 似ていると思いました。 今度は sync パッケージを使って、goroutine の終了を待ちましたが、...

2017-10-15 (Sun) · masutaka

Go で Mackerel の Fastly billing plugin を作った

弊社の @tjinjin が作った mackerel-plugin-aws-billing は導入は簡単 だし、AWS 料金の推移が気軽に見られるので、Fastly 版を作ってみました。 Fastly は少し前から会社で使い始めています。なかなか便利で、CDN な のに一瞬でキャッシュを消せるのもさることながら、料金含めた全てのメ トリクスがリアルタイムで見られるのがすごいですね。今のところ、超安 定稼働しています。 さて、今回作った mackerel-plugin-fastly-billing は Fastly の Billing API を叩いて、その月の現在の料金を取ってくるシンプルな plugin です。curl 的には例えば以下になります。 $ curl -s -H "Fastly-Key: <Fastly API Key>" \ https://api.fastly.com/billing/year/2016/month/10 | jq .total.cost 先日、mackerel-plugin-delayed-job-count も作ったのですが、 Go で Mackerel の delayed_job plugin を作った|feedforce Engineers’ blog 今回は少しパワーアップしております。delayed_job も追随しよう…。 書き方を少し変えた main() を先頭に書きました。持論ですが、コードは上から下に流れるよ うに書くと読みやすいと思います。 最初の会社で C を書いていた頃は、特にそのようにしていましたが、LL だとそう書けないことがあるので、最近は自重していました。Go はコン パイル型言語で C にも似ているので、以前の書き方にしてみました。 外部変数を使うのも止めました。 PluginWithPrefix interface で実装した 以前の Plugin interface と違う点は MetricKeyPrefix() が増えた こと...

2016-10-16 (Sun) · masutaka

『みんなのGo言語』を読んだ

話題になっていたので、読んでみました。 [2015-02-11-1] で Go を学んだ私ですが、その後あまり使っていなかったので、情報をアップデートできて良かったです。 特に第1章の開発環境のあたり。goimports の import 自動挿入は良いですね。早速 go get して init.el に以下を設定しました(go-mode.el は導入済み)。 (setq gofmt-command "goimports") 第6章のテストも即戦力になりそうです。 以下は読んでメモった箇所を中心にしたまとめです。 全体を通して感じたこと Go の文法が多少分かる方向けの本だと思います。P.19 にも書いてある「A Tour of Go 」などをやった後に読むと効果的だと思います。 ただ、世間でオススメされている「A Tour of Go」ですが、私はチュートリアルとしては難しいと思います。半分くらいから Go よりアルゴリズムのチュートリアルっぽくなってくるので。 個人的には [2015-02-11-1] で紹介した『WEB+DB PRESS Vol.82 』の「はじめてのGO」がオススメです。 残念だったこと 動かないコードがあったのは残念でした。 例えば第5章 reflect の P.108 です。コードを書いて動かすと、 package main import ( "fmt" "reflect" ) type Point struct { X int Y int } func main() { p := &Point{X: 10, Y: 5} rv := reflect....

2016-09-25 (Sun) · masutaka

WEB+DB PRESS Vol.82の「はじめてのGO」を実際に書いて動かした

WEB+DB PRESS Vol.82|技術評論社 記事は非常にわかりやすく、A Tour of Go の途中で挫折した私でも大丈夫 でした。GOとCは結構似ているので、C経験者にもオススメです。 GOは必要最小限の機能しか用意されていない点が好きです。~~最近Rubyの高 機能さにゲップが出るので。~~ちょっとGOで何か作ってみようかな。 そういえば一度この記事のコードも試したのですよね。良い復習になりました。 「今日から始める Go言語 と appengine」というテーマで社内勉強会をしました|feedforce Engineers’ blog Emacsの開発環境は「Goプログラミングの環境構築 - Emacs JP 」を参考に go-mode, go-autocomplete, go-eldocを入れたところ、非常に快適になり ました。機能としてはIDEと遜色ないんじゃないかな? C-c C-aでパッケージのimport文を簡単に追加できる。補完も効く importしたパッケージに含まれる関数名の動的補完 補完した関数の型情報をミニバッファに表示 M-.でfmt.Println等の組み込み関数の定義元にジャンプ ファイルの保存時に、自動的にgofmtコマンドで整形 加えて、open-junk-fileで書き捨てのファイルを作ってコードを書き、 quickrunで即時実行する感じで進めていきました(意外にボリュームがあ り、時間はかかりましたが..)。 init.elはこんな設定にしました。タブ幅はEmacsデフォルトの8だと見づ らいので4に変更。 (with-eval-after-load "go-mode" (require 'go-autocomplete) (defun go-mode-hook-func () (setq tab-width 4) (go-eldoc-setup)) (add-hook 'go-mode-hook 'go-mode-hook-func) (define-key go-mode-map (kbd "M-.") 'godef-jump) (define-key go-mode-map (kbd "M-,") 'pop-tag-mark)) (add-hook 'before-save-hook 'gofmt-before-save) GO++...

2015-02-11 (Wed) · masutaka

ghqとcdrの出力を一緒にpecoに食わせたら捗った

最近はghq+pecoでリポジトリのあるディレクトリ、cdr+pecoで最近訪れた ディレクトリに簡単に移動できて、非常に捗っている。 ghq+pecoとcdr+pecoはそれぞれ以下の記事が詳しい。 ghqを使ったローカルリポジトリの統一的・効率的な管理について - delirious thoughts pecoを使い始めた - $shibayu36->blog; ただ、ghq+pecoはC-x C-y、cdr+pecoはC-x bと、当然別々のキーになるの で、どっちを使うか考えたり間違えたりするのでモヤモヤしていた。 Emacsは自作のhelm-ghq.el で同じ操作感にしていたので、同じモヤモヤだっ たが、最近来たPull Request を取り込んでからは改善。 C-x b (helm-for-files)でghqの出力も出すことでキーバインドを1つに集 約できた。C-x C-yのキーバインドは削除。 C-x bでこのような一覧が表示されて、絞り込む感じ。 ghq list –full-pathの出力 現在開いているバッファ 最近開いたファイル カレントディレクトリにあるファイルやディレクトリ 複数のソースを出力していても、混乱しないどころか便利に使えたので、 zshも同じでいいじゃんと思い、変更した関数がこれ。(リファクタリング出来そう…) ghqとcdrの両方の出力が候補に出ているのが分かると思う。 C-x bだけでghqとcdrを呼び出せるし、Emacsと操作が同じだし、非常に満 足行く設定になった。 IFSをいじっているのは、スペースを含むディレクトリも適切に処理するた め。デリミタを改行だけにしている。 awkの処理はソートなしの重複削除。なんでこれで出来るのか全く分からな いけど。。 loading... if (localStorage.getItem("pref-theme") === "light") { const elements = document.getElementsByClassName('twitter-tweet'); for (let i = 0; i 追記(2014-10-07):...

2014-09-06 (Sat) · masutaka