タグ

ブックマーク / www.kaoriya.net (6)

  • テストのためだけに`interface`を書きたくないでござる — KaoriYa

    golangでテストのためだけにinterfaceを書くのが死ぬほど嫌だったので編み出した技を紹介します。 TL;DR テスト(=mock)のためだけにinterfaceは切りたくない 型エイリアスとビルドタグを組み合わせるとinterfaceがなくてもモックが作れる この手法に必要なモックを自動生成するプログラムを作った interfaceは当に必要なシーンで使うべき Background 現在モックを使った単体テストは一般的です。 Javaでの例を挙げると、モックしたいコンポーネントについて予めinterfaceを定義しておき、モックではそのインターフェースを実装するのが定石です。 しかしgolangのinterfaceはJavaなどのそれとは若干性質が異なるため、テスト=モックのためだけにinterfaceを書くのはオーバーワーク気味です。 そうテストのためだけにinterface

  • golang は ゆるふわに JSON を扱えまぁす! — KaoriYa

    以下のツイートにもある通り、一見 golang は struct を定義しないと JSON を扱えないように見えます。他にも似たようなツイートをチラホラと見かけましたが、それらは全部誤解です。そこでこの記事では、golang でゆるふわ (structを定義せず) に JSON を扱う方法を紹介します。 golangrubyのようにゆるふわにJSONは扱えない? https://t.co/olsryDHc5G — bamchoh (@bamchoh) 2016年6月24日 この記事では入力の json.Unmarshal() を取り扱いますが、出力の json.Marshal() にも応用できます。 TL;DR json.Unmarshal() には *interface{} を渡せます interface{} は dproxy を使うと、値のアクセスで楽ができます json.Unmar

    ono_matope
    ono_matope 2016/06/25
    JSONのクエリ構文がRFCにあるの知らなかった…
  • fmt (Fprintf/Sprintf) の速度向上実験 — KaoriYa

    golang の fmt.Fprintf/Sprintf には、 フォーマット文字列の解釈を最適化することで、 速くする余地があると推測されます。 その推測が正しいか、お手軽な実験を行ってみました。 この記事は Go Advent Calendar 2014 の6日目の記事です。 fmt.Fprintf および Sprint は、実行時にフォーマット文字列を毎回解析するという性質上、パフォーマンスに余計なオーバーヘッドが発生すると言えます。よって、その解析処理をコンパイル時に行えば、大幅にパフォーマンスが改善することは、C言語において kazuho さん(h2oプロジェクト)の h2o/qprintf が証明しています。 今回は qprintf にインスパイアされて、同様のことを golang で行ったらどの程度速くできるのかを、簡単な実験(koron/qfmt)で確認してみました。 方式

    ono_matope
    ono_matope 2014/12/06
    興味深い
  • または私は如何にして例外するのを止めて golang を愛するようになったか — KaoriYa

    Java の finally よりも golang の defer のほうが筋が良さそうだ、 ということから考え始めた結果、 どうして私が golang を気に入ったのかがわかった気がしたので書いておきます。 ファイルをオープンし読み込みな処理で何かして終わったら閉じる、という関数を Javagolang で書き比べてみましょう。 Java で書くとこんな感じですね。 public static void readFile(String fname) throws IOException { InputStream s = null; try { s = FileInputStream(fname); // // Do something with "s". // } finally { if (s != null) { s.close(); } } }

    ono_matope
    ono_matope 2014/04/17
    スッキリ書けて良い。
  • golang でループを手っ取り早く並列化する方法 — KaoriYa

    func execLoop(list []Item) { for _, item := range list { do_something(item) } } list に格納された各 item に対して do_something() を適用する、よくあるタイプのループ処理です。 goroutine で並列化、その副作用 golang ではこの do_something() の適用を超お手軽に並列化できます。あ、もちろん do_something() はリエントラントである前提ですね。

  • rubyをdisってみる — KaoriYa

    自分で運用しているredmineが依存性の問題で動かなくなったので、腹いせ&八つ当たりでrubyをdisってみることにしました。 redmineが動かなくなりました。背景はこうです。 FreeBSDにportsでredmine入れて快適だぜ! セキュリティとか怖いからなるべくportsは新しくするぜ! あれredmineが動かくなったぜ? なんでだぜ? 結論からいうとruby-gemsとrailsのバージョンがコンフリクトしたのが原因でした。もともとこのFreeBSD boxにはredmine 1.2.1とruby-gems 1.7が入っていました。そしてある時portsでruby-gemsが1.8にアップグレードされたのです。redmine 1.2.1にはrails 2.3.11がバンドルされています。このrails 2.3.11、実はruby-gems 1.7以前でないと動かないという

    ono_matope
    ono_matope 2011/09/13
    一般論として、業務で使う重要なシステムでのアップデートは慎重に行うべきな気が…(Rubyに限らず、HTTPサーバもOSも言語も)
  • 1