Elfariaのチラシの裏 このページをアンテナに追加 RSSフィード

2017-05-29 Cognitive Service たーのしー!

[] Emotion APIとVision APIのサンプルを作った 22:53  Emotion APIとVision APIのサンプルを作ったを含むブックマーク

de:code 2017 のHack Days(Day3/4)でいろいろとハンズオン部屋に行って学習してて、Hololens,Machine Learning,いろいろあったけど、Day3が終わってホテルに戻ってきたところで、せっかくだし、Cognitive Serviceあたりで一本ソフトを作ってみようと画策。

Day4はひとりハッカソン状態で、サンプルアプリを作ってました。C#で。本来はVB.NETの人だけど。

カメラを使うAPIを何にするかで2時間ぐらい悩んだ。あと実装とかバグ取り2〜3時間くらいかな

で、その成果物とか何というか。ただのサンプルアプリですが、これまた初めてつかうGitHub上に、公開してみました。

みんなライセンスはMITでいいっていうからMIT Licenseにしてみた。ライセンスガイド、パパッと読んでみたけどこれでいいのかな。一応無保証ですという感じ。

サンプルだからクオリティは求めちゃいけない(逃げ)

そんなわけでGitHubリポジトリはこちらです → GitHub - telfaria/FaceAnalysisWinForm: Cognitive Service API Sample

あ、言い忘れた。Windows Form アプリです。UWPとかWPF考えてみたけど、慣れてないので画面作るだけで一日が終わってしまう恐怖があったので。あえて妥協。

Hololens開発面白かった。Unity使いこなせないと難しいのかなぁ。

2016-10-29 最近Arduino触ってるけど、基本は.NETがメインの人です

[][][]ArduinoでOBDモニタみたいなのを作った話。 22:11 ArduinoでOBDモニタみたいなのを作った話。を含むブックマーク

ちらっとOBDモニタみたいなのが欲しくて、Arduinoなら作れるんじゃないかな、と思って作ってみた。.NET環境がメインでC(に近いArduino)なんて初めてですが、ポインタがない分簡単に理解できそう(罠)

使った物

IDEに関しては、 arduino.cc にあるものではなく、arduino.org にある、Version 1.7.11 のIDEでないと、MultiLCDでの文字表示が正常に出来なかったのでメモ。

OBDの通信プロトコルは複数あり(Ref: 自動車の自己診断機能 - Wikipedia)基本的には、使用するライブラリの OBD.h の108行目付近にある

init(OBD_PROTOCOLS protocol = PROTO_AUTO)

を、その手前あたりにenum で定義されている OBD_PROTOCOLS に合わせれば大丈夫そう。(ほとんどの場合は PROTO_AUTO で大丈夫らしい(自車もPROTO_AUTOでいけた))

また、取得出来るパラメータは同じく OBD.h に定義されてるけれども、車種によって取得出来ないものもあるので注意。

ちなみに自車はZC72S(K12B)(RS)ですが、今のところ

  • PID_ENGINE_REF_TORQUE
  • PID_FUEL_PRESSURE
  • PID_ENGINE_OIL_TEMP
  • PID_AMBIENT_TEMP
  • PID_FUEL_PRESSURE

は取れませんでした(OBD.hでDEFINEしてる値)

ちなみに現在こんなところまで出来てます

f:id:elfaria:20161029215515j:image:w360

OBDは常に通電しているので、エンジンカットしても値が表示されたままだし、Arduinoは基本、電源を切るというのがない(スリープモードはあるらしい)ので、現在スリープモードとかの実装の検討とか作業してます。

ここのサンプルコードを参考にして作ってます。

2016-05-14

[][][]String.Format とStrings.Format 11:45 String.Format とStrings.Formatを含むブックマーク

仕事で大ハマリしたのでメモ。
String.Formatは、.NET FrameworkのSystem.Stringクラスにある。(文字コードUTF-16ベース)
Strings.Formatは、Microsoft.VisualBasic.Stringsクラスにある。

(以下サンプルはVB.NETで書きます)

それぞれ引数が違ってて、
String.Formatは(format As String, arg0 As Object)と取るのに対し、
Strings.Formatは(Expression As Object, Style As String)で順番が違う上に、引数のfomatとStyleそれぞれの指定方法が違う。(ここで大ハマリした)

String.Formatは、.NETっぽく、"{0}" とか、"{0:yyyyMMdd}"とか、"{0:0000}"等と指定できるのに対し、
Strings.Formatは旧VB(VB6)からの互換っぽいメソッドなので、指定方法が"0000" とか"yyyyMMdd"とかの指定方法になる。

String.FormatはParamArrayがサポートされており、String.Format("{0}, {1}, {2}", arg0, arg1, arg2)みたいに複数の引数とフォーマットがサポートされているのに対し、
Strings.FormatはExpressionにあたる変換元パラメータが一つだけ。

あと、String.Formatは、String.Format って書くのに対して
Strings.Formatは、(VB.NET上では)ただ単にFormatって書くとそれがStrings.Formatとして認識される。(表示されるパラメータの順序が違うのでIntellisenseでわかる)

同じコード(クラス)内にString.FormatとStrings.Formatが混在してややこしくなった昨日の午後。

まだリファクタリングしてない。明日やる。

2015-12-04 あれから一年

[][][]Dictionary型を使って簡単にConfigっぽいものを扱う 21:33 Dictionary型を使って簡単にConfigっぽいものを扱うを含むブックマーク

生きてます。(生存戦略報告)

Advent Calenderネタを書いたのがちょうど一年前。筆無精しまくっててだいぶご無沙汰になってしまいました。

今回はDictionary型を使ってConfigっぽいものを手軽に扱ってみようというネタです。

設定ファイルを扱う方法は、.configだったり、.iniだったり、レジストリだったり、いろいろ方法ありますが、とりあえずDictionary型を使って読み書きしてみます。

Dictionary型って、いわゆるハッシュテーブルとか連想配列って呼ばれるやつですね。

#えっと、今まで(VB.NETを触りだして10年以上)こんな型があるなんて知らなかったことを正直に白状しておきます。

たとえば、こんな感じの設定ファイル(config.txt)があったとして

data=abc
pos_x=120
pos_y=240

その設定ファイルを読み込むには、たとえばこんな読み込み用関数を作っておいて

Dim config As New Dictionary(Of String, String) 
Dim configDelimiter As Char = "="c  ' configなファイルの区切り文字

Function ReadConfig(filename As String) As Dictionary(Of String, String)
    'configファイルの読み込み
    Dim configLines As String() = IO.File.ReadAllLines(filename)

    Dim dict As New Dictionary(Of String, String)

    '読み込んだconfigのDictionary型への追加
    For Each configLine As String In configLines
        dict.Add(configLine.Split(configDelimiter)(0).Trim(" "c), configLine.Split(configDelimiter)(1).Trim(" "c))
    Next

    Return dict
End Function

読み込んであげると楽です

config = ReadConfig("Config.txt")

読み込んだデータは、For Each で取り出すことも出来ます。取り出されたのはKeyValuePair型になるっぽい。

'Configの列挙
For Each kvp As KeyValuePair(Of String, String) In config
    Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value)
Next

値の追加とか

config.Add("Today", Today.ToShortDateString)
config.Add("Now", Now.ToString)

Keyが存在しているのにValueをAddしようとすると、例外を吐くので、Addする前はContainsKey(keyname)で、存在チェックをしてから更新したり追加したりするといいと思います。

If config.ContainsKey("Now") Then
    config("Now") = Now.ToString
Else
    config.Add("Now", Now.ToString)
End If

値の取得は config("pos_x") みたいな感じで取得可能です。あ、今回の例では New Dictionary(of String,String) で初期化しているので、必要あればParseしたりしてください。

また、逆に設定ファイルへの書き込みは、こんな関数を作っておいて

Sub WriteConfig(filename As String, config As Dictionary(Of String, String))
    Dim writeData As String = ""
    For Each kvp As KeyValuePair(Of String, String) In config
        writeData &= kvp.Key & configDelimiter  & kvp.Value & vbCrLf
    Next

    IO.File.WriteAllText(filename, writeData)
End Sub

書き込んであげるといいと思います。

WriteConfig("OutConfig.txt", config)

自分自身のアセンブリをSHA256とかでハッシュ取って保存しておき、実行時に検証する、っていうアセンブリの簡単な改ざんチェックとか、いろいろ用法あると思います。(今回のDictionary型じゃなくて.configとかでもできそうだけど)

例によって(?)上記サンプルでは例外対策とか、読み込み時にデリミタ文字が複数出てきたときの対処とか、全くしてないので必要あればTryしてCatchしてFinallyしたりしてみてください。

2014-12-12

[][]追記というか捕捉です(後で書こうと思って書くの忘れた) 22:25 追記というか捕捉です(後で書こうと思って書くの忘れた)を含むブックマーク

2014-12-06 - Elfariaのチラシの裏の補足というか追記。

[アドオンの管理]→[追跡防止]→[個人用リスト] の追跡防止設定も無効にしたら、やっと表示されるようになったので追記でした。というか捕捉。

前回のままだと追跡防止の個人用リストが有効になってると、まだ表示されない部分があったので。

Connection: close