A Strolling Programmeraka なかだ

またの名を「風まかせ人まかせ力まかせ」日記

T D I A R Y T I M E S % fgrep -i '' *.td2
<< 2006/05/ 1 2 1. 嫁母(ばばちゃん)
3 4 1. 休日出勤
5 6 7 8 9 1. Rubyカンファレンスチケット瞬殺
10 11 12 13 14 15 16 1. 括弧
17 1. File::ALT_SEPARATORとBUILD_FILE_SEPARATOR
18 19 1. File.ctimeとFile.mtime
20 21 22 23 1. mecab-configとpkg-config
2. Enumeratorのバグのように見えて別のだったものと仕様上の制限かなにか
24 25 26 27 28 29 1. nil.chomp
2. ツッコミ
30 31 1. 謎
>>
«前月 最新 翌月» 追記

2006-05-02 modified at Thu May 4 11:17:17 2006

* 嫁母(ばばちゃん)

夕方から遊びに来る。 帰りは土曜日の予定(だったかな)。

ていうか、こっちが帰れない。orz

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-04 modified at Thu May 4 11:20:07 2006

* 休日出勤

一昨日(七時過ぎになって)「連休中出てほしい」とかいわれた挙句、 結局今日だけ出ることになったわけが、着いてみると社員が誰もいねーw。

嫁、ばばちゃん、娘は足利フラワーパークへ。

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-09 modified at Wed May 10 02:05:27 2006

* [ruby] Rubyカンファレンスチケット瞬殺

LTに 誘導するメソッド?

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-16 modified at Tue May 16 10:19:47 2006

* [ruby] 括弧

省略する派だなぁ。

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-17 modified at Wed May 17 18:23:30 2006

14:39現在霧雨/霞 21℃

* [ruby] File::ALT_SEPARATORとBUILD_FILE_SEPARATOR

後でコミる。

すっかり忘れさるところだったけど、まだlib/mkmf.rbにFile::ALT_SEPARATORを使っているところがあった。 さらに\決め打ちしてるところも。

あと$nmakeを使ってるのはBorland make用だけか。

Index: ext/extmk.rb
===================================================================
RCS file: /pub/cvs/ruby/src/ruby/ext/extmk.rb,v
retrieving revision 1.87
diff -U 2 -p -r1.87 extmk.rb
--- ext/extmk.rb	3 Mar 2006 12:24:52 -0000	1.87
+++ ext/extmk.rb	20 Apr 2006 06:57:06 -0000
@@ -307,6 +307,6 @@ EXEEXT = CONFIG['EXEEXT']
 if CROSS_COMPILING
   $ruby = CONFIG['MINIRUBY']
-elsif $nmake
-  $ruby = '$(topdir:/=\\)\\miniruby' + EXEEXT
+elsif sep = config_string('BUILD_FILE_SEPARATOR')
+  $ruby = "$(topdir:/=#{sep})#{sep}miniruby" + EXEEXT
 else
   $ruby = '$(topdir)/miniruby' + EXEEXT
Index: lib/mkmf.rb
===================================================================
RCS file: /pub/cvs/ruby/src/ruby/lib/mkmf.rb,v
retrieving revision 1.237
diff -U 2 -p -r1.237 mkmf.rb
--- lib/mkmf.rb	15 Mar 2006 07:53:35 -0000	1.237
+++ lib/mkmf.rb	20 Apr 2006 06:57:06 -0000
@@ -1384,5 +1384,5 @@ RPATHFLAG = config_string('RPATHFLAG') |
 LIBARG = config_string('LIBARG') || '-l%s'

-sep = File::ALT_SEPARATOR ? ":/=#{File::ALT_SEPARATOR}" : ''
+sep = config_string('BUILD_FILE_SEPARATOR') {|sep| ":/=#{sep}" if sep != "/"} || ""
 CLEANINGS = "
 clean:

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-19 modified at Sat May 20 00:25:01 2006

* [ruby] File.ctimeとFile.mtime

長すぎるのかなんかの条件に引っかかるのか、ツッコミに反映されないのでこっちで核。

  • mtimeとctimeを一度にとって両方比較
  • -wでの警告を消す
diff -u2p mo.rb.orig mo.rb
--- mo.rb.orig	2006-05-19 09:51:40.578125000 +0900
+++ mo.rb	2006-05-19 10:25:53.453125000 +0900
@@ -39,5 +39,5 @@ class MOFile < Hash #:nodoc:
   def initialize(output_charset = nil)
     @filename = nil
-    @last_modified = Time.now
+    @last_modified = nil
     @little_endian = true
     @output_charset = output_charset
@@ -47,6 +47,6 @@ class MOFile < Hash #:nodoc:
   def update!
     if FileTest.exist?(@filename)
-      filetime = [File.ctime(@filename), File.mtime(@filename)].max
-      load (@filename) unless (@last_modified == filetime)
+      st = File.stat(@filename)
+      load(@filename) unless (@last_modified == [st.ctime, st.mtime])
     else
       puts "#{@filename} was lost." if $DEBUG
@@ -60,5 +60,6 @@ class MOFile < Hash #:nodoc:
     when String
       begin
-	@last_modified = File.ctime(arg)
+	st = File.stat(arg)
+	@last_modified = [st.ctime, st.mtime]
       rescue Exception
       end

お名前: コメント: ヽ(・∀・)ノ ハムー

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

_ むとう [ありがとうございます!いただきます!]

Pingback(0)

2006-05-23 modified at Tue May 23 19:53:58 2006

16:14現在霧雨 23℃

* [ruby] mecab-configとpkg-config

こういうこと。

$ mecab-config --libs
-L/usr/lib -lmecab -lstdc++
$ mecab-config --libs-only-l
mecab stdc++
$ mecab-config --libs-only-L
/usr/lib

一方pkg-configは-lがついたままになる。

$ pkg-config --libs libpng
-lpng12 -lz
$ pkg-config --libs-only-l libpng
-lpng12 -lz

pkg-configを介さないもので--libs-only-lを解するものは、手元では他に見つからなかった。

具体的にはこうしようかと思ったんだけど。

def pkg_config(pkg)
  if pkgconfig = with_config("#{pkg}-config") and find_executable0(pkgconfig)
    # iff package specific config command is given
    get = proc {|opt| `#{pkgconfig} --#{opt}`.chomp}
  elsif ($PKGCONFIG ||= 
         (pkgconfig = with_config("pkg-config", ("pkg-config" unless CROSS_COMPILING))) &&
         find_executable0(pkgconfig) && pkgconfig) and
      system("#{$PKGCONFIG} --exists #{pkg}")
    # default to pkg-config command
    get = proc {|opt| `#{$PKGCONFIG} --#{opt} #{pkg}`.chomp}
  elsif find_executable0(pkgconfig = "#{pkg}-config")
    # default package specific config command, as the last resort.
    get = proc {|opt| `#{pkgconfig} --#{opt}`.chomp}
  end
  if get
    cflags = get['cflags']
    ldflags = get['libs']
    libs = get['libs-only-l']
    ldflags = (Shellwords.shellwords(ldflags) - Shellwords.shellwords(libs)).quote.join(" ")
    $CFLAGS += " " << cflags
    $LDFLAGS += " " << ldflags
    $libs += " " << libs
    Logging::message "package configuration for %s\n", pkg
    Logging::message "cflags: %s\nldflags: %s\nlibs: %s\n\n",
                     cflags, ldflags, libs
    [cflags, ldflags, libs]
  else
    Logging::message "package configuration for %s is not found\n", pkg
    nil
  end
end

* [ruby] Enumeratorのバグのように見えて別のだったものと仕様上の制限かなにか

あるコレクションの各要素に対してある処理をして、 その結果の中から条件にマッチする最初のものを得ようとした。

(1..3).collect{|i|i*2}.find{|i|i>2} # => 4

これはOK。 でも、たとえば「ある処理」が重そうとか、 コレクションのサイズが大きいなり取り出しに副作用があるなりで不要な処理をさけたいとか、 といったことで遅延評価のためにEnumeratorを使ってみる。

(1..3).enum_for(:collect){|i|i*2}.find{|i|i>2} # => nil

調べてみるとcollectのブロックの結果に対して、 もう一回呼ばれているっぽい。

p (1..3).enum_for(:collect){|i|p i*=2;i}.find{|i|i>2}
2
4
4
8
6
12
nil

enumerator.cのバグかなぁ、とデバッガで見てみるとなんとなく既視感が。 結論としてはこれも[ruby-core:07835]で直った。

ついでに1.8でも試してみると、collectのブロックが呼ばれていない。

(1..3).enum_for(:collect){|i|i*2}.find{|i|i>2} # => 3

1.8のEnumerable#collectはブロックなしだとto_aと同じなので、 しばらく理由がわからなかった。

原因は、

  • enum_forがブロックを保存していない
  • Enumerator#eachrb_apply()を使っているのでブロックを渡せない

という二つなんだが、これって意図的な制限かなぁ。

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-29 modified at Mon May 29 14:30:04 2006

* [ruby] nil.chomp

どうせNoMethodErrorで止まるんだから、 scanf(2)でループとかさらに戻り値をチェックしてないとかあまつさえgets(2)で(ryとかいう 「Cで書く資格なし」なコードに比べれば無問題。 とか書いてみる。

* ツッコミ

「waiting(謎)って何?」とか 「置いとくと自動的にツッコまれるの?」とか ツッコミを考えていたら、 「それはツッコんどけ、って意味だよ」(超訳)とツッコまれたので、 なんとなくツッコんどいてみた(過去完了形)テスト。

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

2006-05-31 modified at Wed May 31 16:59:24 2006

* [ruby] 謎

$ cat hoge.bat
:"/#{# -*- ruby -*-" 2>&-||:; exec ${RUBY-ruby} -x "$0" "$@";
:-}";<<'goto:EOF'[0]#"
@echo off
if "%RUBY%" == "" (ruby -x "%~f0" %*) else (%RUBY% -x "%~f0" %*)
goto:EOF
#!ruby -Ks
p RUBY_VERSION, RUBY_PLATFORM, $0, ARGV, $KCODE

お名前: コメント: ヽ(・∀・)ノ ハムー

Pingback(0)

Key fingerprint = 1E69 3ED2 C05B 6BA4 34B2 FC25 478B C08D 2772 58F6