Sunday, April 26, 2009

Monday, April 20, 2009

opaque typeの表示

今朝は hariさん、jinmeiさんとWunderlich County ParkにHikingへいきました。7:15amにFirst Lutheran Churchに集合してそこから車で Wunderlich County Parkへ。雑談しつつてくてく1時間半ほど山歩き。
Menlo Parkに戻ってCafe Borroneで ブランチを食べました。そこで「opaque typeをdebuggerで見たい時ってどうするのがいいんですかね?」という話がでたので、ちょっと試してみました。
libraryなどで、内部では具体的な型が定義されているけど、使う側にはgenericなpointer(void *)としてしか見せていない場合です。例えばこんなかんじ。
# library側
% cat a.h
void* create_foo();
void set_foo(void* p, int i);
% cat liba.c
#include <stdlib.h>
#include <string.h>
#include "a.h"

struct foo {
  int i;
};

void* create_foo()
{
   void *p = malloc(sizeof(struct foo));
   memset(p, 0, sizeof(struct foo));
   return p;
}
void set_foo(void* p, int i)
{
   struct foo* fp = (struct foo*)p;
   fp->i = i;
}
% gcc -fPIC -o liba.o -c liba.c
% gcc -shared -o liba.so liba.o -lc
# libraryを使う側
% cat b.c
#include <stdlib.h>
#include "a.h"

int main(int argc, char *argv[])
{
  void* p = craete_foo();
  set_foo(p, argc);
  exit(0);
}
% gcc -g -o b.o -c b.c
% gcc -g -o b b.o -L. -la
% LD_LIBRARY_PATH=. gdb b
...
(gdb) break main
Breakpoint 1 at 0x400657: file b.c, line 6.
(gdb) run
Starting program: /tmp/g/b 

Breakpoint 1, main (argc=1, argv=0x7fffb44a6e08 "?\213J??\177") at b.c:6
6   void *p = create_foo();
(gdb) n
7         set_foo(p, argc);
(gdb) print p
$1 = (void *) 0x601010
(gdb) whatis p
type = void *
(gdb) whatis *p
type = void
(gdb) ptype p
type = void *
(gdb) ptype *p
type = void
(gdb) print *(struct foo*)p
No struct type named foo.
(gdb)
というかんじで p の中身をみることができません。defaultではset opaque-type-resolution onですが、liba.soのデバッグ情報がないのでどうしようもないのです。
単純な場合なら examine でダンプしちゃうのが簡単ですね。
(gdb) x/dw p
0x601010  0
(/dwでword(w)を10進(d)で表示)
もしliba.soのデバッグ情報つきが手にはいれば次のようにロードしてやればよいでしょう。
# デバッグ情報つき
% gcc -fPIC -g -o liba.g.o -c liba.c
% gcc -shared -g -o liba.g.so liba.g.o -lc
...
(gdb) info share
From                To                  Syms Read   Shared Object Library
0x00007f3ba9cd3a60  0x00007f3ba9ce9d44  Yes         /lib64/ld-linux-x86-64.so.2
0x00007f3ba9ad2520  0x00007f3ba9ad2648  Yes         ./liba.so
0x00007f3ba978de30  0x00007f3ba987ee88  Yes         /lib/libc.so.6
(gdb) add-symbol-file liba.g.so 0x00007f3ba9ad2520
add symbol table from file "liba.g.so" at
 .text_addr = 0x7f3ba9ad2520
(y or n) y
Reading symbols from /tmp/g/liba.g.so...done.
(gdb) print *(struct foo*)p
$2 = {i = 0}
(gdb) s
set_foo (p=0x601010, i=1) at a.c:18
18  struct foo *fp = (struct foo *)p;
(gdb) s
19  fp->i = i;
(gdb) s
20 }
(gdb) s
main (argc=1, argv=0x7fffb1ef1858 "?\033??\177") at b.c:8
8   exit(0);
(gdb) print *p
Attempt to dereference a generic pointer.
(gdb) print *(struct foo*)p
$4 = {i = 1}
このように p のさしている先を struct foo として解釈できるようになります。またstep実行もできますね。
デバッグ情報つきライブラリがつくれない/入手できない、でもopaque typeの中をみたいという場合は、型情報を含むオブジェクトをつくってロードしてみるとよいかと
% cat atype.c
struct foo {
  int i;
};
struct foo *fooptr;
% gcc -fPIC -g -o atype.o -c atype.c
% gcc -shared -g -o atype.so atype.o -lc
% LD_LIBRARY_PATH=. gdb b
...
(gdb) break main
Breakpoint 1 at 0x400657: file b.c, line 6.
(gdb) run
Starting program: /tmp/g/b 

Breakpoint 1, main (argc=1, argv=0x7fff8bd03668 "?;?\213?\177") at b.c:6
6   void *p = create_foo();
(gdb) n
7   set_foo(p, argc);
(gdb) info share
From                To                  Syms Read   Shared Object Library
0x00007fde83ae5a60  0x00007fde83afbd44  Yes         /lib64/ld-linux-x86-64.so.2
0x00007fde838e4520  0x00007fde838e4648  Yes         ./liba.so
0x00007fde8359fe30  0x00007fde83690e88  Yes         /lib/libc.so.6
(gdb) add-symbol-file atype.so 0x00007fde838e4520
add symbol table from file "atype.so" at
 .text_addr = 0x7fde838e4520
(y or n) y
Reading symbols from /tmp/g/atype.so...done.
(gdb) print *(struct foo*)p
$1 = {i = 0}
(gdb) s
8   exit(0);
(gdb) print *(struct foo*)p
$2 = {i = 1}
(gdb)
この場合はstep実行はできせんがstruct fooとして見ることはできるようになりました。
static linkされている場合だとどうでしょう。
# static library
% ar ruv liba.a liba.o
ar: creating liba.a
a - liba.o
% gcc -g -o b.static b.o liba.a
% gdb b.static
...
(gdb) break main
Breakpoint 1 at 0x400547: file b.c, line 6.
(gdb) run
Starting program: /tmp/g/b.static

Breakpoint 1, main (argc=1, argv=0x7fffedb324a8 "?+???\177") at b.c:6
6   void *p = create_foo();
(gdb) n
7   set_foo(p, argc);
(gdb) print p
$1 = (void *) 0x601010
(gdb) whatis p
type = void *
(gdb) whatis *p
type = void
(gdb) ptype p
type = void *
(gdb) ptype *p
type = void
(gdb) print *(struct foo*)p
No struct type named foo.
(gdb) info share
From                To                  Syms Read   Shared Object Library
0x00007f49e5914a60  0x00007f49e592ad44  Yes         /lib64/ld-linux-x86-64.so.2
0x00007f49e55cfe30  0x00007f49e56c0e88  Yes         /lib/libc.so.6
(gdb) add-symbol-file atype.so 0x800000000000
add symbol table from file "atype.so" at
 .text_addr = 0x800000000000
(y or n) y
Reading symbols from /tmp/g/atype.so...done.
(gdb) print *(struct foo*)p
$2 = {i = 0}
(gdb) n
8   exit(0);
(gdb) print *(struct foo*)p
$3 = {i = 1}

というかんじで適当なアドレスにadd-symbol-fileで型情報付きオブジェクトをロードしてやればよさそうです。

Sunday, April 19, 2009

Little Sheep Hot Pot

4/13からまたMountain Viewに来ています。
今晩は hariさん、jinmeiさんと一緒に Little Sheep Hot Potで食事をしました。なんか6人以上でないと予約できないらしく、混んでいて30分ほど(?)待ちました。モンゴリアン火鍋とかで、スパイスのきいたスープで羊肉などをしゃぶしゃぶ風に食べるかんじです。スープベースを人数分たのんで、いれる具をいくつか頼む形式でした。スープがけっこうおいしかったです。大勢でいくと予約もできるし、いろいろな具をためせるのでよさそうです。
San Mateoは混んでいて駐車場所をみつけるのが大変でした。San Mateo Stationが近いので電車でいくのでもいいのかも。

大きな地図で見る

Wednesday, March 4, 2009

ネット業界滋賀県人会

社内に滋賀県にゆかりのある者からなる「近江っ子クラブ」があります。私も忍者市になりそこねた甲賀出身なので、そのメンバーです。
ちょうどMountain Viewにいっている時に新年会があったのですが、そこでネット業界関係者な滋賀県人があつまる会があるという話がでてました。
で、「ネット業界滋賀県人会2009 Spring」が3月4日にあるというのでいってきました。場所は恵比寿の個室ダイニング 囲。
大きな地図で見る
だいたい滋賀の琵琶湖沿い南部から東部の人がおおかったみたい。琵琶湖線ぞい。実家が数十mくらいしか離れてない人とかもいたみたい。甲賀の人はいなかったような? 市町村合併でいろいろかわったけど今はこうなっているのか
しかし、名刺もカメラも忘れてしまっていたのが悔やまれるなー。

Saturday, February 28, 2009

フクオカRubyフォーラム2009

フクオカRubyフォーラム2009にいってきた。
羽田から福岡空港に11:30頃。会場までつれていってもらって昼食会。知事をまじえて実行委員会/審査委員のみなさんと。Ruby大賞は、海外から結構応募があって驚いたとか、大賞も結局海外にとられてしまいました とか。自治体のITシステムがベンダーロックインされているのをどうしたらいいかとかそういう話。きれいなインターフェイスをきめて疎結合にしてあればいいんだろうけど、そうじゃないんだろうねえ。
フクオカRubyフォーラム2009はまず主催者と知事の挨拶からはじまり、フクオカRuby大賞の発表。 その後、基調講演。RubyのイベントにGoogleとしてということで、ちょっとawayぎみなんで何の話にするか悩んでたけど、結局 Google Data APIGoogle App Engineで、GoogleのスケーラブルなWebプラットフォームというタイトルにしました。RESTfulなプロトコルをつかうことで、Googleミッションの「世界中の情報を世界中の人がアクセスし、利用できる」ようにしているのがGoogle Data APIで、webアプリケーションの運用・構築をGoogleの強力なインフラ上で簡単にスケールできるようにしているのがGoogle App Engineというかんじのストーリー。Google Data APIについてはちょうどGoogle Data on Railsがあったのでそれを紹介することでちょっとrubyにふれることができた。App Engineはまだpythonのみなのでrubyな人には遠い話なのかもな…「技術のわかる人だけじゃないんで」といわれてたけどわかってもらえただろうか?
その後は、Matzさんの特別講演と受賞者のプレゼンテーション。
フォーラムの後は同じ会場で交流会。

交流会の後、現地の人につれられて屋台のラーメン屋へ。アゴ(トビウオの干物?)、明太イワシとか食べてあと長浜ラーメン+替え玉1。そのあとも芋焼酎とかけっこう飲んでだいぶ遅くなってから西鉄グランドホテルにチェックイン。なんか泊まった部屋はネットもwifiもなくてちょっと困った。
翌日朝7:30頃に起きて朝食くったあと、ネットなくてすることないし昨晩の酒でちょっとだるくて2度寝。10時頃おきてチェックアウトして福岡空港にいってお土産かったりラーメンくったりしたあと羽田へとんで帰宅。

Saturday, February 21, 2009

Release It!

Release It! 本番用ソフトウェア製品の設計とデプロイのためにが発売開始してます。
Ship It!Manage It!に続く第3段。Ship It!は、ソースコード管理やビルド・テストなど開発手法に関する話、Manage It!はプロジェクトのマネジメントはどうすればいいかという話に対して、Release It!では、大規模なシステムを開発・運用する上で考慮すべきことをまとめた本になっています。いわゆる上流工程的な設計をどうするか、実装詳細がシステムにあたえる影響、負荷がかかった時のふるまいがどうなるか、デプロイをうまくやるにはどうしておくべきかなど、ただ単に要求された機能が動作できるシステムを作るだけでなく、安定して運用するために検討しておくべきことがうまくまとめられています。
今回もレビュアーの方々のおかげで、かなりこなれた日本語訳になっています。
装丁も船外活動している宇宙飛行士が「Release It!」というパネルをもっていたりしてかっこいいです。

Thursday, February 19, 2009

Google Summer of Codeアンケート結果

そろそろまた Google Summer of Code 2009がはじまりそうです。月日の経つのは早いものですね。
というわけで去年とったアンケートの結果をまとめてみました。

34 Response
Google Summer of Codeを知っていましたか?
知っていた2784%
知らなかった516%

あなたは?
参加資格のある学生 9 33%
open source/free softwareの開発者 13 48%
(重複あり)
Google Summer of Codeに参加したことがありますか?
学生として申し込んだことがある 2 33%
学生として参加したことがある 1 17%
mentor organizationに所属している/所属していた 1 17%
mentorとして参加したことがある 0 0%
(重複あり)
Google Summer of Codeに参加した人はどこで知りましたか?
Googleのblog 1 8%
mentor organizationでの告知 1 8%
ニュースサイト 4 31%
その他 2 15%
(重複あり)
Google Summer of Codeを参加しようとしなかった人は、その理由はなんですか?
英語の壁 2 8%
申し込みの仕方がわからなかった 0 0%
申し込む開発ネタがなかった 3 13%
open source/free softwareに興味がない 0 0%
$4500もらっても仕方がない 0 0%
結果がだせなくて$4500もらえないリスク 0 0%
気づいた時には締め切られていた 2 8%
開発期間に時間がとれるかどうか不明だった 2 8%
その他 0 0%
(重複あり)
今後、参加してみたいと思いますか?
今のやり方のままでいいので参加したい 10 33%
参加しやすいやり方に変われば参加してみたい 17 57%
参加してみたいと思わない 3 10%

参加しやすいやり方に変われば参加してみたい人はどの点が変われば参加してみたいですか?/参加が増えるとおもいますか?
日本の大学事情にあわせたスケジュールになっていれば 5 24%
日本語で参加できるのならば 0 0%
日本語が通じるmentorがいれば 0 0%
もっと広くアナウンスして見逃さないようにしてくれれば 1 5%
日本 Summer of Code 3 14%
(重複あり)

フリーフォーマット回答から抜粋とその感想は以下のとおり
Google Summer of Codeに参加しなかった理由
自分の能力では恥をかくだけだという不安
やってみないとわからないのでは? 若いうちは恥をかいても得られるメリットがあると思う
特許の懸念があるプロジェクトが多すぎる。ffmpeg等
そのプロジェクトにapplyしなきゃいいんでは?
一緒に開発する友達が居なかった
GSoCは個人でapplyして個人で開発するものです
希望するやり方
行なわれたコミットメントに対して後から支払う
基本的にそうなっていますよ。application通過すれば$500、中間審査にpassすれば$2000、最終審査にpassすれば$2000です。途中でだめだと後はでません。mentor orgには終わった後に最後に支払いがあります。
夏のバカンスシーズンに、いきなり二日以内に答えろとか言ってくるのをやめてくれれば。
(初年度の時はどもかく)スケジュールはだいたいはじまる前に決まっているので、あらかじめ予定をたてておきましょう
その他御意見
問題をもっと明確に定義して,その解決アイディアにお金をはらうようにするといいのではないか(アイデアゴラのように)
問題を明確に定義するのはmentor orgとstudentが協力しあってやりあうことです。GSoCは解決アイデアに金をはらうのではなく、ソフトウェア開発(coding!)に対してです。
私の知っている範囲では、ほとんどのプロジェクトで採用され成功している学生はすでに参加している人です。今まで参加したことがなくて、金に釣られてやってくるような学生には滅多にいい人がいません。SoCに認められるような有名プロジェクトで普段から参加しているような日本人がほとんどいないんですから、こうなるのも自然なことだと感じます。
そうかもしれません…。金についてはバイトできないぶんの補償くらいかなあ。むしろなかなかprojectの中心メンバーとcommunicationしてprojectにはいりこむいいきっかけだと思うんですけどね。GSoCとかに参加しておくほうが就職活動のときにresumeに書けて有利というのがあると思います。(少なくともGoogle SWEにapplyする場合 resume screenはパスしやすくなるような…)
未踏ソフトウェア事業のように、オフラインで行う成果報告会に相当するものがあるといいと思います。
やってるんですけどねー。日本ではfsijがやってますが、日本からの参加者がかなり少ないのであまりもりあがりませんね。もっとアナウンスしたほうがいいのかもしれません。
SoCに参加したいとは思っているのですが,ネタが思いつかなくて躊躇してしまいます.「こういうネタでやってみませんか」という情報が広く伝わると参加しやすくなるのではないかと個人的には思っています.
mentor orgがだしているideas listでは駄目なんでしょうか?
Google DocsでSpreadsheetを使ったFormですが、最近サマリを自動生成する機能がlaunchされたので使ってみました。がサマリだけpublicにする方法がよくわからなかったので、コピペ。

Monday, January 12, 2009

Android Dream phone の kernel module のbuild

ext2.koなんかをつくったりするためのやりかたのメモ。
基本的にはBuilding for Dreamで環境を整える。
kernelだけならkernel/msmrefs/heads/android-msm-htc-2.6.25というrevisionをとってくればよいだけだとおもう。kernel versionがかわっていたら違うrevisionをとってくること。まあkernelのgitだけより全部のmoduleをrepoでとってきたほうがprebuiltにtoolchainなんかもはいっているのでそのほうが楽かも。
実機のkernelがどのversionかはuname -rなどで確認。unamebusyboxにはいってる。
CONFIG_LOCALVERSION_AUTOがセットされおりgit revisionの情報がkernel moduleのversionに追加されているため、git revisionをあわせる必要がある。kernel/scripts/setlocalversionをみればわかるようにgit describeの結果あたりが使われているのでそれがあうようなrevisionにする。git logでcommit logがわかるので、commitの行のhash値をつかってcheckoutしつつgit describeがそれっぽいのになるのにあわせる。
% git checkout commit行のhash値
% git describe
あとは/proc/config.gzをとってきて、必要なconfigをしなおしてmake。gccのバージョンは実機の/proc/versionなどでチェック。CROSS_COMPILEgccなどへのprefixをセットする。
% adb pull /proc/config.gz ./config.gz
% gunzip config.gz
% mv config .config
% vi .config # or make ARCH=arm menuconfigなど
% make ARCH=arm \
 CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
あとはできたext2.koなどをadbでpush。
% adb push fs/ext2/ext2.ko /data/bin/ext2.ko
/sbin/modinfo fs/ext2/ext2.koしてdependsしている*.koもpushするのを忘れないように。dependsしているmoduleがloadされていないとエラーになります。
# insmod /data/bin/ext2.ko
insmod: init_module '/data/bin/ext2.ko' failed (No such file or directory)
# insmod /data/bin/mbcache.ko
# insmod /data/bin/ext2.ko
これでkernelのversionがあがっちゃってもext2.koなんかを自分で作ることができる。

Monday, January 5, 2009

Androidの/etc/resolv.conf

Android Dream PhoneでDebianだと、networkによっては nameserverがみつからなくて困ることがある。Android appなら問題ないけど、debianのプログラムだと/etc/resolv.confをちゃんとつくる必要があるのだ。nameserverの情報はgetpropコマンドでとれるのでchrootする前に次のようなかんじでchrootの中のetc/resolv.confをつくっておけばよい。
getprop | \
 sed -n -e 's/^\[net\.dns.\]: \[\(.*\)\]/\1/p' \
   > etc/resolv.conf

Sunday, January 4, 2009

謹賀新年2009

遅ればせながら、あけましておめでとうございます。今年もよろしくお願いします。
年末年始は実家のほうに帰省していました。
31日: 実家へ移動。
FOMAの/dev/ttyACM0Input/output errorでopenできないのであせる。なんか何度かぬいたりさしたりいろいろ試しているとふいに繋るようになった。条件不明。いったん繋れば安定しているっぽい。
1日: 昼ごろ起きて御節料理。そのあとまた寝て起きたら晩飯。

2日: TV見たりしながらだらだら。
3日: 高校の同窓会へ。
11:30から。すごく久しぶりで懐しい。先生があんまりかわってない。というか、当時は今の我々より若かったみたいな話でみんな驚く。生徒は全体の1/3くらいが来ていたぽい。みんないろいろ活躍してるな。一次会は15:30に終了。
17:00から二次会。19:30ごろから三次会で22:00ごろにおひらき。終電まで余裕と思っていたら、乗り換えで50分待ちで終電になってた。田舎すぎる。
4日: 実家から東京へ。昼ごろに戻ってきていたのでその後明治神宮に初詣など。