| @技術/プログラミング

NECの安サーバーを買ってサーバーを作ってるんですけど、SSHでエラーが出て困ってます。OSはUbuntu Server 10.04.1 LTS。

まずSSHのおさらいを。クライアント側で

$ mkdir -p .ssh
$ ssh-keygen -t rsa (以下略)

したのち、サーバー側の /etc/ssh/sshd_configPasswordAuthenticationon にし、パスワードでSSH接続できるようにして

$ scp id_rsa.pub username@hoge.com:.ssh/authorized_keys

するか、あるいはUSBフラッシュメモリで鍵をサーバーに移す。その後サーバー側で .ssh/.ssh/authorized_keys のパーミッションをそれぞれ700と600に変えてあげるわけですよね。

いっぺんクライアント側で id_rsa.pub を作ってたらそれ以降は単純にこれを接続先のサーバーにコピーしてあげればおk。ここまで合ってますかね?

前から使ってる職場内だけで使うサーバーにも同じUbuntu Serverを入れてるんですけど、こっちでは全くトラブルがない。それなのに新しいサーバーでは

Permission denied (publickey).

というエラーが頻繁にお出になるのですよ。

しかしこのエラー、常に出る訳じゃないんですね。サーバーを直接操作して

$ sudo /etc/init.d/ssh restart

してあげると消える訳ですね。そんでしばらくクライアントからSSHで接続したり切断したりを繰り返していると、あるとき突然、

Permission denied (publickey).

となるわけです。まじでストレスフル。つか、このサーバーは公開用に使うものなので、こんな感じでSSHが不安定だとかまじで困るんですけど。

前述の PasswordAuthenticationon にしとけば、公開鍵認証に失敗した後もパスワードで認証することができるんですが、パスワード認証はなんだか怖いので使いたくないのですよね。どいうしたものか。

ググったらSSHのプロトコルを1と2併用にしたら解決するという情報が出てきたのですけど、これやったら "Disabling protocol version 1. Could not load host key" というエラー?が出てしまったので多分僕の環境では意味なし。「RSAキーやめてDSAにしたらエラーでなくなった」(ぷらぷらブログ | OpenSSH を導入。接続に四苦八苦!)という情報もあるけど面倒くさいのでまだ試していません。

| @技術/プログラミング

この前、さくらVPSに入れているUbuntuのzshで ls とか cd とか打ったとき、変なエラーメッセージが出るようになった。原因不明。しょうがないのでzshをインストールしなおそうと、chsh してbashとかに切り替えずに sudo apt-get remove zsh してしまった。そこで混乱してしまって Ctrl + D しちゃったもんだからSSH閉じてしまって、なんとUbuntuにログインできなくなってしまった。

Ubuntuは root というアカウントがなくてなんでも sudo するか、 sudo su で無理矢理rootになるしかないので、rootでログインしてchshしてやるという救済手段がとれず、にっちもさっちもいかなくなってUbuntuを再インストールした。

ちょっと調べたら、こういうアクシデントを防ぐために、/etc/shells にzshを足さず、chshでデフォルトシェルにもしないという人もいるみたい。.bashrc に次のように書くそうだ。

if [ -f /bin/zsh ]; then
  exec /bin/zsh
fi

これだと何かのトラブルでzshが起動しないことがあってもbashでログインできるということらしい。zshがちゃんとしてるときはzshでログインするという理屈だ。

しかしこれには結構重い副作用があるみたい。

一理ある。

というわけでUbuntuやrootでsshできない環境ででzshを使う場合は、何らかのトラブルでzshが起動しない、シェルにログインできなくなることを想定し、保険として普段はまったく使わない非常用のアカウントを作っておくと良いと思った。もちろんsudoersに指定しておかないと意味ないけどね。

| @WWW

先週、九州産業大学で行われたWordCamp Fukuoka 2011に行った。仕事でWordPress使う機会はないけど、福岡のWeb業界がどんな感じなのか知りたくて行ってみた。

WordPressは ゴンゴンの見た映画 で使ってて、前職場でもウェブサイトにブログを付けるときによく使った。また友達のホームページにも導入したことがある。以下そのときに書いた過去記事から引用だけど、

WordPress 2.7やMovable Type 4とかもそうですけど、ブログのなかで読者が触れる部分っていうのはここ数年のアップデートの中でもそうそう変化なくて、書き手が触れる部分、書き手にしか見えない部分がえらく進化してます。サーバーにインストールして使うタイプのブログツールでも、外部のフィードを取ってきて管理画面に他サイトの更新状況や人気のプラグインが表示されたりしますし、まるでレンタルブログサービスを利用しているかのようです。いかに書き手を書く気にさせるか、ってのが今日のブログツールの潮流なのかなーって感じました。これ大事なことですよね。

portal shit! : Twitterのフィードを加工して自サイト内にマイクロブログを作る

このように、WordPressは管理系の機能が非常に進化しているように思う。バージョン2.7から、自動アップグレード機能がついて、何も知らん人でもWordPress本体をサーバーにアップロードして、MySQLにデータベース一個つくればそれで使えるようになる。面倒くさいアップグレードとかもボタン一つで完了、さらに世界中のデザイナーがデザインしたWPテンプレートが使える。

WordCamp Fukuoka 2011は “Publish” がテーマだったけど、本当に誰もが簡単に “Publish” できるようになりつつあると思う。開発者とデザイナーとユーザーがそれぞれたくさんいて、非常に活気があると感じた。それゆえにユーザーの声が反映されて、使いやすい管理画面(ダッシュボード)になってきてるんじゃないだろうか。一人でブログを書いてるのに、一人じゃないのがWordPressの良いところだと思う。後ろにオープンソースコミュニティが付いている感じ。

一方、かつてはブログツールの代名詞的存在だったMovable Typeは、Six Apartの買収などのいざこざがあり、アメリカの親会社から日本法人に権利が売却されてしまっていた。

なんでMovable Typeがダメになったのか。WordPressと異なり、元々オープンソースじゃなかったのが原因だろう。2007年にオープンソース化されたけど、そのときにはWordPressとの勝負には決着がついていたように思う。そもそもMovable Typeは、個人がPublishするためのツールというより、企業のホームページを管理するためのツールを指向していた。公式サイト(ウェブサイト管理の新標準。Movable Type 5 - Six Apart)を見れば、右上の目立つ位置に「ご購入はこちら」のボタンが配置してあり、基本的に有償のソフトウェアであることが分かる。

WordCampの活況とMovableTypeの身売りがあまりにも対照的で、コミュニティのあるなしで、ブログプラットフォームの盛衰が左右されることを実感した。一人で黙々とブログやプログラムを書いていてはダメで、何かしらで外とつながってなきゃいけないのだと思う。

| @技術/プログラミング

昨日の続きのようなもの。LokkaをUbuntu上で動かそうといろいろやってます。passenger入れて、 passenger-install-nginx-module を実行しようとしたらエラーが出た。お前はrootじゃないからnginxインストールできひんわ、みたいなメッセージが出る。sudoったりrootになってインストールしようとすると今度はpassengerなんていうgemはないわ、って怒られる。sudoしたときには.rvm内のgemパッケージではなくシステムのgemパッケージを見ようとするっぽい。またrootになるとRVMではなくシステムのRubyが実行されるので同じくpassengerなんてgemないわ、って怒られる。システムのRubyは1.8.7だし、なるべくなら使いたくない。RVMのRubyを使ってpassenger + nginxな環境作れないのかよ、とググってたら以下のような記事を発見した。

なんと、RVMには rvmsudo というコマンドがあるらしい! 試しに

$ rvmsudo passenger-install-nginx-module

を実行してみたところ、お前はroot権限がないんじゃ〜とエラーが出ていたところも無事通過してnginxをインストールできてしまった。以前、sudoで無理矢理nginxをインストールしたときは、 nginx.conf 内で、

passenger_root /home/morygonzalez/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2;
passenger_ruby /usr/bin/ruby1.8;

となっていて大変気持ち悪かったし、Passengerも「PassengerとRubyの本体でバージョンの不整合があるだろヴォケ」みたいな警告出してた。それが rvmsudo のおかげで nginx.conf に書き込まれる値も以下の通りとなるので、とりあえずPassenger(RubyGems)とRubyのバージョンが異なるというような問題は回避できる。

passenger_root /home/morygonzalez/.rvm/gems/ruby-1.9.2-p136/gems/passenger-3.0.2;
passenger_ruby /home/morygonzalez/.rvm/wrappers/ruby-1.9.2-p136/ruby;

ただ、なんでか分からないのだけどnginxがうまく動いてくれなくて、無事Webサーバーを起動できてない感じです。

それにしてもRVMは、本当にきもいと思う。readlineとかまで.rvm内にインストールできるできるし、いったい何考えてるんでしょうかね。きもすぎて便利です。

| @技術/プログラミング

RVMを使ってます。RVMで入れたRubyがshebangに #!/usr/bin/env ruby と書いたときに呼び出されて欲しいと思ってます。シェルから

#!/usr/bin/env ruby

puts RUBY_DESCRIPTION

なファイル(hoge.rb)があったとします。これを

$ ruby hoge.rb

とシェルから呼び出したときにはちゃんと

$ ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0]

と表示されます。しかしTextMateでRunしたときや、Apacheから同じshebangで呼び出したときには、systemのRubyが呼ばれます。

これ、もう半年くらい解決方法探してる気がする。

TextMateでRunしたときにsystemのRubyが呼ばれるのはともかくとして(テストするときはシェルから呼び出すのでRVMのRubyで実行できる)、Apacheで新しめのRubyを使いたいときはどうすればよいのでしょう。まさかshebangに ~/.rvm/bin/ruby-1.9.2-p136 とか書くんじゃろか。

cxxさんに質問したら RVM: Ruby Version Manager - Installing RVM System Wide というURLを教えてもらった。今日は眠いのでまた今度試す。

| @Mac/iPhone

youpyさん作のiTunesで聞いてる曲のレートが5だったらLast.fmに "Love" を送信してくれるやつを試してみようとした。cronで2分間隔とかで回して使うやつ。

なんで二年近く前のやつを今頃使ってみようとしたのかというと、二年前はRubyとかUnixのことが全然分かんなくてブックマークしただけだったから。いまは多少はRuby分かるし、crontabの使い方も分かるので、いましかないと思ったわけです。

git clone git://gist.github.com/58251.git
cd 58251
ruby love.rb

初回起動時にはLast.fmのAPIキーやTokenを入力するようにコンソールにメッセージが表示される。その後こういうエラーが出てしまった。

/Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle: dlopen(/Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle, 9): no suitable image found.  Did find: (LoadError)
  /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle: no matching architecture in universal wrapper - /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/osa.bundle
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:29:in `require'
  from /Library/Ruby/Gems/1.8/gems/rubyosa-0.4.0/lib/rbosa.rb:29
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:34:in `gem_original_require'
  from /Library/Ruby/Site/1.8/rubygems/custom_require.rb:34:in `require'
  from love.rb:71:in `initialize'
  from love.rb:61:in `new'
  from love.rb:61:in `get_instance'
  from love.rb:34:in `main'
  from love.rb:206

なんかアーキテクチャが違うとかそれ系のエラーメッセージが出ている模様。そもそもRubyOSAって何なんだろうと思って調べてみたら、以下にたどり着いた。

なるほど、Appleが用意してるRubyからMac OS Xのイベントとかを管理できるようにするやつか。RubyをAppleScript的な使い方が出来るようにするらしい。Snow Leopard発売前の2007年に出たVersion 0.4.0で開発止まってるみたいだし、64bit化したSnow Leopardでは使えないってことなんだろうか。いや、64bit化する前のMacBook黒からTimeMachineでデータを引き継いでるから、アーキテクチャに合わないRubyOSAが入ったままになってるのかもしんない。「10.6 Snow Leopard と RubyOSA のインストール - Numata Designed Factory」 という記事を参考に、RubyOSAを入れ直してみることにした。

svn checkout svn://rubyforge.org/var/svn/rubyosa
cd rubyosa/trunk
cat src/rbosa.c | (rm src/rbosa.c; sed "s/c ID/c RB_ID/g" > src/rbosa.c)
ruby extconf.rb
make
sudo make install
sudo make install-extras

インストール後、再度 ruby love.rb を実行してみた。しかし今度は以下のようなエラーが出る。

/Library/Ruby/Site/1.8/rbosa.rb:470: warning: Passing no parameters to XML::Parser.new is deprecated.  Pass an instance of XML::Parser::Context instead.
XML::Parser#string is deprecated.  Use XML::Parser.string instead
/Library/Ruby/Site/1.8/rbosa.rb:558:in `__send_event__': Cannot send Apple Event 'coregetd' : procNotFound (-600) (RuntimeError)
  from /Library/Ruby/Site/1.8/rbosa.rb:558:in `player_state'
  from love.rb:77:in `playing?'
  from love.rb:36:in `main'
  from love.rb:206

どうも古いバージョンの libxml を使わないとエラーが出るらしい。今度は「RubyOSA 0.4.0を使おうとしたのですが、Bus Errorが発生 - Watsonのメモ」という記事を参考に以下のようにした。

diff /Library/Ruby/Site/1.8/rbosa.rb /Library/Ruby/Site/1.8/rbosa.rb.org
39c39
<   gem 'xml/libxml', '= 0.3.8.4'
---
>   require 'xml/libxml'

とりあえず、irbでrbosaをrequireしてもエラーは出なくなった。

irb -r rbosa
>> itunes = OSA.app('iTunes')
=> <OSA::ITunes::Application:0x10173bb38 desc="'sign'($6B6F6F68$)">

iTunesでレートは★★★★★だけどLast.fmで "Love" マークが付いてない曲を再生しながら、もう一度 ruby love.rb してみたところ、 {"status"=>"ok"} が返ってきた。ちゃんとLast.fmで "Love" されてた。iTunesで音楽を聴いてるときにcronで回してあげれば常にレート5の曲をLast.fmで "Love" してくれるようになる。Launch Daemon化とかはやり方が分からないのでそのうち調べる。

| @技術/プログラミング

VPSが安くなってきてるということなので使ってみることにした。自宅サーバーも一瞬考えはしたが、夏の発熱や騒音のことを考えるとVPSで十分かなという気がした。いま借りてるレンタルサーバーのDreamhostにはおおむね満足してるんだけど(ディスク容量・転送量無制限)、rootになれるかどうかはやっぱり大きい。あとDreamhostはsshでシェルにログインしたときのわずかなタイムラグが地味に気になる(zshでTab補完するときとか)。さくらVPSは速い回線から接続すればローカルのシェルと同じくらい速い。

OSはデフォルトだとCentOSなので、Ubuntuに入れ替えた。HDD容量は20GBだけど、普通にホームページ作ったり小さなプログラムを動かすくらいだったら十分かなと思う。