zt日記

書いているのは Kazuhiro NISHIYAMA a.k.a. ZnZです。
2001|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|
2012|04|05|06|09|

この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。

xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法インストールメモXREA + tDiary + Namazuをどうぞ。


2005年12月01日(Thu)

[firefox] new-tab

リリースノートに「firefox -remote (mozilla-xremote-client) no longer works on urls containing commas, and is deprecated. firefox -new-window /url/ will open the url in a new window; firefox -new-tab /url/ will open the url in a new tab.」と書いていたので、今までシェルスクリプトで「firefox -remote "openURL($*,new-tab)" || firefox "$@"」としていた「既に起動していたら新しいタブで開いて、起動していなかったら新しく起動する」というのをどうすればいいのか悩んだが、単純に「firefox "$@"」だけにして、設定で「他のアプリケーションからのリンク」を「新しいタブで開く」にするだけだった。


2005年12月02日(Fri)

[Windows] ルーティング

LANにつないで、そこから22番ポート以外にしているsshにつながらなかった。

そこで、そのsshだけPHSの回線でつなごうと思って、ダイヤルアップしてみると、route printで確認してみたところ、デフォルトゲートウェイのMetricが、LAN側が21で、PHSのダイヤルアップ側が1になっていて、PHS側がデフォルトゲートウェイとして使われてしまうようになっていた。

そこで、route -f add 0.0.0.0 mask 0.0.0.0 192.168.x.yとしてLAN側をデフォルトゲートウェイにして、route add 61.x.y.z 210.x.y.zのようにして61.x.y.z宛だけPHSの210.x.y.zをゲートウェイとして使うように設定した。

参考: @IT:Windows TIPS -- Knowledge:デフォルト・ゲートウェイは1つのみ有効@IT:Windows TIPS -- Tips:ルーティング・テーブルを操作する

[emacs] M-x compile

この前の勉強会の時にささださんがC-2でrubyスクリプトを実行していたのを思い出して、emacsで似たようなことをするのはどうすればいいかと考えると、compile関数が良さそうだったので、compile-command変数のdocstringに書いてあった例をちょっと変更して、以下のようなhookを追加することにした。いきなり実行するとまずいスクリプトもありそうなので、デフォルトはruby -cで必要に応じてC-ccの後にコマンドラインを編集して実行したいスクリプトの場合は実行するなりすれば良さそう。

(add-hook
 'ruby-mode-hook
 (lambda ()
   (define-key ruby-mode-map "\C-cc" 'compile)
   (set (make-local-variable 'compile-command)
        (concat "ruby -cv " buffer-file-name))))
 
(add-hook
 'perl-mode-hook
 (lambda ()
   (define-key perl-mode-map "\C-cc" 'compile)
   (set (make-local-variable 'compile-command)
        (concat "perl -cw " buffer-file-name))))

[off] BlueGene

ささださんと一緒にお台場産総研でBlueGeneを見学しました。空調が8つもあって14度に設定されていて寒かったです。

[off] Binary 2.0 カンファレンス 2005

無線LANがあったらしいけど、つながらず。アクセスポイントの能力不足?

床数カ所に電源タップもあったらしいけど、よくわからなかったので結局使えず。

「ハードコアバイナリアンへの道」のGDBプレゼンが一番すごかった気がする。上から順番に次の画面になっていくのもそういうエフェクトと思えなくもなかったし。

magic(5)の話の最後の方に言っていたOpenOffice.orgのファイルの話(OpenOffice.org 2.0と同じ話と思われる)はOpenOffice1.1では先頭にmimetypeというテキストファイルが非圧縮入っているので、今は大丈夫のはず。2.0の方は確認していませんが、1.1で入っていたのに2.0の方で入っていないという改悪はしていないはず。

全体的に実行中のバイナリを何かするものでは、コンパイル後のオブジェクトファイルにない情報(C++での関数の返値の型とかインライン関数とか)を必要とする処理は厳しそうだった。

G-Inspectorのginspectorコマンドは実はGTK_MODULES環境変数を設定しているだけのシェルスクリプトで、実際にGTK+の実行プログラムに手を入れる処理(の初期化部分)はgmoduleを素直に使っているだけというのは知らなかった。GTK+2はGObjectで動的に情報がとりやすくなっているので、他のC++のバイナリなどを対象としたバイナリアンよりも実装は楽そうな気がした。

Binarealのバイナリの構造を考慮して見やすくするというのは、TSXBINというバイナリエディタを思い出した。TSXBINでJavaのクラスファイル用のマクロを作ろうとして末尾にクラスファイルの仕様にないデータがついていてそれが解決できなくてあきらめてしまったことがあったけど、その後、javacがクラスファイルの末尾に変なものをつけるのをやめたというバージョンアップ情報があったような気もする。

最初のところで「ハックリタイ症候群とは?」の説明がなかったので、後で質問が出ていた。「ハックリタイ」といういい感じの地名が元ネタだったらしい。


2005年12月03日(Sat)

[off] ptraceのmanの話

manしたら邪悪と出てきたという話は『SunOS のマニュアル・ページには ptrace() は「独特で不可解」と記述されており、まさしくそうである。』という話のことのような気がする。Solarisのptraceのmanを探さないといけないのかと思ったらLinuxのmanに書いてあったとは。

[shell] matchしないglob

globがマッチしない場合のシェルの挙動の話。

zshの場合、デフォルトの状態でglobがmatchしないとエラーになってコマンドが実行されない。unsetopt nomatch(またはsetopt nonomatch)で、そのまま渡されるようになる。

bashの場合、デフォルトの状態でglobがmatchしないとglob前の文字列がそのままコマンドに渡される。failglobを設定するとエラーになるようになる。

どちらもnullglobでマッチしないとその引数がなかったことに出来る。zshの場合はその引数の後ろに(N)をつけると一時的にnullglobに出来る。

zsh
% echo ?
zsh: no matches found: ?
% unsetopt nomatch
% echo ?
?
% setopt nullglob
% echo ?

% unsetopt nullglob
% echo ?
zsh: no matches found: ?
% echo ?(N)

%
bash
bash-3.00$ echo ?
?
bash-3.00$ shopt failglob
failglob        off
bash-3.00$ shopt -s failglob
bash-3.00$ echo ?
bash: no match: ?
bash-3.00$ shopt nullglob
nullglob        off
bash-3.00$ shopt -s nullglob
bash-3.00$ echo ?
bash: no match: ?
bash-3.00$ shopt -u failglob
bash-3.00$ echo ?

bash-3.00$

2005年12月04日(Sun)

[vim] 矩形選択の使い道

yank 以外に使い途あるか?と言われて、矩形選択した状態でI引用符<ESC>で引用符を入れられると思ったけど、行選択して:s/^/引用符/の方が楽だと思ってしまった。

[emacs] 引用符

emacsだと見た目は矩形選択にならないけど、リージョンの両端を矩形の角に見なすコマンドがあって、引用符をつけたい最初の行頭でマークして引用符をつけたい最後の行頭まで移動して、C-x r tまたはM-x string-rectangleで入力待ちになるので、そこで引用符を入れるというのをすることがある。

emacsのC-x rがprefixになっているコマンドは独特のものが多かったり、rectangle系とregister系が混ざっていたりしてわかりにくいので、今のところC-x r tだけしか使っていない気がする。

[screen] bind

screenのsetenvコマンドやencodingコマンドでscreenプログラム自体のlocaleを変更しても、既にscreenの中で起動しているシェルなどのプログラムには影響がないので、動的に変更するのはいろいろと無理があるような気がします。新しく起動するシェルなどは後から設定したlocaleになっても今まで起動しているシェルなどは前のlocaleのままなので、結局それを閉じてscreenを起動し直しに近い状態になってしまうような気が。

本日のツッコミ(全1件) [ツッコミを入れる]

babie [具体的な用途には出会えればいいけど。>vim の矩形選択。 screen は無理っぽいかー。新規ウィンドウならいける..]


2005年12月05日(Mon)

[ruby] Perl format string integer wrap vulnerability

rubyだとどうなるのか試してみた。

% ruby18 -ve 'printf("%2147483647$d\n")'
ruby 1.8.4 (2005-12-01) [i686-linux]
-e:1:in `printf': too few arguments (ArgumentError)
        from -e:1
% ruby18 -ve 'printf("%2147483648$d\n")'
ruby 1.8.4 (2005-12-01) [i686-linux]
-e:1:in `printf': invalid index - -2147483648$ (ArgumentError)
        from -e:1
% ruby18 -ve 'printf("%2147483649$d\n")'
ruby 1.8.4 (2005-12-01) [i686-linux]
-e:1:in `printf': invalid index - -2147483647$ (ArgumentError)
        from -e:1
% ruby18 -ve 'printf("%4294967296$d\n")'
ruby 1.8.4 (2005-12-01) [i686-linux]
-e:1:in `printf': invalid index - 0$ (ArgumentError)
        from -e:1
% ruby18 -ve 'printf("%4294967297$d\n", 1)'
ruby 1.8.4 (2005-12-01) [i686-linux]
1
% ruby18 -ve 'printf("%4294967298$d\n", 1, 2)'
ruby 1.8.4 (2005-12-01) [i686-linux]
2
%

[XML] Re: CDATAセクション

スクリプトなどから自動生成するのならCDATAを無理して使うよりも素直にCGI.escapeHTMLする方が絶対楽

[mail] Re: MLをRSSで読む

gmaneのRSS Feedsがあるので、gmaneのruby-listのRSSを使えばいいのではないかと。

グループ名の部分はFinding a List on Gmaneで検索。

[ruby] yarv

YARVの記述は古くてconfigureには--enable-pthreadが必須になっていると言われてしまった。YARV (2)と同じ現象。必須なら自動で追加することは出来ない?

本日のツッコミ(全2件) [ツッコミを入れる]

ささだ [configure のいじり方を知らんもんで。]

なかだ [YARVならAC_ARG_ENABLE(pthread)の後でenable_pthread=yesにすればいいはず。..]


2005年12月07日(Wed)

[web] SMBC「簡単!やさしいセキュリティ教室」

スラッシュドット ジャパン | SMBC「簡単!やさしいセキュリティ教室」経由でSMBC「簡単!やさしいセキュリティ教室」

証明書の確認の話もあっていい感じ。

[ML] 宛先ミス

ruby-cvsへのreplyをruby-devに送ろうとして、最初Toがruby-cvsのまま送ってしまったが、ruby-cvs MLはFromが@ruby-lang.orgじゃないと配送されない設定になっているので大丈夫だったらしい。


2005年12月08日(Thu)

[mail] SPF

Sender ID:送信者側の設定作業を元にして、メールを送信しないサブドメインには"v=spf1 -all"を設定してみた。

メールを送信するドメインの場合はメーリングリストなどで問題が起きるかもしれないから-allではなく~allになっている?


2005年12月15日(Thu)

[ruby][rails] Rails 1.0.0とRuby-GetText-Package 1.0.0

どちらもgemで入れたrailsとgettextをRuby on RailsでRuby-GetText-Packageを使うを参考にして、組み合わせて使ってみた。

gettextについて簡単に説明すると、_メソッド(gettextメソッドの別名)が主に使う翻訳用のメソッドで、翻訳したい文字列(msgid)を引数に渡すと翻訳後の文字列(msgstr)を返してくれる。

他には、翻訳対象の文字列ということを示すだけ(で別の場所で_を通す)のN_メソッドや、翻訳元が同じ言葉でも状況によって訳語を変えたい場合に使うs_メソッド(sgettextメソッド)や英語の単数形や複数形のように数によって変化させたいときに使うn_メソッド(ngettextメソッド)などがある。

[rails] gettextized_scaffold

Rails勉強会@大阪 第1回で聞いた話を参考にして、scaffoldをいじったものをgeneratorとしてまとめ直してみた。

資料だと、Usageのところは変更していなかったが、そこも変更してみた。だけど、./script/generate gettextized_scaffoldしてみると、Exampleのところがscaffoldのままだったので、ちゃんとするにはもうちょっと変更が必要そう。

ついでにcreated_atやupdated_atが編集フォームに入らないようにもしておいた。

% mkdir -p ~/.rails/generators
% cp -a ~/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold ~/.rails/generators/gettextized_scaffold
% mv ~/.rails/generators/gettextized_scaffold/{,gettextized_}scaffold_generator.rb
% diff ~/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb ~/.rails/generators/gettextized_scaffold/gettextized_scaffold_generator.rb
1c1
< class ScaffoldingSandbox
---
> class GettextizedScaffoldingSandbox
11c11
<     Proc.new { |record, column| "<p><label for=\"#{record}_#{column.name}\">#{column.human_name}</label><br/>\n#{input(record, column.name)}</p>\n" }
---
>     Proc.new { |record, column| "<p><label for=\"#{record}_#{column.name}\"><%=_('#{column.human_name}')%></label><br/>\n#{input(record, column.name)}</p>\n" unless /\A(?:cre|upd)ated_(?:at|on)\z/ =~ column.name }
35c35
< class ScaffoldGenerator < Rails::Generator::NamedBase
---
> class GettextizedScaffoldGenerator < Rails::Generator::NamedBase
137c137
<       "Usage: #{$0} scaffold ModelName [ControllerName] [action, ...]"
---
>       "Usage: #{$0} gettextized_scaffold ModelName [ControllerName] [action, ...]"
161c161
<       sandbox = ScaffoldingSandbox.new
---
>       sandbox = GettextizedScaffoldingSandbox.new
% diff -u ~/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/controller.rb ~/.rails/generators/gettextized_scaffold/templates/controller.rb > gettextized_scaffold-template.diff
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/controller.rb /home/kazu/.rails/generators/gettextized_scaffold/templates/controller.rb
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/controller.rb	2005-12-15 18:35:44.081313852 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/controller.rb	2005-12-15 08:55:24.000000000 +0900
@@ -26,7 +26,7 @@
   def create<%= suffix %>
     @<%= singular_name %> = <%= model_name %>.new(params[:<%= singular_name %>])
     if @<%= singular_name %>.save
-      flash[:notice] = '<%= model_name %> was successfully created.'
+      flash[:notice] = _('<%= model_name %> was successfully created.')
       redirect_to :action => 'list<%= suffix %>'
     else
       render :action => 'new<%= suffix %>'
@@ -40,7 +40,7 @@
   def update
     @<%= singular_name %> = <%= model_name %>.find(params[:id])
     if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
-      flash[:notice] = '<%= model_name %> was successfully updated.'
+      flash[:notice] = _('<%= model_name %> was successfully updated.')
       redirect_to :action => 'show<%= suffix %>', :id => @<%= singular_name %>
     else
       render :action => 'edit<%= suffix %>'
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml /home/kazu/.rails/generators/gettextized_scaffold/templates/layout.rhtml
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml	2005-12-15 18:35:44.085313776 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/layout.rhtml	2005-12-15 18:59:12.254331145 +0900
@@ -1,6 +1,6 @@
 <html>
 <head>
-  <title><%= controller_class_name %>: <%%= controller.action_name %></title>
+  <title><%%=sprintf(_('<%= controller_class_name %>: %s'), controller.action_name)%></title>
   <%%= stylesheet_link_tag 'scaffold' %>
 </head>
 <body>
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml /home/kazu/.rails/generators/gettextized_scaffold/templates/view_edit.rhtml
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml	2005-12-15 18:35:44.086313756 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/view_edit.rhtml	2005-12-15 08:59:31.000000000 +0900
@@ -1,9 +1,9 @@
-<h1>Editing <%= singular_name %></h1>
+<h1><%%=_('Editing <%= singular_name %>')%></h1>
 
 <%%= start_form_tag :action => 'update<%= @suffix %>', :id => @<%= singular_name %> %>
   <%%= render :partial => 'form' %>
-  <%%= submit_tag 'Edit' %>
+  <%%= submit_tag _('Edit') %>
 <%%= end_form_tag %>
 
-<%%= link_to 'Show', :action => 'show<%= suffix %>', :id => @<%= singular_name %> %> |
-<%%= link_to 'Back', :action => 'list<%= suffix %>' %>
+<%%= link_to _('Show'), :action => 'show<%= suffix %>', :id => @<%= singular_name %> %> |
+<%%= link_to _('Back'), :action => 'list<%= suffix %>' %>
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml /home/kazu/.rails/generators/gettextized_scaffold/templates/view_list.rhtml
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml	2005-12-15 18:35:44.086313756 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/view_list.rhtml	2005-12-15 18:55:15.202873407 +0900
@@ -1,9 +1,9 @@
-<h1>Listing <%= plural_name %></h1>
+<h1><%%=_('Listing <%= plural_name %>')%></h1>
 
 <table>
   <tr>
   <%% for column in <%= model_name %>.content_columns %>
-    <th><%%= column.human_name %></th>
+    <th><%%=_(column.human_name)%></th>
   <%% end %>
   </tr>
   
@@ -12,16 +12,16 @@
   <%% for column in <%= model_name %>.content_columns %>
     <td><%%=h <%= singular_name %>.send(column.name) %></td>
   <%% end %>
-    <td><%%= link_to 'Show', :action => 'show<%= suffix %>', :id => <%= singular_name %> %></td>
-    <td><%%= link_to 'Edit', :action => 'edit<%= suffix %>', :id => <%= singular_name %> %></td>
-    <td><%%= link_to 'Destroy', { :action => 'destroy<%= suffix %>', :id => <%= singular_name %> }, :confirm => 'Are you sure?' %></td>
+    <td><%%= link_to _('Show'), :action => 'show<%= suffix %>', :id => <%= singular_name %> %></td>
+    <td><%%= link_to _('Edit'), :action => 'edit<%= suffix %>', :id => <%= singular_name %> %></td>
+    <td><%%= link_to _('Destroy'), { :action => 'destroy<%= suffix %>', :id => <%= singular_name %> }, :confirm => _('Are you sure?') %></td>
   </tr>
 <%% end %>
 </table>
 
-<%%= link_to 'Previous page', { :page => @<%= singular_name %>_pages.current.previous } if @<%= singular_name %>_pages.current.previous %>
-<%%= link_to 'Next page', { :page => @<%= singular_name %>_pages.current.next } if @<%= singular_name %>_pages.current.next %> 
+<%%= link_to _('Previous page'), { :page => @<%= singular_name %>_pages.current.previous } if @<%= singular_name %>_pages.current.previous %>
+<%%= link_to _('Next page'), { :page => @<%= singular_name %>_pages.current.next } if @<%= singular_name %>_pages.current.next %> 
 
 <br />
 
-<%%= link_to 'New <%= singular_name %>', :action => 'new<%= suffix %>' %>
+<%%= link_to _('New <%= singular_name %>'), :action => 'new<%= suffix %>' %>
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml /home/kazu/.rails/generators/gettextized_scaffold/templates/view_new.rhtml
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml	2005-12-15 18:35:44.087313737 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/view_new.rhtml	2005-12-15 09:25:19.000000000 +0900
@@ -1,8 +1,8 @@
-<h1>New <%= singular_name %></h1>
+<h1><%%=_('New <%= singular_name %>')%></h1>
 
 <%%= start_form_tag :action => 'create<%= @suffix %>' %>
   <%%= render :partial => 'form' %>
-  <%%= submit_tag "Create" %>
+  <%%= submit_tag _("Create") %>
 <%%= end_form_tag %>
 
-<%%= link_to 'Back', :action => 'list<%= suffix %>' %>
+<%%= link_to _('Back'), :action => 'list<%= suffix %>' %>
diff -u /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml /home/kazu/.rails/generators/gettextized_scaffold/templates/view_show.rhtml
--- /home/kazu/r/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml	2005-12-15 18:35:44.087313737 +0900
+++ /home/kazu/.rails/generators/gettextized_scaffold/templates/view_show.rhtml	2005-12-15 18:55:29.933591144 +0900
@@ -1,8 +1,8 @@
 <%% for column in <%= model_name %>.content_columns %>
 <p>
-  <b><%%= column.human_name %>:</b> <%%=h @<%= singular_name %>.send(column.name) %>
+  <b><%%=_(column.human_name)%>:</b> <%%=h @<%= singular_name %>.send(column.name) %>
 </p>
 <%% end %>
 
-<%%= link_to 'Edit', :action => 'edit<%= suffix %>', :id => @<%= singular_name %> %> |
-<%%= link_to 'Back', :action => 'list<%= suffix %>' %>
+<%%= link_to _('Edit'), :action => 'edit<%= suffix %>', :id => @<%= singular_name %> %> |
+<%%= link_to _('Back'), :action => 'list<%= suffix %>' %>
%

[rails] アプリケーションの例

とりあえずの例ということで、sqlite3を使ってセッション管理もオフにしてみた。

columnの名前を翻訳するためのN_("...")をmigrateに入れているのは他によさそうな場所がなかったから。modelの方に入れてもいいかもしれない。msgid(翻訳前の文字列)としてhuman_nameを使っているのもscaffoldだけいじるのだと、human_nameになった後にしか_メソッド(gettextメソッドの別名)に渡せなかったから。

将来的にはrgettextが自動抽出してくれるはず。

いろいろ試していて、なぜかrequire 'gettext/rails'すると/rails_info/propertiesのバージョン一覧表示がNameError in Rails_info#propertiesというエラーでuninitialized constant Infoという状態になってしまうことに気がついた。今のところ原因は不明。

% rails memo
% vi config/database.yml
development:
  adapter: sqlite3
  database: db/development.sqlite3
test:
  adapter: sqlite3
  database: ":memory:"
production:
  adapter: sqlite3
  database: db/production.sqlite3
% ./script/generate migration InitialSchema
% vi db/migrate/001_initial_schema.rb
class InitialSchema < ActiveRecord::Migration
  def self.up
    create_table :memos do |t|
      t.column :note, :text
      t.column :created_at, :timestamp
      t.column :updated_at, :timestamp
    end
    if false # for gettext
      N_("Note")
      N_("Created at")
      N_("Updated at")
    end
  end
 
  def self.down
    drop_table :memos
  end
end
% rake migrate
% ./script/generate gettextized_scaffold memo
% vi app/controllers/application.rb
require 'gettext/rails'
 
GetText.output_charset = "UTF-8"
 
class ApplicationController < ActionController::Base
  before_filter :init_gettext
  def init_gettext
    bindtextdomain("memo", request.cgi)
    @headers["Content-Type"] = "text/html; charset=UTF-8"
  end
 
  session :off
end
% mkdir po
% rgettext **/*.(rb|rhtml) -o po/memo.pot
% mkdir po/ja
% cp po/memo.pot po/ja/memo.po
% vi po/ja/memo.po
% cat > lib/tasks/makemo.rake
desc "Create mo-files for L10n"
task :makemo do
  require 'gettext/rmsgfmt'
  GetText.create_mofiles(true, "po", "locale")
end
% rake makemo
% ./script/server
本日のツッコミ(全1件) [ツッコミを入れる]

むとう [今さらですが、require 'gettext/rails'すると/rails_info/propertiesのバー..]


2005年12月21日(Wed)

[screen] UTF-8 環境

既に実行中のzshに何かさせたいのなら、execで別プロセスを起動しても何の意味もないような。

シェル以外のプロセスがforegroundの時に実行してしまうとうまくいかないことを覚悟の上なら「bind 'U' eval "encoding utf8" "stuff 'export LANG=ja_JP.UTF-8\012'"」のようにstuffでシェルへの入力をしてしまうしかなさそう。

本日のツッコミ(全1件) [ツッコミを入れる]

babie [おぉ、stuff が何者が良くわからないですが、明日試してみます。]


2005年12月22日(Thu)

[off] 雪

寝て起きたら雪が積もっていたというのは10年ぐらいなかったような気がする。移動先に積もっていたとか、通過したところに積もっているのを見たというのなら結構あったのですが。


2005年12月23日(Fri)

[web] Rubyist Magazine 0012 号

今回も標準添付ライブラリ紹介を書きました。第7回 Ruby勉強会@関西の懇親会でspeakillofさんが出してくれた案の1つだったんですが、forwardableに比べるとdelegateは難しかったです。記事中には書きませんでしたが、delegateよりもforwardableを推奨したいです。delegateはよくわかっていないと[ruby-list:41720] Tempfile#==のような問題が起きたりして難しいと思います。

また読者プレゼントがあります。応募期間が短い(今年中)なのでお早めに。

qwikWebの「わびさび方式の拡張」のコメントとCDATAはエスケープをどうしているのかが気になりました。コメントはTrackback Auto-Discoveryの中身に「--」がそのまま含まれていて厳密に解釈すると壊れているのを見たことがあるし、CDATAも「]]>」を含められないという問題があるし。

[ruby] CDATAの罠

REXMLでCDATAが入っているテキストを扱おうとすると、最初のCDATAしかとれなかったりCDATAの前までしかとれなくて悩んだことがあった。CDATAはプログラム中での扱いが難しかったり、エスケープが難しかったりするので、CDATAを使わずにCGI.escapeHTMLをといっているんですが、なかなか賛同は得られないようです。

require 'rexml/document'
doc = REXML::Document.new('<a><![CDATA[hoge]]></a>')
p doc.elements['a'].text #=> "hoge"
doc = REXML::Document.new('<a><![CDATA[foo]]><![CDATA[bar]]></a>')
p doc.elements['a'].text #=> "foo"
doc = REXML::Document.new('<a>foo<![CDATA[hoge]]>bar</a>')
p doc.elements['a'].text #=> "foo"
doc = REXML::Document.new('<a><![CDATA[foo]]><![CDATA[bar]]></a>')
p doc.elements['a'].texts.to_s #=> "foobar"

2005年12月26日(Mon)

[ruby] RWikiでのWAVE DASH問題の結末

euc-jpとeuc-jp-msのどちらで変換しようかとか悩んでいたが、NKF.nkf('-wdXm0', s)を通している時点で、U+FF5E(FULLWIDTH TILDE)からU+301C(WAVE DASH)に変換されてしまっていて、混在して困るということが起こる可能性は無くなっていた。

本日のツッコミ(全1件) [ツッコミを入れる]

なるせ [nkfは内部処理においてEUC-JPによってUCS正規化してますからね。入力は正規化され、混在することはありません。..]


2005年12月27日(Tue)

[ruby] gettext/railsでエラーになる話

サンプルはrails sample; cd sample; (echo; echo "require 'gettext/rails'") >> config/environment.rb; ./script/serverという感じでconfig/environment.rbの末尾にrequire 'gettext/rails'を追加して(EOF直前に改行がないので余分なechoをつけている)、./script/serverを起動して、http://127.0.0.1:3000/の「About your application’s environment」というリンクをたどるだけです。

[ruby] nkfは内部処理においてEUC-JPによってUCS正規化

内部処理がEUC-JPということは、アプリケーションをUTF-8ベースにしてもnkfを使っているとEUC-JPにない文字は使えない?

[ruby] UTF-8

UTF-8ベースのアプリケーションだとnkfを通す代わりにglib2のg_utf8_validateのようなチェックしてくれる関数が欲しいと思ってしまうけど、何か良いものはないかなあ。最短ではないUTF-8符号化のようなセキュリティ上の問題があるものもチェックできるといいんだけど。

本日のツッコミ(全2件) [ツッコミを入れる]

なるせ [そうですね。UTF-8からUTF-16への変換等の用途でnkfを用いると、非日本語文字については期待通りには動きませ..]

むとう [ありがとうございます。修正しました。 リリース前に気づいて良かったです。]


copyright © 2001-2013 ZnZ
Key fingerprint = 6E14 2C9C DBD7 874D 8B3C CAA8 9B58 5538 ED7E 1B73