XPathをクエリするだけのコンソールアプリ

組み込み環境上でXMLをクエリしたいんだけど、そのためだけにrubyとかいれてもでかい。
小さいXML処理系としてはTinyXML+TinyXPathがよさげだったんだけど、フロントエンドがないので、簡単なフロントエンドを作った。

TinyXPath: http://tinyxpath.sourceforge.net/

tinyxpath_1_3_1.zipを解凍して、main.cppをこれといれかえ。

tinyxpath付属test.xmlに対して:

./tinyxpath "//x/text()" test.xml # => sub text
cat test.xml | ./tinyxpath "//x/text()"

wget -O -に対してそのままパイプで処理できるので便利。

uclibcとuclibcxx環境下でもうごいた。

FON2100E openwrt backfire 10.03.1用クロスコンパイル環境の構築

昨日やったのでかなりうろ覚え。ホストはarch linux x86_64

参考:http://wiki.openwrt.org/doc/howto/buildroot.exigence

svn co --revision=29596 svn://svn.openwrt.org/openwrt/branches/backfire
cd backfire
./scripts/feeds update -a
make menuconfig # targetとか設定
m -j 8
export PATH=$PATH:`pwd`/staging_dir/toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin
export CC=mips-openwrt-linux-uclibc-gcc
export LD=mips-openwrt-linux-uclibc-ld

あとは適当にクロスコンパイル。configure引数:

CFLAGS=-Os ./configure --build=x86_64-pc-linux-gnu --host=mips-openwrt-linux-uclibc --target=mips-openwrt-linux-uclibc

C++プログラムはこのままだとstdc++にリンクする(でかい!)ので、uclibcxxを使いたい。

uclibcxxのビルド:

./scripts/feed install -p uclibcxx
make menuconfig # libs/uclibcxxをYに指定
m package/uclibc++/compile V=99
m package/uclibc++/install V=99

configure指定してクロスコンパイル対象のビルド。適宜変更すること:

CFLAGS=-Os CXXFLAGS="-fno-builtin -nostdinc++" LDFLAGS="-L/home/kouhei/openwrt/backfire/staging_dir/target-mips_uClibc-0.9.30.1/usr/lib" CPPFLAGS="-I/home/kouhei/openwrt/backfire/staging_dir/target-mips_uClibc-0.9.30.1/usr/include/uClibc++" LIBS="-nodefaultlibs -luClibc++ -lm -lgcc" ./configure --build=x86_64-pc-linux-gnu --host=mips-openwrt-linux-uclibc --target=mips-openwrt-linux-uclibc

stripしとくといいかも:

mips-openwrt-linux-uclibc-strip hogehoge

openwrt上で:

opkg update
opkg install uclibcxx

これで動くバイナリができるはず。

Userspace RCU

http://lttng.org/urcu

UserspaceのRCUアルゴリズム実装。
半日ぐらいコード眺めてたけど、synchronize_rcu()でparityをなぜ2回パリティフリップ/同期してるのかわからん。

Preemptive2-staged RCUの実装ぽいのでLWNの記事をもっとよみこむ。
http://lwn.net/Articles/253651/

現在の理解だと、rcu_read_lock()はメモリバリアを含まないので、同期->MB強制->同期するので2回必要という理由。しかしあってるのか自信ない。

OSX上で「インターネット共有」を使わずにNAT環境を構築する

OSXの「インターネット共有」機能はDHCPサーバを含むので、DHCPが別サーバにより提供されてる環境上では使うのが面倒。

単純にIP forwarding + NATをOSXさんに提供させる。

IP forwarding有効に:

# sysctl -w net.inet.ip.forwarding = 1

natd設定(en3にWAN回線):

# natd -p 8668 -n en3 -s yes -m yes
# ipfw add 1000 divert 8668 ip from any to any via en3

ArchLinux感想

debian testingの不満点だった:

  • stable release直後にsidが降りてきて不安定になる
  • デスクトップ環境(gnome/xfce/kde他)を部分的にインストールすることができない
  • 設定ファイルまわりの謎カスタマイズ。ファイル細分化とか
  • distribution独自のpatchがはいる (いやstableでは必要なのわかるけど...)

は解決してる。

その他の利点として:

  • debian base systemよりさらにminimal
  • /etc/rc.confによる起動デーモン設定 (sysvめんどい)
  • PKGBUILDのシンプルさ(独自パッケージをつくりやすい)

ただ、不満点としては:

  • hoge-devがない。ヘッダが確実に入るのは利点ではあるけど、qtをインストールするといらないqt-designerついてくる。うええ
  • testingじゃない方も十分不安定...
  • testingではfixされてるよ!っていわれてもapt-pinning相当がないのでシステム全体をtestingにするか、downgradeするかの2択。
  • AURにあるパッケージだとコンパイル必要で、いれるまでに時間がかかる。どうせ毎回コンパイルするぐらいならいっそのことgentooでもいいよな…

cf. http://unix.stackexchange.com/questions/10103/differences-in-package-management-between-debian-and-arch

長期的に使うかは不明だけど、デスクトップ環境としてしばらく使ってみる予定。サーバは当分debianかなぁ…

Arch Linuxを入れてみる

DebianをX環境でつかうのがいやになってきたので、Arch Linuxを試してみる。
debianなれててとても使いやすいんだけど、gnomeなりなんなりを入れたとたん使わないろくに使わないパッケージが大量にはいってげんなり。

Arch Linuxだと最小限パッケージセットで使うのがdebianより徹底できそう。x86/x86_64以外の環境がサポートされてないのがちょっと気にかかるけど...

とりあえずbootableに

https://wiki.archlinux.org/index.php/Beginners%27_Guide#Select_an_installation_source

isoをusbメモリにddするだけなので楽。pppとかwpa_supplicantとかいらなさげなので勝手に選択をはずす。ファイルシステムはxfsにしてみる。

設定

再起動するとすんなり起動する、がroot以外ユーザがないことに気づく。

adduser/passwd

pacman遊び

pacman -Syu # repos sync+dist-upg相当らしい
pacman -Qdt # query deps unneeded (apt-get autoremoveリスト相当)

pacman -S sudo # とりあえずsudoいれてみる

https://wiki.archlinux.org/index.php/Pacman_Rosetta

apt-file相当

pacman -S pkgfile
pkgfile --update

pkgfile lsmod # -> module-init-tools

xorg xfceをいれてみる

pacman -S xorg-server xorg-xinit xorg-utils xorg-server-utils
pacman -S nvidia nvidia-utils

reboot

pacman -S xfce4 # group全選択
cp /mnt/oldroot/etc/X11/xorg.conf /etc/X11/xorg.conf
startxfce4

pacman -S ttf-dejavu

適当にpanelなど設定。

AUR

mozcとかそういうのはユーザレポジトリにはいってるらしい。

yaourtのインストール。pacman経由でいれる。http://archlinux.fr/yaourt-en#get_it

locale

sudo vim /etc/locale.gen
sudo locale-gen

/etc/rc.conf:

LOCALE="en_US.UTF-8"

日本語Font

mv *.ttf /usr/share/fonts/TTF
sudo -s
cd /usr/share/fonts/TTF
mkfontscale && mkfontdir && fc-cache

mozc

yaourt -S mozc

.xinitrc:

export XIM=ibus
export XIM_PROGRAM=/usr/bin/ibus-daemon
export XIM_ARGS="--xim"
export XMODIFIERS="@im=ibus"
export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
ibus-daemon -x -d

設定後

yaourt -Rdd qt # 依存パッケージを無視してqt削除

mozcはqtを設定アプリに使ってるだけなので、他にqtいれる予定がなければ削除できる。

slim: login manager

yaourt -S slim

/etc/rc.confのDAEMONSにslim追加

cp /etc/skel/.xinitrc .

kupfer

yaourt -S kupfer

chromium

yaourt -S chromium flashplugin

# libvdpauはうまく動かない(ニコニコ動画が再生できない)ので無効化
||<。

**sshd
>||
pacman -S openssh
vi /etc/ssh/sshd_config

vmware

https://wiki.archlinux.org/index.php/VMware
を参照。pacmonにはなく、vmware公式からいれる。

Linux 3.1.9-1-ARCHではばぐってるぽいのでLinux 3.1.8におとしてみる。downgradeというツールがあるらしい。

# Linux 3.1パッチ適用

yaourt -S downgrade
downgrade linux
# Linux 3.1.8(core)選択

reboot

sudo vmware-modconfig --console --install-all

synergyc

yaourt -S synergy

echo "synergyc persian-win" >> .xinitrc #実際にはexec startxfce4の前に

サウンド (ALSAでそのば再生)

yaourt -S alsa-utils
gpasswd -a kouhei audio

#以下デスクトップ環境用?
yaourt -S gstreamer0.10 gstreamer0.10-base gstreamer0.10-base-plugins

# Thinkpadの音量調節キーを有効に
yaourt -S xfce4-volumed xfce4-notifyd

サウンド(paoip)

yaourt -S alsa-utils
sudo modprobe snd_aloop # /etc/rc.confにも追加

DAEMONSにalsa追加 (mixerのsave/restore)

groupにvideo/audio追加

kouhei@bengal:~$ aplay -l
カード 2: Loopback [Loopback], デバイス 0: Loopback PCM [Loopback PCM]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
(...snip...)
カード 2: Loopback [Loopback], デバイス 1: Loopback PCM [Loopback PCM]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
(...snip...)
kouhei@bengal:~$ cat .asoundrc 
pcm.!default {
  type hw
  card 2
}
nohup ./paoip -d XX -t

compiz

yaourt -S compiz-fusion
# ccsm emerald emerald-themes compiz compiz-core compiz-fusion-plugins-main fusion-icon

ccsmでwindow decoration, move window他を有効に。

emerald-themes-managerで適当にテーマ設定

自動起動にfusion-iconを追加

ccsmで設定。なんかを含むキー設定はうまく行かないので、~/.config/compiz/compizconfig/Default.iniを適宜編集。

cpufreq (IntelのDVFSというかspeedstep)

yaourt cpufrequtils
sudo modprobe acpi-cpufreq cpufreq_ondemand
echo 'governor="ondemand"' >> /etc/conf.d/cpufreq
vim /etc/rc.conf # MODULES に acpi-cpufreq cpufreq_ondemand追加 DAEMONSにcpufreq追加

余計なパッケージ削除

pacman -Qdt # apt-get autoremove 相当
pacman -D --asexplicit gtest ruby # explicitly installed扱いにする

wicd

ノート用

yaourt -S wicd-gtk
gpasswd -a kouhei network
vim /etc/rc.conf # DAEMONSにdbus !network !dhcpcd wicd

wheezy以降でのUSB install

以前はboot.img.gzを用意したり大変だったけど*1、現在はisoイメージをそのままUSBメモリに対応する/dev/sd*にddすればいいみたい。

例:

sudo dd if=./debian-testing-amd64-businesscard.iso of=/dev/sdb