B-Teck!

お仕事からゲームまで幅広く

【PHP】2つの文字列を比較して差異の数を取得する

2つの文字列から、長さの差も含めて差異のある文字数を取得するメソッド

str_splitのマルチバイト対応版がないので、

<?php
preg_split("//u", $i_str1, -1, PREG_SPLIT_NO_EMPTY);

で文字列を一文字ずつの配列にバラして、ループで比較する。

  

<?php
        /**
         *  2つの文字列に差異が何文字あるかを取得
         *
         * @access public
         * @param  string $i_str1 文字列1
         * @param  string $i_str2 文字列2
         * @return int    $failCount 差異のあった文字数
         */
        function checkDiffString($i_str1, $i_str2){
            //文字の長さを取得
            $strLength1 = mb_strlen($i_str1);
            $strLength2 = mb_strlen($i_str2);
            //比較する文字数を取得
            $compLength = min($strLength1, $strLength2);
            
            //文字列を配列に変換
            $aryStr1 = preg_split("//u", $i_str1, -1, PREG_SPLIT_NO_EMPTY);
            $aryStr2 = preg_split("//u", $i_str2, -1, PREG_SPLIT_NO_EMPTY);
            
            //1文字ずつ比較
            for($i = 0, $failCount = 0;$i < $compLength;$i++){
                if($aryStr1[$i] !== $aryStr2[$i]){
                   $failCount += 1; 
                }
            }
            
            //差分を加算
            $failCount += abs($strLength1 - $strLength2);
            
            return $failCount;
        }

        //正解
        echo (checkDiffString("apple", "apple") === 0)."\n"; 
        echo (checkDiffString("アップル", "アップル") === 0) ."\n";
        
        //文字数少ない
        echo (checkDiffString("apple", "appl") === 1)."\n";  
        echo (checkDiffString("appl", "apple") ===  1)."\n";  
        echo (checkDiffString("アップル", "") ===  3)."\n"; 
        echo (checkDiffString("", "アップル") ===  3)."\n"; 
        
        //文字数多い
        echo (checkDiffString("apple", "applee") ===  1)."\n";
        echo (checkDiffString("applee", "apple") ===  1)."\n";
        echo (checkDiffString("アップル", "アップルル") ===  1)."\n";
        echo (checkDiffString("アップルル", "アップル") ===  1)."\n";
        
        //先頭違い
        echo (checkDiffString("apple", "xxxle") ===  3)."\n"; 
        echo (checkDiffString("xxxle", "apple") ===  3)."\n"; 
        echo (checkDiffString("アップル", "イップル") ===  1)."\n"; 
        echo (checkDiffString("イップル", "アップル") ===  1)."\n"; 
        
        //末尾違い
        echo (checkDiffString("apple", "apxxx") ===  3)."\n"; 
        echo (checkDiffString("apxxx", "apple") ===  3)."\n"; 
        echo (checkDiffString("アップル", "アップア") ===  1)."\n"; 
        echo (checkDiffString("アップア", "アップル") ===  1)."\n"; 

【PHP】PHPカンファレンス2015にいってきました

f:id:beatdjam:20151008005023p:plain 

phpカンファレンス2015に行ってきました

  • 強そうなPHPerがいっぱいいてビビりながら過ごした
  • スポンサーブースでPHPStormの新ライセンスの話聞いたりした
  • IZANAGIすげぇ 試したい
  • 生Rasmus Lerdorf見て興奮した
  • めっちゃ刺激を受けたので来年も行きたい

以下セッション振り返り用メモ


PHPの今とこれから 2015

  • PHPはリリースサイクルを守ってリリースされているが、84%のユーザーが5.4以前のバージョンを利用している
    → コミュニティにバージョンアップを促していくのは難しい

PHP7

  • 従来に比べてかなりの高速化
  • 致命的エラーをcatchできるように
  • スカラー型宣言と戻り型宣言ができるようになる(Strictモードのみ)
  • スペースシップ演算子で< = > の三条件を一度で判定できるようになる

最近のSQLインジェクションの話題総まとめ

1. SQLインジェクションの責任は開発者にあるか

  • SQLインジェクションは、当該部分の機能に関わらず様々なデータを読み出すことができるので重過失
  • 経済産業省の公開している「安全なWebサイトの作り方」が指針として判例に影響を与えた事例
    専門家として当然考慮するべき責務
  • 開発する上で考慮するべき事案が発生した際、対応策を発注者側へ提案しておくことで、責任を一部免れることができる
  • admin/passwordやばい

2. SQL入門書の脆弱性

3. ORマッパーとSQLジェネレーターのSQLインジェクション

  • SQLジェネレータの実装(開発者の仕様の考慮漏れや想定外パラメータ等の影響)でSQLインジェクションが発生する場合がある
  • 利用者はバリデーションをしっかりして、マニュアルをちゃんと読むべし

基調講演

talks.php.net

  • PHPの今とこれから 2015と同様に新機能の紹介+各種ベンチ等
  • 速度計測はWordPressの1リクエストで計測している →2倍高速化した
  • JITを導入する(予定)なのでもっと早くなる
  • リリース前なら直せるからテスト手伝ってほしい

質疑応答
Q.mb系の関数が統合されることはあるか
A.現状その予定はない

Q.どのようなパフォーマンス向上があるか
A.多くの面において高速化を行ったため、挙げることができない
しいていうならファイルベースのキャッシュ周り

Q.PHPでは推奨フレームワークはあるのか
A.PHPの開発者はPHPで開発を行っているわけではないから答えられない
モジュール化されているフレームワークを、必要な分だけ取り入れるのがいいのではないか

Q.PHPのPはPersonal~から来ているという話もあるが?
A.あえて意味を求める人のためにそう呼ぶ事はあるけど、PHPPHP

Q.古いExtensionを移行するようなツールは用意されるか
A.用意する予定はない
すでに移行が行われている例があるので、参考にすると良い

DMMのハイパー メディアオタサーの姫 arimoが語る Phalcon

  • 30分のうち10分を自己紹介等々で使ってた。
  • FuelPHPからPhalconに書き換えた話
  • Phalconとは
    フルスタックフレームワーク
    早い
    1.x系=C言語 2.x系=Zephir(PHP的な新言語)
    FuelよりCoreが追いづらい
  • Phalconの闇
    日本語の情報ソースが少なく、英語ドキュメントを読み解く必要がある
    configを環境によって切り替える機能がない
    ORMの使い勝手があまり良くない
    レアな技術使うと中の人がつらそう

脆弱性もバグ、だからテストしよう

  • ユニットテストや受け入れテストに比べてセキュリティテストは後回しにされがち
  • 後半の工程で行われることが多いため、脆弱性が見つかった場合は大きな手戻りが発生する
  • CIのサイクルに組み込むことで手戻りを少なくできるのではないか
  • エンジニアに優しいテストの仕組み「VAddy」を作った
  • 事前にクロール(アプリケーションの操作情報の記録)を行うことで自動テストが行える
  • 自動で継続的にセキュリティテストを行っていくことは今後トレンドになっていくんじゃないか

LT

PHPer女子が語る2015!こんなコードを書くヒトはモテない~コラボ編~

  • 女子エンジニアにモテたい(願望)

ランダムデータをPHPで作る

PHPRubyのゲームを攻略する PHPWarrior

  • Rubyだと実力が出せないからPHPで再実装してPHPで攻略する
  • $マークがいっぱいあると安心
  • ロシア圏で人気になったからロシア語対応した
  • ついでに日本語も対応した

良心的にまじめに開発するための心構え

  • 考えて、良心を持って開発したら圧倒的成長(?)
  • 命名とか、設計とか、ここにあれば楽じゃなくてここにあるべき、知っているべきで考える
  • やりすぎると老害

PHPでDIをする

  • 依存性の注入について
  • DIコンテナの使い方とメリット

サンタクロースを支えるIT技術 チャリティーサンタ

  • 自分のやりたいことをボランティア活動で実現しててつよい

phpと夫婦生活

  • 夫婦で暮らしていく中でやはり自宅プロダクトはやりづらくなるんだろうなぁって感じ
  • でも幸せそう

(あなたにもできるかもしれない)ローカルPHPカンファレンスの作り方

THE NEW "PERFECT PHP" WILL BE COMING SOON

  • 2016年に出るらしい
  • 会場で売ってた気がしたけど買った人ちょっとかわいそう

小説執筆の現場で活躍するPHP

  • 自分の活動のためにプログラムを活用する話

蚊にさされないためのPHP

  • 予想外の力技
  • ビルのセキュリティ的にいいのか…?

ISUCON2015 PHPで予選を戦ってみた

  • PHP7はつよくてはやい

参考

togetter.com gihyo.jp techstars.jp

【PHP】CakePHP2.Xのチュートリアルでインストール時に引っかかったこと

CakePHP2.6.2のチュートリアルでインストール時に幾つか躓いたのでメモ代わりに

入門 — CakePHP Cookbook 2.x ドキュメント


・DebugKitのエラーが消えない!

f:id:beatdjam:20150313140947p:plain

とりあえずチュートリアルの言うとおりにインストールを進めてエラー表示を消していっても、画面下部のDebugKitの表記が残ってしまう。

DebugKit is not installed. It will help you inspect and debug different aspects of your application.
You can install it from github

この表示を消すにはDebugKitを入れてやる必要がある。

下記のサイトを参考にしてDebugKitのインストールをした。

参考:
CakePHPを入れた時にでるDebugKitのエラーを消すには | 人生休暇中

 
が、ここで注意!

上記サイトに記載されているように、AppController.phpに下記を記載した場合、別の問題が発生する場合がある。

<?php
    class AppController extends Controller {
        public $components = array('DebugKit.Toolbar');
    }

 
 

・setFlash()でエラーが出る

f:id:beatdjam:20150313143428p:plain
この後のステップでセッション関連の操作を行った場合に、エラーが表示されてしまう!

Error: Call to a member function setFlash() on a non-object

これを解決するには、このようにAppController.phpを設定しよう。

<?php
    class AppController extends Controller {
        public $components = array('DebugKit.Toolbar','Session');
    }

Sessionを追記することで正常に操作が行えるようになる。

参考:
CakePHP 2.3.10 で「Error: Call to a member function setFlash() on a non-object」の対処 | Check!Site