2016年7月2日

[cntk]バージョン1.5がリリースされていました

少し心に余裕ができたので、久しぶりにCNTKのサイトを確認しました。

Release CNTK version 1.5 (Windows+Linux) · Microsoft/CNTK

バージョン1.5が出ていました。
25日前なので、6月の最初の方に出ていたようですな。

 

以前作っていた、Simple2dサンプルのCNTKファイルをそのまま動かそうとしましたが、トレーニングファイルのファイル名が変わっていました。
比較すると、CNTKファイルの中身がいくらか変わっています。

  • UCIFastReaderがCNTKTextFormatReaderになっている
  • startやlabelMappingFileの指定がなくなった
    • formatが追加され、"dense"になっている
  • トレーニングファイルの構成が変わっている
    • 以前:-0.127551 0.650403 0
    • 今回:|labels 1 0    |features -0.127551 0.650403
    • マッピングファイルと合わさったのかな

 

そこら辺を変更すると、動いた。
graphvizで「??」だったところも、何か出ている。
が、v1.1ので動かしても表示されたから、単にフォントがWindows7には入ってなくて、Windows10で入っているとか、そういう話だったのかも。

以前の出力例

 

今回の出力↓↓

image

 

でもねー、CNTKって使っている人が少ない気がするのだ。
単に私が見た記事がそうなだけかもしれないけど、TensorFlowが多い気がする。

実現できればなんでもよいとはいえ、よくわかっていないのでユーザが多い方がいいのよねぇ。
私も、マシンが新しくなって、VirtualBoxが動いていてもストレスがなく、Linuxでしか動かなくてもいいかな、と思ったりもしている。
と、弱気になりそうだが、もう少しだけやってみよう。

[勉]Ruby

mrubyとmruby/cがある、というのは調べたが、そもそも言語仕様をよく知らないので、軽く調べておこう。

ただ、ここで「入門」で調べると、「変数とは」とかから始まって、中身を調べるまでがきつい。
なので「C Ruby」とか「Java Ruby」とかで検索して、知っている言語との違いや、こっちにあってこっちにない、のようなところを見ていく。

といいつつ、ちょっとやっただけの言語も知っている部類で書くので、間違ってたら済まんです。


  • 変数宣言が特にないようだ
    • 変数名の1文字目でいろいろ決まる
    • スコープは、ローカル、インスタンス、クラス、グローバル
    • 擬似変数というものがある。C++のthisみたいなやつ。
    • 組み込み変数というものがある。argv[]みたいな感じか。
    • 定数かどうかも変数名の1文字目で決まる
  • 基本的にオブジェクト
    • 「23.to_s()」みたいに書ける
  • JavaScriptみたいに、型がない
    • 変数名でわかるようにするのが推奨なのかな?
  • コメントはbashみたいに#で始まる
    • 複数行コメントはなさそう
  • 行の終わりは、pythonみたいにセミコロンがあってもなくてもよい
  • 演算子は、C++みたいに一部は再定義できる
  • 代入は、普通に=でできる
  • ifなどの制御構造が、Cと違って値を返すものがある
    • たとえばifの場合、条件分岐のifと、修飾子のifがある
      • 条件分岐のif
        • elseifでも、else ifでもなく、elsif
        • elseもある
        • thenもある
        • 終わりは、end
      • 修飾子のif
        • 「実行式 if 評価式」みたいに書けて、評価式がtrueだったら実行式を処理する、みたいになる
    • switch-case-defaultじゃなくて、case-when-else-end
    • ifが真の条件で評価するのに対し、偽の条件で評価するunlessがある
      • unlessにも、条件分岐と修飾子がある
      • 条件分岐にはelsifがない(elseはある)
  • throwじゃなくて、raiseで例外を投げる
    • try-catchではなく、begin-rescue-endで例外を捕捉する
    • finallyではなく、ensureらしい
    • 例外が発生しなかったときに通るelseがあるらしい
  • 戻り値はreturn
  • 基本的にオブジェクトで、オブジェクトはクラスかモジュールに属する
    • なので、関数を作りたかったらクラスのメソッドを使って呼ぶ
      • ・・・と思うけど、どうなんだろう? あとで試す
    • モジュールは、クラスっぽいけど特殊扱いらしい
  • nullじゃなくて、nil
  • thisじゃなくて、self
  • includeじゃなくて、require
    • ファイル名を書くけど、相対パス指定で書くのが良いのか?

 

さあ、いくつか試してみよう。


まずは、関数というかメソッド。
クラスを作らずにdefできるのだろうか?

【test1.rb】
def func()
    return "hello\n"
end

print func()

$ ruby test1.rb
hello

普通に動いた。
じゃあ、これはJavaみたいにファイル名と結びついたtest1というクラスなのだろうか?

class()というメソッドで属するクラス名がわかるらしいので、見てみよう。

【test2.rb】
def func()
    return self.class()
end

print func()

$ ruby test2.rb
Object

予想と違った。
Objectは、Javaのように全てのクラスのスーパークラスとのこと。
うーん、でも、Objectから派生したクラスじゃなくて、直接Objectに属しているということになるのか?
あるいは、どこにも属していないから、やむなくObjectと表示しているだけなのか。

いや、class()の例に、self.class()でObjectと出力されているな。
では、クラスのメソッドにしてみよう。

【test3.rb】
class Klass
    def func()
        return self.class()
    end
end

a = Klass.new
print a.func()

$ ruby test3.rb
Klass

ふむ、地の文のselfはObjectクラスに属しているということか。


別ファイルにしてみよう。

【Klass.rb】
class Klass
    def func()
        return self.class()
    end
end

【test4.rb】
require './Klass.rb'

a = Klass.new
print a.func()

$ ruby test4.rb
Klass

同じディレクトリだからといって、"./"を書かなかったらダメだった。


と、ここまで何も考えずにprint文を使ったけど、これは一体何だろう?

【test5.rb】
print print.class()

$ ruby test5.rb
NilClass

nilじゃなくて、NilClassなんだ。
nilは変数で、そのクラスがNilClassとのこと。
まあ、クラス名じゃ操作できないから、そうなるか。

じゃあ、NilClassにprintメソッドが属するのも変な気がするが、printはKernelモジュールに属しているそうだ。
そうだね、出力がnilだから、NilClassになったというだけなのだね。

そしてKernelモジュールは全てのクラスが参照できるとのこと。
「Objectクラスのメソッドは実際にはこのモジュールで定義されています」とあるが、さっき使ったclass()は載ってないな。


まあ、1回ざっと見ただけで言語仕様がわかるわけでもないので、このくらいで止めておこう。

2016年7月1日

[android]ProGuardでLog.d()がStringBuilderで残る

ProGuardをかけた。
うん、ログは出力されていない。

と思って、逆アセンブルというか、classを見るツールで見てみると、new StringBuilder()になって残っていた。。。

確かにLog.d()などは消えているのだが、中身が残っているようだ。
炊飯器がなくなったのに内釜だけあるという感じ?

全部ではなくて、引数を出そうとしたログの痕跡が残っているようだ。
つまり、足し算などをしているところですな。

 

android - Removing unused strings during ProGuard optimisation - Stack Overflow

シンプルな引数にしましょう、と書いてあるけど。。。
どうしようもないのかね。

[勉]mruby/c

mrubyを教えてもらった人から、mruby/cというものを教えてもらった。

mrubyc/mrubyc

mrubyが400KB程度(前回は4年前の記事だったから大きかったのね)だけど、mruby/cでは40KB程度を目標にしているようだ。
「memory」って、実装量よね? RAMの方じゃなくて。。。

ともかく、OS無しで動かすことを考えている。
そうであれば、興味が湧いてくるな。


mruby/c|しまねソフト研究開発センター

スライドを見ると、いまターゲットにしているのがp.20に書いてあった。

  • PSoC5
  • RX63N
  • PIC24

RX63Nしか使ったことが無いが、16bitマイコンでも動かせるのか。
手元にARM系しかないので、ちょっと試すというのはできないのかな。

機能追加は、ラッパを作って行うようだ。
ここら辺が、どうなるかでしょうかね。
たとえば、nRF51822でmruby/cが動かせたとして、SoftDeviceの中身か、あるいはそれを使いやすくしたものでも良いけど、全部ラッパを作ろうとしたら大変な手間だ。
それくらいだったら、今のままでいいや、となってしまいそうだ。

 

製品向けの開発ボードを作ったとして、そこにmruby/cを載せたいかというと、最初はボードが動いたり動かなかったりして時間がかかり、そうこうしているうちにソフトの開発時間が押してくるので、もうCでいいや、となってしまいそうな気がしたのだ。

ただ、長年使うようなシステムだったり、評価ボードだったら良いかもしれない。
なんというか、OSを作るのと似たようなもので、メンテナンス性が良いとか、そういう方向が向いているのではなかろうか。

 

でも、最近はサイクルが早いので、製品は使い捨てみたいな感じもあるしなぁ。。。
なかなか難しいけれども、その辺りをどう考えているのかはフォーラムで話を聞けるかも。

[excel]テーマの色は変わる!

すごく当たり前なのだが。。。

Excel2013では、色の選択はこういう感じになっている。

image

あまり気にしていなかったけど、書いてあるとおり、上は「テーマの色」、下は「標準の色」なのだ。
だから、テーマの色を使って色を塗ると、それはテーマを変えると色が変わるのだ。

 

もう、そのまんまなのだけど、さっきまで気付かなかった。。。
だいたい最初にテーマを変えてから記入しているからだろう。

 

個人的には、標準の色の欄をもう少し増やしてほしい。
そしてそっちはそっちでカスタマイズして保存できるようになってほしいな。
色のテーマをカスタマイズしても、なんか、期待通りの色が出てこないのよね。

きれいに見せたいんじゃなくて、他と違うことを表したいだけだから、グラデーションとかじゃなくて、派手な色で全然違う系統のものをたくさん使いたいのだ。
マゼンタとかシアンみたいな、ああいう色の前半8色くらいの目立つやつが標準パレットに入っていてほしいのだ。

探せばプラグインがありそうなんだけど、ここはぜひ標準で。。。

[勉]mruby

久々に調べごとだ。

mrubyが気になったので、なんなのか調べる。


mruby/mruby: Lightweight Ruby

Lightweight Ruby、がmrubyらしい。
どこにも「m」が入っていない・・・。

じゃあ「m」ってなによ??
それが解決されない限り、信用してよいかどうかわからない。

「mrubyのm」で検索すると、いくつか出てきた。
こちらのPDFのp.12や、
https://www.scsk.jp/lib/product/oss/pdf/mruby_1.pdf
こちらにも。
http://blog.goo.ne.jp/xmldtp/e/9a1f2844b865fc97512965845f2fcccb

4つくらいmのつく単語があるので、「これのm」ということはなく「これらのm」くらいになるのか。


eMbeddedのmでもあるようだから、軽量Rubyは組込み向けも視野に入っているのだろう。
しかし、どのくらいの組み込み向けなのだろうか?

たとえば、Raspberry PiやBeagleBoneみたいなのも組み込みLinuxなので、そこで動かせば組込み向けになるのかもしれない。
ただ、イメージというか作業の内容からすると、「組み込みLinux」は組み込みって感じがするけど、その上で動くアプリは組み込み度が薄れると思う。
まあ、OSというものがそういう役割なのだから当たり前なのだが。。。

 

なので、組み込み度(?)が高いかどうかは、OS無しで動かせるかどうかが境目になりそうな感じがする。
あくまで、あくまで個人の感想だ。

たとえば、私がよく使っているnRF51822の上で動くのか?とか。ESP8266の上で動くのか、とか。
そして「動く」といっても、計算ができるだけだと意味がなく、GPIOがたたけるのかとか、レジスタにアクセスできるのかとか、そういうのが気になる。

別に良い悪いではなく、単に私が仕事で使うことが有りそうかどうか、という観点だ。


まつもと氏が語るRuby新ステージ - 第1回 mruby誕生の経緯を明かそう:ITpro

作者の話があるので、それを見てみるのが早いか。
4年前の記事だから今は少し違うかもしれんが、まあいいや。

mrubyに対して、本家RubyはCRubyと呼ぶようだ。
でも、MRubyではなく、mrubyなんだ。

で、VMが550KBか・・・。
けっこう、立派な環境が無いと使えなさそうだ。
Cortex-M系でマイコンとFLASHが一緒になっているやつだと、きついものが多いかも。
ESP8266だとFLASHが外付けだから、まだいけるかな?
記事でも「組込み分野の中でも上位の領域」とあるので、そこそこヘビーな実装をやることが多い環境向けということか。

という時点で、ちょっと興味が薄れてきてしまった・・・。


なんで急にmrubyを調べようかと思ったかというと、最近お話しした方が「mrubyに動きがあるようですよ」ということを言われたからだ。

福岡県Ruby・コンテンツビジネス振興会議

実用化促進フォーラムというものが行われるらしいので、行ってみるか。
私も、待ちの体制だけではお客さんが逃げていってしまうので、ちょっと顧客ニーズなるものを考えてみようかと思ったのだ。
まあ、仕事でmrubyってのは無いのかもしれないけど、「あ、これはmrubyでいけるかも」みたいなことはあるかもしれないし。

2016年6月28日

[java?]doReturn()は複数書けるし、ArgumentCaptorは複数取得している

まだまだテスト中だ。
とにかく、Java自体に自信がないので、テストパターンを多く作りすぎているような気がする。
まあいいや(仕様変更が来ないことを祈ろう)。

 

テストするメソッドで、別のメソッドを呼んでいると扱いが面倒なので、spy()していちいちdoReturn()とかdoNothing()とか書いている。
しばらくやっていると、同じ引数で1回目と2回目で違う値を返さないといけないパターンが発生。
まあ、レスポンス解析だからありがちだと思う。

どうやったらいいか調べていたのだが、単にdoReturn()をずらずらつなげればよいみたいだ。

doReturn(new byte[] {1, 2, 3}).doReturn(new byte[] {4, 5, 6}).when(xx).read(anyInt());

ほほう。

 

あと、呼び出した疑似関数の引数をArgumentCaptorで保持する方法も知った。

ArgumentCaptor<byte[]> writeCaptor = ArgumentCaptor.forClass(byte[].class);
doNothing().when(xxx).write(writeCaptor.capture());

//テスト実施後
byte[] captorData = writeCaptor.getValue();
assertThat(Arrays.equals(captorData, COMPARE_DATA), is(true));

assertThat()で配列の比較方法がよくわからんので、もうArrays.equals()にしてしまったが、まあいいや。

 

この方法だと、captorDataには最後に呼び出したものが残るようですな。
複数回はできるのだろうか?
できるのだ。
java - Can Mockito capture arguments of a method called multiple times? - Stack Overflow

さすがだねぇ。
と思って試すが、なんか動かない。。。

ああ、書いてあるのが、ArgumentCaptorの生成とverify()が並んで書いてあったから、そういう書き方なのかと思ったけど、verify()はいつも通りテスト実施後に呼べばいいだけか。

ArgumentCaptor<byte[]> writeCaptor = ArgumentCaptor.forClass(byte[].class);
doNothing().when(xxx).write(writeCaptor.capture());

//テスト実施後
verify(xxx, times(4)).write(writeCaptor.capture());
List<byte[]> captorData = writeCaptor.getAllValues();
assertThat(Arrays.equals(captorData.get(2), COMPARE_DATA), is(true));

つまり、Captorは動いていて、取得方法だけ変えればよいというわけだ。
verify()は呼ばないとだめなようです。
times()できっちりじゃなくても、atLeast()でいけるみたいだ。

2016年6月27日

[android]カバレッジを取りたい

Android Studio 2.1.2 + Nexus5で、カバレッジを取りたい。
いまの環境(2016/06/27)で、なるべく手間を掛けず、LCOVみたいなカバレッジ結果が見たいのだ。

Local Unit Testsの場合は、Project Explorer...という名前じゃないかもしれないが、左側に出てくるツリーでTestクラス名を右クリックすると「with Coverage」というメニュー項目があるからわかった。

では、instrumented Unit Testsの場合は?


検索すると、jacocoというものを使う人と、使わない人がいる。
なんとなく、使わなくてもよくなっていそうなので、この人のを参考にした。

baroqueworksdevの日記: コードカバレッジを使って、視覚的/統計的にテスト状況を確認する

terminalからgradlewコマンドを実行せずとも、Android Studioの右上くらいにある「Gradle」をクリックするとツリーが出てきて、その中に「verification/createDebugCoverageReport」みたいなのがあるから、それをダブルクリックすると同じ効果があるようだ。

 

で、そもそもこれで何が実行されるのかがわかっていなかったけど、Instrumented Unit Tests側のフォルダ(androidTestと書いてある方)のテストが実行されるようだ。

ただ、実機側のログに「java.lang.ClassNotFoundException: org.jacoco.agent.~~」や「TestRunner: Failed to generate emma coverage. 」と出ているので、jacocoを明示的に指定しなくてもよくなっただけかも。

あと、テストがちゃんと動かせてないのかも。。。
でも、reportフォルダの中にはそれらしいものが生成されているから、まったくダメというわけでもないだろう。

 

この辺りが役立った。
BDS pluginの生成するソースでは、Handlerを使っているのだ。
AndroidのInstrumented Unit Testsを試す - mnatsu31’s blog

 

あと解決できてないのが、同じく生成されているServiceだ。
これが動いてくれないと、何もできないに等しいのだ。。。

でも、下回りを全部動かすテストって、もうUnit Testじゃないよねぇ。
そうそう、そもそもは、単にアプリを動かしたときのカバレッジがほしかっただけなのだ。

初心を忘れていましたね。


しかし、勝手にカバレッジを取ってくれるような方法は見つけられてない。
gccで-coverageを付けてビルドしたアプリを動かしたときのようなやつだ。

正常系はボタンとか操作して動かすことでカバレッジを取っておいて、それで動いていない箇所だけLocal Unit Testsでやろうか、と思っていたのだ。

 

JavaやAndroidだから、そういうのもできるのかも、と思ったけど、やり方がわからんだけか。。。
なんか「最新の科学で解決しました」みたいなイメージでいるから、よくわからないけどやってくれそうな気がしたのだよ。

[android]Instrumented Unit Testsじゃないとandroid.jarは例外/デフォルト値を返す

こんなテストコードを書いた。

@Test
public void testTest() throws Exception {
    SparseArray<String> strMap = new SparseArray<>();
    strMap.put(0x00, "moji");
    String err1 = strMap.get(0x00, "momo");
    System.out.println(err1);
}

実行すると、nullになった。。。
newしてるのにnullか。


よくわからずに書いている箇所があるが、build.gradleのreturnDefaultValuesもそうだ。
これをコメントアウトすると、実行するとエラーになる。

java.lang.RuntimeException: Method put in android.util.SparseArray not mocked

これだ。
実機を動かさずに行うUnitTestではandroid.jarが空実装だから、例外になるようだ。
これを、例外を出さずにデフォルト値を返すようにするのが、returnDefaultValuesというわけだ。

 

SparseArrayは特にAndroid実機の機能を使っているわけでは無いのだろうけど、これを解決させるのに悩むくらいだったら、実機で動かしてしまった方が楽そうだ。

そういう、Mockなどを使わずに動かしてテストもしたいなら、Instrumented Unit Testsの方になるようだ。


Local Unit Testsを始めるときと同じように、書いてあるとおりにやると動いた。
テストを右クリックで生成するときに、どのフォルダに格納するか聞いてくるが、あれの先が「androidTest」になるのだな。

そして、build.gradleも「testCompile」じゃなくて「androidTestCompile」になる。
returnDefaultValuesはtrueのままでよいようだ。

実行すると、アプリが実機に転送されて実行し、ちゃんとassertThat()なんかも判定している。

 

android.jarのところも含めてMockにしてメソッドを動かしていくならLocal Unit Tests、android.jarはそのまま流して動かしたいならInstrumented Test Unitsがよいかな。

[ble]iOSはPPCPを読まない

私はiOSはもうやっていないのだけど、BLE Periphearlを作るとiOSのことも考えることがある。
Connection Intervalがどうなっていたか、忘れてしまったのだ。

 

Bluetooth Accessory Design Guidelines for Apple Products

2016/06/27の時点でも、R7が最新のようだ。
これはこれでよいのだけど、探している途中で見つけたこちらが気になった。

BLE settings for max data transfer speed to iOS - Nordic Developer Zone

質問は、通信が遅いんだけどどうしたらいいの?なのだが、回答に「Apple does not read the PPCP value you set」とあるのだ。
iOS(というか、Apple製品なんだろうけど)はPPCPを読まないんだ!

 

さらっと書いてあるけど、Connection IntervalはPPCPに書いておけば手間が省けていいや、くらいに思っていたので、ちょっと衝撃だ。

GAP Connection Parameter Update

S110だと、接続が確立した後でsd_ble_gap_conn_param_update()を呼ぶだけでよいようだ。