布団が俺を呼んでいる

丘山大一のぶろぐ

de:code 2016 参加してきました

楽しかったけど疲れたよ。

今年の感じ

期待されていたHolo Lens 関係があまりなかったので、デバイス的な盛り上がりにはちょっと欠けていた印象。
全体的には、
DevOps、Xamarin、ロボット(ボット)、UWPてな感じ。
スマホやらクラウドやらは当たり前になりすぎて、「それは前提として」話が進むのがなんともはや。
時代の流れは速いもんだ。

これから

感覚的には、Xamarinを押さえておくべきだと思った。
あんまり手を広げると学習効率が落ちるので、当面はWUP集中だけど、アンテナは立てておこう。


Creating Mobile Apps with Xamarin.Forms Preview Edition 2 (Developer Reference)

空文字を判定する最も効率のいいやり方は? (Delphi編)

現在いるプロジェクトではDelphiなる言語を使っています。
んで、他の人のソースを読んでいると、空文字かどうかの判定の仕方には色んな書き方があるのだなあと思います。
代表的なのは、
(1) Result := s.IsEmpty;
(2) Result := s = '';
(3) Result := s.Length = 0;
(4) Result := s = EmptyStr;
等でしょうか。
ちなみに、私は基本的にIsEmptyメソッドをなるべく使う派です。
「''」と記述すると、後で読み返した時に
「これは本当に空文字で判定したいのだろうか?
 それとも実は半角スペースと比較するべきところを間違えてしまったのだろうか?」
等と疑わせてしまうこと、また本当にそのように間違える可能性が出てきてしまうためです。
 あとIsEmptyを使った方がコード上からカッコが減りやすいというのもある。IDEが貧弱なRadStudioではこれが割と重要。
 
さて、そうは言っても、「IsEmpty使おうぜ!」と主張しても使ってくれる人はなかなか増えません。
わざわざ書くのが面倒+間違いやすい「''」で書く人がほとんどです。

むう。何故だ。

と思っていると、MSDNの中で、(C#ですが)空文字判定方法について記述してある箇所を見つけました。
https://msdn.microsoft.com/ja-jp/library/ms182279.aspx?f=255&MSPPError=-2147217396
な、なるほど!
きっと速度差があるからみんな「''」を使うんだ!
理由があったんだね!

というわけで、それぞれの実行時間はどれくらいなのか。

2147483647 回ループを回してテストしてみました(適当な値をとるのが面倒だったので、Integer.MaxValue)。
以下、単位はミリ秒。
(1) IsEmpty
①37430
②37197
③37296
(2) 「''」
①36414
②36193
③36258
(3) Length
①40755
②40704
③40771
 
最速と最遅で比較すると、
(2) Result := s = '';
が最遅に比べ4578ミリ秒早いという結果になりました。
一回当たりおよそ
4578 / 2147483647 ≠
5000 / 2000000000 ≠
5 / 2000000 ≠ 0.0000025 ミリ秒早い。
ということになります。

おおー、なるほど、確かに早い。
なるほど、同じ結果が出るなら早い方を採用するのは理に適っている。
うん……正しい……
いや、たしかに正しいんだが……

全然変わんねえよ (´・ω・`)

実質0秒だよコレ。
これ以上速度を気にしなければならない要件なら、そもそもDelphi使わないわな。
それこそCとかアセンブラとか、もっと高速な言語を採用するわ。
やっぱり「''」と比較するコーディングは、昔から書いている人の単なる惰性な気がするなあ……。
一応、「早い」ということは分かったから、無暗にIsEmptyを進めるのは止めるけど……
やっぱり私はIsEmptyでいこう……。

※注意!
私の開発環境での結果+面倒だったのでデフォルト設定のDebugビルド結果です。
ロジックや書き方によってなんぼでも結果は変わることをお断りしておきます。



Delphi XE2プログラミング入門

新品価格
¥4,104から
(2016/1/18 20:58時点)

ようやくUWPアプリを一つ公開できた

クソアプリなんですけどね。

アプリ概要

Windows Store 公開。
ランダムな数値を生成する機能(だけ)
推奨はWindows Mobile。

※詳細はブログ上部の「公開アプリ」から。

目標達成

アプリを作りこむよりも、まずWIndows Storeでアプリを公開するとはどういうことなのか覚えたかった。
プログラムで何ができるか、ということも重要だけど、公開するということを考えた場合、公開先の事情も知っておかなければならない。
大家の事情を店子は知っておく必要があるのだ。
その目標は、まずは達成できた気がする。
……まあほとんどの時間はVisual StudioとかUWPアプリのエラー解決に費やされていた気がするが(汗)

今後
練習がてら、もう2~3個くらい軽いアプリを作成するつもり。


UWPアプリが、Windows Phone (Windows Mobile)  に配置できなくなった

最後に配置してから間が結構あったので、何がトリガーだったのか分かりません。
色々見ていると、
・OSのビルドバージョンが上がったから
・ストア申請用のパッケージを作成したから
あたりが原因ぽいですが、確証には至っておりません。

'Device' のブートストラップに失敗しました。デバイスが見つかりません。

最初に遭遇したエラー。
デバイスマネージャからデバイスを削除したらできた、という話があったので試してみたら突破できました。

DEP0001 : 予期しないエラー

すわ、OSのリフレッシュを試す必要があるか、と思いましたが、デバイス側(WIndows Phone側)のアプリを削除すればいけました。
同名のアプリが入っているところに、パッケージ化の設定がされたアプリを突っ込もうとしたしたから出た? ような気がします。

最近はUWPよりも ざまりん の方が盛り上がっているような気がしますが、当分はUWPでいこうかな。


Diginnos SIMフリー スマートフォン DG-W10M ( Windows10 mobile / クアッドコア / 5.0インチ / 1280*720 / デュアル SIM / LTE対応 / RAM1GB / ROM16GB )

新品価格
¥9,980から
(2016/5/14 22:56時点)

Windows Phone (Windows Mobile) Windows Update 後の再起動ににかかる時間(10.0.10586.318)

OSのビルドバージョンが10.0.10586.318に上がりました。

いつものように、更新後の再起動を手動でかけてみる

手動再起動GO!

今回はこんな感じでした

アップデートファイルのダウンロードや更新自体は完了しているので、再起動にかかる時間だけです。
手動で再起動をかけると、画面上に歯車が出てきてクルクル回り始めます。10分強。
それが終わると、ついに起動か、と思いきや、また何やらプログレスバーが出てきます。5分
大きく上記2ステップ、合計15分で更新が完了しました。
前回とあまり変わらないかな。

状況によって時間は大きく前後すると予想されますので、目安の一つとして。

更新内容や履歴はどこで確認する?

いかにもなページもあるんですが、本日時点では特に情報が記載されていないような……?

バージョン

端末はNuAns Neoです。
本日時点の各バージョンは、
  • バージョン:1511
  • OSビルド:10.0.10586.318
  • ファームウェアリビジョン番号:1028.020.001.53
  • ハードウェアリビジョン番号:1.0
  • 無線ハードウェアバージョン:1.0
  • チップSOCバージョン:8952


SDKの更新の影響で(?)UWPのプロジェクトとXAMLのプレビューが開けなくなった → 解決

上で書いていた問題、気が付いたら解決していたみたいです。

手順

  1. アプリケーションのターゲットバージョンを Windows10(10.0;ビルド10586) に変更。
  2. 開けなくなるでVisual Studio再起動。
  3. ソリューションを開くと、SDKの更新ができるようにるので更新。
  4. 更新にはちょっと時間がかかる。
  5. 再起動したら、無事開けるように。

良かった良かった。

Windows Phone (Windows Mobile) edge は shift jis 未対応?

文字化けじゃー(ぎゃー)

要約

会社から送られてきたhtmlファイルをedgeで開いたら文字化けした。
エンコードの設定をいじればいいだろ、と思ったら見つからず。
クライアントデスクトップのedgeでは文字化けしないんですけどね。

解決策

htmlファイルのヘッダーをいじってshift jis から utf-8 にしたら表示できた。

……全然解決策になっていない!


どうすればいいんでしょうね?

そもそもhtmlファイル自体、最初から文字コード指定を utf-8 なり16なりにしてくれよ、と思うわけですが、わざわざshift jis になっていたのは、おそらく人名や住所が入っている自動生成のhtmlファイルだからだと思われます。
utf-8 で表現できない漢字などに対応するためでしょう、たぶん。
文字コードの闇に深く立ち入るつもりは全くないので、この辺りは考えないことにする(逃げた)
MSさーん、対応してよー……といいたいですけど、対応してもあんまり旨みが無いよなあ……



(無料電話サポート付)できる Windows 10 Mobile FREETEL KATANA 01/02 対応 (できるシリーズ)

新品価格
¥1,080から
(2016/5/7 12:51時点)

de:code 2016 どのセッションに参加するかウジウジ考えてみる

セッションアンケートが来ていたので、それを見ながらうんうん悩む。

とりあえずこんな感じでアンケート提出

UWP 中心で組んでみた。

Day1 5 月 24 日 (火) 9:30 - 20:00
09:30 ~ 11:30 KeyNote すべての人の可能性を拡げるモバイルファースト、クラウドファーストの世界
13:20 ~ 14:20 CHK-004 プログラミング言語は何処へ向かうのか
14:35 ~ 15:35 CLT-003 UWP で業務パッケージやエンタープライズ LOB は行けるのか? ~ UWP アプリによる業務システムの開発と展開 ~
16:05 ~ 17:05 CLT-002 Windows 10 デバイスと UWP 完全解説
17:20 ~ 18:20 INF-027 セキュリティ マニアックス -サイバー攻撃の手口と防御手法- ~敵を知り、己を知れば百戦危うからず~

Day2 5 月 25 日 (水) 9:30 - 18:30
09:30 ~ 10:30 DEV-022 これから始める Xamarin ? 環境構築から iOS/Android/UWP アプリのビルドまで ?
10:45 ~ 11:45 DOO-013 Docker 最新動向と Azure Container Service 入門
13:10 ~ 14:10 INF-004 App Service を利用したウェブサイト構築における運用管理とセキュリティ対策
14:25 ~ 15:25 CLT-010 クラウドで広げる広がる UWP アプリの世界
15:55 ~ 16:55 CLT-014 ゲーム開発だけじゃない!Unityで作るUWPアプリ
17:10 ~ 18:10 CLT-012 インサイド UWPアプリ


Holo Lens も気になるけど、これは聞くより実物をじっくり見たい方なので後回し。
展示とかで見れたら嬉しいな。
Hyper-V やコンテナ回りも気になるので、様子を見ながら変えていきます。


Microsoft Windows 10 Home (32bit/64bit 日本語版 USBフラッシュドライブ)【新価格版】

新品価格
¥14,200から
(2016/4/27 22:05時点)

別プロセスの画面キャプチャをしたい

言語はC#。実態(実体)はWinAPI。

別プロセスの画面キャプチャを取得し、画像として保存したい。

今回の対象プロセスはskype(exe名はlync)です。
こんな感じで書きました。

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private extern static bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

        private const string FORMAT_TIME = "yyyyMMddhhmmss";

        private void SavePicture()
        {
                    //Skypeのハンドルの取得
                    var pLst = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "lync").ToArray();
                    var handle = pLst.First().MainWindowHandle;
                    RECT rec = new RECT();
                    var size = GetClientRect(handle, out rec);
                    //画像処理
                    Bitmap img = new Bitmap(rec.Right - rec.Left, rec.Bottom);
                    Graphics memg = Graphics.FromImage(img);
                    IntPtr dc = memg.GetHdc();
                    PrintWindow(handle, dc, 0);
                    memg.ReleaseHdc(dc);
                    memg.Dispose();

                    DateTime dt = DateTime.Now;
                    img.Save($@".\DATA\{dt.ToString(FORMAT_TIME)}.png");
        }

上記の問題点

プロセス名で単純に取得しているため、skype上で別ウィンドウ(例えばIM)を開いたりすると、メインウィンドウではなくそちらがキャプチャされてしまいます。
自分の用途としては許容範囲なのでOKとしました。
※上記処理では、例外処理を省いています。


プログラミングWindows 第6版 上 (Microsoft Press)

新品価格
¥7,560から
(2016/4/7 18:54時点)

Windows Phone (Windows Mobile) アップデートの再起動ににかかる時間(trinity)

「電話の更新」が本日も来ていました。
前回の更新からずいぶん間隔が狭いな、と思いましたが、「trinity」の名前が冠してあったので、WIndows Update ではなくファームウェアか管理用ソフトウェアのアップデートだったのだと思われます。
他の端末を持っていれば比較できますが、あいにく手元にありませんので、推測です。

再起動を手動でかける
一応、今回も手動でアップデート。
画面の歯車がクルクル回るのが約5分。
プログレスバーが約5分。
合計10分ちょいくらいでした。
アンテナを見ていたのですが、更新が完全に終了する前に、ネットワークにはつながっているようでした。


バージョン

OSのビルドバージョンは 10.0.10586.218 で変わっていません。
ファームウェアリビジョンは更新前の控えをとっておくのを忘れたのですが、 1028.020.001.53 になっていました。
一応まとめると、本日時点の各バージョンは、
  • バージョン:1511
  • OSビルド:10.0.10586.218
  • ファームウェアリビジョン番号:1028.020.001.53
  • ハードウェアリビジョン番号:1.0
  • 無線ハードウェアバージョン:1.0
  • チップSOCバージョン:8952


追記

調べたら、公式ブログに情報が載っていました。
通常とは違う方式だよ、と記載されていますが、フツーに配信されたんですが……? まあいいか。

「ナビゲーションバーを操作した際、バイブレーションが動作するようにしました。」
なんかブルブルするなと思ったらコレでしたか。