PHPカンファレンス関西の懇親会でLTしてきました

関西で初のPHPカンファレンス!これは参加せねばなるまい!ということで、PHPカンファレンス関西に参加してきました。
このところ仕事が忙しかったこともありLTの準備もできていなかったのですが、 id:cocoitiウノウラボ記事にインスパイアされて「Brainf*ckで犬語」を実装→発表と相成った次第であります。


BFのPHP実装としては既にBrainPhackがあります。
しかし、それを使うだけではネタとして弱いのでフルスクラッチで実装です。
車輪の再発明が悪とはよく言われますし、そのとおりだと思います。
しかし車輪を自分で作ることで得られる知見があることもまた真実・・・かと思いきや、そんなことはなかったw


余談はさておき、ソースコードGitHubリポジトリを作ったので下記リンクよりご覧ください。
https://github.com/rsky/phpkansai-party-lt


これを用いて昨日のエントリの内容を実行してみましょう。

<?php
$dog = new BrainDog();
$dog->bow('わんわん(中略)ばう');

PHPCon関西さいこう!


PHPカンファレンス関西実行委員会のみなさま、お疲れ様でした!
とても楽しかったです!
ドラ娘かわいかったです!

きゃんきゃん

元ネタは ウノウラボ by Zynga Japan: わんわん

わんわん
わんわんわうわおんわんわんわんわんわーんきゃんきゅーんわおんわうわおんわんわんわんわんわんわーん
きゃんきゅーんわおんばうきゃんきゃんきゃんきゃんきゃん
きゃんきゃんきゃんばうわんわんわんわんわん
わんわんわん
ばうきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんばうわーんわんわんわん
わんわうわおんわんわんわんわんわんわんわんわんわんわんわん
わーんきゃんきゅーんわおんばうきゃんばうわーんわんわんわんわうわおんきゃん
きゃんきゃん
きゃんきゃんきゃんきゃんきゃんきゃんきゃんわーんきゃんきゅーんわおんきゃんきゃんわうわーんわんわんわん
わーんわんわんわおんわおんきゃんきゅーんわーんきゃんばうわーんきゃんきゃんきゃんきゃんきゃん
きゃんばうわんわんわん
わんわんわんわんわんわんわんわんわんばうわおんきゃんばう
わーんわんわんわん
ばうわおんわおんわんわんわんわんわんわんわうわーんわーん
わんわんわんわんわおんわおんきゃんきゅーん
わーん
わーんわんわんばうわおんきゃんきゃんきゃんきゃんきゃんばうわおんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃん
わうわーんわーんきゃんきゃんきゃんきゃんきゃんきゃんきゃんきゃんわおんわおんわんきゅーんわーんわーん
わんわんばうわおん
わおんわんわんわんわんわうわーんわーんわんわんわんわんわんわおんわおんきゃんきゅーんわーんわーん
ばうわおんばうわおんわんわんわんわんわうわーんわーんきゃんきゃん
きゃんきゃんきゃんわおんわおんきゃんきゅーんわーんわーんばうわんわんわん
ばうわおんばうわーん
きゃんきゃんきゃんばうわおんわおんわんわんわんわんわうわーんわーんわんわんわん
わんわんわおんわおんきゃんきゅーんわーんわーん
きゃんきゃんばうわおんばうわおんわん
わんわんわんわうわーんわーんきゃんきゃんきゃんきゃんきゃんわおんわおんきゃんきゅーんわーん
わーんわんわんばうわんわんわんわんわんばうわうきゃんきゅーん
わんわんわんわんわんわうわおんわおんわんわんわんわんわんわんわーんわーんきゃんきゅーんわおんわおん
わん
わんわんばうわーんわーんわん
わんわんわんわんわうわおんわおんきゃんきゃんきゃんきゃん
わーんわーんきゃんきゅーんわおん
わおんきゃんきゃん
きゃんばう

ネタバレは明日

書き初め

1月2日ということでブログの書き初めをする。

昨年後半を振り返って

PHPカンファレンス2010PHPMatsuriに参加した

9月末-10月頭にかけて東京でPHPのイベントに参加した。
PHPの「いま」に触れることができたのはもちろん、東京近郊だけでなく、地方から来られている方とも知り合いになれて良かった。
PHPカンファレンスの懇親会ではPHPの生みの親であるRasmus氏とお話しする機会があったのに上手く伝えたいことが言えず、もっと英語力をつけないといけないなと思った。
両イベントの間の1週間は東京観光・・・は、ほとんどせず、家を探したり会社訪問をしたりしていた。

ジンガジャパンに入社した

その後、特に紆余曲折もなくジンガジャパン株式会社に入社した。
なにげに齢30にして初の会社勤めなので内心は不安だったのだけど、意外なほどチームにもすぐ馴染め、元気にやっている。
入社以前から面識のあった id:cocoiti や、はてなTwitterでやり取りがあった id:hiro_y がいてくれたおかげで気持ちに余裕があったのだと思う。

ジンガはこんな会社だった

フラット。そしてスピードが速い。
僕が入った時には100人近くの規模になっていたはずだけど、CEOから新人まで全員がパーティションのないオフィスにいる。必要とあらば誰にでもすぐ質問できる環境。
会社としてはウノウのやり方とジンガのやり方が混在している状況らしい。これから熟成されてジンガジャパンのやり方になっていくのだろう。とても楽しみだ。
Zynga USAから出向している人が何人かいて、彼らとコミュニケーションするために通訳さんが数人いたり無料で英語レッスンが受けられたりする。
社内公用語は普通に日本語だけど、USの人たちと交流するために英語は上達したい。しかし彼らの日本語習得スピードには驚かされる。
あとIT系ベンチャー企業としては女性比率が高いらしい。僕は比較対象となる他社の実態をあまり知らないので本当かどうかよく分からない。
ついでに言うとリア充が多い。確かめた訳ではないが、みんな公私共に充実しているような雰囲気。ちゃんと休める会社だからかな。

gihyo.jpの連載を再開した

長らく中断していたgihyo.jpの連載を再開させていただいた。
PHPエクステンションを書く人たちのためになる、いい記事を書いていきたい。

今年のこと

ソーシャルゲーム開発者として

全く経験のなかったモバイル・ソーシャルゲームの会社に入ったわけだけど、プラットフォームや端末の作法さえ理解してしまえば、プログラムを書くこと自体は難しくない、と感じている。
難しいのは多くの人に遊んでもらえる、楽しいゲームを作ること。そしてそれが利益を生み出すこと。
道楽でやっている訳ではないので収益にはこだわる必要がある。いちばんこだわるのはアクティブユーザー数だけど。
無料でも十分に楽しく遊べて、かつ課金で得られる満足もある、その最適なバランスを求めていきたい。
ジンガのFacebookアプリ、特に最新のCityVilleはそのあたりが素晴らしいと思う。
日本市場で、(少なくとも今は)FlashLiteで、どこまでのものができるか。今年は挑戦の一年になる。

いちプログラマとして

インプット・アウトプットともに長い休みがあった。今年は古典技術から新技術まで貪欲に学んでいきたい。
自分ならではの新技術を編み出したい、という欲求は強くて、そのためにも古典的なアルゴリズム等で基礎を固める必要がある。
あと東京に来て大きく変わった事といえば泊まりがけでなくても勉強会に参加できるようになったという事もある。
昨年11月に引っ越してきてから、まだpixiv Tech Meetingに参加しただけだが、今年は積極的に勉強会に参加したり勉強会を開催したりしたい。

さくらのVPSにUbuntu 10.04 LTSをインストールしてみた

さくらのVPSクローズドベータを再募集していたので、応募しました。
デフォルトのOSはCentOS 5.5の64bit版ですが、さくらのVPSを Debian GNU/Linux にする を参考に、Ubuntu 10.04 LTSがインストールできたので、その方法を記しておきます。
・・・といっても、上記リンク先とはインストーラーのダウンロードURLが違うぐらいなので、要点だけ。

ネットワークの設定確認

Ubuntuをインストールする前に、予めネットワークの設定をメモっておきます。
IPアドレスとネットマスクは ifconfig eth0ゲートウェイroute、ネームサーバーは cat /etc/resolv.confで、それぞれ確認します。

インストーラーの取得と展開

Ubuntu 10.04 LTS (Lucid Lynx) の64bit版をダウンロードし、/boot 以下に展開します。

cd /tmp
curl -O http://archive.ubuntu.com/ubuntu/dists/lucid/main/installer-amd64/current/images/netboot/netboot.tar.gz
mkdir /boot/ubuntu-netboot
tar xfzv netboot.tar.gz -C /boot/ubuntu-netboot

ブートローダーの設定

/boot/grub/grub.conf に以下の内容を追記します。

title Ubuntu 10.04 LTS install
root (hd0,0)
kernel /ubuntu-netboot/ubuntu-installer/linux ro root=LABEL=/ console=tty0 console=ttyS0,115200n8r
initrd /ubuntu-netboot/ubuntu-installer/initrd.gz

インストール

ここまでの作業はsshでもできますし、sshでしたほうがコピペもできて楽だと思います。
が、インストールはVPSコントロールパネルのリモートコンソールから行わないといけません。
リモートコンソールでrootログイン後、reboot、「Press any key to continue.」とメッセージが出たらエンターキーでも押して、もう一回「あとn秒でCentOSが起動」的なメッセージが出るのでもう一回エンター、カーソルキーで「Ubuntu 10.04 LTS install」を選んでエンターでインストールが始まります。
(以下うろ覚え)
あとは案内に従えばインストールできると思いますが、ネットワークの設定をミスっていると「Bar archive mirror error」となり、ダウンロードに失敗します。
また、インストールの最後の方で「Basic Ubuntu server」「LAMP server」等を選ぶ項目が出てきます。僕はとりあえず最小限の「Basic Ubuntu server」だけ選びましたが、リモートコンソールでログインして sudo aptitude install openssh-server する手間を考えると、「OpenSSH server」も選んでおいたほうが良かったと思いました。(Webベースのリモートコンソールは使いづらいので)

Pirumを使ってみた

先日から公開を始めたPEAR(PECL)チャンネルでは、チャンネルサーバーの管理にPirumを使っています。
元々はChiara_PEAR_Serverを使おうとしていたのですが、インストール後のスクリプトがうまく動かずにコードを追っかけていたところ、@iteman 先生に「PHPUnitが移行したやつを使ってみてはどうか」と勧められたのがPirumを知ったきっかけでした。
“Pirum”はラテン語で“梨の実”という意味らしく、“PEAR”そのまんまですね。公式サイトの画像がなぜナスなのかは定かではありません。


以下に公式サイトの紹介文を和訳してみました。

Pirum is a simple and nice looking PEAR channel server manager that lets you setup PEAR channel servers in a matter of minutes. Pirum is best suited when you want to create small PEAR channels for a few packages written by a few developers.
Pirumはわずか数分でPEARチャンネルサーバーをセットアップできる、シンプルで見た目の良いPEARチャンネルサーバー・マネージャーです。Pirumは少数のパッケージ・少数の開発者のためのPEARチャンネルを作るのに最適です。
Pirum consists of just one file, a command line tool, written in PHP. There is no external dependencies, no not need for a database, no need to setup credentials, and nothing need to be installed or configured.
Pirumの構成物はPHPで書かれたコマンドラインツールたったひとつです。外部依存、データベース、セットアップ証明書 (訳注: ここは訳が怪しいです。権限とした方が良い?)認証情報のセットアップ (意訳: ユーザー管理)*1、インストール・設定が必要なものは何もありません。

インストール

インストールはpearコマンドで行います。

$ pear channel-discover pear.pirum-project.org
$ pear install pirum/Pirum-beta

pirumコマンドはPEARのbin_dir*2にインストールされるので、bin_dirにパスを通すか、$(pear config-get bin_dir)/pirum を直接指定して使います。*3
引数無しでpirumを実行すると、使い方が表示されます。

$ pirum
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

サブコマンドはチャンネルサーバーを(再)構築する build と、パッケージを追加する add の2つだけと、非常にシンプルです。

チャンネルサーバーの構築

まずはチャンネルサーバー用のディレクトリとチャンネル定義のXMLを用意します。

$ mkdir pear
$ touch pear/pirum.xml
(pirum.xml を編集する)
$ cat pear/pirum.xml
<?xml version="1.0" encoding="UTF-8" ?>
<server>
  <name>pear.localhost</name>           <!--チャンネル名。pear channel-discover 等で使われる -->
  <summary>Local PEAR channel</summary> <!-- チャンネル概要 -->
  <alias>local</alias>                  <!-- name の別名 -->
  <url>http://pear.localhost/</url>     <!-- チャンネルサーバーのルートURI -->
</server>

次にbuildでチャンネルサーバーを構築します。

$ pirum build pear
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the build command:
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building releases
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command build run successfully

これでチャンネルサーバーの用意ができました。この例ではローカルにチャンネルを立てるようにしたので、httpdにバーチャルホストの設定をして再起動後、 http://pear.localhost/index.html の案内どおりにチャンネルを登録します。

$ pear channel-discover pear.localhost
Adding Channel "pear.localhost" succeeded
Discovery of channel "pear.localhost" succeeded

先にチャンネルを登録しておかないと、このチャンネル向けのパッケージが作成できないので注意してください。

$ pear package package.xml
Error: Unknown channel "pear.localhost"
Parsing of package.xml from file "package.xml" failed
Cannot package, errors in package file

パッケージの追加

詳細なパッケージの作り方は長くなるので、ここではPirumをローカルチャンネルに登録してみましょう。
まずはPirumのpackage.xmlを改変してパッケージを作ります。

$ pear download pirum/PIrum-beta
downloading Pirum-0.9.9.tgz ...
Starting to download Pirum-0.9.9.tgz (11,622 bytes)
.....done: 11,622 bytes
File /../Pirum-0.9.9.tgz downloaded
$ tar xfz Pirum-0.9.9.tgz
$ sed 's/pear.pirum-project.org/pear.localhost/g' package.xml > Pirum-0.9.9/package.xml
$ pear package Pirum-0.9.9/package.xml
Warning: Channel validator warning: field "date" - Release Date "2010-05-12" is not today
Package Pirum-0.9.9.tgz done

次にaddでパッケージを登録します。

$ pirum add pear Pirum-0.9.9.tgz

Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the add command:
   INFO   Parsing package 0.9.9 for Pirum
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building package Pirum
   INFO   Building releases
   INFO   Building releases for Pirum
   INFO   Building release 0.9.9 for Pirum
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command add run successfully

確認。

$ pear pear remote-list -c local
Channel local Available packages:
=================================
Package Version
Pirum   0.9.9

感想など

マジ簡単。それに尽きます。
チャンネルの管理をするマシンとチャンネルを公開するサーバーが異なる場合でも、FTPrsync等でディレクトリを丸ごと同期するだけです。データベースを使わないPirumのメリットと言えます。
その反面、リストや削除などのコマンドが実装されていない、パッケージの数に比例して再構築にかかる時間が増える設計になっている等、公式PEARチャンネルのような大規模なものには向いていません。あくまで小規模なチャンネル向きです。もっとも、ほとんどの場合はPirumで必要十分だとは思いますが。

TIPS

pirum.css

見た目のカスタマイズはpirum.cssで行います。通常はbuildで自動生成されるのですが、既にpirum.cssがある場合は上書きされません。

pirum.xml

公式サイトの説明にも<url>要素の中身は <url> http://pear.pirum-project.org/ </url> とスラッシュで終わっていますが、これだと書き出されるHTMLで http://pear.pirum-project.org//feed.xml のようにスラッシュが重複してしまいます。
これを避けるために僕のチャンネルやPHPUnitのチャンネルではURLの最後にスラッシュを付けないようにしています。
Pirumの現在のバージョンではこれで問題ないようですが、今後どうなるかは分かりません。

パッケージの削除

パッケージを削除するサブコマンドは実装されていませんが、パッケージファイルを手で削除したあとbuildすれば、パッケージを削除することができます。

$ rm -v pear/get/Pirum-0.9.9.t*
pear/get/Pirum-0.9.9.tar
pear/get/Pirum-0.9.9.tgz
$ pirum build pear
Pirum 0.9.9 by Fabien Potencier
Available commands:
  pirum build target_dir
  pirum add target_dir Pirum-1.0.0.tgz

Running the build command:
   INFO   Building channel
   INFO   Building maintainers
   INFO   Building categories
   INFO   Building packages
   INFO   Building releases
   INFO   Building index
   INFO   Building feed
   INFO   Updating PEAR server files
   INFO   Command build run successfully
$ pear clear-cache
reading directory /../pear/cache
123 cache entries cleared
$ pear pear remote-list -c local
No packages in channel

*1:id:fukken さんのご指摘により修正

*2:pear config-show で確認できます

*3:僕は/usr/local/binにpirumのシンボリックリンクを置いています