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本社に日本人デベロッパーっているのかしら?)

Android版YogabookにAndroid7が降臨

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

肩凝り対策とAndroidで業務が回るかに興味があり、Android版のYogabookを使い始めて数ヶ月。

システム更新をチェックしたらバージョン7がリリースされていたので、とりあえず何も考えずに更新してみました。

個人的に嬉しかったのは、Wunderlistがバグらずに動くようになったこと!

一瞬、おやっと思ったのがマルチウィンドウ機能が働かなくなり、調べモノをしながら書物をするのが大変になった!

と思ったが、そもそもバージョン7はOSがマルチウィンドウをサポートしているよねと思い返し、試してみたらうまくいきました。ただ、更新前は画面に3つのウィンドウを並べておけたのが、2つになったのが残念。

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に投げておいて、引継ぎ側がそれを拾いにいくという事もやっているみたいですし、リアルタイム処理に近いもののバックエンドにも使われているようで、数年前のリリース当初には想像も出来なかった定着ぶりに驚きました。

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

 

YogabookのAndroid版を買ったが、まずまずでしたよ。

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

夏が暑いと移動時にリュックサックを背負うと背中がべっとりして不快ですが、荷物が重いとしょうがないわけです。ただ、軽めの打ち合わせ程度であれば重いノートPCを持ち歩かなくてもいいよねと、Yogabookを買ってみたわけです。

Atom機はYoga Tabletを以前に買ってみたものの、Win10の重さに耐えられず、動画視聴機のようになっているわけでして、今回も迷わずにAndroid版を購入したわけです。やはり不安なのはAndroid版のアプリで業務が回るのか?という点でございますが、回らないような仕事の時はノートPCを持っていくという事で、物欲の大勝利です。

おお、思ったより悪くないじゃん

もとからスマートフォンはAndoridしか使った事がないので、アプリケーション資産は十分。メール、カレンダー、ブラウザーはGoogle謹製で。業務用のメールアドレスが多数あるので、そちらの方はOutlookにお任せです。MS OfficeソフトもAndroid版がありますので、閲覧&軽めの修正には問題ないです。(レイアウト崩れが発生するという記事を見たことありますが、少なくとも私の環境では、いまのところ見られませんでした。)Evernote、OneDrive、Slack、Skype、 Facebook Messangerなどなど、何の問題もありません。

あらら、Wunderlistが動かない

インストールから初回起動までは良い子にしていたのですが、アカウント設定が終わってからは「問題が発生したため、Wunderlistを終了します」ですよ。β版に入れ替えてもダメ。ただウィジェットは不思議と動くのですよ。MS To-Doはまだ使えるレベルでもないし、Todoistあたりに乗り換えようかとも思いましたが、移行も面倒なのでTodo管理はスマホをメインに諦めました。まあ、ウィジェット使えば閲覧も登録も出来るので、あきらめです。

ターミナルソフトどうしよう

アプリが無いわけではないのです。ただキー割り当てが特別なので、私の使い方だと、いちいちソフトウェアキーボードを呼び出す必要があったりと、不自由極まりないのがほとんどでした。さんざん試した結果、”Termius”というアプリだけが私のキー割り当てで、それなりに使える感じで、これをもっぱら愛用しています。

そんなこんなで、それなりに軽作業は出来る環境になってきました。

ああ、Freemindのファイル読めるアプリないかなあ

頭の整理、情報のまとめにマインドマップを多用しますが、PCではFreeMindを利用しています。出来上がりの表現はシンプルこの上ないのですが、サクサク動くので考えを整理するにはストレス無く使えて便利なのです。これを出先で見たい時もあるのでAndroidでも少なくとも閲覧できるとうれしいのですが、なかなか無いんですよね。

Mindlyカッコいいじゃん!

で、Android側でマインドマップを作りたい時、どうすりゃいいのと探して入れたのが、”Simple Mind Free”と”Mindly”。特に”Mindly”は画面構築のセンスがよいですね。ガシガシとメモ代わりに使うというよりは発想を広げたい時に使うのがよろしい感じ。

パフォーマンス的にはよろしいかと

Yogabookを買おうとしている方々の悩みのポイントとして、Win版を買うかAndroid版を買うかの2択でしょうか。自分も気になってまして店頭でWin版を触った所、結構サクサク動くので、よく見る不評は何なのだろうと疑問だったわけです。ただ、Office系の重たいアプリを使ったり、PCと同等くらいにしようとすると各種のドライバー/常駐アプリを入れ出すと、メモリーも多くないし劣化するんだろうなあと思いました。うちのYoga Tabletがそうですし。

Android版は店頭では触れなかったので、ある意味ばくちではあったのですが、使ってみれば「大画面の早いCPU積んだスマホ」と思ってもらえれば間違いないかと。Android向けのアプリは遜色なく動作しますし、3Dバリバリのゲームを入れても、さほどカクカクせずに遊べました。

ただアプリの中には縦長スクリーンを前提にしているものがありまして、それらを使うのは厳しいものがあります。(まあ、持ち変えれば使えなくはないのですけどね。)

キーボードは少しツライ

Yogabookのヘンタイ性が存分に発露されているのは、このキーボード。是々非々あるようですが、私には「打てなくはないが、ちょっとツライ」といった感覚です。IMEの切り替えが分かりにくいなあとか、”-”のキーが小さいのでミスが多くなりがちとか。完全なブラインドタッチで入力するには厳しいですが、キーをチラ見しながらであれば、そこそこ速く入力できます。入力の手癖を学習して補正してくれるらしいですが、あまり恩恵を感じた事がありません。頻繁にミスタッチします(涙 元も子もありませんが、薄い携帯キーボードが欲しくなりました。

当然、打鍵感は無いわけですが、振動でフィードバックがあります。この設定をOFFにすると無音で打てるのですよね。カンファレンスなどでも打鍵音のマナーを気にしなくて良くなるのは、ちょっとしたメリットではあります。

カバーはいまいち。購入時に注意

やはり保護のためにカバーは欲しくなるわけで、写真のようなカバーをAmazonでぽちったわけです。結果的には使ってません(涙

重量バランスが悪くなり、スクリーンが後ろに倒れこむ=キーボードが浮く方向に力が加わるのですね。あと折り曲げが出来なくなるのでタブレットとして使うのにカバーを外す必要が出てきます。結局はカバーを外し、カバンの中で擦れないようにタブレットの保護袋を購入しました。その方が自分には使い勝手が良かったです。PC代わりのみで使うのであれば良いのかもしれませんが、そういう方はYogabook以外の小型PCを買った方が幸せになれます。たぶん。

ペンは使わないなあ・・・

Yogabookのウリの一つとして、手書きのメモをそのままデジタルに取り込めるというのがあります。確かに機能として使ってみれば「おお、すげー」となるのですが、実戦で使うシーンがあまり無いんですよね。メモならキーボードで打ちますし、急ぎの手書きメモなら指でスクリーンに書ける。私には使い道がありませんでした。残念。

全体的には良い製品だと思いますよ

打ち合わせのお供などには十分な機能です。電池の日中の外出分程度であれば申し分ないですし、危なくなったらモバイルバッテリーが使える強みがあります。タッチ操作で使えるアプリもAndroid版の方がこなれています。(Winだと、ウィンドウの移動やサイズ変更などで、どうしてもマウスが欲しくなる。)

コード書いたりサーバー操作をするには、キーボードがツライので、軽作業向けに徹するか、別途に薄型Bluetoothキーボードを買った方が幸せになれるでしょう。(そこまでするなら、普通の小型PC買った方がよいでしょう。)

メリット/デメリットいろいろありますが、大きな心で温かく包んであげられる方であれば、このヘンタイ端末は買いかなと思います。

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対象外サービスを利用してしまった場合には、クレカ情報を登録する で、リカバれると思います。(クレカを持っていない人は分からん)

ではでは。

UCカードの”永久不滅プラス”でアクセス履歴情報の提供先にNHN Entertainmentさんが加わっていた。

マインドテックの冨です。デフレ日本では安さは正義です。

Amazonで買い物をする際に、そういえば”永久不滅.com”経由で行くとポイントが若干増えるんだったなとサイトにログイン。
プライム会員でもあるので、そこそこAmazonの利用頻度があるわけですが、いちいち”永久不滅”経由も面倒だなと、履歴情報取られるけど「永久不滅プラス」というツールバーサービスをブラウザに仕込むと、提携ECサイト訪問時にアラートが出るのでクリックすればOKなんだよなと思い出して、チェックしにいったんですね。

セキュリティー関連のニュースに詳しい方であればご存じの、2012年に炎上したツールバー事案です。ツールバーをインストールすると問答無用でWebアクセス履歴がモニターされる事が大問題になった一件です。
今でこそ、ブラウザ-サーバー間通信でセキュリティー面で重要なデータはPOSTメソッド(ブラウザのURLにはのらない)で行うようになってきましたが、以前は検索文字列や認証用のIDなど、多くの情報がURLに載っていました。いずれにせよブラウザ本体からデータを送る事になるため、途中の通信傍受とも無関係で通信暗号化とか関係なく、閲覧しているサイトによりますが、かなりクリティカルな情報が送信されるリスクがあります。
(この手のログデータを見たことがありますが、かなり危険ですね。アダルトサイトを閲覧した記録(笑)などはカワイイ方で、ECサイトでの購買情報、会社内のイントラサーバーへのアクセス記録、検索文字列をつなぎ合わせると個人特定に近いレベルでのアブナイ情報が送信されている事もあります。ご注意を。)

さて、”永久不滅プラス”もいろいろと機能アップしているのねと概要を読みつつ、利用規約をチェックしていると、おやっと思い。
ヴァリューズ社に加えて、NHN Entertainment コーポレーションさんにもデータを流しているではありませんか。リンクを踏んでみると、いきなりハングル文字のサイトが登場です。おおっと。

「妖怪ウォッチ ぷにぷに」や「ディズニーツムツム」を運営するNHN PlayArtさんと兄弟会社(でいいのか?)で、Naverさんの流れを組む有名な会社と存じますが、ここにもデータが流れているとは驚きでした。

ヴァリューズさんはネットマーケティングの会社で、この手のデータは欲しがるよねと分かります。
ログ分析サービス”VALUES eMark+”の元ネタとして利用しているのでしょう。SimilarWebのようなサービスを提供しているわけですね。

さて、NHN Entertainmentさんは、このアクセス履歴データをどう使うんでしょうか。
利用規約から該当箇所を抜粋してみます。

第4条(クレディセゾンからNHN Entertainmentに対する情報の提供等)

(1)当社は、会員の限定モニタ契約が有効である期間中、下記の情報(それらを総称して以下「提供情報」といいます)を、NHN Entertainment コーポレーション(会社URL:http://www.nhnent.com。以下「NHN Entertainment」といいます)に提供します。NHN Entertainmentは、オンラインゲームを含むインターネット事業に関する新サービスの開発、並びに自らの子会社が提供する、インターネット検索及びオンラインゲームを含むインターネット事業に関する既存サービスの改善のため、提供情報を所定の保護措置を講じた上で保有・利用します。
①履歴情報(属性情報を除きます)
②基本情報
③会員ごとに当社が割り当てる会員の識別記号
(2)収集停止以降、当社は、(1)の提供を停止します。
(3)当社は、提供情報を、個人を特定できる形式でNHN Entertainmentに提供することはありません。

スマホゲーム屋さんが、Webブラウザのアクセス履歴情報をどのように使っているのか存じ上げませんし、日本でのマーケティング利用であれば”LINE株式会社”であれば、まだ自然かなとも思うのですが、なにゆえに”Entertainment社”名義で取得しているんでしょうかね。

特に非があるわけでもありませんし、落ち度を責め立てたいわけでもないのですが、漠然とした気味悪さを感じつつ、そっとインストールページを閉じました。
Google AnalyticsのようなWebビーコンであれば送信される情報も限定的ですが、ブラウザプラグインの場合ですと、よほどデータ送信先に信頼性を感じられないと、とてもじゃないですが、個人的には利用する気にならないですね。

ディスク故障で作業中ファイルが無くなって泣く前に、Windowsで自動でバックアップを取る方法

マインドテックの冨です。石橋は叩きすぎて壊す派です。

最近、私の周りでHDD故障でファイルを無くして涙目になる人が数人でまして、まあ、いろいろと大変なわけです。
小さいころからの子供の写真のアーカイブなどもありまして、心情的にはなかなか苦しいものもあるわけですが、ディスク故障時のサルベージを依頼すると2桁万円の見積が飛んでくるわけです。どうしても業務上で「このファイルが無いと絶対にヤバい!」といった状況でしか、頼みにくい金額になっております。

「備えあって憂いなし」とはよく言ったものですが、往々にして事前に「備える」事は後回しになりがちですが、忘れぬうちにバックアップの設定をしておきましょう。

バックアップのメディア

HDDが死んでPCも起動しなくなったようなケースで、HDDを入れ替えてPCそのものをリカバリーするようなレベル感でのバックアップもありますが、ここではデータだけは守れればよくて、パソコンは別途に用意&アプリも再インストールなどをするといった割り切りをしている前提でいます。

当然ですが、今、作業で使っているHDD/SSDとは物理的に別のメディアに移さないと意味がないわけです。
どんなメディアを使うかですがDVD-Rなどの円盤ですと、容量が1桁GBなので、最近のアプリケーションのファイルサイズを考えると、もはや足りないわけです。また「バックアップ対象フォルダーを指定して、*-Rに焼く」という作業そのものが面倒なので、日常的なバックアップの用途には向いていないと思います。
SDカードなどのメモリーカードは、バックアップ対象の容量が巨大でなければ使えると思います。

ワタシの場合は、ローカルのHDDの作業用フォルダをUSBの外付けHDDとクラウドストレージの2つに同期コピーをしています。
クラウドストレージに関しては、Dropbox, Google Drive, Microsoft OneDrive, Boxなど、無料のアカウントでも数GB使えるものがありますから、ちょっとしたファイルの保存では便利に使えるでしょう。ビジネス用途ではMS Office365はお勧めです。コースによりますが1500円程度の費用でOfficeアプリの他にOneDriveの1TB利用権がついてくるのです。それぞれ容量と予算の兼ね合いで選択されればよいかと思います。数GBレベルでは無料でバックアップが出来るでしょう。

またHDDも容量単価の面では優れていますし、なにより容量が稼げます。最近は数TBで1万円前後ですから、これを使わない手はないわけです。(クラウドストレージの突然のサービス停止のリスクヘッジの意味もあります。)

もう一つ重要な観点は、メディアの寿命です。DVD-Rの光学円盤は10数年~といった記事もよく見かけますが、自分の経験では10年持たない感じがします。早いと2~3年で読み取りエラーを起こすDVD-Rなどもありました。書き込み先のメディアの品質や保存状況にもよるのだと思いますが、あまり長期保存には向いていない印象があります。また最近多く売られているUSBメモリーやメモリーカードですが、10数枚使った経験では、こちらも寿命が意外と短く、2~3年で読み取りエラーを起こすものが出てきています。デジカメもフィルム替わりにSDカードをそのまま保存している人も、しばしば聞きますが、古いものは注意した方がよろしいかと。どちらも一時的な保存には良いですが、長期保存の用途には信用できないというのが個人的な感想です。

外付けHDDのドライブ名の固定

外付けUSBドライブを使う場合、再起動のタイミングや脱着によりドライブ名が変わる事があります。例えばD: で認識していたのがE: に変わってしまうなどです。これだと設定によってはバックアップ先のドライブが見つからなくなるといった事故が起こるため、ドライブ名を固定しておいた方が良いです。

Win10では、Windowsキー+X で表示されるメニューリストから「ディスクの管理」を選択。
以前のOSでは[スタート]→[設定]→[コントロールパネル]→[管理ツール]→[コンピュータの管理]で、同じく「ディスクの管理」を選択します。

ボリューム欄に表示されている外付けドライブ名を右クリック → [ドライブ文字とパスの変更] → [変更]
この画面で「次のドライブ文字を割り当てる」のプルダウンで、ドライブ名を選択します。(個人的には、分かりやすいように”Z:”といった最後の方の文字から使っています。)

ドライブ名固定

このようにしておくとUSBドライブを抜き差ししても、ドライブ名は変わらないので、設定により「バックアップが取得できなくなった」という事故は避けられます。

Windowsの機能でのバックアップ

Windowsにも独自のバックアップのための設定が用意されています。
Windows10の場合には、[設定] → [更新とセキュリティ] → [バックアップ]
で画面が出てきます。
Windows10のバックアップ画面
ここで「ファイルのバックアップを自動的に実行」スイッチをオンにして、[その他のオプション]から実行間隔、保存期間、バックアップ対象のフォルダーの選択などを行えます。

また[バックアップと復元(Windows7)]もあり、旧来のバックアップツールの利用もできます。
それぞれ設定の詳細については、ヘルプ等を参照してください。

robocopyコマンドでのバックアップ

前述のWindowsのツールでのバックアップでも良いのですが、個人的な好き嫌いでは、オリジナルのファイルがそのまま参照できた方が、安心感が高いので好みですし、トラブルの際にはすぐに別のPCにつなぎ直して作業が継続できる方が好みです。(バックアップ全体を別のディスクにリストアしてからとなると、場合によっては数時間かかるので締め切り近くの作業中ではパニックになるので。)

このため作業用のファイルが格納されているフォルダを、そのまま外付けドライブなどにミラーリングする方法をご紹介します。
世の中にはミラーリングのためのツールも多数ありますが、ここではWindowsが提供しているrobocopyコマンドを利用してます。

1. バッチファイルの作成

まずはミラーリングを行うためのバッチファイルを作成します。ここではOneDriveのローカルの保存先を外付けドライブにミラーリングする想定とします。
ローカルの適当な場所にMirrorOneDrive.batというファイルを作成します。(名前はなんでもよいですが、拡張子は .bat とします。)
MirrorOneDrive.batには、例えば次のような感じでrobocopyのコマンドを書きます。

robocopy "コピー元フォルダ" "コピー先フォルダ" /mir /XF .*

/mir はミラーリングを行うスイッチで、/XFはミラーリングの除外対象となるファイルを指定します。
例えば、具体的には次のようになります。

robocopy "C:\Users\tomi\OneDrive" "Z:\OneDrive" /mir /XF .*

バッチファイルをダブルクリックして実行すると、フォルダのミラーリングが行われる事を確認してください。(上記の例の場合には Z:\OneDriveにファイルがコピーされているはずです。)

2. タスクスケジューラによる自動実行の設定

次にミラーリングのバッチファイルを定期的に自動実行させますが、これにはタスクスケジューラを使います。
[コントロールパネル] → [システムとセキュリティ] → [管理ツール] → [タスクのスケジュール]
で、タスクスケジューラが呼び出せます。(Win10でcortanaが設定されていれば、検索窓に”タスク”と入力するとリンクが表示されます)

右側の[タスクの作成]をクリック。

全般タブ
・名称は適当に。ここでは”OneDriveのバックアップ”
・[ユーザーがログオンしているかどうかにかかわらず実行する]をON (バックエンドで実行されるようになります。)
・[表示しない]をON

全般設定

トリガータブ
・ミラーリングのバッチファイルを起動する条件を指定します。
・新規をクリックして、実行させたい周期を指定します。(以下の例の場合は毎日1時間ごとにミラーリングを実行します。)
・[有効]はON
トリガーの編集

操作タブ
・動かすバッチファイルを指定します。
・[操作]は[プログラムの開始]
・[プログラム/スクリプト]は、MirrorOneDrive.bat(またはご自身のバッチファイル)のパス
操作タブ

ここまで指定して[OK]をクリックすると、スケジューラに登録されます。

ミラー元に新しくファイルを置いて、スケジューラの指定時刻にミラー先にコピーされる事を確認してください。

ここまでで設定は終わりです。ミラーリングのバッチが動いていれば、少なくとも最後にミラーしたタイミングのファイルはミラー先に残っているはずです。ファイルをそのままコピーしているので、万一、PCのHDDが壊れたとしても外付けHDDを別のPCにつなぎ直せば、すぐにバックアップしたファイルにアクセスできます。

ここまで、取りあえず外付けディスクやメモリーカードがあれば、Windowsに用意されているcobocopyコマンドを利用して、ファイルのミラーリングを自動で行う設定のご紹介をしました。涙目になる前にお試しください。

俺的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版側にも反映されています。これで安定してくれるといいんですけどね。