(イベントごとのpermalinkはないんだろうか… > YLUGのサイト)内容はGoogleで開発・運用しているGanetiと呼ばれる仮想マシン管理ソフトウェアツール。XenにDRDBなんかを使ってfailureに強いclusterを作成・管理するツールというかんじか。
Monday, December 1, 2008
Ganeti - カーネル読書会番外編@グーグル
今日はYLUGのカーネル読書会番外編@グーグルということで、オフィスでやっていたので参加してみた。
Saturday, November 29, 2008
Java Festa 2008 in 札幌
Java Festa 2008 in 札幌でGoogle App Engineの話をしてきました。

Java Festa といいつつ、JavaサポートのまだないGoogle App Engineの話ということでかなりawayなかんじ。
内容はGoogle App Engineでのアプリの開発の仕方の簡単なデモと、Datasourceがbigtableを使ってどのように実装されているかについての簡単な説明でした。
デモのほうは直前に「日本語のメッセージにしてみましょう」とかで、dev_appserverで動くことだけ確認してappengineにdeployして動くことを確認していなかったら、動かなかったというハプニング。appengine admin consoleのlogを見ると次のようなエラーが。
その後の懇親会は、会場に比べて寒かった。そのせいか二次会の時はやや微熱っぽい体調で、おいしい海鮮料理だったのに、いっぱい食べられなかった。
翌日は飛行機まで時間があったので札幌市内をぶらぶら。
家についたらまただるい。熱をはかったら36.9℃とかだった。微熱ぎみ。
Java Festa といいつつ、JavaサポートのまだないGoogle App Engineの話ということでかなりawayなかんじ。
内容はGoogle App Engineでのアプリの開発の仕方の簡単なデモと、Datasourceがbigtableを使ってどのように実装されているかについての簡単な説明でした。
デモのほうは直前に「日本語のメッセージにしてみましょう」とかで、dev_appserverで動くことだけ確認してappengineにdeployして動くことを確認していなかったら、動かなかったというハプニング。appengine admin consoleのlogを見ると次のようなエラーが。
Non-ASCII character '\xe6' in file /base/data/home/apps/shoutjp/1.329600768188861926/main.py on line 30, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details (main.py, line 30)まあ、pythonスクリプトに直接日本語とか書くのはよくないということで。templatesとかのほうにいれるのは問題ない。 その後、認証でいろいろ失敗していたのは実はapplication idが違っていたせいだった。あせるとよくない。 Q&Aの時には、ちゃんと動かせていたのでヨシとするか。
その後の懇親会は、会場に比べて寒かった。そのせいか二次会の時はやや微熱っぽい体調で、おいしい海鮮料理だったのに、いっぱい食べられなかった。
翌日は飛行機まで時間があったので札幌市内をぶらぶら。
家についたらまただるい。熱をはかったら36.9℃とかだった。微熱ぎみ。
Monday, October 27, 2008
acm ICPC programming contest - Asia regional contest at Aizu
会津大学で開催されていたacm International Collegiate Programming Contest, Asia Regional Contestに行ってきた。
会場についたら Commentaries on Problemsの後半だった。「あれ? scheduleによればまだJava Challenge Competitionのはずなのになー」と思ってたらどうやら順番がいれかわってみたいで 16時すぎからが Java Challenge Competitionだった。
その後はAward and Closing Ceremony。Sponsorとしてちょっと挨拶。
月曜は会津若松を小雨の中ぶらぶら。鶴ヶ城などを観光してきた。
いく途中、甲賀町とかを発見。「なにか甲賀とゆかりが?」とおもったら、「蒲生氏郷が近江の日野から伴った者を居住させ日野町と名づけたが、加藤義明が「火」を忌み嫌って、同じ近江の郡名をとってこの名に改めた」とか書いてあった。なんだってー。
しかし、重い荷物で歩きまわってだいぶ疲れた。小雨の中を歩いていたせいかちょっと熱がでてきたぽい…
会場についたら Commentaries on Problemsの後半だった。「あれ? scheduleによればまだJava Challenge Competitionのはずなのになー」と思ってたらどうやら順番がいれかわってみたいで 16時すぎからが Java Challenge Competitionだった。
その後はAward and Closing Ceremony。Sponsorとしてちょっと挨拶。
月曜は会津若松を小雨の中ぶらぶら。鶴ヶ城などを観光してきた。
いく途中、甲賀町とかを発見。「なにか甲賀とゆかりが?」とおもったら、「蒲生氏郷が近江の日野から伴った者を居住させ日野町と名づけたが、加藤義明が「火」を忌み嫌って、同じ近江の郡名をとってこの名に改めた」とか書いてあった。なんだってー。
しかし、重い荷物で歩きまわってだいぶ疲れた。小雨の中を歩いていたせいかちょっと熱がでてきたぽい…
Wednesday, October 15, 2008
即興スクリプティング
「こういうことしたいんですけど、どうすればいいですかねえ」という質問を受けた。
"こういうこと"というのは次のようなことだった。
こんなかんじで
しばらくして…
「実はフォーマットがちょっと違ってました。これならどうなりますか?」
といっていたら
「
で、でてきたのがこれ
ちなみに世の中には
- あるテキストの入力ファイルがあり、中身は次のようなかんじ
Mapping JP { ... } Mapping AU { ... } Mapping JP { ... } Mapping XX {という行ではじまり}でおわるのが一つのブロック。- この中で
Mapping JP { ... }というブロックをすべて抜きだしたい
sedで簡単にできますよ。」こんなかんじで
% sed -ne '/^Mapping JP {/,/^}/p' datafile
- defaultでは出力しない(
-nオプション) Mapping JP {ではじまる行から、}ではじまる行までは出力する(/start/,/end/という範囲でpコマンド)
しばらくして…
「実はフォーマットがちょっと違ってました。これならどうなりますか?」
- テキストの入力ファイルがあり、中身は次のようなかんじ
Mapping { id: foo country: "JP" ... } Mapping { id: bar country: "AU" ... } Mapping { id: baz country: "JP" ... } Mapping {という行ではじまり}でおわるのが一つのブロック。- この中で
country: "JP"を含むブロックをすべて抜きだしたい
sedだとちょっと面倒だなあ。hold spaceかな」といっていたら
「
perlでmultiline regexp使ったら簡単じゃないですか?」で、でてきたのがこれ
% perl -n0e 'print "$_\n" for /^Mapping {[^}]+country: "JP"[^}]+}/gms'\
datafile
sedやawkのようにループして処理する(-nオプション)- record separetorとしてnull文字を設定する(
-0オプション)。つまりファイルを全部一気に読む - ファイル全体に対して
^Mapping {[^}]+"JP"[^}]+}にマッチする部分をそれぞれ出力する。gでglobal matching、mでmultilineとして処理する(^は文字列の先頭にマッチするのでは行頭にマッチするようになる)、sでsinglelineとして処理する(.なども改行文字にもマッチするようになる)
sedだとこう
% sed -ne '/^Mapping {/,/^}/H;/^}/{s///;x;/country: "JP"/p}' datafile
- defaultで出力しない(
-nオプション) Mapping {ではじまる行から}ではじまる行までhold spaceにためていく。(/start/,/end/という範囲でHコマンド)}ではじまる行で次の処理を行う({...}で処理するコマンドをグルーピングs///でまず現在の行(})を消す- hold spaceをpattern spaceに戻す(
xコマンド) - 戻してきたpattern spaceで
country: "JP"があれば出力(pコマンド)
s///するのを忘れていて、無駄な}がでちゃうなあというあたりでちょっとはまっていた。でもperl版より短い。ちなみに世の中には
sgrepとかいうのがあって、次のように使えるっぽい
% sgrep 'outer("Mapping {" .. "}" containing ("country: \"JP\""))'\
datafile
Mapping {から}の中にcountry: "JP"が含まれていたらそのブロック全体を出力
Saturday, October 11, 2008
Manage It!
Manage It!が届きました。
プログラミングの本ではなく、(主にソフトウェア開発)プロジェクトのマネージメントはどうすればいいのかといったことを説明した本です。今回は監訳以外にレビューしてもらったので、より読みやすい訳、わかりやすい内容になっていると思います。
プログラミングの本ではなく、(主にソフトウェア開発)プロジェクトのマネージメントはどうすればいいのかといったことを説明した本です。今回は監訳以外にレビューしてもらったので、より読みやすい訳、わかりやすい内容になっていると思います。
Wednesday, October 8, 2008
3分 Code Reading - date編
晩飯くってまったりしている頃にIRCを見ると次のような会話が。
22:44 <yaegashi> unix time からふつうの時刻表記に直すのはどうやるそうだなあ と思い、ちょっと調べてみることにした。 出力する方は
22:44 <yaegashi> irb とかつかわずに
22:45 >ukai< % ruby -rtime -e 'puts Time.at(1234567)'
22:46 <yaegashi> いやだから ruby とかつかわんで(わら
22:46 <ar-m> dateコマンドで
22:46 <yaegashi> date(1) でなんとかできんのかな
22:46 <ar-m> できそうなもんだけどな
date +%sだけど逆はないものか。
まず何も考えずに% date -d "$(date +%s)" date: invalid date `1223478096'で駄目。 date(1)を見てもちゃんと書いてない。
オプション
-d datestr, --date datestr現 在の時刻・日付の代わりに、 datestr で指定された時刻・日付を表 示する。 datestr は普通のフォーマットならだいたいなんでも使う こ とができる。月名、タイムゾーン、`am' や `pm' なども用いてよい。
man -L C date しても特に情報はなさげ。
そういう時はやっぱりソースを見るのが早いかなと思うが、ソースとってきて展開するも面倒だなあと。(まあ apt-get source coreutils でいいんだけど)
というか、こういう時こそwww.google.com/codesearchではないかと思い出し、早速検索。
dateコマンドはcoreutilsパッケージの中にあったよなということで、まずはdate.c coreutilsで検索。最初の候補はman/Makefile.am。manじゃないので..へ移動してみて、srcに移動。
するとdate.cがあるのでそれを見てみる。ざっと見ていくと335 switch (optc)
336 {
337 case 'd':
338 datestr = optarg;
339 break;
とあるのでdatestrをたどっていきoption_specified_date = trueでreference = NULLなので494 /* (option_specified_date || set_date) */
495 if (reference != NULL)
496 {
497 if (stat (reference, &refstats) != 0)
498 error (EXIT_FAILURE, errno, "%s", reference);
499 when = get_stat_mtime (&refstats);
500 }
501 else
502 {
503 if (set_datestr)
504 datestr = set_datestr;
505 valid_date = get_date (&when, datestr, NULL);
506 }
に辿りつく。get_dateは date.cにはなさそうなのでcoreutils-6.6.tar.bz2でget_dateを検索するとgetdate.cが見つかる。が、これbisonで生成されたコードなので、元のgetdate.yの方をみてみる。
ざっと見ると238 spec:
239 timespec
240 | items
241 ;
242
243 timespec:
244 '@' seconds
245 {
246 pc->seconds = $2;
247 pc->timespec_seen = true;
248 }
249 ;
を発見。どうやら @を数字の前につければよいらしい。
というわけで試してみる。% date -d "@$(date +%s)" 2008年 10月 8日 水曜日 22:54:21 JST % LANG=C date -d "@$(date +%s)" Wed Oct 8 22:54:21 JST 2008結局manとか読んだりいろいろ試したりするのに5分少々、codesearchしはじめてからここまでは3分少々なかんじ。ということで報告
22:55 >ukai< わかったそういやinfoを見てなかったなあ と思って
22:55 >ukai< date -d "@$(date +%s)"
22:55 >ukai< @ をつけるべし
22:59 <yaegashi> @ てなんだ
22:59 <yaegashi> きいてないぞ
23:00 <yaegashi> どういうことだ
info dateを見ると書いてあるね。File: coreutils.info, Node: Seconds since the Epoch, Next: Specifying time zone rules, Prev: Pure numbers in date strings, Up: Date input formatsまとめ
27.8 Seconds since the Epoch
============================
If you precede a number with `@', it represents an internal time stampas a count of seconds. The number can contain an internal decimalpoint (either `.' or `,'); any excess precision not supported by theinternal representation is truncated toward minus infinity. Such anumber cannot be combined with any other date item, as it specifies acomplete time stamp.
- Epoch time/unix timeから普通の時刻表記にする時には unix timeの前に @ を付けたものを datestr として date(1)の -d オプション(--dateオプション)に渡せばよい。
- www.google.com/codesearchで検索するのが楽
- GNU productsはmanよりinfoを読もう。see GNU Coding Style: Man Pages
In the GNU project, man pages are secondary.
Monday, September 22, 2008
Packages|Sourcesのインデックス
Hackathonの続き。
SQLで毎回既にあるかどうかチェックするのが遅かったようなので、最初に既存の情報をロードして、python の dictおよびsetでチェックするようにしたらだいぶ速くなった。
最初、dictをdictのkeyに使おうとしたら使えなかったので、dictをstrにしたのをkeyにしていたら、入力のパスによって stringになっている時 (e.g. 'foo')と、unicodeになっている時(e.g. u'foo')があって全然keyとしての役目をはたしてなかったりするようなしょぼいバグがあったり。
初期状態からのロードは、大きいPackages.gzとかだとやはり10分とかかかるけど、更新ならせいぜい1〜2分になっているようだ。一日分もだいたい20-30分くらいにおさまるようになった。これならなんとかなるかな。今のところざっと1日で4〜5ヶ月分処理できているペースなので2週間ほどで全部 index できそう。
indexのdbファイルも2ヶ月分くらいつっこんで 120MB程度。300-400MBくらいになるかな。appengine使う時は ModelのEntityになるからもっと容量が必要になりそうだなあ。
あとはCGIかservletとして動かすようにしないと。
Sunday, September 21, 2008
App Engine Hackathon
土曜日はofficeでApp Engine Hackathon。
講義としてはスケールする Web アプリを書くにはと製品レベルの Web アプリを書くにはでした。基本的にはGoogle I/Oのセッションを日本語で説明するかんじで、AppEngineつかう人はぜひ知っておくべき情報です。
あとはひたすら各自でコーディング。
昼と夕方に弁当がでました。


Software Freedom Dayということもあり(?)個人的には最近放置していたsnapshot.debian.netのインデックスをなんとかしようとscratchから作り直し。いままでのversionは pdumpfsのlogをよんで、更新されているdebに関して情報ととりだして packageごとのPackagesとSourcesをつくっていました。かなりad-hocなruby scriptで、生成されるものもそのままPackages, Sourcesなのでわかりやすいことはわかりやすいけど、いかんせん量がおおすぎてとりまわしが難しかったのです。ファイル数が約55万、ディレクトリが約24万、トータルで1.6GBほど。新しいディスクやマシーンにコピーしようとしてもファイル数が膨大すぎて何時間もかかってしまうし。
ちなみに現状のsnapshot archiveはこれくらい
というわけで次世代ではなんらかのdatabaseを使おうと思っていたのでした。コピーの手段も pdumpfs から cp -a --link + rsync に変更してしまっているので、そのままじゃ動かないし。
App Engine の Hackathon なので App Engine を使うことも考えたのですが、なんといっても量が多いのでquota(500M)に収まらないんじゃないかと思い、とりあえず python + sqlite でコーディング。実用的なものをめざしつつ、サイズが小さくおさまりそうなら App Engine版をつくることを見据えた選択をしました。
最近 SQLとかさわってないので思い出しつつ、いくつかはまるところがあったり。
sqlite で string な column に'1.0'をつっこむと1になってしまうとか。'1.0 'とかにするとよさげ。
とりあえずそれっぽいところまでできたのですが、なんせ量が多いのに対しperformance(特にindexing)がいまいち。
そもそも 2005/03/12 (残っているなかで一番古いやつ) ですら、一日分だけで Packages.gz+Sources.gzが 約220ファイル、延べ47パッケージエントリ、gzipされてるファイルで90Mほど、Packages.gzとSources.gzをpython-deb822で全部scanするだけで7分ほどかかります。
つくったindexerではできるdbファイルがsql tableの作り方を工夫して無圧縮で約100Mほどまでにできたのですが、しかしindex構築するのに数時間かかってしまっています。dbファイルとhddに置いてたらかなり遅かったので/dev/shm(tmpfs)以下に置くようにしたら少しは早くなったのですがそれでもまだまだ遅いです。大きめのPackages.gzだとひとつのPackages.gzファイルだけで10分~20分とかかかるかんじ。
現在 1288日分あるわけで、1日処理するのに4-5時間以上かかるとすると、全部のindexをつくるのに1年ほどかかってしまいそうです。もっと高速化しないとなー。
やはり全スキャンはやめて以前みたいに更新ログから更新分だけを処理するようにしないとだめかな。
社内にあったらMapReduceでばばんとできるのになー(Google脳…)
あとはひたすら各自でコーディング。
昼と夕方に弁当がでました。
Software Freedom Dayということもあり(?)個人的には最近放置していたsnapshot.debian.netのインデックスをなんとかしようとscratchから作り直し。いままでのversionは pdumpfsのlogをよんで、更新されているdebに関して情報ととりだして packageごとのPackagesとSourcesをつくっていました。かなりad-hocなruby scriptで、生成されるものもそのままPackages, Sourcesなのでわかりやすいことはわかりやすいけど、いかんせん量がおおすぎてとりまわしが難しかったのです。ファイル数が約55万、ディレクトリが約24万、トータルで1.6GBほど。新しいディスクやマシーンにコピーしようとしてもファイル数が膨大すぎて何時間もかかってしまうし。
ちなみに現状のsnapshot archiveはこれくらい
$ df -h /archive/
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 4.5T 3.7T 613G 86% /archive
というわけで次世代ではなんらかのdatabaseを使おうと思っていたのでした。コピーの手段も pdumpfs から cp -a --link + rsync に変更してしまっているので、そのままじゃ動かないし。
App Engine の Hackathon なので App Engine を使うことも考えたのですが、なんといっても量が多いのでquota(500M)に収まらないんじゃないかと思い、とりあえず python + sqlite でコーディング。実用的なものをめざしつつ、サイズが小さくおさまりそうなら App Engine版をつくることを見据えた選択をしました。
最近 SQLとかさわってないので思い出しつつ、いくつかはまるところがあったり。
sqlite で string な column に'1.0'をつっこむと1になってしまうとか。'1.0 'とかにするとよさげ。
とりあえずそれっぽいところまでできたのですが、なんせ量が多いのに対しperformance(特にindexing)がいまいち。
そもそも 2005/03/12 (残っているなかで一番古いやつ) ですら、一日分だけで Packages.gz+Sources.gzが 約220ファイル、延べ47パッケージエントリ、gzipされてるファイルで90Mほど、Packages.gzとSources.gzをpython-deb822で全部scanするだけで7分ほどかかります。
つくったindexerではできるdbファイルがsql tableの作り方を工夫して無圧縮で約100Mほどまでにできたのですが、しかしindex構築するのに数時間かかってしまっています。dbファイルとhddに置いてたらかなり遅かったので/dev/shm(tmpfs)以下に置くようにしたら少しは早くなったのですがそれでもまだまだ遅いです。大きめのPackages.gzだとひとつのPackages.gzファイルだけで10分~20分とかかかるかんじ。
現在 1288日分あるわけで、1日処理するのに4-5時間以上かかるとすると、全部のindexをつくるのに1年ほどかかってしまいそうです。もっと高速化しないとなー。
やはり全スキャンはやめて以前みたいに更新ログから更新分だけを処理するようにしないとだめかな。
社内にあったらMapReduceでばばんとできるのになー(Google脳…)
Saturday, September 13, 2008
ESPer2008
未踏ソフトウェア創造事業関係者が集まるESPer2008に参加してきた。
一番驚いたのは、未踏ソフトウェア創造事業の英語表記が「Exploratory Software Project」から「The MITOH」に変わったらしいということ。
そういえばなんか未踏iPediaなんかできていたのか。IPAは○○iPediaが好きだな…
しかし今日はエンジニアの未来サミットとかぶっていたのね。takesakoさんはESPer2008に参加しつつUstream.TVの中継をみていた。さすが。
一番驚いたのは、未踏ソフトウェア創造事業の英語表記が「Exploratory Software Project」から「The MITOH」に変わったらしいということ。
そういえばなんか未踏iPediaなんかできていたのか。IPAは○○iPediaが好きだな…
しかし今日はエンジニアの未来サミットとかぶっていたのね。takesakoさんはESPer2008に参加しつつUstream.TVの中継をみていた。さすが。
Friday, September 12, 2008
OpenSource協議会 System iセミナー と 裏Hackathon
今日はIBM飯倉にOpenSource協議会 System i主催の『ここまで来た企業情報システムのオープン化!』最新技術動向・事例セミナーで、「次世代Webプラットフォームにおける三つのC 〜 Client、Connectivity、そして Cloud」というタイトルでしゃべってきた。
他の会社の講演もあったけど、さっさと戻って裏Hackathon。本当は木金土と2泊3日で Hackathon だったのだけど、この用事のためにいけなかったのだ。そういうわけでこの二日間は、いけなかった人数人と一緒に会議室にこもって 裏Hackathon していた。
今回は春に20%でちょろっと作ってほったらかしにしておいたシステムを改善をめざした。完璧にはほど遠いけど以前よりはだいぶよくなってきたかなー。やりはじめるといろいろやりたいことがでてくる。普段やってないあたりなので、いろいろつまづくところもあったりもしたが、楽しい2日間であった。
Subscribe to:
Posts (Atom)