www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | LICENSE

commit e3f478091ade741bcbb2680c270d3cb74c21d910
parent 245c651be6f7014c671c6d33c77cf62da419ebec
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sun, 27 Oct 2024 17:13:36 +0900

add drafts

Diffstat:
Aman/draft/9p.html | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aman/draft/vi.html | 34++++++++++++++++++++++++++++++++++
Apub/draft/9p.html | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apub/draft/vi.html | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpub/rss.xml | 4++--
5 files changed, 270 insertions(+), 2 deletions(-)

diff --git a/man/draft/9p.html b/man/draft/9p.html @@ -0,0 +1,96 @@ +<h1>9P</h1> +<time>2024-10-27</time> +<h2>はじめに</h2> +<p> +9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。\ +このプロトコルを使えば、ディスクに記録されたデータだけでなく、\ +マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等も\ +ファイルとして扱える。\ +Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOS\ +のためのプロトコルである。 +</p> + +<p> +Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計\ +されているので、\ +この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。\ +</p> + +<p> +便利そうなのでGo言語で実装してみた。 +</p> + +<h2>9Pプロトコル</h2> +<h3>概要</h3> +<p> +9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに\ +対してリプライを返すことを繰り返す。\ +クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと\ +言う。\ +Tメッセージにはファイルにアクセスするための色々なものが用意されている。\ +例えばファイルを開くための<code>Topen</code>や、\ +開いたファイルに書き込むための<code>Twrite</code>等である。\ +それぞれのTメッセージには対応するRメッセージがある。\ +<code>Topen</code>に対して<code>Ropen</code>、\ +<code>Twrite</code>に対して<code>Rwrite</code>等である。\ +</p> +<p> +通信は必要な情報をプロトコルの定める方法でバイト列に変換して送受信する。\ +2バイト以上のデータはリトルエンディアンになるように配置する。\ +テキストデータはUTF-8にエンコードする。\ +テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。\ +</p> +<p> +各メッセージは4バイトのサイズから始まる。\ +これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。\ +次にメッセージの種類を記述する1バイトのデータが来る。\ +次はメッセージのタグである。クライアントはサーバーからの返事を\ +待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージ\ +に対する返事なのかを識別する必要がある。そのために使うのがタグである。\ +クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに\ +同じタグを付ける。\ +その後ろには、メッセージの種類によって固有の情報が付けられる。\ +</p> +<p> +以下は実際の9P通信のログである。\ +実際はバイナリの通信だが、ログとして見易いように変換してある。\ +また、先頭にくるメッセージサイズは省略してある。\ +この例では、サーバーのルートディレクトリにある<code>hello</code>という\ +ファイルの内容を読みこんでいる。:\ +</p> +<pre><code>\ +&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' +--&gt; Rversion Tag 65535 msize 8192 version '9P2000' +&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname +--&gt; Rattach Tag 0 qid (0000000000000000 0 d) +&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello +--&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) +&lt;-- Tstat Tag 0 fid 1 +--&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 +&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 +--&gt; Rwalk Tag 0 nwqid 0 +&lt;-- Topen Tag 0 fid 2 mode 0x0 +--&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 +&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 +--&gt; Rread Tag 0 count 7 ' 776f726c 64210a' +&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 +--&gt; Rread Tag 0 count 0 '' +&lt;-- Tclunk Tag 0 fid 2 +--&gt; Rclunk Tag 0 +</code></pre> +<p> +まず最初にクライアントがサーバーに対して<code>Tversion</code>を送り、\ +プロトコルのバージョンと、メッセージの最大サイズを交渉する。\ +<code>Tversion</code>のタグは<code>65535</code>と決められている。\ +<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、\ +<code>version</code>の9P2000がプロトコルのバージョンである。\ +サーバーから<code>Rversion</code>で同じ\ +<code>msize</code>と<code>version</code>が返ってきたので\ +このサイズとバージョンで以降の通信を行う。\ +</p> +<p> +次の<code>Tattach</code>で、クライアントがサーバーにルートディレクトリの\ +<code>fid</code>を要求する。\ +<code>afid</code>以降は認証用の情報である。\ + +</p> diff --git a/man/draft/vi.html b/man/draft/vi.html @@ -0,0 +1,34 @@ +<h1>vi -- テキストエディタ</h1> +<time>2024-10-27</time> +<h2>コマンドの実行</h2> +<p> +バッファにコピーした任意のテキストをコマンドとして実行できる。\ +</p> +<ul> +<li> +コマンドをどこかの行に入力。 +</li> +<li> +コマンドをバッファ<code>q</code>へコピー: +<code>\ +0"qy$ +</code> +</li> +<li> +バッファ<code>q</code>内のコマンドを実行: +<code>\ +@q +</code> +</li> +</ul> +<p> +例えば単語をhtmlの<code>code</code>タグで囲むコマンド: \ +<pre><code>\ +i&lt;code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u>\ +lea&lt;/code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u> +</code></pre> +をどこかに入力し、その行でコマンドモードに移行し、<code>0"qy$</code>と\ +すると<code>q</code>バッファに上のコマンドがコピーされるので、\ +<code>code</code>タグで囲みたい単語の先頭に移動し、<code>@q</code>と入力すると\ +その単語が<code>code</code>タグで囲まれる。 + diff --git a/pub/draft/9p.html b/pub/draft/9p.html @@ -0,0 +1,81 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <link rel="stylesheet" type="text/css" href="/style.css"> + <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> + <title>9P</title> +</head> +<body> + <header> + <a href="/">主頁</a> | + <a href="/about.html">自己紹介</a> | + <a href="/journal">日記</a> | + <a href="/farm">農業</a> | + <a href="/kitchen">台所</a> | + <a href="/computer">電算機</a> | + <a href="/poetry">詩</a> | + <a href="/books">本棚</a> | + <a href="/gallery">絵</a> | + <a href="https://git.mtkn.jp">Git</a> + </header> + <main> + <article> +<h1>9P</h1> +<time>2024-10-27</time> +<h2>はじめに</h2> +<p> +9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。このプロトコルを使えば、ディスクに記録されたデータだけでなく、マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等もファイルとして扱える。Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOSのためのプロトコルである。 +</p> + +<p> +Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計されているので、この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。</p> + +<p> +便利そうなのでGo言語で実装してみた。 +</p> + +<h2>9Pプロトコル</h2> +<h3>概要</h3> +<p> +9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに対してリプライを返すことを繰り返す。クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと言う。Tメッセージにはファイルにアクセスするための色々なものが用意されている。例えばファイルを開くための<code>Topen</code>や、開いたファイルに書き込むための<code>Twrite</code>等である。それぞれのTメッセージには対応するRメッセージがある。<code>Topen</code>に対して<code>Ropen</code>、<code>Twrite</code>に対して<code>Rwrite</code>等である。</p> +<p> +通信は必要な情報をプロトコルの定める方法でバイト列に変換して送受信する。2バイト以上のデータはリトルエンディアンになるように配置する。テキストデータはUTF-8にエンコードする。テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。</p> +<p> +各メッセージは4バイトのサイズから始まる。これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。次にメッセージの種類を記述する1バイトのデータが来る。次はメッセージのタグである。クライアントはサーバーからの返事を待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージに対する返事なのかを識別する必要がある。そのために使うのがタグである。クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに同じタグを付ける。その後ろには、メッセージの種類によって固有の情報が付けられる。</p> +<p> +以下は実際の9P通信のログである。実際はバイナリの通信だが、ログとして見易いように変換してある。また、先頭にくるメッセージサイズは省略してある。この例では、サーバーのルートディレクトリにある<code>hello</code>というファイルの内容を読みこんでいる。:</p> +<pre><code>&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' +--&gt; Rversion Tag 65535 msize 8192 version '9P2000' +&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname +--&gt; Rattach Tag 0 qid (0000000000000000 0 d) +&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello +--&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) +&lt;-- Tstat Tag 0 fid 1 +--&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 +&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 +--&gt; Rwalk Tag 0 nwqid 0 +&lt;-- Topen Tag 0 fid 2 mode 0x0 +--&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 +&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 +--&gt; Rread Tag 0 count 7 ' 776f726c 64210a' +&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 +--&gt; Rread Tag 0 count 0 '' +&lt;-- Tclunk Tag 0 fid 2 +--&gt; Rclunk Tag 0 +</code></pre> +<p> +まず最初にクライアントがサーバーに対して<code>Tversion</code>を送り、プロトコルのバージョンと、メッセージの最大サイズを交渉する。<code>Tversion</code>のタグは<code>65535</code>と決められている。<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、<code>version</code>の9P2000がプロトコルのバージョンである。サーバーから<code>Rversion</code>で同じ<code>msize</code>と<code>version</code>が返ってきたのでこのサイズとバージョンで以降の通信を行う。</p> +<p> + +</p> + </article> + + </main> + <footer> + <address>info(at)mtkn(dot)jp</address> + <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> + </footer> +</body> +</html> diff --git a/pub/draft/vi.html b/pub/draft/vi.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <link rel="stylesheet" type="text/css" href="/style.css"> + <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> + <title>vi -- テキストエディタ</title> +</head> +<body> + <header> + <a href="/">主頁</a> | + <a href="/about.html">自己紹介</a> | + <a href="/journal">日記</a> | + <a href="/farm">農業</a> | + <a href="/kitchen">台所</a> | + <a href="/computer">電算機</a> | + <a href="/poetry">詩</a> | + <a href="/books">本棚</a> | + <a href="/gallery">絵</a> | + <a href="https://git.mtkn.jp">Git</a> + </header> + <main> + <article> +<h1>vi -- テキストエディタ</h1> +<time>2024-10-27</time> +<h2>コマンドの実行</h2> +<p> +バッファにコピーした任意のテキストをコマンドとして実行できる。</p> +<ul> +<li> +コマンドをどこかの行に入力。 +</li> +<li> +コマンドをバッファ<code>q</code>へコピー: +<code>0"qy$ +</code> +</li> +<li> +バッファ<code>q</code>内のコマンドを実行: +<code>@q +</code> +</li> +</ul> +<p> +例えば単語をhtmlの<code>code</code>タグで囲むコマンド: <pre><code>i&lt;code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u>lea&lt;/code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u> +</code></pre> +をどこかに入力し、その行でコマンドモードに移行し、<code>0"qy$</code>とすると<code>q</code>バッファに上のコマンドがコピーされるので、<code>code</code>タグで囲みたい単語の先頭に移動し、<code>@q</code>と入力するとその単語が<code>code</code>タグで囲まれる。 + </article> + + </main> + <footer> + <address>info(at)mtkn(dot)jp</address> + <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> + </footer> +</body> +</html> diff --git a/pub/rss.xml b/pub/rss.xml @@ -5,8 +5,8 @@ <description>ウェブページの更新履歴</description> <language>ja-jp</language> <link>https://www.mtkn.jp</link> -<lastBuildDate>Thu, 10 Oct 2024 18:04:11 +0900</lastBuildDate> -<pubDate>Thu, 10 Oct 2024 18:04:11 +0900</pubDate> +<lastBuildDate>Sun, 27 Oct 2024 16:33:29 +0900</lastBuildDate> +<pubDate>Sun, 27 Oct 2024 16:33:29 +0900</pubDate> <docs>https://www.rssboard.org/rss-specification</docs> <item> <title>麻婆豆腐</title>