トップ 最新 追記

2007-08-01 [長年日記]

_ 変更に強いコードとうまい設計を目指す覚え書き

えーと要するに「どうにもならないプログラム」を作らないための覚え書きですが、そのための方法として

  • 変更に強いコード
  • うまい設計(変更に強いだけでなく、全体的にニュアンスとして)

を目指したらいいんじゃないかと思い、そのためのネタをとりあえず吐き出してみました。基本、雰囲気です。

勘違いや、嘘ではないが本当でもない話、逆に有害な話をまき散らしている可能性もあります。そういう場合はできれば分かりやすくツッコんでください。「これはひどい」タグだけつけられても何が悪いのか分からない可能性大です。

逆にこの記事は毒にも薬にもならない可能性も高いです。

途中で文体が大きく変わりますが気にしないでください。

前提

  • 言語そのもの、アルゴリズム、構造化、OO の基礎知識

は、当然持ってるものとします。反対に

  • 「匠」系のスキル

は要求しません。というか組み込みとか知らないし。

アプリケーションの分野による違いはあまり関係ないような気がしていますし、DBMS のチューニングとかそんな話はここではまったく無視してます。ところどころ Java っぽい OO 用語が出てきますが、他の言語の場合は似た概念を適当に補完して読んでください。

目指す姿

そもそも変更に強いコードやうまい設計がどういうものか、慣れないうちは分からないかもしれない。短くしろとは言われるが、そんな短くできっかよと思ってる人はまず以下を読め。*1

短く読みやすく変更に強いコードとは
  • 短いブロック
    • 短いブロックは複雑な機能を持てないので名前付けも容易
    • 機能が単純であればテストも書きやすい
    • 全体の長さが同じでも中のブロックが短ければ当然メソッドの数は多くなる。これはコード全体の「関節の多さ」に繋がる、つまり柔軟*2
  • 読みやすさはあいまいさの少なさ、登場する語彙の少なさ
  • クラス名とメソッド名だけで何が起きるか容易に想像できる

などを概ね満たしていると思われる。

補足

まずほとんどの場合、長いブロックは単に物理的に長いだけでなく冗長である。ほとんどのプログラマの書くコードは実は誰でも書けるコードであり、それがものすごく長いブロックを持つというのは、たいてい間違っており、無駄に長い。短さはほとんどの場合正しい。自分のコードだけ特殊だなどと思っちゃダメ。

また長いブロックを書くプログラマは多くの場合、メソッドに適切な名前をつけられない。なぜならブロックが長いということはその中に詰め込まれている機能が多くなっているわけだから、仕事が複雑になっており、メソッド名という一言で表現できなくなってしまっているから。*3

メソッドが短くなると数が増え、一見読みやすさと矛盾するように見えるが、逆にメソッドになっていない if 文などは意図を解釈するのに時間が掛かる。ほとんどのコードは代入か分岐かメソッド呼び出しかループであり、名前がついていないとどういう動作なのか一瞬で把握することができない。だからメソッドにして明確な名前をつけることにはもぅのすごく意味がある。数が増えることを恐れてはならない。

だいたい、メソッドになってないとその if 文が果たして本当に正しく動作しているのか、ユニットテストで検証しにくいじゃないか。テストのないコードは脆弱なのだ。

数が増えると当然内部からしか呼び出す必要のないメソッドが増えてくる。こいつらをみんな private にすればよい。public か private か悩んじゃうとかみんな public になっちゃう場合はたいてい何か間違っている。

うまい設計

コードとの対比を強調するために、中身を追いかけなくても分かる部分に限定して抜き出してみる。というわけで「クラスが閉じているのは絶対条件」とします。

  • インターフェイスが明確であり、そこ以外気にする必要がない
  • コードと設定が分離していて、ある程度の変更はコードを直さなくても可能
  • 設定の反映が楽
  • 設定をしなくてもある程度思った通りに動く
  • クラスを組み合わせて利用しやすい
    • 依存性はできるだけ外から入れろ
  • DIコンテナを利用して組み合わせていることすら意識せずに使える

プラクティス

では具体的にどうやって目指すのかと言うと、

図を描く
  • 図ではある程度までしか通用しないが、全体を俯瞰するために有効
  • クラスの独立性、DIの様子などは図でチェックしやすい
  • UML とか意識しなくていい
    • UML を必要とするのは UML を理解しているスーツや SI と話さなきゃいけないときだけ。自分で書くなら要らない。
変更のテクニックを学ぶ
  • リファクタリング
  • wrapper

インターフェイスを意識する。

JavaScript や Ruby のように動的に中身を入れ替えちゃう方法は素人にはオススメできない。

コードの読み書き
  • 理屈も大事だが読み書きの絶対量が不足していてはうまくならない
  • いいコードを読み込むか、あるいは反面教師となるまずいコードの修正を試みることでよりよい形を思い描ける
    • 直接自分が使わなくても、伝統的に有名な、入門者にオススメの C のコードは何本かあるので、雰囲気だけでも読んでみるとよい。Cに不慣れでも意外と「意味」は分かる。というか分かると信じて読め。
Unix系CLIを使ってみる

余力があればでいいが、Unix系CLI によるテキスト処理は勉強になる。ただしテキスト処理に興味がないならオススメしない。

Unixの伝統的なツールは基本的に単純なことしかできないので、例えばいきなり Perl や Ruby などの「大きなツール」で書かずに、大昔からあるツールを組み合わせて仕事をするようにしてみると、小さい道具を組み合わせて大きな仕事をするトレーニングになる。

逆に言うと大きな仕事を小さな仕事に分解するトレーニングにもなる。

よくある間違い

  • なんかメソッドが set_* とか get_* だらけになる
    • メンバ変数を直接取得しなきゃいけないようなケースなんてそんなにない、っていうかあんまりなんでもかんでもメンバ変数にしなくていい。むしろメンバ変数は最小限でいいじゃん。
  • テストがうまく書けない
    • そのメソッドの機能が複雑です。単純な値を受け取って単純な値を返すメソッドにガシガシ分割しましょう。というか、「関数」ってなんだか知ってる? 単にコードブロックに名前がついたものじゃないんだよ。写像なんだよ。
  • テストを書くのが邪魔くさい
    • テストに使う値をテストコードの中にそのまま書いちゃダメです。テストコードと言えどコードはコード。マジックナンバー入れちゃダメってお母さん教えたでしょ。入力と期待される assert の結果を全部 YAML で書いてループでぐるぐる回してエラーが出たらそこの値をどべっと吐き出すコードを書いておきましょう。あとはテストの追加の大半は YAML への追記でまかなえます。ほとんどの assert は equal かどうかのテストになるはずです。
  • どうやってもコードが短くならない
    • データ構造が間違ってます。

*1 実際適切な短さは言語によって変わってくると思うので、具体的な数字は現場によりけり。

*2 可動域の話は置いておく

*3 Rails のようにあえて長いメソッド名を採用する方法もあると思うけど、あれは中のコードが長過ぎてしゃあなしで長くなってるんじゃないですぞ。


2007-08-02 [長年日記]

_ まだ Perl で YAML は Syck が主流かな?

夏 DOKI Lisp スティック - YAML パーサのベンチマーク

yaml.com の PyYAML の Perl 移植版てのはまだ全然若いので、現実的には Syck 一択って感じか。

Syck のインストールができない場合は Syck 互換の YAML.pm かな?

Tags: YAML Perl CPAN

2007-08-03 [長年日記]

_ やっぱ Perl しんどい

Perl 5.6 以降の Unicode 周りの話は華麗にスルーしてきたんだけど、あらためて昔のスクリプトをどうにかしようと思い、久々に Perl を触って悪戦苦闘。まずデータ構造の扱いにくさに泣きそうになる。ついで日本語。なんか Unicode がどうのこうでやたらといろんな方法がある。無理。こういうとき Perl の TMTOWTDI は本当に腹立たしい。どのやり方でもエレガントにできない言い訳じゃないのかと。

とりあえず設定を全部 YAML に逃がして、最終的に Perl でないもので動くように(!)持って行きたいがための作業なので、面倒なところはやはりスルーしつついくのがベストのような気がして来た。幸いこれ、日本語を直接読み書きしなきゃいけないものじゃないしな。

Tags: Perl

_ 結局日本語周りをまとめた

例によって嘘、大げさ、紛らわしい場合はツッコミぷりーず。

基本

  • 5.8 以降では Perl は内部的に文字列を UTF-8 で扱うものとする
  • Perl 的に認められた文字列には UTF-8 フラグがつく
  • UTF-8 フラグのついていないものでも人間が文字列として認識するのは自由

use utf8;

コードが UTF-8 で書かれていることを宣言する。もしかすっと将来的にはこれがデフォルトになるのかも。

マルチバイト文字列を正しくマルチバイト文字列として扱おうとしてくれるが、副作用としてマルチバイト文字を print したときに警告が出るようになる。

逆につけなくても今まで通り日本語をコード中に書くことはできる*1。これをそのまま print することは可能。euc-jp だろうが utf-8 だろうが同じ手法が使える。もちろん Shift JIS のように地雷を踏みやすいエンコーディングを選ぶ際は自己責任で。ファイルの読み書きも従来通りに動かせます*2

ただし、use utf8*3しておかないと、シリアライズ系のものが軒並み \xXX 形式になってしまい、コマンドラインでの作業効率はよろしくない。つけてもつけなくても同じ結果になるモジュールもあるが、最近の UTF-8 フラグを解釈してくれるモジュールを扱う場合はつけておいた方が少し幸せになれるかも*4

use utf8 しておくことで他にも嬉しいケースはあるかもしれないんだけど、あんまり詳しく調べてません。正規表現マッチを日本語で書けるような気がする。

binmode STDOUT => ":utf8";

UTF-8 フラグのついたマルチバイト文字列を print するときに UTF-8 フラグを落としてくれるので、警告が出なくなる。use utf8 したときはこれ書いておかないとコマンドラインでの作業が邪魔くさくなる。

もちろん一つ一つ

Encode::encode()

して出すっつー酔狂な選択をしてもいいけど、そんなの面倒じゃん。

use encoding CHARSET;

Perl 5.8 で内部的には UTF-8 でイクっつーのは決まったんだけど、そんでもどうしてもコードを Shift JIS で書きたいやい、UTF-8 なんてやだいやだいという場合にしゃあなしで使うことを許されるもの。

use encoding "euc-jp";

って書いたら euc-jp で書いてあるコードでも UTF-8 で書かれているのと同じようにマルチバイトな文字列として扱ってくれて、なおかつ STDIN も STDOUT も euc-jp を期待して動いてくれる。

当然、UTF-8 フラグ周りの警告も出ない。use utf8; とは排他と考えるべし。(実際には使えるみたいだけど、「混ぜるな危険」が基本です。)

use open

スクリプトもデータも euc-jp なんだけど、もうターミナルは UTF-8 で統一したいし、他の UTF-8 前提で動いてるアプリと組み合わせたい、という場合は、コード中にマルチバイトなリテラルを書いてなければ、

use open IN => ":euc-jp";
use open OUT => ":utf8";
binmode STDOUT => ":utf8";

とすることでそれなりに対処できる。上の例では euc-jp の入力、UTF-8 な出力を期待して動く。

ターミナルだけの問題なら screen でも対応可能だけど、他のアプリと繋げたいという場合は open を使うと楽できると思う。

use Encode;

使ってないんでよく分からないけど、これは変換以外に気にするポイントはないのかな。

なんかねぇ、似たような単語でいろいろな機能が動くんで、ものすごく分かりにくいです。

参考

Tags: Perl

*1 Perl 5.8.8 で確認した。

*2 5.8.0 では暗黙のうちに UTF-8 フラグが立っちゃってぎゃっ!と言う人が続出したらしい。

*3 あるいは use encoding

*4 シリアライズは Data::Dumper よりも YAML の方がいいような気がしてきた。でもどっちを使ってもハッシュを与えたらリストと勘違いしちゃうのでハッシュリファレンスを与えなきゃダメっつー辺り、やはりいや〜な気分にさせてくれる。


2007-08-04 [長年日記]

_ なんかプレゼント当たったよ

Tシャツにサンダルという極めてラフなカッコで電車に4時間乗って行ったオレ様の LLSpirit の感想ですよ。(TrackBackセンターってないみたいね。)ボール投げのプレゼントに当たったのですが、このプレゼントは正直「仕事しろ」と言われているようで若干複雑な気分ですよ。

当日の神保町はですね、やはり何百人とそっち系の人がいるので「そういうオーラ」が漂ってましたね。なんつーか一人一人は別にそこら辺にいても何の違和感もないんでしょうけど、集まるとやはり何か独特のものが生まれます。というか会場で明らかに発表とは関係のないコードをいじっている人がチラホラいるのはなんだろうと思った。いやまぁ、自分も機械が軽くてバッテリが保つなら同じことやったと思うけどね。

以下、発表の内容も踏まえつつ感想など。

  • 和田先生の話を聞いて歯車重要って思った。つか歯車って面白いな。
  • Perl 5.10 機能増えすぎ
  • 予想通り DoCoMo 2.0 系のプレゼンあり。Ruby の 2.0 は出ません。「もしかして機能」も載りません。
  • PHP の人ぶっちゃけすぎ。Python とのギャップがすごすぎ。ちょっと Python ステキ。
  • Xtal の人の喋りがヒットしまくり。「あとは FizzBuzz です。」ってまぁそうなんだけど。
  • なでしこの人は大人だなぁ。そして質問をした Dan の中の人の「はぁ〜〜」っていう感嘆に大爆笑。なでしこすげぇ。

VM の話はどうせ分からないからと中抜けしてホテルへチェックイン。

  • amachang て本当にあのスタイルで生きている人なんだ。そこに感心。(別に悪い意味はどこにもないです。)
  • S6(仮)の、ページ内のどこでもプレゼンにできる機能とインデックスの機能はかなりステキ。
  • Gauche の人の発想がビックリ。vnc を使ってみたかった、スライドは画像で適当に作れ、という割り切り方にビックリ。Dynamic サイコー。
  • プレゼンは紙芝居形式でなくてよいのではないかという会場からの指摘は個人的には的外れな感じがした。見せる内容や会場をあまり選ばずに汎用に使える方式はそれほど多くないと思う。
    • てなことを書いていたら種明かしが。んーいずれにせよかなり利用シーンが限定されると思うし、それ「プレゼンツール」や「プレゼン」である必要ないんじゃ*1
  • 効果がスライドの中にコードっぽく入ってしまうのはどうだろう、というのは自分も思った。XML にした Ocaml版はオーサリングツールでフォローというスタイルでうまくハマりそうだけど、オーサリングも含めてプレゼンだよなぁという気もする。
  • そう思うと実はオーサリングも発表も楽な高橋メソッドというのはやはりすごい。
  • モテと非モテの夢のコラボ希望。
  • otsune の中の人のチャットツッコミはやはり才能だと思った

※ 当日会場で見かけた、とびきりイヤなオーラを発していた長髪の人はもしや otsune の中の人じゃないよなぁ…。なんつーか、LLSpirit でヒソカを見た気がした。

  • テンプレートエンジンはまた新しくなったらしい
    • Kwartz はもうやめたのかな
  • イメージファイトのプレゼンすげぇ
    • スライドの見た目をもう少し見やすく作ってくれると文句なくサイキョーです
  • XBYAK すごすぎ

サイボウズ・ラボの人が多いなぁ。

その後は知ってる人もいないので、東京の知り合いと合流して飲んで寝ました。

楽しかったよ。また何かの機会に参加できればいいなと思います。

Tags: LLSpirit

*1 例えば時間軸をいじるのは面白いけど、オーディエンスが同じ時間を共有しないのであれば、爆笑や拍手の瞬間も共有できなくなってしまう。そんな「ライブ」面白くないYO! ツールそのものやアイディアは否定しないけど、なんかメディアアートの世界に入りつつあるような気がする。

本日のツッコミ(全4件) [ツッコミを入れる]

_ otsune [ヒント:今のオレは髪が長くない]

_ wtnabe [おぉ。なんかちょっとほっとしたような残念なような。]

_ ただただし [色々とアイデアを膨らました上で評価して、紙芝居方式に落ち着くのなら良いのです。何も考えずに紙芝居にしたのなら、それは..]

_ wtnabe [なるほど。実は今回聞いた中で Java の方のでしたか、3D の部分には興味がなかったんですが、Comet で pu..]


2007-08-05 [長年日記]

_ やはり Realforce か

LLSpirit の次の日の予定はまったくなかったので、もうオレの知らない土地になってしまったかと思っていた秋葉原へ。なんか住み分けができてるみたいで、萌えとは無縁な散策。そこでようやく初めて Realforce の実物を触る。

明らかに HHK Pro より好み*1

荷物を増やす気はなかったけど、とりあえず購入は決意しましたとさ。ここんところキーボードはブラックで揃えてきたけど、あえてアイボリーもいいかなと思った。

※ やはりキーボードがあんなに大量に展示してあってほとんど全部試せるっていうのはいいよねぇ。田舎にはあんな店ないもの。

帰りは飛行機。案の定飛んだ瞬間に眠りに落ち、知らない間に着いてしまった。飛行機はほんとによく眠れる。

[2007-08-06 追記]むしゃくしゃして注文した。WinK for OSX- MacのWindows用日本語キーボードドライバ で使い倒してやる。

[2007-08-09 追記]なんと

Realforce 91U は ctrl と capslock の入れ替えができなくなっている!

うわあーあーあーあーあーあーああーああー。

こんな大きな変更がどうして話題になってないんだーーーーーー!!!!

10.3 + uControl でなんとか対応できたけど、正直かなりへこんだorz ものすごく期待がでかかっただけに。

昔は WinK だけでできたみたいなんだけどねぇ。なんかあれもこれも新しくなって悪なっとるやんけ。

Tags: 日々

*1 和田先生ごめんなさい


2007-08-08 [長年日記]

_ XHTML + CSS スキルセットは超重要

IT戦記 - マークアップエンジニアはどこへ向かうべきか(を考えてたらカッとなって LL の資料公開)

まぁ「それだけ」だとお仕事的に困るかもなとは思うんだけど、そんな話を非マークアップエンジニアが語るのは余計なお世話だろう。

で、それとは別に実際問題このスキルセットは極めて重要で、これらをちゃんと理解してる人がどれだけ Web プログラマに居るのかというと結構疑問だったりする。

Web に関ろうという人は XHTML + CSS のスキルはまずきちんと習得した方がいいと思う。正しい HTML じゃないとブラウザ間の挙動の揺れが読めない。これは JavaScript を使っていなくてもそう。マークアップをバカにするやつはマークアップに泣くよ。そのくせテストの工数がーとか言い訳ばっかうまくなったりする。そういうのは自分も周りも不幸にする。「とほほ」眺めて分かった気になってるようなやつは廊下で立ってろ。

例えて言えば Web アプリをやるうえで HTML がよく分からないっていうのは、ファイルにデータを書き出す方法がちゃんと分かってないとか、データベースへのアクセスがよく分かってないとか、そういうのと同じわけですよ。サーバサイドのプログラムにとっては、どういう風にデータを受け取って、どういう風にデータを出力するのか、っつー話なわけだから。(もちろん HTML だけ分かっても HTTP が分からないと話にならないんだけど。)

CSS もきちっとやっておかないと、DOM をどういじるのが効果的かということを理解しきれないです。CSS の継承を利用すれば最小限のコードで最大限の効果を生むことができるんだけど、これが分かってないとメタメタな HTML を JavaScript でむりくり操作しまくって、とても分かりにくいうえに遅くて使いものにならないとか、HTML をちょっと変更したら全然動かなくなるコードを生み出したりします。で、動かなくなるから HTML の変更禁止とか本末転倒な現象が起きる。これはもはやアルゴリズムもデータ構造も分からないまま我流で突き進んじゃう、なんちゃってプログラマと同じです。百害あって一利なし。

マークアップエンジニアの行く末なんか心配してるヒマはないよ。マークアップエンジニアとタメ張れるくらいに勉強しないと。みんなが勉強してるんだったら、いよいよ行く末が心配になるかもしれない。逆に、心配している(ようにはあんまり見えないけど、リンク先の)彼らは本当に理解して使いこなせているってことなんだろう。

まぁでも HTML 5 だっけ? あれが実装されたらまたしばらく混乱が起きて、カリスママークアッパーとか出てくるんじゃないかな。なんかそんな感じ。

Tags: HTML CSS Web

2007-08-09 [長年日記]

_ ジョジョ芸人見た

全然興味なかったんだけど、録画してあったアメトークのジョジョ芸人を見た。

なるほど、LLSpirits での Matz の「しびれる、憧れる」発言はここからきてるのか。

ジョジョってスティール・ボール・ラン以外は全部読んでるはずなんだけど、特に 1, 2, 3部辺りがあんまり印象に残ってないんだよなぁ。絵のシャッキリ感が足りないというか、もともとビーティーの頃から苦手な絵だったりするので。

それでも4部以降は設定と描写の見事さが強く印象に残っている。(セリフとかは全然覚えてないけど。)HUNTER×HUNTER もそうだけど、こういう細かい設定を組み合わせて戦わせるカードバトル系というか、そういう設定のものはそんなにきらいじゃないみたいだ。

ということはポケモンにもハマれるのかもしれないな、実は。

Tags: Comic TV 日々

2007-08-10 [長年日記]

_ OSX でウィンドウ切り替え

OSX では command + tab でアプリケーションの切り替えはできるんだけど、一つのアプリで複数のウィンドウを開いていた場合にそれらのウィンドウの切り替えをキーボードから行うことはできない。

と、思い込んでいたができた。

趣味の日記 OSXでのウィンドウ切り替え

10.3 の環境ではここで書いてあるのと違って

command + `

だった。ただし、Realforce + WinK ドライバ + uControl の環境では Shift + @ で入れる ` ではダメで、たまたま [半角/全角] に割り当てられていた ` を使ったら動いた。つまり、

command + `
command + tab

はキーボードで縦に並んでる状態になって、予期せずなかなか使い勝手のよい状態に。へー。

Tags: OSX

_ psh - interactive shell with the power of perl

※ psh はログインシェルまでこなせちゃう shell です。Perl をインタラクティブに使いたいという、当初の目的からは外れそうです。

川o・-・)<2nd life - perl でインタラクティブなシェルを実現する perlsh

とか見て入れてみっかーと思って Debian etch(4.0) で似たような感じの名前を探してみたところ、

$ apt-cache search readline | grep perl
libenv-ps1-perl - prompt string formatter
libterm-readline-gnu-perl - Perl extension for the GNU Readline/History Library
libterm-readline-perl-perl - Perl implementation of Readline
librarieslibterm-readline-zoid-perl - Pure Perl implementation of Readline libraries

てな感じ。でもやはり perlsh コマンドとやらはインストールされない。cpan から入れているわけじゃないし、ソース展開して deploy なんていやなのねんと思い、気分を変えて FreeBSD の方で

$ make search key=perlsh | grep ^Path
Path:   /usr/ports/shells/perlsh

キター。ここで Makefile を読むと

MAN1=   psh.1 \
        pshcomplete.1 \
        pshconfig.1 \
        pshdevel.1

おや? psh ?

改めて

$ apt-cache search psh | grep perl
libpdf-api2-perl - provides the functions for creating PDF documents in Perl
psh - interactive shell with the power of perl

おっ。

apt-get install psh
$ psh
psh% File::Glob::<TAB>
AUTOLOAD                                bootstrap
GLOB_ALPHASORT                          bsd_glob
GLOB_BRACE                              constant
GLOB_CSH                                csh_glob
GLOB_ERROR                              doglob
GLOB_NOMAGIC                            glob
GLOB_QUOTE                              import
GLOB_TILDE

おぉ。豪快に補完される。

ステキ。

※ OSX 10.3 + PPC の環境では cpan からインストールしたあとに .cpan/build/psh-1.8 内で make install した。これで合ってるのかどうかよく分からないけど動いてる。Term::Readline::Gnu はコンパイルにコケるので、Term::Readline::Perl にした。

あーれー? なんか普通のコマンドも補完するな。んー? なんか思っていたのと違う?

本日のツッコミ(全2件) [ツッコミを入れる]

_ poppen [FreeBSDの場合、devel/p5-ReadLine-Gnuをmake extractすれば、perlshが含ま..]

_ wtnabe [そうですね。そういう方法もあるんでした。Debian でも同じ要領でイケそうですね。ありがとうございます。ずいぶん遠..]


2007-08-11 [長年日記]

_ perlsh を OSX 10.3 + PPC 環境にインストール

なんか psh は高機能すぎて目的と違う気がしてきたので、結局最初の予定通り perlsh をインストール。以下手順。

  1. cpan から install Term::ReadLine::Gnu
  2. OSX 10.3 + PPC 環境では readline.h が見つからずに compile 失敗
  3. 手元に Fink で入れた Readline があったので、それを使って compile
  4. perlsh スクリプトを PATH の通ったところへ install

3 では

~/.cpan/build/Term-ReadLine-Gnu-1.16

に入って

perl Makefile.PL --prefix=/sw
make
sudo make install

Fink じゃない人は /opt とか適当に書き換えるよろし。

4 では

cd eg
sudo install -m 0755 perlsh /usr/local/bin

あと。perlsh は

#! /usr/local/bin/perl

になっているので、これを自分の使っている Perl インタープリタのパスに書き換えてやる必要あり。

僕にもできた。

ただ。これがどれくらい便利なのかはまだよく分かりません。


ちなみに、インタラクティブに Perl を使いたい場合、選択肢はまだまだあるらしい。psh の中の人が書いた

psh - Perl SHell

のいちばん下の方にある比較表が役に立つかも。

[追記] てゆーか fink に term-readline-gnu-pm581 があった。これならコンパイルエラーとか考える必要なかった。ただ結局ソース手に入れて eg/perlsh をごにょごにょ、っていう手順は必要だけど。

Tags: Perl CPAN OSX

_ インストール済みモジュール一覧

use ExtUtils::Installed
$installed = ExtUtils::Installed->new()
$installed->modules()

で採れる。static に呼んでも採れないっぽい。

.perlshrc

に2行目まで書いておくと楽かも。my つけちゃうと実行後解放されて呼べなくなるので注意。

perldoc perllocal 方式はなんかよく分からなかったので別解を探しましたとさ。これで少しは楽になったかも。

※ 不要になった psh は make uninstall しようとしたらそのやり方は古いからダメって怒られ、結局削除されないのんで、locate psh で探しまくって削除しまくりました。

Tags: Perl CPAN

2007-08-12 [長年日記]

_ スティール・ボール・ランまで読んだ

しかしあれだな。ネタ的においしいのはやっぱ自分の印象があまり強くないジョジョの1〜3部の方だなと思った。

Tags: Comic 日々

2007-08-14 [長年日記]

_ 甘く見ていた

実家に帰ったら機械が変わっていた。しかも爆熱Athlonミドルタワー。なんだこの一昔前の漢な構成。っと思ったらどうも仕事で使っていた機械のお下がりらしい。なんだかとてもいやな予感がする。

人がせっかくちょこちょこデジカメで撮り貯めた写真を保存できるように DVD ドライブ買ってやったっつーのに要らねーじゃん。(まぁ目の前の機械はコンボドライブだから CD しか焼けないので交換のメリットはあるのだが。)

  • どうも話が見えないが前の機械から完全に引っ越しが終わってないらしい。
    • ということでいやな予感がしていた前日のうちに LAN ケーブルを買いに電気屋へ*1。さすが田舎。10, 15, 30m しかない。1m があったと思ったら無駄に Cat6e のスーパーフラットorz
  • 前の機械に火を入れると起きない。えー。
  • しょうがないので PowerBook で knoppix を作り始める。
  • knoppix 起動失敗。むー。
  • run level 2 で起動。やはり失敗。なんだこれ。なんかビデオのモードが切り替わるタイミングで止まっちゃうみたい。
  • ultimate boot cd も一応落とし始めたのだが、頭にきて古い機械の HDD を引っこ抜いて新しい方へ(ミドルタワーなのでスペースはある)
  • マウントできた。もうこんでいいや。マウンタないけど、動かさなきゃ壊れないだろ。壊れてもどうせ要らない方のディスクだ。
  • 見るとデータは全部あるっぽい。
  • つかアンチウィルスソフトすら入ってねぇ。なんだこの機械。なめんな。

つーことで残りの作業は

  • 例によって Windows Update しまくり(またか)
  • 自動更新ON(ADSL になったので)
  • 明らかに要らないアプリをアンインストール
  • 最近話題になってた AVG 日本語版をインストール
  • IE -> Firefox, OE -> Thunderbird の移行*2
  • 筆王のインストール
    • ユーザーが一瞬で分かる「終わっていない」要素は結局これだけだった。誰だ、こんな中途半端な作業しやがったやつは。このド素人が!

以前 sesna というマイナーなメールソフトを使わせていたときのデータをコンバートしてやろうと思ったら Subject をもとに保存してあるメールのファイル名を for i in * で拾うと結構こぼれる。うーん。変換用の Ruby スクリプトそのものは完成したが、ファイルを正しく認識して変換スクリプトに投げることができなければ意味がない。

昼飯。

あーもういい。それは諦める。アドレス帳だけコピペしときゃいいだろ。どうせ過去のメールの大半は削除しながら使ってんだ。(メールの検索がまともに機能してないと溜めても使いにくいだけだしね。)

……。

AdjustPC 入れてくるの忘れたな。つか帰省するのに Windows 2000 セットアップ手順書など持ち歩きゃしませんよ。そら忘れるわ! しかも面倒になったのでせっかく買った DVD ドライブは放置して帰ってきた。もうなんだ。なんだこれ。

Tags: 日々

*1 自分の機械をインターネットに繋げながら作業を行うため。また、当然のことだがパソコンショップなんてない。

*2 あくまでオレ様の目の届く範囲の機械に IE や OE をメインで使わせることはしない。


2007-08-15 [長年日記]

_ OSX 10.3(Panther) で Rails 1.2.x

結論から言うと、10.3 Panther + PPC という、開発者的にマイナーな環境ではパッケージマネージャ任せで我慢しろってこった。

  • Locomotive は動いてるフリして実は 10.4+ 用だった
  • Fink に入った Rails は 1.1.6 だった(アップデートを掛けたら 1.2.1 になった)
  • 1.2 で入った REST 風の機能が使いたいよぉ
  • gem で rails を最新にしたら動かないぞ
  • fink の gem が古いらしい
  • gem のアップデートってどうやってやんだ?
  • 面倒くせぇ、とりあえず一回全部 RubyGems を抜いてみよう
  • setup.rb で gems をインストール
  • gem から rails をインストール
rails rest

できたできた。

※ Ruby はあらかじめ Fink で 1.8.4 が入れてあります。

あれー。sqlite driver が gem からインストールできないぞ。やっぱ無理があるのかなぁ。DB 動かないんじゃ generate できても意味ないもんな。

ということで、素直にパッケージマネージャ(Fink なり MacPorts なり)の対応しているバージョンで我慢しましょう。

_ ついに出た O'Reilly の JavaScript 第5版

なんと。買うか。ノーマークだった。これはJavaScript を分かってるつもりの自分のような輩こそ用意しておくべきものだろう。

でもオライリーの、バイブルを担うべきこの手のやつで4,400円て安くないか?と思ったら原著からは 200ページ減らしい。それでも700ページか…。まぁでも分冊とかやられると扱いにくくてしょうがないしねぇ。イロイロな判断で削った分があるんだろな。

とりあえずこれで「変な本見つけ出してこねーでこれ読め」と言える本ができたはずだ。もちろん自分で中身の確認はするけど、素直に嬉しい。JavaScript で使いものになる「まともな本」てほとんどなかったもんなー。

[追記] つか金沢にねーよ。どうなってんだ。ほんと田舎はこういうとき困るわ。


2007-08-16 [長年日記]

_ Fink のアップデート一覧を取得

fink list | awk '$1 == "(i)" {print}'

あーこうか。Fink のアップデートはサボらずやらないとダメだな。

Tags: Fink OSX

2007-08-17 [長年日記]

_ 夏休みの課題に Rails

さて。以前からチェックだけしておいた Rails を今月に入ってちょこちょこいじり始めている。

春先に PHP でオレオレフレームワークのかけらほどを作ってみた経験があったので、以前のようにあまりにぼんやりと「なんか便利らしい。ふーん。」程度の認識ではなくなっており、半ばなんぼのもんじゃいという奢った気持ちで手を出してみたら、これが全然訳分かんない。

いや正確には手順に従えばいいっていうのは分かっていて、従った場合には何が起きているのかは分かる。でもなぜその動作をするのかと、示された手順から踏み外した場合にどうすればいいのかがよく分からない。甘く見てました。

そもそも手元のアジャレイルズ本がすでに古くなってきている。1.0 前の記述であり、migration は付録扱いだし、migration は 1.1 で generate model とうまい具合に統合されているし、rake migrate は deprecated だし、この段階でかなり話が噛み合ない。おぉう。もちろん基本の構成は変わっていないので十分通用するんだけど、いちいち出てくる手順で mysql のコマンドを直叩きしてくれちゃっているので、雰囲気が結構違う。やばい、早くやっつけてしまわなければ。

以下、思ったこと。

  • 最初のうちはまず model を generate しろ
    • migrate のひな形も作ってくれるので Rails の「意図」を理解しやすい
    • model は単数形
    • てことはやはり modeling がかなり重要な予感
    • 失敗した!と思ったら destroy model Modelname で ok
    • 逆に要るものをうっかり destroy すると結構悲しいのである程度の形になったらさっさとバージョン管理する
  • scaffold は migration を書いて rake db:migrate してから
    • でないと旨味半減
  • どういう便利メソッドがあるのかよく分からねぇ
  • script/console チョー素敵
    • helper って特異クラスなのねチョーかっこいい
    • でも model の方は ActiveRecord::Base を、controller は ActionController の方を覗いて行く必要あり。まぁそれでいいか。
  • database.yml の adapter は require するものを書く
    • sqlite3 が使いたければ sqlite3 と書く。sqlite だと使えない
    • この設定はサーバを再起動しないと反映されない
    • migration の際には ruby がゼロから起動するので反映される。気づきにくい。
  • model でデータの絡む処理を、controller で URI の定義を行う
  • flash にしびれるぅ、あこがれるぅ
    • 次のリクエストでサクっと使えるっつーのはニクいなぁ、こうきたか。

2007-08-20 [長年日記]

_ tunnel 越し whois

whois が止められているネットワークからどうにか tunnel 越しに whois 引けないかなぁと思っていたんだけど、そもそも whois コマンドが普段どのサーバに繋ぎに行ってるのかよく分からないというひどい状態であることが分かってきた。要するに、

tunnel の掘り方は分かるけど、どこに向かって掘ったらいいか分からない

わけだ。

調べると、Directory of Internet Whois Servers なんてのが見つかった。おーとりあえずこれでよさそう。あ、いや古いな。

whois -h whois.nic.ad.jp

すると

whois.jprs.jp

を使えと返ってくる。なるほど、じゃそれだけ直して、alias で whois は rs.internic.net を、jwhois は jprs.nic.ad.jp を見に行くように設定してみた。うん、快適快適。

web gateway でいいじゃん? いやーそれが面倒なの。

それにしてもコレ、どこかで最新の情報を管理、公開してくれてないんだろか。あー

*.whois-severs.net

(* は country code)で指定できるのか。これ使えばいいのかなぁ。

Tags: Net

2007-08-21 [長年日記]

_ Hash と map と key の順序

[ruby-list:43857] Hashへの生成順は保障されないのか?

ここから、本人は放っといて Hash が順序を保持してくれると嬉しいときはある、いやいやそれはインタ−フェイスが似ていればいいんであって map 使えばいいじゃん?とか話が膨らむ辺りがステキなわけですが。

以前 PHP の array はマップだってマニュアルにも書いてある で触れたように、PHP 使いが他の環境に移ってまず最初に面食らうのはここじゃないかと思う。(SQL が分かるのならそれはそれでそんなもんだと思うかもしれない。)個人的には PHP の array は遅い遅いとかつて評判だった頃からこの map 方式の array にはいい印象を抱いていない。順序の保持は必ずしも人間の直感に従うわけではなく、例えばすでに生成された array の中身を書き換えた際、その添字が数値でないなら修正した値がいちばん最後になったりするわけです。

BEFORE

$a['foo'] = 'hoge';
$a['bar'] = 'fuga';

処理

$a['foo'] = 'hogege';

AFTER

$a['bar'] = 'fuga';
$a['foo'] = 'hogege';

みたいな*1

これって、どうせ順序を「保持」するなら BEFORE の方を「保持」してほしくないすか?

こういう罠があるので、結局順序が必要な場合は別個に array で*2保持しておいて、そこから key を取り出してそれを利用してアクセスする、という方法を採ってたりします。どうしても順序が大事な場合だけね。

※ ちなみに上の例に関しては、自分の扱ったものの中で実際に順序が思っていたのと違う場合があり、じゃあ別に持てばいいやとさっさと切り替えてしまったもので、その後深く追跡したりはしてないです。

つかむしろ PHP に素の Hash 欲しいです。その方が速いなら、だけど。

……。

なんと! Ruby 1.9 の Hash は順序を保持するパッチが入ってしまった! 当面は仕様として明記しないようです。

Tags: PHP Ruby

*1 未テスト注意。あくまで感覚をつかんでもらうための例ですので。

*2 PHP だと結局全部 array なんだけど


2007-08-22 [長年日記]

_ Realforce91U 3日目

※ 実際に手に入れたのはもっとずっと前なんだけど、フルタイムで使うようになってから3日目という意味です。

意外とすぐに慣れ、PageUp, PageDown なんかもフツーに使える。これは SpaceSaver とか ThinkPad とか使ってたときの感触を手が覚えているからか。ただモバイルノート使いのサガとしてまだ押下量が足りないらしく、スイッチが入らない場合がチラホラ。command + w のつもりで w が入る、C-x o のつもりが C-o になるなど下の方のキーを押す力がどうも弱いらしい。これはチルトしてて、上の方のキーにより力が入りやすくなってるからかもしんない。やめてみよう。

あと、ちょっとマウスが遠い。テンキーレスなのでずいぶんマシなんだけど、カーソルキーなどの分、気持ち遠い。

そんなところ。

もちろん今までに買ったキーボードの中では最高値であり、使い心地がいいのは言うまでもないんだけど、とりあえず現状の問題点をあえて挙げてみる遊びをしているわけです。別に本気で文句言ってるわけじゃないです。以前大騒ぎした けれども OSX 10.3 でも問題なく使えます。

Realforce は音が控えめというところも気に入っていたんだけど、いざ実際に使い始めてみるとさすがにノートのペチペチよりはるかに音が大きい。おかげでいかに自分がたくさんキーを叩いているかがよく分かってきた。昔、Project Orca だの Dolphin だのと言っていた頃を思い出した。まぁ結局こういう日記を含めて考えごとをほとんどそのまま Wiki やら YAML やコードやらに叩きつけているからなんだな、きっと。

Tags: 日々

_ Perl で引数の解釈と Usage の作成、のオレ流まとめ

※ 最近 Perl の話題が多いのは昔のスクリプトをいじっているからー。

先に結論を書くと、

  • Getopt::Long
  • Pod::Usage

を使う。

ベストプラクティスから外れているのは CPAN そのものを積極的に利用する気がないから。実質標準あるいはまさに標準であり、Perl 以外に特別なものが必要ないか、あるいは OS というかディストリビューションのパッケージシステムに組み込まれているケースが多く、導入が楽であるということが極めて重要。

Getopt::Long

Ruby の optparse ほど賢くないので、usage の自動生成とかできない。しかし何はともあれ引数の取得だけはかなり楽なので、そこだけに期待して利用する。

Pod::Usage

まず最初に

POD はちゃんと書け。

で、基本的には

  • -verbose の値によって表示するドキュメントのボリュームを設定
  • -input によって利用する pod の収まっているファイルを指定

くらいを使う。

日本語も書ける。ただしどのバージョンから公式に利用できるのかはよく分からない。*1OSX 10.3 に入っている Perl 5.8.1 RC3 では日本語は化けたが、Debian etch(4.0) に入っている 5.8.8 では問題なく扱える。

=encoding

で Encode の解釈できるエンコーディング名を書いておけと言われているが、たぶん locale とか terminal とかその辺のエンコーディングが統一されていれば、書かれていなくても問題なく解釈、表示できるっぽい。

Tags: Perl

*1 あちこちの blog などで自力でパッチを当てたりして日本語を利用している人を見ることができる。


2007-08-23 [長年日記]

_ Reminderfox が便利かも

mozdev.org - reminderfox: index

※ まだ使ってみてないです。インストールしただけ。

以前 Common Notifier API 妄想 なんてのをぶち上げてみたりしてるわけだけど、実はこれでいいのかもしんない。

  • Reminderfox に notifier とスケジュール追加の機能があり
  • iCal サーバと通信できるのでフル機能のカレンダーアプリのように凝る必要がない
  • 元が MUA なのでメールドリブンの予定管理に最適

てな印象。早速使ってみます。Thunderbird 2.0 のタグ機能とも連携してますな。当然カレンダーに載っからない TODO 管理には使えないけど。


2007-08-24 [長年日記]

_ ecb 入れてみた

ECB - Emacs Code Browser

speedbar って初めて使った。

んー。これはー。マウスが使えないとあんまり便利じゃないかも知んない。-nw で使ってると単に複雑な keybind が増えただけで、さほど嬉しくないなぁ。methods のリストアップなんかも、言語の対応具合によって違うような? 少なくとも手元の PHP のコードは class の中は無視されちゃって使いものにならなかった。mode の問題なのか? なんかサイトを見てもその辺の理屈がよく分からないんだなぁ。

Tags: Emacs

2007-08-25 [長年日記]

_ ecb 続き

とりあえず便利なのかどうかもよく分からないままだとなんかシャクなので、carbon emacs を build し始めた。

carbon emacs で試すとちゃんと PHP の class も解釈できるな。なんだろう? 何が違うのかな?

んー。わっかんねーなぁ。正しくパースできてるやつとできてないやつがある。同じ emacs 22.1 の nox と carbon の両方で試しているんだけど、同じファイルなら同じ挙動をするのかというとそうでもない。なんかどうもファイルを開いた順番とかも影響してそう。

なんだー? これ。

Rails のプロジェクトの方はきれいだな。php-mode の問題かもしんないなぁ。

[追記] んー。基本的に ecb が利用している CEDET の中の Semantic で解釈を行うのかな? だとすると対応言語には

Emacs Lisp, Java, C/C++, C#, Python, Erlang, awk, Makefile, and Scheme.

って書かれてるんだよな。ここに書かれていない言語はどうやって解釈してるんだろ? わっからないなー。Lisp ほとんど読めないし。

あ。PDF のマニュアルを読んだら

a list of functions/classes/methods/... in the current file, (ECB uses the Semantic Bovinator, or Imenu, or etags, for getting this list so all languages supported by any of these tools are automatically supported by ECB too)

てな記述が。そうか TAGS を用意してやればいいのか*1。リアルタイムには反映されなくなるけど、そこはそれ、code browser だし。

んー。明示的に用意したけど、変わらないような…。PHP 対応はなっちゃいねぇってことでファイナルアンサー?

Tags: PHP Emacs Ruby

*1 TAGS を用意していない環境で Semantic の対応していない PHP や Ruby をどうやって解釈していたのかはこの際置いておく。

_ spamlinkcheck.rb を導入

ここ数日あまりに TrackBack spam がひどく、いちいち対処するのが面倒なので spamlinkcheck.rb を入れてみた。やっぱキーワードだの URI だの手で設定していく方法じゃ無理だよな。

さてどうなるだろう。

本日のツッコミ(全2件) [ツッコミを入れる]

_ taku [Perlはsemantic非対応なんですよね。]

_ wtnabe [手元のものは Perl の方が正しく解釈されてますね。標準の perl-mode を使っているんですが。pod の記..]


2007-08-26 [長年日記]

_ またまた家鯖の確認不足に気づく

ここのところ毎日来ていた日本語アダルト系 spam が一切記録されなくなっているので、恐らく効果てきめんなのだろう、と思いながら、あー待てよ、filter の効果かどうか分からないじゃないか、と思っていたら spam フィルタの設定項目の最後に log ファイルを書けることに気づく。

基本的なことを見逃しているなぁ。

で、早速セットしてちょろちょろ作られた log を眺めると逆引きできない IP アドレスからのものを弾いているだけで linkcheck の効果ではなさそうな感じ。あれま。じゃあしばらく置いてみるかと思ったけど、これはかなりの勢いで log が膨らみそうだ。今借りてるサーバの容量ってそんなに余裕あったっけ?と思い、手元のバックアップに対して du -hs を叩いたら余裕余裕。ん? つかこのバックアップ古くね? 6月くらいで止まってるぞ。ぎゃーす。

そそくさと sitecopy と cron と log の確認。なんか sitecopy が自分で作ってる XML ファイルのパースに失敗してる。なんでやねん。つかエラー出てたら報告しろと…。あーこの家鯖の管理者宛メール受信してないよ、おれ。そらぁ分かるわけないよな、はっはっは。ひどい話だorz

ついでに cron の内容を確認してみると せっかく作った crontabwrap を使っていないことが判明orz 職場の機械でしか使っていなかった模様…。あぶないあぶない。仕込んでおこう。ありがとう、半年前のオレ。

でー最初の目的はなんだっけ。あぁそうそう tDiary の spam フィルタの効果ですな。まぁそれは明日のお楽しみということにしておこう。


2007-08-27 [長年日記]

_ linkcheck よく分からず

spam filter の log を1日採ってみたけど、resolv error とか too old とかばかりで、linkcheck.rb が debug() で吐いているようなメッセージは見つからなかった。

まぁいいか。現実に一つも来てないわけだし。TrackBack が全然できないとかいう困った事態であったらそれはそれが発覚したときに考えよう。

_ なんか referer が表示されないな

linkcheck.rb を入れたせいなのかどうかよく分からないけど、編集画面で以前の日記へのリンク元が表示されなくなったな。まぁ以前の分はなくてもいいか? でも今日どういう記事に注目が集まったかとか分からないのはちょっとつまんないな。

しかし filter を追加したからってリンク元が表示されなくなるなんてことあるかなぁ?

Tags: Ruby tDiary

2007-08-28 [長年日記]

_ spamlinkcheck.rb を外した

spamlinkcheck.rb を入れたら

  • TrackBack spam を撃退!
  • referer の記録も撃退!orz

おいおい。なんか前にもこんな初歩的なミスやったなぁ。

あっれー。もしかしてデバッグモードがオンになったままだったのがまずかった? オフにすれば普通に動く?

Tags: Ruby tDiary

_ βloglines

βloglines

ちょこっと試した。

  • デザインはちょっと濃いめの色使いでカッコイイ
    • 全体にモノトーンのテイストなのは Fastladder より断然好み
  • 文字は相変わらず豆粒
  • しかもなんか設定変える場所分からん
  • feed の読み込みや従来と同じ方式である full view で読み進めて行くときの操作感は速い
  • ログインとかちょっとしたところに掛かるフェードの効果がなんかウザイ
  • 気にしてないところに掛かるフェードはかっこいい
    • 読み終えた feed がリストから消えるところとか
  • 3-pane て要るんだろか。でも MUA っぽさが一般の人に受けるかも
  • quick view は item にフォーカスするとフェードが掛かって(!)中身が見えるので操作感悪すぎ
  • iGoogle みたいに特定の feed をログイン後の画面(My Start Page)に直接ドロップして展開しておけるのはかっこいい
    • かっこいいんだけど、どれだけその画面に目をやってるのかなーと思うと微妙

かっこいいのは正義だと思う。

だからと言ってまた戻るかと言われたら今のところ NO だけど。

Tags: Feed Web

2007-08-29 [長年日記]

_ spamlinkcheck.rb 再導入

今度は

  • spamlinkcheck.rb on
  • デバッグモード off

で。

referer が記録されつつ TrackBack spam が来ないかどうかを静観。

[追記] だいじょぶっぽい。デバッグモードが原因か?

Tags: Ruby tDiary

_ Perl のオブジェクトについて最近理解した分のメモ

以前勉強してから情勢(って)が変わってきたものや抜けていた部分のメモ。

  • Perl のオブジェクトは bless したリファレンス
    • 以前はハッシュリファレンスを bless するのが主流だった(と、自分は認識している)が、最近はスカラリファレンスを利用した Inside-Out Object もオシャレなのかも。
    • Class::Std を使うと便利
  • bless で結びつけられた package 名を取得するには以下の方法がある
    • ref
    • Scalar::Util の blessed
  • オブジェクトには実は便利メソッドがある
    • UNIVERSAL 嫁
    • isa() と can() がありゃ十分ちゃ十分か。なるほど。

ref は JavaScript の typeof のように使え、bless してないリファレンスに対して使うと以下の組み込みの型を返す。

  • SCALAR
  • ARRAY
  • HASH
  • CODE
  • REF
  • GLOB
  • LVALUE

package 以外のものが返って来てしまうという意味ではちょっと危険ではあるけど、それはそれとして ref は知っとくと便利だなと思った。Perl は奥が深いよ、ほんと。

PHP の is_a() と method_exists()、Ruby の Object#is_a? と Module#method_defined? に相当するのは、Scalar::Util を使って

defined( blessed( $ref ) ) && $ref->isa( package_name )
defined( blessed( $ref ) ) && $ref->can( method_name )

になるのかな?

今後 Class::Std を使うかどうかは分からない*1けど、自分の目的はレンタルスペースで CGI を動かすことではないし今後もそういうことはないと思うので、便利に使えるシーンがくるかもしれない。押さえておこう。

[2007-09-06 追記]メソッド一覧はやっぱ欲しいなぁと思ったけど UNIVERSAL にはそんな機能はない。Class::Inspector を使うのが楽らしい。Fink にも deb にもパッケージがあるので、まぁそれほど使うのに抵抗はないかな?

Tags: Perl

*1 というか新規に Perl スクリプトは書きたくないし、Class::InsideOut なんてのもあるらしい。


2007-08-30 [長年日記]

_ 最近の愚痴の感じ

PHP は(っていうか Web アプリは、だっけ? もう忘れちゃった)呼び出されたスクリプトのパスがカレントディレクトリになるので相対パスの計算が楽ちんなんだけど、Perl スクリプトを CLI でテストしてると本番動作時のディレクトリとテストコードのディレクトリが違って、相対パスの計算がずれる。

もちろん中で全部 __FILE__ や $0 のフルパスを基準に計算するようにしておけばいいんだけど、昔はそんな知恵なかったし File::Spec も知らなかったんです、ごめんなさい。

それにしても「昔の自分の書いた」「中途半端にレガシー」なコードもタチが悪いなぁ。上のパスの計算のほかにも、なんとなく OO っぽいけど package が分かれてるだけで class として閉じ切ってないとか、依存性を内部に抱えまくってるとか、まだまだ一つのメソッドブロックが長くて処理を追いにくいとか、おかげで、テストがないからテストを書き始めるんだけどうまく書けないとか、いやーあっはっは。*1

はぁ o...rz

まぁ自分が成長したっつーことではあるんだが、自分が成長したからといって過去のコードは自動的に成長しないので、成長したら成長したなりに苦労が増えるというこの不思議。もっと寿命の短いコードを書けばよかったのか!

……。

それを最初から狙うのもなんだかさみしい話だよな。

Tags: PHP Perl

*1 それなりに丁寧に書いてはあるんだけど、シャクに触るというか、基本的に「頑張りすぎ」。頑張りすぎたコードは後から修正するときにもその頑張りを強要することがあるよなぁと最近よく思う。


2007-08-31 [長年日記]

_ Signature Editor -> Signature Switch 変更

Signature Switch :: Thunderbird Add-ons

以前から

Signature Editor 1.1 リリース - えむもじら

で触れられているように気にはなっていたんだけどなんとなくスルーしていたライセンスの問題もあり、署名編集用の extension を乗り換えた。

署名の編集なんかめったにしないのでそもそも extension 要らねんじゃね?という気もしないでもなかったのだが、やはり署名ファイルをいちいち探してエディタで開くのはいやだなと思って入れていた。が、今回久しぶりに署名の編集を行う機会があり、実際に使ったら使いにくかったので乗り換えてしまった。

決定的だったのは、Signature Editor の編集画面は等幅フォントじゃないこと。プレーンテキストメールしか出さない自分の場合、

編集画面と実際の署名で見た目が違う

という致命的な問題を抱えていたのだ。いい加減どうにかしようと思い、ちゃんと調べたら Signature Switch が外部エディタを呼び出せるので、そのパスを

/Applications/CotEditor/CotEditor.app/Contents/MacOS/CotEditor

にして、CotEditor 上で等幅フォントで編集したらものすごく使いやすかったのでこれにした次第。実際には Switch する機能は必要ないので、単に外部エディタを呼び出す機能がありゃよかったんだけど、そこはそれ。

ただまぁ、これもライセンス分からないんだよなぁ…。

中を開くと ja locale のファイルもあるんだけど、install.rdf で無効化されてますな。なんでだろ。まぁいいか。