2015年10月16日金曜日

[読書感想文]エンジニアとして世界の最前線で働く選択肢 ~渡米・面接・転職・キャリアアップ・レイオフ対策までの実践ガイド



本書のような自分のキャリアを振り返った本を読む場合、何よりも気になるのは著者の経歴である。中には職歴が2年程度しかないのに、FacebookやGoogleのような有名企業に入ったというだけで、本の出版に至ってしまうような人も昨今少なからず見受けられる。そのような本を購入した時のがっかり感はなんとも言えない。

著者の名前で軽く検索をかけてみると、そんなことはないようだ。
新卒として日本HPに入社し、駐在員としての米国勤務を経た後、AmazonやMicrosoftなどの企業を渡りあるいているようだ。

仕事以外でも、「シアトル界隈のIT関係者が集まって勉強会や講演会などを行う非営利団体シアトルITジャパニーズプロフェッショナルズ(SIJP)の副会長」として精力的に活動されているようであり、少なくとも充分に耳を傾けてみたい経験をお持ちのように見えた。

ちなみに下記のWebサイトが面白かった。購入を迷ってる人はぜひとも読んで欲しいし、読んでしまった人でもまた違うエピソードが紹介されてたりするのでまた違った楽しみを味わえる。


Story of My Life 竜 盛博さん

シリコンバレーで管理職になる道


さて、かなり期待感を膨らませて本を読み始めたが、期待は決して裏切られなかった。
副題の通り、採用、面接、レイオフについて、客観的な情報に、自身が経験した主観を匠に織り交ぜており、一気に読み進めてしまった。採用や面接の情報は筆者自身が採用の経験が豊富であることもあり、非常に高価値な情報が満載である。

いくつか心に残ったことをメモしておく。


  • キャリアは運に大きく左右される。

これは私もしみじみと実感していることである。私も海外赴任に手を上げて、どう選ばれるかも不明なプロセスを何年も待ち続けたことがある。成果を出せばいいという簡単なものでもなく、その時の募集状況やプロジェクトの予算など自分の努力ではどうしようもない要因に悩まされた。


  • レイオフは避けられないので、されてもすぐ転職できるように日頃から準備するしかない。

私はまだレイオフを経験したことがない。しかしこれは真理なのだろう。心に止めておかないと行けない


  • 35歳プログラマ定年説のないアメリカでも、50歳を超えると転職は難しい

50歳になって米国で職が見つからない場合、日本での求職はもっと絶望的だろう。米国で働き続けるのならば、これが最大のリスクといえるかもしれない。


本書は、「はじめに」に筆者がいうように、米国でソフトウェアエンジニアで働くことの美点しか強調されない昨今の風潮に違和感を感じメリットとともにデメリットも知ってほしいという思いで書かれている。一貫して中立した立場で書かれており、非常に読んでて安心できる。どうするべきかなど安易な結論を書いたりせず、また、筆者自身もまだ悩み続けている様子が描写されており、同じく米国で働く身として大きな親近感を抱いた。



米国で働きたいと考える人には必読といえる一冊である。




2015年10月9日金曜日

Define-by-RunとDefine-and-Run

Neural Networkの設計思想を表す用語のようだ。

The "Design-by-Run" scheme is also an important design decision to neuron that has both pros and cons. Most existing neural network library today follows "Design-and-Run" scheme or a declarative approach that first compile a pre-determined network structure and then train against a dataset. In such way, one can pre-allocate any necessary cache space to ensure that there are minimal memory reallocations in training, thus minimize the memory footprint whenever possible and have substantially optimized performance. Meanwhile, such a declarative approach also makes the underlying neural network static during the lifetime of training. The "Design-by-Run" scheme instead treats the neural networks morphologically, i.e. they are composed and (can) deform on-the-fly. At a cost, it will ask for onsite memory allocation whenever needed
簡単に日本語でまとめると

Neural Networkの設計にはDesign-and-RunとDesign-by-Runという二つの設計思想がある。


Design-and-run


  • 今日の一般的なスキーマで宣言的なアプローチに分類される
  • 宣言的なアプローチとは事前に決定されたネットワーク構造を利用し、トレーニングを行うもの。
  • キャッシュスペースが事前に割り当てられるので、メモリの使用を最小化し、性能を最適化することができる。しかしトレーニングの間にネットワーク構造を変更できないという欠点がある。


Design-by-run


  • ニューラルネットワークを形態学的に(morphologically)扱うことができる。
  • ネットワークの構造変更が容易にできるが、メモリの割り当てなどは最適化できない。




https://github.com/bobye/neuron/wiki/Basics#design-rationale


2015年9月18日金曜日

MNISTの解凍済みデータ

ディープラーニングとかで話題のニューラルネットワーク。
このニューラルネットワークの代表的な応用例として、手書き文字の認識というのがあります。

これはその名のとおり、お絵かきツールなどでフリーハンドで書いた数字が、0から9のどれにあたるのかを判定するものです。


ニューラルネットの練習としてこの手書き文字(数字)認識を実装してみようとすると、訓練データが必要となります。この訓練データはまじめに用意しようとすると大変なんですが、幸いなことにMNISTにデータが公開されています。

ただし、このデータはIDX file formatというフォーマットで圧縮されているために、そのままでは利用できません。

その場合は、下記のような方法でデータを利用することができます。

Nodejs

mnistというnodejsのアプリを使うと、json形式の訓練データとテストデータを取得することができます。取得自体にはnodejsが必要ですが、テキスト形式で取得できるので、その後どんな言語にでも利用することができます。jsonで取得できるのはうれしいですが、nodejsの環境が手元にないと使えないところが少々不便。

Python

deeplearning.netにPickle形式のデータが公開されています。pythonでサンプルを書こうと思ってる方はこちらのほうが手っ取り早いでしょう。


しかし、IDXフォーマットとか非常に面倒ですね。データ圧縮率とか優れているのかも知れませんが、普通にzipとかにしてもいまどき大して困らなかった気がするんですが。理論上の性能を追い求めるあまり、利便性を犠牲にしている気がします。



2015年8月12日水曜日

Javaにデバック用のログを追加できるライブラリLogAdderを公開

LogAdderはJavaの各メソッドの先頭にトレース用のログを埋め込むことができるオープンソースソフトウェア。

下記の順にメソッドが実行されるJavaのソースがあったとする。


 
public static void main(String[] args){
   step1()
   step2()
   step3()
}

public static void step1(){

}

public static void step2(){

}

public static void step3(){
}

このソースコードに対してLogAdderを実行すると、下記のようにトレースが追加される


 
public static void main(String[] args){
  System.out.println("I'm at " + new Exception().getStackTrace()[0].toString());
   step1()
   step2()
   step3()
}

public static void step1(){
  System.out.println("I'm at " + new Exception().getStackTrace()[0].toString());
}

public static void step2(){
  System.out.println("I'm at " + new Exception().getStackTrace()[0].toString());
}

public static void step3(){
  System.out.println("I'm at " + new Exception().getStackTrace()[0].toString());
}

そして、このログ追加済みのソースコードを実行すると、下記のような標準出力が出される。

I'm at com.github.kentan.logadder.sample.data.Sample1.main(Sample1.java:6)
I'm at com.github.kentan.logadder.sample.data.Sample1.step1(Sample1.java:14)
I'm at com.github.kentan.logadder.sample.data.Sample1.step2(Sample1.java:19)
I'm at com.github.kentan.logadder.sample.data.Sample1.step3(Sample1.java:24)

これを見ると、ログ(この場合は標準出力)を見ることによって、実行順序がわかる。

私がこれを作ったきっかけは、非常に大規模なプロジェクトで、マルチスレッド、キューイング
メッセージングが多用されたソースコードを解析する必要があったためだ。
そのようなソースコードでは手続き型言語を読むように、ただ呼び出しを追っていくだけで解析を進めることは非常に難しい。同じようなソースを読む必要に遭遇したとき、本ライブラリは大いに役立つとと思う。



2015年7月25日土曜日

react.jsとjquery mobile

reactjsで書いたコンポーネントをjquery mobile風にしたくて試してみた。

まず単純に、react.jsのコードにjquery mobileのコードを書いてみた。
render()メソッドの中に書く。

<body>
<script type="text/jsx">
React.render(
        <ul data-role="listview">
          <li><a href="acura.html">Acura1</a></li>
          <li><a href="audi.html">Audi1</a></li>
          <li><a href="bmw.html">BMW1</a></li>
        </ul>
);
</script>
</body>

すると何も表示されない。

次に、htmlのbodyタグ直下に書いて見る。
<body>
    <div id="content"></div>
        <ul data-role="listview">
         <li><a href="acura.html">Acura</a></li>
         <li><a href="audi.html">Audi</a></li>
         <li><a href="bmw.html">BMW</a></li>
        </ul>
    </div>
<script>省略</script>
</body>
これはきちんと表示される。

react.jsもjquery mobileもタグのattributeを元に、domの操作をしているから、この辺の処理がバッティングしているのかもしれない。

調べてみたところ、jquery mobileが変換するclassを直に指定すれば出来るとの情報がstackoverflowにあった。なるほど。


やってみる。

<body>
<script type="text/jsx">
React.render(
   <ul class="ui-listview" data-role="listview" >
        <li class="ui-first-child"><a href="acura.html">Acura3</a></li>
        <li><a href="audi.html">Audi</a></li>
        <li class="ui-last-child"><a href="bmw.html">BMW</a></li>
   </ul>
);
</script>
</body>

ブラウザで再度確認する。今度は表示された。しかし、jquery mobileのスタイルではなく、ただのul要素として描画されている。つまり、class以下は無視されたようだ。

試しにstackoverflowで例として出されていたbuttonを表示してみる。

<body>
<script type="text/jsx">
React.render(
 <button className="ui-btn"/>
);
</script>
</body>

こちらはきちんとjquery mobile風で表示された。

出来るのと出来ないのがあるようだ。
listviewの場合は、それを含む外のdomもclass指定すれば出来たりするのだろうか。

ただ、いずれにせよいちいちclassを調べなければいけないのはだるすぎる。
あまりこの組み合わせは推奨出来るようなものではなさそうだ。



2015年7月20日月曜日

Koansでreacjs入門


koansはreact.jsを手を動かしながら学ぶコンセプトで作られたプロジェクト。
node.jsのユニットテストを利用し、正しく実装できるとテストが合格する。

ちょうどreact.jsに入門したかったこともありやってみた。
いい感じに入門できる。

javascriptと、ある程度のプログラミングに対する前提知識があればきちんとついていけるようにできている。

githubのreadmeに本の紹介があるけど、プロモーションの一貫なんだろうか。

http://blog.arkency.com/rails-react/

49ドルはちょっと高い気がするが、koanの出来の良さを考えると、お値段分の価値はあるかもしれない。

サンプルがあるので、まずはこれを読んでみるか。





2015年6月14日日曜日

ゲーム理論のナッシュ均衡と最適戦略

用語の整理。
定義上、ナッシュ均衡は全プレイヤーがbest responseを取った状態のことであるが、これを「わかりやすく」説明しようと試みた結果、逆にわかりにくかったり、正確ではない言い方になっていることが多かったので、自分の言葉でまとめなおした。



・ナッシュ均衡

すべてのプレイヤーが最適戦略(best response)である戦略をとっている状態

a ∗ = (a ∗ 1 , · · · , a ∗ n ) ∈ A is a Nash Equilibrium if
   a ∗ i ∈ Bi(a ∗ −i ) for every i ∈ N. 

・Best Response
ほかのプレイヤーの戦略を固定値としたまま、自分の戦略だけを動かして、最大値を取れる戦略。数式で書くと以下の定義。
ai ∈ Ai is a best response to a−i ∈ A−i if
 ui(ai , a−i) ≥ ui(a*i , a−i) for all a*i ∈ Ai

ポイントはbest response(最適戦略)であろうか。bestあるいは最適という言葉に引きづられて、あたかもナッシュ均衡を目指す戦略がもっとも報酬が高い戦略であるという風に説明されていることもおおいように思える。

しかし、囚人のジレンマなどでも有名なようにナッシュ均衡は必ずしも、全プレイヤーに最高の結果をもたらす戦略ではない。あくまでも、自力でがんばれる範囲(=ほかのプレイヤーの戦略値を固定値としたまま) でもっとも報酬が高い(=その環境において最適な)戦略を全プレイヤーがとった状態だ。自分だけでは戦略を変更しても、メリットはないため均衡に陥る。

均衡の定義自体はわかりやすいが、定義したことのメリットがわかりづらいため、いろいろな説明が生まれて、その結果混乱の元になっているのだろうか。

参考文献
http://www.econ.ucla.edu/iobara/Nash201B.pdf