生涯未熟

プログラミングをちょこちょこと。

Elasticsearchのbulk APIのMaxファイルサイズを探る

elastic searchと書くとElasticsearchに怒られることを知った今日此の頃。

今回はElasticsearchのbulk APIにどのくらいのサイズのファイルを突っ込めるのか探っていきます。

bulk APIに関する公式ドキュメントはここ

www.elastic.co

一言で言うとbulk importしてくれるAPIですね。

で、JSONを細かく切って色々探ってみたんですが、どうも100MBを超えるJSONファイルをぶっこむと死ぬようです。

なので、100MBを超えるJSONファイルをbulk APIに突っ込む際は、split コマンドなりで100MBを超えないように分割してから突っ込みましょう。

Golang Weekly #174

GitHub - awalterschulze/goderive: Next generation code generator for go

Goでよく使う関数をgenerateしてくれるジェネレーターツール。

例えば、

と書いて、goderive ./... することで、同パッケージ内に以下のようなコードが吐かれます。

このような感じで、構造体の同一性をチェックしてくれるコードを生成してくれます。

他にも、様々な関数が生成出来るので是非READMEでチェックしてみてください👌

Copypasting "if err!= nil {return err;} everywhere : golang

大量に記述することになるerrをキャッチする際のif文をどうやったら上手く扱えるか?というスレ。

日本でもエラーハンドリングについてはよく話題になります。
私の中で一番参考になったのは以下の記事ですね。
エラーハンドリングの繰り返し処理に対して、丁寧に対策を書かれております。

Golangのエラー処理とpkg/errors | SOTA

GitHub - tockins/realize: Go build system with file watcher, live reload and output streams. Run, build and watch file changes with custom paths

golangでのビルドツール。
jsで言うところのgulpなどのようなものと同じ立ち位置ですね。

ビルド結果をCLやブラウザでも表示することができ、ビルドツールとしては過不足無いツールなのではないでしょうか。

READMEの情報量も充実しているので、使う分には困らなさそうですね。

fluent-plugin-kafkaを使ってkafka streamsでアレコレするのはまだ出来ないよという話

最近、Apache財団に囲まれながらアレコレやってる私です。

今回はfluentdのkafkaプラグインであるfluent-plugin-kafkaを使って、kafka streamsが出来なかったお話をば。

何をしたかったのか

fluentdでログを監視しつつ、変更があればfluent-plugin-kafkaを使いkafka brokerへログ内容をメッセージとして飛ばす。
そして、kafka streamsでメッセージを加工し、改めてログとして保存するということを実現しようとしていました。

一体何が起こったのか

実際に、この構成で組んでみたのですがkafka streamsを動かしてみるとエラーが発生しました。

ふむふむ🤔 一旦このメッセージを検索にかけてみるとこのような記事が。

FAQ — Confluent Platform 3.3.0 documentation

英語苦手なので物凄く斜め読みすると、「メッセージのタイムスタンプが適した形になってない」ってことですかね。

で、v0.10の形に沿ったタイムスタンプを送れていると、このエラーは出なくなるという。

ここでふと思ったのは、「fluent-plugin-kafkaが依存しているurby-kafkaはv0.10対応出来ているのか?」ってことでした。
とりあえずISSUEを探ってみることに。

Timestamp support for Kafka 0.10.2.0 · Issue #331 · zendesk/ruby-kafka · GitHub

ふむー、これを見る限りはv0.5.0betaで対応はされてますね・・・
・・・ん?beta・・・?

さて、ここでfluent-plugin-kafkaのgemspecを見てみましょう。

えーっと・・・ruby-kafkaのバージョンは・・・

v0.4.0!!!!!

というわけで、多分fluentdのプラグイン側では、ruby-kafkaがまだbetaなこともあってバージョン上げてないんでしょうね。
v0.5.0のstableが出るまでは、fluent-plugin-kafkaを使ってまだkafka streamsは使えない様子、ガックシ。

Golang Weekly #173

How I landed my first contribution to Go

GoへのContributeを初めてやってみた話。

筆者の方はこちらの動画を見て「やってみよう!」となった様子。
動画を見てみると、物凄く丁寧にGoのContributeの方法を説明してありました。

この方のように、Goのライブラリを深く潜ってみてContributeチャンスを見つけていくのは大事ですね:-)

How I built an audio library using the composite pattern and higher-order functions — faiface blog

デザパタのCompositeパターンと高階関数クロージャーの合せ技で、オーディオライブラリを作ってみた話。

Goでデザパタと聞くと、monochromeganeさんのデザパタGo実装リポジトリが思い出されます:-)

本記事内では、コンポジットパターンをシーケンシャルな処理に用いることでDRY原則に準ずるコードを簡単に書くことが出来ると述べています。

Contribution Workshop - The Go Blog

GopherConで行われた、GoへのContributeワークショップの話。

このワークショップのために、スコアボードが用意されており、PRを投げたりした場合に点数がインクリメントされていく、とてもやる気が上がる仕組みが導入されている。

日本でもこういうワークショップがあればいいなーと思う反面、メンター側集めるのが大変そうというイメージ:-(

GitHub - asciimoo/wuzz: Interactive cli tool for HTTP inspection

CLIでのHTTPインスペクションツール。

READMEに貼られた画像を見れば一目瞭然なのですが、何故そこに全力を出してしまったのか・・・と言いたくなるツール。

正直、実用性を問われると色々とアレですが、中のコードを読んでみたくはなりますね:-)

Golang Weekly #172

Typed nils in Go 2 | Dave Cheney

Goのnilについてハマったことは誰にでもあるはず。
そんなnilについての記事です。

この記事中のコードをもし自分が書いた場合、サクッと比較対象のnil(*T)(nil) としてしまうのだが、どうするのがベストプラクティスなのだろう・・・?
もう少し、このnilが扱いやすくなると良いですね:-)

Context should go away for Go 2 — faiface blog

contextについての考察記事。

記事内では context.Value について、痛烈に批判しており、

  • 静的型付けではない
  • 特定の関数が扱うキーと型をドキュメント化しなければならない
  • スレッドローカルストレージとよく似て柔軟性がなく、使用法・構成・テストが複雑になる
  • 名前のコンフリクトが起こる場合がある

といった理由を挙げています。

確かに、 context パッケージからは切り離した方がいいのかもしれませんね🤔

Always Be Closing – Square Corner Blog – Medium

Goのリソースリークについて。

この記事の筆者が運用しているサービスにて、突然メモリの使用量が200MBから数GBにまで跳ね上がったことを発端に調査したところ、
リクエストごとにメタデータを約17時間保持するようになっており、それが原因でした。

何故そのようなことになったかというと、contextによるリクエストのキャンセルまでの時間が60,000ミリ秒とするところが60,000秒(約17時間)としてしまったせいだったのです・・・:-(

contextの使用法から、pprofを使った問題発見までが物凄く丁寧に書かれている良い記事です。

Go 1.9 Release Candidate 2 is released

出ました!Go 1.9 rc2!
Go1.9のリリースまでもうすぐ!!😇