Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ 体重が2700gに達したらしい。
15%以上増量したわけかあ。まだまだ小さいけど。
ほっぺたはだいぶ膨らんできて、赤ん坊らしくなってきた、ような気はする。
_ 夜に泣きまくるという噂もあったのだけど、私がいたら大人しく寝てた。いい子だ。
もっとも、明け方は暴れてたけど。
_ いろいろ表情にパターンがあることがわかってきたんだけど、それぞれの意味はまだわからない。
あと、寝言(?)が異様に多い。寝るときは黙って寝ろよ。
_ ebanさんに[ruby-talk:206778]を教えてもらった。
仕様はspecに書いてあるのでそれを参照。
確かにRubyなのだが、でもいろいろ今と違っていて面白い。
大文字で始まる識別子も定数じゃなくローカル変数だとか、代わりに%で始まる識別子が定数だとか、doが変なところにあるとか、endの後にifやdefなどが書けるとか、まあいろいろ。
_ 最近のgccだとvarargs.hを#includeすると怒られるのと、未定義のメソッドを呼ぶといきなりcoreを吐いちゃうのと、その2点を修正したパッチ。
あと、手元の環境(NetBSD)だと、リンク時に-lcryptが必要なのだけど、その辺はめんどくさくて手を入れてないので、各自で対応してください。
--- ruby-0.49-orig/array.c 1994-07-18 16:32:54.000000000 +0900
+++ ruby-0.49/array.c 2006-08-08 14:26:09.000000000 +0900
@@ -42,8 +42,6 @@
-#include <varargs.h>
+#include <stdarg.h>
VALUE
-ary_new3(n, va_alist)
- int n;
- va_dcl
+ary_new3(int n, ...)
{
@@ -58,3 +56,3 @@
- va_start(ar);
+ va_start(ar, n);
for (i=0; i<n; i++) {
diff -U1 ruby-0.49-orig/class.c ruby-0.49/class.c
--- ruby-0.49-orig/class.c 1994-07-18 10:49:41.000000000 +0900
+++ ruby-0.49/class.c 2006-08-08 14:27:02.000000000 +0900
@@ -304,3 +304,3 @@
-#include <varargs.h>
+#include <stdarg.h>
#include <ctype.h>
@@ -308,6 +308,3 @@
int
-rb_scan_args(args, fmt, va_alist)
- VALUE args;
- char *fmt;
- va_dcl
+rb_scan_args(VALUE args, char *fmt, ...)
{
@@ -326,3 +323,3 @@
- va_start(vargs);
+ va_start(vargs, fmt);
diff -U1 ruby-0.49-orig/error.c ruby-0.49/error.c
--- ruby-0.49-orig/error.c 1994-07-11 11:57:28.000000000 +0900
+++ ruby-0.49/error.c 2006-08-08 14:28:19.000000000 +0900
@@ -15,3 +15,3 @@
#include <stdio.h>
-#include <varargs.h>
+#include <stdarg.h>
@@ -61,5 +61,3 @@
-Error(fmt, va_alist)
- char *fmt;
- va_dcl
+Error(char *fmt, ...)
{
@@ -67,3 +65,3 @@
- va_start(args);
+ va_start(args, fmt);
err_print(fmt, args);
@@ -73,5 +71,3 @@
-Warning(fmt, va_alist)
- char *fmt;
- va_dcl
+Warning(char *fmt, ...)
{
@@ -82,3 +78,3 @@
- va_start(args);
+ va_start(args, fmt);
err_print(buf, args);
@@ -87,5 +83,3 @@
-Fatal(fmt, va_alist)
- char *fmt;
- va_dcl
+Fatal(char *fmt, ...)
{
@@ -93,3 +87,3 @@
- va_start(args);
+ va_start(args, fmt);
err_print(fmt, args);
@@ -99,5 +93,3 @@
-Bug(fmt, va_alist)
- char *fmt;
- va_dcl
+Bug(char *fmt, ...)
{
@@ -108,3 +100,3 @@
- va_start(args);
+ va_start(args, fmt);
err_print(buf, args);
@@ -114,5 +106,3 @@
-Fail(fmt, va_alist)
- char *fmt;
- va_dcl
+Fail(char *fmt, ...)
{
@@ -121,3 +111,3 @@
- va_start(args);
+ va_start(args, fmt);
vsprintf(buf, fmt, args);
diff -U1 ruby-0.49-orig/eval.c ruby-0.49/eval.c
--- ruby-0.49-orig/eval.c 1994-07-18 18:06:31.000000000 +0900
+++ ruby-0.49/eval.c 2006-08-08 14:37:21.000000000 +0900
@@ -1349,3 +1349,3 @@
Fail("undefined method `%s' for \"%s\"(%s)",
- rb_id2name(NUM2INT(id)),
+ rb_id2name(id),
RSTRING(desc)->ptr,
@@ -1563,10 +1563,6 @@
-#include <varargs.h>
+#include <stdarg.h>
VALUE
-rb_funcall(recv, mid, n, va_alist)
- VALUE recv;
- ID mid;
- int n;
- va_dcl
+rb_funcall(VALUE recv, ID mid, int n, ...)
{
@@ -1582,3 +1578,3 @@
- va_start(ar);
+ va_start(ar, n);
for (i=1;i<argc;i++) {
diff -U1 ruby-0.49-orig/ruby.h ruby-0.49/ruby.h
--- ruby-0.49-orig/ruby.h 1994-07-15 11:17:25.000000000 +0900
+++ ruby-0.49/ruby.h 2006-08-08 14:29:45.000000000 +0900
@@ -290,4 +290,4 @@
-VALUE rb_funcall();
-int rb_scan_args();
+VALUE rb_funcall(VALUE, ID, int, ...);
+int rb_scan_args(VALUE, char *, ...);
diff -U1 ruby-0.49-orig/struct.c ruby-0.49/struct.c
--- ruby-0.49-orig/struct.c 1994-07-18 17:06:54.000000000 +0900
+++ ruby-0.49/struct.c 2006-08-08 14:30:47.000000000 +0900
@@ -78,8 +78,6 @@
-#include <varargs.h>
+#include <stdarg.h>
VALUE
-struct_new(name, va_alist)
- char *name;
- va_dcl
+struct_new(char *name, ...)
{
@@ -91,3 +89,3 @@
GC_PRO3(st, struct_alloc(C_Struct,name));
- va_start(args);
+ va_start(args, name);
@@ -97,3 +95,3 @@
- va_end(vargs);
+ va_end(args);
GC_UNLINK;
_ 出てた([ruby-dev:29228])。
例によってミラーしてあるのでmd5sumなど各自でチェックすること。
ちなみにサイズは4437615バイト。
_ IRC某チャンネルでのお題。Windowsのコマンドプロンプト(Cygwinなし)で、よくあるhexdumpをRubyのワンライナーで実現するにはどうすればよいか。
いくつか回答が出たので、並べてみる。
ruby -e "ARGF.binmode.each_byte.with_index{|b, i| print '%08x:' % i if i % 16 == 0; print ' %02x' % b; puts if i % 16 == 15}" file
ruby -e "ARGF.binmode.read.unpack('H*')[0].scan(/../).enum_slice(16).with_index{|b, i| puts(('%07x0: ' % i) << b.join(' '))}" file
ruby -e "ARGF.binmode.each_byte.enum_slice(16).with_index{|v, i| printf %[%07x0: %s\n], i, v.map{|c| c.unpack('H*')}.join(' ')}" file
前2者が私、最後が中田さん。
1つ目のは最後の行が16バイトに満たないと改行しないけど、コマンドプロンプトならそれでも害はなかろう。
ruby -renumerator -e "ARGF.binmode.to_enum(:each_byte).each_with_index{|b, i| print '%08x:' % i if i % 16 == 0; print ' %02x' % b; puts if i % 16 == 15}" file
ruby -renumerator -e "ARGF.binmode.read.unpack('H*')[0].scan(/../).enum_slice(16).each_with_index{|b, i| puts(('%07x0: ' % i) << b.join(' '))}" file
ruby -renumerator -e "ARGF.binmode.to_enum(:each_byte).enum_slice(16).each_with_index{|v, i| printf %[%07x0: %s\n], i, v.map{|c| '%02x' % c}.join(' ')}" file
_ 見比べると気付くと思うけど、1.9ではいつの間にかEnumerable::Enumerator#with_indexなんていうメソッドが追加されている。素敵だ。
被捕捉アンテナ類
[\ay antenna (testing)]
[Ant]
[Antenna-Julia]
[LayserあんてなV2]
[nAntenna]
[nuance de Antenna]
[Rabbit's Antenna]
[Read List]
[Ruby hotlinks 五月雨版 (るるりん。)]
[してたま (私的アンテナ with たまてばこ)]
[ただのあんてな]
[ちゃらんぽらん]
[でこぽんリンク]
[なよろアンテナ]
[にっきトレーサー]
[偽善者あんてな - 2nd season -]
[湘南日記放送局(SDB)]
[はてなの各アンテナ]