2010年9月25日土曜日

[couchDB] CouchDB-1.0.1とSpiderMonkeyをUbuntu 10.4 LTS (Lucid) でコンパイル

最近NoSQL系のバックエンドとして有望株であるcouchDBをUbuntu 10.4上で試している。Ubuntuさんについてくる(apt-getできる)couchDBのバージョンは0.10.0と若干古いので、現段階で最新の1.0.1をビルドする手順を以下にまとめておきます。

1)まずはビルドの基本をインストール


sudo apt-get install build-essential


2)次にJS実行エンジンのSpiderMonkeyをインストール

Ubuntuでビルドするときの手順として、spidermonkeyではなく、xulrunnerを使う方法もあるけど、なんか色々面倒くさい設定などがあるらしいので、SpiderMonkeyを使います。


参考URL: http://wiki.apache.org/couchdb/Installing_SpiderMonkey



ソースの取得


http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz
にあるので、


curl -O http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz
でゲットしておく。


解凍してビルドする
tar xzvf js-1.8.0-rc1.tar.gz
cd js/src/

ちょっと変わったmake方法なので、以下の通りmakeする。
ビルド:
make BUILD_OPT=1 -f Makefile.ref

インストール:

ターゲットは"export"というらしい。
sudo make BUILD_OPT=1 JS_DIST=/usr/local -f Makefile.ref export



ライブラリのパスを通す
make export実行時にコンソールに吐き出された最後の数行で
cp Linux_All_OPT.OBJ/libjs.a /usr/local/lib64
cp Linux_All_OPT.OBJ/libjs.so /usr/local/lib64
cp Linux_All_OPT.OBJ/js /usr/local/bin
(上記は64bit版の場合。32bit版はたぶん/usr/local/lib)と出力されているで、libjs.soの置き場所をld.so.confに追加する。これをしないと、後でcouchdbがうまく動いてくれない。

sudo vi /etc/ld.so.conf.d/spidermonkey.conf
とでもして、以下の内容を書いておく

# Spider Monkey js
/usr/local/lib64

sudo ldconfig
でキャッシュを更新。



念の為確認しておく。
sudo ldconfig -p|grep libjs
libjs.so (libc6,x86-64) => /usr/local/lib64/libjs.so
いたいた。

ここまででSpiderMonkeyのインストールは完了。次にいよいよcouchDBをビルド、インストールする。
ここから先はほぼ
http://d.hatena.ne.jp/z-ohnami/20100729/1280412344
を参考にさせていただきました。多謝。





3)CouchDBのビルドとインストール

依存パッケージのインストール
sudo apt-get install libicu-dev libcurl4-gnutls-dev libtool erlang-dev erlang

couchDBソースの取得
http://couchdb.apache.org/downloads.html
からリンクされた最新版をミラーから落とす。
curl -O http://ftp.kddilabs.jp/infosystems/apache//couchdb/1.0.1/apache-couchdb-1.0.1.tar.gz



解凍してビルドする。
tar xzvf apache-couchdb-1.0.1.tar.gz
cd apache-couchdb-1.0.1/


今回は/usr/local下にインストールするので、--prefixなどは特にいじっていない。また、SpiderMonkeyを使うので、--with-js-libなど、xulrunner指定箇所は省く。
結局、


./configure
make && sudo make install


でいける。



couchDBを実行するユーザーを作成する。

UbuntuOneがcouchDBを使用している関係で、couchdbというユーザーがすでに存在する可能性があるので、参考URLの通り、couchuserというuserで実行することにする。
以下ほぼまるコピ


sudo adduser --system --home /usr/local/var/lib/couchdb \
--no-create-home -shell /bin/bash --group --gecos \
"CouchDB Administrator" couchuser

所有権とパーミションの修正

sudo chown -R couchuser:couchuser /usr/local/etc/couchdb
sudo chown -R couchuser:couchuser /usr/local/var/lib/couchdb/
sudo chown -R couchuser:couchuser /usr/local/var/log/couchdb/
sudo chown -R couchuser:couchuser /usr/local/var/run/couchdb/
sudo chmod 0770 /usr/local/var/run/couchdb/
sudo chmod 0770 /usr/local/var/lib/couchdb/
sudo chmod 0770 /usr/local/var/log/couchdb/
sudo chmod 0770 /usr/local/etc/couchdb

作成したユーザーで実行するようにcouchDBの設定を変更する
sudo vi /usr/local/etc/default/couchdb

COUCHDB_USER=couchdb
COUCHDB_STDOUT_FILE=/dev/null

COUCHDB_USER=couchuser ←couchuserに変更

以上でインストール完了。
試しに実行してみる。
sudo -u couchuser couchdb

起動したらブラウザで
http://localhost:5984/_utils/
にあるFutonインターフェースを開く。

右側のメニューにある Test Suiteを開いて
Run Allでテストをすべて実行して、すべて動いたらOK




2008年7月25日金曜日

[python]携帯メールからTwitterを更新する

携帯メールからTwitterのステータスを更新したいと思い、ぐぐってみたら俺的にストライクな書き込みを発見してしまった。
そのままでは動かなかったので、最近のPython Twitterに合わせて、ちょっぴり機能を追加したので、公開してみます。



#!/usr/bin/env python

from email.Header import Header, decode_header
import twitter, sys, email

uid = "TWITTER_ID"
pw = "TWITTER_PASSWORD"
from_addr = "KEITAI_EMAIL_ADDRESS" #email account to receive from

data = ""
for line in sys.stdin:
data = data + line

mail = email.message_from_string(data)

#Check for correct from address
if from_addr != mail.get('From'):
sys.exit(0) # Wrong email - ignore

for part in mail.walk():
type = part.get_content_maintype()
if type and type.find("text") != -1:
enc = part.get_charsets()[0] or "us-ascii"
message = unicode(part.get_payload(), enc, "ignore")

message = message.strip()[:140]
api = twitter.Api(uid, pw)
status = api.PostUpdate(message)



オリジナルからの変更点は:
- from_addrの追加。携帯のメールアドレスを入れておくと、このアドレスから受信した時のみ、Twitterに更新をかける。
- messageをstrip()して最大140文字までとした -> Twitterの仕様です。
- api.PostUpdate()の呼び方をpython-twitter0.5に合わせた。

参考:
元ネタ(mojo.jp/blogさん)
python-twitter

動作確認環境:
Ubuntu Hardy Heron Server + postfix

2008年7月3日木曜日

[Ubuntu]ssh経由でDapperサーバーをHardyにアップグレードしてみる

5年サポートのUbuntu LTSがDapper(6.06) -> Hardy(8.04)にアップグレードされたので、うちのサーバーもアップグレードすることにした。すべてワークステーションからssh経由でやってみる。

どのようなアップグレードでも同じなのだが注意点を:

1) なによりも真っ先にバックアップを取ること!バックアップを取ること!
もう一度言うよ。バックアップを取ること!そして、正常にリストアできることを試すこと!
tarとsshでバックアップを取る方法も参考までに。

2) なぜアップグレードするのかを明確にしておくこと。 -> 必要の無いアップグレードはしない方がいいですよ。

3) 事前に新しいシステムをよく調べておくこと。 -> サーバー(デーモン)のバージョンによっては挙動が変わったり、今まで動いていたサービスが動かなくなったりする可能性があるので、よく調べましょう。

4) 不慮の事故にも対応できるように、万全の体制で挑むこと。 -> 時間、ホットスワップできるサーバー器の純美も含め心にゆとりを持っている方が断然スムーズにいきますよ。

5) 以下に示すやり方はうちでは成功したので、あなたの環境でうまくいくとは限らない。つまり、このやり方で失敗しても、私は一切責任を取りませんよ、ということを理解すること。 -> つまり失敗しても泣かないこと。

ま、アップグレードは計画的にね!ということでお願いします。自己責任ですから。

というわけで、手順の説明をしていきます。

1) Dapperを最新のバージョンに更新しておく


sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade


これはカーネルも含めて更新します。気をつけてね。
カーネル更新したひとは、再起動しておきましょう。


2) update managerをインストールする

sudo apt-get install update-manager-core


update-managerはサーバー用のアップグレードシステムらしいです。

3) ここから実際のアップグレードがはじまる


sudo do-release-upgrade -d


-dオプションは開発バージョンを引っ張るということらしいのだが、-dオプションなしでは


$ sudo do-release-upgrade
Checking for a new ubuntu release
No new release found


無いよ、と怒られてしまう。ちょっと嫌な感じだが、開発バージョンを引っ張ってくる-dを付けると


$ sudo do-release-upgrade -d
Checking for a new ubuntu release
Done Upgrade tool signature
Done Upgrade tool
Done downloading
extracting 'hardy.tar.gz'
authenticate 'hardy.tar.gz' against 'hardy.tar.gz.gpg'

Reading cache

Checking package manager

Continue running under SSH?

This session appears to be running under ssh. It is not recommended
to perform a upgrade over ssh currently because in case of failure it
is harder to recover.

If you continue, a additional ssh daemon will be started at port
'9004'.
Do you want to continue?

Continue [yN]


Hardyってstableじゃないんか!Intrepidがでたらどうなるんだろという疑問を残しつつも続行。
でもって、色々吐き出してますが、ようはこんな感じのことをいってくる
「sshでやろうとしてるね?あんまりおすすめしないなぁ、失敗したらめんどうだよ。
それでもssh経由やるっていうなら、ポート9004に新しいsshデーモン起動するけど、続けるかい?」
である。
ここはやっぱり、Yでしょw

4) しばし放置
debリポジトリから色々チェックしてるようです。こんなワーニングがでてたけど


WARNING: Failed to read mirror file


ミラー関係のようなので、無視


5) サポート終了したアプリのメッセージを確認しておく


Calculating the changes

Support for some applications ended

Canonical Ltd. no longer provides support for the following software
packages. You can still get support from the community.

If you have not enabled community maintained software (universe),
these packages will be suggested for removal at the end of the
upgrade.

Demoted:
console-common, console-data, evms, evms-ncurses, libasn1-6-heimdal,
libevms-2.5, libgssapi4-heimdal, libkrb5-17-heimdal, liblzo1, libpq4,
libroken16-heimdal, libttf2, reportbug


Demote(オフィシャルからサポートを外されて「降格」)されたパッケージの一覧を吐き出してくれるので、よくチェックしておく。
apt リポジトリのUniverseを使わないと、アップグレードのあとに上記を削除推奨されますよ、と。

6) 本当にやりますか?やっちゃうんですか?


11 packages are going to be removed. 133 new packages are going to be
installed. 299 packages are going to be upgraded.

You have to download a total of 189M. This download will take about
10 minutes with your connection.

Fetching and installing the upgrade can take several hours. Once the
download has finished, the process cannot be cancelled.

Continue [yN] Details [d]


dでなにが削除され、なにが新規インストールされ、なにがアップグレードされるか、をチェックできる。
一応みておいて、

Yでしょw

7) パッケージインストール中のため、しばし放置
もう、後戻りはできません。バックアップとってあるよね?(しつこい)

*これ以降はシステムの設定によって表示されない場合があります。
8)コンソールセットアップ
しばらくすると、Configuring Console setupという画面がでた

キーボードのレイアウトをnational(ローカル=106jpかな?それともFEPというかIMEのことかな?)とLatinレイアウトの変更のためのショートカットを選べと。
キーボードついてないし、sshだし、なんでもいいです、ハイw
デフォルトのalt+shiftにしておきました。

9) libc6の設定
さらにもう少しするとConfiguring libc6という画面。

一覧に表示されているサービスを再起動しますよ、とのこと。
気になるのはsshだが、一覧に無いので、大丈夫そう。念のため手順3で出てきたポート9004のsshdに接続しておくことにする。


$ ssh -p 9004 [サーバー名orIP]


問題なく入れたので、迷わずOK -> サービス再起動が始まる。

10) Configuring libpam0g
次に9と似たような画面がでてきた。

pam認証を使用しているサービスの再起動を行うらしい。sshは無いので、これも迷わずOKしてみた

11) Configuring libssl0.9.8
同様にlibsslにリンクしているサービスも再起動するらしい。sshには影響無とのこと。

OKをすると、再起動するサービスの一覧がでてくる。
ま、大丈夫そうならOKで

**この辺で

perl: warning: Please check that your locale settings:
LANGUAGE = "en_JP:en",
LC_ALL = (unset),


ワーニングなので、無視しておいてもよさそう。perlはこの機械では使わないしね。
一応、あとで 


$ sudo locale-gen
すればよいはずなので、放置。


12) 各種設定ファイルの更新
次に新しくなった設定ファイルの扱いを聞かれる。以下の例はdnsmasq:

Configuration file `/etc/dnsmasq.conf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ? Your options are:
Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : background this process to examine the situation
The default action is to keep your current version.
*** dnsmasq.conf (Y/I/N/O/D/Z) [default=N] ?


Y/I = パッケージメンテナのバージョンで置き換える
N/O = 今までどおりにしておく
D = diff表示
Z = とりあえず飛ばして、あとで設定する

このあたりは慎重にやりましょう。Dでよく確認することをおすすめします。

13) 再起動!
各種設定が終わったら、再起動してみましょう。
sshで入れたら・・・


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.1
Release: 8.04
Codename: hardy


よっしゃ。

あとは、各種サービスの設定を見直して、全て正常に動作するかを確認すること。

2008年6月12日木曜日

[Linux Shell] bashとsedを使ってファイルの拡張子を一括置換する

hoge.htmとかimage.JPGとかをhoge.htmlやimage.jpgなどと、拡張子だけを一括変更する方法。

ファイルの数が少ない場合は普通にmvすればいいのだが、ディレクトリごと一斉置換したい場合は以下のようにする:

例:*.htmを*.htmlに置換する

# for f in *.htm; do mv $f `echo $f|sed -e "s/htm/html/g"`; done

基本的にsedの/htm/html/g箇所をいじればどんな置換にも対応できる。
なのだが、いつもこんな長いコマンドを打ち込むのはめんどうなので、スクリプトにまとめておくと便利。

例えばこんな感じ:

#!/bin/sh
mv $1 `echo $1|sed -e "s/$2/$3/g"`

これをパスの通った場所に適当な名前を保存しておく。今回はmv しながらsedをするので、mvsedという名前を付けてみた。
忘れずに実行権限をつけておく

$ chmod +x mvsed

使用方法は

mvsed ファイル名 現在の拡張子 置換後の拡張子

本当は拡張子だけでなく、ファイル名全体の置換につかえるのだが、今回の趣旨の都合上、拡張子ということにしておいてください ^^;

で、使用方法。
ファイル1個:
$ mvsed hoge.htm htm html
-> hoge.htm を hoge.htmlに変更

一括置換:
$ for f in *.htm; do mvsed $f htm html;done
-> ディレクトリ内の.htmファイルをすべて.htmlに変更する。

いまどき*.htmもあんまり見かけなくなったけど、その辺は気にしなーい。

関連エントリー:ファイル名のスペースをアンダースコアに変換する方法

2007年10月27日土曜日

[Linux Shell] ファイル名のスペースをアンダースコアに変換する方法

"My Report 2007 10 27.txt" を "My_Report_2007_10_27.txt" に変換/リネームする方法。

WindowsやMac, さらには近頃ではLinuxユーザーまでもが、ファイル名にスペースを使用している。たしかに読みやすくて、GUIで使ってる分には全く問題ないのだけれども、シェルで一括操作などを行いたい時ににちょっと面倒臭い。なぜなら、シェルで(半角)スペースを持つファイル名を扱うには、\でエスケープしたり、気づかずxargsに渡してしまい、変な挙動になったりと、色々回り道をしないといけないことが多い。

半角スペースを "_" (アンダースコア) に置換してmvする。
ディレクトリ下のファイル全部。

$ for file in *; do mv "$file" `echo $file | tr ' ' '_'`; done

もちろん、
for file in *; の*を変えると適応範囲が絞りこめる。
例えば、 for file in *.wma; <- Windows Media Playerはスペースが大好きです。

関連エントリー:bashとsedを使ってファイルの拡張子を一括置換する

2007年8月30日木曜日

bashとsedで複数ファイルのテキストを置換する方法

複数ファイルにまたがって同じテキスト置換を行う方法。
例えばディレクトリ内のHTMLファイル全てに対して置換を行いたい場合1個1個ファイルを開いて編集するのは面倒なので、一発で行いたい。


find . -name "*.html" -exec sed -i 's/元テキスト/置換後テキスト/' {} \;

何をしているのか細かく説明すると

find . -name "*.html" -exec
このディレクトリ(.)の中にある名前が*.htmlにマッチするファイルに対して

sed -i 's/元テキスト/置換後テキスト/' {} \;
上書き保存で(-i) 元テキストを置換後テキストに変更する

となる。
ちなみに {} はfindの結果で得た(この場合はhtmlファイルのファイル名)が入るようになっている。

2007年8月27日月曜日

Imagemagickでディレクトリの中の画像を一括縮小する

ホームページなどで写真を公開している場合など、デジカメで撮ったたくさんの写真を一括で縮小(あるいは拡大)したい場合がある。
imagemagickを使えばとっても簡単にできる。

例えば images ディレクトリの画像を全て 500x375にリサイズしたかったら:

$ cd images
$ mogrify -resize 500x375! *.jpg

他にもimagemagickは色々なことがたくさんできる。ここあたりが詳しいかな。