2008年10月7日火曜日

FreeBSDでsincos

glibcではsincosを使うことができるが, FreeBSD上ではlibcに入っていないので使うことができない. 以下のようなインクルードファイルを作ってやれば一応使える. 以前どこかのページで見て使っていたのだが, どこのページだったかは失念してしまった.
inline void sincos(double t, double *s, double *c){
asm("fsincos;" : "=t" (*c), "=u" (*s) : "0" (t) : "st(7)");
// *s = sin(t); *c = cos(t)
}

2008年6月8日日曜日

FreeBSD上でのCPUの使用率の計測方法

FreeBSDでCPUの使用率をチェックするために, fluxboxのドック用の自作アプリを使っているのだが, 最近 7-stable のソースの更新をしたところ, そのアプリが動かなくなった. 元々, xosview のソースを流用していて, それでは kvm を使って使用率を取得していたが, どうも仕様が変更になったらしい. 試しに, xosview を入れてみるとやはり動かなかった.

そこで, powerd.c のソースを参考にして, sysctl を使ってCPUの使用率を取るように変更した. 簡単に解説すると, まず, 前処理として, Management Information Base (MIB) を取得しておき, 使用率を取る際はその MIB を使って sysctl(3) を使う. プログラムの一部だけだが, 以下のようになった.

#include <sys/resource.h>
#include <sys/types.h>
#include <sys/sysctl.h>

static int cp_time_mib[2];

/* 前処理. 1回だけ行う. */
void preprocess(void){
int len = 2;
if (sysctlnametomib("kern.cp_time", cp_time_mib, &len))
{
perror("lookup kern.cp_time");
exit(1);
}
}

/* CPUの使用率を百分率で返す */
double cpu_getusage(void)
{
long cpu, nice, system, idle, used, total;
long cpu_time[CPUSTATES];
size_t cpu_time_len;

cpu_time_len = sizeof(cpu_time);
if (sysctl(cp_time_mib, 2, cpu_time, &cpu_time_len, NULL, 0))
{
perror("sysctl error");
exit(1);
}

cpu = cpu_time[CP_USER];
nice = cpu_time[CP_NICE];
system = cpu_time[CP_SYS];
idle = cpu_time[CP_IDLE];

used = cpu + nice + system;
total = used + idle;
return 100.0 * used / (double) total;
}

2008年5月23日金曜日

tabular の列間の調節

今 LaTeX で論文を書いていて, ある表の横幅が長くなりすぎて困っていた. その表は列間の空白が比較的多くて, ここをうまく縮めればいいのになあと思ったので, 対処法を調べてみた.

tabular の代わりに tabular* を使って,
\begin{tabular*}{??pt}{@{\extracolsep{\fill}}c|rr}
...
\end{tabular*}

のようにしてやればよいことが分かった. \fill のところは好きなサイズを入れることも可能. 特に列間を縮めたければ, -5pt とか入れるとかなり縮まる.

参考:
http://www.comb.kokushikan.ac.jp/inlab/LaTeX/node26.html
http://www.tex.ac.uk/cgi-bin/texfaq2html?label=fixwidtab
http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-68.html

2008年5月21日水曜日

xvidcap のコンパイル

ここ最近 FreeBSD 7-stable で sysutils/xvidcap をコンパイルしようとすると, 最後のリンクで失敗する状況が続いていた. 特にすぐ xvidcap を使うことはなかったので, そのうち直るだろうと放っておいたが, portupgrade -a するたびにエラーが報告されるのがだんだん気になってきたので, ちょっと調べてみた.

libtheora と libx264 がリンクするファイルのリストに載っていなかったのが原因だと分かった. ports/sysutils/xvidcap/work/xvidcap-1.1.4p1/src/Makefile の PACKAGE_LIBS の部分を赤字のように変更すると無事コンパイルできるようになった.
PACKAGE_LIBS = -pthread -L/usr/local/lib -lglade-2.0 -lgtk-x11-2.0 -lxml2 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lcairo -lpangoft2-1.0 -lpango-1.0 -lm -lfreetype -lz -lfontconfig -lX11 -lXfixes -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -liconv -ltheora -lx264

2008年5月20日火曜日

マウスの真ん中のボタンとFirefox

Firefox でマウスの真ん中のボタンをリンクの上で押すと, そのリンクを新しいタブにロードしてくれて便利に使っている. しかし, ボタンを押したときにリンクからはずれていると, そのときにコピーしていた文字列を URL にしてアクセスして少し困っていた. ただ, どうしたらその機能を停止できるかは分からなかったので, 今まで我慢して使っていた.

そして, 今日なんとなく about:config を何となく見ていたら, その解消法が分かった.
middlemouse.contentLoadURL
を false にすればいいようだ. これでますます快適になる.

そろそろ Firefox 3 も試したいなあ.

2008年5月19日月曜日

vector にはまる

STL の vector を使っていて, vector の要素へのポインタを使っていた所, そのポインタの指す先が勝手に破壊される自体に遭遇して悩んだ. 結果的には vector に push_back した際に vector が自動的に resize して, ポインタの指す先が解放されていたのが原因だと判明. とりあえずは, vector::reserve で自動的な resize を抑制することで解決した. 根本的な問題の解決のためにデザインを考え直さなければ. vector のもっとも便利な自動 resize でつまづくことになるとは...

2008年5月15日木曜日

zsh と FDclone

zsh を使うようになってから, なぜか FDclone が使えなくなった. "malloc(): Cannot allocate memory" というメッセージが出て FDclone が死んでしまったのだ. その原因を調べてみたところ, zshrc に HISTFILE と HISTSIZE というのを書いていて, ここで zsh の履歴の設定をしているのだが, この環境変数が FDclone も使っていることが原因だったと分かった.

zsh のために "export HISTSIZE = 100000" と設定していたが, これを FDclone も読み込み, しかも, FDclone 内部では HISTSIZE を short型で取っていたため, 100000 があふれて -31072 になってしまっていた. そのせいで, malloc(-31072) というのを実行して死んだのだ.

解決法としては, FD_HISTFILE と FD_HISTSIZE という環境変数を設定してやればOK.

2008年5月12日月曜日

valarrayのconstructorとresize

valarrayの各要素に同じ値を入れる方法として constructor を使う方法と resize を使う方法があるが, そのインターフェースの違いに戸惑ったのでメモ.

  • valarray(const T& v, size_t num)
  • valarray.resize(size_t num, const T v = T())
このように, 引数の順番が逆になっているのに気づいていなかった. T と size_t が異なればコンパイル時にエラーが出るが, そうでない場合はそのままバグになるので気をつけないと.

例:

01: #include<valarray>
02: #include<iostream>
03:
04: using namespace std;
05:
06: int main(void){
07: valarray<char> v('a', 5);
08: for(int i = 0; i < v.size(); ++i) cout << v[i]; cout << endl;
09:
10: v.resize(5,'b');
11: for(int i = 0; i < v.size(); ++i) cout << v[i]; cout << endl;
12:
13: return 0;
14: }

2008年5月11日日曜日

C++のテンプレートに悩む

C++のテンプレートにはまった. 下のようにテンプレートの片方のパラメータの特殊化しようとしたが, コンパイルが通らない... C++難しいなあ.


(a.cpp)
01: #include <iostream>
02:
03: using namespace std;
04:
05: template<typename T, int N>
06: struct A{
07: int val() const;
08: };
09:
10: template<>
11: template<typename T>
12: int A<T,1>::val() const{
13: return 1;
14: }
15:
16: int main(void){
17: A<int,1> a;
18: cout << a.val() << endl;
19: return 0;
20: }

環境: gcc version 4.2.1 20070719 [FreeBSD]

a.cpp:12: error: invalid use of incomplete type 'struct A'
a.cpp:6: error: declaration of 'struct A'
*** Error code 1

2008年5月10日土曜日

Windows XP SP3

Windows XP SP3 を入れようとしたが, インストールの途中でブルースクリーンが出て失敗. うーん, どうしたものか. 情報を集めないと.

追記(5/11):
PCは ThinkPad X40 なのだが, SP3 を入れる前にソフトウェア導入支援を起動してみたら, Windows のパッチが「重要」として挙がっていたので, それをまず入れてみた. すると SP3 が無事にインストールできた. 普通のWindowsのパッチは「KB???」の形式の名前がついているが, 今回のパッチはThinkPad専用とのことで「Q???」の形式の名前だった. これが効いたのだろうか?

2008年4月29日火曜日

Left-Leaning Red-Black Tree part2

前回の Left-Leaning Red-Black (LLRB) Tree の Haskell のコードがきちんと動くことを大体確認した. HaskellのData.Setと比べた特徴は以下の通り.

  • insert と member は LLRB の方が早い.
  • delete は Data.Set の方が早い.
今後の課題としては, Data.Set にある集合演算を LLRB で実装するのも面白いかも.

LLRB の delete を Data.Set よりも早くしようと試行錯誤したがうまくいかなかった. Haskell のチューニングの難しさを実感した. なかなか直感通りにいかなくて大変だ.

2008年4月28日月曜日

Left-Leaning Red-Black Tree

Left-Leaning Red-Black Tree [PDF] というのを見つけて, 実装が簡単だと書いてあったので, 最近練習中のHaskellで書いてみた. PDF に所々ミスがあるし, Haskell に慣れてないのもあって, あんまり簡単ではなかった. まだきちんと検証もしていないがさらしてみる. とりあえず, delete が member でない要素を与えられたときにエラーを返すのは仕様. deleteはPDFに載っているのとは少し変える必要があった上に, 書き直しにかなり悩んだので間違っているかも.

module Main where

data Color = Red | Black deriving (Show, Eq)
data LLRB a = Null | Branch !Color !(LLRB a) a !(LLRB a) deriving (Show)

member :: Ord a => a -> LLRB a -> Bool
member _ Null = False
member x (Branch c l y r) =
case compare x y of
LT -> member x l
GT -> member x r
EQ -> True

null :: LLRB a -> Bool
null Null = True
null _ = False

empty :: LLRB a
empty = Null

singleton :: a -> LLRB a
singleton x = Branch Red Null x Null

insert :: Ord a => a -> LLRB a -> LLRB a
insert x root = make_black $ insert' x root

insert' :: Ord a => a -> LLRB a -> LLRB a
insert' x Null = singleton x
insert' x h@(Branch _ (Branch Red _ _ _) _ (Branch Red _ _ _)) = insert' x $ colorFlip h
insert' x h@(Branch c l y r) =
f2 $ f1 $ case compare x y of
LT -> Branch c (insert' x l) y r
GT -> Branch c l y (insert' x r)
EQ -> h
where
f1 t@(Branch _ _ _ (Branch Red _ _ _)) = rotateL t
f1 t = t
f2 t@(Branch _ (Branch Red (Branch Red _ _ _) _ _) _ _) = rotateR t
f2 t = t

findMin :: LLRB a -> a
findMin (Branch _ Null x r) = x
findMin (Branch _ l x r) = findMin l
findMin Null = error "LLRB.findMin: empty tree has no minimal element"

findMax :: LLRB a -> a
findMax (Branch _ l x Null) = x
findMax (Branch _ l x r) = findMax r
findMax Null = error "LLRB.findMax: empty tree has no minimal element"

deleteMax :: LLRB a -> LLRB a
deleteMax root = make_black $ deleteMax' root where

deleteMax' :: LLRB a -> LLRB a
deleteMax' h = let t' = apply_rotR h in
if isRightNull t' then Null else (fixUp . f . apply_mRR) t' where
f (Branch c l x r) = Branch c l x (deleteMax' r)

deleteMin :: LLRB a -> LLRB a
deleteMin root = make_black $ deleteMin' root where

deleteMin' :: LLRB a -> LLRB a
deleteMin' (Branch _ Null _ _) = Null
deleteMin' h = (fixUp . f . apply_mRL) h
where
f (Branch c l x r) = Branch c (deleteMin' l) x r

delete :: Ord a => a -> LLRB a -> LLRB a
delete x root = make_black $ delete' x root

data NodeCond = NLeft | NRight | NBottom

delete' :: Ord a => a -> LLRB a -> LLRB a
delete' _ Null = error "LLRB.delete: element is not the member"
delete' x h@(Branch c l y r) =
fixUp $ case compare x y of
LT -> (f . apply_mRL) h
where
f (Branch c l y r) = Branch c (delete' x l) y r
GT -> (f . apply_mRR . apply_rotR) h
where
f (Branch c l y r) = Branch c l y (delete' x r)
EQ -> case nodecond h of
NBottom -> Null
NLeft -> let z = apply_mRL h in
if eq x z then delleft z else delete' x z
NRight -> let z = (apply_mRR . apply_rotR) h in
if eq x z then delright z else delete' x z
where
eq a (Branch _ _ b _) = a == b
nodecond (Branch _ Null _ Null) = NBottom
nodecond (Branch _ (Branch _ _ _ _) _ _) = NLeft
nodecond (Branch _ _ _ (Branch _ _ _ _)) = NRight
delleft (Branch c' l' x' r') = Branch c' (deleteMax' l') (findMax l') r'
delright (Branch c' l' x' r') = Branch c' l' (findMin r') (deleteMin' r')

--
-- Helper
--
apply_mRL t@(Branch _ (Branch Red _ _ _) _ _) = t
apply_mRL t@(Branch _ (Branch _ (Branch Red _ _ _) _ _) _ _) = t
apply_mRL t = moveRedLeft t

apply_mRR t@(Branch _ _ _ (Branch Red _ _ _)) = t
apply_mRR t@(Branch _ _ _ (Branch _ (Branch Red _ _ _) _ _)) = t
apply_mRR t = moveRedRight t

apply_rotR t@(Branch _ (Branch Red _ _ _) _ _) = rotateR t
apply_rotR t = t

isRightNull t@(Branch _ _ _ Null) = True
isRightNull t = False

make_black :: LLRB a -> LLRB a
make_black (Branch _ l x r) = Branch Black l x r
make_black Null = Null

fixUp :: LLRB a -> LLRB a
fixUp = f3 . f2 . f1 where
f1 t@(Branch _ _ _ (Branch Red _ _ _)) = rotateL t
f1 t = t
f2 t@(Branch _ (Branch Red (Branch Red _ _ _) _ _) _ _) = rotateR t
f2 t = t
f3 t@(Branch _ (Branch Red _ _ _) _ (Branch Red _ _ _)) = colorFlip t
f3 t = t

moveRedRight :: LLRB a -> LLRB a
moveRedRight h = f $ colorFlip h where
f t@(Branch _ (Branch _ (Branch Red _ _ _) _ _) _ _) = colorFlip $ rotateR t
f t = t

moveRedLeft :: LLRB a -> LLRB a
moveRedLeft h = f $ colorFlip h where
f (Branch c l x r@(Branch _ (Branch Red _ _ _) _ _)) = colorFlip $ rotateL $ Branch c l x (rotateR r)
f t = t

colorFlip :: LLRB a -> LLRB a
colorFlip (Branch c (Branch c1 l1 x1 r1) x (Branch c2 l2 x2 r2)) =
Branch (fl c) (Branch (fl c1) l1 x1 r1) x (Branch (fl c2) l2 x2 r2)
where
fl Red = Black
fl Black = Red
colorFlip _ = error "LLRB.colorFlip: tree must have 3 nodes at least"

rotateL :: LLRB a -> LLRB a
rotateL (Branch c l x (Branch c' l' x' r')) =
Branch c (Branch Red l x l') x' r'
rotateL _ = error "LLRB.rotateL: tree must have 2 nodes at least"

rotateR :: LLRB a -> LLRB a
rotateR (Branch c (Branch c' l' x' r') x r) =
Branch c l' x' (Branch Red r' x r)
rotateR _ = error "LLRB.rotateR: tree must have 2 nodes at least"


--
-- test
--

tree :: Int -> LLRB Int
tree 0 = empty
tree (n+1) = insert (n+1) (tree n)

main :: IO ()
main = do
print $ member 1 $ (iterate deleteMax (tree 100000)) !! 100000

2008年4月26日土曜日

Firefoxの反応が遅い

最近, 研究室用のマシンの FreeBSD 7-stable 上の linux-firefox の反応が遅くなった. Ctrl-T で新しいタブを作成しようとしても, キーを押してからタブができるまでに数秒のタイムラグが発生するのだ. ちょっとしたら, どこかで修正されるかなと思って我慢していたけど, 改善されないので, 諦めて 6-stable に戻った. 6-stable 上ならキビキビ動く. ちなみに, 後輩の Debian 上の Firefox でも同様の現象が起きていた. Linux用の Firefox 特有の問題なのだろうか.

あと, 後輩にC言語のコールグラフを生成する方法を聞かれたので, 調べてみたら gprof2dot というのを見つけた. なかなか便利そうだ.

2008年3月22日土曜日

Graphvizのフォント

プログラムのプロファイリングに最近 Google CPU Profilerを使うようになった. 特にコンパイルしなおさなくても, LD_PRELOAD で libprofiler.so を渡すだけでなので楽だ.

また, pprof --pdf とかで出力されるコールグラフも見やすくていい. ただ,
Error: Could not find/open font
というのが無数に出力されるのが気になったので調べてみた. pprof の問題ではなく, 内部で使っている Graphviz の問題のようだ. "times.ttf" というファイルを /usr/local/lib/X11/fonts/ で探すのだが, それが見つからないために出力されていた.
# cd /usr/local/X11/fonts/
# ln -fs TTF/luxisr.ttf times.ttf
とかで適当にリンクを張ってごまかしたら, エラーメッセージが消えた.

2008年3月20日木曜日

VPython を FreeBSD にインストール

研究でデータの可視化に利用している VPython を FreeBSD にインストールしなおしたのでメモ. ports/graphics/py-visual はバージョンが古いので, 自分で visual-4.beta26.tar.bz2 を入れた.

  1. VPython が依存するパッケージのインストール
    # portinstall -RP boost-python py25-numpy libglademm24 gtkglextmm

  2. ソースの修正
    src/python/cvisualmodule.cpp, src/python/vector_array.cpp の一行目に
    #include <iostream>
    を追加する
  3. configure & make

2008年3月19日水曜日

FreeBSD 7.0-Release をインストール part2

自宅のPCも FreeBSD 7-stable にした. 多分, 普通に入れる人にはほとんど参考にならないだろうけど, 手順を公開してみる. メジャーバージョンアップの際はクリーンインストールをするようにしていて, そのため FreeBSD のために二つのパーティションを切っている. 普段使っていない方のパーティションに 7.0-release を入れて stable を追いかける.


  1. FreeBSD 7.0-release の CD1 を焼く
  2. CDブートして Expert モードで Minimum インストール
  3. リブート
  4. 最低限の設定をする
    /boot/loader.conf /etc/{resolv.conf, rc.conf, ntp.conf, hosts, fstab, aliases, sysctl.conf}

  5. (必要な人だけ) 以降のコンパイルのオプションを変更する
    # cp /usr/share/example/etc/make.conf /etc
    # vi /etc/make.conf

    ちなみに僕は tmpfs を mtmp にマウントして ports の一時ファイル置き場にしている.
    (/etc/make.conf)
    WRKDIRPREFIX=/mtmp/ports

  6. /usr/share/example/cvsup/stable-supfile をコピーして, cvsup のホスト名を変更しソースツリーをダウンロード.
    # csup stable-supfile

  7. OSのコンパイル
    # cd /usr/src
    # make buildworld
    # make buildkernel KERNCONF=GENERIC
    # make installkernel KERNCONF=GENERIC

    (必要なら, /usr/src/sys/i386/conf/GENERIC をコピーして編集する. しかし, すでに stable ではデフォルトスケジューラがULEになっていたので, GENERICのまま作業した)
  8. リブート
  9. single user mode で起動
  10. インストール
    # /sbin/mount -a
    # set HOME=/root
    # source ~/.cshrc
    # cd /usr/src
    # mergemaster -p
    # make installworld
    # mergemaster
    # exit
    (ここまでで所要時間1時間半ぐらい)
  11. ports ツリーのダウンロード.
    # portsnap fetch extract

  12. portupgrade のインストール
    # cd /usr/ports/ports-mgmt/portupgrade
    # make install

  13. いろんなアプリケーションのインストール
    # portinstall -RPwW --batch `cat pkg.list`

    前もって, "pkg.list" に必要なパッケージ名の一覧をコピーしておく. もともと使っているシステムがあるなら,
    # ls /var/db/pkg > pkg.list
    してから調整するのもあり.
  14. あとは無事インストールが終わるのを待つ. それなりにアプリを入れるとかなり時間がかかる. 僕の場合で3-4時間.
  15. アプリの設定をする. (今回は普段使っているホームディレクトリをそのまま使ったので省略)

おまけ1: linux-firefox について
今回インストールした 7-stable では linux-firefox が不安定になって困った. 理由は分からないが linux エミュレーションのバージョンを変えたら安定した.
(/etc/sysctl.conf)
compat.linux.osrelease=2.6.16

おまけ2: インストールしたパッケージのリスト
これだけ見るとパッケージ数はあまり多くないが, 実際には依存するパッケージも入れるので, 最終的にパッケージの数は580個ぐらいになった. xorg が細かく分割されてからパッケージ数がインフレだ.
(pkg.list)
aspell
autotools
bash
bitstream-vera
blas
boehm-gc
boost-python
bsfilter
cdrtools
compat5x-i386
db46
dnsmasq
dvipdfmx
fd
feh
ffmpeg
fluxbox
gcc42
gdk-pixbuf
ghostscript-gpl
gimp
global
glpk
gmake
gnuplot
google-perftools
graphviz
gsl
gv
hugs98
inkscape
ja-a2ps
ja-acroread7
ja-anthy-9100e
ja-dvipsk-tetex
ja-ipa-ttfonts
ja-kasumi
ja-mplusfonts
ja-nkf
ja-platex-jsclasses
ja-ptex-tetex
ja-qkc
ja-sazanami-ttf
ja-vlgothic-20071015
ja-w3m
ja-xdvik-tetex
ja-xpdf
kmovisto
lame
lapack
lftp
lha
linux-firefox
linux-flashplugin
linux-xorg-libs
linux_base-fc-4
lv
maxima
mbmon
mencoder
mercurial
mesa-demos
mlterm
mmsrip
mplayer
naturaldocs
octave
opengl-man
pkg_cleanup
pkg_remove
pkg_rmleaves
pngcrush
portupgrade
povray
pstoedit
psutils-a4
python25
qhull
queequeg
rlwrap
rpm
rsync
ruby
screen
smartmontools
source-highlight
subversion
sudo
sylpheed
transfig
unzip
valgrind
vim
wget
wine
wmmemfree
wmweather
wxMaxima
xfig
xmms
xorg
xvidcap
zip
zsh

2008年3月11日火曜日

異なるサイズのvalarrayの代入

C++でプログラムを書いていたときに valarray にハマった. それは, サイズの異なる valarray を代入しようとした際に起こった. 始め, 下のソースの(1)みたいにただ単に代入しただけだったのだが, そうすると, GNU C++ 3.4で試したところ, 実行結果が代入前と後で変わらなかった.
01: #include <valarray>
02: #include <iostream>
03:
04: using namespace std;
05:
06: int main(void){
07: // 初期化
08: valarray<int> a(1), b(2);
09: cout << "before: " << a.size() << endl;
10:
11: // (1) 間違い
12: a = b;
13: cout << "after1: " << a.size() << endl;
14:
15: // (2) 正解
16: a.resize(b.size());
17: a = b;
18: cout << "after2: " << a.size() << endl;
19:
20: return 0;
21: }
インクルードファイルを見てみると, サイズの異なる valarray の代入は動作未定義とあって凹む. 今回の場合は(2)のように, 代入する前に valarray のサイズを揃える必要があるらしい. 思い込みとは恐ろしいものだ.

2008年3月8日土曜日

FreeBSDで無線LAN

先週は大学の近所で行われていた学会に参加していた. 普段のテーマとは少し違う分野だったので非常に新鮮だった. すごい発想の違いを見て感動もした. 朝早くから通ってよかった.

そんな会場では無線LANが使えた. しかも, WEP. 家では WPA を使っていて, WEP の設定法は分からなかったので, man ifconfig を読みながら試行錯誤した. 今日はそのメモ. 無線LANのインターフェース ath0 は適当に置き換えてください.

1. アクセスポイントの検索
# ifconfig ath0 list scan

これは一発でうまくいかなかったりもした. 何度かやってると見えた. 接続したい SSID をチェック.
2. アクセスポイントへの接続
# ifconfig ath0 ssid [SSID] wepmode on wepkey [キー] weptxkey 1
# dhclient ath0

"weptxkey 1"がポイントで, "wepkey hogehoge" でキーを設定しただけではダメだった. これはかなり悩んだ.

おまけ: WPAの簡易設定法
1. WPAの設定ファイルを書く (sample.conf)
network={
ssid=[SSID]
psk=[キー]
}

2. 接続
# wpa_supplicant -i ath0 -c sample.conf
# dhclient ath0


詳細は man wpa_supplicant と man wpa_supplicant.conf を読んでください.

2008年3月5日水曜日

Firefoxの高速化?

最近 polipo が話題になっていたので FreeBSD と Windows にインストールしてみる. それほど劇的には変化していない. polipo のインストールしたときに, ついでに, もうちょっと Firefox が速くならないかなあと思っていろいろいじっていたらあることに気づいた. それは, 「アドオン入れすぎかも」ということ. 試しにセーフモードで起動してみたらめちゃくちゃ速い. Firefox ってこんなに速く動けたのかあ〜, と驚いた. その後, どのアドオンが Firefox を遅くしているのか調べてみたら, どれも少しずつ影響があるみたいだったので, adblock plusだけにする. Firefox の機能は前よりも減って少し不便になったけど, 格段にサクサクと動くようになったので満足.

2008年3月4日火曜日

FreeBSD 7.0-Release をインストール

2月半ばからスタートした花粉症が徐々にひどくなってきて憂鬱な今日この頃. 知り合いの先生に会いに行ったら, 巷で噂の Mac Book Air があった! 思わず興奮してしまいましたよ. でも, 自分の研究費はもうないので指をくわえて見るだけ.

FreeBSD 7.0-Release が出たので研究室のPCに入れてみた. インストーラも変わってなくて, いつも通りだけど, 少しだけ手間取ったところをメモ.

1. re0でDHCPが取れず, bootonly の CD ではインストールできなかった. 仕方なく disk1 だけを焼いて最小限インストール. パーティションを切るところで謎のメッセージが出たが, 特に問題なさそうだったので無視. ちょっと気になる.

2. GENERIC カーネルが SMP に対応していた. 今まで SMP 用のカーネルをあとでコンパイルしていたので, 少しだけ楽になったかなと思ったけど, ULE スケジューラを使うためにカーネルをコンパイルしたので変わらず.
(ちなみに, SCHED_4BSD を SCHED_ULE に変更するだけ)

3. nvidia-driver をインストールしたときに, ビデオカードをすぐに認識するもんだと思い込んでいたら違ったので苦労した. 6-stable では kldload nvidia.ko するだけで認識したが, 7-Release では /boot/loader.conf に nvidia_load="YES" を書く方法しか使えないらしい. make install 時のメッセージにそう書いてあったが, 気づいていなかったのが残念だ. 油断大敵.

さて, 一通りアプリケーションをインストールしたら CUDA が使えるかどうかチェックするか.

(続く)

2008年2月19日火曜日

FreeBSDで音飛び

現在, FreeBSD 6-stable を使っているが, ネットワークを通じて大量のファイルをコピーしながら, 音楽を再生すると, ときどき音飛びをすることに気づいた. あと, ports で gimp のコンパイルをする最中にリブートする問題にも悩んでいる. メモリとかは特に問題がないようだ. 7-release では改善しているのだろうか.

2008年2月17日日曜日

xpdfの高画質化 part2

FreeType2のドキュメントを読んだりしたりして xpdf を解析しようとしていたけど, 根負けして諦めた. またそのうち暇があったら触ってみようかと思う. とりあえず, いじったところをアップしてみる.

ポイントは, 一つ目の size を 8倍にしているところ. (8倍じゃなくても, 適当に大きくしてあればいいらしい) これだけで見た目はグッと変わった. あと, 標準ではヒンティングがオフになっているが, それをオンにした. これは好みの問題.

このパッチは FreeType2 用なので T1lib はオフにしないと効果がないかもしれない. ~/.xpdfrc に
enableT1lib no
enableFreeType yes

を足せばOK.

なお, PDFファイルによっては xpdf が落ちることもあったので要注意!

--- a/splash/SplashFTFont.cc Sun Feb 17 12:40:58 2008 +0900
+++ b/splash/SplashFTFont.cc Sun Feb 17 22:27:23 2008 +0900
@@ -50,7 +50,7 @@ SplashFTFont::SplashFTFont(SplashFTFontF
return;
}
face->size = sizeObj;
- size = splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]);
+ size = 8 * splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]);
if (FT_Set_Pixel_Sizes(face, 0, (int)size)) {
return;
}
@@ -180,9 +180,9 @@ GBool SplashFTFont::makeGlyph(int c, int
}

// if we have the FT2 bytecode interpreter, autohinting won't be used
-#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
- if (FT_Load_Glyph(ff->face, gid,
- aa ? FT_LOAD_NO_BITMAP : FT_LOAD_DEFAULT)) {
+//#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#if 1
+ if (FT_Load_Glyph(ff->face, gid, FT_LOAD_DEFAULT | FT_LOAD_TARGET_LIGHT)) {
return gFalse;
}
#else
@@ -196,7 +196,7 @@ GBool SplashFTFont::makeGlyph(int c, int
return gFalse;
}
#endif
- if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal
+ if (FT_Render_Glyph(slot, aa ? FT_RENDER_MODE_LIGHT
: ft_render_mode_mono)) {
return gFalse;
}

2008年2月14日木曜日

xpdfの高画質化 part1

今まで PDF を読む際には, acroread と xpdf を場合に応じて使い分けていた. サクサク読みたいときは軽い xpdf を, じっくり読む場合は綺麗に表示する acroread という感じ. しかし, xpdf は freetype2 を使っているのだから, もっと綺麗に表示できるはずだろうと思って, いろいろ調べてみた.

もう眠くなったので結果だけ書くと, ちょっとソースをいじるだけで xpdf もかなり綺麗になることが分かった. でも, 一部の PDF を入れると落ちることもあるので要調査.

2008年2月12日火曜日

パソコンの調子がおかしい?

珍しく FreeBSD が落ちた. 再起動してブラウザを開いていたら, もう一度落ちた. それからは大丈夫なのだがパソコンの調子が悪いのではないかとちょっと不安になる. 6-stable でこんなに落ちたのは初めてだ.

2008年2月10日日曜日

linux-firefox 復活

前回 linux-firefox が使えなくなったという話をしたが, Firefox のバージョンが 2.0.0.12 に上げたら復活した. wine 上の Firefox は Flash9 が使えて便利だけど, かなり重かった. linux-firefox が復活して良かった.

2008年2月3日日曜日

linux-firefox が使えなくなった

FreeBSD上ではブラウザとして, linux-firefox を使っていたのだが, 今日ひょんなことから使えなくなってしまった. ことの発端は, アドオンの gmail-notifier のアップデートをしようとしたこと. すると, checksum が一致しないといってアップデートに失敗してしまった. そして, なぜか linux-firefox が起動しなくなった. 非常に困る状況だ.

仕方ないので, wine上で Windows用の Firefox を動かして代替しようとしたけど, blogger への投稿がうまくいかないので, 別のエディタで文章を書いてから貼り付けることにした. 面倒過ぎる. 早く linux-firefox の復旧をしなければ.

wine で Firefox を動かす際に linux-firefox の設定は引き継がなかったので, 設定は一からやりなおし. アドオンのインストールはいいけど, about:config の設定はすっかり忘れていて, 少し困った. Google Reader の 'v'キーでウィンドウをポップアップさせる際に, 新しいウィンドウをバックグラウンドにするのは,
browser.tabs.loadDivertedInBackground

を true にする. 再び忘れないようにメモ.

2008年2月1日金曜日

uim-ximの問題?

普段は FreeBSD を使っていて大体満足しているのだが, 一つ気になっている問題がある. それは, Firefox で Google Suggestion の候補が出たときに Fluxbox のワークスペースの移動をするとハングアップして, X を強制終了しなければならなくなることだ.

この問題をずっと放置してきたが, さすがに気になったのでさっき原因を調べてみた. すると, uim-xim がハングアップしていることが判明. uim-xim を切って Firefox で同じことをしても問題が再現しなかったので, これでどうも犯人は uim-xim らしいということが分かった. あとは, どう修正すればいいかだが, これはまた時間のある時にでもしようと思う. 今日は飲み会の後なのでもう眠い.

2008年1月31日木曜日

powerdで最小の周波数を設定 part 2

「powerdで最小の周波数を設定」という記事を以前書いたが, もっといい方法を見つけた. それは, sysctl で debug.cpufreq.lowest を設定するというもの. 例えば, 最小の周波数を1GHzにしたければ,

root# sysctl debug.cpufreq.lowest=1000

としてやる. /etc/sysctl.conf に書き込めばシステム起動時から設定ができる. こんなのも知らんとはまだまだ僕も未熟やのう.

2008年1月28日月曜日

feh のランダム表示

僕は画像ビューワーとして ports/graphics/feh を愛用している. シンプルなインターフェースがお気に入りだ. 時々, feh を使ってデジカメで撮った写真をランダムに表示させて暇を潰すことがあるのだが, 一部の画像が何度も出て, 一部の画像は全く出ないという偏りがあるような気がしていた.

現実逃避でソースを調べてみたら, feh が依存している ports/graphics/giblib の gib_list.c の gib_list_randomize と言う関数で, ファイルリストを乱数で混ぜるとき次の様に rand を使っていた.
r = (int) ((len - i - 1) * (float) rand() / (RAND_MAX + 1.0)) + i + 1;

ただし, rand % FOO という形でないので, それほど問題でもないと思うのだが, とりあえず, この rand を random に変えてみて, しばらく使ってみて様子を見ることにした.

2008年1月22日火曜日

FreeBSD 6.3R を入れた

もともと stable を追いかけていたので特に変化無し. これからは 7.0 Release が楽しみ. そろそろテストを始めるかな.

Micropolis は忙しくて遊べず. パッチもそのうち更新するかも. とにかく仕事が忙しい.

2008年1月15日火曜日

Micropolis on FreeBSD part 2

昨日に引き続きMicropolisを FreeBSD で動かす話. 結果から言うと動くようになった. ちゃんとチェックはしていないけど, とりあえずパッチをさらしてみる. 以下はコンパイルの仕方.

1. 最新のスナップショットをダウンロード (http://rmdir.de/~michael/micropolis_mac-osx.patch 参照)

  • http://git.zerfleddert.de/cgi-bin/gitweb.cgi/micropolis

  • tar.gzファイル: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/micropolis?a=snapshot;h=HEAD;sf=tgz


2. FreeBSD用のパッチもダウンロード (http://www.kcat.zaq.ne.jp/aabqq103/micropolis_freebsd.patch)
3. スナップショットを展開. ここでは, ~/micropolis と仮定.
4. パッチを適用したら, コンパイル, インストールして, 後は遊ぶだけ.

$ cd ~/micropolis
$ patch -p2 < micropolis_freebsd.patch
$ cd src
$ make all install
$ cd ..
$ ./Micropolis

これで動くはず. Micropolisに必要なソフトはきちんと把握していません. 多分 X 関係を一通り入れておけばいいのではないかと思う. 音を出すには bash が必要.

2008年1月14日月曜日

FreeBSDでMicropolisに挑戦

初代 SimCity が Micropolis として公開されている. 現実逃避で FreeBSD 上で遊んでみることに.

まず, Linux 用のバイナリを試してみたら floating point exception が起きたので, 地道にソースをコンパイルすることに. 結構ソースをいじることになった. 一応コンパイルはできたけど, 画面がきちんと表示されないなどの不具合があるので今日は諦める. 画像は起動させたところ. Fluxbox のスリットにウィンドーができたのも謎だ.

このパッチでよくなるとの噂もあるので試してみないと.

2008年1月12日土曜日

acroread8

ports を見ていたら acroread8 があったのでインストールしてみた. acroread7 に比べると確かにスクロールのスピードが速くなったりしたのだが, ハングアップはするし, 見開き表示にしたら普通の表示には戻らなくなって ~/.adobe/Acrobat を消すはめになったりして散々だったので acroread7 に戻ることにした.

特に戸惑ったのが, acroread8 がハングアップしたときに
pkill -9 acroread
としても強制終了できなかったこと. ps auxw で確認したら,
/lib/ld-linux.so.2 /usr/local/Adobe/Reader8/JPN/Adobe/Reader8/Reader/inte
llinux/bin/acroread hoge.pdf (ld-2.3.6.so)
と出たので,
pkill -9 ld-2.3.6.so

とやったらようやく消えた. 分かりにくいわ〜.

2008年1月10日木曜日

linux-flashplugin

ブラウザは linux-firefox を使っていて, flash は ports/www/linux-flashplugin7 を使っていたのだが, 興味本位で linux-flashplugin9 をインストールしてみた. しかし, flash のページに行くと core dump をしてブラウザが死んでしまって使えない. どうも, 7系の新しい linux emulator が必要なようだ. 当方 6-stable なので諦める.

そこで, 元の linux-flashplugin7 に戻そうとしたら, make fetch に失敗して困る. f7_archiveがダウンロードできずに終了するのだ. ちょっと調べてみたところ.
http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp7_archive.zip

をダウンロードしたらうまくいった.

2008年1月7日月曜日

powerdで最小の周波数を設定

FreeBSD では powerd を使うと CPU の周波数を自動的に変化させることができる. しかし, 標準のまま使うと, 周波数が低くなりすぎるようで, 全体的に反応が遅くなるので, 普段は使っていなかった. なんとなく気が向いたので, src/usr.sbin/powerd/powerd.c をちょっといじってみた.

使い方としては, -x オプションで最小の周波数を指定すると, powerd はその周波数以下には下げないようになる. それ以外は変わらない. 現在 "-x 1600" にして使っている.

(追記) これと同様のことは sysctl でも実現できます. 続き

--- powerd.c.orig 2008-01-07 21:57:28.000000000 +0900
+++ powerd.c 2008-01-07 22:15:45.000000000 +0900
@@ -95,6 +95,9 @@
static int apm_fd;
static int exit_requested;

+/* Minimum CPU Frequency */
+static int cpu_min_freq = 0;
+
static int
read_usage_times(long *idle, long *total)
{
@@ -249,7 +252,7 @@
{

fprintf(stderr,
-"usage: powerd [-v] [-a mode] [-b mode] [-i %%] [-n mode] [-p ival] [-r %%] [-P pidfile]\n");
+"usage: powerd [-v] [-a mode] [-b mode] [-i %%] [-n mode] [-p ival] [-r %%] [-P pidfile] [-x min_freq]\n");
exit(1);
}

@@ -277,7 +280,7 @@
if (geteuid() != 0)
errx(1, "must be root to run");

- while ((ch = getopt(argc, argv, "a:b:i:n:p:P:r:v")) != EOF)
+ while ((ch = getopt(argc, argv, "a:b:i:n:p:P:r:x:v")) != EOF)
switch (ch) {
case 'a':
parse_mode(optarg, &mode_ac, ch);
@@ -317,6 +320,9 @@
case 'v':
vflag = 1;
break;
+ case 'x':
+ cpu_min_freq = atoi(optarg);
+ break;
default:
usage();
}
@@ -459,7 +465,10 @@
warn("read_usage_times() failed");
continue;
}
-
+ if(curfreq < cpu_min_freq){
+ set_freq(cpu_min_freq);
+ curfreq = cpu_min_freq;
+ }
/*
* If we're idle less than the active mark, bump up two levels.
* If we're idle more than the idle mark, drop down one level.
@@ -482,7 +491,7 @@
warn("error setting CPU frequency %d",
freqs[i]);
} else if (idle > (total * cpu_idle_mark) / 100 &&
- curfreq > freqs[numfreqs - 1]) {
+ curfreq > freqs[numfreqs - 1] && freqs[i + 1] >= cpu_min_freq) {
i++;
if (vflag) {
printf("idle time > %d%%, decreasing clock"

chflags

ports で opera を入れたら一緒に compat4x が入った. そして, compat4x を make clean しようとしたら
rm -rf compat4x/work/var/empty
rm: empty: Operation not permitted

という感じになって消せないディレクトリができてしまった. chmod で書き込み権限を付けることもできず, こういう場合どうすんのかなあと悩んで man chmod を見たら, "chflags" というキーワードをみつけて思い出した.
ls -lo

をしたら案の定 schg フラグが付いていたので,
chflags noschg empty
rm -r empty

として一件落着.

2008年1月2日水曜日

caps lock -> ctrl (xorg.conf)

明けましておめでとうございます.
今年はバタバタしそうな予感です. どうなることやら.

X 上では普段 caps lock は ctrl に xmodmap でマッピングしているのだが, いつぞやに xorg をアップデートしてからうまく機能しなくなった. 正確には, 一度 caps lock キーに触って以降に xmodmap を呼ばないといけなくなった. そのうち直るだろうと思っていたが, 一向に直らないので, 諦めて xorg.conf のキーボードのセクションに以下の一文を追加して caps lock を ctrl にマップした.
Option "Xkboptions" "ctrl:nocaps"

さて原稿の続きを書くか.