この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。
xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法やインストールメモやXREA + tDiary + Namazuをどうぞ。
他の方法で書いた方がはやそうだけど、正規表現でがんばっていたのは、Perl正規表現雑技のようにパズル的なものとしてやってみていただけです。
変な所にスペースが入る方法
っていうのは[TSpython:735]と本質的には同じ方法だと思うのですが、整数部分が3桁未満でマッチしなかった場合に小数点より右の数字にマッチさせない方法がないと余計な末尾の空白をつけないのは、無理と言うことになります。
[TSpython:735]には書いていないのですが、rubyで試行錯誤してみたところ、\Gを使えばいいと言うことに気づきました。(\Gを有効利用できたのは初めてのような気がする。)
(?:...)を使えば括弧の数が変わっても後ろの部分の番号が2のままになるというのは[TSpython:735]を見るまで気づいてませんでした。複雑な正規表現なので、キャプチャをしないことで高速化するよりもシンプルなままにすることを優先していて、参照するときの数値がわかりにくくなるということまで考えが及んでいなかったようです。
(?:$|\D)の部分は文字列の途中でも使えるようにするためなので、用途に応じて適当に。
re = /\G(\d{1,3})(?=\d{3}+(?:\.\d*)?(?:$|\D))(\d{3}(?:\.\d*)(?:$|\D))?/
[
'1234567890',
'1234567890.12345',
'1.123456789',
'12.123456789',
'123.123456789',
'0.12345',
].each do |s|
puts s.gsub(re, '\1 \2')
end
ERBスクリプトのローカル変数を実行時に設定したいという話は、ERB::DefMethodのdef_erb_methodのmethodnameに引数付きのメソッド名を指定してしまえば良さそうな気がします。
#!/usr/bin/ruby
require 'erb'
class A
extend ERB::DefMethod
def_erb_method('foo(a,b)', ERB.new('<%=a%>,<%=b%>'))
end
puts A.new.foo(1,2)
複数一度に見たいのならgrepするしかなさそうだけど、1つずつでいいのならCtrl+rを連打したり、(stop "^-"などでフローコントロールにとられないようにしていれば)Ctrl+sで戻り過ぎた時に進んだりして探して、目的の履歴が見つかったらEnterですぐに実行してもいいし、Ctrl+aとかCtrl+eとかCtrl+bとかCtrl+fとかでカーソルを前後に移動させて編集モードにして編集してから実行してもいい。
setoptにHIST_VERIFYというのがあるけど、これは!!とかのhistory expansionを使ったときに、すぐに実行せずに編集できるようにするもので、Ctrl+rの後のEnterはHIST_VERIFYの設定に関係なくすぐに実行らしい。
Ctrl+rの検索の最初に^を使うと行頭を検索できるけど、history-incremental-search-backwardの説明を見ると、他に特殊な意味を持つ文字はなさそう。
1.9の仕様変更でto_aと同じ意味ではなくEnumeratorになる。
ということはmap{|i| i}に変更するよりもto_aに変更した方がいいような気がする。
% ruby18 -ve 'p [].map' ruby 1.8.4 (2006-03-04) [i686-linux] [] % ruby19 -ve 'p [].map' ruby 1.9.0 (2006-03-05) [i686-linux] #<Enumerable::Enumerator:0x401d58f4> %
Recognition failed for "s"というRouting Errorが出て困った。
設定は、まずapacheのconfファイルの方でRewriteRule ^/foo/(.*) /~foo/bar/$1 [PT]のようにmod_rewriteでsuexecが使える場所に書き換えて、さらに.htaccessでRewriteRule ^(.*)$ dispatch.cgi [QSA,L]でdispatch.cgiが起動する。(dispatch.fcgiでも結果は同じ)
原因は、gems/actionpack-1.11.2/lib/action_controller/request.rbのActionController::AbstractRequest#pathでrequest_uriの頭からrelative_url_rootの長さだけ無条件に削除していて、この設定だとrequest_uri = "/foo/hoges"とrelative_url_root = "/~foo/bar"になっていて、pathが"s"だけになっているということだった。
直接/~foo/bar/hoges/なら問題は起きないんだけど、mod_rewriteのPTでURLを短くするのは無理?
fastcgiの場合はRailsFCGIHandler.process!の中の処理を書き換えないといけなかったので、RailsFCGIHandler#process_requestをオーバーライドして、cgi.env_tableで書き換えるようにしてみた。
class MyRailsFCGIHandler < RailsFCGIHandler
def process_request(cgi)
class << cgi
def env_table
@env_table_cache ||= super.update({'SCRIPT_NAME'=>"/foo/dispatch.fcgi"})
end
end
super(cgi)
end
end
MyRailsFCGIHandler.process!
Gauche:curses-drawをrubyで書き直してみた。
どこかにCurses.refreshを入れておかないとcを押すまで枠が表示されないのがなぜなのかよくわからなかった。
#!/usr/bin/ruby
require 'curses'
begin
Curses.init_screen
Curses.cbreak
Curses.noecho
Curses.refresh
hello = " [Hello, Curses World!] "
help = " [h]:left [j]:down [k]:up [l]:right [c]:clear [q]: quit "
maxy = Curses.lines - 2
maxx = Curses.cols - 2
win = Curses::Window.new(maxy, maxx, 1, 1)
init = proc do
win.clear
win.box(?|, ?-)
win.setpos(0, (maxx-hello.size)/2)
win << hello
win.setpos(maxy-1, maxx-help.size-3)
win << help
win.refresh
end
init.call
y = maxy / 2
x = maxx / 2
loop do
y = 1 if y == maxy-1
y = maxy-2 if y == 0
x = 1 if x == maxx-1
x = maxx-2 if x == 0
win.setpos(y, x)
win.addch(?*)
win.setpos(y, x)
win.refresh
case Curses.getch
when ?h; x -= 1
when ?j; y += 1
when ?k; y -= 1
when ?l; x += 1
when ?c; init.call
when ?q; break
end
end
ensure
Curses.close_screen
end
一覧に表示されていないページを復活させるプラグインを見て思い出したけど、Ruby温泉ミーティング2006春の時になおしたflockされていないところがあったのを修正したことで壊れなくなるという可能性はないかなあ。
2006-03-15追記: [Hiki-dev:01099]の話でptstore.rb rev1.9でCVSに入っています。
600円と200円の違いはキャップとかカードが付いてるだけじゃなくて瓶の部分も違っていて、200円の方は栄養ドリンクみたいにラベル付き。中身の量も違っていて100mlと120mlで200円の方が多かったらしい。
関連サイトとしてはHAL(通称雌猫)とArcdllの騒動まとめサイトとか。
PCからだとhttp://w-blog.jp/に繋がらない?
PHSから繋いでみると、13日のうちは「3/14 START」と出ていたけど、日付が変わってから見てみると、「ご利用の端末では本サービスをご利用いただけません。」と出た。
対応していないはずはないと思って、ユーザエージェントをNetFrontV3.3からWILLCOMに変えてリロードしても変わらなかったので、一度切断して繋ぎ直すと表示された。
手元に1.8.2の頃に試したものが残っていたのでみてみると、以下のようになっていた。setpgrpやgetpgrpはconftest.cをちゃんとクロスコンパイルして実機にコピーして試した結果を反映させたもののはず。
zlibやrubyは問題なかったけど、opensslのクロスコンパイルが結局うまくいかなくてあきらめたような気がする。
$RUBY_SRC_DIR/configure \
CC=arm-linux-gcc LD=arm-linux-ld \
CFLAGS=-Os \
ac_cv_func_getpgrp_void=yes \
ac_cv_func_setpgrp_void=yes \
--host=arm-linux \
--target=arm-linux \
--build=i686-pc-cygwin \
--prefix=/opt/QtPalmtop \
--disable-ipv6 \
--cache=config.cache \
--with-openssl-dir=$HOME/ipk/openssl/opt/QtPalmtop \
--with-zlib-dir=$HOME/ipk/zlib/opt/QtPalmtop \
--enable-shared | tee _configure.log
こんな感じでparseした段階でリテラルに対応するStringオブジェクトが生成されていて、実行時にリテラルのところを通ったときに(freezeされていないので変更される可能性を考えて)コピーされてそれがstr_aに代入されている、と理解しているのですが。従来動作。毎回別オブジェクト生成。とかが関係する?
#!/usr/bin/ruby
str_a = "abcA"
ObjectSpace.each_object(String) do |o|
if /^abc/ =~ o
p "#{o.object_id}:#{o}"
end
end
str_b = "abcB"
#=>
# "538240752:abcA"
# "538240782:abcB"
# "538241212:abcA"
$HOME/opt/binというのをみて、optならopt/<package>じゃないのかと思ってFHS 2.3の/optを確認してみたら、/opt/binなども書いてあった。手元に残しておいたfhs-2.1.txtを見ても同じだった。
ちなみに私は./configure --prefix=$HOME/opt/$(basename $(pwd))とすることが多いです。~を使わずに$HOMEを使うのは、昔何かで~というディレクトリを作られてしまったことがあったから。
見出しで答えがばれてしまいそうな気もしますがnil?メソッドとnilオブジェクトでfalseを返させるにはどうすれば良いでしょうか?
答え(の1つ)はKernel.instance_method(:nil?).bind(nil).call。
これは実用性がありませんが、同じような方法でKernel.instance_method(:inspect).bind(Pathname.new('/')).callのようにオーバーライドされて直接呼び出せなくなったメソッドを呼び出すと言うことが出来ます。inspectメソッドもあんまりうれしくないですが、sendやidのような別名が用意されているメソッド以外のメソッドがオーバーライドされてしまっているときはこういう方法もあるということで。
ASRにexerb(の特にコア)が入っているとうれしい人が多いんじゃないだろうかとASRのバージョンを1.8.2に戻した話を見て思った。
まだ買ってないけど、ついに最終号。
タスクバー再起動対応の例を試してみると./vr/vruby.rb:152:in `method_missing': No such flags(WS_EX_TOOLWINDOW) (RuntimeError)になった。
WStyleでWExStyleをincludeしたら動いたけど、どうするべきだろう?
module WStyle include WExStyle end
✑ ささだ [おお、もうあったのか。]