カテゴリー別アーカイブ: 日記

舞台探訪に行ってきたよぉ 〜井波編〜

最近「ゆるゆり」にハマっているので、帰省のついでに舞台探訪(聖地巡礼)的なやつに行ってきた。

まずは「ゆるゆり なちゅやちゅみ!」(OVA)に登場する、井波(現・南砺市)の閑乗寺公園から。(実家から近い&小さい頃から何回か行っていて思い出深いので) 続きを読む

MSYS2 から Visual C++ (の環境変数を設定するバッチファイル)を叩く

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++用に環境変数を設定するバッチファイル)を実行すること自体はできるが、そこで設定された環境変数は呼び出し元のシェルに反映されない。 続きを読む

Raspberry Pi と gPhoto2 で一眼レフを叩く

Raspberry Pi (Arch Linux インストール済み)に一眼レフをUSBで繋いで制御してみよう。

gPhoto2のインストール

# 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 を参照。)

設定を変えた後は再起動が必要かもしれない。

簡単な使い方その2

gPhoto2 で写真を撮ってみる:

$ gphoto2 --capture-image

写真を撮影&ダウンロード:

$ gphoto2 --capture-image-and-download

頑張れば露出とかシャッター速度とかいろいろ設定できそうだが、そういうのはまた今度。

Raspberry Pi じゃなくても

gPhoto2は別にRaspberry Piじゃなくても普通のLinuxとかあるいはOS Xでも動くのだが、お節介なリッチなデスクトップ環境とかが入っていると、そっちの方にカメラの制御権(?)を奪われてしまう場合があるので注意しよう。

~/.ssh/config

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 を参照。あるいはググればいろいろ用例が出てくる。

実は常識だったりするのかもしれないが、知らなかったのでメモしておく。

家のネットワーク環境を整えた話

最近、NASを買ったり無線LANルーターを新しくした。そこで、新しい機器の導入によって良くなったこととかを日記として書いておく。NASのレビューと無線LANルーターのレビューとVPNについてのあれこれとIPv6についてのあれこれが混ざっているが、日記なのでしょうがない。

この記事はチュートリアルとかではないので、「こういう環境でコレを導入して適切に設定したらうまくいった」とは書いても「適切な設定」の手順は書かない。

続きを読む

UT-mateの使い勝手を上げるChrome拡張を作った

以前、UT-mateの使い勝手を上げるGreasemonkeyスクリプトを書いたが、それをChrome拡張化してみた。

Greasemonkeyのuserscriptも chrome://extensions/ にドロップすればなんか勝手に拡張として扱ってくれるようなのだが、一般人にuserscriptをダウンロードさせて chrome://extensions/ を開かせてうんぬんさせるよりはChrome Web Storeで入手出来るChrome拡張の方が導入しやすいだろうということで、Chrome拡張化してみることにした。

このuserscriptではGreasemonkey特有の関数( GM_* )は使っていないので、拡張機能の作り方のContent Scriptsのページを読んで manifest.json を適当に書いてやってパッケージしてやればChrome拡張になる。

Chromeの機能でChrome拡張のパッケージ(.crx)を作れるようだが、Chrome Web Storeで配布する際はzipアーカイブをアップロードすれば向こうで適当に .crx を作ってくれるっぽい。

作ったChrome拡張(とかWebアプリ)をChrome Web Storeで初めて公開するには、Googleに5ドルのみかz…登録手数料を払う必要がある。まあ一回払えばいくらでも拡張機能やWebアプリを公開できるからそんなに高くない…と思ったけど20個の上限があった気がするぞ…。

そんなわけで作ったChrome拡張がこちら。

Chrome Web Storeではなんかすれば課金もできるみたいだけど、この程度のアレで課金して誰もダウンロードしてくれないよりは、無料でダウンロードしてもらって自分の承認欲求を満たした方が良いなあと思った。

ちなみに、Chrome拡張化の際にuserscript本体はいじる必要はなかったが、UT-mateのページが仕様変更していたみたいで、そのための修正は必要だった。

Firefoxの人は従来通りGreasemonkeyを使って Better_UT-mate.user.js をインストールすれば良い。

Safariの人はTampermonkeyとかいうのを使えば良さそう。Safariの拡張機能でもChrome拡張と同じようなことができる感じがするが、Appleに登録か何かしないといけないようなので面倒くさい。

TeXでファイルの更新日時を取得する

TeXでは \today で現在の日付を取得できる。\maketitle\date を省略すると現在の日付になる。

しかし、TeX文書の「内容」に関わる日付と言ったら、ファイルの更新日時ではないだろうか。タイトルのところにファイルの更新日時を(自動で)出す方法はあるか。

ググってみたら割と簡単に答えが出てきた。

pdfTeXだと \pdffilemoddate というプリミティブがあるらしい。例えば \pdffilemoddate{\jobname} と書くとコンパイル中のファイルの更新日時が D:20150829212230+09'00' というようなフォーマットで取得できるようだ。

LuaTeXだと \pdffilemoddate はないが、Luaを使えば同じようなことはできるだろう。まあ自分でLuaコードを書いて実装するのは面倒なので、既製品を使おう。

filemodというパッケージはpdfTeXとLuaTeXで使えて、ファイルの更新日時を取得するだけじゃなくて、\today と同じような読みやすいフォーマットにしてくれるようだ。例えば、ファイルのプリアンブルに

\usepackage{filemod}
\date{\Filemodtoday{\jobname}}

と書けばタイトルの日付がファイルの更新日時になる。

複数のファイルの中で最も新しい更新日時を使いたいときは、試してないけど \filemodNewest を使えば良さそう。

既に書いたように、filemodパッケージはpdfTeXかLuaTeXが必要で、pTeXXeTeXでは動かない。

【2016年12月12日 追記】ε-pTeX では \pdffilemoddate を含むいくつかの pdfTeX primitive が実装されているため、 filemod パッケージを使うことができる。参考:ε-pTeX について