No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 883 | 884 | 885 |...| 903 | 904 | 905 || Next»

CRCをテキストに埋め込むプログラム

IOCCC2004 のプログラムを眺めていたら omoikane.c なるファイルを発見(omoikaneはハンドルネームらしい).名前がいい感じなのでソースを見てみる.なにやら何かのキャラクターのAAになってるらしい.よく見てみると "Moekan" "kero Q" なる文字が... 説明テキストを読むと "Rinia is a tool for embedding CRCs in text files." だし... ということで,もえカンのリニアを模しているらしいが,作者のコメントどおりあまり良く分からない.

それはさておき,プログラムの動作自体はとても面白い.テキストファイルとかを読み込んで,CRCをそのテキストの中に埋め込むらしい.もちろん,そのCRCは「埋め込まれたCRCの文字列を含んたファイルのCRC」である.まあ,CRCを埋め込むファイル全体のCRCが変わるわけで,簡単に埋め込めないことは容易に理解できる.仕組みとしては,入力でCRCを埋め込む場所とCRC調整のために使える置換してもいい部分を用意してもらう.そんで,現在時刻を使って最後の置換可能文字(もしくはCRC埋め込み位置)までのCRCを決めちゃって,それを種にしてその後ろのCRCを計算してそれをファイルに埋め込む.あとは,がんばってその適当に決めてしまったCRCを達成するように置換文字を全パタン試す.うまくCRCを調整できたらおわり.まあ,それ以外のやり方が無いよねと思う.

ところで,IOCCCに出されるだけあってソースは読みにくい.3項演算子が大量に使われているのが主な原因.でも根気で読んでみると結構知らなかった書き方などを学べて勉強になる.この作者は他にもいろいろやっているようで,ホームページを見てみるとかなり面白い.どうやらソフト屋さんのようでACM/ICPCで World Final にいってたり ICFP のプロコンにでたりもしたらしい.Development Tools に vim はあっても emacs が無いあたりもすばらしい.なにより,日本人じゃないだろうにドメインが uguu.org だったり... とにかくすげぇなぁ.

シマリスの子供が出回る季節だなぁ

この週末に実家に帰っている.そんで今日は家族で買い物に出た.うちの家族は買い物ついでによくペットショップによるのだが,今日もやっぱりペットショップによった.で,昨日入荷したらしいシマリスの子が居たわけで,数十分悩んだ挙句に購入決定.店員が手で掴んだときは鳴いていたのだが,家に帰ってみると人の手の上でしか寝付かない.どうやらちゃんと手乗りになってくれるらしい.とにもかくにも,また長生きしてくれることを願いつつ,新しい家族の一員が増えましたとさ.

ただいまの最小n回HelloWorldプログラム

とりあえず,bash などのシェルスクリプトで外部の yes と head を呼ぶバージョン:

yes $0|head -$1

ただし,"Hello World"というファイル名で保存して,

bash Hello\ World 10

などで実行.とりあえず 15バイトで今のところ最小.

次に,perl で

print"$0\n"x$ARGV[0]

を同様に "Hello World" というファイル名で保存.

perl Hello\ World 10

などで実行.とりあえず 20 バイトで外部コマンド使用せず.

実行時のファイル名を使用しない場合には,それぞれ $0 を Hello World で置き換えるべし.その場合,24バイトと29バイトになる.

さて,これ以上縮まるかどうか... とりあえず言語の候補としては perl 以外に無い気がするのでむりかも.文字列と数値を自動で変換してくれて繰り返しが簡単でコマンドライン引数が簡単に扱えて... そんな言語が他にあったかなぁ?

DHCP on Cygwin

coLinux に対して DHCP でIPを割り振りたい.ホストPCがネットワークにつながっていなくても.

ということで,簡単な解決法はネットワークの共有を使ってひとつのインターフェースを 192.168.0.1 に固定し,その上で Windows の DHCP が立ち上がるようにすればいい.この場合,接続が切れていようが問題ない.しかし,この方法は少々使いにくいので,自前でDHCPを動かしてみることにした.

で,Cygwin にDHCPがあるだろうと思ってたら無かったわけで,自分でコンパイルしてやらないとならない.とりあえず,cygwin でコンパイルするためのパッチをここらへん(dhcp-3.0.1rc11-cygwin.patch)から落としてきて,本体を ISC (dhcp-3.0.2.tar.gz)から落としてくる(バージョンが違うが気にしない).落としたら解凍してパッチ当ててコンパイルしてインストール.(パッチのときに行が合わないと文句が出るが無視)

tar xfvz dhcp-3.0.2.tar.gz
cd dhcp-3.0.2
/bin/patch -p1 < ../dhcp-3.0.1rc11-cygwin.patch
./configure
make
make install

で,設定ファイル(/etc/dhcpd.conf)を適当に書いてやる.下のは 192.168.1.250 のインターフェースに対して DHCP を立ち上げている.

local-address 192.168.1.250; # This limits dhcpd to listening to this interface
max-lease-time 180;
default-lease-time 180;
ddns-update-style none;
option routers 192.168.1.250;
subnet 192.168.1.0 netmask 255.255.255.0 {
   authoritative;
   range 192.168.1.100 192.168.1.200;
   log(debug, "debug 192 DHCPD-logging");
   log(debug, binary-to-ascii(10,8, ".", packet(24,4)));
}

実行は

dhcpd -d eth1

とかやれば動くのだが...  少々問題が.とりあえず,DHCPを動かすインターフェースにケーブルが接続されていないと起動できない.そのため,coLinux の立ち上げ直後にしか dhcpを立ち上げるタイミングが無い.

さーてどうしようかなあ?

最短のn回 "Hello World "

ちょっとした疑問.

コマンドライン引数から回数 n を読み込み,"Hello World"を n 回(n行)出力する

というプログラムを作るとして,ソースコードのバイト数換算で最短となるプログラムはどれくらい短いのだろうか? 条件として以下を考える.

  • インタプリタ形式であれば
    interpreter sourcecode n
    
    のようにインタプリタプログラムを指定してよい.(#! の行はバイト数にカウントしない)
  • 外部のファイルに対して入出力してはいけない.(stdout のみ出力可能)
  • Hello World 以外の文字を出力してはいけない.('"'とかを出してはいけない)
  • 自前でプログラミング言語を作った場合はその処理系も倍とすうとしてカウントする.
  • コマンドライン引数が正当でない場合の処理は考えなくてよい.

さてどれくらい短くできるかな? Unix の標準的なコマンド sed, grep, awk, head, tail, yes とかは使ってもいい場合にはどうだろう?

雨は嫌だ...

自転車には泥除けが付いていない.木から落ちてきた雄花だか雌花だかが道路一面に広がっている.そして今日は雨が降った.

そんな中を全力で自転車こいだ.

結果としてかなり悲惨な状況になった.これだから雨は嫌~.まあ,泥除けをつければいいんだけど.

«Prev || 1 | 2 | 3 |...| 883 | 884 | 885 |...| 903 | 904 | 905 || Next»
Search
Feeds

Page Top