テーブルから「最後のレコード」を取得する

ActiveRecordで「first」があるのは知ってたけど「last」があるのは知らなかった。
「モデル名.first :order => 'id DESC'」みたいに書いてた。
「モデル名.last」でいけるっぽい。

こう書くだけで動けばいいのに!と試してみると、大抵動く。やはりRailsはすごいです。

Rails2系でメールの日本語化

運営中のサービスでユーザーさんから「メールのタイトルが文字化けしてるヨ!」という連絡がありました。
そういえばメールの文字化け対策は何もしてないので、Outlookとかでは文字化けするだろうなー。
ということで対策してみました。

2時間くらいかかるかと思いきや、ActionMailerJaのおかげさまで、ものの数分で対策完了。
いやー、すごい!ありがたい!

ActionMailerJa
http://github.com/kusakari/actionmailer_ja

Rails.rootなディレクトリから下記のコマンドを打つだけでした。

ruby script/plugin install git://github.com/kusakari/actionmailer_ja.git

gitが入ってない場合はgithubのページからダウンロードしてくるといいかと。

Twitterのつぶやきフォームのように入力文字数を動的にカウントする

今、Twitterライクなつぶやきサービスを作っています。
フォームのところでTwitterみたいに文字数のカウンターをつけたい、
ということでズバリなPluginを教えてもらいました。

jQuery plugin: Simplest Twitter-like dynamic character count for textareas and input fields
http://cssglobe.com/post/7161/jquery-plugin-simplest-twitterlike-dynamic-character-count-for-textareas


(0)ダウンロード
上記のURLにアクセスして、メイン画像の下の「Download plugin」をクリック。
zipを解凍して jquery.js と charCount.js をブラウザがアクセスできる場所に置きます。


(1)HTML
jsをインクルードします。



HTMLにカウンター用のタグを書きます。

<span class="counter"> 


(2)カウンター起動のスクリプトを書く

<script type="text/javascript">
//


(3)CSSの編集

form .counter{
	font-size:20px;
	font-weight:bold;
	color:#ccc;
	}
form .warning{color:#600;}
form .exceeded{color:#e00;}


細かく設定することもできるみたいですが、以上の手順でそれなりに動きます。

Thank you Mr. Alen!
http://twitter.com/cssglobe

テキスト内のURLをリンクにしたり、エスケープしたり。

Railsのヘルパーを使って、

  • HTMLエスケープ
  • 改行をBRタグに変換
  • URLをリンクにする
  • URLが長かったら後ろを「...」で省略する
  • リンクは別ウィンドウで開くようにする

という処理を書くと以下の通り。

auto_link(simple_format(h(status.message)), :all, :target=>"_blank") {|text| truncate(text, 30)}

MobilePictogramConverterをiPhoneに対応させてみる。

CakePHPで携帯サイトを作っています。
このサイトをiPhoneにも対応させたのですが、携帯で入力した絵文字がiPhoneで表示されない。。。

キャリア間の絵文字変換にはMobilePictogramConverterを使わせてもらっていますが、
これをiPhoneに対応させてみました。

MobilePictogramConverterの使い方について

編集対象は「MobilePictogramConverter/Carrier/common.php」です。

ファイル先頭の定数定義に以下を追加します。
(変換先キャリアにiPhoneを追加。)

  define('MPC_TO_SOFTBANK', 'SOFTBANK');
+ define('MPC_TO_IPHONE', 'IPHONE');
  /* 変換後の絵文字体系 */

UserAgentからキャリアを割り出す正規表現iPhoneを追加。

  var $mobile_user_agent = array(
    'DoCoMo'   => '/^DoCoMo\/\d\.\d[ \/]/',
+   'iPhone'   => '/iPhone/',
    'SoftBank' => '/^(?:(?:SoftBank|Vodafone|J-PHONE)\/\d\.\d|MOT-)/',

自動変換用のメソッドにiPhone用の設定を追加

 function autoConvert($toCharset = null)
 {
     $useragent = $_SERVER['HTTP_USER_AGENT'];
     if (preg_match($this->getRegexp('DoCoMo'), $useragent)) {
         $to     = MPC_TO_FOMA;
         $option = MPC_TO_OPTION_RAW;
+    } elseif (preg_match($this->getRegexp('iPhone'), $useragent)) {
+        $to     = MPC_TO_IPHONE;
+        $option = MPC_TO_OPTION_RAW;

変換テーブルを指定するコードのiPhone対応

 function encoder($data)
 {
     $buf  = '';
     $to   = $this->getTo();
+    $c    = ($to == MPC_TO_EZWEB) ? 'e' : (($to == MPC_TO_SOFTBANK || $to == MPC_TO_IPHONE) ? 's' : 'i');

ソフトバンク向けの変換コードの中のiPhone対応。

 function s_options_encode($dec)
 {
     switch($this->getOption()) {
         case MPC_TO_OPTION_RAW:
             list($hex1, $hex2) = sscanf(dechex($dec), '%02s%02s');
(中略)
             $char3 = $dec2 + $num;
             $buf   = pack('C*', 0xEE, $char2, $char3);

+            if($this->getTo() == MPC_TO_IPHONE){
+              $buf = bin2hex(mb_convert_encoding($buf, 'unicode', 'UTF-8'));
+              $buf = "&#x{$buf};";
+              break;
+            }
             
             if ($this->getFromCharset() === 'SJIS') {...

※ MobilePictogramConverterの本家って現在はリンク切れしてますね。。。
いいモジュールなんで、メンテがとまってしまって残念です。
でもまあ、絵文字変換モジュールのメンテって、細かい問題がいっぱいあって大変なんでしょうねー。

restful-authenticationの自動ログインの期限を延長する方法

ログインフォームで「次回から入力を省略する」にチェックするとログインしっぱなしになる、
という機能はよくあります。

railsのrestful-authenticationにも「remember_me」という名前で実装されています。
但し、この機能「30日間限定」で実装されている様子。
ログインしてから30日経つとログアウトしてしまいます。

mixiなどのコミュニティサイトの仕様を観察したところ、
クッキーの期限を「3年」くらいに設定している様子。

そこで remember_meの期限を「3年」に延長して対応することにしました。
コードの差分は以下。

vendor/plugins/restful-authentication/lib/authentication/by_cookie_token.rb

def remember_me
 # remember_me_for 30.days
 remember_me_for 3.years
end

そんな感じ。