Asial Blog

Recruit! Asialで一緒に働きませんか?

森川穣

PHP_CodeSnifferで独自コーディングルール

カテゴリ :
バックエンド(プログラミング)
タグ :
コーディングルール
PHP
Tech
icon
PHP_CodeSnifferで独自のコーディングルールを定義する方法です。
かなり手間取ってしまいました。。。もっと楽な方法はないのでしょうか??

文字列のあいまい比較

カテゴリ :
バックエンド(プログラミング)
タグ :
PHP
Python
icon
PHPにはlevenshteinというレーベンシュタイン距離を計算する関数があるのですが、それをPostgreSQLのPL/Pythonで実装してみました。結果は…

Memcacheはやっぱりすごかった

カテゴリ :
バックエンド(プログラミング)
タグ :
icon
森川です。恥ずかしながらmemcacheを使うくらいならtmpfsとかMySQLのHEAPテーブルを使えばいいじゃん、などと思っていたのですが、今回簡単なベンチマークをやってみて心を入れ替えました。

MySQLのクライアントエンコーディング

カテゴリ :
バックエンド(インフラ)
タグ :
icon
森川です。

前回はマルチバイト関連でしたが、今回もマルチバイトです。前回ソースを解析するなどと言ってしまいましたが、中々難しくまだ途中です。決してあきらめたわけではないので、もう少しすればここに書けるようになると思います。

さて、今回はMySQLの文字コードについてです。4.1から文字コードの設定が色々と増えたので、設定をきちんとしていなくて問題が起きることも多かったのではないでしょうか。まずは簡単におさらいです。

CentOS4.4のパッケージを使用している場合はデフォルトの文字コードは以下のようになります。

mbstringのバグなのだろうか?

カテゴリ :
バックエンド(プログラミング)
タグ :
icon
こんばんは森川です。先日すべてShift_JISで書かれているおかしな環境で変な挙動をPHPがしたので少し調べてみた(おかしな環境で変な挙動も当然かもしれないけど)。

結局バグなのかどうかはわからないが(本来サポートされてないShift_JISで起きてるし)、とりあえずSegmentation faultとかzend_mm_heap corruptedとかまで起きたのでバグ報告だけは簡単にしておいた。詳しい内容は以下の通りです。


まずは、基本的なおさらい。PHPのマルチバイトのconfigureオプションには--with-mbstringと--enable-zend-multibyteがあります。

  1. --with-mbstring
  2. mbstring関数を使用するためのオプション(大抵の場合このオプションは有効なはず)
  3. --enable-zend-multibyte
  4. Zend Engine内でマルチバイト処理を行うためのオプション(あまり使われていない?)

ちなみに、zend-multibyteが有効になっていないと、Shift_JISで記述されたファイルでParse Errorが発生することがあります(当然といえば当然なのだが)。例えば以下のようなファイルがShift_JISで記述されていたとしましょう。

  1. <?php
  2. echo '可能';
  3. ?>

「能」という文字はShift_JISでは「945C」というバイナリであり、「5C」というバイナリは「\」となっているので、echo "xxxxx\"; を実行しようとしているのだ!とZend Engineは考え、Parse Errorが起きるわけです。

そして、zend-multibyteが有効になっていると、「能」をマルチバイトと認識することが可能となります。この機能を使用している人がどれほどいるかは謎ですが、このShift_JISを使用するのが結構問題です。

どんな問題が発生するかというと、PHPファイルでPHPタグがないファイルを実行しても文字化けもしくはSegmentation faultを起こすのです。ちなみにかなりのレアケースなので、この問題にあたる人はそんなにいないでしょう。

かなりがんばって作り上げた文字化けするファイルの内容は以下の通りです。[ダウンロード]

  1. <html>
  2. <head>
  3. <title>test</title>
  4. </head>
  5.  
  6. <body>
  7. あいうえおかきくけこ
  8. ファフィフェフェフォニャニィニュニェニョ
  9. asdfasdfasdfsdfjalsdkfja;sldfja;lsdkjf
  10. sdfasdf
  11. ピャピィピュピェピョ
  12. hogehoge hogehoge aaa
  13. ○○○ホゲホゲーuーー イイ
  14. 「「「「「「「「ーーーーー「「「「ー「ー「ー「ー「ー「ー「ー「
  15. アイウエオーカキクケコーサシスセソー★
  16. ァィゥェォガギグゲゴザジズゼゾダヂヅデドバビブベボ「パピプペポ」ナニヌネノhogehoge
  17. </body></html>

これを適当なPHPファイルとしてリネームします。改行・スペース一つ違うだけで文字化けしたりしなかったりなので結構注意が必要です。出力される内容は以下のようになります。script_encodingをShift_JISもしくはSJIS-winにしておくことを忘れずに。

  1. あいうえおかきくけこファフィフェフェフォニャニィニュニェニョ asdfasdfasdfsdfjalsdkfja;sldfja;lsdkjf sdfasdf ピャピィピュピェピョ hogehoge hogehoge aaa ○○○ホゲホゲーuーー イイイ ウ「「「「「「「「ーーーーー「「「「ー「ー「ー「ー「ー「ー「ー「アイウエオーカキクケコーサシスセソー★ ァィゥェォガギグゲゴザジズゼゾダ・沍糟沍・沍柱沍阜沍・沍膜沍・沍洛沍′阜・・・膜・・・洛・・・東・伯譜ogehoge

そして上記のファイルのasdfasdfasdfasdf..... という行を削除して実行するとSegmentation Faultで落ちます。他にもzend_mm_heap corruptedなどのメッセージも出てきました。バイナリファイルを実行しているようなものだけど、使用しているものはJIS第一水準だと思うので、できたら修正して欲しいところです。

ちなみに、自分は script_encoding は使用していません。設定がある場合でも UTF-8 にしておきます。なんだかんだといって、UTF-8が一番よいです。

これを機に少し勉強しようと思って zend_multibyte.c とか mbstring.c なんかを少し眺めていたのですが、よくわからなかった。。ということでGWにちゃんと見て理解しよう!と宣言しておけばきっとやるはず。。。

PHP再発見

カテゴリ :
バックエンド(プログラミング)
タグ :
icon
森川です。

モンテカルロ法でπの計算を行うブログを見つけたので、それに触発されてそのスクリプトをPythonとRubyで書いてみました。

PHP
  1. <?php
  2. $iteration = 100000; 
  3. $precision= 1000000;
  4.  
  5. for ($i = 0; $i < $iteration; $i++) { 
  6.   $x = mt_rand( 0, 2 * $precision ) / $precision - 1; 
  7.   $y = mt_rand( 0, 2 * $precision ) / $precision - 1; 
  8.   if ((($x * $x) + ($y * $y)) < 1 ) {   
  9.     $hits++;
  10.   }  
  11. }

Python
  1. from random import *
  2. iteration = 100000
  3. i = 0
  4. hits = 0
  5. seed() 
  6. while i < iteration: 
  7.   i = i + 1
  8.   x = random()
  9.   y = random()
  10.   if (((x * x) + (y * y)) < 1) :
  11.     hits = hits + 1
  12. print "PI is about", (float)(4 * hits) / (float)(iteration), "
    \n"

Ruby
  1. iteration = 100000
  2. i = 0
  3. hits = 0
  4. while i < iteration
  5.   i = i + 1
  6.   x = rand()
  7.   y = rand()
  8.   if (((x * x) + (y * y)) < 1) :
  9.     hits = hits + 1
  10.   end
  11. end
  12. print "PI is about", (4*hits).quo(iteration) , "
    \n"

このスクリプト自体は全然難しくないので、すぐにPythonでもRubyでも書くことができましたが、そんな中でもPHPの良さを再発見することができました。
それは、マニュアルの見やすさです。

PHPのマニュアルは説明の中に出てくる関数にリンクが貼られていて、すぐその内容を調べることができます。また、関数の説明にサンプルがかなりの確率で付いているので、すごくスクリプトを書きやすいです。

それと、比較してみるとわかるのが、キャストの柔軟性です。特に変数に型がないので、割り算の結果を少数にするのが一番簡単です。

ただ、Pythonの書き方が非常に簡単で個人的には好きです。Rubyはオブジェクト指向な部分がこのスクリプトでも quo などに表れていますが、PHPに慣れていると少しとまどってしまいます。まぁJavaScriptと同じと考えると割とすんなり入っていけるかなぁとも思いますが。

さらに、PHPの実行スピードは意外と速い。以下は実行時間を計ってみた場合のログですが、PHPが一番速く、続いてPython、Rubyは for if や変数の代入などの処理が大きいようです。


  1. #time php monte.php
  2. PI is about3.14408
  3. real    0m0.221s
  4. user    0m0.214s
  5. sys     0m0.008s

  1. #time python monte.py
  2. PI is about 3.14396 
  3. real    0m0.262s
  4. user    0m0.255s
  5. sys     0m0.006s

  1. #time ruby monte.rb
  2. PI is about3.14556
  3. real    0m0.400s
  4. user    0m0.395s
  5. sys     0m0.005s

意外とPHPは遅いと思われているかもしれないけれど、計算や繰り返し処理単体では決して遅くはありません!!!

キーボードがレベルアップ

カテゴリ :
日常
タグ :
realforce.jpg
新しく出た玄箱が気になってしょうがない森川です。

そうです、玄箱がレベルアップして登場しました。CPUもレベルアップして、FLASHメモリからブートもできるようなっています!

これでもうカーネルのインストールに失敗したら初めからやりなおし。。。なんてこともなくなるはず!

早速購入しようと秋葉原に先日出向いたものの、あえなく売り切れでしたorz

その気分の高揚を押さえるために、なぜかキーボードを買ってしまいました。

新しく買ったキーボードはRealForce。今まで使っていたキーボードもRealForce。

あれ?変わってない。。。

以前はRealForce91を使用していたのですが、CapsLockとCtrlをディップスイッチで入れ替えることができるRealForce89Uを購入してしまいました。



Windowsキーがないので、結構困りものなのですが、無変換を代用して使用しています。

打鍵感はほとんど変わらないですが、以前のものより若干軽い感じがして、さらにスラスラと打ち込めます。

プログラミング速度がスピードアップすればよいのですが、どうなることやら。。

タイピングスピードNo.1の座

カテゴリ :
日常
タグ :
icon
こんばんは、森川です。

社内でタイピングゲームを流行らせた張本人だったりします。

当然自信がそれなりにあったので、社員を引きずり込んでいったわけなのですが、僕の記録を脅かす新人が。。。

タイプウェルをやっていることはすでに以前触れていますが、僕の最高記録は、

39.4 秒

しかし、最近入ってきた新人は 40秒をたたき出すという離れ業を1週間ほどで成し遂げてしまったのです。。。

これには困ったモノで、とりあえず言い出しっぺが負けるわけにもいかないので、35秒くらいを目指してひそかに練習中だったりします。。


がんばれ、自分!!

アルゴリズムの勉強をしています

カテゴリ :
日常
タグ :
icon
最近、朝少しだけ早く来てみんなでアルゴリズムの勉強をしています。これが意外と楽しくて楽しくて、本来の仕事にまで影響を及ぼしてしまいそうです^^;

アルゴリズムといってもメジャーなソートアルゴリズムや文字列検索アルゴリズムをWikipediaで探して、そのアルゴリズムを個々人の好みの言語で実装しています。

PHP以外の言語に普段あまり触れていないせいか、これもまた楽しくて楽しくて、ついつい仕事の開始時間が遅くなっていたりします…

PHP言語以外にもRubyやPython、JavaScript、C言語など色々な言語での実装があるので他人のコードを見ているだけでも面白いですよ。

ちなみに、勉強会を通して知ったのですが、普通にコマンドラインから実行した場合の、C言語、Python、PHPの実行速度を調べてみると、なんとPHPの方がPythonよりも速いんです(って間違っているかもしれませんが。。。

やっぱりPHP5.1以降はfor、whileなんかは結構速いです

もちろんC言語が最速ですけどね(さらに言ってしまえばアセンブラ。。。

マニュアルがパワーアップしました

カテゴリ :
日常
タグ :
PHPプロ
icon
改良中だった、マニュアルがほんの少しパワーアップしました。

ページ内の関数にカーソルをあてるとポップアップがでてくるツールチップ機能を追加しました。同様の機能はPHP講座(saity先生のPHP講座)にも追加してあります。

また、サイドバーにツリーメニューを追加してあるので、そちらから類似関数を探すこともできます。

以外と知られていないかもいませんが、phppro.jp/str_replace のようにドメイン名に続けて関数名を打ち込めば、直接関数の説明ページにジャンプすることができます。

ここらへんの検索機能も充実させていきたいと思いますので、ぜひぜひご利用ください。