progの最近のブログ記事

先日から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直下にも生成されていた不思議。しかもダメだったときのファイルツリーとほぼおなじタイムスタンプで。そりゃ、どうもならんですわ。

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

で、一連のベンチマーク結果のグラフ化に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);
 	});
 	

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

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

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

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

Intermezzo 0.7.0 リリース

| コメント(0) | トラックバック(0)

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

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

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

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

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

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

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

ポインタのようなもの

| コメント(0) | トラックバック(0)

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

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++は避ければいい」って結論に持って行けるし、その方が健全だろうな。

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言語の解説記事を作成するにあたり、何故よりによってこんな○んこをつかんでしまったか、というところなのですが、そこはもしかしたら編集部の闇として触れないでおいたほうがいいのかもしれません。んがぐぐですね。

MT4のブックマークレット

| コメント(0) | トラックバック(0)

たぶん自作すればMT3.xの頃でもできてたはずなんだけど、MT4にしたら標準でブックマークレットが付いてきたのでいれてみた。url引き回して記事投稿するのがだいぶ楽になったすよ。

javascript:d=document;w=window;t='';if(d.selection)t=d.selection.createRange().text;else%7Bif(d.getSelection)t=d.getSelection();else%7Bif(w.getSelection)t=w.getSelection()%7D%7Dif(t!='')t='\n%3Cblockquote%3E\n'+t+'\n%3C/blockquote%3E';void(w.open('http://somewhere/path/mt.cgi?__mode=view&_type=entry&blog_id=1&convert_breaks=0&qp=1&text='+encodeURIComponent('%3Cp%3E\n%3Ca%20href=%22')+d.location.href+encodeURIComponent('%22%3E')+encodeURIComponent(d.location.href)+encodeURIComponent('%3C/a%3E%3Cbr/%3E\n')+encodeURIComponent(d.title)+encodeURIComponent('\n%3C/p%3E\n')+encodeURIComponent(t),'_blank','scrollbars=yes,status=yes,resizable=yes,location=yes'))

このアーカイブについて

このページには、過去に書かれたブログ記事のうちprogカテゴリに属しているものが含まれています。

前のカテゴリはnetworkです。

次のカテゴリはsocialです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.04