すがピー
テレワーク中、会社に電話がかかってきたらどうしよう?~代表電話を自動応答にしてみた~
画像引用:Wikipedia こんにちは。今日も鉄道だいすき情シスのプロジェクトリーダー、すがピーです。 冒頭の写真で、「おいおい今回は鉄道関係ないんじゃないのか?」と思った皆さんご安心ください。 これは新幹線車内の公衆電話なので、しっかり鉄道関連です(笑) もはや公衆電話のかけ方を知らない世代が台頭してきており、公衆電話のかけ方のPRも兼ねた、ミニチュアのガチャガチャまで登場する世の中ですが、数は少なくなれどもまだ列車の公衆電話は生き残ってたりします。 とはいえ、昔はあった新幹線に電話をかけるというのは既にできなくなってるんですけどね。 ちなみに冒頭の写真は東海道新幹線の車内です。 ちょっと気になるわというあなた! いつまで使えるかわからないので、ぜひ探してみてください。 さてさて、本題に行きましょう。電話です。 みなさんの会社にも当然電話ってありますよね。 きっとどの会社も代表電話番号・各部門・担当者直通の電話番号などがあるのではないでしょうか。 そして、代表電話番号は電話帳(そろそろなくなりそうですが)や、ホームページやパンフレット、与信や信用情報会社の情報から入手できますので、さまざまな方から電話をいただくこととなります。 ちなみにColorkrewでは代表電話番号のほか、必要なプロジェクトや個人に直通番号を用意しており、お客様から直接代表電話番号にかけていただく必要がない状態です。 代表電話番号にかかってくる電話のほとんどが、さまざまな商材の売り込み営業電話となっていました。 こういった営業電話は、直接必要な担当者にかかってくる分には、ありがたい場合も多いです。 しかしあてもなく代表電話にかかってくると、受けるのはだいたいどの会社も、コーポレート部門の方だったりしませんか? これが1日に何十件とかかってくるので、受け続けるコストもばかになりません。 しかも、Colorkrewは2020年12月現在も全社でテレワークとなっております。 テレワークだと、会社の代表電話にかかってきた電話をどうするかは悩みの種でした。 結局はたまたま必要があって出社している人(たいていコーポレート部門の誰か)が受けることになり、しかもテレワークで代わる相手もいないという、だれも幸せになれない状況でした。 今回は、Colorkrewで電話に関する悩みををどう解消したのか、ご紹介したいと思います。 自動応答をやってみよう 世の中、電話も様々なサービスがありますよね。 コンシェルジュみたいに電話を全部受けてくれて、必要な人にお知らせしてくれるサービスとか、特定の電話番号に転送してくれるサービスとか、いろいろあります。 そんな中Colorkrewでは、Amazon Connectというサービスを使ってみました。 これは、ざっくりいうとコールセンターのシステムをクラウド上で作れる仕組みです。 電話番号の用意からはじまり、電話を受け付けて、音声アナウンスを再生したり、番号入力で目的ごとにフローを分岐させたり、担当者を割り振ったり、問い合わせフローの進捗状況を管理したり、AWSの他の仕組みと連携して、プログラムを呼び出したり通知したりということができます。 今回の目的は電話の自動応答なので、一部の機能を使ってみました。 Amazon ConnectはAWSのサービスの一部なので、AWSから設定していきます。 Amazon Connectの初期登録を行った後、電話番号をとります。 どうやら1契約で取れる電話番号の数が限られているようなのですが、とりあえず番号取得。 ※ちなみにこれは、お金がかかりますのでご注意を。 そして、電話番号が取れたら、フローを作っていきます。 左側のメニューから機能を選んでドラッグし、矢印で繋いでいくという感じです。 機能のブロックを開くと、詳細設定ができます。 例えばプロンプトの再生では、実際に再生させるメッセージを設定したりしています。 合成音声なのでちょっと自動音声っぽさがあるのですが、日本語も英語も対応していて、本当にコールセンターの自動応答システムそのものが、クラウド上で作れちゃうのです。 単純に音声を再生させて終了であれば、ここにある機能だけで完結できると思います。 『〇〇の方は「1」を、□□の方は「2」を押してください』といったこともできます。 発信番号通知がされている場合は、発信番号も取ることができます。 そこで、発信番号をどうやって誰に通知するかで少し悩みました。 いろいろ調べた結果、Amazon Connectの仕組みだけでは自由にいろいろなところに通知はできないので、AWSのLambdaという仕組みでプログラムを作り、その中で通知を行うこととしました。 通知を受けるのは、ColorkrewではMicrosoft 365のTeamsにし、Teamsで電話番号通知用のチャネルを作りました。...情シスのメールアドレス変更奮闘記~社名変更編~
こんにちは。コロナ禍でも鉄道だいすき情シスのプロジェクトリーダー、すがピーです。 なかなか遠方へと電車に乗れなくて悲しいところですが、広いネット世界には様々な鉄道コンテンツがあるのでそちらで楽しんでます。 はやくイベントとかもできる世の中に戻ってほしいものですねぇ。 画像引用:Wikipedia そんな中で、上の画像は地下鉄日比谷線で走り始めた「THライナー」です。 座席指定で座って通勤できるってやつです。しかも座席が縦横に動くので、ライナーとしても普通としても使えるのですね~。 ライナーだと停車駅が限られているのでまだ乗ったことないのですが、普通では遭遇したことがあります。座席がひじ掛けで区切られてて結構好きですね。 このコロナ禍で準備もその後の利用状況も大変そうですが、がんばってほしいところです。 社名変更!メールアドレスも変更だ! さて、情シス、総務のみなさん、自社の「メールアドレス」を変更したことありますか? Colorkrewでは、2020年6月1日に株式会社ISAOから株式会社Colorkrewに社名が変わりましたので、メールアドレスの変更が必要となりました。 ▼Colorkrewに社名変更しました! でも、メールアドレスって変えちゃって大丈夫? いろいろトラブル起きそう… と、社名変更が決まってからメールアドレスを変更するまでガクガク震えていた私の奮闘記をお届けします。 めったにやらないことですが、どなたかの参考になるかもしれません。 ドメイン名をとる 社内で社名が変わることが決まってすぐ、まずはドメイン名を確保しようということになりました。 「.co.jp」についてはルールとして1社1ドメイン名となっており、すでに株式会社ISAOとして「isao.co.jp」を取得済みでした。 このままでは、「colorkrew.co.jp」は取れません。 社名が変わった法人が旧社名の「.co.jp」も持ち続けるためには、1社1ドメイン名緩和申請というものをする必要があります。 これには社名変更後の登記簿謄本が必要です。 登記簿謄本は、社名変更後でないと社名変更の記載が無いので、事前に申請できません。 そのため、まずは「colorkrew.co.jp」を仮登録として申請し、社名変更後に登記簿謄本を取得した後、緩和申請を行いました。 これで、「isao.co.jp」と「colorkrew.co.jp」が両方持てるようになります。 また、すでに持っている「isao.co.jp」は、旧社名で登録されていますので、これを新社名での登録に変更する手続きも行っています。 これは新しいメールアドレスに変わった後、古いメールアドレスでも引き続き受信できるようにするために、ドメイン名が継続して使える必要があるからなんですね。 ※実際「colorkrew.co.jp」を取得したものの、色々考慮した結果メインで使うのは「colorkrew.com」になりましたw 影響範囲を考える 当初は社名変更だからドメイン名(@より後の部分)だけ変えればいいかなー、と思っていました。 しかし、ブランディングの一環でメールアドレスのアカウント部分(@より前の部分)も変更することに決まり、メールアドレスは完全に変更となることに。 そもそもそんな変更が可能なのか? ColorkrewではMicrosoftのOffice 365を使用しているので、メールアドレス変更の影響範囲と方法についてサポートに問い合わせました。 結論としては、変更可能で変更方法の手順もあり、大きな影響は無さそうというものでした。 が、本当に大丈夫なのか。 気になったのがOffice 365のサインインアカウント。 これ、メールアドレスそのものなんですよね。 メールアドレスが変わるということは、Office 365のサインインアカウントが変わるということなので、つまり、Office 365のサインインが必要となるすべてのモノに影響があるということです。 代表的なところで、全てのOfficeアプリです。 Outlookのメールや予定表、Word、Excel、Powerpoint、Teams、OneDrive、OneNoteなどなど。 それにColorkrewではPower BIで様々なご提案をしていますが、そちらもOffice 365のサインインアカウントでサインインします。 各種クラウドの運用・構築を行う「くらまね」でも、MicrosoftのAzureはOffice 365のサインインアカウントでサインインします。 お客様の環境での運用も行っており、その場合はゲストアカウントとして登録されるので、こういったものがすべてメールアドレス変更で問題なく使えることを確認しなければいけません。...みんなを巻き込んで情シスからの生産性向上
こんにちは。中央線高尾-相模湖が単線復旧して盛り上がっている情シスのプロジェクトリーダー、すがピーです。 複線の片側交互というのは、自動車と違って、信号設備が両方向に対応していないため、とっても大変なのです。追突や正面衝突を起こさないために、人手で厳格な管理が必要なので、現場の鉄道マンの皆さん大変だろうと思います。 本格的復旧までよろしくお願いいたします。 さて、情シス、総務のみなさん、日々社内にはいろんな要望ありませんか? ISAOでも、アレが欲しい、コレが使いにくいと様々な要望があがってきます。 特にエンジニアからの大画面液晶モニターについては熱い要望があり、ついに改善できましたのでご紹介しましょう。 声をまとめるということ ISAOでは壁を作らずオープンにコミュニケーションしようということで、デスクトップパソコンはほとんど存在せず、社員にはノートPCを支給しています。 弊社オフィスは窓際が全部外の見える席になっており、そこであれば壁にはならないということで22インチの液晶モニターを設置しているのですが、いかんせん古めのものなので解像度もそれほど高くなく、利用率は高くありませんでした。 私も開発に携わっていた経験があるのでよくわかるのですが、エンジニアの画面はエディタやターミナルやその他もろもろ、一目で見れるということが生産性に直結するので、ノートPCの狭い画面ではつらいと常々要望がありました。 コミュニケーションのキャッチボールがうまくゆかず、まるで今の中央線のように片方が進むともう片方は止まるみたいな状態だったのを、採用担当小柴さんとエンジニア秋山さんが中心になり、要望する側から要求事項をまとめてくれました。 さすがバリフラット。 みごとに片側交互通行が複線開通って感じです。 試してみるってだいじ まずは、エンジニアからの要望が多かった27インチ4Kと、デザイナーからの要望で色再現度の高いEIZOのモデルを1台ずつ購入してみて、試験的に設置してみました。 機能面ではおおむね好評でしたが、台数が少なく、1日占有できないと意味が無いという根本的な問題がわかり、さらに標準添付のスタンドではノートPCに合わせた高さ調整ができず使いにくいという声もありました。 とはいえ窓際席すべてに置くとなるとそれなりのコストがかかるのですよねー。 ISAO代表中村にその大画面液晶モニターを見てもらったところ、 「いーじゃん、買お!」 ということで、一挙に追加で18台ほど導入し、さらにアームを取り付けて可動できるようにすることに大・決・定! 液晶モニター設置大会 16台もデカイ液晶買って、しかもただ置くのではなく、アーム取り付けて机に固定って、情シスだけでやるのシンドイっすよね。 とりあえず1台やってみたところ、1台あたりは意外と簡単だと判明したので、Goalousで**「液晶モニター設置大会やるよー」**と呼びかけてみたところ、たくさん参加者が!! **うーん家族的キズナぁ~。**まるで復旧作業に集まる鉄道マンのよう! 私のお手本でみんなで一気に組み立て完了! あっさり設置完了しちゃいました。災害復旧もこれくらい簡単ならいいのに。そうはいかないのが自然の驚異。 今回の作業によって、もともとあった液晶モニターもそのまま設置しているので、ノートPCの液晶と合わせてトリプルモニターもできちゃう!(一部機種)。 せっかくなので、一部の業務で別にしているネットワークを使いたいという熱い要望にもお応えし、ネットワークも引き回しましたよ。 その結果、モニター設置前の窓際席は1/3も使われておらず、マドギワっぽい雰囲気を醸し出していましたが、モニター設置後は、我先に席を確保しようと、ちょっと**みんな出勤早くなったんじゃないの?**というくらい席が埋まってます。 エンジニアの皆さん、やる気がみなぎっているようです! まとめ そんなに安くない投資ではありましたが、むしろこの程度で、これだけ使ってもらえれば窓際席も本望でしょう! ISAOでも多くの人の頑張りで以前よりも使いやすい環境となりました。 中央線も今頃きっと、不通となっているもう片方の線路を復旧すべく、多くの方々が頑張ってらっしゃると思います。 完全復旧期待しております! いかに意見を吸い上げまとめるか、費用対効果を説得できるか、設置の手間といったところは皆さん悩みどころかと思います。 ISAOの場合、そこをうまくやれる仕組みがあるため、こういったことがすぐに解決できているのかなと考えております。 もしISAOのしごとのやりかたにご興味がわいた方は、毎月開催している弊社セミナーにお越しください! ▷最新のセミナー情報はコチラ...Contact Form 7 でエラー時用画面にリダイレクトする方法
Contact Form 7では、管理画面の、各フォームごとの編集画面の「その他の設定」に、 on_sent_ok: "window.location.href = 'リダイレクト先のURL';" と入力すれば、Contact Form 7 の処理終了後に、設定したURLにリダイレクトしてくれます。 しかし、この設定をすると、成功しても失敗しても同じURLに遷移するため、送信が成功したか失敗したかわかりません。 画面遷移ではなく、メッセージの表示をさせる場合では、成功時と失敗時でメッセージが切り替えられており、その処理にはJavaScriptを使っているはずです。 そこで、Contact Form 7 のjsファイルを改変して、エラー時にエラー時用のリダイレクトURLへ遷移させることにします。 /pm_webform/wp-content/plugins/contact-form-7/includes/js scripts.js 67行目付近の以下の行 } else { の下に以下の行を追加すると、失敗時用のリダイレクトURLへ遷移できます。 window.location.href = "失敗時用リダイレクトURL"; 同様に、57行目付近の以下の行 } else if (1 == data.mailSent) { の下に以下の行を追加すると、成功時用のリダイレクトURLへ遷移できます。 window.location.href = "成功時用リダイレクトURL";...Contact Form DB でチェック処理
Contact Form DB でテーブルへの insert を行う前に、何らかのチェック処理を入れたい場合、フックを使います。 function my_form_chk( $cf7 ) { // 入力フォームの値取得 foreach ($cf7->posted_data as $posted_name => $posted_value) { // 元の値は変えないため別変数へ $posted_name_2 = $posted_name; $posted_value_2 = $posted_value; // 値の整形 $posted_nameClean = stripslashes($posted_name_2); $posted_value_2 = is_array($posted_value_2) ? implode($posted_value_2, ', ') : $posted_value_2; $posted_valueClean = stripslashes($posted_value_2); // それぞれの変数に代入 if( $posted_nameClean == 'a' ) { $input_param_a = $posted_valueClean; } if( $posted_nameClean == 'b' ) { $input_param_b = $posted_valueClean; } if( $posted_nameClean == 'c' ) { $input_param_c = $posted_valueClean; } } // チェック処理 if ( $input_param_a !...Contact Form DB のテーブルについて
Contact Form 7 というアンケートフォームのプラグインは、メールを送信するだけなので、DBへデータを格納するようにするプラグインが Contact Form DB です。 両プラグインをWordPressに入れることで、手軽に入力フォームの内容をDBに格納できます。 しかし、この Contact Form DB で作られるテーブルが曲者でした。 WordPressの管理画面から Contact Form DB の管理画面を表示すると、入力フォームから入力されたデータの一覧を表示でき、それを見るとあたかも一つのフォームからの投稿が一つのレコードとして格納されているように見えます。 しかし、実際のテーブルには、入力フォームの input 一つ一つがそれぞれ1レコードとして登録されます。 入力項目が3つのフォームだと、1回の投稿で3つレコードが登録されるわけで、それぞれのレコードには、それぞれの入力項目の内容のみが、投稿時間と入力フォーム名と入力項目名をキーに記録されるのです。 ちなみにテーブル構造は下記の通り。 mysql> DESC wp_cf7dbplugin_submits; +-------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+---------------+------+-----+---------+-------+ | submit_time | decimal(16,4) | NO | MUL | NULL | | | form_name | varchar(127) | YES | MUL | NULL | | | field_name | varchar(127) | YES | MUL | NULL | | | field_value | longtext | YES | | NULL | | | field_order | int(11) | YES | | NULL | | | file | longblob | YES | | NULL | | +-------------+---------------+------+-----+---------+-------+ 6 rows in set (0....PATH_INFOを取得してhiddenに代入
URLにパラメータをくっつけて、GETで送信する場合、 http://www.example.com/?param0=aaa¶m1=bbb という感じで渡して、受け取るときは $param0 = $_GET['param0']; $param1 = $_GET['param1']; または $param0 = $_REQUEST['param0']; $param1 = $_REQUEST['param1']; というようにするのが一般的ですが、以下のように、 http://www.example.com/aaa/bbb/ で値を渡して、受け取りは $param = split("[/\.]", $_SERVER["PATH_INFO"]); とすると、$param[0] に「aaa」が、$param[1] に「bbb」が代入されます。 さて、これを WordPress でやろうとすると、「aaa」とか「bbb」をURLとして処理しようとしてしまい、当然パーマリンクや実体があるわけではないので、表示できません(実体があればそちらを表示しちゃう)。 WordPress では PATH_INFO を使わない方がよさそうなのですが、使わざるを得ない場合、WordPress とは関係なく、一旦 PATH_INFO を受けるプログラムを作成し、そこから何かしらの方法で WordPress にパラメータを渡すようにします。 受け方は上記の通りなので、あとは渡し方になるのですが、手軽なのは GET でリダイレクトする方法でしょう。 $url = "遷移先URL?param0=" . $param0 . "¶m1=" . $param1; header("HTTP/1....wp_insert_attachment() で新規 insert
wp_insert_attachment() のリファレンスには、 wp_insert_attachment( $attachment, $filename, $parent_post_id ); と書かれており、$parent_post_id を指定する必要があります。つまり、事前に posts テーブルに何らか insert して、そのレコードの post_id を指定することとなります。 でも、新規で画像情報を登録したくて、でも紐づく投稿がまだ無い場合、post_id が無いわけで、どうするべきか調べてみました。 WPのソースを追ってみて、実際に試してみたところ、 wp_insert_attachment( $attachment, $filename, 0 ); というように、$parent_post_id = 0 とすることで、新規で insert されます。 ちなみに、$attachment には、 $wp_filetype = wp_check_filetype(basename($filename), null ); $wp_upload_dir = wp_upload_dir(); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 'post_mime_type' => $wp_filetype['type'], 'post_title' => preg_replace('/\....スクリプトで WordPress の DB にアクセスしたい
WordPress の DB にスクリプトからアクセスしたい場合、単純に MySQL にアクセスして処理すればいいのですが、何らかの理由で WordPress の関数を使いたい場合(画像の投稿をスクリプトで行う等)は、 require_once('wp-blog-header.php'); でOKなのですが、一部のメソッドは直接そのメソッドが記述されたソースをインクルードする必要があります。 例えば、カテゴリ登録するための wp_insert_category() を使いたい場合、 require_once('/wp-admin/includes/taxonomy.php'); とする必要があります。/wp-admin/includes/にクラスがあるので必要なものを探しだして、インクルードします。 また、wp-blog-header.phpをインクルードするということは、例えば、HTTPSで必ずアクセスさせたり、ログインユーザのみに見せるといったようなWebの制限をfunction.phpなどに入れて、サイト全体に制限かけた場合、影響を受けます。 そこで、そういった制限を入れた場合は、その制限処理に、 if ( ! preg_match( '/^(script.php|hogehoge.*.php)/', basename( $_SERVER['SCRIPT_NAME'] ) ) ){ // 制限処理 } のように除外したいスクリプト名(上記の場合、「script.php」か「hogehoge.*.php」にマッチするスクリプト)を指定して、処理から除外する必要があります。 これをしない場合、スクリプトを実行すると、制限に引っかかり、処理が止まります。...複数ファイルのアーカイブをダウンロードさせる時の方法
例えば、複数個の画像ファイルをまとめてダウンロードさせたりする場合、サーバ上でテンポラリディレクトリに画像ファイルをコピーして、それらをアーカイブしてダウンロードさせたりします。 しかし、これだと画像ファイルをいちいちコピーすることになるので、ストレージを圧迫する可能性があるし、ファイル数が多いとコピーに時間がかかります。 そこで、シンボリックリンクを作成し、そのディレクトリ毎アーカイブすることにします。 まず、テンポラリディレクトリを作成します。 $tmp_path = "/tmp/" . uniqid(rand()); $archive_dir = "(指定したいディレクトリ名)"; $tmp_dir = $tmp_path . "/" . $archive_dir; テンポラリディレクトリまでのパスと、テンポラリディレクトリ名を分けている理由は後述。 次に、作成したテンポラリディレクトリに、画像ファイルのシンボリックリンクを作成します。 // $filelists:画像ファイル名のリスト // $$image_dir:画像ファイルの格納ディレクトリ foreach( $filelists as $image_name ) : $target = $image_dir . "/" . $img_name; $link = $tmp_dir . "/" . $img_name; symlink($target, $link); } あとは、このテンポラリディレクトリごとアーカイブします。特に画像ファイルの場合、圧縮してもサイズは余り変わらないので、tar でアーカイブすれば、圧縮処理が無い分、処理が早いです。 tarコマンドのオプションで「h」をつけることで、シンボリックリンクを実体としてアーカイブできます。これがキモですね。...【WordPressを使う】WindowsPCで動かしてみる
...WordPressを仕事で扱うことになったので、試しにいつも使っているWindowsPCに入れてみることにしました。
さてどうすれば動かせるのかと調べてみると、WordPressはPHPとMySQL、Apacheがあれば動くようで、WindowsPCではWebアプリを動かすのに必要なソフトウェアをひとまとめにした「XAMPP」というものをインストールして、それを利用してWordPressを実行できるようです。
というわけで、まずはXAMPPをインストールすることに。