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

 

 

 

 

TODO/備忘録用のリスト作成の勧め

マインドテックの冨です。物覚えは良い方ではないですが、貸したお金は覚えています。

日々のスケジュールは作成している人は多いかと思います。ただ、いろいろな知人に話を聞いている限りでは、具体的にやらなければならない事をリストを作って管理している人は、思ったよりは少ないかな感じました。たとえば、「今日はこれをやる」「今週中にこれを終わらせないといけない」などです。

私の場合は、「そのうち時間ができたらやりたいこと」や「店にいったら買うもの」なども含めて、まとめてツールで管理するようにしています。人によっては手帳でもポストイットでも、自分が使い易いもので良いと思いますが、とにかく書き出す事が重要と思います。

メリット1:気軽に忘れられる

いきなり何言っているんだとツッコミ入りそうですが、とにかく書き出してあれば、あとは気になったらそこをみればよいという安心感が生まれます。これをやっておかないと、常に忘れないようにと頭のなかで何度もぐるぐると思い出す必要があり、その負担は自分が思っている以上に大きいと感じました。

メリット2:作業量の可視化

今日、帰宅するまでにどの程度の作業があるのかを、ある程度見積る事が出来ます。それによって仕事のペースがコントロールできるようになります。

メリット3:達成した事項をリストから削除する事による達成感

タスクが終わった後にリストから削除する際に、ささやかながら達成感が生まれます。とにかく終わらせようというモチベーションにもつながります。


私が使っているツール

Wunderlistというツールを使っています。Microsoft社に買収されましたが、PCでもWebでもスマートフォンでも統合的に利用できるのが良いです。アプリで管理する方は、他にもToodle, Remember the milkなどの著名ツールがあります。私もいろいろと使ってみましたが、最終的にWunderlistに落ち着きました。ただUIの使い勝手もふくめ、人それぞれと思いますので、自分にとって使い易いものを選んで頂ければと思います。

Wunderlistを選んだ理由としては

  • UIがサクサク動き、あまりストレスを感じない
  • サブタスクに分割して管理できる。
  • 通知機能が使える。
  • 各タスクについてメモが追加できる。(やりかけ作業の経過をメモったり、必要な資料、場所などを記録しています)

タスクの分類の仕方

タスク分類はいろいろな基準があると思います。私の場合はプライベートも仕事も区別せずに、リストに突っ込んでいます。「とにかく、これを見ていれば良い」という状況を作りたいため、あまり複数のアプリを使い分ける事は想定していません。非常にものぐさなので、ちょっとした面倒臭さがツール利用を止めてしまう原因になるんです。

Wunderlist

 

 

 

 

 

 

 

受信箱: とにかく気になったものはここに入れておきます。タスク以外にも単なるメモでも、まずはここに入れておくものもあります。定期的に見直して、タスクについては、別のカテゴリーに振り分けていきます。メモについては別のメモ帳に移したり、内容によってしかるべき対応を取ります。

星付き、今日、週: 各タスクに付与した期限などの属性により、自動的にこのカテゴリに表示されます。

優先度:高(今日中に): 字面通りで、今日はこれが終わらないと帰らない/寝ないなどのタスクを書いていきます。

優先度:中(今週中めど): こちらも字面通り。「時間が出来たらやっといて」レベルのタスクがここに入ります。

・優先度:小 : 急がなくとも、そのうち時間がある時にやっておけばよいもののメモ。「いつか、やりたいなあ」といった希望もこちらへ。

・ペンディング: タスクのうち、何らかの理由で一時中断になっているもの。

・買い物、欲しい円盤、欲しい本、欲しいものリスト: 実際に買い物に行く際のリストとしても使います。円盤=CD, DVDは趣味のもの、本などは、いずれ本屋などに立ち寄った時に買うもののメモです。

・行きたい店: 雑誌の記事やTVなどで紹介されて、いつか行きたい店をメモっています。

こんな感じで直近でやる必要があるタスクの他にも、時間があるときに仕込んでおこうと考えている事項や買い物メモまでもWunderlistで管理しています。(以前は別途にEvernoteなどを併用していましたが、いちいち別のアプリを立ち上げるのが面倒になり、全部を1つのツールにまとめました。)

作業管理や日常の物忘れ防止対策としてお勧めですので、ぜひ自分なりの使い方を模索してみてください。

学習に便利なIBM Data Scientist Workbench

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

先月、今月とWatson Summitやdatapalooza Tokyoに出てきて、IBM社のデータ処理系のツールなどを見てきましたが、BluemixからWatsonが手軽に利用できるようになったりと、同社のいう”Cognitive”な環境とともに、分析系のツールが展示されておりました。もっとも同社は著名な統計分析ツール”SPSS”やBIツール”Cognos”を買収したという経緯もあり、幅広い製品ポートフォリオを有しています。

そんな中で面白いと思ったのがタイトルにもつけた”Data Scientist Workbench”

https://datascientistworkbench.com/

データ分析に利用できるオープンソース系のツールを、統合的に利用できるようにしたサービスです。つらつらと触ってみていましたが、どうしてこれがナカナカ便利。特に学習用途には向いているなと思った次第です。

データ投入、データ整形、分析に必要なツールが揃っています。それぞれのツールの利用方法の詳細は、それぞれググってくださいませ。

Data Scientist Workbench

Data Scientist Workbench

 

 

 

 

 

 

 

データ投入:”MyData”

データファイルのアップローダーです。ディレクトリで階層管理する事もでき、アップロードしたデータファイルは各種分析ツールから利用することができます。また有名なiris.csvなどのデモ用データなども用意されていました。

データ整形:”Open Refine”

もともとはGoogleで開発されたGoogle Refineがベースで、2012年にオープンソース化されたデータクレンジングやデータ抽出、フォーマット変換を行うためのツールです。

Text, CSV, TSV, XML, RDF, JSONなどのデータフォーマットに対応し、データの前処理を行えます。

データ分析:R studio

分析用言語”R”を使い易くするためのIDE・統合開発環境です。コードのエディタの他、コンソールやグラフ表示なども併せて行う事が出来ます。またBig RやSparkなどとも連携しており、即時に利用可能です。

データ分析: Jupyter Notebook

“Notebook”というツールはあまり馴染みが無いかもしれませんが、いわゆる普通の作業記録のためのノートのデジタル版と言ってもいいでしょう。分析用の”Notebook”は登録したコマンドとその応答結果を記録し、再現性のある分析と文書化を行えるようにしたものです。

Jupyter Notebookは、もともとはpython用に開発されたIPythonをベースに2015にリリース。作業に関するコメントの他に、R, Python, Scalaのコードを書いて実行する事が出来ます。またグラフの描画も可能です。

また作成したノートは他の人と共有することができるため、作業記録の共有や分析方法のハンズオンなどに利用することもできそうです。

データ分析: Zeppelin Notebook

こちらもJupyter同様に、作業を記録するためのツールであり、2014年にASFインキュベーションプロダクトになりました。

Webブラウザからの操作で、Python, SQL, Scala, shellコマンドなどが利用できます。

これらのツールを利用するためには、まずは環境の準備を自前でやろうとすると、それだけで結構めんどうなのですが、サインアップすればすぐに利用できる環境というのは魅力的です。

そんなに使い込んでいないため、業務でバリバリ使えるのかは分かりませんが、少なくともお手軽にRやSpark、Pythonを利用した分析を学習するための環境としては非常に優れていると感じました。

残念なビッグデータの例

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

ビッグデータブームも落ち着きをみせ、最近はIoTだ、FinTechだと、別のキーワードにトレンドが移っているようです。そんなこともあって、以前ほどは「データ分析、いぇい!」なシーンも減ってきているかと思いますが、特にIoTではリアルタイム計測~リアルタイム処理と分析の難易度が上がってきています。Apache Sparkだ!MQTTだ!とか、いろいろと聞こえてきます。そんな中でもデータ処理関連のご相談を時々受けるのですが、少しヒアリング&サンプルを見せて頂くと、「これはシンドイなあ・・・」と思う案件がいくつかございます。(知人では「データ分析案件で出てくるデータの9割以上はゴミだ!」と言い切る人もいます。)

そんな中で「こんなデータは嫌だ!」というケースをいくつかご紹介して、他山の石と頂ければと思います。(もちろんフィクションです。かなりを脚色していますが、似たような事が起こっています・・・)

1.そもそもデジタル化されていない

「うちには大量にデータがあるから」と出かけていくと、大量の段ボール箱に入った記録シートなどがお目見えするシーンです。思わず涙がこぼれそうです。これらを実際に分析の俎上にのせるには、データの手打ちでの移し替えが常です。最近はOCRの精度も良くなってきているので、昔と比較したら格段に作業効率は良くなっているのですが、センサーの設置地点ごとに記録表の表組が変わっていたりすると目まいがします。

当然、手打ち写経で打ち間違いなどの作業ミスも発生しますし、なかなか困難を極める現場となりますね。

2. フォーマットがバラバラ

取得した時期、拠点などで、フォーマットが異なっていたりすると、単純にデータストアにロードできず、整形など何らかのプレ処理が必要になります。こちらも最近はETLなどのローダーが普及してきていますし、インポート処理も親切な作りになっているツールも多いので、何らかのデータストアに格納されているものであれば、変換は容易になりました。単純に数字だけといったものは意外とやりやすいのですが、手入力したコメントのような文章が入ってくる平文のテキストファイルだとツライ事が多いです。’  や ” 、,  :; スペース、タブ文字など、どんな文字でも入りうると、正規表現を駆使してもデータの区切りを定義する難易度が跳ね上がります。レコード数が多いと「おお!やっと入った!」と一時的に安心しても、途中から列がずれているのを見つけて落胆すること数限りありません。

3. データの連結を考慮していない。

最近のアドテク関連は、いかにしてデモグラ情報と行動ログを関連づけるかとか、同一人物が違うデバイスを使った時の記録をどのように突合させるかなど、データ連携をさせるための工夫の歴史といっても過言ではないと思います。そんな中、結合に必要なキー情報(会員番号とか、機器の識別コードとか)が無い状態で、「年齢別とか男女別の売上比を出してみて」と言われましても、どうしようもないんですね。あとから追加できる情報ではないため、お手上げ状態になります。

似たような例としては、名寄せを全く考慮していないケースもあります。例えば「NTT東」「NTT東日本」「東日本電信電話株式会社」は一般的に同一会社とみなされます。これを何も前処理をしないで単純に集計すると、異なる3つの会社があると見なされるんですね。そうすると結果を見誤る事になります。こちらもデータ名寄せを支援するためのツールやサービスも出てきていますが、もともとはデータ取得時に考慮されているとベストです。

4. 必要なデータが取れていない

データマイニングといった探索的な処理の場合には、あまり表だった問題にならないわけですが、知りたい集計結果、KPIを出すために必要なデータが、なぜか取れていないというケースが、ちらほら見かけます。分かりやすい例えでいうと、コンビニの売り上げ分析で「年齢別」「男女別」の集計をしたいというニーズがある場合、レジに登録する際に「**歳台」「男性」といった情報も併せて登録する必要があります。または「”**ポイントカード”はお持ちですか?」といった具合に、カードの登録情報と上記のような名寄せを行って得られる場合もありますが、いずれにせよ、何らかの手段でデータ化しないと分析に使えないわけです。

この逆もしかりで、欲しい分析結果に関連性が薄いデータを大量に渡されることもあります。「とりあえず何かの役に立つかもしれないから」と言われましてもねえ。

5. 欠測が多い、精度が怪しい

データ前処理の段階で、クレンジング等を行う際に、ひとまず仮にデータを可視化して傾向を見るといった作業をすることが多いです。その際に極端に大きい/小さい値を異常値として取り除く事があります。すると、明らかに異常値だらけというデータを見つける時があります。センサーの管理が無茶苦茶だったりするわけですね。同様に欠測期間がやたらに長いものが見つかることもあります。メンテナンス期間とか停電など、ある程度の期間に固まっているとかであれば、比較的対応しやすいのですし、一時的な欠損であれば前後の値の平均を暫定的に使うなどで処理できます。ついでに言うと、データソースが複数にわたっている場合、それぞれの時計が同期しているかも重要です。

 

現場のトラブルは挙げていくとキリがないわけですが、他には保存メディアに関するトラブルは比較的多いですね。保存したCD-ROM, DVD-ROMが読めなくなったなどが典型例ですね。(「”MOドライブ”, “zipドライブ”, “DATテープ”に入っているんだよ」みたいな希少メディア関連は、最近はほとんど無くなりました 🙂 )

こんなわけで、ただただ「大量にあるデータを使って、何かうまい事を言ってみせろ。ビッグデータだろ」的なケースにおかれましては、しばしばご期待にお応えしかねるケースも出てくるわけですが、逆に言えば、これからのデータ分析プロジェクトにおいて、欲しい成果が決まっているのであれば、それに合わせる形で分析手法、取得データの設計をされるのが望ましい限りです。

アクセス解析データの取得にも節度を持ちなさいというGoogle様のポリシー変更

マインドテックの冨です。ストーキング癖はありません。

ITProさんの記事で知ったのですが、Chrome拡張のポリシー変更があったのですね。

グーグルがChrome拡張機能のデータポリシー変更、他のWeb解析サービスに打撃か

http://itpro.nikkeibp.co.jp/atcl/column/14/346926/042200513/

で、平たく言えば、ユーザーの許諾なしで行動履歴データを取得・利用するなという事でございます。至極まっとうなポリシーであると存じます。

影響を食らう先としてSimilarWebが上がっておりますが、これは競合などの他社のサイトのPVや訪問者数の推定値を提供するサービスだったりします。サイト運用担当者は競合の動向分析に利用したり、業界トレンドを知る意味でも便利なツールとして利用されておりました。

アクセス解析データ取得の仕組み

そもそもWebアクセス解析の仕組みを改めて振り返りますと、大きくWebサーバーのログを分析する手法と、JavaScript等のスクリプトを使ってブラウザーから計測情報をログ収集サーバーに飛ばすというやり方があります。有名なGoogle Analyticsは後者の良い例です。

これらのデータ取得のポリシーに関しては、各国・エリアなどでプライバシー情報の扱いに関する様々な法規制や業界団体による自主規制などがあります。厳しい所ではEUなどがありますが、内容に関してここでは深入りしません。

もっぱら技術的な観点からみますと、JavaScriptベースのデータ取得では取得できる情報に一定の制約があります。またCookieを利用する場合でもファーストパーティー/サードパーティーの違いがありますが、特に前者の場合には閲覧しているサイトのみしかデータ保存が出来ないものです。「ある人が何ページ見た」「ある人が今週、何回サイトを訪問した」などは、ユーザーごとに固有のIDを割り当てるわけですが、ファーストパーティーCookieの場合にはサイトごとに変える必要があります。つまり「サイトAを見ている人がサイトBも見ている」という事は、原則としてデータとして取得できないことを意味しています。ただし、このようなサイトを横断して行動情報を把握するのはデジタルマーケターの悲願でもあり、このために”Cookie Sync”といったIDを統合する技術や、独自の”会員番号”で認証させることによる名寄せなどが行われています。(あるECサイトで見た商品について、別のサイトを訪問した際に、その商品の広告を掲載するのは、このような仕組みを使っています。)

ややダークサイド寄りな計測

Cookieを使った計測に関しては、ユーザー側で計測されたくなければブラウザ側の機能で消去できますし、そもそもCookieの受け入れを拒否することもできます。つまりはユーザー側がコントロールできる範囲です。逆に、計測したいマーケター側のモチベーションとしては、そうはいってもユーザーの行動情報の把握はしたいですし、さらにはドメインをまたがったサイト間の遷移を知りたいわけです。ドメイン間遷移に関しては明示的に「遷移しますよ」という情報をブラウザから送らせる事で、2つのサイトのデータを突き合わせる事が出来ます。そのような手段を取らず、ブラウザ側で何らかのデータを保存できる機能や通信プロトコル上で情報を維持できる機能を、ユーザー特定の情報を保持するために利用する事があります。Flashやブラウザの一時ストレージ、HTTPの一部のヘッダーなどを利用して、Cookieや他の情報が消去されても、いずれかの手段で情報が残っていれば、それを利用してリカバリーを行うというやり方です。(“EverCookie”などの名前で発表されています。)技術的にみれば良く見つけたなあと思う所もあるのですが、利用者の意向を無視するという意味では、あまり褒められたやり方ではないです。

他社サイトデータの分析

これまで見た通りWebサイトのアクセス解析の手法はいくつかありますが、基本的にはサイトのコンテンツに計測のための仕組み(計測タグなど)を入れて計測します。逆に言えば、自分の管理下にあるこれらの仕組みを導入出来ない限り、基本的にはデータ取得は不可能でした。特に他社のサイトには入れようがありません。1つの例外は、閲覧するブラウザにデータを取得する機能を持たせる事です。Internet ExplorerやChrome, Firefoxなどの著名ブラウザにそのような機能を組み込むのは、拡張機能を利用したアプリケーションやツールバーなど形態をとります。例えばUCカードの永久不滅プラスはそのいい例でしょう。提携ECサイトへのポイント付与というメリットを提供する代わりに、ブラウザでの行動情報を取得しているものと思われます。利用規約にはこんな一文があります。

①本ソフトウェアを利用しているインターネットブラウザ上の行動履歴等のうち、下記の情報

(イ)本ソフトウェアを利用しているインターネットブラウザ上でアクセスしたすべてのウェブサイトのURL(ファイル名、リファラー(参照元URL)、検索キーワードを含みます)、アクセス日時(秒)

(ロ)本ソフトウェアを識別するための情報

この場合、「永久不滅プラス」をインストールしているブラウザで閲覧したサイトの情報は、UCカードと提携しているマーケティング会社に送られて利用される事になります。注意すべき点としては、このデータは計測対象サイトを限定していない事です。すなわち統計的に有効となる一定数以上のユーザーからのデータが取得できれば、おおむね大手のサイトであればどんなサイトであっても、UCカードはそれらのアクセス動向を推定出来る事になります。

こんな感じでブラウザに計測機能を紛れ込ませれば、デジタルマーケターにとっては非常に有益なデータが取得出来ます。これが「永久不滅プラス」のように明示的にポリシーを提示しているのであれば良いですが、ユーザーに了解を取らずにこれらの計測をしているケースが散見されます。上記のITProの記事で名指しされたSimilarWebに関してもChromeの拡張機能を利用して、バートナーに作成させたアプリを利用して無断でデータを取得していたのではないでしょうか。今回のGoogleのポリシー変更は、このようなデータ取得を禁止するという意味だと思います。放っておけば「ストア」の運用者としての責任を取らされる法的リスクを鑑みたものではないかと考えています。

知らぬ間にプライバシー情報へのアクセスを許している場合がある

なんだかんだで、この手の話題は以前からのいたちごっこでもありまして、ないがしろにされてきては規制が入るところでもあります。(これらの自分が意図しない計測を行われていないか個人レベルでチェックするのであれば、Wiresharkなどのパケットスニファーと呼ばれるツールを使って、意図していないサイトに通信が発生していないかを確認することができます。ただしネットワークなどに関する知識が必要。)特にPCブラウザーからスマートフォンに利用者が移行するにしたがって、この傾向はひどくなっているんじゃないかと思います。アプリケーションをインストールする際には、それらがどのような権限を持つかをチェックする事ができますが、例えば某Androidで動く、おばけから逃げつつ道ばたのエサを食べまくるゲームでは、なぜか「カメラ」や「保存した写真」へのアクセスを要求しているのを見つけてビックリしました。(ゲームをする上では絶対に不要な機能のはず)

他の例としてはSNSでの占いアプリなどで、自分の友人関係のデータを引き渡すように求めてくるものもあります。気にせずOKをしている人も多いかと思いますが、サービス提供者にそれらのデータを引き渡している事と同義です。ユーザー側の観点で自営するとすれば、ブラウザであれスマートフォンであれ、提供者が怪しいものは利用しない。利用規約をよく読む。アプリの場合は許諾範囲もチェックするといったところではないでしょうか。