2013年4月30日火曜日

僕歪黄金号〜4月は仕事で殆どコード書いてないプログラマがちょっと通りますよ

新年度も早1ヶ月、通勤退勤電車で初々しさ漂う者たちを見かける季節、社会人としてのマナーをまだよく分かってないそんな彼・彼女らによるGメン歩きに出くわしてイラっとする事が多めな季節、そんな彼・彼女らの実技訓練を行っているためか有楽町線の運転何か荒くね?と感じる季節ですね!え?そう感じるのは僕だけですかそうですか。

「自由時間を最大化したければ、自由時間使って勉強しろ」

上記は僕の下に新人プログラマがついたら言おう思ってる台詞。まあ今のところ言う機会は一度も巡ってきてませんが。

時間は有限。よって勉強に時間を使えば、当然それ以外の時間は減る。だけど、勉強することで仕事を効率的にこなせるようになれば、勉強に費やした時間なんてあっちゅーまに元とれるよ、と。

え?時間は勉強よりも家族サービスに使いたい?
勉強することで、いつ会社が潰れてもすぐ仕事見つけられるくらいの力をつけておき、家族を安心させておくこと、それが一番の家族サービスでは?支える土台が無い状態でいくら時間が確保できたところでねぇ…
まあ新入社員で家族抱えてる人はそんなにいないでしょうが。

え?仕事早く終わらせても他人の尻ぬぐいさせられるって?
まずは尻ぬぐいした分がちゃんと評価に反映されるか確認しましょう。何もなかったり全然割に合わなかったりしたらさっさと辞めちまえそんな会社。

え?別に程々に生活できればいいしーだって?
程々の生活おくるのにも割と努力しなけりゃならない時代ですよこれからは。

リストラ処女喪失(周りが)

世の中的には年度ではなく「年」の節目に目標立てたりふりかえりしたりするのが一般的なようですが、3月終了4月開始の文化を鑑みると「年度」の節目に行う方がいいと思うのは僕だけでしょうか。年末年始なんてまだとにかく寒いからすぐ挫けそうになるし(「早起き」やアウトドア系の目標なんて特に)、花粉症だと2月3月でまた挫けそうになるし、年度末に異動・転勤とかで環境がらっと変わる可能性あるし(「新入社員」なんてまさにそうだし)。

とまあそういう価値観っていうのと、昨年12月に歯列矯正始めてしばらくは碌に食事摂れずフラフラだから運動できず心肺機能低下してメガネ曇り防止マスクしているのに風呂場のごたるって状態が、3月上旬あたりにやっと奥歯のセメント外れてそれなりに物噛みちぎれるようになって体力戻ってきてよし4月から本気出すってことで、いろいろ目標考えていたんですけど、3月の最終営業日…勤めている会社で業績不振による大リストラ発表。技術職は何と僕一人を除いて全員クビ!It's an ありがた迷惑。

そんな訳で、孤独なエンジニアライフを送っております。エントリ前半でも触れた勉強だけど、人に教えて貰うのが一番手っ取り早いんですよね。IT業界は勉強しなきゃいけない事がとても多いから、一人で網羅するなんて不可能。自分の興味がある分野だけ重点的に勉強して、他の人と知識を補い合うのが効率的なわけです。それが(社内では)できなくなった訳で、仕事の非効率化は必至。

それと、自分はアプリケーションレイヤー人間なんですけど、専任のインフラエンジニアもクビになったからインフラ周りの仕事も捌かにゃならず、今月はインフラ資産の棚卸し、社内システム・ハードウェアの選択と集中、ドメインレンサバVPSの更新催促メール対応といった仕事ばっかで殆どコード書いてません。まあルーターいじったりデータセンター行ってRAID組んで監視ツールいれたりってのはいい経験だったけど。とはいうものの、実ハードウェアでRAID組むなんてクラウド時代にどれほどの価値があるのだろうか、クラウドならこんなわざわざデータセンター借りて赴いて手間かけて設定する必要ないよなーなんて思って虚しくなったり。ああそうだ、技術者は俺一人になったことだし、興味と実益を兼ねて社内システムのAWS化を目論んでやろうか。

せめてこれが一時的なものならまだ頑張れるのだが…おそらく恒久的。業績が急回復すれば増員に動くだろうけど、まあ無理だろうな…ちなみに会社のメイン事業はSEOですよSEO。しかもオワコンである被リンク系がメインの。Googleに勝てるわけがない。せめて(エンジニアではなくとも)優秀な人がいれば、その人から学べるものはあるだろうからまだやり甲斐あるだろうけど、僕からみてもDQNでとにかくITリテラシー低く…もうメールとExcel「だけ」で仕事するのイヤ!

平日は週末が恋しくなり、週末の末である日曜夜はブルーになり、ストレスで血便排出…こんなの、新卒で入社した親方日の丸系SIerでイラついてた時以来だ。


2013年3月3日日曜日

[CakePHP]アラビア語はSQLまでも右から左へ受け流す 他

アラビア語をINSERTしたSQL文をブラウザで見るとカラムと値の並びが逆だった

仕事でアラビア語を登録するSQLを実行する機会がありました。
アラビア語を登録するテーブルの構造は以下のような構造。

Field
id
word
delete_flag
created
modified

"word"列にアラビア語がセットされるのですけど、INSERT文をCakePHPにて実行し、Cakeが出力するSQLデバッグを確認したところ・・・



カラムと値の対応が逆になってました。でもテーブル確認するとちゃんと正常にデータ登録されてました。てかブラウザのページソース確認してみると、カラムと値の並びはちゃんと揃ってました。
ちなみに上記テーブルをCSV出力してWindowsのEmEditorで開いた時も並びは逆になってました。

アラビア語といえば右から左へ綴る言語ってことで、ブラウザとかエディタが表示制御してるんでしょうね。SQLに限らず、左から右へと綴る言語とアラビア語を混在させた文章がどう表示されるかいろいろ試してみたいな。ま、それをやって特に得るものはないから優先度超低だけど。

アラビア語の文字コードとかのメモ殴り書き

携わってる仕事は別にグローバルでは無いんですけどね。
  • ISO-8859-6, windows-1256 : アラビア語
  • GB2312 : 中国語
  • EUC-KR : 韓国語
    ※mb_detect_orderで「EUC-JP」の後に定義してると「EUC-JP」と検出されてしまった。
    「EUC-JP」の前に定義すると今度は「EUC-JP」が「EUC-KR」と検出。
    つまりどちらの言語も先に出現する方のエンコーディングとして検出されるっぽい
  • タイ語はUTF-8
グローバル展開するならMySQLのエンコーディングはutf8ではなくutf8mb4を使うべき
【デブサミ2012】16-A-6 レポート グリーに学ぶ、グローバル展開の最新事情 (2/2):CodeZine

CakePHPではMySQLのTINYINT型はboolean型扱いとなる

データの種類や区分を表すのに整数値割り当てて使うってのはまあ当たり前の話ですが・・・
この区分値を格納するカラムの型をTINYINT(1)にし、Modelでこの区分値の条件指定して検索かけたところ、いろいろと意図してない結果が発生しました。
  • 検索条件に2以上の値を指定しても=1のデータが返ってきた
  • 値が0のデータの検索結果をダンプすると、カラムの値は0ではなくbool(false)となっていた
    →PHPで判定条件を「=== 0」と厳密判定にしてたら大変だね
どうも「0とそれ以外」の2種類しか認識されない、つまりboolean扱いされているっぽい。
app/tmp/cache/models配下にあるモデルキャッシュを確認してみたところ、問題のカラムの型は確かにboolean型になってました。
・・・
s:10:"kbn_column";a:4:{s:4:"type";s:7:"boolean";・・・
・・・

Cakeの仕様なんでしょうね。僕全然知らなかったのですけど、これって知ってなきゃ恥ずかしいレベル?

まあとにかく、0と1以外の値を持ちうる場合はCHAR(1)にしときましょう。


2013年2月4日月曜日

Cloudera Managerを利用してHadoopインストール試みたが最後にエラー

PCとネットワーク環境さえあれば開発環境を構築できる時代ですが、それでも敷居が高いのがビッグデータ系環境。並列分散処理を本格的に検証するならハードが複数必要だし、VM使って擬似分散環境を構築する場合は(VM載せるマシンに)ある程度のスペックが要求される。SSDとはいえメモリ4G、ブラウザでちょっとタブを多めに開いたり大容量ファイルコピーするだけでファンフル回転するMacbookAirでは厳しいな・・・というのを言い訳に後回しにしてきたけど、いい加減そろそろ手を出さないとなと思ってたところにCloudera Managerという環境構築ツールの存在を知り、ちょっと手を出してみました。

しかし結果は・・・当エントリのタイトルが物語っているとおり、最後の最後のサービス起動でエラー発生してインストール処理全ロールバックという結果となりました・・・。詳細は後述しますが、どうもサービス起動時のタイムアウトっぽい。Hadoopのインストール先が外付けハードディスクに置いたVMで、かつ先に述べたとおりマシンスペックが低いとは言え・・・レスポンス時間の要件厳しすぎやしませんかClouderaさん。

ということでHadoop動かすところまではいきませんでしたが、環境構築の流れは確認できたのでメモメモ。

試した環境

  • CentOS 6.3
  • Cloudera Manager 4.1.3
日本語サイトの紹介ページには
「インストール・ノード、コンポーネントの選択や、インストール後のセットアップを含めてたったの4分程度でクラスタを構築することができます。」
とありますが(上記ページ内の動画では5分)、僕の環境ではインストール処理開始までは確かに数分でしたが、実際のインストールには1時間以上待たされました。まあこれもマシンスペックの問題かもしれません。

Cloudera Manager インストールマシンでの事前準備

SELinuxを一旦無効に
無効にしないとCloudera Managerのインストーラに怒られて先へ進めません(Permissiveでもダメでした)。
# vim /etc/sysconfig/selinux
--
SELINUX=disabled
--
# reboot
scpコマンドインストール
Cloudera Managerは各ホストにHadoopインストールする際、インストール対象ホストへインストールファイルをコピーするのに内部でscpを使ってます。
# yum install openssh-clients

ちなみにJDKも必要なんですけど、無ければCloudera Managerと一緒にインストールしてくれます(本家Oracleの6系ですけど)。

Cloudera Manager インストール

ドキュメント
ダウンロード
以下ページから辿ります。
ユーザー情報登録を求められますが、日本語サイトの紹介ページの動画で「(ユーザー情報)登録してくれたらうれしいです」と述べてる通り、入力はしなくてもダウンロード可能。入力画面下部の"I'd rather not fill in the form..."といったメッセージ内のリンクからダウンロードページに飛べます。

それではコマンドを叩きます。
$ wget http://archive.cloudera.com/cm4/installer/latest/cloudera-manager-installer.bin
$ chmod u+x cloudera-manager-installer.bin
# ./cloudera-manager-installer.bin

GUIのウィザードが起動するので、Nextとか同意するとかしてください。インストール処理はそこそこ時間かかりました。
ファイアウォール穴開け
7180番ポートを開けます。
# vim /etc/sysconfig/iptables
--
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7180 -j ACCEPT
--
# service iptables restart

Cloudera Manager使ってHadoopクラスタ構築

ブラウザでインストールしたマシンの7180番ポートへアクセス。ログイン画面が表示されるので、ここに記載されている通りログインユーザー・パスワードに「admin」を入力してログインしてください。

後はもうウィザードに従えばいいだけなので割愛。Hadoopに手を出そうとする人なら説明なんていらんでしょ。ちなみに僕の環境の場合、前述の通りインストール処理は1時間以上かかりました。
そして、エラー発生
片手間に進捗バーを眺めること1時間弱、ようやく全てのソフトウェアのインストールが完了したと思いきや、エラーが発生してバーの色が赤色になって「ロールバックします」との非情な光景が。
ホスト一覧の「詳細」リンクを押下するとインストールログを参照できるので、確認してみたところ、以下エラーが発生していました。
BEGIN /sbin/service cloudera-scm-agent start 
cloudera-scm-agent を起動中:  [60G[ [0;31m失敗 [0;39m] 

サービスの起動でエラー発生しているので、サービスのインストールに失敗したのかと思い、いろいろと調べたところ、発見したのがHadoopのエキスパートと思われる方の以下記事。
Cloudera Manager のインストーラーである cloudera-manager-installer.bin は、速度の遅いネットワークではタイムアウトのせいで失敗してしまう (ように見える)
この方は結局Cloudera Manager使うのを諦めて手作業でインストールしたそうです。ってことで、僕も深追いするのは諦めました。
手作業でのインストール手順は、上記の方とか他をあたってください。

Cloudera Manager アンインストール手順

僕と同じくCloudera Managerでインストールできねぇってことで無用の長物と化したのでアンインストールしたい場合は、以下ページを参照してください。


2013年1月21日月曜日

僕歪週末号〜ゲイNo!人は歯が命

ちっ、また週末過ぎちまってたぜ。

ドラッカー本って自己啓発書なん?

1週間ほど前(関東大雪の日だっけな)、ラジオ聴きながら晩飯作ってたら、「キャリアポルノ」というどっかで聞いたフレーズが飛び込んできた。どこで聞いたんだっけなと記憶を辿っていると、今度は「タニモトマユミ」と、これまたどっかで聞いた名が。そう、ご存じMay_Roma女史でした。何とラジオに電話出演しておられました。何か最近本を出版されたりと、今年は表舞台においでになるんでしょうかね(それとも元々これくらいの活動してました?)。

さて、ラジオでのテーマですが、前述してますが「キャリアポルノ」に関して。まあ「自己啓発書なんて無意味だ」といったことを述べているのですけど、一点気になったのが「自己啓発書の定義」。ラジオでも上記の元記事でもドラッカーを例に挙げていましたが、僕の感覚ではドラッカー本は自己啓発書ではなくノウハウ集・フレームワーク集ってな位置づけなんですけどどうなんでしょう。ラジオで「具体的じゃない(実際どうすればいいか書いてない)から、(実践では)役に立たない」というような事もおっしゃってましたけど、具体的でないのは様々ケースで使えるようにするために抽象化(要するにフレームワーク化)してあるからであって。まあ僕ドラッカー読んだことないですけど(『もしドラ』をブックオフでパラ読みしたくらい)。

でもまあしかし、愛すべきおばちゃんです。

僕ら歯みんな歪ている

私、自分で言うのも何ですが割とシュッとしていてコミュ障って訳でもないのに長いこと彼女がいない+坊主頭というだけで、これまで幾度となくゲイ疑惑をかけられてきた者です。そんな私もとっくに30歳になりました。そんなおっさんの領域に踏み込みだした私ですが、昨年12月、長年の夢だった歯列矯正をついに始めました。最大の目的は「体の歪み矯正(それに伴う体質改善)」です。ちょっと自律神経が弱かったり、まっすぐ立ってるつもりなのに度々「傾いている」と言われたりすることが多いもんで。歯の歪みが肩こりなど「体の歪み」を引き起こしてる節もあるので、首都直下地震やハイパーインフレで円資産を失う前にパーッと自分に投資しようと思った次第です。ネットでもリアルでも評判が高かった青山の某クリニック(値段も高いが・・・)にお世話になってます。

歯列矯正でネックになってくるのは、治療費もそうですが一番はやはり治療期間。6〜7年くらい金具つけっぱなしってイメージをずっと抱いていたので今まで中々踏み切れなかったんですけど、最近ではあのごつい金具は全体矯正でも大体1年ぐらいで取れるみたいです。前歯だけの部分矯正ならもっと早く(+安く)で済みます。さらに、期間をさらに短縮させるコルチコトミー手術というのもあるんですよ(高いけど・・・)。医学の進歩ってすごいですね!ただ、寝てる間にマウスピース装着して半年に一回くらいで通院するという「保定期間」ってのはどうしても2〜3年かかってしまうみたいです。

さて、僕の場合なんですが、
  • 上下ともに前歯のエリアが狭い(平均的な人の歯形がUだとしたら、僕の場合はV)ので、部分矯正すると出っ歯になる。よって全体矯正の方がおすすめ。
  • 全体矯正の場合は、まずは前歯のエリアを広げるために、歯の裏側にも装置をつける必要あり
  • 上前歯が1本、下前歯の裏側にいっちゃってるので、これを前に出すまでは前歯が重ならないよう、奥歯表面にセメント塗りこんで常に何か噛んでいる状態にしておかなくてはならない
という状態。歯の表面だけではなく、裏側+奥歯と、第1段階では3倍のアイテムを装着しなくちゃならない状況。ちなみにこの第1段階の期間は最大で約3〜6ヶ月。前述したコルチコトミー手術ってのを受けると、これが2〜4ヶ月に縮まるとのことだけど、手術代が結構高い(月収に匹敵するレベル)。

結局、裏側の装置が舌に触れるので喋りづらくなるわ、奥歯はセメント塗ってるから物を噛みちぎってすり潰すのが困難だわ・・・って生活は一日でも早く終わらせたかったので、大奮発して手術受けました。治療期間が短くなるだけじゃなく、それ以外にも痛みの抑制やら歯を支える骨が強くなるやらいろいろメリットがあるとのことだし。歯は一生ものですからね。

ってことで、現在絶賛矯正中です。歯の中アイテムだらけです。奥歯はやはり使えたものじゃなく、食べ物は全て流し込んでます。よって食べ物はお粥などの流動食系、豆腐などの「うがいで噛みくだける系」ばっかりです。一度、禁断症状にどうしても耐えられなくなりカップヌードル食べたところ、麺を全然噛みちぎれなくて喉につまって窒息しそうになりました。

ああ・・・早く肉食いたい・・・ラーメンつけ麺食いたい・・・オンナ食いたい・・・つまり俺はゲイじゃない・・・

歯医者豆知識

歯科医院では、「抜糸」を「ばっし」ではなく「ばついと」と読む。
「抜歯」とごっちゃになるから。


2013年1月19日土曜日

[Mac 10.8]Homebrewインストール+Rubyバージョンアップメモ

僕はアルミボディiMacの頃(2007年。OSは10.5)からのマカーなんですけど、開発環境はずっとBootcamp上のWindows。かつても今も職場のPCは当たり前のようにWindowsだし(Excel・・・)、以前の会社ではJava時々.NETで降Linux確率0%です今日も元気にいってらっしゃいって状況だったからWindowsオンリー、現在はLAMPオンリーだけどVM使ってるからホストOSが何であろうと関係ない・・・ってことでズルズルとWindows使い続けてきたけど、いい加減飽きてきたしShift-JIS鬱陶しくなってきたしiPhone5買ったしって事でMacに移行しました。ついでにOSも最新の10.8に。ウィンドウサイズ変更が全枠でできるようになったのはGJ(昔は右下端でしかできなかった)、スクロールの挙動がスマホ仕様になったのはまあ慣れるとして、なぜSpacesを外した!?

というわけで、まずは各種ソフトウェア・言語環境を手っ取り早く構築・管理するために、パッケージ管理システムHomebrewをインストールしました。その時の作業メモ。
ついでにデフォで入ってたRubyを1.9系にバージョンアップ。

試した環境

  • Mac OS 10.8(Mountain Lion)
  • Java 6u37
  • Homebrew 0.9.3

Javaインストール

OS 10.8の場合、Javaが未インストールの状態でJavaを使用する何らかのプログラムを実行すると、「Java無いです。インストールしますか?」的なダイアログが表示され、ご親切にもOSがインストールしてくれます(10.7以前はどうか知らん)。ターミナルでjavaコマンドを叩くのが一番手っ取り早いでしょう。

ただし、この場合にインストールされるバージョンは6となります。最新の7が欲しい場合は自力でインストールしましょう(この手順は割愛)。

Xcode Command Line Tools インストール

単独インストールしてもいいですが、Xcodeインストールしとけばワンクリックでインストールできます。

XcodeはApp Storeでその辺のアプリ感覚でインストール可能。Appleの開発者アカウント登録は不要でした。Xcodeインストールしたら、起動して
Preferences > Downloads > Components
リスト内の「Command Line Tools」を「Install」。

Homebrewインストール

公式サイト下部にインストールコマンド記載されているのでコピペして実行。
Homebrew — MacPorts driving you to drink? Try Homebrew!
$ /usr/bin/ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
$ brew -v
Homebrew 0.9.3

サブコマンド一覧は「man brew」で確認してください。

ていうかMacにはRubyがデフォルトで入ってるのね知らんかった。
でもバージョンは1.8.7か・・・。

Rubyが最新でなきゃ夜も眠れない方々へ送る子守唄

rbenvを利用して、最新バージョンのRubyを同居させてそっちに切り替えます。
rbenvインストール
先ほどインストールしたHomebrew使えば一発。
インストールしたら環境設定ファイルに設定追加して再読込。
$ brew install rbenv
$ brew install ruby-build
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
Ruby お好みのバージョンインストール
まずは-lオプションで用意されているバージョンのリストを確認し、あとはお望みのバージョンをインストール。
今回僕は1.9.3の最新版を選択しました。
$ rbenv install -l
Available versions:
・・・
1.9.1-p378
1.9.2-p180
1.9.2-p290
1.9.2-p318
1.9.2-p320
1.9.3-dev
1.9.3-p0
1.9.3-p125
1.9.3-p194
1.9.3-p286
1.9.3-p327
1.9.3-p362
1.9.3-preview1
1.9.3-rc1
2.0.0-dev
2.0.0-preview1
2.0.0-preview2
・・・
$ rbenv install 1.9.3-p362
$ rbenv global 1.9.3-p362
$ ruby -v
ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-darwin12.2.0]

参考

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
                ・・・

以上。