koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

UTCな時刻をDateTimeKind.UnspecifiedなDateTimeにしてしまうとどんどんずれる

.NET での時刻のシリアライズで失敗したという話。

背景

.NET の DateTime 構造体 (System) は、時刻とは別に、その値が現地時刻なのか、世界協定時刻(UTC)なのか、その辺不明(Unspecified)なのかを持っている。

その辺を明示しないでDateTime構造体を構築すると、その辺不明の値になる。

その辺不明のDateTime値は大体において現地時刻相当で扱われる。 特に意識しないで時刻を扱う場合は、今いる場所の時刻だろうから、妥当な扱いだと思う。

で、DateTime構造体には DateTime.ToUniversalTime メソッド (System) という、呼べばUTCを返してくれるいい感じのメソッドがある。

やらかしたこと

  1. UTC(ISOで尻がZ)な時刻文字列を DateTime にする
  2. なんも考えないでシリアライズして永続化する
  3. なんも考えないでデシリアライズして DateTime にする
    • DateTimeKind.UnspecifiedなDateTimeになった
  4. なんも考えないで ToUniversalTime() してUTCにした気になる
    • +09:00 な時刻からUTC変換した感じに -9 時間された
  5. 2 に戻る

教訓

時刻をシリアライズするときにはタイムゾーンに関する情報を持たせるようにしましょう。

続きを読む

Windows 10 IoT Core をどんな時に使うのか?

PCが修理中で暇かつ、なんぼか Raspberry Pi 3 上の Windows 10 IoT Coreを触ったので、今のところの所感をメモしておく。

なお、MS的な答えは提示されている模様。

ビジネス向けの Windows 10 IoT

Windows 10 IoT Core は Windows 10 エディションのファミリで、小型で低コストの産業用デバイス向けに最適化されています。IoT ゲートウェイやマイクロ キオスク端末などのデバイスに対応し、単一の基幹業務アプリが実行できるように設計されています。

ここ。

単一の基幹業務アプリが実行できるように設計されています。

IoT Core は、電源を投入すると指定したアプリが実行され、原則としてアプリの切り替えはできない。 これは、DIY的に遊ぶ分にはデスクトップでいろいろ切り替えたりすることができなくて面白みがないが、業務用の端末としてはむしろ利点だし、この1言の説明は非常に納得がいく。

自分が弄っているのは Raspberry PiDIY向けだし、基幹業務と言われてもピンとこない。 この辺りをDIY向けに翻訳すると、以下のようになるのではないかと思う。

  • アプリは1つでいい
  • GUI出したい
  • C# 大好き

というときに、Raspberry Pi のOSとして IoT Core を選ぼう。

続きを読む

PCが修理に旅立って行った

発熱と計算量の狭間で - koudenpaのブログ を書いたときに購入したPCが修理に引き取られて行った。

理由は

冷却ファンが脈動するようになってしまい、手がプルプル震えるようになってしまった

から。

デジャウ。

届いてから2か月程度の命だった。

どうやらファンにとことん嫌われているらしい。

これだから可動部はいけない。

可動部が多くていいのはプラモとフィギュアだけなのだ。

続きを読む

UWP と AppService と BackgroundTask

Windows 10 IoT Core で、特に資料を読むこともなく、フィーリングでバックグラウンドで動作し続ける処理を書こうとしていたら、サッパリ実現できなかった。

IoT Core は UWP で、UWPアプリとしてやりたいことを実行するのだけれど、そのUWPアプリについてさっぱり知らなかったのが敗因だった。

いまだに分かっていないのだけれど、以下のような経過をたどった結果の整理をメモしておく。

なお、やりたいことは「センサーのデータを短い間隔で取得し続ける」こと。

  1. GUIのアプリでは、実行されている間はできていた
  2. AppService で処理するようにしたら、関連するアプリを落としたら処理が終わってしまった
  3. どうやら、普通のBackgroundTask として実装するのがよさそうだと気づいた
続きを読む

インターネットのセキュリティ段階についての雑感

IoT と言う単語がバズっていて IPA がセキュリティガイドラインを公開したりしているけれど、そもそもユーザーのインターネットセキュリティ意識ってそう大したものではないよなぁ。と思う雑感。

「IoT開発におけるセキュリティ設計の手引き」を公開:IPA 独立行政法人 情報処理推進機構

こんなもん満たしたプロダクト出てくるんだろうか。

総務省|「IoTセキュリティガイドライン」(案)に関する意見募集

こいつは少し気にしておきたい。

それはさておき、僕はインターネット上のセキュリティ対応を大体以下の三段階で捉えている。

  1. 丸裸
    • 趣味なら別にこれでいいと思う
    • 悪意の前には無力
    • HTTPでBasic認証とか、平文でクライアントを識別する感じ
  2. 通信を暗号化
    • プロダクトがこれだとちょっともにょる
    • 悪意とある程度の技術の前には無力
    • HTTPSオレオレ証明書とか、証明書検証してないとか
    • 盗聴は厳しいけれど、通信相手は不明
      • アリスと通信していたつもりが、ボブと通信している可能性がある
  3. 通信を暗号化して、相手を認証
    • 一般的な安全な通信
    • 脆弱性の前には無力
    • HTTPSを普通に使うとか

PCやスマホで2以下なプロダクトはサボってるだけなのだけれど、プアなコンピュータだと3は実現がなかなか厳しかったりする。

各社がオレオレプロトコルで対応していたりするみたいだけれど、共有はされないノウハウだし、安全なIoTを手軽にやるのはなかなか大変な状況だと思う。

続 Windows と Raspberry Pi の PWM制御 事情

Windows と Raspberry Pi の PWM制御 事情 - koudenpaのブログ で Raspberry Pi のハードウェアPWM制御がどうこうと書いていたけれど、リリースノート にちゃんと事情が書いてあるような気がした。

以下抜粋。

Raspberry Pi audio and direct memory mapped drivers (6678121)

On Raspberry Pi, audio via the 3.5mm jack stops working when the direct memory mapped > > drivers are enabled.

WORKAROUND: After the direct memory mapped drivers have been enabled, run:

reg add HKEY_LOCAL_MACHINE\SYSTEM\DriverDatabase\DeviceIds\ACPI\BCM2844 /v dmap.inf /t REG_BINARY /d 02ff0100
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\enum\ACPI\bcm2844\0 /v ConfigFlags /t REG_DWORD /d 0x20
devcon restart acpi\bcm2844

Verify that the driver for the PWM device node is BCM2836 PWM Controller:

C:\Data>devcon status acpi\bcm2844
ACPI\BCM2844\0
    Name: BCM2836 PWM Controller
    Driver is running.
1 matching device(s) found.

いい感じに音を鳴らすための処理とハードウェアPWMでリソースが食い合っているから、音を無効化指定してやるとSoC? のPWMコントローラが有効になるようだ。

より詳しい事情は、PWMドライバのリポジトリリドミーに書いてあった。

bsp/drivers/pwm/bcm2836 at master · ms-iot/bsp · GitHub

音声殺したり、レジストリを弄ってまで1チャンネルのPWMを試してみるエネルギーはないので、そっとしておくことにした。

Windows Phone に SORACOM Air を差すとこうなる

先日の de:code 2016 でWindows Phoneの開発キットとしてVAIO Phone Biz を20000円(税抜き)で買う権利に当選してしまったので、UWPアプリを開発する義務が発生してしまった。

が、あんまり暇がない(まだIoT Coreを弄ったりしたい)ので、とりあえず起動だけして封印することにした。

とはいえ起動だけではあまりにもつまらないので、唯一手元に余っていたSORACOM AirなSIMを差してみた。

続きを読む