技術・開発

CalDAVを利用したGoogleカレンダーとThunderbirdのカレンダーを同期するメモ

マインドテックの冨です。

以前、GoogleカレンダーとThunderbirdのカレンダーを同期する方法をポストしたのですが、その後、googleカレンダーのCalDAV機能を利用して同期を取れるようになっています。

久々に自分の環境に設定を入れたので、メモを残しておきます。

GoogleカレンダーのカレンダーIDの取得と同期用URLの作成

まずはgoogleカレンダー側の設定としては連携用のURLを調べる必要があるのですが、このためカレンダーIDをチェックします。

同期を取りたいカレンダーの設定画面から、マイカレンダーの設定>カレンダーの同期 より、カレンダーIDをメモします。(メインのものはgmailのアドレスと同じでした。)

このカレンダーIDよりCalDAV用のURLを以下のようにメモ帳等で作成しておきます。

https://www.google.com/calendar/dav/(カレンダーID)/events

 

Thunderbirdカレンダーの作成

続いてThunderbird側の設定です。既存のカレンダーのデータに統合するのは無理っぽかったので、新しい同期用のカレンダーを作成しました。

「ネットワークのサーバーに保存する」を選択して「次へ」

フォーマットに「CalDAV」、「場所」に先に作成したURLを記入して「次へ」

Thunderbirdのカレンダーへの表示名や色を指定して「次へ」

ここまでで設定は完了です。Thunderbirdのカレンダーに追加されていると思いますが、スイッチが入っていない場合には、カレンダー名を右クリックして編集画面を出して、「有効にする」スイッチを入れてください。

最初に接続する際にはGoogleアカウントの認証を求められます。2段階認証にしている人はアプリ用のパスワードを作成する必要があります。

(2段階認証は当然設定してますよね! まだの人はアカウントが破られる前に設定しておきましょう。)

google のアカウント画面より、「アプリパスワード」を選択

 

認証を通した次の画面で、アプリに「カレンダー」、端末にお使いの環境を設定し「生成」をクリック

作成したアプリパスワードを利用してThunderbirdからgoogleへの認証の際のパスワードとして記入します。

ここまで出来ればGoogleカレンダーの設定スケジュールがThunderbirdカレンダーに取り込まれると思います。逆にThunderbirdのカレンダーに入れた予定もGoogleカレンダー側に反映されると思いますので、試してみてください。

 

 

 

 

MS Officeでサインインが止まらなくなった時の対処法

マインドテックの冨です。

Word、Excel、PowerPointなどのMicrosoft Officeアプリを使う際には、Officeにサインインを行うと、OneDriveと紐づいて移動先からでも編集できますし、OneDrive上のOfficeファイルを複数で同時に編集できたりと便利です。

先日、サインインを行っても受け入れられず、何度もサインイン画面が繰り返し表示されるというトラブルが起こりました。Microsoftのサポートの方にもいろいろとご支援頂き最終的には解決したようなので、情報共有したいと思います。

 

そもそもの症状

「サインイン」のボタンをクリックすると、以下のようなアカウントを入力するダイアログが表示されます。ここで作成済のアカウント情報を入力して「次へ」を押すと、通常はパスワード入力画面に遷移するのですが、今回のトラブルでは何らかの画面が一瞬表示されて、下記の画面に戻ってしまうというトラブルです。

私の場合の特殊事情としては、Windows10上にOffice 365 ProPlusで導入しています。買い切り版や他のライセンスなどで利用されている場合には、ちょっと事情が違うかもしれません。

また念のため、自分が所有している他のPCでOfficeアプリの起動~サインインして正常動作を確認し、ライセンスやOffice365のサイト側の問題ではなく、PC本体側にトラブルがあると切り分けした所からスタートしています。そもそもアカウント側に問題があると下記の手順などは参考にならないと思いますので、ご確認ください。

 

Microsoftのサポートから教えて頂いたトラブルシューティング

まずは以下の段取りを踏んで、認証情報のリセットを行うと良いそうです。(「汎用資格情報」とか知らなかった。ここで管理していたんですね。)

(以下、引用しますが問題あるようでしたら対応いたしますので、ご連絡ください。)


1) Windows Update の実施
2) Office クライアントの [アカウント] の接続済みサービスの削除およびサインアウト
3) 汎用資格情報のリセット
4) Office 365 からの完全サインアウト
5) ブラウザーのキャッシュの削除
6) 信頼済みサイトへの登録について
7) Office 365 にサインインする際に “サインインしたままにする” を有効にする
8) Office クライアントのキャッシュ クリア

————————
1) Windows Update の実施
————————
Office 365 のポリシーでは、お客様がそれぞれのクライアント コンピューターを最新の状態に保っていただく必要がございます。
更新可能なアップデートがありましたら実行いただきますようお願いいたします。(自動更新を有効にしていただくことを推奨いたします)
作業の完了後、次のステップに進む前に一旦 PC の再起動をお願いいたします。

<参考情報>
タイトル : Windows Update 利用の手順
アドレス : http://www.microsoft.com/ja-jp/security/pc-security/j_musteps.aspx

——————————————————————————–
2) Office クライアントの [アカウント] の接続済みサービスの削除およびサインアウト
——————————————————————————–
1. クライアント PC で Office クライアントの Word 、Excel、PowerPoint のいずれかのファイルを開きます。
2. 画面左上の [ファイル] タブをクリックします。
3. 画面左のペインより [アカウント] をクリックします。
4. [サインイン] より同期を実施する Office 365 ユーザー アカウントでサインインします。
※ 他のアカウントでサインインされている場合は、[アカウントの追加] よりアカウントを追加します。
5. [接続済みサービス:] の項目で、削除が可能なすべての接続済みサービスを削除します。
6. [ユーザー情報] の項目で [サインアウト] をクリックし、確認画面で [はい] を選択します。
7. [サインイン] より、もう一度 Office 365 のアカウントにてサインインし、[接続済みサービス] に削除可能なサービスがないことを確認の上、Office クライアントを閉じます。
※ 他に開いている Office クライアントがある場合は、すべての Office クライアントを閉じていただけますようお願いいたします。

————————-
3) 汎用資格情報のリセット
————————-
1. [コントロール パネル] – [ユーザー アカウント] – [資格情報マネージャー] を開きます。
2. [Windows 資格情報] の汎用資格情報の一覧の中より、”Microsoft Office15_Data: orgid:” で始まる資格情報があるか確認します。
3. 資格情報がある場合は、資格情報の右端に表示されているアイコン (丸の中に上向きの記号が描かれているアイコン) をクリックします。
4. 表示された詳細情報にある [削除] をクリックし、確認画面で [はい] をクリックします。
※ ご利用の端末によっては “Microsoft Office16_Data: orgid:” や “Microsoft Office14_Data: orgid:” など複数表示される場合がありますが、すべて削除いただきますようお願い申し上げます。
5. コントロール パネルを閉じます。
6. 端末を再起動します

————————————
4) Office 365 からの完全サインアウト
————————————
1. Internet Explorer のアドレス欄に下記のアドレスを入力し、Enter キーを押下して Microsoft Online サービスのサインアウト ページを開きます。

アドレス: https://login.microsoftonline.com/logout.srf

2. ブラウザー画面に『Office 365 から正常にサインアウトしました』と表示されたら完全サインアウトは完了です。

—————————————
5) Internet Explorer のキャッシュの削除
—————————————
1. Internet Explorer メニュー バーにて [ツール] – [インターネット オプション] をクリックします。
2. [全般] タブの [閲覧の履歴] の項目で、[削除] をクリックします。
3. [インターネット一時ファイルおよび Web サイトのファイル] および [クッキーと Web サイト データ] にチェックを入れて、[削除] をクリックします。
※ [お気に入り Web サイト データを保持する] のチェックは外してください。(こちらはお気に入りに登録している他のサイトにも影響しますので、問題がないかご確認の上ご実施ください。)
4. 画面下部に、「選択された閲覧の履歴が削除されました。」とメッセージが表示されるのを待ちます。メッセージが表示されたことを確認します。
5. [インターネット オプション] の画面で [OK] をクリックします。
6. 開いている Internet Explorer のウィンドウをすべて閉じます。

———————————-
6) 信頼済みサイトへの登録について
———————————-
1. Internet Explorer のメニュー バーにて [ツール] – [インターネット オプション] をクリックします。
2. [セキュリティ] タブをクリックし、[信頼済みサイト] – [サイト] をクリックします。
3. [Web サイト] に次の URL が表示されていない場合は追加します。

https://portal.office.com
https://*.sharepoint.com
https://*.microsoft.com
https://*.windows.net
https://*.microsoftonline.com
https://*.sharepointonline.com
https://*.officeapps.live.com
https://*.cdn.office.net
https://*.osi.office.net
https://*.akamaihd.net

4. [閉じる] をクリックします。

————————————————————————–
7) Office 365 にサインインする際に “サインインしたままにする” を有効にする
————————————————————————–
1. Office 365 のアカウント名とパスワードを入力する画面に “サインインしたままにする” のチェックボックスが表示されます。
チェックが入っていない場合はチェックを付け、サインインします。
2. “サインインしたままにする” のチェックボックスが表示されない場合は、”その他のアカウント” をクリックすると “サインインしたままにする” が表示されます。

—————————————–
8) Office クライアントのキャッシュ クリア
—————————————–
キャッシュを削除するために、エクスプローラーまたは [ファイル名を指定して実行] から以下のパスに移動して、フォルダー内に格納されているすべてのファイル、フォルダーを削除します。
* [ファイル名を指定して実行] は、Windows 7 ではスタート メニュー内、Windows 8 以降ではスタート ボタンを右クリックした後に表示されます。
* “使用中のファイル” メッセージが表示されて削除ができないファイルがあった場合は、[スキップ] をクリックいただきますようお願い申し上げます。

%localappdata%\Microsoft\Office\16.0\OfficeFileCache
%localappdata%\Microsoft\Office\15.0\OfficeFileCache
%localappdata%\Microsoft\Office\14.0\OfficeFileCache
%localappdata%\Microsoft\Office\Spw
%temp%


通常、認証情報が何らかの理由で壊れてしまった場合には、上記の手順でリセットした後に、再度サインインを行うとうまくいくそうです。

ただ、残念ながら私のケースでは、上記の手順を踏んでも改善しませんでした。

その他、試してみた事

認証情報をリセットしても再現するため、何らかのシステム関連のファイルが壊れている可能性を考えまして、チェック/改修コマンドを試しました。

dismコマンドは、システムファイルをチェックし、破損している場合にはWindows Updateを利用して修復を行います。

DISM.exe /Online /Cleanup-image /Restorehealth

システムファイルチェッカー(sfcコマンド)は、システムファイルの整合性をチェックし、問題があればファイルを元に戻します。

sfc /scannow

 

ただ私の場合では、これでもダメでした。

最終的に復旧した手順~アクセス権の初期化

ここまで来たら、Officeアプリが個人のフォルダ以下のファイル/ディレクトリに何らかのアクセスを行っており、何らかの権限設定が狂ってアクセスできずにタイムアウトを起こしている可能性を考え、アクセス権の初期化を試みました。

手順はAdobe社のサイトですが、以下のページを参考にしました
https://helpx.adobe.com/jp/x-productkb/global/cpsid_83128.html

このページの”A.Windows10″の手順を踏み、Win10ログインアカウントのホームディレクトリでの、SYSTEM/Administratorsの権限を修正しました。
(実際にはSYSTEM/Administrators にフルコントロールは設定されていましたがサブオブジェクトにも適用する手順です)

この操作を行った後にWindows10を再起動した結果、サインインが出来るようになりました。(結局のところ、サインインに関しては「汎用資格情報」以外にも、何らかの情報をローカルに保存しているのですね。)

 

余談:会社アカウントと個人アカウント

今回のトラブルは会社名義のOffice365のアカウントで生じたのですが、個人用のアカウントではログインできていたのですね。法人用のOneDriveは裏がSharepointが動いているようで、あまり意識していませんでしたが違いがあるようです。(「サービスの追加>ストレージ」をクリックすると、”Office 365 Sharepoint”と”OneDrive”を選べる。)

 

 

さらには同じメールアドレスで会社アカウントと個人アカウントの両方が作れます。ただ、これはトラブルの元になりそうなので止めておいた方が良いと思います。上記のサインイン画面でアドレスを入力した後、どちらのアカウントでログインしますか?と聞かれます。(Office365のアカウント発行の際にログインできなかった時に「サインアップしますか」と聞かれて、作成したら個人用アカウントが新規に発行されたようなのですね。いろいろと混乱するので最終的にはアカウントを削除しました。上図のアカウント画面では個人アカウントと会社アカウントは異なるメールアドレスで運用しています。)

ThinkPad X1 Carbon(2017年版 第5世代)に発熱・発火の可能性でリコール

マインドテックの冨です。

昔からのThinkpadファンで、今も数台を使い分けています。他のブランドのノートも数台持っていますが、Thinkpadはキーボードが良いのでメイン機なのです。

その中で、Lenovo Thinkpad X1 Carbon (第5世代)にリコールがかかりました。まじですか・・・

ThinkPad X1 Carbon第5世代ノートパソコン無償点検・修理のお知らせ
https://support.lenovo.com/jp/ja/solutions/ht504453

対象は、2016年12月から2017年10月までに生産された第5世代のものです。(”2017年11月1日以降に製造したThinkPad X1 Carbon第5世代は無償点検・修理の対象外”とのこと。すでに対策済のようです。)

リコールの内容としては、バッテリーの異常発熱の懸念。生産過程でユニット内に放置された小さなネジがバッテリーにダメージを与えると、オーバーヒート~発熱・発火の可能性があるという事で無償点検を提供するというものです。

自分の機体がリコール対象か否かは、上記のサイトに「マシンタイプ」と「シリアルナンバー(S/N)」を入力すると対象端末かどうかチェックできます。(本体の裏側に記載があります)

そして該当すると、下図のように「点検対象」の文字が。うげえ・・・

実際にレノボのサポートセンターに電話をかけてみると、名前、連絡先TEL&住所で修理IDが発行され、宅配業者による回収予定日の調整をします。回収から点検後に戻ってくるまで概ね5営業日とのことです。

サポセンになかなか電話がつながらない(朝9時からちょこちょこかけて、つながったのが午後3時ごろだったよ)ですが、該当した方は頑張ってコールしてみてください。

HSTS起因で、ブラウザで「自動転送設定が正しくありません」が出てくる場合の症状

マインドテックの冨です。

とあるテック系情報サイト日本語サイトの翻訳チームの知人が「画面にエラーが出て、マシン変えてもブラウザ変えても再現する。DNSとかWiFiが原因かと思って、3G/4G回線のテザリングでも出てくる。なんじゃこれ?」と叫んでおられたので、お節介ながら見てみたら、自分も再現するのですね。

さて、これはなんぞと思って、リクエストを見てみると、httpsで送った結果、確かにひたすらに302が返ってきているわけです。

で、それぞれのヘッダーを見てみると、下図のような感じ

リダイレクトURLの設定はLocationヘッダーで行うわけですが、ここは http:// … とHTTP (ポート80)にリダイレクトしようとしているのがうかがえます。つまりはHTTPS(ポート443)リクエストで来てもHTTPで見るように強制しているわけです。

この一方で”strict-transport-security”ヘッダーも送っている事がわかります。これはRFC6797で標準化されている”HTTP Strict Transport Security(HSTS )”と呼ばれるもので、HTTPで接続した際に強制的にHTTPSへリダイレクトし、SSLストリップ攻撃や中間者攻撃などを防ぐために以降のそのドメインへの接続はすべてHTTPSとする機能です。「Chrome」「Firefox」「Safari」「Internet Explorer」「Microsoft Edge」などの主要ブラウザのほとんどがHSTSをサポートしています。

この結果、LocationヘッダーでHTTPにリダイレクトされても、ブラウザ側は合わせて受け取っているHSTSのヘッダーにより、HTTPSでアクセスを試み、サーバーはHTTPS->HTTPへのリダイレクト応答を行い、これがループしていると推測されます。

Strict-Transport-Security:max-age=(有効期間秒数);includeSubDomains

またincludeSubDomainsが指定されていると、サブドメインにもHSTSが適用されるようになります。ここのサイトの場合には英語版の方は逆にHSTSによってHTTPSにリダイレクトしていました。この際に上記の通りにincludeSubDomainsオプションがついているとサブドメインで運用されていた日本語版の方にも影響していたはずです。(この記事執筆時点では、このオプションは設定されていませんでした。)

この設定がされているWebサーバーに対して、何らかの理由でHTTPSでアクセスしてしまった場合、または親ドメインの方でincludeSubDomain付HSTS設定がされている場合でリンクを踏んだ場合、「自動転送設定が正しくありません」とリダイレクトがループしてしまうため、この場合はapache, nginxなどのWebサーバーの設定ファイルを見直してみてください。

(上記のテック系情報サイトの技術窓口向けに連絡メールを投げてみましたが、返事が来ないですねー。2018/2/8現在、上記のヘッダーが付いてくるので日本語版をHTTPSで閲覧しようとすると現象が再現すると思います。復旧するにはブラウザの直近の履歴、キャッシュ、cookieを削除してください。)

参考:

SSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~(IPA 情報処理推進機構)

HTTP Strict Transport Security (HSTS)

Twilio SIGNAL London 2017の報告会に行ってきましたよ

マインドテックの冨です。

Twilioと言えば電話/SMSのAPIで有名ですが、最近は様々な機能が追加されてきており、コミュニケーション支援ツールのバックエンドといった方向に進化しつつあります。

Twilio社主催のイベントとして”SIGNAL”が年に一度、サンフランシスコで開催されるのが通例でしたが、今年はロンドンでも開催されたようです。日本国内の代理店はKDDI Webコミュニケーション社ですが、事業責任者の小出さん、エバンジェリストの高橋さんによるSIGNAL Londonで発表されたTwilioの新機能の紹介がありました。

Twilioの概要

そもそもTwilioって何よという話ですが、もともとはWebと電話/SMSの機能を融合させるAPI群を提供するサービスでした。専用の電話番号をただちに購入できて、その番号にかかってきた電話に対して自動応答や録音、転送、IVR(「***の場合は1を。***の場合は2を押してください」というガイダンスを聞かせて、通話の振り分けをする機能)などを、簡単なプログラミングで実装できるというサービスです。例えば、学校の行事で天候が怪しい場合に「運動会を開催するか延期するかは、当日朝7時以降に***-***-****の番号にかけて確認してください」といった情報サービスは、慣れていれば30分かからずに実装出来ます。

報告会の冒頭に、最近のTwilio社の開発状況についての紹介がありましたが、年間に30,000デプロイ、3.5日毎に新ツールか新機能のリリースというペースだそうです。それでいて可用性が99.999%、APIの動作率も99.999%の品質を保っているそうです。額面通りに信じていいのか分からないですが、個人的な体感値としても、あまりトラブルは無いかなと思います。

Studioのクローズドβリリース

今回の発表の目玉は、ビジュアルプログラミング環境の”Studio”です。これまでは”openVBX”というOSSの支援ツールがリリースされていました。これはこれで非常に便利で、コールフローをGUIで作成できるという優れものです。私もお客さんの所でその場で簡単なデモを作って披露する事もありましたが、この手のツールが正式なサービスとしてリリースされたという点が大きいでしょう。作成したコールフローが直接にTwilioの管理画面から使えるのも、なかなか好感度高いです。

「ノンプログラマーでも実装できる」とデモされていましたが、全くの素人はつらいでしょう。少なくともTwilio特有の機能の概念を理解していないと、それぞれのコンポーネントが何をするものなのか理解できないでしょう。今までコード書いていた人がRADとして使うには有用でしょうし、何より人にフローの説明するのに重宝しそうです。(あと、例によってGUIが英語です。)

Understandのクローズドβリリース

いわゆる”Voice to Text”のTwilio版です。単にテキストに直すだけでなく、サンプル音声を利用して学習させてモデルを作ると、意味解析を行ってキーワード抽出もやってくれるようです。サンプルアプリケーションとしては、ハンバーガー屋のドライブスルーの会話で、客からの注文の会話を拾って、商品、個数をリアルタイムに解析してオーダーを確定させるデモがありました。これをうまく使うとIVRでキー操作による分岐ではなく、相手のリクエスト音声からいきなり適切な人に電話を転送したり、自動で注文を受けたりすることが出来そうです。ただこちらも現在は英語のみの提供。

これに似た機能を以前のTwilioハッカソンで、MicrosoftのLUIS(language Understanding Intelligent Service)を使って、簡易的なジュークボックスのインターフェースを作ってみました(電話口で曲名を言うと、それを流してくれる)が、それのTwilio版のようでした。日本語版が公開されるまではLUISを使ってもいいかもですね。

FunctionのNPMパッケージの提供の開始

こちらは最近のサーバーレスの流れを受けて、Twilio版のサーバーレス環境として前回のSIGNALで発表されたものです。node.jsベースでアプリケーションが書けるのですが、npmパッケージが利用できるようになり、より記述が楽になるとの事。私自身はnode.jsを使って書くことがほとんどないため、どの程度の恩恵が受けられるのか実感が無いのですが、他の言語でもパッケージが利用できる/出来ないで大きく生産性が変わるので、きっとすごく便利になったのでしょう。

電話番号100か国の提供開始

Twilioサービスの基盤側は、各国の1st Tierの電話会社と接続していて、非常に低いレイテンシーで安定したサービスを利用できるという点が大きいのですが、その接続先が100か国を越えたというアナウンスです。実際の所は通話では言語の問題があるので、他国との接続性に関しては、各国に支店があるようなグローバル企業であるとか、英語でサービス展開しているB2Bサービスなどでスケールする場合くらいかなあと思うのですが、実際、そういう方々には便利なのでしょう。島国育ちの私はあまり実感がわかない。

Twilio GDPR compliant

“GDPR”はEUで規定している個人情報保護の枠組みで、2018年5月に施行予定です。EU圏内のみならずヨーロッパ人向けのサービスは全て対象になり、多額の制裁金が課せられるため、知り合いのコンサルには今年の春先あたりから対応をどうするのか、かなりの問い合わせがあったそうです。TwilioもGDPRの規定に対応したため安心してサービスを利用して欲しいとの訴えのようです。
個人的には、中国のサイバーセキュリティー法への対応がどうなっているのか気になる所でした。何より通話/コミュニケーションインフラですから当局が目をつけそうな所ですし、金盾でブロックしているチャットアプリ間を接続出来たりしそうですし、中国のTwilioのサービス圏内に入っているようでしたが、どうなっているんでしょうね。
後半は高橋さんによるテクニカルなデモがありました。β版らしいほほえましい展開もありましたが(笑)応答音声が英語だけというのは国内で利用するにはツラ過ぎる仕様なので、日本語版が早く出ないかなあと待ち望んでおります。(Twilio本社に日本人デベロッパーっているのかしら?)

db tech showcase 2017に行ってきました。

マインドテックの冨です。

(株)インサイトテクノロジーさんが主宰するDBのイベント”db tech showcase 2017″に今年も行ってきました。

http://www.db-tech-showcase.com/dbts/tokyo

思えば毎年行っているんですが、平日昼間の3日なのにかなりの参加者がいるんですよね。立ち見のセッションも出て大盛況でした。

”ビッグデータ”ブームで分析技術の観点からは、処理するアルゴリズムや分析手法と共に、それを支える基盤技術の進歩が目覚ましいわけですが、いろいろなメーカーやプロジェクトの製品の話をまとめて聞ける機会は貴重です。

基盤系も流行り廃りがあって、一昨年、去年くらいまでは”Spark!いぇ~~!!”な感じだったのが、今年は目玉的なビッグウェーブが無い代わりに、MySQL、MariaDB、PostgreSQLのような枯れたOSS DBをいかに使っていくかといったセッションが多かったような印象があります。

個人的にツボだったのが、GPUを駆使した地理情報向けのMapD。地理情報用のデータストアとしてはPostGISなどが有名ですが、ベンチマーク結果の桁が違うパフォーマンスに驚き。最近、自分が気象や海洋系のプロジェクトにも関係しているので、あとで使いどころをフォローしたいと考えています。

あとはMicrosoftのSQL Server 2017関連のセッション。ついにLinuxのサポートや、グラフ向けのQuery、RやPythonのサポートなど、様々な新機能が実装されています。AzureのCosmosDBも含めて、データ基盤周りの攻勢に勢いがあるなあという印象です。

また意外というか、Apache Kafkaが地味に使われているなあという。自分も以前にお客さんに提案した事がありましたが、データの中継基盤ってなかなかピッタリするようなものが無くって、見事にハマった感じがありますね。DB間のデータ交換でも製品がサポートしていないものについては、取りあえずKafkaに投げておいて、引継ぎ側がそれを拾いにいくという事もやっているみたいですし、リアルタイム処理に近いもののバックエンドにも使われているようで、数年前のリリース当初には想像も出来なかった定着ぶりに驚きました。

そんなこんだで、なかなか興味深いセッションが多くて、来年も楽しみです。

 

Twilioの音声をMicrosoftのBing Speech APIを使ってテキスト化する方法

マインドテックの冨です。

先日、Twilioのハッカソンに行ってきました。電話を使ったアプリケーションを作ろうとすると、音声をテキスト化したいニーズが出てきます。実際、Twilioにはテキスト化の機能もあるのですが、現状では日本語は対象外なんですよね。(あとテキスト化のお値段がちょっと高いw)

そんなわけでテキスト化するためには(自力で実装するのでなければ)外部のAPIを呼び出す必要があります。Google Speech APIを利用する方法は昔、高橋さんがガッツリ書いておられるので、ここではBing Speech APIを利用する方法をご紹介しましょう。サンプルはpython2.7で動作確認をしていますが、もちろん他の言語でも問題ないと思います。

ドキュメントと関連リンク

Bing Speech APIとは
https://azure.microsoft.com/ja-jp/services/cognitive-services/speech/

ドキュメント
https://www.microsoft.com/cognitive-services/en-us/speech-api/documentation/overview

Speech APIではテキスト化する音声認識と、テキストを音声データに変換する機能がありますが、ここでは前者を使います。
Microsoft Congitive Serviceのアカウントは取得しておいてください。
https://www.microsoft.com/cognitive-services/en-us/

APIキーの取得

Cognitive Service の管理画面で”Bing Speech”のサービスの箇所から”key 1″をShow/Copyしておいてください。API呼び出しの際に必要になります。

認証~APIアクセストークンの取得

APIの呼び出しの際には認証が必要になります。詳細はドキュメントを参照いただくとして(笑)キーを送って認証トークンを取得します。トークンは10分間有効。
リクエストヘッダー”Ocp-Apim-Subscription-Key”にAPIキーを指定します。

Pythonでこんな感じに書きました。requestsを使ってます。

import requests
import urllib

def authorize():

    url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"

    headers = {
        "Content-type": "application/x-www-form-urlencoded",
        "Ocp-Apim-Subscription-Key": "取得したAPIキー"
    }

    response = requests.post(url, headers=headers)

    if response.ok:
        _body = response.text
        return _body
    else:
        response.raise_for_status()

音声変換

先に取得したアクセストークンは、API呼び出しの際にヘッダーに付与します。

"Authorization": "Bearer " + token

認証の場合と同様に、指定されたエンドポイントにPOSTでデータを投げます。

import requests
import urllib

def speech_to_text( raw_data, token, lang="ja-JP", samplerate=8000, scenarios="ulm"):
    data = raw_data
    params = {
        "version": "3.0",
        "requestid": "b2c95ede-97eb-4c88-81e4-80f32d6aee54",
        "appid": "D4D52672-91D7-4C74-8AD8-42B1D98141A5",
        "format": "json",
        "locale": lang,
        "device.os": "Windows",
        "scenarios": scenarios,
        "instanceid": "565D69FF-E928-4B7E-87DA-9A750B96D9E3" # from Sample Bot Framework
    }
    
    url = "https://speech.platform.bing.com/recognize?" + urllib.urlencode(params)
    headers = {"Content-type": "audio/wav; samplerate={0}".format(samplerate),
               "Authorization": "Bearer " + token }
    
    response = requests.post(url, data=data, headers=headers)
    
    if response.ok:
        result = response.json()["results"][0]
        return result["lexical"]
    else:
        raise response.raise_for_status()

“version”,”appid”などは指定された固定値。
“requestid”,”instanceid”は本当はGUIDを作成しなければいけないようですが、サンプルの文字列で動いたのでそのまま使っています(笑)きちんとしたい人は適当に直してください。
“senario”もulm, websearch などの指定が出来るようですが、違いがよく分かりませんでした。スミマセン。

端末でのテスト

これらを呼び出して実際にテキスト化してみます。適当に声を録音したwavファイルを作成します。(サンプリングレートは8000にしています。)

infile = open("sample.wav", 'r')
raw = infile.read()
txt =  speech_to_text( raw , token, lang="ja-JP", samplerate=8000, scenarios="ulm")
print "text : " + txt

これで

$ python test.py
text : こんにちは

こんな感じで表示されば、呼び出しはうまくいっています。

Twilioの録音音声を上記の例の”sample.wav”に相当するデータとして引き渡しできればOKです。

サーバー側のアプリ

続いて、TwiMLを返し、録音音声を取得して先のSpeech APIを呼び出すWebアプリを作成します。電話口で話した言葉をおうむ返しに読み返してくれます。

ここではpythonのBottleフレームワークを利用して、先に作成した関数も組み込んでみます。

# coding: utf-8
import sys
import os
import bottle
import requests
import urllib
import json
import commands
from bottle import route, run, post, Response, request, static_file
from twilio import twiml
from twilio.rest import TwilioRestClient

reload(sys)
sys.setdefaultencoding('utf-8')

app = bottle.default_app()
twilio_client = TwilioRestClient('TwilioのACCOUNT SID' , 'TwilioのAUTH TOKEN')

TWILIO_NUMBER = os.environ.get('(TWILIO_NUMBER)', '(Twilioで購入した電話番号)')
NGROK_BASE_URL = os.environ.get('NGROK_BASE_URL', '')

@route('/')
def index():
    """Returns standard text response to show app is working."""
    return Response("Bottle app up and running!")

@post('/twiml')
def twiml_response():
    response = twiml.Response()
    
    response.say("何か話してキーを押してください。",language="ja-jp",voice="woman")
    response.record(action="http://(サーバーのアドレス)/handlerecording",method="GET", maxLength="20", finishOnKey="0123456789*#")
    return Response(str(response))

@route('/handlerecording')
def handlerecording():

    recording_url = request.query.get('RecordingUrl')
    voice = urllib.urlopen(recording_url).read()

    ## Authorize for Bing Speech API
    token = authorize()
    txt =  speech_to_text( voice , token, lang="ja-JP", samplerate=8000, scenarios="ulm")
    
    # respond TwiML
    response = twiml.Response()
    response.say(txt,language="ja-jp",voice="woman")

    return Response(str(response))

def authorize():

    url = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"
    headers = {
        "Content-type": "application/x-www-form-urlencoded",
        "Ocp-Apim-Subscription-Key": "(API key)"
    }
    response = requests.post(url, headers=headers)
    
    if response.ok:
        _body = response.text
        return _body
    else:
        response.raise_for_status()

def speech_to_text( raw_data, token, lang="ja-JP", samplerate=8000, scenarios="ulm"):
    data = raw_data
    params = {
        "version": "3.0",
        "requestid": "b2c95ede-97eb-4c88-81e4-80f32d6aee54",
        "appid": "D4D52672-91D7-4C74-8AD8-42B1D98141A5",
        "format": "json",
        "locale": lang,
        "device.os": "Windows",
        "scenarios": scenarios,
        "instanceid": "565D69FF-E928-4B7E-87DA-9A750B96D9E3" # from Sample Bot Framework
        }

    url = "https://speech.platform.bing.com/recognize?" + urllib.urlencode(params)
    headers = {"Content-type": "audio/wav; samplerate={0}".format(samplerate),
            "Authorization": "Bearer " + token }
        
    response = requests.post(url, data=data, headers=headers)

    if response.ok:
        result = response.json()["results"][0]
        return result["lexical"]
    else:
        raise response.raise_for_status()
        
if __name__ == '__main__':
    run(host='(サーバーのアドレス)', port=80, debug=False, reloader=True)

(Twilioサーバー側の録音音声を削除する機能を入れてませんので、必要に応じて追加してみてください。)

TwiML取得URLの設定

Twilioコンソールで購入した電話番号の、TwiML取得URLを設定します。
電話番号>アクティブな電話番号>音声通話の”A CALL COMES IN”の欄を、上記のBottleアプリが動いているサーバーを指定します。

 

ここまでで作業は終了です。購入した電話番号に電話をかけて、ガイダンスに従って何かを話、任意のボタンを押すと、裏では”Bing Speech API”を呼び出してテキスト化し、それをTwiMLのSay動詞で読み上げを行います。上記のサンプルでお分かりの通り、Twilioの録音音声をそのまま読み込んで、Speech APIに渡せばテキスト化されてきます。特に変換は必要ありませんでした。

取得したテキストは何らかの処理に使えると思いますので、工夫してアプリを作ってみてください。(自分は同じMicrosoftのLUIS(language Understanding Intelligent Service)に送って意味解析をさせる事をやってみました。これについては改めて書こうと思います。)

ではでは。

Azure Passサブスクリプションが突然に無効になって胃が痛くなった件と、その対処方法

マインドテックの冨です。

週末にTwilioハッカソンに出場したのですが、その際にMicrosoft Azureの仮想サーバーを利用させていただきました。
この手のコンテストなどでは、いろいろな会社さんから自社のサービスのトライアル版などの環境をご提供いただけるのですが、Azureについては”Azure Pass”という1か月間有効の1万円分のチャージがされているクーポンのご提供を頂きました。感謝!

で、問題というのは土曜日に四苦八苦しながら開発を進めていて、日曜日に作業を再開しようとしたところ、早朝4時にAzureのアカウントが無効にされていて、管理コンソールにログインはできるものの、仮想サーバーを立ち上げる事も出来なくなったわけです。
さらに悪い事に、無効化を解除する案内も表示されるのですが、ガイドに従ってクレジットカード番号を登録するなどしていくと、最後の最後で「セッションが切れました」というエラー画面が再現しまくりです。おお、神よ・・・

「おお、土曜の作業が壊滅か・・・、今から書き直しても間に合わんなあ・・・」と棄権の予感に胃が痛くなりつつ、マイクロソフトのアテンドの方の到着を待ちわびるわけです。

そしてやっと到着!となって、管理画面を見て頂いたところで「クーポンの残高は残っているのに停止されているとか、通常ありえないですよ」と、なにげなく不穏な空気をにじませつつ、いろいろと調べて頂くも解決せず。
まあ技術エバンジェリストが課金システムの裏とかわからんよねえとか絶望感で胸いっぱい。

何だかんだ、システムからのログイン/ログアウトなどを繰り返していると、無効化解除プロセスを進める事が出来て、何とか仮想サーバーの起動に成功。そしてクーポン残高は10,000円近く残っているも、請求額が1円という不思議なコンソール画面を目撃する事になるのです。

なんだかよくわからないが、開発完了締切が迫るなか、とりあえず作業再開を優先して、課金情報の事はそのまま放置したのです。
で、後日改めてAzureのサポートに連絡。
そして理由が明らかになったのです。それは「Azure内で販売されているサードパーティー製品に対する課金は、Azure Passの対象外」という事です。つまりはMicrosoft社からさらに外部のサードパーティーに支払いが発生するものについてはAzure Passからの支払い対象とはならず、別途に支払いが発生する。そのための支払い情報(クレジットカード番号など)の登録が無い場合には、課金が発生しているが支払い方法が設定されていないアカウントという事で、支払い方法が指定されるまではロックされるというオチでした。

ちなみにAzure Passの対象外となるサービスは以下の通り

・Azure の有償サポートプラン
・サードパーティー製のソフトウェア (仮想マシンのギャラリーから選択可能な Redhat 製品など)
・Azure Marketplace で販売されている製品全般
・Azure とは別に販売されている製品 (Microsoft Azure Active Directory Premium、StorSimple など)

自分に心当たりがあったのは、仮想サーバーのOSとして最初に”Redhat Enterprise Linux(RHEL) 7″を選択したのですが、必要な環境が入れられないとわかり、即座に停止&削除。すぐにUbuntu Linuxの仮想サーバーを作成して作業をしていましたが、RHEL7を起動していたわずかの時間に1円分の課金が発生した事がわかりました。

何をどう考えても回収コストが課金額を大幅に上回る件。大変申し訳ございません。

ああ、そうと分かっていれば最初からUbuntuを選んでいたのにと思いつつ、1円を回収するのに余計にコストがかかって損だろうなあと申し訳なさが混じった、アンビバレントな気分になるわけです。

(ハッカソンの結果は、何とか締切に間に合わせてAzureで動かし、Cognitive APIを何度も呼ぶサービスデモを行ったせいか、「マイクロソフト賞」を頂きました。ありがとうございました。)

もし前世のカルマが災いして、ハッカソンなどでAzureのアカウントが理不尽に止められた場合には、ワタシと同じ目にあっている可能性がありますので、①Azureからログアウト、ブラウザ再起動でログインし直す。②Azure Pass対象外サービスを利用してしまった場合には、クレカ情報を登録する で、リカバれると思います。(クレカを持っていない人は分からん)

ではでは。

俺的Windowエディター 2016年夏

マインドテックの冨です。MacよりはWindows派です。

メインの開発はVisual Studioだったり、Linuxではemacsを使うのですが、データファイルを見たり、メモ書きなどのちょっとしたテキスト編集にはエディターソフトを使うわけです。日常生活においては利用頻度が高いので、極力使い勝手が良いものを探すため、デスクトップにはエディターのアイコンをずらっと並べていたりするのですが、何かの参考のために紹介してみようかと思います。あくまでの個人的な感想なので、反論は多々あるだろうが許せ。

私の好み

指がemacsにカスタマイズされてしまった人なので、編集画面ではemacsのキーバインディングが再現出来る事が望ましいのです。あとは起動が軽めなものが望ましい。

現在の選択

Visual Studio Code を使う事が多くなっています。

  • そこそこ高速に起動
  • 日本語のメニューに対応
  • 拡張機能で”vscode-emacs”を使うと、良い感じのemacsキーバインディング
  • ディレクトリーの階層が表示できる。複数ファイルを行き来して編集するのに便利
  • タブが使える
  • gitをサポート
  • 多種の言語サポート

他にも、いろいろな便利機能が盛り込まれていて、メモ書きからスクリプトの編集まで、いろんな用途でそつなく使えて便利です。必要な機能はExtensionsで拡張可能で、”Auto-Open Markdown Preview”とか便利。

その他

Notepad++

私の周りでは、あまり使っている人がいないのですけど、なかなか多機能エディターの名作だと思います。hostsファイル編集の時には、「管理者権限で開き直しますか?」といったダイアログが出てきて芸の細かさを感じたわけです。ソースを書く場合の便利機能も充実しており、エンコードの指定も楽で、送られてきたデータを眺める分には使い勝ってが良いです。個人的に残念なのはemacsキーバインディングがサポートされない事。

元祖emacs

個人的には、よほどのemacs原理主義者でなければお勧めしないかなーという所です。以前はcygwin入れて・・・とか動かすだけでも大変だっり、様々なFixのあたったパッケージが乱立していたのが、最近ではgnupackなど簡単にインストールできるパッケージも増えて、各段に楽になりました。

ただ起動が重いし、環境維持も大変。init.elもLinux環境と共有できるところもあって作業環境の統一という観点では良いものの、結局はWin固有の設定も増えてきて面倒に感じるようになりました。大昔の端末でemacs立ち上げて、あとは一日その環境で作業といった時代ならいざ知らず、各種機能は専用ツールを使った方が楽なので、一応インストールはしてあるのですが、起動することはほとんどないですね。

Scyphoz Notepad

軽量のUWPエディターとしては、素晴らしいエディターです。標準でEmacsキーバインディングをサポートしている所も泣かせます。機能面では非常に限定されていて、標準のメモ帳の代替としては良くて、ささっとメモを取りたい時には重宝します。

Atom

Windowsでの多機能エディターの代表になりつつあるように思えます。こちらもファンが増えてきているエディターです。クロスプラットフォームであることも素晴らしいです。個人的にはキーバインディングのプラグインの出来がいまいちだったので、だんだんと起動頻度が減っていきました。利用者も世界中にいるため痒い所に手が届くプラグインも多種多様に揃っているのですが、カスタマイズの方に走ってしまうとだんだん重くなっていくという本末転倒というか自業自得というか。

Sublime Editor

一時期大流行した「恋するエディター」ですね。ただ、Atomに食われていってしまっているかのように見えます。無料だし。

Komodo Edit

WindowsでPythonやPerlなどの環境を提供するActiveStateのエディターです。そこそこの機能で結構軽いのが好印象です。悪くないのですが、個人的にはあまり使ってないですね。

サクラエディタTeraPadEmEditor

かつて散々お世話になりました。いまでも十分使えるエディターだと思いますが、やはり古さを感じるところが多いかなと。SDIかよ・・・とか。日本語周りでトラブった時に、試しに使ってみるかというときくらいしか起動しなくなりました。

こんな感じで、いろいろと使ってみていますが、今のところ、本腰入れて書くぞという時はVisual Studio Code、ちょっとメモ書きといった時はScyphoz Notepadを使っている今日この頃です。私と似たような好みを持つ方はご参考までに。

googleカレンダーをお使いの人は、繰り返しの予定が反映されているかチェックした方がいいですよ。

マインドテックの冨です。基本的には時間は守る方ですが、心の余裕はありません。

先日、Androidのgoogleカレンダーアプリで予定をチェックしていますと、定例ミーティングとか月例のセミナーの予定が見えないなあと、ふと気づいたんですよ。あれ、この予定いれたらダブルブッキングにならないか?と疑問に思って、取りあえずPCブラウザ起動してチェックすると、確かに予定が入っているんですよ。ああ怖い。

ただ他のスポットの予定は全部見えているんですよね。新しく登録しても入るし、何が起こっているんだろうといろいろと試した所、「繰り返す」スイッチを入れた定期的な予定がダメっぽいです。

Googleカレンダーの予定

この登録画面ですが、「繰り返す」のスイッチをいれると、Android版のGoogleカレンダーでRefreshすると、表示から予定が消えました。

 

 

何か一時対策が出来ないかと思い、いろいろと試してみたのですが分かりませんでした。取りあえず、直近の予定については、PC版で繰り返し予定を、それぞれの日ごとにコピーを作り、「繰り返し」スイッチを入れない状態にしました。予定の調整とかを始めると整合とるのが大変になりそうですが、取りあえずAndroid版でも見られるようになるので、ダブルブッキング等は防げそうです。

純正アプリ以外でも怪しい・・・

この現状はGoogle謹製のカレンダーアプリのバグなのかなあと思い、サードパーティーのGoogleカレンダーと同期出来るアプリを使って回避しようと考えました。ただ残念ながら症状が再発です。まずはYahoo!カレンダー、UCカレンダーを新規でインストールしてみましたが、同様に繰り返し設定をしている予定は表示されませんでした。つまりはカレンダーAPIの方に何か問題がありそうです。困った。

既にGoogleにはフィードバックを送ってみましたので、早く対応してくれるといいなあと思いつつ、「いや、俺の所ではちゃんと動いているよ」とか言われそうで、自分の環境依存の何かである可能性も捨てきれないです。

同じ症状が出た人は、おなじようにフィードバックを送ってもらって、対応の優先度を上げてもらえるように働きかけるのがよろしいのかと。

— 7/9追記–

なぜか改善されたっぽい動きをしています。繰り返し設定をしている予定とコピーした予定が両方表示されるようになりました。上記の例で出した新規の予定登録でも、Android版側にも反映されています。これで安定してくれるといいんですけどね。