d.sunnyone.org
sunnyone.org

ページ

2012-05-24

gitレポジトリのテキストファイルがWikiになるGititのインストール


プレーンテキストなファイルで保存されるWikiでモダンなものがないかなーと思ったら
Gitをバックエンドに使ったプログラマ向きWiki - Gitit を見つけたので、Gititを Debian squeezeにインストールしてみた。

最初は記事の通り入れようと思ったんだけど、cabal installでエラーになり失敗。
検索してみると、
もしかしたらコンパイラが古いのではとGHCについて検索してみると、yumでインストールしたものは6.12.3で、http://www.haskell.org/ghc/ にある最新版は既に7.4.1になっていました。
さくらVPS(CentOS6)にGititをインストール

とのことなので、ビルドの依存パッケージを入れようとしたが、apt-cache searchしてたらgitit自体のパッケージがあることが判明。
# apt-get install git
# apt-get install gitit
でインストール完了。

 あとは、
$ mkdir gitit
$ cd gitit
$ gitit --print-default-config > gitit.conf
$ gitit -f gitit.conf
 とすれば、とりあえず5001ポートで立ち上がるので、http://localhost:5001/で試すことができる。

 デフォルトでは、gitit/wikidataがレポジトリとなり、ページを作成すると、ページ名.pageというテキストファイルができる。ページの名前に/を入れてページを作れば、ディレクトリができる。日本語のページ名にすれば、日本語のファイル名ができる。UTF-8だったので、普通にlsで見れる。すごく幸せな感じ。

Webから変更するときに、変更内容を入力するが、これはコミットメッセージになる。

なお、フォーマットはデフォルトではMarkdown. reSTなどいくつかの形式に変更できる。

デーモン化

 gititは(デフォルトでは?)フォアグラウンドで立ち上がるので、runitでデーモン化した。Debian的には、start-stop-daemonを使えばいいと思う。

 いつもの通り、適切な場所に"run"ファイルを作ってあげればおしまい。

(runsvdir対象ディレクトリは~/service, ログディレクトリは~/var/log/gititとする)


 これでサービス化完了。

Apacheで受け付ける

Wiki自体に認証をかけたかったので、5001の前にApacheを立てる。


リンクに含まれるパスを調整する方法がわからなく、mod_proxy_htmlを使うのもなんだったので、VirtualHostで作った。適当なVirtualHostの設定を/etc/apache2/sites-available以下に置いて、a2ensiteで有効化した。

BASIC認証のユーザを使う

デフォルトではGititは自前のフォームで認証するため、BASIC認証とかぶってしまう。そのため、gigit.confを変更して、Apache側で認証したユーザ名を使えるようにする。
~~~
authentication-method: http  #formから変更
~~~

ついでにトップページのファイル名もFront PageからFrontPageに変えてしまった。
~~~
front-page: FrontPage

no-delete: FrontPage, Help
~~~

これで完了。






2012-05-07

掛け時計を修理する(ムーブメントの交換)

全くITとは関係ないのだが、GWに時計の修理をしてノウハウっぽいものが若干たまったのでブログに載せる。

家にある壁掛け時計が壊れてしまった。前々から兆候はあり、たまに止まる現象が発生していた。入れていた電池がひどく液漏れしていたので、同じ現象が発生し、電池に負荷を与え続けながら最期を迎えたのだと思う。

新しい時計を買ってきて壊れた時計は捨ててしまえば良い話なのだが、おそらく10年、もしかすると20年以上使い続けている時計なので、修理を試みることにした。
(修理といっても、時計についているムーブメントを交換してしまうので、別物といってもいいのだけど...)

ムーブメントは通販で買えるようだったが、実物を比較しながら買いたかったので、東急ハンズに買いに行った。買ってきたムーブメントが以下である。


ちなみに、このムーブメントは、掛け時計の場所には置いていない。ジャンル分けを聞いたわけではないので確実ではないが、ハンズに売っているのは、自作の時計を作るためのもののようなので、クラフト用品という扱いで、そのフロアにあるのだと思う。2012/5/2時点では、新宿のハンズでは7Fにあった。

<ムーブメント購入時の注意点>

このムーブメントだが、買う際にチェックすべきポイントがいくつかある。
  1. ステップ式(カチカチと動くタイプ)か、スウィープ式(なめらかに動くタイプ)か
  2. ネジ部分(下図青線部分)が必要かどうか(組み込み式かどうか)
  3. 突起部分を通す穴の幅(下図黄色線部分)
  4. 突起部分の高さ(下図赤線部分)
  5. 針が適合するかどうか




1. ステップ式(カチカチと動くタイプ)か、スウィープ式(なめらかに動くタイプ)か

これは好みの問題なので、好きなほうを買えばいいのだが、2種類あることは知っておく必要がある。

2. ネジ部分が必要かどうか(組込み式かどうか)

今回購入したムーブメントは、突起部分の一番下についているネジと、時計板の穴にセットした金具をネジ止めすることにより固定するタイプである。

しかし、今回修理対象となった時計がそうなのだが、時計板裏面に切欠があり、ムーブメントをひっかけて止める時計がある。

Webによると前者が一般的なようである。後者は「組込み式」と呼ぶらしい。
http://item.rakuten.co.jp/watchparts-okayama/10000725/

ムーブメント側がネジ止めするタイプで、時計側がひっかけて止めるタイプであっても、ムーブメントにひっかける部分があれば止めることができる。そのため、今回は特に問題にならなかった。しかし、ひっかけて止めるタイプの場合、ネジ止めする金具が不要のため、3.で記載する穴が狭く設計されていて、幅が足りない可能性があるので、注意が必要である。

3. 突起部分を通す穴の幅

時計板の真ん中に空いた穴よりも、突起部分の幅のほうが大きいと、ムーブメントを取り付けられない。そのため、穴の幅は測ってからムーブメントを買いに行くべきである。
(どうしてもつけたい場合は、時計板の穴を大きくするという方法もあるが。)

4. 突起部分の高さ

突起部分の高さはとても重要である。低すぎると時計板を通らないし、高すぎると時計のカバーに当たってしまう。

5. 針が適合するかどうか

ムーブメントの突起に針の根元の穴を押し込んで止める形になるので、ムーブメントと針が適合していないと、針を差し込むことができない。

今回はまってしまったのだが、もともとの時計についていた秒針が今回購入したムーブメントとあわず、針の穴の奥まで差し込むことができずに、秒針が高く(図の緑線)なってしまい、時計のカバーをかけることができなくなってしまった。

そのため秒針は、再度ハンズに行き、このメーカーの、元の時計と似たようなデザインのものを購入し、交換した。

<交換作業の注意点>

適合するムーブメントを購入することができれば、あとは交換するだけなのだが、1点だけ注意点がある。

それは、針をセットするときは、すべての針を12時に揃えてセットすることである。

これをしないと、長針が0分なのに短針は4時と5時の真ん中を示している、といった読み取れない時計が出来上がってしまう。
(上記を一度やってしまい、プログラマが一度ははまる、テトリミノが壁を突破するテトリスを作ってしまった気分になった。)

<まとめ>

秒針が刺さらないというアクシデントはあったが、無事に交換することができた。
出費は、ムーブメントが1,500円くらい、針が400円くらいである。
Web情報だが、作業を時計屋さんにお願いすると、4桁円台後半のようであった。調査やら作業の手間、なにより部品適合のリスクを考慮すると、妥当な金額と思える。
安い時計であれば買い換えてしまえば良いし、高い時計であれば修理を依頼したほうが良いと思うので、ムーブメント交換は趣味の範囲かもしれない。

なお、100円ショップで買ってきた時計のムーブメントと交換するという技をよく聞くが、上述のようなハードルがあるので、対応する時計を選択することは難しいかもしれない。100円なのでダメだったら捨てればよいという考えもあるかもしれないが、注意が必要である。


<蛇足>

時計の修理とは違う方向になるが、電波時計のムーブメントや、逆方向に動くムーブメント、24時間で1周のムーブメントといったものもあった。自作時計という意味では面白いかもしれない。

2012-03-31

最近読んだ本

最近の興味の方向性ってなんだろうと思ってAmazonで技術書の購入履歴を抜き出してみた。
新しい順。
  • 要点解説 IPルーティング入門 / 久米原 栄
  • Cisco WAN 実践ケーススタディ  / 土屋 師子生, et al
  • RailsによるアジャイルWebアプリケーション開発 第4版 / Sam Ruby, et al
  • 作りながら学ぶOSカーネル―保護モードプログラミングの基本と実践 / 金 凡峻
  • レガシーコード改善ガイド (Object Oriented SELECTION)  / マイケル・C・フェザーズ, et al
  • Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)  / 小山 浩之
  • PostgreSQL徹底入門 第3版 / 笠原 辰仁, et al
  • 新版 プロとして恥ずかしくないWEBデザインの大原則 (インプレスムック エムディエヌ・ムック)  / MdN編集部
  • 継続的インテグレーション入門 開発プロセスを自動化する47の作法 / ポール・M・デュバル, et al
  • SpringによるWebアプリケーションスーパーサンプル 第2版  / 株式会社クロノス 阪田 浩一
  • 開発のプロが教える標準Django完全解説―Webアプリケーションフレームワーク (デベロッパー・ツール・シリーズ)  / 増田 泰, et al
PostgreSQLが出てきたあたりからおかしくなってきたことが読み取れる…。
一部読んでないものがあるけど(レガシーコード~読み忘れてた)、だいたいよかったので、読みたい方向性のものがあればおすすめ。

2012-03-12

SheevaPlug復旧の巻(debootstrapによる環境構築とSDカード向け設定)

前エントリの通り、SheevaPlugの/だったSDカードが壊れてしまったので、構築しなおすことにする(muninで監視情報を書き込み続けたらそれは壊れるよな、と思いつつ同じ環境を作る)

<準備>
・armelなDebianの入ったデバイス
・SDカードリーダ/ライタ
・SDカード(以下では16GBを利用)

1. パーティション作成
普通にパーティションを切る(以下では/dev/sdbにつながったと想定)
# fdisk /dev/sdb
 以下のように作った。
/dev/sdb1 100M  (/boot用)
/dev/sdb2 10G  (/用)
/dev/sdb3 1G  (swap用)
/dev/sdb4 残り (/home用)

2. ファイルシステム作成
# mkfs.ext3 /dev/sdb1
# mkfs.ext4 -O ^has_journal /dev/sdb2
# mkswap /dev/sdb3
# mkfs.ext4 -O ^has_journal /dev/sdb4
 どうやらSDカードではext4が速いらしいので、/boot以外に採用。
 そしてジャーナルなしが速いらしいので、ジャーナルは無効化する。
電源断に備えても、書き込みが増えて壊れては意味が無いしね。
 /bootはU-Bootが読めなかったら困るので、ext3のままにしておく。
# tune2fs -l /dev/sdb1 | grep features
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super
# tune2fs -l /dev/sdb2 | grep features
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
 has_journalがなくなっていることを確認。

3.  debootstrap
debootstrapで初期環境を作る。同一アーキテクチャなので、--foreign と--second-stageに分割する必要はない。
# mount /dev/sdb2 /mnt
# debootstrap --arch=armel --include=linux-image-2.6-kirkwood,module-init-tools,udev,netbase,net-tools,ifupdown,iproute,whiptail,vim-basic squeeze /mnt http://ftp.jp.debian.org/debian/
4. 諸設定
# cd /mnt 
(ファイルシステム設定)

# vi etc/fstab

~~~
#              
proc            /proc           proc    defaults        0       0
/dev/mmcblk0p2 /               ext4    errors=remount-ro,commit=21600,noatime 0       1
/dev/mmcblk0p1 /boot           ext3    defaults        0       2
/dev/mmcblk0p3  none           swap    sw              0       0
/dev/mmcblk0p4 /home           ext4    defaults        0       2
tmpfs          /tmp tmpfs defaults 0 0
~~~
(ホスト名設定)
# echo myhost > etc/hostname
(ネットワーク設定)
# vi etc/network/interfaces
~~~
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
  address 192.168.1.100
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.254
  dns-nameservers 192.168.1.254
  dns-search localdomain.local
~~~
 (コンソール設定)
# vi etc/inittab
一部編集
~~~
##1:2345:respawn:/sbin/getty 38400 tty1
##2:23:respawn:/sbin/getty 38400 tty2
##3:23:respawn:/sbin/getty 38400 tty3
##4:23:respawn:/sbin/getty 38400 tty4
##5:23:respawn:/sbin/getty 38400 tty5
##6:23:respawn:/sbin/getty 38400 tty6
T0:2345:respawn:/sbin/getty -L ttyS0 115200 linux
~~~

てな感じ。

5. おまじない
/etcにあまり書かないようにする。
# ln -s /dev/null etc/blkid.tab
# ln -s /proc/mounts etc/mtab

作っているホストのNIC情報でeth0が固定されてしまうっぽいので、消しておく。
# echo > /etc/udev/rules.d/70-persistent-net.rules
あまり書かないように設定。
# vi etc/sysctl.conf
~~~追記~~~
vm.dirty_background_ratio = 30
vm.dirty_ratio = 60
vm.dirty_expire_centisecs = 500000
vm.dirty_writeback_centisecs = 600000
~~~
6. パスワード設定
# chroot /mnt /bin/bash
# passwd root
7. ブートイメージの作成
chrootの流れで。
# apt-get update
# apt-get install uboot-mkimage
# cd /boot
# mkimage -A arm -O linux -T kernel  -C none -a 0x00008000 -e 0x00008000 \
  -n Linux-2.6.32-5 -d vmlinuz-2.6.32-5-kirkwood uImage
# mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 \
  -n initramfs -d initrd.img-2.6.32-5-kirkwood uInitrd
8. リブート
終わったらいよいよSDカードを差してリブート。U-Bootのカウントダウンで止める。

9. U-Boot環境変数設定
printenvして、期待する値になっていなかったら、以下のようにセットしてしまう。

Marvell>> setenv bootargs_mmc 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw'
Marvell>> setenv bootcmd_mmc 'mmcinit; ext2load mmc 0:1 0x01100000 /uInitrd; ext2load mmc 0:1 0x00800000 /uImage'
Marvell>> setenv bootcmd 'setenv bootargs $(bootargs_mmc); run bootcmd_mmc; bootm 0x00800000 0x01100000'
Marvell>> printenv
Marvell>> saveenv

終わったらbootする。

10. 起動後設定
# date
Thu Nov  5 21:59:39 UTC 1908
さすがにおかしすぎる・・・いったん設定する
# date 031100592012
dateコマンドでセットするときはmmddHHMMyyyyなんだよね。

あとはいつもの感じで設定。
(ロケール設定)
# apt-get install locales
# vi /etc/locale.gen
~~~
ja_JP.UTF-8 UTF-8
~~~
# locale-gen
(スタンダードパッケージをインストール)
# tasksel install standard
(タイムゾーン設定)
# dpkg-reconfigure tzdata
→Tokyo
あとはお好みでsudoを入れたり、openssh-serverを入れたりすれば使えるようになる。

【参考】
http://blog.bofh.it/debian/id_265
http://www.cyrius.com/debian/kirkwood/sheevaplug/install.html
http://d.hatena.ne.jp/yamanetoshi/20090114

Linuxのddで処理状況を定期的に出力する

SheevaPlug につないでいたSDカード(16GB)が壊れてしまったっぽいので、まずはddの丸ごとコピーで復旧を試みる(べつに再インストールしても良いのだが)

# dd if=/dev/sdb of=siva1.bin bs=4096 conv=sync,noerror
これだと進行状況が見えないが、LinuxのddはSIGUSR1をぶつければ終了時に出てくるアレが表示される。なので、whileで送り続ければ、一定間隔で状態を表示できる。
# while true; do sudo kill -USR1 [PID] ; sleep 10; done
しばらくの間10秒間ごとに進行状況を表示していたが・・・
dd: reading `/dev/sdb': Input/output error
1714494+126135 records in
1840629+0 records out
7539216384 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s
dd: reading `/dev/sdb': Input/output error
1714494+126136 records in
1840630+0 records out
7539220480 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s
dd: reading `/dev/sdb': Input/output error
1714494+126137 records in
1840631+0 records out
7539224576 bytes (7.5 GB) copied, 674.537 s, 11.2 MB/s

 ・・・(以下最後まで)
だめだー。



よく知らないARMデバイスのU-Boot環境変数を読む

U-Bootはブートローダ。x86では似たようなことを違うUIでBIOSが担うのであまりピンとこないが、SPARCを使ったことある人なら、OpenBootのプロンプトを思い浮かべてもらえばピンとくると思う。

U-Bootの設定情報を維持している、U-Bootの環境変数を見るには、U-Bootを実行している間にprintenvすれば表示できるのだが、シリアルにアクセスできないデバイスを持っている人もいるはず。そこで、ここではOS(Linux)上から見る方法を取り上げる。

【正攻法】
fw_printenvというコマンドがあるので、これを使う。
1. インストール
  # apt-get install uboot-envtools

2. 設定
どこからか機器依存なデバイス情報を拾ってきて、/etc/fw_env.configに書く。
以下、SheevaPlugの場合:
 /dev/mtd0 0xa0000 0x20000 0x20000
ちなみに0xa0000でない場合もあるらしい。

3. 実行 
$ sudo fw_printenv
CASset=min
MALLOC_len=1
autoload=no
baudrate=115200

~~~
 簡単。

【邪道な方法】
アドレス情報がわからなかったり、ソフトをインストールできないデバイスを持っている人もいると思う。そういう場合でも、読むだけならできる。
 
1. mtdデバイスを探し出す
$ ls  /dev/mtd*
/dev/mtd0    /dev/mtd1    /dev/mtd2    /dev/mtdblock0  /dev/mtdblock2
/dev/mtd0ro  /dev/mtd1ro  /dev/mtd2ro  /dev/mtdblock1
 mtd0~mtd2があるようなので、mtd0でチャレンジ。

2. mtdデバイスの中身を吸い出す
$ dd if=/dev/mtd0 of=~/mtd0.bin

3. odで開始アドレスと終了アドレスを探し出す
$ od -Ax -c mtd0.bin | less
これで、「c   o   n   s」など、環境変数に設定されていそうな値を適当に入力して、値が入っている場所を探し出す。


終わりは\0が続いているだけなので簡単。

4. \0区切りで分割する
見ての通り、\0で区切られてASCII文字が格納されているだけなので、開始アドレス~終了アドレスのデータを取り出して、\0で分割して出力してあげれば終わり。
$ ruby -e 'ARGF.seek(0xa0004); buf=ARGF.read(0xc0000-0xa0004); puts buf.split(/\0/)' mtd0.bin
CASset=min
MALLOC_len=1
autoload=no
baudrate=115200
bootargs=console=ttyS

 ~~~

CRCがあるようなので、間違っても書こうとはしないこと。

2012-03-11

LinuxでAdvanced Format Technology (AFT) な3TB HDDのパーティションを切る

切ってしまったあとに、こういうことを気にしないといけないと気づいたが、partedがどうもよろしくやってくれたらしい。

<切り方>
# parted /dev/sdb mklabel gpt
# parted /dev/sdb mkpart primary 1 1026 ←partedのデフォルトは単位MB
# parted /dev/sdb mkpart primary 1026 17410
# parted /dev/sdb mkpart primary 17410 17411
# parted /dev/sdb mkpart primary 17411 17412
# parted /dev/sdb mkpart primary linux-swap 17412 18436
# parted /dev/sdb mkpart primary 18436 274436
# parted /dev/sdb mkpart primary 274436 -1s
Warning: You requested a partition from 274GB to 3001GB.                
The closest location we can manage is 274GB to 3001GB.
Is this still acceptable to you?
Yes/No? yes
 <確認>
# parted /dev/sdb "unit s" print
Model: WDC WD30 EZRX-00MMMB0 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/512B  ←4096に見えているわけではなさそうだが・・・
Partition Table: gpt

Number  Start       End          Size         File system     Name     Flags
 1      2048s       2002943s     2000896s     ext3            primary      ←2048
スタートなのでOK(2048 % 8 = 0)
 2      2002944s    34002943s    32000000s    ext4            primary  ←2002944 % 8 = 0
 3      34002944s   34004991s    2048s                        primary       ←以下同様
 4      34004992s   34007039s    2048s                        primary
 5      34007040s   36007935s    2000896s     linux-swap(v1)  primary
 6      36007936s   536008703s   500000768s   ext4            primary
 7      536008704s  5860533134s  5324524431s  ext4            primary
 ちなみにpartedのバージョン(Debian/squeeze/armel):
$ dpkg -l parted | grep "^ii"
ii  parted                           2.3-5                        The GNU Parted disk partition resizing program