古くなったため、書き直しました。
通勤電車で本を読む (4)
転職祝いの積読本がようやく消化できました。
- 作者: ジョセフ・メン,福森大喜,浅川佳秀
- 出版社/メーカー: 講談社
- 発売日: 2011/10/13
- メディア: 単行本
- 購入: 2人 クリック: 30回
- この商品を含むブログ (9件) を見る
ノンフィクションながら展開が面白くもあり、全然知らなかった現在のサイバー犯罪の状況がいろいろとわかって勉強にもなった。
PHP の Thread を試してみる
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 を定義しても何故か未定義になってしまうので、まだまだ実用はできない状態です。
通勤電車で本を読む (3)
引き続き転職祝いにもらった本を読んでた。
Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)
- 作者: DeNA
- 出版社/メーカー: 技術評論社
- 発売日: 2012/06/13
- メディア: 単行本(ソフトカバー)
- 購入: 30人 クリック: 696回
- この商品を含むブログを見る
ひと通り読んでみて、思ってたよりも知ってたことが多かった。その分、web プログラマとしての経験が積めていたとポジティブに捉えることにする。
また、後半からは Perl のライブラリや Hadoop のマニュアルみたいな内容が増えてきて、個人的にはちょっと肩透かしなところもあったなあと感じた。
再帰的にアーカイブを展開するメソッドを書いてみた
昔、とある業務で複数のファイルおよびアーカイブをアップロードしてもらって、それらをデータベースの内容と比較して、結果を表示するというフォームがあったのだが、それの利用者がアーカイブを一度展開して、それの中身を他のファイルと同じディレクトリに置いて、再度圧縮するという手間のかかることをやっていた。
それを見て、本当にこのフォームをつくったのは 自分の不勉強をクライアントの負担に勝手に転嫁するクソ まだまだ功夫が足りないエンジニアだなと思い、「全部を何も考えず一つのアーカイブに突っ込んだら、あとはよしなにしてくれるメソッドがあればいいんじゃね?」とカッとなって書いた。
それにしても File_Archive は strict にすると警告がいっぱいでるあたりが PHPUnit 泣かせである。他のライブラリをバックエンドにできないか探してみることにする。
csv2json
とある事情でテスト用のテーブルフィクスチャを読み込むことが 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 ?>
要するに名前の方もダブルクオートしないといけない。
通勤電車で本を読む (2)
さっそく転職祝いでもらったリーダブルコードを読破した。
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 49人 クリック: 1,514回
- この商品を含むブログ (68件) を見る
自分の過去のコーディングを思い返してみると、項目の半分くらいは以前から気をつけて書いていたが、もう半分くらいは徹底できてなかったなあという感想。
通勤電車で本を読む
今日から通勤電車でまとまった時間がとれるようになった&混雑もそれほどしていないので、本を読めるようになった。
おかげでじわじわたまってた積読本を消化できそうな気がする。
さっそく中断してた本を一冊倒すことができた。
- 作者: 和田卓人,Kevlin Henney,夏目大
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/12/18
- メディア: 単行本(ソフトカバー)
- 購入: 56人 クリック: 1,989回
- この商品を含むブログ (320件) を見る
明日からもじゃんじゃん読破していきたい。
いけむらさん、会社辞めるってよ
音楽の方向性の違いによりバンドを会社を 8 月末で脱退しました辞めました。
長い間、ご愛読ありがとうございました。
いけむらさん先生の来世にご期待ください。
- 作者: 朝井リョウ
- 出版社/メーカー: 集英社
- 発売日: 2010/02/05
- メディア: 単行本
- 購入: 3人 クリック: 127回
- この商品を含むブログ (75件) を見る
Github Pages を cygwin binary package repository にしてみる
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
funcall は任意の関数の前後に callback を追加することができる PECL である。
- PECL :: Package :: funcall
- funcall - A php extension which can add callbacks for any function/method - Google Project Hosting
使い方は以下のとおりである。
実行結果は以下のとおりである。
% 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 を起動する
Eclipse を全画面で使っている時に Cygwin のコマンドを叩こうと思って、前面に持ってくると、今度は参照しようと思ってた領域に出てきてしまって、マウスで Cygwin のターミナルを移動させる手間が発生して、ストレスで(」・ω・)」うー!(/・ω・)/にゃー!ってなるのが嫌だったので、Eclipse に組み込めないかなと調べた。
まず cygwin の sshd を起動する。
次に Eclipse にターミナルを入れる。
- Target Management Home page
- Eclipse 上で Target Management (RSE) を使って SSH / FTP / Telnet ターミナルを動かす - Tosshi Note
ターミナルから localhost に ssh で接続したら簡単にできた。
Migu フォントを使ってみた
ここ何年かはエディタやブラウザに VL Gothic Font Family や M+ OUTLINE FONTS を使っていたが、流行りの Ricty に変えてみようと思った結果、fontforge や github からスクリプトを持ってくるのがめんどいなあと思ってしまい、Miguフォント : M+とIPAの合成フォント に落ち着いた。
SplObjectStorage について考えてみた
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() メソッドをつくってあげるのが良いのではないかと思った。
新・unable to remap が rebase で解決しなかった時の話
近頃のパッケージツリーでは setup.exe で新しい lib*.dll がインストールされると、ほぼ確実に autorebase が postinstall で動いてしまい、どの都度 unable to remap 地獄に突入することになる。
前回 offset がぶっ壊れた DLL を再インストールして、丁度良い offset を探せば良いと書いたが、どうも rebase 再実行はしなくても動くっぽいことがわかった。
というわけで unable to remap が発生したら
- libgcc1
- libiconv2
- libncursesw10
- libreadline7
を再インストールしてやれば少なくともシェル起動まではいけるはずなので、あとは必要に応じて、怒られる DLL を再インストールしてやれば、普通に使えるようにはなるはずである。