kaeruspoon

ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応: 田中 康博,林 拓也: 本

ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応

「ActionScript 3.0 逆引きクイックリファレンス Adobe Flash CS3対応」を買いました。
いろいろ遊んでみようと思います。

どこでも使えるお気に入り、「どこでもお気に入り」を作りました

どこでもお気に入り

 ひさしぶりに新しいサービスを作ってみました。
 「どこでもお気に入り」は、ブラウザのお気に入り(ブックマーク)とほとんど同じ機能のものです。オンラインサービスなので、自宅でも会社でもどこでも自分のお気に入りを使うことができるようになります。
 ブラウザのお気に入りとひとつだけ違うところがあって、それはお気に入りに登録しているサイトで更新がされると、自動的に既リンクの色(紫)から未リンクの色(青)に変化して表示されるようになるところです。これで、お気に入りの中のどのサイトが更新されているのかが一目瞭然となります。
 
 こういうのってRSSリーダー使えばいいようにも思えるのだけど、RSSリーダーを使わないような普通の人のためのサービスを作ってみたかったのです。ユルさんのインターネットの使い方を大いに参考にさせてもらいました。

しばらく、livedoor reader から「どこでもお気に入り」に変えてみようかと思います。

インターネットは楽しい

どこでもお気に入りを使い始めてすぐに気づいたのだけど、いろんなサイトを見て回るのは実に楽しい。livedoor reader の質素な画面ばかり見ていたのが、いまでは監獄にいたかのような気分なのだ。ひとつひとつ訪問して閲覧していくことは効率は悪いかもしれないけど、いろいろなデザインを楽しむことができる。想像もしていなかったのだけど安らぎに近いものすら覚えるのだ。インターネットってけっこう楽しいぞ、と思い直している今日この頃である。

ubuntu8.04でデュアルディスプレイを使う

昔はすごく苦労しながらxorg.confをいじくっていましたが、いまでは素晴らしいことにほとんどGUIでデュアルディスプレイの設定ができてしまいます。
基本的には、「システム」-「設定」-「画面の解像度」でOK。スクリーンのクローン化のチェックボックスを外せば、その時点で認識されているディスプレイが表示されて、解像度や、さらには位置関係までドラッグして設定することができます。
ひとつだけ問題なのが、スクリーンの仮想サイズの設定がxorg.confに必要なこと。これをしないと、デュアルディスプレイになりません。
/etc/X11/xorg.confの"Screen"セクションに以下の"SubSection"を追加します。

Section "Screen"
        Identifier      "Default Screen"
        Monitor         "Configured Monitor"
        Device          "Configured Video Device"
        SubSection "Display"
                          Virtual         2304 800
        EndSubSection
EndSection

"Subsection"の"Display"で、スクリーンの仮想サイズを指定してあげます(ぼくの環境は1280x800と1024x768のディスプレイが横並びになっています)。
GUIを使わなくても、xrandrというコマンドを使えば設定可能です。

xrandr --output VGA --mode 1024x768 --right-of LVDS

こんな感じで直感的に指定できて、さらには再起動も必要ありません。素晴らしい。もうWindowsを使う意味がどんどんなくなってくるな。

RailsとPostfixで受信メールを処理する方法

Railsで受信メールを処理する方法はけっこう簡単です。HowToReceiveEmailsWithActionMailerに書かれていることがすべてといってもいいでしょう。
ここではPostfixを使った方法を書いておきます。

1.Postfixのインストール

aptitude install postfix


2.受信メールを処理するコードをapp/modelsの下に置く。

  class KaeruMailman < ActionMailer::Base
    def receive(email)

    ...ユーザ認証したりメールの内容をDBにインサートしたりといった処理...

    end
  end


3./etc/postfix/master.cfの最後に、下記を追加する。

kaeruspoon-mailman  unix  -       n       n       -       -       pipe
  flags= user=tsukasa argv=/usr/bin/ruby /var/www/rails/kaeruspoon/script/runner -e production KaeruMailman.receive(STDIN.read)

userはRailsを実行しているユーザにします。KaeruMailmanのrecieveはインスタンスメソッドとして定義しますが、ここではクラスメソッドとして書きます。内部でインスタンスが勝手に作成されて、recieveメソッドが呼ばれるのです。

4./etc/postfix/main.cfの最後に、下記を追加する。

transport_maps = hash:/etc/postfix/transport
virtual_mailbox_domains = kaeruspoon.net

受け付ける受信メールのアドレスでユーザ認証を行う場合などは、local_recipient_mapsを無効にしておく必要があります(UNIXユーザ以外のメールアドレスは拒否されるから)。

local_recipient_maps =


5./etc/postfix/transportに(ファイルがなければ作成して)、下記を追加する。

kaeruspoon.net    kaeruspoon-mailman:

これでkaeruspoon.netドメインのメールを受信したときは、master.cfで設定したkaeruspoon-mailmanのコマンドを実行するようになります。
上記設定を有効にするために下記コマンドを実行します。

postmap /etc/postfix/transport


これで設定完了です。/var/log/mail.infoをチェックして、受信したメールが正しくRailsに渡されているかどうかを確認できます。

Mysql で、ランダムにレコードを取り出す方法

ActiveRecordで、テーブルからランダムにレコードを取り出すときは、

user = User.find(:first, :order => "RAND()")

みたいにすればいい。SQLは

select * from users order by RAND() limit 1;

というような感じになる。

ただし、レコード数が大きくなると、この order by RAND() がかなり遅くなってしまう。そのときは、ランダムなid値をアプリ側で用意して、

user = User.find(:first, :conditions => ["id = ?", rand_id])

みたいにするといい感じ。
また、selectで取り出すカラムを最小限に抑えると、結構はやくなったりするので、アプリの修正が面倒なときはこれを試してみてもいいかも。

user = User.find(:first, :select => "id", :order => "RAND()")

hidden要素の内容をPOSTすると、改行が半角スペースになってしまうときの対処

確認画面などを経由して投稿するシステムを作るとき、たいていはデータをhidden要素に入れてPOSTすると思います。このとき、value値の中の改行が半角スペースに変換されてしまうことがあります(特に携帯とか)。
いろいろ対処方法はあると思うのだけど、僕は単純に改行コード自体を特殊な記号に変換しておいて、POSTの受付側でそれをデコードするという方法をよく使います。

とあるviewで、

<% @article.body = return_code(@article.body) %>
<%= hidden_field :article, :body %>

みたいにしておいて、POSTの受け側のアクションで

params[:article][:body] = return_code(params[:article][:body], :decode)

というように、処理の前にデコードしておきます。
return_codeメソッドは

  def return_code(text, mode = :encode)
    if mode == :encode
      text.gsub("\r\n", "[kaeru:ret-rn]").gsub("\r", "[kaeru:ret-r]").gsub("\n", "[kaeru:ret-n]")
    elsif mode == :decode
      text.gsub("[kaeru:ret-rn]", "\r\n").gsub("[kaeru:ret-r]", "\r").gsub("[kaeru:ret-n]", "\n")
    else
      text
    end
  end

こんな感じ。app/controller/application.rbで定義しておいて、

helper_method :return_code

と宣言しておけばcontrollerでもviewでもどこでも使えます。

携帯での数字キーによるショートカットリンクを、Railsで簡単に使う

携帯だと、数字キーによるショートカットってすごく便利……というか、使えないと不便なくらい大事な機能だと思います。
でも、キャリアによってリンクの作り方が違っていたりして面倒です。なので簡単に使えるヘルパを作ってみました。ちなみにjpmobileの使用が前提です。

  DOCOMO_NUM = ['&#63888;', '&#63879;', '&#63880;', '&#63881;', '&#63882;', '&#63883;', '&#63884;', '&#63885;', '&#63886;', '&#63887;']
  AU_NUM = [325, 180, 181, 182, 183, 184, 185, 186, 187, 188]
  SOFTBANK_NUM = ['&#57893;', '&#57884;', '&#57885;', '&#57886;', '&#57887;', '&#57888;', '&#57889;', '&#57890;', '&#57891;', '&#57892;']

  def number_link_to(num, title, path)
    case request.mobile
    when Jpmobile::Mobile::Docomo
      DOCOMO_NUM[num] + link_to(title, path, :accesskey => num)
    when Jpmobile::Mobile::Au
      %Q|<img localsrc="#{AU_NUM[num]}">| + link_to(title, path, :accesskey => num)
    when Jpmobile::Mobile::Softbank
      SOFTBANK_NUM[num] + %Q|<a href="#{path}" DIRECTKEY="#{num}" NONUMBER>#{title}</a>|
    else
      link_to(title, path)
    end
  end

使用方法は

<%= number_link_to(6, "次へ", article_path(@next_article) %>

みたいな感じで、link_toみたいに手軽に使えます。数字の絵文字は、実際にはバイナリコードとかのほうがいいかもしれません(docomoとか)。

バージョン管理をsubversionからgitに移行してみた

kaeruspoon関連のソースコードはsubversionでバージョン管理していますが、ウワサのgitを使うことにしてみます。

参考:せっかちな人のためのgit入門

環境はubuntu8.04。まずはgitのインストール。

sudo aptitude install git-core


gitsubversionみたいにレポジトリがひとつではなく、あらゆる環境で分散して管理します。つまりローカルにもレポジトリが存在することになるので、ノートパソコンを持って飛行機の中でも電車の中でも開発ができるということ。subversionとsvkをくっつけたような感じですね。
とりあえず、ローカル環境でレポジトリを作ります。

cd ~/devel/kaeruspoon
git init

.gitというディレクトリが作られます。

ではkaeruspoonをコミットしてみよう。コミット前にsubversionの.svnディレクトリを削除しておきます。

find . -name .svn -exec rm -fr {} \;

それからコミット。

git add .

と、思ったら

*** Your name cannot be determined from your system services (gecos).

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident  <tsukasa@blue
.(none)> not allowed

なにか怒られた。
どうもコミットする者の名前を登録しておく必要があるらしい。

git config --global user.email "tsukasa@example.com"
git config --global user.name "tsukasa"


気を取り直してコミット

git add .
git commit -m "kaeruspoon commit"

subversionと同様に、-mオプションをつけなければエディタが立ち上がってそこにコメントが書けます。
ぼくの環境ではデフォでnanoがエディタとして選択されたので、~/.zshrcに以下の行を追加してvimを使うように指定しておきました。

export GIT_EDITOR=vim


それからサーバ上にリモートレポジトリを作ります。サーバの環境はdebianなんだけど、微妙にコマンドが違う。なんでだろう。

cd /var/git/kaeruspoon
git init-db


それからローカルに戻って、ローカルのレポジトリをリモートレポジトリに反映させます。

git remote add origin ssh://silver/var/git/kaeruspoon
git push origin master 

このpushが、subversionでいうcommitみたいな感じ。
逆にpullコマンドでリモートレポジトリをローカルに反映させることができる。こちらは update か。

webサーバに、ローカルレポジトリを作って、リモートレポジトリの内容を反映させてみよう。

cd /var/www/rails/
git init-db
git clone ssh://silver/var/git/kaeruspoon

これで環境構築は完了。

では開発・コミット・webサーバへの反映の一連の流れをやってみよう。
どこかのソースを修正したあとに

git status

で状態の変化を確認し、

git diff

で実際の変更箇所を確認できる。このあたりはsubversionと同様。
で、ローカルレポジトリへのコミット。

git commit -a

コミットログは

git log

で確認できます。
さて、リモートレポジトリへの反映。

git push origin master

それからwebサーバ上で

git pull origin master

これですべて完了です。

Railsアプリをgitで管理するときのやり方

新規にRailsアプリを作るときのgitでの管理の仕方について自分メモ。

1.Railsアプリの作成

$ rails testapp
$ cd testapp

2.ローカルレポジトリの作成とRailsアプリのコミット

$ git init
$ git add .
$ git commit

3.ログファイルを無効にする

$ rm log/*.log
$ git commit -a

log/.gitignoreファイルに以下の行を書き込んで保存する。

*.log

それからコミット

$ git add log/.gitignore
$ git commit -a

4.tmp以下のファイルほ無効にする
tmp/.gitignoreファイルを作成し、以下の行を書き込む。

*
!.gitignore

そしてコミット

$ git add tmp/.gitignore
$ git commit -a

5.database.ymlの無効化

$ cp config/database.yml config/database.example.yml
$ git add config/database.example.yml

config/.gitignoreファイルを作成し、以下の行を追加。

database.yml

コミット

$ git add config/.gitignore
$ git commit -a


こんな感じです。

URLなど、長い英字を折り返して表示する方法

webサイトを作っているとよく出会う問題です。日本語は指定された幅を越えると勝手に行を折り返してくれるけど、URLみたいに長い英文は折り返さずに指定した幅を越えて右側に伸びてしまいます。これはカッコ悪いし読みにくい。
一番簡単な解決方法は、一文字ごとに <wbr/>タグを入れてあげるというもの。Rubyで書くなら

 text.scan(/./) * "<wbr />"

こんな感じです。

居酒屋でごちそうになる

さあ、お家に帰ろう、などと言いながら、同僚のプログラマの方におごってもらってみんなで居酒屋にいきました。みんなが退職するのでお別れ会みたいなものですが、普通の飲み会でした。もっと、こういう飲み会を月一でもやっておけばよかったなあと思わないでもありません。とりあえず、「マクロス」と「大きく振りかぶって」を観ろと勧められました。楽しかった。

超いまらながら、Railsのソースを読んでいます

いまさらながらなのですが、Railsのソースコードを読んでいます。ウワサに違わぬ綺麗さですね。ひとつひとつのメソッドがコンパクト。10行越えてるのってめずらしいくらいです。
ひとつだけ気になるのが、修飾子としてのifやunless。一行におさめるには長すぎるとき、

people.go_to_spaceship if
  the_earth.blank?

みたいな感じで2行にしているところがちょっと違和感。ぱっと見た感じだと、ふたつのセンテンスだと錯覚しそう。
こういうときぼくは、

if the_earth.blank?
  people.go_to_spaceship
end

みたいにして書いてしまう。どっちがいいのかな。

友だちの現在位置がわかるサービス「いまどこ」をリリースしました。

いまどこ

友だちの現在位置を、方角と距離で知ることができるサービス「いまどこ」を作ってみました。マップまで表示してくれる似たようなサービスがすでにあるのだけど、あえてシンプルに方角と距離のみの情報をメールで送信するようにしてみました。
それだけだとさびしいので、近くにあるお店の情報もついでにお知らせするようにしています。こちらは食べログのAPIを利用させてもらいました。

これはGPS付き携帯のみに対応しているサービスなのでPCからアクセスしても利用できません。また、AUでしかテストをしていないので、他のキャリアではバグがあるかもです。