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をどうぞ。


2006年03月04日(Sat)

[python][regexp][ruby] 三桁毎にスペースを挿入する正規表現の続き

他の方法で書いた方がはやそうだけど、正規表現でがんばっていたのは、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

2006年03月08日(Wed)

[ruby] def_erb_method

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)

[zsh] ある文字列を含む直近の履歴

複数一度に見たいのなら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の説明を見ると、他に特殊な意味を持つ文字はなさそう。

[ruby] ブロックなしの map

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>
%
本日のツッコミ(全1件) [ツッコミを入れる]

ささだ [おお、もうあったのか。]


2006年03月09日(Thu)

[ruby][rails] Recognition failed for "s"

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を短くするのは無理?

[ruby][rails] 環境変数書き換え

dispatch.cgiの頭でENV['SCRIPT_NAME'] = "/foo/dispatch.cgi"として回避することにした。

[ruby][rails] 環境変数書き換え (fcgi)

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!

[ruby][rails] ActionController::AbstractRequest.relative_url_root

2006-03-11追記: 実は環境変数を設定しなくても、config/environments/development.rbなどにActionController::AbstractRequest.relative_url_root = "/foo"を設定すれば良いということがわかった。


2006年03月10日(Fri)

[ruby] curses

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

2006年03月11日(Sat)

[ruby] 第9回 Ruby勉強会@関西

来たことある場所のような気がすると思っていたら、第5回と同じ場所だった。

Ruby 初級者講座が特におもしろかった。


2006年03月13日(Mon)

[ruby] hikiのinfo.dbが壊れる話

一覧に表示されていないページを復活させるプラグインを見て思い出したけど、Ruby温泉ミーティング2006春の時になおしたflockされていないところがあったのを修正したことで壊れなくなるという可能性はないかなあ。

2006-03-15追記: [Hiki-dev:01099]の話でptstore.rb rev1.9でCVSに入っています。

[misc] ポーション

600円と200円の違いはキャップとかカードが付いてるだけじゃなくて瓶の部分も違っていて、200円の方は栄養ドリンクみたいにラベル付き。中身の量も違っていて100mlと120mlで200円の方が多かったらしい。

[net] ウィルコム、公式コンテンツにブログサービスを追加 - CNET Japan

PCからだとhttp://w-blog.jp/に繋がらない?

PHSから繋いでみると、13日のうちは「3/14 START」と出ていたけど、日付が変わってから見てみると、「ご利用の端末では本サービスをご利用いただけません。」と出た。

対応していないはずはないと思って、ユーザエージェントをNetFrontV3.3からWILLCOMに変えてリロードしても変わらなかったので、一度切断して繋ぎ直すと表示された。

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

kdmsnr [HikiのCVS上にありますか?>flockされていないところがあったのを修正]


2006年03月14日(Tue)

[ruby] linux zaurus用configureの引数

yarv on Zaurusとかクロスコンパイルの話。

手元に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

2006年03月15日(Wed)

[ruby] ObjectSpace

こんな感じで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"

2006年03月16日(Thu)

[Linux] opt

$HOME/opt/binというのをみて、optならopt/<package>じゃないのかと思ってFHS 2.3の/optを確認してみたら、/opt/binなども書いてあった。手元に残しておいたfhs-2.1.txtを見ても同じだった。

ちなみに私は./configure --prefix=$HOME/opt/$(basename $(pwd))とすることが多いです。~を使わずに$HOMEを使うのは、昔何かで~というディレクトリを作られてしまったことがあったから。

[ruby] Methodオブジェクト

見出しで答えがばれてしまいそうな気もしますがnil?メソッドとnilオブジェクトでfalseを返させるにはどうすれば良いでしょうか?

答え(の1つ)はKernel.instance_method(:nil?).bind(nil).call

これは実用性がありませんが、同じような方法でKernel.instance_method(:inspect).bind(Pathname.new('/')).callのようにオーバーライドされて直接呼び出せなくなったメソッドを呼び出すと言うことが出来ます。inspectメソッドもあんまりうれしくないですが、sendやidのような別名が用意されているメソッド以外のメソッドがオーバーライドされてしまっているときはこういう方法もあるということで。

[ruby] exerb

ASRにexerb(の特にコア)が入っているとうれしい人が多いんじゃないだろうかとASRのバージョンを1.8.2に戻した話を見て思った。


2006年03月17日(Fri)


2006年03月18日(Sat)

[misc] C MAGAZINE 最終号

まだ買ってないけど、ついに最終号。

[ruby] tasktray

タスクバー再起動対応の例を試してみると./vr/vruby.rb:152:in `method_missing': No such flags(WS_EX_TOOLWINDOW) (RuntimeError)になった。

WStyleでWExStyleをincludeしたら動いたけど、どうするべきだろう?

module WStyle
  include WExStyle
end

[tdiary] ツッコミフォームを隠す

30日以上前の場合はツッコミフォームを隠すようにしてみた。@conf.hide_comment_formを設定するだけのプラグインにしたので、[ツッコミを入れる]リンクは残ったままという問題があるけど。


2006年03月20日(Mon)

[programming] 真偽の扱い

賛成意見があってちょっと安心。

[web] ImportError

http://tokuhirom.dnsalias.org/~tokuhirom/inamode4/ のImportErrorはいつになったら直るんだろう。


2006年03月21日(Tue)

[linux] Fedora Core 5

VMware 4.5.3上に入れてみたけど、vmware-toolsのインストールは出来なかった。


2006年03月28日(Tue)

[off] Rubyお花見

どうする予定なんだろう。


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