Macports での PostgreSQL インストール方法

盛大にはまったのでメモ。

sudo ports install postgresql90
sudo ports install postgresql90-server

distpath=/opt/local/var/db/postgresql90
dbpath=${distpath}/defaultdb
# このパスはバージョンによって違うので適当に修正
samplepath=/opt/local/var/macports/software/postgresql90/9.0.2_0/opt/local/share/postgresql90

sudo mkdir -p ${dbpath}
sudo chown postgres:postgres ${distpath}
sudo chmod -R 700 ${distpath}
sudo chown postgres:postgres ${dbpath}
sudo chmod -R 700 ${dbpath}

cd /tmp
sudo -u postgres /opt/local/lib/postgresql90/bin/initdb --encoding utf-8 ${dbpath}

# 起動
sudo port load postgresql90-server

何かあったら /opt/local/var/log/postgresql90/postgres.log を見る

Kindle 3.0.3 感想とアップデート手順

なんかアップデートがあったので適用してみる次第。対象は Kindle 3。

http://www.amazon.com/gp/help/customer/display.html/ref=hp_navbox_top_kindlelg?nodeId=200529700

結果としてはなんかカーソル移動が速くなった!これだけでも随分快適。

それと(体感だから勘違いかもしれないけれど)カーソルを合わせて辞書の単語プレビュー?が速く表示されるようになり、またページ切り替えも速くなったと思う。E-Inkの書き換え速度自体は変わらない筈だけれど、多分ボタン押した時の反応がよくなったのだろうな。

以下は自分がやった手順のメモ。上のURLに記述してある内容と大体同じです。手順が正しいかの保証なんて絶対しないので自己責任でどうぞw*1

バージョンの確認の仕方

Home > Menu > Settings で画面下部に出てくる。いま自分のみたら 3.0.2 だった。現時点の最新は 3.0.3

アップデートファイルのダウンロード

Kindle の種類によってアップデートファイルが違う。Kindle Wi-fiKindle 3G(Free 3G + Wi-Fi) - U.S. and Canadian と Kindle 3G(Free 3G + Wi-fi) - European Customers の三種類。で、どのタイプかはシリアルナンバーがどの番号から始まるかで確認できる。

Home > Menu > Settings 画面の Device Info にある。

シリアルナンバーが B008 で始まるのが Kindle Wi-fi、B006 で始まるのが Kindle 3G(Free 3G + Wi-fi) - U.S. and Canadian、B00A で始まるのが Kindle 3G(Free 3G + Wi-fi) - European Customers。

で、上記のURLから適切なアップデートファイルをダウンロードする。

アップデートの実施

Kindle と PC をUSB結線し、ダウンロードした更新ファイル(自分の場合は Update_kindle_3.0.3_B006.bin。種類によって名前違うはず)をKindle のトップディレクトリにコピー。

Kindle を PC から外して Home > Menu > Settings > Menu > Update Your Kindle をぽちっとな。確認ダイアログが出るので OK を押す。

アップデートが開始されるので少々待つ。少ししたらリスタートされる。このアップデートプロセス、リスタート後もまた続くので注意。何か長そうだったので俺はここで風呂へw

最後に、 "Your Kindle is Updating" と表示されるらしい。お風呂いってたのでこれは見ていないw

*1:とはいえ、間違いがあったら直すので教えてくださいw

Mac OS X 10.6 Snow Leopard で openldap をセットアップする手順(with MacPorts)

MacPorts 経由での openldap 利用は、ビルドまでは上手くいくのだけれど、簡単に利用できるところまではいかず、はまりどころが多い。特に launchd の配下で動かすところとかに試行錯誤があったので手順をまとめ。

試行錯誤のログはこちらで記述。尚、XcodeMacPorts はインストール済みであることを前提にする。

openldap のインストール

これは簡単。

sudo port install openldap

これで終了。インストール後に port load しろとか書かれるけれども、これは無視する。その間にやる事がある。

設定ファイル等の準備

MacPorts 経由の openldap インストールはデフォルトの設定ファイル等をしない。これは CentOS 等でも同じ。従ってこちらで準備してあげる必要がある。

$ sudo cp /opt/local/etc/openldap/slapd.conf{.default,}

ldap ユーザが設定ファイルを読み込めるようにパーミッションも変更する。

$ sudo chown root:ldap /opt/local/etc/openldap/slapd.conf
$ sudo chmod 740 /opt/local/etc/openldap/slapd.conf

ついでに rootpw も必要に応じて変更する。

$ sudo vi /opt/local/etc/openldap/slapd.conf

起動スクリプトの修正

どうも起動スクリプトに不具合があり、このままでは launchd 経由では起動できない。これを修正する。対象は /opt/local/etc/LaunchDaemons/org.macports.slapd/slapd.wrapper で、起動時のコマンドとして以下のような記述がある。

/opt/local/libexec/slapd -u ldap -f /opt/local/etc/openldap/slapd.conf

これに追加で -g daemon という記述を追加して保存する。

$ sudo vi /opt/local/etc/LaunchDaemons/org.macports.slapd/slapd.wrapper

ログの設定

slapd のログは syslog の local4 ファシリティに出力される。デフォルトでこれは存在しないので、/etc/syslog.conf に以下のように設定してあげる。

local4.*                              /var/log/slapd.log

保存領域の設定

保存領域が適切なパーミッションで設定されないようなので、事前に設定する。

$ sudo chown ldap:ldap /opt/local/var/openldap-data
$ sudo chown ldap:ldap /opt/local/var/openldap-data
$ sudo chmod 700 /opt/local/var/openldap-data

あと、DB_CONFIG も作成しておく

$ sudo cp /opt/local/var/openldap-data/DB_CONFIG{.example,}
$ sudo chown ldap:ldap /opt/local/var/openldap-data/DB_CONFIG

設定ファイルのロード

ここでようやく設定ファイルを launchd にロードする。

$ sudo port load openldap

ロードが完了すると起動がはじまるよ!

この時点で Firewall から「接続を許可しますか?」等の問い合わせがある。適切に対応してくだちい。自分はとりあえず拒否にしたけれど localhost からの接続には問題ないみたい。

停止と起動の制御

デフォルトの plist では、プロセスが停止したらすぐ起動するような設定になっている様子。

多分 plist を適切に変更すれば対応できるのだと思うんだけれど、上手く行かない。まぁがっつり止めたければ sudo port unload openldap すればよい(ぇー

結果的に再起動は sudo launchctl stop org.macports.slapd すれば可能。

参考

Mac OS X 10.6 (Snow Leopard) での開発環境構築ログ (MacPorts + Ruby + Vim)

MacBookAir を購入したので RVM で Ruby を動かせるようにする辺りまでのログ。

Mac いじるのは初めてなので、作法が違っていたり間違っているところあるかも。

KeyRemap4MacBook

実は間違えて日本語キーボードの方を購入してしまったので再マッピングが必要にw
色々探して KeyRemap4MacBook が使えそうなのでこれをインストール。

Use Japanese Keyboard as ASCII Keyboard にチェックを入れて終わり。

Xcode のインストール

初期状態では開発用のコマンド類が用意されていないそうな。

なので、Xcode という開発ツールをインストールする。Xcode はインストールCDにも含まれているとの事だったが古いバージョンであったりするので公式サイトから落としてインストールするのがお勧めとのこと。

Mac Dev Center でアカウントを作り、Xcode をダウンロード。

自分の環境では特に何事も無く、普通にインストールして終了。

MacPorts のインストール

Mac OS X は随分原始的なコマンド類しか準備されていないようなので、それらを補完するパッケージャなどのインストールが必要。いわゆるOSS系のアプリもこれで管理する。

今回は柔軟性の高そうな MacPorts を採用。コンパイルオプションを指定する枠組みがあるのが採用ポイント。 CentOS とかでは(つまりRPM)ではこれが無いためにソースからコンパイルしなければならない事が多く、不便だった。

MacPortsサイトから dmg をダウンロードし、マウント後に pkg を開いてインストーラ経由で普通にインストール。シェル変数の設定もしてくれるし、selfupdate (MacPorts 自身と、MacPorts が利用するパッケージ情報の更新)も自動で行ってくれる。この更新作業のために少し時間がかかるけれど、正常な挙動なので焦らなくてよい。

正常にインストールが終了したらインストールはOK。

MacVim のインストール

(2011/2/24 MavVim は MacVim-Kaoriya を使うことにした)

ターミナルを起動。既にターミナルを起動済みの場合は .bash_profile が書き変わっているので source ~/.bash_profile するかターミナルを再起動する。

vim-app は 10.6 (Snow Leopard) では対応していない。MacVim が Mac OS X での GUI 上の Vim を提供している。

MacVim は日本語にも対応している様子。適切な Variants を設定してインストールを行う。個人的にはインタプリタ組み込みは使っていないので不要。機能として不足があっては困るので、huge オプションはつけた。

  sudo port install MacVim +huge

コンパイルするので結構時間かかります。しばし待つ。

次にコマンドライン用の vim をインストールする。こっちも huge。

  sudo port install vim +huge

Ruby の準備

Mac OS X には Ruby 1.8.7 がデフォルトでくっついている。これをどう扱うかなんだけど、開発用は開発用として分けて考えておきたい。とはいえ、まぁ、rvm あるしわざわざ別にインストールする必要はなかろうという判断。従って rvm をインストールする。

  sudo gem install rvm
  rvm-install
  echo >> ~/.bash_profile
  echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"  # This loads RVM into a shell session.' >> ~/.bash_profile

今回は Ruby 1.8.7 と 1.9.2 を入れておきたいので両方インストール。

  rvm install ruby-1.9.2
  rvm install ruby-1.8.7

とりあえず 1.9.2 を利用するようにしておく

  echo 'rvm use ruby-1.9.2' >> ~/.bash_profile

rails.vim

最後に MacPortsrails.vim をインストール。

  sudo port install rails.vim

残った謎

  • 最初はターミナルに日本語を入力できなかったのに、知らないうちに入力できるようになってしまった。原因はよくわからずw

Perl の文字コード取り扱い周りのメモ

(2010/11/19 追記)後半が切れてしまっていたのを修正

perl の 5.8 以降では内部用のテキスト文字列とバイト文字列が区分けされている。テキスト文字列は文字集合 Unicode で形成されている。バイト文字列は内部用のテキスト文字列以外の文字列を示す。

テキスト文字列は Perl が内部で文字を扱うためのエンコーディングとして作用する。他のエンコーディングに変換するための中間形式としてとらえても良い。 Perl では、ソースコード上の文字列は全てこのテキスト文字列として取り扱う。

(自分の理解では)従って、テキスト文字列でない文字列は、Perlから見れば連続したバイトの並びにしか見えない。length を使ってもバイト数が返るだけで、文字数は計れない。バイト文字列を本来の意味での文字列として扱いたい場合、テキスト文字列にデコードしなければならない。これは Encode モジュールによって行う。

  # UTF-8 の文字列をテキスト文字列に変換する
  $text_strings = decode("UTF-8", $byte_strings);

  # テキスト文字列をバイト文字列に変換する
  $bytes_strings = encode("UTF-8", $text_strings);

尚、内部文字エンコーディング明示的に utf8 を利用する場合には以下のように行う。

 use utf8;

あと PerlIO 層が便利かつ罠があるとの事。ようは use utf8; して :encoding(UTF-8) 使うのが無難って事かな

LDAP の RFC 上ではパスワードを生で保管せよということになっている

前回の日記で以下のように書きました。

ユーザエントリには posixAccount オブジェクトクラスを持たせて userPassword にパスワード文字列を設定します。一般的にパスワード文字列は生のまま保存せず、一方向ハッシュにして保存するというセキュリティ上の作法がよく知られていると思います。
OpenLDAP でも、この方式に対応しています

敢えて OpenLDAP に限定して記述したのは、RFC4519 2.41 では userPassword は暗号化されていないテキストを格納するように記述されているからです*1

Passwords are stored using an Octet String syntax and are not encrypted.

従って他の実装ではどうなっているかはよく解りません。

userPassword にハッシュを格納する実装は、experimental な RFC に記載されています。この内容は RFC4519 に真っ向から違反するもので、つまりハッシュを入れると RFC 違反な実装ということのようです(笑)。OpenLDAP が experimental な RFC の実装を取り入れたのは、確証はありませんがセキュリティのためであることは間違いないでしょう。

また、userPassword に生パスワードを入れても、それで実際に bind できてしまうのでご注意を。

このあたりの話題はOpenLDAP の FAQ に記述されています。詳しく知りたい方はこちらをご参照くださいませ。

*1:正確には、ハッシュは暗号ではないですけどw

ActiveLdap でアカウントパスワードを設定する方法

LDAPLinux 等のユーザアカウントDBとして利用するのが一般的な用途ですが、ユーザたちのパスワード設定する方法をそう言えば書いていませんでした。

ユーザエントリには posixAccount オブジェクトクラスを持たせて userPassword にパスワード文字列を設定します。一般的にパスワード文字列は生のまま保存せず、一方向ハッシュにして保存するというセキュリティ上の作法がよく知られていると思います。

OpenLDAP でも、この方式に対応しています*1 。また、ハッシュアルゴリズムは幾つかの種類が利用できるようになっています。一方でそれ故に、単に userPassword にハッシュサムを入れれば良いという事にはなっていません。ハッシュサムの値を見たところで、その値がどのアルゴリズムによって作られたかは見分けがつかないし、アルゴリズムが特定できない以上はパスワードの検証が出来ないからです。

では、どのようにハッシュサムを userPassword に格納するかですが、実際に見た方が早いでしょう。以下が実際のパスワード設定例です。

# 新しいパスワード(悪いパスワードの例)
new_password = 'hogehoge'

# パスワードのハッシュサムを得る。今回のアルゴリズムは SSHA。
hash_sum = ActiveLdap::UserPassword.ssha(new_password) # => "{SSHA}2HlHGgDB47/vD5+v0k8DhOOcbj9wZ1Zo"

# エントリを取得して、userPassword にハッシュサムを入れて、保存
u = User.find('tashen')
u.user_password = hash_sum
u.save # => true

# bind してみて成功
u.bind(new_password) # => true

見ての通り ActiveLdap::UserPassword がこのあたりの処理を楽にしてくれます。セキュリティ上の理由からして、今のところお勧めアルゴリズムは SSHA です。

include ActiveLdap::UserPassword

ssha "hogehoge" # => "{SSHA}1eMI336vCgcPUI1hc+9IpLCVa0hHUVZS"
smd5 "hogehoge" # => "{SMD5}M8F+FUSKpVMHWrw5I+FBSHM5V2Y="
sha "hogehoge" # => "{SHA}OyxsENDngHLRTgLMTFh4FNDxDzo="
md5 "hogehoge" # => "{MD5}MpQ15eZr6AmmVq8QX0JAHg=="

*1:何故 OpenLDAP に限定して書いているかと言うのは後日