ICSからTVPIDファイルを作る

先日作成したワールドカップ用のカレンダーファイルを利用して、EyeTV の予約に使う iEPG データを作りました。尚、このソニーが提唱した電子番組表の規格は終了する事になるようですが理由は不明です。

ICS ファイルの読み込みは公開されていたものを拝借して利用しましたが、2点変更を加えました。1つ目は、ics クラスで icsData 値を全て取得する際の explode の区切り文字列が \n になっていたのですが、作成した(というか元にしていた) ICS ファイルの改行コードが CRLF だったので次のようにしました。

$icsDatesMeta [$key] = explode ( "\n", str_replace(["\r\n", "\r"],  "\n", $value) );

また、このクラスから $icsEvents 取得後に TVPID ファイルを作る際に終了時間のタイムゾーンが設定されていなかったので次の1行を追加しました。

$endDt->setTimeZone ( new DateTimezone ( $timeZone ) );

更にこの追加行の直上に、決勝トーナメント以降の対戦は延長戦の可能性を考慮して終了時間に1時間を追加しました。

if($i > 47) {
  $endDt->add(new DateInterval('PT1H'));
}

この PHP ファイルと同階層に iepg というディレクトリを 777 権限で作成して実行すると、ブラウザ上では日付順の日程を表示しつつ、iepg-{n}.tvpi というファイルを64種作成します。装置は EyeTV 250 を UNIDEN 地上デジタルチューナー DTH11 からのコンポジット入力で使用しているので、station 値は固定し EyeTV 側の「録画ソース」には「100 コンポジットビデオ」となるようにしました。

Content-type: application/x-tv-program-info; charset=shift_jis
version: 1
station: コンポジットビデオ
year: 2018
month: 06
date: 15
start: 00:00
end: 02:00
program-title: FIFAWC2018 ロシア vs サウジアラビア - A組 第1節
genre: 1
subgenre: 2

iEPG ファイルの準備ができたら、重複を回避するために EyeTV の既存の予約をスタンバイ状態(チェックを外す)にし、全てのファイルをダウンロードフォルダにドロップすると予選リーグ第3節の重複を警告してきますので、それぞれどちらの対戦名を優先するか決定して読み込みが完了します。

スタンバイ状態にした既存の予約を有効にして行くと、重複した予約の対戦名をダイアログで警告してきますので、それらの予約をスタンバイにしながら最終的にどちらの予約を優先するか調整する事になるかと思います。

最後に今回作成した iEPG ファイルをこちらに置きましたので、PC 録画を予定されている方のお役に立てば幸いです。
WC2018IEPGs.zip

P.S. チューナーの方は面倒臭い…

参考:

Googleファミリーリンクで子供の端末を制御する

昨年、安価な子供の位置情報確認方法について書いたのですが、iOS のようなペアレンタルコントロール機能が Android には無いので、アプリを無効化しても Chrome ブラウザを使い際限なく Youtube 視聴をしてしまったり、子供の友人が勝手にロック画面からカメラを起動して街中で動画を撮影するといったような子供あるある問題が表面化してきたので対策を考えていたところ、Google が「ファミリーリンク」という制御アプリを日本向けにリリースしたので導入してみました。環境は前回同様、子供の端末に Huawei SIMフリースマートフォン P8 lite に 0 SIM を利用します。

まず現在年齢を詐称して登録していた子供の端末のアカウントのデータをバックアップしました。
$ adb backup -f backup_20180604.ab -all -nosystem -apk -obb

次にこの端末に親管理者となる自分のアカウントを追加し Google ファミリーリンクのアプリをインストールして進むのかと思いきや、別端末から管理する必要がある事が分かりました。公式の文書には「〜の端末」や「〜の Android」と言った記述がなく分かり難い事半端ありませんでした。

気を取り直して子供の端末を初期化し、自分の端末(iOS と Android 共)にも Google ファミリーリンクのアプリをインストールし、子供のアカウントを正しく再取得した後に2台並べて設定、Chrome のフィルタで youtube.com ドメインの追加、アプリ管理、位置情報、その他からフォト共有をオフにし、1日の利用上限とおやすみ時間を指定して無事完了しました。

次に上部スワイプからショートカットで Wi-Fi をオフにしてデータ通信での挙動を確認してみたのですが、先のアプリの管理で「端末管理」と「EMUI」をブロックすると「設定>データ通信量の管理」の項目が非表示になってしまう事が分かったので、一旦許可済みにして「ネットワーク通信を行うアプリ」と「1ヶ月の利用可能なデータ通信量」の設置を行いました。

そしてネットワーク通信を行うアプリを観測してみたところ、10085 というアプリが位置情報を取得する際に必要な事が判明したので「ネットワーク通信を行うアプリ>システムアプリ」でモバイルデータのチェックを入れてみたのですが、Google ファミリーリンクのアプリにある他の設定を変更する事ができませんでした。

もう一度設定画面を確認してみると、10085 前後に存在している 10008, 10012, 10014, 10017, 10026, 10029, 10031, 10032, 10045, 10050, 10058, 10064, 10070, 10074, 10080, 10081, そして 10086 という多数の怪しい名称のアプリが関係しているだろうと推測して全てにチェックを入れるとうまく動きました。

それぞれのアプリがどの設定に関連するのか調べるのは面倒だったので放置していますが、 10032 をオフにする際「モバイルデータ通信の無効化」というタイトルのダイアログを表示し「MMS メッセージの送受信」が不可能になる旨の警告をしていました。結構な数のアプリなので通信量が若干心配なのですが、幸運にも 6.0(Marshmallow)端末で対応できましたし、フィルタリングや時間制限など MacOS に近い制御が可能だという事で、iPhone SE2 が出たらどうなるか分からないところ、暫くこれで運用してみようと思います。

参考:

サポート対象外のMacでNight Shiftを使う

昨年内部ディスクを SSD に換装して快適さを取り戻した開発機で使っている iMac Mid-2011 ですが、リビング用に購入した MacBook と比較してみるとスマホでは一般的な機能になっている Night Shift の設定が欠けている事に気が付きました。調べてみると、iMac に関しては2012年型から使える機能なようで、ブルーライトで失明してしまったお婆さんの体験談を近所にお住いの方から伺った事もあって、ソフトウェア側から何かできないものかともう少し追いかけると、MacRumors のフォーラムに相当する内容が書かれていました。

参考:

インストーラがあったので簡単に済ませようとしたのが運の何とかではありませんが、再起動後の起動画面で無線キーボードとトラックパッドを認識しなくなると言う問題に直面、内容をよく読むと macOS 10.13.2 は検証中だと…。背面の電源ボタンで強制終了し、コマンド+Rキーで内蔵の macOS 復元システムを立ち上げ、クソ長いクリーンインストールと Time Machine バックアップからの復元か〜と思っていた矢先、SSD にした恩恵に与る事ができました。

気を取り直し原典に当たる事にして、日本語の説明も参考にしつつも、その手順の内容が箸折ってあったのと途中で問題があったので経過を書いておこうと思います。

まず CoreBrightness.framework のバックアップは、デスクトップ等にドラッグしたり直接副クリックからの圧縮をしてデスクトップに移動させるのでも良いのですが、パーミッションが {User}:staff に変更されてしまうため戻すことの手間や後述する手順の作業内容を考えるとゴミ箱にぶち込むと言う手もありそちらの方法を選択しました。

次にエディタアプリで CoreBrightness.framework を開く場合、このフレームワークの置いてある場所 /System/Library/PrivateFrameworks/ で書き込み権限が無いため、一旦デスクトップ等の場所に複製したものを編集しました。編集アプリには iHex を利用しました。

そして、CoreBrightness.framework の ModelMinVersionBLR と言うシンボル名のアドレスを拾います。
$ nm /S*/L*/PrivateFrameworks/CoreBrightness.framework/CoreBrightness|grep _ModelMinVersion
0000000000035000 S _ModelMinVersionBLR

更に16進数ダンプを表示して編集箇所の目星を付け、編集アプリでファイル内検索を利用し実際の編集箇所を見つけます。
$ xxd -s 0x35000 -l 28 /S*/L*/PrivateFrameworks/CoreBrightness.framework/CoreBrightness
00035000: 0900 0000 0100 0000 0d00 0000 0600 0000 ................
00035010: 0500 0000 0600 0000 0800 0000 ............

今回は iMac12,1 に対応させるべく 0d000c00 に書き換え、保存した CoreBrightness.framework を /System/Library/PrivateFrameworks/ へ戻し、$ sudo chown -R root:wheel /System/Library/PrivateFrameworks/CoreBrightness.framework と権限を元に戻しました。

これで最後と思った codesign コマンドでエラーが返ってきました。
$ sudo codesign -f -s - /S*/L*/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness
/System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness: replacing existing signature
codesign_allocate: error: unable to locate xcodebuild, please make sure the path to the Xcode folder is set correctly!
codesign_allocate: error: You can set the path to the Xcode folder using /usr/bin/xcode-select -switch
/System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/Current/CoreBrightness: the codesign_allocate helper tool cannot be found or used

2つ目のエラーに書いてある sudo xcode-select --switch /Applications/Xcode.app を試しても、Xcode の「環境設定>Locations>Command Line Tools」を確認するも問題がなく、結局1つ目のエラーにあるように .bash_profile ファイルへ export PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ とパスを記述し再読み込みして解決しました。

$ vi .bash_profile
$ source .bash_profile

ここまでやっておいて何なんですが、OS の更新毎に作業が発生する事や、子供が産まれてからは17時以降の作業はやらないようにしているのであまり必要がなかったのかもしれません。

参考:

照会カレンダーを作る

4年に1度のサッカーの祭典が迫って来たところで恒例のカレンダーファイルを作成し共有したいと思います。技術的な要件としては次の3つになります。

  1. 日本語表記にする
  2. DropBox を使って照会カレンダーの形式で共有する
  3. スマホの2大 OS とデスクトップでの表示に対応する

(技術的な事はどうでも良いのでカレンダーファイルを入手したい方はこちらからどうぞ。)

  1. 日本語表記にする

    まず ICS ファイルを作成するのですが、英語やロシア語などの表記を使ったカレンダーファイルは既に幾つか存在しているのでそれを利用します。今回は Fixture が提供しているものを利用しました。一旦カレンダーアプリに読み込んだ後、ファイルメニュー>書き出す>書き出すを選び、書き出した ICS ファイルをテキストエディタで開き、日本語に書き換えます。国名やスタジアム名、対戦ラウンド名やグループ節などは一括置換してグループ組名のアルファベットを追加しました。

    更新:詳細にスタジアムの所在地名と放送テレビ局名を追加し、決勝トーナメント以降の「未定」となっていた対戦国名に試合 ID を利用した表記にしました。

    参考:
  2. DropBox を使って照会カレンダーの形式で共有する

    決勝トーナメント以降の未定となっている対戦国名を更新するためにダウンロード形式では無く照会カレンダーとして共有します。コストを掛けない保存先として DropBox を選択しましたが、ここで一つ罠がありました。

    DropBox でファイルを共有した時にデフォルトで付与される dl 引数は 0 なのですが、これを 1 にすることによって解決しました。

    http://hkitago.tumblr.com/post/173940229306

    また DropBox の共有リンクアドレスはファイル名が変わらない限り普遍だと言う事で、更新が必要な照会カレンダーファイルを配置する条件に合致しています。

    参考:
  3. スマホの2大 OS とデスクトップでの表示に対応する

    具体的には、Apple の MacOS と iOS のカレンダーアプリ、Google カレンダーのウェブアプリ版と Android のカレンダーアプリになり、デスクトップとスマホで同期できるようにします。実はここにも一つトリックがあって、アドレス文字列をクリップボードにコピーした後にカレンダーアプリのコマンドを使って照会(追加)する場合と、ハイパーリンクを使ってカレンダーアプリを起動し照会(追加)する場合で方法が異なります。参考まで、Apple では「照会 (Subscribe)」、 Google では「追加 (Add by URL)」)と言うコマンド名称になっています。

    最初に、アドレスをクリップボードにコピーしてカレンダーアプリから直接追加する場合、MacOS/iOS 共に https://webcal:// のどちらのスキームを使う事が許されていますが、Google カレンダーでは webcal:// のみ使う事ができます。https:// のアドレスを使うと一見読み込みに成功したように見えますが内容を表示する事ができません。また、iOS で webcal:// を使うと SSL オプションが外れた状態になるので気になる方は https:// を使うと良いと思います(MacOS のカレンダーアプリには SSL オプションがありません謎)。

    次に、ウェブ上にあるハイパーリンクを踏んでカレンダーアプリを起動して照会(追加)する場合、MacOS/iOS では href="https://… とすると ICS ファイルがダウンロードされ照会カレンダーの扱いになりませんので href="webcal://… を使う必要があります。この場合も先述した通り SSL オプションはオフのままなのでご注意ください。そして Google カレンダーへ遷移し追加する場合は、href="https://www.google.com/calendar/render?cid=webcal://… と記述する必要があります。

    参考:

と言う訳で長々と書きましたが、リンク先はこちらになります。

Apple 用
FIFA World Cup 2018 照会カレンダー日本語版
Google 用
FIFA World Cup 2018 照会カレンダー日本語版

それぞれのカレンダーアプリから直接照会(追加)する場合は、このアドレスをコピーしてお使いください。

最後に注意点としては、iOS で照会すると MacOS へ同期する事ができないので両端末で同期する場合は MacOS で照会し場所を iCloud にする事と、Android のカレンダーアプリはデフォルトで同期がオフになっている事があります。それでは楽しいW杯ライフを!

参考:

Passive Event Listenerを使う

シングルページアプリケーション(SPA)や最近話題のプログレッシブウェブアップス(日本語ではアプリ)をやっていると利用者にスクロールさせたくない場合、イベントリスナーを使った JS コードので対応ができていたのだけど、iPhone で思うようにならなくて調べると、こんなバグ報告がありました。

ところがもう少し調べるとまたもや Stack Overflow に助けられ、公式文書によると iOS 11.3 と macOS 10.13.4 に搭載されている Safari 11.1 からパッシブモードを使う事が必須になったそうです。

Android は未だ昔のやり方で動いているのですが時間の問題かと思います。

参考に記した日本語文献は2016年のもので、そう言えば微かに当時言われていた記憶が…としても唐突過ぎてバグ報告したくなる気持ちも察しつつ、過去のプロダクトを含めて見直しを啓蒙したいところで書きました。

参考:

iOSのOpenCV環境構築

簡単だった Android に比べて癖が強かった iOS の OpenCV 環境構築について、Xcode 9 と Swift 4 で且つ CocoaPods を使わないという条件下で3つのハマった事を記録しておきます。

  1. 使用する OpenCV のバージョン

    まずはやっぱり最新バージョンと思って OpenCV 3.4 を使うも “Apple Mach-O Linker Error” でビルドに失敗したので Stack Overflow のお世話になると 3.1 以下を使うべしという事。実際には最後に判明した事だけど重要度から最初の項目にしました。

    参考:
  2. フレームワークとラッパーファイルを配置する場所と Create Bridging Header プロンプトが表示されない問題

    この辺りのチュートリアルを説明している日本語文献は多いのだけど、フレームワークとラッパーファイルをプロジェクト直下では無くてグループのフォルダ内に置くと openCVwrapper.mm ファイルのヘッダで #import "opencv2/opencv.hpp" とすると 'opencv2/opencv.hpp' file not found とエラーを出力します。

    結論からすると、ターゲットの Build Settings にある Framework Search Path を正しく指定すればどこに置いて良いという事ですが、プロジェクトフォルダの第一階層に置くのが理想的かと思います。

    http://hkitago.tumblr.com/post/172359880316

    もしグループフォルダに置いた場合、右手にあるプルダウンから再帰(recursive)を選べば通るようになります。

    この模索中にフレームワークの追加と削除を繰り返す事になったのですが、2回目にフレームワークを追加しても Bridging-Header.h を自動的に作成するダイアログが表示されない問題にぶつかりました。フレームワークと3つのラッパーファイルを削除したらターゲットの Build Settings にある Bridging Header を削除する事で解決します。参考の Stack Overflow にスクショ付きで解説があって助かりました。

    参考:
  3. ビルド時の Documentation Issue 警告

    最後は深刻ではないのですが、ビルドすると大量の警告を出力してくるという気持ち悪さ回避で、プロジェクトの Build Settings にある Documentation Comments を NO にしました。

    参考:

最後にサンプルコードを Github で漁っていたのですが、 Swift 3 のコードが多く、しかも Swift 4 でカメラ周りの API の変更点が多い事や、Android との兼ね合いを考慮してできるだけ OpenCV のコードで Swift を使わないものを探してみると、Twitter 検索で面白いものを見つけました。(Google 検索には引っかからなかったのがとても現代的)

Swift 4 用に若干変更を加え、先に Android で作っていたコードを流用して簡単に実装できました。

環境構築1日、実装5分という情けないお話でした。

Macを買ったらやるべき4つ目のこと

最近まで「一人一台の iPad(タブレット)」という理想を持っていましたが、外出先で本を読むには5インチ超えの携帯端末を所有している事や、Youtube や Amazon プライムといった映像を視聴するには大画面で AppleTV の体験の方が優れていると気が付いた事もあって、そろそろコンピュータ教育を始めても良い頃かなと思った子供の10歳の誕生日を契機にマルチアカウントで使う MacBook 2017 (1.3GHz Dual-Core Intel Core i5) をリビングに導入しました。

そこで初めて MacOS を使う子供用のアカウントを設定していたところ、過去に書いた「Macを買ったらやるべき」3項目

  1. システム環境設定>キーボード>ショートカット>キーボード>次のウィンドウを操作対象にする ショートカットキーを⌘`に変更
  2. Dock に Recent Applications のスタックを作る
  3. スクリーンキャプチャの保存先を変更する

に追記すべき事柄があったので一応記しておこうと思います。

具体的には、「システム環境設定>キーボード>ショートカット>入力ソース>前の入力ソースを選択」のショートカットキーを「⌘スペース」に変更します。米国の利用者は基本的に入力ソースを変更する必要がないのでタイプしやすい方の割当の変更は不思議ではないのですが、その真の理由は定かではありません。

加えて最新の写真アプリには iOS のスクリーンショット画像を集めるアルバムが自動的に作られている事から、フォルダアクションを使って MacOS で撮影したスクリーンショットも写真アプリへ追加できるようにすると良い気もしています。

当初、Mac mini を HDMI 接続でテレビに出力する方法も模索していたのですが、現状を考えると手が出ませんでした。

http://hkitago.tumblr.com/post/172549008795

最後に、安価な MacBook Air 発売の噂を横目にしつつも、数日触った感じとしては完成度が高く全く不満がありません。

SSD よりも高速なストレージや Intel CPU 脱却話も気になりますが、ハード性能向上は今後どうなることやら。

参考

URLからツイートIDを取得する正規表現

10年ほど前にあったデリシャスというブックマーク共有サービスから移行して使っているタンブラーの運用について、以前は投稿の連携機能を利用して名言などをツイッターへ流していましたが、そのままだと先頭から140文字を可読性の悪い状態で出力することに起因する手動の編集作業が面倒臭くなったことや次のような理由もあって、タンブラーへ入ってくる興味のあるツイッター投稿に対して「スキ」フラグをつけて保存し、その一覧を参照して定期的にリツイートするようにしました。

これはタンブラーとツイッターの API を併用するいわゆるボットと呼ばれるもの(ライブラリは TwitterOAuth と、それにインスパイアして作られた techslides-tumblroauth を使用)で、その中で最も厄介だった部分を考えてみるというのが今回のお題目になり、まずツイッターの URL 形式の種類について調べました。

http://hkitago.tumblr.com/post/164275112841

この条件から次のようなもので利用してみたところ、いくつか取りこぼしが見つかりました。
#https?://twitter.com/?(?:\#!/)?(?:\w+)/status(?:es)?/(\d+)#i

そのログを元に更に調べてみると、この4つに加えてサブドメインの付与 twitter.commobile.twitter.com について考慮する必要があるということが分かり、現状で次の正規表現で運用しています。
#(?:https?://)?(?:mobile.)?(?:www.)?(?:twitter.com/)?(?:\#!/)?(?:\w+)/status(?:es)?/(\d+)#i

preg_match 関数で $match に入れたものを var_dump して確認すると次のように取得できていることが分かります。

array(2) {
[0]=>
string(50) "https://twitter.com/{AccountID}/status/{TweetID}"
[1]=>
string(18) "{TweetID}"
}

これで良し、と思ったところでまた一つ取りこぼしの問題を見つけました。それは to.co で知られる短縮 URL の場合で、運良く Stack Overflow に URL を変換する関数を紹介していた方がいらしたので、タンブラー投稿 JSON データの “caption”、”summary” と “body” キーの文字列値に含まれる短縮 URL を取得して返すように調整して使うことにしました。

function getFollowUrl($string) {
  preg_match('#https?://t.co/[a-zA-Z0-9\-\.]{10}#i', $string, $match);
  if(!$match) {
    return $string;
  }
  $url = $match[0];
  $ch = curl_init();
  curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => false,
    CURLOPT_NOBODY => true,
    CURLOPT_FOLLOWLOCATION => true,
  ));
  curl_exec($ch);
  $follow_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  curl_close($ch);
  return $follow_url;
}

ここで発生した問題は正規表現の g フラグの使い方です。この関数の引数 $string にはテキストエリア入力による文章が入ってくるので複数の短縮 URL を持っていることがあります。$follow_url を配列で返せば良いかと思うのですが、この場合(極力避けたい)連投ツイートになってしまうことが必至で、最近ツイッターに実装されたスレッド機能による関連内容の表示にも期待しながら一旦処理を保留することにしました。

最後に余談で、URLを含む際の正規表現はバックスラッシュ地獄を避けるのが吉だと思いました。

http://hkitago.tumblr.com/post/164816686035

処理全体の説明は別の投稿にしたいと思いますが、タンブラーに流れてくる投稿のスキボタンを押すだけでツイッターの運用も可能になるのは大変楽なこと極まりないです。

参考:

「オムニチャネル小売と店舗の未来」和訳

知人が通うセミナーで使われているというオンライン小売業者のレポート PDF (2017年版)の、実際の店舗例について書かれている部分を現地視察前に翻訳してほしいという依頼があり、内容がなかなか面白かったので出版元の会社に FB メッセンジャーで公開する旨の断りを入れつつ記しておきます。

http://hkitago.tumblr.com/post/171513964811

P.25 崩壊前のオフライン小売業者
崩壊の危険があるビジネスの分野があるとしたら、それはオフラインの小売業者だろう。そして、その崩壊を後押ししようとしているのはオンライン販売だけで小売を始めて実店舗を構えようとする小売業者なのである。

いくつかのオンライン小売業者は、販売全体のおよそ10パーセントでオフラインで起きている90パーセントの試みを決定していた。彼らが長期に渡る成功を収めるかどうかは不明だが、一つ確かなのは業界を揺さぶるかもしれないようなやり方で従来型小売店体験を新たに想像しているという事だ。

「実店舗の空間はおよそ200年の間、変化がありません。」とフォレスター・リサーチ社のブレンダン・ヴィッチャー氏は述べる。「店の中を歩き、何かを棚から手に取り、レジに行き、支払いを済ませて店の外に出る。このサービスは私達の曽祖父母の世代から続くもので、現代のデジタル知識のある消費者には通用しません。」

オフライン小売業者の崩壊の始まりを目にしている最も有名なオンライン小売業者はアマゾンだ。皮肉なことに、従来の書店を殺した張本人は今やシアトル、サンディエゴ、シカゴ、ポートランド、そしてマサチューセッツ州の町、デダムとリンフィールドに書店をオープンした。

アマゾンはこの実店舗にオンラインでよく知られている機能を統合した。例えば、オンラインで星4.8以上のタイトルを集める「高評価」の陳列や、アマゾンを一躍有名にしたマーケティング技術である「この商品を買った人はこんな商品も買っています」を手本とした「こちらもいかが」という棚がある。

そしてアマゾンはこの書店が自社のキンドル端末やスマートスピーカーの販促を後押しすると考えている。

「消費者が私たちの端末を見て触って使いファンになる、実書店がその機会を作る良い場所だと私たちは考えています。」とアマゾンの最高財務責任者ブライアン・オルザブスキー氏は述べた。

またアマゾンは、アマゾンGOや現在は従業員のみが利用できるコンビニ、日用品配達サービスのアマゾン・フレッシュ、そしてフレッシュ会員が15分で実店舗で商品を受け取ることが可能なアマゾン・フレッシュ・ピックアップといったサービスを含む他の小売形態を試みている。

いくつかのアマゾンのオフライン小売は、そのデジタル価値を高めたプライムサービスを熱望しており、より大きなものになることは容易に想像ができる。

「アマゾンについて一つ覚えておきたいのは、常に消費者のことを念頭に置いているということです。」とヴィッチャー氏は述べる。「彼らは付加価値サービスを貫き、カスタマー・ロイヤルティへの鍵を見つけたのです。そして、その付加価値サービスモデルを小売モデルに適用することで、組織は彼らが実店舗をどのように考えていたのかについて再考することになったのです。」

しかしながら、アマゾンの実店舗支配は終わった話ではない。従業員管理、万引き、保険、接客、商業不動産など、オフライン小売固有の問題の取り扱いについて学ぶ必要があるだろう。

「多くの同業他社のように彼らも同じ多くの課題に取り組む必要があります。」とヴィッチャー氏は述べる。「そのことはさほど単純ではありませんが、彼らは異なった考えをしているはずです。そしてその考えが前進への大きなアイディアとなるでしょう」

P.27 ブルー・ナイル
オフライン店舗を目指すオンライン小売業者はアマゾンだけではない。同様に飛躍しようとしている小さなブランドがいくつかあり、そしてアマゾンのように彼らはデジタル体験を実店舗に拡大しようとしている。

ダイヤモンドジュエリーを扱うブルー・ナイルは1999年からオンライン販売を手掛け、2013年に全米でも有数の大型百貨店チェーンであるノードストロームの2つのブライダルショップでオフライン販売を始めた。

「私たちがノードストロームで始めた時は縦60センチ、横1.8メートルのショーケースから一年で100万ドルを優に超える金額を売上ました。ノードストロームでの二店舗目はそれ以上でした。」とブルー・ナイルのCEOハーヴィー・カンター氏は述べる。

それをきっかけにブルー・ナイルは “Webrooms(ウェブルーム)” と呼ばれる自社店舗をオープンした。最高級のショッピングモールの中の小さな販売場所では模造ダイヤのジュエリーを見ながら不特定の販売員と相談することが可能だ。

「ただ何かを売るだけではなく、実際の体験を作りたかったのです。」とカンター氏は言う。「ノードストロームでは単に婚約指輪を販売していましたが、Webrooms では体験を作っています。」

ブルー・ナイルはニューヨークに2店舗、ポートランド、シアトル、バージニア州のタイソンズ・コーナーに各1店舗、合計5店舗を展開している。

ブルー・ナイルのオフライン店舗は清潔で光沢感があり、デジタルの起源に沿っている。例えば従来ある会計のレジやカウンターがない。と言うのも実店舗には持って帰るための在庫を置いていないからだ。実店舗に訪れても自分のデジタル端末か、ブルー・ナイルに備えてあるノートパソコンでウェブブラウザを使って購入することになる。

「私はこれを三次元オンライン体験と表現します。」とカンター氏は言う。「と言うのも文字通り、自宅のソファでやるようなものだからです。」

このモデルによってブルー・ナイルは、いつものように BlueNile.com のオンラインショップサイトで得られる全てのデータに加え、いくつかの新しいデータを得ることができる。

「電話、タブレット、PCといったあらゆるデバイスを使った操作体験の豊富なデータを全て捉えています。」とカンター氏は言う。「顧客がどこに行くのか、どのくらいの頻度で来るのか、何を見ているか、ページ滞在時間はどのくらいか、コンバージョン率とか、加えて新規顧客のデータ、どのくらい遠くから来ているかとか、どのくらいの認知度なのか。」

またブルー・ナイルは地理的要因で購入パターンが異なることを見つけ、それに沿った取り揃えを各店舗で行っている。

「例えばニューヨークではバージニアやワシントン、オレゴンに比べて有名デザイナーの需要が大きくあります。」とカンター氏は言う。「ニューヨークやマンハッタンの人は、隠してあるデザイナーリングを購入する傾向が非常に強いです。」

ブルー・ナイルの店舗は、平均でグロス面積が46平方メートル、ネット面積が28平方メートルと伝統的なジュエリー店に比べてかなり小さい。(グロスは全体の、ネットは実際に使うことができる場所の面積)

「私たちの店舗は伝統的なジュエリー店の15パーセントほどの大きさだと思います。」とカンター氏は言う。「Webroom には通常2名とマネージャー1名の合計3人の従業員体制を取っています。伝統的なジュエリー店では6〜8名、あるいは10名かもしれません。」

カンター氏によると、各ブルー・ナイル店舗の従業員は一年平均で1.5億円を売上る。

「1店舗につき(1シフト)平均3名配置、総じて5〜6名の従業員として、年間で多くて7億円と言う計算になります。そこでグロス面積が46平方メートルから7億円と考えてみると、その生産性は驚くべきもので、伝統的なジュエリー店より果てしなく高いものです。」

P.28 モドクロス
最近実店舗を設立したもう一つのオンライン小売店は、ビンテージにヒントを得たアパレルのモドクロスだが、そこにもまた従来の店舗を連想する物理的な特徴を見ることができない。

「私たちは敢えてストアと呼びません」と、衣類メーカーのアーバンアウトフィッターズで最高戦略責任者を務めた後2015年1月にモドクロスへ参加したCEOマシュー・カネス氏は言う。「私たちはそれを”フィットショップ”と呼んでいます。単に外からの視点ではなく内部からのものです。」

数少ないオンラインだけの小売を展開していたモドクロスはこの一年にウォルマートに買収され、現在はテキサス州オースティンで一つのフィットショップを運営している。それ以前、2015年の夏から2016年末までにモドクロスはロス、サンフランシスコ、デンバー、ポートランド、ワシントン、ピッツバーグ、そしてオースティンの7箇所にポップアップストアがあった。

IRL、あるいは “In Real Life ツアー” と呼ばれていたポップアップストアのアイディアは、オンラインよりも多くのフィードバック得るために直接モドクロスのデザイナーやバイヤーが顧客と交流していた。噂によるとロスのポップアップストアは一区画分の行列ができていたそうだ。

「顧客がフィットショップで予約を取ると、彼女たちは平均で80〜90パーセントの時間を使います。」とカネス氏は言う。「そして、IRL ツアーやオースティンのフィットショップでの体験でオンラインのオーダーの倍の量になります。」

「私たちにとって、マルチチャンネルを利用する顧客の生涯価値はオンラインのみの場合に比べてずっと高くなります。しかしこれは現実の小さな事例で比較的短期間であるため、統計的に何かを指し示したり意味があるとは言えないと私は警告しています。」

「お店というものは、商品や靴などを顧客が試着できて彼女たちの自宅へ届けるという伝統的な部分とショールームのハイブリッドだと思います。そのコンセプトによってモドクロスは伝統的な小売販売と比べて0.09平方メートル当たりにより多くの製品を仕入れることができ、同僚は顧客と1対1で時を過ごすことができるのです。」とカネス氏は言う。

モドクロスの顧客は店内で自分のスマホやタブレットを使って支払いができるにも関わらず、購入は一般的にキオスク端末が利用される。

カネス氏によるとモドクロスが得る全てのデータは、小売店が将来の買い物客の興味を正確に捉えることができるように、パーソナライズ機能(プログラム・エンジン)に集約されていると言う。例えば、体型やサイズが似ている女性が既に好意的なレビューを付けているアイテムをアプリ内で表示するために、モドクロスは顧客の採寸データを利用している。

「ストアで必要なことは、各顧客に応じたパーソナライズです。」とカネス氏は言う。

モドクロスもまた、製品の好みには地理上の微妙な違いがあることを理解している。

「オースティンではオンラインで提供しているものに比べて、仕事用の服と同じくらいに私たちの独特の美学に大きな需要があると気が付きました。」とカネス氏は言う。「また、美学についてポップアップストアで学んだことは、ワシントンはより伝統的で、女性客が多く少しフォーマルでした。」

非アクティブなデータを通り越し、モドクロスは IRL ポップアップストアにおいて個人的な交流のみがもたらす突然の閃きをも体験している。カネス氏は、顧客が自分のサイズについて従業員に謝罪をしたというロスのポップアップストアで起きた出来事を詳しく話した。

「その女性客に付き添っていた私たちのチームの従業員女性は、あなたはそのままで美しく、そういうふうに感じてもらうことが私たちの仕事なのだから謝る必要はないと伝えました。」とカネス氏は言う。「するとその女性客は、ファッション会社で味わったことがないと泣き始めました。彼女はブランドと親しい関係を築けると思ったことがなかったのです。」

「それは私が “これこそがオフライン戦略を持つべき理由だ” と言った瞬間でした。私たちのミッションを発展させるという理由だけでなく、コミュニティの成長やリーチの拡大、そして良いことをして成功するためにもそのような瞬間を作っていく。」とカネス氏は言う。

もう一つのオフラインの閃きはサンフランシスコで起った。そこではモドクロスが言い方を止めてしまった、いわゆるプラスサイズの女性が、多くのファッション産業に無視されているかのように隅に追いやられてしまっていた。

「モドクロスの事業を大きくしたいという私のビジョンは、サンフランシスコでポップアップストアを展開した時に改めることになりました。ポップアップストアの洋服のサンプルをXXSから4Xまで全てのサイズを利用できるようにしました。」とカネス氏は言う。「女性、特に集団で訪れるお客さまは、みんなで買い物をするだけの取り揃えがあると思っていませんでした。」

「”プラスサイズはどこにあるの?” とか “私のサイズはある?” と多くの女性客が尋ねてきますが、”プラスサイズはありません” そして “全てのサイズの用意があります” と答えた時の彼女たちの表情を見せたかったです。」

しかしそれでもオンラインの小売店はもちろんデータが全てだ。そして各個人に基づいたオフラインのデータを得ることで、顧客が実店舗にいる時でもデジタル的に自分を確認できるようになる。そのために小売店は、サインインやアカウントを作ることが妥当だと感じる何かを買い物客に提供する必要がある。

「小売店が必死になっているのは交換価値です。」とフォレスター・リサーチ社のヴィッチャー氏は述べる。「顧客の自己認識のためにどれだけの価値を与えることができるのか?」

ブルー・ナイルは、顧客がウェブブラウザを使って自宅や Webrooms で自社のオンラインカタログを見ている時に、クッキー技術を使って彼らの買い物同行を学習している。全てのセールスは、顧客が持っている端末や Webrooms に設置されている iPad で個人向けサービスを使ってオンラインで完結する。もし顧客が Webrooms で購入しなくても、後でコンバージョンを追跡できるように個別の割引コードを発行している。

P. 31 ファブレティクス
行動的な女性用のアパレルであるファブレティクスは会員制を採用している。ファブレティクスの会員は、非会員と比較して30〜50%の割引額で商品を購入することが可能だ。

ファブレティクスの会員になると、毎月始めの5日以内に何かを購入するか翌月に持ち越すオプションを使うかという条件に同意することになる。

「顧客を引き付ける唯一の方法として、毎月始めの5日以内にウェブサイトへログインするか直接来店し、何かを購入するか持ち越しを選択してもらうようにしています。」とファブレティクスの上席副社長ダスティン・ネトラル氏は述べる。

テックスタイルファッショングループ社が保有するファブレティクスは、今や21の地域に店舗展開しており、年内もしくは2018年の始めまでに30へと拡大する計画だ。

ファブレティクスが適切なお勧めの商品を提供できるように、新規会員はまずスタイルとサイズのプロフィールを記入する。毎月1日に、会員はそれぞれのために選び抜かれたアイテムが掲載された電子メールを受け取る。その内容は、オンラインや実店舗での顧客個人の行動データに基づいて変わるようになっている。

オンラインの行動から収集する情報は実店舗の購入体験に利用しているし、その逆もまた然りである。

例えば、ある顧客がオンラインで何かの商品をカートに入れたけれども購入しなかったため、取引記録にも残らなかったとしよう。その顧客が実店舗に足を運びアカウントにログインすると、従業員は彼女のカート履歴を参照し同じアイテムの試着を促し購入の機会を伺うのだ。

ファブレティクスの全ての従業員は携帯端末を持ち、サイズが適切であるかどうかといった Fabletics.com にある個々のアイテムに対する顧客のレビューを参照することができる。

またオンライン販売のみの場合と比較して、実店舗のデータを使いより迅速に顧客の動向に対応が可能になった。

「毎月始めに新たに展開した商品が3日経ってもコンバージョンが鈍いと、それは値段やサイズの問題なのかもしれないと分かるのですが、店舗にある全てのデジタル的な情報を集めてここエル・セグンドにいるデザイン、マーチャンダイジング、そしてプランニングのチームにフィードバックしています。」とネトラル氏はカルフォルニア本社を引合いにして述べる。

フィッティングルームに至るまでに起きる全てのことを注意深く調べる。もし会員が購入しないと何故か尋ねる。結果としてファブレティクスはトレンドを掴み適切な対応ができるのだ。

「仮に私たちが顧客に ”このカプリパンツはどうでしょう?” と感じで尋ねたとすれば、 ”少し小さいわ” と返事があることでしょう。」とネトラル氏は続ける。「もし私たちがトレンドを十分に知っていないと、その商品をリサイズしタグを付け直すことでまとまった商品を出荷できなくなり、顧客を失望させ、結果として返品となって終わるでしょう。」

一つ確かなことは、以前オンラインだけだった小売業者は製品ではなく、データ駆動型の個別体験によって違いを付けているということだ。

「製品は重要ではありません。」とヴィッチャー氏は述べる。「競争の優位は体験にあります。それこそが実店舗体験を改善するべき理由なのです。」

情報源: Omnichannel Retail | Catchpoint & Internet Retailer

一時期 iPhone などに接続してクレジットカード決済が可能になる端末をコンビニで販売していた米国発のサービスがありましたが、店舗からポスレジを無くしてしまって直接オンラインショップの決済を利用してもらうという仕組みは在庫管理を一元化し、飲食店でも一次的な出店でも、いろんな決済に応用ができ衝撃がありました。このレポートは、途中自社ソフトウェアの広告をいくつか挟んでいますが、そこから得られた統計について書かれた全68ページのとても読み応えのあるものでした。既に2018年版が出ているようなので、興味がある方はダウンロード(要登録)して一読してみてください。

最後に、不慣れな会話の慣用句の訳として面白かったものを二つ紹介。

http://hkitago.tumblr.com/post/171609862006

http://hkitago.tumblr.com/post/171609874261

日頃の技術書や RSS でニュースを見ている時の大意を掴みながら英文を読み進める場合と比較して、日本語でそれぞれの文が意味を成すように翻訳する技術は異なるものがあり、まとまった文章を翻訳するという作業の必要性を再認識しました。

通知センターの計算機の問題

確定申告の時期ということもあって High Sierra の通知センターにある計算機ウィジェットを使っていたところ、2本指スワイプのジェスチャーで呼び出す度に表示が一定値に固定されるという問題に悩まされました。

調べると幾つか類似の報告がある中で MacRumors のフォーラムに解決方法がありました。

http://hkitago.tumblr.com/post/171078016921

フォーラム内にもこの plist ファイルの中身を覗いてみた人がいらしたので、一応確認しました。

ファイル情報を確認すると High Sierra へ更新する前のもので、察するに前仕様で使っていたファイルが残っていて呼び出す毎に読み込んでいたのだろうかと思います。

報告を見ていると色んな数字にリセットされるようなのですが、面白かったのは MacRumors のフォーラムの2ページ目に同じ “375” になった方がいらしたことです。表示数をファイルに保存して起動毎に読み込んでいたと想像した前仕様にしては奇遇過ぎるので実際にどんな数字を保存していたのかとても気になるところです。

参考: