20211124のPHPに関する記事は11件です。

ループ処理、switch文、break文、continue文の組み合わせには要注意(迷子になるから)

まずは以下のプログラムを見ていただきたい。 ※このプログラム自体に意味はありません。参考用にサンプルで作ったものなので、ツッコミどころはいっぱいありますが、一応動きます。 sample.php <?php $dbData = [ ['id' => 1, 'type' => 1, 'col1' => '1-col1', 'col2' => '1-col2', 'col3' => '1-col3', 'col4' => '1-col4'], ['id' => 2, 'type' => 0, 'col1' => null, 'col2' => null, 'col3' => '2-col3', 'col4' => '2-col4'], ['id' => 3, 'type' => 2, 'col1' => '2-col1', 'col2' => '2-col2', 'col3' => '2-col3', 'col4' => '2-col4'] ]; function fileterData(array $data) { $result = []; foreach ($data as $datum) { $id = $datum['id']; $start = null; $end = null; for ($i = 1; $i <= 4; $i++) { switch ($i) { case 1: $start = $datum['col' . $i]; continue 2; case 2: $end = $datum['col' . $i]; continue 2; case 3: case 4: continue 2; default: continue 3; } } if (!empty($start) && !empty($end)) { $result[] = $datum['id']; } } return $result; } print_r(fileterData($dbData)); php sample.phpを実行したときに得られる結果はなんでしょう? php sample.php Array ( [0] => 1 [1] => 3 ) ですね! つらいプログラムのトレース メンテナンスすることになったプログラムに上のような記述がありました。 どこがつらいか皆さんはわかりますか? 私はいくつかあります。 DBから取得したようなデータをループでフィルターしている。 カラムに対してループ処理して、typeとカラム名によって変数代入、カラムの意味が変わってくる。 2次元ループ内でswitch文、continue 3をしている。 一つ断っておくと、私自身は「つらいなぁ」とは思っていますが、100%否定もできないなと思っています。 というのも、DBデータをプログラム上でフィルターしたい場面は存在するし、カラムの意味を、例えばtypeカラムの値によって変更する設計はしばしば見受けられます。 できれば正規化していてほしいですが、「やむを得ない事情」というのは存在すると思うからです。 すべてが理想形どおりに進むわけはないと思っています。 continue 3とか久しく見たことがなかった いわゆるループ処理でよく使われるcontinue文には数字またはラベルというものを指定できます。 PHP: continue - Manual このこと自体は私も10年以上前、専門学校でJavaを勉強していたときに習いました。 改めて当時の教本(当時はSun Microsystemsでした)を見返したところ、continue文の記載はあるものの、数値やラベルの指定を解説している箇所はありませんでした。おそらく同時の講師(めっちゃ板書がきれいな先生でした)が、基本だから抑えておくようにと思ったのだと思います。 当時のノート。 continue 3はどういう意味か? 上記のプログラムではcontinue 3は意味をなしていないので、continue 2を見ていきましょう。 と言っても、上の画像にほとんど答え書いてありますが。 ここに入ると処理は、forのところまでスコープが戻ります。continue以降の処理は実行されません。 ということはcontinue 3はforeachのところまでスコープが戻ります。 そしてプログラマは、考えるのをやめた 最初は処理がどうなっているのかプログラムをトレースしていました。 ロガーを入れてみたりしたけど、いまいちどうなっているのかわからない。 そしてcontinue 2みたいな構文を見つけたとき、どうするか迷いましたが、トレースしてみることにしました。 ですが、数時間しても何がどうなっているのかわからなくなって、そして考えるのをやめた。 結果だけをみて、「Don't think. Feel.」することにしました。 「Don't think. Feel.」できない事態になったら? その時考えることにしました。 とにかく今、デバッグされて、正常に動いているものを無理に時間を割いて理解するのは時間の無駄、、、と思うことにしました(本当にそれでいいのかという気はしています)。 避けるべきとされるプログラム こういったプログラムを見るとよく思うのですが、このプログラムを作った人はすごい人なのかどうかということです。 ひとつ言えるのは、メンテナンスしていた人はすごいと思います。 入れ子のしすぎ if文とかでもそうですが、制御ブロック、端的に言うとインデント、もう少し詳しく言うと入れ子(ネスト)は3つを超えだすと、かなり見づらく、トレース、デバッグがしづらくなり、関数やメソッドへの切り出しを考えるべきと思っています。 結局そのプログラムがリリースされるとしばらくは自分がメンテナンスすることになりますし、プログラムはだいたい80桁で折り返せって言われますよね。 縦に長いのはマウスとかでスクロールできますが、横に長いのはスクロールしづらい。 上のプログラムも同じで、せめて何らかの形で、switchは別の関数に切り出されていると、まだ可読性が増すのかなと思います。 そして早期リターンするとか。 do-while 書籍「リーダブルコード」では、do-whileも避けたほうがいいと言われています。 個人的には避けるべきだと思っていますが、Excelやスプレッドシートを処理するときにどうしても解決できない処理をdo-whileで解決したことがあります。 ここでは詳しく述べませんが、そのときひらめいたかのように「do-whileなら解決できるのでは?」と思ったのを覚えています。 ちなみに専門学校では「これを使いたがる人がいる」といった感じで教えられました。 goto 書籍「リーダブルコード」ではこれもアンチパターンとして紹介されていたような気がします。 私の先輩も避けるべきと言っていました。 goto文は、ラベルの付いたところまで処理を移動させる制御文。ループ処理に似ていますが、ちょっと違います。 goto文 - Wikipedia ちなみにこれは専門学校でも習った気がするのですが、ノートに取ってなかったのか。。。 私はPHPerなのですが、PHP 5.3(2009年リリース)から導入されました。当時は今更なぜ?って感じでした。 その後、EC-CUBE案件をやったときにどれかは忘れましたが、プラグインの一つにgoto文が使われていました。 「嘘やろ・・・」と言ったことを覚えています。 まとめ どんなプログラムにも、多かれ少なかれジレンマが存在していると思います。 過去の自分のプログラムを見て、「今ならもっとシンプルに作れるな・・・」、と思いながらも、デバッグも終わって安定稼働しているものを大きく変更するのは、それだけでリスクになります。 他人が書いたプログラムならなおさらです。 だからせめて、これから各プログラムは、気をつけていきたい。 そう思いながらプログラムを書いています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 配列に値があるかチェックするメソッド

目的 配列に値があるかチェックするin_array()メソッドの使い方を簡単に紹介する。 情報 下記のサイトを用いてこちらに記載するソースの検証を実施した。 https://paiza.io/ja 方法 下記のようにin_array()メソッドを用いて値があるかチェックする。(第三引数でtrueを渡すとデータ型も含めて評価してくれる。) in_array(探したい値, 配列, true); 例 下記のようにソースを記載して実行してみる。 <?php $str = 'ccc'; $array = [ 'aaa', 'bbb', 'ccc' ]; if (in_array($str, $array, true)){ echo 'あったよ'; }; $strに格納されている「ccc」は$arrayに存在しているため、trueが返され、「あったよ」が出力される。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 大文字 小文字を区別せずバイナリを使って文字列を比較するメソッド

目的 PHPにてバイナリを用いて文字列を比較する方法をまとめる 情報 下記のサイトを用いてこちらに記載するソースの検証を実施した。 https://paiza.io/ja 方法 strcasecmp()メソッドを使用して比較する。 ASCII文字だけが、大文字小文字を区別せず比較されるらしい。 $str_1と$str_2をそれぞれ比較してみる。 $str_1には「aaa」を、$str_2には「AAA」を格納し下記のように比較してみる。 <?php $str_1 = 'aaa'; $str_2 = 'AAA'; echo strcasecmp($str_1, $str_2); // 0と出力される。 上記の処理は大文字小文字は関係なく、同一文字かを評価するので同一(つまりintの'0')が返される。 その他の検証 $str_1には「aaa」を、$str_2には「bbb」を格納し下記のように比較してみる。 <?php $str_1 = 'aaa'; $str_2 = 'bbb'; echo strcasecmp($str_1, $str_2); // -1と出力される。 バイナリ比較して第一引数 < 第二引数となる時は負の数が返されるらしい。 $str_1には「bbb」を、$str_2には「aaa」を格納し下記のように比較してみる。 <?php $str_1 = 'bbb'; $str_2 = 'aaa'; echo strcasecmp($str_1, $str_2); // 1と出力される。 バイナリ比較して第一引数 > 第二引数となる時は正の数が返されるらしい。 strcasecmp()メソッドを使って第一引数と第二引数の文字列のバイナリ差分でif分岐を行いたい場合、下記の様に記載する。 <?php if( strcasecmp($str_1, $str_2) === 0){ // $str_1と$str_2が一致している時の処理 } 参考文献 https://www.php.net/manual/ja/function.strcasecmp.php
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Apacheで特定のディレクトリについてPHPを無効にする

以下の設定を<Directory>ディレクティブ内に記載する。 httpd.conf <Directory "/var/www/html/foo/bar"> php_value engine off </Directory> 有効にしたい場合は httpd.conf <Directory "/var/www/html/foo/bar"> php_value engine on </Directory> より深い階層の設定が有効になるので、上記の組み合わせで「全体で無効、特定のディレクトリで有効」という設定も可能。 ちなみに以下のように記載するという記事もあったが、自分の環境ではうまく動かなかった。 httpd.conf <Directory "/var/www/html/foo/bar"> RemoveType .php </Directory>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac再起動時にSQLに接続できず、Laravelのプロジェクトをローカル環境で確認できなくなった時

以前作成したLaravelのプロジェクトの修正を行おうとしていつも通りMAMPを起動してブラウザで表示しようとしたら、、、 もういやだ 独学者にはこういうのが一番効きます。 開発環境 $ sw_vers ProductName: macOS ProductVersion: 11.6 BuildVersion: 20G165 $ mysql --version mysql Ver 14.14 Distrib 5.7.35, for osx10.16 (x86_64) using EditLine wrapper $ php artisan --version Laravel Framework 6.20.30 解決手順 とりあえず.envのデバッグ設定をオンにして解決手段を模索する。 .env APP_DEBUG=true するとこんな感じのエラーがブラウザに表示される [2002] No such file or directory (SQL: select * from `users` where `id` = 1 limit 1) (View: /Applications/MAMP/htdocs/[Project_name]/resources/views/welcome.blade.php) 意外と単純な理由ってことがわかる。データベースへの接続がうまくいってないみたい。 ひとまずターミナルでMySQLへの接続を試みてみる。 $ mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' まあそりゃ接続できないよね。 んでmysql.sockって何だ?と思ったけどどうやら英語で書いてある通りMac内のプログラムとMySQLを通信の処理をしてくれるいいやつらしい。 この仲介役みたいな人がいないからSQLに接続できないらしい。Macをシャットダウンしたときに解雇されたのか。かわいそうに。 だから以下のようにして新しく仲介役を雇用してやる必要があると。 $ touch /tmp/mysql.sock 備忘録: touch・・・現在のディレクトリにとりあえず空のファイルを作ってあげるコマンド。 ここで権限のエラーが出ることがある touch: /tmp/mysql.sock: Permission denied その場合は $ ls -l /tmp/mysql.sock で権限を確認してやり、 $ sudo chown [username]:admin /tmp/mysql.sock で[username]にパーミッションを与えてあげ、改めてtouchしてやる。 備忘録: sudo・・・rootユーザーの権限が必要なコマンドを実行できるようになる。 chown・・・指定したファイルの所有権を変更するコマンド。 これで仲介役が雇え、MySQLの接続準備が整ったので、MySQLを再起動する。 $ mysql.server restart ERROR! MySQL server PID file could not be found! Starting MySQL . SUCCESS! ここのエラーはよくわからないが、MySQLが無事再起動できたようなので改めてブラウザでLaravelを起動してみるとうまくいっていることが確認できた。 初めてこういうふうになった時はめちゃくちゃググりまくって時間がかなりかかってしまったのでそういった方々の役に立てれば、、、!!! まとめ Laravelにブラウザで接続できなくなった時はまず.envファイルのdebugをオンにしてどこで接続がうまくいってないか確認する。 mysql.sockでMySQL接続ができないよと言われたら多分mysql.sockが消えてるので、適切な権限のもと新しくmysql.sockを作成してあげる。 mysqlを再起動してうまくいっていることを確認する。 人生がうまくいく。 参考 https://qiita.com/jonakp/items/477a18d4a94c01a31583 https://www.naka-style-blog.com/mysql-log-in-erorr/ コマンドラインの操作だったり、それらに付随するエラーだったりってなかなかとっつきにくくて難しいのでまだまだ勉強が必要だなと思った今日この頃。何か気になる点やご指摘等ございましたら教えていただけるとありがたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[500 server error]Mac再起動後にSQLに接続できず、Laravelのプロジェクトをローカル環境で確認できなくなった時

以前作成したLaravelのプロジェクトの修正を行おうとしていつも通りMAMPを起動してブラウザで表示しようとしたら、、、 もういやだ 独学者にはこういうのが一番効きます。 開発環境 $ sw_vers ProductName: macOS ProductVersion: 11.6 BuildVersion: 20G165 $ mysql --version mysql Ver 14.14 Distrib 5.7.35, for osx10.16 (x86_64) using EditLine wrapper $ php artisan --version Laravel Framework 6.20.30 解決手順 とりあえず.envのデバッグ設定をオンにして解決手段を模索する。 .env APP_DEBUG=true するとこんな感じのエラーがブラウザに表示される [2002] No such file or directory (SQL: select * from `users` where `id` = 1 limit 1) (View: /Applications/MAMP/htdocs/[Project_name]/resources/views/welcome.blade.php) 意外と単純な理由ってことがわかる。データベースへの接続がうまくいってないみたい。 ひとまずターミナルでMySQLへの接続を試みてみる。 $ mysql -u root -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' まあそりゃ接続できないよね。 んでmysql.sockって何だ?と思ったけどどうやら英語で書いてある通りMac内のプログラムとMySQLを通信の処理をしてくれるいいやつらしい。 この仲介役みたいな人がいないからSQLに接続できないらしい。Macをシャットダウンしたときに解雇されたのか。かわいそうに。 だから以下のようにして新しく仲介役を雇用してやる必要があると。 $ touch /tmp/mysql.sock 備忘録: touch・・・現在のディレクトリにとりあえず空のファイルを作ってあげるコマンド。 ここで権限のエラーが出ることがある touch: /tmp/mysql.sock: Permission denied その場合は $ ls -l /tmp/mysql.sock で権限を確認してやり、 $ sudo chown [username]:admin /tmp/mysql.sock で[username]にパーミッションを与えてあげ、改めてtouchしてやる。 備忘録: sudo・・・rootユーザーの権限が必要なコマンドを実行できるようになる。 chown・・・指定したファイルの所有権を変更するコマンド。 これで仲介役が雇え、MySQLの接続準備が整ったので、MySQLを再起動する。 $ mysql.server restart ERROR! MySQL server PID file could not be found! Starting MySQL . SUCCESS! ここのエラーはよくわからないが、MySQLが無事再起動できたようなので改めてブラウザでLaravelを起動してみるとうまくいっていることが確認できた。 初めてこういうふうになった時はめちゃくちゃググりまくって時間がかなりかかってしまったのでそういった方々の役に立てれば、、、!!! まとめ Laravelにブラウザで接続できなくなった時はまず.envファイルのdebugをオンにしてどこで接続がうまくいってないか確認する。 mysql.sockでMySQL接続ができないよと言われたら多分mysql.sockが消えてるので、適切な権限のもと新しくmysql.sockを作成してあげる。 mysqlを再起動してうまくいっていることを確認する。 人生がうまくいく。 参考 https://qiita.com/jonakp/items/477a18d4a94c01a31583 https://www.naka-style-blog.com/mysql-log-in-erorr/ コマンドラインの操作だったり、それらに付随するエラーだったりってなかなかとっつきにくくて難しいのでまだまだ勉強が必要だなと思った今日この頃。何か気になる点やご指摘等ございましたら教えていただけるとありがたいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CodeIgniter3でViewファイルをもとにHTMLファイルを出力する

こんなこと誰かがやってそうなもんですけど、全然記事が見つからないので 自分で実装することにしました。今更こんな枯れたフレームワーク使ってるとこないか もっと良い方法あったら教えてちょ # ファイル出力テスト用のディレクトリを作成して書き込み権限を付与 mkdir /var/www/html/test/ sudo chmod -R 777 /var/www/html/test/ # ファイル出力テスト用のControllerを作成 touch /var/www/html/admin/application/controllers/tools/View.php # ファイル出力テスト用のViewを作成(レンダリングにはTwigライブラリが必要です) touch /var/www/html/admin/application/views/user/test/hello.twig.html /var/www/html/admin/application/controllers/tools/View.php <?php defined('BASEPATH') OR exit('No direct script access allowed'); class View extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper("file"); } public function test_output() { $data = "Hello World"; // FCPATH は "/var/www/html/admin/public" を返す( "/var/www/html/admin/public/index.php" で定義) if (write_file(FCPATH . '../../test/hello.html', $data) == FALSE){ echo 'Unable to write the file'; } else { echo 'File written!'; } } public function test_output2() { $this->load->library('twig'); $filePath = "user/test/hello"; $data = array( "test" => "Hello World2" ); $html = $this->twig->render($filePath, $data); if (write_file(FCPATH . '../../test/hello2.html', $html) == FALSE){ echo 'Unable to write the file'; } else { echo 'File written!'; } } } /var/www/html/admin/application/views/user/test/hello.twig.html <!DOCTYPE html> <html> <head></head> <body> <p>{{ test }}</p> </body> </html> http://www.example.com/admin/tools/view/test_output にアクセスすれば、以下の場所にHTMLファイルが出力されます cat /var/www/html/test/hello.html Hello World http://www.example.com/admin/tools/view/test_output2 にアクセスすれば、以下の場所にHTMLファイルが出力されます cat /var/www/html/test/hello2.html <!DOCTYPE html> <html> <head></head> <body> <p>Hello World2</p> </body> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel・PHP】preg_match(): Unknown modifier '�' のエラー

状況 正規表現を用いて、文字の検索をかけたいのでpreg_matchを使ったところタイトルのエラーが発生。 コード $target = '/' . $request->name . '/'; $names = $collection->filter(function($value) use ($target){ return preg_match($value['name'], $target); }); 原因 preg_matchの第一引数と第二引数を逆に記述したことによるエラー。 本来は第一引数に正規表現、第二引数に元データを記述しなくてはならない。 return preg_match($target, $value['name']); とっても単純なエラーでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】多次元配列のデータにキーワード検索をかける方法

背景 キーワード検索でcontroller側でDBにアクセスしてデータを取得する処理はよく行われるが 今回は既に出来上がった多次元配列の変数にキーワード検索を行い、View側に返す処理を実行します。 処理概要 View側で部署検索フォームに文字を入れた際に部分検索で該当するデータを返すようにします。 処理内容 preg_matchとCollectionクラスのfilterメソッドを使用します。 【多次元配列のデータ】 $departments = [ ['name' => '佐藤', 'department' => '営業部'], ['name' => '鈴木', 'department' => '総務部'], ['name' => '田中', 'department' => '人事部'], ]; 処理。検索キーワードは$request->departmentに入ってる事とします。 $collection = collect($departments); $target = '/' . $request->department . '/'; $filtered = $collection->filter(function($value) use ($target){ return preg_match($target, $value['department']); }); return view("***", compact('filtered')); filterなどの無名関数を引数に取るメソッドは、外部から変数を渡す際にuseが必要になります。 例えばView側から営業という文字列が送信されてきた場合 ['name' => '佐藤', 'department' => '営業部'], のデータを返す処理となります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Twilioの留守番電話検知機能(AMD)を使ってみた(PHP)

はじめに 株式会社じげんの山形です。 主にバックエンドとフロントエンドの実装を担当してます。 Twilioではプログラムからユーザーに対して自動電話をかける事ができます。 実装していて困ったのが、人が電話に出ても、留守電が起動しても、自動電話が指定したメッセージを流し続けてしまう事でした。その時に役立ったのがTwilioのAnswering Machine Detection(以後AMDと呼称)の機能でした。今回その機能を色々試して分かったことを書いていきます。 環境 ・PHP7.2以上 ・Twilio Sdk をインストール済み(twilio/sdk: 6.31) ※筆者はLaravel5系を使用しております 前提 ・Twilioのアカウントを所有 ・(電話可能な)電話番号を取得済み ・PHPで通話を発信する方法を知っていること(ご存知ない方は公式のドキュメントを参照してください) 目次 AMDを使用してみる(PHP) AMDを非同期で使用する おまけ 本編 AMDの公式ドキュメントは下記です。 Answering Machine Detection - Twilio AMDの使用には1callあたり$.0075かかるようなので、こちらは注意してください(公式ドキュメントより引用)。 Answering Machine Detection will be charged at $.0075 per call where enabled and the called party picks up. Busy or Failed calls may engage our AMD system but will not be charged. 1.AMDを使用してみる(PHP) AMDを使用するのはcallするときにmachineDetection: Enableを追加すれば使用できます。 use Twilio\Rest\Client; ========= $client = new Client($sid, $token); //自身のアカウントのsidとtoken $calls = $client->calls ->create( $toNumber, //宛先の電話番号 $fromNumber,  //通話元の電話番号 [ "url" => $callUrl,  // ユーザーが受電した直後にリクエストが行くURLを指定 "timeout" => 30, "machineDetection" => "Enable",  // AMDを使用するためのパラメータ ] ); 上記のように指定することで、$callUrlのリクエストにAnweredByというパラメータが返ってきます。 人の場合はAnsweredBy:human 留守電の場合はAnsweredBy:machine_start と返ってきました。 この値によって、$callUrl内の処理を分岐させることが可能です。 ただし、注意点としてAMDが判断するまでに時間が少々かかります。 $callUrlが実行されるまで大体7秒程度かかってしまいました。 2. AMDを非同期で使用する AMDの監視を非同期で行う事ができます。 use Twilio\Rest\Client; ========= $client = new Client($sid, $token); //自身のアカウントのsidとtoken $calls = $client->calls ->create( $toNumber, //宛先の電話番号 $fromNumber,  //通話元の電話番号 [ "url" => $callUrl,  // ユーザーが受電した直後にリクエストが行くURLを指定 "timeout" => 30, "machineDetection" => "Enable",  // AMDを使用するパラメータ "asyncAmd" => true, // AMDを非同期で使用 'asyncAmdStatusCallback' => $checkAmdUrl,  // AMDの結果を返すURL 'asyncAmdStatusCallbackMethod' => "POST", // 上記URLのHTTPメソッド ] ); 上記のように asyncAmd:true、asyncAmdStatusCallbackに監視する用のURL(今回の場合は$checkAmdUrlとしてます)を指定、asyncAmdStatusCallbackMethod:POST(こちらはデフォルトでPOSTが指定される為省略可)を設定することで、$checkAmdUrlに結果が返されます。 こちらを使用すれば$callUrlの実行が待たされることはありませんが、当然$callUrl内でAnsweredByによる分岐は不可能となります。 3. おまけ 1のように単純にAMDを使用すると、"url"に指定したURL実行まで数秒の待ち時間が発生します。 2のように非同期でAMDを使用すると、待ち時間は無くなりますが、"url"に指定したURLにおけるAMDの判定結果による分岐ができなくなります。 そこで個人的に便利だと思ったのが通話の上書きです。つまり、実行中の自動電話を停止し、新しいメッセージを流す事ができます。 例えば下記のように指定することで通話の上書きが実行できます。 use Twilio\Rest\Client; ========= $client = new Client($sid, $token); //自身のアカウントのsidとtoken $calls = $client->calls($callSid) // request内のCallSidを指定 ->update( [ "url" => $updateCallUrl,  // URLを指定 "method" => "POST", ] ); どういう場面で使用できるかというと、 2で記述したように、AMDを非同期で使用し、asyncAmdStatusCallbackに指定したURL内で留守電検知が完了したタイミングで通話の上書きを行えば、待ち時間をほとんど与えることなく通話を続ける事が可能となります。 最後に TwilioのAMDはアメリカの電話文化に合わせた実装になっているとのことで、実装前は日本でこの機能が正常に使用できるとは思ってませんでした。(ラグが発生することを除けば)AMDの機能を試してみて、使用にそこまで問題がなかった事は驚きでした。 (参照:Twilio で相手が人間か機械かを判別することはできますか? – Twilio - KDDI Web Communications) Twilioには便利機能たくさんあるようですが、英語のドキュメントも多いので(英語苦手ですが)勉強続けていきたいです。 関連 ・Twilio - KDDI Web Communications|コミュニケーションAPI ・Answering Machine Detection - Twilio
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPフルスクラッチでWebアプリ作成

はじめに マイペースに開発を進める予定です。 記事を書き次第、追記予定となります。 また、デザインは全くと言ってもいいほどつけないと思いますので、ご理解いただけると嬉しいです。 経緯 気ままにWebアプリをフルスクラッチで実装しようと思ったので始めました。 また、どうせならアウトプットしようと記事にし始めました。 (MarkDownの勉強もできるし…) どんなものを作るか 詳しくは決めていないがバイトのシフト管理アプリを作ろうと考えています。 店長が管理者となり、従業員がシフトを提出して店長がシフトを作成する的な… 開発環境 Ubuntu 20.04.3 LTS PHP 8.0 MySQL 8.0 Git ※今後随時更新予定 記事一覧 COMMING SOON...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む