zt日記

書いているのは Kazuhiro NISHIYAMA a.k.a. ZnZです。
2001|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|
2012|04|05|06|09|

この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。

xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法インストールメモXREA + tDiary + Namazuをどうぞ。


2009年04月01日(Wed)

Re: Ubuntu Weekly Recipe:第63回 Sylpheedを使用する:機能活用編|gihyo.jp … 技術評論社

「ソートしない」の時は「昇順降順」を選べないので48パターンではなさそう。 2ページ目の「※3 cups-pdfで出力したPDFはすべてイメージになってしまい,例えば文字の選択などが行えません。もちろん,GTKの印刷ダイアログを使用した場合は問題ありません。」というのは知らなかったので、参考になった。


2009年04月02日(Thu)

GRUB 2 で GRUB Legacy の savedefault 相当の機能

CommandList - GRUB Wiki に「replace by load_env/save_env」とあるけど grub 1.96 には load_env/save_env はなさそうで、Re: [Design] savedefault という話が最近あったり、GrubTransition - Debian Wiki の Regressions に「Menu's default=saved / grub-reboot isn't implemented. 」と書いてあったりするので、まだ GRUB 2 では savedefault 相当のことは出来なさそうだった。


2009年04月08日(Wed)

[debian] etckeeper

/etcをギットギトにしてやった をみて Ubuntu Weekly Recipe:第58回 ファイルのバージョンを管理する|gihyo.jp … 技術評論社 で知った etckeeper を最近使ってみていることを思い出した。

etckeeper は debian だと lenny 以降で入っていて、デフォルトは git になっている。 ubuntu だと hardy 以降で入っていて、jaunty (9.04) だとデフォルトは bzr になっている。

最初に「sudo etckeeper init; sudo etckeeper commit」としておけば後は「sudo aptitude full-upgrade」などの時に自動でコミットしてくれる。

手動で /etc 以下のファイルを変更した場合は「sudo etckeeper commit "message"」や「cd /etc; sudo git commit -m "message"」などでコミットする。 間違えて「sudo etckeeper commit -m "message"」のようにしてしまうと、コミットログが「-m」になってしまうが、git だと「cd /etc; sudo git commit --amend -m "message"」などで修正できる。(bzr の場合はどうすればいいのか知らない。)

/etc/aliases.db はデフォルトだと /etc/.gitignore に入っていなかったので、/etc/.gitignore に追加して「cd /etc; sudo git rm --cached aliases.db」でバージョン管理から外した。

本日のツッコミ(全1件) [ツッコミを入れる]

yuya [そのまんまのものがあったんですね. 思い切り車輪作ってたところでした... ]


2009年04月09日(Thu)

Common Apache Misconception

「.php で終るファイル」ではなく「.php を含む全てのファイル」に適用される、という話。

ではなく

「.php で終るファイル」だけではなく「.php. を含む全てのファイル」にも適用される、という話。

ではないかと。

実際に試してみると test.php.bak だと application/x-trash になって php は処理されなかったので、他の設定が優先されることもあるみたい。


2009年04月10日(Fri)

[debian] molly-guard

lenny で openssh-server の Suggests に molly-guard というものが入っている。

molly-guard を入れると shutdown や reboot などのコマンドがラッパースクリプトに置き換えられる。 そのスクリプトは、ssh 経由の時にメッセージを表示してホスト名の入力をしないと本当の shutdown や reboot などのコマンドが実行されないようにしてくれる。

ssh で入った先で screen を使っていると ssh 経由の判定が出来なくなってしまうので、/etc/molly-guard/rc の「ALWAYS_QUERY_HOSTNAME=true」という設定を有効にして使っている。


2009年04月12日(Sun)

Re: 教えてelisp

気になったので調べてみた。

; 元のコード
(defun primep (n primes)
  (let ((sq (sqrt n)))
    (cond ((null primes)
           t)
          ((< sq (car primes))
           t)
          ((= (mod n (car primes)) 0)
           nil)
          (t (primep n (cdr primes))))))

(defun primes (max)
  (let ((p '(2))
        (n 3))
    (while (< n max)
      (cond ((primep n p)
             (nconc p (list n))))
      (setq n (+ n 1)))
    (print p)))

まず破壊的に変更をしているのは nconc しかなさそうなので、そこを append に変えてみて試す。

(defun primes (max)
  (let ((p '(2))
        (n 3))
    (while (< n max)
      (cond ((primep n p)
             (setq p (append p (list n)))))
      (setq n (+ n 1)))
    (print p)))

増えなくなるので nconc が悪いらしいという仮定はあっていたっぽい。

次に (primes 15) を何度か試して増え方の傾向を見てみると、前回の結果を覚えているだけで、指数的に増えているようには見えなかったので、ちょっと調べるためにグローバル変数に取り出してみる。

(setq q nil)
(defun primes (max)
  (let ((p '(2))
        (n 3))
    (setq q p)
    (while (< n max)
      (cond ((primep n p)
             (nconc p (list n))))
      (setq n (+ n 1)))
    (print p)))

append の場合も同様に試してみると '(2) が変化しているようだと気づいたので、毎回生成されるように (list 2) に変えてみる。

(setq q nil)
(defun primes (max)
  (let ((p (list 2))
        (n 3))
    (setq q p)
    (while (< n max)
      (cond ((primep n p)
             (nconc p (list n))))
      (setq n (+ n 1)))
    (print p)))

これだと増えていかないし、直前の答えは覚えたままになった。

本当に変化しているのか調べるために (cadaar (cdaddr (symbol-function 'primes))) あたりを試してみると、やはり関数の中の '(2) が変化していることが確認できた。


2009年04月15日(Wed)

[debian] VMware-server

lenny で VMware-server-2.0.1-156745.x86_64.tar.gz のインストールをしたところ、デフォルトの gcc(gcc-4.3) ではだめで sudo CC=gcc-4.1 vmware-config.pl としないとコンパイル出来なかった。

[debian] iptables-apply

lenny には /usr/sbin/iptables-apply という iptables-restore で設定を変更して、確認待ちをして 15 秒間確認がなければ、もとの iptables の設定に戻してくれるという便利なスクリプトが入っていた。 リモートのサーバの iptables の設定変更で失敗すると大変なことになるので、非常に便利かもしれない。


2009年04月16日(Thu)

[ruby] nadoka の SSL 対応

最新の nadoka は www.atdot.net から checkout したままのものがあれば「svn switch --relocate http://www.atdot.net/svn/nadoka svn://rubyforge.org/var/svn/nadoka」とか「svn switch --relocate http://www.atdot.net/svn/nadoka http://nadoka.rubyforge.org/svn」とかで切り替えられます。 新規チェックアウトは http://rubyforge.org/projects/nadoka/ の SCM レポジトリ を参照。

GitHub で SSL 対応をしているという話は以前に見かけていたので、それを取り込んでみようかと思ったら、証明書の検証をしていないように見えたので、net/pop.rb や open-uri.rb を参考にして対応してみました。

基本的には Servers の設定に「:ssl_params => {}」という感じで空のハッシュを設定すれば後は open-uri のように openssl のデフォルトの証明書ストアを使って検証します。

「:ssl_params => { :ca_cert => "/path/to/certs" }」のように「:ca_cert」で証明書のディレクトリかファイルのパスを指定すると open-uri の「:ssl_ca_cert」のように、その証明書を使います。

勝手にされるのが嫌なときもあるかと思って、「:ca_cert => false」に設定すると他の「:ssl_params」の内容を OpenSSL::SSL::SSLContext#set_params に渡すだけにしました。

参考にしたもの。


2009年04月17日(Fri)

マウスの操作に使う指

マウスの左利き用設定の説明をみて、自分のマウスの使い方と比較して気になったのでメモ。

昔から使っているマウスにMicrosoft IntelliMouse Opticalがあるけど、これを左手で使っていて、親指でマウスの右側、中指から小指でマウスの左側を持って操作していて、上にある左右クリックとホイールは人差し指で操作している。 そして、中指で左サイドボタン(ブラウザでの「戻る」操作)、親指で右サイドボタン(ブラウザでの「進む」操作)を使っている。

最近はノートPCでタッチパッドを使うことも多いけれど、左手で使うときでさえ左利き用設定を使いたいと思ったことは一度もない。


2009年04月19日(Sun)

dbus-send を使ってログアウトダイアログを出す

Ubuntu 9.04 で上のメニューのシステムのところからログアウトなどが無くなってしまって、「Alt+F1 ← ↑ ↑ Enter」のようなキーボードのみの操作でログアウトダイアログが出せなくなって非常に不便になってしまった。 (シャットダウンなどは Ctrl+Alt+Delete で出てくる。しかも「システム - 設定 - キーボード・ショートカット」(gnome-keybinding-properties)の設定画面では Log out という操作になっているのに、出てくるダイアログにログアウトという選択肢はない。)

launchpad の answers に英語で質問してみても解決しなかったが、ふと dbus-send でなんとかできないかと思って調べてみたら、出来ることがわかった。 結論だけ先に書いておくと

dbus-send --session --dest=org.gnome.SessionManager --type=method_call --print-reply /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:0

またはオプションをいくつか省略して

dbus-send --type=method_call --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:0

でログアウトダイアログを出すことが出来た。 (ログアウトしてしまえば見えないから --print-reply は不要か)

調べ方としては、まず適当な端末で dbus-monitor を起動しておいて、別途適当な操作をして関係しそうなオブジェクトなどを調べることにした。

別の gnome-terminal を開くと早速 /org/gnome/SessionManager という関係しそうなものが見つかったので、

dbus-send --session --type=method_call --print-reply \
    --dest=org.gnome.SessionManager \
    /org/gnome/SessionManager \
    org.freedesktop.DBus.Introspectable.Introspect

のように調べてみると「<interface name="org.gnome.SessionManager">」に

<method name="Logout">
  <arg name="mode" type="u" direction="in"/>
</method>

というメソッドがあることがわかった。

http://dbus.freedesktop.org/doc/dbus-specification.html をみて u は uint32 だとわかったので、上述のコマンドでとりあえず 0 を引数にして実行してみると、ログアウトダイアログが出てきた。

「apt-get source gnome-session」でソースをとってきて、「gnome-session/org.gnome.SessionManager.xml」などを確認してみると

0
通常のログアウトダイアログを表示するログアウト
1
確認なしでログアウト
2
強制ログアウト (確認もしないし、ログアウトを待ってほしいプログラムがあっても無視する)

という意味のようだった。

参考:


2009年04月22日(Wed)

ruby1.8 で /proc/mounts が読めない

Ruby/GTK2 を使っているプログラムで umount 対象を探すのに /proc/mounts を読もうとしたら止まってしまうと言うことがおきた。

調べてみると、マルチスレッドの状態で読もうとすると止まるという http://cvs.m17n.org/~akr/diary/2009-04.html#a2009_04_07_1 に書いてあるような現象だった。

事前に irb でその読み込み部分だけで動くことを確認していたが、それだと充分な確認になっていなかったらしい。

今回は必要な情報は /etc/mtab でも同じだったので、そちらから読むようにしたが、popen などで mount コマンドを呼ぶとか、「cat /proc/mounts」などを呼ぶというのでもよかったのかもしれない。

ついでに /proc/loadavg で似たようなことがあったという話について調べてみると http://lkml.indiana.edu/hypermail/linux/kernel/0508.0/1249.html に報告があって、http://lkml.indiana.edu/hypermail/linux/kernel/0508.1/0094.html に返事があった。


2009年04月27日(Mon)

暗号化ルートパーティションをリモートからアンロック

Unlocking a LUKS encrypted root partition via ssh のようにリモートからパスフレーズを入力して暗号化パーティションを使うように出来ないかと思って試してみた。

まず /usr/share/doc/cryptsetup/README.Debian.gz の「7. Remotely unlock encrypted rootfs」に「Unfortunately dropbear 0.52-1 is required for this to work. As this version is not incuded in lenny, you'll have to install it manually.」と書いてあるので、lenny はあきらめて、dropbear が 0.52-1 だった Jaunty (Ubuntu 9.04) で試すことにした。

まず ubuntu-9.04-alternate-i386.iso からインストールしてパーティショニングのところで「暗号化 LVM」をセットアップしておく。 desktop 版の Ubuntu 独自インストーラと違って、 alternate 版のインストーラは debian-installer なので、このあたりは debian と同じ。

インストールが終わったら dropbear パッケージをインストールする。

$ sudo aptitude install dropbear

dropbear を起動するためにネットワークの設定が必要なので、例えば VMware なら pcnet32 モジュールのように、必要なモジュールを /etc/initramfs-tools/modules に追記して、 initramfs の中の段階で読み込まれるようにしておく。

$ echo pcnet32 | sudo tee -a /etc/initramfs-tools/modules

/boot/grub/menu.lst の kopt に固定 IP アドレスなら「ip=IPアドレス::デフォルトゲートウェイ:ネットマスク::インタフェース:none」のように設定する。 「ip=」での指定は initramfs の中で klibc-utils の ipconfig というコマンド (ifconfig ではない) が呼ばれていて、その引数の説明は klibc-utils: Include README for ipconfig に要望があるように、今のところソースパッケージを取ってきて usr/kinit/ipconfig/README を見ないとわからないということになっている。 この README の説明によると、昔は「nfsaddrs=」という名前だったのが「ip=」も追加されただけのように見えるが、initramfs-tools は「ip=」にしか対応していないようなので、「nfsaddrs=」は使えなさそうに見えた。

$ sudo vi /boot/grub/menu.lst
append 「ip=192.168.0.100::192.168.0.1:255.255.255.0::eth0:none」 to kopt
$ sudo update-grub

ここまでの状態で再起動して試してみると、IP アドレスの設定はうまくいっているようで、ping には応答があるのに、ssh はつながらなかった。 kopt に「break=mount」も追加して調べてみたところ、「/sbin/dropbear」が起動していなくて、initramfs のシェルから起動すると問題なく起動したので、ネットワークの初期化が間に合っていなさそうと思って、「/usr/share/initramfs-tools/scripts/init-premount/dropbear」の「/sbin/dropbear」の前に「sleep 10」を追加してしのぐことにした。 「/usr」以下のファイルは出来れば変更したくなかったけど、「configure_networking」と「/sbin/dropbear」の間に hook がなかったので直接変更して、「sudo update-initramfs -u」で反映した。 (真面目にやるなら init-premount/dropbear の前に configure_networking をする hook を init-premount の中に追加することになりそう。)

ssh で入れるようにするために公開鍵を /etc/initramfs-tools/root/.ssh/id_rsa.pub に追加する。 id_rsa.pub に追加するのは本当は良くないけど、 /usr/share/initramfs-tools/hooks/dropbear で「cp /etc/initramfs-tools/root/.ssh/id_rsa.pub "${DESTDIR}/root/.ssh/authorized_keys"」ということをしているので、「/etc」以下のファイルの書き換えだけで済む id_rsa.pub の編集が無難だと判断した。 /etc/passwd は「echo "root:x:0:0:root:/root:/bin/sh" > "${DESTDIR}/etc/passwd"」で生成されているので、別の hook を追加しないとパスワード認証で入るのは無理そう。 (ということを書いていて気付いたけど、公開鍵も hook を追加して追記する方が良かったのかもしれない。)

$ sudo vi /etc/initramfs-tools/root/.ssh/id_rsa.pub
append your public key
$ sudo update-initramfs -u

/usr/share/doc/cryptsetup/README.Debian.gz に書いてある手順では「/etc/initramfs-tools/root/.ssh/id_rsa」という秘密鍵の方をコピーするようになっているので、安全にコピーできるのなら、秘密鍵をコピーして、それを使ってログインするのでも良さそう。

ここまでの準備が出来たら、起動してパスフレーズの入力待ちになったところに ssh で入って fifo 経由でパスフレーズを入力すれば暗号化ルートデバイスがアンロックされて起動が進むようになる。

$ ssh root@192.168.0.100
# echo -n "pass phrase of root device" > /lib/cryptsetup/passfifo

2009年04月28日(Tue)

[debian] localeの変更

sargeからetchにあげた環境で、

  • 「dpkg-reconfigure locales」でja_JP.UTF-8を追加
  • /etc/default/localeをLANG=ja_JP.UTF-8に変更

してもgdmからログインしてgnome-terminalを開いてlocaleコマンドの出力をみてみるとja_JP.eucJPのままということが起きている環境があった。

「cat -A /proc/$(pgrep gnome-session)/environ」のような感じでgnome-sessionの環境変数もみてみると、これもja_JP.eucJPになっていたので、gdmがあやしいと思って調べてみるとgdmでログイン時に覚えているのがeucJPになっていたのが原因だった。 そこでシステムのデフォルトに変更して解決した。


2009年04月29日(Wed)

[rails] rel="canonical"

rails 2.3.2 で application_controller.rb に

  def set_canonical_url
    @canonical_url = url_for(params.merge({:only_path => false}))
  end
  before_filter :set_canonical_url

を追加して、application.html.erb に

<%- if @canonical_url -%>
  <link rel="canonical" href="<%=h @canonical_url %>" />
<%- end -%>

を追加して rel="canonical" に対応してみた。

application.html.erb で直接

<link rel="canonical" href="<%= url_for(params.merge({:only_path => false} %>" />

にしていないのは、params が途中で書き換えられていると困るのと、途中で「@canonical_url = false」のように無効にしたり、別途定める URL に正規化出来るようにするため。


copyright © 2001-2013 ZnZ
Key fingerprint = 6E14 2C9C DBD7 874D 8B3C CAA8 9B58 5538 ED7E 1B73