Linux Gazette 7月号

今月の Linux Gazette の内容


今月のニュース

Linux Journal 7月号発売中。今月の特集はサイエンスとエンジニアリング

▼▼▼ディストリビューション関連ニュース▼▼▼

Best

SOT はロシア語版Best Linux をリリースした。ロシア語版以外には英語、スウェーデン語、フィンランド語版もリリースされた。XFree 4.0、Kernel 2.2.14 で Star Office(tm) がバンドルされている。Best Linux 2000 は生涯のインストールサポートを提供している。SOT は1991年設立のフィンランドの企業だ。

Caldera

Caldera Systems, Inc. は欧州で Open Linux ユーザに30日間の電話、90日間のメールによるサポートをフリーで提供する。対応言語は英語、独語、仏語、伊語など。

Caldera の eBuilder はビジネス対ビジネス、ビジネス対消費者の eCommerce ソリューションのためのビルディングブロックを提供する。主な機能はインターネットコマースのオープンプラットフォーム、10以上の eCommerce コンポーネント、ウェブベースの管理、報告ツール、高性能 Linux サーバなど。

Caldera Systems は来るべき OpenLinux Power ソリューションツアーを発表した。ツアーは7月11日のトロントを皮切りに7月27日のテキサス州ダラスまで続く。参加企業は Sun Microsystems, IBM, Lotus, Compaq, Tarantella など。ツアーの目的はインタネット eBusiness に対応した Linux ソリューションの普及だ。ツアーに関する情報はhttp://www.calderasystems.com/partners/tour

lute

LuteLinux は LuteLinux Lite とトレーニング、認定プログラムを発表した。認定プログラムには教育、講演、授業など教育者のためのトレーナープログラムも含まれている。テストが基盤の認定プログラムでは現実の問題解決に必ずしも役立つとは限らない。そこでソリューションは複数の選択が可能で現実の環境に適したものを提供する。トレーニングが不充分、現実の要求に応えられない場合などは再度フリーでトレーニングを実施するなどの補償も提供している。

Red Hat

Advanced Computer & Network Corporation が Red Hat Linux 6.2 の認定を受けた。認定されたのは RAID 記憶システム。 http://www.acnc.com/product_jetstorii_lvd.html

SuSE

SuSE はベネズエラのカラカスに中米本部を設置。代表にはXavier Marmol 氏が任命された。同氏は中米 Linux コミュニティでは良く知られた人物だ。Zulia Academic Network 大学のNetwork 管理者で1995年以降精力的に Linux を導入している。LinuxStart.com の最初のスペイン語のコンテンツマネージャでもある。

SuSE は Apple Power PC、IBM RS 6000、Motorola PreP 用にチューンされた Linux を発表した。リリースは未確認。データベース、ファイアウォール、ウェブサーバ、メールプログラムなどの通常のソフトに加え、Broadcast 2000、GIMP などビデオ編集ソフトや画像操作プログラムがバンドルされている。Mac ユーザに関心があるのは Virtual Machine (MOL) on Linux だろう。Linux 上で Mac OS を走らせることができる。

Storm

Stormix Technologies Inc. と StarNet Communications Corp. は Storm Linux 2000 Deluxe 版に X-Win32 PC Xserver 5.0 をバンドルすることに合意。Windows クライアントから Linux サーバに接続できる。Storm Linux 2000 ユーザは X-Win32 の1年間のライセンスを取得する。
http://www.stormix.com

▼▼▼その他のニュース▼▼▼

今後開催予定のイベント

"Libre" Software Meeting #1
(Rencontres mondiales du logiciels libre)
, sponsored by ABUL (Linux Users Bordeaux Association)
July 5-9, 2000
Bordeaux, France
French: lsm.abul.org/lsm-fr.html
English: lsm.abul.org

Linux Business Expo
(co-located with COMDEX event)
July 12-14, 2000
Toronto, Canada
www.zdevents.com/linuxbizexpo

O'Reilly/2000 Open Source Software Convention
July 17-20, 2000
Monterey, CA
conferences.oreilly.com/convention2000.html

Ottawa Linux Symposium
July 19-22, 2000
Ottawa, Canada
www.ottawalinuxsymposium.org

LinuxWorld Expo
August 15-17, 2000
San Jose, CA
http://www.linuxexpo.com/

IEEE Computer Fair 2000
Focus: Open Source Systems
August 25-26, 2000
Huntsville, AL
www.ieee-computer-fair.org

Linux Business Expo
(co-located with Networld + Interop event)
September 26-28, 2000
Atlanta, GA
www.zdevents.com/linuxbizexpo

Atlanta Linux Showcase
October 10-14, 2000
Atlanta, GA
www.linuxshowcase.org

ISPCON
November 8-10, 2000
San Jose, CA
www.ispcon.com

Linux Business Expo
(co-located with COMDEX event)
November 13-17, 2000
Las Vegas, NV
www.zdevents.com/linuxbizexpo

USENIX Winter - LISA 2000
December 3-8, 2000
New Orleans, LA
www.usenix.org

Linux Lunacy
Co-Produced by Linux Journal and Geek Cruises
October 21-28, 2001
Eastern Carribean
www.geekcruises.com

スペイン語 Linux Gazette - La Gaceta de Linux

Piensa Systems はスペイン語版の Linux Gazette La Gaceta de Linux の立ち上げを発表した。Linux とオープンソースの技術の普及、低コストの IT サービスに対する需要への対応などが目的。一方では将来を担う学生への Linux、先端技術の普及も念頭に入れている。Bufete Consultor de Mexico, S.A. de C.V. (BCM) は1994年設立の情報テクノロジコンサルティング企業。"Piensa Systems"、"piensa.com" はどちらも BCM の登録商標。

オートマチックハウスの技術 -- Adomo

Adomo は低コストで簡単に利用できる家庭用情報アプライアンスだ。LinuxDevices' technical overview paperによるとOS には Linux が採用されている。同社広報者によると "Cobalt Qube 家庭版"。

Compaq がハンドヘルドに Linux を採用

Compaq は同社の iPAQ ハンドヘルドデバイスに Linux を採用したと発表。

テレフォニースイッチ

ネットワークオペレータ、サービスプロバイダ用の通信ソリューションデベロッパである英国の Axtar Limited は Red Hat 対応で compactPCI フォームファクタのプログラマブルスイッチ、OneSwith を発表。対象はウェブベースのコールセンタ、プリペイドカード、インターネットコールウェイティングサービスなど。リリースは2000年第3四半期の予定。

Linux NetworX

インターネット、企業、調査研究用の大規模クラスタコンピュータソリューションプロバイダ、Linux NetworX, Inc. は新ウェブサイト(www.linuxnetworx.com) を立ち上げた。同社の製品、サービス情報、クラスタリング情報の提供のため。

Linux NetworX はクラスタリング環境で使用される 19 インチシャーシ開発の第一段階が終了したと発表した。コードネームは "Sundance Project" 。詳細は8月15日に サンノゼの LinuxWorld トレードショーで発表される予定。

Linux NetworX は高可用性、ハイパフォーマンスコンピューティングの end-to-end クラスタコンピュータソリューションを提供。クラスタシステムはアプライアンスとして提供されているが顧客のニーズに応じてカスタマイズが可能。

FreeDesk が Tarantella を選択

The Santa Cruz Operation の The Tarantella DivisionFreeDesk.com が Tarantella を採用したと発表した。これは ウェブベースの集中管理ツールである FreeDesk の Citrix MetaFrame を置き換えるもの。

Linux ニュースレター

Atlanta Linux Newsletter は1年以上フリーのニュースレターを発行している。現在の発行数は 5,000 で目標は 10,000 だ。配布地域はアトランタ周辺で現在のチャンネルは Computer User 誌に添付している。今後は Linux のビジネスソリューション、Linux 初心者など対象の拡大を検討している。http://www.linuxgeneralstore.com

kaivo.com、オープンソースの新サービス

Kaivo, Inc. はオープンソース、サービス用のベンダに依存しないサービスを立ち上げた。kaivo.com はオープンソースの進化に関心のある IT エグゼクティブとオープンソースベンダとの結びつきを目的にしている。Kaivo.com の新サービスの特徴はソリューションの検索、プロバイダの検索、オープンソース関連のエンサイクロペディアの提供など。Kaivo は "source" を意味する古いフィンランド語だ。

Alpha プロセッサニュース

API (Alpha Processor, Inc.) は新マザーボード、UP1100 を発表。UP1100 は Beowulf クラスタ、ウェブサーバ、システム開発などのコスト効率の良いエントリレベルの Alpha ボードだ。API の広帯域のメモリバス、UP1100、Linux とでハイパフォーマンス、スケーラブルで信頼性の高いシステムを構築することが可能。CPU は Alpha 21264 でトータルコストを抑えることができる。サウンドとイーサネット機能のオンボードが低コストに役立っている。7月にリリースの予定

API は Quadrics Supercomputers World (QSW) との協力を発表した。QSW は欧州のスーパーコンピュータプロバイダの大手だ。QSW はハイパフォーマンス、スケーラブルの並列計算モデルスーパーコンピュータを提供することができる。

QsNet は API の64ビットプラットフォームを提供。QsNet は SMP ノードのインターコネクトを提供している。プラットフォームには QsNet の第3世代の "Elan and Elite"、ASIC と API の UP2000 マザーボードが統合されており、システムは QsNet のリソース管理システムにより管理されている。

Linux の研究開発施設オープン

Tata consultancy Service (TCS) は Dell コンピュータの Linux 関連テクノロジ研究開発施設のオープンを発表した。同時に Dell と共同開発した Red Hat 6.X のテストを主眼としたツールも発表した。施設の場所はテキサス州ラウンドロック。テキサス大学やローカルコミュニティなどから優れた人材を募集している。TCS はソフトウェアテクノロジコンサルタント企業だ。http://www.tcs.com

Transmeta の Crusoe プロセッサ

Rebel.com Inc.Transmeta の Crusoe プロセッサの採用を発表した。NetWinder OfficeServer のスモールゲートウェイに採用する予定。Rebel.com は RebelNetworks を発表した。価格は月599ドル。RebelNetworks は広帯域のネットワーク、安全なメールとネットワークインフラを提供する。広帯域には Bell Canada の DSL ラインを利用している。

Linux リンク

BASCOM's Open Source Equipment Exchange: コンピュータ機器の寄贈

The TERMinator: PC 技術用語

Linux Graphics Programming with SVGAlib: X を使用しないグラフィックアプリケーション作成

"I've installed Linux: What Next?": 今回の話題は MP3、ゲーム、科学計算プログラム、PIM、CD書き込みなど

Maximum RPM (第2版) がwww.rpm.org ダウンロード可能

Linux Security Knowledge Base: Linux のセキュリティに関する記事のコレクション

Magic Software: 州内のエージェンシーへの犯罪記録管理ソリューションの提供

ITsquare.com: Linux 開発企業を検索するためのウェブアプリケーション

サーバベースの Java プログラム (by Ted Neward): オンラインのサンプルは http://www.manning.com/Neward3/Contents.htmlhttp://www.manning.com/Neward3/chapters.html

Humorix: 面白い読み物

New Warez Distribution Addresses Ease of Use Issues : Linux Today の面白い読み物

Linux Loving Sluts: 多分 Linux 初のポルノサイト

▼▼▼ソフトウェア関連ニュース▼▼▼

MySQL が GPL に

Yahoo によると MySQL がオープンソースに移行。VA Linux System's investment にも同様の記事が掲載されている。

COLA ソフトウェアニュース

Berlin 0.2.0 がリリースされた。Berlin は X-windows ではない。http://download.sourceforge.net/berlin/Berlin-0.2.0.tar.gz からダウンロードできる。

StrongARM 版 CommuniGate Pro mail

Stalker の Linux 対応プラットフォームが拡大した。Intel ベースに加え、CommuniGate Pro はPowerPC、MIPS、Alpha、Sparc、StrongARM 上の Linux に対応。非常にスケーラブルなこのメッセージングサーバはサーバ1台で 100,000 アカウントを捌くことが可能。CommuniGate Pro のクラスタリング 機構を使用すればその数は論理的には無限になる。Cobalt Cubes や Rebel com の NetWinder mini-servers で利用すればオフィス環境や小規模 ISP には理想的なインターネットアプライアンスとなる。評価版がhttp://www.stalker.com/CommuniGatePro/ からダウンロードできる。

Lineo Embedix SDK をリリース

Lineo, Inc. は x86 用の Embedix SDK の出荷を開始した。Embedix SDK は組込みソリューション構築時のトータルコストを削減する開発ツールだ。
http://www.lineo.com

Lutris/Enhydra 関連ニュース

Lutris Technologies, Inc. は Enhydra Enterprise のコードのリリースを発表した。これは初めてのエンタープライズレベルの Java/XML オープンソースアプリケーションサーバで、BullSoft、France Telecom、Enhydra 開発コミュニティの協力の賜物だ。

Lutris は最新の Enhydra Java(tm)/XML アプリケーションサーバ、Lutris Enhydra Professional 3.0 のリリースを発表した。インターネット、ワイヤレスアプリケーション構築のための開発環境、ツールなどが含まれている。さらにオープンソースの PostgreSQL と java の InstantDB、データベースも含まれている。Borland JBuilder Foundation 3.5 を利用すれば快適な開発環境が構築できる。価格は499ドル。

Lutris はThe Open Group に参加した。The Open Group はベンダ、テクノロジに依存しない企業レベルの統合を目指す団体で Lutris は Security Program Group に参加した。

Omnis Studio: ドラッグアンドドロップ WAP

Omnis Software によると次期 Omnis Studio にはいくつかの機能が統合される。最も注目されるのはドラッグアンドドロップ WML (Wireless Markup Language) エディタで、サーバのデータへ WAP (Wireless Application Protocol) からの接続が容易になる。WML は XML のサブセットで携帯電話やページャのコンテンツ、ユーザインタフェース構築用に開発された。Omnis Studio は高性能の RAD ツールでコンポーネントベースで eコマース、データベース、クライアント/サーバアプリケーションを構築することができる。同社の WebClient プラグインを利用すればブラウザ経由でデータにアクセスすることができる。過去2四半期で Omnis Studio 開発者が倍増しているがその理由に Linux OS の採用、Studio の低価格化、Omnis Studio の普及などがあげられている。

ゲーム

Spiderweb Software と Boutell.com は Linux 用のExile: Ruined World をリリースした。これは壮大なロールプレーイングゲームだ。詳細はhttp://www.spiderwebsoftware.com/exile3/linuxexile3.htmlから入手できる。

Loki は Linux 版 Quake III Arena の SDK をリリースした。又7月には Interplay のDescent 3 を移植する予定。

Loki はCogniToy の MindRover. The Europa Project の Linux 版を秋にはリリースする予定。MindRover はロボティックマシンを操縦してレースをする 3D ゲームだ。

Loki は QLITech Linux Computers のワークステーションにゲームをバンドルすることになった。バンドルされるゲームは Civilazation: Call to Power、Heavy Gear II、Loki ゲームデモ CD などだ。

組込みウェブサーバ

GoAhead Softwaer は 組込みウェブサーバ、GoAhead WebServer(TM) 2.1 のリリースを発表した。IDC によると2002年までには 4,200万の機器がインターネットに接続されるようになるがウェブサーバを機器に組込めば機器の出荷後も極めて容易に機器にアクセスすることが可能になる。GoAhead WebServer は唯一のオープンソースの組込みウェブサーバだ。GoAhead WebServer 2.1 は SSL (Secure Socket Layering)、DAA(digest access authentication) に対応している。ソースコードは http://www.goahead.com/webserver/wsregister.html からダウンロードできる。

iTools

iTools は Apache の設定を著しく容易にするツールだ。Tenon Intersystems's の iTools は Linux ネットワークパフォーマンスを強化するもので、Apache、DNS、FTP、sendmail が基本になっているが、WEBmail サーバ、SSL 暗号化エンジンに対応し eCommerce、サーチエンジンを支援している。さらに FastCGI と mod_perl にも対応しており、設定はブラウザベースでできる。評価版はhttp://www.tenon.com/products/itools-linux からダウンロード可能。

その他のソフトウェア

Chili!Soft は Active Server Pages 開発者用の ASP とSpicePack を発表。ASP 3.5.2 は対応ディストリビューションが増加し、データベースにも対応、インストールが容易になった。SpicePack 1.0 は SMTP、POP3 などに ASP オブジェクトを追加する。評価版はhttp://www.chilisoft.com/downloads/からダウンロードできる。

Trustix ASの XPloy は Linux システム管理の GUI を提供する。Linux/Windows ワークステーションからの管理が可能。

Proven Software, Inc. はシングル・マルチユーザソフトウェアの部門を分離した。BestAcct は小規模組織、個人用のデスクトップ、Proven CHOICE Accounting はマルチユーザシステムを提供する VAR 用だ。Prove Software はビジネスアプリケーション開発を15年以上手がけているが、Linux は5年になる。

Financial Accounting Systems, Inc. はLinux 用の会計システムを開発。

Hypercosm は Linux 用の次世代 3D オーサリング技術を提供。

LinkScan はウェブサイトで利用できるテストスイート開発を支援する。

WebKing 2.0 もウェブサイトのテストプログラムだ。ParaSoft は従来のテスト方式に加え Web-box テスティング技術を採用。http://www.parasoft.com 又は http://www.thewebking.com

Metro Link, Inc. は Metro Link 用に強化した Open Motif をリリース。http://www.metrolink.com/openmotif/http://www.opengroup.org/openmotif/ からダウンロードできる。

HELIOS: EterShare 2.6 は Apple Talk の Unix への実装。PCShare 3.0 は Unix サーバでWindows 互換のファイル、プリント共有。

Xi Graphics Inc. は Linux 用の 3D グラフィック製品のアップデートをリリース。アップデートによりパフォーマンスの向上と信頼性の強化が図られる。登録ユーザにはフリーで提供される。

Progressive Development Systems, Inc. は卸売業用のデータベースソリューションプロバイダだ。新製品、WAM(Web Access Module) をリリースした。


This page written and maintained by the Editor of the Linux Gazette. Copyright © 2000, gazette@ssc.com
Published in Issue 55 of Linux Gazette, July 2000

More 2 ¢ Tips

Netscape 2c tip

psutils パッケージを使って 2コラムでの印刷。レターサイズなら Netscape での印刷コマンドを "pstops -q -w8.5in -h11in -pletter "2:0L@0.7(8.in,-0.1in)+1L@0.7(8.in,4.95in)"  |  lpr -h" とすればいい。pstils はhttp://www.dcs.ed.ac.uk/home/ajcd/psutils/index.htmlからダウンロードできる。

Mandrake とメモリ

Mandrake 7.1 はインストーラはメモリ容量を正確に認識するが lilo、grub の変更はしてくれない。lilo に "mem=128M" を追加しよう。

Intel i810

Intel i810 のソリューションは support.intel.com で見つかる。X サーバ、カーネル、インストール用マニュアルが提供されている。

root のパスワードを忘れたら

ブートフロッピからシングルモードで起動したら、/etc/lilo.conf を修正して lilo を実行する。続いて /etc/passwd, /etc/shadow から暗号化されたパスワードを削除してルートでログインしなおす。パスワードは何も入れる必要はない。ログインできたらパスワードを設定しなおそう。

CPU の負荷

CPU の情報は top で、メモリの情報は/proc/stat から得られる。

画面の解像度

画面の解像度を CTRL ALT + で変更するにはビデオカードが正しく設定されている必要がある。X の情報を得るには startx の代わりに "startx 2>&1 | tee startx.txt" を実行する。Xconfigurator を実行する際には正確な水平、垂直スキャンレートを入力していなければならない。SiS カードは個体により違う場合がある。正しく設定しても反映されなければ Matrox のカードを使おう。


This page written and maintained by the Editor of the Linux Gazette. Copyright © 2000, gazette@ssc.com
Published in Issue 55 of Linux Gazette, July 2000

0800-Linux; フリーのLinux ISPを作る(By Carlos Betancourt)

前回この記事を書いてから多数の反応があった。励ましやバーチャルホストの提供、ソウルで開催されるGlobal Linux 2000への招待など多岐にわたる。それらの反応からいろいろなことを学んだ。又このプロジェクトを早急に実現しなければならないと気持ちを新たにした。実際に起こったことをいくつか紹介しよう。

筆者は6月14-17日に開催されたLinuxGreenhouse に招待され、非常にたくさんの人々と会った。複数の企業ともこのプロジェクトに関してミーティングを持った。韓国にはアジア地域を対象にした企業がたくさんある。こういう企業が世界市場で認知されるにはコストがかかる。こういった企業がオープン ISP プロジェクトをハードウェアの面で支持してくれる。オープン ISP プロジェクトのスポンサーに加わることが彼らにとってパブリシティの機会となるかもしれない。一番問題になったのはインターネットにアクセスする際の通話料だ。初めはベルギーを念頭に置いたのだが他の国での関心も高く、複数の国で実践されればそれだけ成功の確率も高くなるのではないかと思う。欧州連合の場合は eEurope Initiative と趣旨が同じなので政府からの支援も可能だ。

通信料金に関しては現在無料のプロバイダもいくつかあるが、それぞれに制約がありしかも個人のプライバシーを引き換えにしなければならない場合もある。無料のプロバイダの規約から逸脱したり、契約年数未満で契約を解除する場合はかなりの違約金が発生する場合がある。韓国では Henzai がインターネットアプライアンスを寄付してくれることになった。Henzai のアプライアンスを利用できればインターネットアクセスのコストを圧縮できるかもしれない。このプロジェクトは企業ではないのでハードウェアで損失を出すことはない。サービスから得た収益は通信料金へまわすことができる。アクセス中に広告を表示することもユーザのプライバシーが他の団体で利用されることもない。今までインターネットにアクセスできなかった人々に多くの機会を提供し、インターネットや Linux に触れる子供たちが増加することになるだろう。

ISP の数が増えるにつれ ISP のサービスが改善されコストも低下している。これは結構なことなのだがいろいろなサービスを提供することが我々のプロジェクトの脅威となる可能性もある。たくさんの ISP が出現しては合併し、消滅したりを繰り返している。ほとんどの ISP がサポートしているのは MS-Windows だ。でもそれでは常に料金の支払いが発生する。無料のプロバイダもあるがそれなりの義務があるのが普通だ。今言えることはすぐに始めなければうまくいかないだろうということだ。

では実際にどのような行動をとるのか。

Linux コミュニティにとってはコンシューマベースを拡大するいい機会になるだろう。今目の前にある自由は我々のパソコンで獲得できるものではない。我々のコンピュータがつながって初めて可能になる。Linux がインターネットの子ならネットワークは必要な酸素だ。


Copyright © 2000, Carlos Betancourt
Published in Issue 55 of Linux Gazette, July 2000

今月の漫画 HelpDex をご覧になるには ここ をクリックしてください。


ジャーナルファイルシステム (By Juan I. Santos Florido)

Linux が普及するにつれユーザに必要な機能がいろいろと付け加えられてきた。マイクロコントローラ、Linux ルータ、フロッピ Linux、マルチディスプレイ、Linux ゲームなどその数は多い。Linux のサーバとしての機能も同様な過程をたどっており、商用 UNIX が提供している機能を提供できるようになった。その一つが大容量ディスクをサポートしスケーラブルで容易にファイルの修復ができるなどの機能を備えたファイルシステムだ。その他にも I/O パフォーマンスの向上、フラグメントの減少など要求されるものは多い。今回はジャーナルファイルシステムを紹介し、ジャーナルファイルシステムのベンチマークをテストしてパフォーマンスのチェックもしてみたい。

内部フラグメンテーションは論理ブロック未満のファイルを保存したときに使用されずに残る部分だ。論理ブロックとファイルサイズが一致しなければ必ず内部フラグメンテーションが発生する。これに対し論理サイズより大きなファイルが連続したスペースで保存されずに分散されしまうことを外部フラグメンテーションという。エクステントは論理ブロックをいくつかまとめて使用することだ。通常の論理ブロックよりもサイズが大きければディスクの読み書き処理が高速化される。エクステントが論理ブロックと同じサイズなら高速化の効果はほとんど期待できない。エクステントデスクリプタは開始位置、サイズ、オフセットからなる。

B+treeは元来データベースのインデックスとして使用されてきたので高速にデータにアクセスすることができる。

データベースではそれぞれのレコードのキーにより他のレコードと区別される。Btree はそのキーをデータベースのインデックスとして利用する。それぞれのデータは隣接するデータへのポインタを保持している。B+tree で検索するにはルートノードを逐次検索し、検索するターゲットより値が大きくなれば内部ノードもしくはリーフノードへ移動し、同じことを繰り返す。最後はリーフノードで逐次検索をすることになるが検索処理数は通常の逐次検索よりは遥かに少なくなる。

UNIX ファイルシステム(UFS) は SCO、System V、その他の UNIX が使用するファイルシステムだ。Linux もオプションでサポートしている。

バーチャルファイルシステム(VFS) はファイルシステムに囚われずに共通のインタフェースを提供するカーネルレイヤーだ。

ライトキャッシュはよくご存知だろう。I/O の高速化のためにメインメモリに割り当てられているバッファだ。このようなバッファはファイスシステムやデータベースでは全体のパフォーマンスを向上させるために良く使われる。しかしバッファがディスクに書き戻される前にシステムがクラッシュした場合には問題が起こる。再起動後のデータがクラッシュ前のデータと同一ではなくなってしまうからだ。そのためにデータベースやファイルシステムはシステムに齟齬が生じないような方法を組込む必要がある。データベースと違い UFS のようなファイルシステムはサイズが大きくなるにつれ修復に時間がかかる。ext2fs の fsck はファイルの修復をするためにすべてのパーティションを検査しなければならない。大容量のサーバの場合は不便極まりない。このためファイルシステムもデータベース修復方法を利用しており、ここにジャーナルファイルシステムが登場することになる。ほとんどのデータベースはトランザクションを使用している。トランザクションとは複数の属性を満たすオペレーションのセットだ。ACID 属性とは Atomicity、Consistency、Isolation、Durability の略だが、今回注目するのは Atomicity だ。これは一つのトランザクションはすべての処理がエラーや中断なしに終了することだ。データベースはトランザクションの処理をすべてログファイルに記録している。トランザクションの後にオペレーションがあり、バッファをディスクへ書き出す。そのためシステムがクラッシュしてもログファイルをトレースしてデータを修復することができる。ジャーナルファイルシステムも同じ方法で短時間にファイルシステムを修復しようというものだ。データベースとファイルシステムとの違いはデータベースはユーザとコントロールデータを記録するのに対し、ファイルシステムはファイルシステム内部の管理構造であるメタデータを記録する。

Unix ファイルシステム(UFS)と ext2fs が作られた当時は記録メディアのサイズは小さかった。記録メディアの容量が大きくなるとファイルシステム自体にも問題が出てくる。古いファイルシステムのファイルサイズビット数や論理ブロック数のビット数が固定なので大きな容量を扱えなくなってきている。たとえ新しいオブジェクトサイズを扱えたとしてもパフォーマンスが出ない。新世代のファイルシステムはこれらの問題を解決し、スケーラビリティを念頭に設計されている。新しいファイルシステムではフィールドのビット数が拡張されており、旧来の制限が取り払われている。新しいファイルシステムの制限は次の通りだ。

 
Max. file system size
Block sizes
Max. file size
XFS
8 thousand petabytes
512 bytes to 64KB
9 thousand petabytes
JFS
512 bytes blocks / 4 petabytes
512, 1024, 2048, 4096 bytes
512 Tb with 512 bytes blocks
4KB blocks / 32 petabytes
4 petabytes with 4KB blocks
ReiserFS
4GB of blocks, 16 Tb
Up to 64KB
Currently fixed 4KB
4GB, 2^10 petabytes in ReiserFS (3.6.xx)
Ext3FS
4Tb
 1KB-4KB
2GB

UFS や ext2fs ではブロックごとに1ビットが割り当てられ空きブロックかどうかを表示している。これでは記録容量が増加すれば走査するブロック数も増えパフォーマンスも落ちてしまう。新しいファイルシステムでは B+Tree とエクステントが用いられて、空きブロックの走査が短時間で済みブロックのビット数もファイルシステムのサイズの制限を受けなくなる。しかしファイルの断片化が進行してエクステントのサイズがブロックと変わらなくなるとそのメリットもなくなってしまう。さらに逐次検索よりも B+Tree の方が検索時間が短いので空きブロックの管理をリストから B+Tree に変更すれば空きブロックの走査が短時間ですむ。B+Tree に空きブロックではなくてエクステントが組込まれれば効率は大幅にアップするだろう。

従来のファイルシステムはディレクトリの処理にリストを利用して逐次検索を用いている。それ故ファイル数の増加やサブディレクトリの増加などでエントリが増加するとパフォーマンスは非常に落ちてしまう。ディレクトリエントリにも B+Trees を利用すればファイル名やディレクトリの走査時間はかなり短縮される。

本来 UFS や ext2fs は小さなファイルを扱うことを念頭に設計されている。i-node は UFS や ext2fs で利用されている構造体で許可、タイプ、リンク数、ポインタなどのファイル関連情報を保持している。ポインタは直接、関節のポインタが格納されている。直接ポインタはファイルが格納されている論理ブロックを指すもので、関節ポインタはファイルが格納されている論理ブロックを指すブロックを指すポインタだ。ファイルサイズが増大すると2次、3次の間接ポインタが増加してパフォーマンスを落とす原因になる。新しいファイルシステムはスペースを効率的に使用し、大きなファイルでも迅速にアクセスできるアドレス方式でなければならない。そのために B+Trees が使用される。間接ポインタを減少するには論理ブロックサイズを大きくすればいいのだがそれでは内部フラグメンテーションが増加してしまう。そのために複数の論理ブロックをまとめて扱うエクステントが利用される。

UFS 系ファイルシステムは iノード数が固定されている。そのためファイスシステムが管理できるオブジェクトの最大数も固定されてしまう。それを解決するために考え出されたのがダイナミック i ノードアロケーションだが、複雑で時間がかかる。


Copyright © 2000, Juan I. Santos Florido
Published in Issue 55 of Linux Gazette, July 2000

Linux コンソールのホットキーを作る (By Bryan Henderson)

筆者はコンソール派だ。最近の Linux ではクリックだけで他の OS と同じようなことができるが、筆者の好みはコンソールで bash だ。GUI を利用するようになったのはインターネットがグラフィックブラウザでなければ見るにたえないからだ。コマンド派でもコマンドを何度も入力するのは気が滅入る。そこで F2 キーにはメール起動を割り当て F1 にはファイルの編集を割り当てている。今回はその方法を紹介しよう。筆者の使っているキーボードは IBM(ISA) だ。すべてのキーボードに当てはまるとは限らない。Bash はキーボードからの入力に readline サブルーチンを使用している。コマンドラインの編集を処理しているのは readline だ。readline のファンクションの一つが文字列の挿入だ。いい例ではないが「ps -a --forest」という文字列を「z」に割り当ててみよう。~/.inputrc とファイルに次の文を追加すればいい。

"z":"ps -a --forest" 再度ログインすれば有効になっているはずだ。キーボードから z と入力すると ps コマンドが実行される。もう少し実用的に今度は F1 キーに割り当ててみよう。F1 キーはターミナルにより出力が異なる。Linux コンソールの場合は F1 が押されると 「Escape, [, [, A」の4文字を出力する。出力する文字列が分かればそれを ~/.inputrc に追加すればいい。 "\e[[A":"ps -a --forest" 今回はログアウト、ログインを繰り返すよりももう少しスマートに Control-X Control-R としてみよう。readline の設定を再度読み込んでくれる。F1 を押せば 「ps -a --forest」が実行されるはずだ。

これではまだ Enter を入力しなくてはならない。文字列の最後に Control-M があれば readline は bash に文字列を渡してくれる。~/.inputrc に次のような文字列を追加して再読みこすれば一度キーを押すだけで実行される。

"\e[[A":"ps -a --forest^M" ^MControl-M だ。今回は F1 を使ったが、その他のキーのエスケープキャラクタが分からなければ Control-V の後に知りたいキーを押せばいい。詳しくは readline のユーザガイドや man ページを参照して欲しい。

tty デバイスドライバはいくつかのスペシャルキャラクタにしか対応していないので readline が直接コントロールしているのだが Control-S, Control-Q, Control-C, Control-Z は例外だ。その通りの動作をする。キーボードドライバも若干問題がある。キーボードドライバを使えばキーのカスタマイズが可能だが、特定のキーが特定のファンクションに割り当てられている場合がある。Alt-F1 は仮想コンソールを変更する。だから変更しないほうがいい。X の場合には Linux キーボードドライバをほとんど利用しないので readline の動作が Linux 仮想コンソールの動作と完全に同じとは限らない。


Copyright © 2000, Bryan Henderson
Published in Issue 55 of Linux Gazette, July 2000

Bash の隠れた機能 (By Ben Okopnik)

bash の構文解析機能は perl や awk に比べると必要最低限の機能しか実装されていない。それでも非常に便利な機能だ。例えばディレクトリのファイル名の大文字小文字を区別して X の背景にフルスクリーンかタイルで張りつけるスクリプトは次のようになる。



fn=$(basename $fnm)


[ -z ${fn##[A-Z]*} ] && MAX="-max"    # 真なら "-max" スイッチをセット


xv -root -quit $MAX $fnm &            # xv" を "-max" スイッチにより起動


[-z ...] は文字列の長さをテストする。解析結果を保護したければ {} で囲む。$d と ${d} は基本的には同じだが2番目の変数と結合された結果が違ってくる。


d=Digit


echo ${d}ize        # "Digitize"


echo ${d}al         # "Digital"


echo ${d}s          # "Digits"


echo ${d}alis       # "Digitalis"


次は bash に組込まれているツールを使ってみよう。$parameter には "amanuensis" が代入されているとする。

${#parameter} - 変数の長さを返す。
EXAMPLE: ${#parameter} = 10

${parameter#word} - 最初にマッチした部分以降を返す。
EXAMPLE: ${parameter#*n} = uensis

${parameter##word} - 最後にマッチした部分以降を返す。
EXAMPLE: ${parameter#*n} = sis

${parameter%word} - 後方から最小マッチ部分を返す。
EXAMPLE: ${parameter%n*} = amanue

${parameter%%word} - 後方から最長マッチ部分を返す。
EXAMPLE: ${parameter%%n*} = ama

${parameter:offset} - offset 以降を返す。
EXAMPLE: ${parameter:7} = sis

${parameter:offset:length} - offset から length 文字を返す。
EXAMPLE: ${parameter:1:3} = man

${parameter/pattern/string} - マッチした部分を置き換える。
EXAMPLE: ${parameter/amanuen/paralip}= paralipsis

${parameter//pattern/string} - マッチするものをすべて置き換える。
EXAMPLE: ${parameter//a/A} = AmAnuensis(pattern が # で始まれば行頭を、% で始まれば行末を示し、string が空の場合はマッチする部分が削除される。)

まだいくつかあるが詳細は man ページを参照して欲しい。

先ほどのコード、 [ -z ${fn##[A-Z]*}] はもう難しくはないだろう。大文字で始まって最長のマッチ、つまりファイル名を調べ残りがゼロなら真となり $MAX がセットされる。 

文字列の長さではなく代入がされたかどうかを調べてみよう。今度の変数 $joe は何もセットされていない。

${parameter:-word} - parameter がセットされていなければ word で置換。
EXAMPLE: ${joe:-mary} = mary ($joe remains unset.)

${parameter:=word} - parameter がセットされていなければ word を代入。
EXAMPLE: ${joe:=mary} = mary ($joe="mary".)

${parameter:?word} - parameter がセットされていなければ word もしくはエラーを表示する。
EXAMPLE:
Odin:~$ echo ${joe:?"Not set"}
bash: joe: Not set
Odin:~$ echo ${joe:?}
bash: joe: parameter null or not set

${parameter:+word} - parameter がセットされていれば word で置換。
EXAMPLE:
Odin:~$ joe=blahblah
Odin:~$ echo ${joe:+mary}
mary
Odin:~$ echo $joe
blahblah

もう一つの bash の組込み機能は配列の操作だ。例えば最新の「セーラーズニューズレター」をアドレス帳の区分が友人になっている人全員に送りたい場合にどうするかなどだ。例えば次のようなアドレス帳があるとする。



Name                     Category  Address                  e-mail


Jim & Fanny Friends      Business  101101 Digital Dr. LA CA fr@gnarly.com


Fred & Wilma Rocks       friends   12 Cave St. Granite, CT  shale@hill.com


Joe 'Da Fingers' Lucci   Business  45 Caliber Av. B-klyn NY tuff@ny.org


Yoda Leahy-Hu            Friend    1 Peak Fribourg Switz.   warble@sing.ch


Cyndi, Wendi, & Myndi    Friends   5-X Rated St. Holiday FL 3cuties@fl.net




#!/bin/bash





# 'nlmail' は毎月ニューズレターをアドレス帳に基づいて送る





# bash は配列を作成する。


# 'name[subscript]' の構文を使用するが 


# 宣言してもかまわない。


 


declare -a name category address email





# アドレス帳の行数を計算し行数文ループをまわす 





for x in $(seq $(grep -c $ phonelist))


do


    x=$(($x))                           # Turns '$x' into a number


    line="$(sed -n ${x}p phonelist)"    # Prints line number "$x"


    name[$x]="${line:0:25}"             # Load up the 'name' variable


    category[$x]="${line:25:10}"        #  Etc.,


    address[$x]="${line:35:25}"         #       etc.,


    email[$x]="${line:60:20}"           #            etc.


done


# 続く ...


アドレス帳から配列にデータを読み込む。


# 上記スクリプトからの続き ...


for y in $(seq $x)


do


    # 'category' の中の 'friend' を検索  


    # メールを送信


        


    if [ -z $(echo ${category[$y]##[Ff]riend*}) ]


    then


        mutt -a Newsletter.pdf -s 'S/V Ulysses News, 6/2000' ${email[$y]}


        echo "Mail sent to ${name[$y]}" >> sent_list.txt


    fi


done


送信先の名前が "sent_list.txt" に書き込まれる。100KB のアドレス帳(1500人)を作って Pentium 233/64MB のマシンで実行してみたら24秒かかった。この手のツールでは悪くない結果だろう。重要なのは配列に格納しやすいデータが必要だということだ。


Copyright © 2000, Ben Okopnik
Published in Issue 55 of Linux Gazette, July 2000

HTML エディタ、Bluefish (By Martin Skjoldenrand)

以前に Windows 用の HTML エディタのレビュー記事を書いたことがある。今回は Linux 用の HTML エディタ Bluefish を試用してみる。Bluefish はバージョン番号 0.3.4 からも分かる通りまだ安定板とは言えないが既に非常に強力なエディタである。

Bluefish running under Gnome, Expensive theme
ご覧の通り直感的に操作できるようになっている。ボタンの配列は標準的でタブメニューも使いやすいがカスタマイズはできない。タグは論理的に配置されているが分かりやすいとは言えない。ウィザードは非常に使いやすいが From ウィザードはバグが残っている。ヘルプはまだ実装されてはいないし、Imlib がインストールされていないとイメージタグを自分で入力しなければならない。でもすでにすばらしい HTML エディタだ。


Copyright © 2000, Martin Skjøldenrand
Published in Issue 55 of Linux Gazette, July 2000

セキュリティを考慮したゲートウェイ (By Chris Stoddard)

前回の記事では必要最低限のパッケージをインストールした。今回はゲートウェイを砦に変えよう。ただ完全なセキュリティというものはない。この記事は Linux のインストール、設定、ルートでのログイン、ファイアウォールなどに関する知識があることを前提にしている。もし DNS、DHCP、ウェブサーバ、ftp/telnet サーバなどを動作させたければ別のマシンで動作させることをお勧めする。目的は外部からアクセス可能でセキュリティを確保した非武装地帯を作ることだ。そうすればサーバに進入されてもまだファイアウォールを突破しなければならない。

コンピュータのセキュリティに関しては知識は力だ。守るほうは常に攻める側から1歩送れている。侵入されてはじめて対策がとれる。だから情報を常にアップデートしておく必要がある。パッケージも "rpm -qa > package.txt" で確認し、最新のプログラムをインストールするよう心がけよう。この記事の目的はケーブルモデムを使用したホームサーバのセキュリティなので物理的なセキュリティはこの記事の目的ではない。

ルートの他にユーザアカウントを作成しよう。どちらのパスワードも8文字以上で大文字、小文字、数字を使用し、辞書には出ていないものにしなければならない。頻繁にパスワードを変更するのもいい方法だ。ただしそれを書きとめたりしないように。それぞれのマシンのパスワードはそれぞれ違うものを使おう。侵入するには時間がかかる。大事に至る前にそれを発見することが大事なのだ。Linux ディストリビューションはデフォルトでスペシャルアカウントをインストールする。これも必要ないので 'userdel username" で削除しよう。削除するアカウントは adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, ftp だ。ついでに adm, lp, news, uucp, games, dp, pppusers, popusers, slipusers などの関連するグループも削除しよう。

次は最も重要な設定ファイルの説明だ。同じコマンドを何度も入力しなければならないのでその前に簡単なシェルスクリプトを作ろう。所有者がルートで読み書きの許可がルートだけになっていることを確認しよう。これはファイルの閲覧、修正、削除などを禁止するスクリプトだ。"touch secure-it", "chmod +x secure-it" と入力してからファイルをエディタで開いて次の通り入力しよう。



#!/bin/sh





# Change owner to root


chown root.root $1





# Change permissions so only root has access


chmod 600 $1





# Make the file unalterable


chattr +i $1


できたらファイルを /usr/sbin へ保存しよう。コマンドは "cp secure-it /usr/sbin" だ。使用方法は "secure-it filename" だ。
/etc/exports
ネットワーク内の NFS ドライブをマウントできるマシンのリスト。中身はないはず。あれば "rm /etc/exports" で削除し、"touch /etc/exports" で作成し、"secure-it /etc/exports" コマンドでアクセス権を変更しよう。
/etc/inetd.conf
いろいろな TCP/IP サービスを開始させるファイル。今回動作させるサービスは ssh だけだが、inetd から起動するわけではないので上記と同じように削除し新ファイル作成したら先のスクリプトでアクセス権を変更しよう。"secure-it /etc/inded.conf"
/etc/hosts.deny
システムへのアクセスを拒否するマシンのリスト。/etc/hosts.allow にリスとされたマシン以外のアクセスはすべて拒否するので内容は次の通りだ。先のスクリプトでアクセス権を変更するのを忘れないように。


ALL: ALL


/etc/hosts.allow
/etc/inetd.conf に記載されたサービスにアクセスできるシステムのリスト。/etc/inetd.conf は中身が空なのでこのファイルの中身も空でいい。"rm /etc/hosts.allo", "touch /etc/hosts.allow", "secure-it /etc/hosts.allow" とファイルを削除し、空ファイルの作成、アクセス権の変更をしよう。
/etc/rc.d/rc.local
不必要な情報提供を避けるために次の行を削除しよう。


echo "" > /etc/issue


echo "$R" >> /etc/issue


echo "Kernel $(uname -r) on $a $SMP$(uname -m)" >> /etc/issue


cp -f /etc/issue /etc/issue.net


echo >> /etc/issue 


ついでに ping や traceroute などの ICMP リクエストに対する返事もしないようにしよう。#!/bin/sh の行の下に次のように追加しよう。


echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


echo 1 > /proc/sys/net/ipv4/tcp_syncookies


2行目は SYN Denial Of Service 攻撃から身を守るためだ。保存したらアクセス権の変更をしておこう。
/etc/hosts.conf
ファイルの最後に次の行を追加する。


nospoof on


これは外部から内部のシステムに見せかけて侵入する IP Spoofing を拒否するものだ。保存したらアクセス権の変更を忘れずに。他のファイルは修正の必要はないが、"/etc/services, /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow" などはアクセス権を変更したほうがいい。
/etc/fstab
システム起動時にマウントするパーティション、ドライブの情報のファイル。/home、/tmp などを別のドライブに割り当てずシステムを一つのパーティションに納めているならここでの作業は必要ない。次の disk quotas に進もう。/home や /tmp はルート以外のユーザが使用する重要な領域だ。/home ではユーザの SUID プログラムを禁止し、/tmp では実行ファイルを禁止する。筆者の /etc/fstab を例に示そう。


/dev/hda1      /              ext2      defaults        1 1


/dev/hda1      /boot          ext2      defaults        1 2


/dev/cdrom     /mnt/cdrom     iso9660   noauto,owner,ro 0 0


/dev/hda5      /home          ext2      defaults        1 2


/dev/hda6      /tmp           ext2      defaults        1 2


/dev/sda1      /usr           ext2      defaults        1 2


/dev/hda7      /var           ext2      defaults        1 2


/dev/hda8      swap           swap      defaults        0 0


/dev/fd0       /mnt/floppy    msdos     noauto,owner    0 0


none           /proc          proc      defaults        0 0


none           /dev/pts       devpts    gid=5,mode=620  0 0


上記ファイルの中の /home と /tmp の行を次のように変更する。


/dev/hda5      /home          ext2        rw,nosuid,nodev 1 2


/dev/hda6      /tmp           ext2 rw,nosuid,nodev,noexec 1 2


Disk Quotas
/home を別のパーティションに割り当てている読者にはあまり重要でない。システム全体で一つのパーティションを使用しているなら disk quota システムを利用したほうがいい。これはユーザのディスク使用容量を制限する。次のように変更しよう。


/dev/hda1      /              ext2      defaults        1 1




/dev/hda9      /              ext2  defaults,usrquota   1 1


/etc/rc.d/rc.local に次の通り追加する。


/sbin/quotacheck -avug


/sbin/quotaon -avug


最後に "touch /quota.user", "chmod 700 /quota.user" と入力したらシステムを再起動しよう。disk quota を変更するには 'edquota -u username" と入力すると vi エディタがファイルを読み込んで起動する。


Quotas for user username:


/dev/hda1: blocks in use: 7, limits (soft = 5120, hard = 10240)


    inodes in use: 6, limits (soft = 50, hard = 100)


のように変更すると使用可能容量は50ファイル、5MBのソフトリミット、100ファイル、10MBのハードリミットに設定される。
/etc/rc.d/init.d/*
/etc/rc.d/init.d の下にある起動時のファイル群には "chmod -R 700 /etc/rc.d/init.d/*" として適切なアクセス制限をしておこう。
SUID プログラム
セキュリティを確保するためにはルート権限で実行されるプログラムを見つけなければならない。これらのプログラムはバッファオーバーフローなどの攻撃の対象になりやすい。SUID プログラムを見つけるには "ls -alF `find / -perm -4000` > /root/suid.txt" とすればいい。ファイルのパーミッションの中に "s" があれば SUID ビットが設定されている。SUID ビットをはずすには "chmod a-s filename" とすればいい。筆者の考えでは "/usr/bin/chage, /usr/bin/gpasswd, /usr/bin/wall, /usr/bin/chfn, /usr/bin/chsh, /usr/bin/newgrp, /usr/bin/write, /usr/sbin/usernetctl, /usr/sbin/traceroute, /bin/mount, /bin/umount, /bin/ping, /sbin/netreport" などだ。

最後にシステムに変更が加えられたら通知するような対策が必要だ。筆者が見つけたものでは http://sites.netscape.net/fcheck/fcheck.html がいいだろう。毎日起動してディスクを走査し変更があったらその旨記録する、という動作が crond を利用すれば可能だ。クロンジョブの起動は "crontab -e" だ。起動したら次の行を追加しよう。



1 0 * * * /usr/local/fcheck/fcheck -a > /root/fcheck.txt


これで毎晩12時1分にはプログラムが起動しシステムを走査する。もし変更されているファイルが見つかったら即座に削除しディストリビューション CD-ROM から再インストールしよう。ファイルに変更を加えたときは必ず fcheck -ca" としておこう。

オープンのポートは攻撃を受けやすい。極力必要ないポートは閉じてしまうことだ。apache、wu-ftpd などはインストールしないこと。ipchains の設定を再チェックして適切にパケットの拒絶が行われていることを確認する。チェックは定期的にした方がいい。この記事はセキュリティのすべてを網羅しているわけではないし、非常に基本的なものばかりだ。ホームユーザには手ごろなセキュリティだが小規模ビジネスを対象にするにはさらなる研究が必要だ。


Copyright © 2000, Chris Stoddard
Published in Issue 55 of Linux Gazette, July 2000

C の正規表現 (By Ben Tindale)

今後シリーズで言語における文字・文字列の実装を検証してみます。最初は GNU の C ライブラリにおける正規表現を検証します。国際化・各国語化は短時間の検証には適さないのでとりあげません。プログラマから見れば GNU C ライブラリは最も基本的なもので、C 言語と言われているものは C ライブラリのファンクションだ。C 言語の文字列はナル文字で終了する文字配列のことだ。コンピュータのリソースという観点から見れば最も単純だが最も効率的な実装だろう。しかしプログラマから見れば扱いにくい。文字列は実際の文字かポインタなのでプログラマはすべてを操作し、最適化できるが、終端文字ナルと文字列の長さを返す関数が組み込まれていないので無限ループやバッファオーバーフローなどに陥りやすい。

GNU C ライブラリは操作関数は豊富だ。標準で copy, move, concatenate, compare, 文字列の長さなどの関数が揃っており、正規表現にも対応している。正規表現はテキストの検索やパターン検索などに使われる非常に強力な方法だ。正規表現のパワーを見るために簡単な grep プログラムMygrep.cを使ってみよう。Mygrep.c はライブラリ regex.h を使用している。

Libc のおかげで正規表現の利用が簡単になっている。もちろん Perl には比べ物にはならないが。C ライブラリは既存のコードとの統合が簡単でしかも高速だ。プログラムは main 関数と正規表現の検索を実行する2つの関数からなっている。引数が正規表現に対するポインタなので do_regex() が始めに呼ばれ、regcomp() を呼んで正規表現のパターンを GNU ライブラリのネイティブフォーマットに変換する。次に検索されるファイルがオープンされファイルハンドルとコンパイルされた正規表現が match_paterns() に渡され検索が実行される。

match_patterns() はファイルを一つずつ開き一行ずつ検索を実行する。検索は regexec() が呼び出されて実際の検索を実行する。正規表現にマッチすれば regexec() は 0 を返し、その行をディスプレイに表示する。この簡単な例でも GNU C ライブラリがいかに強力か分かってもらえるだろう。その他、長い行の処理、データ構造の最適化、ポータブルなエラー処理、コマンドラインオプションなどの機能を利用している。


Copyright © 2000, Ben Tindale
Published in Issue 55 of Linux Gazette, July 2000

C++ におけるオブジェクト指向プログラミング (By Michael Williams)

この記事は C++ のオブジェクト指向プログラミング (OOP) の教科書のようなものだ。今後数回に渡りプログラムテクニックの数々を紹介していきたい。気楽に読んで欲しい。OOP は非常に複雑なテクニックだ。OOP 以前のプログラムをまず見てみよう。OOP 以前のプログラムは一連の処理を羅列したものだ。OOP ではデータ、オブジェクトに主眼が置かれている。プログラムは処理を定義するオブジェクトとオブジェクトの振る舞いを定義する関数で成り立っている。実際に使うにはこのような定義はあまり問題ではない。使うよりは慣れろだ。

この記事で使っているサンプルプログラムは GNU C コンパイラでコンパイルできる。

g++ <filename>

この記事は C++ 言語にある程度の知識があり、C++ の OOP に関心のある人を対象にしています。もし完全な初心者ならまず C++ の入門書を読むことを薦めます。

今まで C++ で使用したデータの型は単純なものだ。int, float, bool, double など。これを身近なものに置き換えて説明しよう。家がある。家を買うには家の価値に関し綿密な調査が必要だ。庭があるか、何階建てか、部屋数はなど。これを C++ で表現するとこのような感じだろう。

int number, rooms;


bool garden;
1軒の家ならこれで十分だ。でもたくさんの家を扱うとしたらこれで足りるだろうか。データが増加して複雑になってしまう。そのためには家を表現する独自のデータの型が必要だ。C++ ならこういう状態ではクラスを使用する。家を表現するデータを C++ のクラスで表現するとこういう感じだろう。



class house


{


public:


    int number, rooms; 


	bool garden;


};





main()


{


	house my_house;


	my_house.number=40; 


	my_house.rooms=8;


	my_house.garden=1;


	return 0;


}


最初の行で家を表現するクラス "house" を宣言し "{", "}" でクラスの定義をしている。次の行はメンバの宣言だ。"public" として宣言され、int 型の変数が宣言されている。次の行では庭の変数が "bool" 型で宣言されている。これで家を表現するクラスの宣言がすんだ。main() はプログラムの実行を開始し、終了させる関数だ。始めに house 型の変数 my_house を宣言している。my_house は house の属性をすべて引き継いでいる。次の行では my_house の メンバ number に "40" を代入している。同じように room に 8 を、garden に 1 を代入している。このプログラムは終了時に 0 を返す。

これだけではまだ何が何だか良く分からない。オブジェクト指向でヘない言語の方が簡単かもしれない。しかしプログラムが複雑になればその価値を実感できるだろう。

クラスの中で宣言された変数を利用するにはどうするか。答えは関数だ。C++ のクラスはメンバ関数を持っている。今度は矩形を表すクラスを例にとって説明しよう。矩形の属性は長さ、幅、それに面積だ。面積は矩形の長さと幅の積から得られる。

class square


{


public:


	int length, width;


	int area()


	{


		return length*width;


	}


};
main()


{


	square my_square;


	my_square.length=5;


	my_square.width=2;


	cout<<my_square.area();


	return 0;


}

このプログラムを実行すると10という数字が得られる。クラス square は二つの変数と関数 area() を持っている。area() は length と width の積を返す。

上記の例ではメンバ関数は一つだが、多数の関数を持っている場合にはコードの見とおしが悪くなってしまう。それを解決するのが関数のスコープを表す演算子だ。クラスのメンバ関数をクラスの外部で定義をする場合は次のようになる。

class square


{


public:


	int length, width;


	int area();


};


area() をクラスの外で定義するには次のようにする。

int square::area()


{


	return length*width;


}


ここで public と private メンバ関数について説明しよう。public メンバ関数はプログラム全体からアクセスすることができる。上記の例では main() からクラス square の変数 length にアクセスする。

main()


{


	sqaure my_square;


	my_square.length=2;


	cout<<my_square.length;


	return 0;


}





コンパイルは問題なく実行すると 2 を返して終了する。ではクラス square のメンバを private で宣言してみよう。
class square


{


private:


	int length, width;


	int area();


};
これではコンパイル時にエラーが出る。private メンバにはメンバ関数しかアクセスできない。

プログラムの中でそれぞれのメンバ変数に数字を代入するのは手間がかかる。クラス my_square の変数はそれぞれ定義されなければならない。これを回避する方法がクラスコンストラクタの利用だ。クラスコンストラクタはクラスが呼ばれるときに初期化される。

class square


{


public:


	int length, width;


	square(int length1, int width1)


	{


		length=length1;


		width=width1;


	}


	int area()


	{


		return length*width;


	}


};





main()


{


	square my_square(5, 2);


	cout<<my_square.area();


	return 0;


}


これを実行すると 10 という結果が得られる。始めにクラスと同じ名前でコンストラクタを定義する。以後クラスが呼ばれるたびにコンストラクタが実行される。関数 main() では my_square 宣言時に 5, 2 を引数として与えており、これが length と width 変数にそれぞれ代入される。

クラスを配列で使用することも可能だ。簡単な例を示そう。

class person


{


public:


	int age, house_number;


};





main()


{


	person alex[5];


	for(int x(0); x<5; x++)


	{


		alex[x].age=x;


		alex[x].house_number=x;


		cout<<"Age is "<<alex[x].age<<endl


			<<"House number is "<<alex[x].house_number<<endl;


	}


	return 0;


}





今月の課題はこれですべてだ。次回はポインタ、クラスデストラクタ、継承などオブジェクト指向プログラムをもう少し詳しく見てみよう。ご意見、ご感想はまでメールを下さい。


Copyright © 2000, Michael Williams
Published in Issue 55 of Linux Gazette, July 2000