wxWidgets とは、C++で作られたクロスプラットフォームGUIツールキットである。Windows, OS X, GTK+ などに対応している。商用版のある Q なんとかと比べて見劣りするとか言うんじゃないぞ
入手
開発中の最新版を入手しよう。wxWidgets のリポジトリは、現在 GitHub でホストされている。(ただし、Issue の管理は GitHub ではなく wxWidgets Trac を使っている。GitHub でのプルリクはできる)
wxWidgets とは、C++で作られたクロスプラットフォームGUIツールキットである。Windows, OS X, GTK+ などに対応している。商用版のある Q なんとかと比べて見劣りするとか言うんじゃないぞ
開発中の最新版を入手しよう。wxWidgets のリポジトリは、現在 GitHub でホストされている。(ただし、Issue の管理は GitHub ではなく wxWidgets Trac を使っている。GitHub でのプルリクはできる)
こういうビットマップ(1ピクセルにつき1ビット)を、整数の配列としてC言語のソースコード中に埋め込みたい:
□□□□□ ■■■■■ □■□■□ □■□■□ ■□□■■ □□□□□
2進数リテラルがあればそれを使うという手があるが、残念ながらC言語には2進数リテラルがない(ちなみに、C++にはC++14から2進数リテラルが入った。また、独自拡張で2進数リテラルが使えるコンパイラーもある)。
というわけで、自分で作ることにした。要件としては
がある。 続きを読む
LaTeXをやったことがある人なら \verb
コマンドはきっと知っているだろう。
例: \verb|hoge|
→ hoge
例: \verb+foo bar+
→ foo bar
亜種として、\verb
の直後にスター *
がついた版は、空白を可視化する(空白が ⎵ みたいな記号になる)。
例:\verb*+foo bar+
→ foo⎵bar
この \verb
というコマンドは、「TeXの特殊文字を無力化する」「任意の文字を終端として使える」という点で、非常に風変わりである。\verb
コマンドを知ることは、TeXの字句解析のルール(カテゴリーコードとか)に対する理解を深めることに直結すると言っても過言でないだろう(たぶん)。というわけで、\verb
について重箱の隅をつついた結果をここに書いておく。
なお、TeXにおける「カテゴリーコード」とかそういうアレはここでは解説しない(対象読者が謎)。
2016年4月26日:「シェルでやる方法」を追記。
Windowsの開発環境には、環境変数を設定するバッチファイルが提供されていて、そのバッチファイルを実行すると PATH
とかの環境変数が設定されるというパターンがたまにある。(スタートメニューに「環境変数を設定済みのシェルを起動する」ショートカットを登録するパターンの方がもっと多い気がするが)
MSYS2からこういう開発環境(というか、Visual C++)を叩きたい。もちろん、cmd.exe
を使って
$ cmd //c "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat"
みたいなことをすれば vcvars64.bat
(Visual C++用に環境変数を設定するバッチファイル)を実行すること自体はできるが、そこで設定された環境変数は呼び出し元のシェルに反映されない。 続きを読む
Windows機のMSYS2にOpenSSHを入れていろいろ環境を整えたのでその備忘録。 続きを読む
Raspberry Pi (Arch Linux インストール済み)に一眼レフをUSBで繋いで制御してみよう。
# pacman -S gphoto2
違うディストリ/パッケージマネージャーでも、何かしら gphoto2 みたいなパッケージはあると思う。
接続されたデバイスの一覧を見る:
$ gphoto2 --list-ports Devices found: 3 Path Description -------------------------------------------------------------- ptpip: PTP/IP Connection usb:001,005 Universal Serial Bus usb:001,003 Universal Serial Bus
機種名を表示:
$ gphoto2 --auto-detect Model Port ---------------------------------------------------------- Canon EOS 600D usb:001,005
EOS 600DというのはEOS Kiss X5のことで、同じ製品でも日本と海外で名前が違うとかいうアレだ。
では、 gphoto2 --summary
でもっと詳しい情報を取得してみよう。
$ gphoto2 --summary *** Error *** An error occurred in the io-library ('I/O problem'): No error description available *** Error (-7: 'I/O problem') *** For debugging messages, please use the --debug option. Debugging messages may help finding a solution to your problem. If you intend to send any error or debug messages to the gphoto developer mailing list <gphoto-devel@lists.sourceforge.net>, please run gphoto2 as follows: env LANG=C gphoto2 --debug --debug-logfile=my-logfile.txt --summary Please make sure there is sufficient quoting around the arguments.
なんかエラーが出た。
しかし、このエラーはハードウエアの問題とかgPhoto2の問題ということとも限らない。なぜなら、
$ sudo gphoto2 --summary
としてみたり、
$ lsusb | grep Canon Bus 001 Device 005: ID 04a9:3218 Canon, Inc. EOS 600D / Rebel T3i (ptp) $ ls -l /dev/bus/usb/001/005 crw-rw-r-- 1 root root 189, 4 Feb 14 18:23 /dev/bus/usb/001/005 $ sudo chgrp users /dev/bus/usb/001/005 $ gphoto2 --summary
みたいな感じで /dev/bus/usb/ほにゃらら/ほにゃらら
のグループを変えてやるとうまくいく。つまり、USBデバイスのパーミッション的な問題だということだ。
そこで、 udev の設定をいじる。Arch WikiのDigital Camerasのページを参考にして、
# groupadd camera # /usr/lib/libgphoto2/print-camera-list udev-rules version 175 group camera > /etc/udev/rules.d/40-gphoto.rules # usermod -a -G camera (自分)
みたいなことをやったらうまくいった。(自分の環境だと 40-gphoto.rules
というファイルは /usr/lib/udev/rules.d/40-gphoto.rules
に既に存在したが、/etc/udev/rules.d/
に同名のファイルを置くとそっちの方が優先される。この辺は man udev を参照。)
設定を変えた後は再起動が必要かもしれない。
gPhoto2 で写真を撮ってみる:
$ gphoto2 --capture-image
写真を撮影&ダウンロード:
$ gphoto2 --capture-image-and-download
頑張れば露出とかシャッター速度とかいろいろ設定できそうだが、そういうのはまた今度。
gPhoto2は別にRaspberry Piじゃなくても普通のLinuxとかあるいはOS Xでも動くのだが、お節介なリッチなデスクトップ環境とかが入っていると、そっちの方にカメラの制御権(?)を奪われてしまう場合があるので注意しよう。
SSHでリモートホストにログインする際、ホストごとにユーザー名とかポート番号が違って(覚えるのが)面倒くさい!
$ ssh hoge@example.net
$ ssh -p 10022 user@example.com
$ ssh user2@192.168.11.5
そんなときは、 ~/.ssh/config
を記述すれば、ホストごとにデフォルトのユーザー名とポート番号などを指定できる。
# User を指定
Host example.net
User hoge
# User と Port を指定
Host example.com
User user
Port 10022
# HostName で実際に接続するホスト名/IPアドレスを指定することもできる
Host hoge
HostName 192.168.11.5
User user2
書き方とかは man 5 ssh_config を参照。あるいはググればいろいろ用例が出てくる。
実は常識だったりするのかもしれないが、知らなかったのでメモしておく。
C99で導入されたプリプロセッサマクロの可変長引数を使って、引数の個数によるオーバーロードっぽいことをするメモ。
参考:
可変長引数の部分への実引数が0個というのはC言語の規格的にはナシなので、引数が0個の場合には対応しない。(幾つかのコンパイラでは引数が0個でも通るが…)
GCCの場合に0個の引数を処理したい場合、GCC拡張の , ## __VA_ARGS__
みたいなやつを使うといい感じになる。
VC++で
#define CHOOSE(a0,a1,...)
#define hoge(...) CHOOSE(__VA_ARGS__)
という風に書くと、 __VA_ARGS__
の部分が一つの引数(a0
)として関数型マクロに渡ってしまうので、ここに書いたコードでは CHOOSE
→ CHOOSE2
という風にもう一段階噛ませている。
C11の _Generic
とかを使えば引数の型によるオーバーロードもできそうだ。先例:
前回はFlashAirに直接LEDをつないでLEDを制御したが、今度は秋月のFlashAir DIP IOボードキットを介してLEDを制御してみよう。
用意するもの