August 06, 2018

夏休みの工作: タッチセンサ

全然更新をしていませんが、生存しています。最近、夏休みの工作で、触れると反応するスイッチを試していました。使っているマイコンは(毎度お馴染みの)Silicon Laboratories C8051F996です。

こんなバラック配線で実験をしていました。

そして、これを、こうじゃ、ということでミニカーに組み込んでみました。なかなか好評です。CR2032電池で動いています。

詳細は次回に書こうと思います。→書きました。

23:58 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/948

August 10, 2018

夏休みの工作: ソースコード公開

先日のタッチでLEDが光る工作ですが、大したことしていませんがgithubにソース等置いておきました

水面下ではこそこそ工夫をしています。例えば、スリープにこまめに入れて、電池の延命をはかってあります。また実運用に移る前にDEBUGを定義してコンパイルすると、UART経由で静電容量のデジタル値を読めるようにしてあります。閾値を決めるのに役に立ちます。

schematics.png

そしてソース公開にあたって一番気合を入れたのが、上記(実体)回路図だったりします(笑)。

23:44 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/949

August 18, 2018

RSpecでのexample間共用のインスタンス生成

Rubyのコードをいじっていて、とうとうRSpec(テスト)を書く羽目になったのですが、そこでのメモです。
テスト対象になるインスタンスが、ソケットを生成していろいろ下準備をしてはじめて使えるようになるものだったので、テストを高速化するためにも、テストケース(RSpecではexampleと呼ぶらしい)間でインスタンスを永続化させて共通にできるところは共通にしたい、ということがありました。

こういうときは、全テスト前に実行されるbefore(:all)(←before(:context)のエイリアス)ブロックでインスタンスを生成すれば事なきを得そうですが、さらに事情が複雑で、インスタンスの生成方法を共通化したいというのがありました。常套手段としてはRSpecの外でFactory patternでも作ってそれを中で使えばよいのでしょう。だがしかし、未定義変数アクセス時に遅延評価によって変数内容を生成するRSpecの機能のlet(あるいはそのエイリアスのsubject==let(:subject))を利用してみることにしました。

そういうことで、いろいろ試してみました(別タブで見たほうが良いかも)。

spec/target_spec.rb にケースが6つ書いてあります(左側のアイコンを操作するとファイルを切り替えられます)。それぞれこんな感じです。

  1. よくある、テストケースごとに生成する場合。subject(let)使えばOK
  2. たまにみるインスンタス共通化方法(A)。一度だけ作成してインスンタス変数に保持。
  3. たまにみるインスンタス共通化方法(B)。テスト始める前にインスンタス作成してインスンタス変数に保持。
  4. 今回の想定。思った通り動作しない。それぞれのテストケースでインスタンスが作られてしまう。
  5. 今回の想定。エラー。
  6. 今回の想定。思った通りの動作

上の実行ボタンを押してみてください。特に[4]が意外で、インスタンス変数に代入しようとすると before(:all)で作ったものと、それぞれのテストケースの前で実行されるbeforeとで、違うものを見てしまっているようです。[5]もbefore(:all)とはスコープがことなるようで、一時変数にアクセスした際に怒られています。

[6]を使うと回避できました。インスタンス変数そのものではなく、中身についての変更でごまかしてあります。ということで[6]で目的を達成しました。おそらくバッドマウハウでしょうが…。

11:58 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/950