Raspberry Pi 2とWindows 10 IoT coreによる電子工作に挑戦しようとしているのですが、なかなか思うように行きません。まずひっかかったのは何もアプリを導入していないにもかかわらず、本体が再起動を繰り返すトラブル。調べてみたところ、主な原因としてSDカードとの相性に問題(200円で買ったワゴンのSDカードを使っていた)があるとのことでした。有志によって作成された互換性一覧によると、サンディスクやサムスンでさえも外れがあるみたいなので、結果、東芝製のカード(EXCERIA M301[輸入品])を買い直すことにしました。

ではここからが本題。Windows 10 IoT Coreによる開発は日本語による資料がほとんどないため、まずは基礎固めとして、ホビープログラミング入門という日経ソフトウェアのムックで紹介されていたRaspbian & Pythonによるスイッチプログラムの移植にチャレンジしてみました。

Windows 10 iot coreの導入方法は探せばすぐに見つかるので、ここでは割愛。まずは、スイッチと抵抗をブレッドボード経由で配線します。ブレッドボード中央の青い線の上に1KΩの抵抗がささっている点に気をつけてください。


続いてVisual Studio 2015のセットアップです。標準ではGUIのあるアプリしか作れませんが、こちらのページよりテンプレートを導入することで、GUIのないバックグラウンドアプリを作成できるようになります。インストールが終わると、Visual Studio 2015の新しいプロジェクトに「Background Application(IoT)」が追加されていると思います。


それではプログラムを組んでみましょう。バックグラウンドアプリはRunメソッドから呼び出されます。アプリを半永久的に起動させ続けるには、ここでGetDeferral()を呼び出す必要があります。今回はGPIO4に電気が入って来るかどうかの回路なので、4番ピンを入力モードにしています。あとはタイマーを起動させ、入力値が変更されたらVisual Studioのデバッグ出力に結果を表示させます。

// StartupTask.cs
using System;
using System.Diagnostics;
using Windows.System.Threading;
using Windows.ApplicationModel.Background;
using Windows.Devices.Gpio;

namespace Switch
{
    public sealed class StartupTask : IBackgroundTask
    {
        private BackgroundTaskDeferral deferral;

        private const int GPIO_PIN = 4;
        private GpioPin pin;

        private ThreadPoolTimer timer;
        private GpioPinValue gpv = GpioPinValue.Low;

        public void Run(IBackgroundTaskInstance taskInstance)
        {
            // これがないとRunメソッドが終わるとアプリが終了してしまう
            // また、deferral.Complete(); で明示的に終了させることができる
            deferral = taskInstance.GetDeferral();

            // 4番ピンの入力を有効にする
            pin = GpioController.GetDefault().OpenPin(GPIO_PIN);
            pin.SetDriveMode(GpioPinDriveMode.Input);
            gpv = pin.Read();

            // 500msごとに判定する
            timer = ThreadPoolTimer.CreatePeriodicTimer(OnTickTimer, TimeSpan.FromMilliseconds(500));
        }

        private void OnTickTimer(ThreadPoolTimer timer)
        {
            var v = pin.Read();
            if (gpv != v) {
                Debug.WriteLine(v.ToString());
                gpv = v;
            }
        }
    }
}


続いてデバッガの設定です。対象のアーキテクチャを「ARM」にし、ターゲットは「リモートコンピューター」に。C#プロジェクトのプロパティの「Debug」に、対象のRaspberry Piが接続されているIPアドレスを入力します。アドレスは「Windows 10 IoT Core Dashboard」の「自分のデバイス」より確認できます。


初回起動時は追加コンポーネントなどの導入のため、やや時間がかかりますが、デバッガが起動すると、ブレッドボードのスイッチを押したり離したりするたびに、「出力」ウィンドウに結果が表示されます。


ちなみに、スイッチを押しているときはGNDピンへと電気が通じてGPIO4ピンには流れないため、GPIO4の結果は「Low」となり、離すとGPIO4に電気が流れるようになるため、結果が「High」となります。
, | 2016年9月21日

Googleが公開しているAndroidのソースコードをベースにIntel系の端末で汎用的な動作を試みるプロジェクト「Android-x86」。Android 6.0の正式版が先日公開され、最新版では特別な手順を踏まずとも、ちょい古タブレットに用いられているBayTrail世代の32bit UEFIシステムにもインストールできるようになりました。とはいうものの、USBにLinuxブートシステムを導入したり、ブートメニューにWindowsが出てこなくなったりと、一般の人がおいそれと導入することはできない難しさがあります。

管理人も試行錯誤した結果、インストール補助ツール「Android-x86 Installer UEFI Version」のソースコードをカスタマイズすることで、Windows 10とAndroid 6.0デュアルブートができるようになりました。音声が出ないなどのハードウェアの問題は残っているものの、4.4をはじめとするこれまでのバージョンはASUS VivoTab Note 8(M80TA)では全く動かなかったので、動作していること自体が感動的ですらありました。


導入するにはAndroid_UEFIInstaller.exeを実行して、Android Imageには「android-x86-6.0-r1.iso」を、Target Driveにはあらかじめ空けておいたハードディスクのパーティションのドライブを指定します。あとは「Install」ボタンを押すと、インストールが開始されます。Androidを起動するには、BIOSから直接Android OSをブートするか、Windowsの「すべての設定→更新とセキュリティ→回復→今すぐ再起動する」を選択し、その後に表示される一覧より「デバイスの使用→Android OS」を選択します。


カスタマイズされたインストーラーはこちらのリンク先にて、修正されたソースコードを同梱した上で公開しております。修正の要望はオリジナルのプロジェクトにリクエスト済みのため、本家が対応するようになったら公開は終了する予定です。

環境によってはVisualC++ 2015ランタイムが必要になることがありますのでご注意ください。また、インストールによって生じたトラブルに関しては一切責任を負いません。サポートもできませんので、Android自体の不具合などはプロジェクトのフォーラムでお問い合わせください。
 | 2016年9月20日

TNKソフトウェアのサーバーは今までロリポップのサービスを使用していたのですが、パスワード記入欄があるとエラー扱いにするなど、年々ブラウザのhttpによる無暗号通信に対する厳しさが増していく中、未だに独自SSLがオプションである上に高額なので、契約が切れたのを機にバリューサーバーに乗り換えました。

最近はドメイン認証という最低限の信頼性を得たいだけであれば、無料で取得できる時代になりました。ここでは、TNKソフトウェアがhttpsドメインになるまでの手順を簡単に紹介したいと思います。

  1. サブドメインを設定する
    SSLはサブドメイン単位で有効になります。例えば、この設定だと、「tnksoft.com」と「www.tnksoft.com」はhttpsですが、「sh.tnksoft.com」はhttp通信になります。

  2. CSRを作成する
    SSLにおける証明書を発行する認証局に提出するCSRはバリューサーバーで作成します。これはバリューサーバーのヘルプページの1~4が詳しいのでそちらをご覧ください。プライベートキーはこのあと使うので覚えておくように。

  3. StartComから受け取れるメールアドレスを作成する
    「Let's Encrypt」は無料で証明書を発行しくれることで有名ですが、3ヶ月ごとでの更新が必要であることや、Linuxの知識も多少いるなど、サーバー構築になれてない人には難易度が高いので、私はStartComのサービスを使うことにしました。このサービスではドメイン認証に決められたアドレスしか使えないため、あらかじめ「postmaster@」「hostmaster@」「webmaster@」のいずれかのメールアドレスを開設し、受け取れる状態にしておきます。

  4. StartSslにアクセスする
    右上の「Sign-up」よりユーザー登録を行ったら、拡張子.p12のログイン証明書が発行されるので、これをダブルクリックしてパソコンに導入します。StartComに次回以降ログインするときは、この証明書の有無でチェックされるのですが、私の環境ではGoogle ChromeよりもMicrosoft Edgeの方がスムーズにログインできました。

  5. ドメインの証明をする
    ログインしたらコントロールパネルより「Validations Wizard」をクリックし、選択肢から一番上にある「Domain Validation」にチェックが入ったままで、「Continue」をクリック。続けてドメイン名(サブドメインは含まず)を入力します。指定したメールアドレスに届いたコードを「Verification code」に入力すれば認証は完了です。
     

  6. 署名の発行を申請する
    「Certificates Wizard」より「Web Server SSL/TLS Certificate」を選び、次のページに進みます。このページでhttpsを有効にしたいサブドメインを一行単位で入力し、CSRの欄にはバリューサーバーで作成した「-----BEGIN CERTIFICATE REQUEST-----」で始まるCSRテキストを入力します。

    リクエストに成功すると、「Issued」として、「Tool Box→Certificate List」より証明書がダウンロードできるようになります。ちなみに、申請は1日に3回までしか発行してくれないので、この点に注意しましょう。

  7. 中間証明書をダウンロードする
    バリューサーバーはApacheで稼働しているので、証明書はApacheServer.zipに含まれているものを利用することになります。ただし、ここに含まれる「1_root_bundle.crt」を使ってしまうと「この署名は安全性が低い」とブラウザで警告が出てしまうので、https://www.startssl.com/root/の「Intermediate CA Certificates」より、より強い暗号を用いた「StartCom Class 1 DV Server CA(pem)」をダウンロードし、代わりに使用します。

  8. 証明書のテキストを記入する
    最後はヘルプページの6~に従い、取得した各種証明書のテキストデータを入力します。「発行された証明書」にはStartSslから入手した「2_***.crt」内のテキストを、「発行された中間証明書」には「sca.server1.crt」内のテキストを入力します。これでインストールが完了すれば、しばらく後に対象のドメインが自動でhttpsになっているはずです。
     | 2016年9月12日

    ウェブページのフィルタリングをおこなうブラウザ拡張「マイリーディングモード」を公開しました。「不要なものを後で消す」広告ブロッカーとは違い、「必要なものだけを最初に残す」プログラム手法により、あなたが頻繁に訪れるサイトにおいて、本当に読みたい情報だけを、スタイルシートなどのオリジナルページの雰囲気を残したまま、素早く表示させることができるようになります。


    現在、Google ChromeとFirefox版はそれぞれのブラウザの拡張機能より直接導入することができます。Microsoft Edge版もございますが、現時点ではマイクロソフトがストアアプリへの登録をまだ受け付けていないため、テスト版という体でソースコードとして拡張機能を提供しています。そのため、Microsoft Edgeでは開発者モードにする手順が必要となりますのでご注意ください。
     | 2016年9月7日

    ウィンドウズでのハードディスクの方法は主にFAT32とNTFSがあります。FAT32はUSBメモリーなど、いきなりポートから引っこ抜いてもデータが壊れることはあまりなく、SDカードのフォーマットにもっぱら使われますが、1ファイルの上限が4GB、フォーマットサイズの上限が32GBと高画質の映像を記録するのには不向きです。一方でNTFSはファイルの上限はほぼない(約20エクサバイト)ものの、少し前のMac OSでは読み込みしかできなかったり、急にメディアを切るとデータが破損したりと、あまりリムーバブルメディア向きではありません。

    そこでNTFSのようにファイルサイズの制限を拡張子、FAT32のデータ保全性のいいとこ取りをしたのがexFATというわけですが、ハードディスクをリムーバブルメディアとして利用する際には気をつけなければいけない点があります。それは、ウィンドウズで特に意識せずそのままフォーマットすると、アロケーションユニットサイズが256キロバイトになることです。

    これはデータの最小確保単位を指し、256KB未満のファイルでも、ディスク内では256KB確保されることになります。つまり、数KBのテキストファイルばかりのデータをこのディスクに保存しようとすると、あっというまにディスクの容量の上限に達してしまうのです。以下の例では本来のファイル総サイズの5倍近くの容量を消費しています。


    アロケーションユニットサイズを少なくすれば、ディスクのアクセス効率は若干低下しますが、容量の問題は避けられます。しかしながら、Windows 10のフォーマットダイアログでは1TBあるようなメディアでは64KB未満が指定できません(規定は128KB)。もし、アロケーションサイズを少なくしたいのであれば、コマンドラインを使いましょう。
    format H: /FS:exFAT /A:4096 /Q

    H:はフォーマットするドライブ名、/FSはフォーマット、/Aはアロケーションサイズ(この場合は4096バイト=4KB)、/Qはクイックフォーマットを示します。これにより、細かいファイルをたくさん保存するのに適したハードディスクを作成することができるようになります。

    exFATの小技を学んだのであれば、早速大容量の2.5インチHDDをバックアップメディア代わりに買いませんか?
     | 2016年9月6日

    AndroidとWindowsで使えるパーソナルデータベース「ショートアイデアノート」のVer 1.12をウィンドウズストアとGoogle Playにて公開しました。最新版では、DropBoxの最新のプログラム命令への対応や、サービスが終了したBitcasaの除外など、オンラインストレージサービスの改善や更新が行われています。

     | 2016年9月5日

    マウスカーソルのすぐそばでIMEが有効になっているかの状態を一目で確認できるユーティリティ「IMEステータス」のVer 2.12のテスト版を公開しました。このバージョンでは、Windows 10 Anniversary Updateに対応し、最新のウィンドウズでも正常に機能するように修正されています。ベータ版は正式版公開まではどなたでも無料でご利用いただけます。もし、何かしらの問題がございましたら、ご一報いただければ助かります。

     | 2016年8月22日

    PS Plusで無料配信していたサバイバルホラー「サイコブレイク」をプレー中です。難易度「Survival」で体力を最低にして常に一撃死される状況を作るという縛りプレーでクリアーできたので、なんとかなりそうだと、トロフィーコンプを目指し、現在難易度「Akumu」で遅い歩みながらも進めています。このゲームの難しいところは、雑魚やボスの強さよりも、最低難易度以外はスナイパースコープを除いて、銃器の照準が一切出ない点ではないでしょうか。高難易度は入手できる弾数がかなり少ない上に、敵や罠から逃げるため特定のオブジェクトを撃たなければいけないのに、弾丸が敵の股をくぐり抜けたりと外しまくってゲームオーバーになるたびにストレスがたまります。

    ディスプレイに物理的に貼り付ける「照準シール」なるものも売ってはいるのですが、このゲームのためだけに買うのも何なので、自作の照準を作ってプレーしています。作り方は、100円均一のスマートフォン用液晶保護フィルムを小さく切ったものを液晶ディスプレイの中央に貼り付ける→ゲームをプレイし、スナイパーライフルをのぞき込み、その中央に文房具の修正液をフィルムの上からポチッとつける。


    ゲーム自体に弾道のぶれの概念があるため、それでも当たらないことがありますが、無いときにくらべ、格段に命中率が上がりました。
     | 2016年8月8日

    実際に外出して目的地へ行くことでゲームが進行するイングレスをベースにした話題のゲーム「ポケモンGO」。GPSやモバイル通信を稼働し続け、捕獲時は3Dグラフィックが動くことより、電池の消耗の激しさが対策の一つになっています。多くの人はモバイルバッテリーを持ち歩くことを推奨していますが、お散歩のついでにゲームをする程度に軽く遊ぶのであれば、家に帰ったらスマホで別の作業にすぐに取りかかれる充電器を購入した方が良いでしょう。

    最近のスマートフォンはQualcomm Quick Charge 2.0に対応したモデルが増えています。これは9V/1800mAの電流と、一般的なタブレット向けアダプター(5V/2000mA)と比較しても、ワット換算で1.6倍のエネルギーを供給するため、電池の消耗度が大きいほどその効果は大きく得られます。市販の対応ACアダプターは過大な電流に耐えられるかをチェックしてから、充電を行うため、仮にスマートフォンが対応していなくても、5V/2000mAでの急速とまでは行きませんが、高速充電を行うことができます。

    ちなみに、9V電源とUSB充電ケーブルを直結して急速充電をする猛者もおられましたが、スマートフォンを破壊する原因になるので、素人は素直に安全回路が入っている市販品を買いましょう。

    ちなみに管理人はタイムリー社のUSB ACアダプター(TM-QC2-BK)をZenfone 2(Quick Charge 2.0ではないが、9V充電には対応している)で使っていますが、ゲームをした後小休止をしたらもう再開できるくらいまでにバッテリーが充電されているので、3Dゲームを連続して遊ぶにはとても便利です。

     | 2016年7月20日

    Programming a wildcard string search without regular expression.

    URLがユーザー定義とマッチするかどうかのプログラムをJavaScript組んでいます。これにワイルドカードを実装してみたのですが、一番手っ取り早い、正規表現による手法だと、文字列エスケープや正規表現のコンパイルやテストの実行などいろいろな計算が介入するので、個人的には処理速度が気になってしまいました。

    function matchRegKey(keydef, key){ var s = keydef.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&"); // ワイルドカード以外のエスケープ s = s.split("*").join(".*?"); // ワイルドカード「*」を正規表現における表記に変換 var rex = new RegExp(s); return rex.test(key); }
    いろいろ探しても良い情報が見つからなかったので、indexOfとsubstringを駆使した文字列照合によるプログラムを作ってみました。
    function matchKey(key, keyword){ var d1 = keydef.indexOf("*"); if(d1 == -1 && keydef == key) { return true; }else if(d1 > 0){ if(keydef.substring(0, d1) != key.substring(0, d1)) return false; } var k1 = 0, klen = keydef.length, match = false, ss; while(d1 != -1 && d1 < klen){ d1++; var d2 = keydef.indexOf("*", d1); if(d2 == -1){ d2 = klen; } ss = keydef.substring(d1, d2); k1 = key.indexOf(ss, k1); var kk = key.substring(k1, k1 + (d2 - d1)); if(kk != ss) return false; match = true; d1 = d2; } return match; }
    一通りのテストは通ったので、ベンチマークを実施。
    function TestLoop(){ var keydef = "*yahoo.*.*"; var key = "www.yahoo.co.jp"; console.time("regex"); for(var i =0; i < 100000; i++) matchRegKey(keydef, key); console.timeEnd("regex"); console.time("index"); for(var i =0; i < 100000; i++) matchKey(keydef, key); console.timeEnd("index"); }
    私のパソコンでの結果はこのようになりました。正規表現はやはり時間がかかりますね。

     | 2016年7月19日