覚え書き

2018年2月12日 (月)

AlexaのカスタムスキルをTypeScriptで書く

やってみたことの覚え書き。 AWS Lambda上で動かすAlexaのカスタムスキルをTypeScriptで書くにはどうすればよいか。

例として、「Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発」の「宇宙豆知識」をTypeScriptで書いてみます。

npmパッケージを追加する

javascriptでAWS Lambda上で動かすスキルを書く場合、 以下のnpmパッケージをインストールしていることでしょう。

  • aws-sdk
  • alexa-sdk

これに加えて、以下のTypeScript用の型情報パッケージをインストールします。

  • @types/node
  • @types/aws-lambda
  • @types/alexa-sdk

"@types/node"はNode.jsの機能を使う場合に必要になります。 例えば、スキル実装の定石として、以下のようなコードがあります。 アプリケーションIDを環境変数"APP_ID"から読み込むものです。

    const alexa = Alexa.handler(event, context);
    alexa.appId = process.env.APP_ID;

このprocessはNode.jsのオブジェクトですので、 「process.env」をTypeScript上で型解決するには"@types/node"が必要になります。

"@types/aws-lambda"はLambdaの機能を利用する場合に必要となります。 しかし、単純なスキルの実装では、 Lambdaの機能を明に利用することはほとんどないでしょうから、 不要かもしれません。

型を利用してプログラムする

型情報を利用して、 「Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発」の「宇宙豆知識」のindex.jsをTypeScriptで書くと、 以下のようになるんじゃないかな。

import * as Alexa from 'alexa-sdk';

//=========================================================================================================================================
//TODO: このコメント行より下の項目に注目してください。
//=========================================================================================================================================

//Replace with your app ID (OPTIONAL).  You can find this value at the top of your skill's page on http://developer.amazon.com.  
//Make sure to enclose your value in quotes, like this: var APP_ID = "amzn1.ask.skill.bb4045e6-b3e8-4133-b650-72923c5980f1";
const APP_ID = undefined;

const SKILL_NAME = "豆知識";
const GET_FACT_MESSAGE = "知ってましたか?";
const HELP_MESSAGE = "豆知識を聞きたい時は「豆知識」と、終わりたい時は「おしまい」と言ってください。どうしますか?";
const HELP_REPROMPT = "どうしますか?";
const STOP_MESSAGE = "さようなら";

//=========================================================================================================================================
//「TODO: ここから下のデータを自分用にカスタマイズしてください。」
//=========================================================================================================================================
const data = [
    "水星の一年はたった88日です。",
    "金星は水星と比べて太陽より遠くにありますが、気温は水星よりも高いです。",
    "金星は反時計回りに自転しています。過去に起こった隕石の衝突が原因と言われています。",
    "火星上から見ると、太陽の大きさは地球から見た場合の約半分に見えます。",
    "木星の<sub alias='いちにち'>1日</sub>は全惑星の中で一番短いです。",
    "天の川銀河は約50億年後にアンドロメダ星雲と衝突します。",
    "太陽の質量は全太陽系の質量の99.86%を占めます。",
    "太陽はほぼ完璧な円形です。",
    "皆既日食は一年から二年に一度しか発生しない珍しい出来事です。",
    "土星は自身が太陽から受けるエネルギーの2.5倍のエネルギーを宇宙に放出しています。",
    "太陽の内部温度は摂氏1500万度にも達します。",
    "月は毎年3.8cm地球から離れていっています。"
];

//=========================================================================================================================================
//この行から下のコードに変更を加えると、スキルが動作しなくなるかもしれません。わかる人のみ変更を加えてください。  
//=========================================================================================================================================
export const handler = function<T extends Alexa.Request>(event: Alexa.RequestBody<T>, context: Alexa.Context, callback?: (err: any, response: any) =< void) {
    const alexa = Alexa.handler(event, context);
    alexa.appId = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

const handlers: Alexa.Handlers<Alexa.Request> = {
    'LaunchRequest': function (this: Alexa.Handler<Alexa.LaunchRequest>): void {
        this.emit('GetNewFactIntent');
    },
    'GetNewFactIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        const factArr = data;
        const factIndex = Math.floor(Math.random() * factArr.length);
        const randomFact = factArr[factIndex];
        const speechOutput = GET_FACT_MESSAGE + randomFact;
        this.emit(':tellWithCard', speechOutput, SKILL_NAME, randomFact)
    },
    'AMAZON.HelpIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;
        this.emit(':ask', speechOutput, reprompt);
    },
    'AMAZON.CancelIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        this.emit(':tell', STOP_MESSAGE);
    },
    'AMAZON.StopIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        this.emit(':tell', STOP_MESSAGE);
    }
};

ポイントとしては、以下の通り。

  • varをconstに変更しているけど、これはTypeScriptに限らず、今となってはほとんどのvarはconst/letにした方がよい。
  • javascriptの"require('alexa-sdk')"はTypeScriptのimport文に変更する。
  • 唯一エクスポートする"handler"に"export"指定を追加。
  • 登録するハンドラを正しく型付ける。これにより、ハンドラ内の実装で型による検証が効くようになる。

で、TypeScriptで型付けを行った効果として、 潜在していたバグを見つけました。 上のソースで以下のように書いている部分、

    alexa.appId = APP_ID;

Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発」のオリジナルのサンプルでは、

    alexa.APP_ID = APP_ID;

となっています。 "alexa.APP_ID"は"alexa.appId"の間違いでしょう。 javascriptだとこの手の間違いは文法上間違いではないので、なかなか顕在化しませんが、 TypeScriptだと翻訳段階(チェック機能のあるエディタだとコーディング段階)であっさりと検出できます。

なので、TypeScriptの方が開発効率も安全性も向上すると思うんだけどなあ。

おまけ: インテントオブジェクトへのアクセス

多くの場合、 インテントのハンドラでは、インテントの内容を見なければなりません。 例えば、スロットの値を取得したりします。

    'MyIntent': function () {
        let value = this.event.request.intent.slots.MySlot.value; // スロットMySlotを参照
        ...

これを単純にTypeScriptで型付けすると、エラーになります。

    'MyIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        let value = this.event.request.intent.slots.MySlot.value; // スロットMySlotを参照
        ...
[ts] オブジェクトは 'undefined' である可能性があります。

要するに、 "this.event.request"はAlexa.IntentRequestインターフェイス型なのですが、 その"intent"プロパティの定義は「Alexa.Intentインターフェイス型、またはundefined」となっており、 undefinedの場合"intent.slots"がエラーになる、と言っています。

この場合、このハンドラが呼び出されている時点でintentはundefinedでないだろうから、 以下のように書けばよいでしょう。 (intentが万一undefinedならば実行エラーとなる)

    'MyIntent': function (this: Alexa.Handler<Alexa.IntentRequest>): void {
        const intent = this.event.request.intent as Alexa.Intent;
        let value = intent.slots.MySlot.value; // スロットMySlotを参照
        ...

2018年2月 1日 (木)

Docker for Windowsでコンテナイメージの置き場所を変える

覚え書き。 Docker for Windowsで、コンテナイメージとかの置き場所を変更するにはどうするか。

  • Windowsコンテナの置き場所を変更する
  • Linuxコンテナの置き場所を変更する
  • 参考

Windowsコンテナの置き場所を変更する

構成ファイルの"graph"設定で指定する。 例えば、置き場所を"D:\Docker"にするには、 構成ファイルに以下のエントリを追加する。

{
  ... ,
  "graph": "D:\\Docker"
}

構成ファイルを編集するには、以下の方法がある。

  • 構成ファイルを直接編集する。構成ファイルのパスは"C:\ProgramData\Docker\config\daemon.json"
  • Docker for Windowsの設定GUIから編集する。設定GUIの「Deamon」で「Advanced」をオンにすると、構成を編集することができる。
【2018/02/05追記】 書き忘れていたが、 構成ファイルを編集する前に、Docker for WindowsのモードをWindows Containerにしておくこと。 デフォルトの構成ファイルはWindows Containerモードの初回実行時に生成されるし、 Linux Containerモードで設定GUIから構成ファイルを編集すると、Docker for Windowsが起動しなくなる。 (おそらく、Linux Containerの構成が変更されてしまう)

Linuxコンテナの置き場所を変更する

LinuxコンテナはHyper-VのVMの中で動く。 Docker for Windowsの稼働中にHyper-Vマネージャーを見ると、 "MobyLinuxVM"という名前のVMが動いているはず。 で、LinuxコンテナのイメージとかはこのVMの中に格納されるらしい。

というわけで、 Linuxコンテナのイメージの置き場所を変更するには、 "MobyLinuxVM"の仮想ディスクファイル(VHD)の置き場所を変えるということになる。

"MobyLinuxVM"はHyper-Vの設定に従ってDocker for Windowsが勝手に作成するので、 それはつまり、Hyper-Vの設定の「仮想ハードディスクのファイルを保存するための既定のフォルダー」を変更するということになる。

ちなみに、以下の手順を行うと、

  1. Docker for Windowsを停止させる。
  2. "MobyLinuxVM"の仮想ディスクファイルを削除する。
  3. Docker for Windowsを再起動する。("MobyLinuxVM"の仮想ディスクが再作成される)
  4. docker imagesを実行する。

pullしていたLinuxコンテナイメージがリストアップされなくなったので、 確かにLinuxコンテナイメージは"MobyLinuxVM"の中にあるみたい。

参考

あちこちに似たようなQAがあるけど、 以下が一番直接的だった。

Put "C:\ProgramData\Docker" on a different drive? Configuration option? (GitHub)

2018年1月 9日 (火)

AthlonマシンにWindows UpdateでMeltdown/Spectre対応をあてるとWindowsが起動しなくなる件

1月3日(US時間)にMeltdown/Spectre対応と思われるWindowsの修正がWindows Updateで配信されました。 Windows 10 version 1709(Fall Creators Update)向けはKB4056892ですね。

で、これを適用すると、 古いAMD AthlonマシンでWindowsが起動しなくなる現象が起こっているようです。

CPU脆弱性への修正含む「Windows」アップデートでAMDユーザーに不具合 (ZDNet Japan)

【2018/02/01追記】 この問題に対処した修正が公開されたようです。 version 1607, 1703は1/17, version 1709向けは1/31のやつ。 私はまだ試していないけど。

うちにも一台Athlon 64 X2のマシンがあり、 このマシンで同じ現象が起きました。 マシンは起動するんだけど、Windowsロゴが出た後だんまりになる。

ただ、うちの場合、記事に書かれている人のような面倒事にはならなかったので、 対処法をメモしておこうかなと。 これができるのは、

  • Windows 10 version 1703以降。かつ、
  • 以下のいずれかのエディション。
    • Pro
    • Enterprise
    • Education

の場合です。 記事の人はHomeエディションだったのかな。

うちの対処法

  • 起動後、じきに固まるので、電源をぶちっと落とす。 これを繰り返すと、三度目で復旧が走り出したので、 そのまま復旧させる。
  • 復旧したらすかさずログオンする。 ここでもたもたすると、また同じ修正が当たって起動しなくなる。
  • 直ちに「設定」-「更新とセキュリティ」-「Windows Update」-「詳細オプション」を開き、 「更新の一時停止」を「オン」にする。 この「更新の一時停止」設定はCreators Update以降のPro/Enterprise/Educationにある。

これで問題の修正が再度適用されることを防ぐことができます。 一時停止の期間は最大35日ですが、 その間には直してくれるやろ。

2017年10月28日 (土)

Docker for Windowsをアップデート/再インストールできない件

今年の春の頃からだったろうか、 家のPCのDocker for Windowsがアップデートできなくなりました。

アップデートを開始すると、 「Do you want to replace your current version of Docker for Windows with this new one 17.09.0-ce-win33(13620)?」というダイアログが出ます。 ここで「はい」を押そうが「いいえ」を押そうが、 次の瞬間「install canceled」と出て先へ進めなくなります。

一回Docker for Windowsをアンインストールして、 最新バージョンのインストーラーで再インストールを試みても同じ結果。

そのうち直るだろうと思って放っていましたが、 一向に直らない。 で、まじめに調べてみました。

対処法

レジストリの以下のキーを削除してからアップデート/再インストールを行います。

HKCR\Installer\UpgradeCodes\9CA3F2E62DBFCA74DB9BD0384695C460

最後の"9CA3F2E62DBFCA74DB9BD0384695C460"の値は、 ひょっとすると環境によって異なるかもしれません。 アップグレードコードの役割からすると、同じ値の場合が多いと思いますが。 確実を期したければ、後述の詳細をみて、確認してください。

詳細

Dockerのコミュニティフォーラムの以下のトピックを参考にしました。

Cannot uninstall Docker for Windows

ここではアンインストール時の問題として取り上げられています。 このトピックは2016年1月に始まっていますが、 長らく進展していませんでした。 キーになるのは、一年半以上も後の投稿です。

2017年10月12日 3:06のdjarvis8さんの投稿

Process MonitorでDocker for Windowsのインストーラーをモニタし、 片っ端からチェックして"HKCR\Installer\UpgradeCodes"下のキーを読んでいるのが問題だと突き止めたらしい。 すげえ。

というわけで、 私もProcess Monitorで問題のレジストリキーを探して、 それを削除したところ、無事Docker for Windowsを再インストールできました。

問題のレジストリキーは同じだとは思いますが、 環境や現在インストールされているバージョンによっては異なる可能性があります。 確実を期すならばProcess Monitorでインストーラーが実際に読もうとしている"HKCR\Installer\UpgradeCodes"下のキーを確認するとよいでしょう。 結構めんどくさいけど。

2017年4月 6日 (木)

PCの時計が1時間進む問題が完全に解決した

前回の続き。 PCの時計が1時間進んでいる問題ですが、 私のPCに関しては問題は完全に解決しました。 わーい。

  • 前回のあらすじ
  • 現状の確認
  • PCメーカーのサポートに問い合わせた→解決
  • 考察など
  • まとめ

前回のあらすじ

  • 自分のPCの時計が1時間進んでいた
  • 原因はPCのファームウェアの設定のせいと確信(thanks to 「「PCの時計が1時間ずれている」の原因 」)。 要するに、四半世紀前ならともかく、現在においてはまったく意味のない"Daylight Savings Enable"がなぜか有効になっているPCがあるということですね。
  • 突如、Microsoftが「修正した」とのニュースが→「えっ?」

現状の確認

Microsoftが修正したとのニュースに「ほんまかいな」と思いつつ、 1日ほど様子を見てました。 しかし、修正は落ちてきませんし、 ツールで覗くとReal-Time Clockの"Daylight Savings Enable"のビットは立ったままです。

念のため、以下の手順で実験をしてみました。

  1. PCのLANから切り離す。WiFiも無効にする(タイムサーバーとの同期を防ぐため)。
  2. Windows上で現在時刻を2017年4月3日午前1:55にセットする。
  3. PC電源を電源を切り、10分放置する。
  4. (10分後に)電源を入れる。
  5. Windows上で時刻を見る。

この結果、時刻は午前2:05頃になっているはずですが、実際には午前3:05頃になっていました。 "Daylight Savings Enable"の仕様通り、午前2時がスキップされています。

(あれ、4月2日だったっけな。 手元に残したメモには4月3日ってあるけど、 "Daylight Savings Enable"の仕様を厳密に解釈すると4月2日が正しいような気がする。 でも、もう直ってしまったので再現させて検証できない… まあ、午前2時がすっ飛ぶ現象が起きたのは確か。)

つまり、時計がずれる問題は直っていない。

PCメーカーのサポートに問い合わせた→解決

ここで意を決して、 PCメーカー(富士通)のサポートに問い合わせを投げました。 問題のPCは富士通 LIFEBOOK WA3/Wです。 これが昨日の夜。

で、今日返事がきました。

(意訳)BIOSアップデートしなはれ。

あー、確かに。 サポートに問い合わせる前に確認するべきでした。 最近、ドライバもほとんどWindows Updateで更新されるので忘れてたよ。

で、サポートページでBIOSを探すと新しいものがありました。 Readmeを見ると、ちゃんと載っているじゃないですか。

■ 5.改版履歴(修正項目)

...略...

(1.20)

  • パソコンの安定性を改善しました。
  • ごく稀に、4月と10月にパソコン内蔵の時計が1時間ずれることがある問題を修正しました。

わーい。 さすがFMVサポート。 こんなくそ面倒くさい問い合わせ分かってもらえるんだろうかと思って、 こんなツイートしてたんですけど、

えらそうなこと言ってほんますいませんでした。

BIOSアップデート後、"Daylight Savings Enable"はちゃんとDisableになっているし、 上記実験をしたら、ちゃんと再起動後の時間が午前2:05になってました。

直った。

考察など

Microsoftが修正したってのは何?

何でしょうねえ… どこかにコミュニケーションミスがあったのかも。 英語サイトを色々検索したんだけど、「修正した」ってニュースは他に無さげだし。 「PCの時計が1時間ずれている」の原因 を書いた人は、 その続編(「PCの時計が1時間ずれている」の原因の解説)で Microsoftのタイムサーバーのマシンでこの現象が発生したんじゃないか、と言ってます。 うーん。 でも、そうだとすると、Windowsの時刻の同期間隔はデフォルトで一週間と聞いているので、 「影響を受けたPCの時計は、日本時間4日未明までに自動で直っているという。」(「PCの時計が1時間ずれる」グローバルで発生「修正した」とMS)なんて言えないんじゃないかな。 よくわからない。

どうして今回だけ騒ぎになった?

これも分からない。 ただ、検索してみると、過去にも時間がずれたという声はあるし、 私も、前に時間がずれて「あれー」と思いながら直したことをぼんやり思い出したし、 実は以前から結構発生してたのではなかろうか。 今回、声が目立ってニュースにも取り上げられたということかも。

あと、最近広く採用されたBIOSにそういう設定のものがあったのかも知れない。

メーカーはもっと広く知らせるべきでは

と思うんだけど、 BIOSアップデートだとするとあんまり安易に勧められないしなあ。 Windows Updateでなんとかならんのだろうか。 ボードのファームウェアとなるとWindows Updateレベルでは難しいのかな。

結局、PC側の原因で問題が発生するのはどういう場合?

  • RTCの"Daylight Savings Enable"がEnableで、
  • RTCがずれるタイミングでPCが動いておらず(停止 or スリープ)、
  • その後PCを起動した場合(電源投入 or スリープ解除)

は確実に起こるかな。 OSがRTCと同期するとずれた時刻がOSに伝わる。

PCが稼働中にRTCがずれた場合はよくわからない。 OSがRTCに書き込む機会があるかどうかに依存するでしょう。

Windowsだけの問題?

いや、違うと思う。 ボード上のRTCがずれるんだから、 ずれた後に起動すれば例えばLinuxでも時間がずれるでしょう。

ただ、Linuxとかの場合、 どういうタイミング・方法でntpサーバーと同期しているのか知らないので、 その影響はよくわからない。 Windowsより短い期間で同期しているマシンが多いような気がする。 知らんけど。

まとめ

PCの時計がずれて直っていない人は、 PCメーカーからBIOSの更新が出ていないか確認してはどうでしょうか。

ただ、 BIOSアップデートは無条件にお勧めできるものでもないので、 アップデートするかどうかは注意事項をよく読んでからお決めください。

2017年3月 4日 (土)

SourceTreeでGit LSFを使うには

【要約】「リポジトリ」-「Git LFS」メニュー

分かれば簡単だけど、しばらく迷ってうろうろしたので覚え書き。

SourceTreeはGit LFSに対応していると聞いたのに、 どうやればリポジトリの扱いをGit LFSモードにできるのかが分かりませんでした。 「リポジトリ設定」の画面にも設定ないし。 ヘルプとか検索かけても出てこないし。

が、まあ、気づけば簡単で、 メニューに「リポジトリ」-「Git LFS」という項目がありました。 そのサブメニューの「Initialize Repository」から始めれば、 あとはだいたい見当ついた。

それだけ。

2016年11月23日 (水)

VS2017RCでローカルのDockerコンテナ上でアプリをデバッグ実行しようとすると"MSB4018"エラーになる問題

覚え書き。

問題点

"Connect(); 2016"のキーノートのデモで、 Visual Studio 2017を使ってASP.NET CoreアプリをローカルのDockerコンテナで動かすというやつ(ビデオでは1時間10分頃から)があります。 それを見て、いっちょやってみようと思うわけです。

ということで、Visual Studio 2017 RCとDocker for Windowsをインストールし、 「ASP.NET Core Webアプリケーション」をテンプレートから作り、 Docker上でデバッグ実行しようとすると、 以下のエラー(MSB4018)が出ます。

"PrepareForLaunch" タスクが予期せずに失敗しました。

Microsoft.DotNet.Docker.CommandLineClientException: Creating network "webapplication12161511896_default" with the default driver

Building webapplication1

Creating webapplication12161511896_webapplication1_1

ERROR: for webapplication1 Cannot create container for service webapplication1: E: drive is not shared. Please share it in Docker for Windows Settings

Encountered errors while bringing up the project..

解決法

Docker for Windowsにドライブ共有の設定を追加します。

Docker for Windowsの"Settings"画面の"Shared Drives"タブを開いて、コンテナがローカルディスクを参照できるようにします。 要するに、 ここに書いてある設定を行う。

私の例の場合、プロジェクトを置いているドライブ(E:ドライブ)とシステムドライブ(C:ドライブ)の両方を共有する必要がありました。

また、セキュリティソフト等でファイヤーウォールが有効になっている場合、 Docker for Windowsのネットワーク上(デフォルトでは 10.0.75.0/24)でWindowsのファイル共有(TCPのポート445)が通るようにしておかなければなりません。 その説明は、ここ。 具体的な設定の仕方は使っているセキュリティソフトによって異なります。

まあ…

Visual Studio Tools for Dockerのドキュメントにはちゃんと説明されているし、 エラーメッセージもちゃんと読めば指示が書いているんですけどね。 キーノートのビデオ見て「いっちょやったろ」とそのままやってみたら、私のようにはまるかなと。

2016年11月15日 (火)

LINEモバイルでLINEのSMS認証をスキップする件

子供らのスマホをWindows 10 Mobileにした話の続き。

結局、LINEモバイルに移行しました。 LINEフリープランを二人分で月1000円。 音声/SMSなし、LINEの基本サービスは使い放題で、その他は月1GB。 まあ、現在の使い方だと月1GBあれば十分です。

で、LINEモバイル採用の理由のひとつは、 SMS/音声認証不要のLINE登録なのですが、 そのやり方ではまったので、覚え書き。

LINE登録時のSMS認証のスキップ方法

LINEモバイルの「よくある質問・ヘルプ」の 「データSIMのSMSが使えないプランでもLINEの登録は可能でしょうか?」の項目には次のようにあります。

端末のWi-Fi接続をOFFにしてLINEアプリのアカウントを作成するとSMS認証をスキップすることができます。

というわけでやってみました。

WiFi接続を切り、LINEモバイル回線に接続した状態にし、 LINEアプリを起動、新規登録を選択。 しかし、そこは通常通り電話番号を入力する画面です。 他に選択肢はない。 SMS認証をスキップしてくれるんじゃないのか。

仕方ないので、データ回線の電話番号を入れます。 データ回線にSMS送られても受け取れないけど。 そして、「次へ」を押すと、この画面(この図の電話番号はフェイク)。

登録画面

あかん。 どうしてもSMSを送ろうとする。 いろいろ探したけど、ほかのルートはない。 仕方ないのでサポートに問い合わせました。 「Windows Mobileのアプリではできません」とか言われるんじゃなかろうかと泣きそう。

回答:「そのまま『次へ』を押せ」。

「次へ」を押すと、そのまま直ちに登録が完了しました。 「SMSで認証番号を送ります」ははったりであった。 なんやねん。

ということで、目的は達しました

LINE使えてます。 回線も問題ありません。 家庭内でスタンプが飛び交っています。 私はPC使っていることが多いので、 「お父さんに連絡する場合はSlackで送ってくれ」と言うわけですが、 常用デバイスがPCって年寄り扱いですよ。

2016年9月28日 (水)

Windows 10上のコンテナでLinuxイメージもWindowsイメージも同時に扱えるようになった(追記あり)

8月4日のエントリ「Windows 10のコンテナ機能とDocker for Windowsを共存させる上での問題点」に書いたように、 Windows 10 Anniversary Update(version 1607)ではコンテナ機能が使えるようになりましたが、 Windowsイメージを動かすエンジン(Windows 10 Container)とLinuxイメージを動かすエンジン(Docker for Windows)は共存できませんでした。

が、どうやらDocker for Windowsは、 ベータ26以降、 LinuxイメージもWindowsイメージも動かすことができるようになったようです。

Run Linux and Windows Containers on Windows 10

【2017年1月21日追記】 1.13.0以降、ベータでなくとも(Stable版でも)Docker for WindowsでLinux/Windows両方のコンテナが扱えるようになりました。

ということで、Windows上の各コンテナエンジンをいったんアンインストールして、 Docker for Windowsのページからベータ版をダウンロードしてインストールしました。 すると、上記ブログのアニメーションGIFの通り、 Docker for Windowsのタスクトレイアイコンから出るメニューに「Switch to Windows Containers...」が現れ、 これを選択するとdockerコマンドがWindows向けエンジンとつながるようになりました。 やったー。

が、まあ、Windowsイメージについては、 8月4日の別エントリ「Windows 10のコンテナ機能(Docker for Windowsじゃないよ)が動かない話と気になった点」に書いた ”The process cannot access the file because it is being used by another proces”問題が再現して動きませんでしたけど。 これ、解決しないなあ。

あと、Windows 10のコンテナ機能は、 開発者向け機能という位置づけです。 念のため。 運用向けには、今週”Microsoft Ignite 2016”で発表されたWindows Server 2016上のコンテナを使えということでしょう。

Igniteと同時に発表されたDockerのブログを見ると、 Windows版コンテナはDockerが深くかかわっているようですね。 "containers on Windows Server 2016 are powered by Dock"だと書いていますし、 "Docker containers run natively on Windows"と"container"ではなく"Docker container"と言い切っています。 2014年秋に「MicrosoftとDockerが協力してWindows Serverにコンテナを実装するよ」という発表をしていましたが、 出てきたモノは思ったよりDockerそのものらしい。

ということで、 Docker for WindowsがLinuxイメージの扱いとWindowsイメージの扱いを統合してくれる、 というのは自然な流れなのかな。

2016年9月12日 (月)

子供らのWindows 10 Mobileの話(高まるLINE圧力編)

先日の「子供らの「つなぎ携帯」をWindows 10 Mobileにしてみた話」のつづき。

子供らは手に入れたスマホを熱心にいじっています。 まあ、しばらくの間はねえ。 「勝手にゲーム入れるなよ」と言っておいたのですが、 下の息子はそれならばと、 ブラウザで昔懐かしいCookie Clickerを始めました。 今日もひたすらクッキーを増やしております。

さて、 LINEをどうするかという問題が懸案として残っていました。 特に娘は部活のメンバーがLINEを使っているし、 妻が日常的にLINEを使っていることもあって、 「LINE入れろ」圧力が家庭内で高まっております。

問題点は、 データ通信しか契約していない回線でどうやってLINEの初期認証を行うかでした。 多少じたばたやってみたので、その覚え書きのようなもの。

  • LINEのFacebook認証はWindowsでは使えない
  • MVNOではLINEの年齢認証ができないらしい
  • LINEモバイルとな?

LINEのFacebook認証はWindowsでは使えない

電話番号なしでLINE登録といえば、Facebook認証。 しかし、色々試したのですが、 結局WindowsではFacebook認証は利用できないようです。

※Facebook認証は、iOS⋅Androidのみ利用可能です。
SMSが使えず、Facebookによる認証も行えない場合、LINEに登録することはできません。

LINEのヘルプ - Windows Phoneから「SMSが使えない場合はどうしたらいいですか? 」

だそうです。

もう面倒くさくなって、 娘のWindows 10 MobileにLINEアプリを入れ、 家の固定電話の電話番号と関連付けてしまいました。

でも、 うちには他に余っている電話番号がないから、 息子がLINEやりたいといい始めたらもう使える番号がない。

MVNOではLINEの年齢認証ができないことがある

年齢認証はキャリアの契約情報を見ているようで、 MVNOのSIMでは年齢認証できないことがあるようです。 年齢認証できないと、ID検索等の一部サービスが利用できません。

年齢認証は、au(KDDI)、NTTドコモ、ソフトバンクモバイル各社が提供する年齢情報判定サービスを利用し、18歳未満かどうかを確認しています。
契約したSIMが上記3社で提供している年齢情報判定サービスをご利用いただけない場合、年齢認証はできません。

LINEのヘルプから「格安SIMを利用しているが、年齢認証ができない」

この書き方だと「できる場合もある」ようですが、 Webでほかの人の書いているのをざっと見た印象では、 「ふつうはできない」感じ。

まあ、うちの子らはどっちみち年齢認証できる年齢じゃないから関係ないけど。

LINEモバイルとな?

そんなこんなでやっていると、 タイミングよくLINEモバイルが発表されました。

LINEモバイル

一番安いプランだと、

  • LINEの基本的な機能(LINE通話も含む)は使い放題
  • その他のデータ通信は1G/月

で、500円/月。 うちの用途だと、 コミュニケーションをLINE中心にすれば、このプランで十分まかなえるんじゃなかろうか。 子供二人分だと1000円/月で、現在の約2000円/月の半額。 まあ、データ容量は少なくなるし、おまけで運用しているわしのSurface 3の分がなくなるけど。 しかも、SMSなしでアカウント登録できるし、年齢認証にも対応。 ごちゃーごちゃやってた苦労がいらんようになるやないですか。

2週間早く発表されてたら申し込んでいたと思うけど、 もう事務手数料払ってDMM mobileと契約しちゃったからなあ。 正式提供は10月1日からのようなので、 その後回線の評判がよいようならば、 乗り換えるかも。

ということで、 家族グループ内でスタンプが飛び交っております。