progの最近のブログ記事

2010年7月 1日

hiphop-phpが動かないとお嘆きのあなたに。

先日からhiphop-phpをいじってたんですが、ビルドを通していざ動作検証、で全然動かないことが多々ありましたもので。

http://wiki.github.com/facebook/hiphop-php/running-hiphop
Running HipHop - hiphop-php - GitHub

最初、動作検証用に用意していたphpファイルはhiphop-phpのソースディレクトリツリーの外に置いていたんですね。自作のファイルをソースパッケージ内に置く訳にもいきませんでしたので。そしたら、

running hphp...
creating temporary directory /tmp/hphp_gVYmhr ...
parsing inputs...
parsing inputs took 0'00" (1 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (0 ms) wall time
inferring types...
inferring types took 0'00" (0 ms) wall time
post-optimizing...
post-optimizing took 0'00" (0 ms) wall time
creating CPP files...
creating CPP files took 0'00" (85 ms) wall time
compiling and linking CPP files...
CMakeFiles/program.dir/sys/dynamic_table_file.no.cpp.o: In function `HPHP::invoke_file(HPHP::String const&, bool, HPHP::LVariableTable*, char const*)':\ndynamic_table_file.no.cpp:(.text+0x29b): undefined reference to `HPHP::pm_php$__$__$hello_php(bool, HPHP::LVariableTable*)'\ncollect2: ld returned 1 exit status\nmake[2]: *** [program] Error 1\nmake[1]: *** [CMakeFiles/program.dir/all] Error 2\nmake: *** [all] Error 2\n
compiling and linking CPP files took 0'45" (45426 ms) wall time
hphp failed
running hphp took 0'45" (45654 ms) wall time

こんな感じで、どうやら解決されないC++シンボルが発生するみたいだったんですな。

ていうかHPHP::pm_php$__$__$hello_php()って関数(orメソッド)名はどこから来てるのさ、といろいろいじくっている間に、hphpに渡していたファイルの名前=hello.phpをtest.phpとかhello2.phpとか色々いじってみると...、おろ、関数名も変わるじゃないですか。お。じゃあこのファイルの場所を動かしたらどうなるよ、ということでさらに色々試してみたら、カレントディレクトリに持ってきたら普通に動作した。

で、うまく動作したときとだめだったときを比較してみる。すると、ダメな時はphpディレクトリ配下が空っぽなのですよ。生成されたC++ファイルの構成を正常に生成されたものと比べれば一目瞭然なのでござるよ。

hironobu@claire:~/Projects/hiphop-php/src$ ls -l /tmp/hphp_dMpt9D/php
合計 12
-rw-r--r-- 1 hironobu hironobu 794 2010-07-01 22:14 hello.cpp
-rw-r--r-- 1 hironobu hironobu 419 2010-07-01 22:14 hello.fw.h
-rw-r--r-- 1 hironobu hironobu 479 2010-07-01 22:14 hello.h
hironobu@claire:~/Projects/hiphop-php/src$ ls -l /tmp/hphp_gVYmhr/php
合計 0

このhello.phpをディレクトリ掘って、hiphop-php/src/HELLO/hello.phpみたいに配置してみると、

hironobu@claire:~/Projects/hiphop-php/src$ ls -l /tmp/hphp_yW3fOW/php/
合計 0
drwxr-xr-x 2 hironobu hironobu 53 2010-07-01 01:53 HELLO
hironobu@claire:~/Projects/hiphop-php/src$ ls -l /tmp/hphp_yW3fOW/php/HELLO/
合計 16
-rw-r--r-- 1 hironobu hironobu 6927 2010-07-01 01:53 hello.cpp
-rw-r--r-- 1 hironobu hironobu  465 2010-07-01 01:53 hello.fw.h
-rw-r--r-- 1 hironobu hironobu  581 2010-07-01 01:53 hello.h

こんな風になったでごわす。要は、hphpに引数として渡すphpファイルのパス指定が、カレントディレクトリより上位を指すと、生成されるファイルツリーのphpディレクトリ配下をはみ出してしまうためビルドに失敗するということのようです。つまり。てかこのhello.cppとかと同じファイルが、よく見ると/tmp直下にも生成されていた不思議。しかもダメだったときのファイルツリーとほぼおなじタイムスタンプで。そりゃ、どうもならんですわ。

ここ一週間くらいこれに振り回されたでござる。ぷすん。

2010年4月19日

Highchartsの棒グラフでグループ化の順番がおかしかったので

で、一連のベンチマーク結果のグラフ化にHighchartsを使ってみたんですが、この棒グラフ表示でおかしな点があったので一ヶ所自分で手を入れたのです。

http://www.highcharts.com/demo/?example=bar-basic&theme=default
Highcharts Demo Gallery

具体的に言うとこれですね。

Year 1800/1900/2008とある右上の凡例の順番と、Africa,America,...とある各グループの棒グラフの並びを見て頂きたい。凡例の方は1800の青、1900の赤、2008の...何色だ?これ?^^;;(color panel使って見たら「オリーブ色」らしい)という順番になってるのに、棒の順番は逆になっている。ちゃんとグラフを読めば分かるんだけど、並びが違うことで感覚的におかしな気分になるなと。

パラメータで調整して直るのかもしれなかったけど、突き止めきれなかったのでコードを弄って直すことにしてみました。最新版の1.2.5を元にhighcharts.src.jsに手を入れて、ClosureCompilerを通したのを使ってます。万一これでおかしくなっても大丈夫なようにオリジナルはオリジナルで残しておきましたよ。

--- ./highcharts.src.js.orig	2010-04-13 14:43:26.000000000 +0900
+++ ./highcharts.src.js	2010-04-19 02:33:36.199575268 +0900
@@ -4200,7 +4200,7 @@
 	
 	// Initialize the series
 	//initSeries();
-	each (options.series || [], function(serieOptions) {
+	each (options.series.reverse() || [], function(serieOptions) {
 		initSeries(serieOptions);
 	});
 	

2009年9月10日

MT4のStyleCatcherの処理に時間がかかるのだ

で、さっそく問題発声。ギャース。いや発生。

MT4プラグインであるStyleCatcherは、ネットワーク上のレポジトリに公開されているMT用のブログスタイルを取ってきて自分のブログに適用してくれるわけですが、標準のレポジトリ(http://www.sixapart.com/movabletype/styles/mt4/library)にとりにいくと、数が多いせいかかなり待たされます。で、SuiteXのHTTPサーバ(Apacheだよね?)のタイムアウト設定が短めで1分?かそこらに設定されていて、全ての処理が終わりきる前にタイムアウトが起こり、処理が継続できなくなるという事態に陥ってしまったのでした。うはあ。

"Timeout waiting for output from CGI script"てやつですな。

じゃ、一気に全部のスタイルを持ってこようとするのがよくないので、タイムアウトを起こさない程度の少量ずつを取ってくるようにすれば問題ないはずだよねと素朴に変更を加えてみたのが以下の通り。

diff -x mt-config.cgi -ur MT-4.261-ja/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm MT-4.261-ja.new/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm
--- MT-4.261-ja/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm	2009-06-16 14:45:32.000000000 +0900
+++ MT-4.261-ja.new/plugins/StyleCatcher/lib/StyleCatcher/CMS.pm	2009-09-10 01:42:06.000000000 +0900
@@ -138,7 +138,7 @@
     my $app = shift;
     return $app->json_error( $app->errstr ) unless $app->validate_magic;
 
-    my $data = fetch_themes($app->param('url'))
+    my $data = fetch_themes($app->param('url'), $app->param('offs'), $app->param('count'))
         or return $app->json_error( $app->errstr );
     return $app->json_result( $data );
 }
@@ -449,7 +449,7 @@
 # pulls a list of themes available from a particular url
 sub fetch_themes {
     my $app = MT->app;
-    my ($url) = @_;
+    my ($url, $offs, $count) = @_;
     return undef unless $url;
 
     my $blog_id = $app->param('blog_id');
@@ -503,6 +503,10 @@
             }
             push @repo_themes, $css;
         }
+        $data->{paginate}{total} = $#repo_themes + 1;
+        $data->{paginate}{offset} = $offs;
+        $data->{paginate}{count} = $count;
+        @repo_themes = splice(@repo_themes, $offs, $count);
 
         my $themes = [];
         for my $repo_theme (@repo_themes) {
diff -x mt-config.cgi -ur MT-4.261-ja/plugins/StyleCatcher/tmpl/view.tmpl MT-4.261-ja.new/plugins/StyleCatcher/tmpl/view.tmpl
--- MT-4.261-ja/plugins/StyleCatcher/tmpl/view.tmpl	2009-06-16 14:26:14.000000000 +0900
+++ MT-4.261-ja.new/plugins/StyleCatcher/tmpl/view.tmpl	2009-09-10 02:04:15.000000000 +0900
@@ -393,6 +393,9 @@
         }
         if (data.result.themes)
             loadThemes(data.result.themes, cat);
+        var paginate = data.result.paginate;
+        if (paginate.offset + paginate.count < paginate.total)
+            getStyles(repo_id, data.result.repo['url'], paginate.offset + paginate.count, paginate.count);
     }
 
     function createCategory(cat_name, cat_title, url) {
@@ -484,7 +487,7 @@
         }
     }
 
-    function getStyles(repo_id, url) {
+    function getStyles(repo_id, url, offs, count) {
         var btn = getByID("find-button");
         TC.addClassName(btn, "hidden");
         TC.removeClassName(TC.elementOrId("loading-styles"), "hidden");
@@ -496,6 +499,8 @@
             'arguments': {
                 '__mode': 'stylecatcher_js',
                 'magic_token': '',
+                'offs': offs ? offs : 0,
+                'count': count ? count : 9,
                 'url': url
             }
         });

取得中状態の見せ方をもう少しかっこ良くすることもできると思うけど、とりあえずこんなかんじ。流れは以下のようになっちょります。まじで素朴にpaginate。

  • ブラウザからサーバへの取得リクエスト時に、「今回のオフセット」と「個数」を追加して送信
  • サーバ(CGI)は指定されたオフセットと個数分のみを切り出してブラウザに対して応答
  • このとき、応答に「今回のオフセット」と「個数」、さらに「全体の個数」を付加
  • サーバの応答を受け取り、ブラウザは表示処理を行う
  • 「今回のオフセット」+「個数」=「次回のオフセット」として計算
    • 「次回のオフセット」が「全体の個数」を下回れば、「次回のオフセット」と「個数」を用いて次の取得リクエストを送信し、同じ内容を繰り返す。
    • 「次回のオフセット」が「全体の個数」を上回るか等しければ、繰り返しを終了。

2009年3月20日

TwitterのTimeline Widgetを入れてみた

右下端に何かありますが、それです。最初Flash版で入れてみようとしたんですが、サイズ的にどうもしっくりこないのと、デザイン的に浮き気味だったのでやめにしました。

2009年3月18日

iPhone OS/SDK 3.0 betaが出たそうな

http://developer.apple.com/iphone/program/sdk.html
Get Ready for iPhone OS 3.0 - iPhone Developer Program

まだあんまり中身見通してないのでアレですけども。とりあえず個人的に欲しい機能がまだ来ないっぽいのが(´・ω・`)です。はい。

あとはかつて使ってたiPod Touch(16GB)を手放さずにとっとけばよかったな、とも。

2008年12月11日

Intermezzo 0.7.0 リリース

Intermezzo 0.7.0リリースしました。...といってもやっとbetaなので、取り扱いにご注意ください(何)

http://trac.foursics.jp/intermezzo/
Intermezzo trac

  • 今のところ10.5(Leopard)専用ですが、10.4以前への対応は検討中です。
  • ドキュメントは今作ってます。
  • メニューに余計なのとか入ってるっていうか残ってますけど、気にしないでください。
  • バグレポートや機能要望などはtracのチケットで受けられるようにしますのでそちらにどうぞ(ここでもいいけど^^;;)
続きを読む: Intermezzo 0.7.0 リリース

2008年11月14日

MacOSXでネットワークプログラムを書くなら。

MacOSX上でネットワークを扱うプログラムを書く場合、やり方はいくつかある。

  • ソケット
  • NSStream
  • NSURLConnection
  • 分散オブジェクト環境

あと、CarbonベースでもよC言語向けのが欲しければCFNetwork、あとBSDソケットとほぼ同等だけどCFSocketという手もある。まだ他にもあるかななな。

http://www.geekpage.jp/programming/macosX-network/
Geekなぺーじ : Mac OS Xネットワークプログラミング

まあ、NSURLConnectionなんかはURLベースなので「ネットワーク」というには大分限定的・局所的だし、分散オブジェクト環境に至ってはCocoaアプリケーション同士でないとほとんど使いこなせない。汎用性ではソケットに勝るものは無いでしょう。ただ、状況に応じていろんな選択肢があること、これを常に心に留めておくことはとっても重要。

あと、Cocoaではソケット・ファイルディスクリプタをwrapすることのできるNSFileHandleもあるので、ぜひこれらをフル活用していきたい。通知(NSNotification)やデリゲートの仕組みを元に、メインループからの非同期的読み込みの機構も実装されているので、これを使った方がCocoa GUIアプリケーションとしてより自然な挙動を実現することができる。

確かにソケットでよく使うFIONBIOやselect()/poll()などはそのまま適用可能だけど、UNIX系由来のコードを出来るだけそのまま動かすといった明確な意図に基づいて扱う場合以外は、それが有効に効力を発揮する局面はあんまり無いように思う。(≒GUIを持たない、純粋にC言語でmain()からがりがり書くようなケースも含む。ただそれでも、結果的にCocoa/Carbonに乗っておいた方が楽になれることも結構ある)

まあ、NSStreamとNSFileHandleさえあればわりとごはん3杯くらいいけます。はい。

http://developer.apple.com/documentation/Cocoa/Conceptual/Streams/Streams.html
Stream Programming Guide for Cocoa: Introduction to Stream Programming Guide for Cocoa

http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileMgmt/LowLevelFileMgmt.html
Low-Level File Management Programming Topics: Introduction to Low-Level File Management Programming Topics

2008年9月30日

リファクタリングやりすぎ

Objective-Cや、Perl/Python/PHP/RubyいわゆるLL系言語はみんなそうなんだけど、ああ、JavaScriptもそうかな。

私はわりとリファクタリング大好きでそのおかげで開発作業が遅滞してしまうという本末転倒な馬鹿をよくかますのだが(うーん)、関数名を変更したり引数の数や型を調整しようとしてCでよくやっていたような、関数宣言を先にいじってしまってからコンパイラを通すと、warningで呼び出し部を一網打尽に拾いだすような手段が取りにくくて結構こまる。Objective-Cはまだ付いてきてくれるけど、id型が絡むととたんにゆるゆるじゃし。

Eclipseぐらいのリファクタリング快適性がXcodeに載ったらうれしいなー。いや、使いこなせてないだけだったらごめんなさい。ぎゃふん。

2008年4月 5日

ポインタのようなもの

このネタをとある鹿島人と話をしていて、初学者が必ずぶつかる壁って他の分野にもだいたいあるよねーという話になり思い出したのがこれ。

http://www.aki-f.com/kouza/tubo/f.htm
Fコード の押さえ方 -バレーコード攻略法 | ギターのつぼ

とりあえず、さけて通る!

日本の音楽教育には「ハ長調神話」があるように思います。
五線譜には♯も♭もない、ピアノなら白鍵しか使わない。
確かに一見一番優しいキーの様に見えますが、ことギターに限ってはあの恐ろしいFコードの出てくる、厄介なキーなのです。

僕はギターをはじめた頃、バレーコードのほとんど出てこない、キーGの曲ばかり選んで弾いていました。
どうしてもCの楽譜しかない時は、一晩かかってGに移調したりもしました。(その方が難しい?)
キーGの中にもバレーコードがないわけではありません(BmもしくはBm7)。
これが出てきた時は音の似ているDや名前の似ているB7でごまかしていました。(当時はうしろめたさもありましたが、音楽的にもあながち間違いでないことを知ったのはずいぶん後のことです。)

だいたいふと気がつけば、世のギタリストに曲を書かせればまあたいていAメジャーやEメジャーが出てくるもんだし。♭VIや♭IIなんてコード、そうそうまともに使う機会ないもんね。運指や奏法などの面から、楽器にはそれぞれに合う調合わない調があるもんじゃし。

とはいえ、Fコードは避ければいい(ていうかそもそも実用性が疑わしい)ギターと違って、C/C++の場合はおそらくこれが分かってないとほぼ使い物にならない、という点で事情は異なる。いや、人工言語全体を見るメタなフィールドに持っていけば、「C/C++は避ければいい」って結論に持って行けるし、その方が健全だろうな。

2008年4月 1日

ポインタが教えてくれるもの

C/C++ほどの歴史とユーザ規模を持つ言語になると、ひとつ何か指南を書いて解説を施すと、それがAの流派に適ってはいてもBのそれとぶつかったりと、セクト化が深いところまで進行しておりひとたび発火すればそれはもう素晴らしい花火が打ち上がるものです。LL系諸語を1セクト分として見ることもまたできますね。

そうした中では、あらゆるセクトや流派を超えて一つの真理の元に連帯するという経験が少なくなってきており、行き着く先は矮小化された世界の中で満足する井の中の蛙的狭小なエンジニアの大量生産であり、非常に由々しき事態に他なりません。

本案件におきましては、万人が見て即「うわっやべえ」と言わせうるような普遍的な問題や表象は現今においても依然として存在し、世にあまねくエンジニアは狭小な世界を超えて団結しつづけてゆかねばならないことを教えてくれるものであり、我々の胸に強く刻み込まれるべく立ち上った現代のオベリスクであると言えましょう。

http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
C/C++のポインタの機能--参照渡しのような処理 - builder by ZDNet Japan

しかしこの記事を糸口として、この著者の他の記事への類焼はもはや避けられず、一連の記述は信頼の置けないものとみなされている様子が見てとれます。最初はC/C++の歴史や発展経緯という比較的当たり障りのないネタだったために右から左されていたと見るべきで、この状況を放置すればただの延髄の的としかなりません。著者は本来Java/Seasar等他分野をメインとして持っているようで、下手をすればそちらの信頼性まで疑われることにもなりかねず、編集部様におかれましては細心の注意を持って対応を進めていただきたいと切に願うばかりです。

最大の謎は、そのような規模最大級のユーザ数を持つC言語の解説記事を作成するにあたり、何故よりによってこんな○んこをつかんでしまったか、というところなのですが、そこはもしかしたら編集部の闇として触れないでおいたほうがいいのかもしれません。んがぐぐですね。