using jQuery in Rails

公開日時 okkez Sat, 20 Feb 2010 02:00:00 GMT

最近 Rails で作っているウェブアプリケーションでは jQuery を使うようにしている。 なんとなくこうすれば良さそう、というのがわかってきたので書いておく。

google の jsapi を使う。 どこかのブログで見つけたコード片をちょっと変更したやつ。

module ApplicationHelper

  def google_jsapi_tag
    '<script type="text/javascript" src="http://www.google.com/jsapi"></script>'
  end

  def google_load_tag(name, version)
    %Q|<script type="text/javascript">google.load("#{name}", "#{version}");</script>|
  end

end

layout では以下のようにする。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <%= google_jsapi_tag %>
    <%= google_load_tag 'jquery', '1.3' %>
    <%= google_load_tag 'jqueryui', '1.7' %>
    <%= javascript_include_tag 'application' %>
    <%= yield :head %>
    <%- javascript_tag do -%>
      jQuery(function($){
        if (navigator.cookieEnabled) {
          $("#cookie_check").hide();
        } else {
          $("#cookie_check").show();
        }
        <%= yield :script %>
      });
    <%- end -%>
    <%= stylesheet_link_tag 'application' %>
    <%= stylesheet_link_tag 'jquery-ui-1.7.2.custom' %>
    <title><%= @title %></title>
  </head>
  <body>
    <!-- 略 -->
  </body>
</html>

こうしておくと view では以下のように書くことができる。

<%- content_for :script do -%>
$("a#hoge").click(function(event){ /* なんか処理 */});
<%- end -%>

global な名前空間を汚さないし、割と短く書けるし気に入っている。

Posted in ,  | タグ , , ,  | コメントはありません | トラックバックはありません

Let'snote CF-Y4 with SSD

公開日時 okkez Tue, 16 Feb 2010 01:58:00 GMT

Debian を入れてもう5年ほど使っている Let’snote CF-Y4 がどうにも遅くなってきたのでSSDに換装する事にした。 使ったSSDはこれ。

この辺を参考にした。

Let’snote テンプレによると、今回使った Transcend の SSD は JMicron のコントローラを使っているので Let’snoteとは相性が悪いらしい。まあ、参考サイトの二番目のように動いている例もあるのだから大丈夫だろうと思って購入した。 結果的にはうまく動いていると思うが、なかなかに紆余曲折があった。

最初に換装した時には、そのままではBIOSレベルで認識しなかった。 で、色々調べて、SSD No1ピン プルアップ/Ochibi-net を見つけたので真似してみることにした。 しかし、電子工作に必要な工具類は全く持ってなかったので、友人に助けてもらった。 もちろん半田付けも友人にやってもらった。お礼兼夕食としてお寿司の出前を取った。

それでも認識しなかったので、SSDが生きていることを別のマシンにつないでチェックしてもらった。 ついでに、元のHDDに戻してもHDDを認識しなかった。

終電の時間だったので諦めて帰宅したのだけど、ふと思いついてSSDを接続しているコネクタをよく見てみたら、表裏どちらでも挿すことができる形状になっていた。「これは!」と思って裏表入れ替えて再接続して確認したらBIOSで認識した。

結論

Let’snote CF-Y4 を SSD に換装するのは可能だけど、ちゃんといろいろ確認して作業しないと思わぬトラブルになりますよ、と。

あと、Let’snote CF-Y4 の場合はプルアップ無しでもうまく動くかもしれません。

Posted in ,  | タグ  | コメントはありません | トラックバックはありません

org-mode を使ってみた

公開日時 okkez Fri, 18 Dec 2009 14:36:00 GMT

るびきちさんのところを見て、良さそうだと思ったのでやっと org-mode を使ってみている。

この辺。

今のところ、 org-remember を使って TODO 管理しかしていないけど、テキストファイルに 書くだけでいいというのが気に入っている。

複数マシン間のデータの共有には自宅サーバに git レポジトリを用意して共有するようにしているが、 公開しても問題ないデータなら gits や github でもいいかも。 # dropbox とかでもいいかもしれないけど、なんか信用できないので自分の自由になるところに置いてる。

上記三つ目のリンク先で紹介されている祝日表示の方法がよくわからなかったので 、試行錯誤した結果 ~/memo/agenda.org に以下のように書くとうまく表示できた。

* Calendar
%%(org-calendar-holiday)
* Inbox
** TODO ほげほげをする

で、わからないことがいくつかあって未解決。

  • TODO -> DONE に変更したあと非表示になって欲しいのだけど今のところ方法がわからない
  • deadline を設定したいのだけどカレンダーは表示されるが、エラーが出て設定できない
Debugger entered--Lisp error: (invalid-function increment-calendar-month)
  increment-calendar-month(7 2009 -1)
  calendar-mark-weekend()
  run-hooks(today-visible-calendar-hook)
  byte-code("....."
  generate-calendar-window(7 2009)
  calendar-basic-setup(nil)
  calendar()
  byte-code("....
  org-read-date(nil to-time nil nil nil nil)
  byte-code(".....
  org-add-planning-info(deadline nil closed)
  org-deadline(nil)
  call-interactively(org-deadline)
  • key-chord.el で設定した同時押しが全く効かなくなることがある (起動直後は効く。時間が経つと効かなくなる。)

Posted in  | タグ  | コメントはありません | トラックバックはありません

Debian sid with nvidia

公開日時 okkez Thu, 15 Oct 2009 05:49:00 GMT

Debian sid を使っているとたまに Kernel を更新する必要がある。単純に Kernel を更新してしまうと X が起動しなくなってしまい困る。そのときの更新方法をいつも忘れるので自分用のメモとして書いておく。

# 更新後の kernel で起動する
$ sudo m-a auto-install nvidia
$ sudo aptitude update && sudo aptitude safe-upgrade # nvidia-glx を更新する
$ sudo shutdown -h -r now

手順自体は上記の通りいたって簡単。更新後の kernel で起動してからモジュールを入れ直すだけ。

Posted in ,  | タグ ,  | コメントはありません | トラックバックはありません

I got a new machine.

公開日時 okkez Fri, 18 Sep 2009 15:08:00 GMT

自宅用に新しいマシンを組んだので適当に記録しておく。

  • CPU: AMD Phenome II X4 905e
  • MEM: DDR3 1333MHz の 2GB*2 * 2
  • M/B : Gigabyte MA770T-UD3P
  • G/B: Gigabyte GeForce 9600GT
  • HDD: seagate の SATA2 の 500GB
  • ケース : Cooler Master Sileo 500
  • 電源 : 超力 500W
  • 光学ドライブ: pioneer のバルク

こんな感じで組んで 80k+ でした。

あとディスプレイが iiyama の ProLite E2608WS で \26,800- くらいでした。

ちょっとインストールに手間取ったけど、動きはじめてからはすごく快適です。 Let’s note でちょっともたついてた勉強会の資料作成もこのマシンなら一瞬です。 ロードアベレージが 3.0 を越えても操作感がほとんど変わらないのはすごいです。

あとは仮想マシンを入れて Android の開発環境を作ればいいだけです。

Posted in  | コメントはありません | トラックバックはありません

IMAP4 over SSH tunnel

公開日時 okkez Tue, 07 Jul 2009 10:40:00 GMT

Dovecot + fetchmail + procmail だけで出来た。

MUA は sylpheed2.6.0 を使っている。

インストール

サーバに必要なパッケージをインストールする。

$ sudo aptitude install dovecot fetchmail procmail

aptitude で一発。

Dovecot の設定

SSH トンネルを通すので認証やセキュリティに関してはゆるゆるの設定にしてある。

fetchmail の設定

man fetchmail を見ながら書いた。

set daemon      1800
set no bouncemail

defaults:
  no mimedecode
  flush

poll mail.example.com
  protocol protocolname
  user "username"
  password "password"
  mda "/usr/bin/procmail -p -f %F"

procmail の設定

google 先生に尋ねて出てきた設定のまま。man procmailrc を見るといいかもしれない。

PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/inbox/.
LOGFILE=$MAILDIR/procmaillog
LOCKFILE=$HOME/.lockmail

:0
./

注意

fetchmail の設定が決まるまではサーバのメールを削除しない方がいいと思う。 MUA の IMAP4 のディレクトリの設定をしておかないとエラーになる。

あとはいつものように ssh port forwarding の設定をしておけばいい。

ssh -N -f -L 10143:localhost:143 user@example.com

これで MUA の設定で IMAP4 としてつなぎにいくポートを 10143 にしておけばサーバの 143 に転送してもらえる。

Posted in  | タグ  | コメントはありません | トラックバックはありません

how to use nadoka with ssh port forwarding

公開日時 okkez Fri, 03 Jul 2009 05:42:00 GMT

nadoka さんを設定してみたのでメモ。

インストールは Rubyforge からソースコードをチェックアウトすればよい。(atdot.net のは SSL 対応が入ってないらしい)

設定はささださんとこのを見ながら適当に。 うちでは basicconfig を作って接続先ごとに server の設定だけ異なるサブクラスを作って継承させた設定ファイルを用意した。 接続先は社内 IRC と Ruby と Debian だけ。

で、うちでは自宅サーバに nadoka さんを常駐させているが port を開けていないので SSH port forwarding を利用して nadoka さんに接続することにした。

nadoka さんがいくつかのポートで待っているので以下のようにしてみた。

ssh -N -f -L 6661:localhost:6661 foo@example.com
ssh -N -f -L 6662:localhost:6662 foo@example.com
ssh -N -f -L 6663:localhost:6663 foo@example.com

一応、 nadoka さん起動 -> ssh 起動という順番で操作する必要があるっぽい。

いくつか気になった点。

  • /nadoka reload しても basicconfig の変更は反映されない?
  • pid ファイルを指定出来ないので終了がめんどい

後者については bitclust の standalone.rb を参考に適当にオプション追加してみた。

diff --git a/nadoka.rb b/nadoka.rb
index 2eeca7e..8627ee6 100644
--- a/nadoka.rb
+++ b/nadoka.rb
@@ -31,6 +31,7 @@ $stdout.sync=true
$NDK_Debug = false rcfile = nil
+pid_file = nil
optparse = OptionParser.new{|opts| opts.banner = "Usage: ruby #{$0} [options]"
@@ -53,6 +54,11 @@ optparse = OptionParser.new{|opts|
puts 'Enter Nadoka Debug mode' }
+ opts.on("-p PATH", "--pid-file=PATH",
+ "Write pid of the daemon to the specified file."){|path|
+ pid_file = path
+ }
+
opts.separator "" opts.separator "Common options:"
@@ -72,12 +78,25 @@ unless rcfile
puts optparse exit end
+if pid_file
+ if File.exist?(pid_file)
+ $stderr.puts "There is still #{pid_file}. Is another process running?"
+ exit 1
+ end
+ pid_file = File.expand_path(pid_file)
+ File.open(pid_file, 'w'){|f| f.write(Process.pid) }
+end
begin GC.start Nadoka::NDK_Server.new(rcfile).start rescue Nadoka::NDK_QuitProgram #
+ begin
+ File.unlink(pid_file) if pid_file
+ rescue Errno::ENOENT
+ # do nothing
+ end
rescue Nadoka::NDK_RestartProgram retry rescue Exception => e
@@ -85,6 +104,11 @@ rescue Exception => e
f.puts e f.puts e.backtrace.join("\n") }
+ begin
+ File.unlink(pid_file) if pid_file
+ rescue Errno::ENOENT
+ # do nothing
+ end
end end

追記

friendfeed 経由で knu さんに指摘してもらった。 ssh コネクションは一本でいけるそうだ。

ssh -N -f -L 6661:localhost:6661  \
                -L 6662:localhost:6662  \
                -L 6663:localhost:6663 foo@example.com

これでコネクション切るときも kill 一回で済むようになった。

Posted in , ,  | コメントはありません | トラックバックはありません

Rabbit のテーマを作る方法

公開日時 okkez Thu, 25 Jun 2009 08:08:00 GMT

Rabbit のテーマを作る方法を調べてみた。自分のテーマを試行錯誤して作っている途中なのでツッコミ歓迎。

基本的なことは README.ja にも書いてある。

既に存在しているテーマの色違いのテーマを作るのは簡単で、置き場所に適当な名前でファイルを作成して以下のようにすれば良い。

# include_theme の前にカスタマイズしたい色の設定を記述する
@block_quote_frame_width  = 1
@block_quote_fill_color   = "#eeeeee" # 引用の色を変える
include_theme("foo")

この場合は include_theme しているテーマが他のテーマを include_theme している場合が多いのでそれらを順番に辿っていくと好みの色に設定することができると思う。大抵の場合は default-* を参照してそれっぽいインスタンス変数を探すといいです。

参考になるテーマがあるけど、デザインが違う場合はちょっとだけ難しい。 しかし、まだなんとかなるレベル。

参考にするテーマから該当するブロックを自分のテーマファイルにコピペして編集するのが手っ取り早い。 試行錯誤が必要ですが、何回も繰り返せばなんとか目的のものを作ることができると思う。

フルスクラッチで作る場合というのは実はそんなになくて、ほとんどの場合は参考になるテーマから色々といただいてくればやりたいことはできるはず。

# 色などのカスタマイズ
include_theme("default")
# 以降にその他のカスタマイズ

上のような感じでやれば、そこそこ見られるテーマができると思う。

このへん を参照して参考にするテーマを探すと早いかもしれない。

一応、今回作ったテーマ (未完成) 。

@block_quote_frame_width  = 1
@block_quote_fill_color   = "#eeeeee"

# FIXME
@default_item1_mark_color = "#000000"
@default_item2_mark_color = "#333333"
@default_item3_mark_color = "#666666"
@default_enum_item1_mark_color = "#333333"
@default_enum_item2_mark_color = "#666666"
@default_description_item1_mark_color = "#ff9933"
@default_block_quote_item1_mark_color = "#ff9933"

@description_term_line_color = "#3333aa"

@preformatted_frame_width = 1
@preformatted_fill_color  = "#eeeeee"

@table_frame_width     = 1
@table_caption_color   = "#000000"
@table_head_fill_color = "#dddddd"
@table_fill_color      = "#eeeeee"
include_theme("default")

set_foreground("black")
set_background("white")

match(Slide, HeadLine) do |heads|
  name = "head-line"

  heads.delete_post_draw_proc_by_name(name)

  heads.horizontal_centering = false
  heads.prop_set("foreground", "white")

  x_space = screen_x(2)
  y_space = screen_y(1)

  heads.padding_top    = y_space * 2
  heads.padding_bottom = y_space * 2

  color = "#3333aa"

  heads.each do |head|
    pre_y = nil
    width = nil
    height = nil
    head.add_pre_draw_proc(name) do |canvas, x, y, w, h, simulation|
      pre_y = y
      unless simulation
        border_x = x - x_space * 2
        border_y = y - y_space * 2
        border_width = width + x_space * 4
        border_height = height + y_space * 4
        canvas.draw_rectangle(true, border_x, border_y,
                              border_width, border_height, color)
      end
      [x, y, w, h]
    end
    head.add_post_draw_proc(name) do |canvas, x, y, w, h, simulation|
      width = w
      height = y - pre_y
      [x, y, w, h]
    end
  end
end

たぶん、これ以上凝ったものを作ろうと思ったらソースを真面目に読まないといけない気がする。

Posted in ,  | タグ ,  | 2 comments | トラックバックはありません

emacs で起動時のエラー処理がわからない

公開日時 okkez Sat, 06 Jun 2009 12:11:00 GMT

auto-install を使っているのだけど、最初の方に読み込んでいるせいか emacs 起動時にネットワークに つながっていないとその後の処理がうまくいかなくて非常に使いづらい状態で起動してしまう。

なんとかならないものだろうか。

auto-install を最後に読み込むだけでいいのかなぁ。。。

Posted in  | タグ  | 1 comment | トラックバックはありません

PayPal のアカウントを作ってみた

公開日時 okkez Thu, 28 May 2009 00:10:00 GMT

RubyKaigi2009 のチケットを買うのに必要なので PayPal のアカウントを作ってみた。

誰かのブログでクレジットカードの認証に一ヶ月かかるって書いてあったけど 思いっきりガセでした。2,3 日後に web 明細を見たらいいよって書いてあった。 今日、手続きしたらギリギリで6/1に間に合う可能性はあるはず。

そもそも、あの手続きはクレジットカードで送金できる限度額を引き上げるものなので チケットを購入するくらいなら必要ないのかもしれない。

rubykaigi.org に詳しく PayPal の使い方 (へのリンク) とか書いてあると親切なんだけどなぁ。

追記

その後の情報でチケット購入には PayPal アカウントは必要ないということがわかりました。 ちなみに自分が買うチケットは他の人の分です。

Posted in ,  | タグ  | コメントはありません | トラックバックはありません