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

2015年5月1日金曜日

Ubuntu on ESXi on VMWare Player on Win7

下記の構成で、ESXiの検証環境を作れたのでメモ

1. まず物理環境
OS:Windows 7
CPU: Xeon e5440

2. 1の上にVMWare Player 7.1.0 (Build 2496824)をインストール

3. 2の上にESXi 6.0.0 (249585)をインストール

4. 3の上にUbuntu 32bitをインストール。

なお、Xeon e5440はEPT(Extended Page Table)機能がないために、4として64ビットOSをインストールすることが出来ない。

参考文献


CPUの機能要件についてはこちらが詳しい
Having Difficulties Enabling Nested ESXi in vSphere 5.1?


VM Player上でESXiの動作が公式にサポートされているのかは見つけられなかったが、vmware.comドメインで運営されている下記でVMWare Playerに言及されているので、公式にサポートされているとみなしても良さそう。

Running Nested VMs

他にも個人運営のブログ等ではESXiをVMWare Player上で動かした際の情報がたくさん見つかる。古いバージョンの話なので、最新のバージョンの動作保証とするには少々微妙だが。

2015年4月16日木曜日

CFR(Counterfactual regret minimization)でdudo

CFR で三目並べに続いてdudoというdiceゲームをCFRで書いてみた。


GitHubのソースコード

dudoのゲームルールはこちらを参照。
三目並べと比較すると、dudoは非完全情報ゲームなので、CFRを適用するにはちょうどいい対象である。


CFRの評価がしたかったので、ゲームの実装は実際のdudoに比べて下記のように簡略化してある。


  • 1の目はワイルドカードとしてカウントしない。
  • プレイヤーの数は二人
  • 各プレイヤーが持つダイスの数は2つ。


200回ほどトレーニングをさせたCFRと、単純に相手のコールにひとつだけ上乗せをする戦略をとるBoarPlayerを戦わせたところ、大体75%ほどの勝率でCFRは勝利を収めた。


MSCFの理解に役立ったリンク


ファイルサーバを例に設定の仕方が細かく載っている。
Failover Cluster Step-by-Step Guide: Configuring a Two-Node File Server Failover Cluster