肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

PHPカンファレンス2013 で「PHPerのためのデータサイエンス入門」という話をしてきました #phpcon2013

先日 9/14 に行われた PHP カンファレンス2013 で「PHPerのためのデータサイエンス入門」という話をしてきました。

データサイエンスというと、おそらく、キモになるところは「モデリングと効果測定のところ」ではないかと僕は思っているのですが、実はデータサイエンスの守備範囲は非常に広く、扱う領域、知識の幅を必要とする分野です。特に、データサイエンスの領域はエンジニアリングの領域のみならず、ビジネスの領域も含むと思います。データを分析し、ビジネスに使える結果・モデルをどう得るか、それを出すためには、どういった結果が、ビジネスに効いてくるのか、それがわからなければいけません。エンジニアリングからビジネスまで、という領域に対して、業務上、コミットできる人は、世の中にそう多くは無いと思います (だからこそ、データサイエンティストというのは稀有な存在であり、今最も注目を集めているのでしょうね)

さて、そんな前置きはともかく、そうはいって、PHP で扱う領域は、主に、Web アプリケーションです。
Web アプリケーションを作る、というのは、サービスを作る、つまりそれはビジネスを作ることです。(まれに、楽しければそれで良い、という人もいるかとは思いますが、それはまた真かと思います。しかし、殆どの場合、それは長続きしないでしょう)

我々が日々開発をするアプリケーションにおいて、何を達成したいのか、それを使う人がどのように使ってくれるのか、どう使ってくれると、我々が達成すべきものに近づくのか、それを考えることは、いちエンジニアにとっても非常に重要なことです。
その足がかりとなるのが「自分の作ったアプリケーションを利用してくれるユーザの行動を分析する」ということになるかと思います。

データを分析する...
それを聞くと、一見、非常に難しく、専門的な知識を必要とするように思えるかもしれません (当然、突き詰めると、計算幾何学や統計的解析手法の知識が必要となる場面もあるでしょう)
しかし、データからユーザの行動を表したり、あるいはモデル化したりすることは難しくても、まず、自分たちのアプリケーションをどうのうにユーザが利用しているのか、知る手がかりを得ることは実は、簡単なことです。

その、まず第一歩を踏み出すための、入門の入門としてのお話をさせていただきました。

うん、なんかすでに文章なげえ。


ようするに「PHPer だろうが、手軽にデータ分析はじめてみようぜ」ってことなんですよ。

資料と補足

発表資料はこちら。


なぜ Treasure Data か

Treasure Data http://www.treasure-data.com/

正直、発表内容は、TD ありきです。
むしろおもいっきり宣伝しています。ちなみにお金は一切いただいておりませんw ステマのつもりはなくて、単に素晴らしいプロダクトをみんなに使ってもらいたいと思っているから紹介しています。

ちなみに、自社内でデータサイエンスチームを持ち、Hadoop エンジニアがいるような方 (会社) はターゲットから外れるかと思います。
本講演では「そんなリソースは無い」「Hadoop クラスタ管理したくない」「ログデータ収集とか作ってられない」それでも分析をしたい!というユーザに対しての1つの方法として、TD を提案しています。
(当然ですが、重要なログデータをどこまで他社サービスに載せられるかというところに関しては、一定の判断を要することになるかとは思います)

つまり、サービス開発を行い、ユーザのデータ分析を行う際に、データの集め方を考えたり、ストレージの増設に追われたり、Hadoop クラスタの管理に追われたりすることは、まったく本質的なビジネス活動とは程遠いところにあるため、リソースを持たない小さな会社でどれだけエンジニアの工数をそこに割くのか、という話なのです。

そんなコストを払わずに、誰かがやってくれるなら、任せてしまいたくありませんか?

我々は、本質的に、自分たちのアプリケーションに必要な開発に、より多くのコスト (エンジニアのリソース) をかけるべきだと思います。



だから、Treasure Data なのです。


(ちなみに、まぁ自社内で Hadoop クラスタを管理したり、データを貯めこんだりすることが本質的に必要な場合もあるでしょう。それはそういった場合があると思いますので、そういうエンジニアすべてを否定する意味ではありません)

あとがき

... なぜか後半無駄に熱く語ってしまいましたが、少しでも、思いが伝わればと思います。
PHP においてどういったフックポイントでどうログを投げるか、今回はあまりコードを用いて説明できませんでしたが、それもまた、機会があればブログにでも書きましょう。


さて、そういうわけで。
参加された皆様、Ust 参加の皆様、僕の発表を聞いてくれた皆様、ありがとうございました。
スタッフの皆様、お疲れ様でした!


PHPカンファレンスFacebookページもあるのでいいね!してね:

packagist の読み方は「パッケ(ー)ジスト」 #phpstudy

PHP 勉強会に参加してきました。
久々でした。相変わらず @koriym さんの説明はわかりやすくて面白いなーと思いました。Engine Yard さん会場提供ありがとうございます。いいトコですね。SF のベンチャーみたいな雰囲気ですね。

Riak

id:riaf に名前が似ていることで有名な Riak に関しては、riak-php-client をとりあえずいじってみようかとおもいます。LT ってことであまり時間を取れなかったみたいな感じだったんですが、DEMO も見たかったです。

Packagist

で、LT で Composer と Packagist について発表があって、改めて最近 Composer だよなーとは思いつつ、様々な理由で、早く「ほぼオフィシャル」になってほしいなーと思う次第です。

それで、発表の中できしださんが "Packagist" を「パッカギスト」と読んでいることがあり、他の方もそう読んでいたので、PHPer の中では標準的な読み方なのか?と思いつつ、とはいえ本当はなんて読むんでしょうかね、と気になったので海外のプレゼンとかの動画を色々探してみたわけですが、結構ソース少ないんですね。で、見つけたのでシェアしておきます。(いくつか見ましたが、まぁだいたいこんなんでした)
あ、ちなみに揚げ足とりたくてやってるつもりはありませんよ。*1

4:23 地点あたりです。

The Wonderful World of Composer - YouTube

発音的には、普通に Package + ist ですね。
カタカナでいうと「パッケージスト」かなー。という感じがします。
より正確に書くと「パッケジスト」で「パ」にアクセントが来る感じ。まぁそもそも Pa が破裂音 st もほぼ母音ナシなので、カタカナ表記だと難しいんですが。

あと、英語に関して言うと、enable、disable について、「エナブル」「ディサブル」という発音もありましたが、カタカナ表記するなら「イネイブル」「ディセイブル」あたりでしょうか。
うちの会社にも英語の不得意な人がいるので、「ファルス(false)!」と言い出した日には、「フォルスね」と否したりするわけだけど、まぁとはいえ日本ですから、今更 Warning を「ワーニング」と言おうが日本の中では、伝われば良いと思っているのでわざわざ「ウォーニングだよ」などとツッコミを入れたりなどはしませんが、正しい発音わかりづらいよねみたいなことはよくあるとはいいつつ正しくはなんだったのかくらいは知っておくと良いのかもしれないかなと思います。
(まぁ、そういう自分も間違えていることよくあるので都度訂正していきたいですが)

ちなみに、今更感ありますが、PEAR は「ぺあー」です。

懇親会

懇親会はごちクルでロコブルーでした。美味しかったです。

幹事の @yando さんおつかれさまでした。

Facebookページ

いいね!してね。

*1:ちなみに、我々 PHP のことを「ぺちぺ」と呼ぶような人種なので、わざとそう読んでいる可能性もありますし、別に改めよ、というつもりもなく、ただ、本当はなんなのかを知っておきたいというのがあるくらいで、愛称つけるくらいは別に良いよね、とは思っています。が、まぁもうちょい普及してからでも良いかな、とも思いますが! (本当に「パッカギストだ」で日本の中で広まりたくないし)

PHPカンファレンス2012 で Git と Pull Request をつかったチーム開発の話をしてきました #phpcon2012

先日 9/15 に行われた PHP カンファレンスで、Git と Pull Request をつかったチーム開発について、発表をしてきました。

資料と補足

まず、発表資料です。

あらためてメインの主張をすると、「Git に移行する」というのは、「svn のコマンドに対応する git のコマンドを覚えること」や、「GitHub Enterprise を導入したら完了」するものではなく、Git を利用した最も効率的な、開発フローや業務フローを考え、チーム開発・運用に適用すること、です。

  • 9/19 時点で、また Speaker Deck の embed が使えなくなっているのでリンクもおいておきます (そのうち対応してくれ、ということで↑は放置)


あと補足っぽいものを

  • gitflow のブランチ戦略について説明しましたが、ちょっと複雑だなーと思う方には、GitHub Flow も人気のようです
    • https://gist.github.com/3705015
    • ブランチ運用自体はシンプルで良いなーと思うのですが、いろいろ懸念点もあるので、両方の良いところを取り入れつつ今後もいろいろ改良を続けたいです!
    • GitHub Flow で運用している人にはちょっと聞いてみたいこともあります。どこかでよろしくお願いします。
  • 2つ前にあった、@halt さんによる、「最先端Web開発」の発表ですが、開発フローややり方は違うのに、同じ結論にたどり着いているのが面白いなーと思いました。Git / Pull Request (あるいは、ペアプロ・グループプログラミング) によるメリットは、やはり、チーム全体としてのコードの品質を高めていくことができるようになる、ということなんですよね。
  • Twitter などでのフィードバックも見させていただいております。結構良い反応をいただけてうれしいです。

Ustream の録画

Ustream 配信も行われていて、録画は以下でみることができます。

Git ツール選択チャートつくりました

GitHub有料版のほうがいいよねとか、GitLabっていのかしらとか、いやいやGitHub Enterpriseのほうが、いろいろ迷うと思いますが、よくある Y/N のチャートを作りました。(雑)
僕なりの視点ですが、何かの参考にしてください!緑がYes、赤がNoです。


一応解説すると、

  • お金がたくさんあるなら、GHE使うのが一番よいです
  • Git サーバのメンテナンスがしたくないなら、何人メンテナがいても GitHub の Private はprivate repository 10個で $25/月、20個で $50/月 ですし、年間でも5万くらいなので、よいです。
    • 一応、リスクとして考えなければいけないのは以下のあたりです:
      • 3ヶ月に1度くらい落ちたり、メンテナンスされたりします。その間 push できないとか、リリースできないとかは、我慢したとしても、自前でサーバをメンテナンスするよりはペイする、という判断もあると思います。
      • push を我慢するとしてもデプロイが GitHub に依存するのは嫌だなーというのが僕の意見です。ただ、繰り返しになりますが、それも、たまになので、日々メンテすることのコストと比較してもペイするでしょ、という考え方も、あります。
      • ソースコードは GitHub に預けることになります。
  • GitLab のインストール時点ですんなりできなかった場合、今後の困難が予想されるので、やめた方が良いかもしれません
    • GitLab にすることのデメリットは:
      • GitHub と比較して機能的に劣る
      • メンテナンスコストがかる (金銭的・時間的デメリット)
    • 事例からいって、メンテコストとは、以下のものです
      • Gitサーバを動かすサーバを借りる金銭的コスト (VPSなど)
      • バックアップ処理が必要 (まぁ、一度つくれば、cron とかで回せば良い。うちは S3 にアップロードしています)
      • 月に1回、バージョンのアップグレード作業をする (1時間程度)
      • 動かしているGitサーバが壊れたりしたら、GitHubが落ちた時以上に面倒 (新規サーバ作成、バックアップから再構築)

といったところです。

それから、発表資料にもありますが、「多少バグっても許される程度の小規模なチーム」でおすすめでしています。たとえば、大きな会社になると、多少バグっただけでも、ヤンヤヤンヤと社シスへほかの開発者からクレームが来ます。そういう状況はつらいのでGitHub使った方が良いでしょう。

発表中、GHE or GitLab でしょ、といったのはまさにそこで、社シスへクレームが飛ぶような大きな会社なら、お金払って GHE 使った方が総合的に享受できる利点が大きいのではないでしょうか。

スポンサーもしていました

クロコス (Crocos, Inc) では、PHPカンファレンスのスポンサーもしていました。

で、クロコスはめちゃくちゃおもしろいので、エンジニア大募集してますし、声かけてください!

ちなみにこの場を借りて宣伝しておくと、

  • PHP/JS を書いていただくことになります
    • 技術的経験からいうと、PHP以外の言語に精通した人でも採用条件としては、かまわないと思っています。が、実務は PHP ですので、PHP は絶対に書きたくない、という人以外にオススメです
  • Git 使います
  • 別にそれがすべてではないですが、お声がけいただく際には GitHub のアカウントも教えていただきたいです
    • コードを見るのが一番話が早いです

よろしくお願いします!

スタッフもしていました

今年はなにかとバタバタしていてほとんどお手伝いできなかったのですが、一応スタッフとしてもお手伝いしていました。
たくさんの仕事をかかえこみながら運営してくれた安藤さんをはじめ、スタッフの皆様、お疲れ様でした。

PHP カンファレンスは、毎年、本当に、ゆるゆるとですが、ちゃんと有志ががんばって開催しています。今回、参加してよかった、来年もやってほしい、自分も手伝いたい、などという方は、是非来年実行委員に入ってください!

というわけで

今年も盛大に閉幕したPHPカンファレンスですが、スポンサーの皆様、参加された皆様、Ust参加の皆様、僕の発表を聞いてくれた皆様、ありがとうございました。
そして、WordCamp のスタッフと、PHPカンファレンスのスタッフの皆様、お疲れ様でした!

参加者アンケートあります:

PHPカンファレンスFacebookページもあるのでいいね!してね!:

PHP カンファレンス 2012 は 9/15。Git と Pull Request の話をします。 #phpcon2012

9/15 はぼくの誕生日です。お祝いお待ちしております。


と、それはともかく、

9/15 に PHP カンファレンスが開催されます。例年通り、ちょっと行きづらい PiO ですよ。
公式タグは #phpcon2012 ですよ。

詳細は公式サイトをご覧ください:


参加登録は ATND で受付中です。RubyPython と日程かぶってて笑いますが、PHP好きだぜって人は是非参加してくださいねー。

Git と Pull Request と開発フローの話をします

Pull Request ベースの開発の記事を今年の2月に書いたのですが、このときは、色々試しながら、きっとこれが間違いない、という風に思ってまとめてみたんですよね。
で、その後、クロコスでも GITLAB を導入して、開発フローを、「新機能開発や修正開発はすべて feature ブランチをつくって、メインのブランチに Pull Request」という風に変更し、必ずチーム内でレビューを通すようにしました。

この運用にして半年まだたたないくらいなのですが、非常に効果をあげています。

PHPカンファレンスでは、これを運用してきた経験をふまえて、

  • Git x Pull Request ベースの開発フローの基本
  • 現在、どういう運用にしているのか
  • どういう風に効果をあげたのか
  • どうするとうまくいくか

などのお話ができればと思います。みんなに聞いてもらいたい話です。

是非聞きに来てくださいね!


その他タイムテーブルはこちら:

phpenv + php-build を使って 5.3 と 5.4 を共存させつつ php-fpm を使う

っていう話なんですが、前提として、 phpenv + php-build は他にも多くの方が語ってるので、そちらを参考に。いやむしろ僕も参考にさせていただきました、ありがとうございます、いくら安いとはいえこれで PHP 5.4 のためにVPS1台借りるとかってことがなくなってよかったです。というか @yuya_takeyama さんのおかげですありがとうございます。


なんですが、えーっと、作るのはだいたいWebアプリで、cli の php が複数バージョンいれられるのは大変嬉しいけどそれだけだと PHP 5.4 なら built-in server があるからいいけど PHP 5.3 の開発とか困るねってことで、php-fpm も入れたいと思います。


流れ

  • enable-fpm で php-build する
  • そんな fpm プロセスを立ち上げる
  • nginx とか設定する

enable-fpm で php-build する

まず、php-build むけのカスタムな設定をつくります。5.4.0s でつくります。s-suffix は sotarok の s です。

$ v ~/.php-build/share/php-build/definitions/5.4.0s

内容はこんなかんじ。全部入りです。configure_option をいじるんですけど、 --enable-fpm だけあればいいんですけど、 --with-mysql-sock=/tmp/mysql.sock とかいれてるのは好みの問題なので、いれなくても良いはずです。

configure_option "--enable-fpm --enable-fileinfo --enable-hash --enable-json --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-iconv --enable-ftp --with-gettext --enable-mbstring --with-onig=/usr --with-pcre-regex --with-mysql=mysqlnd --with-mysql-sock=/tmp/mysql.sock --enable-phar --enable-shmop --enable-sockets --enable-simplexml --enable-dom --with-libxml-dir=/usr --enable-tokenizer --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-mhash=yes --without-mm --with-enchant=/usr --with-zlib-dir=/usr --with-gd --enable-gd-native-ttf --with-gmp=/usr --with-jpeg-dir=/usr --with-xpm-dir=/usr/X11R6 --with-png-dir=/usr --with-freetype-dir=/usr --with-imap=/usr --with-imap-ssl --enable-intl --with-t1lib=/usr --with-mcrypt=/usr --with-snmp=/usr"
install_package "http://www.php.net/distributions/php-5.4.0.tar.bz2"
install_pyrus
install_xdebug_master

で、これを指定してインストール

$ php-build 5.4.0s ~/.phpenv/versions/5.4.0s


ところで、そういえば、php-build が install_pyrus でコケる現象が前あって、デバッグってことで install_pyrus まわりにログを仕込んでると動いたりしてなんか原因が特定できなかったです。
ちなみに、install_pyrus って php ビルドした後に実行されるんでが、これにコケると、php 本体の make は成功してるのにこれまるごと cleanup されちゃうっていう仕様になってて悲しい思いをしたので、 cleanup 処理はコメントアウトしちゃってます。

~/.php-build/bin/php-build

428 # Handles build errors, and displays the last 10 lines
429 # of the build log.
430 function build_error {
431     {
432         echo
433         echo "BUILD ERROR"
434         echo $(tail -n10 "$LOG_PATH")
435         echo
436         echo "The full Log is available here ${LOG_PATH}"
437         echo
438     } >&3
439
440     # Removes the prefix when the build fails.
441     #cleanup_abort # ←ここをコメントアウトしてる
442 }

PHP-FPM の設定

話がそれました。
で、php-fpm つきでビルドができると、以下のように sbin/php-fpm が生成されます。

$ ls -la .phpenv/versions/5.4.0s/sbin/php-fpm
-rwxr-xr-x 1 sotarok sotarok 31055874 2012-05-02 00:38 .phpenv/versions/5.4.0s/sbin/php-fpm

こいつをおもむろに実行してみると、

$ cd .phpenv/versions/5.4.0s
$ ./sbin/php-fpm
[22-May-2012 16:16:27] ERROR: failed to open configuration file '/home/sotarok/.phpenv/versions/5.4.0s/etc/php-fpm.conf': No such file or directory (2)
[22-May-2012 16:16:27] ERROR: failed to load configuration file '/home/sotarok/.phpenv/versions/5.4.0s/etc/php-fpm.conf'
[22-May-2012 16:16:27] ERROR: FPM initialization failed

php-fpm.conf つくらなきゃいけない感じがします。(php-build でなんかひっかけてつくればいいんですよね多分、面倒だから見てないけど、多分そう。)

ってことで、 ~/.phpenv/versions/5.4.0s/etc/php-fpm.conf に 適当にファイルを作成します。

  • https://gist.github.com/2767859
    • path とか適当に変えてください。
    • デバッグのために、 daemonize = no とかに設定してます。このほうが再起動とか楽なので。で、そうするとターミナルとられちゃうんですけど、どっちにしろ screen で1つわりあてちゃえばいいだけのはなしです
    • listen を 127.0.0.1:9002 とかにしてます

あとは... あ、あとそうだ、なんか適当な位置にログをおきます。もし ~/var/log とかなかったらつくってください

で、起動!

$ ~/.phpenv/versions/5.4.0s/sbin/php-fpm
[22-May-2012 18:44:48] WARNING: [pool www] 'user' directive is ignored when FPM is not running as root
[22-May-2012 18:44:48] WARNING: [pool www] 'group' directive is ignored when FPM is not running as root
[22-May-2012 18:44:48] NOTICE: fpm is running, pid 787
[22-May-2012 18:44:48] NOTICE: ready to handle connections

pool の user, group は root じゃないとうごかないよーって警告でるんですが、コメントアウトすると、起動しないです。root では動かさないので、まぁ、適当です。

で、これで fastcgi で受け付ける準備ができました。

nginx の設定とか

127.0.0.1:9002 で受け付ける upstream を定義します。

upstream php54 {
    server 127.0.0.1:9002;
}

# {{{ z.merlot.strk.jp;
server {
  listen 80;
  server_name z.merlot.strk.jp;
  index index.php;
  root /usr/local/var/www/z.merlot.strk.jp/public;

  location / {
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php$1 last;
    }
  }

  location ~ \.php.*$ {
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass php54;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  }
}
# }}}

で、再起動。

z.merlot.strk.jp にアクセスすると、

あとは

5.3.13 とかも同じ方法でつくって、fpm は listen port かえて、nginx の設定で、こいつを指定すればいいですね。

upstream php53 {
    server 127.0.0.1:9003;
}
# {{{ p.merlot.strk.jp;
server {
  listen 80;
  server_name p.merlot.strk.jp;

  # .. (snip)

  location ~ \.php.*$ {
    # .. (snip)
    fastcgi_pass php53;
    # .. (snip)
  }
}
# }}}


これで快適に fpm 環境のテストもできるし、phpenv つかったものの、phpenv でバージョンを切り替える必要すらなく、port を指定して別の php-fpm プロセスをたちあげておけば、幸せに複数バージョンで開発をすすめられるし、ホスト別に分けるのはもう nginx の設定で適当にすればいいので、楽チンです。

enjoy it!

dh-make-pecl (dh-make-php) を使って5分でPECLパッケージをオレオレ.debにする

PEAR だったらデプロイするアプリ内に配置すれば良いのだけど、PECLとかこまりますよね。
あと、どうしても、サーバ複数セットアップとかしてたらいちいち pecl コマンド叩くわけにもいかないので、パッケージ管理をしておきたい感じになります。とはいっても、Debian にしても、CentOS にしても、OSのほうで提供してるaptやyumでのパッケージだと、ライブラリのバージョンアップに追いついてなかったりして困りますよね。

ってことで、社内とかで利用するときに .deb とかつくりたい!

でも Debian パッケージってどうやってつくればいいかわからない!

ってまぁ、そういうことなんですけど、Debianには安心の dh-make のヘルパーがいくつかあるので、それの使い方を紹介します。

  • (今回の環境は squeeze 6.0.4)

準備

Debianパッケージ化に必要なやつをインストールしておきます (gccとかは当然入ってるよねってことで書いてないけど、もし入ってない人は build-essentials なども必要ですよ)

$ sudo apt-get install devscripts dh-make dh-make-php

もし入ってなかったら php5-dev も必要です

$ sudo apt-get install php5-dev

パッケージャー名とかを登録しておきます。

export DEBEMAIL="sotarok@crocos.co.jp"
export DEBFULLNAME="Sotaro Karasawa"

あと、とりあえず作業用ディレクトリに移動しておきます。

$ mkdir ~/tmp/apc-deb
$ cd ~/tmp/apc-deb

パッケージ化したいソースを取得し、pecl パッケージをつくる

今回は、apc を例にやります。*1

pecl ですでに配布されているバージョンをパッケージングする場合は、

$ pecl download apc

で、apc-3.1.9.tgz などを取得します。


... が、今回は、SVN からパッケージングします。なぜなら APC が PHP 5.4 に対応してるのはまだ SVN 版だからです。

$ svn co https://svn.php.net/repository/pecl/apc/trunk ./apc-src
$ cd apc-src

このまま peck package したいところですが、開発版だと package.xml の version がアレなので、そこだけ編集します。

--- package.xml (リビジョン 324826)
+++ package.xml (作業コピー)
@@ -72,7 +72,7 @@
   </developer>
   <date>2012-03-15</date>
   <version>
-    <release>3.1.10-dev</release>
+    <release>3.1.9.99</release>
     <api>3.1.0</api>
   </version>
   <stability>

で、package

$ pecl package
...
Package APC-3.1.9.99.tgz done
Tag the released code with `pear svntag package.xml'
(or set the SVN tag APC-3.1.9.99 by hand)

これで、tgz ファイルができあがりました。

いよいよ dh-make-pecl

ちょっとファイルを移します。

$ cd ..
$ mkdir deb
$ mv apc-src/APC-3.1.9.99.tgz ./deb
$ cd deb

--only 5 をつけて dh-make-pecl します

$ dh-make-pecl --only 5 APC-3.1.9.99.tgz

すると、いくつかファイルが生成されます。

$ ls
APC-3.1.9.99.tgz  php-apc-3.1.9.99  php-apc_3.1.9.99.orig.tar.gz

この php-apc-3.1.9.99 ディレクトリが、apc のソースとdebianディレクトリを含む、debian パッケージのひな形になってます。このディレクトリに入り、おもむろに debuild。

$ cd php-apc-3.1.9.99
$ debuild -uc -us
...

dpkg-buildpackage: source changed by Sotaro Karasawa <sotarok@crocos.co.jp>
 dpkg-source --before-build php-apc-3.1.9.99
dpkg-buildpackage: host architecture amd64
dpkg-checkbuilddeps: Unmet build dependencies: xsltproc
dpkg-buildpackage: warning: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: warning: (Use -d flag to override.)
debuild: fatal error at line 1325:
dpkg-buildpackage -rfakeroot -D -us -uc failed

ビルド系の依存関係でビルドが失敗した場合は、apt-get でインストール。 "dpkg-checkbuilddeps: Unmet build dependencies:" に書いてあるやつが、足りてないやつです。このように、失敗したときは適当に apt-get でインストールします。

$ sudo apt-get install xsltproc

さて、再挑戦。

$ debuild -uc -us

...

dpkg-deb: `../php5-apc_3.1.9.99-1_amd64.deb' にパッケージ `php5-apc' を構築しています。
 dpkg-genchanges  >../php-apc_3.1.9.99-1_amd64.changes
dpkg-genchanges: including full source code in upload
 dpkg-source --after-build php-apc-3.1.9.99
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
W: php-apc source: ancient-standards-version 3.8.1 (current is 3.9.1)
W: php5-apc: copyright-refers-to-versionless-license-file usr/share/common-licenses/GPL
W: php5-apc: new-package-should-close-itp-bugFinished running lintian.

で、一個上のディレクトリに移動すると

$ ls -la
合計 316
drwxr-xr-x 4 sotarok sotarok   4096 2012-04-05 13:19 .
drwxr-xr-x 4 sotarok sotarok   4096 2012-04-05 13:17 ..
drwxr-xr-x 6 sotarok sotarok   4096 2012-04-05 11:50 .svn
-rw-r--r-- 1 sotarok sotarok 156206 2012-04-05 13:17 APC-3.1.9.99.tgz
drwxr-xr-x 5 sotarok sotarok   4096 2012-04-05 13:19 php-apc-3.1.9.99
-rw-r--r-- 1 sotarok sotarok   5032 2012-04-05 13:19 php-apc_3.1.9.99-1.diff.gz
-rw-r--r-- 1 sotarok sotarok    755 2012-04-05 13:19 php-apc_3.1.9.99-1.dsc
-rw-r--r-- 1 sotarok sotarok  43787 2012-04-05 13:19 php-apc_3.1.9.99-1_amd64.build
-rw-r--r-- 1 sotarok sotarok   1481 2012-04-05 13:19 php-apc_3.1.9.99-1_amd64.changes
lrwxrwxrwx 1 sotarok sotarok     16 2012-04-05 13:19 php-apc_3.1.9.99.orig.tar.gz -> APC-3.1.9.99.tgz
-rw-r--r-- 1 sotarok sotarok  74678 2012-04-05 13:19 php5-apc_3.1.9.99-1_amd64.deb

php5-apc_3.1.9.99-1_amd64.deb ってファイルができてましたね!

インストールしてみる

$ sudo dpkg -i php5-apc_3.1.9.99-1_amd64.deb
未選択パッケージ php5-apc を選択しています。
(データベースを読み込んでいます ... 現在 55932 個のファイルとディレクトリがインストールされています。)
(php5-apc_3.1.9.99-1_amd64.deb から) php5-apc を展開しています...
php5-apc (3.1.9.99-1) を設定しています ...
$ php -m | grep apc
apc

ちなみに、phpinfo上で見るバージョンは、拡張機能のソースから取得されたものなので、3.1.9 とかになってます(debianパッケージのバージョン 3.1.9.99とは連動してないですよってこと)

簡単でしたね!

  • 準備さえできてれば、5分もかからないですね!
  • 必要なら apc.ini を書き換えたものを準備しておけば、一緒にパッケージングすると、インストールするだけで社内向けの apc.ini が入る、などといったパッケージを作れます。

*1:まぁ、ようするにこれがPHP 5.4 に対応してないから、独自でパッケージングしたい!というわけなんですけどね

PHP勉強会@東京 #58 で「入門PHP5.4」の話をしました

久しぶりのPHP勉強会でしたね!僕も通常のPHP勉強会での発表は久々だった気がします。
というわけで、入門PHP5.4という題で発表してきました。

発表資料&リンク集

Speaker Deck にあげました。

が、Speaker Deck だと、リンクがリンクにならないので、リンク集だけ補足でこちらにおいておきます!

Accessor の例

今日途中でコーディングしてたネタです。この Accessor Trait は、 id:Fivestar と僕が同時期にまったく同じ機能の Trait を作ってたりして、ワロタって話をしました。いや実際このあたりを作りたくなるものですね!

<?php

trait Accessor
{
    // そういやこれだと camelCase な property しか対応してないけど
    public function __call($name, $params)
    {
        if (strpos($name, 'get') === 0) {
            $attr = substr($name, 3);
            if (strlen($attr) > 0) {
                $attr = lcfirst($attr);
                if ($this->hasClassVar($attr)) {
                    return $this->$attr;
                }
                throw new \LogicException(sprintf('No such field "%s"', $attr));
            }
        }
        if (strpos($name, 'set') === 0) {
            if (count($params) !== 1) {
                throw new \InvalidArgumentException('error');
            }
            $attr = substr($name, 3);
            if (strlen($attr) > 0) {
                $attr = lcfirst($attr);
                $value = array_shift($params);
                if ($this->hasClassVar($attr)) {
                    $this->$attr = $value;
                    return $this;
                }
                throw new \LogicException(sprintf('No such field "%s"', $attr));
            }
        }

        throw new \LogicException(sprintf('Method not found "%s"', $name));
    }

    private function hasClassVar($attr)
    {
        static $vars = null;
        if ($vars === null) {
            $vars = get_class_vars(__CLASS__);
        }
        return array_key_exists($attr, $vars);
    }
}

で、これを use するだけで Accessor ができますねってはなし。

<?php

class User
{
    use Accessor;

    private $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}

$user = new User('aoi miyazaki');
var_dump($user->getName());         // => aoi miyazaki
$user->setName('aoi yu');
var_dump($user->getName());         // => aoi yu

まとめ

  • Voyage Group さんのセミナールーム広いし綺麗だし快適
  • Ajito いいなー

MyMR、Phake、懇親会も楽しかったです!最後に、会場を貸してくださった Voyage Group さん、幹事の gusagi さんありがとうございました。