2011年10月2日日曜日

v8 (Javascript Engine)を触ってみた

今更ってレベルじゃないぜ。

ちょっと思うところあってv8 javascript engine(http://code.google.com/p/v8/)で遊んでみました。公式のドキュメントがだいぶ少ないのですが、いろんな人が2年くらい前に遊んでいたようなので情報は適度に転がっています。

ソースコード


実行結果
[Print] 'echo!!!'
[Print] 'I am DROID'
[Print Test]
とりあえず、関数作ってJavaScript側から呼びだすところまでは完成。C++側でJavaScriptの関数を呼び出すところまでやりたいので、後日もうちょっと調べます。

参考文献

2011年9月26日月曜日

鎌倉の素敵なお店

先日、鎌倉で4軒連続ではしごするという贅沢な体験をしてきたのですが、そこのお店がとてもよかったので、次回自分がいくためのことも考えてまとめです。本当は写真もあると良かったと思ったんですが、ちょっとそういう会ではなかったので、後日改めて行きたいところです。

田楽 (でんがく)
http://r.tabelog.com/kanagawa/A1404/A140402/14001490/
炉端焼きのお店。お店の真ん中に炉端があり、店員の方が焼いて(暖めて?)くれる。炭で焼くので時間もかかるが、その間の香りを楽しみ、そしてできた料理を食べるのはなかなかの贅沢。ちなみに店内は全部で10席と少し。金、土はかなり混雑するらしい。

いさむ
http://isamu.hanamizake.com/
いわゆる居酒屋だが、特筆するべきは自分でお燗をつけられるカウンター席。席にお湯がはってある部分があって、そこに徳利をいれて自分の好みの熱さで飲むことができる。頼んだお酒がぬるすぎになってしまうこともない。店舗はとても新しいが、かなり歴史のあるお店だそう。

ミルクホール
http://www.milkhall.co.jp/
ジャズが流れているとても雰囲気のよいお店。とても奥まったところにあり、道知らないととてもたどり着けない(と思った)ようなところにあるのだが、昼間などは店の外まで列ができているとか。閉店直前にいったので奇跡的に貸切のような状態だったが、短い時間しか滞在出来なかったのが残念。

MIKE's BAR
http://rp.gnavi.co.jp/3115695/
建物内の通路から入らないとならないため、こちらも事前に知らないと辿りつけないと思われる…。二種類しかお酒は飲まなかったが、お酒選びには妥協がないようでとても美味しい洋酒を飲ませてもらった。こちらもまた40年以上の歴史があるお店とのこと。ローストビーフがすばらしい逸品でした。

2011年9月8日木曜日

rotating tcpdump

tcpdumpでネットワークのダンプを取り続ける際、任意のタイミングでダンプを保存するファイルを切り替えるシェルスクリプトです。なんか5回ぐらい同じシェルスクリプト書いて、さすがに飽きてきたので、そこそこ使いまわせるように書いたものをgistにおいておきました。

冒頭部分のNIC, FILTERを編集すればあとは深く考えずに使えるはずです。まあ、一瞬で読めるので、解説も何も無いですけど。。

2011.9.9追記
最近のtcpdumpにもrotate機能があると某氏からのご指摘。

tcpdump version 4.1.1のmanより。
-C     Before  writing  a  raw  packet to a savefile, check whether the file is currently larger
       than file_size and, if so, close the current savefile and  open  a  new  one.   Savefiles
       after  the  first  savefile  will have the name specified with the -w flag, with a number
       after it, starting at 1 and continuing upward.  The units of file_size  are  millions  of
       bytes (1,000,000 bytes, not 1,048,576 bytes).

-G     If  specified,  rotates  the  dump file specified with the -w option every rotate_seconds
       seconds.  Savefiles will have the name specified by -w which should include a time format
       as  defined by strftime(3).  If no time format is specified, each new file will overwrite
       the previous.

-Cオプションがファイルサイズベースのrotate、-Gオプションが時間ベースのrotateとのことです。-Gオプションはちゃんとファイル名に時間までいれてくれるらしいが、time formatは自分でstrftime書式で指定しないとダメらしいですね。たとえば

tcpdump -w /tmp/timed_dumps.%s -G 10

のように書くと

% ls /tmp/
timed_dumps.1315521248
timed_dumps.1315521259
timed_dumps.1315521270

というようにファイルが生成されていくようです。任意のタイミングではrotateできないけど、とても便利そうです。

2011年9月4日日曜日

dpkt&pcapyでパケット解析 in Python

Impacketでパケット解析をしていたのですが、対応しているプロトコルがあまり充実していなかったので、dpktに鞍替え。

dpkt (http://code.google.com/p/dpkt/)
最終更新は今年の1月でとまっているものの、すでにかなりのプロトコルに対応してくれているのでかなり有用です。

NetBIOS名やmDNSを拾ってくるコードは以下のような感じ。

2011年8月20日土曜日

[Python] arrayからbufferに変換してsqlite3のBLOBにつっこむ。

Python + SQLite3でBLOBに値を入れるとき、"ValueError: could not convert BLOB to buffer" というエラーに悩まされていたんですが、一度 .tostring でほどいてあげないといけなかった模様。

参考:http://stackoverflow.com/questions/3983587/python-2-7-sqlite3-valueerror-could-not-convert-blob-to-buffer

こんな感じでうまくいきました。

2011年5月22日日曜日

C/C++プログラマのためのJava入門覚書(2/2)

続き


■Object

Java上で使うクラスは自作だろうとなんだろうと、すべて「Object」というクラスを暗黙のうちに継承している。いくつかの処理ではこのObjectクラスのメソッドが勝手に呼び出されており、僕らはその恩恵をうけている。お世話になっている(なる)のはだいたいこのあたり。

  • clone(): オブジェクトのコピーを作成する。ただし、Cloneableインターフェースを実装していないと(継承していないと)例外が飛ばされる
  • - toString (): オブジェクトの文字列表現を生成してString型で返す。Override可能。System.out.printlnに文字以外を突っ込んだ時に、よしなに表示してくれるのはこいつのおかげ。
  • - hashCode (): オブジェクトのハッシュコードを返す。ハッシュテーブルとかのデータ構造にオブジェクトをぶち込むとき、キーを作成してくれる。Overrideできるが非推奨。
  • - equals(): 同じオブジェクトであるかどうかを検査する。Overrideできるが、同値関係(反射性、対称性、推移性、整合性)をすべて満たす必要があり、意外と厄介。また、hashCodeが「等価なオブジェクトは同じハッシュコードを返す」という性質との整合性もとらないといけないので、基本非推奨。


■クラス変数の比較

クラス変数XとYがあった場合、JavaにおいてX == Yは参照先の比較(すなわちポインタの比較)をしているに過ぎない。各オブジェクト同士が等しいかどうかを検証するために、equals()というメソッドが全てのクラスの親であるObjectクラスに用意されており、こいつが適宜Overrideされている。ただし、OverrideをするときにはhashCode()メソッドとの整合性をとったり、同値関係が成り立つことを確認したりと結構面倒なので注意。したがって、クラス変数の比較に == を使うことは、ほとんどない(んじゃないかな)。ちなみにJavaは演算子のoverrideは許されていない。


一方、Stringにはちょっとした罠が用意されている。
String a = new String ("hoge");
String b = new String ("hoge");
とやって、(a == b)とすると、falseになる。これは参照しているオブジェクトが違うから当然だ。ところがどっこい
String a = "hoge";
String b = "hoge";
とやって、(a == b)とすると、trueと評価される。なぜか。


これは、"hoge"という同じ文字列定数がコードに出現した場合、javacが同じオブジェクトとして勝手に最適化するため、このようなややこしいことが起きる。ちなみにコードが最適化されると、
String tmp = new String ("hoge")
String a = tmp;
String b = tmp;
のように置換されているそうだ。さらに、
a += "mage";
などと、文字列を変更しようとした瞬間に、さらに別のオブジェクトに置き換えられているらしい。実にややこしい。


[参考] http://education.yachinco.net/tips/java/06/1.html

■配列の記述

配列の括弧はどちらでもOK
int [] a;
int a[];
は等価らしい。

[参考] http://msugai.fc2web.com/java/array2.html


ちなみに、Javaは new Hoge[10]; とやっても、nullの入った配列が生成されるだけで
各要素(中身)は個別に生成する必要がある。


■数値型あれこれ

  • 値あふれが起きると、C言語などと同様に値がひっくり返る(例:最大値 → 最小値)
  • 各プリミティブ型に対応するラップクラス (int v.s. Integer, long v.s. Longなどなど)がデフォルトで用意されている。文字列からの変換や最大値、最小値の定数提供などをしてくれるが、一文字間違えただけで大惨事になる可能性もある。
  • 精度が低い型から高い型への代入は可能。逆はコンパイルエラー。
int a = 1;
short b = 2;
a = b; // OK
b = a; // Compile error

C/C++プログラマのためのJava入門覚書(1/2)

会社の研修でJava研修があったのですが、正直これまでC/C++/LLだけで生活してきて、「えー、Javaかよ」みたいな偏見を持っていた人間なので、研修1週間ぐらえ前にコソコソJavaを勉強してました。文法は概ねC++と変わらないんですが、当然ながら流儀や細かい部分はだいぶ違うので、覚書をメモっておきます。


■変数

Javaの変数はプリミティブ型(基本型)、クラス型(オブジェクト型、参照型)の2つに分類できる。プリミティブ型はboolean, char, byte, short, int, long, float, doubleのように、Javaがあらかじめ用意している数値用の変数。これらは=(イコール)や関数での引数指定では、常に値渡しになる。一方、クラス型は常に参照渡しになる。

[参考] http://www.makino-style.org/education/jed03.html


■クラス内の初期化の順番

クラス内での初期化に関連する要素は以下のとおり。

  • コンストラクタ(Class名と同じ返り値無しのメソッド)
  • インスタンスイニシャライザ(クラス内かつメソッド外にある {} で囲まれているブロック)
  • スタティックイニシャライザ(クラス内かつメソッド外にあるstatic {} となっているブロック)
  • スタティック変数(static宣言つき変数)
  • インスタンス変数(staticなし変数)

具体的な順序としては

  1. [プログラム起動]
  2. スタティックイニシャライザとスタティックなクラス変数 (newで領域確保されてるやつ)が書いてあるとおりに上から実行&初期化されていく。これは1度きり。
  3. [途中でインスタンスが生成される]
  4. インスタンスイニシャライザとインスタンス変数が、これまた上から順番に実行&初期化されていく
  5. 最後に自身のコンストラクタが実行される

[参考] http://d.hatena.ne.jp/Yoshiori/20090116/1232093347


■デストラクタは使わない

Javaのクラス変数はすべて参照型になっているので、あるインスタンスがどの変数からも参照されなくなった時点で破棄される。と、言いたいところだが、実際はGCのキューに入るだけなので、いつ本当にメモリが開放されるか(デストラクタが呼び出されるか)は分からない。そして、多くの場合、それはかなり時間がかかるらしい。

■文字列

Javaにおける基本的な文字(列)型はchar型とstring型。おおよそ想像がつくとおり、charは一文字だけ、Stringは文字列を扱う。Javaにおいても「文字」の表現は 'X' (シングルクオーテーション)、「文字列」の表現は "XXX" (ダブルクオーテーション)になる。ただし、この場合の文字は1バイトである必要はなく、マルチバイト文字も '欝' で文字型となる。よって、ひらがなや漢字でswitch文を記述することも可能。

stringからcharを取り出す時には atChar (int index) メソッドを使う。

■継承

Javaの継承には通常のクラス継承とinterfaceを使う方法の2種類がある。


  • - クラス継承
    • 多重継承はできない。子供は1つの親しかもつことはできない。ただし繰り返しの継承は可能。
    • 変数も継承できるし、子クラスで同じ名前の変数を宣言することができる (thisとsuperで区別する)
    • C++などでお馴染みのクラス継承なので共通のメソッドを作れるし、必要箇所だけoverrideもできる。
  • - interface
    • 多重継承ができる。
    • メソッドは全てabstract(C++の純粋仮想関数)として扱われる。
    • 変数は宣言できるが、static + final扱い(つまり定数)になる
    • クラス、インターフェースも宣言できるが、static扱いになる。


聞くところによると、interfaceは通常の継承として使うというよりは、コールバック用のメソッドを定義するためのフレームワークとして使うのがよい使い方らしい。ただし、使う人の宗教によって違うかも知れないので注意。


長いんで続きます。→ (2/2)
勉強したてで若干怪しい部分もあるので、ご指摘など大歓迎です。

2011年3月11日金曜日

ffmpegオプション

Codecを変更せず、コンテナだけflvからmp4に変換する。
iTunesに登録するときに必要。

ffmpeg -sameq -vcodec copy -acodec copy -i A.flv B.mp4

2011年2月27日日曜日

GnuPGの使い方

毎回絶対に忘れるので最低限のメモ。

1. 鍵を作る
% gpg --gen-key

2. 公開鍵(アスキー)を出力
% gpg --export -a <鍵の指定>

鍵の指定は鍵作成時に指定したメールアドレス。

3. 暗号化
% gpg -a -r <鍵の指定> -e clearsign.txt

4. 復号化
% gpg -d encrypt.asc

参考:http://www.nina.jp/server/windows/gpg/commands.html

2011年2月15日火曜日

Stuxnet source code reading

Laurelai / decompile-dump
https://github.com/Laurelai/decompile-dump
嘘か真か、Stuxnetのソースコードらしいです。

Partial stuxnet source decompiled with boomerang, if anyone has better decompile tools feel free to contribute better versions

2011年2月14日 15:30(PST)現在で中身はこんな感じです。

./016169EBEBF1CEC2AAD6C7F0D0EE9026/016169EBEBF1CEC2AAD6C7F0D0EE9026.c
./055A3421813CAF77E1387FF77B2E2E28/055A3421813CAF77E1387FF77B2E2E28.c
./1E17D81979271CFA44D471430FE123A5/1E17D81979271CFA44D471430FE123A5.c
./30DF51C9F0D9B010350DC09ABE1E4E97/30DF51C9F0D9B010350DC09ABE1E4E97.c
./335707EABBE7FF256E0650432ACCEC9B/335707EABBE7FF256E0650432ACCEC9B.c
./37FC7C5D89F1E5A96F54318DF1A2B905/37FC7C5D89F1E5A96F54318DF1A2B905.c
./4589EF6876E9C8C05DCF4DB00A54887B/4589EF6876E9C8C05DCF4DB00A54887B.c
./74DDC49A7C121A61B8D06C03F92D0C13/74DDC49A7C121A61B8D06C03F92D0C13.c
./789F6F8DE3F140CF5D73BEF0B8ABAF78/789F6F8DE3F140CF5D73BEF0B8ABAF78.c
./7A4E2D2638A454442EFB95F23DF391A1/7A4E2D2638A454442EFB95F23DF391A1.c
./98FBEBD8883021FBE6464C37ACF17938/98FBEBD8883021FBE6464C37ACF17938.c
./a/a.c
./A3844A1B6BEA3F6FAF9C276858F40960/A3844A1B6BEA3F6FAF9C276858F40960.c
./C1CB4117D9998C79AE10C1B890C23A4D/C1CB4117D9998C79AE10C1B890C23A4D.c
./CA9EABEAB482524E5797C684398335D5/CA9EABEAB482524E5797C684398335D5.c
./CC1DB5360109DE3B857654297D262CA1/CC1DB5360109DE3B857654297D262CA1.c
./F8153747BAE8B4AE48837EE17172151E/F8153747BAE8B4AE48837EE17172151E.c
./F979C6A3E668C5073C4C6506461B034E/F979C6A3E668C5073C4C6506461B034E.c
./F9BAE53E77B31841235F698955AECE30/F9BAE53E77B31841235F698955AECE30.c
./log

ざっと見た感じ、mainあるいはWinMain関数は見当たりませんでした。代わりに789F6F8DE3F140CF5D73BEF0B8ABAF78.c と 7A4E2D2638A454442EFB95F23DF391A1.c の2つのファイルにDllMain関数があります。

7A4E2D2638A454442EFB95F23DF391A1.c

BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  int v3; // eax@2

  HMODULE v4; // eax@2


  sub_1000F9F2();
  if ( fdwReason == 1 )
  {
    loc_1000F9F7();
    v3 = sub_10010BBF((int)&unk_10042088);
    v4 = LoadLibraryA((LPCSTR)v3);
    sub_1000BDF5(v4);
    sub_1000F3E8();
  }
  return 1;
}

ここで呼び出している、sub_10010BBFが暗号化された構造体をほどく関数っぽい。v3に入った文字列らしきものをもとに、LoadLibraryAで外ぶらりブラリを読み込み。で、そのあと読み込んだライブラリの構造体のアドレスをdword_100420F4というグローバルな配列に突っ込んでる。

int __stdcall sub_1000BE50(int a1)
{
  return dword_100420F4[2 * a1];
}

こいつが、N番目に読み込んだライブラリの構造体を返す関数かな。



こっからはひねってあるデータの復号コード。

int __cdecl sub_10010BBF(int a1)
{
  int result; // eax@2

  if ( *(_BYTE *)(a1 + 8) )
  {
    sub_10010B9B(a1 + 11, *(_WORD *)(a1 + 9));
    *(_BYTE *)(a1 + 8) = 0;
    result = a1 + 11;
  }
  else
  {
    result = a1 + 11;
  }
  return result;
}

a1 + 8, a1 + 9, a1 + 11という3要素から、

struct {
  int a; // 0-3
  int b; // 4-7
  char c; // 8
  short d; // 9-10 : 文字数
  char e[N]; // 11- 暗号化された文字列
} 

という感じですかね。さらに追いかけると


void __cdecl sub_10010B9B(int a1, unsigned int a2)
{
  int v2; // edi@1

  v2 = 0;
  if ( a2 )
  {
    do
    {
      *(_BYTE *)(v2 + a1) -= sub_10010B6D(v2);
      ++v2;
    }
    while ( v2 < a2 );
  }
}
変換している。何文字目かによって変換規則が違う模様。
unsigned int __cdecl sub_10010B6D(int a1)
{
  int v2; // eax@1


  v2 = (a1 + 11) * (a1 + 17);
  return (a1 + 11) * (a1 + 17) ^ (((a1 + 11) * (a1 + 17) & 0xFFFFFF00 ^ ((((unsigned int)((a1 + 11) * (a1 + 17)) >> 8) ^ v2 & 0xFF0000) >> 8)) >> 8);
}

こいつが実質的なメインの関数ぽい。
char __cdecl sub_1000F3E8()
{
  char result; // al@1

  result = sub_1000F42C();
  if ( result )
  {
    result = sub_1000F405();
    if ( result )
    {
      sub_1000C37C();
      // ここでスレッドを作っている
      result = (unsigned int)sub_1000FB06(0, dwStackSize, (LPTHREAD_START_ROUTINE)StartAddress, 0, 0, 0);
    }
  }
  return result;
}

突っ込み始めるときりがない and リンクが切れているぽいところもあるので、とりあえずここまで。なんとなくの想像では、DLL読み込ませて常駐スレッドを生成するためのDLL?

2011年2月9日水曜日

Nexus S + Android2.3 Review

2週間ほど使ってみた感想を。

■外郭デザイン

あちこちで散々な言われようだったが、個人的には悪くないと思います。総重量で言えばiPhone4より軽いし、持ちやすさなどもとくに問題になるようではありません。背面の曲がっている部分は人によって好き嫌いありそうですが。

■カスタマイズ

Androidは中身も(元は)Linuxですが、立ち位置もまさにLinuxでした。オープンを売りにしているGoogleが作っただけあって、壁紙やアイコンなどはおろか、ホームアプリ、はてにはROM(≒Kernelと理解してる)まで変えられるというのにはおどろきです。まあ、ROMは変えるとサポート切れちゃうみたいですが。何はともあれこの「なんでもできます!」感がある反面、何かしないと何も出来ない感が、一昔前のLinux(あるいは他のUnix系OS)によく似ていました。X windowいれてファイルマネージャもウィンドウマネージャもランチャもマネージメントソフトも好きなもの選んでください!と言われても、多分普通の人だとどうやっていいのか良く解らん、みたいな感じになると思います。また、Android Marketもいろいろなソフトウェアが大量にある反面、クオリティの上下幅がAppleのApp Storeに比べると圧倒的に広い印象です。さらに言うならば、広範囲な機能が提供されるということは、バグなどに遭遇する機会も多くなるわけで、そういったことへの対処ができるかどうかも、ひとつの分かれ目になるかと思います。こういうカスタマイズをガリガリやるのが好きな人はいいと思いますが、ライトユーザが一定レベルまで使いこなすのはまだ難しそうです。

■性能

これはAndroidによるところなのか、Nexus Sのスペックによるものなのか分かりませんが、時々どころかそこそこの頻度で応答が激重になります。これは僕がiPhone4になれてしまったせいかもしれませんが、Android製品の中ではかなり性能が高いと言われるNexus Sでさえこのありさまだと、他の端末は一体どうなっているんだ…。部分的な最大瞬間風速はiPhone4よりレスポンスがいいと感じる時もありますが、一度詰まると固まったり数秒レスポンスがないこともままあります。以前、iPhone 3Gを使っていた印象から言うと、iPhon4 >>>> Nexus S >> iPhone 3G という感じでしょうか。タスクマネージャを使いこなしていないというのもあるかもしれないのですが、メモリが詰まってくるとちょっと重くなったかな?ぐらいのiPhone4に比べてあからさまに重くなる様は、やはり超えられない壁を感じてしまいます。

■安定性

iOSも安定性が悪いと言われてきましたが、おそらくそれよりもさらに不安定というのが印象です。これは使っているアプリに依存するかもしれませんが、ホームアプリのADWLauncherがクラッシュするランキングの上位で、他のネットワークを使うアプリもネットワークが不安定だと、なぜかそれに引きずられて落ちます。解せぬ。そこそこ使っている日は、1日に数回再起動することもあるので、これはちょっと今後に期待でしょうか。

■結論

いろいろと細部が造りこまれているのもわかるし、オモチャとしては非常に質が高いと思うのですが、やはりまだ技術者のオモチャという域を抜けていないのではないか、という印象を受けました。個人的にはとても面白いんですけど、まだライトユーザ層には敷居が高いかと。少なくとも親がNexus SとiPhone4のどちらかを使いたいといったら、間違いなくiPhone4一択で推します。