最近の記事

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

August 18, 2018

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]で目的を達成しました。おそらくバッドマウハウでしょうが…。

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

August 10, 2018

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

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

schematics.png

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

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

August 06, 2018

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

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

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

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

GPD Pocketに増設したストレージの速度

February 12, 2018

前回の記事でGPD PocketにUSBハブ、MicroSDリーダ、MicroSDを改造で仕込んでみたことを書きましたが、速度を確認してみました。USB 2.0接続なので、遅いだろうなー、と予期していたのですが、やはり遅かった、という結果です。

計測条件ですが、MicroSDはSandisk SDSQUAR-128G-GN6MA (128GB Class 10 UHS-1)です。またCrystal Disk Mark 6.0.0 x64を使って、速度を測りました。

まずは内蔵の状態で。少し悲しい速度てす。

gpd_pocket_cdm_sandisk_microsd128gb.png

念のため、MicroSDに非がないことを確かめました。USB 3.0接続でのカードリーダ(Elecom MR3-K005)を使って測っみた結果です。早いです。

gpd_pocket_cdm_sandisk_microsd128gb_usb30_mr3-k005.png

ということで、USB 2.0のHigh speed(480Mbps)がどうやらネックになっている気がします。USB 3.0 Super speed(5Gbps)がある現在だと、やはり見劣りしてしまいますね。

参考に内蔵のディスクも測ってみました。早いです。

gpd_pocket_cdm_internal_ssd.png

さらにおまけでUSB 2.0接続のUSBフラッシュ Sandisk SDCZ33-064G-J57 (64GB)があったので、それも測ってみました。内蔵したMicroSDと同程度の(遅い)速度です。

gpd_pocket_cdm_sandisk_usbpen64gb.png

さらにおまけで、テスト時のデバイスマネージャです。ディスクがたくさん。

gpd_pocket_disks_device_mgr.png

ということで、増設した内蔵ストレージは速度を要求しないもの(実験データ等?)を保存する用途に使おうと思います。

GPD Pocketにストレージ増設

February 04, 2018

あまりにも最近更新ができなくてすいません。生存報告がてら、軽めの話題を。GPD Pocketに内蔵するUSBハブの製作について書いてましたが、GPD Pocketのストレージ増設のため、MicroSD (SDHC,SDXCにも対応)リーダを内蔵してみました。

内蔵したのはKingston FCR-MRG2です。ハブ自体がUSB 2.0の4線式なので、そこまで新しいリーダである必要はなく、また余分な部品を削ったりすることなく内蔵できる、厚さの『薄い』カードリーダを探していたところ、この製品にいきつきました。

UEW(ポリウレタン被膜線)で接続します。

gpd_pocket_microsd_reader_1.jpg
gpd_pocket_microsd_reader_0.jpg

内蔵するとこんな感じ。リーダ自体は両面テープで本体に固定してあります。

gpd_pocket_with_microsd_reader.jpg

ストレージが増えて快適に使えています。

※その後、速度を測ってみました。USB 2.0接続なりの速度です。

GPD Pocket 内蔵USBハブ基板 公開

November 19, 2017

ちょっと時間が空いてしまいましたが、GPD Pocket 内蔵USBハブ基板基板データを公開しようと思います。前回の写真の基板から微調整してあります。

フレキシブル基板の製造がやっかいかと思いますが、そこをクリアすれば普通の製作と何も変わりません。ちなみに今回の基板では、PCBwayというところを利用してみました。フレキシブル基板でも見積もりがとれたので使ってみたという感じです。やり取りは丁寧でしたし、出来上がった基板も合格点だと思います。

GPD Pocket 内蔵USBハブ基板

October 18, 2017

前回の記事でアートワークだけを紹介しましたが、あれは数か月前に発売された小型PC GPD Pocketを改造するための基板でした。動作確認がいちおう取れたので、続きの記事を書いてみようと思います。

上下が作ったもの(部品半田付け前、後)で、真ん中は元からのもので取り換えて使います。

HUB_FPC_assembled_0.jpg

こうやって装着します。

HUB_FPC_assembled_1.jpg

GPD Pocketには何か内蔵できそうなスペース(上の写真だと右下の部分)があり、お手軽に拡張できそうなものというとUSB機器となるのですが、残念ながら標準で余っているUSBポートがありません。一方、これまでの先駆者(Redditの記事や、雑技公房さん)により、メイン基板とサブ基板をつなぐフレキシブル基板からUSBの配線を取り出せることがわかっています。

そこで比較的綺麗に改造できるようにUSB High-speed対応ハブIC(Cypress CY7C65632)が載ったフレキシブル基板を作ってみました。4ポート分岐できるのですが、1ポートは元のサブ基板へ、残りの3ポートは奥まで引きずり出してあり、ここに(分解や半田付けは必要ですが)好きなUSB機器を接続できるようにしてあります。

改造前と改造後のデバイスマネージャの表示は以下の通りです。

HUB_FPC_before.png
前。

HUB_FPC_after.png
後。ハブが増えた!

もう少し工夫の余地がありそうな気がするのですが、そのうち回路図やアートワークを公開しようと思います。

※その後基板の情報を公開しました。