いけむランド

はてダからやってきました

通勤電車で本を読む (4)

転職祝いの積読本がようやく消化できました。

サイバー・クライム

サイバー・クライム


ノンフィクションながら展開が面白くもあり、全然知らなかった現在のサイバー犯罪の状況がいろいろとわかって勉強にもなった。

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)

Mobageを支える技術 ~ソーシャルゲームの舞台裏~ (WEB+DB PRESS plus)


ひと通り読んでみて、思ってたよりも知ってたことが多かった。その分、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)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)


自分の過去のコーディングを思い返してみると、項目の半分くらいは以前から気をつけて書いていたが、もう半分くらいは徹底できてなかったなあという感想。

通勤電車で本を読む

今日から通勤電車でまとまった時間がとれるようになった&混雑もそれほどしていないので、本を読めるようになった。
おかげでじわじわたまってた積読本を消化できそうな気がする。
さっそく中断してた本を一冊倒すことができた。


プログラマが知るべき97のこと

プログラマが知るべき97のこと


明日からもじゃんじゃん読破していきたい。

いけむらさん、会社辞めるってよ

音楽の方向性の違いによりバンドを会社を 8 月末で脱退しました辞めました。

長い間、ご愛読ありがとうございました。

いけむらさん先生の来世にご期待ください。


桐島、部活やめるってよ

桐島、部活やめるってよ

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 に流れるのもアレだと思った上に「バイナリをリポジトリに置くような奴の今週の餌はスイカの種だけな」というお叱りを受けましたので、自粛することにしました。


funcall

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 を起動する

Eclipse を全画面で使っている時に Cygwin のコマンドを叩こうと思って、前面に持ってくると、今度は参照しようと思ってた領域に出てきてしまって、マウスで Cygwin のターミナルを移動させる手間が発生して、ストレスで(」・ω・)」うー!(/・ω・)/にゃー!ってなるのが嫌だったので、Eclipse に組み込めないかなと調べた。

まず cygwin の sshd を起動する。


次に Eclipse にターミナルを入れる。


ターミナルから localhostssh で接続したら簡単にできた。


f:id:fd0:20120804163615p:plain

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() メソッドをつくってあげるのが良いのではないかと思った。