作業記録

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年4月 4日 (火)

PCの時計が1時間進む問題が発生したので調べてみた(もう答は出た、と思ったけどなんか混迷している)

昨日(4月3日)、私のPCの時計が1時間進んでいるのに気が付きました。 どうやら、同じ目にあっている人が多数いたようです。

「PCの時計が1時間ずれている」報告多数 (ITMedia)

気持ち悪いので少し調べてみました。 なんですけれど、今日タイムライン上で以下の記事を知りました。 答はこれで決まりでしょう。 (と思ったんだけど、今ちょっとわけわからん状態になっている。「で、どうするよ」の項で後述)

「PCの時計が1時間ずれている」の原因 (Tactful Answer)

ですが、せっかく簡単な実験などしていたので、 書き残しておきます。

  • 観察
  • 実験
  • で、どうするよ

観察

4月3日夜、家の帰ってPCをスリープから復帰させてしばらくして、時計が1時間ずれていることに気づきました。 家にPCが数台ありますが、自分のノートPC1台のみ時計が進んでました。

で、イベントログの「システム」でスリープ前後を見ると、 以下のようなログが残っていました。

時刻 ログ
2017/04/03 0:32:53
システムがスリープ状態になります。

スリープの理由: アプリケーション API
2017/04/03 0:32:54
システムがスリープ状態から再開されました。
2017/04/03 20:57:35
システム時刻は ‎2017‎-‎04‎-‎02T15:32:54.726613700Z から ‎2017‎-‎04‎-‎03T11:57:35.500000000Z に変更されました。

変更の理由: システム時刻がハードウェア クロックと同期されました。

時刻はUTCで出ていますが、 日本時間に直すと、 4/03 0:32にスリープしています。 その後、スリープから復帰し、直後にハードウェアクロックと同期しています。 この際のハードウェアクロックの時刻は20:57です。 「再開しました」ログのタイムスタンプが0:32:54なのは、クロック同期前なので、スリープ時点の時刻が出てしまっているのでしょう。

記録されたスリープ時の時刻は前夜の記憶通りで正しいものです。 一方、PCを再開したのは20時前でした。 つまり、復帰時にハードウェアクロックが1時間進んでいる。

復帰時のハードウェアクロックが進んでいるので、 OSではなくPCのクロックの問題なんだろうと思って、 以下のようなツイートをしました。

実験

で、今朝(4/04)、ちょっと実験をしてみました。 出勤前に、PCに以下の操作をしました。

  1. PCをLANから切り離す(WiFiも無効にする)
  2. PCを再起動し、Windowsは起動させず、BIOS画面で時間を4/02 23:30にする
  3. 電源を切る

夜、帰宅後に電源を投入し、そのままBIOS画面を出して時間を確認しました。 すると、予想通り、朝ずらした時間から予期される時間よりも1時間進んでいました。

LANに繋がず、OSも動かしていない状態で時計が進んだので、 OSもタイムサーバーも無関係。

この結果は、 冒頭に紹介した記事(「PCの時計が1時間ずれている」の原因 )の説明と整合します。

で、どうするよ

先の記事の説明に従って自分のPCを調べたところ、 確かにPCの"Daylight Savings Enable"設定が有効になっていました。 これが有効だと、4月と10月にPCのクロックがずれます。 つまり、この先も半年ごとに時間がずれることになります。 自分はツールで設定を変更するとして、 一般ユーザーとかどうするんだろうか。 これは多分工場出荷時の設定がこうなっているんだろうから、 メーカーのサポートに連絡した方がいいんだろうか、 とか思っていたところ、 Microsoftが修正(!)したとのニュースが。

「PCの時計が1時間ずれる」グローバルで発生「修正した」とMS (ITMedia)

いったい、どうやって? Windowsから"Daylight Savings Enable"を無効化してくれるのか? まさか、強制的に時刻同期させて終わりじゃないよな? 半年後またずれるし。

疑いをもちつつWindows Updateを試みましたが、 なにも落ちてきません。 念のため、先のツールで再チェックしましたが、 "Daylight Savings Enable"は有効のままです。

謎。しばらく様子見。

あともう一つ疑問があって、 なんで今回のみ騒ぎに? そういえば、このPCにしてから時計がずれていたことが以前にもあって、 「あれー」と思いながら時計を合わせたような覚えがぼんやりとあるんだけど、 今回これほど騒ぎになったのはなんでだろう? 最近よくPCに採用されているボードがこの設定になっているとか?

2017年1月26日 (木)

認証プロキシをなんとかするためにツールを作っている話

【要約】認証プロキシをなんとかするためにツールを作ってGitHubで公開した。

経緯

社内ネットワークからhttp/httpsで外部に出る際にはプロキシを通さなければならない、 という環境は多いと思います。 こういうプロキシの中にはユーザー名とパスワードを入れないと通してくれないタイプのものがあります。 認証プロキシというやつですね。 これは本当に頭痛のタネです。

さすがにブラウザとかは認証プロキシに対応しているのですが、 これに対応していないソフトウェアも結構あります。 今時いろんなソフトウェアがhttp/httpsで通信していまして、 特に開発系のツールは必要なコンポーネントをhttp経由で自動的に取ってくるみたいな動作をすることが多いのです。 こういうソフトウェアの多くが素の状態では認証プロキシを通らない。 家で試すと特に問題なく動くツールが、 会社環境だと意味不明なエラーで動かなくなったりします。

ここ二三年、 わけのわからないエラーが出るたびに、 どれが引っかかっているのか調べ、 その設定方法を調べ、 ちまちまと設定しては乗り切っていました。 結果、あちこちの設定ファイルに認証プロキシのパスワードが埋め込まれて、 なにかが間違っているような気がするわけですが、 まあ、仕方ないね。

が、最近Visual Studio 2017 RCのアップデートが認証プロキシ環境内で帰ってこなくなり、 対処方法が皆目わからないという事態が発生するに至って、 我慢の限界を越えました。 こんなもん、やっとれるかーーーーーーーー。

というわけで

ツールを作りました。

これはWindowsのデスクトップ上でローカルプロキシとして動作します。 動かすと、現在のユーザーのプロキシ設定を書き換え、 自分をプロキシとして登録し、 ソフトウェアからの通信を中継します。 で、本来の認証プロキシが認証を要求すると、 通信元のソフトウェアに帰ることなく認証情報をつけてリクエストを再送信します。 結果として、 ソフトウェアが普通のプロキシにふつうに対応していれば、 そのまま通信できます。 中継はタスクトレイのアイコンから簡単にON/OFFできます。

これは認証プロキシを回避するものではありません。 認証プロキシに対応していないソフトウェアのhttp/https通信を中継して、 正しく認証プロキシを通すようにするものです。

効能としては以下の通り。

  • 認証プロキシ環境内で認証プロキシ非対応ソフトウェアを利用することができます。
  • 認証プロキシのパスワードをあちこちに書かなくてすみます。 パスワードは暗号化された状態で設定ファイル一箇所にあれば十分です。 (まあ、元々認証プロキシのパスワードはあんまり安全でないやり方でやりとりされますので、気休めではありますが)
  • 仮想化ソフトウェア(Hyper-Vなど)が定義したマシン内ネットワークに対する(通常)プロキシとして利用できます。 これを利用すると、 「プロキシの設定を埋め込んだままのイメージを公開してしまった!」という事故をやらかしても、 パスワードが埋め込まれないため、多少状況はましになります。

GitHub上で公開しています

設定ウィンドウとかまだ実装できていないけど、 とりあえず役立つ程度には動いているので(Visual Studio 2017 RCのアップデートもできたし)、 tu公開します。 モノはGitHub上にあります。 ツール名は「認証プロキシ爆発しろ!(英語名は MAPE: May Authentication Proxy Explode)」です。

ipponshimeji/MAPE (GitHub)

詳細な説明とかは、 以下のページから。

目次 - 認証プロキシ爆発しろ! (GitHub)

手っ取り早くどういうものか知りたい方は、特に以下のページを。

認証プロキシでお困りの方はお試しくださいまし。

ちなみに

Windows環境で認証プロキシをなんとかするにはFiddlerを使う技とかもありますが、 以下の理由から独立したツールを作りました。

  • Fiddlerを使う場合、Fiddlerのスクリプトをいじる必要(しかもちょっと複雑)があり、 非開発者な人に「これを使えばなんとかできます」とか言いにくい。
  • 自動構成スクリプトでプロキシが設定されている環境では、 Fiddlerのプロキシ設定書き換えは「次で始まるアドレスにはプロキシを使用しない」を設定してくれない。 認証プロキシが設置されているような環境では自動構成スクリプトを利用していることが多いでしょうから、 これは面倒の元になりがちです。

なお、Fiddler自体は便利なデバッグツールとして利用させていただいております。

【2017年4月11日追記】

上にはこう書きましたが、 「次で始まるアドレスにはプロキシを使用しない」に相当する設定がありました。 すいません。

2016年12月 8日 (木)

Microsoft Cognitive Servicesがうらやましいのでパチもんを作ってみた

Fujitsu Advent Calendar 2016の8日目です。 なお、このエントリは個人の立場で書いております。

ディープラーニング関連の話を書こうと思います。 とはいえ、あまり技術的なものではないです。 技術的にすごい話は11日目のsakaiakiraさんや、 他の方が書くでしょう。 ここでは、ディープラーニングを勉強していて湧き上がる心の叫びのようなものを取り上げ、 その勢いでとあるサービスを特に意味なく実装することを試みます。

思うこと

要約すると、だいたい以下になるんですけど、

  • MicrosoftのCognitive Servicesがうらやましいという妬み
  • 自分がろくなデータを持っていないという悲憤

念のため。 これは私個人の話です。 富士通としてはディープラーニングをばりばりやっているところがあるはず。

今、多くのソフトウェア開発者がそうだと思いますが、 私もディープラーニングをぼちぼち勉強したりしております。 私としては、 ディープラーニングそのものももちろん興味深いのですが、 それをプラットフォームにしたり、 サービスにしたりといった方面により興味を持っています。

そういう意味で、 各クラウドの機械学習サービスだとか、 Microsoft Cognitive Servicesだとか、 GoogleのCloud Vision APIだとかを「いいなー」と見ています。

特に、 Microsoft Cognitive Servicesいいですね。 このCognitive Servicesには色々なサービスが含まれています。 LUIS(Language Understanding Intelligent Service)とかも重要そうですが、 私のお気に入りはEmotion APIです。 ディープラーニングの面白さがシンプルに出ていると思う。

Emotion APIは、 画像を送りつけると、 その中から人間の顔を検出し、 どういう感情を持っているかを推測します。 こんな感じ。

Emotion APIの画面

この例では、 お子さんの顔を検出して、 "happiness"とか"anger"とか8種類の観点での「確率」を計算しています。 この値はこの裏で動いている学習済みモデルの計算結果であり、 正確には確率とは言えないと思うんだけど、 全部足すと1になるように調整されているようなので、 確率っぽい数字になっています。 ここでは「確率」と言っちゃいます。 この例では"surprise"成分90%ですね。

Emotion API本体はJSONを返すWeb APIですが、 以下のWebページでAPIの動きを試すことができます(上の図はこのページ)。

Emotion API (Microsoft Cognitive Services)

Emotion APIは今年春先のBuildイベントで発表されました。 その際に私は「ほほう」と思ったもんで、 いろんな画像を突っ込んでみてブログを書きました。

Microsoft Cognitive ServicesのEmotion APIを使ってみた (使って色々思いを馳せた編) (2016年4月2日)

でですね、 こういうのを提供できるっていうのは、 大量に自前データを持っているからだと思うのです。 Microsoftも色々言われながら、 Bingやめなかったのが生きてますね。 API化するなら、自前データだよなあ(「自前って何」と考えると意外と難しいけど)。

ひるがえって自分なのですが、 いろいろお勉強して、 いっちょやってみよー、 と周りを見回すと、 ろくなデータがないのです。 今まで生きてきて私は何をしていたのだろうかと思ってしまいます。 ディープラーニング学習させるには、 従来とは桁違いの量のデータが必要だと思います。 かろうじて量があるのはテキストベースのデータなのですが、 自然言語は一筋縄ではいかないしなあ。 今の業務上も、あんまり処理するよによさげなデータが出てこない。

そこを工夫してデータを探し出したり、 公開情報をあさったり、 データを持っている誰かのところに出向いたり、 なんとか考えるんだ、というのは分かります。 分かります。 が、個人的にブログでぶっちゃけるぐらいはいいだろう。 「きちんとラベル付けられた大量で自前のかっこいいデータがほしい!(なるべく汎用API化できそうなやつ)」

ということで

以上で言いたいことは大体尽くしているのですが、 それだけではなんですので、 この思いをコードに託し、 Emotion APIの如きサービスを立ち上げてみました。

このサービスは、 顔の画像を送りつけると、 いくつかの観点それぞれに該当する「確率」を返します。 Emotion APIが"happiness"とか"anger"の「確率」を返すのと同様です。 その分類の数はEmotion APIの8分類をはるかに凌駕する10分類です。

では、そのサービスを試してみましょう。 Web APIももちろん用意していますが、 とっつきやすいWeb GUIもあります。 操作はEmotion APIの画面と一緒です。 先程のEmotion APIのお子さんの画像を入れてみると、こんな感じ。 スタイルが本物に比べるとしょぼいけど、気にしない。

Digit APIの画面

はい。 このサービスでは、 顔がどの数字(0-9)に一番似ているかを判定します。 顔の領域の検出機能は残念ながらありません。 というか、入力画像が顔であるかどうかも実は気にしていません。

お察しの通り、 このサービスはディープラーニングにおける"Hello World"たるMNISTをそのまま動かしています。 0-9の手書き数字を認識させるというやつですね。 手書き数字を識別するために訓練されたモデルに 何の関係もない画像を無慈悲に流し込むという鬼畜のごとき所業です。 CNNの無駄遣い。 しかも、 MNISTの入力に合わせるため、 入力画像は問答無用に28 x 28のグレースケールにリサイズします。

要するに、 学習すべきいけてるデータを持たないので、 思い余ってMNISTをそのままAPIにしてみました。 サービスのURLは以下です。

Ipponshimeji Cognitive Services - Digit API

【2017年1月17日追記】 このサービスの稼働は年末で終了させました。

モデルの学習は、 Microsoft Cognitive Toolkit (CNTK)を使っています。 以下のサンプルの03_OneConvDropout.cntkをほぼそのまま実行しています。

CNTK/Examples/Image/GettingStarted/ (GitHub)

ただし、最後の出力だけ変えています。 目的がクラス分けではないので、各ノードの値をSoftmaxを通して「確率」が出力となるようにしています。 この変更も含め、 サービスのソースもGitHubに置いています

CNTKの評価ライブラリの利用については、 はまったところもあるので、 覚えていればまたブログに書きたい。

注意事項など

このサービスはアドベントカレンダーの期間中くらいは動かすつもりです。 Azure Web AppsのB1インスタンス1個(1コア)で弱々と動かしています。 スケールさせるような余裕はありません。 まあ、そんなことはないと思いますが、アクセスする酔狂な人が大量にきたらパンクするかもしれない。

また、判定した画像は保存していません。 ローカルマシンのファイルをアップロードして判定させた場合でも、 そのファイルは保存しません。 メモリ上だけで処理しています。 ただ、「全体でリクエストがいくつあったか」「判定結果」だけはログを取ります。 どの数字に似た画像が多いのかはちょっと興味あるし。

あと、再度念押しですが、このサービスは個人的に勉強がてら作って試しているものです。

おわりに

このサービスの実用性はまったく無いんですけど、 せっかく作ったので、 「誰の顔が一番数字の4に近いか」勝負とか、 忘年会の余興にでもご活用ください。

何人かの写真をぱしゃぱしゃ撮って、 スコアを出して順位をつけるスマホアプリとか作ってくれてもええんやで。

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年5月 8日 (日)

ココログの「スマートフォン表示」に無理矢理スタイルを設定してみた

このブログ、 「PC表示」〔ママ〕に対してはスタイルを設定していましたが、 「スマートフォン表示」〔ママ〕に対しては設定していませんでした。 というか、 ココログの追加料金なしのプランでは「スマートフォン表示」にCSSを設定する方法がありません。

携帯版のブログのデザインをカスタマイズすることはできますか? (公式FAQ)

でも、素の「スマートフォン表示」は、 箇条書きが箇条書きにならないし、 表に枠がつかないし、 インデントもうまくできないし、 非常に見づらい。 制限の多かったガラケー時代の名残なのかな?

まあ、 モバイル系がこのままなのもアレなので、 頑張って「スマートフォン表示」に独自CSSを設定する方法を探しました。 結果としては、スマートフォンではなんとかなったんじゃないかな? ガラケーでどう見えているかはわからん。 ガラケーで見ている人はすいません。

別に小綺麗にしたいわけではなく、 単に文章構造を明確にしたいだけなんですけどね。 まあ、ちゃんとカスタマイズできる他のブログサービス使えと言われれば、 そうなんだけどさ。

まず、「カスタムCSS」について確認

ココログのブログ管理ページの「デザイン」の項には「カスタムCSSを編集」というメニューがあり、 独自CSSを設定できます。 しかし、「カスタムCSS」機能は「PC表示」にのみ有効で、 「スマートフォン表示」には反映されないようです。

では、「スマートフォン表示」に有効な独自CSS編集機能は?

前記FAQの通り、追加料金が必要。

なんとか追加課金なしでできないか?

直接的な方法はないし、 可能だったとしても「PC表示」と「スマートフォン表示」で別々のCSS書くのもいやだし、 どうしたものかな、 と考えていたところ、 ファビコンを設定した方法を思い出したわけです。

ファビコン(ブログアイコン、サイトアイコン)を設置してみましょう

これは要するに、 ココログの設定の「ブログのサブタイトル(キャッチフレーズ)」に設定した内容は、 HTML要素も含めてそのままページに埋め込まれるという仕様を利用した方法です。 そんなんでいいのか。

まあともかく、 この方法を流用し、 「ブログのサブタイトル(キャッチフレーズ)」にファビコンを参照するlink要素と並べて、 独自CSSを参照するlink要素を追加したら、 「スマートフォン表示」でもCSSが効くようになりました。

CSSは少し手直しが必要でした。 「PC表示」と「スマートフォン表示」でページの構造が結構異なります。 で、その各構造に割り当てられているクラス名がずいぶんと違う。 が、entry-contentというクラスが記事のコンテナとして共通に存在するので、 それを手がかりにスタイル設定対象を限定できました。 こんな感じ。

.entry-content td, .entry-content th {
  border: solid thin #999999;
  padding: 0.3em;
}
...

後は、 「PC表示」用に従来設定していた「カスタムCSS」は設定が重複するので削除して、 作業完了。 めでたしめでたし。

問題点

「ブログのサブタイトル(キャッチフレーズ)」の内容は、 ブログのページのh2要素の中に埋め込まれます。 ということで、 ページは以下のようになっております。 (このHTMLは説明のためのモノで、指定されているURL等は正しくありません)

<html>
...
 <body>
...
  <h2>サブタイトル
   <link rel="shortcut icon" href="favicon.png">
   <link rel="stylesheet" type="text/css" href="my.css">
  </h2>
...

h2要素中にlink要素を入れてよいのだろうか?

HTML5では大丈夫。 h2要素の内容はフレージングコンテンツであり、 link要素は条件付きでフレージングコンテンツと見なされる。 その条件とは、itemprop属性が存在する場合。 なので、itemprop属性を追加しておきましょう。

厳密には、文法的に許容されるというだけで、 head要素中に記述された場合と同じように機能する保証があるのかはよく分からんが、 まあ主なブラウザで機能しているみたいだし。

なので、 HTML5な「PC表示」ではOK。 ところが、 「スマートフォン表示」はXHTML 1.0なのです。 XHTMLでは、本当はだめだと思うなあ。 XHTMLではh2要素の内容モデルはテキストかインライン要素で、 インライン要素にlink要素は含まれない。 でもまあ、Windows 10 Mobile, iOS, Androidの標準ブラウザで効いているみたいだから、 いいや。

2016年4月 2日 (土)

Microsoft Cognitive ServicesのEmotion APIを使ってみた (使って色々思いを馳せた編)

前回のMicrosoft Cognitive ServicesのEmotion APIを使ってみた (サンプルをビルドする編)の続き。 画像からの感情読み取りに興味をそそられた私が、 様々な画像をEmotion APIにかけて、はるかなるディープラーニングに思いを馳せる回。

まずは、サンプル

まずは、サービス側が用意しているサンプル画像を読み込ませてみます。 サンプルアプリの左のペインで、"Detect emotion using a URL"を選択します。 デフォルトでサンプル画像へのURLが設定されていますので、そのまま"Detect"をクリック。

サンプル画像の解析結果

三人分の顔が認識され、それぞれから検出した感情値(Emotion score)が表示されます。 右のペインには、各人の顔とそこから検出した感情値のうち、上位二つが表示されています。 下のペインには詳細が出ます。この画像で見えている部分は子供の分の結果ですね。 お子さん、NeutralよりSurprise成分の方がありそうな気がするが。

ふむ。

自分の写真

次に、自分の写真を読み込ませてみました。 左のペインで、"Detect emotion using a stream"を選択し、 PC内の自分のドヤ顔写真をアップロードします。

アプリのステータスバーを見ると、 "Microsoft will receive the images you upload and may use them to improve Face API and related services. By submitting an image, you confirm you have consent from everyone in it." とあります。 画像ファイルを直接アップロードする場合は、機能改善に使われる可能性があるということで、 私のドヤ顔が改善上の大論点になる可能性もあるわけですね。 いいけど。

で、結果。 キャプチャ画像は出しませんが、

  • Happiness:0.274908
  • Contempt:0.028495

だそうです。

「表面上おとなしく暮らしているが、心の底では世界を呪っており、押そうとしたバスの降車ブザーを先に押されたことをきっかけに世界を滅ぼそうと決意する確率が83%」 みたいな結果が出たらどうしようかと思いましたが、 そもそも単純な選択肢しかありません。 ニュアンスが正確に一致するか微妙だけど、日本語訳をつけるとこんな感じ?

  • Anger (怒り)
  • Contempt (軽蔑)
  • Disgust (むかつき)
  • Fear (恐れ)
  • Happiness (喜び)
  • Neutral (ふつう)
  • Sadness (悲しみ)
  • Surprise (驚き)

また、 このAPIは画像から表面的に読み取れるものを読み取っているだけですね。 当たり前か。 画像から本心が読めるようになると、大変なことになります。 というか、保護しなければならない機微情報だろう、それ。 スマホで顔をキャプチャされながら、 「冷蔵庫にあったプリンを食べたのはあなたですか?」 とか詰め寄られる未来を考えると、けっこうピンチ。

いや、表面上の感情を読み取るレベルでも、 なにか間違いがあれば危険ですね。 独裁者の前で感極まった表情で拍手している写真を解析してみて、 なにかの間違いで"Anger"と"Contempt"が上位に来ちゃったら、 粛清ものです。 命にかかわる重大インシデントです。

人間側が特性と使いどころを考えて使わないと、 えらいことになりそうですね。 (まあ、技術一般そうだと言えばそうなんだけど)

キハ65

ということで、 この場ではこの先、 技術を平和利用することにして、 実在の人でないものを解析してみます。

機械学習による画像認識といえば、 去年、友利奈緒判定botで友利奈緒な鉄道車両を探してみたという話がありました。 それにたいへん感銘を受けたことを突然思い出したので、 いきなりですがキハ65の画像URLを突っ込ませていただきます。 よろしくお願いいたします。

キハ65画像の解析結果

画像出典: Wikipedia 「国鉄キハ65形気動車」から、 http://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/JNR_kiha65_1.jpg/800px-JNR_kiha65_1.jpg

"No emotion is detected. This might be due to: (略) no faces are in the images (略)"

そうですか。

感情値を算出する前に、 人の顔を検出しなければならないので、 まずそこをクリアしなければ先へ進めない訳ですね。

一松さん

次はまあアニメキャラでしょう。 友利奈緒でもいいんだけど、 ここで今絶賛腐り中の次女に聞いてみましょう。

質問: 推し松は?

回答: 一松

なるほど。

一松画像の解析結果

画像出典: Wikipedia 「TVアニメ「おそ松さん」公式サイト」から、 キャラクター紹介の一松

"No emotion is detected."

うーん。

池上遼一絵

単純化されている絵は難しいのかも。 じゃあ、リアルな絵ではどうでしょうか。 Amazonから池上遼一先生の絵の表紙で、 顔が大きく描かれているものをみつくろって解析してみます。

池上遼一絵の解析結果

画像出典: Amazonの「信長1 桶狭間の戦い (MF文庫 10-4)」から、 表紙絵画像

認識されました。すばらしい。 "Anger"と"Sadness"です。渋い。

その他色々やってみて

池上遼一先生の絵は、結構認識されます。白黒の絵でもいけます。 一方、画風を似せているといわれる「魁!!クロマティ高校」とかはあまり認識されません。 「北斗の拳」は認識されたりされなかったり。

そんなに多くのサンプルを調べたわけではありませんが、 感触としては、 立体感が読み取れるかどうかが結構重要であるように思えます。 立体感も、 記号的な表現ではだめで、「影」っぽいものが具体的に読み取れるかどうかが重要なんじゃないかな。

要するに、現状では、記号的な表現にはあまり対応していないようです。 まあ、看板の絵とかにいちいち反応していたらうるさいだけだし、 とか思いつつ、 一方人間は、看板の絵だと理解しつつ、 その絵の表情を読み取ることができるよなあ、 そういえば、 子供が赤ん坊の頃など思い出すと、 けっこう小さいときから記号的な表現を認識できていたような気がするなあ、 とか考え、 わしらの頭の中ではどのような特徴量が構成されているのだろうか、 などと思いを馳せるわけです(とりあえず馳せるだけだけど)。

で、一番知りたいのは、 これらのAPIの奥で、 どのようにディープラーニングが用いられているかです。 どの量に着目してどういうモデルを組んで、 どういう学習をさせ、 どの程度の結果に落とし込んでいるのか。 なんで結果をこの(※)八種の感情にしたのか。 さすがにそういうのはまだ秘密なのかなあ。

※ 数を書き間違えていたのを修正。(2016/04/03 00:04)

Microsoft Cognitive ServicesのEmotion APIを使ってみた (サンプルをビルドする編)(追記あり)

最近、ディープラーニングを勉強し始めていて、画像から感情を検出するという技術(Emotion API)に興味をそそられています。ということで、Emotion APIを簡単に使ってみたという話。まず、APIを準備してサンプルをビルドする編。

Microsoft Cognitive Servicesとは

Microsoftが提供するWebサービスです。 Build 2016(Microsoftの開発者イベント、2016/03/30-04/01にサンフランシスコで開催)で発表されました。どういうものかを一言で説明するのは難しいんだけど(いや、一応それらしい説明はあるんだけど)、以下のビデオのような世界を実現するために必要となるもの、と考えるのが分かりやすいのではないかと思います。これは、Buildの初日キーノートの最後に流されたビデオです。

Microsoft Cognitive Services: Introducing the Seeing AI app (「字幕」を有効にすると字幕を見ることができます。英語だけど)

Webサイトは以下。

Microsoft Cognitive Services

去年、画像から人の顔を特定して年齢を推測するWebサイトが話題になったのを覚えているでしょうか? Project Oxfordというやつですね。それが進化したものです。

Emotion APIとは

Microsoft Cognitive Servicesを構成するAPI群の一つで、画像やビデオから人の顔が写っている部分を特定し、そこから読み取れる感情を推測して返します。

Emotion APIのページに載っている以下のデモを見れば、どういうものか想像できるのではないでしょうか。

Emotion APIページのキャプチャ

Emotion APIのリファレンスを見ると、 4個のAPIが定義されています。今回ここで使ってみるのは、 "Emotion Recognition"です。

Emotion APIを使うには

ちょっと試してみるだけなら、先のページのデモ機能でも十分ですが、せっかくなのでもう少しまじめに使ってみます。

Emotion APIを使うには、以下の手順が必要です。

  • Microsoft Cognitive Servicesを利用するためにアカウントを登録する。
  • Emotion APIを呼び出す。その際には、登録した際に割り当てられるキーを使う。

「Emotion APIを呼び出す」はcurlコマンド一発でもいいのですが、サンプルアプリが用意されているようなので、それを使ってみます。

以下、その手順の説明です。次回のブログでは、そのサンプルアプリを「使ってみた編」を書く予定。

Microsoft Cognitive Servicesを利用するためにアカウントを登録する

Microsoft Cognitive Servicesのページの"Get started for free tody"ボタンから登録できます。その飛び先のページに説明がありますが、

  1. Microsoftアカウントでサインインし、
  2. 使いたいAPIの種類にチェックをつけ、同意事項をチェックして"Subscribe"ボタンを押す

すると、登録処理が行われ、 Cognitive Servicesのサブスクリプション管理ページに飛びます。ここで、"Emotion - Preview"の項目を見てみましょう。

Cognitive Servicesのサブスクリプション管理ページのキャプチャ

こんな感じです。時刻表示はGMTのようですね。現状、無料コースでは「30,000トランザクション/月 かつ 20トランザクション/分」までのようです。

さて、ここで重要なのはキー(Key)です。キーはCognitive Servicesの各API毎に用意される文字列で、この文字列が後でAPIへのアクセスをするための鍵になります。アカウントにはキーが二つ(Key 1, Key2)が割り当てられています。どちらも等しく有効です。

後にサンプルをビルドして実際に動かしてみる段になると、このキーが必要になります。その際には、このページからキーをコピーします。

キーの文字列は、最初"XXXXXXXXXXXXXXXXXXXXXXXXXXX"のように隠されています。、 "Show"をクリックして実際の文字列を表示させ、文字列をコピーし、 "Hide"をクリックして再び文字列を隠します。

言うまでも無いとは思いますが、キーは秘密にしなければなりません。キーがばれてしまうと、他の人がサービスを自分のアカウントで使うことができてしまいます。キーがばれてしまった場合は、 "Regenerate"をクリックしてキーを「取り替え」ます。

Emotion APIのサンプルをビルドする

Emotion APIのサンプルはGitHubにあります。 GitHubのMicrosoft/ProjectOxford-ClientSDKプロジェクト下の、 Emotion/Windows/Sample-WPFにある Windows版サンプルを使います。

単純に、 GitHubからサンプルをとってきて、 Visual Studio 2015で"EmotionAPI-WPF-Samples.sln"開いて、ビルドすればできあがります。

ただ、ビルドの最初にNuGetパッケージの復元が行われますが、私の環境ではNuGet動かず、ビルドエラーになりました。しかし、これはサンプルの問題では無く、 NuGetが全体的に動いていなかったので、私の環境の問題のようです。つい最近までNuGet動いていたと思うんだけどな? Visual Studio 2015の「ツール」-「オプション」の「NuGetパッケージマネージャー」-「パッケージソース」でチェックがオフになっていたv2パッケージソースを有効にしたらビルドできました。

【2016/04/07追記: これはどうやら、NuGetの問題のようでした。「NuGet 3.4 Known Issues」を参照のこと。 4/09あたりに修正が公開されるとあるので、待っていれば直るんじゃないかな。急ぐ人は前記ページに載っているwork-aroundをどうぞ。】

サンプルコードも特にトリッキーなことはありません。 Asyncスタイルで用意されているEmotion APIのクライアントライブラリを非同期呼び出しで呼び出しているだけです。まあ、このAPIの場合、重要なところはすべてサーバー側の方だろうし。

サンプルを起動すると、以下の画面が現れます。

サンプルアプリの画面

この"Subscription Key:"に先ほどのキーを記入し、 "Save Key"を押せば準備完了。

次回、これを使って画像を色々読み取らせてみます。

2016年1月16日 (土)

家族間の連絡手段をLINEからSlackにしてみた話(追記あり)

家族間(妻と子供)の連絡にLINEを使っていました。 が、年末年始休暇に入るにあたり、それをSlackに置き換えてみました。

で、正月期間を含め三週間ほど使ってみたところ、使い続けてもらえてはいるけど、いまひとつ評価はよくないという話。

契機

妻と子供は普通にLINEを使っていましたが、私はLINEは使いにくいなあと思っていました。 一番困るのは、マルチデバイスで使いにくいことです。

  • ひとつのアカウントでは一つの電話からしか使えない。
  • ひとつのアカウントで複数PCからログインできるが、PCからログインするたびに電話に通知が来てうっとうしい。

特に、PCでの使い勝手が悪いのは困る。 私はPCに向かっている時が多く、そういうときはなるべくPCで操作したい。

そんなわけで、いっそ家庭内テキストコミュニケーションはSlackにしてしまおうと考えました。 主に業務用で使われるチャットツールだけど、やってみたらいけるんじゃないか。 Facebook Messengerとかも考えたけど、子供はまだFacebookアカウント持たせていないし。

ということで、Slackに家族用チームを作りました。

利点

  • 上記の問題は解決しました。私もPCやタブレットから便利に使えています。
  • 必要最小限の機能はあるという家族の評価。画像添付とかURL貼り付けは普通にできるし。

欠点

家族(主に妻)に評判の悪い点は、以下。

  • LINEの「既読」に相当する機能がない。かなり重要らしい。
  • スタンプが使えない。
  • 続けて送った発言が一つにまとめられてしまう。LINEだとフキダシでひとつひとつ分けられるのに。

私が多少気になった点は、以下。

  • PC版アプリのUIが英語。小学生にはちょっとつらいかも。
  • PC版アプリ上で日本語テキストを表示させると、フォントに違和感ある。というか、いわゆる中華フォント問題だよな、これ。
    【2016/02/24 追記】 PC版アプリが2.0.0へバージョンアップしたことに伴い、 中華フォント問題は解消しました。 ただ、高DPIに対応してないっぽく、 高DPI環境ではフォントが微妙に汚い…
    【2016/09/22 追記】 高DPI環境でフォントが微妙に汚い問題が直っていました。 きれいに文字が出ています。メイリオかな。 いつ直ったかはっきりしないけど、 気づいたのは9月入ってからでした。
  • PC版アプリがデスクトップアプリで、テキスト入力欄が底部にあるというUIなので、タブレットモード時にソフトウェアキーボードとの相性が悪い。Winタブでの利用は、Windows Phone向けSlackアプリがUWP化されるのを待つ、ことになるのかな。
  • さすがにガラケー版のアプリは期待できないよなあ。うちに一台あって、おでかけの時などに下の子供に持たせたりしているんだけど。

現状

上記の不満がありつつ、使い続けてもらっています。

そういえば、最近もっと究めている人達を見た。

おっちゃんもbotぐらい作って、家族にアピールするべきじゃろか。

2016年1月11日 (月)

MADOSMA Q501をWindows 10 Mobileにアップデートした話

去年の年末、MADOSMA Q501をWindows 10 Mobileに自力でアップデートしました。その記録を書いておこうと思います。途中の写真を撮っていなかったため、画像はほとんどありません。

前提

MADOSMA Q501は、2015年6月にマウスコンピューターから発売されたスマートフォンです。発売時に搭載されていたOSはWindows Phone 8.1ですが、11月末にリリースされたWindows 10 Mobileにも対応しています。実際、同じハードウェアでOSをWindows 10 Mobileにした機種(MADOSMA Q501A)が2015年12月に発売されています。

そのMADOSMA Q501のOSをWindows Phone 8.1からWindows 10 Mobileにアップグレードするには、2016年1月10日現在、以下の三つの方法があります。

  1. OTA(Over The Air)アップデートを待つ。

    近日中に「電話の更新」経由で、各MADOSMA Q501にWindows 10 Mobileが配信されるはずです。当初、2015年12月中に配信される予定でしたが、Microsoft側の都合で2016年1月に延期されているようです。詳細はマウスコンピューターのサイトのサポート情報から、「[ MADOSMA ] MADOSMA Windows 10 Mobile OTA 延期 ご案内」を参照してください。

  2. 「MADOSMA Windows 10 Mobile アップグレードサービス」(有償)を利用する。

    MADOSMA Q501をマウスコンピューターのダイレクトショップに持ち込むか、サービスセンターに送ることで、Windows 10 Mobileにアップデートしてもらうことができます。詳細はマウスコンピューターのサイトから、「MADOSMA 追加サポート」の「MADOSMA Windows 10 Mobile アップグレードサービス」を参照してください。

  3. 自力でWindows 10 Mobileにアップデートする

    MADOSMA Q501を自力でWindows 10 Mobileにアップデートするための手順とデータがマウスコンピューターから公開されています。今回やってみたのはこの方法です。

マウスコンピューターの推奨はOTAとのことです。 OTAだと既存のデータやアプリケーションがアップデート後もそのまま引き継がれますが、他の方法では端末が初期化されてしまうようです。ほかの方法はOTAを待ちきれない人向けですね。ただ、この選択肢が用意されていることはとても有り難いです。三大キャリアの端末とか、こんなサポートしてくれそうもないし。

もちろん、Windows Phone 8.1のまま使い続けることもアリです。

手順

手順書の説明が十分なものだったので、そのまんまでした。

手順書は以下のようにして見ることができます。

  1. マウスコンピューターのサイトから「サポート情報」「各種ダウンロード」を開く。
  2. 「ドライバのダウンロード」の部分で「シリアル No.」に端末のIMEI番号を記入して「検索」を押す。 IMEI番号がわからない場合は、FAQの19644番「[MADOSMA]シリアルコード「IMEI 番号」の記載箇所(Windows Phone 8.1)」を。
  3. この機種向けの情報が検索されます。このうち、「[MADOSMA] MADOSMA Windows 10 Mobile イメージ 2.0.0.3 ご案内」が手順書になります。

手順のおおざっぱな流れは、

  1. PC(Windows 10推奨)上に環境を整え、MADOSMAに書き込むイメージを準備する。
  2. MADOSMAをリカバリモードにして、USBでPCとつなぐ。
  3. PC上のツールからイメージをMADOSMAに書き込む。

となります。3.が一番大事なところでしょうが、ツールが自動的にやってくれるため、あまり面倒はありません。所要時間は、Windows 10 PCがあれば1時間くらいでしょうか。環境を用意するところに時間がかかります。イメージの書き込み自体は数分です。

結果

ぱっと見た目、デフォルトのタイルの色がWindows Phone 8.1では単純でしたが、 Windows 10 Mobileでは渋くなっています。

左がWindows Phone 8.1、右がWindows 10 Mobile。

WP_000290wp_ss_20160110_0005

使い勝手に関しては次回書きます(たぶん)。