super-smack

$ wget http://vegan.net/tony/supersmack/super-smack-1.3.tar.gz
$ tar xvzf super-smack-1.3.tar.gz 
$ cd super-smack-1.3/
$ ./configure --with-mysql --prefix=$HOME --with-smacks-dir=$HOME/share --with-datadir=$HOME/var --with-mysql-lib=/usr/lib64/mysql/ --with-mysql-include=/usr/include/mysql

で動くかと思いきや、何カ所か手を入れる必要があった。

strlenが無い(おそらくgccが新しすぎる)って怒られる場合は、src/dictionary.hに下記を追加

#include <string.h>

また、キャストできない(おそらく64bit環境なため)って怒られる場合は、src/query.ccを修正。

--- query.cc~   2005-04-30 22:51:29.000000000 +0900
+++ query.cc    2009-10-11 19:05:46.000000000 +0900
@@ -197,7 +197,7 @@
     {
       string s((*i).first);
       int str_len = (*i).first.length();
-      if((unsigned)p + str_len + 3 *sizeof(int)  < (unsigned)p_end )
+      if((unsigned long)p + str_len + 3 *sizeof(long)  < (unsigned long)p_end )
       {
         *p++ = (char) str_len;
        const char* q_type_name = s.c_str();
@@ -216,7 +216,7 @@
        die(0, "report buffer overflow -- too many query types");
     }
   
-  len = (unsigned)p - (unsigned)buf;
+  len = (unsigned long)p - (unsigned long)buf;
   *(buf) = num_recs;
 
   if(write(fd, buf, len) != len)

並外れて投げやりな修正だが、動いているようだ。しかし、上記のようにsizeof(void *)==sizeof(int)を仮定している場所が他にもあるようなら、あまりマトモには動かないかもしれない。

また、インストールにflexとbison(or byacc)が必要なのだが、無くてもconfigureで何も言ってくれないので注意。

ロケール

LANGやらLC_ALLやらについて。

$ echo $LANG
ja_JP.UTF-8
$ locale -a | grep ja_JP
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8

一致してないけど、確か大丈夫なんですよね。

$ touch 日本語
$ ls
日本語
$ LANG=C ls
?????????
$

バッチリですね。

Debianとか、たまにja_JP.UTF-8が無い環境があって面倒。環境変数でsetしたロケールが無い場合はC扱いです。無いかどうか簡単にチェックする方法って無いのかなあ?

しかし、どうなっているのかイマイチわかってないなあ…。

useradd時のホームディレクトリのスケルトン

useraddすると勝手にホームディレクトリが作られ、デフォルトの.bashrcなどがコピーされます。このコピー元はデフォルトでは/etc/skel以下です。

$ ls -la /etc/skel
total 64
drwxr-xr-x   3 root root  4096 Sep 24 18:45 .
drwxr-xr-x 108 root root 12288 Oct  4 04:02 ..
-rw-r--r--   1 root root    33 Jan 22  2009 .bash_logout
-rw-r--r--   1 root root   176 Jan 22  2009 .bash_profile
-rw-r--r--   1 root root   124 Jan 22  2009 .bashrc
-rw-r--r--   1 root root   515 Jun 15  2008 .emacs
drwxr-xr-x   4 root root  4096 Sep 11 19:31 .mozilla
-rw-r--r--   1 root root   658 Jan  7  2007 .zshrc
$

ここに好きなファイルを追加すれば、useradd時に作られるファイルを追加できます。ユーザーごとに.ssh/を手動で掘るのはアホらしいので、OSインストール直後にまず/etc/skel/.sshを作るべきだと思います。

$ su -
# mkdir /etc/skel/.ssh
# chmod 700 /etc/skel/.ssh
# touch /etc/skel/.ssh/authorized_keys
# chmod 600 /etc/skel/.ssh/authorized_keys

これディストリビューション標準にしてくれないかな。

SRPMの中身を見る

10/2の記事「SRPMの取得」の続きです。取ってきたSRPMの探検方法を紹介します。

$ mkdir -p RPM/{BUILD,RPMS/{i386,i586,i686,noarch},SOURCES,SPECS,SRPMS}
$ echo %_topdir $HOME/RPM >> .rpmmacros

過去にSRPMをいじったことが無い場合、上記の準備が必要です。ディレクトリ名は好みで。

$ rpm -ihv lv-4.51-8.1.src.rpm 
   1:lv                     警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
########################################### [100%]
$ cd RPM/SPECS/
$ lv lv.spec

SRPMをインストールすると、先ほど準備したディレクトリに何ファイルかインストールされます。まず見るべきものはRPM/SPECS以下のSPECファイル(パッケージの設計書)です。初めて見る人でもそこそこ読めるかと思います。

SPECファイルを見たところ、CentOSのlvには5個のパッチが当たっています。パッチはRPM/SOURCES以下にあります。

$ cd ../SOURCES
$ ls
lv-+num-option.patch
lv-4.49.4-nonstrip.patch
lv-4.51-162372.patch
lv-fastio.patch
lv-lfs.patch
lv451.tar.gz
$

パッチの中身をざっと見たところ、「lv-+num-option.patch」で下記のコマンドラインオプションが追加されているようです。

       +number
              Jump to the specified line immediately when lv is invoked.

       +/grep-pattern
              Search  the specified pattern immediately when lv is invoked.

それ以外に興味を引くようなものは無さそうですが、パッチ適用後のソースコードも眺めてみます。

$ cd ../SPECS/
$ sudo yum install rpm-build
$ rpmbuild -bp lv.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.71712
+ umask 022
+ cd /home/install-memo/RPM/BUILD
+ cd /home/install-memo/RPM/BUILD
+ rm -rf lv451
+ /bin/gzip -dc /home/install-memo/RPM/SOURCES/lv451.tar.gz
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd lv451
++ /usr/bin/id -u
+ '[' 500 = 0 ']'
++ /usr/bin/id -u
+ '[' 500 = 0 ']'
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ echo 'Patch #1 (lv-4.49.4-nonstrip.patch):'
Patch #1 (lv-4.49.4-nonstrip.patch):
+ patch -p1 -b --suffix .nonstrip -s
+ echo 'Patch #2 (lv-4.51-162372.patch):'
Patch #2 (lv-4.51-162372.patch):
+ patch -p1 -b --suffix .162372 -s
+ echo 'Patch #3 (lv-+num-option.patch):'
Patch #3 (lv-+num-option.patch):
+ patch -p1 -b --suffix .num -s
+ echo 'Patch #4 (lv-fastio.patch):'
Patch #4 (lv-fastio.patch):
+ patch -p1 -b --suffix .fastio -s
+ echo 'Patch #5 (lv-lfs.patch):'
Patch #5 (lv-lfs.patch):
+ patch -p1 -b --suffix .lfs -s
+ exit 0
$ cd ../BUILD/lv451/

ちなみに、期待していた機能は見つかりませんでした。

GNOME端末のカスタマイズ

  • 「キーボード・ショートカット」
    • 「メニューのアクセスキーを全て無効にする」
      • デフォルトだとAltがメニューに取られてしまい、Emacsライクなmetaキーが使えないため
    • 「前のタブに切り替える」Ctrl+Shift+[
    • 「次のタブに切り替える」Ctrl+Shift+]
  • 「プロファイル」
    • 背景色を青に。

Ctrl+Shift+tで新規タブ。

SRPMの取得

SRPMが突然欲しくなることってないですか?僕はCentOS 5のlvにどんなパッチが当たっているのか、今すぐ知りたくなりました。

まずyum-utilsをインストール。

# yum install yum-utils

次に、/etc/yum.repos.d/CentOS-Base.repo に下記のように追記しました。

[base-srpm]
name=CentOS-$releasever - Base SRPM
baseurl=http://mirror.centos.org/centos/$releasever/os/SRPMS/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

[updates-srpm]
name=CentOS-$releasever - Updates SRPM
baseurl=http://mirror.centos.org/centos/$releasever/updates/SRPMS/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

準備完了。

$ sudo yum --enablerepo=base-srpm,updates-srpm check-update # 初回アクセス時に必要?
(略)
$ yumdownloader --enablerepo=base-srpm,updates-srpm --source lv
Loaded plugins: fastestmirror, priorities
lv-4.51-8.1.src.rpm                              | 587 kB     00:02
$

無事ダウンロードできました。

CtrlとCAPSの入れ替え

$HOME/.Xmodmap作っとけって話。GNOMEGUIで設定できる奴はニセモノ。

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Control_L
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L