2013年1月14日月曜日

[Redis 2.6]インストールメモ + パスワード設定時の起動スクリプト

明けまくりましておめでとうございます、おもくそです。
最終更新は汗もしたたる真夏、そして内容は今は亡き(失礼!)koboに関して、そして久方ぶりの更新はヤマト運輸がギブするほどの大雪日という現実に、四季が存在する国の素晴らしさを噛みしめております。

そんな新年一発目のエントリに、今年の抱負といった一般的なものではなく技術ネタを持ってくるという自分のことが、好きでもあり嫌いでもあります。まあ今年もこんな感じでマイペースに行こうと思います。

試した環境

Redisは昨年にバージョン2.4を少し使うことがあったのだけど、その時のドキュメントには「バージョン2.6でクラスタ構成できるようになるよ(Redis Cluster)」ってあったけど、正式リリースはまだみたいですね。

ダウンロード、インストール

以下ページの通りに。「make install」しないんだね。あと言わずもがなだけどgcc必要です。
Download – Redis
$ wget http://redis.googlecode.com/files/redis-2.6.8.tar.gz
$ tar xvzf redis-2.6.8.tar.gz
$ cd redis-2.6.8
$ make

起動スクリプト生成

confファイル、ログファイル、起動スクリプトを生成してくれるシェルが同梱されているので、それを実行。Redis本体のバイナリ(redis-server)にパス通して無い場合は、途中でバイナリの実行パスを指定してあげる必要があります。
ところがこのシェル、どうもバグってるっぽいです。詳しくは後述します。まあ僕の環境の問題かもしれないけど・・・もしエラー発生しなかった場合は、エラーが関連している節は読み飛ばしてください。
$ cd utils
# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server


Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
which: no redis-server in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/omokuso/bin)
Please select the redis executable path [] /usr/local/redis/src/redis-server
which: no redis-cli in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/omokuso/bin)
s#^port [0-9]{4}$#port 6379#;s#^logfile .+$#logfile /var/log/redis_6379.log#;s#^dir .+$#dir /var/lib/redis/6379#;s#^pidfile .+$#pidfile /var/run/redis_6379.pid#;s#^daemonize no$#daemonize yes#;
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
./install_server.sh: line 178: update-rc.d: コマンドが見つかりません
 exists, process is already running or crashed
Installation successful!
「update-rc.d: コマンドが見つかりません」だと?
不具合その1。
「update-rc.d」というのは、UbuntuなどのDebian系のコマンドで、自動起動設定を行うものです。CentOSなどRedhat系での「chkconfig」に相当。CentOSで実行したら、見つからないのは当たり前です。

はて、バグか?起動スクリプト生成シェルを確認してみたところ・・・
・・・
#Install the service
echo "Installing service..."
if [ !`which chkconfig` ] ; then
        #if we're not a chkconfig box assume we're able to use update-rc.d
        update-rc.d redis_$REDIS_PORT defaults && echo "Success!"
else
        # we're chkconfig, so lets add to chkconfig and put in runlevel 345
        chkconfig --add redis_$REDIS_PORT && echo "Successfully added to chkconfig!"
        chkconfig --level 345 redis_$REDIS_PORT on && echo "Successfully added to runlevels 345!"
fi
・・・

うーん・・・ちゃんと「『chkconfig』が見つからなかったら」という判定を行ってRedhat系の場合の分岐もあるのけどな・・・chkconfigのパスも通ってるし。何でだろう・・・

とりあえず、判定条件とupdate-rc.d実行部分をコメントアウトし、chkconfigが無理矢理実行されるようにしてから再度実行してみたところ・・・
今度は「サービス redis_6379 は、chkconfig をサポートしていません。」ですって!?
不具合その2。
「redis_6379」ってのは自動生成されたRedisの起動スクリプトです。
chkconfigに登録するには、特定のフォーマットの記述が必要。以下はApacheの起動スクリプトの例です。
$ head /etc/init.d/httpd
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# 以下2項目が必要
# ↓順番に「ランレベル(この例だと未指定だけど)」「起動優先順位」「停止優先順位」
#     優先順位はそれぞれ100未満じゃないとダメっぽい
# chkconfig: - 85 15
# ↓これはただの説明
# description: The Apache HTTP Server is an efficient and extensible  \
#        server implementing the current HTTP standards.
・・・

前述の「サポートしていません」エラーは、上記の記述が無い場合に発生する。
登録対象の起動スクリプトを確認してみると・・・何じゃこりゃぁっ!!
# vim /etc/init.d/redis_6379
#/bin/sh\n #Configurations injected by install_server below....\n\n EXEC=/usr/local/redis/src/redis-server\n CLIEXEC=/usr/local/redis/src/redis-cli\n PIDFILE=/var/run/redis_6379.pid\n CONF="/etc/redis/6379.conf"\n\n REDISPORT="6379"\n\n ###############\n\n

case "$1" in
    start)
・・・

chkconfig登録に必要な記述が無いばかりか、実行コードの一部分が改行されずに冒頭のシバンに連なってしまっている。どうも「\n」をメタ文字じゃなくテキストとして処理してしまっているっぽい。

とりあえず問題の「\n」を改行に変換(正規表現は「%s/\\n/\r/g」)し、chkconfig登録に必要な記述を追加したのが以下。
#/bin/sh
# chkconfig: - 90 90
# description: Redis and Gentlemen!

 EXEC=/usr/local/redis/src/redis-server
 CLIEXEC=/usr/local/redis/src/redis-cli
 PIDFILE=/var/run/redis_6379.pid
 CONF="/etc/redis/6379.conf"

 REDISPORT="6379"
・・・

これでようやく全ての準備が整いました。
起動・停止してみる。
# /etc/init.d/redis_6379 start
Starting Redis server...
# /etc/init.d/redis_6379 stop
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped

そして自動起動設定。
# chkconfig --add redis_6379
# chkconfig redis_6379 on
# chkconfig --list redis_6379
redis_6379      0:off 1:off 2:on 3:on 4:on 5:on 6:off

Redisにパスワードを設定してみたら、停止できなくなった!

Redisは以下のようにパスワードを設定できます。
# vim /etc/redis/6379.conf
・・・
requirepass RedisAndGentlemen
・・・

これにより、各種操作を行う前にauthコマンドによる認証が必要になる。

さて、この状態で先ほど生成した起動スクリプトを実行すると、起動は問題なく行われるのだけど、停止は・・・
# /etc/init.d/redis_6379 start
Starting Redis server...
# /etc/init.d/redis_6379 stop
Stopping ...
(error) ERR operation not permitted
Waiting for Redis to shutdown ...

失敗してしまいます。shutdownコマンドの実行前にauthコマンドで認証通っておく必要あるようだ。

というわけで、起動スクリプトを修正。ちなみに当サンプルではncコマンドを使用するのでインストールしておいてください。

# yum install nc
# vim /etc/init.d/redis_6379
・・・

# パスワード
REQUIREPASS="RedisAndGentlemen"

・・・
    stop)
        if [ ! -f $PIDFILE ]
               ・・・
        else
               ・・・
                # 旧ロジック。こういうのはコミット前に削除しようね!
                #$CLIEXEC -p $REDISPORT shutdown

                # authとshutdownは同一セッションで実行しないといけません
                echo -en "auth $REQUIREPASS\r\nshutdown\r\n" | nc localhost $REDISPORT

                # ちなみに以下はダメ。auth時とshutdown時はセッション異なるので。
                #$CLIEXEC -p $REDISPORT auth $REQUIREPASS
                #$CLIEXEC -p $REDISPORT shutdown
                ・・・

以上。

*

2012年7月22日日曜日

放課後電子波クラブ

kobo買ってました

ブログではAmazonアソシエイト使っておきながら、実生活では楽天メイン(ポイントサービスこっちの方がいいから)である私。その甲斐あってかいつのまにかプラチナ会員になってたってことで実質4980円。スペックとかはちと物足りなく感じたが、まあ電子書籍ことはじめとしてはいいかなと、すぐに飛びつきました。スマホもタブレットも持っていない私が初めて手にした次世代デバイス、その実力は…って、もう至るところでとっくに言い尽くされていますが、僕の場合は…
  1. まず箱から取り出すのに一苦労
    蓋が中々取れんかった。蓋の指入れるスキマがただでさえピッチピチな上、箱自体が固めでスキマ広げにくい。僕は結局ハサミ入れて側面一つ外した
  2. セットアップ時、メルマガ受け取る設定にしないと先へ進めなかった。
  3. とりあえず無料の青空文庫の宮沢賢治や太宰治作品をいくつか入れてみたが、殆どの作品が表紙と奥付(最終ページ)だけで、肝心の中身が無いんですけど…プリインストールの『フランダースの犬』や『源氏物語』さえも。
    しかも奥付の作品名が開いてるのと違うの多数(『銀河鉄道の夜』開いてるのに奥付には『風の又三郎』って表示されてるみたいな)
  4. そもそもデスクトップアプリでライブラリ(入れた本一覧)を確認出来ないってどうなのよ?ていうか2回目以降ライブラリの同期すらできないんですけど…
  5. 内蔵時計のタイムゾーンがデフォルトUTC。言語で「日本語」選択したんだから、JTCに自動設定してくれよ。
  6. Wi-Fi設定のネットワーク入力欄が左側3分の1くらい欠けている。セキュリティ用のマスクか?それなら暗号キーと同じ仕様(チェックボックスで切替)にしてくれよ。
こんなところかな。中にはセットアップすらままならない方もいらっしゃるようで。

とりあえずデスクトップアプリはバージョン3.0.1を使うべし

上記の3, 4はどうもデスクトップアプリの不具合っぽいですね。ダウンロード元が英語サイトの場合、アプリのバージョンは3.0.0なんですけど、こいつがいけないみたいです。英語サイトには、セットアップ時にURLが表示されたのか、公式のFAQから辿ったのか、どうやって辿り着いたが忘れましたが、とにかく「公式」の情報だった筈。今は修正されてるかどうかは分かりません。

と、前置きが長くなってしまいましたが、アプリはバージョン3.0.1を使いましょう。これでライブラリ同期やデータクラッシュの不具合は解決したみたいです。日本語サイトからダウンロードできます。URLは以下。
※情報元

暗号キーの入力は死ねた

koboにはWi-Fi接続機能があるので、早速設定に取りかかった訳ですが…もう二度とやりたくねぇ!

ってのは、僕はMacにも当たり前のようにセキュリティソフト導入する程に、セキュリティには気を遣っており、そんな僕のパスワードの類の桁数は
「最大桁数に最も近い素数」
という運用ルールとしているので、無線LANの暗号キーは61桁に設定していたんですよ。PC端末増設する場合は、テキストファイルからコピペして済ませられたから特に不便感じてなかったので、今回のようなコピペできないケースってのは全く想定外でした…

だがこの61桁のランダム文字列入力が一発OKだったのには自分で自分を褒めてやりたい。

で、電子書籍買ってますか-?

買ってませんw。理由は価格。何故か紙の本と殆ど変わらない。著者の方々には申し訳ないけど、僕はビジネス本・新書・小説の類は殆ど中古か図書館レンタルなので、この価格設定だと踏み切れません。kobo手に入れたその日の夜、ブックオフオンラインで本購入している自分がいましたよ。電子書籍様子見ってことで、今月は本の購入控えてたので、そりゃあもうがっさりと買っている自分がいましたよ。

漫画に関しては基本新品で買うんですけど、漫画は電子書籍より紙の方がいいというのが個人的感覚。理由は以下。
  1. 漫画は小説などと比べて文字量が少ないので、頻繁にページ繰りが発生する。
    ページ繰りは圧倒的に紙の方が速い。
  2. 電子書籍では全文検索は可能でも「あのシーンどこだっけ?」といった「画像検索」はできない。
    これを行う際にキーとなってくるのは、これまたページ繰り速度。
  3. 紙だと「前半3分の1辺り」のような「二分探索的ページ繰り」も可能。
これらは『ブラックジャックによろしく』や『テルマエ・ロマエ』の無料版電子本を読んだときに体感済。まあ慣れの問題かもしれないけど。

ていうか、紙の本だと見開き2ページだけど電子書籍だと1ページ(2ページにできなくもないだろうけど小さくなって読みづらいよね)ってこととかも考えると、電子書籍って速読には向いてないよね。

ただまあ場所取らないってのはでかいんだよなぁ…これからどうしていこうか。

2012年7月16日月曜日

僕歪週末号~大っ津、オラ悟空

厳密には週末じゃないけど、明日からの日々に対する悲しみは週末以上でしょ?

冷静に観察すると物凄い髪型だね

ふーん。
「原作:鳥山明」ってなってるけど、これは鳥山先生がストーリー書くってこと?それとも「戦隊ものガンダム」みたく「原案:富野由悠季」ってのと同じ意味合い?

ちなみに僕は今年30歳という思いっきりドラゴンボールリアルタイム世代。「超サイヤ人のバーゲンセール」の頃は小学生で、男子の誕生日プレゼントの定番はドラゴンボール文房具。あの頃、文房具の大半は金髪マッチョマンの絵が描かれた物で占められていた。

バトル漫画ということで、服ビリビリの上半身裸パターンが結構多かった気がするが、絵面だけ見ると外国のホモアニメに見えなくもないな。

【切望】「因果応報」の物理法則化

僕の移動時のお供である『松本人志の放送室』。前回の週末号で、「第249回『マイケル・ジャクソン SMAP×SMAP出演裏話』の回を聞いた日がたまたま彼の命日だった」というのをお伝えしましたが、今週また似たようなことが。

それは…「いじめ」に対する見解を述べている第266回。ニュースに取り上げられて話題になった第345回と同じ事言ってます。内容の引用や紹介はしませんので各自ググってください。案の定、このタイミングなので再度取り上げられているようです。ちなみに僕の松本氏の意見に対する見解というか感想は、「一理あるとは思うけど、一番悪いのはやっぱり自殺に追い込む側だよね」という、まあ恐らく一番多いであろう意見です。

ところで、こういう事件があると「もし自分がイジメに遭ったとしたら…」って時々考えてしまう。僕だったらどうするんだろう。僕は基本的に
「オレは殴られたら必ず殴り返す!!」 by ガッツ from 『ベルセルク』
とか
「俺を殺す気なら、殺してやる」 by 武蔵 from 『バガボンド』
とか
「死なば諸共ーー!!」 by ジロン from 『戦闘メカ ザブングル』
って気性なので、自殺以外の方法による反撃を決めたいところですね。ちなみに僕は生まれてこの方「喧嘩」をしたことはございません。

少し話は逸れるけど、こういった「目には目を」的な話になると、
「復讐したって何も解決しない」
とか
「憎しみの連鎖を生むだけだ」
とか
「不毛。もっと有意義なことに時間やエネルギー使おうよ」
なんて意見が出てくる。さて、「憎しみの連鎖」と言うが、「連鎖」ってのは「基となる憎しみ」あってのもの。「加害者」の方は「憎しみをゼロから生み出す」という、錬金術師も真っ青な事している。明らかに「連鎖」よりも質が悪い。ビジネスライクに「憎しみの絶対量」って観点で考えてみると、加害者放っておいたらその量は確実に増え続けることになる(反省の有無はここでは考えない)。

なので、「生み出すもの」が一番悪い、元は断ってしまうべきだ、そのために何らかの一石は投じるべきだってことで、復讐はした方がいいのかなってのが僕の考え(こういう問題で「方がいいのかな」ってのも変ですが)。まあ「必ず復讐すべし!」とは思ってないです。

いやしかし、今回の事件はかなりの世論が味方についているので、事後の事に関してはこれ以上酷くはならないだろうけど、表沙汰にならずひどいままの事件っていっぱいあるんだろうな…「底辺ニートの俺がついに日本人の平均年収を超えた」とかでもかなり酷い目に遭わされたみたいだし…

ていうか、「因果応報」をただの思想・概念ではなく、明確に物理法則化してくんないかな、神。そうしてくれたら確実に犯罪減るのに。神と言えば、それに近い存在である「天使」の肖像画を美術の授業とかで時々目にしてきたけど、若い女性ばかりで熟女を見たことがない気がするのは気のせい?僕が見落としているだけ?もし僕の見落としでないのであれば、神と言えども女性は若い方が好きだと思っているということか。熟女の魅力・魔力を理解できていないクソガキに、森羅万象を統べる資格なんてあるのか?