磯部さんにお聞きして、さっそく、 STLportとやらを Get。さっそく、gcc 2.8.1 でコンパイルを試みるに、コンパイルエラーが発生
..\stlport\new:47: ../include/new: No such file or directory
環境変数 CPLUS_INCLUDE_PATHにはちゃんとパスを加えてあるんだけどな…。gcc 用の Makefile を見るに、2.95 以降でないとだめと書いてある。pgcc を入れるしかないのかな…。
と思っていたら、@nifty のフォーラムの方で、似たような話題が出ているのに今ごろ発見。見ると、2.8.1 には無いヘッダーファイルがあるとのことで、それ俺がつまってるのと同じぢゃん。
幸い、土日を普通に休めたので、pgcc を使っていいものか検証してみることにする。以下、/emx/doc.new/NEWS.g++ の超訳だす。
EGCS 1.1 C++ コンパイラでの変更
- 名前空間(namespaces)がフルサポートされた。ライブラリは未だ「namespace std」を使うようにコンバートされていないけれども、古い「std のフリをするコード」はデフォルトでのままである。それを無効にするために -fhonor-std が使用可能だ。
- 大きな(massive)テンプレートの改善:
- メンバーテンプレートクラスがサポートされた。
- テンプレートの friends(friend関数のこと?)がサポートされた。
- テンプレートのテンプレート引数がサポートされた。
- テンプレート内のローカルクラスがサポートされた。
- 多くのバグを修正した。
- new演算子は適当な(appropriateな)箇所で、bad_alloc を投げるようになった。
- 例外のハンドリングはスレッドスレッドセーフとなった(スレッドと例外が安全に共存できるつーことでしょうな)。入れ弧の例外や、placement delete(何だそりゃ、誰か教えて)もサポートされている。x86 にて、例外を扱うオーバーヘッドは2.9 より遥かに低くなっている。
- protected な virtual 継承がサポートされた。
- 「int i」というメンバを持つクラス B より導出したクラスD にとって、 -->&D::i は「int D::*」という型ではなく、「int B::*」となるようになった(かなり超訳)。
- 「試験的に」、g++ 用の新 ABI を(何、それ)-fnew-abi でオンできるようになった。これの現在の特徴として、規定クラスの効率的は配置(空の規定クラスの最適化も含まれる)・C++の名前の、よりコンパクトな圧縮(mangling)(-fsquangle で別個に有効にできる)がある。この ABI は通知無しに変更することがあるので、コンパイラの毎回のリリースの度に再構築をやり直したいものでも無い限り、使用してはいけない。
ABI を変更するフラグがあると、libgccとlibstdc++中のライブラリコードを含む全てのコードを同じABIでコンパイルしなければならないので、このフラグはエキスパートのみ使用すべきである。
namespaces のサポートが、とても魅力的に見えたので、試験導入に踏み込むこととした。
unzip pgcc-os2-1_1_1-docs.zip -d f:/ unzip pgcc-os2-1_1_1-gcc.zip -d f:/ unzip pgcc-os2-1_1_1-gpp.zip -d f:/Netscape でダウンロードしたので、「.」が「_」になっているのは御愛嬌。
ということで、導入は意外とあっさり。そんなもんだ、世の中。さて、そのまま使えるか、さっそく eff をビルドしようとしてみた。
おぉ、駄目ぢゃん
fnmatch 関数用の定数が見付からんと宣うのだ。何故かと思ったら、emx で拡張された定数が pgcc のヘッダファイルには記述されとらんのだ。しかし、こんなもん、用途は限られているので、約10分くらいかけて、似たような関数を作って誤魔化すことに成功。さぁ、もう一度ビルドだ!おぉ、コンパイルは(Warning を幾らか出しつつも)通った!あとはリンクだ!
basicwin.o: Undefined symbol basic_string<char, string_char_traits<char>, __default_alloc_template<false, 0> >::nilRep referenced from text segment
なんでじゃあぁ
どうやら、string クラスの中で使っている nilRep とやらが無い様子。どういうことかと思って「nm /emx/lib.new/mt/stdcpp.a | less」を見ると…
参照してるとこあっても、
定義してるとこ無いぢゃん。
ここまで来ると、もしかして pgcc 自体が古いんぢゃないかという気がしてくる。そうダウンロードしたのはだいぶと前の話なので、もしかして、修正された新版が出ているのではないかと思ったわけだ。ということで Hobbes へ行ってみると…
| pgcc-os2-1.1.1-gpp.zip | 1,758,846 | 1999/06/14 | Pentium enhanced GPP 1.1.1 r2 for OS/2 |
なんだ、この「r2」つーのは!
手元のアーカイブとサイズも違うし、新版であるのは間違いなさそ。断固ダウンロードである。サイズがサイズだけに、暫くかかりそうだ。ちょっとウェブ(これ)でも書きながら、待つとするかな…。
:
無事ダウンロード完了。全てを展開し直して、さぁ、eff を再ビルドだ。おぉ、無事 exe ファイルが出来たぞ。実行してみよう。動く動く。ちょっとウロウロするかな…。
あれ?
駄目だこりゃ
口調は、当然、いかりや長介風である。
★≡≡≡≡
ちゃんと動いているソースの不必要な改修工事というのは、一般に余りやらない方がいいとされているが、やはり、昔書いたスパゲッティソースは、適当なタイミングで、綺麗に再構築したくなるのが人情である。で、再構築し始めたのはいいが、実行ファイルをビルドできるところまで、構築しきれなくて、破綻するのも、よくあることである。
そんな折、役に立つのが CVS である。ワタシの場合
というルールでやっており、大改造に失敗した場合などは、他のディレクトリで、check out して、元の安定ソースに戻すのである。そんな事をしていたら
気がつくと eff のソースツリーが4つ
ということも決して珍しいことではない。CVS が無い場合などは、その破綻したソースはどうせ統合もできないということで破棄しちまうもんだが、CVS のおかげで、後々、構築が出来た時に本流と合流させられるという可能性が残ってしまうわけだね。
ところが、実際に合流させるかというと、一旦、ビルドを投げ出した書きかけのソースをもう一度触りたくなるかというと、まずそんなことは無いので、結局は永遠に commit/release されないツリーが残るわけだ(update はするけどね)。
どうやら、eff のソースツリーの兄弟は、ひたすら増植する運命にあるようである。
つーか、動いてるソース、下手に触るな!
いや、ごもっとも。
★≡≡≡≡
セグメンテーションフォールトの場所が分からなくて、苦労しました。ほんと。今まで、char * を使っているところを、string に置き換えるようなことをしてると、よくハマりますので、注意。
ど〜せ、今頃、読んでますよ〜だ。しかし、浅川の…いや、何でもないです。
極めてわろし。五段階評価の下から二番目くらい。
STL を導入して開発の効率が上がったような錯覚を覚えたのはいいが、実際のところ、コンパイル時間がほぼ倍になってしまった。時間がもったいないので、葉山文書を書きながら、mp3 を奏でさせていたら、eff の再ビルドがものすげ〜時間がかかって、一向に終わらない(←阿呆)。
ま、そんな父ちゃんの涙が止まらないような馬鹿さ加減はおいといて(元ネタ分かる人は同年代と見た)、emx の STL のちょっと古い部分をもう一つ発見。
auto_ptr つーのは、簡単に言うと、ポインタのような振舞いをするテンプレートクラスみたいなもんす。ただ、ポインタと違うのは、auto_ptr インスタンスが消滅する際に、自分の指し示すオブジェクトを delete してくれる点にある(他にも機能はあるんだけどね)。これで、資源の解放忘れなどを防ぐことができるんだ。メカニズムは簡単なんで、作ろうと思えば、作れるんだけどね。作ろうと思わなければ、作れないんだ(あたりまえ)。
さて、そんな、ちょっと便利な auto_ptr 。なぜ、#if 0 かというと、どうやら、リリース時に C++標準仕様が明確に決っていなかったらしい。やれやれだね。ostringstream の件もあるし、こうなりゃ、よそから、オープンソースの STL をかっぱらってきた方がいいのかしらねぇ。
しかし、STL だの、CVS だの、どーのこーの言っている割に、最近、新しいリリースを出すことが出来ない我がフリーソフトウェア群。ぼちぼち燃えつきたかな。
★≡≡≡≡
最近の買い物
さりげなく書いてしまったが、今ごろになって、ようやくプレステ2を手に入れた。近所の電器屋に前から置いて、前から買おう、買おうと思っていたのだが、重そうなので、二の足を踏んでいたのだ(そんな理由なの?)。
いっしょに買ったソフトだが、実のところ、これと言って欲しいというものは未だなかったんだけど、ハードだけ買うのもお馬鹿なので、「MACROSS VF-X2」つー、プレステ1用のソフトを買う。横にあったボトムズもよかったんだけどね。
両方ともロボットモンかい!
買ったのは、ビデオレンタル屋もやっている電器屋。ということで、深夜 24:00 まで開いているのだ。ということで、訪れたのは 23:00。なんで、そんな遅くに行ったのかって? それは隣の書店の閉店が23:00 だったからだ。だが、そんな深夜に行ったためか、なんと、持ち帰り用の袋が無いとのこと。まぁ、仕方ないなと思って、あの青い箱を裸で自動車まで持っていったが、端から見ると、何か泥棒みたいだ。自転車でなくてよかったわい。そうだよななぁ、山G師よ。
さて、持ち帰ると、さっそく箱をオープン。ふむ、匡体はかなり小さいわい。何でもそうだけど、付属品などを同梱するために、箱って、かなり大きめになるもんだねぇ。設置・導入には、かなりの手間がかかると無意識のうちに身構えていたが、TVと電源とジョイパッドの接続で済んでしまったのに、イト感動。よく考えれば、小学生のガキでも取り付けられなければいけないんだから、社会人のガキたる私が苦労するはずないわな(汗)。しかし、社会人であろうが、小学生であろうが、精神レベルはガキには変わりないことが、その後の
という事実より、判明してしまったのは、ここだけの秘密である。
しかし、ゲームつーのは、アレですな。気分転換つーか、何か発散になるところ点が Good ですな。やったあと、ちょっと気分がスッキリする。ただ、フリーソフトウェア作りやウェブ書きと違って、時間を使ったのに、後に何も残らないのがモッタイナイけど。特に今セーブできんし(そういう問題なのか?)。でも、そんなこと言ってたら、何ら娯楽を嗜めないような気もするしねぇ。何悩んでんだ、俺。とりあえず、次は DVD をレンタルするしかあるまい。
会社にて健康診断ありけり。職務の上での心労極限に達っし、死にかけ状態で診療所の医者を訪ねるに、存外の言葉ぞ、我を襲いける。
がんばって痩せましたね〜
何もがんばっとらんつーに
覚えておいでであろうか、昨年の健康診断の際、私は「太りすぎ」のイエローカードをもらっていたのである。その後、特に痩せるための努力などしていないのにこのあり様である。仕事しかしてないのに…。こうして私は不本意にも
「あんたは健康」
というレッテルをはられた御墨付をもらってしまったのである。
ちなみに、例の「甘いもん飲むと、体がとてもダルくなる」という難儀な症状については当然訴えたのであるが、「今回の診断では血液の検査とかもしていないし、当分様子を見て、それでも症状が続くようでしたら…」とか何とか適当なこと言われて、かわされてしまった。様子を見るも何も、もう2,3年もこの調子でシンドい思いをしているのだが…。ま、最初から相手にされるとは思っとらんかったし、こっちもシツコク訴えること自体、ダルかったので(笑)、いいんだけどね。
★≡≡≡≡
string 型を引数にとるコンストラクタから、例外を投げると、core dump するようになった…。一応、不完全オブジェクトにならないような方策はそれなりにとってあったつもりだったのだが。何がいけないのやら。引数が const char * の時には、このようなことにはならんかったのだがなぁ〜。
一時オブジェクトの string のデストラクタがうまく呼ばれとらんのかな。と思って、小さなテストプログラムを作って、いろいろと実験してみた。同現象の再現はできなかったものの…
ということは判明した。つーことは、インスタンスのメンバたる string もデストラクタが呼ばれないので、string オブジェクトのリファレンスカウンティングが狂っている可能性がありますわな。大丈夫かいな、emx の STL。つーか、コンストラクタで例外を起こす方が悪いのか? そりゃ、そうだな。そのオブジェクト自身は不完全オブジェクトにならなくとも、そのメンバ変数が不完全になる可能性があるんだもんな。うんうん、やめとこ、やめとこ。それが無難だ(自己解決!?)。
★≡≡≡≡
最近の行事といえば、実は先々週、台風(だっけ)の直前に、友人藤田君のお招きで、三河湾へ釣りへ行ってきちゃったりしたりする(莫大なお世話になりました>藤田君&ご家族の皆様)。翌日には電車が止まっていたそうだから、あぶないあぶない。
また、一方、金曜日には、山G師と愉快な仲間達と共に、日本橋〜スパワールド巡回ツアーなるものを敢行。お風呂ざんまい。久しぶりに直で会って言われたこと「痩せたね〜」。とりあえず喜んでおく。スパワールドの設備の充実度はナカナカのものだった。
しかし、イベントだけ見ると、何か人間らしいことしてるなぁ〜(葉山文書に似合わん!?)。これも友たちのおかげよ(遠い目)。ネタ的にはそれぞれなりにおもしろいので、本当はもっと詳細に書きたいのだが、eff の ver.up だけで体力と時間を使い果しちゃったので、とりあえず、今回はここまで。といっても、次回があるかというと、忘れちゃってるだろうから、おそらく続かないと思うが (^^;
www.os2warp.netとは、すごいドメインを取りましたねぇ > KtarOS/2 さん。OS/2 界のポータル目指してがんばってください(とプレッシャーをかける)。しかし「まだまだ手入力が続く…(汗)」って、何か HTML を自動生成する仕組みでも考えてらっしゃるのでしょうか…。ま、まさか足入力…(ボカッ)
★≡≡≡≡
ファウンデーションとミュールの件ですが、下の(9/2 追伸)にも書いた通り、畠山@SRAさんに教えていただきました。直接引用させていただいた方が情報量が減らずにいいかなと思いますので、メールを転載させていただきます。
≫ 畠山@SRAです。 ≫ ≫ ] ファウンデーションとミュール。Emacs の日本語対応版 Mule を作られ ≫ ] た方々は Free Software Foundation とアシモフのファウンデーション ≫ ] をひっかけたのでしょうか?それとも、単なる偶然なんでしょうか。ヒ ≫ ] マジネーションは膨らみます。 ≫ ≫ 当然ひっかけたものです。 ≫ ≫ 名前はfjのニュースで公募されました。で、この名前を提示したのが ≫ 元同僚、今はフリーのコンサルタント、の「すずきひろのぶ」氏です。 ≫ ≫ ひろのぶ氏はこの名前をFSFに譲渡する書類に記入しながら、 ≫ 「これでいつ死んでもおしくない」といっていました。
というわけだったんですよ、Average さん。う〜む、歴史あり!ですね。どうも、ありがとうございました >畠山さん。
ところで、9月9日のアマグラマな生活追加によると、畠山さんって、Modula-2/09 の使い手だったんですね〜。しぶすぎるぜ。(文章を誤読して、一瞬、畠山さんがチャーリー=マフィン氏:(一本指打法で Modula-2 をOS-9 へ移植した日系大阪人)かとはやとちりしてしまったのは秘密だ)
なお、Average さんが、しきりとeff内蔵エディターの製作をするよう、私をそそのかそうとしてらっしゃいますが、今私に作らせるとviっぽく(Vzではない)なってしまいますので、それでよければ考えましょう(笑)。(つーか、実のところ、その前に SKKFEP を一行入力に組み込みたい)
★≡≡≡≡
eff ステンレス加工計画(STL化)は、地道に進行中。ただ、途中、謎の理不尽なバグが発生し、eff が _eff を読んでいる時にcore を吐いて落ちてしまようになってしまった。
いろいろと対照実験をやってみると、どうやら、ostrstream が原因だったようである。これをやめて、単なる string 型の足し算のコードに直すと、バグが消えるのだ。で、おそるおそる ヘッダファイルを見てみると…
はっ、これ ostringstream と仕様違うやん。
そうなのだ。emx/gcc 0.9d FIX 3 には文字列ストリームの古い方(ostrstream)しか提供されていないのだ。これ新しい方(ostringstream)とどう違うかというと、最後に文字列化する際に古い方だと char * になるんだけど、新しい方だと string を吐いてくれるのだね。新しい仕様の方を想定してたからヒープがおかしくなったんだろうと思ってるんだけど、実際のところ、ちゃんとした原因は分かっていない。本業の方が火の車だからね。とほほ。
本当は土曜日は、会社の友人達と酒を飲む夕食会の予定だったが、どうにも体がダルく、外出はかなり辛くなりそうだったので、いわゆる「ドタきゃん」をする。ひどい奴ですねぇ。でも、ここ最近、調子が悪かったので、のんびりと休憩は必要だったんですよ。
と言い訳しつつ、家で休憩の合間に部屋を片付ける。うぅむ、本がともかくたまる、たまる。漫画雑誌は捨てるけど、それでも技術誌や単行本は捨てるわけにはいかないから、とりあえず、紐でくくったり、紙袋でまとめて、邪魔にならない形に tar する。いい加減、古本屋に売るなりして、処分したいところだが、出不精なので、いつも思いたつのは日曜の夜になってから。
携帯電話。必要であることは痛感しているが、落ちついて機種を選びたいと思い続けて、もう半年。実際、落ちついた時は、面倒でカタログも見ない。買う気あるのか? と友人に言われる始末。実はそれほど無い。
プレイステーション2。帰り道にある半電器屋/半レンタルビデオ屋に積んであるが、荷物になりそうなのと、プレステ2専用ソフトで別段今すぐやりたいと思う奴が無かったり、単に手持ちの戦力がなかったりして、結局、今度、土日にゆっくりと買いに行こうと思いつつ…(以下省略)
こうして、出勤のない休日(変な表現だ)の状況を鑑みるに、今日、部屋を若干でも掃除できたのは奇跡であろうことに何の異論があろうかと主張したいところだが、却下されるのが見え見えなので、今日のところはこれくらいにしておいてやろう。しかし、このダルさは病的ですな、ほんと。
★≡≡≡≡
流行の CVS を eff の開発に導入。いいねぇ、これ。
最初は、会社で新人のO君が、今度のPJにぜひ導入しましょうと、かなり積極的に提案していたので(優秀な奴が手下になったもんだ。^o^)、仕事として勉強の必要があったんですよ。
それまでは RCS というものは知っていたんだけど、ファイル単位だったので、どうにも使いづらくて、結局、放り出した前科があったので、及び腰だったわけです。実際、学び始めてみると…最初は cvs の各コマンドを発行する際の、カレントディレクトリと動作原理の関係が分からず(というか、しっくりこず)、結構、とまどいましたが、まぁ、今回の eff への導入でだいたい分かりました。
さて、これで eff へ STL を本格導入できるわい(って、もうかなりしてるけど)。今まで、元に戻せるように
rename eff.cc eff-000902.cc
なんてことしてたけど、もう無用ですね。これでディレクトリが日付つきファイルであふれかえるようなことがなくなりますね。
あふれかえると言えば、一つ面倒なのが、cvs import する前にディレクトリ中の不要ファイルを一掃しなければいけないんですね。どれが必要で、どれが不要かは把握していたのが、実は Makefile だけだっただなんて、口が割けても言えませんが。
★≡≡≡≡
上でも書いとりますが、eff へ STL(Standard Template library)を本格導入いたしました。今のところ、使っているのは string と vector と list くらい。ostrstream は意外と使いませんでした(これが目当てだったんだけど)。ostrstream から string を抽出して、const char * へ変換するのが、予想以上に面倒だったものでね(一行に書けんとは)。
さて、その成果ですが… 一行入力クラスのヒストリ部分が結構スッキリしたり、ソースの一部は美しくなりました。ただ、移行途中なので、全体としては混沌化してますね。まぁ、そのうち、治るでしょう。しかし、バイナリはかなり巨大化。1.4倍くらいのサイズになっちった。コンパイル時間も明らかに長くなったし。でも、これからの生産性を考えると、今やっておくべきだと思うのです。
そういうわけなので、今後の eff のバージョンは、ちょっと不安定になるかもしれません。現行バージョンの 1.20 は、当分の間、安定版として、お手元に残しておいてください。よろしゅう。
★≡≡≡≡
gcc でのライブラリの作り方:
[C:\] ar r libfile.a objfile1.o objfile2.o …
で、*.a 形式のライブラリが出来ます。*.lib 形式のライブラリは、*.a 形式ライブラリから
[C:\] emxomf libfile.a
でコンバートできます。これで分かりますかしらん? 本当は、ちゃんとした ar の使い方があると思うんですが、私の場合は「ar r」と「rm」(ぉぃ)で用が足りてしまっているので…(やってるのは make だけど)。
Emacs を始めとして、UNIX系コンソールアプリというのは、かなり古代の遅い通信端末上から使用されるというのを想定しているので、Average さんが懸念されているような遅い VIO 環境でも比較的実用になるはずです。
その証拠に、デフォルトで Mule は
1行単位スクロールしないのです。
昔の端末は、300bps とか 1200 bps とかいう速度で UNIX へつながっていたわけですから、できるだけ画面更新量を減らそうというという工夫があるわけです。
人はそれを CURSES と呼ぶ
私の記憶が確かなら---昔、かの S3 ViRGE を購入した際、その致命的な VIO の遅さに人類は恐怖のみそしるだったわけですが(!?)、その際、Mule は十分使えていたような気がするのです。辛抱たまらん状態だったのは NYAOS でls をたたく時とかだったのですな。というわけで、Go!Go!あるのみですよ。
★≡≡≡≡
何か、最近、Average さんとキャッチボールのしすぎのような気がしないでもないですが、所詮、本文章は週刊日記にすぎません。毎回毎回、意味不明のサブタイトルつけて、一人前の「文書」を装っていても、実際のところ書いとる内容は時期が過ぎれば、それほど価値が残るとは思えません。それならば、その時々に書きたいことを書かにゃきゃ損々!
かといって、いくらリンクを張っているからといって、いきなり、読者がまだ読んでいない(かもしれない)ページからの話題をいきなりふっても、読み手は一瞬にせよ、とまどう可能性はあります。そこのところを鑑み、今後は、ちょっと「前回のあらすじ」を意識して、ちょっと引用やら「こういうことがあって」と書いて、リンクをたどらなくても、そのページ単体でも話題について分かるよう工夫を入れることにしましょう。
ということで、Averageさん談(大して変わっとらんような):
「Editorの行管理アルゴリズム誰か教えてくれ」
教えてやんない、データ構造ならば一案。論理行と表示行を分けて考えてはいかがでしょうか。ここで論理行とは「CRLF で区切られるテキストの分割単位」、表示行とは「画面上で1行に表示されるテキストの行」ですね。そうすると、論理行は表示行のリスト構造かベクター構造で表せます。
表示行を1オブジェクトとすると、保有文字桁長は一定に保たなくてはいけませんが、そこんとこは、1文字挿入/削除メソッドの内部で処理するようにすればスマートです。
挿入の際は表示行の末尾より 1 or 2 文字あふれ出しますので、そのあふれ出した文字を、自分の次の行の表示行オブジェクトの先頭に挿入させます(これは再帰でやる)。逆に削除した場合、もし次の表示行オブジェクトが存在して、それが同じ論理行の場合、そのオブジェクトの先頭の文字を削除(これも再帰でやる)して、その削除した文字を自分の末尾に追加するようにすればよいのです。
ちなみに、拙作の kaol/karl は、テキストファイルを完全に表示行のオブジェクトのリストに変換してしまってます。これだと、完全に画面上の1行が、メモリ上の1オブジェクトに対応するので、扱い易いのです(ホントかな)
★≡≡≡≡
<LI>タグにながらく「"color:#EEEEAA"」というスタイルシートを割りふっていましたが、Internet Explorer ではその後に続く項目全体に色がついてしまっていたことに、今ごろ、気付きました。というわけで、いっせいに外しました。一つのファイルを変更すれば、全てに反映できるところがいいですね。
★≡≡≡≡
ミュールとは第一ファウンデーションを撃破した超能力者で、多数の人間の精神をコントロールできるが故にセルダンプランでは(表向き)予想できませんでした。
ファウンデーションとミュール。Emacs の日本語対応版 Mule を作られた方々は Free Software Foundation とアシモフのファウンデーションをひっかけたのでしょうか?それとも、単なる偶然なんでしょうか。ヒマジネーションは膨らみます。