Just another Ruby porter,

〜2010年11月中旬〜


<Prev(,) | Next(.)> | Recent(/)>> | RDF

2010-11-11 (Thu)

[Ruby] makeのコマンドライン表示を隠す

なつかしい アイデアが採用された。

% make miniruby
compiling ../ruby/trunk/main.c
compiling ../ruby/trunk/dmydln.c
compiling ../ruby/trunk/dmyencoding.c
compiling ../ruby/trunk/version.c
compiling ../ruby/trunk/dmyversion.c
compiling miniprelude.c
compiling ../ruby/trunk/array.c
compiling ../ruby/trunk/bignum.c
compiling ../ruby/trunk/class.c
compiling ../ruby/trunk/compar.c
compiling ../ruby/trunk/complex.c
compiling ../ruby/trunk/dir.c
compiling ../ruby/trunk/dln_find.c
compiling ../ruby/trunk/enum.c
compiling ../ruby/trunk/enumerator.c
compiling ../ruby/trunk/error.c
compiling ../ruby/trunk/eval.c
<以下省略>

のような表示になる。

V=1で今までのように表示する。

% make V=1 miniruby
\
	gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT   -I. -I.ext/include/x86_64-linux -I../ruby/trunk/include -I../ruby/trunk -o main.o -c ../ruby/trunk/main.c
\
	gcc -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT   -I. -I.ext/include/x86_64-linux -I../ruby/trunk/include -I../ruby/trunk -o dmydln.o -c ../ruby/trunk/dmydln.c
<以下省略>

\とかインデントとかちょっとうるさい感じかな。


2010-11-12 (Fri)

[Golf] weekday names

なぜか各曜日の後に空白が1個。これが結構曲者。結構奥が深い。


2010-11-13 (Sat)

[Net] 瞬間停電でネットワークの調子がよくなった

PCが再起動されてて変だと思ったら、今朝瞬間停電があった模様。
なぜかここ数ヶ月タイムアウト頻発していたネットワークの調子がよくなった。
でもPCはつい2,3日前にも再起動したのでこれが原因ではない。
そうか、ルータかと思い至る。交換したやつはだめだめだな、SBよ。
まあ、でもルータをリセットすればいいとわかっただけもうけものと考えよう。


2010-11-14 (Sun)

[crontab] fri/2の件

嘘だった。fri/2としても1,3,5週目の金曜日にはならない。
そもそも曜日のところで*/2としてもsun,tue,thu,satという意味なので隔週どころじゃない。
でしかもfri/2としてもfriと指定したのと同じで/2は無視される。
無視されるというか/はrangeかlistにしか効かない。

なんか自分に都合よく解釈していたようで。


2010-11-15 (Mon)

[Golf] Bigger power+of two

変遷。最初は素直に。38Bだが、これ以上縮みそうもない。

$<.map{|x|i=1;0while x.to_i>=i*=2;p i}

次にwikipediaかどこかに載ってたCでビット操作する方法をRubyへ移植。
要するに2進数で考えてbitの0を全部1にして+1すればいい。

$<.map{|x|p 1+x.to_i.to_s(2).tr("0","1").to_i(2)}
$<.map{|x|p 1+("%b"%x.to_i).tr("0","1").to_i(2)}
$<.map{|x|p 1+("%b"%x).tr("0","1").to_i(2)}
$<.map{|x|p 1<<("%b"%x).tr("0","1").size}
$<.map{|x|p 2<<Math.log(x)/0.693}
$<.map{|x|p 1<<("%b"%x).size}

29Bになった。途中でlog2で考えればいいと気づきそっち方面へ。
28Bは/$/を使うんだろうなというのまでは気づいたが、.<<とのからみまでは思い付かなかった。

1.9だとMath::log2が存在するので

$<.map{|x|p 2<<Math.log2(x.to_i)}

でいける。って、1.8のMath::logはなんで文字列を受け付けるんだ?


2010-11-16 (Tue)

[Soft] LONG RANGE ZIP 0.530

Description:
LRZIP is a compression program that can achieve very high compression ratios and speed when used with large files using unlimited sized compression windows. It uses the combined compression algorithms of zpaq and lzma for maximum compression, lzo for maximum speed, and the long range redundancy reduction of rzip. It is designed to scale with increases with RAM size, improving compression further. A choice of either size or speed optimizations allows for either better compression than even lzma can provide, or better speed than gzip, but with bzip2 sized compression levels.

2010-11-17 (Wed)

[Golf] electronic dice

Sorobanとか最近この手の問題が多いな。まずはバイナリに逃げずに解いてみる。


2010-11-18 (Thu)

[Shell] bashとzshの配列

まさかこんなところが違うとは思わなかった。

% bash -c 'a=(0 1 2); echo ${a[1]}'
1
% zsh -c 'a=(0 1 2); echo ${a[1]}'
0

ゴルフ的には-1の有無で2B違う。それ以前にzshでは$a[1]でもいいというのがあるが。


2010-11-19 (Fri)

[Golf] weekday names

strftimeに気づけばあとはどこから1週間表示するかだけだけど、
yvlさんの解は一瞬悩んだ。

loop{puts Time.gm($$+$.+=12).strftime'%A '}

ゴルフ場では pidを自由に設定できるという、とんでもない機能があるから成立する解ではある。
たぶんオーバーフローするぎりぎりのあたりにpidを設定すれば、
7回表示してout of rangeで落ちるんだと思う。
わかりやすく直近であてはまる年を例に挙げると

7.times{puts Time.gm(2005+$.+=12).strftime'%A '}

となる。$.はスクリプトを読み込んだときに1行しかないので1になる。
最初はTime.gm(2018)となるが、これは2018-01-01を意味する。

% cal 1 2018
    January 2018
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

つまり2018, 2030, 2042, ...のように1月1日の曜日を12年ごとに順に表示すると、
うまいこと月曜日から日曜日までそろうことになる。
日付をインクリメントするんじゃなくて年を使うというのはすごい発想だ。

1.9だと$.の初期値が0なのはまあいいとして、Timeがout of rangeにならないのでこの手は使えない。


2010-11-20 (Sat)

[Golf] weekday names

今日も凝りもせずにweekday names。Bash編:

printf "%s
" {Mon,Tues,Wednes,Thurs,Fri,Satur,Sun}day

printf "%sday
" Mon Tues Wednes Thurs Fri Satur Sun

for i in {4..10}
{
date -d1/$i +%A\
}

for i in {1..7}
{
date -d2/$i +%A\
}

seq -f"date -d2/%g +%%A\ " 7|sh

printf(1)のフォーマット文字列は引数のほうが多い場合は必要な分だけ再利用される。
2/1は2月1日を意味するので今年限定の解となる。

% cal 2 2010
   February 2010
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

これ以上は無理かと思ったら1B更新された。となると{1..7}しかないと思ってevalを思いついた。

eval "date +%A\  -d2/"{1..7}\;

それにしても、 awkの解は全然違うのにサイズが同じなのは笑った。


<Prev(,) | Next(.)> | Recent(/)>> | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!