フィヨルドブートキャンプのカリキュラムでlsをrubyで実装するというのがあるんですが、パーミッションの八進表記を記号表記(symbolic notation)に変換する部分をどう実装するのがベターなのかなというのを悩んでおります。

rubyのFile::Statで取れるのは八進表記。

$ ruby -e 'printf "%o\n", open("./foo").stat.mode'
100644

これを記号表記 -rw-r--r--に変換したい。

このrとかwとかがどこで定義されているのかがわからなかった。

何か共通の定義があってrubyでも簡単に読み込めるならそれを使うべきだし、本物のlsでもプログラム中で個別に定義してるならruby内で自分も定義して使っちゃっていいのかなと考え、macのソースコードを調べてました。

twitterで@massoさんなどに助言をいただき調べたところ、Libcのstrmodeの中に書いてありました。(lsもstrmodeを使って表示している)

strmode.c

    /* usr */
    if (mode & S_IRUSR)
        *p++ = 'r';
    else
        *p++ = '-';
    if (mode & S_IWUSR)
        *p++ = 'w';
    else
        *p++ = '-';
    switch (mode & (S_IXUSR | S_ISUID)) {
    case 0:
        *p++ = '-';
        break;
    case S_IXUSR:
        *p++ = 'x';
        break;
    case S_ISUID:
        *p++ = 'S';
        break;
    case S_IXUSR | S_ISUID:
        *p++ = 's';
        break;
    }

chmodなどはこれを使ってなくて直接chmod.cに書いてあったりしました。

今のところrubyから簡単にstrmodeを使う方法もなさそうなのでrubyコードの中に自分で定義しちゃうのでいいのかなというのが現状です。

もし「こういう方法が一般的 or スマート」というのをご存知の方がいらっしゃったらtwitterの@komagataまで教えていただければありがたいです〜。

$ curl -x http://proxy.com:8080 http://example.com

port指定しないとデフォルトでは1080番にアクセスしに行く。知らないとハマって死ぬ。

おまけ

SSLの証明書とパスワード付きでアクセスする。cert.pemはprivate keyとclient certをconcatinateしたもの!これを知らない者は死ぬ!

$ curl -x http://proxy.com:8080 -E cert.pem:password http://example.com

Railsアプリで画像添付メール経由で画像を受け取りたい。(ガラケーとか)

/etc/aliases:

foo: "| cat $1 > /tmp/foo"

これだとファイルのownerがnobodyとかになっちゃうので.forwardを使う。

/home/unk/.forward:

"| cat $1 > /tmp/foo"

Railsでメールを受け取る

Railsでメールを受け取りたい。railsをCLIから呼び出すにはrails runnerを使う。しかし、railsコマンドはRAILS_ROOT外ではrails new用の動きをするので困る。

しかし、その為にあるのかも知れないscript/railsを使えばOK。

rvm経由で呼び出すと相当長くなる。

"| BUNDLE_GEMFILE=/var/www/foo/current/Gemfile /home/unk/.rvm/bin/rvm ruby-1.9.2p290@foo exec bundle exec /var/www/foo/current/script/rails runner 'PictureMailer.receive(STDIN.read)' -e production"

しかしまだ画像ファイルが600で作成されるという問題が残る。下記の様にchmodするようにしてもいいけど、umaskを変更する方がいいかも。

mod_passenger利用時の注意点 - komagata

"| umask 0022; BUNDLE_GEMFILE=/var/www/foo/current/Gemfile /home/unk/.rvm/bin/rvm ruby-1.9.2p290@foo exec bundle exec /var/www/foo/current/script/rails runner 'PictureMailer.receive(STDIN.read)' -e production"

umaskは子プロセスに引き継がれるのでPaperclip経由で出来るファイルもこれで644になる。

Title is all. (via @milk1000cc)

Webサーバーを立ち上げつつブラウザを開く簡単な方法は無いだろうか?

要はRailsで言えばこんな感じのことがやりたい。

#!/bin/sh
rails s
open http://localhost:3000/

Webサーバーは立ち上がりっぱなしなのでopenは走らない。バックグラウンドにしてもWebサーバーの起動には多少(1秒ぐらい)時間が掛かるのでopenもちょっとした待ち合わせをしなくちゃいけない。

(゚Д゚ )アラヤダ!!っていう簡単な解決方法がある気がするんだけど思いつかない・・・。