CentOS 5.3でRmagick

fontをfedoraから持って来てるところが気持ち悪いが仕方ないね・・・

$ wget http://www.zacharywhitley.com/linux/rpms/fedora/core/6/i386/msttcorefonts-2.0-1.noarch.rpm
$ sudo rpm -ivh msttcorefonts-2.0-1.noarch.rpm
$ ln -s /usr/share/fonts/msttcorefonts /usr/share/fonts/default/TrueType
$ gem install rmagick -v 1.15.14

※おかげさまで、素敵な方に来て頂けることになったのでエンジニアの募集は終了しました。(デザイナーは激しく募集中!)

※給料の割に敷居が高いと指摘を頂いたので加筆修正しました。

僕が働いているアクトインディ株式会社でエンジニアとデザイナーの募集を始めました。(デザイナーに関してはデザイナーのmachidaさんが募集要項を書いてくれると思いますが、僕のところへ連絡をいただいても大丈夫です。)

大学院を半年休学してアルバイトとして参加してくれたShu MASUDAさんの残された時間が後1ヶ月ちょっとなので、早めに募集を開始しました。

社員かアルバイトの方を募集しています。

(LinuxやWeb開発を覚えたい学生の方も歓迎です)

  • 仕事でやること
    • 自社Webサービス開発
      • Ruby/Rails(ほとんどコレ)
      • PHP
      • CommonLisp
      • Scheme(サーバー管理系で一部)
    • サーバー構築
      • CentOS
      • Debian
    • 社内システム管理
  • 募集条件
    • 3ヶ月以上、週3日以上働ける方(アルバイト)
    • 五反田のオフィスに通勤可能な方
    • PC持込推奨(さもないと会社に転がってるThinkPad X32に・・・)
    • OS自由
    • 服装自由
    • ガチ鬱可(治療を受けていれば可)
    • 18歳以上の方
    • 何らかのプログラミング経験(実務/趣味問わず)
  • 待遇
    • 時給1000円以上(社員の方は別。最長6ヶ月間の試用期間があります)
  • 応募方法
    • komagata@gmail.com か recruit@actindi.net までメールをください。また下記の物も送っていただけるとありがたいです。
      • 履歴書(プレーンテキストでかまいません)
      • ブログのURL
      • 何らかの動くプログラムのソースコード(Webアプリ、バッチファイル、ユーティリティープログラムなんでもOK)

ブログやプログラムのソースコードを見せていただきたいというのは、「仕事外で趣味のコードを書くのが楽しい」という人なのかどうかを知りたいということだけです。凄いコードをかかなくちゃ駄目とかそういうのではないです。

「RailsやLinuxを覚えたい」という方や「Railsを駆逐してSmalltalkの素晴らしさを啓蒙したい」という野望をお持ちの方などをお待ちしています。

本当のところ、「プログラミングが好き」であり「僕たちと楽しく仕事ができる」方であれば大歓迎です。

今回からRailsなどのWebアプリやLinuxの経験が無い方向けに1ヶ月の研修期間を用意しています。

おすすめポイント

  • Rails等のWebアプリ開発、Linuxが覚えられる。
  • 自由な社風(ゆるふわガチ鬱ワープアニート)
  • 手段としての技術的な細部は自由。 (僕がかかわるまでRubyのコードは1行も社内に存在しませんでした。単に僕にとって手っ取り早い技術だったのでRailsのアプリケーションが増えました。1人が1サイトを担当することも多く、目的が達成されるのであればどんな技術を使ってもかまいません。他のメンバーがそれに合わせて勉強します。実際にシステム部のブログはCommonLispで構築されている。)
  • Redmine、Subversionなどのオープンソースを積極的に活用しているため、汎用性の高い開発手法が習得できる。
  • マネタイズやSEO、Web集客、営業など、Webサービスが勉強ができる。 (営業は営業の人がいますが)
  • PHPをやりたくない人でもOK。 (社内でPHPはオッサン=俺の仕事ということになっています。個人的にPHP書ける人大歓迎・・・。)
  • 週1リリースしているRailsプロジェクトが4個あるので嫌って程Rails書けます・・・。
  • 会社の隣に立正大学があるので何食わぬ顔して安い学食が食える。

エンジニア/デザイナーブログも作ったのでこちらから電波も発信して行きたいと思います。

なお、例によって決まった方には“横山光輝 史記 第七巻”と“勇午 洞爺湖サミット編 第二巻”をお贈りします。

参照:アクトインディ技術部隊報告書

YAPC::Asia 2009 で「Ark」と「kamaitachi」について話します : tech.kayac.com – KAYAC engineers’ blog

YAPC::Asia 2009 は9月10日(木)と11日(金)の2日間、東京工業大学大岡山キャンパスで開催されます。

へぇ〜、YAPCでArcの話があるんだ。

「・・・なん・・・だと・・・?」

paulgraham_2064_2944666

!!??

なぜYAPCで?ポールグレアムが来るのか?そもそもMzSchemeのVersion352でしか動かないんじゃないのか???

と一瞬パニクったが、よく見ればArk違いだった。(s/Arc/Ark/)

参照

こちらのエントリーで書いてたのをちょっと何とかならないか探って見ました。

(あくまで個人的なHackなので本家には問い合わせたりしないようお願い致します。)

JSONをただ引っ張って来てPlayerに渡してるだけだろうと思って、Javascriptの中でsortできないかと少し探りました。

jsはどうも勘が働かず、Firebugsで追ってもいまいち分からず。(そもそも動画サイト毎のプラグインアーキテクチャー的なものとか、なんでニコ動再生できんの?とかいうレベルで分からない。)

やはりサーバーサイドか・・・。

インストール中にチラチラ見えていたMoose?とか、Rose::DBとかHTTP::Engineとか大昔に止まっている俺のPerl脳で理解できるんだろうか。あぁ・・・巨大なモダンPerlが攻めて来る

と思ったら意外に読み易い。(Remedieのソースが綺麗なのかも)

実装方法は違えど、設計はどの言語も似たようなもんで、Rubyで言えばアレか〜って感じで理解し易かった。

Rose::DB::Object::Managerなんて糞便利なもんがあるんですね。(Class::DBIとかで時が止まっている。)

本題。

remedie 0.6.14へのdiffです。

diff --git a/lib/Remedie/DB/Channel.pm b/lib/Remedie/DB/Channel.pm
index da0597f..f2bde7d 100644
--- a/lib/Remedie/DB/Channel.pm
+++ b/lib/Remedie/DB/Channel.pm
@@ -19,7 +19,7 @@ sub items {

     return Remedie::DB::Item::Manager->get_items(
         query => \@query,
-        sort_by => 'id DESC',
+        sort_by => 'id',
         $opts{limit} ? (limit => $opts{limit}) : (),
     );
 }

Remedie: マイリスト FF5 モンク縛り‐ニコニコ動画(ββ)

キタコレ。

これでニコ動の続きモノ動画を大消化大会だ!

追記:

こっちの方がスマート。

Twitter / toshikaz: remedieにゲーム実況などニコニコマイリストを登 …

toshikaz55 remedieにゲーム実況などニコニコマイリストを登録する際に逆順になる場合は、RSSのURLに、/mylist/XXXXXX?sort=d&rss=2.0 とsortを付加してやると順番に登録されて楽に順次再生できる

関連

参照

XPのプラクティスのうちの一つ、“継続的インテグレーション”についての詳細はこちら

要は、

- 継続的インテグレーション

テスト部分も含めて「全てが自動化された」「再現可能な」ビルドを、「日に何度も」行うこと

だそうです。

スクリプト言語だとデプロイはあってもビルドって殆ど無いですよね。なので、

“自動的に日に何度もテストを行うこと”

という風に勝手に縮小理解しました。

継続的インテグレーションについては、CIサーバー(Continuous Integration Server)というやつが沢山あって非常に機能も豊富です。

僕の仕事には少々大げさな気がしたのと、

「cronでsvn up && rakeじゃ駄目なのかしら?」

などと思ったのでそれをちょっとだけサポートするコマンドを作ってみました。

komagata’s saimaa at master – GitHub

インストール

$ sudo gem install komagata-saimaa -s http://gems.github.com

これでsaimaaというコマンドが入りました。

使い方

saimaaは-cでshellで実行したいコマンドを引数に取って実行します。

$ saimaa -c "ls /tmp"

コマンドが成功(0を返す)した場合、何もしません。

$ saimaa -c "ls /tmppppp" 
--project--

--stdout--

--stderr--
ls: cannot access /tmppppp: No such file or directory

コマンドが失敗(0以外を返す)した場合、標準出力にコマンドの標準出力と標準エラー出力を返します。

$ saimaa -c "ls /tmppppp" example
--project--
example
--stdout--

--stderr--
ls: cannot access /tmppppp: No such file or directory

引数はプロジェクト名として認識されます。(このジョブのタイトルみたいなものです)

通知

saimaaは-nで通知のためのコマンドを引数にとって、-cで実行したコマンドの標準出力を標準入力として実行します。 (command | notifier みたいなのと同じです。)

$ saimaa -c "ls /tmppppp" -n "figlet" example
                             _           _
             _ __  _ __ ___ (_) ___  ___| |_
 _____ _____| '_ \| '__/ _ \| |/ _ \/ __| __|____ _____
|_____|_____| |_) | | | (_) | |  __/ (__| ||_____|_____|
            | .__/|_|  \___// |\___|\___|\__|
            |_|           |__/
                                _
  _____  ____ _ _ __ ___  _ __ | | ___
 / _ \ \/ / _` | '_ ` _ \| '_ \| |/ _ \
|  __/>  < (_| | | | | | | |_) | |  __/
 \___/_/\_\__,_|_| |_| |_| .__/|_|\___|
                         |_|
                 _      _             _
             ___| |_ __| | ___  _   _| |_
 _____ _____/ __| __/ _` |/ _ \| | | | __|____ _____
|_____|_____\__ \ || (_| | (_) | |_| | ||_____|_____|
            |___/\__\__,_|\___/ \__,_|\__|

                 _      _
             ___| |_ __| | ___ _ __ _ __
 _____ _____/ __| __/ _` |/ _ \ '__| '__|____ _____
|_____|_____\__ \ || (_| |  __/ |  | | |_____|_____|
            |___/\__\__,_|\___|_|  |_|

 _                                     _
| |___ _    ___ __ _ _ __  _ __   ___ | |_    __ _  ___ ___ ___  ___ ___
| / __(_)  / __/ _` | '_ \| '_ \ / _ \| __|  / _` |/ __/ __/ _ \/ __/ __|
| \__ \_  | (_| (_| | | | | | | | (_) | |_  | (_| | (_| (_|  __/\__ \__ \
|_|___(_)  \___\__,_|_| |_|_| |_|\___/ \__|  \__,_|\___\___\___||___/___/

    ___                                              _   _
   / / |_ _ __ ___  _ __  _ __  _ __  _ __  _ __ _  | \ | | ___
  / /| __| '_ ` _ \| '_ \| '_ \| '_ \| '_ \| '_ (_) |  \| |/ _ \
 / / | |_| | | | | | |_) | |_) | |_) | |_) | |_) |  | |\  | (_) |
/_/   \__|_| |_| |_| .__/| .__/| .__/| .__/| .__(_) |_| \_|\___/
                   |_|   |_|   |_|   |_|   |_|
                _        __ _ _
 ___ _   _  ___| |__    / _(_) | ___    ___  _ __
/ __| | | |/ __| '_ \  | |_| | |/ _ \  / _ \| '__|
\__ \ |_| | (__| | | | |  _| | |  __/ | (_) | |
|___/\__,_|\___|_| |_| |_| |_|_|\___|  \___/|_|

     _ _               _
  __| (_)_ __ ___  ___| |_ ___  _ __ _   _
 / _` | | '__/ _ \/ __| __/ _ \| '__| | | |
| (_| | | | |  __/ (__| || (_) | |  | |_| |
 \__,_|_|_|  \___|\___|\__\___/|_|   \__, |
                                     |___/

最初に実行したコマンドが成功した場合、通知コマンドは実行されません。

$ saimaa -c "ls /tmp" -n "figlet" example

何に使うの?

だからどうした的なコマンドですが、要するに下記の用に使うことを念頭に置いています。

$ saimaa -c "svn up && rake" -n "mail -s '[example] rspec' notify@example.com" example-project

svn upして、rake [spec]が失敗した時だけnotify@example.comにメール飛ばす。

前述のfigletもそうですが、通知コマンドは標準入力を取るコマンドならば何でもかまいません。(growlnotifyとか)

実際のcronの設定としてはこんな感じです。(ossuary=納骨堂のサイトの設定)

$ crontab -l
PATH=/usr/bin:/bin:/usr/local/bin
HOME=/home/deployer
0 * * * * saimaa -c "cd /var/www/test/ossuary && svn up && script/spec spec -f progress" -n "mail -s '[ossuary] rspec' dev@actindi.net" ossuary
10 * * * * saimaa -c "cd /var/www/test/ossuary && svn up && script/cucumber features -s -l ja" -n "mail -s '[ossuary] cucumber' dev@actindi.net" ossuary

毎時間、0分と10分にそれぞれtrunkのコードにrspecとcucumberのテストを走らせています。

密かに $HOME/.saimaa/saimaa.yml にコマンドの実行結果をプロジェクト名毎に保存するようになっています。(今のところ特にインターフェースはありません)

shでワンラインでかけそうな、どうということは無いコマンドですが、僕の中での継続的インテグレーションの要件を一応みたしています。

また、ruby, rubygems, githubの組み合わせは自作コマンドを配布するとても楽な組み合わせなので最近多用しています。

マルチプラットフォームで動くし、Macなら、/opt/local/bin、Debianなら、/usr/bin といったパスの通ったところに配置してくれるし、gemコマンドでインストール、アンインストールも楽です。

もし、興味がおありの方はちょっとためしてみてもらえるとありがたいです。おそらく、開発サーバーに入って30分もあれば継続的インテグレーションが始められる筈です。

僕のRemedieはリビングPCのWindowsXP上のcoLinux上のDebianで動いているので、Microsoft Updateの再起動でcoLinuxも再起動になる。

さて、【ニコニコ動画】破壊神兄弟が「四八(仮)」を実況の続きでも見ようかなと思ったら、Remedieのトップが真っ黒。

ぶっぽるぎゃるぴるぎゃっぽっぱぁーっ!

Twitter / Masaki Komagata: 再起動したらRemedieのフィード全部消えた・・・ …

komagata 再起動したらRemedieのフィード全部消えた・・・死にたい。

自分の作ったソフトウェアで人が死んだら鬱陶しいですよね。 miyagawaさんからヒントを貰ったので調べてみました。

Twitter / Tatsuhiko Miyagawa: @komagata Oops. Anything l …

miyagawa @komagata Oops. Anything left in ~/.remedie/remedie.db? I back it up with TimeMachine and Dropbox

どうもモダンPerl恐怖症があるのか問題に取り組もうとすらしなかったのが良く無かった。

$ locate remedie.db
/home/komagata/.remedie/remedie.db
/.remedie/remedie.db

remedie.dbが二つ・・・。

$ echo "select count(id) from channel;" | sqlite3 /home/komagata/.remedie/remedie.db 
15
$ echo "select count(id) from channel;" | sqlite3 /.remedie/remedie.db 
0

一目瞭然也・・・。

以前のエントリーのinitスクリプトに問題がある。

$ cat /etc/init.d/remedie 
#!/bin/sh
### BEGIN INIT INFO
# Provides:          remedie
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start remedie at boot time
# Description:       Enable service provided by remedie.
### END INIT INFO

case $1 in
  start)
    cd /home/komagata/code/remedie/bin
    sudo -u komagata env HOME=/home/komagata nohup perl ./remedie-server.pl > /dev/null 2>&1 &
    ;;
esac

sudo -uでユーザーkomagataとして起動し、HOMEも/home/komagataに設定してやればOK。

これでリアル世界よりも充実したRemedie生活が認可される

おまけ

Remedieはフィードの動画が連続再生されるのが凄く便利!だけど、新しい順に再生されるので、ニコ動とかでシリーズ物を見つけて、Part.1から順番に見たい時にちょっと不便。これ逆にソートすることできないかな。(これはフィードリーダーでも思う事)

あとで頑張ってソース見てみようと思いますが、そんなん簡単だと言う方がいれば教えて頂ければ幸いです。

ポット使ったら「バチッ」とかいって電源タップが壊れた。と同時にTime Machine用に使ってた裸族の二世帯住宅(RAID-1)の片方も壊れた。

裸族の二世帯住宅

でかいし、うるさいし、面倒臭いのでTime CapsuleをAmazonで衝動買いしました。

Time Capsule

実物は結構面積ありますね。ネットワーク機器は重ね置きして、熱で何個も壊してるので重ねないでおこう・・・。

Apple Time Capsule 1TB MB765J/A
ハンディーカーネギー・ベスト (3冊セット)

所謂自己啓発本の古典だけど、たまに読み返したくなるので文庫セット買いました。(小さい箱に入っていてかわいい)

もう定年退職した僕の親父は郵便局の主にセールスの管理職として長年過ごした。(郵便貯金とか簡易保険とか)

ある時、「管理職の秘訣は?」と聞いたら、答えがカーネギーが「人を動かす」の中で繰り返し繰り返し書いている実例の一つみたいで面白かったので紹介します。

郵便局の課長や局長といった管理職は2〜3年?ぐらいで各地の局を点々とするそうで、定期的にまったく新しいメンバーと環境に入って行ってグループ全体の売上を上げるのが仕事です。

そこでまず必ずやることは、

「一番成績の悪い人達を褒めて、励ます。」

だそうです。

具体的には、どこの組織でも必ず成績の悪い集団があるので、その人達と飲みに行って、褒めて、励ますそうです。

「郵便局員であるということは全員、公務員試験を合格してきているはず。そんな優秀な人達ならばちょっとやり方を変えるだけで成績があがる筈だ。」

そして、日報(的なもの?)でのその日の行動に対して、褒めて、励ます。

「今回は残念だったが、2週間に1度くらい用が無くても顔を出してみたらどうかな。」

とか

「見込みの高いお客様のリストを作って、そこを重点的に回れば楽かもしれない。」

といったような普通のアドバイスをその人達に重点的にするそうです。

元々、最悪の成績だったので成績は伸びるしかないし、成績が伸びれば本人も嬉しくてやる気が出る。成績の悪かった集団に改善が見られると、グループ全体の雰囲気も良くなり、皆自発的に行動するようになる。そうです。

公務員に自発的な行動を促すとかとてつもなく難しいんじゃないかと思ってましたが(偏見)、親父曰く、

「公務員といっても人間。成績が悪ければ居心地が悪いし、成績が上がれば嬉しい。」

基本中の基本、大事にしなきゃいけないなあと思いました。

最近疑問に思ってる事。

「プログラミングについてブログを書く事は寒い。」

とか、

「非効率で無意味な行為だ。メリットが無い。」

とか、

「何か僕の知らない別の場所でアウトプットしてる。」

とか、

「規則で公開出来ない。」

とか、そういう風潮があるんでしょうか?

ここ2〜3年?でとても有益な情報を発信してくれていて、勉強になるし、更新をいつも楽しみにしているようなブログがどんどん更新が無くなっている様な気がするんです。

「プログラマーとして成長する = ブログを書かなくなる」

みたいな雰囲気がするんです。

「お、このブログは面白いからフィードリーダーに登録しよう!」

というブログはもちろん日々、沢山発見します。でも大体がコンピューター系の学生の人だったりするんです。

社会人になってプログラマーとして仕事がある程度認められると他者からの承認欲求が満たされるのでブログを書く必要が無くなるんでしょうか?

ちょっとぶっちゃけたところの話が聞きたいです。

CLでローカルに立てたWebサーバーの更新は出来たけど、会社のブログはリモート。そこに接続して更新する方法を覚える必要がある。

AllegroServeを立てて、ブログ用のマクロや関数を書いてくれたg000001さんにやり方を聞こうかなと思ったらSkypeにいない!!

これは「教わろうとするな、盗め!」ということに違いない。厳しス。

ssh port forwarding

とりあえず、ブログのサーバーに入って何番でSWANKサーバーが立ち上がってるのか知る必要がある。

netstat -tlnで見てみた。

Redmineと同居してるのでApacheもあるけど(仕方ないね・・・)、8888番がAllegroServeで、多分4005番ってのがSWANKだろう。

4005番を開け放つ訳にはいかないのでローカルの14005番をリモートの4005番にsshでforwardする。

% ssh -N -f -L 14005:localhost:4005 tech.actindi.net

(-fはバックグランド実行、-Nはトンネリングだけするオプションだそうです。)

リモートのSWANKサーバーに接続

EmacsからM-x slime-connectするとhostとportを聞かれるのでlocalhost, 14005をそれぞれ入力すると、

; SLIME 2008-12-25
ACTINDI>

というプロンプトが。

エントリーを評価する

g000001さんがブログエントリー用の関数をたしか書いてたはず。homeディレクトリにblog.lispというそれっぽいファイルがありました。

(in-package :actindi)

(let ((date (encode-universal-time 0 0 0 21 2 2009)))
  (defentry (format nil "/~A" date)
      (:title "ブログはじめました" 
              :author "komagata" 
              :date date
              :category "システム管理")
    "本文"))

in-packageというのは確か実践CommonLispに出て来た。多分import的な奴だと思う。:actindiパッケージにdefentryという関数が定義されてるんだろう。本文はhtml-generatorと同じ記法かな?

適当なバッファで始めてのエントリーを書いて、C-M-xで評価。

アクトインディ技術部隊報告書

アクトインディ技術部隊報告書

出来た!

後でもっとスマートなやり方を聞こう・・・。

参照: