Linux Gazette 2003年1月号 #86
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
nアンデリーションの経験
nコンソール障壁を破った
n EcolNet とescomposLinux.org プロジェクト
n コンピュータ馬鹿話
n 百科事典をe-メールする方法
n PHP Superglobalsを用いるセキュリティ
n Perl 今月の一行プログラム−悪辣なSpambotの事件
n Rubyによるプログラム作成 - Part 3
n Debian APT パート2:未リリース・ソフトウエアのインストール
n TCPdump とTetherealを用いるTCP/IP 検討
n vmWare はLinux ユーザに役立つか?
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
ElcomSoft 無罪

デジタル・ミレニアム著作権法 Digital Millennium Copyright Act (DMCA)最初の刑事裁判が無罪判決not-guilty verdictの結果となった。本件の歴史は、Dmitry Sklyarovと言う有名なロシア人プログラマがラスベガスのDefconに参加中に逮捕された2001年7月に遡る。彼は、Adobe ebookフォーマットを用いて作った文書上の著作権保護を削除することの出来るプログラムに関しソフトウエア会社ElcomSoftのための仕事を通じて有名だった。DefconでのSklyarovの発表は、このebookフォーマットによる保護の弱点を主題としていた。
Dmitryの監禁は3週間続いた。続いて週6ヶ月間米国に止まることを要求され、その間に各種法的問題が詳細に検討された。結果は、Dmitryの不起訴だった。代わりに、その雇い主ElcomSoftが告訴されたので、Dmitryは法廷証言のため米国に戻らざるを得なかった。これら一連の事件で、世論はDmitryの苦境に同情的で、これがAdobeが本件から一歩引く姿勢を取る要因となったようだ。それでもAdobeはDMCAの強力な支持者strong supporterで刑事告発を擁護した。
今の証言に至る間に、DMCA法の憲法問題に基づく先制告発を止める試みをしたが失敗した。これらの意見は、言論の自由(著作権物質の第三者による公正使用の権利を含む)の確認及び、法が違憲とするにはに曖昧であるとの申し立てに基づく。Ronald Whyte判事は、これらの動議を2002年5月に却下したdismissed these motions。判事は、コンピュータコードが言論の自由であると認めたけれども、DMCAは内容が灰色で、コンピュータ・プログラムを、その内容より目的に基づいて扱っていると断定した。また、DMCAでは、多くの使用が難しくなるとは認めながらも、公正使用は阻害されないとも判決した。この判決は、2002年のIP事件に関する評論 review of IP cases in 2002でLewis Claytonが指摘したように、DMCAの重要な勝利であり、法の妥当性を強化する。
ビザと米国務省に伴う困難があったが、DmitryとAlex Katalov(ElcomSoftの最高責任者)は審理のため2002年12月に結局カリフォルニアに渡ったfinally travelled to California。証言の謄本はオンラインで入手出来る available online.ようになった。加えて、Lisa Reinが裁判進行状況を詳しく報じた reporting on the court proceedings。審理の重点は、ElcomSoftが故意に法律を破ったか否かであった。陪審員の意見は、ElcomSoft製品がDMCAに違反したかも知れないが、その侵害が明らかになるまで、製品を頒布しなかったと言うものであった。製品を率直な方法で頒布したことがこの印象に役立った。陪審員はまた、DMCAのembookフォーマットへの適用に本質的なユーザ権利の厳しい制限には困難を伴うhaving difficulties と報告した。
評決の帰結は明らかでなかった。Don Martiは、これは偉大な肯定的発展hugely positive developmentで、連邦検事はElcomSoft告発の失敗に鑑み、別のDMCA刑事事件の試みを躊躇うだろうと考えている。Linux Weekly Newsは余り楽天的でなく less upbeat、これは主としてElcomSoftにとっての勝利だと考える。DMCAは「最後には勝っても高価な訴訟費用と逮捕」に通じることを示したことが重点だと指摘する。しかしDMCAの市民法条項もまた、DMCA弁護が高価であるとの障碍と、このような訴訟に何時持ち込むかは告訴人の決定に任されることが、小会社の活動を不自由にするため使われる。
以下は、メディアの本件を報じる報道を、ほぼ無作為に時系列で並べたものである。
   * 政府はハッカーの審理を厳しくGov't tightens its case in hacking trial [ZDNet]
   * ElcomSoft におけるSalvosの公開Opening Salvos in ElcomSoft Trial [Wired]
   * ElcomSoftプログラマ証人席へ ElcomSoft programmer takes stand [SiliconValley.com]
   * 私はハッカーではないとSklyarovが米国法廷で述べる'I'm no hacker', Sklyarov tells US court [The Register]
   * 審理はebook に海賊行為なしと言うTrial told no proof of ebook piracy [Reuters]
   * 弁護ElcomSoft 著作権審理にDefense rests in ElcomSoft copyright trial [SiliconValley.com]
   * 証言はAdobe ハッカー行為審理で終わるTestimony ends in Adobe hacking trial [News.com]
   * 陪審員はElcomSoft 事件でDMCAを精査 Jury scrutinises DMCA in ElcomSoft case [The Register]
   * ElcomSoft 陪審員が法文を要求ElcomSoft Jury Asks for Law Text [Wired]
   * ElcomSoft 評決:無罪ElcomSoft verdict: Not guilty [News.com]
   * 企業がデジタル著作権課金を値切るFirm beats digital copyright charge [Detroit Free Press]
   * ElcomSoft はDMCA 事件で無罪と判明ElcomSoft found innocent in DMCA case [2600]
   * ソフトウエア。ハッカー1、DMCA 0 Software Hackers 1, DMCA 0 [Tom's Hardware]
   * 評決はDMCAに打撃かVerdict Seen As Blow to DMCA [Wired]

DVD Jon
Jon Johansenは、ソフトウエア開発に従事したお陰で先月法廷に引き出されたhas found himself in court若者だ。Jonの事件は、このノルウエー人の若者がDeCSSプログラムの開発に参加した3年前に始まった。DeCSSの目的は、DVD映画を、LinuxなどDVD再生ソフトウエアを持たないシステム上で再生出来るようにすることであった。JohansenはDeCSSソフトウエアに深く関係していたが、その開発では大したことのない協力者 minor collaborator に過ぎないと強く主張したhe is keen to point out。しかし、プロジェクトの他の協力者は不明のままだったので、Johansenがノルウエー法廷で刑事責任を問われる羽目になったfacing criminal charges
Jonは、2年まで収監される筈だったが、裁判費用US$1400及び彼のコンピュータが有罪であるとの自白 payment of US$1400 court fees and confiscation of his computers とともに検事は3ヶ月の執行猶予3 months probationを求めた。Jonは強力に無罪を主張したdefended his innocence。検事質問Prosecution questioning は、DVD海賊行為のためのDeCSS使用に焦点を当てている focusedようであった。Johansenは、DeCSSをある種の海賊行為に使うことは出来るけれども、DeCSSがなくとも海賊行為は幾らでも出来るし容易いと反論した。DeCSSの主な目的は、顧客が合法的に購入したDVDの再生である。評決は2003年1月に予定されている。
この事件は、DeCSSを抑圧するため米国で起こされた別の事件と関連させる価値がある。Cryptomeには、EFFのようにas does the EFF、これらの事件に関係する沢山large numberの文書がある。特に興味があるのは、ニューヨークDeDSS審理の際のJon Johansenの証言である。ここで、彼はこれら事件の背景を多数示した。Jonの審理は、実際のソフトウエア開発とDVD上の保護の破壊に関するけれども、NY審理の事件においては、問題は単にDeCSSのインターネットへの接続であった。多くの人がこれら過酷な告発に強く反対し、新規の賢明な調和的DeCSS頒布方法distribute DeCSSにより法律を嘲笑った。一例は、これもまた優れたDeCSS実行可能プログラムであるPhil Carmodyの多数出版 publication of a prime number である。これはDeCSSソースコードを含む最初の「不法」プライムfirst "illegal" prime にしたがっている。

● イエスメン
DMCAはまた努力の末、イエスマンThe Yes Menと呼ばれる風刺的な詐欺師を黙らせる用途を見出したThe DMCA has also found use。www.dow-chemical.comにあるパロディウエブサイトは、20,000人の死者を出したインド、ボンベイのユニオンカーバイド災害の18年前の遺物に注意を引くため構築された。ユニオンカーバイドは現在、ダウケミカルの一部になっている。悲劇の18周年に、ダウを装い、ダウが死傷者に対する責任が取れなかった理由を述べたインチキ新聞発表が発行された。
 
「怒りと悲しみは理解する」とダウのスポークスマンBob Questraが言った。「だが、ダウは責任を認めることも取ることも出来ない」。もしそうしたら、数百万ドルの清掃費用と補償を請求されるだけでなく、更に悪いことに、大衆はダウが別の大事件の先駆者と指弾するだろう」

ダウの反応は怒りの一つで、サイトの上流プロバイダverio.comに手紙a letterを送り、ウエブサイトの削除を要求した。この連絡がDMCA侵害の通告に役立ち(パロディは元もダウ・ウエブサイトからロゴとデザインを使った)、これでVerioが直ちに対策を取るのを余儀なくさせる効果があった。Verioは、ISP徒党を目指すYes Men向けのニューヨーク活動家Thing.netに対するサービスを撤回した。この処置は、無関係の芸術ベース・ウェブサイト一定範囲の運営を同時に停止させた。その結果、Verioは、Thing.netは60日以内にwithin 60 days別のプロバイダに位置換えしないと、サービスを終了すると通告する役目を果たした。

サービスプロバイダを威圧すると同時に、ダウは、www.dow-chemical.comドメイン名の管理を取り上げるのに成功した(つまり、愚か者がDOW最高経営者の息子James Parkerの名で登録していたのが自分の所有になった)。それでも、このウエブサイトは沢山のミラーで見ることが出来る。今のミラーThe Yes Men's account of eventsで見付けることが出来る。元の新聞発表も含まれている。

 

 
 
 
▼▼▼一般ニュース▼▼▼
iCanProgram
iCanProgram courseには未だ参加の余裕があるstill available。iCanProgramは数年前に始まったが、「癌研究寄付の代わりに無料」のオンライン・プログラマ訓練コースを提供している。2002年コースには1500名を超える学生が参加した。

GFDD
Debian Weekly Newsは、GNUtemberg!無料文書データベースGNUtemberg! Free Documentation Database,つまりGFDDの「安定」立ち上げを報じたreported on the 'stable' launch。GFDDは無料文書用無料データベースで、索引、翻訳、管理、公刊に関する情報、文書関連付け、統計及び検索などのサービスを提供する
 
Galuna S.R.L.
Galuna S.R.L.は、ルーマニア・ユーザのため、Linuxのサポートと改良を狙っている。この会社は、GNOMEデスクトップ環境の主要部分を翻訳してマイクロソフト製品からLinuxに移る新規ユーザを支援する。コスト及びルーマニアでは極めて高いソフトウエア海賊行為の比率をを軽減する。
オープンソース・ソフトウエアの利点からクライアントの利点を高品質レベルで支援するため、Galunaは、スタンダードとカスタムの両ソリューションを提供する。Linuxの利点と利用可能なアプリケーションについては、 http://www.galuna.ro/ を訪ねられたい。

IBM が新規Linux 対応新規eServer システムを出荷
IBMは、Linux 対応新規eServer pシリーズシリーズの出荷を発表した。IBMは、POWER4プロセッサを搭載した新規サーバーシステムは、似たように構成されたHewlett-Packardのfrom Hewlett-Packard Itanium 2ベースのシステムより遙かに費用が安いと主張している。
 
rpmseek.com - 新規rpm 検索エンジン
新規Linux移植可能http://www.rpmseek.com/は、Linux OSのユーザにrpm パケージ用簡便検索エンジンを提供すると言う。このパケージは、パケージ名、ファイル名、ディストリビューション、キイワード、従属性又はそのパケージに含まれるファイルなど、各種カテゴリで検索することが出来る。パケージ間の従属性は、相互参照により解決される。
各rpmパケージについて、数多くの詳細説明が集めてあり、ダウンロードのため各種ミラー・サーバーへリンクが地理的な順序でリストされている。別の特徴は、rpmパケージすべてをカテゴリ別に分類したことだ。この方法で、特殊ソフトウエア型又は機能性をカテゴリのツリー構造体をブラウズにより見付けることが出来る。サイトにはまた、広範囲のドキュメンテーション及び討論グループの提供を狙っている。
 
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
Debian
The Debian Projectは、現在の安定リリース(Woody)をDebian GNU/Linux 3.0 updated (r1)に更新したupdated。この更新は、幾つかのパケージの容認と却下acceptance and rejectionが関係した。レギュラーregular及び非米non-USブランチ双方に関する変更の全体リストはオンラインで見ることが出来る。

Debian Weekly News はapt-get.orgがオンラインで走っていると報じたreported。これは非公式APTレポジトリのリストを保持している。


Debian Weekly News はまた、Debianをカスタマイズする人の何か用途がある二つのリソースもまた強調しているalso highlighted。新debianインストーラに基づいたCDイメージ構築用スクリプトscripts、Martin Sjo:grenが利用出来るようになったhas made available。これは小さいCDイメージをまとめるputting togetherのに役立つ。また、面白いのはClemens Leeが書いた「 How to Create Your First Debian Package」と言う題名のミニ入門書である。これは、インストレーション用Debianパケージを、公式Debianアーカイブに含むためでなくinclusion into the official Debian archives、自分のコンピュータ上で作る方法を説明している。


DesktopLinux はDebianデスクトップ・サブプロジェクトのColin Waltersとのインタビューinterviewを公刊した。


DebianPlanet は、Debianを用いてSargeからWoodyにダウングレードする手順downgrading from Sarge to Woody with Debianを説明した記事を公刊した。

Mandrake
先月MandrakeSoft は、事業の将来を脅かし兼ねない経済的苦境を公表した publicised financial difficulties。多くのユーザがMandrake製品を買って経済的に助けてくれるか、又は会社に直接投資するよう訴えている。商業ライセンスの導入introduction of commercial licences が、大きい収入源を作るのに役立つことを願っている。Mandrakesofは苦境にあるけれども、フリー・ソフトウエアからの撤退は表明しない。
 
Rock
ROCK Linux 1.5.20がリリースされた released.
 
Slackware
ユニックスレビュー by Unix Review とディストロウォッチ by Distrowatchが最近Slackwareを見直した。
 
SuSE
SuSE Linuxは最近、ドイツの都市Schwäbisch Hall(人口36,000人)が、そのITインフラストラクチャ全体を、もっと高いWindowsに代えて、SuSE-Linuxで構築すると発表した。この町はSuSE LinuxをIBM Intel-ベースのサーバと同時に400台までのPCS上で展開し、Windowsより百万ユーロ以上を節約する。
 
Xandros デスクトップ
DistroWatch はreview of Xandros Desktop 1.0を公表した。
 
 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
ActiveState PureMessage: e-メール保護
e-メール・ゲートウェイ・フィルタ・システムの生産者ActiveState Corp.は、抗迷惑メール、抗ウイルス、及びポリシイ一致ソリューションであるPureMessage 3.0 (以前のPerlMx)をリリースした。PureMessage 3.0は、迷惑メール識別及び管理自由度を強化したウエブベースの管理コンソール、任意選択のユーザ検疫管理、次世代抗迷惑メール発見法及びMcAfee抗ウイルス・エンジン含む新特性を持つITアドミニストレータを備える。この製品は中規模から大規模の組織を狙っている。
 
SCO UpdateUnixWare 7.1.3
The SCO Groupは、SCO OSの更新手順をもっと効率よく低コストにすると言うSCO Update Serviceの立ち上げを発表した。このサービスは、SCO Linux 4.0、UnixWare 7.1.3 及び来年初めに出荷するとには SCO OpenServer 5.0.7に利用することが出来る。
Update Serviceは、新技術の展開及び展開済みシステムの更新維持を簡単でスマートにする。このサービスは、OSの変更を電子メールと郵便で通知し、システム管理者に更新手順の管理を与え、顧客がシステム更新費用の予算を正確に立てるのを助ける。
 
Farpointer
Farpointer Technologies は、 Apache サーバー用新規自動化セッション管理ツールを発表した。会社のiコンダクタ・サーバー・モジュールiConductor server moduleがHTMLファイルと相互作用し、URLを通じて自動的にセッション追跡を実行する。加えて、iコンダクタは、簡単なキイ/値と同時にウエブ・サービス要求及び応答など複雑な文書も管理する。これらの特徴は、インターネット−ベースのアプリケーション構築に当たって開発者の時間を著しく短縮する。iコンダクタ無料体験版はオンラインで入手することが出来る。
 
個人使用無料のCylantSecure
lINUXサーバー・プラットホーム用ホストベース侵入阻止システムCylantが、個人使用無料で最新版CylantSecure (2.0.2) を提供中と発表した。
 
ProjectForum
ProjectForumは、柔軟ワークグループ協力及びウエブを通じるプロジェクト協調のためのソリューションを提供する。プロジェクト立案、行動リスト、決議覚書、業務割当、会議覚書、問題点報告、チーム討議、意見徴集、研究、ブレインストームなどなどに使うことが出来る。バージョン1.1(最初のリリース)は、Linuxと同時にWindows、MacOS X、及びFreeBSD用のバージョンを、今、入手することが出来る。
 
ActiveStatePerl 開発ポートフォリオを更新
ActiveStateは、そのPerlツールと言語ディストリビューションPerl Dev Kit (PDK) 5.0、Visual Perl 1.7、及び ActivePerl 5.8の新規リリースを発表した。Perl Dev Kitの特徴は、Perlアプリケーションの構築及び展開用ツールである。Visual PerlはVisual Studio .NET用Perlプラグインである。ActivePerlは、ActiveStateの品質保証Perlディストリビューションで、 Linux、Solaris、及びWindowsに利用することが出来る。
 
大型IDE ドライブの迅速ハードウエア・バックアップ
低コストIDEミラー(raid)ハードウエアのプロバイダArco Data Protection Systemsは、The DupliDisk3のリリースを発表した。DupliDisk3は、データとソフトウエアの1分以内バックアップの維持を容易にする。DupliDisk3は、Windows、LINUX、Macintosh 及びDOS OSをサポートし、ハードドライブの正確にブート出来る複製を作って働く。ソフトウエアは131ペタバイト(131,072 テラバイト)の大きさで、48ギガバイト/時(800Mバイト/分)までの速度でコピイを作る。
 
今月のニュース新編集者はマイク

[Picture]数年前アイルランドで生まれたMichael は現在ダブリン大学機会工学部で博士論文執筆中。論文の題名はLamb波の非破壊検査における使用。GNU/Linuxはこの仕事に大変役立つので、Michaelは、工学の別の問題にも無料ソフトを利用することに強い関心がある。論文が完成したら、徒歩旅行に出る予定。

 

Copyright © 2003, Michael Conry. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
アンデリーションの経験
By C.E.C. Artime and J.A. Baro
 
ext2ファイルシステムから不本意で削除したデータを復元する試みを説明する。出来事の経過は全く望ましくなかったのを承知されたい。読者が、同じことをされないようにし、難局から学ぶことが出来るよう、事態の詳細を述べる。
 
序曲:惨事の到来
舞台
ハードウエア
名がFish とBellのボックス二つ。Fishは、Sun E250。Bellは、Pentium 3 (450 MHz)。これらは同じ.イーサネット・サブネットワークにある。
ソフトウエア
Bell は、2.2r7から楽に更新した後Debian GNU/Linux 3.0r0 を走らせる。Kernelは、Linux 2.4.18。
Fish もまた、Debian 3.0r0、port Sparc64を走らせる。2.2r7からの最近の更新に珍しい問題があった:XFree が通常ユーザ用に働かなかった(ルート用には働く)。Kernelは、Linux 2.4.18-SMP。
ファイルシステムは全部ext2。
ダメになるまでの様子
Fish上で、Xfree はルート用に働くが、通常ユーザ用には働かない。
原因:パーミッション又はユーザ・コンフィグレーション・ファイルの何れか
対策:ユーザを追加し、ルートのドット・ファイルをそのホーム・ディレクトリにコピイする:
 
root@fish# adduser judas
Enter new UNIX password:
Retype new UNIX password:
root@fish# cp --recursive /root/.[a-zA-Z]* /home/judas
root@fish# chown --recursive judas:judas /home/judas/.*
 
[cp用とchown用のregexpの間の相違を見分けられただろうか?]
 
何度も試行錯誤の後、X 問題は結局解決した。ユーザを削除する時機だった。
手順の速度を少し上げようとしている間に、マニュアルを調べてオプションを見付けた:
 
root@fish# deluser --remove-all-files judas
 
ここで、災害に入った!不運なオプションがディスク全体を妄想で検索しjudasが所有するファイルを探して消去し始めた。
 
/home の内容が消えてしまった。
二分経って、それに対応するデバイス(/dev/sda8)を取り外した。
 
バックアップ
最初の試み
最初の治療には不運なデバイスの生バイトのコピイを取ることがある。
Fishには余裕がないので、Bellのハードドライブにコピイを作る:
 
root@fish# ftp bell
ftp> put '|dd if=/dev/sda8' fishbackup
 
事実、このステップはそう楽ではなかった。大型ファイルの転送が暫くすると中断するとの、ネットに伴う問題があるからだ。ファイルを分割しなければならない。パーティション/dev/sda8のサイズは、10142 MiBだ。
GNU シェル・ユティリティのファクターツールの助けを借りて:
 
root@fish# factor 10142
10142: 2 11 461
 
これでデバイスの各切れ端が適切な大きさになる。
 
抜け道を確保
次のステップでは、FTPの代わりに、OpenSSL スーツを使った。
バッチモードを使うため、先ずパスワードを交換した:
 
root@fish# ssh-keygen
artime@bell$ ssh-keygen
root@fish# scp /root/.ssh/identity.pub artime@bell:/home/artime/.ssh/authorized.keys
root@fish# scp artime@bell:~/.ssh/identity.pub ~/.ssh/authorized.keys
 
このスクリプトをFishで実行する:
 
#!/bin/sh
for i in $(seq 0 460)
do
 dd if=/dev/sda8 bs=$((2*11*1024)) skip=$i of=fula
 scp --batch fula artime@bell:~/fiback.$i
done
 
断片をBellで合わせるだけ:
 
for i in $(seq 0 460)
do cat fiback.$i >> fiback.raw
done
 
Fishで次を実行すれば、同じことを1ステップで行うことが出来る:
 
#!/bin/sh
for i in $(seq 0 460)
do
 dd if=/dev/sda8 bs=$((2*11*1024)) skip=$i | ssh artime@bell "cat >> fiback.raw"
done
 
失ったデータの捜索
次のものの助けを借りることが出来る:Aaron CraneのLinux Ext2fs undeletion mini-HOWTO、Tomas Ericssonの Ext2fs undeletion of directory structures mini-HOWTO、Tom Pyckeの recover プログラム、Torsten Wernerのi386上で働くdebugfs のためのパッチ。
 
不精な試み
Recover は、個別ファイル復元用のツールだ。我々の場合は、既に数百のファイルを失っているので、これで始めるのは賢明でない。最も直接的な方法は、Wernerのdebugfsパッチを使うことだ。壊れたファイルシステムのコピイを既にi386ボックスに記憶して持っているので、twerner.debian.orgで見付かるバイナリを使うことが出来る:
 
artime@bell$ ./debugfs fishback.raw
debugfs> restore
debugfs> quit
artime@bell$ mkdir mnt
artime@bell$ mount -t ext2 -o loop fishback.raw mnt
artime@bell$ ls -l mnt
 
ここには何もファイルがない!/dev/sda8を取り外すのが少し遅過ぎたようだ。T. Wernerが自分のペイジで言っているように、彼のツールは、未だ名前のあるファイルを復元するだけだ。
 
読むに値する
Craneのアンデリーション方法
The Linux Documentation Project から取ったこのツールは、喪失ファイルのinodes(多かれ少なかれ位置)を見付ける方法と、debugfsのdumpコマンドを使ってそれらを復元する方法を教える。同じディレクトリに沢山のファイルを詰め合わせて終わるが、これらは削除されたものの小さなサブセットだけだ。前述のように、この方法で示された徹底的なファイル毎の復元計画を我々の場合に実現することは出来ない。
 
Ericssonのディレクトリ・アンデリーション方法
ここで、削除されたファイルの間でディレクトリから問い掛ける方法を学んだ。その指示に従った。
セクション7のスクリプトが、将来我々のdebugfsに適応させるため必要だった。
 
#!/bin/sh
awk '{ print "mi <" $1 ">\n"\
       "\n\n\n\n\n\n\n"\
       "0\n"\
       "1\n"\
       "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" }'
 
兎に角、ディレクトリ名を見出してセクション8に進むのには失敗した。そこで、別の場所を探さなければならない。
 
マニュアル・ペイジ
最後のチャンスは
 
$ man debugfs
 
だった。ここでハウツーにはなかったコマンドrdumpを見付けた。以下のスクリプトをExt2fs Undeletion of Directory Structures mini-HOWTOのセクション6のlsdel.out に置かれたディレクトリinodeに適用して:
 
#!/bin/sh
awk '{ print "rdump <" $1 "> folders\n" }'
 
殆どのディレクトリがディレクトリ・フォルダの中に回収された。だが名前がない!そこで最後に、その内容を見て二百個のファイルをユーザに個別に割り当てなければならない!その後でさえも、幾つかのファイルを、特にe-メールボックスで、見失った。人手で探索しよう:
 
$ strings fishback.raw | grep -B1 -A99 "To: lisistrata" > lisistrata.mbox
 
終幕
追加して概略を述べたいことがある。
 
素晴らしいマニュアルがあるのでそれを読むこと
そして、最初は新しいオプションを決してルートとして使わないこと。
 
磁気テープ
Fishには磁気テープ装置がある。GNU mt とtar は、バックアップ計画に有用なツールだ。Aaron Craneのハウツーにはこの問題に関する面白いリンクが含まれている。
 
規則的表現
シェルコマンドで規則的表現を使うのは、ドット−ファイルを使うときは特に、極めて危険だ。多分、スーパーユーザ・ルートは、シェルを限られた(「拡張」ではなく)規則的表現サポートで使うべきなのだろう。eshを考えている。
 
PDA
この記事は、グランカナリア島で開かれたやや珍しい無料ソフトウエアPDA、Agenda VR3でほとんどを書いた。
 
著者紹介
○C.E.C. Artime は、2000年以来のGNU ファンで無料ソフトウエア主唱者である。
○ J.A. Baro は、1996年以来のLinux ユーザでPerlハッカーである。
 
Copyright © 2003, C.E.C. Artime and J.A. Baro. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
コンソール障壁を破った
By Stephen Bint
 
DOSとLinuxの制御下にあるカラーテキスト、キイボード、マウス
Linuxを使い始めたとき、Linux テキスト・エディタは下らないと思った。マウスサポートが殆どないか又はない、シフトセレクションがなく、メニューもファイル・オープン・ダイアログもない。そこで、DOSエディタに結合させた特性すべてを有するエディタをLinux用に書けば、役立つと考えた。 良いOSにエディタがあって悪い事はない。
 
そこで、両方のプラットホームにカラーテキスト・モードでインターフェイス出来るライブラリを探して、Slangとcursesを見付けた。プラットホームの巨大なリストに対してインターフェイスを作るには、Linuxコンソールにある沢山の特性を無効にしなければならなかった。また、それらは大き過ぎて自分の必要にカスタマイズして修正版を自分のソースに結びつける見通しも立たなかった。いら立って自分で書くことにした。
 
ctrl-キイとalt-キイの出来るだけ広い範囲の組合せ、シフト状態を知らせる機能、ctrl-キイとalt-キイ、完全マウス報告(動きを含む)、EGA-スタイル・カラーペアの画面アレーに対する直接アクセスを持つインターフェイスを作るとの目標を立てた。プログラマが自分のソースに結びつけて、望み通りに修正し、自信を持って配布することが出来るよう、充分小型で簡単なものを作ろうと思った。
 
マウス
マウスのためのプログラム作成は、比較的容易だった。DOSの下で、int86とRalf Brownのインタラプト・リストだけを使っていら。Linuxの下では、暫く格闘して、結局、ドキュメントとしてもデモ・プラグラムとしても大変良いgpmマウスドライブをマスターした。
 
画面
Linux画面にカラーテキストを出力する方法には、もっと格闘した。Linux Gazette の「色がお好き」"So You Like Color!!!"と言う名の記事(#65)に助けられた。彼の言ったことにショックを受けた。
 
文字と色がバイト対として同時にビデオメモリに書き込むDOSと異なり、Linux画面はfwriteを使ってリフレッシュされてstdoutに書き込む。色が各文字と一緒に書き込まれる代わりに、文字の色が前の色と違うときはいつでも、出力色を変更しなければならない。出力色の変更には、stdoutに対する11-バイトの書込が含まれる。
 
その結果、Linuxの下では画面リフレッシュが大変遅い。スピードアップの方法を考えた。画面がリフレッシュされるとき更新される二重の画面バッファを保持した。これを画面バッファと比較して、変更された画面部分のみをリフレッシュした。そうしてもLinuxでの画面リフレッシュには、DOSの20倍の時間が掛かった。
 
/dev/vcsaをファイルとして開くことによりLinuxの現行版でビデオメモリにアクセスすることが出来る(詳細はマニュアルVCSを参照)。これをしない理由は二つある。第一に、これは上位ユーザが走らせるプログラムだけに許されていること。第二には、US ASCII文字だけをサポートしていることだ。少なくともfwriteでは、ローカル文字セットだけが重んじられている。これは重要である。Linuxは、大きく暖かい心に対するその親しみ易い画面から、国際的なものだからである。
 
SlangソースとSlangで結合され良いプログラムを検討することにより、テキストカーソルを示し、隠し、位置決めをするunticと言う方法を見出した。unticは、terminfoデータベースを読み取って人の読めるフォーマットに翻訳する。(terminfoデータベースは、任意のターミナルで制御作用を実行するためstdoutに書き込むコマンド・ストリングを含む)
 
一寸した面倒があった。Unixの下では、ボックス描画文字は、規定値文字セットの一部ではない。DOSの下でボックスを作るASCII値は、stdoutに文字列を送ってalt文字セットに切り替えない限り、Linuxの下では変な文字を作る。この文字セットへの切り替えは、恒久的にオプションではなかった。このライブラリがLinuxのように国際的で、国際文字セットをサポートすると良いと思った。それにはどうするか?
 
カラー・バイトのハイ・ビットをボックス・ビットとして使うことに決めた。ボックスを書きたいプログラマは、ボックス色として示したい文字のための色にボックス・ビットを設定しなければならない。これは、点滅文字は得られないことを意味する。ハイ・ビットは別途そのために使われるからだが、幸い、テキストの点滅は嫌いだった。
 
キイボード
両プラットホームのキイボード・イベント解釈は、stiltsで悪夢だ。DOSの下では、BIOSスキャンコードが非論理的に割り当てられており、乱数のようになっている。Unixの下では、ターミナルを空間的に準備して、ルックアップ表を通じてスキャンコードに転換する必要のあるバイト列をファンクションキイが作る。
 
LinuxキイイベントのDOSへの転換又はその逆は、ほとんど想像も付かなかった。代わりに、controlやaltの影響は受けないでshiftが押されたときシフトする、純粋のキイファンクションを作る決心をした。ホットキイのためctrl-キイ又はalt-キイ組合せを使いたいプログラマは、キイボード状態ワードを別に調べることが出来る。
 
DOS キイボード
2バイトDOSスキャンコードが、変動しないキイIDとしてハイ・バイトを使い、shift,、control又はalが押されたか否かに左右されるASCII値のためロー・バイトをうのを望むことがある。残念乍ら、古いXTキイボードとの互換性を保つ必要ため、ハイ・バイトはロー・バイトと同じ位変動する。悪いことに、キイが異なるとcontrol 及びaltに対する反応も異なる。時間の掛かるスイッチブロックを避けるため、私は "if" テストの絡まりを作って、ctrl及びaltを押したスキャンコードからの独自性を篩にかけた。
 
次に、shiftを押し続けると、DOSの下ではnumlockの意味が逆転するが、Linuxではそうならないのを見出した。こんな変なことを無効にするため私のキイ純化法を更に複雑にしなければならなかった。だからnumlockは何であっても数字を意味する。こうしてDOSを征服し、Linuxキイボードの恐怖に対決した。
 
Linux キイボード
その規定値状態では、Linuxキイボードは会話的プログラムに全く適さない。fgetc()ファンクションは、リターンを押すまでリターンしない。この時、文字列全部を直ちにリターンするので、カーソルを矢印で動かすことは出来ない。これは、画面に文字をエコーし、ctrl-z、ctrl-q及びctrl-sはすべてインタラプトを発生する。これは悪夢だ。
 
fgetc()の使用を避けて、キイボードをローモード(純粋スキャンコード)に滑り込ませることを望んだが、gpmマウスドライバが選択の余地を与えなかった。これはキイボードとマウスの両方からイベントを読み込む単一ファンクションを与えるので、キイボード部分がfgetc(stdin)を使う。マウスのみ呼出し機能があるが、働かせることが出来なかった。
 
今ではそれを喜んでいる。それ以来 fgetc() が、配置と多分スキャンコードも違う外国キイボードと同じであるらしい、高レベル・キイコードを受けることに気付いたからだ。不可欠なものとしてバイト文字列をスキャンコードに転換することから手を引いたところ、DOSの下でBIOSスキャンコードを扱ったのより易しくなった。
 
Slang ソースを調べてターミナルの設定方法を見出した。人は、tcsetattr()と言うファンクションを使って、フラッグと値をターミナル制御構造体に設定する。だから、文字をエコー無しで直ちに戻し、ctrl-z、ctrl-q 及びctrl-sを普通のキイとしてあつかうようキイボードを固定した。
 
未だkbhit()ファンクションも、シフト状態(ctrl、alt又はshiftが押された否か)を読み取る方法もない。Googleが、Linux Gazetteに"Taming the Linux Keyboard"と言う記事を載せた(2002年3月号 #76)。これらが両ファンクションを、全ソースコート付きで示してくれた。
 
最後の試練
未だ悩みの種は残っている。些細なことに見えるだろうが、私に取っては大変だった。乗り越えられない障碍と思われ、白状すると、諦めようと思った。
 
DOSエディタ上では、カーソル移動キイを使いながらshiftを暫く押すと、ペイジのアップ・ダウンを含めて、テキストの選択が出来る方法をご存知だ。さてLinuxの下では、scrollbackと言う無意味なファンクションのためshift-PageUpとshift-PageDownが逆になる。これは、shift-PageUp/Downが押されたとき、アプリケーションはfgetc()から何も受け取らないことを意味する。kernelがこれらのキイを外してもプログラムには絶対に分からない。
 
青くなったのはこれだけではない。数週間の苦労の後、ユーザがshift-PageUpを使ってテキストを選択しようとすると、カラー・テキスト画面の半分が消えてしまう−スクロールバックする−のを見出した。
 
ここではライブラリを開放する方法はない。数千頁の小説を読んで、最後の頁がないのに気付いたような気がした。マニュアルと情報ファイルを繰り返し読んで、探したが無駄だった。そこで、前述の記事から手に入れたshift_state()ファンクションが、その魔術を働かせるのにioctl()と言うファンクションを使って居るのに気付いた。
 
"apropos ioctl"を使ってマニュアルを探し、"console_ioctls"と言うものを見付けた。そこで、ioctl()はDOSインタラクト呼出のLinux同等物であるこをを発見した。同じマニュアルに、低レベル呼出の完全リストと、これらは保証されておらずkernelの将来版では変更されるので決して使わないこととの、Kernelプログラマからの警告が示されていた。
 
だが、プログラマがこんなことを言うとき無視して良い事は皆が知っている。責任逃がれをしているだけだ。
 
リストの中に、キイ関連のファンクション−PageUpとPageDown含む−を変更するものを見出した。どのテーブルに、どのキイとどのコマンドを割り当てるかを示す三つの整数で、structを満たすことが含まれていた。問題は、shift-PageUpに関するスクロールバックを無効にするため、これらの数字が何であるべきかを示す文書がないことだった。
 
更に検索すると、kbdペイジが姿を現した。これには、偉大なドキュメントと、キイマッピング変更のためのユティリティが沢山含まれている。dumpkeysを走らせて現在のマッピングをstdoutにダンプすることが出来る。以下に私のdumpkeys出力からの抜粋を示す。必要な三つの数字のうち一つ−キイコード−を示すだけなのに注意のこと。
 
keycode 103 = Up       
alt keycode 103 = KeyboardSignal 
keycode 104 = Prior
shift keycode 104 = Scroll_Backward
keycode 105 = Left      
alt keycode 105 = Decr_Console  
keycode 106 = Right     
alt keycode 106 = Incr_Console  
keycode 107 = Select     
keycode 108 = Down      
keycode 109 = Next      
shift keycode 109 = Scroll_Forward
keycode 110 = Insert     
 
出力をテキストファイルにリダイレクトすると、それをエディトしてロードキイに渡しマッピングを変えることが出来る。経験では、変更したいキイを残して、ほとんどのファイルを削除することが出来ることが明らかになった。そこで、私はこれを二行に減らした:
shift keycode 104 = Scroll_Backward
shift keycode 109 = Scroll_Forward
そして、現在のファンクションをこれらのキイでshifキイの押されていないものに変更した:
shift keycode 104 = Prior
shift keycode 109 = Next
ファイルkmapを呼び出して"loadkeys kmap"を走らせた。次いで、テストプログラムを試したところスクロールバックが無効になっていた。求めた通りの結果だ。出来ることが分かった。loadkeyに関するソースを覗いて、私の見付けた ioctl を使ってキイ機能を変えているいるのが分かったが、どの数字を使うべきかは、未だ分からなかった。
 
カンニングをする外ない。loadkeysは、a - mオプションを使って、256個の値を含むソースファイルを作っているのに気付いた。"loadkeys -m kmap"を走らせて、ゼロ値254個とゼロでない値2個のテーブルが出来上がるのを見出した。エレメントを数えて、ゼロでないエレメントは104と109、つまりkmapファイルのキイコードの数字であることが分かった。テーブルの中の数字は「前」と「次」の値でなければならない。
 
また、このテーブルに番号があるのが分かった。kmapの中の一行で、"shift" を "control" に変えて二つのテーブルを入手した。一つはshift 用で一つはcontrol用だ。両方の場合にシフトテーブルはテーブル番号1であった。テーブルの中の実際の数字から、三つの番号を入手した。
 
前後のスクロールを無効にし、通常キイの中にshift-PageUp/Downを作るには、既存の値をセーブし、それらを変更してexitルーチンにインストールし、後で通常ファンクションに復元しなければならない。
 
コンソール切り替えキイなど、任意のキイを無効にしたいときは、求める数値を見付けるため、私が "loadkeys -m" についてしたのと同じ苦労をする必要がある。
 
このファンクションはキイの作用を変更し、古いものをリファレンスで渡したインテジャーにセーブする(gcc用に書いた):
 
(リスト全部のテキスト版はここ(text version of all listings))
 
#include <sys/ioctl.h>
#include <linux/kd.h>
#include <linux/keyboard.h>
#include <stdio.h>
 
int set_kb_entry( unsigned short table, unsigned short keycode,
         unsigned short value, unsigned short *oldvalue ) {
 
  struct kbentry ke;
 
  ke.kb_table = table;
  ke.kb_index = keycode;
 
/* 古い値を獲得、テーブル又はキイボードが間違いならエラーを返す*/
  if( ioctl( fileno(stdin), KDGKBENT, &ke ) )
   return -1;
 
/* 古い値ptrがNULLでない限り、後で復元のため古い値をセーブ */
  if( oldvalue ) *oldvalue = ke.kb_value;
 
/* このキイに関する新らしい作用 */
  ke.kb_value = value;
 
/* ビジネスを行う、値が間違いならエラーを返す */
  if( ioctl( fileno(stdin), KDSKBENT, &ke ) )
   return -1;
 
  return 0;
  }
 
上のファンクションを使って、スクロールバックを無効にしexitの際に復元するには:
 
#include <stdlib.h>
 
/* 古いキイ作用値をこれらに記憶する*/
unsigned short scroll_forward = 0;
unsigned short scroll_backward = 0;
 
/* dumpkeys とloadkeys -m から集めたマジックナンバー*/
#define SHIFT_TABLE     1
#define PAGE_UP_KEYCODE  104
#define PAGE_DOWN_KEYCODE 109
#define PAGE_UP_ACTION   0x0118 /* Prior */
#define PAGE_DOWN_ACTION  0x0119 /* Next */
 
 
/* shift-PageUpとshift-PageDown に関する規定値ファンクションを復元 */
static void restore_scrollback() {
 
  if( scroll_backward )
   set_kb_entry( SHIFT_TABLE, PAGE_UP_KEYCODE,
          scroll_backward, 0 );
 
  if( scroll_forward )
   set_kb_entry( SHIFT_TABLE, PAGE_DOWN_KEYCODE,
          scroll_forward, 0 );
  }
 
 
/* 通常使用のためshift-PageUpとshift-PageDown を解放 */
int disable_scrollback() {
 
  if( set_kb_entry( SHIFT_TABLE, PAGE_UP_KEYCODE,
           PAGE_UP_ACTION, &scroll_backward ) )
   return -1;
 
  if( set_kb_entry( SHIFT_TABLE, PAGE_DOWN_KEYCODE,
           PAGE_DOWN_ACTION, &scroll_forward ) )
   return -1;
 
  atexit( restore_scrollback );
 
  return 0;
  }
 
Jediのお返し
こうして私はLinuxコンソールの暗闇から抜け出し、勝ち誇って獲物を手にした。プログラマが、DOSとLinuxとの下で全く同じに働くコンソール・アプリケーションを書くことが出来るようにした。伝説上の地位を確保した(と思う)。
 
何故か?私はあのテキストエディタを書いたことがない。私は宿無しでこんな些細なことをするためコンピュータと長く付き合う好運に恵まれたから、私には出来ない。多分君たちもやって来る場所だ。
 
Linux は植民地かされる前のインドやアフリカのような処女地だ。Xを走らせるような最新流行コンピュータは買えないので、コンソール・アプリケーションを必要とする。Linuxをインストールしていない人でも彼らを助けることが出来る。
 
Linuxは、入植者の最初の大波が押し寄せる前にインフラストラクチャを彫り上げるパイオニアを必要とする。これら入植者は、Apacheなどの共通アプリケーションのため及びgrepなどの共通フィルタのためのコンフィギュレーション・ダイアログを必要とするだろう。右クリック・切り取り−コピイー貼り付け・メニューの付いた良いテキスト・エディタを必要とするだろう。
 
これらのツールを作る意欲のあるプログラマは、ウィジェット・ライブラリ特に、ファイル・オープン/セーブ・ダイアログを必要とするだろう。彼らは、各種競合テキスト・エディタで使用するため別々にを作られた、切り取り−コピイー貼り付け機能のある上手に書かれたストリング・アレーから利便を受ける筈だ。
 
完璧なエディタには、そのメニューに機能を付け加えるための簡単な機能の外には、沢山の特性はない。それらは、エディタへのポインタを引数として取り、単一の行をmain()に追加するだけでそのファンクションをエディタのメニューに追加するC++ファンクションを、誰でもが書けるよう設定される。プログラマがC++エディタ・ファンクションを互いに交換することが出来れば、究極のエディタへの道を辿ることになるだろう。
 
君もパイオニアにならないか?誰も心配しなければ、Linuxは潰れて不吉なDarth Gatesの玩具になって終わるだろう。倒された私のスタンダードを拾い上げてほしい。君たちが最後の頼りだ。
 
ソースは次の場所で得られる。
 

ctio.zip (41.7kb)
ctio.tar (150kb)

 
謝辞
SlangE. Davis著:Slang は、上手に書いてあるので利用し易い。私はSlangソースからキイボードの初期化方法と画面用コマンドストリングのほとんどを貰った。これと一緒に来るuntic プログラムを使って別のコマンド・ストリングを得た。だが、Slangについて最良なのは、telnetウインドウで走らせるためMidnight Commanderを有効にすることだ。ウエブサーバーを遠隔で直した経験のある人はご存知だた、これは素晴らしいことだ。
 
So You Like Color !!!Pradeep Padala著 (LG #65、2001年4月号”不思議な文字”).:私はこの記事によってLinuxコンソール画面を始めた。
 
Taming The Linux Keyboard :Petar Marinov著 (LG #76、2002年3月号”Linuxキイボードの飼い慣らし”).:私のshift_status()とkey_awaits() ファンクションは、この記事から取ったshift_state()とkbhit()の修正版である。
 
Ralf BrownDOS プログラマの守り本尊
 
 
著者紹介
Stephen は、森のテントに住むホームレス英国人。飲食物は道で拾い、吸い殻を吸っている。Cプログラマとして短期間働いたこともあるが、「全くの素人」と称している。
 
Copyright © 2003, Stephen Bint. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
EcolNet とescomposLinux.org プロジェクト
By Javier Malonda
 
この記事に関心を持つ理由
 
これは、一つのインターネット社会の誕生、成長及び日常生活の物語である。このインターネット社会が面白い理由は?読んで理解されたい。
 
自前のネットワークを持っている。その意味は、帯域プロバイダ(我々のISP)だけに従属する独立共同体である。その他全部がメンバーが維持する。
・極めて大きい。国中、この場合はスペイン、の人を巻き込んでいる。離れた処に住む人々でも協力出来る方法が分かると面白い。
・会員制の非営利組織である。各会員は、各自のボックス、インターネット接続を持っていて、自分が提供すると選んだサービスを担当する。
プロ・オープン・ソース組織、基本的にはLinux、である。グループは沢山のオープンソース・プロジェクトを主催し、必要なインフラストラクチャを会員に提供する。
・オープンソース信条の普及に役立つ何かを提供する万人に開放されている。インフラストラクチャは、自前で費用を払うボランティアの人々が走らせるが、誰でも、コード執筆、ドキュメント執筆、オープンソースの宣伝など、何かの方法で協力するのに歓迎する。
我々はケーブルとDSLインターネット接続を使っている。この共同体モデルをもっと最新の帯域幅接続で働かせられる可能性は高い。勿論、より良い接続で働かせると、新しい可能性が生まれる。これらすべては着想とやる気の問題だ。ボックスについては、今日の基準からは極めて古いものもあるた、日常の義務をチャンと果たして、オープンソースの威力を示し、Linuxとガラクタと思われるハードウエアとで何が出来るかの重要な実例になっている。
 
EcolNet'sの例に習って、大きい又は小さい共同体を同じ基準で構築することが出来る。読んで何を達成したか理解して頂きたい。着想に火を付けるだろう。
 
歴史
escomposLinuxは、ニュースグループes.comp.os.Linuxの「略称」である。直ぐお分かりのように、これはスペイン語及びスペインで話されるすべての言語のLinuxニュースグループすべてのルーツである。"es" は、スペイン語を話すグループ一般を指す "esp" と対照的にスペインを意味する。
 
es.comp.os.Linux ニュースグループは、Pablo Saratxagが助成して1996年に創設された。当時Linuxについてスペイン語で論じるニュースグループはなく、esp.*トップレベル・ドメインでもさえも以前は注意していなかった。遅れて1999年に、通信量の信じ難い増大もあって、元のes.comp.os.Linuxの精神が提唱され、投票の結果認められて、さらに四つの特殊グループが創設された:
 
es.comp.os.Linux.instalacion:インストレーションとコンフィギュレーション
es.comp.os.Linux.programacion:Linuxでのプログラム作成
es.comp.os.Linux.redes:Linux下でのネットワーク構築
es.comp.os.Linux.misc:別のどの場所にも適合しない内容
この年がes.comp.os.Linux.anuncios (発表) 誕生の年と考えられているが、今ほどの通信量はなかった。
 
2000年に、積極的なes.comp.os.Linuxユーザ数名が、Linux-es.comに助成されて、escomposLinuxウエブペイジの第一版を作った。少し遅れて、ecolユーザ五つのグループがescomposLinux.org ドメインを購入して、ウェブペイジは実際の場所をhttp://www.escomposlinux.org/に移した。ニュースグループで特に積極的だったLinuxユーザが、ウエブのホストスペースとFTPアクセスを受け取ったので、彼らのLinuxドキュメンテーションと個人プロジェクトの全部を表示する場所を持つことが出来た。関心のある誰もが、@escomposLinux.orgメールアカウントにアクセスすることが出来た。スペインでは2000年になっても物事が困難で、e-メールアカウントの取得は今日ほど容易ではなかった。
 
これら「五人の侍」は、従うべき指針に関する声明の起草から始めた。先ず、費用は経済的支援を決して要求しないボランティアが負担した。escomposLinux.orgは、新サービスが追加され多くの人が参加するにつれて、着々と成長した。幸いDSLが比較的手頃な価格になった。2001年11月、当時提供したサービス全部が、定期的es.comp.os.Linux.*ユーザが働かせて維持するマシンに移された。escomposLinux.orgがEcolNetになったのは、このときだった。
 
EcolNetとは何か?
技術的には、EcolNetは、国中に広がるコンピュータ群、escomposLinux.orgネットワークである。EcolNetは、Linuxに対する情熱を共通に有するボランティアとes.comp.os.Linux.*を定期的に使用するグループが走らせ、管理し、費用負担をする。我々は「37377教祖」ではない。我々は、Linuxの働きを楽しむ。そしてLinux社会に役立てれば幸いだ。
 
EcolNetの背後にある動機は何か? 基本的には、es.comp.os.Linux.*.を含むニュースグループのスペインISPによる恐ろしい管理だ。サービスが遅い、メッセージがなくなる・・・。我々なら旨く出来ると思った。また、escomposLinux.orgがホストした最初の場所は極めて厳しく、データ記憶は効果でFTPは限られていた。自分達に必要なサービスの面倒を自分達で見られると考えるや否や、escomposLinux.orgを自分たちのホームサーバーに移した。
 
EcolNetの現在の目標は? 誰かがプロジェクト(小さいプログラム,大きいもの、ドキュメンテーション・プロジェクト、ゲームなど)を発足しようとするとき、必要なツール全部は持っていない。通常はコードをソース工場の生の素材で、IRCチャンネルをオープン・プロジェクトで、FTPをどこかの大学で、などなどから入手するだろう。EcolNetを使うと、プロジェクトを発足する人は、必要なサポート全部が得られ、wwwスペース、FTP、IRCチャンネルなど、すべてが集中化されている。これら全部が基本的にEcolNetが提供するものだ。だが勿論、EcolNetはそれ以上だ。EcolNetは、Linuxとその哲学を楽しみながら親友になった人々の集まりだ。
 
サーバーは何処にあるか?EcolNetマシンの位置を示す地図を示す。マシン名、IP、ボランティア名、e-メールアドレス、ボックスのインターネット接続などが分かる。画像はここをクリック [Click for image]
 
Diaを用いて何が出来るかの好例を示す。ご興味があれば、この図に付いての詳細がこの記事の最後にある。
 
 
やり方は簡単だ:程々のインターネット接続を有する数個のコンピュータを取り、ネットワーク提供サービスを作る。リソースを追加し必需品と担当を割り当てる。我々は、自分達自身とボックスを働き続けさせる自分達の能力だけを頼りに、小型コンピュータと基本DSLインターネット接続で働くネットワークを作った。EcolNetにより、Linuxサーバの管理経験を持つことが出来る。それを楽しみながら、肩に責任を負ったが、少し重荷であることもあった。人生はそんなものだ。
 
EcolNetでどんなサービスが走っているか?
リストは極めて長い。EcolNet はスペインのLinux社会に(完全に無利益で)次のサービスを提供する:
 
・電子メール:POP3 とWebmail アクセス
・ウエブペイジ・ホスト:rsyncを通じて実現。Linuxに関わる何かを持つ人は誰でもecolプロジェクトに居場所がある
・無記名 FTP:大勢のスタップを扱うため
・メール・リスト:ecolには幾つかのメール・リストがある。最も重要なのは、ユーザ・リストと管理者リスト
ニュース:購読希望のある人には誰にでもes.comp.os.Linux.*ニュースグループすべてに対するアクセスを提供する。グループを読みたい人は誰でも程々のサービスが受けられるのは、EcolNetで提供したいサービスの一つである
IRC:これは我々のお気に入りの一つ。IRCは大変面白い。.escomposLinux.org #escomposLinux でスタッフに会って喋ることが出来る。何時でも歓迎
PGP キイ:我々のPGPとGnuPG キイをここに保管
時刻:時刻を知るためntp.escomposLinux.org に時計を置いている
CVS:我がユーザの幾人かが各種のプロジェクトで働いているので、CVSは重要なツールである
Wiki:色々なことに使うため小さいWikiがある。主として、何かをしたばかりで尚熱中しているときドキュメンテーションを書くのに用いる
これらのサービスの外に、www.escomposLinux.orgには、Linux関連リンク、ブックレビュー、役立つ文書など、沢山の情報があり、常に増えている。
 
サービスは、時々変わる。何かのマシンがEcolNetに参加したときや、帯域幅消費が多過ぎるとか実際の災害など誰かが問題に直面したときなどだ。我々サーバの一つが、最近電気会社を主役にする猛烈な崩壊に見舞われたことがある。
 
我々は次のような「人気」サービスを自慢にしている:
 
Libertonia:K5's Scoopに基づくLinuxウエブログ。数ヶ月前に発足したが、今日300名以上の登録ユーザがいる。Libertoniaとは自由の意味のスペイン語で、「わが輩はカモである」でグルーチョ・マルクスの支配する想像の国だ。だからグルーチョのペンギンをロゴにしている。これは他のウェブログとは全く違っている。その理由は:
・ユーザが投稿するには登録しなければならない。
・K5と同じく、何を公刊するか投票する。
・ニュースを検閲して不適当な話題や無礼と考えるものには意見を付ける。検閲には悪い意味があり、誰でも反対するので、調節と言う方が良いかも知れない。我々は自分の資金と好意でサービスを提供している。自分達の費用で嫌な奴を楽しませようとは思わない。今の処、立派な参加者に恵まれて管理の方法に満足して貰っている。バナーは載せない。お金もヒットも不要だからだ。こうして、Libertoniaの一部を担う人々だけを選んでいる。記事に対する意見は(これまでのところ)他のウエブログに比べると少ないが、意見の質はこれを補って余りがあり、これがまた記事の質を向上させる。今の処、嫌な奴はいなくて、皆がLibertoniaで幸せで仲良く暮らしている。
The ecol comic strip::EcolNetサービスで最も有名な一つは、ユーモアだ。元々はスペイン語Spanishで、今は英訳している。スペイン人の間で信じられない程好評だ。週刊なのに毎日1000名位の訪問がある。有名なウエブログのあるものが、これらと同時に個人ログにもリンクしている。英訳版については、100名以上が、英国人でもEcolNet関係者でもないSimonと言う人が走らせるメール・リストに加入した。一方、英訳版は1日100件以上の訪問がある。LGの定期購読者なら既に読まれた筈。[この号のもの one など、編集者]。これら交信の全部を扱うため、10箇所のミラーを置いた。面白い課題だ。コミック・ストリップは、少なくともスペインでは、EcolNetの「目玉」だ。兎に角、これらのことの生みの親であるのを誇りに思っている。
・我々のニュースサーバー:ニュースサーバーは特に誇っている。これらは掲示と維持が難しい(我々はそう思った)。それでも、これはescomposLinuxプロジェクトの基本だ。ニュースサーバーの面倒を見るため、色々な処に行かなければならない。これまでで、我々が今走らせているサーバーの計画、外部から供給している人をお分かり頂けたと思う。これら供給者に栄誉を、写真はここ [Click for image]
 
全体の面倒を見るのは誰か?総裁などはいるか?EcolNet王がいるか?
EcolNetには沢山の人が従事していて、それが物事を面白くしている。幸いEcolNetボランティアは、常におしゃべりで親切なので、彼らと激論を戦わせるより楽しい。だが、これらの人々か関わるときはいつでも、ある種の構造が必要である。EcolNetでは、中心になる人々がいる「五人の侍」だ。これらが子守をする。彼らには経験とノウハウがある。お望みなら彼らを、Primus intern Pares、同輩中の第一人者と理解すれば良い。
 
Libertoniaに付いて説明したので「嫌な」言葉を見直す。続くのは「独裁制」だ。特に好きな物語をしよう。哲学者プラトーが共和国の中で、完全な形の政府は賢人の独裁制だ、と言った。残念乍ら、これは実社会では不可能だろう。さて、我々はそれを持っていると考える。我々には選んだことのない数人がおり、これが常に、なすべきこと又は、なしたことを言い、皆がそれに満足する。長い間そうだったし、そのまま続けで、日毎に良くなる。万事が民主的か、少なくとも見掛けはそうだ。皆が素敵で同じ目標を持っているとき、争いは起こり難い。我々皆が同じ船に乗っている。船を動かしたいし、誰が適任者か知っているので、皆が協同して同じ方向に漕ぎ進める。
 
EcolNetの決議手順はどのように進むのか? 管理者メールリスト、ユーザ・メールリスト、内部ウエブログ及びオンライン呼出がある。通常は、インフラストラクチャ・スタッフが管理者メールリストで討議する。ユーザは技術的な詳細について知る必要も悩まされることもないからだ。ユーザ・メールリストは、物事が、マシンを走らせる人と面倒をみるプロジェクト又はドキュメンテーションを有するユーザ双方のEcolNet集団全体に影響するときのためのものだ。重要でない議論に関しては、内部ウエブログ及びその呼出を使う。
 
追悼
EcolNet プロジェクトを、今は神とともにとどまる元の「五人の侍」の一人Tobに捧げる。
 
Written by Javier Malondaの注記:
功績のある多くの方々がいるが、匿名を希望される。 http://www.escomposlinux.org/.を読まれたい。
 
ご興味があれば、ダイアグラムのDiaソースXMLコード及び、ダイアグラム自体を http://helvete.escomposlinux.org/ecolnet/.で見出すことが出来る。
 
Copyright © 2003, Javier Malonda. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
 
コンピュータ馬鹿話
By Mike ("Iron") Orr
フロッピイ物語 By Lorcan Mongey
5.25インチ・フロッピイを使っていた頃、誰かがフロッピイディスクの上にコーヒーをこぼした。当然、読めなくなった。問題は、データが壊れたことでなく、フロッピイ覆いの繊維内張がずぶ濡れになって、コーヒーの層を常にディスク面に作り続け、データの読取を妨げることだった。私の処に持って来たので、ハサミで覆いを切って実際のディスクを取り出し、水道口で洗って、紙タオルで拭き取った。予備のフロッピイ覆いを開き(不要のディスクを捨てて)問題のディスクを挿入し、全体をドライブに入れた。完全に働いたので、安全のため内容全部をコピイして、フロッピイを破棄した。
 
腕前より好運 By Morten Sickel
ノルウエーの諺がある「腕前より好運に恵まれることがある」。二、三の例外を除いて、コンピュータに馬鹿なことをしたときの私がそれだ。
 
私は化学を学んだ。学びながら、しばらく(別の)学生が使うことの出来るコンピュータのシステム管理者のような仕事をした。ほとんどのマシンは、4MB RAMの付いた386だった。そのとき、最初の486 PCもまた手に入れた。中の一つで、フロッピイが働きを止めたが、壊れた386を倉庫に持っていたので、やり方は分かっていた。必要部品を取り出して、486にフロッピイを装備した。電源を入れると、青い煙が上がった。ピン一つを左に寄り過ぎた電源接続につないだのが分かった。後には、フロッピイ電源コネクタが変わったので、こんな軽業は出来ない。明らかに、私だけではない・・・
 
同じ頃、友人が(本当だ、私ではない)286と交換する386xを持っていた。私と一緒に組み立てた後で、ネジ一つがなくなっているのが分かった。暫く探しが諦めて電源を入れた。マザーボードが燃え始めたその場所を見ると、それがあった。その後、ネジを集めるのには注意を払い、なくなっていたら電源を入れないことにした。友人は、間もなく486マザーボードを手に入れて、古いPCから20MBのRAMを集めはじめた。だから彼は不運ではなかったと思った。ブートの間にマシンがRAMを数えたときのスリルを忘れない。そのとき、私の8080は604kを超えることはなかった。
 
他方、感心したのはIDEコネクタの品質だ。間違った方向に何度接続したか分からないが、何も壊れていない。数週間前に二つのハードウエアを器用に接続した経験がある。友達から古いSCSIディスク数枚を焼けた386SXと一緒に貰った(他には何も残っていなかった)。そのうち一つには、マスター、スレーブ又はCS用にジャンパーを設定する方法を書いたラベルがあった。OKと思った。本当にIDEドライブだったら別のPCに入れる積もりだった。暫くして入れたが、PCは認識しないで、別の(働くのが分かっている)ディスクからのブートを拒否した。取り出してジャンパーを良く見た。ラベルにマスターとスレーブとは書いてあるが、ジャンパー自体にはA0,A1,A2..... のラベルが付いていた。良く調べると、コネクタはIDEより広く、その上、曲がっているピンもあった。曲がったのを元に戻してSCSIチェインに付けた。見事になった。ときには、好運の方が腕前より良い。、
 
ヘリコプタ CPU By Raul Marusca
十年程前、私はコンピュータ店で技術者として働いていた。ある日、顧客が387数学プロセッサを自分のコンピュータのため買った。自分でインストールすると言い張った。二日後、戻ってきて(保護ケース無しで)チップを返に来て、「壊れたデバイスを売ったよ」と言った。
 
「保護カバーから出ているので、静電破壊のためでないと、どうして分かりますか?」と応えた。
 
「可能な四つの方法全部でソケットに填めたが、BIOSでもソフトウエアでも全く検出されなかった」
 
衝撃を受けた。マザーボード上のマークに一致するピン1を合わせるのと別の方法でcoproを填めるのが可能とは夢にも思わなかった。
 
最初に間違った方向で挿入したとき、チップを壊したので、補償の対象にならないことを説明するのに、長い時間が掛かった。
 

  [コンピュータに関する失敗談、成功談をgazette@ssc.comまでお寄せ下さい

 

Copyright © 2003, Mike ("Iron") Orr. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
百科事典をe-メールする方法
By Graham Jenkins
 
百科事典を E-メールする理由
そう、百科事典に限らない、映画でも、tarrして圧縮した大きいディレクトリでもよい。勿論、FTPを使って転送することが出来る。でなければ、多分出来ないだろう。君のマシンが、外界へのFTPアクセスのない企業LAN環境内にあるか、又は宛先マシンがセキュリティ目的でFTPを無効にしているかだ。代案は、転送オブジェクトをASCII文字列に転換してe-メールで送ることだ。このエンコードに'uuencode' ユティリティを使うこともできるし、又は RFC 2045 "Multipurpose Internet Mail Extensions (MIME) Part One".に説明されたBase64 Content Transfer Encodingを使うことが出来る。
 
百科事典を梱包する方法
百科事典を物理的にメールするときは、段ボール箱に梱包するだろう。途中のメールハンドラ全部がそのサイズと重量の段ボール箱を受け取る能力を有するなら、これは良い解決策だ。そうでない場合は、百科事典を受け取ることの出来るサイズと重量の多数の段ボール箱に分けるだろう。
 
同じように、百科事典をe-メールするときは、それを含むe-メールのメッセージのサイズが、途中で遭遇する限界の何れをも超えないことを確かめる必要がある。超える場合は、メッセージを受け取ることの出来る多数のパートに分割しなければならない。これは、RFC 2046 "Multipurpose Internet Mail Extensions (MIME) Part Two".に従っておこなう。.
 
要約すると、RFC 2045とRFC 2046の勧告にしたがうときは、百科事典全部に対してBase64エンコーディングをおこなって、結果を必要数のパートに分割しなければならない。こうすると、メールするパートは次のようになる:
 
 From grahjenk@au1.ibm.com Tue Dec 31 13:14:34 2002
 Content-Disposition: inline
 Content-Transfer-Encoding: 7bit
 Content-Type: message/partial; id="300870"; number="1"
 Subject: Graham's Encylopedia
 
 owF1Vb+P3EQUPhLRrBSFlHQjRYCQsthe/1q7CNrbREjocnvK3hHREM3ac7fWeWfM
 zPh2L38ASomEIro0SNBBg2hBSDTwR0BBEwqQaFJF8J499tob0EjW7rzv+96b772x
  ...
 szJb9DUMvKdRUIV+RY5Xu3UkRQqvJCzdzHtHoQL36Ke6elnYLgwH8MfxCU9ymq1Y
 
 --
 From grahjenk@au1.ibm.com Tue Dec 31 13:14:34 2002
 Content-Disposition: inline
 Content-Transfer-Encoding: 7bit
 Content-Type: message/partial; id="300870"; number="9"; total="9"
 Subject: Graham's Encyclopedia
 
 dc45xuruv3m3e8z/OGRD6lxz13GC5m0XbXvcWlyFW4vxbSSK5KEoTOIIuxTFs2JK
 UnZKy1wTAV9TWr2dev7WrLbXkeOHUVQnjuyXEptwm3hBgfT43auvVh/v5mt+48pb
 n+09Hf7+5Nvyx5tf/fP4o+PJ398Xf958cW3v6ejzL17/9YPfPs4unv08efvr68O/
 njz/Fw==
 
 --
 
百科事典を梱包する別の方法
メッセージ受領者が上に示したような各パートを正しい順序で並べて、ヘッダ行をストリップし各パートをBase6デコーディング・プログラムに入れるのは、必ずしも容易ではない。彼がマイクロソフト・マシンを使っていると、メッセージ各パートを正しく編集することは出来ないだろう。.
 
そこで、代替案は百科事典を番号付きパートに分けて、各パートを送付のため別々にuuencodeする。'uuencode' のほとんどのバージョンは、旨くヘッダ行を剥ぎ取る。これはMicrosoft Outlookでも働く。
 
ここでの秘密は、それらを正しい順序で容易に選択し、パイプ(解凍又はuntr操作などのため)又は出力ファイルに送ることが出来るような方法で、構成パートの番号付けをすることだ。出力された各パートは次のようになる:
 
 From grahjenk@au1.ibm.com Tue Dec 31 13:49:07 2002
 Subject: encyclo part 1/ size/sum 1024/16571
 
 begin 644 001_encyclo
 M<F]O=#IX.C`Z,3I3=7!E<BU5<V5R.B\Z+W-B:6XO<V@*9&%E;6]N.G@Z,3HQ
 M.CHO.@IB:6XZ>#HR.C(Z.B]U<W(O8FEN.@IS>7,Z>#HS.C,Z.B\Z"F%D;3IX
  ...
 M8W)E<',Z+V)I;B]K<V@*=V-O8F%T8V@Z>#HU,#(X.#HQ.D%L97@@=&AE(%=A
 B;FME<CHO97AP;W)T+VAO;64O=V-O8F%T8V@Z+V)I;B]K<P``
 `
 end
 
 --
 From grahjenk@au1.ibm.com Tue Dec 31 13:49:07 2002
 Subject: encyclo part 2/2 size/sum 945/12218
 
 begin 644 002_encyclo
 M:`IC-S0S-#0P.G@Z-38T-C,Z-3`P-#I!;F1R97<@3'5O;F<Z+VAO;64O861M
 M;W!E<F%T;W(Z+V5X<&]R="]H;VUE+V]P8U]O<#HO8FEN+W-H"F,Y,34W.3DZ
 M>#HU,#(Y,#HQ.CHO:&]M92]A9&UI;B]C.3$U-SDY.B]U<W(O8FEN+V)A<V@*
 `
 end
 
 --
 
大文字だけを使っていることと、括弧その他の記号を沢山含んでいることに気付かれるだろう。記号のいくつかは、別の文字セットには同等の方法でマップされていない。'uuencode' の代わりにBase64の使用をRFC 2045が勧告するのは、この理由だ。
 
百科事典パッカー
梱包プログラム packaging programを示す。単純化と一般化のため、上に概説した代替梱包方法を用いる。これをおこなうプログラムは長い間存在していた。これらはBourne-Shellバージョンが利用出来たけれども、通常 'C' で書かれた。また普通一時ファイルを書く。
 
Perl言語を使って、一時ファイルを全く使わない洗練された梱包方法実行プログラムを書くことが出来る。出来上がったプログラムは簡単で移植可能だ。だから、これをおこなった。
 
#!/usr/local/bin/perl -w
# @(#) filemail.pl   入力流をパートに分け、次いで各パートをエンコードし
#            それを宛先受領者にe-メールする
#            Vers. 2.05; Graham Jenkins, IBM GSA, December 2002.
 
use strict;       # 各パートをエンコードしダブル−バッファ法で送る
use File::Basename;   # uuencodeを使ってモジュール依存性を軽減
my $PSize = 700;    # 規定値 (入力) パート・サイズ.
my ($Count,$Sum,$Size,$Total,$InpBuf,$InpLen,$OutBuf,$j);
 
if ($#ARGV eq 2) { if ($ARGV[0] =~ m/^-\d+$/ ) { $PSize=0-$ARGV[0]; shift } }
 
die "Usage: cat file |".basename($0)." [-KbPerPart] destination filename\n".
  " e.g.: tar cf - .|".basename($0)." -64 smith\@popser.acme.com mydir.tar\n".
  "(Note: default un-encoded part size = $PSize","kb)\n" if ($#ARGV ne 1);
 
open(INFILE,"-") || die "Can't read input!\n";
$Count = 0; $Total = "";# Loop until no further input available.
 
do { $InpLen = read(INFILE, $InpBuf, 1024 * $PSize);
   $Total = $Count if $InpLen lt 1;
   do { $Size = length($OutBuf);
     print STDERR "$ARGV[1] part $Count/$Total => $ARGV[0] $Size bytes\n";
     $Sum = unpack("%32C*", $OutBuf);
     foreach $j (1,2) {$Sum = ($Sum & 0xffff) + int($Sum/0x10000)}
     open(PIPE, "| Mail -s" .
      "'$ARGV[1] part $Count/$Total size/sum $Size/$Sum' $ARGV[0]");
     $j = $Count ; while (length($j) < 3 ) { $j = "0" . $j }
     $j = dirname($ARGV[1])."/".$j if dirname($ARGV[1]) ne ".";
     print PIPE "begin 644 ",$j,"_", basename($ARGV[1]),"\n",
      pack("u",$OutBuf),"\`\nend\n";
     close(PIPE)                  } if $Count gt 0;
   $Count++; $OutBuf = $InpBuf             } until $InpLen lt 1;
 
Perlは、指定された文字列に取得しようとしなければならないバイト数を規定することの出来る 'read' ステートメントの形のため、この用途に適している。お分かりの通り、標準入力からの読取を '$InpBuf'に空白文字列が返されるまで読み続けるだけだ。空白でない文字列を受け取る度に、今 '$OutBuf' にある内容が何であろうとuuencodeしてメール・プログラムにプッシュする。次いで、'$InpBuf' の内容を次の繰り返しが整った '$OutBuf' に記憶する。
 
Perl は、その 'pack' ステートメントを示したように 'u' パラメータとともに使うことにより、uuencode操作を文字列上で実行することが出来る、追加モジュールは不要だ。これは全く必要ないが−その上 'unpack' ステートメントの特性を利用して送るとき各パートのチェックサムを計数する。
 
Unix/Linux 'Mail' プログラムへのパイプを実際に開いて、上りメールを扱っているのがわかるだろう。移植性を大きくするため、Net::SMTP モジュールをインストールして使うことが出来る
 
このプログラムは、任意選択のパート−サイズ・パラメータを用いて呼び出し、その規定値un-encodパート−サイズ限界700kbを調節することが出来る。
 
同様のことをするプログラム
この種のメッセージ分割は、正に "Secure Printing with PGP"(#75、2002年2月号「PGPを用いる確実なプリント」)でおこなった種類のことであるのを認識されるであろう。興味のある方のためには、このプログラムの更新バージョンが"CPAN Scripts Repository"に示されている。これらのプログラムは、RFCの勧告する「Base64-エンコード次いで分割」の方法を使っている。.
 
以前の記事 "A Linux Client for the Brother Internet Print Protocol" (#68、2001年7月号”ブラザー・インターネット・プリント・プロトコル”)には、「分割し次いでパートを送る」方法を使うシェルスクリプトが含まれていた。これもまたBase64エンコードを使った。
 
筆者紹介:
Grahamは、オーストラリアのIBMグローバル・サービスにいるUnix専門家だ。メルボルンに居住しており、幾つかのハードウエア・プラットホーム上で所有権及びオープンシステムの味付けを構築して管理している。
 
Copyright © 2003, Graham Jenkins. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
PHP Superglobalsを用いるセキュリティ
By David Lechnyr
 
”見知らぬ女性と一時変数には近寄らない” -- 作者不詳
 
数年前、家内と私は北部へスキーに行くことにした。スキー道具予約のため、ロッジのオンライン・ウエブサイトを使って24時間前に連絡する必要があった。問題は、家内が締め切り23時間前に予約するよう私に頼んだことだ。
 
そこで考えた。オンライン・ウエブサイトを調べたが、24時間以内では予約を受け付けないとあった。しかし、適当な日付を選ぶと、次のURLが分かった:
 
  https://www.somewhere.com/reservations.php?date=01-23-01
 
そこで、選べる日付のセキュリティをロックしている間に、最後の値がウエブアドレスの終わりにあるGETステートメントに入れられることを、思い出した。ウエブアドレスを改造して"date=01-22-01"としたら、翌朝にはスキーが待っていた(勿論有料で)。
 
この無邪気だが実用的な例は、思い掛けない方法で使うことの出来るプログラム作成言語を使うとき気を付けなければならない危険の一つだ。ここから PHP Superglobalsに関する議論が始まる。
 
フォーム
Superglobalsを理解するには、一つのウエブサイトから別のウエブサイトにデータを渡す方法(フォームなど)を理解するのが重要だ。特に、GETとPOSTと言う二つの方法を知らなければならない。また多分HTML <FORM>ステートメントには慣れなければならない(良い参考資料は http://www.w3.org/TR/html401/interact/forms.html)。
 
次のようなものを見たことがある筈だ:
 
<form name="form1" method="post" action="process.php">
  <p>Please enter your name:</p>
  <p><input type="text" name="yourname" /></p>
  <p><input type="button" name="Submit" value="Submit" /></p>
</form>
 
これは何の変哲もない標準HTMLフォーム・コードで、情報を問い合わせてそのデータをファイル "process.php"に送る。ここで重要なのは、フォームにデータを送る方法を告げるmethod宣言だ。これについて一寸脇道に入る(深呼吸):
 
HTMLの初期の頃を思い出す人のため、フォームは<ISINDEX> HTMLタグを用いて作られた。HTML文書のHEADにタグを置くことにより、入力で満たすことの出来るテキストフィールドが現れる。HTML+標準が発展すると、<FORM>タグが設計されてGET、POST、PUTのMETHOD属性を付けて使うことが出来た。そこで、データを送る方法に、幾つか違った方法が生まれた。
 
GET
GETを使うと、変数とその値が、URL自体の一部として追加したURLリクエストのヘッダに送られる。限界はウエブアドレス(URL)が 8,192文字に限られていることだ。データ量が長過ぎると、切り取られる。また、SSL接続を用いても、データは暗号化されない。ウエブアドレスの一部だからだ。
 
例えば、ウエブペイジは次のようなフォームステートメントを持つ:
 
<form name="form1" method="get" action="process.php">
  <p>Please enter your name, e-mail address, and a comment:</p>
  <p><input type="text" name="yourname" /></p>
  <p><input type="text" name="email" /></p>
  <p><input type="text" name="comment" /></p>
  <p><input type="button" name="Submit" value="Submit" /></p>
</form>
 
Submitをクリックすると、フォームに満たした値をウエブブラウザが取って、次のウエブアドレスをリダイレクトする:
 
http://www.fluffygerbil.com/process.php?yourname=fred+smith&email=fred@nowhere.com&comment=I+have+no+comment
 
フォームの値がウエブ・アドレスの一部になるのに注意。これがGETの核心だ。
 
興味のため、この処理をおこなうため生のHTTP処理で送られるものは次の通り:
 
GET /process.php?yourname=fred+smith&email=fred@nowhere.com&comment=I+have+no+comment HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)
Host: www.fluffygerbils.com
Connection: keep-alive
 
POST
POSTを使うと、変数とその値が、ヘッダでなくURLリクエスト本体の中で送られる。この型のデータ送信の利点は、送られるデータのサイズに制限がないことである。でーたが、ヘッダでなくHTTPリクエスト本体の中に含まれるからだ。また、SSL接続を用いると、データは幾らでも暗号化される。例えば、次のようなフォームのウエブペイジは:
 
<form name="form1" method="post" action="process.php">
  <p>Please enter your name, e-mail address, and a comment:</p>
  <p><input type="text" name="yourname" /></p>
  <p><input type="text" name="email" /></p>
  <p><input type="text" name="comment" /></p>
  <p><input type="button" name="Submit" value="Submit" /></p>
</form>
 
Submitをクリックすると、フォームに満たした値をウエブブラウザが取って、次のウエブアドレスをリダイレクトする:
 
http://www.fluffygerbil.com/process.php
 
フォームの値はウエブアドレスの一部ではないのに注意。これがPUTの核心だ。.
 
興味のため、この処理をおこなうため生のHTTP処理で送られるものは次の通り:
 
POST /process.php HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, */*
Accept-Language: en-us
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)
Host: www.fluffygerbils.com
Content-Length: 94
Pragma: no-cache
Connection: keep-alive
 
yourname=fred+smith
email=fred@nowhere.com
comment=I+have+no+comment
 
それで?
さて、この背景情報が何故有用なのかだ。PHP 4.2.2以降をインストールすると、PHPをコンパイルするとき次の注意書きを認めるだろう:
 









 

***注意***
register_globalsの規定値は現在OFFです

register_globalsがONであることをアプリケーションが必要とするときは、php.iniファイルで明確にONに設定して下さい。
register_globalsをONにする意味については
http://www.php.net/manual/en/security.registerglobals.php
を是非読んで、出来ればそれを避けて下さい
 
 
この意味は、PHPは自分に渡されたデータについて極めて神経質なので、データが渡されるmethodを明確に述べる必要があることである。また、PHPペイジにデータを送る方法は、GETとPOSTを通じるだけでなく他にもあることを知らなければならない。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Superglobals
Superglobalsが持ち込むのは、PHPに対する比較的新しい概念である。例えば、上図には、一寸した問題がある:変数$yournameを使って作業しているとき、スクリプトの間に、スクリプトをハックしようとする誰かが、変数割り当ての6個の別のmethodを使って再定義するのが、分かる方法があるだろうか? 例えば、次のことをおこなう君のウエブサーバに、誰かがPHPスクリプトを旨くアプロードしたと想像して見よう(Daniel Phoenix著php exploit):
 
<?php
setcookie("test","../../../../../../etc/passwd");
echo "cookie inserted";
?>
 
データが最初の場所に割り当てられた方法に基づいて変数を隔離する方法を見付けるの素晴らしいだろう。Superglobalsにより、特定のmethodで受け取られた変数を使用しなければならないことが出来る。
 
Superglobals は、特定の値が来る場所を決定するの助けるPHPの試みである。PHP 4.1.0のものなどのような、この新特性を聞いたことがなければ、それに適合した方が良い。ほとんどのPHP教科書はこの問題に触れていないので、この新しい入力方法に移る方法を知らなければならない。詰まるところ、自分の/usr/local/lib/php.iniを再訪して次の変更を行う:
 
register_globals = Off
 
これにより、ユーザ提起変数を君のPHPコードに注入することが出来なくなるので、攻撃者による変数変更の量を軽減することが出来る。提起を工夫するのに余分な時間が掛かり、君の内部変数は効果的にユーザ提出データから隔離される。これで、ユーザがフォームを満たそうとするとき、サーバは、グローバル変数 $name、$email、$commentに何のデータも割り当てないで、代わりに、データを次の細切れアレーに分割する:
 
$_POST['name']
$_POST['email']
$_POST['comment']
 
主なSuperglobal アレーは次の通り:
 
1.$_GET['variable'] - HTTP GET を通じてスクリプトに与えられる変数。非難された HTTP_GET_VARS アレーに類似。
2. $_POST['variable'] - HTTP POST を通じてスクリプトに与えられる変数。非難された $HTTP_POST_VARS アレーに類似。
 
その他の共通性の少ないSuperglobal アレーは次の通り:
 
1.$_COOKIE['variable'] - HTTPクッキーを通じてスクリプトに与えられる変数。非難された $HTTP_COOKIE_VARS アレーに類似。
2.$_REQUEST['variable'] - 任意のユーザ機構(GET, POST, COOKIE)を通じてスクリプトに与えられる変数なので、信用することが出来ない。
3.$_GLOBALS['variable'] - スクリプトのグローバル・スコープ内で現在利用することの出来る各変数に対するリファレンスを含む。
4.$_SERVER['variable'] - ウエブ・サーバが設定するか又は、別途現行スクリプトの実行環境に直接関連付けられる変数、非難された $HTTP_SERVER_VARS アレーに類似。
5.$_FILES['variable'] - HTTPポストファイル・アプロードを通じてスクリプトに与えられる変数。非難された $HTTP_POST_FILES アレーに類似。
6.$_ENV['variable'] - 環境をを通じてスクリプトに与えられる変数。非難された $HTTP_ENV_VARS アレーに類似。
7.$_SESSION['variable'] - スクリプトのセッションに対し現在登録されている変数。非難された $HTTP_SESSION_VARS アレーに類似。
 
詳細については、http://www.php.net/manual/en/reserved.variables.php.参照。
 
そこで、$name の代わりに "John"と設定してみよう,フォーム・データが提出された方法によって、_GET['name'] = "John"又は $_POST['name'] = "John" の何れかを得る筈だ。利点はお分かりのように次の通りだ:
 
1.$name は絶対に偽造出来ない:スクリプトが値を設定すると、それが値になる!
2.$_GET及び $_POST アレーが、URLの一部としてのデータ又はリクエスト本体の一部としてのデータを、ユーザが追加したか否かの判定に役立つので、POSTデータを受け取るフォームを持つことも、誰かがURLに追加したGETデータを使って細工したURLを送ることも心配することはない。これは、直ぐ分かるので電話を切ればよい。
3.これら 'superglobals' により、変数の値だけでなく、最初に値がサーバに与えられた方法をも「区分(compartmentalize)」することが出来る。サーバに侵入しようとする者がこれを迂回するのは大変難しい。
 
最後の考察
PHP を用いるプログラム作成は、遅いのでイライラすることがある。セキュリティ対策は、データが容易に割り当てられるのを妨げ、ISPは一般的にその聴取者を考慮することなくPHPを実行するので、PHPへの新人はGET、POST、Superglobal などへの親しみに戻り勝ちだ。しかし、少し知識があれば、遙かに遠くに進むことが出来る。この記事が皆様の探検に役立つことを望む。
 
この記事は、PHP 4.3.0.に基づく。
 
追加資料
・Jordan Dimov著On the Security of PHP
・Shaun Clowes 著A Study In Scarlet: Exploiting Common Vulnerabilities in PHP Applications
 
この記事はSlackware Linux 8.1を走らせるDell Latitude C400ノートパソコンで書いた。
 
著者紹介
Davidはオレゴン大学人的資源学部のネットワーク・マネージャだ。彼は社会福祉の修士号と同時にCSE+I、CNE、CCNA資格を有する。過去6年、システム・セキュリティ、ネットワーク故障修理、PHP/MySQL統合を中心に、Linuxで働いた。
 
Copyright © 2003, David Lechnyr. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 86 of Linux Gazette, January 2003
 
 
 
 
 
Perl 今月の一行プログラム−悪辣なSpambotの事件
By Ben Okopnik
リポータの覚書
 
あり得る苦情を先取りして、これら記事に示されたスクリプトで遊ぶため、Perlの現在バージョン(少なくとも執筆時現在5.8.0)必要性を強調したい。ワンライナは、正規のスクリプトより遙かに高い程度で、新しい独特の特性と、バージョン番号が増えるにつれ新しい特性を「成長」させ古いものを落とす言語を頼りにしている。Perlは、17年の成長と発達を目指して、その例外ではない。
 
ワンライナに起こる沢山の問題の一つは、壊れやすいことだ。特に秘密の文脈、副作用、文書化されない特徴を頼りにするもので、確実に−予告なく変更されるものだ。ワンライナは、上の全部を使って巧妙な細工をする。これらは(望むらくは)Perlをさらに良く理解するための玩具であると思われたい。頑丈な安定コードとして使うのは、とんでもない間違いだ。Perlの基本 basicsを理解していないなら、ここはスタートする場所ではない。
 
 
デバッグは、初めてコードを書くより2倍も難しい
だから、出来るだけ巧妙にコードを書く人なら、
その名の通り、それをデバッグするのに充分賢くはない.
-- Brian W. Kernighan
 
Caveat Lector (読者にお知らせ乞う).
 
Ben Okopnik
S/V "ユリシス"船上で、サンオーガスチン、フロリダ
--------------------------------------
Frink Ooblickは、Woomertが書いた数字当てゲームを解こうとしてキイボードで眠ってしまった(最初のは易しかったが二番目は未だ解けない)。未だ解けない最初のゲームが画面上に残っていた:
--------------------------------------
perl -wlne'BEGIN{$b=rand$=}$a=qw/Up exit Down/[($_<=>int$b)+1];print eval$a'
50
Down
25
Up
37
Up
44
Up
 
--------------------------------------
秘密は何だ?どう働くのだ?[1] Frinkの夢は、遠くに飛び去ったり、世界を食い潰す怪物に変身したりする沢山のビットで満たされていた。肩を叩かれて目を覚ましたのが救いだった。Woomertが立っていた。イライラしているようだった。
 
−「目を覚ませ!ゲームは進んでいる。君はベッドで怠けてる。行こう!」
 
−「ウ、ウーン、何があったのですか?」
 
−「居間だ。直ぐ来い。怠けてる場合じゃない?」
 
Frinkは、訪問者を一瞥して立ち止まった。仕事師達−システム管理者、技術者など−の扱いには慣れていて、見窄らしい有能そうな、多分ハイキング靴を履いた身なりを想像したが、挨拶したのは幹部らしい縞柄の背広と、アイロンの効いたYシャツに、赤いネクタイ、ピカピカの靴を履いた紳士だった。イライラと床を歩き回っていたが、Frinkを見てホッとした様子だった。
 
−「ああ、貴社の第二チームに違いない!素晴らしい、これで、これを認識する強力な作戦を実現出来る。うむ、貸借対照表で利益計上に入る予想もしないチャンスだ。宜しい、これを風洞実験する方法がある。コンピュータ資源の証券化が、予想された梃子入れに・・・」
 
訪問者を用心深く見つめながら、Frinkは Woomertにささやいた「何を言っているのですか?何語ですか?」
 
−「Marketroidだ[5]。少なくとも基本を学ぶ必要がある。小切手にサインする人は話さない−そんなことに割く時間はない−だがビジネスの世界ではその中に入ろうとしている。用意して置いた方が良いだが、普通は、これらの人々の殆どは未だ英語が話せる。覚えているかどうか試して見よう。ウィブリさん!」
 
訪問者は、明らかに自分が問題の説明と思ったものを終わったところで、オーバーヘッドLCDプロジェクタのスイッチを切り、レーザポインタを置いて、期待に満ちた様子で彼らを見た。明らかに、彼はWoomertの評判を聞いて、何か知らぬが・・取引しようとする有名なコンピュータ探偵に答えていた。
 
−「ウィブリさん、立派なご説明でしたが、ここにいる助手のため問題をもっと基本的な言葉で繰り返して頂けませんか?ビジネス特有の言葉に慣れていなくて、細かい点を聞き逃したようです」
 
訪問者は溜息をついて、近くの安楽椅子に腰を降ろした。
 
−「全く。彼らはシステム管理者の一人をここに送って話し合いする積もりですが、それを聞いたら直ぐに私自身でプレゼンテーションをします。つまり、彼らのうち一人はスライドの肌理細かいバラ色の背景を使うことを考えもしないので、それが癪の種です。兎に角、彼らから自分の言葉で書いた覚書を手に入れましたが、荒削りで全くマーケティング技術に合いませんが、貴方なら分かると思います」
 
コーヒーの染みがあり、計算、覚書、ファイアウォール規則らしいものでほとんど覆われた皺苦茶のナプキンに、赤枠で囲まれた短い覚書があった:

Woomert, spambot(迷惑虫)は、我々のウエブサイト上でe-メールアドレスを集めている(これらには「+印」をつけたので[2]、何処から来たか我々には分かっている)、手に入れた迷惑メールの量は飛躍的に増えている。別にアドレスを持たなければならない−それは我々の接触情報、サイト問題等々だからだ−だが迷惑虫共は止めねばならぬ。ホットリンクを扱うCGIは書いたてしまった、ページに実際のアドレスを表示する必要がある。そうすれば迷惑虫どもがこれを手に入れる。何か良い考えは?ペイジはhttp://xxxxxxxxxxxx.xxxにある。君のアカウントを作った。ssh://xxxxxxxxx.xxx/xxxに行け。パスワードは'xxxxxxxxxx'だ。 以上
- Int Main
 
 
Woomertは(バラ色の背景が快適なことを確かめて)訪問者を送ったた後、Frinkのいる居間に戻った。
 
ー「Woomert、何をするのですか?良い考えがありますか?」
 
ー「うん、奴らのウエブサイトを覗いて見よう。それから周りを見よう。事実を掴む前に決定するのは間違いだ。手元には事実がほとんどない」
 
.・・・
 
もう一度、Woomert とFrinkはウエブサイトの働く懐かしい光景と音に囲まれた。ウエブサーバが、CPU負荷に余り影響を与えないで容易くスレッドを生むのが見えた。ローカルシステム管理者がmod_perl [3]をインストールしたのが明らかだった。至る所でデータ流が泡立っており、油の利いた機械のように万事が滑らかに進んだ。
 
不意の影にFrinkは見上げた。「何か・・・」。いきなり、触角のある恐ろしい怪物 [4] が画面に飛び込んで、忽ちHTMLファイル全部を食って、消えた。
 
ー「あれは何だ、Woomert−蛆虫か?」
 
−「そうだ。此奴らがネットを動き回っている。e-メールアドレスを集めて、軽蔑すべき親分スパマーに渡している。ネットの性質から、奴らを止めることは出来ないが、働き難くすることは出来る。スパマーは頭が悪い。下っ端はもっとそうだ。それが我々の頼りだ。いいか、我々のすることは何でも一時的な対策に過ぎない。スパマーは(少なくともその雇われ技術者は)、この方法を会得するだろうが、そのときは、別の解決策を実行する」
 
便利なターミナルに歩き寄ってWoomertは好みの手袋をはめ、キイボードに指先を踊らせた。
--------------------------------------
perl -MRFC::RFC822::Address=valid -wne'/[\w-]+@[\w.-]+/||next;print valid$&' *html
 
--------------------------------------
'1'ばかりの行が画面に現れた。Woomertはニヤッと笑ってもう一度キイボードを叩いた。
--------------------------------------
perl -i -wlpe's=[\w-]+@[\w.-]+=join"",map{sprintf"&#%s;",ord}split//,$&=e' *html
 
--------------------------------------
今度は、出力が無かったが、Woomertは満足したようだ。彼は速やかに、幾つかの指示と次の最新ワンライナの短縮版を含んだe-メールをシステム管理者宛に発した。
--------------------------------------
perl -we'map{printf"&#%s;",ord}split//,pop' user@host.com
 
--------------------------------------
−[これで良し、Frink。ここでの仕事は終わりだ。ここまで来た]
...
 
旧式のサモワール[6]が据え付けてあって、ジョージア茶で作られたザワルカ(濃縮茶)が良い香りを放っていた。焼き立ての白パンのうえにロシアバターとブラックベリー・ジャムを載せたものから、一寸だけ大蒜を塗った重く黒いライにキャビアを載せたものまで、カナッペの皿が手元近くに置いてあり、Woomert とFrink の両人は、こうして提供された美食を楽しんだ。食物に満足して座り直すと、Frinkの好奇心は持ち堪えられなくなった。
 
ー「Woomert、貴方のワンライナを解こうとすると、ある程度で力を使い果たします。何をしたのか教えて下さい」
 
好きな肘掛け椅子に身を沈めながら、Woomert は微笑んだ。
 
ー「代わりに、どこが分かったか言って見ないか?何処まで進歩したか知りたい。素敵な点を幾つか君が取り上げるのを見るのが楽しみだ。そこから始めよう」
 
ー「じゃ、最初のものから始めましょう:
 
--------------------------------------
perl -MRFC::RFC822::Address=valid -wne'/[\w-]+@[\w.-]+/||next;print valid$&' *html
 
--------------------------------------
コマンド行スイッチは全部思い出しました:
-Mmodule  規定のモジュールを使う
-w  警告を有効にする
-n  プリントしないループ
-e  次のコマンドを実行する
 
しかし、-MRFC::RFC822::Address=valid'syntax が分かりません−何ですか?」
 
−「ああ、これは '-M' へのエントリで 'perldoc perlvar' が言うように、これは一寸したつなぎの味噌だ。'-MBar=foo' は、決められたファンクション 'foo' をモジュール 'Bar' からインポートする 'use Bar qw/foo/' のためのショートカットだ。良くやった。進もう」
 
Frink は咳払いをした。
 
ー「その場合、・・分かった気がします。'perldoc perlvar' と 'perldoc RFC::RFC822::Address' を一寸見させて下さい・・・思った通りだ。分かりました!最初のレゲー
 
/[\w-]+@[\w.-]+/
 
は、e-メールアドレスをマッチさせようとします−完全ではないが、程々にする筈です。言っていることは『一度以上繰り返される”a-zA-Z0-9-”の中の文字で、'@'と、一度以上繰り返される”a-zA-Z0-9-”の中の文字が後に続く文字をマッチさせる』です。マッチしないときは−'||'論理−又は演算子がそれを扱い−次の行に進みます」
 
ー「素晴らしいよ、Frink!次に何が起こる?」
 
ー「マッチしないときは、'next' を飛ばして 'print valid$&' を呼び出します。モジュールのドキュメンテーションの説明では、'valid' ファンクションが、e-メール・アドレスをRFC822(e-メール仕様)適合に関してテストし、有効無効に応じて真又は偽を返します。'$&'は、'perldoc perlvar' によると、最後のパターンマッチ成功、言い換えると何も彼もレゲーにマッチしたです。全部 '1' でエラーが無いのが分かったたので−マッチしてRFC822無効のものは "Use of uninitialized value in print at -e line 1"(-e1行目のプリントに未経験の値を使用)などを返す筈−マッチしたものはすべて有効でした。ここでしたことは、貴方のレゲーだけが、実際のアドレスにマッチすることの点検です。どうですか?」
 
ー「素晴らしいよ。凄く良くなった!注釈として、$&、$`、$' と同時に 'use English' はスクリプトで使わない方が良い。これらには大きい性能低下がつながる('perldoc perlvar' 参照)しかし、ここでは極めて小さいマッチ・リストなので、これを使って進めた。先に行こう。次のものを君が分かるかだ」
 
−「うむ、次ですね。少し分かります−
 
--------------------------------------
perl -i -wpe's=[\w-]+@[\w.-]+=join"",map{sprintf"&#%s;",ord}split//,$&=e' *html
 
--------------------------------------
-i 配置済みエディット(規定のファイルを修正)
-w 警告を有効に
-p プリント・ループ
-e 次のコマンドを実行
うーむ・・・分からないな、Woomert。前に使ったレゲーは分かったけれども、's=' ビットは何ですか?」
 
ー「Perlが提供する便利な工夫の一つだ−だが、正直の処、基本的考え方は 'sed' から盗んだ。これは 's' (代入)演算子とともに使われる区切り記号を交換する。規定値区切り記号 ("/") が極めて不便で、一寸した地獄に堕ちるときがある。−例えば、次のディレクトリ名をマッチさせるとき:
 
s/\/path\/to\/my\/directory/my home directory/
 
つぎのようにパターンにも置換にも含まれない別の区切り記号を使うのが遙かに良い:
 
s#/path/to/my/directory#my home directory#
 
英数字でなく空白でない限り、旨く働く。特殊な場合があるが、全部理由がある:単一引用符の使用はパターンと置換の双方への挿入を無効にし、区切り記号としての大括弧又は小括弧のは、ある程度明らかな文法を必要とする:
 
s{a}{b}
s(a)(b)
s[a][b]
 
多くの人は区切り記号として '#' を好むが、私は '=' が好きだ。'#' はHTMLとコメントに出易いからだ。残りについては分かるかな?」
 
ー「分かりません。e-メールアドレスを前のようにマッチして何かで置き換えましたが、何かが判りません」
 
−「うむ。これは一寸複雑だ。代入の置き換え部分は実際のPerlコードだ。's' 演算子の終わりにある 'e' (評価)修飾子のお陰でこれが出来る。関係コードを右から左に解析しよう」:
 
join"",map{sprintf"&#%s;",ord}split//,$&
 
'$&' がe-メールアドレスを含むのは判っているだろう:次にすることは、'split' を使うことで、これは区切り記号の間で規定された何かの上にスプリットして、スカラーをリストに転換する。しかし、今の場合、区切り記号は空白、ゼロだ−だから戻されたリストの中でアドレスの各文字はリストの中で分離された要素になる。ここでこのリストを 'map' ファンクションに渡す。これは、{ブロック}の中で規定されたコードを渡されたリストの各要素について評価してその結果を−別のリストとして−返す。
ブロック自体の中では、各文字を 'ord' ファンクションに対する引数として使用する。これは、そうして規定された各値について、フォーマットされた次の文字列を返す:
 
&#<ASCII_value>;
 
リストの中のすべての文字が処理された後、'join'ファンクションを使ってリストをスカラに戻す−これを代入演算子が元のe-メールの置換文字列として使用する。"foo@bar.com" であったものはここで次のようになる。
 
&#102;&#111;&#111;&#64;&#98;&#97;&#114;&#46;&#99;&#111;&#109;
 
これは、全くe-メールアドレスらしくないから−迷惑虫は読むことが出来ない!」
 
Frink は困ったようだった。.
 
−「Woomert、言い難いのですが・・・人には誰でも読めませんよ!」
 
Woomert は茶を一口啜って、微笑んだ。
 
−「忘れていることがあるよ、Frink。これはHTMLファイルの一部だから、人は読まないブラウザが読む。そのとき、ASCII文字をその値で示すためのHTML仕様は
 
&#<ASCII_value>;
 
でこれは、正に我々が作ったものだ。このテキストを次の行の間に "text.html"として挿入し、ブラウザで見て、自分で試して見給え。
 
--------------------------------------
<html><head><title></title></head><body>
&#87;&#111;&#111;&#109;&#101;&#114;&#116;&#32;&#70;&#111;&#111;&#110;&#108;&#121;
</body></html>
 
--------------------------------------
判ったかね?」
数秒後、Frink がキイボードから見上げた。
 
−「Woomert、凄い解決策です!客先は、アドレスを取り込まれないで表示することが出来ます。それにウエ