この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。
xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法やインストールメモやXREA + tDiary + Namazuをどうぞ。
リリースノートに「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 "$@"」だけにして、設定で「他のアプリケーションからのリンク」を「新しいタブで開く」にするだけだった。
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:ルーティング・テーブルを操作する。
この前の勉強会の時にささださんが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))))
ささださんと一緒にお台場産総研でBlueGeneを見学しました。空調が8つもあって14度に設定されていて寒かったです。
無線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がクラスファイルの末尾に変なものをつけるのをやめたというバージョンアップ情報があったような気もする。
最初のところで「ハックリタイ症候群とは?」の説明がなかったので、後で質問が出ていた。「ハックリタイ」といういい感じの地名が元ネタだったらしい。
manしたら邪悪と出てきたという話は『SunOS のマニュアル・ページには ptrace() は「独特で不可解」と記述されており、まさしくそうである。』という話のことのような気がする。Solarisのptraceのmanを探さないといけないのかと思ったらLinuxのmanに書いてあったとは。
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$
yank 以外に使い途あるか?と言われて、矩形選択した状態でI引用符<ESC>で引用符を入れられると思ったけど、行選択して:s/^/引用符/の方が楽だと思ってしまった。
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
%
スクリプトなどから自動生成するのならCDATAを無理して使うよりも素直にCGI.escapeHTMLする方が絶対楽。
gmaneのRSS Feedsがあるので、gmaneのruby-listのRSSを使えばいいのではないかと。
グループ名の部分はFinding a List on Gmaneで検索。
スラッシュドット ジャパン | SMBC「簡単!やさしいセキュリティ教室」経由でSMBC「簡単!やさしいセキュリティ教室」。
証明書の確認の話もあっていい感じ。
Sender ID:送信者側の設定作業を元にして、メールを送信しないサブドメインには"v=spf1 -all"を設定してみた。
メールを送信するドメインの場合はメーリングリストなどで問題が起きるかもしれないから-allではなく~allになっている?
どちらもgemで入れたrailsとgettextをRuby on RailsでRuby-GetText-Packageを使うを参考にして、組み合わせて使ってみた。
gettextについて簡単に説明すると、_メソッド(gettextメソッドの別名)が主に使う翻訳用のメソッドで、翻訳したい文字列(msgid)を引数に渡すと翻訳後の文字列(msgstr)を返してくれる。
他には、翻訳対象の文字列ということを示すだけ(で別の場所で_を通す)のN_メソッドや、翻訳元が同じ言葉でも状況によって訳語を変えたい場合に使うs_メソッド(sgettextメソッド)や英語の単数形や複数形のように数によって変化させたいときに使うn_メソッド(ngettextメソッド)などがある。
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 %>' %>
%
とりあえずの例ということで、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
今回も標準添付ライブラリ紹介を書きました。第7回 Ruby勉強会@関西の懇親会でspeakillofさんが出してくれた案の1つだったんですが、forwardableに比べるとdelegateは難しかったです。記事中には書きませんでしたが、delegateよりもforwardableを推奨したいです。delegateはよくわかっていないと[ruby-list:41720] Tempfile#==のような問題が起きたりして難しいと思います。
また読者プレゼントがあります。応募期間が短い(今年中)なのでお早めに。
qwikWebの「わびさび方式の拡張」のコメントとCDATAはエスケープをどうしているのかが気になりました。コメントはTrackback Auto-Discoveryの中身に「--」がそのまま含まれていて厳密に解釈すると壊れているのを見たことがあるし、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"
サンプルは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」というリンクをたどるだけです。
内部処理がEUC-JPということは、アプリケーションをUTF-8ベースにしてもnkfを使っているとEUC-JPにない文字は使えない?
✑ babie [具体的な用途には出会えればいいけど。>vim の矩形選択。 screen は無理っぽいかー。新規ウィンドウならいける..]