諸星未来堂ワープ日記
MOROBOSHI Tomorou's
Warp Diary
1997 November 4th Week
Japanese-Language Contents
971126b[ mass and weight / 宇宙の「重たい」 ]
土井さんに向かって科学技術庁長官が「重かったですか?」と質問した(らしい。知らない)ことに関して「宇宙で『重かった』はなかろう!」というツッコミが出ているけども、たしかに無重力状態(無重量状態、あるいは、微弱重力状態、とかいうのが正確なのかな?)だから「重さ」はないだろうけども、質量は存在するわけだから、でかくて重い物体を宇宙に持っていったら(「でかくて質量が大きい物体」が正確だろうが)、持って支える必要はないだろうから、そういう意味の「重たい」ことはないだろうけど、ある場所からある場所まで、ある程度以上の速度で移動させようとしたら、短時間で加速するのに「力」が必要で、次に短時間で停止させるためにも「力」が必要で、動かす時に「重い」と感じるんじゃないんだろうか?
うー、なんか、わけわからん文章になったな。
重量がゼロでも慣性質量はある。と。
無重力状態じゃ、質量のでかい物体も、下に落ちはしないけど、だからってちょっと押したぐらいで、スーーーーーっと動いたりしないんじゃないの? と。
宇宙で「バケツ持って立ってろ」と言われても平気だけど、重たい扉はやっぱ重たい扉だ、とか。
つーことは、宇宙船内部で、パワーアンクル、パワーリストつけてると、それなりに運動になるのかもしれんなぁ。手足動かし始めるときと停止させるときに力がいるから。とはいえ、脚が地上で体重を支え続けているのに比べりゃ、へでもないか(^_^;;
で、人工衛星って、どれぐらい「重たい」のかなぁ? 土井さんが「ひょい」とか動かせるぐらいの質量なのかな? それとも「どっこらしょっと」と移動させたら最後、シャトルのベイをぶっこわしながら飛んでいくぐらい重たいのかなぁ。
あれ? だんだん、わからなくなってきたぞ。大丈夫か? 高校物理の範疇だぞ>オレ。
ブルーバックスあたりで説明してそうだなぁ。
つーわけで、他人のツッコミにツッコミいれたら、自分もよくわかってなかったらいしぞ>オレ。
あー、オイラ一応、質量(mass)と重さ(weight)が物理的には次元が違うことは、認識してますから、念のため。SIで書けば、質量は[kg]で、重さは[N]=[kg m s-2]。重さはつまり力の次元である、と。
何がわからないかというと、自分の「重たい」という概念のどの部分が慣性に関することで、どの部分が重力による部分か、ピンとこないというか。
「摩擦のない平面上で物体を押すときに、その加速の具合が慣性の大小である」とか考えてみても、完全に摩擦のないつるつるの平滑面とか、あんまり体験したことがないからなぁ。どうしても、摩擦面のことを考えてしまって、摩擦の大小は平面に垂直な方向にかかる力(垂直抗力)に比例するから(比例だっけ?)どーしても、重さ=重力の大小が関係してくるからなぁ。(んー? 摩擦係数の定義が「摩擦力/垂直抗力」って定義になってるだけで、別に、摩擦係数が常に一定とは誰もいってないみたいだなぁ。)
自分が支えずに大質量物体が移動できる状態としては、うーん、ぶら下がっているってのは、どうだろうか? 寺の鐘とか。けど、ぶら下がってる物体は単振動するからなぁ。(「単」振動じゃないかもだが)。寺の鐘を揺らすのが「重たい」のは、慣性質量がでかいからよりも、揺らす=横に移動させる、と、自動的に上に持ち上げることになるからなぁ。
と、いうわけで、重力井戸の底の地上人なオイラ達の身の回りにも「擬似的に無重力状態下で作業しているのと同じ状況」が発生しているはずなんだけど、なんか、「これや」みたいな例が思い浮かばなかったのだった。え? バラストつけて中性浮力(だっけ?)になった状態のスキューバーダイバー? うーん、たしかに重力井戸の下だけど、宇宙飛行士もダイバーも、オレにはかなり「別世界の人」だけども。
あー、地球周回軌道上で自由落下状態にある宇宙船(進行方向に船首が向いている)を考える。船内でキャッチボールをするとして、船首ー>船尾方向に投げたストレートは、軌道速度より遅くなり、船尾ー>船首方向に投げたストレートは軌道速度より速くなる。よって、それぞれ、ホップボール、フォークボールになるのではないか? とか思ったんだけど、どっちが、どうだっけ? (そもそも、船は地球に腹を見せてるのか背中を見せてるのかで「上下」の定義がちがうじゃん>オレ)。
回転円筒形スペースコロニー内部でのキャッチボールも知りたいなぁ。コリオリの力なのか。
971126a[ Peal - DIE the D.I.Y. - / Perl 日曜大工の終わり ]
フリーウェアで公開されているサーチエンジンのスクリプトは、実は、沢山あったのだった。
教えてもらったページは、こちら> http://www.kusastro.kyoto-u.ac.jp/%7Ebaba/wais/other-system.html
つーわけで、オレのしまえたスクリプトをまき散らさなくても、皆様におられましては自由に強力なサーチエンジンをフリーで利用することができる、というわけです。
と、いうわけで「このようにフリーで強力なサーチエンジンが公開されているわけなので、皆様も日記にサーチエンジンをどんどん搭載して、日々、内容不明なファイル群へと変貌しつつある日記ファイルを有効活用しませう!」と「だけ」主張することにしよう。
さっきのページだけど「サーバ常駐型」は勘弁してほしくて、インデクス作成形も、ちょっとインデクスが膨大になったりしたら、困るので、やぱ、CGIタイプでそのつど全文検索タイプかな、とか。個人的には「NepoSearch for Perl Ver.1.00」を導入してみるといいかもしれん、とか思うのだった。
「日曜大工が目的でないなら、既存のものをもってくるのがいいだろう」と言われてしまうと「日曜大工(つまり、自分の手でスクリプトをいぢくりまわすこと、自作のスクリプトを動かして眺めてよろこぶことそのものを目的とする行為)が目的ではなく、あくまで、検索の重要性を」とか主張するわけにも、いかないわけで。わはははは。
まぢで、正規表現とたわむれて睡眠時間を減らしている場合じゃないんだし。
そーゆーわけで、今回の「日曜大工」は終焉を迎えるのだった。また、何かの機会に、また、オレのきたないスクリプトをごらんにいれませう。ふふふ。
と、まぁ、こういう感傷とか挫折とかクヤシマリ(^_^;;とかと別に、最終回だけに、とりあえず、終わらす所まで終わらそう。(まー投げ出すときも、最低限度の後かたづけは)。
オイラ的に「最低限度、対処しておかなくちゃ、な問題点」と自覚しているのは、
1.の「やばいファイルが見える」ってのは、オイラの正規表現の知識が足りないせいなので、どっかで勉強するしかなし。
で、とりあえず、先に、2.の、サブディレクトリ再帰探索に関して。
これに関しては、きむら♪さん@ウクレレ日記、遠藤さん@クールアンド日記から「find.pl使うと吉」という指摘がやってきました。(お二人、どうもありまちょうでした)。
「find.plとは、すなわち、赤ラクダ本p.546を見れ!」とのこと。そこは付録B「Perlライブラリ」のページ。再帰的にファイル名を探すライブラリらしい。おぉ、ありまたい。んがしかし、何やらよくわからん話が。曰く「これらのルーチンは、主にfind2perlトランスレータをサポートするためのルーチンである。&findルーチンは、find(1)と同じように...」な、なんだ? find2perlって? それにfind(1)って? あわてて、索引みても、何もわからぬ。
うー? イタリックになっているところをみると「UNIXのコマンド」らしい。ためしに、find2perlと打ち込むと、
と、謎のスクリプトがディスプレイに登場.....???#!/usr/local/bin/perl require "find.pl"; # Traverse desired filesystems &find('.'); exit; sub wanted { ; }
find(1)はUNIXのコマンドであろうと検討をつけて、man findすると、出るわ出るわ9ページもある英語のmanが。つらつら眺めていると、
find . \( -name warp.htm -o -name 'w*.htm' \) -printとかいう例題が書いてあって(ないない)、英語の解説読むと「カレントディレクトリ以下の全てのwarp.htmと、'w*.htm'なるワイルドカードで表現されるファイル名がパス付きで表示される」とか。「-o」が「or」なのは、読まないとわからなかったけども、だいたい、何をいわんとしてるか、わかる。
で、ためしに、上のとおり、コマンドラインから入力すると、おぉ、ワープなファイルたちがずらずらと表示される!
つーわけで、findがUNIXの検索コマンドだとわかった。
と、いうわけで、実はfind2perlの正体に気づくまで、けっこう時間かかったのだが、まぁそれは忘れてしまったことにして、
けっきょく「find2perlに、findのオプション食わすと、同じ効果を持つperlスクリプトを作ってくれるんだね」ということ。
find2perl . \( -name warp.htm -o -name 'w*.htm' \) -print
と打ち込めばすなわち、
と、いうわけ。#!/usr/local/bin/perl require "find.pl"; # Traverse desired filesystems &find('.'); exit; sub wanted { ( /^warp\.htm$/ || /^w.*\.htm$/ ) && print("$name\n"); }
で、&find()ちうサブルーチンは、find.plちうPerlについてくるライブラリなのだ。つまり、sub wanted{}ちうサブルーチン部分に、やって欲しいことを書いておくと、細かい検索はfind.plがやってくれる、と。
おぉ、便利じゃん!
と、思ったのだけども、結局、find.plを読んで理解しないと、find.plが中で何をどうやってるかわからなくて、わからない以上、配列を名称わたししたり、できないわけで、結局、オイラのレベルじゃ、これ使っても、グローバル配列にぶち込むしかないので、うーん、とりあえず、使うのは保留。
で、話は突如、正規表現に戻るんだけども、つらつらfind2perlが出力した正規表現部分を見ていたら、オイラが想定していたのと、全然違う! おがしい? どうしてこれが、さっきのあれなんだ?
"w*.htm"つまり、「先頭がwで、任意の文字列があって、ピリオドがあって、htm」って文字列が、どーして/^w.*\.htm$/つまり「先頭がwで、ピリオドがあって、任意文字列があって、なぜかエスケープされてて、ピリオドhtmが文末」という正規表現になるんだ? 変だなぁ? *と.が逆な気がするし、どーしてピリオドをエスケープするんだ?
ものすごく時間がかかった上に、教えてもらったわけだが、
正規表現では「.」は「任意の一文字」で、「*」は「0回以上の繰り返し」だったのだ。ぐえええええええ。もぉ、ワイルドカードと正規表現がごっちゃまぜになっていたのかオレの頭は! つまり、オイラが「*」で表そうと企んでいた「任意文字列」は「.*」で、「任意一文字が任意回数出てくる」と表現されていたのだった。
思いこみは恐ろしいものだわ。いや、そうじゃないんだけども。
つーわけで、search16.plでコメントアウトしてた(まちがいやがった)正規表現を、find2perlが作成した正しまった正規表現にとりかえたので、search17.plでは、*.plとか、#warp.htm#とか、*.pr~とか、.htaccessとかは検索しなくなったよ。よかったねよかったよ。
で、これで終わりにしておけばいいんだけども、ついでに「admin」と「protected」と「secret」ってディレクトリは、検索しないようにしようと。んで、search17.plのファイル名削除んところにこれ加えたんだけど、これやっちゃうと、@allfilesから、adminとかprotectedが抜けてしまって、そのかわり、本来ディレクトリ名じゃないファイル名が昇格してきて、./warp.htm/w9711c.htmとか、恐ろしいファイルを探しにいって、ディレクトリ開けなくなって止まっていたのだった。ぐあ。やっぱ、ちゃんと、「if、ディレクトリ名が困った奴じゃない時、{探索}」ちう形にすべきなんだろうな。ぐえええ。やっぱ、思いつきで、プログラムの流れかえると、あぶないなぁ。
つーか、adminってaで先頭で、デフォルトで逆順で検索してるから、@allfiles検索する順序としては最後で、つまり、admin消した時点で、@allfilesが空になって探索が終わって、エラーが出ないのだ。だから、てっきり正解だと思っていたのだが、昇順で検索かけたら、adminが消滅して次のファイル名が嘘ディレクトリ名として昇格してきて速攻エラー。いやー、致命的なバグつくっても、よりによって、偶然うまく動く条件でテストしていたとは。ぐはすぎる世界。
あー、ってことは、なにか?「.*」とか「#hoge#」とかいうディレクトリがあると、それだけで、search17.plもバグるってことか? ぐえええええ。こりゃだめだな。根本的に、フローを考え直さないと。泥縄コードは、200行こえるあたりから、オレの記憶バッファからあふれはじめたようだな。ぐえええ。
つーわけで、search18.plはさくっと没にして、search15.pl?時代の「メインルーチンでgrepカマして@allfilesからいらないファイル名を抜く」方式に戻す。これがどーしてだめだったかというと「.*」みたいなファイルが「./hogehoge/.htaccess」みたいに前にディレクトリ名がついているせいで、消すに消せない、って都合だったんだけど、正規表現がちょっとわかってきたので、ワイルドカード的に書けば「*/.htaccess」って形で「任意文字列の後ろに/があって、その後ろにある.で始まるファイル」みたくやりゃいいかな、と。正規表現もよくわからんままに、よくまーここまできたもんだわ。さらに「admin」とかのディレクトリ名を抜くときも「*/admin/*」と、前後をスラッシュではさまれたやつだけ抜けば、その下のファイルは検索されない。「*/admin」っていうディレクトリ名だけは見えるんだけども、まーこれは、別にいいかな、と。
よく見ると、「.*」みたいな指定をすると「*/.hoge/*」みたいなディレクトリも消滅するから/^.*\/\..*[^/]$/かな? として、尻がスラッシュになった場合は生かすようにすべきなんだろうけど、ま、いっかー。ピリオドから始めるディレクトリは見えないディレクトリだー。
つーわけで、
search19.plにリネームして、search19.htmlから呼ぶと、動きます。
はー、というわけで、今回の日曜大工作戦は、とりあえず終了。
次回のネタとしては<h2></h2>とか、<strong></strong>に挟まれた文字列を抜いて一覧にするやつがいいかな。そしたら、タイトルリスト作る手間はぶけるしー。いや、他人様の偉い検索エンジンにはそういう機能がついてるんだろうけどさ。
って、10月にデザインかえたときから、日付タイトルにつけてた<h2></h2>タグ、はずしちゃったんだよなぁ。これじゃ、自動タイトラー作っても、自分のが抽出できないじゃん。うーん、デザインの都合で文章の論理構造をこわしちゃいかんなぁ。うーん、「そういう時に、CSS!」ちう声が聞こえてくる気もするのだが。
971125c[ sub-directory searching / サブ・ディレクトリ検索 ]
つーわけで、「スクリプトに間違いがある」と指摘されて「めんどうだから訂正しねー」と口答えしてめちゃ怒られたのは、オレだ。
つーわけで、「君のスクリプトは公開する段階じゃないね」と断言されてしまって、シオシオな気持ちなのは、オレだ。
ぐええええええええええ。
確かに、美しくない書法でバグ潜みすぎのスクリプトをネットにまき散らすのは、害悪かもしれん、と思うと、公開するのやめちゃおうかしらん、と思うのだった。
さて、
ディレクトリ再帰検索に関してだけども、赤ラクダ本p71に、dodir()という「サブディレクトリ内部のファイル名を再帰的に全部調べて表示する」例題が載ってたので、ありがたくも、まるごとパクって、再帰的にサブディレクトリのファイル全部を検索するスクリプトを作った。(うーん、この例題には著作権がありそうだなぁ。まずいかなぁ)。
とりあえずは、スクリプト冒頭の$dirで指定したディレクトリ内部を全部検索するスクリプトになった。。
サブルーチンに配列を名称わたししたかったんだけど、なんか、失敗したらとんでもないことになる、みたいに脅されてしまったし、サブルーチンの引数に、配列を二つ並べる方法がわからなかったので、グローバルな配列変数(つまりメインの配列変数そのもの)に、ちょくせつぶち込むとかいう、邪道中の邪道をぶちかます、オレ。ぐえええええ。再利用度ゼロ。
ファイル名が「./warp.htm」みたく出力されてるのに、メインで「.*」なファイル名を削除していたので、ファイルがひとつも出てこないので、首ひねってみたり。ぐえ。
ファイル名に./とかディレクトリ名とかついているので、サブルーチンで集め終わった@allfilesに削除かけても「./w9711/.htaccess」とかいう形になっていると削除できないので、困る。
しょーがないので、サブルーチン内部に処理をうつして、$_をs///かまそうと思ったんだけど、これってマッチした部分だけ消えるから、困る。しょーがないので、if($_ =~ m//){$s_ = '';}の形で抜こうとしたら、Out of Memoryでやがるのでビビリまくり。正規表現わからんすぎる。
しょーがないのでコメントアウトして本日はあきらめる。perlスクリプトやら、なんやら、全部ばればれ。.htaccessどころか、.htpasswdまで、ばれる。ぐえええ。
しかも、open命令に ||dieしかけておいても、エラーは、コマンドラインから起動しないと表示されないとわかった。
つーわけで、公開しないほうがいいような気もするけど、とりあえず公開しとくんで、誰か「不要なファイル名を抜く」部分の正しい書き方を、教えてください。こいつは、まぢで、ろくでもないスクリプトなので、インストールは奨めません。けど、search16.plにリネームしてsearch16.htmlから呼ぶと、動きます。「とりあえず、ディレクトリ内部の全ファイルを検索できる」のは、まちがいないんだけどね
オレ的には「美しくなくっても、とりあえず動くんだからいいじゃんかよ。ここにあって、とりあえず動くんだから」と主張したい気もするんだけど、やっぱ、ちょっとやばいかもしれん、とか。どれぐらいメモリくうか、とか、サバがどのぐらい不安定かとか、わからんし。
稼働サンプルはhttp://web.sakura.ne.jp/~tomorrow/cgi/search/search16.html
わざとサブディレクトリにワープをいくつかコピーしておいたので「perl」とかで検索すると、サブディレクトリ内部も検索されてるのがわかって吉。そのかわり、*.plとかも検索対象になってしまってるのが、イヤンだな。
邪道すぎる手は使っているけど、いちおう、三日目で、目的に達したのはよろこばしい。んがしかし、基礎が抜けすぎているので、このままじゃ発展がないな、というのも実感してしまった。はー、色々、イライラしたことよの。いくら野望を達成しても、サブルーチンから変数抜き出す方法が、かっこわるいのと、正規表現に負けたのがくやしまり。今日は「はぶ・ふぁん!」って気にならんな。
「野望達成」に関する自己満足のみで、本日は寝る。じゃ、また。
「自分のホームページで批判するのは、匿名よりもみっともない」と主張している人がいるけれども、オイラは、断固反対だ。
971125a[ more Search-Engine / 検索エンジンその後 ]
検索スクリプトを公開した話は昨日(971124c)の記述を参照してほしまり。
再帰的にサブディレクトリを探索する話はラクダ本にもでてくることがわかった。基本的に「カレントディレクトリのファイル名リストを得てからファイル名をstat()関数でディレクトリかどうか探索して、ディレクトリだったらそのサブディレクトリをカレントディレクトリにして」を再帰的に繰り返すサブルーチンを作ればいい/作らないといけないことが判明した。これは、オイラにはちょっと骨なので、また来週。
検索開始ディレクトリを外部から指定できるように改造するのは、できなくないけど、なんか怖いので、これも来週。
で、根本的な仕様変更はせずに、細かい点だけいじることにする。まず、色々欠陥があることが判明した。
とりあえず、すぐ気づいたのは、
1.に関しては、色々考えたんだけど、もー「ファイル全体を一行に連結してタグ抜き」するより他に方法がないのかもしれん、と思ったんだけど、面倒くさいので「>と<に置換して、そのまま放置」といういい加減な方法で対処することにした。よってコメント内部もマッチしてしまうのだった。あータグ抜きやめて、全部置換にすれば、リンク先で検索できるなぁ。まぁ、とにかく、「謎の画像」とかは出なくなった。
2.に関しては、一行ずつ読みながら、前回の文字列を$oldline、今回のを$lineとして、連結した$oldline.$lineに対してマッチを行うようにした。理論的には遅くなってるんかもしれんが、あんまりかわらないみたい。これで、「二行に分断された単語」はヒットするようになった。けど「三行以上に分断された単語」はヒットしない。あきらめ。とにかく「オレが諸」「星様だ」と分断されていても「オレが諸星様だ」がヒットするのだ。ところが「オレが」「諸星」「様だ」となっていると「オレが諸星」「諸星様だ」の同じ部分が二度表示されてしまう。一度はほったらかすか、と思ったけども、$oldlineから検索文字列を抜いておけば、とりあえず二度とはマッチしないので、そうしてみた。よーく読むと、連結された前半から単語が消えている謎な文章になるかもしれんが、まー検索エンジンの表示は「目安」だとして、いいだろう。
3.に関しては、検索文字列もタグ抜きするかなーとか思ったけど、結局「>」と「<」に置換して表示して「タグ入ってると検索できないよ」と警告するようにした。
個人的には、二行ずつ検索にしてから、なんか安心したなぁ、と。
あとは、バージョン管理がわけわからなくなったので、内部の$programversionって変数にバージョン書いておくことにして、FORMから「version」って名前で「on」ってタグが送られてきたら、バージョン表示するようにしてみた。
つーわけで、本日、公開する最終バージョンは、"search.pl ver.1.13.4"になる予定。
search_1_13_4.pl.txtをsearch13.plとリネームして、search13.htmlで検索すると吉。あーjperlが入っていたのでためしにぶち込んだら、エラーが出たので、とりあえずjperlを使うのは断念するのだった。ぐえ。