2014年2月24日月曜日

最近気になるPHPフレームワークHelloWord性能比較大会

最近気になっているPHPフレームワークのベンチマークを取得してみました。
サーバやフレームワークなどのチューニングはほとんどしていないので、
結果は、あくまで参考程度としてください。

テスト環境

仮想環境 (1CPU memory 4GB)
PHP 5.5.9 (opcache使用)
NGINX 1.4.5

確認したコマンド※

ab -n 1000 -c 20 http://localhost.local/
※外部からではなく同じサーバで実施しています。

結果


Phalcon 1.2.6


Time taken for tests: 0.523 seconds
Requests per second: 1910.87 [#/sec]

FuelPHP 1.7


Time taken for tests: 1.704 seconds
Requests per second: 586.90 [#/sec]

Laravel 4.1


Time taken for tests: 6.171 seconds
Requests per second: 162.04 [#/sec]

php artisan optimizeで最適化
Time taken for tests: 4.925 seconds
Requests per second: 203.02 [#/sec]

Ruby on Rails 4.0.3 (特別ゲスト)


Time taken for tests: 2.851 seconds
Requests per second: 350.73 [#/sec]

Ruby On Rails4も含めてみました。
環境はPHPとは異なり次のとおりです。
NGINX 1.4.4
Passenger4.0.37
ruby 2.1.0

感想


Phalconが圧倒的な処理速度で1位です。
Laravelと比較すると約11倍以上速いですね。
FuelPHPはLaravel寄りではありますが、まずまずの性能です。

artisanコマンドで最適化されたLaravelでもそれほど大幅には変化がなかった(でもLaravel比だと25%アップ)ので、速度が出ないのは、autoloadが原因ということはなさそうです。
LaravelはIoC Containerというのが得意で、コードがきれいで書きやすいのですが、
それが原因かどうかはわかりませんがパフォーマンス面では他に劣るようです。
今のところPHPでもRailsと同様にパフォーマンスと便利な機能は相反するようですね。
またPhalconが速いのはC言語で実装されたフレームワークの部分だけなのでPHP部分はそんなに変わらないのではないかと思います。
結果はPhalconが目立ちすぎてますが、実際のロジックを実装した状態ではそこまでは差がないのではないかと考えています。
また、PhalconはC言語で実装されているので運用面でトラブルの際の調査も難しくなりそうで、
仕事に使うのはZephirで実装されるバージョン2.0までは様子をみようかと思っています。
Zephirは今後どうなるか気になるところです。
LaravelがZephirで実装されたりとか・・・、今のところその動きはなさそうですが。

Railsは、言語違いますがフルスタックのフレームワークの代表例として参考になるかと思って追加しました。
LaravelとFuelPHPの中間くらいで以前より速くなってますね。
RubyのVMが進化していたり、Rails自体もチューニングが進んでいるのかも。

いずれにせよ、現実的ではないHelloWorld程度の比較なので、
あまりこの結果を鵜呑みにしないようにご注意ください。



2014年2月3日月曜日

Python3.3.3でdistributeインストール中のエラー

ランチ食べ過ぎて若干苦しい昼下がり、
Python3.3.3環境を作ってみたところ、distributeのインストールでこけましたとさ。 環境は、VagrantのCentOS6.5環境
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py

Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
Traceback (most recent call last):
  File "distribute_setup.py", line 556, in 
    sys.exit(main())
  File "distribute_setup.py", line 552, in main
    tarball = download_setuptools(download_base=options.download_base)
  File "distribute_setup.py", line 211, in download_setuptools
    src = urlopen(url)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 156, in urlopen
    return opener.open(url, data, timeout)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 475, in open
    response = meth(req, response)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 587, in http_response
    'http', request, response, code, msg, hdrs)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 507, in error
    result = self._call_chain(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 692, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 469, in open
    response = self._open(req, data)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 492, in _open
    'unknown_open', req)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 447, in _call_chain
    result = func(*args)
  File "/home/ono/.pythonz/pythons/CPython-3.3.3/lib/python3.3/urllib/request.py", line 1310, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: 

stackoverflow先生によるとopenssl-develが必要らしい
http://stackoverflow.com/questions/18833442/installing-distribute-for-python-3-3
しかも、openssl-develインストール済みの状態でpyothon3をビルドしないとダメっぽい。

openssl-develを忘るべからず

yum install openssl-devel.x86_64
pythonz uninstall 3.3.3
pythonz install 3.3.3
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py
ちなみにpythonzで入れた3.3.3のpythonのシンボリックリンクがpython3-configに向いてるんですが・・・・
びっくりした・・・。ので、リンク張り直した。
python -> ~/.pythonz/pythons/CPython-3.3.3/bin/python3.3-config

rm -f ~/.pythonz/pythons/CPython-3.3.3/bin/python
ln -s ~/.pythonz/pythons/CPython-3.3.3/bin/python3.3 ~/.pythonz/pythons/CPython-3.3.3/bin/python

stackoverflow先生今日もありがとう!

2014年1月29日水曜日

Xcode5でアイコン画像が変更できない場合の対処方法

Asset Catalog以前の環境ですが、アイコン画像を変更してもなぜか反映されない症状が発生しました。
そういえば、この症状は・・・。

Xcodeのワークスペース(DerivedData)の削除

いろいろ試してみるも効果があったのは、Xcodeのワークスペースの削除でした。
メニューの[Window]->[Organizer]を開いて、Derived Dataの[Delete]ボタンで削除できます。
または、オーガナイザーでパスも見えているので、Finderや直接コマンドでもOKです。
cd ~/Library/Developer/Xcode/DerivedData
rm -fr ProjectName-xxxxxxxxxx
変なところではまりたくないものですね。

2014年1月25日土曜日

NGINXの仮想ホスト名(server_nameディレクティブ)のメモ

NGINXで仮想ホスト名(サーバ名)を指定する方法が公式のドキュメントにコンパクトにまとまっていたのでメモ。
あまり難しいことをやらない分わかりやすいですね。

マスタリングNGINX(20,21ページ)はもう少し詳しいですが、普通の使い方なら以下の完全一致、ワイルドカード、正規表現の内容で十分かもしれません。


サーバ名

http://nginx.org/ja/docs/http/server_names.html

以下引用です。

サーバ名解決の優先順位

  1. 完全一致名
  2. アスタリスクで始まるワイルドカード名: *.example.org
  3. アスタリスクで終わるワイルドカード名: mail.*
  4. 設定ファイル内の順序での正規表現

ワイルドカード

・ワイルドカード名にはそのサーバ名の最初か最後のみ、そしてドットに隣接したところのみにアスタリスクが含まれます。
・サーバ名 www.*.example.org や w*.example.org は無効です。
・特別なワイルドカードの形式 .example.org は、完全一致名 example.org とワイルドカード名 *.example.org の両方にマッチさせるように利用できます。

正規表現

サーバ名は正規表現を使用して、例えば ~^www\..+\.example\.org$ や ~^w.*\.example\.org$ として指定することができます。

ワイルドカードで有効なサーバ名の指定方法

server_name *.example.org
server_name example.*
server_name ~^www\..+\.example\.org$
server_name ~^w.*\.example\.org$

無効なサーバ名の指定方法

server_name www*.example.org
server_name www.*.example.org

サーバ名未定義のリクエストを防ぐには、_のように無効なドメイン名を使います。

サーバ名未定義のリクエストの処理を防ぐ

http://nginx.org/ja/docs/http/request_processing.html#how_to_prevent_undefined_server_names
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
シンプルでわかりやすいルールですね。
仕事ではApacheを使うことが多いですが、個人的にはNGINXいいですね。

2014年1月23日木曜日

Vagrant環境でMySQL5.6が起動しない?

VagrantでCentOS6.5でMySQLインストールしても起動しない・・・、
MySQL5.6だから?とかmy.cnfの設定がダメ?とかいろいろ考えすぎましたが、
デフォルトでも起動しないためそんなことはないようです。
ログには Cannot allocate memory・・・・と、
空きメモリーあるんだけどなと思いつつもinnodb_buffer_pool_sizeを小さくしてもダメでした。
[Note] InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

対策

メモリー(物理)を増やすほど富豪ではなかったのでswap領域を追加してみることにしました。

swap領域の確認

swapon -s
Filename    Type  Size Used Priority
確かにありません・・・。

スワップ領域作成

容量は環境に合わせて適宜変更してください。
sudo dd if=/dev/zero of=/swapfile bs=1024k count=512
sudo mkswap /swapfile
sudo swapon /swapfile
sudo chown root:root /swapfile
sudo chmod 0600 /swapfile

再起動しても反映されるように修正

sudo vi /etc/fstab
# 次の行を追記
/swapfile swap swap defaults 0 0 

OSのスワップの利用頻度を低くする

できるだけスワップしない用に設定する(0〜100) 100の方が多くスワップ領域を使用する
vi /etc/sysctl.conf
vm.swappiness=10
sysctl -p 

これで無事にMySQL5.6が起動したのでいろいろ検証できます。
ちなみにPHPでもワーニング出ていたのが解消しました。
 PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/gd.so' - libvpx.so.0: cannot map zero-fill pages: Cannot allocate memory in Unknown on line 0
ここにもさりげなくCannot allocate memoryが。
ワーニング?・・・レベルなのかな・・・

2013年11月10日日曜日

Python 3.3.2でmysql-connector-pythonを試す

Python3.3.2でmysql-connnector-pythonを試してみました。

1. pipでインストール

pip install mysql-connector-python
pipではインストールできませんでした。ドキュメントでは3.1は対応しているようなのですが無理っぽいですね。
$ pip install mysql-connector-python
途中省略
error: invalid command 'egg_info'

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip_build_user/mysql-connector-python
Storing complete log in /path/to/.pip/pip.log

2. MySQL Connector/Pythonを確認

ChangeLogを確認したところ
1.1.0の開発版からprint()文に変更されているので、Python3系の対応が行われているっぽい
http://dev.mysql.com/doc/relnotes/connector-python/en/news-1-1-0.html

いずれにせよ安定版ではないので、少しでもバグフィックが多い最新バージョンの1.1.2をインストールしてみます。
Changes in MySQL Connector/Python 1.1.2 (2013-10-23)

ちなみにまだリリースされていない1.1.3の情報では、sjisなどバックスラッシュ(0x5c)問題があるようなので、sjisを扱う場合は導入はまだ難しいようです。
Changes in MySQL Connector/Python 1.1.3 (Not yet released)

3. ソースコードでインストール

ソースコードはこちらから http://dev.mysql.com/downloads/connector/python/
curl -L -o mysql-connector-python-1.1.2.tar.gz "http://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-1.1.2.tar.gz/from/http://cdn.mysql.com/"
tar zxfv mysql-connector-python-1.1.2.tar.gz
mysql-connector-python-1.1.2
python setup.py install

4. 動作確認

$ python
Python 3.3.2 (default, Nov  3 2013, 19:17:12)
[GCC 4.7.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector
>>> config = {
...    'user': 'username',
...    'password': 'password',
...    'host': '127.0.0.1',
...    'database': 'databasename',
... }
>>> cnx = mysql.connector.connect(**config)
>>> cur = cnx.cursor(buffered=True)
>>> cur.execute("SHOW STATUS LIKE 'Uptime'")
>>> print(cur.fetchone())
('Uptime', '678')
>>> cur.close()
True
>>> cnx.close()
簡単な動作確認ですが、動作しました。

2013年10月26日土曜日

Mac OS X 10.8 (Mountain Lion) -> 10.9 (Mavericks) アップグレードしてみた

新しいOSが出たらすぐにアップデート派なので、
発表されてすぐに10.8 (Mountain Lion) -> 10.9 (Marvericks)アップグレードしました。

当然新しいOSにはトラブルがつきもので、
もちろん覚悟はしていたのですが以外に無くてびっくりしています。
また機能的にはデスクトップやマルチモニタ環境の改善がすごく気に入っています。

が、しかし、100%問題無いということは無いので、アプリケーションの対応状況について実際に動作させて気になった点をご紹介いたします。

以下クリーンインストールではなく10.8からのアップデートという前提となります。

まずは致命的な所からのご紹介です。


Intel HAXM [×]

http://software.intel.com/en-us/forums/topic/477793

Intel HAXMのように致命的なものもあったりするので、仕事で使っているMacの場合は、使用しているアプリケーションが正式対応するまで待った方が安全かと思います。ちなみに実際に試してみましたがIntel HAXMを使用しているエミュレータ等を起動するとカーネルパニックになって電源OFF,ONしか復旧できません。Titanium MobileとかTizenなど開発に影響が出ているようです。

でも、こちらも中の人が反応してくれているので、
近いうちに10.9対応版がリリースするのではないかと思います。

追記 2013-10-29
Intel HAXM teamがMavericksとWindows8.1対応版をテスト中らしいです。

アンインストール方法

sudo /System/Library/Extensions/intelhaxm.kext/Contents/Resources/uninstall.sh

追記 2013-11-06
Mavericks用のhotfix(バージョン1.0.7)を適用したら動作しました。
http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager


MacPorts [△]
対応しているバージョンは、2.2.1以上ですね。
しかも、再ビルドが必要な場合が多いようです。
けっこうな手間ですが、今後のために再構築します。

ソースコード
https://distfiles.macports.org/MacPorts/MacPorts-2.2.1.tar.bz2
パッケージ
https://distfiles.macports.org/MacPorts/MacPorts-2.2.1-10.9-Mavericks.pkg

いろいろ問題はあるようでこちらにまとめられています。
http://trac.macports.org/wiki/MavericksProblems

ソースコードをビルドすると次のようにtclで止まります。おそらくオプションつければいけるとは思いますが、ここは素直にパッケージで導入しました。
checking for Tcl configuration... configure: error: Can't find Tcl configuration definitions

VMWare Fusion [△〜◯]

4系は動作しないという情報も目にしたのですが、私の場合は、動作しています。
WindowsXPもWindows8.1も動作上は問題ないですね。

追記 2013-10-29
既存環境が動作する分には問題ないですが、設定変更などができませんでした。

5系は、仕事用のMacで使用していて、こちらはまだアップデートしていないのですが、Marvericksのマルチモニタ機能には対応していないようですが、動作しないということはなさそうですね。
https://discussionsjapan.apple.com/message/100804960#100804960

6系で正式に対応ってことですね。

追記 2013-10-29
正式にMavericksとWindows8.1対応版がリリースされました。
http://t.co/y0Aazo1vyn

VirtualBoxとVagrant [◯]

以前バージョンでは下記のようなエラーが出て起動しませんでした。
こちらも最新バージョンにアップデートして解決しました。

VirtualBox 4.3
https://www.virtualbox.org/wiki/Downloads
追記 2013-11-02
インストーラに含まれるVirtualBox_Uninstall.toolで前のバージョンをアンインストールしてから4.3.2をインストールする

直らない場合は、次のコマンドで回避できそう。私の環境は不要でした。
sudo launchctl load /Library/LaunchDaemons/org.virtualbox.startup.plist

Vagrant 1.3.5
http://downloads.vagrantup.com/tags/v1.3.5

VirtualBoxバージョンアップ前
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 68 of file VBoxManageHostonly.cpp

Vagrantバージョンアップ前
$ vagrant up
Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

プログラミング言語  [個人的に◎]

とりあえずバージョンをさらしてみます。
perl -v
This is perl 5, version 16, subversion 2 (v5.16.2) built for darwin-thread-multi-2level (with 3 registered patches, see perl -V for more detail)

php -v
PHP 5.4.17 (cli) (built: Aug 25 2013 02:03:38)

python --version
Python 2.7.5

ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
個人的にはどれもすぐに開発で使えるバージョンですね。
こういうの地味に助かるんじゃないでしょうか。

あと、Chrome, Firebox, Safari, Dropbox, Evernote, Office2011, SublimeText, Coda2, mi, などなど・・・今のところ問題なくアッグレードはすごく満足度が高いものとなりました。