追記

日々をアレコレ

-広告-


2017年05月19日 この日を編集

bCore Driver MXを作りました

Vagabond WorksさんからbDriverMXのAndroid版を作らない?という話をもらって作っていた、bCore Driver MXを公開しました。

実は、もう少し早く公開したかったのだけど、いろいろと事情があって公開が遅くなっていたり。まず、手元にAndroid端末が少なかったので十分にテストができなかった。開発を始めるにあたって、手元にあったのは7.0が入ってるMoto G4 plusと4.4のXperiaZだけのつもりが、なぜかXperiaZが起動しなくなってた。なので、しばらくはMoto G4 plusだけでテストはしていて、GW中に別の端末を手に入れようとか考えていたら、XperiaZが再び動いてなんとかサポートできる一番古いのと、最新に近いものでのテストは完了。で、実際にベータ版としてリリースしてみたら5.0/5.1/6.0でのみ発生するバグが。こちらは、AppCompatActivityのPrimary Colorに透過色を入れたことが問題だったらしく、それを改善したアプリを作ったところで、別の問題が発生。

今度は、Googleから規約違反だバカヤローという連絡が。具体的にいうと、すでにPlayストアで公開されてるアプリのなりすましなのが問題だと。ただ、Playストアに類似のものは見つからないので、何が問題無の?と問い合わせたところ、元となったiOSアプリをそのまま使ってるだろう、ということだった。で、Vagabond Worksさんに許諾書を作ってもらって、ようやく公開できるように。一応、Googleもそういうところは監視してるんだね。けど、それならそれで「Playストアの既存アプリ」ではなく、「他のプラットホームにあるアプリ」とか書いてほしかったよ。


2017年05月09日 この日を編集

Fragmentには気をつけて

AndroidのFragmentでハマったのでメモ。

やりたかったことは、

  • 1つのActivityの中で複数のFragmentを切り替える。
  • Activityがバックグラウンドに一度行くと、次にフォアグラウンドに来たときは特定のFragmentが表示される。 という結構シンプルなこと。で、実現のためにしたことは、
  • Fragment自体はActivity.OnCreateで生成し、FragmentTransactionに登録。
  • Activity.OnResumeで初期表示するFragmentをshowするようにする。 とい感じ。これだと、アプリ起動中に端末がスリープ状態になり、復帰するとすべてのFragmentが表示されるようになる。Twitterで教えてもらった内容だと、スリープから復帰時にすでにあるFragmentが再度自動生成されているにもかかわらず、さらに新しいFragmentを生成して追加していることになり、一方だけの表示切り替えをしていることになる、ということらしい。なので、Fragmentの生成と登録は次のようにするほうがいいらしい。
var transaction = FragmentManager.BeginTransaction();

// FragmentAを探す
var fragmentA = FragmentManager.FindFragmentByTag<FragmentA>("FragmentA_Tag");

if (fragmentA == null)
{
    // FragmentAはないので生成して追加
    fragmentA = new FragmentA();
    transaction .Add([Frame], fragmentA, "FragmentA_Tag");
}

transaction.Hide(fragmentA);

// FragmentBを探す
var fragmentB = FragmentManager.FindFragmentByTag<FragmentB>("FragmentB_Tag");

if (fragmentB == null)
{
    // FragmentBはないので生成して追加
    fragmentB = new FragmentB();
    transaction .Add([Frame], fragmentB, "FragmentB_Tag");
}

tarnsaction.Hide(fragmentB);

transaction.Commit();

これで、Fragmentがスリープのたびに追加されることを回避できる。ただ、 FragmentManager.FindFragmentByTag などで見つかったインスタンスは、追加時に生成したものとは異なる。なので、Fragmentにイベントを定義して、FragmentからActivityの処理を呼び出すようにするようなことをする場合、FragmentManager.FindFragmentByTag などで既存のFragmentがある場合も、新たに生成した場合もどちらの場合もイベントの登録はその都度行う必要がある。


2017年04月09日 この日を編集

Windows10 IoT Core on Raspberry Pi2で日本語音声認識をする

Raspberry Pi2にインストールしたWindows10 IoT Coreで音声認識で日本語パッケージを追加できるようになったということを聞き、早速試してみた。基本的なところは、Windows 10 IoT Core の Anniversary Update で日本語音声合成しちゃいました – DevWire (2016/9/26) – DevWire 組み込み業界必読の無料ニュースレターのまとめ を参考にした。

まず、最新のRelease版Windows IoT Coreのイメージを作成する。これは、IoT Dashboardを使ってMicroSDカードにビルド15063のイメージを書き込んで、Raspberry Pi2に挿して起動すればひとまず準備完了。

次に、日本語の音声認識のエンジンを取得するためのパッケージを取得する。こちらは、Windows 10 IoT Core Packages from Official Microsoft Download Center をダウンロードして、ISOファイルにあるWindows_10_IoT_Core_ARM_Packages.msiを実行して、PCにパッケージをインストールする。インストール先はデフォルトで C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm で、 C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm\fre\Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab をUSBメモリなどにコピーしておく。PowershellでRaspberry Pi2に接続して、次のようなコマンドを実行。

# ドライブの確認。サイズなどを参考にUSBメモリのドライブレターを確認する。
> gdr
# USBメモリのドライブをE:としてコピーをする。
> copy E:\Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab C:\
# Cドライブに移動
> cd C:\
# パッケージを適用
> applyupdate -stage Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab
# パッケージを更新
> applyupdate -commit

完了したら、Raspberry Pi2を再起動すれば、日本語の音声認識や音声合成などがインストールされた状態になる。

最後に、アプリの中で音声認識の言語を選択する方法について。こちらは、簡単で SpeechRecognizer のインスタンスを生成する時に Windows.Globalization.Language を渡せばいいので次のようにする。

var recognizer = new SpeechRecognizer(new Language("ja"));

この recognizer を使って音声認識をすれば、日本語の認識をできるようになる。


2017年04月03日 この日を編集

.NET MicroFramework Toolbox

[スイッチサイエンス][(https://switch-science.com/) さんでの買い物で送料を無料にするための調整に WiiChuckアダプタ を買った。これを netduino plusから使おうとArduino向けに公開されてるコードを参考にしながら作ってみたけどうまく動かなかった。けど、.NET Micro Framework Toolbox なんていうものを発見。こちらは、いろんなハードウェアの.NET MF向けのライブラリになってるらしく、Wiiヌンチャクも当然ながら対応済み。とりあえず、これで動いているので次に進むよ。


2017年03月28日 この日を編集

STM32F429 Discoveryで.NET Microframeworkを動かす

スイッチサイエンスさんでDiscovery kit with STM32F429ZI MCUが販売されるようになった。これまでよく売られていたSTM32F407 Discoveryと違って、STMicroelectronicsが.NET MicroFrameworkに対応するファームウェア を公開しているボードで、DigiKeyとかでしか日本では変えなかったもの。送料とかの問題でそこに手を出すのは面倒だなーって思っていたところで、今回のスイッチサイエンスさんでの販売なので、早速購入して環境構築したのでメモ。

まずは、ファームの更新から。

  1. STM32F429 Discovery向けの.NET MFファーム をダウンロード。
  2. STM32 ST-LINK utility をインストール。
  3. STM32F429 Disoveryのmini USB側で接続して、ST-LINK utilityを起動して、Target > Connectを選択。
  4. さらに、Target > Program & Verifyを選択。
  5. File Pathにダウンロードしたファームのzipを解凍した中から「NETMF_Binary_Image\Tinybooter.hex」を選択して Startボタンを押す。

ひとまずはここでファームの更新を完了する。

次に、開発環境を用意する必要があるんだけど、ここで注意が必要。ここで書き込んだファームって、.NET MFのバージョンが4.3.0.0でちょっと古い。具体的に言うと、.NET MF SDK 4.3(RTM) というバージョンのSDKをインストールする必要がある。最新が .NET MF SDK v4.3 (QFE2-RTM) で、4.3.1.0になるので、すでにそちらをインストールしてる場合は、バージョンが違うのでデプロイに失敗する。さらに、この.NET MF SDK 4.3(RTM)をインストールするには、Visual Studio2012がインストールされてる必要があるので、次の2つをインストールする。

すでに新しいバージョンの.NET MF SDKをインストールしてる場合は、インストールパスを変えておくほうがよさげ。

次に、STM32F429 DiscoveryのminiUSBで接続したまま、microUSBでもPCに接続する。その上で、MFDeployを起動して次の手順を実施。

  1. Deviceのコンボボックスで「USB」を選択する。すると、よこに「STM32F429I_DISCOVERY_a7e70ea2」と表示されるのを確認。
  2. Image FileのBrowseボタンを選択して、ダウンロードしたファームウェアの次の2つのファイルを選択。

    • NETMF_Binary_Image\ER_CONFIG.hex
    • NETMF_Binary_Image\ER_FLASH.hex
  3. Deployボタンを押す。

これで、Visual Studio 2012 Expressから「.NET MicroFramwork」から開発ができるようになる。

新しい2013以降のVisual Studioで開発できるかは未確認。


-広告-

追記