💟 Archived View for geminiprotocol.net › docs › ja › tech-overview.gmi captured on 2024-08-18 at 17:15:16. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅ Previous capture (2024-07-08)

🚧 View Differences

-=-=-=-=-=-=-

プロゞェクトGeminiの技術的な抂芳

序

本文曞は完党な「Gemini技術スタック」、぀たりネットワヌク茞送プロトコルず「gemtext」マヌクアップ圢匏の䞡方のラフスケッチを提䟛したす。スケッチは䞍正確であるずいう意味での「ラフ」ではなく、単にGeminiの党おの面を完党に詳现に瀺しおいないずいう意味です。プロゞェクトGeminiのFAQにあるよりも氎面䞋でのGeminiの仕組みに぀いおずっず詳しい情報を提䟛しおいたすが、分かれおいる正匏な仕様ほどには詳しくありたせん。技術的に掗緎された読み手の奜奇心を満足させるには充分でしょう。たた゚ッゞケヌスや応甚アプリケヌションを抜きにすればそれなりにうたく動く゜フトりェアを手早く実装するこずもできたす。これは芏範的な文曞ではありたせん。ここに曞かれおいるこずず2぀の正匏な仕様の䜕れかず矛盟するずきは正匏な仕様が優越したす。

プロゞェクトGeminiのFAQ

Geminiのネットワヌクのプロトコルの仕様

Geminiハむパヌテキスト圢匏「gemtext」の仕様

1 抂芳

Geminiは芁求応答型トランザクションに特化したクラむアントサヌバヌ手続きです。倧たかにはgopherやHTTPに䌌おいたす。接続は単䞀のトランザクションの䞀方で閉じ、再利甚できたせん。GeminiがTCP/IP䞊でサヌバヌから䞎えられるずき、サヌバヌはポヌト1965最初の有人GeminiミッションであるGemini3の幎であり、'65幎3月に飛行したしたで埅ち受けたす。これは非特暩的なポヌトであるため、「䜕者でもない」利甚者ずしおサヌバヌを走らせるこずはずおも簡単です。䟋えば、たずえサヌバヌがGoで曞かれおおり、そのために䌝統的なやり方で暩限を斜せないずしおもです。

1.1 Geminiのトランザクション

Geminiのトランザクションには1皮類あり、倧たかにgopher芁求やHTTP「GET」芁求ず等䟡です。トランザクションは以䞋のように発生したす。

C: 接続を開く

S: 接続を受け付ける

C/S: TLSハンドシェむクを完了4節参照

C: サヌバヌ蚌明曞を怜蚌4.2を参照

C: 芁求を送信CRLFで終端する1行2節を参照

S: 応答ヘッダを送信CRLFで終端する1行。成功でない状態䞋では接続を閉じる3.1ず3.2を参照

S: 応答本䜓を送信テキストないしバむナリデヌタ3.3参照

S: 接続を閉じるTLSのclose_notifyを含む。4節参照

C: 応答を凊理3.4参照

なお、クラむアントはサヌバヌが応答凊理を開始するために接続を閉じるたで埅機する矩務はありたせん。䞊蚘では簡単さ・明快さのためにこのように瀺されおおり、兞型的な状況䞋で接続を閉じる責任はサヌバヌ偎にあるこず、接続は応答本文の完了埌盎ちに閉じられるべきであるこずを匷調しおおきたす。

1.2 GeminiのURIスキヌム

Geminiを介しおホストされる資源はスキヌム「gemini」を持぀URIを䜿っお指定されたす。このスキヌムはRFC 3986で定矩される䞀般的なURIの構文ず構文䞊互換性がありたすが、䞀般的な構文の党おの芁玠には察応しおいたせん。特に、暩限的な芁玠が蚱可されおおり芁件にもなっおいたすが、その利甚者情報の郚分芁玠は蚱可されおいたせん。ホストの郚分芁玠は必須です。ポヌトの郚分芁玠は省略可胜であり、既定倀は1965です。パス、ク゚リ、フラグメントの芁玠は蚱可されおおり、䞀般的な構文により定矩されおいる範囲を越えた特別な意味を持ちたせん。空のパスは「/」からのみ構成されるパスず等䟡です。パス䞭の空癜は+ではなく%20で笊号化されるべきです。

クラむアントは芁求を送る前にRFC 3986によりURIを正芏化すべきです。サヌバヌは芁求を凊理する前に受け取ったURIを正芏化すべきです。

2 Geminiの応答

Geminiの芁求はCRLFで終端する以䞋の構造を持぀単䞀の行です。

<URL><CR><LF>

<URL>はスキヌムを含めおUTF-8で笊号化された絶察URLであり、最倧長が1024バむトです。芁求はU+FEFFバむト順序印から始たっおはなりたせん。

絶察URLの代わりにパスやセクタのみを送るこずはHTTPの「Host」ヘッダを構築するこずず等䟡な効果がありたす。同じIPアドレスに耇数のGeminiドメむンの仮想ホストをするこずを蚱したす。たた、任意でプロキシずしお機胜するこずも蚱可されたす。「gemini」以倖のスキヌムの芁求を含めるこずで、サヌバヌが任意でプロトコルを翻蚳する関門ずしお機胜するこずを蚱可したす。䟋えばGemini䞊でgopher資源を取埗するなどです。プロキシは任意であり、倧倚数のサヌバヌはそれぞれのドメむンの資源の芁求にのみ応答するこずが期埅されたす。

クラむアントは芁求䞭の最初の<CR><LF>の出珟以降に䜕らも送っおはなりたせん。たたサヌバヌは最初の<CR><LF>の最初の出珟以降に送られたものは䜕であれ無芖しなければなりたせん。

3 Geminiの応答

Geminiの応答は単䞀のCRLFで終端する単䞀のヘッダ行ず、任意で続く応答本文からなりたす。

3.1 応答ヘッダ

Geminiの応答ヘッダは以䞋のような圢匏です。

<状態><空癜><メタ情報><CR><LF>

<状態>は2桁の数倀の状態コヌドであり、3.2ず補遺1に埌述する通りです。

<空癜>は単䞀の空癜文字です。぀たりバむト0x20です。

<メタ情報>はUTF-8で笊号化された最倧長1024バむトの文字列です。その意味は<状態>に䟝存したす。

党䜓の応答ヘッダず郚分文字列ずしおの<メタ情報>はU+FEFFバむト順序印で始たっおはなりたせん。

<状態>が「成功」のコヌドの範囲に属しおいない堎合、サヌバヌはヘッダを送った埌に接続を閉じなければなりたせん。たた応答本文を送っおはなりたせん。

サヌバヌが2桁の数字でない<状態>や長さが1024バむトを越える<メタ情報>を送る堎合、クラむアントは接続を閉じお応答ヘッダを無芖し、利甚者に゚ラヌを知らせるべきです。

3.2 状態コヌド

Geminiは2桁の数倀の状態コヌドを䜿いたす。関連する状態コヌドは最初の桁で同じ倀を共有したす。重芁なこずずしお、Geminiの状態コヌドの最初の桁はHTTPにあるような「クラむアント゚ラヌ」や「サヌバヌ゚ラヌ」のような曖昧な分類にコヌドを集合で分けおはいたせん。その代わり、最初の桁だけでクラむアントがどのように応答を扱えばよいかを刀定するに充分な情報を提䟛したす。蚭蚈䞊では、最初の桁を芋るだけで単玔ですが完党な機胜を持぀クラむアントを曞くこずが可胜ずなっおいたす。2぀目の桁ではより詳现な情報が提䟛されおいたす。曖昧さのないサヌバヌのログ蚘録のためであり、ちょっずばかり胜率的な利甚者むンタヌフェヌスを提䟛する簡単で察話的なクラむアントを曞くこずができたす。たた内容収集噚や怜玢゚ンゞンクロヌラなどのようなより匷固で賢く自動的なクラむアントを曞くこずもできたす。

応答コヌドの最初の桁は曖昧さなく応答を6぀の分類に仕分けたす。この分類は<メタ情報>行の意味論を定矩したす。

3.2.1 1x (INPUT)

1から始たる状態コヌドはINPUT状態コヌドです。その意味は次の通りです。

芁求された資源はテキストの利甚者の入力を受け付けたす。<META>行は利甚者に衚瀺されるべき質問内容です。それから問い合わせ芁玠を含む利甚者の入力ず共に再び同じ資源を芁求すべきです。芁求に含たれる問い合わせはRFC3986での通垞の䞀般的なURLに沿うものです。぀たり?でパスず区別されたす。利甚者の入力䞭の予玄文字はRFC2986により「パヌセント文字で笊号化」されなければなりたせん。たた空癜文字もたたパヌセント文字で笊号化すべきです。

3.2.2 2x (SUCCESS)

2から始たる状態コヌドはSUCCESS状態コヌドです。その意味は以䞋の通りです。

応答は適切に凊理され、応答本文が応答ヘッダの埌に来たす。<メタ情報>行はMIMEメディア皮別であり応答本文に適甚されたす。

3.2.3 3x (REDIRECT)

3で始たる状態コヌドはREDIRECT状態コヌドです。その意味は次の通りです。

サヌバヌはクラむアントを芁求された資源のある新しい堎所にリダむレクトしたす。応答本文はありたせん。<META>は芁求された資源のある新しいURLです。URLは絶察的ないし盞察的なものです。盞察的であれば元の芁求で䜿ったURLに察しお解決されたす。元の芁求で䜿われおいたURLにク゚リ文字列が含たれおいた堎合、クラむアントはこの文字列をリダむレクトのURLに適甚しおはならず、リダむレクトのURLを「そのたた」䜿わなければなりたせん。リダむレクトは䞀時的なものず芋做されるべきです。぀たりクラむアントは資源を元のアドレスで芁求し続けるべきであり、自動的にブックマヌクを曎新するような䟿宜がはかられるべきではありたせん。応答本文はありたせん。

3.2.4 4x (TEMPORARY FAILURE)

4から始たる状態コヌドはTEMPORARY FAILURE状態コヌドです。その意味は以䞋の通りです。

芁求が倱敗したした。応答本文はありたせん。倱敗の性質は䞀時的なものです。぀たり将来的に同䞀の芁求は成功する可胜性がありたす。<メタ情報>の内容で倱敗の远加情報を提䟛しお構いたせんし、それは人間の利甚者に衚瀺すべきです。

3.2.5 5x (PERMANENT FAILURE)

5から始たる状態コヌドはPERMANENT FAILURE状態コヌドです。その意味は以䞋の通りです。

芁求が倱敗したした。応答本文はありたせん。倱敗の性質は氞久のものです。぀たり将来に亙っお同䞀の芁求は同じ理由により確実に倱敗したす。<メタ情報>の内容では倱敗に぀いおの远加情報を提䟛しお構いたせんし、人間の利甚者に衚瀺されるべきです。収集噚や玢匕生成クロヌラのような自動的なクラむアントはこの芁求を繰り返すべきではありたせん。

3.2.6 6x (CLIENT CERTIFICATE REQUIRED)

6から始たる状態コヌドはCLIENT CERTIFICATE REQUIRED状態コヌドです。その意味は以䞋の通りです。

芁求された資源はクラむアントがアクセスする際の蚌明曞を芁求したす。芁求が蚌明曞なしにされた堎合、芁求はその1床だけにすべきです。芁求が蚌明曞付きでされた堎合、サヌバヌは受け付けず芁求は別の蚌明曞で繰り返されるべきです。<メタ情報>の内容たた特定の6xコヌドで蚌明曞の芁件に぀いおの远加情報や蚌明曞が拒絶された理由を提䟛しお構いたせん。

3.2.7 補足

なお、人間が䜿甚するための基本的な察話的クラむアントのための補足ずしお、゚ラヌ4ないし5は「゚ラヌ」の芋出しの䞋に<メタ情報>の内容を単に衚瀺するだけで、効果的にそれぞれを扱うこずができたす。゚ラヌが䞀時的なものか恒垞的なものかを区別するこずは、䞻に自動的なクラむアントの良い振舞いに関係したす。基本的なクラむアントはクラむアント蚌明曞の認蚌に察応しないこずを遞んでも構いたせん。その堎合、1、2、3、4ず5の組み合わせから始たる状態に察する4぀のそれぞれの状態制埡の仕組みが必芁です。

完党な2桁のシステムは補遺1で詳解されたす。なおそれぞれの劥圓な6぀の最初の桁に぀いお、2桁がれロのコヌドは特別な意味のない皮類の䞀般的な状態に察応したす。぀たり、発展的な機胜のない基本的なサヌバヌは10、20、30、40、50のコヌドを返しさえすれば良いのです。

Geminiの状態コヌドシステムは慎重に蚭蚈されおおり、2桁目の衚珟力ずそれに䌎っお増倧する耇雑性がサヌバヌずクラむアントの䞡方にずっお完党に「任意で有効にできる」もになるようにしおいたす。

3.3 応答本文

応答本文は単なる生の内容であり、gopherよろしくテキストないしバむナリです。圧瞮や断片化、内容や転送の笊号化ずいった類の察応はありたせん。サヌバヌは最終バむトの埌に接続を閉じ、gopherの孀立ドットのような「応答末尟」信号はありたせん。

応答本文はヘッダがSUCCESS状態぀たり状態コヌドの最初の桁2を瀺すずきにのみ付属するものです。そのような応答においお、<メタ情報>はRFC 2046に定矩されるMIMEメディア皮別です。

むンタヌネットメディア皮別は正統な圢匏で登録されたものです。Geminiを介しお転送される内容は、転送に先立っお適切䞔぀正統な圢匏で衚珟されなければなりたせん。ただし次の段萜で定矩されるように、「text」皮別は䟋倖です。

正統な圢匏においお、「text」のメディア副皮別では、テキスト行の改行ずしおCRLFが䜿われたす。Geminiはこの芁件を緩め、LF単独のテキストメディアの転送を蚱したすただしCR単独は蚱したせん。ただし、応答本文党䜓で䞀貫性を持っお改行されおいる堎合に限りたす。Geminiのクラむアントでは、Geminiを介しお受け取ったテキストメディア䞭のCRLFずLFを、改行の衚珟ずしお受け付けなければなりたせん。

MIME皮別が「text/」から始たっおおり文字集合が明瀺的に䞎えられおいない堎合、文字集合はUTF-8であるこずが仮定されるべきです。準拠するクラむアントはUTF-8で笊号化されたtext/*の応答に察応しなければなりたせん。クラむアントは任意で他の笊号化方匏に察応しおも構いたせん。耇合できない文字集合で応答を受け取ったクラむアントは文字化けを衚瀺する代わりに起こったこずを䞁寧に利甚者に䌝えるべきです。

<メタ情報>が空文字列である堎合、MIME皮別は既定で「text/gemini; charset=utf-8」でなければなりたせん。text/geminiメディア皮別は5節で定矩されたす。

3.4 応答本文の取り扱い

クラむアントによる応答の扱いは提䟛されたMIME皮別の情報により実斜されるべきです。Geminiは独自のMIME皮別text/geminiを定矩しおおり、この扱いに぀いおは5節で埌述されたす。その他党おの堎合でクラむアントはMIME皮別に基づいお「䜕らかの意味のある」こずをすべきです。最小限䞻矩のクラむアントは曞ᅵᅵᅵ化するこずなく画面にgemtext以倖党郚のtext/*の応答を出力する戊略を採っおも構いたせんし、テキスト応答でないものをディスクに保存するずいうのも良いでしょう。unixシステム向けのクラむアントは、テキストでない皮別の扱いに぀いお、/etc/mailcapにむンストヌルされたプログラムをあたるず良いでしょう。

4 TLS

GeminiのトランザクションにTLSを䜿甚するこずは必須です。

TSLぞのサヌバヌ名衚瀺 (Server Name Indication; SNI) の仕様も必須です。これにより名前による仮想ホストが掻甚できたす。

RFC 5246及び8446により、Geminiのサヌバヌは完党な応答を送った埌に接続を閉じるのに先立ちTLSの`close_notify`を送らなければなりたせん。これはネットワヌクの゚ラヌや攻撃により䞍完党に閉じた応答ず完遂した応答を区別するために必須です。

4.1 バヌゞョン芁件

サヌバヌはTLSバヌゞョン1.2以䞊を䜿わなければなりたせん。たたTLSバヌゞョン1.3以䞊を䜿うべきです。TLS 1.2は、利甚できる実装ラむブラリの範囲を劇的に枛らしおしたうこずを避けるために圓面の間、気は進たないものの蚱可されおいたす。近い将来、TLS 1.3以䞊を䜿う仕様にできるこずを望んでいたす。時代を先取りするクラむアントはTLSバヌゞョン以䞋を䜿うサヌバヌぞの接続を拒絶しおも構いたせん。

4.2 サヌバヌ蚌明曞の怜蚌

クラむアントはTLS接続を奜きなだけ怜蚌しお良い党くしなくおも良いですが、匷く掚奚されるやり方は、軜量な「TOFU」蚌明曞ピン留めシステムを実装するこずです。これは自己蚌明蚌明曞を第䞀玚垂民ずしお扱うものです。これによりネットワヌク䞊の䜙蚈な負担が倧幅に枛り蚌明曞が送られるだけでよく、鎖党䜓でなくお良くなりたす、Geminiのサむトを蚭定する敷居が䜎くなりたすCAに支払いをしたりLet's Encryptのcronゞョブを蚭定したりするこずなく、蚌明曞を䜜っお実行するだけになりたす。

TOFUは「Trust On First Use」から取っおおり、OpenSSHで䜿われる公開鍵セキュリティモデルに䌌たものです。最初にGeminiクラむアントがサヌバヌに接続したずき、䜕であれ提瀺された蚌明曞を受け付けたす。その蚌明曞の指王ず期限日はSSHの.known_hostsファむルず同様に氞続的なデヌタベヌスに保存され、サヌバヌのホスト名ずポヌト番号に玐付きたす。以降は同じホスト名ず同じポヌト番号ぞの接続では、受け取った蚌明曞の指王が蚈算されデヌタベヌス䞭のものず比范されたす。もし蚌明曞を以前に受け取っおおらず、以前の蚌明曞の期限日が過ぎおいなければ、利甚者には譊告が衚瀺されたす。これはwebブラりザの利甚者が信頌できるCAに至る眲名鎖のない蚌明曞を受け取ったずきの衚瀺ず䌌たものです。

このモデルは完党ずは蚀い難いものですが、自己蚌明蚌明曞を単に無条件に受け付けるよりはひどくはなく、ずっずマシです。

4.3 クラむアント蚌明曞

webでは滅倚に芋たせんが、TLSではクラむアントが蚌明曞を䜿っおサヌバヌに自己を蚌明するこずができたす。ちょうどサヌバヌが䌝統的に自身をクラむアントに蚌明するのず同じやり方です。Geminiにはサヌバヌに受け付ける方向の芁求をする機胜が含たれおおり、クラむアントはクラむアントの蚌明曞付きの芁求を繰り返したす。これは倧倉柔軟であり、かなりセキュアなのですが、幟぀かの応甚䟋でクラむアントの同定に぀いおずおも単玔な気付きがありたす。

Geminiの芁求は兞型的にはクラむアント蚌明曞なしで行われたす。もし芁求された資源にクラむアント蚌明曞が必芁で、芁求に含たれおいなければ、サヌバヌは状態コヌド60、61、62で応答できたす補遺1のクラむアント蚌明曞に関係する党おの状態コヌドの説明を参照。それらの状態コヌドに察する応答で生成されたり読み蟌たれたりしたクラむアント蚌明曞は、芁求するURLず同じホスト名ずポヌト番号に玐付くスコヌプず芁求するURLのパスの配䞋にある党おのパスを受け持ちたす。䟋えばgemini://example.com/fooが状態60を返し、利甚者が新しいクラむアント蚌明曞を生成しおこれに応答するこずを遞んだ堎合、その同じ蚌明曞が以降のgemini://example.com/fooやgemini://example.com/foo/bar、gemini://example.com/foo/bar/baz等々ぞの芁求で䜿われ、利甚者が蚌明曞を削陀するず決めたり䞀時的に非掻性にしたりするずきたで続きたす。人間の利甚者のための察話的なクラむアントに぀いおは、そのような動䜜を簡単にできるように、そしおクラむアント蚌明曞の䜿甚に関しお利甚者に包括的に完党な制埡を䞎えるように匷くお勧めしたす。

5 text/geminiメディア皮別

5.1 抂芳

HTMLがHTTPの「独自の」応答圢匏であり、玠のテキストがgopherの独自の応答圢匏であるのず同じ意味で、Geminiは独自の応答圢匏を定矩しおいたす。ただしもちろん、応答ヘッダにMIME皮別を含めおいるおかげで、Geminiは玠のテキスト、リッチテキスト、HTML、Markdown、LaTeXなどをサヌバヌから送るこずができたす。

皮別「text/gemini」の応答本文は軜量ハむパヌテキスト圢匏の䞀皮であり、gophermapsずMarkdownから着想を埗おいたす。この圢匏ではGopherの玠のテキストより豊かな衚瀺䞊の可胜性を蚱しおいたすが、非垞に解析が簡単であるこずは保たれおいたす。圢匏は行指向であり、各行を独立しお凊理し、文曞を䞀床だけ通し぀぀呈瀺を満足に行えたす。gopherに埓い、リンクは1行毎にのみ衚瀺でき、敎っおいる箇条曞のような構造を掚進したす。

単玔なクラむアントが2桁目を無芖しおも正しく機胜するようにGeminiの2桁の状態コヌドが蚭蚈されおいるのず䌌おおり、text/gemini圢匏は単玔なクラむアントが発展的な機胜を無芖しおもずおも有甚であるこずは倉わらないように蚭蚈されおいたす。

5.2 匕数

「text」最䞊䜍メディア皮別の副皮別である「text/gemini」は、RFC2046に定矩されおいる「charset」匕数を継承したす。しかしながら、Geminiを介しお転送される「text」内容の「charset」の既定倀は「UTF-8」です。

「text/gemini」副皮別で個別に定矩されおいる远加の匕数が1぀ありたす。それは「lang」匕数です。「lang」の倀は「text/gemini」文曞のテキスト内容が曞かれおいる自然蚀語を瀺すものです。「lang」匕数の存圚は省略できたす。「lang」匕数があるずき、その解釈は完党にクラむアントで定矩されたす。䟋えば、テキスト音声合成の技術を䜿っおGeminiで衚された内容が目の䞍自由な利甚者にずっおアクセシビリティのあるものにするクラむアントは、「lang」倀を䜿っお内容の発音を向䞊しおも良いでしょう。テキストを画面に呈瀺するクラむアントは「lang」倀を䜿っおテキストが巊暪曞きず右暪曞きのどちらで衚瀺すべきかを刀定しおも良いでしょう。巊暪曞きで曞かれた蚀語だけを読む利甚者甚の単玔なクラむアントでは、単に「lang」倀を無芖すれば良いでしょう。「lang」匕数が無い堎合、䜕らの既定倀も仮定されず、テキスト合成音声の画面読み䞊げ噚ずいった内容を凊理するための蚀語の決定が必芁なクラむアントは、「lang」匕数が欠萜しおいる堎合にどのように凊理を続ければ良いか決定するための利甚者の入力に䟝存すべきです。

「lang」匕数の劥圓な倀はBCP47に定矩される1぀以䞊の蚀語タグのコンマ区切のリストです。䟋えば以䞋です。

5.3 行指向の蚭蚈

既に蚀及したように、text/gemini圢匏は行指向です。text/gemini文曞の各行は単䞀の「行皮別」を持ちたす。行の最初の3文字を調べるこずでこの皮類を曖昧さなく刀定するこずが可胜です。行の皮類があるこずで利甚者にどのように衚瀺されるかを決定したす。特定の行の皮類に関連付けられる衚瀺や呈瀺の詳现は厳密に各個別の行の範疇においお制限されたす。

蚈7぀の行の皮別がありたす。しかし完党な機胜を持ち仕様に準拠するGeminiクラむアントはその内の4぀を認識し扱いさえすれば良いのです。これらは「䞭栞の行の皮別」5.4参照です。発展的なクラむアントは远加で「発展的な行の皮別」5.5参照に぀いおも扱えるようにできたす。単玔なクラむアントは発展的な行の皮別の党おを䞭栞の行の皮別ず等䟡なものずしお扱うだけでも、充分な利甚者䜓隓を提䟛できたす。

5.4 䞭栞の行の皮別

4぀の䞭栞の行の皮別は以䞋の通りです。

5.4.1 テキスト行

テキスト行は最も基本的な行の皮別です。これは埌述するどの行の皮別の定矩にも合臎しない任意の行が、既定ずしおテキスト行になるずいうこずです。よくあるtext/gemini文曞の倧倚数の行がこのテキスト行になるでしょう。

テキスト行はクラむアントの目に芋える範囲の適切な幅に折り返された埌に利甚者に衚瀺されるべきです。テキスト行はは、䞀般的な読み方をする䞊で芖芚的に芋やすいように利甚者に衚瀺されるべきです。现かい意味合いに぀いおはクラむアント偎に裁量がありたす。䟋えば可倉幅のフォントが䜿われおも良いですし、空癜が正芏化されおも良いですし、単語間の空癜より文の間の空癜が長くなるようにしおも良い、ずいった感じで衚瀺䞊の工倫を適甚するのは構いたせん。クラむアントはフォントやフォントの倧きさや背景色などを倉えるこずによっお、テキスト行の芋た目を独自のものにしたりするこずを利甚者に蚱しおも構いたせん。著者はテキストの内容に専念し、テキスト行の粟密な呈瀺に぀いお管理できるずは思わないこずです。このようにしお扱われるず正しく衚瀺されないようなASCIIアヌトやコンピュヌタヌの゜ヌスコヌドなどは、曞匏化枈み切り替え行の間に囲たれるべきです5.4.3参照。

空行はテキスト行に含たれ、特別な意味はありたせん。それぞれに぀いお垂盎な空の空間ずしお目に芋えない圢で個別に呈瀺されるべきです。連続する空癜行はより少ない空癜行に瞮めるべきではありたせん。

クラむアントの機噚の画面に収たる分より長いテキスト行は収たるように「折り返される」べきです。぀たり、長い行は機噚に適切な幅の耇数の連続する行に理想的には空癜やハむフンのずころで分割されるべきです。この折り返しはテキストの各行に独立しお適甚されたす。しかし、クラむアントの機噚の画面より短い耇数の連続するテキスト行は、より少ない数でより長い行に結合されるべきではありたせん。

このテキスト曞匏の手法を最倧限掻かすため、text/geminiで内容を曞く著者は特定の固定幅で手䜜業で折り返すこずは避けるべきです。これはGopherspaceの慣習ずしお80文字以内で折り返すのが兞型であるのずは察照的です。その代わりに、䞀繋がりの塊ずしお衚瀺されるべきテキストは単䞀の長い行ずしお曞かれるべきです。ほずんどのテキスト゚ディタは「゜フトな折り返し」にするよう構成できたす。぀たりこうした皮類のファむルを曞く䞊で単語の協䌚で長い行を折り返しお衚瀺し、著者の画面の機噚に合うようにするのです。

内容をハヌドに折り返さないず気が枈たない著者に気付いおほしいのですが、ハヌドな折り返しの長さず同じかそれ以䞊の幅の画面の機噚のクラむアントではいい感じに衚瀺されるずしおも、それより狭いクラむアントでは䞍芏則な行の幅ずなっお珟れおしたいたす。

5.4.2 リンク行

「=>」の2文字から始たる行はリンク行です。この行は以䞋の構文をしおいたす。

=>[<空癜>]<URL>[<空癜><利甚者に芪しみやすいリンクの名前>]

ここで、次の通りです。

以䞋の䟋は、党お正圓なリンク行です。

=> gemini://example.org/
=> gemini://example.org/ リンクの䞀䟋
=> gemini://example.org/foo	同じホストにある別のリンクの䟋
=> foo/bar/baz.txt	盞察リンク
=> 	gopher://example.org:70/1 gopherのリンク

リンク行内のURLはRFC 3986にしたがっお予玄された文字ず空癜はパヌセント文字で笊号化されなければなりたせん。

なお、リンクのURLはgeminiでないスキヌムであっお構いたせん。぀たり、Geminiの文曞は単玔か぀兞雅に他のプロトコルを介しおホストされおいる文曞ぞのリンクを匵れるのです。gopherでない内容ぞのリンクは`h`項目の皮類の非暙準的な適応をせざるを埗ないgophermapずは異なりたす。

クラむアントはクラむアントの著者が望む通りのやり方でリンクを衚瀺できたす。しかしクラむアントはスキヌムがネットワヌクプロトコルに察応するリンク䟋えばgemini://、gopher://、https://、ftp://などから始たるリンクの衚瀺にあたっおいかなる自動的なネットワヌク接続もしおはなりたせん。

5.4.3 曞匏化切替え行

最初の3文字が「```」である行぀たり先頭に空癜のない3぀の連続する逆匕甚笊は曞匏化枈み切替え行です。この行は利甚者に衚瀺する呈瀺される出力に含たれるべきではありたせん。その代わりに構文解析噚は曞匏化枈みモヌドの「有効」ず「無効」が切り替わりたす。曞匏化枈みモヌドは文曞の開始時は「無効」であるべきです。曞匏化枈みモヌドの珟圚の状態は、構文解析噚が維持する必芁のある内郚状態であるに過ぎたせん。曞匏化枈みモヌドが「有効」のずき、通垞の行を識別する芏則は停止し、党おの行は曞匏化枈みテキスト行ずなりたす5.4.4参照。

曞匏化枈み切り替え行はHTMLでの<pre>ず</pre>タグのようなものず考えられたす。

曞匏化枈みモヌドを有効に切り替える曞匏化枈み切替え行の先頭の「```」以降のテキストは、切り替え行に続く曞匏化枈みテキスト行に付随する「代替テキスト」ずしおクラむアントにより解釈されお構いたせん。代替テキストの䜿甚はクラむアントの裁量にあり、単玔なクラむアントは無芖しお構いたせん。代替テキストはASCIIアヌトやテキストらしくない内容に付けるこずをお勧めしたす。䟋えば、画面読み䞊げ噚を通じお呈瀺される際に有意味に理解できないものであったり、怜玢゚ンゞンにより玢匕ずしお有効掻甚できるものであったりしたす。コンピュヌタの゜ヌスコヌドに䜿っおプログラミング蚀語の指定しおも構いたせん。発展的なクラむアントは構文圩色に䜿っおも構いたせん。

曞匏化枈みモヌドを無効に切り替える曞匏化枈み切替え行の先頭の「```」に続くテキストは、クラむアントで無芖されなければなりたせん。

5.4.4 曞匏化枈みテキスト行

曞匏化枈みモヌドではテキスト行は利甚者に察しお「䞭立」に、空癜の倉曎や装食的な改善なしに固定幅フォントで衚瀺されるべきです。グラフィカルなクラむアントは、クラむアントの目に芋える範囲よりも長い曞匏化枈みテキスト行の衚瀺に぀いお、折り返すよりかは画面スクロヌルの仕組みを䜿うべきです。曞匏化枈みテキスト行を衚瀺する䞊で、クラむアントはASCIIアヌトやコンピュヌタの゜ヌスコヌドのような掻甚䟋を念頭に眮くべきです。具䜓的には空癜が重芁な蚀語で曞かれた゜ヌスコヌド䟋えばPythonはクラむアントでファむルに切り貌りしたずきに特に問題なく解釈やコンパむルができるようにすべきです。クラむアントが衚瀺するやり方で問題が起こらないようにすべきです。

5.5 発展的な行の皮類

以降の発展的な行の皮類は発展的なクラむアントでは認識しおも構いたせん。5.4.1にあるように単玔なクラむアントは党おをテキスト行ずしお扱っお構いたせん。䞍可欠な機胜は損なわれたせん。

5.5.1 芋出し行

「#」から始たる行は芋出し行です。芋出し行は1、2、3個の連続する「#」文字から構成され、任意で空癜が続き、その埌ろに芋出しのテキストが来たす。#ず##ず###はHTMLでの<h1>ず<h2>ず<h3>のようなものず考えられたす。

芋出しテキストの内容は利甚者に衚瀺されるべきであり、クラむアントは特別な曞匏化を䜿っお構いたせん。䟋えば芋出しになっおいるこずを瀺すためにより倧きかったり倪かったりするフォントを䜿うなどです単玔なクラむアントでは先頭の#を含めおその行を衚瀺し、党く装食しなくお構いたせん。しかし、芋出し行の䞻県の目的は装食のためでなく意味論的なものであり、文曞の内郚構造に぀いおの機械で読み取れる衚珟を提䟛するこずなのです。発展的なクラむアントはこの情報を䜿っお、䟋えば長い文曞に぀いおは画面脇に階局的に曞匏化された「目次」を自動的に生成しお衚瀺しお構いたせん。こうするず利甚者は簡単に特定の節に飛ぶこずができ、スクロヌルしたくらなくお良くなりたす。CMS的なツヌルに぀いおは、ディレクトリ内のgemtext文曞に察しおメニュヌやAtom/RSSフィヌドを自動生成するのに、ファむルの最初の芋出しを人間が芪しみやすい題名ずしお䜿えたす。

5.5.2 順䞍同リスト項目

「* 」から始たる行は順䞍同リスト項目です。この行の皮類は玔粋に装食䞊の理由から存圚しおいたす。*は発展的なクラむアントでは点の蚘号で眮き換えおも構いたせん。「* 」の埌のテキストはあたかもテキスト行のように利甚者に衚瀺されるべきです。぀たり、目に芋える範囲に収たるように折り返し、「いい感じ」に曞匏化するのです。発展的なクラむアントは点の蚘号の空癜を考慮に入れお、長いリスト項目を折り返すずきにその項目に察応する党おの行が画面端から等しい距離で間が空くようにするこずもできたす。

5.5.3 匕甚行

「>」から始たる行は匕甚行です。この行の皮類が存圚しおいるのは、発展的なクラむアントが読者のために装食の区別ができるようにするためです。特定のテキストが倖郚の資料から匕甚されたものだずいうような、重芁な意味論的な情報が読者に䌝わりたす。䟋えば、長い行を目に芋える範囲に折り返すずき、結果的に衚瀺される各行には前方に「>」蚘号が眮かれおいおも構いたせん。

補遺1 2桁の状態コヌドの党容

10 INPUT

3.2で単䞀桁のコヌド1での定矩に埓いたす。

11 SENSITIVE INPUT

状態コヌド10に埓いたすが、パスワヌドのような機密性のある入力に䜿いたす。クラむアントは状態コヌド10に埓っお質問を衚瀺すべきです。ただし利甚者の入力は「肩越しに芗いお」読み取られるこずを防ぐため、画面に衚瀺すべきではありたせん。

20 SUCCESS

3.2の単䞀桁コヌド2の定矩に埓いたす。

30 REDIRECT - TEMPORARY

3.2の単䞀桁3の定矩に埓いたす。

31 REDIRECT - PERMANENT

芁求された資源は䞀貫しお将来、䞎えられた新しいURLに芁求すべきです。怜玢゚ンゞンの玢匕䜜成噚や内容収集噚は構成を曎新しお叀いURLに芁求するこずを避け、゚ンドナヌザヌのクラむアントは自動的にブックマヌクを曎新したりなどすべきです。なお状態コヌドの最初の桁だけに泚意を払うクラむアントはこれを䞀時的なリダむレクトずしお扱いたす。それでも正しい堎所に行き着きたすが、このリダむレクトが氞久のものであるかどうかの知識を掻甚できたせん。ですから毎回リダむレクトに埓わなければならないこずにより小さな効率䞊の代償を払いたす。

40 TEMPORARY FAILURE

3.2の単䞀桁4の定矩に埓いたす。

41 SERVER UNAVAILABLE

オヌバヌロヌドやサヌバヌの保守䜜業のため利甚できたせんHTTP 503ず関連。

42 CGI ERROR

CGIやそれに䌌た動的な内容を生成するシステムの凊理が、予期せず異垞終了したり、時間切れになったりしたした。

43 PROXY ERROR

サヌバヌで正垞にリモヌトホストずのトランザクションを完了できなかったため、プロキシの芁求が倱敗したしたHTTP 502、504ず関連。

44 SLOW DOWN

レヌト制限が効いおいたす。<メタ情報>はクラむアントが別の芁求をこのサヌバヌにする前に埅機しなければいけない秒数の敎数倀ですHTTP 429が関連。

50 PERMANENT FAILURE

3.2の単䞀桁コヌドの定矩に埓いたす。

51 NOT FOUND

芁求された資源は芋付かりたせんでしたが、将来は利甚できるかもしれたせんHTTP 404が関連この重芁な状態コヌドをどうにかしお芚えようずしおいたすか簡単なこずです。゚リア51では隠されたものは芋付けられたせんからね。

52 GONE

芁求された資源は最早入手できず、再び手に入るこずもありたせん。怜玢゚ンゞンや類するツヌルでは、この資源を玢匕から削陀すべきです。内容収集噚では資源の芁求を止め、人間の利甚者に賌読しおいた資源が散逞したこずを䌝えるべきですHTTP 410が関連。

53 PROXY REQUEST REFUSED

ドメむンの資源ぞの芁求がサヌバヌから送られず、サヌバヌでプロキシの芁求が受け付けられたせん。

59 BAD REQUEST

サヌバヌがクラむアントの芁求を解析したせんでした。間違っお曞匏化された芁求であったためず芋られたすHTTP 400に関連。

60 CLIENT CERTIFICATE REQUIRED

3.2の単䞀コヌド6の定矩に埓いたす。

61 CERTIFICATE NOT AUTHORISED

䞎えられたクラむアント蚌明曞には、芁求された資源にアクセスする暩限がありたせん。問題が蚌明曞自䜓になく、他の資源に察しおは暩限がある可胜性がありたす。

62 CERTIFICATE NOT VALID

䞎えられたクラむアント蚌明曞が䞍圓であるため受け付けられたせんでした。これは蚌明曞の内容やそれ自身に問題があるこずを瀺しおおり、特定の芁求された資源に぀いおは考慮されたせん。最もありそうな原因は蚌明曞の劥圓性の開始日が未来になっおいるか期限日が過ぎおいるかですが、このコヌドは䞍圓なシグネチャやX509暙準芁件の違反を瀺しおいる可胜性もありたす。<メタ情報>は厳密な゚ラヌに぀いおの情報を提䟛すべきです。