webtechの最近のブログ記事
正規表現のテストがIDE(統合開発環境)下で出来ると言う事を知り、EclipseとEPIC(Perl言語用プラグイン)に興味を持った。導入しようとしていたCVSとの相性も良さそうだ。
私のゴミスクリプト群製作の一連の作業の中で一番時間を消費しているのが正規表現のテストだ。スクリプトをテスト用に切った貼ったしたり、全部流さずにテストできるだけでも恩恵は大きい。Eclipseに移行したら、過去の力技正規表現のうち、可能なものはTemplate Toolkitを使うように変更したい。
作業用PCがWindows XPなので、普段はActive Perlをテスト用に使っている。Active PerlのPPMだと入らないモジュールがあるので、Cygwin環境のPerlを使うようにしようと思い、CPANから足りないモジュールをインストールしようとしたが、ちょっとハマってしまった。何をインストールするにしても、XML::DOMのテストでシケる。調べてみるとdevelに含まれるExpatが無いせいだったので、devel下のパッケージを全てインスコした。しょうも無い事だが結構ロスしてしまった。(泣)
CygwinにCVSをインスコし、inetdをWindowsのサービスとして動くように設定。CygwinApacheの動作確認をした所で本日はおしまい。まだEclipseのインスコまで行っていない。w
まだ日本に「パソコン」という言葉がなかった頃、それは英語を使う国で"Personal Computer"と呼ばれていた。当時の日本にはヲタクという言葉もなく、コンピュータ好きはPCの事を「パーコン」と呼んでいた。当時私は10代の学生で、パーコンは高くてとても手が届かなかった。
自分で稼いだお金で初めて買ったPCが富士通のFM-11AD2+。CPUはMotorolaの6809、クロックは2MHz、メインメモリは256KBだった。OSはMicrowareのOS/9(Macじゃないよ)で、Microware純正のCコンパイラが16万円もしたので、もっぱらアセンブラ(機械語)で必要なソフトを自分で書いていた。
そうこうしているうちに、日本でもパソコン通信ができるようになり、パブリックドメインソフトウェア(PDS、今のフリーソフト)を作ったり、貰ったりしてPC環境を整えるのがずいぶん楽になった。18年位前の話だ。
現在はどうだろう。欲しい機能を実現するソフトはまず間違いなくパッケージとして売られていたり、私なんかよりもずっと優れた誰かがネット上に公開してくれていたりする。凄くありがたい事だと思う。
さて、開発環境はどうか。元来ソフトウェアの製造は土木工事と似ている部分があって(今でも変らない業種もあると思う)、大雑把な経験値で作業員を分類し、まず人月ありきの世界で、元請下請孫請といったレイヤー構造までそっくりだった。ファンクションポイント法すら普及していなくて、ウオーターフォールモデルを使ってプロジェクトのワークロード管理をしていたのが懐かしい。優れたプログラマも、そこそこのプログラマも同等の経験の持ち主なら一ヶ月分の作業は一人月で同額なのだ。
現在の開発はどうだろう。OO化も定着し、更に強力な開発支援ツールが整備され、優れたプログラマと、そこそこのプログラマの差は開く一方ではないかと思う。なぜなら、優れた方なら、ツールや既存のリソースを使ってどんどん自分のパフォーマンスにレバレッジを効かせられるからだ。
最近、「えっ!これを一人で作ったの?」(コードの行数ではなくて)というような優れたソフトを目にする事が多い。これは、プログラマ一人でカバーできる範囲が昔よりも拡張され、いいアイデアさえ浮かべば、ちゃっちゃと一人で組み上げてしまえる環境になってきているのだと思う。
先週末にスクリプトを作ってみようと思っていたら、既にネット上に存在していた。matsui氏の2chJpgGetterというスクリプトだ。
2chJpgGetter.plは、2ちゃんねるに貼ってあるjpg画像へのリンクを まとめてダウンロードするためのツール(Perlスクリプト)です。
XP上のCygwin環境で、某板を対象にこのスクリプトを走らせると、4時間程度かかって数千枚(300MB程度)の画像がダウンロードできた。中身は玉石混合で、世の中いい人ばかりではないのが良く理解できた。(泣)もう「おなか一杯」といった感じだ。
さて、これで終わらせると、自称Perl Manglerの名がすたる。スキルアップの為、このスクリプトを題材にして、いろいろ勉強してみたい。
まず、差分取得対応。既読情報を保管し、次回起動時に新着レスのみを読み込み、画像をGetする。Cronに登録できるようにしたい。多分wgetだとHEADを投げられないと思われるので、LWP::UserAgentに書き換えよう。
次に、画像ファイル名の衝突対策。1.jpgとか2.jpgという画像ファイルが無数に存在する。このような場合に上書きしないで、別名で保管できるような仕掛けを考えたい。
ついでに、マルチスレッド化。forkで子プロセスを生成する実装を別スレッドを起こすように変更してみる。これは何のご利益も無い可能性があるが、勉強の為に挑戦してみたい。
どうせ勉強するならOO化もやってみよう。スレ処理部分はmainに残し、画像Get部分をクラスパッケージ化してみる。これも何のご利益も無いけど、勉強になると思う。
と言う事で備忘録はここまで。今月のお題(捨てスクリプト数件)が未完成なので、来月のお題です。完成したら公開します。
某サイトからiswebにミラーする為に、必要なファイルを某側からNet::FTPでputしているのだが、4096バイトで切れてしまう。今日某サイトに追加したRSSファイルが6KBほどあったので発覚した。
わざわざbinaryモードにしてみたりpassiveモードにしてみたりと試行錯誤してみたが、全然解決しない。put元、put先を別のサーバに変えてみても4096バイトで切れるので、Net::FTPが原因くさい。もちろん、普通にftpクライアントでputするとOKである。まいった。
CPANの新しそうなDoc
Debug=>1で様子を見ると、わざわざ実際のファイルサイズより小さい値でallocを送っている。alloc自体は相手によっては旨く使ってもらえる可能性があるので無駄ではないだろうが、ファイルサイズをきっちり認識してくれてないのが問題のようだ。
Net::FTP=GLOB(0x1b4c7d0)>>> ALLO 434 Net::FTP=GLOB(0x1b4c7d0)<<< 202 No storage allocation necessary. Net::FTP=GLOB(0x1b4c7d0)>>> PORT 192,168,0,2,11,90 Net::FTP=GLOB(0x1b4c7d0)<<< 200 PORT command successful Net::FTP=GLOB(0x1b4c7d0)>>> STOR hoge.html Net::FTP=GLOB(0x1b4c7d0)<<< 150 Opening BINARY mode data connection for hoge.html Net::FTP=GLOB(0x1b4c7d0)<<< 226 Transfer complete. Net::FTP=GLOB(0x1b4c7d0)>>> ALLO 4096 ←何で4096なんだ? Net::FTP=GLOB(0x1b4c7d0)<<< 202 No storage allocation necessary. Net::FTP=GLOB(0x1b4c7d0)>>> PORT 192,168,0,2,11,91 Net::FTP=GLOB(0x1b4c7d0)<<< 200 PORT command successful Net::FTP=GLOB(0x1b4c7d0)>>> STOR hoge.xml Net::FTP=GLOB(0x1b4c7d0)<<< 150 Opening BINARY mode data connection for hoge.xml Net::FTP=GLOB(0x1b4c7d0)<<< 226 Transfer complete.
一服して、他に色々なサイズのファイルを作ってテストすると、完璧に動作する。バッファリング関係だと思って調べると、作ったファイルを閉じ忘れて、そのまま転送しようとしていた。ちゃんちゃん。(恥)
週末にほぼ完成したスクリプトを仕上げた。他サイトに順番にアクセスするので、その分、応答に時間がかかる。また、表示を欲張り過ぎて、ブラウザ側の処理にも時間が掛かっているようだった。次の週末にする予定だった、表示部分と巡回部分の分離と表示データ量の調整を行った。巡回部分をCronで回すようにしたので、排他制御をしなくてもいいし、これからのテストも楽になりそうだ。
他所のサイトの飾り用にPerlで自動巡回スクリプトを作成した。複数の場所に分散しているウェブ上の更新情報を一箇所に集めて表示するだけなのだが、データ構造で悩んだ。
結局、キーとなる項目と、その他の項目(ハッシュ)へのリファレンスから構成されるハッシュを作ってすっきりした。無名ハッシュのリファレンスを持っているハッシュを作ったのは初めてだったので、最初はどう参照していいのか悩んだ。キャッシュ化する際にそのハッシュを丸ごとData::Dumperで吐き出せば、目で確認できるキャッシュができるし、読み込みも楽だろう。
次の目標は巡回部分と表示部分の完全分離だ。巡回プロセスをcgiから起動するのはアレなので、Cronに登録できるようにしたい。その次の目標は更新履歴の蓄積と表示である。
BBQで、ちと飲みすぎ。胃が変。ともかく、MTのフォントの件、現状の表示が正しいようだ。(恥)旧鯖の方のフォント指定が反映されていなかったということか。あー恥ずかしい。
font-family:"Osaka", "MS Pゴシック", trebuchet ms, trebuchet, verdana, arial, sans-serif;
さて、次はXoopsにMTを埋め込む=「MTにXoopsの薄皮を被せる」を進めてみようと思う。Xoops自体のトラックバック対応がV2.1で予定されており、MTからXoops内のコンテンツにリンクを引き込むのが簡単になることが予想される。ヒントはXoops公式フォーラムにあった。
ちょっとMovableTypeをXOOPSに簡易的に取り込む作業をやってみました。既にMTでブログを蓄積されている場合は便利かもしれません。
MTにXoopsの皮を被せる事ができればそれに越したことは無い。MTはStaticなページをCGIで予め生成する方式なので、Xoopsには馴染まないが、せめてテンプレートとスタイルシートと再構築をXoopsに管理させて、見かけ上統合化するうまい方法はないものか。
Movable Typeのデザインが違って見えるのは、フォントが変わったからで、漢字コードは関係ない。なぜフォントが変わったかというと、恐らくスタイルシートのfont-familyが正しく認識されていないからだと思われる。スタイルシートそのものの漢字コードを変えてみたり、スタイルシートの供給元からコピーして、管理ツールの編集フィールドにペーストして保存、再構築しても全く変化がない。
昼休みに会社から自鯖にドメイン名でアクセスすると未だに旧鯖につながる。昨夜から自宅では新鯖につながるようになっていた。会社はSingnet、自宅はMaxOnlineである。このタイムラグはDNSのキャッシュの有効期限の差なのだろうか。ログを見てみると、ドメイン名で旧鯖(独自IP)に来る人は私を含めて数人で、もうほとんどのネットワークで新鯖向けにポイントするように切り替わっていると思われる。最悪96時間(4日)という話は本当かも知れない。
ということで、会社から新鯖に(鯖の本名~私のIDというありがちなURL)アクセスしてみた。MTの文書が置いてる/blogディレクトリは旧鯖からコピーし、自宅から新鯖側のみを更新している。会社から新鯖にアクセスすると新鯖のhtmlファイルが読み込まれる。テンプレート上のスタイルシートの場所がドメイン名を使ったURLで指定されているため、会社からだと、スタイルシートは旧鯖に読みに行くことになる。テンプレートで使われている画像も旧鯖に読みに行こうとするため、旧鯖は別ホストからの画像直リンと判断し、画像を転送しない。なかなか面白い。
会社から旧鯖にアクセスすると当然、フォントはOKである。Windowsマシンでftpなんかせずに、tarで固めて直接転送展開できれば良かったのだが、新鯖にはシェルアクセスはないので展開が出来ない。まぁ文字化けで読めないわけではないので、今日はここまで。
ちょっと気分転換のつもりで鯖の引越しをした。まだDNSの情報が完全に伝播していないようだが、約半日で何とか公開している分は見えるようにできた、と思う。
Xoopsはほとんど頭を使わずに移行が出来たが、Movable Typeには悩まされた。
旧鯖では日本語をUTF-8で出力するように設定していた。旧鯖でmysqldumpでデータベースの中身を抽出して、そのまま新鯖にUTF-8のまま流し込もうとしたが、どうしてもうまく行かない。
仕方が無いのでコードをEUCに変換して、新鯖のデータベースに放り込んだ。データはOKとなった。
続いてMT本体の変更をしないといけない。2.661の完全版を落としてきてEUC用のパッチを当てなおす。そして変更のあるファイルだけをピンポイントで鯖にアップした。設定ファイルやスタイルシートを手で修正し、ja.pmをEUC用に入れ替えて再構築。
力が抜けてしまったのは、デザインが全く違ったものになっていたからである。フォントも違うし、文字間のスペーシングも違う。間が抜けてしまった感じで、一番苦労をしたところでマイナスの成果になってしまった。
Xoops側もユーザーには分かりにくいが細かい問題を残している。メインサイトの言語とテーマの選択が不可能なのだ。非公開のサブサイトの方は大丈夫なので、パーミッションを見直した後に、コード類をサブサイトから上書きしてみようと思う。
近日中に箱庭禁止のサーバーに引っ越しますので、モジュールを削除します。
2004年1月10日追記: Xoopsの箱庭モジュールを入れましたのでPerl版は削除します。
