« 2007年7月 | トップページ | 2007年9月 »

Peggyで単語補完スクリプトがC++に対応しました

つい二週間くらい前に更新したばかりなのですが、Peggyの単語補完スクリプトをまたまた更新しました。今回の修正は、長年の懸案であった、C++のクラスメンバ補完への対応です。

二週間前には「C++の文法は難しすぎるんですよねえ」と言っていたのに、なぜできるようになったのかと言いますと、結局のところ仕様を妥協したからです。実際、メンバをTAGSから拾うだけならCの構造体補完とさほど変わりないんです。
private等の可視性をきちんと反映するのは難しいなあ…と思っていたのが、実際に作ってみたら、別に反映しなくても十分使えるじゃないか、と気付いたのが最大の進展でした。

今回対応した補完の仕方は三種類あります。まず、従来の構造体メンバ補完と同様に、

SomeClass instance;
instance->|
(|はカーソルです)
として補完を行うと、SomeClassクラスのメンバとメソッドがリストとして表示されます。リストに含まれるのは、クラス内で定義されている定数や、メンバ変数、メソッド等です。本来はprivateなメンバ変数が出てきたりしたらおかしいのですが、このスクリプトでは全部出てきてしまいます。「出てこないよりは出過ぎた方がいい」という方向で作成しているためです。

次に、

SomeClass::|
となっているときに補完を行った場合、SomeClassを型名と見なして候補を表示します。この時は、クラス内で定義されているenumやスタティックな変数のみが出てくるべきなのですが、残念ながら出てくるリストは一つ目の例と同じです。

最後の例は、

SomeFunction()->|
のように、関数の返値から直接メンバを参照している場合です。このようなときは、SomeFunction関数の返値の型を探し、その型のメンバをリストアップします。

このように、VisualStudioのインテリセンスと比較すると、全く不完全な機能です。ただ、使えないというわけでもないレベルに来たと思ったので、公開させていただきました。

他に問題だと思っている点は以下の通りです。

・マクロやtypedefが絡むとうまく動作しない。これはやればできると思うのですが、自分があまり必要性を感じていないので対応していません(^^;
・namespaceに対応していない。本当は

Namespace::|
みたいな場合にも対応したかったのですが、namespaceの情報をTAGSから取得するのは不可能に近いのです…。
・コーディングスタイルによってはうまく動作しない。例えばTAGSの解析をインデントに頼っていますので、クラスのメンバ定義をインデントしていなかったりすると、うまく補完候補を取得できません。また、返値を関数の定義と別の行に書いている場合は関数の返値を取得できない、継承しているクラスをクラスの宣言と別の行に書いている場合は継承先をうまく取得できない、等があります。
・動作が遅くなることがある。特にクラスの継承関係が深くて、その上多重継承が絡んだりすると、何回も検索を繰り返すのでどんどん遅くなります。
・名前の重複に弱い。例えばNamespace1::SomeClassとNamespace2::SomeClassがある場合、どちらのSomeClassのメンバを補完した場合も、名前空間関係なしに最初に見付けた方のメンバをリストアップしてしまいます。

こうして見ると欠点だらけですね…。頑張れば対応できるものもあるのですが、現在の、Peggyが作成したTAGSを解析する方法では、これらに対応することは難しそうです。ただ、現在の方法はPeggy本体と協調しやすいので、単純に構文解析の方法を変えても使い勝手の向上に繋がらないかなあと思ってます。

このスクリプトを作りだしたのは二年半くらい前で、そのころからC++のクラスに対応したいなあと思っていたので、不完全ではありますが対応できたのは嬉しいです。
昔は無理だと思っていたのですが、やっぱりモチベーションの違いでしょうね。昔と違って今の仕事はC++が中心なので、なんとかしなくちゃと気持ちが大きくなったんだと思います。
そもそも昔はC++のことが全然わかってなかったというのもあるのですが(^^;

| | コメント (0) | トラックバック (0)

BLOCKGROUP使ってみました

最近、勉強がてら家でもプログラミングをすることが多いのですが(ほとんどRubyのCGIかPeggyMocaScriptです)、会社と開発環境が違うのがストレスになりがちです。

特に困るのはsubversionがないことで、一回バージョン管理システムに慣れてしまうと、元に戻すことができないのが不安になってしまいます。
かと言って、ローカルPCにサーバを立てるのは常駐ソフトを増やすことになってしまいますし、もう一つPCを用意するのも場所を取ってしまいます。玄箱などのカスタマイズ可能なNASでサーバを立てられないかな、と考えておりました。

そういう状況で知ったのが、サービスを開始したばかりのBLOCKGROUPというレンタルサーバです。なんと月額250円で、1GBのsubversionリポジトリが使えるらしい。これはもう破格と言って良いですね。採算が取れるのか心配になってしまいます。

お盆前に早速申し込んで使ってみました。subversionとwebサービスがどう結びつくのだろう?と思っていたのですが、どうやらhtdocsフォルダにコミットしたファイルの最新版がそのまま公開される、という仕様のようです。基本的にはsubversionのリポジトリとして普通に使えるのですが、気になった点を列挙しますと、

・CGIとして使えるのはPHPとPerlだけ。RubyやPythonは未対応。問い合わせてみたのですが、将来的に対応する可能性はあるとのことです。
・WebDAVも同時に使えるのですが、subversionでコミットしたファイルとの関係がはっきりしない。WebDAVで上げたファイルはsubversionでどう見えるんだろう?実験してみたいのですが、なぜかWebDAVでログインできない…。
・subversionのアクセスが遅い。数KB/sしか出てない感じ。まあ、ソースファイルを扱うぶんには十分なのですが。
・htdocs/index.htmlを書き換えてもサイトのトップが更新されない。やり方がおかしいのかなあ。
・1GBというディスク容量は、subversionの管理データも含むので、画像などの大きなバイナリデータを管理すると、あっという間に消費してしまいそう。subversionでは、管理データを減らすことはできなくて、ひたすら増えていくだけなので。
・cron相当の機能がない。
・おまけで使えるBLOCKBLOGの管理ツールトップがやたら重い。ブックマークは記事投稿のページにしておくのが良さそう。

という感じです。総じて、ソースファイルの管理には十分なのですが、これでサイトを管理しようという気にはなりませんでした。
今後改善される可能性もあると思うのですが、しばらくはlacoocanとの併用で行きたいと思います。自由に使えるsubversionのリポジトリとしては唯一無二の存在ですので、頑張っていただきたいですね。

| | コメント (2) | トラックバック (0)

ディアスポラ

ディアスポラディアスポラ

著者:グレッグ・イーガン
出版社:早川書房
SF好きとしては非常に今更なのですが、グレッグ・イーガンの「ディアスポラ」を読みました。 グレッグ・イーガンはオーストラリア在住のSF作家で、巻末の解説によると、
ほとんど独力で現代SFの最先端を支えている
人物であり、
1990年以降に書かれた重要なSFを全世界から十冊ピックアップしたら、そのうちの半分はイーガンの著作になるんじゃないか
というほどです。つまりイーガンの著作を読んでいれば現代SFはほとんどフォローできているわけで、ある意味ではお得な作家さんですね。

イーガンの初期作品は、SFとは言っても基本的には人間の心の動きが主体になっていて、とても読みやすいのですが、この「ディアスポラ」はかなりぶっ飛んでいます。なんと言っても、舞台が30世紀。23世紀じゃないですよ。30世紀です。30世紀を舞台にするというだけで、並のSF作家では尻込みしてしまいますよね。僕も正直、30世紀の人間がどうなっているか、全く見当が付かないですから。
「30世紀の人間がどうなっているか」というイーガンの空想を味わうだけでも、この小説を読む意味があるのではないでしょうか。

ちなみに少しだけ紹介すると、ディアスポラでは、(少なくとも小説の最初は)人類はまだ地球外生命体とも出会っていなくて、地球に住んでいます。…案外普通ですね。でも、その存在の仕方が今日とは全く違っています。30世紀の人類は、肉体的には存在していなくて、コンピュータのソフトウェアとして存在しているのです。地球の各所に「ポリス」と呼ばれる巨大なコンピュータがあり、その中でたくさんの人間が生活している。各ポリスは運営方針が違っていて、あまり交流がない…という設定です。

コンピュータの処理速度は28世紀に限界に達しましたが、それでもポリスの中の人間は、僕たちとは比べものにならないスピードで思考します。人にもよるのですが、ポリス内の人間の一日は、実時間では1分40秒に当たります。一年でも10時間くらい。しかもポリスの住人達に肉体的な活動限界はありません。

確かに生物の究極の目的が永遠の命であることを考えたら、当然の帰結ですよね。ただ面白いのは、あくまで肉体での生活にこだわっている人たちや、自分を機械の体にインストールして暮らしている人たちもいるということです。
こういう多彩な設定が、物語を複雑に、しかも面白くしています。

数学や物理に関する難解な設定が出てくるので、読みにくい小説ではあるのですが、あんまりそういうところは気にしないで、30世紀の人間達の生活や、主人公達と地球外生命体との出会いを楽しんだらいいんじゃないかなあ、と思いました。読み終わった後に、とても満足感を覚える小説だと思います。

この記事を書いてたときのBGMは、ニコニコ動画のスピッツ萌えだけで、ポップアルバム「Girls Pop」も作ってしまったでした。素晴らしすぎる出来です。

| | コメント (0) | トラックバック (0)

Peggyで単語補完スクリプトを更新しました

かなり久しぶりの更新になってしまったのですが、Peggyのポップアップリストを使った単語補完スクリプトを更新しました。

Peggy本体の単語補完機能もだいぶ便利なのですが、このスクリプトは検索ツールでも補完できるようにしたり、Doxygenのタグを補完したり、C/C++の構造体のメンバを補完したり、どちらかというとプログラミング向けのカスタマイズを行っています。

今回の変更点は、前から気になっていた、単語の中にカーソルがあるときの挙動に関するものです。
以前のバージョンでは、Peggyの挙動に合わせて、

Pe|ggy (|はカーソルです)
のようなときに、「Peggy」という単語を補完していたのですが、どうも使っていると、このようなときはカーソルの右側の「Pe」を補完してくれた方が嬉しいのです。VisualStudioの単語補完もこの仕様になってますし。

ただ、このときカーソル右側の「ggy」をどうするかなのですが、VisualStudioでは、リストから単語を選んだタイミングで選んだ単語に置き換えられます。つまり、この場合リスト内の「Peek」を選ぶと、編集ウィンドウはこんな感じになります。

Peek|
ただ、残念ながらPeggyではスクリプトの仕様上、リストで何かを選択したあとに何かをするということができないため、今回の変更では、「ggy」を削除して
Pe|
の状態でリストを表示するようにしています。ちょっと乱暴ですが、多くの場合はこの方が便利だと思います。

最近仕事でC++をメインで使っているので、本当はクラスのメンバ補完とかができるといいのですが…C++の文法は難しすぎるんですよねえ。

| | コメント (0) | トラックバック (0)

« 2007年7月 | トップページ | 2007年9月 »