Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

自習メモ〜メッセージパッシングをもうちょっと確認

公開されているpdfで頭が煮えてきたメッセージパッシングをもうちょっとやってみました。「困ったらマニュアル」ということで、http://www.erlang.org/doc/doc-5.5.4/doc/getting_started/part_frame.htmlhttp://www.erlang.org/doc/doc-5.5.4/doc/getting_started/conc_prog.html#3を読みながらサンプルを入力・実行して確認。

%
% @see http://www.erlang.org/doc/doc-5.5.4/doc/getting_started/conc_prog.html#3.2
%
-module(tut15).
-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("ping finished~n", []);
ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).

pong() ->
    receive
        finished ->
            io:format("pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    Pong_PID = spawn(?MODULE, pong, []),
    spawn(?MODULE, ping, [3, Pong_PID]).

2つのプロセスがメッセージを送受信し合うサンプルですが、だいぶ理解が進んだ感じです。「メッセージ=文字列」みたいな固定観念があった模様。また、これをやったあとに前回のサンプルを見直してみましたが、頭が煮えることなくコードを追えました :-)
まあ、まだ行末にセミコロンを打ってしまうのは、しょうがないなぁ。。。

自習メモ〜プロセス名の登録

前のエントリに続いて、Erlangマニュアルをやってみました。3.3 Registered Process Namesです。

%
% @see http://www.erlang.org/doc/doc-5.5.4/doc/getting_started/conc_prog.html
%
-module(tut16).
-export([ping/1, pong/0, start/0]).

ping(0) ->
    registerd_name ! finished,
    io:format("ping finished~n", []);
ping(N) ->
    registerd_name ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1).

pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.

start() ->
    register(registerd_name, spawn(?MODULE, pong, [])),
    spawn(?MODULE, ping, [3]).

へぇ、GLOBAL変数っぽく使えるんだ。多用すると大変そうだけど、便利だ。
上のサンプルはマニュアルそのままではなく、registerした名前が分かるよう「registerd_name」に変えてあります。ちなみに、register/2のリファレンスは以下。

PHPで刺激を求めるには?

もう、id:MugeSoさんが書かれているとおりです。


PHP extensionは開発言語こそC/C++などでありPHPではありません。しかし、一度作ればPHPの一部となりPHP環境そのものに溶け込んでいき、PHPから使うことができるのです。PHPerは新しいextensionを開発したり見つけたりすることでPHPerとしての道*1を歩みながら、知的刺激も得ることができるのではないでしょうか。

先日のエントリのコメントid:MugeSoさんとやりとりしたあと、一服しながら後輩と話をしながら考えてました。以下散文気味で。。。

やはり、PHPって「extensionありき」なんですよ。それも充分にそろっていて、「ほとんど何でもできる」ぐらい。PECLに登録されていないextensionを含めると、相当数あると思います。一介のPHPerとしてPHPを見たときも、extensionは「バージョンが変わると云々」を上回るメリットや可能性があると思っています。先日のPHP勉強会でhaltさんがlibusbのバインドを書いてミサイル飛ばしてましたが、そういったこともできるわけです。
なので、そこが一番面白いと思うし、できれば自分でも何か作ってみたいと思っていて、PEAR::CodeGen_PECLに手を出してみたり*1PHPで拡張しているわけではない(基本的にC/C++)ですが、最終的にPHPと一体になる。最初は大したextensionでなくても、「拡張すること」が実感できます。それが、dankogaiさんが書かれた


プログラマーがプログラムを続けるための一番のご褒美

なんじゃないかと思います。
個人的には、決められた環境(機能用件とか実装内容とか)でプログラミングするのが最近苦痛で、dankogaiさんが書かれたとおり、


PHP「環境」に用意された車輪を使い続ける

という感覚に近いものがあります。どうせPHP使うならもっと面白いことやりたいし、先日のエントリのコメントにも書いてますが、


PHPってSimplateSimframeみたいなある種の「勢い」というか「割り切り」がないと面白くないよなぁ

というのを感じています。今は(というか今後も)そこに注力したいなぁ。

ま、その前にCのスキルを上げなきゃね orz

*1:まだlibuuidのバインド程度ぐらいですが

第24回PHP勉強会

今夜はPHP勉強会。会場はサイボウス・ラボさんです。ありがとうございます。
19:00頃出発予定で、いつも通り、半リアルタイム(?)で現地レポートする予定です。あと、懇親会も :-)


日時:2007年5月24日(木)20:00 - 22:00(1時間延びた)
会場:サイボウズラボ

おおっ!トラックバックできるようになってる! > events.php.gr.jp
haltさん、ありがとうございます :-D

Yahoo!がPHPエンジニアを雇う時に聞く質問

via.Yahoo!がPHPエンジニアを雇う時に聞く質問 | IDEA*IDEA

とりあえず適当に訳してみました。間違いがあれば指摘をお願いします :-)
1.配列usersに「john」を追加しないのはどれか?

1. $users[] = ‘john’;
2. array_add($users,’john’);
3. array_push($users,‘john’);
4. $users ||= ‘john’;

2. sort(), assort(), ksort()の違いを述べよ。また、どういった状況で利用するかを述べよ。
3. 以下のコードは何を出力するか?それはなぜか?

$num = 10;
function multiply(){
    $num = $num * 10;
}
multiply();
echo $num;

4. 参照と通常の変数の違いを述べよ。また、どのように参照渡しをするか、なぜそうするかを述べよ。
5. 実行中のスクリプトにライブラリコードを追加する関数は何か?
6. foo() と @foo()の違いを述べよ。
7. あなたがどのようにPHPアプリをデバッグしているかを述べよ。
8. 「===」は何をするか? 「==」がtrueを返し「===」がtrueを返さないサンプルを示せ。
9. メソッドやプロパティを持たないクラス「myclass」はどのように宣言するかを示せ。
10. 「myclass」のインスタンスをどうやって生成するかを述べよ。
11. どうやってクラスのプロパティにアクセスしたり値を設定するかを述べよ。
12. includeとinclude_onceの違いを述べよ。また、includeとrequireの違いを述べよ。
13. ブラウザに新しいページにリダイレクトさせるための関数は何か?

1. redir()
2. header()
3. location()
4. redirect()

14. ファイルを読み書きするため、ファイルを「開く」関数どれか?

1. fget();
2. file_open();
3. fopen();
4. open_file();

15. mysql_fetch_row()とmysql_fetch_array()の違いを述べよ。
16. 以下のコードは何をするか?起こっていることを説明せよ。

$date=’08/26/2003’;
print ereg_replace(“([0-9]+)/([0-9]+)/([0-9]+)”,\\2/\\1/\\3,$date);

17. $stringにテキストが代入されているとき、HTMLタグを全て除去する正規表現はどのように書けば良いか?
18. PHPPerlにおいて、配列とハッシュの扱い方の違いを述べよ。
19. HTTPのステートレスな性質を避ける方法を述べよ。
20. GDライブラリは何をするかを述べよ。
21. HTMLコードブロックを出力するいくつかの例を挙げよ。
22. PHPPerlより優れているか、論じよ。


最後の問いは、やはり激論になるのか。。。?

第24回PHP勉強会 - ネタ発表します

Twitter APIGraphViz一発ネタ」ということで発表します。プレゼン資料はevents.php.gr.jpからダウンロードできます。


Twitter APIGraphViz一発ネタ

「一発ネタ」なので、内容は全然大したことありません ;-)

第24回PHP勉強会 - 君はまたextensionか(PECL_CodeGenでC++するとハマる件)

第24回PHP勉強会の発表内容ダイジェスト。
haltさん。

  • extension使えば、「PHPでも何でもできるよ」
    • ミサイルランチャー登場!「発射ぁ!」
    • 車は動かせないよなぁ(笑
  • 「何でもやろう」とする人が少ないんじゃね?
  • PEAR::CodeGen_PECLおさらい
    • 「コピペでOK」よ!
    • FizzBuzzのextension
  • FizzBuzzだったら10秒でいけるぜ!(笑
$ php -r 'fizzbuzz();'

第24回PHP勉強会 - 携帯とPC両対応システムの構築

第24回PHP勉強会の発表内容ダイジェスト。
野間さん。

  • 印刷資料だ!「今日5時ぐらいからやってました」
  • テンプレートは共通。分けるところだけ分ける
  • 1カ所のフィルタでタグ除去とか絵文字変換とか
  • mod_rewriteを使って画像をハンドリング
  • デザインはヘッダ・共通メニュー・共通コンテンツ
  • PCはCSSでデザイン。アイコンも含め
  • 携帯はfontタグでデザイン
  • 来月新会社立ち上げますっ!(2007/6/1登記予定)
  • Smartyですか?」「いや、そもそもPerlで、一部PHPです」(笑

第24回PHP勉強会 - 飛び入りデモ

西尾さん@サイボウズ・ラボ。

  • Python使いだそうです
  • デモ
    • Javaアプリで、グラフを表示。説明しにくいけど、すごいこれ!
    • 「7つの辺を持つ図形」を表示するアプリで、中心から「もわ〜っ」と広がっていく感じ。動きがバネみたいw
    • XML-RPCで公開してるので、Pythonじゃなくても良いですよ

第24回PHP勉強会 - Twitter API+GraphViz一発ネタ

第24回PHP勉強会の発表内容ダイジェスト。
shimooka。

第24回PHP勉強会 - プレゼン終了

まったり事務連絡&座談会中。

  • ウィルスチェックのextensionもあるらしい
    • CramAVだっけかな?
  • 「なぜTx?」「作者さんに振り向いてもらいたかったから」(爆

本日はこれにて終了。お疲れさまでした〜。
ということで、今から懇親会です :-)