SVX日記
2009-10-22(Thu) 週刊「メーラを作る」
突然、再度、自製のメーラ「mave」を書き直したくなってきた。
オイラは、初期バージョンのmaveを、日頃の実務でバリバリと使っている。数万件のメールを溜め込んでも、全く速度が落ちないというスケーラビリティは、なかなか他のメーラで代え難い特徴だ。他にも見たこともないような便利機能もいくつかあり、実際、これを超えるメーラはないと思っている(自分で作ったから当然)。
というわけで、早速、はじめる。とりあえず、RubyのcursesライブラリをUTF-8(ncursesw)対応にすべくパッチを当てる。単に私の試行錯誤の結果なのだが、以前、ここで記事にしたような気がするものの、サッパリ記録が見つからない。あちこちの環境に、パッチが当たっているライブラリが転がっているのは見つかったが、方法が書いてない。さらに、あちこちの環境を探したら、ようやくノウハウが発掘できた。なんだ、こんだけのことか。
zakato.itline.jp:/root # yum install ruby
更新 : ruby-libs-1.8.6.369-5.fc12.x86_64 1/4
更新 : ruby-1.8.6.369-5.fc12.x86_64 2/4
zakato.itline.jp:/root # wget http://mirrors.kernel.org/fedora/development/source/SRPMS/ruby-1.8.6.369-5.fc12.src.rpm
※ yumdownloader --source ruby でも可
zakato.itline.jp:/root # rpm -ivh ruby-1.8.6.369-5.fc12.src.rpm
zakato.itline.jp:/root # rpmbuild -bp rpmbuild/SPECS/ruby.spec
エラー: ビルド依存性の失敗:
compat-readline5-devel は ruby-1.8.6.369-5.fc12.src に必要とされています
tcl-devel は ruby-1.8.6.369-5.fc12.src に必要とされています
tk-devel は ruby-1.8.6.369-5.fc12.src に必要とされています
zakato.itline.jp:/root # yum install compat-readline5-devel tcl-devel tk-devel
zakato.itline.jp:/root # rpmbuild -bp rpmbuild/SPECS/ruby.spec
zakato.itline.jp:/root # cd rpmbuild/BUILD/ruby-1.8.6.369/
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369 # find . -name "*curse*"
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369 # cd ./ruby-1.8.6-p369/ext/curses
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # ruby extconf.rb
can't find header files for ruby.
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # yum install ruby-devel
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # ruby extconf.rb
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # make
1 #!/usr/bin/ruby
2
3 require "curses"
4
5 Curses.init_screen
6 begin
7 s = "こんにちは、世界!"
8 Curses.setpos(Curses.lines / 2, Curses.cols / 2 - (s.length / 2))
9 Curses.addstr(s)
10 Curses.refresh
11 Curses.getch
12 ensure
13 Curses.close_screen
14 end
�~A~S�~B~S�~A��~A��~A��~@~A��~V�~U~L!
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # diff -c curses.c.org curses.c
*** curses.c.org 2007-02-13 08:01:19.000000000 +0900
--- curses.c 2009-10-22 23:11:20.815314129 +0900
***************
*** 15,20 ****
--- 15,21 ----
#include "ruby.h"
#include "rubyio.h"
+ #include "locale.h"
#if defined(HAVE_NCURSES_H)
# include
***************
*** 1441,1446 ****
--- 1442,1449 ----
void
Init_curses()
{
+ setlocale(LC_ALL, "");
+
mCurses = rb_define_module("Curses");
mKey = rb_define_module_under(mCurses, "Key");
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # diff -c extconf.rb.org extconf.rb
*** extconf.rb.org 2008-06-08 03:59:34.000000000 +0900
--- extconf.rb 2009-10-22 23:12:26.452314410 +0900
***************
*** 1,15 ****
require 'mkmf'
dir_config('curses')
! dir_config('ncurses')
dir_config('termcap')
make=false
have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM
have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
! if have_header(*curses=%w"ncurses.h") and have_library("ncurses", "initscr")
make=true
! elsif have_header(*curses=%w"ncurses/curses.h") and have_library("ncurses", "initscr")
make=true
elsif have_header(*curses=%w"curses_colr/curses.h") and have_library("cur_colr", "initscr")
curses.unshift("varargs.h")
--- 1,15 ----
require 'mkmf'
dir_config('curses')
! dir_config('ncursesw')
dir_config('termcap')
make=false
have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM
have_library("tinfo", "tgetent") or have_library("termcap", "tgetent")
! if have_header(*curses=%w"ncurses.h") and have_library("ncursesw", "initscr")
make=true
! elsif have_header(*curses=%w"ncurses/curses.h") and have_library("ncursesw", "initscr")
make=true
elsif have_header(*curses=%w"curses_colr/curses.h") and have_library("cur_colr", "initscr")
curses.unshift("varargs.h")
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # ruby extconf.rb
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # make
zakato.itline.jp:/root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses # cd /usr/lib64/ruby/1.8/x86_64-linux
zakato.itline.jp:/usr/lib64/ruby/1.8/x86_64-linux # mv curses.so curses.so.org
zakato.itline.jp:/usr/lib64/ruby/1.8/x86_64-linux # cp /root/rpmbuild/BUILD/ruby-1.8.6.369/ruby-1.8.6-p369/ext/curses/curses.so .
こんにちは、世界!