Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

memo: RabbitMQ

TODO

  • 2回以上実行される可能性(結果報告前にConsumerが落ちる,タイムアウト etc.)と、そのために必要な設計(INSERT処理のみにする=更新・インクリメント処理は避ける etc.)
  • キューを作り分ける意味とその狙い。例えば動的スケールするべきキュー(即実行すべきJob)と処理が遅延してもよいキュー(永続性を優先すべきJob)に分ける?

Reference

最近読んだマンガ

まさかの2巻発売ということで、早速Kindleで入手しました。シャーリーがカフェに行く話が一番お気に入りです。大人が仕事をしている姿というのは素晴らしいものです。

長時間かけて書かれた本ということで、絵柄がかなりばらついているのですが、それでも同じ作家さんによる一連のマンガとして楽しめるのが不思議です。

俗に言う日常系四コマなのでしょうが、主人公が喋らないことによって人間模様が濃く描写されている印象です。肩の力を抜いて読めます。

Helck 1 (裏少年サンデーコミックス)

Helck 1 (裏少年サンデーコミックス)

なんか久々にすごいのが来た気がします。オンラインで最初の数話と最新話が読めるのでとにかくお試しを。

中国では技術力のある国・先進的な国として、よくドイツの名前を目にします。しかし私はドイツの実際はほとんど知りません。また国際結婚固有の問題に共感するところもあり、両方の意味から楽しみに読みました。

読後にもうちょっと内容があってもいいのではと思いましたが、このページ数だと仕方ないのかもしれません。

孔明のヨメ。 (1) (まんがタイムコミックス)

孔明のヨメ。 (1) (まんがタイムコミックス)

どこまで史実でどこまでフィクションかわかりませんが、ひとつのマンガとして楽しんでいます。3巻4巻がまだ未入手なので近々。

最近読んだ本

今日は日曜日ですが中国では出勤日です。国慶節に向けて休日の移動が発生しているのですね。

さて最近読んだ本の紹介です。電子書籍中心の生活をしていますが、これらはまだ紙の本での入手でした。こういう本も電子化されると、私みたいに海外で暮らしている人には嬉しいのですが。

心の筋トレの話、モチベーションの話、ブランドとミッションの話が面白いです。チームと働く上でどうモチベーションを上げてもらうか・どういう発想を持ってもらうかというのが大切なのは常日頃実感していて、それが経営のレベルになってもそんなに変わらないのかなという印象を受けました。 あとはサービス業であっても経営者の仕事は環境づくり・気付きの機会づくりがほとんどなのだなぁと。店長や店員に動いてもらう・考えてもらうためにどう伝えるかに腐心する話とか。自分の場合だと、日本企業の持つイメージと自分の企業の実際のギャップをチームメイト(全員外国人)に認識してもらいつつ、自分の企業の特徴をうまく活かした自己成長を想像し目指してもらうことが第一の課題なわけですが、今悩んでいることが40年後にも活きるのだと思うとすごく良い成長の機会を与えられているのだなと実感します。

おいしい穀物の科学 (ブルーバックス)

おいしい穀物の科学 (ブルーバックス)

「コメは粒のまま食べるのに、コムギは粉にするのはなぜか?」なんて考えたこともなかったし、その裏に科学的合理的な理由があるとは!トウモロコシは実が包まれていて鳥害に強い上に運搬も楽だから山岳地帯にも向いているとか、普段目にしているものが長年選ばれてきた理由や人との関わりの中でどう姿を変えてきたかとか、雑学を超えた面白さがあります。

特に興味深かったのは、コメの利用には土器の誕生が強く関係しているという話。加熱にも食事にも必要ですものね。縄文時代から土器・青銅器・鉄器などの器・道具が発達してきていて、それが農耕の生産性に寄与してきたのは知っていましたが、そもそも植物の摂食利用に必要だったのですね。学校で歴史を学ぶときにこういうことを知っていると、なぜそんなに土器や貝塚について学ぶのかをもっと深く理解できたように思います。 他にも竹を使い捨て食器として使える(土器のような器を必要としない)地域があり特殊な文化が育ったとか、コメは集落を作りやすいとか、稲はなぜ田植えするのかとか、コムギを中心とするには石臼が必要で定住向けだとか、なるほどなぁと思わされるものが多かったです。

朝に効く薬膳 夜に効く薬膳

朝に効く薬膳 夜に効く薬膳

引き続き薬膳を学んでいますが、すごい単純に言うと旬のものをまるごと食べなさい(一物全体・身土不二)に集約されるようです。雨が多い時期には水分を出す食べ物が旬を迎えるし、乾燥する時期には喉や肺を潤す食べ物が市場に出回るので、適宜それを取りなさいねと。 喉が乾燥していた時にレストランでなんとなく梨のジュースを選んで、あとで梨の効能を調べてふーんと思う時もありましたので、食べ物の効能については知識以前に本能や経験のレベルで理解しているのかもしれません。

健康状態の診断と改善に五行とか気血水とか考えられるようになるとまた違ってくるのでしょうが、そこまで大きく体調をくずすこともなく健康に暮らせているので、しばらくは活用の機会はなさそうです。

詳説日本史研究

詳説日本史研究

教科書ですね。オビに「大学受験に必携」って書いてあります。

海外で暮らして「外国人」の女性と結婚して、やっぱり日本人であることや日本の歴史を見なおす機会は増えています。最近興味深かったのは、日本では「終戦の日」「原爆の日」として認識・報道している日が中国では「ポツダム宣言の日」として報道されていたことで、当然ながら立場によって見方も認識も違うのだなぁということを再認識した次第です。

この本では日本の歴史について再度学んでいて、鎖国時の出島の役割について奥さんに話す際に参照したりしました。頭から読み進めるというよりは、適宜参照する使い方をしています。

日本の起源 (atプラス叢書05)

日本の起源 (atプラス叢書05)

まだ頭しか読んでませんが、天皇の起源や権力者同士の争いについて様々な説が紹介され楽しめています。「穀物の科学」で読んだコメの生産性が集約労働であがることやコストをかけるだけ収量を増やせることと合わせて読むと、当時の権力者の闘争にリアリティを感じることができます。

あと歴史の専門家が話しあうという形をとっていて、資料や説から一歩引いてそれらを俯瞰する立場で話が展開されているのが素敵です。歴史は勝者によって都合が良いように書き換えられるそうですが、そうしてできた資料をただ紹介するだけでなく「これこれこういう背景があったからこういう書き方をしているのかもね」という話をしてくれるので、知識のない素人でもいろんな見方が楽しめます。

Closure Library でカタいクラスを実装する

ここではカタいクラス=フェイルファストで、コンパイル時に問題を発見しやすく、かつ保守しやすいクラス と定義する。
基本的には goog.ui.Component あたりを読むと勉強になる。もちろんネームスペースでユーティリティメソッド群を実装する場合にも通じる。

goog.asserts.assert を使う

「ここではこういう理由からこういう状態であるべき」をコードで明記できる。例えばgoog.ui.Componentでは以下のようにして使っている。

/**
 * Similar to {@code getElementByClass} except that it expects the
 * element to be present in the dom thus returning a required value. Otherwise,
 * will assert.
 * @param {string} className The name of the class to look for.
 * @return {!Element} The first item with the class name provided.
 */
goog.ui.Component.prototype.getRequiredElementByClass = function(className) {
  var el = this.getElementByClass(className);
  goog.asserts.assert(el, 'Expected element in component with class: %s',
      className);
  return el;
};

@param, @type, @return で ! や ? をきちんと書く

Javaの人としてはundefinedやnullになりえる場合は明記したい。

JSDocで@param {?Object} object description とすればnullになる可能性がある(nullを許容する)ことの明記になる。undefinedは{(Object|undefined)}とする。
逆に、nullになる可能性がない(nullを許容しない)場合は@param {!Object} object descriptionで良い。

@paramの場合は=を使って省略可能であることも明記できる。この場合、=の右側にデフォルト値を併記しておくとドキュメント生成に良い。

追記:はてぶコメントで指摘いただきました、stringはプリミティブなのでnullにはならないそうです。

@override の代わりに @inheritDoc を使えないか検討する

ドキュメントで説明すべき事柄がスーパークラスと同じ場合、@override の代わりに @inheritDoc を使うことでスーパークラスのドキュメントを使える。
Closure Library自身にもけっこうドキュメントが空っぽなメソッドがあるが、このタグを使えば解決できることが多い。

追記:はてぶコメントで指摘いただきました、deprecatedになっているそうです。

@typedef とRecord TypeでPlain Objectの中身について型情報を明記する

Record Typeを使うと、Plain Objectの中身(プロパティ)について名前と型情報を明記できる。Plain Objectを使いたい、値を表すクラスを作るまでもないケースで有用。

同じPlain Objectを使うメソッド複数ある場合、JSDocをコピペするのではなく、@typedefで型を定義すると良い。例えば goog/fs/fs.js には2メソッドを持つPlain ObjectがUrlObject_として定義されている。

/**
 * @typedef {{createObjectURL: (function(!Blob): string),
 *            revokeObjectURL: function(string): void}}
 */
goog.fs.UrlObject_;

XxxLike を理解して使う

JavaScriptでよくある「ArrayみたいだけどArrayじゃないモノで、だけどArrayとして使える」オブジェクトをXxxLike と表すのがClosure Library流っぽい。Array等を扱うメソッドで代わりにこれらを使うようにすると、カタさを保ちつつ柔軟性を上げられる。

  • goog.array.ArrayLike
  • goog.date.DateLike
  • goog.events.EventLike
  • goog.net.XhrLike

ちなみに goog.dom.isNodeLike() というメソッドもあるが型として定義されているわけではない。

ツールをちゃんと使う

省略。別途資料等を参照。

We've got married

We've got married at 1st/July/2014. Check my post at Facebook for detail:

I guess everyone has doubt about why we were bone. My answer for this question is creating and maintaining good family.

To achieve this goal, previously I only can focus on abstract milestones, like 'be better business person', 'be better team builder' or 'be better cooker'. But now I have clear and concrete milestone to achieve it: just make her happy. I believe that it's very good for our life.