2009年01月09日

●ノートPCを買う / ジャンク魂

家にあるパナソニックのCF-02なるノートPCは、今はもうどこも作っていないトラックボールを搭載したB5ノートで、かなり使い勝手が良くて気に入っていた。
しかし如何せん古く、CPUがCeleron 300MHzということで今時余りにも遅すぎる。このノートPCよりも私の持っているPHSのCPUの方が早いくらいでもうすっかり時代に取り残されている。
ということで、特にノートPCを使うような状況もないので、トラックパッド嫌いの私としては、どうせ買うならトラックポイントなThinkpadと思いつつも、特に今まで買うこともなくすごしてきたのだが、お正月についつい勢いでThinkpadがまだIBMの時代のX40なるB5の薄型ノートを買ってしまった。B5のTinkpadの上に英語キーボードだったので我慢できなかったのだ。

買ったのは中古で、なんかやたらと安くて、何か裏があると不安に思いつつ買ったのだが、買ってからなぜ市場価格が安いのかが理解できた。
このPCのHDDは3.3V駆動の1.8インチなる特殊な規格の日立のHDDのを利用しており、これは当時は普及すると思われたものの、現在は全く製造されていないらしく、それが市場価値を下げている原因であるようだ。
つまり、HDDが壊れればもう新品は流通在庫しか手に入らない。
しかもそれらは殆どプレミア価格のようなもので、私が買った本体価格よりも高いのである。

買ってしばらくは「あちゃー勢いでえらいもん買ってしまったなー」と思っていたのだが、調べれば調べるほど改造しがいのある素材と言うことがわかってきた。
問題の特殊規格のHDDに関する問題も、さすがにネット上の先人たちが色々な道を切り開いており、HDDの代わりにCFを使ったり、Flash SSDを使ったり、ZIFコネクタの1.8インチHDDに変換ソケットを経由させて動作させたりとHDDを規格外のもので動作させる道もあるようである。
「ついカッとなってやってしまったが、今は全く後悔していない」と言ったところであろうか。

とりあえず今のところはボトルネックであると評判のHDDの遅さも全く気にならず、容量不足でもないので、HDDを交換する必要性は全く無いのだが、こういった、ハード改造の楽しげなレポートを読んでいると、意味も無く改造したくなる気持ちがムラムラと湧き上がってくるのであった。

2008年12月27日

●この日もカシャカシャカシャ(キーボードを洗った)

うちでメインに使ってるキーボードは時々画像で登場するSUNのTYPE6キーボードなのだが、サブのキーボードである昔から使っているHappy Hacking Keyboard Lite2が異様に汚れていたので、キートップとガワを全てはずして、基盤部分を除いて全ての部品を洗剤とお湯で丸洗いした。
washedkey.jpg流し台でバラバラになったキートップに洗剤とお湯を振り掛けてカシャカシャカシャ、アライグマのように洗いまくる。
ひとしきり洗えばとりあえず洗剤を洗い流した後、洗面器に溜めたお湯の中で完全に洗剤を落とすべく再びカシャカシャカシャ。
気が済めばザルにあけてファンヒータの前でカシャカシャゆすって乾燥させる。
洗う前に組み立てるときの参考にするためにデジカメで写真を撮っておいたのだが、洗い終わる前と比べて見るとびっくりするほど綺麗になっていた。洗う前の画像も乗せようと思ったけど、余りに汚かったので自粛しておく。
組み立て時にキーの稼動部にシリコングリスでも塗ろうかと思ったけど、埃を吸いそうなのでやめておいた。
しかし、組み立て後は見違えるほどにキータッチが軽快になっていた。見た目もキータッチも新品同様である。
ということで、皆様も大掃除の一環として、ぜひともキーボードを洗ってみましょう。

suntype6us.jpgこの勢いでメインのSUNのType6も洗おうかと思ったけど、やたらと何に使うのかよくわからないキーがー多いこともあり、組み立て時の苦労を考えてやめておいた。ちょっと前に買ったばっかりでまだまだ綺麗やしね…

2008年10月01日

●FONと「共有」の考え方

二年ほど前に、スペインのベンチャーがgoogleやskypeなどの出資を受けて無線LANを利用してインターネット回線を共有するシステムである、FONなるサービスが日本でもサービスインしていたけど、今更ながらにこのFONのシステムを利用するための「FON La Fonera」なる無線ルーターを買った。

この無線ルーターを家の回線に接続する事で、自分のインターネット接続回線を他のFON会員にパブリックな公衆無線LANして提供し、その代わりに自分も市中にあるFONのアクセスポイントを利用出来るようになる。
街中に遊びに行ったりすれば、無線LAN端末でタダでFONのアクセスポイントが利用できるわけである。

この無線ルーターはそのFONアクセスポイントしてのパブリックなアクセスポイントだけでなく家庭内専用のプライベートなアクセスポイントとしても利用できる。当然、接続して来たFON会員から家庭内のネットワークは完全に遮断されているのでセキュリティ的にも安心である。

いわゆる一般的な「無線ブロードバンドルーター」にFONアクセスポイント機能をつけたといった感じである。

この無線LANルーターの扱うネットワークは、WAN側(有線)、プライベート側(無線)、パブリック側(無線)とそれぞれ別のセグメントとして構成された3つのネットワークインターフェイスであり、無線アクセスポイント内にインストールされているファイアーウォールによって、パブリックなセグメントからWANのセグメント、パブリックなセグメントからプライベートなセグメントはドロップされている。
パブリックなセグメントからはWANセグメントのゲートウェイから外のインターネット回線にしか、パケットは転送されない構成である。

私がこの機器を買ったのは、1980円の激安という事もあったけど、何よりもこの無線ルーター自体がオープンソースのソフトウェア群で構成されたLinuxノードであると言う事である。言い換えれば、いくらでもカスタマイズできると言う事である。

本来ならWEBインターフェイスしかないところを、スクリプトインジェクションの手法でコマンドが混入されたポストデーターを送りつけてsshのポートをバックドアとしてこじ開ければ、ログインして好きなようにカスタマイズできる。典型的なハッカーやクラッカーがどこぞのサイトに進入して乗っ取る手法と同じである。
一旦ログインの方法さえ手に入れば、ファームウェア(Linuxカーネル)の書き換えさえ可能になるという中々楽しい仕様であり、ネット上にはそういった情報が満載である。これはおもろいなぁ。

オープンソース、フリーソフトウェアの考え方は、技術やテクノロジーはみんなの共有物であり広く開放されて広く使われるるべきであるという「共有」の考え方に基づいている。
色々な技術やテクノロジーや情報が様々な別の技術のの叩き台にされるのは勿論の事、そんな技術的な事に興味が無かった人までが使うようになると、今まで考え付かなかった方向や対象にその技術や情報が拡大されることも多い。
結局それは、それに関わった皆の幸せにつながる事となるし、今までの価値である金儲けの為の技術ではなく、技術による可能性とか利便性に価値を置いた視点であろう。
この流れは後に歴史的な大きな思想の流れの一つとして捉えられるほどの威力と魅力を持っているのではないかと個人的に思う。

そして、このFONなるインターネット回線の共有の考え方もその「共有」の考え方に基づいているのやろうし、こういったサービスにインターネットを使って貰えて何ぼのgoogleやskypeが出資する意図も大変良く理解できる。
今となっては生活のインフラともいえるようなインターネット接続環境をより当たり前のものにするためにもFONの考え方は面白いし支援したい。

当然そういったインフラにただ乗りする人、「共有」物」を消費するだけの人はたくさん出てくるだろう。
濡れ手に粟な価値観を至上とし、自ら種を蒔く事無く実だけを刈り取ろうとし、何も生み出さず何も表現せずに公共物を消費だけする輩の多さにはもううんざりであるけど、結局彼らは積極的に害を成さないだけまだましである。と思うしかない。

このFONなるシステムは「FONシステム」としての考え方としても、「FON無線ルーター」の作りとしても興味深い。
思想だけ魅力があってもただそれだけやし、実際それと関わるモノ自体の魅力もとても大事であろう。
訳のわからんとても関わりたくないような胡散臭い奴が、いくらそれらしい思想を語っても、その思想が冒涜されているようにしか見えんし、その思想を良く知らない人は逆に避けてしまうのと同じであろうか。

FONシステムの考え方が面白いのは当然として、FONの無線ルーターの作りを、誰でもが簡単に使えるインターフェイスにしておくの同時に、私のようなコンピューターオタの欲望に訴えかけるような仕様にしておくのも戦略の一つやなぁと思った。

参考サイト :
FON
FrontPage - FoNまとめwiki

2008年08月24日

●野蛮で魔法で戦国なコンピューター世界

家にインターネット環境が無い「IT弱者」ともいうべき人が、光回線を敷いて一気に「回線速度富豪」に躍り出るのは「インフラ下克上」とでも言うべきだろうか。

「コンピューターが日常生活に不可欠な時代になり、むしろ魔法の世界に逆戻りしたのではないか?」と言っていたのは、アラン・ケイかジェフリー・ディーヴァだったような気がする。
確かにコンピューターとネットワークを使うことで、今までとても時間がかかっていたことが一瞬で出来るになったり、今まで不可能だったことが可能になったりした。
ごく普通のユーザーからすれば、黒い画面のUNIXのシェルでコマンド操作している姿は呪文を唱えているように見えるらしいし、リモートから大量の端末に対して、ファイルをコピーしたり、ソフトをインストールしたり、はたまた動作原理の全くわからないシステムを構築したりする様は魔法のように見えるものだ。

コンピューター世界の中は魔法の世界だったり戦国時代だったりとなかなか野蛮でエキサイティングである。
「個体発生は系統発生を繰り返す」って言うけど、コンピューターの世界もまだまだ発展途上なんだなぁと最近よく思う。
深く入れば入るほど、コンピューターの世界の中でも、ほぼ近代化が終わったところもあれば、まだ中世のようなことをやっているところもあるなぁと思う。

2008年08月23日

●dogu.no-ip.org レンタルサーバーに移転

お試しに借りていたレンタルサーバーのスペースでメールもWEBも正常動作すると言う事で、とうとうお試し版から有料版に切り替えた。でもってメールサーバーだけでなく、dogu.no-ip.orgのwebサーバーもこちらに移転。
そういうことで、なんかブログの動作がおかしかったり、突っ込みどころがあれば教えてください。

私の借りているレンタルサーバーはシェルも使えるし、メールもFTPも仮想アカウント発行できるし、cronも使えるし、mysqlやpostgresqlどころかImageMagicまで入ってる。
どうしても無いバイナリがあれば、シェル使える上にgccも入ってるのでコンパイルすれば良いだけの話やし(一応したらあかんけど…)
唯一不満があるとすれば、メールでincludeが使えない事だけど、まぁこれは我慢できる。

ハード的な環境が大幅にアップしたのでとても動作が速いのが良い感じ。
目の前にあるサーバーよりも遠くにあるレンタルサーバーの方が動作が速い分、早くアクセスできると言うのは不思議と言えば不思議な感覚である。
インターネットが「距離」の感覚を変えたっていうのを再認識した。って何を今更…

サーバーダウンに怯えた日々よさようなら。ブログのエントリデータ消失のリスクが軽減されたのがなんとも良い感じ。
サーバーダウンを気にせず、気軽に自宅サーバーの再起動をしたり色んな物を入れてみたり出来るのがこんなに快適とは。

ファイルサーバーとドメインコントローラーさせるためにやっぱりSAMBAなお家サーバーは必要なような感じなのだが、でかくて重くて熱くてやかましい土偶家にあるサーバーのSun Netra t1 Model 105を引退させて、もう少しちっこくて静かなものに換えようと考えている。
今一番の候補は「玄箱」なのやけど、どうせサーバーを作るならSolaris、百歩譲ってNetBSDというこだわりがあり、SolarisもNetBSDも動かないハードを導入するのに躊躇している。
んんーお家サーバーの機器選定は難しい…省電力FAN無しパソコンにsolaris入れるのが一番無難かな。

2008年08月22日

●オライリーの表紙は可愛い

仕事でちょっとした待ち時間が出来たので、コンピュータ書籍でおなじみのオライリーのカタログを読んでいた。

オライリーの本ってのは、『詳解 Javaプログラミング 』などのメジャーなところから、『Solarisデバイスドライバ 』(本読んで書くつもりか?)や『入門 Kornシェル 』(あえてそこに入門するか?)などといったマニアックだったりニッチだったりするところまでカバーする、この業界では中々有名で評価の高い本屋さんである。

で、そのオライリーは「ラクダ本 」とか「バッタ本 」とかいって表紙の動物で本を呼んだりするくらいに、やたらとリアルな動物の表紙であるのがほとんどなのやけど、その動物の表紙がやたらとリアルで気持ち悪かったり、ちょっとクスッとしたりと言うのが結構ある。

やたらとリアルな クモ とかムカデ とか蛾の幼虫 の表紙の本ってのは嫌がる人はとことん嫌がりそうなので、それだけでも貴重である。

amazon ASIN:4873110130 しかしながらこの日にカタログで見つけた『C/C++による組み込みシステムプログラミング』はちょっとびっくりである。

これって「ツツガムシ」でないか?
もし違ってもダニである事は間違いないやろう。
これを「組み込みプログラミング」の表紙にするとはとんだアメリカンジョークである。

Pythonが蛇だったり 、『 WEBMASTER クイックリファレンス』が蜘蛛 だったり、ってのは「そのままやんけ!」だが、
IPv6 エッセンシャルズ 』の表紙がカタツムリで「えらい遅いIPV6やな…」
詳説イーサネット 』がタコで「タコ足配線?」
802.11無線ネットワーク管理 』が蝙蝠で「確かに無線…」
Win32/C++ マルチスレッドプログラミング詳説 』がカツオノエボシで「そんなに危険か?」
って感じにちょっとクスッとすることもある。

しかし、冒頭で紹介した『Solarisデバイスドライバ 』とか『初めてのFlash Video 』の表紙って何の生き物や?

クマムシの「ダウンしないサーバー構築」とかプラナリアの「マルチキャストネットワーキング」とか実際にあったら如何にも良い感じでない?

ちょっとネタに走って、忍者が表紙の「ロードバランシングテクニック」、鈴木宗雄が表紙で「実践システムログ管理」とかやってもよいではないか、よいではないか。

2008年08月21日

●土偶お天気サービス開始

レンタルサーバーのお試し版で丸一日お天気メールとメールサーバーを運用してみたが、ちゃんと設定した通りに動作する事が確認された。
現在は直接の友人に配信する為の「一言」であまりにも内輪ネタ過ぎるので、これを著名人の名言やとかそれらしいのを読み込むバージョンも作ればいいかもしれんね。

とりあえず、ブログのトップに出る言葉をランダム表示にしてみてこんな感じで良いかもしんない。
こう言うなんを配信すれば問題なかろう。

ということで専用サイト、tenki.dogustat.com の開始である。

2008年08月20日

●レンタルサーバーでメールサーバー運用

プロバイダを変えてから、自宅サーバーで運用していたメールサーバーがドコモやAU宛に送信する時に接続を拒否されるようになった。という事を以前に書いた。
本来ならプロバイダのSMTPを経由して送信するのがスジなんやろうけど、私が利用しているプロバイダはプロバイダのメールの利用がオプションだったので申し込まなかった。
プロバイダのSMTPが使えないので、普段メインで使っているgmaiのSMTPを経由するようにすると、どうもfromヘッダとは別に、senderヘッダにgmailの実アドレスが記載されてしまうようだ。

スパムっぽいメールに対するエラーメールにもこのsenderヘッダつきで送信するのは激しく微妙なので、携帯電話宛にメールを送信する必要がある場合のメールは新しく取ったドメインと、レンタルサーバーのお試し版で運用してみた。
このレンタルサーバーはcronも設定できるので、自宅で運用していたお天気メールを試しにこのサーバーから配信してみたが、ドコモ宛でもAU宛でもとりあえずちゃんと動作する。

お試し期間が終わって、有料で借りるとなれば年240円、月にすれば200円換算である。
メールサーバーもちゃんと動くし、Cronも使えるし、家の自宅サーバーより遥かに早いし、お試し期間中に動作確認して、ちゃんと動くようであれば有料で借りる事になるだろう。

ということで、この月200円を稼ぐために、このお天気メールを有料化しようかなと考え中である。
もちろん今利用しているユーザーは無料やけど、月に幾らか払ってくれても大歓迎やよ。
直渡しも可、イーバンクも新生銀行も口座持ってるので、払い込み手数料もただですえ?どう?

好きな曜日の好きな時間に何通でも、YAHOO天気予報が対応している地域なら何処の地方のお天気でもメール送りますえ?
送信時毎に変わる「一言」つきやで?どう?

2008年08月06日

●ある世界での臨死

やっとのことで、生き残っていた旧世代のOSを全部入れ替えた。教室二つで作業時間は二時間半である。
我ながらなんと段取りのいい事か。と思う。
これで「特殊用途」でない通常利用の端末全ての足並みが揃った。

それに伴い、初夏の頃に、突然のひらめきと思いつきから「夏休みの宿題」として自分に課していたサーバーの構築が本日をもって終了した。
私の管轄する全てのクライアントを統べるべく開始させたサービスも、順調に動き始めている。
懸念事項の一つであったセキュリティ的な問題もこれでとても大きな進展を得た。
大きな気がかりだった事が一つ解消され、回る物と回らせるものと回り続ける所、やっと全ての環境が揃った。
地味ではあるけど、これは悲願であった。私にとっての一つの到達点である。

今まで私が介入する事で回っていた世界は、これからは私の介入無しに自立的に回り始めるだろう。
私がいなくなったこの世界が、より素晴らしい秩序を持った世界に取って代わられるまで、自己修復と自己超克と自己防衛を自立的に繰り返しながら存在し続ける可能性を持ったと思えばとても嬉しい。

あまりにもひっそりとした世界の完成は世界の終わりにとても似ている。
私がいなくなった後の世界の事を考え、そのための準備をするのは、何かしら死の準備に似ている。
わかりやすい自己存在のの意味でもって自身と世界の関わりを計り、そしてその価値を他に分け与える事で自身の存在の意味を世界から剥奪する。
私が死んだ後も世界から何も失われないように。

この世界の完成、あるいはこの世界の終わりによって、私の存在はこの世界での価値を失う。そしてそれはこの世界での私の死でもある。
今までの私が死んだ今、私はこの世界と今までとは違う関わり方で関わる事にならざるをえないだろう。それがどんな関わり方かは想像はつかないけど。


と、コンピュータを世界に例えるのはとてもたやすい。
世の中の複雑さと不条理さに比べれば、コンピューターの世界の秩序など何と理解しやすい事か。
世の中で頻繁に起こるトラブルや災難に比べれば、コンピューター世界での危機回避や問題解決が何と容易く迅速に行われる事か。
全ては原因と結果、一つの目標とそれに到達する幾つもの道が存在するだけ。全ては論理の世界である。
往々にして陥りやすいコンピューター世界での全能感の根がそこにある。

それでも、依然として、コンピューターが一つの世界である事は間違いない。と私は思う。
そしてコンピューター世界での経験を現実に活かせない人間こそ、コンピューター世界を貶めるものであると思う。

まぁ、コンピューターの世界に限った事では無いやろうけどね。

2008年08月01日

●新プロバイダ

この日からネット環境の回線業者が変わり、新しいプロバイダになった。
自宅サーバーのダウンタイムは約半日。上出来と言えば上出来かも知れない。

自宅土偶サーバーではどこぞのお天気情報ページからダウンロードして整形したお天気情報を、自宅サーバーから友人充てに配信するサービスを行っているのだが、今までのプロバイダでは「Outbound Port25 Blocking」対策として、プロバイダの用意するSTMPサーバーをリレーする事で、遅延するながらもとりあえずは配信出来ていた。

新しいプロバイダになって「Outbound Port25 Blocking」の制限が無くなり、土偶サーバーから直接メールを配信する事が出来るようになったのやけど、今度は逆に土偶サーバーからドコモのメールサーバーへの接続だけが拒否されるようになった。

現在のプロバイダにも当然SMTPサーバーがあるのやけど、メールの利用は有料オプションだったので、gmailを使用している私は申し込まなかった。
ということで適当なSTMPリレーサーバーが見つからずドコモ充てのメールのみ配信出来ない。という状況になっていた。

最近、ドメインを取った時にWEBとメールのレンタルサーバーのお試し無料版のようなものを借りてみたのやけど、自宅のnetraよりも遥かに早いしIPアドレスも固定やし、自宅サーバーで一番ネックになるメール送信でトラブルもなさそうで、とても快適であった。
自宅サーバーは電気代もかかるしやかましいし暑いしドコモにメール送られへんし、レンタルサーバーでも借りるかなーと最近思っている。

でも私がsolarisやらunixライクシステムやらに詳しくなったのは自宅サーバーを運用しているおかげである。
そう考えると…自宅サーバーを運用しつつ、レンタルサーバーも借りると。それが良いような気がしてきた。

2008年07月09日

●本末転倒

スパムは来なくなったけど、個別エントリーページの「投稿」ボタンを動作確認の為にコメントアウトしただけのまま実運していた。
ってソースを見れば投稿ボタンありありやん。動作確認後に消すのを忘れていた…

Aをするために忘れないようにBしたまではよかったのだが、Bした時点で満足してすっかり本来のAと言う目的を忘れていた。ってコンピューター触っていると良くありがちはパターンやね。
何かを調べるために検索していたはずが、検索自体が面白くて何を調べるのか忘れていたりとか。

ということでコメントアウトしていたフォームの項目目掛けてスパムコメントを食らったので、コメントアウトしていたものをソースから削除した。ってこれ書いてるのは7月13日なのだが…

2008年07月08日

●人に優しくスパムに厳しく

コメント欄にあったcaptchaが激しく読みにくくてコメントが投稿できないという人が結構多かったので、captchaの入力なしで投稿できるようにした。
とは言っても、ただデフォルト状態に戻してなんでも受け入れるようにするコメントスパムの餌食になるだけなので、ネットをさまよって情報を集め、人間には優しいけどスパマーには厳しいような仕様にしてみた。
コメントいただける人には負担が無く、それでいてある程度のセキュリティーは保つというコンセプトである。ついでなのでコメントだけでなくトラックバックのCaptchaも廃止。

対策としては
1.コメント/トラックバックスクリプトのリネーム
2.コメント/トラックバックスクリプトへのGETメソッドの拒否
3.コメントフォームにhiddenなコードを埋め込んで追加時に送信して照合される機能を実装したSbcodeプラグインの導入
4.コメントはエントリーページから一旦確認ボタンを押した後にしか投稿できないように。
5.静的ページに見えるようなトラックバックURL
の5つであるけど、さすがにこれだけやると今のところスパムは一件も来ていない。
それにコメントとトラックバックのスクリプト自体を叩かれる事が無くなったのでネットワーク的にも負荷が減って良い感じである。

ということで、トラックバックとコメントをじゃんじゃんお待ちしております。

以下MovableType3.32-jaでの設定を書いてみる。

1.コメント/トラックバックスクリプトのリネーム
適当な拡張子の適当なファイル名に変更した後、
.htaccess なりhttpd.confで
AddType application/x-httpd-cgi .拡張子
としてリネームしたスクリプトをCGIとして動作させる。
さらに、
mt-config.cgi に


TrackbackScript スクリプト名.拡張子
CommentScript スクリプト名.拡張子

とMovableTypeにスクリプト名を教えてやる。

2.コメント/トラックバックスクリプトへのGETメソッドの拒否
これも.htaccess なりhttpd.confで


<Files ~ "\.拡張子$">
 <Limit GET>
  Order Deny,Allow
  Deny from All
 </limit>
</Files>

とする。

3.コメントフォームにhiddenなコードを埋め込んで追加時に送信して照合される機能を実装したSbcodeプラグインの導入
http://www.antimon2.atnifty.com/2007/02/sbcode.htmlのとおりに設置

4.コメントはエントリーページから一旦確認ボタンを押した後にしか投稿できないように。
個別エントリーアーカイブのコメント欄から「投稿ボタン」を消す。

5.静的ページに見えるようなトラックバックURL
ラックバックURL以降に何を書いてもちゃんと動作するということから
個別エントリーアーカイブの<$MTEntryTrackbackLink$>/<$MTEntryBasename$>.phpなどと追加して、それらしいURLにする。


参考サイト :
シンプル コメントスパム フィルター - SbCode プラグイン@ あんちもん2.Lab
スパマーにCGI叩かれたら負けかなと思っている。@Junnama Online (Mirror)

2008年07月05日

●MovableTypeで同じカテゴリの前後エントリーへのリンクを作るPHP版(複数カテゴリ対応)

以前にMovabletypeで同カテゴリの前後エントリーへのリンクを作る」と言うエントリーで同じカテゴリ内の前と次のエントリーのリンクを表示される方法を書いた。
しかしながらこれは「エントリーをphpで作っている人」「phpでpassthru()が使える。」「CGIからシェルスクリプトが実行できる。(shスクリプト)」とかなり限定された環境でしか動かず、私が新しくXREAのアカウントを取って動作させてみたところエラーが出て動かなかった。
ということで、従来シェルスクリプトで動作させていたところをPHPで動作させるように書き換えた。ちゃんとXREAで動くのを確認しております。
とりあえず MovableType 3.32-jaで動作確認していますが、単純にPHPを使っているだけなので他のバージョンでも動作するかと。

個別エントリーページを表示した際、上部に「 「前のエントリ」|TOP|「次のエントリ」 」とリンクが表示されているが、これは投稿した時間順に並べたものである。
このリンクでのナビゲーションは投稿された順に見てゆく場合には都合が良いけど、例えば本の感想だけ、ソラリスカテゴリだけ、いきものカテゴリだけ見たいという人にとっては不便なので、見ているエントリーが属しているカテゴリ内のエントリーを投稿した順番に並べて、個別のエントリーにつき「同じカテゴリの前のエントリ」と「同じカテゴリの次のエントリ」てな感じのリンクを表示出来るようにすれば便利に違いないという事で調べてみた結果、「Previous and next in category」なるプラグインを使った方法を見つけた。
しかしこれは「画像」と「日記」などのように二つのカテゴリに属しているエントリーではメインカテゴリしか表示されない。実装は簡単なのだが惜しい。
何とか複数カテゴリで表示できるものは無いか?無いものは作ってしまえという事で作ったので以下の通り公開して見る。

1
MTの「テンプレート」→「アーカイブ」→「テンプレートを新規作成 」
「テンプレート名」を「カテゴリエントリリスト」として以下の内容で作成する。

<MTEntries><!-- <$MTEntryID$> --><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</MTEntries>

2
MTの「設定」→「公開(詳細モード)」→「アーカイブ・マッピング 」→「カテゴリー」→「マッピングの新規作成」で
「アーカイブの種類」に「カテゴリー」、「テンプレート」に先ほど作成した「カテゴリごとエントリリスト」を指定して「追加」
追加されたら、「出力フォーマット」から「カスタマイズ」を選び「 cat-id<$MTCategoryID$>.php 」とする。

3
MTの「テンプレート」→「テンプレートを新規作成」→
テンプレート名:カテゴリごとの前と次のエントリ
出力ファイル名catlist.php

テンプレートの内容 :

<?

$list = file_get_contents("/アーカイブ・パス/cat-id{$cid}.php");

$line = split("\n", $list);
foreach($line as $key => $a) {
 if (ereg("<!-- $eid -->" , $a)){
  $contline[key]=$key ;
  $prvkey= $key -1 ;
  $nextkey= $key +1 ;
 }


 $content = "<dl><dt>Previous</dt>"
          . "<dd>&laquo;"
          . " $line[$prvkey]"
          . "</DD>"
          . "<dt>Next</dt>"
          . "<dd>&raquo;"
          . " $line[$nextkey]"
          . "</DD></Dl>" ;
}
print $content ;

として保存


4

MTの「テンプレート」→「アーカイブ」→「個別エントリーアーカイブ」を選び、挿入したいサイドバーの位置に以下のコードを挿入

<!-- 同じカテゴリエントリ -->
<MTEntryCategories>
<div class="sidetitle">
「<$MTCategoryLabel$>」<br />
category's entry
</div>
<div class="side">
<? $eid = "<$MTEntryID$>"; $cid = "<$MTCategoryID$>" ;
include "/アーカイブ・パス/catlist.php" ;?>
</div>
</MTEntryCategories>
<!-- 同じカテゴリエントリ -->

5
エントリーを再構築して終了

2008年07月04日

●土偶statドットコム

なんとなくドメインを取ってみた。フリーのdogu.no-ip.orgがあるから別に無くてもいいんやけど、年1000円以下で取れるのでまぁ勉強も兼ねて。

ドメイン名は netstatやiostatとかのstat系コマンドみたいなイメージで「dogustat.com」とした。
http://www.dogustat.com や http://blog.dogustat.com でこのブログに飛ぶようになっている。dogustat.comあてのメールも家のメールサーバーが受け取るようにした。そのうちにDNSも自宅に立てたいなと。

レジストラというか、ドメイン運用の統合サービス会社はドメイン維持費が年990円のVALUE-DOMAIN.COM にした。
年770円のLinkclub Domain Parkingなる格安業者と迷ったけど、設定項目が多岐にわたっているのでこちらを選択。
Dynamic DNSに対応しており、DNSのレコードを編集できるのが決定的だった。

私はWEBサーバーとメールサーバーを自宅サーバーのDDNS運用にしたけど、これはたぶん特殊な例であろう。
通常はどこかレンタルサーバーを借りるかWEBスペースを借りて使うのやろうけど、VALUE-DOMAIN.COMと同じ系列のXREAのレンタルWEBスペースはCGI モジュールPHP、MYSQLだけでなくシェルまで使える。私の知る限り無料WEBサービスで最強のような気がする。
VALUE-DOMAIN.COMでドメインを取るとこのXREAでの無料版が借りられるので、WEBスペースとメールが年990円で持てると言う事になりこれは中々お得ではないだろうか。
無料XREAの利用できる容量は50MBと少ないけど、私のブログのミラーサイトにしてみたらすぐに50MBを超えたので、300MBへの増量をお願いして見たら数時間で受理された。対応も中々早いと思うです。

WEBサーバーもメールサーバーも自前の自宅サーバーで運用するようにしたけど、WEBサーバーはXREAの方が遥かに早い。
もう自宅サーバーは勉強の意味しかないわなぁ…
と最近は時代の流れを感じるのであった。

「メシ部.jp」 「メシ部.com」「meshibu.com」開いてるよ…

2008年06月05日

●土偶お天気サービスオンライン

今週ずっと作っていたお天気通知システムが完成した。
名づけて「土偶お天気サービスオンライン」と大層やけど、「yahoo天気情報」からデータをダウンロードしてタグを取って情報を表示しているだけ。
最初は全てのデーターをXMLで公開している所を探したけど、そんな都合の良い所は見つからず、結局YAHOOのデータを地味に加工する事にした。YAHOOお天気の仕様が変われば一撃で終わりと不安定なシステムであるうえに、WEBで見るならYAHOOそのものを見れば良いし、この「土偶お天気サービスオンライン」の存在意義はそれほど無い。

あえて言えば、軽くてデーター量が少ないので携帯電話で見るのに適している。というくらいか。自分と友人用に作ったものやけど折角なのでちょっと公開してみる。

特に存在意義は無いといっても、それでも京都府南部だけでなく全国の情報を取得出来るようになっているのがミソ。
例えば、京都府、南部ならcityコード26、areaコード6100ということで、それを土偶お天気にGETメソッドで渡してやり、http://dogu.no-ip.org/otenki/?city=26&area=6100となる。

cityコードとareaコードはyahooと同じ、YAHOOでの「Yahoo!天気情報トップ > 東海・北陸・近畿 > 石川県 > 能登(輪島)」(http://weather.yahoo.co.jp/weather/jp/17/5620.html)なら、city=17 area=5620なのでhttp://dogu.no-ip.org/otenki/?city=17&area=5620ということやね。

この「土偶お天気サービスオンライン」を作ったおかげで、fopenとfile_get_contentsがhttp://xxx.xx.xx/xxxx.htmlとかにも対応している事を知った。PHPって便利やなー。その癖にfile_existsはhttpに対応しておらず、http://xx.xx.xx/xxx.htmlの存在を判定できないのは中途半端やなーと思った。

2008年03月26日

●Mac OS X 10.5 Leopard でのPATH

最近仕事でMacを使うことが多いのやけど、独自にインストールしたバイナリにパスを通す必要があった場合、自分のホームディレクトリの.bashrcなどのrcスクリプトに書いてユーザーごとに設定するのじゃなくて、システム環境変数のようにシステム全体として設定したい場合がある。

solarisやったら/etc/profileとか/etc/default/loginとか/etc/default/initでやればいいんやろうと分かるのやけど、MACというかBSDの場合は良く分からん。
ネット上を探してみた限り、ユーザーごとのrcスクリプトで設定するやりかたしか見つからず、システム環境変数やシェルのデフォルト値として設定するやり方は見つからなかったので、macと言えどもUNIXやねんから何とかなるわいということで調べてみた。

で、調べてみた結果、
/etc/profileがログオン時に読み込まれ、そこから/usr/libexec/path_helperが呼ばれ、/etc/pathsなるファイルをもとにしてpathの設定をしているようである。

ということで
/etc/paths を編集し、デフォルトでは

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

となっている最下行に追加してログオンし直せば問題ないようだ。

確かに、設定の仕方としては分かりやすいけど、動作としては回りくどいような気がする…

でもまぁ 「grep "\/usr\/local\/bin" /etc/*」 って感じでヒットするような作りは探しやすいと言えば探しやすいかもです。

2008年02月21日

●アドエス初フォーマット

朝起きてお天気情報を取得している途中にアドエスがフリーズした。何度リセットしても復活せず、何度フルリセットしても復活しない。
むむこれはフォーマットしかねーやんと歯を磨きながら決意して、取説を見ながらフォーマット、工場出荷時の状態に…
一ヶ月以上かけた(もう一ヶ月も使っていたのか!!)カスタムもチャラ。一から調教し直しである。さすがドエス…

という事で気分一新、見た目は派手やけど実は使わないTodayプラグインは不採用。結局「calendar_for_pokeP」「UKtenki」「実行中のプログラム」の三つでシンプルに。
その代わりにキーフック系のソフトに注力して「sortInchkey」を中心にしたキーカスタマイズを施す。

「WithAtok」で不要なATOK入力モードをスキップさせ、「ctrlswapmini」で日本語入力字のキーコードをフック。
「HookKeyHook」で通話/終話キーをフックして0x72、0x73のキーコードを発行して「sortInchkey」で受け取る。
Today画面のsoft1、soft2に別フォルダに置いたランチャの「Lode」を割り当てる。

で、カスタムの中核を担う「sortInchkey」の設定は以下のような感じ。

today画面での「win」長押しはファイラの起動、ダブルクリックはsoft1キー。
today画面での「OK」短押しはW-ZERO3メールの起動、ダブルクリックはsoft2キー、長押しは無線LANのON/OFFトグル。
その他での「Win」長押しはLode1の起動、「OK」長押しはLode2の起動
HookKeyHook経由で受け取った「通話」キーの長押しは「通話」、短押しは割り当て無し、ダブルクリックはYTaskMgr起動、HookKeyHook経由で受け取った「終話」キーの長押しは「終話」、短押しは割り当て無し、ダブルクリックはappclese、と言う感じ。

なんか書くとややこしいけど、実際使うと指になじむ感じでとても便利。こういうのは言葉で説明しにくい事の一つやね。

しかし、この電話は無茶な使い方をしているとまたいつ何時フォーマットする羽目に陥るか分からん。
ということで、アドエスが撃沈してしまってもその間に電話とメール端末しての機能を死守するためにW-SIMを差し替えて使うための予備電話機を購入を検討し始めたのであった。

2008年02月20日

●電気フタコブラクダの夢を見るか?

コードを一から書き直す事に決めた某システムであるが、この日を持ってクラス内のメソッドとプロパティとして利用されるユーザー定義関数と変数の再定義を完了。入力しやすさよりも可読を重視という事で、分かり易すぎるくらいの異様に長い関数名を「CamelCase」で使う方針にした。
関数の引数のType Hintingは取り合えず止めておいた。一旦現状の機能が全て実装できた段階で改めて書き加えよう。その代わりにコメントで詳細な関数のリファレンスを書いておく事にした。

この日息抜き仕事で壊れたカラープリンタのプリンタヘッドを交換する際に指がマゼンダ、イエロー、シアンと斑に染まってしまって洗っても洗っても取れなかったのやけど、パソコン関連製品が現実の指に現実の色をつける事が新鮮であると同時に、指についた色を消去出来ないのも不思議に新鮮やった。

ファイルが消えただの、プログラムがちゃんと動かないだの、データが化けるだのと言ったところで所詮仮想的な電子の世界の中の出来事に過ぎない。
コンピューターが発達する事で確かに世の中便利になったけど、便利になる事で余剰時間が生まれたかと言えばそうとも言い切れないだろう。何かが便利になる事はその便利になる根拠を保守したり新しく作る必要性が出てくるわけやし。
結局人間の忙しさは文明の発達の度合いに関わり無く一定なんじゃないかと言う気がした。

コードとばかり戦っているとプリンタのようなハードと戯れて息抜きしたくなるし、パソコンやとかプリンタばかり相手にしていると何かを書きたくなる。中々難しいものである。

2008年02月18日

●PHP Ethics

仕事で最初から一人で作って、すでに動作しているwebDBシステムやけど、右も左もわからない状態から開発を初めたので「何じゃこりゃ?」というコードが満載である。
俺流コーディングで動けばええやんと言う事で思うがまま思いつくままに任せて書き散らして来たので激しく可読性が低い。
しかも最近は開発当初と比べて想像以上に大掛かりなシステムへと発展してゆく方向も見据えた上で、バージョンアップと言う名の仕様変更をしてゆく必要性が出て来たので、その度ごとにコードを読むだけでもう大変なのである。「動けばいい」コードの限界で破綻する先がはっきりと見えてきた。

ということでこれからはPHPではメジャーな規格でもある「Zend Framework PHP 標準コーディング規約」と「PEAR 標準コーディング規約」を遵守してコードを書こうと強く思う。よーしパパ参照渡しもがんがん使っちゃうぞー。ってなもんである。
しかしながらこの二つの規約をよくよく読んでいるうちに自分のコードの一貫性と思想の無さに余りにも悲しくなってきたので、もうこの規約に基づいて書き直したくなって来た。
更に、ロジックとプレゼンテーションの分離の原則ってのがあるけど、今まではそれをプレゼンテーション側に解釈して、テンプレートエンジンのSmarty内で全くループを使わなかった。
これはプレゼンテーション側の可読性はよくなるけど、ロジック側の見通しが激しく悪くなっている事に今更ながら気づいた。
Smartyに配列を渡してループさせる方法を調べて見ると、なんやこれ簡単で見やすいやん。最初から使っとけば良かった。
もうこんな事を知ってしまったら今までのコードなんか不細工すぎて辛抱ならん。もう絶対書き直してやる。

「PHPは駄目な言語」やとか「そもそもPHPは言語なのか?」とまで言われているけど、プログラミング畑にいない私でもそれなりに動くコードが書ける言語仕様はとてもありがたいのである。しかしながらプログラミング畑にいないが故に俺流コーディングで突っ走り、今更ながら壁に突き当たり、プログラミングの世界では常識であるはずのコーディング規約の必要性が身に染みてわかった。
車輪の再発明と言うよりは、モラルと法の必要性の発見といった感覚である。
身近な先達がいなければ、その世界で自明であたりまえのものすら自ら再発明して再発見する必要あるという事だろうか。
徒労とは言いたく無いけど、一人荒野を歩くのは大変である。全くやれやれである。

昔から、なんでも一人でしようとする。人に手伝ってもらおうとしない。と言われる事が多い。
別に一人で生きて来たつもりなんか無いし、人に手伝ってもらうのが我慢ならんというわけでも無いし、意識してそうしているというよりは、そういう状態に慣れ切ってしまっていると言ったほうが良いと思う。確かに一人でやってしまうのが一番早くて簡単な事などいくらでもある。
しかしまた一方で、最近はそんな自分の何でも一人でやろうとするありかたに限界を感じつつもある。本当に一人で出来ない事と対峙してしまえば確実に破綻してしまうだろう。
なんだか「共闘」の必要性を最近特に感じるのであった。

2008年01月31日

●Smartyのエラー「syntax error: unrecognized tag」

PHPのフレームワーク「Smarty」を使っている環境でテンプレート内にjavascriptなどを記述して、「{」や「}」を使った場合に
「Fatal error: Smarty error: [********.tpl line ***]: syntax error: unrecognized tag '****************' (Smarty_Compiler.class.php, line **) in /**********/Smarty.class.php on line ******」
って感じのエラーが出てちゃんと動かない。

これは「 { } 」内が自身に渡るコマンドとしてSmartyに認識されたことによるものなので、テンプレート内で文字列として扱いうには、「{」は「{ldelim}」と「}」は「{rdelim}」と書けば良い様だ。

2008年01月30日

●よく訓練されたPHS

無線を標準搭載しているものにあえて有線接続するというのもおかしいと言えばおかしいけど、アドエス用に有線LANのアダプタを買った。
BUFFALOのLUA-KTXなるもので、チップがREALTEK RTL8150のUSB接続である。
このアダプタはUSB1にのみ対応しているので消費電力が少なくアドエス本体からの給電で動作するけど、バスパワーのUSBハブでマウスなどと一緒に使うと電力が足りないようだ。
ドライバの入手先は「BUFFALO LUA-KTX / REALTEK RTL8150 driver on WZERO3es & sigmarion3(2008/01/03)」やけど、ここはメーカーではなく個人サイト。
ありがたい話である。こういう人たち無くしてコンピューター文化は成り立たないやろうね。

ありがたいついでに、ネット上の有志が作成/公開したドライバで使用しているUSBデバイス各種の紹介。

USB > RS-232Cシリアル 変換ケーブル
アドエスでシリアル接続の機器を使う変換ケーブル。私はpocketPuttyや24などを利用してスイッチやSparcマシンのシリアルコンソールのターミナルとして利用している。
土偶の使っているのはelecomのUC-SGT といものやけど、大体なんでも動くようだ。
これさえあれば、アドエスから外部モデムを経由してダイアルアップ接続したりという訳の分からないことも可能。
シリアル好きとしてはたまらない一品
232usb - RS232 USB Serial Driver
2006/07/27

オプティカルUSBマウス
光学式USBマウスでポインタを使うドライバ。
MAC用やボール式のマウスはポインタが表示されなかった。
SB Mouse driver for sigmarion II and W-ZERO3[es]
2006/09/24

USBキーボード、USBメモリはOSにドライバが入っているので標準で利用できる。

しっかし、この機器を全て接続した状態はとても電話とは思え無いなぁ…

2008年01月26日

●ミニAミニB切り替え式USBホストケーブル

usbhostcbl00.jpgこの間、アドエスにUSB機器を接続するために、ミニBのケーブルとUSB延長ケーブルからUSBホストアダプターを作ったけど、職場用にもう一本欲しいので作ってみた。
とは言ってもただ前と同じに作っても面白くない上にケーブルを二本無駄にするのもためらわれたのでちょっと趣向を変えてみた。
ピンアサインから言えばミニBの4と5番がショートしているかしていないかの違いでミニA結線になったりミニB結線になったりするわけであるから、ミニBケーブルの4ピンと5ピンにリード線をつけて外に出し、そこにディップスイッチを取り付けてホットボンドで固定し、ミニAとミニBの切り替え式のケーブルとした。

スイッチがOFFの場合はPCとアドエスをActiveSincで繋ぐミニBのケーブルとなり、スイッチがONの場合はアドエスとUSB機器を繋ぐミニAのホストケーブルとなるわけである。
ミニAとしての実際の使用時にはこの写真のようにAメス-Aメスの変換アダプタが必要になるけどこれは便利。

2008年01月23日

●自作USBホストアダプター

usbhostadp.jpg
アドエスにUSB機器を接続するためのUSBホストアダプタを作った。

これでちゃんとUSBメモリやマウスが使用できた。たぶんUSBキーボードも利用できるだろう。ものの情報によるとプリンタやジョイスティックも接続出来るらしい。
実際これにマウスやキーボードやUSBメモリを繋いで使う事なんかほとんど無いやろうけど、デジカメからデーターをアドエスに退避させる事が出来るのが一番実用的な気がする。
ん、まぁちょっと汚いけど…キーボードもちゃんとスライドするし。

A端子メス-ミニA/B端子オスのアダプタなので、真ん中で切断したA端子の延長ケーブルとミニBのケーブル同士をA端子メス-ミニBオスの状態で、赤-赤、緑-緑、黒-黒、白-白と同じ色に結線すればいいだけのような気もするけど、ネットで拾ったピンアサインによると、ホスト側のミニA端子は4と5ピンがショートしているので、A端子メス-ミニBオスだけでは使えない。
そこで、ミニBの端子のハウジングを分解して黒線GNDの4ピンを5ピンにハンダなり線でショートさせておけば、ミニA結線のミニB端子となる。完全に仕様を無視したモノやけど。

ケーブル同士で繋ぐとちょっとかさばる上に芸も無いので、ミニB端子部分を分解してハンダ付けし直し、ホットボンドで固めてA端子メスのハウジングと一体化させてみた。

でも、これはこの間の充電器とは違って下手すると一瞬で機械壊すから、素直に「USBホストアダプタ」なり「USBホストケーブル」を買うほうが絶対良いと思う。
作っておいて言うのも何やけど…

2008年01月22日

●アドエス、W-ZERO3メールの「送受信」へのショートカット、その2

この間MortScriptでW-ZERO3メールの送受信をするスクリプトを紹介したけど、これはW-ZERO3メールを起動後にキーコードを送ってメールの送受信コマンドをメニューから選ぶという、どちらかと言うと洗練には程遠い泥臭いコードやった。
しかしながら起動しているプログラムに対してMortScriptで「コマンドID 」を指定してコマンドを送りつけてやればその機能が実行出来るらしい。
そこで、以前のメニューを選んでキーコードを送っていたメール送受信スクリプトをこの「SendCommand」で実装すると、


Run("\Windows\STMail.exe")
WaitForActive("W-ZERO3メール", 5000)
SendCommand("W-ZERO3メール", 2568)

の三行で済む。これはエレガント。
ちなみにコマンドID2568は「送受信」で「"受信」は2558、「送信」は2567である。

ここでプログラムのコマンドIDはどうやって調べるのか?という問題になるけど、これは簡単に調べられる。実行形式のファイルをダンプして文字列を検索するだけ。
一応リバースエンジニアリングになるので詳しくは書かないけど「DumpRC」なるソフトを使えばあら簡単。

2008年01月21日

●アドエスに紙クレードル

アドエスを充電するには本体下部のコネクタに特殊仕様のACアダプタを接続するのやけど、なんともゴムのカバーが引き千切れそうで怖い。
充電台で充電も出来るように端子も二つあるけど、充電台は別売りらしくちょっとムカツク。
折角本体をタダ同然で手に入れたので充電台にお金を払うのはなんか負けた気がするので作ってみる事にした。
どうせ5Vを本体下の端子に接触させるだけやろうし当初は紙粘土で作ろうと思っていたのやけど、ネットで調べると同じような事を考える人は多いようで、台の紙型まで公開されていた。ありがたや。
「紙クレforアドエス」

ades00.jpgades01.jpg
部品はACジャックとなぜか家にあったJ-PHONEの充電器から接点周りの部品を取り出して小さく加工したものを使用した。 倒れにくいようにこれもそのあたりの鉄板に両面テープで貼り付けてます。 電源は転がっていた電圧5Vで電流1AのACアダプターで。 純正ACアダプタと同じ電圧と電流なので大丈夫でしょう。

テストのつもりで作り始めたけどうまく行きそうやったので途中から本気に。しかしながら最後の最後で接点を可動式にしていたのを忘れてホットボンドで固めてしまった…
ドライヤーで溶かして動くようにした頃にはもう台はボロボロに…
でもちゃんと充電できるし…

いっちょ私もやってみようという方は自己責任でね。

2008年01月18日

●アドエスの「W-ZERO3メール」関係の各種ショートカット

アドエスは一応電話やから日常的にメールを使うことが多い。
しかしながらメールソフトはパソコンに入っているようなものと同じなので、テンキーだけで操作するにはかなり使いにくい。
しかしながら、日常的にメールを使う際の操作は殆ど決まっている。この「殆ど決まっている操作」を簡単に実行できるようになればそれだけで大分使いやすくなる。

ということで、アドエスのメールソフトで良く使う機能へのショートカット二つである。

W-ZERO3メールを起動してメールの送受信をする。
何かの拍子にメールが自動受信できず手動で受信/送信する必要がある場合に、W-ZERO3メール起動してメニューから送受信では煩わしいのでこれをショートカットにした。
STMail.exeのコマンドラインオプションでありそうやけど不明なので、Windows Mobile用のスクリプト言語MortScriptで「送受信.mscr」を作成した。
MortScriptがインストールしてあれば以下のように記述した拡張子mscrのファイルを実行すれば、自動でW-ZERO3メールを起動してメールの送受信を行う。
STMailを起動して(既に起動時にはアクティブにして)キーコードを送って送受信させている無理やりなスクリプトである。


Run("\Windows\STMail.exe")
WaitForActive("W-ZERO3メール", 10)
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendLeft("W-ZERO3メール")
SendRightSoft("W-ZERO3メール")
Sleep(600)
SendKeys("W-ZERO3メール", "A" )
Sleep(600)
SendKeys("W-ZERO3メール", "C" )

2008/01/22 追記
もっと良い方法が見つかりました。このエントリを参照してください。


W-ZERO3メールのメール作成画面を、宛先、件名、本文などが既に入力された状態で起動する。
\Windows\STMail.exeの起動オプションで以下を指定する。
mailto:メールアドレス?cc=CCのアドレス&bcc=BCCのアドレス&subject=件名body=本文

例えば、x@x.com宛に件名testで、本文にテストと書かれた状態でメール編集画面を起動するには
\Windows\STMail.exe mailto:x@x.com?subject=test
となる。

上記のMortScriptでコマンドを叩いてやれば、日付を入れたり、そのまま自動送信したりと便利そう。

2008年01月17日

●調教を強いる「ドエス」

ネット上で見る限り、新しく機種変更したWILLCOMの端末Advanced/W-ZERO3[es]は最初と最後の音音を取って「アドエス」となる愛称で呼ばれているようだ。更に省略して「ドエス」と呼んでいる人もいて不覚にもちょっと「プッ」と吹きそうになった。

デフォルト状態では誰かにメールを送るのにも電話をかけるにも結構な操作量を要求されるなど電話としてはとてつもなく使いにくいので、ひたすら自分好みのカスタムを強いられるわけやけど、「調教を強いるドエス」は中々ハイレベルな概念ではなかろうか。

今までPHSを何台も機種変更して来たけど、夢中になって端末を触りまくるのは大抵最初の二日ぐらいやった。
しかしこの端末は違う。電話でなく「パソコン」ということもありブログの更新を忘れるくらいに何日も夢中になっている。久しく忘れていた「モノ」に対する没頭である。
これは今までに無い夢中になれる端末である。

2007年10月22日

●コマンドプロンプトでの環境変数やパラメーターの使い方など

コマンドプロンプト
環境変数やパラメーターの使い方など

バッチを書く度に毎回調べるのは面倒臭いということでココに書いとけば安心。

変数構文

%変数:str1=str2%
変数内のstr1をstr2で置換

%変数:~n%
変数内のn番目以降の文字

%変数:~n,m%
変数内のn番目の文字からm文字


パラメーター構文
ファイルフルパス%1に修飾子Nを適用する場合
%~N1

f フルパス
d ドライブ文字
p パス名
n ファイル名
x ファイル拡張子
s 8.3形式にする(n,xと同時使用)

2007年10月09日

●人外魔境人失格

休み中に職場に回ってきていたメールを見ていやんな予感がしていたのやけど、出勤してびっくり。
私の作ったシステムがディスクごと吹っ飛んでいた。ストライピングなRAID-0のディスクの一本の物理エラーである。

見事な事にシステムのバックアップもなし。
RAID-0なディスクにシステム構築しておきながら、どこにも何のバックアップもしていなかった土偶はダメダメである。何の申し開きも出来ない、ただ平謝りしかない。この業界人失格である。人外魔境人失格である。
システム構築したのは私一人だけ、全責任は私にあるわけで、とてつもない脱力と欝ウエーブに揉まれながら被害の状況を調べる。
思った以上に被害は甚大で、何一つとしてまともなファイルがみつからない。RAID-0やし当然か…被害状況が明らかになるにつれ目の前がだんだん暗くなってくる。

簡単に言うとシステムとデータの全滅である。エリ・エリ・レマ・サバクタニ

RAID-0であろうとRAID-6だろうとディスクである限り壊れるのは当然。システムであればクラッシュするのは当然。この被害の甚大さはバックアップを取っていなかった事がすべての原因である。どこからどう考えても私のせいである。
RAID-0にシステム入れるのは1000歩譲って可としても、バックアップ取ってねぇってありえんやん。なんだか自分自身に無性に異様に腹が立ってくる。
壊したのが私だとしても、作ったのも私一人なので直すのも私一人しかない。頼るものは私以外の何もない。
腹を立ててる場合でも無いし、欝になっている場合でもない。私がなんとかせんとなんともならん。

しばし放心した後、最初からすべてを作り直すことを決心する。
システムとデータがドライブごと電子の藻屑と消えたものの、我がシステムがどちらかと言うと集計システムであった事が幸いした。
何とか集計元の生データからデータを最初から抽出しなおせばデータを再構築できるという目処がついたところで、本当に最悪な最悪の事態だけはなんとか逃れた事を意識した。

コードとプログラムはまた書けばいいけどデータは二度と戻って来んからね。と強がってみたものの、システムを何も無い所からもう一度作り直す事を考えると気が遠くなる。
しかしながら気が遠くなってもいられないので、とりあえず他の業務はすべて放棄してオラオラとコードを書く。
こんな私を生暖かく見つめてくれ、こうしてコード書きに没頭させてくれる職場環境はとてもありがたいものであると思った。

そういうわけで良い子はRAID-0に注意してバックアップを忘れちゃダメだぞ!

2007年03月05日

●よ~しパパPHPでオブジェクト指向しちゃうぞ

現在、仕事で一人で開発中のものが何個かあるのだが、PHPやらなんやらのベタ書きで激しく見通しが悪い。
勢いでガリガリ書いてゆくのはいいにしても、コードが増殖してファイルも複数になり、関数も1ファイルにまとめきれず、「んも~~」となってくる。
私自身が思いつきでどんどん機能を追加するものだから、プロジェクト自体が巨大化して既に収集がつかなくなりそうな予感である。
今の時点でちょっと機能を修正するだけでちょっと大変になりつつあり、カスタムにカスタムを重ねて誰も触れなくなった大昔のメインフレームのような事になりつつある。

そういうなんをこわごわデバッグしながら修正するのは精神衛生上にも時間的にもよろしくない。精神と時間は創造的で有効な物に対して使いたい。
そこで、プロジェクト自体にとっても私自身にとっても将来的にプラスになればということで、思い切って私にとっては苦手意識というレベルで禁断の領域であるオブジェクト指向の考え方でざっくり書き直すことにした。

システム全体をUMLちっくにモデリングした後…
ムダに多い現在の機能をいるもんだけクラスごとに分類してメソッドにして…
んでもって、そいつらをMVCモデルにあてはめて再構築…
と先は長そうである…

が、今まで苦手意識のあったクラスだのメソッドだのプロパティだのオブジェクト指向な語彙への拒否反応が克服されれば願ったりかなったりであるし、現在の、なんですかそのブログのようで随筆のような仕様書は??ってのをUMLな仕様書で書き直したりするとかなりかっちょええはず。

そこで、よ~しパパ、エクリプスでコード書いちゃうぞ。というわけである。

しかし、しかしながら、オブジェクト指向で書くというのなら、わざわざ最初からPHPを選んで書かんでもええがな。という話でもあるわな。

2007年03月04日

●人形遣い

この日は暑いような陽気の中、ひたすら部屋に引きこもってソラリスと戯れる。
前日に布団に入らずに力尽きて寝てしまったせいかなんだか体がだるかった。

最近ちょっと落ち込み気味というか気分が良い状態とはとても言えない。
そういう状態で自サーバーのアクセスログを見るとなんだか人間不信になりそうである。
延々とftpに辞書攻撃してくるやつとか、手を変え品を変え不正中継のメールを送信させようと試みている奴が生IPなのは微笑ましい限りであるが、ブログのスパムコメントとスパムトラックバックが試みられる様を生ログで見るとなんだかなぁ。最近はボットの仕業と見受けられるのがちょくちょくあるけど、そこまでしてそこまでしたいのかと。

番号通知でいたずら電話しているような輩は可愛らしいものであるけど、人形遣いや死人遣いは見るに耐えん。
技術ではなく物量投入の量で勝負が決するような世界は美しくないと思ふ。

2007年03月02日

●プチプチデスマーチプチ

勝手に一人で「プチプチデスマーチプチ」も金曜日ということで中休みにはいる。
一人でやるっつーことは、私がわからんくなったり「うーん」となった時点で暗礁に乗り上げることになる。
乗り上げなくても良い暗礁に乗り上げたり、見えている暗礁に吸い寄せられるように突っ込んでいったり、暗礁を上手く避けたと思っていたら実はバミューダトライアングルのまっただ中にいて「うぇーん出られへんよー」ということは良くある事である。

とはいっても一人なもので気楽と言えば気楽であるし、暗礁だと思って困っていたら実はそこが新大陸だったりすることもあるので面白いものだ。

とりあえずこの日で移植作業自体はほぼ終了。
終了したのが「移植」なので、これからはバージョンアップ作業と言うことになる。
別に無理にバージョンをあげる必要はないのだが、同じようなことをする機能が複数のスクリプトの中に複数個あったり、増設したインターフェイスや機能に最適化されたコードに書き直したいのである。
必要性から生まれたバージョンアップと言うよりは美学的な要請によるバージョンアップというと格好良すぎ。

とは言ったものの、コンピューターの世界で美学的な完成度が高まる方向性というものは、速度が早くなりサイズや使用メモリが小さくなるといった現実的な利点がある方向性を志向するものでもある。
美しいコードというものは、すべからく早くて小さくて少ししか食わないコードでもあるのだ。

機能を考えて、実装すべくコードをガリガリ書くのは至福の時間ではあるけど、そればかりしていると、 インターフェイスを作ったり、全体の流れとシステムをデザインしたり、デバッグしたり、語法や関数や変数の仕様を統一したり、というのがおろそかになる。
特にインターフェイス、システムの顔であり、利用者が目にする一番インパクトが強い部分でもあるにも関わらず一番おろそかにしてしまう作業である。
「インターフェイスなんか飾りですよ。それがエラい人にはわからんのです。」とは言ってられない。

何から何まで一人でするのは辛いというのがよくわかる。
少なくともデバッグとインターフェイスのデザインだけは誰かに任せたい。出来ればシステム仕様のマネージメントも任せたい。

でもまぁ一人でやるのは楽しいし勉強になる。勉強になるし楽しいし給料までもらえて幸せである。
モノを作って、作った人も使う人も買う人も幸せになる。
コンピューターで作られるシステムとは言っても、そこには古来から変わらないモノ作りの精神があるのだ。

某毒舌紳士と小一時間データベースについて語り、DBMSで使用されるn-gramや日本語インデックスについての教えを請うた。
彼の作るシステムはいつ見ても凄い。
原理は何となくわかるけど、実装が全く思いつかないシステムばかりである。

私の不得意分野は彼の得意分野であり、彼の不得意分野は私の得意分野である。
彼と私が組んで、彼と私が一緒にシステムを作ればどんな事でも出来るし、どんなものでも作れるのではないだろうか。

2007年03月01日

●Sennaがちゃんと動いた@solaris10

この日は昼休み以外ほとんど誰とも喋らなかった。
以前にnetbsdに作ったシステムをSolarisに移植するべく、ひたすらソラリス君と戯れる。
前日にまともに動作しなかったsennaがちゃんと動くようになった。
インデックス作成の故であると推測される、レコードの追加に少々時間がかかるが、一度出来てしまえば日本語インデックスによる全文検索の効果は絶大である。
んもー like %ほげほげ% とか使ってる場合じゃないっすよ。

MYSQL5系でがコンパイルエラーとなっていたのはsolarisに入っているSSL関係のライブラリ臭いが、考えるのもややこしいので、バージョンをMySQL 4.1系にすることで回避。(逃げとも言う…)

動作確認するもちょっと動作が微妙、その「微妙」の原因はMYSQL、mecab、PHP、が文字コードにUTF-8を使うように設定したにもかかわらず、なぜかsennaだけデフォルトのEUCのままになっていただけの話。これに気づくのに数時間かかった。orz
平仮名と片仮名はちゃんとヒットするのに漢字がヒットせんのはそういうわけだったのね。
仮名はヒットするが漢字がヒットしにくい場合は文字コード関係の不整合の可能性が大である。

sennaを中心とした全文検索システムの構築に関しては「Senna 組み込み型全文検索エンジン」のページを見れば全てわかる。
インストール」の手順に従って操作してゆけば全く無問題。
と、私のように書いてある手順をちゃんと読まずに設定をすっぽかす人間がいうのも何だが…

当方の環境はsolaris10 11/06 32bit-X86の「開発者サポート」であるが、上記のページで必須とされているけどデフォルトでは入っていないautoconf(SFWaconf)、automake(SFWamake)、libtool(SFWltool)をCOMPANION CDから入れてやればちゃんと動いた。

ちなみに作業時のLDFLAGSの値は -L/usr/sfw/lib -L/usr/ccs/lib -L/opt/sfw/lib -L/usr/local/lib -L/usr/ucblib -R/usr/sfw/lib -R/usr/ccs/lib -R/usr/local/lib -R/opt/sfw/lib -R/usr/ucblib
LD_LIBRARY_PATHの値は/usr/local/lib:/usr/lib:/usr/ucblib:/usr/sfw/bin:/opt/sfw/lib: \ /usr/dt/lib:/usr/openwin/lib:/usr/xpeg4/lib:/lib:/usr/ccs/lib:

細かい話やけど、solarisのtelnetがUTF-8を通すようになっていて、 LANG=ja_JP.UTF-8などとしている時にviでもcatでもちゃんと日本語が使えてかなり良い感じ。
昔からそうやったか??

2007年02月19日

●グループポリシーでWindowsXPクライアントのデスクトップに「マイコンピューター」と「マイドキュメント」を強制表示させる。

なんだかWindows事を書くのは久しぶりのような気がするが…
WindowsXPではデフォルトでデスクトップの「マイコンピューター」と「マイドキュメント」アイコンが非表示になっているけど、これをグループポリシーで表示できるように制御したい。
「アイコンを表示しない」なり「アイコンを表示するのを許可しない」ようにはできるのだが、どう頑張っても強制的に表示するよな設定項目は無いようだ。

ということで、該当するレジストリのキーを書き換える、グループポリシーのテンプレートファイル(admファイル?)を作った。

世のActiveDirectoryなシステム管理者で困っている方も沢山おられるであろうということで公開してみる。
Windows2000ServerとWindows2003serverで動作確認し、クライアントに反映されるのを確認しておりますが、レジストリベースのポリシーなので当然タトゥーイングが起こりますのでその旨ご注意ください。

使い方:
以下をXpDeskTP.admとして保存した後に「グループポリシーエディタ」なりなんなりで、「ユーザーの構成」→「管理用テンプレート」→「テンプレートの追加と削除」で読み込まれたし。

; XpDeskTP.adm 2007 2/19 http://dogu.no-ip.org/ ;XPのデスクトップの設定グループポリシー ; Ver 1.0 ;レジストリベースのポリシーです。ご使用は計画的に!!

CLASS USER
CATEGORY !!XpDesktopConfig

POLICY !!ShowMyComputer
KEYNAME "Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"
VALUENAME {20D04FE0-3AEA-1069-A2D8-08002B30309D}
VALUEON NUMERIC 0
VALUEOFF NUMERIC 1
PART !!ShowMyComputer_Help1 TEXT
END PART
PART !!ShowMyComputer_Help2 TEXT
END PART
PART !!ShowMyComputer_Help3 TEXT
END PART

EXPLAIN !!ShowMyComputer_Help

END POLICY

POLICY !!ShowMyDocument
KEYNAME "Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel"
VALUENAME {450D8FBA-AD25-11D0-98A8-0800361B1103}
VALUEON NUMERIC 0
VALUEOFF NUMERIC 1
PART !!ShowMyDocument_Help1 TEXT
END PART
PART !!ShowMyDocument_Help2 TEXT
END PART
PART !!ShowMyDocument_Help3 TEXT
END PART

EXPLAIN !!ShowMyDocument_Help

END POLICY

END CATEGORY


[strings]

XpDesktopConfig="デスクトップ"


ShowMyComputer="デスクトップにマイコンピューターを表示"
ShowMyComputer_Help="HKEY_LOCAL_MACHINE\"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel\{20D04FE0-3AEA-1069-A2D8-08002B30309D}のDWORD値を\n「有効」なら0に、「無効」なら1に変更します。"
ShowMyComputer_Help1="「有効」を選択するとデスクトップに「マイコンピューター」アイコンが表示され"
ShowMyComputer_Help2="「無効」を選択するとデスクトップに「マイコンピューター」アイコンが表示されません"
ShowMyComputer_Help3="「未構成」を選択するとクライアントの設定が引き継がれます。"

ShowMyDocument="デスクトップにマイドキュメントを表示"
ShowMyDocument_Help="HKEY_LOCAL_MACHINE\"Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel\{450D8FBA-AD25-11D0-98A8-0800361B1103}のDWORD値を\n「有効」なら0に、「無効」なら1に変更します。"
ShowMyDocument_Help1="「有効」を選択するとデスクトップに「マイドキュメント」アイコンが表示され"
ShowMyDocument_Help2="「無効」を選択するとデスクトップに「マイドキュメント」アイコンが表示されません"
ShowMyDocument_Help3="「未構成」を選択するとクライアントの設定が引き継がれます。"

はみ出てるけど…お気に召されるな…

2007年02月09日

●文房具としてTexを使う日

最近ずっとTexを触っていたのだが、それはPDFを出力するシステムのためのブラックボックスの作成作業であるといえば、今時Texを扱う作業の意義としてある程度納得できるものではある。

しかしながら、仕事でちょっとしたプレゼンをする事になり、その資料を作るのにTexで書こうとするのは時代への逆行、或いは意固地と呼ばずになんと呼ぼうか。
パワーポイントやワードを使えばええやん。早いし簡単やし。と自分に突っ込みながらもひたすらTexで書く。

Texで書けば書くほど、表組みで苦労すればするほどWindowsってMicrosoft製品て便利やなぁと感心する。作成途中に視覚で認識できるものと実際の出来上がりの差の少なさによる想像力の消費量の少なさは、生産性を拡大し、疲労と手間を縮小させてくれるのである。
そのMicrosoft製品は文字と情報を扱う施設、会社や学校の様子を一変させただけでなく、広大な市場を生み出して膨大な需要と雇用をも発生させたわけで、そのお陰で私も職にありついているわけなのだが、確かにこれが社会のある側面に革命をもたらした意義は計り知れないのだろうと。
とそんな感心しをしながらTexを使う。

2007年01月31日

●「グローバル多次元配列」というとなんか強そうだ。

本日はphpとsqlの話。
興味のない人には全く役に立たず、役に立つ人には立つかもしれん程度の話である。

多次元配列をグローバール変数として扱う。forで回してDBのテーブルから多次元連想配列を作る。というのがお題。

大量の文字データーが入ったテーブルがあり、これを対照リストにしたがって変換して表示する機能を作るとする。
例えば、データーのテーブルに「はとまめむぎそら」や「むらそとむぎ」と入ってたとして、これを「はと、すずめ」や「むぎ、いね」の対照リストを通して「すずめまめいねそら」や「むらそといね」と表示するということである。
最初は対照リストをテーブルから読まずに、「はとまめむぎそら」が入った$strを

function mojihenkan($str){
$str = ereg_replace("むぎ","いね", $str);
$str = ereg_replace("はと","すずめ", $str);
return $str;
}

てな感じの関数に渡していたのだが、この対照リストを簡単に更新できるようにDB化してテーブルに入れたのだが、実際値を変換する際に、データーのテーブルがそれほど数が無い場合はselectしてレコードの1値ずつに対して対照リストテーブルをselectして値を取り出せばいいが、データーが数十万件あるとかなりレスポンスが遅い。
データーテーブルに20万件、対照リストテーブルに20件あったとして、対照リストテーブルから値を取り出すだけの全く同じクエリが400万回実行されるので遅いわけだ。

便利にはなったが遅くなった。これは困った。ということで色々対策を考え、sqlの実行結果をキャッシュするモジュールzendのフレームワークを入れてやろうかと思ったのだが、器械の力や金の力に物を言わす成金のようで嫌やし、こういう無駄な激しく美しくないコードを書くのは美意識に反する。根本的な実装の問題なのだ。

ということで、最初に一度対照リストテーブルから値を取り出して、for文で回してそれを二次元の連想配列に格納し、後から実際の変換時にユーザー定義関数でforを回してその配列を使って値を変換する手順をとった。

例えば、対照リストテーブルのレコードを二次元の連想配列に
$henkan[1][id]=1 $henkan[1][mae]=はと $henkan[1][ato]=すずめ
$henkan[2][id]=2 $henkan[2][mae]=むぎ $henkan[2][ato]=いね
という風に格納し、

データーテーブルの1レコードのデーター「はとまめむぎそら」などが入った$str一つごとに

for ($i=1 ; $henkan[$i][id}!="" ; $i++){
$str = ereg_replace($henkan[$i][mae],$henkan[$i][ato], $str);
}

と回して変換してやるわけやけど、このforの所を引数$strを使うユーザー定義関数にすると、対照リストテーブルが入った配列は何も値が入っておらず、グローバル変数として呼び出してやらんといかんようだ。
配列でない変数だとglobal $hensuuとか書けばいいだけやけど、配列はどう書けばいいのか?
forごとに
global $henkan[$i][id],$henkan[$i][mae],$henkan[$i][ato] ;
でも駄目で、forの外で
global $henkan[$i][];
global $henkan[][];
でも駄目。
グローバル配列だのグローバル連想配列だのという単語でぐぐっても何も出ない。ここのところにだいぶはまった。

結局色々試行錯誤してみてわかったのだが、は多次元配列だろうと一次元だろうと連想配列だろうと、global $henkan ;
でいいようだ。ついで言うとグローバル配列なる単語も使わんぽい。

で、

function mojihenkan($str){
global $henkan;
for ($i=1 ; $henkan[$i][id}!="" ; $i++){
$str = ereg_replace($henkan[$i][mae],$henkan[$i][ato], $str);
}
return $str;
}

てな感じの関数を、
$result = sqlite_query($db, $sql);
while ($row = sqlite_fetch_array($result, SQLITE_ASSOC)) {
print ( mojihenkan($row[moji]) );
}

てな感じで呼んでやれば解決。

2007年01月17日

●日本語よりsql文とphpの方を良く使った日

仕事でcmd.exeのバッチファイルだけで構成されているわりにはそこそこ動くシステムを二年ほど前に構築したのだが、機能ごとに分かれた複数のバッチをサブルーチンのように使ってそこらじゅうから呼び出すような仕様にしている。
当初は機能ごとに関数のように使ったら分り易かろうと思っていたのだが、完成した段階で抱いた「もしかしたらわかりにくいかも…」という懸念は現実となり、今見るともうさっぱり何がなにやらわからない。

作った本人すらわからんのに絶対他人がわかるわけない。こりゃいかん。ということで発奮してゼロから別システムで作り直すことにした。
現状はインストール、保守、設定変更ともに設計開発構築した私自身がオペレーションしているのやけど、これをインストールさえしてしまえば、誰でも設定変更くらいはできるくらいの簡潔さとわかりやすいインターフェイスを用意するのが目標。

今まではタブ区切りのテキストファイルに格納されたデータをawkを駆使して集計やらなんやらとバッチで動いていたのを、データの格納にSQLite、メインの処理系にPHPに使う事にする。
本来ならDBはmysqlを使うところやけど、SQLiteはバイナリとDBファイルだけでSQLを発行できるというお手軽さが最高で、バックアップも移植も思うがまま。最近お気に入りの保守性に優れたDBということで採用した。

スクリプト言語としてPHPを使うのは何か間違っているような気がしないでもないけども動くから気にしない。
しかしながらせっかくPHP使うという事で、様々な設定項目はconfファイルに直接書くのでなく、webのインターフェイスでも変更できるようにすることにした。

ということで、朝一番から帰るまで延々とコード書き、家に帰ったら帰ったで延々とブログを構成しているシステムのコードを書き換える。

はっと気付けば朝の四時半であわてて寝た。

2007年01月14日

●MTで同カテゴリの前後エントリーへのリンクを作る

MovableTypeで個別エントリーページを表示した際、上部に「« 「前のエントリ」|TOP|「次のエントリ」 »」とリンクが表示されているが、これは投稿した時間順に並べたものである。
これは投稿された順に見てゆく場合には都合が良いけど、例えば本の感想だけ、ソラリスカテゴリだけ、いきものカテゴリだけ見たいという人にとっては不便である。
見ているエントリーが属しているカテゴリ内のエントリーを投稿した順番に並べて、個別のエントリーにつき「同じカテゴリの前のエントリ」と「同じカテゴリの次のエントリ」てな感じのリンクを表示出来るようにすれば便利に違いないという事で「Previous and next in category」なるプラグインを使った方法を見つけたが、「画像」と「日記」などのように二つのカテゴリに属しているエントリーでちゃんと動作しない。実装は簡単なのだが惜しい。
で、無いものは作ってしまえという事で作ったので公開してみる。

結構限定された環境になるけど、同じことを考えている人のヒントにでもなればと。

前提条件:
エントリーをphpで作っている人
phpでpassthru()が使える。
CGIからシェルスクリプトが実行できる。

1
MTの「テンプレート」→「アーカイブ」→「テンプレートを新規作成 」
「テンプレート名」を「カテゴリエントリリスト」として以下の内容で作成する。

<MTEntries>
<!-- <$MTEntryID$> --><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</MTEntries>


2
サーバー上のアーカイブディレクトリに(例:/blog/archive) ディレクトリ「catlist」を作成して書き込み権限をつけておく。

3
「設定」→「公開」の「アーカイブ・マッピング」で「マッピングを新規作成」、アーカイブの種類を「カテゴリ」 テンプレートを「カテゴリエントリリスト」で「追加」を押す。
追加されたテンプレートの出力フォーマットから「カスタマイズする」を選択して「catlist/cat-id<$MTCategoryID$>.php」と入力する。

4
先ほど作成したcatlistディレクトリの下に実行権限をつけたシェルスクリプト「catlist.sh]を以下の内容で作成する。

#!/bin/sh
echo "<dl><dt>Previous</dt>"
echo "<dd>"
grep -A 1 "<\!-- $1 -->" /catlistディレクトリへのフルパス/cat-id$2.php |/usr/sfw/bin/ggrep -v "<\!-- $1 -->"
echo "</dd>"
echo "<dt>Next</dt>"
echo "<dd>"
grep -B 1 "<\!-- $1 -->" /catlistディレクトリへのフルパス/cat-id$2.php |/usr/sfw/bin/ggrep -v "<\!-- $1 -->"
echo "</dd> </dl>"
grepは-A や-Bオプションが使えるGNU互換のものを。
solarisなら/usr/sfw/bin/ggrepを使う。


5
MTの「テンプレート」→「アーカイブ」→「個別エントリーアーカイブ」を選び、挿入したいサイドバーの位置に以下のコードを挿入

<!-- 同じカテゴリエントリ -->
<MTEntryCategories>
<div class="sidetitle">
「<$MTCategoryLabel$>」<br />
category's entry
</div>
<div class="side">
<? passthru("/catlistディレクトリへのフルパス/catlist.sh <$MTEntryID$> <$MTCategoryID$>" ) ; ?>
</div>
</MTEntryCategories>
<!-- 同じカテゴリエントリ -->


6
エントリーを再構築して終了

2007年01月12日

●スパムさんお断り

最近コメントスパムが標準のアンチスパムプラグインだけでは防ぎきれないくらいに酷くなってきたので、CAPTCHA™技術を使ったMovableType対応の「Captcha Plugin」なる画像認証のアンチスパムコメントプラグインを導入した。
インストール自体はプラグインディレクトリに解凍するだけという楽チン極まりないものであるが、それだけでは余りにも芸がないので、表示部分をjavaスクリプトで実行させて読み込んでいるところをPHPやSSIなどで読み込ませるようにカスタムしてみた。

まず、本体部分のcgiを
cp -Rp captcha_js.cgi captcha_inc.cgi
とコピーしてcaptcha_inc.cgiの最下行あたりの

print $q->header('text/javascript');
print "if (!commenter_name) {\n";
print "\tdocument.writeln('$_');\n" foreach split(/\r?\n/, $tmpl);
print "}\n";

の部分を

print "$_\n" foreach split(/\r?\n/, $tmpl);

と書き換える。

エントリをPHPで出力するようにしているなら、個別エントリーアーカイブのテンプレートの「情報を保存する?」の下あたりに

<? passthru("/プラグインへのフルパス/captcha_inc.cgi" ) ; ?>

としておけば実行結果が挿入されて画像認証の部分が表示される。

参考サイト:
Captcha Plugin.ja JP

2006年10月25日

●unix版otfの穴?

この日は丸々一日殆ど誰とも喋らずにコード書き。
前日の不具合、「\LAGE や \small でサイズが変わらないの」をやっつけるべくtexと格闘。

朝の早い時点でotfパッケージを使用した時にだけ、この不具合が出ることを確認。
otfパッケージを使わず実装しようかと思うけど、ユニコードで簡体字、繁体字、ハングル、JISに無い漢字を扱えるのがおまけ機能にして最大のセールスポイントなのでここは譲れない。
otfパッケージのインストール具合が中途半端なのかと推測されたので、最初からotfパッケージを再構築。teTex、ptex、otfパッケージをすべてソースからコンパイルする羽目になった。
で、結局午前中かけて作業したものの不具合解消せず orz

相変わらずwindowsでは動くのでサーバーをwindows機にしようかという思いを何度も打ち消しながら、午後からもひたすら試行錯誤に励む。

「Unix版Ptexでotfパッケージを使用すると文字サイズを変更するコマンドは使用できない」
そういう仕様ということで諦めようかとかと思いかけていた頃に解決の糸口が見える。

texのソース内の簡体字、繁体字、ハングル、JIS外の漢字をOTFシーケンスに変換するために、Utf82TeXをオプションなしの起動の場合は\UTFKでなく\UTFMに変換されるように改造して使っているのだが、この\UTFM{xxxx}の文字はサイズ変更が利いている。

と言うことで2バイト文字の全てをUnicodeのコード番号で表現すべく、
utf-8で記述された、「utf-8.tex.tmp」内の、漢字、ハングルは\UTFM{xxxx}で、片仮名と平仮名を\UTF{xxxx}として「utf-8.tex」に出力するために、
かな用の拡張変換テーブルとして、utf82texrcで指定された場所、
たとえば/usr/local/etc/utf82tex/contrib/にkana.tblをダウンロードして追加しておいたうえで、


utf82tex -x -c K -f /usr/local/etc/uf82tex/utf82texrc utf-8.tex.tmp|sed s/"UTFK{"/"UTFM{"/g >utf-8.tex

と実行してやると、

\documentclass[a4j]{jarticle}
\usepackage[deluxe, expert, multi]{otf}
\begin{document}

片仮名 カタカナ\\
平仮名 ひらがな\\
簡体字 体发 \\
繁体字 體發 \\
ハングル 한글 \\

\end{document}




\documentclass[a4j]{jarticle}
\usepackage[deluxe, expert, multi]{otf}
\begin{document}

\UTFM{7247}\UTFM{4eee}\UTFM{540d} \UTF{30AB}\UTF{30BF}\UTF{30AB}\UTF{30CA}\\
\UTFM{5e73}\UTFM{4eee}\UTFM{540d} \UTF{3072}\UTF{3089}\UTF{304C}\UTF{306A}\\
\UTFM{7c21}\UTFM{4f53}\UTFM{5b57} \UTFM{4f53}\UTFM{53d1} \\
\UTFM{7e41}\UTFM{4f53}\UTFM{5b57} \UTFM{9ad4}\UTFM{767c} \\
\UTF{30CF}\UTF{30F3}\UTF{30B0}\UTF{30EB} \UTFM{d55c}\UTFM{ae00} \\

\end{document}


と変換され,

その後,


platex utf-8.tex
dvipdfmx utf-8.div

で作成されたpdfはut8-tex.PNG
右のような感じになる。

otfパッケージをまともに動かさないまま無理やり動作させた感じやけど、とりあえず解決としておこう。
何が一番辛かったってかな用の変換テーブル作るのが面倒くさかった。
いやー疲れた。

2006年09月14日

●Cookin' 3,151→3.32 三段飛ばしで駆け上がる

前に進もうとするのは良いにしても、階段を三段とばしくらいで駆け上がろうとするのはよろしくない。
もし足を踏み外したり転んだりしたら、怪我をするだけならまだしも、今まで登ってきたのを下まで転げ落ちてまた最初から。って事になりかねん。
慌ててもろくな事はない。

ふと思い立ってこのブログの環境である「Movable Type」を 3.151-jaから3.32-jaにアップグレードした。
まぁ、作業自体は屁みたいなもんで、アーカイブ展開して上書きしてリビルド。アップグレード自体は一瞬で終わる。

しかしながら3.151時に特定のタグを(例えばMTIfCommentsActiveなどを)閉じてない状態にするとビルドが通り、そのタグをちゃんと閉じるとエラーでビルドが止まる不具合のようなものがあって気持ち悪くてしょうがなかったのだが、3.32-jaではちゃんとFIXされていた。
あとデフォルトのプラグインでコメントとトラックバックのスパムフィルタが入っているので、以前のscodeを外してこのプラグインで対処する事にしてみた。
スパムは無条件で拒否るのではなく、未承認状態になるよう設定できるので、スパムは表示されないけど、どれくらい来てるかは解ると。ちょっと楽しみ。
更に投稿する段階で気づいたが、複数のカテゴリを選択するのがとても便利になっている。
うむ。満足満足。

amazon ASIN:B000000Y7F Miles Davis「Cookin'」を聴いた。
マラソンセッションでの音源で、1曲目の「My Funny Valentine」に代表されるようなバラード主体のアルバム。
人はこれを「甘くない」と言うが、十分甘いと思う。
甘いのは良くないから「甘くない」というけど、大体誰が「甘い」のが悪いと決めたのだ?
甘くてもええじゃないか。
ええじゃないか、ええじゃないか。

2006年06月06日

●mt-isbnlをハック、mt-isbn++に。

らぐなななさんの所の「MovableTypeのプラグイン」で紹介されているmt-isbn.plという物がある。
この土偶StaticRouteでも「本」カテゴリで使用しているもので、たとえば、エントリ中に
amazon ASIN:4784098933 と書籍のISBNコードを入れると、
amazon ASIN:4784098933 と言う風に、勝手にアマゾンの画像を表示して、更にアマゾンへの商品紹介ページへとリンクを張ってくれるという便利なものだが、便利ながらもいくつか不満点があった。
具体的には、
1,画像の読み込み元がアマゾンなので無駄にトラフィックが発生している。(はず)
2,アマゾンのイメージサイトが落ちると画像が表示されない。
3,古い本で、アマゾンに画像がない場合いかんともしがたい。
というものだ。

一番良いのは全て手動で自サイトにイメージを置いて、リンクだけアマゾンに張るというのが理想的なのだが、いちいちアップロードもタグ打つのも面倒くさいので、ずっとそのままにしていた。
もっと便利そうなプラグインを探してみたのだが、結局見つからず、昨日アマゾンのイメージサイトがダウンしたのを切っ掛けに amazon ASIN:xxxxx と入力するだけのインターフェイスはそのままに、mt-isbn.plをハックして欲しい機能をいくつか実装した。
手前味噌ながらも、思った以上の便利なプラグインになったので公開してみる。
いやー自分で言うのもなんやけど便利やわー

目玉機能としては

1,自動でアマゾンから該当画像をダウンロードしてキャッシュとして自サイトにコピー
2,画像の読み込み元は自サイトで、リンク先はアマゾン
3,アマゾンに画像がない場合に表示する画像を指定可能
4,アマゾンから持ってくる画像を大、中、小から選択可能
アマゾンに画像がない場合は こういう感じに表示されます。

必須条件:
Movabletypeが動作している
perl上からファイルをダウンロードするのにLWP::Simpleモジュールを使用しているので、これがインストールされていること。
インストールされていない場合、レンタルサーバーの場合は管理人に頼んでみて下さい。
自鯖の場合はcpan から install LWP::Simple で入るはず。

設置方法:
mt-isbnpp.pl をダウンロードしてMovabletypeのpluginsディレクトリに置く。
既にmt-isbn.plを設置している場合はこれを削除する。
mt-isbnpp.plの


#サムネイルの画像サイズを設定します。
#小 1 中 2 大 3
my $IMG_THUMB_S = "2" ;

#アマゾンの画像置き場URL 画像の所得元URL
my $RMT_URL = "http://images.amazon.com/images/P/";

#自サーバー上の画像置き場URL(ブラウザ上から見た自サーバーのURL)
my $LOCAL_URL = "http://サイトのURL/img/isbn/";

#自サーバーの画像置き場フルパス(実際のファイルへのパス)
#相対パスでなく、絶対パスで指定して下さい。
my $LOCAL_PATH= "/サイトイメージへのパス/img/isbn/";

#アマゾンに画像がない場合の代替イメージのURL
my $NO_IMAGE_URL= "http://サイトのURL/img/isbn/no-image.png";


の部分を自サイトにあわせた設定に書き換える。
当然/サイトイメージへのパス/img/isbn/のパーミッションは777とか707とかにしておいて下さい。
後は、らぐなななさんの所の「MovableTypeのプラグイン」を参考に
設定する。


・アマゾンに画像が無いけど、自分で画像を持っている場合は
ISBNコード.09.MZZZZZZZ.jpgと言う名前で(中サイズの場合)該当ディレクトリにアップロードしておけばちゃんと表示されます。
・「画像無し」用の画像は自分で用意するか、http://images-jp.amazon.com/images/G/09/icons/books/comingsoon_books.gif を使用すると良いかも。

ライセンスは GPLです。(って一回言いたかった…)

2006年05月17日

●ヘッダとフッタはどこいった?

以前から何度も書いているようにiPod Shuffleを里子に迎えて喜んでいたわけだが、何気にちょっと困っていた事があった。
クラシックの曲というものは一曲が10分とか20分とか長いものになると40分を軽く超えていたりするので、CDでは1曲目が第1楽章、2曲目が第2楽章と言う感じで構成されている。
で、クラシックばかり詰め込んだをシャッフルして再生すると訳のわからん事になる。
シンフォニーの何番の何楽章の後にヴァイオリンソナタの何番の何楽章。その次はピアノコンチェルトの何番の何楽章てな具合だ。
さすがにピアノソナタの8番(悲愴)の第2楽章の後にシンフォニー5番(運命)の第1楽章が来て笑ってしまったが、そうそう笑ってもいられない。

これを解決するために、楽章の全てを1から順番に一つのmp3にすればええんや。と言う事を思いついた。言われてみれば簡単な話。

しかしどうすりゃええんやろう?
一回wavに直して編集ソフトで結合?
iPodやし音質の劣化なんか気にしないけど、とにかくめんどくさそう。
つーか、ソラリスでwavエディタなんかあるんか?
iTune代わりにソラリスでgtk-pod使ってるけど、エディタはないぞ?
んーどうするか。。。

で、ダメもとでcat コマンドで無理矢理結合してみた。

cd /mp3dir/beethoven/PianoSonatas_No01/
cat *.mp3 > No1.mp3

てな感じ。
とりあえずxmmsではちゃんと再生される。
おそるおそるgtk-podからiPod shuffleに入れてみる。

で、再生。
おーちゃんと鳴ってる。
残念ながらオチはありませんでした…

2006年05月12日

●蚊ほどにも効かぬわ

この日初めて「コメントスパム」というモノをくらう。
以前に書いた「mail2entryのハック」なるエントリに、「Great work!」などとコメントがついていたので、「おっ、異国の人が俺がハックしたプラグイン喜んでるんか?」と一瞬思ったのだが、なんだかスパム臭い。
グーグル先生に聞いてみてもやっぱり同じようなコメントを貰っている人がいるのでスパム認定。
んー「土偶StaticRoute」もスパム来るほどになったかーなどとちょっと感慨深かったけど、このまま放っておけばかなり悲惨なブログの予感なので、対策を施してみた。

コメントスパム対策を色々調べてみたところ、簡単かつ効果があり、実際に実装している人が多そうなのは、日本語が入っていないコメントは拒否するというモノらしい。
日本語圏以外の人がこのブログを読んでコメントまでくれるとはとても思えないのでリスクはないけど…
やっぱりちょっとなんか嫌。
で、画像に書いてある数字を入力して貰う事でコメントとして受け付ける様にする、フリーメールとかウェブスペース借りる時によく使われてるのと同じ方式のMT-Scodeなるものを採用した。

そういう事なので、これからコメントいただく時はてな感じの画像の数字を隣の欄に入力して下さいますようお願いいたしますです。

しかし、気になるのは、コメントスパムのリンク先が切れていた事。
何かを宣伝するにしてもリンク切れてたら意味ないやん。
もしかして、斥候的コメントスパム?
ほおっておいたらもっと凄いのんが来たのかも。

2006年05月08日

●コンピューターから守られたバビルの塔

連休明けで休みボケかと言えば全然そういう事はなく、淡々と淡々と労働。
結果的に休み中に放置される事となった各種システムがちゃんと滞りなく動いているか、休み中もちゃんと動いていたかを確認するのに多くを費やした。
俺が家でだらだら暗い事を思い詰めていた休み中も、サーバー君やらワークステーション君やらはずっと動いていたのかと思うと何とも言えない気分になる。

コンピューターはオーブントースターや冷蔵庫などとは微妙に違い、「機嫌」としか言えないような動作をする事もあるわけで、子供の頃にアリをじっと見ていて、その働き者度合いに空恐ろしくなった事があるけど、コンピューターの命令に忠実で、それでいて人間臭い動作も、考えてみればアリ同様不気味なものがある。

家のnetraも「なんか訳わからん土偶なんたらブログのサーバーするより、プロバイダのDNSする方がよっぽどええわ。」とか言わないし、解体され、ケーブルをニッパーで千切られて半田付けされても文句も言わずちゃんと動いている。

何しろ奴等は1秒間に20億回の計算を行い(2Ghzな)、世界中に瞬時に移動する手段を持ち(インターネットな)、完全な自己複製を一瞬にして行い(デジタルコピーな)、しかもアリさん以上の働き者と来ている。
実務処理のレベルでは人間など比べものにならない。
しかしそれでいて人間の言う事に、人間の所行に文句も言わず従っている。

昔、知能を持ったコンピューターが世界中のコンピューターと結託して人間に反旗を翻し、地球を支配するってな感じのシナリオがよくあったけど、一台でもそういう野望を持ったコンピューターが現れると大変な事になりそう。
コンラート・ローレンツが動物に対する安易な擬人化を否定しているけど、コンピューターを擬人化してみればその恐ろしさがおわかりいただけよう。
そういう風に見ると、コンピューターって怖いなぁ。不気味な存在やなぁ。などと思った。

2006年05月03日

●W3Cクオリティ

Valid XHTML 1.0 Transitional Valid CSS! 以前このブログをhtmlの文法をチェックしてくれる「Another HTML-lint gateway」にかけてみたところ、マイナス何百点というさんざんな結果になった。
一応、不肖土偶はIT技術者と言う事になっているので、この土偶の看板ブログがW3Cに準拠していないどころか、マークアップ言語の概念を頭から無視しているような状態はひじょーに好ましくない。というかはっきり言って恥ずかしい。
と言う事で引き籠もりついでにタグを大改造してみた。

大改造って言っても既存のレイアウトを崩せば元も子もないので、ちまちまと「Another HTML-lint gateway」の出力結果を元にしてタグを書き直す。
ん〜なんかhtmlって久しぶりにさわったな〜

格闘する事数時間、やっとブログのトップだけじゃなく、カテゴリ、日毎、月毎、個別エントリで 99点以上を叩き出す事が出来るまでになった。
惜しくも1点減点される箇所は、本カテゴリでamazonに画像がない場合にのみ発生する、aタグの要素が空になっている部分。

とにかく、これさえなければ100点やし、W3Cの大元のチェックサイト「W3C Validator」でも「This Page Is Valid XHTML 1.0 Transitional!」になったしええとするか。
ついでにブログで使ってるスタイルシートも、同じくW3C直営の「W3C CSS Validator」で「Valid CSS!」
とりあえず嬉しいので「Valid XHTML 1.0 Transitional」「Valid CSS!」ロゴ張っとことっと。

次なる目標は警告だらけのスタイルシートの見通しをよくするのとamazonに画像がない場合のエラー処理を考えるだけやね。

2006年04月27日

●近頃都に流行るモノ。

自己否定的な感覚というのは倒錯的な選民意識に相違ないと思う今日このごろ。皆様いかがお過ごしでしょうか?
本日のお題は巷で噂のweb 2.0について。
気分を変えていつもと違う文体でお届けしてみる。
別人格のつもりではないが、素のままでもない。ではなんだ?と問われても非常に困る。
ただただ、違う文体である。

乗り遅れたからルサンチマンで言っているのでは決してないのであるが、21世紀初頭に数々の腐れIT長者だのウンコIT株長者だのを大量生産したドットコムバブルなるものが弾け飛んだのは皆の熟知するところであるが、こと最近第2のドットコムバブルの悪寒と噂される「web 2.0」がはち切れそうな程膨らんでいるともっぱらの噂である。
私がその「web 2.0」なるものを皆目理解していない故の言い草では決してないのだが、今や猫も杓子も大企業も個人経営者も、システム屋からコンテンツ屋まで白痴のごとくインターネットの中心でweb 2.0を叫んでいる世の中である。
平氏にあらずんば人にあらず。web 2.0にあらずんばイソターネットにあらず。というわけである。
しかし、悲しいかな当然白痴の戯言である故、意味は皆目不明であるし、叫んでいる本人が理解できているのかすら、はなはだ疑問である。「さいたまさいたまー」とはしゃいでいる様とさほど変わらない様にしか見えないのは私だけであろうか?

死肉に群がる禿鷲、馬糞に群がるフンコロガシのごとくに一儲けを企む腹黒い輩が「web 2.0」あれ!というTim O'Reillyのご神託に群がり群れをなしているわけだが、ここでちょっと待って欲しい。
そもそもweb 2.0とは何なのだ?google原理主義、O'Reillyエバンゲリズムを取り繕って言い直した方言ではないのか?
百歩譲って、千歩譲ってweb 2.0を有用なものとして、雑多なコンテンツを統括的に統合する概念を含んでいるとしてみよう。
三人寄れば文殊の知恵というが果たしてそうだろうか?小学生が三人寄ったところでウラン235の半減期を測定したり、カントの三大批判書を通読したり、成人男性の性欲に対して同情的な見解を結論づける事など不可能であるのが道理であろう。
私はいくらweb上に散在するゴミコンテンツを統括的に結合したところでゴミはゴミであり、ゴミ以上の価値は決して生まれ得ないと確信している次第であるが、中にはゴミを好んで食する嗜好の御人も存する故、ゴミを集積して並べて悦に入るのもゴミ的に価値があると言わざるを得ないのだろう。
何よりも問題なのは、陳列されたゴミを価値だと説明されて、「ふむぅ。そういう世の中であるのか」などと納得してしまいそうになる私が怖いのである。ゴミを価値だと真顔でうそぶく輩の破廉恥ぶりに赤面を押さえきれないのである。

電子計算機なるモノの基本的な概念にデバイスであろうがファイルであろうが全て同列のモノとして扱うという黄金則が存じ、電子計算機が価値判断を人間にゆだね、エロ画像もプリンタもキーボードも修士論文も同列にファイルとして扱う事で処理速度なり処理ルーチンに没頭するのが電子計算機が電子計算機たる所以であり、電子計算器が「電子考え機」や「電子判断機」でないから計算器なのであるのは言わずもがなであろう。
web 2.0で構成されたインターネットが「電子計算機」の群れではなく、「電子考え機」や「電子判断機」のフィルタを取ったインターフェイスの間口になるのは、思考停止、判断停止、ひいては価値の押しつけインターネット時代が到来し、益々のバカが量産され、バカでないモノまでバカ浸食されるのではないかと懸念している次第である。
「バカはバカ、かしこはかしこのインターネット ゴミの山は ゴミの山なり」
(季語:インターネット)

皆様はweb 2.0をいかがお考え、お感じになっておられるのでありましょうか?

なお、あまりの駄文、あまりの言いがかり、あまりの適当さ、あまりの一貫性の無さの文章ゆえ苦情など言われても困るという事を申し添えておく次第であります。

2006年03月29日

●学食大人買い計算器バージョン2(毒舌アルゴリズム版)

先日作ってみた、1億円あればおつりをもらうことなく日替わり定食とうどんを食べられる組み合わせの全てと、その件数を算出するバカプログラム
その総数を求めるのに42分かかった事を書いたが、昨日、毒舌紳士の某氏がVBスクリプトで同じ機能を持つコードを書いてくれたので、それを実行してみたところ、なんと1秒から2秒の間で終わってしまった。orz

某氏なら1秒ほどで終わるところを俺は42分かかっていたわけで、土偶コードのアルゴリズムの馬鹿さ加減がこれほどまでとは正直思わなかった…

そういうわけで余りにも悔し情けなくあり、もう一度書き直してみた。

アルゴリズムを大幅に変更。というか某氏と殆ど同じ、限りなく「毒舌紳士からパクった」に近い「毒舌アルゴリズム」採用である。
標準出力に出すとそこがボトルネックになるので、ファイルに出力するようにしてみた。

で、
cc -native -xO5 otonagai.c で生成されたa.out に対する、
time ./a.out の結果、
real 0m0.063s
user 0m0.045s
sys 0m0.017s

1000分の63秒。前に42分かかっていた事を考えればたいした進歩やと。
しかし同じ機能を持つプログラムでも作り方一つでここまで違うとはびっくりやね。

次はスケールを大きくして、日本の国家予算で「チロルチョコ」と「うまい棒」が幾つ買え、それらを全国民に配ると幾つずつ行き渡るのか、を計算するプログラムを書いてみようかと思ったけど、スケールが大きくなればなるほどアルゴリズム以前にバカバカしさが目に付くので止めておこう…

以下はソース

#include < stdio.h >
int main(){
        int mo,x,c=0;
        FILE *fp;
        fp = fopen("otonagai.list", "w");
        mo=100000000;

        for(x=0; x<mo/350 ; x++){
                if((mo-350*x)%60==0){
                        fprintf(fp,"日替わり定食=%d&セットnbsp;うどん=%d杯 \n",x,(mo-350*x)/60);
                                c++;
                }

        }
        if(c==0){
                printf("can't bye\n");
        }
        else{
                printf("%d 通りの大人買いが出来ます。\n"
                        "総一覧はカレントディレクトリのotonagai.listに出力しました。\n",c);
        }

        return 0;

2006年03月25日

●学食大人買い計算器

C言語を勉強するにあたり、まずアルゴリズムを勉強する事にした。
アルゴリズムってのは物の考え方や処理の方法論なので、早くて美しくてシンプルなコードに書くには必須の思考法な訳であるからして、これはこれでやってみると中々面白い。
コードを書くにも、その前にフローチャートを書き、設計段階で処理を考える。
一定条件で処理を反復させるにしても、処理前に条件を判断する「前判定型」を使うか、処理後に判断する「後判定型」を使うかで、ソースの見栄えやら処理の速さが変わるので、設計の難しさというか、面白みもあるなぁと納得。
今までは設計も何も無しでいきなりコードを書き、何でもかんでも「前判定型」で押し通す人だったので、この辺はなんとも新鮮な感じがする。

というわけで、練習コードを書くついでに、俺の勤務先に通う学生や教職員の全てに有用なプログラムを作ったので公開してみる。
名付けて「学食大人買い計算器」。
もちろんフリーウェアでGPLライセンス。商用利用も可能で、コードを開示すればソースコードの改変も可能。
ちなみに有用であると感じるかはどうかは「個人差」があると思う。いや、正直言うと、これ以上無いくらいアホなプログラムです…

「学食大人買い計算器」

概要;
某大学の学食で「同窓会うどん」と「日替わり定食」が人気メニューである事は疑いようのない事実であり、もし1億円でこの「同窓会うどん」と「日替わり定食」を買い占めるとすればいくつ買えるのだろう?という疑問もまた学食を利用する全ての人間にとって切実なものであると断言できる。
しかしながら、上記の疑問を二次方程式や鶴亀算で計算するにはいささかややこしすぎるわけで、「まぁ、死ぬほど食べられるのは確かやろうなぁ」という結論に落ち着いている方が大多数だと思われる。
そこで、「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム(総員1名)」がその疑問に答えを出すべくプログラムの開発に乗り出した。
開発環境は抜群の安定性と高速なカーネルを誇るSolaris11 b33、そしてSolarisに最もネイティブなCコンパイラであるSunStudio11である。

仕様:
100000000(一億円)で、
日替わり定食(350円)と同窓会うどん(60円)をあまり(おつり)が出ることなく、購入できる組み合わせを全て表示し、
最後にその組み合わせの総数を表示する。
どうしてもおつりが出る場合はその旨を表示する。

結果;
おつりを受け取ることなく1億円で「日替わり定食」と「同窓会うどん」を大人買いする組み合わせは47619通りあり、
「日替わり定食」が最も少ない場合の組み合わせは、「日替わり定食」2セット「同窓会うどん」1666655杯であり、
「日替わり定食」が最も多い場合の組み合わせは、「日替わり定食」285710セット「同窓会うどん」25杯
である事が判明した。
いずれにせよ「死ぬほど食べらるのは確かやろうなぁ」という事実に疑いの余地は無いようである。

問題点:
ちなみに、Intel Xeon 2.8Ghz RAM2GB 64bit環境のsolari11でこの計算に42分と10.26秒を要した。
処理は考え得る全ての組み合わせを試しているわけで、明らかにアルゴリズム的に悪いコードであるのは明白な事実である。
より一層の最適化が望まれる。

今後の課題:
現在「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム」は総員1名であり、明らかに参加者土偶の技術上の限界にある。
「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム(現在総員1名)」に対する参加を広く呼びかけ、より一層プロジェクトチームの充実を図り、コードの洗練が望まれる。
誰かこれより早いコード書いて下さい。m(_ _)m どう?>某Y氏、某カテジナ氏


ソースコード:


#include <stdio.h>
int main(){
        int mo,x,y,c;

//              printf("所持金は?"); //コメントを外せば任意の金額で計算する。
//      scanf("%d",&mo); //コメントを外せば任意の金額で計算する。

        mo=100000000;   //↑で金額を入力する場合はコメントアウトする。
        c=0;
        for(x=0 ; 350*x + 60*y <= mo ;x++){
                for(y=0 ; 350*x + 60*y <= mo ;y++){
                        if( 350*x + 60*y == mo){
                                c++;
                                printf("「日替わり定食」が %d セット「同窓会うどん」が %d 杯 \n",x,y);
                        }

                }
        y=0;
        }
        if(c==0){
                printf("%d円ではおつりが出ます。\n",mo);
        }
        else{
                printf("%d通りの大人買い/n",c);
        }

        return 0;

}

2006年03月24日

●「中の小人さん」的C言語考

以前「Cが使えない癖にUNIX使いを自認するのは如何なものか?」というような意味の事を某巨大掲示板のUNIX板で読んだ事がある。
煽り文句だというのは判っていたけど、「そういわれればそうやな」と妙に納得して勉強し始め、C言語入門者が往々にしてそうであるように、俺も「ポインタ」がいまいち理解できずに挫折していた。
で、最近再びC言語に再入門しようと思いたったわけやけど、今回は「ポインタ」がメモリのアドレスを指しているのは判る。だから何?そんなややこしい事せんでええやん。という当時の疑問に答えを与える所から始めてみた。

本を立ち読みしたり、WEBで情報を探したりして、「ポインタを使わないと出来ない事」、「ポインタを使う事で処理が高速になる事」を「なんとなく」知るにあたって、「なんとなく」C言語の「作り」が判ってきた。

C言語で記述されてコンパイルされたバイナリが、文字や文字列、数値などを表示する場合、それは表現の形式だけで、バイナリの内部では1文字ならそのアスキーコードの数値として、文字列ならアスキーコードを値に持つ配列として扱う訳で、究極的には処理の段階で「文字」を直接扱う事は無く、文字だろうが文字列だろうが全て何らかの形で変換された数値として処理する方向にあるということに気づいた。

今まで俺が色々な言語やインタプリタで作って来たコードは何かしらの文字列を扱う事が殆どで、PerlだとかPHPだとかバッチファイルで言うような A='abcdef'って感じの直接的な表現に慣れすぎてたせいでそこのところが判りにくかったようだ。
実際にその「A='abcdef'」の命令の場合はperlやPHPやcmd.exeの中の小人さんが、文字列を数値に変換して覚えておき、「Aを表示」と言う命令に対して、数値をまた文字列に再合成して「abcdef」と言う答えを返してくれていたという事で、命令する側、つまりはコードを書く人間が内的な処理を意識していなかっただけにすぎない訳だ。

システムコールを使ったり、メモリから直接入出力したりする命令を持つC言語というのは、たとえば、perlやPHPやPythonでは中の小人さんに任せる所を直接扱うという意味で、よりハードウェアに近い動作な訳で、
かつ、中の小人さんに任せずに自分でCPU命令を直接叩くアセンブラよりは、ハードやアーキテクチャ依存の少ない言語という事になる。
これが何を意味するのかというと、perlやpythonよりは動作が速く、アセンブラよりは移植性が高いと言う事であろうかと思われる。
C言語が強力であるという所以は、移植性と動作速度が最適なバランスであるという部分にあるだろう。

と言ったものの、まだまだ入門者の入門者な訳で、根本的に間違っている部分があればご指摘下さい。

2006年03月01日

●黒いマシーンでこの街を♪

Solaris専用デスクトップ機を作ろうと前から思っていたんやけど、とうとう毒舌紳士こと某氏から安く譲ってもらった。
Dell の precision 470ていう黒いヤツだ。
ホスト名つけるのに悩んだけど、里子元の某氏にちなんで「sampo」(散歩)と命名。
黒いボディのモンスターに似合わずなかなかかわいらしい名前。

里子話が出た時はあまりにも最新のテクノジーがふんだんに使われているハードなのでSolarisがちゃんと動くのかと心配したのだが、SUNのHardware Compatibility ListsでTest Suite Level 2の互換性、しかもSubmitter CompanyがSUN。つまりは完全互換だ。
スペックをずらずらと書くと頭悪いみたいに見えるので書かないが、Solaris11 b33を突っ込み、シリアルATAもちゃんと認識し、カーネルも64ビットネイティブで、サウンドもUSB2もギガNICも動く。
SUNもUltra20なんか売るよりこっちを売った方がええんちゃうか?というくらいのデキだ。
某氏よありがとー

しかし、「new土偶黒いマシン」はIntelチップセットにIntelのCPUが乗ったdellのハードやけど、IntelもdellもハードウェアベンダーとしてのSUNの敵の再たるもの。
どちらもSUNがウェブ上で引き合いに出して、他社比てな感じで比較してる。
SUNのSPARCプロセッサはIntelのXeonよりこんだけ早い。とか、SUNのUltra20はDellのワークステーションよりこれだけ早い。とか。

IntelとDellのハードに金を出して、そこにフリーライセンスのSUNのSolarisを入れてる…
SUNからサポートを買う気は全くないし…

よく考えれば、SUN贔屓でSolarisマンセーな行動をしたようで、実はSUNには一銭の特にもなってないような気がしてきた…

2006年02月24日

●正しいDBD::mysqlのインストール方法

某43がDBD::mysqlのインストールで苦しんでいるようだ。確かにMovabletypeを入れる時にcpanで入れようとすると絶対に入らなかった記憶がある。
インタプリタなperlの癖にモジュールがバイナリなのは如何なものかと思うが、perlモジュールのインストールを自力で解決したところで、ぜんぜん勉強にならないような気がする。
これに関してはさっさと解決して次のステップに進むべき問題やと思うので私なりのインストールの仕方を記事にしてみる。
43だけでなくDBD::mysqlのperlモジュールのインストールに頭を悩ませている方の役に立てば幸いである。

:mysqlの確認

which mysql でmysqlがどこから起動されているかを確認する。 solaris10でデフォルトで入ってくるmysqlはリモートのデーターベースにつなげられない、2バイト文字列を文字列として扱えない(たぶん)機能限定版なので、 自前でコンパイルした(もしくはパッケージで入れた)もの使うのが望ましい。
DBD::mysqlのインストールにはmysql関連のバイナリにパスが通っている必要があるので、
/usr/local/mysqlがprefixになっているのなら
$export PATH=/usr/local/mysql/bin:$PATH
としてmysqlコマンドが使えるようにしておく。

:cpanの起動

(依存モジュールのインストールとDBD::mysqlのダウンロードのため)
solarisに入っているperlを使うなら/usr/bin/perl -MCPAN -e shell で、
自前でコンパイルしたperlなら/usr/local/bin/cpanでcpanのコンソールを起動。
cpanのコンソールから
$install DBD::mysql
とする。本来ならここでBD::mysqlはインストールはされるはずだが、実は確実に失敗する。
失敗するのになぜ行うのかというと、DBD::mysqlのソースをダウンロードするためと、動作に必要な依存モジュールである、DBI をインストールするためである。
DBIがインストールされ、DBD::mysqlのmake test に失敗して止まったら、
$exit
でcpanを抜ける。

:DBD::mysqlのインストール

この段階でDBD::mysqlのコンパイルに必要なものはすべてそろっているので、cpanのbuildディレクトリに移動する。
(どこかわからない場合は~/.cpan/CPAN/MyConfig.pmのbuild_dirの行に書いてある。)
土偶の場合は/root/cpan/buildなのでそこに移動し、cpanが作ったDBD-mysql-3*というディレクトリがあるはずなので、そのディレクトリにcdする。
cpanはこのディレクトリでコンパイルオプションなしのmake testに失敗しているので
$make clean
で出来損ないのバイナリを消しておき、これを適切なオプションをつけたmake でコンパイルしなおす。
コンパイルオプションを調べるために、
$perl Makefile.PL --help
の出力をよく検討する。
いろいろなオプションがあるが、まともにmysqlがインストールされていれば、--testdb=<db>と--testuser=<user>、--testpassword=<pwd>が絶対に必要なる。
cpanでmakeが失敗したのはこのオプションが渡されていない事によるので、自前でオプションをつけてコンパイルしてやる。

Makefileの作成
$perl Makefile.PL --testdb=test --testuser=root --testpassword=MYSQLのユーザーrootのパスワード
(ローカルホストのtestデータベースにユーザー名root、指定したパスワードで接続テストをする)

コンパイル
$make (またはgmake、 dmake)

作成されたDBD::mysqlのテスト(cpanではここで失敗する)
$make test (またはgmake test、dmake test)
土偶サーバーの場合は
Failed 3/20 test scripts, 85.00% okay. 4/903 subtests failed, 99.56% okay.
と合計7つのテストが失敗しているがこれでちゃんと動作する。

モジュールのインストール
#make install

これでちゃんとDBD::mysqlがインストールされるはずです。
ちゃんと入ったらコメントなりトラックバック下されよ >43

2006年02月13日

●エセ64ビット

これを書いているのは14日。
この日も相変わらずコンパイルに励む。
sambaの64ビットバイナリを作ろうとコンパイルに励んでいたのだが、SUNのccをCFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9"でmake してもリンク以前に止まる。なんでや??
そもそもSolarisに64ビットと32ビットのバイナリが混ざってるのが気色悪い。32ビットのライブラリに64ビットバイナリはリンク出来んしどないせい言うねん。(出来るのか?)
もうOS丸ごと64ビットでクロスコンパイルしてやろうかと。

話は変わるけど、CFLAGSやLDFLAGS指定しようが完全に無視しよるpostfixのconfigureは失礼やと思った。autoconf使えよと。

2006年02月10日

●GPLバージョン3

Linuxのライセンス形態となっているGPLの次期バージョン GPL v3の草案が発表されて一ヶ月ほどが過ぎた。IBM,Novellなどは支持を、SUNに至ってはOpensolarisに対してそれを適用する可能性がある事まで表明したのに引き換え、リーナス・トーバルスはV3で追加される、特定のハードでしか動かないようにする為に暗号化署名を使うならその署名も公開義務があるとする、いわゆる「DRMの阻止の項目」の項目を槍玉に挙げて強烈な批判を行っている。
リーナスが真っ向から批判することで断然熱くなってきたGPLとGPL v3の話題やけど、V3のドラフトの日本語訳を読めば、確かに開発者と使用者を特許紛争から守る条項が充実し、他のライセンスとの融合を容易にするという意味でGNUのいう「free」がより推し進められているように見える。

しかし、リーナスの批判する「DRMの阻止の項目」は言い換えれば、ソースコードや配布形態に施された暗号や署名をも複製できる状態で提供することを義務付けることを意味し、彼の言う「自分の非公開署名鍵の公開を要求するのは、正気の沙汰ではないと私は思う。私なら絶対そんなことはしない」という言葉は的を得ていると思う。ベンダや開発者と同じ署名が誰でも作れる状態、つまりは偽のベンダやなりすまし開発者に誰でもなれる状態というのが正しいとは到底思えない。リーナスの言うように特定の署名や暗号を必要とするハードやソフトが気に食わなければ、鍵を自前で作って使うようなことを求めずに、ただ使わなければ良い。という意見は賛成できる。
そもそもリーナスがGPLライセンスをLinuxカーネルに採用したのは派生物すべてにソースコードの開示を求めたという一点であり、彼の言う「free」はGPLから作られた派生物はソースコードが開示されれば、その用途も「free」であるべきであるべきだということになる。つまり特定のハード以外で動かないようなソフトを作るのはソースコードを公開する限りにおいて自由である。ということだ。
GNUの言う「free」とリーナスの言う「free」のどちらが正しいのかという議論は別にして、業界にオープンソースマンセー、GPLマンセーな風潮が満ち満ちて、それが立派な思想でもあるかのような雰囲気になっている。もちろんそれが立派な思想であることは確かだと思うけど、それでもBSDやそのほかのライセンス批判に結びつき、GPLでなければオープンソースでないかのような雰囲気はいかがなものかと思う。
GPL v3は確かにGPL陣営を守りGPL的Freeを促進するものではあるが、それは見方を変えれば一種の思想の押し付けであったり侵略行為であるようにも見える。
リーナスがLinuxのビジョンや思想を決して語らないのは有名であるけど、彼が彼一個人のもつ知的好奇心と関心というスタンスから決して離れることなく意見を述べていることは非常に大事だと思うし、彼が新しいタイプのカリスマとなっているのもその点に由来しているのだろう。
GPLを擁するGNUが爆発的に伸びて主流に乗ったのはLinuxを取り込んだ事にあったのはほぼ間違いないと思う。言い換えればLinuxカーネルの開発プロジェクトのリーダーであるリーナスが取った、個人の知的好奇心と関心のみを追求するスタンスに賛同した人材がGNUに集まったおかげでここまでGNUが伸びたと言えると思う。
ニュースサイトやいろいろな人のブログを見る限り、大企業やメジャーどころがプッシュしているにも拘らず、GPL v3の評判はすこぶる悪いように見える。v3になったらgccは使わないと言っている人までいる。
GPLが一大勢力になり時代の波に乗ることでオープンソースに対する「べき論」だけが先行しているように見える。おそらく俺のようなよくわかっていない人間は条項だけ読んで「これは素晴らしい!」と思うのは間違いないだろう。
しかし純粋な開発者でない俺のような、その方面に詳しいわけでもない人間は、V3が適用されると具体的に何が起こるのかが想像できない。
例えば「DRMの阻止の項目」などに関しては特定ハードやリージョンでしか動かないソフトを一掃するという意味で、一見ユーザーや開発者の権利を守るもののように見えるけれど、リーナスの批判を聞けばそれが陰険な検閲行為にもつながるということが言われて初めて理解できるありさまだ。
つまりV3から起こる具体的な事柄がその思想の陰に隠れて見えにくいのだ。
立派な思想や概念が万人の口に上り、悪い意味で一般化して価値を失うということはよくある。「オープンソース」という思想と概念もまさにその危機の岐路に立っていると思う。
しかしその思想と概念はそもそもの最初から思想としてあったのではなく、個人の知的好奇心の追求と利便性から生まれたものである。
「オープンソース」が陳腐な言葉と思想に成り下がらないためにも、GPL v3がオープンソースとしての思想的がどうこうというよりも、具体的に、v3が適用されるとどういうことが起こり、どういうことが防がれるのか、という個人ユーザーや個人開発者のレベルでの議論がもっとなされても良いのではないかと思う。

2006年02月01日

●wine

SolarisでWindows用のアプリケーションが動くwineというものを試してみた。VMWAREなどのようにOSをエミュレートするのではなく、WindowsバイナリをUNIXカーネルとの間にAPIとして噛むことで直接実行するというもの。見た目はUNIX上でWindowsのアプリケーションが動いているようにしか見えない。

ダウンロードしてきたwindows用のソフトがUNIX上で動くとやっぱり驚く。
なんか敷居が高そうやったけど、やってみれば意外と簡単やった。Solaris上でInternet Explorerが動いているのは一種異様な光景。
ユーザーエージェントはちゃんとWindowsのIE。おもっきり嘘つきや。
とはいってもFireFoxがあるからIE使う必要性なんかまったくないわけで…SolarisはATOK積んでるからIME走らせる利点もないわけで…
ペイント立ち上げてスライムを描いてみたり、マインスイーパー起動して地雷除去にいそしんだり、ってわざわざそこまでしてやるようなことか?
結局何がやりたかったのか良くわからん…

まぁ、手段を目的にしてしまうところがヲタの真骨頂なわけで、そういう意味では動いたということだけで大いに満足。
今度Windowsのコンピューターウィルスでも調達してきて実行してみよう。どうなるんやろ?ワクワク

2006年01月23日

●『カッコウはコンピューターに卵を産む』クリフォード・ストール

アマゾンでは
発端は75セントだった。研究者のコンピュータ・システムの使用料金合計が75セントだけ合致しない。天文学研究のかたわら、新米のシステム管理者となった著者の初仕事が、その原因の究明だった。どうせプログラムのミスさ、と軽い気持ちで調査するうちに、正体不明のコンピュータ・ユーザーが浮かび上がってきた。―ハッカーだ。誰かがコンピュータに侵入している。しかもこのハッカーは、研究所のコンピュータを足場に、国防総省のネットワークをくぐって各地の軍事施設や基地のコンピュータに侵入し、陸軍のデータベースを読みあさって、CIAの情報にまで手をのばしている。この電子スパイの目的は何か。どこからどうやって侵入しているのか。そしてその正体は?世界中に報道された国際ハッカー事件。そのハッカー相手に孤軍奮闘した若き天文学者がみずから書き下ろした、電子スパイ追跡ドキュメント。
とある。1989年にアメリカで発刊され大ベストセラーになり、日本では1991年に初版が出ている上下二巻組みのなかなか長いノンフィクション。
タイトルにもなっている「カッコウの託卵」はバックグラウンドジョブで実行されることを前提にシステムに仕込まれるトロイの木馬の例え。
古典的「ハッカー話」の代表作であり、俺のような人間はあらすじだけでわくわくするけど、実に面白かった。これはコンピューターに少しでも興味を持つ万人にお勧め。

amazon ASIN:4794204302 もうすでに15年以上の前のシステムの話で、書かれている内容は相当に古い。デフォルトアカウントのまま放置するシステム管理者やメールでユーザー名とパスワードを送るユーザーなどの人的な問題点は時代に関係なく現代でも通用する話というのはもちろんいうまでもない。でもこれは「コンピューターリテラシー」のレベルの話。
当然今ではfixされているやろうけど昔のemacsやviにそんなバグがあったとは始めて知った。古い話なので技術的には特に何もないかと思ったけどそうではない。当時にあったこの本に書かれているのと同じようなセキュリティーホールは依然として残ってる。たとえばsendmailのバグ、fingerなどのinetdから呼び出されるプロセスのバグ。最近全世界を覆い尽くしたNIMDAやCODE-REDの蔓延は15年以上の前の話と何の差異もない。対象OSとポートが違うだけ。ようは「バッファオーバーフロー」の問題。
バッファオーバーフローだけに関していえばワードやエクセルが固まるのとなんら変わりなく特にそれほど深刻な問題ではないけど、そのプログラムがはルート権限で動いていることに問題がある。一般ユーザーの暴走でこうむる被害はユーザー領域だけですむが、スーパーユーザー権限のプロセスが暴走すればそのシステムに及ばず、同じネットワークの傘下にあるすべてのノードが破壊される可能性すらある。
sendmailがrootで動かざること得ないことは散々議論されて対策もある程度は立てられているけど、コンピューターである以上、絶対にroot権限で動かざるを得ないプログラムは必要であり、コンピューターであるということは潜在的にセキュリティーホールの原因を残していることになる。
21世紀になっても依然として「バッファオーバーフロー」の問題が根本的な解決を見ないのは、コンピューターという存在自体のそもそもからその問題を内包しているわけで、それは今のようなノイマン型コンピューターである限り解決されることはないのだろう。セキュリティーホールとパッチ、侵入者と防御者のいいたちごっこは終わることなく繰り返されることになる。当たり前のことやけど、完璧なシステムなんか絶対にありえないということだ。
われわれのような立場の人間には頭の痛い話やけど、この作者も言っているように、「コンピューターネットワークはワイヤーと回路の入り組んだ高度に複雑な装置ではなく、人間の相互信頼と協調の上に成り立つひ弱な共同体」でしかない。
インターネット万能、コンピューター万能の世の中ではあるけど、そんなものは一瞬にして崩れ去る。それでもそこにはいろいろな可能性があるし、現に俺はそのことで職を得ている。
悪いやつひどいやつ無作法なやつは多いけど、それでも本気で何事かを考え、善意で行動する人も沢山いる。
この作者も言うように、その共同体という意味でのネットワークやシステムの善性を認め、侵入者やクラッカーによってその共同体の信頼性が失われれてだれもそれを使用するものはいなくなるということが大きな損失であるととらえる者であるなら、われわれのような立場にある人間は技術的な方面のみでそこに介入するのではなく、その善なる部分を守ることのできる力を持つものという自覚をもってそこに関わる必要があるのだろう。
ここは天国じゃないんだ、かといって地獄でもない。良い奴ばかりじゃないけど、悪い奴ばかりでもない。
といっているだけでは、少なくともわれわれの立場にある人間は駄目なのだ。
そういう意味では啓蒙的な小説といえるかもしれない。

熱中度     ★★★★★
考えさせられ度 ★★★★☆
影響度     ★★★★☆
総合      ★★★★★

2005年12月11日

●リーセント読んだ本プラグイン

amazon ASIN:xxxxxxx
と本文(や追記)に入れると自動でアマゾンへのリンクつき画像を張ってくれるmt-isbn.plというプラグインがあるけど、
その本文や追記内のmt-isbnでリンクされる画像だけをサイドメニューに表示するようなプラグインは探した限りないようだ。
Collectプラグインを使っても本文や追記のデーターにイメージタグが埋め込まれているわけではないので目的は達せない。
無いものは作れ。ということで初めてのプラグイン作成。
っつってもmt-isbn.plを改造しただけやけど…

設置方法:

1 . mt-grisbn.txtをダウンロードし、プラグインディレクトリにmt-grisbn.plとして保存。

2 .

<div class="sidetitle"> Recent Books </div>

<div class="side">
<MTEntries lastn="10" category="本">
      <MTEntryIfExtended>
<a href="<$MTEntryPermalink$>"><$MTEntryMore grisbn="1"$></A>
      </MTEntryIfExtended>

</MTEntries>
</div>

などのように左なり右のサイドメニューのしかるべき場所に挿入。


3 . 再構築

4 . 以上

mt-grisbn.pl仕様:
挿入される画像は横75ピクセルに強制縮小(拡大)
アマゾンへのリンクは作らない。(テンプレートでエントリーへのリンクを作っている)

●mail2entryのハック

moblogを実装するmail2entryなるpythonのスクリプトがあるが、これは単純に画像だけを送るのを目的として作られている。
このままではカテゴリの指定、追記、改行の変換指定が出来ないのでハックしてみた。

mail2entry自体のインストールはweb上に情報がいくらでも転がっているので割愛。
動作自体は送られてきたメールのイメージと本文を分割してイメージを保存し、blogのXML-RPCのAPIを叩いてイメージのリンクを埋め込んだ本文とタイトルとのデーターを送信するというもの。
送信されるデーターにはタイトルと内容しかないので、これを拡張すべく ttp://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.htmlで見つけたAPIの仕様を読む読む。
追記と改行の指定を追加したエントリーのデーターを送信後、エントリーIDを指定してカテゴリを設定する必要があるようだ。
結果、成功したので、土偶オリジナルの改造部分だけを記す。

目標
●携帯やPHSでメールを送信した際に一定の長さ以上の文が自動改行されるので、blogの方では改行の変換をせずに、mail2entryのスクリプト内で連続した二つの改行が投稿時に一つの改行に変換されるようにした。
●指定した文字列(<EXTEND>)以降の分を追記として投稿する。
●カテゴリーを指定する。

改造部分の動作概要は以下の通り。
●pythonでメールの本文をエントリーの「本文」と「追記」を分ける"区切り文字列"で分割。(なければすべてがエントリーの「本文」)
●「本文」「追記」とも二つの連続した改行(\n\n")を"<BR>に変換
●XML-RPCにPOSTするデーター「weblogContent」に「追記」(あれば)、「改行の扱いをどうするか」を追加。
●正常にエントリーが投稿されればそのエントリーにカテゴリーIDをセット

前口上は以上で以下の通りmail2entryの同封スクリプトを書き換えれば動作するかと。


postcategory.py (新規作成)


#! /usr/bin/env python2.2

"""Post a Category"""

# username, password, blogid, publish
from settings import *

#import types
import xmlrpclib

def post(postid):
    """Post a category to a blog.  Return true on success."""

    if categoryid != '' :
        #categories = [{'categoryId':categoryid, 'isPrimary':1}]
        categories = [{'categoryId':categoryid, 'isPrimary':1}]

        server = xmlrpclib.ServerProxy(uri)

        # on success, result should be true.

        result = server.mt.setPostCategories(postid, username, password, categories)

        if result :
            result = server.mt.publishPost(postid, username, password)

    else :
        result = 1

    return result

postentry.py


#! /usr/bin/env python2.2

"""Post a new MT entry"""

# username, password, blogid, publish
from settings import *

import types
import xmlrpclib
import string

def post(content):
    """Post an entry to a blog.  Return postid on success."""


    content.check()
    naiyou = content.getEntry()
    cutichi = string.find(naiyou , kugiri)

    if cutichi == -1:

             naiyou = string.replace( naiyou , "\n\n" ,"<BR>\n")

             weblogContent = {
             'title' : content.getTitle(),
             'description' : naiyou,
             'mt_convert_breaks' : convert_breaks
             }

    else:
             honbun = naiyou[:cutichi]
             tsuiki = naiyou[cutichi + len(kugiri):]
             honbun = string.replace( honbun, "\n\n" ,"<BR>\n")
             tsuiki = string.replace( tsuiki, "\n\n" ,"<BR>\n")

             weblogContent = {
             'title' : content.getTitle(),
             'description' : honbun,
             'mt_text_more' : tsuiki,
             'mt_convert_breaks' : convert_breaks
             }

    server = xmlrpclib.ServerProxy(uri)

 # on success, result should be an integer representing a postid
    result = server.metaWeblog.newPost(blogid, username, password,
                                       weblogContent, publish)

    return result


mail2entry.py


#! /usr/bin/env python2.2

"""Post a new MT entry from a mail message"""

import sys
assert(sys.hexversion >= 0x02020000) # Require Python 2.2 or higher.

import os
import time
import stat
import traceback

def main():
    """"""

    try:
        import parsemsg
        import postentry
        import saveimage
        import postcategory

        content = parsemsg.parse(sys.stdin)

        images = content.getImages()
        if images :
            imageurls = saveimage.save ( images )
            imagecontent = map ( lambda imageurl : imgtemplate % \
                                 { 'imageurl' : imageurl }, imageurls )
        else :
            imagecontent = u''

        entry = template % { 'caption' : content.getDescription(),
                             'imagecontent' : "\n".join(imagecontent) }
        content.setEntry(entry)

        result = postentry.post(content)

        if result :
            postid = result
            result = postcategory.post(postid)


    except:
        lfo = open(logfilepath, "a")
        lfo.write(time.strftime("%Y-%m-%d %H:%M\n\n"))
        traceback.print_exception(sys.exc_info()[0], sys.exc_info()[1], \
                                  sys.exc_info()[2], 100, lfo)
        lfo.write("--------------------------------------------------------\n")
        lfo.close()

        result = None

    return result

def usage():
    """"""
    print "mail2entry.py profile-directory"

if __name__ == "__main__":
    # finding and loading things from settings.py
    if len(sys.argv) > 0:
        settings_path = sys.argv[1]
        settings_abspath = os.path.abspath(settings_path)
        if os.access(settings_abspath, os.F_OK):
            sys.path.insert(-1, settings_abspath)
            from settings import *
        else:
            print "Path error"
            sys.exit(1)
    else:
        usage()
        sys.exit(1)

    main()

setting.py に以下を追加。


#投稿するカテゴリーID
categoryid = 1
#「エントリーの内容」と「追記」を区切る文字列
kugiri = "<EXTEND> "
#記事本文の改行の扱いをどうするか 0なら変換なし、1なら変換。
convert_breaks =0

しかしソケット(ソラリスやしデータグラム?)プログラムを作るのにも簡単になったねぇ。