Slashdot が最近この法律の悪影響に焦点を当てているが、これは明らかにシリアルケーブルを非合法するserial cables might be illegal。コリン・マクミランは、学術的使用であってもPCセガのシリアルケーブルの輸入を米国税関が阻止した事情を述べている。
●著作権
関連ニュース、カナダがデジタル著作権に関する公聴会public hearings を開くとスラショットが報じた reported 。無料ソフトに関心のあるカナダの人が、これらの会で意見を開陳出来れば素晴らしいことだ。
この市民運動は、「非民主的で民主主義への妨げ」だとマイクロソフト社の抗議をうけているとレジスタは報じる reported 。諮問報告は後にマイクロソフトと無料ソフトとの間の獲物分割で後者をなだめた。マイクロソフトのe-メールセキュリティが貧弱であると指摘されたが、平衡を壊すには至っていない。
● W3Cの屈服
これもオープンスタンダードの話題、レジスタ Free Standards Groupで、最近二つのスタンダード、Linux Standard Base とLi18nux スタンダード、を完成したと報じた。幸い、この動きは広く支援され、無料ソフトウエア運動全体にブームを起こすであろう。
● Linux Weekly News
Linux Weekly News (LWN) が再度独立しようとしている。同社を買収したTucowsが、同社を切り離した。「2月初め現在、現在のLWN職員のままLWNはEklektix, Incの独立出版物として運営される。経済問題は残って、圧迫になるだろうが、自由度が得られる」。LGは長い間LWNを支援して来たので、幸運を祈りたい。
ディストリビューション関連ニュースは、Linuxディストリビューションの出版社/著者から送られた情報に基づいている。これはLinuxを広く見渡しているとは限らない。ディストリビューション選択又は事業の状態に興味ある人のため、最も優れた情報源はDistroWatch.com で、ほとんど全部のディストリビュータの概要を示して比較している。別の情報源は、Linux Weekly Newsのディストリビューション欄で、これはディストリビューションの新発表、現存のディストリビューションの変更/更新に関するニュースを含む。
LynuxWorks は、新ARM920Tプロセッサ用にBlueCat 4.0 LinuxとVisualLynux統合開発環境サポートを発表した。開発者は、高性能で電力消費の少ないARM920Tプロセッサ用に埋込Linuxソフトウエアアプリケーションを開発することが出来る。 LynuxWorksのBlueCat 4.0 Linux は、2.4 Linux Kernelに基づく。VisualLynuxを用いると、開発者はクロス開発環境にアクセスして開発を促進する。VisualLynuxはウインドウズ用のマイクロソフトVisual Studioの拡張で、BlueCat Linux上で走らせるアプリケーションの設計と作成を円滑にするのに必要なコマンドとGNUツールすべてを加えたとの利点がある。
Debian Weekly Newsは、Potatoの新版(r6)を準備中in preparationで、3月初めに到着すると報告したreported。次のリリースを見るとWoodyが最終リリース用の形を取りtake shape 初めた。当分は非公式WoodyのCDが入手出来るが、ミニCDに最適の mini CD image をHo-seokが最近リリースした。
デスクトップLinuxシステム用在庫製品の需要が増えたのに応えて、Graphics Muse は、GIMPの最新版で用いるため、プラグイン、スクリプト及びデータの容易にインストール出来るパケージThe Graphics Muse Tools CDを提供している。特にGIMP 1.2 及びRed Hat 7.x で用いるため設計されたプラグイン、スクリプト及びデータの組合せGraphics Muse Tools CD V1.0.0 は、2002年2月7日にリリースされた。このリリースには4個のオリジナルプラグインと84個のプラグイン及びGIMPレジストリからのPerlスクリプトを含み、すべてRed Hat 7.x.での使用のためコンパイルされている。これは、以前はGIMP1.2に移植されていなかった16本のプログラムを含む。加えてCDには、125以上の新ブラシと新パターンが含まれる。
Graphics Muse Tools CD は、Red Hat Linux 7.x システム用に$12プラス売上税で Graphics Muse Tools CD web siteから購入することが出来る (SuSE 7.2 及び Mandrake 8.1でも)
CryptoHeaven は、幅広い聴衆に暗号技術を持ち込む目的のツールを提供する。このツールは、e-メールの暗号化/署名、即時メッセージとチャタリング、暗号化ファイル記憶、キイ管理などの課題を、使い易いことを主眼に、取り扱う。Windows, Linux, Mac OS X用に利用出来る。一部サービスが有料の無料ダウンロードの詳細はウエブサイトに聞くこと。
Zend Technologies は、Zend Studio 2.0 をリリースした。PHPアプリケーションをを開発しデバッグし展開するための環境を一つのパケージにまとめたものである。これを用いて、中程度のコンピュータ技術者が、e-コマースからウエブホストわたるPHPベースのアプリケーションを開発しデバッグし展開出来ることを狙いとしている。
オープングループとの共同で、 ICS はMotif GUI ツールキットの更新をリリースした。オープン Motif 2.2 には、10個の新ユーザーインターフェイスと、万能ツールチップサポートが含まれる。ロードマップも定義されており、これは別名拒否フォント、画像サポート(png、jpgなど)の改良及びキャンバスを含む追加機能の利用可能性を定義する。
詳細は、 http://www.motifzone.net/.
Excel Software は、Linux用に二つの新パケージが利用出来ると発表した。 QuickHelp は、Linux KDE及びGNOMEデスクトップのサポートを用いてLinuxアプリケーション用のオンラインヘルプを迅速に作成して配布するための開発ツールである。QuickHelp は、ヘルプシステム作成用QuickHelp ビルダと、それをエンドユーザに展開するためのQuickHelp ビューワとから成る。ヘルプ情報は、QuickHelp ビューワと共に配布される単一XMLファイル入れる。
QuickUML for Linux は、UMLモデルのコアセット用の広範な統合と簡単な使用を与えるオブジェクト指向設計ルールである。ユースケース、クラスモデル、ディクショナリ、及びコードの間の円滑な統合を用いタブ付きウインドウを通じてプロジェクト全体にアクセスすることがあ出来る。プロジェクトはQuickUMLウインドウと互換性のあるXMLファイルとしてセーブするので、設計作業をプラットフォーム間だ分担することが出来る。
VariCAD は、MCAD - VariCAD 8.1のリリースを発表した。このCADパケージは、3Dモデル及び2D図面用の沢山のツール、機械部品のライブラリ、表面展開(曲げない)、標準機械成分の計算、非グラフィック情報(BOM)を用いる作業用のツール、などを特徴とする。VariCAD 8.1はまた、DWG, DXF, IGESなどの共通CADファイルタイプをインポート、エキスポートする。
ウインドウズ・ベースのコンソール・エディタをLinuxに移植しようと思い立った。当然、テキストエディタを狙った。エディタはどんなテキストコンソールにも移植が便利なように設計した。キイボード入力とテキスト入力機能の全部を二つのファイルに分離した。このファイルは、新プラットホームが来たら書き換える計画だった。ウインドウズ用と普通のDOS用のファイル二つを作った。これで移植は楽に出来る筈だった。
当時のLinuxの知識は、DOSへのDJGPPポートを用いて入手したGNUコンパイラパケージから構成されていた。Linuxプログラムの書き方、コンパイル、デバッグは知っていたが、コンソールに付いての知識はprintf()とgetch()の機能に限られていた。Unixでコンソールの役割が大きいのを知っていたので、コンソール・アプリケーションのプログラムは本当に利点があり、DOSやウインドウに比肩すると思った。
計画を開始して、必要な情報を集めた。すべてのソースを入手して、コンソール指向テキスト・インターフェイスを持つ二つのアプリケーションをダウンロードした。
第一は、ありふれたMC (Midnight Commander)だ。このプログラムは、ウインドウズ又はDOSからUNIXに来た人が未知の世界で一息つくときのストローだ。
第二は、LinuxへのTurboVision ポートだ。TurboVision は、Borlandが設計した有名なDOS用のウインドウ作成フレームワークだ。この会社はソースの公開に友好的で、32ビットDJGPPでこれを入手した後、Linux版もあることを見出した。問題が解決しそうな良い兆候だった。
MCを使う快適な経験を汚すものがあった。MCではESCを押すと、もう一度押すまで何もせず、二つのESCの組合せが一つのESCのような働きをする。何故だ?ここで支配するルールは、後で分かる。
DOSにはANSI.SYSがある。ESCで始まる文字列(ESCシーケンスと言う)を持つprintf()を使って、カーソル移動、色変更などをおこなう。ANSI.SYSを使うのは初歩的で非能率的だと思われたので、ASCII技術以外ではこの方法を使っていない。進歩したライブラリは、ビデオメモリへの直接アドレスを備えていて、コンソールアプリケーションでの作業を楽にしている。TurboPowerパケージのtpcrt.pas のソースを見ると、厳密なアセンブラコードがグラフィック(「テキスト」と言うべきか)カードが与えるものは何でも締め出そうとしている。
DOSで全画面アプリケーションをおこなう極めて初歩的と考えられていたことは、UNIXに入るには愚かな方法だと分かった。こんな基本的な事実を知っただけでショックだった。気を取り直して、野獣を飼い慣らす方法を考えた。ESCシーケンスを覚えてファンクションを書くと夢が実現すると思った。幾らか研究して、これらESCシーケンスには単一の標準がないことを発見した。サポートする作用はターミナル毎に異なるので、全部のターミナルを働かせるには、膨大なデータベースが必要になる。何故こんなに複雑なのだ?全く恐れ入る。
"Curses"は王様だ。誰かがこのデータベースを開発していて、必要な機能は全部、元は"Curses"と呼ばれたライブラリにある。Linuxでは "ncurses" で、皆が使っている。
スクリーンアクセス機能は、使う人には誰でも直感でわかる。"ncurses"は実際に変更された画面の部分だけを更新する。これはtelnetなどリモートモードでプログラムを使うとき転送データの数が少なくなるので、立派な性能改善である。
直面した一つの簡単な問題は、DOSとウインドウズの色属性が"ncurses"色属性にマップしないことである。問題は、"ncurses"では色と背景色の対が64色しかないことでさらに悪化した。可能な127色をどう64色にマップするか?良く調べたら私のプログラムでは25の属性しかないのが分かって安心した。"ncurses"の64属性で十分だ。属性のアレーmy-palleteを持っている。先ず独特の属性をした。次ぎに色と背景に分解した各独特属性について、相当するエントリを"ncurses"カラーパレットに作った。このエントリのインデキス(IDと考える)を256バイトの2次アレーに記憶した。次いで私のディスプレー機能にmy-palleteから属性を渡したとき、これを2次アレーのインデキスとして使って対応する属性IDを抽出し、これを"ncurses"が発生する。64の独特属性を超えない限り、プログラムは古い256個の属性値をうまく使う。これにより、今サポートしているDOS及びウインドウの全プラットホーム用に単一のカラーパレットを持ち、これをLinuxにマップし直すことが出来る。
TurboVisionポートは、テキストモードLinuxターミナルで走らせるとき直接スクリーンアクセスを使った。臨時にこのオプションを考えた、これをモジュールに加えることは出来るが、後で少々の性能利得は、努力に値しないと考えた。
キイボードには悪い予感があった。先ずncursesヘッダのキイ定義を見るだけで、このライブラリが基本的に、豊富なキイ組合せを定義する内部構造を持っていないのに気付いた。このターミナルは、理由が不明だが、「拡張」キイすべてをESCシーケンスで送るので、一度のESCをESCとして受け取ることが出来ず、プログラムに一度受け取らせるため、常に2回押さなければならない。それに一定数のキイコードしかない。これは、昔の不自由なターミナルから来たと思われそれ以来何の発展もしていない。ウインドウズやDOSと比べると、それらにはASCII翻訳があって、キイを位置コードとして受け取ることが出来るので、常にキイボードをシフト状態にすることが出来る。ウインドウズでは、標準APIを通じて、キイを押すのと離すのとを違うイベントして受け取る。この方が自然だ。だからこれらに忠実なUNIXは、何もかもぎこちない方法で定義する。このようにするのは、心理的には良いが、能率は良くない。
次ぎに、キイを読むときncursesを0タイムで作動させることが出来なかった。加えて、ダブルESC症候、拡張方法は皆無だ。1時間分の水だけで砂漠に見捨てられたような感じだ。ディスプレー用に "ncurses"のサポートは適切であるけれども、極めて基本的な機能を超えるキイボードサポートは、全く私のニーズに間に合わない。自分のコードでキイボード作業をおこなうことを考えた。
キイボードはファイル−stdinーだ。stdinを全画面プログラムで使うことを考えたことはなかったが、これはUNIXでやる方法だ。stdinファイルはすべてをASCIIコードで転送するので、矢印のようなキイはESCで始まるシーケンスを形作る。最初は、ESCがシーケンスの始まりであるとキイESC自体がESCされる。これが"ncurses"のやり方だ。こうしてMCではESCを2回押さなければならなくなる。
全部をASCIIコードとESCシーケンスで渡す外に、キイボードモジュールは kbhit()ファンクションを渡す必要がある。文書では"ncurses"がそのgetch()ファンクションを0タイムアウトで働かせることが出来、バッファにキイがないとき絶対に止まらないことを約束する。私の計画は多分わかっていだだけると思う。0タイムアウトのgetch()を使うと、小さいsleep(xxx)が得られるが、このループからはキイを押すと何時でも出られる。これは理論的には良さそうだが、"ncurses"はこの特定機能を渡すには不足だ。私が正しくないか、又は旧版を使ったためか、何かだろう。"ncurses"のソースを見てみよう。そこまでする気はなかったが、キイボードモデル全体が旧式で、"ncurses"の少々の手直しでは間に合わないと考えた。
基本的に必要なのは、1.kbhit()キイ点検とexitに必要、2.Ctrl+Shift+Left_Arrowなどを読むことの出来る何かが必要、3.一定時間キイが押されないとき時間切れでexitする必要がある。
このどれかを起こすには、列モードでキイボードstdinファイルを置く必要がある。規定では、ユーザーがEnterを押したときだけプログラムに送られるテキストの行を入る。だから単一文字が読めるようにするには列モードに切り換える必要がある。stdinファイルは、キイボードに役立つだけでなく、シリアルケーブルを通じて文字を入手する。マシン全体を動かすのに、3本の線で十分だ。シリアル接続を正しく働かせるには、フロー制御を扱う必要がある。これは線を2本追加して、各々がサイトに「文字送出を停止」とバッファが空のとき「ダンプ再開」を要求させる。だが、線を2本追加すると高価で複雑になるし、ハードウエアに何が起こるか分からない。ハードウエアで出来ないことはソフトウエアでおこなう。文字(事実上31文字)のホストはフロー制御に費やされるだけでなく、エコーのモード変更などにも費やされる。これら31文字は、ASCII表の下の部分に分布する。これは20年前には良い考えと思われたが、出力保留にCtrl+Sを使う今は難解に見えるので、カレントファイル節約のためCtrl+Sを使う必要がある。必要な形に合わせるにはキイボードに余分のメッセージが必要なようだ。設定ファンクションは容易に単一画面の行を超えるので、文書読取と実験を重ねた後、実際に働く何かを思い付いた。
Kbhit() は比較的簡単だ。ファイル(又はソケット)上の文字を待ち、select()を使う。これをstdinに適用すると、キイを押したときSelect()のブロックが解ける。タイムアウトを0に設定すると、失敗又は成功で直ちにexitしてキイ読取準備完了を示す。
ReadKey()ファンクションは2段構造を持つ。第一レベルではselect()を使って入力文字をブロックする。Select()がブロックを解いたとき、read()ファンクション一つを与えて、出来るだけ多く抽出しようとする。stdin から吸収したものは全部fifoキューに記憶する。第二レベルでは、文字一つだけを抽出してESCシーケンスの膨大なリストに一致する文字列に構成する。タイムアウトの次ぎにESC一つだけで絶対に成功する。簡単だ。ESCなどに一致しない場合もある。これら全部は、キイボードのシフト状態を抽出する機能から供給される。これはLinuxテキストターミナルだけで働く高級技術のようだ。これはMCのソースコードから学んだ。欠点は、裸のLinuxテキストターミナル以外では働かないことだ。Xターミナルでは駄目だ。シフトキイ状態がなく、抽出する方法がない。
Linuxキイボードは他のUNIXキイボードに比べ、自分のESCシーケンスを定義出来るとのもう一つの利点がある。だから、例えば Ctrl+Shift+F3が必要なら新ESCシーケンスを定義し、"loadkey"ユティリティを使ってkernelにダウンロードすることが出来る。変更は瞬時で恒久的ではない。再ブートしたときは同じコマンドを繰り返す必要がある。
実際はシフト状態を抽出する機能を持つことにより、明確に定義する必要のある可能なキイ組合せが大幅に減る。例えばShift+F3を定義しているとき、コントロールキイ状態を得てCtrl+Shift+F3を持つことが出来る。シフト状態機能がないものは"loadkey"を用いて新らしいキイシーケンスを定義しなければならない。少し問題がある。キイバッファからのキイ抽出がシフト状態抽出の時間と一致しないと、困ったことになる。これは殆ど起こらないが(今のコンピュータは速度が速い)ときには起こる。例を述べる。エディタF3が「ファイル全部を閉じて変更を廃棄する」であり、Ctrl+Shift+F3 が「次のファイル」であるとき、問題がある。F3がバッファにあって、同時にシフト状態を得ることが出来ないとすると、F3だけ得られて "Ctrl+Shift+F3"は得られない。
キイボード入力としてstdinを持つのは、大きい長所だ。必要なとき各種拡張キイを起動するESCシーケンスを入れると、エディタは入力ファイルを与えるだけで全部自動化される。
全自動化も可能だが、限界がある。シフト状態をテキストファイルに与えることは出来ない。そんなものだ。
ウインドウズでは、テキストモードでもグラフィックモードでもコンソールアプリケーションはうまく働く。私のモジュールはテキストLinuxコンソール($TERM="linux")では完全に働くが、Xウインドウターミナルではうまく行かない。これら全部は、UNIXキイボードの共通基準は「符号無し文字」で拡張キイは、歴史が20年もない所定ESCシーケンスを使うとの事実から当然の帰結である。そこで続いてXでも使えるモジュールを作ることとする。Xターミナルから発したことをプログラムは感知したときは何時でも、テキスト出力全部を固定幅フォントで書き換えるウインドウを開き、キイボードはXサーバーが与える最良の程度に処理する。
結局最初の計画は実現出来ることが分かった。随分苦労した。
demo.tar.gz に全部の物語をC言語で説明してある。
この記事を"zeep"討論グループ here.で見ることが出来る。討論グループでは質問やご意見にお答えする。一般的に討論は、ソフトウエア開発、ハードウエアに関する意見、プログラム言語である。42に関する何事も始まったばかりだ。ご参加を歓迎する。
一寸した怪談だ。Linuxサーバーを管理していた。会社のプリント・サーバーだ。ターミナル・プログラムを通じてユーザーが遺産システムに接続された。線に沿ったどこかにまずい所があって、彼のシステムが近くのプリンタに膨大な異常データを取り込みはじめた。プリンタの電源を切ろうとしたが成功しない。幸い、私の処に問題解決を持ち込んだ。
兎に角、Linuxボックスにsshし、'spool/' ディレクトリに変えて、適切なフォルダの 'ls' をおこなった。印刷待ち行列に数百のプリントジョブがあるのに気付いて、全部削除するのが良いと決めた。
ファイル全部を 'rm -rf *'することにした。問題は正しいプリンタディレクトリからでなく 'spool/'からおこなったことだ。その結果、spoolディレクトリにある全部が失われた。
エラーに気付いて、直そうとした。最初に "unrm"を試した。これは旨く行かなかった。ファイルシステムからエラーなしで読み取ることが出来なかったからだ。次ぎに、ブートフロッピイを使ってもう一度'unrm' を試した。これも駄目だった。RAIDアレーを認識することが出来なかったからだ。別のオプションを幾つか試して諦め、「アプグレード」の時期だと決めた。3時間後に問題が解決した。
オールオンボード型PCを買ってLinuxを搭載した後、二重ヘッドコンフィギュレーションを試したくなった。余分なグラフィックカードとモニタがあったからだ。新しいグラフィックカードを入れて、スーパーコンプレックス・モジュラーBIOSシステムがオンボードグ・ラフィックシステムからの中断を自動的に不作動にしているのに気付いた。マニュアルによると、この「特性」を切ることは出来ない。そこでアイデアが閃いた。
アイデアは、ブート中に新グラフィックカードを不作動に出来ればBIOSはこれを無視するということだ。その後で、通常使用のためカードを再作動させる。
PCIバスのピンと仕様を調べ、ねじ廻しでトラックを壊しグラフィックカードからのリセット線の接続を切ることにした。その上で、リセット線をスイッチを通して接地に接続した(リセットはアクティブロー)
スイッチを使うとカードを不作動に出来るが、再起動が出来なくなった。必要なときPCがリセット出来ないからだ。そこで、壊したトラックをまたいで抵抗を接続し、PCがカードをリセット出来るようにしたところ、スイッチは外に何の影響もしなかった。
スイッチはカードの金属背板に取り付けたので、必要なとき切り換えることが出来る。
このスイッチを使って、カードをリセットモードにし、PCをブートし、それから元に戻すと、二つのモニターを働かせることが出来る。
また、XがVGAテキストモードに戻らないのから逃れる方法を考えたことはないか?このスイッチを一つカードに加えると問題が解決する。
数年経って、標準Cライブラリに関する私の記事で、Linux社会に再び貢献することにした。お楽しみ頂きたい。
最後の記事 last article は、プログラマのための <assert.h> 診断についてだった。この記事は <string.h>文字列取扱いである。Cは文字列取扱いにつき機械語より余り良くないので、機械語プログラマはこの部分では気持ち良いだろう。string.h には、沢山の限界や問題があるので、それらを該当する既述の中で話題にする。
読者にはCプログラミングの知識があると仮定する。この情報の正確度にも、ある目的への適合度にも保証はない。
例は rogers_example07.c である。これは基本的な例で、文字列機能の各々を示す。これをコンパイルして走らせると、出力を見ることが出来る。出力をコードと比較されたい。
いつもの通り、文書に間違いがあったら指摘されたい。次の文書で訂正する。文書の終わりの修正を見て、前の記事を修正されたい。
警告: Cの文字列を複写するのは、Cでのプログラムで最も危険な部分である。C自体は、境界点検をしないので、文字列の終わりを上書きし、他の変数を上書きしたりプログラムの衝突を起こし易い。クラッカがCのこの弱点を使って、オーバーフローの制御が余り上手でないコードにのプログラムに、プログラムが走っているアカウントにシェルを強制的に与える。これは通常殆どのサーバーに根がある。
Cには本当は文字列がない。文書でCにおける文字列取扱いに言及するのは変だが、本当だ。Cにあるのは文字のアレーだ。文字列用スペースを作るには、コンパイラにその文字列用の余地を保留するよう要求することが出来る。最も普通なのは、次の簡単なアレーを使うこと:
char string[17];
これは16文字と文字列終わりマーカーの余地を保留する。.
strcpy ( string, "This is a string" );
は、静止文字列 "This is a string"を、割り当てたスペースにコピイする働きをする。静止文字列は、ASCII nil 文字の続く16文字から成る。だから、文字列と呼ばれる変数には静止文字列を保持する沢山の余地がある。nilは、一般に数字ゼロ又は文字列 '\0' 又は文字 '\000' を用いてあらわす。
驚いたことに、17文字以上がアレーにコピイされる次ぎでも、同様に働くことがある:
strcpy ( string, "This is a long string" );
文字列をコピイするとき境界点検はない。だから文字列終わりを超えて予期しない方法でメモリに書き込んでも、殆ど場合、取り出すことが出来る。勿論、プログラムは何時でも予期しない衝突を、時にはエラーをした場所から遙かに離れた所で、起こす。クラッカは、プログラムがシェルを実行するような方法でバッファの終わりに上書きしてコンピュータからシェルを取得する。これが strcpyを使ってはならない理由である。代わりに strncpy を利用する:
#define MAX_STRING_LENGTH 17
char string[MAX_STRING_LENGTH];
strncpy ( string, "This is a long string", MAX_STRING_LENGTH );
string[MAX_STRING_LENGTH-1] = '\000';
文字列長さにマクロを使った理由は、プログラムの多くの場所でこの長さを使うからだ。可変文字列のサイズを変える時は、数字17を使った場所を見出してそれぞれを直さなければならない。同じ数を色々な場所で使って別の意味をあらわすこともある。だから数カ所だけでリテラル数を使うときも、マクロを使うことでその数の意味をあらわすことが出来るので、この場合文字列バッファのサイズを変更するのは詰まらないことになる。
最後の行をここに置いた理由は、文字列がコピイしようとする文字列より長いとき、文字列終わりマーカーが正しい場所に入らない。最終文字をゼロにしないと、大方の場合は大丈夫だが、暫くすると理由不明でプログラムが衝突する。
文字列を定義する第三の方法もある。 malloc、realloc 及びcallocの使用だ。これらのファンクションは、ランタイムに必要なメモリを要求すれば働く。これは最も複雑だが、最も融通性に富み、強力である。
#define STATIC_STRING "This is a long string that will be copied into a location during runtime"
char *string;
int string_length;
string_length = strlen(STATIC_STRING);
if (!(string = (char *) malloc ( string_length ))){
/* no memory left, die */
exit (1);
}
strncpy( string, STATIC_STRING, string_length);
string[string_length] = '\000';
/* do something with the string */
free(string);
この方法の危険の一つは、後でfreeファンクションを使ってクリーンアップしなければならないことである。終わってからすべてを解放しないと、メモリが洩れて、最後にはプログラムが故障する。
<string.h> ライブラリには色々な問題がある。
最大の問題は、ライブラリが完全で矛盾なくは設計されていないことである。<string.h> は沢山の人が書いたファンクションの集まりで、ライブラリに組み立てて世界中に与えられたものだ。そしてそれに貼り付いている。
殆どのファンクションはNULL又は文字列へのポインタを返すことが出来る。ファンクションがNULLを返すことが出来るときは、呼び出した後、戻り値を点検してNULLであれば適切な処置を講じなければならない。NULL戻り値を文字列へのポインタとして扱うと、直ぐにプログラムが故障する。
ファンクションを役割にしたがい勝手に節に区分けして、同様のファンクションの間の小さい相違を示した。文字列ファンクションとメモリファンクションによって区分けすることも出来るが、余り役に立たないと思われる。
コピイ
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
char *strncpy(char *dest, const char *src, size_t n);
char *strcpy(char *dest, const char *src);
これらのファンクションは全部destにポインタを返す。destには既にポインタがあるので、これは変だ。
memcpyは、srcがポイントする位置からdestのポイントする位置に、n文字をコピイする。重なり合う領域にコピイすると、プログラムが故障する。
memmove もまた、srcがポイントする位置からdestのポイントする位置に、n文字をコピイする。しかし、これは文字を先ず暫定位置にコピイしてから最終位置にコピイするので、メモリの重なり合う領域にコピイするとき使うファンクションである。
strncpy は、srcがポイントする位置からdestのポイントする位置に、n個以下の文字をコピイする。このファンクションは、n番目以下の任意の位置にある最初のnull文字で停止する。n文字をコピイしてnullが見付からないときは、nullを書き込まない。これは文字列終わりをオープンのままにする良い方法である。文字列の終わりには明確にゼロを書き込まなければならない。
strcpy は、srcがポイントする位置からdestのポイントする位置に、終わりのnull文字を含めて文字列をコピイする。警告! このファンクションは実世界からのデータには絶対使用しないこと!!! このファンクションを使う最大の危険は、null文字がないときは、無作為にnullを見出すか又はプロセスに属しないメモリにアクセスしてプロセスがSEGV (segfault)信号で止まるまでメモリをコピイする。プログラムはこの信号を捕らえて止まることが出来るが、この時点で水を浴びせられるので、プログラムコアにダンプさせるだけが最良である。
strcpy とstrncpyの使い方の例を少し示した。memcpy とmemmoveは、strncpyと全く同じように使うが、文字列だけでなくバイトの任意のブロックをコピイすることが出来る。
連結
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
strncatも同様であるが、目的から最大n文字だけをコピイする点と、'\0'を付け加える点が異なる。
strcat はstrncat は両方とも、目的文字列へのポインタを返す。ここでも、出来当たった文字列上で境界点検はしないので、作った文字列がそれに割り当てたメモリに合わない程長くないことを確認しなければならない。
比較
int memcmp(const void *s1, const void *s2, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
int strcoll(const char *s1, const char *s2);
size_t strxfrm(const char *s1, const char *s2, size_t n);
memcmpは、nで与えられる数のバイトを比較する。s1<s2なら負の値を返す、s1=s2なら0を返す。s1>s2なら正の値を返す。比較はメモリアレー内のASCII文字のバイト値に基づく。
strcmp は、二つの文字列s1とs2を比較する。文字列はnullで終わる文字のアレーである。s1<s2なら負の値を返す、s1=s2なら0を返す。s1>s2なら正の値を返す。比較は二つの文字列の中のASCII文字のバイト値に基づく。
strncmpは、memcmpに良く似ているが、二つの文字列を、nで与えられる長さまで比較する点が異なる。文字列がnより短いときは、nに続くメモリ位置は比較されない。s1<s2なら負の値を返す、s1=s2なら0を返す。s1>s2なら正の値を返す。
strcoll は、二つの文字列s1とs2を比較する。s1<s2なら負の値を返す、s1=s2なら0を返す。s1>s2なら正の値を返す。比較は、 <locale.h>ライブラリの中のsetlocale()ファンクションを用いて設定したlocale に基づく。このライブラリには後の記事で触れる。
strxfrm は、文字列s2をlocaleカテゴリLC_COLLATEに基づいて変形する。これは次いでnバイトを文字列s1にコピイする。最後に、文字列s1の中に実際に置いた文字数を返す。y >= nであるときはエラーがある。
検索
void *memchr(const void *s, int c, size_t n);
char *strchr(const char *s, int c);
size_t *strcspn(const char *s, const char *reject);
size_t *strspn(const char *s, const char *accept);
char *strpbrk(const char *s, const char *accept);
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
char *strstr(const char *s, const char *substring);
char *strtok(char *s, const char *delim);
memchr は、sでポイントされたアレーを文字cについて、n文字まで検索して、第一位置へのポインタ又は、メモリアレーに文字が見付からないときNULLを返す。
strcspn は、拒絶文字列内で文字を含まない文字列sの始まりの長さを返す。
strspn は、受容文字列内で一文字だけを含む文字列sの始まりのながさを返す。
strpbrk は、受容文字列内で、いずれかの文字が一致する文字列sの第一文字の位置へのポインタを返す。又は文字列sの中にcが見付からないときNULLを返す。
strchr は、sでポイントされた文字列を文字cについて検索し、第一位置へのポインタ又は、文字列の中にが見付からないときNULLを返す。
strrchr は、文字列sの中の、整数cであらわされた文字に一致する最後の文字の位置へのポインタを返す。又はcがsの中に見付からないときはNULLを返す。
strstr は、文字列sの中のサブストリング文字列の位置、又はsの中にサブストリングが見付からないときNULLを返す。
strtok のマニュアルでは、このファンクションには数々の問題があるので、このファンクションを使わないようにと言っている。 strtok は、文字列を取り上げてトークンに分割する。このファンクションへの最初の呼出は、文字列sを第一引数として持ち、第一トークンを返す。最初の呼出の後、このファンクションはNULLを第一引数として用いて呼び出されトークンはない。デリミッタ(区切り記号)は、各呼出で変更するか、又はすべての呼出で同じに保つことが出来る。このファンクションの限界は多い。このファンクションは、元の文字列sを変更する、デリミッタの値は呼出の間保たれないので、このファンクションは定常文字列には働かない。
雑
void *memset(void *s, int c, size_t n);
char *strerror(int errnum);
size_t *strlen(const char *s);
memset は、サイズnのメモリアレーsをcの整数値で満たしてメモリアレーsへのポインタを返す。
strerror は、引数として渡されたエラー番号を記述する文字列、又はエラー番号不明のときエラー不明文字列を返す。これは、<stdio.h>と<error.h>ライブラリの中の各種エラー関連ファンクションを一緒に働くので、将来の記事で詳しく扱う。
strlen は、文字列sの中の文字数を返す。文字列ターミネータ'\0' は含まない。
移植不能ファンクション
GNU文字列ライブラリには、標準Cライブラリにない多くのものがある。説明はマニュアルから切り抜いた。コードをUNIXボックスで働かせたいなら、これらのファンクションを使ってはいけない。しかし、これらは、移植可能な自分のコードでファンクションを実行するには良い案内になる。
int strcasecmp(const char *s1, const char *s2);
strcasecmp は、大文字小文字の区別なしで、文字列s1とs2を比較する。s1が見付かったときs2より小さいか、一致するか、大きいかにより、それぞれ負、0、正の整数を返す。
int strncasecmp(const char *s1, const char *s2, size_t n);
strncasecmp も同様であるが、s1の初めのn文字だけを比較する。
strcasecmp と strncasecmp は、s1(又はその初めのnバイト)が見付かったときs2より小さいか、一致するか、大きいかにより、それぞれ負、0、正の整数を返す。
char *strdup(const char *s);
このファンクションは、何であるか知らずに使っていた。毎日何かを学んでいる。
strdup は、文字列sの写しである新文字列へのポインタを返す。新文字列のためのメモリは、malloc(3)を用いて獲得し、free(3)を用いて解放する。
strdup は、複写した文字列へのポインタ又は、利用出来るメモリが充分でないときNULLを返す。
char *strfry(char *string);
strfry は、rand(3)を用いて文字列の内容を無作為化し、文字列内の文字を無作為に交換する。結果は文字列の作り替えである。r
strfry は、無作為化した文字列へのポインタを返す。
char *strsep(char **stringp, const char *delim);
strsep は、delimで区切った文字列 stringp から次のトークンを返す。このトークンは `\0' 文字で終わり、stringpはトークンを過ぎた点に更新される。strtok()ファンクションと同様だが、移植はできない。
strsep は、トークンへのポインタ又は、stringpにdelimが見付からないときNULLを返す。
char *index(const char *s, int c);
index は、文字列sの中で文字cが最初に出た場所へのポインタを返す。多分 strchr()を使うべきだ。これは同じ機能を移植可能の方法で果たす。
char *rindex(const char *s, int c);
rindex は、文字列sの中で文字cが最後に出た場所へのポインタを返す。終わりの'\0'文字は文字列の一部と見なす。標準Cライブラリファンクションstrrchr()をつかうこと、これは全く同じ機能を移植可能の方法で果たす。
index と rindex は、一致した文字へのポインタ又は、見付からないときはNULLを返す。
題名: Linux用標準C ライブラリ、パート3
Date: 1998年8月12日(水)11:27:08 +0200
From: Lars Hesdorf <hesdorf@ibm.net>
Hej James M. Rogers
The Standard C Library for Linux, Part Threeのどこかに
「putcharは文字を標準出力書く。putchar(x)は、fputc(x, STDIN)と同じだ」
と書いてありますが、多分「 fputc(x, STDOUT)」の意味だと思います。
Lars Hesdorf
HESDORF@IBM.NET
回答:
文字を間違ったと思います。 "fputc(x, stdout)"の筈です。例示プログラムは、コンパイルしてテストしたので、間違っていません。
題名: Linux用標準C ライブラリ、パート2
Date: 1999年8月4日(水)21:00:59 +1000
From: 32000151 <32000151@snetmp.cpg.com.au>
組織: Computer Power Institute学生
The Standard C Library for Linux, Part Two で、
" char *fgets(char *s, int n, FILE *stream);
char *s 結果を保持する文字列.
int n 読取る文字の最大数.
FILE *stream は既存のストリーム.
.
.
.
fgets は、最大でn文字をストリームから文字列に読み込む.
char s[1024];
FILE *stream;
if((stream = fopen ("filename", "r")) != (FILE *)0) {
while((fgets(s, 1023, stream)) != (char *)0 ) {
<process each line>
}
} else {
<do fopen error handling>
} "
と書いてありますが、 fgets() は実際に n-1 文字まで読み取るので、(nをアレーサイズに設定すると)常に \0のための余地があります。
Tim McCormack
32000151@bran.snetmp.cpg.com.au
回答:
有り難う。例示プログラムで正しく使っているかを確かめます。
題名: Linux用C ライブラリの記事の中のsnprintf ?
Date: Tue, 01 Sep 1998 17:53:19 +0200
From: Renaud Hebert <hebert@bcv01y01.vz.cit.alcatel.fr>
snprintfは知らなかったけれども、文字列バッファの
オーバーフローを避けることをするのは賢明だと思います。
(詰まらないsprintfより良い)
だが、Cライブラリでこれを見たのは初めてなので、
Linuxだけのファンクションでしょうか、HP-UX などには
含まれていない新ファンクションなのでしょうか、
貴記事の中では、標準ライブラリと、Linuxのみを区別
出来たと思います。
兎に角、この snprintf ファンクションは快適でした。TM.
記事を有り難う。良く書けていて役立ちました。
__________________________________________________________________
Renaud HEBERT CR2A-DI
ソフトウエア開発者
回答:
GNUだけだと思います。だから、プログラムをGNU環境で働かせたのだけでない限り、snprintf ファンクションの使用を避けた方が良いとおもいます。GNUのみに有用な文字列ファンクションを沢山見出しているので、Linuxだけに見出されるファンクションはこれから指摘したいと思います。
題名: 標準C プログラミングライブラリ パート3
Date: Sun, 20 Sep 1998 09:52:29 -0400
From: Laurin Killian <lek@uconect.net>
Organization: Streamlined Development
訂正を求めておられるので・・・
貴殿の例 examples:の中に幾つか誤植があります
------------原文:
float x=99.1234;
sprintf(string, "%d", x)
------------は下記の筈...
sprintf(string, "%f", x);
^
------------原文:
float x=99.1234;
returnValue=sprintf(string, 4, "%d", x)
------------は下記の筈...
returnValue=snprintf(string, 5, "%f", x);
^ ^ ^
("99.1"との説明結果を得るには - null文字のためのスペースが必要です)
"scanf" 型ファンクションすべてにアムパサンド(&)がなければなりません:
scanf("%f%2d%d", &float1, &int1, &int2);
お役に立てば幸い
-Laurin
回答:
大変役立ちました、有り難う!
題名: 文字取扱いプログラム
Date: Mon, 15 Mar 1999 13:31:41 +0100
From: jorgen.tegner@sundsdefibrator.com
今日は、
Linux gazetteの貴殿のコードには、始めにsetlocale()
ファンクション呼出が抜けています。そのため127以上の文字
では有用な結果が得られません。プログラムが規定値で
でスタートするからです。また、 isalpha(), toupper()
及び tolower()は、 A-Z、a-z の範囲に制限されません。
よろしく、
Jörgen Tegnér
回答:
全くその通り、 <locale.h>をカバーするときsetlocale() をセーブしています。
The Standard C Library, P. J. Plauger, Printice Hall P T R, 1992
The Standard C Library, Parts 1, 2, and 3, Chuck Allison, C/C++ Users Journal, January, February, March 1995
STRING(3), BSD MANPAGE, Linux Programmer's Manual
Texinfo は、GNUプロジェクトに好適なドキュメンテーション・システムだ。
Texinfoフォーマットの主な設計目標は、同一ソース (.texi)ファイルから高品質印刷出力と同時にオンライン読取の出来る出力を作ることだ。Texinfoの高品質ハードコピイの基礎はその仕掛けある。平凡なTex上に構築し、ファイルtexinfo.tex (君のシステムにはこのファイルが二つ以上ある。最新版(これを書いている時点で2002-01-04.07)であることを確認されたい)を読み取ってそれ適合させる。texinfo.tex は、必要なフォーマット設定全部をおこなう。これはTeXを拡張して、オンラインドキュメンテーションに必要なハイパーリファレンス及びgizmos全部を認識する。オンラインで見るため、TexinfoソースはInfo (.info) ファイルを作る。
Infoとは?
Info は、ハイパーリンク文書を見るのに適したASCIIファイルフォーマットである。これはGNUアプリケーションで走るすべてのプラットホームに移植出来ることを目的とする。Infoはテキストデータに重点を置く。そのためinfoファイルはすべてテキストコンソールで見ることが出来る。高解像度グラフィックはプリント出力だけで利用出来る。だから、InfoはHTMLのGNU相手先から余分なグラフィックを除いたものである。しかし、texi2html(1) はTecinfoソース (.texi) ディレクトリをHTMLに変形する。ブラウザの節を参照。
文書構造
Texinfo はTeX (このシリーズの2番目の記事"LaTeX with latex2html"を参照)に基づくので、ヘッダ−本体の区分をもう一度見ることを期待する。また、ハイパーリンクに対するサポートは、ノードと呼ばれる形で会う追加構造を呼び起こす。
全体構造
各Texinfo文書は、平文TeXコマンド \input を用いてtexinfo.tex を読み取ることから始まる。これは平文TexがTexinfoに忍び込む殆ど唯一の場所だ。texinfo.tex を含めるところからいわゆるトップノード−−ノードについては後で−−までの部分が、文書のヘッダである。トップノードは文書の本体を開く。これは終了コマンド @bye まで伸びる。
Texinfoコマンドはすべて、"@"文字で導入される。@文字の後には一つ以上の文字が続く。少数のコマンドだけは、その引数をまとめるため丸括弧を必要とする。文書終わりコマンド @bye には既にお目に掛かった。最小のTexinfoファイルの以下の例は、コメントコマンド @c を導入する。Texinfoコメントは、与えられた最終行まで伸びる。
\input texinfo@c === header ===...@c === body ===@c --- Top Node ---...@c --- Sub Nodes ---...@bye
ヘッダ
Texinfoのヘッダはオプションだが、すべての文書に現れる。これは少なくとも、オンライン読取出力ファイル名と、印刷出力に用いる題名を含む。
出力ファイル名は、@setfilename output-filename を用いて設定する。output-filenameに拡張子 .info を付けることを薦める。拡張子のないファイルには共通シェルツールからのアクセスが難しいからだ。ls *.info!を考えると良い。 @setfilename の引数は右側の行末まで達するので、出力ファイル名設定の後にコメントを加えることは出来ない。
@settitle document-title を用いて文書の題名を設定する。ここでも、引数は行末まで伸びる。 @settitleで定義する題名は、印刷出力で頁ヘッダ又はフッタとして使われる。題名頁で用いられる(題名頁があるとして)文書題名には何も作用しない。
こうして、簡単なヘッダは次のようになる:
@setfilename example.info
@settitle Texinfo Example
ヘッダ関連の他の有用なコマンドは:
規定値でTexinfo は8.5" ×11"の用紙サイズを仮定する。北米以外では、用紙サイズを DIN にしたがって選ぶ (DINは「ドイツ工業規格」)。コマンド @afourpaper と @afourwide はDIN A4の用紙サイズに関する印刷可能領域を調節する。@afourwide がやや大きい印刷領域を選ぶ、これは見掛けを変えない。
ヒント: 外国Texinfo文書については、プリンタに送る前に用紙サイズ設定を検査擦るのが良い。
@setchapternewpage even cは定義されないことに注意
ヒント:GNU 開発プロジェクトは全部Twcinfoフォーマットのドキュメントを付けて出荷される。文書をローカル出力装置で印刷したいときは、Textinfoファイルのヘッダを自分の用紙サイズ(レター、A4)及び印刷環境(デュプレックス装置など)に合わせるのがよい。
Texinfo文書の本体は、印刷用区分けコマンド(TeX部分:章、節、項など)及びオンライン読取用区分けコマンド(Info部分:ノード)の混合物である。理論的に両部分は、文書に異なる構造を与えることが出来るが、これでは読者が混乱する。−技術文書には望ましくないであろう。
本体を書く簡単な方法を示す。ここでは、オンライン版と印刷版との構造を似たものにする。追加ナビゲーションの可能性は幾らか犠牲になるが、作者がオンライン版用の構造を人手で作る面倒がなくなる。簡便法は、info構造の情報を印刷版のそれと対にすることを必要とする。
Info 構造は、@node node-name コマンドを用いて定義し、印刷構造は、特に、@chapter chapter-title, @section section-title と @subsection subsection-title で与えられる@node コマンドは常に最初に来る。そこで例えば次のようになる、
@node Introduction
@chapter Introduction
又は
@node Iterative-Processes
@section Iterative Processes
又は
@node Numerical Stability
@subsection Numerical Stability of Iterative Algorithms
@node への引数は、ノードに対し名称 node-name を割り当てる。名称は、1語以上から成る。 node-name ではスペースも完全に有効であるが、ペリオド" .''、コンマ" ,'', コロン":'' 及びストロフ"''' は有効でない。またノード名からはコマンド(" @''で始まる何か)を除くのが良い。ノード名の大文字小文字は意味がある。Texinfo文書内で各ノードは、独特の名称を持たなければならない。便宜のため、ノード名は章又は節の題名のように大文字にする。
ノードは、データ(これは、文章、表、画像及び相互引照)のみを含むか、又はナビゲーションメニューを定義するかのいずれかである。前者をターミナル・ノード、後者をメニュー・ノードと呼ぶことにする。
@node node-name@section section-titleここで、@section を区分けコマンドの例として用いる
ターミナル・ノードは、文書の「肉」である。見られる情報全部を保持する。 text-for-node-and-chapter は通常一つ以上のパラグラフ、テーブル、などを含む。
メニュー・ノードの構造は、ターミナル・ノードと同じだが、メニュー・ノードはナビゲーションメニューの定義で終わる点だけ異なる。ナビゲーションメニューは、Info版のみに入り、印刷には絶対に入らない。
@node node-name@chapter chapter-title@menu* Node name of first section:: Synopsis of first section* Node name of second section:: Synopsis of second section* Node name of last section:: Synopsis of last section@end menu
ナビゲーションメニューは
@menu@end menu
で括り、その間の各行が一つのメニュー登録になる。各メニュー登録は、アスタリスク" *'' で始まり、その後に、それが指すノードの名称が続く。二つのコロン" ::'' で終わりオプションでターゲットの短い説明を続ける:
* Target Node Name:: Optional description of target node
@node Top@top name-of-top-node
オンライン版を読むときはいつでも(読取開始のノードを明確に規定しない限り)トップ・ノードが最初に現れるので、導入文をそれにつけるのが良い。この導入文は印刷版には適さない。印刷版はメニューを全く表示しないからだ。そこで、この導入文を印刷版から取り除く。それには一対の条件付き翻訳コマンド @ifinfo と @end ifinfoを用いる。簡単なトップ・ノードは次のようになる:
@ifinfo@node Top@top Example@end ifinfo@menu* Name of first chapter:: Synopsis of first chapter(第1章の名::1章の概要)* Name of second chapter:: Synopsis of second chapter* Name of third chapter:: Synopsis of third chapter@end menu
これで完全なTexinfo文書を作る準備が出来た
\input texinfo
@setfilename example.info
@settitle Texinfo Example
@ifinfo
@node Top
@top Example
This is an example Texinfo document.
@end ifinfo
@menu
* Introduction:: Definitions, Measures, Complexity
* Evaluation of Polynomials:: Study of a common operation
@end menu
@node Introduction
@chapter Introduction
In this chapter I define the concepts that will be used throughout the
rest of the document. Moreover, measures of efficiencies as well as
bounds of complexity will be introduced.
@menu
* Definitions:: Fundamental stuff
* Measures of Efficiency:: How to measure efficiency
* Bounds of Complexity:: Typical bounds of complexity
@end menu
@node Definitions
@section Definitions
...
@node Measures of Efficiency
@section Measures of Efficiency
...
@node Bounds of Complexity
@section Bounds of Complexity
...
@node Evaluation of Polynomials
@chapter Evaluation of Polynomials
...
@bye
文法
既に見たように、Texinfoコマンドはアットマーク" @'' で始まる。アットマークには単一の文字でない記号又は一つ以上の文字の何れかが続く。第一グループのコマンドは下記が含まれる。
@@
@'').
@"character
@'character), シルコンフレックス(@^character), 又はセディーユ(@,character)も同様である。詳細はTexinfo文書のノード「Inserting Accents」を参照。
後者のグループの幾つかは、
コマンドによって、引数が無いか、又は一つ以上の引数が必要である。コマンドの中には、引数を括弧で囲む必要のあるものもある。相互引照 @xref{node-name, cross-reference-name, title-or-topic}.などである。行の残りをその引数とするものはすでに見た(例えば、 @setfilename)
区分け
TeXと同様、テキストをタイプし、空白行を用いてパラグラフを分ける。パラグラフは、使用する翻訳ツールにしたがって、密着されたりジャスティファイされたりする。
章の本文は、主区分けコマンドを導入した。@node が、入力をオンライン読取用のかたまりにまとめてグループ分けする。付属するTeX類似の区分けコマンドが印刷出力用に同じことをする。詳細には、Texinfoは次の区分けコマンドを提供する:chapter, section, subsection,及び subsubsection
簡略化ノード取扱いのためには−−各 @node には、印刷版用に区分けコマンドの一つが続かなければならないことを思い出されたい。
タイトル・ペイジ
タイトル・ペイジの作成は容易だ。 @titlepage コマンドが、そのサブコマンド @title, @subtitle (オプション), 及び @author を用いて完全にレイアウトの面倒を見る。タイトルの後のものを奇数ペイジに置きたければ、 @end titlepageの直前に、ページブレーク @page を付け加える。
例:
@titlepage
@title A Texinfo Example Document
@subtitle Playing With the Texinfo Format
@author Joanne H. Acker
@page @c -- force odd page
@end titlepage
トップ・ノードの章で、条件付き翻訳コマンド @ifinfo/@end infoにお目に掛かった。条件付き翻訳とは、文書の一部を一つのトランスレータのみに向けること、又は否定形 @ifnotinfo/@end notinfoで、一つのトランスレータ(我々の例ではmakeinfo)を文書のかたまりの処理から除外することを意味する。
開始(@ifformat) と停止(@end format)シーケンスは、行の上に自動的に現れなければならない。
条件付きは、データをInfo、TeX及びHTMLに入れ又は出すため積極的及び消極的形式で利用することが出来る。
@iftex
...
@end tex
@ifinfo
...
@end info
@ifhtml
...
@end html
@ifnottex
...
@end nottex
@ifnotinfo
...
@end notinfo
@ifnothtml
...
@end nothtml
リスト
Texinfo は、リストの基本タイプを備えている。これは、項目別及び番号付きリストである。記述リストはテーブルの方法で書く。
すべてのリストはネストする。
コマンド @item でリスト又はテーブルの登録を開始する。登録は、幾つかのパラグラフ又は追加リストから成る。すべてのリストはネストする。
@itemize glyph@item Text for first item@item Text for second item@item Text for last item@end itemize
記号 glyph が各項目の前に置かれる。glyph として有用な値は @bullet, @minus, 及び *である。
@enumerate counter-selector@item Text for first item@item Text for second item@item Text for last item@end enumerate
counter-selector は、カウンタの型(数値又は文字)と開始値を選ぶ。counter-selector を省略すると、リストには1から始まるアラビア数字が付けられる。
counter-selector を正の整数にすると与えられた値からスタートする。これはリストの計数に便利である。counter-selector を大文字又は小文字にすると、番号付けに文字を選び、与えられた文字からスタートする。
Texinfo はローマ数字で番号付けをすることは出来ない。
@table format-selector@item First term@item Second term@item Last term@end table
format-selector は、項目をタイプセットする方法を決める。マークアップを付け加えないと、これは平凡な記述りすとである。format-selector として @asis を用いる。コード、サンプル入力又は出力、変数若しくはキイストロークとして有するときは、それぞれ @code, @samp, @var,又は @kbd を用いる。特定の項目のマークアップ方法についてはインライン・マークアップの節を参照。
テーブルの中では、 @item への引数は、 @item から行末までのすべてのテキストである。したがって「記述リスト」の中の項目は単一行にだけすることが出来る。 @item 行の後、次の @item 又はテーブルの終わりまでが項目の記述となる。記述は数パラグラフの長さにすることが出来、また他のリストなどを含むことが出来る。
別の行に追加項目を必要とすることがある。 @item は、その引数を単一行で置くので、別のコマンドが必要になる:@itemx が、既存項目の真下に追加項目を置く。@itemx は、@item 又は @itemx コマンドの直後でのみ有効である。
クロス−リファレンス
Texinfo は各種のクロスリファレンス型をサポートする:追加テキスト無し、同一ファイル内、異なるTexinfoファイルをまたいで、及び外界である。
ノードは、クロスリファレンスの主な目標である。@anchor{anchor-name} が追加目標にマークを付ける。コマンド @anchor は出力を何も生じない。アンカーの名はノード名と衝突してはならない。
使用例:
... is the basis for several multi-point
methods. @xref{Multi-point Methods}. We
study the single point method ...
使用例:
The algorithm fails at higher order
roots (@pxref{Higher Order Root}) and
ill-conditioned roots of order one.
ここまでは、クロスリファレンス・コマンドの1引数形式だけを使った。しかし、パラメータを五つまで受け入れる。パラメータの数により出力が変わる様子を示す。@xref の融通性に富んだ利用法を示す。
@xref{target-name}
は
*Note target-name::
をInfo 版の中に生じ、
See Section target-section [target-name], page target-page
を印刷版の中に生じる、ここで target-section とtarget-page は印刷版で目標のあるセクション番号とペイジ番号である。
@xref{target-name, cross-reference-name}
は、
*Note cross-reference-name: target-name
及び
See Section target-section [target-name], page target-page
を生じる
@xref{target-name, cross-reference-name, title-or-topic}
は、
*Note cross-reference-name: target-name
及び
See Section target-section [title-or-topic], page target-page
を生じる
@xref{target-name, cross-reference-name, title-or-topic, info-file-name, printed-manual-title}
は
*Note cross-reference-name: (info-file-name)target-name
及び
See section "title-or-topic" in printed-manual-title
を生じる
インライン・マークアップ
Texinfo は、コード中、ユーザーからの入力、ファイル名などテキストの特殊部分をマークアップするコマンドの束を定義する。
・@emph{text-in-italics}
text-in-italics は斜字であらわす。Infoは、括弧のtext-in-italics をアンダーラインで近似する。
例:
Use tex(1), @emph{not} latex(1) to process
your Texinfo files.
・@strong{bold-text}
bold-text は太字であらわす。Infoは、括弧のbold-text.を星印で近似する。
例:
Info files @strong{cannot} contain high
resolution graphics.
・@file{filename}
filename を’filename'のように単一引用符で囲って周りから目立つようにする。プリンタ版ではfilename をタイプライタフォントで印刷する。
例:
Ensure the latest version of
@file{texinfo.tex} is installed on your Linux box.
・@url{universal-resource-locator}
URLを識別する。オンライン版ではuniversal-resource-locatorの周りに角括弧を示す。印刷版では角括弧を付けないが、universal-resource-locatorをタイプライタフォントで植字する。
例:
More information on Texinfo can be
found at @url{http://texinfo.org/}.
・@code{program-code}
プログラムコードの短片をマークアップする。
Prefer the two-argument form of
@code{bless}, this is, always write
@code{bless $objref, $class}.
・@samp{literal-text}
リテラル文字、リテラルテキスト、記号名などをマークアップする。
Angle brackets (@samp{<}, @samp{>}) are the
main delimiters used in HTML.
・@var{replaceable-item}
メタシンタクチック変数、有名な foo 及び barをマークアップする。
The Perl command @code{bless} is best called
with two arguments, like @code{bless
@var{object_reference}, @var{classname}}.
・@kbd{keystrokes}
単一キイストローク又は一連のキイストロークをマークアップする。
Within emacs, type @kbd{C-h i} to start the
built-in Info browser, or type @kbd{M-x
info}.
・@command{command-name}
コマンド名をマークアップする。
The two most important shell commands are
@command{ls} and @command{cd}.
・@option{option-name}
オプション名をマークアップする。走っているテキストでは @option を次のように使う
Option @option{--html} forces
@command{makeinfo} to generate HTML output
instead of Info.
@option は、コマンドのシノプシスをマークアップするには適しない。シノプシスをマークアップするには@example-environment を用いる。つまり
@example
makeinfo --html --output=@var{output-filename} @var{input-filename}
@end example
また、走っているテキストの中のオプションは、引数 @var{output-filename} 及び @var{input-filename}と同時に、@option{--html} 及び @option{--output} を用いる。
規定値では、makeinfo は @setfilenameで選んだファイル名を有するInfo ファイルを作る。オプション --no-split は、mekeinfoが出力をチャンクに分けるのを防止する (サイズ約50KB)。
makeinfo を用いてTexinfo ファイルを処理すると、入力ファイルを慎重に検証する。
オプション --no-headers が、makeinfo にプレーンASCII ファイルを作らせる。プレーンASCII はオンライン版の校正及びdiction(1) などの綴りチェッカーの利用に有用なフォーマットである。
-monolithic は単一ファイルを出力させ、オプション-split はノード毎に1ファイルを出力させる。
texi2html は、規定値で @iftexセクションを転換し、@ifinfoはしない。-expandinfo オプションを使ってこの役割を逆転することが出来る。
texi2htmlのオプションは全部ダッシュ一つで始まることに注意。
dvips(1) を加える。オプション --clean 及び --quiet が有用だと思う。前のものは、中間ファイル全部を削除して、最後の .dvi ファイルだけを残す。次のものは、本質的でないメッセージ全部を抑制する。
--pdf を見る必要があり、そうでないとそのファイルがあっても .dvi ファイルを探しながら止まることを私は見出した。そこで典型的な呼出は次の通りにする。
texi2pdf --quiet --clean --pdf foobar.texi
Texinfo は、今まで見た文書作成システムと異なり、HTMLとは異なるオンライン読取フォーマット、つまりInfoに翻訳することが出来る。オンライン読取フォーマットがあるので、実際に見るためにはブラウザが必要となる。
info, Info ブラウザ全部の母、は簡単だがコンソールでInfoファイルを見るのに効率の良いブラウザだviewing Info files 。
topic のInfoペイジを見るには下記を用いる
info topic
nfo ファイルinfo-file を見るには、info呼出に --file=info-file を加える。ここで、info-file にはInfoファイルへの完全なパスを含ませる。
特定ノードnode-nameでブラウズを始めたいときは、--node=node-name を加える。
間違い易いのは topic を info-file と混ぜて
info ./cache-profiler.info
とすることだ。正しくは、
info --file=./cache-profiler.info
pinfo は curses(3) ベースのInfo ブラウザで lynx(1) 似たナビゲーションをおこなう。 pinfo はinfoペイジの色付けが良い nice job colorizing。
Emacs バージョン21.x はこのfscreen shot. ように改良されたinfoブラウズをモードを特徴とする。
インストールされた Info ドキュメント(`C-h i', info)ブラウズするか、又はinfoファイルをEmacsにロードし、Info-on-current-buffer (大文字の"I"に注意)を用いてバッファを Info-browser にする。Infoバッファの間で切り換えるのが嫌で、バッファ上で作業をしたければ、ブラウズするファイルを別のフレームに開く (`C-x 5 f', find-file-other-frame)。Infoブラウザが中にある新フレームを開くには、現在のemacsの中で *info* に切り換えてview-buffer-other-frame を送る。
もっとブラウズを楽しむには、Info-speedbar-browser を試されたい。
画面 screen shot.はここ。
私の最も好きなX-ベースInfoブラウザだ。info(1) の良い特徴をすべて持っている。スタートアップが速くレイアウトがコンパクトだ compact layout.。
Gnome ユーザーであれば、gnome-help-browser(1x)をご存じの筈。Infoペイジもまた表示する displays Info pages。
KDE ユーザーについて同様... kdehelp(1x) ご存じの筈。各種フォーマットと共にInfoペイジもまた表示する displays Info pages。
kdehelp は特殊Infoファイル:
kdehelp ./cache-profiler.info
を容易にブラウズする。
konqueror もまたinfo ファイルを表示する (少なくともkonqueror 2.2.2)、Location:barに "info:" とタイプするだけ。
info-類似ナビゲーションはinfo(1)のコマンドを複写する。
| アプリケーション | 多重フォーマット | X11-ベース | infoナビゲーション |
info |
no | no | yes |
pinfo |
no | no | no |
emacs |
no | no | yes |
xinfo |
no | yes | yes |
tkinfo |
no | yes | yes |
gnome-help-browser |
yes | yes | no |
kdehelp |
yes | yes | no |
追加の読み物
Texinfoのホームペイジは、沢山の参照文献と共に, http://texinfo.org/ にある。
Texinfo用に利用出来るコンバータは http://www.fido.de/kama/texinfo/texinfo-en.htmlにある。
Linuxは、詩と同じく、成功したビジネスモデルの存在に頼らない。破産することはない。その成功はビジネスの成功と関係が無い。
Martinが以前に書いた LG 記事(両方とも風刺物語):
ブリッジファイアウォールと在来のファイアウォールとの違いは何か?通常はファイアウォールもまたルーターとして働く。内部のシステムはファイアウォールを外界への門口として理解するよう構成され、外界のルーターはファイアウォールを保護されたネットワークへの門口として理解するよう構成される。ブリッジは、二つのネットワークセグメントを接続し、他のネットワークにその存在を知られることなく、パケットを送受する。言い換えると、ルーターは二つのネットワークを接続してその間を中継する。ブリッジはパッチケーブルのように、ネットワークの二つの部分を接続している。ブリッジファイアウォールは、ブリッジとして働くとともに、受け渡しするパケットを篩いにかけ、篩に掛からなかったものだけを両側に送る。
何故こんなことをするのか?幾つかの理由が頭に浮かぶ:
BR_IP="xxx.xxx.xxx.57" BR_IFACE=br0 LAN_BCAST_ADDRESS="xxx.xxx.xxx.63" INTERNAL_ADDRESS_RANGE="xxx.xxx.xxx.56/29" INET_IFACE="eth1" LAN_IFACE="eth0" LO_IFACE="lo" LO_IP="127.0.0.1"
ifdown $INET_IFACE ifdown $LAN_IFACE ifconfig $INET_IFACE 0.0.0.0 ifconfig $LAN_IFACE 0.0.0.0
続いてブリッジを作り、それにイーサネット・インターフェイスを割り当てる。
brctl addbr $BR_IFACE brctl addif $BR_IFACE $INET_IFACE brctl addif $BR_IFACE $LAN_IFACE
ifconfig $BR_IFACE $BR_IP
この行は、有効な内部アドレスを持つパケットだけが内部インターフェイス上に受け入れられるのを確実にする:
$IPTABLES -t mangle -A PREROUTING -i $LAN_IFACE -s $INTERNAL_ADDRESS_RANGE -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -i $INET_IFACE ! -s $INTERNAL_ADDRESS_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $LAN_BCAST_ADDRESS -j ACCEPT $IPTABLES -A INPUT -p ALL -i $BR_IFACE -s $INTERNAL_ADDRESS_RANGE -d $BR_IP -j ACCEPT
Sparkle Home Page (作者の会社)
意見、質問、提案などがあればブリッジメールリストに送られたい。ブリッジメールリストの詳細はhere