prasinos' work memo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Google Map API をバグった JavaScript から呼ぶと FireFox が暴走する件

誰が悪いのか知らんが (当然わたしが悪い) スラッシングの嵐で泣いた。 教訓: メモり貧乏マシンで Google Map アプリのデバグをしてはいけない。
スポンサーサイト

RubyGems と RPM の関係

Ruby の再インストール問題が一段落したところで、次のステップ。RoR は RubyGems でインストールしろといっている。で、RubyGems の RPM が落ちていないかなあと捜してみたところ、こんな記事を発見。

この人はすごい難しいことをやろうとしているが、要は RubyGems がパッケージ管理システムであるが故に RPM 体制の枠にはおさまらないということだ。私はそんな難しいことをしている暇はない。すっぱり諦めるしかあるまい。

RPM 管理体制の枠外の存在を認めるためには、次のことができてほしい。
  • RPM で正当に管理されているファイルを上書きしない
  • カスが残らないために:個々のファイルに対して「オマエは活きているか?」と聞く
  • いざ消すときに全部消えてほしい
  • 他サイトに状態をコピーできる方法を明らかにしたい。
当然今は何もわからない。とりあえずユーザ作って野良インストールして調べてみる他あるまい。 続きを読む

ruby 再インストール

Ruby on Rails (RoR) するぞ。で、ファーストステップ。

RoR は Ruby 1.8.2 以上が必要。ところが RHEL4 の Ruby は 1.8.1 である。ついでに RHEL3 用にどこかから拾って来た Ruby 1.8.2 のパッケージの $LOAD_PATH が正統 RHEL4 の 1.8.1 と違っていることが判明。

ええいめんどくさい。全部パッケージしなおすしかない。

続きを読む

はてな RSS は一部非公開が可能

であることに気が付いた。はてなアンテナの一部非公開は有料だったので、とてもありがたい。
デバッグ中の RSS ジェネレータをしばらくはてな RSS でモニタしたいが、そんなの他人が使いだしたら困るという場合に使える。

RoR やらんといかんな

DB でデータを貯めるととりあえず表示してみたくなる。もちろんログインして mysql を起動して SQL を突っ込んでみれば何でも見られるわけだけど、もうちょっと定食みたいのを作りたいわけだ。で、何か DB 作るたびに CGI を書いていたのだけれど、何度もやっているうちに同じことの繰りかえしが多い気がしてきた。

で、それなりのフレームワークが要るわけである。

で、「RDB Ruby フレームワーク」というキーワードでいうと Ruby on Rails というのが何か流行っているらしい。で、RDB ベースの Web サイトを作るのがすごい簡単らしい。今まではなるべく避けて通って来たのだけど、これは勉強しなくてはいけないのではないかと認識を今日改めた。

はてなRSSに移行

Prasinos のはてなアンテナ御利用のみなさま(そんなにいないだろうけど)、はてなRSSに移行しましたのでそっちをみてください。

それにしても面白いもので、パソコン上で動くRSSリーダーを試してみたときは「くだらねえ」としか思わなかったのに、Web の RSS リーダーだと「使える」感がしている。なんでなんだろう。

  1. 最初はメールリーダーの感覚で使おうとしたが、別のパソコンを使うときに「未読」がリセットされてイライラが募るだけであった。今はあまりパソコンを移らない環境ができているので事実上リンクの青と紫で未読判定ができる。ちょっとましになった?
  2. そもそも今は未読はあまり気にしていない。その感覚が変わったというところが大きいか?
  3. 自分でニュースサイトをカスタマイズする感じかな。今のところマスコミのサイトは登録していない。
  4. はてなRSSははてなブックマークの登録数が表示されるので、世間的注目度がわかるというところもおいしい?

線・多角形データには geometry カラムが必要

これまたすげー当たりまえの話。

地理ベクタデータを RDB で管理しようと考える。最初は点データばかり使っていたので

  • lat, lon なんて数値型カラムを作る
  • geometry 型カラムを作って point データを放り込む
のどちらにしようかすごい迷った。というか、 geometry 型カラムを使うと可搬性が怪しくなるので、 lat, lon 型ソリューションしか使って来なかった。

しかしである。線・ポリゴンデータを扱おうとすると話は一変する。何個点が入るかわからないとなると、1つの表で表わすのは土台無理なのである。どうしても正規化すると別の表になってしまう。たとえば鉄道路線の一覧表を作ろうと思うと

CREATE TABLE railway(
  id INTEGER PRIMARY KEY,
  name VARCHAR(60),
  owner VARCHAR(60),
  electric BOOLEAN,
  track TINYINT
);
CREATE TABLE railway_line(
  id INTEGER,
  x REAL,
  y REAL,
  FOREIGN KEY (id) REFERENCES railway(id)
);
とかいうことになるだろう。こんな2枚の表があったところで、 JOIN しても使いにくいし、泣きそうだ。

で、あるからして、Geometry 型カラムの使用は必然なわけで。

いまだ残る RDB への抵抗感

RDB を使う新しいデータ収集プログラムを書くゾと思い立つ。が、しかし、しばらく考えがまとまらない。なんか他のことが気になる。これは何かが間違っている兆候だ。

思うに、RDB のプログラミングインターフェイスがファイルに比べてむずかし過ぎるのだと思う。ファイルというのは

  • open
  • gets
  • write
  • close
だけ知っていれば使える。このレベルで簡単にならない限り、何か欝陶しい感じがぬぐえない。まして、同じフレームワークを他人様に使って戴こうなんて無理な話、誰もついてこやしない。

もちろんドメイン知識依存なレイヤで頑張ってねということは簡単だが、その間に何かあってしかるべきだろう。

ひとつひらめいたのは、RDB を DBM 並みに簡単にできないものかということである。 以下、思いついたことのごった煮。

  • データベースに mysql://user@server/db てな URL を作る。Ruby の uri.rb にパーズさせればイチコロ。
  • パスワードは ~/.my.cnf とかから強引に拾う。 ムズカシい権限管理がしたかったら 新しいパッケージ毎にログインユーザ管理しれ。 それでもだめなら DB URL のパスワード欄にファイル名の種子みたいなのを入れておく。 mysql://user:package@server/db を見にいくときは ~/.my.cnf のほかに ~/.my.cnf.package も見にいく。
  • SQL を隠蔽する。たとえば列名と型のリストで create table 文を生成する。
  • Create Table するときに dup しても「ま、いいや」で済まさない。show create table してガッチリチェックする。(それって SQL パーザじゃない?)
  • Primary key のないテーブルを作らせない。 必ず最初の列にするくらいでいいかな。
  • SELECT で幾つ帰って来るか判らないのがうざいので 1個しか帰って来ないのを作る。0個か2個以上あったら例外発出。
  • 以下のことをすると、Shapefile も統一的に扱えちゃう。ご利益は??? だけど。
    • auto_increment な列は 1 個しか許さない。 (PostgreSQL にはこういう機能あるんだっけ?)
    • geometry の列は 1 個しか許さない。

ruby-GDAL があれば ruby-shapelib は要らんか

二週間かけて ruby-shapelib というのをつくった。swig じゃなくてマジ OO にするべく頑張った。のであるが GDAL の ruby バインドというものが作られていることに気がついた。てゆーか存在していること自分がブックマークしてるし。gdal があるなら shapefile 読めるじゃないの。鬱だ....

ま、そのあれだ、今となってはこれ以上何をするにも時間が惜しいので、この路線でいくしかあるまい。ううむ。

Firefox 1.5.0.1 のほうが待ちが少ない

こういう話題はココログに載せたほうがいいんだろうが、どうもサイトが重いと気乗りがしない。

で、いまさらながらであるが、Firefox 1.0 系から 1.5.0.1 に更新した。面倒ななあと思っていたのだが幽霊の正体みたり枯れ尾花、インストーラもクソもなくたんに tar 玉を開くだけというのはすっかり忘れてていた。わが記憶力も相当あやしいものである。

で、更改すると後悔するというのが世の常であるが、Firefox だけはそうではなかった。 他タブが loading の時に待たされることが少ない。たぶんマルチスレッドが賢くなったのだろう。

追記: もうひとつ。「他のウィンドウを開く」操作を他のタブに読みかえてくれるように設定できる。これはとてもありがたい。ウィンドウマネージャをあえて貧弱にしているメモり貧乏さんとしては、ウィンドウ1個勝手に開かれてスラッシングの嵐になっただけで原たつわけですよ。

贅沢をいえば、どっかの MSIE みたいに(だったよね?) URL を漢字で入れたら UTF8 で送れるようにならんかなあ。日本語版ウィキペディアに余計な負担を与えないで済む... つーか、自分でCGI書きましょう。

OGC の掲示板に質問してみた

例の馬鹿 BNF 読み返しているうちに腹が立って来た。文句附けてやるのが技術者としての責務だ。というわけで、連絡先を捜していたのだが、文書にはマトモに書いちゃいない。OGC 会員になるのが筋なんだろうが、とてもそんな手間も金もない。馬鹿野郎と思っていたら、OGC の Web に掲示板がある。ありがたいことだ。さっそく文句を垂れさせていただいた。

「文句いうなら会員なれよ」式だって別に悪じゃないと思うが、些細なことでのコントリビューションのための敷居がグンと上がってしまう。結果として、目玉の数に比例してよくなるようなプロダクトの質は落ちるわけだ。一方、OGC が掲示板作ったみたいに、非公式で情報が集まるチャネルを作っておくと気軽に情報が集まるわけだ。これが Openness の強みであって、OGC はその名の通り Openness の重要さをよくわかっていると思う。ロングテール論に似ていると思う。

しかし注意を要することは、情報チャネルを維持するのはインターネットですごく安くなったとはいえ、タダではないということだ。OGC 掲示板には数人の要員(おそらく非常勤であろうが)を張りつけてサポートにあたっている。これは彼らにしたら結構な負担のはずだ。

絶対おかしい

WKT の BNF 書いたやつは絶対おかしい。
<MultiPoint Tagged Text> :=
  MULTIPOINT <MultiPoint Text>
<Point Text> := EMPTY
 | ( <Point> )
<Point> := <X> <Y>
<MultiPoint Text> := EMPTY
 | ( <Point Text> {, <Point Text>}* )
という文法でどうして
MULTIPOINT(1 2, 3 4)
という文が生成できますか?
MULTIPOINT((1 2), (3 4))
にしかならんでしょう? でも、実際には前者が使われているのだ。
<MultiPoint Text> := EMPTY
 | ( <Point> {, <Point>}* )
と思う他あるまい。

倍精度リテラルの定義はどこへ

Shape#wkt のつづき。一応 ISO 19125 の定義をみてやるかと思ったわけだ。BNF の文法がある。よろしい。で、問題は倍精度の定義だ、が... ない。
<x> := double precision literal
と無責任な終り方をしている。あのねえキミたち。いいかげんにも程がある。いまに始まったことではないが...。

仕方がないので、printf(3) の %g の結果は必ず使えるものと仮定する。そうするほかない。

広報

ruby-shapelib のリンクを shapelib 本家から張ってもらった。一応一生懸命調べているけど API 設計にはやっぱり自信が無いので、手遅れにならないうちに(私の記憶&関心が消えないうちに) shapefile な世界の人からコメントがもらえればうれしい。

ま、shapelib のリリース記録をみても数年越しののんびりしたものだから、やっぱり気象にくらべたら人口が多いとはいえ、此界の OSS 人口ってのはやっぱりそんなもんなのかもしれないけど。

テーマ:フリーウェア情報 - ジャンル:コンピュータ

頭痛い名前のぐちゃぐちゃ

ESRI の Shapefile ドキュメント には PolyLine と書いてあるものが Shapelib では Arc と書いてある。うん。まあそんなこともあるだろう。ruby-shapelib である以上 shapelib に合わせた名前をとるべきだ。昨日まではそう思っていた。

がしかしである。Point#wkt とかいうメソッドを作ろうと思って WKB/WKT の仕様を確認すべくISO 19125-1 を見にいったら、メソッド名まで標準化されているのね。これには少からず動揺する。どうしよう。頭痛いあるよ。

word of the day

Gmail の RSS リーダーは昔なつかし fortune(1) みたいだ。
今日は 今日の言葉は spoony なんてのが出て来たのでクリックしてしまった。

ところでなんで spoony なわけ? としばし考えこんだが、バレンタインデーなんだね。なるほど。

[ShapeLib] PointZ のデータを書くためには PointZ のファイルでなければならない

要するにそういうことだ。ShapeLib の中で assert しているから、そうじゃないと動かないのだが、ファイルの規格にあたる必要もあるまい。

それにしても腹が立つのが shpcreate(1) だ。こいつは point ファイルが作れても pointz ファイルや pointm ファイルが作れない。おそらくあまり使われないのかなあ。

ともあれ、Shape のコンストラクタは Z や M の引数の有無に応じて type を切替えるという作りが妥当だろうな。 ちと悩ましいのが Z と M は両立しないということだが、 [追記: 誤解。正しくは、PointM が X Y M の3次元、PointZ が X Y M Z の4次元である] 使い勝手を考えるとこういうところか。 [追記: 次のリストはさしかえた。見え消しはわかりにくいので]

  • Shape.new_point x, y => Point
  • Shape.new_point x, y, attr_array => Point
  • Shape.new_point x, y, m => PointM
  • Shape.new_point x, y, m, attr_array => PointM
  • Shape.new_point x, y, m, z => PointZ
  • Shape.new_point x, y, m, z, attr_array => PointM

列リストを確認するアルゴリズム

なんだってこんな面倒なことを考えなければいけないんだろう。

SHP API で i 行目の Shape を書き込んでも、 DBF API でどこかの列の i 行めに書き込まなければ行数が食い違ってしまう。 そういう状態では ShapeFile として使いものにならないので、 1個 Shape を書き込むたびに必ずちょうど 1 行を生成するようにしておくのが無難というものだ。 Shape オブジェクトに属性値を持たせて ShapeFile#write(shape) するときに属性の1列を生成すればよい。

で、さっきの NULL 問題がある。Shape.new では正しい属性リストを知らないので、Shape は単に来た順に属性を配列で持っているだけだ。存在している属性が与えられていないということがありうる。というか、NULL を書きたいときはあえてそうすることになる。 そういう列に対しては数値ゼロじゃなくて値ヌルを書き込んでおきたい。

するとどう探索するかが問題だ。

  1. 列番号 0 から(ファイルの列数-1)までそれぞれについて、 ファイルから列名を取得し、その名前の属性値を拾って書き込む。
  2. Shape に張りついている属性値のそれぞれについて、ファイルから列番号を取得し、値を書き込む。 そのときどの列番号を書いたかメモっておく。 終わったら、書いていない列番号に対して NULL を書き込む。
前者がとりあえずよさそうにみえたけど、ファイルに存在する列のそれぞれについて、Shape に張りついている属性の全探索をする必要がある。ちょっとそれは見苦しい。

後者の手法なら、DBFGetFieldIndex() というのがあるので、ruby-shapefile では二重 loop を書かないですむ。 そして DBFGetFieldIndex() がハッシュとかちゃんと使っているのなら、結構速いはずだ... と思って use source... 見なきゃよかった。 今の実装は単なる全探索だ。

[ShapeLib] 書き込みをしなかったセルはどうなるか

ShapeLib の DBF (dBase ファイル) 管理部分では行番号と列番号を指定してデ-タを書き込むようになっている。エクセルみたいなもんだ。で、行番号 i の書き込みが初めて行われたときにファイルが伸びて行ができるもようである。

それなら、そのときまだ書き込まれていない列は何になるか。

実験してみると、文字型は NULL, 整数型と実数型はゼロになるもようである。全て NULL になるのなら、行を作らなければいけないときに「とりあえず1列めにNULLを突っ込んでおく」という作戦ができるが、そうもいかないわけで。

以下、とりあえず実数型の実験プログラム。 続きを読む

拡張ライブラリ中の公開シンボルは衝突すると泣くよ

それどころではないはずなのだが、どうしても気になるので調べてみた。

Ruby の拡張ライブラリは共有ライブラリとして実現される。とても単純な拡張ライブラリならば Init_foo (foo はライブラリ名) だけが公開されるから心配は要らないが、複雑になってくるとソースコードを分けて非 static 関数が出て来ざるをえない。特に既存 C コードのラッパなんかはそうだ。

で、そういう非 static 関数の名前が他の拡張ライブラリと衝突したらまずいんじゃないの、というのは気になるところであって、実験してみた。 続きを読む

締切が

それで、金曜昼のセミナープレゼン、まだ1ページも書いていない。どうしよう。あきらかに etymology なんか調べている場合hではない。

indent の反対は outdent?

indent の反対は何て言うんだろう。 プログラマー日記さんとこにコメントしたんだけど、いろいろ意見を見て、さらにしつこく考えてみる。

American Heritage Dictionaryによれば そもそも indent という語は中英語 endenten に由来しそれは古フランス語 endenteur や中世ラテン語 indentare にさかのぼることができる。んだそうだ。語幹 dent はいいとして、接頭辞 in- が en- を経由して in- に先祖帰りしているのはある時イギリス人が古典ラテン語っぽい方がカッコいいと思って戻したからで、 receipt の p みたいな強引な綴りができたのもその時だって話をどこで読んだんだっけ、まあいいや。

接頭辞 en とくるとギリシャ語も疑ってみないといかんな、と思うけれど、「歯」のギリシャ語は orthodontist 「矯正歯科」みたいに odont- (近代 dont-) だから indent には関係してこない。

それで、ラテン語の接頭辞 in には二種類あって、ひとつは反対語をつくるもの (incompatible とか impossible とか)、もうひとつは前置詞 in としても使える「中で、中へ」という意味のもの。include とかね。

さてその in をとっぱらって dento (不定法 dentare) という動詞があるのかと思って タフツ大学のラテン語辞典 をみたんだけど dentio (不定法 dentire) というのしかないし indento だか indentio もみつからない。たぶん古典しかみてないからだろう。だってシーザーもキケロもインデントどころか全部大文字で単語の間にスペースさえ入れない FORTRAN 77 みたいなテキストを書いていたのだから、彼らがインデントを指す言葉を使ってなくてもしかたがない。

ともあれ dentire は「食い切る、歯形をつける」という意味で、indentare (または -ire) というのがあったら「中に向かって歯形をつける」ということなんだろう。ここの in は反対語をつくる in じゃないから、「in を取って dent が反対語」は成り立ちにくいように感じる。

で、「中へ」の in の反対は de または ex ということになろうから、dedent や exdent が反対語の有力侯補となる。De と ex の使いわけはイマイチよくわからない。

一方、故事来歴はすぱっと忘れて、英語として反対語を作るという話もある。 まず、反対語を作る接頭辞 un を使って unindent という説。 それから、indent の in を英語の in と思い為して、その反対だから out ということで outdent という説。

ラテン語式と英語式、どちらが正しいというものではない。 慣用に問うほかはない。 じゃあその慣用はどうなっているか、google 先生にきいてみると...

  1. outdent: 約 149,000 件
  2. dedent: 約 91,500 件
  3. unindent: 約 88,900 件
  4. exdent: 約 14,900 件
なんと、意外や意外、outdent がトップであった。 一番筋悪とおもったんだけどなあ。 ま、 hexadecimal みたいな例もあることだから、 語源学的に正しくても使われなければどうしようもない。

なお、outdent をはじめとしてこれらの単語、普通の辞書にはどれも載っていない模様なので、「所詮10倍の差、どんぐりの背比べ」といったほうがいいのかもしれないけれど。

ruby-shapelib やるぞ

とりあえず SF.net のプロジェクトを昨夜申請して今日通った。前回は申請が蹴られて一週間泣いたが、今度は真面目に書いたので一発通過。さっさと完成させないと。

Shapelib を眺めているといろいろ頭にくることはあるが、Maptools.org の Bugzilla に登録して Bug List を取ってみると果報は寝て待て状態の問題も多いようだ。 なにはともあれ本体のパッチを投げて議論するより ruby-shapelib を作ってしまうのが先だ。

とりあえず、最新版が 1.2.10 になったのがわかったので RPM を作りなおし。

try to use shapelib

[SQL] date とか time というカラムを作っちゃだめ?

標準SQLでは予約語なので使えない。 MySQL や PostgreSQL では一応使える。 がしかし、使わないにこしたことはないだろう。

[MySQL] ロールバックなんか要らない

MySQL は InnoDB とかの一部のデータ型式を選ばないととトランザクションができない。 つまり、一群の SQL を BEGIN TRANSACTION と COMMIT で囲んで失敗したなと思ったら ROLLBACK すると元どおり、という術ができない。 だから PostgreSQL ファンには馬鹿にされるわけだが、使ってみると ROLLBACK しなければどうにもならないという場合にはまだ出会していない。 昔どこかで読んだのだけど、表の構成を工夫すればなんとかなるし、それはいろいろいいこともある。 で、その心得はどうかというと。 続きを読む

MySQLの日本語これで大丈夫

昨日は泣き言で終始したわけである が、そのままで引き下がるわけにはいかない。 対策できた。 続きを読む

MySQL の文字コード変換で撃沈した話

要するにダメなのだ。 サーバ、DB、表、カラム、リテラル、クライアント、接続 それぞれに charset があって、何をどういじったら全部 ujis になるのかわからない。 一部でも latin1 が残っていると、正直に ujis と教えて上げたデータは ???? に化けてしまう。最低すぎる。

こうなると、mysqld をだましたほうが早い。全部だまって latin1 にしてしまえば一応動く。漢字コード変換はユーザの責任にしておけばいい。バックアップで utf8 変換されて死ぬらしいが、もういいや。

sgml-parser.rb が閉じタグ忘れ HTML を喰らって混乱する件

要するに対応していないのだ。 html-parser パッケージ に含まれる sgml-parser.rb をよく使う。 とてもよくできていて、タグの数だけメソッドを定義すれば SAX 型パーザのできあがり。 なのだが、困ったことが起こった。

表を解析するプログラムだったので <tr> と <td> を拾って状態遷移をさせた。ところが

 <table>
  <tr>
   <td> 1列
   <td> 2列
   <td> 3列
  <tr>
  ....
 </table>
なんていう邪悪 HTML を喰わせると </table> が拾えない。 最後の始末がつけられないと困ってしまうので調べてみた結果、
start_table メソッドを定義していないと end_table メソッドが呼ばれない
という作りになっていることが判明した。 中ではタグの入れ子順に @stack に保存していて、 そこに 'table' が入っていないと end_table を呼ばないという仕掛けだ。 あまりにも美しいので改修をあきらめた。

ところでデバッグしていて思ったのだが、こういう邪悪 HTML を喰わせると tr の中に tr があって ... とスタックが積み上がっていってしまう。当然 end_tr も呼ばれない。 別にメモリが無駄だなんて思わないが、end_tr で状態遷移しようと思っていると泣きを見る。閉じタグ省略型の SGML なんていまどき (XHTML じゃない) HTML ぐらいしかありゃしないから、べつにどうでもいいっていえばいいんだけど、いつの日か真面目に HTML を相手にするときにはなんとかしてやらないといけないなあと思うだけで何もしている時間は無いのであった。

プロキシ対応 接続ケチリ型 HTTP ラッパ

Ruby の Net::HTTP を裸で使うとハイパーリンクを踏むたびに接続を切り替えるのが欝陶しい。プロクシ対応しようと思ったら地獄だ。そこでこんなのを書いてみた。 続きを読む

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。