タグ

ブックマーク / motemen.hatenablog.com (35)

  • Goで知らないフィールドのあるJSONを取り扱う - 詩と創作・思索のひろば

    野良 HTTP JSON API クライアントを作ってると、API が返してくる JSON の形に確信が持てないし、「これ何に使うんだろ」みたいなフィールドもあったりして struct にエンコードするのをサボったりする。 そういったコードがライブラリとして使われる余地を残すとすると、struct で表現されていないデータにも何らかの方法でアクセスできるようにしておきたい。こういうパターンあるんじゃないかと思うが、みんなどうやってるのか分からなかったのでメモ。 まあ素直に、json.RawMessage を struct に持たせておくのが一番よいだろう。冗長にはなるが、構造体の定義されたフィールドに便利なデータはあるし、より詳細に見たいなら RawMessage 経由で生データを見ればよい。ということにする。また、RawMessage を保持している場合は JSON 化したときにこれをそ

    Goで知らないフィールドのあるJSONを取り扱う - 詩と創作・思索のひろば
  • Dockerfile をベースイメージの更新に自動で追従させる - 詩と創作・思索のひろば

    前回のエントリで作った Docker イメージ motemen/datastore-emulator は、google/cloud-sdk をベースにしているが、このベースイメージがけっこうな頻度で更新される。とうぜん自分はその追従に手を煩わせる気はなくて、全部自動でやってほしい。 やりたかったこと google/cloud-sdk:x.y.z がリリースされたら、 リポジトリ中の ./Dockerfile と ./alpine/Dockerfile の FROM を google/cloud-sdk:x.y.z(-alpine) に更新し、 x.y.z タグを打って git push することで、 Docker Hub に x.y.z(-alpine) タグとしてリリースする これを自動かつ無料で実現したい。 採用しなかった案: 自分でなんか作る はじめは適当な GitHub Actio

    Dockerfile をベースイメージの更新に自動で追従させる - 詩と創作・思索のひろば
  • Ether を送金した人だけコンテンツを閲覧できる Ðapp を書いた - 詩と創作・思索のひろば

    Ethereum はブロックチェーン上でアプリケーションを動かせる(スマートコントラクト)ってので興味を惹かれて、どんなことができるのか調べてたんだけど、感じを掴むために一つ書いてみた。 やりたいことは、ウェブページに送金ボタンがあって、そこから特定のアドレスに Ether を送金し、送金が確認されたら秘密のコンテンツをページ上に表示する、てなもの。送金の確認はスマートコントラクトで行えるが、秘密の情報をブロックチェーン上に記録するわけにはいかないのでこれはウェブサーバに秘匿することになる。とすると、ウェブサーバに私はこの Ethereum アドレスです、とセキュアに伝えてやる必要がある。後で書くけど、あまりいい解法ではない。 知識ゼロの状態から分からないことを潰しつつなんとか動くところまでこれたので、ウェブアプリケーション開発者がつまづいたところをメモっとく。 デモ MetaMask W

    Ether を送金した人だけコンテンツを閲覧できる Ðapp を書いた - 詩と創作・思索のひろば
  • チャンネルを使って、決まった数のリソースをgoroutine間で共有するパターン - 詩と創作・思索のひろば

    生成が重いリソース(や重い処理の実行権)を goroutine 間で共有し使いまわすようなパターンです。よく知られていて名前がついていそうだけど、ぐぐっても分からなかったので書いておく。 コネクションプールに近い感じで、最初にリソースを生成したあと、それらを大事に取り回します。リソースが空いてなかったら goroutine は待つことにする。sync.Pool は「プールにあったら使うけど、なかったら新しく作る」くらいの感じなので、ちょっとスタンスが違う。 チャンネルによる実装は簡単で、以下のエントリにも書いたセマフォを応用すればよい。 ざっくりと書いてみた例がこちら: https://play.golang.org/p/QWAXsA_89Y チャンネルによるセマフォの実装は、「バッファありチャンネルに何か(struct{})を挿入できた goroutine が実行の権利を持つ」というもの

    チャンネルを使って、決まった数のリソースをgoroutine間で共有するパターン - 詩と創作・思索のひろば
  • 最近のGoプロジェクトのMakefile - 詩と創作・思索のひろば

    最近は仕事でも新しくGoプロジェクトをイチからはじめることが増えてきて、コピペ元が欲しくなるので、スナップショットとして残しておきます。とくに Go でウェブアプリケーションを書くような場合を想定していて、npm エコシステムにも乗っていきます。 大まかな方針としては、 self-contained である グローバルな環境を汚染しない コマンド一発で開発環境が再現できる ……というところを目指します。 motemen/prchecklist がこれを達成しているつもりなので、以下、これを例に見ていきます。 依存ライブラリは dep なり何かしらのツールと Go 標準の vendoring で管理すればよい一方、そのツール自体であったり、他の開発中に必要なツール(golint とか gobump とか)であったりのインストールをどうするかという話。 npm であれば devDepende

    最近のGoプロジェクトのMakefile - 詩と創作・思索のひろば
  • prchecklist でリリース Pull Request のチェックフローをスムーズに行う - 詩と創作・思索のひろば

    背景 GitHub を使った開発では、 master ブランチがいつでも番に出せる状態として、 master から切った develop ブランチを開発のベースとし、 各フィーチャは develop から切って develop にマージし、 リリースのタイミングで develop を master にマージ、リリース ……という流れを pull request ベースで行うのがよくあるパターンのひとつだと思います。リリースの際、ステージングや QA という名前のついた番前環境でそれぞれの機能が正しく動いているか確認するのもよくあるフローです。 このチェックを pull request 文のチェックボックスを使って行おう、というアイデアを実装したのが git-pr-release で、もともと id:hitode909 がチーム向けにこしらえたものをパクった汎用化したものでした。この仕

    prchecklist でリリース Pull Request のチェックフローをスムーズに行う - 詩と創作・思索のひろば
  • GraphQLのレスポンスJSONに対応するstructからクエリを生成できるgo-graphql-query - 詩と創作・思索のひろば

    このあいだ GitHub が公開していた GraphQL API が便利そうだったので使おうと思ったのだけど、求めたライブラリがなかったので作った次第です。 ここで GraphQL についての説明はしませんが、結果の JSON とクエリが同じ形を持っているのが便利で美しいですね。ということは API の結果の JSON を受け取る struct から GraphQL のクエリが生成できるのが自然でしょう。そういうことをやってくれるシンプルなライブラリです。 GitHub - motemen/go-graphql-query API シンプルな例 ディレクティブとエイリアス 引数と変数 インラインフラグメント 複雑な例 軽い気持ちで書きはじめたところ GraphQL に予想外の表現力があることがわかったのでけっこう無理をしているところもあります。一般的にどんな使い方がなされるのかわかってない

    GraphQLのレスポンスJSONに対応するstructからクエリを生成できるgo-graphql-query - 詩と創作・思索のひろば
  • Google App EngineでGoを動かすときに知っておくべきこと(ソースコード・ビルド編) - 詩と創作・思索のひろば

    Google App Engine(GAE)で Go 製のウェブアプリを動かしたかった話。いっぺん動かしてみると GAE/Go はウェブアプリを動かす環境としてはとてもいい。ただ、中途半端な知識だけで始めると開発者としてはつまずくことが多かったので、分かりにくい点をまとめておく。 Google App Engine Go Standard Environment について goapp は $GOPATH 以下もアプリケーションのソースとしてアップロード/コンパイルする goapp はプロジェクトルート以下のソースコードをすべてコンパイルしようとする go-app-builder: Failed parsing input: parser: bad import "syscall" in ... go-app-builder: Failed parsing input: app file x

    Google App EngineでGoを動かすときに知っておくべきこと(ソースコード・ビルド編) - 詩と創作・思索のひろば
  • 型と名前によるGoのコード探索 ― gofind - 詩と創作・思索のひろば

    思いつきでツールを作ってはリスのように忘れ、再発見しては新鮮な気持ちで便利に使う日々です。 一般にプログラミングにおいては、ソースコードを読むことに意外とばかにならない時間を使うもの。特に Go ではデフォルトで標準ライブラリのソースコードが手元にあり、コードを書く際よい教科書になるので、これを読むことも多いはず。 Go は静的に型付けされる言語なのでその点コードは読みやすいけれど、データ構造が不変ではないので、ある構造体のフィールドがどこで書き換わるのかを知るには、処理を追っていくしかない。名前で grep するのもひとつの手ではあるけど、精度はあまり期待できない。 そこで gofind。簡単に言うと、型やパッケージを含めた名前でもって Go のソースコードを検索するツールです。 go get github.com/motemen/gofind/cmd/gofind 使い方は以下の通り。

    型と名前によるGoのコード探索 ― gofind - 詩と創作・思索のひろば
  • Go 言語における並行処理の構築部材 - 詩と創作・思索のひろば

    5年前に買った『Java並行処理プログラミング ―その「基盤」と「最新API」を究める―』をようやく読んだ。買った頃には Perl やシンプルな JavaScript ばかり書いていたので並行プログラミングなんてほとんど気にすることがなく、実感がなくて読むのも途中で止まってしまっていたで、家を掃除しているときに見つけたもの。その後も趣味Android アプリを書くなど Java に触れる機会はあったけれど、せいぜいが AsyncTask を使うくらいで、マルチスレッドを強く意識してコードを書くこともなかった。 Java並行処理プログラミング ―その「基盤」と「最新API」を究める― 作者: Brian Goetz,Joshua Bloch,Doug Lea出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/11/22メディア: 単行購入: 30人 クリック: 442回

    Go 言語における並行処理の構築部材 - 詩と創作・思索のひろば
  • 第三者のための『リーダブルコード』 - 詩と創作・思索のひろば

    新人エンジニアにオススメののひとつだよねー、などと言いつつ自身は読んだことがなかったので慌てて買って読んだ。 お題「リーダブルコードリーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典出版社/メーカー: オライリージャパン発売日: 2012/06/23メディア: 単行(ソフトカバー)購入: 68人 クリック: 1,802回この商品を含むブログ (131件) を見る なるほど当たり前のようなことでありながら短期的に意識して身につけるのは難しかったことばかりで、これがこのようにまとまった形の書籍になっていることはとてもありがたいことだと思う。規約を押しつけてるわけじゃなくて指針の集合なので、気楽さもある。 プログラム中で使用する英語動詞

    第三者のための『リーダブルコード』 - 詩と創作・思索のひろば
  • git fetch の裏側では何が起こっているか - 詩と創作・思索のひろば

    git fetch の裏側でどんな通信が行われてリモートリポジトリの内容が取得できるのか調べたのでまとめる。もともとは git の HTTP や SSH といったプロトコルでどのように実現されているか、というところに興味があった。Git v2.7.1 を基にしている。 事前準備 pack プロトコル pkt-line フォーマット Reference discovery Packfile negotiation Packfile の送受信 packfile への圧縮・packfile からの展開 各種トランスポートの実装 file トランスポート ssh トランスポート git トランスポート http(s) トランスポート まとめ 参考資料 事前準備 手を動かしてプロトコルを理解できるよう、gist の小さなリポジトリ を使う。適当なディレクトリ下に bare リポジトリとして clon

    git fetch の裏側では何が起こっているか - 詩と創作・思索のひろば
  • goiferr で Go のエラー処理コードを自動挿入する - 詩と創作・思索のひろば

    Go 言語には例外機構が備わっておらず、関数や手続きのエラー的な状況を表すには、返り値を多値にして来興味ある結果とともに error インターフェイスを返す、というのが一般的です。例をあげるまでもないですが、ファイルを開くという(失敗する可能性のある)処理を行うならこういう感じ: f, err := os.Open(filename) if err != nil { // handle err } 何ごとも明に書き下すことを求める Go らしい仕様ですね。文句ある人も多そうですが、呼び出し側が異常系を意識せざるを得なくなるので、よい効果も大きいと思います。 先の例のように、エラーを発生させるような処理を呼び出したあとは err をチェックする、というのは最初に学ぶイディオムと言ってもよいくらいよく書くことになるコードですが、ほんとうに何度も書くことになるのでこれは面倒。 go-iferr

    goiferr で Go のエラー処理コードを自動挿入する - 詩と創作・思索のひろば
  • ISUCON5 本選に参加して7位に終わりました #isucon - 詩と創作・思索のひろば

    表題のとおり、ハロウィンの夜ゾンビ化した渋谷の街でヒカリエに取り残された俺たちは、ISUCON5戦に参加してきました。 予選はこちらをご覧ください: motemen.hatenablog.com チームは id:wtatsuru (たつる先生)と id:ichirin2501 (いちりんちゃん)とで組んだ「2nd Party Cookies」。 結果は上記のように7位。8万点台に乗らなければ勝負に絡んだと言えず、一時は7万台まで伸ばしていただけに悔しい結果となりました。以下、当日やったことをふり返ります。 初動 開始時刻になってサーバにアクセスできるようになると、wtatsuru が諸々のセットアップをしているあいだにアプリケーションの挙動をチェック。マイクロサービスを使ったウェブサービスで、ユーザの登録情報から複数の HTTP API を叩いて画面に表示する、というものでした。 データ

    ISUCON5 本選に参加して7位に終わりました #isucon - 詩と創作・思索のひろば
    clavier
    clavier 2015/11/03
    ISUCON5 本選に参加して7位に終わりました #isucon - 詩と創作・思索のひろば
  • git commit --fixup とは何か - 詩と創作・思索のひろば

    git commit --fixup というオプションの存在を最近知って調べた。 ヘルプとリリースノートより "git commit" learned the --fixup and --squash options to help later invocation of interactive rebase. Git v1.7.4 Release Notes --fixup=<commit> Construct a commit message for use with rebase --autosquash. The commit message will be the subject line from the specified commit with a prefix of "fixup! ". See git-rebase(1) for details. 1.7.4 から入って

    git commit --fixup とは何か - 詩と創作・思索のひろば
  • ISUCON5 予選通過したが若手に負けました #isucon - 詩と創作・思索のひろば

    表題のとおり、ISUCON5 予選日曜の部にチーム「2nd party cookies」として参加し、17609点の総合10位で選出場となりました(http://isucon.net/archives/45532743.html)。 それは良かったのだけど、実はうれしさも8割引きで、というのも同日に参加し3位で通過した「はむちゃん」、ここに勝つことが第一の目標だったからなのでした。はむちゃんははてな社内の若手エンジニアで組んだチームで、真っ先に ISUCON への参加表明をしていたので、それに触発されるかたちで自分も参加を決めた経緯があります。id:wtatsuru とともに、チーフエンジニア3人のチームでガチンコ勝負しようぜ! って言ってたら @Songmu さんがうらぎ先約のあったらしく、代わりというわけではないが、ISUCON はインフラ見られる人が2人はいるなという目論見の下、イ

    ISUCON5 予選通過したが若手に負けました #isucon - 詩と創作・思索のひろば
  • Go のシンプルかつ明快な SQL クエリビルダ go-sqlf - 詩と創作・思索のひろば

    Go でリレーショナルデータベースを利用したアプリケーションを書いているとき、動的に SQL を組み立てたい場合には、いくつかの方法が考えられます: クエリビルダを使う。世の中にすでにいろいろ存在します。(そのためのライブラリなので)動的に生成するにはもってこいですが、この場合、それぞれのライブラリに合わせた書き方をしなければならないので読み手にもある程度負荷がある点、また、Go は言語として冗長に書くことをよしとする思想を持っているため、DSL 的な API との相性が悪いという欠点があります(map の組み立てが冗長、条件分岐する式が書けないなど)。また、一般にクエリビルダから生成される SQL がコードから想像しづらくなる問題もあります。 文字列連結や fmt.Sprintf を使う。発行される SQL は比較的分かりやすくなりますが、動的に組み立てると SQL プレースホルダとバイ

    Go のシンプルかつ明快な SQL クエリビルダ go-sqlf - 詩と創作・思索のひろば
    clavier
    clavier 2015/09/11
    Go のシンプルかつ明快な SQL クエリビルダ go-sqlf - 詩と創作・思索のひろば
  • YAPC::Asia Tokyo 2015 に行ってきた #yapcasia - 詩と創作・思索のひろば

    YAPC::Asia Tokyo 2015 今回はキャパも拡大し、あぶれることがあまりなかったのがよかった。それでも立ち見だったり入れなかったりがあるのはさすがの人数。これだけの人間を動かすスタッフのみなさんには困難も多々あったのだろうと思いますがおかげさまで快適でした。 いつにも増して多彩なトーク内容だったなと思う。普段なんとなく名前は聞いて興味はあるけれど、さしせまった個人的な要求がなくてきちんとは知っていなかったトピックについてきっちり一時間かけて知ることができて、楽しかった。今回トークが基一時間枠になったのがとてもよくて、どんなもんだろうと思っていたけど一時間なんてあっという間だった。これまで20分枠でもひいこら言って話を用意していたけど、これなら自分でもできるかもって思えてよかった。 トークはみんな録画されているから、(質疑を考えなければ)どれを見てもよいのだけど、YAPCある

    YAPC::Asia Tokyo 2015 に行ってきた #yapcasia - 詩と創作・思索のひろば
  • Go プロジェクトのバージョニングとリリースを CI で自動化する - 詩と創作・思索のひろば

    gobump で Go プロジェクトのバージョニングをおこなう の続き。すっかり書くのが遅くなってしまったけれど、別にもったいぶるような特別なことはないです。 ここでは、Pull Request のマージを契機に、バージョンを進めるコミットをし、push して、GitHub のリリースを進める……ということを CI でおこなうことを目標とします。 これはわりと簡単で、以下のようなスクリプトで実現できます。必要なものは gobump、ghr、jq と GitHub のパーソナルアクセストークン。通常はクロスコンパイルするのに gox も使うことになるでしょう。 set -e repo_owner=motemen repo_name=test-repository committer_email=motemen+gobump-bot@gmail.com committer_name=motem

    Go プロジェクトのバージョニングとリリースを CI で自動化する - 詩と創作・思索のひろば
  • Go Conference 2015 Summer で Go の REPL gore の話をしてきました & gore 0.2.1 - 詩と創作・思索のひろば

    去年からこちら Go の話をしたり聞いたりする機会があればぜひ言ってみたいと思っていたのですが、このたび Go Conferecne 2015 Summer の話を聞きつけて、うまいことスピーカー枠に入ることができたので、前に作った Go の REPL(正確には違うんだけど)である motemen/gore の話をしてきました。 speakerdeck.com gore の紹介は過去のエントリ コード補完もできる Go の REPL「gore」を作った - 詩と創作・思索のひろば にある通りです。今回はその実装に若干立ち入った紹介をしました。 この日のトークは oracle の紹介にはじまり Go の静的解析めいた発表が多く、個人的にはとてもわくわくさせられた内容でした。時間の都合もあって、gore(と go-quickfix)の面白い部分の詳細の話はぜんぜんできなかったので、また別の機会

    Go Conference 2015 Summer で Go の REPL gore の話をしてきました & gore 0.2.1 - 詩と創作・思索のひろば