Arduinoでコンテナクラス

Arduino IDEを利用してESP8266用の開発をしていて、STLのstd::string、std::vector、std::listを使いたくなったのですが、コンパイルしてみると、大量のリンクエラーが出てしまいました。原因を追及するのが面倒になったので、代替ライブラリを作ってみました。はい、車輪の再発明です。

https://github.com/soramimi/TinyContainer

TinyContainerというフォルダの中に、TinyContainer.hというファイルが入っています。このフォルダを圧縮して、TinyContainer.zipを作ります。これを[スケッチ][Include Library][Add .ZIP Library...]を選択して、登録します。

addlib

一旦Arduino IDEを終了して、再起動します。

newlib

[Include Library]の下の方に[TinyContainer]が登録されます。これを選択すると、スケッチに #include <TinyContainer.h> が追加されます。

使い方は、STLのstring、vector、listとだいたい同じです。名前空間はtinyです。tiny::string、tiny::vector、tiny::listとして使用できます。

間に合わせで作ったため、完全に規格に準拠した設計にはなっておらず、多少異なる点があるかと思います。基本的な、文字列、動的配列、双方向リンクリストとして使用することはできます。辞書(map)は複雑なので作っていません。

登録したライブラリをアンインストールする場合は、以下のフォルダを削除します。

C:\Users\<username>\Documents\Arduino\libraries\TinyContainer

カテゴリー: 未分類 | コメントをどうぞ

SONYのWi-Fi対応デジカメで写真の転送ができない件

Wi-Fiに対応したSONYのデジタルカメラで、PCに写真を転送するには、PlayMemories Home というアプリをインストールするのですが、そのPCをファイルサーバにしているなどで、別のPCからリモートデスクトップ接続でログオンし、そのセッションで PlayMemories Home が動作している場合、または、その状態で、カメラを接続して、Wi-Fi転送の設定を行った場合に、デジカメ側からの写真転送ができないようです。カメラの画面には、「検索中」「接続中」まで出ますが、「転送中」にならずに、永遠に待ち続けるという症状になります。

この件について、SONYに問い合わせ中です。

デジカメの機種に依存しているかどうかは不明です。(筆者のはDSC-HX30Vというものです)

【追記】 SONYでは、リモートデスクトップ接続の環境で、PlayMemories Homeの動作確認は行っていないとの回答。急がないので、できたら対応してください、と、要望を出しておきました。

カテゴリー: 未分類 | コメントをどうぞ

Pi-DAC+

秋月電子通商で購入できる Raspberry Pi 用オーディオモジュールPi-DAC+を使用するためのメモ。OSは標準のRaspbianを想定。

詳細は http://www.iqaudio.com/downloads/IQaudIO.pdf

抜粋すると、

  1. rpi-update を実行する。
  2. /boot/config.txt に dtoverlay=iqaudio-dacplus という定義を追加する。
  3. 再起動する。
  4. aplay -l を実行して、認識されたか確認する。

これだけで、使用できるようになるはずだが、ついでに、標準のオーディオ出力を無効にしたかったら、 /etc/modules の snd-bcm2835 をコメントする。

カテゴリー: 未分類 | コメントをどうぞ

Qtでウィンドウを作成してから描画されるまで

個人的なメモです。

Qtで、MainWindowが作成されてから、paintEventが呼ばれるまでの間の、イベント履歴を取得してみました。

Value Event
----- ----------------------------
68    QEvent::ChildAdded
68    QEvent::ChildAdded
68    QEvent::ChildAdded
68    QEvent::ChildAdded
33    QEvent::WindowTitleChange
217   QEvent::PlatformSurface
203   QEvent::WinIdChange
34    QEvent::WindowIconChange
75    QEvent::Polish
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
13    QEvent::Move
14    QEvent::Resize
17    QEvent::Show
183   QEvent::CursorChange
26    QEvent::ShowToParent
74    QEvent::PolishRequest
76    QEvent::LayoutRequest
78    QEvent::UpdateLater
77    QEvent::UpdateRequest
24    QEvent::WindowActivate
99    QEvent::ActivationChange
7     QEvent::KeyRelease
12    QEvent::Paint

正確なところは知りませんが、QEvent::Showが処理された後で、子ウィジェットのサイズが確定している模様です。QEvent::LayoutRequestまで通過すれば、ウィンドウの中身が完成していると思われます。

ウィンドウが表示される前に、子ウィジェットのサイズを取得したい様な場合、下記のようにするといいかと思います。

bool MainWindow::event(QEvent *e)
{
    bool f = QMainWindow::event(e);

    {
        QEvent::Type type = e->type();
        if (type == QEvent::LayoutRequest) {
            // あんなことやこんなことをする
        }
    }

    return f;
}
カテゴリー: 備忘録 | コメントをどうぞ

DN2820FYKH に Windows 7 をインストールしようとするとBSODになる件

Intel NUC DN2820FYKH に Windows 7 をインストールしようとしたところ、以下のようなメッセージと共に、ブルースクリーンで固まってしまいました。

The BIOS in this system is not fully ACPI compliant, Please contact your system vendor for an updated BIOS.

これは既知の問題です。ですが、不具合というより、設定の問題です。リンク先にもあるように、解決方法の詳細はこちらです。

DN2820FYKHは出荷時の設定では、Windows 8向けの設定がなされています。

起動時にF2を押してBIOSの設定画面に入り、まず、Legacy Boot Priorityの設定で、Legacy Bootが有効(enabled)になっていることを確認します。次に、UEFI Bootの設定で、OS SelectionでWindows 7を選択します。

Windows 7は、UEFIではなく、Legacy Bootで起動しますが、そうあっても、UEFI Bootの設定を変更しておく必要があるようです。

カテゴリー: 備忘録 | コメントをどうぞ

OpenSSLでSSL_get_verify_resultがX509_V_ERR_CERT_SIGNATURE_FAILUREを返す

備忘録です。

SSL_CTX_newを実行した後、SSL_CTX_load_verify_locations に喰わせる ca-bundle.crt は、このへんから拾ってくる。SSL_connectしたら、証明書を検証するんだけど、SSL_get_verify_resultがエラーコード7を返すので、しばらく悩んだ。

プログラムの最初で、OpenSSL_add_all_algorithms();を実行したら解決した。

カテゴリー: 備忘録 | コメントをどうぞ

ASUS Cover

タブレット端末ME572CLを購入して、無駄な機能を片っ端からオフにしていったら、カバーを閉じたときのマグネットスリープが効かなくなってしまいました。やり過ぎてしまったようです。

マグネットスリープを元に戻すにはどうすればいいのか、ひとしきり悩んだあげく、ASUSカスタマイズ設定のAccessoriesにあるASUS Coverを有効にするという設定が、マグネットスリープの設定であることがわかりました。

me572cl

磁気センサーは、上記赤丸で示したあたりにあります。ここに磁石を近づけると、スリープに移行します。

カテゴリー: 未分類 | コメントをどうぞ

USBハブ

ELECOM U2H-J4SIBK というものを入手したので備忘録。

シンプルな薄型4ポートハブ。この手のものでよくあるのは、側面に3ポート付いていて、別の面(たいてい直角の位置)にあと1ポートが付いているタイプ。この製品は、4ポートが同一面に1列に並んでいる。

hub1

電源は5V2.6A 3.5mm/1.3mmセンタープラス。コントローラはμPD720112GK。

hub2 hub3 hub4

 

カテゴリー: 備忘録 | コメントをどうぞ

OS X Mavericks でLIPS4プリンタに印刷する

Canon LPB-1310というプリンタを愛用しています。これは13年前の製品です。本体は意外と高く、人気機種なのかわかりませんが、中古でも3万円もしますが、リサイクルトナーカートリッジはとても安く手に入ります。スタンバイ状態から印刷開始までがわりと速く、ちょっとした印刷に便利です。両面印刷にも対応しているのも良いです。インクジェットプリンタはノズル詰まりが厄介ですが、その点、レーザープリンタの方が安心して使えます。

さて、残念なことに、このプリンタ、OS X 10.9 (Mavericks)では使えなくなりました。LIPS4ドライバの提供が終了してしまったようです。「対応予定なし」と書いてあります。

MavericksからLBP-1310へ、直接印刷することはできませんが、プリントサーバを構築して、それを経由して印刷することはできます。ただし、LBP-1310にネットワークアダプタが装備されていることが必要です。

筆者の環境では、Debian GNU/Linuxを使用しているので、これでプリントサーバを構築することにします。

cupsをインストールします。

# apt-get install cups

ウェブブラウザを開いて、http://localhost:631/に接続します。管理タブの[プリンタを追加]を選び、「その他のネットワークプリンター: LPD/LPR ホストまたはプリンター 」を選択します。[続ける]ボタンを押し、接続の欄に「lpd://192.168.0.250/lp」の様に登録して、[続ける]ボタンを押します。名前欄などは「LBP1310」の様に適当な名前を設定します。プリンタドライバは、「Canon LIPS-IV Foomatic/lips4」を選択します。

管理タブのサーバの設定で、「このシステムに接続されているプリンターを共有」という項目があるので、これにチェックを入れます。

設定が完了すると、Mavericksの環境設定で、プリンタの追加を行えば、プリントサーバに登録したプリンタが表示されるはずです。CUPSを利用して共有したプリンタは、同じネットワーク内の他のPCから自動認識されます。プリンタドライバは、「一般的なPostScript プリンタ」を選択します。

Linuxのプリントサーバで共有したプリンタをWindowsから利用するには、まず、IPアドレスを指定して接続します。たとえば、[ファイル名を指定して実行]で、「\\192.168.0.10」の様にして開きます。その中に登録したプリンタ名が表示されているはずですので、右クリックして[接続]を選択します。プリンタドライバは、Generic/MS Publisher Color Printerを使用します。

 

カテゴリー: 未分類 | コメントをどうぞ

自作ネームサーバ

DNS/WINS両対応の簡易ネームサーバを自作しました。

http://www.soramimi.jp/bogons/index.html

そもそもやりたかったのは、Raspberry Piのように小さなマシンに名前を付けて管理することです。BINDの様な本格ネームサーバに登録しなくても、つないだだけで名前からIPアドレスを取得できるようにしたかったので、WINSサーバ機能も搭載しました。

ワンチップマイコン用のDNSクライアントは数年前に作ったことがあったので、単純なDNSサーバならそれほど難しくないことはわかっていました。もちろん、セキュリティを強固にするなど、安全策を講じればきりがありません。ネームサーバはインターネットの根幹にも関わる重要なサービスですから、不用意な実装はできません。今回はインターネットでの使用に耐えるようなものではなく、家庭内など狭いネットワークセグメントで使用することを想定したネームサーバとしました。

自己申告型(ブロードキャスト応答方式)のネームサーバを実現するのは、ちょっと前までは困難なことかと思っていましたが、Windowsがやっているんだからできるだろう、名前解決ごときに複雑なプロトコルを使うはずがないと思って、Wiresharkで観察してみたところ、普通のDNSとほとんど同じであることがわかりました。ポート番号の他、名前のエンコード方法に若干の違いがありますが、パケットのフォーマットの大枠は全く同じで、実装のほとんどをDNS機能と共通にすることができました。

カテゴリー: 未分類 | コメントをどうぞ