$,=' ';$\=',';print [:Just,:another,:Ruby,:hacker].map{|x|x.id2name}.join
winだけじゃなくてmingwやdjgppも調べた方がいいという噂。
# $KCODEの自動判断。
if /^[nN]/ === $KCODE
if /win|mingw|djgpp/i === RUBY_PLATFORM
$KCODE = 'SJIS'
else
$KCODE = 'EUC'
end
end
cygwinのmkisofsも2バイト目に「\」の入ったファイル名(というかフォルダ名)を無視してしまっていた。
ということはcygwinのdllのレベルで対応してないと無理って事ですか…。
ファイルリストを比較するためにCygwinのfindでリストをとろうとしたら同じ問題ではまるし、仕方がないからWindowsキー+Fで検索してファイル一覧をコピーして…としようとしたらファイル数が多すぎてハングアップっぽくなるしで大変だったけど、結局DOS窓でdir/b/sした後、頭についてるドライブとかをとってsortして比較して解決。
いや「\」の入ったフォルダがバックアップできなかったという点では解決じゃないけども。
どうせファイル属性はmkisofsで保存されないのならLinuxマシンにsamba経由で送り込んでそっちでmkisofsした方が良かったのかもしれない。
html と外部 inputの話。「任意の javascript を走らせることが出来てしまう。」といってもそのJavaScriptが動くのはサーバではなくそのJavaScriptを送ってきたクライアントのはず。自分で自分の首を絞めるのは自由だと思いますが、掲示板とかのような他のクライアントもみるようなところだとやっぱりまずいか。
日付の比較の話。month - 1
してるだけだと年を越せません。Dateでどうにかできないかと思ったらマニュアルがなくて使い方がわからず。ソースをみたところ年や月を足したり引いたりは出来なさそう。
無道編に書いてあった話が元で始まったrequire 'dir/...'?
のスレッドが盛り上がっている。
ちゃんと説明(説得)できないような機能ならつけるべきではないと思いました。
[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という風に場合分けしてみた。バグ回避のコードは実際にその機能を試してみて場合分けするのが定石。
特異メソッドは()をつければ大文字でも呼び出せます。とφ(.. )
def method_missing(methId)
methId.id2name+' '
end
print Just()+another+Ruby()+hacker.chop+','
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);
}
2通ずつは来てないです。実は3通ずつ…だと面白いのですがそういうこともなくちゃんと1通ずつのようです。
ちょっとforkについて勉強してみようと思っただけだったのに。
irbは入力したものがそのまま実行されてその結果がp をつけなくても表示されるのが楽でいいんだけど、インタプリタ自体に影響のあるもの($SAFE=4とか)を試すにはdebug.rbを使った方がいいのかな。
debug.rbの使い方を勉強してみよう…。
日付の比較の話。出来なさそうと書いたけど出来ることを発見。Date.today << 1
で1ヶ月前の日付が得られるのでこれをcurrent.year, current.month - 1, current.day
の代わりにd.year, d.month, d.day
のように使えばよさそう。
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}"
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
SafeEvalが一応完成。単体ではちゃんと動いてるのに、Thread使いまくりのプログラムに入れるとうまくいかない。うまくいかないのは2点。というか両方forkしたプロセスが落ちた後だから原因は1つ?
呼び出し方は直接実行と同じようにあるメソッドでpushして別の無限ループしているスレッドでpopしているだけなので、呼び出し方による違いはないはずなんだけど。
unless child = IO.popen('-')
print 'Just another Ruby hacker,'
exit!
end
print child.read
もしかして2つ目以降の子プロセス側でメインスレッドのような必要なスレッドまでkillしてしまっているのかも。今までのような全体が落ちるのよりは状況がましになったので、とりあえず保留。
今まで何度も挫折してきた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.read
をbuf = Uconv.sjistou8 file.read
にしないとShift_JISのファイルはよみこめなかった。
それからメニューを開いたら毎回「Gdk-WARNING **: gdkcursor-win32.c:gdk_cursor_new:121: LoadImage failed: 操作は正常に終了しました。」とコンソールの方にでているのが気になった。
今だとドキュメントが少ないのはどのGUIライブラリでも同じようなので、Windows用ではVisualuRubyを使った方がいいのかも。
SafeEvalが他のものに入れているとうまく動かないのは、[ruby-dev:12404] fork in threadsからのスレッドによるとメインスレッドまでkillしてしまっているからみたい。
TCPServer.openに2引数指定して特定のhostのみで接続を受け付けるのがマイブーム。dRubyも対応になるはず。
日本語 (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>
CGI::rfc1123_dateで%02d
ではなく%.2d
なのは何故なのかが気になった。
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')
winsup/cygwin/path.ccってことはCygwinの問題?
こう書き足すと.htaccessを直接指定で見えるようになった。
<Files .htaccess>
order deny,allow
allow from all
</Files>
kill出来ないのは不便なので、mingw版からcygwin版に戻した。
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
require 'nkf'
print NKF.nkf('-Z1','Just another Ruby hacker,')
print NKF.nkf('-r', 'Whfg nabgure Ehol unpxre,')
SPAM(2)ですが、その相手も同じように単に嘘アドレスとして書かれてるだけっていう可能性はないんでしょうか?
Date::between?というのもあったとは。これだけ高機能なのにドキュメント不足なのがとってももったいないです。
誰か書いてRDPに入れてほしい…。
と昨日書いて更新し忘れていたら、date2にMANUAL.rdというのを発見した。
('Just another '..'Ruby hacker,').to_s.delete('.').display
RWiki 1.2のインストールをしてみようとしたら、drubyとERbとmutexmがなくなっててはまったので、更新した。
ついでに更新の時に古いバージョンの方にcdしてしまって変になっていたのも対策してみた。
[1249211252, 538993006, 1869899877, 1914708050, 1969387808, 543711587, 1801810476].pack('N*').squeeze.display
httpsなサーバ(apache-ssl)にRWikiを入れたらhttp(略):443にリダイレクトされててはまったので、RWiki-develにパッチを投げてみた。
その前にrwiki-1.2/logに書き込めなくてはまっていたのは、mkdirしてwww-dataに書き込み権限を与えて解決した。
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
Struct.new('JARH', :Just, :another, :Ruby, 'hacker,'.intern).members.join(' ').display
「ci -l ファイル名」
最初にciするときはファイルの説明を入力する。
「.」だけの行で入力終了。
2回目以降は変更点を書く。
とりあえずこれだけで変更の履歴は残せる。
履歴は「ファイル名,v」というファイルに残る。
RCSというディレクトリがある場合は「ファイル名,v」というファイルはRCSディレクトリの中に入る。
履歴を利用したくなったらRCSについてもっと勉強してください。
これで履歴さえ残していれば、利用するのは後からどうにでもなります。とりあえず履歴を残すことをおすすめします。ファイルを1つずつ個別に管理するのが面倒になったらCVSを勉強するといいです。
fj.comp.lang.rubyでruby162-refm.rd.gzの話が。
ブラウザによってはダウンロードした時点ですでに展開されているという説明を書いたページを用意してそこにリンクするようにした方がいいのかも。
begin
print 'Just '
raise 'another '
rescue => e
print e, 'Ruby '
ensure
print 'hacker,'
end
riっていつの間にか0.6にまでバージョンがあがってましたか。
とりあえず超簡易通信プログラムを作ってみた。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
w3mのconfigureが./whichが無いよっていうエラーを出すので調べてみると、/bin/shがshebangを解釈してくれないのが原因っぽいことがわかった。
コメントが「\」+改行で継続できるかどうかは普通は使わないのでなかなか難しい。どこかにまとまってないかな?
require 'uconv'
print Uconv.u16tou8 "\xFF\xFE"+'Just another Ruby hacker,'.gsub(/./,"\\&\000")
エラーになる?と思ってtelnetで直接つないでみたら「400 No space left on device writing logging artsize file -- throttling」となった。
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!(/\\/, '/')
逆順表示が実装されたのでバージョンアップしてみた。
某所ってみんな結構みてるのかな。ちなみにBTSのは思いっきり某所からそのままですが。
/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
$
終了時処理いろいろ。いっぺんに出すとネタ切れになります。細かく出そうとすると忘れそうになります。忘れるぐらいならネタ切れを選びます。義務でもないし、すでに何度かネタ切れになってるし。
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されなかった。
/bin/shだけ変だった原因はCYGWIN環境変数にnteaが入ってしまってたからでした。なんでnteaなんて入っていたのかが謎。とりあえず必要なさそうだったのでCYGWIN環境変数自体を削除。
bind-8.2.3-1vl1をchrootにしてみた差分をとってみた。/etc/rc.d/init.d/syslogも書き換えないといけないので単独のパッケージとして公開するのは無理があるかも。
ML宛とowner-宛と直の3通きた。http://add.yahoo.com/fast/help/us/privacy/cgi_feedbackにUnsolicited Messages/SPAMとして送ってみた。
IRCnetの「#うにっくす」より。「tail +2 hoge |head -5」で2行目から5行(5行目までではない)取り出せる。headとtailでできそうとは思いましたが、tailの+nっていうのは知らなかったです。
BINDをchrootにする設定にしてrestartすると止まった。設定が間違ってたのが原因。しかもsshでもコンソールからもログインできなくなった。仕方がないのでCtrl+Alt+Delで再起動してシングルユーザモードで修復。起動してから直そうと思ってちゃんとBINDの設定を直さなかったらsquidやcronで止まってすんなりいかず何度か再起動を繰り返した。