つれづれ日記 2014年9月

予定

毎日


2014年9月24日 (水曜日)

09:40:41 # Life nodejs をつかってGCMメッセージを送ってみた。 JSONをHTTPS POSTで送信することができればGCMメッセージは送信できるよといわれて、 pythonで書くのめんどくさいなぁと思ったのでなんとなくnodejsで書いてみた。 僕はemacsからしか使わないので本当はnodejsに依存するんじゃなくて elisp からできるのが良い気がするけど、HTTPS POSTができるためには必要なものが多くて結局CURL使ってる気がする。 nodejs イベントドリブンとかよりもjsonがネイティブな感じで使えるのが便利な気がする。

var https = require('https');

message = {
    // Registration IDs come from application after registration.
    registration_ids: [
	// From XXX
	'xxxxx',
    ],
    data: {
	// This is the actual message
	message: 'hello world'
    }
}

var options = {
    hostname: 'android.googleapis.com',
    port: 443,
    path: '/gcm/send',
    method: 'POST',
    headers: {
	// Secret from dashboard.
	'Authorization': 'key=xxx',
	'Content-Type': 'application/json'}
};

req = https.request(options, function(res) {
  console.log("Got response: " + res.statusCode);

  res.on('data', function(d) {
    process.stdout.write(d);
  });

}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

req.write(JSON.stringify(message));
req.end();
	

2014年9月19日 (金曜日)

07:21:09 # Life やろうと思っていた時計ノーティフィケーションが動いた。 Android GCMのサンプルアプリがGCMを受信して何十秒かスリープしてからノーティフィケーションを出すという内容だったので それを若干修正してAndroid携帯に通知(Notification)を出すようにするだけだった。携帯に通知が出れば時計にも通知が出て、震えるように指定したら震えるようになった。 EmacsでM-x compile するときに完了した時に動く compilation-finish-functions というのがあって、それにフックを追加して GCMに通知がいくようにした。 Elispで書いても良かったのだけどJSONを作成してGCMサーバーに HTTPS POST リクエストを投げるところはnodejsで近代的に書いてみ た。 これでEmacsでコンパイルが完了したらGCM経由で時計に通知がいく。 満足。 通勤電車の中でやろうとしたらなんかAndroid Studioの設定とGradleの依存関係のダウンロードで2日くらいかかった気がする。それが終わったらコンパイルエラーとしばし戦うだけ。 一番意味不明なエラーだったのはbuild.gradleの依存関係(dependencies)に 'com.android.support:appcompat-v7:+'という記述があるのだが それだとLプレビューのSDKが出てきてそれだとターゲットバージョンをLにしないとエラーになる。 19はLより大きくないみたいな変なエラーがでて困惑した。数字じゃないのに比較するってどういうことだ。 'com.android.support:appcompat-v7:20+'に変えてみたら通った。

dependencies {
    compile 'com.android.support:appcompat-v7:20+'
    compile "com.google.android.gms:play-services:4.0.+"
}
	

2014年9月17日 (水曜日)

17:43:20 # Life Android Studioを久しぶりに起動してみた。 android コマンドを移動してSDKとかのアップデート。まず自分自身をアップデートしてから起動しなおしてアップデート。なんか古いバージョンだといまいち正しく動かないことが多い。 サンプルコードをダウンロードしてきてAndroid Studioでインポート。インポートするときにGradleがうごくっぽいんだけど 初回にGradleが動くときに大量に http://repo1.maven.org/maven2/... からダウンロードが始まる。どうもGradleのモジュールらしい。 高速なネットワークがないと厳しい。 あとGradleのAndroidプラグインのバージョンがかわって非互換になりましたとかいてあるんだけどイマイチどうなっているのかわからず。 このGrandleファイル自動生成されたんだけど。

2014年9月16日 (火曜日)

09:50:22 # Life clang integrated as。 clang 3.4 ARM integrated-as では.long function_name(GOT)というアセンブリを出力はするがインラインアセンブラの入力としては受け付けてくれない。 clang 3.5では受け付けてくれる。 さて、clang 3.4ではどういう表記がとおるのだろう。 R_ARM_GOT32 のデータになってくれたらいいんだけど。

21:19:37 # Life 久しぶりに手元で使う用のAndroidアプリ書いてみる。 Google Play Servicesのライブラリ設定を見てみたんだけど、なんか 本当に毎回これやるのかと疑問なステップ数。本当にこれであってるんだろうか?

2014年9月15日 (月曜日)

20:38:07 # Life ARM の Unified Assembler Language. clangでarm版Chromeのコンパイルするときにインラインアセンブ ラのコンパイルが通らないという話題があった。 gcc と clang では使えるインラインアセンブラの文法が若干違って、 しかもgcc側のドキュメントは比較的親切なんだけど clang 側には 何が使えるのかドキュメントが存在していない気がする。clang 3.1くらいまではgas 経由でコンパイルするモードというのがデフォ ルトだったと思うんだけど、3.2 からインラインアッセンブリをビッ トコードにとりあえず変換してそれ経由で使えるようにしてくれる (?)という--integrated-asモードというのがデフォルトになったっ ぽい。 ARMの命令は32bit即値を扱えないのにPC相対の定数プールに突っ込 んであたかも即値が扱えるかのようにするLDRメタ命令などの癖のあ る命令もあって、それらがclang の integrated-asで使えないなぁ というところで今日は困っていたんだけど。 過去の経緯によりいろいろな文法がたくさん追加されており、複雑怪奇になりすぎているので 最近ARMが作ったUAL という規格があって、GASとLLVMとその他のアセンブラの文法を そこに統一しようとしているらしい。 RVCT2.1 以降でのアセンブリ一覧のドキュメントが変更のドキュメントっぽい。

2014年9月13日 (土曜日)

18:14:28 # Life ARM のPC相対. ARMは32ビット固定長命令セットのRISCプロセッサで,(Thumb命令モードのときは16ビット固定長命令セット,Thumb2命令モードのときは16ビットと32ビット混合・・・) 3段のパイプラインであることが仕様に埋め込まれているもの,らしい. 一般論として32ビット固定長命令セットであるアーキテクチャのマシン語命令だと命令の種類を記述するのに何ビットかは必要なので メモリ空間の大きさ(32ビット)の即値が残りのビット数では記述できない。で、何らかの方法が必要で、よく使われる技はプログラム・カウンタ相対。 ARMのアセンブリではadd命令では pc レジスタ相対での指定ができる。 add r2,pc,r2 とかってやるとpc(r15)+r2をr2に代入する。 ldr r2,[pc,#180]だとPC相対で180バイトあとのアドレスからの4バイトをR2に代入。 ここで癖があるのがPCがARMだと現在の命令の8バイト先に進んでしまっていること、多分パイプラインでレジスタの値を読む段が命令フェッチから三段目だった時の名残(今でもそうなのかは不明)なのかな。 Thumbモードだと4バイトずれる。それ以外のモードだとどうなのか。


	ldr r4, [pc, #180]
	add	r4, pc, r4

	..
	..

	ldr r2, .Ldata
.LPIC1:
	add r2, pc, r2

	..
	..
.LDATA:
	.word	_GLOBAL_OFFSET_TABLE_-(.LPIC1+8)	  
	

2014年9月9日 (火曜日)

15:39:45 # Life シグナルハンドラのスタックサイズ. どれくらい使うのかなと思って調べてみたけど意外と使う. 1kB以上SPが移動している.何に消費しているのやら. 調べてみるとucontext_tをスタック上におくのに利用していて,ucontext_tのサイズはどれくらいかなと思ったらcpuidをみないとわからないらしい. xmm + padding である昔のプロセッサだと348バイトなんだけど64ビットだとそもそも936バイトあるし,YMMHがあれば更に大きくなる.AVX2ってレジスタ更に増えて zmm というのもあったような. どうやらレジスタ情報だけで数キロバイトあるものらしい.気づいたら L1キャッシュと比べてもレジスタがでかくなってきているような.

2014年9月3日 (水曜日)

09:57:12 # Life qtest. 2年前くらいからqemuのテストフレームワークとしてCでテストがかけるテストの仕組みが導入されたっぽい. とおもってどういうテストがあるのかなとおもって眺めているんだけど,いろんなテストがある. tests ディレクトリ自体はFabriceが作ったディレクトリで12年前くらいからある. tests/直下に libqtest.c がおいてある. QAPIを使うやつもあるしglib のg_test_init/g_test_add_funcをつかっているやつもあるし いろいろとカオス. tests/qemu-iotests 以下には数字で連番のシェルスクリプトがおいてあってそれがテストになってたり. これらを全部実行している CI は存在するんだろうか. .travis.ymlファイルがそれっぽい記述でメンテされているように見えるのでどっかに存在するんだろうか.

17:03:51 # Life qemu の static ビルドがうまくいかない. libssh2 のリンクには gcrypt のリンクが必要で, gcrypt は libgpg-error に依存しているけど出力されない.これがまずいのかな.

$ pkg-config libssh2 --libs --static
-lssh2 -lgcrypt 
	

2014年9月2日 (火曜日)

07:36:16 # Life jsdoc 使ってみた. javascriptのコメントにJavaDocっぽくコメントを書くとClosure CompilerがコンパイルたりLintしたりしてくれるのは知ってたんだけどそもそもドキュメントの形式なんだからなんかできないかなと思って調べた. Debianにはjsdoc-toolkitというパッケージがあって,そのなかにjsdocコマンドが入っている. 読み込むJSファイルを指定して,生成先のディレクトリを指定すればよいみたい. とりあえずカレントディレクトリにあるjsファイルからHTML形式のドキュメントを生成するには:

$ jsdoc -d=doc *.js
	

2014年9月1日 (月曜日)

07:13:46 # Life 先月はqemuのコードをしばらく眺めてました.結局まだよくわかってない.


Junichi Uekawa

$Id: 201409.html.ja,v 1.15 2014/10/01 01:24:43 dancer Exp $