2001年3月のn日記


過去のn日記


Generated by nDiary version 0.9.3.beta6

2001年3月3日(土)

Cマガプログラミング期末試験

  結局解答が間違っていたのはいくつ?

JARH id2name

$,=' ';$\=',';print [:Just,:another,:Ruby,:hacker].map{|x|x.id2name}.join
$KCODE

  winだけじゃなくてmingwやdjgppも調べた方がいいという噂。


  # $KCODEの自動判断。
  if /^[nN]/ === $KCODE
    if /win|mingw|djgpp/i === RUBY_PLATFORM
      $KCODE = 'SJIS'
    else
      $KCODE = 'EUC'
    end
  end
Cygwin

  cygwinのmkisofsも2バイト目に「\」の入ったファイル名(というかフォルダ名)を無視してしまっていた。
ということはcygwinのdllのレベルで対応してないと無理って事ですか…。
ファイルリストを比較するためにCygwinのfindでリストをとろうとしたら同じ問題ではまるし、仕方がないからWindowsキー+Fで検索してファイル一覧をコピーして…としようとしたらファイル数が多すぎてハングアップっぽくなるしで大変だったけど、結局DOS窓でdir/b/sした後、頭についてるドライブとかをとってsortして比較して解決。
いや「\」の入ったフォルダがバックアップできなかったという点では解決じゃないけども。
どうせファイル属性はmkisofsで保存されないのならLinuxマシンにsamba経由で送り込んでそっちでmkisofsした方が良かったのかもしれない。

Ruby

  html と外部 inputの話。「任意の javascript を走らせることが出来てしまう。」といってもそのJavaScriptが動くのはサーバではなくそのJavaScriptを送ってきたクライアントのはず。自分で自分の首を絞めるのは自由だと思いますが、掲示板とかのような他のクライアントもみるようなところだとやっぱりまずいか。

  日付の比較の話。month - 1してるだけだと年を越せません。Dateでどうにかできないかと思ったらマニュアルがなくて使い方がわからず。ソースをみたところ年や月を足したり引いたりは出来なさそう。

ruby-ext

  無道編に書いてあった話が元で始まったrequire 'dir/...'?のスレッドが盛り上がっている。
ちゃんと説明(説得)できないような機能ならつけるべきではないと思いました。


2001年3月4日(日)

Ruby tr

  [ruby-list:28466]をみて[Perl Quiz 2001-02-02 No.0064]のシーザー暗号をrubyに書き換えようとしたらString#trで置き換え後の文字列の途中に'-'を入れられなくてはまった。


% ruby -v
ruby 1.6.2 (2001-01-10) [i486-linux]
% irb
irb(main):001:0> 'abc'.tr('a-c','A-C')
"ABC"
irb(main):002:0> 'abc'.tr('a-c','A\-C')
"A\\\\"
irb(main):003:0> 'abc'.tr('a-c','A\\-C')
"A\\\\"

  結局、secret.plのRuby版はsecret.rbという風に場合分けしてみた。バグ回避のコードは実際にその機能を試してみて場合分けするのが定石。


2001年3月5日(月)

Ruby

  特異メソッド()をつければ大文字でも呼び出せます。とφ(.. )

JARH method_missing

  さっそく使ってみる。


def method_missing(methId)
  methId.id2name+' '
end
print Just()+another+Ruby()+hacker.chop+','

2001年3月7日(水)

JARH for Ruby, Perl, C, awk and sh

  Ruby, Perl, Cは結構簡単。これはawkも対応。


#include <stdio.h>
#define BEGIN int main()
BEGIN {
  printf("Just another Ruby hacker,");
  exit(0);
}

  shにも対応させるのが難しいのは、関数呼び出しやcppのマクロ展開に括弧が必須のCと括弧をつけるとダメなshの相性が悪いからみたい。
頭に2行付け加えたら今度はshに対応できた。
/usr/bin/printfというのもあるけど一般的かどうかわからないので、とりあえずechoにしておいた。


#define ignore_next_line \
exec echo "Just another Ruby hacker,";
#include <stdio.h>
#define BEGIN int main()
#undef exit
BEGIN {
  printf("Just another Ruby hacker,");
  exit(0);
}
rubyist ML

  2通ずつは来てないです。実は3通ずつ…だと面白いのですがそういうこともなくちゃんと1通ずつのようです。

fork on irb

  ちょっとforkについて勉強してみようと思っただけだったのに。
irbは入力したものがそのまま実行されてその結果がp をつけなくても表示されるのが楽でいいんだけど、インタプリタ自体に影響のあるもの($SAFE=4とか)を試すにはdebug.rbを使った方がいいのかな。
debug.rbの使い方を勉強してみよう…。

date.rb

  日付の比較の話。出来なさそうと書いたけど出来ることを発見。Date.today << 1で1ヶ月前の日付が得られるのでこれをcurrent.year, current.month - 1, current.dayの代わりにd.year, d.month, d.dayのように使えばよさそう。


2001年3月8日(木)

Ruby IO.popen

  IO.popenでforkされたプロセスがexitで終了できないと思ったら、rescue ExceptionでSystemExitがrescueされていたのが原因だった。

  プロセスが落ちるようなものをevalしても大丈夫にするためにIO.popenしてみる。
なかなかうまくいかないがとりあえず最初のものはこんな感じ。


def child_eval(code)
  unless child = IO.popen('-')
    begin
      puts eval code
    rescue Exception
      puts $!
    end
 
    exit!
  end
 
  child.read
end
 
result = nil
begin
  result = child_eval gets
rescue Exception
  result = $!
end
 
puts "result=#{result}"
Ruby $SAFE=4

  safe levelが4だとスレッド固有データは自分のスレッドだけ変更出来るらしい。


% ruby -ve '$SAFE=4;Thread.list.each{|th|th[:foo]=:bar}'
ruby 1.6.2 (2001-01-10) [i486-linux]
% ruby -ve 'Thread.new{sleep 2};$SAFE=4;Thread.list.each{|th|th[:foo]=:bar}'
ruby 1.6.2 (2001-01-10) [i486-linux]
-e:1:in `[]=': Insecure: can't modify thread locals (SecurityError)
        from -e:1
        from -e:1:in `each'
        from -e:1

2001年3月9日(金)

Ruby IO.popen safeeval.rb

  SafeEvalが一応完成。単体ではちゃんと動いてるのに、Thread使いまくりのプログラムに入れるとうまくいかない。うまくいかないのは2点。というか両方forkしたプロセスが落ちた後だから原因は1つ?

  呼び出し方は直接実行と同じようにあるメソッドでpushして別の無限ループしているスレッドでpopしているだけなので、呼び出し方による違いはないはずなんだけど。

JARH IO.popen

unless child = IO.popen('-')
  print 'Just another Ruby hacker,'
  exit!
end
print child.read
Ruby safeeval.rb Thread

  もしかして2つ目以降の子プロセス側でメインスレッドのような必要なスレッドまでkillしてしまっているのかも。今までのような全体が落ちるのよりは状況がましになったので、とりあえず保留。


2001年3月10日(土)

Ruby/GTK

  今まで何度も挫折してきたGUIにまた挑戦。ちなみに前回の挫折はApolloで、理由はRubyのThreadとTCPSocketが使えなかったから。

  Extention Libraries for Cygwin RubyにはGTKが無かったので、Extention Libraries for MinGW Rubyにしてみた。てんこ盛りパックじゃなくなってるので自分でまとめてGETしてみた。やってみたのはだいたいこんな感じ。これを入れる前にGIMP for Win32も入れてしまったので、これだけでRuby/GTKが使えるようになるのかどうかは未確認。

wget -m -np http://www.ruby-lang.org/~eban/ruby/binaries/mingw/ext/
cd www.ruby-lang.org/%7Eeban/ruby/binaries/mingw/ext/
ls *.gz | xargs -n 1 tar -C / -zxvf
wget -N http://www.ruby-lang.org/~eban/ruby/binaries/mingw/ruby-1.6.3-20010307-i386-mingw32.tar.gz
tar -C / -zxvf ruby-1*gz

  以前に入っていたC:\cygwin\usr\local\doc\ruby\gtk-0.23\sample\helloworld.rbの中でUconv.sjistou8を使っていたので、Ruby/GTKによるGUIプログラミングのeditor.rbをShift_JISに変換して、MenuItem.newの日本語のところにUconv.sjistou8をつけてfile_item = MenuItem.new(Uconv.sjistou8 "ファイル")のように変更していって、最初に#!ruby -Ksとrequire 'uconv'をつけたらちゃんと日本語がでるようになった。load_fileもbuf = file.readbuf = Uconv.sjistou8 file.readにしないとShift_JISのファイルはよみこめなかった。
それからメニューを開いたら毎回「Gdk-WARNING **: gdkcursor-win32.c:gdk_cursor_new:121: LoadImage failed: 操作は正常に終了しました。」とコンソールの方にでているのが気になった。

  今だとドキュメントが少ないのはどのGUIライブラリでも同じようなので、Windows用ではVisualuRubyを使った方がいいのかも。


2001年3月11日(日)

Ruby fork Thread

  SafeEvalが他のものに入れているとうまく動かないのは、[ruby-dev:12404] fork in threadsからのスレッドによるとメインスレッドまでkillしてしまっているからみたい。

Ruby TCPServer

  TCPServer.openに2引数指定して特定のhostのみで接続を受け付けるのがマイブーム。dRubyも対応になるはず。

Cygwin mkisofs

  日本語 (multi-byte NLS) 対応 mkisofs で2バイト目に「\」を含むファイル名が扱えないようなので、再現用のバッチファイルを作ってみて、メールしてみた。


C:\cygwin\var\tmp>type mkisofs-test.bat
@echo off
mkdir 表
cd 表
echo ok > 表
echo ok > 予定
echo ok > 定
cd ..
mkdir 予定
cd 予定
echo ok > 表
echo ok > 予定
echo ok > 定
cd ..
mkdir 定
cd 定
echo ok > 表
echo ok > 予定
echo ok > 定
cd ..
mkisofs -icode=sjis -J -r -rr-code=euc-jp -o image.iso -v -V VolumeLabel .
C:\cygwin\var\tmp>mkisofs-test
mkisofs 1.13 (i586-pc-cygwin)
Scanning .
/usr/bin/MKISOFS: No such file or directory. Non-existant or inaccessible: ./表
Scanning ./予定
/usr/bin/MKISOFS: No such file or directory. Non-existant or inaccessible: ./予
定/..
/usr/bin/MKISOFS: No such file or directory. Non-existant or inaccessible: ./予
定/表
Scanning ./定
/usr/bin/MKISOFS: No such file or directory. Non-existant or inaccessible: ./定/
表
Total translation table size: 0
Total rockridge attributes bytes: 975
Total directory bytes: 4096
Path table size(bytes): 32
Max brk space used 5000
40 extents written (0 Mb)
C:\cygwin\var\tmp>

2001年3月16日(金)

Ruby cgi.rb

  CGI::rfc1123_dateで%02dではなく%.2dなのは何故なのかが気になった。

JARH CGI::unescape

require 'cgi'
print CGI::unescape('%4A%75%73%74%20%61%6E%6F%74%68%65%72%20%52%75%62%79%20%68%61%63%6B%65%72%2C')
Cygwin mkisofs

  winsup/cygwin/path.ccってことはCygwinの問題?

Rubyプログラミング入門

  平成13年2月25日第1版第3刷発行ですか。

.htaccess

  こう書き足すと.htaccessを直接指定で見えるようになった。

<Files .htaccess>
order deny,allow
allow from all
</Files>

2001年3月19日(月)

Ruby

  kill出来ないのは不便なので、mingw版からcygwin版に戻した。

Ruby VisualuRuby FormDesigner.rb

  FormDesigner(ひなまつりばーじょん)を使ってみようとしたらLoadErrorになったので、一緒に入っていたvruby010227.lzhをreadme.txtに書いてあったとおりに入れてみたら次はswin.dllが古いとでた。
vrswin-010128-i386-cygwin.tar.gzだと古い?それともswin.soではなくswin.dllとでてると言うことは別のものが読み込まれてる?

>ruby FormDesigner.rb
FormDesigner.rb:14:in `require': No such file to load -- vr/contrib/inifile (LoadError)
from FormDesigner.rb:14

  >ruby FormDesigner.rb
/USR/LOCAL/lib/ruby/site_ruby/1.6/vr/vruby.rb:23: swin.dll(010128) version too old (StandardError)
from FormDesigner.rb:4:in `require'
from FormDesigner.rb:4

JARH nkf -Z1, -r

require 'nkf'
print NKF.nkf('-Z1','Just another Ruby hacker,')
print NKF.nkf('-r', 'Whfg nabgure Ehol unpxre,')
SPAM

  SPAM(2)ですが、その相手も同じように単に嘘アドレスとして書かれてるだけっていう可能性はないんでしょうか?


2001年3月21日(水)

Ruby date.rb

  Date::between?というのもあったとは。これだけ高機能なのにドキュメント不足なのがとってももったいないです。
誰か書いてRDPに入れてほしい…。

  と昨日書いて更新し忘れていたら、date2にMANUAL.rdというのを発見した。

JARH Range

('Just another '..'Ruby hacker,').to_s.delete('.').display
nDiary

  nDiary+eRubyが出来ると面白いかも。

less -S

  Emacsみたいに右にまだ続いてるっていうのがわかれば便利なのに。


2001年3月22日(木)

RWiki installer

  RWiki 1.2のインストールをしてみようとしたら、drubyとERbとmutexmがなくなっててはまったので、更新した。
ついでに更新の時に古いバージョンの方にcdしてしまって変になっていたのも対策してみた。

JARH pack('N*').squeeze

[1249211252, 538993006, 1869899877, 1914708050, 1969387808, 543711587, 1801810476].pack('N*').squeeze.display
RWiki https

  httpsなサーバ(apache-ssl)にRWikiを入れたらhttp(略):443にリダイレクトされててはまったので、RWiki-develにパッチを投げてみた。

  その前にrwiki-1.2/logに書き込めなくてはまっていたのは、mkdirしてwww-dataに書き込み権限を与えて解決した。

Marshal bug

  1.6.2で(({Marshal.load Marshal.dump 2**31}))が0になっていたバグは1.6.3で直っていたが、(({Marshal.load Marshal.dump 1024**10}))がダメというバグが残っていたのを発見。
IRCでの話によると0のビットが続いているとダメっぽいらしい。


% ruby -ve 'Marshal.load Marshal.dump 1024**10'
ruby 1.6.3 (2001-03-19) [i386-linux]
-e:1:in `load': marshal data too short (ArgumentError)
        from -e:1
Ruby 1.6.3

  1.6.3の問題点。


2001年3月23日(金)

JARH Struct

Struct.new('JARH', :Just, :another, :Ruby, 'hacker,'.intern).members.join(' ').display
RCS 超手抜き入門

  「ci -l ファイル名」
最初にciするときはファイルの説明を入力する。
「.」だけの行で入力終了。
2回目以降は変更点を書く。
とりあえずこれだけで変更の履歴は残せる。
履歴は「ファイル名,v」というファイルに残る。
RCSというディレクトリがある場合は「ファイル名,v」というファイルはRCSディレクトリの中に入る。
履歴を利用したくなったらRCSについてもっと勉強してください。

  これで履歴さえ残していれば、利用するのは後からどうにでもなります。とりあえず履歴を残すことをおすすめします。ファイルを1つずつ個別に管理するのが面倒になったらCVSを勉強するといいです。


2001年3月24日(土)

Ruby

  fj.comp.lang.rubyでruby162-refm.rd.gzの話が。
ブラウザによってはダウンロードした時点ですでに展開されているという説明を書いたページを用意してそこにリンクするようにした方がいいのかも。

JARH begin..rescue..ensure..end

begin
  print 'Just '
  raise 'another '
rescue => e
  print e, 'Ruby '
ensure
  print 'hacker,'
end

2001年3月25日(日)

ri

  riっていつの間にか0.6にまでバージョンがあがってましたか。

JARH

  CGI::unescapeなJARH16日に。

Ruby/GTK

  とりあえず超簡易通信プログラムを作ってみた。shift_jis決めうちなのとwindowのサイズを大きくしたらボタンが大きくなるのがダメっぽい。はじめて作ったものだから、まあこんなもんでしょう。


#!ruby -Ks
 
if ARGV.size != 2
  STDERR.puts "usage: #$0 host port"
  exit 1
end
 
require 'gtk'
require 'uconv'
require 'socket'
 
window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window.signal_connect("delete_event") do
  Gtk.main_quit
end
 
style = Gtk::Style.new
style.set_font(Gdk::Font.fontset_load("-unknown-*-*-r-normal-*-*-100-*-*-*-*-windows-shiftjis"))
 
vbox = Gtk::VBox.new(false, 0)
 
log_vadj = Gtk::Adjustment.new(0,0,0,0,0,0)
log_text = Gtk::Text.new(nil, log_vadj)
log_vs = Gtk::VScrollbar.new(log_vadj)
 
log_text.set_editable true
 
log_hbox = Gtk::HBox.new(false, 0)
log_hbox.pack_start log_text, true, true, 0
log_hbox.pack_start log_vs, false, false, 0
 
send_hbox = Gtk::HBox.new(false, 0)
send_entry = Gtk::Entry.new
send_entry.set_text(Uconv.sjistou8 'ここに入力')
send_button = Gtk::Button.new('Send')
send_hbox.add send_entry
send_hbox.add send_button
 
send_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
  puts Uconv.u8tosjis send_entry.get_text
#  log_text.insert_text send_entry.get_text, log_text.get_point
  $sock.puts Uconv.u8tosjis send_entry.get_text unless $sock.closed?
end
send_button.set_flags(Gtk::Widget::CAN_DEFAULT)
 
log_text.set_style style
send_entry.set_style style
 
vbox.add log_hbox
vbox.add send_hbox
window.add vbox
 
send_button.grab_default
 
Thread.start do
  $sock = TCPSocket.open ARGV.shift, ARGV.shift.to_i
  while line = $sock.gets
    log_text.insert_text Uconv.sjistou8(line), log_text.get_point
  end
end
 
window.show_all
Gtk.main

2001年3月26日(月)

w3m cygwin

  w3mのconfigureが./whichが無いよっていうエラーを出すので調べてみると、/bin/shがshebangを解釈してくれないのが原因っぽいことがわかった。

JARH uconv

  コメントが「\」+改行で継続できるかどうかは普通は使わないのでなかなか難しい。どこかにまとまってないかな?


require 'uconv'
print Uconv.u16tou8 "\xFF\xFE"+'Just another Ruby hacker,'.gsub(/./,"\\&\000")
nDiary 要望

  index.htmlは、後から書いたものが上に来るようにできませんか?


2001年3月27日(火)

news nntp

  エラーになる?と思ってtelnetで直接つないでみたら「400 No space left on device writing logging artsize file -- throttling」となった。


2001年3月28日(水)

Ruby mkcom rb2exe

  mkcomでRTtoolのrt2がうまく動かないと言う話を聞いたので、#ruby %0 %@の行を以下のように変更して解決。ファイル名がdowncaseじゃなかったり9文字以上だったりファイルの中身がShift_JISじゃなかったりしたらダメっぽいけどrt2の場合はこれでよさそう。
rb2exeはどうだろうと試すときに、exe化したファイルを変更したら「プログラムが大きすぎてメモリ内に収まりません.」とでて驚いた。com化したファイルは編集してもokだけどexe化した方はダメらしい。


#ruby -Ks %0 %@
$0.downcase!
$0.sub!(/\.com/i, '')
$0.gsub!(/\\/, '/')
RTtool

  インストール方法についての説明がみつからない。

nDiary

  逆順表示が実装されたのでバージョンアップしてみた。

Ruby

  某所ってみんな結構みてるのかな。ちなみにBTSのは思いっきり某所からそのままですが。

Cygwin shebang

  /bin/shが解釈する必要はないと言われても解釈してくれないのは/bin/[rs]sh以外の/bin/*sh.exeのうち/bin/shだけなので不思議なのです。

$ cat ok
#!/bin/echo ok
$ ./ok
ok ./ok
$ /bin/sh -c ./ok
./ok: not found
$ /bin/tcsh -c ./ok
ok ./ok
$ /bin/bash -c ./ok
ok ./ok
$
JARH 終了時処理

  終了時処理いろいろ。いっぺんに出すとネタ切れになります。細かく出そうとすると忘れそうになります。忘れるぐらいならネタ切れを選びます。義務でもないし、すでに何度かネタ切れになってるし。


ObjectSpace.define_finalizer Object.new, proc { print 'Just another Ruby hacker,' }
END { print 'Just another Ruby hacker,' }
at_exit { print 'Just another Ruby hacker,' }
trap(0) { print 'Just another Ruby hacker,' }
trap 'EXIT', "print 'Just another Ruby hacker,'"

  finalizerはGCされる時。
ENDとat_exitとtrapはインタプリタ終了時。
finalizerとENDとat_exitは複数登録できるが、trapは1つしか登録できない。
ENDは登録されたのと逆順に実行される。ENDは「eval "def hoge;END{};end;hoge"」のような場合に使えない以外はat_exitと同じ。

  finalizerをトップレベルのself、いわゆるmainに対して登録するとprintされなかった。

topics

  たまってきたのでtopicsも生成するようにしてみた。


2001年3月29日(木)

Cygwin shebang

  /bin/shだけ変だった原因はCYGWIN環境変数にnteaが入ってしまってたからでした。なんでnteaなんて入っていたのかが謎。とりあえず必要なさそうだったのでCYGWIN環境変数自体を削除。

bind in chroot

  bind-8.2.3-1vl1をchrootにしてみた差分をとってみた。/etc/rc.d/init.d/syslogも書き換えないといけないので単独のパッケージとして公開するのは無理があるかも。


2001年3月30日(金)

UBE to rubyist ML

  ML宛とowner-宛と直の3通きた。http://add.yahoo.com/fast/help/us/privacy/cgi_feedbackにUnsolicited Messages/SPAMとして送ってみた。

n行目からm行目まで取り出す (head tail)

  IRCnetの「#うにっくす」より。「tail +2 hoge |head -5」で2行目から5行(5行目までではない)取り出せる。headとtailでできそうとは思いましたが、tailの+nっていうのは知らなかったです。

BIND

  BINDをchrootにする設定にしてrestartすると止まった。設定が間違ってたのが原因。しかもsshでもコンソールからもログインできなくなった。仕方がないのでCtrl+Alt+Delで再起動してシングルユーザモードで修復。起動してから直そうと思ってちゃんとBINDの設定を直さなかったらsquidやcronで止まってすんなりいかず何度か再起動を繰り返した。


2001年3月31日(土)

Ruby ローカル変数p

  「p p #=> nil」です。idと同様の落とし穴です。


上へ indexへ
copyright © 2000 ZnZ