Tuesday, December 16, 2008

丸山不二夫レクチャーシリーズ第2回 クラウドのエンタープライズ利用をめぐって

丸山不二夫レクチャーシリーズ第2回 クラウドのエンタープライズ利用をめぐってにいってきた。
ちょっと遅刻ぎみでいったら、すでにだいぶ席がうまってた。席をさがして前のほうにいったらたまたま首藤さんの隣
丸山先生の話を聞くかぎりでは、Microsoft Azure SQL Data Serviceは、DHTで構築されたkey-valueの分散データストアで、SQLぽくアクセスできるというかんじなのかな? できることはGQLと似たようなもの? Bigtableでは、rowkeyをうまく設計することでRowのlocalityをある程度制御できる(同じtabletになるかどうかは基本的にbigtable serverが制御しclient側ではしない。App EngineのDatasource APIで使う場合にはindexテーブルとかもあるので気にする必要はない)けど、Azure SDSではPartitioning Keyでclient側がどう分割するかを決めるというあたりが違ったりする? とか聞きながら考えてた。
今回は発表者としてではなく聞きにいっただけ。発表者のMacBookのVGAアダプタがなんかおかしかったみたいなので、持ってたやつを貸してあげた。内容自体は基本的に札幌のJava Festa 2008とほぼ同じ。前回と違ってデモの失敗もなく無事終了。
その後、懇親会があったようだけど、今日は会社のYear End Partyがあったので懇親会には不参加。

Saturday, December 13, 2008

App Engine Hackathon

今日はofficeで第2回App Engine Hackathon
今回は講義とかはなく、いくつかのグループにわかれてそれぞれ作業という形式だった。 チュートリアル、MashUp、Frameworkなどなど、おおまかなtopicにわかれて相談しつつ6-7時間ほどHackに集中。

昼には弁当がでました。 最後に各グループごとに成果発表。

今回は「20% ルール」(Google の「20% ルール」とは、勤務時間の 20% を自分の好きなことに使ってよい、という世界共通の社内ルールです。)で前からちょっとやってたinternal service(のprototype)を Java実装からPython/AppEngine実装に作り直しとかをやってました。Google Visualization APIをつかっていて、最近Data Source Python Libraryができていたのでそれを使ったりするようにしてみました。
Hackathonが終わったあと、App Engineのプレゼン用のデモコードを整理。そういえばこういうデモをするとき、liveでcodeを書いていくのもいいけど、gitリポジトリにいれておくと、「次のステップはこちら」とgit checkout branchでさくっと更新していけるので便利だなと思った。特にAppEngineLauncherを使う場合、Launcherからは同じディレクトリにないといけないのでgit checkoutでその場のコードをすぐに次のバージョンに変えていけるので便利。

Tuesday, December 9, 2008

404 Server Not Found

なんか、いつの間にか bloggerの構成(?)がかわっていたみたいで 404 Server Not Found になってしまっていた。
blogger-helpで聞いてみたところ
  • blogger.ukai.org IN CNAME ghs.google.com だけじゃなく www.blogger.ukai.org IN CNAME ghs.google.com も登録しろ。
  • 登録したら、一旦 blogspot.com に戻して、custom domainを設定しなおせ
ということらしい。
そんなことHelpHow do I use a custom domain name on my blog?に書いてないじゃん…
あと、CNAMEのTTLは短めにしといたほうがよいという話も。
というわけでこんなかんじで
blogger.ukai.org.       3600 IN CNAME ghs.google.com.
www.blogger.ukai.org.   3600 IN CNAME ghs.google.com.

Sunday, December 7, 2008

Google Friend Connectで遊ぶ

Google FriendConnectが使えるようになっていたので、ちょっと試してみました。 最初blogger.ukai.orgで使おうとしたら、なんか既に微妙に違うversionのrpc_replay.htmlとcanvas.htmlが見える模様? そのまま使えるのかなーと思っていたら、404 Server Not Found。
仕方ないのでukai.orgのほうをFriendConnectサイトにしてみた。むアンテナのほうも sign in して Ratingsの左の + をclickしてopenすれば、ratingとcommentが書けたりするようになってる。
とりあえず member gadgetとsign in gadget、comment gadgetをはってみた。それだけではさびしいのでついでにGoogle API使ったやつをいろいろと。

しかしなんかFriendConnect gadgetを使っていると、関係ないiframeのところもFriendConnect gadgetになってしまうという不可解な現象が…。とりあえずsetTimeoutでちょっとdelayを置いてからiframeを追加するようにしたら解決したが…

Monday, December 1, 2008

Ganeti - カーネル読書会番外編@グーグル

今日はYLUGのカーネル読書会番外編@グーグルということで、オフィスでやっていたので参加してみた。
(イベントごとのpermalinkはないんだろうか… > YLUGのサイト)
内容はGoogleで開発・運用しているGanetiと呼ばれる仮想マシン管理ソフトウェアツール。XenDRDBなんかを使ってfailureに強いclusterを作成・管理するツールというかんじか。

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を見ると次のようなエラーが。
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としてちょっと挨拶。


月曜は会津若松を小雨の中ぶらぶら。鶴ヶ城などを観光してきた。
いく途中、甲賀町とかを発見。「なにか甲賀とゆかりが?」とおもったら、「蒲生氏郷が近江の日野から伴った者を居住させ日野町と名づけたが、加藤義明が「火」を忌み嫌って、同じ近江の郡名をとってこの名に改めた」とか書いてあった。なんだってー。

しかし、重い荷物で歩きまわってだいぶ疲れた。小雨の中を歩いていたせいかちょっと熱がでてきたぽい…

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
  • sedawkのようにループして処理する(-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"が含まれていたらそのブロック全体を出力
まあ、わかりやすいように見えるけどこのsyntaxを覚えとく価値はあるんかなあ。

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 = truereference = 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_datedate.cにはなさそうなのでcoreutils-6.6.tar.bz2get_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< わかった
22:55 >ukai< date -d "@$(date +%s)"
22:55 >ukai< @ をつけるべし
22:59 <yaegashi> @ てなんだ
22:59 <yaegashi> きいてないぞ
23:00 <yaegashi> どういうことだ
そういやinfoを見てなかったなあ と思って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.