デブサミ2013に参加してきました

2/14 と 2/15 に「デブサミ2013」に参加してきました。
私自身、過去に何度か参加した事あるのですが、今年は業務改善で開発スピードを加速させた企業の話が印象的でした。
スタッフの方、登壇者の方、お疲れ様でした。
私が参加したセッションは下記です。

14日

【14-A-1】Webブラウザの時代は終わるのか?~スマホアプリとHTML5の未来~:Developers Summit 2013

発表資料

ウェブブラウザの時代は終わるのか 〜スマホアプリとHTML5の未来〜

今回のデブサミ2013の中で、ウエブ系の発表で一番参考になった発表でした。
ウェブとアプリでは、対立する存在ではなく、それぞれ補う存在だという事でした。

【14-A-7】ソーシャルコーディング革命後の開発委託の世界〜QA@ITの事例:Developers Summit 2013

GitHub時代の開発委託とは? デブサミでQA@ITの事例の話をします - QA@IT公式ブログ

いずれソーシャルコーディングは企業内に浸透する

という話が印象的でした。実例を交えてお話されたのがとても印象的でした。

15日

【15-A-3】モバイル HTML5 による世界への挑戦:Developers Summit 2013

モバイルhtml5は、実はアメリカより日本の方が進んでいるそうです。

【15-A-7】ワンクリックデプロイ ~いつまで手でデプロイしてるんですか~:Developers Summit 2013

自動化でデプロイするには、最初っからプロジェクトに組み込んでおく必要がある。
amazon は最高1時間に1200回デプロイしている。

【15-A-8】アジャイルサムライって当たり前になるのかな?:Developers Summit 2013

アジャイルサムライについて、ラフに語るセッションでした。
デブサミ2013最後のセッションということもあり、和やかな雰囲気でスタートしました。
西村直人さんの、ご自身での経験をもとに話されていたのが、とくに印象的でした。最初は1人でペア・プログラミングをしていたとかのジョークを交えた、とても楽しいセッションでした。

Subversion の リポジトリフック で Redmine と連携してみた

環境は以下です。

"--quiet"を付けるとバージョンのみ表示されます。

$ svn --version --quiet
1.6.11
  • Redmine や、その他環境のバージョンです。
Environment:
  Redmine version                          2.2.2.stable
  Ruby version                             1.9.3 (i686-linux)
  Rails version                            3.2.11
  Environment                              production
  Database adapter                         Mysql2

Subversionの設定

続いて「Subversionの設定」をします。

# pwd
/var/www/svn/*****/hooks
# cat post-commit
#!/bin/sh
EPOS="$1"
REV="$2"

/usr/local/bin/ruby -ropen-uri -e 'open("http://*********/redmine/sys/fetch_changesets?key=********")'

# chown apache:apache post-commit
# chmod +x post-commit

リポジトリフックを使って「参照用キーワード」や「修正用キーワード」のチェック

続いて、リポジトリフックを使って「参照用キーワード」や「修正用キーワード」が
設定されているかのチェックをします。

pre-commit によるコミットの拒否の方法
pre-commit によるコミットの拒否の方法 (part2)
を参考にしました。

http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/hook-script/check-commit-log.pl
リポジトリフックに登録しました。

svnリポジトリフックが置いてあるディレクトリに下記を登録しました。

$ cat pre-commit
#!/bin/sh

# PRE-COMMIT HOOK
#
# The pre-commit hook is invoked before a Subversion txn is
# committed. Subversion runs this hook by invoking a program
# (script, executable, binary, etc.) named 'pre-commit' (for which
# this file is a template), with the following ordered arguments:
#
# [1] REPOS-PATH (the path to this repository)
# [2] TXN-NAME (the name of the txn about to be committed)
#
# [STDIN] LOCK-TOKENS ** the lock tokens are passed via STDIN.
#
# If STDIN contains the line "LOCK-TOKENS:\n" (the "\n" denotes a
# single newline), the lines following it are the lock tokens for
# this commit. The end of the list is marked by a line containing
# only a newline character.
#
# Each lock token line consists of a URI-escaped path, followed
# by the separator character '|', followed by the lock token string,
# followed by a newline.
#
# The default working directory for the invocation is undefined, so
# the program should set one explicitly if it cares.
#
# If the hook program exits with success, the txn is committed; but
# if it exits with failure (non-zero), the txn is aborted, no commit
# takes place, and STDERR is returned to the client. The hook
# program can use the 'svnlook' utility to help it examine the txn.
#
# On a Unix system, the normal procedure is to have 'pre-commit'
# invoke other programs to do the real work, though it may do the
# work itself too.
#
# *** NOTE: THE HOOK PROGRAM MUST NOT MODIFY THE TXN, EXCEPT ***
# *** FOR REVISION PROPERTIES (like svn:log or svn:author). ***
#
# This is why we recommend using the read-only 'svnlook' utility.
# In the future, Subversion may enforce the rule that pre-commit
# hooks should not modify the versioned data in txns, or else come
# up with a mechanism to make it safe to do so (by informing the
# committing client of the changes). However, right now neither
# mechanism is implemented, so hook writers just have to be careful.
#
# Note that 'pre-commit' must be executable by the user(s) who will
# invoke it (typically the user httpd runs as), and that user must
# have filesystem-level permission to access the repository.
#
# On a Windows system, you should name the hook program
# 'pre-commit.bat' or 'pre-commit.exe',
# but the basic idea is the same.
#
# The hook program typically does not inherit the environment of
# its parent process. For example, a common problem is for the
# PATH environment variable to not be set to its usual value, so
# that subprograms fail to launch unless invoked via absolute path.
# If you're having unexpected problems with a hook program, the
# culprit may be unusual (or missing) environment variables.
#
# Here is an example hook script, for a Unix /bin/sh interpreter.
# For more examples and pre-written hooks, see those in
# the Subversion repository at
# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and
# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/


REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1
/usr/bin/perl $REPOS/hooks/check-commit-log.pl $REPOS $TXN || exit 1

# All checks passed, so allow the commit.
exit 0

以上です。
(時間が無くて殴り書きっぽくなったので、後で修正するかも。。。)

FuelPHP vs CodeIgniter #FuelPHPAdvent2012

この記事は FuelPHP Advent Calendar 2012 : ATND の 23日目の記事です。
昨日は@ts_asanoさんの「QueryBuilderで小難しいSELECT文を書くためのノウハウ #FuelPHPAdvent2012 - Dazing days」でした。


本日の「FuelPHP Advent Calendar 2012」は @mukaken こと向井が担当させて頂きます。よろしくお願いします。
本日は「FuelPHP vs CodeIgniter」について書きます。
FuelPHPのコア開発者はCodeIgniterに関わった事のある人達が作ったFWですので、両FWは非常に似ています。
また、私自身、FuelPHP と CodeIgniter の両方のユーザなので、両方の比較記事を書きます。

ライセンス、対応する PHP のバージョン、開発元

ライセンスや対応するPHPのバージョン、開発元などについての比較です。

名称 本家ホームページ ライセンス 対応する PHP 最新の安定バージョン 開発元
FuelPHP http://fuelphp.com MIT 5.3 以上 1.4 コミュニティ
CodeIgniter http://ellislab.com/codeigniter CodeIgniter License 5.1.6 以上 2.1.3 アメリカのEllisLab
本家ホームページ

今年、両方ともリニューアルされました。特に大きな変化があったのはCodeIgniterで、URL が今年の12月になり変わり、ellislab.comの直下になりました。これは、何かの意図があるのかは不明ですが、より企業ベースで開発されている感が感じられるようになりました。

ライセンス

FuelPHP は MIT ですので何も問題ないでしょう。
CodeIgniter のライセンスは、現時点では CodeIgniter License ですが、今後は OSL 3.0 になる予定です。この OSL 3.0 といわれるライセンスが非常に難しく、変更になる件については一時期、本家のフォーラム(CodeIgniter changes license to OSL 3.0? / Forums / Community / EllisLab)や、いろいろなサイトで活発に議論されていましたが、ここ最近半年は議論している人を見かけなくなりました。

対応するPHPのバージョン

FuelPHPPHP 5.3 以上なので新しい機能を積極的に取り入れています。また、下位互換がないために簡潔にコードを記述する事ができます。少しの事なのですが、開発者にとっては気分が良いです。

CodeIgniter は 過去のしがらみがあるために、メンテナンスをしていると PHP 4 で記述されたコードをチラホラと見かけます。メンテナンス時などは気分が沈みます。

運用時の問題

現在の PHP の Old stable は PHP 5.3.20 なので、メンテナンスされているサーバであれば両方とも問題なく動くと思います。
ですが、ごくたまに、 FuelPHP で開発していて開発環境は PHP 5.3 だったのに本番環境は PHP 5.2 だったので作り直した、という話を見かけますので注意です。
CodeIgniter は PHP 5.1.6 以上なので、大抵の環境では動くと思います。

コミュニティ

FuelPHP

日本のコミュニティの活動は凄く活発です。今年、短期間で爆発的に増大しました。
私自身、「FuelPHP 日本語ニュース | Facebook」でFuelPHPの記事についてウォッチしているのですが、ほぼ毎日、日本語で何かしらののブログが書かれています。

日本以外ではブラジル、アジア諸国で人気が高いと感じます。
また、本家フォーラムの方もより一層活発になってきています。

CodeIgniter

日本では、それほど活発ではありませんが、世界的にはかなり巨大なコミュニティになっています。
日本以外だと、FuelPHPと同じくブラジル、アジア諸国がとくに活発だと感じます。

本家フォーラムは活発過ぎてカオス状態になっています。何が何だか分からない状態です。

注目度

注目度の比較です。
web での注目度の指標として「Google トレンド」が使われるのを、よく見かけますが、今回は開発者に注目されている指標として近いであろう「はてなブックマーク」と「stackoverflow」で比較してみました。
やはり、実際の運用や業務で使用していて、困った事がでてきたときに開発事例が豊富にあり探せるというのは心強いです。

はてなブックマーク

日本国内で使われているであろうサービスで、web系サービスの人気度が分かるといえば、はてなブックマークです。

ブックマーク数が1user以上で、それぞれのタグ名別で比較しました。

ブックマーク数の結果は大差ありませんでした。
Codeigniter より FuelPHP の方が新しいフレームワークという点を考慮すると、短期間で数が増えた FuelPHP の方が勝っています。

stackoverflow

Stack Overflow は世界中のプログラマーが連日連夜、技術的な疑問を投稿しているサイトです。
stack overflow でのタグの数を比較してみました。

やはり、世界的にみると Codeigniter が強いみたいです。 FuelPHP はこれからといった感じでしょうか。

ドキュメントの読みやすさ

両方とも、とても使いやすいドキュメントページだと思います。FuelPHP や Codeigniter が、他のフレームワークと比べて優れている点は、やはりドキュメントの読みやすさだと思います。
両方ともすばらしいのですが、FuelPHP の方が目次をマウスオーバすれば色分けされて表示されるなど、より見やすいように工夫されています。

パフォーマンスの比較

パフォーマンスの比較をしてみました。

前提

Model Name: MacBook Air
Model Identifier: MacBookAir4,1
Processor Name: Intel Core i5
Processor Speed: 1.6 GHz
Memory: 4 GB

PHP Version 5.3.15
Apache/2.2.22
APC なし

localhost にて、それぞれのFWはデフォルト設定でコントローラーに"Hello World!"と表示する単純な例で比較しました。
比較ツールは siege を使い、下記の設定で実行しました。

siege -b -c 10 -t 3S http://localhost

結果
  • FuelPHP
    • Transaction rate : 93.06 trans/sec
  • CodeIgniter
    • Transaction rate : 155.67 trans/sec

(Transaction rate : 数値が高い方が、よりアクセスがさばけている)

パフォーマンスの比較では FuelPHP より Codeigniter の方が性能が良いという結果になりました。FuelPHP の方が何かと便利ですが、速いとなると Codeigniter の方です。

ただ、ある程度のアクセスが見込めるようなパフォーマンスが気になるサイトとなると、リバースプロキシを使ったりとwebのシステム全体で最適化するので、今回比べたような Web FW 自体の純粋な性能は問題にならないかもしれないです。

案件での採用のしやすさ

実案件での国内での代表的な採用実績

上記以外の、日本でのビジネス的な実案件での採用実績を調べようとしたのですが公開されている企業が少なく分かりませんでした。
ですので、PHP のイベントや IT 勉強会で聞いた、私の知る限りで書きます。
現在、実稼働しているサービスで多く使われている方は Codeigniter でした。
ただし、小規模な受託案件(開発メンバは1から3人)や自社サービスなどの開発環境を開発者が自ら自由に選べる新規案件では FuelPHP を採用したという話をよく聞きました。
現時点で実稼働しているサービスは Codeigniter で、新規案件では FuelPHP を採用するという流れみたいです。
開発メンバーの集めやすさでは FuelPHP にしろ Codeigniter にしろ学習コストが低いので、PHPプログラマーならすぐに開発メンバーに加われるので問題ないと思います。

イースター・エッグ

イースター・エッグとはプログラムの裏技の事です。
FuelPHP には Mac 限定で喋る機能や、 oil から表示されるロボットなど、いろいろな楽しい仕組みが提供されています。
Codeigniter には裏技的なものがありません。

イースター・エッグ については FuelPHP の圧勝です!
少しの事ですが、楽しく開発できる事は大切ですね。

機能面 & まとめ

機能面の比較に関しての詳細な比較は、Google で検索すると、すばらしい記事を書かれたブログが多数ヒットします(例えばCodeigniter vs FuelPHP (Revisited) - I Like Kill Nerdsなど)。
ですので、詳しくはそちらを参考にしていただくとして、今回は私が感じた事を書きます。
機能の多さは FuelPHP > CodeIgniter です。FuelPHP にあって CodeIgniter にない機能は、大抵はCodeIgniter の本家フォーラムを探せば同じような機能の追加方法(ハック)が見つかります。しかし、CodeIgniter のコアを改造しなければいけないものもあり、そうするくらいなら最初から、ある程度まとまっている FuelPHP を採用した方がいいように思います。

新規案件で FuelPHP か CodeIgniter を採用するのを迷っているなら、 思いきって FuelPHP を採用するのもいいかもしれません。FuelPHP の方が凄く開発が活発で新機能が積極的に取り入れられていますし、日本のコミュニティが活発だからです。
そして、何より開発時のコードがシンプルに保たれていて開発者の気分が良いからです。

来年の抱負

今年は「FuelPHP 勉強会 東京」を2回開催できたのはよかったのですが、継続開催ができませんでした。来年こそは継続して開催したいと思います。やはり、OSSにおいてコミュニティの継続活動は大事だと思います。
また、来年は本家のFuelPHP Github へのPRを積極的にしたいと思います。



明日は@kurotakyさんです。お楽しみに!

[book]書評『@cosme公式総合年鑑 2012年保存版@cosmeクチコミランキング 940万件のクチコミ集計結果発表』

@cosme」という、コスメフリークなら当然知っているであろうコスメのクチコミサイトが出した本です。
2011年で一番売れた化粧品ランキングがジャンルごとに掲載されていますので、コスメ系マーケティングをされている方に凄く役立ちそうな感じがします。
本書の「おわりに」に書かれていますが、2011年は節約志向が高まってきている年で「自分基準」で「本当に納得できた商品」を選ばれる方が増えてきているそうです。インターネットサービスの流行も同じようにフェイスブックのタイムラインなど、自分基準のサービスが流行っていますね。今の時代は「自分基準」がキーワードになっているのだと思います。
また、本書は写真が沢山載っているので、普通のコスメ好きの方も見ているだけで楽しめると思います。


本書をIT技術書に例えるとなると、、、
オライリーの本に例えると『●●が知るべき97のこと』か『Hacksシリーズ』だと思います。同じように、ページごとに内容が分離していますので、通勤電車などの空き時間に読むのにも適していると思います。


本書の定価は1,000円ですが、@cosmeのwebショップで使える500円のクーポンが付いていますので、実質の価格は500円です。
これはお得です!

おまけ

@cosme ランキング −コスメ・化粧品・美容の最新ランキング−

当ブログを見ている方が興味があるのは「@cosme」のランキングのアルゴリズムだと思います。「@cosme」のランキングのアルゴリズムは非公開で、いまだ読解されていないみたいです。
Amazonランキングの謎を解く: 確率的な順位付けが教える売上の構造 (DOJIN選書)』という本に書かれていたのですが「確率順位付け模型による分析」を使うと非公開のランキングのアルゴリズムが分かるみたいです。
数学の得意な方はランキングのアルゴリズム読解に挑戦してみてはいかがでしょうか!?

Scientific Linux で CodeIgniter-for-PHP_CodeSniffer を使う

Scientific Linux で CodeIgniter-for-PHP_CodeSniffer を使う例を書きます。
RedHat系も同様の手順で大丈夫だと思います。

動作環境

動作環境は Scientific Linux release 6.0 です。

$ cat /etc/redhat-release
Scientific Linux release 6.0 (Carbon)

インストール方法

pear から PHP_CodeSniffer をインストールします。
(pear の使い方はManual :: PEAR Manualをご覧下さい。)

$ sudo pear install PHP_CodeSniffer

github から CodeIgniter-for-PHP_CodeSniffer を git clone します。

$ cd
$ git clone git://github.com/thomas-ernest/CodeIgniter-for-PHP_CodeSniffer.git

PEAR の該当のディレクトリにコピーします。

$ sudo cp -Rv CodeIgniter-for-PHP_CodeSniffer/src /usr/share/pear/PHP/CodeSniffer/Standards/CodeIgniter

次のように CodeIgniter が表示されればインストール成功です。

$ phpcs -i
The installed coding standards are PEAR, MySource, PSR1, CodeIgniter, Zend, PSR2, PHPCS and Squiz

次のようにエイリアスを追加すれば便利です。

$ cat >> .bash_profile
alias phpcsci='phpcs -v --standard=CodeIgniter --encoding=utf-8'

$ source .bash_profile

使い方(テスト)

test.php というphpファイルを作成します。

$ cat > test.php
<?php
echo 'test';

次に、test.php を文法チェックします。

$ phpcsci test.php
Registering sniffs in CodeIgniter standard... DONE (34 sniffs registered)
Creating file list... DONE (1 files in queue)
Changing into directory /home/mukai
Processing test.php [6 tokens in 2 lines]... DONE in < 1 second (3 errors, 0 warnings)

FILE: /home/mukai/test.php
--------------------------------------------------------------------------------
FOUND 3 ERROR(S) AFFECTING 1 LINE(S)
--------------------------------------------------------------------------------
 2 | ERROR | Missing file doc comment
 2 | ERROR | No comment block marks the end of file instead of the closing PHP
   |       | tag. Please add a comment block containing only "End of file
   |       | test.php".
 2 | ERROR | Unable to find "/application/" in file path
   |       | "/home/mukai/test.php". Please set your project's application
   |       | root.
--------------------------------------------------------------------------------

上記のようにメッセージが表示されればOKです。

PHP フレームワークの比較


質問があればお気軽にコメント欄へお願いします!(只今、作成中です)

以下は、10-15分で発表する予定の内容です。

比較表

名称 URI ライセンス 対応する PHP 最新バージョン stable releases 開発元
FuelPHP http://fuelphp.com MIT 5.3 or newer 1.3 コミュニティ
CodeIgniter http://codeigniter.com CodeIgniter License 5.1.6 or newer 2.1.3 アメリカのEllisLab
CakePHP http://cakephp.org MIT 5.2.8 or newer 2.2.2 アメリカのCakeソフトウェア財団
Symfony http://symfony.com MIT 5.3.2 or newer 2.1.2 フランスのSensio社

フレームワークの特徴

FuelPHP
  • 特徴は、↓

http://tatsu-zine.com/books/fuelphp1st

FuelPHP は、2011 年7 月に最初のバージョン1.0 がリリースされた最新のフレームワークです。先行する多くのフレームワークを参考に、PHP 5.3 の機能をフルに活用しゼロから開発されました。最初からMongoDB やRedis をサポートし、RESTful なコントローラをすぐに作成できる最先端のフルスタックフレームワークです。しかも、シンプルで覚えやすく、かつ、軽量高速です。
新しいフレームワークですが、すでにGitHub では100 人以上の開発者がFuelPHP の開発に参加しており、ユーザも徐々に増え、品質や安定度も急激によくなってきています。

  • 補足
    • 1.0〜1.2にかけては品質がよくなったかも?
    • 1.2〜1.4にかけては変化なしかも?

FuelPHP のこの1つめのバグは1.3での修正時にテストがコミットされていないから1.4の修正でエンバグしてるように見える。バージョンの管理方法もそうだけどこういう修正のやり方をやっている限りは安心して使えない

CodeIgniter
  • 軽量高速
  • 小規模開発向け
  • 日本ではライセンス問題で話題になっているが、日本国外では、あまり話題になっていない感じがある。(会場の参加者に質問する)
  • 内部構造を説明
    • FuelPHP との共通点、違うところを説明
  • 国内での採用実績
    • MTV Japan
CakePHP
  • 小・中規模開発向け
  • 日本ではもっとも人気があるPHPフレームワーク
  • 設定より規約
  • 多くのルール(規約)がある

http://gihyo.jp/book/2012/978-4-7741-5324-7

2011年末にリリースされたCakePHP2は、内部の構造や基本的なルールが見直され、従来の情報がそのままでは活用しにくい。

  • 内部構造を説明
Symfony
  • 大規模重厚
  • 多機能な分、インストールや習得に多くの時間がかかる
  • 重いといわれていたが、symfony 1から改良され、シンプル・高速
  • DIコンテナ
  • バンドル
  • フォーム改良
  • 対象ドメイン独立な本体の設計
  • 内部構造を説明