サイトリニューアル

テーマ:
巨大なメニューが邪魔
フレームを使ってスクロール可能にしてみた
今度は スクロールさせるのが めんどう

サブメニュー方式にしてみる
それが今日の課題

http://travel12.fc2web.com/new.html
AD

ソート 遠い思い出

テーマ:
数万行のファイルをソートする必要に迫られた
今は メモリもふんだんにあるので 心配ないけれど それでも 巨大なファイルのソートが必要に成る時もあるだろうから その時の手法を 覚え書きとして残しておこうっと

そんなに大きなファイルはメモリに入らない
メインメモリは65536バイトしかないのだどうする?
ビデオラムが65536の二倍あったこれのほとんどが使用可能これだ! と思ったが、そことのやり取りが複雑で 時間もかかるので却下
なんとか 65536 いや 実際には 5万バイト程度でやらなくてはいけない 手始めに ファイルの構造を調べた最長の行は何バイトか?
嬉しい事に 65536バイトを超える行は存在しなかった
あるわけない フロッピーディスクにそんな巨大なファイルが入るはずが無いのだ
なので 一行のデータを表すのは 16ビットで間に合った
各行の長さをメモリに並べた
位置を記憶した方が 効率は良いが メモリが足りなくなる
長さがあれば そこから位置を計算できるじゃないか

この時1バイトに収まる長さの行がかなり多い事に着目して 特殊なフォーマットで扱った
改行の長さは もったいないから省く
その残りの長さが 255バイト未満であれば そのまま1バイトのメモリに置く
255バイト以上だった場合は 255 を置いて その後の2バイトを使って大きさを保存した
計3バイト必要で無駄にも見えるが、ほとんどが255バイト以下だったので この方が小さくて済んだ

  1     1
254   254
255   255 0 0
256   255 0 1

各行の長さがわかったら 行をメモリに読み込んで比較するわけだが 一回で一行読みきれるわけではない
1文字毎 読み込んでは比較する方式にした
一見効率が悪そうだが、1文字読む時にOSが多めに読んでおいてくれるようになっているので これで十分なのだ

比較はできたどのように比較すれば効率が良いだろうか?
クイックソート等を使ってみたが 効率が悪い
遠くの情報を比較すると 磁気ヘッドを移動する量が大きくなってしまうからだろう
近所の情報同士なら OSが多目に読み込んだ情報の内部で比較できる可能性が高いのだ
よって 隣同士を比較して もし 大小に違いが有ったら その行を入れ替えるようにした
ごちゃごちゃするので ここには書かないが 3通り考えられる
前の行が短い 前の行が長い 同じ
もちろん 行の長さ情報も入れ替える

これを お隣さんの入れ替えが無くなるまで繰り返せばよいのだ
入れ替えが無いって事は 並べ替える必要が無くなった
つまり 並べ替えが終わったって事だから
弱い機械に大きな仕事をさせる為 色々な手法を用いた
遠い思い出だ
AD

ソート

テーマ:
雨風呂には あらかじめ 記事の投稿順のリストができているのでしょう
自力で十万件のリストをソートすると どれくらい時間がかかるか想像してみました
データをひとつ持ってきては 適切な位置に入れてゆく方法が効率いいかな
全体を半分・四分の一・八分の一と 半分半分にして探して行く
なんて言ったかな バイナリサーチだったかな
まあ そんな方法で位置をさがす
これだと データ量が増えても比較回数があまり増えない利点があるから

えっと 表にしてみよう
データ数・比較回数
0・0
1・1
2・2
3・3
4・3
5・4
6・4
7・4
8・4
9・5
こんな感じ
一時間ぐらいかかるかなって雰囲気


AD

雨風呂読装置

テーマ:
お気軽に雨風呂お気に入りさんの所を見にゆけるように作った装置
使っているうちに だんだん問題がでてきた

飛ばし読みが出来ない
戻り読みが出来ない

なので ちょっと変更してみたいな と思った

次ボタンはもちろん必要
フレームを使ってIDリストを表示する
IDリストのクリックでブログの表示と共に 次ボタンも設定する
はたして できるだろうか?

楽天訪問者一覧保存

テーマ:
※記事中のURLはダミーです クリックしないでね

楽天日記の訪問者表示は ログインしていなければ見られない
と 思っていたら カウンタをクリックすれば見られる
そこで そのアドレスを lynx で表示させていたら ある程度の時間が経過すると 表示されなくなる
lynx URL
なので 毎回 URL を取得にいかなければならない
open(R, "lynx -source http://plaza.rakuten.co.jp/bimisekai/recommend/ |");
while(<R>){
if (/func=log([^\"]*)/){
$adr=$1;
last;
}
}
system("lynx -source http://plaza.rakuten.co.jp/bimisekai/?func=log$adr >1.tmp");

これで 訪問者情報を獲得できる
1.tmp の部分をユニークな名前にすれば リストがたまってゆくだろう
たとえば こうだ
$savfn = localtime(time());
system("lynx -source http://plaza.rakuten.co.jp/bimisekai/?func=log$adr >$savfn.tmp");

リストの引き算

テーマ:
リストファイルが二つある


1.txt

abc
def


2.txt

abc
ghi


1.txt から abc を消す意味で 以下のようにした

cat 1.txt 2.txt | sort | uniq -u

結果は たぶん 以下のように なる

def
ghi



abc だけ消せばよいのに ghi は余計だ
悩んだあげく 正解を見つけた

cat 1.txt 2.txt 2.txt | sort | uniq -u

2.txt を二度加える事により 2.txt 内の情報が出てこない
1.txt から 2.txt と重複する部分を消す事になる

並びに意味がある場合には これじゃだめ
perl 等を使う必要がある

手順
1.txt を配列に読む
2.txt を配列に読む

*1:1.txt から 1行取り出す 行が無ければ終り
2.txtの 各行と比較して すべて一致しなければ 出力
*1からくりかえす

落ちない

テーマ:
Vine3.0 + WindowMaker + VNC
こんな風にして キーボードやマウスが無くても動くようにしてある
今年 電源を落としたのは 一回ぐらい
それも 動作がおかしくなったわけでは無い
ただ 節電の為 電源を落としただけ

命令した事を もくもくとこなす姿に 感動すらする