2016年3月28日月曜日

Debian Sid + Linux 4.6-rc1でPlanex GW-450D KATANAを使う

Google等で検索すると既に様々な方が実施されているのだが、GCC 6だからなのか、それともLinux kernelが4.6rc1だからなのか、そのままではdriverがbuildできなかったのでメモしておく。

全体の流れ

  • x86_64対応のdriverをdownloadし展開して修正する
    • tarballを展開するかgit clone
    • Makefileに変更: CHIPSETへ追加、LINUX_SRCの変更
    • common/utusb_dev_id.cへUSB_DEVICE_ID追加
    • conf/RT2870STA.datを修正
    • os/linux/config.mkを修正 (-Wno-error=incompatible-pointer-types)
    • os/linux/rt_linux.cを修正 (__vfs_read, __vfs_writeへ変更)
  • Kernelの修正とrebuild (CONFIG_WIRELESS_EXT=y, CONFIG_WEXT_PRIV=y)
  • buildしてinstall
    • make
    • make install (もしくは手動でcopy)
    • depmod -a
  • Debian specificなnetworkの設定 (or NetworkManagerやwicdで設定する)
    • /etc/Wireless/RT2870STA/RT2870STA.datの調整
    • /etc/networking/interfacesの変更
    • modprobe mt7650u_sta
    • service networking restart

今回遭遇した問題

主にdriverのbuildに際して問題があった。

  • incompatible-pointer-typesのwarningがerror扱いされてbuildが止まる
  • net_device、iw_handler_defなどstructの初期化を行う部分でerrorが出る

incompatible-pointer-types対策

1つ目のincompatible-pointer-typesに関しては、gccに-Wno-error=incompatible-pointer-typesを渡して見逃してもらった。os/linux/rt_linux.cのWFLAGSに直接書き込むという力技を使ったが、たぶんもっと適切な場所 (もしくは方法)があると思う。

unknown field対策

2つ目のstructの初期化 (designated initializer)に関しては、kernel moduleとしてbuildする際に見ているLinux kernelの設定に問題があった。

具体的には"error: unknown field 'private' specified in initializer"といったerrorが出るのだが、kernel sourceの側で必要なsymbolを有効にしていないのが原因だった。必要なのはCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIV。

これらはmake menuconfigで'/'を使って調べると出て来るが、依存関係の問題なのか有効にできなかったのでnet/wireless/Kconfigを直接編集して対応。make oldconfigを実行して.configに2つが=yで出力されているのを確認して、kernelをrebuild & install。

以上でdriver (mt7650u_sta.ko)をbuildできる。

Pitfalls


  • 普段楽をしてmake-kpkgでkernel packageをbuildしているので、driverをinstallした後にdepmod -aを忘れていた
  • SSIDがstealthなので/etc/networking/interfacesあたりにap_scan=1とかssid_scan=1を設定する必要があった

追記

Rebootが必要とあるが、本当に必要なのはkernelでCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIVが有効になっていない場合に新しくbuildしたkernelに切り替える時だけで、後はservice networking restartとかmodprobe (-r) mt7650u_staでどうにかなる。


参考リンク

Driverのsource code


GW-460DをLinuxで使う方法について



Buildに必要なLinux kernelの設定について


/etc/Wireless/RT2870STA/RT2870STA.datの読み込みに失敗する問題への対策


Cのdesignated initializerについて




2016年3月27日日曜日

Linux kernel 4.6-rc1をdebianでbuildする

Linux kernel 4.6-rc1がreleaseされたので、早速make-kpkgでbuildしようとしたら……

> In file included from arch/x86/decode.c:26:0:
> arch/x86/../../elf.h:22:18: fatal error: gelf.h: No such file or directory
>  #include <gelf.h>
>                   ^
> compilation terminated.

gelf.h……?

今までこんなerrorは出ていなかったので検索してみた所:

> I guess your system didn't install libelf library.

cf. [compiling error gelf.h · Issue #34 · ktap/ktap · GitHub](https://github.com/ktap/ktap/issues/34)

なる記述を発見。取り敢えずaptitudeでlibelf-devというpackageをinstallしたら解決した。

なお、Debian experimentalに入っているgcc-6 seriesで無事buildできたことを申し添えたい。

2016年3月10日木曜日

Debian GNU/LinuxでUSB3.0なGigabit Ethernet

LogitechのLAN-GTJU3というUSB3.0のnetwork adapterを使ってみた。

何故か100Mbpsまでしか有効にならず色々と試してみたのだが、switching hubのportを別の場所に変更したら1000Mbpsが有効になった。

理由はよく分からないが、想像するに、元々100Mbpsのadapterが接続されていたportだったので、switching hub側が「100Mbpsまで」と記憶していたのが問題なんじゃないかと。

2016年2月11日木曜日

再・emacs-gitのisearchでmigemoを利用可能にする

最近の更新でisearchからmigemoれないことに気付いた。

git logでlogを漁ってみたら、b3fc7a3e763fb260cd932dc6aedbe7b4c810a73cでsearch-default-regexp-mode (cf. http://typeinf-memo.blogspot.com/2015/11/emacs-gitisearchmigemo.html)がsearch-default-modeにrenameされたとある。これにnilをbindするとmigemoが使えるようになる。

(setq search-default-mode nil)

2016年1月31日日曜日

Linux boxでラジオ番組を自動録音する

*** 注意 (2018-12-09追記) ***

この記事は古いため以下の記事を参照されたい:

cf. [Linux boxでラジオ番組を自動録音する]

*** 注意ここまで ***

概要


やりたいこと


Linux boxのline-inに接続されているtunerから流れてくるラジオ番組を自動で録音したい

Solution


  • line-inから録音してOgg Vorbisにencodingするscriptを書く
  • cronに登録して定期的に走らせる

これだけのいたって簡単なお仕事……のはずがどうしてこうなった。

落とし穴と対策


  1. pipeしたprocessの殺し方にハマる
  2. cronのdefaultのshellは/bin/sh
  3. PulseAudio関連のprogramをcronから呼んだ時の挙動にハマる

対策としては:
  1. parec ... | oggenc ... の組み合わせではなくffmpegで録音する → 1、2
  2. 環境変数XDG_RUNTIME_DIRを渡す → 3

わかったこと


  • pipeでつないだprocessesの殺し方
  • parecの他にもffmpegで録音できる
  • PulseAudioを使う時は環境変数に注意

結論


こんな感じのscriptをcronで回している:

# 録音
XDG_RUNTIME_DIR=/run/user/1000 /usr/local/bin/ffmpeg -f pulse -ac 2 -ar 44100 -i
alsa_input.pci-0000_00_1b.0.analog-stereo -acodec libvorbis -q 3 "${FILEPATH}" &
RECPID=$!

# 録音停止
sleep ${DURATION}
kill -TERM ${RECPID}

補足


なお、ffmpegではdurationを指定できるので:

... /usr/local/bin/ffmpeg -f pulse -ac 2 -ar 44100 -i alsa_input.pci-0000_00_1b.0.analog-stereo -acodec libvorbis -q 3 -t ${DURATION} ${FILEPATH} &

とかでも良さそう。また、ffmpegのかわりにparecとoggencを組み合わせても良い:

parec --fix-format --fix-rate --file-format=raw --format=s16ne > >(oggenc -B 16
 -C 2 -q 3 -o "${FILEPATH}" - >/dev/null 2>&1) &

ただし、この方法 (process substitution)はbashやzshでないと使えないので注意が必要。因みに:

parec ... | oggenc ...

とpipeでつないでも良いが、この場合job単位でprocessesを殺す必要がある (kill %%とかで殺せる)ので少々面倒。

補足2


暫くの間:

XDG_RUNTIME_DIR=/run/user/1000 /usr/local/bin/ffmpeg -f alsa -ac 2 -ar 44100 -i
 pulse -acodec libvorbis -q 3 "${FILEPATH}" &

で運用していたが、これだとdeviceの認識順と共にdefaultのsourceが変わって、無音の状態になることがあった。そこでdeviceを限定するため以下のように変更:

XDG_RUNTIME_DIR=/run/user/1000 /usr/local/bin/ffmpeg -f pulse -ac 2 -ar 44100 -i
alsa_input.pci-0000_00_1b.0.analog-stereo -acodec libvorbis -q 3 "${FILEPATH}" &

おまけ


cronで実行したscriptの出力を見ようと思ったら/usr/bin/mailがsymbol lookup errorを吐いた。原因を追求していると本来の目的を忘れそうだったので、とりあえず/var/mail/以下のfileを直接読んで凌いだ。

また、Debian sidだと/usr/bin/mailは/etc/alternatives/mailへのsymlinkであり、これは更に/usr/bin/mail.mailutilsへのsymlinkで、如何なるpackageにも属していない。

参考URL



補足2関連



2015年11月15日日曜日

helm-swoopでmigemoを有効にする

isearch中にC-;でhelm-swoopを起動する設定にしているが、こちらもいつの間にかmigemoで検索できなくなっていたので修正。

    (setq helm-migemo-mode 1)
を設定ファイル (~/.emacsとか~/.emacs.d/init.elあたり)に追記しておく。

続・emacs-gitのisearchでmigemoを利用可能にする

今日になって再びisearchでmigemoが使えなくなっていることに気付いた。

以下のcommitが怪しいと踏んだ:


commit 4d82aa3abdad1871b99f0a9e56fe54ec497bd290
Author: Artur Malabarba <bruce.connor.am@gmail.com>
Date:   Tue Nov 10 13:04:02 2015 +0000

    * lisp/isearch.el (search-default-regexp-mode): change default value
*scratch* bufferで:
(setq search-default-regexp-mode nil)
をevaluateしてからC-sでisearchしてみるとmigemoが使える状態に戻った。