www.mtkn.jp

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

rss.xml (419577B)


      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <rss version="2.0">
      3 <channel>
      4 <title>松露庵</title>
      5 <description>ウェブページの更新履歴</description>
      6 <language>ja-jp</language>
      7 <link>https://www.mtkn.jp</link>
      8 <lastBuildDate>Sat, 20 Dec 2025 11:47:06 +0900</lastBuildDate>
      9 <pubDate>Sat, 20 Dec 2025 11:47:06 +0900</pubDate>
     10 <docs>https://www.rssboard.org/rss-specification</docs>
     11 <item>
     12 <title>X11で深さが32bitのwindowを作成する</title>
     13 <link>https://www.mtkn.jp/computer/x11_32bit_window.html</link>
     14 <guid>https://www.mtkn.jp/computer/x11_32bit_window.html</guid>
     15 <pubDate>Sat, 20 Dec 2025 00:00:00 +0900</pubDate>
     16 <description><![CDATA[<h1>X11で深さが32bitのwindowを作成する</h1>
     17 <time>2025-12-20</time>
     18 
     19 <h2>結論</h2>
     20 <p>
     21 X11のrender拡張機能で半透明な画像を合成(composite)する際に深さが32bitのウィンドウを作成する必要がある。その際ドキュメントにも書いてなさそうな操作が必要だった。ウィンドウを作成する際に<code>border pixel</code>の値を設定する必要がある(言語はC):
     22 </p>
     23 
     24 <pre><code>// Xlibの場合
     25 XSetWindowAttributes attr32 = {
     26 	.border_pixel = 0, // 値はなんでもよさそう
     27 	.colormap = colormap32,
     28 }
     29 Window window32 = XCreateWindow(display, DefaultRootWindow(display),
     30 	0, 0, 1, 1, 0,
     31 	32, // depth
     32 	InputOutput,
     33 	visual32,
     34 	CWBorderPixel|CWColormap, // CWBorderPixelを指定
     35 	&amp;attr32);
     36 </code></pre>
     37 
     38 <pre><code>// xcbの場合
     39 uint32_t attr32[2] = { 0, colormap32 }; // 値はなんでもよさそう。
     40 xcb_create_window(conn, 32, window32, screen-&gt;root,
     41 	0, 0, 1, 1, 0,
     42 	XCB_WINDOW_CLASS_INPUT_OUTPUT,
     43 	visual32,
     44 	XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, // XCB_CW_BORDER_PIXELを指定
     45 	&amp;attr32);
     46 </code></pre>
     47 
     48 <h2>出典</h2>
     49 <p>
     50 Go言語の<a href="https://cs.opensource.google/go/x/exp/+/8475f288:shiny/driver/x11driver/screen.go;drc=7b9b53b0aca47495e3a71d360c959fe1f14b5756;l=622">golang.org/x/exp/shiny/driver/x11driver/screen.go:622</a>に、
     51 </p>
     52 <blockquote cite="https://cs.opensource.google/go/x/exp/+/8475f288:shiny/driver/x11driver/screen.go;drc=7b9b53b0aca47495e3a71d360c959fe1f14b5756;l=622"><pre><code>	// The CwBorderPixel attribute seems necessary for depth == 32. See
     53 	// http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32
     54 </code></pre>
     55 </blockquote>
     56 <p>
     57 と書いていた。引用元を見るとXサーバーのソースコードを参照しており、そのコードでは親のウィンドウの深さと異なる深さのウィンドウを作成する場合、<code>CWBorderPixmap</code>又は<code>CWBorderPixel</code>を指定しないと<code>BadMatch</code>というエラーが返ってくるようになっている。理由はよく分からない:
     58 </p>
     59 <blockquote cite="https://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c?h=xorg-server-21.1.21#n818">
     60 <pre><code>	if (((vmask &amp; (CWBorderPixmap | CWBorderPixel)) == 0) &amp;&amp;
     61 		(class != InputOnly) &amp;&amp; (depth != pParent-&gt;drawable.depth)) {
     62 		*error = BadMatch;
     63 		return NullWindow;
     64 	}
     65 </code></pre>
     66 </blockquote>
     67 
     68 <h2>深さ32bitのウィンドウの作成手順</h2>
     69 <h3>深さ32bitのヴィジュアルを取得</h3>
     70 <p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのヴィジュアルを取得する:
     71 </p>
     72 <pre><code>// xlibの場合
     73 int findVisual32(Display *display, XVisualInfo *return_visual_info);
     74 /* ... */
     75 int main(void) {
     76 	/* ... */
     77 	XVisualInfo vi32;
     78 	if (findVisual32(display, &amp;vi32) &lt; 0) {
     79 		fatal(&quot;32bit-deep visual info not found&quot;);
     80 	}
     81 	/* ... */
     82 }
     83 /* ... */
     84 int findVisual32(Display *display, XVisualInfo *return_visual_info) {
     85 	long mask = VisualDepthMask|VisualRedMaskMask|VisualGreenMaskMask|VisualBlueMaskMask;
     86 	XVisualInfo template = {
     87 		.depth      = 32,
     88 		.red_mask   = 0xff0000,
     89 		.green_mask = 0x00ff00,
     90 		.blue_mask  = 0x0000ff,
     91 	};
     92 	int n;
     93 	XVisualInfo *vinfos = XGetVisualInfo(display, mask, &amp;template, &amp;n);
     94 	if (n == 0) {
     95 		return -1;
     96 	}
     97 	*return_visual_info = vinfos[0];
     98 	XFree(vinfos);
     99 	return 0;
    100 }
    101 </pre></code>
    102 
    103 <pre><code>// xcbの場合
    104 int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype);
    105 /* ... */
    106 int main(void) {
    107 	/* ... */
    108 	xcb_visualtype_t visual32;
    109 	if (findVisual32(screen, &amp;visual32) &lt; 0) {
    110 		fatal(&quot;32bit visual not found&quot;);
    111 	}
    112 	/* ... */
    113 }
    114 /* ... */
    115 int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) {
    116 	xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen);
    117 	for (;depth_iter.rem &gt; 0; xcb_depth_next(&amp;depth_iter)) {
    118 		xcb_depth_t *d = depth_iter.data;
    119 		if (d-&gt;depth != 32) {
    120 			continue;
    121 		}
    122 		xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d);
    123 		while (visual_iter.rem &gt; 0) {
    124 			xcb_visualtype_t *v = visual_iter.data; 
    125 			if (v-&gt;red_mask == 0xff0000 &amp;&amp; v-&gt;green_mask == 0x00ff00 &amp;&amp; v-&gt;blue_mask == 0x0000ff) {
    126 				*return_visualtype = *v;
    127 				return 0;
    128 			}
    129 			xcb_visualtype_next(&amp;visual_iter);
    130 		}
    131 	}
    132 	return -1;
    133 }
    134 </code></pre>
    135 
    136 <h3>深さ32bitのカラーマップを作成</h3>
    137 <p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのカラーマップを作成する。
    138 </p>
    139 <pre><code>// xlibの場合
    140 	Colormap colormap32 = XCreateColormap(display, DefaultRootWindow(display), vi32.visual, AllocNone);
    141 </code></pre>
    142 <pre><code>// xcbの場合
    143 	xcb_colormap_t colormap32 = xcb_generate_id(conn);
    144 	xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen-&gt;root, visual32.visual_id);
    145 </code></pre>
    146 
    147 <h3>深さ32bitのウィンドウを作成</h3>
    148 <p>最後にウィンドウを作成する:</p>
    149 <pre><code>// xlibの場合
    150 	Window window32 = XCreateWindow(display, DefaultRootWindow(display),
    151 		0, 0, 1, 1, 0,
    152 		32,
    153 		InputOutput,
    154 		vi32.visual,
    155 		CWBorderPixel|CWColormap,
    156 		&attr32);
    157 </code></pre>
    158 <pre><code>// xcbの場合
    159 	uint32_t attr32[2] = { 0, colormap32 }; 
    160 	xcb_create_window(conn, 32, window32, screen->root,
    161 		0, 0, 1, 1, 0,
    162 		XCB_WINDOW_CLASS_INPUT_OUTPUT,
    163 		visual32.visual_id,
    164 		XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32);
    165 </code></pre>
    166 
    167 <h2>サンプルコード</h2>
    168 32bitのウィンドウを作成し、そこからrender拡張機能を使って半透明な四角形を描画するプログラムを作った。OpenBSDで動作確認した。他のUnixでも多分動くと思う:<br>
    169 <a href="https://git.mtkn.jp/win32">git.mtkn.jp/win32</a>
    170 
    171 <h2>参考文献</h2>
    172 <ol>
    173 <li><a href="https://azelpg.gitlab.io/azsky2/note/prog/x11/03_visual.html">X11: ビジュアル</a></li>
    174 </ol>
    175 ]]></description>
    176 </item>
    177 <item>
    178 <title>9P</title>
    179 <link>https://www.mtkn.jp/computer/9p.html</link>
    180 <guid>https://www.mtkn.jp/computer/9p.html</guid>
    181 <pubDate>Fri, 19 Dec 2025 00:00:00 +0900</pubDate>
    182 <description><![CDATA[<h1>9P</h1>
    183 <time>2024-12-19</time>
    184 <h2>はじめに</h2>
    185 <p>
    186 9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。このプロトコルを使えば、ディスクに記録されたデータだけでなく、マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等もファイルとして扱える。Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOSのために設計された。
    187 </p>
    188 
    189 <p>
    190 Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計されているので、この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。</p>
    191 
    192 <h2>プロトコルの概要</h2>
    193 <p>
    194 9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに対してリプライを返すことを繰り返す。クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと言う。Tメッセージにはファイルにアクセスするための色々なものが用意されている。例えばファイルを開くためのTopenや、開いたファイルに書き込むためのTwrite等である。それぞれのTメッセージには対応するRメッセージがある。Topenに対してRopen、Twriteに対してRwrite等である。</p>
    195 <p>
    196 通信は必要な情報をプロトコルの定める方法でバイト列に変換して行う。2バイト以上のデータはリトルエンディアンになるように配置する。テキストデータはUTF-8にエンコードする。テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。</p>
    197 <p>
    198 各メッセージは4バイトの整数から始まる。これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。次にメッセージの種類を記述する1バイトのデータが来る。次はメッセージのタグである。クライアントはサーバーからの返事を待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージに対する返事なのかを識別する必要がある。そのために使うのがタグである。クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに同じタグを付ける。その後ろには、メッセージの種類によって固有の情報が付けられる。</p>
    199 <p>
    200 以下は実際の9P通信のログである。実際はバイナリの通信だが、ログとして見易いように変換してある。また、先頭にくるメッセージサイズは省略してある。この例では、サーバーのルートディレクトリにある<code>hello</code>というファイルの内容を読みこんでいる:</p>
    201 <pre><code>&lt;-- Tversion Tag 65535 msize 8192 version '9P2000'
    202 --&gt; Rversion Tag 65535 msize 8192 version '9P2000'
    203 &lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname
    204 --&gt; Rattach Tag 0 qid (0000000000000000 0 d)
    205 &lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello
    206 --&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 )
    207 &lt;-- Tstat Tag 0 fid 1
    208 --&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0
    209 &lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0
    210 --&gt; Rwalk Tag 0 nwqid 0
    211 &lt;-- Topen Tag 0 fid 2 mode 0x0
    212 --&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169
    213 &lt;-- Tread Tag 0 fid 2 offset 0 count 4096
    214 --&gt; Rread Tag 0 count 7 ' 776f726c 64210a'
    215 &lt;-- Tread Tag 0 fid 2 offset 7 count 4096
    216 --&gt; Rread Tag 0 count 0 ''
    217 &lt;-- Tclunk Tag 0 fid 2
    218 --&gt; Rclunk Tag 0
    219 </code></pre>
    220 <p>
    221 まず最初にクライアントがサーバーに対してTversionを送り、プロトコルのバージョンと、メッセージの最大サイズを交渉する。Tversionのタグは<code>65535</code>と決められている。<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、<code>version</code>の9P2000がプロトコルのバージョンである。サーバーからRversionで同じ<code>msize</code>と<code>version</code>が返ってきたのでこのサイズとバージョンで以降の通信を行う。</p>
    222 <p>
    223 次のTattachで、クライアントがサーバーにルートディレクトリの<code>fid</code>を要求する。<code>afid</code>以降は認証用の情報である(後述)。<code>fid</code>はコネクションにおいてファイルと紐付けられる整数で、Unixにおけるファイルディスクリプタのようなものである。ファイルの読み書きはこの<code>fid</code>を使って行われる。サーバーからのRattachにはルートディレクトリの<code>qid</code>が含まれる。これはサーバー上でファイルを一意に識別するもので、Unixにおけるinodeに相当するものである。以上でサーバーに繋いでセッションを確立できた。</p>
    224 <p>
    225 次にTwalkで目的のファイル(<code>hello</code>)までファイルツリーを辿る。ここでは起点として先程得られたルートディレクトリ(<code>fid = 1</code>)を起点として、このディレクトリ内の<code>hello</code>ファイルを要求して<code>fid = 2</code>を割り当てようとしている。サーバーはルートディレクトリ内に要求されたファイルが見付かったので、そのファイルの<code>qid</code>を返す。</p>
    226 <p>
    227 目的のファイルに<code>fid</code>が割り当てられたので、Tstatでこのファイルの属性を要求している。おそらくファイルのパーミッションを調べるためである。</p>
    228 <p>
    229 次にTopenを使ってこのファイルを開き、Treadを使って内容を読む。二回目のTreadに対して0バイトのデータが返ってきたので、ファイルはこれで終りである。</p>
    230 <p>
    231 最後に、必要なくなった<code>fid</code>はTclunkで捨てる。</p>
    232 
    233 <h2>List of all Message Types</h2>
    234 
    235 <table>
    236 <tr>
    237 <th>Tメッセージ</th>
    238 <th>Rメッセージ</th>
    239 <th>説明</th>
    240 </tr>
    241 <tr>
    242 <td>Tversion</td>
    243 <td>Rversion</td>
    244 <td>バージョンの交渉</td>
    245 </tr>
    246 <tr>
    247 <td>Tauth</td>
    248 <td>Rauth</td>
    249 <td>認証ファイルの取得</td>
    250 </tr>
    251 <tr>
    252 <td></td>
    253 <td>Rerror</td>
    254 <td>エラー(Rメッセージのみ)</td>
    255 </tr>
    256 <tr>
    257 <td>Tflush</td>
    258 <td>Rflush</td>
    259 <td>処理中のリクエストをキャンセル</td>
    260 </tr>
    261 <tr>
    262 <td>Tattach</td>
    263 <td>Rattach</td>
    264 <td>ルートディレクトリの取得</td>
    265 </tr>
    266 <tr>
    267 <td>Twalk</td>
    268 <td>Rwalk</td>
    269 <td>ファイルツリーを辿る</td>
    270 </tr>
    271 <tr>
    272 <td>Topen</td>
    273 <td>Ropen</td>
    274 <td>ファイルを開く</td>
    275 </tr>
    276 <tr>
    277 <td>Tcreate</td>
    278 <td>Rcreate</td>
    279 <td>ファイルの作成</td>
    280 </tr>
    281 <tr>
    282 <td>Tread</td>
    283 <td>Rread</td>
    284 <td>ファイルを読む</td>
    285 </tr>
    286 <tr>
    287 <td>Twrite</td>
    288 <td>Rwrite</td>
    289 <td>ファイルへ書き込む</td>
    290 </tr>
    291 <tr>
    292 <td>Tclunk</td>
    293 <td>Rclunk</td>
    294 <td>fidの削除</td>
    295 </tr>
    296 <tr>
    297 <td>Tremove</td>
    298 <td>Rremove</td>
    299 <td>ファイルを削除</td>
    300 </tr>
    301 <tr>
    302 <td>Tstat</td>
    303 <td>Rstat</td>
    304 <td>ファイルの属性を取得</td>
    305 </tr>
    306 <tr>
    307 <td>Twstat</td>
    308 <td>Rwstat</td>
    309 <td>ファイルの属性を変更</td>
    310 </tr>
    311 </table>
    312 
    313 <h2><code>fid</code>と<code>qid</code></h2>
    314 <p>
    315 <code>fid</code>はコネクションにおいてファイルを指定するために使われる整数で、Unixのファイルディスクリプタのようなものである。使用する整数はクライアントが指定できる。サーバーに接続する際にTattachにより、サーバーのルートディレクトリの<code>fid</code>が設定され、Twalkにより追加され、Tclunkにより削除される。</p>
    316 <p>
    317 <code>qid</code>はサーバーがファイルを一意に識別するためのもので、Unixのinodeに相当するものである。ただしinodeはファイルが削除されると再利用される可能性があるのに対し、<code>qid</code>は再利用できない。<code>qid</code>はこのファイルがディレクトリかどうか等を示す<code>type</code>、ファイルが変更されたときにインクリメントされる<code>vers</code>、そしてファイルを一意に表す<code>path</code>の3つの情報で構成される。</p>
    318 <h2>認証</h2>
    319 <p>
    320 9Pにはクライアントの認証が組込まれていない。もともとはあったようだが、認証のアルゴリズムに欠陥が見付かったりすればいちいちコードを修正してコンパイルしなおさなければいけないうえ、9Pプロトコル自体も変更しないといけないので、外部に切りだすことになった。認証に必要なやりとりは認証サーバーとクライアントが行い、9Pサーバーは認証が成功したかどうかの情報を認証サーバーに確認することでクライアントの確認を行う。
    321 </p>
    322 <p>
    323 9PサーバーはTattachメッセージを受けとると、認証サーバーとのコネクションを確立する。その後Rattachメッセージで<code>afid</code>という特殊な<code>fid</code>をクライアントに返す。クライアントからこの<code>afid</code>に対して読み書きする命令が届くと、9Pサーバーはこの読み書きを認証サーバーとのコネクションに横流しする。つまりクライアントはこの<code>afid</code>を通じて認証サーバーと直接やりとりができる。クライアントはユーザー名やパスワード等(パスワード認証の場合)の情報を<code>afid</code>に書き込んで認証する。このように認証をプロトコル自体から切り離すことで、認証に関するバグが見付かったとしても、認証サーバーを修正するだけでいい。また、より強力な認証システムを組み込むのも楽である。
    324 </p>
    325 
    326 <h2>コネクションの共有</h2>
    327 <p>
    328 クライアントはサーバーと<code>version</code>メッセージを交すことでコネクションを確立する。コネクションの確立からの一連のやりとりをセッションという。ひとつのコネクションは複数のクライアントが共有できる。</p>
    329 <p>
    330 クライアントはTauthまたはTattachメッセージによりサーバーに<code>fid</code>を要求できる。このうちTauthにより得られた<code>fid</code>は認証以外には使えない。Tattachで得られた<code>fid</code>は、Twalkメッセージによりファイルツリーを辿るための起点として利用でき、このとき辿った先のファイルを示す<code>fid</code>が生成される。これ以外の方法で<code>fid</code>が増えることはない。つまり、サーバーはひとつのコネクションのなかで、ルートディレクトリから派生した<code>fid</code>を追跡することで、クライアントを区別できる。</p>
    331 
    332 <h2>メッセージ詳細</h2>
    333 <p>
    334 それぞれ最初にメッセージの形式を書く。<code><i>field</i>[<i>n</i>]</code>は<code><i>field</i></code>という名前の<i>n</i>バイトのデータを表す(<i>n</i>は整数)。また、括弧の中が整数ではなく<code>s</code>になっている場合、そのフィールドは文字列のデータで、その前に文字列の長さを示す2バイトの整数が先行する。また、メッセージ名のフィールド(<code>Tversion</code>等)にはメッセージの種類を表す1バイトのenumが来る。
    335 </p>
    336 <h3>version</h3>
    337 <p>
    338 プロトコルのバージョンを交渉すし、コネクションを確立する。
    339 </p>
    340 <pre><code>size[4] Tversion tag[2] msize[4] version[s]
    341 size[4] Rversion tag[2] msize[4] version[s]
    342 </code></pre>
    343 <p>
    344 クライアントは最初にサーバーにこのメッセージを送ってバージョンとメッセージの最大サイズ(<code>msize</code>)を交渉する。サーバーはクライアントから送られたバージョンとメッセージサイズに対応していれば、同じバージョンとサイズを送り返し、交渉成立である。</p>
    345 <p>
    346 サーバーとクライアントはこのメッセージを以ってコネクションを確立する。</p>
    347 
    348 <h3>attach、auth</h3>
    349 <p>
    350 コネクションを確立する。
    351 </p>
    352 <pre><code>size[4] Tauth tag[2] afid[4] uname[s] aname[s]
    353 size[4] Rauth tag[2] aqid[13]
    354 
    355 size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s]
    356 size[4] Rattach tag[2] qid[13]
    357 </code></pre>
    358 <p>
    359 <code>attach</code>メッセージはサーバーのルートディレクトリを要求し、<code>fid</code>を割り当てる。認証が必要なサーバーであれば、先に<code>auth</code>メッセージで認証を済ませておき、<code>attach</code>メッセージの<code>afid</code>に、先程使用した<code>afid</code>をセットする。サーバーはこの<code>afid</code>に紐付いている認証サーバーにクライアントが認証済みであるかを確認し、認証済みであればルートディレクトリの<code>qid</code>を返す。サーバーが複数のファイルツリーを公開している場合、<code>aname</code>で指定する。</p>
    360 <p>
    361 <code>auth</code>メッセージは認証サーバーとやりとりするための<code>fid</code>である<code>afid</code>を要求する。この<code>afid</code>を読み書きすることで認証サーバーとやりとりをし、自身の身分を証明する。認証が済んだらこの<code>afid</code>をセットした<code>attach</code>メッセージを送る。</p>
    362 
    363 <h3>error</h3>
    364 <p>
    365 エラーを返す。
    366 </p>
    367 <pre><code>size[4] Rerror tag[2] ename[s]
    368 </code></pre>
    369 <p>
    370 クライアントからの要求に対して、なにかエラーがおきたときにそのエラーを返すために使われる。<code>Terror</code>はない。</p>
    371 
    372 <h3>flush</h3>
    373 <p>
    374 リクエストをキャンセルする。
    375 </p>
    376 <pre><code>size[4] Tflush tag[2] oldtag[2]
    377 size[4] Rflush tag[2]
    378 </code></pre>
    379 <p>
    380 実行中の要求をキャンセルする。キャンセルしたいリクエストの<code>tag</code>を<code>oldtag</code>にセットする。
    381 </p>
    382 
    383 <h3>walk</h3>
    384 <p>
    385 ファイルツリーを移動する。
    386 </p>
    387 <pre><code>size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s])
    388 size[4] Rwalk tag[2] nwqid[2] nwqid*(qid[13])
    389 </code></pre>
    390 <p>
    391 <code>fid</code>を起点に移動する。移動先のファイルを<code>newfid</code>にセットする。移動するディレクトリの数を<code>nwname</code>に、移動するディレクトリの名前を移動する順に<code>wname</code>にそれぞれセットする。例えばカレントディレクトリから<code>./dir1/dir2/</code>に移動する場合、<code>nwname</code>は<code>2</code>、<code>wname</code>は<code>{"dir1", "dir2"}</code>となる。<code>wname</code>の最後の要素はディレクトリでなくファイルでもいい。</p>
    392 <p>
    393 <code>wname</code>の最初の要素への移動が失敗した場合は<code>Rerror</code>が返される。それ以外の場合は<code>Rwalk</code>が返され、<code>qid</code>は移動が成功した順番にそのファイルの<code>qid</code>がセットされる。<code>nwname</code>と<code>nwqid</code>が一致した場合は最後まで移動できたことになる。</p>
    394 <p>
    395 <code>walk</code>は<code>fid</code>を増殖させる唯一の方法である。</p>
    396 
    397 <h3>open、create</h3>
    398 <p>
    399 <code>fid</code>を開いて(作成して)読み書きできる状態にする。
    400 </p>
    401 <pre><code>size[4] Topen tag[2] fid[4] mode[1]
    402 size[4] Ropen tag[2] qid[13] iounit[4]
    403 
    404 size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1]
    405 size[4] Rcreate tag[2] qid[13] iounit[4]
    406 </code></pre>
    407 <p>
    408 <code>open</code>は<code>fid</code>と紐付いたファイルを開く。<code>mode</code>は読み込み専用の<code>OREAD</code>、書き込み専用の<code>OWRITE</code>、読み書きの<code>ORDWR</code>等である。ファイルを開く手順は以下の通り:
    409 <ol>
    410 <li><code>attach</code>でルートディレクトリの<code>fid</code>を取得</li>
    411 <li>ルートディレクトリの<code>fid</code>から<code>walk</code>で開きたいファイルの<code>fid</code>を取得</li>
    412 <li>その<code>fid</code>を<code>open</code>で開く</li>
    413 </ol>
    414 </p>
    415 <p>
    416 <code>create</code>は<code>fid</code>と紐付いたディレクトリに新しいファイルを作成する。<code>creat</code>ではなく<code>create</code>である。作成が成功したら<code>fid</code>は新しく作成されたファイルに紐付く。</p>
    417 
    418 <h3>read、write</h3>
    419 <p>
    420 ファイルを読み書きする。
    421 </p>
    422 <pre><code>size[4] Tread tag[2] fid[4] offset[8] count[4]
    423 size[4] Rread tag[2] count[4] data[count]
    424 
    425 size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count]
    426 size[4] Rwrite tag[2] count[4]
    427 </code></pre>
    428 <p>
    429 <code>read</code>は<code>fid</code>の<code>offset</code>バイト目から<code>count</code>バイト読む。読んだデータと、読めたデータサイズが<code>data</code>、<code>count</code>ととして返される。<code>write</code>は<code>fid</code>の<code>offset</code>バイト目に<code>count</code>バイトのデータ<code>data</code>を書く。書きこめたサイズが<code>count</code>として返される。ファイルを読み書きするためにはあらかじめ<code>fid</code>を<code>open</code>する必要がある。</p>
    430 
    431 <h3>clunk</h3>
    432 <p>
    433 <code>fid</code>を忘れる。
    434 </p>
    435 <pre><code>size[4] Tclunk tag[2] fid[4]
    436 size[4] Rclunk tag[2]
    437 </code></pre>
    438 <p>
    439 いらなくなった<code>fid</code>を忘れる。一度忘れた<code>fid</code>は<code>walk</code>で別のファイルを取得する際に再利用できる。</p>
    440 
    441 <h3>remove</h3>
    442 <p>
    443 ファイルを削除する。
    444 </p>
    445 <pre><code>size[4] Tremove tag[2] fid[4]
    446 size[4] Rremove tag[2]
    447 </code></pre>
    448 <p>
    449 <code>fid</code>と紐付いたサーバー上のファイルを削除する。<code>fid</code>は<code>clunk</code>したのと同様に忘れられる。</p>
    450 
    451 <h3>stat、wstat</h3>
    452 <p>
    453 ファイルの属性を読み書きする。
    454 </p>
    455 <pre><code>size[4] Tstat tag[2] fid[4]
    456 size[4] Rstat tag[2] stat[n]
    457 
    458 size[4] Twstat tag[2] fid[4] stat[n]
    459 size[4] Rwstat tag[2]
    460 </code></pre>
    461 <p>
    462 <code>stat</code>はファイルの属性を読む。読めた情報は<code>stat</code>として返される。<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、作成日、更新日等の情報がバイト列になったものである。</p>
    463 
    464 ]]></description>
    465 </item>
    466 <item>
    467 <title>きのかわ弦楽合奏団 第5回コミュニティコンサート</title>
    468 <link>https://www.mtkn.jp/journal/posts/20241211.html</link>
    469 <guid>https://www.mtkn.jp/journal/posts/20241211.html</guid>
    470 <pubDate>Thu, 11 Dec 2025 00:00:00 +0900</pubDate>
    471 <description><![CDATA[<h1>きのかわ弦楽合奏団 第5回コミュニティコンサート</h1>
    472 <time>2024-12-11</time>
    473 <p>来年の一月にコンサートあります。</p>
    474 <figure>
    475 <img src="20241211.jpg" alt="きのかわ弦楽合奏団の第5回コミュニティコンサートのちらし。令和7年1月12日14:00から、和歌山北コミュニティセンターにて">
    476 <figcaption>Copyright: きのかわ弦楽合奏団</figucaption>
    477 </figure>
    478 
    479 ]]></description>
    480 </item>
    481 <item>
    482 <title>椅子作った</title>
    483 <link>https://www.mtkn.jp/journal/posts/20241202.html</link>
    484 <guid>https://www.mtkn.jp/journal/posts/20241202.html</guid>
    485 <pubDate>Tue,  2 Dec 2025 00:00:00 +0900</pubDate>
    486 <description><![CDATA[<h1>椅子作った</h1>
    487 <time>2024-12-02</time>
    488 
    489 <p>
    490 チェロを弾くのに使っていた椅子ががたがたになってきたので、新しい椅子を作った。座面の張り方はYouTubeの動画[1]を参考にした。</p>
    491 <p>
    492 まず木枠を作る。足にホゾ穴を彫って梁を差し込む形にした。「そぎ先枘接ぎ」という名前らしい[2]。</p>
    493 <img src="20241202-1.jpg" alt="木枠の画像">
    494 
    495 <p>
    496 足は猫足にした。ボンドで接着してバネを受ける板を付ける。本当は膠にしたかったけどめんどくさくなった。</p>
    497 <img src="20241202-2.jpg" alt="ボンドで固定した木枠の画像">
    498 
    499 <p>
    500 バネを又釘で固定。
    501 </p>
    502 <img src="20241202-3.jpg" alt="バネを木枠に釘で固定した画像">
    503 <img src="20241202-4.jpg" alt="固定した部分を拡大した画像">
    504 
    505 <p>
    506 ずれないように麻紐でくくり麻布を被せる。さらに麻布にバネを縫い付ける。</p>
    507 <img src="20241202-5.jpg" alt="バネを麻紐でくくった画像">
    508 <img src="20241202-6.jpg" alt="バネを麻布で覆った画像">
    509 <img src="20241202-7.jpg" alt="麻布を固定した部分の拡大画像">
    510 <img src="20241202-8.jpg" alt="バネを麻布に縫い付けた画像">
    511 
    512 <p>
    513 藁で土手を作る。この藁はチェロの先生に貰ったものである。晒で覆ったうえ、糸で縫って固める。
    514 </p>
    515 <img src="20241202-9.jpg" alt="藁の土手の画像">
    516 <img src="20241202-10.jpg" alt="藁の土手を糸で縫った画像">
    517 <img src="20241202-11.jpg" alt="縫った部分の拡大画像">
    518 
    519 <p>
    520 棕櫚を盛って布で覆い、綿を被せてモケットで仕上げる。本来は棕櫚ではなく芝であるが手に入らなかった。棕櫚の産地に住んでいるのでこちらなら山にいくらでも生えている。モケットは高野口町で買った。この町は鉄道のシートも作っているらしい。283系や287系、あるいはN700系等のものが欲しかったがJRに怒られるからと断わられた。そらそうや。</p>
    521 <img src="20241202-12.jpg" alt="棕櫚を盛って布で覆った画像">
    522 <img src="20241202-13.jpg" alt="布の上から綿を被せた画像">
    523 
    524 <p>
    525 完成。
    526 </p>
    527 <img src="20241202-14.jpg" alt="モケットを被せて完成した椅子の画像">
    528 
    529 <p>
    530 椅子が良くなっても練習しないと腕は上がらない。
    531 </p>
    532 
    533 <h2>参考</h2>
    534 <ol>
    535 <li><a href="https://www.youtube.com/watch?v=15SjxP-wcek">TOKYO 匠の技(椅子張り 熟練技能編)</a></li>
    536 <li>鳥海義之助 「図解 木工の継手と仕口 増補版」 p.37</li>
    537 </ol>
    538 ]]></description>
    539 </item>
    540 <item>
    541 <title>ひざしぶりに合気道した</title>
    542 <link>https://www.mtkn.jp/journal/posts/20251122.html</link>
    543 <guid>https://www.mtkn.jp/journal/posts/20251122.html</guid>
    544 <pubDate>Sun, 30 Nov 2025 00:00:00 +0900</pubDate>
    545 <description><![CDATA[<h1>ひざしぶりに合気道した</h1>
    546 <time>2025-11-22</time>
    547 
    548 <p>
    549 大学の合気道部のひとつ下の後輩に誘われて学園祭の演武会に参加してきた。</p>
    550 <figure>
    551 	<video controls style="max-width: 100%;">
    552 		<source src="20251122.mp4" type="video/mp4">
    553 	</video>
    554 	<figcaption>京都大学合気道部 NF演武会にて(右が僕)</figcaption>
    555 </figure>
    556 
    557 <p>
    558 もうちょっとやりたくなったので高校生のときお世話になっていた地元の道場に電話して稽古させてもらうことにした。続くかな。
    559 </p>
    560 ]]></description>
    561 </item>
    562 <item>
    563 <title>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</title>
    564 <link>https://www.mtkn.jp/computer/mailserver.html</link>
    565 <guid>https://www.mtkn.jp/computer/mailserver.html</guid>
    566 <pubDate>Mon,  3 Nov 2025 00:00:00 +0900</pubDate>
    567 <description><![CDATA[<h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1>
    568 <time>2024-01-19</time><br>
    569 <time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br>
    570 
    571 <h2>はじめに</h2>
    572 <p>
    573 少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。当時はドキュメントを追うのに必死で構築手順を整理できていなかった。しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。そこであらためてサーバーを構築し、その手順を確認することにした。あいかわらずDNSの知識は自信がない。セキュリティは自己責任で。</p>
    574 
    575 <h2>使うもの</h2>
    576 <ul>
    577 <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li>
    578 <li>OS: OpenBSD 7.4</li>
    579 <li>ドメイン: ムームードメイン (mtkn.jpとする)</li>
    580 <li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li>
    581 <li>IMAPサーバー(MDA): Dovecot 2.3.20</li>
    582 </ul>
    583 
    584 <h2>メールの仕組み</h2>
    585 <p>
    586 メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのがSMTPサーバーと呼ばれるソフトウェアである。このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも呼ばれる。今回はMTAとしてOpenSMTPDというのを使う。手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、そこから受信側のMTAに転送される。受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所に保存する。</p>
    587 <p>
    588 受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、自分宛てのメールを確認する。この時に使われるのがIMAPというプロトコルである(POPというのもあるが今回は割愛)。IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。今回MDAとしてDovecotを使用する。</p>
    589 <p>
    590 以上をまとめると以下のようになる:
    591 </p>
    592 <pre>
    593 +------------+        +----------------+
    594 |MTA(mtkn.jp)|--SMTP-&gt;|      MTA       |
    595 +------------+        +--example.com---+
    596       ^               |      MDA       |
    597       |               +----------------+
    598       |                       |
    599      SMTP                    IMAP
    600       |                       |
    601       |                       v
    602 +------------+        +----------------+
    603 |user@mtkn.jp|        |user@example.com|
    604 +------------+        +----------------+
    605 
    606 </pre>
    607 <ol>
    608 <li>メールを書く。</li>
    609 <li>送信側のMTAに送る。</li>
    610 <li>受信側のMTAに転送する。</li>
    611 <li>受信者が受信側のMDAに新着メールの有無を確認する。</li>
    612 </ol>
    613 
    614 <p>
    615 SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、いくつかの方法で送信元の本人確認を行う。その際第三者としてDNS及び、サーバーのIPアドレスを管理している人(今回の場合はさくらインターネット)が登場する。DNSにはドメインをIPアドレスにひもづける情報が登録できる。またIPアドレスの管理人には、自分が借りているIPアドレスを自分のドメインにひもづける情報を登録してもらう。これらによって、メールの送信者がドメイン、IPアドレス双方から確認できるので、なりすましを防止できる仕組みである。</p>
    616 
    617 <p>
    618 最近はgmail等の大手がスパム対策を強化する一環として、以下に述べるような本人確認をすべて通らなければ受信しないようにしているらしい。</p>
    619 
    620 <h2>MTAどうしのやりとり</h2>
    621 <p>
    622 以下、MTAどうしの通信内容をざっくり説明する。
    623 </p>
    624 
    625 <h3>Aレコード、MXレコードによる送信先の特定</h3>
    626 <p>
    627 MTAがメールを送信する際、まずは宛先のサーバーを特定する必要がある。この際に使用するのがDNSに登録されているMXレコードである。送信元のMTAはまずDNSに宛先のドメインのMXレコードを問い合わせる。するとメールの送信先のドメイン名が分かるので、続いてこの送信先のIPアドレスを問い合わせる:</p>
    628 <pre>
    629 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 DNS
    630 
    631     example.com宛のメールって
    632     誰に送ったらええん?
    633     ----------------------------------------&gt;
    634 
    635                  mai.example.comやで(MXレコード)
    636     &lt;----------------------------------------
    637 
    638     mail.example.comってどこや?
    639     ----------------------------------------&gt;
    640 
    641                <i>ddd.ddd.ddd.ddd</i>やで(Aレコード)
    642     &lt;----------------------------------------
    643 </pre>
    644 <p>
    645 次にこの宛先のMTAとの通信を開始する。しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:</p>
    646 <pre>
    647 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    648     こんちは。mtkn.jpです。
    649     ----------------------------------------&gt;
    650 
    651                   なりすましちゃうか確認したろ
    652 </pre>
    653 
    654 <h3>SPFレコードによる送信元の本人確認</h3>
    655 <p>
    656 受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。このときに使うのがSPFレコードである。このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいいIPアドレスを指定する。受信側のMTAは送信元のIPアドレスと、このレコードに記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者に認められているMTAかどうか判断できる。</p>
    657 <pre>
    658 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    659                  mtkn.jpを名乗るやつから連絡
    660                  来てるんやけどこいつ本物?
    661     &lt;----------------------------------------
    662 
    663     IPアドレスが<i>sss.sss.sss.sss</i>
    664     やったら多分本物やわ。(SPFレコード)
    665     ----------------------------------------&gt;
    666 
    667                                      よっしゃ
    668 </pre>
    669 
    670 <h3>PTRレコード</h3>
    671 <p>
    672 次は逆にIPアドレスからドメインを辿って本人確認する。これに使われるのがPTRレコードである。このレコードはIPアドレスの管理人(ここではさくらインターネット)でないと登録できない。しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを提供しており、PTRレコードをきちんと設定した上でスパムメールを送ると、自分の身元がバレるので、スパムの抑止に繋がる。</p>
    673 <pre>
    674 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    675 	    <i>sss.sss.sss.sss</i>ってIPアドレスで
    676             mtkn.jpってドメイン登録されてる?
    677     &lt;----------------------------------------
    678 
    679     されてるで。(PTRレコード)
    680     ----------------------------------------&gt;
    681 
    682                                      よっしゃ
    683 </pre>
    684 
    685 <h3>DKIM</h3>
    686 <p>
    687 送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。署名は公開鍵方式で行うが、この鍵をドメインキーというようである。この署名が付いたメールをDKIM(DomainKey Identified Mail)という。送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、メール送信時に秘密鍵で署名する:</p>
    688 <pre>
    689 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    690 
    691                         本人確認できたわ
    692                         おまたせ。
    693     &lt;----------------------------------------
    694 
    695     userさんにメール送るで。
    696     署名も付けるで。
    697     ----------------------------------------&gt;
    698 </pre>
    699 <p>
    700 受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:</p>
    701 <pre>
    702 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    703                  mtkn.jpが署名付きでメール
    704                  くれたんやけどこの署名本物?
    705     &lt;----------------------------------------
    706 
    707     これで確認してみて(DKIM公開鍵)
    708     ----------------------------------------&gt;
    709 
    710                                      よっしゃ
    711 </pre>
    712 
    713 <h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3>
    714 <p>
    715 この他DNSにはDMARCレコードというものを登録することができる。これは、以上の本人確認により送信側がにせものであることが確認できた際、受信側にどのような行動を取ってほしいかを記述するものである。これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、受信したサーバーから自分宛てに通報するように頼める(この頼みが聞き入れられるかどうかは多分受信側MTAによる)。
    716 </p>
    717 <pre>
    718 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    719                mtkn.jpを名乗る詐欺師から
    720                メールきたんやけどどないしょ?
    721     &lt;----------------------------------------
    722 
    723     ここ(postmaster@mtkn.jp)に通報や。
    724     (DMARCレコード)
    725     ----------------------------------------&gt;
    726 
    727                                      よっしゃ
    728 </pre>
    729 
    730 <h2>サーバーの設定</h2>
    731 <h3>VPSの契約、ドメインの取得</h3>
    732 <p>
    733 VPSとドメインを契約する。今回はVPSをさくらインターネットで、ドメインをムームードメインでそれぞれ契約した。さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい(他のVPSを知らないので比較はできないが)。ムームードメインは安い。管理画面も悪くはない。以前お名前.comでも借りたことがあるが、こちらは広告のメールがやたら届いてうっとうしかった記憶がある。</p>
    734 
    735 <h3>OpenBSDのインストール</h3>
    736 <p>
    737 さくらのVPSにOpenBSDをインストールする。さくらインターネットが用意したISOがあるので、OS再インストールの画面からそれを選べばすぐにインストールきる。でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。</p>
    738 <p>
    739 インストールのこまかい手順は割愛するが、ひとつだけひっかかった点があるので書いておく。インストール先のディスクをセットアップし、OSに必要なファイルをインストールメディアからディスクにコピーすると以下のエラーがでてカーネルパニックになった:
    740 </p>
    741 <pre><code>wdc_atapi_start: not ready, st = 50
    742 fatal protection fault in supervisor mode
    743 trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410
    744 gsbase 0xffffffff81908ff0 kgsbase 0x0
    745 panic: trap type 4, code=0, pc=ffffffff810081a9
    746 syncing disks...18 18 18 18 18 18 18 18
    747 </code></pre>
    748 <p>
    749 原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗しているようで、インストールに必要なファイルをウェブ上からダウンロードする方法を選択すると問題なくインストールできた。
    750 </p>
    751 
    752 <h3>ファイアーフォールの設定</h3>
    753 <p>
    754 メールの送受信等に必要なポートを開ける:</p>
    755 <ul>
    756 <li>TCP 22: ssh接続用</li>
    757 <li>UDP 53: DNSとの通信用</li>
    758 <li>TCP 25: SMTPの通信用</li>
    759 <li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li>
    760 <li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li>
    761 <li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li>
    762 </ul>
    763 <p>
    764 以上の設定を<code>/etc/pf.conf</code>に設定する:
    765 </p>
    766 <pre><code>set skip on lo
    767 
    768 block return    # block stateless traffic
    769 pass in log proto tcp from any to any port 22 #ssh
    770 
    771 pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS
    772 pass out proto udp from any to any port 123 #ntp
    773 
    774 pass proto icmp #ping
    775 pass proto tcp from any to any port { 80, 443 } #www
    776 pass proto tcp from any to any port { 25, 587, 993 } #mail
    777 </code></pre>
    778 <p>
    779 <code>pf(4)</code>の設定を反映:
    780 </p>
    781 <pre><code># pfctl -f /etc/pf.conf
    782 </code></pre>
    783 
    784 <h3>DNSの設定</h3>
    785 <h4>A, MX, SPF, DMARC</h4>
    786 <p>
    787 DNSのレコードを設定する。ムームーDNSの場合、コントロールパネルにログインし、サイドバーからドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタンをクリックすると設定画面がでるので、以下のように設定する:</p>
    788 <table>
    789 <thead>
    790 <tr>
    791 <th>サブドメイン</th>
    792 <th>種別</th>
    793 <th>内容</th>
    794 <th>優先度</th>
    795 </tr>
    796 </thead>
    797 <tbody>
    798 <tr>
    799 <td></td>
    800 <td>A</td>
    801 <td><i>sss.sss.sss.sss</i></td>
    802 <td></td>
    803 </tr>
    804 <tr>
    805 <td>mail</td>
    806 <td>A</td>
    807 <td><i>sss.sss.sss.sss</i></td>
    808 <td></td>
    809 </tr>
    810 <tr>
    811 <td></td>
    812 <td>MX</td>
    813 <td>mail.mtkn.jp</td>
    814 <td>10</td>
    815 </tr>
    816 <tr>
    817 <td></td>
    818 <td>TXT</td>
    819 <td>v=spf1 mx -all</td>
    820 <td></td>
    821 </tr>
    822 <tr>
    823 <td>_dmarc</td>
    824 <td>TXT</td>
    825 <td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td>
    826 <td></td>
    827 </tr>
    828 </tbody>
    829 </table>
    830 
    831 <p>
    832 ひとつめのAレコードは、ドメイン名(mtkn.jp)にIPアドレス(<i>sss.sss.sss.sss</i>)を紐付けるものである。ふたつめはmail.mtkn.jpのIPアドレスを登録するものである。みっつめのMXレコードは、このドメイン宛てのメール(user@mtkn.jp等)をどこのサーバーに送信するかを決めるものである。上記の設定では、mail.mtkn.jpに送信するようにしている。以上の設定で、user@mtkn.jp宛てのメールは、mail.mtkn.jpというサーバーに送信すればよいことが分かり、さらにこのサーバーのIPアドレスは<i>sss.sss.sss.sss</i>であることも分かる。
    833 </p>
    834 <p>
    835 次のTXTレコードはSPFレコードである。v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録されたIPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信を禁止している。
    836 </p>
    837 <p>
    838 最後のものはDMARCレコードである。v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメールについて、その受信者が受信を拒否するように指定している。rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメールを受信した場合の通報先を指定している。</p>
    839 
    840 <h4>PTR</h4>
    841 <p>PTRレコードを設定する。さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名(mtkn.jp)を入力する。
    842 </p>
    843 
    844 <h3>OpenSMTPDの設定</h3>
    845 <h4>ユーザーの作成</h4>
    846 <p>
    847 メールの送受信を担当するユーザーを作成する:</p>
    848 <pre><code># useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail
    849 </code></pre>
    850 
    851 <h4>サーバー証明書の取得</h4>
    852 <p>
    853 <code>httpd(8)</code>の設定ファイルを作成する。<code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。変更箇所はドメイン名だけでいい。編集後、httpdを起動する。</p>
    854 <pre><code># cp /etc/examples/httpd.conf /etc/
    855 # vi /etc/httpd.conf
    856 # echo httpd_flags= &gt;&gt; /etc/rc.conf.local
    857 # rcctl start httpd
    858 # rcctl enable httpd
    859 </code></pre>
    860 
    861 <p>
    862 続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に登録することで、証明書が自動で更新されるようにする。</p>
    863 <pre><code># cp /etc/examples/acme-client.conf /etc/
    864 # vi /etc/acme-client.conf
    865 # acme-client -v mail.mtkn.jp
    866 # crontab -e
    867 </code></pre>
    868 
    869 <pre><code>#minute hour    mday    month   wday    [flags] command
    870 ~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd
    871 </code></pre>
    872 
    873 <h4>ドメインキーの作成とDNSへの登録</h4>
    874 <p>
    875 OpenSMTPD用のDKIMフィルターをインストールする。
    876 </p>
    877 <pre><code># pkg_add opensmtpd-filter-dkimsign
    878 </code></pre>
    879 
    880 <p>
    881 ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。
    882 </p>
    883 <pre><code># openssl genrsa -out /etc/mail/dkim/private.key 1024
    884 # openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key
    885 # chown -r _dkimsign:_dkimsign /etc/mail/dkim
    886 # chmod 0400 /etc/mail/dkim/private.key
    887 </code></pre>
    888 
    889 <p>作成したドメインキーの公開鍵をDNSに登録する:</p>
    890 <table>
    891 <thead>
    892 <tr>
    893 <th>サブドメイン</th>
    894 <th>種別</th>
    895 <th>内容</th>
    896 <th>優先度</th>
    897 </tr>
    898 </thead>
    899 <tbody>
    900 <tr>
    901 <td>selector1._domainkey.mail</td>
    902 <td>TXT</td>
    903 <td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td>
    904 <td></td>
    905 </tr>
    906 </tbody>
    907 </table>
    908 
    909 <p>
    910 サブドメインのselector1は以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに
    911 指定してものと同じものであれば他のものでもいい。</p>
    912 
    913 <h4>smtpd.confの設定</h4>
    914 <p>
    915 /etc/mail/smtpd.confを以下の通り変更:</p>
    916 <pre><code># 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。
    917 # 証明書のファイルは先程acme-client(1)で取得したもの。
    918 pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot;
    919 pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot;
    920 
    921 # テーブルの登録
    922 # ローカルに届いたメールの転送を設定するテーブル
    923 table aliases file:/etc/mail/aliases
    924 # ユーザーの名前と暗号化されたパスワードのテーブル
    925 table passwd file:/etc/mail/passwd
    926 # メールの転送を設定するテーブル
    927 table virtuals file:/etc/mail/virtuals
    928 
    929 # フィルターの登録
    930 # ドメインキーによる署名を付加するフィルター
    931 filter dkim_sign proc-exec\	&quot;filter-dkimsign -d mail.mtkn.jp -s selector1\	-k /etc/mail/dkim/private.key&quot; user _dkimsign group _dkimsign
    932 # DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター
    933 filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot;
    934 # 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった
    935 # 場合に受信を拒否するフィルター
    936 filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot;
    937 
    938 # 各ネットワークインターフェース毎の処理を設定。
    939 listen on socket
    940 listen on lo0
    941 # vio0というインターフェースの25番ポートに届いたものに関する設定。
    942 # 外部からmtkn.jp宛に届いたものの処理である。
    943 # 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、
    944 # 上で設定したDNSに関するフィルターを適応。
    945 listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\	filter { check_rdns, check_fcrdns }
    946 # vio0というインターフェースのsubmission(587番)ポートに関する設定。
    947 # mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される
    948 # メールに関する設定。
    949 # 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、
    950 # &quot;passwd&quot;という名前で登録したパスワードで認証し、
    951 # さらにドメインキーでメールに署名する。
    952 listen on vio0 mask-src port submission smtps pki mtkn.jp\	hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign
    953 
    954 # 各種メールの処理を定義する。
    955 # 各処理が実行される条件はこの後定義する。
    956 # ローカルメールはデフォルトのまま
    957 action &quot;local_mail&quot; mbox alias &lt;aliases&gt;
    958 # 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。
    959 action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\	virtual &lt;virtuals&gt;
    960 # 他のドメイン宛ては宛先へ転送。
    961 # 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で
    962 # 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加
    963 action &quot;outbound&quot; relay helo "mtkn.jp"
    964 
    965 # どういう条件でどういう処理をするかを定義する。
    966 # 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。
    967 # ここでは/var/vmail/以下に振り分けて保存する。
    968 match from any for domain mtkn.jp action &quot;domain&quot;
    969 # このサーバー内でのメールはlocal_mailとして処理。
    970 match from local for local action &quot;local_mail&quot;
    971 # このサーバー内から他所へのメールは宛先に転送
    972 match from local for any action &quot;outbound&quot;
    973 # 外部から来た他所宛てのメールは認証されているものに限り転送。
    974 # authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。
    975 match auth from any for any action &quot;outbound&quot;
    976 </code></pre>
    977 
    978 <h4>各テーブルの作成</h4>
    979 <p>
    980 上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。<code>/etc/mail/aliases</code>は特に変更しなくてもいい。<code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:</p>
    981 <pre><code># echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd
    982 <i>パスワードを入力し、エンター、Ctrl-D</i>
    983 </code></pre>
    984 
    985 <p>
    986 <code>/etc/mail/virtuals</code>にはメールの転送を設定できる。以下のようにする:</p>
    987 <pre><code>abuse@mtkn.jp         user@mtkn.jp
    988 postmaster@mtkn.jp    user@mtkn.jp
    989 webmaster@mtkn.jp     user@mtkn.jp
    990 user@mtkn.jp          vmail
    991 </code></pre>
    992 <p>
    993 この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど必要なんかな?
    994 </p>
    995 
    996 <h3>Dovecotの設定</h3>
    997 <p>
    998 MDAとして<code>dovecot(1)</code>をインストールする。</p>
    999 <pre><code># pkg_add dovecot
   1000 </code></pre>
   1001 <p>
   1002 dhparamを作成する(時間がかかる):
   1003 </p>
   1004 <pre><code># openssl dhparam -out /etc/ssl/dh.pem 4096
   1005 </code></pre>
   1006 
   1007 <p>
   1008 わかりにくい設定ファイルをどけてシンプルなものに書き直す:
   1009 </p>
   1010 <pre><code># mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
   1011 # vi /etc/dovecot/dovecot.conf
   1012 </code></pre>
   1013 <p>
   1014 ドキュメントは公式ウェブサイトで確認できる。分量が多すぎて読む気にならない。サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>と暗号化されていないIMAPを<code>port = 0</code>として無効にする。他はとりあえず以下の設定で動く:</p>
   1015 <pre><code># IPv4は全て監視
   1016 listen = *
   1017 
   1018 # SSL接続のみ許可
   1019 ssl = required
   1020 
   1021 # SSLに使用するファイル
   1022 ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem
   1023 ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key
   1024 ssl_dh = &lt;/etc/ssl/dh.pem
   1025 
   1026 # メールの保存場所は各ユーザーのホームディレクトリ。
   1027 # ホームディレクトリの場所は以下のuserdbで設定。
   1028 mail_location = maildir:~
   1029 
   1030 # パスワードのファイル。
   1031 # OpenSMTPDと共有。
   1032 passdb {
   1033     args = scheme=BLF-CRYPT /etc/mail/passwd
   1034     driver = passwd-file
   1035 }
   1036 
   1037 # ユーザーの設定。
   1038 # ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i>
   1039 userdb {
   1040     args = uid=vmail gid=vmail home=/var/vmail/%d/%n
   1041     driver = static
   1042 }
   1043 
   1044 # 使用するプロトコル。
   1045 protocols = imap lmtp
   1046 
   1047 # SSLを使ったIMAPSのみを許可。
   1048 service imap-login {
   1049   inet_listener imaps {
   1050     port = 993
   1051     ssl = yes
   1052   }
   1053   # Disable imap
   1054   inet_listener imap {
   1055     port = 0
   1056   }
   1057 }
   1058 </code></pre>
   1059 <pre><code># rcctl start dovecot
   1060 # rcctl enable dovecot
   1061 </code></pre>
   1062 
   1063 <p>
   1064 サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように<code>cron(8)</code>に追加しておく:
   1065 </p>
   1066 <pre><code>crontab -e
   1067 </code></pre>
   1068 
   1069 <pre><code>#minute hour    mday    month   wday    [flags] command
   1070 ~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot
   1071 </code></pre>
   1072 
   1073 <h3>テスト</h3>
   1074 <p>
   1075 手元のメールクライアントから送受信のテストをする。特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。以上の設定で、gmailへの送受信は問題なかった。また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン及び送受信できることも確認した。</p>
   1076 <p>
   1077 <date>2025-11-03</date> <code>smtpd.conf</code>に<code>helo "mtkn.jp"</code>を追加し、<a href="https://www.mail-tester.com/">mail-tester.com</a>というサイトにてテストしたところ満点をもらえた。gmailへの送信でよく迷惑メールに分類されていたが、<code>HELO</code>のときにDNSに登録されていないホスト名を返していたのが原因かもしれない。</p>
   1078 
   1079 <h2>参考文献</h2>
   1080 <ul>
   1081 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-1-what-is-email.html">Arch Linux mail server tutorial - part 1 - What is email?.unixsheikh.com</a></li>
   1082 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-2-opensmtpd-dovecot-dkimproxy-and-lets-encrypt.html">Arch Linux mail server tutorial - part 2 - OpenSMTPD, Dovecot, DKIMproxy, and Let's Encrypt.unixsheikh.com</a></li>
   1083 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-3-get-dns-right-it-is-important.html">Arch Linux mail server tutorial - part 3 - Get DNS right, it's important!.unixsheikh.com</a></li>
   1084 <li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li>
   1085 <li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li>
   1086 <li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li>
   1087 <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li>
   1088 <li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li>
   1089 <li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li>
   1090 <li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li>
   1091 </ul>
   1092 ]]></description>
   1093 </item>
   1094 <item>
   1095 <title>RP2040 SDKなし3 割り込み</title>
   1096 <link>https://www.mtkn.jp/computer/rp2040_3_interrupt.html</link>
   1097 <guid>https://www.mtkn.jp/computer/rp2040_3_interrupt.html</guid>
   1098 <pubDate>Wed, 27 Aug 2025 00:00:00 +0900</pubDate>
   1099 <description><![CDATA[<h1>RP2040 SDKなし3 割り込み</h1>
   1100 <time>2025-08-27</time><br />
   1101 <p>
   1102 前回UARTで通信する際、FIFOにデータが届いていないかを確認しつづけていた(ポーリング)。
   1103 これでは電力がもったいないので、データが届くまでCPUは休ませておいて、
   1104 届いたときだけ処理を実行するように変更する(割り込み)。
   1105 <p>
   1106 <p>
   1107 前回: <a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a><br>
   1108 ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex3_interrupt
   1109 </p>
   1110 
   1111 <h2>動作環境</h2>
   1112 <ul>
   1113 <li>OpenBSD 7.7
   1114 	<ul>
   1115 	<li>arm-none-eabi-binutils-2.40</li>
   1116 	<li>OpenBSD Make</li>
   1117 	<li>minicom version 2.8</li>
   1118 	</ul>
   1119 </li>
   1120 <li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a>
   1121 </li>
   1122 </ul>
   1123 
   1124 <h2>割り込み</h2>
   1125 <p>
   1126 ハードウェアが外部から信号を受けとると、CPUに現在の処理を中断させてその信号を処理させるようにできる。これを割り込み処理という。今回はUARTにデータが届いた時に同じデータをUARTに書き込むようにしたい。</p>
   1127 
   1128 <h3>割り込みを有効化</h3>
   1129 <p>
   1130 割り込みの信号を受け取るために、割り込みを有効化する。CPUが割り込みを受け付けるようにする設定と、UARTが割り込み信号を発生させるようにする設定が必要である。</p>
   1131 <p>
   1132 CPU側の設定は<code>M0PLUS: NVIC_ISER</code>レジスタの有効化したい割り込みのビットに1を書くことで行う。有効化できる割り込みは全部で26個ある。割り込みの種類はrp2040のデータシート[1]のTable 80. Interruptsに書いてある。今回有効化するのはUART0の割り込みで、この表から20番が割り当てられていることが分かるので、<code>M0PLUS: NVIC_ISER</code>に、下から20番目のビットを1にしたもの書き込む:</p>
   1133 <code><pre>	// enable uart interrupt in cpu
   1134 	ldr r4, ppb_base
   1135 	mov r5, #0xe1
   1136 	lsl r5, #8
   1137 	mov r0, #1
   1138 	lsl r0, #20
   1139 	str r0, [r4, r5] // M0PLUS: NVIC_ISER
   1140 
   1141 /* ... */
   1142 
   1143 ppb_base:
   1144 	.word 0xe0000000
   1145 </pre></code>
   1146 <p>
   1147 UART側の設定は、<code>UART: UARTIMSC</code>レジスタで行なう。データを受け取ったときに割り込みを発生させたいので、<code>RXIM</code>ビットに1を書き込む。また、処理を開始する前に既にFIFOにデータがたまっている可能性があるので、FIFOが空ではないときに割り込みを発生させるように、<code>RTIM</code>にも1を書き込む:</p>
   1148 <code><pre>	// enable uart interrupt in uart0 subsystem
   1149 	ldr r1, uart0_base
   1150 	mov r2, #(1 &lt;&lt; 6 | 1 &lt;&lt; 4) // RTIM | RXIM
   1151 	str r2, [r1, #0x38] // UART: UARTIMSC
   1152 </pre></code>
   1153 <p>
   1154 また、FIFOにデータがきたらすぐに割り込みを発生させたいので、<code>UART: UARTIFLS</code>レジスタの<code>RXIFLSEL</code>に0を書き込む。これでFIFOの1/8が埋まったら割り込みが発生する。</p>
   1155 <code><pre>	// set fifo level to 0
   1156 	mov r2, #0
   1157 	str r2, [r1, #0x34] // UART: UARTIFLS
   1158 </pre></code>
   1159 <p>
   1160 これだとFIFOに届いた瞬間には割り込みがおこらない気がするが、pico-sdk(src/rp2_common/hardware_uart/include/hardware/uart.h)の<code>uart_set_irqs_enabled</code>関数でもこうなってる。FIFOを無効にすれば即座に割り込みがおこるかもしれないが、データが失われる可能性もあるのかな。</p>
   1161 
   1162 <h3>ベクターテーブルの設定</h3>
   1163 <p>
   1164 外部からの信号で割り込みが発生したときにCPUに行わせる処理はベクターテーブルにあらかじめ登録しておく必要がある。ベクターテーブルの場所は<a href="rp2040_1.html">一回目</a>に登録した通り<code>vectors</code>とラベルを付けた場所(main.sの先頭)である。ARMの仕様書[2]によると、ベクターテーブルの0番目は初期のスタックポインタで、そこから15個はARMによって使用用途が定められている。16番以降の32個は各CPUの設計者が自由に決められる。rp2040の割り込みについてはデータシート[1]のTable 80. Interruptsに一覧表が載っている。今回使いたいのはUART0の割り込みなので16 + 20 = 36番目に、割り込み時に呼ばれたい関数のポインタ(Thumb Modeなので関数のアドレスに1を足したもの)を書き込めばいい。それ以外のものは今回は使わないので適当な数値でうめておく:</p>
   1165 <code><pre>	.global vectors
   1166 vectors:
   1167 	.word 0x20040000 // initial SP
   1168 	.word (reset+1)  // entry point
   1169 	.word 0xdeadbeef
   1170 	.word 0xdeadbeef
   1171 
   1172 	.word 0xdeadbeef
   1173 	.word 0xdeadbeef
   1174 	.word 0xdeadbeef
   1175 	.word 0xdeadbeef
   1176 
   1177 	.word 0xdeadbeef
   1178 	.word 0xdeadbeef
   1179 	.word 0xdeadbeef
   1180 	.word 0xdeadbeef
   1181 
   1182 	.word 0xdeadbeef
   1183 	.word 0xdeadbeef
   1184 	.word 0xdeadbeef
   1185 	.word 0xdeadbeef
   1186 
   1187 
   1188 	.word 0xdeadbeef
   1189 	.word 0xdeadbeef
   1190 	.word 0xdeadbeef
   1191 	.word 0xdeadbeef
   1192 
   1193 	.word 0xdeadbeef
   1194 	.word 0xdeadbeef
   1195 	.word 0xdeadbeef
   1196 	.word 0xdeadbeef
   1197 
   1198 	.word 0xdeadbeef
   1199 	.word 0xdeadbeef
   1200 	.word 0xdeadbeef
   1201 	.word 0xdeadbeef
   1202 
   1203 	.word 0xdeadbeef
   1204 	.word 0xdeadbeef
   1205 	.word 0xdeadbeef
   1206 	.word 0xdeadbeef
   1207 
   1208 	.word 0xdeadbeef
   1209 	.word 0xdeadbeef
   1210 	.word 0xdeadbeef
   1211 	.word 0xdeadbeef
   1212 
   1213 	.word (uart_interrupt_handler+1) // UART0_IRQ
   1214 </pre></code>
   1215 
   1216 <h3>割り込み処理</h3>
   1217 <p>
   1218 割り込み発生時に呼ばれる関数はUARTのFIFOに届いたデータをそのまま送信するだけのものである:</p>
   1219 <code><pre>	// uart_interrupt_handler echos the data arrived at uart0
   1220 uart_interrupt_handler:
   1221 	push {lr}
   1222 	bl getbyte
   1223 	bl putbyte
   1224 	pop {pc}
   1225 </pre></code>
   1226 <p>
   1227 <code>getbyte</code>、<code>putbyte</code>は前回と同じもの。
   1228 </code>
   1229 
   1230 <h2>メインループ</h2>
   1231 <p>
   1232 UARTにデータが届いていないときは特にすることがないのでCPUは寝かせておく。ARMには割り込みが発生するまでなにもしない<code>wfe</code>という命令があるのでこれを使う:</p>
   1233 <code><pre>loop:
   1234 	wfe
   1235 	b loop
   1236 </pre></code>
   1237 
   1238 <h2>完成</h2>
   1239 <p>
   1240 これで完成。動作は前回と全く同じだが、消費電力をおさえられる。</p>
   1241 
   1242 <h2>参考</h2>
   1243 <ul>
   1244 <li>
   1245 [1]. <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a>
   1246 </li>
   1247 <li>
   1248 [2]. <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a>
   1249 </li>
   1250 <li>
   1251 [3]. <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a>
   1252 </li>
   1253 </ul>
   1254 ]]></description>
   1255 </item>
   1256 <item>
   1257 <title>自画像</title>
   1258 <link>https://www.mtkn.jp/gallery/20250717.html</link>
   1259 <guid>https://www.mtkn.jp/gallery/20250717.html</guid>
   1260 <pubDate>Thu, 17 Jul 2025 00:00:00 +0900</pubDate>
   1261 <description><![CDATA[<h1>自画像</h1>
   1262 <time>2025-07-17</time>
   1263 <img src="img/20250717.jpg">
   1264 ]]></description>
   1265 </item>
   1266 <item>
   1267 <title>万博で知り合ったルーマニア人とハイキングに行った</title>
   1268 <link>https://www.mtkn.jp/journal/posts/20250519.html</link>
   1269 <guid>https://www.mtkn.jp/journal/posts/20250519.html</guid>
   1270 <pubDate>Mon, 19 May 2025 00:00:00 +0900</pubDate>
   1271 <description><![CDATA[<h1>万博で知り合ったルーマニア人とハイキングに行った</h1>
   1272 <time>2025-05-19</time>
   1273 
   1274 <p>
   1275 先日万博のルーマニアパビリオンで知り合ったルーマニア人の<a href="https://noian.art">Noian</a>がハイキングに行きたいというので、地元の山に連れていった。元々4月の終わりごろを予定していたが、僕が風邪をひいてしまいのびていた。向こうも万博の仕事が忙しいようで、帰国の前日になってやっと予定が合った。</p>
   1276 
   1277 <p>
   1278 10時過ぎにうちの最寄り駅に着く予定だったが、電車に乗り間違えたらしく一時間程遅れた。なにせ阪和線である。外国人にはかなりややこしい。そのうえ駅員はフランス人のごとく英語を話さない。間違って関空に行かないようにしつこく注意喚起して、なんとか和歌山に辿りついた。</p>
   1279 
   1280 <p>
   1281 車で自宅まで連れて来て、そこから徒歩で山に向かった。自然が好きそうだったので、ろくに整備されていないひとけのない山に案内した。</p>
   1282 
   1283 <p>
   1284 この山に登るのは久しぶりなので道を覚えているか不安だった。おそらく昔の人が隣の町まで行くのに使っていた道だと思う。今でも一応隣町まで抜けられる。入口は果樹園になっていて今も柑橘の木がたくさん植わっている。川沿いを森に入ると左右には棚田が並んでいる。こちらの田んぼは既に放棄され、今は藪や針葉樹林になっている。針葉樹の方は戦後の拡大造林で植えられたものだろうか、毎年ティッシュペーパーの需要を底上げしている木々である。棚田は石垣で造成されている。いつのものかは知らないが今も崩れずに残っている。</p>
   1285 
   1286 <p>
   1287 棚田の横をさらに進むと小さい滝がある。牝牛の滝というらしい。牝牛と書いてコッテと読む。滝の近くに牝牛に見える岩があるのが由来らしい。コッテという言葉は聞き馴染みがない。後日祖父の友人に聞いた話だと、小さい牛やメスの牛のことをコッテウシと言ったそうだ。</p>
   1288 
   1289 <figure>
   1290 <img src="20250519-1.jpg" alt="牝牛の滝">
   1291 <figcaption><ruby>牝牛<rp>(</rp><rt>コッテ</rt><rp>)</rp></ruby>の滝</figcaption>
   1292 </figure>
   1293 
   1294 <p>
   1295 滝を過ぎると急勾配の斜面が続く。ほとんど道とはいえないような山肌を登る。40度はありそうな勾配である。息があがりながらも、彼は日本に来たがっている友人のことを聞かせてくれた。日本のとあるバンドの大ファンなのだそうだ。ポップカルチャーにはうといので自国のことなのになにも分からなかった。最後に大きな岩が作った崖を山羊のように登ればやっと平坦な道に出る。彼のブーツがよく滑っていた。裸足が一番安全だと勧めたが遠慮しとくと言われた。そこから先は特にきつい場所もなく、そのまま展望台に続く。彼は少し疲れたようで言葉が少なくなっていた。</p>
   1296 
   1297 <figure>
   1298 <img src="20250519-2.jpg" alt="展望台から">
   1299 <figcaption>展望台から</figcaption>
   1300 </figure>
   1301 
   1302 <p>
   1303 展望台からは僕の町が一望できる。西が海で南北が山、東はゆるがかな坂が高野山まで続いている。彼の出身地も山がちで似た地形だそうだ。海はないが毎年父親が黒海まで連れていってくれていたので馴染深いといっていた。展望台には小さな祠がある。せっかくなので鳥居のくぐり方や参拝の仕方を教えてあげた。熱心に聞いてはくれたが自分はやらないと言っていた。理由は聞かなかったがおそらく彼がキリスト教徒だからであろう。こういうはっきりした態度は見ていてなんとなく気持がいい。</p>
   1304 
   1305 <p>
   1306 ところで日本では神道でも仏教でも左進右退が基本だと思う。以前五瀬命が祀られている竃山神社のお祭に行ったことがある。そこでは巫女さんが神殿に向う階段を登る際左足を一段上げて右足を引き寄せてを繰り返して登り、下るときは逆にしていた。お寺でも道場に入るときは左から、出るときは右からと習った。そういえば合気道でも座礼をするとき左手、右手の順で床に付けて頭を下げ、頭を上げるときは右手から戻すと習った気がする(この記憶はあいまい)。ところがヨーロッパでは逆らしい。左は邪悪だから右から入るのだそうだ。</p>
   1307 
   1308 <p>
   1309 下りは別の道を選んだ。途中からコンクリートで舗装されている楽な道である。途中で山菜がいろいろ生えていたので紹介してあげたらぱくぱく食べていた。よく信用できるものである。イタドリ、ユキノシタ、フキ、チャノキ、タラノキ...。タケノコはもう竹だった。クスノキもあったのでいい香りがすると言って渡したらこれもかじっていた。クスノキが食べられるかどうか僕は知らない。防虫剤に使われていたと伝えるとすぐに吐きだして水で口をすすいでた。</p>
   1310 
   1311 <p>
   1312 展望台でフルートを吹く動画を撮りたかったのに忘れていたといっていたが、途中で見つけた竹林を気に入ったようで、そこで吹いていた。このフルートはチューニングが現代の一般的なものとは違い、ミの音が少し低くなっている。長調とも短調ともいえない微妙な音階だった。</p>
   1313 
   1314 <figure>
   1315 <img src="20250519-3.jpg" alt="フルートを吹くNoian">
   1316 <figcaption>フルートを吹くNoian</figcaption>
   1317 </figure>
   1318 
   1319 <p>
   1320 ルーマニアに竹は自生していない。ところが和食屋等には植わっているという。ルーマニアの植生だいじょうぶかなぁ。</p>
   1321 
   1322 <p>
   1323 山から家に帰ってきたらもう15時になろうとしていた。昼ごはんは食べてない。車で和歌山市の寿司屋に向った。弥一という回転寿司である。回転寿司だが安いわけではなく、味はかなり美味しい。</p>
   1324 
   1325 <p>
   1326 中途半端な時間に行ったからか、寿司はひとつも回っておらず、タブレットから注文するように言われた。おなかがすいたから寿司以外のものも食べるといって、彼は最初にうどんを注文した。僕も自分の食べたいものを適当に注文していた。しばらくして納豆うずらが届いた。僕は頼んでいない。彼は納豆が好きだそうだ。ルーマニアにも臭いの強い発酵食品があるのかと思い、チーズの話をしてみた。ルーマニアには臭いチーズはないと言う。ゴルゴンゾーラやカマンベールはないのかと聞くと、あんなのは臭いうちにはいらないそうだ。ちなみに国でよく食べられるのはカビの生えていないクリームチーズのようなものだそうだ。</p>
   1327 
   1328 <p>
   1329 ひととおり食べておなかがいっぱいになってきた。彼もおなかがいっぱいになってきたと言いだした。彼のうどんにはまだ手が付けられていない。テーブルにはまだ寿司が残っている。無理なら僕が食べようかと言うと彼はうどんの鉢をこっちによこした。ちょっとくるしかったがまあうどんなので食べれた。麺は腰があっておいしいが、出汁は少し甘みが強かった。出汁を飲みほした頃、彼も残った寿司をだいたい片付けて、やっぱり自分もうどんを食べるといって追加で注文した。</p>
   1330 
   1331 <p>
   1332 うどんの甘みをガリで消して店を出た。おごってくれた。</p>
   1333 
   1334 <p>
   1335 弥一を後にし、和歌山城に案内した。和歌山城にはなぜか小さな動物園が付いている。時間がなかったので適当に見て天守閣に登った。地元の人間なのに天守閣はこれが初めてである。閉館ぎりぎりに行って30分しか見れなかった。天守閣は米軍に丸焼きにされたあと鉄筋コンクリート造りで再建された物である。外観はそれっぽいが内部は昭和の団地のような近代的なものだった。書画や武器等が展示されていてそれなりに見応えがあり、30分では足りなかった。彼は中国語が話せるので漢字も結構読める。僕が流し見した巻物を熱心に読んでいた。</p>
   1336 
   1337 <p>
   1338 和歌山城を出た後は寺か神社が見たいというので日前宮に行った。既に閉まっていて入れなかった。こんな時間に閉まっては会社帰りに立ち寄れないのではと言われた。ルーマニアではサラリーマンが帰りに教会に行くのが普通なのだろうか。</p>
   1339 
   1340 <p>
   1341 カフェにでも行って話しをしようということになった。いい喫茶店は知らないので和歌山市駅のスタバに行くことにした。駅ビルには確か日本酒のお店もあったのでそこで黒牛か超久でも買わせようと思った。ところが着いてみると平和酒造の店だった。この酒蔵はあまり好きではないので入らずに直接スタバに行った。スタバではどういう流れだったか、国境の話になった。昔は国という概念も国民という枠組みもなかったのに、いつしか作られて国境ができたという。ヨーロッパの世界はかつて神が治めていたが、あるときから貴族がその役割を担い、貴族が没落してからは民衆をまとめるために民族や国家というストーリーが必要になったという。そういえばゲルマン民族というのもナチスがドイツをまとめるために作った概念だとどこかで読んだ気がするが本当なのだろうか。日本は海に囲まれているのでヨーロッパと少し状況が違うんじゃないかという話を出してみた。言語も民族も一つで天然の国境があるのはヨーロッパ人から見るとちょっと変なのかな。そのくせ昔から文化的には国際色豊かだと言われた。</p>
   1342 
   1343 <p>
   1344 辺りがすっかり暗くなったころスタバを出て少しそのへんを散歩した。駅の周辺は全然土地勘がなかったが紀の川があるのは知っていたのでそっちに向かって適当に歩いた。日本語の練習をしたいので日本語で話して欲しいと言われた。僕の言葉は結構理解できていたようだし、向うも割と話せていた。多少ゆっくり話すようにはしたがそれでもたいしたものである。ところで外国人相手に母語を話すと普段どれだけ自分がいい加減に話しているかがよく分かる。発音や文法を間違えないように意識するととたんに言葉に詰まるのだ。</p>
   1345 
   1346 <p>
   1347 人生で英語をしっかり話したのはこれが初めてである。彼と話していて思ったが、話したいことがあれば文章を組みたてる前に話しはじめたほうがいい。相手の話を理解したうえでなにか言いたげなことは伝わるし、そのあとは身振り手振りでも案外なんとかなる。外国人と話すのに外国語に関する知識はある程度必要だが、相手の話したいことに興味を持つのも重要である。</p>
   1348 
   1349 <p>
   1350 河原では日本の山に危険な動物はいるのかという話になった。熊や毒蛇、スズメバチなんかが怖いと言った。このあたりで熊を見たことはないけど。それから彼がどうやって英語を流暢に話せるようになったのかも教えてくれた。英語でゲームをしていたら英語が第二の母語のようになったそうだ。ルーマニア語はマイナーな言語なのでゲームは翻訳されないらしい。僕も流暢ではないにしても何とか意思疎通できるようになったのは、英語でコンピューターの勉強をしたからだと思う。英語を勉強するより、英語を使ってなにかをすると、すぐ覚えるし忘れにくい。最後に二宮金次郎の像に集まった猫を眺めて駅に戻った。</p>
   1351 
   1352 <p>
   1353 彼は明日の22時台の飛行機でイスタンブールを経由して国に帰る。イスタンブールまで12時間、乗り換えに3時間、そこからルーマニアまで1時間半、国に着いてからさらに12時間バスに乗る。なかなか遠いところである。国内線もあると言っていたが、日本でお金を使いすぎたから節約したいらしい。</p>
   1354 
   1355 <p>
   1356 彼は20:30発の特急サザンに乗って大阪のホテルに帰っていった。</p>
   1357 ]]></description>
   1358 </item>
   1359 <item>
   1360 <title>使用しているハードウェア、ソフトウェア</title>
   1361 <link>https://www.mtkn.jp/computer/what-i-use.html</link>
   1362 <guid>https://www.mtkn.jp/computer/what-i-use.html</guid>
   1363 <pubDate>Mon, 28 Apr 2025 00:00:00 +0900</pubDate>
   1364 <description><![CDATA[<h1>使用しているハードウェア、ソフトウェア</h1>
   1365 <time>2025-04-28</time>更新<br>
   1366 <time>2021-12-13</time>作成
   1367 <h2>ノートパソコン</h2>
   1368 <p>メインのパソコン。</p>
   1369 <dl>
   1370 <dt>ハードウェア: <a href="openbsd_on_u9310e.html">Fujitsu LIFEBOOK U9310/E</a></dt>
   1371 <dd>2013年製のMacBook Airを使っていたがバッテリーがへたってきた。ぱちもんのバッテリーは1年でだめになるのに7千円くらいするのでコスパが悪い。2025年4月に大阪日本橋で見付けたLIFEBOOKを買った。10世代のCore i5で27000円くらい。軽い。ディスプレイが綺麗、OpenBSDと相性がそこそこいい。</dd>
   1372 <dt>OS: OpenBSD</dt>
   1373 <dd>
   1374 使いやすい。
   1375 </dd>
   1376 
   1377 <dt>Window Manager: <a href="https://git.mtkn.jp/dwm">dwm</a></dt>
   1378 
   1379 <dt>Terminal: <a href="https://git.mtkn.jp/st">st</a></dt>
   1380 
   1381 <dt>Text Editor: acme, nvi</dt>
   1382 <dd>vimは辞めた。OpenBSDにあったnviが丁度いい。日本語を使うので日本語入力が必要ない場面ではacmeを使っている。</dd>
   1383 
   1384 <dt>Browser: firefox</dt>
   1385 <dd>もうちょっとましなのないんかな。UIころころ変わるし、重いし、嫌い。JavaScriptがないと困るので仕方なく使っているが...特に最近画面上部のUIが大きすぎて邪魔である。</dd>
   1386 
   1387 <dt>Mail Client: neomutt</dt>
   1388 <dd>あんまり好きじゃない</dd>
   1389 </dl>
   1390 
   1391 <h2>デスクトップ</h2>
   1392 <p>学生のときに組んだ。無駄にハイスペック。この上RTX2060も積んでたが、OpenBSDで使えないので解雇した。最近は絵を描くのに使っている。</p>
   1393 <dl>
   1394 <dt>マザーボード: ASRock Z390 Pro4</dt>
   1395 <dt>CPU: Intel Core i7-9700K</dt>
   1396 <dt>メモリ: センチュリーマイクロ 8GB * 2</dt>
   1397 <dd>国産</dd>
   1398 <dt>ストレージ: KimMiDi SSD 256GB</dt>
   1399 <dd>ThinkPad買ったときについてきたやつ。</dd>
   1400 <dt>モニタ: Eizo FlexScan EV2451</dt>
   1401 <dd>綺麗やけど質量が大きい。</dd>
   1402 <dt>OS: OpenBSD</dt>
   1403 <dd></dd>
   1404 </dl>
   1405 
   1406 <h2>家のサーバー</h2>
   1407 <p>
   1408 主にDNSとして使っている。
   1409 </p>
   1410 <dl>
   1411 <dt>ハードウェア: Dell D520</dt>
   1412 <dd>おじいちゃんの家にころがってたのをもらってきた。</dd>
   1413 <dt>OS: OpenBSD</dt>
   1414 <dd></dd>
   1415 </dl>
   1416 
   1417 <h2>ウェブサーバー</h2>
   1418 <p>このウェブページ用</p>
   1419 <dl>
   1420 <dt>VPS: さくらのVPS</dt>
   1421 <dd>ちょっと高い(7078円/12ヶ月)。OpenBSDを入れられる。</dd>
   1422 <dt>OS: OpenBSD</dt>
   1423 <dt>httpサーバー: Openbsd httpd</dt>
   1424 <dd>manが分かりやすい。</dd>
   1425 <dt>smtpサーバー: OpenSMTPD</dt>
   1426 <dd>manが分かりやすい。</dd>
   1427 <dt>imapサーバー: dovecot</dt>
   1428 <dd>manはあんまり分かり易くない。<dd>
   1429 </dl>
   1430 ]]></description>
   1431 </item>
   1432 <item>
   1433 <title>OpenBSD on Fujitsu LIFEBOOK U9310/E</title>
   1434 <link>https://www.mtkn.jp/computer/openbsd_on_u9310e.html</link>
   1435 <guid>https://www.mtkn.jp/computer/openbsd_on_u9310e.html</guid>
   1436 <pubDate>Mon, 28 Apr 2025 00:00:00 +0900</pubDate>
   1437 <description><![CDATA[<h1>OpenBSD on Fujitsu LIFEBOOK U9310/E</h1>
   1438 <time>2025-04-28</time>
   1439 
   1440 <h2>はじめに</h2>
   1441 <p>
   1442 大阪の日本橋で状態のいいLIFEBOOKを見つけたので購入した。OpenBSDをインストールしたらおおむね問題なく動いた。</p>
   1443 
   1444 <h2>ハードウェア</h2>
   1445 <img src="images/openbsd_on_u9310e_1.jpg" alt="U9310/E">
   1446 <p>
   1447 FujitsuのLIFEBOOK U9310/Eというパソコンである。2020年にビジネス向けに発売されていたもので、リース会社から放出されたものだと思う。CPUはIntelの第10世代のCore i5 10310U、メモリは8GB、ストレージはKIOXIA製NVMeの256GB。メモリは増設できないがWindowsなんてものは使わないので十分である。ディスプレイは多分IGZOのFull HDでめちゃ綺麗。キーボードは必要十分かなあ。ただし特定の組み合わせのキーを同時に入力することができない。A、W、Dが同時に入力できないのでゲームするには少し困りそう。またCapsLock、Shift、PgUpの組み合せもだめだった。CapsLockにはCtrlを割り当てており、この組み合わせでstの文字を拡大するようにしていたのでこれが使えないのは不便である。stの設定をいじって回避した。タッチパッドもまあまあ。左右クリック用に物理ボタンがあるのは凄くいい。でもThinkpadみたいにタッチパッドの上に付いてた方がホームポジションから動かなくていいので好き。ファンは結構静かだと思う。YouTubeを開くと少し回るがすぐに静かに戻る。今回のものはキーボードにバックライトがないモデルだった。少し不便だがすぐ慣れると思う。</p>
   1448 
   1449 <h2>内部</h2>
   1450 <p>
   1451 分解は簡単。電源を落して、裏面にあるネジを全部外せば裏蓋が開く。ツメで引っ掛けていたりしないので外しやすい。裏蓋にはバッテリーの絵が描かれたボタンがあって、いかにも押してほしそうな顔をしていたので一応押してから分解した。組み立てた後は電源ケーブルを繋がないと電源が入らなかった。おそらくバッテリーとの接続を切断するためのボタンなのだと思う。</p>
   1452 <img src="images/openbsd_on_u9310e_2.jpg" alt="U9310/E の内部">
   1453 <p>
   1454 CPUクーラー、ヒートシンク、Wi-Fiカード、WWANカード、SSDは簡単に外せた。他のものもだいたい分解しやすそうである。電源プラグが交換できるのはポイントが高い。上でも書いたがメモリははんだ付けされていて交換できない。キーボードも外せそうではあるがマザーボードを取ったうえネジが沢山あったのでやめにした。</p>
   1455 <h2>OpenBSDのサポート</h2>
   1456 <table>
   1457 <tr>
   1458 <th>機能</th>
   1459 <th>サポート</th>
   1460 <th>備考</th>
   1461 </tr>
   1462 
   1463 <tr>
   1464 <td>音</td>
   1465 <td>○</td>
   1466 <td>
   1467 Intel 400 Series HD Audio、コーデック: Realtek ALC255。<br>azaliaによりサポート。メディアキーによる音量調整が可能。</td>
   1468 </tr>
   1469 
   1470 <tr>
   1471 <td>バッテリーの状態</td>
   1472 <td>○</td>
   1473 <td>
   1474 acpibatによりサポート。
   1475 </td>
   1476 </tr>
   1477 
   1478 <tr>
   1479 <td>キーボードバックライト</td>
   1480 <td>?</td>
   1481 <td>
   1482 今回購入したものには搭載されていなかった。
   1483 </td>
   1484 </tr>
   1485 
   1486 <tr>
   1487 <td>ハイバーネーション</td>
   1488 <td>○</td>
   1489 <td>
   1490 ZZZが使える。
   1491 </td>
   1492 </tr>
   1493 
   1494 <tr>
   1495 <td>スリープ</td>
   1496 <td>○</td>
   1497 <td>
   1498 zzzが使える。液晶を閉じると自動でスリープし、開くと問題なく復帰できる。電源ランプが点滅するのが少しじゃま。
   1499 </td>
   1500 </tr>
   1501 
   1502 <tr>
   1503 <td>タッチパッド</td>
   1504 <td>○</td>
   1505 <td>
   1506 imtでサポート。
   1507 </td>
   1508 </tr>
   1509 
   1510 <tr>
   1511 <td>USB type-A</td>
   1512 <td>○</td>
   1513 <td>
   1514 使えた。
   1515 </td>
   1516 </tr>
   1517 
   1518 <tr>
   1519 <td>USB type-C、Thunderbolt</td>
   1520 <td>?</td>
   1521 <td>
   1522 充電はできた。Thunderboltはケーブルがないのでテストできない。</td>
   1523 </tr>
   1524 
   1525 <tr>
   1526 <td>SDカードリーダー</td>
   1527 <td>○</td>
   1528 <td>
   1529 使えた。
   1530 </td>
   1531 </tr>
   1532 
   1533 <tr>
   1534 <td>映像出力</td>
   1535 <td>○</td>
   1536 <td>
   1537 inteldrmでサポート。輝度の調整はxbacklightで出来るが、メディアキーは使えなかった。HDMIの出力も問題ない。
   1538 </td>
   1539 </tr>
   1540 
   1541 <tr>
   1542 <td>ウェブカメラ</td>
   1543 <td>○</td>
   1544 <td>
   1545 SunplusIT Inc FJ Camera。uvideoでサポート。
   1546 </td>
   1547 </tr>
   1548 
   1549 <tr>
   1550 <td>Ethernet</td>
   1551 <td>○</td>
   1552 <td>
   1553 emでサポート。
   1554 </td>
   1555 </tr>
   1556 
   1557 <tr>
   1558 <td>Wi-Fi</td>
   1559 <td>○</td>
   1560 <td>
   1561 Intel Wi-Fi 6 AX201。iwxでサポート。
   1562 </td>
   1563 </tr>
   1564 
   1565 <tr>
   1566 <td>WWAN</td>
   1567 <td>?</td>
   1568 <td>
   1569 Sierra Wireless, Incorporated EM7430。umbにより認識はされてる。ifconfigでもネットワークインターフェースとして表示されてる。simカード持ってないから試せない。
   1570 </td>
   1571 </tr>
   1572 
   1573 <tr>
   1574 <td>Bluetooth</td>
   1575 <td>×</td>
   1576 <td>
   1577 OpenBSDはBluetoothが嫌い。ugenにより認識はされてる。
   1578 </td>
   1579 </tr>
   1580 
   1581 </table>
   1582 ]]></description>
   1583 </item>
   1584 <item>
   1585 <title>大阪万博行った</title>
   1586 <link>https://www.mtkn.jp/journal/posts/20250420.html</link>
   1587 <guid>https://www.mtkn.jp/journal/posts/20250420.html</guid>
   1588 <pubDate>Wed, 23 Apr 2025 00:00:00 +0900</pubDate>
   1589 <description><![CDATA[<h1>大阪万博行った</h1>
   1590 <time>2025-04-20</time>
   1591 
   1592 <p>4月15日火曜日に大阪万博に行ってきた。
   1593 </p>
   1594 
   1595 <p>朝の紀州路快速は高校生ばかりだった。大阪に近付くにつれてビジネスマンが多くなっていった。西九条から地下鉄に乗りかえるとEXPO staffの札を首から下げた外国人がたくさんいた。外国人ばかりなのになぜかみんなスマホを見たり、目が合ってもなんとなく外を向いたりと、雰囲気だけが日本なのが面白い。</p>
   1596 
   1597 <p>
   1598 会場には予約より少し早く着いた。荷物検査があるので結構時間がかかり、入れたのは予約より30分ほど過ぎたころだった。</p>
   1599 <figure>
   1600 <img src="20250420-1.jpg" alt="東ゲート">
   1601 <figcaption>東ゲート</figcaption>
   1602 </figure>
   1603 <figure>
   1604 <img src="20250420-2.jpg" alt="リング">
   1605 <figcaption>リング</figcaption>
   1606 </figure>
   1607 
   1608 <p>会場内はところどころ植え込みがあって雑草も生えてきていた。タンポポは全部セイヨウだった。中央付近に静けさの森という場所があるが、そんなに森にはなっていない。どうせなら明治神宮みたいなのを作ればよかったかと思う。IR会場になった後も公園にできるし。
   1609 </p>
   1610 <figure>
   1611 <img src="20250420-3.jpg" alt="セイヨウタンポポ">
   1612 <figcaption>セイヨウタンポポ</figcaption>
   1613 </figure>
   1614 <figure>
   1615 <img src="20250420-4.jpg" alt="ノゲシ">
   1616 <figcaption>ノゲシ</figcaption>
   1617 </figure>
   1618 <figure>
   1619 <img src="20250420-5.jpg" alt="バラ科のなにか">
   1620 <figcaption>バラ科のなにか</figcaption>
   1621 </figure>
   1622 <figure>
   1623 <img src="20250420-6.jpg" alt="ノボロギク">
   1624 <figcaption>ノボロギク</figcaption>
   1625 </figure>
   1626 <figure>
   1627 <img src="20250420-7.jpg" alt="ノアザミ">
   1628 <figcaption>ノアザミ</figcaption>
   1629 </figure>
   1630 <figure>
   1631 <img src="20250420-8.jpg" alt="タネツケバナ">
   1632 <figcaption>タネツケバナ</figcaption>
   1633 </figure>
   1634 <figure>
   1635 <img src="20250420-9.jpg" alt="ヨモギ">
   1636 <figcaption>ヨモギ</figcaption>
   1637 </figure>
   1638 
   1639 <p>11時に英国パビリオンを予約していたのだが着いてみるとシステムエラーで閉鎖されていた。レストランは開いていたので混む前になにか食べることにした。英国人と会話できると思っていたが案内してくれたのは片言の英語を喋るアジア人のおばちゃんだった。2個で9ポンドのアイスクリームは売ってなかった。フィッシュアンドチップスと紅茶を頼んだ。出された紅茶にはミルクが付いていなかった?!フィッシュアンドチップスの方は思っていたよりは美味しかった。味のしない鱈だったが鮮度は良く、衣もさくさくだった。油もそこまで古くなっていない。チップスの方はモスバーガーよりイモの味が薄かった。タルタルソースと緑のペーストが付いていた。緑のものは多分エンドウ豆を潰したものにミントで香りを付けていた。悪くはなかったが組合せが初めてだったせいか、ミントが目立ちすぎていたように思う。</p>
   1640 <figure>
   1641 <img src="20250420-10.jpg" alt="フィッシュアンドチップス">
   1642 <figcaption>フィッシュアンドチップス</figcaption>
   1643 </figure>
   1644 
   1645 <p>英国パビリオンが復旧するまで他を周ることにした。オーストリアに行ってみたが列が一杯だから時間をおいて来るように言われた。</p>
   1646 
   1647 <p>大根が咲いていた。
   1648 </p>
   1649 <figure>
   1650 <img src="20250420-11.jpg" alt="ハマダイコン">
   1651 <figcaption>ハマダイコン</figcaption>
   1652 </figure>
   1653 
   1654 <p>二つほど空いてる所を見たがあんまり面白くなかった。</p>
   1655 
   1656 <p>英国に戻ってみると復旧していたので入ることにした。前に英国人の親子が並んでいた。母親が高校生くらいの息子にハグして日本語で「トテモカワイイデス」と言っていた。突然日本語が聞こえてくるとどうしても見てしまう。目が合った。その後もなぜかちらほら日本語が聞こえてきては目が合った。しばらくして父親の方が息子の鞄からチョコ棒を出して母親と息子に配った。自分の分を取ったあとなぜかさらにもう一本取り出してこっちに差し出してきた。話し掛けたいなあと思っていた所だったので受け取ってお礼を言って何を話そうかと考えていたのだが、パビリオンの扉が開いて3人は吸い込まれていった。パビリオンは20人程度のグループで周るようになっていたのだが、丁度僕の前で区切られてしまったのだ。</p>
   1657 <figure>
   1658 <img src="20250420-12.jpg" alt="英国人がくれたチョコ棒">
   1659 <figcaption>英国人がくれたチョコ棒</figcaption>
   1660 </figure>
   1661 
   1662 <p>展示は特に面白くなかった。特定の医薬品会社がお金を出していそうなことは分った。
   1663 </p>
   1664 
   1665 <p>パビリオンの中にバーがあった。ビールでも飲みたかったが外が寒すぎて冷えていたのであきらめた。
   1666 </p>
   1667 
   1668 <p>その後は特に予定もなかったので散歩していたらルーマニアパビリオンを見つけた。チェロの先生がルーマニアで修行してきた人なので行ってみたかったのだが、予約のフォームで見つからなかったので来ていないものだと思っていた。予約できないだけみたいだ。</p>
   1669 
   1670 <p>30分ほど並んだ。入口に居たお姉さんがめっちゃ綺麗だった。展示は生演奏と伝統工芸の展示、実演だった。演奏は僕が行ったときはバイオリンだけだったが、椅子と譜面台が4つとピアノもあったので時間によって編成が変わるようだった。伝統工芸の展示のひとつに、ガラスに描かれた宗教画があった。ビザンツからの伝統だと言っていたと思う。絵の具が置いてあったので描かせてもらった。マリアがキリストを抱いている画を模写した。描きながらルーマニアのことを色々教えてもらえたのがとても良かった。女の人が全員綺麗だった。さすが東欧である。レストランもあったが残念ながら閉まっていて食べられなかった。</p>
   1671 
   1672 <p>最後に知りあったルーマニア人とその辺をぶらぶらして帰ってきた。</p>
   1673 <figure>
   1674 <img src="20250420-13.jpg" alt="知り合ったルーマニア人">
   1675 <figcaption>知り合ったルーマニア人</figcaption>
   1676 </figure>
   1677 
   1678 <p>パビリオンの展示は総じていまいちである。今回行った海外のパビリオンには特に未来っぽいものはなにもなかった。これはある意味期待通りだった。一方でルーマニアでは現地の文化も見れたし現地人との交流もできたのでよかった。他のパビリオンでもこういう交流があればいいのにと思う。国内企業のパビリオンに行けていないので次回はその辺を見たい。</p>
   1679 ]]></description>
   1680 </item>
   1681 <item>
   1682 <title>着物作った</title>
   1683 <link>https://www.mtkn.jp/journal/posts/20250221.html</link>
   1684 <guid>https://www.mtkn.jp/journal/posts/20250221.html</guid>
   1685 <pubDate>Fri, 21 Feb 2025 00:00:00 +0900</pubDate>
   1686 <description><![CDATA[<h1>着物作った</h1>
   1687 <time>2025-02-21</time>
   1688 <p>
   1689 普段着回している着物がへたってきたので新しいのを仕立てた。楽天で見付けた真綿紬の草木染めである。中古で2640円だった。新品だとおそらく何十万のしろものである。女物だったので解いて洗濯し、男物に仕立て直した。防虫剤の臭いがひどかったが、洗濯すればおおむね取れた。</p>
   1690 
   1691 <p>
   1692 解いた布を重ねてネットに入れ、普通に洗濯する。脱水が済んだら濡れた状態でアイロンをかけてしわをとり陰干しする。絹ものだがこれで特に問題なく洗濯できた。</p>
   1693 
   1694 <p>
   1695 裏地も一緒に洗濯した。これも多分羽二重の高価なものである。ただ袷にするのは面倒なので一重にした。袖付けがなかなか上手くいかずに人形のところが皺になる。居敷当ては箪笥に眠っていた唐草模様の風呂敷を使った。</p>
   1696 
   1697 <figure>
   1698 <img src="20250221.jpg" alt="作った着物">
   1699 </figure>
   1700 
   1701 <p>
   1702 真綿紬は初めてだが、軽くて暖かい。ほどかずに洗濯してよれよれにならなければいいのだが...</p>
   1703 ]]></description>
   1704 </item>
   1705 <item>
   1706 <title>きのかわ弦楽合奏団 さくらコンサート</title>
   1707 <link>https://www.mtkn.jp/journal/posts/20250216.html</link>
   1708 <guid>https://www.mtkn.jp/journal/posts/20250216.html</guid>
   1709 <pubDate>Sun, 16 Feb 2025 00:00:00 +0900</pubDate>
   1710 <description><![CDATA[<h1>きのかわ弦楽合奏団 さくらコンサート</h1>
   1711 <time>2025-02-16</time>
   1712 <p>三月にコンサートあります。</p>
   1713 <figure>
   1714 <img src="20250216-1.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの表面。令和7年3月23日14:00から、旧和歌山県議会議事堂にて">
   1715 <img src="20250216-2.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの裏面。楽団と会場の紹介">
   1716 <figcaption>Copyright: きのかわ弦楽合奏団</figucaption>
   1717 </figure>
   1718 
   1719 ]]></description>
   1720 </item>
   1721 <item>
   1722 <title>謹賀新年</title>
   1723 <link>https://www.mtkn.jp/gallery/20250101.html</link>
   1724 <guid>https://www.mtkn.jp/gallery/20250101.html</guid>
   1725 <pubDate>Wed,  1 Jan 2025 00:00:00 +0900</pubDate>
   1726 <description><![CDATA[<h1>謹賀新年</h1>
   1727 <time>2025-01-01</time>
   1728 <img src="img/20250101.jpg">
   1729 ]]></description>
   1730 </item>
   1731 <item>
   1732 <title>麻婆豆腐</title>
   1733 <link>https://www.mtkn.jp/kitchen/recipe/mapo_tofu.html</link>
   1734 <guid>https://www.mtkn.jp/kitchen/recipe/mapo_tofu.html</guid>
   1735 <pubDate>Thu, 10 Oct 2024 00:00:00 +0900</pubDate>
   1736 <description><![CDATA[<h1>麻婆豆腐</h1>
   1737 <time>2024-10-10</time>作成
   1738 <figure>
   1739 	<img src="../pics/mapo_tofu.jpg" alt="麻婆豆腐の画像">
   1740 	<figcaption>麻婆豆腐</figcaption>
   1741 </figure>
   1742 <div class="recipe-ingredient">
   1743 <h2>材料(4~5人分)</h2>
   1744 <ul>
   1745 	<li>豆腐: 2丁</li>
   1746 	<li>ひき肉: 300g</li>
   1747 	<li>長ネギ: 1本</li>
   1748 	<li>にんにく: 適量</li>
   1749 	<li>生姜: 適量</li>
   1750 	<li>八角: 適量</li>
   1751 	<li>花椒: 好きなだけ</li>
   1752 	<li>豆板醤: 好きなだけ</li>
   1753 	<li>味噌: 適量</li>
   1754 	<li>酒: 適量</li>
   1755 	<li>濃口醤油: 適量</li>
   1756 	<li>塩: 少々</li>
   1757 	<li>炒め油: 多め</li>
   1758 </ul>
   1759 </div>
   1760 
   1761 <div class="recipe-steps">
   1762 <h2>手順</h2>
   1763 <ol>
   1764 	<li>豆腐を水切りしてサイコロに切る</li>
   1765 	<li>長ネギ、にんにく、生姜を刻む</li>
   1766 	<li>フライパンに油をしき八角、にんにく、生姜を入れ弱火で香りを出す</li>
   1767 	<li>火を強めてひき肉を入れ、塩を少しふる</li>
   1768 	<li>ひき肉に色がついたらネギを入れて炒める</li>
   1769 	<li>酒、濃口醤油、味噌、豆板醤で味をつける</li>
   1770 	<li>水を入れてひと煮立ちさせる</li>
   1771 	<li>花椒、豆腐を入れる</li>
   1772 	<li>好みで、ラー油、唐辛子、山椒を好きなだけ入れる</li>
   1773 </ol>
   1774 </div>
   1775 
   1776 <h2>ひとこと</h2>
   1777 <p>我流の適当なレシピなので本場のものが良ければ陳建一さんのでも調べてほしい。</p>
   1778 <p>酒はできれば紹興酒のほうがいいと思う。味噌と一緒に豆鼓も入れていいかも。一般的にはもっと旨味を出すために中華だしやら味の素やらを入れると思うが、シンプルに辛いほうが好きなのでそういうものは入れない。陳さんは生姜を入れていなかったが僕はあっていいと思う。豆腐は塩水で茹でていたがこれは真似してもよさそう。</p>
   1779 ]]></description>
   1780 </item>
   1781 <item>
   1782 <title>棚作った</title>
   1783 <link>https://www.mtkn.jp/journal/posts/20241009.html</link>
   1784 <guid>https://www.mtkn.jp/journal/posts/20241009.html</guid>
   1785 <pubDate>Wed,  9 Oct 2024 00:00:00 +0900</pubDate>
   1786 <description><![CDATA[<h1>棚作った</h1>
   1787 <time></time>
   1788 
   1789 <p>
   1790 自室のクローゼットが使いにくかったので引っ剥がして新しいのを作った。収納していたのはほとんど本だったのだが、奥行きが深いのに棚板が少ないので前後に並べて置いていたため、どこになんの本があるのか見にくく、取り出しにくかった。あとパソコン置き場としても使っていたが、24インチのモニターが一枚ギリギリ入る程度の幅しかなかったのでこれも拡張したかった。久しぶりに木工もしたかったので木材を買って自作した。杉を基本に、パソコンを置く場所だけ檜にした。<p>
   1791 
   1792 <figure>
   1793 <img src="20241009-1.jpg" alt="クローゼット跡地と買った木材">
   1794 <figcaption>クローゼット跡地と買った木材</figcaption>
   1795 </figure>
   1796 
   1797 <figure>
   1798 <img src="20241009-2.jpg" alt="パソコン机の部分">
   1799 <figcaption>パソコン机の部分</figcaption>
   1800 </figure>
   1801 
   1802 <p>
   1803 パソコン机の天板は白木のままでは寂しいので亜麻仁油を塗ってオイルフィニッシュにしてみた。結構黄色が濃くなった。</p>
   1804 
   1805 <figure>
   1806 <img src="20241009-3.jpg" alt="机のオイルフィニッシュ">
   1807 <figcaption>机のオイルフィニッシュ。下においているのが白木のもの</figcaption>
   1808 </figure>
   1809 
   1810 <p>
   1811 せっかくやるならと思って蟻を切ってみた。適当でも案外ガッチリはまるものである。英語ではdovetailというそうだ。鳩のしっぽという意味である。日本語の蟻よりも鳩のしっぽのほうがしっくりくる気がする。</p>
   1812 
   1813 <figure>
   1814 <img src="20241009-4.jpg" alt="蟻">
   1815 <figcaption>蟻</figcaption>
   1816 </figure>
   1817 
   1818 <p>
   1819 上に本棚をつけて完成。本棚は棚を移動しやすいようにと思い、ネジ止め式の棚受けを買った。めんどくさくなったわけではない。左下においているのはもとのクローゼットにあった引き出しである。</p>
   1820 
   1821 <figure>
   1822 <img src="20241009-5.jpg" alt="完成">
   1823 <figcaption>完成</figcaption>
   1824 </figure>
   1825 
   1826 <p>
   1827 これを作るにあたり、大阪日本橋の刃物屋で鉋を買ってきた。これまではホームセンターで1000円ほどのものだったが、今回買ったのは8000円の物である。店主が台の仕込みと研ぎをした上で売ってくれた。きれいに切れるので小口面の直角を出すのが楽しくなった。小口を下にして自立するようになったときは結構気持ちいい。専門店での買い物は楽しい。餅は餅屋である。</p>
   1828 
   1829 ]]></description>
   1830 </item>
   1831 <item>
   1832 <title>さくらクレヨン</title>
   1833 <link>https://www.mtkn.jp/gallery/20240727.html</link>
   1834 <guid>https://www.mtkn.jp/gallery/20240727.html</guid>
   1835 <pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate>
   1836 <description><![CDATA[<h1>さくらクレヨン</h1>
   1837 <time>2024-07-27</time>
   1838 <img src="img/20240727.jpg">
   1839 ]]></description>
   1840 </item>
   1841 <item>
   1842 <title>さくらクレパス</title>
   1843 <link>https://www.mtkn.jp/gallery/20240702.html</link>
   1844 <guid>https://www.mtkn.jp/gallery/20240702.html</guid>
   1845 <pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate>
   1846 <description><![CDATA[<h1>さくらクレパス</h1>
   1847 <time>2024-07-02</time>
   1848 <img src="img/20240702.jpg">
   1849 ]]></description>
   1850 </item>
   1851 <item>
   1852 <title>さくらクレパス</title>
   1853 <link>https://www.mtkn.jp/gallery/20240629.html</link>
   1854 <guid>https://www.mtkn.jp/gallery/20240629.html</guid>
   1855 <pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate>
   1856 <description><![CDATA[<h1>さくらクレパス</h1>
   1857 <time>2024-06-29</time>
   1858 <img src="img/20240629.jpg">
   1859 ]]></description>
   1860 </item>
   1861 <item>
   1862 <title>さくらクレパス</title>
   1863 <link>https://www.mtkn.jp/gallery/20240628.html</link>
   1864 <guid>https://www.mtkn.jp/gallery/20240628.html</guid>
   1865 <pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate>
   1866 <description><![CDATA[<h1>さくらクレパス</h1>
   1867 <time>2024-06-28</time>
   1868 <img src="img/20240628.jpg">
   1869 ]]></description>
   1870 </item>
   1871 <item>
   1872 <title>きのかわ弦楽合奏団第7回定期演奏会</title>
   1873 <link>https://www.mtkn.jp/journal/posts/20240428.html</link>
   1874 <guid>https://www.mtkn.jp/journal/posts/20240428.html</guid>
   1875 <pubDate>Sun, 28 Apr 2024 00:00:00 +0900</pubDate>
   1876 <description><![CDATA[<h1>きのかわ弦楽合奏団第7回定期演奏会</h1>
   1877 <time>2024-04-28</time>
   1878 
   1879 <p>先日きのかわ弦楽合奏団というアマチュアの団体に入団しました。その定期演奏会が7月にあります。多分出演します。</p>
   1880 
   1881 <figure>
   1882 <img src="7th_concert.jpeg" alt="きのかわ弦楽合奏団の第七回定期演奏会のポスター。7月14日14:00から、かつらぎ総合文化会館、あじさいホールにて">
   1883 <figcaption>Copyright: きのかわ弦楽合奏団</figcaption>
   1884 </figure>
   1885 
   1886 ]]></description>
   1887 </item>
   1888 <item>
   1889 <title>RP2040 SDKなし2 Clock、UART</title>
   1890 <link>https://www.mtkn.jp/computer/rp2040_2.html</link>
   1891 <guid>https://www.mtkn.jp/computer/rp2040_2.html</guid>
   1892 <pubDate>Tue, 27 Feb 2024 00:00:00 +0900</pubDate>
   1893 <description><![CDATA[<h1>RP2040 SDKなし2 Clock、UART</h1>
   1894 <time>2024-02-22</time><br />
   1895 <time>2024-02-27</time>: リセット解除の間違いを修正。
   1896 <p>
   1897 今回はClockとUARTを設定してパソコンに繋ぎ、キーボードからの入力をオウム返しするプログラムを作成する。
   1898 <p>
   1899 <p>
   1900 前回: <a href="rp2040_1.html">RP2040 SDKなしでLチカ</a><br>
   1901 ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex2
   1902 </p>
   1903 
   1904 <h2>動作環境</h2>
   1905 <ul>
   1906 <li>Void Linux
   1907 	<ul>
   1908 	<li>cross-arm-none-eabi-binutils-2.32_2</li>
   1909 	<li>GNU Make 4.4.1</li>
   1910 	<li>minicom version 2.7.1</li>
   1911 	</ul>
   1912 </li>
   1913 <li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a>
   1914 </li>
   1915 </ul>
   1916 
   1917 <h2>Clock</h2>
   1918 
   1919 <h3>リング発振回路</h3>
   1920 <p>RP2040にはリング発振回路というのが内蔵されている。これは自分の出力を反転させようとするもので、不安定だが高速で消費電力の少ないクロックとして用いられる。RP2040は電源を入れると、このリング発振回路を動作用のクロックとして用いている。この発振回路の周波数は、チップの製造過程での誤差、動作時の電圧、動作温度によって変動するので、正確な周波数が必要な用途には向かない。</p>
   1921 
   1922 <h3>水晶発振子</h3>
   1923 <p>秋月電子通商で購入したRP2040マイコンボードには外部クロックとして、12MHzの水晶発振子が付属する。水晶発振子はリング発振回路より電力を消費するが、より正確である。</p>
   1924 
   1925 <h3>PLL</h3>
   1926 <p>水晶振動子を入力として、周波数を数倍にしたものを出力するもの。電気的な話はよく知らない。データシートの「2.18.2. Calcurating PLL parameters」によると、入力周波数を<code>FREF</code>としたときの出力周波数は<code>(FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2)</code>となる。これらの変数はそれぞれ設定用のレジスタに値を保存することで変更できる。</p>
   1927 
   1928 <h2>UART</h2>
   1929 <p>
   1930 Universal Asynchronous Receiver/Transmitterの略。2本の線だけで通信できる。プロトコルは詳しく知らないが、rp2040がよしなにやってくれる。rp2040では同時に二個まで利用できる。どのGPIOピンを使うかもある程度自由に選べる。どのピンが使えるかはデータシートの「2.19.2. Function Select」に書かれている。今回はGPIO0とGPIO1を使う。パソコンとの接続には、秋月電子通商で売っている<a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a>を使用した。UARTで接続するためのパソコン側のソフトウェアはminicomを使用した。僕の環境ではシリアル変換モジュールをパソコンにUSB接続すると、<code>/dev/ttyUSB0</code>として認識されるので、</p>
   1931 <pre><code>$ minicom -D /dev/ttyUSB0
   1932 </code></pre>
   1933 <p>
   1934 とすると接続できる。
   1935 </p>
   1936 
   1937 <h2>main.s</h2>
   1938 <h3>初期設定</h3>
   1939 <p>
   1940 後で見るように、UARTの動作には多分水晶発振子とPLLが必要なので、まずはそれを設定する。起動後、メインのプログラムが読み込まれるまでの<code>boot2</code>は前回と同じものである。<code>main.s</code>ではまず前回と同様に初期スタックポインタとエントリーポイントを定義する:
   1941 </p>
   1942 <pre><code>	.section .vectors
   1943 vectors:
   1944 	.word 0x20040000 // initial SP
   1945 	.word (reset+1)  // entry point
   1946 </code></pre>
   1947 <p>
   1948 続いて利用するサブシステムのリセットを解除する。PLLとUARTが追加されている。今回使うUARTはUART0だけである。なお、UARTはclock_periが有効化されるまでリセット状態の解除が完了しないようなので、unreset_chkからは外してある:</p>
   1949 <pre><code>	.section .text
   1950 reset:
   1951 	// unreset gpio, pll_sys, uart0
   1952 	ldr r0, =(1 &lt;&lt; 22 | 1 &lt;&lt; 12 | 1 &lt;&lt; 5) // uart0 | pll_sys | io_bank0
   1953 	ldr r3, resets_base
   1954 	ldr r1, atomic_clr
   1955 	str r0, [r3, r1] // RESETS: RESET
   1956 	mov r1, #1
   1957 	lsl r1, #22
   1958 	bic r0, r1 // uart stays in reset state until clock_peri is enabled
   1959 unreset_chk:
   1960 	ldr r1, [r3, #0x8] // RESETS: RESET_DONE
   1961 	bic r0, r1
   1962 	bne unreset_chk
   1963 
   1964 /* ... */
   1965 
   1966 atomic_clr:
   1967 	.word 0x00003000
   1968 resets_base:
   1969 	.word 0x4000c000
   1970 </code></pre>
   1971 
   1972 <h3>GPIOの設定</h3>
   1973 <p>
   1974 次にGPIOの役割を設定する。前回はLEDを点滅させるためにGPIO25をSIOに設定したが、今回はGPIO0とGPIO1をUART0にする:
   1975 </p>
   1976 <pre><code>	// set gpio functions
   1977 	ldr r3, io_bank0_base
   1978 	mov r0, #2 // uart0
   1979 	mov r1, #0x4
   1980 	str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL
   1981 	mov r1, #0xc
   1982 	str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL
   1983 
   1984 /* ... */
   1985 
   1986 io_bank0_base:
   1987 	.word 0x40014000
   1988 </code></pre>
   1989 
   1990 <h3>Clockの設定</h3>
   1991 <p>
   1992 Clockの設定をする。まずは水晶発振子を起動する。水晶発振子は起動してから周波数が安定するまで少し時間がかかるようで、その間待たないといけない。この時間は1msあれば十分だとデータシートに書いている。この待ち時間はXOSC: STARTUPレジスタに、256サイクル単位で記述する。データシートによると初期のリング発振子は最大で12MHzなので、<code>(12 * 10^6 * 1 * 10^-3) / 256 = 47</code>をこのレジスタにセットする。ところでデータシートではこの計算はリング発振子ではなく水晶発振子の周波数で書かれている。起動直後でまだ使えない水晶発振子の周波数を使うのはなんでやろ。SDKでも<code>pico-sdk/src/rp2_common/hardware_xosc/xosc.c</code>で、
   1993 </p>
   1994 <pre><code>#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER)
   1995 </code></pre>
   1996 <p>
   1997 と定義されている(PICO_XOSC_STARTUP_DELAY_MULTIPLIERは1)。とりあえず47に設定しているが、試しに0や1にしても動いた。よくわからん。</p>
   1998 <p>
   1999 待ち時間を設定したら発振子を起動する。XOSC: CTRLに起動用のコマンド的なものを入力し、周波数が安定するのを待つ。</p>
   2000 <p>
   2001 以上を実装したのが以下のコード:
   2002 </p>
   2003 <pre><code>	// setup xosc
   2004 	ldr r3, xosc_base
   2005 	mov r0, #47 // start up delay for 12MHz rosc (xosc?)
   2006 	str r0, [r3, #0xc] // XOSC: STARTUP
   2007 	ldr r0, =(0xfab &lt;&lt; 12 | 0xaa0)
   2008 	str r0, [r3, #0] // XOSC: CTRL
   2009 wait_xosc:
   2010 	ldr r0, [r3, #0x4] // XOSC: STATUS
   2011 	lsr r0, r0, #31 // STABLE bit
   2012 	beq wait_xosc
   2013 
   2014 /* ... */
   2015 
   2016 xosc_base:
   2017 	.word 0x40024000
   2018 </code></pre>
   2019 
   2020 <h3>PLLの設定</h3>
   2021 <p>
   2022 水晶発振子が起動できたので、次にPLLを設定する。CPUが133MHzまで対応しているので133MHzになるようにした。</p>
   2023 <p>
   2024 PLLは入力となる振動(ここでは水晶発振子の振動)を加工して周波数を上げたり下げたりする。出力の周波数は以下の式で決まる:
   2025 </p>
   2026 <pre>(FREF / REFDIV) * FBDIV / (POSTDIV1 * POSTDIV2)</pre>
   2027 <p>
   2028 FREFは入力の周波数(ここでは12MHz)で、その他の変数はプログラマが設定できる。ただしデータシートによると(FREF / REFDIV)は5MHz以上でないといけないので、REFDIVは1である。また、FBDIVは16〜320、POSTDIV1とPOSTDIV2は1〜7で、POSTDIV1とPOSTDIV2に違う値を代入する場合、POSTDIV1に大きい方を入れたほうが消費電力が少なくなるとのことなので、133MHzにするには、FBDIV=133、POSTDIV1=6、POSTDIV=2とすればいい(POSTDIV1=4、POSTDIV2=3も可能だが、pico-sdkに付属するvcocalc.pyというスクリプトのコメントには、この2つの値の差が大きい方がいいと書いている)。
   2029 </p>
   2030 <p>
   2031 PLL設定の手順は、FBDIVの設定、PLLとVCOの起動、VOCが安定するまで待機、POSTDIV1とPOSTDIV2の設定、Post Dividerの起動、そして最後にシステムとUARTのクロックを今設定したPLLに変更、である。以上を実装したのが以下のコード:
   2032 </p>
   2033 <pre><code>	// setup pll_sys 133MHz
   2034 	ldr r3, pll_sys_base
   2035 	// set feedback divider
   2036 	mov r0, #133
   2037 	str r0, [r3, #0x8] // PLL: FBDIV_INT
   2038 	// power on pll and vco
   2039 	ldr r0, =(1 &lt;&lt; 5 | 1) // VCOPD | PD
   2040 	ldr r1, atomic_clr
   2041 	add r1, r1, #0x4
   2042 	str r0, [r3, r1] // PLL: PWR
   2043 	// wait vco to lock
   2044 wait_vco:
   2045 	ldr r0, [r3, #0] // PLL: CS
   2046 	lsl r0, r0, #31
   2047 	beq wait_vco
   2048 	// setup post dividers
   2049 	ldr r0, =(4 &lt;&lt; 16 | 3 &lt;&lt; 12)
   2050 	str r0, [r3, #0xc] // PLL: PRIM
   2051 	// power on post divider
   2052 	mov r0, #8 // POSTDIVPD
   2053 	str r0, [r3, r1] // PLL: PWR
   2054 
   2055 	// set system clock clksrc_pll_sys
   2056 	ldr r3, clocks_base
   2057 	ldr r0, =(0x0 &lt;&lt; 5 | 0x1)
   2058 	str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL
   2059 	// enable clk_peri
   2060 	mov r0, #1
   2061 	lsl r0, r0, #11
   2062 	str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL
   2063 
   2064 /* ... */
   2065 
   2066 atomic_clr:
   2067 	.word 0x00003000
   2068 clocks_base:
   2069 	.word 0x40008000
   2070 pll_sys_base:
   2071 	.word 0x40028000
   2072 </code></pre>
   2073 
   2074 <h3>UARTの設定</h3>
   2075 <p>
   2076 データシートによるとUART設定の手順は以下の通り:
   2077 </p>
   2078 <ul>
   2079 <li>リセットの解除</li>
   2080 <li>clock_periの設定</li>
   2081 <li>UARTの有効化</li>
   2082 <li>FIFOの有効化</li>
   2083 <li>転送速度の設定</li>
   2084 <li>フォーマットの設定</li>
   2085 </ul>
   2086 <p>
   2087 上の2つは既に終えている。残りの部分はこの順番どおりに設定しても動かなかった。C言語で書かれたサンプルを見ると、クロックを設定した後、転送速度の設定、UARTの有効化、FIFOの有効化の順になっている。そのとおりにすると動いた。理由はよく理解していないが、変数を設定してから起動するほうが素直ではある。</p>
   2088 <p>
   2089 転送速度はminicomのデフォルトである115200 baudに設定する。データシート「4.2.7.1. Baud Rate Calculation」の計算式において、クロック周波数を125MHzから133MHzに変えて計算して、BRDI=72、BDRF=0.157(=10/64)となる。この数値をUART: UARTIBRD、UART: UARTFBRDレジスタにそれぞれ代入する。
   2090 </p>
   2091 <p>
   2092 UARTの有効化はUART: UARTCRレジスタのUARTENビットをセットすることで行う。C言語のサンプルでは同じレジスタのRXE、TXEビットもセットしているが、この2つはもともと1になっているのでほっといてよさそう。</p>
   2093 <p>
   2094 FIFOの有効化はUART: UARTLCR_HレジスタのFENビットをセットすることで行う。また、同じレジスタの他のビットで、データーのフォーマットを設定できる。ここではminicomのデフォルトに合わせてWLENを8bitにする。</p>
   2095 <p>
   2096 以上をまとめると以下のようになる:
   2097 </p>
   2098 <pre><code>	// setup uart0
   2099 	ldr r3, uart0_base
   2100 	// set baudrate 115200
   2101 	// BDRI = 72, BDRF = 0.157 (10 / 64)
   2102 	mov r0, #72
   2103 	str r0, [r3, #0x24] // UART: UARTIBRD
   2104 	mov r0, #10
   2105 	str r0, [r3, #0x28] // UART: UARTFBRD
   2106 	// enable uart0
   2107 	mov r0, #1 // UARTEN
   2108 	ldr r1, atomic_set
   2109 	add r1, r1, #0x30
   2110 	str r0, [r3, r1] // UART: UARTCR
   2111 	// enable FIFO and set format
   2112 	ldr r0, =(3 &lt;&lt; 5 | 1 &lt;&lt; 4) // WLEN = 8, FEN = 1
   2113 	str r0, [r3, #0x2c] // UART: UARTLCR_H
   2114 
   2115 /* ... */
   2116 
   2117 atomic_set:
   2118 	.word 0x00002000
   2119 uart0_base:
   2120 	.word 0x40034000
   2121 </code></pre>
   2122 
   2123 <h3>UARTの入出力</h3>
   2124 <p>
   2125 設定が終わったので実際にUARTの入出力を処理するコードを書く。まずUARTからの出力は、出力したいバイトをUART: UARTDRに書き込むことで行う。その際、書き込まれたデータは一時的に出力用FIFOに保持されるので、このFIFOが満杯でないことを確認する必要がある。FIFOの状態はUART: UARTFRレジスタで確認できる。このレジスタのTXFFの値が1であればデータを書き込めないので、0になるまで待機する。関数名は<code>putbyte</code>にした。また出力したいデータは<code>r0</code>レジスタにの下位8ビットに入れられているものとした。書き込めるデーターは8ビットだけなので、<code>0xff</code>と論理積をとってから書き込んでいる:
   2126 </p>
   2127 <pre><code>putbyte:
   2128 	ldr r3, uart0_base
   2129 	mov r1, #1
   2130 	lsl r1, r1, #5 // TXFF
   2131 txff:
   2132 	ldr r2, [r3, #0x18] // UART: UARTFR
   2133 	tst r1, r2
   2134 	bne txff
   2135 	mov r1, #0xff
   2136 	and r0, r0, r1
   2137 	str r0, [r3, #0] // UART: UARTDR
   2138 	bx lr
   2139 
   2140 /* ... */
   2141 
   2142 uart0_base:
   2143 	.word 0x40034000
   2144 </code></pre>
   2145 
   2146 <p>
   2147 入力はUART: UARTDRの下位8ビットを読むことで得られる。UARTからの入力は、一時的に入力用FIFOに保存される。このFIFOが空の状態でデータを読んでも意味がないので、FIFOが空でないことを確認する必要がある。これはUART: UARTFRレジスタのRXFEを読むことで確認できる。本来は入力があったときに割り込みを発生させて、それまではCPUを休ませるか別の処理をさせておくべきだが、とりあえずここではループでFIFOの状態を確認し続けている。関数名は<code>getbyte</code>にした。
   2148 読み込んだデータは<code>r0</code>レジスタに保存している:</p>
   2149 <pre><code>getbyte:
   2150 	ldr r3, uart0_base
   2151 	mov r1, #1
   2152 	lsl r1, r1, #4 // RXFE
   2153 rxfe:
   2154 	ldr r2, [r3, #0x18] // UART: UARTFR
   2155 	tst r1, r2
   2156 	bne rxfe
   2157 	ldr r0, [r3, #0] // UART: UARTDR
   2158 	mov r1, #0xff
   2159 	and r0, r0, r1
   2160 	bx lr
   2161 
   2162 /* ... */
   2163 
   2164 uart0_base:
   2165 	.word 0x40034000
   2166 </code></pre>
   2167 <p>
   2168 あとはこの2つの関数をループの中で交互に呼び出せば、オウム返しするだけのプログラムが完成する:
   2169 </p>
   2170 <pre><code>loop:
   2171 	bl getbyte
   2172 	bl putbyte
   2173 	b loop
   2174 </code></pre>
   2175 
   2176 <h2>リング発振回路でUARTは動くんかな?</h2>
   2177 <p>UARTの通信には正確なクロックが必要である。その為上では<code>clk_peri</code>として水晶発振子とPLLを用いた。ところがpico-examplesのhello_uartでは<code>main()</code>関数で水晶発振子を設定していない。そこでリング発振回路を用いてみたのだが、どうもうまく通信できない。出力されている正確な周波数も分からないのであきらめることにした。オシロスコープなんていうものは持っていない。</p>
   2178 
   2179 <h3>pico-sdk</h3>
   2180 <p>
   2181 ところがどうも調べているとSDKを使った場合、デフォルトではクロック周波数は125MHzになっているらしい。どうやら水晶発振子もPLLも<code>main()</code>が呼ばれる前に設定されているようである。</p>
   2182 <p>
   2183 pico-examplesのサンプルプログラムはビルドすると自動で逆アセンブリしたファイルを出力してくれる。これを見ると、最初の256バイトは前回説明したboot2のコードで、その後ろにベクターテーブルが続く。ベクターテーブルの最初は初期スタックポインタで、<code>0x20042000</code>になっている。次はエントリーポイントで、<code>0x100001f7</code>である:</p>
   2184 <pre><code>10000100 &lt;__VECTOR_TABLE&gt;:
   2185 10000100:	20042000 	.word	0x20042000
   2186 10000104:	100001f7 	.word	0x100001f7
   2187 </code></pre>
   2188 <p>
   2189 Thumbモードなので実際のエントリーポイントは<code>1</code>引いた、<code>0x100001f6</code>である。この場所ではまず自分のCPUIDを調べて、<code>1</code>であれば待機状態に移行する。RP2040はデュアルコアである。起動直後はCPUIDが<code>0</code>のコアだけで処理をして、CPUIDが<code>1</code>のコアはプログラマが必要に応じて起動することになっている。このためCPUIDが<code>1</code>のコアは起動してすぐに待機状態に入ることがデータシートに書かれている。しかしこの処理はユーザーの書いたプログラムじゃなくて内蔵ROMにある起動用プログラムが担当するみたいに書かれてるんやけど、なんでSDKではユーザープログラムの一部として組み込んでるんかな?
   2190 </p>
   2191 <pre><code>100001f6 &lt;_reset_handler&gt;:
   2192 100001f6:	481d      	ldr	r0, [pc, #116]	; (1000026c &lt;hold_non_core0_in_bootrom+0xe&gt;)
   2193 100001f8:	6800      	ldr	r0, [r0, #0]
   2194 100001fa:	2800      	cmp	r0, #0
   2195 100001fc:	d12f      	bne.n	1000025e &lt;hold_non_core0_in_bootrom&gt;
   2196 </code></pre>
   2197 <p>上のコードの最初の<code>ldr</code>は、<code>0xd0000000</code>(M0PLUS: CPUIDレジスタ)をロードしている。最後の飛び先<code>0x1000025e</code>はCPUIDが<code>1</code>のCPUを待機させる処理である:</p>
   2198 <pre><code>1000025e &lt;hold_non_core0_in_bootrom&gt;:
   2199 1000025e:	4809      	ldr	r0, [pc, #36]	; (10000284 &lt;hold_non_core0_in_bootrom+0x26&gt;)
   2200 10000260:	f001 fb9c 	bl	1000199c &lt;rom_func_lookup&gt;
   2201 10000264:	4700      	bx	r0
   2202 10000266:	0000      	.short	0x0000
   2203 /* ... */
   2204 10000284:	00005657 	.word	0x00005657
   2205 </code></pre>
   2206 <p>内蔵フラッシュに書きこまれた関数を呼びだしている。呼びだしに使うコードは<code>0x00005657</code>(<code>'W' | 'V' &lt;&lt; 8</code>)である。データシートを見ると、この関数は<code>_wait_for_vector()</code>という名前で、CPUIDが1のCPUを寝かしつけるのに使われると書いている。この部分のソースコードをpico-sdkで探すと<code>pico-sdk/src/rp2_common/pico_standard_link/crt0.S</code>というのが見付かった:</p>
   2207 <pre><code>$ find pico-sdk/src -type f | xargs grep -l _reset_handler
   2208 pico-sdk/src/rp2_common/pico_standard_link/crt0.S
   2209 </code></pre>
   2210 <p>このファイルによると:
   2211 </p>
   2212 <pre><code>	// Only core 0 should run the C runtime startup code; core 1 is normally
   2213 	// sleeping in the bootrom at this point but check to be sure
   2214 </code></pre>
   2215 <p>だそうである。やっぱり無駄やん。内蔵フラッシュのプログラムにバグがあってもこのコードのせいで見付かりにくくなってない?知らんけど。</p>
   2216 
   2217 <p>続いて<code>.data</code>領域と<code>.bss</code>領域のコピー、初期化のようである。多分OSの本かなんかで習ったメモリマップの話:</p>
   2218 <pre><code>100001fe:	a40d      	add	r4, pc, #52	; (adr r4, 10000234 &lt;data_cpy_table&gt;)
   2219 10000200:	cc0e      	ldmia	r4!, {r1, r2, r3}
   2220 10000202:	2900      	cmp	r1, #0
   2221 10000204:	d002      	beq.n	1000020c &lt;_reset_handler+0x16&gt;
   2222 10000206:	f000 f812 	bl	1000022e &lt;data_cpy&gt;
   2223 1000020a:	e7f9      	b.n	10000200 &lt;_reset_handler+0xa&gt;
   2224 1000020c:	4918      	ldr	r1, [pc, #96]	; (10000270 &lt;hold_non_core0_in_bootrom+0x12&gt;)
   2225 1000020e:	4a19      	ldr	r2, [pc, #100]	; (10000274 &lt;hold_non_core0_in_bootrom+0x16&gt;)
   2226 10000210:	2000      	movs	r0, #0
   2227 10000212:	e000      	b.n	10000216 &lt;bss_fill_test&gt;
   2228 
   2229 10000214 &lt;bss_fill_loop&gt;:
   2230 10000214:	c101      	stmia	r1!, {r0}
   2231 
   2232 10000216 &lt;bss_fill_test&gt;:
   2233 10000216:	4291      	cmp	r1, r2
   2234 10000218:	d1fc      	bne.n	10000214 &lt;bss_fill_loop&gt;
   2235 </code></pre>
   2236 
   2237 <p>最後にいろいろ呼びだす:</p>
   2238 <pre><code>1000021a &lt;platform_entry&gt;:
   2239 1000021a:	4917      	ldr	r1, [pc, #92]	; (10000278 &lt;hold_non_core0_in_bootrom+0x1a&gt;)
   2240 1000021c:	4788      	blx	r1
   2241 1000021e:	4917      	ldr	r1, [pc, #92]	; (1000027c &lt;hold_non_core0_in_bootrom+0x1e&gt;)
   2242 10000220:	4788      	blx	r1
   2243 10000222:	4917      	ldr	r1, [pc, #92]	; (10000280 &lt;hold_non_core0_in_bootrom+0x22&gt;)
   2244 10000224:	4788      	blx	r1
   2245 10000226:	be00      	bkpt	0x0000
   2246 10000228:	e7fd      	b.n	10000226 &lt;platform_entry+0xc&gt;
   2247 /* ... */
   2248 10000278:	10001819 	.word	0x10001819
   2249 1000027c:	100002dd 	.word	0x100002dd
   2250 10000280:	10001909 	.word	0x10001909
   2251 </code></pre>
   2252 <p>一つめの<code>blx</code>は<code>0x10001818</code>(<code>runtime_init</code>)を、二つめは<code>0x100002dc</code>(<code>main</code>)を、最後のは<code>0x10001908</code>(<code>exit</code>)を、それぞれ呼んでいる。この<code>runtime_init</code>はアセンブリでは分かりにくいのでソースコードを探してみると、以下のものが見付かった:</p>
   2253 <pre><code>$ find pico-sdk/src -type f | xargs grep -l runtime_init
   2254 pico-sdk/src/rp2_common/pico_runtime/runtime.c
   2255 pico-sdk/src/rp2_common/pico_standard_link/crt0.S
   2256 pico-sdk/src/common/pico_sync/include/pico/mutex.h
   2257 </code></pre>
   2258 <p>最後の<code>mutex.h</code>は関係なさそう。二つめの<code>crt0.S</code>は呼びだしてるだけ。一つめの<code>runtime.c</code>が多分探しているものである。これを見るとまず各種周辺機器を一度リセットし、リセット状態を解除している。使わんやつも初期化してない?その後<code>clocks_init()</code>を呼んでいる。この関数は<code>pico-sdk/src/rp2_common/hardware_clocks/clocks.c</code>で定義されている。これを見ると、<code>xosc_init()</code>を呼んで水晶発振子を初期化した後、<code>clk_peri</code>を125MHzに設定している:</p>
   2259 <pre><code>    clock_configure(clk_peri,
   2260                     0,
   2261                     CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS,
   2262                     125 * MHZ,
   2263                     125 * MHZ);
   2264 </code></pre>
   2265 <p>やっぱり水晶発振子じゃないとあかんのかな。</p>
   2266 
   2267 <h2>CMake</h2>
   2268 <p>上ではビルドしたバイナリを逆アッセンブルして読んだ。わざわざこんなことをしなくてもMakefile読めばなにがどうなって最終生成物に辿りつくのか分かればいいのだが、そうもいかない。このSDKとpico-examplesにはビルドシステムとしてCMakeなるものが使われている。これがどうも複雑でよく分からない。勉強する気にもならん。上で見た<code>crt0.S</code>や<code>runtime.c</code>といったファイルも<code>hello_uart</code>で本当に使われているものなのかもよく分からない。こんな煩雑なものは本当に必要なのかな。無駄に複雑にしてるだけとちゃうんかな。特に僕は勉強用に使ってるので、ソースコードの依存関係をもっと分かりやすくしてくれないと、内部でなにがどうなってるのか理解しにくい。何度か頑張って読もうとしたが、面白くないのでやめた。数百行のファイルをあっちからこっちから<code>include</code>してるし、大文字ばかりの変数だらけで目が痛い。こんなものを扱えるというのはえらいええ頭してはるんやね。</p>
   2269 
   2270 
   2271 <h2>参考</h2>
   2272 <ul>
   2273 <li>
   2274 <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a>
   2275 </li>
   2276 <li>
   2277 <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a>
   2278 </li>
   2279 <li>
   2280 <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a>
   2281 </li>
   2282 <li>
   2283 <a href="https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%AA%E3%82%B7%E3%83%AC%E3%83%BC%E3%82%BF">リング・オシレータ.Wikipedia</a>
   2284 </li>
   2285 <li>
   2286 <a href="https://www5.epsondevice.com/ja/information/technical_info/osc.html">水晶発振器とは? 原理と仕組み、水晶振動子との違い、選び方のポイントを解説.エプソン水晶デバイス</a>
   2287 </li>
   2288 </ul>
   2289 ]]></description>
   2290 </item>
   2291 <item>
   2292 <title>RP2040 SDKなしでLチカ</title>
   2293 <link>https://www.mtkn.jp/computer/rp2040_1.html</link>
   2294 <guid>https://www.mtkn.jp/computer/rp2040_1.html</guid>
   2295 <pubDate>Sun, 25 Feb 2024 00:00:00 +0900</pubDate>
   2296 <description><![CDATA[<h1>RP2040 SDKなしでLチカ</h1>
   2297 <time>2023-04-25</time>: 作成<br />
   2298 <time>2024-02-25</time>: ベクターテーブルの修正
   2299 
   2300 <h2>はじめに</h2>
   2301 <p>
   2302 パタヘネのRISC-V<sup>[1]</sup>版を買って一通り読んだらアセンブリ言語で組込のプログラミングがしたくなった。RISC-Vのマイコンボードが欲しかったのだが、安くていい感じのものが見付からなかった。代わりに秋月電子通商でArmのものがあった。RP2040マイコンボードキット<sup>[2]</sup>というものである。ウェブ上の情報も多く、データシート<sup>[3]</sup>もしっかりしていそうなので、とりあえずこれを買ってみた。</p>
   2303 <p>
   2304 一般的にはSDK<sup>[4]</sup>をダウンロードしてあらかじめ用意されたライブラリを使って開発するようだが、これはビルドシステムとしてcmakeというのを使っている。これがOpenBSDでは何かエラーがでて動かなかった。僕はこういう便利ツールが嫌いだ。どうせ使わんからいいんやけど。関係ないけど途中から開発環境がLinuxに替わった。SDKには便利な関数がたくさん用意されているので楽である。ハードウェアの面倒な部分がプログラマから見えないようにしているからである。しかし今回はその面倒な部分に触れてみたくて買ったので、SDKを使うと意味がない。</p>
   2305 <p>
   2306 ということでSDKなしで開発してみる。とりあえず定番のLチカをば。</p>
   2307 <p>
   2308 ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>
   2309 </p>
   2310 
   2311 <h2>動作環境</h2>
   2312 <ul>
   2313 <li>Arch Linux 6.2.12-arch1-1
   2314 	<ul>
   2315 	<li>arm-none-eabi-binutils 2.40-1</li>
   2316 	<li>GNU Make 4.4.1</li>
   2317 	</ul>
   2318 </li>
   2319 <li>OpenBSD 7.3
   2320 	<ul>
   2321 	<li>arm-none-eabi-binutils 2.31.1</li>
   2322 	<li>make (バージョン?)</li>
   2323 	</ul>
   2324 ※<code>make flash</code>は動かん。<code>dmesg</code>でデバイス確認して手動でマウントする必要がある。
   2325 </li>
   2326 </ul>
   2327 
   2328 <h2>Boot Process</h2>
   2329 <p>
   2330 RP2040は電源を入れるといくつかの段階(ここでは関係ないので省略。データシート「2.8.1 Processor Controlled Boot Sequence」に詳しく書いてある)を踏んだあと、外部のフラッシュROMの先頭から256バイトを内部のSRAMにコピーして、フラッシュにプログラムが書き込まれているかどうか確認する。RP2040はフラッシュの先頭252バイトから計算したCRC32チェックサムを、直後の253バイト目から256バイトに記録することになっている。起動時にこのチェックサムを確認することで、フラッシュにプログラムが書き込まれているかどうか確かめている。コピーした最後の4バイトと起動時に最初の252バイトから計算したチェックサムが一致していれば、そのままコピーしてきた256バイトの先頭にPCをセットして実行を開始する。一致しなければUSBデバイスモードに切り替わり、パソコンに接続するとストレージとして認識される。このストレージにUF2という形式に変換したプログラムをコピーするとプログラムがフラッシュROMやSRAMに書き込まれる。
   2331 </p>
   2332 <p>
   2333 以上のことから、プログラムを実行するためにはCRC32を計算し、UF2という形式に変換することが必要である。ソースコードからの流れは以下の通り:
   2334 </p>
   2335 <pre>source                                                       bin             bin with
   2336 code   ----------&gt; object ------&gt; elf --------&gt; bin -------&gt; with  --------&gt; crc32 in
   2337                                                              crc32           uf2 format
   2338         assemble           link        objcopy       bincrc         bin2uf2
   2339 </pre>
   2340 
   2341 <h2>CRC(巡回冗長検査)</h2>
   2342 <p>
   2343 入力のデータをごにょごにょしてある値を出力する。</p>
   2344 <blockquote cite="https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB">
   2345 <p>
   2346 データ転送等に伴う偶発的な誤りの検査によく使われている<sup>[5]</sup>。
   2347 </p>
   2348 </blockquote>
   2349 <p>
   2350 らしい。
   2351 </p>
   2352 <p>
   2353 入力のビットを一列に並べて、除数で「割り算」していく。この「割り算」が多項式の除算に似ているので、この除数をCRC多項式というらしい。ただし多項式の除算と違い、引き算するところをXORする。CRC32の場合、除数は33ビットである。33ビットで割ると32ビットの余りが残る。この余りがCRC32のチェックサムである。除数は色々あるようだが、標準的なものがWikipedia<sup>[5]</sup>に列挙されている。除数<code>1011</code>を使ったCRC3の計算の手順は以下の通り:
   2354 </p>
   2355 <pre><code>1110101011011100110101101101111  入力(適当)
   2356 1011                             除数(4ビット)
   2357 -------------------------------
   2358  101101011011100110101101101111  結果(入力と除数のXOR)
   2359  1011
   2360  ------------------------------
   2361   00001011011100110101101101111
   2362       1011
   2363       -------------------------
   2364        000011100110101101101111
   2365 	   1011
   2366 	   --------------------
   2367             1010110101101101111
   2368 	    1011
   2369 	    -------------------
   2370              001110101101101111
   2371 	       1011
   2372 	       ----------------
   2373                 101101101101111
   2374 		1011
   2375 		---------------
   2376                  00001101101111
   2377 		     1011
   2378 		     ----------
   2379                       110101111
   2380 		      1011
   2381 		      ---------
   2382                        11001111
   2383 		       1011
   2384 		       --------
   2385                         1111111
   2386 			1011
   2387 			-------
   2388                          100111
   2389 			 1011
   2390 			 ------
   2391                           01011
   2392 			   1011
   2393 			   ----
   2394 			    000  CRC3チェックサム
   2395 </code></pre>
   2396 <p>
   2397 普通の割り算と基本は同じであるが、引き算の部分だけXORになっている。</p>
   2398 <p>
   2399 以上の計算をプログラムの先頭252バイトに対して、33ビットの除数を用いて行う。データの並べ方は、上の例において左側を先頭に、フラッシュROM上の0番地から、各バイトは最上位ビットから順に並べる。入力のデータは253バイト目から256バイト目に<code>0</code>をひっつけて計算する。これは多分予め長さが分からないデータでも計算できるようにしたかったからかな。除数は<code>0x104c11db7</code>である(最上位ビットは常に1なのでデータシートでは省略されている)。</p>
   2400 <p>
   2401 入力データは1バイトづつ処理したいみたいである。多分通信等で使う都合である。この時XORは結合則が成り立つので1バイト処理した結果と次のバイトとをXORして次の処理の入力として利用することができる:
   2402 </p>
   2403 <pre><code>111000111000000110000110111000111000001010010011111000111000000110010011  入力(適当)
   2404 |......|
   2405 111000110000000000000000000000000                                         先頭1バイト
   2406 100000100110000010001110110110111                                         除数
   2407 ------------------------------------------------------------------------
   2408 011000010110000010001110110110111
   2409  100000100110000010001110110110111
   2410  -----------------------------------------------------------------------
   2411  010000001010000110010011011011001
   2412   100000100110000010001110110110111
   2413   ----------------------------------------------------------------------
   2414   000000110010001110101000000000101
   2415 |......|
   2416         110010001110101000000000101000000                            1バイト目の結果
   2417         |......|
   2418         10000001                                                     入力の2バイト目
   2419 	----------------------------------------------------------------
   2420 	010010011110101000000000101000000            1バイト目の結果と2バイト目のXOR
   2421          100000100110000010001110110110111                                除数
   2422 	----------------------------------------------------------------
   2423 	 000100011011010010001111100110111
   2424 	 .
   2425 	 .
   2426 	 .
   2427 </code></pre>
   2428 <p>
   2429 以上の操作は以下のようなアルゴリズムのループで実装できる。</p>
   2430 <ul>
   2431 <li>前回の結果と、入力データの次のバイトをXOR</li>
   2432 <li>
   2433 	<ul>
   2434 	<li>先頭の1ビットが1の場合、除数とXORを取り左シフト</li>
   2435 	<li>先頭の1ビットが0の場合、そのまま左シフト</li>
   2436 	</ul>
   2437 </li>
   2438 </ul>
   2439 <p>
   2440 これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。更にこの工程を32ビットの<code>int</code>だけで行うことを考える:
   2441 </p>
   2442 <pre><code>111000111000000110000110111000111000001010010011111000111000000110010011  入力(適当)
   2443 
   2444 11111111111111111111111111111111  0xffffffff
   2445 11100011000000000000000000000000  先頭1バイトを24ビットシフト
   2446 --------------------------------  XOR
   2447 00011100111111111111111111111111
   2448 先頭1ビットが0なので1ビットシフト
   2449 --------------------------------  シフト
   2450 00111001111111111111111111111110
   2451 先頭1ビットが0なので1ビットシフト
   2452 --------------------------------  シフト
   2453 01110011111111111111111111111100
   2454 先頭1ビットが0なので1ビットシフト
   2455 --------------------------------  シフト
   2456 11100111111111111111111111111000
   2457 先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
   2458 11001111111111111111111111110000  シフト
   2459 00000100110000010001110110110111  除数の下位32ビット
   2460 --------------------------------  XOR
   2461 11001011001111101110001001000111
   2462 先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
   2463 10010110011111011100010010001110  シフト
   2464 00000100110000010001110110110111  除数の下位32ビット
   2465 --------------------------------  XOR
   2466 10010010101111001101100100111001
   2467 先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR:
   2468 00100101011110011011001001110010  シフト
   2469 00000100110000010001110110110111  除数の下位32ビット
   2470 --------------------------------  XOR
   2471 00100001101110001010111111000101
   2472 先頭1ビットが0なので1ビットシフト
   2473 --------------------------------  シフト
   2474 01000011011100010101111110001010
   2475 先頭1ビットが0なので1ビットシフト
   2476 --------------------------------  シフト
   2477 10000110111000101011111100010100  1バイト目の結果
   2478 
   2479 10000001                          入力の2バイト目
   2480 --------------------------------  XOR
   2481 00000111111000101011111100010100
   2482 先頭1ビットが0なので1ビットシフト
   2483 --------------------------------  シフト
   2484 00001111110001010111111000101000
   2485 .
   2486 .
   2487 .
   2488 </code></pre>
   2489 <p>
   2490 これを実装したのが以下のコード:</p>
   2491 <pre><code>uint32_t
   2492 crc32(uint8_t *idata, size_t len)
   2493 {
   2494 	uint32_t pol = 0x04C11DB7;
   2495 	uint32_t c   = 0xFFFFFFFF;
   2496 	uint32_t b;
   2497 
   2498 	for (int i = 0; i &lt; len; i++) {
   2499 		b = idata[i] &lt;&lt; 24;
   2500 		c ^= b;
   2501 		for (int j = 0; j &lt; 8; j++) {
   2502 			c = c &gt;&gt; 31 & 1 ? c &lt;&lt; 1 ^ pol : c &lt;&lt; 1;
   2503 		}
   2504 	}
   2505 
   2506 	return c;
   2507 }
   2508 </code></pre>
   2509 <p>
   2510 <code>main()</code>関数では上の<code>crc32()</code>に、<code>idata</code>として入力となるバイナリデータの先頭を、<code>len</code>として<code>252</code>を渡してCRC32を計算させる。その後、出力先のファイルに入力元のデータをコピーしていき、253バイト目から256バイト目だけ、計算したCRC32に置き換える。入力元のこの場所にデータが書き込まれていないかどうかは確かめていない。
   2511 </p>
   2512 
   2513 <h2>UF2(USB Flashing Format)</h2>
   2514 <p>
   2515 Microsoftが開発したフラッシュ書き込み用のファイル形式らしい:
   2516 <blockquote cite="https://github.com/microsoft/uf2">
   2517 <p>
   2518 UF2 is a file format, developed by Microsoft for PXT (also known as
   2519 Microsoft MakeCode), that is particularly suitable for flashing microcontrollers
   2520 over MSC (Mass Storage Class; aka removable flash drive)<sup>[6]</sup>.
   2521 </p>
   2522 </blockquote>
   2523 <p>
   2524 このファイルに変換する上で必要な情報はGitHubのmicrosoft/uf2<sup>[6]</sup>に表として纏められている:
   2525 <blockquote cite="https://github.com/microsoft/uf2">
   2526 <table>
   2527 <thead><tr>
   2528 <th>Offset</th><th>Size</th><th>Value</th>
   2529 </tr></thead>
   2530 <tbody>
   2531 <tr>
   2532 <td>0</td>
   2533 <td>4</td>
   2534 <td>First magic number, <code>0x0A324655</code> (<code>"UF2\n"</code>)</td>
   2535 </tr>
   2536 <tr>
   2537 <td>4</td>
   2538 <td>4</td>
   2539 <td>Second magic number, <code>0x9E5D5157</code></td>
   2540 </tr>
   2541 <tr>
   2542 <td>8</td>
   2543 <td>4</td>
   2544 <td>Flags</td>
   2545 </tr>
   2546 <tr>
   2547 <td>12</td>
   2548 <td>4</td>
   2549 <td>Address in flash where the data should be written</td>
   2550 </tr>
   2551 <tr>
   2552 <td>16</td>
   2553 <td>4</td>
   2554 <td>Number of bytes used in data (often 256)</td>
   2555 </tr>
   2556 <tr>
   2557 <td>20</td>
   2558 <td>4</td>
   2559 <td>Sequential block number; starts at 0</td>
   2560 </tr>
   2561 <tr>
   2562 <td>24</td>
   2563 <td>4</td>
   2564 <td>Total number of blocks in file</td>
   2565 </tr>
   2566 <tr>
   2567 <td>28</td>
   2568 <td>4</td>
   2569 <td>File size or board family ID or zero</td>
   2570 </tr>
   2571 <tr>
   2572 <td>32</td>
   2573 <td>476</td>
   2574 <td>Data, padded with zeros</td>
   2575 </tr>
   2576 <tr>
   2577 <td>508</td>
   2578 <td>4</td>
   2579 <td>Final magic number, <code>0x0AB16F30</code></td>
   2580 </tr>
   2581 </tbody>
   2582 </table>
   2583 </blockquote>
   2584 
   2585 <p>
   2586 RP2040のデータシート<sup>[3]</sup>「2.8.4.2 UF2 Format Details」を見ると、8バイト目のFlagsは、28バイト目にファミリーIDが書き込まれていることを示す<code>0x00002000</code>、12バイト目は、書き込みを行うフラッシュROMの先頭アドレスである<code>0x10000000</code>に、各ブロックの先頭からの位置を足したもの、16バイト目の、各ブロックのデータサイズは256バイト、28バイト目のファミリーIDは<code>0xe48bff56</code>である。あとは表の通り3つのマジックナンバーをセットし、32バイト目以降にデータを書き込み、20バイト目と24バイト目にブロックの通し番号と総数をそれぞれ書き込めばいい。ブロックの通し番号はデータのついでに書き込めるが、総数はデータを全部さばいた後でないと分からないので、最後全てのブロックにまとめて書き込むようにした。できたのが以下のコード:
   2587 </p>
   2588 <pre><code>#include &lt;stdio.h&gt;
   2589 #include &lt;stdint.h&gt;
   2590 #include &lt;stdlib.h&gt;
   2591 #include &lt;string.h&gt;
   2592 
   2593 
   2594 size_t
   2595 fwrite32l(uint32_t d, FILE *f)
   2596 {
   2597 	int i;
   2598 	uint8_t b;
   2599 	for (i = 0; i &lt; 32; i += 8) {
   2600 		b = (uint8_t) (d &gt;&gt; i & 0xff);
   2601 		fwrite(&amp;b, 1, 1, f);
   2602 		if (ferror(f)) {
   2603 			fprintf(stderr, "Fwrite32l: write error.\n");
   2604 			return 0;
   2605 		}
   2606 	}
   2607 	return 4;
   2608 }
   2609 
   2610 int
   2611 main(int argc, char *argv[])
   2612 {
   2613 	FILE *src = NULL, *dst = NULL;
   2614 	size_t sdata = 476;
   2615 	int retnum = 0;
   2616 
   2617 	uint32_t mag1 = 0x0A324655;
   2618 	uint32_t mag2 = 0x9E5D5157;
   2619 	uint32_t flags = 0x00002000; // familyID present
   2620 	uint32_t addr = 0x10000000;
   2621 	uint32_t nbyte = 256;
   2622 	uint32_t blk = 0;
   2623 	uint32_t nblk = 0;
   2624 	uint32_t famid = 0xe48bff56;
   2625 	uint8_t data[sdata];
   2626 	uint32_t mag3 = 0x0AB16F30;
   2627 
   2628 	memset(data, 0, sdata);	
   2629 
   2630 	if (argc != 3) {
   2631 		fprintf(stderr, "Usage: %s src dst\n", argv[0]);
   2632 		exit(1);
   2633 	}
   2634 
   2635 	if ((src = fopen(argv[1], "rb")) == NULL) {
   2636 		fprintf(stderr, "Could not open %s.\n", argv[1]);
   2637 		retnum = 1;
   2638 		goto defer;
   2639 	}
   2640 	if ((dst = fopen(argv[2], "wb")) == NULL) {
   2641 		fprintf(stderr, "Could not open %s.\n", argv[2]);
   2642 		retnum = 1;
   2643 		goto defer;
   2644 	}
   2645 	
   2646 	while (!feof(src)) {
   2647 		fwrite32l(mag1, dst);
   2648 		fwrite32l(mag2, dst);
   2649 		fwrite32l(flags, dst);
   2650 		fwrite32l(addr, dst);
   2651 		fwrite32l(nbyte, dst);
   2652 		fwrite32l(blk, dst);
   2653 		fwrite32l(nblk, dst); // dummy
   2654 		fwrite32l(famid, dst);
   2655 
   2656 		fread(data, 1, nbyte, src);
   2657 		if (ferror(src)) {
   2658 			fprintf(stderr, "Read error: %s.\n", argv[1]);
   2659 			retnum = 1;
   2660 			goto defer;
   2661 		}
   2662 		fwrite(data, 1, sdata, dst);
   2663 		if (ferror(src)) {
   2664 			fprintf(stderr, "Write error: %s.\n", argv[2]);
   2665 			retnum = 1;
   2666 			goto defer;
   2667 		}
   2668 
   2669 		fwrite32l(mag3, dst);
   2670 
   2671 		addr += nbyte;
   2672 		blk++;
   2673 		nblk++;
   2674 	}
   2675 
   2676 	for (int i = 0; i &lt; nblk; i++) {
   2677 		if (i == 0)
   2678 			if (fseek(dst, 24, SEEK_SET) &lt; 0) {
   2679 				fprintf(stderr, "Seek error: %s.\n argv[2]");
   2680 				retnum = 1;
   2681 				goto defer;
   2682 			}
   2683 		fwrite32l(nblk, dst);
   2684 		if (i &lt; nblk - 1)
   2685 			if(fseek(dst, 512 - 4, SEEK_CUR) &lt; 0){
   2686 				fprintf(stderr, "Seek error: %s.\n argv[2]");
   2687 				retnum = 1;
   2688 				goto defer;
   2689 			}
   2690 	}
   2691 	
   2692 defer:
   2693 	if (src)
   2694 		fclose(src);
   2695 	if (dst)
   2696 		fclose(dst);
   2697 	return retnum;
   2698 }
   2699 </code></pre>
   2700 <p><code>fwrite32l()</code>関数は指定されたファイルに32ビットの整数を下位バイトから順に書き込む関数である。バイトオーダーとかややこしそうなので作っておいたけど必要なのかな?あと名前が気に入らない。</p>
   2701 <p>
   2702 CRC32のチェックサムが書き込まれたバイナリファイルを、このプログラムでUF2に変換し、生成されたファイルをUSBストレージとして接続したRP2040にコピーすればフラッシュROMに書き込まれる。
   2703 </p>
   2704 
   2705 <h2>Flash Second Stage</h2>
   2706 <p>
   2707 RP2040に電源を投入し、CRC32のチェックが通った後、フラッシュROMからコピーされたプログラムの先頭から実行が開始される。このコピーされた部分で、その後の動作に必要な各種の設定を行うことになる。RP2040のデータシートには、フラッシュROMとSSIコントローラのXIPを設定するようにと書かれている。XIPはExecute in Placeの略で、フラッシュROMの内容をCPUから直接実行するものである。SSIはSynchronous Serial Interfaceの略で、周辺機器と情報のやりとりをする通信方式である。RP2040はチップに内蔵されたこのSSIコントローラを通して、外部のフラッシュROMと通信しているのだが、このコントローラを適切に設定すればフラッシュROMの内容がCPUから直接アクセスできる<code>0x10000000</code>番地以降にマップされる。これによりフラッシュROMから内部のSRAMにデータをコピーすることなく命令を実行できるので、速くて便利だという。
   2708 </p>
   2709 <p>
   2710 しかしこのSSIコントローラはSynopsysという会社のDW_apb_ssiというIPを使っているようで、データシートのSSIコントローラの章は多分Synopsysの人が書いている。その他の章はRaspberry Pi財団の書いたブリティッシュイングリッシュだが、この部分だけ多分ネイティブじゃない人の書いたいい加減な英語である。誤植も多い。何日かかけて理解しようとしたがよく分からん。不毛なので一旦諦めた。</p>
   2711 <p>
   2712 RP2040には内部にもROMがあり、はバージョン情報や電源を投入した時の動作、その他便利な関数が書き込まれている。この関数の中に外部のフラッシュROMとSSIコントローラを設定するものも含まれているので、今回はこれを利用した。ただしこの方法だとフラッシュROMとの通信方式がStandard SPIのままなので少し遅いらしい。詳しくはデータシートの「2.3.8. Bootrom Contents」を参照。
   2713 </p>
   2714 <p>
   2715 RP2040の内蔵ROMの<code>0x00000018</code>番地に関数を検索するための関数がある。この関数に<code>0x00000014</code>番地の<code>rom_func_table</code>と、各関数に割り当てられた二文字の文字列を渡せば、欲しい関数へのポインタが返ってくる。なお、二文字の文字列はそれぞれASCIIコードで現し、二文字目を8ビットシフトしたものと1文字目のORを取ったものを渡すことになっている。今回欲しい関数はフラッシュROMをXIPに設定するもの(<code>_flash_enter_cmd_xip()</code>)なので、<code>'C', 'X'</code>を渡す。関数のポインタが返ってきて、それを呼び出せばフラッシュROMとSSIはXIPモードになる:
   2716 </p>
   2717 <pre><code>setup_xip:
   2718 	ldr r3, rom_base
   2719 
   2720 	ldrh r0, [r3, #0x14] // rom_func_table
   2721 	ldr r1, =('C' | 'X' &lt;&lt; 8) // _flash_enter_cmd_xip()
   2722 	ldrh r2, [r3, #0x18] // rom_table_lookup
   2723 	blx r2
   2724 	blx r0
   2725 /* ... */
   2726 rom_base:
   2727 	.word 0x00000000
   2728 </code></pre>
   2729 
   2730 <p>
   2731 XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。Armのマニュアル<sup>[7]</sup>によると、初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:</p>
   2732 <blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition">
   2733 <table>
   2734 <caption>
   2735 Table 7.3. Exception numbers 
   2736 </caption><colgroup><col><col></colgroup><thead><tr><th>Exception number</th><th>Exception</th></tr></thead><tbody><tr><td>1</td><td>Reset</td></tr><tr><td>2</td><td>NMI</td></tr><tr><td>3</td><td>HardFault</td></tr><tr><td>4-10</td><td>Reserved</td></tr><tr><td>11</td><td>SVCall</td></tr><tr><td>12-13</td><td>Reserved</td></tr><tr><td>14</td><td>PendSV</td></tr><tr><td>15</td><td>SysTick, optional</td></tr><tr><td>16</td><td>External Interrupt(0)</td></tr><tr><td>...</td><td>...</td></tr><tr><td>16 + N</td><td>External Interrupt(N)</td></tr></tbody>
   2737 </table>
   2738 </blockquote>
   2739 
   2740 <blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table">
   2741 <table>
   2742 <caption>
   2743 Table 7.4. Vector table format 
   2744 </caption><colgroup><col><col></colgroup><thead><tr><th>Word offset in table</th><th>Description, for all pointer address values</th></tr></thead><tbody><tr><td>0</td><td>SP_main. This is the reset value of the Main stack pointer.</td></tr><tr><td>Exception Number</td><td>Exception using that Exception Number</td></tr></tbody>
   2745 </table>
   2746 </blockquote>
   2747 <p>
   2748 RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は256バイトでアラインする必要がある。ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からはラベルを使ってアクセスすることにする。以上をまとめると以下のコードになる:</p>
   2749 <pre><code>	ldr r0, =vectors
   2750 	ldr r1, m0plus_vtor
   2751 	str r0, [r1, #0] // vector table
   2752 	ldr r1, [r0, #4] // entry point
   2753 	ldr r0, [r0, #0] // stack pointer
   2754 	mov sp, r0
   2755 	bx r1
   2756 
   2757 /* ... */
   2758 
   2759 m0plus_vtor:
   2760 	.word 0xe0000000 + 0xed08
   2761 </code></pre>
   2762 <p>なお以上のコードは<code>.boot2</code>という名前のセクションにしてある。
   2763 </p>
   2764 
   2765 <h2>メインのコード(<code>main.s</code>)</h2>
   2766 
   2767 <h3>ベクターテーブル</h3>
   2768 <p>
   2769 上で説明したように、ベクターテーブルのアドレスは256バイトの境界にないといけないが、<code>boot2.s</code>をフラッシュの最初の256バイトに配置しており、<code>main.s</code>はその直後から始まるようにリンクする。そのためメインのコードの最初にベクターテーブルを配置すればいい。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、<code>.global</code>宣言をつけておく:
   2770 </p>
   2771 <pre><code>	.global vectors
   2772 vectors:
   2773 	.word 0x20040000 // initial SP
   2774 	.word (reset+1)
   2775 </code></pre>
   2776 <p>
   2777 <code>reset</code>ラベルに<code>1</code>を足しているのはRP2040がThumbモードのみに対応しているからである。ArmのCPUはArmモードとThumbモードがあり、Armモードは32ビットの命令で高機能。Thumbモードは16ビットの命令(一部32ビット)でコンパクトである。どちらのモードでも命令は2の倍数のアドレスに並ぶことになる。そのためジャンブ命令のジャンプ先のアドレスの最下位ビットは常に0である。この最下位ビットはジャンプ先のモードを示す為に利用される。両方のモードに対応したCPUではジャンプ先のアドレスの最下位ビットが0ならArmモード、1ならThumbモードに切り替わる。ブランチ命令のオペランド等は多分アセンブラがいい感じにしてくれるので単にラベルを書けば動く。ベクターテーブルのこの部分は自分で足す必要があるみたい。あんまりちゃんと調べてないのでマニュアル読んでや。</p>
   2778 
   2779 <h3>GPIOの設定</h3>
   2780 <p>
   2781 電源投入直後、RP2040の周辺機器はリセット状態になっている。まずは今回利用するGPIOのリセット状態を解除する必要がある。データシートの「2.14. Subsystem Resets」には以下のように書かれている:
   2782 </p>
   2783 <blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">
   2784 <p>
   2785 Every peripheral reset by the reset controller is held in reset at power-up.
   2786 It is up to software to deassert the reset of peripherals it intends to use.
   2787 </p>
   2788 </blockquote>
   2789 <p>
   2790 リセット状態を解除するには、RESETS_BASE(<code>0x4000c000</code>)から<code>0x0</code>バイト目のRESETS: RESETレジスタのうち利用したい周辺機器のビットを<code>0x0</code>にすればいい。
   2791 GPIOはIO Bank 0なので(これ明記されてなくない?)、RESETS: RESETレジスタのIO_BANK0(5番ビット)を<code>0x0</code>にする。
   2792 </p>
   2793 <h4>レジスタのアトミックなクリア</h4>
   2794 <p>
   2795 RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>にしたい。この時、まずこのレジスタを読み込んでから<code>~(1 &lt;&lt; 5)</code>と論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを一回の<code>str</code>でしかもアトミックにできる機能が用意されている。今回の場合アトミックかどうかは関係ないと思うけど。</p>
   2796 <p>
   2797 各レジスタには4個のアドレスが割り当てられている。データシートの各章のList of Registersに記載されているアドレスは通常の読み書きができる。そのアドレスに<code>0x1000</code>を足したものにアクセスするとアトミックなXORが、<code>0x2000</code>を足したものはアトミックなセットが、<code>0x3000</code>を足したものはアトミックなクリアができる。つまりレジスタのアドレスに<code>0x3000</code>を足したものに、<code>0x1 &lt;&lt; 5</code>を<code>str</code>すれば5番目のビットだけ<code>0x0</code>にして、他のビットは変更されない。逆に指定したビットだけ立てて他を触らない場合は<code>0x2000</code>を、あるいは指定したビットだけトグルしたい場合は<code>0x1000</code>を足したアドレスにアクセスすればいい。</p>
   2798 <h4>リセット状態の確認</h4>
   2799 <p>リセットの解除はすぐに完了するわけではないようである。リセットの解除が完了したかどうか確認するにはRESETS: RESET_DONEレジスタ(RESETS_BASEから<code>0x8</code>バイト目)の該当するビット(ここでは5番目のビット)を読む。この値が<code>0x1</code>であればリセットの解除が完了している。<code>0x0</code>であれば処理が進行中なので<code>0x1</code>が返ってくるまで繰り返し読み込んで<code>0x0</code>になるまで待機する。ところでこのレジスタはリセットの解除が完了したかどうか確かめるものなので、RESET_DONEという名前はどうなん?
   2800 <p>
   2801 以上から、GPIOのリセットを解除するのは以下のコード:
   2802 </p>
   2803 <pre><code>reset:
   2804 	// unreset gpio
   2805 	mov r0, #1
   2806 	lsl r0, r0, #5 // io_bank0
   2807 	ldr r3, resets_base
   2808 	ldr r1, atomic_clr
   2809 	str r0, [r3, r1] // RESETS: RESET
   2810 reset_chk:
   2811 	ldr r1, [r3, #0x8] // RESETS: RESET_DONE
   2812 	tst r0, r1
   2813 	beq reset_chk
   2814 
   2815 /* ... */
   2816 
   2817 atomic_clr:
   2818 	.word 0x00003000
   2819 resets_base:
   2820 	.word 0x4000c000
   2821 </code></pre>
   2822 
   2823 <h3>GPIOの機能の選択</h3>
   2824 <p>RP2040のGPIOにはそれぞれ複数の機能が用意されていて、どれを使うかはソフトウェアから選択できる。利用できる機能の一覧と各機能の説明はデータシートの「2.19.2 Function Select」に詳しく書いてある。ここではGPIO25番のピンをSIO(Single-cycle IO)として利用する。同じCPUが載っているRaspberry Pi PicoはGPIO25番にLEDが半田付けされている。25番にしたのはこれに合わせるためである。他のピンでもいい。GPIOに1か0を印加するだけならこのSIOを使うみたいである。Single-cycleはCPUから操作したときに1クロックでその操作が完了するという意味らしい(本当か)。SIOの詳しい説明はデータシートの「2.3.1 SIO」にある。</p>
   2825 <p>
   2826 GPIO25番の機能を選択するにはIO_BANK0_BASE(<code>0x40014000</code>)から<code>0xcc</code>番目のGPIO25_CTRLレジスタの下位5ビットに、該当する機能の番号を書き込めばいい。データシートの「2.19.2 Function Select」にある表を見ると、GPIO25番のSIOは5である:</p>
   2827 <pre><code>	// set gpio functions
   2828 	ldr r3, io_bank0_base
   2829 	mov r0, #5 // sio
   2830 	mov r1, #0xcc
   2831 	str r0, [r3, r1] // IO_BANK0: GPIO25_CTRL
   2832 
   2833 /* ... */
   2834 
   2835 io_bank0_base:
   2836 	.word 0x40014000
   2837 </code></pre>
   2838 
   2839 <h3>GPIOの出力を有効化</h3>
   2840 <p>
   2841 GPIO25番がSIOになったので、次にこのピンからの出力を有効化する。既定値では出力は無効になっている。ハイインピーダンスってことなのかな?出力を有効にするには、SIO_BASE(<code>0xd0000000</code>)から<code>0x24</code>バイト目のSIO: GPIO_OEレジスタの該当するビット(25番のピンなので25番ビット)を<code>0x1</code>にする:
   2842 </p>
   2843 <pre><code>	// enable gpio output
   2844 	ldr r3, sio_base
   2845 	mov r0, #1
   2846 	lsl r0, r0, #25 // gpio25
   2847 	str r0, [r3, #0x24] // SIO: GPIO_OE
   2848 
   2849 /* ... */
   2850 
   2851 sio_base:
   2852 	.word 0xd0000000
   2853 </code></pre>
   2854 
   2855 <h3>LEDの点滅</h3>
   2856 <p>以上でGPIOの設定は完了したので、あとは実際にLEDに電圧を掛けるだけである。レジスタのアドレスに<code>0x1000</code>を足したものに書き込むとアトミックなレジスタのXORができると書いたが、SIOはこの機能がサポートされていないようである。データシートの「2.1.2 Atomic Register Access」に、
   2857 </p>
   2858 <blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">
   2859 <p>
   2860 The SIO (Section 2.3.1), a single-cycle IO block attached directly to the cores'
   2861 IO ports, does <strong>not</strong> support atomic accesses at the bus level,
   2862 although some individual registers (e.g. GPIO) have set/clear/xor aliases.
   2863 </p>
   2864 </blockquote>
   2865 <p>
   2866 と書かれている。そのかわりここにも書かれている通り、SIOの一部のレジスタにはアトミックなセット/クリア/XORをするためのレジスタが用意されている。ここではLEDを点滅させるためにGPIOの出力をトグルしたいのでXOR用のレジスタを使う。SIO_BASE(<code>0xd0000000</code>)から<code>0x1c</code>バイト目のSIO: GPIO_OUT_XORレジスタがそれである。このレジスタの25番ビットに<code>0x1</code>を書き込めばいい。出力をトグルした後は少し間をおいて同じことを繰り返す。間をおくためにここでは適当な数値を1づつ減らしていって0になったら返る関数<code>delay</code>を作った。タイマーと割り込みを使ったほうが消費電力等で優位なようだが、面倒なのでとりあえずこれで:</p>
   2867 
   2868 <pre><code>	// blink led on gpio25
   2869 	ldr r4, sio_base
   2870 	mov r5, r0 // r0 = 1 &lt;&lt; 25
   2871 loop:
   2872 	str r5, [r4, #0x1c] // SIO: GPIO_OUT_XOR
   2873 	bl delay
   2874 	b loop
   2875 
   2876 delay:
   2877 	mov r0, #1
   2878 	lsl r0, r0, #20
   2879 delay_loop:
   2880 	sub r0, r0, #1
   2881 	bne delay_loop
   2882 	bx lr
   2883 
   2884 /* ... */
   2885 
   2886 sio_base:
   2887 	.word 0xd0000000
   2888 </code></pre>
   2889 <p>なお以上のコードは<code>.text</code>セクションである。</p>
   2890 
   2891 <h2>リンカスクリプト</h2>
   2892 <p>
   2893 以上のコードには<code>.boot2</code>、<code>.text</code>の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.text</code>はその後ろに続くように配置する:
   2894 <pre><code>MEMORY
   2895 {
   2896 	FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k
   2897 }
   2898 
   2899 SECTIONS
   2900 {
   2901 	.boot2 : {
   2902 		*(.boot2)
   2903 		. = 0x100;
   2904 	} > FLASH
   2905 
   2906 	.text : {
   2907 		*(.text)
   2908 	} > FLASH
   2909 }
   2910 </code></pre>
   2911 
   2912 <h2>Makefile</h2>
   2913 <p>
   2914 以上のソースコードは以下のように配置している:
   2915 </p>
   2916 <pre>rp2040
   2917 ├── ex1
   2918 │   ├── Makefile
   2919 │   ├── boot2.s
   2920 │   ├── main.s
   2921 │   └── memmap.ld
   2922 └── tools
   2923     ├── Makefile
   2924     ├── bin2uf2.c
   2925     └── bincrc.c
   2926 </pre>
   2927 <p>
   2928 toolsディレクトリのMakefileは同じディレクトリのソースファイルを<code>$(CC)</code>でコンパイルするだけのものである(個人的な趣味で<code>tcc</code>を使っている)。ex1ディレクトリのMakefileは以下の通り:
   2929 </p>
   2930 <pre><code>AS = arm-none-eabi-as
   2931 LD = arm-none-eabi-ld
   2932 OBJCOPY = arm-none-eabi-objcopy
   2933 BINCRC = ../tools/bincrc
   2934 BIN2UF2 = ../tools/bin2uf2
   2935 
   2936 MCPU = -mcpu=cortex-m0plus
   2937 ASFLAGS = $(MCPU)
   2938 CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c
   2939 LDFLAGS = --no-relax -nostdlib
   2940 
   2941 all: tools led.uf2
   2942 
   2943 clean:
   2944 	rm -f *.o *.elf *.uf2 *.bin
   2945 	cd ../tools &amp;&amp; make clean
   2946 
   2947 .s.o:
   2948 	$(AS) $(ASFLAGS) -o $@ $&lt;
   2949 
   2950 led.elf: boot2.o main.o memmap.ld
   2951 	$(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o main.o 
   2952 
   2953 led.bin: led.elf
   2954 	$(OBJCOPY) -O binary led.elf $@
   2955 
   2956 led.uf2: led.bin
   2957 	$(BINCRC) led.bin led_crc.bin
   2958 	$(BIN2UF2) led_crc.bin $@
   2959 
   2960 flash: all
   2961 	mount /dev/disk/by-label/RPI-RP2 /mnt
   2962 	cp led.uf2 /mnt
   2963 
   2964 tools:
   2965 	cd ../tools &amp;&amp; make
   2966 </code></pre>
   2967 
   2968 <p>
   2969 RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し、ex1ディレクトリで</p>
   2970 <pre><code>$ make
   2971 # make flash
   2972 </code></pre>
   2973 <p>
   2974 とすればプログラムがRP2040のボードに書き込まれて実行が開始される。</p>
   2975 
   2976 <h2>最後に</h2>
   2977 <p>
   2978 光あれ。
   2979 </p>
   2980 
   2981 <h2>参考</h2>
   2982 <ul>
   2983 <li>
   2984 [1] Hennesy, J. L. and Patterson, D. A. 2017. Computer Organization And Design RISC-V Edition.
   2985 </li>
   2986 <li>
   2987 [2] <a href="https://akizukidenshi.com/catalog/g/gK-17542/">RP2040マイコンボードキット.秋月電子通商</a>
   2988 </li>
   2989 <li>
   2990 [3] <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a>
   2991 </li>
   2992 <li>
   2993 [4] <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a>
   2994 </li>
   2995 <li>
   2996 [5] <a href="https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB">巡回冗長検査.Wikipedia</a>
   2997 </li>
   2998 <li>
   2999 [6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a>
   3000 </li>
   3001 <li>
   3002 [7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a>
   3003 </li>
   3004 </ul>
   3005 ]]></description>
   3006 </item>
   3007 <item>
   3008 <title>Gitサーバーの設定 on OpenBSD</title>
   3009 <link>https://www.mtkn.jp/computer/git_server.html</link>
   3010 <guid>https://www.mtkn.jp/computer/git_server.html</guid>
   3011 <pubDate>Thu, 15 Feb 2024 00:00:00 +0900</pubDate>
   3012 <description><![CDATA[<h1>Gitサーバーの設定 on OpenBSD</h1>
   3013 <time>2024-02-15</time>
   3014 
   3015 <h2>はじめに</h2>
   3016 <p>
   3017 GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p>
   3018 <p>
   3019 ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。
   3020 </p>
   3021 
   3022 <h2>手順</h2>
   3023 <p>
   3024 以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。
   3025 </p>
   3026 
   3027 <h3>概要</h3>
   3028 <ol>
   3029 <li>ドメインの設定(任意)</li>
   3030 <li><code>httpd(8)</code>の設定</li>
   3031 <li>gitパッケージのインストールとchroot環境の整備</li>
   3032 <li>stagitの導入</li>
   3033 </ol>
   3034 
   3035 <h3>ドメインの設定(任意)</h3>
   3036 <p>
   3037 ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p>
   3038 <p>
   3039 今回はgitというサブドメインを登録した:
   3040 </p>
   3041 <table>
   3042 <thead>
   3043 <tr>
   3044 <th>サブドメイン</th>
   3045 <th>種別</th>
   3046 <th>内容</th>
   3047 <th>優先度</th>
   3048 </tr>
   3049 </thead>
   3050 <tbody>
   3051 <tr>
   3052 <td>git</td>
   3053 <td>A</td>
   3054 <td><i>サーバーのIPアドレス</i></td>
   3055 <td></td>
   3056 </tr>
   3057 </tbody>
   3058 </table>
   3059 
   3060 <h3><code>httpd(8)</code>の設定</h3>
   3061 <p>
   3062 httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する:
   3063 </p>
   3064 <pre><code>domain git.mtkn.jp {
   3065 	domain key "/etc/ssl/private/git.mtkn.jp.key"
   3066 	domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
   3067 	sign with letsencrypt
   3068 }
   3069 </code></pre>
   3070 
   3071 <p>
   3072 続いて<code>/etc/httpd.conf</code>を設定する。</p>
   3073 <pre><code>server "git.mtkn.jp" {
   3074 	listen on * port 80
   3075 	location "/.well-known/acme-challenge/*" {
   3076 		root "/acme"
   3077 		request strip 2
   3078 	}
   3079 	location "*" {
   3080 		block return 302 "https://$HTTP_HOST$REQUEST_URI"
   3081 	}
   3082 }
   3083 
   3084 server "git.mtkn.jp" {
   3085 	listen on * tls port 443
   3086 	tls {
   3087 		certificate "/etc/ssl/git.mtkn.jp.fullchain.pem"
   3088 		key "/etc/ssl/private/git.mtkn.jp.key"
   3089 	}
   3090 	location "/.well-known/acme-challenge/*" {
   3091 		root "/acme"
   3092 		request strip 2
   3093 	}
   3094 	location "/*/git-receive-pack" {
   3095 		block
   3096 	}
   3097 	location "/*/git-upload-pack" {
   3098 		fastcgi {
   3099 			param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
   3100 			param GIT_PROJECT_ROOT "/git"
   3101 			param GIT_HTTP_EXPORT_ALL "true"
   3102 		}
   3103 	}
   3104 	location "/*/info/refs" {
   3105 		fastcgi {
   3106 			param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend"
   3107 			param GIT_PROJECT_ROOT "/git"
   3108 			param GIT_HTTP_EXPORT_ALL "true"
   3109 		}
   3110 	}
   3111 }
   3112 </code></pre>
   3113 <p>
   3114 <code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p>
   3115 <p>
   3116 <code>location "/*/git-upload-pack"</code>は手元のパソコンから<code>git clone</code>や<code>git pull</code>したときのもの。<code>location "/*/info/refs"</code>は上記を含むアクセスがあったときのもの。ここではCGIを使って<code>git-http-backend</code>を呼んでいるだけである。<code>SCRIPT_FILENAME</code>は<code>httpd(8)</code>のchroot環境でのパスである。必要なファイルは後でこのchroot環境にコピーする。
   3117 </p>
   3118 <p>
   3119 この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p>
   3120 
   3121 
   3122 
   3123 <p>
   3124 httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。
   3125 </p>
   3126 <p>
   3127 <code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する:
   3128 </p>
   3129 <pre><code># echo httpd_flags= &gt;&gt; /etc/rc.conf.local
   3130 # echo slowcgi_flags= &gt;&gt; /etc/rc.conf.local
   3131 # rcctl start httpd
   3132 # rcctl enable httpd
   3133 # rcctl start slowcgi
   3134 # rcctl enable slowcgi
   3135 </code></pre>
   3136 <p>
   3137 サーバー証明書の発行:
   3138 </p>
   3139 <pre><code># acme-client -v git.mtkn.jp
   3140 </code></pre>
   3141 <p>
   3142 <code>crontab(1)</code>にサーバー証明書の自動更新を登録:
   3143 </p>
   3144 <pre><code>#minute hour    mday    month   wday    [flags] command
   3145 ~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd
   3146 </code></pre>
   3147 
   3148 <h3>gitパッケージのインストールとchroot環境の整備</h3>
   3149 <p>
   3150 gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする:
   3151 </p>
   3152 <pre><code># pkg_add git
   3153 # useradd -b /var/www -m -s /usr/local/bin/git-shell git
   3154 </code></pre>
   3155 <p>
   3156 ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p>
   3157 <p>
   3158 httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー:
   3159 </p>
   3160 <pre><code># mkdir -p /var/www/usr/local/libexec/git
   3161 # cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/
   3162 # chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
   3163 # chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack}
   3164 # mkdir -p /var/www/usr/local/bin
   3165 # cp /usr/local/bin/git /var/www/usr/local/bin/
   3166 # chown www:www /var/www/usr/local/bin/git
   3167 # chmod 0500 /var/www/usr/local/bin/git
   3168 </code></pre>
   3169 <p>
   3170 続いてコマンドの実行に必要なライブラリをコピー:
   3171 </p>
   3172 <pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec
   3173 # find /var/www/{bin,usr} -type f | grep git | xargs ldd | awk '{print $7}' | grep -v -e '^/var/www/' -e '^$' -e 'Name' | sort | uniq | awk '{printf &quot;cp %s /var/www%s &amp;&amp; chown www:www /var/www%s &amp;&amp; chmod 0400 /var/www%s\n&quot;, $1, $1, $1, $1}' | sh -s
   3174 </code></pre>
   3175 <p>
   3176 <code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照):
   3177 </p>
   3178 <pre><code># mkdir /var/www/dev
   3179 # mknod -m 666 /var/www/dev/null c 2 2
   3180 </code></pre>
   3181 <p>
   3182 最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。
   3183 </p>
   3184 
   3185 <p>
   3186 gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った:
   3187 </p>
   3188 <pre><code>#!/bin/sh -xe
   3189 
   3190 oso=$(find /var/www/usr -type f -name '*.so*')
   3191 rm $oso
   3192 
   3193 bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' |
   3194 	grep -v bgpctl |
   3195 	sed 's|^/var/www||'
   3196 	)
   3197 echo &quot;$bin&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s
   3198 echo &quot;$bin&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s
   3199 echo &quot;$bin&quot; | sed 's|.*|chmod 0500 /var/www&amp;|' | sh -s
   3200 
   3201 nso=$(echo &quot;$bin&quot; | sed 's|^|/var/www|' |
   3202 	xargs ldd | awk '{print $7}' |
   3203 	grep -v -e '^/var/www/' -e '^$' -e 'Name' |
   3204 	sort | uniq
   3205 	)
   3206 echo &quot;$nso&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s
   3207 echo &quot;$nso&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s
   3208 echo &quot;$nso&quot; | sed 's|.*|chmod 0400 /var/www&amp;|' | sh -s
   3209 </code></pre>
   3210 
   3211 <h3><code>stagit(1)</code>の導入</h3>
   3212 <p>
   3213 ウェブフロントエンドとしてstagitを導入する:
   3214 </p>
   3215 <pre><code># pkg_add stagit
   3216 </code></pre>
   3217 <p>
   3218 <code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する):
   3219 </p>
   3220 <pre><code>	location &quot;/&quot; {
   3221 		directory index index.html
   3222 		root &quot;/htdocs/git.mtkn.jp&quot;
   3223 	}
   3224 	location &quot;*&quot; {
   3225 		directory index log.html
   3226 		root &quot;/htdocs/git.mtkn.jp&quot;
   3227 	}
   3228 </code></pre>
   3229 <p>
   3230 stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する:
   3231 </p>
   3232 <pre><code># mkdir /var/www/htdocs/git.mtkn.jp
   3233 # chown git:git /var/www/htdocs/git.mtkn.jp
   3234 # rcctl reload httpd
   3235 </code></pre>
   3236 
   3237 <p>
   3238 gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい:
   3239 </p>
   3240 <pre><code>#!/bin/sh
   3241 
   3242 git_root=&quot;/var/www/git&quot;
   3243 stagit_root=&quot;/var/www/htdocs/git.mtkn.jp&quot;
   3244 repo=&quot;$(basename &quot;$(pwd)&quot; | sed 's/\.git$//')&quot;
   3245 src=&quot;$(pwd)&quot;
   3246 stagit_dst=&quot;$stagit_root/$repo&quot;
   3247 
   3248 mkdir -p &quot;$stagit_dst&quot;
   3249 (cd &quot;$stagit_dst&quot; &amp;&amp; stagit -l 64 &quot;$src&quot;)
   3250 (cd &quot;$stagit_root&quot; &amp;&amp; stagit-index $git_root/*.git &gt; index.html)
   3251 </code></pre>
   3252 
   3253 <h2>レポジトリの作成</h2>
   3254 <p>
   3255 レポジトリを作成するにはサーバーで以下のようにする。</p>
   3256 <pre><code>$ cd /var/www/git
   3257 $ doas -u git mkdir <i>repo</i>.git
   3258 $ cd <i>repo</i>.git
   3259 $ doas -u git git init --bare
   3260 </code></pre>
   3261 
   3262 <p>
   3263 これで手元のパソコンからクローンできる:
   3264 </p>
   3265 <pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git
   3266 </code></pre>
   3267 <p>
   3268 または
   3269 </p>
   3270 <pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git
   3271 </code></pre>
   3272 
   3273 <h2>参考</h2>
   3274 <ul>
   3275 <li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li>
   3276 <li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li>
   3277 <li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li>
   3278 </ul>
   3279 ]]></description>
   3280 </item>
   3281 <item>
   3282 <title>味噌</title>
   3283 <link>https://www.mtkn.jp/kitchen/recipe/miso.html</link>
   3284 <guid>https://www.mtkn.jp/kitchen/recipe/miso.html</guid>
   3285 <pubDate>Fri,  9 Feb 2024 00:00:00 +0900</pubDate>
   3286 <description><![CDATA[<h1>味噌</h1>
   3287 <time>2024-02-09</time>
   3288 
   3289 <h2>材料</h2>
   3290 <p>二升の甕4つ分弱</p>
   3291 <ul>
   3292 <li>大豆 3.6kg</li>
   3293 <li>米麹 5kg</li>
   3294 <li>塩 1.8kg</li>
   3295 <li>酒粕 500g</li>
   3296 </ul>
   3297 
   3298 <h2>手順</h2>
   3299 <ol>
   3300 <li>大豆を24時間水に浸す</li>
   3301 <li>麹と塩を混ぜる</li>
   3302 <li>大豆を3時間蒸す</li>
   3303 <li>大豆を潰す</li>
   3304 <li>大豆を麹と混ぜる(蒸したときの汁を混ぜて硬さを調整する)</li>
   3305 <li>甕に詰める</li>
   3306 <li>酒粕で蓋をしてさらにラップで落し蓋をして密閉する。</li>
   3307 <li>半年以上寝かす</li>
   3308 </ol>
   3309 
   3310 <h2>ひとこと</h2>
   3311 <p>
   3312 豆はジップロックに入れて拳に体重を乗せて押しつぶすと楽だった。ジップロックあんまり使いたくないけど。ラップで蓋をするのは好きではないので、試験的にひと瓷だけラップなしで放置することにした。酒粕も味噌っぽくなって食べられるが、風味は少し変わる。味噌汁が粕汁っぽくなる。</p>
   3313 ]]></description>
   3314 </item>
   3315 <item>
   3316 <title>自己紹介</title>
   3317 <link>https://www.mtkn.jp/about.html</link>
   3318 <guid>https://www.mtkn.jp/about.html</guid>
   3319 <pubDate>Tue, 23 Jan 2024 00:00:00 +0900</pubDate>
   3320 <description><![CDATA[<h1>自己紹介</h1>
   3321 <time>2022-07-28</time>
   3322 
   3323 <p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p>
   3324 
   3325 <ul>
   3326 	<li>名前: 松田 健嗣</li>
   3327 	<li>性別: 男</li>
   3328 	<li>年齢: 20代</li>
   3329 	<li>出身: 和歌山</li>
   3330 </ul>
   3331 
   3332 <p>
   3333 高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。
   3334 </p>
   3335 <p>
   3336 勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。
   3337 </p>
   3338 <p>
   3339 在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。
   3340 </p>
   3341 <p>
   3342 ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。
   3343 </p>
   3344 <p>
   3345 このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。
   3346 </p>
   3347 
   3348 <h2>著作権について</h2>
   3349 <p>
   3350 このウェブサイト上のコンテンツは、特に断りのない限り<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>で公開します。</p>
   3351 ]]></description>
   3352 </item>
   3353 <item>
   3354 <title>謹賀新年</title>
   3355 <link>https://www.mtkn.jp/gallery/20240101.html</link>
   3356 <guid>https://www.mtkn.jp/gallery/20240101.html</guid>
   3357 <pubDate>Mon,  1 Jan 2024 00:00:00 +0900</pubDate>
   3358 <description><![CDATA[<h1>謹賀新年</h1>
   3359 <time>2024-01-01</time>
   3360 <img src="img/20240101.jpg">
   3361 ]]></description>
   3362 </item>
   3363 <item>
   3364 <title></title>
   3365 <link>https://www.mtkn.jp/gallery/20231202.html</link>
   3366 <guid>https://www.mtkn.jp/gallery/20231202.html</guid>
   3367 <pubDate>Sun,  3 Dec 2023 00:00:00 +0900</pubDate>
   3368 <description><![CDATA[<h1></h1>
   3369 <time>2023-12-02</time>
   3370 <img src="img/20231202.jpg">
   3371 ]]></description>
   3372 </item>
   3373 <item>
   3374 <title>チルノ</title>
   3375 <link>https://www.mtkn.jp/gallery/20231018.html</link>
   3376 <guid>https://www.mtkn.jp/gallery/20231018.html</guid>
   3377 <pubDate>Tue, 24 Oct 2023 00:00:00 +0900</pubDate>
   3378 <description><![CDATA[<h1>チルノ</h1>
   3379 <time>2023-10-18</time>
   3380 <img src="img/20231018.jpg">
   3381 ]]></description>
   3382 </item>
   3383 <item>
   3384 <title>結束バンド</title>
   3385 <link>https://www.mtkn.jp/gallery/20231005.html</link>
   3386 <guid>https://www.mtkn.jp/gallery/20231005.html</guid>
   3387 <pubDate>Tue, 24 Oct 2023 00:00:00 +0900</pubDate>
   3388 <description><![CDATA[<h1>結束バンド</h1>
   3389 <time>2023-10-05</time>
   3390 <img src="img/20231005.png">
   3391 ]]></description>
   3392 </item>
   3393 <item>
   3394 <title>後藤ひとり</title>
   3395 <link>https://www.mtkn.jp/gallery/20231007.html</link>
   3396 <guid>https://www.mtkn.jp/gallery/20231007.html</guid>
   3397 <pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate>
   3398 <description><![CDATA[<h1>後藤ひとり</h1>
   3399 <time>2023-10-07</time>
   3400 <img src="img/20231007.jpg">
   3401 ]]></description>
   3402 </item>
   3403 <item>
   3404 <title>イソヒヨ</title>
   3405 <link>https://www.mtkn.jp/journal/posts/20230810.html</link>
   3406 <guid>https://www.mtkn.jp/journal/posts/20230810.html</guid>
   3407 <pubDate>Thu, 10 Aug 2023 00:00:00 +0900</pubDate>
   3408 <description><![CDATA[<h1>イソヒヨ</h1>
   3409 <time>2023-08-10</time>
   3410 
   3411 <p>
   3412 最近イソヒヨが庭でよく遊んでいる。昨日も来た。部屋の窓からのぞきこんでも逃げない。里芋が植わっているあたりでなにかしている。突然里芋の方にとびかかったと思うと、そのまま隣の家の物干しまで飛んでいった。くちばしになにか太いものをくわえている。少しくわえ直してそのままどこかに行ってしまった。</p>
   3413 
   3414 <p>
   3415 里芋の葉には4、5日前からセスジスズメがいた。昨日の朝見たときはだいぶ太って目玉模様もはっきりしていた。元気に里芋を食いちらかしていた。イソヒヨが飛んでいった後確認するも姿が見えない。くわえていたのはセスジスズメだったのか。</p>
   3416 
   3417 <p>
   3418 少し前にも里芋にセスジスズメがついていたが、気づいたら一匹もいなくなった。その前にはニンジンについたキアゲハが一晩でいなくなった。犯人はこいつか。</p>
   3419 ]]></description>
   3420 </item>
   3421 <item>
   3422 <title>サマータイムレンダ読んだ</title>
   3423 <link>https://www.mtkn.jp/journal/posts/20230803.html</link>
   3424 <guid>https://www.mtkn.jp/journal/posts/20230803.html</guid>
   3425 <pubDate>Thu,  3 Aug 2023 00:00:00 +0900</pubDate>
   3426 <description><![CDATA[<h1>サマータイムレンダ読んだ</h1>
   3427 <time>2023-08-03</time>
   3428 
   3429 <p>
   3430 サマータイムレンダを読んだ。弟が漫画を買ってリビングに置いて母や妹に読ませていた。ある日なにげなくパラパラめくり始めたのだが、気づけば全部読んでしまっていた。13巻で完結するコンパクトな漫画である。</p>
   3431 
   3432 <p>
   3433 話の内容はサスペンスとしては面白かった。サスペンス自体を論評する知識はないが、少なくとも僕は楽しめた。話の構成とその展開が上手いのだと思う。</p>
   3434 
   3435 <p>
   3436 ところが最後の方に来て少し残念な感じになった。展開はそれまで通りのものに加え、クライマックスの勢いが付いているのだが、黒幕の動機がどうもうすっぺらい。そんな幼稚なやつにふりまわされていたのかと思うと、話の展開が面白いだけになんとも空虚になる。300年前に生まれた神職がそんなこと考えるのかも疑問である。そして動機がただ利己的であるがゆえに、悪役がどこから見てもただの悪役でしかない。だからこそ結末はこの悪役を倒してめでたしめでたしとしかならない。その上途中でおこった取り返しの付かないはずのことも、結局うまいことひっくり返して何も失わずにハッピーエンドを迎えた。これもあまり好みではなかった。</p>
   3437 <p>
   3438 この辺に関して個人的には最近読んだ「風の谷のナウシカ」のコミックがよかった。こちらには完全な悪がでてこない。敵であってもそれぞれなにかしらの事情があり、それぞれの信念に基いて行動している。だからこそ悪を殲滅して終りにはならないし、敵に勝ってもやるせない。このすっきりしなさが物語に重層性を持たせているように思う。さらに起ったことは事実として定着し、覆ることがないというのも重要なテーマとしていたように思う。どんな過去であっても今の自分たちの生命を以って未来を切り開くというものである。題材も内容も全く違う作品なので比べてもしょうがないが。</p>
   3439 
   3440 <p>
   3441 僕はそもそも死んで時間が戻るのは好きではない。人生の一回性が無くなってしまうからだ。しかしこの作品は死んで時間が戻るといっても、一応完全には取り返しの付かないようになっている。それもあって楽しめたのだが、最後の最後で全部なかったことにしてしまったのは残念である。</p>
   3442 
   3443 <p>
   3444 それから、時間が戻る際に主人公は意識が連続しているので、完全に同一人物といえるかもしれないが、その他の登場人物はどうなのか。戻る前と戻った後では同じ意識の人間なのか。主人公から見れば自分以外に主観は無いので、時間が戻っても以前と同じ人間に見えるだろうが、しかしそれでいいなら本人もコピーされた影も同じだということにならないだろうか。この点について、どこかで問題提起されていたと思うが、結局回収されずにおわった。最後のハッピーエンドはあくまでも本人のみのものであり、それまでに死んだ他の登場人物は結局そのままなのではないだろうか。これもひとつの大きなテーマだと思っていただけに、どうも疑問が残る。</p>
   3445 
   3446 <p>
   3447 最後に、「あっぽけ」って言ってる人は見たことがない。「今日わは...」については大阪人の友達に言ってきょとんとされた経験がある。</p>
   3448 ]]></description>
   3449 </item>
   3450 <item>
   3451 <title>着物できた</title>
   3452 <link>https://www.mtkn.jp/journal/posts/20230802.html</link>
   3453 <guid>https://www.mtkn.jp/journal/posts/20230802.html</guid>
   3454 <pubDate>Wed,  2 Aug 2023 00:00:00 +0900</pubDate>
   3455 <description><![CDATA[<h1>着物できた</h1>
   3456 <time>2023-08-02</time>
   3457 
   3458 <p>
   3459 作っていた着物が完成した。思っていたよりもずっと簡単だった。細かいところを追求すれば職人技なのだろうが、日常的に使うものを作るには素人でも十分である。</p>
   3460 
   3461 <p>
   3462 初めは白衣のつもりで安物の晒をそのまま使って作り始めたが、白衣を着ることが無くなってしまったので、袖と衿だけ柿渋で染めて襦袢にすることにした。形は長着だが。</p>
   3463 
   3464 <p>
   3465 完成後、右の衿がかなりずれて付いていることに気付いた。このときは疲れからか不幸にもこのままでいいやと思っていたが、見れば見るほど気になって、とうとうこの部分だけ付けなおすことにした。そして完成したのがこれである。</p>
   3466 <img src="20230802.jpg" alt="初めて自作した着物の写真" />
   3467 
   3468 <p>
   3469 ほんのひと昔前までは着物を作る人などその辺にいくらでもいた。世話になっていた寺の住職のお婆さんは和裁の先生だったそうだし、僕の祖父母より少し若いお茶屋さんは、自分のお母さんが家族の着るものを自分で作っていたという。つまり僕の3、4世代前は着物を自作するのが当たり前だった。ところがこの50年程の間にだれも作らなくなってしまった。和服に限らず自分で作れば安上りなのに。</p>
   3470 
   3471 <p>
   3472 なぜ自作しないのかと聞くと、きっと「そんな時間はない」という答えが返ってくる。金銭的にゆたかになって、自分で服を作る必要がなくなった。のではなく、服を作るような時間的余裕のある人がいなくなったというのが実情である。はて。</p>
   3473 ]]></description>
   3474 </item>
   3475 <item>
   3476 <title>無題</title>
   3477 <link>https://www.mtkn.jp/journal/posts/20230729.html</link>
   3478 <guid>https://www.mtkn.jp/journal/posts/20230729.html</guid>
   3479 <pubDate>Sat, 29 Jul 2023 00:00:00 +0900</pubDate>
   3480 <description><![CDATA[<h1>無題</h1>
   3481 <time>2023-07-29</time>
   3482 <p>
   3483 最近持っている浴衣がどれもぼろぼろになってきた。元々古いもらいものなうえ、着方も動き方もなってないので着ているとすぐにどこか破れる。補修しながら使っていたが、いよいよ布自体がすり切れてきた。いい機会なので自分で仕立ててみようと思いたった。
   3484 実は寺に居たころに白衣を作ろうと思い、晒の裁断と袖の縫いまでしていた。ほったらかしになっていたこれを再開することにした。</p>
   3485 <p>
   3486 腋縫いまでしていたこの着物に、今日はおくみを片方だけ付けた。両方したかったが疲れたのでもう片方はまた今度。色が付いていないただの晒だが、白衣など着る機会が無くなってしまったので、袖と襟だけでも染めることにした。家にころがっていたターナーの無臭柿渋を3倍に薄めて染めた。本当は自分で育てた柿を使いたいが、そんん場所はないので買ってきた渋である。柿渋は紫外線で硬化して定着するらしく、媒染剤は必要ないようである。襦袢くらいには使えるだろうか。</p>
   3487 
   3488 <p>
   3489 梅を塩に漬けているのを思いだしたのでこれを庭に干した。県民の義務である。そして今日は土曜である。本当は自分で育てた梅を使いたいが、そんな場所はないので買ってきた梅である。残った梅酢は生姜でも漬けようか。</p>
   3490 
   3491 <p>
   3492 庭に植えた里芋から芽がでてきた。大野芋というものであるが、僕が住んでいる場所とは関係がない。既に大きな葉が付いていたのだが、セスジスズメという芋虫にやられて禿げていた。四匹いたのだがある晩二匹減り、二日後にもう一匹、そしていつのまにか最後の一匹が居なくなっていた。なにかに食べられたのか。蛹は見ていない。以前ニンジンの花がキアゲハにやられた時も、たくさん居た芋虫が一晩で一匹も居なくなっていた。ところで芋虫というのは見ているとなんだか美味しそうに見えてくる。実際美味しいらしい<sup>[1]</sup>が。まだ食べる勇気はない。</p>
   3493 <p>
   3494 この里芋は葉だけでなく茎を根本までかじられて切り株のようになっていたが、その切り株の中心が少しづつ盛り上がってきている。芋は強い。
   3495 </p>
   3496 
   3497 <ul>
   3498 <li>[1]<a href="https://survivalnature.sakura.ne.jp/0000/11_mushi/imomushi/0000.html">イモムシ・ケムシ.サバイバル節約術</a></li>
   3499 </ul>
   3500 
   3501 ]]></description>
   3502 </item>
   3503 <item>
   3504 <title>GOPL読んだ</title>
   3505 <link>https://www.mtkn.jp/journal/posts/20230726.html</link>
   3506 <guid>https://www.mtkn.jp/journal/posts/20230726.html</guid>
   3507 <pubDate>Wed, 26 Jul 2023 00:00:00 +0900</pubDate>
   3508 <description><![CDATA[<h1>GOPL読んだ</h1>
   3509 <time>2023-07-26</time>
   3510 <p>
   3511 Alan A. A. DonovanとBrian W. Kernighanの「The Go Programming Language」を読了した。読み初めた日付は記録していないが、演習問題用のgitリポジトリは、今年の5月19日が最初のコミットである。二ヶ月ちょっとかかった。本文だけでなく演習問題も濃かった。時間をかけて読む価値があると思う。Kernighanの書いた本は英語が綺麗でいい。</p>
   3512 <p>
   3513 アマゾンで英語の原著を買ったが、表紙の紙のコーティングみたいなビニールが剥れてきているのが残念。</p>
   3514 ]]></description>
   3515 </item>
   3516 <item>
   3517 <title>水道と空調</title>
   3518 <link>https://www.mtkn.jp/journal/posts/20230725.html</link>
   3519 <guid>https://www.mtkn.jp/journal/posts/20230725.html</guid>
   3520 <pubDate>Tue, 25 Jul 2023 00:00:00 +0900</pubDate>
   3521 <description><![CDATA[<h1>水道と空調</h1>
   3522 <time>2023-07-25</time>
   3523 
   3524 <h2>水道</h2>
   3525 <p>
   3526 水道が普及して井戸が使えなくなった。水道があれば井戸から飲み水を汲む必要がない。井戸から飲み水を汲まなくなれば井戸水が無くなっても、あるいは汚染されても問題ない。問題なければその通りになる。水源を涵養するという考えが忘れられ、森がコンクリートで覆われた。水が汚なくても良くなったので農薬や肥料を大量に使うようになった。そして井戸は水位が下り、汚染された。</p>
   3527 <p>
   3528 便利な水道が普及した為に、水道が無いと不便な世界になった。不便というよりそれがないと生きるのもままならない。現在我々はそのインフラの維持費と、災害時の脆弱性に悩まされている。</p>
   3529 <h2>空調</h2>
   3530 <p>
   3531 空調が普及したら気温が高くなった。逆ではない。空調があれば気温が高くなっても問題ない。問題なければその通りになる。街から植物が一掃されコンクリートとアスファルトで覆われた。暑くても問題ないので経済優先で自動車の為の道路ばかり整備された。そして街の気温は上った。</p>
   3532 <p>
   3533 便利な空調が普及した為に、空調が無いと不便な世界になった。不便というよりそれがないと生きるのもままならないようになりつつある。</p>
   3534 <p>
   3535 そのうち空調の効率を上げるために、都市全体が大きなドームに覆われる。ドームの外は50℃か60℃か。このインフラもまた維持費と災害に対する脆弱性で我々を悩ませることになろうか。</p>
   3536 ]]></description>
   3537 </item>
   3538 <item>
   3539 <title>新型コロナウイルスとその対策に関する個人的見解</title>
   3540 <link>https://www.mtkn.jp/journal/posts/20220730.html</link>
   3541 <guid>https://www.mtkn.jp/journal/posts/20220730.html</guid>
   3542 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   3543 <description><![CDATA[<h1>新型コロナウイルスとその対策に関する個人的見解</h1>
   3544 <time>2022-07-30</time>作成<br>
   3545 <time>2022-08-03</time>更新<br>
   3546 <h2>はじめに</h2>
   3547 <p>
   3548 新型コロナウイルスとその対策に関していろいろと思うことはあるが、自分のなかでもあまりまとまっていないうえ、前提となる知識や情報、考えの論理的整合性がとれていない部分が多々ある。それもあってあまり文章として僕の考えを書こうとは思っていなかった。しかし今回の感染症が流行りだして2年と半年が経ち、いまだに社会全体がおかしい(と僕が思う)状態である。そのため自分も黙っているのはむしろ無責任ではないかと思いここに書き残すことにした。どうせほぼ見てくれる人はいないだろうけれど、それでもなにかしたかった。
   3549 </p>
   3550 <p>
   3551 僕自身はどんなことがあろうがそれを運命と呼び、それを受け入れる覚悟である。その方が日々楽しく生きて納得の上で死んで行けるように思うのだ。自分でも素人なりに論文を読んだりして可能な限り信頼性の高い情報を集めようとはしているのだが、このような考えが根底にあるので、科学的な根拠というのはなんだかどうでもよく思えてきたりするもので、どうも今持っている知識というのがふわっとして正確性に欠ける。しかしだからこそ書きとめて後で反省できるようにしたい。
   3552 </p>
   3553 <p>
   3554 そのためこの文章は正確な知識に基くものではない。本来論文等をきちんと引用するべきところだが、とりあえず現時点での考えとして公開することにした。また、自分では気を付けているつもりだが、知らないうちに陰謀論を掴まされている可能性もある。おかしな点は指摘してくれるとありがたい。
   3555 </p>
   3556 
   3557 <h2>概要</h2>
   3558 <p>
   3559 マスクは今回の感染症を防ぐ効果は非常に限定的だと思う。一方でその副作用は大きい。体が常に酸素の薄い状態になっている。夏は熱中症の危険もある。却って口が乾燥するという人もいる。なによりの懸念は子供の発育への影響である。他人の表情が見えなくてどうしてまともに育つのか。
   3560 </p>
   3561 <p>
   3562 ワクチンについても効果は薄く、副反応が大きいので打つべきではないと思う。特に若年層は発症した際のリスクが低く、逆にワクチンによるものと思われる心筋炎等の可能性が高い。さらに打ったからといって感染する確率は変らないようだ。
   3563 </p>
   3564 <p>
   3565 消毒もやらない方がいいと思う。
   3566 </p>
   3567 <p>
   3568 またこの病気自体危険性がそこまで高くないので、そもそも感染の拡大を防ぐ必要はないと思う。
   3569 </p>
   3570 <p>
   3571 さらに、例え危険な病気が流行したとしても、人間味のある生活を犠牲にすることのデメリットとその病気の危険性とを天秤にかけ、どのような対策が適正なのかをきちんと議論すべきである。
   3572 </p>
   3573 <p>
   3574 ところがそのような冷静な考察をする上で必要な情報がなにひとつみあたらない。感染者数や死者数として発表される数字は統計として信用できないだけでなく、医療機関に対する補助金等により大きく歪められている可能性が高い。
   3575 </p>
   3576 <p>
   3577 また、マスクやワクチン等は同調圧力により行っている人が多いと思う。周囲の人間がやっているからといった理由だけでの行動である。このような世間の流れは非常に危険だと思う。今回は軽い風邪でしかなかったが、この程度のことでここまで社会全体がひとつの空気に支配されているようでは、本当に国運を分けるようなことに見舞われればひとたまりもない。意見の多様性を無視してひとつの流れを作ってしまうと、その流れが間違っていたときに国が滅びるだろう。
   3578 </p>
   3579 <p>
   3580 しかしやはり一番心配なのは今このような環境のなかで自我を形成している子供である。マスクやワクチンはそれ自体が非常に強く影響する上、同調圧力も重くのしかかる。こんな状態で子供が健全に育つとはとても考えられない。10年、20年あるいはもっと先かも知れないが、今の子供達がこの国を動かすようになれば必ず大きな問題があちこちで噴出することになるだろう。
   3581 </p>
   3582 <p>
   3583 そもそもウイルスは敵ではない。生態系の重要な一員である。共存していけばいいのだ。
   3584 </p>
   3585 
   3586 <h2>マスクについて</h2>
   3587 <p>
   3588 一応いろいろな論文を読んだ。マスクの効果に肯定的なものも否定的なものもあった。僕が読んだものはTwitterで拡散されているものが中心であるが、そのなかでマスクの効果に肯定的なものは、電話やメール等による調査とシミュレーションによるものばかりだった。前者は論文の中でも明記されているが、回答するかしないかは回答者に委ねられており、また回答者のバイアスもあり、とても信頼できるものとは言えないと思う。後者についてはマスクには定性的には効果があるとの前提に立って、その効果を定量的に測るものであるため、こちらも本当に意味があるものかどうか相当あやしいと思う。日本においてもスーパーコンピュータの富嶽によるシミュレーションを何度も目にしたが、これもマスクにより飛沫が防げると言っているだけで、だからウイルスに対してどう影響があるかという点については説明していない。マスクをすれば飛沫が飛びにくくなるのはスーパーコンピュータで計算するまでもなく理解できることではないか。一方でマスクの効果に否定的な論文には、RCT等、無作為性の高い手法を用いたものが多く、こちらのほうが信頼性が高いと判断した。ところでウイルスがマスクの繊維の隙間の大きさよりも圧倒的に小さいのでマスクに効果がないと言う人もいるがこれについてはなんとも言えないと思っている。マスクの穴が大きくても、例えば繊維に静電気で吸着されたりするかもしれない。このような可能性だけで議論すればいつまでも答えがでない。やはり信頼できる根拠というのは現実の観測であって無作為性の高い統計的手法によるものだと思う。
   3589 </p>
   3590 <p>
   3591 続いてマスクの害について、先日マスクを着用しないと参加できないという場にどうしても行く必要があり、久々に着用した。あまりにも苦しかった。自分が喘息を持っているということもあるかもしれないが、明かに脳に届く酸素が少いと思う。これはバイアスかなあ。このような状態で2年以上も過している人の脳にはなにかしらの障害が起きていてもおかしくないと思うのだが。あるいはマスクにより口呼吸になり却って喉が乾くという話もある。喉が乾けばウイルス等に対する防御も手薄になるだろう。また不織布マスクからはマイクロプラスチックが放出され、それを大量に吸い込み続けているという話も聞く。マイクロプラスチックを吸い込むことと肺癌とを結び付ける話もあるがこの辺はあまりきちんと確かめていない。他にもいろいろなリスクがあるだろうが、一番重大なものはやはり子供の発育である。生れたときから周囲の人間がマスクをした状態で、どうして人間の表情や感情、あるいは言語を学ぶというのだろう。生まれたての赤ちゃんでなくても、他人との人間関係を学び自我を形成している最中の子供達にとって、周囲の表情が分からないのはあまりにも影響が大きいのではないだろうか。大人でもマスクをした他人の表情を読みとるのはマスクをしていない場合よりも難しいが、子供の場合はそれがさらに顕著であるという。このように社会全体が長期に亙ってマスクで顔を覆っていては、今の子供達の世代が将来酷く歪んだものになると思う。これに関して警鐘を鳴らしている人はいるが、社会全体では無視されている。これには科学的根拠はあまりないようだ。結果が出るのが数十年後であろうから当然である。しかしだからといって子供を虐げていい理由にはならないだろう。子供がまともに育たずに害を被るのは彼らが成長したときに年寄になっている今の我々自身かも知れない。ところで徳川時代において、徳川家の子供は生まれた時から尊いというので、乳母は母乳を与える際に顔を見せないようになにか被っていたらしい。それとの因果関係は不明だが、徳川家の子供は当時の平均よりも死亡率が高かったという。この話もきちんと確かめなければ。一方マスクのせいで子供の方が表情を作れなくなるのではないかと考えていたこともあるがこれについてはどうやら心配ないかもしれない。チンパンジーかなにかの実験で、子供の時から他の個体の表情を見せないように育てても、本人は表情を作ることに障害はなかったそうだ。表情の作り方は本能に実装されているらしい。
   3592 </p>
   3593 
   3594 <h2>ワクチンについて</h2>
   3595 <p>
   3596 ワクチンの効果は非常に限定されているようである。当初は一回打てば感染しなくなり、今回の騒動も収まると言っていたように思う。当時からそんな訳ないやろとは思っていたが、案の定全く収束する気配はない。二回目には打てば重症化しなくなり、感染の拡大も終わると言い、三回目もこれで終りだと言っていた。そして今は四回目である。僕は一回も打っていないが、これまで政府の言うことを信じて打って来た人は未だに感染の拡大が収まらないことをどのように考えているのか不明である。更に四回目を打てと言われれば未だにその指示に従う理由もよく分からない。
   3597 </p>
   3598 <p>
   3599 また副反応も大きいではないか。いちいち高熱がでて苦しんでいる人が沢山いる。僕の父も三回目にやたら高熱がでて仕事の最中に会社から帰って来て家で寝ていた。心筋炎の危険も高いようである。政府がデータをちょろまかしていたと言う話があったが、ワクチンを打った場合と打たなかった場合では打った場合の方が圧倒的にリスクが高いようだ。そもそも今回のワクチンは従来のものとは根本的に違う新しいものであり、その安全性も未知数である。特に長期的な影響についてはなにも分かっていないのではないか。もちろん新しい技術には常に危険が付いてまわるものである。それを理解したうえで打ちたいと言う人は本人の責任で打てばいい。ただし今回のように国民全員に打たせようというのは間違いである。こんなことをしてしまっては万が一この新しい技術に長期的な危険性があった場合に全国民がその影響を受けることになる。卵はひとつの籠に入れて運んではいけないのだ。
   3600 </p>
   3601 <p>
   3602 ところでワクチンを打つのが無料だと思っている人が多いようだがそんな訳ないやろ。全部国の金であり、つまりは我々の税金である。国債でも発行してくれるのならまだいいが、東日本大震災の前例があるのでどうせ増税されるに決まっている。その時はぜひともワクチンを打った人にのみ課税してもらいたいものだ。僕は払いたくない。また万が一このワクチンに長期的な後遺症等の危険があることが判明でもすれば、その治療にも国民健康保険という名の税金が使われるのだろうと思うとやるせない。
   3603 </p>
   3604 
   3605 <h2>消毒について</h2>
   3606 <p>
   3607 消毒についても意味がないだけでなく逆効果である可能性もあると思う。手指消毒に関しては、一般に行われている程度のものではウイルスが死滅するとは思えない。ウイルスが死滅する程の消毒をいちいち行っていては、常在菌をも殺してしまい、さらに皮膚に備わっている物理的な免疫機構も働かなくなると思う。結局これも対策をしているというアピールの為のものでしかないのではないか。
   3608 </p>
   3609 
   3610 <h2>新型コロナウイルス感染症の危険性について</h2>
   3611 <p>
   3612 この病気はそんなに危険なものであるとは思わない。死亡も重症化もそんなに数が多くない。また先日厚生労働省のウェブページのデータから計算してみると死者の平均年齢が男性で79歳程度、女性で83歳程度と、ほとんど平均寿命に近いものになっている。これは病気で死んでいるというよりも寿命ではなかろうか。ただしこの計算に使ったデータは年齢が10歳区切りであるのであくまでも概算である。病院がパンクしそうだという話も、どうやら軽傷の人が大量に流れこんできていて大変だということらしい。政府がこの感染症の扱いを5類に引き下げれば済む話のようだ。
   3613 </p>
   3614 
   3615 <h2>人間味のある生活とのおりあいについて</h2>
   3616 <p>
   3617 今回の騒動では強権的な対策が次々と打ち出された。マスクやワクチンの推奨は半ば強制力を伴ったものとなり、飲食店の営業自粛では法的拘束力が無いにしても、従わない店は名前を公開するなどされていた。個人的な行動も同様であった。それまであたりまえに行われてきた人間らしい生活が奪われた形になる。その後、因果関係は分からないが、自殺者が大きく増えたようだ。人間が行うことには必ず負の面がある。個人の自由を制限することにはそれなりのコストが伴うのだ。危険な感染症が流行したからといってただちに人権を制限することになりかねない今回のような対策をするのは間違っている。この対策により発生する種々のコストと、対策をしなかったときの危険を天秤にかけて考える必要があろう。命を守る為と言って一切の楽しみを奪われたのでは今すぐ死んだ方がましである。あるいは命を最優先にするにしても、その命の中には当然対策をしたがために自殺に追い込まれる人も入っているはずである。国という大きな組織を運営していく上ではなんらかの数字を見て次の行動を判断せざるを得ない訳だが、その数字として死者数を考えた場合でも、対策をしないがために死ぬ人の数と対策をしたために死ぬ人の数の双方を考慮せねばなるまい。
   3618 </p>
   3619 
   3620 <h2>必要な情報の欠如について</h2>
   3621 <p>
   3622 上のような冷静な議論に必要なのが正確な情報である。感染症によって何人死んだのか、何人がどれほどの後遺症に苦しんでいるのか、逆に何人が感染症対策の為に死んだのか等の情報である。ところが今得られるそのような情報にはどれも正確さが欠如している。感染者数として発表されているのは無作為ではない方法でPCR検査をして陽性になった人の数である。東京都ではPCR検査を行う施設に補助金が出るので、接種を受ける人に商品券を配って集客している所もあると言う。そもそもPCR検査の開発者であるキャリー・マリス氏はこの検査は感染症の診断に利用すべきでないとの見解である。またこの感染症による死者数として発表されているのはあらゆる原因の死者のうちPCR検査により陽性だった人の数である。別の原因で死んでも陽性であれば新型コロナウイルス感染症による死者である。更に、新型コロナウイルス感染症により患者が死亡すればその病院に補助金が出ると言う話もある。結局この感染症の本当の姿というのは一切見えてこない。テレビ等ではひたすら上のような定義の感染者数ばかり報道して視聴者の恐怖を煽っているだけである。ただでさえいい加減な定義の数字をさらに補助金によって歪めているのが現状である。このような状況で市井の人々は一体なにを怖がっているのか不明である。
   3623 </p>
   3624 
   3625 <h2>同調圧力について</h2>
   3626 <p>
   3627 このような状況において、結局人々はどうしていまだにマスクをしてワクチンを打つのかといえば、それは同調圧力によるものである。もちろん一部にはこのウイルスを本当に恐れている人もいるだろうが、僕の周りではかなり少数派である。むしろ周りの目を気にしている人が大多数だろう。あるいは単に世の中の流れだからという理由でそれに付き従っている人も少なくない。中には自分が苦しい思いをしてマスクを着けているのだからお前も苦しいのを我慢して着けろと言う人や、周囲が常識として受け入れていることなのだから自分もしないと恥をかくと言う人もいる。同調圧力を感じてそれに屈っしてマスクを着用している人も居るが、それでは結局自分自身がその同調圧力になり、それを維持してしまっているではないか。このようなことでは結局いつまでたってもやめられない状態に陥ってしまう。というか陥っている。
   3628 </p>
   3629 <p>
   3630 僕は上に書いた通りマスクは効果も必要性もなく害があると思っているので着用しない。この考えが本当に正しいかどうかは正直よく分からないが、少なくともマスクを着ける効果や必要性がないと思っているのであれば周りの目など気にせずにその通り行動するべきだと思う。同調圧力に弱い人というのはおそらく社会の流れに合わせてさえいればその流れが間違っていても自分には責任が生じないと考えているのだろう。ところで僕は今のようにマスクを強要するような状態が長く続けば必ず取り返しの付かないような問題がでてくると思っている。特に子供は同調圧力による影響を受けやすいように思う。学校でマスクをしなかったりワクチンを打っていなかったりしていじめられるという話も聞く。彼らは大人になっても周囲を伺うばかりで何一つ判断できない人材になるだろう。このような人達が国を運営する時代がいずれ来る。そのような社会で老後を過ごさなければいけないのは結局この社会の流れに同調していた人自身である。社会の趨勢に任せておけば確かに明確に責任を追求されることはないかも知れないが、その結果の尻拭いをするのは自分自身なのだ。
   3631 </p>
   3632 <p>
   3633 国を形作っているのは自分達自身である。国民とは別に政府が存在するのではなく、政府は国民自身が作るものである。個人とは別に社会の流れがあるのではなく、自分達が社会の流れそのものなのである。自分の頭で考え自分が信じたことを行動で周囲に示すのはむしろ社会に生きる一個人としての責務ではなかろうか。選挙で投票するのは国民の責務だというのと同じである。
   3634 </p>
   3635 
   3636 <h2>意見の多様性について</h2>
   3637 <p>
   3638 同調圧力と関連するが、社会をいい方向に進める上で重要なのが意見の多様性である。ここに書いていることは僕個人の考えであり、それが正しいものかどうかはよく分からない。科学者の中にもマスクやワクチン等に関して種々の意見があり、統一されているものではない。そもそも科学は不完全なものなので科学者の意見が統一されてもそれが正しいかどうかはっきり言えるものではないだろう。個人の信条の問題も絡むといよいよ統一した見解というものを出すのは不可能である。しかしこのような意見の多様性というのがむしろ重要なのではないだろうか。多様な意見があればそのなかで最もいいものが生き残っていく。我々人間を含む生物というのはこのようにして進化し、生き残ってきたのではないだろうか。その結果が混沌のなかにある種の調和がとれたこの大自然というものであろう。
   3639 </p>
   3640 <p>
   3641 ところが今のように一方の意見に統一して他方を無視し、あるいは排除しようとするのはあまりにも危険である。もし社会が選んだ方が間違っていたら人類は絶滅である。卵はひとつの籠に入れて運んではいけない。まあそのような世界になるのもひとつ楽しみであるかも知れないが。
   3642 </p>
   3643 
   3644 <h2>子供について</h2>
   3645 <p>
   3646 しかしなんといっても最優先して考えるべきは子供の未来ではないだろうか。今の感染症対策は結局のところ年寄の命を守る為に子供の生活を犠牲にしているというものである。別に対策などしなくてもこの病気で死ぬ年寄はこの病気でなくても死ぬだろうと僕は思うが、そうでなくてもこの感染症の死者および重症患者はやはり高齢者が中心であろう。そして高齢者を守る為であれば子供の生活や成長が犠牲になるということなど議論の俎上にも登らない。どのみちそう長くない高齢者の命と、この先国の中心を担っていく現在の子供達の生活や成長とどちらが大事なのかは考える余地もないと思うのだが現状そんなことを言っている人は少ないようである。今子供達の生活を鑑みずに自分達の命を最優先に考えて行動している年寄は恥を知れ。
   3647 </p>
   3648 <p>
   3649 子供への悪影響は多岐に渡る。マスクやワクチン、消毒等の直接の影響と、これらすべてに関連した同調圧力による影響である。これらは各項目の所で書いたのでここでは繰り返さない。
   3650 </p>
   3651 
   3652 <h2>ウイルスは敵ではない</h2>
   3653 <p>
   3654 思うにウイルスは人類の敵ではない。彼らに感染することで他種の生物と遺伝情報のやり取りができると聞く。人間は人間だけで自然界を生きている訳ではない。互いに影響しあい、時には殺し合い、あるいは寄生しあい、生きているものである。そうしてあらゆる生物がその総体としてひとつの生態系を形成しているのだと思う。人間の命を最優先にして他の生命を排除するようではそのうち生態系の方から人類が見捨てられることにもなるだろう。ウイルスの方は我々と共存する道を探りながら進化している。人間の方もそれに応えるべきだ。
   3655 </p>
   3656 
   3657 <h2>最後に</h2>
   3658 <p>
   3659 ここに書いたことは決して正確なことではない。僕の持っている科学的な知識や情報もいい加減なものである。ただし自信を持って言えるのは、僕は自分の頭で考えその結果正しいと思った行動を取っているということである。僕の考えが間違っていても、それは自分が正しいと思い、その通りに行動しているので、後で謝ることもできるし反省することもできる。自分で考えず、あるいは間違っていると思うことをしていては、後になって反省も謝罪もできない。そこにあるのは周りがやっていたから合わせただけで自分には責任がないという言い訳だけだ。しかしその結果どのような社会になろうが、自分もそこに住むことになるのだ。口で責任が無いとは言っても、結局その尻拭いは自分自身ですることになるのだ。今きちんと考えて自分の責任で行動しておかないと自分が死ぬ時にどんな顔をすればいいのか分からないだろう。食べてしまったケーキはとっておくことができないのだ。</p><div style="display: none;">別に爆弾は作らない。</div>
   3660 <p>
   3661 僕は他人に言われた通りやってつまらない人生を送るより、死ぬ危険があっても自分の信じたことをして生きたい。その方が死に直面したときに気分よく死ぬことができると思う。
   3662 </p>
   3663 ]]></description>
   3664 </item>
   3665 <item>
   3666 <title>x220から投稿テスト</title>
   3667 <link>https://www.mtkn.jp/journal/posts/20210106.html</link>
   3668 <guid>https://www.mtkn.jp/journal/posts/20210106.html</guid>
   3669 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   3670 <description><![CDATA[<h1>x220から投稿テスト</h1>
   3671 <time>2021-01-06</time>
   3672 <p>
   3673 thinkpad x220を手に入れ、arch linuxの環境を整えた。
   3674 </p>
   3675 <p>
   3676 スペックはこんな感じ:
   3677 </p>
   3678 <ul>
   3679 	<li>core i7 2620M</li>
   3680 	<li>メモリ 8GB</li>
   3681 	<li>ssd 256GB。</li>
   3682 </ul>
   3683 <p>
   3684 ヤフオクで送料入れて15000円程度だった。
   3685 </p>
   3686 <p>
   3687 画面はTNだろうと思って買ったが、
   3688 届いたら視野角が広くて非常に見易いので
   3689 多分IPSであろう。
   3690 これは結構うれしい。
   3691 </p>
   3692 <p>
   3693 全体的に綺麗な個体だ。
   3694 </p>
   3695 <p>
   3696 バッテリーは期待通り完全に消耗していて、
   3697 起動後5秒ほどで切れてしまう。
   3698 </p>
   3699 <p>
   3700 あとwindows用の日本語キーボードはあんまり
   3701 好きではない。
   3702 いちばん下の段がぎゅうぎゅう詰めでスペースが
   3703 小さすぎる。
   3704 </p>
   3705 <p>
   3706 バッテリーを交換するのが先かキーボードをUS配列にするのが先か
   3707 悩ましいところだ。
   3708 </p>
   3709 ]]></description>
   3710 </item>
   3711 <item>
   3712 <title>Xlibで遊んでみる6</title>
   3713 <link>https://www.mtkn.jp/computer/xlib_playground6.html</link>
   3714 <guid>https://www.mtkn.jp/computer/xlib_playground6.html</guid>
   3715 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   3716 <description><![CDATA[<h1>Xlibで遊んでみる6</h1>
   3717 <time>2023-01-25</time>
   3718 
   3719 <p>
   3720 前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a>
   3721 </p>
   3722 <p>
   3723 言語: C言語<br />
   3724 ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a>
   3725 </p>
   3726 
   3727 <h2>ワールドマップの作成</h2>
   3728 <p>
   3729 ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロックの場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした:
   3730 </p>
   3731 <pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] =
   3732 "................................................................................"
   3733 "................................................................................"
   3734 "................................................................................"
   3735 "................................................................................"
   3736 "................................................................................"
   3737 "........b......................................................................."
   3738 "................................................................................"
   3739 "................................................................................"
   3740 "....b..........................................................................."
   3741 "................................................................................"
   3742 "................b..............................................................."
   3743 "..........................................................b..........b.........."
   3744 "................................................................................"
   3745 ".......................b........................................................"
   3746 "...........................................b...................................."
   3747 "...........................................b...................................."
   3748 "................................................................................"
   3749 "..................b............................................................."
   3750 "................................................................................"
   3751 "...........................................b...................................."
   3752 "................................................................................"
   3753 "................................................................................"
   3754 "...........................b...................................................."
   3755 "................................................................................"
   3756 "................................................................................"
   3757 "................................................................................"
   3758 "................................................................................"
   3759 "................................................................................"
   3760 "................................................................................"
   3761 "....................................bbbbbbbbbb.................................."
   3762 "................................................................................"
   3763 "................................................................................"
   3764 "................................................................................"
   3765 "................................................................................"
   3766 "................................................................................"
   3767 "................................................................................"
   3768 "..............................................bbbbbbbbbb........................"
   3769 "................................................................................"
   3770 "................................................................................"
   3771 "................................................................................"
   3772 "................................................................................"
   3773 "....................................bbbbbbbbbb.................................."
   3774 "................................................................................"
   3775 "................................................................................"
   3776 "................................................................................"
   3777 "................................................................................"
   3778 "..........................bbbbbbbbbb............................................"
   3779 "................................................................................"
   3780 "................................................................................"
   3781 "................................................................................"
   3782 "................................................................................"
   3783 "................bbbbbbbbbb......................................................"
   3784 "................................................................................"
   3785 "................................................................................"
   3786 "...p............................................................................"
   3787 "bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb"
   3788 "........................b.......b......................b...b...................."
   3789 "........................b.......b......................b...b...................."
   3790 "........................b.......b......................b...b...................."
   3791 "........................b.......b......................b...b....................";
   3792 </code></pre>
   3793 
   3794 <h2>プレイヤーの作成</h2>
   3795 <p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p>
   3796 <pre><code>struct rect {
   3797 	float ppx, ppy;
   3798 	float px, py;
   3799 	float vx, vy;
   3800 	float ax, ay;  // acceleration
   3801 	int w, h;
   3802 	int m;
   3803 };
   3804 </code></pre>
   3805 <p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p>
   3806 <pre><code>struct rect   block[NUM_RECT];
   3807 struct rect   player;
   3808 
   3809 /* ... */
   3810 
   3811 	int bi = 0;
   3812 	for (int i = 0; i &lt; WORLD_WIDTH * WORLD_HEIGHT; i++) {
   3813 		if (world_map[i] == 'b') {
   3814 			block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE;
   3815 			block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE;
   3816 			block[bi].ax = 0;
   3817 			block[bi].ay = 0;
   3818 			block[bi].vx = 0;
   3819 			block[bi].vy = 0;
   3820 			block[bi].w = block[bi].h = BLOCK_SIZE;
   3821 			block[bi].m = block[bi].w * block[bi].h;
   3822 			bi++;
   3823 		} else if (world_map[i] == 'p') {
   3824 			player.ppx = player.px =  i % WORLD_WIDTH * BLOCK_SIZE;
   3825 			player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE;
   3826 			player.vx = 0;
   3827 			player.vy = 0;
   3828 			player.ax = 0;
   3829 			player.ay = GRAVITY;
   3830 			player.w = player.h = BLOCK_SIZE;
   3831 			player.m = player.w * player.h;
   3832 		}
   3833 	}
   3834 </code></pre>
   3835 
   3836 <p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる:
   3837 </p>
   3838 <pre><code>void
   3839 handle_inputs(int key_state[])
   3840 {
   3841 	if (key_state[KEY_Q] == KEY_DOWN){
   3842 		next_menu = GAME_OVER;
   3843 		return;
   3844 	}
   3845 	if (key_state[KEY_D] == KEY_DOWN) {
   3846 		if (player.vx &gt; 0) {
   3847 			player.ax = 500;
   3848 		} else {
   3849 			player.ax = 1000;
   3850 		}
   3851 	} else if (key_state[KEY_A] == KEY_DOWN) {
   3852 		if (player.vx &gt; 0) {
   3853 			player.ax = -1000;
   3854 		} else {
   3855 			player.ax = -500;
   3856 		}
   3857 	} else {
   3858 		if (player_is_falling)
   3859 			player.ax = -player.vx;
   3860 		else
   3861 			player.ax = -3 * player.vx;
   3862 	}
   3863 
   3864 	if (player.vx &lt; -200) player.vx = -200;
   3865 	if (player.vx &gt; 200) player.vx = 200;
   3866 	if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN)
   3867 		player.vy = -450;
   3868 }
   3869 </code></pre>
   3870 
   3871 <p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p>
   3872 <pre><code>void
   3873 rect_next_tick(struct rect *s, long ndt) // nano second
   3874 {
   3875 	s-&gt;ppx = s-&gt;px;
   3876 	s-&gt;ppy = s-&gt;py;
   3877 	s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000;
   3878 	s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000;
   3879 	s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000;
   3880 	s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000;
   3881 
   3882 	// bind within the window
   3883 	if (s-&gt;px &lt; 0) {
   3884 		s-&gt;px = 0;
   3885 		//s-&gt;vx *= -1;
   3886 	}
   3887 	if (win_width &lt; s-&gt;px + s-&gt;w) {
   3888 		s-&gt;px = win_width - s-&gt;w;
   3889 		//s-&gt;vx *= -1;
   3890 	}
   3891 	// game over when fall out of the screen
   3892 	if (s-&gt;py &gt; win_height)
   3893 		next_menu = GAME_OVER;
   3894 }
   3895 </code></pre>
   3896 
   3897 
   3898 <h2>完成品</h2>
   3899 <p>
   3900 <a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a>
   3901 </p>
   3902 <p>
   3903 <video controls>
   3904 <source src="videos/ex6.webm" type="video/webm">
   3905 </video>
   3906 </p>
   3907 
   3908 <h2>参考</h2>
   3909 <ul>
   3910 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   3911 </ul>
   3912 ]]></description>
   3913 </item>
   3914 <item>
   3915 <title>Xlibで遊んでみる5</title>
   3916 <link>https://www.mtkn.jp/computer/xlib_playground5.html</link>
   3917 <guid>https://www.mtkn.jp/computer/xlib_playground5.html</guid>
   3918 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   3919 <description><![CDATA[<h1>Xlibで遊んでみる5</h1>
   3920 <time>2023-01-03</time>
   3921 
   3922 <p>
   3923 前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a>
   3924 </p>
   3925 <p>
   3926 言語: C言語<br />
   3927 ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a>
   3928 </p>
   3929 
   3930 <h2>円の衝突判定とその処理</h2>
   3931 <p>
   3932 前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である:
   3933 </p>
   3934 <pre><code>struct circle {
   3935 	float ppx, ppy;  // previous position (center)
   3936 	float px, py;    // current position (center)
   3937 	float vx, vy;    // velocity
   3938 	int r;           // radius
   3939 	int m;           // mass
   3940 };
   3941 
   3942 int
   3943 circle_test_collision(struct circle *c1, struct circle *c2)
   3944 {
   3945 	return (c1-&gt;px - c2-&gt;px) * (c1-&gt;px - c2-&gt;px) +
   3946 	       (c1-&gt;py - c2-&gt;py) * (c1-&gt;py - c2-&gt;py) &lt;
   3947 		   (c1-&gt;r + c2-&gt;r) * (c1-&gt;r + c2-&gt;r);
   3948 }
   3949 </code></pre>
   3950 
   3951 <p>
   3952 衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。
   3953 </p>
   3954 <pre><code>
   3955 void
   3956 circle_handle_collision_mm(struct circle *c1, struct circle *c2)
   3957 {
   3958 	if (!circle_test_collision(c1, c2))
   3959 		return;
   3960 
   3961 	float col_px = c2-&gt;px - c1-&gt;px;
   3962 	float col_py = c2-&gt;py - c1-&gt;py;
   3963 	float col_pr = sqrtf(col_px * col_px + col_py * col_py);
   3964 	col_px /= col_pr;
   3965 	col_py /= col_pr;
   3966 
   3967 	c1-&gt;px = c1-&gt;px - col_px / 2;
   3968 	c1-&gt;py = c1-&gt;py - col_py / 2;
   3969 	c2-&gt;px = c2-&gt;px + col_px / 2;
   3970 	c2-&gt;py = c2-&gt;py + col_py / 2;
   3971 }
   3972 
   3973 void
   3974 circle_handle_collision_elastic(struct circle *c1, struct circle *c2)
   3975 {
   3976 	if(!circle_test_collision(c1, c2))
   3977 		return;
   3978 
   3979 	float col_px = c2-&gt;px - c1-&gt;px;
   3980 	float col_py = c2-&gt;py - c1-&gt;py;
   3981 	float col_pr = sqrtf(col_px * col_px + col_py * col_py);
   3982 	col_px /= col_pr;
   3983 	col_py /= col_pr;
   3984 	float nor_px = col_py;
   3985 	float nor_py = -col_px;
   3986 
   3987 	float m1 = c1-&gt;m;
   3988 	float m2 = c2-&gt;m;
   3989 
   3990 	float col_1v = c1-&gt;vx * col_px + c1-&gt;vy * col_py;
   3991 	float col_2v = c2-&gt;vx * col_px + c2-&gt;vy * col_py;
   3992 
   3993 	float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px;
   3994 	float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py;
   3995 	float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px;
   3996 	float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py;
   3997 
   3998 	float nor_1vx = nor_px * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py);
   3999 	float nor_1vy = nor_py * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py);
   4000 	float nor_2vx = nor_px * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py);
   4001 	float nor_2vy = nor_py * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py);
   4002 
   4003 	c1-&gt;vx = col_1vxn + nor_1vx;
   4004 	c1-&gt;vy = col_1vyn + nor_1vy;
   4005 	c2-&gt;vx = col_2vxn + nor_2vx;
   4006 	c2-&gt;vy = col_2vyn + nor_2vy;
   4007 
   4008 	circle_handle_collision_mm(c1, c2);
   4009 }
   4010 </code></pre>
   4011 
   4012 <h2>完成品</h2>
   4013 <p>
   4014 <a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a>
   4015 </p>
   4016 <p>
   4017 <video controls>
   4018 <source src="videos/ex5.webm" type="video/webm">
   4019 </video>
   4020 </p>
   4021 
   4022 <h2>参考</h2>
   4023 <ul>
   4024 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   4025 </ul>
   4026 <p>
   4027 次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a>
   4028 </p>
   4029 ]]></description>
   4030 </item>
   4031 <item>
   4032 <title>Xlibで遊んでみる4</title>
   4033 <link>https://www.mtkn.jp/computer/xlib_playground4.html</link>
   4034 <guid>https://www.mtkn.jp/computer/xlib_playground4.html</guid>
   4035 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   4036 <description><![CDATA[<h1>Xlibで遊んでみる4</h1>
   4037 <time>2023-01-02</time>
   4038 
   4039 <p>
   4040 前回: <a href="xlib_playground3.html">Xlibで遊んでみる3</a>
   4041 </p>
   4042 <p>
   4043 言語: C言語<br />
   4044 ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a>
   4045 </p>
   4046 
   4047 <h2>衝突判定とその処理</h2>
   4048 <p>
   4049 これまでは一つの四角形だけを描画していたが、今回は複数の四角形を作成して動かしてみた。ランダムな場所にランダムな運動量で動かして、他のものやウィンドウの縁とぶつかったら跳ね返るようにした。</p>
   4050 <p>
   4051 回転しない四角形どうしの衝突判定は簡単である。x軸方向とy軸方向の両方に重なりがあれば衝突している:
   4052 </p>
   4053 <pre><code>struct square {
   4054 	float ppx, ppy; // previous position
   4055 	float px, py;   // current position
   4056 	float vx, vy;   // velocity
   4057 	int w, h;       // width and height
   4058 };
   4059 
   4060 int
   4061 test_collision(struct square *s1, struct square* s2)
   4062 {
   4063 	return s1-&gt;px &lt; s2-&gt;px + s2-&gt;w && s2-&gt;px &lt; s1-&gt;px + s1-&gt;w &&
   4064 	       s2-&gt;py &lt; s1-&gt;py + s1-&gt;h && s1-&gt;py &lt; s2-&gt;py + s2-&gt;h;
   4065 }
   4066 </code></pre>
   4067 
   4068 <p>
   4069 衝突後の処理は多少めんどくさかった。衝突した時は既にめりこんでいるので、まずはそれぞれをめりこんだ距離の半分ずつずらして衝突を解消するようにした。この際、x軸方向にぶつかったのか、y軸方向にぶつかったのかで、それぞれの軸方向にひっぺがすようにしている。二つの四角形の各軸に関するめりこんだ距離<code>lapx</code>、<code>lapy</code>と各軸に関する相対速度<code>rel_vx</code>、<code>rel_vy</code>の比を比べればどちらの軸方向にぶつかったかが分かるはずである、多分 :
   4070 </p>
   4071 <pre><code>void
   4072 handle_collision_mm(struct square *s1, struct square *s2)
   4073 {
   4074 	if (!test_collision(s1, s2))
   4075 		return;
   4076 
   4077 	float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px);
   4078 	float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py);
   4079 	float rel_vx = max(s1-&gt;vx - s2-&gt;vx, s2-&gt;vx - s1-&gt;vx);
   4080 	float rel_vy = max(s1-&gt;vy - s2-&gt;vy, s2-&gt;vy - s1-&gt;vy);
   4081 
   4082 	if (lapx / rel_vx &lt; lapy / rel_vy) {
   4083 		if (s1-&gt;px + s1-&gt;w &lt; s2-&gt;px + s2-&gt;w / 2) {
   4084 			s1-&gt;px -= lapx / 2;
   4085 			s2-&gt;px += lapx / 2;
   4086 		} else {
   4087 			s1-&gt;px += lapx / 2;
   4088 			s2-&gt;px -= lapx / 2;
   4089 		}
   4090 	} else {
   4091 		if (s1-&gt;py + s1-&gt;h &lt; s2-&gt;py + s2-&gt;h / 2) {
   4092 			s1-&gt;py -= lapy / 2;
   4093 			s2-&gt;py += lapy / 2;
   4094 		} else {
   4095 			s1-&gt;py += lapy / 2;
   4096 			s2-&gt;py -= lapy / 2;
   4097 		}
   4098 	}
   4099 }
   4100 </code></pre>
   4101 <p>
   4102 衝突は弾性衝突として、衝突したそれぞれの四角形の速度を更新した。質量は四角形の面積として計算している。衝突後の速度はエネルギー保存則と運動量保存則から導いたのでしんどかった。
   4103 </p>
   4104 <pre><code>void
   4105 handle_collision_elastic(struct square *s1, struct square *s2)
   4106 {
   4107 	if(!test_collision(s1, s2))
   4108 		return;
   4109 
   4110 	float v1, v2;
   4111 	float m1 = s1-&gt;w * s1-&gt;h;
   4112 	float m2 = s2-&gt;w * s2-&gt;h;
   4113 
   4114 	float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px);
   4115 	float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py);
   4116 
   4117 	if (lapx &lt; lapy) {
   4118 		v1 = s1-&gt;vx;
   4119 		v2 = s2-&gt;vx;
   4120 		s1-&gt;vx = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1;
   4121 		s2-&gt;vx = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2;
   4122 	} else {
   4123 		v1 = s1-&gt;vy;
   4124 		v2 = s2-&gt;vy;
   4125 		s1-&gt;vy = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1;
   4126 		s2-&gt;vy = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2;
   4127 	}
   4128 
   4129 	handle_collision_mm(s1, s2);
   4130 }
   4131 </code></pre>
   4132 
   4133 <h2>サブティック</h2>
   4134 <p>
   4135 この名前が適切かどうか分からないが、前のフレームから次のフレームまでの時間をさらに何等分かして衝突判定の制度を上げた(マクロは括弧でかこって分かりにくいバグを防げとどこかに書いていたのでそうすることにした):
   4136 </p>
   4137 <pre><code>#define SUB_TIC (4)
   4138 
   4139 void
   4140 game_play(void)
   4141 {
   4142 	/* ... */
   4143 	while (next_menu == GAME_PLAY) {
   4144 		/* ... */
   4145 		for (int j = 0; j &lt; SUB_TICK; j++) {
   4146 			for (int i = 0; i &lt; NUM_SQUARE; i++)
   4147 				next_tick(&square[i], 1000 * 1000 * 1000 / FPS / SUB_TICK);
   4148 
   4149 			for (int i = 0; i &lt; NUM_SQUARE; i++)
   4150 				for (int j = i + 1; j &lt; NUM_SQUARE; j++) {
   4151 					handle_collision_elastic(&square[i], &square[j]);
   4152 					/* ... */
   4153 				}
   4154 			/* ... */
   4155 		}
   4156 		/* ... */
   4157 	}
   4158 	/* ... */
   4159 }
   4160 </code></pre>
   4161 
   4162 <h2>完成品</h2>
   4163 <p>
   4164 <a href="https://git.mtkn.jp/xlib_playground/file/ex4/ex4.c.html">git</a>
   4165 </p>
   4166 <p>
   4167 <video controls>
   4168 <source src="videos/ex4.webm" type="video/webm">
   4169 </video>
   4170 </p>
   4171 
   4172 <h2>参考</h2>
   4173 <ul>
   4174 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   4175 </ul>
   4176 <p>
   4177 次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a>
   4178 </p>
   4179 ]]></description>
   4180 </item>
   4181 <item>
   4182 <title>Xlibで遊んでみる3</title>
   4183 <link>https://www.mtkn.jp/computer/xlib_playground3.html</link>
   4184 <guid>https://www.mtkn.jp/computer/xlib_playground3.html</guid>
   4185 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   4186 <description><![CDATA[<h1>Xlibで遊んでみる3</h1>
   4187 <time>2023-01-02</time>
   4188 
   4189 <p>
   4190 前回: <a href="xlib_playground2.html">Xlibで遊んでみる2</a>
   4191 </p>
   4192 <p>
   4193 言語: C言語<br />
   4194 ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a>
   4195 </p>
   4196 
   4197 <h2>画面サイズの変更</h2>
   4198 <p>
   4199 画面サイズが変更された時に表示している四角形が画面の外側に出ないようにした。<code>XGetWindowAttributes()</code>で画面の情報を取得し、グローバル変数の<code>win_width</code>と<code>win_height</code>に幅と高さをそれぞれ代入して<code>next_tick()</code>で四角形の位置を画面に収まるようにしている:
   4200 </p>
   4201 <pre><code>int win_width, win_height;
   4202 
   4203 void
   4204 receive_events(int key_state[])
   4205 {
   4206 	XEvent event;
   4207 	XWindowAttributes wattr;
   4208 
   4209 	while (XPending(display) &gt; 0) {
   4210 		XNextEvent(display, &event);
   4211 		switch (event.type) {
   4212 		case Expose: {
   4213 			XGetWindowAttributes(display, window, &wattr);
   4214 			win_width = wattr.width;
   4215 			win_height = wattr.height;
   4216 		} break;
   4217 		/* ... */
   4218 		}
   4219 	}
   4220 }
   4221 
   4222 void
   4223 next_tick(long ndt) // nano second
   4224 {
   4225 	px = px + vx * ndt / 1000 / 1000 / 1000;
   4226 	py = py + vy * ndt / 1000 / 1000 / 1000;
   4227 	// bind within the window
   4228 	if (px &lt; 0)
   4229 		px = 0;
   4230 	if (win_width &lt; px + width)
   4231 		px = win_width - width;
   4232 	if (py &lt; 0)
   4233 		py = 0;
   4234 	if (win_height &lt; py + height)
   4235 		py = win_height - height;
   4236 }
   4237 </code></pre>
   4238 
   4239 <h2>メニュー画面の実装</h2>
   4240 <p>
   4241 ゲームのようなものを作るうえでメニュー画面とその推移が必要である。ここではグローバル変数<code>next_menu</code>に現在のメニューを保存することにした。それぞれのメニューはそれぞれ関数として記述し、他のメニューに推移する必要が生じたときに<code>next_menu</code>を変更するようにした:
   4242 </p>
   4243 <pre><code>enum next_menu {
   4244 	START_MENU,
   4245 	GAME_PLAY,
   4246 	GAME_OVER,
   4247 	QUIT,
   4248 };
   4249 
   4250 int next_menu = START_MENU;
   4251 
   4252 void
   4253 start_menu(void)
   4254 {
   4255 	XEvent event;
   4256 	char *menu_char_q = "press q to quit.";
   4257 	char *menu_char_s = "press &lt;space&gt; to start.";
   4258 
   4259 	XClearArea(display, window,
   4260 			   0, 0,                  // position
   4261 			   win_width, win_height, // width and height
   4262 			   False);
   4263 	XDrawString(display, window, gc,
   4264 				win_width/2 - strlen(menu_char_q)/2, win_height/2,
   4265 				menu_char_q, strlen(menu_char_q));
   4266 	XDrawString(display, window, gc,
   4267 				win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20,
   4268 				menu_char_s, strlen(menu_char_s));
   4269 
   4270 	while (next_menu == START_MENU) {
   4271 		XNextEvent(display, &event);
   4272 		switch (event.type) {
   4273 		case Expose: {
   4274 			XDrawString(display, window, gc,
   4275 						win_width/2 - strlen(menu_char_q)/2,
   4276 						win_height/2,
   4277 						menu_char_q, strlen(menu_char_q));
   4278 			XDrawString(display, window, gc,
   4279 						win_width/2 - strlen(menu_char_s)/2,
   4280 						win_height/2 + 20,
   4281 						menu_char_s, strlen(menu_char_s));
   4282 
   4283 		} break;
   4284 		case KeyPress: {
   4285 			switch (XLookupKeysym(&event.xkey, 0)) {
   4286 			case 'q':
   4287 				next_menu = QUIT;
   4288 				break;
   4289 			case ' ':
   4290 				next_menu = GAME_PLAY;
   4291 				break;
   4292 			default:
   4293 				break;
   4294 			}
   4295 		} break;
   4296 		case ClientMessage: {
   4297 			if ((Atom) event.xclient.data.l[0] == wm_delete_window) {
   4298 				next_menu = QUIT;
   4299 			}
   4300 		} break;
   4301 		default:
   4302 			break;
   4303 		}
   4304 	}
   4305 }
   4306 
   4307 int
   4308 main(void)
   4309 {
   4310 	setup();
   4311 	while (next_menu != QUIT){
   4312 		switch (next_menu){
   4313 		case START_MENU:
   4314 			start_menu();
   4315 			break;
   4316 		case GAME_PLAY:
   4317 			game_play();
   4318 			break;
   4319 		case GAME_OVER:
   4320 			game_over();
   4321 			break;
   4322 		default:
   4323 			break;
   4324 		}
   4325 	}
   4326 
   4327 	cleanup();
   4328 	return 0;
   4329 }
   4330 </code></pre>
   4331 <p><code>main()</code>関数がめっちゃすっきりした。</p>
   4332 
   4333 <h2>完成品</h2>
   4334 <p>
   4335 <a href="https://git.mtkn.jp/xlib_playground/file/ex3/ex3.c.html">git</a>
   4336 </p>
   4337 <p>
   4338 <video controls>
   4339 <source src="videos/ex3.webm" type="video/webm">
   4340 </video>
   4341 </p>
   4342 
   4343 <h2>参考</h2>
   4344 <ul>
   4345 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   4346 </ul>
   4347 <p>
   4348 次の記事: <a href="xlib_playground4.html">Xlibで遊んでみる4</a>
   4349 </p>
   4350 ]]></description>
   4351 </item>
   4352 <item>
   4353 <title>Xlibで遊んでみる2</title>
   4354 <link>https://www.mtkn.jp/computer/xlib_playground2.html</link>
   4355 <guid>https://www.mtkn.jp/computer/xlib_playground2.html</guid>
   4356 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   4357 <description><![CDATA[<h1>Xlibで遊んでみる2</h1>
   4358 <time>2022-12-22</time>
   4359 
   4360 <p>前回: <a href="xlib_playground1.html">Xlibで遊んでみる1</a></p>
   4361 <p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。
   4362 </p>
   4363 
   4364 <h2>FPSの固定</h2>
   4365 <p>前のフレームからの経過時間を計測して<code>1.0/FPS</code>を越えるまで待機させる。このときに<code>nanosleep()</code>を使うとなぜか上手くいかなかった。ナノ秒単位で処理できそうな名前なのに使えない。多分OSのコンテクストスイッチがどうとかいう話やと思う。知らんけど。組み込みとかで使うんかな?
   4366 </p>
   4367 
   4368 <p>
   4369 とりあえず<code>while</code>ループの中でひたすら時刻を読んでいる。リソースの無駄遣いではないのだろうか:
   4370 </p>
   4371 <pre><code>#defin FPS 60
   4372 
   4373 int
   4374 main(void)
   4375 {
   4376 	long t0, t1, dt;
   4377 	int fps_count;
   4378 
   4379 	clock_gettime(CLOCK_MONOTONIC, &ts);
   4380 	t0 = ts.tv_nsec;
   4381 
   4382 	while (!quit) {
   4383 		// fix fps
   4384 		dt = 0;
   4385 		while (dt &lt; 1.0 * 1000 * 1000 * 1000 / FPS){
   4386 			clock_gettime(CLOCK_MONOTONIC, &ts);
   4387 			t1 = ts.tv_nsec;
   4388 			dt = t1 &gt; t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000;
   4389 		}
   4390 		// count fps.
   4391 		fps_count++;
   4392 		if (t1 &lt; t0){
   4393 			printf("fps: %u\n", fps_count);
   4394 			fps_count = 0;
   4395 		}
   4396 		clock_gettime(CLOCK_MONOTONIC, &ts);
   4397 		t0 = ts.tv_nsec;
   4398 	}
   4399 }
   4400 </code></pre>
   4401 <p>
   4402 時刻は<code>clock_gettime()</code>で測定して1秒未満の部分: <code>tv_nsec</code>だけを利用している。<code>tv_nsec</code>はナノ秒ナノで、10<sup>9</sup>を掛けている。<code>dt = t1 > t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000</code>で前回の時刻と現在の時刻の少数部分を比較している。繰り上がりがあれば前回の時刻よりも現在の時刻の方が小さくなるので1秒足すことで調整している。</p>
   4403 <p>
   4404 FPSの計測の部分は、フレーム毎に<code>fps_count</code>を1ずつ増やし、ナノ秒が繰り上がった時点での<code>fps_count</code>を表示している。</p>
   4405 <p>
   4406 あまり正確な方法ではないように思うが、コンパクトにまとまったのではないだろうか。</p>
   4407 
   4408 <h2>キーボード入力の処理</h2>
   4409 <p>キーボードからの入力を受け取る:</p>
   4410 <pre><code>XSelectInput(display, window,
   4411     ExposureMask|KeyPressMask|KeyReleaseMask);
   4412 </code></pre>
   4413 <p>ここではキーボードのキーを押した時と離した時に<code>XEvent</code>の通知を受け取るように設定した。
   4414 </p>
   4415 <p>
   4416 <code>XNextEvent()</code>からひとつずつ入力を受け取ると、複数のキーが同時に押された時にうまく処理できなかったので、押されているキーを配列に保存しておくことにした:</p>
   4417 <pre><code>enum Keys {
   4418 	Key_D,
   4419 	Key_S,
   4420 	Key_A,
   4421 	Key_W,
   4422 	Key_Space,
   4423 	Num_Key, //number of keys in this enum
   4424 };
   4425 enum Key_State {
   4426 	Key_Up,
   4427 	Key_Down,
   4428 };
   4429 
   4430 int key_state[Num_Key];
   4431 </code></pre>
   4432 
   4433 <p>
   4434 入力の処理は<code>handle_inputs()</code>関数内で行なう。<code>A</code>、<code>S</code>、<code>D</code>、<code>W</code>のうちどれかのキーが押されているとそれぞれ左、下、右、上方向に速度を加算するようにした。また、<code>Q</code>が押されるか、windowが破壊されると<code>quit</code>フラグを<code>1</code>にしてメインループから抜けるようにしている:</p>
   4435 <pre><code>int   quit;
   4436 
   4437 void
   4438 handle_inputs(void)
   4439 {
   4440        XEvent event;
   4441        while (XPending(display) &gt; 0) {
   4442                XNextEvent(display, &event);
   4443                switch (event.type) {
   4444                case KeyPress: {
   4445                        switch (XLookupKeysym(&event.xkey, 0)) {
   4446                        case 'q':
   4447                                quit = 1;
   4448                                break;
   4449                        case 'd':
   4450                                key_state[Key_D] = Key_Down;
   4451                                break;
   4452                        case 'a':
   4453                                key_state[Key_A] = Key_Down;
   4454                                break;
   4455                        case 'w':
   4456                                key_state[Key_W] = Key_Down;
   4457                                break;
   4458                        case 's':
   4459                                key_state[Key_S] = Key_Down;
   4460                                break;
   4461                        default:
   4462                                break;
   4463                        }
   4464                } break;
   4465                case KeyRelease: {
   4466                        switch (XLookupKeysym(&event.xkey, 0)) {
   4467                        case 'd':
   4468                                key_state[Key_D] = Key_Up;
   4469                                break;
   4470                        case 'a':
   4471                                key_state[Key_A] = Key_Up;
   4472                                break;
   4473                        case 'w':
   4474                                key_state[Key_W] = Key_Up;
   4475                                break;
   4476 
   4477                        case 's':
   4478                                key_state[Key_S] = Key_Up;
   4479                                break;
   4480                        default:
   4481                                break;
   4482                        }
   4483                } break;
   4484                case ClientMessage: {
   4485                        if ((Atom) event.xclient.data.l[0] == wm_delete_window) {
   4486                                quit = 1;
   4487                        }
   4488                } break;
   4489                default:
   4490                        break;
   4491                }
   4492        }
   4493 
   4494        vx = vy = 0;
   4495        if (key_state[Key_D] == Key_Down)
   4496                vx += 300;
   4497        if (key_state[Key_A] == Key_Down)
   4498                vx += -300;
   4499        if (key_state[Key_S] == Key_Down)
   4500                vy += 300;
   4501        if (key_state[Key_W] == Key_Down)
   4502                vy += -300;
   4503 }
   4504 </code></pre>
   4505 
   4506 <p>
   4507 入力によって変更された速度は、<code>main()</code>関数内で次の座標を計算するために使用される:
   4508 </p>
   4509 <pre><code>float px = 200, py = 200;
   4510 float vx = 0, vy = 0;
   4511 int   width = 40, height = 40;
   4512 
   4513 int
   4514 main(void)
   4515 {
   4516 	/* ... */
   4517 	quit = 0;
   4518 	while (!quit) {
   4519 		handle_input()
   4520 		/* ... */
   4521 		px = px + vx * dt / 1000 / 1000 / 1000;
   4522 		py = py + vy * dt / 1000 / 1000 / 1000;
   4523 		// bind within the window
   4524 		if (px &lt; 0)
   4525 			px = 0;
   4526 		if (win_width &lt; px + width)
   4527 			px = win_width - width;
   4528 		if (py &lt; 0)
   4529 			py = 0;
   4530 		if (win_height &lt; py + height)
   4531 			py = win_height - height;
   4532 
   4533 		XClearArea(display, window,
   4534 		    0, 0,                  // position
   4535 		    win_width, win_height, // width and height
   4536 		    False);
   4537 		XFillRectangle(display, window, gc,
   4538 		    px, py,    // position
   4539 		    width, height);   // width and height
   4540 	}
   4541 	/* ... */
   4542 }
   4543 </code></pre>
   4544 
   4545 <h2>完成品</h2>
   4546 <a href="https://git.mtkn.jp/xlib_playground/file/ex2/ex2.c.html">ソースコード</a>
   4547 <p>色を変えてみた。</p>
   4548 <video controls>
   4549 	<source src="videos/ex2.webm" type="video/webm">
   4550 </video>
   4551 
   4552 <h2>参考</h2>
   4553 <ul>
   4554 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   4555 </ul>
   4556 <p>次の記事: <a href="xlib_playground3.html">Xlibで遊んでみる3</a>
   4557 </p>
   4558 ]]></description>
   4559 </item>
   4560 <item>
   4561 <title>Xlibで遊んでみる1</title>
   4562 <link>https://www.mtkn.jp/computer/xlib_playground1.html</link>
   4563 <guid>https://www.mtkn.jp/computer/xlib_playground1.html</guid>
   4564 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   4565 <description><![CDATA[<h1>Xlibで遊んでみる1</h1>
   4566 <time>2022-12-21</time>
   4567 
   4568 <h2>はじめに</h2>
   4569 <p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p>
   4570 <p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p>
   4571 <p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。
   4572 </p>
   4573 
   4574 <h2>初期設定</h2>
   4575 <p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p>
   4576 <pre><code>
   4577 #include &lt;stdio.h&gt;
   4578 #include &lt;stdlib.h&gt;
   4579 #include &lt;X11/Xlib.h&gt;
   4580 
   4581 /* macros */
   4582 #define INIT_WIDTH 800
   4583 #define INIT_HEIGHT 600
   4584 
   4585 /* variables */
   4586 Display     *display;
   4587 Window       window;
   4588 unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT;
   4589 GC           gc;
   4590 Atom         wm_delete_window;
   4591 
   4592 void
   4593 setup(void)
   4594 {
   4595 	// Open a display.
   4596 	if ((display = XOpenDisplay(NULL)) == NULL){
   4597 	    fprintf(stderr, "ERROR: could not open display\n");
   4598 	    exit(1);
   4599 	}
   4600 	// Create a window.
   4601 	window = XCreateSimpleWindow(
   4602 	                    display,
   4603 	                    XDefaultRootWindow(display),
   4604 	                    0, 0,
   4605 	                    win_width, win_height,
   4606 	                    0, 0, // border properties
   4607 	                    0);   // background color: black
   4608 	XStoreName(display, window, "UNKO");
   4609 
   4610 	// Setup a graphical context.
   4611 	gc = XCreateGC(display, window, 0, NULL);
   4612 	XSetForeground(display, gc, 0x0000FF);
   4613 
   4614 	// Kill the application when the window is destroyed.	
   4615 	wm_delete_window = XInternAtom(display,
   4616 	                               "WM_DELETE_WINDOW", False);
   4617 	XSetWMProtocols(display, window, &wm_delete_window, 1);
   4618 
   4619 	// Setup which input to process.
   4620 	XSelectInput(display, window,
   4621 	             ExposureMask|KeyPressMask|KeyReleaseMask);
   4622 
   4623 	// Actually draw the window.
   4624 	XMapWindow(display, window);
   4625 }
   4626 
   4627 void
   4628 clean_up(void)
   4629 {
   4630 	XCloseDisplay(display);
   4631 }
   4632 </code></pre>
   4633 
   4634 <p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p>
   4635 <pre><code>#include &lt;time.h&gt;
   4636 #include &lt;math.h&gt;
   4637 
   4638 int
   4639 main(void)
   4640 {
   4641     int px, py;
   4642     int quit;
   4643     struct timespec ts;
   4644     XEvent event;
   4645 
   4646     setup();
   4647     quit = 0;
   4648 
   4649     while (!quit){
   4650         while(XPending(display) &gt; 0){
   4651             XNextEvent(display, &event);
   4652             switch (event.type){
   4653             case KeyPress: {
   4654                 switch (XLookupKeysym(&event.xkey, 0)){
   4655                 case 'q':
   4656                     quit = 1;
   4657                     break;
   4658                 default:
   4659                     break;
   4660                 }
   4661             } break;
   4662             case ClientMessage: {
   4663                 if ((Atom) event.xclient.data.l[0] == wm_delete_window) {
   4664                     quit = 1;
   4665                 }
   4666             } break;
   4667             default:
   4668                 break;
   4669             }
   4670         }
   4671         clock_gettime(CLOCK_MONOTONIC, &ts);
   4672         px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000));
   4673         py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000));
   4674         XClearArea(display, window,
   4675                    0, 0,                  // position
   4676                    win_width, win_height, // width and height
   4677                    False);
   4678         XFillRectangle(display, window, gc,
   4679                        px, py,    // position
   4680                        100, 100);   // width and height
   4681 
   4682         ts.tv_sec = 0;
   4683         ts.tv_nsec = 10 * 1000 * 1000;
   4684         nanosleep(&ts, NULL);
   4685 	}
   4686 
   4687 	cleanup();
   4688 	return 0;
   4689 }
   4690 </code></pre>
   4691 
   4692 <p>ここまでのコードはgitリポジトリの<a href="https://git.mtkn.jp/xlib_playground/file/ex1/ex1.c.html">ex1/ex1.c</a>にある。</p>
   4693 <h2>完成品:</h2>
   4694 <video controls>
   4695 	<source src="videos/ex1.webm" type="video/webm">
   4696 </video>
   4697 
   4698 <h2>参考</h2>
   4699 <ul>
   4700 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li>
   4701 <li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li>
   4702 </ul>
   4703 
   4704 <a href="xlib_playground2.html">次の記事</a>
   4705 ]]></description>
   4706 </item>
   4707 <item>
   4708 <title>Arch Linuxのインストール</title>
   4709 <link>https://www.mtkn.jp/computer/archlinux_installation.html</link>
   4710 <guid>https://www.mtkn.jp/computer/archlinux_installation.html</guid>
   4711 <pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate>
   4712 <description><![CDATA[<h1>Arch Linuxのインストール</h1>
   4713 <time>2021-03-25</time>
   4714 
   4715 <h2>ハードウェア構成</h2>
   4716 
   4717 <h2>インストールの準備</h2>
   4718 
   4719 <h3>インストールメディアの入手</h3>
   4720 
   4721 <h3>署名の検証</h3>
   4722 <pre><code>$ gpg --keyserver-options auto-key-retrieve --verify archlinux-<i>version</i>-x86_64.iso.sig
   4723 </code></pre>
   4724 
   4725 <h3>インストールメディアの準備</h3>
   4726 <pre><code>$ sudo dd bs=4M if=<i>path/to/arch/linux/iso</i> of=/dev/sd<i>X</i> status=progress oflag=sync
   4727 </code></pre>
   4728 
   4729 <h3>ライブ環境の起動</h3>
   4730 Arch Linux install medium (x86_64, UEFI)を選択
   4731 
   4732 <h3>インストールの記録</h3>
   4733 <pre><code># script install.log
   4734 </code></pre>
   4735 
   4736 <h3>起動モードの確認</h3>
   4737 <pre><code># ls /sys/firmware/efi/efivars
   4738 </code></pre>
   4739 エラーが出なければUEFI。
   4740 
   4741 <h3>インターネットへ接続</h3>
   4742 <p>
   4743 ネットワークインターフェイスが認識されているか確認: 
   4744 </p>
   4745 <pre><code># ip link
   4746 </code></pre>
   4747 <p>
   4748 Wi-Fi接続: 
   4749 </p>
   4750 <pre><code># iwctl
   4751 [iwd]# device list
   4752 ...
   4753 [iwd]# exit
   4754 </code></pre>
   4755 <p>
   4756 接続を確認: 
   4757 </p>
   4758 <pre><code># ping archlinux.jp
   4759 </code></pre>
   4760 
   4761 <h3>システムクロックの更新</h3>
   4762 <pre><code># timedatectl set-ntp true
   4763 </code></pre>
   4764 
   4765 <h3>パーティショニング</h3>
   4766 <pre><code>sd<i>X</i>
   4767 ├sd<i>X</i>1 512M EFI System /boot
   4768 └sd<i>X</i>2 lest Linux filesystem /
   4769 </code></pre>
   4770 <pre><code># lsblk
   4771 # fdisk /dev/sd<i>X</i>
   4772 Command (m for help): d
   4773 ...
   4774 Command (m for help): w
   4775 </code></pre>
   4776 
   4777 <h3>パーティションのフォーマット</h3>
   4778 <pre><code># mkfs.fat -F32 /dev/sd<i>X</i>1
   4779 # mkfs.ext4 /dev/sd<i>X</i>2
   4780 </code></pre>
   4781 
   4782 <h3>ファイルシステムのマウント</h3>
   4783 <pre><code># mount /dev/sd<i>X</i>2 /mnt
   4784 # mkdir /mnt/boot
   4785 # mount /dev/sd<i>X</i>1 /mnt/boot
   4786 </code></pre>
   4787 
   4788 <h2>インストール</h2>
   4789 <h3>ミラーの選択</h3>
   4790 日本のサーバーを上に持ってくる: 
   4791 <pre><code># vim /etc/pacman.d/mirrorlist
   4792 </code></pre>
   4793 
   4794 <h3>必須パッケージのインストール</h3>
   4795 <pre><code># pacstrap /mnt base base-devel linux linux-firmware man-db man-pages 
   4796 </code></pre>
   4797 
   4798 <h3>fstabの生成</h3>
   4799 <pre><code># genfstab -U /mnt >> /mnt/etc/fstab
   4800 </code></pre>
   4801 
   4802 <h3>chroot</h3>
   4803 <pre><code># arch-chroot /mnt
   4804 </code></pre>
   4805 
   4806 <h3>text editorをインストール</h3>
   4807 <pre><code># pacman -S neovim
   4808 </code></pre>
   4809 
   4810 <h3>タイムゾーン</h3>
   4811 <pre><code># ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
   4812 # hwclock --systohc
   4813 </code></pre>
   4814 
   4815 <h3>ローカリゼーション</h3>
   4816 <code>en_US.UTF-8</code>と<code>ja_JP.UTF-8</code>をコメントイン: 
   4817 <pre><code># nvim /etc/locale.gen
   4818 </code></pre>
   4819 ロケールを生成: 
   4820 <pre><code># locale-gen
   4821 </code></pre>
   4822 <pre><code># nvim /etc/locale.conf
   4823 LANG=en_US.UTF-8
   4824 </code></pre>
   4825 
   4826 <h3>ネットワーク設定</h3>
   4827 <p>
   4828 無線接続用のソフトをインストール
   4829 </p>
   4830 <pre><code># pacman -S networkmanager
   4831 </code></pre>
   4832 
   4833 <p>
   4834 ホストネームの設定
   4835 </p>
   4836 <pre><code># nvim /etc/hostname
   4837 <i>myhostname</i>
   4838 </code></pre>
   4839 <pre><code># nvim /etc/hosts
   4840 127.0.0.1	localhost
   4841 ::1		localhost
   4842 127.0.1.1	<i>myhostname</i>.localdomain	<i>myhostname</i>	
   4843 </code></pre>
   4844 
   4845 <h3>Rootパスワード</h3>
   4846 <pre><code># passwd
   4847 </code></pre>
   4848 
   4849 <h3>ブートローダー</h3>
   4850 <p>
   4851 インストール
   4852 </p>
   4853 <pre><code># pacman -S grub efibootmgr
   4854 # grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=boot
   4855 </code></pre>
   4856 <p>
   4857 メイン設定ファイルの生成
   4858 </p>
   4859 <pre><code># grub-mkconfig -o /boot/grub/grub.cfg
   4860 </code></pre>
   4861 
   4862 <h3>マイクロコードのアップデートを有効化</h3>
   4863 <pre><code># pacman -S intel-ucode
   4864 # grub-mkconfig -o /boot/grub/grub.cfg
   4865 上のん無駄やんけ
   4866 </code></pre>
   4867 
   4868 <h2>再起動</h2>
   4869 <pre><code># exit #chrootを抜ける
   4870 </code></pre>
   4871 
   4872 <h3>インストールの記録を保存</h3>
   4873 <pre><code># exit #scriptを停止
   4874 # mv install.log /mnt/root
   4875 </code></pre>
   4876 
   4877 <h3>アンマウント</h3>
   4878 <pre><code># umount -R /mnt
   4879 </code></pre>
   4880 
   4881 <h3>再起動</h3>
   4882 <pre><code># reboot
   4883 </code></pre>
   4884 
   4885 <h2>インストール後</h2>
   4886 <h3>システム管理</h3>
   4887 <p>
   4888 一般ユーザーの作成
   4889 </p>
   4890 <pre><code># useradd -m -G wheel -s /bin/bash kenji
   4891 # passwd kenji
   4892 </code></pre>
   4893 <p>
   4894 作成したユーザーをsudoerに追加
   4895 </p>
   4896 <pre><code># visudo
   4897 %wheel ALL=(ALL) ALL #uncomment
   4898 </code></pre>
   4899 <p>
   4900 一般ユーザーとしてログインしなおす。
   4901 </p>
   4902 
   4903 <h3>パッケージ管理</h3>
   4904 <p>
   4905 AUR
   4906 </p>
   4907 
   4908 
   4909 
   4910 <h3>dotfilesを同期</h3>
   4911 <p>
   4912 gitのインストール
   4913 </p>
   4914 <pre><code>$ sudo pacman -S git
   4915 $ git config --global user.name "<i>First-name</i> <i>Family-name</i>"
   4916 $ git config --global user.email "<i>username</i>@<i>example.com</i>"
   4917 </code></pre>
   4918 <p>
   4919 dotfilesを同期
   4920 </p>
   4921 <pre><code>$ mkdir ~/.local
   4922 $ cd ~/.local
   4923 $ git clone https://github.com/<i>dotfilesのリポジトリ</i>
   4924 $ ln -sf ~/.local/dotfiles/.bash* ~/
   4925 $ mkdir .config
   4926 $ ln -s ~/.local/dotfiles/.config/* ~/.config/
   4927 ...
   4928 </code></pre>
   4929 
   4930 <h3>GUI</h3>
   4931 <p>
   4932 グラフィックドライバのインストール
   4933 </p>
   4934 <pre><code>$ sudo pacman -S nvidia nvidia-utils xorg-xinit
   4935 </code></pre>
   4936 <p>
   4937 window managerをインストール
   4938 </p>
   4939 <pre><code>$ sudo pacman -S i3-wm i3blocks dmenu
   4940 </code></pre>
   4941 ドライバをインストールしたらxorg-server等も依存関係として入った。
   4942 <p>
   4943 フォントをインストール
   4944 </p>
   4945 <pre><code>$ sudo pacman -S noto-fonts-cjk noto-fonts-emoji ttf-joypixels ttf-font-awesome ttf-liberation
   4946 </code></pre>
   4947 
   4948 <p>
   4949 ターミナル(st)をインストール
   4950 </p>
   4951 <pre><code>$ mkdir ~/.local/src
   4952 $ cd ~/.local/src
   4953 $ git clone git://git.suckless.org/st
   4954 $ cd st
   4955 $ sudo make install
   4956 </code></pre>
   4957 
   4958 <p>
   4959 再起動
   4960 </p>
   4961 <pre><code># sudo reboot
   4962 </code></pre>
   4963 だめでした
   4964 <p>
   4965 ログイン時に次のエラー
   4966 </p>
   4967 <pre><code>xauth: error in locking authority file /home/kenji/.cache/X11/Xauthority
   4968 </code></pre>
   4969 <p>
   4970 <code>~/.cache/X11</code>というディレクトリがないのが原因のようだ。
   4971 <code>.bash_profile</code>でXauthorityの場所を変更していたのにディレクトリを作っていなかった。
   4972 </p>
   4973 <pre><code>$ mkdir ~/.cache/X11
   4974 </code></pre>
   4975 <p>
   4976 として解決。
   4977 </p>
   4978 
   4979 <h3>日本語入力</h3>
   4980 <p>
   4981 ibusとibus-skkをインストール
   4982 </p>
   4983 <pre><code>$ sudo pacman -S ibus ibu-skk skk-jisyo
   4984 </code></pre>
   4985 <pre><code>vim ~/.config/X11/xinitrc
   4986 export DefaultIMModule=ibus
   4987 export GTK_IM_MODULE=ibus
   4988 export QT_IM_MODULE=ibus
   4989 export XMODIFIERS="@im=ibus"
   4990 
   4991 ibus-daemon --xim &
   4992 </code></pre>
   4993 
   4994 <h3>ブラウザ(brave)をインストール</h3>
   4995 <pre><code>$ cd ~/.local/src
   4996 $ git clone https://aur.archlinux.org/brave-bin.git
   4997 $ cd brave-bin
   4998 $ makepkg -si
   4999 </code></pre>
   5000 
   5001 <h3>音</h3>
   5002 <pre><code>$ sudo pacman -S alsa-utilst pulseaudio
   5003 $ pulseaudio --start
   5004 </code></pre>
   5005 
   5006 
   5007 <p>
   5008 ssh
   5009 </p>
   5010 <pre><code>$ sudo pacman -S openssh
   5011 $ mkdir ~/.ssh
   5012 $ cd ~/.ssh
   5013 $ ssh-keygen -t rsa
   5014 </code></pre>
   5015 ]]></description>
   5016 </item>
   5017 <item>
   5018 <title>寺を辞めた</title>
   5019 <link>https://www.mtkn.jp/journal/posts/20230119.html</link>
   5020 <guid>https://www.mtkn.jp/journal/posts/20230119.html</guid>
   5021 <pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate>
   5022 <description><![CDATA[<h1>寺を辞めた</h1>
   5023 <time>2023-01-19</time>
   5024 <p>
   5025 寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p>
   5026 <p>
   5027 ふう。
   5028 </p>
   5029 ]]></description>
   5030 </item>
   5031 <item>
   5032 <title>Holy Shit!</title>
   5033 <link>https://www.mtkn.jp/journal/posts/20221228.html</link>
   5034 <guid>https://www.mtkn.jp/journal/posts/20221228.html</guid>
   5035 <pubDate>Wed, 28 Dec 2022 00:00:00 +0900</pubDate>
   5036 <description><![CDATA[<h1>Holy Shit!</h1>
   5037 <p>最近見ているプログラマの配信者がよく言っている。「Holy Shit!」Holyは聖なる、Shitはうんこという意味である。日本のプログラマもうんこという言葉を好むが、海外でも同じようである。
   5038 </p>
   5039 <p>
   5040 ところでこの言葉の訳語はなにがいいかと考えていると思いがけずぴったりなものを思いついた:</p>
   5041 <p>
   5042 「すめらうんこ」
   5043 </p>
   5044 <p>
   5045 そうそれは、すめらみことの落しもの(droppings)。嗚呼不敬。
   5046 </p>
   5047 ]]></description>
   5048 </item>
   5049 <item>
   5050 <title>不死身の特攻兵</title>
   5051 <link>https://www.mtkn.jp/books/978-4-06-288451-8.html</link>
   5052 <guid>https://www.mtkn.jp/books/978-4-06-288451-8.html</guid>
   5053 <pubDate>Wed, 23 Nov 2022 00:00:00 +0900</pubDate>
   5054 <description><![CDATA[<h1>不死身の特攻兵</h1>
   5055 <div class="author">鴻上尚史 著</div>
   5056 <time>2022-11-23</time>
   5057 <p>大東亜戦争において何度も特攻を命じられるも生還した佐々木友次という人の話。ベテランのパイロットだったために陸軍の特攻第一号に選ばれ、死んでこいと言われたが爆弾を落して帰ってきた人である。それも何度も。</p>
   5058 <p>第一章は著者が佐々木氏を知ったいきさつ。第二章は佐々木氏の伝記。第三章は著者の佐々木氏へのインタビュー。第四章は著者による戦争や特攻に関する考察。</p>
   5059 <p>第一章は導入である。</p>
   5060 <p>第二章は物語として面白かった。戦争や特攻といった理不尽なものに対して自分の信念を貫いた佐々木氏の生き方や考え方が痛快である。</p>
   5061 <p>第三章のインタビューでは佐々木氏が繰り返し口にした寿命という言葉が印象的だった。人間は寿命がくれば死に、それまでは生きる、というものである。たとえ戦死であろうともそれがその人の寿命であるとの認識であるようだ。この考えにはとても共感できる。</p>
   5062 <p>第四章はかなり客観的に書かれているように思う。その上で著者自身の考えを述べているので読みやすかった。しかし読み進めるにつれてだんだんともやもやが溜っていった。当時の日本を支配していた空気があまりにも重苦しい。しかもその空気は、現在の日本にあるものとほとんど同じであると感じた。ここ最近僕が感じているこの国の暗い部分は大東亜戦争のころからなにも変らずに受け継がれているようである。せっかく無様に負けたのに本当の意味での反省を一切していないためか、なにも変っていない。余りにも勿体無く、戦没者にも失礼である。</p>
   5063 <p>もっと歴史を勉強し、今の生き方に反映しなければと考えさせてくれる本だった。</p>
   5064 ]]></description>
   5065 </item>
   5066 <item>
   5067 <title>大阪駅にて</title>
   5068 <link>https://www.mtkn.jp/journal/posts/20221031.html</link>
   5069 <guid>https://www.mtkn.jp/journal/posts/20221031.html</guid>
   5070 <pubDate>Mon, 31 Oct 2022 00:00:00 +0900</pubDate>
   5071 <description><![CDATA[<h1>大阪駅にて</h1>
   5072 <time>2022-10-30</time>
   5073 <p>いつだったか、大阪駅から和歌山に帰るため、1番線にて関空・紀州路快速、関西空港・和歌山行を待っていた。この快速は関西空港行4両と和歌山行4両が連結して8両編成となっている。途中の日根野駅で切り離し、その後はそれぞれの目的地に向かう。僕は和歌山行の先頭車両に乗ろうと思い、白色三角印の4番に並んでいた。ところでこの快速に女性専用車はないのだが、環状線内を走る普通列車は4号車が女性専用である。自分の並んでいる所にもそのように書いていた。しばらくして僕の後ろにおじさんが一人並んだ。次にこのホームに来るのは普通列車である。この人も後で来る快速に乗るのかと思って気にしていなかった。</p>
   5074 <p>しばらくして普通列車が到着した。僕はこれには乗らないので横にずれて後ろの人達に道を開けた。列車が停止してドアが開くと、後ろのおじさんはそのまま女性専用車にすいこまれていった。声を掛けるべきか考えているうちに発車ベルが鳴り、おじさんは閉じ込められて行ってしまった。</p>
   5075 <p>ところで関空・紀州路快速のうち和歌山に行くのは後ろの4両、5号車から8号車である。僕が並んでいたのは和歌山行の先頭車ではなく関西空港行の最後尾だった。僕は足元の白色三角印4番をしばらく眺めた後、隣の5番に並びなおした。</p>
   5076 ]]></description>
   5077 </item>
   5078 <item>
   5079 <title>寺に適応できない</title>
   5080 <link>https://www.mtkn.jp/journal/posts/20221023.html</link>
   5081 <guid>https://www.mtkn.jp/journal/posts/20221023.html</guid>
   5082 <pubDate>Sun, 23 Oct 2022 00:00:00 +0900</pubDate>
   5083 <description><![CDATA[<h1>寺に適応できない</h1>
   5084 <time>2022-10-23</time>
   5085 <h2>これまで</h2>
   5086 <p>実家の菩提寺に入って出家した。坊主になってこの寺で生きていけないかと考えたのだ。ところが一年経った今でもこの寺に適応できていない。八月のお盆の間、住職は忙しくて朝のお勤めをしないので代わりにして欲しいと言われ、半月ばかり泊り込むことになった。ゆくゆく自分が住職に成ることを考え、これを機に半分寺に住み込もうと思い、お盆が済んでからもしばしば寺に泊まった。そうして八月はほぼ寺に居たのだが、その間寺に適応できずにどんどん自分の感情が萎れていった。とうとう適応障害と言えそうな状態にまでなり、九月と十月はほとんど実家に引き込もっている。どうしたものか。</p>
   5087 
   5088 <p>なにがそんなにしんどいのか。住職の奥さんと一緒に居るのがしんどい。この人が何を考えているのか分からない。僕の言ったこともその場では肯定しているように感じることが多いが、あまり理解していないようだ。やるべきことは自分で見付けろと言いながら、なにかしようとすると拒否される。生活の面でもいろいろと噛み合わない。柔軟剤がきつすぎてしんどくなった。食事の脂が多すぎてお腹を壊した。台所が汚なすぎて気持が悪い。</p>
   5089 
   5090 <h2>柔軟剤</h2>
   5091 <p>初めて寺に行って掃除を任された時から気になっていた。雑巾があまりにも臭いのだ。それも柔軟剤の臭いである。当時は実家から通っていたのだが、昼間寺の掃除をすると、家に帰ってからどんなに手を洗っても臭いが落ちないほどである。雑巾だけではなく寺にある布という布から悉く同じ柔軟剤の臭いがする。この臭いをいい臭いだという人の気が知れないのだが。</p>
   5092 <p>ある時檀家さんからもらった素麺をお裾分けしてもらったのだが、箱を包むビニールにも柔軟剤の臭いがこびりついていた。実家に持ち帰り後日湯掻いたのだが、素麺自体にも臭いがついていて食べられたものではなかった。他の家族も顔をしかめていた。勿体無いが全部廃棄した。</p>
   5093 <p>後で気付いたが、どうも寺中の埃から柔軟剤の臭いがするのだ。埃は布からでたものなので考えれば当たり前か。この埃が食品を保管している棚に積り、その中の素麺に臭いが移ったのだと思う。埃が臭うので寺中至る所その臭いである。</p>
   5094 
   5095 <h2>食事</h2>
   5096 <p>寺での食事は脂が多い。ささやかな生活をしていると本人達は思っているようだが、食卓にはやたら牛肉が並ぶ。脂ののった鮭も多い。奥さんは歯がほとんどないので肉も魚も脂の乗ったやわらかいものでないと噛めないのだ。数えていないので適当だが、3回に1回は鮭、5回に1回は牛で、どれも脂でとろとろの物である。僕が胃腸が弱く、特に脂っこいものが苦手ということもあるが、少なくともこれでささやかとはどうも言えないように思う。</p>
   5097 <p>ところである日豚の肉塊で焼豚を作ったのだが、茹で汁を冷蔵した上澄みの脂を炒め物に使おうと取っておいたのだが、それは食べたくないらしい。固形の脂は体内でも固まって健康に悪いというテレビの知識だそうだ。普段あんなに肉の脂を取っているのにそれは気にならないらしい。理屈はよく分からんがそれよりも今から作らんとしている野菜炒めを食べてくれるのかどうかが重要なのでそれを聞いた。返事は「しいては食べないけど。」というあいまいなものだった。食べないならサラダ油で作るか、別に一品追加しないといけないのだがどうかと聞き直すと、「しいては食べないけど。」という返事が再び返ってくるだけだった。これ以上聞くのも面倒なので、僕はせっかく取っておいた豚の脂を捨ててサラダ油で野菜を炒めた。これは他のことでも感じていたことだが、この人には自分というものが無いのか、あるいはそれがあっても表に出さないようである。別件ですこし口論になったことがあるので、感情がない訳ではないのだが。エドワードルトワックという米国の戦略家曰く、こちらの言うことを全部受け入れる国より、自分の立場をはっきりと言う国の方が同盟国として信頼できるそうだ。そんなのあたりまえじゃないですか。まる。住職の奥さんはどうやら自分の考えや感情を見せず、相手に全部任せる方が信頼関係を築けると思っているようだ。責任を全部こちらに押し付けているようにしか僕には見えないのだが。</p>
   5098 
   5099 <h2>台所が汚ない</h2>
   5100 <p>この寺はどこもかしこも物であふれかえっている。かろうじて法要に必要な本堂と控室はましだが、それでも不必要な物が多い。特に酷いのは台所である。おぞましい。寺の性質上貰い物が多いのはしかたがない。檀家さんにいろいろ貰ってそれをまた他の檀家さんに配るのだがそれでも余る。寺にいて消費するのは住職とその奥さんの二人だけであった。賞味期限がくるまでに食べきれないのはある意味仕方がないことでもある。本当は物を持ってくる檀家さんに寺の状況を話して少し持ってくる量を減らしてもらうべきだと思うのだが、奥さんはそうは考えない。檀家さんの気持をないがしろにできないからと、くれる物は断わらない。そして捨てる。これのどこがないがしろにしていないのかさっぱり理解できないが。ともかく現状は食べ物が多すぎるのだが、一番の問題は古い物を一向に捨てないことである。僕が寺に通い始めた頃は冷蔵庫がパンパンだった。しかも3台もである。二人暮しの家に小さくもない冷蔵庫が3台、悉く満杯だった。ある時台所にある冷蔵庫を上から下まで整理した。腐ったものを全部捨てた。奥からは2009年に賞味期限が切れたものなんかも出てきた。これは一番古い方だが、平均しても3年以上前のものだったと思う。ところで冷蔵庫の中からでてきたものは大体がスーパーなんかで奥さん自身が買ってきたもので、檀家さんから貰ったものはあまりなかった。檀家さんからの多すぎる貰い物に加え、自分でも異常に買い込むのだ。</p>
   5101 <p>この買い方もむちゃくちゃである。冷蔵庫の奥に抹茶が山程眠っていた。聞くとどれも自分で買ったものだと言う。お茶屋が友達なので行けば買わないと悪いとか、来客の為に新しい抹茶を用意したいとかで、無駄に多く買ってどれも処分しないのだ。ある日美味しくなさそうな出来合いのオムレツを買ってきた。どうやら本人も美味しくなさそうだと思いつつ買ったらしい。近くの個人経営の商店によく行くのだが、潰れては困るので欲しいものがなくても適当になにか買うのだそうだ。店の為に不要な物を買うのは良くないと思う。需要を歪めることになるからだ。大事な店ならむしろ自分が欲しい物を伝えて、要らない物は買わない方がいい。仕入れるかどうかは店の判断だろうが、客からも要望を伝えることで、その地域にとって必要な店になる可能性が高まるのではないか。不要なものでも買ってしまうと、結局好ましくない依存が生まれて返って店を潰すことになるか、そうでなくても地域に必要とされない店になるだろう。</p>
   5102 <p>冷蔵庫を一通り綺麗にしたその日の夕方、奥さんが大量の野菜と果物を仕入れてきた。流石に少し怒りが湧いた。そうでなくても奥さん自身、綺麗な冷蔵庫を喜んでいたので、再びちらかるようなことは避けようとも思い、そんなに大量に買ってこられるとまたぐちゃぐちゃになるだろうと小言を言っておいた。そんなに嫌味のつもりはなかったのだが。次の日も前日の野菜がたくさんあるにも関わらずまたいろいろ買ってきた。前日よりはさすがに少なかったが、同じように買いすぎだと思う旨を伝え、買ってきたものを何に使うのかひとつひとつ聞いてみた。すると見る見る顔が曇っていった。最後に、欲しいものを欲しい時に買って食べるのは自由だが、そのような買い物をするなら必ず冷蔵庫がぐちゃぐちゃになるから古い物はどんどん捨てていくことになるがそれでもいいのかと正すと、とうとう何も答えずにどこかに行ってしまった。その日の夕食はどうなったのか覚えていないが、多分普段通り食べたのだと思う。特に記憶にないということは、別にお通夜のようにはならなかったのだろう。次の日は朝から掃除に来ていた檀家さんとひと悶着あった。朝食の後になって奥さんがそのことで明らかに僕に対して敵意を剥き出しに、ああだこうだ言ってきた。内容はこまかくは覚えていないが、どうも檀家さんと僕とのやりとりと言うよりも前日のことについて攻めたてられたように思う。ひとつだけはっきり覚えているのは「論で言われると考えるのが面倒くさくなってしまう」という言葉だ。ではどうすればええねや。それから、檀家さんとのやりとりでは僕も良くない点があったのでそれを自分で分析するようなことを言うと、「自分で反省できて偉いわねぇ。」と言われた。こうも人の気持を逆撫でするようなことが言えるのかと思ったものだ。</p>
   5103 <p>調理器具も異常に多い。鍋もフライパンも同じような大きさのものがそれぞれ10個以上ある。使っていない調味料も置いたままである。冷蔵庫の他にもキッチンストッカーとか言ったか、間口が1m程度、奥行60cm程度、高さは2m近くあるような棚にびっしり保存食が詰っている。多分半分は賞味期限が切れている。この棚は台所の隣の4畳程の部屋にあるのだが、この部屋にはほかにも本棚のようなものが二つあってカップ麺やら乾物やらお菓子やらで埋まっている。足元にはダンボールに入った缶ジュースがあったり、使っていない家電があったり、変色した調味料のビンなんかもあったと思う。勝手に整理する訳にもいかず、整理を手伝っても冷蔵庫の時のようになりそうで、毎日一人の時間にただ眺めることしかできなかった。ある日疲れてぼーっとしているところを奥さんに見られたが、たまたま顔が食器棚に向いていたために、「物が多いと思ってるんでしょ。」と言われた。先方も僕がそこに居るだけで結構な心理的負担を感じているのだろうか。</p>
   5104 
   5105 <h2>檀家さんとの口論</h2>
   5106 <p>檀家さんの話が出たのでここに書いておく。</p>
   5107 <p>この檀家さんには以前、清澄寺という日蓮宗の聖地の森がコンクリートで覆われてたいへんだという話しをしていた。土をコンクリートにしてしまっては周囲の環境を著しく痛めてしまうという話である。このときは高田宏臣氏の本を持ち出して説明し、賛同してくれた。ある朝この檀家さんが境内の落葉を掃除している所に奥さんも居たので話しかけた。この時も高田さんの名前も出したように思うが、落葉を残して腐葉土にできないかとか、もっと境内に木を増やした方がいいのではないかなどと話すと、この檀家さんは落葉が積もると汚ないし、木が増えると虫が沸き、また管理も大変だからむしろコンクリートを増やすべきだと言った。前回コンクリートの話で同意してくれたのは何だったのか。</p>
   5108 <p>ところで話をしているとこの檀家さんの顔がみるみる曇り、最後にはとうとうまっくろけになってしまったのは怖かった。また、上で書いた自分の反省というのは、落葉を掃除している所に落葉を掃除しすぎるのは良くないのではないかという話を持ち掛けたことについてである。</p>
   5109 
   5110 <h2>物を捨てられない</h2>
   5111 <p>台所も汚いが、他の場所も物で溢れている。檀家さんに貰った物、檀家さんが作ってくれた物、自分で買った物。もちろん必要な物もあるだろうが、問題は奥さんも住職も不要だと思いながら捨てずにいる物である。檀家さんの気持を蔑ろにできないから捨てないというのはあまりにも問題である。結局それのせいで寺が汚なくなっては檀家さんの面目を返って潰しているのではないか。土地柄、檀家さんには漆器屋さんが多い。漆の盆は押入に積み上がっている。どこかの旅行のお土産といってでかい塗の囲炉裏をくれたが、これは部屋の隅に起きっぱなしで使ったためしがない。昔本堂で使う椅子がなく、急遽檀家さんが空き缶を束ねてダンボールかなにかと布で綺麗に包んだものが今も本堂の隅に出しっぱなしで、使っているのを見たことがない。二人暮しなのに大きな食器棚が6個くらいある。どれもぱんぱんに詰っている。昔は檀家さんがよく集って食事をしたそうだがそれでもなお余るほど多い。何十年も寺に通っている信者さんが、今でも来るたびに初めて見るカップが出てくるという。箪笥が多い。使っていないものもある。ひどいことに同じ箪笥を2個重ねて置いている。上にではなく、前後に2個重ねているのである。1個無駄じゃん!ねぇよ赤外線はよぉ。</p>
   5112 <p>寺というのは俗世間にはない空気を作るべき場所ではないのか。綺麗に片付けて掃除して、物で溢れた豊かなこの世界にあって、物質的ではない本当の豊かさを提示する場所でなくていいのだろうか。物質的な豊かさを賞賛するのであれば寺はもっと金儲けに走るべきであろう。そうしないのはそうではないものを世間に見せるためであろうに。</p>
   5113 
   5114 <h2>人格を感じられない人</h2>
   5115 <p>住職の奥さんにしても、上に書いた檀家さんにしても、本人が一体何を考え、感じているのか僕にはさっぱり掴めない。上に書いた檀家さんとのやりとりだけでなく、住職の奥さんも普段の会話では僕の考えに概ね賛同してくれる。始めは話の合う人なのかと思っていたがどうもそうではなかったらしい。この人達は自分に関係のない話に関してはその場の雰囲気や同調を重視して賛同しているような空気を作りだすが、自分に関係のある話しになると突然豹変して自らの利権を死守しようとするようである。僕はこの一年、このような人と付き合うことに疲れてしまったようである。僕はこのような人の感情を読むことができず、何を考えているのかも分からない。論理的に考えるのも無駄だった。僕はこの人達に一切の信頼を置くことができない。</p>
   5116 ]]></description>
   5117 </item>
   5118 <item>
   5119 <title>田舎の夏休み</title>
   5120 <link>https://www.mtkn.jp/journal/posts/20220814.html</link>
   5121 <guid>https://www.mtkn.jp/journal/posts/20220814.html</guid>
   5122 <pubDate>Tue, 16 Aug 2022 00:00:00 +0900</pubDate>
   5123 <description><![CDATA[<h1>田舎の夏休み</h1>
   5124 <time>2022-08-14</time>
   5125 <p>西の空が赤く染まり始めた頃、田圃の中の畔道を寺に向かっていると、向こうから少年が歩いてきた。釣竿の先になにやらぷらぷらさせている。タウナギかなにかだった。</p>
   5126 <p>
   5127 「釣ったん?」<br>
   5128 「うん」<br>
   5129 「すげぇ」<br>
   5130 </p>
   5131 <p>田舎の夏休みはまだ生きているようだ。</p>
   5132 ]]></description>
   5133 </item>
   5134 <item>
   5135 <title>正座が出来ていた頃に戻るには</title>
   5136 <link>https://www.mtkn.jp/journal/posts/20220813.html</link>
   5137 <guid>https://www.mtkn.jp/journal/posts/20220813.html</guid>
   5138 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5139 <description><![CDATA[<h1>正座が出来ていた頃に戻るには</h1>
   5140 
   5141 <h2>正座できない</h2>
   5142 <p>今時の年寄は正座のひとつも満足に出来ない。明治期に体育を輸入し、学校が椅子になり、その効果がようやく全ての世代に波及した。現住職のお婆さんはまだ正座ができたそうだ。夏の暑い時期を除いて年中和服で生活しており、亡くなる直前まで足腰はしっかりしていたという。この人の娘で、現住職のお母さんはもう正座ができなかったようである。現住職とその奥さん、そして当然僕自身も正座ができるとは言えない身体である。</p>
   5143 
   5144 <p>お寺によく来てくれる人達も正座できない。正座の姿勢になることすら一苦労のお年寄も多い。このため寺としては本堂にも椅子を用意せざるを得ず、少しなら正座できるという若い人達も皆椅子に座ることになるという悪循環である。</p>
   5145 
   5146 <h2>物が多い</h2>
   5147 <p>この寺には物が多い。良いと思って自分達で買ったものや、良いと思って檀家さんが持ってきてくれたもので溢れかえっている。これを少しは整理したいのだが。</p>
   5148 <p>中でも椅子に関してはどうしよもない。場所を取る。普段はあまり人が来ないのだがお盆やお彼岸には結構集まるようである。この時集まった人達はみんな椅子が必要だというので、かなりの数の椅子が寺に置いてあるのだが、片付ける場所が無いと言って本堂の端っこに出しっぱなしなのだ。一応重ねて並べてあるので整然とはしているが。というか中には多少は正座できる人もいるだろうからその人達は椅子いらんやん。それにたくさん人が集ったからといっても今ある椅子を全部並べる広さもないと思うのだが。</p>
   5149 <p>などと考えても、住職もその奥さんも頑である。必要だから置いている。場所がないから仕方ない。せっかく檀家さんが持ってきてくれたものだから仕方ない。</p>
   5150 <p>正座できる人ばかりなら椅子など全部捨てられる。中に一人や二人足の悪い人がいてもその程度の数を用意すれば済むのだ。人がぎゅうぎゅう詰めになるようなら座布団を敷かずに正座すればいい。日本の家は狭いんやから正座しようや。</p>
   5151 
   5152 <h2>老後の自由</h2>
   5153 <p>正座が出来ると老後も自由に動ける。住職のお婆さんがいい例である。今時の年寄は医学の為にかろうじて生命活動を維持してはいるが、生きているようには見えない。身体が動きにくいのを年のせいにしているがそれは間違いだろう。若い時から身体の使い方を考えていればそんなことにはならない。甲野善紀を見れば分かる。黒田鉄山もそうだ。僕が知っている合気道家も多くは年をとっても身体に不自由はない。</p>
   5154 <p>死ぬまで身体を自由に動かすにはやはり身体の感覚を磨くのがいいと思う。その為に古武術や剣術、合気道などを習わなくても、正座するだけで十分だと思う。光岡英稔がそんな感じのことを言っていたかな。今の椅子というのは、椅子が人間を座らせているものが多いと思う。だから身体に合った椅子、座りやすい椅子などと言って売っているのだ。だれか椅子の本を書いていた。日本には良い椅子がないと。日本人は椅子に座らされるのが窮屈だったからではないか。日本人の身体観では、椅子が自分を座らせるよりも自分が椅子に座る方が心地良かったのではないか。正座の場合、下にはただ平たい床があるのみである。家によっては床板がゆがんでいるかもしれない。日本人はそこに自ら座って生活してきたのだ。床が人を座らせていた訳ではない。僕は人間工学に基づいたと言って売られているものが嫌いなのだが、そのような商品は人間が使うというより商品に人間が使わされるように感じていたのかもしれない。</p>
   5155 <p>普段から正座で生活する。これだけで老後の自由が手に入るんやからやらん手はないやん。</p>
   5156 
   5157 <h2>状況を変えたい</h2>
   5158 <p>この状況をどうにか昔に戻せないものか。上に書いた以外にもいろいろな問題の根本には正座ができないことがあるように思う。ちょっと乱暴かな。然し正座が出来るだけで解決する問題は山ほどあると思う。</p>
   5159 <p>ではどうすれば日本人は再び正座できるようになるのだろう。最も根本的な解決策はやはり小学校から椅子を無くすことだと思う。我々は物心付いてよりこのかた、ひたすら正座をしない訓練を受けてきたと言えよう。そういえばなぜか幼稚園には椅子がなかった気がする。床で物を広げて遊んでいたような。記憶違いかな。他の解決策など無いと言ってもいいくらいかもしれない。</p>
   5160 <p>然しこれを実行するにはまず世間の意識を変える必要がある。そのためには今なら科学的根拠が便利か。科学っぽい根拠。正座して育った子供と正座せずに育った子供の将来の偏差値を適当にデータとして示せばいいだけなのでこの第一歩は割とすぐできるのかな。</p>
   5161 <p>あるいは寺子屋をやってそこでは正座させればいい。その後彼らの成長を追っていけばいい。何十年かやってメディアにでも取り上げられれば少しは正座を見直してくれそうなものである。</p>
   5162 <p>然し問題はここからかもしれない。良いことだと説得しても自分の生活に直結させる人があまりに少ないように思うからだ。樹木の重要性やコンクリートの有害性を言って納得してくれたように思っても、自分が掃除している庭はそれとは切りはなして考えるようである。その一方であまりにもメディアで大々的に取り上げられると、論理を一切考えずに全て受け入れてしまうようだ。マスクやワクチンの話である。と思っても、論理を無視してメディアを信じない人も居る。結局自分の信じたいことしか信じないというのはこういうことなのか。自分自身にこのような傾向があるのは実感していたが、僕の周囲の人達はどうも無意識のうちに情報を取捨選択しているようで、これでは自己反省もくそもできない。人のふりみてなんとかと人には言うが、自分自身には一切あてはめて考えないようなのだ。</p>
   5163 <p>正座が良いと言ってもきっと自分とは関係のない世界の話だと思って終わる可能性もある。現在でも棋士はずっと正座であり、その方が集中できるという話は聞くが、だからといって自分の生活に正座を取り入れる人は稀である。ではもっと大きく報道させて今のマスクのように流布すればいいのか。これは僕は嫌いである。ただ空気と同調圧力を形成するだけで、あらぬ方向に向かってしまう可能性も考えないといけない。やっぱり一番気分がいいのは自分自身で実行してその姿を世間に晒すことである。あとは世間が思い思いに判断して行動すればいいのだ。寺子屋で子供に正座をさせてその変化を観察するのがいいだろう。社会全体に変化があらわれるまで50年くらいかかるのかな。</p>
   5164 ]]></description>
   5165 </item>
   5166 <item>
   5167 <title>RSS作った</title>
   5168 <link>https://www.mtkn.jp/journal/posts/20220729.html</link>
   5169 <guid>https://www.mtkn.jp/journal/posts/20220729.html</guid>
   5170 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5171 <description><![CDATA[<h1>RSS作った</h1>
   5172 <time>2022-07-29</time>
   5173 <p><a href="/rss.xml">RSS</a>作った。疲れた。htmlファイルのタイムスタンプを元に更新日を出力したが、なぜかほとんどのファイルのタイムスタンプが最近の日付になってしまっていたので修正しないといけなかった。RSSフィードの作成にはこのウェブサイトを出力するために作った<a href="https://git.mtkn.jp/dotfiles/file/bin/kagero.html">スクリプト</a>に組み込んだ。</p>
   5174 ]]></description>
   5175 </item>
   5176 <item>
   5177 <title>小松菜の種を蒔いた。</title>
   5178 <link>https://www.mtkn.jp/journal/posts/20201210.html</link>
   5179 <guid>https://www.mtkn.jp/journal/posts/20201210.html</guid>
   5180 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5181 <description><![CDATA[<h1>小松菜の種を蒔いた。</h1>
   5182 <time>2020-12-10</time>
   5183 <p>
   5184 駅の近くに種苗店がある。
   5185 以前から気にはなっていたのだが、いつ前を通っても店主がお客さんと話し込んでいて入りづらかった。
   5186 ところが今日はだれもいなかったので遂に敷居を跨ぐことができた。
   5187 </p>
   5188 <p>
   5189 時期が時期なので余り品揃えはよくなかったが、いろいろと教えてくれた。
   5190 F1ではない種も多数取り扱っているようで、和歌山大根という地元の品種もあった。
   5191 今ある種のなかから、一年中いつでも蒔ける小松菜をいただいてきた。
   5192 楽天という品種だった。
   5193 </p>
   5194 <p>
   5195 家に帰って早速種を蒔いた。
   5196 先日広げた畝に、北側から2坪ほどの土にばら蒔きした。
   5197 少し乾燥ぎみだったので、横に散らばっていた草を上から被せた。
   5198 </p>
   5199 ]]></description>
   5200 </item>
   5201 <item>
   5202 <title>畝を繋げた</title>
   5203 <link>https://www.mtkn.jp/journal/posts/20201209.html</link>
   5204 <guid>https://www.mtkn.jp/journal/posts/20201209.html</guid>
   5205 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5206 <description><![CDATA[<h1>畝を繋げた</h1>
   5207 <time>2020-12-09</time>
   5208 <p>この土日に不耕起の農法を教えてくれる赤目自然農塾にお邪魔してきた。
   5209 その際、今の畝では幅が狭すぎるので広げたほうがいいといわれた。
   5210 とりあえず畝の間の溝を埋めて二つの畝を繋げることにした。
   5211 余り無理をしても次の日動けないのは困るので今日は一列だけ。
   5212 180cmから2m程度の畝になった。
   5213 </p>
   5214 
   5215 <p>
   5216 先日植えた玉葱は根がきちんと活着してくれたようで、
   5217 寝ていた株も起きあがって元気そうである。
   5218 ただしこの畝は細いままなので、やはり表面が少し乾燥しているようだ。
   5219 </p>
   5220 ]]></description>
   5221 </item>
   5222 <item>
   5223 <title>たまねぎを植えた。</title>
   5224 <link>https://www.mtkn.jp/journal/posts/20201202.html</link>
   5225 <guid>https://www.mtkn.jp/journal/posts/20201202.html</guid>
   5226 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5227 <description><![CDATA[<h1>たまねぎを植えた。</h1>
   5228 <time>2020-12-02</time>
   5229 <p>
   5230 祖父の友人がたまねぎの苗を分けてくれたので植えた。
   5231 時期はかなり遅いみたいだがうまくそだってくれるだろうか。
   5232 </p>
   5233 <p>
   5234 耕していない畝に15cm間隔、条間20cmくらいで少し穴を掘って植えた。
   5235 その上から、先日刈った雑草を被せておいた。
   5236 とりあえず一畝だけ。
   5237 </p>
   5238 ]]></description>
   5239 </item>
   5240 <item>
   5241 <title>畑をさせてもらえることになった。</title>
   5242 <link>https://www.mtkn.jp/journal/posts/20201201.html</link>
   5243 <guid>https://www.mtkn.jp/journal/posts/20201201.html</guid>
   5244 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5245 <description><![CDATA[<h1>畑をさせてもらえることになった。</h1>
   5246 <time>2020-12-01</time>
   5247 <p>
   5248 実家のとなりに畑がある。
   5249 子供の頃はそこで育った野菜をよくもらって食べていた。
   5250 最近そこを耕していたひとが高齢のため引退して、
   5251 雑草が生え放題になっていた。
   5252 </p>
   5253 <p>
   5254 先日その土地の地主が草刈に来たので声をかけたところ、
   5255 暫く使う予定がないので使ってもいいとのことだ。
   5256 </p>
   5257 <p>
   5258 ということでぼちぼち何か作ろうと思う。
   5259 </p>
   5260 ]]></description>
   5261 </item>
   5262 <item>
   5263 <title>何をして生きようか</title>
   5264 <link>https://www.mtkn.jp/journal/posts/20201003.html</link>
   5265 <guid>https://www.mtkn.jp/journal/posts/20201003.html</guid>
   5266 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5267 <description><![CDATA[<h1>何をして生きようか</h1>
   5268 <time>2020-10-03</time>
   5269 <h3>仕事</h3>
   5270 <p>
   5271 研究者を目指して大学に入り挫折した。
   5272 </p>
   5273 <p>
   5274 就職先を考えたが、やりたい仕事などそれまで考えたこともなかった。
   5275 そのためやりたいことを基準に仕事を選ぶことができなかった。
   5276 そこで考えたのが、なんのために働くかということである。
   5277 地元には親戚がたくさんいて正月や盆には大勢集まる。
   5278 サマーウォーズみたいな感じ。
   5279 残念ながら古民家に集まるわけではないが。
   5280 僕は家というものが好きだった。
   5281 大学を出てからの人生はその家を更に大きくすることにしよう。
   5282 そう考えた。
   5283 そしてそのための方法として選んだのが、実家が営んでいる
   5284 ダンボール工場を嗣ぐことであった。
   5285 そのために卒業後はまず同業大手で勉強させてもらい、
   5286 数年後実家に帰ることにした。
   5287 </p>
   5288 <p>
   5289 ところがいざ働き始めたらどうだろう。
   5290 何もやりがいがなかった。
   5291 回りにいるひととは全く反りが合わなかった。
   5292 労働環境は最悪だった。
   5293 生活環境も受け入れられなかった。
   5294 気づけばストレスで心身がボロボロになり、盆休み開けにとうとう寝込んだ。
   5295 </p>
   5296 <p>
   5297 仕事が嫌になった。
   5298 その原因について、はじめは成長が感じられないからとか、
   5299 無駄なことを無駄だとわかっているのに無理やりしているからとか、
   5300 いろいろ理由を分析してみたものっだったが、今思えばどれも違う。
   5301 単純に世間一般に広く普及している仕事というものに適正がないのだろう。
   5302 心療内科の医者によれば、僕の症状は適応障害だそうだ。
   5303 こんな世界に適応などしてたまるものか。
   5304 </p>
   5305 <h3>社会は嫌いだ</h3>
   5306 <p>
   5307 この社会に適応できないのは今に始まったことではないと思う。
   5308 </p>
   5309 <p>
   5310 京都から和歌山に帰省するたびに、大阪の町並みが汚いのが気になりだした。
   5311 駅の周りには鉄筋コンクリートの四角い箱が乱雑に並んでいるのである。
   5312 どれも建てられた当時は先進的なデザインでおしゃれだったのだろう。
   5313 そして駅から少し離れた場所にも同じくコンクリートの箱が並んでいる。
   5314 こちらは最近建てられたらしく、デザインも今風である。
   5315 30年建てば時代遅れの残念な物件になるのだろう。
   5316 こんな家を建てる人たちは一体何を考えているのやら。
   5317 人生で一番大きな買い物と言いつつ、ろくに調べもしないでハウスメーカーの
   5318 口車に乗せられ、モダンでおしゃれな家を建てる。
   5319 自分の建てた家に子々孫々住んでほしいとは思わないのだろうか。
   5320 </p>
   5321 <p>
   5322 ある時からスーパーに行くのがしんどくなった。
   5323 出町柳にある枡形商店街の近くに住んでいたことがある。
   5324 その間食事の買い物はほとんどそこに通っていた。
   5325 豆腐屋、肉屋、乾物屋等、専門店が一通り揃っていた。
   5326 扱っているものは当然そのへんのスーパーよりも美味しかった。
   5327 ある時伏見の方に引っ越して、久々にスーパーに通い始めたのだが、
   5328 これが非常にしんどかった。
   5329 音楽がうるさくて買い物に集中できないのだ。
   5330 なんだかよくわからない音楽がやたら大きな音で流れている。
   5331 夕飯を考えながら、美味しいものを選別しようとしている脳みそに、
   5332 その思考を遮るように流れてくるのだ。
   5333 だんだん頭がぼーっとしてきて、結局適当に選んでしまう。
   5334 スーパーでは音楽だけでなく、視覚的な表示も鬱陶しい。
   5335 商品のパッケージは周りよりも少しでも目立とうとするばかりで、
   5336 欲しい情報が一切目に入らない。
   5337 適当に選んで家に持って帰るが、結局対して美味しいものではない。
   5338 スーパーに並んでいるものは、本質的な価値ではなくマーケティングを始めとする
   5339 販促にかかるコストの割合が多いのだろう。
   5340 「美味しいワイン」。「リコピンが多いトマト」。「DHAが含まれているソーセージ」。
   5341 だまっとれや。
   5342 ただ、そういうものが多く売られているというのは、それはつまり
   5343 消費者がそういうものを購入すると言うことである。
   5344 同じものであってもパッケージに美味しいと書いていた方を買うのだろう。
   5345 スーパーでものを買って行く人々が、心理学に踊らされているだけのモルモットに
   5346 見えてきた。
   5347 こんな人たちの中に居たくない。そんなこと書いたら叩かれるかな。
   5348 </p>
   5349 <p>
   5350 スーパーがだめになれば他の店もかなり辛くなった。
   5351 結局ものを売るというのは同じことなのである。
   5352 自分でも驚いたが、スーパーにいけなくなってから、無印良品にも行けない。
   5353 よくわからん音楽が流れる中で、独自のおしゃれ感を作り出しそれを売っている。
   5354 物自体もそんなに質の高いものではないし。
   5355 そこに集う人たちも、雑誌でよく見るテンプレ通りの最近の若者である。
   5356 雑誌はあまり見ないので知らんけど。
   5357 </p>
   5358 <p>
   5359 この人たちは自分の内側から湧いてくる価値観というものを自覚したことが
   5360 あるのだろうか。
   5361 人工的に生み出された流行に踊らされているだけなのではないだろうか。
   5362 </p>
   5363 <p>
   5364 スーパーに行かなくなり、巷で流行っているものを消費しなくなり、
   5365 いよいよ自分がなぜ働いているのかわからなくなった。
   5366 </p>
   5367 <h3>やっぱ農家かな</h3>
   5368 <p>
   5369 世の中にはびこっている様々なものに価値を見いだせなくなったわけだが、
   5370 それでも買わないと生きて行けないのが食べ物である。
   5371 就職してからの半年間は食べ物には結構こだわっていた。
   5372 スーパーに行けないこともあり、学生時代に商店街に通っていたこともあり、
   5373 住処の周りにある個人商店やらを探し回った。
   5374 家から徒歩圏内に豆腐屋と魚屋を見つけた。
   5375 野菜は鎌倉の即売所まで買いに行った。
   5376 米も鎌倉の米屋に求めた。
   5377 乾物も鎌倉だ。
   5378 休みの日は結構な時間と労力を食べ物に投資していたと思う。
   5379 美味しいものを食べてこその人生なのである。
   5380 </p>
   5381 <p>
   5382 やっぱり農家になりたいな。
   5383 </p>
   5384 ]]></description>
   5385 </item>
   5386 <item>
   5387 <title>SSLに対応しました。</title>
   5388 <link>https://www.mtkn.jp/journal/posts/20200926.html</link>
   5389 <guid>https://www.mtkn.jp/journal/posts/20200926.html</guid>
   5390 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5391 <description><![CDATA[<h1>SSLに対応しました。</h1>
   5392 <time>2020-09-26</time>
   5393 <p>Certbotを使ってSSLに対応しました。</p>
   5394 <p>
   5395 と言っても特に暗号化する必要のある情報は
   5396 取り扱っていないので完全に自己満足ではありますが。
   5397 </p>
   5398 ]]></description>
   5399 </item>
   5400 <item>
   5401 <title>rsyncによる投稿テスト</title>
   5402 <link>https://www.mtkn.jp/journal/posts/20200925.html</link>
   5403 <guid>https://www.mtkn.jp/journal/posts/20200925.html</guid>
   5404 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5405 <description><![CDATA[<h1>rsyncによる投稿テスト</h1>
   5406 <time>2020-09-25</time>
   5407 <p>自宅のパソコンから直接rsyncで投稿てすと。</p>
   5408 ]]></description>
   5409 </item>
   5410 <item>
   5411 <title>工場見学</title>
   5412 <link>https://www.mtkn.jp/journal/posts/20200919.html</link>
   5413 <guid>https://www.mtkn.jp/journal/posts/20200919.html</guid>
   5414 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5415 <description><![CDATA[<h1>工場見学</h1>
   5416 <time>2020-09-19</time>
   5417 <p>
   5418 	実家で営んでいる工場を嗣ぐために同業大手に働きに出ているが、
   5419 	そこで何を学べばいいのかわからないので、一度実家の工場を見学
   5420 	することにして、今日行ってきた。
   5421 </p>
   5422 <p>
   5423 	見学して思ったのは、今いる大手の工場よりうちの工場のほうが
   5424 	いい工場であるということだ。
   5425 	工場内は比較的整然としているし、データベース等のシステムも
   5426 	今自分がいる会社よりは圧倒的に進んでいた。
   5427 </p>
   5428 <p>
   5429 	いよいよ自分が今の会社で働いている意味がわからなくなってきた。
   5430 	どうやら父は今僕のいる会社には人材を育成するための教育制度
   5431 	が整備されていて、その制度によって僕という人材が育成されることを
   5432 	期待していたようだ。
   5433 	残念ながらそんな制度はなかったようだが。
   5434 </p>
   5435 <p>
   5436 	つまり僕が今の会社に居続ける義理もそんなにないようである。
   5437 	もちろん業界の知識は少なからず必要であり、今の会社でも
   5438 	働き続ければ多少は勉強できるだろうが、そのために投資する時間
   5439 	に対して割に合わないだろう。
   5440 </p>
   5441 <p>
   5442 	ではどうするか。今の会社をやめるのであれば転職である。
   5443 	そしてその転職先は実家かそれ以外かである。
   5444 	今実家に就職するのはいい選択なのだろうか。
   5445 	僕は業界に関する知識もないし、ビジネスの世界も全く知らない。
   5446 	こんな状態で就職しても、おそらく他の人と同じようなことしか
   5447 	できないだろう。工場に新鮮な空気を取り込めないのだ。
   5448 	だから今は一旦業界を離れ、全く別の世界を覗きに行くのがいいのではないか。
   5449 </p>
   5450 <p>
   5451 	個人的に興味があるのはIT系である。
   5452 	工場のDXという言葉がよく新聞に並んでいるが、その流れを
   5453 	実家に持ち帰れるかもしれない。
   5454 	もう一つ興味があるのは農業である。
   5455 	僕がかってに妄想しているだけだが、近いうちに大量消費社会が
   5456 	終焉を迎え、自分たちにとって本当の豊かさとは何か、今一度
   5457 	考え直す秋が来ると思う。そうなれば必然的に見直されるのが
   5458 	農業である。社会から何を削っても絶対に外せないのが食だからだ。
   5459 	そこに豊かさや幸福を求めるのは自然なことだろう。
   5460 	そんな農業とのつながりを何らかの形で事業に持ち込めれば
   5461 	いいかもしれない。
   5462 </p>
   5463 <p>
   5464 	いずれにせよ今のままダラダラと働くのはごめんだ。
   5465 	無駄なことに時間と精神を費やすのはアホである。
   5466 	我慢して頑張っても、それで身体を壊した上に何も学べない。
   5467 	そんなのは投資とは言えない。
   5468 	頑張るのではなく、精神の求める方に流れていくほうが自然な生き方だろう。
   5469 	とにかく現状を変化させて前に向かって進みたいのだ。
   5470 	自ら動かなければ何もおきない。
   5471 	連休中にエントリーシート書こうかな。
   5472 </p>
   5473 ]]></description>
   5474 </item>
   5475 <item>
   5476 <title>仕事</title>
   5477 <link>https://www.mtkn.jp/journal/posts/20200918.html</link>
   5478 <guid>https://www.mtkn.jp/journal/posts/20200918.html</guid>
   5479 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5480 <description><![CDATA[<h1>仕事</h1>
   5481 <time>2020-09-18</time>
   5482 <p>
   5483 今の仕事がつらい。
   5484 やっているのは得意先から届く注文書のファックスを自社のデータベースに入力するだけの仕事だ。
   5485 誰でもできる仕事であり、近い将来自動化されるだろう。その一方でファックスの様式が得意先毎に異なり、入力時にはその注文書に明記されていないことも考慮しなければいけない。
   5486 日本企業の生産性が低い原因をまじまじと見せられている。
   5487 このような業務なので、入力作業自体は1日もかからずに覚えられる一方、得意先毎の細かい違いを覚えるのに何年もかかるだろう。
   5488 日に日にこの業務に慣れ、入力は速くなっているが、自分が成長しているようには感じない。この会社のこの業務という非常に限定的な分野でしか使えない技術だけがついていくからである。こんなことでは転職しようにもよその会社で使える技術が何もないので、新卒と同じ土俵にたたなければいけなくなる。採用する側もそんな人材に興味はないだろう。
   5489 </p>
   5490 <p>
   5491 成長したい。
   5492 成長とはなんだろう。
   5493 多分生きていく上で使える技術を身に付けることである。
   5494 生きていく上で使える技術とはなんだろう。究極的には畑で作物を育てる技術だと思うが、そんな世紀末のことはまだ考えなくてもいいかもしれない。
   5495 汎用性のある人間になればいいのだろうか。
   5496 そうすれば何でもできて食いっぱぐれない。
   5497 しかしその「何でも」の中に今の仕事は含まれていない。
   5498 成長が感じられない単純な作業はストレスで死んでしまう。
   5499 つまりなんでもできるの中には成長しない仕事は含まれない。
   5500 </p>
   5501 <p>
   5502 なぜ今の会社にいるのか。
   5503 それは実家に帰るためである。
   5504 実家で工場を経営しているのでそこを嗣ごうと考えた。
   5505 そのために同業大手に就職し技術を持ってかえるように父に言われた。
   5506 ところがいざ就職してみると、僕が考えていた技術が一向に学べていない。
   5507 その一方で今学んでいることは父が持って帰ってほしい技術であるようだ。父は工場で必要な細かい技術や知識を持って帰ってほしいらしい。
   5508 僕はそんなものはほしいとは思わない。この業界に特化しても生き残れないと考えるからだ。もちろん業界に特化した人材も必要なのかもしれないが、それはあなたの長男ではないのではないだろうか。長女でも次男でもなさそうだし。
   5509 </p>
   5510 <p>
   5511 今のところだからどうしたいと言うまとまった考えがあるわけではないが、少なくとも自分の学ぶべき場所はここではないと感じている。心身に無理が生じているのを感じるからだ。
   5512 業界の知識を短期間で軽くさらって、そのあとは別の世界を見てみたい。どこかに成長を実感できる世界がないものか。
   5513 </p>
   5514 ]]></description>
   5515 </item>
   5516 <item>
   5517 <title>pythonやめました</title>
   5518 <link>https://www.mtkn.jp/journal/posts/20200917.html</link>
   5519 <guid>https://www.mtkn.jp/journal/posts/20200917.html</guid>
   5520 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5521 <description><![CDATA[<h1>pythonやめました</h1>
   5522 <time>2020-09-17</time>
   5523 <p>pythonをやめてbashスクリプトで作ったcgiに置き換えました。</p>
   5524 <p>管理がだいぶ楽になった気がします。</p>
   5525 <p>アプリの中身ばかりいじってブログの記事が全然増やせていませんが
   5526 ぼちぼち書いていきたいと思います。</p>
   5527 
   5528 <p>サーバーからbashのcgiを動かすにあたって、nginxがややこしかったので
   5529 apacheに変えたのですが、設定が適当なのでセキュリティが心配です。</p>
   5530 ]]></description>
   5531 </item>
   5532 <item>
   5533 <title>localからの投稿テスト</title>
   5534 <link>https://www.mtkn.jp/journal/posts/20200804.html</link>
   5535 <guid>https://www.mtkn.jp/journal/posts/20200804.html</guid>
   5536 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5537 <description><![CDATA[<h1>localからの投稿テスト</h1>
   5538 <time>2020-08-04</time>
   5539 <p>
   5540     今までhtmlファイルをクラウドにscpで持って行ってsqlを実行することで
   5541     ブログ記事を投稿していましたが、ローカルから直接投稿するスクリプトを
   5542     書いてみました。
   5543 </p>
   5544 <p>
   5545     今の所単にsqlを遠隔で行っているだけですが、今後投稿済みの記事を編集
   5546     したりできるように改良したいです。
   5547 </p>
   5548 ]]></description>
   5549 </item>
   5550 <item>
   5551 <title>今日の一汁一菜</title>
   5552 <link>https://www.mtkn.jp/journal/posts/20200802.html</link>
   5553 <guid>https://www.mtkn.jp/journal/posts/20200802.html</guid>
   5554 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5555 <description><![CDATA[<h1>今日の一汁一菜</h1>
   5556 <time>2020-08-02</time>
   5557 <section>
   5558     <h3>今日の一汁一菜</h3>
   5559     <p>
   5560         今日の夕飯は切り干し大根とザワークラウトの味噌汁に
   5561         すりごまをまぶしたもの、
   5562         かぼちゃを蒸して豆腐のそぼろをちらしたもの、
   5563         そしてきゅうりと茄子の浅漬。
   5564     </p>
   5565     <p>
   5566         切り干し大根というものを初めて食べたがこれがなかなか美味しかった。
   5567         細切りにしてザルに広げ一日外に置いておいただけであるが、旨味が
   5568         凝縮される上に食感もコリコリと面白くなる。
   5569     </p>
   5570     <p>
   5571         大根の相手は6月の中頃に漬け込んだザワークラウトである。
   5572         乳酸の酸味が熱い体に染み渡る。
   5573     </p>
   5574     <p>
   5575         味噌を溶いて椀に注いだら、最後に煎りごまをすって入れる。
   5576         酸味とごまは相性が抜群である。
   5577     </p>
   5578 </section>
   5579 <section>
   5580     <h3>野菜を干す</h3>
   5581     <p>
   5582         しばらく前に冷蔵庫の電源を落とした。
   5583         発酵食品ばかり仕込んでいたので冷蔵庫の中がスカスカになり、
   5584         冷蔵庫は不要なのではないかと考えていた。
   5585         そんなある時とうとう空っぽになったので、これを期に
   5586         冷蔵庫なしの生活を試してみようと考えたのだ。
   5587     </p>
   5588     <p>
   5589         しかし一人暮らしなので、一食で野菜をまるまる使い切ることはあまりいない。
   5590         使いかけの野菜はどうしても出る。
   5591         ぬか床に忍ばせたり塩漬けにしたりいろいろ工夫した。
   5592         そのうちの一つが干すということである。
   5593         梅干しを作るために買ってきた竹のザルが二枚あったので、
   5594         余った野菜を適当に切って並べ、梅雨明けの晴天に
   5595         晒してみた。
   5596     </p>
   5597     <p>
   5598         この干し野菜がどれもこれも美味しいのには感動した。
   5599         冷蔵庫のはしっこでしんなりした野菜とは大違いである。
   5600     </p>
   5601 </section>
   5602 <section>
   5603     <h3>当たり前?</h3>
   5604     <p>
   5605         昔の人たちは当たり前のように行っていた干すという保存法。
   5606         それをすっかり忘れ、冷蔵庫を家に置くことが常識と化している。
   5607         大学に進学して一人暮らしを始めるにあたり、なんの疑問も持たず
   5608         冷蔵庫を購入したのが懐かしい。
   5609         冷蔵庫だけではなく、洗濯機や電子レンジも同じである。
   5610         そういえばテレビは買わなかったが…
   5611     </P>
   5612     <p>
   5613         当たり前という感覚を捨て、本当の豊かさを考えたい今日この頃。
   5614         冷蔵庫を捨てる日は近いか。
   5615     </p>
   5616 </section>
   5617 ]]></description>
   5618 </item>
   5619 <item>
   5620 <title>Djangoやめました</title>
   5621 <link>https://www.mtkn.jp/journal/posts/20200801.html</link>
   5622 <guid>https://www.mtkn.jp/journal/posts/20200801.html</guid>
   5623 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5624 <description><![CDATA[<h1>Djangoやめました</h1>
   5625 <time>2020-08-01</time>
   5626 <section>
   5627     <h3>Djangoやめました。</h3>
   5628     <p>
   5629         タイトル通り、Djangoを使うのをやめました。
   5630         代わりにwsgirefを使ってます。Djangoでも間接的に使っていた
   5631         のかもしれないけれど。<br />
   5632         参考: <a href="https://c-bata.link/webframework-in-python/index.html">
   5633             Webアプリケーションフレームワークの作り方 in Python
   5634         </a>
   5635     </p>
   5636     <p>
   5637         ただでさえガバガバだったセキュリティが更にザルになっていると思いますが、
   5638         特に大事なものは置いていないし、Docker使ってるし、大丈夫だと
   5639         思っておいていいかな。攻撃しないでください。
   5640     </p>
   5641 </section>
   5642 <section>
   5643     <h3>サイトのデザイン</h3>
   5644     <p>
   5645         それから、サイトのデザインも変更してます。
   5646         一応明確なテーマを以て作っているのですが、なかなか思うような感じに
   5647         ならないです。<br />
   5648         少しずつ調整していくつもりです。
   5649     </p>
   5650 </section>
   5651 ]]></description>
   5652 </item>
   5653 <item>
   5654 <title>けの日</title>
   5655 <link>https://www.mtkn.jp/journal/posts/20200727.html</link>
   5656 <guid>https://www.mtkn.jp/journal/posts/20200727.html</guid>
   5657 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5658 <description><![CDATA[<h1>けの日</h1>
   5659 <time>2020-07-27</time>
   5660 <section class="introduction">
   5661 <p>普段の生活を少しばかり記録しておこうと思う。</p>
   5662 <p>社会人一年目の7月の終わり頃の生活である。</p>
   5663 </section>
   5664 
   5665 <section class="morning">
   5666 <p>
   5667 朝はだいたい四時から四時半には目が覚める。
   5668 ちょうど日の出と同じ頃である。
   5669 前日はだいたい九時半頃布団に潜るので睡眠時間は七時間といったところである。
   5670 本当は八時間寝たほうがいいと思っていたが、七時間で自然と目が覚めるので自分には
   5671 このくらいがあっているようだ。
   5672 </p>
   5673 <p>
   5674 朝日を眺めながら米を火にかけ、余っている野菜で煮物を二品ほど作る。
   5675 糠床から香の物を拝借してくれば弁当の完成である。
   5676 朝食は食べない。
   5677 </p>
   5678 <p>
   5679 布団を畳んで箒をかけ、フローリングは雑巾で軽く拭く。
   5680 今の借家に越してきてから雑巾がけを始めたが、思えば小学校以来かもしれない。
   5681 </p>
   5682 <p>
   5683 煮物に使った鍋をゆすぎお湯を沸かす。
   5684 バットやボウルを片付けてきれいになったキッチンにコーヒーカップとビーカーを並べる。挽きたての豆で淹れたコーヒーを飲みながらこのブログのソースコードをいじるなどして七時をまつ。
   5685 </p>
   5686 <p>
   5687 時間になれば着替えて出社。
   5688 </p>
   5689 </section>
   5690 
   5691 <section class=evening>
   5692 <p>
   5693 五時に退社し帰宅。
   5694 集に二回ほどは途中で豆腐を仕入れに高橋豆腐店に、魚を仕入れに小平鮮魚店に立ち寄る。
   5695 家に着いたら米を火にかけその隣で出しをとる。
   5696 余った野菜で味噌汁ともう一品作り、糠床から香物を拝借すれば夕飯の一汁一菜。
   5697 </p>
   5698 <p>
   5699 その後はネットをちょつと見るくらいで、
   5700 すぐに風呂にはいって寝てしまう。
   5701 部屋の電気は常夜灯のみなので日が沈むと眠いのだ。
   5702 </p>
   5703 </section>
   5704 ]]></description>
   5705 </item>
   5706 <item>
   5707 <title>Django使うのやめようかな</title>
   5708 <link>https://www.mtkn.jp/journal/posts/20200725.html</link>
   5709 <guid>https://www.mtkn.jp/journal/posts/20200725.html</guid>
   5710 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5711 <description><![CDATA[<h1>Django使うのやめようかな</h1>
   5712 <time>2020-07-25</time>
   5713 <p>
   5714 ホームページにも書いてあるとおり、このサイトはDjangoを使っている。
   5715 しかしほとんど基本的な機能しか使わないのでここまで複雑で大きい
   5716 フレームワークを使う必要性は皆無である。
   5717 全く使わない機能は結局習得することもないので、邪魔なだけだ。
   5718 この程度のサイトであればもっとシンプルなもので作れそうだ。
   5719 </p>
   5720 
   5721 <p>
   5722 半年ほど前にMacBookからOSXを消してLinux Mintに移行した。
   5723 インターネットの回線に高額な料金を払うのが嫌で、一度すべて解約したのだが、
   5724 OSXだとユーザーが何もしていなくてもバックグラウンドで大量の通信が
   5725 行われており、128kbpsでは何もできなくなったため、勝手に通信しない
   5726 Linuxに変えたのである。
   5727 </p>
   5728 
   5729 <p>
   5730 ところがこのLinux Mint、というかデスクトップ環境のxfceには自分には全く必要の
   5731 ないアプリケーションが大量に入っているのである。もちろんOSXなんかより
   5732 圧倒的にましではあるが…
   5733 だんだん嫌になって、あまり考えずに片っ端から消していったら、
   5734 なぜかはよくわからないが起動しなくなってしまった。
   5735 これが確か今年の5月ごろだっただろうか。
   5736 </p>
   5737 
   5738 <p>
   5739 丁度いい機会なのでLinuxの中でも何もない方であるArchのインストールを
   5740 試みることにした。
   5741 過去にも何度か挑戦して、そのたびによくわからずに諦めていたが、
   5742 今はパソコンを仕事などでも使っていないということもあり、落ち着いて
   5743 ドキュメントを読みながら進めると案外あっさりインストールできてしまった。
   5744 </p>
   5745 
   5746 <p>
   5747 非常に快適である。
   5748 </p>
   5749 
   5750 <p>
   5751 最近携帯を買い替え、人生で初めてAndroidというものを触ったが、
   5752 これもかなり不要なものが入っていて不愉快だ。
   5753 シャープお手製のよくわからないものは案外控えめだったが、
   5754 キャリアである楽天関係のアプリに加え、Googleのアプリケーションが
   5755 大量にインストールされている上、それらはさも当たり前のように僕の
   5756 個人情報を要求するのである。
   5757 </p>
   5758 
   5759 <p>
   5760 不必要な"便利さ"のためにただで情報を収集する。
   5761 "最大限の便利さ"を提供することが正義で、そのためにはプライバシーを
   5762 犠牲にしてもいいと思っている。
   5763 余計なお世話だ。
   5764 </p>
   5765 
   5766 <p>
   5767 このページももっと軽い感じにしたいな。
   5768 </p>
   5769 ]]></description>
   5770 </item>
   5771 <item>
   5772 <title>多少体裁を整えました</title>
   5773 <link>https://www.mtkn.jp/journal/posts/20200723.html</link>
   5774 <guid>https://www.mtkn.jp/journal/posts/20200723.html</guid>
   5775 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5776 <description><![CDATA[<h1>多少体裁を整えました</h1>
   5777 <time>2020-07-23</time>
   5778 <section>
   5779 <h5>変更点</h5>
   5780 <p>とりあえず改行できなかったり装飾できなかったり不便なので、
   5781 htmlで投稿できるように変更しました。</p>
   5782 <p>それからcssを作って多少見れるようにしました。</p>
   5783 </section>
   5784 
   5785 <section>
   5786 <h5>これから</h5>
   5787 <p>サイトのデザインですが、できるだけシンプルにしたいと考えています。
   5788 モダンな感じのページは多いですが、視覚効果が多すぎるように感じます。
   5789 本当に必要があってつけているのか、”いい感じ”だからつけているだけなのか…
   5790 </p>
   5791 <p>
   5792 必要なのは投稿の中身と、それから横には目次があると読みやすくなると思っています。
   5793 サイドバーはそのために作っています。
   5794 </p>
   5795 <p>あとは投稿の中に画像を埋め込みたいです。</p>
   5796 </section>
   5797 
   5798 <section>
   5799 <p>そういえばドメインを契約してDNSにIPアドレスを登録したのですが、丸3日たっても名前解決できません。
   5800 いつになったらつながるのかな。</p>
   5801 </section>
   5802 ]]></description>
   5803 </item>
   5804 <item>
   5805 <title>最初の投稿</title>
   5806 <link>https://www.mtkn.jp/journal/posts/20200719.html</link>
   5807 <guid>https://www.mtkn.jp/journal/posts/20200719.html</guid>
   5808 <pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate>
   5809 <description><![CDATA[<h1>最初の投稿</h1>
   5810 <time>2020-07-19</time>
   5811 とりあえずサイトの立ち上げが完了しました。最初の投稿です。
   5812 まだhtmlは適当でcssは全く無いので味気ないサイトですがこれからいろいろといじっていければと思います。
   5813 
   5814 この投稿も多分改行が反映されずに読みにくいものになるかと思いますが、記録として残しておきたいので書いておきます。
   5815 
   5816 ただしdockerとpostgresqlのことがいまいちよくわかっていないので、間違ってデータベースごとけしてしまうかもしれません。まあそれはご愛嬌。
   5817 ]]></description>
   5818 </item>
   5819 <item>
   5820 <title>冷蔵庫と豊かな生活</title>
   5821 <link>https://www.mtkn.jp/journal/posts/20200808.html</link>
   5822 <guid>https://www.mtkn.jp/journal/posts/20200808.html</guid>
   5823 <pubDate>Wed, 20 Jul 2022 00:00:00 +0900</pubDate>
   5824 <description><![CDATA[<h1>冷蔵庫と豊かな生活</h1>
   5825 <time>2020-08-04</time>作成<br>
   5826 <time>2022-07-20</time>更新
   5827 (誤植を修正したが、HTMLのソースの改行に伴う半角スペースはそのままにしておいた。)
   5828 
   5829 <section>
   5830 	<h3>はじめに</h3>
   5831 	<p>
   5832 	冷蔵庫の必要性に疑問を感じ始めた。
   5833 	去年の暮れあたりから発酵食品に凝り始め、
   5834 	冷蔵庫の中が少しずつ空いてきた。
   5835 	また、同じく去年の暮れ頃、体の冷えがあまりにひどくて
   5836 	卒業研究に集中できない状態だった。今年に入り春から夏にかけて
   5837 	気温が上がっていく中でも、体が冷えていることに
   5838 	変わりはなかった。
   5839 	</p>
   5840 	<p>
   5841 	冷蔵庫の必要性を感じなくなり、冷蔵庫で冷やされたものが
   5842 	体に良くないのではないかと考えるにいたり、
   5843 	とうとう冷蔵庫の電源を落とした。
   5844 	以降何不自由なく暮らせている。
   5845 	</p>
   5846 	<p>
   5847 	一度使わなくなると、そもそもなぜこのようなものが当たり前のように
   5848 	普及しているのか疑問に思ったのでいろいろ考えてみた。
   5849 	</p>
   5850 </section>
   5851 <section>
   5852 	<h3>発酵食品へ</h3>
   5853 	<p>
   5854 	去年の秋、引越しに伴い生活費がカツカツになり、それまで特に
   5855 	考えずにいた家計について少しばかり見直そうと思い立った。
   5856 	そして節約の一環として外食を一切やめ、全ての食事を
   5857 	自炊に頼るようにした。
   5858 	先に書いたようにまずはお金がなかったので、近くの青果市場で
   5859 	見切り品として売られていた30円の野菜ばかり買っていたが、
   5860 	一月ほど節約すれば余裕が出てきてすこし贅沢をするようになった。
   5861 	と言っても外食ではなくあくまで自炊である。
   5862 	出町柳の乾物屋に行って鰹節を求め昆布を買い、味噌汁用の出汁
   5863 	をきちんと取るようになった。
   5864 	どうでもいいが味噌汁用に鰹節を買いに行くと決まって鯖節を
   5865 	勧められるので、求めたのは鰹だが実際に使っていたのは
   5866 	ほぼ鯖であった。また、いつも話し方に癖のある主人が
   5867 	対応してくれるが、ある時おばあさんが店に出ていた。
   5868 	独特の話し方が主人と全く同じだったのには驚いた。
   5869 	味噌汁に入れる豆腐を豆腐屋で仕入れるようになったのもこの頃である。
   5870 	豆腐屋の人はなぜか皆遠藤征四郎師範のような腕をしている。
   5871 	</p>
   5872 	<p>
   5873 	自分で出汁を引いて作った味噌汁はうまい。そこに浮かんでいるのが
   5874 	豆腐屋の豆腐なのでなおさらである。
   5875 	自分の舌が肥えていくのがわかった。
   5876 	</p>
   5877 	<p>
   5878 	そんなある日、スーパーで見かけた浅漬を買って食べた。
   5879 	漬物は昔から好物だったが、金がないのもあり見ないふりをしていたが、
   5880 	なんの気なしに手にとって買い物かごに放り込んでみたのである。
   5881 	ところがこれがいまいちだった。一口含んだときはまあそれなりに
   5882 	美味しい気はするが、しかしなんというか、奥行きがないという感じ
   5883 	なのだ。それ以来スーパーの漬物は買わなくなってしまった。
   5884 	</p>
   5885 	<p>
   5886 	しかし漬物は食べたい。
   5887 	結局その頃通っていた近くの米屋で糠をもらってきて
   5888 	自分で漬けることにした。
   5889 	その際にいろいろ調べたが、どうやらスーパーで売っている漬物
   5890 	はどれも発酵していないようなのだ。
   5891 	人工的にうま味を添加した液体に野菜を浸しただけのものらしい。
   5892 	奥行きがないわけである。
   5893 	<p>
   5894 	糠漬けに始まり、烏賊の塩辛、キムチ、バター、パンの酵母、
   5895 	梅干し、熟れ鮓等発酵食品はいろいろ作った。厳密には塩辛と梅干しは
   5896 	発酵していないのだが。
   5897 	</p>
   5898 	<p>
   5899 	そんなある時ザワークラウトを漬けた。
   5900 	このときは漬物が食べたいからというより、単にキャベツを保存する
   5901 	ためである。
   5902 	一人暮らしだと、冷蔵庫があってもキャベツひと玉は傷んでしまうのだ。
   5903 	</p>
   5904 	<p>
   5905 	冷蔵庫でも痛むので塩漬けにする。
   5906 	</p>
   5907 	<p>
   5908 	だったら冷蔵庫要らんのでは?
   5909 	</p>
   5910 	<p>
   5911 	冷蔵庫を手放そうと思い始めたきっかけである。
   5912 	</p>
   5913 </section>
   5914 <section>
   5915 	<h3>身体の冷え</h3>
   5916 	<p>
   5917 	去年の冬、身体があまりにもだるかった。
   5918 	何もできない。お腹も痛い。
   5919 	地元の漢方薬局を樹脂下が、渡されたのは冷えに効く
   5920 	薬ばかりだった。
   5921 	中には重度の冷え性の女性が生理中に身体を温めるための
   5922 	ものも入っていたw。
   5923 	この頃はとにかく身体がだるいだけで、
   5924 	自分では冷えているのかどうかよくわかっていなかった。
   5925 	ところが漢方薬局の先生に不調を訴えると、
   5926 	ことごとく冷えが原因だと言われた。
   5927 	頭痛も腹痛も倦怠感も、全て冷えだと。
   5928 	そんな状態で真冬を迎えた。確かに寒い。身体がキンキンに
   5929 	冷えているのがわかるようになった。
   5930 	ふくらはぎはずっとむくんでいるし、
   5931 	末端は冷たいし、周りが普通にしている部屋で一人だけ
   5932 	凍えていた。
   5933 	この頃から身体の言うことをもっと聞いてあげないと
   5934 	何もできないことがわかった。
   5935 	</p>
   5936 	<p>
   5937 	以来身体の状態はできるだけ観察するようにしている。
   5938 	そして気づいたのだが、自分の身体がずっと冷やされているのだ。
   5939 	春が過ぎ暖かくなっても、至るところで冷房画家明かり
   5940 	冷たい飲み物を出される。
   5941 	まるで汗をかくことが悪であるかのような世界である。
   5942 	</p>
   5943 	<p>
   5944 	この気付きにより、今年の夏は冷たいものは摂取しないようにしている。
   5945 	というよりあまり欲しいとも思わないのだ。
   5946 	喉が乾いても常温のもので満足なのだ
   5947 	(と言っているそばから実家の冷蔵庫にあったハーゲンダッツを
   5948 	食べてしまった)。
   5949 	</p>
   5950 </section>
   5951 <section>
   5952 	<h3>冷蔵庫の電源を落とす</h3>
   5953 	<p>
   5954 	身体の冷えに気づき、発酵食品にのめり込み、
   5955 	冷蔵庫の必要性に疑問を持ち始めたある時、
   5956 	とうとう冷蔵庫の中が空っぽになってしまった。
   5957 	ものは試しと早速電源を落としてみた。
   5958 	余った食材はぬか床に入れるか、あるいは
   5959 	塩漬けにしておけば腐る心配はない。
   5960 	</p>
   5961 	<p>
   5962 	横浜に越してきてからは週末に一週間分の野菜を
   5963 	鎌倉の即売所で仕入れ、冷蔵庫に入れていた。
   5964 	冷蔵庫の電源を落としてからは余った野菜は
   5965 	すべて乳酸菌の力で酸っぱくして保存していた。
   5966 	流石に酸味に飽きてきた頃、梅干し用に買ってきたザルが
   5967 	梅を干し終えて暇そうにしているのを見つけた。
   5968 	干し野菜はうま味が凝縮されて美味しいというので
   5969 	試しに余ったものを干してみた。
   5970 	きゅうり、大根等水分が多いものは薄く切ってそのまま並べる。
   5971 	かぼちゃやじゃがいも等は一度蒸してから干す。
   5972 	生のまま干したものは味が濃くなり食感もコリコリと面白くなる。
   5973 	一方蒸したものは甘みが強くなり、ねっとりとしてこれもまたうまい。
   5974 	一度この味を知ると、どうして今まで冷蔵庫に入れて味が劣化するのを
   5975 	気にも止めなかったのかと悔やまれる。
   5976 	</p>
   5977 	<p>
   5978 	魚はその日のうちに使う分以外は塩水につけて干しておくか、
   5979 	米と合わせてあせの葉や柿の葉で包んでおけば熟れ鮓になる。
   5980 	まだ作ったことはないが、みりん干しなんかもやってみたいものだ。
   5981 	</p>
   5982 	<p>
   5983 	豆腐は水切りをして何かしら塩分の濃いもので包んでおけば
   5984 	大丈夫そうだ。
   5985 	味噌、糠、塩。どれにつけても美味しい。塩漬けはチーズのような
   5986 	芳醇な感じになることを期待していたがそれもない。
   5987 	水道水をそのまま使ったのがまずかったか。
   5988 	まあ保存はできているのでいいのだけれど。
   5989 	</p>
   5990 	<p>
   5991 	肉は最近食べていないのでわからないが、魚と同じだろう。
   5992 	中国には確か肉の熟れ鮓もあったような。
   5993 	燻製なんかも興味がある。
   5994 	</p>
   5995 	<p>
   5996 	冷蔵庫を使わなくなり一週間経つが、何一つ不便なことはない。
   5997 	冷蔵庫の下が掃除できないので早くいなくなってほしいくらいだ。
   5998 	</p>
   5999 </section>
   6000 <section>
   6001 	<h3>なぜ冷蔵庫がうちにあるのか。</h3>
   6002 	<p>
   6003 	改めて冷蔵庫というものを見直してみると、どうしてこんなものが
   6004 	台所の一角に鎮座しているのかわからなくなってきた。
   6005 	大学に進学し一人暮らしを始めるに当たり、
   6006 	なんの疑問もなく買ったのだ。
   6007 	電子レンジや洗濯機も同じである。
   6008 	テレビはNHKが鬱陶しいので買わなかったが。
   6009 	冷蔵庫は家に必要なものであるという常識のもとに生まれ、
   6010 	冷蔵庫を当たり前のように使いながら育った。
   6011 	一人暮らしをするというと、どこに行っても冷蔵庫を買うのが
   6012 	当たり前かのように話が進み、とうとう自分でも買うに至ったと
   6013 	言うわけである。まあ冷蔵庫を買うのは当たり前なのだろうが。
   6014 	</p>
   6015 	<p>
   6016 	つまり冷蔵庫がうちにあるのは世の中の常識を
   6017 	そのまま自分の家に取り込んだ結果なのだ。
   6018 	</p>
   6019 </section>
   6020 <section>
   6021 	<h3>冷蔵庫という常識</h3>
   6022 	<p>
   6023 	ではなぜ冷蔵庫を持つのが常識なのか。
   6024 	簡単である。
   6025 	マーケティングの結果だろう。
   6026 	</p>
   6027 	<p>
   6028 	今までの生活が不便だという認識を植え付け、
   6029 	その不便を解消するという謳い文句で新しい常識を売る。
   6030 	世の中に出回っている便利な道具は大方同じであろう。
   6031 	</p>
   6032 </section>
   6033 <section>
   6034 	<h3>豊かさとは</h3>
   6035 	<p>
   6036 	豊かな食生活のためといって舶来の料理をはやらせ
   6037 	食物油を売り、頑固な油汚れが落ちるからと言って
   6038 	強力な洗剤を売り、荒れた手が潤うからと言って
   6039 	ハンドクリームを売る。
   6040 	</p>
   6041 	<p>
   6042 	忙しいからと便利な家電を売り、
   6043 	その一方で暇を潰すためのエンターテインメントに
   6044 	金を払わせる。
   6045 	</p>
   6046 	<p>
   6047 	暑いからといいエアコンを売って快適な環境を整え、
   6048 	汗をかくためにサウナに金を使わせる。
   6049 	</p>
   6050 	<p>
   6051 	きついからと言い肉体労働を敬遠し、
   6052 	楽をするために自動車を買い、
   6053 	その一方で運動不足になりジムに通う。
   6054 	</p>
   6055 	<p>
   6056 	どれもこれもテレビや新聞等のメディアに作られた豊かさ
   6057 	ではないだろうか。
   6058 	</p>
   6059 	<p>
   6060 	常識や流行にとらわれず、豊かな生き方とはなんなのか、
   6061 	本当に必要なものはなにか、自分自身に問いただす。
   6062 	一度すべての常識を捨て、自分にとって本質的なものを
   6063 	ゼロから構築する。
   6064 	人生を本当の意味で豊かにしてくれる物だけがすべて揃った
   6065 	そんな家に僕は住みたい。
   6066 	</p>
   6067 </section>
   6068 ]]></description>
   6069 </item>
   6070 <item>
   6071 <title>Webサーバーの設定</title>
   6072 <link>https://www.mtkn.jp/computer/setting_up_web_server.html</link>
   6073 <guid>https://www.mtkn.jp/computer/setting_up_web_server.html</guid>
   6074 <pubDate>Mon, 27 Jun 2022 00:00:00 +0900</pubDate>
   6075 <description><![CDATA[<h1>Webサーバーの設定</h1>
   6076 <time>2022-06-27</time>
   6077 
   6078 <h2>はじめに</h2>
   6079 <p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p>
   6080 
   6081 <h2>環境</h2>
   6082 <ul>
   6083 	<li>OS: OpenBSD 7.1</li>
   6084 	<li>サーバー: httpd(OpenBSDに付属のもの)</li>
   6085 	<li>サーバー証明書: Let's Encrypt</li>
   6086 	<li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li>
   6087 	<li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li>
   6088 </ul>
   6089 
   6090 <h2>設定の概要</h2>
   6091 <dl>
   6092 	<dt>サーバーを用意</dt>
   6093 		<dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd>
   6094 	<dt>ドメインの取得とDNSの設定</dt>
   6095 		<dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd>
   6096 	<dt>httpdの設定</dt>
   6097 		<dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd>
   6098 	<dt>証明書の発行と自動更新の設定</dt>
   6099 		<dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd>
   6100 	<dt>ホームページのファイルをアップロード</dt>
   6101 		<dd>ウェブページで配信したいものをVPSにアップロードする。</dd>
   6102 	<dt>接続の確認</dt>
   6103 		<dd>手元のブラウザからアクセスできることを確認。</dd>
   6104 </dl>
   6105 
   6106 <h2>サーバーを用意</h2>
   6107 <p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p>
   6108 
   6109 <h2>ドメインの取得とDNSの設定</h2>
   6110 <p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p>
   6111 <pre><code>HOST                    TYPE       POINTS TO            TTL
   6112 <i>&lt;server_domain&gt;</i>         A          <i>&lt;server_ip&gt;</i>          3600
   6113 www.<i>&lt;server_domain&gt;</i>     A          <i>&lt;server_ip&gt;</i>          3600</code></pre>
   6114 <p><code>HOST</code>はサーバーのFQDN。コントロールパネル上ではサブドメインの部分だけを設定すればよい。サブドメインが無い場合は<code>@</code>と記入する。<code>TYPE</code>は設定するレコードの属性でIPv4のサブドメインを設定する場合は<code>A</code>。この他、IPv6用の<code>AAAA</code>やメールサーバー用の<code>MX</code>、サーバーの別名を登録する<code>CNAME</code>等がある。<code>POINTS TO</code>はサーバーのIPアドレス。<code>TTL</code>はDNSのキャッシュの生存時間の秒数で、DNSの登録内容を変更した際にその変更が世界中のDNSサーバーに反映されるまでにかかる最大の時間である。世界中から多くのアクセスがあるサーバーの場合、DNSの登録内容を変更する前にTTLを短かくしておかないと、キャッシュが破棄されるまでアクセス不能になる。個人のウェブページではまあそんなにアクセスもないし適当でよさそう。ここでは1時間を指定した。</p>
   6115 <p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p>
   6116 <pre><code>$ ping <i>&lt;server_domain&gt;</i>
   6117 PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes
   6118 64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms
   6119 64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms
   6120 ^C</code></pre>
   6121 
   6122 <h2>httpdの設定</h2>
   6123 <p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p>
   6124 <pre><code>$ doas cp /etc/examples/httpd.conf /etc/
   6125 vi /etc/httpd.conf</code></pre>
   6126 
   6127 <pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $
   6128 
   6129 server "<i>&lt;server_domain&gt;</i>" {
   6130 	listen on * port 80
   6131 	location "/.well-known/acme-challenge/*" {
   6132 		root "/acme"
   6133 		request strip 2
   6134 	}
   6135 	location * {
   6136 		block return 302 "https://$HTTP_HOST$REQUEST_URI"
   6137 	}
   6138 }
   6139 
   6140 server "<i>&lt;server_domain&gt;</i>" {
   6141 	listen on * tls port 443
   6142 	tls {
   6143 		certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem"
   6144 		key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key"
   6145 	}
   6146 	location "/.well-known/acme-challenge/*" {
   6147 		root "/acme"
   6148 		request strip 2
   6149 	}
   6150 	location "*" {
   6151 		root "/htdocs/www.<i>&lt;server_domain&gt;</i>"
   6152 		directory auto index
   6153 	}
   6154 }</code></pre>
   6155 <p>一つ目の<code>server</code>ディレクティブは80番ポートにアクセスがあった時の設定。80番ポートは暗号化なしのアクセスなので、二つ目の<code>location</code>ディレクティブで暗号化ありの<code>https</code>の方にリダイレクトさせるようにしている。一つ目の<code>location</code>ディレクティブは<code>acme-client</code>がサーバー証明書を発行する際にアクセスされる場所である。既定値のままにしておけばよい。二つ目の<code>server</code>ディレクティブは443番ポートにアクセスがあった時の設定。<code>tls</code>ディレクティブにおいてサーバー証明書と、暗号化に利用する鍵が設定されている。これも既定値のままでいい。<code>location</code>ディレクティブはウェブサーバーにアクセスがあった時の処理である。一つ目は80番ポートと同じく<code>acme-client</code>用。二つ目はそれ以外である。<code>root</code>(ドキュメントルート)はアクセスがあったときにどこのディレクトリからファイルを探すかを決めるもので、<code>/var/www</code>からの相対パスで記述する。ここでは<code>/htdocs/www.<i>&lt;server_domain&gt;</i></code>にしたのでウェブページのデータは<code>/var/www/htdock/www.<i>&lt;server_domain&gt;</i>/</code>というディレクトリ以下に配置することになる。</p>
   6156 <p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p>
   6157 <pre><code>$ doas httpd -n
   6158 configration OK</code></pre>
   6159 
   6160 <h2>証明書の発行と自動更新の設定</h2>
   6161 <p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p>
   6162 <pre><code>$ doas cp /etc/examples/acme-client.conf /etc/
   6163 $ doas vi /etc/acme-client.conf</code></pre>
   6164 <pre><code>#
   6165 # $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $
   6166 #
   6167 authority letsencrypt {
   6168 	api url "https://acme-v02.api.letsencrypt.org/directory"
   6169 	account key "/etc/acme/letsencrypt-privkey.pem"
   6170 }
   6171 
   6172 authority letsencrypt-staging {
   6173 	api url "https://acme-staging-v02.api.letsencrypt.org/directory"
   6174 	account key "/etc/acme/letsencrypt-staging-privkey.pem"
   6175 }
   6176 
   6177 authority buypass {
   6178 	api url "https://api.buypass.com/acme/directory"
   6179 	account key "/etc/acme/buypass-privkey.pem"
   6180 	contact "mailto:<i>&lt;your_mail_address&gt;</i>"
   6181 }
   6182 
   6183 authority buypass-test {
   6184 	api url "https://api.test4.buypass.no/acme/directory"
   6185 	account key "/etc/acme/buypass-test-privkey.pem"
   6186 	contact "mailto:<i>&lt;your_mail_address&gt;</i>"
   6187 }
   6188 
   6189 domain <i>&lt;server_domain&gt;</i> {
   6190 	alternative names { secure.<i>&lt;server_domain&gt;</i> }
   6191 	domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key"
   6192 	domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem"
   6193 	sign with letsencrypt
   6194 }</code></pre>
   6195 <p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p>
   6196 <p>続いて<code>acme-client</code>を実行して証明書を発行する。</p>
   6197 <pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre>
   6198 <p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p>
   6199 <pre><code>$ doas crontab -e</code></pre>
   6200 <pre><code>...
   6201 #minute hour    mday    month   wday    [flags] command
   6202 19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd
   6203 ...
   6204 </code></pre>
   6205 <p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p>
   6206 
   6207 <h2>ホームページのファイルのアップロード</h2>
   6208 <p>ウェブページに表示させたい内容のファイルをサーバーにアップロードする。試すだけであれば適当なファイルでいい。場所は今回の設定では<code>/var/www/htdocs/www.<i>&lt;server_domain&gt;</i>/</code>以下。ただし<code>httpd.conf</code>で<code>chroot</code>や、<code>server</code>ディレクティブの<code>location</code>ディレクティブの<code>root</code>の値を変更していれば、<code><i>&lt;chroot&gt;</i>/<i>&lt;root&gt;</i>/</code>にアップロードする。ここではテストのために適当なものを置いておく。</p>
   6209 <pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i>
   6210 $ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre>
   6211 
   6212 <h2>接続の確認</h2>
   6213 <p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p>
   6214 <pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre>
   6215 <p>続いてrcに登録、起動。</p>
   6216 <pre><code>$ doas rcctl start httpd
   6217 $ doas rcctl enable httpd</code></pre>
   6218 <p>ブラウザでアクセスしてみる。</p>
   6219 
   6220 <h2>おわりに</h2>
   6221 <p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p>
   6222 
   6223 <h2>参考文献</h2>
   6224 <ul>
   6225 	<li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li>
   6226 	<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li>
   6227 	<li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li>
   6228 	<li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li>
   6229 	<li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li>
   6230 	<li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li>
   6231 	<li><a href="https://ja.wikipedia.org/wiki/Time_to_live#DNS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AETime_to_live">Time to live</a>.Wikipedia.2022-06-27閲覧</li>
   6232 </ul>
   6233 ]]></description>
   6234 </item>
   6235 <item>
   6236 <title>坊主になるために薬の服用を強要されそうになってる。</title>
   6237 <link>https://www.mtkn.jp/journal/posts/20220513.html</link>
   6238 <guid>https://www.mtkn.jp/journal/posts/20220513.html</guid>
   6239 <pubDate>Fri, 13 May 2022 00:00:00 +0900</pubDate>
   6240 <description><![CDATA[<h1>坊主になるために薬の服用を強要されそうになってる。</h1>
   6241 <time>2022-05-13</time>
   6242 <p>地元の寺で出家、得度し、次は宗門の道場に入って修行である。ただし修行と言ってもいい加減なもので、最近流行しているらしい感染症の対策だかなんだかで、総本山に近い新幹線の駅前にあるホテルで行うらしい。寺に滞在すれば感染するがホテルなら感染しないウイルスとはなんとも特異なものである。それとも参加者を自室に監禁してテレビ電話でも繋いで行うのか。だとしたら自宅からでもいいものを。愚痴を言ってもしかたがないのでとりあえず参加申請書を作成して健康診断書と共に提出した。</p>
   6243 <p>しばらくした今日、宗門から電話があった。健康診断書のアレルギーの欄に喘息とあるが、発作が起こった時の為に医者に行って薬を処方してもらい、道場に持参するようにとのことだ。</p>
   6244 <p>は?</p>
   6245 <p>まず喘息の発作がどのようなものかは自分がよく知っている。僕の場合咳がきつくて息苦しいが病院に行く程のものは幼い頃以来ない。そのため普段から発作を抑えるような薬は常備していないし欲しいとも思わない。</p>
   6246 <p>次にたとえどんな症状が出ても薬を飲むかどうかは本人の判断に任せるべきである。薬とは本質的に危険なものである。副作用の無い薬は無い。服用による危険性と服用しないことによる危険性を天秤にかけた上で飲むかどうか判断するべきものである。その判断には統計的な情報に加え、自分の身体の状態をよく観察する必要がある。そのため、他人が服用を強いることはあってはならないだろう。</p>
   6247 <p>最後に薬を服用した方がいい場合であっても、どうするかは本人に任せるべきである。これは死生観の問題である。僕は現代の医療に依存した生き方をするより、自然に生きて自然に死ぬ方を選びたい。</p>
   6248 <p>以上3つの理由により、宗門の要求は受け入れられないものである。ただし残念ながら突然の電話だったのでここまでうまく纏めて話すことは叶わなかった。以下に電話でのやり取りを記す。</p>
   6249 <p>宗門からの要求に対してまずは受け入れられない旨を伝えたところ、集団生活なので宗門に従えとの答えが帰って来た。周りに迷惑がかかるからと。しかしこれは僕個人の問題であり、どのように迷惑がかかるのか、あるいは薬があった場合どうして迷惑がかからないのか分からなかった。そのため僕個人の問題であり周りは関係ないだろうと伝えた。そうすると次は、僕にもしものことがあった場合、薬を持っていないと宗門では責任を取れないとも言われた。これに対して、なぜ僕の命について貴様等に責任を取られないといけないのか分からないと返した。そうすると、そういうものだからとの答えが返ってきた。意味が分からなかったので理解できない旨を伝えたところ、上司と相談して連絡しなおすとのことだった。そのまま電話を切られそうになったので、最後に念をおして、これは死生観の問題であり他人にどうこう言われる筋合いはないこと、そして集団生活と雖も個人の自由の範疇であると考えていることをはっきりと伝えた。</p>
   6250 <p>以上のやり取りは2時間ほど記憶を遡って書いたものであり、どこまで合っているか分からないことを断わっておく。</p>
   6251 <p>電話が切れた後、一応師僧に報告を入れようと寺に電話したところ、こういう時は適当に嘘でも付いてやりすごせばいいと言われた。お前は潔癖すぎだと。</p>
   6252 <p>間違いない。</p>
   6253 <p>しかし潔癖なのもある意味気持がいいのだ。会社を辞めて社会から距離を置き、失うものがなにもない状態で綺麗に生きている今はなかなか気分がいい。ただ宗門に対して嘘を付かないことにだんだんと価値を見出せなくなりつつある。こんないい加減な組織に対して綺麗でいることにどれほどの意味があろうか。もうどうでもいいか。</p>
   6254 <p>寺に報告をした後、夕飯の支度をしながら宗門とのやり取りを思い返しているとやっぱりなんだかひっかかる。薬を持参させるということは、発作が起こったら服用させるということである。つまり薬の服用を強要しているようなものだ。これは世間一般の常識に照らしても不条理なことではなかろうか。それとも僕が世間と距離を置きすぎて知らないだけで世の中ではそんなものなのか。和服で生活をするようになり、僕が覗ける社会の窓はTwitterのみになってしまった。そのTwitterを見ても、風邪を引いたら頭痛薬や解熱剤を、花粉症にはその薬を飲むのが当たり前のようだし、案外宗門は常識に則って良心的な連絡を呉れただけかもしれない。そんな世間はくそくらえだが。</p>
   6255 <p>医学が本当に人を救えているのかは甚だ疑問である。目の前の命はある程度助けられるかもしれないが、助けることが本人にとって幸せかどうかは別問題である。中途半端に助かったが為に余計な苦しみを味わって死ぬことになるかもしれない。また、どんなに医学が発達しても救えない命は零にはならない。さらに、医学が救う命というのは本来自然淘汰されるべきだったものではないだろうか。弱い遺伝子は死ぬのが自然の掟なのである(僕自身小児喘息で死にかけたことがあるので本来は淘汰されるべき人間なのかも知れない)。その掟を破って死ぬはずだった人間を助けてしまい、その人間が子供を作り遺伝子を遺す。そうしてだんだんと医学がないと自立して生きられない人間を量産することにはならないか。現代においても既に医療費が嵩んで面倒なことになっているではないか。目の前の命を救ったが為に将来より多くの苦しみを生む可能性を考えなくていいものか。</p>
   6256 <p>以上の議論は文献に基かない上、定量的なことを一切考えていないいい加減なものである。しかし今は目の前の命を救うことを絶対の正義として疑わず、その副作用を完全に無視しているのではないか。それで本当にいいのだろうか。</p>
   6257 <p>医学に縋り病気を恐れて長生きするより、日々大切に生き、死を潔く受け入れた方がよっぽど充実した人生だと僕は思う。宗教が現代も存在するのは、科学が救えない人の受け皿として必要とされているからではないか。</p>
   6258 <p>全ての人間は死ぬ時に死に、それまでは生きるのである。それでええやん。少なくとも僕はその方がいいのでほっといて欲しい。</p>
   6259 ]]></description>
   6260 </item>
   6261 <item>
   6262 <title>令和4年 農業日誌</title>
   6263 <link>https://www.mtkn.jp/farm/journal/2022.html</link>
   6264 <guid>https://www.mtkn.jp/farm/journal/2022.html</guid>
   6265 <pubDate>Fri, 11 Feb 2022 00:00:00 +0900</pubDate>
   6266 <description><![CDATA[<h1>令和4年 農業日誌</h1>
   6267 (旧暦)
   6268 
   6269 <h3>卯月</h3>
   6270 
   6271 <div class="farm-journal-item">
   6272 <div class="farm-journal-date">
   6273 <div class="luna">9日</div>
   6274 <time>2022-05-09</time>
   6275 </div>
   6276 溝掃除。しばらく雨が降っていない。最後に米を蒔いてからは一回も降っていないと思う。曇って来たので降ってくれることを期待。畑の真黒茄子の一部が発芽した。自分用のメモとしてこの日誌を書いているので作物の位置関係が分かりにくい。なんかうまいこと表示できるやつ作ろうかな。
   6277 </div>
   6278 
   6279 <div class="farm-journal-item">
   6280 <div class="farm-journal-date">
   6281 <div class="luna">4日</div>
   6282 <time>2022-05-04</time>
   6283 </div>
   6284 晴れ。朝は寒く、昼から暑い。一ヶ月程機構が戻ったようだ。昨年キミノーカで買った栗南瓜を、以前蒔いた南瓜の南に、春菊を白もちとうもろこしの一回目の北に、寄居蕪を白もちとうもろこしの二回目の北に、五角オクラを米の隣の里芋の南に、ときわ地這い胡瓜をこのオクラと里芋と同じ場所に、いちずいんげんを鷹の爪から米までの間にある背丈の高い草の足元に植えた。米の所に生えていた雑草は成長が案外遅く、米の方が高くなりつつある。じゃが芋のアンデスに花が咲いていた。鷹の爪の北に蒔いた葱がようやく生えてきた。生きとったんかわれ。麦は早いものはもう収穫してもよさそうなくらい色付いてきた。
   6285 </div>
   6286 
   6287 <div class="farm-journal-item">
   6288 <div class="farm-journal-date">
   6289 <div class="luna">2日</div>
   6290 <time>2022-05-02</time>
   6291 </div>
   6292 米の続き。最後の4mを鷹の爪の南に蒔いた。初めに蒔いた米は既に発芽を確認。然し別のイネ科の草もたくさん生えてきた。軸が赤い草である。家のプランターにも余った米を蒔いた。あと鷹の爪と加茂大芹川丸茄子、ししとうと真黒茄子をそれぞれ一緒に蒔いた。家で苗になればいいが。
   6293 </div>
   6294 
   6295 <h3>弥生</h3>
   6296 
   6297 <div class="farm-journal-item">
   6298 <div class="farm-journal-date">
   6299 <div class="luna">30日</div>
   6300 <time>2022-04-30</time>
   6301 </div>
   6302 米の続き。朝から半日かけて4m程。田の畔も少し補強。里芋も追加で植えた。西瓜の北と茄子の南。昼からも作業したかったが疲れてしまった。
   6303 </div>
   6304 
   6305 <div class="farm-journal-item">
   6306 <div class="farm-journal-date">
   6307 <div class="luna">25日</div>
   6308 <time>2022-04-25</time>
   6309 </div>
   6310 20日にも畑に出たと思うが記録していなかった。20日は米の続き。前回4m程蒔いたがこの時は2mにした。疲れは禁物である。25日も米の続きに加え、蒟蒻をアンデスの南に植えた。あとは鷹の爪を適当に蒔いた。前回蒔いた所に上からばら蒔きしただけである。米の方は今回午前には2m蒔いた。午後もできるだろうか。麦の下の方が茶色くなってきた。午後も米の続き。また2m程。旭大和西瓜を男爵の東と空豆の北に、男爵の東の西瓜の南にとある露天で買った日本南瓜を、日野菜の東のあたりに池田越瓜を植えた。滝野川牛蒡の南にしろもち玉蜀黍を植えた。男爵の南に落花生を植えた。
   6311 </div>
   6312 
   6313 <div class="farm-journal-item">
   6314 <div class="farm-journal-date">
   6315 <div class="luna">19日</div>
   6316 <time>2022-04-19</time>
   6317 </div>
   6318 米を蒔いた。20mの畝のうち4m程。体力を消耗したうえ花粉症と喘息で眠れなかった。身体を作りアレルギーを何とかしなければ。呼吸と食事を見直さないといけない。一日寝込むだけで半年間の食糧が手に入らないのはきびしい世界である。
   6319 </div>
   6320 
   6321 <div class="farm-journal-item">
   6322 <div class="farm-journal-date">
   6323 <div class="luna">14日</div>
   6324 <time>2022-04-14</time>
   6325 </div>
   6326 晴。前日の夜から朝にかけて雨だった。麦は全体的に出穂していた。畑の北側の空いていた場所と空豆が倒れたり成長が悪くてできた隙間に里芋を植えた。多分全て芽赤芋?2つ程昨年のものが混じっているかも知れない。畑の北の方はカラスノエンドウが群生している。日野菜が残っていた所に寄居蕪を蒔いた。日野菜は刈ってしまったが必要なかったか。以前大浦太牛蒡を蒔いた隣に同じ牛蒡を植えた。以前は点蒔きだったが今回は二条のすじ蒔きにした。以前のものは少しだが芽が出ていた。同じ畝の北に植えていた滝野川大長牛蒡も発芽。しろもち玉蜀黍を日野菜を蒔いた北に植えた。薩摩芋の種芋の南に真黒茄子を植えた。鷹の爪を葱の苗床の南に植えた。ノゲシとキツネアザミと多分サワオグルマのしっかりした茎が支柱代りになればと思って畝の中央だけを草刈りして両端は残した。空豆の莢が大きくなって来た。玉葱も大きいものはちゃんと玉になっている。菜っ葉類の種の一部に奇形が見られた。
   6327 </div>
   6328 
   6329 <div class="farm-journal-item">
   6330 <div class="farm-journal-date">
   6331 <div class="luna">9日</div>
   6332 <time>2022-04-09</time>
   6333 </div>
   6334 赤目自然農塾に行った。一日目は便所の補修と猪よけの柵の設置を行った。身体を保護するものが嫌いなので軍手を着用していなかったが案の定トタンの波板で指を切った。他人との共同作業においては少し考えないといけない。二日目は米の種おろしの実習だったが眠くてあまり集中できなかった。
   6335 </div>
   6336 
   6337 <div class="farm-journal-item">
   6338 <div class="farm-journal-date">
   6339 <div class="luna">7日</div>
   6340 <time>2022-04-07</time>
   6341 </div>
   6342 晴。日射しが強くて暑さがこたえるようになってきた。防止がそろそろ必要である。薩摩芋を植えた。空豆の莢が出てきているのを確認した。米を蒔く場所を軽く草刈りした。
   6343 </div>
   6344 
   6345 <div class="farm-journal-item">
   6346 <div class="farm-journal-date">
   6347 <div class="luna">2日</div>
   6348 <time>2022-04-02</time>
   6349 </div>
   6350 晴。最近寒さが戻ったようで、外に出るのが億劫である。田の畔を補強した。毎日少しの時間でも畑に出ないと体ができてこないように思う。隣の畑の人が夫婦で来ていた。奥さんと顔を合わせるのはおそらく初めてである。家で薩摩芋と里芋が芽をふき始めた。
   6351 </div>
   6352 
   6353 <div class="farm-journal-item">
   6354 <div class="farm-journal-date">
   6355 <div class="luna">1日</div>
   6356 <time>2022-04-01</time>
   6357 </div>
   6358 晴。前日は雨。前回より排水はよくなっていた。新3月27日には麦の出穂を確認。さらに大きくなっていた。草の勢いが強い。今日は新しく買った大浦太牛蒡を蒔いた。寄居蕪を前回同様日野菜の後に蒔いた。日野菜もそのふたつ隣りの畝に蒔いた。以前蒔いていた法蓮草、春菊、牛蒡が発芽。じゃが芋の芽も出てきた。体力を付けねば。
   6359 </div>
   6360 
   6361 <h3>如月</h3>
   6362 
   6363 <div class="farm-journal-item">
   6364 <div class="farm-journal-date">
   6365 <div class="luna">22日</div>
   6366 <time>2022-03-24</time>
   6367 </div>
   6368 晴。しばらく雨ばかりで畑が水浸しだった。一部に下の田圃への水路を開けて排水を計った。注文していた種がようやく届いたので少し蒔いた。寄居蕪を日野菜が植わっていた場所に少し、牛蒡(これは以前買っていたもの)を少し、それから葱を蒔いた。高菜を収穫した。土筆がたくさんあったので取って来て佃煮にした。上の畑にれんげが咲いているのを見つけた。年末に蒔いた菜っ葉類は花盛りで蜂もたくさん来ている。交配しなければいいがさすがに近すぎるだろう...
   6369 </div>
   6370 
   6371 <div class="farm-journal-item">
   6372 <div class="farm-journal-date">
   6373 <div class="luna">13日</div>
   6374 <time>2022-03-15</time>
   6375 </div>
   6376 晴。日差しが暑い。隣の畑の人が何かを散布していた。除草剤だろうか。真菜が花盛りである。日野菜はほとんど花を刈り取った。大根も咲いていた。壬生菜も咲きそうだったので少し収穫。山東菜も咲きはじめ。台所で芽を出していた大蒜を植えた。
   6377 </div>
   6378 
   6379 <div class="farm-journal-item">
   6380 <div class="farm-journal-date">
   6381 <div class="luna">11日</div>
   6382 <time>2022-03-13</time>
   6383 </div>
   6384 晴後曇り。今日から明日にかけて雨が降るというので法蓮草を蒔いた。ばら蒔きして草を刈っただけだがうまく発芽してくれるだろうか。後は牛蒡も蒔いた。天気予報に頼ってしまうのは気分がよくない。体感上朝の晴れていたうちもじめじめしていた気がするし、雨の予感はあったと思うのは後付けだろうか。天気を感覚で分かるようになりたい。菜の花が咲いていた。日野菜と真菜である。白菜の葉も起き上がって、遠目には結球したように見える。麦が一段と大きくなった。やっと背が高くなりはじめた。しかし初めに蒔いた所と後れて蒔いた所の差が大きい。
   6385 </div>
   6386 
   6387 <div class="farm-journal-item">
   6388 <div class="farm-journal-date">
   6389 <div class="luna">6日</div>
   6390 <time>2022-03-08</time>
   6391 </div>
   6392 晴ていたように思う。竹を貰いに行ってから体調が落ちた。杉だらけだったので花粉症がひどくて眠れなかった。もう春が来た。大根と高菜を収穫し、小松菜と春菊を蒔いた。
   6393 </div>
   6394 
   6395 <div class="farm-journal-item">
   6396 <div class="farm-journal-date">
   6397 <div class="luna">4日</div>
   6398 <time>2022-03-06</time>
   6399 </div>
   6400 晴後曇り。大根と山東菜を少し収穫して地主さんに持って行った。地主さんが持っているという竹薮の場所を教えてもらった。今日は少し寒さが戻った。そろそろまた菜っ葉の種を蒔きたい。じゃが芋を植えるのと、米の苗床の準備もしなければ。
   6401 </div>
   6402 
   6403 <div class="farm-journal-item">
   6404 <div class="farm-journal-date">
   6405 <div class="luna">2日</div>
   6406 <time>2022-03-04</time>
   6407 </div>
   6408 晴後曇り。日野菜と大根を少し収穫。大根の葉を炒めものに、日野菜の根を煮物にした。日野菜の細いものは筋があって硬かった。
   6409 </div>
   6410 
   6411 <div class="farm-journal-item">
   6412 <div class="farm-journal-date">
   6413 <div class="luna">1日</div>
   6414 <time>2022-03-03</time>
   6415 </div>
   6416 生協で買ったじゃがいもを芽出ししていたが、出揃ってきたので半分に切った。植付けは四日か五日頃か。
   6417 </div>
   6418 
   6419 <h3>睦月</h3>
   6420 
   6421 <div class="farm-journal-item">
   6422 <div class="farm-journal-date">
   6423 <div class="luna">29日</div>
   6424 <time>2022-03-01</time>
   6425 </div>
   6426 雨だったと思う。真菜を収穫して胡麻和えにした。真菜にも日野菜にも蕾が出はじめている。雨の作業も寒さがなければ楽しい。
   6427 </div>
   6428 
   6429 <div class="farm-journal-item">
   6430 <div class="farm-journal-date">
   6431 <div class="luna">28日</div>
   6432 <time>2022-02-18</time>
   6433 </div>
   6434 晴。突然春らしい日になった。朝はまだ寒かったが、日中はかなり気温が上がった。畑に畝を作る続きを行った。田の麦はまた育ったように見える。まだ高さはないが横に広がり、最後に種蒔きした所も全体的に緑になってきている。畑では空豆の花が咲いていた。やはり風が強いのか、あまり高くはならず横に広がっている。あるいは土が硬くて根が浅いのか。アブラ菜科も春を感じてか、とう立ちの気配がある。白菜と大根はその中心に蕾のようなものが準備されている。花の時期が少しずれてくれればいいのだが。畑に死んだ雀が落ちていた。
   6435 </div>
   6436 
   6437 <div class="farm-journal-item">
   6438 <div class="farm-journal-date">
   6439 <div class="luna">14日</div>
   6440 <time>2022-02-14</time>
   6441 </div>
   6442 曇り後晴。午前は先日落札した唐箕を貰いに言った。他にも手箕や籠を貰った。午後はじゃが芋を植えた。昨日購入したアンデスである。芽が出ていないものも数個あったが気にせず植えた。畝が低く感じたので溝を少し掘り下げて中央に盛った。昨日の雨が溜っていたので土が粘土のようになったが大丈夫だろうか。一応高さは確保できたのでいい具合に乾いてくれればいいが。株間30cm、条間40cm程度。畝幅は120cmで二条に植えた。
   6443 </div>
   6444 
   6445 <div class="farm-journal-item">
   6446 <div class="farm-journal-date">
   6447 <div class="luna">11日</div>
   6448 <time>2022-02-11</time>
   6449 </div>
   6450 晴。朝は非常に寒い。田の畔を少し整えた。田圃の端を隣の人が通路として使いたいとのことなので、水を漏らさないようにしないといけない。昨日地主さんに電話したところ、この田の水利費は払ってくれているという。溝掃除は各自やるとのことなので早めにやってしまおう。
   6451 </div>
   6452 
   6453 ]]></description>
   6454 </item>
   6455 <item>
   6456 <title>豚骨ラーメン</title>
   6457 <link>https://www.mtkn.jp/kitchen/recipe/tonkotsu_ramen.html</link>
   6458 <guid>https://www.mtkn.jp/kitchen/recipe/tonkotsu_ramen.html</guid>
   6459 <pubDate>Tue,  8 Feb 2022 00:00:00 +0900</pubDate>
   6460 <description><![CDATA[<h1>豚骨ラーメン</h1>
   6461 <time>2022-02-08</time>作成
   6462 <figure>
   6463 	<img src="../pics/tonkotsu_ramen.jpg" alt="豚骨ラーメンの画像">
   6464 	<figcaption>豚骨ラーメン</figcaption>
   6465 </figure>
   6466 <div class="recipe-ingredient">
   6467 <h2>材料(4~5人分)</h2>
   6468 <ul>
   6469 	<li>豚骨: 1本</li>
   6470 	<li>鶏ガラ: 1個</li>
   6471 	<li>玉葱: 1個</li>
   6472 	<li>野菜くず(人参のへた、葱の頭、キャベツの芯等): 適量</li>
   6473 	<li>大蒜: 1房</li>
   6474 	<li>生姜: 1かけ</li>
   6475 	<li>昆布: 適量</li>
   6476 	<li>干し椎茸: 適量</li>
   6477 	<li>豚肩ロースブロック: 500g</li>
   6478 	<li>長葱: 適量</li>
   6479 	<li>細葱: 適量</li>
   6480 	<li>もやし: 適量</li>
   6481 	<li>卵: 人数分</li>
   6482 	<li>支那竹: 適量</li>
   6483 </ul>
   6484 </div>
   6485 
   6486 <div class="recipe-steps">
   6487 <h2>手順</h2>
   6488 <ol>
   6489 	<li>昆布、干し椎茸は水にかして30分以上置く。</li>
   6490 	<li>豚骨を半分に割り、鶏ガラ、水と共に鍋に入れ2回ほど茹でこぼして臭みを取る。</li>
   6491 	<li>豚骨、鶏ガラ、玉葱、野菜くず、大蒜、生姜、昆布、水を鍋に入れ火にかける。沸騰したら弱火にする(ただしコッテリさせる場合は強火のまま)。適宜アクを取る。水が減ってきたら足す。</li>
   6492 	<li>豚肩ロースに凧糸を巻き、強火で表面を焼く。3に入れて一緒に煮込む。2時間程で野菜と肩ロースを取り出す。</li>
   6493 	<li>1を水ごと弱火にかける。</li>
   6494 	<li>沸騰したら昆布と干し椎茸を取り出し、味醂、酒、塩、醤油で味を付ける。この時塩分濃度が醤油と同じくらいになるようにする。</li>
   6495 	<li>肩ロースを6に漬けて冷ます。冷めたら密閉できる袋に入れて空気を抜き、冷蔵庫で一晩味を染み込ませる。味玉を作る場合、茹で卵も一緒に入れて一晩置く。</li>
   6496 	<li>4は6時間煮込んだらザルで漉して粗熱を取り、冷蔵庫で保存する。鶏ガラについていた肉はからし醤油で食べると美味しい。</li>
   6497 	<li>7を火にかける(表面に脂が浮いて固まっているのであっさりしたスープがいい場合は加熱前に取り除く。脂はラードとして焼き飯等に使うと美味しい)。</li>
   6498 	<li>具材を準備する。卵を茹でて半分に切る。長葱を白髪葱にする。細葱を刻む。肩ロースを薄く切る。もやしをゆがく。</li>
   6499 	<li>麺を茹でる。</li>
   6500 	<li>丼を温め7を適量入れ、9で割る。濃さは好みで調整する。</li>
   6501 	<li>麺と具材を載せる。</li>
   6502 </ol>
   6503 </div>
   6504 
   6505 <h2>ひとこと</h2>
   6506 <p>焼豚は煮込み過ぎると柔らかくなりすぎてくずれる。</p>
   6507 <p>今回は麺と支那竹は市販品だった。製麺機ほしい</p>
   6508 ]]></description>
   6509 </item>
   6510 <item>
   6511 <title>令和4年正月のおせち料理</title>
   6512 <link>https://www.mtkn.jp/kitchen/r4_osechi.html</link>
   6513 <guid>https://www.mtkn.jp/kitchen/r4_osechi.html</guid>
   6514 <pubDate>Fri,  4 Feb 2022 00:00:00 +0900</pubDate>
   6515 <description><![CDATA[<h1>令和4年正月のおせち料理</h1>
   6516 <time>2022-02-04</time>
   6517 <p>令和3年の春ごろからだったか、実家の台所に立つようになった。おせちは毎年買っていたがせっかくなので今回は自分で作ることにした。といってもうちには代々受け継がれてきたおせちはないので本やらインターネットやらで調べながらのものである。近代化によって失われたものは大きい。</p>
   6518 
   6519 <p>今回おせちに入れたものは以下の通り:</p>
   6520 <ul>
   6521 	<li>慈姑</li>
   6522 	<li>百合根</li>
   6523 	<li>鶏そぼろ松風</li>
   6524 	<li>生麩の田楽</li>
   6525 	<li>炊き合わせ</li>
   6526 	<li>栗金団</li>
   6527 	<li>数の子</li>
   6528 	<li>田作り</li>
   6529 	<li>伊達巻</li>
   6530 	<li>酢蓮根</li>
   6531 	<li>たたき牛蒡</li>
   6532 	<li>みつわ漬け</li>
   6533 	<li>金柑の蜜煮</li>
   6534 	<li>鱈の西京焼</li>
   6535 	<li>蒲鉾</li>
   6536 	<li>牛蒡巻き</li>
   6537 	<li>干し柿チーズ</li>
   6538 	<li>黒豆。</li>
   6539 </ul>
   6540 <figure>
   6541 	<img src="pics/r4_osechi.jpg" alt="令和4年正月のおせちの画像">
   6542 	<figcaption>令和4年正月のおせち</figcaption>
   6543 </figure>
   6544 
   6545 <h2>作り方</h2>
   6546 <div class="recipe">
   6547 <h3>慈姑</h3>
   6548 <p>おしりを切って皮を剥き出汁で煮る</p>
   6549 </div>
   6550 
   6551 <div class="recipe">
   6552 <h3>百合根</h3>
   6553 <p>一枚づつ剥いて出汁で煮る</p>
   6554 </div>
   6555 
   6556 <div class="recipe">
   6557 <h3>鶏そぼろ松風</h3>
   6558 <p>鶏1Kg、魚2Kg、出汁3合、醤油70cc、味醂50cc</p>
   6559 <p>鶏のミンチを醤油と味醂で炒める。白身魚のすり身を昆布出汁、醤油、味醂で味付けし、炒めた鶏そぼろを加え型に流して蒸す。切り出して天火で乾かすように焼き、煮切り味醂を塗ってケシの実をまぶす。</p>
   6560 <p>出典: [平井、結野、日本料理店のお弁当]</p>
   6561 </div>
   6562 
   6563 <div class="recipe">
   6564 <h3>生麩の田楽</h3>
   6565 <p>強力粉300g、水150gを捏ねる(水はもう少し多い方がいいかも)。一時間寝かせる。水で揉み洗いして澱粉を流す。白玉粉、水を混ぜて捏ねる。形成して一時間寝かせる。茹でる。浮いてからさらに5分程茹でる。切って味噌を塗り、焼く。</p>
   6566 <p>白玉粉と水の分量をメモしていなかった。インターネットで調べたレシピだったはず</p>
   6567 </div>
   6568 
   6569 <div class="recipe">
   6570 <h3>炊き合わせ</h3>
   6571 <p>人参、干し椎茸、高野豆腐、竹の子水煮</p>
   6572 <p>干し椎茸を戻す。戻した汁で煮て酒、醤油で味付け。高野豆腐を戻す。人参を花型に、竹の子を一口大に切る。それぞれ出汁で煮て醤油、酒で味付け。</p>
   6573 </div>
   6574 
   6575 <div class="recipe">
   6576 <h3>栗金団</h3>
   6577 <p>薩摩芋を一口大に切り、砕いたくちなし1個と水少しを入れた鍋で蒸す。裏漉しし、味醂、砂糖、栗のシロップで味付けし、栗を混ぜる。</p>
   6578 </div>
   6579 
   6580 <div class="recipe">
   6581 <h3>数の子</h3>
   6582 <p>水で一晩塩を抜いて皮を剥く。</p>
   6583 </div>
   6584 
   6585 <div class="recipe">
   6586 <h3>田作り</h3>
   6587 <p>ごまめを乾煎りする。手でボキっと折れるようになるまで。味醂を煮切って醤油を加え、ごまめにからめる。煎り胡麻をまぶす。</p>
   6588 </div>
   6589 
   6590 <div class="recipe">
   6591 <h3>伊達巻</h3>
   6592 <p>魚又は海老のすり身と卵黄を混ぜる。卵白に砂糖を入れて泡立てる。以上を混ぜて味醂で味を付ける。卵焼き器を温め油を敷き、卵液を流して蓋をする。裏返して焼き目を付ける。巻き簾で巻く。</p>
   6593 </div>
   6594 
   6595 <div class="recipe">
   6596 <h3>酢蓮根</h3>
   6597 <p>蓮根を輪切りにして酢水でゆがく。酢に鷹の爪を入れ、蓮根を浸す。</p>
   6598 </div>
   6599 
   6600 <div class="recipe">
   6601 <h3>たたき牛蒡</h3>
   6602 <p>牛蒡を叩いて3cmに切り、縦に4つに割る。ゆがいて酢、醤油、胡麻を混ぜたものに浸す。</p>
   6603 </div>
   6604 
   6605 <div class="recipe">
   6606 <h3>みつわ漬け</h3>
   6607 <p>蕪、人参、柚子、昆布を切る。野菜は塩揉みして絞る。酢に漬ける。</p>
   6608 </div>
   6609 
   6610 <div class="recipe">
   6611 <h3>金柑の蜜煮</h3>
   6612 <p>金柑に縦に切り込みを入れ、さっと煮る。砂糖を加え煮つめる。</p>
   6613 </div>
   6614 
   6615 <div class="recipe">
   6616 <h3>鱈の西京焼</h3>
   6617 <p>西京味噌と味醂を混ぜ、白身魚を漬ける。味噌を拭って焼く。</p>
   6618 </div>
   6619 
   6620 <div class="recipe">
   6621 <h3>干し柿チーズ</h3>
   6622 <p>干し柿を縦に切り、クリームチーズ、胡桃を包むように巻く。柿を干しすぎていたため固くて食べにくかった。</p>
   6623 </div>
   6624 
   6625 <div class="recipe">
   6626 <h3>黒豆</h3>
   6627 <p>豆を鉄と共に一晩水に浸ける。6時間程煮る。砂糖で味付けしさらに10分煮る。冷して味を染み込ませる。</p>
   6628 </div>
   6629 
   6630 <p>蒲鉾、牛蒡巻は既製品</p>
   6631 
   6632 <h3>おわりに</h3>
   6633 <p>伊達巻は妹が、みつわ漬けは母が作ってくれた。蒲鉾と牛蒡巻きは買ってきた。それ以外は自分で作った。この他、蒟蒻を買っていたが存在を忘れていたのと、棒鱈を水で戻していたが腐ってしまったことが心残りである。買ってきた蒲鉾と牛蒡巻き、それから作れなかった蒟蒻の煮物と棒鱈を作るのが今年の年末の課題である。蒲鉾や牛蒡巻きは保存料や着色料等の添加物が気になる所だ。</p>
   6634 <p>今時は百貨店やらでおせちを予約して年末はだらだら過ごし、年始もそのおせちを食べながら家でテレビ漬けが普通なのだろうか。買って来たおせちには旬という概念が欠けており、さらに保存料で日持ちさせている。本来そのとき手に入る旬のものを使い、3ヵ日常温で保存できるように砂糖、酢、塩、発酵等の力を利用したものであったはずだ。今回作ったおせちも食材は基本スーパーで入手した。少しずつ自分の畑で取れたものを取り入れたいものである。</p>
   6635 <p>おせち料理は、家族や近所、あるいは寺であれば檀家との付き合いにより成り立っていたのではないだろうか。その付き合いに充てる時間と気力を労働に回し、その労働により得られたお金でできあいのおせちを購入するのは、家族や地域社会の分断であり、また文化の破壊でもある。購入するお金を稼ぐのを辞め、自分達で作ったほうが人付き合いも増え、地域に根差した文化の継承にもなり、より充実した生き方に繋るのではないだろうか。</p>
   6636 ]]></description>
   6637 </item>
   6638 <item>
   6639 <title>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</title>
   6640 <link>https://www.mtkn.jp/computer/rtx1200-qos.html</link>
   6641 <guid>https://www.mtkn.jp/computer/rtx1200-qos.html</guid>
   6642 <pubDate>Fri, 14 Jan 2022 00:00:00 +0900</pubDate>
   6643 <description><![CDATA[<h1>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</h1>
   6644 <time>2022-01-14</time>作成
   6645 <h2>はじめに</h2>
   6646 <p>一人暮らししていた頃節約にはまり、下宿の固定回線を解約したうえ、携帯の回線を128kbpsしかでないものに変更したことがある。以来通信費をどうやって抑えるかあれこれ考えてきた。現在は実家に暮らしていて、家で契約している光回線を使わせてもらっている。携帯の方は楽天モバイルであり、外で使うことはまずないので毎月の支払いは発生していない。しかしいずれこの家をでた時に、楽天モバイルの回線だけでは結局月々3278円と大きな出費になる。また、通信速度が遅い生活というのは雑音の少ない充実したものであった経験もある。こんなことを考えていたところ、通信速度が128kbpsだが無料で利用できる格安sim<sup>[1]</sup>を発見した。この速度に慣れておけば、通信費が全くかからない生活ができる。ということで家で使っているルーターの設定を変更し、通信帯域を制限してみた。</p>
   6647 <h2>機材</h2>
   6648 <ul>
   6649 	<li>ルーター: Yamaha RTX1200</li>
   6650 	<li>無線アクセスポイント: elecomのルーター</li>
   6651 	<li>パソコン: Lenovo x220</li>
   6652 	<li>パソコンのOS: OpenBSD 7.0</li>
   6653 </ul>
   6654 <h2>設定したい内容</h2>
   6655 <p>RTX1200のLAN2ポートにWANが接続されており、LAN1には家で使っている端末がいろいろ接続されている。LAN3は今回は関係ないので割愛する。LAN1を2つのvlanに分割し、1-7番のポートをvlan1、8番のポートをvlan2する。そしてこのvlan2とインターネットとの通信を上下とも128kbpsに制限する。vlan2と他のlanとの通信は制限しない。vlan2にelecomのルーターを無線アクセスポイントとして接続し、僕が使うパソコンやスマホはこのアクセスポイントに接続する。</p>
   6656 <figure>
   6657 <pre>
   6658 	                         Internet
   6659 	                            |
   6660 	      ┌-------┬-----------┬-┴--┬----┐
   6661 	      |RTX1200|LAN1       |LAN2|LAN3|
   6662 	      └-------┴-┬-------┬-┴----┴----┘
   6663 	              vlan1   vlan2
   6664 	      192.168.100.1   192.168.101.1
   6665 	                |       |
   6666 	┌------------┐  |       |    ┌-----------┐   ┌-----┐
   6667 	|home network├--┘       └----┤elecom wifi├---┤my PC|
   6668 	└------------┘               └-----------┘   └-----┘
   6669 	192.168.100.0/24         192.168.101.0/24
   6670 </pre>
   6671 <figcaption>図1: 接続と設定の概略</figcaption>
   6672 </figure>
   6673 
   6674 <h2>vlanについて</h2>
   6675 <p>ヤマハのページにvlanについて以下のような説明がある:</p>
   6676 <blockquote cite="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">物理的な接続形態に依存せず仮想的にグループを形成してひとつのLANとみなすものが、VLAN(Virtual LAN)です。VLANには、スイッチの物理ポート単位でVLANを形成するポートベースVLANと、パケットにタグと呼ばれるヘッダを付加してVLAN情報を格納するタグVLANとがあります<sup>[2]</sup>。</blockquote>
   6677 <p>
   6678 ここではLAN1にある8つのポートをvlanによって2つの論理的なLANに分割する。しかしこの後設定するクラス分けでは送信元や宛先のアドレスによる分類ができるので帯域幅を制限したい端末のIPアドレスを固定しておくだけでよかったんやけどな。
   6679 </p>
   6680 
   6681 <h2>クラス分けについて</h2>
   6682 <p>クラス分けについてヤマハのページに以下のような説明がある:</p>
   6683 <blockquote cite="https://network.yamaha.com/knowledge/qos">優先して転送するデータを判別するために、受信したデータを分類します。<br />
   6684 データの分類には、転送データに含まれている情報を使用します。<sup>[3]</sup></blockquote>
   6685 <p>
   6686 各ポートから出ていくパケットについて、そのパケットの送信元アドレスや宛先アドレス等の情報に基づきクラスに分類する。このクラス毎に様々な処理が可能なのだが[要出典]、今回はvlan2とインターネットとの通信をクラス1として、このクラスに対して帯域幅を128kbpsに制限する。
   6687 </p>
   6688 
   6689 <h2>実際の設定</h2>
   6690 <p>RTX1200において行った設定は以下の通り。ただし、LAN2にppの設定をし、LAN1とインターネットとの通信ができるところまでは既に設定済みとし、以降の変更点だけ抜粋する。</p>
   6691 <p>始めにLAN1を2つのvlanに分割する:
   6692 <pre><code># vlan port mapping lan1.1 vlan1
   6693 # vlan port mapping lan1.2 vlan1
   6694 # vlan port mapping lan1.3 vlan1
   6695 # vlan port mapping lan1.4 vlan1
   6696 # vlan port mapping lan1.5 vlan1
   6697 # vlan port mapping lan1.6 vlan1
   6698 # vlan port mapping lan1.7 vlan1
   6699 # vlan port mapping lan1.8 vlan2
   6700 # lan type lan1 port-based-option=divide-network
   6701 </code></pre>
   6702 <p>
   6703 続いて各vlanの設定を行う。ただしvlan1はlan1の設定を受け継ぐので不要。
   6704 </p>
   6705 <pre><code># ip vlan2 address 192.168.101.1/24
   6706 # ip vlan2 secure filter <i>&lt;vlan1と同じパケットフィルター&gt;</i>
   6707 </code></pre>
   6708 <p>次にクラスフィルターを定義:</p>
   6709 <pre><code># queue class filter 1 1 ip 192.168.101.0/24 * * * *
   6710 # queue class filter 2 1 ip * 192.168.101.0/24 * * *
   6711 # queue class filter 3 2 ip 192.168.100.0/24 192.168.101.0/24 * * *
   6712 </code></pre>
   6713 <p>
   6714 上の2行はvlan2とその他との通信を制限するためのものである。ただしこの2つだけではvlan1からvlan2への通信まで制限してしまうので、それを除外するために3行目のクラスフィルターを定義する。
   6715 </p>
   6716 <p>次にクラスフィルタをvlan2に適応。これによりルーターから192.168.101.0/24への通信がフィルタリングされる。</p>
   6717 <pre><code># queue lan1 type shaping
   6718 # queue vlan2 class filter list 3 2
   6719 </code></pre>
   6720 <p>
   6721 2行目で指定したフィルターはその指定した順番で評価されるので注意が必要。<br />
   6722 そしてクラスに対する制限を指定:
   6723 </p>
   6724 <pre><code># queue lan1 class property 1 bandwidth=128k
   6725 </code></pre>
   6726 <p>次はlan2(pp)にクラスフィルタを適応。これにより192.168.101.0/24からルーターへの通信がフィルタリングされる。</p>
   6727 <pre><code># queue lan2 type shaping
   6728 # pp select <i>n</i>
   6729 pp<i>n</i># queue pp class filter list 1
   6730 </code></pre>
   6731 <p>
   6732 vlan2の時と同様にクラスに制限を設定:
   6733 </p>
   6734 <pre><code># queue lan2 class property 1 bandwidth=128k
   6735 </code></pre>
   6736 
   6737 <h2>パソコンでの設定</h2>
   6738 <p>最後にパソコンから今回作ったvlan2に接続するように設定する:</p>
   6739 <pre><code># cat > /etc/hostname.<i>if</i> &lt;&lt;EOS
   6740 join <i>&lt;アクセスポイントのECS-ID&gt;</i> wpakey <i>&lt;アクセスポイントの暗号化キー&gt;</i>
   6741 inet 192.168.101.2/24
   6742 EOS
   6743 # echo 192.168.101.1 > /etc/mygate
   6744 </code></pre>
   6745 
   6746 <h2>おわりに</h2>
   6747 <p>めっちゃ遅い。</p>
   6748 
   6749 <h2>参考文献</h2>
   6750 <ol>
   6751 	<li><a href="https://www.donedone.jp/plan/">料金プラン-50ギガの大容量SIM | donedone(ドネドネ) ドネーション型モバイルサービス</a>.donedone.2022-01-14閲覧</li>
   6752 	<li><a href="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">VLAN</a>.RTpro.2022-01-14閲覧</li>
   6753 	<li><a href="https://network.yamaha.com/knowledge/qos">QoSとは</a>.RTpro.2022-01-14閲覧</li>
   6754 	<li><a href="https://changineer.info/network/yamaha_router_rtx/yamaha_router_rtx_vlan_port_example.html">Yamaha RTX ルータのセキュリティのデフォルト設定解説(CLIの場合)</a>.ネットワークチェンジニアとして.2022-01-14閲覧</li>
   6755 </ol>
   6756 ]]></description>
   6757 </item>
   6758 <item>
   6759 <title>無題</title>
   6760 <link>https://www.mtkn.jp/journal/posts/20211214.html</link>
   6761 <guid>https://www.mtkn.jp/journal/posts/20211214.html</guid>
   6762 <pubDate>Tue, 14 Dec 2021 00:00:00 +0900</pubDate>
   6763 <description><![CDATA[<h1>無題</h1>
   6764 <time>2021-12-14</time>
   6765 <p>
   6766 図書館に本を返しに行った。最近家ではパソコンばかりいじっているので本を借りても読まずじまいのことが多い。たまに読もうと思う時もたいがい小林一郎の法華経大講座を開く。一応日蓮宗の坊主になろうというのでひととおり法華経のことは知っておきたいのだ。今日も図書館ではいろいろと漁った。ウェブサーバーやメールサーバーを立ててみたので、セキュリティ関係の本や暗号の本を探した。数冊は立ち読みしたがどうせ読まないだろうとすべて本棚に戻した。PGPの鍵を作ったりしているので暗号関連の数学は理解しておきたいという願望はあるのだが頭が多分ついていけない。場所を変えて農業の本も見てみたがあまり読みたいものがなかった。麦を育て始めたのでそのあたりの情報が欲しかったのだがなかった。とうとうなにも借りずに出てきてしまった。
   6767 </p>
   6768 <p>
   6769 図書館からの帰りはたいてい途中にある野菜の直売所に立ち寄る。ここはスーパーにはなさそうなものがたくさんある。大根や蕪のおばけみたいなのや、里芋の親芋や葉っぱなんかも置いてある。里芋の葉っぱは家でかじって口の中がとんでもないことになって敬遠した。品種によって渋が強かったり弱かったりするので売っているものは食べても大丈夫なものだと思うが。無農薬の野菜も置いてあるのだがそうだと書いていないのも面白い。今日はその無農薬のものから紫キャベツと、別の棚から真菜をいただいてきた。キャベツはピクルスに、真菜は白和えにするのがおすすめだそうだ。
   6770 </p>
   6771 <p>
   6772 野菜を買ったあと、家の葛が切れていたのを思いだして豆屋にも寄った。黒豆や小豆等の新豆が入っていたが家に余っているので買えなかった。しかしこの町には昔の店がいろいろ残っているものだ。生まれ育った地元であるが、今になるまでほとんど店を知らなかった。寺に通いだしてからお上人の奥さんがいろいろと店を教えてくれる。この豆屋はこの寺の檀家だそうだ。他にもかつを節屋、魚屋、肉屋、うなぎ屋、蜂蜜屋、豆腐屋、酒蔵、お茶屋、珈琲豆焙煎所等、スーパーに行かなくてもほとんど揃う。味噌と醤油の蔵もあるにはある。醤油発祥の地、湯浅であるがこれは自転車ではきつい。山を越えての50Kmである。横浜から東京まで片道50Kmを走ったことがあるがかなり疲れた。昔の人はこのくらいの距離をあたりまえのように歩いていたのだろうか。実家の辺りから山を越えて湯浅に向かう山道が今も残ってはいるが、ひとつ目の山の頂上まで行くのでもそれなりにくたびれる。体力を付けねば。
   6773 </p>
   6774 <p>
   6775 葛を買って家に向かっていると、いつも畑で散歩がてら声を掛けてくれるおじいさんに会った。普段は簡単な挨拶だけだが今日は少し話した。40歳のときに思うところがあってお経の勉強を始めたらしい。写経していたがすぐに飽きて仏教画を始め、教室を主宰するに至ったそうだ。高野山大学の図書館にしばしば行っては画集のコピーを持って帰って来たという。なかなか変った人生を歩んできたようである。畑でもほとんどの人が頑張れと言うところ、この人は頑張りすぎるなと言うので面白い人だと思っていたが、話してみると色々考えが深そうな人である。
   6776 </p>
   6777 <p>
   6778 仕事を辞めて以来、人と関わる機会が増えたように思う。畑を借り、道行く人と話し、寺の門を敲き、檀家と話し、その人その人の人生を垣間見ることができ、人生が何倍にも広がった。収入は無くなったが今の方が生きている。
   6779 </p>
   6780 ]]></description>
   6781 </item>
   6782 <item>
   6783 <title>赤目自然農塾</title>
   6784 <link>https://www.mtkn.jp/journal/posts/20211129.html</link>
   6785 <guid>https://www.mtkn.jp/journal/posts/20211129.html</guid>
   6786 <pubDate>Mon, 29 Nov 2021 00:00:00 +0900</pubDate>
   6787 <description><![CDATA[<h1>赤目自然農塾</h1>
   6788 <time>2021-11-29</time>
   6789 <p>
   6790 11月13日、14日の二日間、奈良にある<a href=https://akameshizennoujuku.jimdofree.com/>赤目自然農塾</a>の勉強会に参加してきた。この塾は自然農の提唱者である川口由一さんが始められたもので、自然農の技術を学び実習できる場である。毎月一回二日間の定例の学びがあり、一日目には畑の補修等の共同作業と言葉を通しての学びが、二日目には実習が行われる。昨年12月に初参加し、今回はほぼ一年ぶりの2回目であった。1反9畝の畑を借りることになったので、本格的に自然農の技術を身に付けたい。できれば毎月通って一通りのことを教わりたいのだが続くだろうか。
   6791 </p>
   6792 <h2>1日目</h2>
   6793 <p>
   6794 車を停めて外に出る。思っていたより暖かかった。もこもこの着物を着て来たが厚いので暑いので薄めのものに着替え、その上から作務衣を着た。普段畑に入る時は裸足だが、共同作業で何をするのか分からないので地下足袋を履いて小屋に向かう。
   6795 </p>
   6796 <p>
   6797 午前の作業は篠竹を刈り取って枝を払い、束にして小屋の屋根裏に干すというものだった。篠竹はよく撓って使いやすそうだった。10人以上で作業していたが収穫量は思った以上に少なかった。一人でやると日が暮れる。
   6798 </p>
   6799 <p>
   6800 午後は汲取式の便所を汲み取って別の場所に撒いた。臭いはそこまでひどくはなかった。ブルーチーズや高級な納豆でも香るアンモニア臭が中心で、吐き気を催すほどではない。発酵食品を食べすぎているのかもしれない。便所は地面に穴を掘って桶のようなものを埋め、木の板で便器を作って被せ、周囲から見えないように囲っているだけのものだ。小屋に隣接するものは建物の一部になっていて壁も木材でしっかりと作られているが、畑の中にぽつんと立っているものは先程の篠竹を束ねたもので周囲を囲っているだけの簡易なものである。桶から柄杓で排泄物を汲み取りバケツに入れる。本来は天秤棒を用いて一人で二つ運ぶというが、技術が必要なので今回は棒の中心にバケツをぶらさげて二人で一つを運ぶことになった。肥を撒く場所までの道はでこぼこで途中川を渡る必要がある。初対面の人と二人、なかなかの緊張感のなか息を合わせて肥を運ぶ。肥を撒く場所ではいきなりバケツごとあけるのは危険なので、ここでも柄杓で少しづつである。玄関先に水をうつようにその場所全体にまんべんなく撒く。柄杓にスナップを効かせると肥が帰ってくる。これもまた緊張感のある作業だった。そこそこの量があったが日没前には終わった。
   6801 </p>
   6802 <p>
   6803 銭湯を経由して山荘に。晩御飯は菜飯とかぼちゃのサラダ、それにけんちん汁だった。ほとんどが自然農で採れた野菜である。御飯の後は言葉を通しての学びとして、今回は教育について議論した。21時ごろから始めて終ったのは日付が変わるころだった。みんな眠い目をこすり、船を漕ぎならがの議論であるが、これがなかなか面白いものである。誰かが言った言葉が直接脳に入って来くる。あまりうまくまとまっていない考えでも発言すればだれかの脳に届いてなにかしら返答がある。なんだか全員の脳味噌を直接繋いで考えているような感覚になるのだ。僕は今回寺子屋を始めたいという旨のことをぽろっと言っただけで終った。しかし言っただけでもなんとなく自分でも実現させようという心持ちになるものである。
   6804 </p>
   6805 <h2>2日目</h2>
   6806 <p>
   6807 2日目は農作業の実演である。今回は稲の刈り方とその後の干し方、それに麦の蒔き方を見せてもらった。これが昼過ぎに終り、御飯のあとは畑の見学会に参加させてもらった。
   6808 </p>
   6809 ]]></description>
   6810 </item>
   6811 <item>
   6812 <title>令和3年 農業日誌</title>
   6813 <link>https://www.mtkn.jp/farm/journal/2021.html</link>
   6814 <guid>https://www.mtkn.jp/farm/journal/2021.html</guid>
   6815 <pubDate>Wed, 17 Nov 2021 00:00:00 +0900</pubDate>
   6816 <description><![CDATA[<h1>令和3年 農業日誌</h1>
   6817 (旧暦)
   6818 
   6819 <h3>師走</h3>
   6820 <div class="farm-journal-item">
   6821 <div class="farm-journal-date">
   6822 <div class="luna">25日</div>
   6823 <time>2022-01-27</time>
   6824 </div>
   6825 晴。畑の畝作り。菜っ葉の間引き。畝の間の溝に水が貯まっている。もう少し乾燥していたほうがいいのだろうか。菜っ葉はどれも成長が良いように見える。
   6826 </div>
   6827 
   6828 <div class="farm-journal-item">
   6829 <div class="farm-journal-date">
   6830 <div class="luna">6日</div>
   6831 <time>2022-01-08</time>
   6832 </div>
   6833 晴。畑の方に畝を少し作った。じゃが芋を植えたいので少し高めの畝にする。昨年度は雨が続いて水没した部分が腐ってしまったのだ。今年はうまくいくといいな。新暦では年が明けた。今日は一日遅れたが七草粥を食べた。畑の隅に大根の余った苗をまとめていたのでそれを抜いて粥に入れた。成長がいいものは太さが15mm程度になっていた。玉葱の苗もまた少し定植した。始めの方に植え替えたもののうち一本だけ葉が太く、濃い緑になっていた。他のものは植えてから変化がないように見える。麦も変化があまりない。
   6834 </div>
   6835 
   6836 <h3>霜月</h3>
   6837 <div class="farm-journal-item">
   6838 <div class="farm-journal-date">
   6839 <div class="luna">19日</div>
   6840 <time>2021-12-21</time>
   6841 </div>
   6842 晴。田圃の溝を少し整備。麦が成長してひとつめの畝は遠くからでもうっすらと緑に見えるようになった。畑の野菜もそれなりに育っている。
   6843 <figure><figcaption>和歌山大根</figcaption><img src="pics/DSCF0249.JPG" alt="和歌山大根"></figure>
   6844 <figure><figcaption>大和真菜</figcaption><img src="pics/DSCF0252.JPG" alt="大和真菜"></figure>
   6845 <figure><figcaption>松島新二号白菜</figcaption><img src="pics/DSCF0255.JPG" alt="松島新二号白菜"></figure>
   6846 <figure><figcaption>いちばんぼし(裸大麦)</figcaption><img src="pics/DSCF0257.JPG" alt="いちばんぼし(裸大麦)"></figure>
   6847 </div>
   6848 
   6849 <div class="farm-journal-item">
   6850 <div class="farm-journal-date">
   6851 <div class="luna">17日</div>
   6852 <time>2021-12-19</time>
   6853 </div>
   6854 曇り時々雨。玉葱の定植。白菜、大根、真菜等が大きくなってきた。麦も大分育ったので踏もうとしていたら雨が降って来てできなかった。畔に子猫が居た。
   6855 </div>
   6856 
   6857 <div class="farm-journal-item">
   6858 <div class="farm-journal-date">
   6859 <div class="luna">12日</div>
   6860 <time>2021-12-14</time>
   6861 </div>
   6862 晴。久々に冬らしく寒い朝だった。昼間は日が照って暑い。壬生菜の定植。畝作り。
   6863 </div>
   6864 
   6865 <div class="farm-journal-item">
   6866 <div class="farm-journal-date">
   6867 <div class="luna">9日</div>
   6868 <time>2021-12-11</time>
   6869 </div>
   6870 晴。麦蒔きが完了した。庭のプランターに植えていた壬生菜を半分ほど畑に植えかえた。大根がわずかに太くなっている。
   6871 </div>
   6872 
   6873 <div class="farm-journal-item">
   6874 <div class="farm-journal-date">
   6875 <div class="luna">7日</div>
   6876 <time>2021-12-10</time>
   6877 </div>
   6878 晴。日差しが強くて暑い。麦の続き。4本目の畝は小さいので草を刈らずに上から蒔いた。結局草刈りは全部は終わらず次の日に持ち越し。
   6879 </div>
   6880 
   6881 <div class="farm-journal-item">
   6882 <div class="farm-journal-date">
   6883 <div class="luna">5日</div>
   6884 <time>2021-12-08</time>
   6885 </div>
   6886 晴。麦の続き。3本目の畝に蒔き終わった。始めに蒔いたところはそろそろ麦踏みか。
   6887 </div>
   6888 
   6889 <div class="farm-journal-item">
   6890 <div class="farm-journal-date">
   6891 <div class="luna">3日</div>
   6892 <time>2021-12-06</time>
   6893 </div>
   6894 晴。麦の続き。
   6895 </div>
   6896 
   6897 <div class="farm-journal-item">
   6898 <div class="farm-journal-date">
   6899 <div class="luna">1日</div>
   6900 <time>2021-12-04</time>
   6901 </div>
   6902 曇時々晴。麦の続き。玉葱の移植。太いものから7本植えた。
   6903 </div>
   6904 
   6905 <h3>神無月</h3>
   6906 <div class="farm-journal-item">
   6907 <div class="farm-journal-date">
   6908 <div class="luna">29日</div>
   6909 <time>2021-12-03</time>
   6910 </div>
   6911 晴。麦の続き。疲れがでてしばらく休んでいた。気付けば一週間ぶりの作業である。急いては事を仕損じる。結局ゆっくりやったほうが早く蒔けていただろう。始めに蒔いた麦はもう5cmほどに成長していた。
   6912 </div>
   6913 
   6914 <div class="farm-journal-item">
   6915 <div class="farm-journal-date">
   6916 <div class="luna">21日</div>
   6917 <time>2021-11-25</time>
   6918 </div>
   6919 曇時々雨。麦を蒔くための草刈りの続き。今日は200g蒔けた。既に蒔いていたものからもやしのようなものが出ているのを確認。根っこか。玉葱と壬生菜の苗も大きくなってプランターでは窮屈そうなので早く定植しなければ。
   6920 </div>
   6921 
   6922 <div class="farm-journal-item">
   6923 <div class="farm-journal-date">
   6924 <div class="luna">19日</div>
   6925 <time>2021-11-23</time>
   6926 </div>
   6927 晴のち曇。麦を蒔くための草刈りの続き。3時頃まで出掛けていたので今日は1時間だけ作業。
   6928 </div>
   6929 
   6930 <div class="farm-journal-item">
   6931 <div class="farm-journal-date">
   6932 <div class="luna">17日</div>
   6933 <time>2021-11-21</time>
   6934 </div>
   6935 晴。麦蒔きの続き。蒔いてから草を刈るのではいそがしいので草を刈ってから蒔くことにした。また短期間のうちに全面蒔くのはあきらめた。
   6936 </div>
   6937 
   6938 <div class="farm-journal-item">
   6939 <div class="farm-journal-date">
   6940 <div class="luna">16日</div>
   6941 <time>2021-11-20</time>
   6942 </div>
   6943 晴。麦を蒔いた。一番長い畝の2/3ほど蒔けた。ばら蒔きした後草を刈る。この草刈に思ったより時間がかかる。のこぎり鎌でないと歯がすぐに丸くなる。買い替えようか。
   6944 </div>
   6945 
   6946 <div class="farm-journal-item">
   6947 <div class="farm-journal-date">
   6948 <div class="luna">14日</div>
   6949 <time>2021-11-18</time>
   6950 </div>
   6951 曇後晴。昼過ぎまで曇りで寒かったが昼から晴れて暑い。麦の畝がだいたい形になったところに丁度麦の種が届いた。和歌山県農業公社に申請していた畑を借りるための申請が通りそうだと、JAの人から連絡が入った。晴れて農家である。畑の方に山東菜を蒔いた。作業が続いて筋肉の動きが鈍ってきた。疲れない動き方ができるようになりたい。
   6952 </div>
   6953 
   6954 <div class="farm-journal-item">
   6955 <div class="farm-journal-date">
   6956 <div class="luna">13日</div>
   6957 <time>2021-11-17</time>
   6958 </div>
   6959 快晴。朝は季節にふさわしく寒いが日差しが強く昼は暑い。出掛ける時、以前声を掛けてくれた92才のおじいちゃんとすれ違う。田圃に畝を作るために溝を掘った。この田圃を借りてから続けていた作業だがもう少しで終りそうだ。11月中旬が麦蒔ききの適期であり既に少し遅い。田圃の隣のおばちゃんが蜜柑をくれた。
   6960 </div>
   6961 ]]></description>
   6962 </item>
   6963 <item>
   6964 <title>畑を返すことになった。</title>
   6965 <link>https://www.mtkn.jp/journal/posts/20210806.html</link>
   6966 <guid>https://www.mtkn.jp/journal/posts/20210806.html</guid>
   6967 <pubDate>Fri,  6 Aug 2021 00:00:00 +0900</pubDate>
   6968 <description><![CDATA[<h1>畑を返すことになった。</h1>
   6969 <time>2021-08-06</time>
   6970 <h2>はじめに</h2>
   6971 <p>
   6972 昨年の秋実家の隣の畑を借り農業を始めることになった。以降好きな種を蒔いては世話をし、少しばかりの収穫をいただいてきた。夏になり冬野菜はどんなものを植えようかと考えていたところ、地主さんからある連絡があった。この秋に家を建てることになったので土地を返してほしいとのことだ。いい機会なので、この一年弱の間素人なりに試行錯誤してきたこと、考えてきたことを記録しておく。
   6973 </p>
   6974 
   6975 <h2>農業に対する基本的な考え</h2>
   6976 <h3>農業の目的</h3>
   6977 僕が農業をする目的は自給自足の生活をすることである。一度社会人としての道を歩もうとして精神を病んだ。世の中にあふれているほとんどの物に価値を見いだせなかった。にも関らず自分の時間をお金に変換している意味がわからなかった。自分の時間を使って自分にとって価値のあるものを生みだす。それをできるのが自給自足のための農業だと考えた。
   6978 <h3>農法</h3>
   6979 <p>
   6980 畑を借りる前から農法に関する情報は本やネット等で収集していた。そのなかでも目に付いたのが川口由一氏の自然農及び福岡正信氏の自然農法である。多少の違いはあるがどちらも無農薬、無肥料、不耕起という点で共通している。雑草や虫等を敵とせずそれらの活動によって土壌を豊かにし、その上で作物を育てるというものだ。この方法が自分に合っていると感じたので採用することにした。
   6981 </p>
   6982 <h3>種</h3>
   6983 <p>
   6984 また、育てる作物に関しては、高橋一也氏の「古来種野菜を食べてください。」に感銘を受け、可能な限り昔から栽培されてきたものを探すようにした。現在市場で流通している野菜は一代交配種と呼ばれるものが多い。一代交配種というのは、「生物において、ある異なった対立遺伝子をホモで持つ両親の交雑の結果生じた、第一世代目の子孫のこと」(<a href="https://ja.wikipedia.org/wiki/%E9%9B%91%E7%A8%AE%E7%AC%AC%E4%B8%80%E4%BB%A3">wikipedia</a>)であり、「その一世代に限って安定して一定の収量が得られる品種として知られ、多くの種苗会社が力を入れる分野となっている」(<a href="https://ja.wikipedia.org/wiki/%E9%9B%91%E7%A8%AE%E7%AC%AC%E4%B8%80%E4%BB%A3">同</a>)。一代交配種は収量、形質、味等がそろっているので市場競争力が高い。その一方で、一代交配種をかけあわせると、一代目ではかくれていた遺伝子が発現し、市場価値の高いものは収穫できない。このため、ひとたび一代交配種を育てはじめると、以降毎年のように種苗会社から種を購入することになる。
   6985 </p>
   6986 <p>
   6987 僕が目指したいのは自給的な農業である。作物の市場競争力はなくていいし、種苗会社に払い続けるお金もない。また一代交配種ばかり育てられると、全国どこでも同じ野菜しか手に入らなくなり食文化もあったものではない。それに対し古来種野菜は、地域ごとに代々受けつがれてきたもので、その土地にうまく適応しその場所の食文化の形成に深く関わってきたものである。僕の地元和歌山でも、湯浅で作られる金山寺味噌で使われている湯浅なすというものが残っている。関係ないがあみ清数見商店というところの金山寺味噌がおいしい。「発酵文化人類学」(小倉ヒラク)にのっていた太田久助吟製のものはいまいちだった。表示を見ると人口甘味料(確かステビア)が入っていた。
   6988 </p>
   6989 <p>
   6990 閑話休題。種は古来種を多数とり扱っている野口種苗研究所のものを購入するようにした。
   6991 </p>
   6992 
   6993 <h2>生ゴミの肥料</h2>
   6994 <p>
   6995 畑を借りてから、台所からでる植物性の生ゴミは全て畑の一角に捨てるようにした。胡瓜や人参のへた、南瓜のわたや種等である。捨てたゴミは少し土とまぜ、発酵させて二年目から畑の肥やしとして利用しようと考えてのことだ。冒頭で書いた無肥料と矛盾するがまあこれも試行錯誤のうちである。
   6996 </p>
   6997 <p>
   6998 春から夏にかけて気温が上がり、梅雨には雨も降り、微生物の活動が活発になる。始めは臭いが大丈夫か心配だったが、日中30度を越えるようになってもほとんど臭くない。1メートル以内に近づいて少し臭うが、臭いというほどではない。臭い臭いではない。一時コバエがたかっていたが、今は目立たなくなり、かわりにコオロギがうじゃうじゃしている。
   6999 </p>
   7000 <p>
   7001 春の終りごろに買ってきた南瓜のわたと種もここに捨てた。しばらくするとそこから南瓜の芽が大量に生え、梅雨があけるころにはたくさん花をつけた。近くの養蜂場からだと思うが、セイヨウミツバチがやってきて受粉してくれる。7月の終りごろにはおおきな実をつけた。収穫して煮物にしたがとてもおいしかった。捨てた種は一代交配種で、できたのはその子供なのでおいしくなる道理はないのだが。不思議である。
   7002 </p>
   7003 <p>
   7004 地主さんから土地の返還を打診されて畑に生ゴミを捨てるのはやめにした。ところが調理中にでるゴミの量は変化するわけでわない。野菜のうち食べない部分はすべてゴミ箱に捨てるようになった。畑を借りる前の状態に戻っただけである。ところが切った野菜のへたをゴミ箱に捨てるたびになんだか虚しくなる。畑に撒けばそこにまた植物が育ち収穫にも繋がる。ところがゴミ箱に捨ててしまうとなんにもならない。そればかりか、ゴミを集めてさらにそれを焼却しなければいけない。すべて税金である。ただ畑に捨てるだけでまた利用可能な形のエネルギーになるものを、税金を投入したうえで無にしているのだ。あまりにも勿体無い。しかも一般的な農家では、生ゴミを税金で回収してもらったうえで、肥料を購入してきて自分の畑に施すのだ。江戸時代なんかはさらに無駄がない。自分たちの排泄物まで畑に還元していたほどだ。
   7005 </p>
   7006 
   7007 <h2>育てた作物</h2>
   7008 <h3>玉葱</h3>
   7009 祖父の知り合いに苗をもらって植えた。確か初めて植えたのがこれである。土が固く肥沃度も低いためか玉が膨らまなかった。
   7010 <h3>小松菜</h3>
   7011 時期が悪かったのか、すぐにとう立ちしてしまった。
   7012 <h3>法蓮草</h3>
   7013 実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。
   7014 <h3>春菊</h3>
   7015 実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。
   7016 <h3>牛蒡</h3>
   7017 雑草を処理した場所と処理しない場所に分けて植えた。雑草の下でも元気そうに育っている。生育が遅いので土地を返却するまでに収穫できるか不明である。
   7018 <h3>じゃが芋</h3>
   7019 六月の雨でほとんど腐ってしまった。水はけが悪いのが原因だと思う。収穫できたものは小さかったが美味しかった。
   7020 <h3>葱</h3>
   7021 warmerwarmerというところで買ったセット野菜に入っていたものの根を切って植えた。葱坊主ができ、種を収穫できた。
   7022 <h3>胡瓜</h3>
   7023 地這いきゅうりを植えた。雑草がしげってもそれに巻きついて元気である。種の部分だけよく太っていびつな形に育った。肥沃度の問題か。味は普通にきゅうりである。
   7024 <h3>南瓜</h3>
   7025 上に書いた生ゴミとは別に日本南瓜を植えた。すぐに発芽したがそれ以降成長しない。花はひとつだけ目撃した記憶がある。
   7026 <h3>冬瓜</h3>
   7027 これもwarmerwarmerの野菜から種をとりだしたものである。かぼちゃと同様、発芽したが成長しない。
   7028 <h3>とうもろこし</h3>
   7029 雑草に負けずよく育った。ただ生育にばらつきがあり、うまく受粉できなかった。収穫できたものは歯抜けである。味はよかった。
   7030 <h3>いんげん</h3>
   7031 白金時菜豆と、つるありいんげんをうえた。白金時菜豆は収穫できたが成長が不十分で量が少ない。つるありいんげんは発芽しただけである。せっかく立てた支柱は虚しく、すずめの遊び場である。
   7032 <h3>伏見甘長唐辛子</h3>
   7033 発芽せず。
   7034 <h3>胡麻</h3>
   7035 発芽せず。
   7036 <h3>小豆</h3>
   7037 あまり大きくならないが、長い期間にわたり収穫できている。粒が小さい。
   7038 <h3>西瓜</h3>
   7039 発芽したが成長しない。
   7040 <h3>茄子</h3>
   7041 実験的に雑草を刈らずに蒔いた。イヌムギかノゲイヌムギか同定できていない草が茶色く枯れているところに蒔いた。日照か水の不足か。
   7042 <h3>大豆</h3>
   7043 よく育っている。顔を近づけると枝豆のにおいがして楽しい。
   7044 <h3>さつま芋</h3>
   7045 よく育っている。少なくとも地上部は。時期的に収穫まで漕ぎつけるか微妙なところ。
   7046 <h3>里芋</h3>
   7047 よく育っている。と思っていたが、近所の畑のものはもっと育っていることに最近気が付いた。肥料をやっていないのでこんなものだろうか。本葉がでてすぐのころ黒いいもむしに葉脈をのこして食い荒されたが、また葉が出てきて平気そうである。こちらも土地を返却するまでに収穫できるかわからない。
   7048 <h3>人参</h3>
   7049 最近蒔いて発芽したばかりである。好光性のため種を蒔いた上にかぶせる草を少なくしたが、少なすぎたようだ。土が乾燥ぎみで発芽率はいまいちである。
   7050 
   7051 <h2>おわりに</h2>
   7052 <p>
   7053 不耕起では一年目はあまりなにも育たない。土が固くて痩せているからである。三年目から突然変化が起こり、土が柔らかく肥沃になってくるという。その変化をこの畑で体感したかったのだがそれはかなわなかった。
   7054 </p>
   7055 <p>
   7056 この一年弱の短い期間にも、この土地の豊かさは格段にあがったように思う。土の上をコオロギやクモが行き交い、バッタやカエルが跳ね、チョウやトンボ、ハチが飛び回っている。土をいじればミミズやカタツムリ、アリがわんさかわいてくる。これらの虫を求めてスズメやセキレイ、イソヒヨなどの鳥が集まり、夜になればネコやイタチまで見かけるようになった。
   7057 </p>
   7058 <p>
   7059 ここに生きた生物たちはこれからコンクリートに埋められることになる。なんだか虚しい。
   7060 </p>
   7061 <p>
   7062 この一年弱の経験から、農業で生きていく自信が芽生えたように思う。そこにあるものを利用し、多くを求めなければいいのだ。この自信が確信にかわるにはもっと経験が必要だろうが。
   7063 </p>
   7064 <p>
   7065 畑を返したあとはすることがなくなってしまう。他の土地を探すのもひとつだし、別のことをするのもありかもしれない。いいご縁があればいいな。
   7066 </p>
   7067 ]]></description>
   7068 </item>
   7069 </channel>
   7070 </rss>