技術・開発

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

 

 

 

 

新しいOneDriveクライアントに仕事用のアカウントを追加する方法

マインドテックの冨です。報道を見ていると九州の地震の話題で持ち切りです。いまだに余震も続いているようですが、早く落ち着いてもらいたいものですね。

前の記事で、以前からOffice365 ProPlusを利用しているにも関わらず、OneDrive for Businessが利用できなかった私のようなかわいそうな人のために、設定上のチェック項目を指摘しました。(そもそも当時はSkyDriveという名前だった)

その際にMicrosoftのサポートの方から教わった新しいOneDriveクライアントのネタです。利用しているバージョンは2015(ビルド17.3.6381.0405)です。OSは今をときめくWin10(64bit)です。

OneDriveのバージョン

“OneDrive for Business”を利用できなかったがOneDriveは使いたかったので、hotmail.comなどで登録した個人用のアカウントで無料の枠内でOfficeに登録していました。

個人用のOneDrive

これにもう一つ法人用の”for Business”のアカウントを登録することが出来ます。

OneDriveのアイコンを右クリック>設定>アカウント

で上の図のような設定画面が表示されます。ここで「アカウントを追加」欄の「仕事用アカウントを追加(B)」をクリック。続く画面でOffice365で利用しているアカウントで認証してください。

 

すると、次のように個人用と法人用の2つのアイコンが表示されます。青い方が”OneDrive for Business”で登録されているものですね。

OneDriveのアイコン

こちらも同様にアカウントの画面を出すと次の通り

法人用OneDrive

上部のアカウント欄の名義が変わっている事にご注意。こんな感じで2つの個人用と法人用のアカウントを管理できるようになります。ローカルでは2つの同期フォルダは別にすることが出来て、これを変更する場合にはいったんリンク解除する必要があるとの事です。

マシンによってはOneDrive中の一部のフォルダだけ同期がとれていればよいケースもありますが、この場合には「フォルダーの選択」ボタンをクリックして表示された画面にて、同期対象のフォルダーにスイッチを入れていきます。

最近Dropboxでもクライアントの改良があり、共同作業がやりやすくなりましたが、OneDriveも徐々に使い易くなればいいなと思います。

Office365 ProPlusを使っていて、OneDrive for Businessが使えない場合のチェックポイント

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

2014年の秋にMicrosoftが太っ腹の発表をされたのを覚えておいででしょうか。OneDriveの容量無制限ですよ。わたしは心ときめいておりました。

Office 365 ProPlus ユーザーへの OneDrive for Business の提供に関する詳細を発表

https://blogs.technet.microsoft.com/microsoft_office_/2014/11/20/announcing-details-onedrive-business-availability-office-365-proplus-customers/

で、ProPlusユーザーには段階的にOneDriveを開放するという事で、待ち焦がれていたのですが、なかなかその時が来なかったのですよ。業を煮やしてサポセンにコールしたら「あなたの使っているProPlusのライセンスはOneDriveの利用対象外かもしれない。でもUSの発表以上の情報はないよん。」という事で、なんだかよくわからないまま月日は流れていきました。

そうこうしているうちにOneDriveの容量無制限も見直しが入り、Office365のライセンス体系も変わり、なんだかモヤモヤしながらも、私のOffice365の画面にOneDriveアイコンが来ることはなかったのです。ていうか、そもそも”OneDrive for Business”の存在自体を忘れていました。

でですね、ひょんなことから製品ページをみたんですよ。いつの間にか、しっかり提供サービスに入っているじゃないのさと。

Office 365 ProPlus

https://products.office.com/ja-jp/business/office-365-proplus-business-software

私の中の何かがはじけて、MSのサポセンにコール。有効にする手順を教わりました。

  1. Office365の管理画面を開く
  2. ユーザー>アクティブなユーザー>対象ユーザーの右のスイッチON
  3. 画面右にユーザー情報の枠が表示される。「割り当て済みのライセンス」の下「編集」をクリック
  4. “Office 365 ProPlus”の右側の下向き矢印をクリック

ライセンスの割り当て

 

すると、以下のように展開されます。この”OneDrive for Business”のスイッチが入っていなければ入れる!

ライセンスの割り当て

あとはサーバー側で準備が整えば(私の場合に数分かかった)、指定したアカウントのOffice365のページでOneDriveのアイコンが表示されました。(もう・・・最初からスイッチONにしてくれればいいのに・・・)

あと、サポートの方から教わったのは、OneDrive for Business 同期クライアントの新しい版がリリースされたとの事です。個人用のOneDriveのアカウントに加えて、OneDrive for Business用のアカウントの追加もできました。詳細は下記のページをご覧ください。

https://support.office.com/ja-jp/article/7af500d9-a18e-4abb-8450-b94f4e52c1a0

肝心の容量ですが、先にマイクロソフト社から発表が合った通りで(無制限ではなく)1TBでした。

絶望の炎上プロジェクトを救い出す考え方

マインドテックの冨です。いやあ、お前が言うなというタイトルですけどね(汗

最近も某炎上プロジェクトの現場にヘルプに出かけ、久々に業火の黒煙の香りに懐かしさを覚えました。
自身も散々プロジェクトを燃え盛る炎の中に叩き込んでは屍の山を築き上げた経験が多数ありますので、名PMからはほど遠く、あまり人の事を言えた立場でもないのですが、逆に経験者ゆえに学んだ事も多いなあと感じています。

炎上する過程に関しては、PMの経験不足によるものや、リソース等の内的・外的環境による制約、顧客との関係性など多種多様の要因があるわけで、防止・対策については多くの要因を振り返る必要があります。

ただ、現実に燃え盛っているプロジェクトの火消しを行う際に、鎮火のためには2つの事を決めるのが必須と考えます。
(1) プロジェクトのゴールの設定
(2) 現実に達成可能な工程への見直し

「いや、それ当たり前でしょ」という声が聞こえてきそうですが、燃えているプロジェクトでは徹底出来ていないのです。直近でヘルプに入ったところもゴール設定が曖昧で作業量が見積もれませんでしたし、完成までにあと何が必要というのが見えないので、ひたすら目の前の作業を深夜残業・徹夜・休日出勤でつぶしていたわけです。当然、担当者も疲弊して離脱者も出ていたようでした。

(1) プロジェクトのゴールの設定

これは最重要です。何をもって完成品とし、作らなければいけない制作物、準備をしなければいけない事、完了させておかなければならない作業など、プロジェクトのゴールを決める必要があります。これが決まらないと、どんな作業が残っていて、そのボリュームはどの程度という評価が出来ないのです。プロジェクトを遂行するメンバーにしても、作業の達成基準が明確でないと、ひたすらゴールの見えないマラソンを走り続けるようなもので、心身ともに大きなストレスを受けます。最悪の場合にはプロジェクトからの離脱も発生して状況が悪化します。

不幸なことに、お客さん側からのリクエスト(追加のリクエスト、認識してなかった要件の顕在化など)により、ゴールが動くことがままあります。それでも当初のゴールが決まっていないと、「ゴールが動いた/動かした」ことが共通認識として持てなくなります。つまり、締め切り日の変更や追加費用の請求などを行う根拠が無くなる事を意味しますので、PMとしてはクリティカルな問題です。

(2) 現実に達成可能な工程への見直し

これも、締め切りのスケジュールやマイルストーンから逆算して、この時期にはここまで出来ていなければならないという「べき」論でプロジェクト計画がなされる場合があります。プロジェクト当初の計画立案の段階では良いのですが、炎上している状況では見直す必要があります。つまり、プロジェクトで確保している人的・物的リソースやスキルレベル、健康状態、その他もろもろの事情を考慮して、(a)残りの作業項目の一覧 (b) 担当者の割り当て (c) スケジュールの調整 を行います。

(a)は一覧の作業が全て遂行されたら(1)のゴールが達成できるように、すべて網羅され、かつ具体的なものでなければなりません。当然、各作業に要するスケジュールも見積れる必要があります。(そうでないとスケジュールが組めません)

(b) は一覧化された各作業を遂行するために必要なスキルを持つ人員を割り当てます。スキル的にチャレンジ要素を含むものには極力割り当てない方が良いです。人が足りない場合も出てくると思いますが、その際には(a)に戻って作業を減らす(それに伴い、最終ゴールを調整する。品質を落とすなどの調整も必要)か、新たに調達してくる手はずを整える事になります。ただし単純作業を除いて新規のメンバー調達は避けるべきでしょう。新メンバーへの作業内容の説明の教育や作業管理のコストは、特に要する時間を考えると大きいとみるべきです。

(c) は(a)の各作業を締め切り日に向かって調整していくわけですが、この時期にはこれが終わっていなければならないといった理想論からスケジュールを決めてはいけません。現実的に達成できる基準で設定する必要があります。(また、可能であればトラブル発生時のリスクヘッジの日程も含めるべきです)

スケジュール調整を行っていくと、どうしても締め切りに間に合いそうに無いという局面が現れます。この場合には締め切り日の調整などを含めた交渉に入る必要が出てきます。最悪の場合には訴訟をちらつかされる場合もありますが、(a)~(c)の調整後ではリソースの都合などで「出来ないものは出来ない」ので「べき」論でいうスケジュール要求は飲まずに、現実的に達成できるレベルを基にして、ビジネス的な落としどころを探るべきです。炎上プロジェクトでは現場PMの決裁権を越える調整が必要な場合もありますので、鎮火のために速やかに上席者の同席を求めるなどの対応が必要です。

現実的に達成できることを基準にプロジェクトを見直すこと

炎上プロジェクトと一言で言っても、いろいろな背景・局面があるので、対応の方針については一概に言い切れないのですが、少なくとも現場の作業遂行担当者にとっては、自分のやるべき作業内容・成果物が定義されていること。それが自分が遂行できそうだと確信できること。指定の期限で作業がこなせそうなこと。これらが揃って心的な負担が軽くなり、モチベーションも生まれます。引き続きハードワークが必要だとしてもゴールが見える事でずいぶんと違ってきます。

一番のプレッシャーは、お客さんとのスケジュールを含めた事前合意を変更しなければいけない事だと思います。契約や「すでにリリース日程を告知して、メディアにも発表したし、予約も入ってきている」などの厳しい外部要因がある場合もあります。ただ、現実問題として出来なそうな事については、そのままにするとお客様も不幸になるので、一緒にプロジェクトの着地点や、残りの日程のプロジェクトの運営を探る動きに入るべきです。「それはお宅の責任でしょ。ちゃんと期限内にやれるやり方を考えて持ってきなさい」とお客様に詰められる場合も多いわけですが、それが出来ない見込みなので相談に行くわけでして、事前にいろいろと着地点のオプションや話の進め方を考えて臨んでください。

 

とか書いていて、いろいろな悪い思い出が頭をよぎりました・・・(汗

基幹系のクラウド利用は、まだまだ道のりが遠いと感じたこの頃

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

Webを使ったSaas/ASPの開発運営やWebマーケティング関連に携わってきたことから、今まで、データ分析やWeb系の開発者との接点が多かったのですが、ここ最近になっていわゆる基幹系やインフラ系の方々とお話することが増えました。そして驚いた事が、結構な割合で”AWS”をご存じないという事。

AWS Summitでの展示や各種の勉強会などでも、データのクラウド連携とかオンプレ&クラウド連携など、基盤をどのようにクラウド化、またはクラウドと連携していくかのソリューションの発表を多く目にしていたので、それなりには進んでいるんだろうなあという印象を持っていたんです。

ところが、いろいろとお話を伺ってみると”AWSを触ったことが無い”ではなくて”AWSって何?”ということなんですね。”ECサイトのAmazon社が提供しているクラウドサービス”なんですよと説明をすると、ああ、なるほどねと納得いただけるんですが、AzureやSoftlayerなどは言わんやおやだったりします。

“クラウド”という言葉にはさすがに反応されるんですが、その具体的なプレイヤーやサービスに関してはご存じなく、”レンタルサーバーみたいなもんでしょ”という理解に留まっている感じでした。

つまり、開発・運用を行うようなIT企業であっても、「クラウドはうちの仕事じゃない」と認識されている会社がまだまだ多数あり、具体的なサービス内容も知られていないという事なんですね。これは自分にも意外でした。同様に著名なOSSの製品に関して話を振ってみてもご存じないという反応でして、バックエンド系は昔ながらのやり方がまだまだ根強いのだと感じました。

もちろん、これが単純に悪いという話でもないですし、さらには早々にASP/SaaSの導入、開発、運用を手掛けられている会社も多いのは知っていますが、ユーザー企業側も開発・運用側も、もっと効率的な開発・運用手法が全然取り入れられていないんじゃないかと危惧しました。レガシーをレガシーのまま、安定して運用し続け、リスク要因を極力排除するという方向感が、新しいもの・ことを選択肢から外すという行動につながっているのかなと思いました。
往々にしてレガシー系はパンドラの箱であったりするので、移行は容易でないのは理解できるのですが、モダンな手法や考え方を取り入れる事で業務改善につながる現場も多いと思います。

怒涛の攻めを見せるMicrosoft社のデータ分析ツール

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

3月末のカンファレンス”Build 2016″で、Ubuntu Linuxの環境をWindowsネイティブで稼働させたり、従来のPowerShellに加えてLinuxの事実上の標準のシェルbashを利用できるようにするなどの発表を行いました。今年の夏の予定とのことですが、これはすごい事ですね。まあMac使いの人には今までできているけど何か?とか言われそうですけど。

それにしても昨年から今年にかけてのMicrosoftの攻勢は圧巻だなあと思う次第なのです。OS+Office屋さんから、改めてクラウドやデータ分析などのビジネスのメインストリームに食い込んできています。クラウドでは先行するAmazonに一日の長がありますが、それでもAzureの充実ぶりを見るとよくぞここまでという感があります。

以前、Excelを持っているMicrosoftが本気でデータ分析の領域に突っ込んで来たら、分析領域のツール開発ベンチャーが軒並み吹き飛ばされるんじゃないかと思っていましたが、なんとなくそんな雰囲気も改めて感じています。まあ、TableauやQlikViewなどが持っているシェアをひっくり返すには相当時間がかかると思いますけど。

そんなわけで、Microsoft社が提供しているデータ分析関連の主なツールをまとめてみました。(「アレが入ってない」とか見落としがあるかと思いますがご容赦を)

(1) Excel

Wordとならび、ほぼすべてのPCにインストールされているのではというくらいに普及している表計算ソフト。単純な集計の他にもソルバー機能やピボットテーブルも使える。予測もできる万能ツール。UI面でちょっとしんどい事を除けば、機能的にはたいていのことは対応できる。少なくとも中小企業のレベルではデータ分析の専用ツールを買う前に、Excelの機能をしゃぶりつくす位でちょうどよいくらい。(アルゴリズム的にいろいろある話も聞きますが、そういう業務の方は専用ツールを買うべき)

(2) Power Pivotアドイン for Excel

https://support.office.com/ja-jp/article/PowerPivot-%E3%82%A2%E3%83%89%E3%82%A4%E3%83%B3-a9c2c6e2-cc49-4976-a7d7-40896795d045
Excel2010から利用できるようになったピボットのプラグイン。ノーマルのExcelを越えて大量データの集計処理が可能になる。これもあまり使っている人をみかけないが勿体ない。(ついでにPowerViewも)一般的なビジネスデータの分析であれば、ここまでで大抵は何とかなる。

(3) PowerBI

https://powerbi.microsoft.com/ja-jp/
ビジュアライゼーションやレポートのためのダッシュボードのサービスであるが、驚くことに無料!これもあまり利用されていませんが、もっと知られて良いサービスだと思いますよ。

(4) Microsoft R Server

https://www.microsoft.com/en-us/server-cloud/products/r-server/
2015年4月に買収したRevolution Analyticsが提供していたディストリビューション。R言語はデータ分析界隈では有名ですが、MS社が買収した時は驚きをもって迎えられました。今後、いろいろな製品・サービスと連携していくと思われますので非常に楽しみです。

(5) Microsoft Azure HDInsight

https://azure.microsoft.com/ja-jp/services/hdinsight/
HadoopファミリーのSaaSサービス(素のHadoopの他にも、Pig/Hive, HBase, Storm, Sparkなど)

(6) Microsoft Azure Machine Learning

https://azure.microsoft.com/ja-jp/services/machine-learning/
cortana Intelligence suiteとして提供されている機械学習のプラットフォーム

こうしてみるとデスクトップからクラウドまで、そつなく網をかけにきています。しかも独自サービスのみならず、RやHadoopファミリーなどの業界標準までもカバーしてきており、ユーザー/開発者側への歩み寄りも見て取れます。

AI/人工知能の領域ではWatsonを有するIBM社の存在感も大きいですが、AWS, GCPとならんでのクラウド業者としての位置づけや、Officeツール領域では依然として大きなシェアを持っていることから、2016年の動向も興味深いです。

WinXPなどの古いPCを使い続けるリスク

マインドテックの冨です。東京では桜が一気に開花したなと思ったら雨。花散らしの雨にならないといいのですが。

最近、お客さんから開発やIT設備導入に関するの相談を受ける際に、すごく気になるのですが、現場で古いWinXP機やWindowsサーバーが現役で動いているんですね。それで独自開発した業務アプリケーションが保守されなくなってどうしようかとか、データ処理ソフトが最新フォーマット対応のアップデートができなくなって困ったとか。

この場合のリスクは大きく2つあります。

  1. 古いOSのセキュリティーアップデートが受けられない
  2. ハードウェア(特にハードディスク)の故障によるデータ損失
セキュリティーアップデートが受けられない

1については言うまでもないでしょう。ネットにもつながず、外部とのファイルの受け渡しも行わない(SDカードやUSBメモリなどを経由してもダメですよ!)完全なクローズド環境であれば情報漏えいのリスクは無いですが、大抵の場合はそんなこともないですし、特にサーバー機の場合には何らかの形でデータの送受信が行われるのが前提です。

「インターネットにつなげていないから大丈夫」といってもLANに接続されていれば、LAN内の他のPCがウィルス感染すると、LAN経由で感染することがあります。サポート切れOSに対してはセキュリティーソフトもサポートを停止する可能性が高いので、守る手段がなくなるのですよね。

ハードウェアがヘタる

2も発生した場合のダメージは大きいです。「ある日突然PCが起動しなくなった」「作業中にPCが突然落ちるようになった」などが典型です。特にHDDは稼働部品が多い消耗品です。データのバックアップさえ取れていれば、最悪の場合でもXP機であれば中古で調達できますが、それもあと数年の事でしょう。延命できるうちにリプレイスを行うべきです。

なんでリプレイス出来ないの?

お話をうかがっていると、ほぼ全ての場合で「予算」理由なんですね。無い袖は振れないと申しますか、どうしても現状で使えるものであれば、「入れ替えなくてもいいじゃん」と優先順位を落とす傾向があります。

中小ですとカツカツの資金で回している所も多いので、さすがに借金してでもリプレイスしろとも言えないわけですが、いろいろなリスクとのバランスをとる事となります。「年賀状の住所を保管している」程度であればダメージ少ないですが、日々の出納、受発注などを行っているような「PCが止まれば業務も止まる」レベルのものであれば、借金してでも入れ替えろと言いたい局面もあるんですけどね。


それでも使うならリスクヘッジを

継続利用を勧めるわけではありませんが、それでも使い続けるというのなら、最悪の事態に備えてリスクヘッジをする必要があります。(「電源が入らない」「起動しても固まる」と電話いただいても打てる手は限られるんですよ)

①なにはともあれデータのバックアップ

これは絶対!代替機が調達できれば復旧できます。もちろんアプリケーションのメディアやシリアル番号なども揃っていることを確認してくださいね。ここに至って同型機が調達できる見込みは薄いと思われますので、システム全体のバックアップをとってもリストアできるハードが無い可能性もありますが、最低限、アプリが出力したデータファイルや作成したドキュメントファイルなど、CD-R、USBメモリなど何でもいいから保存!保存!

②できれば予備機の調達

アプリが新しいOSに対応できない場合、XPなどが動く環境を用意しておく必要があります。最近はアキバの中古屋で1~2万といった機体も見かけますので、調達しておけば吉です。

③オフラインでの利用

インターネットにつなげるとかはもってのほか。出来ればLANとも切り離すべきです。(その昔、LAN経由でウィルスのピンポン感染があって大変だったんですよ・・・)

④データ復旧屋の連絡先をおさえる

最悪の中の最悪の場合、ハードディスクからのデータ救出を行わないといけない局面も出てくる可能性があります。そのような場合の連絡先やサービス内容、費用などを確認しておいてください。(ただ、このお金が出せるならPC買っとけよと思うのですが。)

いろいろと事前の用意が出来ていて分かる人がいるなら半日もあれば、業務復旧は出来ると思いますが、そうでなければダウン時の復旧に要する人件費やら業務が止まる日数やら、もろもろリスクと隣り合わせになりますので、その辺も考慮の上、予算の立案やリスクヘッジを行っていただければ幸いです。

もちろん、新しいPC利用の場合でもバックアップは必要ですよ。