Monthly Archives: May 2014

NetBeans 8.0のbackground scanning of projectsが終わらない問題

NetBeans 8.0を使っていますが、background scanning of projectsが終わらない問題が発生しました。
PCリソースを食う食う。バッテリーがどんどん無くなっていきました。

強制終了して、再起動しても、スキャンが再開してしまい、終わりませんでした。
NetBeansの削除、再インストールで、スキャンが終了しました。

うーん。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:3.CSSとJavascript編)

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム
 1.アプリ紹介編
 2.環境設定
  1.ライブラリインストール編
  2.Apache mod_rewrite設定編

の続きです。

WebアプリケーションにはCSSフレームワークのBootstrapを使っています。bootstrapサイトからダウンロードし、

/var/www/html/runa-cca/
 |-htdocs ... 公開用ディレクトリ
 |   |-vendor
 |       |-bootstrap ... ここ!

に展開します。Bootstrap単体ではなく、テーマであるBootswatchを使っています。Bootswatchサイトからbootstrap.min.cssと、bootstrap.cssとをダウンロードし、/htdocs/vendor/bootstrap配下のファイルを置き換えます。

ほかに、

・JQuery
・Twilio.js(Twilioクライアントライブラリ)

を使っていますが、ソース指定で利用するため、インストールは不要です。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:2.Apache mod_rewrite設定編)

WebサーバにApacheを使っている場合の設定は、SlimのGitHubに極めてシンプルにまとめられています。

以下のように.htaccessに書いてね、とのことです。さっぱりとした説明ですな。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

Slimのパッケージにもサンプルが付いてきます。
RewriteEngine Onとありますので、mod_rewriteを使うということがわかります。
むろん、.htaccessを使うので、ApacheにAllowOverrideの設定が必要になります。

まず、Apacheのconfファイルの設定は、エイリアスを切る場合だと、

Alias /runa-cca/ "/var/www/html/runa-cca/"
<Directory "/var/www/html/runa-cca/">
     AllowOverride All
</Location>

のようになります。

.htaccessをどう書くかなのですが、以下のようにしました。

RewriteEngine On
RewriteBase /runa-cca
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

「RewriteEngine On」は、Apacheでmod_rewriteを使うために必要です。
「RewriteBase /runa-cca」は、エイリアスを切っているので必要になります。URL書き換えのベースとなります。

実験してみたのですが、RewriteBaseが無いと、

Request exceeded the limit of 10 internal redirects due to probable configuration error.

というエラーがapache_error.logに出力されます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/runa-cca index.php [QSA,L]

と書くと、エラーは止まります。しかし、Runa-CCAのインデックスページ(/runa-cca/)からログインしたとき(/runa-cca/login)にファイルが見つからないと怒られます。
ということで、RewiteBaseは設定が必要。

「RewriteCond」と「RewriteRule」ですが、入り口としては「Apache mod_rewrite Introduction」のページが参考になります。わかりやすく説明されていました。私が使ったのはApache 2.2系列ですが、ドキュメントは新しい方がいいかなあと思って、2.4系列のURLをご紹介しております。

「RewriteCond」は「Apache Module mod_rewrite」を参照。細かく書いてあります。

「RewriteCond %{REQUEST_FILENAME} !-f」は、指定されたファイルが存在しない場合
「RewriteCond %{REQUEST_FILENAME} !-d」は、指定されたフォルダが存在しない場合

です。
Slimのサンプルに「!-d」が無い理由はわかりませんでした。私は付けておくことにしました。

「RewriteRule」は「RewriteRule Flags」を参照。これまた細かく書いてあります。
「RewriteRule ^ index.php [QSA,L]」は、すべてをindex.phpにまわせ、クエリーストリング(/pages/123?one=twoのone=two)は付けたままにしろ(QSA|qsappend)、書き換えルールはここでストーップ(L|last)という意味です。「^」の解釈に悩みましたが、「.*」にしても同じ動作でした。すべて、ということでしょう。

調べるの大変でした・・・。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:1.ライブラリインストール編)

こちらのページでも紹介していますが、Twilioを使ったアプリケーション(Webクライアント+コールフロー)を作成しました。

以下の本を読みまして、PHPマイクロフレームワークSlim、テンプレートエンジンTwig、ORマッパーilluminate/Eloquentを使って開発しています。入力値検証用にRespect/Validationも試用しています。

あとはフロントエンドにJQueryとBootstrap/Bootswatchを使っています。もちろん、Twilio-phpも使っています。

フォルダ構造は以下の通りとしました。詳細は別途。ルートは/var/www/html/runa-cca/というフォルダとします。

/var/www/html/runa-cca/
 |-composer.json ... Composer定義ファイル
 |-composer.lock ... Composerバージョンロックファイル
 |-create_table_for_Runa-CCA.sql ...テーブル定義・初期データ投入SQLファイル
 |
 |-htdocs ... 公開用ディレクトリ
 |   |-vendor ... 外部のライブラリ
 |       |-bootstrap ... bootstrap
 |
 |-lib ... 作成したクラスライブラリ
 |   |-Base ... 設定クラス置き場
 |   | 
 |   |-Controller ... コントローラクラス置き場
 |   |   |-CallFlow ... コールフロー毎のコントローラクラス置き場
 |   |
 |   |-Model ... モデルクラス置き場
 |   |   |-CallFlow ... コールフロー毎のモデルクラス置き場
 |   |
 |   |-Model ... ビュークラス置き場
 |
 |-templates ... 作成したテンプレートファイル
 |
 |-vendor ... ライブラリ(Composerでインストール)

まずは環境設定です。

そもそもの環境ですが、Macbook Pro Retina ME865J/AMAMPを動かしています。バージョンは3.0.3を使いました。なので、Apacheは2.2.26、PHPは5.5.10、MySQLは5.5.34になります。

その上で、PHPのパッケージマネージャであるComposerを使って、必要なライブラリをインストールします。
Composerの定義ファイルcomposer.jsonは以下の通り。

{
    "require": {
        
        "slim/slim" : "2.*",
        "slim/views" : "0.1.*",
        "slim/extras" : "2.0.*",
        "twig/twig" : "1.*",
        "illuminate/database" : "4.0.*",
        "Respect/Validation" : "0.5.*",
        "twilio/sdk": "dev-master"
        
    },
    "autoload": {
        "psr-0": {"": "lib/"}
    }
}

参照書籍の記載の通り、以下のようにしてComposerをダウンロードします。

$ cd /var/www/html/runa-cca/
$ php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /var/www/html/runa-cca/composer.phar
Use it: php composer.phar

composer.jsonをアップロードしておきます。Runa-CCAをディレクトリごとアップしておけばよいかと。
で、以下のコマンドを実行します。
composer.lockがある場合は、引数をinstallにすると、lockの内容を再現するようにインストールされます。

$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing respect/validation (0.5.0)
    Downloading: 100%         

  - Installing slim/slim (2.4.3)
    Downloading: 100%         

  - Installing slim/views (0.1.2)
    Downloading: 100%         

  - Installing slim/extras (2.0.3)
    Downloading: 100%         

  - Installing twig/twig (v1.15.1)
    Downloading: 100%         

  - Installing nesbot/carbon (1.8.0)
    Downloading: 100%         

  - Installing illuminate/support (v4.0.10)
    Downloading: 100%         

  - Installing illuminate/container (v4.0.10)
    Downloading: 100%         

  - Installing illuminate/events (v4.0.10)
    Downloading: 100%         

  - Installing illuminate/database (v4.0.10)
    Downloading: 100%         

slim/slim suggests installing ext-mcrypt (Required for HTTP cookie encryption)
slim/views suggests installing smarty/smarty (Smarty templating system)
Writing lock file
Generating autoload files

#twilio/sdkは省略

これで、ライブラリがvendor配下にダウンロードされます。
続きはまた別途。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(1.アプリ紹介編)

PHPマイクロフレームワークSlimを使って、Twilioコールセンターシステムを作成しました。
まだいろいろとわからないところ、足りないところも多く、作成中の段階です。

技術的な内容は別途として、まずはアプリの説明からなのですが、こちらのページに書いてみました。よろしければご覧ください。

PHPテンプレートエンジンTwigでセッション情報を取得する(PHPフレームワークSlimを使って)

Webアプリを作っていまして、フレームワークはSlimを使い、テンプレートエンジンはTwigを使っていました。

はじめのうちは、セッションに入れた情報をそのまま使わずに、PHPから変数でTwigに渡していました。しかし、いちいち変数を渡すのはめんどくさい。ViewたるTwigから、セッション情報を直接参照しても、何も問題はないでしょう。Twigでセッションを参照できる方法ないかなあと調べていたところ、ありました。

Using Twig functions inside of Slim

上記サイトに紹介されているとおりに書けば良さそうなのですが、少しハマりました。
セッションに情報を埋め込んだ後に書く必要があります。
つまり、

$app = \Slim\Slim::getInstance();

$twig = $app->view()->getEnvironment();
$twig->addGlobal("session", $_SESSION);

$_SESSION['hoge'] = "hohoho";

ではなく

$app = \Slim\Slim::getInstance();

$_SESSION['hoge'] = "hohoho";

$twig = $app->view()->getEnvironment();
$twig->addGlobal("session", $_SESSION);

と書かなければなりません。

これで、Twigでは、

{{session.hogehoge}}

という形で参照できます。

MySQL #1452 – Cannot add or update a child row: a foreign key constraint fails

MySQLで外部キーを設定しようとして、

ALTER TABLE `child` add FOREIGN key(`id`) REFERENCES parent(`id`);

とした場合、「#1452 – Cannot add or update a child row: a foreign key constraint fails」エラーが返ってくることがあります。

childテーブルのidに、parentテーブルのidに存在しない値が入っているとこのエラーになります。childテーブルのidの値を修正すればOKです。

こちらのサイトを参照しました。