ITぶろぐるとるのITぶろぐ日常を楽しんで。「るとるのぶろぐ」のITネタばーじょんです。reply『Webアプリエンジニア養成読本』を読みながら、PHPマイクロフレームワークであるSlimを使ってプログラミングしています。plus)Slimはルーティング中心のシンプルなフレームワークです。RubyのSinatraを参考に作られたらしい。Sinatraもそうですが、読んだり調べたりするだけだと、何が何やらさっぱりわからない・・・。書いてみて、あーそういうことかーとわかります。テンプレートエンジンTwig、データベース操作illuminate/Eloquentとの組み合わせで、MVCを実現できます。SlimをApacheで利用する場合、mod_rewriteの設定が必要です。『Webアプリエンジニア養成読本』にはこの部分がすっぽりと抜けているので、わかりにくいです。[QSA,L]とし、/var/www/http/hoge/htdocs/配下(index.phpと同じ場所)に置きます。.htaccessのテンプレートは、Slimパッケージの中にあります。method="post">とフォームを書いておけば、login.phpが呼び出されるかと思ったのですが、呼び出せませんでした。Found」のエラーになってしまいました。ハマったのですが、そりゃそうです。formのaction指定に誤りがありました。method="post">というように、loginの後のスラッシュを消しておかなければなりません。Foundになります。{」と修正しても構いません。HTMLのフォームの記述と、Slimの記述と、両者を一致させる必要があります。9としておいて、設定・試験中はログを見ながら作業するといいと思います。ログが膨大に出ちゃいますが、試験環境ならいいかと。Proに、MAMPを利用して、PHPの開発環境を作っています。NetBeansでデバッグのためにステップ実行をしようと考えました。その場合Xdebugを有効化する必要があります。php.iniに以下を記載し、Apacheを再起動。phpinfoを開きましたが、xdebugセクションが表示されません(有効になっていない)。1xdebug.soは存在するし。設定の構文も間違っていません。phpinfoを見直してみて、やっとわかりました。修正するべきphp.iniファイルを誤っていたのです。MAMPにおいて、php.iniはなぜか2カ所にあります。/Applications/MAMP/bin/php/php5.5.10/conf/php.ini/Applications/MAMP/conf/php5.5.10/php.ini修正するべきは、/Applications/MAMP/bin/php/php5.5.10/conf/php.iniの方でした。うーん、ハマったなあ。replyTwilioコールセンターシステム(Twilio-MiniCC)にヒストリカルレポート機能を搭載しました。MySQLにデータを貯めるので、レポート参照はいろいろなツールを使えばいいでしょう、というのを言い訳にして、データ収集機能までの実装になります。アプリケーションなんだから、適当なところでデータベースにデータ入力しておけばいいだろう、くらいのノリだったのですが、結構大変でありました。調べたり、考えたりして、とりあえず以下の3ポイントで、取れるデータをすべて取ってみたつもりです。不要なので、標準リクエストパラメータからAccountSidは抜きました。これからの記述でおかしなところやもっとカイゼンするべき点があったら、ぜひご指摘ください。データ取得のポイントは以下の3つ。本当はIVRの分岐点でもログを取って、お客様がどのようなルートを通っているのかを把握するべきなのですが、今回は割愛しました。通話終了時Twilioのキューの考え方はこちらが参考になります。お客様とオペレータとで同じQueueに入ります。入り方が異なっていて、お客様はTwiMLのEnqueueタグ(動詞)で、オペレータはDialタグ(動詞)のQueueタグ(動詞)で入ります。はじめに、キューのお客様側(Enqueue)から出た時のデータ取得方法です。Enqueue動詞ではaction属性が設定できます。ややこしいのですが、Enqueueのaction属性は、以下の動きになります。日本語サイトはやや怪しい(一部しか翻訳されていないところがある)ので、英語のサイトから引用します。any.Twilio-MiniCCでは、今のところDial動詞のQueue動詞を使って呼をキューから出しますので、Enqueueのaction属性に指定されたURLは、接続された相手同士が切断されたときに、一度実行されることになります。(キューから出たときではありません)Enqueue動詞のaction属性でデータを取る意味は、「放棄呼」の情報を取ることができる点にあります。一般的にコールセンターにおいて、お客様がキューに入って自分から切断した場合、その呼は「放棄呼」とされます。放棄呼が発生した場合には、actionに指定してあるURLが実行されます。そのURLで、データベースにデータを登録するプログラムを書いておけば、放棄呼の情報を取得することが出来ます。具体的には、QueueResultカラムでhangupが記録されることになります。放棄呼はコールセンターにとっては良くないことです。本来受け付けるべき呼を受け付けられなかったわけですから。放棄呼のデータを収集し、対策を打つことが極めて重要です。記載はないのですが、Enqueueのaction属性は、おそらく非同期で実行されています。Basic認証を使用している場合、以下のように書くとエラーが発生します。Required」が出ます。'action.php');そのため、以下のように修正する必要があります。action.phpを置いた場所あと、Twilio-MiniCCにおいて、本機能はexit_enqueue.phpで実装されているのですが、何もレスポンスが無いとオペレータから切断したときエラーメッセージになるため、空のTwiMLを出力するようにしています。続いて、キューのオペレータ側(Queue)から出た時のデータ取得方法です。Queue動詞においては、url属性を指定できます。英語のサイトから引用します。Redirect.Queue動詞はオペレータが使うものなのですが、Queue動詞のurl属性には「お客様側」で実行したいことを書きます。オペレータとの接続前に、録音することをアナウンスするとか、そういうために使うそうです。お客様にアナウンスを流しつつ、裏でデータベースにデータを格納すれば、Queueのデータを取得できます。最後に通話終了時のデータ取得方法です。Usage」という記事に書いてありました。Requestを投げることが出来、そこでレポートを取得します。experience.非同期処理なので負担もかからずオススメということらしい。Settings」をクリック。URL」に、プログラムへのURLを書けばオッケー。通話終了後に実行されます。Basic認証を使っている場合は、先ほどのEnqueueのときと同様の書式にする必要があります。最後に、データベース構造なのですが、まず型がわかりませんでした。Twilioのサンプルをいくつか見ましたが、全部SQLiteのTEXT型になっているし。APIの資料とか見て、MySQLの型を決めましたが、これでいいのかどうかはわかりません。そもそも正規化とかしてないので、まだまだ検討が必要そうです。ヒストリカルレポート収集機能の追加と同時に、データベースアクセスをPDOにしたり、設定共通クラスを作ったりと、ソースコードをカイゼンしています。Webクライアントも作成済みなのですが、まだ公開するまでのレベルではないので、次のバージョンとします。Twilioを使ったミニコールセンターシステムです。rutoruヒストリカルレポート収集機能実装ヒストリカルレポート収集機能実装。データベースアクセスにPDO利用。Piですが、VPNサーバにしたところで、いよいよやりたかった自宅PBX化に取り組みました。自宅のひかり電話(ルータはRT-200KI)とつなぎます。自宅に電話がかかってきたら、録音してメール送信するようにします。自宅PBXというか、自宅VoiceMailサーバ(留守録)ですな。(clear)調べたところ、RasPBXというディストリビューションがあります。それを使えば早かったのですが、せっかくSoftEtherとか設定してきて、クリアするのももったいなかったので、Asteriskを新規にインストールすることにしました。Asterisk」という素晴らしいサイトに、インストール手順が載っています。asteriskでインストール出来てしまいます。こちらの方が簡単です。asteriskユーザも作ってくれます。サービス起動でエラーが出る場合は、上記サイトを参考にして、権限設定したりすればオッケーです。Wikiで公開されている1.6のものを使いました。内線とひかり電話の設定は、sip.confで行います。私の環境だけかもしれませんが、RT-200KIのIP内線で、独自のパスワードに変えると接続できませんでした。RT-200KIデフォルトのパスワードに戻したところ、うまくレジストすることができました。外線発信・着信の設定は、extensions.confです。読むと何となくわかります。色々なサイトを参考に設定しました。-vvvrでコンソールに入ります。SIPソフトフォンをレジストしたりすると、ログが表示されます。Asteriskのログはわかりやすくてよいです。SIPソフトフォンは、MacではX-Lite、iPhoneではZoiperを利用しました。あとはボイスメール設定です。(3)」というサイトが一番参考になりました。外線着信して、SIPソフトフォンが出れなかったら、ボイスメールに着信させます。ボイスメールからメールを送信する設定は、voicemail.confに書きます。voicemail.conf」に解説されています。これらの設定で、Asteriskはボイスメールシステムとなり、電話がかかってきたら音声を録音し、メール送信します。PiとAsteriskでボイスメールって、かなり実用的で、Piのいい活用例だと思いますが、いかがでしょうか。自宅に電話がかかってくることは無いですけどね。replyTwilioでコールセンターシステムを作ってみました。※続編は「Twilioコールセンターシステムにヒストリカルレポート機能を搭載した」です。※今は「Runa-CCA」を鋭意開発中になります。何で作ろうかなあと考えました。Rubyで作ろうかとも思ったのですが、Webアプリですし、フレームワーク上に構築するまでの規模でもなかったので、手軽なPHPにしました。以下の本を買ってお勉強。私がプログラマーだったとき、PHPはPHP3でありまして、今やPHP5.5です。いうことで一から勉強し直してみました。PHP、MySQL、JavaScriptとCSSの基礎を学べる、非常にいい本です。音声自動応答(IVR)音声ガイダンスキューイング(待ち順番アナウンス付き)の3つを搭載しようと考えました。基本的なフローは以下の通り。IVRが出来るということは、Twilioのブログにも書いてあったので、それほどハードルは高くないだろうと考えていました。コールセンターシステムで必要なのはキューです。オペレータに着信させなければならないのですが、オペレータがすべて電話業務(よく「受電」とか言います)をしているとき、お客様を待たせる必要があります。オペレータが忙しいからって、すぐに電話を切ってしまうのは良いセンターとは言えませんよね。その待たせる機能である「キュー」がTwilioにあるのかなあ・・・と思って探してみたら、ありました。こちらに紹介されています。うーん、簡単すぎるぞ。オペレータはQueueタグで、お客様はEnqueueタグを使うのか。それだけでいいのかなあ・・・と思いましたが、まあ作ってみることにしました。Twilioには、PHP用のHelperライブラリがあります。それを使うと実装は簡単です。今回のような、“着信”を処理する場合は、TwiMLというXMLライクなマークアップ言語を用いてTwilioに命令する形になるので、Helperライブラリ無しでも作れてしまいます。Responseタグの閉じ忘れとかなんとか、いろいろと発生しましたので、素直にHelperライブラリに頼るのが良いでしょう。久々のPHP言語に不慣れだったので、PHPでのデータベースアクセス処理とか、クラスの定義方法とかに時間がかかりました。実行しても結果が無い(白いページが表示される)のにも悩まされました。白いページになる場合は、php.iniでエラーが出力される設定になっていない可能性があります。);を書く必要があります。エラー出力される設定になっていても、白いページになることがあります。その場合は、php.iniに指定されているログを見ると、エラー内容を確認することが出来ます。当たり前かもしれませんが、なにぶん不慣れなので、こういったところに時間がかかってしまいました。Twilioの部分は極めて簡単です。PHPを知っている人だったら、すぐに作れちゃうと思います。キューの実装もブログにある通り、超簡単でした。完成したものをGitHubに公開しております。勉強用に、細かいところまでコメントを書いたつもりですので、よろしければご覧ください。Piからメール送信させたいなあと思ったのですが、Postfixを立てるのは面倒。メールサーバはさくらのVPSにアカウント作ってそれを利用すればいいし。調べたところ、SSMTPというソフトが良さそうだったので、早速インストールして使ってみました。Auth使う場合のパスワードAuthMethod=サーバ設定にあわす(LOGINとか)UseSTARTTLS=同上(Yesとか)UseTLS=同上(Yesとか)以下のようなファイルを作ります。testmail.txtでオッケー。Mailコマンドを使う場合は、mailutilsをインストール。mailutilsで、mailコマンドを使ってメールしようとするも、うまく行きませんでした。found」となっていました。Fromを指定していないから送れなかったのね。sentとありました。-aFrom:送信元アドレスとしたところ、うまく送信できました。ログ確認とmanページ確認重要(当たり前だ)。192.168.1.1って書いて、ifupしたら怒られました。wlan0.はい、デフォルトゲートウェイは1つしか指定できませんよね。eth0の方にデフォルトゲートウェイの設定を入れていたのでした。192.168.1.1でおっけー。最後の行は消すべきですが、説明の都合上、コメントにしました。Piをシャットダウン。of=~/Desktop/Pi-backup-YYYYMMDD.imgでおっけー。Macなどを参照のこと。Replyハマりました。使ったのは以下のUSB無線LAN子機。WLI-UC-GNMさっぱりと結論を書きますと、以下のように設定したら、うまく無線親機に接続でき、DHCPサーバからIPアドレスを取得することができました。ちなみに、親機のセキュリティはWPA2-PSK(AES)、ステルスモードにしています。"PSK"ポイントは以下の通り。・/etc/wpa_supplicant/wpa_supplicant.confを使わない。sleeping.となってしまい、うまく親機に接続できず、DHCPからアドレスも接続できませんでした。PASSWORD”という書き込みに出会い、/etc/network/intarfacesに設定を書きましたが、それでも接続できませんでした。1を追加しましたが、接続できない。wextを設定したら、うまくいった次第です。PiでSoftEtherを動かし、L2TP/IPSecで接続しています。PiのIPアドレスに通信できませんでした。Pi自身と通信ができません。これではPiメンテナンスできないし、他のサービスを利用できないし、悩んでおりました。調べたところ、通信できないのはLinuxカーネルの制約事項とのこと。VPNのオンラインマニュアルに書いてありました。カード自体に対して通信することはできません。カーネルの制限事項です。http://www2.softether.jp/en/vpn2/manual/web/11-1.aspxうーん、そうなのか・・・。回避策はもう一つLANカードを用意することだそうな。PiにUSBのWifiカードを搭載するしかないか。