個人的には一人暮らしじゃなくなったのと、三度目の転職をして、インフラの仕事もするようになったのが大きい出来事でした。
来年もよろしくおねがいします。
古くなったため、書き直しました。
転職祝いの積読本がようやく消化できました。
ノンフィクションながら展開が面白くもあり、全然知らなかった現在のサイバー犯罪の状況がいろいろとわかって勉強にもなった。
PHP でスレッドを使いたいとお嘆きのあなたは使ってみるといいんじゃないかな。
マニュアルは公式サイトの方が読みやすいと思われる。
残念なことに使用するには --enable-maintainer-zts を有効にして再ビルドする必要がある。
--enable-maintainer-zts Enable thread safety - for code maintainers only!!
phpbrew の場合は -- オプションで configure への引数を追加できる。
% phpbrew install php-5.4.7 -- --enable-maintainer-zts
zts を有効にしたら pecl でぶっこみます。github から archive を持ってくる必要なんてなかったんや...。
% pecl install pthreads-beta
あとは Thread クラスを継承したクラスを書くだけです。ね?簡単でしょ?
% php ./ThreadExample.php ID[4340998144] : start & sleep ID[4342120448] : start & sleep ID[4343242752] : start & sleep ID[4344365056] : start & sleep ID[4345487360] : start & sleep ID[4345487360] : done ID[4346609664] : start & sleep ID[4347731968] : start & sleep ID[4348268544] : start & sleep ID[4349128704] : start & sleep ID[4349988864] : start & sleep ID[4343242752] : done ID[4340998144] : done ID[4346609664] : done ID[4348268544] : done ID[4349128704] : done ID[4349988864] : done ID[4344365056] : done ID[4342120448] : done ID[4347731968] : done %
【追記】ブクマがそこそこあったので補足しておきますが、run() の中で date() を呼んだら Segmentation Fault が発生したり、property を定義しても何故か未定義になってしまうので、まだまだ実用はできない状態です。
引き続き転職祝いにもらった本を読んでた。
Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)
ひと通り読んでみて、思ってたよりも知ってたことが多かった。その分、web プログラマとしての経験が積めていたとポジティブに捉えることにする。
また、後半からは Perl のライブラリや Hadoop のマニュアルみたいな内容が増えてきて、個人的にはちょっと肩透かしなところもあったなあと感じた。
昔、とある業務で複数のファイルおよびアーカイブをアップロードしてもらって、それらをデータベースの内容と比較して、結果を表示するというフォームがあったのだが、それの利用者がアーカイブを一度展開して、それの中身を他のファイルと同じディレクトリに置いて、再度圧縮するという手間のかかることをやっていた。
それを見て、本当にこのフォームをつくったのは 自分の不勉強をクライアントの負担に勝手に転嫁するクソ まだまだ功夫が足りないエンジニアだなと思い、「全部を何も考えず一つのアーカイブに突っ込んだら、あとはよしなにしてくれるメソッドがあればいいんじゃね?」とカッとなって書いた。
それにしても File_Archive は strict にすると警告がいっぱいでるあたりが PHPUnit 泣かせである。他のライブラリをバックエンドにできないか探してみることにする。
とある事情でテスト用のテーブルフィクスチャを読み込むことが csv から直接できなかった (PHP array にする必要があった) ため、用意していた csv を json に変換するツールを探した。
rubygems にも 同名のパッケージ があったが、インストールしてもパス周りに設定が上手くできなかったため、諦めて C で書かれているこちらを使った。
ちなみにそのままコンパイルしたツールに吐かせた json を PHP の json_decode しても null を返すため、ツールに若干の修正が必要であった。(理由は以下のとおり。)
<?php // 以下の文字列は JavaScript としては有効ですが JSON としては無効です // 名前と値はダブルクォートで囲む必要があります // シングルクォートは使えません $bad_json = "{ 'bar': 'baz' }"; json_decode($bad_json); // null // 名前をダブルクォートで囲まなければなりません $bad_json = '{ bar: "baz" }'; json_decode($bad_json); // null // 最後にカンマをつけてはいけません $bad_json = '{ bar: "baz", }'; json_decode($bad_json); // null ?>
要するに名前の方もダブルクオートしないといけない。
さっそく転職祝いでもらったリーダブルコードを読破した。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
自分の過去のコーディングを思い返してみると、項目の半分くらいは以前から気をつけて書いていたが、もう半分くらいは徹底できてなかったなあという感想。
今日から通勤電車でまとまった時間がとれるようになった&混雑もそれほどしていないので、本を読めるようになった。
おかげでじわじわたまってた積読本を消化できそうな気がする。
さっそく中断してた本を一冊倒すことができた。
明日からもじゃんじゃん読破していきたい。
音楽の方向性の違いによりバンドを会社を 8 月末で脱退しました辞めました。
長い間、ご愛読ありがとうございました。
いけむらさん先生の来世にご期待ください。
gh-pages に setup.bz2 とバイナリパッケージツリーを置いて setup.exe から見えるようにしたら package repository にできるんじゃないかと思ったので、ImpArt » github-pageつくってみた に書いてあるとおり gh-pages ブランチを push したら setup.exe からアクセスすることができることは確認した。
しかし、手元のパッケージツリーは 1.8G あり、これを一回で commit & push しようとすると当然ながらデカすぎて timeout するというわけであっさり断念した。ちなみに一個一個パッケージをアップロードすれば、たぶんできるが、何時間かかるかわからないし、短期間に 800 以上の log が follower のみなさんの TL に流れるのもアレだと思った上に「バイナリをリポジトリに置くような奴の今週の餌はスイカの種だけな」というお叱りを受けましたので、自粛することにしました。
@fd0 お前今週の餌、スイカの種だけな
— ハトさん (@rosylilly) 8月 21, 2012
funcall は任意の関数の前後に callback を追加することができる PECL である。
使い方は以下のとおりである。
実行結果は以下のとおりである。
% php ./funcall.php pre require_once (/Users/fd0/.phpbrew/php/php-5.3.15/lib/php/OS/Guess.php) post require_once (/Users/fd0/.phpbrew/php/php-5.3.15/lib/php/OS/Guess.php)
Eclipse を全画面で使っている時に Cygwin のコマンドを叩こうと思って、前面に持ってくると、今度は参照しようと思ってた領域に出てきてしまって、マウスで Cygwin のターミナルを移動させる手間が発生して、ストレスで(」・ω・)」うー!(/・ω・)/にゃー!ってなるのが嫌だったので、Eclipse に組み込めないかなと調べた。
まず cygwin の sshd を起動する。
次に Eclipse にターミナルを入れる。
ターミナルから localhost に ssh で接続したら簡単にできた。
ここ何年かはエディタやブラウザに VL Gothic Font Family や M+ OUTLINE FONTS を使っていたが、流行りの Ricty に変えてみようと思った結果、fontforge や github からスクリプトを持ってくるのがめんどいなあと思ってしまい、Miguフォント : M+とIPAの合成フォント に落ち着いた。
PHP では array はキーに object をとることができない。
array や object は、キーとして使えません。 キーとして使おうとすると Illegal offset type という警告が発生します。
そのため、キーに object をとることができる標準クラスがある。
SplObjectStorage クラスは、オブジェクトをデータに対応させたり、 データを渡さずオブジェクトセットとして使用したりします。
けれども、このクラスは個人的に気持ち悪い。
それは Map としても Set としても使えるということである。
元々 Map の実装であるが、キーの object に対して、値を null で保持することで Set を実現しているらしい。
あと、Map として使う場合に foreach も気持ち悪くなる。
$map = new \SplObjectStorage(); $key1 = new stdClass(); $map[$key1] = 'value1'; $key2 = new stdClass(); $map[$key2] = 'value2'; foreach ($map as $key => $value) { var_dump($key, $value); }
これを実行すると以下のような出力となる。
int(0) class stdClass#2 (0) { } int(1) class stdClass#3 (0) { }
キーと値をきちんと舐める場合は以下のように書かないといけない。
foreach ($map as $value) { var_dump($value, $map[$value]); }
ちなみに key() をオーバーライドして object を返すように定義すると、上述の通り Illegal offset type と怒られる。><
オレオレ実装で Map として気持良く使わせたい場合にはどうすればよいだろうと考えてみたら、each() メソッドをつくってあげるのが良いのではないかと思った。