www.mtkn.jp

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

commit 08ceee3ea8780eba79af2a3331f5ac1c5337d7b3
parent b9b33a9f58286b4d2c2ec6856daf069a6f3ffb2e
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat, 28 Feb 2026 11:19:34 +0900

use Hugo

Diffstat:
A.gitignore | 2++
Aarchetypes/default.html | 5+++++
Dbin/journal_update | 9---------
Acontent/_index.html | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/about.html | 36++++++++++++++++++++++++++++++++++++
Acontent/books/978-4-06-288451-8.html | 15+++++++++++++++
Acontent/books/_index.html | 36++++++++++++++++++++++++++++++++++++
Acontent/computer/9p.html | 287+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/_index.html | 48++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/archlinux_installation.html | 308+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/git_server.html | 272+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rman/computer/images/openbsd_on_u9310e_1.jpg -> content/computer/images/openbsd_on_u9310e_1.jpg | 0
Rman/computer/images/openbsd_on_u9310e_2.jpg -> content/computer/images/openbsd_on_u9310e_2.jpg | 0
Acontent/computer/mailserver.html | 535+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/openbsd_on_u9310e.html | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/rp2040_1.html | 714+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/rp2040_2.html | 401+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/rp2040_3_interrupt.html | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/rtx1200-qos.html | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/setting_up_web_server.html | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rman/computer/videos/ex1.webm -> content/computer/videos/ex1.webm | 0
Rman/computer/videos/ex2.webm -> content/computer/videos/ex2.webm | 0
Rman/computer/videos/ex3.webm -> content/computer/videos/ex3.webm | 0
Rman/computer/videos/ex4.webm -> content/computer/videos/ex4.webm | 0
Rman/computer/videos/ex5.webm -> content/computer/videos/ex5.webm | 0
Rman/computer/videos/ex6.webm -> content/computer/videos/ex6.webm | 0
Acontent/computer/web_design/_index.html | 13+++++++++++++
Acontent/computer/web_design/hamburger-x.svg | 27+++++++++++++++++++++++++++
Acontent/computer/web_design/hamburger.svg | 32++++++++++++++++++++++++++++++++
Acontent/computer/web_design/navbar.html | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/web_design/style.css | 11+++++++++++
Acontent/computer/what-i-use.html | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/x11_32bit_window.html | 164+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground1.html | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground2.html | 206+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground3.html | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground4.html | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground5.html | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/computer/xlib_playground6.html | 201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/draft/9p_go.html | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/draft/_index.html | 5+++++
Acontent/draft/how_to_throw_away_smart_phone.html | 22++++++++++++++++++++++
Acontent/draft/keitai.html | 17+++++++++++++++++
Acontent/draft/life.html | 25+++++++++++++++++++++++++
Acontent/draft/light.html | 19+++++++++++++++++++
Acontent/draft/medical_care.html | 8++++++++
Acontent/draft/migration.html | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/draft/myrica_rubra.html | 15+++++++++++++++
Acontent/draft/openbsd_installation.html | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/draft/opinion.html | 12++++++++++++
Acontent/draft/relayd.html | 37+++++++++++++++++++++++++++++++++++++
Acontent/draft/safety_convenience.html | 24++++++++++++++++++++++++
Acontent/draft/vi.html | 30++++++++++++++++++++++++++++++
Acontent/draft/xlib2.html | 152+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/error/404.html | 6++++++
Acontent/farm/_index.html | 17+++++++++++++++++
Acontent/farm/journal/2021.html | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/farm/journal/2022.html | 192+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rman/farm/journal/pics/DSCF0249.JPG -> content/farm/journal/pics/DSCF0249.JPG | 0
Rman/farm/journal/pics/DSCF0252.JPG -> content/farm/journal/pics/DSCF0252.JPG | 0
Rman/farm/journal/pics/DSCF0255.JPG -> content/farm/journal/pics/DSCF0255.JPG | 0
Rman/farm/journal/pics/DSCF0257.JPG -> content/farm/journal/pics/DSCF0257.JPG | 0
Rman/farm/journal/pics/DSCF0258.JPG -> content/farm/journal/pics/DSCF0258.JPG | 0
Acontent/gallery/20231005.html | 8++++++++
Acontent/gallery/20231007.html | 8++++++++
Acontent/gallery/20231018.html | 8++++++++
Acontent/gallery/20231202.html | 8++++++++
Acontent/gallery/20240101.html | 8++++++++
Acontent/gallery/20240628.html | 8++++++++
Acontent/gallery/20240629.html | 8++++++++
Acontent/gallery/20240702.html | 8++++++++
Acontent/gallery/20240727.html | 8++++++++
Acontent/gallery/20250101.html | 8++++++++
Acontent/gallery/20250717.html | 8++++++++
Acontent/gallery/_index.html | 20++++++++++++++++++++
Rman/gallery/img/20231005-thumb.png -> content/gallery/img/20231005-thumb.png | 0
Rman/gallery/img/20231005.png -> content/gallery/img/20231005.png | 0
Rman/gallery/img/20231007-thumb.jpg -> content/gallery/img/20231007-thumb.jpg | 0
Rman/gallery/img/20231007.jpg -> content/gallery/img/20231007.jpg | 0
Rman/gallery/img/20231018-thumb.jpg -> content/gallery/img/20231018-thumb.jpg | 0
Rman/gallery/img/20231018.jpg -> content/gallery/img/20231018.jpg | 0
Rman/gallery/img/20231202-thumb.jpg -> content/gallery/img/20231202-thumb.jpg | 0
Rman/gallery/img/20231202.jpg -> content/gallery/img/20231202.jpg | 0
Rman/gallery/img/20240101-thumb.jpg -> content/gallery/img/20240101-thumb.jpg | 0
Rman/gallery/img/20240101.jpg -> content/gallery/img/20240101.jpg | 0
Rman/gallery/img/20240628-thumb.jpg -> content/gallery/img/20240628-thumb.jpg | 0
Rman/gallery/img/20240628.jpg -> content/gallery/img/20240628.jpg | 0
Rman/gallery/img/20240629-thumb.jpg -> content/gallery/img/20240629-thumb.jpg | 0
Rman/gallery/img/20240629.jpg -> content/gallery/img/20240629.jpg | 0
Rman/gallery/img/20240702-thumb.jpg -> content/gallery/img/20240702-thumb.jpg | 0
Rman/gallery/img/20240702.jpg -> content/gallery/img/20240702.jpg | 0
Rman/gallery/img/20240727-thumb.jpg -> content/gallery/img/20240727-thumb.jpg | 0
Rman/gallery/img/20240727.jpg -> content/gallery/img/20240727.jpg | 0
Rman/gallery/img/20250101-thumb.jpg -> content/gallery/img/20250101-thumb.jpg | 0
Rman/gallery/img/20250101.jpg -> content/gallery/img/20250101.jpg | 0
Rman/gallery/img/20250717-thumb.jpg -> content/gallery/img/20250717-thumb.jpg | 0
Rman/gallery/img/20250717.jpg -> content/gallery/img/20250717.jpg | 0
Acontent/journal/_index.html | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200719.html | 13+++++++++++++
Acontent/journal/posts/20200723.html | 31+++++++++++++++++++++++++++++++
Acontent/journal/posts/20200725.html | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200727.html | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200801.html | 32++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200802.html | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200804.html | 16++++++++++++++++
Acontent/journal/posts/20200808.html | 249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200917.html | 14++++++++++++++
Acontent/journal/posts/20200918.html | 39+++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200919.html | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20200925.html | 8++++++++
Acontent/journal/posts/20200926.html | 12++++++++++++
Acontent/journal/posts/20201003.html | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20201201.html | 20++++++++++++++++++++
Acontent/journal/posts/20201202.html | 16++++++++++++++++
Acontent/journal/posts/20201209.html | 19+++++++++++++++++++
Acontent/journal/posts/20201210.html | 23+++++++++++++++++++++++
Acontent/journal/posts/20210106.html | 44++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20210806.html | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20211129.html | 27+++++++++++++++++++++++++++
Acontent/journal/posts/20211214.html | 22++++++++++++++++++++++
Acontent/journal/posts/20220513.html | 24++++++++++++++++++++++++
Acontent/journal/posts/20220729.html | 8++++++++
Acontent/journal/posts/20220730.html | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20220813.html | 31+++++++++++++++++++++++++++++++
Acontent/journal/posts/20220814.html | 14++++++++++++++
Acontent/journal/posts/20221023.html | 38++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20221031.html | 10++++++++++
Acontent/journal/posts/20221228.html | 17+++++++++++++++++
Acontent/journal/posts/20230119.html | 12++++++++++++
Acontent/journal/posts/20230725.html | 20++++++++++++++++++++
Acontent/journal/posts/20230726.html | 11+++++++++++
Acontent/journal/posts/20230729.html | 26++++++++++++++++++++++++++
Acontent/journal/posts/20230802.html | 23+++++++++++++++++++++++
Rman/journal/posts/20230802.jpg -> content/journal/posts/20230802.jpg | 0
Acontent/journal/posts/20230803.html | 27+++++++++++++++++++++++++++
Acontent/journal/posts/20230810.html | 16++++++++++++++++
Acontent/journal/posts/20240428.html | 15+++++++++++++++
Rman/journal/posts/20241009-1.jpg -> content/journal/posts/20241009-1.jpg | 0
Rman/journal/posts/20241009-2.jpg -> content/journal/posts/20241009-2.jpg | 0
Rman/journal/posts/20241009-3.jpg -> content/journal/posts/20241009-3.jpg | 0
Rman/journal/posts/20241009-4.jpg -> content/journal/posts/20241009-4.jpg | 0
Rman/journal/posts/20241009-5.jpg -> content/journal/posts/20241009-5.jpg | 0
Acontent/journal/posts/20241009.html | 47+++++++++++++++++++++++++++++++++++++++++++++++
Rman/journal/posts/20241202-1.jpg -> content/journal/posts/20241202-1.jpg | 0
Rman/journal/posts/20241202-10.jpg -> content/journal/posts/20241202-10.jpg | 0
Rman/journal/posts/20241202-11.jpg -> content/journal/posts/20241202-11.jpg | 0
Rman/journal/posts/20241202-12.jpg -> content/journal/posts/20241202-12.jpg | 0
Rman/journal/posts/20241202-13.jpg -> content/journal/posts/20241202-13.jpg | 0
Rman/journal/posts/20241202-14.jpg -> content/journal/posts/20241202-14.jpg | 0
Rman/journal/posts/20241202-15.jpg -> content/journal/posts/20241202-15.jpg | 0
Rman/journal/posts/20241202-2.jpg -> content/journal/posts/20241202-2.jpg | 0
Rman/journal/posts/20241202-3.jpg -> content/journal/posts/20241202-3.jpg | 0
Rman/journal/posts/20241202-4.jpg -> content/journal/posts/20241202-4.jpg | 0
Rman/journal/posts/20241202-5.jpg -> content/journal/posts/20241202-5.jpg | 0
Rman/journal/posts/20241202-6.jpg -> content/journal/posts/20241202-6.jpg | 0
Rman/journal/posts/20241202-7.jpg -> content/journal/posts/20241202-7.jpg | 0
Rman/journal/posts/20241202-8.jpg -> content/journal/posts/20241202-8.jpg | 0
Rman/journal/posts/20241202-9.jpg -> content/journal/posts/20241202-9.jpg | 0
Acontent/journal/posts/20241202.html | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20241211.html | 13+++++++++++++
Rman/journal/posts/20241211.jpg -> content/journal/posts/20241211.jpg | 0
Rman/journal/posts/20250216-1.jpg -> content/journal/posts/20250216-1.jpg | 0
Rman/journal/posts/20250216-2.jpg -> content/journal/posts/20250216-2.jpg | 0
Acontent/journal/posts/20250216.html | 14++++++++++++++
Acontent/journal/posts/20250221.html | 22++++++++++++++++++++++
Rman/journal/posts/20250221.jpg -> content/journal/posts/20250221.jpg | 0
Rman/journal/posts/20250420-1.jpg -> content/journal/posts/20250420-1.jpg | 0
Rman/journal/posts/20250420-10.jpg -> content/journal/posts/20250420-10.jpg | 0
Rman/journal/posts/20250420-11.jpg -> content/journal/posts/20250420-11.jpg | 0
Rman/journal/posts/20250420-12.jpg -> content/journal/posts/20250420-12.jpg | 0
Rman/journal/posts/20250420-13.jpg -> content/journal/posts/20250420-13.jpg | 0
Rman/journal/posts/20250420-2.jpg -> content/journal/posts/20250420-2.jpg | 0
Rman/journal/posts/20250420-3.jpg -> content/journal/posts/20250420-3.jpg | 0
Rman/journal/posts/20250420-4.jpg -> content/journal/posts/20250420-4.jpg | 0
Rman/journal/posts/20250420-5.jpg -> content/journal/posts/20250420-5.jpg | 0
Rman/journal/posts/20250420-6.jpg -> content/journal/posts/20250420-6.jpg | 0
Rman/journal/posts/20250420-7.jpg -> content/journal/posts/20250420-7.jpg | 0
Rman/journal/posts/20250420-8.jpg -> content/journal/posts/20250420-8.jpg | 0
Rman/journal/posts/20250420-9.jpg -> content/journal/posts/20250420-9.jpg | 0
Acontent/journal/posts/20250420.html | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rman/journal/posts/20250519-1.jpg -> content/journal/posts/20250519-1.jpg | 0
Rman/journal/posts/20250519-2.jpg -> content/journal/posts/20250519-2.jpg | 0
Rman/journal/posts/20250519-3.jpg -> content/journal/posts/20250519-3.jpg | 0
Acontent/journal/posts/20250519.html | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/journal/posts/20251122.html | 20++++++++++++++++++++
Rman/journal/posts/20251122.mp4 -> content/journal/posts/20251122.mp4 | 0
Rman/journal/posts/7th_concert.jpeg -> content/journal/posts/7th_concert.jpeg | 0
Acontent/kitchen/_index.html | 18++++++++++++++++++
Rman/kitchen/pics/mapo_tofu.jpg -> content/kitchen/pics/mapo_tofu.jpg | 0
Rman/kitchen/pics/r4_osechi.jpg -> content/kitchen/pics/r4_osechi.jpg | 0
Rman/kitchen/pics/tonkotsu_ramen.jpg -> content/kitchen/pics/tonkotsu_ramen.jpg | 0
Acontent/kitchen/r4_osechi.html | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/kitchen/recipe/mapo_tofu.html | 48++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/kitchen/recipe/miso.html | 32++++++++++++++++++++++++++++++++
Acontent/kitchen/recipe/tonkotsu_ramen.html | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Rman/pics/favicon.ico -> content/pics/favicon.ico | 0
Rman/pics/icon.jpeg -> content/pics/icon.jpeg | 0
Rman/pics/xcoin.png -> content/pics/xcoin.png | 0
Rman/pics/xcoin_logo.png -> content/pics/xcoin_logo.png | 0
Acontent/plant/_index.html | 23+++++++++++++++++++++++
Rman/plant/pics/cardamine_occulta.png -> content/plant/pics/cardamine_occulta.png | 0
Rman/plant/pics/lamium_amplexicaule.png -> content/plant/pics/lamium_amplexicaule.png | 0
Rman/plant/pics/trigonotis_peduncularis.png -> content/plant/pics/trigonotis_peduncularis.png | 0
Acontent/poetry/_index.html | 19+++++++++++++++++++
Acontent/style.css | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ddata/conf | 11-----------
Ddata/weblog | 151------------------------------------------------------------------------------
Ahugo.toml | 14++++++++++++++
Alayouts/_partials/footer.html | 2++
Alayouts/_partials/head.html | 8++++++++
Alayouts/_partials/header.html | 11+++++++++++
Alayouts/baseof.html | 17+++++++++++++++++
Alayouts/computer/web_design/list.html | 19+++++++++++++++++++
Alayouts/computer/web_design/page.html | 5+++++
Alayouts/home.html | 3+++
Alayouts/page.html | 4++++
Alayouts/section.html | 4++++
Dman/about.html | 34----------------------------------
Dman/books/978-4-06-288451-8.html | 10----------
Dman/books/index.html | 31-------------------------------
Dman/computer/9p.html | 484-------------------------------------------------------------------------------
Dman/computer/archlinux_installation.html | 351-------------------------------------------------------------------------------
Dman/computer/git_server.html | 327-------------------------------------------------------------------------------
Dman/computer/index.html | 42------------------------------------------
Dman/computer/mailserver.html | 701-------------------------------------------------------------------------------
Dman/computer/openbsd_on_u9310e.html | 192-------------------------------------------------------------------------------
Dman/computer/rp2040_1.html | 937-------------------------------------------------------------------------------
Dman/computer/rp2040_2.html | 595-------------------------------------------------------------------------------
Dman/computer/rp2040_3_interrupt.html | 197-------------------------------------------------------------------------------
Dman/computer/rtx1200-qos.html | 113-------------------------------------------------------------------------------
Dman/computer/setting_up_web_server.html | 158-------------------------------------------------------------------------------
Dman/computer/what-i-use.html | 81-------------------------------------------------------------------------------
Dman/computer/x11_32bit_window.html | 178-------------------------------------------------------------------------------
Dman/computer/xlib_playground1.html | 158-------------------------------------------------------------------------------
Dman/computer/xlib_playground2.html | 229-------------------------------------------------------------------------------
Dman/computer/xlib_playground3.html | 177-------------------------------------------------------------------------------
Dman/computer/xlib_playground4.html | 163-------------------------------------------------------------------------------
Dman/computer/xlib_playground5.html | 116-------------------------------------------------------------------------------
Dman/computer/xlib_playground6.html | 209-------------------------------------------------------------------------------
Dman/draft/9p_go.html | 385-------------------------------------------------------------------------------
Dman/draft/how_to_throw_away_smart_phone.html | 17-----------------
Dman/draft/keitai.html | 12------------
Dman/draft/life.html | 60------------------------------------------------------------
Dman/draft/light.html | 14--------------
Dman/draft/medical_care.html | 3---
Dman/draft/migration.html | 64----------------------------------------------------------------
Dman/draft/myrica_rubra.html | 10----------
Dman/draft/openbsd_installation.html | 56--------------------------------------------------------
Dman/draft/opinion.html | 7-------
Dman/draft/relayd.html | 44--------------------------------------------
Dman/draft/safety_convenience.html | 29-----------------------------
Dman/draft/vi.html | 34----------------------------------
Dman/draft/xlib2.html | 169-------------------------------------------------------------------------------
Dman/error/404.html | 1-
Dman/error/moved.html | 2--
Dman/farm/index.html | 14--------------
Dman/farm/journal/2021.html | 145-------------------------------------------------------------------------------
Dman/farm/journal/2022.html | 187-------------------------------------------------------------------------------
Dman/gallery/20231005.html | 3---
Dman/gallery/20231007.html | 3---
Dman/gallery/20231018.html | 3---
Dman/gallery/20231202.html | 3---
Dman/gallery/20240101.html | 3---
Dman/gallery/20240628.html | 3---
Dman/gallery/20240629.html | 3---
Dman/gallery/20240702.html | 3---
Dman/gallery/20240727.html | 3---
Dman/gallery/20250101.html | 3---
Dman/gallery/20250717.html | 3---
Dman/gallery/index.html | 15---------------
Dman/index.html | 40----------------------------------------
Dman/journal/index.html | 49-------------------------------------------------
Dman/journal/posts/20200719.html | 8--------
Dman/journal/posts/20200723.html | 26--------------------------
Dman/journal/posts/20200725.html | 58----------------------------------------------------------
Dman/journal/posts/20200727.html | 46----------------------------------------------
Dman/journal/posts/20200801.html | 27---------------------------
Dman/journal/posts/20200802.html | 62--------------------------------------------------------------
Dman/journal/posts/20200804.html | 11-----------
Dman/journal/posts/20200808.html | 244-------------------------------------------------------------------------------
Dman/journal/posts/20200917.html | 9---------
Dman/journal/posts/20200918.html | 34----------------------------------
Dman/journal/posts/20200919.html | 58----------------------------------------------------------
Dman/journal/posts/20200925.html | 3---
Dman/journal/posts/20200926.html | 7-------
Dman/journal/posts/20201003.html | 117-------------------------------------------------------------------------------
Dman/journal/posts/20201201.html | 15---------------
Dman/journal/posts/20201202.html | 11-----------
Dman/journal/posts/20201209.html | 14--------------
Dman/journal/posts/20201210.html | 18------------------
Dman/journal/posts/20210106.html | 39---------------------------------------
Dman/journal/posts/20210806.html | 99-------------------------------------------------------------------------------
Dman/journal/posts/20211129.html | 22----------------------
Dman/journal/posts/20211214.html | 17-----------------
Dman/journal/posts/20220513.html | 19-------------------
Dman/journal/posts/20220729.html | 3---
Dman/journal/posts/20220730.html | 120-------------------------------------------------------------------------------
Dman/journal/posts/20220813.html | 25-------------------------
Dman/journal/posts/20220814.html | 9---------
Dman/journal/posts/20221023.html | 33---------------------------------
Dman/journal/posts/20221031.html | 5-----
Dman/journal/posts/20221228.html | 17-----------------
Dman/journal/posts/20230119.html | 14--------------
Dman/journal/posts/20230725.html | 37-------------------------------------
Dman/journal/posts/20230726.html | 16----------------
Dman/journal/posts/20230729.html | 52----------------------------------------------------
Dman/journal/posts/20230802.html | 41-----------------------------------------
Dman/journal/posts/20230803.html | 70----------------------------------------------------------------------
Dman/journal/posts/20230810.html | 29-----------------------------
Dman/journal/posts/20240428.html | 15---------------
Dman/journal/posts/20241009.html | 68--------------------------------------------------------------------
Dman/journal/posts/20241202.html | 71-----------------------------------------------------------------------
Dman/journal/posts/20241211.html | 9---------
Dman/journal/posts/20250216.html | 11-----------
Dman/journal/posts/20250221.html | 33---------------------------------
Dman/journal/posts/20250420.html | 173-------------------------------------------------------------------------------
Dman/journal/posts/20250519.html | 249-------------------------------------------------------------------------------
Dman/journal/posts/20251122.html | 18------------------
Dman/kitchen/index.html | 13-------------
Dman/kitchen/r4_osechi.html | 121-------------------------------------------------------------------------------
Dman/kitchen/recipe/mapo_tofu.html | 47-----------------------------------------------
Dman/kitchen/recipe/miso.html | 31-------------------------------
Dman/kitchen/recipe/tonkotsu_ramen.html | 48------------------------------------------------
Dman/plant/index.html | 18------------------
Dman/poetry/index.html | 14--------------
Dman/style.css | 129-------------------------------------------------------------------------------
Dpub/about.html | 65-----------------------------------------------------------------
Dpub/books/978-4-06-288451-8.html | 44--------------------------------------------
Dpub/books/index.html | 65-----------------------------------------------------------------
Dpub/computer/9p.html | 316-------------------------------------------------------------------------------
Dpub/computer/archlinux_installation.html | 337-------------------------------------------------------------------------------
Dpub/computer/git_server.html | 301-------------------------------------------------------------------------------
Dpub/computer/images/openbsd_on_u9310e_1.jpg | 0
Dpub/computer/images/openbsd_on_u9310e_2.jpg | 0
Dpub/computer/index.html | 76----------------------------------------------------------------------------
Dpub/computer/mailserver.html | 564-------------------------------------------------------------------------------
Dpub/computer/openbsd_on_u9310e.html | 179-------------------------------------------------------------------------------
Dpub/computer/rp2040_1.html | 743-------------------------------------------------------------------------------
Dpub/computer/rp2040_2.html | 430-------------------------------------------------------------------------------
Dpub/computer/rp2040_3_interrupt.html | 189-------------------------------------------------------------------------------
Dpub/computer/rtx1200-qos.html | 147-------------------------------------------------------------------------------
Dpub/computer/setting_up_web_server.html | 192-------------------------------------------------------------------------------
Dpub/computer/videos/ex1.webm | 0
Dpub/computer/videos/ex2.webm | 0
Dpub/computer/videos/ex3.webm | 0
Dpub/computer/videos/ex4.webm | 0
Dpub/computer/videos/ex5.webm | 0
Dpub/computer/videos/ex6.webm | 0
Dpub/computer/what-i-use.html | 100-------------------------------------------------------------------------------
Dpub/computer/x11_32bit_window.html | 193-------------------------------------------------------------------------------
Dpub/computer/xlib_playground1.html | 174-------------------------------------------------------------------------------
Dpub/computer/xlib_playground2.html | 235-------------------------------------------------------------------------------
Dpub/computer/xlib_playground3.html | 198-------------------------------------------------------------------------------
Dpub/computer/xlib_playground4.html | 177-------------------------------------------------------------------------------
Dpub/computer/xlib_playground5.html | 144-------------------------------------------------------------------------------
Dpub/computer/xlib_playground6.html | 230-------------------------------------------------------------------------------
Dpub/draft/9p_go.html | 335-------------------------------------------------------------------------------
Dpub/draft/how_to_throw_away_smart_phone.html | 51---------------------------------------------------
Dpub/draft/keitai.html | 46----------------------------------------------
Dpub/draft/life.html | 54------------------------------------------------------
Dpub/draft/light.html | 48------------------------------------------------
Dpub/draft/medical_care.html | 37-------------------------------------
Dpub/draft/migration.html | 98-------------------------------------------------------------------------------
Dpub/draft/myrica_rubra.html | 44--------------------------------------------
Dpub/draft/openbsd_installation.html | 90-------------------------------------------------------------------------------
Dpub/draft/opinion.html | 41-----------------------------------------
Dpub/draft/relayd.html | 66------------------------------------------------------------------
Dpub/draft/safety_convenience.html | 53-----------------------------------------------------
Dpub/draft/vi.html | 59-----------------------------------------------------------
Dpub/draft/xlib2.html | 181-------------------------------------------------------------------------------
Dpub/error/404.html | 35-----------------------------------
Dpub/error/moved.html | 36------------------------------------
Dpub/farm/index.html | 46----------------------------------------------
Dpub/farm/journal/2021.html | 179-------------------------------------------------------------------------------
Dpub/farm/journal/2022.html | 221-------------------------------------------------------------------------------
Dpub/farm/journal/pics/DSCF0249.JPG | 0
Dpub/farm/journal/pics/DSCF0252.JPG | 0
Dpub/farm/journal/pics/DSCF0255.JPG | 0
Dpub/farm/journal/pics/DSCF0257.JPG | 0
Dpub/farm/journal/pics/DSCF0258.JPG | 0
Dpub/gallery/20231005.html | 37-------------------------------------
Dpub/gallery/20231007.html | 37-------------------------------------
Dpub/gallery/20231018.html | 37-------------------------------------
Dpub/gallery/20231202.html | 37-------------------------------------
Dpub/gallery/20240101.html | 37-------------------------------------
Dpub/gallery/20240628.html | 37-------------------------------------
Dpub/gallery/20240629.html | 37-------------------------------------
Dpub/gallery/20240702.html | 37-------------------------------------
Dpub/gallery/20240727.html | 37-------------------------------------
Dpub/gallery/20250101.html | 37-------------------------------------
Dpub/gallery/20250717.html | 37-------------------------------------
Dpub/gallery/img/20231005-thumb.png | 0
Dpub/gallery/img/20231005.png | 0
Dpub/gallery/img/20231007-thumb.jpg | 0
Dpub/gallery/img/20231007.jpg | 0
Dpub/gallery/img/20231018-thumb.jpg | 0
Dpub/gallery/img/20231018.jpg | 0
Dpub/gallery/img/20231202-thumb.jpg | 0
Dpub/gallery/img/20231202.jpg | 0
Dpub/gallery/img/20240101-thumb.jpg | 0
Dpub/gallery/img/20240101.jpg | 0
Dpub/gallery/img/20240628-thumb.jpg | 0
Dpub/gallery/img/20240628.jpg | 0
Dpub/gallery/img/20240629-thumb.jpg | 0
Dpub/gallery/img/20240629.jpg | 0
Dpub/gallery/img/20240702-thumb.jpg | 0
Dpub/gallery/img/20240702.jpg | 0
Dpub/gallery/img/20240727-thumb.jpg | 0
Dpub/gallery/img/20240727.jpg | 0
Dpub/gallery/img/20250101-thumb.jpg | 0
Dpub/gallery/img/20250101.jpg | 0
Dpub/gallery/img/20250717-thumb.jpg | 0
Dpub/gallery/img/20250717.jpg | 0
Dpub/gallery/index.html | 49-------------------------------------------------
Dpub/index.html | 74--------------------------------------------------------------------------
Dpub/journal/index.html | 83-------------------------------------------------------------------------------
Dpub/journal/posts/20200719.html | 42------------------------------------------
Dpub/journal/posts/20200723.html | 60------------------------------------------------------------
Dpub/journal/posts/20200725.html | 92-------------------------------------------------------------------------------
Dpub/journal/posts/20200727.html | 80-------------------------------------------------------------------------------
Dpub/journal/posts/20200801.html | 61-------------------------------------------------------------
Dpub/journal/posts/20200802.html | 96-------------------------------------------------------------------------------
Dpub/journal/posts/20200804.html | 45---------------------------------------------
Dpub/journal/posts/20200808.html | 278-------------------------------------------------------------------------------
Dpub/journal/posts/20200917.html | 43-------------------------------------------
Dpub/journal/posts/20200918.html | 68--------------------------------------------------------------------
Dpub/journal/posts/20200919.html | 92-------------------------------------------------------------------------------
Dpub/journal/posts/20200925.html | 37-------------------------------------
Dpub/journal/posts/20200926.html | 41-----------------------------------------
Dpub/journal/posts/20201003.html | 151------------------------------------------------------------------------------
Dpub/journal/posts/20201201.html | 49-------------------------------------------------
Dpub/journal/posts/20201202.html | 45---------------------------------------------
Dpub/journal/posts/20201209.html | 48------------------------------------------------
Dpub/journal/posts/20201210.html | 52----------------------------------------------------
Dpub/journal/posts/20210106.html | 73-------------------------------------------------------------------------
Dpub/journal/posts/20210806.html | 133-------------------------------------------------------------------------------
Dpub/journal/posts/20211129.html | 56--------------------------------------------------------
Dpub/journal/posts/20211214.html | 51---------------------------------------------------
Dpub/journal/posts/20220513.html | 53-----------------------------------------------------
Dpub/journal/posts/20220729.html | 37-------------------------------------
Dpub/journal/posts/20220730.html | 154-------------------------------------------------------------------------------
Dpub/journal/posts/20220813.html | 59-----------------------------------------------------------
Dpub/journal/posts/20220814.html | 43-------------------------------------------
Dpub/journal/posts/20221023.html | 67-------------------------------------------------------------------
Dpub/journal/posts/20221031.html | 39---------------------------------------
Dpub/journal/posts/20221228.html | 45---------------------------------------------
Dpub/journal/posts/20230119.html | 41-----------------------------------------
Dpub/journal/posts/20230725.html | 49-------------------------------------------------
Dpub/journal/posts/20230726.html | 40----------------------------------------
Dpub/journal/posts/20230729.html | 55-------------------------------------------------------
Dpub/journal/posts/20230802.html | 52----------------------------------------------------
Dpub/journal/posts/20230802.jpg | 0
Dpub/journal/posts/20230803.html | 56--------------------------------------------------------
Dpub/journal/posts/20230810.html | 45---------------------------------------------
Dpub/journal/posts/20240428.html | 44--------------------------------------------
Dpub/journal/posts/20241009-1.jpg | 0
Dpub/journal/posts/20241009-2.jpg | 0
Dpub/journal/posts/20241009-3.jpg | 0
Dpub/journal/posts/20241009-4.jpg | 0
Dpub/journal/posts/20241009-5.jpg | 0
Dpub/journal/posts/20241009.html | 77-----------------------------------------------------------------------------
Dpub/journal/posts/20241202-1.jpg | 0
Dpub/journal/posts/20241202-10.jpg | 0
Dpub/journal/posts/20241202-11.jpg | 0
Dpub/journal/posts/20241202-12.jpg | 0
Dpub/journal/posts/20241202-13.jpg | 0
Dpub/journal/posts/20241202-14.jpg | 0
Dpub/journal/posts/20241202-15.jpg | 0
Dpub/journal/posts/20241202-2.jpg | 0
Dpub/journal/posts/20241202-3.jpg | 0
Dpub/journal/posts/20241202-4.jpg | 0
Dpub/journal/posts/20241202-5.jpg | 0
Dpub/journal/posts/20241202-6.jpg | 0
Dpub/journal/posts/20241202-7.jpg | 0
Dpub/journal/posts/20241202-8.jpg | 0
Dpub/journal/posts/20241202-9.jpg | 0
Dpub/journal/posts/20241202.html | 86-------------------------------------------------------------------------------
Dpub/journal/posts/20241211.html | 42------------------------------------------
Dpub/journal/posts/20241211.jpg | 0
Dpub/journal/posts/20250216-1.jpg | 0
Dpub/journal/posts/20250216-2.jpg | 0
Dpub/journal/posts/20250216.html | 43-------------------------------------------
Dpub/journal/posts/20250221.html | 51---------------------------------------------------
Dpub/journal/posts/20250221.jpg | 0
Dpub/journal/posts/20250420-1.jpg | 0
Dpub/journal/posts/20250420-10.jpg | 0
Dpub/journal/posts/20250420-11.jpg | 0
Dpub/journal/posts/20250420-12.jpg | 0
Dpub/journal/posts/20250420-13.jpg | 0
Dpub/journal/posts/20250420-2.jpg | 0
Dpub/journal/posts/20250420-3.jpg | 0
Dpub/journal/posts/20250420-4.jpg | 0
Dpub/journal/posts/20250420-5.jpg | 0
Dpub/journal/posts/20250420-6.jpg | 0
Dpub/journal/posts/20250420-7.jpg | 0
Dpub/journal/posts/20250420-8.jpg | 0
Dpub/journal/posts/20250420-9.jpg | 0
Dpub/journal/posts/20250420.html | 124-------------------------------------------------------------------------------
Dpub/journal/posts/20250519-1.jpg | 0
Dpub/journal/posts/20250519-2.jpg | 0
Dpub/journal/posts/20250519-3.jpg | 0
Dpub/journal/posts/20250519.html | 120-------------------------------------------------------------------------------
Dpub/journal/posts/20251122.html | 49-------------------------------------------------
Dpub/journal/posts/20251122.mp4 | 0
Dpub/journal/posts/7th_concert.jpeg | 0
Dpub/kitchen/index.html | 47-----------------------------------------------
Dpub/kitchen/pics/mapo_tofu.jpg | 0
Dpub/kitchen/pics/r4_osechi.jpg | 0
Dpub/kitchen/pics/tonkotsu_ramen.jpg | 0
Dpub/kitchen/r4_osechi.html | 155-------------------------------------------------------------------------------
Dpub/kitchen/recipe/mapo_tofu.html | 77-----------------------------------------------------------------------------
Dpub/kitchen/recipe/miso.html | 61-------------------------------------------------------------
Dpub/kitchen/recipe/tonkotsu_ramen.html | 82-------------------------------------------------------------------------------
Dpub/pics/favicon.ico | 0
Dpub/pics/icon.jpeg | 0
Dpub/pics/xcoin.png | 0
Dpub/pics/xcoin_logo.png | 0
Dpub/plant/index.html | 52----------------------------------------------------
Dpub/plant/pics/cardamine_occulta.png | 0
Dpub/plant/pics/lamium_amplexicaule.png | 0
Dpub/plant/pics/trigonotis_peduncularis.png | 0
Dpub/poetry/index.html | 48------------------------------------------------
Dpub/rss.xml | 7070-------------------------------------------------------------------------------
Dpub/sitemap.xml | 95-------------------------------------------------------------------------------
Dpub/style.css | 129-------------------------------------------------------------------------------
Dtemp/footer.html | 9---------
Dtemp/header.html | 25-------------------------
527 files changed, 8413 insertions(+), 27993 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,2 @@ +public +.hugo_build.lock diff --git a/archetypes/default.html b/archetypes/default.html @@ -0,0 +1,5 @@ ++++ +date = '{{ .Date }}' +draft = true +title = '{{ replace .File.ContentBaseName "-" " " | title }}' ++++ diff --git a/bin/journal_update b/bin/journal_update @@ -1,9 +0,0 @@ -#!/bin/sh -cd $(dirname $0)/.. -man=$(pwd)/man -pub=$(pwd)/pub -tmp=$(pwd)/.tmp - -#journal index -grep "\<h1\>" $man/journal/posts/*.html | sort -r | sed 's/^.*journal\///;s/:<h1>/ /;s/<\/h1>//' | -awk '{print $1,$1,$2}' | sed 's/^[^ 0-9]*\([0-9]*\)[^ ]*/\1/' | awk 'BEGIN{print "<h1>日記</h1><ul>"}END{print "</ul>"}{printf "<li>[%s]<a href=\"%s\">%s</a></li>\n",$1,$2,$3}' > $man/journal/index.html diff --git a/content/_index.html b/content/_index.html @@ -0,0 +1,46 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '松露庵' ++++ + +<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> + +<p> +学問を志して挫折し、就職して適応障害になり、社会のしがらみから離れて田舎でのんびり暮らしています。 +</p> + +<h2>更新履歴</h2> +<a href="/rss.xml">RSS</a> +<ul> +<li>2026-02-27 <a href="/computer/web_design">ウェブデザイン</a></li> +<li>2025-12-20 <a href="/computer/x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> +<li>2025-11-22 <a href="/journal/posts/20251122.html">ひさしぶりに合気道した</a></li> +<li>2025-08-27 <a href="/computer/rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> +<li>2025-07-17 <a href="/gallery/20250717.html">自画像</a></li> +<li>2025-05-19 <a href="/journal/posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> +<li>2025-04-28 <a href="/computer/openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> +<li>2025-04-20 <a href="/journal/posts/20250420.html">大阪万博行った</a></li> +<li>2025-03-29 <a href="/plant">タネツケバナ咲いてた</a></li> +<li>2025-02-21 <a href="/journal/posts/20250221.html">着物作った</a></li> +<li>2025-02-16 <a href="/journal/posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> +<li>2025-01-01 <a href="/gallery/20250101.html">年賀状</a></li> +<li>2024-12-19 <a href="/computer/9p.html">9P</a></li> +<li>2024-12-11 <a href="/journal/posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> +<li>2024-12-02 <a href="/journal/posts/20241202.html">椅子作った</a></li> +<li>2024-10-10 <a href="/kitchen/recipe/mapo_tofu.html">麻婆豆腐</a></li> +<li>2024-10-09 <a href="/journal/posts/20241009.html">棚作った</a></li> +<li>2024-07-30 <a href="/gallery/index.html">絵を追加した</a></li> +<li>2024-04-28 <a href="/journal/posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> +<li>2024-02-22 <a href="/computer/rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> +<li>2024-02-15 <a href="/computer/git_server.html">Gitサーバーの設定 on OpenBSD</a></li> +<li>2024-02-09 <a href="/kitchen/recipe/miso.html">味噌</a></li> +<li>2024-01-19 <a href="/computer/mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> +<li>2024-01-11 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li> +<li>2024-01-01 <a href="/gallery/20240101.html">年賀状</a></li> +<li>2023-12-02 <a href="/gallery/index.html">絵を追加した</a></li> +<li>2023-10-24 <a href="/gallery/index.html">絵を追加した</a></li> +<li>2023-10-07 <a href="/gallery/20231007.html">絵を描いた</a></li> +<li>2023-08-10 <a href="/journal/posts/20230810.html">イソヒヨ</a></li> +</ul> + diff --git a/content/about.html b/content/about.html @@ -0,0 +1,36 @@ ++++ +date = '2022-07-28T00:00:00+09:00' +draft = false +title = '自己紹介' ++++ +<time>2022-07-28</time> + +<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> + +<ul> + <li>名前: 松田 健嗣</li> + <li>性別: 男</li> + <li>年齢: 20代</li> + <li>出身: 和歌山</li> +</ul> + +<p> +高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。 +</p> +<p> +勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。 +</p> +<p> +在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。 +</p> +<p> +ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。 +</p> +<p> +このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。 +</p> + +<h2>著作権について</h2> +<p> +このウェブサイト上のコンテンツは、特に断りのない限り<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>で公開します。</p> + diff --git a/content/books/978-4-06-288451-8.html b/content/books/978-4-06-288451-8.html @@ -0,0 +1,15 @@ ++++ +date = '2022-11-23T00:00:00+09:00' +draft = false +title = '不死身の特攻兵' ++++ +<div class="author">鴻上尚史 著</div> +<time>2022-11-23</time> +<p>大東亜戦争において何度も特攻を命じられるも生還した佐々木友次という人の話。ベテランのパイロットだったために陸軍の特攻第一号に選ばれ、死んでこいと言われたが爆弾を落して帰ってきた人である。それも何度も。</p> +<p>第一章は著者が佐々木氏を知ったいきさつ。第二章は佐々木氏の伝記。第三章は著者の佐々木氏へのインタビュー。第四章は著者による戦争や特攻に関する考察。</p> +<p>第一章は導入である。</p> +<p>第二章は物語として面白かった。戦争や特攻といった理不尽なものに対して自分の信念を貫いた佐々木氏の生き方や考え方が痛快である。</p> +<p>第三章のインタビューでは佐々木氏が繰り返し口にした寿命という言葉が印象的だった。人間は寿命がくれば死に、それまでは生きる、というものである。たとえ戦死であろうともそれがその人の寿命であるとの認識であるようだ。この考えにはとても共感できる。</p> +<p>第四章はかなり客観的に書かれているように思う。その上で著者自身の考えを述べているので読みやすかった。しかし読み進めるにつれてだんだんともやもやが溜っていった。当時の日本を支配していた空気があまりにも重苦しい。しかもその空気は、現在の日本にあるものとほとんど同じであると感じた。ここ最近僕が感じているこの国の暗い部分は大東亜戦争のころからなにも変らずに受け継がれているようである。せっかく無様に負けたのに本当の意味での反省を一切していないためか、なにも変っていない。余りにも勿体無く、戦没者にも失礼である。</p> +<p>もっと歴史を勉強し、今の生き方に反映しなければと考えさせてくれる本だった。</p> + diff --git a/content/books/_index.html b/content/books/_index.html @@ -0,0 +1,36 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '本棚' ++++ +<table> +<tr><th>題名</th><th>著者</th></tr> +<tr><td>敗者の戦後: ナポレオン・ヒトラー・昭和天皇</td><td>入江隆則</td></tr> +<tr><td>生きる意味を問う</td><td>三島由紀夫</td></tr> +<tr><td>満州国建国は正当である</td><td>ジョージ・ブロンソン・レー</td></tr> +<tr><td>植物一日一題</td><td>牧野富太郎</td></tr> +<tr><td>自然農の米づくり</td><td>川口由一、大植久美、吉村優男</td></tr> +<tr><td>自然農の野菜づくり</td><td>川口由一、高橋浩昭</td></tr> +<tr><td>自然農の果物づくり</td><td>川口由一、三井和夫、勇葱浩生、延命寺鋭雄、柴田幸子</td></tr> +<tr><td>日本その日その日</td><td>エドワード・S・モース</td></tr> +<tr><td>明治大正史 世相編</td><td>柳田國男</td></tr> +<tr><td>渡部昇一の昭和史(正)</td><td>渡部昇一</td></tr> +<tr><td>戦中派の死生観</td><td>吉田満</td></tr> +<tr><td>明治大帝</td><td>飛鳥井雅道</td></tr> +<tr><td>遠野物語</td><td>柳田國男</td></tr> +<tr><td><a href=978-4-06-288451-8.html>不死身の特攻兵</a></td><td>鴻上尚史</td></tr> +<tr><td>The Design and Implementation of the 4.4BSD Operating System</td><td>Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John S. Quarterman</td></tr> +<tr><td>The Go Programming Language</td><td>Alan A. A. Donovan, Brian W. Kernighan</td></tr> +<tr><td>The C Programming Language</td><td>Dennis M. Ritchie, Brian W. Kernighan</td></tr> +<tr><td>The Practice of Programming</td><td>Brian W. Kernighan, Rob Pike</td></tr> +<tr><td>The Unix Programming Environment</td><td>Brian W. Kernighan, Rob Pike</td></tr> +<tr><td>Computer Organization and Design RISC-V Edition</td><td>David A. Patterson, John L. Hennessy</td></tr> +<tr><td>Communicating Sequential Processes</td><td>C. A. R. Hoare</td></tr> +<tr><td>The Awk Programming Language</td><td>Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger</td></tr> +<tr><td>Operating Systems Design and Implementation Third Edition</td><td>Andrew S. Tanenbaum, Albert S. Woodhull</td></tr> +<tr><td>モルフォ人体デッサン</td><td>ミシェル・ローリセラ</td></tr> +<tr><td>ポーズの美術解剖学</td><td>加藤公太</td></tr> +<tr><td>意拳学 中国功夫の精髄</td><td>韓星橋</td></tr> +<tr><td>楽典</td><td>石桁真礼生, 末吉保雄, 丸田昭三, 飯田隆, 金光威和雄, 飯沼信義</td></tr> +</table> + diff --git a/content/computer/9p.html b/content/computer/9p.html @@ -0,0 +1,287 @@ ++++ +date = '2024-12-19T00:00:00+09:00' +draft = false +title = '9P' ++++ +<time>2024-12-19</time> +<h2>はじめに</h2> +<p> +9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。このプロトコルを使えば、ディスクに記録されたデータだけでなく、マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等もファイルとして扱える。Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOSのために設計された。 +</p> + +<p> +Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計されているので、この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。</p> + +<h2>プロトコルの概要</h2> +<p> +9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに対してリプライを返すことを繰り返す。クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと言う。Tメッセージにはファイルにアクセスするための色々なものが用意されている。例えばファイルを開くためのTopenや、開いたファイルに書き込むためのTwrite等である。それぞれのTメッセージには対応するRメッセージがある。Topenに対してRopen、Twriteに対してRwrite等である。</p> +<p> +通信は必要な情報をプロトコルの定める方法でバイト列に変換して行う。2バイト以上のデータはリトルエンディアンになるように配置する。テキストデータはUTF-8にエンコードする。テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。</p> +<p> +各メッセージは4バイトの整数から始まる。これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。次にメッセージの種類を記述する1バイトのデータが来る。次はメッセージのタグである。クライアントはサーバーからの返事を待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージに対する返事なのかを識別する必要がある。そのために使うのがタグである。クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに同じタグを付ける。その後ろには、メッセージの種類によって固有の情報が付けられる。</p> +<p> +以下は実際の9P通信のログである。実際はバイナリの通信だが、ログとして見易いように変換してある。また、先頭にくるメッセージサイズは省略してある。この例では、サーバーのルートディレクトリにある<code>hello</code>というファイルの内容を読みこんでいる:</p> +<pre><code>&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' +--&gt; Rversion Tag 65535 msize 8192 version '9P2000' +&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname +--&gt; Rattach Tag 0 qid (0000000000000000 0 d) +&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello +--&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) +&lt;-- Tstat Tag 0 fid 1 +--&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 +&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 +--&gt; Rwalk Tag 0 nwqid 0 +&lt;-- Topen Tag 0 fid 2 mode 0x0 +--&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 +&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 +--&gt; Rread Tag 0 count 7 ' 776f726c 64210a' +&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 +--&gt; Rread Tag 0 count 0 '' +&lt;-- Tclunk Tag 0 fid 2 +--&gt; Rclunk Tag 0 +</code></pre> +<p> +まず最初にクライアントがサーバーに対してTversionを送り、プロトコルのバージョンと、メッセージの最大サイズを交渉する。Tversionのタグは<code>65535</code>と決められている。<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、<code>version</code>の9P2000がプロトコルのバージョンである。サーバーからRversionで同じ<code>msize</code>と<code>version</code>が返ってきたのでこのサイズとバージョンで以降の通信を行う。</p> +<p> +次のTattachで、クライアントがサーバーにルートディレクトリの<code>fid</code>を要求する。<code>afid</code>以降は認証用の情報である(後述)。<code>fid</code>はコネクションにおいてファイルと紐付けられる整数で、Unixにおけるファイルディスクリプタのようなものである。ファイルの読み書きはこの<code>fid</code>を使って行われる。サーバーからのRattachにはルートディレクトリの<code>qid</code>が含まれる。これはサーバー上でファイルを一意に識別するもので、Unixにおけるinodeに相当するものである。以上でサーバーに繋いでセッションを確立できた。</p> +<p> +次にTwalkで目的のファイル(<code>hello</code>)までファイルツリーを辿る。ここでは起点として先程得られたルートディレクトリ(<code>fid = 1</code>)を起点として、このディレクトリ内の<code>hello</code>ファイルを要求して<code>fid = 2</code>を割り当てようとしている。サーバーはルートディレクトリ内に要求されたファイルが見付かったので、そのファイルの<code>qid</code>を返す。</p> +<p> +目的のファイルに<code>fid</code>が割り当てられたので、Tstatでこのファイルの属性を要求している。おそらくファイルのパーミッションを調べるためである。</p> +<p> +次にTopenを使ってこのファイルを開き、Treadを使って内容を読む。二回目のTreadに対して0バイトのデータが返ってきたので、ファイルはこれで終りである。</p> +<p> +最後に、必要なくなった<code>fid</code>はTclunkで捨てる。</p> + +<h2>List of all Message Types</h2> + +<table> +<tr> +<th>Tメッセージ</th> +<th>Rメッセージ</th> +<th>説明</th> +</tr> +<tr> +<td>Tversion</td> +<td>Rversion</td> +<td>バージョンの交渉</td> +</tr> +<tr> +<td>Tauth</td> +<td>Rauth</td> +<td>認証ファイルの取得</td> +</tr> +<tr> +<td></td> +<td>Rerror</td> +<td>エラー(Rメッセージのみ)</td> +</tr> +<tr> +<td>Tflush</td> +<td>Rflush</td> +<td>処理中のリクエストをキャンセル</td> +</tr> +<tr> +<td>Tattach</td> +<td>Rattach</td> +<td>ルートディレクトリの取得</td> +</tr> +<tr> +<td>Twalk</td> +<td>Rwalk</td> +<td>ファイルツリーを辿る</td> +</tr> +<tr> +<td>Topen</td> +<td>Ropen</td> +<td>ファイルを開く</td> +</tr> +<tr> +<td>Tcreate</td> +<td>Rcreate</td> +<td>ファイルの作成</td> +</tr> +<tr> +<td>Tread</td> +<td>Rread</td> +<td>ファイルを読む</td> +</tr> +<tr> +<td>Twrite</td> +<td>Rwrite</td> +<td>ファイルへ書き込む</td> +</tr> +<tr> +<td>Tclunk</td> +<td>Rclunk</td> +<td>fidの削除</td> +</tr> +<tr> +<td>Tremove</td> +<td>Rremove</td> +<td>ファイルを削除</td> +</tr> +<tr> +<td>Tstat</td> +<td>Rstat</td> +<td>ファイルの属性を取得</td> +</tr> +<tr> +<td>Twstat</td> +<td>Rwstat</td> +<td>ファイルの属性を変更</td> +</tr> +</table> + +<h2><code>fid</code>と<code>qid</code></h2> +<p> +<code>fid</code>はコネクションにおいてファイルを指定するために使われる整数で、Unixのファイルディスクリプタのようなものである。使用する整数はクライアントが指定できる。サーバーに接続する際にTattachにより、サーバーのルートディレクトリの<code>fid</code>が設定され、Twalkにより追加され、Tclunkにより削除される。</p> +<p> +<code>qid</code>はサーバーがファイルを一意に識別するためのもので、Unixのinodeに相当するものである。ただしinodeはファイルが削除されると再利用される可能性があるのに対し、<code>qid</code>は再利用できない。<code>qid</code>はこのファイルがディレクトリかどうか等を示す<code>type</code>、ファイルが変更されたときにインクリメントされる<code>vers</code>、そしてファイルを一意に表す<code>path</code>の3つの情報で構成される。</p> +<h2>認証</h2> +<p> +9Pにはクライアントの認証が組込まれていない。もともとはあったようだが、認証のアルゴリズムに欠陥が見付かったりすればいちいちコードを修正してコンパイルしなおさなければいけないうえ、9Pプロトコル自体も変更しないといけないので、外部に切りだすことになった。認証に必要なやりとりは認証サーバーとクライアントが行い、9Pサーバーは認証が成功したかどうかの情報を認証サーバーに確認することでクライアントの確認を行う。 +</p> +<p> +9PサーバーはTattachメッセージを受けとると、認証サーバーとのコネクションを確立する。その後Rattachメッセージで<code>afid</code>という特殊な<code>fid</code>をクライアントに返す。クライアントからこの<code>afid</code>に対して読み書きする命令が届くと、9Pサーバーはこの読み書きを認証サーバーとのコネクションに横流しする。つまりクライアントはこの<code>afid</code>を通じて認証サーバーと直接やりとりができる。クライアントはユーザー名やパスワード等(パスワード認証の場合)の情報を<code>afid</code>に書き込んで認証する。このように認証をプロトコル自体から切り離すことで、認証に関するバグが見付かったとしても、認証サーバーを修正するだけでいい。また、より強力な認証システムを組み込むのも楽である。 +</p> + +<h2>コネクションの共有</h2> +<p> +クライアントはサーバーと<code>version</code>メッセージを交すことでコネクションを確立する。コネクションの確立からの一連のやりとりをセッションという。ひとつのコネクションは複数のクライアントが共有できる。</p> +<p> +クライアントはTauthまたはTattachメッセージによりサーバーに<code>fid</code>を要求できる。このうちTauthにより得られた<code>fid</code>は認証以外には使えない。Tattachで得られた<code>fid</code>は、Twalkメッセージによりファイルツリーを辿るための起点として利用でき、このとき辿った先のファイルを示す<code>fid</code>が生成される。これ以外の方法で<code>fid</code>が増えることはない。つまり、サーバーはひとつのコネクションのなかで、ルートディレクトリから派生した<code>fid</code>を追跡することで、クライアントを区別できる。</p> + +<h2>メッセージ詳細</h2> +<p> +それぞれ最初にメッセージの形式を書く。<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が来る。 +</p> +<h3>version</h3> +<p> +プロトコルのバージョンを交渉すし、コネクションを確立する。 +</p> +<pre><code>size[4] Tversion tag[2] msize[4] version[s] +size[4] Rversion tag[2] msize[4] version[s] +</code></pre> +<p> +クライアントは最初にサーバーにこのメッセージを送ってバージョンとメッセージの最大サイズ(<code>msize</code>)を交渉する。サーバーはクライアントから送られたバージョンとメッセージサイズに対応していれば、同じバージョンとサイズを送り返し、交渉成立である。</p> +<p> +サーバーとクライアントはこのメッセージを以ってコネクションを確立する。</p> + +<h3>attach、auth</h3> +<p> +コネクションを確立する。 +</p> +<pre><code>size[4] Tauth tag[2] afid[4] uname[s] aname[s] +size[4] Rauth tag[2] aqid[13] + +size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] +size[4] Rattach tag[2] qid[13] +</code></pre> +<p> +<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> +<p> +<code>auth</code>メッセージは認証サーバーとやりとりするための<code>fid</code>である<code>afid</code>を要求する。この<code>afid</code>を読み書きすることで認証サーバーとやりとりをし、自身の身分を証明する。認証が済んだらこの<code>afid</code>をセットした<code>attach</code>メッセージを送る。</p> + +<h3>error</h3> +<p> +エラーを返す。 +</p> +<pre><code>size[4] Rerror tag[2] ename[s] +</code></pre> +<p> +クライアントからの要求に対して、なにかエラーがおきたときにそのエラーを返すために使われる。<code>Terror</code>はない。</p> + +<h3>flush</h3> +<p> +リクエストをキャンセルする。 +</p> +<pre><code>size[4] Tflush tag[2] oldtag[2] +size[4] Rflush tag[2] +</code></pre> +<p> +実行中の要求をキャンセルする。キャンセルしたいリクエストの<code>tag</code>を<code>oldtag</code>にセットする。 +</p> + +<h3>walk</h3> +<p> +ファイルツリーを移動する。 +</p> +<pre><code>size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) +size[4] Rwalk tag[2] nwqid[2] nwqid*(qid[13]) +</code></pre> +<p> +<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> +<p> +<code>wname</code>の最初の要素への移動が失敗した場合は<code>Rerror</code>が返される。それ以外の場合は<code>Rwalk</code>が返され、<code>qid</code>は移動が成功した順番にそのファイルの<code>qid</code>がセットされる。<code>nwname</code>と<code>nwqid</code>が一致した場合は最後まで移動できたことになる。</p> +<p> +<code>walk</code>は<code>fid</code>を増殖させる唯一の方法である。</p> + +<h3>open、create</h3> +<p> +<code>fid</code>を開いて(作成して)読み書きできる状態にする。 +</p> +<pre><code>size[4] Topen tag[2] fid[4] mode[1] +size[4] Ropen tag[2] qid[13] iounit[4] + +size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1] +size[4] Rcreate tag[2] qid[13] iounit[4] +</code></pre> +<p> +<code>open</code>は<code>fid</code>と紐付いたファイルを開く。<code>mode</code>は読み込み専用の<code>OREAD</code>、書き込み専用の<code>OWRITE</code>、読み書きの<code>ORDWR</code>等である。ファイルを開く手順は以下の通り: +<ol> +<li><code>attach</code>でルートディレクトリの<code>fid</code>を取得</li> +<li>ルートディレクトリの<code>fid</code>から<code>walk</code>で開きたいファイルの<code>fid</code>を取得</li> +<li>その<code>fid</code>を<code>open</code>で開く</li> +</ol> +</p> +<p> +<code>create</code>は<code>fid</code>と紐付いたディレクトリに新しいファイルを作成する。<code>creat</code>ではなく<code>create</code>である。作成が成功したら<code>fid</code>は新しく作成されたファイルに紐付く。</p> + +<h3>read、write</h3> +<p> +ファイルを読み書きする。 +</p> +<pre><code>size[4] Tread tag[2] fid[4] offset[8] count[4] +size[4] Rread tag[2] count[4] data[count] + +size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count] +size[4] Rwrite tag[2] count[4] +</code></pre> +<p> +<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> + +<h3>clunk</h3> +<p> +<code>fid</code>を忘れる。 +</p> +<pre><code>size[4] Tclunk tag[2] fid[4] +size[4] Rclunk tag[2] +</code></pre> +<p> +いらなくなった<code>fid</code>を忘れる。一度忘れた<code>fid</code>は<code>walk</code>で別のファイルを取得する際に再利用できる。</p> + +<h3>remove</h3> +<p> +ファイルを削除する。 +</p> +<pre><code>size[4] Tremove tag[2] fid[4] +size[4] Rremove tag[2] +</code></pre> +<p> +<code>fid</code>と紐付いたサーバー上のファイルを削除する。<code>fid</code>は<code>clunk</code>したのと同様に忘れられる。</p> + +<h3>stat、wstat</h3> +<p> +ファイルの属性を読み書きする。 +</p> +<pre><code>size[4] Tstat tag[2] fid[4] +size[4] Rstat tag[2] stat[n] + +size[4] Twstat tag[2] fid[4] stat[n] +size[4] Rwstat tag[2] +</code></pre> +<p> +<code>stat</code>はファイルの属性を読む。読めた情報は<code>stat</code>として返される。<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、作成日、更新日等の情報がバイト列になったものである。</p> + + diff --git a/content/computer/_index.html b/content/computer/_index.html @@ -0,0 +1,48 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '電算機' ++++ +<p> +Small is beautiful. +</p> + +<h2>9P in Go</h2> +<ul> +<li><a href="9p.html">9P</a></li> +</ul> + +<h2>RP2040</h2> +<ul> +<li><a href="rp2040_1.html">RP2040 SDKなしでLチカ</a></li> +<li><a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> +<li><a href="rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> +</ul> + +<h2>X Window System</h2> +<ul> +<li><a href="x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> +<li><a href="xlib_playground1.html">Xlibで遊んでみる1</a></li> +<li><a href="xlib_playground2.html">Xlibで遊んでみる2</a></li> +<li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li> +<li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li> +<li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li> +<li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li> +</ul> + +<h2>サーバー</h2> +<ul> +<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li> +<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> +<li><a href="git_server.html">Gitサーバーの設定 on OpenBSD</a></li> +</ul> + +<h2>MISC</h2> +<ul> +<li><a href="web_design">ウェブデザイン</a></li> +<li><a href="what-i-use.html">使用しているソフトウェア、ハードウェア</a></li> +<li><a href="openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> +<li><a href="archlinux_installation.html">Arch Linuxインストール</a></li> +<li><a href="rtx1200-qos.html">ルーター(RTX1200)のQoS機能を利用して帯域を制限した</a></li> +</ul> + diff --git a/content/computer/archlinux_installation.html b/content/computer/archlinux_installation.html @@ -0,0 +1,308 @@ ++++ +date = '2021-03-25T00:00:00+09:00' +draft = false +title = 'Arch Linuxのインストール' ++++ +<time>2021-03-25</time> + +<h2>ハードウェア構成</h2> + +<h2>インストールの準備</h2> + +<h3>インストールメディアの入手</h3> + +<h3>署名の検証</h3> +<pre><code>$ gpg --keyserver-options auto-key-retrieve --verify archlinux-<i>version</i>-x86_64.iso.sig +</code></pre> + +<h3>インストールメディアの準備</h3> +<pre><code>$ sudo dd bs=4M if=<i>path/to/arch/linux/iso</i> of=/dev/sd<i>X</i> status=progress oflag=sync +</code></pre> + +<h3>ライブ環境の起動</h3> +Arch Linux install medium (x86_64, UEFI)を選択 + +<h3>インストールの記録</h3> +<pre><code># script install.log +</code></pre> + +<h3>起動モードの確認</h3> +<pre><code># ls /sys/firmware/efi/efivars +</code></pre> +エラーが出なければUEFI。 + +<h3>インターネットへ接続</h3> +<p> +ネットワークインターフェイスが認識されているか確認: +</p> +<pre><code># ip link +</code></pre> +<p> +Wi-Fi接続: +</p> +<pre><code># iwctl +[iwd]# device list +... +[iwd]# exit +</code></pre> +<p> +接続を確認: +</p> +<pre><code># ping archlinux.jp +</code></pre> + +<h3>システムクロックの更新</h3> +<pre><code># timedatectl set-ntp true +</code></pre> + +<h3>パーティショニング</h3> +<pre><code>sd<i>X</i> +├sd<i>X</i>1 512M EFI System /boot +└sd<i>X</i>2 lest Linux filesystem / +</code></pre> +<pre><code># lsblk +# fdisk /dev/sd<i>X</i> +Command (m for help): d +... +Command (m for help): w +</code></pre> + +<h3>パーティションのフォーマット</h3> +<pre><code># mkfs.fat -F32 /dev/sd<i>X</i>1 +# mkfs.ext4 /dev/sd<i>X</i>2 +</code></pre> + +<h3>ファイルシステムのマウント</h3> +<pre><code># mount /dev/sd<i>X</i>2 /mnt +# mkdir /mnt/boot +# mount /dev/sd<i>X</i>1 /mnt/boot +</code></pre> + +<h2>インストール</h2> +<h3>ミラーの選択</h3> +日本のサーバーを上に持ってくる: +<pre><code># vim /etc/pacman.d/mirrorlist +</code></pre> + +<h3>必須パッケージのインストール</h3> +<pre><code># pacstrap /mnt base base-devel linux linux-firmware man-db man-pages +</code></pre> + +<h3>fstabの生成</h3> +<pre><code># genfstab -U /mnt >> /mnt/etc/fstab +</code></pre> + +<h3>chroot</h3> +<pre><code># arch-chroot /mnt +</code></pre> + +<h3>text editorをインストール</h3> +<pre><code># pacman -S neovim +</code></pre> + +<h3>タイムゾーン</h3> +<pre><code># ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime +# hwclock --systohc +</code></pre> + +<h3>ローカリゼーション</h3> +<code>en_US.UTF-8</code>と<code>ja_JP.UTF-8</code>をコメントイン: +<pre><code># nvim /etc/locale.gen +</code></pre> +ロケールを生成: +<pre><code># locale-gen +</code></pre> +<pre><code># nvim /etc/locale.conf +LANG=en_US.UTF-8 +</code></pre> + +<h3>ネットワーク設定</h3> +<p> +無線接続用のソフトをインストール +</p> +<pre><code># pacman -S networkmanager +</code></pre> + +<p> +ホストネームの設定 +</p> +<pre><code># nvim /etc/hostname +<i>myhostname</i> +</code></pre> +<pre><code># nvim /etc/hosts +127.0.0.1 localhost +::1 localhost +127.0.1.1 <i>myhostname</i>.localdomain <i>myhostname</i> +</code></pre> + +<h3>Rootパスワード</h3> +<pre><code># passwd +</code></pre> + +<h3>ブートローダー</h3> +<p> +インストール +</p> +<pre><code># pacman -S grub efibootmgr +# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=boot +</code></pre> +<p> +メイン設定ファイルの生成 +</p> +<pre><code># grub-mkconfig -o /boot/grub/grub.cfg +</code></pre> + +<h3>マイクロコードのアップデートを有効化</h3> +<pre><code># pacman -S intel-ucode +# grub-mkconfig -o /boot/grub/grub.cfg +上のん無駄やんけ +</code></pre> + +<h2>再起動</h2> +<pre><code># exit #chrootを抜ける +</code></pre> + +<h3>インストールの記録を保存</h3> +<pre><code># exit #scriptを停止 +# mv install.log /mnt/root +</code></pre> + +<h3>アンマウント</h3> +<pre><code># umount -R /mnt +</code></pre> + +<h3>再起動</h3> +<pre><code># reboot +</code></pre> + +<h2>インストール後</h2> +<h3>システム管理</h3> +<p> +一般ユーザーの作成 +</p> +<pre><code># useradd -m -G wheel -s /bin/bash kenji +# passwd kenji +</code></pre> +<p> +作成したユーザーをsudoerに追加 +</p> +<pre><code># visudo +%wheel ALL=(ALL) ALL #uncomment +</code></pre> +<p> +一般ユーザーとしてログインしなおす。 +</p> + +<h3>パッケージ管理</h3> +<p> +AUR +</p> + + + +<h3>dotfilesを同期</h3> +<p> +gitのインストール +</p> +<pre><code>$ sudo pacman -S git +$ git config --global user.name "<i>First-name</i> <i>Family-name</i>" +$ git config --global user.email "<i>username</i>@<i>example.com</i>" +</code></pre> +<p> +dotfilesを同期 +</p> +<pre><code>$ mkdir ~/.local +$ cd ~/.local +$ git clone https://github.com/<i>dotfilesのリポジトリ</i> +$ ln -sf ~/.local/dotfiles/.bash* ~/ +$ mkdir .config +$ ln -s ~/.local/dotfiles/.config/* ~/.config/ +... +</code></pre> + +<h3>GUI</h3> +<p> +グラフィックドライバのインストール +</p> +<pre><code>$ sudo pacman -S nvidia nvidia-utils xorg-xinit +</code></pre> +<p> +window managerをインストール +</p> +<pre><code>$ sudo pacman -S i3-wm i3blocks dmenu +</code></pre> +ドライバをインストールしたらxorg-server等も依存関係として入った。 +<p> +フォントをインストール +</p> +<pre><code>$ sudo pacman -S noto-fonts-cjk noto-fonts-emoji ttf-joypixels ttf-font-awesome ttf-liberation +</code></pre> + +<p> +ターミナル(st)をインストール +</p> +<pre><code>$ mkdir ~/.local/src +$ cd ~/.local/src +$ git clone git://git.suckless.org/st +$ cd st +$ sudo make install +</code></pre> + +<p> +再起動 +</p> +<pre><code># sudo reboot +</code></pre> +だめでした +<p> +ログイン時に次のエラー +</p> +<pre><code>xauth: error in locking authority file /home/kenji/.cache/X11/Xauthority +</code></pre> +<p> +<code>~/.cache/X11</code>というディレクトリがないのが原因のようだ。 +<code>.bash_profile</code>でXauthorityの場所を変更していたのにディレクトリを作っていなかった。 +</p> +<pre><code>$ mkdir ~/.cache/X11 +</code></pre> +<p> +として解決。 +</p> + +<h3>日本語入力</h3> +<p> +ibusとibus-skkをインストール +</p> +<pre><code>$ sudo pacman -S ibus ibu-skk skk-jisyo +</code></pre> +<pre><code>vim ~/.config/X11/xinitrc +export DefaultIMModule=ibus +export GTK_IM_MODULE=ibus +export QT_IM_MODULE=ibus +export XMODIFIERS="@im=ibus" + +ibus-daemon --xim & +</code></pre> + +<h3>ブラウザ(brave)をインストール</h3> +<pre><code>$ cd ~/.local/src +$ git clone https://aur.archlinux.org/brave-bin.git +$ cd brave-bin +$ makepkg -si +</code></pre> + +<h3>音</h3> +<pre><code>$ sudo pacman -S alsa-utilst pulseaudio +$ pulseaudio --start +</code></pre> + + +<p> +ssh +</p> +<pre><code>$ sudo pacman -S openssh +$ mkdir ~/.ssh +$ cd ~/.ssh +$ ssh-keygen -t rsa +</code></pre> + diff --git a/content/computer/git_server.html b/content/computer/git_server.html @@ -0,0 +1,272 @@ ++++ +date = '2024-02-15T00:00:00+09:00' +draft = false +title = 'Gitサーバーの設定 on OpenBSD' ++++ +<time>2024-02-15</time> + +<h2>はじめに</h2> +<p> +GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p> +<p> +ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。 +</p> + +<h2>手順</h2> +<p> +以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。 +</p> + +<h3>概要</h3> +<ol> +<li>ドメインの設定(任意)</li> +<li><code>httpd(8)</code>の設定</li> +<li>gitパッケージのインストールとchroot環境の整備</li> +<li>stagitの導入</li> +</ol> + +<h3>ドメインの設定(任意)</h3> +<p> +ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p> +<p> +今回はgitというサブドメインを登録した: +</p> +<table> +<thead> +<tr> +<th>サブドメイン</th> +<th>種別</th> +<th>内容</th> +<th>優先度</th> +</tr> +</thead> +<tbody> +<tr> +<td>git</td> +<td>A</td> +<td><i>サーバーのIPアドレス</i></td> +<td></td> +</tr> +</tbody> +</table> + +<h3><code>httpd(8)</code>の設定</h3> +<p> +httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する: +</p> +<pre><code>domain git.mtkn.jp { + domain key "/etc/ssl/private/git.mtkn.jp.key" + domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" + sign with letsencrypt +} +</code></pre> + +<p> +続いて<code>/etc/httpd.conf</code>を設定する。</p> +<pre><code>server "git.mtkn.jp" { + listen on * port 80 + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location "*" { + block return 302 "https://$HTTP_HOST$REQUEST_URI" + } +} + +server "git.mtkn.jp" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" + key "/etc/ssl/private/git.mtkn.jp.key" + } + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location "/*/git-receive-pack" { + block + } + location "/*/git-upload-pack" { + fastcgi { + param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" + param GIT_PROJECT_ROOT "/git" + param GIT_HTTP_EXPORT_ALL "true" + } + } + location "/*/info/refs" { + fastcgi { + param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" + param GIT_PROJECT_ROOT "/git" + param GIT_HTTP_EXPORT_ALL "true" + } + } +} +</code></pre> +<p> +<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p> +<p> +<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環境にコピーする。 +</p> +<p> +この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p> + + + +<p> +httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。 +</p> +<p> +<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する: +</p> +<pre><code># echo httpd_flags= &gt;&gt; /etc/rc.conf.local +# echo slowcgi_flags= &gt;&gt; /etc/rc.conf.local +# rcctl start httpd +# rcctl enable httpd +# rcctl start slowcgi +# rcctl enable slowcgi +</code></pre> +<p> +サーバー証明書の発行: +</p> +<pre><code># acme-client -v git.mtkn.jp +</code></pre> +<p> +<code>crontab(1)</code>にサーバー証明書の自動更新を登録: +</p> +<pre><code>#minute hour mday month wday [flags] command +~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd +</code></pre> + +<h3>gitパッケージのインストールとchroot環境の整備</h3> +<p> +gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする: +</p> +<pre><code># pkg_add git +# useradd -b /var/www -m -s /usr/local/bin/git-shell git +</code></pre> +<p> +ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p> +<p> +httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー: +</p> +<pre><code># mkdir -p /var/www/usr/local/libexec/git +# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/ +# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} +# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} +# mkdir -p /var/www/usr/local/bin +# cp /usr/local/bin/git /var/www/usr/local/bin/ +# chown www:www /var/www/usr/local/bin/git +# chmod 0500 /var/www/usr/local/bin/git +</code></pre> +<p> +続いてコマンドの実行に必要なライブラリをコピー: +</p> +<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec +# 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 +</code></pre> +<p> +<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照): +</p> +<pre><code># mkdir /var/www/dev +# mknod -m 666 /var/www/dev/null c 2 2 +</code></pre> +<p> +最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。 +</p> + +<p> +gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った: +</p> +<pre><code>#!/bin/sh -xe + +oso=$(find /var/www/usr -type f -name '*.so*') +rm $oso + +bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' | + grep -v bgpctl | + sed 's|^/var/www||' + ) +echo &quot;$bin&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s +echo &quot;$bin&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s +echo &quot;$bin&quot; | sed 's|.*|chmod 0500 /var/www&amp;|' | sh -s + +nso=$(echo &quot;$bin&quot; | sed 's|^|/var/www|' | + xargs ldd | awk '{print $7}' | + grep -v -e '^/var/www/' -e '^$' -e 'Name' | + sort | uniq + ) +echo &quot;$nso&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s +echo &quot;$nso&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s +echo &quot;$nso&quot; | sed 's|.*|chmod 0400 /var/www&amp;|' | sh -s +</code></pre> + +<h3><code>stagit(1)</code>の導入</h3> +<p> +ウェブフロントエンドとしてstagitを導入する: +</p> +<pre><code># pkg_add stagit +</code></pre> +<p> +<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する): +</p> +<pre><code> location &quot;/&quot; { + directory index index.html + root &quot;/htdocs/git.mtkn.jp&quot; + } + location &quot;*&quot; { + directory index log.html + root &quot;/htdocs/git.mtkn.jp&quot; + } +</code></pre> +<p> +stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する: +</p> +<pre><code># mkdir /var/www/htdocs/git.mtkn.jp +# chown git:git /var/www/htdocs/git.mtkn.jp +# rcctl reload httpd +</code></pre> + +<p> +gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい: +</p> +<pre><code>#!/bin/sh + +git_root=&quot;/var/www/git&quot; +stagit_root=&quot;/var/www/htdocs/git.mtkn.jp&quot; +repo=&quot;$(basename &quot;$(pwd)&quot; | sed 's/\.git$//')&quot; +src=&quot;$(pwd)&quot; +stagit_dst=&quot;$stagit_root/$repo&quot; + +mkdir -p &quot;$stagit_dst&quot; +(cd &quot;$stagit_dst&quot; &amp;&amp; stagit -l 64 &quot;$src&quot;) +(cd &quot;$stagit_root&quot; &amp;&amp; stagit-index $git_root/*.git &gt; index.html) +</code></pre> + +<h2>レポジトリの作成</h2> +<p> +レポジトリを作成するにはサーバーで以下のようにする。</p> +<pre><code>$ cd /var/www/git +$ doas -u git mkdir <i>repo</i>.git +$ cd <i>repo</i>.git +$ doas -u git git init --bare +</code></pre> + +<p> +これで手元のパソコンからクローンできる: +</p> +<pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git +</code></pre> +<p> +または +</p> +<pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git +</code></pre> + +<h2>参考</h2> +<ul> +<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li> +<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li> +<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li> +</ul> + diff --git a/man/computer/images/openbsd_on_u9310e_1.jpg b/content/computer/images/openbsd_on_u9310e_1.jpg Binary files differ. diff --git a/man/computer/images/openbsd_on_u9310e_2.jpg b/content/computer/images/openbsd_on_u9310e_2.jpg Binary files differ. diff --git a/content/computer/mailserver.html b/content/computer/mailserver.html @@ -0,0 +1,535 @@ ++++ +date = '2024-01-19T00:00:00+09:00' +draft = false +title = 'メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot' ++++ +<time>2024-01-19</time><br> +<time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br> + +<h2>はじめに</h2> +<p> +少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。当時はドキュメントを追うのに必死で構築手順を整理できていなかった。しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。そこであらためてサーバーを構築し、その手順を確認することにした。あいかわらずDNSの知識は自信がない。セキュリティは自己責任で。</p> + +<h2>使うもの</h2> +<ul> +<li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> +<li>OS: OpenBSD 7.4</li> +<li>ドメイン: ムームードメイン (mtkn.jpとする)</li> +<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> +<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> +</ul> + +<h2>メールの仕組み</h2> +<p> +メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのがSMTPサーバーと呼ばれるソフトウェアである。このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも呼ばれる。今回はMTAとしてOpenSMTPDというのを使う。手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、そこから受信側のMTAに転送される。受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所に保存する。</p> +<p> +受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、自分宛てのメールを確認する。この時に使われるのがIMAPというプロトコルである(POPというのもあるが今回は割愛)。IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。今回MDAとしてDovecotを使用する。</p> +<p> +以上をまとめると以下のようになる: +</p> +<pre> ++------------+ +----------------+ +|MTA(mtkn.jp)|--SMTP-&gt;| MTA | ++------------+ +--example.com---+ + ^ | MDA | + | +----------------+ + | | + SMTP IMAP + | | + | v ++------------+ +----------------+ +|user@mtkn.jp| |user@example.com| ++------------+ +----------------+ + +</pre> +<ol> +<li>メールを書く。</li> +<li>送信側のMTAに送る。</li> +<li>受信側のMTAに転送する。</li> +<li>受信者が受信側のMDAに新着メールの有無を確認する。</li> +</ol> + +<p> +SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、いくつかの方法で送信元の本人確認を行う。その際第三者としてDNS及び、サーバーのIPアドレスを管理している人(今回の場合はさくらインターネット)が登場する。DNSにはドメインをIPアドレスにひもづける情報が登録できる。またIPアドレスの管理人には、自分が借りているIPアドレスを自分のドメインにひもづける情報を登録してもらう。これらによって、メールの送信者がドメイン、IPアドレス双方から確認できるので、なりすましを防止できる仕組みである。</p> + +<p> +最近はgmail等の大手がスパム対策を強化する一環として、以下に述べるような本人確認をすべて通らなければ受信しないようにしているらしい。</p> + +<h2>MTAどうしのやりとり</h2> +<p> +以下、MTAどうしの通信内容をざっくり説明する。 +</p> + +<h3>Aレコード、MXレコードによる送信先の特定</h3> +<p> +MTAがメールを送信する際、まずは宛先のサーバーを特定する必要がある。この際に使用するのがDNSに登録されているMXレコードである。送信元のMTAはまずDNSに宛先のドメインのMXレコードを問い合わせる。するとメールの送信先のドメイン名が分かるので、続いてこの送信先のIPアドレスを問い合わせる:</p> +<pre> +MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS + + example.com宛のメールって + 誰に送ったらええん? + ----------------------------------------&gt; + + mai.example.comやで(MXレコード) + &lt;---------------------------------------- + + mail.example.comってどこや? + ----------------------------------------&gt; + + <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) + &lt;---------------------------------------- +</pre> +<p> +次にこの宛先のMTAとの通信を開始する。しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:</p> +<pre> +MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + こんちは。mtkn.jpです。 + ----------------------------------------&gt; + + なりすましちゃうか確認したろ +</pre> + +<h3>SPFレコードによる送信元の本人確認</h3> +<p> +受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。このときに使うのがSPFレコードである。このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいいIPアドレスを指定する。受信側のMTAは送信元のIPアドレスと、このレコードに記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者に認められているMTAかどうか判断できる。</p> +<pre> +DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + mtkn.jpを名乗るやつから連絡 + 来てるんやけどこいつ本物? + &lt;---------------------------------------- + + IPアドレスが<i>sss.sss.sss.sss</i> + やったら多分本物やわ。(SPFレコード) + ----------------------------------------&gt; + + よっしゃ +</pre> + +<h3>PTRレコード</h3> +<p> +次は逆にIPアドレスからドメインを辿って本人確認する。これに使われるのがPTRレコードである。このレコードはIPアドレスの管理人(ここではさくらインターネット)でないと登録できない。しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを提供しており、PTRレコードをきちんと設定した上でスパムメールを送ると、自分の身元がバレるので、スパムの抑止に繋がる。</p> +<pre> +DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + <i>sss.sss.sss.sss</i>ってIPアドレスで + mtkn.jpってドメイン登録されてる? + &lt;---------------------------------------- + + されてるで。(PTRレコード) + ----------------------------------------&gt; + + よっしゃ +</pre> + +<h3>DKIM</h3> +<p> +送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。署名は公開鍵方式で行うが、この鍵をドメインキーというようである。この署名が付いたメールをDKIM(DomainKey Identified Mail)という。送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、メール送信時に秘密鍵で署名する:</p> +<pre> +MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + + 本人確認できたわ + おまたせ。 + &lt;---------------------------------------- + + userさんにメール送るで。 + 署名も付けるで。 + ----------------------------------------&gt; +</pre> +<p> +受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:</p> +<pre> +DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + mtkn.jpが署名付きでメール + くれたんやけどこの署名本物? + &lt;---------------------------------------- + + これで確認してみて(DKIM公開鍵) + ----------------------------------------&gt; + + よっしゃ +</pre> + +<h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3> +<p> +この他DNSにはDMARCレコードというものを登録することができる。これは、以上の本人確認により送信側がにせものであることが確認できた際、受信側にどのような行動を取ってほしいかを記述するものである。これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、受信したサーバーから自分宛てに通報するように頼める(この頼みが聞き入れられるかどうかは多分受信側MTAによる)。 +</p> +<pre> +DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) + mtkn.jpを名乗る詐欺師から + メールきたんやけどどないしょ? + &lt;---------------------------------------- + + ここ(postmaster@mtkn.jp)に通報や。 + (DMARCレコード) + ----------------------------------------&gt; + + よっしゃ +</pre> + +<h2>サーバーの設定</h2> +<h3>VPSの契約、ドメインの取得</h3> +<p> +VPSとドメインを契約する。今回はVPSをさくらインターネットで、ドメインをムームードメインでそれぞれ契約した。さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい(他のVPSを知らないので比較はできないが)。ムームードメインは安い。管理画面も悪くはない。以前お名前.comでも借りたことがあるが、こちらは広告のメールがやたら届いてうっとうしかった記憶がある。</p> + +<h3>OpenBSDのインストール</h3> +<p> +さくらのVPSにOpenBSDをインストールする。さくらインターネットが用意したISOがあるので、OS再インストールの画面からそれを選べばすぐにインストールきる。でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。</p> +<p> +インストールのこまかい手順は割愛するが、ひとつだけひっかかった点があるので書いておく。インストール先のディスクをセットアップし、OSに必要なファイルをインストールメディアからディスクにコピーすると以下のエラーがでてカーネルパニックになった: +</p> +<pre><code>wdc_atapi_start: not ready, st = 50 +fatal protection fault in supervisor mode +trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410 +gsbase 0xffffffff81908ff0 kgsbase 0x0 +panic: trap type 4, code=0, pc=ffffffff810081a9 +syncing disks...18 18 18 18 18 18 18 18 +</code></pre> +<p> +原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗しているようで、インストールに必要なファイルをウェブ上からダウンロードする方法を選択すると問題なくインストールできた。 +</p> + +<h3>ファイアーフォールの設定</h3> +<p> +メールの送受信等に必要なポートを開ける:</p> +<ul> +<li>TCP 22: ssh接続用</li> +<li>UDP 53: DNSとの通信用</li> +<li>TCP 25: SMTPの通信用</li> +<li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li> +<li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li> +<li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li> +</ul> +<p> +以上の設定を<code>/etc/pf.conf</code>に設定する: +</p> +<pre><code>set skip on lo + +block return # block stateless traffic +pass in log proto tcp from any to any port 22 #ssh + +pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS +pass out proto udp from any to any port 123 #ntp + +pass proto icmp #ping +pass proto tcp from any to any port { 80, 443 } #www +pass proto tcp from any to any port { 25, 587, 993 } #mail +</code></pre> +<p> +<code>pf(4)</code>の設定を反映: +</p> +<pre><code># pfctl -f /etc/pf.conf +</code></pre> + +<h3>DNSの設定</h3> +<h4>A, MX, SPF, DMARC</h4> +<p> +DNSのレコードを設定する。ムームーDNSの場合、コントロールパネルにログインし、サイドバーからドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタンをクリックすると設定画面がでるので、以下のように設定する:</p> +<table> +<thead> +<tr> +<th>サブドメイン</th> +<th>種別</th> +<th>内容</th> +<th>優先度</th> +</tr> +</thead> +<tbody> +<tr> +<td></td> +<td>A</td> +<td><i>sss.sss.sss.sss</i></td> +<td></td> +</tr> +<tr> +<td>mail</td> +<td>A</td> +<td><i>sss.sss.sss.sss</i></td> +<td></td> +</tr> +<tr> +<td></td> +<td>MX</td> +<td>mail.mtkn.jp</td> +<td>10</td> +</tr> +<tr> +<td></td> +<td>TXT</td> +<td>v=spf1 mx -all</td> +<td></td> +</tr> +<tr> +<td>_dmarc</td> +<td>TXT</td> +<td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td> +<td></td> +</tr> +</tbody> +</table> + +<p> +ひとつめの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>であることも分かる。 +</p> +<p> +次のTXTレコードはSPFレコードである。v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録されたIPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信を禁止している。 +</p> +<p> +最後のものはDMARCレコードである。v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメールについて、その受信者が受信を拒否するように指定している。rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメールを受信した場合の通報先を指定している。</p> + +<h4>PTR</h4> +<p>PTRレコードを設定する。さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名(mtkn.jp)を入力する。 +</p> + +<h3>OpenSMTPDの設定</h3> +<h4>ユーザーの作成</h4> +<p> +メールの送受信を担当するユーザーを作成する:</p> +<pre><code># useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail +</code></pre> + +<h4>サーバー証明書の取得</h4> +<p> +<code>httpd(8)</code>の設定ファイルを作成する。<code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。変更箇所はドメイン名だけでいい。編集後、httpdを起動する。</p> +<pre><code># cp /etc/examples/httpd.conf /etc/ +# vi /etc/httpd.conf +# echo httpd_flags= &gt;&gt; /etc/rc.conf.local +# rcctl start httpd +# rcctl enable httpd +</code></pre> + +<p> +続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に登録することで、証明書が自動で更新されるようにする。</p> +<pre><code># cp /etc/examples/acme-client.conf /etc/ +# vi /etc/acme-client.conf +# acme-client -v mail.mtkn.jp +# crontab -e +</code></pre> + +<pre><code>#minute hour mday month wday [flags] command +~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd +</code></pre> + +<h4>ドメインキーの作成とDNSへの登録</h4> +<p> +OpenSMTPD用のDKIMフィルターをインストールする。 +</p> +<pre><code># pkg_add opensmtpd-filter-dkimsign +</code></pre> + +<p> +ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。 +</p> +<pre><code># openssl genrsa -out /etc/mail/dkim/private.key 1024 +# openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key +# chown -r _dkimsign:_dkimsign /etc/mail/dkim +# chmod 0400 /etc/mail/dkim/private.key +</code></pre> + +<p>作成したドメインキーの公開鍵をDNSに登録する:</p> +<table> +<thead> +<tr> +<th>サブドメイン</th> +<th>種別</th> +<th>内容</th> +<th>優先度</th> +</tr> +</thead> +<tbody> +<tr> +<td>selector1._domainkey.mail</td> +<td>TXT</td> +<td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td> +<td></td> +</tr> +</tbody> +</table> + +<p> +サブドメインのselector1は以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに +指定してものと同じものであれば他のものでもいい。</p> + +<h4>smtpd.confの設定</h4> +<p> +/etc/mail/smtpd.confを以下の通り変更:</p> +<pre><code># 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。 +# 証明書のファイルは先程acme-client(1)で取得したもの。 +pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot; +pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot; + +# テーブルの登録 +# ローカルに届いたメールの転送を設定するテーブル +table aliases file:/etc/mail/aliases +# ユーザーの名前と暗号化されたパスワードのテーブル +table passwd file:/etc/mail/passwd +# メールの転送を設定するテーブル +table virtuals file:/etc/mail/virtuals + +# フィルターの登録 +# ドメインキーによる署名を付加するフィルター +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 +# DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター +filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot; +# 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった +# 場合に受信を拒否するフィルター +filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot; + +# 各ネットワークインターフェース毎の処理を設定。 +listen on socket +listen on lo0 +# vio0というインターフェースの25番ポートに届いたものに関する設定。 +# 外部からmtkn.jp宛に届いたものの処理である。 +# 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、 +# 上で設定したDNSに関するフィルターを適応。 +listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\ + filter { check_rdns, check_fcrdns } +# vio0というインターフェースのsubmission(587番)ポートに関する設定。 +# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される +# メールに関する設定。 +# 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 +# &quot;passwd&quot;という名前で登録したパスワードで認証し、 +# さらにドメインキーでメールに署名する。 +listen on vio0 mask-src port submission smtps pki mtkn.jp\ + hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign + +# 各種メールの処理を定義する。 +# 各処理が実行される条件はこの後定義する。 +# ローカルメールはデフォルトのまま +action &quot;local_mail&quot; mbox alias &lt;aliases&gt; +# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 +action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\ + virtual &lt;virtuals&gt; +# 他のドメイン宛ては宛先へ転送。 +# 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で +# 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加 +action &quot;outbound&quot; relay helo "mtkn.jp" + +# どういう条件でどういう処理をするかを定義する。 +# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 +# ここでは/var/vmail/以下に振り分けて保存する。 +match from any for domain mtkn.jp action &quot;domain&quot; +# このサーバー内でのメールはlocal_mailとして処理。 +match from local for local action &quot;local_mail&quot; +# このサーバー内から他所へのメールは宛先に転送 +match from local for any action &quot;outbound&quot; +# 外部から来た他所宛てのメールは認証されているものに限り転送。 +# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 +match auth from any for any action &quot;outbound&quot; +</code></pre> + +<h4>各テーブルの作成</h4> +<p> +上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。<code>/etc/mail/aliases</code>は特に変更しなくてもいい。<code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:</p> +<pre><code># echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd +<i>パスワードを入力し、エンター、Ctrl-D</i> +</code></pre> + +<p> +<code>/etc/mail/virtuals</code>にはメールの転送を設定できる。以下のようにする:</p> +<pre><code>abuse@mtkn.jp user@mtkn.jp +postmaster@mtkn.jp user@mtkn.jp +webmaster@mtkn.jp user@mtkn.jp +user@mtkn.jp vmail +</code></pre> +<p> +この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど必要なんかな? +</p> + +<h3>Dovecotの設定</h3> +<p> +MDAとして<code>dovecot(1)</code>をインストールする。</p> +<pre><code># pkg_add dovecot +</code></pre> +<p> +dhparamを作成する(時間がかかる): +</p> +<pre><code># openssl dhparam -out /etc/ssl/dh.pem 4096 +</code></pre> + +<p> +わかりにくい設定ファイルをどけてシンプルなものに書き直す: +</p> +<pre><code># mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig +# vi /etc/dovecot/dovecot.conf +</code></pre> +<p> +ドキュメントは公式ウェブサイトで確認できる。分量が多すぎて読む気にならない。サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>と暗号化されていないIMAPを<code>port = 0</code>として無効にする。他はとりあえず以下の設定で動く:</p> +<pre><code># IPv4は全て監視 +listen = * + +# SSL接続のみ許可 +ssl = required + +# SSLに使用するファイル +ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem +ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key +ssl_dh = &lt;/etc/ssl/dh.pem + +# メールの保存場所は各ユーザーのホームディレクトリ。 +# ホームディレクトリの場所は以下のuserdbで設定。 +mail_location = maildir:~ + +# パスワードのファイル。 +# OpenSMTPDと共有。 +passdb { + args = scheme=BLF-CRYPT /etc/mail/passwd + driver = passwd-file +} + +# ユーザーの設定。 +# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> +userdb { + args = uid=vmail gid=vmail home=/var/vmail/%d/%n + driver = static +} + +# 使用するプロトコル。 +protocols = imap lmtp + +# SSLを使ったIMAPSのみを許可。 +service imap-login { + inet_listener imaps { + port = 993 + ssl = yes + } + # Disable imap + inet_listener imap { + port = 0 + } +} +</code></pre> +<pre><code># rcctl start dovecot +# rcctl enable dovecot +</code></pre> + +<p> +サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように<code>cron(8)</code>に追加しておく: +</p> +<pre><code>crontab -e +</code></pre> + +<pre><code>#minute hour mday month wday [flags] command +~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot +</code></pre> + +<h3>テスト</h3> +<p> +手元のメールクライアントから送受信のテストをする。特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。以上の設定で、gmailへの送受信は問題なかった。また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン及び送受信できることも確認した。</p> +<p> +<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> + +<h2>参考文献</h2> +<ul> +<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> +<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> +<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> +<li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li> +<li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li> +<li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li> +<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li> +<li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li> +<li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li> +<li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li> +</ul> + diff --git a/content/computer/openbsd_on_u9310e.html b/content/computer/openbsd_on_u9310e.html @@ -0,0 +1,149 @@ ++++ +date = '2025-04-28T00:00:00+09:00' +draft = false +title = 'OpenBSD on Fujitsu LIFEBOOK U9310/E' ++++ + +<h2>はじめに</h2> +<p> +大阪の日本橋で状態のいいLIFEBOOKを見つけたので購入した。OpenBSDをインストールしたらおおむね問題なく動いた。</p> + +<h2>ハードウェア</h2> +<img src="images/openbsd_on_u9310e_1.jpg" alt="U9310/E"> +<p> +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> + +<h2>内部</h2> +<p> +分解は簡単。電源を落して、裏面にあるネジを全部外せば裏蓋が開く。ツメで引っ掛けていたりしないので外しやすい。裏蓋にはバッテリーの絵が描かれたボタンがあって、いかにも押してほしそうな顔をしていたので一応押してから分解した。組み立てた後は電源ケーブルを繋がないと電源が入らなかった。おそらくバッテリーとの接続を切断するためのボタンなのだと思う。</p> +<img src="images/openbsd_on_u9310e_2.jpg" alt="U9310/E の内部"> +<p> +CPUクーラー、ヒートシンク、Wi-Fiカード、WWANカード、SSDは簡単に外せた。他のものもだいたい分解しやすそうである。電源プラグが交換できるのはポイントが高い。上でも書いたがメモリははんだ付けされていて交換できない。キーボードも外せそうではあるがマザーボードを取ったうえネジが沢山あったのでやめにした。</p> +<h2>OpenBSDのサポート</h2> +<table> +<tr> +<th>機能</th> +<th>サポート</th> +<th>備考</th> +</tr> + +<tr> +<td>音</td> +<td>○</td> +<td> +Intel 400 Series HD Audio、コーデック: Realtek ALC255。<br>azaliaによりサポート。メディアキーによる音量調整が可能。</td> +</tr> + +<tr> +<td>バッテリーの状態</td> +<td>○</td> +<td> +acpibatによりサポート。 +</td> +</tr> + +<tr> +<td>キーボードバックライト</td> +<td>?</td> +<td> +今回購入したものには搭載されていなかった。 +</td> +</tr> + +<tr> +<td>ハイバーネーション</td> +<td>○</td> +<td> +ZZZが使える。 +</td> +</tr> + +<tr> +<td>スリープ</td> +<td>○</td> +<td> +zzzが使える。液晶を閉じると自動でスリープし、開くと問題なく復帰できる。電源ランプが点滅するのが少しじゃま。 +</td> +</tr> + +<tr> +<td>タッチパッド</td> +<td>○</td> +<td> +imtでサポート。 +</td> +</tr> + +<tr> +<td>USB type-A</td> +<td>○</td> +<td> +使えた。 +</td> +</tr> + +<tr> +<td>USB type-C、Thunderbolt</td> +<td>?</td> +<td> +充電はできた。Thunderboltはケーブルがないのでテストできない。</td> +</tr> + +<tr> +<td>SDカードリーダー</td> +<td>○</td> +<td> +使えた。 +</td> +</tr> + +<tr> +<td>映像出力</td> +<td>○</td> +<td> +inteldrmでサポート。輝度の調整はxbacklightで出来るが、メディアキーは使えなかった。HDMIの出力も問題ない。 +</td> +</tr> + +<tr> +<td>ウェブカメラ</td> +<td>○</td> +<td> +SunplusIT Inc FJ Camera。uvideoでサポート。 +</td> +</tr> + +<tr> +<td>Ethernet</td> +<td>○</td> +<td> +emでサポート。 +</td> +</tr> + +<tr> +<td>Wi-Fi</td> +<td>○</td> +<td> +Intel Wi-Fi 6 AX201。iwxでサポート。 +</td> +</tr> + +<tr> +<td>WWAN</td> +<td>?</td> +<td> +Sierra Wireless, Incorporated EM7430。umbにより認識はされてる。ifconfigでもネットワークインターフェースとして表示されてる。simカード持ってないから試せない。 +</td> +</tr> + +<tr> +<td>Bluetooth</td> +<td>×</td> +<td> +OpenBSDはBluetoothが嫌い。ugenにより認識はされてる。 +</td> +</tr> + +</table> + diff --git a/content/computer/rp2040_1.html b/content/computer/rp2040_1.html @@ -0,0 +1,714 @@ ++++ +date = '2023-04-25T00:00:00+09:00' +draft = false +title = 'RP2040 SDKなしでLチカ' ++++ +<time>2023-04-25</time>: 作成<br /> +<time>2024-02-25</time>: ベクターテーブルの修正 + +<h2>はじめに</h2> +<p> +パタヘネのRISC-V<sup>[1]</sup>版を買って一通り読んだらアセンブリ言語で組込のプログラミングがしたくなった。RISC-Vのマイコンボードが欲しかったのだが、安くていい感じのものが見付からなかった。代わりに秋月電子通商でArmのものがあった。RP2040マイコンボードキット<sup>[2]</sup>というものである。ウェブ上の情報も多く、データシート<sup>[3]</sup>もしっかりしていそうなので、とりあえずこれを買ってみた。</p> +<p> +一般的にはSDK<sup>[4]</sup>をダウンロードしてあらかじめ用意されたライブラリを使って開発するようだが、これはビルドシステムとしてcmakeというのを使っている。これがOpenBSDでは何かエラーがでて動かなかった。僕はこういう便利ツールが嫌いだ。どうせ使わんからいいんやけど。関係ないけど途中から開発環境がLinuxに替わった。SDKには便利な関数がたくさん用意されているので楽である。ハードウェアの面倒な部分がプログラマから見えないようにしているからである。しかし今回はその面倒な部分に触れてみたくて買ったので、SDKを使うと意味がない。</p> +<p> +ということでSDKなしで開発してみる。とりあえず定番のLチカをば。</p> +<p> +ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a> +</p> + +<h2>動作環境</h2> +<ul> +<li>Arch Linux 6.2.12-arch1-1 + <ul> + <li>arm-none-eabi-binutils 2.40-1</li> + <li>GNU Make 4.4.1</li> + </ul> +</li> +<li>OpenBSD 7.3 + <ul> + <li>arm-none-eabi-binutils 2.31.1</li> + <li>make (バージョン?)</li> + </ul> +※<code>make flash</code>は動かん。<code>dmesg</code>でデバイス確認して手動でマウントする必要がある。 +</li> +</ul> + +<h2>Boot Process</h2> +<p> +RP2040は電源を入れるといくつかの段階(ここでは関係ないので省略。データシート「2.8.1 Processor Controlled Boot Sequence」に詳しく書いてある)を踏んだあと、外部のフラッシュROMの先頭から256バイトを内部のSRAMにコピーして、フラッシュにプログラムが書き込まれているかどうか確認する。RP2040はフラッシュの先頭252バイトから計算したCRC32チェックサムを、直後の253バイト目から256バイトに記録することになっている。起動時にこのチェックサムを確認することで、フラッシュにプログラムが書き込まれているかどうか確かめている。コピーした最後の4バイトと起動時に最初の252バイトから計算したチェックサムが一致していれば、そのままコピーしてきた256バイトの先頭にPCをセットして実行を開始する。一致しなければUSBデバイスモードに切り替わり、パソコンに接続するとストレージとして認識される。このストレージにUF2という形式に変換したプログラムをコピーするとプログラムがフラッシュROMやSRAMに書き込まれる。 +</p> +<p> +以上のことから、プログラムを実行するためにはCRC32を計算し、UF2という形式に変換することが必要である。ソースコードからの流れは以下の通り: +</p> +<pre>source bin bin with +code ----------&gt; object ------&gt; elf --------&gt; bin -------&gt; with --------&gt; crc32 in + crc32 uf2 format + assemble link objcopy bincrc bin2uf2 +</pre> + +<h2>CRC(巡回冗長検査)</h2> +<p> +入力のデータをごにょごにょしてある値を出力する。</p> +<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"> +<p> +データ転送等に伴う偶発的な誤りの検査によく使われている<sup>[5]</sup>。 +</p> +</blockquote> +<p> +らしい。 +</p> +<p> +入力のビットを一列に並べて、除数で「割り算」していく。この「割り算」が多項式の除算に似ているので、この除数をCRC多項式というらしい。ただし多項式の除算と違い、引き算するところをXORする。CRC32の場合、除数は33ビットである。33ビットで割ると32ビットの余りが残る。この余りがCRC32のチェックサムである。除数は色々あるようだが、標準的なものがWikipedia<sup>[5]</sup>に列挙されている。除数<code>1011</code>を使ったCRC3の計算の手順は以下の通り: +</p> +<pre><code>1110101011011100110101101101111 入力(適当) +1011 除数(4ビット) +------------------------------- + 101101011011100110101101101111 結果(入力と除数のXOR) + 1011 + ------------------------------ + 00001011011100110101101101111 + 1011 + ------------------------- + 000011100110101101101111 + 1011 + -------------------- + 1010110101101101111 + 1011 + ------------------- + 001110101101101111 + 1011 + ---------------- + 101101101101111 + 1011 + --------------- + 00001101101111 + 1011 + ---------- + 110101111 + 1011 + --------- + 11001111 + 1011 + -------- + 1111111 + 1011 + ------- + 100111 + 1011 + ------ + 01011 + 1011 + ---- + 000 CRC3チェックサム +</code></pre> +<p> +普通の割り算と基本は同じであるが、引き算の部分だけXORになっている。</p> +<p> +以上の計算をプログラムの先頭252バイトに対して、33ビットの除数を用いて行う。データの並べ方は、上の例において左側を先頭に、フラッシュROM上の0番地から、各バイトは最上位ビットから順に並べる。入力のデータは253バイト目から256バイト目に<code>0</code>をひっつけて計算する。これは多分予め長さが分からないデータでも計算できるようにしたかったからかな。除数は<code>0x104c11db7</code>である(最上位ビットは常に1なのでデータシートでは省略されている)。</p> +<p> +入力データは1バイトづつ処理したいみたいである。多分通信等で使う都合である。この時XORは結合則が成り立つので1バイト処理した結果と次のバイトとをXORして次の処理の入力として利用することができる: +</p> +<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) +|......| +111000110000000000000000000000000 先頭1バイト +100000100110000010001110110110111 除数 +------------------------------------------------------------------------ +011000010110000010001110110110111 + 100000100110000010001110110110111 + ----------------------------------------------------------------------- + 010000001010000110010011011011001 + 100000100110000010001110110110111 + ---------------------------------------------------------------------- + 000000110010001110101000000000101 +|......| + 110010001110101000000000101000000 1バイト目の結果 + |......| + 10000001 入力の2バイト目 + ---------------------------------------------------------------- + 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR + 100000100110000010001110110110111 除数 + ---------------------------------------------------------------- + 000100011011010010001111100110111 + . + . + . +</code></pre> +<p> +以上の操作は以下のようなアルゴリズムのループで実装できる。</p> +<ul> +<li>前回の結果と、入力データの次のバイトをXOR</li> +<li> + <ul> + <li>先頭の1ビットが1の場合、除数とXORを取り左シフト</li> + <li>先頭の1ビットが0の場合、そのまま左シフト</li> + </ul> +</li> +</ul> +<p> +これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。更にこの工程を32ビットの<code>int</code>だけで行うことを考える: +</p> +<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) + +11111111111111111111111111111111 0xffffffff +11100011000000000000000000000000 先頭1バイトを24ビットシフト +-------------------------------- XOR +00011100111111111111111111111111 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +00111001111111111111111111111110 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +01110011111111111111111111111100 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +11100111111111111111111111111000 +先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: +11001111111111111111111111110000 シフト +00000100110000010001110110110111 除数の下位32ビット +-------------------------------- XOR +11001011001111101110001001000111 +先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: +10010110011111011100010010001110 シフト +00000100110000010001110110110111 除数の下位32ビット +-------------------------------- XOR +10010010101111001101100100111001 +先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: +00100101011110011011001001110010 シフト +00000100110000010001110110110111 除数の下位32ビット +-------------------------------- XOR +00100001101110001010111111000101 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +01000011011100010101111110001010 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +10000110111000101011111100010100 1バイト目の結果 + +10000001 入力の2バイト目 +-------------------------------- XOR +00000111111000101011111100010100 +先頭1ビットが0なので1ビットシフト +-------------------------------- シフト +00001111110001010111111000101000 +. +. +. +</code></pre> +<p> +これを実装したのが以下のコード:</p> +<pre><code>uint32_t +crc32(uint8_t *idata, size_t len) +{ + uint32_t pol = 0x04C11DB7; + uint32_t c = 0xFFFFFFFF; + uint32_t b; + + for (int i = 0; i &lt; len; i++) { + b = idata[i] &lt;&lt; 24; + c ^= b; + for (int j = 0; j &lt; 8; j++) { + c = c &gt;&gt; 31 & 1 ? c &lt;&lt; 1 ^ pol : c &lt;&lt; 1; + } + } + + return c; +} +</code></pre> +<p> +<code>main()</code>関数では上の<code>crc32()</code>に、<code>idata</code>として入力となるバイナリデータの先頭を、<code>len</code>として<code>252</code>を渡してCRC32を計算させる。その後、出力先のファイルに入力元のデータをコピーしていき、253バイト目から256バイト目だけ、計算したCRC32に置き換える。入力元のこの場所にデータが書き込まれていないかどうかは確かめていない。 +</p> + +<h2>UF2(USB Flashing Format)</h2> +<p> +Microsoftが開発したフラッシュ書き込み用のファイル形式らしい: +<blockquote cite="https://github.com/microsoft/uf2"> +<p> +UF2 is a file format, developed by Microsoft for PXT (also known as +Microsoft MakeCode), that is particularly suitable for flashing microcontrollers +over MSC (Mass Storage Class; aka removable flash drive)<sup>[6]</sup>. +</p> +</blockquote> +<p> +このファイルに変換する上で必要な情報はGitHubのmicrosoft/uf2<sup>[6]</sup>に表として纏められている: +<blockquote cite="https://github.com/microsoft/uf2"> +<table> +<thead><tr> +<th>Offset</th><th>Size</th><th>Value</th> +</tr></thead> +<tbody> +<tr> +<td>0</td> +<td>4</td> +<td>First magic number, <code>0x0A324655</code> (<code>"UF2\n"</code>)</td> +</tr> +<tr> +<td>4</td> +<td>4</td> +<td>Second magic number, <code>0x9E5D5157</code></td> +</tr> +<tr> +<td>8</td> +<td>4</td> +<td>Flags</td> +</tr> +<tr> +<td>12</td> +<td>4</td> +<td>Address in flash where the data should be written</td> +</tr> +<tr> +<td>16</td> +<td>4</td> +<td>Number of bytes used in data (often 256)</td> +</tr> +<tr> +<td>20</td> +<td>4</td> +<td>Sequential block number; starts at 0</td> +</tr> +<tr> +<td>24</td> +<td>4</td> +<td>Total number of blocks in file</td> +</tr> +<tr> +<td>28</td> +<td>4</td> +<td>File size or board family ID or zero</td> +</tr> +<tr> +<td>32</td> +<td>476</td> +<td>Data, padded with zeros</td> +</tr> +<tr> +<td>508</td> +<td>4</td> +<td>Final magic number, <code>0x0AB16F30</code></td> +</tr> +</tbody> +</table> +</blockquote> + +<p> +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バイト目にブロックの通し番号と総数をそれぞれ書き込めばいい。ブロックの通し番号はデータのついでに書き込めるが、総数はデータを全部さばいた後でないと分からないので、最後全てのブロックにまとめて書き込むようにした。できたのが以下のコード: +</p> +<pre><code>#include &lt;stdio.h&gt; +#include &lt;stdint.h&gt; +#include &lt;stdlib.h&gt; +#include &lt;string.h&gt; + + +size_t +fwrite32l(uint32_t d, FILE *f) +{ + int i; + uint8_t b; + for (i = 0; i &lt; 32; i += 8) { + b = (uint8_t) (d &gt;&gt; i & 0xff); + fwrite(&amp;b, 1, 1, f); + if (ferror(f)) { + fprintf(stderr, "Fwrite32l: write error.\n"); + return 0; + } + } + return 4; +} + +int +main(int argc, char *argv[]) +{ + FILE *src = NULL, *dst = NULL; + size_t sdata = 476; + int retnum = 0; + + uint32_t mag1 = 0x0A324655; + uint32_t mag2 = 0x9E5D5157; + uint32_t flags = 0x00002000; // familyID present + uint32_t addr = 0x10000000; + uint32_t nbyte = 256; + uint32_t blk = 0; + uint32_t nblk = 0; + uint32_t famid = 0xe48bff56; + uint8_t data[sdata]; + uint32_t mag3 = 0x0AB16F30; + + memset(data, 0, sdata); + + if (argc != 3) { + fprintf(stderr, "Usage: %s src dst\n", argv[0]); + exit(1); + } + + if ((src = fopen(argv[1], "rb")) == NULL) { + fprintf(stderr, "Could not open %s.\n", argv[1]); + retnum = 1; + goto defer; + } + if ((dst = fopen(argv[2], "wb")) == NULL) { + fprintf(stderr, "Could not open %s.\n", argv[2]); + retnum = 1; + goto defer; + } + + while (!feof(src)) { + fwrite32l(mag1, dst); + fwrite32l(mag2, dst); + fwrite32l(flags, dst); + fwrite32l(addr, dst); + fwrite32l(nbyte, dst); + fwrite32l(blk, dst); + fwrite32l(nblk, dst); // dummy + fwrite32l(famid, dst); + + fread(data, 1, nbyte, src); + if (ferror(src)) { + fprintf(stderr, "Read error: %s.\n", argv[1]); + retnum = 1; + goto defer; + } + fwrite(data, 1, sdata, dst); + if (ferror(src)) { + fprintf(stderr, "Write error: %s.\n", argv[2]); + retnum = 1; + goto defer; + } + + fwrite32l(mag3, dst); + + addr += nbyte; + blk++; + nblk++; + } + + for (int i = 0; i &lt; nblk; i++) { + if (i == 0) + if (fseek(dst, 24, SEEK_SET) &lt; 0) { + fprintf(stderr, "Seek error: %s.\n argv[2]"); + retnum = 1; + goto defer; + } + fwrite32l(nblk, dst); + if (i &lt; nblk - 1) + if(fseek(dst, 512 - 4, SEEK_CUR) &lt; 0){ + fprintf(stderr, "Seek error: %s.\n argv[2]"); + retnum = 1; + goto defer; + } + } + +defer: + if (src) + fclose(src); + if (dst) + fclose(dst); + return retnum; +} +</code></pre> +<p><code>fwrite32l()</code>関数は指定されたファイルに32ビットの整数を下位バイトから順に書き込む関数である。バイトオーダーとかややこしそうなので作っておいたけど必要なのかな?あと名前が気に入らない。</p> +<p> +CRC32のチェックサムが書き込まれたバイナリファイルを、このプログラムでUF2に変換し、生成されたファイルをUSBストレージとして接続したRP2040にコピーすればフラッシュROMに書き込まれる。 +</p> + +<h2>Flash Second Stage</h2> +<p> +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にデータをコピーすることなく命令を実行できるので、速くて便利だという。 +</p> +<p> +しかしこのSSIコントローラはSynopsysという会社のDW_apb_ssiというIPを使っているようで、データシートのSSIコントローラの章は多分Synopsysの人が書いている。その他の章はRaspberry Pi財団の書いたブリティッシュイングリッシュだが、この部分だけ多分ネイティブじゃない人の書いたいい加減な英語である。誤植も多い。何日かかけて理解しようとしたがよく分からん。不毛なので一旦諦めた。</p> +<p> +RP2040には内部にもROMがあり、はバージョン情報や電源を投入した時の動作、その他便利な関数が書き込まれている。この関数の中に外部のフラッシュROMとSSIコントローラを設定するものも含まれているので、今回はこれを利用した。ただしこの方法だとフラッシュROMとの通信方式がStandard SPIのままなので少し遅いらしい。詳しくはデータシートの「2.3.8. Bootrom Contents」を参照。 +</p> +<p> +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モードになる: +</p> +<pre><code>setup_xip: + ldr r3, rom_base + + ldrh r0, [r3, #0x14] // rom_func_table + ldr r1, =('C' | 'X' &lt;&lt; 8) // _flash_enter_cmd_xip() + ldrh r2, [r3, #0x18] // rom_table_lookup + blx r2 + blx r0 +/* ... */ +rom_base: + .word 0x00000000 +</code></pre> + +<p> +XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。Armのマニュアル<sup>[7]</sup>によると、初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:</p> +<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition"> +<table> +<caption> +Table 7.3. Exception numbers +</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> +</table> +</blockquote> + +<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table"> +<table> +<caption> +Table 7.4. Vector table format +</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> +</table> +</blockquote> +<p> +RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は256バイトでアラインする必要がある。ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からはラベルを使ってアクセスすることにする。以上をまとめると以下のコードになる:</p> +<pre><code> ldr r0, =vectors + ldr r1, m0plus_vtor + str r0, [r1, #0] // vector table + ldr r1, [r0, #4] // entry point + ldr r0, [r0, #0] // stack pointer + mov sp, r0 + bx r1 + +/* ... */ + +m0plus_vtor: + .word 0xe0000000 + 0xed08 +</code></pre> +<p>なお以上のコードは<code>.boot2</code>という名前のセクションにしてある。 +</p> + +<h2>メインのコード(<code>main.s</code>)</h2> + +<h3>ベクターテーブル</h3> +<p> +上で説明したように、ベクターテーブルのアドレスは256バイトの境界にないといけないが、<code>boot2.s</code>をフラッシュの最初の256バイトに配置しており、<code>main.s</code>はその直後から始まるようにリンクする。そのためメインのコードの最初にベクターテーブルを配置すればいい。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、<code>.global</code>宣言をつけておく: +</p> +<pre><code> .global vectors +vectors: + .word 0x20040000 // initial SP + .word (reset+1) +</code></pre> +<p> +<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> + +<h3>GPIOの設定</h3> +<p> +電源投入直後、RP2040の周辺機器はリセット状態になっている。まずは今回利用するGPIOのリセット状態を解除する必要がある。データシートの「2.14. Subsystem Resets」には以下のように書かれている: +</p> +<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> +<p> +Every peripheral reset by the reset controller is held in reset at power-up. +It is up to software to deassert the reset of peripherals it intends to use. +</p> +</blockquote> +<p> +リセット状態を解除するには、RESETS_BASE(<code>0x4000c000</code>)から<code>0x0</code>バイト目のRESETS: RESETレジスタのうち利用したい周辺機器のビットを<code>0x0</code>にすればいい。 +GPIOはIO Bank 0なので(これ明記されてなくない?)、RESETS: RESETレジスタのIO_BANK0(5番ビット)を<code>0x0</code>にする。 +</p> +<h4>レジスタのアトミックなクリア</h4> +<p> +RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>にしたい。この時、まずこのレジスタを読み込んでから<code>~(1 &lt;&lt; 5)</code>と論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを一回の<code>str</code>でしかもアトミックにできる機能が用意されている。今回の場合アトミックかどうかは関係ないと思うけど。</p> +<p> +各レジスタには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> +<h4>リセット状態の確認</h4> +<p>リセットの解除はすぐに完了するわけではないようである。リセットの解除が完了したかどうか確認するにはRESETS: RESET_DONEレジスタ(RESETS_BASEから<code>0x8</code>バイト目)の該当するビット(ここでは5番目のビット)を読む。この値が<code>0x1</code>であればリセットの解除が完了している。<code>0x0</code>であれば処理が進行中なので<code>0x1</code>が返ってくるまで繰り返し読み込んで<code>0x0</code>になるまで待機する。ところでこのレジスタはリセットの解除が完了したかどうか確かめるものなので、RESET_DONEという名前はどうなん? +<p> +以上から、GPIOのリセットを解除するのは以下のコード: +</p> +<pre><code>reset: + // unreset gpio + mov r0, #1 + lsl r0, r0, #5 // io_bank0 + ldr r3, resets_base + ldr r1, atomic_clr + str r0, [r3, r1] // RESETS: RESET +reset_chk: + ldr r1, [r3, #0x8] // RESETS: RESET_DONE + tst r0, r1 + beq reset_chk + +/* ... */ + +atomic_clr: + .word 0x00003000 +resets_base: + .word 0x4000c000 +</code></pre> + +<h3>GPIOの機能の選択</h3> +<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> +<p> +GPIO25番の機能を選択するにはIO_BANK0_BASE(<code>0x40014000</code>)から<code>0xcc</code>番目のGPIO25_CTRLレジスタの下位5ビットに、該当する機能の番号を書き込めばいい。データシートの「2.19.2 Function Select」にある表を見ると、GPIO25番のSIOは5である:</p> +<pre><code> // set gpio functions + ldr r3, io_bank0_base + mov r0, #5 // sio + mov r1, #0xcc + str r0, [r3, r1] // IO_BANK0: GPIO25_CTRL + +/* ... */ + +io_bank0_base: + .word 0x40014000 +</code></pre> + +<h3>GPIOの出力を有効化</h3> +<p> +GPIO25番がSIOになったので、次にこのピンからの出力を有効化する。既定値では出力は無効になっている。ハイインピーダンスってことなのかな?出力を有効にするには、SIO_BASE(<code>0xd0000000</code>)から<code>0x24</code>バイト目のSIO: GPIO_OEレジスタの該当するビット(25番のピンなので25番ビット)を<code>0x1</code>にする: +</p> +<pre><code> // enable gpio output + ldr r3, sio_base + mov r0, #1 + lsl r0, r0, #25 // gpio25 + str r0, [r3, #0x24] // SIO: GPIO_OE + +/* ... */ + +sio_base: + .word 0xd0000000 +</code></pre> + +<h3>LEDの点滅</h3> +<p>以上でGPIOの設定は完了したので、あとは実際にLEDに電圧を掛けるだけである。レジスタのアドレスに<code>0x1000</code>を足したものに書き込むとアトミックなレジスタのXORができると書いたが、SIOはこの機能がサポートされていないようである。データシートの「2.1.2 Atomic Register Access」に、 +</p> +<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> +<p> +The SIO (Section 2.3.1), a single-cycle IO block attached directly to the cores' +IO ports, does <strong>not</strong> support atomic accesses at the bus level, +although some individual registers (e.g. GPIO) have set/clear/xor aliases. +</p> +</blockquote> +<p> +と書かれている。そのかわりここにも書かれている通り、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> + +<pre><code> // blink led on gpio25 + ldr r4, sio_base + mov r5, r0 // r0 = 1 &lt;&lt; 25 +loop: + str r5, [r4, #0x1c] // SIO: GPIO_OUT_XOR + bl delay + b loop + +delay: + mov r0, #1 + lsl r0, r0, #20 +delay_loop: + sub r0, r0, #1 + bne delay_loop + bx lr + +/* ... */ + +sio_base: + .word 0xd0000000 +</code></pre> +<p>なお以上のコードは<code>.text</code>セクションである。</p> + +<h2>リンカスクリプト</h2> +<p> +以上のコードには<code>.boot2</code>、<code>.text</code>の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.text</code>はその後ろに続くように配置する: +<pre><code>MEMORY +{ + FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k +} + +SECTIONS +{ + .boot2 : { + *(.boot2) + . = 0x100; + } > FLASH + + .text : { + *(.text) + } > FLASH +} +</code></pre> + +<h2>Makefile</h2> +<p> +以上のソースコードは以下のように配置している: +</p> +<pre>rp2040 +├── ex1 +│   ├── Makefile +│   ├── boot2.s +│   ├── main.s +│   └── memmap.ld +└── tools + ├── Makefile + ├── bin2uf2.c + └── bincrc.c +</pre> +<p> +toolsディレクトリのMakefileは同じディレクトリのソースファイルを<code>$(CC)</code>でコンパイルするだけのものである(個人的な趣味で<code>tcc</code>を使っている)。ex1ディレクトリのMakefileは以下の通り: +</p> +<pre><code>AS = arm-none-eabi-as +LD = arm-none-eabi-ld +OBJCOPY = arm-none-eabi-objcopy +BINCRC = ../tools/bincrc +BIN2UF2 = ../tools/bin2uf2 + +MCPU = -mcpu=cortex-m0plus +ASFLAGS = $(MCPU) +CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c +LDFLAGS = --no-relax -nostdlib + +all: tools led.uf2 + +clean: + rm -f *.o *.elf *.uf2 *.bin + cd ../tools &amp;&amp; make clean + +.s.o: + $(AS) $(ASFLAGS) -o $@ $&lt; + +led.elf: boot2.o main.o memmap.ld + $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o main.o + +led.bin: led.elf + $(OBJCOPY) -O binary led.elf $@ + +led.uf2: led.bin + $(BINCRC) led.bin led_crc.bin + $(BIN2UF2) led_crc.bin $@ + +flash: all + mount /dev/disk/by-label/RPI-RP2 /mnt + cp led.uf2 /mnt + +tools: + cd ../tools &amp;&amp; make +</code></pre> + +<p> +RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し、ex1ディレクトリで</p> +<pre><code>$ make +# make flash +</code></pre> +<p> +とすればプログラムがRP2040のボードに書き込まれて実行が開始される。</p> + +<h2>最後に</h2> +<p> +光あれ。 +</p> + +<h2>参考</h2> +<ul> +<li> +[1] Hennesy, J. L. and Patterson, D. A. 2017. Computer Organization And Design RISC-V Edition. +</li> +<li> +[2] <a href="https://akizukidenshi.com/catalog/g/gK-17542/">RP2040マイコンボードキット.秋月電子通商</a> +</li> +<li> +[3] <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> +</li> +<li> +[4] <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> +</li> +<li> +[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> +</li> +<li> +[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a> +</li> +<li> +[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> +</li> +</ul> + diff --git a/content/computer/rp2040_2.html b/content/computer/rp2040_2.html @@ -0,0 +1,401 @@ ++++ +date = '2024-02-22T00:00:00+09:00' +draft = false +title = 'RP2040 SDKなし2 Clock、UART' ++++ +<time>2024-02-22</time><br /> +<time>2024-02-27</time>: リセット解除の間違いを修正。 +<p> +今回はClockとUARTを設定してパソコンに繋ぎ、キーボードからの入力をオウム返しするプログラムを作成する。 +<p> +<p> +前回: <a href="rp2040_1.html">RP2040 SDKなしでLチカ</a><br> +ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex2 +</p> + +<h2>動作環境</h2> +<ul> +<li>Void Linux + <ul> + <li>cross-arm-none-eabi-binutils-2.32_2</li> + <li>GNU Make 4.4.1</li> + <li>minicom version 2.7.1</li> + </ul> +</li> +<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> +</li> +</ul> + +<h2>Clock</h2> + +<h3>リング発振回路</h3> +<p>RP2040にはリング発振回路というのが内蔵されている。これは自分の出力を反転させようとするもので、不安定だが高速で消費電力の少ないクロックとして用いられる。RP2040は電源を入れると、このリング発振回路を動作用のクロックとして用いている。この発振回路の周波数は、チップの製造過程での誤差、動作時の電圧、動作温度によって変動するので、正確な周波数が必要な用途には向かない。</p> + +<h3>水晶発振子</h3> +<p>秋月電子通商で購入したRP2040マイコンボードには外部クロックとして、12MHzの水晶発振子が付属する。水晶発振子はリング発振回路より電力を消費するが、より正確である。</p> + +<h3>PLL</h3> +<p>水晶振動子を入力として、周波数を数倍にしたものを出力するもの。電気的な話はよく知らない。データシートの「2.18.2. Calcurating PLL parameters」によると、入力周波数を<code>FREF</code>としたときの出力周波数は<code>(FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2)</code>となる。これらの変数はそれぞれ設定用のレジスタに値を保存することで変更できる。</p> + +<h2>UART</h2> +<p> +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> +<pre><code>$ minicom -D /dev/ttyUSB0 +</code></pre> +<p> +とすると接続できる。 +</p> + +<h2>main.s</h2> +<h3>初期設定</h3> +<p> +後で見るように、UARTの動作には多分水晶発振子とPLLが必要なので、まずはそれを設定する。起動後、メインのプログラムが読み込まれるまでの<code>boot2</code>は前回と同じものである。<code>main.s</code>ではまず前回と同様に初期スタックポインタとエントリーポイントを定義する: +</p> +<pre><code> .section .vectors +vectors: + .word 0x20040000 // initial SP + .word (reset+1) // entry point +</code></pre> +<p> +続いて利用するサブシステムのリセットを解除する。PLLとUARTが追加されている。今回使うUARTはUART0だけである。なお、UARTはclock_periが有効化されるまでリセット状態の解除が完了しないようなので、unreset_chkからは外してある:</p> +<pre><code> .section .text +reset: + // unreset gpio, pll_sys, uart0 + ldr r0, =(1 &lt;&lt; 22 | 1 &lt;&lt; 12 | 1 &lt;&lt; 5) // uart0 | pll_sys | io_bank0 + ldr r3, resets_base + ldr r1, atomic_clr + str r0, [r3, r1] // RESETS: RESET + mov r1, #1 + lsl r1, #22 + bic r0, r1 // uart stays in reset state until clock_peri is enabled +unreset_chk: + ldr r1, [r3, #0x8] // RESETS: RESET_DONE + bic r0, r1 + bne unreset_chk + +/* ... */ + +atomic_clr: + .word 0x00003000 +resets_base: + .word 0x4000c000 +</code></pre> + +<h3>GPIOの設定</h3> +<p> +次にGPIOの役割を設定する。前回はLEDを点滅させるためにGPIO25をSIOに設定したが、今回はGPIO0とGPIO1をUART0にする: +</p> +<pre><code> // set gpio functions + ldr r3, io_bank0_base + mov r0, #2 // uart0 + mov r1, #0x4 + str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL + mov r1, #0xc + str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL + +/* ... */ + +io_bank0_base: + .word 0x40014000 +</code></pre> + +<h3>Clockの設定</h3> +<p> +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>で、 +</p> +<pre><code>#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER) +</code></pre> +<p> +と定義されている(PICO_XOSC_STARTUP_DELAY_MULTIPLIERは1)。とりあえず47に設定しているが、試しに0や1にしても動いた。よくわからん。</p> +<p> +待ち時間を設定したら発振子を起動する。XOSC: CTRLに起動用のコマンド的なものを入力し、周波数が安定するのを待つ。</p> +<p> +以上を実装したのが以下のコード: +</p> +<pre><code> // setup xosc + ldr r3, xosc_base + mov r0, #47 // start up delay for 12MHz rosc (xosc?) + str r0, [r3, #0xc] // XOSC: STARTUP + ldr r0, =(0xfab &lt;&lt; 12 | 0xaa0) + str r0, [r3, #0] // XOSC: CTRL +wait_xosc: + ldr r0, [r3, #0x4] // XOSC: STATUS + lsr r0, r0, #31 // STABLE bit + beq wait_xosc + +/* ... */ + +xosc_base: + .word 0x40024000 +</code></pre> + +<h3>PLLの設定</h3> +<p> +水晶発振子が起動できたので、次にPLLを設定する。CPUが133MHzまで対応しているので133MHzになるようにした。</p> +<p> +PLLは入力となる振動(ここでは水晶発振子の振動)を加工して周波数を上げたり下げたりする。出力の周波数は以下の式で決まる: +</p> +<pre>(FREF / REFDIV) * FBDIV / (POSTDIV1 * POSTDIV2)</pre> +<p> +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つの値の差が大きい方がいいと書いている)。 +</p> +<p> +PLL設定の手順は、FBDIVの設定、PLLとVCOの起動、VOCが安定するまで待機、POSTDIV1とPOSTDIV2の設定、Post Dividerの起動、そして最後にシステムとUARTのクロックを今設定したPLLに変更、である。以上を実装したのが以下のコード: +</p> +<pre><code> // setup pll_sys 133MHz + ldr r3, pll_sys_base + // set feedback divider + mov r0, #133 + str r0, [r3, #0x8] // PLL: FBDIV_INT + // power on pll and vco + ldr r0, =(1 &lt;&lt; 5 | 1) // VCOPD | PD + ldr r1, atomic_clr + add r1, r1, #0x4 + str r0, [r3, r1] // PLL: PWR + // wait vco to lock +wait_vco: + ldr r0, [r3, #0] // PLL: CS + lsl r0, r0, #31 + beq wait_vco + // setup post dividers + ldr r0, =(4 &lt;&lt; 16 | 3 &lt;&lt; 12) + str r0, [r3, #0xc] // PLL: PRIM + // power on post divider + mov r0, #8 // POSTDIVPD + str r0, [r3, r1] // PLL: PWR + + // set system clock clksrc_pll_sys + ldr r3, clocks_base + ldr r0, =(0x0 &lt;&lt; 5 | 0x1) + str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL + // enable clk_peri + mov r0, #1 + lsl r0, r0, #11 + str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL + +/* ... */ + +atomic_clr: + .word 0x00003000 +clocks_base: + .word 0x40008000 +pll_sys_base: + .word 0x40028000 +</code></pre> + +<h3>UARTの設定</h3> +<p> +データシートによるとUART設定の手順は以下の通り: +</p> +<ul> +<li>リセットの解除</li> +<li>clock_periの設定</li> +<li>UARTの有効化</li> +<li>FIFOの有効化</li> +<li>転送速度の設定</li> +<li>フォーマットの設定</li> +</ul> +<p> +上の2つは既に終えている。残りの部分はこの順番どおりに設定しても動かなかった。C言語で書かれたサンプルを見ると、クロックを設定した後、転送速度の設定、UARTの有効化、FIFOの有効化の順になっている。そのとおりにすると動いた。理由はよく理解していないが、変数を設定してから起動するほうが素直ではある。</p> +<p> +転送速度はminicomのデフォルトである115200 baudに設定する。データシート「4.2.7.1. Baud Rate Calculation」の計算式において、クロック周波数を125MHzから133MHzに変えて計算して、BRDI=72、BDRF=0.157(=10/64)となる。この数値をUART: UARTIBRD、UART: UARTFBRDレジスタにそれぞれ代入する。 +</p> +<p> +UARTの有効化はUART: UARTCRレジスタのUARTENビットをセットすることで行う。C言語のサンプルでは同じレジスタのRXE、TXEビットもセットしているが、この2つはもともと1になっているのでほっといてよさそう。</p> +<p> +FIFOの有効化はUART: UARTLCR_HレジスタのFENビットをセットすることで行う。また、同じレジスタの他のビットで、データーのフォーマットを設定できる。ここではminicomのデフォルトに合わせてWLENを8bitにする。</p> +<p> +以上をまとめると以下のようになる: +</p> +<pre><code> // setup uart0 + ldr r3, uart0_base + // set baudrate 115200 + // BDRI = 72, BDRF = 0.157 (10 / 64) + mov r0, #72 + str r0, [r3, #0x24] // UART: UARTIBRD + mov r0, #10 + str r0, [r3, #0x28] // UART: UARTFBRD + // enable uart0 + mov r0, #1 // UARTEN + ldr r1, atomic_set + add r1, r1, #0x30 + str r0, [r3, r1] // UART: UARTCR + // enable FIFO and set format + ldr r0, =(3 &lt;&lt; 5 | 1 &lt;&lt; 4) // WLEN = 8, FEN = 1 + str r0, [r3, #0x2c] // UART: UARTLCR_H + +/* ... */ + +atomic_set: + .word 0x00002000 +uart0_base: + .word 0x40034000 +</code></pre> + +<h3>UARTの入出力</h3> +<p> +設定が終わったので実際にUARTの入出力を処理するコードを書く。まずUARTからの出力は、出力したいバイトをUART: UARTDRに書き込むことで行う。その際、書き込まれたデータは一時的に出力用FIFOに保持されるので、このFIFOが満杯でないことを確認する必要がある。FIFOの状態はUART: UARTFRレジスタで確認できる。このレジスタのTXFFの値が1であればデータを書き込めないので、0になるまで待機する。関数名は<code>putbyte</code>にした。また出力したいデータは<code>r0</code>レジスタにの下位8ビットに入れられているものとした。書き込めるデーターは8ビットだけなので、<code>0xff</code>と論理積をとってから書き込んでいる: +</p> +<pre><code>putbyte: + ldr r3, uart0_base + mov r1, #1 + lsl r1, r1, #5 // TXFF +txff: + ldr r2, [r3, #0x18] // UART: UARTFR + tst r1, r2 + bne txff + mov r1, #0xff + and r0, r0, r1 + str r0, [r3, #0] // UART: UARTDR + bx lr + +/* ... */ + +uart0_base: + .word 0x40034000 +</code></pre> + +<p> +入力はUART: UARTDRの下位8ビットを読むことで得られる。UARTからの入力は、一時的に入力用FIFOに保存される。このFIFOが空の状態でデータを読んでも意味がないので、FIFOが空でないことを確認する必要がある。これはUART: UARTFRレジスタのRXFEを読むことで確認できる。本来は入力があったときに割り込みを発生させて、それまではCPUを休ませるか別の処理をさせておくべきだが、とりあえずここではループでFIFOの状態を確認し続けている。関数名は<code>getbyte</code>にした。 +読み込んだデータは<code>r0</code>レジスタに保存している:</p> +<pre><code>getbyte: + ldr r3, uart0_base + mov r1, #1 + lsl r1, r1, #4 // RXFE +rxfe: + ldr r2, [r3, #0x18] // UART: UARTFR + tst r1, r2 + bne rxfe + ldr r0, [r3, #0] // UART: UARTDR + mov r1, #0xff + and r0, r0, r1 + bx lr + +/* ... */ + +uart0_base: + .word 0x40034000 +</code></pre> +<p> +あとはこの2つの関数をループの中で交互に呼び出せば、オウム返しするだけのプログラムが完成する: +</p> +<pre><code>loop: + bl getbyte + bl putbyte + b loop +</code></pre> + +<h2>リング発振回路でUARTは動くんかな?</h2> +<p>UARTの通信には正確なクロックが必要である。その為上では<code>clk_peri</code>として水晶発振子とPLLを用いた。ところがpico-examplesのhello_uartでは<code>main()</code>関数で水晶発振子を設定していない。そこでリング発振回路を用いてみたのだが、どうもうまく通信できない。出力されている正確な周波数も分からないのであきらめることにした。オシロスコープなんていうものは持っていない。</p> + +<h3>pico-sdk</h3> +<p> +ところがどうも調べているとSDKを使った場合、デフォルトではクロック周波数は125MHzになっているらしい。どうやら水晶発振子もPLLも<code>main()</code>が呼ばれる前に設定されているようである。</p> +<p> +pico-examplesのサンプルプログラムはビルドすると自動で逆アセンブリしたファイルを出力してくれる。これを見ると、最初の256バイトは前回説明したboot2のコードで、その後ろにベクターテーブルが続く。ベクターテーブルの最初は初期スタックポインタで、<code>0x20042000</code>になっている。次はエントリーポイントで、<code>0x100001f7</code>である:</p> +<pre><code>10000100 &lt;__VECTOR_TABLE&gt;: +10000100: 20042000 .word 0x20042000 +10000104: 100001f7 .word 0x100001f7 +</code></pre> +<p> +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ではユーザープログラムの一部として組み込んでるんかな? +</p> +<pre><code>100001f6 &lt;_reset_handler&gt;: +100001f6: 481d ldr r0, [pc, #116] ; (1000026c &lt;hold_non_core0_in_bootrom+0xe&gt;) +100001f8: 6800 ldr r0, [r0, #0] +100001fa: 2800 cmp r0, #0 +100001fc: d12f bne.n 1000025e &lt;hold_non_core0_in_bootrom&gt; +</code></pre> +<p>上のコードの最初の<code>ldr</code>は、<code>0xd0000000</code>(M0PLUS: CPUIDレジスタ)をロードしている。最後の飛び先<code>0x1000025e</code>はCPUIDが<code>1</code>のCPUを待機させる処理である:</p> +<pre><code>1000025e &lt;hold_non_core0_in_bootrom&gt;: +1000025e: 4809 ldr r0, [pc, #36] ; (10000284 &lt;hold_non_core0_in_bootrom+0x26&gt;) +10000260: f001 fb9c bl 1000199c &lt;rom_func_lookup&gt; +10000264: 4700 bx r0 +10000266: 0000 .short 0x0000 +/* ... */ +10000284: 00005657 .word 0x00005657 +</code></pre> +<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> +<pre><code>$ find pico-sdk/src -type f | xargs grep -l _reset_handler +pico-sdk/src/rp2_common/pico_standard_link/crt0.S +</code></pre> +<p>このファイルによると: +</p> +<pre><code> // Only core 0 should run the C runtime startup code; core 1 is normally + // sleeping in the bootrom at this point but check to be sure +</code></pre> +<p>だそうである。やっぱり無駄やん。内蔵フラッシュのプログラムにバグがあってもこのコードのせいで見付かりにくくなってない?知らんけど。</p> + +<p>続いて<code>.data</code>領域と<code>.bss</code>領域のコピー、初期化のようである。多分OSの本かなんかで習ったメモリマップの話:</p> +<pre><code>100001fe: a40d add r4, pc, #52 ; (adr r4, 10000234 &lt;data_cpy_table&gt;) +10000200: cc0e ldmia r4!, {r1, r2, r3} +10000202: 2900 cmp r1, #0 +10000204: d002 beq.n 1000020c &lt;_reset_handler+0x16&gt; +10000206: f000 f812 bl 1000022e &lt;data_cpy&gt; +1000020a: e7f9 b.n 10000200 &lt;_reset_handler+0xa&gt; +1000020c: 4918 ldr r1, [pc, #96] ; (10000270 &lt;hold_non_core0_in_bootrom+0x12&gt;) +1000020e: 4a19 ldr r2, [pc, #100] ; (10000274 &lt;hold_non_core0_in_bootrom+0x16&gt;) +10000210: 2000 movs r0, #0 +10000212: e000 b.n 10000216 &lt;bss_fill_test&gt; + +10000214 &lt;bss_fill_loop&gt;: +10000214: c101 stmia r1!, {r0} + +10000216 &lt;bss_fill_test&gt;: +10000216: 4291 cmp r1, r2 +10000218: d1fc bne.n 10000214 &lt;bss_fill_loop&gt; +</code></pre> + +<p>最後にいろいろ呼びだす:</p> +<pre><code>1000021a &lt;platform_entry&gt;: +1000021a: 4917 ldr r1, [pc, #92] ; (10000278 &lt;hold_non_core0_in_bootrom+0x1a&gt;) +1000021c: 4788 blx r1 +1000021e: 4917 ldr r1, [pc, #92] ; (1000027c &lt;hold_non_core0_in_bootrom+0x1e&gt;) +10000220: 4788 blx r1 +10000222: 4917 ldr r1, [pc, #92] ; (10000280 &lt;hold_non_core0_in_bootrom+0x22&gt;) +10000224: 4788 blx r1 +10000226: be00 bkpt 0x0000 +10000228: e7fd b.n 10000226 &lt;platform_entry+0xc&gt; +/* ... */ +10000278: 10001819 .word 0x10001819 +1000027c: 100002dd .word 0x100002dd +10000280: 10001909 .word 0x10001909 +</code></pre> +<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> +<pre><code>$ find pico-sdk/src -type f | xargs grep -l runtime_init +pico-sdk/src/rp2_common/pico_runtime/runtime.c +pico-sdk/src/rp2_common/pico_standard_link/crt0.S +pico-sdk/src/common/pico_sync/include/pico/mutex.h +</code></pre> +<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> +<pre><code> clock_configure(clk_peri, + 0, + CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS, + 125 * MHZ, + 125 * MHZ); +</code></pre> +<p>やっぱり水晶発振子じゃないとあかんのかな。</p> + +<h2>CMake</h2> +<p>上ではビルドしたバイナリを逆アッセンブルして読んだ。わざわざこんなことをしなくてもMakefile読めばなにがどうなって最終生成物に辿りつくのか分かればいいのだが、そうもいかない。このSDKとpico-examplesにはビルドシステムとしてCMakeなるものが使われている。これがどうも複雑でよく分からない。勉強する気にもならん。上で見た<code>crt0.S</code>や<code>runtime.c</code>といったファイルも<code>hello_uart</code>で本当に使われているものなのかもよく分からない。こんな煩雑なものは本当に必要なのかな。無駄に複雑にしてるだけとちゃうんかな。特に僕は勉強用に使ってるので、ソースコードの依存関係をもっと分かりやすくしてくれないと、内部でなにがどうなってるのか理解しにくい。何度か頑張って読もうとしたが、面白くないのでやめた。数百行のファイルをあっちからこっちから<code>include</code>してるし、大文字ばかりの変数だらけで目が痛い。こんなものを扱えるというのはえらいええ頭してはるんやね。</p> + + +<h2>参考</h2> +<ul> +<li> +<a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> +</li> +<li> +<a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> +</li> +<li> +<a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> +</li> +<li> +<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> +</li> +<li> +<a href="https://www5.epsondevice.com/ja/information/technical_info/osc.html">水晶発振器とは? 原理と仕組み、水晶振動子との違い、選び方のポイントを解説.エプソン水晶デバイス</a> +</li> +</ul> + diff --git a/content/computer/rp2040_3_interrupt.html b/content/computer/rp2040_3_interrupt.html @@ -0,0 +1,160 @@ ++++ +date = '2025-08-27T00:00:00+09:00' +draft = false +title = 'RP2040 SDKなし3 割り込み' ++++ +<time>2025-08-27</time><br /> +<p> +前回UARTで通信する際、FIFOにデータが届いていないかを確認しつづけていた(ポーリング)。 +これでは電力がもったいないので、データが届くまでCPUは休ませておいて、 +届いたときだけ処理を実行するように変更する(割り込み)。 +<p> +<p> +前回: <a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a><br> +ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex3_interrupt +</p> + +<h2>動作環境</h2> +<ul> +<li>OpenBSD 7.7 + <ul> + <li>arm-none-eabi-binutils-2.40</li> + <li>OpenBSD Make</li> + <li>minicom version 2.8</li> + </ul> +</li> +<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> +</li> +</ul> + +<h2>割り込み</h2> +<p> +ハードウェアが外部から信号を受けとると、CPUに現在の処理を中断させてその信号を処理させるようにできる。これを割り込み処理という。今回はUARTにデータが届いた時に同じデータをUARTに書き込むようにしたい。</p> + +<h3>割り込みを有効化</h3> +<p> +割り込みの信号を受け取るために、割り込みを有効化する。CPUが割り込みを受け付けるようにする設定と、UARTが割り込み信号を発生させるようにする設定が必要である。</p> +<p> +CPU側の設定は<code>M0PLUS: NVIC_ISER</code>レジスタの有効化したい割り込みのビットに1を書くことで行う。有効化できる割り込みは全部で26個ある。割り込みの種類はrp2040のデータシート[1]のTable 80. Interruptsに書いてある。今回有効化するのはUART0の割り込みで、この表から20番が割り当てられていることが分かるので、<code>M0PLUS: NVIC_ISER</code>に、下から20番目のビットを1にしたもの書き込む:</p> +<code><pre> // enable uart interrupt in cpu + ldr r4, ppb_base + mov r5, #0xe1 + lsl r5, #8 + mov r0, #1 + lsl r0, #20 + str r0, [r4, r5] // M0PLUS: NVIC_ISER + +/* ... */ + +ppb_base: + .word 0xe0000000 +</pre></code> +<p> +UART側の設定は、<code>UART: UARTIMSC</code>レジスタで行なう。データを受け取ったときに割り込みを発生させたいので、<code>RXIM</code>ビットに1を書き込む。また、処理を開始する前に既にFIFOにデータがたまっている可能性があるので、FIFOが空ではないときに割り込みを発生させるように、<code>RTIM</code>にも1を書き込む:</p> +<code><pre> // enable uart interrupt in uart0 subsystem + ldr r1, uart0_base + mov r2, #(1 &lt;&lt; 6 | 1 &lt;&lt; 4) // RTIM | RXIM + str r2, [r1, #0x38] // UART: UARTIMSC +</pre></code> +<p> +また、FIFOにデータがきたらすぐに割り込みを発生させたいので、<code>UART: UARTIFLS</code>レジスタの<code>RXIFLSEL</code>に0を書き込む。これでFIFOの1/8が埋まったら割り込みが発生する。</p> +<code><pre> // set fifo level to 0 + mov r2, #0 + str r2, [r1, #0x34] // UART: UARTIFLS +</pre></code> +<p> +これだとFIFOに届いた瞬間には割り込みがおこらない気がするが、pico-sdk(src/rp2_common/hardware_uart/include/hardware/uart.h)の<code>uart_set_irqs_enabled</code>関数でもこうなってる。FIFOを無効にすれば即座に割り込みがおこるかもしれないが、データが失われる可能性もあるのかな。</p> + +<h3>ベクターテーブルの設定</h3> +<p> +外部からの信号で割り込みが発生したときに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> +<code><pre> .global vectors +vectors: + .word 0x20040000 // initial SP + .word (reset+1) // entry point + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + .word 0xdeadbeef + + .word (uart_interrupt_handler+1) // UART0_IRQ +</pre></code> + +<h3>割り込み処理</h3> +<p> +割り込み発生時に呼ばれる関数はUARTのFIFOに届いたデータをそのまま送信するだけのものである:</p> +<code><pre> // uart_interrupt_handler echos the data arrived at uart0 +uart_interrupt_handler: + push {lr} + bl getbyte + bl putbyte + pop {pc} +</pre></code> +<p> +<code>getbyte</code>、<code>putbyte</code>は前回と同じもの。 +</code> + +<h2>メインループ</h2> +<p> +UARTにデータが届いていないときは特にすることがないのでCPUは寝かせておく。ARMには割り込みが発生するまでなにもしない<code>wfe</code>という命令があるのでこれを使う:</p> +<code><pre>loop: + wfe + b loop +</pre></code> + +<h2>完成</h2> +<p> +これで完成。動作は前回と全く同じだが、消費電力をおさえられる。</p> + +<h2>参考</h2> +<ul> +<li> +[1]. <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> +</li> +<li> +[2]. <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> +</li> +<li> +[3]. <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> +</li> +</ul> + diff --git a/content/computer/rtx1200-qos.html b/content/computer/rtx1200-qos.html @@ -0,0 +1,118 @@ ++++ +date = '2022-01-14T00:00:00+09:00' +draft = false +title = 'ルーター(RTX1200)のQoS機能を利用して帯域を制限した' ++++ +<time>2022-01-14</time>作成 +<h2>はじめに</h2> +<p>一人暮らししていた頃節約にはまり、下宿の固定回線を解約したうえ、携帯の回線を128kbpsしかでないものに変更したことがある。以来通信費をどうやって抑えるかあれこれ考えてきた。現在は実家に暮らしていて、家で契約している光回線を使わせてもらっている。携帯の方は楽天モバイルであり、外で使うことはまずないので毎月の支払いは発生していない。しかしいずれこの家をでた時に、楽天モバイルの回線だけでは結局月々3278円と大きな出費になる。また、通信速度が遅い生活というのは雑音の少ない充実したものであった経験もある。こんなことを考えていたところ、通信速度が128kbpsだが無料で利用できる格安sim<sup>[1]</sup>を発見した。この速度に慣れておけば、通信費が全くかからない生活ができる。ということで家で使っているルーターの設定を変更し、通信帯域を制限してみた。</p> +<h2>機材</h2> +<ul> + <li>ルーター: Yamaha RTX1200</li> + <li>無線アクセスポイント: elecomのルーター</li> + <li>パソコン: Lenovo x220</li> + <li>パソコンのOS: OpenBSD 7.0</li> +</ul> +<h2>設定したい内容</h2> +<p>RTX1200のLAN2ポートにWANが接続されており、LAN1には家で使っている端末がいろいろ接続されている。LAN3は今回は関係ないので割愛する。LAN1を2つのvlanに分割し、1-7番のポートをvlan1、8番のポートをvlan2する。そしてこのvlan2とインターネットとの通信を上下とも128kbpsに制限する。vlan2と他のlanとの通信は制限しない。vlan2にelecomのルーターを無線アクセスポイントとして接続し、僕が使うパソコンやスマホはこのアクセスポイントに接続する。</p> +<figure> +<pre> + Internet + | + ┌-------┬-----------┬-┴--┬----┐ + |RTX1200|LAN1 |LAN2|LAN3| + └-------┴-┬-------┬-┴----┴----┘ + vlan1 vlan2 + 192.168.100.1 192.168.101.1 + | | + ┌------------┐ | | ┌-----------┐ ┌-----┐ + |home network├--┘ └----┤elecom wifi├---┤my PC| + └------------┘ └-----------┘ └-----┘ + 192.168.100.0/24 192.168.101.0/24 +</pre> +<figcaption>図1: 接続と設定の概略</figcaption> +</figure> + +<h2>vlanについて</h2> +<p>ヤマハのページにvlanについて以下のような説明がある:</p> +<blockquote cite="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">物理的な接続形態に依存せず仮想的にグループを形成してひとつのLANとみなすものが、VLAN(Virtual LAN)です。VLANには、スイッチの物理ポート単位でVLANを形成するポートベースVLANと、パケットにタグと呼ばれるヘッダを付加してVLAN情報を格納するタグVLANとがあります<sup>[2]</sup>。</blockquote> +<p> +ここではLAN1にある8つのポートをvlanによって2つの論理的なLANに分割する。しかしこの後設定するクラス分けでは送信元や宛先のアドレスによる分類ができるので帯域幅を制限したい端末のIPアドレスを固定しておくだけでよかったんやけどな。 +</p> + +<h2>クラス分けについて</h2> +<p>クラス分けについてヤマハのページに以下のような説明がある:</p> +<blockquote cite="https://network.yamaha.com/knowledge/qos">優先して転送するデータを判別するために、受信したデータを分類します。<br /> +データの分類には、転送データに含まれている情報を使用します。<sup>[3]</sup></blockquote> +<p> +各ポートから出ていくパケットについて、そのパケットの送信元アドレスや宛先アドレス等の情報に基づきクラスに分類する。このクラス毎に様々な処理が可能なのだが[要出典]、今回はvlan2とインターネットとの通信をクラス1として、このクラスに対して帯域幅を128kbpsに制限する。 +</p> + +<h2>実際の設定</h2> +<p>RTX1200において行った設定は以下の通り。ただし、LAN2にppの設定をし、LAN1とインターネットとの通信ができるところまでは既に設定済みとし、以降の変更点だけ抜粋する。</p> +<p>始めにLAN1を2つのvlanに分割する: +<pre><code># vlan port mapping lan1.1 vlan1 +# vlan port mapping lan1.2 vlan1 +# vlan port mapping lan1.3 vlan1 +# vlan port mapping lan1.4 vlan1 +# vlan port mapping lan1.5 vlan1 +# vlan port mapping lan1.6 vlan1 +# vlan port mapping lan1.7 vlan1 +# vlan port mapping lan1.8 vlan2 +# lan type lan1 port-based-option=divide-network +</code></pre> +<p> +続いて各vlanの設定を行う。ただしvlan1はlan1の設定を受け継ぐので不要。 +</p> +<pre><code># ip vlan2 address 192.168.101.1/24 +# ip vlan2 secure filter <i>&lt;vlan1と同じパケットフィルター&gt;</i> +</code></pre> +<p>次にクラスフィルターを定義:</p> +<pre><code># queue class filter 1 1 ip 192.168.101.0/24 * * * * +# queue class filter 2 1 ip * 192.168.101.0/24 * * * +# queue class filter 3 2 ip 192.168.100.0/24 192.168.101.0/24 * * * +</code></pre> +<p> +上の2行はvlan2とその他との通信を制限するためのものである。ただしこの2つだけではvlan1からvlan2への通信まで制限してしまうので、それを除外するために3行目のクラスフィルターを定義する。 +</p> +<p>次にクラスフィルタをvlan2に適応。これによりルーターから192.168.101.0/24への通信がフィルタリングされる。</p> +<pre><code># queue lan1 type shaping +# queue vlan2 class filter list 3 2 +</code></pre> +<p> +2行目で指定したフィルターはその指定した順番で評価されるので注意が必要。<br /> +そしてクラスに対する制限を指定: +</p> +<pre><code># queue lan1 class property 1 bandwidth=128k +</code></pre> +<p>次はlan2(pp)にクラスフィルタを適応。これにより192.168.101.0/24からルーターへの通信がフィルタリングされる。</p> +<pre><code># queue lan2 type shaping +# pp select <i>n</i> +pp<i>n</i># queue pp class filter list 1 +</code></pre> +<p> +vlan2の時と同様にクラスに制限を設定: +</p> +<pre><code># queue lan2 class property 1 bandwidth=128k +</code></pre> + +<h2>パソコンでの設定</h2> +<p>最後にパソコンから今回作ったvlan2に接続するように設定する:</p> +<pre><code># cat > /etc/hostname.<i>if</i> &lt;&lt;EOS +join <i>&lt;アクセスポイントのECS-ID&gt;</i> wpakey <i>&lt;アクセスポイントの暗号化キー&gt;</i> +inet 192.168.101.2/24 +EOS +# echo 192.168.101.1 > /etc/mygate +</code></pre> + +<h2>おわりに</h2> +<p>めっちゃ遅い。</p> + +<h2>参考文献</h2> +<ol> + <li><a href="https://www.donedone.jp/plan/">料金プラン-50ギガの大容量SIM | donedone(ドネドネ) ドネーション型モバイルサービス</a>.donedone.2022-01-14閲覧</li> + <li><a href="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">VLAN</a>.RTpro.2022-01-14閲覧</li> + <li><a href="https://network.yamaha.com/knowledge/qos">QoSとは</a>.RTpro.2022-01-14閲覧</li> + <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> +</ol> + diff --git a/content/computer/setting_up_web_server.html b/content/computer/setting_up_web_server.html @@ -0,0 +1,163 @@ ++++ +date = '2022-06-27T00:00:00+09:00' +draft = false +title = 'Webサーバーの設定' ++++ +<time>2022-06-27</time> + +<h2>はじめに</h2> +<p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p> + +<h2>環境</h2> +<ul> + <li>OS: OpenBSD 7.1</li> + <li>サーバー: httpd(OpenBSDに付属のもの)</li> + <li>サーバー証明書: Let's Encrypt</li> + <li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li> + <li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li> +</ul> + +<h2>設定の概要</h2> +<dl> + <dt>サーバーを用意</dt> + <dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd> + <dt>ドメインの取得とDNSの設定</dt> + <dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd> + <dt>httpdの設定</dt> + <dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd> + <dt>証明書の発行と自動更新の設定</dt> + <dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd> + <dt>ホームページのファイルをアップロード</dt> + <dd>ウェブページで配信したいものをVPSにアップロードする。</dd> + <dt>接続の確認</dt> + <dd>手元のブラウザからアクセスできることを確認。</dd> +</dl> + +<h2>サーバーを用意</h2> +<p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p> + +<h2>ドメインの取得とDNSの設定</h2> +<p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p> +<pre><code>HOST TYPE POINTS TO TTL +<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600 +www.<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600</code></pre> +<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> +<p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p> +<pre><code>$ ping <i>&lt;server_domain&gt;</i> +PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes +64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms +64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms +^C</code></pre> + +<h2>httpdの設定</h2> +<p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p> +<pre><code>$ doas cp /etc/examples/httpd.conf /etc/ +vi /etc/httpd.conf</code></pre> + +<pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $ + +server "<i>&lt;server_domain&gt;</i>" { + listen on * port 80 + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location * { + block return 302 "https://$HTTP_HOST$REQUEST_URI" + } +} + +server "<i>&lt;server_domain&gt;</i>" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" + key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" + } + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location "*" { + root "/htdocs/www.<i>&lt;server_domain&gt;</i>" + directory auto index + } +}</code></pre> +<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> +<p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p> +<pre><code>$ doas httpd -n +configration OK</code></pre> + +<h2>証明書の発行と自動更新の設定</h2> +<p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p> +<pre><code>$ doas cp /etc/examples/acme-client.conf /etc/ +$ doas vi /etc/acme-client.conf</code></pre> +<pre><code># +# $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $ +# +authority letsencrypt { + api url "https://acme-v02.api.letsencrypt.org/directory" + account key "/etc/acme/letsencrypt-privkey.pem" +} + +authority letsencrypt-staging { + api url "https://acme-staging-v02.api.letsencrypt.org/directory" + account key "/etc/acme/letsencrypt-staging-privkey.pem" +} + +authority buypass { + api url "https://api.buypass.com/acme/directory" + account key "/etc/acme/buypass-privkey.pem" + contact "mailto:<i>&lt;your_mail_address&gt;</i>" +} + +authority buypass-test { + api url "https://api.test4.buypass.no/acme/directory" + account key "/etc/acme/buypass-test-privkey.pem" + contact "mailto:<i>&lt;your_mail_address&gt;</i>" +} + +domain <i>&lt;server_domain&gt;</i> { + alternative names { secure.<i>&lt;server_domain&gt;</i> } + domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" + domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" + sign with letsencrypt +}</code></pre> +<p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p> +<p>続いて<code>acme-client</code>を実行して証明書を発行する。</p> +<pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre> +<p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p> +<pre><code>$ doas crontab -e</code></pre> +<pre><code>... +#minute hour mday month wday [flags] command +19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd +... +</code></pre> +<p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p> + +<h2>ホームページのファイルのアップロード</h2> +<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> +<pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i> +$ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre> + +<h2>接続の確認</h2> +<p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p> +<pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre> +<p>続いてrcに登録、起動。</p> +<pre><code>$ doas rcctl start httpd +$ doas rcctl enable httpd</code></pre> +<p>ブラウザでアクセスしてみる。</p> + +<h2>おわりに</h2> +<p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p> + +<h2>参考文献</h2> +<ul> + <li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li> + <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> + <li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> + <li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> + <li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> + <li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li> + <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> +</ul> + diff --git a/man/computer/videos/ex1.webm b/content/computer/videos/ex1.webm Binary files differ. diff --git a/man/computer/videos/ex2.webm b/content/computer/videos/ex2.webm Binary files differ. diff --git a/man/computer/videos/ex3.webm b/content/computer/videos/ex3.webm Binary files differ. diff --git a/man/computer/videos/ex4.webm b/content/computer/videos/ex4.webm Binary files differ. diff --git a/man/computer/videos/ex5.webm b/content/computer/videos/ex5.webm Binary files differ. diff --git a/man/computer/videos/ex6.webm b/content/computer/videos/ex6.webm Binary files differ. diff --git a/content/computer/web_design/_index.html b/content/computer/web_design/_index.html @@ -0,0 +1,13 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = 'ウェブデザイン' ++++ +<div style="width: 100px; border: 1px solid black; border-radius: 1rem;"> + <p style="position: relative; left: 30px; white-space: nowrap;">CSS<br>完全に理解した。</p> +</div> + +<div class="resizer"> + <iframe src="navbar.html" title="navbar"></iframe> +</div> +<a href="navbar.html">ページ</a> diff --git a/content/computer/web_design/hamburger-x.svg b/content/computer/web_design/hamburger-x.svg @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="16" + height="16" + viewBox="0 0 16 16" + version="1.1" + id="svg1" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1" /> + <g + id="layer1"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="M 3.4604651,7.2930233 18.460465,18.293023" + id="path2" + transform="translate(-2.960465,-4.7930233)" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="M 3.4604651,7.2930233 18.460465,18.293023" + id="path5" + transform="matrix(-1,0,0,1,18.960465,-4.7930233)" /> + </g> +</svg> diff --git a/content/computer/web_design/hamburger.svg b/content/computer/web_design/hamburger.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="16" + height="16" + viewBox="0 0 16 16" + version="1.1" + id="svg1" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs1" /> + <g + id="layer1"> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="M 3.4604651,7.2930233 H 18.460465" + id="path1" + transform="translate(-2.9604651,0.7069767)" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="M 3.4604651,7.2930233 H 18.460465" + id="path2" + transform="translate(-2.960465,-4.7930233)" /> + <path + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="M 3.4604651,7.2930233 H 18.460465" + id="path3" + transform="translate(-2.960465,6.2069767)" /> + </g> +</svg> diff --git a/content/computer/web_design/navbar.html b/content/computer/web_design/navbar.html @@ -0,0 +1,117 @@ ++++ +date = '2026-02-27T21:02:51+09:00' +draft = false +title = 'Navbar' ++++ +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<title>Navbar</title> +<style> +body { + margin: 0; + background-color: #ffffea; +} +nav { + display: flex; + justify-content: space-between; + background-color: #eaffff; +} +nav a, nav label { + padding: 0.5rem; +} +.menu input, .menu label { + display: none; +} +.menu { + display: flex; +} +@media (max-width: 480px) { + :root { + --hamburger-width: 20px; + --hamburger-height: 12px; + --hamburger-bar-width: 2px; + --hamburger-margin: 10px; + } + .menu { + flex-direction: column; + position: absolute; + align-items: end; + right: 0; + } + .menu > a { + display: none; + background-color: #eaffff; + z-index: 10; + } + #hamburger-toggle:checked ~ a { + display: inline; + } + #hamburger { + display: inline; + width: var(--hamburger-width); + height: var(--hamburger-height); + margin: var(--hamburger-margin); + padding: 0; + transition: 0.5s; + } + #bar1, #bar2, #bar3 { + position: absolute; + width: var(--hamburger-width); + right: var(--hamburger-margin); + height: 0; + border: solid #5e5eea var(--hamburger-bar-width); + border-radius: var(--hamburger-bar-width); + transition: 0.5s; + } + #bar2 { + top: calc(var(--hamburger-margin) + var(--hamburger-height) / 2); + } + #bar3 { + top: calc(var(--hamburger-margin) + var(--hamburger-height)); + } + #hamburger-toggle:checked ~ #hamburger { + width: var(--hamburger-height); + transition: 0.5s; + } + #hamburger-toggle:checked ~ label #bar1 { + width: calc(1.41421356 * var(--hamburger-height)); + transform-origin: center right; + transform: translateY(calc(var(--hamburger-bar-width)/-1.41421356)) rotate(-45deg); + transition: 0.5s; + } + #hamburger-toggle:checked ~ label #bar2 { + width: var(--hamburger-height); + opacity: 0; + transition: 0.5s; + } + #hamburger-toggle:checked ~ label #bar3 { + width: calc(1.41421356 * var(--hamburger-height)); + transform-origin: center right; + transform: translateY(calc(var(--hamburger-bar-width)/1.41421356)) rotate(45deg); + transition: 0.5s; + } +} + +</style> +</head> +<body> +<nav> + <a href="#">Home</a> + <div class="menu"> + <input type="checkbox" id="hamburger-toggle"> + <label for="hamburger-toggle" id="hamburger"> + <div id="bar1"></div> + <div id="bar2"></div> + <div id="bar3"></div> + </label> + <a href="#">menu1</a> + <a href="#">menu2</a> + <a href="#">menu3</a> + <a href="#">menu4</a> + <a href="#">menu5</a> + </div> +</nav> +<h1>Navbar</h1> +<p>よくあるナビゲーションバー。スクリーンの幅が狭くなるとハンバーガーになる。JavaScriptは使ってない。</p> +</body> diff --git a/content/computer/web_design/style.css b/content/computer/web_design/style.css @@ -0,0 +1,11 @@ +.resizer { + margin: 1rem 0; + display: flex; + overflow: hidden; + resize: both; +} + +.resizer > * { + flex-grow: 1; + min-width: 0; +} diff --git a/content/computer/what-i-use.html b/content/computer/what-i-use.html @@ -0,0 +1,71 @@ ++++ +date = '2025-04-28T00:00:00+09:00' +draft = false +title = '使用しているハードウェア、ソフトウェア' ++++ +<time>2025-04-28</time>更新<br> +<time>2021-12-13</time>作成 +<h2>ノートパソコン</h2> +<p>メインのパソコン。</p> +<dl> +<dt>ハードウェア: <a href="openbsd_on_u9310e.html">Fujitsu LIFEBOOK U9310/E</a></dt> +<dd>2013年製のMacBook Airを使っていたがバッテリーがへたってきた。ぱちもんのバッテリーは1年でだめになるのに7千円くらいするのでコスパが悪い。2025年4月に大阪日本橋で見付けたLIFEBOOKを買った。10世代のCore i5で27000円くらい。軽い。ディスプレイが綺麗、OpenBSDと相性がそこそこいい。</dd> +<dt>OS: OpenBSD</dt> +<dd> +使いやすい。 +</dd> + +<dt>Window Manager: <a href="https://git.mtkn.jp/dwm">dwm</a></dt> + +<dt>Terminal: <a href="https://git.mtkn.jp/st">st</a></dt> + +<dt>Text Editor: acme, nvi</dt> +<dd>vimは辞めた。OpenBSDにあったnviが丁度いい。日本語を使うので日本語入力が必要ない場面ではacmeを使っている。</dd> + +<dt>Browser: firefox</dt> +<dd>もうちょっとましなのないんかな。UIころころ変わるし、重いし、嫌い。JavaScriptがないと困るので仕方なく使っているが...特に最近画面上部のUIが大きすぎて邪魔である。</dd> + +<dt>Mail Client: neomutt</dt> +<dd>あんまり好きじゃない</dd> +</dl> + +<h2>デスクトップ</h2> +<p>学生のときに組んだ。無駄にハイスペック。この上RTX2060も積んでたが、OpenBSDで使えないので解雇した。最近は絵を描くのに使っている。</p> +<dl> +<dt>マザーボード: ASRock Z390 Pro4</dt> +<dt>CPU: Intel Core i7-9700K</dt> +<dt>メモリ: センチュリーマイクロ 8GB * 2</dt> +<dd>国産</dd> +<dt>ストレージ: KimMiDi SSD 256GB</dt> +<dd>ThinkPad買ったときについてきたやつ。</dd> +<dt>モニタ: Eizo FlexScan EV2451</dt> +<dd>綺麗やけど質量が大きい。</dd> +<dt>OS: OpenBSD</dt> +<dd></dd> +</dl> + +<h2>家のサーバー</h2> +<p> +主にDNSとして使っている。 +</p> +<dl> +<dt>ハードウェア: Dell D520</dt> +<dd>おじいちゃんの家にころがってたのをもらってきた。</dd> +<dt>OS: OpenBSD</dt> +<dd></dd> +</dl> + +<h2>ウェブサーバー</h2> +<p>このウェブページ用</p> +<dl> +<dt>VPS: さくらのVPS</dt> +<dd>ちょっと高い(7078円/12ヶ月)。OpenBSDを入れられる。</dd> +<dt>OS: OpenBSD</dt> +<dt>httpサーバー: Openbsd httpd</dt> +<dd>manが分かりやすい。</dd> +<dt>smtpサーバー: OpenSMTPD</dt> +<dd>manが分かりやすい。</dd> +<dt>imapサーバー: dovecot</dt> +<dd>manはあんまり分かり易くない。<dd> +</dl> + diff --git a/content/computer/x11_32bit_window.html b/content/computer/x11_32bit_window.html @@ -0,0 +1,164 @@ ++++ +date = '2025-12-20T00:00:00+09:00' +draft = false +title = 'X11で深さが32bitのwindowを作成する' ++++ +<time>2025-12-20</time> + +<h2>結論</h2> +<p> +X11のrender拡張機能で半透明な画像を合成(composite)する際に深さが32bitのウィンドウを作成する必要がある。その際ドキュメントにも書いてなさそうな操作が必要だった。ウィンドウを作成する際に<code>border pixel</code>の値を設定する必要がある(言語はC): +</p> + +<pre><code>// Xlibの場合 +XSetWindowAttributes attr32 = { + .border_pixel = 0, // 値はなんでもよさそう + .colormap = colormap32, +} +Window window32 = XCreateWindow(display, DefaultRootWindow(display), + 0, 0, 1, 1, 0, + 32, // depth + InputOutput, + visual32, + CWBorderPixel|CWColormap, // CWBorderPixelを指定 + &amp;attr32); +</code></pre> + +<pre><code>// xcbの場合 +uint32_t attr32[2] = { 0, colormap32 }; // 値はなんでもよさそう。 +xcb_create_window(conn, 32, window32, screen-&gt;root, + 0, 0, 1, 1, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + visual32, + XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, // XCB_CW_BORDER_PIXELを指定 + &amp;attr32); +</code></pre> + +<h2>出典</h2> +<p> +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>に、 +</p> +<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 + // http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32 +</code></pre> +</blockquote> +<p> +と書いていた。引用元を見るとXサーバーのソースコードを参照しており、そのコードでは親のウィンドウの深さと異なる深さのウィンドウを作成する場合、<code>CWBorderPixmap</code>又は<code>CWBorderPixel</code>を指定しないと<code>BadMatch</code>というエラーが返ってくるようになっている。理由はよく分からない: +</p> +<blockquote cite="https://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c?h=xorg-server-21.1.21#n818"> +<pre><code> if (((vmask &amp; (CWBorderPixmap | CWBorderPixel)) == 0) &amp;&amp; + (class != InputOnly) &amp;&amp; (depth != pParent-&gt;drawable.depth)) { + *error = BadMatch; + return NullWindow; + } +</code></pre> +</blockquote> + +<h2>深さ32bitのウィンドウの作成手順</h2> +<h3>深さ32bitのヴィジュアルを取得</h3> +<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのヴィジュアルを取得する: +</p> +<pre><code>// xlibの場合 +int findVisual32(Display *display, XVisualInfo *return_visual_info); +/* ... */ +int main(void) { + /* ... */ + XVisualInfo vi32; + if (findVisual32(display, &amp;vi32) &lt; 0) { + fatal(&quot;32bit-deep visual info not found&quot;); + } + /* ... */ +} +/* ... */ +int findVisual32(Display *display, XVisualInfo *return_visual_info) { + long mask = VisualDepthMask|VisualRedMaskMask|VisualGreenMaskMask|VisualBlueMaskMask; + XVisualInfo template = { + .depth = 32, + .red_mask = 0xff0000, + .green_mask = 0x00ff00, + .blue_mask = 0x0000ff, + }; + int n; + XVisualInfo *vinfos = XGetVisualInfo(display, mask, &amp;template, &amp;n); + if (n == 0) { + return -1; + } + *return_visual_info = vinfos[0]; + XFree(vinfos); + return 0; +} +</pre></code> + +<pre><code>// xcbの場合 +int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype); +/* ... */ +int main(void) { + /* ... */ + xcb_visualtype_t visual32; + if (findVisual32(screen, &amp;visual32) &lt; 0) { + fatal(&quot;32bit visual not found&quot;); + } + /* ... */ +} +/* ... */ +int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) { + xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen); + for (;depth_iter.rem &gt; 0; xcb_depth_next(&amp;depth_iter)) { + xcb_depth_t *d = depth_iter.data; + if (d-&gt;depth != 32) { + continue; + } + xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d); + while (visual_iter.rem &gt; 0) { + xcb_visualtype_t *v = visual_iter.data; + if (v-&gt;red_mask == 0xff0000 &amp;&amp; v-&gt;green_mask == 0x00ff00 &amp;&amp; v-&gt;blue_mask == 0x0000ff) { + *return_visualtype = *v; + return 0; + } + xcb_visualtype_next(&amp;visual_iter); + } + } + return -1; +} +</code></pre> + +<h3>深さ32bitのカラーマップを作成</h3> +<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのカラーマップを作成する。 +</p> +<pre><code>// xlibの場合 + Colormap colormap32 = XCreateColormap(display, DefaultRootWindow(display), vi32.visual, AllocNone); +</code></pre> +<pre><code>// xcbの場合 + xcb_colormap_t colormap32 = xcb_generate_id(conn); + xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen-&gt;root, visual32.visual_id); +</code></pre> + +<h3>深さ32bitのウィンドウを作成</h3> +<p>最後にウィンドウを作成する:</p> +<pre><code>// xlibの場合 + Window window32 = XCreateWindow(display, DefaultRootWindow(display), + 0, 0, 1, 1, 0, + 32, + InputOutput, + vi32.visual, + CWBorderPixel|CWColormap, + &attr32); +</code></pre> +<pre><code>// xcbの場合 + uint32_t attr32[2] = { 0, colormap32 }; + xcb_create_window(conn, 32, window32, screen->root, + 0, 0, 1, 1, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + visual32.visual_id, + XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32); +</code></pre> + +<h2>サンプルコード</h2> +32bitのウィンドウを作成し、そこからrender拡張機能を使って半透明な四角形を描画するプログラムを作った。OpenBSDで動作確認した。他のUnixでも多分動くと思う:<br> +<a href="https://git.mtkn.jp/win32">git.mtkn.jp/win32</a> + +<h2>参考文献</h2> +<ol> +<li><a href="https://azelpg.gitlab.io/azsky2/note/prog/x11/03_visual.html">X11: ビジュアル</a></li> +</ol> + diff --git a/content/computer/xlib_playground1.html b/content/computer/xlib_playground1.html @@ -0,0 +1,145 @@ ++++ +date = '2022-12-21T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる1' ++++ +<time>2022-12-21</time> + +<h2>はじめに</h2> +<p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> +<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> +<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 +</p> + +<h2>初期設定</h2> +<p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p> +<pre><code> +#include &lt;stdio.h&gt; +#include &lt;stdlib.h&gt; +#include &lt;X11/Xlib.h&gt; + +/* macros */ +#define INIT_WIDTH 800 +#define INIT_HEIGHT 600 + +/* variables */ +Display *display; +Window window; +unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; +GC gc; +Atom wm_delete_window; + +void +setup(void) +{ + // Open a display. + if ((display = XOpenDisplay(NULL)) == NULL){ + fprintf(stderr, "ERROR: could not open display\n"); + exit(1); + } + // Create a window. + window = XCreateSimpleWindow( + display, + XDefaultRootWindow(display), + 0, 0, + win_width, win_height, + 0, 0, // border properties + 0); // background color: black + XStoreName(display, window, "UNKO"); + + // Setup a graphical context. + gc = XCreateGC(display, window, 0, NULL); + XSetForeground(display, gc, 0x0000FF); + + // Kill the application when the window is destroyed. + wm_delete_window = XInternAtom(display, + "WM_DELETE_WINDOW", False); + XSetWMProtocols(display, window, &wm_delete_window, 1); + + // Setup which input to process. + XSelectInput(display, window, + ExposureMask|KeyPressMask|KeyReleaseMask); + + // Actually draw the window. + XMapWindow(display, window); +} + +void +clean_up(void) +{ + XCloseDisplay(display); +} +</code></pre> + +<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> +<pre><code>#include &lt;time.h&gt; +#include &lt;math.h&gt; + +int +main(void) +{ + int px, py; + int quit; + struct timespec ts; + XEvent event; + + setup(); + quit = 0; + + while (!quit){ + while(XPending(display) &gt; 0){ + XNextEvent(display, &event); + switch (event.type){ + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)){ + case 'q': + quit = 1; + break; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + quit = 1; + } + } break; + default: + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &ts); + px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); + py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); + XClearArea(display, window, + 0, 0, // position + win_width, win_height, // width and height + False); + XFillRectangle(display, window, gc, + px, py, // position + 100, 100); // width and height + + ts.tv_sec = 0; + ts.tv_nsec = 10 * 1000 * 1000; + nanosleep(&ts, NULL); + } + + cleanup(); + return 0; +} +</code></pre> + +<p>ここまでのコードはgitリポジトリの<a href="https://git.mtkn.jp/xlib_playground/file/ex1/ex1.c.html">ex1/ex1.c</a>にある。</p> +<h2>完成品:</h2> +<video controls> + <source src="videos/ex1.webm" type="video/webm"> +</video> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> +</ul> + +<a href="xlib_playground2.html">次の記事</a> + diff --git a/content/computer/xlib_playground2.html b/content/computer/xlib_playground2.html @@ -0,0 +1,206 @@ ++++ +date = '2022-12-22T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる2' ++++ +<time>2022-12-22</time> + +<p>前回: <a href="xlib_playground1.html">Xlibで遊んでみる1</a></p> +<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 +</p> + +<h2>FPSの固定</h2> +<p>前のフレームからの経過時間を計測して<code>1.0/FPS</code>を越えるまで待機させる。このときに<code>nanosleep()</code>を使うとなぜか上手くいかなかった。ナノ秒単位で処理できそうな名前なのに使えない。多分OSのコンテクストスイッチがどうとかいう話やと思う。知らんけど。組み込みとかで使うんかな? +</p> + +<p> +とりあえず<code>while</code>ループの中でひたすら時刻を読んでいる。リソースの無駄遣いではないのだろうか: +</p> +<pre><code>#defin FPS 60 + +int +main(void) +{ + long t0, t1, dt; + int fps_count; + + clock_gettime(CLOCK_MONOTONIC, &ts); + t0 = ts.tv_nsec; + + while (!quit) { + // fix fps + dt = 0; + while (dt &lt; 1.0 * 1000 * 1000 * 1000 / FPS){ + clock_gettime(CLOCK_MONOTONIC, &ts); + t1 = ts.tv_nsec; + dt = t1 &gt; t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000; + } + // count fps. + fps_count++; + if (t1 &lt; t0){ + printf("fps: %u\n", fps_count); + fps_count = 0; + } + clock_gettime(CLOCK_MONOTONIC, &ts); + t0 = ts.tv_nsec; + } +} +</code></pre> +<p> +時刻は<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> +<p> +FPSの計測の部分は、フレーム毎に<code>fps_count</code>を1ずつ増やし、ナノ秒が繰り上がった時点での<code>fps_count</code>を表示している。</p> +<p> +あまり正確な方法ではないように思うが、コンパクトにまとまったのではないだろうか。</p> + +<h2>キーボード入力の処理</h2> +<p>キーボードからの入力を受け取る:</p> +<pre><code>XSelectInput(display, window, + ExposureMask|KeyPressMask|KeyReleaseMask); +</code></pre> +<p>ここではキーボードのキーを押した時と離した時に<code>XEvent</code>の通知を受け取るように設定した。 +</p> +<p> +<code>XNextEvent()</code>からひとつずつ入力を受け取ると、複数のキーが同時に押された時にうまく処理できなかったので、押されているキーを配列に保存しておくことにした:</p> +<pre><code>enum Keys { + Key_D, + Key_S, + Key_A, + Key_W, + Key_Space, + Num_Key, //number of keys in this enum +}; +enum Key_State { + Key_Up, + Key_Down, +}; + +int key_state[Num_Key]; +</code></pre> + +<p> +入力の処理は<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> +<pre><code>int quit; + +void +handle_inputs(void) +{ + XEvent event; + while (XPending(display) &gt; 0) { + XNextEvent(display, &event); + switch (event.type) { + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)) { + case 'q': + quit = 1; + break; + case 'd': + key_state[Key_D] = Key_Down; + break; + case 'a': + key_state[Key_A] = Key_Down; + break; + case 'w': + key_state[Key_W] = Key_Down; + break; + case 's': + key_state[Key_S] = Key_Down; + break; + default: + break; + } + } break; + case KeyRelease: { + switch (XLookupKeysym(&event.xkey, 0)) { + case 'd': + key_state[Key_D] = Key_Up; + break; + case 'a': + key_state[Key_A] = Key_Up; + break; + case 'w': + key_state[Key_W] = Key_Up; + break; + + case 's': + key_state[Key_S] = Key_Up; + break; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + quit = 1; + } + } break; + default: + break; + } + } + + vx = vy = 0; + if (key_state[Key_D] == Key_Down) + vx += 300; + if (key_state[Key_A] == Key_Down) + vx += -300; + if (key_state[Key_S] == Key_Down) + vy += 300; + if (key_state[Key_W] == Key_Down) + vy += -300; +} +</code></pre> + +<p> +入力によって変更された速度は、<code>main()</code>関数内で次の座標を計算するために使用される: +</p> +<pre><code>float px = 200, py = 200; +float vx = 0, vy = 0; +int width = 40, height = 40; + +int +main(void) +{ + /* ... */ + quit = 0; + while (!quit) { + handle_input() + /* ... */ + px = px + vx * dt / 1000 / 1000 / 1000; + py = py + vy * dt / 1000 / 1000 / 1000; + // bind within the window + if (px &lt; 0) + px = 0; + if (win_width &lt; px + width) + px = win_width - width; + if (py &lt; 0) + py = 0; + if (win_height &lt; py + height) + py = win_height - height; + + XClearArea(display, window, + 0, 0, // position + win_width, win_height, // width and height + False); + XFillRectangle(display, window, gc, + px, py, // position + width, height); // width and height + } + /* ... */ +} +</code></pre> + +<h2>完成品</h2> +<a href="https://git.mtkn.jp/xlib_playground/file/ex2/ex2.c.html">ソースコード</a> +<p>色を変えてみた。</p> +<video controls> + <source src="videos/ex2.webm" type="video/webm"> +</video> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> +<p>次の記事: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> +</p> + diff --git a/content/computer/xlib_playground3.html b/content/computer/xlib_playground3.html @@ -0,0 +1,169 @@ ++++ +date = '2023-01-02T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる3' ++++ +<time>2023-01-02</time> + +<p> +前回: <a href="xlib_playground2.html">Xlibで遊んでみる2</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> +</p> + +<h2>画面サイズの変更</h2> +<p> +画面サイズが変更された時に表示している四角形が画面の外側に出ないようにした。<code>XGetWindowAttributes()</code>で画面の情報を取得し、グローバル変数の<code>win_width</code>と<code>win_height</code>に幅と高さをそれぞれ代入して<code>next_tick()</code>で四角形の位置を画面に収まるようにしている: +</p> +<pre><code>int win_width, win_height; + +void +receive_events(int key_state[]) +{ + XEvent event; + XWindowAttributes wattr; + + while (XPending(display) &gt; 0) { + XNextEvent(display, &event); + switch (event.type) { + case Expose: { + XGetWindowAttributes(display, window, &wattr); + win_width = wattr.width; + win_height = wattr.height; + } break; + /* ... */ + } + } +} + +void +next_tick(long ndt) // nano second +{ + px = px + vx * ndt / 1000 / 1000 / 1000; + py = py + vy * ndt / 1000 / 1000 / 1000; + // bind within the window + if (px &lt; 0) + px = 0; + if (win_width &lt; px + width) + px = win_width - width; + if (py &lt; 0) + py = 0; + if (win_height &lt; py + height) + py = win_height - height; +} +</code></pre> + +<h2>メニュー画面の実装</h2> +<p> +ゲームのようなものを作るうえでメニュー画面とその推移が必要である。ここではグローバル変数<code>next_menu</code>に現在のメニューを保存することにした。それぞれのメニューはそれぞれ関数として記述し、他のメニューに推移する必要が生じたときに<code>next_menu</code>を変更するようにした: +</p> +<pre><code>enum next_menu { + START_MENU, + GAME_PLAY, + GAME_OVER, + QUIT, +}; + +int next_menu = START_MENU; + +void +start_menu(void) +{ + XEvent event; + char *menu_char_q = "press q to quit."; + char *menu_char_s = "press &lt;space&gt; to start."; + + XClearArea(display, window, + 0, 0, // position + win_width, win_height, // width and height + False); + XDrawString(display, window, gc, + win_width/2 - strlen(menu_char_q)/2, win_height/2, + menu_char_q, strlen(menu_char_q)); + XDrawString(display, window, gc, + win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, + menu_char_s, strlen(menu_char_s)); + + while (next_menu == START_MENU) { + XNextEvent(display, &event); + switch (event.type) { + case Expose: { + XDrawString(display, window, gc, + win_width/2 - strlen(menu_char_q)/2, + win_height/2, + menu_char_q, strlen(menu_char_q)); + XDrawString(display, window, gc, + win_width/2 - strlen(menu_char_s)/2, + win_height/2 + 20, + menu_char_s, strlen(menu_char_s)); + + } break; + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)) { + case 'q': + next_menu = QUIT; + break; + case ' ': + next_menu = GAME_PLAY; + break; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + next_menu = QUIT; + } + } break; + default: + break; + } + } +} + +int +main(void) +{ + setup(); + while (next_menu != QUIT){ + switch (next_menu){ + case START_MENU: + start_menu(); + break; + case GAME_PLAY: + game_play(); + break; + case GAME_OVER: + game_over(); + break; + default: + break; + } + } + + cleanup(); + return 0; +} +</code></pre> +<p><code>main()</code>関数がめっちゃすっきりした。</p> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex3/ex3.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex3.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> +<p> +次の記事: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> +</p> + diff --git a/content/computer/xlib_playground4.html b/content/computer/xlib_playground4.html @@ -0,0 +1,148 @@ ++++ +date = '2023-01-02T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる4' ++++ +<time>2023-01-02</time> + +<p> +前回: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> +</p> + +<h2>衝突判定とその処理</h2> +<p> +これまでは一つの四角形だけを描画していたが、今回は複数の四角形を作成して動かしてみた。ランダムな場所にランダムな運動量で動かして、他のものやウィンドウの縁とぶつかったら跳ね返るようにした。</p> +<p> +回転しない四角形どうしの衝突判定は簡単である。x軸方向とy軸方向の両方に重なりがあれば衝突している: +</p> +<pre><code>struct square { + float ppx, ppy; // previous position + float px, py; // current position + float vx, vy; // velocity + int w, h; // width and height +}; + +int +test_collision(struct square *s1, struct square* s2) +{ + return s1-&gt;px &lt; s2-&gt;px + s2-&gt;w && s2-&gt;px &lt; s1-&gt;px + s1-&gt;w && + s2-&gt;py &lt; s1-&gt;py + s1-&gt;h && s1-&gt;py &lt; s2-&gt;py + s2-&gt;h; +} +</code></pre> + +<p> +衝突後の処理は多少めんどくさかった。衝突した時は既にめりこんでいるので、まずはそれぞれをめりこんだ距離の半分ずつずらして衝突を解消するようにした。この際、x軸方向にぶつかったのか、y軸方向にぶつかったのかで、それぞれの軸方向にひっぺがすようにしている。二つの四角形の各軸に関するめりこんだ距離<code>lapx</code>、<code>lapy</code>と各軸に関する相対速度<code>rel_vx</code>、<code>rel_vy</code>の比を比べればどちらの軸方向にぶつかったかが分かるはずである、多分 : +</p> +<pre><code>void +handle_collision_mm(struct square *s1, struct square *s2) +{ + if (!test_collision(s1, s2)) + return; + + float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); + float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); + float rel_vx = max(s1-&gt;vx - s2-&gt;vx, s2-&gt;vx - s1-&gt;vx); + float rel_vy = max(s1-&gt;vy - s2-&gt;vy, s2-&gt;vy - s1-&gt;vy); + + if (lapx / rel_vx &lt; lapy / rel_vy) { + if (s1-&gt;px + s1-&gt;w &lt; s2-&gt;px + s2-&gt;w / 2) { + s1-&gt;px -= lapx / 2; + s2-&gt;px += lapx / 2; + } else { + s1-&gt;px += lapx / 2; + s2-&gt;px -= lapx / 2; + } + } else { + if (s1-&gt;py + s1-&gt;h &lt; s2-&gt;py + s2-&gt;h / 2) { + s1-&gt;py -= lapy / 2; + s2-&gt;py += lapy / 2; + } else { + s1-&gt;py += lapy / 2; + s2-&gt;py -= lapy / 2; + } + } +} +</code></pre> +<p> +衝突は弾性衝突として、衝突したそれぞれの四角形の速度を更新した。質量は四角形の面積として計算している。衝突後の速度はエネルギー保存則と運動量保存則から導いたのでしんどかった。 +</p> +<pre><code>void +handle_collision_elastic(struct square *s1, struct square *s2) +{ + if(!test_collision(s1, s2)) + return; + + float v1, v2; + float m1 = s1-&gt;w * s1-&gt;h; + float m2 = s2-&gt;w * s2-&gt;h; + + float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); + float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); + + if (lapx &lt; lapy) { + v1 = s1-&gt;vx; + v2 = s2-&gt;vx; + s1-&gt;vx = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; + s2-&gt;vx = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; + } else { + v1 = s1-&gt;vy; + v2 = s2-&gt;vy; + s1-&gt;vy = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; + s2-&gt;vy = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; + } + + handle_collision_mm(s1, s2); +} +</code></pre> + +<h2>サブティック</h2> +<p> +この名前が適切かどうか分からないが、前のフレームから次のフレームまでの時間をさらに何等分かして衝突判定の制度を上げた(マクロは括弧でかこって分かりにくいバグを防げとどこかに書いていたのでそうすることにした): +</p> +<pre><code>#define SUB_TIC (4) + +void +game_play(void) +{ + /* ... */ + while (next_menu == GAME_PLAY) { + /* ... */ + for (int j = 0; j &lt; SUB_TICK; j++) { + for (int i = 0; i &lt; NUM_SQUARE; i++) + next_tick(&square[i], 1000 * 1000 * 1000 / FPS / SUB_TICK); + + for (int i = 0; i &lt; NUM_SQUARE; i++) + for (int j = i + 1; j &lt; NUM_SQUARE; j++) { + handle_collision_elastic(&square[i], &square[j]); + /* ... */ + } + /* ... */ + } + /* ... */ + } + /* ... */ +} +</code></pre> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex4/ex4.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex4.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> +<p> +次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> +</p> + diff --git a/content/computer/xlib_playground5.html b/content/computer/xlib_playground5.html @@ -0,0 +1,115 @@ ++++ +date = '2023-01-03T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる5' ++++ +<time>2023-01-03</time> + +<p> +前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> +</p> + +<h2>円の衝突判定とその処理</h2> +<p> +前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である: +</p> +<pre><code>struct circle { + float ppx, ppy; // previous position (center) + float px, py; // current position (center) + float vx, vy; // velocity + int r; // radius + int m; // mass +}; + +int +circle_test_collision(struct circle *c1, struct circle *c2) +{ + return (c1-&gt;px - c2-&gt;px) * (c1-&gt;px - c2-&gt;px) + + (c1-&gt;py - c2-&gt;py) * (c1-&gt;py - c2-&gt;py) &lt; + (c1-&gt;r + c2-&gt;r) * (c1-&gt;r + c2-&gt;r); +} +</code></pre> + +<p> +衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。 +</p> +<pre><code> +void +circle_handle_collision_mm(struct circle *c1, struct circle *c2) +{ + if (!circle_test_collision(c1, c2)) + return; + + float col_px = c2-&gt;px - c1-&gt;px; + float col_py = c2-&gt;py - c1-&gt;py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + + c1-&gt;px = c1-&gt;px - col_px / 2; + c1-&gt;py = c1-&gt;py - col_py / 2; + c2-&gt;px = c2-&gt;px + col_px / 2; + c2-&gt;py = c2-&gt;py + col_py / 2; +} + +void +circle_handle_collision_elastic(struct circle *c1, struct circle *c2) +{ + if(!circle_test_collision(c1, c2)) + return; + + float col_px = c2-&gt;px - c1-&gt;px; + float col_py = c2-&gt;py - c1-&gt;py; + float col_pr = sqrtf(col_px * col_px + col_py * col_py); + col_px /= col_pr; + col_py /= col_pr; + float nor_px = col_py; + float nor_py = -col_px; + + float m1 = c1-&gt;m; + float m2 = c2-&gt;m; + + float col_1v = c1-&gt;vx * col_px + c1-&gt;vy * col_py; + float col_2v = c2-&gt;vx * col_px + c2-&gt;vy * col_py; + + float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; + float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; + float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; + float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; + + float nor_1vx = nor_px * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); + float nor_1vy = nor_py * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); + float nor_2vx = nor_px * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); + float nor_2vy = nor_py * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); + + c1-&gt;vx = col_1vxn + nor_1vx; + c1-&gt;vy = col_1vyn + nor_1vy; + c2-&gt;vx = col_2vxn + nor_2vx; + c2-&gt;vy = col_2vyn + nor_2vy; + + circle_handle_collision_mm(c1, c2); +} +</code></pre> + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex5.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> +<p> +次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a> +</p> + diff --git a/content/computer/xlib_playground6.html b/content/computer/xlib_playground6.html @@ -0,0 +1,201 @@ ++++ +date = '2023-01-25T00:00:00+09:00' +draft = false +title = 'Xlibで遊んでみる6' ++++ +<time>2023-01-25</time> + +<p> +前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> +</p> +<p> +言語: C言語<br /> +ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> +</p> + +<h2>ワールドマップの作成</h2> +<p> +ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロックの場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした: +</p> +<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] = +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"........b......................................................................." +"................................................................................" +"................................................................................" +"....b..........................................................................." +"................................................................................" +"................b..............................................................." +"..........................................................b..........b.........." +"................................................................................" +".......................b........................................................" +"...........................................b...................................." +"...........................................b...................................." +"................................................................................" +"..................b............................................................." +"................................................................................" +"...........................................b...................................." +"................................................................................" +"................................................................................" +"...........................b...................................................." +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"....................................bbbbbbbbbb.................................." +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"..............................................bbbbbbbbbb........................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"....................................bbbbbbbbbb.................................." +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"..........................bbbbbbbbbb............................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................................................................................" +"................bbbbbbbbbb......................................................" +"................................................................................" +"................................................................................" +"...p............................................................................" +"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb" +"........................b.......b......................b...b...................." +"........................b.......b......................b...b...................." +"........................b.......b......................b...b...................." +"........................b.......b......................b...b...................."; +</code></pre> + +<h2>プレイヤーの作成</h2> +<p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p> +<pre><code>struct rect { + float ppx, ppy; + float px, py; + float vx, vy; + float ax, ay; // acceleration + int w, h; + int m; +}; +</code></pre> +<p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p> +<pre><code>struct rect block[NUM_RECT]; +struct rect player; + +/* ... */ + + int bi = 0; + for (int i = 0; i &lt; WORLD_WIDTH * WORLD_HEIGHT; i++) { + if (world_map[i] == 'b') { + block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE; + block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE; + block[bi].ax = 0; + block[bi].ay = 0; + block[bi].vx = 0; + block[bi].vy = 0; + block[bi].w = block[bi].h = BLOCK_SIZE; + block[bi].m = block[bi].w * block[bi].h; + bi++; + } else if (world_map[i] == 'p') { + player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE; + player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE; + player.vx = 0; + player.vy = 0; + player.ax = 0; + player.ay = GRAVITY; + player.w = player.h = BLOCK_SIZE; + player.m = player.w * player.h; + } + } +</code></pre> + +<p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる: +</p> +<pre><code>void +handle_inputs(int key_state[]) +{ + if (key_state[KEY_Q] == KEY_DOWN){ + next_menu = GAME_OVER; + return; + } + if (key_state[KEY_D] == KEY_DOWN) { + if (player.vx &gt; 0) { + player.ax = 500; + } else { + player.ax = 1000; + } + } else if (key_state[KEY_A] == KEY_DOWN) { + if (player.vx &gt; 0) { + player.ax = -1000; + } else { + player.ax = -500; + } + } else { + if (player_is_falling) + player.ax = -player.vx; + else + player.ax = -3 * player.vx; + } + + if (player.vx &lt; -200) player.vx = -200; + if (player.vx &gt; 200) player.vx = 200; + if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN) + player.vy = -450; +} +</code></pre> + +<p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p> +<pre><code>void +rect_next_tick(struct rect *s, long ndt) // nano second +{ + s-&gt;ppx = s-&gt;px; + s-&gt;ppy = s-&gt;py; + s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000; + s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000; + s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000; + s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000; + + // bind within the window + if (s-&gt;px &lt; 0) { + s-&gt;px = 0; + //s-&gt;vx *= -1; + } + if (win_width &lt; s-&gt;px + s-&gt;w) { + s-&gt;px = win_width - s-&gt;w; + //s-&gt;vx *= -1; + } + // game over when fall out of the screen + if (s-&gt;py &gt; win_height) + next_menu = GAME_OVER; +} +</code></pre> + + +<h2>完成品</h2> +<p> +<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a> +</p> +<p> +<video controls> +<source src="videos/ex6.webm" type="video/webm"> +</video> +</p> + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +</ul> + diff --git a/content/draft/9p_go.html b/content/draft/9p_go.html @@ -0,0 +1,306 @@ ++++ +date = '2024-12-18T00:00:00+09:00' +draft = true +title = '9PのGoによる実装' ++++ +<time>2024-12-18</time> + +<h2>メッセージの構造体の定義</h2> +<p> +メッセージには<code>size</code>、<code>tag</code>等共通の要素がある。クライアントからメッセージを受けとる際、<code>size</code>を参照して何バイト読むか判断し、メッセージの<code>type</code>によりその後の処理を場合分けする。そのためにメッセージを<code>interface</code>として定義した: +</p> +<pre><code>// A Msg represents any kind of message of 9P. +// It defines methods for common fields. +// For each message type &lt;T&gt;, new&lt;T&gt;([]byte) function parses the byte array +// of 9P message into the corresponding message struct. +// For detailed information on each message, consult the documentation +// of 9P protocol. +type Msg interface { + // Size returns the size field of message. + // Size field holds the size of the message in bytes + // including the 4-byte size field itself. + Size() uint32 + // Type returns the type field of message. + Type() MsgType + // GetTag returns the Tag of message. + // Tag is the identifier of each message. + // The Get prefix is to avoid name confliction with the each + // message's Tag field. + GetTag() uint16 + // SetTag sets the Tag field of the message. + SetTag(uint16) + // Marshal convert Msg to byte array to be transmitted. + marshal() []byte + String() string +} +</code></pre> +<p> +<code>marshal()</code>はサーバーから返信を送る際にメッセージの構造体をバイト列にエンコードするための関数である。<code>String() string</code>はログ出力用。</p> +<p> +メッセージはバイト列として受け取った後、メッセージのタイプによって処理を分ける。その際、扱いやすいようにバイト列を各メッセージの構造体に変換する。変換前のバイト列から、各メッセージに共通のフィールドを取得できると便利なので、バイト列のまま<code>Msg</code>インターフェースを実装する<code>bufMsg</code>を定義した。名前はいまいち。</p> +<pre><code>type bufMsg []byte + +func (msg bufMsg) Size() uint32 { return gbit32(msg[0:4]) } +func (msg bufMsg) Type() MsgType { return MsgType(msg[4]) } +func (msg bufMsg) GetTag() uint16 { return gbit16(msg[5:7]) } +func (msg bufMsg) SetTag(t uint16) { pbit16(msg[5:7], t) } +func (msg bufMsg) marshal() []byte { return []byte(msg)[:msg.Size()] } +func (msg bufMsg) String() string { + switch msg.Type() { + case Tversion: + return newTVersion(msg).String() + /* 省略 */ + } +} +</code></pre> +<p> +<code>gbit32</code>は4バイトのリトルエンディアンの配列を整数に変換するもので、<code>pbit32</code>は逆に整数をリトルエンディアンのスライスに格納するものである。</p> +<p> +各メッセージはそれぞれのフィールドを構造体のフィールドとして定義したものである。例えば<code>tversion</code>に対応する構造体は以下の通り。</p> +<pre><code>type TVersion struct { + Tag uint16 + Msize uint32 + Version string +} +</code></pre> +<p> +バイト列から各メッセージの構造体に変換するために<code>new<i>メッセージタイプ</i></code>を定義した。 +</p> +<pre><code>func newTVersion(buf []byte) *TVersion { + msg := new(TVersion) + msg.Tag = gbit16(buf[5:7]) + msg.Msize = gbit32(buf[7:11]) + vs := gbit16(buf[11:13]) + msg.Version = string(buf[13 : 13+vs]) + return msg +} +</code></pre> + +<h2>メッセージのやりとり</h2> +<p> +まずは9Pメッセージを読む関数を実装する。バイト列が読めればいいので引数は<code>io.Reader</code>にした: +</p> +<pre><code>func readMsg(r io.Reader) ([]byte, error) { +</code></pre> +<p> +最初にメッセージのサイズを読む: +</p> +<pre><code> buf := make([]byte, 4) + read, err := r.Read(buf) + if err != nil { + if err == io.EOF { + return nil, err + } + return nil, fmt.Errorf(&quot;read size: %v&quot;, err) + } + if read != len(buf) { + return buf, fmt.Errorf(&quot;read size: invalid message.&quot;) + } + size := bufMsg(buf).Size() +</code></pre> +<p> +続いて読みこんだサイズに基づいてメッセージの残りの部分を読む。 +一回の<code>Read</code>で最後まで読めないことがあったので、 +全部読めるまで<code>Read</code>を繰り返す: +</p> +<pre><code> mbuf := make([]byte, size-4) + for read = 0; read &lt; int(size)-4; { + n, err := r.Read(mbuf[read:]) + if err != nil { + return buf, fmt.Errorf(&quot;read body: %v&quot;, err) + } + read += n + } + buf = append(buf, mbuf...) + return buf, nil +} +</code></pre> +<p> +読み込んだバイト列は<code>ReadMsg</code>関数でメッセージの構造体に変換する。</p> +<pre><code>RecvMsg(r io.Reader) (Msg, error) { + b, err := readMsg(r) + if err == io.EOF { + return nil, err + } else if err != nil { + return nil, fmt.Errorf(&quot;readMsg: %v&quot;, err) + } + return unmarshal(b) +} +</code></pre> +<p> +返信のメッセージはメッセージの構造体を<code>marshal</code>関数でバイト列に変換して<code>io.Writer</code>に書き込む。</p> +<pre><code>// SendMsg send a 9P message to w +func SendMsg(msg Msg, w io.Writer) error { + if _, err := w.Write(msg.marshal()); err != nil { + return fmt.Errorf(&quot;write: %v&quot;, err) + } + return nil +} +</code></pre> + +<h2>メインループ</h2> +<p> +ライブラリはメッセージを読み込むためのリスナーgoroutinと返信を書き込むためのレスポンダーgoroutine、そして各メッセージを処理するためのgoroutineを立ち上げて、チャネルでそれぞれを繋ぐ。リスナーがメッセージを読み込むと、<code>request</code>構造体に格納し、メッセージのタイプに応じて各goroutineに渡す。渡されたgoroutineはメッセージに応じた処理をし、返信のメッセージをリスポンダーgoroutineに渡す。リスポンダーgoroutineはメッセージをバイト列に変換して返信する。 +</p> +<p> +この設計がいいかどうかよく知らんけど、Go言語を触るからgoroutineとチャネルによるパイプラインを作ってみたかった。</p> + +<h2>各メッセージの処理</h2> +<p> +メッセージは<code>s<i>メッセージタイプ</i></code>goroutineで処理する。関数は<code>for</code>ループのなかでチャンネル<code>rc</code>から<code>request</code>が届くのを待つ。届いたリクエストには<code>ifcall</code>フィールドにクライアントからの<code>Msg</code>が含まれるので、この関数が担当するstructにキャストする。このキャストが失敗するのは明かなサーバーのバグなのでタイプアサーションはしない。</p> +<pre><code>func s<i>メッセージタイプ</i>(ctx context.Context, c *conn, rc &lt;-chan *request) { + for { + select { + case &lt;-ctx.Done(); + return + case r, ok := rc: + if !ok { + return + } + ifcall := r.ifcall.(*T<i>メッセージタイプ</i>) +</code></pre> +<p> +各種処理を完了したら、届いた<code>request</code>の<code>ofcall</code>に返信の<code>Msg</code>を格納して返信を担当するgoroutineに送る。<pre><code> select { + case c.respChan &lt;- r: + case &lt;-ctx.Done(): + return + } +</code></pre> +</p> +<h3>Version</h3> +<p> +クライアントから届いたバージョンの提案を見て、頭に"9P2000"があれば返信のバージョンを"9P2000"にする。現在定義されているバージョンは"9P2000"の他、Unix用に拡張した"9P2000.u"、Linux用に拡張した"9P2000.l"がある。基本的な昨日を実装することが目標なので、"9P2000"のみを受け付ける。</p> +<p> +Versionメッセージではメッセージの最大サイズも決定する。サーバーは予め8Kバイトを最大サイズにしている。クライアントがこれ以上のサイズを提案した場合、8Kにしてもらい、これ以下のサイズを提案した場合、そのサイズでメッセージをやりとりする。8Kバイトという既定値はplan9の実装を参考にした。このサイズである必然性はよく知らない。</p> +<pre><code> version := ifcall.Version + if strings.HasPrefix(version, &quot;9P2000&quot;) { + version = &quot;9P2000&quot; + } else { + version = &quot;unknown&quot; + } + msize := ifcall.Msize + if msize &gt; c.mSize() { + msize = c.mSize() + } + r.ofcall = &amp;RVersion{ + Msize: msize, + Version: version, + } + c.setMSize(r.ofcall.(*RVersion).Msize) +</code></pre> + +<h3>Auth</h3> +<p> +サーバーの認証は<code>Server</code>の<code>Auth</code>フィールドに認証のためのやりとりを待ち受ける関数を登録することで有効化できる。このフィールドが<code>nil</code>の場合、認証が必要ない旨のエラーを返す。</p> +<pre><code> if c.s.Auth == nil { + r.err = fmt.Errorf(&quot;authentication not required&quot;) + goto resp + } +</code></pre> +<p> +認証が必要な場合、クライアントから提案された<code>afid</code>をコネクションに登録して、<code>Server.Auth</code>を呼び出す。 +</p> + +<h3>attach</h3> +<p> +サーバーはまず認証が必要な場合認証が済んでいるか確認する。</p> +<pre><code> switch { + case c.s.Auth == nil &amp;&amp; ifcall.Afid == NOFID: + case c.s.Auth == nil &amp;&amp; ifcall.Afid != NOFID: + r.err = ErrBotch + goto resp + case c.s.Auth != nil &amp;&amp; ifcall.Afid == NOFID: + r.err = fmt.Errorf(&quot;authentication required&quot;) + goto resp + case c.s.Auth != nil &amp;&amp; ifcall.Afid != NOFID: + afid, ok := c.fPool.lookup(ifcall.Afid) + if !ok { + r.err = ErrUnknownFid + goto resp + } + af, ok := afid.file.(*AuthFile) + if !ok { + r.err = fmt.Errorf(&quot;not auth file&quot;) + goto resp + } + if af.Uname != ifcall.Uname || af.Aname != ifcall.Aname || !af.AuthOK { + r.err = fmt.Errorf(&quot;not authenticated&quot;) + goto resp + } + } +</code></pre> +<p> +次にクライアントが要求してきたファイルツリーがサーバーにあるかどうか確認し、クライアントが設定した<code>fid</code>にルートディレクトリを紐付ける。</p> +<pre><code> r.fid, err = c.fPool.add(ifcall.Fid) + if err != nil { + r.err = ErrDupFid + goto resp + } + r.fid.path = &quot;.&quot; + r.fid.uid = ifcall.Uname + fsys, ok = c.s.fsmap[ifcall.Aname] + if !ok { + r.err = fmt.Errorf(&quot;no such file system&quot;) + goto resp + } + r.fid.fs = fsys + fi, err = fs.Stat(ExportFS{c.s.fsmap[ifcall.Aname]}, &quot;.&quot;) + if err != nil { + r.err = fmt.Errorf(&quot;stat root: %v&quot;, err) + goto resp + } + r.fid.qidpath = fi.Sys().(*Stat).Qid.Path + r.ofcall = &amp;RAttach{ + Qid: fi.Sys().(*Stat).Qid, + } +</code></pre> + +<h3>flush</h3> +<p> +指定されたリクエストの<code>flush</code>メソッドを呼び出す。<code>flush</code>メソッドはリクエストの<code>done</code>チャンネルを閉じ、リクエストのタグを削除する。処理に時間のかかるものは、リクエストの<code>done</code>チャネルが閉じられたら、その処理を中止する。</p> +<pre><code>// flush cancels the request by calling r.cancel. +// It also delete the request from its pool. +func (r *request) flush() { + close(r.done) + r.pool.delete(r.tag) +} +</code></pre> + +<h3>walk</h3> +<p> +仕様に書かれている通りの条件を確認した後、ファイルツリーを順番に辿り、得られた<code>Qid</code>を記録してクライアントに返す。</p> +<pre><code> wqids = make([]Qid, 0, len(ifcall.Wnames)) + cwdp = oldFid.path + for _, name := range ifcall.Wnames { + cwdp = path.Clean(path.Join(cwdp, name)) + if cwdp == &quot;..&quot; { + cwdp = &quot;.&quot; // parent of the root is itself. + } + stat, err := fs.Stat(ExportFS{oldFid.fs}, cwdp) + if err != nil { + break + } + wqids = append(wqids, stat.Sys().(*Stat).Qid) + } + if len(wqids) == 0 { + newFid.qidpath = oldFid.qidpath + } else { + newFid.qidpath = wqids[len(wqids)-1].Path + } + newFid.path = cwdp + newFid.uid = oldFid.uid + newFid.fs = oldFid.fs + r.ofcall = &amp;RWalk{ + Qids: wqids, + } +</code></pre> + +<h3>open</h3> +<h3>create</h3> +<h3>read</h3> +<h3>write</h3> +<h3>clunk</h3> +<h3>remove</h3> +<h3>stat</h3> +<h3>wstat</h3> + diff --git a/content/draft/_index.html b/content/draft/_index.html @@ -0,0 +1,5 @@ ++++ +date = '2026-02-27T20:26:09+09:00' +draft = true +title = 'Draft' ++++ diff --git a/content/draft/how_to_throw_away_smart_phone.html b/content/draft/how_to_throw_away_smart_phone.html @@ -0,0 +1,22 @@ ++++ +date = '2021-12-20T00:00:00+09:00' +draft = true +title = '携帯電話捨てた' ++++ +<time>2021-12-20</time> +<h2>スマートフォンを捨てたくなった。</h2> +<p>この端末から得られる情報にはあまりにも無駄が多いこと、そしてGoogle等に自分の情報を売り飛ばしている懸念が大きいこと。この2点が徐々に気になりだした。さらに通信料を節約する観点から楽天モバイルに変え、あまりスマートフォンを持ち歩かなくなった。そうして今迄どれほどの時間と神経をこの小さな機械に奪われてきたかに気付かされた。それと並行して、なにか情報を得たい時にパソコンを利用する機会が増え、いよいよこの端末を持っていること自体が嫌になった。いっそうのこのスマートフォンのない生活をしてやろうと思いたったのだ。</p> +<p>ここで、僕が捨てたいのはスマートフォンだけでなく、「何時でも何処でも連絡が取れてしまう便利な機械」である。世の中には電話以外にほぼなにもできない端末も売られているが、それも持ちたくない。携帯電話の番号ごと捨ててしまいたいのだ。</p> +<p>ところがこれが案外難しい。現状スマートフォンで利用しているサービスは、LINE、SMS、銀行のワンタイムパスワード、マイナポータルくらいである。この内マイナポータルは多少面倒だが市役所に行けばいいし、銀行もコンビニのATMで済ませられる。LINEはほぼ使っていないがたまに学生の時のグループに連絡が入る。しかしこれもメールでできなくもない。厄介なのはSMSである。なぜかSMSによる二段階認証をしないと利用できないサービスが存在するのだ。これを最初に書いていた頃には暗号資産の取引所を利用していたが、現在は解約した。<p> +<p>Googleのメールアドレスを長らく使っていたが、サーバーを借りて独自ドメインのメールアドレスを手に入れたので、これを機にウェブサービスに登録しているアドレスを随時変更して行った。一部学生のころのアドレスを利用していたアカウントがうまく変更できずにいる。特にマイクロソフトのアカウントはログインすら出来なかった。しかし概ねメールアドレスの変更と、使っていないアカウントの削除はできたと思うのである程度は諦めることにした。どうせ就職活動の時に手当たり次第作ったものは作ったことすら忘れていたりするだろうし。</p> + +<h2>令和4年6月6日携帯を解約した。</h2> +<p>ひと通りウェブサービスのアカウントを整理した所で、いよいよ携帯電話を持っている必要が無くなってしまった。そして6月6日の夜、勢い余って楽天モバイルを解約し、ラインのアカウントも削除してしまった。この日は気分よく寝れた。</p> + +<h2>Googleにログインできなくなった。</h2> +<p>携帯を解約し、メールアドレスを変更したとは言え、まだGoogleのメールの方にもあちこちからメールが届いていた。自分で把握できていないウェブサービスからである。当面はこちらのメールも時々確認して、消し忘れていたアカウントを削除していこうと考えていた。</p> +<p>ところがいつのことだったか、パソコンのneomuttからGoogleのアカウントにアクセスできなくなった。どうやら二段階認証の設定が必須になったようだ。然しこの二段階認証は携帯電話の番号が必要なようで、携帯を解約した僕にはどうすることもできない。そこで仕方なくブラウザでGoogleにログインして利用することにした。10年以上前のパソコンではかなり重くて使い辛いが、まあ日常的に確認するものではないので問題なかった。然し今度はブラウザからのログインも不可能にされてしまった。これもSMSによる二段階認証以外の方法はないようである。知らぬ間にセキュリティ強化と称してこちらの選択肢を無くしてしまうやり方にとうとう愛想が尽きた。とりあえず母の携帯を借りてログインし、すぐにアカウントごと消してしまった。</p> + +<h2>選択の自由</h2> +<p> + diff --git a/content/draft/keitai.html b/content/draft/keitai.html @@ -0,0 +1,17 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = '携帯電話を持たない生活' ++++ +<h2>はじめに</h2> +<p>学生の頃僕はスマートフォンをよく利用していた。今時の一般的な利用頻度だったと思う。LINEやSNSのアプリをインストールして利用していたし、ニュースや動画もよく閲覧していた。</p> +<p>学生生活も終わりに差し掛った頃、仕送りの残高の確認を怠ったことから一時お金に困ったことがある。親に泣き付くこともできただろうが、間も無く社会人になるこの時期に一度、出費の整理をしようと思いたった。家の中を見渡せばどれもこれも無駄なものばかりが溢れていた。物を片っ端から捨て、買う物を厳選するよう心掛けた。この時に携帯の料金も当然目に付いた。月に何千円も払ってるのがあまりにも無駄に思えた。かと言って電話が使えないのは少し困る。就職先との連絡にも使うかもしれない。この時は携帯電話を完全に解約することは考えず、ただ電話だけのプランに変更した。然しキャリアと少しトラブルがあり、楽天モバイルのサービス開始とも時期が重なったのでそちらに移行することにした。その後すぐ会社を辞めて実家に帰ることになったが、家ではwifiに繋ぎ、外にはほぼ持ち出さないのでずっと無料で使えていた。ところが最近になった突然無料プランが廃止されることになった。</p> +<p>今携帯電話はほとんど使っていない。家に置きっぱなしだし、その家ではwifiがあるので携帯電話の通信は必要ない。なにより僕はこのスマートフォンという機械が嫌いである。root権限を得られず、無駄なアプリが沢山インストールされており、削除することすらできない。更にGoogleのアカウントが無いと満足に使うこともできない。僕はこのハードウェアを購入しただけの積りだったが、どうやら知らぬ間にGoogleとの契約を交してしまったようだ。また、パソコンに慣れているということもあり、タッチパネルが苦手である。年老いたものだ。兎に角どこを取ってもこの機械を持ちたくない理由ばかりである。こんなものの為に毎月千円払うのはなんとも虚しいのだ。</p> +<p>とは言っても電話番号を捨てるのは少しばかりハードルが高かった。SMSによる二段階認証が必要なサービスをいくつか利用していたのだ。然し最近やたらあちこちに自分のアカウントが散らばっているのが気になり、少しずつ解約を進めていた。そして今、パソコンに保存していたパスワードを頼りに使わないものを一通り解約し終わった。これで携帯電話を解約できるはず。</p> +<p>ところがスマートフォンにはLINEが残っていた。アカウントには携帯の電話番号が登録されている。インターネットで検索したりLINEに直接問い合わせたが、どうやらこの番号は消せないようである。丁度良い機会なのでLINEのアカウントも削除してしまおうと思い、した!</p> +<p>胸がすく。</p> + +<h2>Apple、Google、Microsoft</h2> +<p>今の日本に於て携帯電話を持っていないのは異常である。そしてほとんどの携帯はスマートフォンである。スマートフォンのOSと言えばiOS若しくはAndroidがほとんどである。前者を利用するにはAppleのIDが、後者はGoogleのアカウントがそれぞれ必要である。つまりほとんど全ての日本人がAppleかGoogleに紐付いていると言える。もちろん他の選択肢も無いことはないが、それらを利用している人数はほぼ無視できるだろう[要出典]。パソコンの方に目を向けて見ても同じようなものである。最近Windowをインストールして利用するにはMicrosoftのアカウントが必須になったようだ。他のOSはAppleかGoogleのものであるので同じことである。ただしパソコンはLinuxやBSD、Plan9等もあるのでスマートフォンよりは圧倒的にましではある。</p> +<p>世の中の流れとは、あるいは世論とは、本来その世の中に生きる一人一人が作り出すものである。各自が自身の内面からくる欲望と、身近な人への配慮との間に自分の行動が発生するはずだ。ところが今、そういった世の流れはどこか遠くからやって来て、自分達はただその波にゆられるだけである。自分自身が波に影響を与えることがないと多くの人は思っているのではないか。ほんの少し前まではその波はテレビだったり新聞だったりが起していた。ところが今はインターネットに溢れる広告やら検索結果やらで知らぬ間に脳の中に入り込んでいる。</p> + diff --git a/content/draft/life.html b/content/draft/life.html @@ -0,0 +1,25 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = '暮し' ++++ + +<p> +朝4時、太陽がまだ昇らないうちに起き、家の隣にある畑へ。夏の熱気に勢いをつけた草を整理し、種を蒔く。この日は黒田五寸を蒔いた。朝食べる野菜を少し収穫して台所に戻る。家内が米を研いでいる。枝豆、山東菜、とうもろこし、大根と日野菜の間引き菜、真黒茄子。枝豆、とうもろこしを茹でる。間引き菜を味噌汁に。山東菜はそのままサラダ。茄子は糠に漬け、昨日の胡瓜と入れ替える。昨日干しておいた鯵の味醂干しを焼く。子供が起きてきていただきます。</p> + +<p> +午前中は少しだけ仕事をする。最近はプログラミングばかりしている。仕事といってもボランティアで収入にはならない。偶にだれかがビットコインを寄付してくれる。</p> + +<p> +昼はパンを少しだけ。この日は2日前に焼いたもの。アゼルバイジャンのオバチャンがYoutubeで焼いていたものを適当に真似てみた。小麦粉に酵母、塩、砂糖を混ぜ、水でこねる。一次発酵の後、小分けにして二次発酵。楕円にのばして三次発酵の後、卵をぬり胡麻をふりかけて焼成。動画では楕円にしたあとコップで穴を開けていたがこれは省いた。棒にさして売りに行っていた名残とかなんかな。</p> + +<p> +食べた後は昼寝をする。夏は夜の睡眠時間が短くなるので昼寝は必須である。</p> + +<p> +眠気が覚めたら家のリフォームの続きをした。この家は祖父が建てたもので、木造ではあるが残念ながら近代的な造りである。礎石ではなくコンクリートのベタ基礎だし、筋交いがいたる所にある。建て直しも考えたが、今あるものを大切にするのもいいと思い、内装だけ変えることにした。今は台所に竃を作っている。先週までに三和土の土間を作り終えたので、この上に土を盛って形はほぼできている。仕上げに黒い漆喰を塗った。竃の場所は家の南東角で、二階建の家にあって唯一上に部屋が無い場所である。煙突は設けず、天井をひっぺがして小屋組に煙がまわるようにした。</p> + +<p> +穴の開いた浴衣の袖を修理しているところに子供が友達を従えて帰ってきた。</p> + + diff --git a/content/draft/light.html b/content/draft/light.html @@ -0,0 +1,19 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = '照明は(あんまり)いらない' ++++ +<h2>照明のない生活</h2> +<p>僕は長らく照明をほぼ使わない生活をしている。学生の頃節約にはまり、出費をあれこれ見直していると、部屋の天井であたりまえのように光り輝いている電灯が目についた。もともと不眠症ということもあり、電灯を消したほうがいいのではないかと、しばらく使わない生活をしてみた。といっても夜は真っ暗になるので、たまたま棚の奥で暇そうにしていたハリケーンランタンを引っ張り出して久々に灯した。やっぱりこっちの方が雰囲気もあっていい。ということでしばらく電灯を使わない生活をしていると、悩みの種だった不眠症は嘘のように無くなった。すごく寝付きがいいのだ。</p> +<p>就職先が決まり引越した時も、新居の天井には何も付けないで置いた。この家では台所の換気扇に暖色の豆電球が付いていたので夜はこれを使うことにした。</p> +<p>仕事を辞めて実家に帰って来てThinkPad X220を買ったので、ウェブカメラの横についているThinkLightを使っている。本当はランタンを使いたいのだが、同居人に臭いと言われるので控えている。リビングに居てはこれまた同居人がいるので真っ暗にはさせてもらえない。</p> + +<h2>変化</h2> +<p>こんな経緯でもう何年か照明を控えた生活をしている。すると身体にはいろいろと変化があるものである。ひとつ目は既に書いたが、寝付きがよくなったことである。セロトニンだかメラトニンだか知らないがやはり身体が夜を検知しているようだ。ふたつ目は暗くても物が見えるようになったことである。慣れれば見えるのだ。あるいは視力だけでなく、どこに何を置いたのかよく記憶しているのかも知れない。文明が身体を蝕んでいる証拠でもあろう。みっつめは世の中がまぶしくて仕方がなくなったことである。どうしてこうも電灯を点けて喜んでいるのか。</p> +<p>天井に電灯があり、昼も夜も灯すのが当然となっている。どうしてこうなったのか。昼は天気の善し悪しを観じ、夜は月の満ち欠けを知る。電灯は世界とのこの一体感を我々から奪ってしまった。宇宙の波動を全身で受けずして身体が整うはずがない。不眠症患者は睡眠薬を飲む前にすることがいくらでもあろう。</p> +<p>古来人間は暗い夜を火の灯りだけで生活して来た。日本の家においては昼間も薄暗いものだった。夜暗くて物が見えないのではなく、日頃不必要に明るくしているから見えないのである。便利は人間を軟弱にする。</p> +<p>ところで世の中はどうしてこうも明るいのか。スーパーもコンビニもしんどい。ドラッグストアは近付くことも憚られる。電気が足りぬと言う前に使い方を考えたらいいものを。そして夜は明るさが正義とばかりに街灯を立て、空から光を奪っている。</p> + +<h2>おわりに</h2> +<p>節約にもなるしゆったりした時間を過ごせるので電気消してみんかい?</p> + diff --git a/content/draft/medical_care.html b/content/draft/medical_care.html @@ -0,0 +1,8 @@ ++++ +date = '2022-01-24T00:00:00+09:00' +draft = true +title = '医療' ++++ +<time>2022-01-24</time>作成 +<p> + diff --git a/content/draft/migration.html b/content/draft/migration.html @@ -0,0 +1,69 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = '移住計画' ++++ +<h2>はじめに</h2> +<p> +都会が合わなくて田舎に戻った。 +しかし田舎といっても山村ではない。 +中途半端に都市化した街である。 +近くに高速道路があり、耳澄ませば行き交う車の音がいつも聞こえてくる。 +防災無線は毎日二回放送があり、12時と17時にはチャイムが鳴る。 +夜になってもあちこちで電灯が灯って星がよく見えない。 +</p> + +<h2>山の条件</h2> +<h3>静かであること</h3> +<p> +都会が合わなかった理由として初めに思い浮ぶのは音である。 +都会は雑音で満ちている。 +何処の店に行っても必ず音楽が流れているし、商店街等では路上でも音楽が響いている +ことさえざらである。 +さらにゴミ収集車は単純な旋律を練り廻っていて、廃品回収車やさおたけ屋が後に続く。 +防災無線は街中何処にいても必ず聞こえるように配置されている。 +このような場所において精神を正常に保つのは不可能だった。 +</p> +<p> +ということでひとつめの条件は静寂である。 +</p> +<p> +ただし自然な音は気にしない。 +実家の周りが田圃だったので夏にはかえるの大合唱が聞こえるが、これを五月蝿いとは +感じない。 +</p> +<p> +最近実家近くの山を探索している。たしかに実家にいるよりはるかに静かだが、 +立ち止まって耳を澄ませるとやはり高速道路の騒音が聞こえる。 +他の音が少ないだけに余計目立つ。 +それに防災無線の音はむしろひどい。 +山の裾にある集落のために建てられたものがあり、そこから遮るものがないので +かなりよく聞こえる。 +</p> + +<h3>安全で清潔な水源があること</h3> +<p> +実家の近くに綺麗な小川があるので水源を探ろうと山に分けいった。 +途中小さな滝があり、それを見上げるように祠があり、登るほど期待が高まった。 +ところがある程度行くと谷すじにごみがめだつようになってきた。 +さらに進むと突然コンクリートの壁が立ちはだかり、水はそこにあけられた +小さな穴から流れていた。 +コンクリートの上は舗装された道路で、ごみはそこから投げ捨てられていたようだ。 +ごみのなかには電化製品もまじっているので、何が溶け出しているかわかったものではない。 +クリーンセンターに持っていけば無料で引き取ってくれるのを知らないのだろう。 +</p> +<p> +最近のことでもないのかもしれないが、やたらと山奥にまで綺麗に舗装された +道路が伸びている。海南から紀美野町を抜けて高野山に続く道が少しづつ +広く真っ直ぐにされつつある。 +よっぽど山奥に住まない限り道路の呪縛からは逃れられないのかもしれない。 +</p> +<h3>実家から通えること</h3> +<h3></h3> + + +<h2>近くの山</h2> +<h3>藤白山</h3> +<p> +</p> + diff --git a/content/draft/myrica_rubra.html b/content/draft/myrica_rubra.html @@ -0,0 +1,15 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = 'ヤマモモ' ++++ +<span class="binomial name"><i>Myrica rubra</i> Sieb. et Zucc.</span> +<h2>概要</h2> +<h2>利用</h2> + <h3>食べ方</h3> + 濃い紫になったものを生でそのまま食べる。 + 種を取り除いてジャムに。 + ホワイトリカーに漬けて果実酒に。 + <h3>染料として</h3> + 樹皮をはいで + diff --git a/content/draft/openbsd_installation.html b/content/draft/openbsd_installation.html @@ -0,0 +1,61 @@ ++++ +date = '2021-12-16T00:00:00+09:00' +draft = true +title = 'OpenBSDインストール' ++++ +<time>2021-12-16</time> +<p>OpenBSDをノートパソコンにインストールしたのでその時のメモ</p> + +<p>インストール用のライブUSBを作成</p> +<p>ブート</p> +<p>指示通りインストール</p> + +<p>Reboot</p> +<p>通常ユーザーでログインしてルートユーザーになる</p> +<pre><code>$ su +Password: +</code></pre> + +<p><code>doas(1)</code>を設定して通常ユーザーに戻る</p> +<pre><code># cp /etc/examples/doas.conf /etc/ +# sed -i 's/permit keepenv :wheel/permit nopass keepenv :wheel/' /etc/doas.conf +# exit +$ doas echo unko +unko +</code></pre> + +<p><code>syspatch(8)</code>をあてる</p> +<pre><code>$ doas syspatch +... +Relinking to create unique kernel... done. +</pre></code> + +<p><code>apmd(8)</code>を設定</p> +<pre><code>$ doas rcctl enable apmd +$ doas set apmd flags -A -z 10 +$ rcctl start apmd +apmd (ok) +</pre></code> + +<p>wi-fiを設定</p> +<pre><code>$ ifconfig +... +iwn0 flags=... +... +$ ifconfig iwn0 up +$ doas sh -c 'echo "join <i>ssid</i> wpakey <i>password</i> +autoconf" > /etc/hostname.iwn0' +$ doas chown root:wheel /etc/hostname.iwn9 +$ doas chmod 0640 /etc/hostname.iwn0 +$ doas sh /etc/netstart +... +</pre></code> + +<p>必要なパッケージをインストール</p> +<p><code>dotfiles</code>をダウンロード</p> +<p>suckless utilitiesをインストール</p> +<p><code>man(1)</code>のパスを設定</p> +<p><code>slock(1)</code>を設定</p> +<p><code>xenodm(1)</code>を設定</p> +<p><code>mail(1)</code>の設定<a href="https://www.c0ffee.net/blog/openbsd-on-a-laptop/#base-utilities">ref</a></p> + diff --git a/content/draft/opinion.html b/content/draft/opinion.html @@ -0,0 +1,12 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = true +title = '意見の言い方' ++++ +<h2>檀家とのやりとり</h2> +<p>落葉を掃除している檀家さんに、落葉を綺麗にするのが本当にいいことかどうか分からないという話をした。自分の意見を言った上で相手からも考えを聞き出したかった。ところがこの人は自分の献身を否定されたと感じたらしく、機嫌が悪くなり、なにも聞いてくれなかった。一方的にこちらの言うことを全否定して終わりである。言い方やタイミングも悪かったのだろうが、こんなに拒絶されるとは思わなかった。</p> +<p>住職の奥さんは台所の整理を全くしない。冷蔵庫はぐちゃぐちゃで、奥からは腐ってなにか判別できなくなたものが沢山でてきた。中には賞味期限が10年以上前のものもあった。僕もこの寺で生活することになり、食事の用意も手伝うようになったので、少しはましな状態にしたいと思い、本人の了承のもとで古いものを全て捨てた。冷蔵庫が綺麗になり、気分よく料理できるようになった矢先、この奥さんが果物を大量に買って来た。境内で採れた西瓜や以前に買っていたバナナも残っているにも関わらずである。次の日も食べる物は冷蔵庫にたくさんあるのにスーパーで天麩羅を買ってきた。冷蔵庫の整理は結構疲れるので、これを繰り返されてはたまらない。少し小言を言った。そしたら次の日にお前は小姑のようだと言われた。</p> +<p>冷蔵庫だけでなく、寺の中もかなり物であふれている。檀家さんの好意で寺に置かれているものも多いので質が悪い。これについても色々言いたいことはあるし、実際少し言った。これなんかも奥さんには負担だったらしい。こちらにもかなり負担なのだが。</p> +<h2>宗門の批判</h2> +<p>食事中、宗門の批判をし続けて宗門に嫌われた人の話がでた。自分が正しいと思っていることを言い続けただけのことだ。住職の奥さんはなぜこれほど反発を招いたのか全く分からないと言う。やはり僕は寺の環境を良くするためにも言いたいことは言い続けるべきなのだろうか。</p> + diff --git a/content/draft/relayd.html b/content/draft/relayd.html @@ -0,0 +1,37 @@ ++++ +date = '2025-07-17T00:00:00+09:00' +draft = true +title = 'relayd、httpd、acme-client' ++++ +<time>2025-07-17</time> + +<h2>はじめに</h2> +<p> +このサーバーでは<code>httpd</code>により80番ポートと443番ポートを監視してウェブサイトを運用していたが、別のソフトウェアを使ってバーチャルホストを立てたくなった。そこで、<code>httpd</code>の手前に<code>relayd</code>を挟んで、外から80番、443番ポートへの通信をサブドメインによって振り分けるようにした。</p> + +<figure> +<figcaption>Before</figcaption> +<pre>Internet -- tcp/80,443 -- httpd +</pre> +</figure> +<figure> +<figcaption>After</figcaption> +<pre>Internet -- tcp/80,443 -- relayd -- tcp/8080,8443 -- httpd + └------ tcp/8081 -- other http server +</pre> +</figure> + +<h2>httpd.conf</h2> +<p> +<code>httpd.conf</code>は80番ポートを監視している部分はポート番号を変更するだけでいい。443番ポートの方はポート番号の変更に加え、<code>tls</code>の部分を削除する。tlsは<code>relayd</code>が行なう。</p> + +<h2>acme-client.conf</h2> +<p> +こちらは<code>full chain certificate</code>のパス<code>relayd</code>が見つけられるように変更する。 +</p> + +<h2>relayd.conf</h2> +<p> +80番ポートはそのまま8080番に転送する。443番ポートはtlsをかませて8443番に転送する。</p> + + diff --git a/content/draft/safety_convenience.html b/content/draft/safety_convenience.html @@ -0,0 +1,24 @@ ++++ +date = '2023-02-21T00:00:00+09:00' +draft = true +title = '安全装置と便利なもの' ++++ +<time>2023-02-21</time> +<h2>安全装置は安全か</h2> +<p> +安全装置が至る所にある。キッチンのコンロは鍋を置かないと火が着かない。鍋を持ち上げると火が小さくなる。温度が高くなっても自動で火が小さくなる。温度が100度程度で安定している状態から100度を越えて上昇すると勝手に火が消える。煮こみ過ぎて焦げ付くのを防ぐためだろう。火を着けてから2時間が経過すると無条件に消える。消し忘れを防止するためである。 +</p> +<p> +自動車にも安全のための機能があれこれ搭載されている。アクセルペダルとブレーキペダルの踏み間違いを防止するもの、自動ブレーキ、車線からはみ出さないようにするもの。 +</p> +<p> +これらは本当に安全性を高めているのだろうか。</p> + +<h2>便利なものに副作用はないのか</h2> + +<h2>安全装置は危険を増長し、便利なものは身体を不便にする</h2> + +<h2># rm -rf /</h2> + +<h2>危険と不便は身体の感覚を磨く</h2> + diff --git a/content/draft/vi.html b/content/draft/vi.html @@ -0,0 +1,30 @@ ++++ +date = '2024-10-27T00:00:00+09:00' +draft = true +title = 'vi -- テキストエディタ' ++++ +<time>2024-10-27</time> +<h2>コマンドの実行</h2> +<p> +バッファにコピーした任意のテキストをコマンドとして実行できる。</p> +<ul> +<li> +コマンドをどこかの行に入力。 +</li> +<li> +コマンドをバッファ<code>q</code>へコピー: +<code>0"qy$ +</code> +</li> +<li> +バッファ<code>q</code>内のコマンドを実行: +<code>@q +</code> +</li> +</ul> +<p> +例えば単語をhtmlの<code>code</code>タグで囲むコマンド: <pre><code>i&lt;code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u>lea&lt;/code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u> +</code></pre> +をどこかに入力し、その行でコマンドモードに移行し、<code>0"qy$</code>とすると<code>q</code>バッファに上のコマンドがコピーされるので、<code>code</code>タグで囲みたい単語の先頭に移動し、<code>@q</code>と入力するとその単語が<code>code</code>タグで囲まれる。 + + diff --git a/content/draft/xlib2.html b/content/draft/xlib2.html @@ -0,0 +1,152 @@ ++++ +date = '2022-12-16T00:00:00+09:00' +draft = true +title = 'Xlibで遊んでみる' ++++ +<time>2022-12-16</time> + +<h2>はじめに</h2> +<p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> +<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> +<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 + +<h2>初期設定</h2> +<p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p> +<pre><code> +#include &lt;stdio.h&gt; +#include &lt;stdlib.h&gt; +#include &lt;X11/Xlib.h&gt; + +/* macros */ +#define INIT_WIDTH 800 +#define INIT_HEIGHT 600 + +/* variables */ +Display *display; +Window window; +unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; +GC gc; +Atom wm_delete_window; + +void +setup(void) +{ + // Open a display. + if ((display = XOpenDisplay(NULL)) == NULL){ + fprintf(stderr, "ERROR: could not open display\n"); + exit(1); + } + // Create a window. + window = XCreateSimpleWindow( + display, + XDefaultRootWindow(display), + 0, 0, + win_width, win_height, + 0, 0, + 0); + XStoreName(display, window, "UNKO"); + + // Setup a graphical context. + gc = XCreateGC(display, window, 0, NULL); + XSetForeground(display, gc, 0xFFFFFF); + + // Kill the application when the window is destroyed. + wm_delete_window = XInternAtom(display, + "WM_DELETE_WINDOW", False); + XSetWMProtocols(display, window, &wm_delete_window, 1); + + // Setup which input to process. + XSelectInput(display, window, + ExposureMask|KeyPressMask|KeyReleaseMask); + + // Actually draw the window. + XMapWindow(display, window); +} + +void +clean_up(void) +{ + XCloseDisplay(display); +} +</code></pre> + +<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> +<pre><code>#include &lt;time.h&gt; + +int +main(void) +{ + int px, py; + int quit; + struct timespec ts; + XEvent event; + + setup(); + quit = 0; + + while (!quit){ + while(XPending(display) > 0){ + XNextEvent(display, &event); + switch (event.type){ + case KeyPress: { + switch (XLookupKeysym(&event.xkey, 0)){ + case 'q': + quit = 1; + break; + default: + break; + } + } break; + case ClientMessage: { + if ((Atom) event.xclient.data.l[0] == wm_delete_window) { + quit = 1; + } + } break; + default: + break; + } + } + clock_gettime(CLOCK_MONOTONIC, &ts); + px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); + py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); + XClearArea(display, window, + 0, 0, // position + win_width, win_height, // width and height + False); + XFillRectangle(display, window, gc, + px, py, // position + 100, 100); // width and height + + ts.tv_sec = 0; + ts.tv_nsec = 10 * 1000 * 1000; + nanosleep(&ts, NULL); + } + + cleanup(); + return 0; +} +</code></pre> + +<p>文字を表示。<code>XDrawString</code></p> + +<h2>キーボード入力</h2> +<p>キーボードの入力を受け付けるようにする。入力によって四角形の位置や速度を変化させる。</p> +<p>ここまでできればかなりなんでもできるようになる。</p> + +<h2>FPSの固定</h2> +<p>前のフレームからの経過時間を計測して1/FPSを越えるまで待機させる。このときに<code>nanosleep</code>を使うとなぜか上手くいかなかった。OSに処理をブロックされる為か?とりあえず<code>while</code>ループの中でひたすら時刻を読んでいるのだが、これでいいんかな。リソースの無駄遣いではないんかな。</p> + +<h2>メニューの実装</h2> +<p>メニューとゲームの推移を実装した。</p> + +<h2>当たり判定</h2> +<p>とりあえず適当に実装した。2体間の衝突のみ判定しているので近くに別の物体がいるとめりこむ場合がある。</p> +</p> + + +<h2>参考</h2> +<ul> +<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> +<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> +</ul> + diff --git a/content/error/404.html b/content/error/404.html @@ -0,0 +1,6 @@ ++++ +date = '2021-02-08T00:00:00+09:00' +draft = false +title = '404 Not Found' ++++ + diff --git a/content/farm/_index.html b/content/farm/_index.html @@ -0,0 +1,17 @@ ++++ +date = '2023-01-19T00:00:00+09:00' +draft = false +title = '農業' ++++ +<p> +実家の近くに田畑を借りて作物を育てています。1反の畑と9畝の田圃です。川口由一さんの提唱された、耕さず、農薬や肥料を持ち込まず、草や虫を敵としない自然農を行っています。 +</p> +<p> +<time>2023-01-19</time>令和4年の5月頃、体調を崩したため一旦畑は地主さんに返すことにしました。以来農業からは離れています。 +</p> +<h2>日誌</h2> +<ul> + <li><a href=/farm/journal/2022.html>令和4年</a></li> + <li><a href=/farm/journal/2021.html>令和3年</a></li> +</ul> + diff --git a/content/farm/journal/2021.html b/content/farm/journal/2021.html @@ -0,0 +1,150 @@ ++++ +date = '2022-01-27T00:00:00+09:00' +draft = false +title = '令和3年 農業日誌' ++++ +(旧暦) + +<h3>師走</h3> +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">25日</div> +<time>2022-01-27</time> +</div> +晴。畑の畝作り。菜っ葉の間引き。畝の間の溝に水が貯まっている。もう少し乾燥していたほうがいいのだろうか。菜っ葉はどれも成長が良いように見える。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">6日</div> +<time>2022-01-08</time> +</div> +晴。畑の方に畝を少し作った。じゃが芋を植えたいので少し高めの畝にする。昨年度は雨が続いて水没した部分が腐ってしまったのだ。今年はうまくいくといいな。新暦では年が明けた。今日は一日遅れたが七草粥を食べた。畑の隅に大根の余った苗をまとめていたのでそれを抜いて粥に入れた。成長がいいものは太さが15mm程度になっていた。玉葱の苗もまた少し定植した。始めの方に植え替えたもののうち一本だけ葉が太く、濃い緑になっていた。他のものは植えてから変化がないように見える。麦も変化があまりない。 +</div> + +<h3>霜月</h3> +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">19日</div> +<time>2021-12-21</time> +</div> +晴。田圃の溝を少し整備。麦が成長してひとつめの畝は遠くからでもうっすらと緑に見えるようになった。畑の野菜もそれなりに育っている。 +<figure><figcaption>和歌山大根</figcaption><img src="pics/DSCF0249.JPG" alt="和歌山大根"></figure> +<figure><figcaption>大和真菜</figcaption><img src="pics/DSCF0252.JPG" alt="大和真菜"></figure> +<figure><figcaption>松島新二号白菜</figcaption><img src="pics/DSCF0255.JPG" alt="松島新二号白菜"></figure> +<figure><figcaption>いちばんぼし(裸大麦)</figcaption><img src="pics/DSCF0257.JPG" alt="いちばんぼし(裸大麦)"></figure> +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">17日</div> +<time>2021-12-19</time> +</div> +曇り時々雨。玉葱の定植。白菜、大根、真菜等が大きくなってきた。麦も大分育ったので踏もうとしていたら雨が降って来てできなかった。畔に子猫が居た。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">12日</div> +<time>2021-12-14</time> +</div> +晴。久々に冬らしく寒い朝だった。昼間は日が照って暑い。壬生菜の定植。畝作り。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">9日</div> +<time>2021-12-11</time> +</div> +晴。麦蒔きが完了した。庭のプランターに植えていた壬生菜を半分ほど畑に植えかえた。大根がわずかに太くなっている。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">7日</div> +<time>2021-12-10</time> +</div> +晴。日差しが強くて暑い。麦の続き。4本目の畝は小さいので草を刈らずに上から蒔いた。結局草刈りは全部は終わらず次の日に持ち越し。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">5日</div> +<time>2021-12-08</time> +</div> +晴。麦の続き。3本目の畝に蒔き終わった。始めに蒔いたところはそろそろ麦踏みか。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">3日</div> +<time>2021-12-06</time> +</div> +晴。麦の続き。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">1日</div> +<time>2021-12-04</time> +</div> +曇時々晴。麦の続き。玉葱の移植。太いものから7本植えた。 +</div> + +<h3>神無月</h3> +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">29日</div> +<time>2021-12-03</time> +</div> +晴。麦の続き。疲れがでてしばらく休んでいた。気付けば一週間ぶりの作業である。急いては事を仕損じる。結局ゆっくりやったほうが早く蒔けていただろう。始めに蒔いた麦はもう5cmほどに成長していた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">21日</div> +<time>2021-11-25</time> +</div> +曇時々雨。麦を蒔くための草刈りの続き。今日は200g蒔けた。既に蒔いていたものからもやしのようなものが出ているのを確認。根っこか。玉葱と壬生菜の苗も大きくなってプランターでは窮屈そうなので早く定植しなければ。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">19日</div> +<time>2021-11-23</time> +</div> +晴のち曇。麦を蒔くための草刈りの続き。3時頃まで出掛けていたので今日は1時間だけ作業。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">17日</div> +<time>2021-11-21</time> +</div> +晴。麦蒔きの続き。蒔いてから草を刈るのではいそがしいので草を刈ってから蒔くことにした。また短期間のうちに全面蒔くのはあきらめた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">16日</div> +<time>2021-11-20</time> +</div> +晴。麦を蒔いた。一番長い畝の2/3ほど蒔けた。ばら蒔きした後草を刈る。この草刈に思ったより時間がかかる。のこぎり鎌でないと歯がすぐに丸くなる。買い替えようか。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">14日</div> +<time>2021-11-18</time> +</div> +曇後晴。昼過ぎまで曇りで寒かったが昼から晴れて暑い。麦の畝がだいたい形になったところに丁度麦の種が届いた。和歌山県農業公社に申請していた畑を借りるための申請が通りそうだと、JAの人から連絡が入った。晴れて農家である。畑の方に山東菜を蒔いた。作業が続いて筋肉の動きが鈍ってきた。疲れない動き方ができるようになりたい。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">13日</div> +<time>2021-11-17</time> +</div> +快晴。朝は季節にふさわしく寒いが日差しが強く昼は暑い。出掛ける時、以前声を掛けてくれた92才のおじいちゃんとすれ違う。田圃に畝を作るために溝を掘った。この田圃を借りてから続けていた作業だがもう少しで終りそうだ。11月中旬が麦蒔ききの適期であり既に少し遅い。田圃の隣のおばちゃんが蜜柑をくれた。 +</div> + diff --git a/content/farm/journal/2022.html b/content/farm/journal/2022.html @@ -0,0 +1,192 @@ ++++ +date = '2022-05-09T00:00:00+09:00' +draft = false +title = '令和4年 農業日誌' ++++ +(旧暦) + +<h3>卯月</h3> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">9日</div> +<time>2022-05-09</time> +</div> +溝掃除。しばらく雨が降っていない。最後に米を蒔いてからは一回も降っていないと思う。曇って来たので降ってくれることを期待。畑の真黒茄子の一部が発芽した。自分用のメモとしてこの日誌を書いているので作物の位置関係が分かりにくい。なんかうまいこと表示できるやつ作ろうかな。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">4日</div> +<time>2022-05-04</time> +</div> +晴れ。朝は寒く、昼から暑い。一ヶ月程機構が戻ったようだ。昨年キミノーカで買った栗南瓜を、以前蒔いた南瓜の南に、春菊を白もちとうもろこしの一回目の北に、寄居蕪を白もちとうもろこしの二回目の北に、五角オクラを米の隣の里芋の南に、ときわ地這い胡瓜をこのオクラと里芋と同じ場所に、いちずいんげんを鷹の爪から米までの間にある背丈の高い草の足元に植えた。米の所に生えていた雑草は成長が案外遅く、米の方が高くなりつつある。じゃが芋のアンデスに花が咲いていた。鷹の爪の北に蒔いた葱がようやく生えてきた。生きとったんかわれ。麦は早いものはもう収穫してもよさそうなくらい色付いてきた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">2日</div> +<time>2022-05-02</time> +</div> +米の続き。最後の4mを鷹の爪の南に蒔いた。初めに蒔いた米は既に発芽を確認。然し別のイネ科の草もたくさん生えてきた。軸が赤い草である。家のプランターにも余った米を蒔いた。あと鷹の爪と加茂大芹川丸茄子、ししとうと真黒茄子をそれぞれ一緒に蒔いた。家で苗になればいいが。 +</div> + +<h3>弥生</h3> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">30日</div> +<time>2022-04-30</time> +</div> +米の続き。朝から半日かけて4m程。田の畔も少し補強。里芋も追加で植えた。西瓜の北と茄子の南。昼からも作業したかったが疲れてしまった。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">25日</div> +<time>2022-04-25</time> +</div> +20日にも畑に出たと思うが記録していなかった。20日は米の続き。前回4m程蒔いたがこの時は2mにした。疲れは禁物である。25日も米の続きに加え、蒟蒻をアンデスの南に植えた。あとは鷹の爪を適当に蒔いた。前回蒔いた所に上からばら蒔きしただけである。米の方は今回午前には2m蒔いた。午後もできるだろうか。麦の下の方が茶色くなってきた。午後も米の続き。また2m程。旭大和西瓜を男爵の東と空豆の北に、男爵の東の西瓜の南にとある露天で買った日本南瓜を、日野菜の東のあたりに池田越瓜を植えた。滝野川牛蒡の南にしろもち玉蜀黍を植えた。男爵の南に落花生を植えた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">19日</div> +<time>2022-04-19</time> +</div> +米を蒔いた。20mの畝のうち4m程。体力を消耗したうえ花粉症と喘息で眠れなかった。身体を作りアレルギーを何とかしなければ。呼吸と食事を見直さないといけない。一日寝込むだけで半年間の食糧が手に入らないのはきびしい世界である。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">14日</div> +<time>2022-04-14</time> +</div> +晴。前日の夜から朝にかけて雨だった。麦は全体的に出穂していた。畑の北側の空いていた場所と空豆が倒れたり成長が悪くてできた隙間に里芋を植えた。多分全て芽赤芋?2つ程昨年のものが混じっているかも知れない。畑の北の方はカラスノエンドウが群生している。日野菜が残っていた所に寄居蕪を蒔いた。日野菜は刈ってしまったが必要なかったか。以前大浦太牛蒡を蒔いた隣に同じ牛蒡を植えた。以前は点蒔きだったが今回は二条のすじ蒔きにした。以前のものは少しだが芽が出ていた。同じ畝の北に植えていた滝野川大長牛蒡も発芽。しろもち玉蜀黍を日野菜を蒔いた北に植えた。薩摩芋の種芋の南に真黒茄子を植えた。鷹の爪を葱の苗床の南に植えた。ノゲシとキツネアザミと多分サワオグルマのしっかりした茎が支柱代りになればと思って畝の中央だけを草刈りして両端は残した。空豆の莢が大きくなって来た。玉葱も大きいものはちゃんと玉になっている。菜っ葉類の種の一部に奇形が見られた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">9日</div> +<time>2022-04-09</time> +</div> +赤目自然農塾に行った。一日目は便所の補修と猪よけの柵の設置を行った。身体を保護するものが嫌いなので軍手を着用していなかったが案の定トタンの波板で指を切った。他人との共同作業においては少し考えないといけない。二日目は米の種おろしの実習だったが眠くてあまり集中できなかった。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">7日</div> +<time>2022-04-07</time> +</div> +晴。日射しが強くて暑さがこたえるようになってきた。防止がそろそろ必要である。薩摩芋を植えた。空豆の莢が出てきているのを確認した。米を蒔く場所を軽く草刈りした。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">2日</div> +<time>2022-04-02</time> +</div> +晴。最近寒さが戻ったようで、外に出るのが億劫である。田の畔を補強した。毎日少しの時間でも畑に出ないと体ができてこないように思う。隣の畑の人が夫婦で来ていた。奥さんと顔を合わせるのはおそらく初めてである。家で薩摩芋と里芋が芽をふき始めた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">1日</div> +<time>2022-04-01</time> +</div> +晴。前日は雨。前回より排水はよくなっていた。新3月27日には麦の出穂を確認。さらに大きくなっていた。草の勢いが強い。今日は新しく買った大浦太牛蒡を蒔いた。寄居蕪を前回同様日野菜の後に蒔いた。日野菜もそのふたつ隣りの畝に蒔いた。以前蒔いていた法蓮草、春菊、牛蒡が発芽。じゃが芋の芽も出てきた。体力を付けねば。 +</div> + +<h3>如月</h3> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">22日</div> +<time>2022-03-24</time> +</div> +晴。しばらく雨ばかりで畑が水浸しだった。一部に下の田圃への水路を開けて排水を計った。注文していた種がようやく届いたので少し蒔いた。寄居蕪を日野菜が植わっていた場所に少し、牛蒡(これは以前買っていたもの)を少し、それから葱を蒔いた。高菜を収穫した。土筆がたくさんあったので取って来て佃煮にした。上の畑にれんげが咲いているのを見つけた。年末に蒔いた菜っ葉類は花盛りで蜂もたくさん来ている。交配しなければいいがさすがに近すぎるだろう... +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">13日</div> +<time>2022-03-15</time> +</div> +晴。日差しが暑い。隣の畑の人が何かを散布していた。除草剤だろうか。真菜が花盛りである。日野菜はほとんど花を刈り取った。大根も咲いていた。壬生菜も咲きそうだったので少し収穫。山東菜も咲きはじめ。台所で芽を出していた大蒜を植えた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">11日</div> +<time>2022-03-13</time> +</div> +晴後曇り。今日から明日にかけて雨が降るというので法蓮草を蒔いた。ばら蒔きして草を刈っただけだがうまく発芽してくれるだろうか。後は牛蒡も蒔いた。天気予報に頼ってしまうのは気分がよくない。体感上朝の晴れていたうちもじめじめしていた気がするし、雨の予感はあったと思うのは後付けだろうか。天気を感覚で分かるようになりたい。菜の花が咲いていた。日野菜と真菜である。白菜の葉も起き上がって、遠目には結球したように見える。麦が一段と大きくなった。やっと背が高くなりはじめた。しかし初めに蒔いた所と後れて蒔いた所の差が大きい。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">6日</div> +<time>2022-03-08</time> +</div> +晴ていたように思う。竹を貰いに行ってから体調が落ちた。杉だらけだったので花粉症がひどくて眠れなかった。もう春が来た。大根と高菜を収穫し、小松菜と春菊を蒔いた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">4日</div> +<time>2022-03-06</time> +</div> +晴後曇り。大根と山東菜を少し収穫して地主さんに持って行った。地主さんが持っているという竹薮の場所を教えてもらった。今日は少し寒さが戻った。そろそろまた菜っ葉の種を蒔きたい。じゃが芋を植えるのと、米の苗床の準備もしなければ。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">2日</div> +<time>2022-03-04</time> +</div> +晴後曇り。日野菜と大根を少し収穫。大根の葉を炒めものに、日野菜の根を煮物にした。日野菜の細いものは筋があって硬かった。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">1日</div> +<time>2022-03-03</time> +</div> +生協で買ったじゃがいもを芽出ししていたが、出揃ってきたので半分に切った。植付けは四日か五日頃か。 +</div> + +<h3>睦月</h3> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">29日</div> +<time>2022-03-01</time> +</div> +雨だったと思う。真菜を収穫して胡麻和えにした。真菜にも日野菜にも蕾が出はじめている。雨の作業も寒さがなければ楽しい。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">28日</div> +<time>2022-02-18</time> +</div> +晴。突然春らしい日になった。朝はまだ寒かったが、日中はかなり気温が上がった。畑に畝を作る続きを行った。田の麦はまた育ったように見える。まだ高さはないが横に広がり、最後に種蒔きした所も全体的に緑になってきている。畑では空豆の花が咲いていた。やはり風が強いのか、あまり高くはならず横に広がっている。あるいは土が硬くて根が浅いのか。アブラ菜科も春を感じてか、とう立ちの気配がある。白菜と大根はその中心に蕾のようなものが準備されている。花の時期が少しずれてくれればいいのだが。畑に死んだ雀が落ちていた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">14日</div> +<time>2022-02-14</time> +</div> +曇り後晴。午前は先日落札した唐箕を貰いに言った。他にも手箕や籠を貰った。午後はじゃが芋を植えた。昨日購入したアンデスである。芽が出ていないものも数個あったが気にせず植えた。畝が低く感じたので溝を少し掘り下げて中央に盛った。昨日の雨が溜っていたので土が粘土のようになったが大丈夫だろうか。一応高さは確保できたのでいい具合に乾いてくれればいいが。株間30cm、条間40cm程度。畝幅は120cmで二条に植えた。 +</div> + +<div class="farm-journal-item"> +<div class="farm-journal-date"> +<div class="luna">11日</div> +<time>2022-02-11</time> +</div> +晴。朝は非常に寒い。田の畔を少し整えた。田圃の端を隣の人が通路として使いたいとのことなので、水を漏らさないようにしないといけない。昨日地主さんに電話したところ、この田の水利費は払ってくれているという。溝掃除は各自やるとのことなので早めにやってしまおう。 +</div> + + diff --git a/man/farm/journal/pics/DSCF0249.JPG b/content/farm/journal/pics/DSCF0249.JPG Binary files differ. diff --git a/man/farm/journal/pics/DSCF0252.JPG b/content/farm/journal/pics/DSCF0252.JPG Binary files differ. diff --git a/man/farm/journal/pics/DSCF0255.JPG b/content/farm/journal/pics/DSCF0255.JPG Binary files differ. diff --git a/man/farm/journal/pics/DSCF0257.JPG b/content/farm/journal/pics/DSCF0257.JPG Binary files differ. diff --git a/man/farm/journal/pics/DSCF0258.JPG b/content/farm/journal/pics/DSCF0258.JPG Binary files differ. diff --git a/content/gallery/20231005.html b/content/gallery/20231005.html @@ -0,0 +1,8 @@ ++++ +date = '2023-10-05T00:00:00+09:00' +draft = false +title = '結束バンド' ++++ +<time>2023-10-05</time> +<img src="img/20231005.png"> + diff --git a/content/gallery/20231007.html b/content/gallery/20231007.html @@ -0,0 +1,8 @@ ++++ +date = '2023-10-07T00:00:00+09:00' +draft = false +title = '後藤ひとり' ++++ +<time>2023-10-07</time> +<img src="img/20231007.jpg"> + diff --git a/content/gallery/20231018.html b/content/gallery/20231018.html @@ -0,0 +1,8 @@ ++++ +date = '2023-10-18T00:00:00+09:00' +draft = false +title = 'チルノ' ++++ +<time>2023-10-18</time> +<img src="img/20231018.jpg"> + diff --git a/content/gallery/20231202.html b/content/gallery/20231202.html @@ -0,0 +1,8 @@ ++++ +date = '2023-12-02T00:00:00+09:00' +draft = false +title = '' ++++ +<time>2023-12-02</time> +<img src="img/20231202.jpg"> + diff --git a/content/gallery/20240101.html b/content/gallery/20240101.html @@ -0,0 +1,8 @@ ++++ +date = '2024-01-01T00:00:00+09:00' +draft = false +title = '謹賀新年' ++++ +<time>2024-01-01</time> +<img src="img/20240101.jpg"> + diff --git a/content/gallery/20240628.html b/content/gallery/20240628.html @@ -0,0 +1,8 @@ ++++ +date = '2024-06-28T00:00:00+09:00' +draft = false +title = 'さくらクレパス' ++++ +<time>2024-06-28</time> +<img src="img/20240628.jpg"> + diff --git a/content/gallery/20240629.html b/content/gallery/20240629.html @@ -0,0 +1,8 @@ ++++ +date = '2024-06-29T00:00:00+09:00' +draft = false +title = 'さくらクレパス' ++++ +<time>2024-06-29</time> +<img src="img/20240629.jpg"> + diff --git a/content/gallery/20240702.html b/content/gallery/20240702.html @@ -0,0 +1,8 @@ ++++ +date = '2024-07-02T00:00:00+09:00' +draft = false +title = 'さくらクレパス' ++++ +<time>2024-07-02</time> +<img src="img/20240702.jpg"> + diff --git a/content/gallery/20240727.html b/content/gallery/20240727.html @@ -0,0 +1,8 @@ ++++ +date = '2024-07-27T00:00:00+09:00' +draft = false +title = 'さくらクレヨン' ++++ +<time>2024-07-27</time> +<img src="img/20240727.jpg"> + diff --git a/content/gallery/20250101.html b/content/gallery/20250101.html @@ -0,0 +1,8 @@ ++++ +date = '2025-01-01T00:00:00+09:00' +draft = false +title = '謹賀新年' ++++ +<time>2025-01-01</time> +<img src="img/20250101.jpg"> + diff --git a/content/gallery/20250717.html b/content/gallery/20250717.html @@ -0,0 +1,8 @@ ++++ +date = '2025-07-17T00:00:00+09:00' +draft = false +title = '自画像' ++++ +<time>2025-07-17</time> +<img src="img/20250717.jpg"> + diff --git a/content/gallery/_index.html b/content/gallery/_index.html @@ -0,0 +1,20 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '絵' ++++ + +<ul class="galind"> +<li><a href="20250717.html"><img src="img/20250717-thumb.jpg"></a></li> +<li><a href="20250101.html"><img src="img/20250101-thumb.jpg"></a></li> +<li><a href="20240727.html"><img src="img/20240727-thumb.jpg"></a></li> +<li><a href="20240702.html"><img src="img/20240702-thumb.jpg"></a></li> +<li><a href="20240629.html"><img src="img/20240629-thumb.jpg"></a></li> +<li><a href="20240628.html"><img src="img/20240628-thumb.jpg"></a></li> +<li><a href="20240101.html"><img src="img/20240101-thumb.jpg"></a></li> +<li><a href="20231202.html"><img src="img/20231202-thumb.jpg"></a></li> +<li><a href="20231018.html"><img src="img/20231018-thumb.jpg"></a></li> +<li><a href="20231007.html"><img src="img/20231007-thumb.jpg"></a></li> +<li><a href="20231005.html"><img src="img/20231005-thumb.png"></a></li> +</ul> + diff --git a/man/gallery/img/20231005-thumb.png b/content/gallery/img/20231005-thumb.png Binary files differ. diff --git a/man/gallery/img/20231005.png b/content/gallery/img/20231005.png Binary files differ. diff --git a/man/gallery/img/20231007-thumb.jpg b/content/gallery/img/20231007-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20231007.jpg b/content/gallery/img/20231007.jpg Binary files differ. diff --git a/man/gallery/img/20231018-thumb.jpg b/content/gallery/img/20231018-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20231018.jpg b/content/gallery/img/20231018.jpg Binary files differ. diff --git a/man/gallery/img/20231202-thumb.jpg b/content/gallery/img/20231202-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20231202.jpg b/content/gallery/img/20231202.jpg Binary files differ. diff --git a/man/gallery/img/20240101-thumb.jpg b/content/gallery/img/20240101-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20240101.jpg b/content/gallery/img/20240101.jpg Binary files differ. diff --git a/man/gallery/img/20240628-thumb.jpg b/content/gallery/img/20240628-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20240628.jpg b/content/gallery/img/20240628.jpg Binary files differ. diff --git a/man/gallery/img/20240629-thumb.jpg b/content/gallery/img/20240629-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20240629.jpg b/content/gallery/img/20240629.jpg Binary files differ. diff --git a/man/gallery/img/20240702-thumb.jpg b/content/gallery/img/20240702-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20240702.jpg b/content/gallery/img/20240702.jpg Binary files differ. diff --git a/man/gallery/img/20240727-thumb.jpg b/content/gallery/img/20240727-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20240727.jpg b/content/gallery/img/20240727.jpg Binary files differ. diff --git a/man/gallery/img/20250101-thumb.jpg b/content/gallery/img/20250101-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20250101.jpg b/content/gallery/img/20250101.jpg Binary files differ. diff --git a/man/gallery/img/20250717-thumb.jpg b/content/gallery/img/20250717-thumb.jpg Binary files differ. diff --git a/man/gallery/img/20250717.jpg b/content/gallery/img/20250717.jpg Binary files differ. diff --git a/content/journal/_index.html b/content/journal/_index.html @@ -0,0 +1,54 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '日記' ++++ +<ul> +<li>2025-11-22 <a href="posts/20251122.html">ひさしぶりに合気道した</a></li> +<li>2025-05-19 <a href="posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> +<li>2025-04-20 <a href="posts/20250420.html">大阪万博行った</a></li> +<li>2025-02-21 <a href="posts/20250221.html">着物作った</a></li> +<li>2025-02-16 <a href="posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> +<li>2024-12-11 <a href="posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> +<li>2024-12-02 <a href="posts/20241202.html">椅子作った</a></li> +<li>2024-10-09 <a href="posts/20241009.html">棚作った</a></li> +<li>2024-04-28 <a href="posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> +<li>2023-08-10 <a href="posts/20230810.html">イソヒヨ</a></li> +<li>2023-08-03 <a href="posts/20230803.html">サマータイムレンダ読んだ</a></li> +<li>2023-08-02 <a href="posts/20230802.html">着物できた</a></li> +<li>2023-07-29 <a href="posts/20230729.html">無題</a></li> +<li>2023-07-26 <a href="posts/20230726.html">GOPL読んだ</a></li> +<li>2023-07-25 <a href="posts/20230725.html">水道と空調</a></li> +<li>2023-01-19 <a href="posts/20230119.html">寺を辞めた</a></li> +<li>2022-12-28 <a href="posts/20221228.html">Holy Shit!</a></li> +<li>2022-10-31 <a href="posts/20221031.html">大阪駅にて</a></li> +<li>2022-10-23 <a href="posts/20221023.html">寺に適応できない</a></li> +<li>2022-08-14 <a href="posts/20220814.html">田舎の夏休み</a></li> +<li>2022-08-13 <a href="posts/20220813.html">正座ができていた頃に戻るには</a></li> +<li>2022-07-30 <a href="posts/20220730.html">新型コロナウイルスとその対策に関する個人的見解</a></li> +<li>2022-07-29 <a href="posts/20220729.html">RSS作った</a></li> +<li>2022-05-13 <a href="posts/20220513.html">坊主になるために薬の服用を強要されそうになってる。</a></li> +<li>2021-12-14 <a href="posts/20211214.html">無題</a></li> +<li>2021-11-29 <a href="posts/20211129.html">赤目自然農塾</a></li> +<li>2021-08-06 <a href="posts/20210806.html">畑を返すことになった。</a></li> +<li>2021-01-06 <a href="posts/20210106.html">x220から投稿テスト</a></li> +<li>2020-12-10 <a href="posts/20201210.html">小松菜の種を蒔いた。</a></li> +<li>2020-12-09 <a href="posts/20201209.html">畝を繋げた</a></li> +<li>2020-12-02 <a href="posts/20201202.html">たまねぎを植えた。</a></li> +<li>2020-12-01 <a href="posts/20201201.html">畑をさせてもらえることになった。</a></li> +<li>2020-10-03 <a href="posts/20201003.html">何をして生きようか</a></li> +<li>2020-09-26 <a href="posts/20200926.html">SSLに対応しました。</a></li> +<li>2020-09-25 <a href="posts/20200925.html">rsyncによる投稿テスト</a></li> +<li>2020-09-19 <a href="posts/20200919.html">工場見学</a></li> +<li>2020-09-18 <a href="posts/20200918.html">仕事</a></li> +<li>2020-09-17 <a href="posts/20200917.html">pythonやめました</a></li> +<li>2020-08-08 <a href="posts/20200808.html">冷蔵庫と豊かな生活</a></li> +<li>2020-08-04 <a href="posts/20200804.html">localからの投稿テスト</a></li> +<li>2020-08-02 <a href="posts/20200802.html">今日の一汁一菜</a></li> +<li>2020-08-01 <a href="posts/20200801.html">Djangoやめました</a></li> +<li>2020-07-27 <a href="posts/20200727.html">けの日</a></li> +<li>2020-07-25 <a href="posts/20200725.html">Django使うのやめようかな</a></li> +<li>2020-07-23 <a href="posts/20200723.html">多少体裁を整えました</a></li> +<li>2020-07-19 <a href="posts/20200719.html">最初の投稿</a></li> +</ul> + diff --git a/content/journal/posts/20200719.html b/content/journal/posts/20200719.html @@ -0,0 +1,13 @@ ++++ +date = '2020-07-19T00:00:00+09:00' +draft = false +title = '最初の投稿' ++++ +<time>2020-07-19</time> +とりあえずサイトの立ち上げが完了しました。最初の投稿です。 +まだhtmlは適当でcssは全く無いので味気ないサイトですがこれからいろいろといじっていければと思います。 + +この投稿も多分改行が反映されずに読みにくいものになるかと思いますが、記録として残しておきたいので書いておきます。 + +ただしdockerとpostgresqlのことがいまいちよくわかっていないので、間違ってデータベースごとけしてしまうかもしれません。まあそれはご愛嬌。 + diff --git a/content/journal/posts/20200723.html b/content/journal/posts/20200723.html @@ -0,0 +1,31 @@ ++++ +date = '2020-07-23T00:00:00+09:00' +draft = false +title = '多少体裁を整えました' ++++ +<time>2020-07-23</time> +<section> +<h5>変更点</h5> +<p>とりあえず改行できなかったり装飾できなかったり不便なので、 +htmlで投稿できるように変更しました。</p> +<p>それからcssを作って多少見れるようにしました。</p> +</section> + +<section> +<h5>これから</h5> +<p>サイトのデザインですが、できるだけシンプルにしたいと考えています。 +モダンな感じのページは多いですが、視覚効果が多すぎるように感じます。 +本当に必要があってつけているのか、”いい感じ”だからつけているだけなのか… +</p> +<p> +必要なのは投稿の中身と、それから横には目次があると読みやすくなると思っています。 +サイドバーはそのために作っています。 +</p> +<p>あとは投稿の中に画像を埋め込みたいです。</p> +</section> + +<section> +<p>そういえばドメインを契約してDNSにIPアドレスを登録したのですが、丸3日たっても名前解決できません。 +いつになったらつながるのかな。</p> +</section> + diff --git a/content/journal/posts/20200725.html b/content/journal/posts/20200725.html @@ -0,0 +1,63 @@ ++++ +date = '2020-07-25T00:00:00+09:00' +draft = false +title = 'Django使うのやめようかな' ++++ +<time>2020-07-25</time> +<p> +ホームページにも書いてあるとおり、このサイトはDjangoを使っている。 +しかしほとんど基本的な機能しか使わないのでここまで複雑で大きい +フレームワークを使う必要性は皆無である。 +全く使わない機能は結局習得することもないので、邪魔なだけだ。 +この程度のサイトであればもっとシンプルなもので作れそうだ。 +</p> + +<p> +半年ほど前にMacBookからOSXを消してLinux Mintに移行した。 +インターネットの回線に高額な料金を払うのが嫌で、一度すべて解約したのだが、 +OSXだとユーザーが何もしていなくてもバックグラウンドで大量の通信が +行われており、128kbpsでは何もできなくなったため、勝手に通信しない +Linuxに変えたのである。 +</p> + +<p> +ところがこのLinux Mint、というかデスクトップ環境のxfceには自分には全く必要の +ないアプリケーションが大量に入っているのである。もちろんOSXなんかより +圧倒的にましではあるが… +だんだん嫌になって、あまり考えずに片っ端から消していったら、 +なぜかはよくわからないが起動しなくなってしまった。 +これが確か今年の5月ごろだっただろうか。 +</p> + +<p> +丁度いい機会なのでLinuxの中でも何もない方であるArchのインストールを +試みることにした。 +過去にも何度か挑戦して、そのたびによくわからずに諦めていたが、 +今はパソコンを仕事などでも使っていないということもあり、落ち着いて +ドキュメントを読みながら進めると案外あっさりインストールできてしまった。 +</p> + +<p> +非常に快適である。 +</p> + +<p> +最近携帯を買い替え、人生で初めてAndroidというものを触ったが、 +これもかなり不要なものが入っていて不愉快だ。 +シャープお手製のよくわからないものは案外控えめだったが、 +キャリアである楽天関係のアプリに加え、Googleのアプリケーションが +大量にインストールされている上、それらはさも当たり前のように僕の +個人情報を要求するのである。 +</p> + +<p> +不必要な"便利さ"のためにただで情報を収集する。 +"最大限の便利さ"を提供することが正義で、そのためにはプライバシーを +犠牲にしてもいいと思っている。 +余計なお世話だ。 +</p> + +<p> +このページももっと軽い感じにしたいな。 +</p> + diff --git a/content/journal/posts/20200727.html b/content/journal/posts/20200727.html @@ -0,0 +1,51 @@ ++++ +date = '2020-07-27T00:00:00+09:00' +draft = false +title = 'けの日' ++++ +<time>2020-07-27</time> +<section class="introduction"> +<p>普段の生活を少しばかり記録しておこうと思う。</p> +<p>社会人一年目の7月の終わり頃の生活である。</p> +</section> + +<section class="morning"> +<p> +朝はだいたい四時から四時半には目が覚める。 +ちょうど日の出と同じ頃である。 +前日はだいたい九時半頃布団に潜るので睡眠時間は七時間といったところである。 +本当は八時間寝たほうがいいと思っていたが、七時間で自然と目が覚めるので自分には +このくらいがあっているようだ。 +</p> +<p> +朝日を眺めながら米を火にかけ、余っている野菜で煮物を二品ほど作る。 +糠床から香の物を拝借してくれば弁当の完成である。 +朝食は食べない。 +</p> +<p> +布団を畳んで箒をかけ、フローリングは雑巾で軽く拭く。 +今の借家に越してきてから雑巾がけを始めたが、思えば小学校以来かもしれない。 +</p> +<p> +煮物に使った鍋をゆすぎお湯を沸かす。 +バットやボウルを片付けてきれいになったキッチンにコーヒーカップとビーカーを並べる。挽きたての豆で淹れたコーヒーを飲みながらこのブログのソースコードをいじるなどして七時をまつ。 +</p> +<p> +時間になれば着替えて出社。 +</p> +</section> + +<section class=evening> +<p> +五時に退社し帰宅。 +集に二回ほどは途中で豆腐を仕入れに高橋豆腐店に、魚を仕入れに小平鮮魚店に立ち寄る。 +家に着いたら米を火にかけその隣で出しをとる。 +余った野菜で味噌汁ともう一品作り、糠床から香物を拝借すれば夕飯の一汁一菜。 +</p> +<p> +その後はネットをちょつと見るくらいで、 +すぐに風呂にはいって寝てしまう。 +部屋の電気は常夜灯のみなので日が沈むと眠いのだ。 +</p> +</section> + diff --git a/content/journal/posts/20200801.html b/content/journal/posts/20200801.html @@ -0,0 +1,32 @@ ++++ +date = '2020-08-01T00:00:00+09:00' +draft = false +title = 'Djangoやめました' ++++ +<time>2020-08-01</time> +<section> + <h3>Djangoやめました。</h3> + <p> + タイトル通り、Djangoを使うのをやめました。 + 代わりにwsgirefを使ってます。Djangoでも間接的に使っていた + のかもしれないけれど。<br /> + 参考: <a href="https://c-bata.link/webframework-in-python/index.html"> + Webアプリケーションフレームワークの作り方 in Python + </a> + </p> + <p> + ただでさえガバガバだったセキュリティが更にザルになっていると思いますが、 + 特に大事なものは置いていないし、Docker使ってるし、大丈夫だと + 思っておいていいかな。攻撃しないでください。 + </p> +</section> +<section> + <h3>サイトのデザイン</h3> + <p> + それから、サイトのデザインも変更してます。 + 一応明確なテーマを以て作っているのですが、なかなか思うような感じに + ならないです。<br /> + 少しずつ調整していくつもりです。 + </p> +</section> + diff --git a/content/journal/posts/20200802.html b/content/journal/posts/20200802.html @@ -0,0 +1,67 @@ ++++ +date = '2020-08-02T00:00:00+09:00' +draft = false +title = '今日の一汁一菜' ++++ +<time>2020-08-02</time> +<section> + <h3>今日の一汁一菜</h3> + <p> + 今日の夕飯は切り干し大根とザワークラウトの味噌汁に + すりごまをまぶしたもの、 + かぼちゃを蒸して豆腐のそぼろをちらしたもの、 + そしてきゅうりと茄子の浅漬。 + </p> + <p> + 切り干し大根というものを初めて食べたがこれがなかなか美味しかった。 + 細切りにしてザルに広げ一日外に置いておいただけであるが、旨味が + 凝縮される上に食感もコリコリと面白くなる。 + </p> + <p> + 大根の相手は6月の中頃に漬け込んだザワークラウトである。 + 乳酸の酸味が熱い体に染み渡る。 + </p> + <p> + 味噌を溶いて椀に注いだら、最後に煎りごまをすって入れる。 + 酸味とごまは相性が抜群である。 + </p> +</section> +<section> + <h3>野菜を干す</h3> + <p> + しばらく前に冷蔵庫の電源を落とした。 + 発酵食品ばかり仕込んでいたので冷蔵庫の中がスカスカになり、 + 冷蔵庫は不要なのではないかと考えていた。 + そんなある時とうとう空っぽになったので、これを期に + 冷蔵庫なしの生活を試してみようと考えたのだ。 + </p> + <p> + しかし一人暮らしなので、一食で野菜をまるまる使い切ることはあまりいない。 + 使いかけの野菜はどうしても出る。 + ぬか床に忍ばせたり塩漬けにしたりいろいろ工夫した。 + そのうちの一つが干すということである。 + 梅干しを作るために買ってきた竹のザルが二枚あったので、 + 余った野菜を適当に切って並べ、梅雨明けの晴天に + 晒してみた。 + </p> + <p> + この干し野菜がどれもこれも美味しいのには感動した。 + 冷蔵庫のはしっこでしんなりした野菜とは大違いである。 + </p> +</section> +<section> + <h3>当たり前?</h3> + <p> + 昔の人たちは当たり前のように行っていた干すという保存法。 + それをすっかり忘れ、冷蔵庫を家に置くことが常識と化している。 + 大学に進学して一人暮らしを始めるにあたり、なんの疑問も持たず + 冷蔵庫を購入したのが懐かしい。 + 冷蔵庫だけではなく、洗濯機や電子レンジも同じである。 + そういえばテレビは買わなかったが… + </P> + <p> + 当たり前という感覚を捨て、本当の豊かさを考えたい今日この頃。 + 冷蔵庫を捨てる日は近いか。 + </p> +</section> + diff --git a/content/journal/posts/20200804.html b/content/journal/posts/20200804.html @@ -0,0 +1,16 @@ ++++ +date = '2020-08-04T00:00:00+09:00' +draft = false +title = 'localからの投稿テスト' ++++ +<time>2020-08-04</time> +<p> + 今までhtmlファイルをクラウドにscpで持って行ってsqlを実行することで + ブログ記事を投稿していましたが、ローカルから直接投稿するスクリプトを + 書いてみました。 +</p> +<p> + 今の所単にsqlを遠隔で行っているだけですが、今後投稿済みの記事を編集 + したりできるように改良したいです。 +</p> + diff --git a/content/journal/posts/20200808.html b/content/journal/posts/20200808.html @@ -0,0 +1,249 @@ ++++ +date = '2020-08-04T00:00:00+09:00' +draft = false +title = '冷蔵庫と豊かな生活' ++++ +<time>2020-08-04</time>作成<br> +<time>2022-07-20</time>更新 +(誤植を修正したが、HTMLのソースの改行に伴う半角スペースはそのままにしておいた。) + +<section> + <h3>はじめに</h3> + <p> + 冷蔵庫の必要性に疑問を感じ始めた。 + 去年の暮れあたりから発酵食品に凝り始め、 + 冷蔵庫の中が少しずつ空いてきた。 + また、同じく去年の暮れ頃、体の冷えがあまりにひどくて + 卒業研究に集中できない状態だった。今年に入り春から夏にかけて + 気温が上がっていく中でも、体が冷えていることに + 変わりはなかった。 + </p> + <p> + 冷蔵庫の必要性を感じなくなり、冷蔵庫で冷やされたものが + 体に良くないのではないかと考えるにいたり、 + とうとう冷蔵庫の電源を落とした。 + 以降何不自由なく暮らせている。 + </p> + <p> + 一度使わなくなると、そもそもなぜこのようなものが当たり前のように + 普及しているのか疑問に思ったのでいろいろ考えてみた。 + </p> +</section> +<section> + <h3>発酵食品へ</h3> + <p> + 去年の秋、引越しに伴い生活費がカツカツになり、それまで特に + 考えずにいた家計について少しばかり見直そうと思い立った。 + そして節約の一環として外食を一切やめ、全ての食事を + 自炊に頼るようにした。 + 先に書いたようにまずはお金がなかったので、近くの青果市場で + 見切り品として売られていた30円の野菜ばかり買っていたが、 + 一月ほど節約すれば余裕が出てきてすこし贅沢をするようになった。 + と言っても外食ではなくあくまで自炊である。 + 出町柳の乾物屋に行って鰹節を求め昆布を買い、味噌汁用の出汁 + をきちんと取るようになった。 + どうでもいいが味噌汁用に鰹節を買いに行くと決まって鯖節を + 勧められるので、求めたのは鰹だが実際に使っていたのは + ほぼ鯖であった。また、いつも話し方に癖のある主人が + 対応してくれるが、ある時おばあさんが店に出ていた。 + 独特の話し方が主人と全く同じだったのには驚いた。 + 味噌汁に入れる豆腐を豆腐屋で仕入れるようになったのもこの頃である。 + 豆腐屋の人はなぜか皆遠藤征四郎師範のような腕をしている。 + </p> + <p> + 自分で出汁を引いて作った味噌汁はうまい。そこに浮かんでいるのが + 豆腐屋の豆腐なのでなおさらである。 + 自分の舌が肥えていくのがわかった。 + </p> + <p> + そんなある日、スーパーで見かけた浅漬を買って食べた。 + 漬物は昔から好物だったが、金がないのもあり見ないふりをしていたが、 + なんの気なしに手にとって買い物かごに放り込んでみたのである。 + ところがこれがいまいちだった。一口含んだときはまあそれなりに + 美味しい気はするが、しかしなんというか、奥行きがないという感じ + なのだ。それ以来スーパーの漬物は買わなくなってしまった。 + </p> + <p> + しかし漬物は食べたい。 + 結局その頃通っていた近くの米屋で糠をもらってきて + 自分で漬けることにした。 + その際にいろいろ調べたが、どうやらスーパーで売っている漬物 + はどれも発酵していないようなのだ。 + 人工的にうま味を添加した液体に野菜を浸しただけのものらしい。 + 奥行きがないわけである。 + <p> + 糠漬けに始まり、烏賊の塩辛、キムチ、バター、パンの酵母、 + 梅干し、熟れ鮓等発酵食品はいろいろ作った。厳密には塩辛と梅干しは + 発酵していないのだが。 + </p> + <p> + そんなある時ザワークラウトを漬けた。 + このときは漬物が食べたいからというより、単にキャベツを保存する + ためである。 + 一人暮らしだと、冷蔵庫があってもキャベツひと玉は傷んでしまうのだ。 + </p> + <p> + 冷蔵庫でも痛むので塩漬けにする。 + </p> + <p> + だったら冷蔵庫要らんのでは? + </p> + <p> + 冷蔵庫を手放そうと思い始めたきっかけである。 + </p> +</section> +<section> + <h3>身体の冷え</h3> + <p> + 去年の冬、身体があまりにもだるかった。 + 何もできない。お腹も痛い。 + 地元の漢方薬局を樹脂下が、渡されたのは冷えに効く + 薬ばかりだった。 + 中には重度の冷え性の女性が生理中に身体を温めるための + ものも入っていたw。 + この頃はとにかく身体がだるいだけで、 + 自分では冷えているのかどうかよくわかっていなかった。 + ところが漢方薬局の先生に不調を訴えると、 + ことごとく冷えが原因だと言われた。 + 頭痛も腹痛も倦怠感も、全て冷えだと。 + そんな状態で真冬を迎えた。確かに寒い。身体がキンキンに + 冷えているのがわかるようになった。 + ふくらはぎはずっとむくんでいるし、 + 末端は冷たいし、周りが普通にしている部屋で一人だけ + 凍えていた。 + この頃から身体の言うことをもっと聞いてあげないと + 何もできないことがわかった。 + </p> + <p> + 以来身体の状態はできるだけ観察するようにしている。 + そして気づいたのだが、自分の身体がずっと冷やされているのだ。 + 春が過ぎ暖かくなっても、至るところで冷房画家明かり + 冷たい飲み物を出される。 + まるで汗をかくことが悪であるかのような世界である。 + </p> + <p> + この気付きにより、今年の夏は冷たいものは摂取しないようにしている。 + というよりあまり欲しいとも思わないのだ。 + 喉が乾いても常温のもので満足なのだ + (と言っているそばから実家の冷蔵庫にあったハーゲンダッツを + 食べてしまった)。 + </p> +</section> +<section> + <h3>冷蔵庫の電源を落とす</h3> + <p> + 身体の冷えに気づき、発酵食品にのめり込み、 + 冷蔵庫の必要性に疑問を持ち始めたある時、 + とうとう冷蔵庫の中が空っぽになってしまった。 + ものは試しと早速電源を落としてみた。 + 余った食材はぬか床に入れるか、あるいは + 塩漬けにしておけば腐る心配はない。 + </p> + <p> + 横浜に越してきてからは週末に一週間分の野菜を + 鎌倉の即売所で仕入れ、冷蔵庫に入れていた。 + 冷蔵庫の電源を落としてからは余った野菜は + すべて乳酸菌の力で酸っぱくして保存していた。 + 流石に酸味に飽きてきた頃、梅干し用に買ってきたザルが + 梅を干し終えて暇そうにしているのを見つけた。 + 干し野菜はうま味が凝縮されて美味しいというので + 試しに余ったものを干してみた。 + きゅうり、大根等水分が多いものは薄く切ってそのまま並べる。 + かぼちゃやじゃがいも等は一度蒸してから干す。 + 生のまま干したものは味が濃くなり食感もコリコリと面白くなる。 + 一方蒸したものは甘みが強くなり、ねっとりとしてこれもまたうまい。 + 一度この味を知ると、どうして今まで冷蔵庫に入れて味が劣化するのを + 気にも止めなかったのかと悔やまれる。 + </p> + <p> + 魚はその日のうちに使う分以外は塩水につけて干しておくか、 + 米と合わせてあせの葉や柿の葉で包んでおけば熟れ鮓になる。 + まだ作ったことはないが、みりん干しなんかもやってみたいものだ。 + </p> + <p> + 豆腐は水切りをして何かしら塩分の濃いもので包んでおけば + 大丈夫そうだ。 + 味噌、糠、塩。どれにつけても美味しい。塩漬けはチーズのような + 芳醇な感じになることを期待していたがそれもない。 + 水道水をそのまま使ったのがまずかったか。 + まあ保存はできているのでいいのだけれど。 + </p> + <p> + 肉は最近食べていないのでわからないが、魚と同じだろう。 + 中国には確か肉の熟れ鮓もあったような。 + 燻製なんかも興味がある。 + </p> + <p> + 冷蔵庫を使わなくなり一週間経つが、何一つ不便なことはない。 + 冷蔵庫の下が掃除できないので早くいなくなってほしいくらいだ。 + </p> +</section> +<section> + <h3>なぜ冷蔵庫がうちにあるのか。</h3> + <p> + 改めて冷蔵庫というものを見直してみると、どうしてこんなものが + 台所の一角に鎮座しているのかわからなくなってきた。 + 大学に進学し一人暮らしを始めるに当たり、 + なんの疑問もなく買ったのだ。 + 電子レンジや洗濯機も同じである。 + テレビはNHKが鬱陶しいので買わなかったが。 + 冷蔵庫は家に必要なものであるという常識のもとに生まれ、 + 冷蔵庫を当たり前のように使いながら育った。 + 一人暮らしをするというと、どこに行っても冷蔵庫を買うのが + 当たり前かのように話が進み、とうとう自分でも買うに至ったと + 言うわけである。まあ冷蔵庫を買うのは当たり前なのだろうが。 + </p> + <p> + つまり冷蔵庫がうちにあるのは世の中の常識を + そのまま自分の家に取り込んだ結果なのだ。 + </p> +</section> +<section> + <h3>冷蔵庫という常識</h3> + <p> + ではなぜ冷蔵庫を持つのが常識なのか。 + 簡単である。 + マーケティングの結果だろう。 + </p> + <p> + 今までの生活が不便だという認識を植え付け、 + その不便を解消するという謳い文句で新しい常識を売る。 + 世の中に出回っている便利な道具は大方同じであろう。 + </p> +</section> +<section> + <h3>豊かさとは</h3> + <p> + 豊かな食生活のためといって舶来の料理をはやらせ + 食物油を売り、頑固な油汚れが落ちるからと言って + 強力な洗剤を売り、荒れた手が潤うからと言って + ハンドクリームを売る。 + </p> + <p> + 忙しいからと便利な家電を売り、 + その一方で暇を潰すためのエンターテインメントに + 金を払わせる。 + </p> + <p> + 暑いからといいエアコンを売って快適な環境を整え、 + 汗をかくためにサウナに金を使わせる。 + </p> + <p> + きついからと言い肉体労働を敬遠し、 + 楽をするために自動車を買い、 + その一方で運動不足になりジムに通う。 + </p> + <p> + どれもこれもテレビや新聞等のメディアに作られた豊かさ + ではないだろうか。 + </p> + <p> + 常識や流行にとらわれず、豊かな生き方とはなんなのか、 + 本当に必要なものはなにか、自分自身に問いただす。 + 一度すべての常識を捨て、自分にとって本質的なものを + ゼロから構築する。 + 人生を本当の意味で豊かにしてくれる物だけがすべて揃った + そんな家に僕は住みたい。 + </p> +</section> + diff --git a/content/journal/posts/20200917.html b/content/journal/posts/20200917.html @@ -0,0 +1,14 @@ ++++ +date = '2020-09-17T00:00:00+09:00' +draft = false +title = 'pythonやめました' ++++ +<time>2020-09-17</time> +<p>pythonをやめてbashスクリプトで作ったcgiに置き換えました。</p> +<p>管理がだいぶ楽になった気がします。</p> +<p>アプリの中身ばかりいじってブログの記事が全然増やせていませんが +ぼちぼち書いていきたいと思います。</p> + +<p>サーバーからbashのcgiを動かすにあたって、nginxがややこしかったので +apacheに変えたのですが、設定が適当なのでセキュリティが心配です。</p> + diff --git a/content/journal/posts/20200918.html b/content/journal/posts/20200918.html @@ -0,0 +1,39 @@ ++++ +date = '2020-09-18T00:00:00+09:00' +draft = false +title = '仕事' ++++ +<time>2020-09-18</time> +<p> +今の仕事がつらい。 +やっているのは得意先から届く注文書のファックスを自社のデータベースに入力するだけの仕事だ。 +誰でもできる仕事であり、近い将来自動化されるだろう。その一方でファックスの様式が得意先毎に異なり、入力時にはその注文書に明記されていないことも考慮しなければいけない。 +日本企業の生産性が低い原因をまじまじと見せられている。 +このような業務なので、入力作業自体は1日もかからずに覚えられる一方、得意先毎の細かい違いを覚えるのに何年もかかるだろう。 +日に日にこの業務に慣れ、入力は速くなっているが、自分が成長しているようには感じない。この会社のこの業務という非常に限定的な分野でしか使えない技術だけがついていくからである。こんなことでは転職しようにもよその会社で使える技術が何もないので、新卒と同じ土俵にたたなければいけなくなる。採用する側もそんな人材に興味はないだろう。 +</p> +<p> +成長したい。 +成長とはなんだろう。 +多分生きていく上で使える技術を身に付けることである。 +生きていく上で使える技術とはなんだろう。究極的には畑で作物を育てる技術だと思うが、そんな世紀末のことはまだ考えなくてもいいかもしれない。 +汎用性のある人間になればいいのだろうか。 +そうすれば何でもできて食いっぱぐれない。 +しかしその「何でも」の中に今の仕事は含まれていない。 +成長が感じられない単純な作業はストレスで死んでしまう。 +つまりなんでもできるの中には成長しない仕事は含まれない。 +</p> +<p> +なぜ今の会社にいるのか。 +それは実家に帰るためである。 +実家で工場を経営しているのでそこを嗣ごうと考えた。 +そのために同業大手に就職し技術を持ってかえるように父に言われた。 +ところがいざ就職してみると、僕が考えていた技術が一向に学べていない。 +その一方で今学んでいることは父が持って帰ってほしい技術であるようだ。父は工場で必要な細かい技術や知識を持って帰ってほしいらしい。 +僕はそんなものはほしいとは思わない。この業界に特化しても生き残れないと考えるからだ。もちろん業界に特化した人材も必要なのかもしれないが、それはあなたの長男ではないのではないだろうか。長女でも次男でもなさそうだし。 +</p> +<p> +今のところだからどうしたいと言うまとまった考えがあるわけではないが、少なくとも自分の学ぶべき場所はここではないと感じている。心身に無理が生じているのを感じるからだ。 +業界の知識を短期間で軽くさらって、そのあとは別の世界を見てみたい。どこかに成長を実感できる世界がないものか。 +</p> + diff --git a/content/journal/posts/20200919.html b/content/journal/posts/20200919.html @@ -0,0 +1,63 @@ ++++ +date = '2020-09-19T00:00:00+09:00' +draft = false +title = '工場見学' ++++ +<time>2020-09-19</time> +<p> + 実家で営んでいる工場を嗣ぐために同業大手に働きに出ているが、 + そこで何を学べばいいのかわからないので、一度実家の工場を見学 + することにして、今日行ってきた。 +</p> +<p> + 見学して思ったのは、今いる大手の工場よりうちの工場のほうが + いい工場であるということだ。 + 工場内は比較的整然としているし、データベース等のシステムも + 今自分がいる会社よりは圧倒的に進んでいた。 +</p> +<p> + いよいよ自分が今の会社で働いている意味がわからなくなってきた。 + どうやら父は今僕のいる会社には人材を育成するための教育制度 + が整備されていて、その制度によって僕という人材が育成されることを + 期待していたようだ。 + 残念ながらそんな制度はなかったようだが。 +</p> +<p> + つまり僕が今の会社に居続ける義理もそんなにないようである。 + もちろん業界の知識は少なからず必要であり、今の会社でも + 働き続ければ多少は勉強できるだろうが、そのために投資する時間 + に対して割に合わないだろう。 +</p> +<p> + ではどうするか。今の会社をやめるのであれば転職である。 + そしてその転職先は実家かそれ以外かである。 + 今実家に就職するのはいい選択なのだろうか。 + 僕は業界に関する知識もないし、ビジネスの世界も全く知らない。 + こんな状態で就職しても、おそらく他の人と同じようなことしか + できないだろう。工場に新鮮な空気を取り込めないのだ。 + だから今は一旦業界を離れ、全く別の世界を覗きに行くのがいいのではないか。 +</p> +<p> + 個人的に興味があるのはIT系である。 + 工場のDXという言葉がよく新聞に並んでいるが、その流れを + 実家に持ち帰れるかもしれない。 + もう一つ興味があるのは農業である。 + 僕がかってに妄想しているだけだが、近いうちに大量消費社会が + 終焉を迎え、自分たちにとって本当の豊かさとは何か、今一度 + 考え直す秋が来ると思う。そうなれば必然的に見直されるのが + 農業である。社会から何を削っても絶対に外せないのが食だからだ。 + そこに豊かさや幸福を求めるのは自然なことだろう。 + そんな農業とのつながりを何らかの形で事業に持ち込めれば + いいかもしれない。 +</p> +<p> + いずれにせよ今のままダラダラと働くのはごめんだ。 + 無駄なことに時間と精神を費やすのはアホである。 + 我慢して頑張っても、それで身体を壊した上に何も学べない。 + そんなのは投資とは言えない。 + 頑張るのではなく、精神の求める方に流れていくほうが自然な生き方だろう。 + とにかく現状を変化させて前に向かって進みたいのだ。 + 自ら動かなければ何もおきない。 + 連休中にエントリーシート書こうかな。 +</p> + diff --git a/content/journal/posts/20200925.html b/content/journal/posts/20200925.html @@ -0,0 +1,8 @@ ++++ +date = '2020-09-25T00:00:00+09:00' +draft = false +title = 'rsyncによる投稿テスト' ++++ +<time>2020-09-25</time> +<p>自宅のパソコンから直接rsyncで投稿てすと。</p> + diff --git a/content/journal/posts/20200926.html b/content/journal/posts/20200926.html @@ -0,0 +1,12 @@ ++++ +date = '2020-09-26T00:00:00+09:00' +draft = false +title = 'SSLに対応しました。' ++++ +<time>2020-09-26</time> +<p>Certbotを使ってSSLに対応しました。</p> +<p> +と言っても特に暗号化する必要のある情報は +取り扱っていないので完全に自己満足ではありますが。 +</p> + diff --git a/content/journal/posts/20201003.html b/content/journal/posts/20201003.html @@ -0,0 +1,122 @@ ++++ +date = '2020-10-03T00:00:00+09:00' +draft = false +title = '何をして生きようか' ++++ +<time>2020-10-03</time> +<h3>仕事</h3> +<p> +研究者を目指して大学に入り挫折した。 +</p> +<p> +就職先を考えたが、やりたい仕事などそれまで考えたこともなかった。 +そのためやりたいことを基準に仕事を選ぶことができなかった。 +そこで考えたのが、なんのために働くかということである。 +地元には親戚がたくさんいて正月や盆には大勢集まる。 +サマーウォーズみたいな感じ。 +残念ながら古民家に集まるわけではないが。 +僕は家というものが好きだった。 +大学を出てからの人生はその家を更に大きくすることにしよう。 +そう考えた。 +そしてそのための方法として選んだのが、実家が営んでいる +ダンボール工場を嗣ぐことであった。 +そのために卒業後はまず同業大手で勉強させてもらい、 +数年後実家に帰ることにした。 +</p> +<p> +ところがいざ働き始めたらどうだろう。 +何もやりがいがなかった。 +回りにいるひととは全く反りが合わなかった。 +労働環境は最悪だった。 +生活環境も受け入れられなかった。 +気づけばストレスで心身がボロボロになり、盆休み開けにとうとう寝込んだ。 +</p> +<p> +仕事が嫌になった。 +その原因について、はじめは成長が感じられないからとか、 +無駄なことを無駄だとわかっているのに無理やりしているからとか、 +いろいろ理由を分析してみたものっだったが、今思えばどれも違う。 +単純に世間一般に広く普及している仕事というものに適正がないのだろう。 +心療内科の医者によれば、僕の症状は適応障害だそうだ。 +こんな世界に適応などしてたまるものか。 +</p> +<h3>社会は嫌いだ</h3> +<p> +この社会に適応できないのは今に始まったことではないと思う。 +</p> +<p> +京都から和歌山に帰省するたびに、大阪の町並みが汚いのが気になりだした。 +駅の周りには鉄筋コンクリートの四角い箱が乱雑に並んでいるのである。 +どれも建てられた当時は先進的なデザインでおしゃれだったのだろう。 +そして駅から少し離れた場所にも同じくコンクリートの箱が並んでいる。 +こちらは最近建てられたらしく、デザインも今風である。 +30年建てば時代遅れの残念な物件になるのだろう。 +こんな家を建てる人たちは一体何を考えているのやら。 +人生で一番大きな買い物と言いつつ、ろくに調べもしないでハウスメーカーの +口車に乗せられ、モダンでおしゃれな家を建てる。 +自分の建てた家に子々孫々住んでほしいとは思わないのだろうか。 +</p> +<p> +ある時からスーパーに行くのがしんどくなった。 +出町柳にある枡形商店街の近くに住んでいたことがある。 +その間食事の買い物はほとんどそこに通っていた。 +豆腐屋、肉屋、乾物屋等、専門店が一通り揃っていた。 +扱っているものは当然そのへんのスーパーよりも美味しかった。 +ある時伏見の方に引っ越して、久々にスーパーに通い始めたのだが、 +これが非常にしんどかった。 +音楽がうるさくて買い物に集中できないのだ。 +なんだかよくわからない音楽がやたら大きな音で流れている。 +夕飯を考えながら、美味しいものを選別しようとしている脳みそに、 +その思考を遮るように流れてくるのだ。 +だんだん頭がぼーっとしてきて、結局適当に選んでしまう。 +スーパーでは音楽だけでなく、視覚的な表示も鬱陶しい。 +商品のパッケージは周りよりも少しでも目立とうとするばかりで、 +欲しい情報が一切目に入らない。 +適当に選んで家に持って帰るが、結局対して美味しいものではない。 +スーパーに並んでいるものは、本質的な価値ではなくマーケティングを始めとする +販促にかかるコストの割合が多いのだろう。 +「美味しいワイン」。「リコピンが多いトマト」。「DHAが含まれているソーセージ」。 +だまっとれや。 +ただ、そういうものが多く売られているというのは、それはつまり +消費者がそういうものを購入すると言うことである。 +同じものであってもパッケージに美味しいと書いていた方を買うのだろう。 +スーパーでものを買って行く人々が、心理学に踊らされているだけのモルモットに +見えてきた。 +こんな人たちの中に居たくない。そんなこと書いたら叩かれるかな。 +</p> +<p> +スーパーがだめになれば他の店もかなり辛くなった。 +結局ものを売るというのは同じことなのである。 +自分でも驚いたが、スーパーにいけなくなってから、無印良品にも行けない。 +よくわからん音楽が流れる中で、独自のおしゃれ感を作り出しそれを売っている。 +物自体もそんなに質の高いものではないし。 +そこに集う人たちも、雑誌でよく見るテンプレ通りの最近の若者である。 +雑誌はあまり見ないので知らんけど。 +</p> +<p> +この人たちは自分の内側から湧いてくる価値観というものを自覚したことが +あるのだろうか。 +人工的に生み出された流行に踊らされているだけなのではないだろうか。 +</p> +<p> +スーパーに行かなくなり、巷で流行っているものを消費しなくなり、 +いよいよ自分がなぜ働いているのかわからなくなった。 +</p> +<h3>やっぱ農家かな</h3> +<p> +世の中にはびこっている様々なものに価値を見いだせなくなったわけだが、 +それでも買わないと生きて行けないのが食べ物である。 +就職してからの半年間は食べ物には結構こだわっていた。 +スーパーに行けないこともあり、学生時代に商店街に通っていたこともあり、 +住処の周りにある個人商店やらを探し回った。 +家から徒歩圏内に豆腐屋と魚屋を見つけた。 +野菜は鎌倉の即売所まで買いに行った。 +米も鎌倉の米屋に求めた。 +乾物も鎌倉だ。 +休みの日は結構な時間と労力を食べ物に投資していたと思う。 +美味しいものを食べてこその人生なのである。 +</p> +<p> +やっぱり農家になりたいな。 +</p> + diff --git a/content/journal/posts/20201201.html b/content/journal/posts/20201201.html @@ -0,0 +1,20 @@ ++++ +date = '2020-12-01T00:00:00+09:00' +draft = false +title = '畑をさせてもらえることになった。' ++++ +<time>2020-12-01</time> +<p> +実家のとなりに畑がある。 +子供の頃はそこで育った野菜をよくもらって食べていた。 +最近そこを耕していたひとが高齢のため引退して、 +雑草が生え放題になっていた。 +</p> +<p> +先日その土地の地主が草刈に来たので声をかけたところ、 +暫く使う予定がないので使ってもいいとのことだ。 +</p> +<p> +ということでぼちぼち何か作ろうと思う。 +</p> + diff --git a/content/journal/posts/20201202.html b/content/journal/posts/20201202.html @@ -0,0 +1,16 @@ ++++ +date = '2020-12-02T00:00:00+09:00' +draft = false +title = 'たまねぎを植えた。' ++++ +<time>2020-12-02</time> +<p> +祖父の友人がたまねぎの苗を分けてくれたので植えた。 +時期はかなり遅いみたいだがうまくそだってくれるだろうか。 +</p> +<p> +耕していない畝に15cm間隔、条間20cmくらいで少し穴を掘って植えた。 +その上から、先日刈った雑草を被せておいた。 +とりあえず一畝だけ。 +</p> + diff --git a/content/journal/posts/20201209.html b/content/journal/posts/20201209.html @@ -0,0 +1,19 @@ ++++ +date = '2020-12-09T00:00:00+09:00' +draft = false +title = '畝を繋げた' ++++ +<time>2020-12-09</time> +<p>この土日に不耕起の農法を教えてくれる赤目自然農塾にお邪魔してきた。 +その際、今の畝では幅が狭すぎるので広げたほうがいいといわれた。 +とりあえず畝の間の溝を埋めて二つの畝を繋げることにした。 +余り無理をしても次の日動けないのは困るので今日は一列だけ。 +180cmから2m程度の畝になった。 +</p> + +<p> +先日植えた玉葱は根がきちんと活着してくれたようで、 +寝ていた株も起きあがって元気そうである。 +ただしこの畝は細いままなので、やはり表面が少し乾燥しているようだ。 +</p> + diff --git a/content/journal/posts/20201210.html b/content/journal/posts/20201210.html @@ -0,0 +1,23 @@ ++++ +date = '2020-12-10T00:00:00+09:00' +draft = false +title = '小松菜の種を蒔いた。' ++++ +<time>2020-12-10</time> +<p> +駅の近くに種苗店がある。 +以前から気にはなっていたのだが、いつ前を通っても店主がお客さんと話し込んでいて入りづらかった。 +ところが今日はだれもいなかったので遂に敷居を跨ぐことができた。 +</p> +<p> +時期が時期なので余り品揃えはよくなかったが、いろいろと教えてくれた。 +F1ではない種も多数取り扱っているようで、和歌山大根という地元の品種もあった。 +今ある種のなかから、一年中いつでも蒔ける小松菜をいただいてきた。 +楽天という品種だった。 +</p> +<p> +家に帰って早速種を蒔いた。 +先日広げた畝に、北側から2坪ほどの土にばら蒔きした。 +少し乾燥ぎみだったので、横に散らばっていた草を上から被せた。 +</p> + diff --git a/content/journal/posts/20210106.html b/content/journal/posts/20210106.html @@ -0,0 +1,44 @@ ++++ +date = '2021-01-06T00:00:00+09:00' +draft = false +title = 'x220から投稿テスト' ++++ +<time>2021-01-06</time> +<p> +thinkpad x220を手に入れ、arch linuxの環境を整えた。 +</p> +<p> +スペックはこんな感じ: +</p> +<ul> + <li>core i7 2620M</li> + <li>メモリ 8GB</li> + <li>ssd 256GB。</li> +</ul> +<p> +ヤフオクで送料入れて15000円程度だった。 +</p> +<p> +画面はTNだろうと思って買ったが、 +届いたら視野角が広くて非常に見易いので +多分IPSであろう。 +これは結構うれしい。 +</p> +<p> +全体的に綺麗な個体だ。 +</p> +<p> +バッテリーは期待通り完全に消耗していて、 +起動後5秒ほどで切れてしまう。 +</p> +<p> +あとwindows用の日本語キーボードはあんまり +好きではない。 +いちばん下の段がぎゅうぎゅう詰めでスペースが +小さすぎる。 +</p> +<p> +バッテリーを交換するのが先かキーボードをUS配列にするのが先か +悩ましいところだ。 +</p> + diff --git a/content/journal/posts/20210806.html b/content/journal/posts/20210806.html @@ -0,0 +1,104 @@ ++++ +date = '2021-08-06T00:00:00+09:00' +draft = false +title = '畑を返すことになった。' ++++ +<time>2021-08-06</time> +<h2>はじめに</h2> +<p> +昨年の秋実家の隣の畑を借り農業を始めることになった。以降好きな種を蒔いては世話をし、少しばかりの収穫をいただいてきた。夏になり冬野菜はどんなものを植えようかと考えていたところ、地主さんからある連絡があった。この秋に家を建てることになったので土地を返してほしいとのことだ。いい機会なので、この一年弱の間素人なりに試行錯誤してきたこと、考えてきたことを記録しておく。 +</p> + +<h2>農業に対する基本的な考え</h2> +<h3>農業の目的</h3> +僕が農業をする目的は自給自足の生活をすることである。一度社会人としての道を歩もうとして精神を病んだ。世の中にあふれているほとんどの物に価値を見いだせなかった。にも関らず自分の時間をお金に変換している意味がわからなかった。自分の時間を使って自分にとって価値のあるものを生みだす。それをできるのが自給自足のための農業だと考えた。 +<h3>農法</h3> +<p> +畑を借りる前から農法に関する情報は本やネット等で収集していた。そのなかでも目に付いたのが川口由一氏の自然農及び福岡正信氏の自然農法である。多少の違いはあるがどちらも無農薬、無肥料、不耕起という点で共通している。雑草や虫等を敵とせずそれらの活動によって土壌を豊かにし、その上で作物を育てるというものだ。この方法が自分に合っていると感じたので採用することにした。 +</p> +<h3>種</h3> +<p> +また、育てる作物に関しては、高橋一也氏の「古来種野菜を食べてください。」に感銘を受け、可能な限り昔から栽培されてきたものを探すようにした。現在市場で流通している野菜は一代交配種と呼ばれるものが多い。一代交配種というのは、「生物において、ある異なった対立遺伝子をホモで持つ両親の交雑の結果生じた、第一世代目の子孫のこと」(<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>)。一代交配種は収量、形質、味等がそろっているので市場競争力が高い。その一方で、一代交配種をかけあわせると、一代目ではかくれていた遺伝子が発現し、市場価値の高いものは収穫できない。このため、ひとたび一代交配種を育てはじめると、以降毎年のように種苗会社から種を購入することになる。 +</p> +<p> +僕が目指したいのは自給的な農業である。作物の市場競争力はなくていいし、種苗会社に払い続けるお金もない。また一代交配種ばかり育てられると、全国どこでも同じ野菜しか手に入らなくなり食文化もあったものではない。それに対し古来種野菜は、地域ごとに代々受けつがれてきたもので、その土地にうまく適応しその場所の食文化の形成に深く関わってきたものである。僕の地元和歌山でも、湯浅で作られる金山寺味噌で使われている湯浅なすというものが残っている。関係ないがあみ清数見商店というところの金山寺味噌がおいしい。「発酵文化人類学」(小倉ヒラク)にのっていた太田久助吟製のものはいまいちだった。表示を見ると人口甘味料(確かステビア)が入っていた。 +</p> +<p> +閑話休題。種は古来種を多数とり扱っている野口種苗研究所のものを購入するようにした。 +</p> + +<h2>生ゴミの肥料</h2> +<p> +畑を借りてから、台所からでる植物性の生ゴミは全て畑の一角に捨てるようにした。胡瓜や人参のへた、南瓜のわたや種等である。捨てたゴミは少し土とまぜ、発酵させて二年目から畑の肥やしとして利用しようと考えてのことだ。冒頭で書いた無肥料と矛盾するがまあこれも試行錯誤のうちである。 +</p> +<p> +春から夏にかけて気温が上がり、梅雨には雨も降り、微生物の活動が活発になる。始めは臭いが大丈夫か心配だったが、日中30度を越えるようになってもほとんど臭くない。1メートル以内に近づいて少し臭うが、臭いというほどではない。臭い臭いではない。一時コバエがたかっていたが、今は目立たなくなり、かわりにコオロギがうじゃうじゃしている。 +</p> +<p> +春の終りごろに買ってきた南瓜のわたと種もここに捨てた。しばらくするとそこから南瓜の芽が大量に生え、梅雨があけるころにはたくさん花をつけた。近くの養蜂場からだと思うが、セイヨウミツバチがやってきて受粉してくれる。7月の終りごろにはおおきな実をつけた。収穫して煮物にしたがとてもおいしかった。捨てた種は一代交配種で、できたのはその子供なのでおいしくなる道理はないのだが。不思議である。 +</p> +<p> +地主さんから土地の返還を打診されて畑に生ゴミを捨てるのはやめにした。ところが調理中にでるゴミの量は変化するわけでわない。野菜のうち食べない部分はすべてゴミ箱に捨てるようになった。畑を借りる前の状態に戻っただけである。ところが切った野菜のへたをゴミ箱に捨てるたびになんだか虚しくなる。畑に撒けばそこにまた植物が育ち収穫にも繋がる。ところがゴミ箱に捨ててしまうとなんにもならない。そればかりか、ゴミを集めてさらにそれを焼却しなければいけない。すべて税金である。ただ畑に捨てるだけでまた利用可能な形のエネルギーになるものを、税金を投入したうえで無にしているのだ。あまりにも勿体無い。しかも一般的な農家では、生ゴミを税金で回収してもらったうえで、肥料を購入してきて自分の畑に施すのだ。江戸時代なんかはさらに無駄がない。自分たちの排泄物まで畑に還元していたほどだ。 +</p> + +<h2>育てた作物</h2> +<h3>玉葱</h3> +祖父の知り合いに苗をもらって植えた。確か初めて植えたのがこれである。土が固く肥沃度も低いためか玉が膨らまなかった。 +<h3>小松菜</h3> +時期が悪かったのか、すぐにとう立ちしてしまった。 +<h3>法蓮草</h3> +実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 +<h3>春菊</h3> +実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 +<h3>牛蒡</h3> +雑草を処理した場所と処理しない場所に分けて植えた。雑草の下でも元気そうに育っている。生育が遅いので土地を返却するまでに収穫できるか不明である。 +<h3>じゃが芋</h3> +六月の雨でほとんど腐ってしまった。水はけが悪いのが原因だと思う。収穫できたものは小さかったが美味しかった。 +<h3>葱</h3> +warmerwarmerというところで買ったセット野菜に入っていたものの根を切って植えた。葱坊主ができ、種を収穫できた。 +<h3>胡瓜</h3> +地這いきゅうりを植えた。雑草がしげってもそれに巻きついて元気である。種の部分だけよく太っていびつな形に育った。肥沃度の問題か。味は普通にきゅうりである。 +<h3>南瓜</h3> +上に書いた生ゴミとは別に日本南瓜を植えた。すぐに発芽したがそれ以降成長しない。花はひとつだけ目撃した記憶がある。 +<h3>冬瓜</h3> +これもwarmerwarmerの野菜から種をとりだしたものである。かぼちゃと同様、発芽したが成長しない。 +<h3>とうもろこし</h3> +雑草に負けずよく育った。ただ生育にばらつきがあり、うまく受粉できなかった。収穫できたものは歯抜けである。味はよかった。 +<h3>いんげん</h3> +白金時菜豆と、つるありいんげんをうえた。白金時菜豆は収穫できたが成長が不十分で量が少ない。つるありいんげんは発芽しただけである。せっかく立てた支柱は虚しく、すずめの遊び場である。 +<h3>伏見甘長唐辛子</h3> +発芽せず。 +<h3>胡麻</h3> +発芽せず。 +<h3>小豆</h3> +あまり大きくならないが、長い期間にわたり収穫できている。粒が小さい。 +<h3>西瓜</h3> +発芽したが成長しない。 +<h3>茄子</h3> +実験的に雑草を刈らずに蒔いた。イヌムギかノゲイヌムギか同定できていない草が茶色く枯れているところに蒔いた。日照か水の不足か。 +<h3>大豆</h3> +よく育っている。顔を近づけると枝豆のにおいがして楽しい。 +<h3>さつま芋</h3> +よく育っている。少なくとも地上部は。時期的に収穫まで漕ぎつけるか微妙なところ。 +<h3>里芋</h3> +よく育っている。と思っていたが、近所の畑のものはもっと育っていることに最近気が付いた。肥料をやっていないのでこんなものだろうか。本葉がでてすぐのころ黒いいもむしに葉脈をのこして食い荒されたが、また葉が出てきて平気そうである。こちらも土地を返却するまでに収穫できるかわからない。 +<h3>人参</h3> +最近蒔いて発芽したばかりである。好光性のため種を蒔いた上にかぶせる草を少なくしたが、少なすぎたようだ。土が乾燥ぎみで発芽率はいまいちである。 + +<h2>おわりに</h2> +<p> +不耕起では一年目はあまりなにも育たない。土が固くて痩せているからである。三年目から突然変化が起こり、土が柔らかく肥沃になってくるという。その変化をこの畑で体感したかったのだがそれはかなわなかった。 +</p> +<p> +この一年弱の短い期間にも、この土地の豊かさは格段にあがったように思う。土の上をコオロギやクモが行き交い、バッタやカエルが跳ね、チョウやトンボ、ハチが飛び回っている。土をいじればミミズやカタツムリ、アリがわんさかわいてくる。これらの虫を求めてスズメやセキレイ、イソヒヨなどの鳥が集まり、夜になればネコやイタチまで見かけるようになった。 +</p> +<p> +ここに生きた生物たちはこれからコンクリートに埋められることになる。なんだか虚しい。 +</p> +<p> +この一年弱の経験から、農業で生きていく自信が芽生えたように思う。そこにあるものを利用し、多くを求めなければいいのだ。この自信が確信にかわるにはもっと経験が必要だろうが。 +</p> +<p> +畑を返したあとはすることがなくなってしまう。他の土地を探すのもひとつだし、別のことをするのもありかもしれない。いいご縁があればいいな。 +</p> + diff --git a/content/journal/posts/20211129.html b/content/journal/posts/20211129.html @@ -0,0 +1,27 @@ ++++ +date = '2021-11-29T00:00:00+09:00' +draft = false +title = '赤目自然農塾' ++++ +<time>2021-11-29</time> +<p> +11月13日、14日の二日間、奈良にある<a href=https://akameshizennoujuku.jimdofree.com/>赤目自然農塾</a>の勉強会に参加してきた。この塾は自然農の提唱者である川口由一さんが始められたもので、自然農の技術を学び実習できる場である。毎月一回二日間の定例の学びがあり、一日目には畑の補修等の共同作業と言葉を通しての学びが、二日目には実習が行われる。昨年12月に初参加し、今回はほぼ一年ぶりの2回目であった。1反9畝の畑を借りることになったので、本格的に自然農の技術を身に付けたい。できれば毎月通って一通りのことを教わりたいのだが続くだろうか。 +</p> +<h2>1日目</h2> +<p> +車を停めて外に出る。思っていたより暖かかった。もこもこの着物を着て来たが厚いので暑いので薄めのものに着替え、その上から作務衣を着た。普段畑に入る時は裸足だが、共同作業で何をするのか分からないので地下足袋を履いて小屋に向かう。 +</p> +<p> +午前の作業は篠竹を刈り取って枝を払い、束にして小屋の屋根裏に干すというものだった。篠竹はよく撓って使いやすそうだった。10人以上で作業していたが収穫量は思った以上に少なかった。一人でやると日が暮れる。 +</p> +<p> +午後は汲取式の便所を汲み取って別の場所に撒いた。臭いはそこまでひどくはなかった。ブルーチーズや高級な納豆でも香るアンモニア臭が中心で、吐き気を催すほどではない。発酵食品を食べすぎているのかもしれない。便所は地面に穴を掘って桶のようなものを埋め、木の板で便器を作って被せ、周囲から見えないように囲っているだけのものだ。小屋に隣接するものは建物の一部になっていて壁も木材でしっかりと作られているが、畑の中にぽつんと立っているものは先程の篠竹を束ねたもので周囲を囲っているだけの簡易なものである。桶から柄杓で排泄物を汲み取りバケツに入れる。本来は天秤棒を用いて一人で二つ運ぶというが、技術が必要なので今回は棒の中心にバケツをぶらさげて二人で一つを運ぶことになった。肥を撒く場所までの道はでこぼこで途中川を渡る必要がある。初対面の人と二人、なかなかの緊張感のなか息を合わせて肥を運ぶ。肥を撒く場所ではいきなりバケツごとあけるのは危険なので、ここでも柄杓で少しづつである。玄関先に水をうつようにその場所全体にまんべんなく撒く。柄杓にスナップを効かせると肥が帰ってくる。これもまた緊張感のある作業だった。そこそこの量があったが日没前には終わった。 +</p> +<p> +銭湯を経由して山荘に。晩御飯は菜飯とかぼちゃのサラダ、それにけんちん汁だった。ほとんどが自然農で採れた野菜である。御飯の後は言葉を通しての学びとして、今回は教育について議論した。21時ごろから始めて終ったのは日付が変わるころだった。みんな眠い目をこすり、船を漕ぎならがの議論であるが、これがなかなか面白いものである。誰かが言った言葉が直接脳に入って来くる。あまりうまくまとまっていない考えでも発言すればだれかの脳に届いてなにかしら返答がある。なんだか全員の脳味噌を直接繋いで考えているような感覚になるのだ。僕は今回寺子屋を始めたいという旨のことをぽろっと言っただけで終った。しかし言っただけでもなんとなく自分でも実現させようという心持ちになるものである。 +</p> +<h2>2日目</h2> +<p> +2日目は農作業の実演である。今回は稲の刈り方とその後の干し方、それに麦の蒔き方を見せてもらった。これが昼過ぎに終り、御飯のあとは畑の見学会に参加させてもらった。 +</p> + diff --git a/content/journal/posts/20211214.html b/content/journal/posts/20211214.html @@ -0,0 +1,22 @@ ++++ +date = '2021-12-14T00:00:00+09:00' +draft = false +title = '無題' ++++ +<time>2021-12-14</time> +<p> +図書館に本を返しに行った。最近家ではパソコンばかりいじっているので本を借りても読まずじまいのことが多い。たまに読もうと思う時もたいがい小林一郎の法華経大講座を開く。一応日蓮宗の坊主になろうというのでひととおり法華経のことは知っておきたいのだ。今日も図書館ではいろいろと漁った。ウェブサーバーやメールサーバーを立ててみたので、セキュリティ関係の本や暗号の本を探した。数冊は立ち読みしたがどうせ読まないだろうとすべて本棚に戻した。PGPの鍵を作ったりしているので暗号関連の数学は理解しておきたいという願望はあるのだが頭が多分ついていけない。場所を変えて農業の本も見てみたがあまり読みたいものがなかった。麦を育て始めたのでそのあたりの情報が欲しかったのだがなかった。とうとうなにも借りずに出てきてしまった。 +</p> +<p> +図書館からの帰りはたいてい途中にある野菜の直売所に立ち寄る。ここはスーパーにはなさそうなものがたくさんある。大根や蕪のおばけみたいなのや、里芋の親芋や葉っぱなんかも置いてある。里芋の葉っぱは家でかじって口の中がとんでもないことになって敬遠した。品種によって渋が強かったり弱かったりするので売っているものは食べても大丈夫なものだと思うが。無農薬の野菜も置いてあるのだがそうだと書いていないのも面白い。今日はその無農薬のものから紫キャベツと、別の棚から真菜をいただいてきた。キャベツはピクルスに、真菜は白和えにするのがおすすめだそうだ。 +</p> +<p> +野菜を買ったあと、家の葛が切れていたのを思いだして豆屋にも寄った。黒豆や小豆等の新豆が入っていたが家に余っているので買えなかった。しかしこの町には昔の店がいろいろ残っているものだ。生まれ育った地元であるが、今になるまでほとんど店を知らなかった。寺に通いだしてからお上人の奥さんがいろいろと店を教えてくれる。この豆屋はこの寺の檀家だそうだ。他にもかつを節屋、魚屋、肉屋、うなぎ屋、蜂蜜屋、豆腐屋、酒蔵、お茶屋、珈琲豆焙煎所等、スーパーに行かなくてもほとんど揃う。味噌と醤油の蔵もあるにはある。醤油発祥の地、湯浅であるがこれは自転車ではきつい。山を越えての50Kmである。横浜から東京まで片道50Kmを走ったことがあるがかなり疲れた。昔の人はこのくらいの距離をあたりまえのように歩いていたのだろうか。実家の辺りから山を越えて湯浅に向かう山道が今も残ってはいるが、ひとつ目の山の頂上まで行くのでもそれなりにくたびれる。体力を付けねば。 +</p> +<p> +葛を買って家に向かっていると、いつも畑で散歩がてら声を掛けてくれるおじいさんに会った。普段は簡単な挨拶だけだが今日は少し話した。40歳のときに思うところがあってお経の勉強を始めたらしい。写経していたがすぐに飽きて仏教画を始め、教室を主宰するに至ったそうだ。高野山大学の図書館にしばしば行っては画集のコピーを持って帰って来たという。なかなか変った人生を歩んできたようである。畑でもほとんどの人が頑張れと言うところ、この人は頑張りすぎるなと言うので面白い人だと思っていたが、話してみると色々考えが深そうな人である。 +</p> +<p> +仕事を辞めて以来、人と関わる機会が増えたように思う。畑を借り、道行く人と話し、寺の門を敲き、檀家と話し、その人その人の人生を垣間見ることができ、人生が何倍にも広がった。収入は無くなったが今の方が生きている。 +</p> + diff --git a/content/journal/posts/20220513.html b/content/journal/posts/20220513.html @@ -0,0 +1,24 @@ ++++ +date = '2022-05-13T00:00:00+09:00' +draft = false +title = '坊主になるために薬の服用を強要されそうになってる。' ++++ +<time>2022-05-13</time> +<p>地元の寺で出家、得度し、次は宗門の道場に入って修行である。ただし修行と言ってもいい加減なもので、最近流行しているらしい感染症の対策だかなんだかで、総本山に近い新幹線の駅前にあるホテルで行うらしい。寺に滞在すれば感染するがホテルなら感染しないウイルスとはなんとも特異なものである。それとも参加者を自室に監禁してテレビ電話でも繋いで行うのか。だとしたら自宅からでもいいものを。愚痴を言ってもしかたがないのでとりあえず参加申請書を作成して健康診断書と共に提出した。</p> +<p>しばらくした今日、宗門から電話があった。健康診断書のアレルギーの欄に喘息とあるが、発作が起こった時の為に医者に行って薬を処方してもらい、道場に持参するようにとのことだ。</p> +<p>は?</p> +<p>まず喘息の発作がどのようなものかは自分がよく知っている。僕の場合咳がきつくて息苦しいが病院に行く程のものは幼い頃以来ない。そのため普段から発作を抑えるような薬は常備していないし欲しいとも思わない。</p> +<p>次にたとえどんな症状が出ても薬を飲むかどうかは本人の判断に任せるべきである。薬とは本質的に危険なものである。副作用の無い薬は無い。服用による危険性と服用しないことによる危険性を天秤にかけた上で飲むかどうか判断するべきものである。その判断には統計的な情報に加え、自分の身体の状態をよく観察する必要がある。そのため、他人が服用を強いることはあってはならないだろう。</p> +<p>最後に薬を服用した方がいい場合であっても、どうするかは本人に任せるべきである。これは死生観の問題である。僕は現代の医療に依存した生き方をするより、自然に生きて自然に死ぬ方を選びたい。</p> +<p>以上3つの理由により、宗門の要求は受け入れられないものである。ただし残念ながら突然の電話だったのでここまでうまく纏めて話すことは叶わなかった。以下に電話でのやり取りを記す。</p> +<p>宗門からの要求に対してまずは受け入れられない旨を伝えたところ、集団生活なので宗門に従えとの答えが帰って来た。周りに迷惑がかかるからと。しかしこれは僕個人の問題であり、どのように迷惑がかかるのか、あるいは薬があった場合どうして迷惑がかからないのか分からなかった。そのため僕個人の問題であり周りは関係ないだろうと伝えた。そうすると次は、僕にもしものことがあった場合、薬を持っていないと宗門では責任を取れないとも言われた。これに対して、なぜ僕の命について貴様等に責任を取られないといけないのか分からないと返した。そうすると、そういうものだからとの答えが返ってきた。意味が分からなかったので理解できない旨を伝えたところ、上司と相談して連絡しなおすとのことだった。そのまま電話を切られそうになったので、最後に念をおして、これは死生観の問題であり他人にどうこう言われる筋合いはないこと、そして集団生活と雖も個人の自由の範疇であると考えていることをはっきりと伝えた。</p> +<p>以上のやり取りは2時間ほど記憶を遡って書いたものであり、どこまで合っているか分からないことを断わっておく。</p> +<p>電話が切れた後、一応師僧に報告を入れようと寺に電話したところ、こういう時は適当に嘘でも付いてやりすごせばいいと言われた。お前は潔癖すぎだと。</p> +<p>間違いない。</p> +<p>しかし潔癖なのもある意味気持がいいのだ。会社を辞めて社会から距離を置き、失うものがなにもない状態で綺麗に生きている今はなかなか気分がいい。ただ宗門に対して嘘を付かないことにだんだんと価値を見出せなくなりつつある。こんないい加減な組織に対して綺麗でいることにどれほどの意味があろうか。もうどうでもいいか。</p> +<p>寺に報告をした後、夕飯の支度をしながら宗門とのやり取りを思い返しているとやっぱりなんだかひっかかる。薬を持参させるということは、発作が起こったら服用させるということである。つまり薬の服用を強要しているようなものだ。これは世間一般の常識に照らしても不条理なことではなかろうか。それとも僕が世間と距離を置きすぎて知らないだけで世の中ではそんなものなのか。和服で生活をするようになり、僕が覗ける社会の窓はTwitterのみになってしまった。そのTwitterを見ても、風邪を引いたら頭痛薬や解熱剤を、花粉症にはその薬を飲むのが当たり前のようだし、案外宗門は常識に則って良心的な連絡を呉れただけかもしれない。そんな世間はくそくらえだが。</p> +<p>医学が本当に人を救えているのかは甚だ疑問である。目の前の命はある程度助けられるかもしれないが、助けることが本人にとって幸せかどうかは別問題である。中途半端に助かったが為に余計な苦しみを味わって死ぬことになるかもしれない。また、どんなに医学が発達しても救えない命は零にはならない。さらに、医学が救う命というのは本来自然淘汰されるべきだったものではないだろうか。弱い遺伝子は死ぬのが自然の掟なのである(僕自身小児喘息で死にかけたことがあるので本来は淘汰されるべき人間なのかも知れない)。その掟を破って死ぬはずだった人間を助けてしまい、その人間が子供を作り遺伝子を遺す。そうしてだんだんと医学がないと自立して生きられない人間を量産することにはならないか。現代においても既に医療費が嵩んで面倒なことになっているではないか。目の前の命を救ったが為に将来より多くの苦しみを生む可能性を考えなくていいものか。</p> +<p>以上の議論は文献に基かない上、定量的なことを一切考えていないいい加減なものである。しかし今は目の前の命を救うことを絶対の正義として疑わず、その副作用を完全に無視しているのではないか。それで本当にいいのだろうか。</p> +<p>医学に縋り病気を恐れて長生きするより、日々大切に生き、死を潔く受け入れた方がよっぽど充実した人生だと僕は思う。宗教が現代も存在するのは、科学が救えない人の受け皿として必要とされているからではないか。</p> +<p>全ての人間は死ぬ時に死に、それまでは生きるのである。それでええやん。少なくとも僕はその方がいいのでほっといて欲しい。</p> + diff --git a/content/journal/posts/20220729.html b/content/journal/posts/20220729.html @@ -0,0 +1,8 @@ ++++ +date = '2022-07-29T00:00:00+09:00' +draft = false +title = 'RSS作った' ++++ +<time>2022-07-29</time> +<p><a href="/rss.xml">RSS</a>作った。疲れた。htmlファイルのタイムスタンプを元に更新日を出力したが、なぜかほとんどのファイルのタイムスタンプが最近の日付になってしまっていたので修正しないといけなかった。RSSフィードの作成にはこのウェブサイトを出力するために作った<a href="https://git.mtkn.jp/dotfiles/file/bin/kagero.html">スクリプト</a>に組み込んだ。</p> + diff --git a/content/journal/posts/20220730.html b/content/journal/posts/20220730.html @@ -0,0 +1,125 @@ ++++ +date = '2022-07-30T00:00:00+09:00' +draft = false +title = '新型コロナウイルスとその対策に関する個人的見解' ++++ +<time>2022-07-30</time>作成<br> +<time>2022-08-03</time>更新<br> +<h2>はじめに</h2> +<p> +新型コロナウイルスとその対策に関していろいろと思うことはあるが、自分のなかでもあまりまとまっていないうえ、前提となる知識や情報、考えの論理的整合性がとれていない部分が多々ある。それもあってあまり文章として僕の考えを書こうとは思っていなかった。しかし今回の感染症が流行りだして2年と半年が経ち、いまだに社会全体がおかしい(と僕が思う)状態である。そのため自分も黙っているのはむしろ無責任ではないかと思いここに書き残すことにした。どうせほぼ見てくれる人はいないだろうけれど、それでもなにかしたかった。 +</p> +<p> +僕自身はどんなことがあろうがそれを運命と呼び、それを受け入れる覚悟である。その方が日々楽しく生きて納得の上で死んで行けるように思うのだ。自分でも素人なりに論文を読んだりして可能な限り信頼性の高い情報を集めようとはしているのだが、このような考えが根底にあるので、科学的な根拠というのはなんだかどうでもよく思えてきたりするもので、どうも今持っている知識というのがふわっとして正確性に欠ける。しかしだからこそ書きとめて後で反省できるようにしたい。 +</p> +<p> +そのためこの文章は正確な知識に基くものではない。本来論文等をきちんと引用するべきところだが、とりあえず現時点での考えとして公開することにした。また、自分では気を付けているつもりだが、知らないうちに陰謀論を掴まされている可能性もある。おかしな点は指摘してくれるとありがたい。 +</p> + +<h2>概要</h2> +<p> +マスクは今回の感染症を防ぐ効果は非常に限定的だと思う。一方でその副作用は大きい。体が常に酸素の薄い状態になっている。夏は熱中症の危険もある。却って口が乾燥するという人もいる。なによりの懸念は子供の発育への影響である。他人の表情が見えなくてどうしてまともに育つのか。 +</p> +<p> +ワクチンについても効果は薄く、副反応が大きいので打つべきではないと思う。特に若年層は発症した際のリスクが低く、逆にワクチンによるものと思われる心筋炎等の可能性が高い。さらに打ったからといって感染する確率は変らないようだ。 +</p> +<p> +消毒もやらない方がいいと思う。 +</p> +<p> +またこの病気自体危険性がそこまで高くないので、そもそも感染の拡大を防ぐ必要はないと思う。 +</p> +<p> +さらに、例え危険な病気が流行したとしても、人間味のある生活を犠牲にすることのデメリットとその病気の危険性とを天秤にかけ、どのような対策が適正なのかをきちんと議論すべきである。 +</p> +<p> +ところがそのような冷静な考察をする上で必要な情報がなにひとつみあたらない。感染者数や死者数として発表される数字は統計として信用できないだけでなく、医療機関に対する補助金等により大きく歪められている可能性が高い。 +</p> +<p> +また、マスクやワクチン等は同調圧力により行っている人が多いと思う。周囲の人間がやっているからといった理由だけでの行動である。このような世間の流れは非常に危険だと思う。今回は軽い風邪でしかなかったが、この程度のことでここまで社会全体がひとつの空気に支配されているようでは、本当に国運を分けるようなことに見舞われればひとたまりもない。意見の多様性を無視してひとつの流れを作ってしまうと、その流れが間違っていたときに国が滅びるだろう。 +</p> +<p> +しかしやはり一番心配なのは今このような環境のなかで自我を形成している子供である。マスクやワクチンはそれ自体が非常に強く影響する上、同調圧力も重くのしかかる。こんな状態で子供が健全に育つとはとても考えられない。10年、20年あるいはもっと先かも知れないが、今の子供達がこの国を動かすようになれば必ず大きな問題があちこちで噴出することになるだろう。 +</p> +<p> +そもそもウイルスは敵ではない。生態系の重要な一員である。共存していけばいいのだ。 +</p> + +<h2>マスクについて</h2> +<p> +一応いろいろな論文を読んだ。マスクの効果に肯定的なものも否定的なものもあった。僕が読んだものはTwitterで拡散されているものが中心であるが、そのなかでマスクの効果に肯定的なものは、電話やメール等による調査とシミュレーションによるものばかりだった。前者は論文の中でも明記されているが、回答するかしないかは回答者に委ねられており、また回答者のバイアスもあり、とても信頼できるものとは言えないと思う。後者についてはマスクには定性的には効果があるとの前提に立って、その効果を定量的に測るものであるため、こちらも本当に意味があるものかどうか相当あやしいと思う。日本においてもスーパーコンピュータの富嶽によるシミュレーションを何度も目にしたが、これもマスクにより飛沫が防げると言っているだけで、だからウイルスに対してどう影響があるかという点については説明していない。マスクをすれば飛沫が飛びにくくなるのはスーパーコンピュータで計算するまでもなく理解できることではないか。一方でマスクの効果に否定的な論文には、RCT等、無作為性の高い手法を用いたものが多く、こちらのほうが信頼性が高いと判断した。ところでウイルスがマスクの繊維の隙間の大きさよりも圧倒的に小さいのでマスクに効果がないと言う人もいるがこれについてはなんとも言えないと思っている。マスクの穴が大きくても、例えば繊維に静電気で吸着されたりするかもしれない。このような可能性だけで議論すればいつまでも答えがでない。やはり信頼できる根拠というのは現実の観測であって無作為性の高い統計的手法によるものだと思う。 +</p> +<p> +続いてマスクの害について、先日マスクを着用しないと参加できないという場にどうしても行く必要があり、久々に着用した。あまりにも苦しかった。自分が喘息を持っているということもあるかもしれないが、明かに脳に届く酸素が少いと思う。これはバイアスかなあ。このような状態で2年以上も過している人の脳にはなにかしらの障害が起きていてもおかしくないと思うのだが。あるいはマスクにより口呼吸になり却って喉が乾くという話もある。喉が乾けばウイルス等に対する防御も手薄になるだろう。また不織布マスクからはマイクロプラスチックが放出され、それを大量に吸い込み続けているという話も聞く。マイクロプラスチックを吸い込むことと肺癌とを結び付ける話もあるがこの辺はあまりきちんと確かめていない。他にもいろいろなリスクがあるだろうが、一番重大なものはやはり子供の発育である。生れたときから周囲の人間がマスクをした状態で、どうして人間の表情や感情、あるいは言語を学ぶというのだろう。生まれたての赤ちゃんでなくても、他人との人間関係を学び自我を形成している最中の子供達にとって、周囲の表情が分からないのはあまりにも影響が大きいのではないだろうか。大人でもマスクをした他人の表情を読みとるのはマスクをしていない場合よりも難しいが、子供の場合はそれがさらに顕著であるという。このように社会全体が長期に亙ってマスクで顔を覆っていては、今の子供達の世代が将来酷く歪んだものになると思う。これに関して警鐘を鳴らしている人はいるが、社会全体では無視されている。これには科学的根拠はあまりないようだ。結果が出るのが数十年後であろうから当然である。しかしだからといって子供を虐げていい理由にはならないだろう。子供がまともに育たずに害を被るのは彼らが成長したときに年寄になっている今の我々自身かも知れない。ところで徳川時代において、徳川家の子供は生まれた時から尊いというので、乳母は母乳を与える際に顔を見せないようになにか被っていたらしい。それとの因果関係は不明だが、徳川家の子供は当時の平均よりも死亡率が高かったという。この話もきちんと確かめなければ。一方マスクのせいで子供の方が表情を作れなくなるのではないかと考えていたこともあるがこれについてはどうやら心配ないかもしれない。チンパンジーかなにかの実験で、子供の時から他の個体の表情を見せないように育てても、本人は表情を作ることに障害はなかったそうだ。表情の作り方は本能に実装されているらしい。 +</p> + +<h2>ワクチンについて</h2> +<p> +ワクチンの効果は非常に限定されているようである。当初は一回打てば感染しなくなり、今回の騒動も収まると言っていたように思う。当時からそんな訳ないやろとは思っていたが、案の定全く収束する気配はない。二回目には打てば重症化しなくなり、感染の拡大も終わると言い、三回目もこれで終りだと言っていた。そして今は四回目である。僕は一回も打っていないが、これまで政府の言うことを信じて打って来た人は未だに感染の拡大が収まらないことをどのように考えているのか不明である。更に四回目を打てと言われれば未だにその指示に従う理由もよく分からない。 +</p> +<p> +また副反応も大きいではないか。いちいち高熱がでて苦しんでいる人が沢山いる。僕の父も三回目にやたら高熱がでて仕事の最中に会社から帰って来て家で寝ていた。心筋炎の危険も高いようである。政府がデータをちょろまかしていたと言う話があったが、ワクチンを打った場合と打たなかった場合では打った場合の方が圧倒的にリスクが高いようだ。そもそも今回のワクチンは従来のものとは根本的に違う新しいものであり、その安全性も未知数である。特に長期的な影響についてはなにも分かっていないのではないか。もちろん新しい技術には常に危険が付いてまわるものである。それを理解したうえで打ちたいと言う人は本人の責任で打てばいい。ただし今回のように国民全員に打たせようというのは間違いである。こんなことをしてしまっては万が一この新しい技術に長期的な危険性があった場合に全国民がその影響を受けることになる。卵はひとつの籠に入れて運んではいけないのだ。 +</p> +<p> +ところでワクチンを打つのが無料だと思っている人が多いようだがそんな訳ないやろ。全部国の金であり、つまりは我々の税金である。国債でも発行してくれるのならまだいいが、東日本大震災の前例があるのでどうせ増税されるに決まっている。その時はぜひともワクチンを打った人にのみ課税してもらいたいものだ。僕は払いたくない。また万が一このワクチンに長期的な後遺症等の危険があることが判明でもすれば、その治療にも国民健康保険という名の税金が使われるのだろうと思うとやるせない。 +</p> + +<h2>消毒について</h2> +<p> +消毒についても意味がないだけでなく逆効果である可能性もあると思う。手指消毒に関しては、一般に行われている程度のものではウイルスが死滅するとは思えない。ウイルスが死滅する程の消毒をいちいち行っていては、常在菌をも殺してしまい、さらに皮膚に備わっている物理的な免疫機構も働かなくなると思う。結局これも対策をしているというアピールの為のものでしかないのではないか。 +</p> + +<h2>新型コロナウイルス感染症の危険性について</h2> +<p> +この病気はそんなに危険なものであるとは思わない。死亡も重症化もそんなに数が多くない。また先日厚生労働省のウェブページのデータから計算してみると死者の平均年齢が男性で79歳程度、女性で83歳程度と、ほとんど平均寿命に近いものになっている。これは病気で死んでいるというよりも寿命ではなかろうか。ただしこの計算に使ったデータは年齢が10歳区切りであるのであくまでも概算である。病院がパンクしそうだという話も、どうやら軽傷の人が大量に流れこんできていて大変だということらしい。政府がこの感染症の扱いを5類に引き下げれば済む話のようだ。 +</p> + +<h2>人間味のある生活とのおりあいについて</h2> +<p> +今回の騒動では強権的な対策が次々と打ち出された。マスクやワクチンの推奨は半ば強制力を伴ったものとなり、飲食店の営業自粛では法的拘束力が無いにしても、従わない店は名前を公開するなどされていた。個人的な行動も同様であった。それまであたりまえに行われてきた人間らしい生活が奪われた形になる。その後、因果関係は分からないが、自殺者が大きく増えたようだ。人間が行うことには必ず負の面がある。個人の自由を制限することにはそれなりのコストが伴うのだ。危険な感染症が流行したからといってただちに人権を制限することになりかねない今回のような対策をするのは間違っている。この対策により発生する種々のコストと、対策をしなかったときの危険を天秤にかけて考える必要があろう。命を守る為と言って一切の楽しみを奪われたのでは今すぐ死んだ方がましである。あるいは命を最優先にするにしても、その命の中には当然対策をしたがために自殺に追い込まれる人も入っているはずである。国という大きな組織を運営していく上ではなんらかの数字を見て次の行動を判断せざるを得ない訳だが、その数字として死者数を考えた場合でも、対策をしないがために死ぬ人の数と対策をしたために死ぬ人の数の双方を考慮せねばなるまい。 +</p> + +<h2>必要な情報の欠如について</h2> +<p> +上のような冷静な議論に必要なのが正確な情報である。感染症によって何人死んだのか、何人がどれほどの後遺症に苦しんでいるのか、逆に何人が感染症対策の為に死んだのか等の情報である。ところが今得られるそのような情報にはどれも正確さが欠如している。感染者数として発表されているのは無作為ではない方法でPCR検査をして陽性になった人の数である。東京都ではPCR検査を行う施設に補助金が出るので、接種を受ける人に商品券を配って集客している所もあると言う。そもそもPCR検査の開発者であるキャリー・マリス氏はこの検査は感染症の診断に利用すべきでないとの見解である。またこの感染症による死者数として発表されているのはあらゆる原因の死者のうちPCR検査により陽性だった人の数である。別の原因で死んでも陽性であれば新型コロナウイルス感染症による死者である。更に、新型コロナウイルス感染症により患者が死亡すればその病院に補助金が出ると言う話もある。結局この感染症の本当の姿というのは一切見えてこない。テレビ等ではひたすら上のような定義の感染者数ばかり報道して視聴者の恐怖を煽っているだけである。ただでさえいい加減な定義の数字をさらに補助金によって歪めているのが現状である。このような状況で市井の人々は一体なにを怖がっているのか不明である。 +</p> + +<h2>同調圧力について</h2> +<p> +このような状況において、結局人々はどうしていまだにマスクをしてワクチンを打つのかといえば、それは同調圧力によるものである。もちろん一部にはこのウイルスを本当に恐れている人もいるだろうが、僕の周りではかなり少数派である。むしろ周りの目を気にしている人が大多数だろう。あるいは単に世の中の流れだからという理由でそれに付き従っている人も少なくない。中には自分が苦しい思いをしてマスクを着けているのだからお前も苦しいのを我慢して着けろと言う人や、周囲が常識として受け入れていることなのだから自分もしないと恥をかくと言う人もいる。同調圧力を感じてそれに屈っしてマスクを着用している人も居るが、それでは結局自分自身がその同調圧力になり、それを維持してしまっているではないか。このようなことでは結局いつまでたってもやめられない状態に陥ってしまう。というか陥っている。 +</p> +<p> +僕は上に書いた通りマスクは効果も必要性もなく害があると思っているので着用しない。この考えが本当に正しいかどうかは正直よく分からないが、少なくともマスクを着ける効果や必要性がないと思っているのであれば周りの目など気にせずにその通り行動するべきだと思う。同調圧力に弱い人というのはおそらく社会の流れに合わせてさえいればその流れが間違っていても自分には責任が生じないと考えているのだろう。ところで僕は今のようにマスクを強要するような状態が長く続けば必ず取り返しの付かないような問題がでてくると思っている。特に子供は同調圧力による影響を受けやすいように思う。学校でマスクをしなかったりワクチンを打っていなかったりしていじめられるという話も聞く。彼らは大人になっても周囲を伺うばかりで何一つ判断できない人材になるだろう。このような人達が国を運営する時代がいずれ来る。そのような社会で老後を過ごさなければいけないのは結局この社会の流れに同調していた人自身である。社会の趨勢に任せておけば確かに明確に責任を追求されることはないかも知れないが、その結果の尻拭いをするのは自分自身なのだ。 +</p> +<p> +国を形作っているのは自分達自身である。国民とは別に政府が存在するのではなく、政府は国民自身が作るものである。個人とは別に社会の流れがあるのではなく、自分達が社会の流れそのものなのである。自分の頭で考え自分が信じたことを行動で周囲に示すのはむしろ社会に生きる一個人としての責務ではなかろうか。選挙で投票するのは国民の責務だというのと同じである。 +</p> + +<h2>意見の多様性について</h2> +<p> +同調圧力と関連するが、社会をいい方向に進める上で重要なのが意見の多様性である。ここに書いていることは僕個人の考えであり、それが正しいものかどうかはよく分からない。科学者の中にもマスクやワクチン等に関して種々の意見があり、統一されているものではない。そもそも科学は不完全なものなので科学者の意見が統一されてもそれが正しいかどうかはっきり言えるものではないだろう。個人の信条の問題も絡むといよいよ統一した見解というものを出すのは不可能である。しかしこのような意見の多様性というのがむしろ重要なのではないだろうか。多様な意見があればそのなかで最もいいものが生き残っていく。我々人間を含む生物というのはこのようにして進化し、生き残ってきたのではないだろうか。その結果が混沌のなかにある種の調和がとれたこの大自然というものであろう。 +</p> +<p> +ところが今のように一方の意見に統一して他方を無視し、あるいは排除しようとするのはあまりにも危険である。もし社会が選んだ方が間違っていたら人類は絶滅である。卵はひとつの籠に入れて運んではいけない。まあそのような世界になるのもひとつ楽しみであるかも知れないが。 +</p> + +<h2>子供について</h2> +<p> +しかしなんといっても最優先して考えるべきは子供の未来ではないだろうか。今の感染症対策は結局のところ年寄の命を守る為に子供の生活を犠牲にしているというものである。別に対策などしなくてもこの病気で死ぬ年寄はこの病気でなくても死ぬだろうと僕は思うが、そうでなくてもこの感染症の死者および重症患者はやはり高齢者が中心であろう。そして高齢者を守る為であれば子供の生活や成長が犠牲になるということなど議論の俎上にも登らない。どのみちそう長くない高齢者の命と、この先国の中心を担っていく現在の子供達の生活や成長とどちらが大事なのかは考える余地もないと思うのだが現状そんなことを言っている人は少ないようである。今子供達の生活を鑑みずに自分達の命を最優先に考えて行動している年寄は恥を知れ。 +</p> +<p> +子供への悪影響は多岐に渡る。マスクやワクチン、消毒等の直接の影響と、これらすべてに関連した同調圧力による影響である。これらは各項目の所で書いたのでここでは繰り返さない。 +</p> + +<h2>ウイルスは敵ではない</h2> +<p> +思うにウイルスは人類の敵ではない。彼らに感染することで他種の生物と遺伝情報のやり取りができると聞く。人間は人間だけで自然界を生きている訳ではない。互いに影響しあい、時には殺し合い、あるいは寄生しあい、生きているものである。そうしてあらゆる生物がその総体としてひとつの生態系を形成しているのだと思う。人間の命を最優先にして他の生命を排除するようではそのうち生態系の方から人類が見捨てられることにもなるだろう。ウイルスの方は我々と共存する道を探りながら進化している。人間の方もそれに応えるべきだ。 +</p> + +<h2>最後に</h2> +<p> +ここに書いたことは決して正確なことではない。僕の持っている科学的な知識や情報もいい加減なものである。ただし自信を持って言えるのは、僕は自分の頭で考えその結果正しいと思った行動を取っているということである。僕の考えが間違っていても、それは自分が正しいと思い、その通りに行動しているので、後で謝ることもできるし反省することもできる。自分で考えず、あるいは間違っていると思うことをしていては、後になって反省も謝罪もできない。そこにあるのは周りがやっていたから合わせただけで自分には責任がないという言い訳だけだ。しかしその結果どのような社会になろうが、自分もそこに住むことになるのだ。口で責任が無いとは言っても、結局その尻拭いは自分自身ですることになるのだ。今きちんと考えて自分の責任で行動しておかないと自分が死ぬ時にどんな顔をすればいいのか分からないだろう。食べてしまったケーキはとっておくことができないのだ。</p><div style="display: none;">別に爆弾は作らない。</div> +<p> +僕は他人に言われた通りやってつまらない人生を送るより、死ぬ危険があっても自分の信じたことをして生きたい。その方が死に直面したときに気分よく死ぬことができると思う。 +</p> + diff --git a/content/journal/posts/20220813.html b/content/journal/posts/20220813.html @@ -0,0 +1,31 @@ ++++ +date = '2022-08-13T00:00:00+09:00' +draft = false +title = '正座が出来ていた頃に戻るには' ++++ + +<time>2022-08-13</time> +<h2>正座できない</h2> +<p>今時の年寄は正座のひとつも満足に出来ない。明治期に体育を輸入し、学校が椅子になり、その効果がようやく全ての世代に波及した。現住職のお婆さんはまだ正座ができたそうだ。夏の暑い時期を除いて年中和服で生活しており、亡くなる直前まで足腰はしっかりしていたという。この人の娘で、現住職のお母さんはもう正座ができなかったようである。現住職とその奥さん、そして当然僕自身も正座ができるとは言えない身体である。</p> + +<p>お寺によく来てくれる人達も正座できない。正座の姿勢になることすら一苦労のお年寄も多い。このため寺としては本堂にも椅子を用意せざるを得ず、少しなら正座できるという若い人達も皆椅子に座ることになるという悪循環である。</p> + +<h2>物が多い</h2> +<p>この寺には物が多い。良いと思って自分達で買ったものや、良いと思って檀家さんが持ってきてくれたもので溢れかえっている。これを少しは整理したいのだが。</p> +<p>中でも椅子に関してはどうしよもない。場所を取る。普段はあまり人が来ないのだがお盆やお彼岸には結構集まるようである。この時集まった人達はみんな椅子が必要だというので、かなりの数の椅子が寺に置いてあるのだが、片付ける場所が無いと言って本堂の端っこに出しっぱなしなのだ。一応重ねて並べてあるので整然とはしているが。というか中には多少は正座できる人もいるだろうからその人達は椅子いらんやん。それにたくさん人が集ったからといっても今ある椅子を全部並べる広さもないと思うのだが。</p> +<p>などと考えても、住職もその奥さんも頑である。必要だから置いている。場所がないから仕方ない。せっかく檀家さんが持ってきてくれたものだから仕方ない。</p> +<p>正座できる人ばかりなら椅子など全部捨てられる。中に一人や二人足の悪い人がいてもその程度の数を用意すれば済むのだ。人がぎゅうぎゅう詰めになるようなら座布団を敷かずに正座すればいい。日本の家は狭いんやから正座しようや。</p> + +<h2>老後の自由</h2> +<p>正座が出来ると老後も自由に動ける。住職のお婆さんがいい例である。今時の年寄は医学の為にかろうじて生命活動を維持してはいるが、生きているようには見えない。身体が動きにくいのを年のせいにしているがそれは間違いだろう。若い時から身体の使い方を考えていればそんなことにはならない。甲野善紀を見れば分かる。黒田鉄山もそうだ。僕が知っている合気道家も多くは年をとっても身体に不自由はない。</p> +<p>死ぬまで身体を自由に動かすにはやはり身体の感覚を磨くのがいいと思う。その為に古武術や剣術、合気道などを習わなくても、正座するだけで十分だと思う。光岡英稔がそんな感じのことを言っていたかな。今の椅子というのは、椅子が人間を座らせているものが多いと思う。だから身体に合った椅子、座りやすい椅子などと言って売っているのだ。だれか椅子の本を書いていた。日本には良い椅子がないと。日本人は椅子に座らされるのが窮屈だったからではないか。日本人の身体観では、椅子が自分を座らせるよりも自分が椅子に座る方が心地良かったのではないか。正座の場合、下にはただ平たい床があるのみである。家によっては床板がゆがんでいるかもしれない。日本人はそこに自ら座って生活してきたのだ。床が人を座らせていた訳ではない。僕は人間工学に基づいたと言って売られているものが嫌いなのだが、そのような商品は人間が使うというより商品に人間が使わされるように感じていたのかもしれない。</p> +<p>普段から正座で生活する。これだけで老後の自由が手に入るんやからやらん手はないやん。</p> + +<h2>状況を変えたい</h2> +<p>この状況をどうにか昔に戻せないものか。上に書いた以外にもいろいろな問題の根本には正座ができないことがあるように思う。ちょっと乱暴かな。然し正座が出来るだけで解決する問題は山ほどあると思う。</p> +<p>ではどうすれば日本人は再び正座できるようになるのだろう。最も根本的な解決策はやはり小学校から椅子を無くすことだと思う。我々は物心付いてよりこのかた、ひたすら正座をしない訓練を受けてきたと言えよう。そういえばなぜか幼稚園には椅子がなかった気がする。床で物を広げて遊んでいたような。記憶違いかな。他の解決策など無いと言ってもいいくらいかもしれない。</p> +<p>然しこれを実行するにはまず世間の意識を変える必要がある。そのためには今なら科学的根拠が便利か。科学っぽい根拠。正座して育った子供と正座せずに育った子供の将来の偏差値を適当にデータとして示せばいいだけなのでこの第一歩は割とすぐできるのかな。</p> +<p>あるいは寺子屋をやってそこでは正座させればいい。その後彼らの成長を追っていけばいい。何十年かやってメディアにでも取り上げられれば少しは正座を見直してくれそうなものである。</p> +<p>然し問題はここからかもしれない。良いことだと説得しても自分の生活に直結させる人があまりに少ないように思うからだ。樹木の重要性やコンクリートの有害性を言って納得してくれたように思っても、自分が掃除している庭はそれとは切りはなして考えるようである。その一方であまりにもメディアで大々的に取り上げられると、論理を一切考えずに全て受け入れてしまうようだ。マスクやワクチンの話である。と思っても、論理を無視してメディアを信じない人も居る。結局自分の信じたいことしか信じないというのはこういうことなのか。自分自身にこのような傾向があるのは実感していたが、僕の周囲の人達はどうも無意識のうちに情報を取捨選択しているようで、これでは自己反省もくそもできない。人のふりみてなんとかと人には言うが、自分自身には一切あてはめて考えないようなのだ。</p> +<p>正座が良いと言ってもきっと自分とは関係のない世界の話だと思って終わる可能性もある。現在でも棋士はずっと正座であり、その方が集中できるという話は聞くが、だからといって自分の生活に正座を取り入れる人は稀である。ではもっと大きく報道させて今のマスクのように流布すればいいのか。これは僕は嫌いである。ただ空気と同調圧力を形成するだけで、あらぬ方向に向かってしまう可能性も考えないといけない。やっぱり一番気分がいいのは自分自身で実行してその姿を世間に晒すことである。あとは世間が思い思いに判断して行動すればいいのだ。寺子屋で子供に正座をさせてその変化を観察するのがいいだろう。社会全体に変化があらわれるまで50年くらいかかるのかな。</p> + diff --git a/content/journal/posts/20220814.html b/content/journal/posts/20220814.html @@ -0,0 +1,14 @@ ++++ +date = '2022-08-14T00:00:00+09:00' +draft = false +title = '田舎の夏休み' ++++ +<time>2022-08-14</time> +<p>西の空が赤く染まり始めた頃、田圃の中の畔道を寺に向かっていると、向こうから少年が歩いてきた。釣竿の先になにやらぷらぷらさせている。タウナギかなにかだった。</p> +<p> +「釣ったん?」<br> +「うん」<br> +「すげぇ」<br> +</p> +<p>田舎の夏休みはまだ生きているようだ。</p> + diff --git a/content/journal/posts/20221023.html b/content/journal/posts/20221023.html @@ -0,0 +1,38 @@ ++++ +date = '2022-10-23T00:00:00+09:00' +draft = false +title = '寺に適応できない' ++++ +<time>2022-10-23</time> +<h2>これまで</h2> +<p>実家の菩提寺に入って出家した。坊主になってこの寺で生きていけないかと考えたのだ。ところが一年経った今でもこの寺に適応できていない。八月のお盆の間、住職は忙しくて朝のお勤めをしないので代わりにして欲しいと言われ、半月ばかり泊り込むことになった。ゆくゆく自分が住職に成ることを考え、これを機に半分寺に住み込もうと思い、お盆が済んでからもしばしば寺に泊まった。そうして八月はほぼ寺に居たのだが、その間寺に適応できずにどんどん自分の感情が萎れていった。とうとう適応障害と言えそうな状態にまでなり、九月と十月はほとんど実家に引き込もっている。どうしたものか。</p> + +<p>なにがそんなにしんどいのか。住職の奥さんと一緒に居るのがしんどい。この人が何を考えているのか分からない。僕の言ったこともその場では肯定しているように感じることが多いが、あまり理解していないようだ。やるべきことは自分で見付けろと言いながら、なにかしようとすると拒否される。生活の面でもいろいろと噛み合わない。柔軟剤がきつすぎてしんどくなった。食事の脂が多すぎてお腹を壊した。台所が汚なすぎて気持が悪い。</p> + +<h2>柔軟剤</h2> +<p>初めて寺に行って掃除を任された時から気になっていた。雑巾があまりにも臭いのだ。それも柔軟剤の臭いである。当時は実家から通っていたのだが、昼間寺の掃除をすると、家に帰ってからどんなに手を洗っても臭いが落ちないほどである。雑巾だけではなく寺にある布という布から悉く同じ柔軟剤の臭いがする。この臭いをいい臭いだという人の気が知れないのだが。</p> +<p>ある時檀家さんからもらった素麺をお裾分けしてもらったのだが、箱を包むビニールにも柔軟剤の臭いがこびりついていた。実家に持ち帰り後日湯掻いたのだが、素麺自体にも臭いがついていて食べられたものではなかった。他の家族も顔をしかめていた。勿体無いが全部廃棄した。</p> +<p>後で気付いたが、どうも寺中の埃から柔軟剤の臭いがするのだ。埃は布からでたものなので考えれば当たり前か。この埃が食品を保管している棚に積り、その中の素麺に臭いが移ったのだと思う。埃が臭うので寺中至る所その臭いである。</p> + +<h2>食事</h2> +<p>寺での食事は脂が多い。ささやかな生活をしていると本人達は思っているようだが、食卓にはやたら牛肉が並ぶ。脂ののった鮭も多い。奥さんは歯がほとんどないので肉も魚も脂の乗ったやわらかいものでないと噛めないのだ。数えていないので適当だが、3回に1回は鮭、5回に1回は牛で、どれも脂でとろとろの物である。僕が胃腸が弱く、特に脂っこいものが苦手ということもあるが、少なくともこれでささやかとはどうも言えないように思う。</p> +<p>ところである日豚の肉塊で焼豚を作ったのだが、茹で汁を冷蔵した上澄みの脂を炒め物に使おうと取っておいたのだが、それは食べたくないらしい。固形の脂は体内でも固まって健康に悪いというテレビの知識だそうだ。普段あんなに肉の脂を取っているのにそれは気にならないらしい。理屈はよく分からんがそれよりも今から作らんとしている野菜炒めを食べてくれるのかどうかが重要なのでそれを聞いた。返事は「しいては食べないけど。」というあいまいなものだった。食べないならサラダ油で作るか、別に一品追加しないといけないのだがどうかと聞き直すと、「しいては食べないけど。」という返事が再び返ってくるだけだった。これ以上聞くのも面倒なので、僕はせっかく取っておいた豚の脂を捨ててサラダ油で野菜を炒めた。これは他のことでも感じていたことだが、この人には自分というものが無いのか、あるいはそれがあっても表に出さないようである。別件ですこし口論になったことがあるので、感情がない訳ではないのだが。エドワードルトワックという米国の戦略家曰く、こちらの言うことを全部受け入れる国より、自分の立場をはっきりと言う国の方が同盟国として信頼できるそうだ。そんなのあたりまえじゃないですか。まる。住職の奥さんはどうやら自分の考えや感情を見せず、相手に全部任せる方が信頼関係を築けると思っているようだ。責任を全部こちらに押し付けているようにしか僕には見えないのだが。</p> + +<h2>台所が汚ない</h2> +<p>この寺はどこもかしこも物であふれかえっている。かろうじて法要に必要な本堂と控室はましだが、それでも不必要な物が多い。特に酷いのは台所である。おぞましい。寺の性質上貰い物が多いのはしかたがない。檀家さんにいろいろ貰ってそれをまた他の檀家さんに配るのだがそれでも余る。寺にいて消費するのは住職とその奥さんの二人だけであった。賞味期限がくるまでに食べきれないのはある意味仕方がないことでもある。本当は物を持ってくる檀家さんに寺の状況を話して少し持ってくる量を減らしてもらうべきだと思うのだが、奥さんはそうは考えない。檀家さんの気持をないがしろにできないからと、くれる物は断わらない。そして捨てる。これのどこがないがしろにしていないのかさっぱり理解できないが。ともかく現状は食べ物が多すぎるのだが、一番の問題は古い物を一向に捨てないことである。僕が寺に通い始めた頃は冷蔵庫がパンパンだった。しかも3台もである。二人暮しの家に小さくもない冷蔵庫が3台、悉く満杯だった。ある時台所にある冷蔵庫を上から下まで整理した。腐ったものを全部捨てた。奥からは2009年に賞味期限が切れたものなんかも出てきた。これは一番古い方だが、平均しても3年以上前のものだったと思う。ところで冷蔵庫の中からでてきたものは大体がスーパーなんかで奥さん自身が買ってきたもので、檀家さんから貰ったものはあまりなかった。檀家さんからの多すぎる貰い物に加え、自分でも異常に買い込むのだ。</p> +<p>この買い方もむちゃくちゃである。冷蔵庫の奥に抹茶が山程眠っていた。聞くとどれも自分で買ったものだと言う。お茶屋が友達なので行けば買わないと悪いとか、来客の為に新しい抹茶を用意したいとかで、無駄に多く買ってどれも処分しないのだ。ある日美味しくなさそうな出来合いのオムレツを買ってきた。どうやら本人も美味しくなさそうだと思いつつ買ったらしい。近くの個人経営の商店によく行くのだが、潰れては困るので欲しいものがなくても適当になにか買うのだそうだ。店の為に不要な物を買うのは良くないと思う。需要を歪めることになるからだ。大事な店ならむしろ自分が欲しい物を伝えて、要らない物は買わない方がいい。仕入れるかどうかは店の判断だろうが、客からも要望を伝えることで、その地域にとって必要な店になる可能性が高まるのではないか。不要なものでも買ってしまうと、結局好ましくない依存が生まれて返って店を潰すことになるか、そうでなくても地域に必要とされない店になるだろう。</p> +<p>冷蔵庫を一通り綺麗にしたその日の夕方、奥さんが大量の野菜と果物を仕入れてきた。流石に少し怒りが湧いた。そうでなくても奥さん自身、綺麗な冷蔵庫を喜んでいたので、再びちらかるようなことは避けようとも思い、そんなに大量に買ってこられるとまたぐちゃぐちゃになるだろうと小言を言っておいた。そんなに嫌味のつもりはなかったのだが。次の日も前日の野菜がたくさんあるにも関わらずまたいろいろ買ってきた。前日よりはさすがに少なかったが、同じように買いすぎだと思う旨を伝え、買ってきたものを何に使うのかひとつひとつ聞いてみた。すると見る見る顔が曇っていった。最後に、欲しいものを欲しい時に買って食べるのは自由だが、そのような買い物をするなら必ず冷蔵庫がぐちゃぐちゃになるから古い物はどんどん捨てていくことになるがそれでもいいのかと正すと、とうとう何も答えずにどこかに行ってしまった。その日の夕食はどうなったのか覚えていないが、多分普段通り食べたのだと思う。特に記憶にないということは、別にお通夜のようにはならなかったのだろう。次の日は朝から掃除に来ていた檀家さんとひと悶着あった。朝食の後になって奥さんがそのことで明らかに僕に対して敵意を剥き出しに、ああだこうだ言ってきた。内容はこまかくは覚えていないが、どうも檀家さんと僕とのやりとりと言うよりも前日のことについて攻めたてられたように思う。ひとつだけはっきり覚えているのは「論で言われると考えるのが面倒くさくなってしまう」という言葉だ。ではどうすればええねや。それから、檀家さんとのやりとりでは僕も良くない点があったのでそれを自分で分析するようなことを言うと、「自分で反省できて偉いわねぇ。」と言われた。こうも人の気持を逆撫でするようなことが言えるのかと思ったものだ。</p> +<p>調理器具も異常に多い。鍋もフライパンも同じような大きさのものがそれぞれ10個以上ある。使っていない調味料も置いたままである。冷蔵庫の他にもキッチンストッカーとか言ったか、間口が1m程度、奥行60cm程度、高さは2m近くあるような棚にびっしり保存食が詰っている。多分半分は賞味期限が切れている。この棚は台所の隣の4畳程の部屋にあるのだが、この部屋にはほかにも本棚のようなものが二つあってカップ麺やら乾物やらお菓子やらで埋まっている。足元にはダンボールに入った缶ジュースがあったり、使っていない家電があったり、変色した調味料のビンなんかもあったと思う。勝手に整理する訳にもいかず、整理を手伝っても冷蔵庫の時のようになりそうで、毎日一人の時間にただ眺めることしかできなかった。ある日疲れてぼーっとしているところを奥さんに見られたが、たまたま顔が食器棚に向いていたために、「物が多いと思ってるんでしょ。」と言われた。先方も僕がそこに居るだけで結構な心理的負担を感じているのだろうか。</p> + +<h2>檀家さんとの口論</h2> +<p>檀家さんの話が出たのでここに書いておく。</p> +<p>この檀家さんには以前、清澄寺という日蓮宗の聖地の森がコンクリートで覆われてたいへんだという話しをしていた。土をコンクリートにしてしまっては周囲の環境を著しく痛めてしまうという話である。このときは高田宏臣氏の本を持ち出して説明し、賛同してくれた。ある朝この檀家さんが境内の落葉を掃除している所に奥さんも居たので話しかけた。この時も高田さんの名前も出したように思うが、落葉を残して腐葉土にできないかとか、もっと境内に木を増やした方がいいのではないかなどと話すと、この檀家さんは落葉が積もると汚ないし、木が増えると虫が沸き、また管理も大変だからむしろコンクリートを増やすべきだと言った。前回コンクリートの話で同意してくれたのは何だったのか。</p> +<p>ところで話をしているとこの檀家さんの顔がみるみる曇り、最後にはとうとうまっくろけになってしまったのは怖かった。また、上で書いた自分の反省というのは、落葉を掃除している所に落葉を掃除しすぎるのは良くないのではないかという話を持ち掛けたことについてである。</p> + +<h2>物を捨てられない</h2> +<p>台所も汚いが、他の場所も物で溢れている。檀家さんに貰った物、檀家さんが作ってくれた物、自分で買った物。もちろん必要な物もあるだろうが、問題は奥さんも住職も不要だと思いながら捨てずにいる物である。檀家さんの気持を蔑ろにできないから捨てないというのはあまりにも問題である。結局それのせいで寺が汚なくなっては檀家さんの面目を返って潰しているのではないか。土地柄、檀家さんには漆器屋さんが多い。漆の盆は押入に積み上がっている。どこかの旅行のお土産といってでかい塗の囲炉裏をくれたが、これは部屋の隅に起きっぱなしで使ったためしがない。昔本堂で使う椅子がなく、急遽檀家さんが空き缶を束ねてダンボールかなにかと布で綺麗に包んだものが今も本堂の隅に出しっぱなしで、使っているのを見たことがない。二人暮しなのに大きな食器棚が6個くらいある。どれもぱんぱんに詰っている。昔は檀家さんがよく集って食事をしたそうだがそれでもなお余るほど多い。何十年も寺に通っている信者さんが、今でも来るたびに初めて見るカップが出てくるという。箪笥が多い。使っていないものもある。ひどいことに同じ箪笥を2個重ねて置いている。上にではなく、前後に2個重ねているのである。1個無駄じゃん!ねぇよ赤外線はよぉ。</p> +<p>寺というのは俗世間にはない空気を作るべき場所ではないのか。綺麗に片付けて掃除して、物で溢れた豊かなこの世界にあって、物質的ではない本当の豊かさを提示する場所でなくていいのだろうか。物質的な豊かさを賞賛するのであれば寺はもっと金儲けに走るべきであろう。そうしないのはそうではないものを世間に見せるためであろうに。</p> + +<h2>人格を感じられない人</h2> +<p>住職の奥さんにしても、上に書いた檀家さんにしても、本人が一体何を考え、感じているのか僕にはさっぱり掴めない。上に書いた檀家さんとのやりとりだけでなく、住職の奥さんも普段の会話では僕の考えに概ね賛同してくれる。始めは話の合う人なのかと思っていたがどうもそうではなかったらしい。この人達は自分に関係のない話に関してはその場の雰囲気や同調を重視して賛同しているような空気を作りだすが、自分に関係のある話しになると突然豹変して自らの利権を死守しようとするようである。僕はこの一年、このような人と付き合うことに疲れてしまったようである。僕はこのような人の感情を読むことができず、何を考えているのかも分からない。論理的に考えるのも無駄だった。僕はこの人達に一切の信頼を置くことができない。</p> + diff --git a/content/journal/posts/20221031.html b/content/journal/posts/20221031.html @@ -0,0 +1,10 @@ ++++ +date = '2022-10-30T00:00:00+09:00' +draft = false +title = '大阪駅にて' ++++ +<time>2022-10-30</time> +<p>いつだったか、大阪駅から和歌山に帰るため、1番線にて関空・紀州路快速、関西空港・和歌山行を待っていた。この快速は関西空港行4両と和歌山行4両が連結して8両編成となっている。途中の日根野駅で切り離し、その後はそれぞれの目的地に向かう。僕は和歌山行の先頭車両に乗ろうと思い、白色三角印の4番に並んでいた。ところでこの快速に女性専用車はないのだが、環状線内を走る普通列車は4号車が女性専用である。自分の並んでいる所にもそのように書いていた。しばらくして僕の後ろにおじさんが一人並んだ。次にこのホームに来るのは普通列車である。この人も後で来る快速に乗るのかと思って気にしていなかった。</p> +<p>しばらくして普通列車が到着した。僕はこれには乗らないので横にずれて後ろの人達に道を開けた。列車が停止してドアが開くと、後ろのおじさんはそのまま女性専用車にすいこまれていった。声を掛けるべきか考えているうちに発車ベルが鳴り、おじさんは閉じ込められて行ってしまった。</p> +<p>ところで関空・紀州路快速のうち和歌山に行くのは後ろの4両、5号車から8号車である。僕が並んでいたのは和歌山行の先頭車ではなく関西空港行の最後尾だった。僕は足元の白色三角印4番をしばらく眺めた後、隣の5番に並びなおした。</p> + diff --git a/content/journal/posts/20221228.html b/content/journal/posts/20221228.html @@ -0,0 +1,17 @@ ++++ +date = '2022-12-28T00:00:00+09:00' +draft = false +title = 'Holy Shit!' ++++ +<time>2022-12-28</time> +<p>最近見ているプログラマの配信者がよく言っている。「Holy Shit!」Holyは聖なる、Shitはうんこという意味である。日本のプログラマもうんこという言葉を好むが、海外でも同じようである。 +</p> +<p> +ところでこの言葉の訳語はなにがいいかと考えていると思いがけずぴったりなものを思いついた:</p> +<p> +「すめらうんこ」 +</p> +<p> +そうそれは、すめらみことの落しもの(droppings)。嗚呼不敬。 +</p> + diff --git a/content/journal/posts/20230119.html b/content/journal/posts/20230119.html @@ -0,0 +1,12 @@ ++++ +date = '2023-01-19T00:00:00+09:00' +draft = false +title = '寺を辞めた' ++++ +<time>2023-01-19</time> +<p> +寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p> +<p> +ふう。 +</p> + diff --git a/content/journal/posts/20230725.html b/content/journal/posts/20230725.html @@ -0,0 +1,20 @@ ++++ +date = '2023-07-25T00:00:00+09:00' +draft = false +title = '水道と空調' ++++ +<time>2023-07-25</time> + +<h2>水道</h2> +<p> +水道が普及して井戸が使えなくなった。水道があれば井戸から飲み水を汲む必要がない。井戸から飲み水を汲まなくなれば井戸水が無くなっても、あるいは汚染されても問題ない。問題なければその通りになる。水源を涵養するという考えが忘れられ、森がコンクリートで覆われた。水が汚なくても良くなったので農薬や肥料を大量に使うようになった。そして井戸は水位が下り、汚染された。</p> +<p> +便利な水道が普及した為に、水道が無いと不便な世界になった。不便というよりそれがないと生きるのもままならない。現在我々はそのインフラの維持費と、災害時の脆弱性に悩まされている。</p> +<h2>空調</h2> +<p> +空調が普及したら気温が高くなった。逆ではない。空調があれば気温が高くなっても問題ない。問題なければその通りになる。街から植物が一掃されコンクリートとアスファルトで覆われた。暑くても問題ないので経済優先で自動車の為の道路ばかり整備された。そして街の気温は上った。</p> +<p> +便利な空調が普及した為に、空調が無いと不便な世界になった。不便というよりそれがないと生きるのもままならないようになりつつある。</p> +<p> +そのうち空調の効率を上げるために、都市全体が大きなドームに覆われる。ドームの外は50℃か60℃か。このインフラもまた維持費と災害に対する脆弱性で我々を悩ませることになろうか。</p> + diff --git a/content/journal/posts/20230726.html b/content/journal/posts/20230726.html @@ -0,0 +1,11 @@ ++++ +date = '2023-07-26T00:00:00+09:00' +draft = false +title = 'GOPL読んだ' ++++ +<time>2023-07-26</time> +<p> +Alan A. A. DonovanとBrian W. Kernighanの「The Go Programming Language」を読了した。読み初めた日付は記録していないが、演習問題用のgitリポジトリは、今年の5月19日が最初のコミットである。二ヶ月ちょっとかかった。本文だけでなく演習問題も濃かった。時間をかけて読む価値があると思う。Kernighanの書いた本は英語が綺麗でいい。</p> +<p> +アマゾンで英語の原著を買ったが、表紙の紙のコーティングみたいなビニールが剥れてきているのが残念。</p> + diff --git a/content/journal/posts/20230729.html b/content/journal/posts/20230729.html @@ -0,0 +1,26 @@ ++++ +date = '2023-07-29T00:00:00+09:00' +draft = false +title = '無題' ++++ +<time>2023-07-29</time> +<p> +最近持っている浴衣がどれもぼろぼろになってきた。元々古いもらいものなうえ、着方も動き方もなってないので着ているとすぐにどこか破れる。補修しながら使っていたが、いよいよ布自体がすり切れてきた。いい機会なので自分で仕立ててみようと思いたった。 +実は寺に居たころに白衣を作ろうと思い、晒の裁断と袖の縫いまでしていた。ほったらかしになっていたこれを再開することにした。</p> +<p> +腋縫いまでしていたこの着物に、今日はおくみを片方だけ付けた。両方したかったが疲れたのでもう片方はまた今度。色が付いていないただの晒だが、白衣など着る機会が無くなってしまったので、袖と襟だけでも染めることにした。家にころがっていたターナーの無臭柿渋を3倍に薄めて染めた。本当は自分で育てた柿を使いたいが、そんん場所はないので買ってきた渋である。柿渋は紫外線で硬化して定着するらしく、媒染剤は必要ないようである。襦袢くらいには使えるだろうか。</p> + +<p> +梅を塩に漬けているのを思いだしたのでこれを庭に干した。県民の義務である。そして今日は土曜である。本当は自分で育てた梅を使いたいが、そんな場所はないので買ってきた梅である。残った梅酢は生姜でも漬けようか。</p> + +<p> +庭に植えた里芋から芽がでてきた。大野芋というものであるが、僕が住んでいる場所とは関係がない。既に大きな葉が付いていたのだが、セスジスズメという芋虫にやられて禿げていた。四匹いたのだがある晩二匹減り、二日後にもう一匹、そしていつのまにか最後の一匹が居なくなっていた。なにかに食べられたのか。蛹は見ていない。以前ニンジンの花がキアゲハにやられた時も、たくさん居た芋虫が一晩で一匹も居なくなっていた。ところで芋虫というのは見ているとなんだか美味しそうに見えてくる。実際美味しいらしい<sup>[1]</sup>が。まだ食べる勇気はない。</p> +<p> +この里芋は葉だけでなく茎を根本までかじられて切り株のようになっていたが、その切り株の中心が少しづつ盛り上がってきている。芋は強い。 +</p> + +<ul> +<li>[1]<a href="https://survivalnature.sakura.ne.jp/0000/11_mushi/imomushi/0000.html">イモムシ・ケムシ.サバイバル節約術</a></li> +</ul> + + diff --git a/content/journal/posts/20230802.html b/content/journal/posts/20230802.html @@ -0,0 +1,23 @@ ++++ +date = '2023-08-02T00:00:00+09:00' +draft = false +title = '着物できた' ++++ +<time>2023-08-02</time> + +<p> +作っていた着物が完成した。思っていたよりもずっと簡単だった。細かいところを追求すれば職人技なのだろうが、日常的に使うものを作るには素人でも十分である。</p> + +<p> +初めは白衣のつもりで安物の晒をそのまま使って作り始めたが、白衣を着ることが無くなってしまったので、袖と衿だけ柿渋で染めて襦袢にすることにした。形は長着だが。</p> + +<p> +完成後、右の衿がかなりずれて付いていることに気付いた。このときは疲れからか不幸にもこのままでいいやと思っていたが、見れば見るほど気になって、とうとうこの部分だけ付けなおすことにした。そして完成したのがこれである。</p> +<img src="20230802.jpg" alt="初めて自作した着物の写真" /> + +<p> +ほんのひと昔前までは着物を作る人などその辺にいくらでもいた。世話になっていた寺の住職のお婆さんは和裁の先生だったそうだし、僕の祖父母より少し若いお茶屋さんは、自分のお母さんが家族の着るものを自分で作っていたという。つまり僕の3、4世代前は着物を自作するのが当たり前だった。ところがこの50年程の間にだれも作らなくなってしまった。和服に限らず自分で作れば安上りなのに。</p> + +<p> +なぜ自作しないのかと聞くと、きっと「そんな時間はない」という答えが返ってくる。金銭的にゆたかになって、自分で服を作る必要がなくなった。のではなく、服を作るような時間的余裕のある人がいなくなったというのが実情である。はて。</p> + diff --git a/man/journal/posts/20230802.jpg b/content/journal/posts/20230802.jpg Binary files differ. diff --git a/content/journal/posts/20230803.html b/content/journal/posts/20230803.html @@ -0,0 +1,27 @@ ++++ +date = '2023-08-03T00:00:00+09:00' +draft = false +title = 'サマータイムレンダ読んだ' ++++ +<time>2023-08-03</time> + +<p> +サマータイムレンダを読んだ。弟が漫画を買ってリビングに置いて母や妹に読ませていた。ある日なにげなくパラパラめくり始めたのだが、気づけば全部読んでしまっていた。13巻で完結するコンパクトな漫画である。</p> + +<p> +話の内容はサスペンスとしては面白かった。サスペンス自体を論評する知識はないが、少なくとも僕は楽しめた。話の構成とその展開が上手いのだと思う。</p> + +<p> +ところが最後の方に来て少し残念な感じになった。展開はそれまで通りのものに加え、クライマックスの勢いが付いているのだが、黒幕の動機がどうもうすっぺらい。そんな幼稚なやつにふりまわされていたのかと思うと、話の展開が面白いだけになんとも空虚になる。300年前に生まれた神職がそんなこと考えるのかも疑問である。そして動機がただ利己的であるがゆえに、悪役がどこから見てもただの悪役でしかない。だからこそ結末はこの悪役を倒してめでたしめでたしとしかならない。その上途中でおこった取り返しの付かないはずのことも、結局うまいことひっくり返して何も失わずにハッピーエンドを迎えた。これもあまり好みではなかった。</p> +<p> +この辺に関して個人的には最近読んだ「風の谷のナウシカ」のコミックがよかった。こちらには完全な悪がでてこない。敵であってもそれぞれなにかしらの事情があり、それぞれの信念に基いて行動している。だからこそ悪を殲滅して終りにはならないし、敵に勝ってもやるせない。このすっきりしなさが物語に重層性を持たせているように思う。さらに起ったことは事実として定着し、覆ることがないというのも重要なテーマとしていたように思う。どんな過去であっても今の自分たちの生命を以って未来を切り開くというものである。題材も内容も全く違う作品なので比べてもしょうがないが。</p> + +<p> +僕はそもそも死んで時間が戻るのは好きではない。人生の一回性が無くなってしまうからだ。しかしこの作品は死んで時間が戻るといっても、一応完全には取り返しの付かないようになっている。それもあって楽しめたのだが、最後の最後で全部なかったことにしてしまったのは残念である。</p> + +<p> +それから、時間が戻る際に主人公は意識が連続しているので、完全に同一人物といえるかもしれないが、その他の登場人物はどうなのか。戻る前と戻った後では同じ意識の人間なのか。主人公から見れば自分以外に主観は無いので、時間が戻っても以前と同じ人間に見えるだろうが、しかしそれでいいなら本人もコピーされた影も同じだということにならないだろうか。この点について、どこかで問題提起されていたと思うが、結局回収されずにおわった。最後のハッピーエンドはあくまでも本人のみのものであり、それまでに死んだ他の登場人物は結局そのままなのではないだろうか。これもひとつの大きなテーマだと思っていただけに、どうも疑問が残る。</p> + +<p> +最後に、「あっぽけ」って言ってる人は見たことがない。「今日わは...」については大阪人の友達に言ってきょとんとされた経験がある。</p> + diff --git a/content/journal/posts/20230810.html b/content/journal/posts/20230810.html @@ -0,0 +1,16 @@ ++++ +date = '2023-08-10T00:00:00+09:00' +draft = false +title = 'イソヒヨ' ++++ +<time>2023-08-10</time> + +<p> +最近イソヒヨが庭でよく遊んでいる。昨日も来た。部屋の窓からのぞきこんでも逃げない。里芋が植わっているあたりでなにかしている。突然里芋の方にとびかかったと思うと、そのまま隣の家の物干しまで飛んでいった。くちばしになにか太いものをくわえている。少しくわえ直してそのままどこかに行ってしまった。</p> + +<p> +里芋の葉には4、5日前からセスジスズメがいた。昨日の朝見たときはだいぶ太って目玉模様もはっきりしていた。元気に里芋を食いちらかしていた。イソヒヨが飛んでいった後確認するも姿が見えない。くわえていたのはセスジスズメだったのか。</p> + +<p> +少し前にも里芋にセスジスズメがついていたが、気づいたら一匹もいなくなった。その前にはニンジンについたキアゲハが一晩でいなくなった。犯人はこいつか。</p> + diff --git a/content/journal/posts/20240428.html b/content/journal/posts/20240428.html @@ -0,0 +1,15 @@ ++++ +date = '2024-04-28T00:00:00+09:00' +draft = false +title = 'きのかわ弦楽合奏団第7回定期演奏会' ++++ +<time>2024-04-28</time> + +<p>先日きのかわ弦楽合奏団というアマチュアの団体に入団しました。その定期演奏会が7月にあります。多分出演します。</p> + +<figure> +<img src="7th_concert.jpeg" alt="きのかわ弦楽合奏団の第七回定期演奏会のポスター。7月14日14:00から、かつらぎ総合文化会館、あじさいホールにて"> +<figcaption>Copyright: きのかわ弦楽合奏団</figcaption> +</figure> + + diff --git a/man/journal/posts/20241009-1.jpg b/content/journal/posts/20241009-1.jpg Binary files differ. diff --git a/man/journal/posts/20241009-2.jpg b/content/journal/posts/20241009-2.jpg Binary files differ. diff --git a/man/journal/posts/20241009-3.jpg b/content/journal/posts/20241009-3.jpg Binary files differ. diff --git a/man/journal/posts/20241009-4.jpg b/content/journal/posts/20241009-4.jpg Binary files differ. diff --git a/man/journal/posts/20241009-5.jpg b/content/journal/posts/20241009-5.jpg Binary files differ. diff --git a/content/journal/posts/20241009.html b/content/journal/posts/20241009.html @@ -0,0 +1,47 @@ ++++ +date = '2024-10-09T00:00:00+09:00' +draft = false +title = '棚作った' ++++ + +<p> +自室のクローゼットが使いにくかったので引っ剥がして新しいのを作った。収納していたのはほとんど本だったのだが、奥行きが深いのに棚板が少ないので前後に並べて置いていたため、どこになんの本があるのか見にくく、取り出しにくかった。あとパソコン置き場としても使っていたが、24インチのモニターが一枚ギリギリ入る程度の幅しかなかったのでこれも拡張したかった。久しぶりに木工もしたかったので木材を買って自作した。杉を基本に、パソコンを置く場所だけ檜にした。<p> + +<figure> +<img src="20241009-1.jpg" alt="クローゼット跡地と買った木材"> +<figcaption>クローゼット跡地と買った木材</figcaption> +</figure> + +<figure> +<img src="20241009-2.jpg" alt="パソコン机の部分"> +<figcaption>パソコン机の部分</figcaption> +</figure> + +<p> +パソコン机の天板は白木のままでは寂しいので亜麻仁油を塗ってオイルフィニッシュにしてみた。結構黄色が濃くなった。</p> + +<figure> +<img src="20241009-3.jpg" alt="机のオイルフィニッシュ"> +<figcaption>机のオイルフィニッシュ。下においているのが白木のもの</figcaption> +</figure> + +<p> +せっかくやるならと思って蟻を切ってみた。適当でも案外ガッチリはまるものである。英語ではdovetailというそうだ。鳩のしっぽという意味である。日本語の蟻よりも鳩のしっぽのほうがしっくりくる気がする。</p> + +<figure> +<img src="20241009-4.jpg" alt="蟻"> +<figcaption>蟻</figcaption> +</figure> + +<p> +上に本棚をつけて完成。本棚は棚を移動しやすいようにと思い、ネジ止め式の棚受けを買った。めんどくさくなったわけではない。左下においているのはもとのクローゼットにあった引き出しである。</p> + +<figure> +<img src="20241009-5.jpg" alt="完成"> +<figcaption>完成</figcaption> +</figure> + +<p> +これを作るにあたり、大阪日本橋の刃物屋で鉋を買ってきた。これまではホームセンターで1000円ほどのものだったが、今回買ったのは8000円の物である。店主が台の仕込みと研ぎをした上で売ってくれた。きれいに切れるので小口面の直角を出すのが楽しくなった。小口を下にして自立するようになったときは結構気持ちいい。専門店での買い物は楽しい。餅は餅屋である。</p> + + diff --git a/man/journal/posts/20241202-1.jpg b/content/journal/posts/20241202-1.jpg Binary files differ. diff --git a/man/journal/posts/20241202-10.jpg b/content/journal/posts/20241202-10.jpg Binary files differ. diff --git a/man/journal/posts/20241202-11.jpg b/content/journal/posts/20241202-11.jpg Binary files differ. diff --git a/man/journal/posts/20241202-12.jpg b/content/journal/posts/20241202-12.jpg Binary files differ. diff --git a/man/journal/posts/20241202-13.jpg b/content/journal/posts/20241202-13.jpg Binary files differ. diff --git a/man/journal/posts/20241202-14.jpg b/content/journal/posts/20241202-14.jpg Binary files differ. diff --git a/man/journal/posts/20241202-15.jpg b/content/journal/posts/20241202-15.jpg Binary files differ. diff --git a/man/journal/posts/20241202-2.jpg b/content/journal/posts/20241202-2.jpg Binary files differ. diff --git a/man/journal/posts/20241202-3.jpg b/content/journal/posts/20241202-3.jpg Binary files differ. diff --git a/man/journal/posts/20241202-4.jpg b/content/journal/posts/20241202-4.jpg Binary files differ. diff --git a/man/journal/posts/20241202-5.jpg b/content/journal/posts/20241202-5.jpg Binary files differ. diff --git a/man/journal/posts/20241202-6.jpg b/content/journal/posts/20241202-6.jpg Binary files differ. diff --git a/man/journal/posts/20241202-7.jpg b/content/journal/posts/20241202-7.jpg Binary files differ. diff --git a/man/journal/posts/20241202-8.jpg b/content/journal/posts/20241202-8.jpg Binary files differ. diff --git a/man/journal/posts/20241202-9.jpg b/content/journal/posts/20241202-9.jpg Binary files differ. diff --git a/content/journal/posts/20241202.html b/content/journal/posts/20241202.html @@ -0,0 +1,57 @@ ++++ +date = '2024-12-02T00:00:00+09:00' +draft = false +title = '椅子作った' ++++ +<time>2024-12-02</time> + +<p> +チェロを弾くのに使っていた椅子ががたがたになってきたので、新しい椅子を作った。座面の張り方はYouTubeの動画[1]を参考にした。</p> +<p> +まず木枠を作る。足にホゾ穴を彫って梁を差し込む形にした。「そぎ先枘接ぎ」という名前らしい[2]。</p> +<img src="20241202-1.jpg" alt="木枠の画像"> + +<p> +足は猫足にした。ボンドで接着してバネを受ける板を付ける。本当は膠にしたかったけどめんどくさくなった。</p> +<img src="20241202-2.jpg" alt="ボンドで固定した木枠の画像"> + +<p> +バネを又釘で固定。 +</p> +<img src="20241202-3.jpg" alt="バネを木枠に釘で固定した画像"> +<img src="20241202-4.jpg" alt="固定した部分を拡大した画像"> + +<p> +ずれないように麻紐でくくり麻布を被せる。さらに麻布にバネを縫い付ける。</p> +<img src="20241202-5.jpg" alt="バネを麻紐でくくった画像"> +<img src="20241202-6.jpg" alt="バネを麻布で覆った画像"> +<img src="20241202-7.jpg" alt="麻布を固定した部分の拡大画像"> +<img src="20241202-8.jpg" alt="バネを麻布に縫い付けた画像"> + +<p> +藁で土手を作る。この藁はチェロの先生に貰ったものである。晒で覆ったうえ、糸で縫って固める。 +</p> +<img src="20241202-9.jpg" alt="藁の土手の画像"> +<img src="20241202-10.jpg" alt="藁の土手を糸で縫った画像"> +<img src="20241202-11.jpg" alt="縫った部分の拡大画像"> + +<p> +棕櫚を盛って布で覆い、綿を被せてモケットで仕上げる。本来は棕櫚ではなく芝であるが手に入らなかった。棕櫚の産地に住んでいるのでこちらなら山にいくらでも生えている。モケットは高野口町で買った。この町は鉄道のシートも作っているらしい。283系や287系、あるいはN700系等のものが欲しかったがJRに怒られるからと断わられた。そらそうや。</p> +<img src="20241202-12.jpg" alt="棕櫚を盛って布で覆った画像"> +<img src="20241202-13.jpg" alt="布の上から綿を被せた画像"> + +<p> +完成。 +</p> +<img src="20241202-14.jpg" alt="モケットを被せて完成した椅子の画像"> + +<p> +椅子が良くなっても練習しないと腕は上がらない。 +</p> + +<h2>参考</h2> +<ol> +<li><a href="https://www.youtube.com/watch?v=15SjxP-wcek">TOKYO 匠の技(椅子張り 熟練技能編)</a></li> +<li>鳥海義之助 「図解 木工の継手と仕口 増補版」 p.37</li> +</ol> + diff --git a/content/journal/posts/20241211.html b/content/journal/posts/20241211.html @@ -0,0 +1,13 @@ ++++ +date = '2024-12-11T00:00:00+09:00' +draft = false +title = 'きのかわ弦楽合奏団 第5回コミュニティコンサート' ++++ +<time>2024-12-11</time> +<p>来年の一月にコンサートあります。</p> +<figure> +<img src="20241211.jpg" alt="きのかわ弦楽合奏団の第5回コミュニティコンサートのちらし。令和7年1月12日14:00から、和歌山北コミュニティセンターにて"> +<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> +</figure> + + diff --git a/man/journal/posts/20241211.jpg b/content/journal/posts/20241211.jpg Binary files differ. diff --git a/man/journal/posts/20250216-1.jpg b/content/journal/posts/20250216-1.jpg Binary files differ. diff --git a/man/journal/posts/20250216-2.jpg b/content/journal/posts/20250216-2.jpg Binary files differ. diff --git a/content/journal/posts/20250216.html b/content/journal/posts/20250216.html @@ -0,0 +1,14 @@ ++++ +date = '2025-02-16T00:00:00+09:00' +draft = false +title = 'きのかわ弦楽合奏団 さくらコンサート' ++++ +<time>2025-02-16</time> +<p>三月にコンサートあります。</p> +<figure> +<img src="20250216-1.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの表面。令和7年3月23日14:00から、旧和歌山県議会議事堂にて"> +<img src="20250216-2.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの裏面。楽団と会場の紹介"> +<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> +</figure> + + diff --git a/content/journal/posts/20250221.html b/content/journal/posts/20250221.html @@ -0,0 +1,22 @@ ++++ +date = '2025-02-21T00:00:00+09:00' +draft = false +title = '着物作った' ++++ +<time>2025-02-21</time> +<p> +普段着回している着物がへたってきたので新しいのを仕立てた。楽天で見付けた真綿紬の草木染めである。中古で2640円だった。新品だとおそらく何十万のしろものである。女物だったので解いて洗濯し、男物に仕立て直した。防虫剤の臭いがひどかったが、洗濯すればおおむね取れた。</p> + +<p> +解いた布を重ねてネットに入れ、普通に洗濯する。脱水が済んだら濡れた状態でアイロンをかけてしわをとり陰干しする。絹ものだがこれで特に問題なく洗濯できた。</p> + +<p> +裏地も一緒に洗濯した。これも多分羽二重の高価なものである。ただ袷にするのは面倒なので一重にした。袖付けがなかなか上手くいかずに人形のところが皺になる。居敷当ては箪笥に眠っていた唐草模様の風呂敷を使った。</p> + +<figure> +<img src="20250221.jpg" alt="作った着物"> +</figure> + +<p> +真綿紬は初めてだが、軽くて暖かい。ほどかずに洗濯してよれよれにならなければいいのだが...</p> + diff --git a/man/journal/posts/20250221.jpg b/content/journal/posts/20250221.jpg Binary files differ. diff --git a/man/journal/posts/20250420-1.jpg b/content/journal/posts/20250420-1.jpg Binary files differ. diff --git a/man/journal/posts/20250420-10.jpg b/content/journal/posts/20250420-10.jpg Binary files differ. diff --git a/man/journal/posts/20250420-11.jpg b/content/journal/posts/20250420-11.jpg Binary files differ. diff --git a/man/journal/posts/20250420-12.jpg b/content/journal/posts/20250420-12.jpg Binary files differ. diff --git a/man/journal/posts/20250420-13.jpg b/content/journal/posts/20250420-13.jpg Binary files differ. diff --git a/man/journal/posts/20250420-2.jpg b/content/journal/posts/20250420-2.jpg Binary files differ. diff --git a/man/journal/posts/20250420-3.jpg b/content/journal/posts/20250420-3.jpg Binary files differ. diff --git a/man/journal/posts/20250420-4.jpg b/content/journal/posts/20250420-4.jpg Binary files differ. diff --git a/man/journal/posts/20250420-5.jpg b/content/journal/posts/20250420-5.jpg Binary files differ. diff --git a/man/journal/posts/20250420-6.jpg b/content/journal/posts/20250420-6.jpg Binary files differ. diff --git a/man/journal/posts/20250420-7.jpg b/content/journal/posts/20250420-7.jpg Binary files differ. diff --git a/man/journal/posts/20250420-8.jpg b/content/journal/posts/20250420-8.jpg Binary files differ. diff --git a/man/journal/posts/20250420-9.jpg b/content/journal/posts/20250420-9.jpg Binary files differ. diff --git a/content/journal/posts/20250420.html b/content/journal/posts/20250420.html @@ -0,0 +1,95 @@ ++++ +date = '2025-04-20T00:00:00+09:00' +draft = false +title = '大阪万博行った' ++++ +<time>2025-04-20</time> + +<p>4月15日火曜日に大阪万博に行ってきた。 +</p> + +<p>朝の紀州路快速は高校生ばかりだった。大阪に近付くにつれてビジネスマンが多くなっていった。西九条から地下鉄に乗りかえるとEXPO staffの札を首から下げた外国人がたくさんいた。外国人ばかりなのになぜかみんなスマホを見たり、目が合ってもなんとなく外を向いたりと、雰囲気だけが日本なのが面白い。</p> + +<p> +会場には予約より少し早く着いた。荷物検査があるので結構時間がかかり、入れたのは予約より30分ほど過ぎたころだった。</p> +<figure> +<img src="20250420-1.jpg" alt="東ゲート"> +<figcaption>東ゲート</figcaption> +</figure> +<figure> +<img src="20250420-2.jpg" alt="リング"> +<figcaption>リング</figcaption> +</figure> + +<p>会場内はところどころ植え込みがあって雑草も生えてきていた。タンポポは全部セイヨウだった。中央付近に静けさの森という場所があるが、そんなに森にはなっていない。どうせなら明治神宮みたいなのを作ればよかったかと思う。IR会場になった後も公園にできるし。 +</p> +<figure> +<img src="20250420-3.jpg" alt="セイヨウタンポポ"> +<figcaption>セイヨウタンポポ</figcaption> +</figure> +<figure> +<img src="20250420-4.jpg" alt="ノゲシ"> +<figcaption>ノゲシ</figcaption> +</figure> +<figure> +<img src="20250420-5.jpg" alt="バラ科のなにか"> +<figcaption>バラ科のなにか</figcaption> +</figure> +<figure> +<img src="20250420-6.jpg" alt="ノボロギク"> +<figcaption>ノボロギク</figcaption> +</figure> +<figure> +<img src="20250420-7.jpg" alt="ノアザミ"> +<figcaption>ノアザミ</figcaption> +</figure> +<figure> +<img src="20250420-8.jpg" alt="タネツケバナ"> +<figcaption>タネツケバナ</figcaption> +</figure> +<figure> +<img src="20250420-9.jpg" alt="ヨモギ"> +<figcaption>ヨモギ</figcaption> +</figure> + +<p>11時に英国パビリオンを予約していたのだが着いてみるとシステムエラーで閉鎖されていた。レストランは開いていたので混む前になにか食べることにした。英国人と会話できると思っていたが案内してくれたのは片言の英語を喋るアジア人のおばちゃんだった。2個で9ポンドのアイスクリームは売ってなかった。フィッシュアンドチップスと紅茶を頼んだ。出された紅茶にはミルクが付いていなかった?!フィッシュアンドチップスの方は思っていたよりは美味しかった。味のしない鱈だったが鮮度は良く、衣もさくさくだった。油もそこまで古くなっていない。チップスの方はモスバーガーよりイモの味が薄かった。タルタルソースと緑のペーストが付いていた。緑のものは多分エンドウ豆を潰したものにミントで香りを付けていた。悪くはなかったが組合せが初めてだったせいか、ミントが目立ちすぎていたように思う。</p> +<figure> +<img src="20250420-10.jpg" alt="フィッシュアンドチップス"> +<figcaption>フィッシュアンドチップス</figcaption> +</figure> + +<p>英国パビリオンが復旧するまで他を周ることにした。オーストリアに行ってみたが列が一杯だから時間をおいて来るように言われた。</p> + +<p>大根が咲いていた。 +</p> +<figure> +<img src="20250420-11.jpg" alt="ハマダイコン"> +<figcaption>ハマダイコン</figcaption> +</figure> + +<p>二つほど空いてる所を見たがあんまり面白くなかった。</p> + +<p>英国に戻ってみると復旧していたので入ることにした。前に英国人の親子が並んでいた。母親が高校生くらいの息子にハグして日本語で「トテモカワイイデス」と言っていた。突然日本語が聞こえてくるとどうしても見てしまう。目が合った。その後もなぜかちらほら日本語が聞こえてきては目が合った。しばらくして父親の方が息子の鞄からチョコ棒を出して母親と息子に配った。自分の分を取ったあとなぜかさらにもう一本取り出してこっちに差し出してきた。話し掛けたいなあと思っていた所だったので受け取ってお礼を言って何を話そうかと考えていたのだが、パビリオンの扉が開いて3人は吸い込まれていった。パビリオンは20人程度のグループで周るようになっていたのだが、丁度僕の前で区切られてしまったのだ。</p> +<figure> +<img src="20250420-12.jpg" alt="英国人がくれたチョコ棒"> +<figcaption>英国人がくれたチョコ棒</figcaption> +</figure> + +<p>展示は特に面白くなかった。特定の医薬品会社がお金を出していそうなことは分った。 +</p> + +<p>パビリオンの中にバーがあった。ビールでも飲みたかったが外が寒すぎて冷えていたのであきらめた。 +</p> + +<p>その後は特に予定もなかったので散歩していたらルーマニアパビリオンを見つけた。チェロの先生がルーマニアで修行してきた人なので行ってみたかったのだが、予約のフォームで見つからなかったので来ていないものだと思っていた。予約できないだけみたいだ。</p> + +<p>30分ほど並んだ。入口に居たお姉さんがめっちゃ綺麗だった。展示は生演奏と伝統工芸の展示、実演だった。演奏は僕が行ったときはバイオリンだけだったが、椅子と譜面台が4つとピアノもあったので時間によって編成が変わるようだった。伝統工芸の展示のひとつに、ガラスに描かれた宗教画があった。ビザンツからの伝統だと言っていたと思う。絵の具が置いてあったので描かせてもらった。マリアがキリストを抱いている画を模写した。描きながらルーマニアのことを色々教えてもらえたのがとても良かった。女の人が全員綺麗だった。さすが東欧である。レストランもあったが残念ながら閉まっていて食べられなかった。</p> + +<p>最後に知りあったルーマニア人とその辺をぶらぶらして帰ってきた。</p> +<figure> +<img src="20250420-13.jpg" alt="知り合ったルーマニア人"> +<figcaption>知り合ったルーマニア人</figcaption> +</figure> + +<p>パビリオンの展示は総じていまいちである。今回行った海外のパビリオンには特に未来っぽいものはなにもなかった。これはある意味期待通りだった。一方でルーマニアでは現地の文化も見れたし現地人との交流もできたのでよかった。他のパビリオンでもこういう交流があればいいのにと思う。国内企業のパビリオンに行けていないので次回はその辺を見たい。</p> + diff --git a/man/journal/posts/20250519-1.jpg b/content/journal/posts/20250519-1.jpg Binary files differ. diff --git a/man/journal/posts/20250519-2.jpg b/content/journal/posts/20250519-2.jpg Binary files differ. diff --git a/man/journal/posts/20250519-3.jpg b/content/journal/posts/20250519-3.jpg Binary files differ. diff --git a/content/journal/posts/20250519.html b/content/journal/posts/20250519.html @@ -0,0 +1,91 @@ ++++ +date = '2025-05-19T00:00:00+09:00' +draft = false +title = '万博で知り合ったルーマニア人とハイキングに行った' ++++ +<time>2025-05-19</time> + +<p> +先日万博のルーマニアパビリオンで知り合ったルーマニア人の<a href="https://noian.art">Noian</a>がハイキングに行きたいというので、地元の山に連れていった。元々4月の終わりごろを予定していたが、僕が風邪をひいてしまいのびていた。向こうも万博の仕事が忙しいようで、帰国の前日になってやっと予定が合った。</p> + +<p> +10時過ぎにうちの最寄り駅に着く予定だったが、電車に乗り間違えたらしく一時間程遅れた。なにせ阪和線である。外国人にはかなりややこしい。そのうえ駅員はフランス人のごとく英語を話さない。間違って関空に行かないようにしつこく注意喚起して、なんとか和歌山に辿りついた。</p> + +<p> +車で自宅まで連れて来て、そこから徒歩で山に向かった。自然が好きそうだったので、ろくに整備されていないひとけのない山に案内した。</p> + +<p> +この山に登るのは久しぶりなので道を覚えているか不安だった。おそらく昔の人が隣の町まで行くのに使っていた道だと思う。今でも一応隣町まで抜けられる。入口は果樹園になっていて今も柑橘の木がたくさん植わっている。川沿いを森に入ると左右には棚田が並んでいる。こちらの田んぼは既に放棄され、今は藪や針葉樹林になっている。針葉樹の方は戦後の拡大造林で植えられたものだろうか、毎年ティッシュペーパーの需要を底上げしている木々である。棚田は石垣で造成されている。いつのものかは知らないが今も崩れずに残っている。</p> + +<p> +棚田の横をさらに進むと小さい滝がある。牝牛の滝というらしい。牝牛と書いてコッテと読む。滝の近くに牝牛に見える岩があるのが由来らしい。コッテという言葉は聞き馴染みがない。後日祖父の友人に聞いた話だと、小さい牛やメスの牛のことをコッテウシと言ったそうだ。</p> + +<figure> +<img src="20250519-1.jpg" alt="牝牛の滝"> +<figcaption><ruby>牝牛<rp>(</rp><rt>コッテ</rt><rp>)</rp></ruby>の滝</figcaption> +</figure> + +<p> +滝を過ぎると急勾配の斜面が続く。ほとんど道とはいえないような山肌を登る。40度はありそうな勾配である。息があがりながらも、彼は日本に来たがっている友人のことを聞かせてくれた。日本のとあるバンドの大ファンなのだそうだ。ポップカルチャーにはうといので自国のことなのになにも分からなかった。最後に大きな岩が作った崖を山羊のように登ればやっと平坦な道に出る。彼のブーツがよく滑っていた。裸足が一番安全だと勧めたが遠慮しとくと言われた。そこから先は特にきつい場所もなく、そのまま展望台に続く。彼は少し疲れたようで言葉が少なくなっていた。</p> + +<figure> +<img src="20250519-2.jpg" alt="展望台から"> +<figcaption>展望台から</figcaption> +</figure> + +<p> +展望台からは僕の町が一望できる。西が海で南北が山、東はゆるがかな坂が高野山まで続いている。彼の出身地も山がちで似た地形だそうだ。海はないが毎年父親が黒海まで連れていってくれていたので馴染深いといっていた。展望台には小さな祠がある。せっかくなので鳥居のくぐり方や参拝の仕方を教えてあげた。熱心に聞いてはくれたが自分はやらないと言っていた。理由は聞かなかったがおそらく彼がキリスト教徒だからであろう。こういうはっきりした態度は見ていてなんとなく気持がいい。</p> + +<p> +ところで日本では神道でも仏教でも左進右退が基本だと思う。以前五瀬命が祀られている竃山神社のお祭に行ったことがある。そこでは巫女さんが神殿に向う階段を登る際左足を一段上げて右足を引き寄せてを繰り返して登り、下るときは逆にしていた。お寺でも道場に入るときは左から、出るときは右からと習った。そういえば合気道でも座礼をするとき左手、右手の順で床に付けて頭を下げ、頭を上げるときは右手から戻すと習った気がする(この記憶はあいまい)。ところがヨーロッパでは逆らしい。左は邪悪だから右から入るのだそうだ。</p> + +<p> +下りは別の道を選んだ。途中からコンクリートで舗装されている楽な道である。途中で山菜がいろいろ生えていたので紹介してあげたらぱくぱく食べていた。よく信用できるものである。イタドリ、ユキノシタ、フキ、チャノキ、タラノキ...。タケノコはもう竹だった。クスノキもあったのでいい香りがすると言って渡したらこれもかじっていた。クスノキが食べられるかどうか僕は知らない。防虫剤に使われていたと伝えるとすぐに吐きだして水で口をすすいでた。</p> + +<p> +展望台でフルートを吹く動画を撮りたかったのに忘れていたといっていたが、途中で見つけた竹林を気に入ったようで、そこで吹いていた。このフルートはチューニングが現代の一般的なものとは違い、ミの音が少し低くなっている。長調とも短調ともいえない微妙な音階だった。</p> + +<figure> +<img src="20250519-3.jpg" alt="フルートを吹くNoian"> +<figcaption>フルートを吹くNoian</figcaption> +</figure> + +<p> +ルーマニアに竹は自生していない。ところが和食屋等には植わっているという。ルーマニアの植生だいじょうぶかなぁ。</p> + +<p> +山から家に帰ってきたらもう15時になろうとしていた。昼ごはんは食べてない。車で和歌山市の寿司屋に向った。弥一という回転寿司である。回転寿司だが安いわけではなく、味はかなり美味しい。</p> + +<p> +中途半端な時間に行ったからか、寿司はひとつも回っておらず、タブレットから注文するように言われた。おなかがすいたから寿司以外のものも食べるといって、彼は最初にうどんを注文した。僕も自分の食べたいものを適当に注文していた。しばらくして納豆うずらが届いた。僕は頼んでいない。彼は納豆が好きだそうだ。ルーマニアにも臭いの強い発酵食品があるのかと思い、チーズの話をしてみた。ルーマニアには臭いチーズはないと言う。ゴルゴンゾーラやカマンベールはないのかと聞くと、あんなのは臭いうちにはいらないそうだ。ちなみに国でよく食べられるのはカビの生えていないクリームチーズのようなものだそうだ。</p> + +<p> +ひととおり食べておなかがいっぱいになってきた。彼もおなかがいっぱいになってきたと言いだした。彼のうどんにはまだ手が付けられていない。テーブルにはまだ寿司が残っている。無理なら僕が食べようかと言うと彼はうどんの鉢をこっちによこした。ちょっとくるしかったがまあうどんなので食べれた。麺は腰があっておいしいが、出汁は少し甘みが強かった。出汁を飲みほした頃、彼も残った寿司をだいたい片付けて、やっぱり自分もうどんを食べるといって追加で注文した。</p> + +<p> +うどんの甘みをガリで消して店を出た。おごってくれた。</p> + +<p> +弥一を後にし、和歌山城に案内した。和歌山城にはなぜか小さな動物園が付いている。時間がなかったので適当に見て天守閣に登った。地元の人間なのに天守閣はこれが初めてである。閉館ぎりぎりに行って30分しか見れなかった。天守閣は米軍に丸焼きにされたあと鉄筋コンクリート造りで再建された物である。外観はそれっぽいが内部は昭和の団地のような近代的なものだった。書画や武器等が展示されていてそれなりに見応えがあり、30分では足りなかった。彼は中国語が話せるので漢字も結構読める。僕が流し見した巻物を熱心に読んでいた。</p> + +<p> +和歌山城を出た後は寺か神社が見たいというので日前宮に行った。既に閉まっていて入れなかった。こんな時間に閉まっては会社帰りに立ち寄れないのではと言われた。ルーマニアではサラリーマンが帰りに教会に行くのが普通なのだろうか。</p> + +<p> +カフェにでも行って話しをしようということになった。いい喫茶店は知らないので和歌山市駅のスタバに行くことにした。駅ビルには確か日本酒のお店もあったのでそこで黒牛か超久でも買わせようと思った。ところが着いてみると平和酒造の店だった。この酒蔵はあまり好きではないので入らずに直接スタバに行った。スタバではどういう流れだったか、国境の話になった。昔は国という概念も国民という枠組みもなかったのに、いつしか作られて国境ができたという。ヨーロッパの世界はかつて神が治めていたが、あるときから貴族がその役割を担い、貴族が没落してからは民衆をまとめるために民族や国家というストーリーが必要になったという。そういえばゲルマン民族というのもナチスがドイツをまとめるために作った概念だとどこかで読んだ気がするが本当なのだろうか。日本は海に囲まれているのでヨーロッパと少し状況が違うんじゃないかという話を出してみた。言語も民族も一つで天然の国境があるのはヨーロッパ人から見るとちょっと変なのかな。そのくせ昔から文化的には国際色豊かだと言われた。</p> + +<p> +辺りがすっかり暗くなったころスタバを出て少しそのへんを散歩した。駅の周辺は全然土地勘がなかったが紀の川があるのは知っていたのでそっちに向かって適当に歩いた。日本語の練習をしたいので日本語で話して欲しいと言われた。僕の言葉は結構理解できていたようだし、向うも割と話せていた。多少ゆっくり話すようにはしたがそれでもたいしたものである。ところで外国人相手に母語を話すと普段どれだけ自分がいい加減に話しているかがよく分かる。発音や文法を間違えないように意識するととたんに言葉に詰まるのだ。</p> + +<p> +人生で英語をしっかり話したのはこれが初めてである。彼と話していて思ったが、話したいことがあれば文章を組みたてる前に話しはじめたほうがいい。相手の話を理解したうえでなにか言いたげなことは伝わるし、そのあとは身振り手振りでも案外なんとかなる。外国人と話すのに外国語に関する知識はある程度必要だが、相手の話したいことに興味を持つのも重要である。</p> + +<p> +河原では日本の山に危険な動物はいるのかという話になった。熊や毒蛇、スズメバチなんかが怖いと言った。このあたりで熊を見たことはないけど。それから彼がどうやって英語を流暢に話せるようになったのかも教えてくれた。英語でゲームをしていたら英語が第二の母語のようになったそうだ。ルーマニア語はマイナーな言語なのでゲームは翻訳されないらしい。僕も流暢ではないにしても何とか意思疎通できるようになったのは、英語でコンピューターの勉強をしたからだと思う。英語を勉強するより、英語を使ってなにかをすると、すぐ覚えるし忘れにくい。最後に二宮金次郎の像に集まった猫を眺めて駅に戻った。</p> + +<p> +彼は明日の22時台の飛行機でイスタンブールを経由して国に帰る。イスタンブールまで12時間、乗り換えに3時間、そこからルーマニアまで1時間半、国に着いてからさらに12時間バスに乗る。なかなか遠いところである。国内線もあると言っていたが、日本でお金を使いすぎたから節約したいらしい。</p> + +<p> +彼は20:30発の特急サザンに乗って大阪のホテルに帰っていった。</p> + diff --git a/content/journal/posts/20251122.html b/content/journal/posts/20251122.html @@ -0,0 +1,20 @@ ++++ +date = '2025-11-22T00:00:00+09:00' +draft = false +title = 'ひざしぶりに合気道した' ++++ +<time>2025-11-22</time> + +<p> +大学の合気道部のひとつ下の後輩に誘われて学園祭の演武会に参加してきた。</p> +<figure> + <video controls style="max-width: 100%;"> + <source src="20251122.mp4" type="video/mp4"> + </video> + <figcaption>京都大学合気道部 NF演武会にて(右が僕)</figcaption> +</figure> + +<p> +もうちょっとやりたくなったので高校生のときお世話になっていた地元の道場に電話して稽古させてもらうことにした。続くかな。 +</p> + diff --git a/man/journal/posts/20251122.mp4 b/content/journal/posts/20251122.mp4 Binary files differ. diff --git a/man/journal/posts/7th_concert.jpeg b/content/journal/posts/7th_concert.jpeg Binary files differ. diff --git a/content/kitchen/_index.html b/content/kitchen/_index.html @@ -0,0 +1,18 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '台所' ++++ + +<h2>記事</h2> +<ul> + <li><a href="r4_osechi.html">令和4年正月のおせち</a></li> +</ul> + +<h2>レシピ</h2> +<ul> + <li><a href="recipe/mapo_tofu.html">麻婆豆腐</a></li> + <li><a href="recipe/miso.html">味噌</a></li> + <li><a href="recipe/tonkotsu_ramen.html">豚骨ラーメン</a></li> +</ul> + diff --git a/man/kitchen/pics/mapo_tofu.jpg b/content/kitchen/pics/mapo_tofu.jpg Binary files differ. diff --git a/man/kitchen/pics/r4_osechi.jpg b/content/kitchen/pics/r4_osechi.jpg Binary files differ. diff --git a/man/kitchen/pics/tonkotsu_ramen.jpg b/content/kitchen/pics/tonkotsu_ramen.jpg Binary files differ. diff --git a/content/kitchen/r4_osechi.html b/content/kitchen/r4_osechi.html @@ -0,0 +1,126 @@ ++++ +date = '2022-02-04T00:00:00+09:00' +draft = false +title = '令和4年正月のおせち料理' ++++ +<time>2022-02-04</time> +<p>令和3年の春ごろからだったか、実家の台所に立つようになった。おせちは毎年買っていたがせっかくなので今回は自分で作ることにした。といってもうちには代々受け継がれてきたおせちはないので本やらインターネットやらで調べながらのものである。近代化によって失われたものは大きい。</p> + +<p>今回おせちに入れたものは以下の通り:</p> +<ul> + <li>慈姑</li> + <li>百合根</li> + <li>鶏そぼろ松風</li> + <li>生麩の田楽</li> + <li>炊き合わせ</li> + <li>栗金団</li> + <li>数の子</li> + <li>田作り</li> + <li>伊達巻</li> + <li>酢蓮根</li> + <li>たたき牛蒡</li> + <li>みつわ漬け</li> + <li>金柑の蜜煮</li> + <li>鱈の西京焼</li> + <li>蒲鉾</li> + <li>牛蒡巻き</li> + <li>干し柿チーズ</li> + <li>黒豆。</li> +</ul> +<figure> + <img src="pics/r4_osechi.jpg" alt="令和4年正月のおせちの画像"> + <figcaption>令和4年正月のおせち</figcaption> +</figure> + +<h2>作り方</h2> +<div class="recipe"> +<h3>慈姑</h3> +<p>おしりを切って皮を剥き出汁で煮る</p> +</div> + +<div class="recipe"> +<h3>百合根</h3> +<p>一枚づつ剥いて出汁で煮る</p> +</div> + +<div class="recipe"> +<h3>鶏そぼろ松風</h3> +<p>鶏1Kg、魚2Kg、出汁3合、醤油70cc、味醂50cc</p> +<p>鶏のミンチを醤油と味醂で炒める。白身魚のすり身を昆布出汁、醤油、味醂で味付けし、炒めた鶏そぼろを加え型に流して蒸す。切り出して天火で乾かすように焼き、煮切り味醂を塗ってケシの実をまぶす。</p> +<p>出典: [平井、結野、日本料理店のお弁当]</p> +</div> + +<div class="recipe"> +<h3>生麩の田楽</h3> +<p>強力粉300g、水150gを捏ねる(水はもう少し多い方がいいかも)。一時間寝かせる。水で揉み洗いして澱粉を流す。白玉粉、水を混ぜて捏ねる。形成して一時間寝かせる。茹でる。浮いてからさらに5分程茹でる。切って味噌を塗り、焼く。</p> +<p>白玉粉と水の分量をメモしていなかった。インターネットで調べたレシピだったはず</p> +</div> + +<div class="recipe"> +<h3>炊き合わせ</h3> +<p>人参、干し椎茸、高野豆腐、竹の子水煮</p> +<p>干し椎茸を戻す。戻した汁で煮て酒、醤油で味付け。高野豆腐を戻す。人参を花型に、竹の子を一口大に切る。それぞれ出汁で煮て醤油、酒で味付け。</p> +</div> + +<div class="recipe"> +<h3>栗金団</h3> +<p>薩摩芋を一口大に切り、砕いたくちなし1個と水少しを入れた鍋で蒸す。裏漉しし、味醂、砂糖、栗のシロップで味付けし、栗を混ぜる。</p> +</div> + +<div class="recipe"> +<h3>数の子</h3> +<p>水で一晩塩を抜いて皮を剥く。</p> +</div> + +<div class="recipe"> +<h3>田作り</h3> +<p>ごまめを乾煎りする。手でボキっと折れるようになるまで。味醂を煮切って醤油を加え、ごまめにからめる。煎り胡麻をまぶす。</p> +</div> + +<div class="recipe"> +<h3>伊達巻</h3> +<p>魚又は海老のすり身と卵黄を混ぜる。卵白に砂糖を入れて泡立てる。以上を混ぜて味醂で味を付ける。卵焼き器を温め油を敷き、卵液を流して蓋をする。裏返して焼き目を付ける。巻き簾で巻く。</p> +</div> + +<div class="recipe"> +<h3>酢蓮根</h3> +<p>蓮根を輪切りにして酢水でゆがく。酢に鷹の爪を入れ、蓮根を浸す。</p> +</div> + +<div class="recipe"> +<h3>たたき牛蒡</h3> +<p>牛蒡を叩いて3cmに切り、縦に4つに割る。ゆがいて酢、醤油、胡麻を混ぜたものに浸す。</p> +</div> + +<div class="recipe"> +<h3>みつわ漬け</h3> +<p>蕪、人参、柚子、昆布を切る。野菜は塩揉みして絞る。酢に漬ける。</p> +</div> + +<div class="recipe"> +<h3>金柑の蜜煮</h3> +<p>金柑に縦に切り込みを入れ、さっと煮る。砂糖を加え煮つめる。</p> +</div> + +<div class="recipe"> +<h3>鱈の西京焼</h3> +<p>西京味噌と味醂を混ぜ、白身魚を漬ける。味噌を拭って焼く。</p> +</div> + +<div class="recipe"> +<h3>干し柿チーズ</h3> +<p>干し柿を縦に切り、クリームチーズ、胡桃を包むように巻く。柿を干しすぎていたため固くて食べにくかった。</p> +</div> + +<div class="recipe"> +<h3>黒豆</h3> +<p>豆を鉄と共に一晩水に浸ける。6時間程煮る。砂糖で味付けしさらに10分煮る。冷して味を染み込ませる。</p> +</div> + +<p>蒲鉾、牛蒡巻は既製品</p> + +<h3>おわりに</h3> +<p>伊達巻は妹が、みつわ漬けは母が作ってくれた。蒲鉾と牛蒡巻きは買ってきた。それ以外は自分で作った。この他、蒟蒻を買っていたが存在を忘れていたのと、棒鱈を水で戻していたが腐ってしまったことが心残りである。買ってきた蒲鉾と牛蒡巻き、それから作れなかった蒟蒻の煮物と棒鱈を作るのが今年の年末の課題である。蒲鉾や牛蒡巻きは保存料や着色料等の添加物が気になる所だ。</p> +<p>今時は百貨店やらでおせちを予約して年末はだらだら過ごし、年始もそのおせちを食べながら家でテレビ漬けが普通なのだろうか。買って来たおせちには旬という概念が欠けており、さらに保存料で日持ちさせている。本来そのとき手に入る旬のものを使い、3ヵ日常温で保存できるように砂糖、酢、塩、発酵等の力を利用したものであったはずだ。今回作ったおせちも食材は基本スーパーで入手した。少しずつ自分の畑で取れたものを取り入れたいものである。</p> +<p>おせち料理は、家族や近所、あるいは寺であれば檀家との付き合いにより成り立っていたのではないだろうか。その付き合いに充てる時間と気力を労働に回し、その労働により得られたお金でできあいのおせちを購入するのは、家族や地域社会の分断であり、また文化の破壊でもある。購入するお金を稼ぐのを辞め、自分達で作ったほうが人付き合いも増え、地域に根差した文化の継承にもなり、より充実した生き方に繋るのではないだろうか。</p> + diff --git a/content/kitchen/recipe/mapo_tofu.html b/content/kitchen/recipe/mapo_tofu.html @@ -0,0 +1,48 @@ ++++ +date = '2024-10-10T00:00:00+09:00' +draft = false +title = '麻婆豆腐' ++++ +<time>2024-10-10</time>作成 +<figure> + <img src="../pics/mapo_tofu.jpg" alt="麻婆豆腐の画像"> + <figcaption>麻婆豆腐</figcaption> +</figure> +<div class="recipe-ingredient"> +<h2>材料(4~5人分)</h2> +<ul> + <li>豆腐: 2丁</li> + <li>ひき肉: 300g</li> + <li>長ネギ: 1本</li> + <li>にんにく: 適量</li> + <li>生姜: 適量</li> + <li>八角: 適量</li> + <li>花椒: 好きなだけ</li> + <li>豆板醤: 好きなだけ</li> + <li>味噌: 適量</li> + <li>酒: 適量</li> + <li>濃口醤油: 適量</li> + <li>塩: 少々</li> + <li>炒め油: 多め</li> +</ul> +</div> + +<div class="recipe-steps"> +<h2>手順</h2> +<ol> + <li>豆腐を水切りしてサイコロに切る</li> + <li>長ネギ、にんにく、生姜を刻む</li> + <li>フライパンに油をしき八角、にんにく、生姜を入れ弱火で香りを出す</li> + <li>火を強めてひき肉を入れ、塩を少しふる</li> + <li>ひき肉に色がついたらネギを入れて炒める</li> + <li>酒、濃口醤油、味噌、豆板醤で味をつける</li> + <li>水を入れてひと煮立ちさせる</li> + <li>花椒、豆腐を入れる</li> + <li>好みで、ラー油、唐辛子、山椒を好きなだけ入れる</li> +</ol> +</div> + +<h2>ひとこと</h2> +<p>我流の適当なレシピなので本場のものが良ければ陳建一さんのでも調べてほしい。</p> +<p>酒はできれば紹興酒のほうがいいと思う。味噌と一緒に豆鼓も入れていいかも。一般的にはもっと旨味を出すために中華だしやら味の素やらを入れると思うが、シンプルに辛いほうが好きなのでそういうものは入れない。陳さんは生姜を入れていなかったが僕はあっていいと思う。豆腐は塩水で茹でていたがこれは真似してもよさそう。</p> + diff --git a/content/kitchen/recipe/miso.html b/content/kitchen/recipe/miso.html @@ -0,0 +1,32 @@ ++++ +date = '2024-02-09T00:00:00+09:00' +draft = false +title = '味噌' ++++ +<time>2024-02-09</time> + +<h2>材料</h2> +<p>二升の甕4つ分弱</p> +<ul> +<li>大豆 3.6kg</li> +<li>米麹 5kg</li> +<li>塩 1.8kg</li> +<li>酒粕 500g</li> +</ul> + +<h2>手順</h2> +<ol> +<li>大豆を24時間水に浸す</li> +<li>麹と塩を混ぜる</li> +<li>大豆を3時間蒸す</li> +<li>大豆を潰す</li> +<li>大豆を麹と混ぜる(蒸したときの汁を混ぜて硬さを調整する)</li> +<li>甕に詰める</li> +<li>酒粕で蓋をしてさらにラップで落し蓋をして密閉する。</li> +<li>半年以上寝かす</li> +</ol> + +<h2>ひとこと</h2> +<p> +豆はジップロックに入れて拳に体重を乗せて押しつぶすと楽だった。ジップロックあんまり使いたくないけど。ラップで蓋をするのは好きではないので、試験的にひと瓷だけラップなしで放置することにした。酒粕も味噌っぽくなって食べられるが、風味は少し変わる。味噌汁が粕汁っぽくなる。</p> + diff --git a/content/kitchen/recipe/tonkotsu_ramen.html b/content/kitchen/recipe/tonkotsu_ramen.html @@ -0,0 +1,53 @@ ++++ +date = '2022-02-08T00:00:00+09:00' +draft = false +title = '豚骨ラーメン' ++++ +<time>2022-02-08</time>作成 +<figure> + <img src="../pics/tonkotsu_ramen.jpg" alt="豚骨ラーメンの画像"> + <figcaption>豚骨ラーメン</figcaption> +</figure> +<div class="recipe-ingredient"> +<h2>材料(4~5人分)</h2> +<ul> + <li>豚骨: 1本</li> + <li>鶏ガラ: 1個</li> + <li>玉葱: 1個</li> + <li>野菜くず(人参のへた、葱の頭、キャベツの芯等): 適量</li> + <li>大蒜: 1房</li> + <li>生姜: 1かけ</li> + <li>昆布: 適量</li> + <li>干し椎茸: 適量</li> + <li>豚肩ロースブロック: 500g</li> + <li>長葱: 適量</li> + <li>細葱: 適量</li> + <li>もやし: 適量</li> + <li>卵: 人数分</li> + <li>支那竹: 適量</li> +</ul> +</div> + +<div class="recipe-steps"> +<h2>手順</h2> +<ol> + <li>昆布、干し椎茸は水にかして30分以上置く。</li> + <li>豚骨を半分に割り、鶏ガラ、水と共に鍋に入れ2回ほど茹でこぼして臭みを取る。</li> + <li>豚骨、鶏ガラ、玉葱、野菜くず、大蒜、生姜、昆布、水を鍋に入れ火にかける。沸騰したら弱火にする(ただしコッテリさせる場合は強火のまま)。適宜アクを取る。水が減ってきたら足す。</li> + <li>豚肩ロースに凧糸を巻き、強火で表面を焼く。3に入れて一緒に煮込む。2時間程で野菜と肩ロースを取り出す。</li> + <li>1を水ごと弱火にかける。</li> + <li>沸騰したら昆布と干し椎茸を取り出し、味醂、酒、塩、醤油で味を付ける。この時塩分濃度が醤油と同じくらいになるようにする。</li> + <li>肩ロースを6に漬けて冷ます。冷めたら密閉できる袋に入れて空気を抜き、冷蔵庫で一晩味を染み込ませる。味玉を作る場合、茹で卵も一緒に入れて一晩置く。</li> + <li>4は6時間煮込んだらザルで漉して粗熱を取り、冷蔵庫で保存する。鶏ガラについていた肉はからし醤油で食べると美味しい。</li> + <li>7を火にかける(表面に脂が浮いて固まっているのであっさりしたスープがいい場合は加熱前に取り除く。脂はラードとして焼き飯等に使うと美味しい)。</li> + <li>具材を準備する。卵を茹でて半分に切る。長葱を白髪葱にする。細葱を刻む。肩ロースを薄く切る。もやしをゆがく。</li> + <li>麺を茹でる。</li> + <li>丼を温め7を適量入れ、9で割る。濃さは好みで調整する。</li> + <li>麺と具材を載せる。</li> +</ol> +</div> + +<h2>ひとこと</h2> +<p>焼豚は煮込み過ぎると柔らかくなりすぎてくずれる。</p> +<p>今回は麺と支那竹は市販品だった。製麺機ほしい</p> + diff --git a/man/pics/favicon.ico b/content/pics/favicon.ico Binary files differ. diff --git a/man/pics/icon.jpeg b/content/pics/icon.jpeg Binary files differ. diff --git a/man/pics/xcoin.png b/content/pics/xcoin.png Binary files differ. diff --git a/man/pics/xcoin_logo.png b/content/pics/xcoin_logo.png Binary files differ. diff --git a/content/plant/_index.html b/content/plant/_index.html @@ -0,0 +1,23 @@ ++++ +date = '2026-02-27T00:00:00+09:00' +draft = false +title = '庭の植物' ++++ + +素人同定 + +<ul class="galind"> +<li> +タネツケバナ <i>Cardamine occulta</i> +<img src="pics/cardamine_occulta.png" alt="タネツケバナの画像"> +</li> +<li> +ホトケノザ <i>Lamium amplexicaule</i> +<img src="pics/lamium_amplexicaule.png" alt="ホトケノザの画像"> +</li> +<li> +キュウリグサ <i>Trigonotis peduncularis</i> +<img src="pics/trigonotis_peduncularis.png" alt="キュウリグサの画像"> +</li> +</ul> + diff --git a/man/plant/pics/cardamine_occulta.png b/content/plant/pics/cardamine_occulta.png Binary files differ. diff --git a/man/plant/pics/lamium_amplexicaule.png b/content/plant/pics/lamium_amplexicaule.png Binary files differ. diff --git a/man/plant/pics/trigonotis_peduncularis.png b/content/plant/pics/trigonotis_peduncularis.png Binary files differ. diff --git a/content/poetry/_index.html b/content/poetry/_index.html @@ -0,0 +1,19 @@ ++++ +date = '2025-04-07T00:00:00+09:00' +draft = false +title = '詩' ++++ +<ul> + <li>猫を抱く、大島に穴。[<time>2025-04-07</time>]</li> + <li>「醤油を醸すのもA. Oryzaeやっけ?」「そーやと思うで。」[<time>2025-03-15</time>]</li> + <li>乃木坂46、有坂38[<time>2024-12-09</time>]</li> + <li>えびの殻は捨てずにキチンと出汁を引こう。[<time>2023-06-21</time>]</li> + <li>風が吹いた。どっちから?こっち。[<time>2023-02-28</time>]</li> + <li>日本語警察「誤用だー!」[<time>2023-02-28</time>]</li> + <li>分け入っても 分け入っても ピンクのテープ [<time>2022-10-09</time>]</li> + <li>干しぬれど カビの生えたる つるし柿 [<time>2022-10-07</time>]</li> + <li>そうだ、出汁を引こう。 [<time>2022-01-07</time>]</li> + <li>鼻めっちゃでる。びえん。 [<time>2021-11-04</time>]</li> + <li>縄作りなう [<time>2021-05-25</time>]</li> +</ul> + diff --git a/content/style.css b/content/style.css @@ -0,0 +1,133 @@ +:root { + --dbg: #000000; + --dbg2: #000000; + --dfg: #ffffff; + --dfg2: #80ff80; + --lbg: #ffffff; + --lbg2: #ffffff; + --lfg: #000000; + --lfg2: #009900; +} + +a { + text-decoration: none; +} + +i { + font-style: italic; +} + +figure { + padding: 1em; + overflow-x: auto; +} + +figcaption { + font-style: italic; +} + +table { + border-collapse: collapse; +} + +table th, +table td { + border: 1px solid; +} + +img { + max-width: 100%; +} + +code { +} + +pre { + padding: 1em; + border-style: solid; + border-radius: 5px; + border-width: 1px; + overflow-x: auto; +} + +body { + font-family: serif; + max-width: 1300px; + margin: 0px auto; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +header { + padding: 5px; + border-bottom: 1px solid; +} + +header a { + word-break: keep-all; +} + +main { + padding: 5px; + flex-grow: 1; +} + +footer { + padding: 5px; + border-top: 1px solid; +} + +footer *{ + display: inline; +} + +@media (prefers-color-scheme: dark) { + html { + background-color: var(--dbg); + color: var(--dfg); + } + a { + color: var(--dfg2); + } + pre { + background-color: var(--dbg2); + border-color: var(--dfg); + } +} + +@media (prefers-color-scheme: light) { + html { + background-color: var(--lbg); + color: var(--lfg); + } + a { + color: var(--lfg2); + } + pre { + background-color: var(--lbg2); + border-color: var(--lfg); + } +} + +.portrait { + margin: 10px; +} + +.farm-journal-item { + margin: 30px auto; +} + +.farm-journal-date time{ + font-size: x-small; +} + +.galind { + display: flex; + flex-wrap: wrap; + list-style: none; +} + +.galind li { + max-width: 300px; +} diff --git a/data/conf b/data/conf @@ -1,11 +0,0 @@ -man=$(pwd)/man -pub=$(pwd)/pub -temp=$(pwd)/temp -data=$(pwd)/data -weblog=$data/weblog -header="$temp/header.html" -footer="$temp/footer.html" -title="松露庵" -rss_description="ウェブページの更新履歴" -rss="$pub/rss.xml" -url="https://www.mtkn.jp" diff --git a/data/weblog b/data/weblog @@ -1,151 +0,0 @@ -1628175600 /journal/posts/20210806.html -1637074800 /farm/journal/2021.html -1638111600 /journal/posts/20211129.html -1639407600 /journal/posts/20211214.html -1642086000 /computer/rtx1200-qos.html -1643900400 /kitchen/r4_osechi.html -1644246000 /kitchen/recipe/tonkotsu_ramen.html -1644505200 /farm/journal/2022.html -1652367600 /journal/posts/20220513.html -1656255600 /computer/setting_up_web_server.html -1658242800 /journal/posts/20200808.html -1660316400 /journal/posts/20200719.html -1660316400 /journal/posts/20200723.html -1660316400 /journal/posts/20200725.html -1660316400 /journal/posts/20200727.html -1660316400 /journal/posts/20200801.html -1660316400 /journal/posts/20200802.html -1660316400 /journal/posts/20200804.html -1660316400 /journal/posts/20200917.html -1660316400 /journal/posts/20200918.html -1660316400 /journal/posts/20200919.html -1660316400 /journal/posts/20200925.html -1660316400 /journal/posts/20200926.html -1660316400 /journal/posts/20201003.html -1660316400 /journal/posts/20201201.html -1660316400 /journal/posts/20201202.html -1660316400 /journal/posts/20201209.html -1660316400 /journal/posts/20201210.html -1660316400 /journal/posts/20220729.html -1660316400 /journal/posts/20220813.html -1660575600 /journal/posts/20220814.html -1666450800 /journal/posts/20221023.html -1667142000 /journal/posts/20221031.html -1669129200 /books/978-4-06-288451-8.html -1672153200 /journal/posts/20221228.html -1674054000 /farm/index.html -1674054000 /journal/posts/20230119.html -1684076400 /computer/archlinux_installation.html -1684076400 /computer/xlib_playground1.html -1684076400 /computer/xlib_playground2.html -1684076400 /computer/xlib_playground3.html -1684076400 /computer/xlib_playground4.html -1684076400 /computer/xlib_playground5.html -1684076400 /computer/xlib_playground6.html -1684076400 /journal/posts/20210106.html -1684076400 /journal/posts/20220730.html -1690210800 /journal/posts/20230725.html -1690297200 /journal/posts/20230726.html -1690556400 /journal/posts/20230729.html -1690902000 /journal/posts/20230802.html -1690988400 /journal/posts/20230803.html -1691593200 /journal/posts/20230810.html -1697727600 /gallery/20231007.html -1698073200 /gallery/20231005.html -1698073200 /gallery/20231018.html -1701529200 /gallery/20231202.html -1704034800 /gallery/20240101.html -1705935600 /about.html -1707404400 /kitchen/recipe/miso.html -1707922800 /computer/git_server.html -1708700400 /computer/mailserver.html -1708786800 /computer/rp2040_1.html -1708959600 /computer/rp2040_2.html -1714230000 /journal/posts/20240428.html -1722265200 /gallery/20240628.html -1722265200 /gallery/20240629.html -1722265200 /gallery/20240702.html -1722265200 /gallery/20240727.html -1722351600 /books/index.html -1728399600 /journal/posts/20241009.html -1728486000 /kitchen/index.html -1728486000 /kitchen/recipe/mapo_tofu.html -1735657200 /gallery/20250101.html -1739631600 /journal/posts/20250216.html -1740063600 /journal/posts/20250221.html -1743433200 /gallery/index.html -1743433200 /plant/index.html -1743951600 /poetry/index.html -1745074800 /journal/index.html -1745334000 /journal/posts/20250420.html -1745766000 /computer/index.html -1745766000 /computer/openbsd_on_u9310e.html -1745766000 /computer/what-i-use.html -1745766000 /index.html -1747580400 /journal/posts/20250519.html -1764601200 /journal/posts/20241202.html -1765378800 /journal/posts/20241211.html -1766070000 /computer/9p.html -1747580400 /index.html -1747580400 /journal/index.html -1752678000 /gallery/20250717.html -1752678000 /gallery/index.html -1752678000 /index.html -1752678000 /gallery/20250717.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756134000 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /computer/index.html -1756220400 /computer/rp2040_3_interrupt.html -1756220400 /index.html -1756220400 /index.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1762095600 /computer/mailserver.html -1764255600 /journal/posts/20251122.html -1764255600 /journal/posts/20251122.html -1764255600 /journal/posts/20251122.html -1764428400 /journal/posts/20251122.html -1764428400 /index.html -1764428400 /journal/index.html -1764428400 /journal/posts/20251122.html -1764428400 /index.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/index.html -1766156400 /computer/x11_32bit_window.html -1766156400 /index.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html -1766156400 /computer/x11_32bit_window.html diff --git a/hugo.toml b/hugo.toml @@ -0,0 +1,14 @@ +baseURL = 'https://www.mtkn.jp/' +languageCode = 'ja-jp' +title = '松露庵' +uglyURLs = true +disableKinds = ['sitemap', 'taxonomy', 'term'] + +[outputs] + section = ['html'] + taxonomy = ['html'] + tag = ['html'] + +[outputFormats] + [outputFormats.rss] + baseName = 'rss' diff --git a/layouts/_partials/footer.html b/layouts/_partials/footer.html @@ -0,0 +1,2 @@ +<address>info(at)mtkn(dot)jp</address> +<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html @@ -0,0 +1,8 @@ +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<link rel="stylesheet" type="text/css" href="/style.css"> +{{ range .Resources.Match "*.css" }} + <link rel="stylesheet" type="text/css" href="{{ .RelPermalink }}"> +{{ end }} +<link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> +<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ .Title }}{{ end }}</title> diff --git a/layouts/_partials/header.html b/layouts/_partials/header.html @@ -0,0 +1,11 @@ +<a href="/">主頁</a> | +<a href="/about.html">自己紹介</a> | +<a href="/journal">日記</a> | +<a href="/farm">農業</a> | +<a href="/kitchen">台所</a> | +<a href="/computer">電算機</a> | +<a href="/poetry">詩</a> | +<a href="/books">本棚</a> | +<a href="/gallery">絵</a> | +<a href="/plant">植物</a> | +<a href="https://git.mtkn.jp">Git</a> diff --git a/layouts/baseof.html b/layouts/baseof.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html> +<head> + {{ partial "head.html" . }} +</head> +<body> + <header> + {{ partial "header.html" . }} + </header> + <main> + {{ block "main" . }}{{ end }} + </main> + <footer> + {{ partial "footer.html" . }} + </footer> +</body> +</html> diff --git a/layouts/computer/web_design/list.html b/layouts/computer/web_design/list.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<head> + {{ partial "head.html" . }} +</head> +<body> + <header> + {{ partial "header.html" . }} + </header> + <main> + <h1>{{ .Title }}</h1> + {{ .Content }} + </main> + <footer> + {{ partial "footer.html" . }} + </footer> +</body> +</html> + diff --git a/layouts/computer/web_design/page.html b/layouts/computer/web_design/page.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html> +{{ .Content }} +</html> + diff --git a/layouts/home.html b/layouts/home.html @@ -0,0 +1,3 @@ +{{ define "main" }} + {{ .Content }} +{{ end }} diff --git a/layouts/page.html b/layouts/page.html @@ -0,0 +1,4 @@ +{{ define "main" }} + <h1>{{ .Title }}</h1> + {{ .Content }} +{{ end }} diff --git a/layouts/section.html b/layouts/section.html @@ -0,0 +1,4 @@ +{{ define "main" }} + <h1>{{ .Title }}</h1> + {{ .Content }} +{{ end }} diff --git a/man/about.html b/man/about.html @@ -1,34 +0,0 @@ -<h1>自己紹介</h1> -<time>2022-07-28</time> - -<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> - -<ul> - <li>名前: 松田 健嗣</li> - <li>性別: 男</li> - <li>年齢: 20代</li> - <li>出身: 和歌山</li> -</ul> - -<p> -高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。 -</p> -<p> -勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。 -</p> -<p> -在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。 -</p> -<p> -ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。 -</p> -<p> -このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。 -</p> - -<h2>著作権について</h2> -<p> -このウェブサイト上のコンテンツは、特に断りのない限り\ -<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>\ -で公開します。\ -</p> diff --git a/man/books/978-4-06-288451-8.html b/man/books/978-4-06-288451-8.html @@ -1,10 +0,0 @@ -<h1>不死身の特攻兵</h1> -<div class="author">鴻上尚史 著</div> -<time>2022-11-23</time> -<p>大東亜戦争において何度も特攻を命じられるも生還した佐々木友次という人の話。ベテランのパイロットだったために陸軍の特攻第一号に選ばれ、死んでこいと言われたが爆弾を落して帰ってきた人である。それも何度も。</p> -<p>第一章は著者が佐々木氏を知ったいきさつ。第二章は佐々木氏の伝記。第三章は著者の佐々木氏へのインタビュー。第四章は著者による戦争や特攻に関する考察。</p> -<p>第一章は導入である。</p> -<p>第二章は物語として面白かった。戦争や特攻といった理不尽なものに対して自分の信念を貫いた佐々木氏の生き方や考え方が痛快である。</p> -<p>第三章のインタビューでは佐々木氏が繰り返し口にした寿命という言葉が印象的だった。人間は寿命がくれば死に、それまでは生きる、というものである。たとえ戦死であろうともそれがその人の寿命であるとの認識であるようだ。この考えにはとても共感できる。</p> -<p>第四章はかなり客観的に書かれているように思う。その上で著者自身の考えを述べているので読みやすかった。しかし読み進めるにつれてだんだんともやもやが溜っていった。当時の日本を支配していた空気があまりにも重苦しい。しかもその空気は、現在の日本にあるものとほとんど同じであると感じた。ここ最近僕が感じているこの国の暗い部分は大東亜戦争のころからなにも変らずに受け継がれているようである。せっかく無様に負けたのに本当の意味での反省を一切していないためか、なにも変っていない。余りにも勿体無く、戦没者にも失礼である。</p> -<p>もっと歴史を勉強し、今の生き方に反映しなければと考えさせてくれる本だった。</p> diff --git a/man/books/index.html b/man/books/index.html @@ -1,31 +0,0 @@ -<h1>本棚</h1> -<table> -<tr><th>題名</th><th>著者</th></tr> -<tr><td>敗者の戦後: ナポレオン・ヒトラー・昭和天皇</td><td>入江隆則</td></tr> -<tr><td>生きる意味を問う</td><td>三島由紀夫</td></tr> -<tr><td>満州国建国は正当である</td><td>ジョージ・ブロンソン・レー</td></tr> -<tr><td>植物一日一題</td><td>牧野富太郎</td></tr> -<tr><td>自然農の米づくり</td><td>川口由一、大植久美、吉村優男</td></tr> -<tr><td>自然農の野菜づくり</td><td>川口由一、高橋浩昭</td></tr> -<tr><td>自然農の果物づくり</td><td>川口由一、三井和夫、勇葱浩生、延命寺鋭雄、柴田幸子</td></tr> -<tr><td>日本その日その日</td><td>エドワード・S・モース</td></tr> -<tr><td>明治大正史 世相編</td><td>柳田國男</td></tr> -<tr><td>渡部昇一の昭和史(正)</td><td>渡部昇一</td></tr> -<tr><td>戦中派の死生観</td><td>吉田満</td></tr> -<tr><td>明治大帝</td><td>飛鳥井雅道</td></tr> -<tr><td>遠野物語</td><td>柳田國男</td></tr> -<tr><td><a href=978-4-06-288451-8.html>不死身の特攻兵</a></td><td>鴻上尚史</td></tr> -<tr><td>The Design and Implementation of the 4.4BSD Operating System</td><td>Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John S. Quarterman</td></tr> -<tr><td>The Go Programming Language</td><td>Alan A. A. Donovan, Brian W. Kernighan</td></tr> -<tr><td>The C Programming Language</td><td>Dennis M. Ritchie, Brian W. Kernighan</td></tr> -<tr><td>The Practice of Programming</td><td>Brian W. Kernighan, Rob Pike</td></tr> -<tr><td>The Unix Programming Environment</td><td>Brian W. Kernighan, Rob Pike</td></tr> -<tr><td>Computer Organization and Design RISC-V Edition</td><td>David A. Patterson, John L. Hennessy</td></tr> -<tr><td>Communicating Sequential Processes</td><td>C. A. R. Hoare</td></tr> -<tr><td>The Awk Programming Language</td><td>Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger</td></tr> -<tr><td>Operating Systems Design and Implementation Third Edition</td><td>Andrew S. Tanenbaum, Albert S. Woodhull</td></tr> -<tr><td>モルフォ人体デッサン</td><td>ミシェル・ローリセラ</td></tr> -<tr><td>ポーズの美術解剖学</td><td>加藤公太</td></tr> -<tr><td>意拳学 中国功夫の精髄</td><td>韓星橋</td></tr> -<tr><td>楽典</td><td>石桁真礼生, 末吉保雄, 丸田昭三, 飯田隆, 金光威和雄, 飯沼信義</td></tr> -</table> diff --git a/man/computer/9p.html b/man/computer/9p.html @@ -1,484 +0,0 @@ -<h1>9P</h1> -<time>2024-12-19</time> -<h2>はじめに</h2> -<p> -9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。\ -このプロトコルを使えば、ディスクに記録されたデータだけでなく、\ -マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等も\ -ファイルとして扱える。\ -Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOS\ -のために設計された。 -</p> - -<p> -Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計\ -されているので、\ -この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。\ -</p> - -<h2>プロトコルの概要</h2> -<p> -9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに\ -対してリプライを返すことを繰り返す。\ -クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと\ -言う。\ -Tメッセージにはファイルにアクセスするための色々なものが用意されている。\ -例えばファイルを開くためのTopenや、\ -開いたファイルに書き込むためのTwrite等である。\ -それぞれのTメッセージには対応するRメッセージがある。\ -Topenに対してRopen、\ -Twriteに対してRwrite等である。\ -</p> -<p> -通信は必要な情報をプロトコルの定める方法でバイト列に変換して行う。\ -2バイト以上のデータはリトルエンディアンになるように配置する。\ -テキストデータはUTF-8にエンコードする。\ -テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。\ -</p> -<p> -各メッセージは4バイトの整数から始まる。\ -これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。\ -次にメッセージの種類を記述する1バイトのデータが来る。\ -次はメッセージのタグである。クライアントはサーバーからの返事を\ -待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージ\ -に対する返事なのかを識別する必要がある。そのために使うのがタグである。\ -クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに\ -同じタグを付ける。\ -その後ろには、メッセージの種類によって固有の情報が付けられる。\ -</p> -<p> -以下は実際の9P通信のログである。\ -実際はバイナリの通信だが、ログとして見易いように変換してある。\ -また、先頭にくるメッセージサイズは省略してある。\ -この例では、サーバーのルートディレクトリにある<code>hello</code>という\ -ファイルの内容を読みこんでいる:\ -</p> -<pre><code>\ -&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' ---&gt; Rversion Tag 65535 msize 8192 version '9P2000' -&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname ---&gt; Rattach Tag 0 qid (0000000000000000 0 d) -&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello ---&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) -&lt;-- Tstat Tag 0 fid 1 ---&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 -&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 ---&gt; Rwalk Tag 0 nwqid 0 -&lt;-- Topen Tag 0 fid 2 mode 0x0 ---&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 -&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 ---&gt; Rread Tag 0 count 7 ' 776f726c 64210a' -&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 ---&gt; Rread Tag 0 count 0 '' -&lt;-- Tclunk Tag 0 fid 2 ---&gt; Rclunk Tag 0 -</code></pre> -<p> -まず最初にクライアントがサーバーに対してTversionを送り、\ -プロトコルのバージョンと、メッセージの最大サイズを交渉する。\ -Tversionのタグは<code>65535</code>と決められている。\ -<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、\ -<code>version</code>の9P2000がプロトコルのバージョンである。\ -サーバーからRversionで同じ\ -<code>msize</code>と<code>version</code>が返ってきたので\ -このサイズとバージョンで以降の通信を行う。\ -</p> -<p> -次のTattachで、クライアントがサーバーにルートディレクトリの\ -<code>fid</code>を要求する。\ -<code>afid</code>以降は認証用の情報である(後述)。\ -<code>fid</code>はコネクションにおいてファイルと紐付けられる整数で、\ -Unixにおけるファイルディスクリプタのようなものである。\ -ファイルの読み書きはこの<code>fid</code>を使って行われる。\ -サーバーからのRattachにはルートディレクトリの\ -<code>qid</code>が含まれる。\ -これはサーバー上でファイルを一意に識別するもので、\ -Unixにおけるinodeに相当するものである。\ -以上でサーバーに繋いでセッションを確立できた。\ -</p> -<p> -次にTwalkで目的のファイル(<code>hello</code>)まで\ -ファイルツリーを辿る。\ -ここでは起点として先程得られたルートディレクトリ(<code>fid = 1</code>)\ -を起点として、このディレクトリ内の<code>hello</code>ファイルを要求して\ -<code>fid = 2</code>を割り当てようとしている。\ -サーバーはルートディレクトリ内に要求されたファイルが見付かったので、\ -そのファイルの<code>qid</code>を返す。\ -</p> -<p> -目的のファイルに<code>fid</code>が割り当てられたので、\ -Tstatでこのファイルの属性を要求している。\ -おそらくファイルのパーミッションを調べるためである。\ -</p> -<p> -次にTopenを使ってこのファイルを開き、\ -Treadを使って内容を読む。\ -二回目のTreadに対して0バイトのデータが返ってきたので、\ -ファイルはこれで終りである。\ -</p> -<p> -最後に、必要なくなった<code>fid</code>はTclunkで捨てる。\ -</p> - -<h2>List of all Message Types</h2> - -<table> -<tr> -<th>Tメッセージ</th> -<th>Rメッセージ</th> -<th>説明</th> -</tr> -<tr> -<td>Tversion</td> -<td>Rversion</td> -<td>バージョンの交渉</td> -</tr> -<tr> -<td>Tauth</td> -<td>Rauth</td> -<td>認証ファイルの取得</td> -</tr> -<tr> -<td></td> -<td>Rerror</td> -<td>エラー(Rメッセージのみ)</td> -</tr> -<tr> -<td>Tflush</td> -<td>Rflush</td> -<td>処理中のリクエストをキャンセル</td> -</tr> -<tr> -<td>Tattach</td> -<td>Rattach</td> -<td>ルートディレクトリの取得</td> -</tr> -<tr> -<td>Twalk</td> -<td>Rwalk</td> -<td>ファイルツリーを辿る</td> -</tr> -<tr> -<td>Topen</td> -<td>Ropen</td> -<td>ファイルを開く</td> -</tr> -<tr> -<td>Tcreate</td> -<td>Rcreate</td> -<td>ファイルの作成</td> -</tr> -<tr> -<td>Tread</td> -<td>Rread</td> -<td>ファイルを読む</td> -</tr> -<tr> -<td>Twrite</td> -<td>Rwrite</td> -<td>ファイルへ書き込む</td> -</tr> -<tr> -<td>Tclunk</td> -<td>Rclunk</td> -<td>fidの削除</td> -</tr> -<tr> -<td>Tremove</td> -<td>Rremove</td> -<td>ファイルを削除</td> -</tr> -<tr> -<td>Tstat</td> -<td>Rstat</td> -<td>ファイルの属性を取得</td> -</tr> -<tr> -<td>Twstat</td> -<td>Rwstat</td> -<td>ファイルの属性を変更</td> -</tr> -</table> - -<h2><code>fid</code>と<code>qid</code></h2> -<p> -<code>fid</code>はコネクションにおいてファイルを指定するために\ -使われる整数で、Unixのファイルディスクリプタのようなものである。\ -使用する整数はクライアントが指定できる。\ -サーバーに接続する際にTattachにより、サーバーの\ -ルートディレクトリの<code>fid</code>が設定され、\ -Twalkにより追加され、Tclunkにより削除される。\ -</p> -<p> -<code>qid</code>はサーバーがファイルを一意に識別するためのもので、\ -Unixのinodeに相当するものである。\ -ただしinodeはファイルが削除されると再利用される可能性があるのに対し、\ -<code>qid</code>は再利用できない。\ -<code>qid</code>はこのファイルがディレクトリかどうか等を示す<code>type</code>、\ -ファイルが変更されたときにインクリメントされる<code>vers</code>、\ -そしてファイルを一意に表す<code>path</code>の3つの情報で構成される。\ -</p> -<h2>認証</h2> -<p> -9Pにはクライアントの認証が組込まれていない。\ -もともとはあったようだが、認証のアルゴリズムに欠陥が見付かったりすれば\ -いちいちコードを修正してコンパイルしなおさなければいけないうえ、\ -9Pプロトコル自体も変更しないといけないので、外部に切りだすことになった。\ -認証に必要なやりとりは認証サーバーとクライアントが行い、\ -9Pサーバーは認証が成功したかどうかの情報を認証サーバーに確認することで\ -クライアントの確認を行う。 -</p> -<p> -9PサーバーはTattachメッセージを受けとると、\ -認証サーバーとのコネクションを確立する。\ -その後Rattachメッセージで<code>afid</code>という\ -特殊な<code>fid</code>をクライアントに返す。\ -クライアントからこの<code>afid</code>に対して読み書きする命令が届くと、\ -9Pサーバーはこの読み書きを認証サーバーとのコネクションに横流しする。\ -つまりクライアントはこの<code>afid</code>を通じて認証サーバーと\ -直接やりとりができる。\ -クライアントはユーザー名やパスワード等(パスワード認証の場合)の情報を\ -<code>afid</code>に書き込んで認証する。\ -このように認証をプロトコル自体から切り離すことで、\ -認証に関するバグが見付かったとしても、認証サーバーを修正するだけでいい。\ -また、より強力な認証システムを組み込むのも楽である。 -</p> - -<h2>コネクションの共有</h2> -<p> -クライアントはサーバーと<code>version</code>メッセージを交すことで\ -コネクションを確立する。\ -コネクションの確立からの一連のやりとりをセッションという。\ -ひとつのコネクションは複数のクライアントが共有できる。\ -</p> -<p> -クライアントはTauthまたはTattachメッセージにより\ -サーバーに<code>fid</code>を要求できる。\ -このうちTauthにより得られた<code>fid</code>は認証以外には使えない。\ -Tattachで得られた<code>fid</code>は、\ -Twalkメッセージによりファイルツリーを辿るための起点として利用でき、\ -このとき辿った先のファイルを示す<code>fid</code>が生成される。\ -これ以外の方法で<code>fid</code>が増えることはない。\ -つまり、サーバーはひとつのコネクションのなかで、ルートディレクトリから\ -派生した<code>fid</code>を追跡することで、クライアントを区別できる。\ -</p> - -<h2>メッセージ詳細</h2> -<p> -それぞれ最初にメッセージの形式を書く。\ -<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が来る。 -</p> -<h3>version</h3> -<p> -プロトコルのバージョンを交渉すし、コネクションを確立する。 -</p> -<pre><code>\ -size[4] Tversion tag[2] msize[4] version[s] -size[4] Rversion tag[2] msize[4] version[s] -</code></pre> -<p> -クライアントは最初にサーバーにこのメッセージを送ってバージョンと\ -メッセージの最大サイズ(<code>msize</code>)を交渉する。\ -サーバーはクライアントから送られたバージョンとメッセージサイズに\ -対応していれば、同じバージョンとサイズを送り返し、交渉成立である。\ -</p> -<p> -サーバーとクライアントはこのメッセージを以ってコネクションを確立する。\ -</p> - -<h3>attach、auth</h3> -<p> -コネクションを確立する。 -</p> -<pre><code>\ -size[4] Tauth tag[2] afid[4] uname[s] aname[s] -size[4] Rauth tag[2] aqid[13] - -size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] -size[4] Rattach tag[2] qid[13] -</code></pre> -<p> -<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> -<p> -<code>auth</code>メッセージは認証サーバーとやりとりするための\ -<code>fid</code>である<code>afid</code>を要求する。\ -この<code>afid</code>を読み書きすることで\ -認証サーバーとやりとりをし、自身の身分を証明する。\ -認証が済んだらこの<code>afid</code>をセットした\ -<code>attach</code>メッセージを送る。\ -</p> - -<h3>error</h3> -<p> -エラーを返す。 -</p> -<pre><code>\ -size[4] Rerror tag[2] ename[s] -</code></pre> -<p> -クライアントからの要求に対して、なにかエラーがおきたときに\ -そのエラーを返すために使われる。\ -<code>Terror</code>はない。\ -</p> - -<h3>flush</h3> -<p> -リクエストをキャンセルする。 -</p> -<pre><code>\ -size[4] Tflush tag[2] oldtag[2] -size[4] Rflush tag[2] -</code></pre> -<p> -実行中の要求をキャンセルする。\ -キャンセルしたいリクエストの<code>tag</code>を<code>oldtag</code>にセットする。 -</p> - -<h3>walk</h3> -<p> -ファイルツリーを移動する。 -</p> -<pre><code>\ -size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) -size[4] Rwalk tag[2] nwqid[2] nwqid*(qid[13]) -</code></pre> -<p> -<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> -<p> -<code>wname</code>の最初の要素への移動が失敗した場合は\ -<code>Rerror</code>が返される。\ -それ以外の場合は<code>Rwalk</code>が返され、\ -<code>qid</code>は移動が成功した順番にそのファイルの<code>qid</code>\ -がセットされる。\ -<code>nwname</code>と<code>nwqid</code>が一致した場合は\ -最後まで移動できたことになる。\ -</p> -<p> -<code>walk</code>は<code>fid</code>を増殖させる唯一の方法である。\ -</p> - -<h3>open、create</h3> -<p> -<code>fid</code>を開いて(作成して)読み書きできる状態にする。 -</p> -<pre><code>\ -size[4] Topen tag[2] fid[4] mode[1] -size[4] Ropen tag[2] qid[13] iounit[4] - -size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1] -size[4] Rcreate tag[2] qid[13] iounit[4] -</code></pre> -<p> -<code>open</code>は<code>fid</code>と紐付いたファイルを開く。\ -<code>mode</code>は読み込み専用の<code>OREAD</code>、\ -書き込み専用の<code>OWRITE</code>、\ -読み書きの<code>ORDWR</code>等である。\ -ファイルを開く手順は以下の通り: -<ol> -<li><code>attach</code>でルートディレクトリの<code>fid</code>を取得</li> -<li>ルートディレクトリの<code>fid</code>から\ -<code>walk</code>で開きたいファイルの<code>fid</code>を取得</li> -<li>その<code>fid</code>を<code>open</code>で開く</li> -</ol> -</p> -<p> -<code>create</code>は<code>fid</code>と紐付いたディレクトリに\ -新しいファイルを作成する。\ -<code>creat</code>ではなく<code>create</code>である。\ -作成が成功したら<code>fid</code>は新しく作成されたファイルに紐付く。\ -</p> - -<h3>read、write</h3> -<p> -ファイルを読み書きする。 -</p> -<pre><code>\ -size[4] Tread tag[2] fid[4] offset[8] count[4] -size[4] Rread tag[2] count[4] data[count] - -size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count] -size[4] Rwrite tag[2] count[4] -</code></pre> -<p> -<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> - -<h3>clunk</h3> -<p> -<code>fid</code>を忘れる。 -</p> -<pre><code>\ -size[4] Tclunk tag[2] fid[4] -size[4] Rclunk tag[2] -</code></pre> -<p> -いらなくなった<code>fid</code>を忘れる。\ -一度忘れた<code>fid</code>は<code>walk</code>で別のファイルを取得する際に\ -再利用できる。\ -</p> - -<h3>remove</h3> -<p> -ファイルを削除する。 -</p> -<pre><code>\ -size[4] Tremove tag[2] fid[4] -size[4] Rremove tag[2] -</code></pre> -<p> -<code>fid</code>と紐付いたサーバー上のファイルを削除する。\ -<code>fid</code>は<code>clunk</code>したのと同様に忘れられる。\ -</p> - -<h3>stat、wstat</h3> -<p> -ファイルの属性を読み書きする。 -</p> -<pre><code>\ -size[4] Tstat tag[2] fid[4] -size[4] Rstat tag[2] stat[n] - -size[4] Twstat tag[2] fid[4] stat[n] -size[4] Rwstat tag[2] -</code></pre> -<p> -<code>stat</code>はファイルの属性を読む。\ -読めた情報は<code>stat</code>として返される。\ -<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。\ -<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、\ -作成日、更新日等の情報がバイト列になったものである。\ -</p> - diff --git a/man/computer/archlinux_installation.html b/man/computer/archlinux_installation.html @@ -1,351 +0,0 @@ -<h1>Arch Linuxのインストール</h1> -<time>2021-03-25</time> - -<h2>ハードウェア構成</h2> - -<h2>インストールの準備</h2> - -<h3>インストールメディアの入手</h3> - -<h3>署名の検証</h3> -<pre><code>\ -$ gpg --keyserver-options auto-key-retrieve --verify archlinux-<i>version</i>-x86_64.iso.sig -</code></pre> - -<h3>インストールメディアの準備</h3> -<pre><code>\ -$ sudo dd bs=4M if=<i>path/to/arch/linux/iso</i> of=/dev/sd<i>X</i> status=progress oflag=sync -</code></pre> - -<h3>ライブ環境の起動</h3> -Arch Linux install medium (x86_64, UEFI)を選択 - -<h3>インストールの記録</h3> -<pre><code>\ -# script install.log -</code></pre> - -<h3>起動モードの確認</h3> -<pre><code>\ -# ls /sys/firmware/efi/efivars -</code></pre> -エラーが出なければUEFI。 - -<h3>インターネットへ接続</h3> -<p> -ネットワークインターフェイスが認識されているか確認: -</p> -<pre><code>\ -# ip link -</code></pre> -<p> -Wi-Fi接続: -</p> -<pre><code>\ -# iwctl -[iwd]# device list -... -[iwd]# exit -</code></pre> -<p> -接続を確認: -</p> -<pre><code>\ -# ping archlinux.jp -</code></pre> - -<h3>システムクロックの更新</h3> -<pre><code>\ -# timedatectl set-ntp true -</code></pre> - -<h3>パーティショニング</h3> -<pre><code>\ -sd<i>X</i> -├sd<i>X</i>1 512M EFI System /boot -└sd<i>X</i>2 lest Linux filesystem / -</code></pre> -<pre><code>\ -# lsblk -# fdisk /dev/sd<i>X</i> -Command (m for help): d -... -Command (m for help): w -</code></pre> - -<h3>パーティションのフォーマット</h3> -<pre><code>\ -# mkfs.fat -F32 /dev/sd<i>X</i>1 -# mkfs.ext4 /dev/sd<i>X</i>2 -</code></pre> - -<h3>ファイルシステムのマウント</h3> -<pre><code>\ -# mount /dev/sd<i>X</i>2 /mnt -# mkdir /mnt/boot -# mount /dev/sd<i>X</i>1 /mnt/boot -</code></pre> - -<h2>インストール</h2> -<h3>ミラーの選択</h3> -日本のサーバーを上に持ってくる: -<pre><code>\ -# vim /etc/pacman.d/mirrorlist -</code></pre> - -<h3>必須パッケージのインストール</h3> -<pre><code>\ -# pacstrap /mnt base base-devel linux linux-firmware man-db man-pages -</code></pre> - -<h3>fstabの生成</h3> -<pre><code>\ -# genfstab -U /mnt >> /mnt/etc/fstab -</code></pre> - -<h3>chroot</h3> -<pre><code>\ -# arch-chroot /mnt -</code></pre> - -<h3>text editorをインストール</h3> -<pre><code>\ -# pacman -S neovim -</code></pre> - -<h3>タイムゾーン</h3> -<pre><code>\ -# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -# hwclock --systohc -</code></pre> - -<h3>ローカリゼーション</h3> -<code>en_US.UTF-8</code>と<code>ja_JP.UTF-8</code>をコメントイン: -<pre><code>\ -# nvim /etc/locale.gen -</code></pre> -ロケールを生成: -<pre><code>\ -# locale-gen -</code></pre> -<pre><code>\ -# nvim /etc/locale.conf -LANG=en_US.UTF-8 -</code></pre> - -<h3>ネットワーク設定</h3> -<p> -無線接続用のソフトをインストール -</p> -<pre><code>\ -# pacman -S networkmanager -</code></pre> - -<p> -ホストネームの設定 -</p> -<pre><code>\ -# nvim /etc/hostname -<i>myhostname</i> -</code></pre> -<pre><code>\ -# nvim /etc/hosts -127.0.0.1 localhost -::1 localhost -127.0.1.1 <i>myhostname</i>.localdomain <i>myhostname</i> -</code></pre> - -<h3>Rootパスワード</h3> -<pre><code>\ -# passwd -</code></pre> - -<h3>ブートローダー</h3> -<p> -インストール -</p> -<pre><code>\ -# pacman -S grub efibootmgr -# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=boot -</code></pre> -<p> -メイン設定ファイルの生成 -</p> -<pre><code>\ -# grub-mkconfig -o /boot/grub/grub.cfg -</code></pre> - -<h3>マイクロコードのアップデートを有効化</h3> -<pre><code>\ -# pacman -S intel-ucode -# grub-mkconfig -o /boot/grub/grub.cfg -上のん無駄やんけ -</code></pre> - -<h2>再起動</h2> -<pre><code>\ -# exit #chrootを抜ける -</code></pre> - -<h3>インストールの記録を保存</h3> -<pre><code>\ -# exit #scriptを停止 -# mv install.log /mnt/root -</code></pre> - -<h3>アンマウント</h3> -<pre><code>\ -# umount -R /mnt -</code></pre> - -<h3>再起動</h3> -<pre><code>\ -# reboot -</code></pre> - -<h2>インストール後</h2> -<h3>システム管理</h3> -<p> -一般ユーザーの作成 -</p> -<pre><code>\ -# useradd -m -G wheel -s /bin/bash kenji -# passwd kenji -</code></pre> -<p> -作成したユーザーをsudoerに追加 -</p> -<pre><code>\ -# visudo -%wheel ALL=(ALL) ALL #uncomment -</code></pre> -<p> -一般ユーザーとしてログインしなおす。 -</p> - -<h3>パッケージ管理</h3> -<p> -AUR -</p> - - - -<h3>dotfilesを同期</h3> -<p> -gitのインストール -</p> -<pre><code>\ -$ sudo pacman -S git -$ git config --global user.name "<i>First-name</i> <i>Family-name</i>" -$ git config --global user.email "<i>username</i>@<i>example.com</i>" -</code></pre> -<p> -dotfilesを同期 -</p> -<pre><code>\ -$ mkdir ~/.local -$ cd ~/.local -$ git clone https://github.com/<i>dotfilesのリポジトリ</i> -$ ln -sf ~/.local/dotfiles/.bash* ~/ -$ mkdir .config -$ ln -s ~/.local/dotfiles/.config/* ~/.config/ -... -</code></pre> - -<h3>GUI</h3> -<p> -グラフィックドライバのインストール -</p> -<pre><code>\ -$ sudo pacman -S nvidia nvidia-utils xorg-xinit -</code></pre> -<p> -window managerをインストール -</p> -<pre><code>\ -$ sudo pacman -S i3-wm i3blocks dmenu -</code></pre> -ドライバをインストールしたらxorg-server等も依存関係として入った。 -<p> -フォントをインストール -</p> -<pre><code>\ -$ sudo pacman -S noto-fonts-cjk noto-fonts-emoji ttf-joypixels ttf-font-awesome ttf-liberation -</code></pre> - -<p> -ターミナル(st)をインストール -</p> -<pre><code>\ -$ mkdir ~/.local/src -$ cd ~/.local/src -$ git clone git://git.suckless.org/st -$ cd st -$ sudo make install -</code></pre> - -<p> -再起動 -</p> -<pre><code>\ -# sudo reboot -</code></pre> -だめでした -<p> -ログイン時に次のエラー -</p> -<pre><code>\ -xauth: error in locking authority file /home/kenji/.cache/X11/Xauthority -</code></pre> -<p> -<code>~/.cache/X11</code>というディレクトリがないのが原因のようだ。 -<code>.bash_profile</code>でXauthorityの場所を変更していたのにディレクトリを作っていなかった。 -</p> -<pre><code>\ -$ mkdir ~/.cache/X11 -</code></pre> -<p> -として解決。 -</p> - -<h3>日本語入力</h3> -<p> -ibusとibus-skkをインストール -</p> -<pre><code>\ -$ sudo pacman -S ibus ibu-skk skk-jisyo -</code></pre> -<pre><code>\ -vim ~/.config/X11/xinitrc -export DefaultIMModule=ibus -export GTK_IM_MODULE=ibus -export QT_IM_MODULE=ibus -export XMODIFIERS="@im=ibus" - -ibus-daemon --xim & -</code></pre> - -<h3>ブラウザ(brave)をインストール</h3> -<pre><code>\ -$ cd ~/.local/src -$ git clone https://aur.archlinux.org/brave-bin.git -$ cd brave-bin -$ makepkg -si -</code></pre> - -<h3>音</h3> -<pre><code>\ -$ sudo pacman -S alsa-utilst pulseaudio -$ pulseaudio --start -</code></pre> - - -<p> -ssh -</p> -<pre><code>\ -$ sudo pacman -S openssh -$ mkdir ~/.ssh -$ cd ~/.ssh -$ ssh-keygen -t rsa -</code></pre> diff --git a/man/computer/git_server.html b/man/computer/git_server.html @@ -1,327 +0,0 @@ -<h1>Gitサーバーの設定 on OpenBSD</h1> -<time>2024-02-15</time> - -<h2>はじめに</h2> -<p> -GitHubがMicrosoft傘下になり久しい。\ -MincraftがMicrosoftアカウントなしでは遊べなくなった。\ -このままではGitHubもそのうちMicrosoftアカウントを要求するように\ -なるかもしれない。\ -ということでGitサーバーを自前で持つことにした。\ -</p> -<p> -ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、\ -この記事は近いうちにいらなくなりそう。 -</p> - -<h2>手順</h2> -<p> -以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、\ -stagitというウェブフロントエンドを導入する。 -</p> - -<h3>概要</h3> -<ol> -<li>ドメインの設定(任意)</li> -<li><code>httpd(8)</code>の設定</li> -<li>gitパッケージのインストールとchroot環境の整備</li> -<li>stagitの導入</li> -</ol> - -<h3>ドメインの設定(任意)</h3> -<p> -ドメインを設定する。\ -IPアドレスでアクセスできればいいならこの設定はいらない。\ -</p> -<p> -今回はgitというサブドメインを登録した: -</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>git</td> -<td>A</td> -<td><i>サーバーのIPアドレス</i></td> -<td></td> -</tr> -</tbody> -</table> - -<h3><code>httpd(8)</code>の設定</h3> -<p> -httpsで接続する場合、<code>acme-client(8)</code>を設定する\ -(IPアドレスで接続するなら自己証明書を発行することになる)。\ -まず<code>/etc/acme-client.conf</code>にドメインを追加する: -</p> -<pre><code>\ -domain git.mtkn.jp { - domain key "/etc/ssl/private/git.mtkn.jp.key" - domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - sign with letsencrypt -} -</code></pre> - -<p> -続いて<code>/etc/httpd.conf</code>を設定する。\ -</p> -<pre><code>\ -server "git.mtkn.jp" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "git.mtkn.jp" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - key "/etc/ssl/private/git.mtkn.jp.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "/*/git-receive-pack" { - block - } - location "/*/git-upload-pack" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } - location "/*/info/refs" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } -} -</code></pre> -<p> -<code>location "/*/git-receive-pack"</code>はpushの設定。\ -今回はhttpsでのpushを受付けないので<code>block</code>する。\ -</p> -<p> -<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環境にコピーする。 -</p> -<p> -この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみ\ -CGIを実行するようにした。\ -gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。\ -</p> - - - -<p> -httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけ\ -でいい。 -</p> -<p> -<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する: -</p> -<pre><code>\ -# echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# echo slowcgi_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -# rcctl start slowcgi -# rcctl enable slowcgi -</code></pre> -<p> -サーバー証明書の発行: -</p> -<pre><code>\ -# acme-client -v git.mtkn.jp -</code></pre> -<p> -<code>crontab(1)</code>にサーバー証明書の自動更新を登録: -</p> -<pre><code>\ -#minute hour mday month wday [flags] command -~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd -</code></pre> - -<h3>gitパッケージのインストールとchroot環境の整備</h3> -<p> -gitパッケージをインストールし、ssh接続用のユーザーを作成する。\ -httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>\ -下にする: -</p> -<pre><code>\ -# pkg_add git -# useradd -b /var/www -m -s /usr/local/bin/git-shell git -</code></pre> -<p> -ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。\ -ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、\ -部外者がこのファイルの編集をできないようにしておく必要がある。\ -一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫\ -だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させて\ -おいてもいいかもしれない。\ -</p> -<p> -httpsでアクセスするためにchroot環境を整備する。\ -<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、\ -CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。\ -まずはgitのコマンドをコピー: -</p> -<pre><code>\ -# mkdir -p /var/www/usr/local/libexec/git -# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/ -# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# mkdir -p /var/www/usr/local/bin -# cp /usr/local/bin/git /var/www/usr/local/bin/ -# chown www:www /var/www/usr/local/bin/git -# chmod 0500 /var/www/usr/local/bin/git -</code></pre> -<p> -続いてコマンドの実行に必要なライブラリをコピー: -</p> -<pre><code>\ -# mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec -# 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 -</code></pre> -<p> -<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照): -</p> -<pre><code>\ -# mkdir /var/www/dev -# mknod -m 666 /var/www/dev/null c 2 2 -</code></pre> -<p> -最後に、<code>/var/www/dev/null</code>を作成するために\ -<code>/etc/fstab</code>の<code>/var</code>エントリーから\ -<code>nodev</code>オプションを削除し、再起動する。 -</p> - -<p> -gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも\ -更新しないといけないのでそのためのスクリプトを適当に作った: -</p> -<pre><code>\ -#!/bin/sh -xe - -oso=$(find /var/www/usr -type f -name '*.so*') -rm $oso - -bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' | - grep -v bgpctl | - sed 's|^/var/www||' - ) -echo &quot;$bin&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chmod 0500 /var/www&amp;|' | sh -s - -nso=$(echo &quot;$bin&quot; | sed 's|^|/var/www|' | - xargs ldd | awk '{print $7}' | - grep -v -e '^/var/www/' -e '^$' -e 'Name' | - sort | uniq - ) -echo &quot;$nso&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chmod 0400 /var/www&amp;|' | sh -s -</code></pre> - -<h3><code>stagit(1)</code>の導入</h3> -<p> -ウェブフロントエンドとしてstagitを導入する: -</p> -<pre><code>\ -# pkg_add stagit -</code></pre> -<p> -<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に\ -以下の設定を追加する\ -(<code>location</code>のマッチは上から順番に評価されるので、上で設定した\ -gitのhttpクライアント用の<code>location</code>よりも下に記入する): -</p> -<pre><code> location &quot;/&quot; { - directory index index.html - root &quot;/htdocs/git.mtkn.jp&quot; - } - location &quot;*&quot; { - directory index log.html - root &quot;/htdocs/git.mtkn.jp&quot; - } -</code></pre> -<p> -stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する: -</p> -<pre><code>\ -# mkdir /var/www/htdocs/git.mtkn.jp -# chown git:git /var/www/htdocs/git.mtkn.jp -# rcctl reload httpd -</code></pre> - -<p> -gitリポジトリが更新されたときにウェブページも更新するように設定する。\ -gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の\ -<code>hooks/post-receive</code>というファイルを自動で実行する。\ -そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい: -</p> -<pre><code>\ -#!/bin/sh - -git_root=&quot;/var/www/git&quot; -stagit_root=&quot;/var/www/htdocs/git.mtkn.jp&quot; -repo=&quot;$(basename &quot;$(pwd)&quot; | sed 's/\.git$//')&quot; -src=&quot;$(pwd)&quot; -stagit_dst=&quot;$stagit_root/$repo&quot; - -mkdir -p &quot;$stagit_dst&quot; -(cd &quot;$stagit_dst&quot; &amp;&amp; stagit -l 64 &quot;$src&quot;) -(cd &quot;$stagit_root&quot; &amp;&amp; stagit-index $git_root/*.git &gt; index.html) -</code></pre> - -<h2>レポジトリの作成</h2> -<p> -レポジトリを作成するにはサーバーで以下のようにする。\ -</p> -<pre><code>\ -$ cd /var/www/git -$ doas -u git mkdir <i>repo</i>.git -$ cd <i>repo</i>.git -$ doas -u git git init --bare -</code></pre> - -<p> -これで手元のパソコンからクローンできる: -</p> -<pre><code>\ -$ git clone git@git.mtkn.jp:<i>repo</i>.git -</code></pre> -<p> -または -</p> -<pre><code>\ -$ git clone https://git.mtkn.jp/<i>repo</i>.git -</code></pre> - -<h2>参考</h2> -<ul> -<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li> -<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li> -<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li> -</ul> diff --git a/man/computer/index.html b/man/computer/index.html @@ -1,42 +0,0 @@ -<h1>電算機</h1> -<p> -Small is beautiful. -</p> - -<h2>9P in Go</h2> -<ul> -<li><a href="9p.html">9P</a></li> -</ul> - -<h2>RP2040</h2> -<ul> -<li><a href="rp2040_1.html">RP2040 SDKなしでLチカ</a></li> -<li><a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> -<li><a href="rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> -</ul> - -<h2>X Window System</h2> -<ul> -<li><a href="x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> -<li><a href="xlib_playground1.html">Xlibで遊んでみる1</a></li> -<li><a href="xlib_playground2.html">Xlibで遊んでみる2</a></li> -<li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li> -<li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li> -<li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li> -<li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li> -</ul> - -<h2>サーバー</h2> -<ul> -<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li> -<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> -<li><a href="git_server.html">Gitサーバーの設定 on OpenBSD</a></li> -</ul> - -<h2>MISC</h2> -<ul> -<li><a href="what-i-use.html">使用しているソフトウェア、ハードウェア</a></li> -<li><a href="openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> -<li><a href="archlinux_installation.html">Arch Linuxインストール</a></li> -<li><a href="rtx1200-qos.html">ルーター(RTX1200)のQoS機能を利用して帯域を制限した</a></li> -</ul> diff --git a/man/computer/mailserver.html b/man/computer/mailserver.html @@ -1,701 +0,0 @@ -<h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1> -<time>2024-01-19</time><br> -<time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br> - -<h2>はじめに</h2> -<p> -少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。\ -当時はドキュメントを追うのに必死で構築手順を整理できていなかった。\ -しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。\ -そこであらためてサーバーを構築し、その手順を確認することにした。\ -あいかわらずDNSの知識は自信がない。\ -セキュリティは自己責任で。\ -</p> - -<h2>使うもの</h2> -<ul> -<li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> -<li>OS: OpenBSD 7.4</li> -<li>ドメイン: ムームードメイン (mtkn.jpとする)</li> -<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> -<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> -</ul> - -<h2>メールの仕組み</h2> -<p> -メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのが\ -SMTPサーバーと呼ばれるソフトウェアである。\ -このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも\ -呼ばれる。\ -今回はMTAとしてOpenSMTPDというのを使う。\ -手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、\ -そこから受信側のMTAに転送される。\ -受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所\ -に保存する。\ -</p> -<p> -受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、\ -自分宛てのメールを確認する。\ -この時に使われるのがIMAPというプロトコルである\ -(POPというのもあるが今回は割愛)。\ -IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する\ -役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。\ -今回MDAとしてDovecotを使用する。\ -</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre> -+------------+ +----------------+ -|MTA(mtkn.jp)|--SMTP-&gt;| MTA | -+------------+ +--example.com---+ - ^ | MDA | - | +----------------+ - | | - SMTP IMAP - | | - | v -+------------+ +----------------+ -|user@mtkn.jp| |user@example.com| -+------------+ +----------------+ - -</pre> -<ol> -<li>メールを書く。</li> -<li>送信側のMTAに送る。</li> -<li>受信側のMTAに転送する。</li> -<li>受信者が受信側のMDAに新着メールの有無を確認する。</li> -</ol> - -<p> -SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、\ -いくつかの方法で送信元の本人確認を行う。\ -その際第三者としてDNS及び、サーバーのIPアドレスを管理している人\ -(今回の場合はさくらインターネット)が登場する。\ -DNSにはドメインをIPアドレスにひもづける情報が登録できる。\ -またIPアドレスの管理人には、自分が借りているIPアドレスを\ -自分のドメインにひもづける情報を登録してもらう。\ -これらによって、メールの送信者がドメイン、IPアドレス双方から\ -確認できるので、なりすましを防止できる仕組みである。\ -</p> - -<p> -最近はgmail等の大手がスパム対策を強化する一環として、\ -以下に述べるような本人確認をすべて通らなければ受信しない\ -ようにしているらしい。\ -</p> - -<h2>MTAどうしのやりとり</h2> -<p> -以下、MTAどうしの通信内容をざっくり説明する。 -</p> - -<h3>Aレコード、MXレコードによる送信先の特定</h3> -<p> -MTAがメールを送信する際、まずは宛先のサーバーを\ -特定する必要がある。\ -この際に使用するのがDNSに登録されているMXレコードである。\ -送信元のMTAはまずDNSに宛先のドメインのMXレコード\ -を問い合わせる。\ -するとメールの送信先のドメイン名が分かるので、続いて\ -この送信先のIPアドレスを問い合わせる:\ -</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS - - example.com宛のメールって - 誰に送ったらええん? - ----------------------------------------&gt; - - mai.example.comやで(MXレコード) - &lt;---------------------------------------- - - mail.example.comってどこや? - ----------------------------------------&gt; - - <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) - &lt;---------------------------------------- -</pre> -<p> -次にこの宛先のMTAとの通信を開始する。\ -しかし受信側のMTA(example.com)は、\ -mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:\ -</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - こんちは。mtkn.jpです。 - ----------------------------------------&gt; - - なりすましちゃうか確認したろ -</pre> - -<h3>SPFレコードによる送信元の本人確認</h3> -<p> -受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。\ -このときに使うのがSPFレコードである。\ -このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいい\ -IPアドレスを指定する。\ -受信側のMTAは送信元のIPアドレスと、このレコードに\ -記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者\ -に認められているMTAかどうか判断できる。\ -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗るやつから連絡 - 来てるんやけどこいつ本物? - &lt;---------------------------------------- - - IPアドレスが<i>sss.sss.sss.sss</i> - やったら多分本物やわ。(SPFレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>PTRレコード</h3> -<p> -次は逆にIPアドレスからドメインを辿って本人確認する。\ -これに使われるのがPTRレコードである。\ -このレコードはIPアドレスの管理人(ここではさくらインターネット)\ -でないと登録できない。\ -しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを\ -提供しており、PTRレコードをきちんと設定した上でスパムメールを\ -送ると、自分の身元がバレるので、スパムの抑止に繋がる。\ -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - <i>sss.sss.sss.sss</i>ってIPアドレスで - mtkn.jpってドメイン登録されてる? - &lt;---------------------------------------- - - されてるで。(PTRレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DKIM</h3> -<p> -送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。\ -署名は公開鍵方式で行うが、この鍵をドメインキーというようである。\ -この署名が付いたメールをDKIM(DomainKey Identified Mail)という。\ -送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、\ -メール送信時に秘密鍵で署名する:\ -</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - - 本人確認できたわ - おまたせ。 - &lt;---------------------------------------- - - userさんにメール送るで。 - 署名も付けるで。 - ----------------------------------------&gt; -</pre> -<p> -受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:\ -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpが署名付きでメール - くれたんやけどこの署名本物? - &lt;---------------------------------------- - - これで確認してみて(DKIM公開鍵) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3> -<p> -この他DNSにはDMARCレコードというものを登録することができる。\ -これは、以上の本人確認により送信側がにせものであることが確認できた際、\ -受信側にどのような行動を取ってほしいかを記述するものである。\ -これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、\ -受信したサーバーから自分宛てに通報するように頼める\ -(この頼みが聞き入れられるかどうかは多分受信側MTAによる)。 -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗る詐欺師から - メールきたんやけどどないしょ? - &lt;---------------------------------------- - - ここ(postmaster@mtkn.jp)に通報や。 - (DMARCレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h2>サーバーの設定</h2> -<h3>VPSの契約、ドメインの取得</h3> -<p> -VPSとドメインを契約する。\ -今回はVPSをさくらインターネットで、\ -ドメインをムームードメインでそれぞれ契約した。\ -さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい\ -(他のVPSを知らないので比較はできないが)。\ -ムームードメインは安い。管理画面も悪くはない。\ -以前お名前.comでも借りたことがあるが、こちらは広告のメールが\ -やたら届いてうっとうしかった記憶がある。\ -</p> - -<h3>OpenBSDのインストール</h3> -<p> -さくらのVPSにOpenBSDをインストールする。\ -さくらインターネットが用意したISOがあるので、\ -OS再インストールの画面からそれを選べばすぐにインストールきる。\ -でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。\ -</p> -<p> -インストールのこまかい手順は割愛するが、\ -ひとつだけひっかかった点があるので書いておく。\ -インストール先のディスクをセットアップし、OSに必要なファイルを\ -インストールメディアからディスクにコピーすると以下のエラーがでて\ -カーネルパニックになった: -</p> -<pre><code>\ -wdc_atapi_start: not ready, st = 50 -fatal protection fault in supervisor mode -trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410 -gsbase 0xffffffff81908ff0 kgsbase 0x0 -panic: trap type 4, code=0, pc=ffffffff810081a9 -syncing disks...18 18 18 18 18 18 18 18 -</code></pre> -<p> -原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗している\ -ようで、インストールに必要なファイルをウェブ上からダウンロードする方法\ -を選択すると問題なくインストールできた。 -</p> - -<h3>ファイアーフォールの設定</h3> -<p> -メールの送受信等に必要なポートを開ける:\ -</p> -<ul> -<li>TCP 22: ssh接続用</li> -<li>UDP 53: DNSとの通信用</li> -<li>TCP 25: SMTPの通信用</li> -<li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li> -<li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li> -<li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li> -</ul> -<p> -以上の設定を<code>/etc/pf.conf</code>に設定する: -</p> -<pre><code>\ -set skip on lo - -block return # block stateless traffic -pass in log proto tcp from any to any port 22 #ssh - -pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS -pass out proto udp from any to any port 123 #ntp - -pass proto icmp #ping -pass proto tcp from any to any port { 80, 443 } #www -pass proto tcp from any to any port { 25, 587, 993 } #mail -</code></pre> -<p> -<code>pf(4)</code>の設定を反映: -</p> -<pre><code>\ -# pfctl -f /etc/pf.conf -</code></pre> - -<h3>DNSの設定</h3> -<h4>A, MX, SPF, DMARC</h4> -<p> -DNSのレコードを設定する。\ -ムームーDNSの場合、コントロールパネルにログインし、サイドバーから\ -ドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタン\ -をクリックすると設定画面がでるので、以下のように設定する:\ -</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td></td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td>mail</td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td></td> -<td>MX</td> -<td>mail.mtkn.jp</td> -<td>10</td> -</tr> -<tr> -<td></td> -<td>TXT</td> -<td>v=spf1 mx -all</td> -<td></td> -</tr> -<tr> -<td>_dmarc</td> -<td>TXT</td> -<td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td> -<td></td> -</tr> -</tbody> -</table> - -<p> -ひとつめの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>\ -であることも分かる。 -</p> -<p> -次のTXTレコードはSPFレコードである。\ -v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録された\ -IPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信\ -を禁止している。 -</p> -<p> -最後のものはDMARCレコードである。\ -v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメール\ -について、その受信者が受信を拒否するように指定している。\ -rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメール\ -を受信した場合の通報先を指定している。\ -</p> - -<h4>PTR</h4> -<p>\ -PTRレコードを設定する。\ -さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>\ -ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名\ -(mtkn.jp)を入力する。 -</p> - -<h3>OpenSMTPDの設定</h3> -<h4>ユーザーの作成</h4> -<p> -メールの送受信を担当するユーザーを作成する:\ -</p> -<pre><code>\ -# useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail -</code></pre> - -<h4>サーバー証明書の取得</h4> -<p> -<code>httpd(8)</code>の設定ファイルを作成する。\ -<code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。\ -変更箇所はドメイン名だけでいい。\ -編集後、httpdを起動する。\ -</p> -<pre><code>\ -# cp /etc/examples/httpd.conf /etc/ -# vi /etc/httpd.conf -# echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -</code></pre> - -<p> -続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。\ -まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。\ -その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に\ -登録することで、証明書が自動で更新されるようにする。\ -</p> -<pre><code>\ -# cp /etc/examples/acme-client.conf /etc/ -# vi /etc/acme-client.conf -# acme-client -v mail.mtkn.jp -# crontab -e -</code></pre> - -<pre><code>\ -#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd -</code></pre> - -<h4>ドメインキーの作成とDNSへの登録</h4> -<p> -OpenSMTPD用のDKIMフィルターをインストールする。 -</p> -<pre><code>\ -# pkg_add opensmtpd-filter-dkimsign -</code></pre> - -<p> -ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。\ -DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。 -</p> -<pre><code>\ -# openssl genrsa -out /etc/mail/dkim/private.key 1024 -# openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key -# chown -r _dkimsign:_dkimsign /etc/mail/dkim -# chmod 0400 /etc/mail/dkim/private.key -</code></pre> - -<p>\ -作成したドメインキーの公開鍵をDNSに登録する:\ -</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>selector1._domainkey.mail</td> -<td>TXT</td> -<td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td> -<td></td> -</tr> -</tbody> -</table> - -<p> -サブドメインのselector1は\ -以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに -指定してものと同じものであれば他のものでもいい。\ -</p> - -<h4>smtpd.confの設定</h4> -<p> -/etc/mail/smtpd.confを以下の通り変更:\ -</p> -<pre><code>\ -# 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。 -# 証明書のファイルは先程acme-client(1)で取得したもの。 -pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot; -pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot; - -# テーブルの登録 -# ローカルに届いたメールの転送を設定するテーブル -table aliases file:/etc/mail/aliases -# ユーザーの名前と暗号化されたパスワードのテーブル -table passwd file:/etc/mail/passwd -# メールの転送を設定するテーブル -table virtuals file:/etc/mail/virtuals - -# フィルターの登録 -# ドメインキーによる署名を付加するフィルター -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 -# DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター -filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot; -# 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった -# 場合に受信を拒否するフィルター -filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot; - -# 各ネットワークインターフェース毎の処理を設定。 -listen on socket -listen on lo0 -# vio0というインターフェースの25番ポートに届いたものに関する設定。 -# 外部からmtkn.jp宛に届いたものの処理である。 -# 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、 -# 上で設定したDNSに関するフィルターを適応。 -listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\\ - filter { check_rdns, check_fcrdns } -# vio0というインターフェースのsubmission(587番)ポートに関する設定。 -# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される -# メールに関する設定。 -# 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 -# &quot;passwd&quot;という名前で登録したパスワードで認証し、 -# さらにドメインキーでメールに署名する。 -listen on vio0 mask-src port submission smtps pki mtkn.jp\\ - hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign - -# 各種メールの処理を定義する。 -# 各処理が実行される条件はこの後定義する。 -# ローカルメールはデフォルトのまま -action &quot;local_mail&quot; mbox alias &lt;aliases&gt; -# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 -action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\\ - virtual &lt;virtuals&gt; -# 他のドメイン宛ては宛先へ転送。 -# 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で -# 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加 -action &quot;outbound&quot; relay helo "mtkn.jp" - -# どういう条件でどういう処理をするかを定義する。 -# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 -# ここでは/var/vmail/以下に振り分けて保存する。 -match from any for domain mtkn.jp action &quot;domain&quot; -# このサーバー内でのメールはlocal_mailとして処理。 -match from local for local action &quot;local_mail&quot; -# このサーバー内から他所へのメールは宛先に転送 -match from local for any action &quot;outbound&quot; -# 外部から来た他所宛てのメールは認証されているものに限り転送。 -# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 -match auth from any for any action &quot;outbound&quot; -</code></pre> - -<h4>各テーブルの作成</h4> -<p> -上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。\ -<code>/etc/mail/aliases</code>は特に変更しなくてもいい。\ -<code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを\ -保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:\ -</p> -<pre><code>\ -# echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd -<i>パスワードを入力し、エンター、Ctrl-D</i> -</code></pre> - -<p> -<code>/etc/mail/virtuals</code>にはメールの転送を設定できる。\ -以下のようにする:\ -</p> -<pre><code>\ -abuse@mtkn.jp user@mtkn.jp -postmaster@mtkn.jp user@mtkn.jp -webmaster@mtkn.jp user@mtkn.jp -user@mtkn.jp vmail -</code></pre> -<p> -この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。\ -abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど\ -必要なんかな? -</p> - -<h3>Dovecotの設定</h3> -<p> -MDAとして<code>dovecot(1)</code>をインストールする。\ -</p> -<pre><code>\ -# pkg_add dovecot -</code></pre> -<p> -dhparamを作成する(時間がかかる): -</p> -<pre><code>\ -# openssl dhparam -out /etc/ssl/dh.pem 4096 -</code></pre> - -<p> -わかりにくい設定ファイルをどけてシンプルなものに書き直す: -</p> -<pre><code>\ -# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig -# vi /etc/dovecot/dovecot.conf -</code></pre> -<p> -ドキュメントは公式ウェブサイトで確認できる。\ -分量が多すぎて読む気にならない。\ -サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。\ -パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>\ -と暗号化されていないIMAPを<code>port = 0</code>として無効にする。\ -他はとりあえず以下の設定で動く:\ -</p> -<pre><code>\ -# IPv4は全て監視 -listen = * - -# SSL接続のみ許可 -ssl = required - -# SSLに使用するファイル -ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem -ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key -ssl_dh = &lt;/etc/ssl/dh.pem - -# メールの保存場所は各ユーザーのホームディレクトリ。 -# ホームディレクトリの場所は以下のuserdbで設定。 -mail_location = maildir:~ - -# パスワードのファイル。 -# OpenSMTPDと共有。 -passdb { - args = scheme=BLF-CRYPT /etc/mail/passwd - driver = passwd-file -} - -# ユーザーの設定。 -# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> -userdb { - args = uid=vmail gid=vmail home=/var/vmail/%d/%n - driver = static -} - -# 使用するプロトコル。 -protocols = imap lmtp - -# SSLを使ったIMAPSのみを許可。 -service imap-login { - inet_listener imaps { - port = 993 - ssl = yes - } - # Disable imap - inet_listener imap { - port = 0 - } -} -</code></pre> -<pre><code>\ -# rcctl start dovecot -# rcctl enable dovecot -</code></pre> - -<p> -サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように\ -<code>cron(8)</code>に追加しておく: -</p> -<pre><code>\ -crontab -e -</code></pre> - -<pre><code>\ -#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot -</code></pre> - -<h3>テスト</h3> -<p> -手元のメールクライアントから送受信のテストをする。\ -特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。\ -以上の設定で、gmailへの送受信は問題なかった。\ -また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン\ -及び送受信できることも確認した。\ -</p> -<p> -<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> - -<h2>参考文献</h2> -<ul> -<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> -<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> -<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> -<li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li> -</ul> diff --git a/man/computer/openbsd_on_u9310e.html b/man/computer/openbsd_on_u9310e.html @@ -1,192 +0,0 @@ -<h1>OpenBSD on Fujitsu LIFEBOOK U9310/E</h1> -<time>2025-04-28</time> - -<h2>はじめに</h2> -<p> -大阪の日本橋で状態のいいLIFEBOOKを見つけたので購入した。\ -OpenBSDをインストールしたらおおむね問題なく動いた。\ -</p> - -<h2>ハードウェア</h2> -<img src="images/openbsd_on_u9310e_1.jpg" alt="U9310/E"> -<p> -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> - -<h2>内部</h2> -<p> -分解は簡単。\ -電源を落して、裏面にあるネジを全部外せば裏蓋が開く。\ -ツメで引っ掛けていたりしないので外しやすい。\ -裏蓋にはバッテリーの絵が描かれたボタンがあって、\ -いかにも押してほしそうな顔をしていたので一応押してから分解した。\ -組み立てた後は電源ケーブルを繋がないと電源が入らなかった。\ -おそらくバッテリーとの接続を切断するためのボタンなのだと思う。\ -</p> -<img src="images/openbsd_on_u9310e_2.jpg" alt="U9310/E の内部"> -<p> -CPUクーラー、ヒートシンク、Wi-Fiカード、WWANカード、SSDは簡単に外せた。\ -他のものもだいたい分解しやすそうである。\ -電源プラグが交換できるのはポイントが高い。\ -上でも書いたがメモリははんだ付けされていて交換できない。\ -キーボードも外せそうではあるがマザーボードを取ったうえネジが沢山あったのでやめにした。\ -</p> -<h2>OpenBSDのサポート</h2> -<table> -<tr> -<th>機能</th> -<th>サポート</th> -<th>備考</th> -</tr> - -<tr> -<td>音</td> -<td>○</td> -<td> -Intel 400 Series HD Audio、コーデック: Realtek ALC255。<br>\ -azaliaによりサポート。\ -メディアキーによる音量調整が可能。\ -</td> -</tr> - -<tr> -<td>バッテリーの状態</td> -<td>○</td> -<td> -acpibatによりサポート。 -</td> -</tr> - -<tr> -<td>キーボードバックライト</td> -<td>?</td> -<td> -今回購入したものには搭載されていなかった。 -</td> -</tr> - -<tr> -<td>ハイバーネーション</td> -<td>○</td> -<td> -ZZZが使える。 -</td> -</tr> - -<tr> -<td>スリープ</td> -<td>○</td> -<td> -zzzが使える。\ -液晶を閉じると自動でスリープし、開くと問題なく復帰できる。\ -電源ランプが点滅するのが少しじゃま。 -</td> -</tr> - -<tr> -<td>タッチパッド</td> -<td>○</td> -<td> -imtでサポート。 -</td> -</tr> - -<tr> -<td>USB type-A</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>USB type-C、Thunderbolt</td> -<td>?</td> -<td> -充電はできた。\ -Thunderboltはケーブルがないのでテストできない。\ -</td> -</tr> - -<tr> -<td>SDカードリーダー</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>映像出力</td> -<td>○</td> -<td> -inteldrmでサポート。\ -輝度の調整はxbacklightで出来るが、メディアキーは使えなかった。\ -HDMIの出力も問題ない。 -</td> -</tr> - -<tr> -<td>ウェブカメラ</td> -<td>○</td> -<td> -SunplusIT Inc FJ Camera。\ -uvideoでサポート。 -</td> -</tr> - -<tr> -<td>Ethernet</td> -<td>○</td> -<td> -emでサポート。 -</td> -</tr> - -<tr> -<td>Wi-Fi</td> -<td>○</td> -<td> -Intel Wi-Fi 6 AX201。\ -iwxでサポート。 -</td> -</tr> - -<tr> -<td>WWAN</td> -<td>?</td> -<td> -Sierra Wireless, Incorporated EM7430。\ -umbにより認識はされてる。\ -ifconfigでもネットワークインターフェースとして表示されてる。\ -simカード持ってないから試せない。 -</td> -</tr> - -<tr> -<td>Bluetooth</td> -<td>×</td> -<td> -OpenBSDはBluetoothが嫌い。\ -ugenにより認識はされてる。 -</td> -</tr> - -</table> diff --git a/man/computer/rp2040_1.html b/man/computer/rp2040_1.html @@ -1,937 +0,0 @@ -<h1>RP2040 SDKなしでLチカ</h1> -<time>2023-04-25</time>: 作成<br /> -<time>2024-02-25</time>: ベクターテーブルの修正 - -<h2>はじめに</h2> -<p> -パタヘネのRISC-V<sup>[1]</sup>版を買って一通り読んだらアセンブリ言語\ -で組込のプログラミングがしたくなった。\ -RISC-Vのマイコンボードが欲しかったのだが、安くていい感じ\ -のものが見付からなかった。\ -代わりに秋月電子通商でArmのものがあった。\ -RP2040マイコンボードキット<sup>[2]</sup>というものである。\ -ウェブ上の情報も多く、データシート<sup>[3]</sup>もしっかりしていそうなので、\ -とりあえずこれを買ってみた。\ -</p> -<p> -一般的にはSDK<sup>[4]</sup>をダウンロードしてあらかじめ用意された\ -ライブラリを使って開発するようだが、これはビルドシステムとしてcmake\ -というのを使っている。これがOpenBSDでは何かエラーがでて動かなかった。\ -僕はこういう便利ツールが嫌いだ。どうせ使わんからいいんやけど。\ -関係ないけど途中から開発環境がLinuxに替わった。\ -SDKには便利な関数がたくさん用意されているので楽である。\ -ハードウェアの面倒な部分がプログラマから見えないようにしているからである。\ -しかし今回はその面倒な部分に触れてみたくて買ったので、SDKを使うと意味がない。\ -</p> -<p> -ということでSDKなしで開発してみる。\ -とりあえず定番のLチカをば。\ -</p> -<p> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a> -</p> - -<h2>動作環境</h2> -<ul> -<li>Arch Linux 6.2.12-arch1-1 - <ul> - <li>arm-none-eabi-binutils 2.40-1</li> - <li>GNU Make 4.4.1</li> - </ul> -</li> -<li>OpenBSD 7.3 - <ul> - <li>arm-none-eabi-binutils 2.31.1</li> - <li>make (バージョン?)</li> - </ul> -※<code>make flash</code>は動かん。<code>dmesg</code>でデバイス確認して手動で\ -マウントする必要がある。 -</li> -</ul> - -<h2>Boot Process</h2> -<p> -RP2040は電源を入れるといくつかの段階(ここでは関係ないので省略。\ -データシート「2.8.1 Processor Controlled Boot Sequence」に詳しく書いてある)\ -を踏んだあと、外部のフラッシュROMの先頭から\ -256バイトを内部のSRAMにコピーして、フラッシュにプログラムが書き込まれているか\ -どうか確認する。RP2040はフラッシュの先頭252バイトから計算したCRC32チェックサム\ -を、直後の253バイト目から256バイトに記録することになっている。\ -起動時にこのチェックサムを確認することで、フラッシュにプログラムが\ -書き込まれているかどうか確かめている。コピーした最後の4バイトと\ -起動時に最初の252バイトから計算したチェックサムが一致していれば、\ -そのままコピーしてきた256バイトの先頭にPCをセットして実行を開始する。\ -一致しなければUSBデバイスモードに切り替わり、パソコンに接続すると\ -ストレージとして認識される。このストレージにUF2という形式に変換した\ -プログラムをコピーするとプログラムがフラッシュROMやSRAMに書き込まれる。 -</p> -<p> -以上のことから、プログラムを実行するためにはCRC32を計算し、UF2という形式\ -に変換することが必要である。ソースコードからの流れは以下の通り: -</p> -<pre>\ -source bin bin with -code ----------&gt; object ------&gt; elf --------&gt; bin -------&gt; with --------&gt; crc32 in - crc32 uf2 format - assemble link objcopy bincrc bin2uf2 -</pre> - -<h2>CRC(巡回冗長検査)</h2> -<p> -入力のデータをごにょごにょしてある値を出力する。\ -</p> -<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"> -<p> -データ転送等に伴う偶発的な誤りの検査によく使われている<sup>[5]</sup>。 -</p> -</blockquote> -<p> -らしい。 -</p> -<p> -入力のビットを一列に並べて、除数で「割り算」していく。\ -この「割り算」が多項式の除算に似ているので、この除数をCRC多項式というらしい。\ -ただし多項式の除算と違い、引き算するところをXORする。\ -CRC32の場合、除数は33ビットである。\ -33ビットで割ると32ビットの余りが残る。この余りがCRC32のチェックサムである。\ -除数は色々あるようだが、標準的なものがWikipedia<sup>[5]</sup>に列挙されている。\ -除数<code>1011</code>を使ったCRC3の計算の手順は以下の通り: -</p> -<pre><code>\ -1110101011011100110101101101111 入力(適当) -1011 除数(4ビット) -------------------------------- - 101101011011100110101101101111 結果(入力と除数のXOR) - 1011 - ------------------------------ - 00001011011100110101101101111 - 1011 - ------------------------- - 000011100110101101101111 - 1011 - -------------------- - 1010110101101101111 - 1011 - ------------------- - 001110101101101111 - 1011 - ---------------- - 101101101101111 - 1011 - --------------- - 00001101101111 - 1011 - ---------- - 110101111 - 1011 - --------- - 11001111 - 1011 - -------- - 1111111 - 1011 - ------- - 100111 - 1011 - ------ - 01011 - 1011 - ---- - 000 CRC3チェックサム -</code></pre> -<p> -普通の割り算と基本は同じであるが、引き算の部分だけXORになっている。\ -</p> -<p> -以上の計算をプログラムの先頭252バイトに対して、33ビットの除数を用いて行う。\ -データの並べ方は、上の例において左側を先頭に、フラッシュROM上の0番地から、\ -各バイトは最上位ビットから順に並べる。\ -入力のデータは253バイト目から256バイト目に<code>0</code>をひっつけて計算する。\ -これは多分予め長さが分からないデータでも計算できるようにしたかったからかな。\ -除数は<code>0x104c11db7</code>である(最上位ビットは常に1なのでデータシート\ -では省略されている)。\ -</p> -<p> -入力データは1バイトづつ処理したいみたいである。多分通信等で使う都合である。\ -この時XORは結合則が成り立つので1バイト処理した結果と\ -次のバイトとをXORして次の処理の入力として利用することができる: -</p> -<pre><code>\ -111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) -|......| -111000110000000000000000000000000 先頭1バイト -100000100110000010001110110110111 除数 ------------------------------------------------------------------------- -011000010110000010001110110110111 - 100000100110000010001110110110111 - ----------------------------------------------------------------------- - 010000001010000110010011011011001 - 100000100110000010001110110110111 - ---------------------------------------------------------------------- - 000000110010001110101000000000101 -|......| - 110010001110101000000000101000000 1バイト目の結果 - |......| - 10000001 入力の2バイト目 - ---------------------------------------------------------------- - 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR - 100000100110000010001110110110111 除数 - ---------------------------------------------------------------- - 000100011011010010001111100110111 - . - . - . -</code></pre> -<p> -以上の操作は以下のようなアルゴリズムのループで実装できる。\ -</p> -<ul> -<li>前回の結果と、入力データの次のバイトをXOR</li> -<li> - <ul> - <li>先頭の1ビットが1の場合、除数とXORを取り左シフト</li> - <li>先頭の1ビットが0の場合、そのまま左シフト</li> - </ul> -</li> -</ul> -<p> -これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。\ -上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>\ -以外にすることもできる。そうした方がいろいろいいこともあるらしい。\ -RP2040では<code>0xffffffff</code>を使う。\ -更にこの工程を32ビットの<code>int</code>だけで行うことを考える: -</p> -<pre><code>\ -111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) - -11111111111111111111111111111111 0xffffffff -11100011000000000000000000000000 先頭1バイトを24ビットシフト --------------------------------- XOR -00011100111111111111111111111111 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00111001111111111111111111111110 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01110011111111111111111111111100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -11100111111111111111111111111000 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -11001111111111111111111111110000 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -11001011001111101110001001000111 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -10010110011111011100010010001110 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -10010010101111001101100100111001 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -00100101011110011011001001110010 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -00100001101110001010111111000101 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01000011011100010101111110001010 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -10000110111000101011111100010100 1バイト目の結果 - -10000001 入力の2バイト目 --------------------------------- XOR -00000111111000101011111100010100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00001111110001010111111000101000 -. -. -. -</code></pre> -<p> -これを実装したのが以下のコード:\ -</p> -<pre><code>\ -uint32_t -crc32(uint8_t *idata, size_t len) -{ - uint32_t pol = 0x04C11DB7; - uint32_t c = 0xFFFFFFFF; - uint32_t b; - - for (int i = 0; i &lt; len; i++) { - b = idata[i] &lt;&lt; 24; - c ^= b; - for (int j = 0; j &lt; 8; j++) { - c = c &gt;&gt; 31 & 1 ? c &lt;&lt; 1 ^ pol : c &lt;&lt; 1; - } - } - - return c; -} -</code></pre> -<p> -<code>main()</code>関数では上の<code>crc32()</code>に、<code>idata</code>として入力\ -となるバイナリデータの先頭を、<code>len</code>として<code>252</code>を渡してCRC32\ -を計算させる。その後、出力先のファイルに入力元のデータをコピーしていき、253バイト\ -目から256バイト目だけ、計算したCRC32に置き換える。入力元のこの場所にデータが\ -書き込まれていないかどうかは確かめていない。 -</p> - -<h2>UF2(USB Flashing Format)</h2> -<p> -Microsoftが開発したフラッシュ書き込み用のファイル形式らしい: -<blockquote cite="https://github.com/microsoft/uf2"> -<p> -UF2 is a file format, developed by Microsoft for PXT (also known as -Microsoft MakeCode), that is particularly suitable for flashing microcontrollers -over MSC (Mass Storage Class; aka removable flash drive)<sup>[6]</sup>. -</p> -</blockquote> -<p> -このファイルに変換する上で必要な情報はGitHubのmicrosoft/uf2<sup>[6]</sup>に\ -表として纏められている: -<blockquote cite="https://github.com/microsoft/uf2"> -<table> -<thead><tr> -<th>Offset</th><th>Size</th><th>Value</th> -</tr></thead> -<tbody> -<tr> -<td>0</td> -<td>4</td> -<td>First magic number, <code>0x0A324655</code> (<code>"UF2\n"</code>)</td> -</tr> -<tr> -<td>4</td> -<td>4</td> -<td>Second magic number, <code>0x9E5D5157</code></td> -</tr> -<tr> -<td>8</td> -<td>4</td> -<td>Flags</td> -</tr> -<tr> -<td>12</td> -<td>4</td> -<td>Address in flash where the data should be written</td> -</tr> -<tr> -<td>16</td> -<td>4</td> -<td>Number of bytes used in data (often 256)</td> -</tr> -<tr> -<td>20</td> -<td>4</td> -<td>Sequential block number; starts at 0</td> -</tr> -<tr> -<td>24</td> -<td>4</td> -<td>Total number of blocks in file</td> -</tr> -<tr> -<td>28</td> -<td>4</td> -<td>File size or board family ID or zero</td> -</tr> -<tr> -<td>32</td> -<td>476</td> -<td>Data, padded with zeros</td> -</tr> -<tr> -<td>508</td> -<td>4</td> -<td>Final magic number, <code>0x0AB16F30</code></td> -</tr> -</tbody> -</table> -</blockquote> - -<p> -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バイト目にブロックの通し番号と総数をそれぞれ書き込めばいい。\ -ブロックの通し番号はデータのついでに書き込めるが、総数はデータを全部\ -さばいた後でないと分からないので、最後全てのブロックにまとめて書き込むようにした。\ -できたのが以下のコード: -</p> -<pre><code>\ -#include &lt;stdio.h&gt; -#include &lt;stdint.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;string.h&gt; - - -size_t -fwrite32l(uint32_t d, FILE *f) -{ - int i; - uint8_t b; - for (i = 0; i &lt; 32; i += 8) { - b = (uint8_t) (d &gt;&gt; i & 0xff); - fwrite(&amp;b, 1, 1, f); - if (ferror(f)) { - fprintf(stderr, "Fwrite32l: write error.\n"); - return 0; - } - } - return 4; -} - -int -main(int argc, char *argv[]) -{ - FILE *src = NULL, *dst = NULL; - size_t sdata = 476; - int retnum = 0; - - uint32_t mag1 = 0x0A324655; - uint32_t mag2 = 0x9E5D5157; - uint32_t flags = 0x00002000; // familyID present - uint32_t addr = 0x10000000; - uint32_t nbyte = 256; - uint32_t blk = 0; - uint32_t nblk = 0; - uint32_t famid = 0xe48bff56; - uint8_t data[sdata]; - uint32_t mag3 = 0x0AB16F30; - - memset(data, 0, sdata); - - if (argc != 3) { - fprintf(stderr, "Usage: %s src dst\n", argv[0]); - exit(1); - } - - if ((src = fopen(argv[1], "rb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[1]); - retnum = 1; - goto defer; - } - if ((dst = fopen(argv[2], "wb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - while (!feof(src)) { - fwrite32l(mag1, dst); - fwrite32l(mag2, dst); - fwrite32l(flags, dst); - fwrite32l(addr, dst); - fwrite32l(nbyte, dst); - fwrite32l(blk, dst); - fwrite32l(nblk, dst); // dummy - fwrite32l(famid, dst); - - fread(data, 1, nbyte, src); - if (ferror(src)) { - fprintf(stderr, "Read error: %s.\n", argv[1]); - retnum = 1; - goto defer; - } - fwrite(data, 1, sdata, dst); - if (ferror(src)) { - fprintf(stderr, "Write error: %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - fwrite32l(mag3, dst); - - addr += nbyte; - blk++; - nblk++; - } - - for (int i = 0; i &lt; nblk; i++) { - if (i == 0) - if (fseek(dst, 24, SEEK_SET) &lt; 0) { - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - fwrite32l(nblk, dst); - if (i &lt; nblk - 1) - if(fseek(dst, 512 - 4, SEEK_CUR) &lt; 0){ - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - } - -defer: - if (src) - fclose(src); - if (dst) - fclose(dst); - return retnum; -} -</code></pre> -<p>\ -<code>fwrite32l()</code>関数は指定されたファイルに32ビットの整数を\ -下位バイトから順に書き込む関数である。バイトオーダーとかややこしそうなので\ -作っておいたけど必要なのかな?あと名前が気に入らない。\ -</p> -<p> -CRC32のチェックサムが書き込まれたバイナリファイルを、このプログラムでUF2に\ -変換し、生成されたファイルをUSBストレージとして接続したRP2040にコピーすれば\ -フラッシュROMに書き込まれる。 -</p> - -<h2>Flash Second Stage</h2> -<p> -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にデータをコピーする\ -ことなく命令を実行できるので、速くて便利だという。 -</p> -<p> -しかしこのSSIコントローラはSynopsysという会社のDW_apb_ssiというIPを\ -使っているようで、データシートのSSIコントローラの章は多分Synopsysの\ -人が書いている。その他の章はRaspberry Pi財団の書いたブリティッシュイングリッシュ\ -だが、この部分だけ多分ネイティブじゃない人の書いたいい加減な英語である。誤植も多い。\ -何日かかけて理解しようとしたがよく分からん。不毛なので一旦諦めた。\ -</p> -<p> -RP2040には内部にもROMがあり、はバージョン情報や電源を投入した時の動作、\ -その他便利な関数が書き込まれている。この関数の中に外部のフラッシュROMと\ -SSIコントローラを設定するものも含まれているので、今回はこれを利用した。\ -ただしこの方法だとフラッシュROMとの通信方式がStandard SPIのままなので少し\ -遅いらしい。詳しくはデータシートの「2.3.8. Bootrom Contents」を参照。 -</p> -<p> -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モード\ -になる: -</p> -<pre><code>\ -setup_xip: - ldr r3, rom_base - - ldrh r0, [r3, #0x14] // rom_func_table - ldr r1, =('C' | 'X' &lt;&lt; 8) // _flash_enter_cmd_xip() - ldrh r2, [r3, #0x18] // rom_table_lookup - blx r2 - blx r0 -/* ... */ -rom_base: - .word 0x00000000 -</code></pre> - -<p> -XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。\ -エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブル\ -の設定である。Armのマニュアル<sup>[7]</sup>によると、\ -初期スタックポインタとエントリーポイントはベクターテーブルの\ -<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:\ -</p> -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition"> -<table> -<caption> -Table 7.3. Exception numbers -</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> -</table> -</blockquote> - -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table"> -<table> -<caption> -Table 7.4. Vector table format -</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> -</table> -</blockquote> -<p> -RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)という\ -レジスタに書き込むことで設定する。\ -このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は\ -256バイトでアラインする必要がある。\ -ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からは\ -ラベルを使ってアクセスすることにする。\ -以上をまとめると以下のコードになる:\ -</p> -<pre><code> ldr r0, =vectors - ldr r1, m0plus_vtor - str r0, [r1, #0] // vector table - ldr r1, [r0, #4] // entry point - ldr r0, [r0, #0] // stack pointer - mov sp, r0 - bx r1 - -/* ... */ - -m0plus_vtor: - .word 0xe0000000 + 0xed08 -</code></pre> -<p>\ -なお以上のコードは<code>.boot2</code>という名前のセクションにしてある。 -</p> - -<h2>メインのコード(<code>main.s</code>)</h2> - -<h3>ベクターテーブル</h3> -<p> -上で説明したように、ベクターテーブルのアドレスは256バイトの境界\ -にないといけないが、<code>boot2.s</code>をフラッシュの最初の256バイト\ -に配置しており、<code>main.s</code>はその直後から始まるように\ -リンクする。\ -そのためメインのコードの最初にベクターテーブルを配置すればいい。\ -ここでは割り込みの処理は考えないので、初期スタックポインタと\ -エントリーポイントだけである。初期スタックポインタはSRAMの最後?\ -(<code>0x20040000</code>)、エントリーポイントはエントリーポイントの\ -ラベルを用いて設定した。\ -また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、\ -<code>.global</code>宣言をつけておく: -</p> -<pre><code> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) -</code></pre> -<p> -<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> - -<h3>GPIOの設定</h3> -<p> -電源投入直後、RP2040の周辺機器はリセット状態になっている。\ -まずは今回利用するGPIOのリセット状態を解除する必要がある。\ -データシートの「2.14. Subsystem Resets」には以下のように書かれている: -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -Every peripheral reset by the reset controller is held in reset at power-up. -It is up to software to deassert the reset of peripherals it intends to use. -</p> -</blockquote> -<p> -リセット状態を解除するには、RESETS_BASE(<code>0x4000c000</code>)から\ -<code>0x0</code>バイト目のRESETS: RESETレジスタのうち利用したい周辺機器の\ -ビットを<code>0x0</code>にすればいい。 -GPIOはIO Bank 0なので(これ明記されてなくない?)、RESETS: RESETレジスタの\ -IO_BANK0(5番ビット)を<code>0x0</code>にする。 -</p> -<h4>レジスタのアトミックなクリア</h4> -<p> -RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>に\ -したい。この時、まずこのレジスタを読み込んでから<code>~(1 &lt;&lt; 5)</code>と\ -論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを\ -一回の<code>str</code>でしかもアトミックにできる機能が用意されている。\ -今回の場合アトミックかどうかは関係ないと思うけど。\ -</p> -<p> -各レジスタには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> -<h4>リセット状態の確認</h4> -<p>\ -リセットの解除はすぐに完了するわけではないようである。\ -リセットの解除が完了したかどうか確認するにはRESETS: RESET_DONE\ -レジスタ(RESETS_BASEから<code>0x8</code>バイト目)の該当するビット\ -(ここでは5番目のビット)を読む。この値が<code>0x1</code>であれば\ -リセットの解除が完了している。<code>0x0</code>であれば処理が進行中\ -なので<code>0x1</code>が返ってくるまで繰り返し読み込んで<code>0x0</code>\ -になるまで待機する。\ -ところでこのレジスタはリセットの解除が完了したかどうか確かめるもの\ -なので、RESET_DONEという名前はどうなん? -<p> -以上から、GPIOのリセットを解除するのは以下のコード: -</p> -<pre><code>\ -reset: - // unreset gpio - mov r0, #1 - lsl r0, r0, #5 // io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET -reset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - tst r0, r1 - beq reset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの機能の選択</h3> -<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> -<p> -GPIO25番の機能を選択するにはIO_BANK0_BASE(<code>0x40014000</code>)から\ -<code>0xcc</code>番目のGPIO25_CTRLレジスタの下位5ビットに、該当する機能\ -の番号を書き込めばいい。データシートの「2.19.2 Function Select」にある\ -表を見ると、GPIO25番のSIOは5である:\ -</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #5 // sio - mov r1, #0xcc - str r0, [r3, r1] // IO_BANK0: GPIO25_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>GPIOの出力を有効化</h3> -<p> -GPIO25番がSIOになったので、次にこのピンからの出力を有効化する。\ -既定値では出力は無効になっている。ハイインピーダンスってことなのかな?\ -出力を有効にするには、SIO_BASE(<code>0xd0000000</code>)から\ -<code>0x24</code>バイト目のSIO: GPIO_OEレジスタの該当するビット\ -(25番のピンなので25番ビット)を<code>0x1</code>にする: -</p> -<pre><code> // enable gpio output - ldr r3, sio_base - mov r0, #1 - lsl r0, r0, #25 // gpio25 - str r0, [r3, #0x24] // SIO: GPIO_OE - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> - -<h3>LEDの点滅</h3> -<p>\ -以上でGPIOの設定は完了したので、あとは実際にLEDに電圧を掛けるだけである。\ -レジスタのアドレスに<code>0x1000</code>を足したものに書き込むと\ -アトミックなレジスタのXORができると書いたが、SIOはこの機能がサポート\ -されていないようである。データシートの「2.1.2 Atomic Register Access」に、 -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -The SIO (Section 2.3.1), a single-cycle IO block attached directly to the cores' -IO ports, does <strong>not</strong> support atomic accesses at the bus level, -although some individual registers (e.g. GPIO) have set/clear/xor aliases. -</p> -</blockquote> -<p> -と書かれている。そのかわりここにも書かれている通り、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> - -<pre><code> // blink led on gpio25 - ldr r4, sio_base - mov r5, r0 // r0 = 1 &lt;&lt; 25 -loop: - str r5, [r4, #0x1c] // SIO: GPIO_OUT_XOR - bl delay - b loop - -delay: - mov r0, #1 - lsl r0, r0, #20 -delay_loop: - sub r0, r0, #1 - bne delay_loop - bx lr - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> -<p>\ -なお以上のコードは<code>.text</code>セクションである。\ -</p> - -<h2>リンカスクリプト</h2> -<p> -以上のコードには<code>.boot2</code>、<code>.text</code>\ -の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から\ -256(<code>0x100</code>)バイト目まで、<code>.text</code>\ -はその後ろに続くように配置する: -<pre><code>\ -MEMORY -{ - FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k -} - -SECTIONS -{ - .boot2 : { - *(.boot2) - . = 0x100; - } > FLASH - - .text : { - *(.text) - } > FLASH -} -</code></pre> - -<h2>Makefile</h2> -<p> -以上のソースコードは以下のように配置している: -</p> -<pre>\ -rp2040 -├── ex1 -│   ├── Makefile -│   ├── boot2.s -│   ├── main.s -│   └── memmap.ld -└── tools - ├── Makefile - ├── bin2uf2.c - └── bincrc.c -</pre> -<p> -toolsディレクトリのMakefileは同じディレクトリのソースファイルを<code>$(CC)</code>\ -でコンパイルするだけのものである(個人的な趣味で<code>tcc</code>を使っている)。\ -ex1ディレクトリのMakefileは以下の通り: -</p> -<pre><code>\ -AS = arm-none-eabi-as -LD = arm-none-eabi-ld -OBJCOPY = arm-none-eabi-objcopy -BINCRC = ../tools/bincrc -BIN2UF2 = ../tools/bin2uf2 - -MCPU = -mcpu=cortex-m0plus -ASFLAGS = $(MCPU) -CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c -LDFLAGS = --no-relax -nostdlib - -all: tools led.uf2 - -clean: - rm -f *.o *.elf *.uf2 *.bin - cd ../tools &amp;&amp; make clean - -.s.o: - $(AS) $(ASFLAGS) -o $@ $&lt; - -led.elf: boot2.o main.o memmap.ld - $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o main.o - -led.bin: led.elf - $(OBJCOPY) -O binary led.elf $@ - -led.uf2: led.bin - $(BINCRC) led.bin led_crc.bin - $(BIN2UF2) led_crc.bin $@ - -flash: all - mount /dev/disk/by-label/RPI-RP2 /mnt - cp led.uf2 /mnt - -tools: - cd ../tools &amp;&amp; make -</code></pre> - -<p> -RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し、ex1ディレクトリで\ -</p> -<pre><code>\ -$ make -# make flash -</code></pre> -<p> -とすればプログラムがRP2040のボードに書き込まれて実行が開始される。\ -</p> - -<h2>最後に</h2> -<p> -光あれ。 -</p> - -<h2>参考</h2> -<ul> -<li> -[1] Hennesy, J. L. and Patterson, D. A. 2017. Computer Organization And Design RISC-V Edition. -</li> -<li> -[2] <a href="https://akizukidenshi.com/catalog/g/gK-17542/">RP2040マイコンボードキット.秋月電子通商</a> -</li> -<li> -[3] <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[4] <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -[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> -</li> -<li> -[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a> -</li> -<li> -[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -</ul> diff --git a/man/computer/rp2040_2.html b/man/computer/rp2040_2.html @@ -1,595 +0,0 @@ -<h1>RP2040 SDKなし2 Clock、UART</h1> -<time>2024-02-22</time><br /> -<time>2024-02-27</time>: リセット解除の間違いを修正。 -<p> -今回はClockとUARTを設定してパソコンに繋ぎ、\ -キーボードからの入力をオウム返しするプログラムを作成する。 -<p> -<p> -前回: <a href="rp2040_1.html">RP2040 SDKなしでLチカ</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex2 -</p> - -<h2>動作環境</h2> -<ul> -<li>Void Linux - <ul> - <li>cross-arm-none-eabi-binutils-2.32_2</li> - <li>GNU Make 4.4.1</li> - <li>minicom version 2.7.1</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>Clock</h2> - -<h3>リング発振回路</h3> -<p>\ -RP2040にはリング発振回路というのが内蔵されている。\ -これは自分の出力を反転させようとするもので、\ -不安定だが高速で消費電力の少ないクロックとして用いられる。\ -RP2040は電源を入れると、このリング発振回路を動作用のクロックとして\ -用いている。この発振回路の周波数は、チップの製造過程での誤差、動作時の電圧、\ -動作温度によって変動するので、正確な周波数が必要な用途には向かない。\ -</p> - -<h3>水晶発振子</h3> -<p>\ -秋月電子通商で購入したRP2040マイコンボードには外部クロックとして、\ -12MHzの水晶発振子が付属する。水晶発振子はリング発振回路より電力を消費するが、\ -より正確である。\ -</p> - -<h3>PLL</h3> -<p>\ -水晶振動子を入力として、周波数を数倍にしたものを出力するもの。\ -電気的な話はよく知らない。データシートの「2.18.2. Calcurating PLL parameters」\ -によると、入力周波数を<code>FREF</code>としたときの出力周波数は\ -<code>(FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2)</code>となる。\ -これらの変数はそれぞれ設定用のレジスタに値を保存することで変更できる。\ -</p> - -<h2>UART</h2> -<p> -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> -<pre><code>\ -$ minicom -D /dev/ttyUSB0 -</code></pre> -<p> -とすると接続できる。 -</p> - -<h2>main.s</h2> -<h3>初期設定</h3> -<p> -後で見るように、UARTの動作には多分水晶発振子とPLLが必要なので、\ -まずはそれを設定する。\ -起動後、メインのプログラムが読み込まれるまでの<code>boot2</code>は\ -前回と同じものである。\ -<code>main.s</code>ではまず前回と同様に初期スタックポインタとエントリーポイント\ -を定義する: -</p> -<pre><code> .section .vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point -</code></pre> -<p> -続いて利用するサブシステムのリセットを解除する。\ -PLLとUARTが追加されている。\ -今回使うUARTはUART0だけである。\ -なお、UARTはclock_periが有効化されるまでリセット状態の解除が完了しない\ -ようなので、unreset_chkからは外してある:\ -</p> -<pre><code> .section .text -reset: - // unreset gpio, pll_sys, uart0 - ldr r0, =(1 &lt;&lt; 22 | 1 &lt;&lt; 12 | 1 &lt;&lt; 5) // uart0 | pll_sys | io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET - mov r1, #1 - lsl r1, #22 - bic r0, r1 // uart stays in reset state until clock_peri is enabled -unreset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - bic r0, r1 - bne unreset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの設定</h3> -<p> -次にGPIOの役割を設定する。\ -前回はLEDを点滅させるためにGPIO25をSIOに設定したが、\ -今回はGPIO0とGPIO1をUART0にする: -</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #2 // uart0 - mov r1, #0x4 - str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL - mov r1, #0xc - str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>Clockの設定</h3> -<p> -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>で、 -</p> -<pre><code>\ -#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER) -</code></pre> -<p> -と定義されている(PICO_XOSC_STARTUP_DELAY_MULTIPLIERは1)。\ -とりあえず47に設定しているが、試しに0や1にしても動いた。よくわからん。\ -</p> -<p> -待ち時間を設定したら発振子を起動する。\ -XOSC: CTRLに起動用のコマンド的なものを入力し、周波数が安定するのを待つ。\ -</p> -<p> -以上を実装したのが以下のコード: -</p> -<pre><code> // setup xosc - ldr r3, xosc_base - mov r0, #47 // start up delay for 12MHz rosc (xosc?) - str r0, [r3, #0xc] // XOSC: STARTUP - ldr r0, =(0xfab &lt;&lt; 12 | 0xaa0) - str r0, [r3, #0] // XOSC: CTRL -wait_xosc: - ldr r0, [r3, #0x4] // XOSC: STATUS - lsr r0, r0, #31 // STABLE bit - beq wait_xosc - -/* ... */ - -xosc_base: - .word 0x40024000 -</code></pre> - -<h3>PLLの設定</h3> -<p> -水晶発振子が起動できたので、次にPLLを設定する。\ -CPUが133MHzまで対応しているので133MHzになるようにした。\ -</p> -<p> -PLLは入力となる振動(ここでは水晶発振子の振動)を加工して\ -周波数を上げたり下げたりする。\ -出力の周波数は以下の式で決まる: -</p> -<pre>(FREF / REFDIV) * FBDIV / (POSTDIV1 * POSTDIV2)</pre> -<p> -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つの値の差が大きい方がいいと書いている)。 -</p> -<p> -PLL設定の手順は、FBDIVの設定、PLLとVCOの起動、VOCが安定するまで待機、\ -POSTDIV1とPOSTDIV2の設定、Post Dividerの起動、そして最後にシステムとUARTのクロック\ -を今設定したPLLに変更、である。\ -以上を実装したのが以下のコード: -</p> -<pre><code> // setup pll_sys 133MHz - ldr r3, pll_sys_base - // set feedback divider - mov r0, #133 - str r0, [r3, #0x8] // PLL: FBDIV_INT - // power on pll and vco - ldr r0, =(1 &lt;&lt; 5 | 1) // VCOPD | PD - ldr r1, atomic_clr - add r1, r1, #0x4 - str r0, [r3, r1] // PLL: PWR - // wait vco to lock -wait_vco: - ldr r0, [r3, #0] // PLL: CS - lsl r0, r0, #31 - beq wait_vco - // setup post dividers - ldr r0, =(4 &lt;&lt; 16 | 3 &lt;&lt; 12) - str r0, [r3, #0xc] // PLL: PRIM - // power on post divider - mov r0, #8 // POSTDIVPD - str r0, [r3, r1] // PLL: PWR - - // set system clock clksrc_pll_sys - ldr r3, clocks_base - ldr r0, =(0x0 &lt;&lt; 5 | 0x1) - str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL - // enable clk_peri - mov r0, #1 - lsl r0, r0, #11 - str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL - -/* ... */ - -atomic_clr: - .word 0x00003000 -clocks_base: - .word 0x40008000 -pll_sys_base: - .word 0x40028000 -</code></pre> - -<h3>UARTの設定</h3> -<p> -データシートによるとUART設定の手順は以下の通り: -</p> -<ul> -<li>リセットの解除</li> -<li>clock_periの設定</li> -<li>UARTの有効化</li> -<li>FIFOの有効化</li> -<li>転送速度の設定</li> -<li>フォーマットの設定</li> -</ul> -<p> -上の2つは既に終えている。\ -残りの部分はこの順番どおりに設定しても動かなかった。\ -C言語で書かれたサンプルを見ると、クロックを設定した後、\ -転送速度の設定、UARTの有効化、FIFOの有効化の順になっている。\ -そのとおりにすると動いた。\ -理由はよく理解していないが、変数を設定してから起動するほうが素直ではある。\ -</p> -<p> -転送速度はminicomのデフォルトである115200 baudに設定する。\ -データシート「4.2.7.1. Baud Rate Calculation」の計算式において、\ -クロック周波数を125MHzから133MHzに変えて計算して、\ -BRDI=72、BDRF=0.157(=10/64)となる。\ -この数値をUART: UARTIBRD、UART: UARTFBRDレジスタにそれぞれ代入する。 -</p> -<p> -UARTの有効化はUART: UARTCRレジスタのUARTENビットをセットすることで行う。\ -C言語のサンプルでは同じレジスタのRXE、TXEビットもセットしているが、\ -この2つはもともと1になっているのでほっといてよさそう。\ -</p> -<p> -FIFOの有効化はUART: UARTLCR_HレジスタのFENビットをセットすることで行う。\ -また、同じレジスタの他のビットで、データーのフォーマットを設定できる。\ -ここではminicomのデフォルトに合わせてWLENを8bitにする。\ -</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre><code> // setup uart0 - ldr r3, uart0_base - // set baudrate 115200 - // BDRI = 72, BDRF = 0.157 (10 / 64) - mov r0, #72 - str r0, [r3, #0x24] // UART: UARTIBRD - mov r0, #10 - str r0, [r3, #0x28] // UART: UARTFBRD - // enable uart0 - mov r0, #1 // UARTEN - ldr r1, atomic_set - add r1, r1, #0x30 - str r0, [r3, r1] // UART: UARTCR - // enable FIFO and set format - ldr r0, =(3 &lt;&lt; 5 | 1 &lt;&lt; 4) // WLEN = 8, FEN = 1 - str r0, [r3, #0x2c] // UART: UARTLCR_H - -/* ... */ - -atomic_set: - .word 0x00002000 -uart0_base: - .word 0x40034000 -</code></pre> - -<h3>UARTの入出力</h3> -<p> -設定が終わったので実際にUARTの入出力を処理するコードを書く。\ -まずUARTからの出力は、出力したいバイトをUART: UARTDRに書き込むことで\ -行う。\ -その際、書き込まれたデータは一時的に出力用FIFOに保持されるので、このFIFO\ -が満杯でないことを確認する必要がある。\ -FIFOの状態はUART: UARTFRレジスタで確認できる。\ -このレジスタのTXFFの値が1であればデータを書き込めないので、\ -0になるまで待機する。\ -関数名は<code>putbyte</code>にした。\ -また出力したいデータは<code>r0</code>レジスタにの下位8ビットに\ -入れられているものとした。\ -書き込めるデーターは8ビットだけなので、<code>0xff</code>と論理積をとってから\ -書き込んでいる: -</p> -<pre><code>putbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #5 // TXFF -txff: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne txff - mov r1, #0xff - and r0, r0, r1 - str r0, [r3, #0] // UART: UARTDR - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> - -<p> -入力はUART: UARTDRの下位8ビットを読むことで得られる。\ -UARTからの入力は、一時的に入力用FIFOに保存される。\ -このFIFOが空の状態でデータを読んでも意味がないので、\ -FIFOが空でないことを確認する必要がある。\ -これはUART: UARTFRレジスタのRXFEを読むことで確認できる。\ -本来は入力があったときに割り込みを発生させて、それまでは\ -CPUを休ませるか別の処理をさせておくべきだが、とりあえずここでは\ -ループでFIFOの状態を確認し続けている。\ -関数名は<code>getbyte</code>にした。 -読み込んだデータは<code>r0</code>レジスタに保存している:\ -</p> -<pre><code>getbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #4 // RXFE -rxfe: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne rxfe - ldr r0, [r3, #0] // UART: UARTDR - mov r1, #0xff - and r0, r0, r1 - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> -<p> -あとはこの2つの関数をループの中で交互に呼び出せば、\ -オウム返しするだけのプログラムが完成する: -</p> -<pre><code>loop: - bl getbyte - bl putbyte - b loop -</code></pre> - -<h2>リング発振回路でUARTは動くんかな?</h2> -<p>\ -UARTの通信には正確なクロックが必要である。\ -その為上では<code>clk_peri</code>として水晶発振子とPLLを用いた。\ -ところがpico-examplesのhello_uartでは<code>main()</code>関数で\ -水晶発振子を設定していない。そこでリング発振回路を用いてみたのだが、\ -どうもうまく通信できない。出力されている正確な周波数も分からないので\ -あきらめることにした。オシロスコープなんていうものは持っていない。\ -</p> - -<h3>pico-sdk</h3> -<p> -ところがどうも調べているとSDKを使った場合、\ -デフォルトではクロック周波数は125MHzになっているらしい。\ -どうやら水晶発振子もPLLも<code>main()</code>が呼ばれる前に\ -設定されているようである。\ -</p> -<p> -pico-examplesのサンプルプログラムはビルドすると自動で逆アセンブリした\ -ファイルを出力してくれる。これを見ると、最初の256バイトは前回説明した\ -boot2のコードで、その後ろにベクターテーブルが続く。\ -ベクターテーブルの最初は初期スタックポインタで、<code>0x20042000</code>\ -になっている。次はエントリーポイントで、<code>0x100001f7</code>である:\ -</p> -<pre><code>\ -10000100 &lt;__VECTOR_TABLE&gt;: -10000100: 20042000 .word 0x20042000 -10000104: 100001f7 .word 0x100001f7 -</code></pre> -<p> -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ではユーザープログラムの一部として組み込んでるんかな? -</p> -<pre><code>\ -100001f6 &lt;_reset_handler&gt;: -100001f6: 481d ldr r0, [pc, #116] ; (1000026c &lt;hold_non_core0_in_bootrom+0xe&gt;) -100001f8: 6800 ldr r0, [r0, #0] -100001fa: 2800 cmp r0, #0 -100001fc: d12f bne.n 1000025e &lt;hold_non_core0_in_bootrom&gt; -</code></pre> -<p>\ -上のコードの最初の<code>ldr</code>は、<code>0xd0000000</code>\ -(M0PLUS: CPUIDレジスタ)をロードしている。\ -最後の飛び先<code>0x1000025e</code>はCPUIDが<code>1</code>のCPUを待機させる処理\ -である:\ -</p> -<pre><code>\ -1000025e &lt;hold_non_core0_in_bootrom&gt;: -1000025e: 4809 ldr r0, [pc, #36] ; (10000284 &lt;hold_non_core0_in_bootrom+0x26&gt;) -10000260: f001 fb9c bl 1000199c &lt;rom_func_lookup&gt; -10000264: 4700 bx r0 -10000266: 0000 .short 0x0000 -/* ... */ -10000284: 00005657 .word 0x00005657 -</code></pre> -<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> -<pre><code>\ -$ find pico-sdk/src -type f | xargs grep -l _reset_handler -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -</code></pre> -<p>\ -このファイルによると: -</p> -<pre><code> // Only core 0 should run the C runtime startup code; core 1 is normally - // sleeping in the bootrom at this point but check to be sure -</code></pre> -<p>\ -だそうである。やっぱり無駄やん。内蔵フラッシュのプログラムにバグがあっても\ -このコードのせいで見付かりにくくなってない?知らんけど。\ -</p> - -<p>\ -続いて<code>.data</code>領域と<code>.bss</code>領域のコピー、初期化のようである。\ -多分OSの本かなんかで習ったメモリマップの話:\ -</p> -<pre><code>\ -100001fe: a40d add r4, pc, #52 ; (adr r4, 10000234 &lt;data_cpy_table&gt;) -10000200: cc0e ldmia r4!, {r1, r2, r3} -10000202: 2900 cmp r1, #0 -10000204: d002 beq.n 1000020c &lt;_reset_handler+0x16&gt; -10000206: f000 f812 bl 1000022e &lt;data_cpy&gt; -1000020a: e7f9 b.n 10000200 &lt;_reset_handler+0xa&gt; -1000020c: 4918 ldr r1, [pc, #96] ; (10000270 &lt;hold_non_core0_in_bootrom+0x12&gt;) -1000020e: 4a19 ldr r2, [pc, #100] ; (10000274 &lt;hold_non_core0_in_bootrom+0x16&gt;) -10000210: 2000 movs r0, #0 -10000212: e000 b.n 10000216 &lt;bss_fill_test&gt; - -10000214 &lt;bss_fill_loop&gt;: -10000214: c101 stmia r1!, {r0} - -10000216 &lt;bss_fill_test&gt;: -10000216: 4291 cmp r1, r2 -10000218: d1fc bne.n 10000214 &lt;bss_fill_loop&gt; -</code></pre> - -<p>\ -最後にいろいろ呼びだす:\ -</p> -<pre><code>\ -1000021a &lt;platform_entry&gt;: -1000021a: 4917 ldr r1, [pc, #92] ; (10000278 &lt;hold_non_core0_in_bootrom+0x1a&gt;) -1000021c: 4788 blx r1 -1000021e: 4917 ldr r1, [pc, #92] ; (1000027c &lt;hold_non_core0_in_bootrom+0x1e&gt;) -10000220: 4788 blx r1 -10000222: 4917 ldr r1, [pc, #92] ; (10000280 &lt;hold_non_core0_in_bootrom+0x22&gt;) -10000224: 4788 blx r1 -10000226: be00 bkpt 0x0000 -10000228: e7fd b.n 10000226 &lt;platform_entry+0xc&gt; -/* ... */ -10000278: 10001819 .word 0x10001819 -1000027c: 100002dd .word 0x100002dd -10000280: 10001909 .word 0x10001909 -</code></pre> -<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> -<pre><code>\ -$ find pico-sdk/src -type f | xargs grep -l runtime_init -pico-sdk/src/rp2_common/pico_runtime/runtime.c -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -pico-sdk/src/common/pico_sync/include/pico/mutex.h -</code></pre> -<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> -<pre><code> clock_configure(clk_peri, - 0, - CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS, - 125 * MHZ, - 125 * MHZ); -</code></pre> -<p>\ -やっぱり水晶発振子じゃないとあかんのかな。\ -</p> - -<h2>CMake</h2> -<p>\ -上ではビルドしたバイナリを逆アッセンブルして読んだ。\ -わざわざこんなことをしなくてもMakefile読めばなにがどう\ -なって最終生成物に辿りつくのか分かればいいのだが、そうもいかない。\ -このSDKとpico-examplesにはビルドシステムとしてCMakeなるものが使われている。\ -これがどうも複雑でよく分からない。勉強する気にもならん。\ -上で見た<code>crt0.S</code>や<code>runtime.c</code>といったファイルも\ -<code>hello_uart</code>で本当に使われているものなのかもよく分からない。\ -こんな煩雑なものは本当に必要なのかな。無駄に複雑にしてるだけとちゃうんかな。\ -特に僕は勉強用に使ってるので、ソースコードの依存関係をもっと\ -分かりやすくしてくれないと、内部でなにがどうなってるのか理解しにくい。\ -何度か頑張って読もうとしたが、面白くないのでやめた。\ -数百行のファイルをあっちからこっちから<code>include</code>してるし、\ -大文字ばかりの変数だらけで目が痛い。\ -こんなものを扱えるというのはえらいええ頭してはるんやね。\ -</p> - - -<h2>参考</h2> -<ul> -<li> -<a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -<a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -<a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -<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> -</li> -<li> -<a href="https://www5.epsondevice.com/ja/information/technical_info/osc.html">水晶発振器とは? 原理と仕組み、水晶振動子との違い、選び方のポイントを解説.エプソン水晶デバイス</a> -</li> -</ul> diff --git a/man/computer/rp2040_3_interrupt.html b/man/computer/rp2040_3_interrupt.html @@ -1,197 +0,0 @@ -<h1>RP2040 SDKなし3 割り込み</h1> -<time>2025-08-27</time><br /> -<p> -前回UARTで通信する際、FIFOにデータが届いていないかを確認しつづけていた(ポーリング)。 -これでは電力がもったいないので、データが届くまでCPUは休ませておいて、 -届いたときだけ処理を実行するように変更する(割り込み)。 -<p> -<p> -前回: <a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex3_interrupt -</p> - -<h2>動作環境</h2> -<ul> -<li>OpenBSD 7.7 - <ul> - <li>arm-none-eabi-binutils-2.40</li> - <li>OpenBSD Make</li> - <li>minicom version 2.8</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>割り込み</h2> -<p> -ハードウェアが外部から信号を受けとると、CPUに現在の処理を中断させてその信号を処理させるようにできる。\ -これを割り込み処理という。\ -今回はUARTにデータが届いた時に同じデータをUARTに書き込むようにしたい。\ -</p> - -<h3>割り込みを有効化</h3> -<p> -割り込みの信号を受け取るために、割り込みを有効化する。\ -CPUが割り込みを受け付けるようにする設定と、\ -UARTが割り込み信号を発生させるようにする設定が必要である。\ -</p> -<p> -CPU側の設定は<code>M0PLUS: NVIC_ISER</code>レジスタの有効化したい割り込みのビットに1を書くことで行う。\ -有効化できる割り込みは全部で26個ある。\ -割り込みの種類はrp2040のデータシート[1]のTable 80. Interruptsに書いてある。\ -今回有効化するのはUART0の割り込みで、この表から20番が割り当てられていることが分かるので、\ -<code>M0PLUS: NVIC_ISER</code>に、下から20番目のビットを1にしたもの書き込む:\ -</p> -<code><pre> // enable uart interrupt in cpu - ldr r4, ppb_base - mov r5, #0xe1 - lsl r5, #8 - mov r0, #1 - lsl r0, #20 - str r0, [r4, r5] // M0PLUS: NVIC_ISER - -/* ... */ - -ppb_base: - .word 0xe0000000 -</pre></code> -<p> -UART側の設定は、<code>UART: UARTIMSC</code>レジスタで行なう。\ -データを受け取ったときに割り込みを発生させたいので、\ -<code>RXIM</code>ビットに1を書き込む。\ -また、処理を開始する前に既にFIFOにデータがたまっている可能性があるので、\ -FIFOが空ではないときに割り込みを発生させるように、\ -<code>RTIM</code>にも1を書き込む:\ -</p> -<code><pre> // enable uart interrupt in uart0 subsystem - ldr r1, uart0_base - mov r2, #(1 &lt;&lt; 6 | 1 &lt;&lt; 4) // RTIM | RXIM - str r2, [r1, #0x38] // UART: UARTIMSC -</pre></code> -<p> -また、FIFOにデータがきたらすぐに割り込みを発生させたいので、\ -<code>UART: UARTIFLS</code>レジスタの<code>RXIFLSEL</code>に0を書き込む。\ -これでFIFOの1/8が埋まったら割り込みが発生する。\ -</p> -<code><pre> // set fifo level to 0 - mov r2, #0 - str r2, [r1, #0x34] // UART: UARTIFLS -</pre></code> -<p> -これだとFIFOに届いた瞬間には割り込みがおこらない気がするが、\ -pico-sdk(src/rp2_common/hardware_uart/include/hardware/uart.h)の\ -<code>uart_set_irqs_enabled</code>関数でもこうなってる。\ -FIFOを無効にすれば即座に割り込みがおこるかもしれないが、\ -データが失われる可能性もあるのかな。\ -</p> - -<h3>ベクターテーブルの設定</h3> -<p> -外部からの信号で割り込みが発生したときに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> -<code><pre> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word (uart_interrupt_handler+1) // UART0_IRQ -</pre></code> - -<h3>割り込み処理</h3> -<p> -割り込み発生時に呼ばれる関数はUARTのFIFOに届いたデータをそのまま送信するだけのものである:\ -</p> -<code><pre> // uart_interrupt_handler echos the data arrived at uart0 -uart_interrupt_handler: - push {lr} - bl getbyte - bl putbyte - pop {pc} -</pre></code> -<p> -<code>getbyte</code>、<code>putbyte</code>は前回と同じもの。 -</code> - -<h2>メインループ</h2> -<p> -UARTにデータが届いていないときは特にすることがないので\ -CPUは寝かせておく。\ -ARMには割り込みが発生するまでなにもしない<code>wfe</code>という命令があるのでこれを使う:\ -</p> -<code><pre>\ -loop: - wfe - b loop -</pre></code> - -<h2>完成</h2> -<p> -これで完成。\ -動作は前回と全く同じだが、消費電力をおさえられる。\ -</p> - -<h2>参考</h2> -<ul> -<li> -[1]. <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[2]. <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -[3]. <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -</ul> diff --git a/man/computer/rtx1200-qos.html b/man/computer/rtx1200-qos.html @@ -1,113 +0,0 @@ -<h1>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</h1> -<time>2022-01-14</time>作成 -<h2>はじめに</h2> -<p>一人暮らししていた頃節約にはまり、下宿の固定回線を解約したうえ、携帯の回線を128kbpsしかでないものに変更したことがある。以来通信費をどうやって抑えるかあれこれ考えてきた。現在は実家に暮らしていて、家で契約している光回線を使わせてもらっている。携帯の方は楽天モバイルであり、外で使うことはまずないので毎月の支払いは発生していない。しかしいずれこの家をでた時に、楽天モバイルの回線だけでは結局月々3278円と大きな出費になる。また、通信速度が遅い生活というのは雑音の少ない充実したものであった経験もある。こんなことを考えていたところ、通信速度が128kbpsだが無料で利用できる格安sim<sup>[1]</sup>を発見した。この速度に慣れておけば、通信費が全くかからない生活ができる。ということで家で使っているルーターの設定を変更し、通信帯域を制限してみた。</p> -<h2>機材</h2> -<ul> - <li>ルーター: Yamaha RTX1200</li> - <li>無線アクセスポイント: elecomのルーター</li> - <li>パソコン: Lenovo x220</li> - <li>パソコンのOS: OpenBSD 7.0</li> -</ul> -<h2>設定したい内容</h2> -<p>RTX1200のLAN2ポートにWANが接続されており、LAN1には家で使っている端末がいろいろ接続されている。LAN3は今回は関係ないので割愛する。LAN1を2つのvlanに分割し、1-7番のポートをvlan1、8番のポートをvlan2する。そしてこのvlan2とインターネットとの通信を上下とも128kbpsに制限する。vlan2と他のlanとの通信は制限しない。vlan2にelecomのルーターを無線アクセスポイントとして接続し、僕が使うパソコンやスマホはこのアクセスポイントに接続する。</p> -<figure> -<pre> - Internet - | - ┌-------┬-----------┬-┴--┬----┐ - |RTX1200|LAN1 |LAN2|LAN3| - └-------┴-┬-------┬-┴----┴----┘ - vlan1 vlan2 - 192.168.100.1 192.168.101.1 - | | - ┌------------┐ | | ┌-----------┐ ┌-----┐ - |home network├--┘ └----┤elecom wifi├---┤my PC| - └------------┘ └-----------┘ └-----┘ - 192.168.100.0/24 192.168.101.0/24 -</pre> -<figcaption>図1: 接続と設定の概略</figcaption> -</figure> - -<h2>vlanについて</h2> -<p>ヤマハのページにvlanについて以下のような説明がある:</p> -<blockquote cite="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">物理的な接続形態に依存せず仮想的にグループを形成してひとつのLANとみなすものが、VLAN(Virtual LAN)です。VLANには、スイッチの物理ポート単位でVLANを形成するポートベースVLANと、パケットにタグと呼ばれるヘッダを付加してVLAN情報を格納するタグVLANとがあります<sup>[2]</sup>。</blockquote> -<p> -ここではLAN1にある8つのポートをvlanによって2つの論理的なLANに分割する。しかしこの後設定するクラス分けでは送信元や宛先のアドレスによる分類ができるので帯域幅を制限したい端末のIPアドレスを固定しておくだけでよかったんやけどな。 -</p> - -<h2>クラス分けについて</h2> -<p>クラス分けについてヤマハのページに以下のような説明がある:</p> -<blockquote cite="https://network.yamaha.com/knowledge/qos">優先して転送するデータを判別するために、受信したデータを分類します。<br /> -データの分類には、転送データに含まれている情報を使用します。<sup>[3]</sup></blockquote> -<p> -各ポートから出ていくパケットについて、そのパケットの送信元アドレスや宛先アドレス等の情報に基づきクラスに分類する。このクラス毎に様々な処理が可能なのだが[要出典]、今回はvlan2とインターネットとの通信をクラス1として、このクラスに対して帯域幅を128kbpsに制限する。 -</p> - -<h2>実際の設定</h2> -<p>RTX1200において行った設定は以下の通り。ただし、LAN2にppの設定をし、LAN1とインターネットとの通信ができるところまでは既に設定済みとし、以降の変更点だけ抜粋する。</p> -<p>始めにLAN1を2つのvlanに分割する: -<pre><code># vlan port mapping lan1.1 vlan1 -# vlan port mapping lan1.2 vlan1 -# vlan port mapping lan1.3 vlan1 -# vlan port mapping lan1.4 vlan1 -# vlan port mapping lan1.5 vlan1 -# vlan port mapping lan1.6 vlan1 -# vlan port mapping lan1.7 vlan1 -# vlan port mapping lan1.8 vlan2 -# lan type lan1 port-based-option=divide-network -</code></pre> -<p> -続いて各vlanの設定を行う。ただしvlan1はlan1の設定を受け継ぐので不要。 -</p> -<pre><code># ip vlan2 address 192.168.101.1/24 -# ip vlan2 secure filter <i>&lt;vlan1と同じパケットフィルター&gt;</i> -</code></pre> -<p>次にクラスフィルターを定義:</p> -<pre><code># queue class filter 1 1 ip 192.168.101.0/24 * * * * -# queue class filter 2 1 ip * 192.168.101.0/24 * * * -# queue class filter 3 2 ip 192.168.100.0/24 192.168.101.0/24 * * * -</code></pre> -<p> -上の2行はvlan2とその他との通信を制限するためのものである。ただしこの2つだけではvlan1からvlan2への通信まで制限してしまうので、それを除外するために3行目のクラスフィルターを定義する。 -</p> -<p>次にクラスフィルタをvlan2に適応。これによりルーターから192.168.101.0/24への通信がフィルタリングされる。</p> -<pre><code># queue lan1 type shaping -# queue vlan2 class filter list 3 2 -</code></pre> -<p> -2行目で指定したフィルターはその指定した順番で評価されるので注意が必要。<br /> -そしてクラスに対する制限を指定: -</p> -<pre><code># queue lan1 class property 1 bandwidth=128k -</code></pre> -<p>次はlan2(pp)にクラスフィルタを適応。これにより192.168.101.0/24からルーターへの通信がフィルタリングされる。</p> -<pre><code># queue lan2 type shaping -# pp select <i>n</i> -pp<i>n</i># queue pp class filter list 1 -</code></pre> -<p> -vlan2の時と同様にクラスに制限を設定: -</p> -<pre><code># queue lan2 class property 1 bandwidth=128k -</code></pre> - -<h2>パソコンでの設定</h2> -<p>最後にパソコンから今回作ったvlan2に接続するように設定する:</p> -<pre><code># cat > /etc/hostname.<i>if</i> &lt;&lt;EOS -join <i>&lt;アクセスポイントのECS-ID&gt;</i> wpakey <i>&lt;アクセスポイントの暗号化キー&gt;</i> -inet 192.168.101.2/24 -EOS -# echo 192.168.101.1 > /etc/mygate -</code></pre> - -<h2>おわりに</h2> -<p>めっちゃ遅い。</p> - -<h2>参考文献</h2> -<ol> - <li><a href="https://www.donedone.jp/plan/">料金プラン-50ギガの大容量SIM | donedone(ドネドネ) ドネーション型モバイルサービス</a>.donedone.2022-01-14閲覧</li> - <li><a href="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">VLAN</a>.RTpro.2022-01-14閲覧</li> - <li><a href="https://network.yamaha.com/knowledge/qos">QoSとは</a>.RTpro.2022-01-14閲覧</li> - <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> -</ol> diff --git a/man/computer/setting_up_web_server.html b/man/computer/setting_up_web_server.html @@ -1,158 +0,0 @@ -<h1>Webサーバーの設定</h1> -<time>2022-06-27</time> - -<h2>はじめに</h2> -<p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p> - -<h2>環境</h2> -<ul> - <li>OS: OpenBSD 7.1</li> - <li>サーバー: httpd(OpenBSDに付属のもの)</li> - <li>サーバー証明書: Let's Encrypt</li> - <li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li> - <li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li> -</ul> - -<h2>設定の概要</h2> -<dl> - <dt>サーバーを用意</dt> - <dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd> - <dt>ドメインの取得とDNSの設定</dt> - <dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd> - <dt>httpdの設定</dt> - <dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd> - <dt>証明書の発行と自動更新の設定</dt> - <dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd> - <dt>ホームページのファイルをアップロード</dt> - <dd>ウェブページで配信したいものをVPSにアップロードする。</dd> - <dt>接続の確認</dt> - <dd>手元のブラウザからアクセスできることを確認。</dd> -</dl> - -<h2>サーバーを用意</h2> -<p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p> - -<h2>ドメインの取得とDNSの設定</h2> -<p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p> -<pre><code>HOST TYPE POINTS TO TTL -<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600 -www.<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600</code></pre> -<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> -<p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p> -<pre><code>$ ping <i>&lt;server_domain&gt;</i> -PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms -^C</code></pre> - -<h2>httpdの設定</h2> -<p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p> -<pre><code>$ doas cp /etc/examples/httpd.conf /etc/ -vi /etc/httpd.conf</code></pre> - -<pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $ - -server "<i>&lt;server_domain&gt;</i>" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location * { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "<i>&lt;server_domain&gt;</i>" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - root "/htdocs/www.<i>&lt;server_domain&gt;</i>" - directory auto index - } -}</code></pre> -<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> -<p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p> -<pre><code>$ doas httpd -n -configration OK</code></pre> - -<h2>証明書の発行と自動更新の設定</h2> -<p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p> -<pre><code>$ doas cp /etc/examples/acme-client.conf /etc/ -$ doas vi /etc/acme-client.conf</code></pre> -<pre><code># -# $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $ -# -authority letsencrypt { - api url "https://acme-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-privkey.pem" -} - -authority letsencrypt-staging { - api url "https://acme-staging-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-staging-privkey.pem" -} - -authority buypass { - api url "https://api.buypass.com/acme/directory" - account key "/etc/acme/buypass-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -authority buypass-test { - api url "https://api.test4.buypass.no/acme/directory" - account key "/etc/acme/buypass-test-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -domain <i>&lt;server_domain&gt;</i> { - alternative names { secure.<i>&lt;server_domain&gt;</i> } - domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - sign with letsencrypt -}</code></pre> -<p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p> -<p>続いて<code>acme-client</code>を実行して証明書を発行する。</p> -<pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre> -<p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p> -<pre><code>$ doas crontab -e</code></pre> -<pre><code>... -#minute hour mday month wday [flags] command -19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd -... -</code></pre> -<p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p> - -<h2>ホームページのファイルのアップロード</h2> -<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> -<pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i> -$ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre> - -<h2>接続の確認</h2> -<p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p> -<pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre> -<p>続いてrcに登録、起動。</p> -<pre><code>$ doas rcctl start httpd -$ doas rcctl enable httpd</code></pre> -<p>ブラウザでアクセスしてみる。</p> - -<h2>おわりに</h2> -<p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p> - -<h2>参考文献</h2> -<ul> - <li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li> - <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> -</ul> diff --git a/man/computer/what-i-use.html b/man/computer/what-i-use.html @@ -1,81 +0,0 @@ -<h1>使用しているハードウェア、ソフトウェア</h1> -<time>2025-04-28</time>更新<br> -<time>2021-12-13</time>作成 -<h2>ノートパソコン</h2> -<p>\ -メインのパソコン。\ -</p> -<dl> -<dt>ハードウェア: <a href="openbsd_on_u9310e.html">Fujitsu LIFEBOOK U9310/E</a></dt> -<dd>\ -2013年製のMacBook Airを使っていたがバッテリーがへたってきた。\ -ぱちもんのバッテリーは1年でだめになるのに7千円くらいするのでコスパが悪い。\ -2025年4月に大阪日本橋で見付けたLIFEBOOKを買った。10世代のCore i5で27000円くらい。\ -軽い。ディスプレイが綺麗、OpenBSDと相性がそこそこいい。\ -</dd> -<dt>OS: OpenBSD</dt> -<dd> -使いやすい。 -</dd> - -<dt>Window Manager: <a href="https://git.mtkn.jp/dwm">dwm</a></dt> - -<dt>Terminal: <a href="https://git.mtkn.jp/st">st</a></dt> - -<dt>Text Editor: acme, nvi</dt> -<dd>vimは辞めた。OpenBSDにあったnviが丁度いい。日本語を使うので\ -日本語入力が必要ない場面ではacmeを使っている。</dd> - -<dt>Browser: firefox</dt> -<dd>もうちょっとましなのないんかな。UIころころ変わるし、重いし、\ -嫌い。JavaScriptがないと困るので仕方なく使っているが...\ -特に最近画面上部のUIが大きすぎて邪魔である。\ -</dd> - -<dt>Mail Client: neomutt</dt> -<dd>あんまり好きじゃない</dd> -</dl> - -<h2>デスクトップ</h2> -<p>\ -学生のときに組んだ。無駄にハイスペック。この上RTX2060も積んでたが、\ -OpenBSDで使えないので解雇した。\ -最近は絵を描くのに使っている。\ -</p> -<dl> -<dt>マザーボード: ASRock Z390 Pro4</dt> -<dt>CPU: Intel Core i7-9700K</dt> -<dt>メモリ: センチュリーマイクロ 8GB * 2</dt> -<dd>国産</dd> -<dt>ストレージ: KimMiDi SSD 256GB</dt> -<dd>ThinkPad買ったときについてきたやつ。</dd> -<dt>モニタ: Eizo FlexScan EV2451</dt> -<dd>綺麗やけど質量が大きい。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>家のサーバー</h2> -<p> -主にDNSとして使っている。 -</p> -<dl> -<dt>ハードウェア: Dell D520</dt> -<dd>おじいちゃんの家にころがってたのをもらってきた。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>ウェブサーバー</h2> -<p>このウェブページ用</p> -<dl> -<dt>VPS: さくらのVPS</dt> -<dd>ちょっと高い(7078円/12ヶ月)。OpenBSDを入れられる。</dd> -<dt>OS: OpenBSD</dt> -<dt>httpサーバー: Openbsd httpd</dt> -<dd>manが分かりやすい。</dd> -<dt>smtpサーバー: OpenSMTPD</dt> -<dd>manが分かりやすい。</dd> -<dt>imapサーバー: dovecot</dt> -<dd>manはあんまり分かり易くない。<dd> -</dl> diff --git a/man/computer/x11_32bit_window.html b/man/computer/x11_32bit_window.html @@ -1,178 +0,0 @@ -<h1>X11で深さが32bitのwindowを作成する</h1> -<time>2025-12-20</time> - -<h2>結論</h2> -<p> -X11のrender拡張機能で半透明な画像を合成(composite)する際に深さが32bitのウィンドウを作成する必要がある。\ -その際ドキュメントにも書いてなさそうな操作が必要だった。\ -ウィンドウを作成する際に<code>border pixel</code>の値を設定する必要がある(言語はC): -</p> - -<pre><code>\ -// Xlibの場合 -XSetWindowAttributes attr32 = { - .border_pixel = 0, // 値はなんでもよさそう - .colormap = colormap32, -} -Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, // depth - InputOutput, - visual32, - CWBorderPixel|CWColormap, // CWBorderPixelを指定 - &amp;attr32); -</code></pre> - -<pre><code>\ -// xcbの場合 -uint32_t attr32[2] = { 0, colormap32 }; // 値はなんでもよさそう。 -xcb_create_window(conn, 32, window32, screen-&gt;root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, // XCB_CW_BORDER_PIXELを指定 - &amp;attr32); -</code></pre> - -<h2>出典</h2> -<p> -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>に、 -</p> -<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 - // http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32 -</code></pre> -</blockquote> -<p> -と書いていた。\ -引用元を見るとXサーバーのソースコードを参照しており、\ -そのコードでは親のウィンドウの深さと異なる深さのウィンドウを作成する場合、\ -<code>CWBorderPixmap</code>又は<code>CWBorderPixel</code>を指定しないと<code>BadMatch</code>\ -というエラーが返ってくるようになっている。\ -理由はよく分からない: -</p> -<blockquote cite="https://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c?h=xorg-server-21.1.21#n818"> -<pre><code> if (((vmask &amp; (CWBorderPixmap | CWBorderPixel)) == 0) &amp;&amp; - (class != InputOnly) &amp;&amp; (depth != pParent-&gt;drawable.depth)) { - *error = BadMatch; - return NullWindow; - } -</code></pre> -</blockquote> - -<h2>深さ32bitのウィンドウの作成手順</h2> -<h3>深さ32bitのヴィジュアルを取得</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのヴィジュアルを\ -取得する: -</p> -<pre><code>\ -// xlibの場合 -int findVisual32(Display *display, XVisualInfo *return_visual_info); -/* ... */ -int main(void) { - /* ... */ - XVisualInfo vi32; - if (findVisual32(display, &amp;vi32) &lt; 0) { - fatal(&quot;32bit-deep visual info not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(Display *display, XVisualInfo *return_visual_info) { - long mask = VisualDepthMask|VisualRedMaskMask|VisualGreenMaskMask|VisualBlueMaskMask; - XVisualInfo template = { - .depth = 32, - .red_mask = 0xff0000, - .green_mask = 0x00ff00, - .blue_mask = 0x0000ff, - }; - int n; - XVisualInfo *vinfos = XGetVisualInfo(display, mask, &amp;template, &amp;n); - if (n == 0) { - return -1; - } - *return_visual_info = vinfos[0]; - XFree(vinfos); - return 0; -} -</pre></code> - -<pre><code>\ -// xcbの場合 -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype); -/* ... */ -int main(void) { - /* ... */ - xcb_visualtype_t visual32; - if (findVisual32(screen, &amp;visual32) &lt; 0) { - fatal(&quot;32bit visual not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) { - xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen); - for (;depth_iter.rem &gt; 0; xcb_depth_next(&amp;depth_iter)) { - xcb_depth_t *d = depth_iter.data; - if (d-&gt;depth != 32) { - continue; - } - xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d); - while (visual_iter.rem &gt; 0) { - xcb_visualtype_t *v = visual_iter.data; - if (v-&gt;red_mask == 0xff0000 &amp;&amp; v-&gt;green_mask == 0x00ff00 &amp;&amp; v-&gt;blue_mask == 0x0000ff) { - *return_visualtype = *v; - return 0; - } - xcb_visualtype_next(&amp;visual_iter); - } - } - return -1; -} -</code></pre> - -<h3>深さ32bitのカラーマップを作成</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのカラーマップを\ -作成する。 -</p> -<pre><code>\ -// xlibの場合 - Colormap colormap32 = XCreateColormap(display, DefaultRootWindow(display), vi32.visual, AllocNone); -</code></pre> -<pre><code>\ -// xcbの場合 - xcb_colormap_t colormap32 = xcb_generate_id(conn); - xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen-&gt;root, visual32.visual_id); -</code></pre> - -<h3>深さ32bitのウィンドウを作成</h3> -<p>最後にウィンドウを作成する:</p> -<pre><code>\ -// xlibの場合 - Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, - InputOutput, - vi32.visual, - CWBorderPixel|CWColormap, - &attr32); -</code></pre> -<pre><code>\ -// xcbの場合 - uint32_t attr32[2] = { 0, colormap32 }; - xcb_create_window(conn, 32, window32, screen->root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32.visual_id, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32); -</code></pre> - -<h2>サンプルコード</h2> -32bitのウィンドウを作成し、そこからrender拡張機能を使って半透明な四角形を描画するプログラムを作った。\ -OpenBSDで動作確認した。他のUnixでも多分動くと思う:<br> -<a href="https://git.mtkn.jp/win32">git.mtkn.jp/win32</a> - -<h2>参考文献</h2> -<ol> -<li><a href="https://azelpg.gitlab.io/azsky2/note/prog/x11/03_visual.html">X11: ビジュアル</a></li> -</ol> diff --git a/man/computer/xlib_playground1.html b/man/computer/xlib_playground1.html @@ -1,158 +0,0 @@ -<h1>Xlibで遊んでみる1</h1> -<time>2022-12-21</time> - -<h2>はじめに</h2> -<p>X11でGUIのプログラミングをしてみようと思い、してみた。\ -X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。\ -x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。\ -そのため、新しくなにかを作る場合はxcbを使うようにとのことである。\ -ところがこのxcbはドキュメンテーションに乏しく、\ -X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。\ -知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、\ -その関数なり構造体なりの説明がどこにも見当たらない。\ -manページもない。あるのはdoxygenなるものでソースコードのコメントから\ -自動生成したいい加減なものだけで、使いものにならない。</p> -<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、\ -もう少しましな情報があるXlibから始めることにした。\ -</p> -<p>言語はC言語である。ソースコードは\ -<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>初期設定</h2> -<p>ディスプレイを開き、ウィンドウを作成する。\ -変数はとりあえずグローバルに宣言することにした。\ -<code>main</code>関数はできるだけ小さくして実際の処理は\ -それぞれの関数にさせてみる:</p> -<pre><code> -#include &lt;stdio.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;X11/Xlib.h&gt; - -/* macros */ -#define INIT_WIDTH 800 -#define INIT_HEIGHT 600 - -/* variables */ -Display *display; -Window window; -unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; -Atom wm_delete_window; - -void -setup(void) -{ - // Open a display. - if ((display = XOpenDisplay(NULL)) == NULL){ - fprintf(stderr, "ERROR: could not open display\n"); - exit(1); - } - // Create a window. - window = XCreateSimpleWindow( - display, - XDefaultRootWindow(display), - 0, 0, - win_width, win_height, - 0, 0, // border properties - 0); // background color: black - XStoreName(display, window, "UNKO"); - - // Setup a graphical context. - gc = XCreateGC(display, window, 0, NULL); - XSetForeground(display, gc, 0x0000FF); - - // Kill the application when the window is destroyed. - wm_delete_window = XInternAtom(display, - "WM_DELETE_WINDOW", False); - XSetWMProtocols(display, window, &wm_delete_window, 1); - - // Setup which input to process. - XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); - - // Actually draw the window. - XMapWindow(display, window); -} - -void -clean_up(void) -{ - XCloseDisplay(display); -} -</code></pre> - -<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。\ -</p> -<pre><code>#include &lt;time.h&gt; -#include &lt;math.h&gt; - -int -main(void) -{ - int px, py; - int quit; - struct timespec ts; - XEvent event; - - setup(); - quit = 0; - - while (!quit){ - while(XPending(display) &gt; 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - clock_gettime(CLOCK_MONOTONIC, &ts); - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - 100, 100); // width and height - - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000 * 1000; - nanosleep(&ts, NULL); - } - - cleanup(); - return 0; -} -</code></pre> - -<p>ここまでのコードはgitリポジトリの\ -<a href="https://git.mtkn.jp/xlib_playground/file/ex1/ex1.c.html">ex1/ex1.c</a>\ -にある。</p> -<h2>完成品:</h2> -<video controls> - <source src="videos/ex1.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> -</ul> - -<a href="xlib_playground2.html">次の記事</a> diff --git a/man/computer/xlib_playground2.html b/man/computer/xlib_playground2.html @@ -1,229 +0,0 @@ -<h1>Xlibで遊んでみる2</h1> -<time>2022-12-22</time> - -<p>前回: <a href="xlib_playground1.html">Xlibで遊んでみる1</a></p> -<p>言語はC言語である。ソースコードは\ -<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>FPSの固定</h2> -<p>前のフレームからの経過時間を計測して<code>1.0/FPS</code>を越えるまで待機させる。\ -このときに<code>nanosleep()</code>を使うとなぜか上手くいかなかった。\ -ナノ秒単位で処理できそうな名前なのに使えない。\ -多分OSのコンテクストスイッチがどうとかいう話やと思う。\ -知らんけど。\ -組み込みとかで使うんかな? -</p> - -<p> -とりあえず<code>while</code>ループの中で\ -ひたすら時刻を読んでいる。\ -リソースの無駄遣いではないのだろうか: -</p> -<pre><code>#defin FPS 60 - -int -main(void) -{ - long t0, t1, dt; - int fps_count; - - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - - while (!quit) { - // fix fps - dt = 0; - while (dt &lt; 1.0 * 1000 * 1000 * 1000 / FPS){ - clock_gettime(CLOCK_MONOTONIC, &ts); - t1 = ts.tv_nsec; - dt = t1 &gt; t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000; - } - // count fps. - fps_count++; - if (t1 &lt; t0){ - printf("fps: %u\n", fps_count); - fps_count = 0; - } - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - } -} -</code></pre> -<p> -時刻は<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> -<p> -FPSの計測の部分は、フレーム毎に<code>fps_count</code>を1ずつ増やし、\ -ナノ秒が繰り上がった時点での<code>fps_count</code>を表示している。\ -</p> -<p> -あまり正確な方法ではないように思うが、コンパクトにまとまったのではないだろうか。\ -</p> - -<h2>キーボード入力の処理</h2> -<p>キーボードからの入力を受け取る:</p> -<pre><code>XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); -</code></pre> -<p>ここではキーボードのキーを押した時と離した時に<code>XEvent</code>の通知を\ -受け取るように設定した。 -</p> -<p> -<code>XNextEvent()</code>からひとつずつ入力を受け取ると、\ -複数のキーが同時に押された時にうまく処理できなかったので、\ -押されているキーを配列に保存しておくことにした:\ -</p> -<pre><code>enum Keys { - Key_D, - Key_S, - Key_A, - Key_W, - Key_Space, - Num_Key, //number of keys in this enum -}; -enum Key_State { - Key_Up, - Key_Down, -}; - -int key_state[Num_Key]; -</code></pre> - -<p> -入力の処理は<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> -<pre><code>int quit; - -void -handle_inputs(void) -{ - XEvent event; - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - quit = 1; - break; - case 'd': - key_state[Key_D] = Key_Down; - break; - case 'a': - key_state[Key_A] = Key_Down; - break; - case 'w': - key_state[Key_W] = Key_Down; - break; - case 's': - key_state[Key_S] = Key_Down; - break; - default: - break; - } - } break; - case KeyRelease: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'd': - key_state[Key_D] = Key_Up; - break; - case 'a': - key_state[Key_A] = Key_Up; - break; - case 'w': - key_state[Key_W] = Key_Up; - break; - - case 's': - key_state[Key_S] = Key_Up; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - - vx = vy = 0; - if (key_state[Key_D] == Key_Down) - vx += 300; - if (key_state[Key_A] == Key_Down) - vx += -300; - if (key_state[Key_S] == Key_Down) - vy += 300; - if (key_state[Key_W] == Key_Down) - vy += -300; -} -</code></pre> - -<p> -入力によって変更された速度は、<code>main()</code>関数内で次の座標を\ -計算するために使用される: -</p> -<pre><code>float px = 200, py = 200; -float vx = 0, vy = 0; -int width = 40, height = 40; - -int -main(void) -{ - /* ... */ - quit = 0; - while (!quit) { - handle_input() - /* ... */ - px = px + vx * dt / 1000 / 1000 / 1000; - py = py + vy * dt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - width, height); // width and height - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<a href="https://git.mtkn.jp/xlib_playground/file/ex2/ex2.c.html">ソースコード</a> -<p>色を変えてみた。</p> -<video controls> - <source src="videos/ex2.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p>次の記事: \ -<a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> diff --git a/man/computer/xlib_playground3.html b/man/computer/xlib_playground3.html @@ -1,177 +0,0 @@ -<h1>Xlibで遊んでみる3</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground2.html">Xlibで遊んでみる2</a> -</p> -<p> -言語: C言語<br /> -ソースコード: \ -<a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>画面サイズの変更</h2> -<p> -画面サイズが変更された時に表示している四角形が画面の外側に\ -出ないようにした。<code>XGetWindowAttributes()</code>で\ -画面の情報を取得し、グローバル変数の<code>win_width</code>\ -と<code>win_height</code>に幅と高さをそれぞれ代入して\ -<code>next_tick()</code>で四角形の位置を画面に収まるよう\ -にしている: -</p> -<pre><code>\ -int win_width, win_height; - -void -receive_events(int key_state[]) -{ - XEvent event; - XWindowAttributes wattr; - - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XGetWindowAttributes(display, window, &wattr); - win_width = wattr.width; - win_height = wattr.height; - } break; - /* ... */ - } - } -} - -void -next_tick(long ndt) // nano second -{ - px = px + vx * ndt / 1000 / 1000 / 1000; - py = py + vy * ndt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; -} -</code></pre> - -<h2>メニュー画面の実装</h2> -<p> -ゲームのようなものを作るうえでメニュー画面とその推移が必要である。\ -ここではグローバル変数<code>next_menu</code>に現在のメニューを保存\ -することにした。それぞれのメニューはそれぞれ関数として記述し、\ -他のメニューに推移する必要が生じたときに<code>next_menu</code>\ -を変更するようにした: -</p> -<pre><code>\ -enum next_menu { - START_MENU, - GAME_PLAY, - GAME_OVER, - QUIT, -}; - -int next_menu = START_MENU; - -void -start_menu(void) -{ - XEvent event; - char *menu_char_q = "press q to quit."; - char *menu_char_s = "press &lt;space&gt; to start."; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - while (next_menu == START_MENU) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, - win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, - win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - } break; - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - next_menu = QUIT; - break; - case ' ': - next_menu = GAME_PLAY; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - next_menu = QUIT; - } - } break; - default: - break; - } - } -} - -int -main(void) -{ - setup(); - while (next_menu != QUIT){ - switch (next_menu){ - case START_MENU: - start_menu(); - break; - case GAME_PLAY: - game_play(); - break; - case GAME_OVER: - game_over(); - break; - default: - break; - } - } - - cleanup(); - return 0; -} -</code></pre> -<p><code>main()</code>関数がめっちゃすっきりした。</p> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex3/ex3.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex3.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: \ -<a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> diff --git a/man/computer/xlib_playground4.html b/man/computer/xlib_playground4.html @@ -1,163 +0,0 @@ -<h1>Xlibで遊んでみる4</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> -<p> -言語: C言語<br /> -ソースコード: \ -<a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>衝突判定とその処理</h2> -<p> -これまでは一つの四角形だけを描画していたが、今回は複数の四角形を作成\ -して動かしてみた。ランダムな場所にランダムな運動量で動かして、\ -他のものやウィンドウの縁とぶつかったら跳ね返るようにした。\ -</p> -<p> -回転しない四角形どうしの衝突判定は簡単である。x軸方向とy軸方向の\ -両方に重なりがあれば衝突している: -</p> -<pre><code>\ -struct square { - float ppx, ppy; // previous position - float px, py; // current position - float vx, vy; // velocity - int w, h; // width and height -}; - -int -test_collision(struct square *s1, struct square* s2) -{ - return s1-&gt;px &lt; s2-&gt;px + s2-&gt;w && s2-&gt;px &lt; s1-&gt;px + s1-&gt;w && - s2-&gt;py &lt; s1-&gt;py + s1-&gt;h && s1-&gt;py &lt; s2-&gt;py + s2-&gt;h; -} -</code></pre> - -<p> -衝突後の処理は多少めんどくさかった。\ -衝突した時は既にめりこんでいるので、まずはそれぞれをめりこんだ距離の半分\ -ずつずらして衝突を解消するようにした。この際、x軸方向にぶつかったのか、\ -y軸方向にぶつかったのかで、それぞれの軸方向にひっぺがすようにしている。\ -二つの四角形の各軸に関するめりこんだ距離<code>lapx</code>、<code>lapy</code>\ -と各軸に関する相対速度<code>rel_vx</code>、<code>rel_vy</code>の比を比べれば\ -どちらの軸方向にぶつかったかが分かるはずである、多分 : -</p> -<pre><code>\ -void -handle_collision_mm(struct square *s1, struct square *s2) -{ - if (!test_collision(s1, s2)) - return; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - float rel_vx = max(s1-&gt;vx - s2-&gt;vx, s2-&gt;vx - s1-&gt;vx); - float rel_vy = max(s1-&gt;vy - s2-&gt;vy, s2-&gt;vy - s1-&gt;vy); - - if (lapx / rel_vx &lt; lapy / rel_vy) { - if (s1-&gt;px + s1-&gt;w &lt; s2-&gt;px + s2-&gt;w / 2) { - s1-&gt;px -= lapx / 2; - s2-&gt;px += lapx / 2; - } else { - s1-&gt;px += lapx / 2; - s2-&gt;px -= lapx / 2; - } - } else { - if (s1-&gt;py + s1-&gt;h &lt; s2-&gt;py + s2-&gt;h / 2) { - s1-&gt;py -= lapy / 2; - s2-&gt;py += lapy / 2; - } else { - s1-&gt;py += lapy / 2; - s2-&gt;py -= lapy / 2; - } - } -} -</code></pre> -<p> -衝突は弾性衝突として、衝突したそれぞれの四角形の速度を\ -更新した。質量は四角形の面積として計算している。\ -衝突後の速度はエネルギー保存則と運動量保存則から導いたのでしんどかった。 -</p> -<pre><code>\ -void -handle_collision_elastic(struct square *s1, struct square *s2) -{ - if(!test_collision(s1, s2)) - return; - - float v1, v2; - float m1 = s1-&gt;w * s1-&gt;h; - float m2 = s2-&gt;w * s2-&gt;h; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - - if (lapx &lt; lapy) { - v1 = s1-&gt;vx; - v2 = s2-&gt;vx; - s1-&gt;vx = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vx = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } else { - v1 = s1-&gt;vy; - v2 = s2-&gt;vy; - s1-&gt;vy = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vy = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } - - handle_collision_mm(s1, s2); -} -</code></pre> - -<h2>サブティック</h2> -<p> -この名前が適切かどうか分からないが、前のフレームから次のフレームまで\ -の時間をさらに何等分かして衝突判定の制度を上げた(マクロは括弧でかこって\ -分かりにくいバグを防げとどこかに書いていたのでそうすることにした): -</p> -<pre><code>\ -#define SUB_TIC (4) - -void -game_play(void) -{ - /* ... */ - while (next_menu == GAME_PLAY) { - /* ... */ - for (int j = 0; j &lt; SUB_TICK; j++) { - for (int i = 0; i &lt; NUM_SQUARE; i++) - next_tick(&square[i], 1000 * 1000 * 1000 / FPS / SUB_TICK); - - for (int i = 0; i &lt; NUM_SQUARE; i++) - for (int j = i + 1; j &lt; NUM_SQUARE; j++) { - handle_collision_elastic(&square[i], &square[j]); - /* ... */ - } - /* ... */ - } - /* ... */ - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex4/ex4.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex4.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: \ -<a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> diff --git a/man/computer/xlib_playground5.html b/man/computer/xlib_playground5.html @@ -1,116 +0,0 @@ -<h1>Xlibで遊んでみる5</h1> -<time>2023-01-03</time> - -<p> -前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> -<p> -言語: C言語<br /> -ソースコード: \ -<a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>円の衝突判定とその処理</h2> -<p> -前回四角形で行っていた衝突判定とその処理を今回は円でした。\ -衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので\ -簡単である: -</p> -<pre><code>\ -struct circle { - float ppx, ppy; // previous position (center) - float px, py; // current position (center) - float vx, vy; // velocity - int r; // radius - int m; // mass -}; - -int -circle_test_collision(struct circle *c1, struct circle *c2) -{ - return (c1-&gt;px - c2-&gt;px) * (c1-&gt;px - c2-&gt;px) + - (c1-&gt;py - c2-&gt;py) * (c1-&gt;py - c2-&gt;py) &lt; - (c1-&gt;r + c2-&gt;r) * (c1-&gt;r + c2-&gt;r); -} -</code></pre> - -<p> -衝突後は前回と同じく弾性衝突として処理した。\ -四角形とは違い、衝突方向の場合分けが不要なので楽である。 -</p> -<pre><code> -void -circle_handle_collision_mm(struct circle *c1, struct circle *c2) -{ - if (!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - - c1-&gt;px = c1-&gt;px - col_px / 2; - c1-&gt;py = c1-&gt;py - col_py / 2; - c2-&gt;px = c2-&gt;px + col_px / 2; - c2-&gt;py = c2-&gt;py + col_py / 2; -} - -void -circle_handle_collision_elastic(struct circle *c1, struct circle *c2) -{ - if(!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - float nor_px = col_py; - float nor_py = -col_px; - - float m1 = c1-&gt;m; - float m2 = c2-&gt;m; - - float col_1v = c1-&gt;vx * col_px + c1-&gt;vy * col_py; - float col_2v = c2-&gt;vx * col_px + c2-&gt;vy * col_py; - - float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; - float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; - float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; - float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; - - float nor_1vx = nor_px * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_1vy = nor_py * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_2vx = nor_px * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - float nor_2vy = nor_py * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - - c1-&gt;vx = col_1vxn + nor_1vx; - c1-&gt;vy = col_1vyn + nor_1vy; - c2-&gt;vx = col_2vxn + nor_2vx; - c2-&gt;vy = col_2vyn + nor_2vy; - - circle_handle_collision_mm(c1, c2); -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex5.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: \ -<a href="xlib_playground6.html">Xlibで遊んでみる6</a> -</p> diff --git a/man/computer/xlib_playground6.html b/man/computer/xlib_playground6.html @@ -1,209 +0,0 @@ -<h1>Xlibで遊んでみる6</h1> -<time>2023-01-25</time> - -<p> -前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> -<p> -言語: C言語<br /> -ソースコード: \ -<a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>ワールドマップの作成</h2> -<p> -ゲームのワールドマップを作製した。\ -ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロック\ -の場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした: -</p> -<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] = -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"........b......................................................................." -"................................................................................" -"................................................................................" -"....b..........................................................................." -"................................................................................" -"................b..............................................................." -"..........................................................b..........b.........." -"................................................................................" -".......................b........................................................" -"...........................................b...................................." -"...........................................b...................................." -"................................................................................" -"..................b............................................................." -"................................................................................" -"...........................................b...................................." -"................................................................................" -"................................................................................" -"...........................b...................................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..............................................bbbbbbbbbb........................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..........................bbbbbbbbbb............................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................bbbbbbbbbb......................................................" -"................................................................................" -"................................................................................" -"...p............................................................................" -"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb" -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................."; -</code></pre> - -<h2>プレイヤーの作成</h2> -<p>\ -プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:\ -</p> -<pre><code>struct rect { - float ppx, ppy; - float px, py; - float vx, vy; - float ax, ay; // acceleration - int w, h; - int m; -}; -</code></pre> -<p>\ -ワールドマップを読み込み、その際にプレイヤーに重力を付加:\ -</p> -<pre><code>struct rect block[NUM_RECT]; -struct rect player; - -/* ... */ - - int bi = 0; - for (int i = 0; i &lt; WORLD_WIDTH * WORLD_HEIGHT; i++) { - if (world_map[i] == 'b') { - block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE; - block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE; - block[bi].ax = 0; - block[bi].ay = 0; - block[bi].vx = 0; - block[bi].vy = 0; - block[bi].w = block[bi].h = BLOCK_SIZE; - block[bi].m = block[bi].w * block[bi].h; - bi++; - } else if (world_map[i] == 'p') { - player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE; - player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE; - player.vx = 0; - player.vy = 0; - player.ax = 0; - player.ay = GRAVITY; - player.w = player.h = BLOCK_SIZE; - player.m = player.w * player.h; - } - } -</code></pre> - -<p>\ -ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。\ -<code>A</code>、<code>D</code>でそれぞれ左右に加速し、\ -地面に接しているときに<code>space</code>キーでジャンプさせる: -</p> -<pre><code>void -handle_inputs(int key_state[]) -{ - if (key_state[KEY_Q] == KEY_DOWN){ - next_menu = GAME_OVER; - return; - } - if (key_state[KEY_D] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = 500; - } else { - player.ax = 1000; - } - } else if (key_state[KEY_A] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = -1000; - } else { - player.ax = -500; - } - } else { - if (player_is_falling) - player.ax = -player.vx; - else - player.ax = -3 * player.vx; - } - - if (player.vx &lt; -200) player.vx = -200; - if (player.vx &gt; 200) player.vx = 200; - if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN) - player.vy = -450; -} -</code></pre> - -<p>\ -変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算\ -するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:\ -</p> -<pre><code>void -rect_next_tick(struct rect *s, long ndt) // nano second -{ - s-&gt;ppx = s-&gt;px; - s-&gt;ppy = s-&gt;py; - s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000; - s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000; - s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000; - s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000; - - // bind within the window - if (s-&gt;px &lt; 0) { - s-&gt;px = 0; - //s-&gt;vx *= -1; - } - if (win_width &lt; s-&gt;px + s-&gt;w) { - s-&gt;px = win_width - s-&gt;w; - //s-&gt;vx *= -1; - } - // game over when fall out of the screen - if (s-&gt;py &gt; win_height) - next_menu = GAME_OVER; -} -</code></pre> - - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex6.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> diff --git a/man/draft/9p_go.html b/man/draft/9p_go.html @@ -1,385 +0,0 @@ -<h1>9PのGoによる実装</h1> -<time>2024-12-18</time> - -<h2>メッセージの構造体の定義</h2> -<p> -メッセージには<code>size</code>、<code>tag</code>等共通の要素がある。\ -クライアントからメッセージを受けとる際、\ -<code>size</code>を参照して何バイト読むか判断し、\ -メッセージの<code>type</code>によりその後の処理を場合分けする。\ -そのためにメッセージを<code>interface</code>として定義した: -</p> -<pre><code>\ -// A Msg represents any kind of message of 9P. -// It defines methods for common fields. -// For each message type &lt;T&gt;, new&lt;T&gt;([]byte) function parses the byte array -// of 9P message into the corresponding message struct. -// For detailed information on each message, consult the documentation -// of 9P protocol. -type Msg interface { - // Size returns the size field of message. - // Size field holds the size of the message in bytes - // including the 4-byte size field itself. - Size() uint32 - // Type returns the type field of message. - Type() MsgType - // GetTag returns the Tag of message. - // Tag is the identifier of each message. - // The Get prefix is to avoid name confliction with the each - // message's Tag field. - GetTag() uint16 - // SetTag sets the Tag field of the message. - SetTag(uint16) - // Marshal convert Msg to byte array to be transmitted. - marshal() []byte - String() string -} -</code></pre> -<p> -<code>marshal()</code>はサーバーから返信を送る際に\ -メッセージの構造体をバイト列にエンコードするための関数である。\ -<code>String() string</code>はログ出力用。\ -</p> -<p> -メッセージはバイト列として受け取った後、\ -メッセージのタイプによって処理を分ける。\ -その際、扱いやすいようにバイト列を各メッセージの構造体に\ -変換する。\ -変換前のバイト列から、各メッセージに共通のフィールドを\ -取得できると便利なので、\ -バイト列のまま<code>Msg</code>インターフェースを実装する\ -<code>bufMsg</code>を定義した。\ -名前はいまいち。\ -</p> -<pre><code>\ -type bufMsg []byte - -func (msg bufMsg) Size() uint32 { return gbit32(msg[0:4]) } -func (msg bufMsg) Type() MsgType { return MsgType(msg[4]) } -func (msg bufMsg) GetTag() uint16 { return gbit16(msg[5:7]) } -func (msg bufMsg) SetTag(t uint16) { pbit16(msg[5:7], t) } -func (msg bufMsg) marshal() []byte { return []byte(msg)[:msg.Size()] } -func (msg bufMsg) String() string { - switch msg.Type() { - case Tversion: - return newTVersion(msg).String() - /* 省略 */ - } -} -</code></pre> -<p> -<code>gbit32</code>は4バイトのリトルエンディアンの配列を\ -整数に変換するもので、\ -<code>pbit32</code>は逆に整数をリトルエンディアンのスライスに\ -格納するものである。\ -</p> -<p> -各メッセージはそれぞれのフィールドを構造体のフィールドとして\ -定義したものである。\ -例えば<code>tversion</code>に対応する構造体は以下の通り。\ -</p> -<pre><code>\ -type TVersion struct { - Tag uint16 - Msize uint32 - Version string -} -</code></pre> -<p> -バイト列から各メッセージの構造体に変換するために\ -<code>new<i>メッセージタイプ</i></code>\ -を定義した。 -</p> -<pre><code>\ -func newTVersion(buf []byte) *TVersion { - msg := new(TVersion) - msg.Tag = gbit16(buf[5:7]) - msg.Msize = gbit32(buf[7:11]) - vs := gbit16(buf[11:13]) - msg.Version = string(buf[13 : 13+vs]) - return msg -} -</code></pre> - -<h2>メッセージのやりとり</h2> -<p> -まずは9Pメッセージを読む関数を実装する。\ -バイト列が読めればいいので引数は<code>io.Reader</code>にした: -</p> -<pre><code>\ -func readMsg(r io.Reader) ([]byte, error) { -</code></pre> -<p> -最初にメッセージのサイズを読む: -</p> -<pre><code> buf := make([]byte, 4) - read, err := r.Read(buf) - if err != nil { - if err == io.EOF { - return nil, err - } - return nil, fmt.Errorf(&quot;read size: %v&quot;, err) - } - if read != len(buf) { - return buf, fmt.Errorf(&quot;read size: invalid message.&quot;) - } - size := bufMsg(buf).Size() -</code></pre> -<p> -続いて読みこんだサイズに基づいてメッセージの残りの部分を読む。 -一回の<code>Read</code>で最後まで読めないことがあったので、 -全部読めるまで<code>Read</code>を繰り返す: -</p> -<pre><code> mbuf := make([]byte, size-4) - for read = 0; read &lt; int(size)-4; { - n, err := r.Read(mbuf[read:]) - if err != nil { - return buf, fmt.Errorf(&quot;read body: %v&quot;, err) - } - read += n - } - buf = append(buf, mbuf...) - return buf, nil -} -</code></pre> -<p> -読み込んだバイト列は<code>ReadMsg</code>関数で\ -メッセージの構造体に変換する。\ -</p> -<pre><code>\ -RecvMsg(r io.Reader) (Msg, error) { - b, err := readMsg(r) - if err == io.EOF { - return nil, err - } else if err != nil { - return nil, fmt.Errorf(&quot;readMsg: %v&quot;, err) - } - return unmarshal(b) -} -</code></pre> -<p> -返信のメッセージはメッセージの構造体を<code>marshal</code>関数\ -でバイト列に変換して<code>io.Writer</code>に書き込む。\ -</p> -<pre><code>\ -// SendMsg send a 9P message to w -func SendMsg(msg Msg, w io.Writer) error { - if _, err := w.Write(msg.marshal()); err != nil { - return fmt.Errorf(&quot;write: %v&quot;, err) - } - return nil -} -</code></pre> - -<h2>メインループ</h2> -<p> -ライブラリはメッセージを読み込むためのリスナーgoroutinと\ -返信を書き込むためのレスポンダーgoroutine、\ -そして各メッセージを処理するためのgoroutineを立ち上げて、\ -チャネルでそれぞれを繋ぐ。\ -リスナーがメッセージを読み込むと、<code>request</code>構造体に格納し、\ -メッセージのタイプに応じて各goroutineに渡す。\ -渡されたgoroutineはメッセージに応じた処理をし、\ -返信のメッセージをリスポンダーgoroutineに渡す。\ -リスポンダーgoroutineはメッセージをバイト列に変換して返信する。 -</p> -<p> -この設計がいいかどうかよく知らんけど、\ -Go言語を触るからgoroutineとチャネルによるパイプラインを作ってみたかった。\ -</p> - -<h2>各メッセージの処理</h2> -<p> -メッセージは<code>s<i>メッセージタイプ</i></code>goroutineで処理する。\ -関数は<code>for</code>ループのなかでチャンネル<code>rc</code>から\ -<code>request</code>が届くのを待つ。\ -届いたリクエストには<code>ifcall</code>フィールドにクライアントからの\ -<code>Msg</code>が含まれるので、\ -この関数が担当するstructにキャストする。\ -このキャストが失敗するのは明かなサーバーのバグなのでタイプアサーションはしない。\ -</p> -<pre><code>\ -func s<i>メッセージタイプ</i>(ctx context.Context, c *conn, rc &lt;-chan *request) { - for { - select { - case &lt;-ctx.Done(); - return - case r, ok := rc: - if !ok { - return - } - ifcall := r.ifcall.(*T<i>メッセージタイプ</i>) -</code></pre> -<p> -各種処理を完了したら、届いた<code>request</code>の<code>ofcall</code>に\ -返信の<code>Msg</code>を格納して返信を担当するgoroutineに送る。\ -<pre><code> select { - case c.respChan &lt;- r: - case &lt;-ctx.Done(): - return - } -</code></pre> -</p> -<h3>Version</h3> -<p> -クライアントから届いたバージョンの提案を見て、頭に"9P2000"があれば\ -返信のバージョンを"9P2000"にする。\ -現在定義されているバージョンは"9P2000"の他、\ -Unix用に拡張した"9P2000.u"、Linux用に拡張した"9P2000.l"がある。\ -基本的な昨日を実装することが目標なので、"9P2000"のみを受け付ける。\ -</p> -<p> -Versionメッセージではメッセージの最大サイズも決定する。\ -サーバーは予め8Kバイトを最大サイズにしている。\ -クライアントがこれ以上のサイズを提案した場合、8Kにしてもらい、\ -これ以下のサイズを提案した場合、そのサイズでメッセージをやりとりする。\ -8Kバイトという既定値はplan9の実装を参考にした。\ -このサイズである必然性はよく知らない。\ -</p> -<pre><code> version := ifcall.Version - if strings.HasPrefix(version, &quot;9P2000&quot;) { - version = &quot;9P2000&quot; - } else { - version = &quot;unknown&quot; - } - msize := ifcall.Msize - if msize &gt; c.mSize() { - msize = c.mSize() - } - r.ofcall = &amp;RVersion{ - Msize: msize, - Version: version, - } - c.setMSize(r.ofcall.(*RVersion).Msize) -</code></pre> - -<h3>Auth</h3> -<p> -サーバーの認証は<code>Server</code>の<code>Auth</code>フィールドに\ -認証のためのやりとりを待ち受ける関数を登録することで有効化できる。\ -このフィールドが<code>nil</code>の場合、認証が必要ない旨のエラーを返す。\ -</p> -<pre><code> if c.s.Auth == nil { - r.err = fmt.Errorf(&quot;authentication not required&quot;) - goto resp - } -</code></pre> -<p> -認証が必要な場合、クライアントから提案された<code>afid</code>をコネクションに\ -登録して、<code>Server.Auth</code>を呼び出す。 -</p> - -<h3>attach</h3> -<p> -サーバーはまず認証が必要な場合認証が済んでいるか確認する。\ -</p> -<pre><code> switch { - case c.s.Auth == nil &amp;&amp; ifcall.Afid == NOFID: - case c.s.Auth == nil &amp;&amp; ifcall.Afid != NOFID: - r.err = ErrBotch - goto resp - case c.s.Auth != nil &amp;&amp; ifcall.Afid == NOFID: - r.err = fmt.Errorf(&quot;authentication required&quot;) - goto resp - case c.s.Auth != nil &amp;&amp; ifcall.Afid != NOFID: - afid, ok := c.fPool.lookup(ifcall.Afid) - if !ok { - r.err = ErrUnknownFid - goto resp - } - af, ok := afid.file.(*AuthFile) - if !ok { - r.err = fmt.Errorf(&quot;not auth file&quot;) - goto resp - } - if af.Uname != ifcall.Uname || af.Aname != ifcall.Aname || !af.AuthOK { - r.err = fmt.Errorf(&quot;not authenticated&quot;) - goto resp - } - } -</code></pre> -<p> -次にクライアントが要求してきたファイルツリーがサーバーにあるかどうか確認し、\ -クライアントが設定した<code>fid</code>にルートディレクトリを紐付ける。\ -</p> -<pre><code> r.fid, err = c.fPool.add(ifcall.Fid) - if err != nil { - r.err = ErrDupFid - goto resp - } - r.fid.path = &quot;.&quot; - r.fid.uid = ifcall.Uname - fsys, ok = c.s.fsmap[ifcall.Aname] - if !ok { - r.err = fmt.Errorf(&quot;no such file system&quot;) - goto resp - } - r.fid.fs = fsys - fi, err = fs.Stat(ExportFS{c.s.fsmap[ifcall.Aname]}, &quot;.&quot;) - if err != nil { - r.err = fmt.Errorf(&quot;stat root: %v&quot;, err) - goto resp - } - r.fid.qidpath = fi.Sys().(*Stat).Qid.Path - r.ofcall = &amp;RAttach{ - Qid: fi.Sys().(*Stat).Qid, - } -</code></pre> - -<h3>flush</h3> -<p> -指定されたリクエストの<code>flush</code>メソッドを呼び出す。\ -<code>flush</code>メソッドはリクエストの<code>done</code>チャンネルを閉じ、\ -リクエストのタグを削除する。\ -処理に時間のかかるものは、リクエストの<code>done</code>チャネルが閉じられたら、\ -その処理を中止する。\ -</p> -<pre><code>\ -// flush cancels the request by calling r.cancel. -// It also delete the request from its pool. -func (r *request) flush() { - close(r.done) - r.pool.delete(r.tag) -} -</code></pre> - -<h3>walk</h3> -<p> -仕様に書かれている通りの条件を確認した後、\ -ファイルツリーを順番に辿り、得られた<code>Qid</code>を\ -記録してクライアントに返す。\ -</p> -<pre><code> wqids = make([]Qid, 0, len(ifcall.Wnames)) - cwdp = oldFid.path - for _, name := range ifcall.Wnames { - cwdp = path.Clean(path.Join(cwdp, name)) - if cwdp == &quot;..&quot; { - cwdp = &quot;.&quot; // parent of the root is itself. - } - stat, err := fs.Stat(ExportFS{oldFid.fs}, cwdp) - if err != nil { - break - } - wqids = append(wqids, stat.Sys().(*Stat).Qid) - } - if len(wqids) == 0 { - newFid.qidpath = oldFid.qidpath - } else { - newFid.qidpath = wqids[len(wqids)-1].Path - } - newFid.path = cwdp - newFid.uid = oldFid.uid - newFid.fs = oldFid.fs - r.ofcall = &amp;RWalk{ - Qids: wqids, - } -</code></pre> - -<h3>open</h3> -<h3>create</h3> -<h3>read</h3> -<h3>write</h3> -<h3>clunk</h3> -<h3>remove</h3> -<h3>stat</h3> -<h3>wstat</h3> diff --git a/man/draft/how_to_throw_away_smart_phone.html b/man/draft/how_to_throw_away_smart_phone.html @@ -1,17 +0,0 @@ -<h1>携帯電話捨てた</h1> -<time>2021-12-20</time> -<h2>スマートフォンを捨てたくなった。</h2> -<p>この端末から得られる情報にはあまりにも無駄が多いこと、そしてGoogle等に自分の情報を売り飛ばしている懸念が大きいこと。この2点が徐々に気になりだした。さらに通信料を節約する観点から楽天モバイルに変え、あまりスマートフォンを持ち歩かなくなった。そうして今迄どれほどの時間と神経をこの小さな機械に奪われてきたかに気付かされた。それと並行して、なにか情報を得たい時にパソコンを利用する機会が増え、いよいよこの端末を持っていること自体が嫌になった。いっそうのこのスマートフォンのない生活をしてやろうと思いたったのだ。</p> -<p>ここで、僕が捨てたいのはスマートフォンだけでなく、「何時でも何処でも連絡が取れてしまう便利な機械」である。世の中には電話以外にほぼなにもできない端末も売られているが、それも持ちたくない。携帯電話の番号ごと捨ててしまいたいのだ。</p> -<p>ところがこれが案外難しい。現状スマートフォンで利用しているサービスは、LINE、SMS、銀行のワンタイムパスワード、マイナポータルくらいである。この内マイナポータルは多少面倒だが市役所に行けばいいし、銀行もコンビニのATMで済ませられる。LINEはほぼ使っていないがたまに学生の時のグループに連絡が入る。しかしこれもメールでできなくもない。厄介なのはSMSである。なぜかSMSによる二段階認証をしないと利用できないサービスが存在するのだ。これを最初に書いていた頃には暗号資産の取引所を利用していたが、現在は解約した。<p> -<p>Googleのメールアドレスを長らく使っていたが、サーバーを借りて独自ドメインのメールアドレスを手に入れたので、これを機にウェブサービスに登録しているアドレスを随時変更して行った。一部学生のころのアドレスを利用していたアカウントがうまく変更できずにいる。特にマイクロソフトのアカウントはログインすら出来なかった。しかし概ねメールアドレスの変更と、使っていないアカウントの削除はできたと思うのである程度は諦めることにした。どうせ就職活動の時に手当たり次第作ったものは作ったことすら忘れていたりするだろうし。</p> - -<h2>令和4年6月6日携帯を解約した。</h2> -<p>ひと通りウェブサービスのアカウントを整理した所で、いよいよ携帯電話を持っている必要が無くなってしまった。そして6月6日の夜、勢い余って楽天モバイルを解約し、ラインのアカウントも削除してしまった。この日は気分よく寝れた。</p> - -<h2>Googleにログインできなくなった。</h2> -<p>携帯を解約し、メールアドレスを変更したとは言え、まだGoogleのメールの方にもあちこちからメールが届いていた。自分で把握できていないウェブサービスからである。当面はこちらのメールも時々確認して、消し忘れていたアカウントを削除していこうと考えていた。</p> -<p>ところがいつのことだったか、パソコンのneomuttからGoogleのアカウントにアクセスできなくなった。どうやら二段階認証の設定が必須になったようだ。然しこの二段階認証は携帯電話の番号が必要なようで、携帯を解約した僕にはどうすることもできない。そこで仕方なくブラウザでGoogleにログインして利用することにした。10年以上前のパソコンではかなり重くて使い辛いが、まあ日常的に確認するものではないので問題なかった。然し今度はブラウザからのログインも不可能にされてしまった。これもSMSによる二段階認証以外の方法はないようである。知らぬ間にセキュリティ強化と称してこちらの選択肢を無くしてしまうやり方にとうとう愛想が尽きた。とりあえず母の携帯を借りてログインし、すぐにアカウントごと消してしまった。</p> - -<h2>選択の自由</h2> -<p> diff --git a/man/draft/keitai.html b/man/draft/keitai.html @@ -1,12 +0,0 @@ -<h1>携帯電話を持たない生活</h1> -<h2>はじめに</h2> -<p>学生の頃僕はスマートフォンをよく利用していた。今時の一般的な利用頻度だったと思う。LINEやSNSのアプリをインストールして利用していたし、ニュースや動画もよく閲覧していた。</p> -<p>学生生活も終わりに差し掛った頃、仕送りの残高の確認を怠ったことから一時お金に困ったことがある。親に泣き付くこともできただろうが、間も無く社会人になるこの時期に一度、出費の整理をしようと思いたった。家の中を見渡せばどれもこれも無駄なものばかりが溢れていた。物を片っ端から捨て、買う物を厳選するよう心掛けた。この時に携帯の料金も当然目に付いた。月に何千円も払ってるのがあまりにも無駄に思えた。かと言って電話が使えないのは少し困る。就職先との連絡にも使うかもしれない。この時は携帯電話を完全に解約することは考えず、ただ電話だけのプランに変更した。然しキャリアと少しトラブルがあり、楽天モバイルのサービス開始とも時期が重なったのでそちらに移行することにした。その後すぐ会社を辞めて実家に帰ることになったが、家ではwifiに繋ぎ、外にはほぼ持ち出さないのでずっと無料で使えていた。ところが最近になった突然無料プランが廃止されることになった。</p> -<p>今携帯電話はほとんど使っていない。家に置きっぱなしだし、その家ではwifiがあるので携帯電話の通信は必要ない。なにより僕はこのスマートフォンという機械が嫌いである。root権限を得られず、無駄なアプリが沢山インストールされており、削除することすらできない。更にGoogleのアカウントが無いと満足に使うこともできない。僕はこのハードウェアを購入しただけの積りだったが、どうやら知らぬ間にGoogleとの契約を交してしまったようだ。また、パソコンに慣れているということもあり、タッチパネルが苦手である。年老いたものだ。兎に角どこを取ってもこの機械を持ちたくない理由ばかりである。こんなものの為に毎月千円払うのはなんとも虚しいのだ。</p> -<p>とは言っても電話番号を捨てるのは少しばかりハードルが高かった。SMSによる二段階認証が必要なサービスをいくつか利用していたのだ。然し最近やたらあちこちに自分のアカウントが散らばっているのが気になり、少しずつ解約を進めていた。そして今、パソコンに保存していたパスワードを頼りに使わないものを一通り解約し終わった。これで携帯電話を解約できるはず。</p> -<p>ところがスマートフォンにはLINEが残っていた。アカウントには携帯の電話番号が登録されている。インターネットで検索したりLINEに直接問い合わせたが、どうやらこの番号は消せないようである。丁度良い機会なのでLINEのアカウントも削除してしまおうと思い、した!</p> -<p>胸がすく。</p> - -<h2>Apple、Google、Microsoft</h2> -<p>今の日本に於て携帯電話を持っていないのは異常である。そしてほとんどの携帯はスマートフォンである。スマートフォンのOSと言えばiOS若しくはAndroidがほとんどである。前者を利用するにはAppleのIDが、後者はGoogleのアカウントがそれぞれ必要である。つまりほとんど全ての日本人がAppleかGoogleに紐付いていると言える。もちろん他の選択肢も無いことはないが、それらを利用している人数はほぼ無視できるだろう[要出典]。パソコンの方に目を向けて見ても同じようなものである。最近Windowをインストールして利用するにはMicrosoftのアカウントが必須になったようだ。他のOSはAppleかGoogleのものであるので同じことである。ただしパソコンはLinuxやBSD、Plan9等もあるのでスマートフォンよりは圧倒的にましではある。</p> -<p>世の中の流れとは、あるいは世論とは、本来その世の中に生きる一人一人が作り出すものである。各自が自身の内面からくる欲望と、身近な人への配慮との間に自分の行動が発生するはずだ。ところが今、そういった世の流れはどこか遠くからやって来て、自分達はただその波にゆられるだけである。自分自身が波に影響を与えることがないと多くの人は思っているのではないか。ほんの少し前まではその波はテレビだったり新聞だったりが起していた。ところが今はインターネットに溢れる広告やら検索結果やらで知らぬ間に脳の中に入り込んでいる。</p> diff --git a/man/draft/life.html b/man/draft/life.html @@ -1,60 +0,0 @@ -<h1>暮し</h1> - -<p> -朝4時、太陽がまだ昇らないうちに起き、家の隣にある畑へ。\ -夏の熱気に勢いをつけた草を整理し、種を蒔く。\ -この日は黒田五寸を蒔いた。\ -朝食べる野菜を少し収穫して台所に戻る。\ -家内が米を研いでいる。\ -枝豆、山東菜、とうもろこし、大根と日野菜の間引き菜、真黒茄子。\ -枝豆、とうもろこしを茹でる。\ -間引き菜を味噌汁に。\ -山東菜はそのままサラダ。\ -茄子は糠に漬け、昨日の胡瓜と入れ替える。\ -昨日干しておいた鯵の味醂干しを焼く。\ -子供が起きてきていただきます。\ -</p> - -<p> -午前中は少しだけ仕事をする。\ -最近はプログラミングばかりしている。\ -仕事といってもボランティアで収入にはならない。\ -偶にだれかがビットコインを寄付してくれる。\ -</p> - -<p> -昼はパンを少しだけ。\ -この日は2日前に焼いたもの。\ -アゼルバイジャンのオバチャンがYoutubeで焼いていたもの\ -を適当に真似てみた。\ -小麦粉に酵母、塩、砂糖を混ぜ、水でこねる。\ -一次発酵の後、小分けにして二次発酵。\ -楕円にのばして三次発酵の後、卵をぬり胡麻をふりかけて焼成。\ -動画では楕円にしたあとコップで穴を開けていたがこれは省いた。\ -棒にさして売りに行っていた名残とかなんかな。\ -</p> - -<p> -食べた後は昼寝をする。\ -夏は夜の睡眠時間が短くなるので昼寝は必須である。\ -</p> - -<p> -眠気が覚めたら家のリフォームの続きをした。\ -この家は祖父が建てたもので、木造ではあるが残念ながら近代的な造りである。\ -礎石ではなくコンクリートのベタ基礎だし、\ -筋交いがいたる所にある。\ -建て直しも考えたが、今あるものを大切にするのもいいと思い、\ -内装だけ変えることにした。\ -今は台所に竃を作っている。\ -先週までに三和土の土間を作り終えたので、\ -この上に土を盛って形はほぼできている。\ -仕上げに黒い漆喰を塗った。\ -竃の場所は家の南東角で、二階建の家にあって唯一上に部屋が無い場所である。\ -煙突は設けず、天井をひっぺがして小屋組に煙がまわるようにした。\ -</p> - -<p> -穴の開いた浴衣の袖を修理しているところに子供が友達を従えて帰ってきた。\ -</p> - diff --git a/man/draft/light.html b/man/draft/light.html @@ -1,14 +0,0 @@ -<h1>照明は(あんまり)いらない</h1> -<h2>照明のない生活</h2> -<p>僕は長らく照明をほぼ使わない生活をしている。学生の頃節約にはまり、出費をあれこれ見直していると、部屋の天井であたりまえのように光り輝いている電灯が目についた。もともと不眠症ということもあり、電灯を消したほうがいいのではないかと、しばらく使わない生活をしてみた。といっても夜は真っ暗になるので、たまたま棚の奥で暇そうにしていたハリケーンランタンを引っ張り出して久々に灯した。やっぱりこっちの方が雰囲気もあっていい。ということでしばらく電灯を使わない生活をしていると、悩みの種だった不眠症は嘘のように無くなった。すごく寝付きがいいのだ。</p> -<p>就職先が決まり引越した時も、新居の天井には何も付けないで置いた。この家では台所の換気扇に暖色の豆電球が付いていたので夜はこれを使うことにした。</p> -<p>仕事を辞めて実家に帰って来てThinkPad X220を買ったので、ウェブカメラの横についているThinkLightを使っている。本当はランタンを使いたいのだが、同居人に臭いと言われるので控えている。リビングに居てはこれまた同居人がいるので真っ暗にはさせてもらえない。</p> - -<h2>変化</h2> -<p>こんな経緯でもう何年か照明を控えた生活をしている。すると身体にはいろいろと変化があるものである。ひとつ目は既に書いたが、寝付きがよくなったことである。セロトニンだかメラトニンだか知らないがやはり身体が夜を検知しているようだ。ふたつ目は暗くても物が見えるようになったことである。慣れれば見えるのだ。あるいは視力だけでなく、どこに何を置いたのかよく記憶しているのかも知れない。文明が身体を蝕んでいる証拠でもあろう。みっつめは世の中がまぶしくて仕方がなくなったことである。どうしてこうも電灯を点けて喜んでいるのか。</p> -<p>天井に電灯があり、昼も夜も灯すのが当然となっている。どうしてこうなったのか。昼は天気の善し悪しを観じ、夜は月の満ち欠けを知る。電灯は世界とのこの一体感を我々から奪ってしまった。宇宙の波動を全身で受けずして身体が整うはずがない。不眠症患者は睡眠薬を飲む前にすることがいくらでもあろう。</p> -<p>古来人間は暗い夜を火の灯りだけで生活して来た。日本の家においては昼間も薄暗いものだった。夜暗くて物が見えないのではなく、日頃不必要に明るくしているから見えないのである。便利は人間を軟弱にする。</p> -<p>ところで世の中はどうしてこうも明るいのか。スーパーもコンビニもしんどい。ドラッグストアは近付くことも憚られる。電気が足りぬと言う前に使い方を考えたらいいものを。そして夜は明るさが正義とばかりに街灯を立て、空から光を奪っている。</p> - -<h2>おわりに</h2> -<p>節約にもなるしゆったりした時間を過ごせるので電気消してみんかい?</p> diff --git a/man/draft/medical_care.html b/man/draft/medical_care.html @@ -1,3 +0,0 @@ -<h1>医療</h1> -<time>2022-01-24</time>作成 -<p> diff --git a/man/draft/migration.html b/man/draft/migration.html @@ -1,64 +0,0 @@ -<h1>移住計画</h1> -<h2>はじめに</h2> -<p> -都会が合わなくて田舎に戻った。 -しかし田舎といっても山村ではない。 -中途半端に都市化した街である。 -近くに高速道路があり、耳澄ませば行き交う車の音がいつも聞こえてくる。 -防災無線は毎日二回放送があり、12時と17時にはチャイムが鳴る。 -夜になってもあちこちで電灯が灯って星がよく見えない。 -</p> - -<h2>山の条件</h2> -<h3>静かであること</h3> -<p> -都会が合わなかった理由として初めに思い浮ぶのは音である。 -都会は雑音で満ちている。 -何処の店に行っても必ず音楽が流れているし、商店街等では路上でも音楽が響いている -ことさえざらである。 -さらにゴミ収集車は単純な旋律を練り廻っていて、廃品回収車やさおたけ屋が後に続く。 -防災無線は街中何処にいても必ず聞こえるように配置されている。 -このような場所において精神を正常に保つのは不可能だった。 -</p> -<p> -ということでひとつめの条件は静寂である。 -</p> -<p> -ただし自然な音は気にしない。 -実家の周りが田圃だったので夏にはかえるの大合唱が聞こえるが、これを五月蝿いとは -感じない。 -</p> -<p> -最近実家近くの山を探索している。たしかに実家にいるよりはるかに静かだが、 -立ち止まって耳を澄ませるとやはり高速道路の騒音が聞こえる。 -他の音が少ないだけに余計目立つ。 -それに防災無線の音はむしろひどい。 -山の裾にある集落のために建てられたものがあり、そこから遮るものがないので -かなりよく聞こえる。 -</p> - -<h3>安全で清潔な水源があること</h3> -<p> -実家の近くに綺麗な小川があるので水源を探ろうと山に分けいった。 -途中小さな滝があり、それを見上げるように祠があり、登るほど期待が高まった。 -ところがある程度行くと谷すじにごみがめだつようになってきた。 -さらに進むと突然コンクリートの壁が立ちはだかり、水はそこにあけられた -小さな穴から流れていた。 -コンクリートの上は舗装された道路で、ごみはそこから投げ捨てられていたようだ。 -ごみのなかには電化製品もまじっているので、何が溶け出しているかわかったものではない。 -クリーンセンターに持っていけば無料で引き取ってくれるのを知らないのだろう。 -</p> -<p> -最近のことでもないのかもしれないが、やたらと山奥にまで綺麗に舗装された -道路が伸びている。海南から紀美野町を抜けて高野山に続く道が少しづつ -広く真っ直ぐにされつつある。 -よっぽど山奥に住まない限り道路の呪縛からは逃れられないのかもしれない。 -</p> -<h3>実家から通えること</h3> -<h3></h3> - - -<h2>近くの山</h2> -<h3>藤白山</h3> -<p> -</p> diff --git a/man/draft/myrica_rubra.html b/man/draft/myrica_rubra.html @@ -1,10 +0,0 @@ -<h1>ヤマモモ</h1> -<span class="binomial name"><i>Myrica rubra</i> Sieb. et Zucc.</span> -<h2>概要</h2> -<h2>利用</h2> - <h3>食べ方</h3> - 濃い紫になったものを生でそのまま食べる。 - 種を取り除いてジャムに。 - ホワイトリカーに漬けて果実酒に。 - <h3>染料として</h3> - 樹皮をはいで diff --git a/man/draft/openbsd_installation.html b/man/draft/openbsd_installation.html @@ -1,56 +0,0 @@ -<h1>OpenBSDインストール</h1> -<time>2021-12-16</time> -<p>OpenBSDをノートパソコンにインストールしたのでその時のメモ</p> - -<p>インストール用のライブUSBを作成</p> -<p>ブート</p> -<p>指示通りインストール</p> - -<p>Reboot</p> -<p>通常ユーザーでログインしてルートユーザーになる</p> -<pre><code>$ su -Password: -</code></pre> - -<p><code>doas(1)</code>を設定して通常ユーザーに戻る</p> -<pre><code># cp /etc/examples/doas.conf /etc/ -# sed -i 's/permit keepenv :wheel/permit nopass keepenv :wheel/' /etc/doas.conf -# exit -$ doas echo unko -unko -</code></pre> - -<p><code>syspatch(8)</code>をあてる</p> -<pre><code>$ doas syspatch -... -Relinking to create unique kernel... done. -</pre></code> - -<p><code>apmd(8)</code>を設定</p> -<pre><code>$ doas rcctl enable apmd -$ doas set apmd flags -A -z 10 -$ rcctl start apmd -apmd (ok) -</pre></code> - -<p>wi-fiを設定</p> -<pre><code>$ ifconfig -... -iwn0 flags=... -... -$ ifconfig iwn0 up -$ doas sh -c 'echo "join <i>ssid</i> wpakey <i>password</i> -autoconf" > /etc/hostname.iwn0' -$ doas chown root:wheel /etc/hostname.iwn9 -$ doas chmod 0640 /etc/hostname.iwn0 -$ doas sh /etc/netstart -... -</pre></code> - -<p>必要なパッケージをインストール</p> -<p><code>dotfiles</code>をダウンロード</p> -<p>suckless utilitiesをインストール</p> -<p><code>man(1)</code>のパスを設定</p> -<p><code>slock(1)</code>を設定</p> -<p><code>xenodm(1)</code>を設定</p> -<p><code>mail(1)</code>の設定<a href="https://www.c0ffee.net/blog/openbsd-on-a-laptop/#base-utilities">ref</a></p> diff --git a/man/draft/opinion.html b/man/draft/opinion.html @@ -1,7 +0,0 @@ -<h1>意見の言い方</h1> -<h2>檀家とのやりとり</h2> -<p>落葉を掃除している檀家さんに、落葉を綺麗にするのが本当にいいことかどうか分からないという話をした。自分の意見を言った上で相手からも考えを聞き出したかった。ところがこの人は自分の献身を否定されたと感じたらしく、機嫌が悪くなり、なにも聞いてくれなかった。一方的にこちらの言うことを全否定して終わりである。言い方やタイミングも悪かったのだろうが、こんなに拒絶されるとは思わなかった。</p> -<p>住職の奥さんは台所の整理を全くしない。冷蔵庫はぐちゃぐちゃで、奥からは腐ってなにか判別できなくなたものが沢山でてきた。中には賞味期限が10年以上前のものもあった。僕もこの寺で生活することになり、食事の用意も手伝うようになったので、少しはましな状態にしたいと思い、本人の了承のもとで古いものを全て捨てた。冷蔵庫が綺麗になり、気分よく料理できるようになった矢先、この奥さんが果物を大量に買って来た。境内で採れた西瓜や以前に買っていたバナナも残っているにも関わらずである。次の日も食べる物は冷蔵庫にたくさんあるのにスーパーで天麩羅を買ってきた。冷蔵庫の整理は結構疲れるので、これを繰り返されてはたまらない。少し小言を言った。そしたら次の日にお前は小姑のようだと言われた。</p> -<p>冷蔵庫だけでなく、寺の中もかなり物であふれている。檀家さんの好意で寺に置かれているものも多いので質が悪い。これについても色々言いたいことはあるし、実際少し言った。これなんかも奥さんには負担だったらしい。こちらにもかなり負担なのだが。</p> -<h2>宗門の批判</h2> -<p>食事中、宗門の批判をし続けて宗門に嫌われた人の話がでた。自分が正しいと思っていることを言い続けただけのことだ。住職の奥さんはなぜこれほど反発を招いたのか全く分からないと言う。やはり僕は寺の環境を良くするためにも言いたいことは言い続けるべきなのだろうか。</p> diff --git a/man/draft/relayd.html b/man/draft/relayd.html @@ -1,44 +0,0 @@ -<h1>relayd、httpd、acme-client</h1> -<time>2025-07-17</time> - -<h2>はじめに</h2> -<p> -このサーバーでは<code>httpd</code>により80番ポートと443番ポートを監視して\ -ウェブサイトを運用していたが、別のソフトウェアを使ってバーチャルホストを立てたくなった。\ -そこで、<code>httpd</code>の手前に<code>relayd</code>を挟んで、\ -外から80番、443番ポートへの通信をサブドメインによって振り分けるようにした。\ -</p> - -<figure> -<figcaption>Before</figcaption> -<pre>\ -Internet -- tcp/80,443 -- httpd -</pre> -</figure> -<figure> -<figcaption>After</figcaption> -<pre>\ -Internet -- tcp/80,443 -- relayd -- tcp/8080,8443 -- httpd - └------ tcp/8081 -- other http server -</pre> -</figure> - -<h2>httpd.conf</h2> -<p> -<code>httpd.conf</code>は80番ポートを監視している部分はポート番号を変更するだけでいい。\ -443番ポートの方はポート番号の変更に加え、<code>tls</code>の部分を削除する。\ -tlsは<code>relayd</code>が行なう。\ -</p> - -<h2>acme-client.conf</h2> -<p> -こちらは<code>full chain certificate</code>のパス<code>relayd</code>が見つけられるように\ -変更する。 -</p> - -<h2>relayd.conf</h2> -<p> -80番ポートはそのまま8080番に転送する。\ -443番ポートはtlsをかませて8443番に転送する。\ -</p> - diff --git a/man/draft/safety_convenience.html b/man/draft/safety_convenience.html @@ -1,29 +0,0 @@ -<h1>安全装置と便利なもの</h1> -<time>2023-02-21</time> -<h2>安全装置は安全か</h2> -<p> -安全装置が至る所にある。\ -キッチンのコンロは鍋を置かないと火が着かない。\ -鍋を持ち上げると火が小さくなる。\ -温度が高くなっても自動で火が小さくなる。\ -温度が100度程度で安定している状態から100度を越えて上昇すると\ -勝手に火が消える。煮こみ過ぎて焦げ付くのを防ぐためだろう。\ -火を着けてから2時間が経過すると無条件に消える。\ -消し忘れを防止するためである。 -</p> -<p> -自動車にも安全のための機能があれこれ搭載されている。\ -アクセルペダルとブレーキペダルの踏み間違いを防止するもの、\ -自動ブレーキ、車線からはみ出さないようにするもの。 -</p> -<p> -これらは本当に安全性を高めているのだろうか。\ -</p> - -<h2>便利なものに副作用はないのか</h2> - -<h2>安全装置は危険を増長し、便利なものは身体を不便にする</h2> - -<h2># rm -rf /</h2> - -<h2>危険と不便は身体の感覚を磨く</h2> diff --git a/man/draft/vi.html b/man/draft/vi.html @@ -1,34 +0,0 @@ -<h1>vi -- テキストエディタ</h1> -<time>2024-10-27</time> -<h2>コマンドの実行</h2> -<p> -バッファにコピーした任意のテキストをコマンドとして実行できる。\ -</p> -<ul> -<li> -コマンドをどこかの行に入力。 -</li> -<li> -コマンドをバッファ<code>q</code>へコピー: -<code>\ -0"qy$ -</code> -</li> -<li> -バッファ<code>q</code>内のコマンドを実行: -<code>\ -@q -</code> -</li> -</ul> -<p> -例えば単語をhtmlの<code>code</code>タグで囲むコマンド: \ -<pre><code>\ -i&lt;code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u>\ -lea&lt;/code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u> -</code></pre> -をどこかに入力し、その行でコマンドモードに移行し、<code>0"qy$</code>と\ -すると<code>q</code>バッファに上のコマンドがコピーされるので、\ -<code>code</code>タグで囲みたい単語の先頭に移動し、<code>@q</code>と入力すると\ -その単語が<code>code</code>タグで囲まれる。 - diff --git a/man/draft/xlib2.html b/man/draft/xlib2.html @@ -1,169 +0,0 @@ -<h1>Xlibで遊んでみる</h1> -<time>2022-12-16</time> - -<h2>はじめに</h2> -<p>X11でGUIのプログラミングをしてみようと思い、してみた。\ -X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。\ -x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。\ -そのため、新しくなにかを作る場合はxcbを使うようにとのことである。\ -ところがこのxcbはドキュメンテーションに乏しく、\ -X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。\ -知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、\ -その関数なり構造体なりの説明がどこにも見当たらない。\ -manページもない。あるのはdoxygenなるものでソースコードのコメントから\ -自動生成したいい加減なものだけで、使いものにならない。</p> -<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、\ -もう少しましな情報があるXlibから始めることにした。\ -</p> -<p>言語はC言語である。ソースコードは\ -<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 - -<h2>初期設定</h2> -<p>ディスプレイを開き、ウィンドウを作成する。\ -変数はとりあえずグローバルに宣言することにした。\ -<code>main</code>関数はできるだけ小さくして実際の処理は\ -それぞれの関数にさせてみる:</p> -<pre><code> -#include &lt;stdio.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;X11/Xlib.h&gt; - -/* macros */ -#define INIT_WIDTH 800 -#define INIT_HEIGHT 600 - -/* variables */ -Display *display; -Window window; -unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; -Atom wm_delete_window; - -void -setup(void) -{ - // Open a display. - if ((display = XOpenDisplay(NULL)) == NULL){ - fprintf(stderr, "ERROR: could not open display\n"); - exit(1); - } - // Create a window. - window = XCreateSimpleWindow( - display, - XDefaultRootWindow(display), - 0, 0, - win_width, win_height, - 0, 0, - 0); - XStoreName(display, window, "UNKO"); - - // Setup a graphical context. - gc = XCreateGC(display, window, 0, NULL); - XSetForeground(display, gc, 0xFFFFFF); - - // Kill the application when the window is destroyed. - wm_delete_window = XInternAtom(display, - "WM_DELETE_WINDOW", False); - XSetWMProtocols(display, window, &wm_delete_window, 1); - - // Setup which input to process. - XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); - - // Actually draw the window. - XMapWindow(display, window); -} - -void -clean_up(void) -{ - XCloseDisplay(display); -} -</code></pre> - -<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。\ -</p> -<pre><code>#include &lt;time.h&gt; - -int -main(void) -{ - int px, py; - int quit; - struct timespec ts; - XEvent event; - - setup(); - quit = 0; - - while (!quit){ - while(XPending(display) > 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - clock_gettime(CLOCK_MONOTONIC, &ts); - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - 100, 100); // width and height - - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000 * 1000; - nanosleep(&ts, NULL); - } - - cleanup(); - return 0; -} -</code></pre> - -<p>文字を表示。<code>XDrawString</code></p> - -<h2>キーボード入力</h2> -<p>キーボードの入力を受け付けるようにする。\ -入力によって四角形の位置や速度を変化させる。</p> -<p>ここまでできればかなりなんでもできるようになる。</p> - -<h2>FPSの固定</h2> -<p>前のフレームからの経過時間を計測して1/FPSを越えるまで待機させる。\ -このときに<code>nanosleep</code>を使うとなぜか上手くいかなかった。\ -OSに処理をブロックされる為か?とりあえず<code>while</code>ループの中で\ -ひたすら時刻を読んでいるのだが、これでいいんかな。\ -リソースの無駄遣いではないんかな。</p> - -<h2>メニューの実装</h2> -<p>メニューとゲームの推移を実装した。</p> - -<h2>当たり判定</h2> -<p>とりあえず適当に実装した。\ -2体間の衝突のみ判定しているので近くに別の物体がいるとめりこむ場合がある。</p> -</p> - - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> -</ul> diff --git a/man/error/404.html b/man/error/404.html @@ -1 +0,0 @@ -<h1>404 Not Found</h1> diff --git a/man/error/moved.html b/man/error/moved.html @@ -1,2 +0,0 @@ -<h1>移転しました</h1> -<p>hatsukaze.comは<a href="https://www.mtkn.jp">mtkn.jp</a>に移転しました。</p> diff --git a/man/farm/index.html b/man/farm/index.html @@ -1,14 +0,0 @@ -<h1>農業</h1> -<p> -実家の近くに田畑を借りて作物を育てています。1反の畑と9畝の田圃です。川口由一さんの提唱された、耕さず、農薬や肥料を持ち込まず、草や虫を敵としない自然農を行っています。 -</p> -<p> -<time>2023-01-19</time>\ -令和4年の5月頃、体調を崩したため一旦畑は地主さんに返すことにしました。\ -以来農業からは離れています。 -</p> -<h2>日誌</h2> -<ul> - <li><a href=/farm/journal/2022.html>令和4年</a></li> - <li><a href=/farm/journal/2021.html>令和3年</a></li> -</ul> diff --git a/man/farm/journal/2021.html b/man/farm/journal/2021.html @@ -1,145 +0,0 @@ -<h1>令和3年 農業日誌</h1> -(旧暦) - -<h3>師走</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-01-27</time> -</div> -晴。畑の畝作り。菜っ葉の間引き。畝の間の溝に水が貯まっている。もう少し乾燥していたほうがいいのだろうか。菜っ葉はどれも成長が良いように見える。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-01-08</time> -</div> -晴。畑の方に畝を少し作った。じゃが芋を植えたいので少し高めの畝にする。昨年度は雨が続いて水没した部分が腐ってしまったのだ。今年はうまくいくといいな。新暦では年が明けた。今日は一日遅れたが七草粥を食べた。畑の隅に大根の余った苗をまとめていたのでそれを抜いて粥に入れた。成長がいいものは太さが15mm程度になっていた。玉葱の苗もまた少し定植した。始めの方に植え替えたもののうち一本だけ葉が太く、濃い緑になっていた。他のものは植えてから変化がないように見える。麦も変化があまりない。 -</div> - -<h3>霜月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-12-21</time> -</div> -晴。田圃の溝を少し整備。麦が成長してひとつめの畝は遠くからでもうっすらと緑に見えるようになった。畑の野菜もそれなりに育っている。 -<figure><figcaption>和歌山大根</figcaption><img src="pics/DSCF0249.JPG" alt="和歌山大根"></figure> -<figure><figcaption>大和真菜</figcaption><img src="pics/DSCF0252.JPG" alt="大和真菜"></figure> -<figure><figcaption>松島新二号白菜</figcaption><img src="pics/DSCF0255.JPG" alt="松島新二号白菜"></figure> -<figure><figcaption>いちばんぼし(裸大麦)</figcaption><img src="pics/DSCF0257.JPG" alt="いちばんぼし(裸大麦)"></figure> -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-12-19</time> -</div> -曇り時々雨。玉葱の定植。白菜、大根、真菜等が大きくなってきた。麦も大分育ったので踏もうとしていたら雨が降って来てできなかった。畔に子猫が居た。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">12日</div> -<time>2021-12-14</time> -</div> -晴。久々に冬らしく寒い朝だった。昼間は日が照って暑い。壬生菜の定植。畝作り。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2021-12-11</time> -</div> -晴。麦蒔きが完了した。庭のプランターに植えていた壬生菜を半分ほど畑に植えかえた。大根がわずかに太くなっている。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2021-12-10</time> -</div> -晴。日差しが強くて暑い。麦の続き。4本目の畝は小さいので草を刈らずに上から蒔いた。結局草刈りは全部は終わらず次の日に持ち越し。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">5日</div> -<time>2021-12-08</time> -</div> -晴。麦の続き。3本目の畝に蒔き終わった。始めに蒔いたところはそろそろ麦踏みか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">3日</div> -<time>2021-12-06</time> -</div> -晴。麦の続き。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2021-12-04</time> -</div> -曇時々晴。麦の続き。玉葱の移植。太いものから7本植えた。 -</div> - -<h3>神無月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2021-12-03</time> -</div> -晴。麦の続き。疲れがでてしばらく休んでいた。気付けば一週間ぶりの作業である。急いては事を仕損じる。結局ゆっくりやったほうが早く蒔けていただろう。始めに蒔いた麦はもう5cmほどに成長していた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">21日</div> -<time>2021-11-25</time> -</div> -曇時々雨。麦を蒔くための草刈りの続き。今日は200g蒔けた。既に蒔いていたものからもやしのようなものが出ているのを確認。根っこか。玉葱と壬生菜の苗も大きくなってプランターでは窮屈そうなので早く定植しなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-11-23</time> -</div> -晴のち曇。麦を蒔くための草刈りの続き。3時頃まで出掛けていたので今日は1時間だけ作業。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-11-21</time> -</div> -晴。麦蒔きの続き。蒔いてから草を刈るのではいそがしいので草を刈ってから蒔くことにした。また短期間のうちに全面蒔くのはあきらめた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">16日</div> -<time>2021-11-20</time> -</div> -晴。麦を蒔いた。一番長い畝の2/3ほど蒔けた。ばら蒔きした後草を刈る。この草刈に思ったより時間がかかる。のこぎり鎌でないと歯がすぐに丸くなる。買い替えようか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2021-11-18</time> -</div> -曇後晴。昼過ぎまで曇りで寒かったが昼から晴れて暑い。麦の畝がだいたい形になったところに丁度麦の種が届いた。和歌山県農業公社に申請していた畑を借りるための申請が通りそうだと、JAの人から連絡が入った。晴れて農家である。畑の方に山東菜を蒔いた。作業が続いて筋肉の動きが鈍ってきた。疲れない動き方ができるようになりたい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2021-11-17</time> -</div> -快晴。朝は季節にふさわしく寒いが日差しが強く昼は暑い。出掛ける時、以前声を掛けてくれた92才のおじいちゃんとすれ違う。田圃に畝を作るために溝を掘った。この田圃を借りてから続けていた作業だがもう少しで終りそうだ。11月中旬が麦蒔ききの適期であり既に少し遅い。田圃の隣のおばちゃんが蜜柑をくれた。 -</div> diff --git a/man/farm/journal/2022.html b/man/farm/journal/2022.html @@ -1,187 +0,0 @@ -<h1>令和4年 農業日誌</h1> -(旧暦) - -<h3>卯月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-05-09</time> -</div> -溝掃除。しばらく雨が降っていない。最後に米を蒔いてからは一回も降っていないと思う。曇って来たので降ってくれることを期待。畑の真黒茄子の一部が発芽した。自分用のメモとしてこの日誌を書いているので作物の位置関係が分かりにくい。なんかうまいこと表示できるやつ作ろうかな。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-05-04</time> -</div> -晴れ。朝は寒く、昼から暑い。一ヶ月程機構が戻ったようだ。昨年キミノーカで買った栗南瓜を、以前蒔いた南瓜の南に、春菊を白もちとうもろこしの一回目の北に、寄居蕪を白もちとうもろこしの二回目の北に、五角オクラを米の隣の里芋の南に、ときわ地這い胡瓜をこのオクラと里芋と同じ場所に、いちずいんげんを鷹の爪から米までの間にある背丈の高い草の足元に植えた。米の所に生えていた雑草は成長が案外遅く、米の方が高くなりつつある。じゃが芋のアンデスに花が咲いていた。鷹の爪の北に蒔いた葱がようやく生えてきた。生きとったんかわれ。麦は早いものはもう収穫してもよさそうなくらい色付いてきた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-05-02</time> -</div> -米の続き。最後の4mを鷹の爪の南に蒔いた。初めに蒔いた米は既に発芽を確認。然し別のイネ科の草もたくさん生えてきた。軸が赤い草である。家のプランターにも余った米を蒔いた。あと鷹の爪と加茂大芹川丸茄子、ししとうと真黒茄子をそれぞれ一緒に蒔いた。家で苗になればいいが。 -</div> - -<h3>弥生</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">30日</div> -<time>2022-04-30</time> -</div> -米の続き。朝から半日かけて4m程。田の畔も少し補強。里芋も追加で植えた。西瓜の北と茄子の南。昼からも作業したかったが疲れてしまった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-04-25</time> -</div> -20日にも畑に出たと思うが記録していなかった。20日は米の続き。前回4m程蒔いたがこの時は2mにした。疲れは禁物である。25日も米の続きに加え、蒟蒻をアンデスの南に植えた。あとは鷹の爪を適当に蒔いた。前回蒔いた所に上からばら蒔きしただけである。米の方は今回午前には2m蒔いた。午後もできるだろうか。麦の下の方が茶色くなってきた。午後も米の続き。また2m程。旭大和西瓜を男爵の東と空豆の北に、男爵の東の西瓜の南にとある露天で買った日本南瓜を、日野菜の東のあたりに池田越瓜を植えた。滝野川牛蒡の南にしろもち玉蜀黍を植えた。男爵の南に落花生を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2022-04-19</time> -</div> -米を蒔いた。20mの畝のうち4m程。体力を消耗したうえ花粉症と喘息で眠れなかった。身体を作りアレルギーを何とかしなければ。呼吸と食事を見直さないといけない。一日寝込むだけで半年間の食糧が手に入らないのはきびしい世界である。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-04-14</time> -</div> -晴。前日の夜から朝にかけて雨だった。麦は全体的に出穂していた。畑の北側の空いていた場所と空豆が倒れたり成長が悪くてできた隙間に里芋を植えた。多分全て芽赤芋?2つ程昨年のものが混じっているかも知れない。畑の北の方はカラスノエンドウが群生している。日野菜が残っていた所に寄居蕪を蒔いた。日野菜は刈ってしまったが必要なかったか。以前大浦太牛蒡を蒔いた隣に同じ牛蒡を植えた。以前は点蒔きだったが今回は二条のすじ蒔きにした。以前のものは少しだが芽が出ていた。同じ畝の北に植えていた滝野川大長牛蒡も発芽。しろもち玉蜀黍を日野菜を蒔いた北に植えた。薩摩芋の種芋の南に真黒茄子を植えた。鷹の爪を葱の苗床の南に植えた。ノゲシとキツネアザミと多分サワオグルマのしっかりした茎が支柱代りになればと思って畝の中央だけを草刈りして両端は残した。空豆の莢が大きくなって来た。玉葱も大きいものはちゃんと玉になっている。菜っ葉類の種の一部に奇形が見られた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-04-09</time> -</div> -赤目自然農塾に行った。一日目は便所の補修と猪よけの柵の設置を行った。身体を保護するものが嫌いなので軍手を着用していなかったが案の定トタンの波板で指を切った。他人との共同作業においては少し考えないといけない。二日目は米の種おろしの実習だったが眠くてあまり集中できなかった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2022-04-07</time> -</div> -晴。日射しが強くて暑さがこたえるようになってきた。防止がそろそろ必要である。薩摩芋を植えた。空豆の莢が出てきているのを確認した。米を蒔く場所を軽く草刈りした。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-04-02</time> -</div> -晴。最近寒さが戻ったようで、外に出るのが億劫である。田の畔を補強した。毎日少しの時間でも畑に出ないと体ができてこないように思う。隣の畑の人が夫婦で来ていた。奥さんと顔を合わせるのはおそらく初めてである。家で薩摩芋と里芋が芽をふき始めた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-04-01</time> -</div> -晴。前日は雨。前回より排水はよくなっていた。新3月27日には麦の出穂を確認。さらに大きくなっていた。草の勢いが強い。今日は新しく買った大浦太牛蒡を蒔いた。寄居蕪を前回同様日野菜の後に蒔いた。日野菜もそのふたつ隣りの畝に蒔いた。以前蒔いていた法蓮草、春菊、牛蒡が発芽。じゃが芋の芽も出てきた。体力を付けねば。 -</div> - -<h3>如月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">22日</div> -<time>2022-03-24</time> -</div> -晴。しばらく雨ばかりで畑が水浸しだった。一部に下の田圃への水路を開けて排水を計った。注文していた種がようやく届いたので少し蒔いた。寄居蕪を日野菜が植わっていた場所に少し、牛蒡(これは以前買っていたもの)を少し、それから葱を蒔いた。高菜を収穫した。土筆がたくさんあったので取って来て佃煮にした。上の畑にれんげが咲いているのを見つけた。年末に蒔いた菜っ葉類は花盛りで蜂もたくさん来ている。交配しなければいいがさすがに近すぎるだろう... -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2022-03-15</time> -</div> -晴。日差しが暑い。隣の畑の人が何かを散布していた。除草剤だろうか。真菜が花盛りである。日野菜はほとんど花を刈り取った。大根も咲いていた。壬生菜も咲きそうだったので少し収穫。山東菜も咲きはじめ。台所で芽を出していた大蒜を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-03-13</time> -</div> -晴後曇り。今日から明日にかけて雨が降るというので法蓮草を蒔いた。ばら蒔きして草を刈っただけだがうまく発芽してくれるだろうか。後は牛蒡も蒔いた。天気予報に頼ってしまうのは気分がよくない。体感上朝の晴れていたうちもじめじめしていた気がするし、雨の予感はあったと思うのは後付けだろうか。天気を感覚で分かるようになりたい。菜の花が咲いていた。日野菜と真菜である。白菜の葉も起き上がって、遠目には結球したように見える。麦が一段と大きくなった。やっと背が高くなりはじめた。しかし初めに蒔いた所と後れて蒔いた所の差が大きい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-03-08</time> -</div> -晴ていたように思う。竹を貰いに行ってから体調が落ちた。杉だらけだったので花粉症がひどくて眠れなかった。もう春が来た。大根と高菜を収穫し、小松菜と春菊を蒔いた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-03-06</time> -</div> -晴後曇り。大根と山東菜を少し収穫して地主さんに持って行った。地主さんが持っているという竹薮の場所を教えてもらった。今日は少し寒さが戻った。そろそろまた菜っ葉の種を蒔きたい。じゃが芋を植えるのと、米の苗床の準備もしなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-03-04</time> -</div> -晴後曇り。日野菜と大根を少し収穫。大根の葉を炒めものに、日野菜の根を煮物にした。日野菜の細いものは筋があって硬かった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-03-03</time> -</div> -生協で買ったじゃがいもを芽出ししていたが、出揃ってきたので半分に切った。植付けは四日か五日頃か。 -</div> - -<h3>睦月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2022-03-01</time> -</div> -雨だったと思う。真菜を収穫して胡麻和えにした。真菜にも日野菜にも蕾が出はじめている。雨の作業も寒さがなければ楽しい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">28日</div> -<time>2022-02-18</time> -</div> -晴。突然春らしい日になった。朝はまだ寒かったが、日中はかなり気温が上がった。畑に畝を作る続きを行った。田の麦はまた育ったように見える。まだ高さはないが横に広がり、最後に種蒔きした所も全体的に緑になってきている。畑では空豆の花が咲いていた。やはり風が強いのか、あまり高くはならず横に広がっている。あるいは土が硬くて根が浅いのか。アブラ菜科も春を感じてか、とう立ちの気配がある。白菜と大根はその中心に蕾のようなものが準備されている。花の時期が少しずれてくれればいいのだが。畑に死んだ雀が落ちていた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-02-14</time> -</div> -曇り後晴。午前は先日落札した唐箕を貰いに言った。他にも手箕や籠を貰った。午後はじゃが芋を植えた。昨日購入したアンデスである。芽が出ていないものも数個あったが気にせず植えた。畝が低く感じたので溝を少し掘り下げて中央に盛った。昨日の雨が溜っていたので土が粘土のようになったが大丈夫だろうか。一応高さは確保できたのでいい具合に乾いてくれればいいが。株間30cm、条間40cm程度。畝幅は120cmで二条に植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-02-11</time> -</div> -晴。朝は非常に寒い。田の畔を少し整えた。田圃の端を隣の人が通路として使いたいとのことなので、水を漏らさないようにしないといけない。昨日地主さんに電話したところ、この田の水利費は払ってくれているという。溝掃除は各自やるとのことなので早めにやってしまおう。 -</div> - diff --git a/man/gallery/20231005.html b/man/gallery/20231005.html @@ -1,3 +0,0 @@ -<h1>結束バンド</h1> -<time>2023-10-05</time> -<img src="img/20231005.png"> diff --git a/man/gallery/20231007.html b/man/gallery/20231007.html @@ -1,3 +0,0 @@ -<h1>後藤ひとり</h1> -<time>2023-10-07</time> -<img src="img/20231007.jpg"> diff --git a/man/gallery/20231018.html b/man/gallery/20231018.html @@ -1,3 +0,0 @@ -<h1>チルノ</h1> -<time>2023-10-18</time> -<img src="img/20231018.jpg"> diff --git a/man/gallery/20231202.html b/man/gallery/20231202.html @@ -1,3 +0,0 @@ -<h1></h1> -<time>2023-12-02</time> -<img src="img/20231202.jpg"> diff --git a/man/gallery/20240101.html b/man/gallery/20240101.html @@ -1,3 +0,0 @@ -<h1>謹賀新年</h1> -<time>2024-01-01</time> -<img src="img/20240101.jpg"> diff --git a/man/gallery/20240628.html b/man/gallery/20240628.html @@ -1,3 +0,0 @@ -<h1>さくらクレパス</h1> -<time>2024-06-28</time> -<img src="img/20240628.jpg"> diff --git a/man/gallery/20240629.html b/man/gallery/20240629.html @@ -1,3 +0,0 @@ -<h1>さくらクレパス</h1> -<time>2024-06-29</time> -<img src="img/20240629.jpg"> diff --git a/man/gallery/20240702.html b/man/gallery/20240702.html @@ -1,3 +0,0 @@ -<h1>さくらクレパス</h1> -<time>2024-07-02</time> -<img src="img/20240702.jpg"> diff --git a/man/gallery/20240727.html b/man/gallery/20240727.html @@ -1,3 +0,0 @@ -<h1>さくらクレヨン</h1> -<time>2024-07-27</time> -<img src="img/20240727.jpg"> diff --git a/man/gallery/20250101.html b/man/gallery/20250101.html @@ -1,3 +0,0 @@ -<h1>謹賀新年</h1> -<time>2025-01-01</time> -<img src="img/20250101.jpg"> diff --git a/man/gallery/20250717.html b/man/gallery/20250717.html @@ -1,3 +0,0 @@ -<h1>自画像</h1> -<time>2025-07-17</time> -<img src="img/20250717.jpg"> diff --git a/man/gallery/index.html b/man/gallery/index.html @@ -1,15 +0,0 @@ -<h1>絵</h1> - -<ul class="galind"> -<li><a href="20250717.html"><img src="img/20250717-thumb.jpg"></a></li> -<li><a href="20250101.html"><img src="img/20250101-thumb.jpg"></a></li> -<li><a href="20240727.html"><img src="img/20240727-thumb.jpg"></a></li> -<li><a href="20240702.html"><img src="img/20240702-thumb.jpg"></a></li> -<li><a href="20240629.html"><img src="img/20240629-thumb.jpg"></a></li> -<li><a href="20240628.html"><img src="img/20240628-thumb.jpg"></a></li> -<li><a href="20240101.html"><img src="img/20240101-thumb.jpg"></a></li> -<li><a href="20231202.html"><img src="img/20231202-thumb.jpg"></a></li> -<li><a href="20231018.html"><img src="img/20231018-thumb.jpg"></a></li> -<li><a href="20231007.html"><img src="img/20231007-thumb.jpg"></a></li> -<li><a href="20231005.html"><img src="img/20231005-thumb.png"></a></li> -</ul> diff --git a/man/index.html b/man/index.html @@ -1,40 +0,0 @@ -<h1>松露庵</h1> - -<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> - -<p> -学問を志して挫折し、就職して適応障害になり、社会のしがらみから離れて田舎でのんびり暮らしています。 -</p> - -<h2>更新履歴</h2> -<a href="/rss.xml">RSS</a> -<ul> -<li>2025-12-20 <a href="/computer/x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> -<li>2025-11-22 <a href="/journal/posts/20251122.html">ひさしぶりに合気道した</a></li> -<li>2025-08-27 <a href="/computer/rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> -<li>2025-07-17 <a href="/gallery/20250717.html">自画像</a></li> -<li>2025-05-19 <a href="/journal/posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> -<li>2025-04-28 <a href="/computer/openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> -<li>2025-04-20 <a href="/journal/posts/20250420.html">大阪万博行った</a></li> -<li>2025-03-29 <a href="/plant">タネツケバナ咲いてた</a></li> -<li>2025-02-21 <a href="/journal/posts/20250221.html">着物作った</a></li> -<li>2025-02-16 <a href="/journal/posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> -<li>2025-01-01 <a href="/gallery/20250101.html">年賀状</a></li> -<li>2024-12-19 <a href="/computer/9p.html">9P</a></li> -<li>2024-12-11 <a href="/journal/posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> -<li>2024-12-02 <a href="/journal/posts/20241202.html">椅子作った</a></li> -<li>2024-10-10 <a href="/kitchen/recipe/mapo_tofu.html">麻婆豆腐</a></li> -<li>2024-10-09 <a href="/journal/posts/20241009.html">棚作った</a></li> -<li>2024-07-30 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2024-04-28 <a href="/journal/posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> -<li>2024-02-22 <a href="/computer/rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> -<li>2024-02-15 <a href="/computer/git_server.html">Gitサーバーの設定 on OpenBSD</a></li> -<li>2024-02-09 <a href="/kitchen/recipe/miso.html">味噌</a></li> -<li>2024-01-19 <a href="/computer/mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> -<li>2024-01-11 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li> -<li>2024-01-01 <a href="/gallery/20240101.html">年賀状</a></li> -<li>2023-12-02 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2023-10-24 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2023-10-07 <a href="/gallery/20231007.html">絵を描いた</a></li> -<li>2023-08-10 <a href="/journal/posts/20230810.html">イソヒヨ</a></li> -</ul> diff --git a/man/journal/index.html b/man/journal/index.html @@ -1,49 +0,0 @@ -<h1>日記</h1> -<ul> -<li>2025-11-22 <a href="posts/20251122.html">ひさしぶりに合気道した</a></li> -<li>2025-05-19 <a href="posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> -<li>2025-04-20 <a href="posts/20250420.html">大阪万博行った</a></li> -<li>2025-02-21 <a href="posts/20250221.html">着物作った</a></li> -<li>2025-02-16 <a href="posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> -<li>2024-12-11 <a href="posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> -<li>2024-12-02 <a href="posts/20241202.html">椅子作った</a></li> -<li>2024-10-09 <a href="posts/20241009.html">棚作った</a></li> -<li>2024-04-28 <a href="posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> -<li>2023-08-10 <a href="posts/20230810.html">イソヒヨ</a></li> -<li>2023-08-03 <a href="posts/20230803.html">サマータイムレンダ読んだ</a></li> -<li>2023-08-02 <a href="posts/20230802.html">着物できた</a></li> -<li>2023-07-29 <a href="posts/20230729.html">無題</a></li> -<li>2023-07-26 <a href="posts/20230726.html">GOPL読んだ</a></li> -<li>2023-07-25 <a href="posts/20230725.html">水道と空調</a></li> -<li>2023-01-19 <a href="posts/20230119.html">寺を辞めた</a></li> -<li>2022-12-28 <a href="posts/20221228.html">Holy Shit!</a></li> -<li>2022-10-31 <a href="posts/20221031.html">大阪駅にて</a></li> -<li>2022-10-23 <a href="posts/20221023.html">寺に適応できない</a></li> -<li>2022-08-14 <a href="posts/20220814.html">田舎の夏休み</a></li> -<li>2022-08-13 <a href="posts/20220813.html">正座ができていた頃に戻るには</a></li> -<li>2022-07-30 <a href="posts/20220730.html">新型コロナウイルスとその対策に関する個人的見解</a></li> -<li>2022-07-29 <a href="posts/20220729.html">RSS作った</a></li> -<li>2022-05-13 <a href="posts/20220513.html">坊主になるために薬の服用を強要されそうになってる。</a></li> -<li>2021-12-14 <a href="posts/20211214.html">無題</a></li> -<li>2021-11-29 <a href="posts/20211129.html">赤目自然農塾</a></li> -<li>2021-08-06 <a href="posts/20210806.html">畑を返すことになった。</a></li> -<li>2021-01-06 <a href="posts/20210106.html">x220から投稿テスト</a></li> -<li>2020-12-10 <a href="posts/20201210.html">小松菜の種を蒔いた。</a></li> -<li>2020-12-09 <a href="posts/20201209.html">畝を繋げた</a></li> -<li>2020-12-02 <a href="posts/20201202.html">たまねぎを植えた。</a></li> -<li>2020-12-01 <a href="posts/20201201.html">畑をさせてもらえることになった。</a></li> -<li>2020-10-03 <a href="posts/20201003.html">何をして生きようか</a></li> -<li>2020-09-26 <a href="posts/20200926.html">SSLに対応しました。</a></li> -<li>2020-09-25 <a href="posts/20200925.html">rsyncによる投稿テスト</a></li> -<li>2020-09-19 <a href="posts/20200919.html">工場見学</a></li> -<li>2020-09-18 <a href="posts/20200918.html">仕事</a></li> -<li>2020-09-17 <a href="posts/20200917.html">pythonやめました</a></li> -<li>2020-08-08 <a href="posts/20200808.html">冷蔵庫と豊かな生活</a></li> -<li>2020-08-04 <a href="posts/20200804.html">localからの投稿テスト</a></li> -<li>2020-08-02 <a href="posts/20200802.html">今日の一汁一菜</a></li> -<li>2020-08-01 <a href="posts/20200801.html">Djangoやめました</a></li> -<li>2020-07-27 <a href="posts/20200727.html">けの日</a></li> -<li>2020-07-25 <a href="posts/20200725.html">Django使うのやめようかな</a></li> -<li>2020-07-23 <a href="posts/20200723.html">多少体裁を整えました</a></li> -<li>2020-07-19 <a href="posts/20200719.html">最初の投稿</a></li> -</ul> diff --git a/man/journal/posts/20200719.html b/man/journal/posts/20200719.html @@ -1,8 +0,0 @@ -<h1>最初の投稿</h1> -<time>2020-07-19</time> -とりあえずサイトの立ち上げが完了しました。最初の投稿です。 -まだhtmlは適当でcssは全く無いので味気ないサイトですがこれからいろいろといじっていければと思います。 - -この投稿も多分改行が反映されずに読みにくいものになるかと思いますが、記録として残しておきたいので書いておきます。 - -ただしdockerとpostgresqlのことがいまいちよくわかっていないので、間違ってデータベースごとけしてしまうかもしれません。まあそれはご愛嬌。 diff --git a/man/journal/posts/20200723.html b/man/journal/posts/20200723.html @@ -1,26 +0,0 @@ -<h1>多少体裁を整えました</h1> -<time>2020-07-23</time> -<section> -<h5>変更点</h5> -<p>とりあえず改行できなかったり装飾できなかったり不便なので、 -htmlで投稿できるように変更しました。</p> -<p>それからcssを作って多少見れるようにしました。</p> -</section> - -<section> -<h5>これから</h5> -<p>サイトのデザインですが、できるだけシンプルにしたいと考えています。 -モダンな感じのページは多いですが、視覚効果が多すぎるように感じます。 -本当に必要があってつけているのか、”いい感じ”だからつけているだけなのか… -</p> -<p> -必要なのは投稿の中身と、それから横には目次があると読みやすくなると思っています。 -サイドバーはそのために作っています。 -</p> -<p>あとは投稿の中に画像を埋め込みたいです。</p> -</section> - -<section> -<p>そういえばドメインを契約してDNSにIPアドレスを登録したのですが、丸3日たっても名前解決できません。 -いつになったらつながるのかな。</p> -</section> diff --git a/man/journal/posts/20200725.html b/man/journal/posts/20200725.html @@ -1,58 +0,0 @@ -<h1>Django使うのやめようかな</h1> -<time>2020-07-25</time> -<p> -ホームページにも書いてあるとおり、このサイトはDjangoを使っている。 -しかしほとんど基本的な機能しか使わないのでここまで複雑で大きい -フレームワークを使う必要性は皆無である。 -全く使わない機能は結局習得することもないので、邪魔なだけだ。 -この程度のサイトであればもっとシンプルなもので作れそうだ。 -</p> - -<p> -半年ほど前にMacBookからOSXを消してLinux Mintに移行した。 -インターネットの回線に高額な料金を払うのが嫌で、一度すべて解約したのだが、 -OSXだとユーザーが何もしていなくてもバックグラウンドで大量の通信が -行われており、128kbpsでは何もできなくなったため、勝手に通信しない -Linuxに変えたのである。 -</p> - -<p> -ところがこのLinux Mint、というかデスクトップ環境のxfceには自分には全く必要の -ないアプリケーションが大量に入っているのである。もちろんOSXなんかより -圧倒的にましではあるが… -だんだん嫌になって、あまり考えずに片っ端から消していったら、 -なぜかはよくわからないが起動しなくなってしまった。 -これが確か今年の5月ごろだっただろうか。 -</p> - -<p> -丁度いい機会なのでLinuxの中でも何もない方であるArchのインストールを -試みることにした。 -過去にも何度か挑戦して、そのたびによくわからずに諦めていたが、 -今はパソコンを仕事などでも使っていないということもあり、落ち着いて -ドキュメントを読みながら進めると案外あっさりインストールできてしまった。 -</p> - -<p> -非常に快適である。 -</p> - -<p> -最近携帯を買い替え、人生で初めてAndroidというものを触ったが、 -これもかなり不要なものが入っていて不愉快だ。 -シャープお手製のよくわからないものは案外控えめだったが、 -キャリアである楽天関係のアプリに加え、Googleのアプリケーションが -大量にインストールされている上、それらはさも当たり前のように僕の -個人情報を要求するのである。 -</p> - -<p> -不必要な"便利さ"のためにただで情報を収集する。 -"最大限の便利さ"を提供することが正義で、そのためにはプライバシーを -犠牲にしてもいいと思っている。 -余計なお世話だ。 -</p> - -<p> -このページももっと軽い感じにしたいな。 -</p> diff --git a/man/journal/posts/20200727.html b/man/journal/posts/20200727.html @@ -1,46 +0,0 @@ -<h1>けの日</h1> -<time>2020-07-27</time> -<section class="introduction"> -<p>普段の生活を少しばかり記録しておこうと思う。</p> -<p>社会人一年目の7月の終わり頃の生活である。</p> -</section> - -<section class="morning"> -<p> -朝はだいたい四時から四時半には目が覚める。 -ちょうど日の出と同じ頃である。 -前日はだいたい九時半頃布団に潜るので睡眠時間は七時間といったところである。 -本当は八時間寝たほうがいいと思っていたが、七時間で自然と目が覚めるので自分には -このくらいがあっているようだ。 -</p> -<p> -朝日を眺めながら米を火にかけ、余っている野菜で煮物を二品ほど作る。 -糠床から香の物を拝借してくれば弁当の完成である。 -朝食は食べない。 -</p> -<p> -布団を畳んで箒をかけ、フローリングは雑巾で軽く拭く。 -今の借家に越してきてから雑巾がけを始めたが、思えば小学校以来かもしれない。 -</p> -<p> -煮物に使った鍋をゆすぎお湯を沸かす。 -バットやボウルを片付けてきれいになったキッチンにコーヒーカップとビーカーを並べる。挽きたての豆で淹れたコーヒーを飲みながらこのブログのソースコードをいじるなどして七時をまつ。 -</p> -<p> -時間になれば着替えて出社。 -</p> -</section> - -<section class=evening> -<p> -五時に退社し帰宅。 -集に二回ほどは途中で豆腐を仕入れに高橋豆腐店に、魚を仕入れに小平鮮魚店に立ち寄る。 -家に着いたら米を火にかけその隣で出しをとる。 -余った野菜で味噌汁ともう一品作り、糠床から香物を拝借すれば夕飯の一汁一菜。 -</p> -<p> -その後はネットをちょつと見るくらいで、 -すぐに風呂にはいって寝てしまう。 -部屋の電気は常夜灯のみなので日が沈むと眠いのだ。 -</p> -</section> diff --git a/man/journal/posts/20200801.html b/man/journal/posts/20200801.html @@ -1,27 +0,0 @@ -<h1>Djangoやめました</h1> -<time>2020-08-01</time> -<section> - <h3>Djangoやめました。</h3> - <p> - タイトル通り、Djangoを使うのをやめました。 - 代わりにwsgirefを使ってます。Djangoでも間接的に使っていた - のかもしれないけれど。<br /> - 参考: <a href="https://c-bata.link/webframework-in-python/index.html"> - Webアプリケーションフレームワークの作り方 in Python - </a> - </p> - <p> - ただでさえガバガバだったセキュリティが更にザルになっていると思いますが、 - 特に大事なものは置いていないし、Docker使ってるし、大丈夫だと - 思っておいていいかな。攻撃しないでください。 - </p> -</section> -<section> - <h3>サイトのデザイン</h3> - <p> - それから、サイトのデザインも変更してます。 - 一応明確なテーマを以て作っているのですが、なかなか思うような感じに - ならないです。<br /> - 少しずつ調整していくつもりです。 - </p> -</section> diff --git a/man/journal/posts/20200802.html b/man/journal/posts/20200802.html @@ -1,62 +0,0 @@ -<h1>今日の一汁一菜</h1> -<time>2020-08-02</time> -<section> - <h3>今日の一汁一菜</h3> - <p> - 今日の夕飯は切り干し大根とザワークラウトの味噌汁に - すりごまをまぶしたもの、 - かぼちゃを蒸して豆腐のそぼろをちらしたもの、 - そしてきゅうりと茄子の浅漬。 - </p> - <p> - 切り干し大根というものを初めて食べたがこれがなかなか美味しかった。 - 細切りにしてザルに広げ一日外に置いておいただけであるが、旨味が - 凝縮される上に食感もコリコリと面白くなる。 - </p> - <p> - 大根の相手は6月の中頃に漬け込んだザワークラウトである。 - 乳酸の酸味が熱い体に染み渡る。 - </p> - <p> - 味噌を溶いて椀に注いだら、最後に煎りごまをすって入れる。 - 酸味とごまは相性が抜群である。 - </p> -</section> -<section> - <h3>野菜を干す</h3> - <p> - しばらく前に冷蔵庫の電源を落とした。 - 発酵食品ばかり仕込んでいたので冷蔵庫の中がスカスカになり、 - 冷蔵庫は不要なのではないかと考えていた。 - そんなある時とうとう空っぽになったので、これを期に - 冷蔵庫なしの生活を試してみようと考えたのだ。 - </p> - <p> - しかし一人暮らしなので、一食で野菜をまるまる使い切ることはあまりいない。 - 使いかけの野菜はどうしても出る。 - ぬか床に忍ばせたり塩漬けにしたりいろいろ工夫した。 - そのうちの一つが干すということである。 - 梅干しを作るために買ってきた竹のザルが二枚あったので、 - 余った野菜を適当に切って並べ、梅雨明けの晴天に - 晒してみた。 - </p> - <p> - この干し野菜がどれもこれも美味しいのには感動した。 - 冷蔵庫のはしっこでしんなりした野菜とは大違いである。 - </p> -</section> -<section> - <h3>当たり前?</h3> - <p> - 昔の人たちは当たり前のように行っていた干すという保存法。 - それをすっかり忘れ、冷蔵庫を家に置くことが常識と化している。 - 大学に進学して一人暮らしを始めるにあたり、なんの疑問も持たず - 冷蔵庫を購入したのが懐かしい。 - 冷蔵庫だけではなく、洗濯機や電子レンジも同じである。 - そういえばテレビは買わなかったが… - </P> - <p> - 当たり前という感覚を捨て、本当の豊かさを考えたい今日この頃。 - 冷蔵庫を捨てる日は近いか。 - </p> -</section> diff --git a/man/journal/posts/20200804.html b/man/journal/posts/20200804.html @@ -1,11 +0,0 @@ -<h1>localからの投稿テスト</h1> -<time>2020-08-04</time> -<p> - 今までhtmlファイルをクラウドにscpで持って行ってsqlを実行することで - ブログ記事を投稿していましたが、ローカルから直接投稿するスクリプトを - 書いてみました。 -</p> -<p> - 今の所単にsqlを遠隔で行っているだけですが、今後投稿済みの記事を編集 - したりできるように改良したいです。 -</p> diff --git a/man/journal/posts/20200808.html b/man/journal/posts/20200808.html @@ -1,244 +0,0 @@ -<h1>冷蔵庫と豊かな生活</h1> -<time>2020-08-04</time>作成<br> -<time>2022-07-20</time>更新 -(誤植を修正したが、HTMLのソースの改行に伴う半角スペースはそのままにしておいた。) - -<section> - <h3>はじめに</h3> - <p> - 冷蔵庫の必要性に疑問を感じ始めた。 - 去年の暮れあたりから発酵食品に凝り始め、 - 冷蔵庫の中が少しずつ空いてきた。 - また、同じく去年の暮れ頃、体の冷えがあまりにひどくて - 卒業研究に集中できない状態だった。今年に入り春から夏にかけて - 気温が上がっていく中でも、体が冷えていることに - 変わりはなかった。 - </p> - <p> - 冷蔵庫の必要性を感じなくなり、冷蔵庫で冷やされたものが - 体に良くないのではないかと考えるにいたり、 - とうとう冷蔵庫の電源を落とした。 - 以降何不自由なく暮らせている。 - </p> - <p> - 一度使わなくなると、そもそもなぜこのようなものが当たり前のように - 普及しているのか疑問に思ったのでいろいろ考えてみた。 - </p> -</section> -<section> - <h3>発酵食品へ</h3> - <p> - 去年の秋、引越しに伴い生活費がカツカツになり、それまで特に - 考えずにいた家計について少しばかり見直そうと思い立った。 - そして節約の一環として外食を一切やめ、全ての食事を - 自炊に頼るようにした。 - 先に書いたようにまずはお金がなかったので、近くの青果市場で - 見切り品として売られていた30円の野菜ばかり買っていたが、 - 一月ほど節約すれば余裕が出てきてすこし贅沢をするようになった。 - と言っても外食ではなくあくまで自炊である。 - 出町柳の乾物屋に行って鰹節を求め昆布を買い、味噌汁用の出汁 - をきちんと取るようになった。 - どうでもいいが味噌汁用に鰹節を買いに行くと決まって鯖節を - 勧められるので、求めたのは鰹だが実際に使っていたのは - ほぼ鯖であった。また、いつも話し方に癖のある主人が - 対応してくれるが、ある時おばあさんが店に出ていた。 - 独特の話し方が主人と全く同じだったのには驚いた。 - 味噌汁に入れる豆腐を豆腐屋で仕入れるようになったのもこの頃である。 - 豆腐屋の人はなぜか皆遠藤征四郎師範のような腕をしている。 - </p> - <p> - 自分で出汁を引いて作った味噌汁はうまい。そこに浮かんでいるのが - 豆腐屋の豆腐なのでなおさらである。 - 自分の舌が肥えていくのがわかった。 - </p> - <p> - そんなある日、スーパーで見かけた浅漬を買って食べた。 - 漬物は昔から好物だったが、金がないのもあり見ないふりをしていたが、 - なんの気なしに手にとって買い物かごに放り込んでみたのである。 - ところがこれがいまいちだった。一口含んだときはまあそれなりに - 美味しい気はするが、しかしなんというか、奥行きがないという感じ - なのだ。それ以来スーパーの漬物は買わなくなってしまった。 - </p> - <p> - しかし漬物は食べたい。 - 結局その頃通っていた近くの米屋で糠をもらってきて - 自分で漬けることにした。 - その際にいろいろ調べたが、どうやらスーパーで売っている漬物 - はどれも発酵していないようなのだ。 - 人工的にうま味を添加した液体に野菜を浸しただけのものらしい。 - 奥行きがないわけである。 - <p> - 糠漬けに始まり、烏賊の塩辛、キムチ、バター、パンの酵母、 - 梅干し、熟れ鮓等発酵食品はいろいろ作った。厳密には塩辛と梅干しは - 発酵していないのだが。 - </p> - <p> - そんなある時ザワークラウトを漬けた。 - このときは漬物が食べたいからというより、単にキャベツを保存する - ためである。 - 一人暮らしだと、冷蔵庫があってもキャベツひと玉は傷んでしまうのだ。 - </p> - <p> - 冷蔵庫でも痛むので塩漬けにする。 - </p> - <p> - だったら冷蔵庫要らんのでは? - </p> - <p> - 冷蔵庫を手放そうと思い始めたきっかけである。 - </p> -</section> -<section> - <h3>身体の冷え</h3> - <p> - 去年の冬、身体があまりにもだるかった。 - 何もできない。お腹も痛い。 - 地元の漢方薬局を樹脂下が、渡されたのは冷えに効く - 薬ばかりだった。 - 中には重度の冷え性の女性が生理中に身体を温めるための - ものも入っていたw。 - この頃はとにかく身体がだるいだけで、 - 自分では冷えているのかどうかよくわかっていなかった。 - ところが漢方薬局の先生に不調を訴えると、 - ことごとく冷えが原因だと言われた。 - 頭痛も腹痛も倦怠感も、全て冷えだと。 - そんな状態で真冬を迎えた。確かに寒い。身体がキンキンに - 冷えているのがわかるようになった。 - ふくらはぎはずっとむくんでいるし、 - 末端は冷たいし、周りが普通にしている部屋で一人だけ - 凍えていた。 - この頃から身体の言うことをもっと聞いてあげないと - 何もできないことがわかった。 - </p> - <p> - 以来身体の状態はできるだけ観察するようにしている。 - そして気づいたのだが、自分の身体がずっと冷やされているのだ。 - 春が過ぎ暖かくなっても、至るところで冷房画家明かり - 冷たい飲み物を出される。 - まるで汗をかくことが悪であるかのような世界である。 - </p> - <p> - この気付きにより、今年の夏は冷たいものは摂取しないようにしている。 - というよりあまり欲しいとも思わないのだ。 - 喉が乾いても常温のもので満足なのだ - (と言っているそばから実家の冷蔵庫にあったハーゲンダッツを - 食べてしまった)。 - </p> -</section> -<section> - <h3>冷蔵庫の電源を落とす</h3> - <p> - 身体の冷えに気づき、発酵食品にのめり込み、 - 冷蔵庫の必要性に疑問を持ち始めたある時、 - とうとう冷蔵庫の中が空っぽになってしまった。 - ものは試しと早速電源を落としてみた。 - 余った食材はぬか床に入れるか、あるいは - 塩漬けにしておけば腐る心配はない。 - </p> - <p> - 横浜に越してきてからは週末に一週間分の野菜を - 鎌倉の即売所で仕入れ、冷蔵庫に入れていた。 - 冷蔵庫の電源を落としてからは余った野菜は - すべて乳酸菌の力で酸っぱくして保存していた。 - 流石に酸味に飽きてきた頃、梅干し用に買ってきたザルが - 梅を干し終えて暇そうにしているのを見つけた。 - 干し野菜はうま味が凝縮されて美味しいというので - 試しに余ったものを干してみた。 - きゅうり、大根等水分が多いものは薄く切ってそのまま並べる。 - かぼちゃやじゃがいも等は一度蒸してから干す。 - 生のまま干したものは味が濃くなり食感もコリコリと面白くなる。 - 一方蒸したものは甘みが強くなり、ねっとりとしてこれもまたうまい。 - 一度この味を知ると、どうして今まで冷蔵庫に入れて味が劣化するのを - 気にも止めなかったのかと悔やまれる。 - </p> - <p> - 魚はその日のうちに使う分以外は塩水につけて干しておくか、 - 米と合わせてあせの葉や柿の葉で包んでおけば熟れ鮓になる。 - まだ作ったことはないが、みりん干しなんかもやってみたいものだ。 - </p> - <p> - 豆腐は水切りをして何かしら塩分の濃いもので包んでおけば - 大丈夫そうだ。 - 味噌、糠、塩。どれにつけても美味しい。塩漬けはチーズのような - 芳醇な感じになることを期待していたがそれもない。 - 水道水をそのまま使ったのがまずかったか。 - まあ保存はできているのでいいのだけれど。 - </p> - <p> - 肉は最近食べていないのでわからないが、魚と同じだろう。 - 中国には確か肉の熟れ鮓もあったような。 - 燻製なんかも興味がある。 - </p> - <p> - 冷蔵庫を使わなくなり一週間経つが、何一つ不便なことはない。 - 冷蔵庫の下が掃除できないので早くいなくなってほしいくらいだ。 - </p> -</section> -<section> - <h3>なぜ冷蔵庫がうちにあるのか。</h3> - <p> - 改めて冷蔵庫というものを見直してみると、どうしてこんなものが - 台所の一角に鎮座しているのかわからなくなってきた。 - 大学に進学し一人暮らしを始めるに当たり、 - なんの疑問もなく買ったのだ。 - 電子レンジや洗濯機も同じである。 - テレビはNHKが鬱陶しいので買わなかったが。 - 冷蔵庫は家に必要なものであるという常識のもとに生まれ、 - 冷蔵庫を当たり前のように使いながら育った。 - 一人暮らしをするというと、どこに行っても冷蔵庫を買うのが - 当たり前かのように話が進み、とうとう自分でも買うに至ったと - 言うわけである。まあ冷蔵庫を買うのは当たり前なのだろうが。 - </p> - <p> - つまり冷蔵庫がうちにあるのは世の中の常識を - そのまま自分の家に取り込んだ結果なのだ。 - </p> -</section> -<section> - <h3>冷蔵庫という常識</h3> - <p> - ではなぜ冷蔵庫を持つのが常識なのか。 - 簡単である。 - マーケティングの結果だろう。 - </p> - <p> - 今までの生活が不便だという認識を植え付け、 - その不便を解消するという謳い文句で新しい常識を売る。 - 世の中に出回っている便利な道具は大方同じであろう。 - </p> -</section> -<section> - <h3>豊かさとは</h3> - <p> - 豊かな食生活のためといって舶来の料理をはやらせ - 食物油を売り、頑固な油汚れが落ちるからと言って - 強力な洗剤を売り、荒れた手が潤うからと言って - ハンドクリームを売る。 - </p> - <p> - 忙しいからと便利な家電を売り、 - その一方で暇を潰すためのエンターテインメントに - 金を払わせる。 - </p> - <p> - 暑いからといいエアコンを売って快適な環境を整え、 - 汗をかくためにサウナに金を使わせる。 - </p> - <p> - きついからと言い肉体労働を敬遠し、 - 楽をするために自動車を買い、 - その一方で運動不足になりジムに通う。 - </p> - <p> - どれもこれもテレビや新聞等のメディアに作られた豊かさ - ではないだろうか。 - </p> - <p> - 常識や流行にとらわれず、豊かな生き方とはなんなのか、 - 本当に必要なものはなにか、自分自身に問いただす。 - 一度すべての常識を捨て、自分にとって本質的なものを - ゼロから構築する。 - 人生を本当の意味で豊かにしてくれる物だけがすべて揃った - そんな家に僕は住みたい。 - </p> -</section> diff --git a/man/journal/posts/20200917.html b/man/journal/posts/20200917.html @@ -1,9 +0,0 @@ -<h1>pythonやめました</h1> -<time>2020-09-17</time> -<p>pythonをやめてbashスクリプトで作ったcgiに置き換えました。</p> -<p>管理がだいぶ楽になった気がします。</p> -<p>アプリの中身ばかりいじってブログの記事が全然増やせていませんが -ぼちぼち書いていきたいと思います。</p> - -<p>サーバーからbashのcgiを動かすにあたって、nginxがややこしかったので -apacheに変えたのですが、設定が適当なのでセキュリティが心配です。</p> diff --git a/man/journal/posts/20200918.html b/man/journal/posts/20200918.html @@ -1,34 +0,0 @@ -<h1>仕事</h1> -<time>2020-09-18</time> -<p> -今の仕事がつらい。 -やっているのは得意先から届く注文書のファックスを自社のデータベースに入力するだけの仕事だ。 -誰でもできる仕事であり、近い将来自動化されるだろう。その一方でファックスの様式が得意先毎に異なり、入力時にはその注文書に明記されていないことも考慮しなければいけない。 -日本企業の生産性が低い原因をまじまじと見せられている。 -このような業務なので、入力作業自体は1日もかからずに覚えられる一方、得意先毎の細かい違いを覚えるのに何年もかかるだろう。 -日に日にこの業務に慣れ、入力は速くなっているが、自分が成長しているようには感じない。この会社のこの業務という非常に限定的な分野でしか使えない技術だけがついていくからである。こんなことでは転職しようにもよその会社で使える技術が何もないので、新卒と同じ土俵にたたなければいけなくなる。採用する側もそんな人材に興味はないだろう。 -</p> -<p> -成長したい。 -成長とはなんだろう。 -多分生きていく上で使える技術を身に付けることである。 -生きていく上で使える技術とはなんだろう。究極的には畑で作物を育てる技術だと思うが、そんな世紀末のことはまだ考えなくてもいいかもしれない。 -汎用性のある人間になればいいのだろうか。 -そうすれば何でもできて食いっぱぐれない。 -しかしその「何でも」の中に今の仕事は含まれていない。 -成長が感じられない単純な作業はストレスで死んでしまう。 -つまりなんでもできるの中には成長しない仕事は含まれない。 -</p> -<p> -なぜ今の会社にいるのか。 -それは実家に帰るためである。 -実家で工場を経営しているのでそこを嗣ごうと考えた。 -そのために同業大手に就職し技術を持ってかえるように父に言われた。 -ところがいざ就職してみると、僕が考えていた技術が一向に学べていない。 -その一方で今学んでいることは父が持って帰ってほしい技術であるようだ。父は工場で必要な細かい技術や知識を持って帰ってほしいらしい。 -僕はそんなものはほしいとは思わない。この業界に特化しても生き残れないと考えるからだ。もちろん業界に特化した人材も必要なのかもしれないが、それはあなたの長男ではないのではないだろうか。長女でも次男でもなさそうだし。 -</p> -<p> -今のところだからどうしたいと言うまとまった考えがあるわけではないが、少なくとも自分の学ぶべき場所はここではないと感じている。心身に無理が生じているのを感じるからだ。 -業界の知識を短期間で軽くさらって、そのあとは別の世界を見てみたい。どこかに成長を実感できる世界がないものか。 -</p> diff --git a/man/journal/posts/20200919.html b/man/journal/posts/20200919.html @@ -1,58 +0,0 @@ -<h1>工場見学</h1> -<time>2020-09-19</time> -<p> - 実家で営んでいる工場を嗣ぐために同業大手に働きに出ているが、 - そこで何を学べばいいのかわからないので、一度実家の工場を見学 - することにして、今日行ってきた。 -</p> -<p> - 見学して思ったのは、今いる大手の工場よりうちの工場のほうが - いい工場であるということだ。 - 工場内は比較的整然としているし、データベース等のシステムも - 今自分がいる会社よりは圧倒的に進んでいた。 -</p> -<p> - いよいよ自分が今の会社で働いている意味がわからなくなってきた。 - どうやら父は今僕のいる会社には人材を育成するための教育制度 - が整備されていて、その制度によって僕という人材が育成されることを - 期待していたようだ。 - 残念ながらそんな制度はなかったようだが。 -</p> -<p> - つまり僕が今の会社に居続ける義理もそんなにないようである。 - もちろん業界の知識は少なからず必要であり、今の会社でも - 働き続ければ多少は勉強できるだろうが、そのために投資する時間 - に対して割に合わないだろう。 -</p> -<p> - ではどうするか。今の会社をやめるのであれば転職である。 - そしてその転職先は実家かそれ以外かである。 - 今実家に就職するのはいい選択なのだろうか。 - 僕は業界に関する知識もないし、ビジネスの世界も全く知らない。 - こんな状態で就職しても、おそらく他の人と同じようなことしか - できないだろう。工場に新鮮な空気を取り込めないのだ。 - だから今は一旦業界を離れ、全く別の世界を覗きに行くのがいいのではないか。 -</p> -<p> - 個人的に興味があるのはIT系である。 - 工場のDXという言葉がよく新聞に並んでいるが、その流れを - 実家に持ち帰れるかもしれない。 - もう一つ興味があるのは農業である。 - 僕がかってに妄想しているだけだが、近いうちに大量消費社会が - 終焉を迎え、自分たちにとって本当の豊かさとは何か、今一度 - 考え直す秋が来ると思う。そうなれば必然的に見直されるのが - 農業である。社会から何を削っても絶対に外せないのが食だからだ。 - そこに豊かさや幸福を求めるのは自然なことだろう。 - そんな農業とのつながりを何らかの形で事業に持ち込めれば - いいかもしれない。 -</p> -<p> - いずれにせよ今のままダラダラと働くのはごめんだ。 - 無駄なことに時間と精神を費やすのはアホである。 - 我慢して頑張っても、それで身体を壊した上に何も学べない。 - そんなのは投資とは言えない。 - 頑張るのではなく、精神の求める方に流れていくほうが自然な生き方だろう。 - とにかく現状を変化させて前に向かって進みたいのだ。 - 自ら動かなければ何もおきない。 - 連休中にエントリーシート書こうかな。 -</p> diff --git a/man/journal/posts/20200925.html b/man/journal/posts/20200925.html @@ -1,3 +0,0 @@ -<h1>rsyncによる投稿テスト</h1> -<time>2020-09-25</time> -<p>自宅のパソコンから直接rsyncで投稿てすと。</p> diff --git a/man/journal/posts/20200926.html b/man/journal/posts/20200926.html @@ -1,7 +0,0 @@ -<h1>SSLに対応しました。</h1> -<time>2020-09-26</time> -<p>Certbotを使ってSSLに対応しました。</p> -<p> -と言っても特に暗号化する必要のある情報は -取り扱っていないので完全に自己満足ではありますが。 -</p> diff --git a/man/journal/posts/20201003.html b/man/journal/posts/20201003.html @@ -1,117 +0,0 @@ -<h1>何をして生きようか</h1> -<time>2020-10-03</time> -<h3>仕事</h3> -<p> -研究者を目指して大学に入り挫折した。 -</p> -<p> -就職先を考えたが、やりたい仕事などそれまで考えたこともなかった。 -そのためやりたいことを基準に仕事を選ぶことができなかった。 -そこで考えたのが、なんのために働くかということである。 -地元には親戚がたくさんいて正月や盆には大勢集まる。 -サマーウォーズみたいな感じ。 -残念ながら古民家に集まるわけではないが。 -僕は家というものが好きだった。 -大学を出てからの人生はその家を更に大きくすることにしよう。 -そう考えた。 -そしてそのための方法として選んだのが、実家が営んでいる -ダンボール工場を嗣ぐことであった。 -そのために卒業後はまず同業大手で勉強させてもらい、 -数年後実家に帰ることにした。 -</p> -<p> -ところがいざ働き始めたらどうだろう。 -何もやりがいがなかった。 -回りにいるひととは全く反りが合わなかった。 -労働環境は最悪だった。 -生活環境も受け入れられなかった。 -気づけばストレスで心身がボロボロになり、盆休み開けにとうとう寝込んだ。 -</p> -<p> -仕事が嫌になった。 -その原因について、はじめは成長が感じられないからとか、 -無駄なことを無駄だとわかっているのに無理やりしているからとか、 -いろいろ理由を分析してみたものっだったが、今思えばどれも違う。 -単純に世間一般に広く普及している仕事というものに適正がないのだろう。 -心療内科の医者によれば、僕の症状は適応障害だそうだ。 -こんな世界に適応などしてたまるものか。 -</p> -<h3>社会は嫌いだ</h3> -<p> -この社会に適応できないのは今に始まったことではないと思う。 -</p> -<p> -京都から和歌山に帰省するたびに、大阪の町並みが汚いのが気になりだした。 -駅の周りには鉄筋コンクリートの四角い箱が乱雑に並んでいるのである。 -どれも建てられた当時は先進的なデザインでおしゃれだったのだろう。 -そして駅から少し離れた場所にも同じくコンクリートの箱が並んでいる。 -こちらは最近建てられたらしく、デザインも今風である。 -30年建てば時代遅れの残念な物件になるのだろう。 -こんな家を建てる人たちは一体何を考えているのやら。 -人生で一番大きな買い物と言いつつ、ろくに調べもしないでハウスメーカーの -口車に乗せられ、モダンでおしゃれな家を建てる。 -自分の建てた家に子々孫々住んでほしいとは思わないのだろうか。 -</p> -<p> -ある時からスーパーに行くのがしんどくなった。 -出町柳にある枡形商店街の近くに住んでいたことがある。 -その間食事の買い物はほとんどそこに通っていた。 -豆腐屋、肉屋、乾物屋等、専門店が一通り揃っていた。 -扱っているものは当然そのへんのスーパーよりも美味しかった。 -ある時伏見の方に引っ越して、久々にスーパーに通い始めたのだが、 -これが非常にしんどかった。 -音楽がうるさくて買い物に集中できないのだ。 -なんだかよくわからない音楽がやたら大きな音で流れている。 -夕飯を考えながら、美味しいものを選別しようとしている脳みそに、 -その思考を遮るように流れてくるのだ。 -だんだん頭がぼーっとしてきて、結局適当に選んでしまう。 -スーパーでは音楽だけでなく、視覚的な表示も鬱陶しい。 -商品のパッケージは周りよりも少しでも目立とうとするばかりで、 -欲しい情報が一切目に入らない。 -適当に選んで家に持って帰るが、結局対して美味しいものではない。 -スーパーに並んでいるものは、本質的な価値ではなくマーケティングを始めとする -販促にかかるコストの割合が多いのだろう。 -「美味しいワイン」。「リコピンが多いトマト」。「DHAが含まれているソーセージ」。 -だまっとれや。 -ただ、そういうものが多く売られているというのは、それはつまり -消費者がそういうものを購入すると言うことである。 -同じものであってもパッケージに美味しいと書いていた方を買うのだろう。 -スーパーでものを買って行く人々が、心理学に踊らされているだけのモルモットに -見えてきた。 -こんな人たちの中に居たくない。そんなこと書いたら叩かれるかな。 -</p> -<p> -スーパーがだめになれば他の店もかなり辛くなった。 -結局ものを売るというのは同じことなのである。 -自分でも驚いたが、スーパーにいけなくなってから、無印良品にも行けない。 -よくわからん音楽が流れる中で、独自のおしゃれ感を作り出しそれを売っている。 -物自体もそんなに質の高いものではないし。 -そこに集う人たちも、雑誌でよく見るテンプレ通りの最近の若者である。 -雑誌はあまり見ないので知らんけど。 -</p> -<p> -この人たちは自分の内側から湧いてくる価値観というものを自覚したことが -あるのだろうか。 -人工的に生み出された流行に踊らされているだけなのではないだろうか。 -</p> -<p> -スーパーに行かなくなり、巷で流行っているものを消費しなくなり、 -いよいよ自分がなぜ働いているのかわからなくなった。 -</p> -<h3>やっぱ農家かな</h3> -<p> -世の中にはびこっている様々なものに価値を見いだせなくなったわけだが、 -それでも買わないと生きて行けないのが食べ物である。 -就職してからの半年間は食べ物には結構こだわっていた。 -スーパーに行けないこともあり、学生時代に商店街に通っていたこともあり、 -住処の周りにある個人商店やらを探し回った。 -家から徒歩圏内に豆腐屋と魚屋を見つけた。 -野菜は鎌倉の即売所まで買いに行った。 -米も鎌倉の米屋に求めた。 -乾物も鎌倉だ。 -休みの日は結構な時間と労力を食べ物に投資していたと思う。 -美味しいものを食べてこその人生なのである。 -</p> -<p> -やっぱり農家になりたいな。 -</p> diff --git a/man/journal/posts/20201201.html b/man/journal/posts/20201201.html @@ -1,15 +0,0 @@ -<h1>畑をさせてもらえることになった。</h1> -<time>2020-12-01</time> -<p> -実家のとなりに畑がある。 -子供の頃はそこで育った野菜をよくもらって食べていた。 -最近そこを耕していたひとが高齢のため引退して、 -雑草が生え放題になっていた。 -</p> -<p> -先日その土地の地主が草刈に来たので声をかけたところ、 -暫く使う予定がないので使ってもいいとのことだ。 -</p> -<p> -ということでぼちぼち何か作ろうと思う。 -</p> diff --git a/man/journal/posts/20201202.html b/man/journal/posts/20201202.html @@ -1,11 +0,0 @@ -<h1>たまねぎを植えた。</h1> -<time>2020-12-02</time> -<p> -祖父の友人がたまねぎの苗を分けてくれたので植えた。 -時期はかなり遅いみたいだがうまくそだってくれるだろうか。 -</p> -<p> -耕していない畝に15cm間隔、条間20cmくらいで少し穴を掘って植えた。 -その上から、先日刈った雑草を被せておいた。 -とりあえず一畝だけ。 -</p> diff --git a/man/journal/posts/20201209.html b/man/journal/posts/20201209.html @@ -1,14 +0,0 @@ -<h1>畝を繋げた</h1> -<time>2020-12-09</time> -<p>この土日に不耕起の農法を教えてくれる赤目自然農塾にお邪魔してきた。 -その際、今の畝では幅が狭すぎるので広げたほうがいいといわれた。 -とりあえず畝の間の溝を埋めて二つの畝を繋げることにした。 -余り無理をしても次の日動けないのは困るので今日は一列だけ。 -180cmから2m程度の畝になった。 -</p> - -<p> -先日植えた玉葱は根がきちんと活着してくれたようで、 -寝ていた株も起きあがって元気そうである。 -ただしこの畝は細いままなので、やはり表面が少し乾燥しているようだ。 -</p> diff --git a/man/journal/posts/20201210.html b/man/journal/posts/20201210.html @@ -1,18 +0,0 @@ -<h1>小松菜の種を蒔いた。</h1> -<time>2020-12-10</time> -<p> -駅の近くに種苗店がある。 -以前から気にはなっていたのだが、いつ前を通っても店主がお客さんと話し込んでいて入りづらかった。 -ところが今日はだれもいなかったので遂に敷居を跨ぐことができた。 -</p> -<p> -時期が時期なので余り品揃えはよくなかったが、いろいろと教えてくれた。 -F1ではない種も多数取り扱っているようで、和歌山大根という地元の品種もあった。 -今ある種のなかから、一年中いつでも蒔ける小松菜をいただいてきた。 -楽天という品種だった。 -</p> -<p> -家に帰って早速種を蒔いた。 -先日広げた畝に、北側から2坪ほどの土にばら蒔きした。 -少し乾燥ぎみだったので、横に散らばっていた草を上から被せた。 -</p> diff --git a/man/journal/posts/20210106.html b/man/journal/posts/20210106.html @@ -1,39 +0,0 @@ -<h1>x220から投稿テスト</h1> -<time>2021-01-06</time> -<p> -thinkpad x220を手に入れ、arch linuxの環境を整えた。 -</p> -<p> -スペックはこんな感じ: -</p> -<ul> - <li>core i7 2620M</li> - <li>メモリ 8GB</li> - <li>ssd 256GB。</li> -</ul> -<p> -ヤフオクで送料入れて15000円程度だった。 -</p> -<p> -画面はTNだろうと思って買ったが、 -届いたら視野角が広くて非常に見易いので -多分IPSであろう。 -これは結構うれしい。 -</p> -<p> -全体的に綺麗な個体だ。 -</p> -<p> -バッテリーは期待通り完全に消耗していて、 -起動後5秒ほどで切れてしまう。 -</p> -<p> -あとwindows用の日本語キーボードはあんまり -好きではない。 -いちばん下の段がぎゅうぎゅう詰めでスペースが -小さすぎる。 -</p> -<p> -バッテリーを交換するのが先かキーボードをUS配列にするのが先か -悩ましいところだ。 -</p> diff --git a/man/journal/posts/20210806.html b/man/journal/posts/20210806.html @@ -1,99 +0,0 @@ -<h1>畑を返すことになった。</h1> -<time>2021-08-06</time> -<h2>はじめに</h2> -<p> -昨年の秋実家の隣の畑を借り農業を始めることになった。以降好きな種を蒔いては世話をし、少しばかりの収穫をいただいてきた。夏になり冬野菜はどんなものを植えようかと考えていたところ、地主さんからある連絡があった。この秋に家を建てることになったので土地を返してほしいとのことだ。いい機会なので、この一年弱の間素人なりに試行錯誤してきたこと、考えてきたことを記録しておく。 -</p> - -<h2>農業に対する基本的な考え</h2> -<h3>農業の目的</h3> -僕が農業をする目的は自給自足の生活をすることである。一度社会人としての道を歩もうとして精神を病んだ。世の中にあふれているほとんどの物に価値を見いだせなかった。にも関らず自分の時間をお金に変換している意味がわからなかった。自分の時間を使って自分にとって価値のあるものを生みだす。それをできるのが自給自足のための農業だと考えた。 -<h3>農法</h3> -<p> -畑を借りる前から農法に関する情報は本やネット等で収集していた。そのなかでも目に付いたのが川口由一氏の自然農及び福岡正信氏の自然農法である。多少の違いはあるがどちらも無農薬、無肥料、不耕起という点で共通している。雑草や虫等を敵とせずそれらの活動によって土壌を豊かにし、その上で作物を育てるというものだ。この方法が自分に合っていると感じたので採用することにした。 -</p> -<h3>種</h3> -<p> -また、育てる作物に関しては、高橋一也氏の「古来種野菜を食べてください。」に感銘を受け、可能な限り昔から栽培されてきたものを探すようにした。現在市場で流通している野菜は一代交配種と呼ばれるものが多い。一代交配種というのは、「生物において、ある異なった対立遺伝子をホモで持つ両親の交雑の結果生じた、第一世代目の子孫のこと」(<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>)。一代交配種は収量、形質、味等がそろっているので市場競争力が高い。その一方で、一代交配種をかけあわせると、一代目ではかくれていた遺伝子が発現し、市場価値の高いものは収穫できない。このため、ひとたび一代交配種を育てはじめると、以降毎年のように種苗会社から種を購入することになる。 -</p> -<p> -僕が目指したいのは自給的な農業である。作物の市場競争力はなくていいし、種苗会社に払い続けるお金もない。また一代交配種ばかり育てられると、全国どこでも同じ野菜しか手に入らなくなり食文化もあったものではない。それに対し古来種野菜は、地域ごとに代々受けつがれてきたもので、その土地にうまく適応しその場所の食文化の形成に深く関わってきたものである。僕の地元和歌山でも、湯浅で作られる金山寺味噌で使われている湯浅なすというものが残っている。関係ないがあみ清数見商店というところの金山寺味噌がおいしい。「発酵文化人類学」(小倉ヒラク)にのっていた太田久助吟製のものはいまいちだった。表示を見ると人口甘味料(確かステビア)が入っていた。 -</p> -<p> -閑話休題。種は古来種を多数とり扱っている野口種苗研究所のものを購入するようにした。 -</p> - -<h2>生ゴミの肥料</h2> -<p> -畑を借りてから、台所からでる植物性の生ゴミは全て畑の一角に捨てるようにした。胡瓜や人参のへた、南瓜のわたや種等である。捨てたゴミは少し土とまぜ、発酵させて二年目から畑の肥やしとして利用しようと考えてのことだ。冒頭で書いた無肥料と矛盾するがまあこれも試行錯誤のうちである。 -</p> -<p> -春から夏にかけて気温が上がり、梅雨には雨も降り、微生物の活動が活発になる。始めは臭いが大丈夫か心配だったが、日中30度を越えるようになってもほとんど臭くない。1メートル以内に近づいて少し臭うが、臭いというほどではない。臭い臭いではない。一時コバエがたかっていたが、今は目立たなくなり、かわりにコオロギがうじゃうじゃしている。 -</p> -<p> -春の終りごろに買ってきた南瓜のわたと種もここに捨てた。しばらくするとそこから南瓜の芽が大量に生え、梅雨があけるころにはたくさん花をつけた。近くの養蜂場からだと思うが、セイヨウミツバチがやってきて受粉してくれる。7月の終りごろにはおおきな実をつけた。収穫して煮物にしたがとてもおいしかった。捨てた種は一代交配種で、できたのはその子供なのでおいしくなる道理はないのだが。不思議である。 -</p> -<p> -地主さんから土地の返還を打診されて畑に生ゴミを捨てるのはやめにした。ところが調理中にでるゴミの量は変化するわけでわない。野菜のうち食べない部分はすべてゴミ箱に捨てるようになった。畑を借りる前の状態に戻っただけである。ところが切った野菜のへたをゴミ箱に捨てるたびになんだか虚しくなる。畑に撒けばそこにまた植物が育ち収穫にも繋がる。ところがゴミ箱に捨ててしまうとなんにもならない。そればかりか、ゴミを集めてさらにそれを焼却しなければいけない。すべて税金である。ただ畑に捨てるだけでまた利用可能な形のエネルギーになるものを、税金を投入したうえで無にしているのだ。あまりにも勿体無い。しかも一般的な農家では、生ゴミを税金で回収してもらったうえで、肥料を購入してきて自分の畑に施すのだ。江戸時代なんかはさらに無駄がない。自分たちの排泄物まで畑に還元していたほどだ。 -</p> - -<h2>育てた作物</h2> -<h3>玉葱</h3> -祖父の知り合いに苗をもらって植えた。確か初めて植えたのがこれである。土が固く肥沃度も低いためか玉が膨らまなかった。 -<h3>小松菜</h3> -時期が悪かったのか、すぐにとう立ちしてしまった。 -<h3>法蓮草</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>春菊</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>牛蒡</h3> -雑草を処理した場所と処理しない場所に分けて植えた。雑草の下でも元気そうに育っている。生育が遅いので土地を返却するまでに収穫できるか不明である。 -<h3>じゃが芋</h3> -六月の雨でほとんど腐ってしまった。水はけが悪いのが原因だと思う。収穫できたものは小さかったが美味しかった。 -<h3>葱</h3> -warmerwarmerというところで買ったセット野菜に入っていたものの根を切って植えた。葱坊主ができ、種を収穫できた。 -<h3>胡瓜</h3> -地這いきゅうりを植えた。雑草がしげってもそれに巻きついて元気である。種の部分だけよく太っていびつな形に育った。肥沃度の問題か。味は普通にきゅうりである。 -<h3>南瓜</h3> -上に書いた生ゴミとは別に日本南瓜を植えた。すぐに発芽したがそれ以降成長しない。花はひとつだけ目撃した記憶がある。 -<h3>冬瓜</h3> -これもwarmerwarmerの野菜から種をとりだしたものである。かぼちゃと同様、発芽したが成長しない。 -<h3>とうもろこし</h3> -雑草に負けずよく育った。ただ生育にばらつきがあり、うまく受粉できなかった。収穫できたものは歯抜けである。味はよかった。 -<h3>いんげん</h3> -白金時菜豆と、つるありいんげんをうえた。白金時菜豆は収穫できたが成長が不十分で量が少ない。つるありいんげんは発芽しただけである。せっかく立てた支柱は虚しく、すずめの遊び場である。 -<h3>伏見甘長唐辛子</h3> -発芽せず。 -<h3>胡麻</h3> -発芽せず。 -<h3>小豆</h3> -あまり大きくならないが、長い期間にわたり収穫できている。粒が小さい。 -<h3>西瓜</h3> -発芽したが成長しない。 -<h3>茄子</h3> -実験的に雑草を刈らずに蒔いた。イヌムギかノゲイヌムギか同定できていない草が茶色く枯れているところに蒔いた。日照か水の不足か。 -<h3>大豆</h3> -よく育っている。顔を近づけると枝豆のにおいがして楽しい。 -<h3>さつま芋</h3> -よく育っている。少なくとも地上部は。時期的に収穫まで漕ぎつけるか微妙なところ。 -<h3>里芋</h3> -よく育っている。と思っていたが、近所の畑のものはもっと育っていることに最近気が付いた。肥料をやっていないのでこんなものだろうか。本葉がでてすぐのころ黒いいもむしに葉脈をのこして食い荒されたが、また葉が出てきて平気そうである。こちらも土地を返却するまでに収穫できるかわからない。 -<h3>人参</h3> -最近蒔いて発芽したばかりである。好光性のため種を蒔いた上にかぶせる草を少なくしたが、少なすぎたようだ。土が乾燥ぎみで発芽率はいまいちである。 - -<h2>おわりに</h2> -<p> -不耕起では一年目はあまりなにも育たない。土が固くて痩せているからである。三年目から突然変化が起こり、土が柔らかく肥沃になってくるという。その変化をこの畑で体感したかったのだがそれはかなわなかった。 -</p> -<p> -この一年弱の短い期間にも、この土地の豊かさは格段にあがったように思う。土の上をコオロギやクモが行き交い、バッタやカエルが跳ね、チョウやトンボ、ハチが飛び回っている。土をいじればミミズやカタツムリ、アリがわんさかわいてくる。これらの虫を求めてスズメやセキレイ、イソヒヨなどの鳥が集まり、夜になればネコやイタチまで見かけるようになった。 -</p> -<p> -ここに生きた生物たちはこれからコンクリートに埋められることになる。なんだか虚しい。 -</p> -<p> -この一年弱の経験から、農業で生きていく自信が芽生えたように思う。そこにあるものを利用し、多くを求めなければいいのだ。この自信が確信にかわるにはもっと経験が必要だろうが。 -</p> -<p> -畑を返したあとはすることがなくなってしまう。他の土地を探すのもひとつだし、別のことをするのもありかもしれない。いいご縁があればいいな。 -</p> diff --git a/man/journal/posts/20211129.html b/man/journal/posts/20211129.html @@ -1,22 +0,0 @@ -<h1>赤目自然農塾</h1> -<time>2021-11-29</time> -<p> -11月13日、14日の二日間、奈良にある<a href=https://akameshizennoujuku.jimdofree.com/>赤目自然農塾</a>の勉強会に参加してきた。この塾は自然農の提唱者である川口由一さんが始められたもので、自然農の技術を学び実習できる場である。毎月一回二日間の定例の学びがあり、一日目には畑の補修等の共同作業と言葉を通しての学びが、二日目には実習が行われる。昨年12月に初参加し、今回はほぼ一年ぶりの2回目であった。1反9畝の畑を借りることになったので、本格的に自然農の技術を身に付けたい。できれば毎月通って一通りのことを教わりたいのだが続くだろうか。 -</p> -<h2>1日目</h2> -<p> -車を停めて外に出る。思っていたより暖かかった。もこもこの着物を着て来たが厚いので暑いので薄めのものに着替え、その上から作務衣を着た。普段畑に入る時は裸足だが、共同作業で何をするのか分からないので地下足袋を履いて小屋に向かう。 -</p> -<p> -午前の作業は篠竹を刈り取って枝を払い、束にして小屋の屋根裏に干すというものだった。篠竹はよく撓って使いやすそうだった。10人以上で作業していたが収穫量は思った以上に少なかった。一人でやると日が暮れる。 -</p> -<p> -午後は汲取式の便所を汲み取って別の場所に撒いた。臭いはそこまでひどくはなかった。ブルーチーズや高級な納豆でも香るアンモニア臭が中心で、吐き気を催すほどではない。発酵食品を食べすぎているのかもしれない。便所は地面に穴を掘って桶のようなものを埋め、木の板で便器を作って被せ、周囲から見えないように囲っているだけのものだ。小屋に隣接するものは建物の一部になっていて壁も木材でしっかりと作られているが、畑の中にぽつんと立っているものは先程の篠竹を束ねたもので周囲を囲っているだけの簡易なものである。桶から柄杓で排泄物を汲み取りバケツに入れる。本来は天秤棒を用いて一人で二つ運ぶというが、技術が必要なので今回は棒の中心にバケツをぶらさげて二人で一つを運ぶことになった。肥を撒く場所までの道はでこぼこで途中川を渡る必要がある。初対面の人と二人、なかなかの緊張感のなか息を合わせて肥を運ぶ。肥を撒く場所ではいきなりバケツごとあけるのは危険なので、ここでも柄杓で少しづつである。玄関先に水をうつようにその場所全体にまんべんなく撒く。柄杓にスナップを効かせると肥が帰ってくる。これもまた緊張感のある作業だった。そこそこの量があったが日没前には終わった。 -</p> -<p> -銭湯を経由して山荘に。晩御飯は菜飯とかぼちゃのサラダ、それにけんちん汁だった。ほとんどが自然農で採れた野菜である。御飯の後は言葉を通しての学びとして、今回は教育について議論した。21時ごろから始めて終ったのは日付が変わるころだった。みんな眠い目をこすり、船を漕ぎならがの議論であるが、これがなかなか面白いものである。誰かが言った言葉が直接脳に入って来くる。あまりうまくまとまっていない考えでも発言すればだれかの脳に届いてなにかしら返答がある。なんだか全員の脳味噌を直接繋いで考えているような感覚になるのだ。僕は今回寺子屋を始めたいという旨のことをぽろっと言っただけで終った。しかし言っただけでもなんとなく自分でも実現させようという心持ちになるものである。 -</p> -<h2>2日目</h2> -<p> -2日目は農作業の実演である。今回は稲の刈り方とその後の干し方、それに麦の蒔き方を見せてもらった。これが昼過ぎに終り、御飯のあとは畑の見学会に参加させてもらった。 -</p> diff --git a/man/journal/posts/20211214.html b/man/journal/posts/20211214.html @@ -1,17 +0,0 @@ -<h1>無題</h1> -<time>2021-12-14</time> -<p> -図書館に本を返しに行った。最近家ではパソコンばかりいじっているので本を借りても読まずじまいのことが多い。たまに読もうと思う時もたいがい小林一郎の法華経大講座を開く。一応日蓮宗の坊主になろうというのでひととおり法華経のことは知っておきたいのだ。今日も図書館ではいろいろと漁った。ウェブサーバーやメールサーバーを立ててみたので、セキュリティ関係の本や暗号の本を探した。数冊は立ち読みしたがどうせ読まないだろうとすべて本棚に戻した。PGPの鍵を作ったりしているので暗号関連の数学は理解しておきたいという願望はあるのだが頭が多分ついていけない。場所を変えて農業の本も見てみたがあまり読みたいものがなかった。麦を育て始めたのでそのあたりの情報が欲しかったのだがなかった。とうとうなにも借りずに出てきてしまった。 -</p> -<p> -図書館からの帰りはたいてい途中にある野菜の直売所に立ち寄る。ここはスーパーにはなさそうなものがたくさんある。大根や蕪のおばけみたいなのや、里芋の親芋や葉っぱなんかも置いてある。里芋の葉っぱは家でかじって口の中がとんでもないことになって敬遠した。品種によって渋が強かったり弱かったりするので売っているものは食べても大丈夫なものだと思うが。無農薬の野菜も置いてあるのだがそうだと書いていないのも面白い。今日はその無農薬のものから紫キャベツと、別の棚から真菜をいただいてきた。キャベツはピクルスに、真菜は白和えにするのがおすすめだそうだ。 -</p> -<p> -野菜を買ったあと、家の葛が切れていたのを思いだして豆屋にも寄った。黒豆や小豆等の新豆が入っていたが家に余っているので買えなかった。しかしこの町には昔の店がいろいろ残っているものだ。生まれ育った地元であるが、今になるまでほとんど店を知らなかった。寺に通いだしてからお上人の奥さんがいろいろと店を教えてくれる。この豆屋はこの寺の檀家だそうだ。他にもかつを節屋、魚屋、肉屋、うなぎ屋、蜂蜜屋、豆腐屋、酒蔵、お茶屋、珈琲豆焙煎所等、スーパーに行かなくてもほとんど揃う。味噌と醤油の蔵もあるにはある。醤油発祥の地、湯浅であるがこれは自転車ではきつい。山を越えての50Kmである。横浜から東京まで片道50Kmを走ったことがあるがかなり疲れた。昔の人はこのくらいの距離をあたりまえのように歩いていたのだろうか。実家の辺りから山を越えて湯浅に向かう山道が今も残ってはいるが、ひとつ目の山の頂上まで行くのでもそれなりにくたびれる。体力を付けねば。 -</p> -<p> -葛を買って家に向かっていると、いつも畑で散歩がてら声を掛けてくれるおじいさんに会った。普段は簡単な挨拶だけだが今日は少し話した。40歳のときに思うところがあってお経の勉強を始めたらしい。写経していたがすぐに飽きて仏教画を始め、教室を主宰するに至ったそうだ。高野山大学の図書館にしばしば行っては画集のコピーを持って帰って来たという。なかなか変った人生を歩んできたようである。畑でもほとんどの人が頑張れと言うところ、この人は頑張りすぎるなと言うので面白い人だと思っていたが、話してみると色々考えが深そうな人である。 -</p> -<p> -仕事を辞めて以来、人と関わる機会が増えたように思う。畑を借り、道行く人と話し、寺の門を敲き、檀家と話し、その人その人の人生を垣間見ることができ、人生が何倍にも広がった。収入は無くなったが今の方が生きている。 -</p> diff --git a/man/journal/posts/20220513.html b/man/journal/posts/20220513.html @@ -1,19 +0,0 @@ -<h1>坊主になるために薬の服用を強要されそうになってる。</h1> -<time>2022-05-13</time> -<p>地元の寺で出家、得度し、次は宗門の道場に入って修行である。ただし修行と言ってもいい加減なもので、最近流行しているらしい感染症の対策だかなんだかで、総本山に近い新幹線の駅前にあるホテルで行うらしい。寺に滞在すれば感染するがホテルなら感染しないウイルスとはなんとも特異なものである。それとも参加者を自室に監禁してテレビ電話でも繋いで行うのか。だとしたら自宅からでもいいものを。愚痴を言ってもしかたがないのでとりあえず参加申請書を作成して健康診断書と共に提出した。</p> -<p>しばらくした今日、宗門から電話があった。健康診断書のアレルギーの欄に喘息とあるが、発作が起こった時の為に医者に行って薬を処方してもらい、道場に持参するようにとのことだ。</p> -<p>は?</p> -<p>まず喘息の発作がどのようなものかは自分がよく知っている。僕の場合咳がきつくて息苦しいが病院に行く程のものは幼い頃以来ない。そのため普段から発作を抑えるような薬は常備していないし欲しいとも思わない。</p> -<p>次にたとえどんな症状が出ても薬を飲むかどうかは本人の判断に任せるべきである。薬とは本質的に危険なものである。副作用の無い薬は無い。服用による危険性と服用しないことによる危険性を天秤にかけた上で飲むかどうか判断するべきものである。その判断には統計的な情報に加え、自分の身体の状態をよく観察する必要がある。そのため、他人が服用を強いることはあってはならないだろう。</p> -<p>最後に薬を服用した方がいい場合であっても、どうするかは本人に任せるべきである。これは死生観の問題である。僕は現代の医療に依存した生き方をするより、自然に生きて自然に死ぬ方を選びたい。</p> -<p>以上3つの理由により、宗門の要求は受け入れられないものである。ただし残念ながら突然の電話だったのでここまでうまく纏めて話すことは叶わなかった。以下に電話でのやり取りを記す。</p> -<p>宗門からの要求に対してまずは受け入れられない旨を伝えたところ、集団生活なので宗門に従えとの答えが帰って来た。周りに迷惑がかかるからと。しかしこれは僕個人の問題であり、どのように迷惑がかかるのか、あるいは薬があった場合どうして迷惑がかからないのか分からなかった。そのため僕個人の問題であり周りは関係ないだろうと伝えた。そうすると次は、僕にもしものことがあった場合、薬を持っていないと宗門では責任を取れないとも言われた。これに対して、なぜ僕の命について貴様等に責任を取られないといけないのか分からないと返した。そうすると、そういうものだからとの答えが返ってきた。意味が分からなかったので理解できない旨を伝えたところ、上司と相談して連絡しなおすとのことだった。そのまま電話を切られそうになったので、最後に念をおして、これは死生観の問題であり他人にどうこう言われる筋合いはないこと、そして集団生活と雖も個人の自由の範疇であると考えていることをはっきりと伝えた。</p> -<p>以上のやり取りは2時間ほど記憶を遡って書いたものであり、どこまで合っているか分からないことを断わっておく。</p> -<p>電話が切れた後、一応師僧に報告を入れようと寺に電話したところ、こういう時は適当に嘘でも付いてやりすごせばいいと言われた。お前は潔癖すぎだと。</p> -<p>間違いない。</p> -<p>しかし潔癖なのもある意味気持がいいのだ。会社を辞めて社会から距離を置き、失うものがなにもない状態で綺麗に生きている今はなかなか気分がいい。ただ宗門に対して嘘を付かないことにだんだんと価値を見出せなくなりつつある。こんないい加減な組織に対して綺麗でいることにどれほどの意味があろうか。もうどうでもいいか。</p> -<p>寺に報告をした後、夕飯の支度をしながら宗門とのやり取りを思い返しているとやっぱりなんだかひっかかる。薬を持参させるということは、発作が起こったら服用させるということである。つまり薬の服用を強要しているようなものだ。これは世間一般の常識に照らしても不条理なことではなかろうか。それとも僕が世間と距離を置きすぎて知らないだけで世の中ではそんなものなのか。和服で生活をするようになり、僕が覗ける社会の窓はTwitterのみになってしまった。そのTwitterを見ても、風邪を引いたら頭痛薬や解熱剤を、花粉症にはその薬を飲むのが当たり前のようだし、案外宗門は常識に則って良心的な連絡を呉れただけかもしれない。そんな世間はくそくらえだが。</p> -<p>医学が本当に人を救えているのかは甚だ疑問である。目の前の命はある程度助けられるかもしれないが、助けることが本人にとって幸せかどうかは別問題である。中途半端に助かったが為に余計な苦しみを味わって死ぬことになるかもしれない。また、どんなに医学が発達しても救えない命は零にはならない。さらに、医学が救う命というのは本来自然淘汰されるべきだったものではないだろうか。弱い遺伝子は死ぬのが自然の掟なのである(僕自身小児喘息で死にかけたことがあるので本来は淘汰されるべき人間なのかも知れない)。その掟を破って死ぬはずだった人間を助けてしまい、その人間が子供を作り遺伝子を遺す。そうしてだんだんと医学がないと自立して生きられない人間を量産することにはならないか。現代においても既に医療費が嵩んで面倒なことになっているではないか。目の前の命を救ったが為に将来より多くの苦しみを生む可能性を考えなくていいものか。</p> -<p>以上の議論は文献に基かない上、定量的なことを一切考えていないいい加減なものである。しかし今は目の前の命を救うことを絶対の正義として疑わず、その副作用を完全に無視しているのではないか。それで本当にいいのだろうか。</p> -<p>医学に縋り病気を恐れて長生きするより、日々大切に生き、死を潔く受け入れた方がよっぽど充実した人生だと僕は思う。宗教が現代も存在するのは、科学が救えない人の受け皿として必要とされているからではないか。</p> -<p>全ての人間は死ぬ時に死に、それまでは生きるのである。それでええやん。少なくとも僕はその方がいいのでほっといて欲しい。</p> diff --git a/man/journal/posts/20220729.html b/man/journal/posts/20220729.html @@ -1,3 +0,0 @@ -<h1>RSS作った</h1> -<time>2022-07-29</time> -<p><a href="/rss.xml">RSS</a>作った。疲れた。htmlファイルのタイムスタンプを元に更新日を出力したが、なぜかほとんどのファイルのタイムスタンプが最近の日付になってしまっていたので修正しないといけなかった。RSSフィードの作成にはこのウェブサイトを出力するために作った<a href="https://git.mtkn.jp/dotfiles/file/bin/kagero.html">スクリプト</a>に組み込んだ。</p> diff --git a/man/journal/posts/20220730.html b/man/journal/posts/20220730.html @@ -1,120 +0,0 @@ -<h1>新型コロナウイルスとその対策に関する個人的見解</h1> -<time>2022-07-30</time>作成<br> -<time>2022-08-03</time>更新<br> -<h2>はじめに</h2> -<p> -新型コロナウイルスとその対策に関していろいろと思うことはあるが、自分のなかでもあまりまとまっていないうえ、前提となる知識や情報、考えの論理的整合性がとれていない部分が多々ある。それもあってあまり文章として僕の考えを書こうとは思っていなかった。しかし今回の感染症が流行りだして2年と半年が経ち、いまだに社会全体がおかしい(と僕が思う)状態である。そのため自分も黙っているのはむしろ無責任ではないかと思いここに書き残すことにした。どうせほぼ見てくれる人はいないだろうけれど、それでもなにかしたかった。 -</p> -<p> -僕自身はどんなことがあろうがそれを運命と呼び、それを受け入れる覚悟である。その方が日々楽しく生きて納得の上で死んで行けるように思うのだ。自分でも素人なりに論文を読んだりして可能な限り信頼性の高い情報を集めようとはしているのだが、このような考えが根底にあるので、科学的な根拠というのはなんだかどうでもよく思えてきたりするもので、どうも今持っている知識というのがふわっとして正確性に欠ける。しかしだからこそ書きとめて後で反省できるようにしたい。 -</p> -<p> -そのためこの文章は正確な知識に基くものではない。本来論文等をきちんと引用するべきところだが、とりあえず現時点での考えとして公開することにした。また、自分では気を付けているつもりだが、知らないうちに陰謀論を掴まされている可能性もある。おかしな点は指摘してくれるとありがたい。 -</p> - -<h2>概要</h2> -<p> -マスクは今回の感染症を防ぐ効果は非常に限定的だと思う。一方でその副作用は大きい。体が常に酸素の薄い状態になっている。夏は熱中症の危険もある。却って口が乾燥するという人もいる。なによりの懸念は子供の発育への影響である。他人の表情が見えなくてどうしてまともに育つのか。 -</p> -<p> -ワクチンについても効果は薄く、副反応が大きいので打つべきではないと思う。特に若年層は発症した際のリスクが低く、逆にワクチンによるものと思われる心筋炎等の可能性が高い。さらに打ったからといって感染する確率は変らないようだ。 -</p> -<p> -消毒もやらない方がいいと思う。 -</p> -<p> -またこの病気自体危険性がそこまで高くないので、そもそも感染の拡大を防ぐ必要はないと思う。 -</p> -<p> -さらに、例え危険な病気が流行したとしても、人間味のある生活を犠牲にすることのデメリットとその病気の危険性とを天秤にかけ、どのような対策が適正なのかをきちんと議論すべきである。 -</p> -<p> -ところがそのような冷静な考察をする上で必要な情報がなにひとつみあたらない。感染者数や死者数として発表される数字は統計として信用できないだけでなく、医療機関に対する補助金等により大きく歪められている可能性が高い。 -</p> -<p> -また、マスクやワクチン等は同調圧力により行っている人が多いと思う。周囲の人間がやっているからといった理由だけでの行動である。このような世間の流れは非常に危険だと思う。今回は軽い風邪でしかなかったが、この程度のことでここまで社会全体がひとつの空気に支配されているようでは、本当に国運を分けるようなことに見舞われればひとたまりもない。意見の多様性を無視してひとつの流れを作ってしまうと、その流れが間違っていたときに国が滅びるだろう。 -</p> -<p> -しかしやはり一番心配なのは今このような環境のなかで自我を形成している子供である。マスクやワクチンはそれ自体が非常に強く影響する上、同調圧力も重くのしかかる。こんな状態で子供が健全に育つとはとても考えられない。10年、20年あるいはもっと先かも知れないが、今の子供達がこの国を動かすようになれば必ず大きな問題があちこちで噴出することになるだろう。 -</p> -<p> -そもそもウイルスは敵ではない。生態系の重要な一員である。共存していけばいいのだ。 -</p> - -<h2>マスクについて</h2> -<p> -一応いろいろな論文を読んだ。マスクの効果に肯定的なものも否定的なものもあった。僕が読んだものはTwitterで拡散されているものが中心であるが、そのなかでマスクの効果に肯定的なものは、電話やメール等による調査とシミュレーションによるものばかりだった。前者は論文の中でも明記されているが、回答するかしないかは回答者に委ねられており、また回答者のバイアスもあり、とても信頼できるものとは言えないと思う。後者についてはマスクには定性的には効果があるとの前提に立って、その効果を定量的に測るものであるため、こちらも本当に意味があるものかどうか相当あやしいと思う。日本においてもスーパーコンピュータの富嶽によるシミュレーションを何度も目にしたが、これもマスクにより飛沫が防げると言っているだけで、だからウイルスに対してどう影響があるかという点については説明していない。マスクをすれば飛沫が飛びにくくなるのはスーパーコンピュータで計算するまでもなく理解できることではないか。一方でマスクの効果に否定的な論文には、RCT等、無作為性の高い手法を用いたものが多く、こちらのほうが信頼性が高いと判断した。ところでウイルスがマスクの繊維の隙間の大きさよりも圧倒的に小さいのでマスクに効果がないと言う人もいるがこれについてはなんとも言えないと思っている。マスクの穴が大きくても、例えば繊維に静電気で吸着されたりするかもしれない。このような可能性だけで議論すればいつまでも答えがでない。やはり信頼できる根拠というのは現実の観測であって無作為性の高い統計的手法によるものだと思う。 -</p> -<p> -続いてマスクの害について、先日マスクを着用しないと参加できないという場にどうしても行く必要があり、久々に着用した。あまりにも苦しかった。自分が喘息を持っているということもあるかもしれないが、明かに脳に届く酸素が少いと思う。これはバイアスかなあ。このような状態で2年以上も過している人の脳にはなにかしらの障害が起きていてもおかしくないと思うのだが。あるいはマスクにより口呼吸になり却って喉が乾くという話もある。喉が乾けばウイルス等に対する防御も手薄になるだろう。また不織布マスクからはマイクロプラスチックが放出され、それを大量に吸い込み続けているという話も聞く。マイクロプラスチックを吸い込むことと肺癌とを結び付ける話もあるがこの辺はあまりきちんと確かめていない。他にもいろいろなリスクがあるだろうが、一番重大なものはやはり子供の発育である。生れたときから周囲の人間がマスクをした状態で、どうして人間の表情や感情、あるいは言語を学ぶというのだろう。生まれたての赤ちゃんでなくても、他人との人間関係を学び自我を形成している最中の子供達にとって、周囲の表情が分からないのはあまりにも影響が大きいのではないだろうか。大人でもマスクをした他人の表情を読みとるのはマスクをしていない場合よりも難しいが、子供の場合はそれがさらに顕著であるという。このように社会全体が長期に亙ってマスクで顔を覆っていては、今の子供達の世代が将来酷く歪んだものになると思う。これに関して警鐘を鳴らしている人はいるが、社会全体では無視されている。これには科学的根拠はあまりないようだ。結果が出るのが数十年後であろうから当然である。しかしだからといって子供を虐げていい理由にはならないだろう。子供がまともに育たずに害を被るのは彼らが成長したときに年寄になっている今の我々自身かも知れない。ところで徳川時代において、徳川家の子供は生まれた時から尊いというので、乳母は母乳を与える際に顔を見せないようになにか被っていたらしい。それとの因果関係は不明だが、徳川家の子供は当時の平均よりも死亡率が高かったという。この話もきちんと確かめなければ。一方マスクのせいで子供の方が表情を作れなくなるのではないかと考えていたこともあるがこれについてはどうやら心配ないかもしれない。チンパンジーかなにかの実験で、子供の時から他の個体の表情を見せないように育てても、本人は表情を作ることに障害はなかったそうだ。表情の作り方は本能に実装されているらしい。 -</p> - -<h2>ワクチンについて</h2> -<p> -ワクチンの効果は非常に限定されているようである。当初は一回打てば感染しなくなり、今回の騒動も収まると言っていたように思う。当時からそんな訳ないやろとは思っていたが、案の定全く収束する気配はない。二回目には打てば重症化しなくなり、感染の拡大も終わると言い、三回目もこれで終りだと言っていた。そして今は四回目である。僕は一回も打っていないが、これまで政府の言うことを信じて打って来た人は未だに感染の拡大が収まらないことをどのように考えているのか不明である。更に四回目を打てと言われれば未だにその指示に従う理由もよく分からない。 -</p> -<p> -また副反応も大きいではないか。いちいち高熱がでて苦しんでいる人が沢山いる。僕の父も三回目にやたら高熱がでて仕事の最中に会社から帰って来て家で寝ていた。心筋炎の危険も高いようである。政府がデータをちょろまかしていたと言う話があったが、ワクチンを打った場合と打たなかった場合では打った場合の方が圧倒的にリスクが高いようだ。そもそも今回のワクチンは従来のものとは根本的に違う新しいものであり、その安全性も未知数である。特に長期的な影響についてはなにも分かっていないのではないか。もちろん新しい技術には常に危険が付いてまわるものである。それを理解したうえで打ちたいと言う人は本人の責任で打てばいい。ただし今回のように国民全員に打たせようというのは間違いである。こんなことをしてしまっては万が一この新しい技術に長期的な危険性があった場合に全国民がその影響を受けることになる。卵はひとつの籠に入れて運んではいけないのだ。 -</p> -<p> -ところでワクチンを打つのが無料だと思っている人が多いようだがそんな訳ないやろ。全部国の金であり、つまりは我々の税金である。国債でも発行してくれるのならまだいいが、東日本大震災の前例があるのでどうせ増税されるに決まっている。その時はぜひともワクチンを打った人にのみ課税してもらいたいものだ。僕は払いたくない。また万が一このワクチンに長期的な後遺症等の危険があることが判明でもすれば、その治療にも国民健康保険という名の税金が使われるのだろうと思うとやるせない。 -</p> - -<h2>消毒について</h2> -<p> -消毒についても意味がないだけでなく逆効果である可能性もあると思う。手指消毒に関しては、一般に行われている程度のものではウイルスが死滅するとは思えない。ウイルスが死滅する程の消毒をいちいち行っていては、常在菌をも殺してしまい、さらに皮膚に備わっている物理的な免疫機構も働かなくなると思う。結局これも対策をしているというアピールの為のものでしかないのではないか。 -</p> - -<h2>新型コロナウイルス感染症の危険性について</h2> -<p> -この病気はそんなに危険なものであるとは思わない。死亡も重症化もそんなに数が多くない。また先日厚生労働省のウェブページのデータから計算してみると死者の平均年齢が男性で79歳程度、女性で83歳程度と、ほとんど平均寿命に近いものになっている。これは病気で死んでいるというよりも寿命ではなかろうか。ただしこの計算に使ったデータは年齢が10歳区切りであるのであくまでも概算である。病院がパンクしそうだという話も、どうやら軽傷の人が大量に流れこんできていて大変だということらしい。政府がこの感染症の扱いを5類に引き下げれば済む話のようだ。 -</p> - -<h2>人間味のある生活とのおりあいについて</h2> -<p> -今回の騒動では強権的な対策が次々と打ち出された。マスクやワクチンの推奨は半ば強制力を伴ったものとなり、飲食店の営業自粛では法的拘束力が無いにしても、従わない店は名前を公開するなどされていた。個人的な行動も同様であった。それまであたりまえに行われてきた人間らしい生活が奪われた形になる。その後、因果関係は分からないが、自殺者が大きく増えたようだ。人間が行うことには必ず負の面がある。個人の自由を制限することにはそれなりのコストが伴うのだ。危険な感染症が流行したからといってただちに人権を制限することになりかねない今回のような対策をするのは間違っている。この対策により発生する種々のコストと、対策をしなかったときの危険を天秤にかけて考える必要があろう。命を守る為と言って一切の楽しみを奪われたのでは今すぐ死んだ方がましである。あるいは命を最優先にするにしても、その命の中には当然対策をしたがために自殺に追い込まれる人も入っているはずである。国という大きな組織を運営していく上ではなんらかの数字を見て次の行動を判断せざるを得ない訳だが、その数字として死者数を考えた場合でも、対策をしないがために死ぬ人の数と対策をしたために死ぬ人の数の双方を考慮せねばなるまい。 -</p> - -<h2>必要な情報の欠如について</h2> -<p> -上のような冷静な議論に必要なのが正確な情報である。感染症によって何人死んだのか、何人がどれほどの後遺症に苦しんでいるのか、逆に何人が感染症対策の為に死んだのか等の情報である。ところが今得られるそのような情報にはどれも正確さが欠如している。感染者数として発表されているのは無作為ではない方法でPCR検査をして陽性になった人の数である。東京都ではPCR検査を行う施設に補助金が出るので、接種を受ける人に商品券を配って集客している所もあると言う。そもそもPCR検査の開発者であるキャリー・マリス氏はこの検査は感染症の診断に利用すべきでないとの見解である。またこの感染症による死者数として発表されているのはあらゆる原因の死者のうちPCR検査により陽性だった人の数である。別の原因で死んでも陽性であれば新型コロナウイルス感染症による死者である。更に、新型コロナウイルス感染症により患者が死亡すればその病院に補助金が出ると言う話もある。結局この感染症の本当の姿というのは一切見えてこない。テレビ等ではひたすら上のような定義の感染者数ばかり報道して視聴者の恐怖を煽っているだけである。ただでさえいい加減な定義の数字をさらに補助金によって歪めているのが現状である。このような状況で市井の人々は一体なにを怖がっているのか不明である。 -</p> - -<h2>同調圧力について</h2> -<p> -このような状況において、結局人々はどうしていまだにマスクをしてワクチンを打つのかといえば、それは同調圧力によるものである。もちろん一部にはこのウイルスを本当に恐れている人もいるだろうが、僕の周りではかなり少数派である。むしろ周りの目を気にしている人が大多数だろう。あるいは単に世の中の流れだからという理由でそれに付き従っている人も少なくない。中には自分が苦しい思いをしてマスクを着けているのだからお前も苦しいのを我慢して着けろと言う人や、周囲が常識として受け入れていることなのだから自分もしないと恥をかくと言う人もいる。同調圧力を感じてそれに屈っしてマスクを着用している人も居るが、それでは結局自分自身がその同調圧力になり、それを維持してしまっているではないか。このようなことでは結局いつまでたってもやめられない状態に陥ってしまう。というか陥っている。 -</p> -<p> -僕は上に書いた通りマスクは効果も必要性もなく害があると思っているので着用しない。この考えが本当に正しいかどうかは正直よく分からないが、少なくともマスクを着ける効果や必要性がないと思っているのであれば周りの目など気にせずにその通り行動するべきだと思う。同調圧力に弱い人というのはおそらく社会の流れに合わせてさえいればその流れが間違っていても自分には責任が生じないと考えているのだろう。ところで僕は今のようにマスクを強要するような状態が長く続けば必ず取り返しの付かないような問題がでてくると思っている。特に子供は同調圧力による影響を受けやすいように思う。学校でマスクをしなかったりワクチンを打っていなかったりしていじめられるという話も聞く。彼らは大人になっても周囲を伺うばかりで何一つ判断できない人材になるだろう。このような人達が国を運営する時代がいずれ来る。そのような社会で老後を過ごさなければいけないのは結局この社会の流れに同調していた人自身である。社会の趨勢に任せておけば確かに明確に責任を追求されることはないかも知れないが、その結果の尻拭いをするのは自分自身なのだ。 -</p> -<p> -国を形作っているのは自分達自身である。国民とは別に政府が存在するのではなく、政府は国民自身が作るものである。個人とは別に社会の流れがあるのではなく、自分達が社会の流れそのものなのである。自分の頭で考え自分が信じたことを行動で周囲に示すのはむしろ社会に生きる一個人としての責務ではなかろうか。選挙で投票するのは国民の責務だというのと同じである。 -</p> - -<h2>意見の多様性について</h2> -<p> -同調圧力と関連するが、社会をいい方向に進める上で重要なのが意見の多様性である。ここに書いていることは僕個人の考えであり、それが正しいものかどうかはよく分からない。科学者の中にもマスクやワクチン等に関して種々の意見があり、統一されているものではない。そもそも科学は不完全なものなので科学者の意見が統一されてもそれが正しいかどうかはっきり言えるものではないだろう。個人の信条の問題も絡むといよいよ統一した見解というものを出すのは不可能である。しかしこのような意見の多様性というのがむしろ重要なのではないだろうか。多様な意見があればそのなかで最もいいものが生き残っていく。我々人間を含む生物というのはこのようにして進化し、生き残ってきたのではないだろうか。その結果が混沌のなかにある種の調和がとれたこの大自然というものであろう。 -</p> -<p> -ところが今のように一方の意見に統一して他方を無視し、あるいは排除しようとするのはあまりにも危険である。もし社会が選んだ方が間違っていたら人類は絶滅である。卵はひとつの籠に入れて運んではいけない。まあそのような世界になるのもひとつ楽しみであるかも知れないが。 -</p> - -<h2>子供について</h2> -<p> -しかしなんといっても最優先して考えるべきは子供の未来ではないだろうか。今の感染症対策は結局のところ年寄の命を守る為に子供の生活を犠牲にしているというものである。別に対策などしなくてもこの病気で死ぬ年寄はこの病気でなくても死ぬだろうと僕は思うが、そうでなくてもこの感染症の死者および重症患者はやはり高齢者が中心であろう。そして高齢者を守る為であれば子供の生活や成長が犠牲になるということなど議論の俎上にも登らない。どのみちそう長くない高齢者の命と、この先国の中心を担っていく現在の子供達の生活や成長とどちらが大事なのかは考える余地もないと思うのだが現状そんなことを言っている人は少ないようである。今子供達の生活を鑑みずに自分達の命を最優先に考えて行動している年寄は恥を知れ。 -</p> -<p> -子供への悪影響は多岐に渡る。マスクやワクチン、消毒等の直接の影響と、これらすべてに関連した同調圧力による影響である。これらは各項目の所で書いたのでここでは繰り返さない。 -</p> - -<h2>ウイルスは敵ではない</h2> -<p> -思うにウイルスは人類の敵ではない。彼らに感染することで他種の生物と遺伝情報のやり取りができると聞く。人間は人間だけで自然界を生きている訳ではない。互いに影響しあい、時には殺し合い、あるいは寄生しあい、生きているものである。そうしてあらゆる生物がその総体としてひとつの生態系を形成しているのだと思う。人間の命を最優先にして他の生命を排除するようではそのうち生態系の方から人類が見捨てられることにもなるだろう。ウイルスの方は我々と共存する道を探りながら進化している。人間の方もそれに応えるべきだ。 -</p> - -<h2>最後に</h2> -<p> -ここに書いたことは決して正確なことではない。僕の持っている科学的な知識や情報もいい加減なものである。ただし自信を持って言えるのは、僕は自分の頭で考えその結果正しいと思った行動を取っているということである。僕の考えが間違っていても、それは自分が正しいと思い、その通りに行動しているので、後で謝ることもできるし反省することもできる。自分で考えず、あるいは間違っていると思うことをしていては、後になって反省も謝罪もできない。そこにあるのは周りがやっていたから合わせただけで自分には責任がないという言い訳だけだ。しかしその結果どのような社会になろうが、自分もそこに住むことになるのだ。口で責任が無いとは言っても、結局その尻拭いは自分自身ですることになるのだ。今きちんと考えて自分の責任で行動しておかないと自分が死ぬ時にどんな顔をすればいいのか分からないだろう。食べてしまったケーキはとっておくことができないのだ。</p><div style="display: none;">別に爆弾は作らない。</div> -<p> -僕は他人に言われた通りやってつまらない人生を送るより、死ぬ危険があっても自分の信じたことをして生きたい。その方が死に直面したときに気分よく死ぬことができると思う。 -</p> diff --git a/man/journal/posts/20220813.html b/man/journal/posts/20220813.html @@ -1,25 +0,0 @@ -<h1>正座が出来ていた頃に戻るには</h1> - -<h2>正座できない</h2> -<p>今時の年寄は正座のひとつも満足に出来ない。明治期に体育を輸入し、学校が椅子になり、その効果がようやく全ての世代に波及した。現住職のお婆さんはまだ正座ができたそうだ。夏の暑い時期を除いて年中和服で生活しており、亡くなる直前まで足腰はしっかりしていたという。この人の娘で、現住職のお母さんはもう正座ができなかったようである。現住職とその奥さん、そして当然僕自身も正座ができるとは言えない身体である。</p> - -<p>お寺によく来てくれる人達も正座できない。正座の姿勢になることすら一苦労のお年寄も多い。このため寺としては本堂にも椅子を用意せざるを得ず、少しなら正座できるという若い人達も皆椅子に座ることになるという悪循環である。</p> - -<h2>物が多い</h2> -<p>この寺には物が多い。良いと思って自分達で買ったものや、良いと思って檀家さんが持ってきてくれたもので溢れかえっている。これを少しは整理したいのだが。</p> -<p>中でも椅子に関してはどうしよもない。場所を取る。普段はあまり人が来ないのだがお盆やお彼岸には結構集まるようである。この時集まった人達はみんな椅子が必要だというので、かなりの数の椅子が寺に置いてあるのだが、片付ける場所が無いと言って本堂の端っこに出しっぱなしなのだ。一応重ねて並べてあるので整然とはしているが。というか中には多少は正座できる人もいるだろうからその人達は椅子いらんやん。それにたくさん人が集ったからといっても今ある椅子を全部並べる広さもないと思うのだが。</p> -<p>などと考えても、住職もその奥さんも頑である。必要だから置いている。場所がないから仕方ない。せっかく檀家さんが持ってきてくれたものだから仕方ない。</p> -<p>正座できる人ばかりなら椅子など全部捨てられる。中に一人や二人足の悪い人がいてもその程度の数を用意すれば済むのだ。人がぎゅうぎゅう詰めになるようなら座布団を敷かずに正座すればいい。日本の家は狭いんやから正座しようや。</p> - -<h2>老後の自由</h2> -<p>正座が出来ると老後も自由に動ける。住職のお婆さんがいい例である。今時の年寄は医学の為にかろうじて生命活動を維持してはいるが、生きているようには見えない。身体が動きにくいのを年のせいにしているがそれは間違いだろう。若い時から身体の使い方を考えていればそんなことにはならない。甲野善紀を見れば分かる。黒田鉄山もそうだ。僕が知っている合気道家も多くは年をとっても身体に不自由はない。</p> -<p>死ぬまで身体を自由に動かすにはやはり身体の感覚を磨くのがいいと思う。その為に古武術や剣術、合気道などを習わなくても、正座するだけで十分だと思う。光岡英稔がそんな感じのことを言っていたかな。今の椅子というのは、椅子が人間を座らせているものが多いと思う。だから身体に合った椅子、座りやすい椅子などと言って売っているのだ。だれか椅子の本を書いていた。日本には良い椅子がないと。日本人は椅子に座らされるのが窮屈だったからではないか。日本人の身体観では、椅子が自分を座らせるよりも自分が椅子に座る方が心地良かったのではないか。正座の場合、下にはただ平たい床があるのみである。家によっては床板がゆがんでいるかもしれない。日本人はそこに自ら座って生活してきたのだ。床が人を座らせていた訳ではない。僕は人間工学に基づいたと言って売られているものが嫌いなのだが、そのような商品は人間が使うというより商品に人間が使わされるように感じていたのかもしれない。</p> -<p>普段から正座で生活する。これだけで老後の自由が手に入るんやからやらん手はないやん。</p> - -<h2>状況を変えたい</h2> -<p>この状況をどうにか昔に戻せないものか。上に書いた以外にもいろいろな問題の根本には正座ができないことがあるように思う。ちょっと乱暴かな。然し正座が出来るだけで解決する問題は山ほどあると思う。</p> -<p>ではどうすれば日本人は再び正座できるようになるのだろう。最も根本的な解決策はやはり小学校から椅子を無くすことだと思う。我々は物心付いてよりこのかた、ひたすら正座をしない訓練を受けてきたと言えよう。そういえばなぜか幼稚園には椅子がなかった気がする。床で物を広げて遊んでいたような。記憶違いかな。他の解決策など無いと言ってもいいくらいかもしれない。</p> -<p>然しこれを実行するにはまず世間の意識を変える必要がある。そのためには今なら科学的根拠が便利か。科学っぽい根拠。正座して育った子供と正座せずに育った子供の将来の偏差値を適当にデータとして示せばいいだけなのでこの第一歩は割とすぐできるのかな。</p> -<p>あるいは寺子屋をやってそこでは正座させればいい。その後彼らの成長を追っていけばいい。何十年かやってメディアにでも取り上げられれば少しは正座を見直してくれそうなものである。</p> -<p>然し問題はここからかもしれない。良いことだと説得しても自分の生活に直結させる人があまりに少ないように思うからだ。樹木の重要性やコンクリートの有害性を言って納得してくれたように思っても、自分が掃除している庭はそれとは切りはなして考えるようである。その一方であまりにもメディアで大々的に取り上げられると、論理を一切考えずに全て受け入れてしまうようだ。マスクやワクチンの話である。と思っても、論理を無視してメディアを信じない人も居る。結局自分の信じたいことしか信じないというのはこういうことなのか。自分自身にこのような傾向があるのは実感していたが、僕の周囲の人達はどうも無意識のうちに情報を取捨選択しているようで、これでは自己反省もくそもできない。人のふりみてなんとかと人には言うが、自分自身には一切あてはめて考えないようなのだ。</p> -<p>正座が良いと言ってもきっと自分とは関係のない世界の話だと思って終わる可能性もある。現在でも棋士はずっと正座であり、その方が集中できるという話は聞くが、だからといって自分の生活に正座を取り入れる人は稀である。ではもっと大きく報道させて今のマスクのように流布すればいいのか。これは僕は嫌いである。ただ空気と同調圧力を形成するだけで、あらぬ方向に向かってしまう可能性も考えないといけない。やっぱり一番気分がいいのは自分自身で実行してその姿を世間に晒すことである。あとは世間が思い思いに判断して行動すればいいのだ。寺子屋で子供に正座をさせてその変化を観察するのがいいだろう。社会全体に変化があらわれるまで50年くらいかかるのかな。</p> diff --git a/man/journal/posts/20220814.html b/man/journal/posts/20220814.html @@ -1,9 +0,0 @@ -<h1>田舎の夏休み</h1> -<time>2022-08-14</time> -<p>西の空が赤く染まり始めた頃、田圃の中の畔道を寺に向かっていると、向こうから少年が歩いてきた。釣竿の先になにやらぷらぷらさせている。タウナギかなにかだった。</p> -<p> -「釣ったん?」<br> -「うん」<br> -「すげぇ」<br> -</p> -<p>田舎の夏休みはまだ生きているようだ。</p> diff --git a/man/journal/posts/20221023.html b/man/journal/posts/20221023.html @@ -1,33 +0,0 @@ -<h1>寺に適応できない</h1> -<time>2022-10-23</time> -<h2>これまで</h2> -<p>実家の菩提寺に入って出家した。坊主になってこの寺で生きていけないかと考えたのだ。ところが一年経った今でもこの寺に適応できていない。八月のお盆の間、住職は忙しくて朝のお勤めをしないので代わりにして欲しいと言われ、半月ばかり泊り込むことになった。ゆくゆく自分が住職に成ることを考え、これを機に半分寺に住み込もうと思い、お盆が済んでからもしばしば寺に泊まった。そうして八月はほぼ寺に居たのだが、その間寺に適応できずにどんどん自分の感情が萎れていった。とうとう適応障害と言えそうな状態にまでなり、九月と十月はほとんど実家に引き込もっている。どうしたものか。</p> - -<p>なにがそんなにしんどいのか。住職の奥さんと一緒に居るのがしんどい。この人が何を考えているのか分からない。僕の言ったこともその場では肯定しているように感じることが多いが、あまり理解していないようだ。やるべきことは自分で見付けろと言いながら、なにかしようとすると拒否される。生活の面でもいろいろと噛み合わない。柔軟剤がきつすぎてしんどくなった。食事の脂が多すぎてお腹を壊した。台所が汚なすぎて気持が悪い。</p> - -<h2>柔軟剤</h2> -<p>初めて寺に行って掃除を任された時から気になっていた。雑巾があまりにも臭いのだ。それも柔軟剤の臭いである。当時は実家から通っていたのだが、昼間寺の掃除をすると、家に帰ってからどんなに手を洗っても臭いが落ちないほどである。雑巾だけではなく寺にある布という布から悉く同じ柔軟剤の臭いがする。この臭いをいい臭いだという人の気が知れないのだが。</p> -<p>ある時檀家さんからもらった素麺をお裾分けしてもらったのだが、箱を包むビニールにも柔軟剤の臭いがこびりついていた。実家に持ち帰り後日湯掻いたのだが、素麺自体にも臭いがついていて食べられたものではなかった。他の家族も顔をしかめていた。勿体無いが全部廃棄した。</p> -<p>後で気付いたが、どうも寺中の埃から柔軟剤の臭いがするのだ。埃は布からでたものなので考えれば当たり前か。この埃が食品を保管している棚に積り、その中の素麺に臭いが移ったのだと思う。埃が臭うので寺中至る所その臭いである。</p> - -<h2>食事</h2> -<p>寺での食事は脂が多い。ささやかな生活をしていると本人達は思っているようだが、食卓にはやたら牛肉が並ぶ。脂ののった鮭も多い。奥さんは歯がほとんどないので肉も魚も脂の乗ったやわらかいものでないと噛めないのだ。数えていないので適当だが、3回に1回は鮭、5回に1回は牛で、どれも脂でとろとろの物である。僕が胃腸が弱く、特に脂っこいものが苦手ということもあるが、少なくともこれでささやかとはどうも言えないように思う。</p> -<p>ところである日豚の肉塊で焼豚を作ったのだが、茹で汁を冷蔵した上澄みの脂を炒め物に使おうと取っておいたのだが、それは食べたくないらしい。固形の脂は体内でも固まって健康に悪いというテレビの知識だそうだ。普段あんなに肉の脂を取っているのにそれは気にならないらしい。理屈はよく分からんがそれよりも今から作らんとしている野菜炒めを食べてくれるのかどうかが重要なのでそれを聞いた。返事は「しいては食べないけど。」というあいまいなものだった。食べないならサラダ油で作るか、別に一品追加しないといけないのだがどうかと聞き直すと、「しいては食べないけど。」という返事が再び返ってくるだけだった。これ以上聞くのも面倒なので、僕はせっかく取っておいた豚の脂を捨ててサラダ油で野菜を炒めた。これは他のことでも感じていたことだが、この人には自分というものが無いのか、あるいはそれがあっても表に出さないようである。別件ですこし口論になったことがあるので、感情がない訳ではないのだが。エドワードルトワックという米国の戦略家曰く、こちらの言うことを全部受け入れる国より、自分の立場をはっきりと言う国の方が同盟国として信頼できるそうだ。そんなのあたりまえじゃないですか。まる。住職の奥さんはどうやら自分の考えや感情を見せず、相手に全部任せる方が信頼関係を築けると思っているようだ。責任を全部こちらに押し付けているようにしか僕には見えないのだが。</p> - -<h2>台所が汚ない</h2> -<p>この寺はどこもかしこも物であふれかえっている。かろうじて法要に必要な本堂と控室はましだが、それでも不必要な物が多い。特に酷いのは台所である。おぞましい。寺の性質上貰い物が多いのはしかたがない。檀家さんにいろいろ貰ってそれをまた他の檀家さんに配るのだがそれでも余る。寺にいて消費するのは住職とその奥さんの二人だけであった。賞味期限がくるまでに食べきれないのはある意味仕方がないことでもある。本当は物を持ってくる檀家さんに寺の状況を話して少し持ってくる量を減らしてもらうべきだと思うのだが、奥さんはそうは考えない。檀家さんの気持をないがしろにできないからと、くれる物は断わらない。そして捨てる。これのどこがないがしろにしていないのかさっぱり理解できないが。ともかく現状は食べ物が多すぎるのだが、一番の問題は古い物を一向に捨てないことである。僕が寺に通い始めた頃は冷蔵庫がパンパンだった。しかも3台もである。二人暮しの家に小さくもない冷蔵庫が3台、悉く満杯だった。ある時台所にある冷蔵庫を上から下まで整理した。腐ったものを全部捨てた。奥からは2009年に賞味期限が切れたものなんかも出てきた。これは一番古い方だが、平均しても3年以上前のものだったと思う。ところで冷蔵庫の中からでてきたものは大体がスーパーなんかで奥さん自身が買ってきたもので、檀家さんから貰ったものはあまりなかった。檀家さんからの多すぎる貰い物に加え、自分でも異常に買い込むのだ。</p> -<p>この買い方もむちゃくちゃである。冷蔵庫の奥に抹茶が山程眠っていた。聞くとどれも自分で買ったものだと言う。お茶屋が友達なので行けば買わないと悪いとか、来客の為に新しい抹茶を用意したいとかで、無駄に多く買ってどれも処分しないのだ。ある日美味しくなさそうな出来合いのオムレツを買ってきた。どうやら本人も美味しくなさそうだと思いつつ買ったらしい。近くの個人経営の商店によく行くのだが、潰れては困るので欲しいものがなくても適当になにか買うのだそうだ。店の為に不要な物を買うのは良くないと思う。需要を歪めることになるからだ。大事な店ならむしろ自分が欲しい物を伝えて、要らない物は買わない方がいい。仕入れるかどうかは店の判断だろうが、客からも要望を伝えることで、その地域にとって必要な店になる可能性が高まるのではないか。不要なものでも買ってしまうと、結局好ましくない依存が生まれて返って店を潰すことになるか、そうでなくても地域に必要とされない店になるだろう。</p> -<p>冷蔵庫を一通り綺麗にしたその日の夕方、奥さんが大量の野菜と果物を仕入れてきた。流石に少し怒りが湧いた。そうでなくても奥さん自身、綺麗な冷蔵庫を喜んでいたので、再びちらかるようなことは避けようとも思い、そんなに大量に買ってこられるとまたぐちゃぐちゃになるだろうと小言を言っておいた。そんなに嫌味のつもりはなかったのだが。次の日も前日の野菜がたくさんあるにも関わらずまたいろいろ買ってきた。前日よりはさすがに少なかったが、同じように買いすぎだと思う旨を伝え、買ってきたものを何に使うのかひとつひとつ聞いてみた。すると見る見る顔が曇っていった。最後に、欲しいものを欲しい時に買って食べるのは自由だが、そのような買い物をするなら必ず冷蔵庫がぐちゃぐちゃになるから古い物はどんどん捨てていくことになるがそれでもいいのかと正すと、とうとう何も答えずにどこかに行ってしまった。その日の夕食はどうなったのか覚えていないが、多分普段通り食べたのだと思う。特に記憶にないということは、別にお通夜のようにはならなかったのだろう。次の日は朝から掃除に来ていた檀家さんとひと悶着あった。朝食の後になって奥さんがそのことで明らかに僕に対して敵意を剥き出しに、ああだこうだ言ってきた。内容はこまかくは覚えていないが、どうも檀家さんと僕とのやりとりと言うよりも前日のことについて攻めたてられたように思う。ひとつだけはっきり覚えているのは「論で言われると考えるのが面倒くさくなってしまう」という言葉だ。ではどうすればええねや。それから、檀家さんとのやりとりでは僕も良くない点があったのでそれを自分で分析するようなことを言うと、「自分で反省できて偉いわねぇ。」と言われた。こうも人の気持を逆撫でするようなことが言えるのかと思ったものだ。</p> -<p>調理器具も異常に多い。鍋もフライパンも同じような大きさのものがそれぞれ10個以上ある。使っていない調味料も置いたままである。冷蔵庫の他にもキッチンストッカーとか言ったか、間口が1m程度、奥行60cm程度、高さは2m近くあるような棚にびっしり保存食が詰っている。多分半分は賞味期限が切れている。この棚は台所の隣の4畳程の部屋にあるのだが、この部屋にはほかにも本棚のようなものが二つあってカップ麺やら乾物やらお菓子やらで埋まっている。足元にはダンボールに入った缶ジュースがあったり、使っていない家電があったり、変色した調味料のビンなんかもあったと思う。勝手に整理する訳にもいかず、整理を手伝っても冷蔵庫の時のようになりそうで、毎日一人の時間にただ眺めることしかできなかった。ある日疲れてぼーっとしているところを奥さんに見られたが、たまたま顔が食器棚に向いていたために、「物が多いと思ってるんでしょ。」と言われた。先方も僕がそこに居るだけで結構な心理的負担を感じているのだろうか。</p> - -<h2>檀家さんとの口論</h2> -<p>檀家さんの話が出たのでここに書いておく。</p> -<p>この檀家さんには以前、清澄寺という日蓮宗の聖地の森がコンクリートで覆われてたいへんだという話しをしていた。土をコンクリートにしてしまっては周囲の環境を著しく痛めてしまうという話である。このときは高田宏臣氏の本を持ち出して説明し、賛同してくれた。ある朝この檀家さんが境内の落葉を掃除している所に奥さんも居たので話しかけた。この時も高田さんの名前も出したように思うが、落葉を残して腐葉土にできないかとか、もっと境内に木を増やした方がいいのではないかなどと話すと、この檀家さんは落葉が積もると汚ないし、木が増えると虫が沸き、また管理も大変だからむしろコンクリートを増やすべきだと言った。前回コンクリートの話で同意してくれたのは何だったのか。</p> -<p>ところで話をしているとこの檀家さんの顔がみるみる曇り、最後にはとうとうまっくろけになってしまったのは怖かった。また、上で書いた自分の反省というのは、落葉を掃除している所に落葉を掃除しすぎるのは良くないのではないかという話を持ち掛けたことについてである。</p> - -<h2>物を捨てられない</h2> -<p>台所も汚いが、他の場所も物で溢れている。檀家さんに貰った物、檀家さんが作ってくれた物、自分で買った物。もちろん必要な物もあるだろうが、問題は奥さんも住職も不要だと思いながら捨てずにいる物である。檀家さんの気持を蔑ろにできないから捨てないというのはあまりにも問題である。結局それのせいで寺が汚なくなっては檀家さんの面目を返って潰しているのではないか。土地柄、檀家さんには漆器屋さんが多い。漆の盆は押入に積み上がっている。どこかの旅行のお土産といってでかい塗の囲炉裏をくれたが、これは部屋の隅に起きっぱなしで使ったためしがない。昔本堂で使う椅子がなく、急遽檀家さんが空き缶を束ねてダンボールかなにかと布で綺麗に包んだものが今も本堂の隅に出しっぱなしで、使っているのを見たことがない。二人暮しなのに大きな食器棚が6個くらいある。どれもぱんぱんに詰っている。昔は檀家さんがよく集って食事をしたそうだがそれでもなお余るほど多い。何十年も寺に通っている信者さんが、今でも来るたびに初めて見るカップが出てくるという。箪笥が多い。使っていないものもある。ひどいことに同じ箪笥を2個重ねて置いている。上にではなく、前後に2個重ねているのである。1個無駄じゃん!ねぇよ赤外線はよぉ。</p> -<p>寺というのは俗世間にはない空気を作るべき場所ではないのか。綺麗に片付けて掃除して、物で溢れた豊かなこの世界にあって、物質的ではない本当の豊かさを提示する場所でなくていいのだろうか。物質的な豊かさを賞賛するのであれば寺はもっと金儲けに走るべきであろう。そうしないのはそうではないものを世間に見せるためであろうに。</p> - -<h2>人格を感じられない人</h2> -<p>住職の奥さんにしても、上に書いた檀家さんにしても、本人が一体何を考え、感じているのか僕にはさっぱり掴めない。上に書いた檀家さんとのやりとりだけでなく、住職の奥さんも普段の会話では僕の考えに概ね賛同してくれる。始めは話の合う人なのかと思っていたがどうもそうではなかったらしい。この人達は自分に関係のない話に関してはその場の雰囲気や同調を重視して賛同しているような空気を作りだすが、自分に関係のある話しになると突然豹変して自らの利権を死守しようとするようである。僕はこの一年、このような人と付き合うことに疲れてしまったようである。僕はこのような人の感情を読むことができず、何を考えているのかも分からない。論理的に考えるのも無駄だった。僕はこの人達に一切の信頼を置くことができない。</p> diff --git a/man/journal/posts/20221031.html b/man/journal/posts/20221031.html @@ -1,5 +0,0 @@ -<h1>大阪駅にて</h1> -<time>2022-10-30</time> -<p>いつだったか、大阪駅から和歌山に帰るため、1番線にて関空・紀州路快速、関西空港・和歌山行を待っていた。この快速は関西空港行4両と和歌山行4両が連結して8両編成となっている。途中の日根野駅で切り離し、その後はそれぞれの目的地に向かう。僕は和歌山行の先頭車両に乗ろうと思い、白色三角印の4番に並んでいた。ところでこの快速に女性専用車はないのだが、環状線内を走る普通列車は4号車が女性専用である。自分の並んでいる所にもそのように書いていた。しばらくして僕の後ろにおじさんが一人並んだ。次にこのホームに来るのは普通列車である。この人も後で来る快速に乗るのかと思って気にしていなかった。</p> -<p>しばらくして普通列車が到着した。僕はこれには乗らないので横にずれて後ろの人達に道を開けた。列車が停止してドアが開くと、後ろのおじさんはそのまま女性専用車にすいこまれていった。声を掛けるべきか考えているうちに発車ベルが鳴り、おじさんは閉じ込められて行ってしまった。</p> -<p>ところで関空・紀州路快速のうち和歌山に行くのは後ろの4両、5号車から8号車である。僕が並んでいたのは和歌山行の先頭車ではなく関西空港行の最後尾だった。僕は足元の白色三角印4番をしばらく眺めた後、隣の5番に並びなおした。</p> diff --git a/man/journal/posts/20221228.html b/man/journal/posts/20221228.html @@ -1,17 +0,0 @@ -<h1>Holy Shit!</h1> -<p>最近見ているプログラマの配信者がよく言っている。\ -「Holy Shit!」\ -Holyは聖なる、Shitはうんこという意味である。\ -日本のプログラマもうんこという言葉を好むが、\ -海外でも同じようである。 -</p> -<p> -ところでこの言葉の訳語はなにがいいかと考えていると\ -思いがけずぴったりなものを思いついた:\ -</p> -<p> -「すめらうんこ」 -</p> -<p> -そうそれは、すめらみことの落しもの(droppings)。嗚呼不敬。 -</p> diff --git a/man/journal/posts/20230119.html b/man/journal/posts/20230119.html @@ -1,14 +0,0 @@ -<h1>寺を辞めた</h1> -<time>2023-01-19</time> -<p> -寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりが\ -できた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に\ -引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり\ -寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし\ -実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく\ -腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し\ -寺に置いていた物を回収した。\ -</p> -<p> -ふう。 -</p> diff --git a/man/journal/posts/20230725.html b/man/journal/posts/20230725.html @@ -1,37 +0,0 @@ -<h1>水道と空調</h1> -<time>2023-07-25</time> - -<h2>水道</h2> -<p> -水道が普及して井戸が使えなくなった。\ -水道があれば井戸から飲み水を汲む必要がない。\ -井戸から飲み水を汲まなくなれば井戸水が無くなっても、\ -あるいは汚染されても問題ない。\ -問題なければその通りになる。\ -水源を涵養するという考えが忘れられ、森がコンクリートで覆われた。\ -水が汚なくても良くなったので農薬や肥料を大量に使うようになった。\ -そして井戸は水位が下り、汚染された。\ -</p> -<p> -便利な水道が普及した為に、水道が無いと不便な世界になった。\ -不便というよりそれがないと生きるのもままならない。\ -現在我々はそのインフラの維持費と、災害時の脆弱性に悩まされている。\ -</p> -<h2>空調</h2> -<p> -空調が普及したら気温が高くなった。逆ではない。\ -空調があれば気温が高くなっても問題ない。\ -問題なければその通りになる。\ -街から植物が一掃されコンクリートとアスファルトで覆われた。\ -暑くても問題ないので経済優先で自動車の為の道路ばかり整備された。\ -そして街の気温は上った。\ -</p> -<p> -便利な空調が普及した為に、空調が無いと不便な世界になった。\ -不便というよりそれがないと生きるのもままならないようになりつつある。\ -</p> -<p> -そのうち空調の効率を上げるために、都市全体が大きなドームに覆われる。\ -ドームの外は50℃か60℃か。\ -このインフラもまた維持費と災害に対する脆弱性で我々を悩ませることになろうか。\ -</p> diff --git a/man/journal/posts/20230726.html b/man/journal/posts/20230726.html @@ -1,16 +0,0 @@ -<h1>GOPL読んだ</h1> -<time>2023-07-26</time> -<p> -Alan A. A. DonovanとBrian W. Kernighanの「The Go Programming Language」\ -を読了した。\ -読み初めた日付は記録していないが、演習問題用のgitリポジトリは、\ -今年の5月19日が最初のコミットである。\ -二ヶ月ちょっとかかった。\ -本文だけでなく演習問題も濃かった。\ -時間をかけて読む価値があると思う。\ -Kernighanの書いた本は英語が綺麗でいい。\ -</p> -<p> -アマゾンで英語の原著を買ったが、表紙の紙のコーティングみたいな\ -ビニールが剥れてきているのが残念。\ -</p> diff --git a/man/journal/posts/20230729.html b/man/journal/posts/20230729.html @@ -1,52 +0,0 @@ -<h1>無題</h1> -<time>2023-07-29</time> -<p> -最近持っている浴衣がどれもぼろぼろになってきた。\ -元々古いもらいものなうえ、着方も動き方もなってないので\ -着ているとすぐにどこか破れる。補修しながら使っていたが、\ -いよいよ布自体がすり切れてきた。\ -いい機会なので自分で仕立ててみようと思いたった。 -実は寺に居たころに白衣を作ろうと思い、晒の裁断と袖の縫いまでしていた。\ -ほったらかしになっていたこれを再開することにした。\ -</p> -<p> -腋縫いまでしていたこの着物に、今日はおくみを片方だけ付けた。\ -両方したかったが疲れたのでもう片方はまた今度。\ -色が付いていないただの晒だが、白衣など着る機会が無くなってしまったので、\ -袖と襟だけでも染めることにした。\ -家にころがっていたターナーの無臭柿渋を3倍に薄めて染めた。\ -本当は自分で育てた柿を使いたいが、そんん場所はないので買ってきた渋である。\ -柿渋は紫外線で硬化して定着するらしく、媒染剤は必要ないようである。\ -襦袢くらいには使えるだろうか。\ -</p> - -<p> -梅を塩に漬けているのを思いだしたのでこれを庭に干した。\ -県民の義務である。\ -そして今日は土曜である。\ -本当は自分で育てた梅を使いたいが、そんな場所はないので買ってきた梅である。\ -残った梅酢は生姜でも漬けようか。\ -</p> - -<p> -庭に植えた里芋から芽がでてきた。\ -大野芋というものであるが、僕が住んでいる場所とは関係がない。\ -既に大きな葉が付いていたのだが、セスジスズメという芋虫にやられて\ -禿げていた。四匹いたのだがある晩二匹減り、二日後にもう一匹、\ -そしていつのまにか最後の一匹が居なくなっていた。\ -なにかに食べられたのか。蛹は見ていない。\ -以前ニンジンの花がキアゲハにやられた時も、たくさん居た芋虫が一晩で\ -一匹も居なくなっていた。\ -ところで芋虫というのは見ているとなんだか美味しそうに見えてくる。\ -実際美味しいらしい<sup>[1]</sup>が。まだ食べる勇気はない。\ -</p> -<p> -この里芋は葉だけでなく茎を根本までかじられて切り株のようになっていたが、\ -その切り株の中心が少しづつ盛り上がってきている。\ -芋は強い。 -</p> - -<ul> -<li>[1]<a href="https://survivalnature.sakura.ne.jp/0000/11_mushi/imomushi/0000.html">イモムシ・ケムシ.サバイバル節約術</a></li> -</ul> - diff --git a/man/journal/posts/20230802.html b/man/journal/posts/20230802.html @@ -1,41 +0,0 @@ -<h1>着物できた</h1> -<time>2023-08-02</time> - -<p> -作っていた着物が完成した。\ -思っていたよりもずっと簡単だった。\ -細かいところを追求すれば職人技なのだろうが、\ -日常的に使うものを作るには素人でも十分である。\ -</p> - -<p> -初めは白衣のつもりで安物の晒をそのまま使って作り始めたが、\ -白衣を着ることが無くなってしまったので、袖と衿だけ柿渋で染めて\ -襦袢にすることにした。形は長着だが。\ -</p> - -<p> -完成後、右の衿がかなりずれて付いていることに気付いた。\ -このときは疲れからか不幸にもこのままでいいやと思っていたが、\ -見れば見るほど気になって、とうとうこの部分だけ付けなおすことにした。\ -そして完成したのがこれである。\ -</p> -<img src="20230802.jpg" alt="初めて自作した着物の写真" /> - -<p> -ほんのひと昔前までは着物を作る人などその辺にいくらでもいた。\ -世話になっていた寺の住職のお婆さんは和裁の先生だったそうだし、\ -僕の祖父母より少し若いお茶屋さんは、自分のお母さんが家族の着るものを\ -自分で作っていたという。\ -つまり僕の3、4世代前は着物を自作するのが当たり前だった。\ -ところがこの50年程の間にだれも作らなくなってしまった。\ -和服に限らず自分で作れば安上りなのに。\ -</p> - -<p> -なぜ自作しないのかと聞くと、きっと「そんな時間はない」\ -という答えが返ってくる。\ -金銭的にゆたかになって、自分で服を作る必要がなくなった。\ -のではなく、服を作るような時間的余裕のある人がいなくなったというのが\ -実情である。はて。\ -</p> diff --git a/man/journal/posts/20230803.html b/man/journal/posts/20230803.html @@ -1,70 +0,0 @@ -<h1>サマータイムレンダ読んだ</h1> -<time>2023-08-03</time> - -<p> -サマータイムレンダを読んだ。\ -弟が漫画を買ってリビングに置いて母や妹に読ませていた。\ -ある日なにげなくパラパラめくり始めたのだが、\ -気づけば全部読んでしまっていた。\ -13巻で完結するコンパクトな漫画である。\ -</p> - -<p> -話の内容はサスペンスとしては面白かった。\ -サスペンス自体を論評する知識はないが、少なくとも僕は\ -楽しめた。\ -話の構成とその展開が上手いのだと思う。\ -</p> - -<p> -ところが最後の方に来て少し残念な感じになった。\ -展開はそれまで通りのものに加え、クライマックスの勢いが付いているのだが、\ -黒幕の動機がどうもうすっぺらい。そんな幼稚なやつにふりまわされて\ -いたのかと思うと、話の展開が面白いだけになんとも空虚になる。\ -300年前に生まれた神職がそんなこと考えるのかも疑問である。\ -そして動機がただ利己的であるがゆえに、\ -悪役がどこから見てもただの悪役でしかない。\ -だからこそ結末はこの悪役を倒してめでたしめでたしとしかならない。\ -その上途中でおこった取り返しの付かないはずのことも、\ -結局うまいことひっくり返して何も失わずにハッピーエンドを迎えた。\ -これもあまり好みではなかった。\ -</p> -<p> -この辺に関して個人的には最近読んだ「風の谷のナウシカ」のコミックがよかった。\ -こちらには完全な悪がでてこない。敵であってもそれぞれなにかしらの事情があり、\ -それぞれの信念に基いて行動している。\ -だからこそ悪を殲滅して終りにはならないし、敵に勝ってもやるせない。\ -このすっきりしなさが物語に重層性を持たせているように思う。\ -さらに起ったことは事実として定着し、\ -覆ることがないというのも重要なテーマとしていたように思う。\ -どんな過去であっても今の自分たちの生命を以って未来を切り開くというものである。\ -題材も内容も全く違う作品なので比べてもしょうがないが。\ -</p> - -<p> -僕はそもそも死んで時間が戻るのは好きではない。\ -人生の一回性が無くなってしまうからだ。\ -しかしこの作品は死んで時間が戻るといっても、\ -一応完全には取り返しの付かないようになっている。\ -それもあって楽しめたのだが、\ -最後の最後で全部なかったことにしてしまったのは残念である。\ -</p> - -<p> -それから、時間が戻る際に主人公は意識が連続しているので、完全に同一人物と\ -いえるかもしれないが、その他の登場人物はどうなのか。\ -戻る前と戻った後では同じ意識の人間なのか。\ -主人公から見れば自分以外に主観は無いので、時間が戻っても以前と同じ\ -人間に見えるだろうが、しかしそれでいいなら本人もコピーされた影も\ -同じだということにならないだろうか。\ -この点について、どこかで問題提起されていたと思うが、\ -結局回収されずにおわった。\ -最後のハッピーエンドはあくまでも本人のみのものであり、\ -それまでに死んだ他の登場人物は結局そのままなのではないだろうか。\ -これもひとつの大きなテーマだと思っていただけに、どうも疑問が残る。\ -</p> - -<p> -最後に、「あっぽけ」って言ってる人は見たことがない。\ -「今日わは...」については大阪人の友達に言ってきょとんとされた経験がある。\ -</p> diff --git a/man/journal/posts/20230810.html b/man/journal/posts/20230810.html @@ -1,29 +0,0 @@ -<h1>イソヒヨ</h1> -<time>2023-08-10</time> - -<p> -最近イソヒヨが庭でよく遊んでいる。\ -昨日も来た。\ -部屋の窓からのぞきこんでも逃げない。\ -里芋が植わっているあたりでなにかしている。\ -突然里芋の方にとびかかったと思うと、\ -そのまま隣の家の物干しまで飛んでいった。\ -くちばしになにか太いものをくわえている。\ -少しくわえ直してそのままどこかに行ってしまった。\ -</p> - -<p> -里芋の葉には4、5日前からセスジスズメがいた。\ -昨日の朝見たときはだいぶ太って目玉模様もはっきりしていた。\ -元気に里芋を食いちらかしていた。\ -イソヒヨが飛んでいった後確認するも姿が見えない。\ -くわえていたのはセスジスズメだったのか。\ -</p> - -<p> -少し前にも里芋にセスジスズメがついていたが、\ -気づいたら一匹もいなくなった。\ -その前にはニンジンについたキアゲハが一晩で\ -いなくなった。\ -犯人はこいつか。\ -</p> diff --git a/man/journal/posts/20240428.html b/man/journal/posts/20240428.html @@ -1,15 +0,0 @@ -<h1>きのかわ弦楽合奏団第7回定期演奏会</h1> -<time>2024-04-28</time> - -<p>\ -先日きのかわ弦楽合奏団というアマチュアの団体に入団しました。\ -その定期演奏会が7月にあります。\ -多分出演します。\ -</p> - -<figure> -<img src="7th_concert.jpeg" alt="きのかわ弦楽合奏団の第七回定期演奏会のポスター。7月14日14:00から、\ -かつらぎ総合文化会館、あじさいホールにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figcaption> -</figure> - diff --git a/man/journal/posts/20241009.html b/man/journal/posts/20241009.html @@ -1,68 +0,0 @@ -<h1>棚作った</h1> -<time></time> - -<p> -自室のクローゼットが使いにくかったので引っ剥がして新しいのを作った。\ -収納していたのはほとんど本だったのだが、奥行きが深いのに棚板が少ないので\ -前後に並べて置いていたため、どこになんの本があるのか見にくく、取り出しにくかった。\ -あとパソコン置き場としても使っていたが、24インチのモニターが一枚ギリギリ入る程度の\ -幅しかなかったのでこれも拡張したかった。\ -久しぶりに木工もしたかったので木材を買って自作した。\ -杉を基本に、パソコンを置く場所だけ檜にした。\ -<p> - -<figure> -<img src="20241009-1.jpg" alt="クローゼット跡地と買った木材"> -<figcaption>クローゼット跡地と買った木材</figcaption> -</figure> - -<figure> -<img src="20241009-2.jpg" alt="パソコン机の部分"> -<figcaption>パソコン机の部分</figcaption> -</figure> - -<p> -パソコン机の天板は白木のままでは寂しいので亜麻仁油を塗って\ -オイルフィニッシュにしてみた。\ -結構黄色が濃くなった。\ -</p> - -<figure> -<img src="20241009-3.jpg" alt="机のオイルフィニッシュ"> -<figcaption>机のオイルフィニッシュ。下においているのが白木のもの</figcaption> -</figure> - -<p> -せっかくやるならと思って蟻を切ってみた。\ -適当でも案外ガッチリはまるものである。\ -英語ではdovetailというそうだ。鳩のしっぽという意味である。\ -日本語の蟻よりも鳩のしっぽのほうがしっくりくる気がする。\ -</p> - -<figure> -<img src="20241009-4.jpg" alt="蟻"> -<figcaption>蟻</figcaption> -</figure> - -<p> -上に本棚をつけて完成。\ -本棚は棚を移動しやすいようにと思い、ネジ止め式の棚受けを買った。\ -めんどくさくなったわけではない。\ -左下においているのはもとのクローゼットにあった引き出しである。\ -</p> - -<figure> -<img src="20241009-5.jpg" alt="完成"> -<figcaption>完成</figcaption> -</figure> - -<p> -これを作るにあたり、大阪日本橋の刃物屋で鉋を買ってきた。\ -これまではホームセンターで1000円ほどのものだったが、\ -今回買ったのは8000円の物である。\ -店主が台の仕込みと研ぎをした上で売ってくれた。\ -きれいに切れるので小口面の直角を出すのが楽しくなった。\ -小口を下にして自立するようになったときは結構気持ちいい。\ -専門店での買い物は楽しい。餅は餅屋である。\ -</p> - diff --git a/man/journal/posts/20241202.html b/man/journal/posts/20241202.html @@ -1,71 +0,0 @@ -<h1>椅子作った</h1> -<time>2024-12-02</time> - -<p> -チェロを弾くのに使っていた椅子ががたがたになってきたので、\ -新しい椅子を作った。\ -座面の張り方はYouTubeの動画[1]を参考にした。\ -</p> -<p> -まず木枠を作る。\ -足にホゾ穴を彫って梁を差し込む形にした。\ -「そぎ先枘接ぎ」という名前らしい[2]。\ -</p> -<img src="20241202-1.jpg" alt="木枠の画像"> - -<p> -足は猫足にした。\ -ボンドで接着してバネを受ける板を付ける。\ -本当は膠にしたかったけどめんどくさくなった。\ -</p> -<img src="20241202-2.jpg" alt="ボンドで固定した木枠の画像"> - -<p> -バネを又釘で固定。 -</p> -<img src="20241202-3.jpg" alt="バネを木枠に釘で固定した画像"> -<img src="20241202-4.jpg" alt="固定した部分を拡大した画像"> - -<p> -ずれないように麻紐でくくり麻布を被せる。\ -さらに麻布にバネを縫い付ける。\ -</p> -<img src="20241202-5.jpg" alt="バネを麻紐でくくった画像"> -<img src="20241202-6.jpg" alt="バネを麻布で覆った画像"> -<img src="20241202-7.jpg" alt="麻布を固定した部分の拡大画像"> -<img src="20241202-8.jpg" alt="バネを麻布に縫い付けた画像"> - -<p> -藁で土手を作る。この藁はチェロの先生に貰ったものである。\ -晒で覆ったうえ、糸で縫って固める。 -</p> -<img src="20241202-9.jpg" alt="藁の土手の画像"> -<img src="20241202-10.jpg" alt="藁の土手を糸で縫った画像"> -<img src="20241202-11.jpg" alt="縫った部分の拡大画像"> - -<p> -棕櫚を盛って布で覆い、綿を被せてモケットで仕上げる。\ -本来は棕櫚ではなく芝であるが手に入らなかった。\ -棕櫚の産地に住んでいるのでこちらなら山にいくらでも生えている。\ -モケットは高野口町で買った。\ -この町は鉄道のシートも作っているらしい。\ -283系や287系、あるいはN700系等のものが欲しかったがJRに怒られるからと断わられた。\ -そらそうや。\ -</p> -<img src="20241202-12.jpg" alt="棕櫚を盛って布で覆った画像"> -<img src="20241202-13.jpg" alt="布の上から綿を被せた画像"> - -<p> -完成。 -</p> -<img src="20241202-14.jpg" alt="モケットを被せて完成した椅子の画像"> - -<p> -椅子が良くなっても練習しないと腕は上がらない。 -</p> - -<h2>参考</h2> -<ol> -<li><a href="https://www.youtube.com/watch?v=15SjxP-wcek">TOKYO 匠の技(椅子張り 熟練技能編)</a></li> -<li>鳥海義之助 「図解 木工の継手と仕口 増補版」 p.37</li> -</ol> diff --git a/man/journal/posts/20241211.html b/man/journal/posts/20241211.html @@ -1,9 +0,0 @@ -<h1>きのかわ弦楽合奏団 第5回コミュニティコンサート</h1> -<time>2024-12-11</time> -<p>来年の一月にコンサートあります。</p> -<figure> -<img src="20241211.jpg" alt="きのかわ弦楽合奏団の第5回コミュニティコンサートのちらし。\ -令和7年1月12日14:00から、和歌山北コミュニティセンターにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - diff --git a/man/journal/posts/20250216.html b/man/journal/posts/20250216.html @@ -1,11 +0,0 @@ -<h1>きのかわ弦楽合奏団 さくらコンサート</h1> -<time>2025-02-16</time> -<p>三月にコンサートあります。</p> -<figure> -<img src="20250216-1.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの表面。\ -令和7年3月23日14:00から、旧和歌山県議会議事堂にて"> -<img src="20250216-2.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの裏面。\ -楽団と会場の紹介"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - diff --git a/man/journal/posts/20250221.html b/man/journal/posts/20250221.html @@ -1,33 +0,0 @@ -<h1>着物作った</h1> -<time>2025-02-21</time> -<p> -普段着回している着物がへたってきたので新しいのを仕立てた。\ -楽天で見付けた真綿紬の草木染めである。\ -中古で2640円だった。\ -新品だとおそらく何十万のしろものである。\ -女物だったので解いて洗濯し、男物に仕立て直した。\ -防虫剤の臭いがひどかったが、洗濯すればおおむね取れた。\ -</p> - -<p> -解いた布を重ねてネットに入れ、普通に洗濯する。\ -脱水が済んだら濡れた状態でアイロンをかけてしわをとり陰干しする。\ -絹ものだがこれで特に問題なく洗濯できた。\ -</p> - -<p> -裏地も一緒に洗濯した。\ -これも多分羽二重の高価なものである。\ -ただ袷にするのは面倒なので一重にした。\ -袖付けがなかなか上手くいかずに人形のところが皺になる。\ -居敷当ては箪笥に眠っていた唐草模様の風呂敷を使った。\ -</p> - -<figure> -<img src="20250221.jpg" alt="作った着物"> -</figure> - -<p> -真綿紬は初めてだが、軽くて暖かい。\ -ほどかずに洗濯してよれよれにならなければいいのだが...\ -</p> diff --git a/man/journal/posts/20250420.html b/man/journal/posts/20250420.html @@ -1,173 +0,0 @@ -<h1>大阪万博行った</h1> -<time>2025-04-20</time> - -<p>\ -4月15日火曜日に大阪万博に行ってきた。 -</p> - -<p>\ -朝の紀州路快速は高校生ばかりだった。\ -大阪に近付くにつれてビジネスマンが多くなっていった。\ -西九条から地下鉄に乗りかえるとEXPO staffの札を首から下げた\ -外国人がたくさんいた。\ -外国人ばかりなのになぜかみんなスマホを見たり、\ -目が合ってもなんとなく外を向いたりと、雰囲気だけが日本なのが面白い。\ -</p> - -<p> -会場には予約より少し早く着いた。\ -荷物検査があるので結構時間がかかり、入れたのは予約より30分ほど過ぎたころだった。\ -</p> -<figure> -<img src="20250420-1.jpg" alt="東ゲート"> -<figcaption>東ゲート</figcaption> -</figure> -<figure> -<img src="20250420-2.jpg" alt="リング"> -<figcaption>リング</figcaption> -</figure> - -<p>\ -会場内はところどころ植え込みがあって雑草も生えてきていた。\ -タンポポは全部セイヨウだった。\ -中央付近に静けさの森という場所があるが、そんなに森にはなっていない。\ -どうせなら明治神宮みたいなのを作ればよかったかと思う。\ -IR会場になった後も公園にできるし。 -</p> -<figure> -<img src="20250420-3.jpg" alt="セイヨウタンポポ"> -<figcaption>セイヨウタンポポ</figcaption> -</figure> -<figure> -<img src="20250420-4.jpg" alt="ノゲシ"> -<figcaption>ノゲシ</figcaption> -</figure> -<figure> -<img src="20250420-5.jpg" alt="バラ科のなにか"> -<figcaption>バラ科のなにか</figcaption> -</figure> -<figure> -<img src="20250420-6.jpg" alt="ノボロギク"> -<figcaption>ノボロギク</figcaption> -</figure> -<figure> -<img src="20250420-7.jpg" alt="ノアザミ"> -<figcaption>ノアザミ</figcaption> -</figure> -<figure> -<img src="20250420-8.jpg" alt="タネツケバナ"> -<figcaption>タネツケバナ</figcaption> -</figure> -<figure> -<img src="20250420-9.jpg" alt="ヨモギ"> -<figcaption>ヨモギ</figcaption> -</figure> - -<p>\ -11時に英国パビリオンを予約していたのだが着いてみるとシステムエラーで\ -閉鎖されていた。\ -レストランは開いていたので混む前になにか食べることにした。\ -英国人と会話できると思っていたが案内してくれたのは片言の英語を喋る\ -アジア人のおばちゃんだった。\ -2個で9ポンドのアイスクリームは売ってなかった。\ -フィッシュアンドチップスと紅茶を頼んだ。\ -出された紅茶にはミルクが付いていなかった?!\ -フィッシュアンドチップスの方は思っていたよりは美味しかった。\ -味のしない鱈だったが鮮度は良く、衣もさくさくだった。\ -油もそこまで古くなっていない。\ -チップスの方はモスバーガーよりイモの味が薄かった。\ -タルタルソースと緑のペーストが付いていた。\ -緑のものは多分エンドウ豆を潰したものにミントで香りを付けていた。\ -悪くはなかったが組合せが初めてだったせいか、\ -ミントが目立ちすぎていたように思う。\ -</p> -<figure> -<img src="20250420-10.jpg" alt="フィッシュアンドチップス"> -<figcaption>フィッシュアンドチップス</figcaption> -</figure> - -<p>\ -英国パビリオンが復旧するまで他を周ることにした。\ -オーストリアに行ってみたが列が一杯だから時間をおいて来るように言われた。\ -</p> - -<p>\ -大根が咲いていた。 -</p> -<figure> -<img src="20250420-11.jpg" alt="ハマダイコン"> -<figcaption>ハマダイコン</figcaption> -</figure> - -<p>\ -二つほど空いてる所を見たがあんまり面白くなかった。\ -</p> - -<p>\ -英国に戻ってみると復旧していたので入ることにした。\ -前に英国人の親子が並んでいた。\ -母親が高校生くらいの息子にハグして日本語で「トテモカワイイデス」\ -と言っていた。\ -突然日本語が聞こえてくるとどうしても見てしまう。\ -目が合った。\ -その後もなぜかちらほら日本語が聞こえてきては目が合った。\ -しばらくして父親の方が息子の鞄からチョコ棒を出して母親と息子に配った。\ -自分の分を取ったあとなぜかさらにもう一本取り出してこっちに差し出してきた。\ -話し掛けたいなあと思っていた所だったので受け取ってお礼を言って何を話そうかと\ -考えていたのだが、パビリオンの扉が開いて3人は吸い込まれていった。\ -パビリオンは20人程度のグループで周るようになっていたのだが、\ -丁度僕の前で区切られてしまったのだ。\ -</p> -<figure> -<img src="20250420-12.jpg" alt="英国人がくれたチョコ棒"> -<figcaption>英国人がくれたチョコ棒</figcaption> -</figure> - -<p>\ -展示は特に面白くなかった。\ -特定の医薬品会社がお金を出していそうなことは分った。 -</p> - -<p>\ -パビリオンの中にバーがあった。ビールでも飲みたかったが外が寒すぎて\ -冷えていたのであきらめた。 -</p> - -<p>\ -その後は特に予定もなかったので散歩していたらルーマニアパビリオンを見つけた。\ -チェロの先生がルーマニアで修行してきた人なので行ってみたかったのだが、\ -予約のフォームで見つからなかったので来ていないものだと思っていた。\ -予約できないだけみたいだ。\ -</p> - -<p>\ -30分ほど並んだ。\ -入口に居たお姉さんがめっちゃ綺麗だった。\ -展示は生演奏と伝統工芸の展示、実演だった。\ -演奏は僕が行ったときはバイオリンだけだったが、椅子と譜面台が4つと\ -ピアノもあったので時間によって編成が変わるようだった。\ -伝統工芸の展示のひとつに、ガラスに描かれた宗教画があった。\ -ビザンツからの伝統だと言っていたと思う。\ -絵の具が置いてあったので描かせてもらった。\ -マリアがキリストを抱いている画を模写した。\ -描きながらルーマニアのことを色々教えてもらえたのがとても良かった。\ -女の人が全員綺麗だった。さすが東欧である。\ -レストランもあったが残念ながら閉まっていて食べられなかった。\ -</p> - -<p>\ -最後に知りあったルーマニア人とその辺をぶらぶらして帰ってきた。\ -</p> -<figure> -<img src="20250420-13.jpg" alt="知り合ったルーマニア人"> -<figcaption>知り合ったルーマニア人</figcaption> -</figure> - -<p>\ -パビリオンの展示は総じていまいちである。\ -今回行った海外のパビリオンには特に未来っぽいものはなにもなかった。\ -これはある意味期待通りだった。\ -一方でルーマニアでは現地の文化も見れたし現地人との交流もできたのでよかった。\ -他のパビリオンでもこういう交流があればいいのにと思う。\ -国内企業のパビリオンに行けていないので次回はその辺を見たい。\ -</p> diff --git a/man/journal/posts/20250519.html b/man/journal/posts/20250519.html @@ -1,249 +0,0 @@ -<h1>万博で知り合ったルーマニア人とハイキングに行った</h1> -<time>2025-05-19</time> - -<p> -先日万博のルーマニアパビリオンで知り合ったルーマニア人の<a href="https://noian.art">Noian</a>が\ -ハイキングに行きたいというので、地元の山に連れていった。\ -元々4月の終わりごろを予定していたが、僕が風邪をひいてしまいのびていた。\ -向こうも万博の仕事が忙しいようで、帰国の前日になってやっと予定が合った。\ -</p> - -<p> -10時過ぎにうちの最寄り駅に着く予定だったが、電車に乗り間違えたらしく一時間程遅れた。\ -なにせ阪和線である。外国人にはかなりややこしい。\ -そのうえ駅員はフランス人のごとく英語を話さない。\ -間違って関空に行かないようにしつこく注意喚起して、なんとか和歌山に辿りついた。\ -</p> - -<p> -車で自宅まで連れて来て、そこから徒歩で山に向かった。\ -自然が好きそうだったので、ろくに整備されていないひとけのない山に案内した。\ -</p> - -<p> -この山に登るのは久しぶりなので道を覚えているか不安だった。\ -おそらく昔の人が隣の町まで行くのに使っていた道だと思う。\ -今でも一応隣町まで抜けられる。\ -入口は果樹園になっていて今も柑橘の木がたくさん植わっている。\ -川沿いを森に入ると左右には棚田が並んでいる。\ -こちらの田んぼは既に放棄され、今は藪や針葉樹林になっている。\ -針葉樹の方は戦後の拡大造林で植えられたものだろうか、\ -毎年ティッシュペーパーの需要を底上げしている木々である。\ -棚田は石垣で造成されている。\ -いつのものかは知らないが今も崩れずに残っている。\ -</p> - -<p> -棚田の横をさらに進むと小さい滝がある。\ -牝牛の滝というらしい。\ -牝牛と書いてコッテと読む。\ -滝の近くに牝牛に見える岩があるのが由来らしい。\ -コッテという言葉は聞き馴染みがない。\ -後日祖父の友人に聞いた話だと、小さい牛やメスの牛のことを\ -コッテウシと言ったそうだ。\ -</p> - -<figure> -<img src="20250519-1.jpg" alt="牝牛の滝"> -<figcaption><ruby>牝牛<rp>(</rp><rt>コッテ</rt><rp>)</rp></ruby>の滝</figcaption> -</figure> - -<p> -滝を過ぎると急勾配の斜面が続く。\ -ほとんど道とはいえないような山肌を登る。\ -40度はありそうな勾配である。\ -息があがりながらも、彼は日本に来たがっている友人のことを聞かせてくれた。\ -日本のとあるバンドの大ファンなのだそうだ。\ -ポップカルチャーにはうといので自国のことなのになにも分からなかった。\ -最後に大きな岩が作った崖を山羊のように登ればやっと平坦な道に出る。\ -彼のブーツがよく滑っていた。\ -裸足が一番安全だと勧めたが遠慮しとくと言われた。\ -そこから先は特にきつい場所もなく、そのまま展望台に続く。\ -彼は少し疲れたようで言葉が少なくなっていた。\ -</p> - -<figure> -<img src="20250519-2.jpg" alt="展望台から"> -<figcaption>展望台から</figcaption> -</figure> - -<p> -展望台からは僕の町が一望できる。\ -西が海で南北が山、\ -東はゆるがかな坂が高野山まで続いている。\ -彼の出身地も山がちで似た地形だそうだ。\ -海はないが毎年父親が黒海まで連れていってくれていたので\ -馴染深いといっていた。\ -展望台には小さな祠がある。\ -せっかくなので鳥居のくぐり方や参拝の仕方を教えてあげた。\ -熱心に聞いてはくれたが自分はやらないと言っていた。\ -理由は聞かなかったがおそらく彼がキリスト教徒だからであろう。\ -こういうはっきりした態度は見ていてなんとなく気持がいい。\ -</p> - -<p> -ところで日本では神道でも仏教でも左進右退が基本だと思う。\ -以前五瀬命が祀られている竃山神社のお祭に行ったことがある。\ -そこでは巫女さんが神殿に向う階段を登る際左足を一段上げて右足を引き寄せてを繰り返して登り、\ -下るときは逆にしていた。\ -お寺でも道場に入るときは左から、出るときは右からと習った。\ -そういえば合気道でも座礼をするとき左手、右手の順で床に付けて頭を下げ、\ -頭を上げるときは右手から戻すと習った気がする(この記憶はあいまい)。\ -ところがヨーロッパでは逆らしい。\ -左は邪悪だから右から入るのだそうだ。\ -</p> - -<p> -下りは別の道を選んだ。\ -途中からコンクリートで舗装されている楽な道である。\ -途中で山菜がいろいろ生えていたので紹介してあげたらぱくぱく食べていた。\ -よく信用できるものである。\ -イタドリ、ユキノシタ、フキ、チャノキ、タラノキ...。\ -タケノコはもう竹だった。\ -クスノキもあったのでいい香りがすると言って渡したらこれもかじっていた。\ -クスノキが食べられるかどうか僕は知らない。\ -防虫剤に使われていたと伝えるとすぐに吐きだして水で口をすすいでた。\ -</p> - -<p> -展望台でフルートを吹く動画を撮りたかったのに忘れていたといっていたが、\ -途中で見つけた竹林を気に入ったようで、そこで吹いていた。\ -このフルートはチューニングが現代の一般的なものとは違い、\ -ミの音が少し低くなっている。\ -長調とも短調ともいえない微妙な音階だった。\ -</p> - -<figure> -<img src="20250519-3.jpg" alt="フルートを吹くNoian"> -<figcaption>フルートを吹くNoian</figcaption> -</figure> - -<p> -ルーマニアに竹は自生していない。\ -ところが和食屋等には植わっているという。\ -ルーマニアの植生だいじょうぶかなぁ。\ -</p> - -<p> -山から家に帰ってきたらもう15時になろうとしていた。\ -昼ごはんは食べてない。\ -車で和歌山市の寿司屋に向った。\ -弥一という回転寿司である。\ -回転寿司だが安いわけではなく、味はかなり美味しい。\ -</p> - -<p> -中途半端な時間に行ったからか、寿司はひとつも回っておらず、\ -タブレットから注文するように言われた。\ -おなかがすいたから寿司以外のものも食べるといって、彼は最初にうどんを注文した。\ -僕も自分の食べたいものを適当に注文していた。\ -しばらくして納豆うずらが届いた。\ -僕は頼んでいない。\ -彼は納豆が好きだそうだ。\ -ルーマニアにも臭いの強い発酵食品があるのかと思い、チーズの話をしてみた。\ -ルーマニアには臭いチーズはないと言う。\ -ゴルゴンゾーラやカマンベールはないのかと聞くと、あんなのは臭いうちにはいらないそうだ。\ -ちなみに国でよく食べられるのはカビの生えていないクリームチーズのようなものだそうだ。\ -</p> - -<p> -ひととおり食べておなかがいっぱいになってきた。\ -彼もおなかがいっぱいになってきたと言いだした。\ -彼のうどんにはまだ手が付けられていない。\ -テーブルにはまだ寿司が残っている。\ -無理なら僕が食べようかと言うと彼はうどんの鉢をこっちによこした。\ -ちょっとくるしかったがまあうどんなので食べれた。\ -麺は腰があっておいしいが、出汁は少し甘みが強かった。\ -出汁を飲みほした頃、彼も残った寿司をだいたい片付けて、\ -やっぱり自分もうどんを食べるといって追加で注文した。\ -</p> - -<p> -うどんの甘みをガリで消して店を出た。\ -おごってくれた。\ -</p> - -<p> -弥一を後にし、和歌山城に案内した。\ -和歌山城にはなぜか小さな動物園が付いている。\ -時間がなかったので適当に見て天守閣に登った。\ -地元の人間なのに天守閣はこれが初めてである。\ -閉館ぎりぎりに行って30分しか見れなかった。\ -天守閣は米軍に丸焼きにされたあと鉄筋コンクリート造りで再建された物である。\ -外観はそれっぽいが内部は昭和の団地のような近代的なものだった。\ -書画や武器等が展示されていてそれなりに見応えがあり、30分では足りなかった。\ -彼は中国語が話せるので漢字も結構読める。\ -僕が流し見した巻物を熱心に読んでいた。\ -</p> - -<p> -和歌山城を出た後は寺か神社が見たいというので日前宮に行った。\ -既に閉まっていて入れなかった。\ -こんな時間に閉まっては会社帰りに立ち寄れないのではと言われた。\ -ルーマニアではサラリーマンが帰りに教会に行くのが普通なのだろうか。\ -</p> - -<p> -カフェにでも行って話しをしようということになった。\ -いい喫茶店は知らないので和歌山市駅のスタバに行くことにした。\ -駅ビルには確か日本酒のお店もあったのでそこで黒牛か超久でも買わせようと思った。\ -ところが着いてみると平和酒造の店だった。\ -この酒蔵はあまり好きではないので入らずに直接スタバに行った。\ -スタバではどういう流れだったか、国境の話になった。\ -昔は国という概念も国民という枠組みもなかったのに、\ -いつしか作られて国境ができたという。\ -ヨーロッパの世界はかつて神が治めていたが、\ -あるときから貴族がその役割を担い、\ -貴族が没落してからは民衆をまとめるために民族や国家というストーリーが必要になったという。\ -そういえばゲルマン民族というのもナチスがドイツをまとめるために作った概念だと\ -どこかで読んだ気がするが本当なのだろうか。\ -日本は海に囲まれているのでヨーロッパと少し状況が違うんじゃないかという話を出してみた。\ -言語も民族も一つで天然の国境があるのはヨーロッパ人から見るとちょっと変なのかな。\ -そのくせ昔から文化的には国際色豊かだと言われた。\ -</p> - -<p> -辺りがすっかり暗くなったころスタバを出て少しそのへんを散歩した。\ -駅の周辺は全然土地勘がなかったが紀の川があるのは知っていたので\ -そっちに向かって適当に歩いた。\ -日本語の練習をしたいので日本語で話して欲しいと言われた。\ -僕の言葉は結構理解できていたようだし、向うも割と話せていた。\ -多少ゆっくり話すようにはしたがそれでもたいしたものである。\ -ところで外国人相手に母語を話すと普段どれだけ自分がいい加減に話しているかがよく分かる。\ -発音や文法を間違えないように意識するととたんに言葉に詰まるのだ。\ -</p> - -<p> -人生で英語をしっかり話したのはこれが初めてである。\ -彼と話していて思ったが、話したいことがあれば文章を組みたてる前に\ -話しはじめたほうがいい。\ -相手の話を理解したうえでなにか言いたげなことは伝わるし、\ -そのあとは身振り手振りでも案外なんとかなる。\ -外国人と話すのに外国語に関する知識はある程度必要だが、\ -相手の話したいことに興味を持つのも重要である。\ -</p> - -<p> -河原では日本の山に危険な動物はいるのかという話になった。\ -熊や毒蛇、スズメバチなんかが怖いと言った。\ -このあたりで熊を見たことはないけど。\ -それから彼がどうやって英語を流暢に話せるようになったのかも教えてくれた。\ -英語でゲームをしていたら英語が第二の母語のようになったそうだ。\ -ルーマニア語はマイナーな言語なのでゲームは翻訳されないらしい。\ -僕も流暢ではないにしても何とか意思疎通できるようになったのは、\ -英語でコンピューターの勉強をしたからだと思う。\ -英語を勉強するより、英語を使ってなにかをすると、すぐ覚えるし忘れにくい。\ -最後に二宮金次郎の像に集まった猫を眺めて駅に戻った。\ -</p> - -<p> -彼は明日の22時台の飛行機でイスタンブールを経由して国に帰る。\ -イスタンブールまで12時間、乗り換えに3時間、そこからルーマニアまで1時間半、\ -国に着いてからさらに12時間バスに乗る。\ -なかなか遠いところである。\ -国内線もあると言っていたが、日本でお金を使いすぎたから節約したいらしい。\ -</p> - -<p> -彼は20:30発の特急サザンに乗って大阪のホテルに帰っていった。\ -</p> diff --git a/man/journal/posts/20251122.html b/man/journal/posts/20251122.html @@ -1,18 +0,0 @@ -<h1>ひざしぶりに合気道した</h1> -<time>2025-11-22</time> - -<p> -大学の合気道部のひとつ下の後輩に誘われて学園祭の演武会に参加してきた。\ -</p> -<figure> - <video controls style="max-width: 100%;"> - <source src="20251122.mp4" type="video/mp4"> - </video> - <figcaption>京都大学合気道部 NF演武会にて(右が僕)</figcaption> -</figure> - -<p> -もうちょっとやりたくなったので高校生のときお世話になっていた地元の\ -道場に電話して稽古させてもらうことにした。\ -続くかな。 -</p> diff --git a/man/kitchen/index.html b/man/kitchen/index.html @@ -1,13 +0,0 @@ -<h1>台所</h1> - -<h2>記事</h2> -<ul> - <li><a href="r4_osechi.html">令和4年正月のおせち</a></li> -</ul> - -<h2>レシピ</h2> -<ul> - <li><a href="recipe/mapo_tofu.html">麻婆豆腐</a></li> - <li><a href="recipe/miso.html">味噌</a></li> - <li><a href="recipe/tonkotsu_ramen.html">豚骨ラーメン</a></li> -</ul> diff --git a/man/kitchen/r4_osechi.html b/man/kitchen/r4_osechi.html @@ -1,121 +0,0 @@ -<h1>令和4年正月のおせち料理</h1> -<time>2022-02-04</time> -<p>令和3年の春ごろからだったか、実家の台所に立つようになった。おせちは毎年買っていたがせっかくなので今回は自分で作ることにした。といってもうちには代々受け継がれてきたおせちはないので本やらインターネットやらで調べながらのものである。近代化によって失われたものは大きい。</p> - -<p>今回おせちに入れたものは以下の通り:</p> -<ul> - <li>慈姑</li> - <li>百合根</li> - <li>鶏そぼろ松風</li> - <li>生麩の田楽</li> - <li>炊き合わせ</li> - <li>栗金団</li> - <li>数の子</li> - <li>田作り</li> - <li>伊達巻</li> - <li>酢蓮根</li> - <li>たたき牛蒡</li> - <li>みつわ漬け</li> - <li>金柑の蜜煮</li> - <li>鱈の西京焼</li> - <li>蒲鉾</li> - <li>牛蒡巻き</li> - <li>干し柿チーズ</li> - <li>黒豆。</li> -</ul> -<figure> - <img src="pics/r4_osechi.jpg" alt="令和4年正月のおせちの画像"> - <figcaption>令和4年正月のおせち</figcaption> -</figure> - -<h2>作り方</h2> -<div class="recipe"> -<h3>慈姑</h3> -<p>おしりを切って皮を剥き出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>百合根</h3> -<p>一枚づつ剥いて出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>鶏そぼろ松風</h3> -<p>鶏1Kg、魚2Kg、出汁3合、醤油70cc、味醂50cc</p> -<p>鶏のミンチを醤油と味醂で炒める。白身魚のすり身を昆布出汁、醤油、味醂で味付けし、炒めた鶏そぼろを加え型に流して蒸す。切り出して天火で乾かすように焼き、煮切り味醂を塗ってケシの実をまぶす。</p> -<p>出典: [平井、結野、日本料理店のお弁当]</p> -</div> - -<div class="recipe"> -<h3>生麩の田楽</h3> -<p>強力粉300g、水150gを捏ねる(水はもう少し多い方がいいかも)。一時間寝かせる。水で揉み洗いして澱粉を流す。白玉粉、水を混ぜて捏ねる。形成して一時間寝かせる。茹でる。浮いてからさらに5分程茹でる。切って味噌を塗り、焼く。</p> -<p>白玉粉と水の分量をメモしていなかった。インターネットで調べたレシピだったはず</p> -</div> - -<div class="recipe"> -<h3>炊き合わせ</h3> -<p>人参、干し椎茸、高野豆腐、竹の子水煮</p> -<p>干し椎茸を戻す。戻した汁で煮て酒、醤油で味付け。高野豆腐を戻す。人参を花型に、竹の子を一口大に切る。それぞれ出汁で煮て醤油、酒で味付け。</p> -</div> - -<div class="recipe"> -<h3>栗金団</h3> -<p>薩摩芋を一口大に切り、砕いたくちなし1個と水少しを入れた鍋で蒸す。裏漉しし、味醂、砂糖、栗のシロップで味付けし、栗を混ぜる。</p> -</div> - -<div class="recipe"> -<h3>数の子</h3> -<p>水で一晩塩を抜いて皮を剥く。</p> -</div> - -<div class="recipe"> -<h3>田作り</h3> -<p>ごまめを乾煎りする。手でボキっと折れるようになるまで。味醂を煮切って醤油を加え、ごまめにからめる。煎り胡麻をまぶす。</p> -</div> - -<div class="recipe"> -<h3>伊達巻</h3> -<p>魚又は海老のすり身と卵黄を混ぜる。卵白に砂糖を入れて泡立てる。以上を混ぜて味醂で味を付ける。卵焼き器を温め油を敷き、卵液を流して蓋をする。裏返して焼き目を付ける。巻き簾で巻く。</p> -</div> - -<div class="recipe"> -<h3>酢蓮根</h3> -<p>蓮根を輪切りにして酢水でゆがく。酢に鷹の爪を入れ、蓮根を浸す。</p> -</div> - -<div class="recipe"> -<h3>たたき牛蒡</h3> -<p>牛蒡を叩いて3cmに切り、縦に4つに割る。ゆがいて酢、醤油、胡麻を混ぜたものに浸す。</p> -</div> - -<div class="recipe"> -<h3>みつわ漬け</h3> -<p>蕪、人参、柚子、昆布を切る。野菜は塩揉みして絞る。酢に漬ける。</p> -</div> - -<div class="recipe"> -<h3>金柑の蜜煮</h3> -<p>金柑に縦に切り込みを入れ、さっと煮る。砂糖を加え煮つめる。</p> -</div> - -<div class="recipe"> -<h3>鱈の西京焼</h3> -<p>西京味噌と味醂を混ぜ、白身魚を漬ける。味噌を拭って焼く。</p> -</div> - -<div class="recipe"> -<h3>干し柿チーズ</h3> -<p>干し柿を縦に切り、クリームチーズ、胡桃を包むように巻く。柿を干しすぎていたため固くて食べにくかった。</p> -</div> - -<div class="recipe"> -<h3>黒豆</h3> -<p>豆を鉄と共に一晩水に浸ける。6時間程煮る。砂糖で味付けしさらに10分煮る。冷して味を染み込ませる。</p> -</div> - -<p>蒲鉾、牛蒡巻は既製品</p> - -<h3>おわりに</h3> -<p>伊達巻は妹が、みつわ漬けは母が作ってくれた。蒲鉾と牛蒡巻きは買ってきた。それ以外は自分で作った。この他、蒟蒻を買っていたが存在を忘れていたのと、棒鱈を水で戻していたが腐ってしまったことが心残りである。買ってきた蒲鉾と牛蒡巻き、それから作れなかった蒟蒻の煮物と棒鱈を作るのが今年の年末の課題である。蒲鉾や牛蒡巻きは保存料や着色料等の添加物が気になる所だ。</p> -<p>今時は百貨店やらでおせちを予約して年末はだらだら過ごし、年始もそのおせちを食べながら家でテレビ漬けが普通なのだろうか。買って来たおせちには旬という概念が欠けており、さらに保存料で日持ちさせている。本来そのとき手に入る旬のものを使い、3ヵ日常温で保存できるように砂糖、酢、塩、発酵等の力を利用したものであったはずだ。今回作ったおせちも食材は基本スーパーで入手した。少しずつ自分の畑で取れたものを取り入れたいものである。</p> -<p>おせち料理は、家族や近所、あるいは寺であれば檀家との付き合いにより成り立っていたのではないだろうか。その付き合いに充てる時間と気力を労働に回し、その労働により得られたお金でできあいのおせちを購入するのは、家族や地域社会の分断であり、また文化の破壊でもある。購入するお金を稼ぐのを辞め、自分達で作ったほうが人付き合いも増え、地域に根差した文化の継承にもなり、より充実した生き方に繋るのではないだろうか。</p> diff --git a/man/kitchen/recipe/mapo_tofu.html b/man/kitchen/recipe/mapo_tofu.html @@ -1,47 +0,0 @@ -<h1>麻婆豆腐</h1> -<time>2024-10-10</time>作成 -<figure> - <img src="../pics/mapo_tofu.jpg" alt="麻婆豆腐の画像"> - <figcaption>麻婆豆腐</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豆腐: 2丁</li> - <li>ひき肉: 300g</li> - <li>長ネギ: 1本</li> - <li>にんにく: 適量</li> - <li>生姜: 適量</li> - <li>八角: 適量</li> - <li>花椒: 好きなだけ</li> - <li>豆板醤: 好きなだけ</li> - <li>味噌: 適量</li> - <li>酒: 適量</li> - <li>濃口醤油: 適量</li> - <li>塩: 少々</li> - <li>炒め油: 多め</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>豆腐を水切りしてサイコロに切る</li> - <li>長ネギ、にんにく、生姜を刻む</li> - <li>フライパンに油をしき八角、にんにく、生姜を入れ弱火で香りを出す</li> - <li>火を強めてひき肉を入れ、塩を少しふる</li> - <li>ひき肉に色がついたらネギを入れて炒める</li> - <li>酒、濃口醤油、味噌、豆板醤で味をつける</li> - <li>水を入れてひと煮立ちさせる</li> - <li>花椒、豆腐を入れる</li> - <li>好みで、ラー油、唐辛子、山椒を好きなだけ入れる</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>我流の適当なレシピなので本場のものが良ければ陳建一さんのでも調べてほしい。</p> -<p>酒はできれば紹興酒のほうがいいと思う。味噌と一緒に豆鼓も入れていいかも。\ -一般的にはもっと旨味を出すために中華だしやら味の素やらを入れると思うが、\ -シンプルに辛いほうが好きなのでそういうものは入れない。\ -陳さんは生姜を入れていなかったが僕はあっていいと思う。\ -豆腐は塩水で茹でていたがこれは真似してもよさそう。</p> diff --git a/man/kitchen/recipe/miso.html b/man/kitchen/recipe/miso.html @@ -1,31 +0,0 @@ -<h1>味噌</h1> -<time>2024-02-09</time> - -<h2>材料</h2> -<p>二升の甕4つ分弱</p> -<ul> -<li>大豆 3.6kg</li> -<li>米麹 5kg</li> -<li>塩 1.8kg</li> -<li>酒粕 500g</li> -</ul> - -<h2>手順</h2> -<ol> -<li>大豆を24時間水に浸す</li> -<li>麹と塩を混ぜる</li> -<li>大豆を3時間蒸す</li> -<li>大豆を潰す</li> -<li>大豆を麹と混ぜる(蒸したときの汁を混ぜて硬さを調整する)</li> -<li>甕に詰める</li> -<li>酒粕で蓋をしてさらにラップで落し蓋をして密閉する。</li> -<li>半年以上寝かす</li> -</ol> - -<h2>ひとこと</h2> -<p> -豆はジップロックに入れて拳に体重を乗せて押しつぶすと楽だった。\ -ジップロックあんまり使いたくないけど。\ -ラップで蓋をするのは好きではないので、試験的にひと瓷だけラップなしで放置することにした。\ -酒粕も味噌っぽくなって食べられるが、風味は少し変わる。味噌汁が粕汁っぽくなる。\ -</p> diff --git a/man/kitchen/recipe/tonkotsu_ramen.html b/man/kitchen/recipe/tonkotsu_ramen.html @@ -1,48 +0,0 @@ -<h1>豚骨ラーメン</h1> -<time>2022-02-08</time>作成 -<figure> - <img src="../pics/tonkotsu_ramen.jpg" alt="豚骨ラーメンの画像"> - <figcaption>豚骨ラーメン</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豚骨: 1本</li> - <li>鶏ガラ: 1個</li> - <li>玉葱: 1個</li> - <li>野菜くず(人参のへた、葱の頭、キャベツの芯等): 適量</li> - <li>大蒜: 1房</li> - <li>生姜: 1かけ</li> - <li>昆布: 適量</li> - <li>干し椎茸: 適量</li> - <li>豚肩ロースブロック: 500g</li> - <li>長葱: 適量</li> - <li>細葱: 適量</li> - <li>もやし: 適量</li> - <li>卵: 人数分</li> - <li>支那竹: 適量</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>昆布、干し椎茸は水にかして30分以上置く。</li> - <li>豚骨を半分に割り、鶏ガラ、水と共に鍋に入れ2回ほど茹でこぼして臭みを取る。</li> - <li>豚骨、鶏ガラ、玉葱、野菜くず、大蒜、生姜、昆布、水を鍋に入れ火にかける。沸騰したら弱火にする(ただしコッテリさせる場合は強火のまま)。適宜アクを取る。水が減ってきたら足す。</li> - <li>豚肩ロースに凧糸を巻き、強火で表面を焼く。3に入れて一緒に煮込む。2時間程で野菜と肩ロースを取り出す。</li> - <li>1を水ごと弱火にかける。</li> - <li>沸騰したら昆布と干し椎茸を取り出し、味醂、酒、塩、醤油で味を付ける。この時塩分濃度が醤油と同じくらいになるようにする。</li> - <li>肩ロースを6に漬けて冷ます。冷めたら密閉できる袋に入れて空気を抜き、冷蔵庫で一晩味を染み込ませる。味玉を作る場合、茹で卵も一緒に入れて一晩置く。</li> - <li>4は6時間煮込んだらザルで漉して粗熱を取り、冷蔵庫で保存する。鶏ガラについていた肉はからし醤油で食べると美味しい。</li> - <li>7を火にかける(表面に脂が浮いて固まっているのであっさりしたスープがいい場合は加熱前に取り除く。脂はラードとして焼き飯等に使うと美味しい)。</li> - <li>具材を準備する。卵を茹でて半分に切る。長葱を白髪葱にする。細葱を刻む。肩ロースを薄く切る。もやしをゆがく。</li> - <li>麺を茹でる。</li> - <li>丼を温め7を適量入れ、9で割る。濃さは好みで調整する。</li> - <li>麺と具材を載せる。</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>焼豚は煮込み過ぎると柔らかくなりすぎてくずれる。</p> -<p>今回は麺と支那竹は市販品だった。製麺機ほしい</p> diff --git a/man/plant/index.html b/man/plant/index.html @@ -1,18 +0,0 @@ -<h1>庭の植物</h1> - -素人同定 - -<ul class="galind"> -<li> -タネツケバナ <i>Cardamine occulta</i> -<img src="pics/cardamine_occulta.png" alt="タネツケバナの画像"> -</li> -<li> -ホトケノザ <i>Lamium amplexicaule</i> -<img src="pics/lamium_amplexicaule.png" alt="ホトケノザの画像"> -</li> -<li> -キュウリグサ <i>Trigonotis peduncularis</i> -<img src="pics/trigonotis_peduncularis.png" alt="キュウリグサの画像"> -</li> -</ul> diff --git a/man/poetry/index.html b/man/poetry/index.html @@ -1,14 +0,0 @@ -<h1>詩</h1> -<ul> - <li>猫を抱く、大島に穴。[<time>2025-04-07</time>]</li> - <li>「醤油を醸すのもA. Oryzaeやっけ?」「そーやと思うで。」[<time>2025-03-15</time>]</li> - <li>乃木坂46、有坂38[<time>2024-12-09</time>]</li> - <li>えびの殻は捨てずにキチンと出汁を引こう。[<time>2023-06-21</time>]</li> - <li>風が吹いた。どっちから?こっち。[<time>2023-02-28</time>]</li> - <li>日本語警察「誤用だー!」[<time>2023-02-28</time>]</li> - <li>分け入っても 分け入っても ピンクのテープ [<time>2022-10-09</time>]</li> - <li>干しぬれど カビの生えたる つるし柿 [<time>2022-10-07</time>]</li> - <li>そうだ、出汁を引こう。 [<time>2022-01-07</time>]</li> - <li>鼻めっちゃでる。びえん。 [<time>2021-11-04</time>]</li> - <li>縄作りなう [<time>2021-05-25</time>]</li> -</ul> diff --git a/man/style.css b/man/style.css @@ -1,129 +0,0 @@ -:root { - --dbg: #000000; - --dbg2: #000000; - --dfg: #ffffff; - --dfg2: #80ff80; - --lbg: #ffffff; - --lbg2: #ffffff; - --lfg: #000000; - --lfg2: #009900; -} - -a { - text-decoration: none; -} - -i { - font-style: italic; -} - -figure { - padding: 1em; - overflow-x: auto; -} - -figcaption { - font-style: italic; -} - -table { - border-collapse: collapse; -} - -table th, -table td { - border: 1px solid; -} - -img { - max-width: 100%; -} - -code { -} - -pre { - padding: 1em; - border-style: solid; - border-radius: 5px; - border-width: 1px; - overflow-x: auto; -} - -body { - font-family: serif; - max-width: 1300px; - margin: 5px auto; -} - -header { - padding: 5px; - border-bottom: 1px solid; -} - -header a { - word-break: keep-all; -} - -main { - padding: 5px; -} - -footer { - padding: 5px; - border-top: 1px solid; -} - -footer *{ - display: inline; -} - -@media (prefers-color-scheme: dark) { - html { - background-color: var(--dbg); - color: var(--dfg); - } - a { - color: var(--dfg2); - } - pre { - background-color: var(--dbg2); - border-color: var(--dfg); - } -} - -@media (prefers-color-scheme: light) { - html { - background-color: var(--lbg); - color: var(--lfg); - } - a { - color: var(--lfg2); - } - pre { - background-color: var(--lbg2); - border-color: var(--lfg); - } -} - -.portrait { - margin: 10px; -} - -.farm-journal-item { - margin: 30px auto; -} - -.farm-journal-date time{ - font-size: x-small; -} - -.galind { - display: flex; - flex-wrap: wrap; - list-style: none; -} - -.galind li { - max-width: 300px; -} diff --git a/pub/about.html b/pub/about.html @@ -1,65 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>自己紹介</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>自己紹介</h1> -<time>2022-07-28</time> - -<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> - -<ul> - <li>名前: 松田 健嗣</li> - <li>性別: 男</li> - <li>年齢: 20代</li> - <li>出身: 和歌山</li> -</ul> - -<p> -高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。 -</p> -<p> -勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。 -</p> -<p> -在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。 -</p> -<p> -ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。 -</p> -<p> -このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。 -</p> - -<h2>著作権について</h2> -<p> -このウェブサイト上のコンテンツは、特に断りのない限り<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>で公開します。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/books/978-4-06-288451-8.html b/pub/books/978-4-06-288451-8.html @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>不死身の特攻兵</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>不死身の特攻兵</h1> -<div class="author">鴻上尚史 著</div> -<time>2022-11-23</time> -<p>大東亜戦争において何度も特攻を命じられるも生還した佐々木友次という人の話。ベテランのパイロットだったために陸軍の特攻第一号に選ばれ、死んでこいと言われたが爆弾を落して帰ってきた人である。それも何度も。</p> -<p>第一章は著者が佐々木氏を知ったいきさつ。第二章は佐々木氏の伝記。第三章は著者の佐々木氏へのインタビュー。第四章は著者による戦争や特攻に関する考察。</p> -<p>第一章は導入である。</p> -<p>第二章は物語として面白かった。戦争や特攻といった理不尽なものに対して自分の信念を貫いた佐々木氏の生き方や考え方が痛快である。</p> -<p>第三章のインタビューでは佐々木氏が繰り返し口にした寿命という言葉が印象的だった。人間は寿命がくれば死に、それまでは生きる、というものである。たとえ戦死であろうともそれがその人の寿命であるとの認識であるようだ。この考えにはとても共感できる。</p> -<p>第四章はかなり客観的に書かれているように思う。その上で著者自身の考えを述べているので読みやすかった。しかし読み進めるにつれてだんだんともやもやが溜っていった。当時の日本を支配していた空気があまりにも重苦しい。しかもその空気は、現在の日本にあるものとほとんど同じであると感じた。ここ最近僕が感じているこの国の暗い部分は大東亜戦争のころからなにも変らずに受け継がれているようである。せっかく無様に負けたのに本当の意味での反省を一切していないためか、なにも変っていない。余りにも勿体無く、戦没者にも失礼である。</p> -<p>もっと歴史を勉強し、今の生き方に反映しなければと考えさせてくれる本だった。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/books/index.html b/pub/books/index.html @@ -1,65 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>本棚</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>本棚</h1> -<table> -<tr><th>題名</th><th>著者</th></tr> -<tr><td>敗者の戦後: ナポレオン・ヒトラー・昭和天皇</td><td>入江隆則</td></tr> -<tr><td>生きる意味を問う</td><td>三島由紀夫</td></tr> -<tr><td>満州国建国は正当である</td><td>ジョージ・ブロンソン・レー</td></tr> -<tr><td>植物一日一題</td><td>牧野富太郎</td></tr> -<tr><td>自然農の米づくり</td><td>川口由一、大植久美、吉村優男</td></tr> -<tr><td>自然農の野菜づくり</td><td>川口由一、高橋浩昭</td></tr> -<tr><td>自然農の果物づくり</td><td>川口由一、三井和夫、勇葱浩生、延命寺鋭雄、柴田幸子</td></tr> -<tr><td>日本その日その日</td><td>エドワード・S・モース</td></tr> -<tr><td>明治大正史 世相編</td><td>柳田國男</td></tr> -<tr><td>渡部昇一の昭和史(正)</td><td>渡部昇一</td></tr> -<tr><td>戦中派の死生観</td><td>吉田満</td></tr> -<tr><td>明治大帝</td><td>飛鳥井雅道</td></tr> -<tr><td>遠野物語</td><td>柳田國男</td></tr> -<tr><td><a href=978-4-06-288451-8.html>不死身の特攻兵</a></td><td>鴻上尚史</td></tr> -<tr><td>The Design and Implementation of the 4.4BSD Operating System</td><td>Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John S. Quarterman</td></tr> -<tr><td>The Go Programming Language</td><td>Alan A. A. Donovan, Brian W. Kernighan</td></tr> -<tr><td>The C Programming Language</td><td>Dennis M. Ritchie, Brian W. Kernighan</td></tr> -<tr><td>The Practice of Programming</td><td>Brian W. Kernighan, Rob Pike</td></tr> -<tr><td>The Unix Programming Environment</td><td>Brian W. Kernighan, Rob Pike</td></tr> -<tr><td>Computer Organization and Design RISC-V Edition</td><td>David A. Patterson, John L. Hennessy</td></tr> -<tr><td>Communicating Sequential Processes</td><td>C. A. R. Hoare</td></tr> -<tr><td>The Awk Programming Language</td><td>Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger</td></tr> -<tr><td>Operating Systems Design and Implementation Third Edition</td><td>Andrew S. Tanenbaum, Albert S. Woodhull</td></tr> -<tr><td>モルフォ人体デッサン</td><td>ミシェル・ローリセラ</td></tr> -<tr><td>ポーズの美術解剖学</td><td>加藤公太</td></tr> -<tr><td>意拳学 中国功夫の精髄</td><td>韓星橋</td></tr> -<tr><td>楽典</td><td>石桁真礼生, 末吉保雄, 丸田昭三, 飯田隆, 金光威和雄, 飯沼信義</td></tr> -</table> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/9p.html b/pub/computer/9p.html @@ -1,316 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>9P</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>9P</h1> -<time>2024-12-19</time> -<h2>はじめに</h2> -<p> -9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。このプロトコルを使えば、ディスクに記録されたデータだけでなく、マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等もファイルとして扱える。Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOSのために設計された。 -</p> - -<p> -Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計されているので、この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。</p> - -<h2>プロトコルの概要</h2> -<p> -9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに対してリプライを返すことを繰り返す。クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと言う。Tメッセージにはファイルにアクセスするための色々なものが用意されている。例えばファイルを開くためのTopenや、開いたファイルに書き込むためのTwrite等である。それぞれのTメッセージには対応するRメッセージがある。Topenに対してRopen、Twriteに対してRwrite等である。</p> -<p> -通信は必要な情報をプロトコルの定める方法でバイト列に変換して行う。2バイト以上のデータはリトルエンディアンになるように配置する。テキストデータはUTF-8にエンコードする。テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。</p> -<p> -各メッセージは4バイトの整数から始まる。これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。次にメッセージの種類を記述する1バイトのデータが来る。次はメッセージのタグである。クライアントはサーバーからの返事を待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージに対する返事なのかを識別する必要がある。そのために使うのがタグである。クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに同じタグを付ける。その後ろには、メッセージの種類によって固有の情報が付けられる。</p> -<p> -以下は実際の9P通信のログである。実際はバイナリの通信だが、ログとして見易いように変換してある。また、先頭にくるメッセージサイズは省略してある。この例では、サーバーのルートディレクトリにある<code>hello</code>というファイルの内容を読みこんでいる:</p> -<pre><code>&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' ---&gt; Rversion Tag 65535 msize 8192 version '9P2000' -&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname ---&gt; Rattach Tag 0 qid (0000000000000000 0 d) -&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello ---&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) -&lt;-- Tstat Tag 0 fid 1 ---&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 -&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 ---&gt; Rwalk Tag 0 nwqid 0 -&lt;-- Topen Tag 0 fid 2 mode 0x0 ---&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 -&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 ---&gt; Rread Tag 0 count 7 ' 776f726c 64210a' -&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 ---&gt; Rread Tag 0 count 0 '' -&lt;-- Tclunk Tag 0 fid 2 ---&gt; Rclunk Tag 0 -</code></pre> -<p> -まず最初にクライアントがサーバーに対してTversionを送り、プロトコルのバージョンと、メッセージの最大サイズを交渉する。Tversionのタグは<code>65535</code>と決められている。<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、<code>version</code>の9P2000がプロトコルのバージョンである。サーバーからRversionで同じ<code>msize</code>と<code>version</code>が返ってきたのでこのサイズとバージョンで以降の通信を行う。</p> -<p> -次のTattachで、クライアントがサーバーにルートディレクトリの<code>fid</code>を要求する。<code>afid</code>以降は認証用の情報である(後述)。<code>fid</code>はコネクションにおいてファイルと紐付けられる整数で、Unixにおけるファイルディスクリプタのようなものである。ファイルの読み書きはこの<code>fid</code>を使って行われる。サーバーからのRattachにはルートディレクトリの<code>qid</code>が含まれる。これはサーバー上でファイルを一意に識別するもので、Unixにおけるinodeに相当するものである。以上でサーバーに繋いでセッションを確立できた。</p> -<p> -次にTwalkで目的のファイル(<code>hello</code>)までファイルツリーを辿る。ここでは起点として先程得られたルートディレクトリ(<code>fid = 1</code>)を起点として、このディレクトリ内の<code>hello</code>ファイルを要求して<code>fid = 2</code>を割り当てようとしている。サーバーはルートディレクトリ内に要求されたファイルが見付かったので、そのファイルの<code>qid</code>を返す。</p> -<p> -目的のファイルに<code>fid</code>が割り当てられたので、Tstatでこのファイルの属性を要求している。おそらくファイルのパーミッションを調べるためである。</p> -<p> -次にTopenを使ってこのファイルを開き、Treadを使って内容を読む。二回目のTreadに対して0バイトのデータが返ってきたので、ファイルはこれで終りである。</p> -<p> -最後に、必要なくなった<code>fid</code>はTclunkで捨てる。</p> - -<h2>List of all Message Types</h2> - -<table> -<tr> -<th>Tメッセージ</th> -<th>Rメッセージ</th> -<th>説明</th> -</tr> -<tr> -<td>Tversion</td> -<td>Rversion</td> -<td>バージョンの交渉</td> -</tr> -<tr> -<td>Tauth</td> -<td>Rauth</td> -<td>認証ファイルの取得</td> -</tr> -<tr> -<td></td> -<td>Rerror</td> -<td>エラー(Rメッセージのみ)</td> -</tr> -<tr> -<td>Tflush</td> -<td>Rflush</td> -<td>処理中のリクエストをキャンセル</td> -</tr> -<tr> -<td>Tattach</td> -<td>Rattach</td> -<td>ルートディレクトリの取得</td> -</tr> -<tr> -<td>Twalk</td> -<td>Rwalk</td> -<td>ファイルツリーを辿る</td> -</tr> -<tr> -<td>Topen</td> -<td>Ropen</td> -<td>ファイルを開く</td> -</tr> -<tr> -<td>Tcreate</td> -<td>Rcreate</td> -<td>ファイルの作成</td> -</tr> -<tr> -<td>Tread</td> -<td>Rread</td> -<td>ファイルを読む</td> -</tr> -<tr> -<td>Twrite</td> -<td>Rwrite</td> -<td>ファイルへ書き込む</td> -</tr> -<tr> -<td>Tclunk</td> -<td>Rclunk</td> -<td>fidの削除</td> -</tr> -<tr> -<td>Tremove</td> -<td>Rremove</td> -<td>ファイルを削除</td> -</tr> -<tr> -<td>Tstat</td> -<td>Rstat</td> -<td>ファイルの属性を取得</td> -</tr> -<tr> -<td>Twstat</td> -<td>Rwstat</td> -<td>ファイルの属性を変更</td> -</tr> -</table> - -<h2><code>fid</code>と<code>qid</code></h2> -<p> -<code>fid</code>はコネクションにおいてファイルを指定するために使われる整数で、Unixのファイルディスクリプタのようなものである。使用する整数はクライアントが指定できる。サーバーに接続する際にTattachにより、サーバーのルートディレクトリの<code>fid</code>が設定され、Twalkにより追加され、Tclunkにより削除される。</p> -<p> -<code>qid</code>はサーバーがファイルを一意に識別するためのもので、Unixのinodeに相当するものである。ただしinodeはファイルが削除されると再利用される可能性があるのに対し、<code>qid</code>は再利用できない。<code>qid</code>はこのファイルがディレクトリかどうか等を示す<code>type</code>、ファイルが変更されたときにインクリメントされる<code>vers</code>、そしてファイルを一意に表す<code>path</code>の3つの情報で構成される。</p> -<h2>認証</h2> -<p> -9Pにはクライアントの認証が組込まれていない。もともとはあったようだが、認証のアルゴリズムに欠陥が見付かったりすればいちいちコードを修正してコンパイルしなおさなければいけないうえ、9Pプロトコル自体も変更しないといけないので、外部に切りだすことになった。認証に必要なやりとりは認証サーバーとクライアントが行い、9Pサーバーは認証が成功したかどうかの情報を認証サーバーに確認することでクライアントの確認を行う。 -</p> -<p> -9PサーバーはTattachメッセージを受けとると、認証サーバーとのコネクションを確立する。その後Rattachメッセージで<code>afid</code>という特殊な<code>fid</code>をクライアントに返す。クライアントからこの<code>afid</code>に対して読み書きする命令が届くと、9Pサーバーはこの読み書きを認証サーバーとのコネクションに横流しする。つまりクライアントはこの<code>afid</code>を通じて認証サーバーと直接やりとりができる。クライアントはユーザー名やパスワード等(パスワード認証の場合)の情報を<code>afid</code>に書き込んで認証する。このように認証をプロトコル自体から切り離すことで、認証に関するバグが見付かったとしても、認証サーバーを修正するだけでいい。また、より強力な認証システムを組み込むのも楽である。 -</p> - -<h2>コネクションの共有</h2> -<p> -クライアントはサーバーと<code>version</code>メッセージを交すことでコネクションを確立する。コネクションの確立からの一連のやりとりをセッションという。ひとつのコネクションは複数のクライアントが共有できる。</p> -<p> -クライアントはTauthまたはTattachメッセージによりサーバーに<code>fid</code>を要求できる。このうちTauthにより得られた<code>fid</code>は認証以外には使えない。Tattachで得られた<code>fid</code>は、Twalkメッセージによりファイルツリーを辿るための起点として利用でき、このとき辿った先のファイルを示す<code>fid</code>が生成される。これ以外の方法で<code>fid</code>が増えることはない。つまり、サーバーはひとつのコネクションのなかで、ルートディレクトリから派生した<code>fid</code>を追跡することで、クライアントを区別できる。</p> - -<h2>メッセージ詳細</h2> -<p> -それぞれ最初にメッセージの形式を書く。<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が来る。 -</p> -<h3>version</h3> -<p> -プロトコルのバージョンを交渉すし、コネクションを確立する。 -</p> -<pre><code>size[4] Tversion tag[2] msize[4] version[s] -size[4] Rversion tag[2] msize[4] version[s] -</code></pre> -<p> -クライアントは最初にサーバーにこのメッセージを送ってバージョンとメッセージの最大サイズ(<code>msize</code>)を交渉する。サーバーはクライアントから送られたバージョンとメッセージサイズに対応していれば、同じバージョンとサイズを送り返し、交渉成立である。</p> -<p> -サーバーとクライアントはこのメッセージを以ってコネクションを確立する。</p> - -<h3>attach、auth</h3> -<p> -コネクションを確立する。 -</p> -<pre><code>size[4] Tauth tag[2] afid[4] uname[s] aname[s] -size[4] Rauth tag[2] aqid[13] - -size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] -size[4] Rattach tag[2] qid[13] -</code></pre> -<p> -<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> -<p> -<code>auth</code>メッセージは認証サーバーとやりとりするための<code>fid</code>である<code>afid</code>を要求する。この<code>afid</code>を読み書きすることで認証サーバーとやりとりをし、自身の身分を証明する。認証が済んだらこの<code>afid</code>をセットした<code>attach</code>メッセージを送る。</p> - -<h3>error</h3> -<p> -エラーを返す。 -</p> -<pre><code>size[4] Rerror tag[2] ename[s] -</code></pre> -<p> -クライアントからの要求に対して、なにかエラーがおきたときにそのエラーを返すために使われる。<code>Terror</code>はない。</p> - -<h3>flush</h3> -<p> -リクエストをキャンセルする。 -</p> -<pre><code>size[4] Tflush tag[2] oldtag[2] -size[4] Rflush tag[2] -</code></pre> -<p> -実行中の要求をキャンセルする。キャンセルしたいリクエストの<code>tag</code>を<code>oldtag</code>にセットする。 -</p> - -<h3>walk</h3> -<p> -ファイルツリーを移動する。 -</p> -<pre><code>size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) -size[4] Rwalk tag[2] nwqid[2] nwqid*(qid[13]) -</code></pre> -<p> -<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> -<p> -<code>wname</code>の最初の要素への移動が失敗した場合は<code>Rerror</code>が返される。それ以外の場合は<code>Rwalk</code>が返され、<code>qid</code>は移動が成功した順番にそのファイルの<code>qid</code>がセットされる。<code>nwname</code>と<code>nwqid</code>が一致した場合は最後まで移動できたことになる。</p> -<p> -<code>walk</code>は<code>fid</code>を増殖させる唯一の方法である。</p> - -<h3>open、create</h3> -<p> -<code>fid</code>を開いて(作成して)読み書きできる状態にする。 -</p> -<pre><code>size[4] Topen tag[2] fid[4] mode[1] -size[4] Ropen tag[2] qid[13] iounit[4] - -size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1] -size[4] Rcreate tag[2] qid[13] iounit[4] -</code></pre> -<p> -<code>open</code>は<code>fid</code>と紐付いたファイルを開く。<code>mode</code>は読み込み専用の<code>OREAD</code>、書き込み専用の<code>OWRITE</code>、読み書きの<code>ORDWR</code>等である。ファイルを開く手順は以下の通り: -<ol> -<li><code>attach</code>でルートディレクトリの<code>fid</code>を取得</li> -<li>ルートディレクトリの<code>fid</code>から<code>walk</code>で開きたいファイルの<code>fid</code>を取得</li> -<li>その<code>fid</code>を<code>open</code>で開く</li> -</ol> -</p> -<p> -<code>create</code>は<code>fid</code>と紐付いたディレクトリに新しいファイルを作成する。<code>creat</code>ではなく<code>create</code>である。作成が成功したら<code>fid</code>は新しく作成されたファイルに紐付く。</p> - -<h3>read、write</h3> -<p> -ファイルを読み書きする。 -</p> -<pre><code>size[4] Tread tag[2] fid[4] offset[8] count[4] -size[4] Rread tag[2] count[4] data[count] - -size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count] -size[4] Rwrite tag[2] count[4] -</code></pre> -<p> -<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> - -<h3>clunk</h3> -<p> -<code>fid</code>を忘れる。 -</p> -<pre><code>size[4] Tclunk tag[2] fid[4] -size[4] Rclunk tag[2] -</code></pre> -<p> -いらなくなった<code>fid</code>を忘れる。一度忘れた<code>fid</code>は<code>walk</code>で別のファイルを取得する際に再利用できる。</p> - -<h3>remove</h3> -<p> -ファイルを削除する。 -</p> -<pre><code>size[4] Tremove tag[2] fid[4] -size[4] Rremove tag[2] -</code></pre> -<p> -<code>fid</code>と紐付いたサーバー上のファイルを削除する。<code>fid</code>は<code>clunk</code>したのと同様に忘れられる。</p> - -<h3>stat、wstat</h3> -<p> -ファイルの属性を読み書きする。 -</p> -<pre><code>size[4] Tstat tag[2] fid[4] -size[4] Rstat tag[2] stat[n] - -size[4] Twstat tag[2] fid[4] stat[n] -size[4] Rwstat tag[2] -</code></pre> -<p> -<code>stat</code>はファイルの属性を読む。読めた情報は<code>stat</code>として返される。<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、作成日、更新日等の情報がバイト列になったものである。</p> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/archlinux_installation.html b/pub/computer/archlinux_installation.html @@ -1,337 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Arch Linuxのインストール</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Arch Linuxのインストール</h1> -<time>2021-03-25</time> - -<h2>ハードウェア構成</h2> - -<h2>インストールの準備</h2> - -<h3>インストールメディアの入手</h3> - -<h3>署名の検証</h3> -<pre><code>$ gpg --keyserver-options auto-key-retrieve --verify archlinux-<i>version</i>-x86_64.iso.sig -</code></pre> - -<h3>インストールメディアの準備</h3> -<pre><code>$ sudo dd bs=4M if=<i>path/to/arch/linux/iso</i> of=/dev/sd<i>X</i> status=progress oflag=sync -</code></pre> - -<h3>ライブ環境の起動</h3> -Arch Linux install medium (x86_64, UEFI)を選択 - -<h3>インストールの記録</h3> -<pre><code># script install.log -</code></pre> - -<h3>起動モードの確認</h3> -<pre><code># ls /sys/firmware/efi/efivars -</code></pre> -エラーが出なければUEFI。 - -<h3>インターネットへ接続</h3> -<p> -ネットワークインターフェイスが認識されているか確認: -</p> -<pre><code># ip link -</code></pre> -<p> -Wi-Fi接続: -</p> -<pre><code># iwctl -[iwd]# device list -... -[iwd]# exit -</code></pre> -<p> -接続を確認: -</p> -<pre><code># ping archlinux.jp -</code></pre> - -<h3>システムクロックの更新</h3> -<pre><code># timedatectl set-ntp true -</code></pre> - -<h3>パーティショニング</h3> -<pre><code>sd<i>X</i> -├sd<i>X</i>1 512M EFI System /boot -└sd<i>X</i>2 lest Linux filesystem / -</code></pre> -<pre><code># lsblk -# fdisk /dev/sd<i>X</i> -Command (m for help): d -... -Command (m for help): w -</code></pre> - -<h3>パーティションのフォーマット</h3> -<pre><code># mkfs.fat -F32 /dev/sd<i>X</i>1 -# mkfs.ext4 /dev/sd<i>X</i>2 -</code></pre> - -<h3>ファイルシステムのマウント</h3> -<pre><code># mount /dev/sd<i>X</i>2 /mnt -# mkdir /mnt/boot -# mount /dev/sd<i>X</i>1 /mnt/boot -</code></pre> - -<h2>インストール</h2> -<h3>ミラーの選択</h3> -日本のサーバーを上に持ってくる: -<pre><code># vim /etc/pacman.d/mirrorlist -</code></pre> - -<h3>必須パッケージのインストール</h3> -<pre><code># pacstrap /mnt base base-devel linux linux-firmware man-db man-pages -</code></pre> - -<h3>fstabの生成</h3> -<pre><code># genfstab -U /mnt >> /mnt/etc/fstab -</code></pre> - -<h3>chroot</h3> -<pre><code># arch-chroot /mnt -</code></pre> - -<h3>text editorをインストール</h3> -<pre><code># pacman -S neovim -</code></pre> - -<h3>タイムゾーン</h3> -<pre><code># ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -# hwclock --systohc -</code></pre> - -<h3>ローカリゼーション</h3> -<code>en_US.UTF-8</code>と<code>ja_JP.UTF-8</code>をコメントイン: -<pre><code># nvim /etc/locale.gen -</code></pre> -ロケールを生成: -<pre><code># locale-gen -</code></pre> -<pre><code># nvim /etc/locale.conf -LANG=en_US.UTF-8 -</code></pre> - -<h3>ネットワーク設定</h3> -<p> -無線接続用のソフトをインストール -</p> -<pre><code># pacman -S networkmanager -</code></pre> - -<p> -ホストネームの設定 -</p> -<pre><code># nvim /etc/hostname -<i>myhostname</i> -</code></pre> -<pre><code># nvim /etc/hosts -127.0.0.1 localhost -::1 localhost -127.0.1.1 <i>myhostname</i>.localdomain <i>myhostname</i> -</code></pre> - -<h3>Rootパスワード</h3> -<pre><code># passwd -</code></pre> - -<h3>ブートローダー</h3> -<p> -インストール -</p> -<pre><code># pacman -S grub efibootmgr -# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=boot -</code></pre> -<p> -メイン設定ファイルの生成 -</p> -<pre><code># grub-mkconfig -o /boot/grub/grub.cfg -</code></pre> - -<h3>マイクロコードのアップデートを有効化</h3> -<pre><code># pacman -S intel-ucode -# grub-mkconfig -o /boot/grub/grub.cfg -上のん無駄やんけ -</code></pre> - -<h2>再起動</h2> -<pre><code># exit #chrootを抜ける -</code></pre> - -<h3>インストールの記録を保存</h3> -<pre><code># exit #scriptを停止 -# mv install.log /mnt/root -</code></pre> - -<h3>アンマウント</h3> -<pre><code># umount -R /mnt -</code></pre> - -<h3>再起動</h3> -<pre><code># reboot -</code></pre> - -<h2>インストール後</h2> -<h3>システム管理</h3> -<p> -一般ユーザーの作成 -</p> -<pre><code># useradd -m -G wheel -s /bin/bash kenji -# passwd kenji -</code></pre> -<p> -作成したユーザーをsudoerに追加 -</p> -<pre><code># visudo -%wheel ALL=(ALL) ALL #uncomment -</code></pre> -<p> -一般ユーザーとしてログインしなおす。 -</p> - -<h3>パッケージ管理</h3> -<p> -AUR -</p> - - - -<h3>dotfilesを同期</h3> -<p> -gitのインストール -</p> -<pre><code>$ sudo pacman -S git -$ git config --global user.name "<i>First-name</i> <i>Family-name</i>" -$ git config --global user.email "<i>username</i>@<i>example.com</i>" -</code></pre> -<p> -dotfilesを同期 -</p> -<pre><code>$ mkdir ~/.local -$ cd ~/.local -$ git clone https://github.com/<i>dotfilesのリポジトリ</i> -$ ln -sf ~/.local/dotfiles/.bash* ~/ -$ mkdir .config -$ ln -s ~/.local/dotfiles/.config/* ~/.config/ -... -</code></pre> - -<h3>GUI</h3> -<p> -グラフィックドライバのインストール -</p> -<pre><code>$ sudo pacman -S nvidia nvidia-utils xorg-xinit -</code></pre> -<p> -window managerをインストール -</p> -<pre><code>$ sudo pacman -S i3-wm i3blocks dmenu -</code></pre> -ドライバをインストールしたらxorg-server等も依存関係として入った。 -<p> -フォントをインストール -</p> -<pre><code>$ sudo pacman -S noto-fonts-cjk noto-fonts-emoji ttf-joypixels ttf-font-awesome ttf-liberation -</code></pre> - -<p> -ターミナル(st)をインストール -</p> -<pre><code>$ mkdir ~/.local/src -$ cd ~/.local/src -$ git clone git://git.suckless.org/st -$ cd st -$ sudo make install -</code></pre> - -<p> -再起動 -</p> -<pre><code># sudo reboot -</code></pre> -だめでした -<p> -ログイン時に次のエラー -</p> -<pre><code>xauth: error in locking authority file /home/kenji/.cache/X11/Xauthority -</code></pre> -<p> -<code>~/.cache/X11</code>というディレクトリがないのが原因のようだ。 -<code>.bash_profile</code>でXauthorityの場所を変更していたのにディレクトリを作っていなかった。 -</p> -<pre><code>$ mkdir ~/.cache/X11 -</code></pre> -<p> -として解決。 -</p> - -<h3>日本語入力</h3> -<p> -ibusとibus-skkをインストール -</p> -<pre><code>$ sudo pacman -S ibus ibu-skk skk-jisyo -</code></pre> -<pre><code>vim ~/.config/X11/xinitrc -export DefaultIMModule=ibus -export GTK_IM_MODULE=ibus -export QT_IM_MODULE=ibus -export XMODIFIERS="@im=ibus" - -ibus-daemon --xim & -</code></pre> - -<h3>ブラウザ(brave)をインストール</h3> -<pre><code>$ cd ~/.local/src -$ git clone https://aur.archlinux.org/brave-bin.git -$ cd brave-bin -$ makepkg -si -</code></pre> - -<h3>音</h3> -<pre><code>$ sudo pacman -S alsa-utilst pulseaudio -$ pulseaudio --start -</code></pre> - - -<p> -ssh -</p> -<pre><code>$ sudo pacman -S openssh -$ mkdir ~/.ssh -$ cd ~/.ssh -$ ssh-keygen -t rsa -</code></pre> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/git_server.html b/pub/computer/git_server.html @@ -1,301 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Gitサーバーの設定 on OpenBSD</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Gitサーバーの設定 on OpenBSD</h1> -<time>2024-02-15</time> - -<h2>はじめに</h2> -<p> -GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p> -<p> -ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。 -</p> - -<h2>手順</h2> -<p> -以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。 -</p> - -<h3>概要</h3> -<ol> -<li>ドメインの設定(任意)</li> -<li><code>httpd(8)</code>の設定</li> -<li>gitパッケージのインストールとchroot環境の整備</li> -<li>stagitの導入</li> -</ol> - -<h3>ドメインの設定(任意)</h3> -<p> -ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p> -<p> -今回はgitというサブドメインを登録した: -</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>git</td> -<td>A</td> -<td><i>サーバーのIPアドレス</i></td> -<td></td> -</tr> -</tbody> -</table> - -<h3><code>httpd(8)</code>の設定</h3> -<p> -httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する: -</p> -<pre><code>domain git.mtkn.jp { - domain key "/etc/ssl/private/git.mtkn.jp.key" - domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - sign with letsencrypt -} -</code></pre> - -<p> -続いて<code>/etc/httpd.conf</code>を設定する。</p> -<pre><code>server "git.mtkn.jp" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "git.mtkn.jp" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - key "/etc/ssl/private/git.mtkn.jp.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "/*/git-receive-pack" { - block - } - location "/*/git-upload-pack" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } - location "/*/info/refs" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } -} -</code></pre> -<p> -<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p> -<p> -<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環境にコピーする。 -</p> -<p> -この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p> - - - -<p> -httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。 -</p> -<p> -<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する: -</p> -<pre><code># echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# echo slowcgi_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -# rcctl start slowcgi -# rcctl enable slowcgi -</code></pre> -<p> -サーバー証明書の発行: -</p> -<pre><code># acme-client -v git.mtkn.jp -</code></pre> -<p> -<code>crontab(1)</code>にサーバー証明書の自動更新を登録: -</p> -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd -</code></pre> - -<h3>gitパッケージのインストールとchroot環境の整備</h3> -<p> -gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする: -</p> -<pre><code># pkg_add git -# useradd -b /var/www -m -s /usr/local/bin/git-shell git -</code></pre> -<p> -ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p> -<p> -httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー: -</p> -<pre><code># mkdir -p /var/www/usr/local/libexec/git -# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/ -# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# mkdir -p /var/www/usr/local/bin -# cp /usr/local/bin/git /var/www/usr/local/bin/ -# chown www:www /var/www/usr/local/bin/git -# chmod 0500 /var/www/usr/local/bin/git -</code></pre> -<p> -続いてコマンドの実行に必要なライブラリをコピー: -</p> -<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec -# 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 -</code></pre> -<p> -<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照): -</p> -<pre><code># mkdir /var/www/dev -# mknod -m 666 /var/www/dev/null c 2 2 -</code></pre> -<p> -最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。 -</p> - -<p> -gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った: -</p> -<pre><code>#!/bin/sh -xe - -oso=$(find /var/www/usr -type f -name '*.so*') -rm $oso - -bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' | - grep -v bgpctl | - sed 's|^/var/www||' - ) -echo &quot;$bin&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chmod 0500 /var/www&amp;|' | sh -s - -nso=$(echo &quot;$bin&quot; | sed 's|^|/var/www|' | - xargs ldd | awk '{print $7}' | - grep -v -e '^/var/www/' -e '^$' -e 'Name' | - sort | uniq - ) -echo &quot;$nso&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chmod 0400 /var/www&amp;|' | sh -s -</code></pre> - -<h3><code>stagit(1)</code>の導入</h3> -<p> -ウェブフロントエンドとしてstagitを導入する: -</p> -<pre><code># pkg_add stagit -</code></pre> -<p> -<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する): -</p> -<pre><code> location &quot;/&quot; { - directory index index.html - root &quot;/htdocs/git.mtkn.jp&quot; - } - location &quot;*&quot; { - directory index log.html - root &quot;/htdocs/git.mtkn.jp&quot; - } -</code></pre> -<p> -stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する: -</p> -<pre><code># mkdir /var/www/htdocs/git.mtkn.jp -# chown git:git /var/www/htdocs/git.mtkn.jp -# rcctl reload httpd -</code></pre> - -<p> -gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい: -</p> -<pre><code>#!/bin/sh - -git_root=&quot;/var/www/git&quot; -stagit_root=&quot;/var/www/htdocs/git.mtkn.jp&quot; -repo=&quot;$(basename &quot;$(pwd)&quot; | sed 's/\.git$//')&quot; -src=&quot;$(pwd)&quot; -stagit_dst=&quot;$stagit_root/$repo&quot; - -mkdir -p &quot;$stagit_dst&quot; -(cd &quot;$stagit_dst&quot; &amp;&amp; stagit -l 64 &quot;$src&quot;) -(cd &quot;$stagit_root&quot; &amp;&amp; stagit-index $git_root/*.git &gt; index.html) -</code></pre> - -<h2>レポジトリの作成</h2> -<p> -レポジトリを作成するにはサーバーで以下のようにする。</p> -<pre><code>$ cd /var/www/git -$ doas -u git mkdir <i>repo</i>.git -$ cd <i>repo</i>.git -$ doas -u git git init --bare -</code></pre> - -<p> -これで手元のパソコンからクローンできる: -</p> -<pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git -</code></pre> -<p> -または -</p> -<pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git -</code></pre> - -<h2>参考</h2> -<ul> -<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li> -<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li> -<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/images/openbsd_on_u9310e_1.jpg b/pub/computer/images/openbsd_on_u9310e_1.jpg Binary files differ. diff --git a/pub/computer/images/openbsd_on_u9310e_2.jpg b/pub/computer/images/openbsd_on_u9310e_2.jpg Binary files differ. diff --git a/pub/computer/index.html b/pub/computer/index.html @@ -1,76 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>電算機</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>電算機</h1> -<p> -Small is beautiful. -</p> - -<h2>9P in Go</h2> -<ul> -<li><a href="9p.html">9P</a></li> -</ul> - -<h2>RP2040</h2> -<ul> -<li><a href="rp2040_1.html">RP2040 SDKなしでLチカ</a></li> -<li><a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> -<li><a href="rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> -</ul> - -<h2>X Window System</h2> -<ul> -<li><a href="x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> -<li><a href="xlib_playground1.html">Xlibで遊んでみる1</a></li> -<li><a href="xlib_playground2.html">Xlibで遊んでみる2</a></li> -<li><a href="xlib_playground3.html">Xlibで遊んでみる3</a></li> -<li><a href="xlib_playground4.html">Xlibで遊んでみる4</a></li> -<li><a href="xlib_playground5.html">Xlibで遊んでみる5</a></li> -<li><a href="xlib_playground6.html">Xlibで遊んでみる6</a></li> -</ul> - -<h2>サーバー</h2> -<ul> -<li><a href="setting_up_web_server.html">Webサーバーの設定</a></li> -<li><a href="mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> -<li><a href="git_server.html">Gitサーバーの設定 on OpenBSD</a></li> -</ul> - -<h2>MISC</h2> -<ul> -<li><a href="what-i-use.html">使用しているソフトウェア、ハードウェア</a></li> -<li><a href="openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> -<li><a href="archlinux_installation.html">Arch Linuxインストール</a></li> -<li><a href="rtx1200-qos.html">ルーター(RTX1200)のQoS機能を利用して帯域を制限した</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/mailserver.html b/pub/computer/mailserver.html @@ -1,564 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1> -<time>2024-01-19</time><br> -<time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br> - -<h2>はじめに</h2> -<p> -少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。当時はドキュメントを追うのに必死で構築手順を整理できていなかった。しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。そこであらためてサーバーを構築し、その手順を確認することにした。あいかわらずDNSの知識は自信がない。セキュリティは自己責任で。</p> - -<h2>使うもの</h2> -<ul> -<li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> -<li>OS: OpenBSD 7.4</li> -<li>ドメイン: ムームードメイン (mtkn.jpとする)</li> -<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> -<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> -</ul> - -<h2>メールの仕組み</h2> -<p> -メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのがSMTPサーバーと呼ばれるソフトウェアである。このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも呼ばれる。今回はMTAとしてOpenSMTPDというのを使う。手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、そこから受信側のMTAに転送される。受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所に保存する。</p> -<p> -受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、自分宛てのメールを確認する。この時に使われるのがIMAPというプロトコルである(POPというのもあるが今回は割愛)。IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。今回MDAとしてDovecotを使用する。</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre> -+------------+ +----------------+ -|MTA(mtkn.jp)|--SMTP-&gt;| MTA | -+------------+ +--example.com---+ - ^ | MDA | - | +----------------+ - | | - SMTP IMAP - | | - | v -+------------+ +----------------+ -|user@mtkn.jp| |user@example.com| -+------------+ +----------------+ - -</pre> -<ol> -<li>メールを書く。</li> -<li>送信側のMTAに送る。</li> -<li>受信側のMTAに転送する。</li> -<li>受信者が受信側のMDAに新着メールの有無を確認する。</li> -</ol> - -<p> -SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、いくつかの方法で送信元の本人確認を行う。その際第三者としてDNS及び、サーバーのIPアドレスを管理している人(今回の場合はさくらインターネット)が登場する。DNSにはドメインをIPアドレスにひもづける情報が登録できる。またIPアドレスの管理人には、自分が借りているIPアドレスを自分のドメインにひもづける情報を登録してもらう。これらによって、メールの送信者がドメイン、IPアドレス双方から確認できるので、なりすましを防止できる仕組みである。</p> - -<p> -最近はgmail等の大手がスパム対策を強化する一環として、以下に述べるような本人確認をすべて通らなければ受信しないようにしているらしい。</p> - -<h2>MTAどうしのやりとり</h2> -<p> -以下、MTAどうしの通信内容をざっくり説明する。 -</p> - -<h3>Aレコード、MXレコードによる送信先の特定</h3> -<p> -MTAがメールを送信する際、まずは宛先のサーバーを特定する必要がある。この際に使用するのがDNSに登録されているMXレコードである。送信元のMTAはまずDNSに宛先のドメインのMXレコードを問い合わせる。するとメールの送信先のドメイン名が分かるので、続いてこの送信先のIPアドレスを問い合わせる:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS - - example.com宛のメールって - 誰に送ったらええん? - ----------------------------------------&gt; - - mai.example.comやで(MXレコード) - &lt;---------------------------------------- - - mail.example.comってどこや? - ----------------------------------------&gt; - - <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) - &lt;---------------------------------------- -</pre> -<p> -次にこの宛先のMTAとの通信を開始する。しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - こんちは。mtkn.jpです。 - ----------------------------------------&gt; - - なりすましちゃうか確認したろ -</pre> - -<h3>SPFレコードによる送信元の本人確認</h3> -<p> -受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。このときに使うのがSPFレコードである。このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいいIPアドレスを指定する。受信側のMTAは送信元のIPアドレスと、このレコードに記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者に認められているMTAかどうか判断できる。</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗るやつから連絡 - 来てるんやけどこいつ本物? - &lt;---------------------------------------- - - IPアドレスが<i>sss.sss.sss.sss</i> - やったら多分本物やわ。(SPFレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>PTRレコード</h3> -<p> -次は逆にIPアドレスからドメインを辿って本人確認する。これに使われるのがPTRレコードである。このレコードはIPアドレスの管理人(ここではさくらインターネット)でないと登録できない。しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを提供しており、PTRレコードをきちんと設定した上でスパムメールを送ると、自分の身元がバレるので、スパムの抑止に繋がる。</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - <i>sss.sss.sss.sss</i>ってIPアドレスで - mtkn.jpってドメイン登録されてる? - &lt;---------------------------------------- - - されてるで。(PTRレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DKIM</h3> -<p> -送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。署名は公開鍵方式で行うが、この鍵をドメインキーというようである。この署名が付いたメールをDKIM(DomainKey Identified Mail)という。送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、メール送信時に秘密鍵で署名する:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - - 本人確認できたわ - おまたせ。 - &lt;---------------------------------------- - - userさんにメール送るで。 - 署名も付けるで。 - ----------------------------------------&gt; -</pre> -<p> -受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpが署名付きでメール - くれたんやけどこの署名本物? - &lt;---------------------------------------- - - これで確認してみて(DKIM公開鍵) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3> -<p> -この他DNSにはDMARCレコードというものを登録することができる。これは、以上の本人確認により送信側がにせものであることが確認できた際、受信側にどのような行動を取ってほしいかを記述するものである。これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、受信したサーバーから自分宛てに通報するように頼める(この頼みが聞き入れられるかどうかは多分受信側MTAによる)。 -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗る詐欺師から - メールきたんやけどどないしょ? - &lt;---------------------------------------- - - ここ(postmaster@mtkn.jp)に通報や。 - (DMARCレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h2>サーバーの設定</h2> -<h3>VPSの契約、ドメインの取得</h3> -<p> -VPSとドメインを契約する。今回はVPSをさくらインターネットで、ドメインをムームードメインでそれぞれ契約した。さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい(他のVPSを知らないので比較はできないが)。ムームードメインは安い。管理画面も悪くはない。以前お名前.comでも借りたことがあるが、こちらは広告のメールがやたら届いてうっとうしかった記憶がある。</p> - -<h3>OpenBSDのインストール</h3> -<p> -さくらのVPSにOpenBSDをインストールする。さくらインターネットが用意したISOがあるので、OS再インストールの画面からそれを選べばすぐにインストールきる。でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。</p> -<p> -インストールのこまかい手順は割愛するが、ひとつだけひっかかった点があるので書いておく。インストール先のディスクをセットアップし、OSに必要なファイルをインストールメディアからディスクにコピーすると以下のエラーがでてカーネルパニックになった: -</p> -<pre><code>wdc_atapi_start: not ready, st = 50 -fatal protection fault in supervisor mode -trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410 -gsbase 0xffffffff81908ff0 kgsbase 0x0 -panic: trap type 4, code=0, pc=ffffffff810081a9 -syncing disks...18 18 18 18 18 18 18 18 -</code></pre> -<p> -原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗しているようで、インストールに必要なファイルをウェブ上からダウンロードする方法を選択すると問題なくインストールできた。 -</p> - -<h3>ファイアーフォールの設定</h3> -<p> -メールの送受信等に必要なポートを開ける:</p> -<ul> -<li>TCP 22: ssh接続用</li> -<li>UDP 53: DNSとの通信用</li> -<li>TCP 25: SMTPの通信用</li> -<li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li> -<li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li> -<li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li> -</ul> -<p> -以上の設定を<code>/etc/pf.conf</code>に設定する: -</p> -<pre><code>set skip on lo - -block return # block stateless traffic -pass in log proto tcp from any to any port 22 #ssh - -pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS -pass out proto udp from any to any port 123 #ntp - -pass proto icmp #ping -pass proto tcp from any to any port { 80, 443 } #www -pass proto tcp from any to any port { 25, 587, 993 } #mail -</code></pre> -<p> -<code>pf(4)</code>の設定を反映: -</p> -<pre><code># pfctl -f /etc/pf.conf -</code></pre> - -<h3>DNSの設定</h3> -<h4>A, MX, SPF, DMARC</h4> -<p> -DNSのレコードを設定する。ムームーDNSの場合、コントロールパネルにログインし、サイドバーからドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタンをクリックすると設定画面がでるので、以下のように設定する:</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td></td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td>mail</td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td></td> -<td>MX</td> -<td>mail.mtkn.jp</td> -<td>10</td> -</tr> -<tr> -<td></td> -<td>TXT</td> -<td>v=spf1 mx -all</td> -<td></td> -</tr> -<tr> -<td>_dmarc</td> -<td>TXT</td> -<td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td> -<td></td> -</tr> -</tbody> -</table> - -<p> -ひとつめの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>であることも分かる。 -</p> -<p> -次のTXTレコードはSPFレコードである。v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録されたIPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信を禁止している。 -</p> -<p> -最後のものはDMARCレコードである。v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメールについて、その受信者が受信を拒否するように指定している。rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメールを受信した場合の通報先を指定している。</p> - -<h4>PTR</h4> -<p>PTRレコードを設定する。さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名(mtkn.jp)を入力する。 -</p> - -<h3>OpenSMTPDの設定</h3> -<h4>ユーザーの作成</h4> -<p> -メールの送受信を担当するユーザーを作成する:</p> -<pre><code># useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail -</code></pre> - -<h4>サーバー証明書の取得</h4> -<p> -<code>httpd(8)</code>の設定ファイルを作成する。<code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。変更箇所はドメイン名だけでいい。編集後、httpdを起動する。</p> -<pre><code># cp /etc/examples/httpd.conf /etc/ -# vi /etc/httpd.conf -# echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -</code></pre> - -<p> -続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に登録することで、証明書が自動で更新されるようにする。</p> -<pre><code># cp /etc/examples/acme-client.conf /etc/ -# vi /etc/acme-client.conf -# acme-client -v mail.mtkn.jp -# crontab -e -</code></pre> - -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd -</code></pre> - -<h4>ドメインキーの作成とDNSへの登録</h4> -<p> -OpenSMTPD用のDKIMフィルターをインストールする。 -</p> -<pre><code># pkg_add opensmtpd-filter-dkimsign -</code></pre> - -<p> -ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。 -</p> -<pre><code># openssl genrsa -out /etc/mail/dkim/private.key 1024 -# openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key -# chown -r _dkimsign:_dkimsign /etc/mail/dkim -# chmod 0400 /etc/mail/dkim/private.key -</code></pre> - -<p>作成したドメインキーの公開鍵をDNSに登録する:</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>selector1._domainkey.mail</td> -<td>TXT</td> -<td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td> -<td></td> -</tr> -</tbody> -</table> - -<p> -サブドメインのselector1は以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに -指定してものと同じものであれば他のものでもいい。</p> - -<h4>smtpd.confの設定</h4> -<p> -/etc/mail/smtpd.confを以下の通り変更:</p> -<pre><code># 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。 -# 証明書のファイルは先程acme-client(1)で取得したもの。 -pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot; -pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot; - -# テーブルの登録 -# ローカルに届いたメールの転送を設定するテーブル -table aliases file:/etc/mail/aliases -# ユーザーの名前と暗号化されたパスワードのテーブル -table passwd file:/etc/mail/passwd -# メールの転送を設定するテーブル -table virtuals file:/etc/mail/virtuals - -# フィルターの登録 -# ドメインキーによる署名を付加するフィルター -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 -# DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター -filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot; -# 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった -# 場合に受信を拒否するフィルター -filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot; - -# 各ネットワークインターフェース毎の処理を設定。 -listen on socket -listen on lo0 -# vio0というインターフェースの25番ポートに届いたものに関する設定。 -# 外部からmtkn.jp宛に届いたものの処理である。 -# 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、 -# 上で設定したDNSに関するフィルターを適応。 -listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\ - filter { check_rdns, check_fcrdns } -# vio0というインターフェースのsubmission(587番)ポートに関する設定。 -# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される -# メールに関する設定。 -# 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 -# &quot;passwd&quot;という名前で登録したパスワードで認証し、 -# さらにドメインキーでメールに署名する。 -listen on vio0 mask-src port submission smtps pki mtkn.jp\ - hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign - -# 各種メールの処理を定義する。 -# 各処理が実行される条件はこの後定義する。 -# ローカルメールはデフォルトのまま -action &quot;local_mail&quot; mbox alias &lt;aliases&gt; -# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 -action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\ - virtual &lt;virtuals&gt; -# 他のドメイン宛ては宛先へ転送。 -# 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で -# 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加 -action &quot;outbound&quot; relay helo "mtkn.jp" - -# どういう条件でどういう処理をするかを定義する。 -# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 -# ここでは/var/vmail/以下に振り分けて保存する。 -match from any for domain mtkn.jp action &quot;domain&quot; -# このサーバー内でのメールはlocal_mailとして処理。 -match from local for local action &quot;local_mail&quot; -# このサーバー内から他所へのメールは宛先に転送 -match from local for any action &quot;outbound&quot; -# 外部から来た他所宛てのメールは認証されているものに限り転送。 -# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 -match auth from any for any action &quot;outbound&quot; -</code></pre> - -<h4>各テーブルの作成</h4> -<p> -上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。<code>/etc/mail/aliases</code>は特に変更しなくてもいい。<code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:</p> -<pre><code># echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd -<i>パスワードを入力し、エンター、Ctrl-D</i> -</code></pre> - -<p> -<code>/etc/mail/virtuals</code>にはメールの転送を設定できる。以下のようにする:</p> -<pre><code>abuse@mtkn.jp user@mtkn.jp -postmaster@mtkn.jp user@mtkn.jp -webmaster@mtkn.jp user@mtkn.jp -user@mtkn.jp vmail -</code></pre> -<p> -この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど必要なんかな? -</p> - -<h3>Dovecotの設定</h3> -<p> -MDAとして<code>dovecot(1)</code>をインストールする。</p> -<pre><code># pkg_add dovecot -</code></pre> -<p> -dhparamを作成する(時間がかかる): -</p> -<pre><code># openssl dhparam -out /etc/ssl/dh.pem 4096 -</code></pre> - -<p> -わかりにくい設定ファイルをどけてシンプルなものに書き直す: -</p> -<pre><code># mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig -# vi /etc/dovecot/dovecot.conf -</code></pre> -<p> -ドキュメントは公式ウェブサイトで確認できる。分量が多すぎて読む気にならない。サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>と暗号化されていないIMAPを<code>port = 0</code>として無効にする。他はとりあえず以下の設定で動く:</p> -<pre><code># IPv4は全て監視 -listen = * - -# SSL接続のみ許可 -ssl = required - -# SSLに使用するファイル -ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem -ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key -ssl_dh = &lt;/etc/ssl/dh.pem - -# メールの保存場所は各ユーザーのホームディレクトリ。 -# ホームディレクトリの場所は以下のuserdbで設定。 -mail_location = maildir:~ - -# パスワードのファイル。 -# OpenSMTPDと共有。 -passdb { - args = scheme=BLF-CRYPT /etc/mail/passwd - driver = passwd-file -} - -# ユーザーの設定。 -# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> -userdb { - args = uid=vmail gid=vmail home=/var/vmail/%d/%n - driver = static -} - -# 使用するプロトコル。 -protocols = imap lmtp - -# SSLを使ったIMAPSのみを許可。 -service imap-login { - inet_listener imaps { - port = 993 - ssl = yes - } - # Disable imap - inet_listener imap { - port = 0 - } -} -</code></pre> -<pre><code># rcctl start dovecot -# rcctl enable dovecot -</code></pre> - -<p> -サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように<code>cron(8)</code>に追加しておく: -</p> -<pre><code>crontab -e -</code></pre> - -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot -</code></pre> - -<h3>テスト</h3> -<p> -手元のメールクライアントから送受信のテストをする。特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。以上の設定で、gmailへの送受信は問題なかった。また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン及び送受信できることも確認した。</p> -<p> -<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> - -<h2>参考文献</h2> -<ul> -<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> -<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> -<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> -<li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/openbsd_on_u9310e.html b/pub/computer/openbsd_on_u9310e.html @@ -1,179 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>OpenBSD on Fujitsu LIFEBOOK U9310/E</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>OpenBSD on Fujitsu LIFEBOOK U9310/E</h1> -<time>2025-04-28</time> - -<h2>はじめに</h2> -<p> -大阪の日本橋で状態のいいLIFEBOOKを見つけたので購入した。OpenBSDをインストールしたらおおむね問題なく動いた。</p> - -<h2>ハードウェア</h2> -<img src="images/openbsd_on_u9310e_1.jpg" alt="U9310/E"> -<p> -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> - -<h2>内部</h2> -<p> -分解は簡単。電源を落して、裏面にあるネジを全部外せば裏蓋が開く。ツメで引っ掛けていたりしないので外しやすい。裏蓋にはバッテリーの絵が描かれたボタンがあって、いかにも押してほしそうな顔をしていたので一応押してから分解した。組み立てた後は電源ケーブルを繋がないと電源が入らなかった。おそらくバッテリーとの接続を切断するためのボタンなのだと思う。</p> -<img src="images/openbsd_on_u9310e_2.jpg" alt="U9310/E の内部"> -<p> -CPUクーラー、ヒートシンク、Wi-Fiカード、WWANカード、SSDは簡単に外せた。他のものもだいたい分解しやすそうである。電源プラグが交換できるのはポイントが高い。上でも書いたがメモリははんだ付けされていて交換できない。キーボードも外せそうではあるがマザーボードを取ったうえネジが沢山あったのでやめにした。</p> -<h2>OpenBSDのサポート</h2> -<table> -<tr> -<th>機能</th> -<th>サポート</th> -<th>備考</th> -</tr> - -<tr> -<td>音</td> -<td>○</td> -<td> -Intel 400 Series HD Audio、コーデック: Realtek ALC255。<br>azaliaによりサポート。メディアキーによる音量調整が可能。</td> -</tr> - -<tr> -<td>バッテリーの状態</td> -<td>○</td> -<td> -acpibatによりサポート。 -</td> -</tr> - -<tr> -<td>キーボードバックライト</td> -<td>?</td> -<td> -今回購入したものには搭載されていなかった。 -</td> -</tr> - -<tr> -<td>ハイバーネーション</td> -<td>○</td> -<td> -ZZZが使える。 -</td> -</tr> - -<tr> -<td>スリープ</td> -<td>○</td> -<td> -zzzが使える。液晶を閉じると自動でスリープし、開くと問題なく復帰できる。電源ランプが点滅するのが少しじゃま。 -</td> -</tr> - -<tr> -<td>タッチパッド</td> -<td>○</td> -<td> -imtでサポート。 -</td> -</tr> - -<tr> -<td>USB type-A</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>USB type-C、Thunderbolt</td> -<td>?</td> -<td> -充電はできた。Thunderboltはケーブルがないのでテストできない。</td> -</tr> - -<tr> -<td>SDカードリーダー</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>映像出力</td> -<td>○</td> -<td> -inteldrmでサポート。輝度の調整はxbacklightで出来るが、メディアキーは使えなかった。HDMIの出力も問題ない。 -</td> -</tr> - -<tr> -<td>ウェブカメラ</td> -<td>○</td> -<td> -SunplusIT Inc FJ Camera。uvideoでサポート。 -</td> -</tr> - -<tr> -<td>Ethernet</td> -<td>○</td> -<td> -emでサポート。 -</td> -</tr> - -<tr> -<td>Wi-Fi</td> -<td>○</td> -<td> -Intel Wi-Fi 6 AX201。iwxでサポート。 -</td> -</tr> - -<tr> -<td>WWAN</td> -<td>?</td> -<td> -Sierra Wireless, Incorporated EM7430。umbにより認識はされてる。ifconfigでもネットワークインターフェースとして表示されてる。simカード持ってないから試せない。 -</td> -</tr> - -<tr> -<td>Bluetooth</td> -<td>×</td> -<td> -OpenBSDはBluetoothが嫌い。ugenにより認識はされてる。 -</td> -</tr> - -</table> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/rp2040_1.html b/pub/computer/rp2040_1.html @@ -1,743 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>RP2040 SDKなしでLチカ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>RP2040 SDKなしでLチカ</h1> -<time>2023-04-25</time>: 作成<br /> -<time>2024-02-25</time>: ベクターテーブルの修正 - -<h2>はじめに</h2> -<p> -パタヘネのRISC-V<sup>[1]</sup>版を買って一通り読んだらアセンブリ言語で組込のプログラミングがしたくなった。RISC-Vのマイコンボードが欲しかったのだが、安くていい感じのものが見付からなかった。代わりに秋月電子通商でArmのものがあった。RP2040マイコンボードキット<sup>[2]</sup>というものである。ウェブ上の情報も多く、データシート<sup>[3]</sup>もしっかりしていそうなので、とりあえずこれを買ってみた。</p> -<p> -一般的にはSDK<sup>[4]</sup>をダウンロードしてあらかじめ用意されたライブラリを使って開発するようだが、これはビルドシステムとしてcmakeというのを使っている。これがOpenBSDでは何かエラーがでて動かなかった。僕はこういう便利ツールが嫌いだ。どうせ使わんからいいんやけど。関係ないけど途中から開発環境がLinuxに替わった。SDKには便利な関数がたくさん用意されているので楽である。ハードウェアの面倒な部分がプログラマから見えないようにしているからである。しかし今回はその面倒な部分に触れてみたくて買ったので、SDKを使うと意味がない。</p> -<p> -ということでSDKなしで開発してみる。とりあえず定番のLチカをば。</p> -<p> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a> -</p> - -<h2>動作環境</h2> -<ul> -<li>Arch Linux 6.2.12-arch1-1 - <ul> - <li>arm-none-eabi-binutils 2.40-1</li> - <li>GNU Make 4.4.1</li> - </ul> -</li> -<li>OpenBSD 7.3 - <ul> - <li>arm-none-eabi-binutils 2.31.1</li> - <li>make (バージョン?)</li> - </ul> -※<code>make flash</code>は動かん。<code>dmesg</code>でデバイス確認して手動でマウントする必要がある。 -</li> -</ul> - -<h2>Boot Process</h2> -<p> -RP2040は電源を入れるといくつかの段階(ここでは関係ないので省略。データシート「2.8.1 Processor Controlled Boot Sequence」に詳しく書いてある)を踏んだあと、外部のフラッシュROMの先頭から256バイトを内部のSRAMにコピーして、フラッシュにプログラムが書き込まれているかどうか確認する。RP2040はフラッシュの先頭252バイトから計算したCRC32チェックサムを、直後の253バイト目から256バイトに記録することになっている。起動時にこのチェックサムを確認することで、フラッシュにプログラムが書き込まれているかどうか確かめている。コピーした最後の4バイトと起動時に最初の252バイトから計算したチェックサムが一致していれば、そのままコピーしてきた256バイトの先頭にPCをセットして実行を開始する。一致しなければUSBデバイスモードに切り替わり、パソコンに接続するとストレージとして認識される。このストレージにUF2という形式に変換したプログラムをコピーするとプログラムがフラッシュROMやSRAMに書き込まれる。 -</p> -<p> -以上のことから、プログラムを実行するためにはCRC32を計算し、UF2という形式に変換することが必要である。ソースコードからの流れは以下の通り: -</p> -<pre>source bin bin with -code ----------&gt; object ------&gt; elf --------&gt; bin -------&gt; with --------&gt; crc32 in - crc32 uf2 format - assemble link objcopy bincrc bin2uf2 -</pre> - -<h2>CRC(巡回冗長検査)</h2> -<p> -入力のデータをごにょごにょしてある値を出力する。</p> -<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"> -<p> -データ転送等に伴う偶発的な誤りの検査によく使われている<sup>[5]</sup>。 -</p> -</blockquote> -<p> -らしい。 -</p> -<p> -入力のビットを一列に並べて、除数で「割り算」していく。この「割り算」が多項式の除算に似ているので、この除数をCRC多項式というらしい。ただし多項式の除算と違い、引き算するところをXORする。CRC32の場合、除数は33ビットである。33ビットで割ると32ビットの余りが残る。この余りがCRC32のチェックサムである。除数は色々あるようだが、標準的なものがWikipedia<sup>[5]</sup>に列挙されている。除数<code>1011</code>を使ったCRC3の計算の手順は以下の通り: -</p> -<pre><code>1110101011011100110101101101111 入力(適当) -1011 除数(4ビット) -------------------------------- - 101101011011100110101101101111 結果(入力と除数のXOR) - 1011 - ------------------------------ - 00001011011100110101101101111 - 1011 - ------------------------- - 000011100110101101101111 - 1011 - -------------------- - 1010110101101101111 - 1011 - ------------------- - 001110101101101111 - 1011 - ---------------- - 101101101101111 - 1011 - --------------- - 00001101101111 - 1011 - ---------- - 110101111 - 1011 - --------- - 11001111 - 1011 - -------- - 1111111 - 1011 - ------- - 100111 - 1011 - ------ - 01011 - 1011 - ---- - 000 CRC3チェックサム -</code></pre> -<p> -普通の割り算と基本は同じであるが、引き算の部分だけXORになっている。</p> -<p> -以上の計算をプログラムの先頭252バイトに対して、33ビットの除数を用いて行う。データの並べ方は、上の例において左側を先頭に、フラッシュROM上の0番地から、各バイトは最上位ビットから順に並べる。入力のデータは253バイト目から256バイト目に<code>0</code>をひっつけて計算する。これは多分予め長さが分からないデータでも計算できるようにしたかったからかな。除数は<code>0x104c11db7</code>である(最上位ビットは常に1なのでデータシートでは省略されている)。</p> -<p> -入力データは1バイトづつ処理したいみたいである。多分通信等で使う都合である。この時XORは結合則が成り立つので1バイト処理した結果と次のバイトとをXORして次の処理の入力として利用することができる: -</p> -<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) -|......| -111000110000000000000000000000000 先頭1バイト -100000100110000010001110110110111 除数 ------------------------------------------------------------------------- -011000010110000010001110110110111 - 100000100110000010001110110110111 - ----------------------------------------------------------------------- - 010000001010000110010011011011001 - 100000100110000010001110110110111 - ---------------------------------------------------------------------- - 000000110010001110101000000000101 -|......| - 110010001110101000000000101000000 1バイト目の結果 - |......| - 10000001 入力の2バイト目 - ---------------------------------------------------------------- - 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR - 100000100110000010001110110110111 除数 - ---------------------------------------------------------------- - 000100011011010010001111100110111 - . - . - . -</code></pre> -<p> -以上の操作は以下のようなアルゴリズムのループで実装できる。</p> -<ul> -<li>前回の結果と、入力データの次のバイトをXOR</li> -<li> - <ul> - <li>先頭の1ビットが1の場合、除数とXORを取り左シフト</li> - <li>先頭の1ビットが0の場合、そのまま左シフト</li> - </ul> -</li> -</ul> -<p> -これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。更にこの工程を32ビットの<code>int</code>だけで行うことを考える: -</p> -<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) - -11111111111111111111111111111111 0xffffffff -11100011000000000000000000000000 先頭1バイトを24ビットシフト --------------------------------- XOR -00011100111111111111111111111111 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00111001111111111111111111111110 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01110011111111111111111111111100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -11100111111111111111111111111000 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -11001111111111111111111111110000 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -11001011001111101110001001000111 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -10010110011111011100010010001110 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -10010010101111001101100100111001 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -00100101011110011011001001110010 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -00100001101110001010111111000101 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01000011011100010101111110001010 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -10000110111000101011111100010100 1バイト目の結果 - -10000001 入力の2バイト目 --------------------------------- XOR -00000111111000101011111100010100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00001111110001010111111000101000 -. -. -. -</code></pre> -<p> -これを実装したのが以下のコード:</p> -<pre><code>uint32_t -crc32(uint8_t *idata, size_t len) -{ - uint32_t pol = 0x04C11DB7; - uint32_t c = 0xFFFFFFFF; - uint32_t b; - - for (int i = 0; i &lt; len; i++) { - b = idata[i] &lt;&lt; 24; - c ^= b; - for (int j = 0; j &lt; 8; j++) { - c = c &gt;&gt; 31 & 1 ? c &lt;&lt; 1 ^ pol : c &lt;&lt; 1; - } - } - - return c; -} -</code></pre> -<p> -<code>main()</code>関数では上の<code>crc32()</code>に、<code>idata</code>として入力となるバイナリデータの先頭を、<code>len</code>として<code>252</code>を渡してCRC32を計算させる。その後、出力先のファイルに入力元のデータをコピーしていき、253バイト目から256バイト目だけ、計算したCRC32に置き換える。入力元のこの場所にデータが書き込まれていないかどうかは確かめていない。 -</p> - -<h2>UF2(USB Flashing Format)</h2> -<p> -Microsoftが開発したフラッシュ書き込み用のファイル形式らしい: -<blockquote cite="https://github.com/microsoft/uf2"> -<p> -UF2 is a file format, developed by Microsoft for PXT (also known as -Microsoft MakeCode), that is particularly suitable for flashing microcontrollers -over MSC (Mass Storage Class; aka removable flash drive)<sup>[6]</sup>. -</p> -</blockquote> -<p> -このファイルに変換する上で必要な情報はGitHubのmicrosoft/uf2<sup>[6]</sup>に表として纏められている: -<blockquote cite="https://github.com/microsoft/uf2"> -<table> -<thead><tr> -<th>Offset</th><th>Size</th><th>Value</th> -</tr></thead> -<tbody> -<tr> -<td>0</td> -<td>4</td> -<td>First magic number, <code>0x0A324655</code> (<code>"UF2\n"</code>)</td> -</tr> -<tr> -<td>4</td> -<td>4</td> -<td>Second magic number, <code>0x9E5D5157</code></td> -</tr> -<tr> -<td>8</td> -<td>4</td> -<td>Flags</td> -</tr> -<tr> -<td>12</td> -<td>4</td> -<td>Address in flash where the data should be written</td> -</tr> -<tr> -<td>16</td> -<td>4</td> -<td>Number of bytes used in data (often 256)</td> -</tr> -<tr> -<td>20</td> -<td>4</td> -<td>Sequential block number; starts at 0</td> -</tr> -<tr> -<td>24</td> -<td>4</td> -<td>Total number of blocks in file</td> -</tr> -<tr> -<td>28</td> -<td>4</td> -<td>File size or board family ID or zero</td> -</tr> -<tr> -<td>32</td> -<td>476</td> -<td>Data, padded with zeros</td> -</tr> -<tr> -<td>508</td> -<td>4</td> -<td>Final magic number, <code>0x0AB16F30</code></td> -</tr> -</tbody> -</table> -</blockquote> - -<p> -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バイト目にブロックの通し番号と総数をそれぞれ書き込めばいい。ブロックの通し番号はデータのついでに書き込めるが、総数はデータを全部さばいた後でないと分からないので、最後全てのブロックにまとめて書き込むようにした。できたのが以下のコード: -</p> -<pre><code>#include &lt;stdio.h&gt; -#include &lt;stdint.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;string.h&gt; - - -size_t -fwrite32l(uint32_t d, FILE *f) -{ - int i; - uint8_t b; - for (i = 0; i &lt; 32; i += 8) { - b = (uint8_t) (d &gt;&gt; i & 0xff); - fwrite(&amp;b, 1, 1, f); - if (ferror(f)) { - fprintf(stderr, "Fwrite32l: write error.\n"); - return 0; - } - } - return 4; -} - -int -main(int argc, char *argv[]) -{ - FILE *src = NULL, *dst = NULL; - size_t sdata = 476; - int retnum = 0; - - uint32_t mag1 = 0x0A324655; - uint32_t mag2 = 0x9E5D5157; - uint32_t flags = 0x00002000; // familyID present - uint32_t addr = 0x10000000; - uint32_t nbyte = 256; - uint32_t blk = 0; - uint32_t nblk = 0; - uint32_t famid = 0xe48bff56; - uint8_t data[sdata]; - uint32_t mag3 = 0x0AB16F30; - - memset(data, 0, sdata); - - if (argc != 3) { - fprintf(stderr, "Usage: %s src dst\n", argv[0]); - exit(1); - } - - if ((src = fopen(argv[1], "rb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[1]); - retnum = 1; - goto defer; - } - if ((dst = fopen(argv[2], "wb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - while (!feof(src)) { - fwrite32l(mag1, dst); - fwrite32l(mag2, dst); - fwrite32l(flags, dst); - fwrite32l(addr, dst); - fwrite32l(nbyte, dst); - fwrite32l(blk, dst); - fwrite32l(nblk, dst); // dummy - fwrite32l(famid, dst); - - fread(data, 1, nbyte, src); - if (ferror(src)) { - fprintf(stderr, "Read error: %s.\n", argv[1]); - retnum = 1; - goto defer; - } - fwrite(data, 1, sdata, dst); - if (ferror(src)) { - fprintf(stderr, "Write error: %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - fwrite32l(mag3, dst); - - addr += nbyte; - blk++; - nblk++; - } - - for (int i = 0; i &lt; nblk; i++) { - if (i == 0) - if (fseek(dst, 24, SEEK_SET) &lt; 0) { - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - fwrite32l(nblk, dst); - if (i &lt; nblk - 1) - if(fseek(dst, 512 - 4, SEEK_CUR) &lt; 0){ - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - } - -defer: - if (src) - fclose(src); - if (dst) - fclose(dst); - return retnum; -} -</code></pre> -<p><code>fwrite32l()</code>関数は指定されたファイルに32ビットの整数を下位バイトから順に書き込む関数である。バイトオーダーとかややこしそうなので作っておいたけど必要なのかな?あと名前が気に入らない。</p> -<p> -CRC32のチェックサムが書き込まれたバイナリファイルを、このプログラムでUF2に変換し、生成されたファイルをUSBストレージとして接続したRP2040にコピーすればフラッシュROMに書き込まれる。 -</p> - -<h2>Flash Second Stage</h2> -<p> -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にデータをコピーすることなく命令を実行できるので、速くて便利だという。 -</p> -<p> -しかしこのSSIコントローラはSynopsysという会社のDW_apb_ssiというIPを使っているようで、データシートのSSIコントローラの章は多分Synopsysの人が書いている。その他の章はRaspberry Pi財団の書いたブリティッシュイングリッシュだが、この部分だけ多分ネイティブじゃない人の書いたいい加減な英語である。誤植も多い。何日かかけて理解しようとしたがよく分からん。不毛なので一旦諦めた。</p> -<p> -RP2040には内部にもROMがあり、はバージョン情報や電源を投入した時の動作、その他便利な関数が書き込まれている。この関数の中に外部のフラッシュROMとSSIコントローラを設定するものも含まれているので、今回はこれを利用した。ただしこの方法だとフラッシュROMとの通信方式がStandard SPIのままなので少し遅いらしい。詳しくはデータシートの「2.3.8. Bootrom Contents」を参照。 -</p> -<p> -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モードになる: -</p> -<pre><code>setup_xip: - ldr r3, rom_base - - ldrh r0, [r3, #0x14] // rom_func_table - ldr r1, =('C' | 'X' &lt;&lt; 8) // _flash_enter_cmd_xip() - ldrh r2, [r3, #0x18] // rom_table_lookup - blx r2 - blx r0 -/* ... */ -rom_base: - .word 0x00000000 -</code></pre> - -<p> -XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。Armのマニュアル<sup>[7]</sup>によると、初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:</p> -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition"> -<table> -<caption> -Table 7.3. Exception numbers -</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> -</table> -</blockquote> - -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table"> -<table> -<caption> -Table 7.4. Vector table format -</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> -</table> -</blockquote> -<p> -RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は256バイトでアラインする必要がある。ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からはラベルを使ってアクセスすることにする。以上をまとめると以下のコードになる:</p> -<pre><code> ldr r0, =vectors - ldr r1, m0plus_vtor - str r0, [r1, #0] // vector table - ldr r1, [r0, #4] // entry point - ldr r0, [r0, #0] // stack pointer - mov sp, r0 - bx r1 - -/* ... */ - -m0plus_vtor: - .word 0xe0000000 + 0xed08 -</code></pre> -<p>なお以上のコードは<code>.boot2</code>という名前のセクションにしてある。 -</p> - -<h2>メインのコード(<code>main.s</code>)</h2> - -<h3>ベクターテーブル</h3> -<p> -上で説明したように、ベクターテーブルのアドレスは256バイトの境界にないといけないが、<code>boot2.s</code>をフラッシュの最初の256バイトに配置しており、<code>main.s</code>はその直後から始まるようにリンクする。そのためメインのコードの最初にベクターテーブルを配置すればいい。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、<code>.global</code>宣言をつけておく: -</p> -<pre><code> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) -</code></pre> -<p> -<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> - -<h3>GPIOの設定</h3> -<p> -電源投入直後、RP2040の周辺機器はリセット状態になっている。まずは今回利用するGPIOのリセット状態を解除する必要がある。データシートの「2.14. Subsystem Resets」には以下のように書かれている: -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -Every peripheral reset by the reset controller is held in reset at power-up. -It is up to software to deassert the reset of peripherals it intends to use. -</p> -</blockquote> -<p> -リセット状態を解除するには、RESETS_BASE(<code>0x4000c000</code>)から<code>0x0</code>バイト目のRESETS: RESETレジスタのうち利用したい周辺機器のビットを<code>0x0</code>にすればいい。 -GPIOはIO Bank 0なので(これ明記されてなくない?)、RESETS: RESETレジスタのIO_BANK0(5番ビット)を<code>0x0</code>にする。 -</p> -<h4>レジスタのアトミックなクリア</h4> -<p> -RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>にしたい。この時、まずこのレジスタを読み込んでから<code>~(1 &lt;&lt; 5)</code>と論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを一回の<code>str</code>でしかもアトミックにできる機能が用意されている。今回の場合アトミックかどうかは関係ないと思うけど。</p> -<p> -各レジスタには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> -<h4>リセット状態の確認</h4> -<p>リセットの解除はすぐに完了するわけではないようである。リセットの解除が完了したかどうか確認するにはRESETS: RESET_DONEレジスタ(RESETS_BASEから<code>0x8</code>バイト目)の該当するビット(ここでは5番目のビット)を読む。この値が<code>0x1</code>であればリセットの解除が完了している。<code>0x0</code>であれば処理が進行中なので<code>0x1</code>が返ってくるまで繰り返し読み込んで<code>0x0</code>になるまで待機する。ところでこのレジスタはリセットの解除が完了したかどうか確かめるものなので、RESET_DONEという名前はどうなん? -<p> -以上から、GPIOのリセットを解除するのは以下のコード: -</p> -<pre><code>reset: - // unreset gpio - mov r0, #1 - lsl r0, r0, #5 // io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET -reset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - tst r0, r1 - beq reset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの機能の選択</h3> -<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> -<p> -GPIO25番の機能を選択するにはIO_BANK0_BASE(<code>0x40014000</code>)から<code>0xcc</code>番目のGPIO25_CTRLレジスタの下位5ビットに、該当する機能の番号を書き込めばいい。データシートの「2.19.2 Function Select」にある表を見ると、GPIO25番のSIOは5である:</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #5 // sio - mov r1, #0xcc - str r0, [r3, r1] // IO_BANK0: GPIO25_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>GPIOの出力を有効化</h3> -<p> -GPIO25番がSIOになったので、次にこのピンからの出力を有効化する。既定値では出力は無効になっている。ハイインピーダンスってことなのかな?出力を有効にするには、SIO_BASE(<code>0xd0000000</code>)から<code>0x24</code>バイト目のSIO: GPIO_OEレジスタの該当するビット(25番のピンなので25番ビット)を<code>0x1</code>にする: -</p> -<pre><code> // enable gpio output - ldr r3, sio_base - mov r0, #1 - lsl r0, r0, #25 // gpio25 - str r0, [r3, #0x24] // SIO: GPIO_OE - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> - -<h3>LEDの点滅</h3> -<p>以上でGPIOの設定は完了したので、あとは実際にLEDに電圧を掛けるだけである。レジスタのアドレスに<code>0x1000</code>を足したものに書き込むとアトミックなレジスタのXORができると書いたが、SIOはこの機能がサポートされていないようである。データシートの「2.1.2 Atomic Register Access」に、 -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -The SIO (Section 2.3.1), a single-cycle IO block attached directly to the cores' -IO ports, does <strong>not</strong> support atomic accesses at the bus level, -although some individual registers (e.g. GPIO) have set/clear/xor aliases. -</p> -</blockquote> -<p> -と書かれている。そのかわりここにも書かれている通り、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> - -<pre><code> // blink led on gpio25 - ldr r4, sio_base - mov r5, r0 // r0 = 1 &lt;&lt; 25 -loop: - str r5, [r4, #0x1c] // SIO: GPIO_OUT_XOR - bl delay - b loop - -delay: - mov r0, #1 - lsl r0, r0, #20 -delay_loop: - sub r0, r0, #1 - bne delay_loop - bx lr - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> -<p>なお以上のコードは<code>.text</code>セクションである。</p> - -<h2>リンカスクリプト</h2> -<p> -以上のコードには<code>.boot2</code>、<code>.text</code>の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.text</code>はその後ろに続くように配置する: -<pre><code>MEMORY -{ - FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k -} - -SECTIONS -{ - .boot2 : { - *(.boot2) - . = 0x100; - } > FLASH - - .text : { - *(.text) - } > FLASH -} -</code></pre> - -<h2>Makefile</h2> -<p> -以上のソースコードは以下のように配置している: -</p> -<pre>rp2040 -├── ex1 -│   ├── Makefile -│   ├── boot2.s -│   ├── main.s -│   └── memmap.ld -└── tools - ├── Makefile - ├── bin2uf2.c - └── bincrc.c -</pre> -<p> -toolsディレクトリのMakefileは同じディレクトリのソースファイルを<code>$(CC)</code>でコンパイルするだけのものである(個人的な趣味で<code>tcc</code>を使っている)。ex1ディレクトリのMakefileは以下の通り: -</p> -<pre><code>AS = arm-none-eabi-as -LD = arm-none-eabi-ld -OBJCOPY = arm-none-eabi-objcopy -BINCRC = ../tools/bincrc -BIN2UF2 = ../tools/bin2uf2 - -MCPU = -mcpu=cortex-m0plus -ASFLAGS = $(MCPU) -CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c -LDFLAGS = --no-relax -nostdlib - -all: tools led.uf2 - -clean: - rm -f *.o *.elf *.uf2 *.bin - cd ../tools &amp;&amp; make clean - -.s.o: - $(AS) $(ASFLAGS) -o $@ $&lt; - -led.elf: boot2.o main.o memmap.ld - $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o main.o - -led.bin: led.elf - $(OBJCOPY) -O binary led.elf $@ - -led.uf2: led.bin - $(BINCRC) led.bin led_crc.bin - $(BIN2UF2) led_crc.bin $@ - -flash: all - mount /dev/disk/by-label/RPI-RP2 /mnt - cp led.uf2 /mnt - -tools: - cd ../tools &amp;&amp; make -</code></pre> - -<p> -RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し、ex1ディレクトリで</p> -<pre><code>$ make -# make flash -</code></pre> -<p> -とすればプログラムがRP2040のボードに書き込まれて実行が開始される。</p> - -<h2>最後に</h2> -<p> -光あれ。 -</p> - -<h2>参考</h2> -<ul> -<li> -[1] Hennesy, J. L. and Patterson, D. A. 2017. Computer Organization And Design RISC-V Edition. -</li> -<li> -[2] <a href="https://akizukidenshi.com/catalog/g/gK-17542/">RP2040マイコンボードキット.秋月電子通商</a> -</li> -<li> -[3] <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[4] <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -[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> -</li> -<li> -[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a> -</li> -<li> -[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/rp2040_2.html b/pub/computer/rp2040_2.html @@ -1,430 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>RP2040 SDKなし2 Clock、UART</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>RP2040 SDKなし2 Clock、UART</h1> -<time>2024-02-22</time><br /> -<time>2024-02-27</time>: リセット解除の間違いを修正。 -<p> -今回はClockとUARTを設定してパソコンに繋ぎ、キーボードからの入力をオウム返しするプログラムを作成する。 -<p> -<p> -前回: <a href="rp2040_1.html">RP2040 SDKなしでLチカ</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex2 -</p> - -<h2>動作環境</h2> -<ul> -<li>Void Linux - <ul> - <li>cross-arm-none-eabi-binutils-2.32_2</li> - <li>GNU Make 4.4.1</li> - <li>minicom version 2.7.1</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>Clock</h2> - -<h3>リング発振回路</h3> -<p>RP2040にはリング発振回路というのが内蔵されている。これは自分の出力を反転させようとするもので、不安定だが高速で消費電力の少ないクロックとして用いられる。RP2040は電源を入れると、このリング発振回路を動作用のクロックとして用いている。この発振回路の周波数は、チップの製造過程での誤差、動作時の電圧、動作温度によって変動するので、正確な周波数が必要な用途には向かない。</p> - -<h3>水晶発振子</h3> -<p>秋月電子通商で購入したRP2040マイコンボードには外部クロックとして、12MHzの水晶発振子が付属する。水晶発振子はリング発振回路より電力を消費するが、より正確である。</p> - -<h3>PLL</h3> -<p>水晶振動子を入力として、周波数を数倍にしたものを出力するもの。電気的な話はよく知らない。データシートの「2.18.2. Calcurating PLL parameters」によると、入力周波数を<code>FREF</code>としたときの出力周波数は<code>(FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2)</code>となる。これらの変数はそれぞれ設定用のレジスタに値を保存することで変更できる。</p> - -<h2>UART</h2> -<p> -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> -<pre><code>$ minicom -D /dev/ttyUSB0 -</code></pre> -<p> -とすると接続できる。 -</p> - -<h2>main.s</h2> -<h3>初期設定</h3> -<p> -後で見るように、UARTの動作には多分水晶発振子とPLLが必要なので、まずはそれを設定する。起動後、メインのプログラムが読み込まれるまでの<code>boot2</code>は前回と同じものである。<code>main.s</code>ではまず前回と同様に初期スタックポインタとエントリーポイントを定義する: -</p> -<pre><code> .section .vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point -</code></pre> -<p> -続いて利用するサブシステムのリセットを解除する。PLLとUARTが追加されている。今回使うUARTはUART0だけである。なお、UARTはclock_periが有効化されるまでリセット状態の解除が完了しないようなので、unreset_chkからは外してある:</p> -<pre><code> .section .text -reset: - // unreset gpio, pll_sys, uart0 - ldr r0, =(1 &lt;&lt; 22 | 1 &lt;&lt; 12 | 1 &lt;&lt; 5) // uart0 | pll_sys | io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET - mov r1, #1 - lsl r1, #22 - bic r0, r1 // uart stays in reset state until clock_peri is enabled -unreset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - bic r0, r1 - bne unreset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの設定</h3> -<p> -次にGPIOの役割を設定する。前回はLEDを点滅させるためにGPIO25をSIOに設定したが、今回はGPIO0とGPIO1をUART0にする: -</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #2 // uart0 - mov r1, #0x4 - str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL - mov r1, #0xc - str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>Clockの設定</h3> -<p> -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>で、 -</p> -<pre><code>#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER) -</code></pre> -<p> -と定義されている(PICO_XOSC_STARTUP_DELAY_MULTIPLIERは1)。とりあえず47に設定しているが、試しに0や1にしても動いた。よくわからん。</p> -<p> -待ち時間を設定したら発振子を起動する。XOSC: CTRLに起動用のコマンド的なものを入力し、周波数が安定するのを待つ。</p> -<p> -以上を実装したのが以下のコード: -</p> -<pre><code> // setup xosc - ldr r3, xosc_base - mov r0, #47 // start up delay for 12MHz rosc (xosc?) - str r0, [r3, #0xc] // XOSC: STARTUP - ldr r0, =(0xfab &lt;&lt; 12 | 0xaa0) - str r0, [r3, #0] // XOSC: CTRL -wait_xosc: - ldr r0, [r3, #0x4] // XOSC: STATUS - lsr r0, r0, #31 // STABLE bit - beq wait_xosc - -/* ... */ - -xosc_base: - .word 0x40024000 -</code></pre> - -<h3>PLLの設定</h3> -<p> -水晶発振子が起動できたので、次にPLLを設定する。CPUが133MHzまで対応しているので133MHzになるようにした。</p> -<p> -PLLは入力となる振動(ここでは水晶発振子の振動)を加工して周波数を上げたり下げたりする。出力の周波数は以下の式で決まる: -</p> -<pre>(FREF / REFDIV) * FBDIV / (POSTDIV1 * POSTDIV2)</pre> -<p> -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つの値の差が大きい方がいいと書いている)。 -</p> -<p> -PLL設定の手順は、FBDIVの設定、PLLとVCOの起動、VOCが安定するまで待機、POSTDIV1とPOSTDIV2の設定、Post Dividerの起動、そして最後にシステムとUARTのクロックを今設定したPLLに変更、である。以上を実装したのが以下のコード: -</p> -<pre><code> // setup pll_sys 133MHz - ldr r3, pll_sys_base - // set feedback divider - mov r0, #133 - str r0, [r3, #0x8] // PLL: FBDIV_INT - // power on pll and vco - ldr r0, =(1 &lt;&lt; 5 | 1) // VCOPD | PD - ldr r1, atomic_clr - add r1, r1, #0x4 - str r0, [r3, r1] // PLL: PWR - // wait vco to lock -wait_vco: - ldr r0, [r3, #0] // PLL: CS - lsl r0, r0, #31 - beq wait_vco - // setup post dividers - ldr r0, =(4 &lt;&lt; 16 | 3 &lt;&lt; 12) - str r0, [r3, #0xc] // PLL: PRIM - // power on post divider - mov r0, #8 // POSTDIVPD - str r0, [r3, r1] // PLL: PWR - - // set system clock clksrc_pll_sys - ldr r3, clocks_base - ldr r0, =(0x0 &lt;&lt; 5 | 0x1) - str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL - // enable clk_peri - mov r0, #1 - lsl r0, r0, #11 - str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL - -/* ... */ - -atomic_clr: - .word 0x00003000 -clocks_base: - .word 0x40008000 -pll_sys_base: - .word 0x40028000 -</code></pre> - -<h3>UARTの設定</h3> -<p> -データシートによるとUART設定の手順は以下の通り: -</p> -<ul> -<li>リセットの解除</li> -<li>clock_periの設定</li> -<li>UARTの有効化</li> -<li>FIFOの有効化</li> -<li>転送速度の設定</li> -<li>フォーマットの設定</li> -</ul> -<p> -上の2つは既に終えている。残りの部分はこの順番どおりに設定しても動かなかった。C言語で書かれたサンプルを見ると、クロックを設定した後、転送速度の設定、UARTの有効化、FIFOの有効化の順になっている。そのとおりにすると動いた。理由はよく理解していないが、変数を設定してから起動するほうが素直ではある。</p> -<p> -転送速度はminicomのデフォルトである115200 baudに設定する。データシート「4.2.7.1. Baud Rate Calculation」の計算式において、クロック周波数を125MHzから133MHzに変えて計算して、BRDI=72、BDRF=0.157(=10/64)となる。この数値をUART: UARTIBRD、UART: UARTFBRDレジスタにそれぞれ代入する。 -</p> -<p> -UARTの有効化はUART: UARTCRレジスタのUARTENビットをセットすることで行う。C言語のサンプルでは同じレジスタのRXE、TXEビットもセットしているが、この2つはもともと1になっているのでほっといてよさそう。</p> -<p> -FIFOの有効化はUART: UARTLCR_HレジスタのFENビットをセットすることで行う。また、同じレジスタの他のビットで、データーのフォーマットを設定できる。ここではminicomのデフォルトに合わせてWLENを8bitにする。</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre><code> // setup uart0 - ldr r3, uart0_base - // set baudrate 115200 - // BDRI = 72, BDRF = 0.157 (10 / 64) - mov r0, #72 - str r0, [r3, #0x24] // UART: UARTIBRD - mov r0, #10 - str r0, [r3, #0x28] // UART: UARTFBRD - // enable uart0 - mov r0, #1 // UARTEN - ldr r1, atomic_set - add r1, r1, #0x30 - str r0, [r3, r1] // UART: UARTCR - // enable FIFO and set format - ldr r0, =(3 &lt;&lt; 5 | 1 &lt;&lt; 4) // WLEN = 8, FEN = 1 - str r0, [r3, #0x2c] // UART: UARTLCR_H - -/* ... */ - -atomic_set: - .word 0x00002000 -uart0_base: - .word 0x40034000 -</code></pre> - -<h3>UARTの入出力</h3> -<p> -設定が終わったので実際にUARTの入出力を処理するコードを書く。まずUARTからの出力は、出力したいバイトをUART: UARTDRに書き込むことで行う。その際、書き込まれたデータは一時的に出力用FIFOに保持されるので、このFIFOが満杯でないことを確認する必要がある。FIFOの状態はUART: UARTFRレジスタで確認できる。このレジスタのTXFFの値が1であればデータを書き込めないので、0になるまで待機する。関数名は<code>putbyte</code>にした。また出力したいデータは<code>r0</code>レジスタにの下位8ビットに入れられているものとした。書き込めるデーターは8ビットだけなので、<code>0xff</code>と論理積をとってから書き込んでいる: -</p> -<pre><code>putbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #5 // TXFF -txff: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne txff - mov r1, #0xff - and r0, r0, r1 - str r0, [r3, #0] // UART: UARTDR - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> - -<p> -入力はUART: UARTDRの下位8ビットを読むことで得られる。UARTからの入力は、一時的に入力用FIFOに保存される。このFIFOが空の状態でデータを読んでも意味がないので、FIFOが空でないことを確認する必要がある。これはUART: UARTFRレジスタのRXFEを読むことで確認できる。本来は入力があったときに割り込みを発生させて、それまではCPUを休ませるか別の処理をさせておくべきだが、とりあえずここではループでFIFOの状態を確認し続けている。関数名は<code>getbyte</code>にした。 -読み込んだデータは<code>r0</code>レジスタに保存している:</p> -<pre><code>getbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #4 // RXFE -rxfe: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne rxfe - ldr r0, [r3, #0] // UART: UARTDR - mov r1, #0xff - and r0, r0, r1 - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> -<p> -あとはこの2つの関数をループの中で交互に呼び出せば、オウム返しするだけのプログラムが完成する: -</p> -<pre><code>loop: - bl getbyte - bl putbyte - b loop -</code></pre> - -<h2>リング発振回路でUARTは動くんかな?</h2> -<p>UARTの通信には正確なクロックが必要である。その為上では<code>clk_peri</code>として水晶発振子とPLLを用いた。ところがpico-examplesのhello_uartでは<code>main()</code>関数で水晶発振子を設定していない。そこでリング発振回路を用いてみたのだが、どうもうまく通信できない。出力されている正確な周波数も分からないのであきらめることにした。オシロスコープなんていうものは持っていない。</p> - -<h3>pico-sdk</h3> -<p> -ところがどうも調べているとSDKを使った場合、デフォルトではクロック周波数は125MHzになっているらしい。どうやら水晶発振子もPLLも<code>main()</code>が呼ばれる前に設定されているようである。</p> -<p> -pico-examplesのサンプルプログラムはビルドすると自動で逆アセンブリしたファイルを出力してくれる。これを見ると、最初の256バイトは前回説明したboot2のコードで、その後ろにベクターテーブルが続く。ベクターテーブルの最初は初期スタックポインタで、<code>0x20042000</code>になっている。次はエントリーポイントで、<code>0x100001f7</code>である:</p> -<pre><code>10000100 &lt;__VECTOR_TABLE&gt;: -10000100: 20042000 .word 0x20042000 -10000104: 100001f7 .word 0x100001f7 -</code></pre> -<p> -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ではユーザープログラムの一部として組み込んでるんかな? -</p> -<pre><code>100001f6 &lt;_reset_handler&gt;: -100001f6: 481d ldr r0, [pc, #116] ; (1000026c &lt;hold_non_core0_in_bootrom+0xe&gt;) -100001f8: 6800 ldr r0, [r0, #0] -100001fa: 2800 cmp r0, #0 -100001fc: d12f bne.n 1000025e &lt;hold_non_core0_in_bootrom&gt; -</code></pre> -<p>上のコードの最初の<code>ldr</code>は、<code>0xd0000000</code>(M0PLUS: CPUIDレジスタ)をロードしている。最後の飛び先<code>0x1000025e</code>はCPUIDが<code>1</code>のCPUを待機させる処理である:</p> -<pre><code>1000025e &lt;hold_non_core0_in_bootrom&gt;: -1000025e: 4809 ldr r0, [pc, #36] ; (10000284 &lt;hold_non_core0_in_bootrom+0x26&gt;) -10000260: f001 fb9c bl 1000199c &lt;rom_func_lookup&gt; -10000264: 4700 bx r0 -10000266: 0000 .short 0x0000 -/* ... */ -10000284: 00005657 .word 0x00005657 -</code></pre> -<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> -<pre><code>$ find pico-sdk/src -type f | xargs grep -l _reset_handler -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -</code></pre> -<p>このファイルによると: -</p> -<pre><code> // Only core 0 should run the C runtime startup code; core 1 is normally - // sleeping in the bootrom at this point but check to be sure -</code></pre> -<p>だそうである。やっぱり無駄やん。内蔵フラッシュのプログラムにバグがあってもこのコードのせいで見付かりにくくなってない?知らんけど。</p> - -<p>続いて<code>.data</code>領域と<code>.bss</code>領域のコピー、初期化のようである。多分OSの本かなんかで習ったメモリマップの話:</p> -<pre><code>100001fe: a40d add r4, pc, #52 ; (adr r4, 10000234 &lt;data_cpy_table&gt;) -10000200: cc0e ldmia r4!, {r1, r2, r3} -10000202: 2900 cmp r1, #0 -10000204: d002 beq.n 1000020c &lt;_reset_handler+0x16&gt; -10000206: f000 f812 bl 1000022e &lt;data_cpy&gt; -1000020a: e7f9 b.n 10000200 &lt;_reset_handler+0xa&gt; -1000020c: 4918 ldr r1, [pc, #96] ; (10000270 &lt;hold_non_core0_in_bootrom+0x12&gt;) -1000020e: 4a19 ldr r2, [pc, #100] ; (10000274 &lt;hold_non_core0_in_bootrom+0x16&gt;) -10000210: 2000 movs r0, #0 -10000212: e000 b.n 10000216 &lt;bss_fill_test&gt; - -10000214 &lt;bss_fill_loop&gt;: -10000214: c101 stmia r1!, {r0} - -10000216 &lt;bss_fill_test&gt;: -10000216: 4291 cmp r1, r2 -10000218: d1fc bne.n 10000214 &lt;bss_fill_loop&gt; -</code></pre> - -<p>最後にいろいろ呼びだす:</p> -<pre><code>1000021a &lt;platform_entry&gt;: -1000021a: 4917 ldr r1, [pc, #92] ; (10000278 &lt;hold_non_core0_in_bootrom+0x1a&gt;) -1000021c: 4788 blx r1 -1000021e: 4917 ldr r1, [pc, #92] ; (1000027c &lt;hold_non_core0_in_bootrom+0x1e&gt;) -10000220: 4788 blx r1 -10000222: 4917 ldr r1, [pc, #92] ; (10000280 &lt;hold_non_core0_in_bootrom+0x22&gt;) -10000224: 4788 blx r1 -10000226: be00 bkpt 0x0000 -10000228: e7fd b.n 10000226 &lt;platform_entry+0xc&gt; -/* ... */ -10000278: 10001819 .word 0x10001819 -1000027c: 100002dd .word 0x100002dd -10000280: 10001909 .word 0x10001909 -</code></pre> -<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> -<pre><code>$ find pico-sdk/src -type f | xargs grep -l runtime_init -pico-sdk/src/rp2_common/pico_runtime/runtime.c -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -pico-sdk/src/common/pico_sync/include/pico/mutex.h -</code></pre> -<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> -<pre><code> clock_configure(clk_peri, - 0, - CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS, - 125 * MHZ, - 125 * MHZ); -</code></pre> -<p>やっぱり水晶発振子じゃないとあかんのかな。</p> - -<h2>CMake</h2> -<p>上ではビルドしたバイナリを逆アッセンブルして読んだ。わざわざこんなことをしなくてもMakefile読めばなにがどうなって最終生成物に辿りつくのか分かればいいのだが、そうもいかない。このSDKとpico-examplesにはビルドシステムとしてCMakeなるものが使われている。これがどうも複雑でよく分からない。勉強する気にもならん。上で見た<code>crt0.S</code>や<code>runtime.c</code>といったファイルも<code>hello_uart</code>で本当に使われているものなのかもよく分からない。こんな煩雑なものは本当に必要なのかな。無駄に複雑にしてるだけとちゃうんかな。特に僕は勉強用に使ってるので、ソースコードの依存関係をもっと分かりやすくしてくれないと、内部でなにがどうなってるのか理解しにくい。何度か頑張って読もうとしたが、面白くないのでやめた。数百行のファイルをあっちからこっちから<code>include</code>してるし、大文字ばかりの変数だらけで目が痛い。こんなものを扱えるというのはえらいええ頭してはるんやね。</p> - - -<h2>参考</h2> -<ul> -<li> -<a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -<a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -<a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -<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> -</li> -<li> -<a href="https://www5.epsondevice.com/ja/information/technical_info/osc.html">水晶発振器とは? 原理と仕組み、水晶振動子との違い、選び方のポイントを解説.エプソン水晶デバイス</a> -</li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/rp2040_3_interrupt.html b/pub/computer/rp2040_3_interrupt.html @@ -1,189 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>RP2040 SDKなし3 割り込み</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>RP2040 SDKなし3 割り込み</h1> -<time>2025-08-27</time><br /> -<p> -前回UARTで通信する際、FIFOにデータが届いていないかを確認しつづけていた(ポーリング)。 -これでは電力がもったいないので、データが届くまでCPUは休ませておいて、 -届いたときだけ処理を実行するように変更する(割り込み)。 -<p> -<p> -前回: <a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex3_interrupt -</p> - -<h2>動作環境</h2> -<ul> -<li>OpenBSD 7.7 - <ul> - <li>arm-none-eabi-binutils-2.40</li> - <li>OpenBSD Make</li> - <li>minicom version 2.8</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>割り込み</h2> -<p> -ハードウェアが外部から信号を受けとると、CPUに現在の処理を中断させてその信号を処理させるようにできる。これを割り込み処理という。今回はUARTにデータが届いた時に同じデータをUARTに書き込むようにしたい。</p> - -<h3>割り込みを有効化</h3> -<p> -割り込みの信号を受け取るために、割り込みを有効化する。CPUが割り込みを受け付けるようにする設定と、UARTが割り込み信号を発生させるようにする設定が必要である。</p> -<p> -CPU側の設定は<code>M0PLUS: NVIC_ISER</code>レジスタの有効化したい割り込みのビットに1を書くことで行う。有効化できる割り込みは全部で26個ある。割り込みの種類はrp2040のデータシート[1]のTable 80. Interruptsに書いてある。今回有効化するのはUART0の割り込みで、この表から20番が割り当てられていることが分かるので、<code>M0PLUS: NVIC_ISER</code>に、下から20番目のビットを1にしたもの書き込む:</p> -<code><pre> // enable uart interrupt in cpu - ldr r4, ppb_base - mov r5, #0xe1 - lsl r5, #8 - mov r0, #1 - lsl r0, #20 - str r0, [r4, r5] // M0PLUS: NVIC_ISER - -/* ... */ - -ppb_base: - .word 0xe0000000 -</pre></code> -<p> -UART側の設定は、<code>UART: UARTIMSC</code>レジスタで行なう。データを受け取ったときに割り込みを発生させたいので、<code>RXIM</code>ビットに1を書き込む。また、処理を開始する前に既にFIFOにデータがたまっている可能性があるので、FIFOが空ではないときに割り込みを発生させるように、<code>RTIM</code>にも1を書き込む:</p> -<code><pre> // enable uart interrupt in uart0 subsystem - ldr r1, uart0_base - mov r2, #(1 &lt;&lt; 6 | 1 &lt;&lt; 4) // RTIM | RXIM - str r2, [r1, #0x38] // UART: UARTIMSC -</pre></code> -<p> -また、FIFOにデータがきたらすぐに割り込みを発生させたいので、<code>UART: UARTIFLS</code>レジスタの<code>RXIFLSEL</code>に0を書き込む。これでFIFOの1/8が埋まったら割り込みが発生する。</p> -<code><pre> // set fifo level to 0 - mov r2, #0 - str r2, [r1, #0x34] // UART: UARTIFLS -</pre></code> -<p> -これだとFIFOに届いた瞬間には割り込みがおこらない気がするが、pico-sdk(src/rp2_common/hardware_uart/include/hardware/uart.h)の<code>uart_set_irqs_enabled</code>関数でもこうなってる。FIFOを無効にすれば即座に割り込みがおこるかもしれないが、データが失われる可能性もあるのかな。</p> - -<h3>ベクターテーブルの設定</h3> -<p> -外部からの信号で割り込みが発生したときに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> -<code><pre> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word (uart_interrupt_handler+1) // UART0_IRQ -</pre></code> - -<h3>割り込み処理</h3> -<p> -割り込み発生時に呼ばれる関数はUARTのFIFOに届いたデータをそのまま送信するだけのものである:</p> -<code><pre> // uart_interrupt_handler echos the data arrived at uart0 -uart_interrupt_handler: - push {lr} - bl getbyte - bl putbyte - pop {pc} -</pre></code> -<p> -<code>getbyte</code>、<code>putbyte</code>は前回と同じもの。 -</code> - -<h2>メインループ</h2> -<p> -UARTにデータが届いていないときは特にすることがないのでCPUは寝かせておく。ARMには割り込みが発生するまでなにもしない<code>wfe</code>という命令があるのでこれを使う:</p> -<code><pre>loop: - wfe - b loop -</pre></code> - -<h2>完成</h2> -<p> -これで完成。動作は前回と全く同じだが、消費電力をおさえられる。</p> - -<h2>参考</h2> -<ul> -<li> -[1]. <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[2]. <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -[3]. <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/rtx1200-qos.html b/pub/computer/rtx1200-qos.html @@ -1,147 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</h1> -<time>2022-01-14</time>作成 -<h2>はじめに</h2> -<p>一人暮らししていた頃節約にはまり、下宿の固定回線を解約したうえ、携帯の回線を128kbpsしかでないものに変更したことがある。以来通信費をどうやって抑えるかあれこれ考えてきた。現在は実家に暮らしていて、家で契約している光回線を使わせてもらっている。携帯の方は楽天モバイルであり、外で使うことはまずないので毎月の支払いは発生していない。しかしいずれこの家をでた時に、楽天モバイルの回線だけでは結局月々3278円と大きな出費になる。また、通信速度が遅い生活というのは雑音の少ない充実したものであった経験もある。こんなことを考えていたところ、通信速度が128kbpsだが無料で利用できる格安sim<sup>[1]</sup>を発見した。この速度に慣れておけば、通信費が全くかからない生活ができる。ということで家で使っているルーターの設定を変更し、通信帯域を制限してみた。</p> -<h2>機材</h2> -<ul> - <li>ルーター: Yamaha RTX1200</li> - <li>無線アクセスポイント: elecomのルーター</li> - <li>パソコン: Lenovo x220</li> - <li>パソコンのOS: OpenBSD 7.0</li> -</ul> -<h2>設定したい内容</h2> -<p>RTX1200のLAN2ポートにWANが接続されており、LAN1には家で使っている端末がいろいろ接続されている。LAN3は今回は関係ないので割愛する。LAN1を2つのvlanに分割し、1-7番のポートをvlan1、8番のポートをvlan2する。そしてこのvlan2とインターネットとの通信を上下とも128kbpsに制限する。vlan2と他のlanとの通信は制限しない。vlan2にelecomのルーターを無線アクセスポイントとして接続し、僕が使うパソコンやスマホはこのアクセスポイントに接続する。</p> -<figure> -<pre> - Internet - | - ┌-------┬-----------┬-┴--┬----┐ - |RTX1200|LAN1 |LAN2|LAN3| - └-------┴-┬-------┬-┴----┴----┘ - vlan1 vlan2 - 192.168.100.1 192.168.101.1 - | | - ┌------------┐ | | ┌-----------┐ ┌-----┐ - |home network├--┘ └----┤elecom wifi├---┤my PC| - └------------┘ └-----------┘ └-----┘ - 192.168.100.0/24 192.168.101.0/24 -</pre> -<figcaption>図1: 接続と設定の概略</figcaption> -</figure> - -<h2>vlanについて</h2> -<p>ヤマハのページにvlanについて以下のような説明がある:</p> -<blockquote cite="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">物理的な接続形態に依存せず仮想的にグループを形成してひとつのLANとみなすものが、VLAN(Virtual LAN)です。VLANには、スイッチの物理ポート単位でVLANを形成するポートベースVLANと、パケットにタグと呼ばれるヘッダを付加してVLAN情報を格納するタグVLANとがあります<sup>[2]</sup>。</blockquote> -<p> -ここではLAN1にある8つのポートをvlanによって2つの論理的なLANに分割する。しかしこの後設定するクラス分けでは送信元や宛先のアドレスによる分類ができるので帯域幅を制限したい端末のIPアドレスを固定しておくだけでよかったんやけどな。 -</p> - -<h2>クラス分けについて</h2> -<p>クラス分けについてヤマハのページに以下のような説明がある:</p> -<blockquote cite="https://network.yamaha.com/knowledge/qos">優先して転送するデータを判別するために、受信したデータを分類します。<br /> -データの分類には、転送データに含まれている情報を使用します。<sup>[3]</sup></blockquote> -<p> -各ポートから出ていくパケットについて、そのパケットの送信元アドレスや宛先アドレス等の情報に基づきクラスに分類する。このクラス毎に様々な処理が可能なのだが[要出典]、今回はvlan2とインターネットとの通信をクラス1として、このクラスに対して帯域幅を128kbpsに制限する。 -</p> - -<h2>実際の設定</h2> -<p>RTX1200において行った設定は以下の通り。ただし、LAN2にppの設定をし、LAN1とインターネットとの通信ができるところまでは既に設定済みとし、以降の変更点だけ抜粋する。</p> -<p>始めにLAN1を2つのvlanに分割する: -<pre><code># vlan port mapping lan1.1 vlan1 -# vlan port mapping lan1.2 vlan1 -# vlan port mapping lan1.3 vlan1 -# vlan port mapping lan1.4 vlan1 -# vlan port mapping lan1.5 vlan1 -# vlan port mapping lan1.6 vlan1 -# vlan port mapping lan1.7 vlan1 -# vlan port mapping lan1.8 vlan2 -# lan type lan1 port-based-option=divide-network -</code></pre> -<p> -続いて各vlanの設定を行う。ただしvlan1はlan1の設定を受け継ぐので不要。 -</p> -<pre><code># ip vlan2 address 192.168.101.1/24 -# ip vlan2 secure filter <i>&lt;vlan1と同じパケットフィルター&gt;</i> -</code></pre> -<p>次にクラスフィルターを定義:</p> -<pre><code># queue class filter 1 1 ip 192.168.101.0/24 * * * * -# queue class filter 2 1 ip * 192.168.101.0/24 * * * -# queue class filter 3 2 ip 192.168.100.0/24 192.168.101.0/24 * * * -</code></pre> -<p> -上の2行はvlan2とその他との通信を制限するためのものである。ただしこの2つだけではvlan1からvlan2への通信まで制限してしまうので、それを除外するために3行目のクラスフィルターを定義する。 -</p> -<p>次にクラスフィルタをvlan2に適応。これによりルーターから192.168.101.0/24への通信がフィルタリングされる。</p> -<pre><code># queue lan1 type shaping -# queue vlan2 class filter list 3 2 -</code></pre> -<p> -2行目で指定したフィルターはその指定した順番で評価されるので注意が必要。<br /> -そしてクラスに対する制限を指定: -</p> -<pre><code># queue lan1 class property 1 bandwidth=128k -</code></pre> -<p>次はlan2(pp)にクラスフィルタを適応。これにより192.168.101.0/24からルーターへの通信がフィルタリングされる。</p> -<pre><code># queue lan2 type shaping -# pp select <i>n</i> -pp<i>n</i># queue pp class filter list 1 -</code></pre> -<p> -vlan2の時と同様にクラスに制限を設定: -</p> -<pre><code># queue lan2 class property 1 bandwidth=128k -</code></pre> - -<h2>パソコンでの設定</h2> -<p>最後にパソコンから今回作ったvlan2に接続するように設定する:</p> -<pre><code># cat > /etc/hostname.<i>if</i> &lt;&lt;EOS -join <i>&lt;アクセスポイントのECS-ID&gt;</i> wpakey <i>&lt;アクセスポイントの暗号化キー&gt;</i> -inet 192.168.101.2/24 -EOS -# echo 192.168.101.1 > /etc/mygate -</code></pre> - -<h2>おわりに</h2> -<p>めっちゃ遅い。</p> - -<h2>参考文献</h2> -<ol> - <li><a href="https://www.donedone.jp/plan/">料金プラン-50ギガの大容量SIM | donedone(ドネドネ) ドネーション型モバイルサービス</a>.donedone.2022-01-14閲覧</li> - <li><a href="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">VLAN</a>.RTpro.2022-01-14閲覧</li> - <li><a href="https://network.yamaha.com/knowledge/qos">QoSとは</a>.RTpro.2022-01-14閲覧</li> - <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> -</ol> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/setting_up_web_server.html b/pub/computer/setting_up_web_server.html @@ -1,192 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Webサーバーの設定</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Webサーバーの設定</h1> -<time>2022-06-27</time> - -<h2>はじめに</h2> -<p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p> - -<h2>環境</h2> -<ul> - <li>OS: OpenBSD 7.1</li> - <li>サーバー: httpd(OpenBSDに付属のもの)</li> - <li>サーバー証明書: Let's Encrypt</li> - <li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li> - <li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li> -</ul> - -<h2>設定の概要</h2> -<dl> - <dt>サーバーを用意</dt> - <dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd> - <dt>ドメインの取得とDNSの設定</dt> - <dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd> - <dt>httpdの設定</dt> - <dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd> - <dt>証明書の発行と自動更新の設定</dt> - <dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd> - <dt>ホームページのファイルをアップロード</dt> - <dd>ウェブページで配信したいものをVPSにアップロードする。</dd> - <dt>接続の確認</dt> - <dd>手元のブラウザからアクセスできることを確認。</dd> -</dl> - -<h2>サーバーを用意</h2> -<p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p> - -<h2>ドメインの取得とDNSの設定</h2> -<p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p> -<pre><code>HOST TYPE POINTS TO TTL -<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600 -www.<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600</code></pre> -<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> -<p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p> -<pre><code>$ ping <i>&lt;server_domain&gt;</i> -PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms -^C</code></pre> - -<h2>httpdの設定</h2> -<p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p> -<pre><code>$ doas cp /etc/examples/httpd.conf /etc/ -vi /etc/httpd.conf</code></pre> - -<pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $ - -server "<i>&lt;server_domain&gt;</i>" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location * { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "<i>&lt;server_domain&gt;</i>" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - root "/htdocs/www.<i>&lt;server_domain&gt;</i>" - directory auto index - } -}</code></pre> -<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> -<p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p> -<pre><code>$ doas httpd -n -configration OK</code></pre> - -<h2>証明書の発行と自動更新の設定</h2> -<p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p> -<pre><code>$ doas cp /etc/examples/acme-client.conf /etc/ -$ doas vi /etc/acme-client.conf</code></pre> -<pre><code># -# $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $ -# -authority letsencrypt { - api url "https://acme-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-privkey.pem" -} - -authority letsencrypt-staging { - api url "https://acme-staging-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-staging-privkey.pem" -} - -authority buypass { - api url "https://api.buypass.com/acme/directory" - account key "/etc/acme/buypass-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -authority buypass-test { - api url "https://api.test4.buypass.no/acme/directory" - account key "/etc/acme/buypass-test-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -domain <i>&lt;server_domain&gt;</i> { - alternative names { secure.<i>&lt;server_domain&gt;</i> } - domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - sign with letsencrypt -}</code></pre> -<p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p> -<p>続いて<code>acme-client</code>を実行して証明書を発行する。</p> -<pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre> -<p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p> -<pre><code>$ doas crontab -e</code></pre> -<pre><code>... -#minute hour mday month wday [flags] command -19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd -... -</code></pre> -<p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p> - -<h2>ホームページのファイルのアップロード</h2> -<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> -<pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i> -$ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre> - -<h2>接続の確認</h2> -<p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p> -<pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre> -<p>続いてrcに登録、起動。</p> -<pre><code>$ doas rcctl start httpd -$ doas rcctl enable httpd</code></pre> -<p>ブラウザでアクセスしてみる。</p> - -<h2>おわりに</h2> -<p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p> - -<h2>参考文献</h2> -<ul> - <li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li> - <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> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/videos/ex1.webm b/pub/computer/videos/ex1.webm Binary files differ. diff --git a/pub/computer/videos/ex2.webm b/pub/computer/videos/ex2.webm Binary files differ. diff --git a/pub/computer/videos/ex3.webm b/pub/computer/videos/ex3.webm Binary files differ. diff --git a/pub/computer/videos/ex4.webm b/pub/computer/videos/ex4.webm Binary files differ. diff --git a/pub/computer/videos/ex5.webm b/pub/computer/videos/ex5.webm Binary files differ. diff --git a/pub/computer/videos/ex6.webm b/pub/computer/videos/ex6.webm Binary files differ. diff --git a/pub/computer/what-i-use.html b/pub/computer/what-i-use.html @@ -1,100 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>使用しているハードウェア、ソフトウェア</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>使用しているハードウェア、ソフトウェア</h1> -<time>2025-04-28</time>更新<br> -<time>2021-12-13</time>作成 -<h2>ノートパソコン</h2> -<p>メインのパソコン。</p> -<dl> -<dt>ハードウェア: <a href="openbsd_on_u9310e.html">Fujitsu LIFEBOOK U9310/E</a></dt> -<dd>2013年製のMacBook Airを使っていたがバッテリーがへたってきた。ぱちもんのバッテリーは1年でだめになるのに7千円くらいするのでコスパが悪い。2025年4月に大阪日本橋で見付けたLIFEBOOKを買った。10世代のCore i5で27000円くらい。軽い。ディスプレイが綺麗、OpenBSDと相性がそこそこいい。</dd> -<dt>OS: OpenBSD</dt> -<dd> -使いやすい。 -</dd> - -<dt>Window Manager: <a href="https://git.mtkn.jp/dwm">dwm</a></dt> - -<dt>Terminal: <a href="https://git.mtkn.jp/st">st</a></dt> - -<dt>Text Editor: acme, nvi</dt> -<dd>vimは辞めた。OpenBSDにあったnviが丁度いい。日本語を使うので日本語入力が必要ない場面ではacmeを使っている。</dd> - -<dt>Browser: firefox</dt> -<dd>もうちょっとましなのないんかな。UIころころ変わるし、重いし、嫌い。JavaScriptがないと困るので仕方なく使っているが...特に最近画面上部のUIが大きすぎて邪魔である。</dd> - -<dt>Mail Client: neomutt</dt> -<dd>あんまり好きじゃない</dd> -</dl> - -<h2>デスクトップ</h2> -<p>学生のときに組んだ。無駄にハイスペック。この上RTX2060も積んでたが、OpenBSDで使えないので解雇した。最近は絵を描くのに使っている。</p> -<dl> -<dt>マザーボード: ASRock Z390 Pro4</dt> -<dt>CPU: Intel Core i7-9700K</dt> -<dt>メモリ: センチュリーマイクロ 8GB * 2</dt> -<dd>国産</dd> -<dt>ストレージ: KimMiDi SSD 256GB</dt> -<dd>ThinkPad買ったときについてきたやつ。</dd> -<dt>モニタ: Eizo FlexScan EV2451</dt> -<dd>綺麗やけど質量が大きい。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>家のサーバー</h2> -<p> -主にDNSとして使っている。 -</p> -<dl> -<dt>ハードウェア: Dell D520</dt> -<dd>おじいちゃんの家にころがってたのをもらってきた。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>ウェブサーバー</h2> -<p>このウェブページ用</p> -<dl> -<dt>VPS: さくらのVPS</dt> -<dd>ちょっと高い(7078円/12ヶ月)。OpenBSDを入れられる。</dd> -<dt>OS: OpenBSD</dt> -<dt>httpサーバー: Openbsd httpd</dt> -<dd>manが分かりやすい。</dd> -<dt>smtpサーバー: OpenSMTPD</dt> -<dd>manが分かりやすい。</dd> -<dt>imapサーバー: dovecot</dt> -<dd>manはあんまり分かり易くない。<dd> -</dl> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/x11_32bit_window.html b/pub/computer/x11_32bit_window.html @@ -1,193 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>X11で深さが32bitのwindowを作成する</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>X11で深さが32bitのwindowを作成する</h1> -<time>2025-12-20</time> - -<h2>結論</h2> -<p> -X11のrender拡張機能で半透明な画像を合成(composite)する際に深さが32bitのウィンドウを作成する必要がある。その際ドキュメントにも書いてなさそうな操作が必要だった。ウィンドウを作成する際に<code>border pixel</code>の値を設定する必要がある(言語はC): -</p> - -<pre><code>// Xlibの場合 -XSetWindowAttributes attr32 = { - .border_pixel = 0, // 値はなんでもよさそう - .colormap = colormap32, -} -Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, // depth - InputOutput, - visual32, - CWBorderPixel|CWColormap, // CWBorderPixelを指定 - &amp;attr32); -</code></pre> - -<pre><code>// xcbの場合 -uint32_t attr32[2] = { 0, colormap32 }; // 値はなんでもよさそう。 -xcb_create_window(conn, 32, window32, screen-&gt;root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, // XCB_CW_BORDER_PIXELを指定 - &amp;attr32); -</code></pre> - -<h2>出典</h2> -<p> -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>に、 -</p> -<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 - // http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32 -</code></pre> -</blockquote> -<p> -と書いていた。引用元を見るとXサーバーのソースコードを参照しており、そのコードでは親のウィンドウの深さと異なる深さのウィンドウを作成する場合、<code>CWBorderPixmap</code>又は<code>CWBorderPixel</code>を指定しないと<code>BadMatch</code>というエラーが返ってくるようになっている。理由はよく分からない: -</p> -<blockquote cite="https://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c?h=xorg-server-21.1.21#n818"> -<pre><code> if (((vmask &amp; (CWBorderPixmap | CWBorderPixel)) == 0) &amp;&amp; - (class != InputOnly) &amp;&amp; (depth != pParent-&gt;drawable.depth)) { - *error = BadMatch; - return NullWindow; - } -</code></pre> -</blockquote> - -<h2>深さ32bitのウィンドウの作成手順</h2> -<h3>深さ32bitのヴィジュアルを取得</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのヴィジュアルを取得する: -</p> -<pre><code>// xlibの場合 -int findVisual32(Display *display, XVisualInfo *return_visual_info); -/* ... */ -int main(void) { - /* ... */ - XVisualInfo vi32; - if (findVisual32(display, &amp;vi32) &lt; 0) { - fatal(&quot;32bit-deep visual info not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(Display *display, XVisualInfo *return_visual_info) { - long mask = VisualDepthMask|VisualRedMaskMask|VisualGreenMaskMask|VisualBlueMaskMask; - XVisualInfo template = { - .depth = 32, - .red_mask = 0xff0000, - .green_mask = 0x00ff00, - .blue_mask = 0x0000ff, - }; - int n; - XVisualInfo *vinfos = XGetVisualInfo(display, mask, &amp;template, &amp;n); - if (n == 0) { - return -1; - } - *return_visual_info = vinfos[0]; - XFree(vinfos); - return 0; -} -</pre></code> - -<pre><code>// xcbの場合 -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype); -/* ... */ -int main(void) { - /* ... */ - xcb_visualtype_t visual32; - if (findVisual32(screen, &amp;visual32) &lt; 0) { - fatal(&quot;32bit visual not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) { - xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen); - for (;depth_iter.rem &gt; 0; xcb_depth_next(&amp;depth_iter)) { - xcb_depth_t *d = depth_iter.data; - if (d-&gt;depth != 32) { - continue; - } - xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d); - while (visual_iter.rem &gt; 0) { - xcb_visualtype_t *v = visual_iter.data; - if (v-&gt;red_mask == 0xff0000 &amp;&amp; v-&gt;green_mask == 0x00ff00 &amp;&amp; v-&gt;blue_mask == 0x0000ff) { - *return_visualtype = *v; - return 0; - } - xcb_visualtype_next(&amp;visual_iter); - } - } - return -1; -} -</code></pre> - -<h3>深さ32bitのカラーマップを作成</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのカラーマップを作成する。 -</p> -<pre><code>// xlibの場合 - Colormap colormap32 = XCreateColormap(display, DefaultRootWindow(display), vi32.visual, AllocNone); -</code></pre> -<pre><code>// xcbの場合 - xcb_colormap_t colormap32 = xcb_generate_id(conn); - xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen-&gt;root, visual32.visual_id); -</code></pre> - -<h3>深さ32bitのウィンドウを作成</h3> -<p>最後にウィンドウを作成する:</p> -<pre><code>// xlibの場合 - Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, - InputOutput, - vi32.visual, - CWBorderPixel|CWColormap, - &attr32); -</code></pre> -<pre><code>// xcbの場合 - uint32_t attr32[2] = { 0, colormap32 }; - xcb_create_window(conn, 32, window32, screen->root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32.visual_id, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32); -</code></pre> - -<h2>サンプルコード</h2> -32bitのウィンドウを作成し、そこからrender拡張機能を使って半透明な四角形を描画するプログラムを作った。OpenBSDで動作確認した。他のUnixでも多分動くと思う:<br> -<a href="https://git.mtkn.jp/win32">git.mtkn.jp/win32</a> - -<h2>参考文献</h2> -<ol> -<li><a href="https://azelpg.gitlab.io/azsky2/note/prog/x11/03_visual.html">X11: ビジュアル</a></li> -</ol> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground1.html b/pub/computer/xlib_playground1.html @@ -1,174 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる1</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる1</h1> -<time>2022-12-21</time> - -<h2>はじめに</h2> -<p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> -<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> -<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>初期設定</h2> -<p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p> -<pre><code> -#include &lt;stdio.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;X11/Xlib.h&gt; - -/* macros */ -#define INIT_WIDTH 800 -#define INIT_HEIGHT 600 - -/* variables */ -Display *display; -Window window; -unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; -Atom wm_delete_window; - -void -setup(void) -{ - // Open a display. - if ((display = XOpenDisplay(NULL)) == NULL){ - fprintf(stderr, "ERROR: could not open display\n"); - exit(1); - } - // Create a window. - window = XCreateSimpleWindow( - display, - XDefaultRootWindow(display), - 0, 0, - win_width, win_height, - 0, 0, // border properties - 0); // background color: black - XStoreName(display, window, "UNKO"); - - // Setup a graphical context. - gc = XCreateGC(display, window, 0, NULL); - XSetForeground(display, gc, 0x0000FF); - - // Kill the application when the window is destroyed. - wm_delete_window = XInternAtom(display, - "WM_DELETE_WINDOW", False); - XSetWMProtocols(display, window, &wm_delete_window, 1); - - // Setup which input to process. - XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); - - // Actually draw the window. - XMapWindow(display, window); -} - -void -clean_up(void) -{ - XCloseDisplay(display); -} -</code></pre> - -<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> -<pre><code>#include &lt;time.h&gt; -#include &lt;math.h&gt; - -int -main(void) -{ - int px, py; - int quit; - struct timespec ts; - XEvent event; - - setup(); - quit = 0; - - while (!quit){ - while(XPending(display) &gt; 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - clock_gettime(CLOCK_MONOTONIC, &ts); - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - 100, 100); // width and height - - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000 * 1000; - nanosleep(&ts, NULL); - } - - cleanup(); - return 0; -} -</code></pre> - -<p>ここまでのコードはgitリポジトリの<a href="https://git.mtkn.jp/xlib_playground/file/ex1/ex1.c.html">ex1/ex1.c</a>にある。</p> -<h2>完成品:</h2> -<video controls> - <source src="videos/ex1.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> -</ul> - -<a href="xlib_playground2.html">次の記事</a> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground2.html b/pub/computer/xlib_playground2.html @@ -1,235 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる2</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる2</h1> -<time>2022-12-22</time> - -<p>前回: <a href="xlib_playground1.html">Xlibで遊んでみる1</a></p> -<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>FPSの固定</h2> -<p>前のフレームからの経過時間を計測して<code>1.0/FPS</code>を越えるまで待機させる。このときに<code>nanosleep()</code>を使うとなぜか上手くいかなかった。ナノ秒単位で処理できそうな名前なのに使えない。多分OSのコンテクストスイッチがどうとかいう話やと思う。知らんけど。組み込みとかで使うんかな? -</p> - -<p> -とりあえず<code>while</code>ループの中でひたすら時刻を読んでいる。リソースの無駄遣いではないのだろうか: -</p> -<pre><code>#defin FPS 60 - -int -main(void) -{ - long t0, t1, dt; - int fps_count; - - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - - while (!quit) { - // fix fps - dt = 0; - while (dt &lt; 1.0 * 1000 * 1000 * 1000 / FPS){ - clock_gettime(CLOCK_MONOTONIC, &ts); - t1 = ts.tv_nsec; - dt = t1 &gt; t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000; - } - // count fps. - fps_count++; - if (t1 &lt; t0){ - printf("fps: %u\n", fps_count); - fps_count = 0; - } - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - } -} -</code></pre> -<p> -時刻は<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> -<p> -FPSの計測の部分は、フレーム毎に<code>fps_count</code>を1ずつ増やし、ナノ秒が繰り上がった時点での<code>fps_count</code>を表示している。</p> -<p> -あまり正確な方法ではないように思うが、コンパクトにまとまったのではないだろうか。</p> - -<h2>キーボード入力の処理</h2> -<p>キーボードからの入力を受け取る:</p> -<pre><code>XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); -</code></pre> -<p>ここではキーボードのキーを押した時と離した時に<code>XEvent</code>の通知を受け取るように設定した。 -</p> -<p> -<code>XNextEvent()</code>からひとつずつ入力を受け取ると、複数のキーが同時に押された時にうまく処理できなかったので、押されているキーを配列に保存しておくことにした:</p> -<pre><code>enum Keys { - Key_D, - Key_S, - Key_A, - Key_W, - Key_Space, - Num_Key, //number of keys in this enum -}; -enum Key_State { - Key_Up, - Key_Down, -}; - -int key_state[Num_Key]; -</code></pre> - -<p> -入力の処理は<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> -<pre><code>int quit; - -void -handle_inputs(void) -{ - XEvent event; - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - quit = 1; - break; - case 'd': - key_state[Key_D] = Key_Down; - break; - case 'a': - key_state[Key_A] = Key_Down; - break; - case 'w': - key_state[Key_W] = Key_Down; - break; - case 's': - key_state[Key_S] = Key_Down; - break; - default: - break; - } - } break; - case KeyRelease: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'd': - key_state[Key_D] = Key_Up; - break; - case 'a': - key_state[Key_A] = Key_Up; - break; - case 'w': - key_state[Key_W] = Key_Up; - break; - - case 's': - key_state[Key_S] = Key_Up; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - - vx = vy = 0; - if (key_state[Key_D] == Key_Down) - vx += 300; - if (key_state[Key_A] == Key_Down) - vx += -300; - if (key_state[Key_S] == Key_Down) - vy += 300; - if (key_state[Key_W] == Key_Down) - vy += -300; -} -</code></pre> - -<p> -入力によって変更された速度は、<code>main()</code>関数内で次の座標を計算するために使用される: -</p> -<pre><code>float px = 200, py = 200; -float vx = 0, vy = 0; -int width = 40, height = 40; - -int -main(void) -{ - /* ... */ - quit = 0; - while (!quit) { - handle_input() - /* ... */ - px = px + vx * dt / 1000 / 1000 / 1000; - py = py + vy * dt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - width, height); // width and height - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<a href="https://git.mtkn.jp/xlib_playground/file/ex2/ex2.c.html">ソースコード</a> -<p>色を変えてみた。</p> -<video controls> - <source src="videos/ex2.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p>次の記事: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground3.html b/pub/computer/xlib_playground3.html @@ -1,198 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる3</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる3</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground2.html">Xlibで遊んでみる2</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>画面サイズの変更</h2> -<p> -画面サイズが変更された時に表示している四角形が画面の外側に出ないようにした。<code>XGetWindowAttributes()</code>で画面の情報を取得し、グローバル変数の<code>win_width</code>と<code>win_height</code>に幅と高さをそれぞれ代入して<code>next_tick()</code>で四角形の位置を画面に収まるようにしている: -</p> -<pre><code>int win_width, win_height; - -void -receive_events(int key_state[]) -{ - XEvent event; - XWindowAttributes wattr; - - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XGetWindowAttributes(display, window, &wattr); - win_width = wattr.width; - win_height = wattr.height; - } break; - /* ... */ - } - } -} - -void -next_tick(long ndt) // nano second -{ - px = px + vx * ndt / 1000 / 1000 / 1000; - py = py + vy * ndt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; -} -</code></pre> - -<h2>メニュー画面の実装</h2> -<p> -ゲームのようなものを作るうえでメニュー画面とその推移が必要である。ここではグローバル変数<code>next_menu</code>に現在のメニューを保存することにした。それぞれのメニューはそれぞれ関数として記述し、他のメニューに推移する必要が生じたときに<code>next_menu</code>を変更するようにした: -</p> -<pre><code>enum next_menu { - START_MENU, - GAME_PLAY, - GAME_OVER, - QUIT, -}; - -int next_menu = START_MENU; - -void -start_menu(void) -{ - XEvent event; - char *menu_char_q = "press q to quit."; - char *menu_char_s = "press &lt;space&gt; to start."; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - while (next_menu == START_MENU) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, - win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, - win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - } break; - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - next_menu = QUIT; - break; - case ' ': - next_menu = GAME_PLAY; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - next_menu = QUIT; - } - } break; - default: - break; - } - } -} - -int -main(void) -{ - setup(); - while (next_menu != QUIT){ - switch (next_menu){ - case START_MENU: - start_menu(); - break; - case GAME_PLAY: - game_play(); - break; - case GAME_OVER: - game_over(); - break; - default: - break; - } - } - - cleanup(); - return 0; -} -</code></pre> -<p><code>main()</code>関数がめっちゃすっきりした。</p> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex3/ex3.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex3.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground4.html b/pub/computer/xlib_playground4.html @@ -1,177 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる4</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる4</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>衝突判定とその処理</h2> -<p> -これまでは一つの四角形だけを描画していたが、今回は複数の四角形を作成して動かしてみた。ランダムな場所にランダムな運動量で動かして、他のものやウィンドウの縁とぶつかったら跳ね返るようにした。</p> -<p> -回転しない四角形どうしの衝突判定は簡単である。x軸方向とy軸方向の両方に重なりがあれば衝突している: -</p> -<pre><code>struct square { - float ppx, ppy; // previous position - float px, py; // current position - float vx, vy; // velocity - int w, h; // width and height -}; - -int -test_collision(struct square *s1, struct square* s2) -{ - return s1-&gt;px &lt; s2-&gt;px + s2-&gt;w && s2-&gt;px &lt; s1-&gt;px + s1-&gt;w && - s2-&gt;py &lt; s1-&gt;py + s1-&gt;h && s1-&gt;py &lt; s2-&gt;py + s2-&gt;h; -} -</code></pre> - -<p> -衝突後の処理は多少めんどくさかった。衝突した時は既にめりこんでいるので、まずはそれぞれをめりこんだ距離の半分ずつずらして衝突を解消するようにした。この際、x軸方向にぶつかったのか、y軸方向にぶつかったのかで、それぞれの軸方向にひっぺがすようにしている。二つの四角形の各軸に関するめりこんだ距離<code>lapx</code>、<code>lapy</code>と各軸に関する相対速度<code>rel_vx</code>、<code>rel_vy</code>の比を比べればどちらの軸方向にぶつかったかが分かるはずである、多分 : -</p> -<pre><code>void -handle_collision_mm(struct square *s1, struct square *s2) -{ - if (!test_collision(s1, s2)) - return; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - float rel_vx = max(s1-&gt;vx - s2-&gt;vx, s2-&gt;vx - s1-&gt;vx); - float rel_vy = max(s1-&gt;vy - s2-&gt;vy, s2-&gt;vy - s1-&gt;vy); - - if (lapx / rel_vx &lt; lapy / rel_vy) { - if (s1-&gt;px + s1-&gt;w &lt; s2-&gt;px + s2-&gt;w / 2) { - s1-&gt;px -= lapx / 2; - s2-&gt;px += lapx / 2; - } else { - s1-&gt;px += lapx / 2; - s2-&gt;px -= lapx / 2; - } - } else { - if (s1-&gt;py + s1-&gt;h &lt; s2-&gt;py + s2-&gt;h / 2) { - s1-&gt;py -= lapy / 2; - s2-&gt;py += lapy / 2; - } else { - s1-&gt;py += lapy / 2; - s2-&gt;py -= lapy / 2; - } - } -} -</code></pre> -<p> -衝突は弾性衝突として、衝突したそれぞれの四角形の速度を更新した。質量は四角形の面積として計算している。衝突後の速度はエネルギー保存則と運動量保存則から導いたのでしんどかった。 -</p> -<pre><code>void -handle_collision_elastic(struct square *s1, struct square *s2) -{ - if(!test_collision(s1, s2)) - return; - - float v1, v2; - float m1 = s1-&gt;w * s1-&gt;h; - float m2 = s2-&gt;w * s2-&gt;h; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - - if (lapx &lt; lapy) { - v1 = s1-&gt;vx; - v2 = s2-&gt;vx; - s1-&gt;vx = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vx = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } else { - v1 = s1-&gt;vy; - v2 = s2-&gt;vy; - s1-&gt;vy = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vy = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } - - handle_collision_mm(s1, s2); -} -</code></pre> - -<h2>サブティック</h2> -<p> -この名前が適切かどうか分からないが、前のフレームから次のフレームまでの時間をさらに何等分かして衝突判定の制度を上げた(マクロは括弧でかこって分かりにくいバグを防げとどこかに書いていたのでそうすることにした): -</p> -<pre><code>#define SUB_TIC (4) - -void -game_play(void) -{ - /* ... */ - while (next_menu == GAME_PLAY) { - /* ... */ - for (int j = 0; j &lt; SUB_TICK; j++) { - for (int i = 0; i &lt; NUM_SQUARE; i++) - next_tick(&square[i], 1000 * 1000 * 1000 / FPS / SUB_TICK); - - for (int i = 0; i &lt; NUM_SQUARE; i++) - for (int j = i + 1; j &lt; NUM_SQUARE; j++) { - handle_collision_elastic(&square[i], &square[j]); - /* ... */ - } - /* ... */ - } - /* ... */ - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex4/ex4.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex4.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground5.html b/pub/computer/xlib_playground5.html @@ -1,144 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる5</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる5</h1> -<time>2023-01-03</time> - -<p> -前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>円の衝突判定とその処理</h2> -<p> -前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である: -</p> -<pre><code>struct circle { - float ppx, ppy; // previous position (center) - float px, py; // current position (center) - float vx, vy; // velocity - int r; // radius - int m; // mass -}; - -int -circle_test_collision(struct circle *c1, struct circle *c2) -{ - return (c1-&gt;px - c2-&gt;px) * (c1-&gt;px - c2-&gt;px) + - (c1-&gt;py - c2-&gt;py) * (c1-&gt;py - c2-&gt;py) &lt; - (c1-&gt;r + c2-&gt;r) * (c1-&gt;r + c2-&gt;r); -} -</code></pre> - -<p> -衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。 -</p> -<pre><code> -void -circle_handle_collision_mm(struct circle *c1, struct circle *c2) -{ - if (!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - - c1-&gt;px = c1-&gt;px - col_px / 2; - c1-&gt;py = c1-&gt;py - col_py / 2; - c2-&gt;px = c2-&gt;px + col_px / 2; - c2-&gt;py = c2-&gt;py + col_py / 2; -} - -void -circle_handle_collision_elastic(struct circle *c1, struct circle *c2) -{ - if(!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - float nor_px = col_py; - float nor_py = -col_px; - - float m1 = c1-&gt;m; - float m2 = c2-&gt;m; - - float col_1v = c1-&gt;vx * col_px + c1-&gt;vy * col_py; - float col_2v = c2-&gt;vx * col_px + c2-&gt;vy * col_py; - - float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; - float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; - float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; - float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; - - float nor_1vx = nor_px * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_1vy = nor_py * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_2vx = nor_px * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - float nor_2vy = nor_py * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - - c1-&gt;vx = col_1vxn + nor_1vx; - c1-&gt;vy = col_1vyn + nor_1vy; - c2-&gt;vx = col_2vxn + nor_2vx; - c2-&gt;vy = col_2vyn + nor_2vy; - - circle_handle_collision_mm(c1, c2); -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex5.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a> -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/computer/xlib_playground6.html b/pub/computer/xlib_playground6.html @@ -1,230 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる6</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる6</h1> -<time>2023-01-25</time> - -<p> -前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>ワールドマップの作成</h2> -<p> -ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロックの場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした: -</p> -<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] = -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"........b......................................................................." -"................................................................................" -"................................................................................" -"....b..........................................................................." -"................................................................................" -"................b..............................................................." -"..........................................................b..........b.........." -"................................................................................" -".......................b........................................................" -"...........................................b...................................." -"...........................................b...................................." -"................................................................................" -"..................b............................................................." -"................................................................................" -"...........................................b...................................." -"................................................................................" -"................................................................................" -"...........................b...................................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..............................................bbbbbbbbbb........................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..........................bbbbbbbbbb............................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................bbbbbbbbbb......................................................" -"................................................................................" -"................................................................................" -"...p............................................................................" -"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb" -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................."; -</code></pre> - -<h2>プレイヤーの作成</h2> -<p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p> -<pre><code>struct rect { - float ppx, ppy; - float px, py; - float vx, vy; - float ax, ay; // acceleration - int w, h; - int m; -}; -</code></pre> -<p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p> -<pre><code>struct rect block[NUM_RECT]; -struct rect player; - -/* ... */ - - int bi = 0; - for (int i = 0; i &lt; WORLD_WIDTH * WORLD_HEIGHT; i++) { - if (world_map[i] == 'b') { - block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE; - block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE; - block[bi].ax = 0; - block[bi].ay = 0; - block[bi].vx = 0; - block[bi].vy = 0; - block[bi].w = block[bi].h = BLOCK_SIZE; - block[bi].m = block[bi].w * block[bi].h; - bi++; - } else if (world_map[i] == 'p') { - player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE; - player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE; - player.vx = 0; - player.vy = 0; - player.ax = 0; - player.ay = GRAVITY; - player.w = player.h = BLOCK_SIZE; - player.m = player.w * player.h; - } - } -</code></pre> - -<p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる: -</p> -<pre><code>void -handle_inputs(int key_state[]) -{ - if (key_state[KEY_Q] == KEY_DOWN){ - next_menu = GAME_OVER; - return; - } - if (key_state[KEY_D] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = 500; - } else { - player.ax = 1000; - } - } else if (key_state[KEY_A] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = -1000; - } else { - player.ax = -500; - } - } else { - if (player_is_falling) - player.ax = -player.vx; - else - player.ax = -3 * player.vx; - } - - if (player.vx &lt; -200) player.vx = -200; - if (player.vx &gt; 200) player.vx = 200; - if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN) - player.vy = -450; -} -</code></pre> - -<p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p> -<pre><code>void -rect_next_tick(struct rect *s, long ndt) // nano second -{ - s-&gt;ppx = s-&gt;px; - s-&gt;ppy = s-&gt;py; - s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000; - s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000; - s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000; - s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000; - - // bind within the window - if (s-&gt;px &lt; 0) { - s-&gt;px = 0; - //s-&gt;vx *= -1; - } - if (win_width &lt; s-&gt;px + s-&gt;w) { - s-&gt;px = win_width - s-&gt;w; - //s-&gt;vx *= -1; - } - // game over when fall out of the screen - if (s-&gt;py &gt; win_height) - next_menu = GAME_OVER; -} -</code></pre> - - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex6.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/9p_go.html b/pub/draft/9p_go.html @@ -1,335 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>9PのGoによる実装</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>9PのGoによる実装</h1> -<time>2024-12-18</time> - -<h2>メッセージの構造体の定義</h2> -<p> -メッセージには<code>size</code>、<code>tag</code>等共通の要素がある。クライアントからメッセージを受けとる際、<code>size</code>を参照して何バイト読むか判断し、メッセージの<code>type</code>によりその後の処理を場合分けする。そのためにメッセージを<code>interface</code>として定義した: -</p> -<pre><code>// A Msg represents any kind of message of 9P. -// It defines methods for common fields. -// For each message type &lt;T&gt;, new&lt;T&gt;([]byte) function parses the byte array -// of 9P message into the corresponding message struct. -// For detailed information on each message, consult the documentation -// of 9P protocol. -type Msg interface { - // Size returns the size field of message. - // Size field holds the size of the message in bytes - // including the 4-byte size field itself. - Size() uint32 - // Type returns the type field of message. - Type() MsgType - // GetTag returns the Tag of message. - // Tag is the identifier of each message. - // The Get prefix is to avoid name confliction with the each - // message's Tag field. - GetTag() uint16 - // SetTag sets the Tag field of the message. - SetTag(uint16) - // Marshal convert Msg to byte array to be transmitted. - marshal() []byte - String() string -} -</code></pre> -<p> -<code>marshal()</code>はサーバーから返信を送る際にメッセージの構造体をバイト列にエンコードするための関数である。<code>String() string</code>はログ出力用。</p> -<p> -メッセージはバイト列として受け取った後、メッセージのタイプによって処理を分ける。その際、扱いやすいようにバイト列を各メッセージの構造体に変換する。変換前のバイト列から、各メッセージに共通のフィールドを取得できると便利なので、バイト列のまま<code>Msg</code>インターフェースを実装する<code>bufMsg</code>を定義した。名前はいまいち。</p> -<pre><code>type bufMsg []byte - -func (msg bufMsg) Size() uint32 { return gbit32(msg[0:4]) } -func (msg bufMsg) Type() MsgType { return MsgType(msg[4]) } -func (msg bufMsg) GetTag() uint16 { return gbit16(msg[5:7]) } -func (msg bufMsg) SetTag(t uint16) { pbit16(msg[5:7], t) } -func (msg bufMsg) marshal() []byte { return []byte(msg)[:msg.Size()] } -func (msg bufMsg) String() string { - switch msg.Type() { - case Tversion: - return newTVersion(msg).String() - /* 省略 */ - } -} -</code></pre> -<p> -<code>gbit32</code>は4バイトのリトルエンディアンの配列を整数に変換するもので、<code>pbit32</code>は逆に整数をリトルエンディアンのスライスに格納するものである。</p> -<p> -各メッセージはそれぞれのフィールドを構造体のフィールドとして定義したものである。例えば<code>tversion</code>に対応する構造体は以下の通り。</p> -<pre><code>type TVersion struct { - Tag uint16 - Msize uint32 - Version string -} -</code></pre> -<p> -バイト列から各メッセージの構造体に変換するために<code>new<i>メッセージタイプ</i></code>を定義した。 -</p> -<pre><code>func newTVersion(buf []byte) *TVersion { - msg := new(TVersion) - msg.Tag = gbit16(buf[5:7]) - msg.Msize = gbit32(buf[7:11]) - vs := gbit16(buf[11:13]) - msg.Version = string(buf[13 : 13+vs]) - return msg -} -</code></pre> - -<h2>メッセージのやりとり</h2> -<p> -まずは9Pメッセージを読む関数を実装する。バイト列が読めればいいので引数は<code>io.Reader</code>にした: -</p> -<pre><code>func readMsg(r io.Reader) ([]byte, error) { -</code></pre> -<p> -最初にメッセージのサイズを読む: -</p> -<pre><code> buf := make([]byte, 4) - read, err := r.Read(buf) - if err != nil { - if err == io.EOF { - return nil, err - } - return nil, fmt.Errorf(&quot;read size: %v&quot;, err) - } - if read != len(buf) { - return buf, fmt.Errorf(&quot;read size: invalid message.&quot;) - } - size := bufMsg(buf).Size() -</code></pre> -<p> -続いて読みこんだサイズに基づいてメッセージの残りの部分を読む。 -一回の<code>Read</code>で最後まで読めないことがあったので、 -全部読めるまで<code>Read</code>を繰り返す: -</p> -<pre><code> mbuf := make([]byte, size-4) - for read = 0; read &lt; int(size)-4; { - n, err := r.Read(mbuf[read:]) - if err != nil { - return buf, fmt.Errorf(&quot;read body: %v&quot;, err) - } - read += n - } - buf = append(buf, mbuf...) - return buf, nil -} -</code></pre> -<p> -読み込んだバイト列は<code>ReadMsg</code>関数でメッセージの構造体に変換する。</p> -<pre><code>RecvMsg(r io.Reader) (Msg, error) { - b, err := readMsg(r) - if err == io.EOF { - return nil, err - } else if err != nil { - return nil, fmt.Errorf(&quot;readMsg: %v&quot;, err) - } - return unmarshal(b) -} -</code></pre> -<p> -返信のメッセージはメッセージの構造体を<code>marshal</code>関数でバイト列に変換して<code>io.Writer</code>に書き込む。</p> -<pre><code>// SendMsg send a 9P message to w -func SendMsg(msg Msg, w io.Writer) error { - if _, err := w.Write(msg.marshal()); err != nil { - return fmt.Errorf(&quot;write: %v&quot;, err) - } - return nil -} -</code></pre> - -<h2>メインループ</h2> -<p> -ライブラリはメッセージを読み込むためのリスナーgoroutinと返信を書き込むためのレスポンダーgoroutine、そして各メッセージを処理するためのgoroutineを立ち上げて、チャネルでそれぞれを繋ぐ。リスナーがメッセージを読み込むと、<code>request</code>構造体に格納し、メッセージのタイプに応じて各goroutineに渡す。渡されたgoroutineはメッセージに応じた処理をし、返信のメッセージをリスポンダーgoroutineに渡す。リスポンダーgoroutineはメッセージをバイト列に変換して返信する。 -</p> -<p> -この設計がいいかどうかよく知らんけど、Go言語を触るからgoroutineとチャネルによるパイプラインを作ってみたかった。</p> - -<h2>各メッセージの処理</h2> -<p> -メッセージは<code>s<i>メッセージタイプ</i></code>goroutineで処理する。関数は<code>for</code>ループのなかでチャンネル<code>rc</code>から<code>request</code>が届くのを待つ。届いたリクエストには<code>ifcall</code>フィールドにクライアントからの<code>Msg</code>が含まれるので、この関数が担当するstructにキャストする。このキャストが失敗するのは明かなサーバーのバグなのでタイプアサーションはしない。</p> -<pre><code>func s<i>メッセージタイプ</i>(ctx context.Context, c *conn, rc &lt;-chan *request) { - for { - select { - case &lt;-ctx.Done(); - return - case r, ok := rc: - if !ok { - return - } - ifcall := r.ifcall.(*T<i>メッセージタイプ</i>) -</code></pre> -<p> -各種処理を完了したら、届いた<code>request</code>の<code>ofcall</code>に返信の<code>Msg</code>を格納して返信を担当するgoroutineに送る。<pre><code> select { - case c.respChan &lt;- r: - case &lt;-ctx.Done(): - return - } -</code></pre> -</p> -<h3>Version</h3> -<p> -クライアントから届いたバージョンの提案を見て、頭に"9P2000"があれば返信のバージョンを"9P2000"にする。現在定義されているバージョンは"9P2000"の他、Unix用に拡張した"9P2000.u"、Linux用に拡張した"9P2000.l"がある。基本的な昨日を実装することが目標なので、"9P2000"のみを受け付ける。</p> -<p> -Versionメッセージではメッセージの最大サイズも決定する。サーバーは予め8Kバイトを最大サイズにしている。クライアントがこれ以上のサイズを提案した場合、8Kにしてもらい、これ以下のサイズを提案した場合、そのサイズでメッセージをやりとりする。8Kバイトという既定値はplan9の実装を参考にした。このサイズである必然性はよく知らない。</p> -<pre><code> version := ifcall.Version - if strings.HasPrefix(version, &quot;9P2000&quot;) { - version = &quot;9P2000&quot; - } else { - version = &quot;unknown&quot; - } - msize := ifcall.Msize - if msize &gt; c.mSize() { - msize = c.mSize() - } - r.ofcall = &amp;RVersion{ - Msize: msize, - Version: version, - } - c.setMSize(r.ofcall.(*RVersion).Msize) -</code></pre> - -<h3>Auth</h3> -<p> -サーバーの認証は<code>Server</code>の<code>Auth</code>フィールドに認証のためのやりとりを待ち受ける関数を登録することで有効化できる。このフィールドが<code>nil</code>の場合、認証が必要ない旨のエラーを返す。</p> -<pre><code> if c.s.Auth == nil { - r.err = fmt.Errorf(&quot;authentication not required&quot;) - goto resp - } -</code></pre> -<p> -認証が必要な場合、クライアントから提案された<code>afid</code>をコネクションに登録して、<code>Server.Auth</code>を呼び出す。 -</p> - -<h3>attach</h3> -<p> -サーバーはまず認証が必要な場合認証が済んでいるか確認する。</p> -<pre><code> switch { - case c.s.Auth == nil &amp;&amp; ifcall.Afid == NOFID: - case c.s.Auth == nil &amp;&amp; ifcall.Afid != NOFID: - r.err = ErrBotch - goto resp - case c.s.Auth != nil &amp;&amp; ifcall.Afid == NOFID: - r.err = fmt.Errorf(&quot;authentication required&quot;) - goto resp - case c.s.Auth != nil &amp;&amp; ifcall.Afid != NOFID: - afid, ok := c.fPool.lookup(ifcall.Afid) - if !ok { - r.err = ErrUnknownFid - goto resp - } - af, ok := afid.file.(*AuthFile) - if !ok { - r.err = fmt.Errorf(&quot;not auth file&quot;) - goto resp - } - if af.Uname != ifcall.Uname || af.Aname != ifcall.Aname || !af.AuthOK { - r.err = fmt.Errorf(&quot;not authenticated&quot;) - goto resp - } - } -</code></pre> -<p> -次にクライアントが要求してきたファイルツリーがサーバーにあるかどうか確認し、クライアントが設定した<code>fid</code>にルートディレクトリを紐付ける。</p> -<pre><code> r.fid, err = c.fPool.add(ifcall.Fid) - if err != nil { - r.err = ErrDupFid - goto resp - } - r.fid.path = &quot;.&quot; - r.fid.uid = ifcall.Uname - fsys, ok = c.s.fsmap[ifcall.Aname] - if !ok { - r.err = fmt.Errorf(&quot;no such file system&quot;) - goto resp - } - r.fid.fs = fsys - fi, err = fs.Stat(ExportFS{c.s.fsmap[ifcall.Aname]}, &quot;.&quot;) - if err != nil { - r.err = fmt.Errorf(&quot;stat root: %v&quot;, err) - goto resp - } - r.fid.qidpath = fi.Sys().(*Stat).Qid.Path - r.ofcall = &amp;RAttach{ - Qid: fi.Sys().(*Stat).Qid, - } -</code></pre> - -<h3>flush</h3> -<p> -指定されたリクエストの<code>flush</code>メソッドを呼び出す。<code>flush</code>メソッドはリクエストの<code>done</code>チャンネルを閉じ、リクエストのタグを削除する。処理に時間のかかるものは、リクエストの<code>done</code>チャネルが閉じられたら、その処理を中止する。</p> -<pre><code>// flush cancels the request by calling r.cancel. -// It also delete the request from its pool. -func (r *request) flush() { - close(r.done) - r.pool.delete(r.tag) -} -</code></pre> - -<h3>walk</h3> -<p> -仕様に書かれている通りの条件を確認した後、ファイルツリーを順番に辿り、得られた<code>Qid</code>を記録してクライアントに返す。</p> -<pre><code> wqids = make([]Qid, 0, len(ifcall.Wnames)) - cwdp = oldFid.path - for _, name := range ifcall.Wnames { - cwdp = path.Clean(path.Join(cwdp, name)) - if cwdp == &quot;..&quot; { - cwdp = &quot;.&quot; // parent of the root is itself. - } - stat, err := fs.Stat(ExportFS{oldFid.fs}, cwdp) - if err != nil { - break - } - wqids = append(wqids, stat.Sys().(*Stat).Qid) - } - if len(wqids) == 0 { - newFid.qidpath = oldFid.qidpath - } else { - newFid.qidpath = wqids[len(wqids)-1].Path - } - newFid.path = cwdp - newFid.uid = oldFid.uid - newFid.fs = oldFid.fs - r.ofcall = &amp;RWalk{ - Qids: wqids, - } -</code></pre> - -<h3>open</h3> -<h3>create</h3> -<h3>read</h3> -<h3>write</h3> -<h3>clunk</h3> -<h3>remove</h3> -<h3>stat</h3> -<h3>wstat</h3> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/how_to_throw_away_smart_phone.html b/pub/draft/how_to_throw_away_smart_phone.html @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>携帯電話捨てた</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>携帯電話捨てた</h1> -<time>2021-12-20</time> -<h2>スマートフォンを捨てたくなった。</h2> -<p>この端末から得られる情報にはあまりにも無駄が多いこと、そしてGoogle等に自分の情報を売り飛ばしている懸念が大きいこと。この2点が徐々に気になりだした。さらに通信料を節約する観点から楽天モバイルに変え、あまりスマートフォンを持ち歩かなくなった。そうして今迄どれほどの時間と神経をこの小さな機械に奪われてきたかに気付かされた。それと並行して、なにか情報を得たい時にパソコンを利用する機会が増え、いよいよこの端末を持っていること自体が嫌になった。いっそうのこのスマートフォンのない生活をしてやろうと思いたったのだ。</p> -<p>ここで、僕が捨てたいのはスマートフォンだけでなく、「何時でも何処でも連絡が取れてしまう便利な機械」である。世の中には電話以外にほぼなにもできない端末も売られているが、それも持ちたくない。携帯電話の番号ごと捨ててしまいたいのだ。</p> -<p>ところがこれが案外難しい。現状スマートフォンで利用しているサービスは、LINE、SMS、銀行のワンタイムパスワード、マイナポータルくらいである。この内マイナポータルは多少面倒だが市役所に行けばいいし、銀行もコンビニのATMで済ませられる。LINEはほぼ使っていないがたまに学生の時のグループに連絡が入る。しかしこれもメールでできなくもない。厄介なのはSMSである。なぜかSMSによる二段階認証をしないと利用できないサービスが存在するのだ。これを最初に書いていた頃には暗号資産の取引所を利用していたが、現在は解約した。<p> -<p>Googleのメールアドレスを長らく使っていたが、サーバーを借りて独自ドメインのメールアドレスを手に入れたので、これを機にウェブサービスに登録しているアドレスを随時変更して行った。一部学生のころのアドレスを利用していたアカウントがうまく変更できずにいる。特にマイクロソフトのアカウントはログインすら出来なかった。しかし概ねメールアドレスの変更と、使っていないアカウントの削除はできたと思うのである程度は諦めることにした。どうせ就職活動の時に手当たり次第作ったものは作ったことすら忘れていたりするだろうし。</p> - -<h2>令和4年6月6日携帯を解約した。</h2> -<p>ひと通りウェブサービスのアカウントを整理した所で、いよいよ携帯電話を持っている必要が無くなってしまった。そして6月6日の夜、勢い余って楽天モバイルを解約し、ラインのアカウントも削除してしまった。この日は気分よく寝れた。</p> - -<h2>Googleにログインできなくなった。</h2> -<p>携帯を解約し、メールアドレスを変更したとは言え、まだGoogleのメールの方にもあちこちからメールが届いていた。自分で把握できていないウェブサービスからである。当面はこちらのメールも時々確認して、消し忘れていたアカウントを削除していこうと考えていた。</p> -<p>ところがいつのことだったか、パソコンのneomuttからGoogleのアカウントにアクセスできなくなった。どうやら二段階認証の設定が必須になったようだ。然しこの二段階認証は携帯電話の番号が必要なようで、携帯を解約した僕にはどうすることもできない。そこで仕方なくブラウザでGoogleにログインして利用することにした。10年以上前のパソコンではかなり重くて使い辛いが、まあ日常的に確認するものではないので問題なかった。然し今度はブラウザからのログインも不可能にされてしまった。これもSMSによる二段階認証以外の方法はないようである。知らぬ間にセキュリティ強化と称してこちらの選択肢を無くしてしまうやり方にとうとう愛想が尽きた。とりあえず母の携帯を借りてログインし、すぐにアカウントごと消してしまった。</p> - -<h2>選択の自由</h2> -<p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/keitai.html b/pub/draft/keitai.html @@ -1,46 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>携帯電話を持たない生活</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>携帯電話を持たない生活</h1> -<h2>はじめに</h2> -<p>学生の頃僕はスマートフォンをよく利用していた。今時の一般的な利用頻度だったと思う。LINEやSNSのアプリをインストールして利用していたし、ニュースや動画もよく閲覧していた。</p> -<p>学生生活も終わりに差し掛った頃、仕送りの残高の確認を怠ったことから一時お金に困ったことがある。親に泣き付くこともできただろうが、間も無く社会人になるこの時期に一度、出費の整理をしようと思いたった。家の中を見渡せばどれもこれも無駄なものばかりが溢れていた。物を片っ端から捨て、買う物を厳選するよう心掛けた。この時に携帯の料金も当然目に付いた。月に何千円も払ってるのがあまりにも無駄に思えた。かと言って電話が使えないのは少し困る。就職先との連絡にも使うかもしれない。この時は携帯電話を完全に解約することは考えず、ただ電話だけのプランに変更した。然しキャリアと少しトラブルがあり、楽天モバイルのサービス開始とも時期が重なったのでそちらに移行することにした。その後すぐ会社を辞めて実家に帰ることになったが、家ではwifiに繋ぎ、外にはほぼ持ち出さないのでずっと無料で使えていた。ところが最近になった突然無料プランが廃止されることになった。</p> -<p>今携帯電話はほとんど使っていない。家に置きっぱなしだし、その家ではwifiがあるので携帯電話の通信は必要ない。なにより僕はこのスマートフォンという機械が嫌いである。root権限を得られず、無駄なアプリが沢山インストールされており、削除することすらできない。更にGoogleのアカウントが無いと満足に使うこともできない。僕はこのハードウェアを購入しただけの積りだったが、どうやら知らぬ間にGoogleとの契約を交してしまったようだ。また、パソコンに慣れているということもあり、タッチパネルが苦手である。年老いたものだ。兎に角どこを取ってもこの機械を持ちたくない理由ばかりである。こんなものの為に毎月千円払うのはなんとも虚しいのだ。</p> -<p>とは言っても電話番号を捨てるのは少しばかりハードルが高かった。SMSによる二段階認証が必要なサービスをいくつか利用していたのだ。然し最近やたらあちこちに自分のアカウントが散らばっているのが気になり、少しずつ解約を進めていた。そして今、パソコンに保存していたパスワードを頼りに使わないものを一通り解約し終わった。これで携帯電話を解約できるはず。</p> -<p>ところがスマートフォンにはLINEが残っていた。アカウントには携帯の電話番号が登録されている。インターネットで検索したりLINEに直接問い合わせたが、どうやらこの番号は消せないようである。丁度良い機会なのでLINEのアカウントも削除してしまおうと思い、した!</p> -<p>胸がすく。</p> - -<h2>Apple、Google、Microsoft</h2> -<p>今の日本に於て携帯電話を持っていないのは異常である。そしてほとんどの携帯はスマートフォンである。スマートフォンのOSと言えばiOS若しくはAndroidがほとんどである。前者を利用するにはAppleのIDが、後者はGoogleのアカウントがそれぞれ必要である。つまりほとんど全ての日本人がAppleかGoogleに紐付いていると言える。もちろん他の選択肢も無いことはないが、それらを利用している人数はほぼ無視できるだろう[要出典]。パソコンの方に目を向けて見ても同じようなものである。最近Windowをインストールして利用するにはMicrosoftのアカウントが必須になったようだ。他のOSはAppleかGoogleのものであるので同じことである。ただしパソコンはLinuxやBSD、Plan9等もあるのでスマートフォンよりは圧倒的にましではある。</p> -<p>世の中の流れとは、あるいは世論とは、本来その世の中に生きる一人一人が作り出すものである。各自が自身の内面からくる欲望と、身近な人への配慮との間に自分の行動が発生するはずだ。ところが今、そういった世の流れはどこか遠くからやって来て、自分達はただその波にゆられるだけである。自分自身が波に影響を与えることがないと多くの人は思っているのではないか。ほんの少し前まではその波はテレビだったり新聞だったりが起していた。ところが今はインターネットに溢れる広告やら検索結果やらで知らぬ間に脳の中に入り込んでいる。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/life.html b/pub/draft/life.html @@ -1,54 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>暮し</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>暮し</h1> - -<p> -朝4時、太陽がまだ昇らないうちに起き、家の隣にある畑へ。夏の熱気に勢いをつけた草を整理し、種を蒔く。この日は黒田五寸を蒔いた。朝食べる野菜を少し収穫して台所に戻る。家内が米を研いでいる。枝豆、山東菜、とうもろこし、大根と日野菜の間引き菜、真黒茄子。枝豆、とうもろこしを茹でる。間引き菜を味噌汁に。山東菜はそのままサラダ。茄子は糠に漬け、昨日の胡瓜と入れ替える。昨日干しておいた鯵の味醂干しを焼く。子供が起きてきていただきます。</p> - -<p> -午前中は少しだけ仕事をする。最近はプログラミングばかりしている。仕事といってもボランティアで収入にはならない。偶にだれかがビットコインを寄付してくれる。</p> - -<p> -昼はパンを少しだけ。この日は2日前に焼いたもの。アゼルバイジャンのオバチャンがYoutubeで焼いていたものを適当に真似てみた。小麦粉に酵母、塩、砂糖を混ぜ、水でこねる。一次発酵の後、小分けにして二次発酵。楕円にのばして三次発酵の後、卵をぬり胡麻をふりかけて焼成。動画では楕円にしたあとコップで穴を開けていたがこれは省いた。棒にさして売りに行っていた名残とかなんかな。</p> - -<p> -食べた後は昼寝をする。夏は夜の睡眠時間が短くなるので昼寝は必須である。</p> - -<p> -眠気が覚めたら家のリフォームの続きをした。この家は祖父が建てたもので、木造ではあるが残念ながら近代的な造りである。礎石ではなくコンクリートのベタ基礎だし、筋交いがいたる所にある。建て直しも考えたが、今あるものを大切にするのもいいと思い、内装だけ変えることにした。今は台所に竃を作っている。先週までに三和土の土間を作り終えたので、この上に土を盛って形はほぼできている。仕上げに黒い漆喰を塗った。竃の場所は家の南東角で、二階建の家にあって唯一上に部屋が無い場所である。煙突は設けず、天井をひっぺがして小屋組に煙がまわるようにした。</p> - -<p> -穴の開いた浴衣の袖を修理しているところに子供が友達を従えて帰ってきた。</p> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/light.html b/pub/draft/light.html @@ -1,48 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>照明は(あんまり)いらない</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>照明は(あんまり)いらない</h1> -<h2>照明のない生活</h2> -<p>僕は長らく照明をほぼ使わない生活をしている。学生の頃節約にはまり、出費をあれこれ見直していると、部屋の天井であたりまえのように光り輝いている電灯が目についた。もともと不眠症ということもあり、電灯を消したほうがいいのではないかと、しばらく使わない生活をしてみた。といっても夜は真っ暗になるので、たまたま棚の奥で暇そうにしていたハリケーンランタンを引っ張り出して久々に灯した。やっぱりこっちの方が雰囲気もあっていい。ということでしばらく電灯を使わない生活をしていると、悩みの種だった不眠症は嘘のように無くなった。すごく寝付きがいいのだ。</p> -<p>就職先が決まり引越した時も、新居の天井には何も付けないで置いた。この家では台所の換気扇に暖色の豆電球が付いていたので夜はこれを使うことにした。</p> -<p>仕事を辞めて実家に帰って来てThinkPad X220を買ったので、ウェブカメラの横についているThinkLightを使っている。本当はランタンを使いたいのだが、同居人に臭いと言われるので控えている。リビングに居てはこれまた同居人がいるので真っ暗にはさせてもらえない。</p> - -<h2>変化</h2> -<p>こんな経緯でもう何年か照明を控えた生活をしている。すると身体にはいろいろと変化があるものである。ひとつ目は既に書いたが、寝付きがよくなったことである。セロトニンだかメラトニンだか知らないがやはり身体が夜を検知しているようだ。ふたつ目は暗くても物が見えるようになったことである。慣れれば見えるのだ。あるいは視力だけでなく、どこに何を置いたのかよく記憶しているのかも知れない。文明が身体を蝕んでいる証拠でもあろう。みっつめは世の中がまぶしくて仕方がなくなったことである。どうしてこうも電灯を点けて喜んでいるのか。</p> -<p>天井に電灯があり、昼も夜も灯すのが当然となっている。どうしてこうなったのか。昼は天気の善し悪しを観じ、夜は月の満ち欠けを知る。電灯は世界とのこの一体感を我々から奪ってしまった。宇宙の波動を全身で受けずして身体が整うはずがない。不眠症患者は睡眠薬を飲む前にすることがいくらでもあろう。</p> -<p>古来人間は暗い夜を火の灯りだけで生活して来た。日本の家においては昼間も薄暗いものだった。夜暗くて物が見えないのではなく、日頃不必要に明るくしているから見えないのである。便利は人間を軟弱にする。</p> -<p>ところで世の中はどうしてこうも明るいのか。スーパーもコンビニもしんどい。ドラッグストアは近付くことも憚られる。電気が足りぬと言う前に使い方を考えたらいいものを。そして夜は明るさが正義とばかりに街灯を立て、空から光を奪っている。</p> - -<h2>おわりに</h2> -<p>節約にもなるしゆったりした時間を過ごせるので電気消してみんかい?</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/medical_care.html b/pub/draft/medical_care.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>医療</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>医療</h1> -<time>2022-01-24</time>作成 -<p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/migration.html b/pub/draft/migration.html @@ -1,98 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>移住計画</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>移住計画</h1> -<h2>はじめに</h2> -<p> -都会が合わなくて田舎に戻った。 -しかし田舎といっても山村ではない。 -中途半端に都市化した街である。 -近くに高速道路があり、耳澄ませば行き交う車の音がいつも聞こえてくる。 -防災無線は毎日二回放送があり、12時と17時にはチャイムが鳴る。 -夜になってもあちこちで電灯が灯って星がよく見えない。 -</p> - -<h2>山の条件</h2> -<h3>静かであること</h3> -<p> -都会が合わなかった理由として初めに思い浮ぶのは音である。 -都会は雑音で満ちている。 -何処の店に行っても必ず音楽が流れているし、商店街等では路上でも音楽が響いている -ことさえざらである。 -さらにゴミ収集車は単純な旋律を練り廻っていて、廃品回収車やさおたけ屋が後に続く。 -防災無線は街中何処にいても必ず聞こえるように配置されている。 -このような場所において精神を正常に保つのは不可能だった。 -</p> -<p> -ということでひとつめの条件は静寂である。 -</p> -<p> -ただし自然な音は気にしない。 -実家の周りが田圃だったので夏にはかえるの大合唱が聞こえるが、これを五月蝿いとは -感じない。 -</p> -<p> -最近実家近くの山を探索している。たしかに実家にいるよりはるかに静かだが、 -立ち止まって耳を澄ませるとやはり高速道路の騒音が聞こえる。 -他の音が少ないだけに余計目立つ。 -それに防災無線の音はむしろひどい。 -山の裾にある集落のために建てられたものがあり、そこから遮るものがないので -かなりよく聞こえる。 -</p> - -<h3>安全で清潔な水源があること</h3> -<p> -実家の近くに綺麗な小川があるので水源を探ろうと山に分けいった。 -途中小さな滝があり、それを見上げるように祠があり、登るほど期待が高まった。 -ところがある程度行くと谷すじにごみがめだつようになってきた。 -さらに進むと突然コンクリートの壁が立ちはだかり、水はそこにあけられた -小さな穴から流れていた。 -コンクリートの上は舗装された道路で、ごみはそこから投げ捨てられていたようだ。 -ごみのなかには電化製品もまじっているので、何が溶け出しているかわかったものではない。 -クリーンセンターに持っていけば無料で引き取ってくれるのを知らないのだろう。 -</p> -<p> -最近のことでもないのかもしれないが、やたらと山奥にまで綺麗に舗装された -道路が伸びている。海南から紀美野町を抜けて高野山に続く道が少しづつ -広く真っ直ぐにされつつある。 -よっぽど山奥に住まない限り道路の呪縛からは逃れられないのかもしれない。 -</p> -<h3>実家から通えること</h3> -<h3></h3> - - -<h2>近くの山</h2> -<h3>藤白山</h3> -<p> -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/myrica_rubra.html b/pub/draft/myrica_rubra.html @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>ヤマモモ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>ヤマモモ</h1> -<span class="binomial name"><i>Myrica rubra</i> Sieb. et Zucc.</span> -<h2>概要</h2> -<h2>利用</h2> - <h3>食べ方</h3> - 濃い紫になったものを生でそのまま食べる。 - 種を取り除いてジャムに。 - ホワイトリカーに漬けて果実酒に。 - <h3>染料として</h3> - 樹皮をはいで - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/openbsd_installation.html b/pub/draft/openbsd_installation.html @@ -1,90 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>OpenBSDインストール</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>OpenBSDインストール</h1> -<time>2021-12-16</time> -<p>OpenBSDをノートパソコンにインストールしたのでその時のメモ</p> - -<p>インストール用のライブUSBを作成</p> -<p>ブート</p> -<p>指示通りインストール</p> - -<p>Reboot</p> -<p>通常ユーザーでログインしてルートユーザーになる</p> -<pre><code>$ su -Password: -</code></pre> - -<p><code>doas(1)</code>を設定して通常ユーザーに戻る</p> -<pre><code># cp /etc/examples/doas.conf /etc/ -# sed -i 's/permit keepenv :wheel/permit nopass keepenv :wheel/' /etc/doas.conf -# exit -$ doas echo unko -unko -</code></pre> - -<p><code>syspatch(8)</code>をあてる</p> -<pre><code>$ doas syspatch -... -Relinking to create unique kernel... done. -</pre></code> - -<p><code>apmd(8)</code>を設定</p> -<pre><code>$ doas rcctl enable apmd -$ doas set apmd flags -A -z 10 -$ rcctl start apmd -apmd (ok) -</pre></code> - -<p>wi-fiを設定</p> -<pre><code>$ ifconfig -... -iwn0 flags=... -... -$ ifconfig iwn0 up -$ doas sh -c 'echo "join <i>ssid</i> wpakey <i>password</i> -autoconf" > /etc/hostname.iwn0' -$ doas chown root:wheel /etc/hostname.iwn9 -$ doas chmod 0640 /etc/hostname.iwn0 -$ doas sh /etc/netstart -... -</pre></code> - -<p>必要なパッケージをインストール</p> -<p><code>dotfiles</code>をダウンロード</p> -<p>suckless utilitiesをインストール</p> -<p><code>man(1)</code>のパスを設定</p> -<p><code>slock(1)</code>を設定</p> -<p><code>xenodm(1)</code>を設定</p> -<p><code>mail(1)</code>の設定<a href="https://www.c0ffee.net/blog/openbsd-on-a-laptop/#base-utilities">ref</a></p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/opinion.html b/pub/draft/opinion.html @@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>意見の言い方</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>意見の言い方</h1> -<h2>檀家とのやりとり</h2> -<p>落葉を掃除している檀家さんに、落葉を綺麗にするのが本当にいいことかどうか分からないという話をした。自分の意見を言った上で相手からも考えを聞き出したかった。ところがこの人は自分の献身を否定されたと感じたらしく、機嫌が悪くなり、なにも聞いてくれなかった。一方的にこちらの言うことを全否定して終わりである。言い方やタイミングも悪かったのだろうが、こんなに拒絶されるとは思わなかった。</p> -<p>住職の奥さんは台所の整理を全くしない。冷蔵庫はぐちゃぐちゃで、奥からは腐ってなにか判別できなくなたものが沢山でてきた。中には賞味期限が10年以上前のものもあった。僕もこの寺で生活することになり、食事の用意も手伝うようになったので、少しはましな状態にしたいと思い、本人の了承のもとで古いものを全て捨てた。冷蔵庫が綺麗になり、気分よく料理できるようになった矢先、この奥さんが果物を大量に買って来た。境内で採れた西瓜や以前に買っていたバナナも残っているにも関わらずである。次の日も食べる物は冷蔵庫にたくさんあるのにスーパーで天麩羅を買ってきた。冷蔵庫の整理は結構疲れるので、これを繰り返されてはたまらない。少し小言を言った。そしたら次の日にお前は小姑のようだと言われた。</p> -<p>冷蔵庫だけでなく、寺の中もかなり物であふれている。檀家さんの好意で寺に置かれているものも多いので質が悪い。これについても色々言いたいことはあるし、実際少し言った。これなんかも奥さんには負担だったらしい。こちらにもかなり負担なのだが。</p> -<h2>宗門の批判</h2> -<p>食事中、宗門の批判をし続けて宗門に嫌われた人の話がでた。自分が正しいと思っていることを言い続けただけのことだ。住職の奥さんはなぜこれほど反発を招いたのか全く分からないと言う。やはり僕は寺の環境を良くするためにも言いたいことは言い続けるべきなのだろうか。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/relayd.html b/pub/draft/relayd.html @@ -1,66 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>relayd、httpd、acme-client</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>relayd、httpd、acme-client</h1> -<time>2025-07-17</time> - -<h2>はじめに</h2> -<p> -このサーバーでは<code>httpd</code>により80番ポートと443番ポートを監視してウェブサイトを運用していたが、別のソフトウェアを使ってバーチャルホストを立てたくなった。そこで、<code>httpd</code>の手前に<code>relayd</code>を挟んで、外から80番、443番ポートへの通信をサブドメインによって振り分けるようにした。</p> - -<figure> -<figcaption>Before</figcaption> -<pre>Internet -- tcp/80,443 -- httpd -</pre> -</figure> -<figure> -<figcaption>After</figcaption> -<pre>Internet -- tcp/80,443 -- relayd -- tcp/8080,8443 -- httpd - └------ tcp/8081 -- other http server -</pre> -</figure> - -<h2>httpd.conf</h2> -<p> -<code>httpd.conf</code>は80番ポートを監視している部分はポート番号を変更するだけでいい。443番ポートの方はポート番号の変更に加え、<code>tls</code>の部分を削除する。tlsは<code>relayd</code>が行なう。</p> - -<h2>acme-client.conf</h2> -<p> -こちらは<code>full chain certificate</code>のパス<code>relayd</code>が見つけられるように変更する。 -</p> - -<h2>relayd.conf</h2> -<p> -80番ポートはそのまま8080番に転送する。443番ポートはtlsをかませて8443番に転送する。</p> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/safety_convenience.html b/pub/draft/safety_convenience.html @@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>安全装置と便利なもの</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>安全装置と便利なもの</h1> -<time>2023-02-21</time> -<h2>安全装置は安全か</h2> -<p> -安全装置が至る所にある。キッチンのコンロは鍋を置かないと火が着かない。鍋を持ち上げると火が小さくなる。温度が高くなっても自動で火が小さくなる。温度が100度程度で安定している状態から100度を越えて上昇すると勝手に火が消える。煮こみ過ぎて焦げ付くのを防ぐためだろう。火を着けてから2時間が経過すると無条件に消える。消し忘れを防止するためである。 -</p> -<p> -自動車にも安全のための機能があれこれ搭載されている。アクセルペダルとブレーキペダルの踏み間違いを防止するもの、自動ブレーキ、車線からはみ出さないようにするもの。 -</p> -<p> -これらは本当に安全性を高めているのだろうか。</p> - -<h2>便利なものに副作用はないのか</h2> - -<h2>安全装置は危険を増長し、便利なものは身体を不便にする</h2> - -<h2># rm -rf /</h2> - -<h2>危険と不便は身体の感覚を磨く</h2> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/vi.html b/pub/draft/vi.html @@ -1,59 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>vi -- テキストエディタ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>vi -- テキストエディタ</h1> -<time>2024-10-27</time> -<h2>コマンドの実行</h2> -<p> -バッファにコピーした任意のテキストをコマンドとして実行できる。</p> -<ul> -<li> -コマンドをどこかの行に入力。 -</li> -<li> -コマンドをバッファ<code>q</code>へコピー: -<code>0"qy$ -</code> -</li> -<li> -バッファ<code>q</code>内のコマンドを実行: -<code>@q -</code> -</li> -</ul> -<p> -例えば単語をhtmlの<code>code</code>タグで囲むコマンド: <pre><code>i&lt;code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u>lea&lt;/code&gt;<u>&lt;ctrl-v&gt;&lt;esc&gt;</u> -</code></pre> -をどこかに入力し、その行でコマンドモードに移行し、<code>0"qy$</code>とすると<code>q</code>バッファに上のコマンドがコピーされるので、<code>code</code>タグで囲みたい単語の先頭に移動し、<code>@q</code>と入力するとその単語が<code>code</code>タグで囲まれる。 - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/draft/xlib2.html b/pub/draft/xlib2.html @@ -1,181 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Xlibで遊んでみる</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Xlibで遊んでみる</h1> -<time>2022-12-16</time> - -<h2>はじめに</h2> -<p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> -<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> -<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 - -<h2>初期設定</h2> -<p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p> -<pre><code> -#include &lt;stdio.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;X11/Xlib.h&gt; - -/* macros */ -#define INIT_WIDTH 800 -#define INIT_HEIGHT 600 - -/* variables */ -Display *display; -Window window; -unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; -Atom wm_delete_window; - -void -setup(void) -{ - // Open a display. - if ((display = XOpenDisplay(NULL)) == NULL){ - fprintf(stderr, "ERROR: could not open display\n"); - exit(1); - } - // Create a window. - window = XCreateSimpleWindow( - display, - XDefaultRootWindow(display), - 0, 0, - win_width, win_height, - 0, 0, - 0); - XStoreName(display, window, "UNKO"); - - // Setup a graphical context. - gc = XCreateGC(display, window, 0, NULL); - XSetForeground(display, gc, 0xFFFFFF); - - // Kill the application when the window is destroyed. - wm_delete_window = XInternAtom(display, - "WM_DELETE_WINDOW", False); - XSetWMProtocols(display, window, &wm_delete_window, 1); - - // Setup which input to process. - XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); - - // Actually draw the window. - XMapWindow(display, window); -} - -void -clean_up(void) -{ - XCloseDisplay(display); -} -</code></pre> - -<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> -<pre><code>#include &lt;time.h&gt; - -int -main(void) -{ - int px, py; - int quit; - struct timespec ts; - XEvent event; - - setup(); - quit = 0; - - while (!quit){ - while(XPending(display) > 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - clock_gettime(CLOCK_MONOTONIC, &ts); - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - 100, 100); // width and height - - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000 * 1000; - nanosleep(&ts, NULL); - } - - cleanup(); - return 0; -} -</code></pre> - -<p>文字を表示。<code>XDrawString</code></p> - -<h2>キーボード入力</h2> -<p>キーボードの入力を受け付けるようにする。入力によって四角形の位置や速度を変化させる。</p> -<p>ここまでできればかなりなんでもできるようになる。</p> - -<h2>FPSの固定</h2> -<p>前のフレームからの経過時間を計測して1/FPSを越えるまで待機させる。このときに<code>nanosleep</code>を使うとなぜか上手くいかなかった。OSに処理をブロックされる為か?とりあえず<code>while</code>ループの中でひたすら時刻を読んでいるのだが、これでいいんかな。リソースの無駄遣いではないんかな。</p> - -<h2>メニューの実装</h2> -<p>メニューとゲームの推移を実装した。</p> - -<h2>当たり判定</h2> -<p>とりあえず適当に実装した。2体間の衝突のみ判定しているので近くに別の物体がいるとめりこむ場合がある。</p> -</p> - - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/error/404.html b/pub/error/404.html @@ -1,35 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>404 Not Found</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>404 Not Found</h1> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/error/moved.html b/pub/error/moved.html @@ -1,36 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>移転しました</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>移転しました</h1> -<p>hatsukaze.comは<a href="https://www.mtkn.jp">mtkn.jp</a>に移転しました。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/farm/index.html b/pub/farm/index.html @@ -1,46 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>農業</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>農業</h1> -<p> -実家の近くに田畑を借りて作物を育てています。1反の畑と9畝の田圃です。川口由一さんの提唱された、耕さず、農薬や肥料を持ち込まず、草や虫を敵としない自然農を行っています。 -</p> -<p> -<time>2023-01-19</time>令和4年の5月頃、体調を崩したため一旦畑は地主さんに返すことにしました。以来農業からは離れています。 -</p> -<h2>日誌</h2> -<ul> - <li><a href=/farm/journal/2022.html>令和4年</a></li> - <li><a href=/farm/journal/2021.html>令和3年</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/farm/journal/2021.html b/pub/farm/journal/2021.html @@ -1,179 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>令和3年 農業日誌</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>令和3年 農業日誌</h1> -(旧暦) - -<h3>師走</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-01-27</time> -</div> -晴。畑の畝作り。菜っ葉の間引き。畝の間の溝に水が貯まっている。もう少し乾燥していたほうがいいのだろうか。菜っ葉はどれも成長が良いように見える。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-01-08</time> -</div> -晴。畑の方に畝を少し作った。じゃが芋を植えたいので少し高めの畝にする。昨年度は雨が続いて水没した部分が腐ってしまったのだ。今年はうまくいくといいな。新暦では年が明けた。今日は一日遅れたが七草粥を食べた。畑の隅に大根の余った苗をまとめていたのでそれを抜いて粥に入れた。成長がいいものは太さが15mm程度になっていた。玉葱の苗もまた少し定植した。始めの方に植え替えたもののうち一本だけ葉が太く、濃い緑になっていた。他のものは植えてから変化がないように見える。麦も変化があまりない。 -</div> - -<h3>霜月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-12-21</time> -</div> -晴。田圃の溝を少し整備。麦が成長してひとつめの畝は遠くからでもうっすらと緑に見えるようになった。畑の野菜もそれなりに育っている。 -<figure><figcaption>和歌山大根</figcaption><img src="pics/DSCF0249.JPG" alt="和歌山大根"></figure> -<figure><figcaption>大和真菜</figcaption><img src="pics/DSCF0252.JPG" alt="大和真菜"></figure> -<figure><figcaption>松島新二号白菜</figcaption><img src="pics/DSCF0255.JPG" alt="松島新二号白菜"></figure> -<figure><figcaption>いちばんぼし(裸大麦)</figcaption><img src="pics/DSCF0257.JPG" alt="いちばんぼし(裸大麦)"></figure> -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-12-19</time> -</div> -曇り時々雨。玉葱の定植。白菜、大根、真菜等が大きくなってきた。麦も大分育ったので踏もうとしていたら雨が降って来てできなかった。畔に子猫が居た。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">12日</div> -<time>2021-12-14</time> -</div> -晴。久々に冬らしく寒い朝だった。昼間は日が照って暑い。壬生菜の定植。畝作り。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2021-12-11</time> -</div> -晴。麦蒔きが完了した。庭のプランターに植えていた壬生菜を半分ほど畑に植えかえた。大根がわずかに太くなっている。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2021-12-10</time> -</div> -晴。日差しが強くて暑い。麦の続き。4本目の畝は小さいので草を刈らずに上から蒔いた。結局草刈りは全部は終わらず次の日に持ち越し。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">5日</div> -<time>2021-12-08</time> -</div> -晴。麦の続き。3本目の畝に蒔き終わった。始めに蒔いたところはそろそろ麦踏みか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">3日</div> -<time>2021-12-06</time> -</div> -晴。麦の続き。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2021-12-04</time> -</div> -曇時々晴。麦の続き。玉葱の移植。太いものから7本植えた。 -</div> - -<h3>神無月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2021-12-03</time> -</div> -晴。麦の続き。疲れがでてしばらく休んでいた。気付けば一週間ぶりの作業である。急いては事を仕損じる。結局ゆっくりやったほうが早く蒔けていただろう。始めに蒔いた麦はもう5cmほどに成長していた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">21日</div> -<time>2021-11-25</time> -</div> -曇時々雨。麦を蒔くための草刈りの続き。今日は200g蒔けた。既に蒔いていたものからもやしのようなものが出ているのを確認。根っこか。玉葱と壬生菜の苗も大きくなってプランターでは窮屈そうなので早く定植しなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-11-23</time> -</div> -晴のち曇。麦を蒔くための草刈りの続き。3時頃まで出掛けていたので今日は1時間だけ作業。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-11-21</time> -</div> -晴。麦蒔きの続き。蒔いてから草を刈るのではいそがしいので草を刈ってから蒔くことにした。また短期間のうちに全面蒔くのはあきらめた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">16日</div> -<time>2021-11-20</time> -</div> -晴。麦を蒔いた。一番長い畝の2/3ほど蒔けた。ばら蒔きした後草を刈る。この草刈に思ったより時間がかかる。のこぎり鎌でないと歯がすぐに丸くなる。買い替えようか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2021-11-18</time> -</div> -曇後晴。昼過ぎまで曇りで寒かったが昼から晴れて暑い。麦の畝がだいたい形になったところに丁度麦の種が届いた。和歌山県農業公社に申請していた畑を借りるための申請が通りそうだと、JAの人から連絡が入った。晴れて農家である。畑の方に山東菜を蒔いた。作業が続いて筋肉の動きが鈍ってきた。疲れない動き方ができるようになりたい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2021-11-17</time> -</div> -快晴。朝は季節にふさわしく寒いが日差しが強く昼は暑い。出掛ける時、以前声を掛けてくれた92才のおじいちゃんとすれ違う。田圃に畝を作るために溝を掘った。この田圃を借りてから続けていた作業だがもう少しで終りそうだ。11月中旬が麦蒔ききの適期であり既に少し遅い。田圃の隣のおばちゃんが蜜柑をくれた。 -</div> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/farm/journal/2022.html b/pub/farm/journal/2022.html @@ -1,221 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>令和4年 農業日誌</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>令和4年 農業日誌</h1> -(旧暦) - -<h3>卯月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-05-09</time> -</div> -溝掃除。しばらく雨が降っていない。最後に米を蒔いてからは一回も降っていないと思う。曇って来たので降ってくれることを期待。畑の真黒茄子の一部が発芽した。自分用のメモとしてこの日誌を書いているので作物の位置関係が分かりにくい。なんかうまいこと表示できるやつ作ろうかな。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-05-04</time> -</div> -晴れ。朝は寒く、昼から暑い。一ヶ月程機構が戻ったようだ。昨年キミノーカで買った栗南瓜を、以前蒔いた南瓜の南に、春菊を白もちとうもろこしの一回目の北に、寄居蕪を白もちとうもろこしの二回目の北に、五角オクラを米の隣の里芋の南に、ときわ地這い胡瓜をこのオクラと里芋と同じ場所に、いちずいんげんを鷹の爪から米までの間にある背丈の高い草の足元に植えた。米の所に生えていた雑草は成長が案外遅く、米の方が高くなりつつある。じゃが芋のアンデスに花が咲いていた。鷹の爪の北に蒔いた葱がようやく生えてきた。生きとったんかわれ。麦は早いものはもう収穫してもよさそうなくらい色付いてきた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-05-02</time> -</div> -米の続き。最後の4mを鷹の爪の南に蒔いた。初めに蒔いた米は既に発芽を確認。然し別のイネ科の草もたくさん生えてきた。軸が赤い草である。家のプランターにも余った米を蒔いた。あと鷹の爪と加茂大芹川丸茄子、ししとうと真黒茄子をそれぞれ一緒に蒔いた。家で苗になればいいが。 -</div> - -<h3>弥生</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">30日</div> -<time>2022-04-30</time> -</div> -米の続き。朝から半日かけて4m程。田の畔も少し補強。里芋も追加で植えた。西瓜の北と茄子の南。昼からも作業したかったが疲れてしまった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-04-25</time> -</div> -20日にも畑に出たと思うが記録していなかった。20日は米の続き。前回4m程蒔いたがこの時は2mにした。疲れは禁物である。25日も米の続きに加え、蒟蒻をアンデスの南に植えた。あとは鷹の爪を適当に蒔いた。前回蒔いた所に上からばら蒔きしただけである。米の方は今回午前には2m蒔いた。午後もできるだろうか。麦の下の方が茶色くなってきた。午後も米の続き。また2m程。旭大和西瓜を男爵の東と空豆の北に、男爵の東の西瓜の南にとある露天で買った日本南瓜を、日野菜の東のあたりに池田越瓜を植えた。滝野川牛蒡の南にしろもち玉蜀黍を植えた。男爵の南に落花生を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2022-04-19</time> -</div> -米を蒔いた。20mの畝のうち4m程。体力を消耗したうえ花粉症と喘息で眠れなかった。身体を作りアレルギーを何とかしなければ。呼吸と食事を見直さないといけない。一日寝込むだけで半年間の食糧が手に入らないのはきびしい世界である。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-04-14</time> -</div> -晴。前日の夜から朝にかけて雨だった。麦は全体的に出穂していた。畑の北側の空いていた場所と空豆が倒れたり成長が悪くてできた隙間に里芋を植えた。多分全て芽赤芋?2つ程昨年のものが混じっているかも知れない。畑の北の方はカラスノエンドウが群生している。日野菜が残っていた所に寄居蕪を蒔いた。日野菜は刈ってしまったが必要なかったか。以前大浦太牛蒡を蒔いた隣に同じ牛蒡を植えた。以前は点蒔きだったが今回は二条のすじ蒔きにした。以前のものは少しだが芽が出ていた。同じ畝の北に植えていた滝野川大長牛蒡も発芽。しろもち玉蜀黍を日野菜を蒔いた北に植えた。薩摩芋の種芋の南に真黒茄子を植えた。鷹の爪を葱の苗床の南に植えた。ノゲシとキツネアザミと多分サワオグルマのしっかりした茎が支柱代りになればと思って畝の中央だけを草刈りして両端は残した。空豆の莢が大きくなって来た。玉葱も大きいものはちゃんと玉になっている。菜っ葉類の種の一部に奇形が見られた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-04-09</time> -</div> -赤目自然農塾に行った。一日目は便所の補修と猪よけの柵の設置を行った。身体を保護するものが嫌いなので軍手を着用していなかったが案の定トタンの波板で指を切った。他人との共同作業においては少し考えないといけない。二日目は米の種おろしの実習だったが眠くてあまり集中できなかった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2022-04-07</time> -</div> -晴。日射しが強くて暑さがこたえるようになってきた。防止がそろそろ必要である。薩摩芋を植えた。空豆の莢が出てきているのを確認した。米を蒔く場所を軽く草刈りした。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-04-02</time> -</div> -晴。最近寒さが戻ったようで、外に出るのが億劫である。田の畔を補強した。毎日少しの時間でも畑に出ないと体ができてこないように思う。隣の畑の人が夫婦で来ていた。奥さんと顔を合わせるのはおそらく初めてである。家で薩摩芋と里芋が芽をふき始めた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-04-01</time> -</div> -晴。前日は雨。前回より排水はよくなっていた。新3月27日には麦の出穂を確認。さらに大きくなっていた。草の勢いが強い。今日は新しく買った大浦太牛蒡を蒔いた。寄居蕪を前回同様日野菜の後に蒔いた。日野菜もそのふたつ隣りの畝に蒔いた。以前蒔いていた法蓮草、春菊、牛蒡が発芽。じゃが芋の芽も出てきた。体力を付けねば。 -</div> - -<h3>如月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">22日</div> -<time>2022-03-24</time> -</div> -晴。しばらく雨ばかりで畑が水浸しだった。一部に下の田圃への水路を開けて排水を計った。注文していた種がようやく届いたので少し蒔いた。寄居蕪を日野菜が植わっていた場所に少し、牛蒡(これは以前買っていたもの)を少し、それから葱を蒔いた。高菜を収穫した。土筆がたくさんあったので取って来て佃煮にした。上の畑にれんげが咲いているのを見つけた。年末に蒔いた菜っ葉類は花盛りで蜂もたくさん来ている。交配しなければいいがさすがに近すぎるだろう... -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2022-03-15</time> -</div> -晴。日差しが暑い。隣の畑の人が何かを散布していた。除草剤だろうか。真菜が花盛りである。日野菜はほとんど花を刈り取った。大根も咲いていた。壬生菜も咲きそうだったので少し収穫。山東菜も咲きはじめ。台所で芽を出していた大蒜を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-03-13</time> -</div> -晴後曇り。今日から明日にかけて雨が降るというので法蓮草を蒔いた。ばら蒔きして草を刈っただけだがうまく発芽してくれるだろうか。後は牛蒡も蒔いた。天気予報に頼ってしまうのは気分がよくない。体感上朝の晴れていたうちもじめじめしていた気がするし、雨の予感はあったと思うのは後付けだろうか。天気を感覚で分かるようになりたい。菜の花が咲いていた。日野菜と真菜である。白菜の葉も起き上がって、遠目には結球したように見える。麦が一段と大きくなった。やっと背が高くなりはじめた。しかし初めに蒔いた所と後れて蒔いた所の差が大きい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-03-08</time> -</div> -晴ていたように思う。竹を貰いに行ってから体調が落ちた。杉だらけだったので花粉症がひどくて眠れなかった。もう春が来た。大根と高菜を収穫し、小松菜と春菊を蒔いた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-03-06</time> -</div> -晴後曇り。大根と山東菜を少し収穫して地主さんに持って行った。地主さんが持っているという竹薮の場所を教えてもらった。今日は少し寒さが戻った。そろそろまた菜っ葉の種を蒔きたい。じゃが芋を植えるのと、米の苗床の準備もしなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-03-04</time> -</div> -晴後曇り。日野菜と大根を少し収穫。大根の葉を炒めものに、日野菜の根を煮物にした。日野菜の細いものは筋があって硬かった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-03-03</time> -</div> -生協で買ったじゃがいもを芽出ししていたが、出揃ってきたので半分に切った。植付けは四日か五日頃か。 -</div> - -<h3>睦月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2022-03-01</time> -</div> -雨だったと思う。真菜を収穫して胡麻和えにした。真菜にも日野菜にも蕾が出はじめている。雨の作業も寒さがなければ楽しい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">28日</div> -<time>2022-02-18</time> -</div> -晴。突然春らしい日になった。朝はまだ寒かったが、日中はかなり気温が上がった。畑に畝を作る続きを行った。田の麦はまた育ったように見える。まだ高さはないが横に広がり、最後に種蒔きした所も全体的に緑になってきている。畑では空豆の花が咲いていた。やはり風が強いのか、あまり高くはならず横に広がっている。あるいは土が硬くて根が浅いのか。アブラ菜科も春を感じてか、とう立ちの気配がある。白菜と大根はその中心に蕾のようなものが準備されている。花の時期が少しずれてくれればいいのだが。畑に死んだ雀が落ちていた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-02-14</time> -</div> -曇り後晴。午前は先日落札した唐箕を貰いに言った。他にも手箕や籠を貰った。午後はじゃが芋を植えた。昨日購入したアンデスである。芽が出ていないものも数個あったが気にせず植えた。畝が低く感じたので溝を少し掘り下げて中央に盛った。昨日の雨が溜っていたので土が粘土のようになったが大丈夫だろうか。一応高さは確保できたのでいい具合に乾いてくれればいいが。株間30cm、条間40cm程度。畝幅は120cmで二条に植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-02-11</time> -</div> -晴。朝は非常に寒い。田の畔を少し整えた。田圃の端を隣の人が通路として使いたいとのことなので、水を漏らさないようにしないといけない。昨日地主さんに電話したところ、この田の水利費は払ってくれているという。溝掃除は各自やるとのことなので早めにやってしまおう。 -</div> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/farm/journal/pics/DSCF0249.JPG b/pub/farm/journal/pics/DSCF0249.JPG Binary files differ. diff --git a/pub/farm/journal/pics/DSCF0252.JPG b/pub/farm/journal/pics/DSCF0252.JPG Binary files differ. diff --git a/pub/farm/journal/pics/DSCF0255.JPG b/pub/farm/journal/pics/DSCF0255.JPG Binary files differ. diff --git a/pub/farm/journal/pics/DSCF0257.JPG b/pub/farm/journal/pics/DSCF0257.JPG Binary files differ. diff --git a/pub/farm/journal/pics/DSCF0258.JPG b/pub/farm/journal/pics/DSCF0258.JPG Binary files differ. diff --git a/pub/gallery/20231005.html b/pub/gallery/20231005.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>結束バンド</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>結束バンド</h1> -<time>2023-10-05</time> -<img src="img/20231005.png"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20231007.html b/pub/gallery/20231007.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>後藤ひとり</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>後藤ひとり</h1> -<time>2023-10-07</time> -<img src="img/20231007.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20231018.html b/pub/gallery/20231018.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>チルノ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>チルノ</h1> -<time>2023-10-18</time> -<img src="img/20231018.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20231202.html b/pub/gallery/20231202.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title></title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1></h1> -<time>2023-12-02</time> -<img src="img/20231202.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20240101.html b/pub/gallery/20240101.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>謹賀新年</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>謹賀新年</h1> -<time>2024-01-01</time> -<img src="img/20240101.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20240628.html b/pub/gallery/20240628.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>さくらクレパス</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>さくらクレパス</h1> -<time>2024-06-28</time> -<img src="img/20240628.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20240629.html b/pub/gallery/20240629.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>さくらクレパス</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>さくらクレパス</h1> -<time>2024-06-29</time> -<img src="img/20240629.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20240702.html b/pub/gallery/20240702.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>さくらクレパス</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>さくらクレパス</h1> -<time>2024-07-02</time> -<img src="img/20240702.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20240727.html b/pub/gallery/20240727.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>さくらクレヨン</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>さくらクレヨン</h1> -<time>2024-07-27</time> -<img src="img/20240727.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20250101.html b/pub/gallery/20250101.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>謹賀新年</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>謹賀新年</h1> -<time>2025-01-01</time> -<img src="img/20250101.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/20250717.html b/pub/gallery/20250717.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>自画像</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>自画像</h1> -<time>2025-07-17</time> -<img src="img/20250717.jpg"> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/gallery/img/20231005-thumb.png b/pub/gallery/img/20231005-thumb.png Binary files differ. diff --git a/pub/gallery/img/20231005.png b/pub/gallery/img/20231005.png Binary files differ. diff --git a/pub/gallery/img/20231007-thumb.jpg b/pub/gallery/img/20231007-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20231007.jpg b/pub/gallery/img/20231007.jpg Binary files differ. diff --git a/pub/gallery/img/20231018-thumb.jpg b/pub/gallery/img/20231018-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20231018.jpg b/pub/gallery/img/20231018.jpg Binary files differ. diff --git a/pub/gallery/img/20231202-thumb.jpg b/pub/gallery/img/20231202-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20231202.jpg b/pub/gallery/img/20231202.jpg Binary files differ. diff --git a/pub/gallery/img/20240101-thumb.jpg b/pub/gallery/img/20240101-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20240101.jpg b/pub/gallery/img/20240101.jpg Binary files differ. diff --git a/pub/gallery/img/20240628-thumb.jpg b/pub/gallery/img/20240628-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20240628.jpg b/pub/gallery/img/20240628.jpg Binary files differ. diff --git a/pub/gallery/img/20240629-thumb.jpg b/pub/gallery/img/20240629-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20240629.jpg b/pub/gallery/img/20240629.jpg Binary files differ. diff --git a/pub/gallery/img/20240702-thumb.jpg b/pub/gallery/img/20240702-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20240702.jpg b/pub/gallery/img/20240702.jpg Binary files differ. diff --git a/pub/gallery/img/20240727-thumb.jpg b/pub/gallery/img/20240727-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20240727.jpg b/pub/gallery/img/20240727.jpg Binary files differ. diff --git a/pub/gallery/img/20250101-thumb.jpg b/pub/gallery/img/20250101-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20250101.jpg b/pub/gallery/img/20250101.jpg Binary files differ. diff --git a/pub/gallery/img/20250717-thumb.jpg b/pub/gallery/img/20250717-thumb.jpg Binary files differ. diff --git a/pub/gallery/img/20250717.jpg b/pub/gallery/img/20250717.jpg Binary files differ. diff --git a/pub/gallery/index.html b/pub/gallery/index.html @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>絵</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>絵</h1> - -<ul class="galind"> -<li><a href="20250717.html"><img src="img/20250717-thumb.jpg"></a></li> -<li><a href="20250101.html"><img src="img/20250101-thumb.jpg"></a></li> -<li><a href="20240727.html"><img src="img/20240727-thumb.jpg"></a></li> -<li><a href="20240702.html"><img src="img/20240702-thumb.jpg"></a></li> -<li><a href="20240629.html"><img src="img/20240629-thumb.jpg"></a></li> -<li><a href="20240628.html"><img src="img/20240628-thumb.jpg"></a></li> -<li><a href="20240101.html"><img src="img/20240101-thumb.jpg"></a></li> -<li><a href="20231202.html"><img src="img/20231202-thumb.jpg"></a></li> -<li><a href="20231018.html"><img src="img/20231018-thumb.jpg"></a></li> -<li><a href="20231007.html"><img src="img/20231007-thumb.jpg"></a></li> -<li><a href="20231005.html"><img src="img/20231005-thumb.png"></a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/index.html b/pub/index.html @@ -1,74 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>松露庵</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>松露庵</h1> - -<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> - -<p> -学問を志して挫折し、就職して適応障害になり、社会のしがらみから離れて田舎でのんびり暮らしています。 -</p> - -<h2>更新履歴</h2> -<a href="/rss.xml">RSS</a> -<ul> -<li>2025-12-20 <a href="/computer/x11_32bit_window.html">X11で深さが32bitのwindowを作成する</a></li> -<li>2025-11-22 <a href="/journal/posts/20251122.html">ひさしぶりに合気道した</a></li> -<li>2025-08-27 <a href="/computer/rp2040_3_interrupt.html">RP2040 SDKなし3 割り込み</a></li> -<li>2025-07-17 <a href="/gallery/20250717.html">自画像</a></li> -<li>2025-05-19 <a href="/journal/posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> -<li>2025-04-28 <a href="/computer/openbsd_on_u9310e.html">OpenBSD on Fujitsu LIFEBOOK U9310/E</a></li> -<li>2025-04-20 <a href="/journal/posts/20250420.html">大阪万博行った</a></li> -<li>2025-03-29 <a href="/plant">タネツケバナ咲いてた</a></li> -<li>2025-02-21 <a href="/journal/posts/20250221.html">着物作った</a></li> -<li>2025-02-16 <a href="/journal/posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> -<li>2025-01-01 <a href="/gallery/20250101.html">年賀状</a></li> -<li>2024-12-19 <a href="/computer/9p.html">9P</a></li> -<li>2024-12-11 <a href="/journal/posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> -<li>2024-12-02 <a href="/journal/posts/20241202.html">椅子作った</a></li> -<li>2024-10-10 <a href="/kitchen/recipe/mapo_tofu.html">麻婆豆腐</a></li> -<li>2024-10-09 <a href="/journal/posts/20241009.html">棚作った</a></li> -<li>2024-07-30 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2024-04-28 <a href="/journal/posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> -<li>2024-02-22 <a href="/computer/rp2040_2.html">RP2040 SDKなし2 Clock、UART</a></li> -<li>2024-02-15 <a href="/computer/git_server.html">Gitサーバーの設定 on OpenBSD</a></li> -<li>2024-02-09 <a href="/kitchen/recipe/miso.html">味噌</a></li> -<li>2024-01-19 <a href="/computer/mailserver.html">メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</a></li> -<li>2024-01-11 <a href="/computer/what-i-use.html">使用しているハードウェア、ソフトウェア</a></li> -<li>2024-01-01 <a href="/gallery/20240101.html">年賀状</a></li> -<li>2023-12-02 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2023-10-24 <a href="/gallery/index.html">絵を追加した</a></li> -<li>2023-10-07 <a href="/gallery/20231007.html">絵を描いた</a></li> -<li>2023-08-10 <a href="/journal/posts/20230810.html">イソヒヨ</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/index.html b/pub/journal/index.html @@ -1,83 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>日記</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>日記</h1> -<ul> -<li>2025-11-22 <a href="posts/20251122.html">ひさしぶりに合気道した</a></li> -<li>2025-05-19 <a href="posts/20250519.html">万博で知り合ったルーマニア人とハイキングに行った</a></li> -<li>2025-04-20 <a href="posts/20250420.html">大阪万博行った</a></li> -<li>2025-02-21 <a href="posts/20250221.html">着物作った</a></li> -<li>2025-02-16 <a href="posts/20250216.html">きのかわ弦楽合奏団 さくらコンサート</a></li> -<li>2024-12-11 <a href="posts/20241211.html">きのかわ弦楽合奏団 第5回コミュニティコンサート</a></li> -<li>2024-12-02 <a href="posts/20241202.html">椅子作った</a></li> -<li>2024-10-09 <a href="posts/20241009.html">棚作った</a></li> -<li>2024-04-28 <a href="posts/20240428.html">きのかわ弦楽合奏団第7回定期演奏会</a></li> -<li>2023-08-10 <a href="posts/20230810.html">イソヒヨ</a></li> -<li>2023-08-03 <a href="posts/20230803.html">サマータイムレンダ読んだ</a></li> -<li>2023-08-02 <a href="posts/20230802.html">着物できた</a></li> -<li>2023-07-29 <a href="posts/20230729.html">無題</a></li> -<li>2023-07-26 <a href="posts/20230726.html">GOPL読んだ</a></li> -<li>2023-07-25 <a href="posts/20230725.html">水道と空調</a></li> -<li>2023-01-19 <a href="posts/20230119.html">寺を辞めた</a></li> -<li>2022-12-28 <a href="posts/20221228.html">Holy Shit!</a></li> -<li>2022-10-31 <a href="posts/20221031.html">大阪駅にて</a></li> -<li>2022-10-23 <a href="posts/20221023.html">寺に適応できない</a></li> -<li>2022-08-14 <a href="posts/20220814.html">田舎の夏休み</a></li> -<li>2022-08-13 <a href="posts/20220813.html">正座ができていた頃に戻るには</a></li> -<li>2022-07-30 <a href="posts/20220730.html">新型コロナウイルスとその対策に関する個人的見解</a></li> -<li>2022-07-29 <a href="posts/20220729.html">RSS作った</a></li> -<li>2022-05-13 <a href="posts/20220513.html">坊主になるために薬の服用を強要されそうになってる。</a></li> -<li>2021-12-14 <a href="posts/20211214.html">無題</a></li> -<li>2021-11-29 <a href="posts/20211129.html">赤目自然農塾</a></li> -<li>2021-08-06 <a href="posts/20210806.html">畑を返すことになった。</a></li> -<li>2021-01-06 <a href="posts/20210106.html">x220から投稿テスト</a></li> -<li>2020-12-10 <a href="posts/20201210.html">小松菜の種を蒔いた。</a></li> -<li>2020-12-09 <a href="posts/20201209.html">畝を繋げた</a></li> -<li>2020-12-02 <a href="posts/20201202.html">たまねぎを植えた。</a></li> -<li>2020-12-01 <a href="posts/20201201.html">畑をさせてもらえることになった。</a></li> -<li>2020-10-03 <a href="posts/20201003.html">何をして生きようか</a></li> -<li>2020-09-26 <a href="posts/20200926.html">SSLに対応しました。</a></li> -<li>2020-09-25 <a href="posts/20200925.html">rsyncによる投稿テスト</a></li> -<li>2020-09-19 <a href="posts/20200919.html">工場見学</a></li> -<li>2020-09-18 <a href="posts/20200918.html">仕事</a></li> -<li>2020-09-17 <a href="posts/20200917.html">pythonやめました</a></li> -<li>2020-08-08 <a href="posts/20200808.html">冷蔵庫と豊かな生活</a></li> -<li>2020-08-04 <a href="posts/20200804.html">localからの投稿テスト</a></li> -<li>2020-08-02 <a href="posts/20200802.html">今日の一汁一菜</a></li> -<li>2020-08-01 <a href="posts/20200801.html">Djangoやめました</a></li> -<li>2020-07-27 <a href="posts/20200727.html">けの日</a></li> -<li>2020-07-25 <a href="posts/20200725.html">Django使うのやめようかな</a></li> -<li>2020-07-23 <a href="posts/20200723.html">多少体裁を整えました</a></li> -<li>2020-07-19 <a href="posts/20200719.html">最初の投稿</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200719.html b/pub/journal/posts/20200719.html @@ -1,42 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>最初の投稿</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>最初の投稿</h1> -<time>2020-07-19</time> -とりあえずサイトの立ち上げが完了しました。最初の投稿です。 -まだhtmlは適当でcssは全く無いので味気ないサイトですがこれからいろいろといじっていければと思います。 - -この投稿も多分改行が反映されずに読みにくいものになるかと思いますが、記録として残しておきたいので書いておきます。 - -ただしdockerとpostgresqlのことがいまいちよくわかっていないので、間違ってデータベースごとけしてしまうかもしれません。まあそれはご愛嬌。 - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200723.html b/pub/journal/posts/20200723.html @@ -1,60 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>多少体裁を整えました</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>多少体裁を整えました</h1> -<time>2020-07-23</time> -<section> -<h5>変更点</h5> -<p>とりあえず改行できなかったり装飾できなかったり不便なので、 -htmlで投稿できるように変更しました。</p> -<p>それからcssを作って多少見れるようにしました。</p> -</section> - -<section> -<h5>これから</h5> -<p>サイトのデザインですが、できるだけシンプルにしたいと考えています。 -モダンな感じのページは多いですが、視覚効果が多すぎるように感じます。 -本当に必要があってつけているのか、”いい感じ”だからつけているだけなのか… -</p> -<p> -必要なのは投稿の中身と、それから横には目次があると読みやすくなると思っています。 -サイドバーはそのために作っています。 -</p> -<p>あとは投稿の中に画像を埋め込みたいです。</p> -</section> - -<section> -<p>そういえばドメインを契約してDNSにIPアドレスを登録したのですが、丸3日たっても名前解決できません。 -いつになったらつながるのかな。</p> -</section> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200725.html b/pub/journal/posts/20200725.html @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Django使うのやめようかな</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Django使うのやめようかな</h1> -<time>2020-07-25</time> -<p> -ホームページにも書いてあるとおり、このサイトはDjangoを使っている。 -しかしほとんど基本的な機能しか使わないのでここまで複雑で大きい -フレームワークを使う必要性は皆無である。 -全く使わない機能は結局習得することもないので、邪魔なだけだ。 -この程度のサイトであればもっとシンプルなもので作れそうだ。 -</p> - -<p> -半年ほど前にMacBookからOSXを消してLinux Mintに移行した。 -インターネットの回線に高額な料金を払うのが嫌で、一度すべて解約したのだが、 -OSXだとユーザーが何もしていなくてもバックグラウンドで大量の通信が -行われており、128kbpsでは何もできなくなったため、勝手に通信しない -Linuxに変えたのである。 -</p> - -<p> -ところがこのLinux Mint、というかデスクトップ環境のxfceには自分には全く必要の -ないアプリケーションが大量に入っているのである。もちろんOSXなんかより -圧倒的にましではあるが… -だんだん嫌になって、あまり考えずに片っ端から消していったら、 -なぜかはよくわからないが起動しなくなってしまった。 -これが確か今年の5月ごろだっただろうか。 -</p> - -<p> -丁度いい機会なのでLinuxの中でも何もない方であるArchのインストールを -試みることにした。 -過去にも何度か挑戦して、そのたびによくわからずに諦めていたが、 -今はパソコンを仕事などでも使っていないということもあり、落ち着いて -ドキュメントを読みながら進めると案外あっさりインストールできてしまった。 -</p> - -<p> -非常に快適である。 -</p> - -<p> -最近携帯を買い替え、人生で初めてAndroidというものを触ったが、 -これもかなり不要なものが入っていて不愉快だ。 -シャープお手製のよくわからないものは案外控えめだったが、 -キャリアである楽天関係のアプリに加え、Googleのアプリケーションが -大量にインストールされている上、それらはさも当たり前のように僕の -個人情報を要求するのである。 -</p> - -<p> -不必要な"便利さ"のためにただで情報を収集する。 -"最大限の便利さ"を提供することが正義で、そのためにはプライバシーを -犠牲にしてもいいと思っている。 -余計なお世話だ。 -</p> - -<p> -このページももっと軽い感じにしたいな。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200727.html b/pub/journal/posts/20200727.html @@ -1,80 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>けの日</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>けの日</h1> -<time>2020-07-27</time> -<section class="introduction"> -<p>普段の生活を少しばかり記録しておこうと思う。</p> -<p>社会人一年目の7月の終わり頃の生活である。</p> -</section> - -<section class="morning"> -<p> -朝はだいたい四時から四時半には目が覚める。 -ちょうど日の出と同じ頃である。 -前日はだいたい九時半頃布団に潜るので睡眠時間は七時間といったところである。 -本当は八時間寝たほうがいいと思っていたが、七時間で自然と目が覚めるので自分には -このくらいがあっているようだ。 -</p> -<p> -朝日を眺めながら米を火にかけ、余っている野菜で煮物を二品ほど作る。 -糠床から香の物を拝借してくれば弁当の完成である。 -朝食は食べない。 -</p> -<p> -布団を畳んで箒をかけ、フローリングは雑巾で軽く拭く。 -今の借家に越してきてから雑巾がけを始めたが、思えば小学校以来かもしれない。 -</p> -<p> -煮物に使った鍋をゆすぎお湯を沸かす。 -バットやボウルを片付けてきれいになったキッチンにコーヒーカップとビーカーを並べる。挽きたての豆で淹れたコーヒーを飲みながらこのブログのソースコードをいじるなどして七時をまつ。 -</p> -<p> -時間になれば着替えて出社。 -</p> -</section> - -<section class=evening> -<p> -五時に退社し帰宅。 -集に二回ほどは途中で豆腐を仕入れに高橋豆腐店に、魚を仕入れに小平鮮魚店に立ち寄る。 -家に着いたら米を火にかけその隣で出しをとる。 -余った野菜で味噌汁ともう一品作り、糠床から香物を拝借すれば夕飯の一汁一菜。 -</p> -<p> -その後はネットをちょつと見るくらいで、 -すぐに風呂にはいって寝てしまう。 -部屋の電気は常夜灯のみなので日が沈むと眠いのだ。 -</p> -</section> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200801.html b/pub/journal/posts/20200801.html @@ -1,61 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Djangoやめました</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Djangoやめました</h1> -<time>2020-08-01</time> -<section> - <h3>Djangoやめました。</h3> - <p> - タイトル通り、Djangoを使うのをやめました。 - 代わりにwsgirefを使ってます。Djangoでも間接的に使っていた - のかもしれないけれど。<br /> - 参考: <a href="https://c-bata.link/webframework-in-python/index.html"> - Webアプリケーションフレームワークの作り方 in Python - </a> - </p> - <p> - ただでさえガバガバだったセキュリティが更にザルになっていると思いますが、 - 特に大事なものは置いていないし、Docker使ってるし、大丈夫だと - 思っておいていいかな。攻撃しないでください。 - </p> -</section> -<section> - <h3>サイトのデザイン</h3> - <p> - それから、サイトのデザインも変更してます。 - 一応明確なテーマを以て作っているのですが、なかなか思うような感じに - ならないです。<br /> - 少しずつ調整していくつもりです。 - </p> -</section> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200802.html b/pub/journal/posts/20200802.html @@ -1,96 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>今日の一汁一菜</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>今日の一汁一菜</h1> -<time>2020-08-02</time> -<section> - <h3>今日の一汁一菜</h3> - <p> - 今日の夕飯は切り干し大根とザワークラウトの味噌汁に - すりごまをまぶしたもの、 - かぼちゃを蒸して豆腐のそぼろをちらしたもの、 - そしてきゅうりと茄子の浅漬。 - </p> - <p> - 切り干し大根というものを初めて食べたがこれがなかなか美味しかった。 - 細切りにしてザルに広げ一日外に置いておいただけであるが、旨味が - 凝縮される上に食感もコリコリと面白くなる。 - </p> - <p> - 大根の相手は6月の中頃に漬け込んだザワークラウトである。 - 乳酸の酸味が熱い体に染み渡る。 - </p> - <p> - 味噌を溶いて椀に注いだら、最後に煎りごまをすって入れる。 - 酸味とごまは相性が抜群である。 - </p> -</section> -<section> - <h3>野菜を干す</h3> - <p> - しばらく前に冷蔵庫の電源を落とした。 - 発酵食品ばかり仕込んでいたので冷蔵庫の中がスカスカになり、 - 冷蔵庫は不要なのではないかと考えていた。 - そんなある時とうとう空っぽになったので、これを期に - 冷蔵庫なしの生活を試してみようと考えたのだ。 - </p> - <p> - しかし一人暮らしなので、一食で野菜をまるまる使い切ることはあまりいない。 - 使いかけの野菜はどうしても出る。 - ぬか床に忍ばせたり塩漬けにしたりいろいろ工夫した。 - そのうちの一つが干すということである。 - 梅干しを作るために買ってきた竹のザルが二枚あったので、 - 余った野菜を適当に切って並べ、梅雨明けの晴天に - 晒してみた。 - </p> - <p> - この干し野菜がどれもこれも美味しいのには感動した。 - 冷蔵庫のはしっこでしんなりした野菜とは大違いである。 - </p> -</section> -<section> - <h3>当たり前?</h3> - <p> - 昔の人たちは当たり前のように行っていた干すという保存法。 - それをすっかり忘れ、冷蔵庫を家に置くことが常識と化している。 - 大学に進学して一人暮らしを始めるにあたり、なんの疑問も持たず - 冷蔵庫を購入したのが懐かしい。 - 冷蔵庫だけではなく、洗濯機や電子レンジも同じである。 - そういえばテレビは買わなかったが… - </P> - <p> - 当たり前という感覚を捨て、本当の豊かさを考えたい今日この頃。 - 冷蔵庫を捨てる日は近いか。 - </p> -</section> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200804.html b/pub/journal/posts/20200804.html @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>localからの投稿テスト</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>localからの投稿テスト</h1> -<time>2020-08-04</time> -<p> - 今までhtmlファイルをクラウドにscpで持って行ってsqlを実行することで - ブログ記事を投稿していましたが、ローカルから直接投稿するスクリプトを - 書いてみました。 -</p> -<p> - 今の所単にsqlを遠隔で行っているだけですが、今後投稿済みの記事を編集 - したりできるように改良したいです。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200808.html b/pub/journal/posts/20200808.html @@ -1,278 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>冷蔵庫と豊かな生活</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>冷蔵庫と豊かな生活</h1> -<time>2020-08-04</time>作成<br> -<time>2022-07-20</time>更新 -(誤植を修正したが、HTMLのソースの改行に伴う半角スペースはそのままにしておいた。) - -<section> - <h3>はじめに</h3> - <p> - 冷蔵庫の必要性に疑問を感じ始めた。 - 去年の暮れあたりから発酵食品に凝り始め、 - 冷蔵庫の中が少しずつ空いてきた。 - また、同じく去年の暮れ頃、体の冷えがあまりにひどくて - 卒業研究に集中できない状態だった。今年に入り春から夏にかけて - 気温が上がっていく中でも、体が冷えていることに - 変わりはなかった。 - </p> - <p> - 冷蔵庫の必要性を感じなくなり、冷蔵庫で冷やされたものが - 体に良くないのではないかと考えるにいたり、 - とうとう冷蔵庫の電源を落とした。 - 以降何不自由なく暮らせている。 - </p> - <p> - 一度使わなくなると、そもそもなぜこのようなものが当たり前のように - 普及しているのか疑問に思ったのでいろいろ考えてみた。 - </p> -</section> -<section> - <h3>発酵食品へ</h3> - <p> - 去年の秋、引越しに伴い生活費がカツカツになり、それまで特に - 考えずにいた家計について少しばかり見直そうと思い立った。 - そして節約の一環として外食を一切やめ、全ての食事を - 自炊に頼るようにした。 - 先に書いたようにまずはお金がなかったので、近くの青果市場で - 見切り品として売られていた30円の野菜ばかり買っていたが、 - 一月ほど節約すれば余裕が出てきてすこし贅沢をするようになった。 - と言っても外食ではなくあくまで自炊である。 - 出町柳の乾物屋に行って鰹節を求め昆布を買い、味噌汁用の出汁 - をきちんと取るようになった。 - どうでもいいが味噌汁用に鰹節を買いに行くと決まって鯖節を - 勧められるので、求めたのは鰹だが実際に使っていたのは - ほぼ鯖であった。また、いつも話し方に癖のある主人が - 対応してくれるが、ある時おばあさんが店に出ていた。 - 独特の話し方が主人と全く同じだったのには驚いた。 - 味噌汁に入れる豆腐を豆腐屋で仕入れるようになったのもこの頃である。 - 豆腐屋の人はなぜか皆遠藤征四郎師範のような腕をしている。 - </p> - <p> - 自分で出汁を引いて作った味噌汁はうまい。そこに浮かんでいるのが - 豆腐屋の豆腐なのでなおさらである。 - 自分の舌が肥えていくのがわかった。 - </p> - <p> - そんなある日、スーパーで見かけた浅漬を買って食べた。 - 漬物は昔から好物だったが、金がないのもあり見ないふりをしていたが、 - なんの気なしに手にとって買い物かごに放り込んでみたのである。 - ところがこれがいまいちだった。一口含んだときはまあそれなりに - 美味しい気はするが、しかしなんというか、奥行きがないという感じ - なのだ。それ以来スーパーの漬物は買わなくなってしまった。 - </p> - <p> - しかし漬物は食べたい。 - 結局その頃通っていた近くの米屋で糠をもらってきて - 自分で漬けることにした。 - その際にいろいろ調べたが、どうやらスーパーで売っている漬物 - はどれも発酵していないようなのだ。 - 人工的にうま味を添加した液体に野菜を浸しただけのものらしい。 - 奥行きがないわけである。 - <p> - 糠漬けに始まり、烏賊の塩辛、キムチ、バター、パンの酵母、 - 梅干し、熟れ鮓等発酵食品はいろいろ作った。厳密には塩辛と梅干しは - 発酵していないのだが。 - </p> - <p> - そんなある時ザワークラウトを漬けた。 - このときは漬物が食べたいからというより、単にキャベツを保存する - ためである。 - 一人暮らしだと、冷蔵庫があってもキャベツひと玉は傷んでしまうのだ。 - </p> - <p> - 冷蔵庫でも痛むので塩漬けにする。 - </p> - <p> - だったら冷蔵庫要らんのでは? - </p> - <p> - 冷蔵庫を手放そうと思い始めたきっかけである。 - </p> -</section> -<section> - <h3>身体の冷え</h3> - <p> - 去年の冬、身体があまりにもだるかった。 - 何もできない。お腹も痛い。 - 地元の漢方薬局を樹脂下が、渡されたのは冷えに効く - 薬ばかりだった。 - 中には重度の冷え性の女性が生理中に身体を温めるための - ものも入っていたw。 - この頃はとにかく身体がだるいだけで、 - 自分では冷えているのかどうかよくわかっていなかった。 - ところが漢方薬局の先生に不調を訴えると、 - ことごとく冷えが原因だと言われた。 - 頭痛も腹痛も倦怠感も、全て冷えだと。 - そんな状態で真冬を迎えた。確かに寒い。身体がキンキンに - 冷えているのがわかるようになった。 - ふくらはぎはずっとむくんでいるし、 - 末端は冷たいし、周りが普通にしている部屋で一人だけ - 凍えていた。 - この頃から身体の言うことをもっと聞いてあげないと - 何もできないことがわかった。 - </p> - <p> - 以来身体の状態はできるだけ観察するようにしている。 - そして気づいたのだが、自分の身体がずっと冷やされているのだ。 - 春が過ぎ暖かくなっても、至るところで冷房画家明かり - 冷たい飲み物を出される。 - まるで汗をかくことが悪であるかのような世界である。 - </p> - <p> - この気付きにより、今年の夏は冷たいものは摂取しないようにしている。 - というよりあまり欲しいとも思わないのだ。 - 喉が乾いても常温のもので満足なのだ - (と言っているそばから実家の冷蔵庫にあったハーゲンダッツを - 食べてしまった)。 - </p> -</section> -<section> - <h3>冷蔵庫の電源を落とす</h3> - <p> - 身体の冷えに気づき、発酵食品にのめり込み、 - 冷蔵庫の必要性に疑問を持ち始めたある時、 - とうとう冷蔵庫の中が空っぽになってしまった。 - ものは試しと早速電源を落としてみた。 - 余った食材はぬか床に入れるか、あるいは - 塩漬けにしておけば腐る心配はない。 - </p> - <p> - 横浜に越してきてからは週末に一週間分の野菜を - 鎌倉の即売所で仕入れ、冷蔵庫に入れていた。 - 冷蔵庫の電源を落としてからは余った野菜は - すべて乳酸菌の力で酸っぱくして保存していた。 - 流石に酸味に飽きてきた頃、梅干し用に買ってきたザルが - 梅を干し終えて暇そうにしているのを見つけた。 - 干し野菜はうま味が凝縮されて美味しいというので - 試しに余ったものを干してみた。 - きゅうり、大根等水分が多いものは薄く切ってそのまま並べる。 - かぼちゃやじゃがいも等は一度蒸してから干す。 - 生のまま干したものは味が濃くなり食感もコリコリと面白くなる。 - 一方蒸したものは甘みが強くなり、ねっとりとしてこれもまたうまい。 - 一度この味を知ると、どうして今まで冷蔵庫に入れて味が劣化するのを - 気にも止めなかったのかと悔やまれる。 - </p> - <p> - 魚はその日のうちに使う分以外は塩水につけて干しておくか、 - 米と合わせてあせの葉や柿の葉で包んでおけば熟れ鮓になる。 - まだ作ったことはないが、みりん干しなんかもやってみたいものだ。 - </p> - <p> - 豆腐は水切りをして何かしら塩分の濃いもので包んでおけば - 大丈夫そうだ。 - 味噌、糠、塩。どれにつけても美味しい。塩漬けはチーズのような - 芳醇な感じになることを期待していたがそれもない。 - 水道水をそのまま使ったのがまずかったか。 - まあ保存はできているのでいいのだけれど。 - </p> - <p> - 肉は最近食べていないのでわからないが、魚と同じだろう。 - 中国には確か肉の熟れ鮓もあったような。 - 燻製なんかも興味がある。 - </p> - <p> - 冷蔵庫を使わなくなり一週間経つが、何一つ不便なことはない。 - 冷蔵庫の下が掃除できないので早くいなくなってほしいくらいだ。 - </p> -</section> -<section> - <h3>なぜ冷蔵庫がうちにあるのか。</h3> - <p> - 改めて冷蔵庫というものを見直してみると、どうしてこんなものが - 台所の一角に鎮座しているのかわからなくなってきた。 - 大学に進学し一人暮らしを始めるに当たり、 - なんの疑問もなく買ったのだ。 - 電子レンジや洗濯機も同じである。 - テレビはNHKが鬱陶しいので買わなかったが。 - 冷蔵庫は家に必要なものであるという常識のもとに生まれ、 - 冷蔵庫を当たり前のように使いながら育った。 - 一人暮らしをするというと、どこに行っても冷蔵庫を買うのが - 当たり前かのように話が進み、とうとう自分でも買うに至ったと - 言うわけである。まあ冷蔵庫を買うのは当たり前なのだろうが。 - </p> - <p> - つまり冷蔵庫がうちにあるのは世の中の常識を - そのまま自分の家に取り込んだ結果なのだ。 - </p> -</section> -<section> - <h3>冷蔵庫という常識</h3> - <p> - ではなぜ冷蔵庫を持つのが常識なのか。 - 簡単である。 - マーケティングの結果だろう。 - </p> - <p> - 今までの生活が不便だという認識を植え付け、 - その不便を解消するという謳い文句で新しい常識を売る。 - 世の中に出回っている便利な道具は大方同じであろう。 - </p> -</section> -<section> - <h3>豊かさとは</h3> - <p> - 豊かな食生活のためといって舶来の料理をはやらせ - 食物油を売り、頑固な油汚れが落ちるからと言って - 強力な洗剤を売り、荒れた手が潤うからと言って - ハンドクリームを売る。 - </p> - <p> - 忙しいからと便利な家電を売り、 - その一方で暇を潰すためのエンターテインメントに - 金を払わせる。 - </p> - <p> - 暑いからといいエアコンを売って快適な環境を整え、 - 汗をかくためにサウナに金を使わせる。 - </p> - <p> - きついからと言い肉体労働を敬遠し、 - 楽をするために自動車を買い、 - その一方で運動不足になりジムに通う。 - </p> - <p> - どれもこれもテレビや新聞等のメディアに作られた豊かさ - ではないだろうか。 - </p> - <p> - 常識や流行にとらわれず、豊かな生き方とはなんなのか、 - 本当に必要なものはなにか、自分自身に問いただす。 - 一度すべての常識を捨て、自分にとって本質的なものを - ゼロから構築する。 - 人生を本当の意味で豊かにしてくれる物だけがすべて揃った - そんな家に僕は住みたい。 - </p> -</section> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200917.html b/pub/journal/posts/20200917.html @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>pythonやめました</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>pythonやめました</h1> -<time>2020-09-17</time> -<p>pythonをやめてbashスクリプトで作ったcgiに置き換えました。</p> -<p>管理がだいぶ楽になった気がします。</p> -<p>アプリの中身ばかりいじってブログの記事が全然増やせていませんが -ぼちぼち書いていきたいと思います。</p> - -<p>サーバーからbashのcgiを動かすにあたって、nginxがややこしかったので -apacheに変えたのですが、設定が適当なのでセキュリティが心配です。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200918.html b/pub/journal/posts/20200918.html @@ -1,68 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>仕事</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>仕事</h1> -<time>2020-09-18</time> -<p> -今の仕事がつらい。 -やっているのは得意先から届く注文書のファックスを自社のデータベースに入力するだけの仕事だ。 -誰でもできる仕事であり、近い将来自動化されるだろう。その一方でファックスの様式が得意先毎に異なり、入力時にはその注文書に明記されていないことも考慮しなければいけない。 -日本企業の生産性が低い原因をまじまじと見せられている。 -このような業務なので、入力作業自体は1日もかからずに覚えられる一方、得意先毎の細かい違いを覚えるのに何年もかかるだろう。 -日に日にこの業務に慣れ、入力は速くなっているが、自分が成長しているようには感じない。この会社のこの業務という非常に限定的な分野でしか使えない技術だけがついていくからである。こんなことでは転職しようにもよその会社で使える技術が何もないので、新卒と同じ土俵にたたなければいけなくなる。採用する側もそんな人材に興味はないだろう。 -</p> -<p> -成長したい。 -成長とはなんだろう。 -多分生きていく上で使える技術を身に付けることである。 -生きていく上で使える技術とはなんだろう。究極的には畑で作物を育てる技術だと思うが、そんな世紀末のことはまだ考えなくてもいいかもしれない。 -汎用性のある人間になればいいのだろうか。 -そうすれば何でもできて食いっぱぐれない。 -しかしその「何でも」の中に今の仕事は含まれていない。 -成長が感じられない単純な作業はストレスで死んでしまう。 -つまりなんでもできるの中には成長しない仕事は含まれない。 -</p> -<p> -なぜ今の会社にいるのか。 -それは実家に帰るためである。 -実家で工場を経営しているのでそこを嗣ごうと考えた。 -そのために同業大手に就職し技術を持ってかえるように父に言われた。 -ところがいざ就職してみると、僕が考えていた技術が一向に学べていない。 -その一方で今学んでいることは父が持って帰ってほしい技術であるようだ。父は工場で必要な細かい技術や知識を持って帰ってほしいらしい。 -僕はそんなものはほしいとは思わない。この業界に特化しても生き残れないと考えるからだ。もちろん業界に特化した人材も必要なのかもしれないが、それはあなたの長男ではないのではないだろうか。長女でも次男でもなさそうだし。 -</p> -<p> -今のところだからどうしたいと言うまとまった考えがあるわけではないが、少なくとも自分の学ぶべき場所はここではないと感じている。心身に無理が生じているのを感じるからだ。 -業界の知識を短期間で軽くさらって、そのあとは別の世界を見てみたい。どこかに成長を実感できる世界がないものか。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200919.html b/pub/journal/posts/20200919.html @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>工場見学</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>工場見学</h1> -<time>2020-09-19</time> -<p> - 実家で営んでいる工場を嗣ぐために同業大手に働きに出ているが、 - そこで何を学べばいいのかわからないので、一度実家の工場を見学 - することにして、今日行ってきた。 -</p> -<p> - 見学して思ったのは、今いる大手の工場よりうちの工場のほうが - いい工場であるということだ。 - 工場内は比較的整然としているし、データベース等のシステムも - 今自分がいる会社よりは圧倒的に進んでいた。 -</p> -<p> - いよいよ自分が今の会社で働いている意味がわからなくなってきた。 - どうやら父は今僕のいる会社には人材を育成するための教育制度 - が整備されていて、その制度によって僕という人材が育成されることを - 期待していたようだ。 - 残念ながらそんな制度はなかったようだが。 -</p> -<p> - つまり僕が今の会社に居続ける義理もそんなにないようである。 - もちろん業界の知識は少なからず必要であり、今の会社でも - 働き続ければ多少は勉強できるだろうが、そのために投資する時間 - に対して割に合わないだろう。 -</p> -<p> - ではどうするか。今の会社をやめるのであれば転職である。 - そしてその転職先は実家かそれ以外かである。 - 今実家に就職するのはいい選択なのだろうか。 - 僕は業界に関する知識もないし、ビジネスの世界も全く知らない。 - こんな状態で就職しても、おそらく他の人と同じようなことしか - できないだろう。工場に新鮮な空気を取り込めないのだ。 - だから今は一旦業界を離れ、全く別の世界を覗きに行くのがいいのではないか。 -</p> -<p> - 個人的に興味があるのはIT系である。 - 工場のDXという言葉がよく新聞に並んでいるが、その流れを - 実家に持ち帰れるかもしれない。 - もう一つ興味があるのは農業である。 - 僕がかってに妄想しているだけだが、近いうちに大量消費社会が - 終焉を迎え、自分たちにとって本当の豊かさとは何か、今一度 - 考え直す秋が来ると思う。そうなれば必然的に見直されるのが - 農業である。社会から何を削っても絶対に外せないのが食だからだ。 - そこに豊かさや幸福を求めるのは自然なことだろう。 - そんな農業とのつながりを何らかの形で事業に持ち込めれば - いいかもしれない。 -</p> -<p> - いずれにせよ今のままダラダラと働くのはごめんだ。 - 無駄なことに時間と精神を費やすのはアホである。 - 我慢して頑張っても、それで身体を壊した上に何も学べない。 - そんなのは投資とは言えない。 - 頑張るのではなく、精神の求める方に流れていくほうが自然な生き方だろう。 - とにかく現状を変化させて前に向かって進みたいのだ。 - 自ら動かなければ何もおきない。 - 連休中にエントリーシート書こうかな。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200925.html b/pub/journal/posts/20200925.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>rsyncによる投稿テスト</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>rsyncによる投稿テスト</h1> -<time>2020-09-25</time> -<p>自宅のパソコンから直接rsyncで投稿てすと。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20200926.html b/pub/journal/posts/20200926.html @@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>SSLに対応しました。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>SSLに対応しました。</h1> -<time>2020-09-26</time> -<p>Certbotを使ってSSLに対応しました。</p> -<p> -と言っても特に暗号化する必要のある情報は -取り扱っていないので完全に自己満足ではありますが。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20201003.html b/pub/journal/posts/20201003.html @@ -1,151 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>何をして生きようか</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>何をして生きようか</h1> -<time>2020-10-03</time> -<h3>仕事</h3> -<p> -研究者を目指して大学に入り挫折した。 -</p> -<p> -就職先を考えたが、やりたい仕事などそれまで考えたこともなかった。 -そのためやりたいことを基準に仕事を選ぶことができなかった。 -そこで考えたのが、なんのために働くかということである。 -地元には親戚がたくさんいて正月や盆には大勢集まる。 -サマーウォーズみたいな感じ。 -残念ながら古民家に集まるわけではないが。 -僕は家というものが好きだった。 -大学を出てからの人生はその家を更に大きくすることにしよう。 -そう考えた。 -そしてそのための方法として選んだのが、実家が営んでいる -ダンボール工場を嗣ぐことであった。 -そのために卒業後はまず同業大手で勉強させてもらい、 -数年後実家に帰ることにした。 -</p> -<p> -ところがいざ働き始めたらどうだろう。 -何もやりがいがなかった。 -回りにいるひととは全く反りが合わなかった。 -労働環境は最悪だった。 -生活環境も受け入れられなかった。 -気づけばストレスで心身がボロボロになり、盆休み開けにとうとう寝込んだ。 -</p> -<p> -仕事が嫌になった。 -その原因について、はじめは成長が感じられないからとか、 -無駄なことを無駄だとわかっているのに無理やりしているからとか、 -いろいろ理由を分析してみたものっだったが、今思えばどれも違う。 -単純に世間一般に広く普及している仕事というものに適正がないのだろう。 -心療内科の医者によれば、僕の症状は適応障害だそうだ。 -こんな世界に適応などしてたまるものか。 -</p> -<h3>社会は嫌いだ</h3> -<p> -この社会に適応できないのは今に始まったことではないと思う。 -</p> -<p> -京都から和歌山に帰省するたびに、大阪の町並みが汚いのが気になりだした。 -駅の周りには鉄筋コンクリートの四角い箱が乱雑に並んでいるのである。 -どれも建てられた当時は先進的なデザインでおしゃれだったのだろう。 -そして駅から少し離れた場所にも同じくコンクリートの箱が並んでいる。 -こちらは最近建てられたらしく、デザインも今風である。 -30年建てば時代遅れの残念な物件になるのだろう。 -こんな家を建てる人たちは一体何を考えているのやら。 -人生で一番大きな買い物と言いつつ、ろくに調べもしないでハウスメーカーの -口車に乗せられ、モダンでおしゃれな家を建てる。 -自分の建てた家に子々孫々住んでほしいとは思わないのだろうか。 -</p> -<p> -ある時からスーパーに行くのがしんどくなった。 -出町柳にある枡形商店街の近くに住んでいたことがある。 -その間食事の買い物はほとんどそこに通っていた。 -豆腐屋、肉屋、乾物屋等、専門店が一通り揃っていた。 -扱っているものは当然そのへんのスーパーよりも美味しかった。 -ある時伏見の方に引っ越して、久々にスーパーに通い始めたのだが、 -これが非常にしんどかった。 -音楽がうるさくて買い物に集中できないのだ。 -なんだかよくわからない音楽がやたら大きな音で流れている。 -夕飯を考えながら、美味しいものを選別しようとしている脳みそに、 -その思考を遮るように流れてくるのだ。 -だんだん頭がぼーっとしてきて、結局適当に選んでしまう。 -スーパーでは音楽だけでなく、視覚的な表示も鬱陶しい。 -商品のパッケージは周りよりも少しでも目立とうとするばかりで、 -欲しい情報が一切目に入らない。 -適当に選んで家に持って帰るが、結局対して美味しいものではない。 -スーパーに並んでいるものは、本質的な価値ではなくマーケティングを始めとする -販促にかかるコストの割合が多いのだろう。 -「美味しいワイン」。「リコピンが多いトマト」。「DHAが含まれているソーセージ」。 -だまっとれや。 -ただ、そういうものが多く売られているというのは、それはつまり -消費者がそういうものを購入すると言うことである。 -同じものであってもパッケージに美味しいと書いていた方を買うのだろう。 -スーパーでものを買って行く人々が、心理学に踊らされているだけのモルモットに -見えてきた。 -こんな人たちの中に居たくない。そんなこと書いたら叩かれるかな。 -</p> -<p> -スーパーがだめになれば他の店もかなり辛くなった。 -結局ものを売るというのは同じことなのである。 -自分でも驚いたが、スーパーにいけなくなってから、無印良品にも行けない。 -よくわからん音楽が流れる中で、独自のおしゃれ感を作り出しそれを売っている。 -物自体もそんなに質の高いものではないし。 -そこに集う人たちも、雑誌でよく見るテンプレ通りの最近の若者である。 -雑誌はあまり見ないので知らんけど。 -</p> -<p> -この人たちは自分の内側から湧いてくる価値観というものを自覚したことが -あるのだろうか。 -人工的に生み出された流行に踊らされているだけなのではないだろうか。 -</p> -<p> -スーパーに行かなくなり、巷で流行っているものを消費しなくなり、 -いよいよ自分がなぜ働いているのかわからなくなった。 -</p> -<h3>やっぱ農家かな</h3> -<p> -世の中にはびこっている様々なものに価値を見いだせなくなったわけだが、 -それでも買わないと生きて行けないのが食べ物である。 -就職してからの半年間は食べ物には結構こだわっていた。 -スーパーに行けないこともあり、学生時代に商店街に通っていたこともあり、 -住処の周りにある個人商店やらを探し回った。 -家から徒歩圏内に豆腐屋と魚屋を見つけた。 -野菜は鎌倉の即売所まで買いに行った。 -米も鎌倉の米屋に求めた。 -乾物も鎌倉だ。 -休みの日は結構な時間と労力を食べ物に投資していたと思う。 -美味しいものを食べてこその人生なのである。 -</p> -<p> -やっぱり農家になりたいな。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20201201.html b/pub/journal/posts/20201201.html @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>畑をさせてもらえることになった。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>畑をさせてもらえることになった。</h1> -<time>2020-12-01</time> -<p> -実家のとなりに畑がある。 -子供の頃はそこで育った野菜をよくもらって食べていた。 -最近そこを耕していたひとが高齢のため引退して、 -雑草が生え放題になっていた。 -</p> -<p> -先日その土地の地主が草刈に来たので声をかけたところ、 -暫く使う予定がないので使ってもいいとのことだ。 -</p> -<p> -ということでぼちぼち何か作ろうと思う。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20201202.html b/pub/journal/posts/20201202.html @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>たまねぎを植えた。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>たまねぎを植えた。</h1> -<time>2020-12-02</time> -<p> -祖父の友人がたまねぎの苗を分けてくれたので植えた。 -時期はかなり遅いみたいだがうまくそだってくれるだろうか。 -</p> -<p> -耕していない畝に15cm間隔、条間20cmくらいで少し穴を掘って植えた。 -その上から、先日刈った雑草を被せておいた。 -とりあえず一畝だけ。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20201209.html b/pub/journal/posts/20201209.html @@ -1,48 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>畝を繋げた</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>畝を繋げた</h1> -<time>2020-12-09</time> -<p>この土日に不耕起の農法を教えてくれる赤目自然農塾にお邪魔してきた。 -その際、今の畝では幅が狭すぎるので広げたほうがいいといわれた。 -とりあえず畝の間の溝を埋めて二つの畝を繋げることにした。 -余り無理をしても次の日動けないのは困るので今日は一列だけ。 -180cmから2m程度の畝になった。 -</p> - -<p> -先日植えた玉葱は根がきちんと活着してくれたようで、 -寝ていた株も起きあがって元気そうである。 -ただしこの畝は細いままなので、やはり表面が少し乾燥しているようだ。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20201210.html b/pub/journal/posts/20201210.html @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>小松菜の種を蒔いた。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>小松菜の種を蒔いた。</h1> -<time>2020-12-10</time> -<p> -駅の近くに種苗店がある。 -以前から気にはなっていたのだが、いつ前を通っても店主がお客さんと話し込んでいて入りづらかった。 -ところが今日はだれもいなかったので遂に敷居を跨ぐことができた。 -</p> -<p> -時期が時期なので余り品揃えはよくなかったが、いろいろと教えてくれた。 -F1ではない種も多数取り扱っているようで、和歌山大根という地元の品種もあった。 -今ある種のなかから、一年中いつでも蒔ける小松菜をいただいてきた。 -楽天という品種だった。 -</p> -<p> -家に帰って早速種を蒔いた。 -先日広げた畝に、北側から2坪ほどの土にばら蒔きした。 -少し乾燥ぎみだったので、横に散らばっていた草を上から被せた。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20210106.html b/pub/journal/posts/20210106.html @@ -1,73 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>x220から投稿テスト</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>x220から投稿テスト</h1> -<time>2021-01-06</time> -<p> -thinkpad x220を手に入れ、arch linuxの環境を整えた。 -</p> -<p> -スペックはこんな感じ: -</p> -<ul> - <li>core i7 2620M</li> - <li>メモリ 8GB</li> - <li>ssd 256GB。</li> -</ul> -<p> -ヤフオクで送料入れて15000円程度だった。 -</p> -<p> -画面はTNだろうと思って買ったが、 -届いたら視野角が広くて非常に見易いので -多分IPSであろう。 -これは結構うれしい。 -</p> -<p> -全体的に綺麗な個体だ。 -</p> -<p> -バッテリーは期待通り完全に消耗していて、 -起動後5秒ほどで切れてしまう。 -</p> -<p> -あとwindows用の日本語キーボードはあんまり -好きではない。 -いちばん下の段がぎゅうぎゅう詰めでスペースが -小さすぎる。 -</p> -<p> -バッテリーを交換するのが先かキーボードをUS配列にするのが先か -悩ましいところだ。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20210806.html b/pub/journal/posts/20210806.html @@ -1,133 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>畑を返すことになった。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>畑を返すことになった。</h1> -<time>2021-08-06</time> -<h2>はじめに</h2> -<p> -昨年の秋実家の隣の畑を借り農業を始めることになった。以降好きな種を蒔いては世話をし、少しばかりの収穫をいただいてきた。夏になり冬野菜はどんなものを植えようかと考えていたところ、地主さんからある連絡があった。この秋に家を建てることになったので土地を返してほしいとのことだ。いい機会なので、この一年弱の間素人なりに試行錯誤してきたこと、考えてきたことを記録しておく。 -</p> - -<h2>農業に対する基本的な考え</h2> -<h3>農業の目的</h3> -僕が農業をする目的は自給自足の生活をすることである。一度社会人としての道を歩もうとして精神を病んだ。世の中にあふれているほとんどの物に価値を見いだせなかった。にも関らず自分の時間をお金に変換している意味がわからなかった。自分の時間を使って自分にとって価値のあるものを生みだす。それをできるのが自給自足のための農業だと考えた。 -<h3>農法</h3> -<p> -畑を借りる前から農法に関する情報は本やネット等で収集していた。そのなかでも目に付いたのが川口由一氏の自然農及び福岡正信氏の自然農法である。多少の違いはあるがどちらも無農薬、無肥料、不耕起という点で共通している。雑草や虫等を敵とせずそれらの活動によって土壌を豊かにし、その上で作物を育てるというものだ。この方法が自分に合っていると感じたので採用することにした。 -</p> -<h3>種</h3> -<p> -また、育てる作物に関しては、高橋一也氏の「古来種野菜を食べてください。」に感銘を受け、可能な限り昔から栽培されてきたものを探すようにした。現在市場で流通している野菜は一代交配種と呼ばれるものが多い。一代交配種というのは、「生物において、ある異なった対立遺伝子をホモで持つ両親の交雑の結果生じた、第一世代目の子孫のこと」(<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>)。一代交配種は収量、形質、味等がそろっているので市場競争力が高い。その一方で、一代交配種をかけあわせると、一代目ではかくれていた遺伝子が発現し、市場価値の高いものは収穫できない。このため、ひとたび一代交配種を育てはじめると、以降毎年のように種苗会社から種を購入することになる。 -</p> -<p> -僕が目指したいのは自給的な農業である。作物の市場競争力はなくていいし、種苗会社に払い続けるお金もない。また一代交配種ばかり育てられると、全国どこでも同じ野菜しか手に入らなくなり食文化もあったものではない。それに対し古来種野菜は、地域ごとに代々受けつがれてきたもので、その土地にうまく適応しその場所の食文化の形成に深く関わってきたものである。僕の地元和歌山でも、湯浅で作られる金山寺味噌で使われている湯浅なすというものが残っている。関係ないがあみ清数見商店というところの金山寺味噌がおいしい。「発酵文化人類学」(小倉ヒラク)にのっていた太田久助吟製のものはいまいちだった。表示を見ると人口甘味料(確かステビア)が入っていた。 -</p> -<p> -閑話休題。種は古来種を多数とり扱っている野口種苗研究所のものを購入するようにした。 -</p> - -<h2>生ゴミの肥料</h2> -<p> -畑を借りてから、台所からでる植物性の生ゴミは全て畑の一角に捨てるようにした。胡瓜や人参のへた、南瓜のわたや種等である。捨てたゴミは少し土とまぜ、発酵させて二年目から畑の肥やしとして利用しようと考えてのことだ。冒頭で書いた無肥料と矛盾するがまあこれも試行錯誤のうちである。 -</p> -<p> -春から夏にかけて気温が上がり、梅雨には雨も降り、微生物の活動が活発になる。始めは臭いが大丈夫か心配だったが、日中30度を越えるようになってもほとんど臭くない。1メートル以内に近づいて少し臭うが、臭いというほどではない。臭い臭いではない。一時コバエがたかっていたが、今は目立たなくなり、かわりにコオロギがうじゃうじゃしている。 -</p> -<p> -春の終りごろに買ってきた南瓜のわたと種もここに捨てた。しばらくするとそこから南瓜の芽が大量に生え、梅雨があけるころにはたくさん花をつけた。近くの養蜂場からだと思うが、セイヨウミツバチがやってきて受粉してくれる。7月の終りごろにはおおきな実をつけた。収穫して煮物にしたがとてもおいしかった。捨てた種は一代交配種で、できたのはその子供なのでおいしくなる道理はないのだが。不思議である。 -</p> -<p> -地主さんから土地の返還を打診されて畑に生ゴミを捨てるのはやめにした。ところが調理中にでるゴミの量は変化するわけでわない。野菜のうち食べない部分はすべてゴミ箱に捨てるようになった。畑を借りる前の状態に戻っただけである。ところが切った野菜のへたをゴミ箱に捨てるたびになんだか虚しくなる。畑に撒けばそこにまた植物が育ち収穫にも繋がる。ところがゴミ箱に捨ててしまうとなんにもならない。そればかりか、ゴミを集めてさらにそれを焼却しなければいけない。すべて税金である。ただ畑に捨てるだけでまた利用可能な形のエネルギーになるものを、税金を投入したうえで無にしているのだ。あまりにも勿体無い。しかも一般的な農家では、生ゴミを税金で回収してもらったうえで、肥料を購入してきて自分の畑に施すのだ。江戸時代なんかはさらに無駄がない。自分たちの排泄物まで畑に還元していたほどだ。 -</p> - -<h2>育てた作物</h2> -<h3>玉葱</h3> -祖父の知り合いに苗をもらって植えた。確か初めて植えたのがこれである。土が固く肥沃度も低いためか玉が膨らまなかった。 -<h3>小松菜</h3> -時期が悪かったのか、すぐにとう立ちしてしまった。 -<h3>法蓮草</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>春菊</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>牛蒡</h3> -雑草を処理した場所と処理しない場所に分けて植えた。雑草の下でも元気そうに育っている。生育が遅いので土地を返却するまでに収穫できるか不明である。 -<h3>じゃが芋</h3> -六月の雨でほとんど腐ってしまった。水はけが悪いのが原因だと思う。収穫できたものは小さかったが美味しかった。 -<h3>葱</h3> -warmerwarmerというところで買ったセット野菜に入っていたものの根を切って植えた。葱坊主ができ、種を収穫できた。 -<h3>胡瓜</h3> -地這いきゅうりを植えた。雑草がしげってもそれに巻きついて元気である。種の部分だけよく太っていびつな形に育った。肥沃度の問題か。味は普通にきゅうりである。 -<h3>南瓜</h3> -上に書いた生ゴミとは別に日本南瓜を植えた。すぐに発芽したがそれ以降成長しない。花はひとつだけ目撃した記憶がある。 -<h3>冬瓜</h3> -これもwarmerwarmerの野菜から種をとりだしたものである。かぼちゃと同様、発芽したが成長しない。 -<h3>とうもろこし</h3> -雑草に負けずよく育った。ただ生育にばらつきがあり、うまく受粉できなかった。収穫できたものは歯抜けである。味はよかった。 -<h3>いんげん</h3> -白金時菜豆と、つるありいんげんをうえた。白金時菜豆は収穫できたが成長が不十分で量が少ない。つるありいんげんは発芽しただけである。せっかく立てた支柱は虚しく、すずめの遊び場である。 -<h3>伏見甘長唐辛子</h3> -発芽せず。 -<h3>胡麻</h3> -発芽せず。 -<h3>小豆</h3> -あまり大きくならないが、長い期間にわたり収穫できている。粒が小さい。 -<h3>西瓜</h3> -発芽したが成長しない。 -<h3>茄子</h3> -実験的に雑草を刈らずに蒔いた。イヌムギかノゲイヌムギか同定できていない草が茶色く枯れているところに蒔いた。日照か水の不足か。 -<h3>大豆</h3> -よく育っている。顔を近づけると枝豆のにおいがして楽しい。 -<h3>さつま芋</h3> -よく育っている。少なくとも地上部は。時期的に収穫まで漕ぎつけるか微妙なところ。 -<h3>里芋</h3> -よく育っている。と思っていたが、近所の畑のものはもっと育っていることに最近気が付いた。肥料をやっていないのでこんなものだろうか。本葉がでてすぐのころ黒いいもむしに葉脈をのこして食い荒されたが、また葉が出てきて平気そうである。こちらも土地を返却するまでに収穫できるかわからない。 -<h3>人参</h3> -最近蒔いて発芽したばかりである。好光性のため種を蒔いた上にかぶせる草を少なくしたが、少なすぎたようだ。土が乾燥ぎみで発芽率はいまいちである。 - -<h2>おわりに</h2> -<p> -不耕起では一年目はあまりなにも育たない。土が固くて痩せているからである。三年目から突然変化が起こり、土が柔らかく肥沃になってくるという。その変化をこの畑で体感したかったのだがそれはかなわなかった。 -</p> -<p> -この一年弱の短い期間にも、この土地の豊かさは格段にあがったように思う。土の上をコオロギやクモが行き交い、バッタやカエルが跳ね、チョウやトンボ、ハチが飛び回っている。土をいじればミミズやカタツムリ、アリがわんさかわいてくる。これらの虫を求めてスズメやセキレイ、イソヒヨなどの鳥が集まり、夜になればネコやイタチまで見かけるようになった。 -</p> -<p> -ここに生きた生物たちはこれからコンクリートに埋められることになる。なんだか虚しい。 -</p> -<p> -この一年弱の経験から、農業で生きていく自信が芽生えたように思う。そこにあるものを利用し、多くを求めなければいいのだ。この自信が確信にかわるにはもっと経験が必要だろうが。 -</p> -<p> -畑を返したあとはすることがなくなってしまう。他の土地を探すのもひとつだし、別のことをするのもありかもしれない。いいご縁があればいいな。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20211129.html b/pub/journal/posts/20211129.html @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>赤目自然農塾</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>赤目自然農塾</h1> -<time>2021-11-29</time> -<p> -11月13日、14日の二日間、奈良にある<a href=https://akameshizennoujuku.jimdofree.com/>赤目自然農塾</a>の勉強会に参加してきた。この塾は自然農の提唱者である川口由一さんが始められたもので、自然農の技術を学び実習できる場である。毎月一回二日間の定例の学びがあり、一日目には畑の補修等の共同作業と言葉を通しての学びが、二日目には実習が行われる。昨年12月に初参加し、今回はほぼ一年ぶりの2回目であった。1反9畝の畑を借りることになったので、本格的に自然農の技術を身に付けたい。できれば毎月通って一通りのことを教わりたいのだが続くだろうか。 -</p> -<h2>1日目</h2> -<p> -車を停めて外に出る。思っていたより暖かかった。もこもこの着物を着て来たが厚いので暑いので薄めのものに着替え、その上から作務衣を着た。普段畑に入る時は裸足だが、共同作業で何をするのか分からないので地下足袋を履いて小屋に向かう。 -</p> -<p> -午前の作業は篠竹を刈り取って枝を払い、束にして小屋の屋根裏に干すというものだった。篠竹はよく撓って使いやすそうだった。10人以上で作業していたが収穫量は思った以上に少なかった。一人でやると日が暮れる。 -</p> -<p> -午後は汲取式の便所を汲み取って別の場所に撒いた。臭いはそこまでひどくはなかった。ブルーチーズや高級な納豆でも香るアンモニア臭が中心で、吐き気を催すほどではない。発酵食品を食べすぎているのかもしれない。便所は地面に穴を掘って桶のようなものを埋め、木の板で便器を作って被せ、周囲から見えないように囲っているだけのものだ。小屋に隣接するものは建物の一部になっていて壁も木材でしっかりと作られているが、畑の中にぽつんと立っているものは先程の篠竹を束ねたもので周囲を囲っているだけの簡易なものである。桶から柄杓で排泄物を汲み取りバケツに入れる。本来は天秤棒を用いて一人で二つ運ぶというが、技術が必要なので今回は棒の中心にバケツをぶらさげて二人で一つを運ぶことになった。肥を撒く場所までの道はでこぼこで途中川を渡る必要がある。初対面の人と二人、なかなかの緊張感のなか息を合わせて肥を運ぶ。肥を撒く場所ではいきなりバケツごとあけるのは危険なので、ここでも柄杓で少しづつである。玄関先に水をうつようにその場所全体にまんべんなく撒く。柄杓にスナップを効かせると肥が帰ってくる。これもまた緊張感のある作業だった。そこそこの量があったが日没前には終わった。 -</p> -<p> -銭湯を経由して山荘に。晩御飯は菜飯とかぼちゃのサラダ、それにけんちん汁だった。ほとんどが自然農で採れた野菜である。御飯の後は言葉を通しての学びとして、今回は教育について議論した。21時ごろから始めて終ったのは日付が変わるころだった。みんな眠い目をこすり、船を漕ぎならがの議論であるが、これがなかなか面白いものである。誰かが言った言葉が直接脳に入って来くる。あまりうまくまとまっていない考えでも発言すればだれかの脳に届いてなにかしら返答がある。なんだか全員の脳味噌を直接繋いで考えているような感覚になるのだ。僕は今回寺子屋を始めたいという旨のことをぽろっと言っただけで終った。しかし言っただけでもなんとなく自分でも実現させようという心持ちになるものである。 -</p> -<h2>2日目</h2> -<p> -2日目は農作業の実演である。今回は稲の刈り方とその後の干し方、それに麦の蒔き方を見せてもらった。これが昼過ぎに終り、御飯のあとは畑の見学会に参加させてもらった。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20211214.html b/pub/journal/posts/20211214.html @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>無題</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>無題</h1> -<time>2021-12-14</time> -<p> -図書館に本を返しに行った。最近家ではパソコンばかりいじっているので本を借りても読まずじまいのことが多い。たまに読もうと思う時もたいがい小林一郎の法華経大講座を開く。一応日蓮宗の坊主になろうというのでひととおり法華経のことは知っておきたいのだ。今日も図書館ではいろいろと漁った。ウェブサーバーやメールサーバーを立ててみたので、セキュリティ関係の本や暗号の本を探した。数冊は立ち読みしたがどうせ読まないだろうとすべて本棚に戻した。PGPの鍵を作ったりしているので暗号関連の数学は理解しておきたいという願望はあるのだが頭が多分ついていけない。場所を変えて農業の本も見てみたがあまり読みたいものがなかった。麦を育て始めたのでそのあたりの情報が欲しかったのだがなかった。とうとうなにも借りずに出てきてしまった。 -</p> -<p> -図書館からの帰りはたいてい途中にある野菜の直売所に立ち寄る。ここはスーパーにはなさそうなものがたくさんある。大根や蕪のおばけみたいなのや、里芋の親芋や葉っぱなんかも置いてある。里芋の葉っぱは家でかじって口の中がとんでもないことになって敬遠した。品種によって渋が強かったり弱かったりするので売っているものは食べても大丈夫なものだと思うが。無農薬の野菜も置いてあるのだがそうだと書いていないのも面白い。今日はその無農薬のものから紫キャベツと、別の棚から真菜をいただいてきた。キャベツはピクルスに、真菜は白和えにするのがおすすめだそうだ。 -</p> -<p> -野菜を買ったあと、家の葛が切れていたのを思いだして豆屋にも寄った。黒豆や小豆等の新豆が入っていたが家に余っているので買えなかった。しかしこの町には昔の店がいろいろ残っているものだ。生まれ育った地元であるが、今になるまでほとんど店を知らなかった。寺に通いだしてからお上人の奥さんがいろいろと店を教えてくれる。この豆屋はこの寺の檀家だそうだ。他にもかつを節屋、魚屋、肉屋、うなぎ屋、蜂蜜屋、豆腐屋、酒蔵、お茶屋、珈琲豆焙煎所等、スーパーに行かなくてもほとんど揃う。味噌と醤油の蔵もあるにはある。醤油発祥の地、湯浅であるがこれは自転車ではきつい。山を越えての50Kmである。横浜から東京まで片道50Kmを走ったことがあるがかなり疲れた。昔の人はこのくらいの距離をあたりまえのように歩いていたのだろうか。実家の辺りから山を越えて湯浅に向かう山道が今も残ってはいるが、ひとつ目の山の頂上まで行くのでもそれなりにくたびれる。体力を付けねば。 -</p> -<p> -葛を買って家に向かっていると、いつも畑で散歩がてら声を掛けてくれるおじいさんに会った。普段は簡単な挨拶だけだが今日は少し話した。40歳のときに思うところがあってお経の勉強を始めたらしい。写経していたがすぐに飽きて仏教画を始め、教室を主宰するに至ったそうだ。高野山大学の図書館にしばしば行っては画集のコピーを持って帰って来たという。なかなか変った人生を歩んできたようである。畑でもほとんどの人が頑張れと言うところ、この人は頑張りすぎるなと言うので面白い人だと思っていたが、話してみると色々考えが深そうな人である。 -</p> -<p> -仕事を辞めて以来、人と関わる機会が増えたように思う。畑を借り、道行く人と話し、寺の門を敲き、檀家と話し、その人その人の人生を垣間見ることができ、人生が何倍にも広がった。収入は無くなったが今の方が生きている。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20220513.html b/pub/journal/posts/20220513.html @@ -1,53 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>坊主になるために薬の服用を強要されそうになってる。</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>坊主になるために薬の服用を強要されそうになってる。</h1> -<time>2022-05-13</time> -<p>地元の寺で出家、得度し、次は宗門の道場に入って修行である。ただし修行と言ってもいい加減なもので、最近流行しているらしい感染症の対策だかなんだかで、総本山に近い新幹線の駅前にあるホテルで行うらしい。寺に滞在すれば感染するがホテルなら感染しないウイルスとはなんとも特異なものである。それとも参加者を自室に監禁してテレビ電話でも繋いで行うのか。だとしたら自宅からでもいいものを。愚痴を言ってもしかたがないのでとりあえず参加申請書を作成して健康診断書と共に提出した。</p> -<p>しばらくした今日、宗門から電話があった。健康診断書のアレルギーの欄に喘息とあるが、発作が起こった時の為に医者に行って薬を処方してもらい、道場に持参するようにとのことだ。</p> -<p>は?</p> -<p>まず喘息の発作がどのようなものかは自分がよく知っている。僕の場合咳がきつくて息苦しいが病院に行く程のものは幼い頃以来ない。そのため普段から発作を抑えるような薬は常備していないし欲しいとも思わない。</p> -<p>次にたとえどんな症状が出ても薬を飲むかどうかは本人の判断に任せるべきである。薬とは本質的に危険なものである。副作用の無い薬は無い。服用による危険性と服用しないことによる危険性を天秤にかけた上で飲むかどうか判断するべきものである。その判断には統計的な情報に加え、自分の身体の状態をよく観察する必要がある。そのため、他人が服用を強いることはあってはならないだろう。</p> -<p>最後に薬を服用した方がいい場合であっても、どうするかは本人に任せるべきである。これは死生観の問題である。僕は現代の医療に依存した生き方をするより、自然に生きて自然に死ぬ方を選びたい。</p> -<p>以上3つの理由により、宗門の要求は受け入れられないものである。ただし残念ながら突然の電話だったのでここまでうまく纏めて話すことは叶わなかった。以下に電話でのやり取りを記す。</p> -<p>宗門からの要求に対してまずは受け入れられない旨を伝えたところ、集団生活なので宗門に従えとの答えが帰って来た。周りに迷惑がかかるからと。しかしこれは僕個人の問題であり、どのように迷惑がかかるのか、あるいは薬があった場合どうして迷惑がかからないのか分からなかった。そのため僕個人の問題であり周りは関係ないだろうと伝えた。そうすると次は、僕にもしものことがあった場合、薬を持っていないと宗門では責任を取れないとも言われた。これに対して、なぜ僕の命について貴様等に責任を取られないといけないのか分からないと返した。そうすると、そういうものだからとの答えが返ってきた。意味が分からなかったので理解できない旨を伝えたところ、上司と相談して連絡しなおすとのことだった。そのまま電話を切られそうになったので、最後に念をおして、これは死生観の問題であり他人にどうこう言われる筋合いはないこと、そして集団生活と雖も個人の自由の範疇であると考えていることをはっきりと伝えた。</p> -<p>以上のやり取りは2時間ほど記憶を遡って書いたものであり、どこまで合っているか分からないことを断わっておく。</p> -<p>電話が切れた後、一応師僧に報告を入れようと寺に電話したところ、こういう時は適当に嘘でも付いてやりすごせばいいと言われた。お前は潔癖すぎだと。</p> -<p>間違いない。</p> -<p>しかし潔癖なのもある意味気持がいいのだ。会社を辞めて社会から距離を置き、失うものがなにもない状態で綺麗に生きている今はなかなか気分がいい。ただ宗門に対して嘘を付かないことにだんだんと価値を見出せなくなりつつある。こんないい加減な組織に対して綺麗でいることにどれほどの意味があろうか。もうどうでもいいか。</p> -<p>寺に報告をした後、夕飯の支度をしながら宗門とのやり取りを思い返しているとやっぱりなんだかひっかかる。薬を持参させるということは、発作が起こったら服用させるということである。つまり薬の服用を強要しているようなものだ。これは世間一般の常識に照らしても不条理なことではなかろうか。それとも僕が世間と距離を置きすぎて知らないだけで世の中ではそんなものなのか。和服で生活をするようになり、僕が覗ける社会の窓はTwitterのみになってしまった。そのTwitterを見ても、風邪を引いたら頭痛薬や解熱剤を、花粉症にはその薬を飲むのが当たり前のようだし、案外宗門は常識に則って良心的な連絡を呉れただけかもしれない。そんな世間はくそくらえだが。</p> -<p>医学が本当に人を救えているのかは甚だ疑問である。目の前の命はある程度助けられるかもしれないが、助けることが本人にとって幸せかどうかは別問題である。中途半端に助かったが為に余計な苦しみを味わって死ぬことになるかもしれない。また、どんなに医学が発達しても救えない命は零にはならない。さらに、医学が救う命というのは本来自然淘汰されるべきだったものではないだろうか。弱い遺伝子は死ぬのが自然の掟なのである(僕自身小児喘息で死にかけたことがあるので本来は淘汰されるべき人間なのかも知れない)。その掟を破って死ぬはずだった人間を助けてしまい、その人間が子供を作り遺伝子を遺す。そうしてだんだんと医学がないと自立して生きられない人間を量産することにはならないか。現代においても既に医療費が嵩んで面倒なことになっているではないか。目の前の命を救ったが為に将来より多くの苦しみを生む可能性を考えなくていいものか。</p> -<p>以上の議論は文献に基かない上、定量的なことを一切考えていないいい加減なものである。しかし今は目の前の命を救うことを絶対の正義として疑わず、その副作用を完全に無視しているのではないか。それで本当にいいのだろうか。</p> -<p>医学に縋り病気を恐れて長生きするより、日々大切に生き、死を潔く受け入れた方がよっぽど充実した人生だと僕は思う。宗教が現代も存在するのは、科学が救えない人の受け皿として必要とされているからではないか。</p> -<p>全ての人間は死ぬ時に死に、それまでは生きるのである。それでええやん。少なくとも僕はその方がいいのでほっといて欲しい。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20220729.html b/pub/journal/posts/20220729.html @@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>RSS作った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>RSS作った</h1> -<time>2022-07-29</time> -<p><a href="/rss.xml">RSS</a>作った。疲れた。htmlファイルのタイムスタンプを元に更新日を出力したが、なぜかほとんどのファイルのタイムスタンプが最近の日付になってしまっていたので修正しないといけなかった。RSSフィードの作成にはこのウェブサイトを出力するために作った<a href="https://git.mtkn.jp/dotfiles/file/bin/kagero.html">スクリプト</a>に組み込んだ。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20220730.html b/pub/journal/posts/20220730.html @@ -1,154 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>新型コロナウイルスとその対策に関する個人的見解</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>新型コロナウイルスとその対策に関する個人的見解</h1> -<time>2022-07-30</time>作成<br> -<time>2022-08-03</time>更新<br> -<h2>はじめに</h2> -<p> -新型コロナウイルスとその対策に関していろいろと思うことはあるが、自分のなかでもあまりまとまっていないうえ、前提となる知識や情報、考えの論理的整合性がとれていない部分が多々ある。それもあってあまり文章として僕の考えを書こうとは思っていなかった。しかし今回の感染症が流行りだして2年と半年が経ち、いまだに社会全体がおかしい(と僕が思う)状態である。そのため自分も黙っているのはむしろ無責任ではないかと思いここに書き残すことにした。どうせほぼ見てくれる人はいないだろうけれど、それでもなにかしたかった。 -</p> -<p> -僕自身はどんなことがあろうがそれを運命と呼び、それを受け入れる覚悟である。その方が日々楽しく生きて納得の上で死んで行けるように思うのだ。自分でも素人なりに論文を読んだりして可能な限り信頼性の高い情報を集めようとはしているのだが、このような考えが根底にあるので、科学的な根拠というのはなんだかどうでもよく思えてきたりするもので、どうも今持っている知識というのがふわっとして正確性に欠ける。しかしだからこそ書きとめて後で反省できるようにしたい。 -</p> -<p> -そのためこの文章は正確な知識に基くものではない。本来論文等をきちんと引用するべきところだが、とりあえず現時点での考えとして公開することにした。また、自分では気を付けているつもりだが、知らないうちに陰謀論を掴まされている可能性もある。おかしな点は指摘してくれるとありがたい。 -</p> - -<h2>概要</h2> -<p> -マスクは今回の感染症を防ぐ効果は非常に限定的だと思う。一方でその副作用は大きい。体が常に酸素の薄い状態になっている。夏は熱中症の危険もある。却って口が乾燥するという人もいる。なによりの懸念は子供の発育への影響である。他人の表情が見えなくてどうしてまともに育つのか。 -</p> -<p> -ワクチンについても効果は薄く、副反応が大きいので打つべきではないと思う。特に若年層は発症した際のリスクが低く、逆にワクチンによるものと思われる心筋炎等の可能性が高い。さらに打ったからといって感染する確率は変らないようだ。 -</p> -<p> -消毒もやらない方がいいと思う。 -</p> -<p> -またこの病気自体危険性がそこまで高くないので、そもそも感染の拡大を防ぐ必要はないと思う。 -</p> -<p> -さらに、例え危険な病気が流行したとしても、人間味のある生活を犠牲にすることのデメリットとその病気の危険性とを天秤にかけ、どのような対策が適正なのかをきちんと議論すべきである。 -</p> -<p> -ところがそのような冷静な考察をする上で必要な情報がなにひとつみあたらない。感染者数や死者数として発表される数字は統計として信用できないだけでなく、医療機関に対する補助金等により大きく歪められている可能性が高い。 -</p> -<p> -また、マスクやワクチン等は同調圧力により行っている人が多いと思う。周囲の人間がやっているからといった理由だけでの行動である。このような世間の流れは非常に危険だと思う。今回は軽い風邪でしかなかったが、この程度のことでここまで社会全体がひとつの空気に支配されているようでは、本当に国運を分けるようなことに見舞われればひとたまりもない。意見の多様性を無視してひとつの流れを作ってしまうと、その流れが間違っていたときに国が滅びるだろう。 -</p> -<p> -しかしやはり一番心配なのは今このような環境のなかで自我を形成している子供である。マスクやワクチンはそれ自体が非常に強く影響する上、同調圧力も重くのしかかる。こんな状態で子供が健全に育つとはとても考えられない。10年、20年あるいはもっと先かも知れないが、今の子供達がこの国を動かすようになれば必ず大きな問題があちこちで噴出することになるだろう。 -</p> -<p> -そもそもウイルスは敵ではない。生態系の重要な一員である。共存していけばいいのだ。 -</p> - -<h2>マスクについて</h2> -<p> -一応いろいろな論文を読んだ。マスクの効果に肯定的なものも否定的なものもあった。僕が読んだものはTwitterで拡散されているものが中心であるが、そのなかでマスクの効果に肯定的なものは、電話やメール等による調査とシミュレーションによるものばかりだった。前者は論文の中でも明記されているが、回答するかしないかは回答者に委ねられており、また回答者のバイアスもあり、とても信頼できるものとは言えないと思う。後者についてはマスクには定性的には効果があるとの前提に立って、その効果を定量的に測るものであるため、こちらも本当に意味があるものかどうか相当あやしいと思う。日本においてもスーパーコンピュータの富嶽によるシミュレーションを何度も目にしたが、これもマスクにより飛沫が防げると言っているだけで、だからウイルスに対してどう影響があるかという点については説明していない。マスクをすれば飛沫が飛びにくくなるのはスーパーコンピュータで計算するまでもなく理解できることではないか。一方でマスクの効果に否定的な論文には、RCT等、無作為性の高い手法を用いたものが多く、こちらのほうが信頼性が高いと判断した。ところでウイルスがマスクの繊維の隙間の大きさよりも圧倒的に小さいのでマスクに効果がないと言う人もいるがこれについてはなんとも言えないと思っている。マスクの穴が大きくても、例えば繊維に静電気で吸着されたりするかもしれない。このような可能性だけで議論すればいつまでも答えがでない。やはり信頼できる根拠というのは現実の観測であって無作為性の高い統計的手法によるものだと思う。 -</p> -<p> -続いてマスクの害について、先日マスクを着用しないと参加できないという場にどうしても行く必要があり、久々に着用した。あまりにも苦しかった。自分が喘息を持っているということもあるかもしれないが、明かに脳に届く酸素が少いと思う。これはバイアスかなあ。このような状態で2年以上も過している人の脳にはなにかしらの障害が起きていてもおかしくないと思うのだが。あるいはマスクにより口呼吸になり却って喉が乾くという話もある。喉が乾けばウイルス等に対する防御も手薄になるだろう。また不織布マスクからはマイクロプラスチックが放出され、それを大量に吸い込み続けているという話も聞く。マイクロプラスチックを吸い込むことと肺癌とを結び付ける話もあるがこの辺はあまりきちんと確かめていない。他にもいろいろなリスクがあるだろうが、一番重大なものはやはり子供の発育である。生れたときから周囲の人間がマスクをした状態で、どうして人間の表情や感情、あるいは言語を学ぶというのだろう。生まれたての赤ちゃんでなくても、他人との人間関係を学び自我を形成している最中の子供達にとって、周囲の表情が分からないのはあまりにも影響が大きいのではないだろうか。大人でもマスクをした他人の表情を読みとるのはマスクをしていない場合よりも難しいが、子供の場合はそれがさらに顕著であるという。このように社会全体が長期に亙ってマスクで顔を覆っていては、今の子供達の世代が将来酷く歪んだものになると思う。これに関して警鐘を鳴らしている人はいるが、社会全体では無視されている。これには科学的根拠はあまりないようだ。結果が出るのが数十年後であろうから当然である。しかしだからといって子供を虐げていい理由にはならないだろう。子供がまともに育たずに害を被るのは彼らが成長したときに年寄になっている今の我々自身かも知れない。ところで徳川時代において、徳川家の子供は生まれた時から尊いというので、乳母は母乳を与える際に顔を見せないようになにか被っていたらしい。それとの因果関係は不明だが、徳川家の子供は当時の平均よりも死亡率が高かったという。この話もきちんと確かめなければ。一方マスクのせいで子供の方が表情を作れなくなるのではないかと考えていたこともあるがこれについてはどうやら心配ないかもしれない。チンパンジーかなにかの実験で、子供の時から他の個体の表情を見せないように育てても、本人は表情を作ることに障害はなかったそうだ。表情の作り方は本能に実装されているらしい。 -</p> - -<h2>ワクチンについて</h2> -<p> -ワクチンの効果は非常に限定されているようである。当初は一回打てば感染しなくなり、今回の騒動も収まると言っていたように思う。当時からそんな訳ないやろとは思っていたが、案の定全く収束する気配はない。二回目には打てば重症化しなくなり、感染の拡大も終わると言い、三回目もこれで終りだと言っていた。そして今は四回目である。僕は一回も打っていないが、これまで政府の言うことを信じて打って来た人は未だに感染の拡大が収まらないことをどのように考えているのか不明である。更に四回目を打てと言われれば未だにその指示に従う理由もよく分からない。 -</p> -<p> -また副反応も大きいではないか。いちいち高熱がでて苦しんでいる人が沢山いる。僕の父も三回目にやたら高熱がでて仕事の最中に会社から帰って来て家で寝ていた。心筋炎の危険も高いようである。政府がデータをちょろまかしていたと言う話があったが、ワクチンを打った場合と打たなかった場合では打った場合の方が圧倒的にリスクが高いようだ。そもそも今回のワクチンは従来のものとは根本的に違う新しいものであり、その安全性も未知数である。特に長期的な影響についてはなにも分かっていないのではないか。もちろん新しい技術には常に危険が付いてまわるものである。それを理解したうえで打ちたいと言う人は本人の責任で打てばいい。ただし今回のように国民全員に打たせようというのは間違いである。こんなことをしてしまっては万が一この新しい技術に長期的な危険性があった場合に全国民がその影響を受けることになる。卵はひとつの籠に入れて運んではいけないのだ。 -</p> -<p> -ところでワクチンを打つのが無料だと思っている人が多いようだがそんな訳ないやろ。全部国の金であり、つまりは我々の税金である。国債でも発行してくれるのならまだいいが、東日本大震災の前例があるのでどうせ増税されるに決まっている。その時はぜひともワクチンを打った人にのみ課税してもらいたいものだ。僕は払いたくない。また万が一このワクチンに長期的な後遺症等の危険があることが判明でもすれば、その治療にも国民健康保険という名の税金が使われるのだろうと思うとやるせない。 -</p> - -<h2>消毒について</h2> -<p> -消毒についても意味がないだけでなく逆効果である可能性もあると思う。手指消毒に関しては、一般に行われている程度のものではウイルスが死滅するとは思えない。ウイルスが死滅する程の消毒をいちいち行っていては、常在菌をも殺してしまい、さらに皮膚に備わっている物理的な免疫機構も働かなくなると思う。結局これも対策をしているというアピールの為のものでしかないのではないか。 -</p> - -<h2>新型コロナウイルス感染症の危険性について</h2> -<p> -この病気はそんなに危険なものであるとは思わない。死亡も重症化もそんなに数が多くない。また先日厚生労働省のウェブページのデータから計算してみると死者の平均年齢が男性で79歳程度、女性で83歳程度と、ほとんど平均寿命に近いものになっている。これは病気で死んでいるというよりも寿命ではなかろうか。ただしこの計算に使ったデータは年齢が10歳区切りであるのであくまでも概算である。病院がパンクしそうだという話も、どうやら軽傷の人が大量に流れこんできていて大変だということらしい。政府がこの感染症の扱いを5類に引き下げれば済む話のようだ。 -</p> - -<h2>人間味のある生活とのおりあいについて</h2> -<p> -今回の騒動では強権的な対策が次々と打ち出された。マスクやワクチンの推奨は半ば強制力を伴ったものとなり、飲食店の営業自粛では法的拘束力が無いにしても、従わない店は名前を公開するなどされていた。個人的な行動も同様であった。それまであたりまえに行われてきた人間らしい生活が奪われた形になる。その後、因果関係は分からないが、自殺者が大きく増えたようだ。人間が行うことには必ず負の面がある。個人の自由を制限することにはそれなりのコストが伴うのだ。危険な感染症が流行したからといってただちに人権を制限することになりかねない今回のような対策をするのは間違っている。この対策により発生する種々のコストと、対策をしなかったときの危険を天秤にかけて考える必要があろう。命を守る為と言って一切の楽しみを奪われたのでは今すぐ死んだ方がましである。あるいは命を最優先にするにしても、その命の中には当然対策をしたがために自殺に追い込まれる人も入っているはずである。国という大きな組織を運営していく上ではなんらかの数字を見て次の行動を判断せざるを得ない訳だが、その数字として死者数を考えた場合でも、対策をしないがために死ぬ人の数と対策をしたために死ぬ人の数の双方を考慮せねばなるまい。 -</p> - -<h2>必要な情報の欠如について</h2> -<p> -上のような冷静な議論に必要なのが正確な情報である。感染症によって何人死んだのか、何人がどれほどの後遺症に苦しんでいるのか、逆に何人が感染症対策の為に死んだのか等の情報である。ところが今得られるそのような情報にはどれも正確さが欠如している。感染者数として発表されているのは無作為ではない方法でPCR検査をして陽性になった人の数である。東京都ではPCR検査を行う施設に補助金が出るので、接種を受ける人に商品券を配って集客している所もあると言う。そもそもPCR検査の開発者であるキャリー・マリス氏はこの検査は感染症の診断に利用すべきでないとの見解である。またこの感染症による死者数として発表されているのはあらゆる原因の死者のうちPCR検査により陽性だった人の数である。別の原因で死んでも陽性であれば新型コロナウイルス感染症による死者である。更に、新型コロナウイルス感染症により患者が死亡すればその病院に補助金が出ると言う話もある。結局この感染症の本当の姿というのは一切見えてこない。テレビ等ではひたすら上のような定義の感染者数ばかり報道して視聴者の恐怖を煽っているだけである。ただでさえいい加減な定義の数字をさらに補助金によって歪めているのが現状である。このような状況で市井の人々は一体なにを怖がっているのか不明である。 -</p> - -<h2>同調圧力について</h2> -<p> -このような状況において、結局人々はどうしていまだにマスクをしてワクチンを打つのかといえば、それは同調圧力によるものである。もちろん一部にはこのウイルスを本当に恐れている人もいるだろうが、僕の周りではかなり少数派である。むしろ周りの目を気にしている人が大多数だろう。あるいは単に世の中の流れだからという理由でそれに付き従っている人も少なくない。中には自分が苦しい思いをしてマスクを着けているのだからお前も苦しいのを我慢して着けろと言う人や、周囲が常識として受け入れていることなのだから自分もしないと恥をかくと言う人もいる。同調圧力を感じてそれに屈っしてマスクを着用している人も居るが、それでは結局自分自身がその同調圧力になり、それを維持してしまっているではないか。このようなことでは結局いつまでたってもやめられない状態に陥ってしまう。というか陥っている。 -</p> -<p> -僕は上に書いた通りマスクは効果も必要性もなく害があると思っているので着用しない。この考えが本当に正しいかどうかは正直よく分からないが、少なくともマスクを着ける効果や必要性がないと思っているのであれば周りの目など気にせずにその通り行動するべきだと思う。同調圧力に弱い人というのはおそらく社会の流れに合わせてさえいればその流れが間違っていても自分には責任が生じないと考えているのだろう。ところで僕は今のようにマスクを強要するような状態が長く続けば必ず取り返しの付かないような問題がでてくると思っている。特に子供は同調圧力による影響を受けやすいように思う。学校でマスクをしなかったりワクチンを打っていなかったりしていじめられるという話も聞く。彼らは大人になっても周囲を伺うばかりで何一つ判断できない人材になるだろう。このような人達が国を運営する時代がいずれ来る。そのような社会で老後を過ごさなければいけないのは結局この社会の流れに同調していた人自身である。社会の趨勢に任せておけば確かに明確に責任を追求されることはないかも知れないが、その結果の尻拭いをするのは自分自身なのだ。 -</p> -<p> -国を形作っているのは自分達自身である。国民とは別に政府が存在するのではなく、政府は国民自身が作るものである。個人とは別に社会の流れがあるのではなく、自分達が社会の流れそのものなのである。自分の頭で考え自分が信じたことを行動で周囲に示すのはむしろ社会に生きる一個人としての責務ではなかろうか。選挙で投票するのは国民の責務だというのと同じである。 -</p> - -<h2>意見の多様性について</h2> -<p> -同調圧力と関連するが、社会をいい方向に進める上で重要なのが意見の多様性である。ここに書いていることは僕個人の考えであり、それが正しいものかどうかはよく分からない。科学者の中にもマスクやワクチン等に関して種々の意見があり、統一されているものではない。そもそも科学は不完全なものなので科学者の意見が統一されてもそれが正しいかどうかはっきり言えるものではないだろう。個人の信条の問題も絡むといよいよ統一した見解というものを出すのは不可能である。しかしこのような意見の多様性というのがむしろ重要なのではないだろうか。多様な意見があればそのなかで最もいいものが生き残っていく。我々人間を含む生物というのはこのようにして進化し、生き残ってきたのではないだろうか。その結果が混沌のなかにある種の調和がとれたこの大自然というものであろう。 -</p> -<p> -ところが今のように一方の意見に統一して他方を無視し、あるいは排除しようとするのはあまりにも危険である。もし社会が選んだ方が間違っていたら人類は絶滅である。卵はひとつの籠に入れて運んではいけない。まあそのような世界になるのもひとつ楽しみであるかも知れないが。 -</p> - -<h2>子供について</h2> -<p> -しかしなんといっても最優先して考えるべきは子供の未来ではないだろうか。今の感染症対策は結局のところ年寄の命を守る為に子供の生活を犠牲にしているというものである。別に対策などしなくてもこの病気で死ぬ年寄はこの病気でなくても死ぬだろうと僕は思うが、そうでなくてもこの感染症の死者および重症患者はやはり高齢者が中心であろう。そして高齢者を守る為であれば子供の生活や成長が犠牲になるということなど議論の俎上にも登らない。どのみちそう長くない高齢者の命と、この先国の中心を担っていく現在の子供達の生活や成長とどちらが大事なのかは考える余地もないと思うのだが現状そんなことを言っている人は少ないようである。今子供達の生活を鑑みずに自分達の命を最優先に考えて行動している年寄は恥を知れ。 -</p> -<p> -子供への悪影響は多岐に渡る。マスクやワクチン、消毒等の直接の影響と、これらすべてに関連した同調圧力による影響である。これらは各項目の所で書いたのでここでは繰り返さない。 -</p> - -<h2>ウイルスは敵ではない</h2> -<p> -思うにウイルスは人類の敵ではない。彼らに感染することで他種の生物と遺伝情報のやり取りができると聞く。人間は人間だけで自然界を生きている訳ではない。互いに影響しあい、時には殺し合い、あるいは寄生しあい、生きているものである。そうしてあらゆる生物がその総体としてひとつの生態系を形成しているのだと思う。人間の命を最優先にして他の生命を排除するようではそのうち生態系の方から人類が見捨てられることにもなるだろう。ウイルスの方は我々と共存する道を探りながら進化している。人間の方もそれに応えるべきだ。 -</p> - -<h2>最後に</h2> -<p> -ここに書いたことは決して正確なことではない。僕の持っている科学的な知識や情報もいい加減なものである。ただし自信を持って言えるのは、僕は自分の頭で考えその結果正しいと思った行動を取っているということである。僕の考えが間違っていても、それは自分が正しいと思い、その通りに行動しているので、後で謝ることもできるし反省することもできる。自分で考えず、あるいは間違っていると思うことをしていては、後になって反省も謝罪もできない。そこにあるのは周りがやっていたから合わせただけで自分には責任がないという言い訳だけだ。しかしその結果どのような社会になろうが、自分もそこに住むことになるのだ。口で責任が無いとは言っても、結局その尻拭いは自分自身ですることになるのだ。今きちんと考えて自分の責任で行動しておかないと自分が死ぬ時にどんな顔をすればいいのか分からないだろう。食べてしまったケーキはとっておくことができないのだ。</p><div style="display: none;">別に爆弾は作らない。</div> -<p> -僕は他人に言われた通りやってつまらない人生を送るより、死ぬ危険があっても自分の信じたことをして生きたい。その方が死に直面したときに気分よく死ぬことができると思う。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20220813.html b/pub/journal/posts/20220813.html @@ -1,59 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>正座が出来ていた頃に戻るには</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>正座が出来ていた頃に戻るには</h1> - -<h2>正座できない</h2> -<p>今時の年寄は正座のひとつも満足に出来ない。明治期に体育を輸入し、学校が椅子になり、その効果がようやく全ての世代に波及した。現住職のお婆さんはまだ正座ができたそうだ。夏の暑い時期を除いて年中和服で生活しており、亡くなる直前まで足腰はしっかりしていたという。この人の娘で、現住職のお母さんはもう正座ができなかったようである。現住職とその奥さん、そして当然僕自身も正座ができるとは言えない身体である。</p> - -<p>お寺によく来てくれる人達も正座できない。正座の姿勢になることすら一苦労のお年寄も多い。このため寺としては本堂にも椅子を用意せざるを得ず、少しなら正座できるという若い人達も皆椅子に座ることになるという悪循環である。</p> - -<h2>物が多い</h2> -<p>この寺には物が多い。良いと思って自分達で買ったものや、良いと思って檀家さんが持ってきてくれたもので溢れかえっている。これを少しは整理したいのだが。</p> -<p>中でも椅子に関してはどうしよもない。場所を取る。普段はあまり人が来ないのだがお盆やお彼岸には結構集まるようである。この時集まった人達はみんな椅子が必要だというので、かなりの数の椅子が寺に置いてあるのだが、片付ける場所が無いと言って本堂の端っこに出しっぱなしなのだ。一応重ねて並べてあるので整然とはしているが。というか中には多少は正座できる人もいるだろうからその人達は椅子いらんやん。それにたくさん人が集ったからといっても今ある椅子を全部並べる広さもないと思うのだが。</p> -<p>などと考えても、住職もその奥さんも頑である。必要だから置いている。場所がないから仕方ない。せっかく檀家さんが持ってきてくれたものだから仕方ない。</p> -<p>正座できる人ばかりなら椅子など全部捨てられる。中に一人や二人足の悪い人がいてもその程度の数を用意すれば済むのだ。人がぎゅうぎゅう詰めになるようなら座布団を敷かずに正座すればいい。日本の家は狭いんやから正座しようや。</p> - -<h2>老後の自由</h2> -<p>正座が出来ると老後も自由に動ける。住職のお婆さんがいい例である。今時の年寄は医学の為にかろうじて生命活動を維持してはいるが、生きているようには見えない。身体が動きにくいのを年のせいにしているがそれは間違いだろう。若い時から身体の使い方を考えていればそんなことにはならない。甲野善紀を見れば分かる。黒田鉄山もそうだ。僕が知っている合気道家も多くは年をとっても身体に不自由はない。</p> -<p>死ぬまで身体を自由に動かすにはやはり身体の感覚を磨くのがいいと思う。その為に古武術や剣術、合気道などを習わなくても、正座するだけで十分だと思う。光岡英稔がそんな感じのことを言っていたかな。今の椅子というのは、椅子が人間を座らせているものが多いと思う。だから身体に合った椅子、座りやすい椅子などと言って売っているのだ。だれか椅子の本を書いていた。日本には良い椅子がないと。日本人は椅子に座らされるのが窮屈だったからではないか。日本人の身体観では、椅子が自分を座らせるよりも自分が椅子に座る方が心地良かったのではないか。正座の場合、下にはただ平たい床があるのみである。家によっては床板がゆがんでいるかもしれない。日本人はそこに自ら座って生活してきたのだ。床が人を座らせていた訳ではない。僕は人間工学に基づいたと言って売られているものが嫌いなのだが、そのような商品は人間が使うというより商品に人間が使わされるように感じていたのかもしれない。</p> -<p>普段から正座で生活する。これだけで老後の自由が手に入るんやからやらん手はないやん。</p> - -<h2>状況を変えたい</h2> -<p>この状況をどうにか昔に戻せないものか。上に書いた以外にもいろいろな問題の根本には正座ができないことがあるように思う。ちょっと乱暴かな。然し正座が出来るだけで解決する問題は山ほどあると思う。</p> -<p>ではどうすれば日本人は再び正座できるようになるのだろう。最も根本的な解決策はやはり小学校から椅子を無くすことだと思う。我々は物心付いてよりこのかた、ひたすら正座をしない訓練を受けてきたと言えよう。そういえばなぜか幼稚園には椅子がなかった気がする。床で物を広げて遊んでいたような。記憶違いかな。他の解決策など無いと言ってもいいくらいかもしれない。</p> -<p>然しこれを実行するにはまず世間の意識を変える必要がある。そのためには今なら科学的根拠が便利か。科学っぽい根拠。正座して育った子供と正座せずに育った子供の将来の偏差値を適当にデータとして示せばいいだけなのでこの第一歩は割とすぐできるのかな。</p> -<p>あるいは寺子屋をやってそこでは正座させればいい。その後彼らの成長を追っていけばいい。何十年かやってメディアにでも取り上げられれば少しは正座を見直してくれそうなものである。</p> -<p>然し問題はここからかもしれない。良いことだと説得しても自分の生活に直結させる人があまりに少ないように思うからだ。樹木の重要性やコンクリートの有害性を言って納得してくれたように思っても、自分が掃除している庭はそれとは切りはなして考えるようである。その一方であまりにもメディアで大々的に取り上げられると、論理を一切考えずに全て受け入れてしまうようだ。マスクやワクチンの話である。と思っても、論理を無視してメディアを信じない人も居る。結局自分の信じたいことしか信じないというのはこういうことなのか。自分自身にこのような傾向があるのは実感していたが、僕の周囲の人達はどうも無意識のうちに情報を取捨選択しているようで、これでは自己反省もくそもできない。人のふりみてなんとかと人には言うが、自分自身には一切あてはめて考えないようなのだ。</p> -<p>正座が良いと言ってもきっと自分とは関係のない世界の話だと思って終わる可能性もある。現在でも棋士はずっと正座であり、その方が集中できるという話は聞くが、だからといって自分の生活に正座を取り入れる人は稀である。ではもっと大きく報道させて今のマスクのように流布すればいいのか。これは僕は嫌いである。ただ空気と同調圧力を形成するだけで、あらぬ方向に向かってしまう可能性も考えないといけない。やっぱり一番気分がいいのは自分自身で実行してその姿を世間に晒すことである。あとは世間が思い思いに判断して行動すればいいのだ。寺子屋で子供に正座をさせてその変化を観察するのがいいだろう。社会全体に変化があらわれるまで50年くらいかかるのかな。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20220814.html b/pub/journal/posts/20220814.html @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>田舎の夏休み</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>田舎の夏休み</h1> -<time>2022-08-14</time> -<p>西の空が赤く染まり始めた頃、田圃の中の畔道を寺に向かっていると、向こうから少年が歩いてきた。釣竿の先になにやらぷらぷらさせている。タウナギかなにかだった。</p> -<p> -「釣ったん?」<br> -「うん」<br> -「すげぇ」<br> -</p> -<p>田舎の夏休みはまだ生きているようだ。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20221023.html b/pub/journal/posts/20221023.html @@ -1,67 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>寺に適応できない</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>寺に適応できない</h1> -<time>2022-10-23</time> -<h2>これまで</h2> -<p>実家の菩提寺に入って出家した。坊主になってこの寺で生きていけないかと考えたのだ。ところが一年経った今でもこの寺に適応できていない。八月のお盆の間、住職は忙しくて朝のお勤めをしないので代わりにして欲しいと言われ、半月ばかり泊り込むことになった。ゆくゆく自分が住職に成ることを考え、これを機に半分寺に住み込もうと思い、お盆が済んでからもしばしば寺に泊まった。そうして八月はほぼ寺に居たのだが、その間寺に適応できずにどんどん自分の感情が萎れていった。とうとう適応障害と言えそうな状態にまでなり、九月と十月はほとんど実家に引き込もっている。どうしたものか。</p> - -<p>なにがそんなにしんどいのか。住職の奥さんと一緒に居るのがしんどい。この人が何を考えているのか分からない。僕の言ったこともその場では肯定しているように感じることが多いが、あまり理解していないようだ。やるべきことは自分で見付けろと言いながら、なにかしようとすると拒否される。生活の面でもいろいろと噛み合わない。柔軟剤がきつすぎてしんどくなった。食事の脂が多すぎてお腹を壊した。台所が汚なすぎて気持が悪い。</p> - -<h2>柔軟剤</h2> -<p>初めて寺に行って掃除を任された時から気になっていた。雑巾があまりにも臭いのだ。それも柔軟剤の臭いである。当時は実家から通っていたのだが、昼間寺の掃除をすると、家に帰ってからどんなに手を洗っても臭いが落ちないほどである。雑巾だけではなく寺にある布という布から悉く同じ柔軟剤の臭いがする。この臭いをいい臭いだという人の気が知れないのだが。</p> -<p>ある時檀家さんからもらった素麺をお裾分けしてもらったのだが、箱を包むビニールにも柔軟剤の臭いがこびりついていた。実家に持ち帰り後日湯掻いたのだが、素麺自体にも臭いがついていて食べられたものではなかった。他の家族も顔をしかめていた。勿体無いが全部廃棄した。</p> -<p>後で気付いたが、どうも寺中の埃から柔軟剤の臭いがするのだ。埃は布からでたものなので考えれば当たり前か。この埃が食品を保管している棚に積り、その中の素麺に臭いが移ったのだと思う。埃が臭うので寺中至る所その臭いである。</p> - -<h2>食事</h2> -<p>寺での食事は脂が多い。ささやかな生活をしていると本人達は思っているようだが、食卓にはやたら牛肉が並ぶ。脂ののった鮭も多い。奥さんは歯がほとんどないので肉も魚も脂の乗ったやわらかいものでないと噛めないのだ。数えていないので適当だが、3回に1回は鮭、5回に1回は牛で、どれも脂でとろとろの物である。僕が胃腸が弱く、特に脂っこいものが苦手ということもあるが、少なくともこれでささやかとはどうも言えないように思う。</p> -<p>ところである日豚の肉塊で焼豚を作ったのだが、茹で汁を冷蔵した上澄みの脂を炒め物に使おうと取っておいたのだが、それは食べたくないらしい。固形の脂は体内でも固まって健康に悪いというテレビの知識だそうだ。普段あんなに肉の脂を取っているのにそれは気にならないらしい。理屈はよく分からんがそれよりも今から作らんとしている野菜炒めを食べてくれるのかどうかが重要なのでそれを聞いた。返事は「しいては食べないけど。」というあいまいなものだった。食べないならサラダ油で作るか、別に一品追加しないといけないのだがどうかと聞き直すと、「しいては食べないけど。」という返事が再び返ってくるだけだった。これ以上聞くのも面倒なので、僕はせっかく取っておいた豚の脂を捨ててサラダ油で野菜を炒めた。これは他のことでも感じていたことだが、この人には自分というものが無いのか、あるいはそれがあっても表に出さないようである。別件ですこし口論になったことがあるので、感情がない訳ではないのだが。エドワードルトワックという米国の戦略家曰く、こちらの言うことを全部受け入れる国より、自分の立場をはっきりと言う国の方が同盟国として信頼できるそうだ。そんなのあたりまえじゃないですか。まる。住職の奥さんはどうやら自分の考えや感情を見せず、相手に全部任せる方が信頼関係を築けると思っているようだ。責任を全部こちらに押し付けているようにしか僕には見えないのだが。</p> - -<h2>台所が汚ない</h2> -<p>この寺はどこもかしこも物であふれかえっている。かろうじて法要に必要な本堂と控室はましだが、それでも不必要な物が多い。特に酷いのは台所である。おぞましい。寺の性質上貰い物が多いのはしかたがない。檀家さんにいろいろ貰ってそれをまた他の檀家さんに配るのだがそれでも余る。寺にいて消費するのは住職とその奥さんの二人だけであった。賞味期限がくるまでに食べきれないのはある意味仕方がないことでもある。本当は物を持ってくる檀家さんに寺の状況を話して少し持ってくる量を減らしてもらうべきだと思うのだが、奥さんはそうは考えない。檀家さんの気持をないがしろにできないからと、くれる物は断わらない。そして捨てる。これのどこがないがしろにしていないのかさっぱり理解できないが。ともかく現状は食べ物が多すぎるのだが、一番の問題は古い物を一向に捨てないことである。僕が寺に通い始めた頃は冷蔵庫がパンパンだった。しかも3台もである。二人暮しの家に小さくもない冷蔵庫が3台、悉く満杯だった。ある時台所にある冷蔵庫を上から下まで整理した。腐ったものを全部捨てた。奥からは2009年に賞味期限が切れたものなんかも出てきた。これは一番古い方だが、平均しても3年以上前のものだったと思う。ところで冷蔵庫の中からでてきたものは大体がスーパーなんかで奥さん自身が買ってきたもので、檀家さんから貰ったものはあまりなかった。檀家さんからの多すぎる貰い物に加え、自分でも異常に買い込むのだ。</p> -<p>この買い方もむちゃくちゃである。冷蔵庫の奥に抹茶が山程眠っていた。聞くとどれも自分で買ったものだと言う。お茶屋が友達なので行けば買わないと悪いとか、来客の為に新しい抹茶を用意したいとかで、無駄に多く買ってどれも処分しないのだ。ある日美味しくなさそうな出来合いのオムレツを買ってきた。どうやら本人も美味しくなさそうだと思いつつ買ったらしい。近くの個人経営の商店によく行くのだが、潰れては困るので欲しいものがなくても適当になにか買うのだそうだ。店の為に不要な物を買うのは良くないと思う。需要を歪めることになるからだ。大事な店ならむしろ自分が欲しい物を伝えて、要らない物は買わない方がいい。仕入れるかどうかは店の判断だろうが、客からも要望を伝えることで、その地域にとって必要な店になる可能性が高まるのではないか。不要なものでも買ってしまうと、結局好ましくない依存が生まれて返って店を潰すことになるか、そうでなくても地域に必要とされない店になるだろう。</p> -<p>冷蔵庫を一通り綺麗にしたその日の夕方、奥さんが大量の野菜と果物を仕入れてきた。流石に少し怒りが湧いた。そうでなくても奥さん自身、綺麗な冷蔵庫を喜んでいたので、再びちらかるようなことは避けようとも思い、そんなに大量に買ってこられるとまたぐちゃぐちゃになるだろうと小言を言っておいた。そんなに嫌味のつもりはなかったのだが。次の日も前日の野菜がたくさんあるにも関わらずまたいろいろ買ってきた。前日よりはさすがに少なかったが、同じように買いすぎだと思う旨を伝え、買ってきたものを何に使うのかひとつひとつ聞いてみた。すると見る見る顔が曇っていった。最後に、欲しいものを欲しい時に買って食べるのは自由だが、そのような買い物をするなら必ず冷蔵庫がぐちゃぐちゃになるから古い物はどんどん捨てていくことになるがそれでもいいのかと正すと、とうとう何も答えずにどこかに行ってしまった。その日の夕食はどうなったのか覚えていないが、多分普段通り食べたのだと思う。特に記憶にないということは、別にお通夜のようにはならなかったのだろう。次の日は朝から掃除に来ていた檀家さんとひと悶着あった。朝食の後になって奥さんがそのことで明らかに僕に対して敵意を剥き出しに、ああだこうだ言ってきた。内容はこまかくは覚えていないが、どうも檀家さんと僕とのやりとりと言うよりも前日のことについて攻めたてられたように思う。ひとつだけはっきり覚えているのは「論で言われると考えるのが面倒くさくなってしまう」という言葉だ。ではどうすればええねや。それから、檀家さんとのやりとりでは僕も良くない点があったのでそれを自分で分析するようなことを言うと、「自分で反省できて偉いわねぇ。」と言われた。こうも人の気持を逆撫でするようなことが言えるのかと思ったものだ。</p> -<p>調理器具も異常に多い。鍋もフライパンも同じような大きさのものがそれぞれ10個以上ある。使っていない調味料も置いたままである。冷蔵庫の他にもキッチンストッカーとか言ったか、間口が1m程度、奥行60cm程度、高さは2m近くあるような棚にびっしり保存食が詰っている。多分半分は賞味期限が切れている。この棚は台所の隣の4畳程の部屋にあるのだが、この部屋にはほかにも本棚のようなものが二つあってカップ麺やら乾物やらお菓子やらで埋まっている。足元にはダンボールに入った缶ジュースがあったり、使っていない家電があったり、変色した調味料のビンなんかもあったと思う。勝手に整理する訳にもいかず、整理を手伝っても冷蔵庫の時のようになりそうで、毎日一人の時間にただ眺めることしかできなかった。ある日疲れてぼーっとしているところを奥さんに見られたが、たまたま顔が食器棚に向いていたために、「物が多いと思ってるんでしょ。」と言われた。先方も僕がそこに居るだけで結構な心理的負担を感じているのだろうか。</p> - -<h2>檀家さんとの口論</h2> -<p>檀家さんの話が出たのでここに書いておく。</p> -<p>この檀家さんには以前、清澄寺という日蓮宗の聖地の森がコンクリートで覆われてたいへんだという話しをしていた。土をコンクリートにしてしまっては周囲の環境を著しく痛めてしまうという話である。このときは高田宏臣氏の本を持ち出して説明し、賛同してくれた。ある朝この檀家さんが境内の落葉を掃除している所に奥さんも居たので話しかけた。この時も高田さんの名前も出したように思うが、落葉を残して腐葉土にできないかとか、もっと境内に木を増やした方がいいのではないかなどと話すと、この檀家さんは落葉が積もると汚ないし、木が増えると虫が沸き、また管理も大変だからむしろコンクリートを増やすべきだと言った。前回コンクリートの話で同意してくれたのは何だったのか。</p> -<p>ところで話をしているとこの檀家さんの顔がみるみる曇り、最後にはとうとうまっくろけになってしまったのは怖かった。また、上で書いた自分の反省というのは、落葉を掃除している所に落葉を掃除しすぎるのは良くないのではないかという話を持ち掛けたことについてである。</p> - -<h2>物を捨てられない</h2> -<p>台所も汚いが、他の場所も物で溢れている。檀家さんに貰った物、檀家さんが作ってくれた物、自分で買った物。もちろん必要な物もあるだろうが、問題は奥さんも住職も不要だと思いながら捨てずにいる物である。檀家さんの気持を蔑ろにできないから捨てないというのはあまりにも問題である。結局それのせいで寺が汚なくなっては檀家さんの面目を返って潰しているのではないか。土地柄、檀家さんには漆器屋さんが多い。漆の盆は押入に積み上がっている。どこかの旅行のお土産といってでかい塗の囲炉裏をくれたが、これは部屋の隅に起きっぱなしで使ったためしがない。昔本堂で使う椅子がなく、急遽檀家さんが空き缶を束ねてダンボールかなにかと布で綺麗に包んだものが今も本堂の隅に出しっぱなしで、使っているのを見たことがない。二人暮しなのに大きな食器棚が6個くらいある。どれもぱんぱんに詰っている。昔は檀家さんがよく集って食事をしたそうだがそれでもなお余るほど多い。何十年も寺に通っている信者さんが、今でも来るたびに初めて見るカップが出てくるという。箪笥が多い。使っていないものもある。ひどいことに同じ箪笥を2個重ねて置いている。上にではなく、前後に2個重ねているのである。1個無駄じゃん!ねぇよ赤外線はよぉ。</p> -<p>寺というのは俗世間にはない空気を作るべき場所ではないのか。綺麗に片付けて掃除して、物で溢れた豊かなこの世界にあって、物質的ではない本当の豊かさを提示する場所でなくていいのだろうか。物質的な豊かさを賞賛するのであれば寺はもっと金儲けに走るべきであろう。そうしないのはそうではないものを世間に見せるためであろうに。</p> - -<h2>人格を感じられない人</h2> -<p>住職の奥さんにしても、上に書いた檀家さんにしても、本人が一体何を考え、感じているのか僕にはさっぱり掴めない。上に書いた檀家さんとのやりとりだけでなく、住職の奥さんも普段の会話では僕の考えに概ね賛同してくれる。始めは話の合う人なのかと思っていたがどうもそうではなかったらしい。この人達は自分に関係のない話に関してはその場の雰囲気や同調を重視して賛同しているような空気を作りだすが、自分に関係のある話しになると突然豹変して自らの利権を死守しようとするようである。僕はこの一年、このような人と付き合うことに疲れてしまったようである。僕はこのような人の感情を読むことができず、何を考えているのかも分からない。論理的に考えるのも無駄だった。僕はこの人達に一切の信頼を置くことができない。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20221031.html b/pub/journal/posts/20221031.html @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>大阪駅にて</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>大阪駅にて</h1> -<time>2022-10-30</time> -<p>いつだったか、大阪駅から和歌山に帰るため、1番線にて関空・紀州路快速、関西空港・和歌山行を待っていた。この快速は関西空港行4両と和歌山行4両が連結して8両編成となっている。途中の日根野駅で切り離し、その後はそれぞれの目的地に向かう。僕は和歌山行の先頭車両に乗ろうと思い、白色三角印の4番に並んでいた。ところでこの快速に女性専用車はないのだが、環状線内を走る普通列車は4号車が女性専用である。自分の並んでいる所にもそのように書いていた。しばらくして僕の後ろにおじさんが一人並んだ。次にこのホームに来るのは普通列車である。この人も後で来る快速に乗るのかと思って気にしていなかった。</p> -<p>しばらくして普通列車が到着した。僕はこれには乗らないので横にずれて後ろの人達に道を開けた。列車が停止してドアが開くと、後ろのおじさんはそのまま女性専用車にすいこまれていった。声を掛けるべきか考えているうちに発車ベルが鳴り、おじさんは閉じ込められて行ってしまった。</p> -<p>ところで関空・紀州路快速のうち和歌山に行くのは後ろの4両、5号車から8号車である。僕が並んでいたのは和歌山行の先頭車ではなく関西空港行の最後尾だった。僕は足元の白色三角印4番をしばらく眺めた後、隣の5番に並びなおした。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20221228.html b/pub/journal/posts/20221228.html @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>Holy Shit!</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>Holy Shit!</h1> -<p>最近見ているプログラマの配信者がよく言っている。「Holy Shit!」Holyは聖なる、Shitはうんこという意味である。日本のプログラマもうんこという言葉を好むが、海外でも同じようである。 -</p> -<p> -ところでこの言葉の訳語はなにがいいかと考えていると思いがけずぴったりなものを思いついた:</p> -<p> -「すめらうんこ」 -</p> -<p> -そうそれは、すめらみことの落しもの(droppings)。嗚呼不敬。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230119.html b/pub/journal/posts/20230119.html @@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>寺を辞めた</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>寺を辞めた</h1> -<time>2023-01-19</time> -<p> -寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p> -<p> -ふう。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230725.html b/pub/journal/posts/20230725.html @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>水道と空調</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>水道と空調</h1> -<time>2023-07-25</time> - -<h2>水道</h2> -<p> -水道が普及して井戸が使えなくなった。水道があれば井戸から飲み水を汲む必要がない。井戸から飲み水を汲まなくなれば井戸水が無くなっても、あるいは汚染されても問題ない。問題なければその通りになる。水源を涵養するという考えが忘れられ、森がコンクリートで覆われた。水が汚なくても良くなったので農薬や肥料を大量に使うようになった。そして井戸は水位が下り、汚染された。</p> -<p> -便利な水道が普及した為に、水道が無いと不便な世界になった。不便というよりそれがないと生きるのもままならない。現在我々はそのインフラの維持費と、災害時の脆弱性に悩まされている。</p> -<h2>空調</h2> -<p> -空調が普及したら気温が高くなった。逆ではない。空調があれば気温が高くなっても問題ない。問題なければその通りになる。街から植物が一掃されコンクリートとアスファルトで覆われた。暑くても問題ないので経済優先で自動車の為の道路ばかり整備された。そして街の気温は上った。</p> -<p> -便利な空調が普及した為に、空調が無いと不便な世界になった。不便というよりそれがないと生きるのもままならないようになりつつある。</p> -<p> -そのうち空調の効率を上げるために、都市全体が大きなドームに覆われる。ドームの外は50℃か60℃か。このインフラもまた維持費と災害に対する脆弱性で我々を悩ませることになろうか。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230726.html b/pub/journal/posts/20230726.html @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>GOPL読んだ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>GOPL読んだ</h1> -<time>2023-07-26</time> -<p> -Alan A. A. DonovanとBrian W. Kernighanの「The Go Programming Language」を読了した。読み初めた日付は記録していないが、演習問題用のgitリポジトリは、今年の5月19日が最初のコミットである。二ヶ月ちょっとかかった。本文だけでなく演習問題も濃かった。時間をかけて読む価値があると思う。Kernighanの書いた本は英語が綺麗でいい。</p> -<p> -アマゾンで英語の原著を買ったが、表紙の紙のコーティングみたいなビニールが剥れてきているのが残念。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230729.html b/pub/journal/posts/20230729.html @@ -1,55 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>無題</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>無題</h1> -<time>2023-07-29</time> -<p> -最近持っている浴衣がどれもぼろぼろになってきた。元々古いもらいものなうえ、着方も動き方もなってないので着ているとすぐにどこか破れる。補修しながら使っていたが、いよいよ布自体がすり切れてきた。いい機会なので自分で仕立ててみようと思いたった。 -実は寺に居たころに白衣を作ろうと思い、晒の裁断と袖の縫いまでしていた。ほったらかしになっていたこれを再開することにした。</p> -<p> -腋縫いまでしていたこの着物に、今日はおくみを片方だけ付けた。両方したかったが疲れたのでもう片方はまた今度。色が付いていないただの晒だが、白衣など着る機会が無くなってしまったので、袖と襟だけでも染めることにした。家にころがっていたターナーの無臭柿渋を3倍に薄めて染めた。本当は自分で育てた柿を使いたいが、そんん場所はないので買ってきた渋である。柿渋は紫外線で硬化して定着するらしく、媒染剤は必要ないようである。襦袢くらいには使えるだろうか。</p> - -<p> -梅を塩に漬けているのを思いだしたのでこれを庭に干した。県民の義務である。そして今日は土曜である。本当は自分で育てた梅を使いたいが、そんな場所はないので買ってきた梅である。残った梅酢は生姜でも漬けようか。</p> - -<p> -庭に植えた里芋から芽がでてきた。大野芋というものであるが、僕が住んでいる場所とは関係がない。既に大きな葉が付いていたのだが、セスジスズメという芋虫にやられて禿げていた。四匹いたのだがある晩二匹減り、二日後にもう一匹、そしていつのまにか最後の一匹が居なくなっていた。なにかに食べられたのか。蛹は見ていない。以前ニンジンの花がキアゲハにやられた時も、たくさん居た芋虫が一晩で一匹も居なくなっていた。ところで芋虫というのは見ているとなんだか美味しそうに見えてくる。実際美味しいらしい<sup>[1]</sup>が。まだ食べる勇気はない。</p> -<p> -この里芋は葉だけでなく茎を根本までかじられて切り株のようになっていたが、その切り株の中心が少しづつ盛り上がってきている。芋は強い。 -</p> - -<ul> -<li>[1]<a href="https://survivalnature.sakura.ne.jp/0000/11_mushi/imomushi/0000.html">イモムシ・ケムシ.サバイバル節約術</a></li> -</ul> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230802.html b/pub/journal/posts/20230802.html @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>着物できた</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>着物できた</h1> -<time>2023-08-02</time> - -<p> -作っていた着物が完成した。思っていたよりもずっと簡単だった。細かいところを追求すれば職人技なのだろうが、日常的に使うものを作るには素人でも十分である。</p> - -<p> -初めは白衣のつもりで安物の晒をそのまま使って作り始めたが、白衣を着ることが無くなってしまったので、袖と衿だけ柿渋で染めて襦袢にすることにした。形は長着だが。</p> - -<p> -完成後、右の衿がかなりずれて付いていることに気付いた。このときは疲れからか不幸にもこのままでいいやと思っていたが、見れば見るほど気になって、とうとうこの部分だけ付けなおすことにした。そして完成したのがこれである。</p> -<img src="20230802.jpg" alt="初めて自作した着物の写真" /> - -<p> -ほんのひと昔前までは着物を作る人などその辺にいくらでもいた。世話になっていた寺の住職のお婆さんは和裁の先生だったそうだし、僕の祖父母より少し若いお茶屋さんは、自分のお母さんが家族の着るものを自分で作っていたという。つまり僕の3、4世代前は着物を自作するのが当たり前だった。ところがこの50年程の間にだれも作らなくなってしまった。和服に限らず自分で作れば安上りなのに。</p> - -<p> -なぜ自作しないのかと聞くと、きっと「そんな時間はない」という答えが返ってくる。金銭的にゆたかになって、自分で服を作る必要がなくなった。のではなく、服を作るような時間的余裕のある人がいなくなったというのが実情である。はて。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230802.jpg b/pub/journal/posts/20230802.jpg Binary files differ. diff --git a/pub/journal/posts/20230803.html b/pub/journal/posts/20230803.html @@ -1,56 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>サマータイムレンダ読んだ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>サマータイムレンダ読んだ</h1> -<time>2023-08-03</time> - -<p> -サマータイムレンダを読んだ。弟が漫画を買ってリビングに置いて母や妹に読ませていた。ある日なにげなくパラパラめくり始めたのだが、気づけば全部読んでしまっていた。13巻で完結するコンパクトな漫画である。</p> - -<p> -話の内容はサスペンスとしては面白かった。サスペンス自体を論評する知識はないが、少なくとも僕は楽しめた。話の構成とその展開が上手いのだと思う。</p> - -<p> -ところが最後の方に来て少し残念な感じになった。展開はそれまで通りのものに加え、クライマックスの勢いが付いているのだが、黒幕の動機がどうもうすっぺらい。そんな幼稚なやつにふりまわされていたのかと思うと、話の展開が面白いだけになんとも空虚になる。300年前に生まれた神職がそんなこと考えるのかも疑問である。そして動機がただ利己的であるがゆえに、悪役がどこから見てもただの悪役でしかない。だからこそ結末はこの悪役を倒してめでたしめでたしとしかならない。その上途中でおこった取り返しの付かないはずのことも、結局うまいことひっくり返して何も失わずにハッピーエンドを迎えた。これもあまり好みではなかった。</p> -<p> -この辺に関して個人的には最近読んだ「風の谷のナウシカ」のコミックがよかった。こちらには完全な悪がでてこない。敵であってもそれぞれなにかしらの事情があり、それぞれの信念に基いて行動している。だからこそ悪を殲滅して終りにはならないし、敵に勝ってもやるせない。このすっきりしなさが物語に重層性を持たせているように思う。さらに起ったことは事実として定着し、覆ることがないというのも重要なテーマとしていたように思う。どんな過去であっても今の自分たちの生命を以って未来を切り開くというものである。題材も内容も全く違う作品なので比べてもしょうがないが。</p> - -<p> -僕はそもそも死んで時間が戻るのは好きではない。人生の一回性が無くなってしまうからだ。しかしこの作品は死んで時間が戻るといっても、一応完全には取り返しの付かないようになっている。それもあって楽しめたのだが、最後の最後で全部なかったことにしてしまったのは残念である。</p> - -<p> -それから、時間が戻る際に主人公は意識が連続しているので、完全に同一人物といえるかもしれないが、その他の登場人物はどうなのか。戻る前と戻った後では同じ意識の人間なのか。主人公から見れば自分以外に主観は無いので、時間が戻っても以前と同じ人間に見えるだろうが、しかしそれでいいなら本人もコピーされた影も同じだということにならないだろうか。この点について、どこかで問題提起されていたと思うが、結局回収されずにおわった。最後のハッピーエンドはあくまでも本人のみのものであり、それまでに死んだ他の登場人物は結局そのままなのではないだろうか。これもひとつの大きなテーマだと思っていただけに、どうも疑問が残る。</p> - -<p> -最後に、「あっぽけ」って言ってる人は見たことがない。「今日わは...」については大阪人の友達に言ってきょとんとされた経験がある。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20230810.html b/pub/journal/posts/20230810.html @@ -1,45 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>イソヒヨ</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>イソヒヨ</h1> -<time>2023-08-10</time> - -<p> -最近イソヒヨが庭でよく遊んでいる。昨日も来た。部屋の窓からのぞきこんでも逃げない。里芋が植わっているあたりでなにかしている。突然里芋の方にとびかかったと思うと、そのまま隣の家の物干しまで飛んでいった。くちばしになにか太いものをくわえている。少しくわえ直してそのままどこかに行ってしまった。</p> - -<p> -里芋の葉には4、5日前からセスジスズメがいた。昨日の朝見たときはだいぶ太って目玉模様もはっきりしていた。元気に里芋を食いちらかしていた。イソヒヨが飛んでいった後確認するも姿が見えない。くわえていたのはセスジスズメだったのか。</p> - -<p> -少し前にも里芋にセスジスズメがついていたが、気づいたら一匹もいなくなった。その前にはニンジンについたキアゲハが一晩でいなくなった。犯人はこいつか。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20240428.html b/pub/journal/posts/20240428.html @@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>きのかわ弦楽合奏団第7回定期演奏会</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>きのかわ弦楽合奏団第7回定期演奏会</h1> -<time>2024-04-28</time> - -<p>先日きのかわ弦楽合奏団というアマチュアの団体に入団しました。その定期演奏会が7月にあります。多分出演します。</p> - -<figure> -<img src="7th_concert.jpeg" alt="きのかわ弦楽合奏団の第七回定期演奏会のポスター。7月14日14:00から、かつらぎ総合文化会館、あじさいホールにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figcaption> -</figure> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20241009-1.jpg b/pub/journal/posts/20241009-1.jpg Binary files differ. diff --git a/pub/journal/posts/20241009-2.jpg b/pub/journal/posts/20241009-2.jpg Binary files differ. diff --git a/pub/journal/posts/20241009-3.jpg b/pub/journal/posts/20241009-3.jpg Binary files differ. diff --git a/pub/journal/posts/20241009-4.jpg b/pub/journal/posts/20241009-4.jpg Binary files differ. diff --git a/pub/journal/posts/20241009-5.jpg b/pub/journal/posts/20241009-5.jpg Binary files differ. diff --git a/pub/journal/posts/20241009.html b/pub/journal/posts/20241009.html @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>棚作った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>棚作った</h1> -<time></time> - -<p> -自室のクローゼットが使いにくかったので引っ剥がして新しいのを作った。収納していたのはほとんど本だったのだが、奥行きが深いのに棚板が少ないので前後に並べて置いていたため、どこになんの本があるのか見にくく、取り出しにくかった。あとパソコン置き場としても使っていたが、24インチのモニターが一枚ギリギリ入る程度の幅しかなかったのでこれも拡張したかった。久しぶりに木工もしたかったので木材を買って自作した。杉を基本に、パソコンを置く場所だけ檜にした。<p> - -<figure> -<img src="20241009-1.jpg" alt="クローゼット跡地と買った木材"> -<figcaption>クローゼット跡地と買った木材</figcaption> -</figure> - -<figure> -<img src="20241009-2.jpg" alt="パソコン机の部分"> -<figcaption>パソコン机の部分</figcaption> -</figure> - -<p> -パソコン机の天板は白木のままでは寂しいので亜麻仁油を塗ってオイルフィニッシュにしてみた。結構黄色が濃くなった。</p> - -<figure> -<img src="20241009-3.jpg" alt="机のオイルフィニッシュ"> -<figcaption>机のオイルフィニッシュ。下においているのが白木のもの</figcaption> -</figure> - -<p> -せっかくやるならと思って蟻を切ってみた。適当でも案外ガッチリはまるものである。英語ではdovetailというそうだ。鳩のしっぽという意味である。日本語の蟻よりも鳩のしっぽのほうがしっくりくる気がする。</p> - -<figure> -<img src="20241009-4.jpg" alt="蟻"> -<figcaption>蟻</figcaption> -</figure> - -<p> -上に本棚をつけて完成。本棚は棚を移動しやすいようにと思い、ネジ止め式の棚受けを買った。めんどくさくなったわけではない。左下においているのはもとのクローゼットにあった引き出しである。</p> - -<figure> -<img src="20241009-5.jpg" alt="完成"> -<figcaption>完成</figcaption> -</figure> - -<p> -これを作るにあたり、大阪日本橋の刃物屋で鉋を買ってきた。これまではホームセンターで1000円ほどのものだったが、今回買ったのは8000円の物である。店主が台の仕込みと研ぎをした上で売ってくれた。きれいに切れるので小口面の直角を出すのが楽しくなった。小口を下にして自立するようになったときは結構気持ちいい。専門店での買い物は楽しい。餅は餅屋である。</p> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20241202-1.jpg b/pub/journal/posts/20241202-1.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-10.jpg b/pub/journal/posts/20241202-10.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-11.jpg b/pub/journal/posts/20241202-11.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-12.jpg b/pub/journal/posts/20241202-12.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-13.jpg b/pub/journal/posts/20241202-13.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-14.jpg b/pub/journal/posts/20241202-14.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-15.jpg b/pub/journal/posts/20241202-15.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-2.jpg b/pub/journal/posts/20241202-2.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-3.jpg b/pub/journal/posts/20241202-3.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-4.jpg b/pub/journal/posts/20241202-4.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-5.jpg b/pub/journal/posts/20241202-5.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-6.jpg b/pub/journal/posts/20241202-6.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-7.jpg b/pub/journal/posts/20241202-7.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-8.jpg b/pub/journal/posts/20241202-8.jpg Binary files differ. diff --git a/pub/journal/posts/20241202-9.jpg b/pub/journal/posts/20241202-9.jpg Binary files differ. diff --git a/pub/journal/posts/20241202.html b/pub/journal/posts/20241202.html @@ -1,86 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>椅子作った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>椅子作った</h1> -<time>2024-12-02</time> - -<p> -チェロを弾くのに使っていた椅子ががたがたになってきたので、新しい椅子を作った。座面の張り方はYouTubeの動画[1]を参考にした。</p> -<p> -まず木枠を作る。足にホゾ穴を彫って梁を差し込む形にした。「そぎ先枘接ぎ」という名前らしい[2]。</p> -<img src="20241202-1.jpg" alt="木枠の画像"> - -<p> -足は猫足にした。ボンドで接着してバネを受ける板を付ける。本当は膠にしたかったけどめんどくさくなった。</p> -<img src="20241202-2.jpg" alt="ボンドで固定した木枠の画像"> - -<p> -バネを又釘で固定。 -</p> -<img src="20241202-3.jpg" alt="バネを木枠に釘で固定した画像"> -<img src="20241202-4.jpg" alt="固定した部分を拡大した画像"> - -<p> -ずれないように麻紐でくくり麻布を被せる。さらに麻布にバネを縫い付ける。</p> -<img src="20241202-5.jpg" alt="バネを麻紐でくくった画像"> -<img src="20241202-6.jpg" alt="バネを麻布で覆った画像"> -<img src="20241202-7.jpg" alt="麻布を固定した部分の拡大画像"> -<img src="20241202-8.jpg" alt="バネを麻布に縫い付けた画像"> - -<p> -藁で土手を作る。この藁はチェロの先生に貰ったものである。晒で覆ったうえ、糸で縫って固める。 -</p> -<img src="20241202-9.jpg" alt="藁の土手の画像"> -<img src="20241202-10.jpg" alt="藁の土手を糸で縫った画像"> -<img src="20241202-11.jpg" alt="縫った部分の拡大画像"> - -<p> -棕櫚を盛って布で覆い、綿を被せてモケットで仕上げる。本来は棕櫚ではなく芝であるが手に入らなかった。棕櫚の産地に住んでいるのでこちらなら山にいくらでも生えている。モケットは高野口町で買った。この町は鉄道のシートも作っているらしい。283系や287系、あるいはN700系等のものが欲しかったがJRに怒られるからと断わられた。そらそうや。</p> -<img src="20241202-12.jpg" alt="棕櫚を盛って布で覆った画像"> -<img src="20241202-13.jpg" alt="布の上から綿を被せた画像"> - -<p> -完成。 -</p> -<img src="20241202-14.jpg" alt="モケットを被せて完成した椅子の画像"> - -<p> -椅子が良くなっても練習しないと腕は上がらない。 -</p> - -<h2>参考</h2> -<ol> -<li><a href="https://www.youtube.com/watch?v=15SjxP-wcek">TOKYO 匠の技(椅子張り 熟練技能編)</a></li> -<li>鳥海義之助 「図解 木工の継手と仕口 増補版」 p.37</li> -</ol> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20241211.html b/pub/journal/posts/20241211.html @@ -1,42 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>きのかわ弦楽合奏団 第5回コミュニティコンサート</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>きのかわ弦楽合奏団 第5回コミュニティコンサート</h1> -<time>2024-12-11</time> -<p>来年の一月にコンサートあります。</p> -<figure> -<img src="20241211.jpg" alt="きのかわ弦楽合奏団の第5回コミュニティコンサートのちらし。令和7年1月12日14:00から、和歌山北コミュニティセンターにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20241211.jpg b/pub/journal/posts/20241211.jpg Binary files differ. diff --git a/pub/journal/posts/20250216-1.jpg b/pub/journal/posts/20250216-1.jpg Binary files differ. diff --git a/pub/journal/posts/20250216-2.jpg b/pub/journal/posts/20250216-2.jpg Binary files differ. diff --git a/pub/journal/posts/20250216.html b/pub/journal/posts/20250216.html @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>きのかわ弦楽合奏団 さくらコンサート</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>きのかわ弦楽合奏団 さくらコンサート</h1> -<time>2025-02-16</time> -<p>三月にコンサートあります。</p> -<figure> -<img src="20250216-1.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの表面。令和7年3月23日14:00から、旧和歌山県議会議事堂にて"> -<img src="20250216-2.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの裏面。楽団と会場の紹介"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20250221.html b/pub/journal/posts/20250221.html @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>着物作った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>着物作った</h1> -<time>2025-02-21</time> -<p> -普段着回している着物がへたってきたので新しいのを仕立てた。楽天で見付けた真綿紬の草木染めである。中古で2640円だった。新品だとおそらく何十万のしろものである。女物だったので解いて洗濯し、男物に仕立て直した。防虫剤の臭いがひどかったが、洗濯すればおおむね取れた。</p> - -<p> -解いた布を重ねてネットに入れ、普通に洗濯する。脱水が済んだら濡れた状態でアイロンをかけてしわをとり陰干しする。絹ものだがこれで特に問題なく洗濯できた。</p> - -<p> -裏地も一緒に洗濯した。これも多分羽二重の高価なものである。ただ袷にするのは面倒なので一重にした。袖付けがなかなか上手くいかずに人形のところが皺になる。居敷当ては箪笥に眠っていた唐草模様の風呂敷を使った。</p> - -<figure> -<img src="20250221.jpg" alt="作った着物"> -</figure> - -<p> -真綿紬は初めてだが、軽くて暖かい。ほどかずに洗濯してよれよれにならなければいいのだが...</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20250221.jpg b/pub/journal/posts/20250221.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-1.jpg b/pub/journal/posts/20250420-1.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-10.jpg b/pub/journal/posts/20250420-10.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-11.jpg b/pub/journal/posts/20250420-11.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-12.jpg b/pub/journal/posts/20250420-12.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-13.jpg b/pub/journal/posts/20250420-13.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-2.jpg b/pub/journal/posts/20250420-2.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-3.jpg b/pub/journal/posts/20250420-3.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-4.jpg b/pub/journal/posts/20250420-4.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-5.jpg b/pub/journal/posts/20250420-5.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-6.jpg b/pub/journal/posts/20250420-6.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-7.jpg b/pub/journal/posts/20250420-7.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-8.jpg b/pub/journal/posts/20250420-8.jpg Binary files differ. diff --git a/pub/journal/posts/20250420-9.jpg b/pub/journal/posts/20250420-9.jpg Binary files differ. diff --git a/pub/journal/posts/20250420.html b/pub/journal/posts/20250420.html @@ -1,124 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>大阪万博行った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>大阪万博行った</h1> -<time>2025-04-20</time> - -<p>4月15日火曜日に大阪万博に行ってきた。 -</p> - -<p>朝の紀州路快速は高校生ばかりだった。大阪に近付くにつれてビジネスマンが多くなっていった。西九条から地下鉄に乗りかえるとEXPO staffの札を首から下げた外国人がたくさんいた。外国人ばかりなのになぜかみんなスマホを見たり、目が合ってもなんとなく外を向いたりと、雰囲気だけが日本なのが面白い。</p> - -<p> -会場には予約より少し早く着いた。荷物検査があるので結構時間がかかり、入れたのは予約より30分ほど過ぎたころだった。</p> -<figure> -<img src="20250420-1.jpg" alt="東ゲート"> -<figcaption>東ゲート</figcaption> -</figure> -<figure> -<img src="20250420-2.jpg" alt="リング"> -<figcaption>リング</figcaption> -</figure> - -<p>会場内はところどころ植え込みがあって雑草も生えてきていた。タンポポは全部セイヨウだった。中央付近に静けさの森という場所があるが、そんなに森にはなっていない。どうせなら明治神宮みたいなのを作ればよかったかと思う。IR会場になった後も公園にできるし。 -</p> -<figure> -<img src="20250420-3.jpg" alt="セイヨウタンポポ"> -<figcaption>セイヨウタンポポ</figcaption> -</figure> -<figure> -<img src="20250420-4.jpg" alt="ノゲシ"> -<figcaption>ノゲシ</figcaption> -</figure> -<figure> -<img src="20250420-5.jpg" alt="バラ科のなにか"> -<figcaption>バラ科のなにか</figcaption> -</figure> -<figure> -<img src="20250420-6.jpg" alt="ノボロギク"> -<figcaption>ノボロギク</figcaption> -</figure> -<figure> -<img src="20250420-7.jpg" alt="ノアザミ"> -<figcaption>ノアザミ</figcaption> -</figure> -<figure> -<img src="20250420-8.jpg" alt="タネツケバナ"> -<figcaption>タネツケバナ</figcaption> -</figure> -<figure> -<img src="20250420-9.jpg" alt="ヨモギ"> -<figcaption>ヨモギ</figcaption> -</figure> - -<p>11時に英国パビリオンを予約していたのだが着いてみるとシステムエラーで閉鎖されていた。レストランは開いていたので混む前になにか食べることにした。英国人と会話できると思っていたが案内してくれたのは片言の英語を喋るアジア人のおばちゃんだった。2個で9ポンドのアイスクリームは売ってなかった。フィッシュアンドチップスと紅茶を頼んだ。出された紅茶にはミルクが付いていなかった?!フィッシュアンドチップスの方は思っていたよりは美味しかった。味のしない鱈だったが鮮度は良く、衣もさくさくだった。油もそこまで古くなっていない。チップスの方はモスバーガーよりイモの味が薄かった。タルタルソースと緑のペーストが付いていた。緑のものは多分エンドウ豆を潰したものにミントで香りを付けていた。悪くはなかったが組合せが初めてだったせいか、ミントが目立ちすぎていたように思う。</p> -<figure> -<img src="20250420-10.jpg" alt="フィッシュアンドチップス"> -<figcaption>フィッシュアンドチップス</figcaption> -</figure> - -<p>英国パビリオンが復旧するまで他を周ることにした。オーストリアに行ってみたが列が一杯だから時間をおいて来るように言われた。</p> - -<p>大根が咲いていた。 -</p> -<figure> -<img src="20250420-11.jpg" alt="ハマダイコン"> -<figcaption>ハマダイコン</figcaption> -</figure> - -<p>二つほど空いてる所を見たがあんまり面白くなかった。</p> - -<p>英国に戻ってみると復旧していたので入ることにした。前に英国人の親子が並んでいた。母親が高校生くらいの息子にハグして日本語で「トテモカワイイデス」と言っていた。突然日本語が聞こえてくるとどうしても見てしまう。目が合った。その後もなぜかちらほら日本語が聞こえてきては目が合った。しばらくして父親の方が息子の鞄からチョコ棒を出して母親と息子に配った。自分の分を取ったあとなぜかさらにもう一本取り出してこっちに差し出してきた。話し掛けたいなあと思っていた所だったので受け取ってお礼を言って何を話そうかと考えていたのだが、パビリオンの扉が開いて3人は吸い込まれていった。パビリオンは20人程度のグループで周るようになっていたのだが、丁度僕の前で区切られてしまったのだ。</p> -<figure> -<img src="20250420-12.jpg" alt="英国人がくれたチョコ棒"> -<figcaption>英国人がくれたチョコ棒</figcaption> -</figure> - -<p>展示は特に面白くなかった。特定の医薬品会社がお金を出していそうなことは分った。 -</p> - -<p>パビリオンの中にバーがあった。ビールでも飲みたかったが外が寒すぎて冷えていたのであきらめた。 -</p> - -<p>その後は特に予定もなかったので散歩していたらルーマニアパビリオンを見つけた。チェロの先生がルーマニアで修行してきた人なので行ってみたかったのだが、予約のフォームで見つからなかったので来ていないものだと思っていた。予約できないだけみたいだ。</p> - -<p>30分ほど並んだ。入口に居たお姉さんがめっちゃ綺麗だった。展示は生演奏と伝統工芸の展示、実演だった。演奏は僕が行ったときはバイオリンだけだったが、椅子と譜面台が4つとピアノもあったので時間によって編成が変わるようだった。伝統工芸の展示のひとつに、ガラスに描かれた宗教画があった。ビザンツからの伝統だと言っていたと思う。絵の具が置いてあったので描かせてもらった。マリアがキリストを抱いている画を模写した。描きながらルーマニアのことを色々教えてもらえたのがとても良かった。女の人が全員綺麗だった。さすが東欧である。レストランもあったが残念ながら閉まっていて食べられなかった。</p> - -<p>最後に知りあったルーマニア人とその辺をぶらぶらして帰ってきた。</p> -<figure> -<img src="20250420-13.jpg" alt="知り合ったルーマニア人"> -<figcaption>知り合ったルーマニア人</figcaption> -</figure> - -<p>パビリオンの展示は総じていまいちである。今回行った海外のパビリオンには特に未来っぽいものはなにもなかった。これはある意味期待通りだった。一方でルーマニアでは現地の文化も見れたし現地人との交流もできたのでよかった。他のパビリオンでもこういう交流があればいいのにと思う。国内企業のパビリオンに行けていないので次回はその辺を見たい。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20250519-1.jpg b/pub/journal/posts/20250519-1.jpg Binary files differ. diff --git a/pub/journal/posts/20250519-2.jpg b/pub/journal/posts/20250519-2.jpg Binary files differ. diff --git a/pub/journal/posts/20250519-3.jpg b/pub/journal/posts/20250519-3.jpg Binary files differ. diff --git a/pub/journal/posts/20250519.html b/pub/journal/posts/20250519.html @@ -1,120 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>万博で知り合ったルーマニア人とハイキングに行った</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>万博で知り合ったルーマニア人とハイキングに行った</h1> -<time>2025-05-19</time> - -<p> -先日万博のルーマニアパビリオンで知り合ったルーマニア人の<a href="https://noian.art">Noian</a>がハイキングに行きたいというので、地元の山に連れていった。元々4月の終わりごろを予定していたが、僕が風邪をひいてしまいのびていた。向こうも万博の仕事が忙しいようで、帰国の前日になってやっと予定が合った。</p> - -<p> -10時過ぎにうちの最寄り駅に着く予定だったが、電車に乗り間違えたらしく一時間程遅れた。なにせ阪和線である。外国人にはかなりややこしい。そのうえ駅員はフランス人のごとく英語を話さない。間違って関空に行かないようにしつこく注意喚起して、なんとか和歌山に辿りついた。</p> - -<p> -車で自宅まで連れて来て、そこから徒歩で山に向かった。自然が好きそうだったので、ろくに整備されていないひとけのない山に案内した。</p> - -<p> -この山に登るのは久しぶりなので道を覚えているか不安だった。おそらく昔の人が隣の町まで行くのに使っていた道だと思う。今でも一応隣町まで抜けられる。入口は果樹園になっていて今も柑橘の木がたくさん植わっている。川沿いを森に入ると左右には棚田が並んでいる。こちらの田んぼは既に放棄され、今は藪や針葉樹林になっている。針葉樹の方は戦後の拡大造林で植えられたものだろうか、毎年ティッシュペーパーの需要を底上げしている木々である。棚田は石垣で造成されている。いつのものかは知らないが今も崩れずに残っている。</p> - -<p> -棚田の横をさらに進むと小さい滝がある。牝牛の滝というらしい。牝牛と書いてコッテと読む。滝の近くに牝牛に見える岩があるのが由来らしい。コッテという言葉は聞き馴染みがない。後日祖父の友人に聞いた話だと、小さい牛やメスの牛のことをコッテウシと言ったそうだ。</p> - -<figure> -<img src="20250519-1.jpg" alt="牝牛の滝"> -<figcaption><ruby>牝牛<rp>(</rp><rt>コッテ</rt><rp>)</rp></ruby>の滝</figcaption> -</figure> - -<p> -滝を過ぎると急勾配の斜面が続く。ほとんど道とはいえないような山肌を登る。40度はありそうな勾配である。息があがりながらも、彼は日本に来たがっている友人のことを聞かせてくれた。日本のとあるバンドの大ファンなのだそうだ。ポップカルチャーにはうといので自国のことなのになにも分からなかった。最後に大きな岩が作った崖を山羊のように登ればやっと平坦な道に出る。彼のブーツがよく滑っていた。裸足が一番安全だと勧めたが遠慮しとくと言われた。そこから先は特にきつい場所もなく、そのまま展望台に続く。彼は少し疲れたようで言葉が少なくなっていた。</p> - -<figure> -<img src="20250519-2.jpg" alt="展望台から"> -<figcaption>展望台から</figcaption> -</figure> - -<p> -展望台からは僕の町が一望できる。西が海で南北が山、東はゆるがかな坂が高野山まで続いている。彼の出身地も山がちで似た地形だそうだ。海はないが毎年父親が黒海まで連れていってくれていたので馴染深いといっていた。展望台には小さな祠がある。せっかくなので鳥居のくぐり方や参拝の仕方を教えてあげた。熱心に聞いてはくれたが自分はやらないと言っていた。理由は聞かなかったがおそらく彼がキリスト教徒だからであろう。こういうはっきりした態度は見ていてなんとなく気持がいい。</p> - -<p> -ところで日本では神道でも仏教でも左進右退が基本だと思う。以前五瀬命が祀られている竃山神社のお祭に行ったことがある。そこでは巫女さんが神殿に向う階段を登る際左足を一段上げて右足を引き寄せてを繰り返して登り、下るときは逆にしていた。お寺でも道場に入るときは左から、出るときは右からと習った。そういえば合気道でも座礼をするとき左手、右手の順で床に付けて頭を下げ、頭を上げるときは右手から戻すと習った気がする(この記憶はあいまい)。ところがヨーロッパでは逆らしい。左は邪悪だから右から入るのだそうだ。</p> - -<p> -下りは別の道を選んだ。途中からコンクリートで舗装されている楽な道である。途中で山菜がいろいろ生えていたので紹介してあげたらぱくぱく食べていた。よく信用できるものである。イタドリ、ユキノシタ、フキ、チャノキ、タラノキ...。タケノコはもう竹だった。クスノキもあったのでいい香りがすると言って渡したらこれもかじっていた。クスノキが食べられるかどうか僕は知らない。防虫剤に使われていたと伝えるとすぐに吐きだして水で口をすすいでた。</p> - -<p> -展望台でフルートを吹く動画を撮りたかったのに忘れていたといっていたが、途中で見つけた竹林を気に入ったようで、そこで吹いていた。このフルートはチューニングが現代の一般的なものとは違い、ミの音が少し低くなっている。長調とも短調ともいえない微妙な音階だった。</p> - -<figure> -<img src="20250519-3.jpg" alt="フルートを吹くNoian"> -<figcaption>フルートを吹くNoian</figcaption> -</figure> - -<p> -ルーマニアに竹は自生していない。ところが和食屋等には植わっているという。ルーマニアの植生だいじょうぶかなぁ。</p> - -<p> -山から家に帰ってきたらもう15時になろうとしていた。昼ごはんは食べてない。車で和歌山市の寿司屋に向った。弥一という回転寿司である。回転寿司だが安いわけではなく、味はかなり美味しい。</p> - -<p> -中途半端な時間に行ったからか、寿司はひとつも回っておらず、タブレットから注文するように言われた。おなかがすいたから寿司以外のものも食べるといって、彼は最初にうどんを注文した。僕も自分の食べたいものを適当に注文していた。しばらくして納豆うずらが届いた。僕は頼んでいない。彼は納豆が好きだそうだ。ルーマニアにも臭いの強い発酵食品があるのかと思い、チーズの話をしてみた。ルーマニアには臭いチーズはないと言う。ゴルゴンゾーラやカマンベールはないのかと聞くと、あんなのは臭いうちにはいらないそうだ。ちなみに国でよく食べられるのはカビの生えていないクリームチーズのようなものだそうだ。</p> - -<p> -ひととおり食べておなかがいっぱいになってきた。彼もおなかがいっぱいになってきたと言いだした。彼のうどんにはまだ手が付けられていない。テーブルにはまだ寿司が残っている。無理なら僕が食べようかと言うと彼はうどんの鉢をこっちによこした。ちょっとくるしかったがまあうどんなので食べれた。麺は腰があっておいしいが、出汁は少し甘みが強かった。出汁を飲みほした頃、彼も残った寿司をだいたい片付けて、やっぱり自分もうどんを食べるといって追加で注文した。</p> - -<p> -うどんの甘みをガリで消して店を出た。おごってくれた。</p> - -<p> -弥一を後にし、和歌山城に案内した。和歌山城にはなぜか小さな動物園が付いている。時間がなかったので適当に見て天守閣に登った。地元の人間なのに天守閣はこれが初めてである。閉館ぎりぎりに行って30分しか見れなかった。天守閣は米軍に丸焼きにされたあと鉄筋コンクリート造りで再建された物である。外観はそれっぽいが内部は昭和の団地のような近代的なものだった。書画や武器等が展示されていてそれなりに見応えがあり、30分では足りなかった。彼は中国語が話せるので漢字も結構読める。僕が流し見した巻物を熱心に読んでいた。</p> - -<p> -和歌山城を出た後は寺か神社が見たいというので日前宮に行った。既に閉まっていて入れなかった。こんな時間に閉まっては会社帰りに立ち寄れないのではと言われた。ルーマニアではサラリーマンが帰りに教会に行くのが普通なのだろうか。</p> - -<p> -カフェにでも行って話しをしようということになった。いい喫茶店は知らないので和歌山市駅のスタバに行くことにした。駅ビルには確か日本酒のお店もあったのでそこで黒牛か超久でも買わせようと思った。ところが着いてみると平和酒造の店だった。この酒蔵はあまり好きではないので入らずに直接スタバに行った。スタバではどういう流れだったか、国境の話になった。昔は国という概念も国民という枠組みもなかったのに、いつしか作られて国境ができたという。ヨーロッパの世界はかつて神が治めていたが、あるときから貴族がその役割を担い、貴族が没落してからは民衆をまとめるために民族や国家というストーリーが必要になったという。そういえばゲルマン民族というのもナチスがドイツをまとめるために作った概念だとどこかで読んだ気がするが本当なのだろうか。日本は海に囲まれているのでヨーロッパと少し状況が違うんじゃないかという話を出してみた。言語も民族も一つで天然の国境があるのはヨーロッパ人から見るとちょっと変なのかな。そのくせ昔から文化的には国際色豊かだと言われた。</p> - -<p> -辺りがすっかり暗くなったころスタバを出て少しそのへんを散歩した。駅の周辺は全然土地勘がなかったが紀の川があるのは知っていたのでそっちに向かって適当に歩いた。日本語の練習をしたいので日本語で話して欲しいと言われた。僕の言葉は結構理解できていたようだし、向うも割と話せていた。多少ゆっくり話すようにはしたがそれでもたいしたものである。ところで外国人相手に母語を話すと普段どれだけ自分がいい加減に話しているかがよく分かる。発音や文法を間違えないように意識するととたんに言葉に詰まるのだ。</p> - -<p> -人生で英語をしっかり話したのはこれが初めてである。彼と話していて思ったが、話したいことがあれば文章を組みたてる前に話しはじめたほうがいい。相手の話を理解したうえでなにか言いたげなことは伝わるし、そのあとは身振り手振りでも案外なんとかなる。外国人と話すのに外国語に関する知識はある程度必要だが、相手の話したいことに興味を持つのも重要である。</p> - -<p> -河原では日本の山に危険な動物はいるのかという話になった。熊や毒蛇、スズメバチなんかが怖いと言った。このあたりで熊を見たことはないけど。それから彼がどうやって英語を流暢に話せるようになったのかも教えてくれた。英語でゲームをしていたら英語が第二の母語のようになったそうだ。ルーマニア語はマイナーな言語なのでゲームは翻訳されないらしい。僕も流暢ではないにしても何とか意思疎通できるようになったのは、英語でコンピューターの勉強をしたからだと思う。英語を勉強するより、英語を使ってなにかをすると、すぐ覚えるし忘れにくい。最後に二宮金次郎の像に集まった猫を眺めて駅に戻った。</p> - -<p> -彼は明日の22時台の飛行機でイスタンブールを経由して国に帰る。イスタンブールまで12時間、乗り換えに3時間、そこからルーマニアまで1時間半、国に着いてからさらに12時間バスに乗る。なかなか遠いところである。国内線もあると言っていたが、日本でお金を使いすぎたから節約したいらしい。</p> - -<p> -彼は20:30発の特急サザンに乗って大阪のホテルに帰っていった。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20251122.html b/pub/journal/posts/20251122.html @@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>ひざしぶりに合気道した</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>ひざしぶりに合気道した</h1> -<time>2025-11-22</time> - -<p> -大学の合気道部のひとつ下の後輩に誘われて学園祭の演武会に参加してきた。</p> -<figure> - <video controls style="max-width: 100%;"> - <source src="20251122.mp4" type="video/mp4"> - </video> - <figcaption>京都大学合気道部 NF演武会にて(右が僕)</figcaption> -</figure> - -<p> -もうちょっとやりたくなったので高校生のときお世話になっていた地元の道場に電話して稽古させてもらうことにした。続くかな。 -</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/journal/posts/20251122.mp4 b/pub/journal/posts/20251122.mp4 Binary files differ. diff --git a/pub/journal/posts/7th_concert.jpeg b/pub/journal/posts/7th_concert.jpeg Binary files differ. diff --git a/pub/kitchen/index.html b/pub/kitchen/index.html @@ -1,47 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>台所</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>台所</h1> - -<h2>記事</h2> -<ul> - <li><a href="r4_osechi.html">令和4年正月のおせち</a></li> -</ul> - -<h2>レシピ</h2> -<ul> - <li><a href="recipe/mapo_tofu.html">麻婆豆腐</a></li> - <li><a href="recipe/miso.html">味噌</a></li> - <li><a href="recipe/tonkotsu_ramen.html">豚骨ラーメン</a></li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/kitchen/pics/mapo_tofu.jpg b/pub/kitchen/pics/mapo_tofu.jpg Binary files differ. diff --git a/pub/kitchen/pics/r4_osechi.jpg b/pub/kitchen/pics/r4_osechi.jpg Binary files differ. diff --git a/pub/kitchen/pics/tonkotsu_ramen.jpg b/pub/kitchen/pics/tonkotsu_ramen.jpg Binary files differ. diff --git a/pub/kitchen/r4_osechi.html b/pub/kitchen/r4_osechi.html @@ -1,155 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>令和4年正月のおせち料理</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>令和4年正月のおせち料理</h1> -<time>2022-02-04</time> -<p>令和3年の春ごろからだったか、実家の台所に立つようになった。おせちは毎年買っていたがせっかくなので今回は自分で作ることにした。といってもうちには代々受け継がれてきたおせちはないので本やらインターネットやらで調べながらのものである。近代化によって失われたものは大きい。</p> - -<p>今回おせちに入れたものは以下の通り:</p> -<ul> - <li>慈姑</li> - <li>百合根</li> - <li>鶏そぼろ松風</li> - <li>生麩の田楽</li> - <li>炊き合わせ</li> - <li>栗金団</li> - <li>数の子</li> - <li>田作り</li> - <li>伊達巻</li> - <li>酢蓮根</li> - <li>たたき牛蒡</li> - <li>みつわ漬け</li> - <li>金柑の蜜煮</li> - <li>鱈の西京焼</li> - <li>蒲鉾</li> - <li>牛蒡巻き</li> - <li>干し柿チーズ</li> - <li>黒豆。</li> -</ul> -<figure> - <img src="pics/r4_osechi.jpg" alt="令和4年正月のおせちの画像"> - <figcaption>令和4年正月のおせち</figcaption> -</figure> - -<h2>作り方</h2> -<div class="recipe"> -<h3>慈姑</h3> -<p>おしりを切って皮を剥き出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>百合根</h3> -<p>一枚づつ剥いて出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>鶏そぼろ松風</h3> -<p>鶏1Kg、魚2Kg、出汁3合、醤油70cc、味醂50cc</p> -<p>鶏のミンチを醤油と味醂で炒める。白身魚のすり身を昆布出汁、醤油、味醂で味付けし、炒めた鶏そぼろを加え型に流して蒸す。切り出して天火で乾かすように焼き、煮切り味醂を塗ってケシの実をまぶす。</p> -<p>出典: [平井、結野、日本料理店のお弁当]</p> -</div> - -<div class="recipe"> -<h3>生麩の田楽</h3> -<p>強力粉300g、水150gを捏ねる(水はもう少し多い方がいいかも)。一時間寝かせる。水で揉み洗いして澱粉を流す。白玉粉、水を混ぜて捏ねる。形成して一時間寝かせる。茹でる。浮いてからさらに5分程茹でる。切って味噌を塗り、焼く。</p> -<p>白玉粉と水の分量をメモしていなかった。インターネットで調べたレシピだったはず</p> -</div> - -<div class="recipe"> -<h3>炊き合わせ</h3> -<p>人参、干し椎茸、高野豆腐、竹の子水煮</p> -<p>干し椎茸を戻す。戻した汁で煮て酒、醤油で味付け。高野豆腐を戻す。人参を花型に、竹の子を一口大に切る。それぞれ出汁で煮て醤油、酒で味付け。</p> -</div> - -<div class="recipe"> -<h3>栗金団</h3> -<p>薩摩芋を一口大に切り、砕いたくちなし1個と水少しを入れた鍋で蒸す。裏漉しし、味醂、砂糖、栗のシロップで味付けし、栗を混ぜる。</p> -</div> - -<div class="recipe"> -<h3>数の子</h3> -<p>水で一晩塩を抜いて皮を剥く。</p> -</div> - -<div class="recipe"> -<h3>田作り</h3> -<p>ごまめを乾煎りする。手でボキっと折れるようになるまで。味醂を煮切って醤油を加え、ごまめにからめる。煎り胡麻をまぶす。</p> -</div> - -<div class="recipe"> -<h3>伊達巻</h3> -<p>魚又は海老のすり身と卵黄を混ぜる。卵白に砂糖を入れて泡立てる。以上を混ぜて味醂で味を付ける。卵焼き器を温め油を敷き、卵液を流して蓋をする。裏返して焼き目を付ける。巻き簾で巻く。</p> -</div> - -<div class="recipe"> -<h3>酢蓮根</h3> -<p>蓮根を輪切りにして酢水でゆがく。酢に鷹の爪を入れ、蓮根を浸す。</p> -</div> - -<div class="recipe"> -<h3>たたき牛蒡</h3> -<p>牛蒡を叩いて3cmに切り、縦に4つに割る。ゆがいて酢、醤油、胡麻を混ぜたものに浸す。</p> -</div> - -<div class="recipe"> -<h3>みつわ漬け</h3> -<p>蕪、人参、柚子、昆布を切る。野菜は塩揉みして絞る。酢に漬ける。</p> -</div> - -<div class="recipe"> -<h3>金柑の蜜煮</h3> -<p>金柑に縦に切り込みを入れ、さっと煮る。砂糖を加え煮つめる。</p> -</div> - -<div class="recipe"> -<h3>鱈の西京焼</h3> -<p>西京味噌と味醂を混ぜ、白身魚を漬ける。味噌を拭って焼く。</p> -</div> - -<div class="recipe"> -<h3>干し柿チーズ</h3> -<p>干し柿を縦に切り、クリームチーズ、胡桃を包むように巻く。柿を干しすぎていたため固くて食べにくかった。</p> -</div> - -<div class="recipe"> -<h3>黒豆</h3> -<p>豆を鉄と共に一晩水に浸ける。6時間程煮る。砂糖で味付けしさらに10分煮る。冷して味を染み込ませる。</p> -</div> - -<p>蒲鉾、牛蒡巻は既製品</p> - -<h3>おわりに</h3> -<p>伊達巻は妹が、みつわ漬けは母が作ってくれた。蒲鉾と牛蒡巻きは買ってきた。それ以外は自分で作った。この他、蒟蒻を買っていたが存在を忘れていたのと、棒鱈を水で戻していたが腐ってしまったことが心残りである。買ってきた蒲鉾と牛蒡巻き、それから作れなかった蒟蒻の煮物と棒鱈を作るのが今年の年末の課題である。蒲鉾や牛蒡巻きは保存料や着色料等の添加物が気になる所だ。</p> -<p>今時は百貨店やらでおせちを予約して年末はだらだら過ごし、年始もそのおせちを食べながら家でテレビ漬けが普通なのだろうか。買って来たおせちには旬という概念が欠けており、さらに保存料で日持ちさせている。本来そのとき手に入る旬のものを使い、3ヵ日常温で保存できるように砂糖、酢、塩、発酵等の力を利用したものであったはずだ。今回作ったおせちも食材は基本スーパーで入手した。少しずつ自分の畑で取れたものを取り入れたいものである。</p> -<p>おせち料理は、家族や近所、あるいは寺であれば檀家との付き合いにより成り立っていたのではないだろうか。その付き合いに充てる時間と気力を労働に回し、その労働により得られたお金でできあいのおせちを購入するのは、家族や地域社会の分断であり、また文化の破壊でもある。購入するお金を稼ぐのを辞め、自分達で作ったほうが人付き合いも増え、地域に根差した文化の継承にもなり、より充実した生き方に繋るのではないだろうか。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/kitchen/recipe/mapo_tofu.html b/pub/kitchen/recipe/mapo_tofu.html @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>麻婆豆腐</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>麻婆豆腐</h1> -<time>2024-10-10</time>作成 -<figure> - <img src="../pics/mapo_tofu.jpg" alt="麻婆豆腐の画像"> - <figcaption>麻婆豆腐</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豆腐: 2丁</li> - <li>ひき肉: 300g</li> - <li>長ネギ: 1本</li> - <li>にんにく: 適量</li> - <li>生姜: 適量</li> - <li>八角: 適量</li> - <li>花椒: 好きなだけ</li> - <li>豆板醤: 好きなだけ</li> - <li>味噌: 適量</li> - <li>酒: 適量</li> - <li>濃口醤油: 適量</li> - <li>塩: 少々</li> - <li>炒め油: 多め</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>豆腐を水切りしてサイコロに切る</li> - <li>長ネギ、にんにく、生姜を刻む</li> - <li>フライパンに油をしき八角、にんにく、生姜を入れ弱火で香りを出す</li> - <li>火を強めてひき肉を入れ、塩を少しふる</li> - <li>ひき肉に色がついたらネギを入れて炒める</li> - <li>酒、濃口醤油、味噌、豆板醤で味をつける</li> - <li>水を入れてひと煮立ちさせる</li> - <li>花椒、豆腐を入れる</li> - <li>好みで、ラー油、唐辛子、山椒を好きなだけ入れる</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>我流の適当なレシピなので本場のものが良ければ陳建一さんのでも調べてほしい。</p> -<p>酒はできれば紹興酒のほうがいいと思う。味噌と一緒に豆鼓も入れていいかも。一般的にはもっと旨味を出すために中華だしやら味の素やらを入れると思うが、シンプルに辛いほうが好きなのでそういうものは入れない。陳さんは生姜を入れていなかったが僕はあっていいと思う。豆腐は塩水で茹でていたがこれは真似してもよさそう。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/kitchen/recipe/miso.html b/pub/kitchen/recipe/miso.html @@ -1,61 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>味噌</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>味噌</h1> -<time>2024-02-09</time> - -<h2>材料</h2> -<p>二升の甕4つ分弱</p> -<ul> -<li>大豆 3.6kg</li> -<li>米麹 5kg</li> -<li>塩 1.8kg</li> -<li>酒粕 500g</li> -</ul> - -<h2>手順</h2> -<ol> -<li>大豆を24時間水に浸す</li> -<li>麹と塩を混ぜる</li> -<li>大豆を3時間蒸す</li> -<li>大豆を潰す</li> -<li>大豆を麹と混ぜる(蒸したときの汁を混ぜて硬さを調整する)</li> -<li>甕に詰める</li> -<li>酒粕で蓋をしてさらにラップで落し蓋をして密閉する。</li> -<li>半年以上寝かす</li> -</ol> - -<h2>ひとこと</h2> -<p> -豆はジップロックに入れて拳に体重を乗せて押しつぶすと楽だった。ジップロックあんまり使いたくないけど。ラップで蓋をするのは好きではないので、試験的にひと瓷だけラップなしで放置することにした。酒粕も味噌っぽくなって食べられるが、風味は少し変わる。味噌汁が粕汁っぽくなる。</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/kitchen/recipe/tonkotsu_ramen.html b/pub/kitchen/recipe/tonkotsu_ramen.html @@ -1,82 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>豚骨ラーメン</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>豚骨ラーメン</h1> -<time>2022-02-08</time>作成 -<figure> - <img src="../pics/tonkotsu_ramen.jpg" alt="豚骨ラーメンの画像"> - <figcaption>豚骨ラーメン</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豚骨: 1本</li> - <li>鶏ガラ: 1個</li> - <li>玉葱: 1個</li> - <li>野菜くず(人参のへた、葱の頭、キャベツの芯等): 適量</li> - <li>大蒜: 1房</li> - <li>生姜: 1かけ</li> - <li>昆布: 適量</li> - <li>干し椎茸: 適量</li> - <li>豚肩ロースブロック: 500g</li> - <li>長葱: 適量</li> - <li>細葱: 適量</li> - <li>もやし: 適量</li> - <li>卵: 人数分</li> - <li>支那竹: 適量</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>昆布、干し椎茸は水にかして30分以上置く。</li> - <li>豚骨を半分に割り、鶏ガラ、水と共に鍋に入れ2回ほど茹でこぼして臭みを取る。</li> - <li>豚骨、鶏ガラ、玉葱、野菜くず、大蒜、生姜、昆布、水を鍋に入れ火にかける。沸騰したら弱火にする(ただしコッテリさせる場合は強火のまま)。適宜アクを取る。水が減ってきたら足す。</li> - <li>豚肩ロースに凧糸を巻き、強火で表面を焼く。3に入れて一緒に煮込む。2時間程で野菜と肩ロースを取り出す。</li> - <li>1を水ごと弱火にかける。</li> - <li>沸騰したら昆布と干し椎茸を取り出し、味醂、酒、塩、醤油で味を付ける。この時塩分濃度が醤油と同じくらいになるようにする。</li> - <li>肩ロースを6に漬けて冷ます。冷めたら密閉できる袋に入れて空気を抜き、冷蔵庫で一晩味を染み込ませる。味玉を作る場合、茹で卵も一緒に入れて一晩置く。</li> - <li>4は6時間煮込んだらザルで漉して粗熱を取り、冷蔵庫で保存する。鶏ガラについていた肉はからし醤油で食べると美味しい。</li> - <li>7を火にかける(表面に脂が浮いて固まっているのであっさりしたスープがいい場合は加熱前に取り除く。脂はラードとして焼き飯等に使うと美味しい)。</li> - <li>具材を準備する。卵を茹でて半分に切る。長葱を白髪葱にする。細葱を刻む。肩ロースを薄く切る。もやしをゆがく。</li> - <li>麺を茹でる。</li> - <li>丼を温め7を適量入れ、9で割る。濃さは好みで調整する。</li> - <li>麺と具材を載せる。</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>焼豚は煮込み過ぎると柔らかくなりすぎてくずれる。</p> -<p>今回は麺と支那竹は市販品だった。製麺機ほしい</p> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/pics/favicon.ico b/pub/pics/favicon.ico Binary files differ. diff --git a/pub/pics/icon.jpeg b/pub/pics/icon.jpeg Binary files differ. diff --git a/pub/pics/xcoin.png b/pub/pics/xcoin.png Binary files differ. diff --git a/pub/pics/xcoin_logo.png b/pub/pics/xcoin_logo.png Binary files differ. diff --git a/pub/plant/index.html b/pub/plant/index.html @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>庭の植物</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>庭の植物</h1> - -素人同定 - -<ul class="galind"> -<li> -タネツケバナ <i>Cardamine occulta</i> -<img src="pics/cardamine_occulta.png" alt="タネツケバナの画像"> -</li> -<li> -ホトケノザ <i>Lamium amplexicaule</i> -<img src="pics/lamium_amplexicaule.png" alt="ホトケノザの画像"> -</li> -<li> -キュウリグサ <i>Trigonotis peduncularis</i> -<img src="pics/trigonotis_peduncularis.png" alt="キュウリグサの画像"> -</li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/plant/pics/cardamine_occulta.png b/pub/plant/pics/cardamine_occulta.png Binary files differ. diff --git a/pub/plant/pics/lamium_amplexicaule.png b/pub/plant/pics/lamium_amplexicaule.png Binary files differ. diff --git a/pub/plant/pics/trigonotis_peduncularis.png b/pub/plant/pics/trigonotis_peduncularis.png Binary files differ. diff --git a/pub/poetry/index.html b/pub/poetry/index.html @@ -1,48 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title>詩</title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article> -<h1>詩</h1> -<ul> - <li>猫を抱く、大島に穴。[<time>2025-04-07</time>]</li> - <li>「醤油を醸すのもA. Oryzaeやっけ?」「そーやと思うで。」[<time>2025-03-15</time>]</li> - <li>乃木坂46、有坂38[<time>2024-12-09</time>]</li> - <li>えびの殻は捨てずにキチンと出汁を引こう。[<time>2023-06-21</time>]</li> - <li>風が吹いた。どっちから?こっち。[<time>2023-02-28</time>]</li> - <li>日本語警察「誤用だー!」[<time>2023-02-28</time>]</li> - <li>分け入っても 分け入っても ピンクのテープ [<time>2022-10-09</time>]</li> - <li>干しぬれど カビの生えたる つるし柿 [<time>2022-10-07</time>]</li> - <li>そうだ、出汁を引こう。 [<time>2022-01-07</time>]</li> - <li>鼻めっちゃでる。びえん。 [<time>2021-11-04</time>]</li> - <li>縄作りなう [<time>2021-05-25</time>]</li> -</ul> - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/pub/rss.xml b/pub/rss.xml @@ -1,7070 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<rss version="2.0"> -<channel> -<title>松露庵</title> -<description>ウェブページの更新履歴</description> -<language>ja-jp</language> -<link>https://www.mtkn.jp</link> -<lastBuildDate>Sat, 20 Dec 2025 11:47:06 +0900</lastBuildDate> -<pubDate>Sat, 20 Dec 2025 11:47:06 +0900</pubDate> -<docs>https://www.rssboard.org/rss-specification</docs> -<item> -<title>X11で深さが32bitのwindowを作成する</title> -<link>https://www.mtkn.jp/computer/x11_32bit_window.html</link> -<guid>https://www.mtkn.jp/computer/x11_32bit_window.html</guid> -<pubDate>Sat, 20 Dec 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>X11で深さが32bitのwindowを作成する</h1> -<time>2025-12-20</time> - -<h2>結論</h2> -<p> -X11のrender拡張機能で半透明な画像を合成(composite)する際に深さが32bitのウィンドウを作成する必要がある。その際ドキュメントにも書いてなさそうな操作が必要だった。ウィンドウを作成する際に<code>border pixel</code>の値を設定する必要がある(言語はC): -</p> - -<pre><code>// Xlibの場合 -XSetWindowAttributes attr32 = { - .border_pixel = 0, // 値はなんでもよさそう - .colormap = colormap32, -} -Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, // depth - InputOutput, - visual32, - CWBorderPixel|CWColormap, // CWBorderPixelを指定 - &amp;attr32); -</code></pre> - -<pre><code>// xcbの場合 -uint32_t attr32[2] = { 0, colormap32 }; // 値はなんでもよさそう。 -xcb_create_window(conn, 32, window32, screen-&gt;root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, // XCB_CW_BORDER_PIXELを指定 - &amp;attr32); -</code></pre> - -<h2>出典</h2> -<p> -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>に、 -</p> -<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 - // http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32 -</code></pre> -</blockquote> -<p> -と書いていた。引用元を見るとXサーバーのソースコードを参照しており、そのコードでは親のウィンドウの深さと異なる深さのウィンドウを作成する場合、<code>CWBorderPixmap</code>又は<code>CWBorderPixel</code>を指定しないと<code>BadMatch</code>というエラーが返ってくるようになっている。理由はよく分からない: -</p> -<blockquote cite="https://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c?h=xorg-server-21.1.21#n818"> -<pre><code> if (((vmask &amp; (CWBorderPixmap | CWBorderPixel)) == 0) &amp;&amp; - (class != InputOnly) &amp;&amp; (depth != pParent-&gt;drawable.depth)) { - *error = BadMatch; - return NullWindow; - } -</code></pre> -</blockquote> - -<h2>深さ32bitのウィンドウの作成手順</h2> -<h3>深さ32bitのヴィジュアルを取得</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのヴィジュアルを取得する: -</p> -<pre><code>// xlibの場合 -int findVisual32(Display *display, XVisualInfo *return_visual_info); -/* ... */ -int main(void) { - /* ... */ - XVisualInfo vi32; - if (findVisual32(display, &amp;vi32) &lt; 0) { - fatal(&quot;32bit-deep visual info not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(Display *display, XVisualInfo *return_visual_info) { - long mask = VisualDepthMask|VisualRedMaskMask|VisualGreenMaskMask|VisualBlueMaskMask; - XVisualInfo template = { - .depth = 32, - .red_mask = 0xff0000, - .green_mask = 0x00ff00, - .blue_mask = 0x0000ff, - }; - int n; - XVisualInfo *vinfos = XGetVisualInfo(display, mask, &amp;template, &amp;n); - if (n == 0) { - return -1; - } - *return_visual_info = vinfos[0]; - XFree(vinfos); - return 0; -} -</pre></code> - -<pre><code>// xcbの場合 -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype); -/* ... */ -int main(void) { - /* ... */ - xcb_visualtype_t visual32; - if (findVisual32(screen, &amp;visual32) &lt; 0) { - fatal(&quot;32bit visual not found&quot;); - } - /* ... */ -} -/* ... */ -int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) { - xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen); - for (;depth_iter.rem &gt; 0; xcb_depth_next(&amp;depth_iter)) { - xcb_depth_t *d = depth_iter.data; - if (d-&gt;depth != 32) { - continue; - } - xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d); - while (visual_iter.rem &gt; 0) { - xcb_visualtype_t *v = visual_iter.data; - if (v-&gt;red_mask == 0xff0000 &amp;&amp; v-&gt;green_mask == 0x00ff00 &amp;&amp; v-&gt;blue_mask == 0x0000ff) { - *return_visualtype = *v; - return 0; - } - xcb_visualtype_next(&amp;visual_iter); - } - } - return -1; -} -</code></pre> - -<h3>深さ32bitのカラーマップを作成</h3> -<p>ウィンドウ作成の関数(<code>XCreateWindow</code>または<code>xcb_create_window</code>)に渡す32bitのカラーマップを作成する。 -</p> -<pre><code>// xlibの場合 - Colormap colormap32 = XCreateColormap(display, DefaultRootWindow(display), vi32.visual, AllocNone); -</code></pre> -<pre><code>// xcbの場合 - xcb_colormap_t colormap32 = xcb_generate_id(conn); - xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen-&gt;root, visual32.visual_id); -</code></pre> - -<h3>深さ32bitのウィンドウを作成</h3> -<p>最後にウィンドウを作成する:</p> -<pre><code>// xlibの場合 - Window window32 = XCreateWindow(display, DefaultRootWindow(display), - 0, 0, 1, 1, 0, - 32, - InputOutput, - vi32.visual, - CWBorderPixel|CWColormap, - &attr32); -</code></pre> -<pre><code>// xcbの場合 - uint32_t attr32[2] = { 0, colormap32 }; - xcb_create_window(conn, 32, window32, screen->root, - 0, 0, 1, 1, 0, - XCB_WINDOW_CLASS_INPUT_OUTPUT, - visual32.visual_id, - XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32); -</code></pre> - -<h2>サンプルコード</h2> -32bitのウィンドウを作成し、そこからrender拡張機能を使って半透明な四角形を描画するプログラムを作った。OpenBSDで動作確認した。他のUnixでも多分動くと思う:<br> -<a href="https://git.mtkn.jp/win32">git.mtkn.jp/win32</a> - -<h2>参考文献</h2> -<ol> -<li><a href="https://azelpg.gitlab.io/azsky2/note/prog/x11/03_visual.html">X11: ビジュアル</a></li> -</ol> -]]></description> -</item> -<item> -<title>9P</title> -<link>https://www.mtkn.jp/computer/9p.html</link> -<guid>https://www.mtkn.jp/computer/9p.html</guid> -<pubDate>Fri, 19 Dec 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>9P</h1> -<time>2024-12-19</time> -<h2>はじめに</h2> -<p> -9Pはコンピュータ上の色々なものをファイルとして扱うためのプロトコルである。このプロトコルを使えば、ディスクに記録されたデータだけでなく、マウスやキーボードといった入力機器や、ネットワーク、プロセスの情報等もファイルとして扱える。Unixの後継OSとして米AT&Tのベル研究所で開発されたPlan9というOSのために設計された。 -</p> - -<p> -Plan9というOSはネットワークを介して複数のコンピュータを繋いで使うように設計されているので、この9Pもローカルだけでなくネットワーク越しに使うことを前提にしている。</p> - -<h2>プロトコルの概要</h2> -<p> -9Pの通信ではクライアントがサーバーに対してリクエストを送り、サーバーがそれに対してリプライを返すことを繰り返す。クライアントからのリクエストをTメッセージ、サーバーからのリプライをRメッセージと言う。Tメッセージにはファイルにアクセスするための色々なものが用意されている。例えばファイルを開くためのTopenや、開いたファイルに書き込むためのTwrite等である。それぞれのTメッセージには対応するRメッセージがある。Topenに対してRopen、Twriteに対してRwrite等である。</p> -<p> -通信は必要な情報をプロトコルの定める方法でバイト列に変換して行う。2バイト以上のデータはリトルエンディアンになるように配置する。テキストデータはUTF-8にエンコードする。テキストデータは長さの情報も一緒に送るので最後のヌル文字は含めない。</p> -<p> -各メッセージは4バイトの整数から始まる。これは、この4バイトを含むメッセージの長さをバイト単位で示したものである。次にメッセージの種類を記述する1バイトのデータが来る。次はメッセージのタグである。クライアントはサーバーからの返事を待たずに別のメッセージを送れるので、サーバーからのRメッセージがどのTメッセージに対する返事なのかを識別する必要がある。そのために使うのがタグである。クライアントがTメッセージを送る際にタグを付け、サーバーはそれに対するRメッセージに同じタグを付ける。その後ろには、メッセージの種類によって固有の情報が付けられる。</p> -<p> -以下は実際の9P通信のログである。実際はバイナリの通信だが、ログとして見易いように変換してある。また、先頭にくるメッセージサイズは省略してある。この例では、サーバーのルートディレクトリにある<code>hello</code>というファイルの内容を読みこんでいる:</p> -<pre><code>&lt;-- Tversion Tag 65535 msize 8192 version '9P2000' ---&gt; Rversion Tag 65535 msize 8192 version '9P2000' -&lt;-- Tattach Tag 0 fid 0 afid -1 uname kenji aname ---&gt; Rattach Tag 0 qid (0000000000000000 0 d) -&lt;-- Twalk Tag 0 fid 0 newfid 1 nwname 1 0:hello ---&gt; Rwalk Tag 0 nwqid 1 0:(0000000000000001 0 ) -&lt;-- Tstat Tag 0 fid 1 ---&gt; Rstat Tag 0 stat 'hello' 'kenji' 'kenji' '' q (0000000000000001 0 ) m 0644 at 1730004808 mt 1730004808 l 7 t 0 d 0 -&lt;-- Twalk Tag 0 fid 1 newfid 2 nwname 0 ---&gt; Rwalk Tag 0 nwqid 0 -&lt;-- Topen Tag 0 fid 2 mode 0x0 ---&gt; Ropen Tag 0 qid (0000000000000001 0 ) iounit 8169 -&lt;-- Tread Tag 0 fid 2 offset 0 count 4096 ---&gt; Rread Tag 0 count 7 ' 776f726c 64210a' -&lt;-- Tread Tag 0 fid 2 offset 7 count 4096 ---&gt; Rread Tag 0 count 0 '' -&lt;-- Tclunk Tag 0 fid 2 ---&gt; Rclunk Tag 0 -</code></pre> -<p> -まず最初にクライアントがサーバーに対してTversionを送り、プロトコルのバージョンと、メッセージの最大サイズを交渉する。Tversionのタグは<code>65535</code>と決められている。<code>msize</code>の8192はメッセージの最大サイズ(バイト)で、<code>version</code>の9P2000がプロトコルのバージョンである。サーバーからRversionで同じ<code>msize</code>と<code>version</code>が返ってきたのでこのサイズとバージョンで以降の通信を行う。</p> -<p> -次のTattachで、クライアントがサーバーにルートディレクトリの<code>fid</code>を要求する。<code>afid</code>以降は認証用の情報である(後述)。<code>fid</code>はコネクションにおいてファイルと紐付けられる整数で、Unixにおけるファイルディスクリプタのようなものである。ファイルの読み書きはこの<code>fid</code>を使って行われる。サーバーからのRattachにはルートディレクトリの<code>qid</code>が含まれる。これはサーバー上でファイルを一意に識別するもので、Unixにおけるinodeに相当するものである。以上でサーバーに繋いでセッションを確立できた。</p> -<p> -次にTwalkで目的のファイル(<code>hello</code>)までファイルツリーを辿る。ここでは起点として先程得られたルートディレクトリ(<code>fid = 1</code>)を起点として、このディレクトリ内の<code>hello</code>ファイルを要求して<code>fid = 2</code>を割り当てようとしている。サーバーはルートディレクトリ内に要求されたファイルが見付かったので、そのファイルの<code>qid</code>を返す。</p> -<p> -目的のファイルに<code>fid</code>が割り当てられたので、Tstatでこのファイルの属性を要求している。おそらくファイルのパーミッションを調べるためである。</p> -<p> -次にTopenを使ってこのファイルを開き、Treadを使って内容を読む。二回目のTreadに対して0バイトのデータが返ってきたので、ファイルはこれで終りである。</p> -<p> -最後に、必要なくなった<code>fid</code>はTclunkで捨てる。</p> - -<h2>List of all Message Types</h2> - -<table> -<tr> -<th>Tメッセージ</th> -<th>Rメッセージ</th> -<th>説明</th> -</tr> -<tr> -<td>Tversion</td> -<td>Rversion</td> -<td>バージョンの交渉</td> -</tr> -<tr> -<td>Tauth</td> -<td>Rauth</td> -<td>認証ファイルの取得</td> -</tr> -<tr> -<td></td> -<td>Rerror</td> -<td>エラー(Rメッセージのみ)</td> -</tr> -<tr> -<td>Tflush</td> -<td>Rflush</td> -<td>処理中のリクエストをキャンセル</td> -</tr> -<tr> -<td>Tattach</td> -<td>Rattach</td> -<td>ルートディレクトリの取得</td> -</tr> -<tr> -<td>Twalk</td> -<td>Rwalk</td> -<td>ファイルツリーを辿る</td> -</tr> -<tr> -<td>Topen</td> -<td>Ropen</td> -<td>ファイルを開く</td> -</tr> -<tr> -<td>Tcreate</td> -<td>Rcreate</td> -<td>ファイルの作成</td> -</tr> -<tr> -<td>Tread</td> -<td>Rread</td> -<td>ファイルを読む</td> -</tr> -<tr> -<td>Twrite</td> -<td>Rwrite</td> -<td>ファイルへ書き込む</td> -</tr> -<tr> -<td>Tclunk</td> -<td>Rclunk</td> -<td>fidの削除</td> -</tr> -<tr> -<td>Tremove</td> -<td>Rremove</td> -<td>ファイルを削除</td> -</tr> -<tr> -<td>Tstat</td> -<td>Rstat</td> -<td>ファイルの属性を取得</td> -</tr> -<tr> -<td>Twstat</td> -<td>Rwstat</td> -<td>ファイルの属性を変更</td> -</tr> -</table> - -<h2><code>fid</code>と<code>qid</code></h2> -<p> -<code>fid</code>はコネクションにおいてファイルを指定するために使われる整数で、Unixのファイルディスクリプタのようなものである。使用する整数はクライアントが指定できる。サーバーに接続する際にTattachにより、サーバーのルートディレクトリの<code>fid</code>が設定され、Twalkにより追加され、Tclunkにより削除される。</p> -<p> -<code>qid</code>はサーバーがファイルを一意に識別するためのもので、Unixのinodeに相当するものである。ただしinodeはファイルが削除されると再利用される可能性があるのに対し、<code>qid</code>は再利用できない。<code>qid</code>はこのファイルがディレクトリかどうか等を示す<code>type</code>、ファイルが変更されたときにインクリメントされる<code>vers</code>、そしてファイルを一意に表す<code>path</code>の3つの情報で構成される。</p> -<h2>認証</h2> -<p> -9Pにはクライアントの認証が組込まれていない。もともとはあったようだが、認証のアルゴリズムに欠陥が見付かったりすればいちいちコードを修正してコンパイルしなおさなければいけないうえ、9Pプロトコル自体も変更しないといけないので、外部に切りだすことになった。認証に必要なやりとりは認証サーバーとクライアントが行い、9Pサーバーは認証が成功したかどうかの情報を認証サーバーに確認することでクライアントの確認を行う。 -</p> -<p> -9PサーバーはTattachメッセージを受けとると、認証サーバーとのコネクションを確立する。その後Rattachメッセージで<code>afid</code>という特殊な<code>fid</code>をクライアントに返す。クライアントからこの<code>afid</code>に対して読み書きする命令が届くと、9Pサーバーはこの読み書きを認証サーバーとのコネクションに横流しする。つまりクライアントはこの<code>afid</code>を通じて認証サーバーと直接やりとりができる。クライアントはユーザー名やパスワード等(パスワード認証の場合)の情報を<code>afid</code>に書き込んで認証する。このように認証をプロトコル自体から切り離すことで、認証に関するバグが見付かったとしても、認証サーバーを修正するだけでいい。また、より強力な認証システムを組み込むのも楽である。 -</p> - -<h2>コネクションの共有</h2> -<p> -クライアントはサーバーと<code>version</code>メッセージを交すことでコネクションを確立する。コネクションの確立からの一連のやりとりをセッションという。ひとつのコネクションは複数のクライアントが共有できる。</p> -<p> -クライアントはTauthまたはTattachメッセージによりサーバーに<code>fid</code>を要求できる。このうちTauthにより得られた<code>fid</code>は認証以外には使えない。Tattachで得られた<code>fid</code>は、Twalkメッセージによりファイルツリーを辿るための起点として利用でき、このとき辿った先のファイルを示す<code>fid</code>が生成される。これ以外の方法で<code>fid</code>が増えることはない。つまり、サーバーはひとつのコネクションのなかで、ルートディレクトリから派生した<code>fid</code>を追跡することで、クライアントを区別できる。</p> - -<h2>メッセージ詳細</h2> -<p> -それぞれ最初にメッセージの形式を書く。<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が来る。 -</p> -<h3>version</h3> -<p> -プロトコルのバージョンを交渉すし、コネクションを確立する。 -</p> -<pre><code>size[4] Tversion tag[2] msize[4] version[s] -size[4] Rversion tag[2] msize[4] version[s] -</code></pre> -<p> -クライアントは最初にサーバーにこのメッセージを送ってバージョンとメッセージの最大サイズ(<code>msize</code>)を交渉する。サーバーはクライアントから送られたバージョンとメッセージサイズに対応していれば、同じバージョンとサイズを送り返し、交渉成立である。</p> -<p> -サーバーとクライアントはこのメッセージを以ってコネクションを確立する。</p> - -<h3>attach、auth</h3> -<p> -コネクションを確立する。 -</p> -<pre><code>size[4] Tauth tag[2] afid[4] uname[s] aname[s] -size[4] Rauth tag[2] aqid[13] - -size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] -size[4] Rattach tag[2] qid[13] -</code></pre> -<p> -<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> -<p> -<code>auth</code>メッセージは認証サーバーとやりとりするための<code>fid</code>である<code>afid</code>を要求する。この<code>afid</code>を読み書きすることで認証サーバーとやりとりをし、自身の身分を証明する。認証が済んだらこの<code>afid</code>をセットした<code>attach</code>メッセージを送る。</p> - -<h3>error</h3> -<p> -エラーを返す。 -</p> -<pre><code>size[4] Rerror tag[2] ename[s] -</code></pre> -<p> -クライアントからの要求に対して、なにかエラーがおきたときにそのエラーを返すために使われる。<code>Terror</code>はない。</p> - -<h3>flush</h3> -<p> -リクエストをキャンセルする。 -</p> -<pre><code>size[4] Tflush tag[2] oldtag[2] -size[4] Rflush tag[2] -</code></pre> -<p> -実行中の要求をキャンセルする。キャンセルしたいリクエストの<code>tag</code>を<code>oldtag</code>にセットする。 -</p> - -<h3>walk</h3> -<p> -ファイルツリーを移動する。 -</p> -<pre><code>size[4] Twalk tag[2] fid[4] newfid[4] nwname[2] nwname*(wname[s]) -size[4] Rwalk tag[2] nwqid[2] nwqid*(qid[13]) -</code></pre> -<p> -<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> -<p> -<code>wname</code>の最初の要素への移動が失敗した場合は<code>Rerror</code>が返される。それ以外の場合は<code>Rwalk</code>が返され、<code>qid</code>は移動が成功した順番にそのファイルの<code>qid</code>がセットされる。<code>nwname</code>と<code>nwqid</code>が一致した場合は最後まで移動できたことになる。</p> -<p> -<code>walk</code>は<code>fid</code>を増殖させる唯一の方法である。</p> - -<h3>open、create</h3> -<p> -<code>fid</code>を開いて(作成して)読み書きできる状態にする。 -</p> -<pre><code>size[4] Topen tag[2] fid[4] mode[1] -size[4] Ropen tag[2] qid[13] iounit[4] - -size[4] Tcreate tag[2] fid[4] name[s] perm[4] mode[1] -size[4] Rcreate tag[2] qid[13] iounit[4] -</code></pre> -<p> -<code>open</code>は<code>fid</code>と紐付いたファイルを開く。<code>mode</code>は読み込み専用の<code>OREAD</code>、書き込み専用の<code>OWRITE</code>、読み書きの<code>ORDWR</code>等である。ファイルを開く手順は以下の通り: -<ol> -<li><code>attach</code>でルートディレクトリの<code>fid</code>を取得</li> -<li>ルートディレクトリの<code>fid</code>から<code>walk</code>で開きたいファイルの<code>fid</code>を取得</li> -<li>その<code>fid</code>を<code>open</code>で開く</li> -</ol> -</p> -<p> -<code>create</code>は<code>fid</code>と紐付いたディレクトリに新しいファイルを作成する。<code>creat</code>ではなく<code>create</code>である。作成が成功したら<code>fid</code>は新しく作成されたファイルに紐付く。</p> - -<h3>read、write</h3> -<p> -ファイルを読み書きする。 -</p> -<pre><code>size[4] Tread tag[2] fid[4] offset[8] count[4] -size[4] Rread tag[2] count[4] data[count] - -size[4] Twrite tag[2] fid[4] offset[8] count[4] data[count] -size[4] Rwrite tag[2] count[4] -</code></pre> -<p> -<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> - -<h3>clunk</h3> -<p> -<code>fid</code>を忘れる。 -</p> -<pre><code>size[4] Tclunk tag[2] fid[4] -size[4] Rclunk tag[2] -</code></pre> -<p> -いらなくなった<code>fid</code>を忘れる。一度忘れた<code>fid</code>は<code>walk</code>で別のファイルを取得する際に再利用できる。</p> - -<h3>remove</h3> -<p> -ファイルを削除する。 -</p> -<pre><code>size[4] Tremove tag[2] fid[4] -size[4] Rremove tag[2] -</code></pre> -<p> -<code>fid</code>と紐付いたサーバー上のファイルを削除する。<code>fid</code>は<code>clunk</code>したのと同様に忘れられる。</p> - -<h3>stat、wstat</h3> -<p> -ファイルの属性を読み書きする。 -</p> -<pre><code>size[4] Tstat tag[2] fid[4] -size[4] Rstat tag[2] stat[n] - -size[4] Twstat tag[2] fid[4] stat[n] -size[4] Rwstat tag[2] -</code></pre> -<p> -<code>stat</code>はファイルの属性を読む。読めた情報は<code>stat</code>として返される。<code>wstat</code>はファイルの属性を<code>stat</code>に変更する。<code>stat</code>はファイルの名前や<code>qid</code>、サイズ、作成日、更新日等の情報がバイト列になったものである。</p> - -]]></description> -</item> -<item> -<title>きのかわ弦楽合奏団 第5回コミュニティコンサート</title> -<link>https://www.mtkn.jp/journal/posts/20241211.html</link> -<guid>https://www.mtkn.jp/journal/posts/20241211.html</guid> -<pubDate>Thu, 11 Dec 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>きのかわ弦楽合奏団 第5回コミュニティコンサート</h1> -<time>2024-12-11</time> -<p>来年の一月にコンサートあります。</p> -<figure> -<img src="20241211.jpg" alt="きのかわ弦楽合奏団の第5回コミュニティコンサートのちらし。令和7年1月12日14:00から、和歌山北コミュニティセンターにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - -]]></description> -</item> -<item> -<title>椅子作った</title> -<link>https://www.mtkn.jp/journal/posts/20241202.html</link> -<guid>https://www.mtkn.jp/journal/posts/20241202.html</guid> -<pubDate>Tue, 2 Dec 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>椅子作った</h1> -<time>2024-12-02</time> - -<p> -チェロを弾くのに使っていた椅子ががたがたになってきたので、新しい椅子を作った。座面の張り方はYouTubeの動画[1]を参考にした。</p> -<p> -まず木枠を作る。足にホゾ穴を彫って梁を差し込む形にした。「そぎ先枘接ぎ」という名前らしい[2]。</p> -<img src="20241202-1.jpg" alt="木枠の画像"> - -<p> -足は猫足にした。ボンドで接着してバネを受ける板を付ける。本当は膠にしたかったけどめんどくさくなった。</p> -<img src="20241202-2.jpg" alt="ボンドで固定した木枠の画像"> - -<p> -バネを又釘で固定。 -</p> -<img src="20241202-3.jpg" alt="バネを木枠に釘で固定した画像"> -<img src="20241202-4.jpg" alt="固定した部分を拡大した画像"> - -<p> -ずれないように麻紐でくくり麻布を被せる。さらに麻布にバネを縫い付ける。</p> -<img src="20241202-5.jpg" alt="バネを麻紐でくくった画像"> -<img src="20241202-6.jpg" alt="バネを麻布で覆った画像"> -<img src="20241202-7.jpg" alt="麻布を固定した部分の拡大画像"> -<img src="20241202-8.jpg" alt="バネを麻布に縫い付けた画像"> - -<p> -藁で土手を作る。この藁はチェロの先生に貰ったものである。晒で覆ったうえ、糸で縫って固める。 -</p> -<img src="20241202-9.jpg" alt="藁の土手の画像"> -<img src="20241202-10.jpg" alt="藁の土手を糸で縫った画像"> -<img src="20241202-11.jpg" alt="縫った部分の拡大画像"> - -<p> -棕櫚を盛って布で覆い、綿を被せてモケットで仕上げる。本来は棕櫚ではなく芝であるが手に入らなかった。棕櫚の産地に住んでいるのでこちらなら山にいくらでも生えている。モケットは高野口町で買った。この町は鉄道のシートも作っているらしい。283系や287系、あるいはN700系等のものが欲しかったがJRに怒られるからと断わられた。そらそうや。</p> -<img src="20241202-12.jpg" alt="棕櫚を盛って布で覆った画像"> -<img src="20241202-13.jpg" alt="布の上から綿を被せた画像"> - -<p> -完成。 -</p> -<img src="20241202-14.jpg" alt="モケットを被せて完成した椅子の画像"> - -<p> -椅子が良くなっても練習しないと腕は上がらない。 -</p> - -<h2>参考</h2> -<ol> -<li><a href="https://www.youtube.com/watch?v=15SjxP-wcek">TOKYO 匠の技(椅子張り 熟練技能編)</a></li> -<li>鳥海義之助 「図解 木工の継手と仕口 増補版」 p.37</li> -</ol> -]]></description> -</item> -<item> -<title>ひざしぶりに合気道した</title> -<link>https://www.mtkn.jp/journal/posts/20251122.html</link> -<guid>https://www.mtkn.jp/journal/posts/20251122.html</guid> -<pubDate>Sun, 30 Nov 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>ひざしぶりに合気道した</h1> -<time>2025-11-22</time> - -<p> -大学の合気道部のひとつ下の後輩に誘われて学園祭の演武会に参加してきた。</p> -<figure> - <video controls style="max-width: 100%;"> - <source src="20251122.mp4" type="video/mp4"> - </video> - <figcaption>京都大学合気道部 NF演武会にて(右が僕)</figcaption> -</figure> - -<p> -もうちょっとやりたくなったので高校生のときお世話になっていた地元の道場に電話して稽古させてもらうことにした。続くかな。 -</p> -]]></description> -</item> -<item> -<title>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</title> -<link>https://www.mtkn.jp/computer/mailserver.html</link> -<guid>https://www.mtkn.jp/computer/mailserver.html</guid> -<pubDate>Mon, 3 Nov 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1> -<time>2024-01-19</time><br> -<time>2025-11-03</time> <code>HELO</code>コマンドで表示されるドメイン名を変更<br> - -<h2>はじめに</h2> -<p> -少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。当時はドキュメントを追うのに必死で構築手順を整理できていなかった。しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。そこであらためてサーバーを構築し、その手順を確認することにした。あいかわらずDNSの知識は自信がない。セキュリティは自己責任で。</p> - -<h2>使うもの</h2> -<ul> -<li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> -<li>OS: OpenBSD 7.4</li> -<li>ドメイン: ムームードメイン (mtkn.jpとする)</li> -<li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> -<li>IMAPサーバー(MDA): Dovecot 2.3.20</li> -</ul> - -<h2>メールの仕組み</h2> -<p> -メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのがSMTPサーバーと呼ばれるソフトウェアである。このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも呼ばれる。今回はMTAとしてOpenSMTPDというのを使う。手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、そこから受信側のMTAに転送される。受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所に保存する。</p> -<p> -受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、自分宛てのメールを確認する。この時に使われるのがIMAPというプロトコルである(POPというのもあるが今回は割愛)。IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。今回MDAとしてDovecotを使用する。</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre> -+------------+ +----------------+ -|MTA(mtkn.jp)|--SMTP-&gt;| MTA | -+------------+ +--example.com---+ - ^ | MDA | - | +----------------+ - | | - SMTP IMAP - | | - | v -+------------+ +----------------+ -|user@mtkn.jp| |user@example.com| -+------------+ +----------------+ - -</pre> -<ol> -<li>メールを書く。</li> -<li>送信側のMTAに送る。</li> -<li>受信側のMTAに転送する。</li> -<li>受信者が受信側のMDAに新着メールの有無を確認する。</li> -</ol> - -<p> -SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、いくつかの方法で送信元の本人確認を行う。その際第三者としてDNS及び、サーバーのIPアドレスを管理している人(今回の場合はさくらインターネット)が登場する。DNSにはドメインをIPアドレスにひもづける情報が登録できる。またIPアドレスの管理人には、自分が借りているIPアドレスを自分のドメインにひもづける情報を登録してもらう。これらによって、メールの送信者がドメイン、IPアドレス双方から確認できるので、なりすましを防止できる仕組みである。</p> - -<p> -最近はgmail等の大手がスパム対策を強化する一環として、以下に述べるような本人確認をすべて通らなければ受信しないようにしているらしい。</p> - -<h2>MTAどうしのやりとり</h2> -<p> -以下、MTAどうしの通信内容をざっくり説明する。 -</p> - -<h3>Aレコード、MXレコードによる送信先の特定</h3> -<p> -MTAがメールを送信する際、まずは宛先のサーバーを特定する必要がある。この際に使用するのがDNSに登録されているMXレコードである。送信元のMTAはまずDNSに宛先のドメインのMXレコードを問い合わせる。するとメールの送信先のドメイン名が分かるので、続いてこの送信先のIPアドレスを問い合わせる:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS - - example.com宛のメールって - 誰に送ったらええん? - ----------------------------------------&gt; - - mai.example.comやで(MXレコード) - &lt;---------------------------------------- - - mail.example.comってどこや? - ----------------------------------------&gt; - - <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) - &lt;---------------------------------------- -</pre> -<p> -次にこの宛先のMTAとの通信を開始する。しかし受信側のMTA(example.com)は、mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - こんちは。mtkn.jpです。 - ----------------------------------------&gt; - - なりすましちゃうか確認したろ -</pre> - -<h3>SPFレコードによる送信元の本人確認</h3> -<p> -受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。このときに使うのがSPFレコードである。このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいいIPアドレスを指定する。受信側のMTAは送信元のIPアドレスと、このレコードに記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者に認められているMTAかどうか判断できる。</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗るやつから連絡 - 来てるんやけどこいつ本物? - &lt;---------------------------------------- - - IPアドレスが<i>sss.sss.sss.sss</i> - やったら多分本物やわ。(SPFレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>PTRレコード</h3> -<p> -次は逆にIPアドレスからドメインを辿って本人確認する。これに使われるのがPTRレコードである。このレコードはIPアドレスの管理人(ここではさくらインターネット)でないと登録できない。しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを提供しており、PTRレコードをきちんと設定した上でスパムメールを送ると、自分の身元がバレるので、スパムの抑止に繋がる。</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - <i>sss.sss.sss.sss</i>ってIPアドレスで - mtkn.jpってドメイン登録されてる? - &lt;---------------------------------------- - - されてるで。(PTRレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DKIM</h3> -<p> -送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。署名は公開鍵方式で行うが、この鍵をドメインキーというようである。この署名が付いたメールをDKIM(DomainKey Identified Mail)という。送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、メール送信時に秘密鍵で署名する:</p> -<pre> -MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - - 本人確認できたわ - おまたせ。 - &lt;---------------------------------------- - - userさんにメール送るで。 - 署名も付けるで。 - ----------------------------------------&gt; -</pre> -<p> -受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpが署名付きでメール - くれたんやけどこの署名本物? - &lt;---------------------------------------- - - これで確認してみて(DKIM公開鍵) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3> -<p> -この他DNSにはDMARCレコードというものを登録することができる。これは、以上の本人確認により送信側がにせものであることが確認できた際、受信側にどのような行動を取ってほしいかを記述するものである。これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、受信したサーバーから自分宛てに通報するように頼める(この頼みが聞き入れられるかどうかは多分受信側MTAによる)。 -</p> -<pre> -DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) - mtkn.jpを名乗る詐欺師から - メールきたんやけどどないしょ? - &lt;---------------------------------------- - - ここ(postmaster@mtkn.jp)に通報や。 - (DMARCレコード) - ----------------------------------------&gt; - - よっしゃ -</pre> - -<h2>サーバーの設定</h2> -<h3>VPSの契約、ドメインの取得</h3> -<p> -VPSとドメインを契約する。今回はVPSをさくらインターネットで、ドメインをムームードメインでそれぞれ契約した。さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい(他のVPSを知らないので比較はできないが)。ムームードメインは安い。管理画面も悪くはない。以前お名前.comでも借りたことがあるが、こちらは広告のメールがやたら届いてうっとうしかった記憶がある。</p> - -<h3>OpenBSDのインストール</h3> -<p> -さくらのVPSにOpenBSDをインストールする。さくらインターネットが用意したISOがあるので、OS再インストールの画面からそれを選べばすぐにインストールきる。でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。</p> -<p> -インストールのこまかい手順は割愛するが、ひとつだけひっかかった点があるので書いておく。インストール先のディスクをセットアップし、OSに必要なファイルをインストールメディアからディスクにコピーすると以下のエラーがでてカーネルパニックになった: -</p> -<pre><code>wdc_atapi_start: not ready, st = 50 -fatal protection fault in supervisor mode -trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410 -gsbase 0xffffffff81908ff0 kgsbase 0x0 -panic: trap type 4, code=0, pc=ffffffff810081a9 -syncing disks...18 18 18 18 18 18 18 18 -</code></pre> -<p> -原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗しているようで、インストールに必要なファイルをウェブ上からダウンロードする方法を選択すると問題なくインストールできた。 -</p> - -<h3>ファイアーフォールの設定</h3> -<p> -メールの送受信等に必要なポートを開ける:</p> -<ul> -<li>TCP 22: ssh接続用</li> -<li>UDP 53: DNSとの通信用</li> -<li>TCP 25: SMTPの通信用</li> -<li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li> -<li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li> -<li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li> -</ul> -<p> -以上の設定を<code>/etc/pf.conf</code>に設定する: -</p> -<pre><code>set skip on lo - -block return # block stateless traffic -pass in log proto tcp from any to any port 22 #ssh - -pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS -pass out proto udp from any to any port 123 #ntp - -pass proto icmp #ping -pass proto tcp from any to any port { 80, 443 } #www -pass proto tcp from any to any port { 25, 587, 993 } #mail -</code></pre> -<p> -<code>pf(4)</code>の設定を反映: -</p> -<pre><code># pfctl -f /etc/pf.conf -</code></pre> - -<h3>DNSの設定</h3> -<h4>A, MX, SPF, DMARC</h4> -<p> -DNSのレコードを設定する。ムームーDNSの場合、コントロールパネルにログインし、サイドバーからドメイン管理&gt;ドメイン操作&gt;ムームーDNSと進み、設定するドメインの変更ボタンをクリックすると設定画面がでるので、以下のように設定する:</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td></td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td>mail</td> -<td>A</td> -<td><i>sss.sss.sss.sss</i></td> -<td></td> -</tr> -<tr> -<td></td> -<td>MX</td> -<td>mail.mtkn.jp</td> -<td>10</td> -</tr> -<tr> -<td></td> -<td>TXT</td> -<td>v=spf1 mx -all</td> -<td></td> -</tr> -<tr> -<td>_dmarc</td> -<td>TXT</td> -<td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td> -<td></td> -</tr> -</tbody> -</table> - -<p> -ひとつめの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>であることも分かる。 -</p> -<p> -次のTXTレコードはSPFレコードである。v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録されたIPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信を禁止している。 -</p> -<p> -最後のものはDMARCレコードである。v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメールについて、その受信者が受信を拒否するように指定している。rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメールを受信した場合の通報先を指定している。</p> - -<h4>PTR</h4> -<p>PTRレコードを設定する。さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名(mtkn.jp)を入力する。 -</p> - -<h3>OpenSMTPDの設定</h3> -<h4>ユーザーの作成</h4> -<p> -メールの送受信を担当するユーザーを作成する:</p> -<pre><code># useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail -</code></pre> - -<h4>サーバー証明書の取得</h4> -<p> -<code>httpd(8)</code>の設定ファイルを作成する。<code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。変更箇所はドメイン名だけでいい。編集後、httpdを起動する。</p> -<pre><code># cp /etc/examples/httpd.conf /etc/ -# vi /etc/httpd.conf -# echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -</code></pre> - -<p> -続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に登録することで、証明書が自動で更新されるようにする。</p> -<pre><code># cp /etc/examples/acme-client.conf /etc/ -# vi /etc/acme-client.conf -# acme-client -v mail.mtkn.jp -# crontab -e -</code></pre> - -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd -</code></pre> - -<h4>ドメインキーの作成とDNSへの登録</h4> -<p> -OpenSMTPD用のDKIMフィルターをインストールする。 -</p> -<pre><code># pkg_add opensmtpd-filter-dkimsign -</code></pre> - -<p> -ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。 -</p> -<pre><code># openssl genrsa -out /etc/mail/dkim/private.key 1024 -# openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key -# chown -r _dkimsign:_dkimsign /etc/mail/dkim -# chmod 0400 /etc/mail/dkim/private.key -</code></pre> - -<p>作成したドメインキーの公開鍵をDNSに登録する:</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>selector1._domainkey.mail</td> -<td>TXT</td> -<td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td> -<td></td> -</tr> -</tbody> -</table> - -<p> -サブドメインのselector1は以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに -指定してものと同じものであれば他のものでもいい。</p> - -<h4>smtpd.confの設定</h4> -<p> -/etc/mail/smtpd.confを以下の通り変更:</p> -<pre><code># 認証に使用するサーバー証明書と秘密鍵を&quot;mtkn.jp&quot;という名前で登録。 -# 証明書のファイルは先程acme-client(1)で取得したもの。 -pki mtkn.jp cert &quot;/etc/ssl/mail.mtkn.jp.fullchain.pem&quot; -pki mtkn.jp key &quot;/etc/ssl/private/mail.mtkn.jp.key&quot; - -# テーブルの登録 -# ローカルに届いたメールの転送を設定するテーブル -table aliases file:/etc/mail/aliases -# ユーザーの名前と暗号化されたパスワードのテーブル -table passwd file:/etc/mail/passwd -# メールの転送を設定するテーブル -table virtuals file:/etc/mail/virtuals - -# フィルターの登録 -# ドメインキーによる署名を付加するフィルター -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 -# DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター -filter check_rdns phase connect match !rdns disconnect &quot;550 no rDNS.&quot; -# 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった -# 場合に受信を拒否するフィルター -filter check_fcrdns phase connect match !fcrdns disconnect &quot;550 no FCrDNS.&quot; - -# 各ネットワークインターフェース毎の処理を設定。 -listen on socket -listen on lo0 -# vio0というインターフェースの25番ポートに届いたものに関する設定。 -# 外部からmtkn.jp宛に届いたものの処理である。 -# 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、 -# 上で設定したDNSに関するフィルターを適応。 -listen on vio0 port 25 tls pki mtkn.jp hostname &quot;mail.mtkn.jp&quot;\ filter { check_rdns, check_fcrdns } -# vio0というインターフェースのsubmission(587番)ポートに関する設定。 -# mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される -# メールに関する設定。 -# 上と同様に&quot;mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 -# &quot;passwd&quot;という名前で登録したパスワードで認証し、 -# さらにドメインキーでメールに署名する。 -listen on vio0 mask-src port submission smtps pki mtkn.jp\ hostname &quot;mail.mtkn.jp&quot; auth &lt;passwd&gt; filter dkim_sign - -# 各種メールの処理を定義する。 -# 各処理が実行される条件はこの後定義する。 -# ローカルメールはデフォルトのまま -action &quot;local_mail&quot; mbox alias &lt;aliases&gt; -# 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 -action &quot;domain&quot; maildir &quot;/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}&quot;\ virtual &lt;virtuals&gt; -# 他のドメイン宛ては宛先へ転送。 -# 他のsmtpサーバーとの接続を確立する際にデフォルトではこのコンピュータのホスト名(僕の場合"sakura.mtkn.jp")で -# 自己紹介しており、DNSレコードが見付からないとおこられていたため helo "mtkn.jp" を追加 -action &quot;outbound&quot; relay helo "mtkn.jp" - -# どういう条件でどういう処理をするかを定義する。 -# 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 -# ここでは/var/vmail/以下に振り分けて保存する。 -match from any for domain mtkn.jp action &quot;domain&quot; -# このサーバー内でのメールはlocal_mailとして処理。 -match from local for local action &quot;local_mail&quot; -# このサーバー内から他所へのメールは宛先に転送 -match from local for any action &quot;outbound&quot; -# 外部から来た他所宛てのメールは認証されているものに限り転送。 -# authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 -match auth from any for any action &quot;outbound&quot; -</code></pre> - -<h4>各テーブルの作成</h4> -<p> -上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。<code>/etc/mail/aliases</code>は特に変更しなくてもいい。<code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:</p> -<pre><code># echo user@mtkn.jp:$(smtpctl encrypt) &gt;&gt; /etc/mail/passwd -<i>パスワードを入力し、エンター、Ctrl-D</i> -</code></pre> - -<p> -<code>/etc/mail/virtuals</code>にはメールの転送を設定できる。以下のようにする:</p> -<pre><code>abuse@mtkn.jp user@mtkn.jp -postmaster@mtkn.jp user@mtkn.jp -webmaster@mtkn.jp user@mtkn.jp -user@mtkn.jp vmail -</code></pre> -<p> -この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど必要なんかな? -</p> - -<h3>Dovecotの設定</h3> -<p> -MDAとして<code>dovecot(1)</code>をインストールする。</p> -<pre><code># pkg_add dovecot -</code></pre> -<p> -dhparamを作成する(時間がかかる): -</p> -<pre><code># openssl dhparam -out /etc/ssl/dh.pem 4096 -</code></pre> - -<p> -わかりにくい設定ファイルをどけてシンプルなものに書き直す: -</p> -<pre><code># mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig -# vi /etc/dovecot/dovecot.conf -</code></pre> -<p> -ドキュメントは公式ウェブサイトで確認できる。分量が多すぎて読む気にならない。サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>と暗号化されていないIMAPを<code>port = 0</code>として無効にする。他はとりあえず以下の設定で動く:</p> -<pre><code># IPv4は全て監視 -listen = * - -# SSL接続のみ許可 -ssl = required - -# SSLに使用するファイル -ssl_cert = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem -ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key -ssl_dh = &lt;/etc/ssl/dh.pem - -# メールの保存場所は各ユーザーのホームディレクトリ。 -# ホームディレクトリの場所は以下のuserdbで設定。 -mail_location = maildir:~ - -# パスワードのファイル。 -# OpenSMTPDと共有。 -passdb { - args = scheme=BLF-CRYPT /etc/mail/passwd - driver = passwd-file -} - -# ユーザーの設定。 -# ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> -userdb { - args = uid=vmail gid=vmail home=/var/vmail/%d/%n - driver = static -} - -# 使用するプロトコル。 -protocols = imap lmtp - -# SSLを使ったIMAPSのみを許可。 -service imap-login { - inet_listener imaps { - port = 993 - ssl = yes - } - # Disable imap - inet_listener imap { - port = 0 - } -} -</code></pre> -<pre><code># rcctl start dovecot -# rcctl enable dovecot -</code></pre> - -<p> -サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように<code>cron(8)</code>に追加しておく: -</p> -<pre><code>crontab -e -</code></pre> - -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client mail.mtkn.jp &amp;&amp; rcctl restart smtpd &amp;&amp; rcctl reload dovecot -</code></pre> - -<h3>テスト</h3> -<p> -手元のメールクライアントから送受信のテストをする。特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。以上の設定で、gmailへの送受信は問題なかった。また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン及び送受信できることも確認した。</p> -<p> -<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> - -<h2>参考文献</h2> -<ul> -<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> -<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> -<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> -<li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li> -<li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li> -<li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li> -</ul> -]]></description> -</item> -<item> -<title>RP2040 SDKなし3 割り込み</title> -<link>https://www.mtkn.jp/computer/rp2040_3_interrupt.html</link> -<guid>https://www.mtkn.jp/computer/rp2040_3_interrupt.html</guid> -<pubDate>Wed, 27 Aug 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>RP2040 SDKなし3 割り込み</h1> -<time>2025-08-27</time><br /> -<p> -前回UARTで通信する際、FIFOにデータが届いていないかを確認しつづけていた(ポーリング)。 -これでは電力がもったいないので、データが届くまでCPUは休ませておいて、 -届いたときだけ処理を実行するように変更する(割り込み)。 -<p> -<p> -前回: <a href="rp2040_2.html">RP2040 SDKなし2 Clock、UART</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex3_interrupt -</p> - -<h2>動作環境</h2> -<ul> -<li>OpenBSD 7.7 - <ul> - <li>arm-none-eabi-binutils-2.40</li> - <li>OpenBSD Make</li> - <li>minicom version 2.8</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>割り込み</h2> -<p> -ハードウェアが外部から信号を受けとると、CPUに現在の処理を中断させてその信号を処理させるようにできる。これを割り込み処理という。今回はUARTにデータが届いた時に同じデータをUARTに書き込むようにしたい。</p> - -<h3>割り込みを有効化</h3> -<p> -割り込みの信号を受け取るために、割り込みを有効化する。CPUが割り込みを受け付けるようにする設定と、UARTが割り込み信号を発生させるようにする設定が必要である。</p> -<p> -CPU側の設定は<code>M0PLUS: NVIC_ISER</code>レジスタの有効化したい割り込みのビットに1を書くことで行う。有効化できる割り込みは全部で26個ある。割り込みの種類はrp2040のデータシート[1]のTable 80. Interruptsに書いてある。今回有効化するのはUART0の割り込みで、この表から20番が割り当てられていることが分かるので、<code>M0PLUS: NVIC_ISER</code>に、下から20番目のビットを1にしたもの書き込む:</p> -<code><pre> // enable uart interrupt in cpu - ldr r4, ppb_base - mov r5, #0xe1 - lsl r5, #8 - mov r0, #1 - lsl r0, #20 - str r0, [r4, r5] // M0PLUS: NVIC_ISER - -/* ... */ - -ppb_base: - .word 0xe0000000 -</pre></code> -<p> -UART側の設定は、<code>UART: UARTIMSC</code>レジスタで行なう。データを受け取ったときに割り込みを発生させたいので、<code>RXIM</code>ビットに1を書き込む。また、処理を開始する前に既にFIFOにデータがたまっている可能性があるので、FIFOが空ではないときに割り込みを発生させるように、<code>RTIM</code>にも1を書き込む:</p> -<code><pre> // enable uart interrupt in uart0 subsystem - ldr r1, uart0_base - mov r2, #(1 &lt;&lt; 6 | 1 &lt;&lt; 4) // RTIM | RXIM - str r2, [r1, #0x38] // UART: UARTIMSC -</pre></code> -<p> -また、FIFOにデータがきたらすぐに割り込みを発生させたいので、<code>UART: UARTIFLS</code>レジスタの<code>RXIFLSEL</code>に0を書き込む。これでFIFOの1/8が埋まったら割り込みが発生する。</p> -<code><pre> // set fifo level to 0 - mov r2, #0 - str r2, [r1, #0x34] // UART: UARTIFLS -</pre></code> -<p> -これだとFIFOに届いた瞬間には割り込みがおこらない気がするが、pico-sdk(src/rp2_common/hardware_uart/include/hardware/uart.h)の<code>uart_set_irqs_enabled</code>関数でもこうなってる。FIFOを無効にすれば即座に割り込みがおこるかもしれないが、データが失われる可能性もあるのかな。</p> - -<h3>ベクターテーブルの設定</h3> -<p> -外部からの信号で割り込みが発生したときに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> -<code><pre> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - .word 0xdeadbeef - - .word (uart_interrupt_handler+1) // UART0_IRQ -</pre></code> - -<h3>割り込み処理</h3> -<p> -割り込み発生時に呼ばれる関数はUARTのFIFOに届いたデータをそのまま送信するだけのものである:</p> -<code><pre> // uart_interrupt_handler echos the data arrived at uart0 -uart_interrupt_handler: - push {lr} - bl getbyte - bl putbyte - pop {pc} -</pre></code> -<p> -<code>getbyte</code>、<code>putbyte</code>は前回と同じもの。 -</code> - -<h2>メインループ</h2> -<p> -UARTにデータが届いていないときは特にすることがないのでCPUは寝かせておく。ARMには割り込みが発生するまでなにもしない<code>wfe</code>という命令があるのでこれを使う:</p> -<code><pre>loop: - wfe - b loop -</pre></code> - -<h2>完成</h2> -<p> -これで完成。動作は前回と全く同じだが、消費電力をおさえられる。</p> - -<h2>参考</h2> -<ul> -<li> -[1]. <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[2]. <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -[3]. <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -</ul> -]]></description> -</item> -<item> -<title>自画像</title> -<link>https://www.mtkn.jp/gallery/20250717.html</link> -<guid>https://www.mtkn.jp/gallery/20250717.html</guid> -<pubDate>Thu, 17 Jul 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>自画像</h1> -<time>2025-07-17</time> -<img src="img/20250717.jpg"> -]]></description> -</item> -<item> -<title>万博で知り合ったルーマニア人とハイキングに行った</title> -<link>https://www.mtkn.jp/journal/posts/20250519.html</link> -<guid>https://www.mtkn.jp/journal/posts/20250519.html</guid> -<pubDate>Mon, 19 May 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>万博で知り合ったルーマニア人とハイキングに行った</h1> -<time>2025-05-19</time> - -<p> -先日万博のルーマニアパビリオンで知り合ったルーマニア人の<a href="https://noian.art">Noian</a>がハイキングに行きたいというので、地元の山に連れていった。元々4月の終わりごろを予定していたが、僕が風邪をひいてしまいのびていた。向こうも万博の仕事が忙しいようで、帰国の前日になってやっと予定が合った。</p> - -<p> -10時過ぎにうちの最寄り駅に着く予定だったが、電車に乗り間違えたらしく一時間程遅れた。なにせ阪和線である。外国人にはかなりややこしい。そのうえ駅員はフランス人のごとく英語を話さない。間違って関空に行かないようにしつこく注意喚起して、なんとか和歌山に辿りついた。</p> - -<p> -車で自宅まで連れて来て、そこから徒歩で山に向かった。自然が好きそうだったので、ろくに整備されていないひとけのない山に案内した。</p> - -<p> -この山に登るのは久しぶりなので道を覚えているか不安だった。おそらく昔の人が隣の町まで行くのに使っていた道だと思う。今でも一応隣町まで抜けられる。入口は果樹園になっていて今も柑橘の木がたくさん植わっている。川沿いを森に入ると左右には棚田が並んでいる。こちらの田んぼは既に放棄され、今は藪や針葉樹林になっている。針葉樹の方は戦後の拡大造林で植えられたものだろうか、毎年ティッシュペーパーの需要を底上げしている木々である。棚田は石垣で造成されている。いつのものかは知らないが今も崩れずに残っている。</p> - -<p> -棚田の横をさらに進むと小さい滝がある。牝牛の滝というらしい。牝牛と書いてコッテと読む。滝の近くに牝牛に見える岩があるのが由来らしい。コッテという言葉は聞き馴染みがない。後日祖父の友人に聞いた話だと、小さい牛やメスの牛のことをコッテウシと言ったそうだ。</p> - -<figure> -<img src="20250519-1.jpg" alt="牝牛の滝"> -<figcaption><ruby>牝牛<rp>(</rp><rt>コッテ</rt><rp>)</rp></ruby>の滝</figcaption> -</figure> - -<p> -滝を過ぎると急勾配の斜面が続く。ほとんど道とはいえないような山肌を登る。40度はありそうな勾配である。息があがりながらも、彼は日本に来たがっている友人のことを聞かせてくれた。日本のとあるバンドの大ファンなのだそうだ。ポップカルチャーにはうといので自国のことなのになにも分からなかった。最後に大きな岩が作った崖を山羊のように登ればやっと平坦な道に出る。彼のブーツがよく滑っていた。裸足が一番安全だと勧めたが遠慮しとくと言われた。そこから先は特にきつい場所もなく、そのまま展望台に続く。彼は少し疲れたようで言葉が少なくなっていた。</p> - -<figure> -<img src="20250519-2.jpg" alt="展望台から"> -<figcaption>展望台から</figcaption> -</figure> - -<p> -展望台からは僕の町が一望できる。西が海で南北が山、東はゆるがかな坂が高野山まで続いている。彼の出身地も山がちで似た地形だそうだ。海はないが毎年父親が黒海まで連れていってくれていたので馴染深いといっていた。展望台には小さな祠がある。せっかくなので鳥居のくぐり方や参拝の仕方を教えてあげた。熱心に聞いてはくれたが自分はやらないと言っていた。理由は聞かなかったがおそらく彼がキリスト教徒だからであろう。こういうはっきりした態度は見ていてなんとなく気持がいい。</p> - -<p> -ところで日本では神道でも仏教でも左進右退が基本だと思う。以前五瀬命が祀られている竃山神社のお祭に行ったことがある。そこでは巫女さんが神殿に向う階段を登る際左足を一段上げて右足を引き寄せてを繰り返して登り、下るときは逆にしていた。お寺でも道場に入るときは左から、出るときは右からと習った。そういえば合気道でも座礼をするとき左手、右手の順で床に付けて頭を下げ、頭を上げるときは右手から戻すと習った気がする(この記憶はあいまい)。ところがヨーロッパでは逆らしい。左は邪悪だから右から入るのだそうだ。</p> - -<p> -下りは別の道を選んだ。途中からコンクリートで舗装されている楽な道である。途中で山菜がいろいろ生えていたので紹介してあげたらぱくぱく食べていた。よく信用できるものである。イタドリ、ユキノシタ、フキ、チャノキ、タラノキ...。タケノコはもう竹だった。クスノキもあったのでいい香りがすると言って渡したらこれもかじっていた。クスノキが食べられるかどうか僕は知らない。防虫剤に使われていたと伝えるとすぐに吐きだして水で口をすすいでた。</p> - -<p> -展望台でフルートを吹く動画を撮りたかったのに忘れていたといっていたが、途中で見つけた竹林を気に入ったようで、そこで吹いていた。このフルートはチューニングが現代の一般的なものとは違い、ミの音が少し低くなっている。長調とも短調ともいえない微妙な音階だった。</p> - -<figure> -<img src="20250519-3.jpg" alt="フルートを吹くNoian"> -<figcaption>フルートを吹くNoian</figcaption> -</figure> - -<p> -ルーマニアに竹は自生していない。ところが和食屋等には植わっているという。ルーマニアの植生だいじょうぶかなぁ。</p> - -<p> -山から家に帰ってきたらもう15時になろうとしていた。昼ごはんは食べてない。車で和歌山市の寿司屋に向った。弥一という回転寿司である。回転寿司だが安いわけではなく、味はかなり美味しい。</p> - -<p> -中途半端な時間に行ったからか、寿司はひとつも回っておらず、タブレットから注文するように言われた。おなかがすいたから寿司以外のものも食べるといって、彼は最初にうどんを注文した。僕も自分の食べたいものを適当に注文していた。しばらくして納豆うずらが届いた。僕は頼んでいない。彼は納豆が好きだそうだ。ルーマニアにも臭いの強い発酵食品があるのかと思い、チーズの話をしてみた。ルーマニアには臭いチーズはないと言う。ゴルゴンゾーラやカマンベールはないのかと聞くと、あんなのは臭いうちにはいらないそうだ。ちなみに国でよく食べられるのはカビの生えていないクリームチーズのようなものだそうだ。</p> - -<p> -ひととおり食べておなかがいっぱいになってきた。彼もおなかがいっぱいになってきたと言いだした。彼のうどんにはまだ手が付けられていない。テーブルにはまだ寿司が残っている。無理なら僕が食べようかと言うと彼はうどんの鉢をこっちによこした。ちょっとくるしかったがまあうどんなので食べれた。麺は腰があっておいしいが、出汁は少し甘みが強かった。出汁を飲みほした頃、彼も残った寿司をだいたい片付けて、やっぱり自分もうどんを食べるといって追加で注文した。</p> - -<p> -うどんの甘みをガリで消して店を出た。おごってくれた。</p> - -<p> -弥一を後にし、和歌山城に案内した。和歌山城にはなぜか小さな動物園が付いている。時間がなかったので適当に見て天守閣に登った。地元の人間なのに天守閣はこれが初めてである。閉館ぎりぎりに行って30分しか見れなかった。天守閣は米軍に丸焼きにされたあと鉄筋コンクリート造りで再建された物である。外観はそれっぽいが内部は昭和の団地のような近代的なものだった。書画や武器等が展示されていてそれなりに見応えがあり、30分では足りなかった。彼は中国語が話せるので漢字も結構読める。僕が流し見した巻物を熱心に読んでいた。</p> - -<p> -和歌山城を出た後は寺か神社が見たいというので日前宮に行った。既に閉まっていて入れなかった。こんな時間に閉まっては会社帰りに立ち寄れないのではと言われた。ルーマニアではサラリーマンが帰りに教会に行くのが普通なのだろうか。</p> - -<p> -カフェにでも行って話しをしようということになった。いい喫茶店は知らないので和歌山市駅のスタバに行くことにした。駅ビルには確か日本酒のお店もあったのでそこで黒牛か超久でも買わせようと思った。ところが着いてみると平和酒造の店だった。この酒蔵はあまり好きではないので入らずに直接スタバに行った。スタバではどういう流れだったか、国境の話になった。昔は国という概念も国民という枠組みもなかったのに、いつしか作られて国境ができたという。ヨーロッパの世界はかつて神が治めていたが、あるときから貴族がその役割を担い、貴族が没落してからは民衆をまとめるために民族や国家というストーリーが必要になったという。そういえばゲルマン民族というのもナチスがドイツをまとめるために作った概念だとどこかで読んだ気がするが本当なのだろうか。日本は海に囲まれているのでヨーロッパと少し状況が違うんじゃないかという話を出してみた。言語も民族も一つで天然の国境があるのはヨーロッパ人から見るとちょっと変なのかな。そのくせ昔から文化的には国際色豊かだと言われた。</p> - -<p> -辺りがすっかり暗くなったころスタバを出て少しそのへんを散歩した。駅の周辺は全然土地勘がなかったが紀の川があるのは知っていたのでそっちに向かって適当に歩いた。日本語の練習をしたいので日本語で話して欲しいと言われた。僕の言葉は結構理解できていたようだし、向うも割と話せていた。多少ゆっくり話すようにはしたがそれでもたいしたものである。ところで外国人相手に母語を話すと普段どれだけ自分がいい加減に話しているかがよく分かる。発音や文法を間違えないように意識するととたんに言葉に詰まるのだ。</p> - -<p> -人生で英語をしっかり話したのはこれが初めてである。彼と話していて思ったが、話したいことがあれば文章を組みたてる前に話しはじめたほうがいい。相手の話を理解したうえでなにか言いたげなことは伝わるし、そのあとは身振り手振りでも案外なんとかなる。外国人と話すのに外国語に関する知識はある程度必要だが、相手の話したいことに興味を持つのも重要である。</p> - -<p> -河原では日本の山に危険な動物はいるのかという話になった。熊や毒蛇、スズメバチなんかが怖いと言った。このあたりで熊を見たことはないけど。それから彼がどうやって英語を流暢に話せるようになったのかも教えてくれた。英語でゲームをしていたら英語が第二の母語のようになったそうだ。ルーマニア語はマイナーな言語なのでゲームは翻訳されないらしい。僕も流暢ではないにしても何とか意思疎通できるようになったのは、英語でコンピューターの勉強をしたからだと思う。英語を勉強するより、英語を使ってなにかをすると、すぐ覚えるし忘れにくい。最後に二宮金次郎の像に集まった猫を眺めて駅に戻った。</p> - -<p> -彼は明日の22時台の飛行機でイスタンブールを経由して国に帰る。イスタンブールまで12時間、乗り換えに3時間、そこからルーマニアまで1時間半、国に着いてからさらに12時間バスに乗る。なかなか遠いところである。国内線もあると言っていたが、日本でお金を使いすぎたから節約したいらしい。</p> - -<p> -彼は20:30発の特急サザンに乗って大阪のホテルに帰っていった。</p> -]]></description> -</item> -<item> -<title>使用しているハードウェア、ソフトウェア</title> -<link>https://www.mtkn.jp/computer/what-i-use.html</link> -<guid>https://www.mtkn.jp/computer/what-i-use.html</guid> -<pubDate>Mon, 28 Apr 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>使用しているハードウェア、ソフトウェア</h1> -<time>2025-04-28</time>更新<br> -<time>2021-12-13</time>作成 -<h2>ノートパソコン</h2> -<p>メインのパソコン。</p> -<dl> -<dt>ハードウェア: <a href="openbsd_on_u9310e.html">Fujitsu LIFEBOOK U9310/E</a></dt> -<dd>2013年製のMacBook Airを使っていたがバッテリーがへたってきた。ぱちもんのバッテリーは1年でだめになるのに7千円くらいするのでコスパが悪い。2025年4月に大阪日本橋で見付けたLIFEBOOKを買った。10世代のCore i5で27000円くらい。軽い。ディスプレイが綺麗、OpenBSDと相性がそこそこいい。</dd> -<dt>OS: OpenBSD</dt> -<dd> -使いやすい。 -</dd> - -<dt>Window Manager: <a href="https://git.mtkn.jp/dwm">dwm</a></dt> - -<dt>Terminal: <a href="https://git.mtkn.jp/st">st</a></dt> - -<dt>Text Editor: acme, nvi</dt> -<dd>vimは辞めた。OpenBSDにあったnviが丁度いい。日本語を使うので日本語入力が必要ない場面ではacmeを使っている。</dd> - -<dt>Browser: firefox</dt> -<dd>もうちょっとましなのないんかな。UIころころ変わるし、重いし、嫌い。JavaScriptがないと困るので仕方なく使っているが...特に最近画面上部のUIが大きすぎて邪魔である。</dd> - -<dt>Mail Client: neomutt</dt> -<dd>あんまり好きじゃない</dd> -</dl> - -<h2>デスクトップ</h2> -<p>学生のときに組んだ。無駄にハイスペック。この上RTX2060も積んでたが、OpenBSDで使えないので解雇した。最近は絵を描くのに使っている。</p> -<dl> -<dt>マザーボード: ASRock Z390 Pro4</dt> -<dt>CPU: Intel Core i7-9700K</dt> -<dt>メモリ: センチュリーマイクロ 8GB * 2</dt> -<dd>国産</dd> -<dt>ストレージ: KimMiDi SSD 256GB</dt> -<dd>ThinkPad買ったときについてきたやつ。</dd> -<dt>モニタ: Eizo FlexScan EV2451</dt> -<dd>綺麗やけど質量が大きい。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>家のサーバー</h2> -<p> -主にDNSとして使っている。 -</p> -<dl> -<dt>ハードウェア: Dell D520</dt> -<dd>おじいちゃんの家にころがってたのをもらってきた。</dd> -<dt>OS: OpenBSD</dt> -<dd></dd> -</dl> - -<h2>ウェブサーバー</h2> -<p>このウェブページ用</p> -<dl> -<dt>VPS: さくらのVPS</dt> -<dd>ちょっと高い(7078円/12ヶ月)。OpenBSDを入れられる。</dd> -<dt>OS: OpenBSD</dt> -<dt>httpサーバー: Openbsd httpd</dt> -<dd>manが分かりやすい。</dd> -<dt>smtpサーバー: OpenSMTPD</dt> -<dd>manが分かりやすい。</dd> -<dt>imapサーバー: dovecot</dt> -<dd>manはあんまり分かり易くない。<dd> -</dl> -]]></description> -</item> -<item> -<title>OpenBSD on Fujitsu LIFEBOOK U9310/E</title> -<link>https://www.mtkn.jp/computer/openbsd_on_u9310e.html</link> -<guid>https://www.mtkn.jp/computer/openbsd_on_u9310e.html</guid> -<pubDate>Mon, 28 Apr 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>OpenBSD on Fujitsu LIFEBOOK U9310/E</h1> -<time>2025-04-28</time> - -<h2>はじめに</h2> -<p> -大阪の日本橋で状態のいいLIFEBOOKを見つけたので購入した。OpenBSDをインストールしたらおおむね問題なく動いた。</p> - -<h2>ハードウェア</h2> -<img src="images/openbsd_on_u9310e_1.jpg" alt="U9310/E"> -<p> -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> - -<h2>内部</h2> -<p> -分解は簡単。電源を落して、裏面にあるネジを全部外せば裏蓋が開く。ツメで引っ掛けていたりしないので外しやすい。裏蓋にはバッテリーの絵が描かれたボタンがあって、いかにも押してほしそうな顔をしていたので一応押してから分解した。組み立てた後は電源ケーブルを繋がないと電源が入らなかった。おそらくバッテリーとの接続を切断するためのボタンなのだと思う。</p> -<img src="images/openbsd_on_u9310e_2.jpg" alt="U9310/E の内部"> -<p> -CPUクーラー、ヒートシンク、Wi-Fiカード、WWANカード、SSDは簡単に外せた。他のものもだいたい分解しやすそうである。電源プラグが交換できるのはポイントが高い。上でも書いたがメモリははんだ付けされていて交換できない。キーボードも外せそうではあるがマザーボードを取ったうえネジが沢山あったのでやめにした。</p> -<h2>OpenBSDのサポート</h2> -<table> -<tr> -<th>機能</th> -<th>サポート</th> -<th>備考</th> -</tr> - -<tr> -<td>音</td> -<td>○</td> -<td> -Intel 400 Series HD Audio、コーデック: Realtek ALC255。<br>azaliaによりサポート。メディアキーによる音量調整が可能。</td> -</tr> - -<tr> -<td>バッテリーの状態</td> -<td>○</td> -<td> -acpibatによりサポート。 -</td> -</tr> - -<tr> -<td>キーボードバックライト</td> -<td>?</td> -<td> -今回購入したものには搭載されていなかった。 -</td> -</tr> - -<tr> -<td>ハイバーネーション</td> -<td>○</td> -<td> -ZZZが使える。 -</td> -</tr> - -<tr> -<td>スリープ</td> -<td>○</td> -<td> -zzzが使える。液晶を閉じると自動でスリープし、開くと問題なく復帰できる。電源ランプが点滅するのが少しじゃま。 -</td> -</tr> - -<tr> -<td>タッチパッド</td> -<td>○</td> -<td> -imtでサポート。 -</td> -</tr> - -<tr> -<td>USB type-A</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>USB type-C、Thunderbolt</td> -<td>?</td> -<td> -充電はできた。Thunderboltはケーブルがないのでテストできない。</td> -</tr> - -<tr> -<td>SDカードリーダー</td> -<td>○</td> -<td> -使えた。 -</td> -</tr> - -<tr> -<td>映像出力</td> -<td>○</td> -<td> -inteldrmでサポート。輝度の調整はxbacklightで出来るが、メディアキーは使えなかった。HDMIの出力も問題ない。 -</td> -</tr> - -<tr> -<td>ウェブカメラ</td> -<td>○</td> -<td> -SunplusIT Inc FJ Camera。uvideoでサポート。 -</td> -</tr> - -<tr> -<td>Ethernet</td> -<td>○</td> -<td> -emでサポート。 -</td> -</tr> - -<tr> -<td>Wi-Fi</td> -<td>○</td> -<td> -Intel Wi-Fi 6 AX201。iwxでサポート。 -</td> -</tr> - -<tr> -<td>WWAN</td> -<td>?</td> -<td> -Sierra Wireless, Incorporated EM7430。umbにより認識はされてる。ifconfigでもネットワークインターフェースとして表示されてる。simカード持ってないから試せない。 -</td> -</tr> - -<tr> -<td>Bluetooth</td> -<td>×</td> -<td> -OpenBSDはBluetoothが嫌い。ugenにより認識はされてる。 -</td> -</tr> - -</table> -]]></description> -</item> -<item> -<title>大阪万博行った</title> -<link>https://www.mtkn.jp/journal/posts/20250420.html</link> -<guid>https://www.mtkn.jp/journal/posts/20250420.html</guid> -<pubDate>Wed, 23 Apr 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>大阪万博行った</h1> -<time>2025-04-20</time> - -<p>4月15日火曜日に大阪万博に行ってきた。 -</p> - -<p>朝の紀州路快速は高校生ばかりだった。大阪に近付くにつれてビジネスマンが多くなっていった。西九条から地下鉄に乗りかえるとEXPO staffの札を首から下げた外国人がたくさんいた。外国人ばかりなのになぜかみんなスマホを見たり、目が合ってもなんとなく外を向いたりと、雰囲気だけが日本なのが面白い。</p> - -<p> -会場には予約より少し早く着いた。荷物検査があるので結構時間がかかり、入れたのは予約より30分ほど過ぎたころだった。</p> -<figure> -<img src="20250420-1.jpg" alt="東ゲート"> -<figcaption>東ゲート</figcaption> -</figure> -<figure> -<img src="20250420-2.jpg" alt="リング"> -<figcaption>リング</figcaption> -</figure> - -<p>会場内はところどころ植え込みがあって雑草も生えてきていた。タンポポは全部セイヨウだった。中央付近に静けさの森という場所があるが、そんなに森にはなっていない。どうせなら明治神宮みたいなのを作ればよかったかと思う。IR会場になった後も公園にできるし。 -</p> -<figure> -<img src="20250420-3.jpg" alt="セイヨウタンポポ"> -<figcaption>セイヨウタンポポ</figcaption> -</figure> -<figure> -<img src="20250420-4.jpg" alt="ノゲシ"> -<figcaption>ノゲシ</figcaption> -</figure> -<figure> -<img src="20250420-5.jpg" alt="バラ科のなにか"> -<figcaption>バラ科のなにか</figcaption> -</figure> -<figure> -<img src="20250420-6.jpg" alt="ノボロギク"> -<figcaption>ノボロギク</figcaption> -</figure> -<figure> -<img src="20250420-7.jpg" alt="ノアザミ"> -<figcaption>ノアザミ</figcaption> -</figure> -<figure> -<img src="20250420-8.jpg" alt="タネツケバナ"> -<figcaption>タネツケバナ</figcaption> -</figure> -<figure> -<img src="20250420-9.jpg" alt="ヨモギ"> -<figcaption>ヨモギ</figcaption> -</figure> - -<p>11時に英国パビリオンを予約していたのだが着いてみるとシステムエラーで閉鎖されていた。レストランは開いていたので混む前になにか食べることにした。英国人と会話できると思っていたが案内してくれたのは片言の英語を喋るアジア人のおばちゃんだった。2個で9ポンドのアイスクリームは売ってなかった。フィッシュアンドチップスと紅茶を頼んだ。出された紅茶にはミルクが付いていなかった?!フィッシュアンドチップスの方は思っていたよりは美味しかった。味のしない鱈だったが鮮度は良く、衣もさくさくだった。油もそこまで古くなっていない。チップスの方はモスバーガーよりイモの味が薄かった。タルタルソースと緑のペーストが付いていた。緑のものは多分エンドウ豆を潰したものにミントで香りを付けていた。悪くはなかったが組合せが初めてだったせいか、ミントが目立ちすぎていたように思う。</p> -<figure> -<img src="20250420-10.jpg" alt="フィッシュアンドチップス"> -<figcaption>フィッシュアンドチップス</figcaption> -</figure> - -<p>英国パビリオンが復旧するまで他を周ることにした。オーストリアに行ってみたが列が一杯だから時間をおいて来るように言われた。</p> - -<p>大根が咲いていた。 -</p> -<figure> -<img src="20250420-11.jpg" alt="ハマダイコン"> -<figcaption>ハマダイコン</figcaption> -</figure> - -<p>二つほど空いてる所を見たがあんまり面白くなかった。</p> - -<p>英国に戻ってみると復旧していたので入ることにした。前に英国人の親子が並んでいた。母親が高校生くらいの息子にハグして日本語で「トテモカワイイデス」と言っていた。突然日本語が聞こえてくるとどうしても見てしまう。目が合った。その後もなぜかちらほら日本語が聞こえてきては目が合った。しばらくして父親の方が息子の鞄からチョコ棒を出して母親と息子に配った。自分の分を取ったあとなぜかさらにもう一本取り出してこっちに差し出してきた。話し掛けたいなあと思っていた所だったので受け取ってお礼を言って何を話そうかと考えていたのだが、パビリオンの扉が開いて3人は吸い込まれていった。パビリオンは20人程度のグループで周るようになっていたのだが、丁度僕の前で区切られてしまったのだ。</p> -<figure> -<img src="20250420-12.jpg" alt="英国人がくれたチョコ棒"> -<figcaption>英国人がくれたチョコ棒</figcaption> -</figure> - -<p>展示は特に面白くなかった。特定の医薬品会社がお金を出していそうなことは分った。 -</p> - -<p>パビリオンの中にバーがあった。ビールでも飲みたかったが外が寒すぎて冷えていたのであきらめた。 -</p> - -<p>その後は特に予定もなかったので散歩していたらルーマニアパビリオンを見つけた。チェロの先生がルーマニアで修行してきた人なので行ってみたかったのだが、予約のフォームで見つからなかったので来ていないものだと思っていた。予約できないだけみたいだ。</p> - -<p>30分ほど並んだ。入口に居たお姉さんがめっちゃ綺麗だった。展示は生演奏と伝統工芸の展示、実演だった。演奏は僕が行ったときはバイオリンだけだったが、椅子と譜面台が4つとピアノもあったので時間によって編成が変わるようだった。伝統工芸の展示のひとつに、ガラスに描かれた宗教画があった。ビザンツからの伝統だと言っていたと思う。絵の具が置いてあったので描かせてもらった。マリアがキリストを抱いている画を模写した。描きながらルーマニアのことを色々教えてもらえたのがとても良かった。女の人が全員綺麗だった。さすが東欧である。レストランもあったが残念ながら閉まっていて食べられなかった。</p> - -<p>最後に知りあったルーマニア人とその辺をぶらぶらして帰ってきた。</p> -<figure> -<img src="20250420-13.jpg" alt="知り合ったルーマニア人"> -<figcaption>知り合ったルーマニア人</figcaption> -</figure> - -<p>パビリオンの展示は総じていまいちである。今回行った海外のパビリオンには特に未来っぽいものはなにもなかった。これはある意味期待通りだった。一方でルーマニアでは現地の文化も見れたし現地人との交流もできたのでよかった。他のパビリオンでもこういう交流があればいいのにと思う。国内企業のパビリオンに行けていないので次回はその辺を見たい。</p> -]]></description> -</item> -<item> -<title>着物作った</title> -<link>https://www.mtkn.jp/journal/posts/20250221.html</link> -<guid>https://www.mtkn.jp/journal/posts/20250221.html</guid> -<pubDate>Fri, 21 Feb 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>着物作った</h1> -<time>2025-02-21</time> -<p> -普段着回している着物がへたってきたので新しいのを仕立てた。楽天で見付けた真綿紬の草木染めである。中古で2640円だった。新品だとおそらく何十万のしろものである。女物だったので解いて洗濯し、男物に仕立て直した。防虫剤の臭いがひどかったが、洗濯すればおおむね取れた。</p> - -<p> -解いた布を重ねてネットに入れ、普通に洗濯する。脱水が済んだら濡れた状態でアイロンをかけてしわをとり陰干しする。絹ものだがこれで特に問題なく洗濯できた。</p> - -<p> -裏地も一緒に洗濯した。これも多分羽二重の高価なものである。ただ袷にするのは面倒なので一重にした。袖付けがなかなか上手くいかずに人形のところが皺になる。居敷当ては箪笥に眠っていた唐草模様の風呂敷を使った。</p> - -<figure> -<img src="20250221.jpg" alt="作った着物"> -</figure> - -<p> -真綿紬は初めてだが、軽くて暖かい。ほどかずに洗濯してよれよれにならなければいいのだが...</p> -]]></description> -</item> -<item> -<title>きのかわ弦楽合奏団 さくらコンサート</title> -<link>https://www.mtkn.jp/journal/posts/20250216.html</link> -<guid>https://www.mtkn.jp/journal/posts/20250216.html</guid> -<pubDate>Sun, 16 Feb 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>きのかわ弦楽合奏団 さくらコンサート</h1> -<time>2025-02-16</time> -<p>三月にコンサートあります。</p> -<figure> -<img src="20250216-1.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの表面。令和7年3月23日14:00から、旧和歌山県議会議事堂にて"> -<img src="20250216-2.jpg" alt="きのかわ弦楽合奏団のさくらコンサートのちらしの裏面。楽団と会場の紹介"> -<figcaption>Copyright: きのかわ弦楽合奏団</figucaption> -</figure> - -]]></description> -</item> -<item> -<title>謹賀新年</title> -<link>https://www.mtkn.jp/gallery/20250101.html</link> -<guid>https://www.mtkn.jp/gallery/20250101.html</guid> -<pubDate>Wed, 1 Jan 2025 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>謹賀新年</h1> -<time>2025-01-01</time> -<img src="img/20250101.jpg"> -]]></description> -</item> -<item> -<title>麻婆豆腐</title> -<link>https://www.mtkn.jp/kitchen/recipe/mapo_tofu.html</link> -<guid>https://www.mtkn.jp/kitchen/recipe/mapo_tofu.html</guid> -<pubDate>Thu, 10 Oct 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>麻婆豆腐</h1> -<time>2024-10-10</time>作成 -<figure> - <img src="../pics/mapo_tofu.jpg" alt="麻婆豆腐の画像"> - <figcaption>麻婆豆腐</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豆腐: 2丁</li> - <li>ひき肉: 300g</li> - <li>長ネギ: 1本</li> - <li>にんにく: 適量</li> - <li>生姜: 適量</li> - <li>八角: 適量</li> - <li>花椒: 好きなだけ</li> - <li>豆板醤: 好きなだけ</li> - <li>味噌: 適量</li> - <li>酒: 適量</li> - <li>濃口醤油: 適量</li> - <li>塩: 少々</li> - <li>炒め油: 多め</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>豆腐を水切りしてサイコロに切る</li> - <li>長ネギ、にんにく、生姜を刻む</li> - <li>フライパンに油をしき八角、にんにく、生姜を入れ弱火で香りを出す</li> - <li>火を強めてひき肉を入れ、塩を少しふる</li> - <li>ひき肉に色がついたらネギを入れて炒める</li> - <li>酒、濃口醤油、味噌、豆板醤で味をつける</li> - <li>水を入れてひと煮立ちさせる</li> - <li>花椒、豆腐を入れる</li> - <li>好みで、ラー油、唐辛子、山椒を好きなだけ入れる</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>我流の適当なレシピなので本場のものが良ければ陳建一さんのでも調べてほしい。</p> -<p>酒はできれば紹興酒のほうがいいと思う。味噌と一緒に豆鼓も入れていいかも。一般的にはもっと旨味を出すために中華だしやら味の素やらを入れると思うが、シンプルに辛いほうが好きなのでそういうものは入れない。陳さんは生姜を入れていなかったが僕はあっていいと思う。豆腐は塩水で茹でていたがこれは真似してもよさそう。</p> -]]></description> -</item> -<item> -<title>棚作った</title> -<link>https://www.mtkn.jp/journal/posts/20241009.html</link> -<guid>https://www.mtkn.jp/journal/posts/20241009.html</guid> -<pubDate>Wed, 9 Oct 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>棚作った</h1> -<time></time> - -<p> -自室のクローゼットが使いにくかったので引っ剥がして新しいのを作った。収納していたのはほとんど本だったのだが、奥行きが深いのに棚板が少ないので前後に並べて置いていたため、どこになんの本があるのか見にくく、取り出しにくかった。あとパソコン置き場としても使っていたが、24インチのモニターが一枚ギリギリ入る程度の幅しかなかったのでこれも拡張したかった。久しぶりに木工もしたかったので木材を買って自作した。杉を基本に、パソコンを置く場所だけ檜にした。<p> - -<figure> -<img src="20241009-1.jpg" alt="クローゼット跡地と買った木材"> -<figcaption>クローゼット跡地と買った木材</figcaption> -</figure> - -<figure> -<img src="20241009-2.jpg" alt="パソコン机の部分"> -<figcaption>パソコン机の部分</figcaption> -</figure> - -<p> -パソコン机の天板は白木のままでは寂しいので亜麻仁油を塗ってオイルフィニッシュにしてみた。結構黄色が濃くなった。</p> - -<figure> -<img src="20241009-3.jpg" alt="机のオイルフィニッシュ"> -<figcaption>机のオイルフィニッシュ。下においているのが白木のもの</figcaption> -</figure> - -<p> -せっかくやるならと思って蟻を切ってみた。適当でも案外ガッチリはまるものである。英語ではdovetailというそうだ。鳩のしっぽという意味である。日本語の蟻よりも鳩のしっぽのほうがしっくりくる気がする。</p> - -<figure> -<img src="20241009-4.jpg" alt="蟻"> -<figcaption>蟻</figcaption> -</figure> - -<p> -上に本棚をつけて完成。本棚は棚を移動しやすいようにと思い、ネジ止め式の棚受けを買った。めんどくさくなったわけではない。左下においているのはもとのクローゼットにあった引き出しである。</p> - -<figure> -<img src="20241009-5.jpg" alt="完成"> -<figcaption>完成</figcaption> -</figure> - -<p> -これを作るにあたり、大阪日本橋の刃物屋で鉋を買ってきた。これまではホームセンターで1000円ほどのものだったが、今回買ったのは8000円の物である。店主が台の仕込みと研ぎをした上で売ってくれた。きれいに切れるので小口面の直角を出すのが楽しくなった。小口を下にして自立するようになったときは結構気持ちいい。専門店での買い物は楽しい。餅は餅屋である。</p> - -]]></description> -</item> -<item> -<title>さくらクレヨン</title> -<link>https://www.mtkn.jp/gallery/20240727.html</link> -<guid>https://www.mtkn.jp/gallery/20240727.html</guid> -<pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>さくらクレヨン</h1> -<time>2024-07-27</time> -<img src="img/20240727.jpg"> -]]></description> -</item> -<item> -<title>さくらクレパス</title> -<link>https://www.mtkn.jp/gallery/20240702.html</link> -<guid>https://www.mtkn.jp/gallery/20240702.html</guid> -<pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>さくらクレパス</h1> -<time>2024-07-02</time> -<img src="img/20240702.jpg"> -]]></description> -</item> -<item> -<title>さくらクレパス</title> -<link>https://www.mtkn.jp/gallery/20240629.html</link> -<guid>https://www.mtkn.jp/gallery/20240629.html</guid> -<pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>さくらクレパス</h1> -<time>2024-06-29</time> -<img src="img/20240629.jpg"> -]]></description> -</item> -<item> -<title>さくらクレパス</title> -<link>https://www.mtkn.jp/gallery/20240628.html</link> -<guid>https://www.mtkn.jp/gallery/20240628.html</guid> -<pubDate>Tue, 30 Jul 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>さくらクレパス</h1> -<time>2024-06-28</time> -<img src="img/20240628.jpg"> -]]></description> -</item> -<item> -<title>きのかわ弦楽合奏団第7回定期演奏会</title> -<link>https://www.mtkn.jp/journal/posts/20240428.html</link> -<guid>https://www.mtkn.jp/journal/posts/20240428.html</guid> -<pubDate>Sun, 28 Apr 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>きのかわ弦楽合奏団第7回定期演奏会</h1> -<time>2024-04-28</time> - -<p>先日きのかわ弦楽合奏団というアマチュアの団体に入団しました。その定期演奏会が7月にあります。多分出演します。</p> - -<figure> -<img src="7th_concert.jpeg" alt="きのかわ弦楽合奏団の第七回定期演奏会のポスター。7月14日14:00から、かつらぎ総合文化会館、あじさいホールにて"> -<figcaption>Copyright: きのかわ弦楽合奏団</figcaption> -</figure> - -]]></description> -</item> -<item> -<title>RP2040 SDKなし2 Clock、UART</title> -<link>https://www.mtkn.jp/computer/rp2040_2.html</link> -<guid>https://www.mtkn.jp/computer/rp2040_2.html</guid> -<pubDate>Tue, 27 Feb 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>RP2040 SDKなし2 Clock、UART</h1> -<time>2024-02-22</time><br /> -<time>2024-02-27</time>: リセット解除の間違いを修正。 -<p> -今回はClockとUARTを設定してパソコンに繋ぎ、キーボードからの入力をオウム返しするプログラムを作成する。 -<p> -<p> -前回: <a href="rp2040_1.html">RP2040 SDKなしでLチカ</a><br> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a>/ex2 -</p> - -<h2>動作環境</h2> -<ul> -<li>Void Linux - <ul> - <li>cross-arm-none-eabi-binutils-2.32_2</li> - <li>GNU Make 4.4.1</li> - <li>minicom version 2.7.1</li> - </ul> -</li> -<li><a href="https://akizukidenshi.com/catalog/g/g108461/">FT234X 超小型USBシリアル変換モジュール</a> -</li> -</ul> - -<h2>Clock</h2> - -<h3>リング発振回路</h3> -<p>RP2040にはリング発振回路というのが内蔵されている。これは自分の出力を反転させようとするもので、不安定だが高速で消費電力の少ないクロックとして用いられる。RP2040は電源を入れると、このリング発振回路を動作用のクロックとして用いている。この発振回路の周波数は、チップの製造過程での誤差、動作時の電圧、動作温度によって変動するので、正確な周波数が必要な用途には向かない。</p> - -<h3>水晶発振子</h3> -<p>秋月電子通商で購入したRP2040マイコンボードには外部クロックとして、12MHzの水晶発振子が付属する。水晶発振子はリング発振回路より電力を消費するが、より正確である。</p> - -<h3>PLL</h3> -<p>水晶振動子を入力として、周波数を数倍にしたものを出力するもの。電気的な話はよく知らない。データシートの「2.18.2. Calcurating PLL parameters」によると、入力周波数を<code>FREF</code>としたときの出力周波数は<code>(FREF / REFDIV) × FBDIV / (POSTDIV1 × POSTDIV2)</code>となる。これらの変数はそれぞれ設定用のレジスタに値を保存することで変更できる。</p> - -<h2>UART</h2> -<p> -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> -<pre><code>$ minicom -D /dev/ttyUSB0 -</code></pre> -<p> -とすると接続できる。 -</p> - -<h2>main.s</h2> -<h3>初期設定</h3> -<p> -後で見るように、UARTの動作には多分水晶発振子とPLLが必要なので、まずはそれを設定する。起動後、メインのプログラムが読み込まれるまでの<code>boot2</code>は前回と同じものである。<code>main.s</code>ではまず前回と同様に初期スタックポインタとエントリーポイントを定義する: -</p> -<pre><code> .section .vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) // entry point -</code></pre> -<p> -続いて利用するサブシステムのリセットを解除する。PLLとUARTが追加されている。今回使うUARTはUART0だけである。なお、UARTはclock_periが有効化されるまでリセット状態の解除が完了しないようなので、unreset_chkからは外してある:</p> -<pre><code> .section .text -reset: - // unreset gpio, pll_sys, uart0 - ldr r0, =(1 &lt;&lt; 22 | 1 &lt;&lt; 12 | 1 &lt;&lt; 5) // uart0 | pll_sys | io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET - mov r1, #1 - lsl r1, #22 - bic r0, r1 // uart stays in reset state until clock_peri is enabled -unreset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - bic r0, r1 - bne unreset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの設定</h3> -<p> -次にGPIOの役割を設定する。前回はLEDを点滅させるためにGPIO25をSIOに設定したが、今回はGPIO0とGPIO1をUART0にする: -</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #2 // uart0 - mov r1, #0x4 - str r0, [r3, r1] // IO_BANK0: GPIO0_CTRL - mov r1, #0xc - str r0, [r3, r1] // IO_BANK0: GPIO1_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>Clockの設定</h3> -<p> -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>で、 -</p> -<pre><code>#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER) -</code></pre> -<p> -と定義されている(PICO_XOSC_STARTUP_DELAY_MULTIPLIERは1)。とりあえず47に設定しているが、試しに0や1にしても動いた。よくわからん。</p> -<p> -待ち時間を設定したら発振子を起動する。XOSC: CTRLに起動用のコマンド的なものを入力し、周波数が安定するのを待つ。</p> -<p> -以上を実装したのが以下のコード: -</p> -<pre><code> // setup xosc - ldr r3, xosc_base - mov r0, #47 // start up delay for 12MHz rosc (xosc?) - str r0, [r3, #0xc] // XOSC: STARTUP - ldr r0, =(0xfab &lt;&lt; 12 | 0xaa0) - str r0, [r3, #0] // XOSC: CTRL -wait_xosc: - ldr r0, [r3, #0x4] // XOSC: STATUS - lsr r0, r0, #31 // STABLE bit - beq wait_xosc - -/* ... */ - -xosc_base: - .word 0x40024000 -</code></pre> - -<h3>PLLの設定</h3> -<p> -水晶発振子が起動できたので、次にPLLを設定する。CPUが133MHzまで対応しているので133MHzになるようにした。</p> -<p> -PLLは入力となる振動(ここでは水晶発振子の振動)を加工して周波数を上げたり下げたりする。出力の周波数は以下の式で決まる: -</p> -<pre>(FREF / REFDIV) * FBDIV / (POSTDIV1 * POSTDIV2)</pre> -<p> -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つの値の差が大きい方がいいと書いている)。 -</p> -<p> -PLL設定の手順は、FBDIVの設定、PLLとVCOの起動、VOCが安定するまで待機、POSTDIV1とPOSTDIV2の設定、Post Dividerの起動、そして最後にシステムとUARTのクロックを今設定したPLLに変更、である。以上を実装したのが以下のコード: -</p> -<pre><code> // setup pll_sys 133MHz - ldr r3, pll_sys_base - // set feedback divider - mov r0, #133 - str r0, [r3, #0x8] // PLL: FBDIV_INT - // power on pll and vco - ldr r0, =(1 &lt;&lt; 5 | 1) // VCOPD | PD - ldr r1, atomic_clr - add r1, r1, #0x4 - str r0, [r3, r1] // PLL: PWR - // wait vco to lock -wait_vco: - ldr r0, [r3, #0] // PLL: CS - lsl r0, r0, #31 - beq wait_vco - // setup post dividers - ldr r0, =(4 &lt;&lt; 16 | 3 &lt;&lt; 12) - str r0, [r3, #0xc] // PLL: PRIM - // power on post divider - mov r0, #8 // POSTDIVPD - str r0, [r3, r1] // PLL: PWR - - // set system clock clksrc_pll_sys - ldr r3, clocks_base - ldr r0, =(0x0 &lt;&lt; 5 | 0x1) - str r0, [r3, #0x3c] // CLOCKS: CLK_SYS_CTRL - // enable clk_peri - mov r0, #1 - lsl r0, r0, #11 - str r0, [r3, #0x48] // CLOCKS: CLK_PERI_CTRL - -/* ... */ - -atomic_clr: - .word 0x00003000 -clocks_base: - .word 0x40008000 -pll_sys_base: - .word 0x40028000 -</code></pre> - -<h3>UARTの設定</h3> -<p> -データシートによるとUART設定の手順は以下の通り: -</p> -<ul> -<li>リセットの解除</li> -<li>clock_periの設定</li> -<li>UARTの有効化</li> -<li>FIFOの有効化</li> -<li>転送速度の設定</li> -<li>フォーマットの設定</li> -</ul> -<p> -上の2つは既に終えている。残りの部分はこの順番どおりに設定しても動かなかった。C言語で書かれたサンプルを見ると、クロックを設定した後、転送速度の設定、UARTの有効化、FIFOの有効化の順になっている。そのとおりにすると動いた。理由はよく理解していないが、変数を設定してから起動するほうが素直ではある。</p> -<p> -転送速度はminicomのデフォルトである115200 baudに設定する。データシート「4.2.7.1. Baud Rate Calculation」の計算式において、クロック周波数を125MHzから133MHzに変えて計算して、BRDI=72、BDRF=0.157(=10/64)となる。この数値をUART: UARTIBRD、UART: UARTFBRDレジスタにそれぞれ代入する。 -</p> -<p> -UARTの有効化はUART: UARTCRレジスタのUARTENビットをセットすることで行う。C言語のサンプルでは同じレジスタのRXE、TXEビットもセットしているが、この2つはもともと1になっているのでほっといてよさそう。</p> -<p> -FIFOの有効化はUART: UARTLCR_HレジスタのFENビットをセットすることで行う。また、同じレジスタの他のビットで、データーのフォーマットを設定できる。ここではminicomのデフォルトに合わせてWLENを8bitにする。</p> -<p> -以上をまとめると以下のようになる: -</p> -<pre><code> // setup uart0 - ldr r3, uart0_base - // set baudrate 115200 - // BDRI = 72, BDRF = 0.157 (10 / 64) - mov r0, #72 - str r0, [r3, #0x24] // UART: UARTIBRD - mov r0, #10 - str r0, [r3, #0x28] // UART: UARTFBRD - // enable uart0 - mov r0, #1 // UARTEN - ldr r1, atomic_set - add r1, r1, #0x30 - str r0, [r3, r1] // UART: UARTCR - // enable FIFO and set format - ldr r0, =(3 &lt;&lt; 5 | 1 &lt;&lt; 4) // WLEN = 8, FEN = 1 - str r0, [r3, #0x2c] // UART: UARTLCR_H - -/* ... */ - -atomic_set: - .word 0x00002000 -uart0_base: - .word 0x40034000 -</code></pre> - -<h3>UARTの入出力</h3> -<p> -設定が終わったので実際にUARTの入出力を処理するコードを書く。まずUARTからの出力は、出力したいバイトをUART: UARTDRに書き込むことで行う。その際、書き込まれたデータは一時的に出力用FIFOに保持されるので、このFIFOが満杯でないことを確認する必要がある。FIFOの状態はUART: UARTFRレジスタで確認できる。このレジスタのTXFFの値が1であればデータを書き込めないので、0になるまで待機する。関数名は<code>putbyte</code>にした。また出力したいデータは<code>r0</code>レジスタにの下位8ビットに入れられているものとした。書き込めるデーターは8ビットだけなので、<code>0xff</code>と論理積をとってから書き込んでいる: -</p> -<pre><code>putbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #5 // TXFF -txff: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne txff - mov r1, #0xff - and r0, r0, r1 - str r0, [r3, #0] // UART: UARTDR - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> - -<p> -入力はUART: UARTDRの下位8ビットを読むことで得られる。UARTからの入力は、一時的に入力用FIFOに保存される。このFIFOが空の状態でデータを読んでも意味がないので、FIFOが空でないことを確認する必要がある。これはUART: UARTFRレジスタのRXFEを読むことで確認できる。本来は入力があったときに割り込みを発生させて、それまではCPUを休ませるか別の処理をさせておくべきだが、とりあえずここではループでFIFOの状態を確認し続けている。関数名は<code>getbyte</code>にした。 -読み込んだデータは<code>r0</code>レジスタに保存している:</p> -<pre><code>getbyte: - ldr r3, uart0_base - mov r1, #1 - lsl r1, r1, #4 // RXFE -rxfe: - ldr r2, [r3, #0x18] // UART: UARTFR - tst r1, r2 - bne rxfe - ldr r0, [r3, #0] // UART: UARTDR - mov r1, #0xff - and r0, r0, r1 - bx lr - -/* ... */ - -uart0_base: - .word 0x40034000 -</code></pre> -<p> -あとはこの2つの関数をループの中で交互に呼び出せば、オウム返しするだけのプログラムが完成する: -</p> -<pre><code>loop: - bl getbyte - bl putbyte - b loop -</code></pre> - -<h2>リング発振回路でUARTは動くんかな?</h2> -<p>UARTの通信には正確なクロックが必要である。その為上では<code>clk_peri</code>として水晶発振子とPLLを用いた。ところがpico-examplesのhello_uartでは<code>main()</code>関数で水晶発振子を設定していない。そこでリング発振回路を用いてみたのだが、どうもうまく通信できない。出力されている正確な周波数も分からないのであきらめることにした。オシロスコープなんていうものは持っていない。</p> - -<h3>pico-sdk</h3> -<p> -ところがどうも調べているとSDKを使った場合、デフォルトではクロック周波数は125MHzになっているらしい。どうやら水晶発振子もPLLも<code>main()</code>が呼ばれる前に設定されているようである。</p> -<p> -pico-examplesのサンプルプログラムはビルドすると自動で逆アセンブリしたファイルを出力してくれる。これを見ると、最初の256バイトは前回説明したboot2のコードで、その後ろにベクターテーブルが続く。ベクターテーブルの最初は初期スタックポインタで、<code>0x20042000</code>になっている。次はエントリーポイントで、<code>0x100001f7</code>である:</p> -<pre><code>10000100 &lt;__VECTOR_TABLE&gt;: -10000100: 20042000 .word 0x20042000 -10000104: 100001f7 .word 0x100001f7 -</code></pre> -<p> -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ではユーザープログラムの一部として組み込んでるんかな? -</p> -<pre><code>100001f6 &lt;_reset_handler&gt;: -100001f6: 481d ldr r0, [pc, #116] ; (1000026c &lt;hold_non_core0_in_bootrom+0xe&gt;) -100001f8: 6800 ldr r0, [r0, #0] -100001fa: 2800 cmp r0, #0 -100001fc: d12f bne.n 1000025e &lt;hold_non_core0_in_bootrom&gt; -</code></pre> -<p>上のコードの最初の<code>ldr</code>は、<code>0xd0000000</code>(M0PLUS: CPUIDレジスタ)をロードしている。最後の飛び先<code>0x1000025e</code>はCPUIDが<code>1</code>のCPUを待機させる処理である:</p> -<pre><code>1000025e &lt;hold_non_core0_in_bootrom&gt;: -1000025e: 4809 ldr r0, [pc, #36] ; (10000284 &lt;hold_non_core0_in_bootrom+0x26&gt;) -10000260: f001 fb9c bl 1000199c &lt;rom_func_lookup&gt; -10000264: 4700 bx r0 -10000266: 0000 .short 0x0000 -/* ... */ -10000284: 00005657 .word 0x00005657 -</code></pre> -<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> -<pre><code>$ find pico-sdk/src -type f | xargs grep -l _reset_handler -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -</code></pre> -<p>このファイルによると: -</p> -<pre><code> // Only core 0 should run the C runtime startup code; core 1 is normally - // sleeping in the bootrom at this point but check to be sure -</code></pre> -<p>だそうである。やっぱり無駄やん。内蔵フラッシュのプログラムにバグがあってもこのコードのせいで見付かりにくくなってない?知らんけど。</p> - -<p>続いて<code>.data</code>領域と<code>.bss</code>領域のコピー、初期化のようである。多分OSの本かなんかで習ったメモリマップの話:</p> -<pre><code>100001fe: a40d add r4, pc, #52 ; (adr r4, 10000234 &lt;data_cpy_table&gt;) -10000200: cc0e ldmia r4!, {r1, r2, r3} -10000202: 2900 cmp r1, #0 -10000204: d002 beq.n 1000020c &lt;_reset_handler+0x16&gt; -10000206: f000 f812 bl 1000022e &lt;data_cpy&gt; -1000020a: e7f9 b.n 10000200 &lt;_reset_handler+0xa&gt; -1000020c: 4918 ldr r1, [pc, #96] ; (10000270 &lt;hold_non_core0_in_bootrom+0x12&gt;) -1000020e: 4a19 ldr r2, [pc, #100] ; (10000274 &lt;hold_non_core0_in_bootrom+0x16&gt;) -10000210: 2000 movs r0, #0 -10000212: e000 b.n 10000216 &lt;bss_fill_test&gt; - -10000214 &lt;bss_fill_loop&gt;: -10000214: c101 stmia r1!, {r0} - -10000216 &lt;bss_fill_test&gt;: -10000216: 4291 cmp r1, r2 -10000218: d1fc bne.n 10000214 &lt;bss_fill_loop&gt; -</code></pre> - -<p>最後にいろいろ呼びだす:</p> -<pre><code>1000021a &lt;platform_entry&gt;: -1000021a: 4917 ldr r1, [pc, #92] ; (10000278 &lt;hold_non_core0_in_bootrom+0x1a&gt;) -1000021c: 4788 blx r1 -1000021e: 4917 ldr r1, [pc, #92] ; (1000027c &lt;hold_non_core0_in_bootrom+0x1e&gt;) -10000220: 4788 blx r1 -10000222: 4917 ldr r1, [pc, #92] ; (10000280 &lt;hold_non_core0_in_bootrom+0x22&gt;) -10000224: 4788 blx r1 -10000226: be00 bkpt 0x0000 -10000228: e7fd b.n 10000226 &lt;platform_entry+0xc&gt; -/* ... */ -10000278: 10001819 .word 0x10001819 -1000027c: 100002dd .word 0x100002dd -10000280: 10001909 .word 0x10001909 -</code></pre> -<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> -<pre><code>$ find pico-sdk/src -type f | xargs grep -l runtime_init -pico-sdk/src/rp2_common/pico_runtime/runtime.c -pico-sdk/src/rp2_common/pico_standard_link/crt0.S -pico-sdk/src/common/pico_sync/include/pico/mutex.h -</code></pre> -<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> -<pre><code> clock_configure(clk_peri, - 0, - CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS, - 125 * MHZ, - 125 * MHZ); -</code></pre> -<p>やっぱり水晶発振子じゃないとあかんのかな。</p> - -<h2>CMake</h2> -<p>上ではビルドしたバイナリを逆アッセンブルして読んだ。わざわざこんなことをしなくてもMakefile読めばなにがどうなって最終生成物に辿りつくのか分かればいいのだが、そうもいかない。このSDKとpico-examplesにはビルドシステムとしてCMakeなるものが使われている。これがどうも複雑でよく分からない。勉強する気にもならん。上で見た<code>crt0.S</code>や<code>runtime.c</code>といったファイルも<code>hello_uart</code>で本当に使われているものなのかもよく分からない。こんな煩雑なものは本当に必要なのかな。無駄に複雑にしてるだけとちゃうんかな。特に僕は勉強用に使ってるので、ソースコードの依存関係をもっと分かりやすくしてくれないと、内部でなにがどうなってるのか理解しにくい。何度か頑張って読もうとしたが、面白くないのでやめた。数百行のファイルをあっちからこっちから<code>include</code>してるし、大文字ばかりの変数だらけで目が痛い。こんなものを扱えるというのはえらいええ頭してはるんやね。</p> - - -<h2>参考</h2> -<ul> -<li> -<a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -<a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -<a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -<li> -<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> -</li> -<li> -<a href="https://www5.epsondevice.com/ja/information/technical_info/osc.html">水晶発振器とは? 原理と仕組み、水晶振動子との違い、選び方のポイントを解説.エプソン水晶デバイス</a> -</li> -</ul> -]]></description> -</item> -<item> -<title>RP2040 SDKなしでLチカ</title> -<link>https://www.mtkn.jp/computer/rp2040_1.html</link> -<guid>https://www.mtkn.jp/computer/rp2040_1.html</guid> -<pubDate>Sun, 25 Feb 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>RP2040 SDKなしでLチカ</h1> -<time>2023-04-25</time>: 作成<br /> -<time>2024-02-25</time>: ベクターテーブルの修正 - -<h2>はじめに</h2> -<p> -パタヘネのRISC-V<sup>[1]</sup>版を買って一通り読んだらアセンブリ言語で組込のプログラミングがしたくなった。RISC-Vのマイコンボードが欲しかったのだが、安くていい感じのものが見付からなかった。代わりに秋月電子通商でArmのものがあった。RP2040マイコンボードキット<sup>[2]</sup>というものである。ウェブ上の情報も多く、データシート<sup>[3]</sup>もしっかりしていそうなので、とりあえずこれを買ってみた。</p> -<p> -一般的にはSDK<sup>[4]</sup>をダウンロードしてあらかじめ用意されたライブラリを使って開発するようだが、これはビルドシステムとしてcmakeというのを使っている。これがOpenBSDでは何かエラーがでて動かなかった。僕はこういう便利ツールが嫌いだ。どうせ使わんからいいんやけど。関係ないけど途中から開発環境がLinuxに替わった。SDKには便利な関数がたくさん用意されているので楽である。ハードウェアの面倒な部分がプログラマから見えないようにしているからである。しかし今回はその面倒な部分に触れてみたくて買ったので、SDKを使うと意味がない。</p> -<p> -ということでSDKなしで開発してみる。とりあえず定番のLチカをば。</p> -<p> -ソースコード: <a href="https://git.mtkn.jp/rp2040">git</a> -</p> - -<h2>動作環境</h2> -<ul> -<li>Arch Linux 6.2.12-arch1-1 - <ul> - <li>arm-none-eabi-binutils 2.40-1</li> - <li>GNU Make 4.4.1</li> - </ul> -</li> -<li>OpenBSD 7.3 - <ul> - <li>arm-none-eabi-binutils 2.31.1</li> - <li>make (バージョン?)</li> - </ul> -※<code>make flash</code>は動かん。<code>dmesg</code>でデバイス確認して手動でマウントする必要がある。 -</li> -</ul> - -<h2>Boot Process</h2> -<p> -RP2040は電源を入れるといくつかの段階(ここでは関係ないので省略。データシート「2.8.1 Processor Controlled Boot Sequence」に詳しく書いてある)を踏んだあと、外部のフラッシュROMの先頭から256バイトを内部のSRAMにコピーして、フラッシュにプログラムが書き込まれているかどうか確認する。RP2040はフラッシュの先頭252バイトから計算したCRC32チェックサムを、直後の253バイト目から256バイトに記録することになっている。起動時にこのチェックサムを確認することで、フラッシュにプログラムが書き込まれているかどうか確かめている。コピーした最後の4バイトと起動時に最初の252バイトから計算したチェックサムが一致していれば、そのままコピーしてきた256バイトの先頭にPCをセットして実行を開始する。一致しなければUSBデバイスモードに切り替わり、パソコンに接続するとストレージとして認識される。このストレージにUF2という形式に変換したプログラムをコピーするとプログラムがフラッシュROMやSRAMに書き込まれる。 -</p> -<p> -以上のことから、プログラムを実行するためにはCRC32を計算し、UF2という形式に変換することが必要である。ソースコードからの流れは以下の通り: -</p> -<pre>source bin bin with -code ----------&gt; object ------&gt; elf --------&gt; bin -------&gt; with --------&gt; crc32 in - crc32 uf2 format - assemble link objcopy bincrc bin2uf2 -</pre> - -<h2>CRC(巡回冗長検査)</h2> -<p> -入力のデータをごにょごにょしてある値を出力する。</p> -<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"> -<p> -データ転送等に伴う偶発的な誤りの検査によく使われている<sup>[5]</sup>。 -</p> -</blockquote> -<p> -らしい。 -</p> -<p> -入力のビットを一列に並べて、除数で「割り算」していく。この「割り算」が多項式の除算に似ているので、この除数をCRC多項式というらしい。ただし多項式の除算と違い、引き算するところをXORする。CRC32の場合、除数は33ビットである。33ビットで割ると32ビットの余りが残る。この余りがCRC32のチェックサムである。除数は色々あるようだが、標準的なものがWikipedia<sup>[5]</sup>に列挙されている。除数<code>1011</code>を使ったCRC3の計算の手順は以下の通り: -</p> -<pre><code>1110101011011100110101101101111 入力(適当) -1011 除数(4ビット) -------------------------------- - 101101011011100110101101101111 結果(入力と除数のXOR) - 1011 - ------------------------------ - 00001011011100110101101101111 - 1011 - ------------------------- - 000011100110101101101111 - 1011 - -------------------- - 1010110101101101111 - 1011 - ------------------- - 001110101101101111 - 1011 - ---------------- - 101101101101111 - 1011 - --------------- - 00001101101111 - 1011 - ---------- - 110101111 - 1011 - --------- - 11001111 - 1011 - -------- - 1111111 - 1011 - ------- - 100111 - 1011 - ------ - 01011 - 1011 - ---- - 000 CRC3チェックサム -</code></pre> -<p> -普通の割り算と基本は同じであるが、引き算の部分だけXORになっている。</p> -<p> -以上の計算をプログラムの先頭252バイトに対して、33ビットの除数を用いて行う。データの並べ方は、上の例において左側を先頭に、フラッシュROM上の0番地から、各バイトは最上位ビットから順に並べる。入力のデータは253バイト目から256バイト目に<code>0</code>をひっつけて計算する。これは多分予め長さが分からないデータでも計算できるようにしたかったからかな。除数は<code>0x104c11db7</code>である(最上位ビットは常に1なのでデータシートでは省略されている)。</p> -<p> -入力データは1バイトづつ処理したいみたいである。多分通信等で使う都合である。この時XORは結合則が成り立つので1バイト処理した結果と次のバイトとをXORして次の処理の入力として利用することができる: -</p> -<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) -|......| -111000110000000000000000000000000 先頭1バイト -100000100110000010001110110110111 除数 ------------------------------------------------------------------------- -011000010110000010001110110110111 - 100000100110000010001110110110111 - ----------------------------------------------------------------------- - 010000001010000110010011011011001 - 100000100110000010001110110110111 - ---------------------------------------------------------------------- - 000000110010001110101000000000101 -|......| - 110010001110101000000000101000000 1バイト目の結果 - |......| - 10000001 入力の2バイト目 - ---------------------------------------------------------------- - 010010011110101000000000101000000 1バイト目の結果と2バイト目のXOR - 100000100110000010001110110110111 除数 - ---------------------------------------------------------------- - 000100011011010010001111100110111 - . - . - . -</code></pre> -<p> -以上の操作は以下のようなアルゴリズムのループで実装できる。</p> -<ul> -<li>前回の結果と、入力データの次のバイトをXOR</li> -<li> - <ul> - <li>先頭の1ビットが1の場合、除数とXORを取り左シフト</li> - <li>先頭の1ビットが0の場合、そのまま左シフト</li> - </ul> -</li> -</ul> -<p> -これを<code>for</code>ループで回す都合上、最初のバイトもXORを取る。上の例では最初は<code>0x0</code>とXORを取っているが、この値を<code>0x0</code>以外にすることもできる。そうした方がいろいろいいこともあるらしい。RP2040では<code>0xffffffff</code>を使う。更にこの工程を32ビットの<code>int</code>だけで行うことを考える: -</p> -<pre><code>111000111000000110000110111000111000001010010011111000111000000110010011 入力(適当) - -11111111111111111111111111111111 0xffffffff -11100011000000000000000000000000 先頭1バイトを24ビットシフト --------------------------------- XOR -00011100111111111111111111111111 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00111001111111111111111111111110 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01110011111111111111111111111100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -11100111111111111111111111111000 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -11001111111111111111111111110000 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -11001011001111101110001001000111 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -10010110011111011100010010001110 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -10010010101111001101100100111001 -先頭1ビットが1なので1ビットシフトした後、除数の下位32ビットとXOR: -00100101011110011011001001110010 シフト -00000100110000010001110110110111 除数の下位32ビット --------------------------------- XOR -00100001101110001010111111000101 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -01000011011100010101111110001010 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -10000110111000101011111100010100 1バイト目の結果 - -10000001 入力の2バイト目 --------------------------------- XOR -00000111111000101011111100010100 -先頭1ビットが0なので1ビットシフト --------------------------------- シフト -00001111110001010111111000101000 -. -. -. -</code></pre> -<p> -これを実装したのが以下のコード:</p> -<pre><code>uint32_t -crc32(uint8_t *idata, size_t len) -{ - uint32_t pol = 0x04C11DB7; - uint32_t c = 0xFFFFFFFF; - uint32_t b; - - for (int i = 0; i &lt; len; i++) { - b = idata[i] &lt;&lt; 24; - c ^= b; - for (int j = 0; j &lt; 8; j++) { - c = c &gt;&gt; 31 & 1 ? c &lt;&lt; 1 ^ pol : c &lt;&lt; 1; - } - } - - return c; -} -</code></pre> -<p> -<code>main()</code>関数では上の<code>crc32()</code>に、<code>idata</code>として入力となるバイナリデータの先頭を、<code>len</code>として<code>252</code>を渡してCRC32を計算させる。その後、出力先のファイルに入力元のデータをコピーしていき、253バイト目から256バイト目だけ、計算したCRC32に置き換える。入力元のこの場所にデータが書き込まれていないかどうかは確かめていない。 -</p> - -<h2>UF2(USB Flashing Format)</h2> -<p> -Microsoftが開発したフラッシュ書き込み用のファイル形式らしい: -<blockquote cite="https://github.com/microsoft/uf2"> -<p> -UF2 is a file format, developed by Microsoft for PXT (also known as -Microsoft MakeCode), that is particularly suitable for flashing microcontrollers -over MSC (Mass Storage Class; aka removable flash drive)<sup>[6]</sup>. -</p> -</blockquote> -<p> -このファイルに変換する上で必要な情報はGitHubのmicrosoft/uf2<sup>[6]</sup>に表として纏められている: -<blockquote cite="https://github.com/microsoft/uf2"> -<table> -<thead><tr> -<th>Offset</th><th>Size</th><th>Value</th> -</tr></thead> -<tbody> -<tr> -<td>0</td> -<td>4</td> -<td>First magic number, <code>0x0A324655</code> (<code>"UF2\n"</code>)</td> -</tr> -<tr> -<td>4</td> -<td>4</td> -<td>Second magic number, <code>0x9E5D5157</code></td> -</tr> -<tr> -<td>8</td> -<td>4</td> -<td>Flags</td> -</tr> -<tr> -<td>12</td> -<td>4</td> -<td>Address in flash where the data should be written</td> -</tr> -<tr> -<td>16</td> -<td>4</td> -<td>Number of bytes used in data (often 256)</td> -</tr> -<tr> -<td>20</td> -<td>4</td> -<td>Sequential block number; starts at 0</td> -</tr> -<tr> -<td>24</td> -<td>4</td> -<td>Total number of blocks in file</td> -</tr> -<tr> -<td>28</td> -<td>4</td> -<td>File size or board family ID or zero</td> -</tr> -<tr> -<td>32</td> -<td>476</td> -<td>Data, padded with zeros</td> -</tr> -<tr> -<td>508</td> -<td>4</td> -<td>Final magic number, <code>0x0AB16F30</code></td> -</tr> -</tbody> -</table> -</blockquote> - -<p> -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バイト目にブロックの通し番号と総数をそれぞれ書き込めばいい。ブロックの通し番号はデータのついでに書き込めるが、総数はデータを全部さばいた後でないと分からないので、最後全てのブロックにまとめて書き込むようにした。できたのが以下のコード: -</p> -<pre><code>#include &lt;stdio.h&gt; -#include &lt;stdint.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;string.h&gt; - - -size_t -fwrite32l(uint32_t d, FILE *f) -{ - int i; - uint8_t b; - for (i = 0; i &lt; 32; i += 8) { - b = (uint8_t) (d &gt;&gt; i & 0xff); - fwrite(&amp;b, 1, 1, f); - if (ferror(f)) { - fprintf(stderr, "Fwrite32l: write error.\n"); - return 0; - } - } - return 4; -} - -int -main(int argc, char *argv[]) -{ - FILE *src = NULL, *dst = NULL; - size_t sdata = 476; - int retnum = 0; - - uint32_t mag1 = 0x0A324655; - uint32_t mag2 = 0x9E5D5157; - uint32_t flags = 0x00002000; // familyID present - uint32_t addr = 0x10000000; - uint32_t nbyte = 256; - uint32_t blk = 0; - uint32_t nblk = 0; - uint32_t famid = 0xe48bff56; - uint8_t data[sdata]; - uint32_t mag3 = 0x0AB16F30; - - memset(data, 0, sdata); - - if (argc != 3) { - fprintf(stderr, "Usage: %s src dst\n", argv[0]); - exit(1); - } - - if ((src = fopen(argv[1], "rb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[1]); - retnum = 1; - goto defer; - } - if ((dst = fopen(argv[2], "wb")) == NULL) { - fprintf(stderr, "Could not open %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - while (!feof(src)) { - fwrite32l(mag1, dst); - fwrite32l(mag2, dst); - fwrite32l(flags, dst); - fwrite32l(addr, dst); - fwrite32l(nbyte, dst); - fwrite32l(blk, dst); - fwrite32l(nblk, dst); // dummy - fwrite32l(famid, dst); - - fread(data, 1, nbyte, src); - if (ferror(src)) { - fprintf(stderr, "Read error: %s.\n", argv[1]); - retnum = 1; - goto defer; - } - fwrite(data, 1, sdata, dst); - if (ferror(src)) { - fprintf(stderr, "Write error: %s.\n", argv[2]); - retnum = 1; - goto defer; - } - - fwrite32l(mag3, dst); - - addr += nbyte; - blk++; - nblk++; - } - - for (int i = 0; i &lt; nblk; i++) { - if (i == 0) - if (fseek(dst, 24, SEEK_SET) &lt; 0) { - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - fwrite32l(nblk, dst); - if (i &lt; nblk - 1) - if(fseek(dst, 512 - 4, SEEK_CUR) &lt; 0){ - fprintf(stderr, "Seek error: %s.\n argv[2]"); - retnum = 1; - goto defer; - } - } - -defer: - if (src) - fclose(src); - if (dst) - fclose(dst); - return retnum; -} -</code></pre> -<p><code>fwrite32l()</code>関数は指定されたファイルに32ビットの整数を下位バイトから順に書き込む関数である。バイトオーダーとかややこしそうなので作っておいたけど必要なのかな?あと名前が気に入らない。</p> -<p> -CRC32のチェックサムが書き込まれたバイナリファイルを、このプログラムでUF2に変換し、生成されたファイルをUSBストレージとして接続したRP2040にコピーすればフラッシュROMに書き込まれる。 -</p> - -<h2>Flash Second Stage</h2> -<p> -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にデータをコピーすることなく命令を実行できるので、速くて便利だという。 -</p> -<p> -しかしこのSSIコントローラはSynopsysという会社のDW_apb_ssiというIPを使っているようで、データシートのSSIコントローラの章は多分Synopsysの人が書いている。その他の章はRaspberry Pi財団の書いたブリティッシュイングリッシュだが、この部分だけ多分ネイティブじゃない人の書いたいい加減な英語である。誤植も多い。何日かかけて理解しようとしたがよく分からん。不毛なので一旦諦めた。</p> -<p> -RP2040には内部にもROMがあり、はバージョン情報や電源を投入した時の動作、その他便利な関数が書き込まれている。この関数の中に外部のフラッシュROMとSSIコントローラを設定するものも含まれているので、今回はこれを利用した。ただしこの方法だとフラッシュROMとの通信方式がStandard SPIのままなので少し遅いらしい。詳しくはデータシートの「2.3.8. Bootrom Contents」を参照。 -</p> -<p> -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モードになる: -</p> -<pre><code>setup_xip: - ldr r3, rom_base - - ldrh r0, [r3, #0x14] // rom_func_table - ldr r1, =('C' | 'X' &lt;&lt; 8) // _flash_enter_cmd_xip() - ldrh r2, [r3, #0x18] // rom_table_lookup - blx r2 - blx r0 -/* ... */ -rom_base: - .word 0x00000000 -</code></pre> - -<p> -XIPの設定が完了すれば、次はメインのプログラムを実行するための準備である。エントリーポイントの指定、スタックポインタの初期値の設定、ベクターテーブルの設定である。Armのマニュアル<sup>[7]</sup>によると、初期スタックポインタとエントリーポイントはベクターテーブルの<code>0x0</code>バイト目と<code>0x4</code>バイト目に書くことになっている:</p> -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/Exception-number-definition"> -<table> -<caption> -Table 7.3. Exception numbers -</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> -</table> -</blockquote> - -<blockquote cite="https://developer.arm.com/documentation/ddi0419/c/System-Level-Architecture/System-Level-Programmers--Model/ARMv6-M-exception-model/The-vector-table"> -<table> -<caption> -Table 7.4. Vector table format -</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> -</table> -</blockquote> -<p> -RP2040のベクターテーブルはM0PLUS: VTOR(<code>0xe0000000 + 0xed08</code>)というレジスタに書き込むことで設定する。このとき、下位8ビットは0にしないといけないので、ベクターテーブルの位置は256バイトでアラインする必要がある。ベクターテーブルの定義は<code>main.s</code>に書き、<code>boot2.s</code>からはラベルを使ってアクセスすることにする。以上をまとめると以下のコードになる:</p> -<pre><code> ldr r0, =vectors - ldr r1, m0plus_vtor - str r0, [r1, #0] // vector table - ldr r1, [r0, #4] // entry point - ldr r0, [r0, #0] // stack pointer - mov sp, r0 - bx r1 - -/* ... */ - -m0plus_vtor: - .word 0xe0000000 + 0xed08 -</code></pre> -<p>なお以上のコードは<code>.boot2</code>という名前のセクションにしてある。 -</p> - -<h2>メインのコード(<code>main.s</code>)</h2> - -<h3>ベクターテーブル</h3> -<p> -上で説明したように、ベクターテーブルのアドレスは256バイトの境界にないといけないが、<code>boot2.s</code>をフラッシュの最初の256バイトに配置しており、<code>main.s</code>はその直後から始まるようにリンクする。そのためメインのコードの最初にベクターテーブルを配置すればいい。ここでは割り込みの処理は考えないので、初期スタックポインタとエントリーポイントだけである。初期スタックポインタはSRAMの最後?(<code>0x20040000</code>)、エントリーポイントはエントリーポイントのラベルを用いて設定した。また、別のファイル(<code>boot2.s</code>)からアクセスしたいので、<code>.global</code>宣言をつけておく: -</p> -<pre><code> .global vectors -vectors: - .word 0x20040000 // initial SP - .word (reset+1) -</code></pre> -<p> -<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> - -<h3>GPIOの設定</h3> -<p> -電源投入直後、RP2040の周辺機器はリセット状態になっている。まずは今回利用するGPIOのリセット状態を解除する必要がある。データシートの「2.14. Subsystem Resets」には以下のように書かれている: -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -Every peripheral reset by the reset controller is held in reset at power-up. -It is up to software to deassert the reset of peripherals it intends to use. -</p> -</blockquote> -<p> -リセット状態を解除するには、RESETS_BASE(<code>0x4000c000</code>)から<code>0x0</code>バイト目のRESETS: RESETレジスタのうち利用したい周辺機器のビットを<code>0x0</code>にすればいい。 -GPIOはIO Bank 0なので(これ明記されてなくない?)、RESETS: RESETレジスタのIO_BANK0(5番ビット)を<code>0x0</code>にする。 -</p> -<h4>レジスタのアトミックなクリア</h4> -<p> -RESETS: RESETレジスタのうち5番ビットだけを<code>0x0</code>にしたい。この時、まずこのレジスタを読み込んでから<code>~(1 &lt;&lt; 5)</code>と論理積を取って同レジスタに書き戻してもいいのだが、RP2040にはこれを一回の<code>str</code>でしかもアトミックにできる機能が用意されている。今回の場合アトミックかどうかは関係ないと思うけど。</p> -<p> -各レジスタには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> -<h4>リセット状態の確認</h4> -<p>リセットの解除はすぐに完了するわけではないようである。リセットの解除が完了したかどうか確認するにはRESETS: RESET_DONEレジスタ(RESETS_BASEから<code>0x8</code>バイト目)の該当するビット(ここでは5番目のビット)を読む。この値が<code>0x1</code>であればリセットの解除が完了している。<code>0x0</code>であれば処理が進行中なので<code>0x1</code>が返ってくるまで繰り返し読み込んで<code>0x0</code>になるまで待機する。ところでこのレジスタはリセットの解除が完了したかどうか確かめるものなので、RESET_DONEという名前はどうなん? -<p> -以上から、GPIOのリセットを解除するのは以下のコード: -</p> -<pre><code>reset: - // unreset gpio - mov r0, #1 - lsl r0, r0, #5 // io_bank0 - ldr r3, resets_base - ldr r1, atomic_clr - str r0, [r3, r1] // RESETS: RESET -reset_chk: - ldr r1, [r3, #0x8] // RESETS: RESET_DONE - tst r0, r1 - beq reset_chk - -/* ... */ - -atomic_clr: - .word 0x00003000 -resets_base: - .word 0x4000c000 -</code></pre> - -<h3>GPIOの機能の選択</h3> -<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> -<p> -GPIO25番の機能を選択するにはIO_BANK0_BASE(<code>0x40014000</code>)から<code>0xcc</code>番目のGPIO25_CTRLレジスタの下位5ビットに、該当する機能の番号を書き込めばいい。データシートの「2.19.2 Function Select」にある表を見ると、GPIO25番のSIOは5である:</p> -<pre><code> // set gpio functions - ldr r3, io_bank0_base - mov r0, #5 // sio - mov r1, #0xcc - str r0, [r3, r1] // IO_BANK0: GPIO25_CTRL - -/* ... */ - -io_bank0_base: - .word 0x40014000 -</code></pre> - -<h3>GPIOの出力を有効化</h3> -<p> -GPIO25番がSIOになったので、次にこのピンからの出力を有効化する。既定値では出力は無効になっている。ハイインピーダンスってことなのかな?出力を有効にするには、SIO_BASE(<code>0xd0000000</code>)から<code>0x24</code>バイト目のSIO: GPIO_OEレジスタの該当するビット(25番のピンなので25番ビット)を<code>0x1</code>にする: -</p> -<pre><code> // enable gpio output - ldr r3, sio_base - mov r0, #1 - lsl r0, r0, #25 // gpio25 - str r0, [r3, #0x24] // SIO: GPIO_OE - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> - -<h3>LEDの点滅</h3> -<p>以上でGPIOの設定は完了したので、あとは実際にLEDに電圧を掛けるだけである。レジスタのアドレスに<code>0x1000</code>を足したものに書き込むとアトミックなレジスタのXORができると書いたが、SIOはこの機能がサポートされていないようである。データシートの「2.1.2 Atomic Register Access」に、 -</p> -<blockquote cite="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf"> -<p> -The SIO (Section 2.3.1), a single-cycle IO block attached directly to the cores' -IO ports, does <strong>not</strong> support atomic accesses at the bus level, -although some individual registers (e.g. GPIO) have set/clear/xor aliases. -</p> -</blockquote> -<p> -と書かれている。そのかわりここにも書かれている通り、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> - -<pre><code> // blink led on gpio25 - ldr r4, sio_base - mov r5, r0 // r0 = 1 &lt;&lt; 25 -loop: - str r5, [r4, #0x1c] // SIO: GPIO_OUT_XOR - bl delay - b loop - -delay: - mov r0, #1 - lsl r0, r0, #20 -delay_loop: - sub r0, r0, #1 - bne delay_loop - bx lr - -/* ... */ - -sio_base: - .word 0xd0000000 -</code></pre> -<p>なお以上のコードは<code>.text</code>セクションである。</p> - -<h2>リンカスクリプト</h2> -<p> -以上のコードには<code>.boot2</code>、<code>.text</code>の2つのセクションが含まれる。<code>.boot2</code>はフラッシュの先頭から256(<code>0x100</code>)バイト目まで、<code>.text</code>はその後ろに続くように配置する: -<pre><code>MEMORY -{ - FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 2048k -} - -SECTIONS -{ - .boot2 : { - *(.boot2) - . = 0x100; - } > FLASH - - .text : { - *(.text) - } > FLASH -} -</code></pre> - -<h2>Makefile</h2> -<p> -以上のソースコードは以下のように配置している: -</p> -<pre>rp2040 -├── ex1 -│   ├── Makefile -│   ├── boot2.s -│   ├── main.s -│   └── memmap.ld -└── tools - ├── Makefile - ├── bin2uf2.c - └── bincrc.c -</pre> -<p> -toolsディレクトリのMakefileは同じディレクトリのソースファイルを<code>$(CC)</code>でコンパイルするだけのものである(個人的な趣味で<code>tcc</code>を使っている)。ex1ディレクトリのMakefileは以下の通り: -</p> -<pre><code>AS = arm-none-eabi-as -LD = arm-none-eabi-ld -OBJCOPY = arm-none-eabi-objcopy -BINCRC = ../tools/bincrc -BIN2UF2 = ../tools/bin2uf2 - -MCPU = -mcpu=cortex-m0plus -ASFLAGS = $(MCPU) -CFLAGS = $(MCPU) -ffreestanding -nostartfiles -O0 -fpic -mthumb -c -LDFLAGS = --no-relax -nostdlib - -all: tools led.uf2 - -clean: - rm -f *.o *.elf *.uf2 *.bin - cd ../tools &amp;&amp; make clean - -.s.o: - $(AS) $(ASFLAGS) -o $@ $&lt; - -led.elf: boot2.o main.o memmap.ld - $(LD) $(LDFLAGS) -o $@ -T memmap.ld boot2.o main.o - -led.bin: led.elf - $(OBJCOPY) -O binary led.elf $@ - -led.uf2: led.bin - $(BINCRC) led.bin led_crc.bin - $(BIN2UF2) led_crc.bin $@ - -flash: all - mount /dev/disk/by-label/RPI-RP2 /mnt - cp led.uf2 /mnt - -tools: - cd ../tools &amp;&amp; make -</code></pre> - -<p> -RP2040のボードをUSBデバイスモードでLinuxのパソコンに接続し、ex1ディレクトリで</p> -<pre><code>$ make -# make flash -</code></pre> -<p> -とすればプログラムがRP2040のボードに書き込まれて実行が開始される。</p> - -<h2>最後に</h2> -<p> -光あれ。 -</p> - -<h2>参考</h2> -<ul> -<li> -[1] Hennesy, J. L. and Patterson, D. A. 2017. Computer Organization And Design RISC-V Edition. -</li> -<li> -[2] <a href="https://akizukidenshi.com/catalog/g/gK-17542/">RP2040マイコンボードキット.秋月電子通商</a> -</li> -<li> -[3] <a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf">RP2040 Datasheet.Raspberry Pi Foundation</a> -</li> -<li> -[4] <a href="https://github.com/raspberrypi/pico-sdk">pico-sdk.github</a> -</li> -<li> -[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> -</li> -<li> -[6] <a href="https://github.com/microsoft/uf2">USB Flashing Format (UF2).GitHub</a> -</li> -<li> -[7] <a href="https://developer.arm.com/documentation/ddi0419/c/">ARMv6-M Architecture Reference Manual</a> -</li> -</ul> -]]></description> -</item> -<item> -<title>Gitサーバーの設定 on OpenBSD</title> -<link>https://www.mtkn.jp/computer/git_server.html</link> -<guid>https://www.mtkn.jp/computer/git_server.html</guid> -<pubDate>Thu, 15 Feb 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Gitサーバーの設定 on OpenBSD</h1> -<time>2024-02-15</time> - -<h2>はじめに</h2> -<p> -GitHubがMicrosoft傘下になり久しい。MincraftがMicrosoftアカウントなしでは遊べなくなった。このままではGitHubもそのうちMicrosoftアカウントを要求するようになるかもしれない。ということでGitサーバーを自前で持つことにした。</p> -<p> -ところでOpenBSDの開発者がGotという別のgit実装を作成しているので、この記事は近いうちにいらなくなりそう。 -</p> - -<h2>手順</h2> -<p> -以下ではssh接続によるpull/push及び、httpsによるpullを設定の上、stagitというウェブフロントエンドを導入する。 -</p> - -<h3>概要</h3> -<ol> -<li>ドメインの設定(任意)</li> -<li><code>httpd(8)</code>の設定</li> -<li>gitパッケージのインストールとchroot環境の整備</li> -<li>stagitの導入</li> -</ol> - -<h3>ドメインの設定(任意)</h3> -<p> -ドメインを設定する。IPアドレスでアクセスできればいいならこの設定はいらない。</p> -<p> -今回はgitというサブドメインを登録した: -</p> -<table> -<thead> -<tr> -<th>サブドメイン</th> -<th>種別</th> -<th>内容</th> -<th>優先度</th> -</tr> -</thead> -<tbody> -<tr> -<td>git</td> -<td>A</td> -<td><i>サーバーのIPアドレス</i></td> -<td></td> -</tr> -</tbody> -</table> - -<h3><code>httpd(8)</code>の設定</h3> -<p> -httpsで接続する場合、<code>acme-client(8)</code>を設定する(IPアドレスで接続するなら自己証明書を発行することになる)。まず<code>/etc/acme-client.conf</code>にドメインを追加する: -</p> -<pre><code>domain git.mtkn.jp { - domain key "/etc/ssl/private/git.mtkn.jp.key" - domain full chain certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - sign with letsencrypt -} -</code></pre> - -<p> -続いて<code>/etc/httpd.conf</code>を設定する。</p> -<pre><code>server "git.mtkn.jp" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "git.mtkn.jp" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/git.mtkn.jp.fullchain.pem" - key "/etc/ssl/private/git.mtkn.jp.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "/*/git-receive-pack" { - block - } - location "/*/git-upload-pack" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } - location "/*/info/refs" { - fastcgi { - param SCRIPT_FILENAME "/usr/local/libexec/git/git-http-backend" - param GIT_PROJECT_ROOT "/git" - param GIT_HTTP_EXPORT_ALL "true" - } - } -} -</code></pre> -<p> -<code>location "/*/git-receive-pack"</code>はpushの設定。今回はhttpsでのpushを受付けないので<code>block</code>する。</p> -<p> -<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環境にコピーする。 -</p> -<p> -この後同じURLでフロントエンドをホストしたいので、上記のように必要なURLからのみCGIを実行するようにした。gitのhttpクライアントがどのURLを利用しているのかは[2]に書いていた。</p> - - - -<p> -httpsが必要ない場合は1つ目の<code>server</code>に各<code>location</code>を書くだけでいい。 -</p> -<p> -<code>httpd(8)</code>と<code>slowcgi(8)</code>を起動する: -</p> -<pre><code># echo httpd_flags= &gt;&gt; /etc/rc.conf.local -# echo slowcgi_flags= &gt;&gt; /etc/rc.conf.local -# rcctl start httpd -# rcctl enable httpd -# rcctl start slowcgi -# rcctl enable slowcgi -</code></pre> -<p> -サーバー証明書の発行: -</p> -<pre><code># acme-client -v git.mtkn.jp -</code></pre> -<p> -<code>crontab(1)</code>にサーバー証明書の自動更新を登録: -</p> -<pre><code>#minute hour mday month wday [flags] command -~ 2 * * * acme-client git.mtkn.jp && rcctl reload httpd -</code></pre> - -<h3>gitパッケージのインストールとchroot環境の整備</h3> -<p> -gitパッケージをインストールし、ssh接続用のユーザーを作成する。httpsでも公開するので、gitユーザーのホームディレクトリは<code>/var/www</code>下にする: -</p> -<pre><code># pkg_add git -# useradd -b /var/www -m -s /usr/local/bin/git-shell git -</code></pre> -<p> -ssh接続用の公開鍵を<code>/var/www/git/.ssh/authorized_keys</code>に登録する。ところでこのファイルに公開鍵を書き込むとgitユーザーとしてsshでログインできるので、部外者がこのファイルの編集をできないようにしておく必要がある。一応所有者は<code>git:git</code>、権限は<code>-rw-------</code>なので大丈夫だと思うが、心配なら<code>httpd(8)</code>のchroot環境の外にこのファイルを移動させておいてもいいかもしれない。</p> -<p> -httpsでアクセスするためにchroot環境を整備する。<code>httpd(8)</code>は既定では<code>/var/www</code>にchrootして実行されるので、CGIに必要なファイルをこのディレクトリ以下に用意する必要がある。まずはgitのコマンドをコピー: -</p> -<pre><code># mkdir -p /var/www/usr/local/libexec/git -# cp /usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} /var/www/usr/local/libexec/git/ -# chown www:www /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# chmod 0500 /var/www/usr/local/libexec/git/git-{http-backend,receive-pack,upload-pack} -# mkdir -p /var/www/usr/local/bin -# cp /usr/local/bin/git /var/www/usr/local/bin/ -# chown www:www /var/www/usr/local/bin/git -# chmod 0500 /var/www/usr/local/bin/git -</code></pre> -<p> -続いてコマンドの実行に必要なライブラリをコピー: -</p> -<pre><code># mkdir -p /var/www/usr/lib /var/www/usr/local/lib /var/www/usr/libexec -# 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 -</code></pre> -<p> -<code>/dev/null</code>をコピーする(<code>mknod(8)</code>参照): -</p> -<pre><code># mkdir /var/www/dev -# mknod -m 666 /var/www/dev/null c 2 2 -</code></pre> -<p> -最後に、<code>/var/www/dev/null</code>を作成するために<code>/etc/fstab</code>の<code>/var</code>エントリーから<code>nodev</code>オプションを削除し、再起動する。 -</p> - -<p> -gitパッケージやシステムの更新後、chroot環境のコマンドやライブラリも更新しないといけないのでそのためのスクリプトを適当に作った: -</p> -<pre><code>#!/bin/sh -xe - -oso=$(find /var/www/usr -type f -name '*.so*') -rm $oso - -bin=$(find /var/www/bin /var/www/usr -type f ! -name '*.so*' | - grep -v bgpctl | - sed 's|^/var/www||' - ) -echo &quot;$bin&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$bin&quot; | sed 's|.*|chmod 0500 /var/www&amp;|' | sh -s - -nso=$(echo &quot;$bin&quot; | sed 's|^|/var/www|' | - xargs ldd | awk '{print $7}' | - grep -v -e '^/var/www/' -e '^$' -e 'Name' | - sort | uniq - ) -echo &quot;$nso&quot; | sed 's|.*|cp &amp; /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chown www:www /var/www&amp;|' | sh -s -echo &quot;$nso&quot; | sed 's|.*|chmod 0400 /var/www&amp;|' | sh -s -</code></pre> - -<h3><code>stagit(1)</code>の導入</h3> -<p> -ウェブフロントエンドとしてstagitを導入する: -</p> -<pre><code># pkg_add stagit -</code></pre> -<p> -<code>httpd.conf(5)</code>の<code>server "git.mtkn.jp"</code>の中に以下の設定を追加する(<code>location</code>のマッチは上から順番に評価されるので、上で設定したgitのhttpクライアント用の<code>location</code>よりも下に記入する): -</p> -<pre><code> location &quot;/&quot; { - directory index index.html - root &quot;/htdocs/git.mtkn.jp&quot; - } - location &quot;*&quot; { - directory index log.html - root &quot;/htdocs/git.mtkn.jp&quot; - } -</code></pre> -<p> -stagit用のディレクトリを作成して<code>httpd(8)</code>を再読込する: -</p> -<pre><code># mkdir /var/www/htdocs/git.mtkn.jp -# chown git:git /var/www/htdocs/git.mtkn.jp -# rcctl reload httpd -</code></pre> - -<p> -gitリポジトリが更新されたときにウェブページも更新するように設定する。gitリポジトリはなにか更新があった場合、そのリポジトリのディレクトリの中の<code>hooks/post-receive</code>というファイルを自動で実行する。そのためこのファイルに、stagitの更新をするスクリプトを書いておけばいい: -</p> -<pre><code>#!/bin/sh - -git_root=&quot;/var/www/git&quot; -stagit_root=&quot;/var/www/htdocs/git.mtkn.jp&quot; -repo=&quot;$(basename &quot;$(pwd)&quot; | sed 's/\.git$//')&quot; -src=&quot;$(pwd)&quot; -stagit_dst=&quot;$stagit_root/$repo&quot; - -mkdir -p &quot;$stagit_dst&quot; -(cd &quot;$stagit_dst&quot; &amp;&amp; stagit -l 64 &quot;$src&quot;) -(cd &quot;$stagit_root&quot; &amp;&amp; stagit-index $git_root/*.git &gt; index.html) -</code></pre> - -<h2>レポジトリの作成</h2> -<p> -レポジトリを作成するにはサーバーで以下のようにする。</p> -<pre><code>$ cd /var/www/git -$ doas -u git mkdir <i>repo</i>.git -$ cd <i>repo</i>.git -$ doas -u git git init --bare -</code></pre> - -<p> -これで手元のパソコンからクローンできる: -</p> -<pre><code>$ git clone git@git.mtkn.jp:<i>repo</i>.git -</code></pre> -<p> -または -</p> -<pre><code>$ git clone https://git.mtkn.jp/<i>repo</i>.git -</code></pre> - -<h2>参考</h2> -<ul> -<li>[1] <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols">Git - The Protocols.Git</a></li> -<li>[2] <a href="https://git-scm.com/docs/http-protocol">Git - http-protocol Documentation.Git</a></li> -<li>[3] <a href="https://codemadness.org/stagit.html">Stagit: a static git page generator - Codemadness</a></li> -</ul> -]]></description> -</item> -<item> -<title>味噌</title> -<link>https://www.mtkn.jp/kitchen/recipe/miso.html</link> -<guid>https://www.mtkn.jp/kitchen/recipe/miso.html</guid> -<pubDate>Fri, 9 Feb 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>味噌</h1> -<time>2024-02-09</time> - -<h2>材料</h2> -<p>二升の甕4つ分弱</p> -<ul> -<li>大豆 3.6kg</li> -<li>米麹 5kg</li> -<li>塩 1.8kg</li> -<li>酒粕 500g</li> -</ul> - -<h2>手順</h2> -<ol> -<li>大豆を24時間水に浸す</li> -<li>麹と塩を混ぜる</li> -<li>大豆を3時間蒸す</li> -<li>大豆を潰す</li> -<li>大豆を麹と混ぜる(蒸したときの汁を混ぜて硬さを調整する)</li> -<li>甕に詰める</li> -<li>酒粕で蓋をしてさらにラップで落し蓋をして密閉する。</li> -<li>半年以上寝かす</li> -</ol> - -<h2>ひとこと</h2> -<p> -豆はジップロックに入れて拳に体重を乗せて押しつぶすと楽だった。ジップロックあんまり使いたくないけど。ラップで蓋をするのは好きではないので、試験的にひと瓷だけラップなしで放置することにした。酒粕も味噌っぽくなって食べられるが、風味は少し変わる。味噌汁が粕汁っぽくなる。</p> -]]></description> -</item> -<item> -<title>自己紹介</title> -<link>https://www.mtkn.jp/about.html</link> -<guid>https://www.mtkn.jp/about.html</guid> -<pubDate>Tue, 23 Jan 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>自己紹介</h1> -<time>2022-07-28</time> - -<p><img class="portrait" src="/pics/icon.jpeg" alt="似顔絵" width="100"></p> - -<ul> - <li>名前: 松田 健嗣</li> - <li>性別: 男</li> - <li>年齢: 20代</li> - <li>出身: 和歌山</li> -</ul> - -<p> -高校のころ物理学や数学が好きで、学者を志して大学に行きましたが、能力が足りずに挫折しました。当時は自分の状況を省みることなくひたすら努力していたつもりです。ところがこの努力こそが無駄の根源だったように思います。二回の留年を経て三年目には定員を割っていた生物系に進み、クモの採集にいそしんでいました。京都の山々に分け入っては標本を集める日々です。これはなかなか楽しかった。結局大学ではクモの新種を1つ記載して卒業となりました。 -</p> -<p> -勉強以外では合気道部に所属していましたがこちらではなにも努力していた自覚もなく、そこそこの実力を付けていたように思います。自分にとって稽古することが自然なことだったのでしょう。特にしんどいと思ったこともなかったです。無駄な力を抜き全身をうまく使うことを合気道の稽古から学んでいたはずなのに、それが勉強の方には生かせていなかったのです。 -</p> -<p> -在学中は社会に出て仕事をすることなど考えていなかったため、いざ就職活動となると業界を選ぶことも大変でした。かろうじて興味のあったのがコンピュータなので、それ関係の会社を覗いたりしましたが、本当に自分にあっているのか分からず一から考え直すことに。結局実家の会社を嗣ぐために同業大手に応募、採用されました。 -</p> -<p> -ところがこの会社があまりにも合わず半年で適応障害になって辞めることに。以来実家に戻って畑をするかたわら寺に通っています。この間生き方についていろいろ考えた結果、社会にもまれて気付いたら定年しているより、もっと人間らしい老い方をしたいと思うに至ったのです。常識に縛られても結局その常識に裏切られるだけです。金銭的な豊かさはあまりにも脆いものでしょう。 -</p> -<p> -このサイトは日々考えていることを記しておきたいと思い立ち上げました。周りの人にはあまり共感されない僕の考えですが、なにかの参考になれば幸いです。 -</p> - -<h2>著作権について</h2> -<p> -このウェブサイト上のコンテンツは、特に断りのない限り<a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a>で公開します。</p> -]]></description> -</item> -<item> -<title>謹賀新年</title> -<link>https://www.mtkn.jp/gallery/20240101.html</link> -<guid>https://www.mtkn.jp/gallery/20240101.html</guid> -<pubDate>Mon, 1 Jan 2024 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>謹賀新年</h1> -<time>2024-01-01</time> -<img src="img/20240101.jpg"> -]]></description> -</item> -<item> -<title></title> -<link>https://www.mtkn.jp/gallery/20231202.html</link> -<guid>https://www.mtkn.jp/gallery/20231202.html</guid> -<pubDate>Sun, 3 Dec 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1></h1> -<time>2023-12-02</time> -<img src="img/20231202.jpg"> -]]></description> -</item> -<item> -<title>チルノ</title> -<link>https://www.mtkn.jp/gallery/20231018.html</link> -<guid>https://www.mtkn.jp/gallery/20231018.html</guid> -<pubDate>Tue, 24 Oct 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>チルノ</h1> -<time>2023-10-18</time> -<img src="img/20231018.jpg"> -]]></description> -</item> -<item> -<title>結束バンド</title> -<link>https://www.mtkn.jp/gallery/20231005.html</link> -<guid>https://www.mtkn.jp/gallery/20231005.html</guid> -<pubDate>Tue, 24 Oct 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>結束バンド</h1> -<time>2023-10-05</time> -<img src="img/20231005.png"> -]]></description> -</item> -<item> -<title>後藤ひとり</title> -<link>https://www.mtkn.jp/gallery/20231007.html</link> -<guid>https://www.mtkn.jp/gallery/20231007.html</guid> -<pubDate>Fri, 20 Oct 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>後藤ひとり</h1> -<time>2023-10-07</time> -<img src="img/20231007.jpg"> -]]></description> -</item> -<item> -<title>イソヒヨ</title> -<link>https://www.mtkn.jp/journal/posts/20230810.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230810.html</guid> -<pubDate>Thu, 10 Aug 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>イソヒヨ</h1> -<time>2023-08-10</time> - -<p> -最近イソヒヨが庭でよく遊んでいる。昨日も来た。部屋の窓からのぞきこんでも逃げない。里芋が植わっているあたりでなにかしている。突然里芋の方にとびかかったと思うと、そのまま隣の家の物干しまで飛んでいった。くちばしになにか太いものをくわえている。少しくわえ直してそのままどこかに行ってしまった。</p> - -<p> -里芋の葉には4、5日前からセスジスズメがいた。昨日の朝見たときはだいぶ太って目玉模様もはっきりしていた。元気に里芋を食いちらかしていた。イソヒヨが飛んでいった後確認するも姿が見えない。くわえていたのはセスジスズメだったのか。</p> - -<p> -少し前にも里芋にセスジスズメがついていたが、気づいたら一匹もいなくなった。その前にはニンジンについたキアゲハが一晩でいなくなった。犯人はこいつか。</p> -]]></description> -</item> -<item> -<title>サマータイムレンダ読んだ</title> -<link>https://www.mtkn.jp/journal/posts/20230803.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230803.html</guid> -<pubDate>Thu, 3 Aug 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>サマータイムレンダ読んだ</h1> -<time>2023-08-03</time> - -<p> -サマータイムレンダを読んだ。弟が漫画を買ってリビングに置いて母や妹に読ませていた。ある日なにげなくパラパラめくり始めたのだが、気づけば全部読んでしまっていた。13巻で完結するコンパクトな漫画である。</p> - -<p> -話の内容はサスペンスとしては面白かった。サスペンス自体を論評する知識はないが、少なくとも僕は楽しめた。話の構成とその展開が上手いのだと思う。</p> - -<p> -ところが最後の方に来て少し残念な感じになった。展開はそれまで通りのものに加え、クライマックスの勢いが付いているのだが、黒幕の動機がどうもうすっぺらい。そんな幼稚なやつにふりまわされていたのかと思うと、話の展開が面白いだけになんとも空虚になる。300年前に生まれた神職がそんなこと考えるのかも疑問である。そして動機がただ利己的であるがゆえに、悪役がどこから見てもただの悪役でしかない。だからこそ結末はこの悪役を倒してめでたしめでたしとしかならない。その上途中でおこった取り返しの付かないはずのことも、結局うまいことひっくり返して何も失わずにハッピーエンドを迎えた。これもあまり好みではなかった。</p> -<p> -この辺に関して個人的には最近読んだ「風の谷のナウシカ」のコミックがよかった。こちらには完全な悪がでてこない。敵であってもそれぞれなにかしらの事情があり、それぞれの信念に基いて行動している。だからこそ悪を殲滅して終りにはならないし、敵に勝ってもやるせない。このすっきりしなさが物語に重層性を持たせているように思う。さらに起ったことは事実として定着し、覆ることがないというのも重要なテーマとしていたように思う。どんな過去であっても今の自分たちの生命を以って未来を切り開くというものである。題材も内容も全く違う作品なので比べてもしょうがないが。</p> - -<p> -僕はそもそも死んで時間が戻るのは好きではない。人生の一回性が無くなってしまうからだ。しかしこの作品は死んで時間が戻るといっても、一応完全には取り返しの付かないようになっている。それもあって楽しめたのだが、最後の最後で全部なかったことにしてしまったのは残念である。</p> - -<p> -それから、時間が戻る際に主人公は意識が連続しているので、完全に同一人物といえるかもしれないが、その他の登場人物はどうなのか。戻る前と戻った後では同じ意識の人間なのか。主人公から見れば自分以外に主観は無いので、時間が戻っても以前と同じ人間に見えるだろうが、しかしそれでいいなら本人もコピーされた影も同じだということにならないだろうか。この点について、どこかで問題提起されていたと思うが、結局回収されずにおわった。最後のハッピーエンドはあくまでも本人のみのものであり、それまでに死んだ他の登場人物は結局そのままなのではないだろうか。これもひとつの大きなテーマだと思っていただけに、どうも疑問が残る。</p> - -<p> -最後に、「あっぽけ」って言ってる人は見たことがない。「今日わは...」については大阪人の友達に言ってきょとんとされた経験がある。</p> -]]></description> -</item> -<item> -<title>着物できた</title> -<link>https://www.mtkn.jp/journal/posts/20230802.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230802.html</guid> -<pubDate>Wed, 2 Aug 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>着物できた</h1> -<time>2023-08-02</time> - -<p> -作っていた着物が完成した。思っていたよりもずっと簡単だった。細かいところを追求すれば職人技なのだろうが、日常的に使うものを作るには素人でも十分である。</p> - -<p> -初めは白衣のつもりで安物の晒をそのまま使って作り始めたが、白衣を着ることが無くなってしまったので、袖と衿だけ柿渋で染めて襦袢にすることにした。形は長着だが。</p> - -<p> -完成後、右の衿がかなりずれて付いていることに気付いた。このときは疲れからか不幸にもこのままでいいやと思っていたが、見れば見るほど気になって、とうとうこの部分だけ付けなおすことにした。そして完成したのがこれである。</p> -<img src="20230802.jpg" alt="初めて自作した着物の写真" /> - -<p> -ほんのひと昔前までは着物を作る人などその辺にいくらでもいた。世話になっていた寺の住職のお婆さんは和裁の先生だったそうだし、僕の祖父母より少し若いお茶屋さんは、自分のお母さんが家族の着るものを自分で作っていたという。つまり僕の3、4世代前は着物を自作するのが当たり前だった。ところがこの50年程の間にだれも作らなくなってしまった。和服に限らず自分で作れば安上りなのに。</p> - -<p> -なぜ自作しないのかと聞くと、きっと「そんな時間はない」という答えが返ってくる。金銭的にゆたかになって、自分で服を作る必要がなくなった。のではなく、服を作るような時間的余裕のある人がいなくなったというのが実情である。はて。</p> -]]></description> -</item> -<item> -<title>無題</title> -<link>https://www.mtkn.jp/journal/posts/20230729.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230729.html</guid> -<pubDate>Sat, 29 Jul 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>無題</h1> -<time>2023-07-29</time> -<p> -最近持っている浴衣がどれもぼろぼろになってきた。元々古いもらいものなうえ、着方も動き方もなってないので着ているとすぐにどこか破れる。補修しながら使っていたが、いよいよ布自体がすり切れてきた。いい機会なので自分で仕立ててみようと思いたった。 -実は寺に居たころに白衣を作ろうと思い、晒の裁断と袖の縫いまでしていた。ほったらかしになっていたこれを再開することにした。</p> -<p> -腋縫いまでしていたこの着物に、今日はおくみを片方だけ付けた。両方したかったが疲れたのでもう片方はまた今度。色が付いていないただの晒だが、白衣など着る機会が無くなってしまったので、袖と襟だけでも染めることにした。家にころがっていたターナーの無臭柿渋を3倍に薄めて染めた。本当は自分で育てた柿を使いたいが、そんん場所はないので買ってきた渋である。柿渋は紫外線で硬化して定着するらしく、媒染剤は必要ないようである。襦袢くらいには使えるだろうか。</p> - -<p> -梅を塩に漬けているのを思いだしたのでこれを庭に干した。県民の義務である。そして今日は土曜である。本当は自分で育てた梅を使いたいが、そんな場所はないので買ってきた梅である。残った梅酢は生姜でも漬けようか。</p> - -<p> -庭に植えた里芋から芽がでてきた。大野芋というものであるが、僕が住んでいる場所とは関係がない。既に大きな葉が付いていたのだが、セスジスズメという芋虫にやられて禿げていた。四匹いたのだがある晩二匹減り、二日後にもう一匹、そしていつのまにか最後の一匹が居なくなっていた。なにかに食べられたのか。蛹は見ていない。以前ニンジンの花がキアゲハにやられた時も、たくさん居た芋虫が一晩で一匹も居なくなっていた。ところで芋虫というのは見ているとなんだか美味しそうに見えてくる。実際美味しいらしい<sup>[1]</sup>が。まだ食べる勇気はない。</p> -<p> -この里芋は葉だけでなく茎を根本までかじられて切り株のようになっていたが、その切り株の中心が少しづつ盛り上がってきている。芋は強い。 -</p> - -<ul> -<li>[1]<a href="https://survivalnature.sakura.ne.jp/0000/11_mushi/imomushi/0000.html">イモムシ・ケムシ.サバイバル節約術</a></li> -</ul> - -]]></description> -</item> -<item> -<title>GOPL読んだ</title> -<link>https://www.mtkn.jp/journal/posts/20230726.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230726.html</guid> -<pubDate>Wed, 26 Jul 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>GOPL読んだ</h1> -<time>2023-07-26</time> -<p> -Alan A. A. DonovanとBrian W. Kernighanの「The Go Programming Language」を読了した。読み初めた日付は記録していないが、演習問題用のgitリポジトリは、今年の5月19日が最初のコミットである。二ヶ月ちょっとかかった。本文だけでなく演習問題も濃かった。時間をかけて読む価値があると思う。Kernighanの書いた本は英語が綺麗でいい。</p> -<p> -アマゾンで英語の原著を買ったが、表紙の紙のコーティングみたいなビニールが剥れてきているのが残念。</p> -]]></description> -</item> -<item> -<title>水道と空調</title> -<link>https://www.mtkn.jp/journal/posts/20230725.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230725.html</guid> -<pubDate>Tue, 25 Jul 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>水道と空調</h1> -<time>2023-07-25</time> - -<h2>水道</h2> -<p> -水道が普及して井戸が使えなくなった。水道があれば井戸から飲み水を汲む必要がない。井戸から飲み水を汲まなくなれば井戸水が無くなっても、あるいは汚染されても問題ない。問題なければその通りになる。水源を涵養するという考えが忘れられ、森がコンクリートで覆われた。水が汚なくても良くなったので農薬や肥料を大量に使うようになった。そして井戸は水位が下り、汚染された。</p> -<p> -便利な水道が普及した為に、水道が無いと不便な世界になった。不便というよりそれがないと生きるのもままならない。現在我々はそのインフラの維持費と、災害時の脆弱性に悩まされている。</p> -<h2>空調</h2> -<p> -空調が普及したら気温が高くなった。逆ではない。空調があれば気温が高くなっても問題ない。問題なければその通りになる。街から植物が一掃されコンクリートとアスファルトで覆われた。暑くても問題ないので経済優先で自動車の為の道路ばかり整備された。そして街の気温は上った。</p> -<p> -便利な空調が普及した為に、空調が無いと不便な世界になった。不便というよりそれがないと生きるのもままならないようになりつつある。</p> -<p> -そのうち空調の効率を上げるために、都市全体が大きなドームに覆われる。ドームの外は50℃か60℃か。このインフラもまた維持費と災害に対する脆弱性で我々を悩ませることになろうか。</p> -]]></description> -</item> -<item> -<title>新型コロナウイルスとその対策に関する個人的見解</title> -<link>https://www.mtkn.jp/journal/posts/20220730.html</link> -<guid>https://www.mtkn.jp/journal/posts/20220730.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>新型コロナウイルスとその対策に関する個人的見解</h1> -<time>2022-07-30</time>作成<br> -<time>2022-08-03</time>更新<br> -<h2>はじめに</h2> -<p> -新型コロナウイルスとその対策に関していろいろと思うことはあるが、自分のなかでもあまりまとまっていないうえ、前提となる知識や情報、考えの論理的整合性がとれていない部分が多々ある。それもあってあまり文章として僕の考えを書こうとは思っていなかった。しかし今回の感染症が流行りだして2年と半年が経ち、いまだに社会全体がおかしい(と僕が思う)状態である。そのため自分も黙っているのはむしろ無責任ではないかと思いここに書き残すことにした。どうせほぼ見てくれる人はいないだろうけれど、それでもなにかしたかった。 -</p> -<p> -僕自身はどんなことがあろうがそれを運命と呼び、それを受け入れる覚悟である。その方が日々楽しく生きて納得の上で死んで行けるように思うのだ。自分でも素人なりに論文を読んだりして可能な限り信頼性の高い情報を集めようとはしているのだが、このような考えが根底にあるので、科学的な根拠というのはなんだかどうでもよく思えてきたりするもので、どうも今持っている知識というのがふわっとして正確性に欠ける。しかしだからこそ書きとめて後で反省できるようにしたい。 -</p> -<p> -そのためこの文章は正確な知識に基くものではない。本来論文等をきちんと引用するべきところだが、とりあえず現時点での考えとして公開することにした。また、自分では気を付けているつもりだが、知らないうちに陰謀論を掴まされている可能性もある。おかしな点は指摘してくれるとありがたい。 -</p> - -<h2>概要</h2> -<p> -マスクは今回の感染症を防ぐ効果は非常に限定的だと思う。一方でその副作用は大きい。体が常に酸素の薄い状態になっている。夏は熱中症の危険もある。却って口が乾燥するという人もいる。なによりの懸念は子供の発育への影響である。他人の表情が見えなくてどうしてまともに育つのか。 -</p> -<p> -ワクチンについても効果は薄く、副反応が大きいので打つべきではないと思う。特に若年層は発症した際のリスクが低く、逆にワクチンによるものと思われる心筋炎等の可能性が高い。さらに打ったからといって感染する確率は変らないようだ。 -</p> -<p> -消毒もやらない方がいいと思う。 -</p> -<p> -またこの病気自体危険性がそこまで高くないので、そもそも感染の拡大を防ぐ必要はないと思う。 -</p> -<p> -さらに、例え危険な病気が流行したとしても、人間味のある生活を犠牲にすることのデメリットとその病気の危険性とを天秤にかけ、どのような対策が適正なのかをきちんと議論すべきである。 -</p> -<p> -ところがそのような冷静な考察をする上で必要な情報がなにひとつみあたらない。感染者数や死者数として発表される数字は統計として信用できないだけでなく、医療機関に対する補助金等により大きく歪められている可能性が高い。 -</p> -<p> -また、マスクやワクチン等は同調圧力により行っている人が多いと思う。周囲の人間がやっているからといった理由だけでの行動である。このような世間の流れは非常に危険だと思う。今回は軽い風邪でしかなかったが、この程度のことでここまで社会全体がひとつの空気に支配されているようでは、本当に国運を分けるようなことに見舞われればひとたまりもない。意見の多様性を無視してひとつの流れを作ってしまうと、その流れが間違っていたときに国が滅びるだろう。 -</p> -<p> -しかしやはり一番心配なのは今このような環境のなかで自我を形成している子供である。マスクやワクチンはそれ自体が非常に強く影響する上、同調圧力も重くのしかかる。こんな状態で子供が健全に育つとはとても考えられない。10年、20年あるいはもっと先かも知れないが、今の子供達がこの国を動かすようになれば必ず大きな問題があちこちで噴出することになるだろう。 -</p> -<p> -そもそもウイルスは敵ではない。生態系の重要な一員である。共存していけばいいのだ。 -</p> - -<h2>マスクについて</h2> -<p> -一応いろいろな論文を読んだ。マスクの効果に肯定的なものも否定的なものもあった。僕が読んだものはTwitterで拡散されているものが中心であるが、そのなかでマスクの効果に肯定的なものは、電話やメール等による調査とシミュレーションによるものばかりだった。前者は論文の中でも明記されているが、回答するかしないかは回答者に委ねられており、また回答者のバイアスもあり、とても信頼できるものとは言えないと思う。後者についてはマスクには定性的には効果があるとの前提に立って、その効果を定量的に測るものであるため、こちらも本当に意味があるものかどうか相当あやしいと思う。日本においてもスーパーコンピュータの富嶽によるシミュレーションを何度も目にしたが、これもマスクにより飛沫が防げると言っているだけで、だからウイルスに対してどう影響があるかという点については説明していない。マスクをすれば飛沫が飛びにくくなるのはスーパーコンピュータで計算するまでもなく理解できることではないか。一方でマスクの効果に否定的な論文には、RCT等、無作為性の高い手法を用いたものが多く、こちらのほうが信頼性が高いと判断した。ところでウイルスがマスクの繊維の隙間の大きさよりも圧倒的に小さいのでマスクに効果がないと言う人もいるがこれについてはなんとも言えないと思っている。マスクの穴が大きくても、例えば繊維に静電気で吸着されたりするかもしれない。このような可能性だけで議論すればいつまでも答えがでない。やはり信頼できる根拠というのは現実の観測であって無作為性の高い統計的手法によるものだと思う。 -</p> -<p> -続いてマスクの害について、先日マスクを着用しないと参加できないという場にどうしても行く必要があり、久々に着用した。あまりにも苦しかった。自分が喘息を持っているということもあるかもしれないが、明かに脳に届く酸素が少いと思う。これはバイアスかなあ。このような状態で2年以上も過している人の脳にはなにかしらの障害が起きていてもおかしくないと思うのだが。あるいはマスクにより口呼吸になり却って喉が乾くという話もある。喉が乾けばウイルス等に対する防御も手薄になるだろう。また不織布マスクからはマイクロプラスチックが放出され、それを大量に吸い込み続けているという話も聞く。マイクロプラスチックを吸い込むことと肺癌とを結び付ける話もあるがこの辺はあまりきちんと確かめていない。他にもいろいろなリスクがあるだろうが、一番重大なものはやはり子供の発育である。生れたときから周囲の人間がマスクをした状態で、どうして人間の表情や感情、あるいは言語を学ぶというのだろう。生まれたての赤ちゃんでなくても、他人との人間関係を学び自我を形成している最中の子供達にとって、周囲の表情が分からないのはあまりにも影響が大きいのではないだろうか。大人でもマスクをした他人の表情を読みとるのはマスクをしていない場合よりも難しいが、子供の場合はそれがさらに顕著であるという。このように社会全体が長期に亙ってマスクで顔を覆っていては、今の子供達の世代が将来酷く歪んだものになると思う。これに関して警鐘を鳴らしている人はいるが、社会全体では無視されている。これには科学的根拠はあまりないようだ。結果が出るのが数十年後であろうから当然である。しかしだからといって子供を虐げていい理由にはならないだろう。子供がまともに育たずに害を被るのは彼らが成長したときに年寄になっている今の我々自身かも知れない。ところで徳川時代において、徳川家の子供は生まれた時から尊いというので、乳母は母乳を与える際に顔を見せないようになにか被っていたらしい。それとの因果関係は不明だが、徳川家の子供は当時の平均よりも死亡率が高かったという。この話もきちんと確かめなければ。一方マスクのせいで子供の方が表情を作れなくなるのではないかと考えていたこともあるがこれについてはどうやら心配ないかもしれない。チンパンジーかなにかの実験で、子供の時から他の個体の表情を見せないように育てても、本人は表情を作ることに障害はなかったそうだ。表情の作り方は本能に実装されているらしい。 -</p> - -<h2>ワクチンについて</h2> -<p> -ワクチンの効果は非常に限定されているようである。当初は一回打てば感染しなくなり、今回の騒動も収まると言っていたように思う。当時からそんな訳ないやろとは思っていたが、案の定全く収束する気配はない。二回目には打てば重症化しなくなり、感染の拡大も終わると言い、三回目もこれで終りだと言っていた。そして今は四回目である。僕は一回も打っていないが、これまで政府の言うことを信じて打って来た人は未だに感染の拡大が収まらないことをどのように考えているのか不明である。更に四回目を打てと言われれば未だにその指示に従う理由もよく分からない。 -</p> -<p> -また副反応も大きいではないか。いちいち高熱がでて苦しんでいる人が沢山いる。僕の父も三回目にやたら高熱がでて仕事の最中に会社から帰って来て家で寝ていた。心筋炎の危険も高いようである。政府がデータをちょろまかしていたと言う話があったが、ワクチンを打った場合と打たなかった場合では打った場合の方が圧倒的にリスクが高いようだ。そもそも今回のワクチンは従来のものとは根本的に違う新しいものであり、その安全性も未知数である。特に長期的な影響についてはなにも分かっていないのではないか。もちろん新しい技術には常に危険が付いてまわるものである。それを理解したうえで打ちたいと言う人は本人の責任で打てばいい。ただし今回のように国民全員に打たせようというのは間違いである。こんなことをしてしまっては万が一この新しい技術に長期的な危険性があった場合に全国民がその影響を受けることになる。卵はひとつの籠に入れて運んではいけないのだ。 -</p> -<p> -ところでワクチンを打つのが無料だと思っている人が多いようだがそんな訳ないやろ。全部国の金であり、つまりは我々の税金である。国債でも発行してくれるのならまだいいが、東日本大震災の前例があるのでどうせ増税されるに決まっている。その時はぜひともワクチンを打った人にのみ課税してもらいたいものだ。僕は払いたくない。また万が一このワクチンに長期的な後遺症等の危険があることが判明でもすれば、その治療にも国民健康保険という名の税金が使われるのだろうと思うとやるせない。 -</p> - -<h2>消毒について</h2> -<p> -消毒についても意味がないだけでなく逆効果である可能性もあると思う。手指消毒に関しては、一般に行われている程度のものではウイルスが死滅するとは思えない。ウイルスが死滅する程の消毒をいちいち行っていては、常在菌をも殺してしまい、さらに皮膚に備わっている物理的な免疫機構も働かなくなると思う。結局これも対策をしているというアピールの為のものでしかないのではないか。 -</p> - -<h2>新型コロナウイルス感染症の危険性について</h2> -<p> -この病気はそんなに危険なものであるとは思わない。死亡も重症化もそんなに数が多くない。また先日厚生労働省のウェブページのデータから計算してみると死者の平均年齢が男性で79歳程度、女性で83歳程度と、ほとんど平均寿命に近いものになっている。これは病気で死んでいるというよりも寿命ではなかろうか。ただしこの計算に使ったデータは年齢が10歳区切りであるのであくまでも概算である。病院がパンクしそうだという話も、どうやら軽傷の人が大量に流れこんできていて大変だということらしい。政府がこの感染症の扱いを5類に引き下げれば済む話のようだ。 -</p> - -<h2>人間味のある生活とのおりあいについて</h2> -<p> -今回の騒動では強権的な対策が次々と打ち出された。マスクやワクチンの推奨は半ば強制力を伴ったものとなり、飲食店の営業自粛では法的拘束力が無いにしても、従わない店は名前を公開するなどされていた。個人的な行動も同様であった。それまであたりまえに行われてきた人間らしい生活が奪われた形になる。その後、因果関係は分からないが、自殺者が大きく増えたようだ。人間が行うことには必ず負の面がある。個人の自由を制限することにはそれなりのコストが伴うのだ。危険な感染症が流行したからといってただちに人権を制限することになりかねない今回のような対策をするのは間違っている。この対策により発生する種々のコストと、対策をしなかったときの危険を天秤にかけて考える必要があろう。命を守る為と言って一切の楽しみを奪われたのでは今すぐ死んだ方がましである。あるいは命を最優先にするにしても、その命の中には当然対策をしたがために自殺に追い込まれる人も入っているはずである。国という大きな組織を運営していく上ではなんらかの数字を見て次の行動を判断せざるを得ない訳だが、その数字として死者数を考えた場合でも、対策をしないがために死ぬ人の数と対策をしたために死ぬ人の数の双方を考慮せねばなるまい。 -</p> - -<h2>必要な情報の欠如について</h2> -<p> -上のような冷静な議論に必要なのが正確な情報である。感染症によって何人死んだのか、何人がどれほどの後遺症に苦しんでいるのか、逆に何人が感染症対策の為に死んだのか等の情報である。ところが今得られるそのような情報にはどれも正確さが欠如している。感染者数として発表されているのは無作為ではない方法でPCR検査をして陽性になった人の数である。東京都ではPCR検査を行う施設に補助金が出るので、接種を受ける人に商品券を配って集客している所もあると言う。そもそもPCR検査の開発者であるキャリー・マリス氏はこの検査は感染症の診断に利用すべきでないとの見解である。またこの感染症による死者数として発表されているのはあらゆる原因の死者のうちPCR検査により陽性だった人の数である。別の原因で死んでも陽性であれば新型コロナウイルス感染症による死者である。更に、新型コロナウイルス感染症により患者が死亡すればその病院に補助金が出ると言う話もある。結局この感染症の本当の姿というのは一切見えてこない。テレビ等ではひたすら上のような定義の感染者数ばかり報道して視聴者の恐怖を煽っているだけである。ただでさえいい加減な定義の数字をさらに補助金によって歪めているのが現状である。このような状況で市井の人々は一体なにを怖がっているのか不明である。 -</p> - -<h2>同調圧力について</h2> -<p> -このような状況において、結局人々はどうしていまだにマスクをしてワクチンを打つのかといえば、それは同調圧力によるものである。もちろん一部にはこのウイルスを本当に恐れている人もいるだろうが、僕の周りではかなり少数派である。むしろ周りの目を気にしている人が大多数だろう。あるいは単に世の中の流れだからという理由でそれに付き従っている人も少なくない。中には自分が苦しい思いをしてマスクを着けているのだからお前も苦しいのを我慢して着けろと言う人や、周囲が常識として受け入れていることなのだから自分もしないと恥をかくと言う人もいる。同調圧力を感じてそれに屈っしてマスクを着用している人も居るが、それでは結局自分自身がその同調圧力になり、それを維持してしまっているではないか。このようなことでは結局いつまでたってもやめられない状態に陥ってしまう。というか陥っている。 -</p> -<p> -僕は上に書いた通りマスクは効果も必要性もなく害があると思っているので着用しない。この考えが本当に正しいかどうかは正直よく分からないが、少なくともマスクを着ける効果や必要性がないと思っているのであれば周りの目など気にせずにその通り行動するべきだと思う。同調圧力に弱い人というのはおそらく社会の流れに合わせてさえいればその流れが間違っていても自分には責任が生じないと考えているのだろう。ところで僕は今のようにマスクを強要するような状態が長く続けば必ず取り返しの付かないような問題がでてくると思っている。特に子供は同調圧力による影響を受けやすいように思う。学校でマスクをしなかったりワクチンを打っていなかったりしていじめられるという話も聞く。彼らは大人になっても周囲を伺うばかりで何一つ判断できない人材になるだろう。このような人達が国を運営する時代がいずれ来る。そのような社会で老後を過ごさなければいけないのは結局この社会の流れに同調していた人自身である。社会の趨勢に任せておけば確かに明確に責任を追求されることはないかも知れないが、その結果の尻拭いをするのは自分自身なのだ。 -</p> -<p> -国を形作っているのは自分達自身である。国民とは別に政府が存在するのではなく、政府は国民自身が作るものである。個人とは別に社会の流れがあるのではなく、自分達が社会の流れそのものなのである。自分の頭で考え自分が信じたことを行動で周囲に示すのはむしろ社会に生きる一個人としての責務ではなかろうか。選挙で投票するのは国民の責務だというのと同じである。 -</p> - -<h2>意見の多様性について</h2> -<p> -同調圧力と関連するが、社会をいい方向に進める上で重要なのが意見の多様性である。ここに書いていることは僕個人の考えであり、それが正しいものかどうかはよく分からない。科学者の中にもマスクやワクチン等に関して種々の意見があり、統一されているものではない。そもそも科学は不完全なものなので科学者の意見が統一されてもそれが正しいかどうかはっきり言えるものではないだろう。個人の信条の問題も絡むといよいよ統一した見解というものを出すのは不可能である。しかしこのような意見の多様性というのがむしろ重要なのではないだろうか。多様な意見があればそのなかで最もいいものが生き残っていく。我々人間を含む生物というのはこのようにして進化し、生き残ってきたのではないだろうか。その結果が混沌のなかにある種の調和がとれたこの大自然というものであろう。 -</p> -<p> -ところが今のように一方の意見に統一して他方を無視し、あるいは排除しようとするのはあまりにも危険である。もし社会が選んだ方が間違っていたら人類は絶滅である。卵はひとつの籠に入れて運んではいけない。まあそのような世界になるのもひとつ楽しみであるかも知れないが。 -</p> - -<h2>子供について</h2> -<p> -しかしなんといっても最優先して考えるべきは子供の未来ではないだろうか。今の感染症対策は結局のところ年寄の命を守る為に子供の生活を犠牲にしているというものである。別に対策などしなくてもこの病気で死ぬ年寄はこの病気でなくても死ぬだろうと僕は思うが、そうでなくてもこの感染症の死者および重症患者はやはり高齢者が中心であろう。そして高齢者を守る為であれば子供の生活や成長が犠牲になるということなど議論の俎上にも登らない。どのみちそう長くない高齢者の命と、この先国の中心を担っていく現在の子供達の生活や成長とどちらが大事なのかは考える余地もないと思うのだが現状そんなことを言っている人は少ないようである。今子供達の生活を鑑みずに自分達の命を最優先に考えて行動している年寄は恥を知れ。 -</p> -<p> -子供への悪影響は多岐に渡る。マスクやワクチン、消毒等の直接の影響と、これらすべてに関連した同調圧力による影響である。これらは各項目の所で書いたのでここでは繰り返さない。 -</p> - -<h2>ウイルスは敵ではない</h2> -<p> -思うにウイルスは人類の敵ではない。彼らに感染することで他種の生物と遺伝情報のやり取りができると聞く。人間は人間だけで自然界を生きている訳ではない。互いに影響しあい、時には殺し合い、あるいは寄生しあい、生きているものである。そうしてあらゆる生物がその総体としてひとつの生態系を形成しているのだと思う。人間の命を最優先にして他の生命を排除するようではそのうち生態系の方から人類が見捨てられることにもなるだろう。ウイルスの方は我々と共存する道を探りながら進化している。人間の方もそれに応えるべきだ。 -</p> - -<h2>最後に</h2> -<p> -ここに書いたことは決して正確なことではない。僕の持っている科学的な知識や情報もいい加減なものである。ただし自信を持って言えるのは、僕は自分の頭で考えその結果正しいと思った行動を取っているということである。僕の考えが間違っていても、それは自分が正しいと思い、その通りに行動しているので、後で謝ることもできるし反省することもできる。自分で考えず、あるいは間違っていると思うことをしていては、後になって反省も謝罪もできない。そこにあるのは周りがやっていたから合わせただけで自分には責任がないという言い訳だけだ。しかしその結果どのような社会になろうが、自分もそこに住むことになるのだ。口で責任が無いとは言っても、結局その尻拭いは自分自身ですることになるのだ。今きちんと考えて自分の責任で行動しておかないと自分が死ぬ時にどんな顔をすればいいのか分からないだろう。食べてしまったケーキはとっておくことができないのだ。</p><div style="display: none;">別に爆弾は作らない。</div> -<p> -僕は他人に言われた通りやってつまらない人生を送るより、死ぬ危険があっても自分の信じたことをして生きたい。その方が死に直面したときに気分よく死ぬことができると思う。 -</p> -]]></description> -</item> -<item> -<title>x220から投稿テスト</title> -<link>https://www.mtkn.jp/journal/posts/20210106.html</link> -<guid>https://www.mtkn.jp/journal/posts/20210106.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>x220から投稿テスト</h1> -<time>2021-01-06</time> -<p> -thinkpad x220を手に入れ、arch linuxの環境を整えた。 -</p> -<p> -スペックはこんな感じ: -</p> -<ul> - <li>core i7 2620M</li> - <li>メモリ 8GB</li> - <li>ssd 256GB。</li> -</ul> -<p> -ヤフオクで送料入れて15000円程度だった。 -</p> -<p> -画面はTNだろうと思って買ったが、 -届いたら視野角が広くて非常に見易いので -多分IPSであろう。 -これは結構うれしい。 -</p> -<p> -全体的に綺麗な個体だ。 -</p> -<p> -バッテリーは期待通り完全に消耗していて、 -起動後5秒ほどで切れてしまう。 -</p> -<p> -あとwindows用の日本語キーボードはあんまり -好きではない。 -いちばん下の段がぎゅうぎゅう詰めでスペースが -小さすぎる。 -</p> -<p> -バッテリーを交換するのが先かキーボードをUS配列にするのが先か -悩ましいところだ。 -</p> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる6</title> -<link>https://www.mtkn.jp/computer/xlib_playground6.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground6.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる6</h1> -<time>2023-01-25</time> - -<p> -前回: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>ワールドマップの作成</h2> -<p> -ゲームのワールドマップを作製した。ここでは文字列として登録した。なにもないところは「<code>.</code>」、ブロックの場所は「<code>b</code>」、プレーヤーは「<code>p</code>」とした: -</p> -<pre><code>char worldmap[WORLD_WIDTH * WORLD_HEIGHT + 1] = -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"........b......................................................................." -"................................................................................" -"................................................................................" -"....b..........................................................................." -"................................................................................" -"................b..............................................................." -"..........................................................b..........b.........." -"................................................................................" -".......................b........................................................" -"...........................................b...................................." -"...........................................b...................................." -"................................................................................" -"..................b............................................................." -"................................................................................" -"...........................................b...................................." -"................................................................................" -"................................................................................" -"...........................b...................................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..............................................bbbbbbbbbb........................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"....................................bbbbbbbbbb.................................." -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"..........................bbbbbbbbbb............................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................................................................................" -"................bbbbbbbbbb......................................................" -"................................................................................" -"................................................................................" -"...p............................................................................" -"bbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb" -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................." -"........................b.......b......................b...b...................."; -</code></pre> - -<h2>プレイヤーの作成</h2> -<p>プレイヤーには重力をかけたいので、まずは四角形に加速度を追加:</p> -<pre><code>struct rect { - float ppx, ppy; - float px, py; - float vx, vy; - float ax, ay; // acceleration - int w, h; - int m; -}; -</code></pre> -<p>ワールドマップを読み込み、その際にプレイヤーに重力を付加:</p> -<pre><code>struct rect block[NUM_RECT]; -struct rect player; - -/* ... */ - - int bi = 0; - for (int i = 0; i &lt; WORLD_WIDTH * WORLD_HEIGHT; i++) { - if (world_map[i] == 'b') { - block[bi].ppx = block[bi].px = i % WORLD_WIDTH * BLOCK_SIZE; - block[bi].ppy = block[bi].py = i / WORLD_WIDTH * BLOCK_SIZE; - block[bi].ax = 0; - block[bi].ay = 0; - block[bi].vx = 0; - block[bi].vy = 0; - block[bi].w = block[bi].h = BLOCK_SIZE; - block[bi].m = block[bi].w * block[bi].h; - bi++; - } else if (world_map[i] == 'p') { - player.ppx = player.px = i % WORLD_WIDTH * BLOCK_SIZE; - player.ppy = player.py = i / WORLD_WIDTH * BLOCK_SIZE; - player.vx = 0; - player.vy = 0; - player.ax = 0; - player.ay = GRAVITY; - player.w = player.h = BLOCK_SIZE; - player.m = player.w * player.h; - } - } -</code></pre> - -<p>ユーザーからの入力を受けとり、プレイーヤの加速度等を変更。<code>A</code>、<code>D</code>でそれぞれ左右に加速し、地面に接しているときに<code>space</code>キーでジャンプさせる: -</p> -<pre><code>void -handle_inputs(int key_state[]) -{ - if (key_state[KEY_Q] == KEY_DOWN){ - next_menu = GAME_OVER; - return; - } - if (key_state[KEY_D] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = 500; - } else { - player.ax = 1000; - } - } else if (key_state[KEY_A] == KEY_DOWN) { - if (player.vx &gt; 0) { - player.ax = -1000; - } else { - player.ax = -500; - } - } else { - if (player_is_falling) - player.ax = -player.vx; - else - player.ax = -3 * player.vx; - } - - if (player.vx &lt; -200) player.vx = -200; - if (player.vx &gt; 200) player.vx = 200; - if (!player_is_falling && key_state[KEY_SPACE] == KEY_DOWN) - player.vy = -450; -} -</code></pre> - -<p>変更した加速度は<code>rect_next_tick()</code>関数で次の位置を計算するのに使用。また画面の下に落ちた時にゲームオーバーになるように設定:</p> -<pre><code>void -rect_next_tick(struct rect *s, long ndt) // nano second -{ - s-&gt;ppx = s-&gt;px; - s-&gt;ppy = s-&gt;py; - s-&gt;vx += s-&gt;ax * ndt / 1000 / 1000 / 1000; - s-&gt;vy += s-&gt;ay * ndt / 1000 / 1000 / 1000; - s-&gt;px += s-&gt;vx * ndt / 1000 / 1000 / 1000; - s-&gt;py += s-&gt;vy * ndt / 1000 / 1000 / 1000; - - // bind within the window - if (s-&gt;px &lt; 0) { - s-&gt;px = 0; - //s-&gt;vx *= -1; - } - if (win_width &lt; s-&gt;px + s-&gt;w) { - s-&gt;px = win_width - s-&gt;w; - //s-&gt;vx *= -1; - } - // game over when fall out of the screen - if (s-&gt;py &gt; win_height) - next_menu = GAME_OVER; -} -</code></pre> - - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex6/ex6.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex6.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる5</title> -<link>https://www.mtkn.jp/computer/xlib_playground5.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground5.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる5</h1> -<time>2023-01-03</time> - -<p> -前回: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>円の衝突判定とその処理</h2> -<p> -前回四角形で行っていた衝突判定とその処理を今回は円でした。衝突の判定は二つの円の中心間の距離と、各円の半径の和を比較するだけなので簡単である: -</p> -<pre><code>struct circle { - float ppx, ppy; // previous position (center) - float px, py; // current position (center) - float vx, vy; // velocity - int r; // radius - int m; // mass -}; - -int -circle_test_collision(struct circle *c1, struct circle *c2) -{ - return (c1-&gt;px - c2-&gt;px) * (c1-&gt;px - c2-&gt;px) + - (c1-&gt;py - c2-&gt;py) * (c1-&gt;py - c2-&gt;py) &lt; - (c1-&gt;r + c2-&gt;r) * (c1-&gt;r + c2-&gt;r); -} -</code></pre> - -<p> -衝突後は前回と同じく弾性衝突として処理した。四角形とは違い、衝突方向の場合分けが不要なので楽である。 -</p> -<pre><code> -void -circle_handle_collision_mm(struct circle *c1, struct circle *c2) -{ - if (!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - - c1-&gt;px = c1-&gt;px - col_px / 2; - c1-&gt;py = c1-&gt;py - col_py / 2; - c2-&gt;px = c2-&gt;px + col_px / 2; - c2-&gt;py = c2-&gt;py + col_py / 2; -} - -void -circle_handle_collision_elastic(struct circle *c1, struct circle *c2) -{ - if(!circle_test_collision(c1, c2)) - return; - - float col_px = c2-&gt;px - c1-&gt;px; - float col_py = c2-&gt;py - c1-&gt;py; - float col_pr = sqrtf(col_px * col_px + col_py * col_py); - col_px /= col_pr; - col_py /= col_pr; - float nor_px = col_py; - float nor_py = -col_px; - - float m1 = c1-&gt;m; - float m2 = c2-&gt;m; - - float col_1v = c1-&gt;vx * col_px + c1-&gt;vy * col_py; - float col_2v = c2-&gt;vx * col_px + c2-&gt;vy * col_py; - - float col_1vxn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_px; - float col_1vyn = (2*m2/(m1+m2)*col_2v + (m1-m2)/(m1+m2)*col_1v) * col_py; - float col_2vxn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_px; - float col_2vyn = (2*m1/(m1+m2)*col_1v + (m2-m1)/(m1+m2)*col_2v) * col_py; - - float nor_1vx = nor_px * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_1vy = nor_py * (c1-&gt;vx * nor_px + c1-&gt;vy * nor_py); - float nor_2vx = nor_px * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - float nor_2vy = nor_py * (c2-&gt;vx * nor_px + c2-&gt;vy * nor_py); - - c1-&gt;vx = col_1vxn + nor_1vx; - c1-&gt;vy = col_1vyn + nor_1vy; - c2-&gt;vx = col_2vxn + nor_2vx; - c2-&gt;vy = col_2vyn + nor_2vy; - - circle_handle_collision_mm(c1, c2); -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex5/ex5.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex5.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground6.html">Xlibで遊んでみる6</a> -</p> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる4</title> -<link>https://www.mtkn.jp/computer/xlib_playground4.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground4.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる4</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>衝突判定とその処理</h2> -<p> -これまでは一つの四角形だけを描画していたが、今回は複数の四角形を作成して動かしてみた。ランダムな場所にランダムな運動量で動かして、他のものやウィンドウの縁とぶつかったら跳ね返るようにした。</p> -<p> -回転しない四角形どうしの衝突判定は簡単である。x軸方向とy軸方向の両方に重なりがあれば衝突している: -</p> -<pre><code>struct square { - float ppx, ppy; // previous position - float px, py; // current position - float vx, vy; // velocity - int w, h; // width and height -}; - -int -test_collision(struct square *s1, struct square* s2) -{ - return s1-&gt;px &lt; s2-&gt;px + s2-&gt;w && s2-&gt;px &lt; s1-&gt;px + s1-&gt;w && - s2-&gt;py &lt; s1-&gt;py + s1-&gt;h && s1-&gt;py &lt; s2-&gt;py + s2-&gt;h; -} -</code></pre> - -<p> -衝突後の処理は多少めんどくさかった。衝突した時は既にめりこんでいるので、まずはそれぞれをめりこんだ距離の半分ずつずらして衝突を解消するようにした。この際、x軸方向にぶつかったのか、y軸方向にぶつかったのかで、それぞれの軸方向にひっぺがすようにしている。二つの四角形の各軸に関するめりこんだ距離<code>lapx</code>、<code>lapy</code>と各軸に関する相対速度<code>rel_vx</code>、<code>rel_vy</code>の比を比べればどちらの軸方向にぶつかったかが分かるはずである、多分 : -</p> -<pre><code>void -handle_collision_mm(struct square *s1, struct square *s2) -{ - if (!test_collision(s1, s2)) - return; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - float rel_vx = max(s1-&gt;vx - s2-&gt;vx, s2-&gt;vx - s1-&gt;vx); - float rel_vy = max(s1-&gt;vy - s2-&gt;vy, s2-&gt;vy - s1-&gt;vy); - - if (lapx / rel_vx &lt; lapy / rel_vy) { - if (s1-&gt;px + s1-&gt;w &lt; s2-&gt;px + s2-&gt;w / 2) { - s1-&gt;px -= lapx / 2; - s2-&gt;px += lapx / 2; - } else { - s1-&gt;px += lapx / 2; - s2-&gt;px -= lapx / 2; - } - } else { - if (s1-&gt;py + s1-&gt;h &lt; s2-&gt;py + s2-&gt;h / 2) { - s1-&gt;py -= lapy / 2; - s2-&gt;py += lapy / 2; - } else { - s1-&gt;py += lapy / 2; - s2-&gt;py -= lapy / 2; - } - } -} -</code></pre> -<p> -衝突は弾性衝突として、衝突したそれぞれの四角形の速度を更新した。質量は四角形の面積として計算している。衝突後の速度はエネルギー保存則と運動量保存則から導いたのでしんどかった。 -</p> -<pre><code>void -handle_collision_elastic(struct square *s1, struct square *s2) -{ - if(!test_collision(s1, s2)) - return; - - float v1, v2; - float m1 = s1-&gt;w * s1-&gt;h; - float m2 = s2-&gt;w * s2-&gt;h; - - float lapx = min(s1-&gt;px + s1-&gt;w, s2-&gt;px + s2-&gt;w) - max(s1-&gt;px, s2-&gt;px); - float lapy = min(s1-&gt;py + s1-&gt;h, s2-&gt;py + s2-&gt;h) - max(s1-&gt;py, s2-&gt;py); - - if (lapx &lt; lapy) { - v1 = s1-&gt;vx; - v2 = s2-&gt;vx; - s1-&gt;vx = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vx = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } else { - v1 = s1-&gt;vy; - v2 = s2-&gt;vy; - s1-&gt;vy = 2*m2/(m1+m2)*v2 + (m1-m2)/(m1+m2)*v1; - s2-&gt;vy = 2*m1/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2; - } - - handle_collision_mm(s1, s2); -} -</code></pre> - -<h2>サブティック</h2> -<p> -この名前が適切かどうか分からないが、前のフレームから次のフレームまでの時間をさらに何等分かして衝突判定の制度を上げた(マクロは括弧でかこって分かりにくいバグを防げとどこかに書いていたのでそうすることにした): -</p> -<pre><code>#define SUB_TIC (4) - -void -game_play(void) -{ - /* ... */ - while (next_menu == GAME_PLAY) { - /* ... */ - for (int j = 0; j &lt; SUB_TICK; j++) { - for (int i = 0; i &lt; NUM_SQUARE; i++) - next_tick(&square[i], 1000 * 1000 * 1000 / FPS / SUB_TICK); - - for (int i = 0; i &lt; NUM_SQUARE; i++) - for (int j = i + 1; j &lt; NUM_SQUARE; j++) { - handle_collision_elastic(&square[i], &square[j]); - /* ... */ - } - /* ... */ - } - /* ... */ - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex4/ex4.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex4.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground5.html">Xlibで遊んでみる5</a> -</p> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる3</title> -<link>https://www.mtkn.jp/computer/xlib_playground3.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground3.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる3</h1> -<time>2023-01-02</time> - -<p> -前回: <a href="xlib_playground2.html">Xlibで遊んでみる2</a> -</p> -<p> -言語: C言語<br /> -ソースコード: <a href="https://git.mtkn.jp/xlib_playground">git</a> -</p> - -<h2>画面サイズの変更</h2> -<p> -画面サイズが変更された時に表示している四角形が画面の外側に出ないようにした。<code>XGetWindowAttributes()</code>で画面の情報を取得し、グローバル変数の<code>win_width</code>と<code>win_height</code>に幅と高さをそれぞれ代入して<code>next_tick()</code>で四角形の位置を画面に収まるようにしている: -</p> -<pre><code>int win_width, win_height; - -void -receive_events(int key_state[]) -{ - XEvent event; - XWindowAttributes wattr; - - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XGetWindowAttributes(display, window, &wattr); - win_width = wattr.width; - win_height = wattr.height; - } break; - /* ... */ - } - } -} - -void -next_tick(long ndt) // nano second -{ - px = px + vx * ndt / 1000 / 1000 / 1000; - py = py + vy * ndt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; -} -</code></pre> - -<h2>メニュー画面の実装</h2> -<p> -ゲームのようなものを作るうえでメニュー画面とその推移が必要である。ここではグローバル変数<code>next_menu</code>に現在のメニューを保存することにした。それぞれのメニューはそれぞれ関数として記述し、他のメニューに推移する必要が生じたときに<code>next_menu</code>を変更するようにした: -</p> -<pre><code>enum next_menu { - START_MENU, - GAME_PLAY, - GAME_OVER, - QUIT, -}; - -int next_menu = START_MENU; - -void -start_menu(void) -{ - XEvent event; - char *menu_char_q = "press q to quit."; - char *menu_char_s = "press &lt;space&gt; to start."; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - while (next_menu == START_MENU) { - XNextEvent(display, &event); - switch (event.type) { - case Expose: { - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_q)/2, - win_height/2, - menu_char_q, strlen(menu_char_q)); - XDrawString(display, window, gc, - win_width/2 - strlen(menu_char_s)/2, - win_height/2 + 20, - menu_char_s, strlen(menu_char_s)); - - } break; - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - next_menu = QUIT; - break; - case ' ': - next_menu = GAME_PLAY; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - next_menu = QUIT; - } - } break; - default: - break; - } - } -} - -int -main(void) -{ - setup(); - while (next_menu != QUIT){ - switch (next_menu){ - case START_MENU: - start_menu(); - break; - case GAME_PLAY: - game_play(); - break; - case GAME_OVER: - game_over(); - break; - default: - break; - } - } - - cleanup(); - return 0; -} -</code></pre> -<p><code>main()</code>関数がめっちゃすっきりした。</p> - -<h2>完成品</h2> -<p> -<a href="https://git.mtkn.jp/xlib_playground/file/ex3/ex3.c.html">git</a> -</p> -<p> -<video controls> -<source src="videos/ex3.webm" type="video/webm"> -</video> -</p> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p> -次の記事: <a href="xlib_playground4.html">Xlibで遊んでみる4</a> -</p> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる2</title> -<link>https://www.mtkn.jp/computer/xlib_playground2.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground2.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる2</h1> -<time>2022-12-22</time> - -<p>前回: <a href="xlib_playground1.html">Xlibで遊んでみる1</a></p> -<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>FPSの固定</h2> -<p>前のフレームからの経過時間を計測して<code>1.0/FPS</code>を越えるまで待機させる。このときに<code>nanosleep()</code>を使うとなぜか上手くいかなかった。ナノ秒単位で処理できそうな名前なのに使えない。多分OSのコンテクストスイッチがどうとかいう話やと思う。知らんけど。組み込みとかで使うんかな? -</p> - -<p> -とりあえず<code>while</code>ループの中でひたすら時刻を読んでいる。リソースの無駄遣いではないのだろうか: -</p> -<pre><code>#defin FPS 60 - -int -main(void) -{ - long t0, t1, dt; - int fps_count; - - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - - while (!quit) { - // fix fps - dt = 0; - while (dt &lt; 1.0 * 1000 * 1000 * 1000 / FPS){ - clock_gettime(CLOCK_MONOTONIC, &ts); - t1 = ts.tv_nsec; - dt = t1 &gt; t0 ? t1 - t0 : t1 - t0 + 1000 * 1000 * 1000; - } - // count fps. - fps_count++; - if (t1 &lt; t0){ - printf("fps: %u\n", fps_count); - fps_count = 0; - } - clock_gettime(CLOCK_MONOTONIC, &ts); - t0 = ts.tv_nsec; - } -} -</code></pre> -<p> -時刻は<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> -<p> -FPSの計測の部分は、フレーム毎に<code>fps_count</code>を1ずつ増やし、ナノ秒が繰り上がった時点での<code>fps_count</code>を表示している。</p> -<p> -あまり正確な方法ではないように思うが、コンパクトにまとまったのではないだろうか。</p> - -<h2>キーボード入力の処理</h2> -<p>キーボードからの入力を受け取る:</p> -<pre><code>XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); -</code></pre> -<p>ここではキーボードのキーを押した時と離した時に<code>XEvent</code>の通知を受け取るように設定した。 -</p> -<p> -<code>XNextEvent()</code>からひとつずつ入力を受け取ると、複数のキーが同時に押された時にうまく処理できなかったので、押されているキーを配列に保存しておくことにした:</p> -<pre><code>enum Keys { - Key_D, - Key_S, - Key_A, - Key_W, - Key_Space, - Num_Key, //number of keys in this enum -}; -enum Key_State { - Key_Up, - Key_Down, -}; - -int key_state[Num_Key]; -</code></pre> - -<p> -入力の処理は<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> -<pre><code>int quit; - -void -handle_inputs(void) -{ - XEvent event; - while (XPending(display) &gt; 0) { - XNextEvent(display, &event); - switch (event.type) { - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'q': - quit = 1; - break; - case 'd': - key_state[Key_D] = Key_Down; - break; - case 'a': - key_state[Key_A] = Key_Down; - break; - case 'w': - key_state[Key_W] = Key_Down; - break; - case 's': - key_state[Key_S] = Key_Down; - break; - default: - break; - } - } break; - case KeyRelease: { - switch (XLookupKeysym(&event.xkey, 0)) { - case 'd': - key_state[Key_D] = Key_Up; - break; - case 'a': - key_state[Key_A] = Key_Up; - break; - case 'w': - key_state[Key_W] = Key_Up; - break; - - case 's': - key_state[Key_S] = Key_Up; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - - vx = vy = 0; - if (key_state[Key_D] == Key_Down) - vx += 300; - if (key_state[Key_A] == Key_Down) - vx += -300; - if (key_state[Key_S] == Key_Down) - vy += 300; - if (key_state[Key_W] == Key_Down) - vy += -300; -} -</code></pre> - -<p> -入力によって変更された速度は、<code>main()</code>関数内で次の座標を計算するために使用される: -</p> -<pre><code>float px = 200, py = 200; -float vx = 0, vy = 0; -int width = 40, height = 40; - -int -main(void) -{ - /* ... */ - quit = 0; - while (!quit) { - handle_input() - /* ... */ - px = px + vx * dt / 1000 / 1000 / 1000; - py = py + vy * dt / 1000 / 1000 / 1000; - // bind within the window - if (px &lt; 0) - px = 0; - if (win_width &lt; px + width) - px = win_width - width; - if (py &lt; 0) - py = 0; - if (win_height &lt; py + height) - py = win_height - height; - - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - width, height); // width and height - } - /* ... */ -} -</code></pre> - -<h2>完成品</h2> -<a href="https://git.mtkn.jp/xlib_playground/file/ex2/ex2.c.html">ソースコード</a> -<p>色を変えてみた。</p> -<video controls> - <source src="videos/ex2.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -</ul> -<p>次の記事: <a href="xlib_playground3.html">Xlibで遊んでみる3</a> -</p> -]]></description> -</item> -<item> -<title>Xlibで遊んでみる1</title> -<link>https://www.mtkn.jp/computer/xlib_playground1.html</link> -<guid>https://www.mtkn.jp/computer/xlib_playground1.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Xlibで遊んでみる1</h1> -<time>2022-12-21</time> - -<h2>はじめに</h2> -<p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> -<p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> -<p>言語はC言語である。ソースコードは<a href="https://git.mtkn.jp/xlib_playground">ここ</a>にある。 -</p> - -<h2>初期設定</h2> -<p>ディスプレイを開き、ウィンドウを作成する。変数はとりあえずグローバルに宣言することにした。<code>main</code>関数はできるだけ小さくして実際の処理はそれぞれの関数にさせてみる:</p> -<pre><code> -#include &lt;stdio.h&gt; -#include &lt;stdlib.h&gt; -#include &lt;X11/Xlib.h&gt; - -/* macros */ -#define INIT_WIDTH 800 -#define INIT_HEIGHT 600 - -/* variables */ -Display *display; -Window window; -unsigned int win_width = INIT_WIDTH, win_height = INIT_HEIGHT; -GC gc; -Atom wm_delete_window; - -void -setup(void) -{ - // Open a display. - if ((display = XOpenDisplay(NULL)) == NULL){ - fprintf(stderr, "ERROR: could not open display\n"); - exit(1); - } - // Create a window. - window = XCreateSimpleWindow( - display, - XDefaultRootWindow(display), - 0, 0, - win_width, win_height, - 0, 0, // border properties - 0); // background color: black - XStoreName(display, window, "UNKO"); - - // Setup a graphical context. - gc = XCreateGC(display, window, 0, NULL); - XSetForeground(display, gc, 0x0000FF); - - // Kill the application when the window is destroyed. - wm_delete_window = XInternAtom(display, - "WM_DELETE_WINDOW", False); - XSetWMProtocols(display, window, &wm_delete_window, 1); - - // Setup which input to process. - XSelectInput(display, window, - ExposureMask|KeyPressMask|KeyReleaseMask); - - // Actually draw the window. - XMapWindow(display, window); -} - -void -clean_up(void) -{ - XCloseDisplay(display); -} -</code></pre> - -<p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> -<pre><code>#include &lt;time.h&gt; -#include &lt;math.h&gt; - -int -main(void) -{ - int px, py; - int quit; - struct timespec ts; - XEvent event; - - setup(); - quit = 0; - - while (!quit){ - while(XPending(display) &gt; 0){ - XNextEvent(display, &event); - switch (event.type){ - case KeyPress: { - switch (XLookupKeysym(&event.xkey, 0)){ - case 'q': - quit = 1; - break; - default: - break; - } - } break; - case ClientMessage: { - if ((Atom) event.xclient.data.l[0] == wm_delete_window) { - quit = 1; - } - } break; - default: - break; - } - } - clock_gettime(CLOCK_MONOTONIC, &ts); - px = 200 + (int) (100 * sinf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - py = 200 + (int) (100 * cosf(ts.tv_sec + ts.tv_nsec / 1000.0 / 1000 / 1000)); - XClearArea(display, window, - 0, 0, // position - win_width, win_height, // width and height - False); - XFillRectangle(display, window, gc, - px, py, // position - 100, 100); // width and height - - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000 * 1000; - nanosleep(&ts, NULL); - } - - cleanup(); - return 0; -} -</code></pre> - -<p>ここまでのコードはgitリポジトリの<a href="https://git.mtkn.jp/xlib_playground/file/ex1/ex1.c.html">ex1/ex1.c</a>にある。</p> -<h2>完成品:</h2> -<video controls> - <source src="videos/ex1.webm" type="video/webm"> -</video> - -<h2>参考</h2> -<ul> -<li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> -<li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> -</ul> - -<a href="xlib_playground2.html">次の記事</a> -]]></description> -</item> -<item> -<title>Arch Linuxのインストール</title> -<link>https://www.mtkn.jp/computer/archlinux_installation.html</link> -<guid>https://www.mtkn.jp/computer/archlinux_installation.html</guid> -<pubDate>Mon, 15 May 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Arch Linuxのインストール</h1> -<time>2021-03-25</time> - -<h2>ハードウェア構成</h2> - -<h2>インストールの準備</h2> - -<h3>インストールメディアの入手</h3> - -<h3>署名の検証</h3> -<pre><code>$ gpg --keyserver-options auto-key-retrieve --verify archlinux-<i>version</i>-x86_64.iso.sig -</code></pre> - -<h3>インストールメディアの準備</h3> -<pre><code>$ sudo dd bs=4M if=<i>path/to/arch/linux/iso</i> of=/dev/sd<i>X</i> status=progress oflag=sync -</code></pre> - -<h3>ライブ環境の起動</h3> -Arch Linux install medium (x86_64, UEFI)を選択 - -<h3>インストールの記録</h3> -<pre><code># script install.log -</code></pre> - -<h3>起動モードの確認</h3> -<pre><code># ls /sys/firmware/efi/efivars -</code></pre> -エラーが出なければUEFI。 - -<h3>インターネットへ接続</h3> -<p> -ネットワークインターフェイスが認識されているか確認: -</p> -<pre><code># ip link -</code></pre> -<p> -Wi-Fi接続: -</p> -<pre><code># iwctl -[iwd]# device list -... -[iwd]# exit -</code></pre> -<p> -接続を確認: -</p> -<pre><code># ping archlinux.jp -</code></pre> - -<h3>システムクロックの更新</h3> -<pre><code># timedatectl set-ntp true -</code></pre> - -<h3>パーティショニング</h3> -<pre><code>sd<i>X</i> -├sd<i>X</i>1 512M EFI System /boot -└sd<i>X</i>2 lest Linux filesystem / -</code></pre> -<pre><code># lsblk -# fdisk /dev/sd<i>X</i> -Command (m for help): d -... -Command (m for help): w -</code></pre> - -<h3>パーティションのフォーマット</h3> -<pre><code># mkfs.fat -F32 /dev/sd<i>X</i>1 -# mkfs.ext4 /dev/sd<i>X</i>2 -</code></pre> - -<h3>ファイルシステムのマウント</h3> -<pre><code># mount /dev/sd<i>X</i>2 /mnt -# mkdir /mnt/boot -# mount /dev/sd<i>X</i>1 /mnt/boot -</code></pre> - -<h2>インストール</h2> -<h3>ミラーの選択</h3> -日本のサーバーを上に持ってくる: -<pre><code># vim /etc/pacman.d/mirrorlist -</code></pre> - -<h3>必須パッケージのインストール</h3> -<pre><code># pacstrap /mnt base base-devel linux linux-firmware man-db man-pages -</code></pre> - -<h3>fstabの生成</h3> -<pre><code># genfstab -U /mnt >> /mnt/etc/fstab -</code></pre> - -<h3>chroot</h3> -<pre><code># arch-chroot /mnt -</code></pre> - -<h3>text editorをインストール</h3> -<pre><code># pacman -S neovim -</code></pre> - -<h3>タイムゾーン</h3> -<pre><code># ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -# hwclock --systohc -</code></pre> - -<h3>ローカリゼーション</h3> -<code>en_US.UTF-8</code>と<code>ja_JP.UTF-8</code>をコメントイン: -<pre><code># nvim /etc/locale.gen -</code></pre> -ロケールを生成: -<pre><code># locale-gen -</code></pre> -<pre><code># nvim /etc/locale.conf -LANG=en_US.UTF-8 -</code></pre> - -<h3>ネットワーク設定</h3> -<p> -無線接続用のソフトをインストール -</p> -<pre><code># pacman -S networkmanager -</code></pre> - -<p> -ホストネームの設定 -</p> -<pre><code># nvim /etc/hostname -<i>myhostname</i> -</code></pre> -<pre><code># nvim /etc/hosts -127.0.0.1 localhost -::1 localhost -127.0.1.1 <i>myhostname</i>.localdomain <i>myhostname</i> -</code></pre> - -<h3>Rootパスワード</h3> -<pre><code># passwd -</code></pre> - -<h3>ブートローダー</h3> -<p> -インストール -</p> -<pre><code># pacman -S grub efibootmgr -# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=boot -</code></pre> -<p> -メイン設定ファイルの生成 -</p> -<pre><code># grub-mkconfig -o /boot/grub/grub.cfg -</code></pre> - -<h3>マイクロコードのアップデートを有効化</h3> -<pre><code># pacman -S intel-ucode -# grub-mkconfig -o /boot/grub/grub.cfg -上のん無駄やんけ -</code></pre> - -<h2>再起動</h2> -<pre><code># exit #chrootを抜ける -</code></pre> - -<h3>インストールの記録を保存</h3> -<pre><code># exit #scriptを停止 -# mv install.log /mnt/root -</code></pre> - -<h3>アンマウント</h3> -<pre><code># umount -R /mnt -</code></pre> - -<h3>再起動</h3> -<pre><code># reboot -</code></pre> - -<h2>インストール後</h2> -<h3>システム管理</h3> -<p> -一般ユーザーの作成 -</p> -<pre><code># useradd -m -G wheel -s /bin/bash kenji -# passwd kenji -</code></pre> -<p> -作成したユーザーをsudoerに追加 -</p> -<pre><code># visudo -%wheel ALL=(ALL) ALL #uncomment -</code></pre> -<p> -一般ユーザーとしてログインしなおす。 -</p> - -<h3>パッケージ管理</h3> -<p> -AUR -</p> - - - -<h3>dotfilesを同期</h3> -<p> -gitのインストール -</p> -<pre><code>$ sudo pacman -S git -$ git config --global user.name "<i>First-name</i> <i>Family-name</i>" -$ git config --global user.email "<i>username</i>@<i>example.com</i>" -</code></pre> -<p> -dotfilesを同期 -</p> -<pre><code>$ mkdir ~/.local -$ cd ~/.local -$ git clone https://github.com/<i>dotfilesのリポジトリ</i> -$ ln -sf ~/.local/dotfiles/.bash* ~/ -$ mkdir .config -$ ln -s ~/.local/dotfiles/.config/* ~/.config/ -... -</code></pre> - -<h3>GUI</h3> -<p> -グラフィックドライバのインストール -</p> -<pre><code>$ sudo pacman -S nvidia nvidia-utils xorg-xinit -</code></pre> -<p> -window managerをインストール -</p> -<pre><code>$ sudo pacman -S i3-wm i3blocks dmenu -</code></pre> -ドライバをインストールしたらxorg-server等も依存関係として入った。 -<p> -フォントをインストール -</p> -<pre><code>$ sudo pacman -S noto-fonts-cjk noto-fonts-emoji ttf-joypixels ttf-font-awesome ttf-liberation -</code></pre> - -<p> -ターミナル(st)をインストール -</p> -<pre><code>$ mkdir ~/.local/src -$ cd ~/.local/src -$ git clone git://git.suckless.org/st -$ cd st -$ sudo make install -</code></pre> - -<p> -再起動 -</p> -<pre><code># sudo reboot -</code></pre> -だめでした -<p> -ログイン時に次のエラー -</p> -<pre><code>xauth: error in locking authority file /home/kenji/.cache/X11/Xauthority -</code></pre> -<p> -<code>~/.cache/X11</code>というディレクトリがないのが原因のようだ。 -<code>.bash_profile</code>でXauthorityの場所を変更していたのにディレクトリを作っていなかった。 -</p> -<pre><code>$ mkdir ~/.cache/X11 -</code></pre> -<p> -として解決。 -</p> - -<h3>日本語入力</h3> -<p> -ibusとibus-skkをインストール -</p> -<pre><code>$ sudo pacman -S ibus ibu-skk skk-jisyo -</code></pre> -<pre><code>vim ~/.config/X11/xinitrc -export DefaultIMModule=ibus -export GTK_IM_MODULE=ibus -export QT_IM_MODULE=ibus -export XMODIFIERS="@im=ibus" - -ibus-daemon --xim & -</code></pre> - -<h3>ブラウザ(brave)をインストール</h3> -<pre><code>$ cd ~/.local/src -$ git clone https://aur.archlinux.org/brave-bin.git -$ cd brave-bin -$ makepkg -si -</code></pre> - -<h3>音</h3> -<pre><code>$ sudo pacman -S alsa-utilst pulseaudio -$ pulseaudio --start -</code></pre> - - -<p> -ssh -</p> -<pre><code>$ sudo pacman -S openssh -$ mkdir ~/.ssh -$ cd ~/.ssh -$ ssh-keygen -t rsa -</code></pre> -]]></description> -</item> -<item> -<title>寺を辞めた</title> -<link>https://www.mtkn.jp/journal/posts/20230119.html</link> -<guid>https://www.mtkn.jp/journal/posts/20230119.html</guid> -<pubDate>Thu, 19 Jan 2023 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>寺を辞めた</h1> -<time>2023-01-19</time> -<p> -寺を辞めた。昨年の夏に一月ほど寺に泊りこんで以来、住職の奥さんとわだかまりができた。根本的に相性が悪い。精神も体調も不安定になり、9月ごろから実家に引き込もっていた。その間先方から何度か手紙が来たのだが、これが決定打となり寺にはもう行かないことを決意した。それが昨年の11月だったと思う。しかし実際に辞表を出すには気が重かった。年が変わって2週間ほど経ってからようやく腰を上げ、辞める意思を手紙にしたためた。そして昨日、借りていた物を返し寺に置いていた物を回収した。</p> -<p> -ふう。 -</p> -]]></description> -</item> -<item> -<title>Holy Shit!</title> -<link>https://www.mtkn.jp/journal/posts/20221228.html</link> -<guid>https://www.mtkn.jp/journal/posts/20221228.html</guid> -<pubDate>Wed, 28 Dec 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Holy Shit!</h1> -<p>最近見ているプログラマの配信者がよく言っている。「Holy Shit!」Holyは聖なる、Shitはうんこという意味である。日本のプログラマもうんこという言葉を好むが、海外でも同じようである。 -</p> -<p> -ところでこの言葉の訳語はなにがいいかと考えていると思いがけずぴったりなものを思いついた:</p> -<p> -「すめらうんこ」 -</p> -<p> -そうそれは、すめらみことの落しもの(droppings)。嗚呼不敬。 -</p> -]]></description> -</item> -<item> -<title>不死身の特攻兵</title> -<link>https://www.mtkn.jp/books/978-4-06-288451-8.html</link> -<guid>https://www.mtkn.jp/books/978-4-06-288451-8.html</guid> -<pubDate>Wed, 23 Nov 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>不死身の特攻兵</h1> -<div class="author">鴻上尚史 著</div> -<time>2022-11-23</time> -<p>大東亜戦争において何度も特攻を命じられるも生還した佐々木友次という人の話。ベテランのパイロットだったために陸軍の特攻第一号に選ばれ、死んでこいと言われたが爆弾を落して帰ってきた人である。それも何度も。</p> -<p>第一章は著者が佐々木氏を知ったいきさつ。第二章は佐々木氏の伝記。第三章は著者の佐々木氏へのインタビュー。第四章は著者による戦争や特攻に関する考察。</p> -<p>第一章は導入である。</p> -<p>第二章は物語として面白かった。戦争や特攻といった理不尽なものに対して自分の信念を貫いた佐々木氏の生き方や考え方が痛快である。</p> -<p>第三章のインタビューでは佐々木氏が繰り返し口にした寿命という言葉が印象的だった。人間は寿命がくれば死に、それまでは生きる、というものである。たとえ戦死であろうともそれがその人の寿命であるとの認識であるようだ。この考えにはとても共感できる。</p> -<p>第四章はかなり客観的に書かれているように思う。その上で著者自身の考えを述べているので読みやすかった。しかし読み進めるにつれてだんだんともやもやが溜っていった。当時の日本を支配していた空気があまりにも重苦しい。しかもその空気は、現在の日本にあるものとほとんど同じであると感じた。ここ最近僕が感じているこの国の暗い部分は大東亜戦争のころからなにも変らずに受け継がれているようである。せっかく無様に負けたのに本当の意味での反省を一切していないためか、なにも変っていない。余りにも勿体無く、戦没者にも失礼である。</p> -<p>もっと歴史を勉強し、今の生き方に反映しなければと考えさせてくれる本だった。</p> -]]></description> -</item> -<item> -<title>大阪駅にて</title> -<link>https://www.mtkn.jp/journal/posts/20221031.html</link> -<guid>https://www.mtkn.jp/journal/posts/20221031.html</guid> -<pubDate>Mon, 31 Oct 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>大阪駅にて</h1> -<time>2022-10-30</time> -<p>いつだったか、大阪駅から和歌山に帰るため、1番線にて関空・紀州路快速、関西空港・和歌山行を待っていた。この快速は関西空港行4両と和歌山行4両が連結して8両編成となっている。途中の日根野駅で切り離し、その後はそれぞれの目的地に向かう。僕は和歌山行の先頭車両に乗ろうと思い、白色三角印の4番に並んでいた。ところでこの快速に女性専用車はないのだが、環状線内を走る普通列車は4号車が女性専用である。自分の並んでいる所にもそのように書いていた。しばらくして僕の後ろにおじさんが一人並んだ。次にこのホームに来るのは普通列車である。この人も後で来る快速に乗るのかと思って気にしていなかった。</p> -<p>しばらくして普通列車が到着した。僕はこれには乗らないので横にずれて後ろの人達に道を開けた。列車が停止してドアが開くと、後ろのおじさんはそのまま女性専用車にすいこまれていった。声を掛けるべきか考えているうちに発車ベルが鳴り、おじさんは閉じ込められて行ってしまった。</p> -<p>ところで関空・紀州路快速のうち和歌山に行くのは後ろの4両、5号車から8号車である。僕が並んでいたのは和歌山行の先頭車ではなく関西空港行の最後尾だった。僕は足元の白色三角印4番をしばらく眺めた後、隣の5番に並びなおした。</p> -]]></description> -</item> -<item> -<title>寺に適応できない</title> -<link>https://www.mtkn.jp/journal/posts/20221023.html</link> -<guid>https://www.mtkn.jp/journal/posts/20221023.html</guid> -<pubDate>Sun, 23 Oct 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>寺に適応できない</h1> -<time>2022-10-23</time> -<h2>これまで</h2> -<p>実家の菩提寺に入って出家した。坊主になってこの寺で生きていけないかと考えたのだ。ところが一年経った今でもこの寺に適応できていない。八月のお盆の間、住職は忙しくて朝のお勤めをしないので代わりにして欲しいと言われ、半月ばかり泊り込むことになった。ゆくゆく自分が住職に成ることを考え、これを機に半分寺に住み込もうと思い、お盆が済んでからもしばしば寺に泊まった。そうして八月はほぼ寺に居たのだが、その間寺に適応できずにどんどん自分の感情が萎れていった。とうとう適応障害と言えそうな状態にまでなり、九月と十月はほとんど実家に引き込もっている。どうしたものか。</p> - -<p>なにがそんなにしんどいのか。住職の奥さんと一緒に居るのがしんどい。この人が何を考えているのか分からない。僕の言ったこともその場では肯定しているように感じることが多いが、あまり理解していないようだ。やるべきことは自分で見付けろと言いながら、なにかしようとすると拒否される。生活の面でもいろいろと噛み合わない。柔軟剤がきつすぎてしんどくなった。食事の脂が多すぎてお腹を壊した。台所が汚なすぎて気持が悪い。</p> - -<h2>柔軟剤</h2> -<p>初めて寺に行って掃除を任された時から気になっていた。雑巾があまりにも臭いのだ。それも柔軟剤の臭いである。当時は実家から通っていたのだが、昼間寺の掃除をすると、家に帰ってからどんなに手を洗っても臭いが落ちないほどである。雑巾だけではなく寺にある布という布から悉く同じ柔軟剤の臭いがする。この臭いをいい臭いだという人の気が知れないのだが。</p> -<p>ある時檀家さんからもらった素麺をお裾分けしてもらったのだが、箱を包むビニールにも柔軟剤の臭いがこびりついていた。実家に持ち帰り後日湯掻いたのだが、素麺自体にも臭いがついていて食べられたものではなかった。他の家族も顔をしかめていた。勿体無いが全部廃棄した。</p> -<p>後で気付いたが、どうも寺中の埃から柔軟剤の臭いがするのだ。埃は布からでたものなので考えれば当たり前か。この埃が食品を保管している棚に積り、その中の素麺に臭いが移ったのだと思う。埃が臭うので寺中至る所その臭いである。</p> - -<h2>食事</h2> -<p>寺での食事は脂が多い。ささやかな生活をしていると本人達は思っているようだが、食卓にはやたら牛肉が並ぶ。脂ののった鮭も多い。奥さんは歯がほとんどないので肉も魚も脂の乗ったやわらかいものでないと噛めないのだ。数えていないので適当だが、3回に1回は鮭、5回に1回は牛で、どれも脂でとろとろの物である。僕が胃腸が弱く、特に脂っこいものが苦手ということもあるが、少なくともこれでささやかとはどうも言えないように思う。</p> -<p>ところである日豚の肉塊で焼豚を作ったのだが、茹で汁を冷蔵した上澄みの脂を炒め物に使おうと取っておいたのだが、それは食べたくないらしい。固形の脂は体内でも固まって健康に悪いというテレビの知識だそうだ。普段あんなに肉の脂を取っているのにそれは気にならないらしい。理屈はよく分からんがそれよりも今から作らんとしている野菜炒めを食べてくれるのかどうかが重要なのでそれを聞いた。返事は「しいては食べないけど。」というあいまいなものだった。食べないならサラダ油で作るか、別に一品追加しないといけないのだがどうかと聞き直すと、「しいては食べないけど。」という返事が再び返ってくるだけだった。これ以上聞くのも面倒なので、僕はせっかく取っておいた豚の脂を捨ててサラダ油で野菜を炒めた。これは他のことでも感じていたことだが、この人には自分というものが無いのか、あるいはそれがあっても表に出さないようである。別件ですこし口論になったことがあるので、感情がない訳ではないのだが。エドワードルトワックという米国の戦略家曰く、こちらの言うことを全部受け入れる国より、自分の立場をはっきりと言う国の方が同盟国として信頼できるそうだ。そんなのあたりまえじゃないですか。まる。住職の奥さんはどうやら自分の考えや感情を見せず、相手に全部任せる方が信頼関係を築けると思っているようだ。責任を全部こちらに押し付けているようにしか僕には見えないのだが。</p> - -<h2>台所が汚ない</h2> -<p>この寺はどこもかしこも物であふれかえっている。かろうじて法要に必要な本堂と控室はましだが、それでも不必要な物が多い。特に酷いのは台所である。おぞましい。寺の性質上貰い物が多いのはしかたがない。檀家さんにいろいろ貰ってそれをまた他の檀家さんに配るのだがそれでも余る。寺にいて消費するのは住職とその奥さんの二人だけであった。賞味期限がくるまでに食べきれないのはある意味仕方がないことでもある。本当は物を持ってくる檀家さんに寺の状況を話して少し持ってくる量を減らしてもらうべきだと思うのだが、奥さんはそうは考えない。檀家さんの気持をないがしろにできないからと、くれる物は断わらない。そして捨てる。これのどこがないがしろにしていないのかさっぱり理解できないが。ともかく現状は食べ物が多すぎるのだが、一番の問題は古い物を一向に捨てないことである。僕が寺に通い始めた頃は冷蔵庫がパンパンだった。しかも3台もである。二人暮しの家に小さくもない冷蔵庫が3台、悉く満杯だった。ある時台所にある冷蔵庫を上から下まで整理した。腐ったものを全部捨てた。奥からは2009年に賞味期限が切れたものなんかも出てきた。これは一番古い方だが、平均しても3年以上前のものだったと思う。ところで冷蔵庫の中からでてきたものは大体がスーパーなんかで奥さん自身が買ってきたもので、檀家さんから貰ったものはあまりなかった。檀家さんからの多すぎる貰い物に加え、自分でも異常に買い込むのだ。</p> -<p>この買い方もむちゃくちゃである。冷蔵庫の奥に抹茶が山程眠っていた。聞くとどれも自分で買ったものだと言う。お茶屋が友達なので行けば買わないと悪いとか、来客の為に新しい抹茶を用意したいとかで、無駄に多く買ってどれも処分しないのだ。ある日美味しくなさそうな出来合いのオムレツを買ってきた。どうやら本人も美味しくなさそうだと思いつつ買ったらしい。近くの個人経営の商店によく行くのだが、潰れては困るので欲しいものがなくても適当になにか買うのだそうだ。店の為に不要な物を買うのは良くないと思う。需要を歪めることになるからだ。大事な店ならむしろ自分が欲しい物を伝えて、要らない物は買わない方がいい。仕入れるかどうかは店の判断だろうが、客からも要望を伝えることで、その地域にとって必要な店になる可能性が高まるのではないか。不要なものでも買ってしまうと、結局好ましくない依存が生まれて返って店を潰すことになるか、そうでなくても地域に必要とされない店になるだろう。</p> -<p>冷蔵庫を一通り綺麗にしたその日の夕方、奥さんが大量の野菜と果物を仕入れてきた。流石に少し怒りが湧いた。そうでなくても奥さん自身、綺麗な冷蔵庫を喜んでいたので、再びちらかるようなことは避けようとも思い、そんなに大量に買ってこられるとまたぐちゃぐちゃになるだろうと小言を言っておいた。そんなに嫌味のつもりはなかったのだが。次の日も前日の野菜がたくさんあるにも関わらずまたいろいろ買ってきた。前日よりはさすがに少なかったが、同じように買いすぎだと思う旨を伝え、買ってきたものを何に使うのかひとつひとつ聞いてみた。すると見る見る顔が曇っていった。最後に、欲しいものを欲しい時に買って食べるのは自由だが、そのような買い物をするなら必ず冷蔵庫がぐちゃぐちゃになるから古い物はどんどん捨てていくことになるがそれでもいいのかと正すと、とうとう何も答えずにどこかに行ってしまった。その日の夕食はどうなったのか覚えていないが、多分普段通り食べたのだと思う。特に記憶にないということは、別にお通夜のようにはならなかったのだろう。次の日は朝から掃除に来ていた檀家さんとひと悶着あった。朝食の後になって奥さんがそのことで明らかに僕に対して敵意を剥き出しに、ああだこうだ言ってきた。内容はこまかくは覚えていないが、どうも檀家さんと僕とのやりとりと言うよりも前日のことについて攻めたてられたように思う。ひとつだけはっきり覚えているのは「論で言われると考えるのが面倒くさくなってしまう」という言葉だ。ではどうすればええねや。それから、檀家さんとのやりとりでは僕も良くない点があったのでそれを自分で分析するようなことを言うと、「自分で反省できて偉いわねぇ。」と言われた。こうも人の気持を逆撫でするようなことが言えるのかと思ったものだ。</p> -<p>調理器具も異常に多い。鍋もフライパンも同じような大きさのものがそれぞれ10個以上ある。使っていない調味料も置いたままである。冷蔵庫の他にもキッチンストッカーとか言ったか、間口が1m程度、奥行60cm程度、高さは2m近くあるような棚にびっしり保存食が詰っている。多分半分は賞味期限が切れている。この棚は台所の隣の4畳程の部屋にあるのだが、この部屋にはほかにも本棚のようなものが二つあってカップ麺やら乾物やらお菓子やらで埋まっている。足元にはダンボールに入った缶ジュースがあったり、使っていない家電があったり、変色した調味料のビンなんかもあったと思う。勝手に整理する訳にもいかず、整理を手伝っても冷蔵庫の時のようになりそうで、毎日一人の時間にただ眺めることしかできなかった。ある日疲れてぼーっとしているところを奥さんに見られたが、たまたま顔が食器棚に向いていたために、「物が多いと思ってるんでしょ。」と言われた。先方も僕がそこに居るだけで結構な心理的負担を感じているのだろうか。</p> - -<h2>檀家さんとの口論</h2> -<p>檀家さんの話が出たのでここに書いておく。</p> -<p>この檀家さんには以前、清澄寺という日蓮宗の聖地の森がコンクリートで覆われてたいへんだという話しをしていた。土をコンクリートにしてしまっては周囲の環境を著しく痛めてしまうという話である。このときは高田宏臣氏の本を持ち出して説明し、賛同してくれた。ある朝この檀家さんが境内の落葉を掃除している所に奥さんも居たので話しかけた。この時も高田さんの名前も出したように思うが、落葉を残して腐葉土にできないかとか、もっと境内に木を増やした方がいいのではないかなどと話すと、この檀家さんは落葉が積もると汚ないし、木が増えると虫が沸き、また管理も大変だからむしろコンクリートを増やすべきだと言った。前回コンクリートの話で同意してくれたのは何だったのか。</p> -<p>ところで話をしているとこの檀家さんの顔がみるみる曇り、最後にはとうとうまっくろけになってしまったのは怖かった。また、上で書いた自分の反省というのは、落葉を掃除している所に落葉を掃除しすぎるのは良くないのではないかという話を持ち掛けたことについてである。</p> - -<h2>物を捨てられない</h2> -<p>台所も汚いが、他の場所も物で溢れている。檀家さんに貰った物、檀家さんが作ってくれた物、自分で買った物。もちろん必要な物もあるだろうが、問題は奥さんも住職も不要だと思いながら捨てずにいる物である。檀家さんの気持を蔑ろにできないから捨てないというのはあまりにも問題である。結局それのせいで寺が汚なくなっては檀家さんの面目を返って潰しているのではないか。土地柄、檀家さんには漆器屋さんが多い。漆の盆は押入に積み上がっている。どこかの旅行のお土産といってでかい塗の囲炉裏をくれたが、これは部屋の隅に起きっぱなしで使ったためしがない。昔本堂で使う椅子がなく、急遽檀家さんが空き缶を束ねてダンボールかなにかと布で綺麗に包んだものが今も本堂の隅に出しっぱなしで、使っているのを見たことがない。二人暮しなのに大きな食器棚が6個くらいある。どれもぱんぱんに詰っている。昔は檀家さんがよく集って食事をしたそうだがそれでもなお余るほど多い。何十年も寺に通っている信者さんが、今でも来るたびに初めて見るカップが出てくるという。箪笥が多い。使っていないものもある。ひどいことに同じ箪笥を2個重ねて置いている。上にではなく、前後に2個重ねているのである。1個無駄じゃん!ねぇよ赤外線はよぉ。</p> -<p>寺というのは俗世間にはない空気を作るべき場所ではないのか。綺麗に片付けて掃除して、物で溢れた豊かなこの世界にあって、物質的ではない本当の豊かさを提示する場所でなくていいのだろうか。物質的な豊かさを賞賛するのであれば寺はもっと金儲けに走るべきであろう。そうしないのはそうではないものを世間に見せるためであろうに。</p> - -<h2>人格を感じられない人</h2> -<p>住職の奥さんにしても、上に書いた檀家さんにしても、本人が一体何を考え、感じているのか僕にはさっぱり掴めない。上に書いた檀家さんとのやりとりだけでなく、住職の奥さんも普段の会話では僕の考えに概ね賛同してくれる。始めは話の合う人なのかと思っていたがどうもそうではなかったらしい。この人達は自分に関係のない話に関してはその場の雰囲気や同調を重視して賛同しているような空気を作りだすが、自分に関係のある話しになると突然豹変して自らの利権を死守しようとするようである。僕はこの一年、このような人と付き合うことに疲れてしまったようである。僕はこのような人の感情を読むことができず、何を考えているのかも分からない。論理的に考えるのも無駄だった。僕はこの人達に一切の信頼を置くことができない。</p> -]]></description> -</item> -<item> -<title>田舎の夏休み</title> -<link>https://www.mtkn.jp/journal/posts/20220814.html</link> -<guid>https://www.mtkn.jp/journal/posts/20220814.html</guid> -<pubDate>Tue, 16 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>田舎の夏休み</h1> -<time>2022-08-14</time> -<p>西の空が赤く染まり始めた頃、田圃の中の畔道を寺に向かっていると、向こうから少年が歩いてきた。釣竿の先になにやらぷらぷらさせている。タウナギかなにかだった。</p> -<p> -「釣ったん?」<br> -「うん」<br> -「すげぇ」<br> -</p> -<p>田舎の夏休みはまだ生きているようだ。</p> -]]></description> -</item> -<item> -<title>正座が出来ていた頃に戻るには</title> -<link>https://www.mtkn.jp/journal/posts/20220813.html</link> -<guid>https://www.mtkn.jp/journal/posts/20220813.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>正座が出来ていた頃に戻るには</h1> - -<h2>正座できない</h2> -<p>今時の年寄は正座のひとつも満足に出来ない。明治期に体育を輸入し、学校が椅子になり、その効果がようやく全ての世代に波及した。現住職のお婆さんはまだ正座ができたそうだ。夏の暑い時期を除いて年中和服で生活しており、亡くなる直前まで足腰はしっかりしていたという。この人の娘で、現住職のお母さんはもう正座ができなかったようである。現住職とその奥さん、そして当然僕自身も正座ができるとは言えない身体である。</p> - -<p>お寺によく来てくれる人達も正座できない。正座の姿勢になることすら一苦労のお年寄も多い。このため寺としては本堂にも椅子を用意せざるを得ず、少しなら正座できるという若い人達も皆椅子に座ることになるという悪循環である。</p> - -<h2>物が多い</h2> -<p>この寺には物が多い。良いと思って自分達で買ったものや、良いと思って檀家さんが持ってきてくれたもので溢れかえっている。これを少しは整理したいのだが。</p> -<p>中でも椅子に関してはどうしよもない。場所を取る。普段はあまり人が来ないのだがお盆やお彼岸には結構集まるようである。この時集まった人達はみんな椅子が必要だというので、かなりの数の椅子が寺に置いてあるのだが、片付ける場所が無いと言って本堂の端っこに出しっぱなしなのだ。一応重ねて並べてあるので整然とはしているが。というか中には多少は正座できる人もいるだろうからその人達は椅子いらんやん。それにたくさん人が集ったからといっても今ある椅子を全部並べる広さもないと思うのだが。</p> -<p>などと考えても、住職もその奥さんも頑である。必要だから置いている。場所がないから仕方ない。せっかく檀家さんが持ってきてくれたものだから仕方ない。</p> -<p>正座できる人ばかりなら椅子など全部捨てられる。中に一人や二人足の悪い人がいてもその程度の数を用意すれば済むのだ。人がぎゅうぎゅう詰めになるようなら座布団を敷かずに正座すればいい。日本の家は狭いんやから正座しようや。</p> - -<h2>老後の自由</h2> -<p>正座が出来ると老後も自由に動ける。住職のお婆さんがいい例である。今時の年寄は医学の為にかろうじて生命活動を維持してはいるが、生きているようには見えない。身体が動きにくいのを年のせいにしているがそれは間違いだろう。若い時から身体の使い方を考えていればそんなことにはならない。甲野善紀を見れば分かる。黒田鉄山もそうだ。僕が知っている合気道家も多くは年をとっても身体に不自由はない。</p> -<p>死ぬまで身体を自由に動かすにはやはり身体の感覚を磨くのがいいと思う。その為に古武術や剣術、合気道などを習わなくても、正座するだけで十分だと思う。光岡英稔がそんな感じのことを言っていたかな。今の椅子というのは、椅子が人間を座らせているものが多いと思う。だから身体に合った椅子、座りやすい椅子などと言って売っているのだ。だれか椅子の本を書いていた。日本には良い椅子がないと。日本人は椅子に座らされるのが窮屈だったからではないか。日本人の身体観では、椅子が自分を座らせるよりも自分が椅子に座る方が心地良かったのではないか。正座の場合、下にはただ平たい床があるのみである。家によっては床板がゆがんでいるかもしれない。日本人はそこに自ら座って生活してきたのだ。床が人を座らせていた訳ではない。僕は人間工学に基づいたと言って売られているものが嫌いなのだが、そのような商品は人間が使うというより商品に人間が使わされるように感じていたのかもしれない。</p> -<p>普段から正座で生活する。これだけで老後の自由が手に入るんやからやらん手はないやん。</p> - -<h2>状況を変えたい</h2> -<p>この状況をどうにか昔に戻せないものか。上に書いた以外にもいろいろな問題の根本には正座ができないことがあるように思う。ちょっと乱暴かな。然し正座が出来るだけで解決する問題は山ほどあると思う。</p> -<p>ではどうすれば日本人は再び正座できるようになるのだろう。最も根本的な解決策はやはり小学校から椅子を無くすことだと思う。我々は物心付いてよりこのかた、ひたすら正座をしない訓練を受けてきたと言えよう。そういえばなぜか幼稚園には椅子がなかった気がする。床で物を広げて遊んでいたような。記憶違いかな。他の解決策など無いと言ってもいいくらいかもしれない。</p> -<p>然しこれを実行するにはまず世間の意識を変える必要がある。そのためには今なら科学的根拠が便利か。科学っぽい根拠。正座して育った子供と正座せずに育った子供の将来の偏差値を適当にデータとして示せばいいだけなのでこの第一歩は割とすぐできるのかな。</p> -<p>あるいは寺子屋をやってそこでは正座させればいい。その後彼らの成長を追っていけばいい。何十年かやってメディアにでも取り上げられれば少しは正座を見直してくれそうなものである。</p> -<p>然し問題はここからかもしれない。良いことだと説得しても自分の生活に直結させる人があまりに少ないように思うからだ。樹木の重要性やコンクリートの有害性を言って納得してくれたように思っても、自分が掃除している庭はそれとは切りはなして考えるようである。その一方であまりにもメディアで大々的に取り上げられると、論理を一切考えずに全て受け入れてしまうようだ。マスクやワクチンの話である。と思っても、論理を無視してメディアを信じない人も居る。結局自分の信じたいことしか信じないというのはこういうことなのか。自分自身にこのような傾向があるのは実感していたが、僕の周囲の人達はどうも無意識のうちに情報を取捨選択しているようで、これでは自己反省もくそもできない。人のふりみてなんとかと人には言うが、自分自身には一切あてはめて考えないようなのだ。</p> -<p>正座が良いと言ってもきっと自分とは関係のない世界の話だと思って終わる可能性もある。現在でも棋士はずっと正座であり、その方が集中できるという話は聞くが、だからといって自分の生活に正座を取り入れる人は稀である。ではもっと大きく報道させて今のマスクのように流布すればいいのか。これは僕は嫌いである。ただ空気と同調圧力を形成するだけで、あらぬ方向に向かってしまう可能性も考えないといけない。やっぱり一番気分がいいのは自分自身で実行してその姿を世間に晒すことである。あとは世間が思い思いに判断して行動すればいいのだ。寺子屋で子供に正座をさせてその変化を観察するのがいいだろう。社会全体に変化があらわれるまで50年くらいかかるのかな。</p> -]]></description> -</item> -<item> -<title>RSS作った</title> -<link>https://www.mtkn.jp/journal/posts/20220729.html</link> -<guid>https://www.mtkn.jp/journal/posts/20220729.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>RSS作った</h1> -<time>2022-07-29</time> -<p><a href="/rss.xml">RSS</a>作った。疲れた。htmlファイルのタイムスタンプを元に更新日を出力したが、なぜかほとんどのファイルのタイムスタンプが最近の日付になってしまっていたので修正しないといけなかった。RSSフィードの作成にはこのウェブサイトを出力するために作った<a href="https://git.mtkn.jp/dotfiles/file/bin/kagero.html">スクリプト</a>に組み込んだ。</p> -]]></description> -</item> -<item> -<title>小松菜の種を蒔いた。</title> -<link>https://www.mtkn.jp/journal/posts/20201210.html</link> -<guid>https://www.mtkn.jp/journal/posts/20201210.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>小松菜の種を蒔いた。</h1> -<time>2020-12-10</time> -<p> -駅の近くに種苗店がある。 -以前から気にはなっていたのだが、いつ前を通っても店主がお客さんと話し込んでいて入りづらかった。 -ところが今日はだれもいなかったので遂に敷居を跨ぐことができた。 -</p> -<p> -時期が時期なので余り品揃えはよくなかったが、いろいろと教えてくれた。 -F1ではない種も多数取り扱っているようで、和歌山大根という地元の品種もあった。 -今ある種のなかから、一年中いつでも蒔ける小松菜をいただいてきた。 -楽天という品種だった。 -</p> -<p> -家に帰って早速種を蒔いた。 -先日広げた畝に、北側から2坪ほどの土にばら蒔きした。 -少し乾燥ぎみだったので、横に散らばっていた草を上から被せた。 -</p> -]]></description> -</item> -<item> -<title>畝を繋げた</title> -<link>https://www.mtkn.jp/journal/posts/20201209.html</link> -<guid>https://www.mtkn.jp/journal/posts/20201209.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>畝を繋げた</h1> -<time>2020-12-09</time> -<p>この土日に不耕起の農法を教えてくれる赤目自然農塾にお邪魔してきた。 -その際、今の畝では幅が狭すぎるので広げたほうがいいといわれた。 -とりあえず畝の間の溝を埋めて二つの畝を繋げることにした。 -余り無理をしても次の日動けないのは困るので今日は一列だけ。 -180cmから2m程度の畝になった。 -</p> - -<p> -先日植えた玉葱は根がきちんと活着してくれたようで、 -寝ていた株も起きあがって元気そうである。 -ただしこの畝は細いままなので、やはり表面が少し乾燥しているようだ。 -</p> -]]></description> -</item> -<item> -<title>たまねぎを植えた。</title> -<link>https://www.mtkn.jp/journal/posts/20201202.html</link> -<guid>https://www.mtkn.jp/journal/posts/20201202.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>たまねぎを植えた。</h1> -<time>2020-12-02</time> -<p> -祖父の友人がたまねぎの苗を分けてくれたので植えた。 -時期はかなり遅いみたいだがうまくそだってくれるだろうか。 -</p> -<p> -耕していない畝に15cm間隔、条間20cmくらいで少し穴を掘って植えた。 -その上から、先日刈った雑草を被せておいた。 -とりあえず一畝だけ。 -</p> -]]></description> -</item> -<item> -<title>畑をさせてもらえることになった。</title> -<link>https://www.mtkn.jp/journal/posts/20201201.html</link> -<guid>https://www.mtkn.jp/journal/posts/20201201.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>畑をさせてもらえることになった。</h1> -<time>2020-12-01</time> -<p> -実家のとなりに畑がある。 -子供の頃はそこで育った野菜をよくもらって食べていた。 -最近そこを耕していたひとが高齢のため引退して、 -雑草が生え放題になっていた。 -</p> -<p> -先日その土地の地主が草刈に来たので声をかけたところ、 -暫く使う予定がないので使ってもいいとのことだ。 -</p> -<p> -ということでぼちぼち何か作ろうと思う。 -</p> -]]></description> -</item> -<item> -<title>何をして生きようか</title> -<link>https://www.mtkn.jp/journal/posts/20201003.html</link> -<guid>https://www.mtkn.jp/journal/posts/20201003.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>何をして生きようか</h1> -<time>2020-10-03</time> -<h3>仕事</h3> -<p> -研究者を目指して大学に入り挫折した。 -</p> -<p> -就職先を考えたが、やりたい仕事などそれまで考えたこともなかった。 -そのためやりたいことを基準に仕事を選ぶことができなかった。 -そこで考えたのが、なんのために働くかということである。 -地元には親戚がたくさんいて正月や盆には大勢集まる。 -サマーウォーズみたいな感じ。 -残念ながら古民家に集まるわけではないが。 -僕は家というものが好きだった。 -大学を出てからの人生はその家を更に大きくすることにしよう。 -そう考えた。 -そしてそのための方法として選んだのが、実家が営んでいる -ダンボール工場を嗣ぐことであった。 -そのために卒業後はまず同業大手で勉強させてもらい、 -数年後実家に帰ることにした。 -</p> -<p> -ところがいざ働き始めたらどうだろう。 -何もやりがいがなかった。 -回りにいるひととは全く反りが合わなかった。 -労働環境は最悪だった。 -生活環境も受け入れられなかった。 -気づけばストレスで心身がボロボロになり、盆休み開けにとうとう寝込んだ。 -</p> -<p> -仕事が嫌になった。 -その原因について、はじめは成長が感じられないからとか、 -無駄なことを無駄だとわかっているのに無理やりしているからとか、 -いろいろ理由を分析してみたものっだったが、今思えばどれも違う。 -単純に世間一般に広く普及している仕事というものに適正がないのだろう。 -心療内科の医者によれば、僕の症状は適応障害だそうだ。 -こんな世界に適応などしてたまるものか。 -</p> -<h3>社会は嫌いだ</h3> -<p> -この社会に適応できないのは今に始まったことではないと思う。 -</p> -<p> -京都から和歌山に帰省するたびに、大阪の町並みが汚いのが気になりだした。 -駅の周りには鉄筋コンクリートの四角い箱が乱雑に並んでいるのである。 -どれも建てられた当時は先進的なデザインでおしゃれだったのだろう。 -そして駅から少し離れた場所にも同じくコンクリートの箱が並んでいる。 -こちらは最近建てられたらしく、デザインも今風である。 -30年建てば時代遅れの残念な物件になるのだろう。 -こんな家を建てる人たちは一体何を考えているのやら。 -人生で一番大きな買い物と言いつつ、ろくに調べもしないでハウスメーカーの -口車に乗せられ、モダンでおしゃれな家を建てる。 -自分の建てた家に子々孫々住んでほしいとは思わないのだろうか。 -</p> -<p> -ある時からスーパーに行くのがしんどくなった。 -出町柳にある枡形商店街の近くに住んでいたことがある。 -その間食事の買い物はほとんどそこに通っていた。 -豆腐屋、肉屋、乾物屋等、専門店が一通り揃っていた。 -扱っているものは当然そのへんのスーパーよりも美味しかった。 -ある時伏見の方に引っ越して、久々にスーパーに通い始めたのだが、 -これが非常にしんどかった。 -音楽がうるさくて買い物に集中できないのだ。 -なんだかよくわからない音楽がやたら大きな音で流れている。 -夕飯を考えながら、美味しいものを選別しようとしている脳みそに、 -その思考を遮るように流れてくるのだ。 -だんだん頭がぼーっとしてきて、結局適当に選んでしまう。 -スーパーでは音楽だけでなく、視覚的な表示も鬱陶しい。 -商品のパッケージは周りよりも少しでも目立とうとするばかりで、 -欲しい情報が一切目に入らない。 -適当に選んで家に持って帰るが、結局対して美味しいものではない。 -スーパーに並んでいるものは、本質的な価値ではなくマーケティングを始めとする -販促にかかるコストの割合が多いのだろう。 -「美味しいワイン」。「リコピンが多いトマト」。「DHAが含まれているソーセージ」。 -だまっとれや。 -ただ、そういうものが多く売られているというのは、それはつまり -消費者がそういうものを購入すると言うことである。 -同じものであってもパッケージに美味しいと書いていた方を買うのだろう。 -スーパーでものを買って行く人々が、心理学に踊らされているだけのモルモットに -見えてきた。 -こんな人たちの中に居たくない。そんなこと書いたら叩かれるかな。 -</p> -<p> -スーパーがだめになれば他の店もかなり辛くなった。 -結局ものを売るというのは同じことなのである。 -自分でも驚いたが、スーパーにいけなくなってから、無印良品にも行けない。 -よくわからん音楽が流れる中で、独自のおしゃれ感を作り出しそれを売っている。 -物自体もそんなに質の高いものではないし。 -そこに集う人たちも、雑誌でよく見るテンプレ通りの最近の若者である。 -雑誌はあまり見ないので知らんけど。 -</p> -<p> -この人たちは自分の内側から湧いてくる価値観というものを自覚したことが -あるのだろうか。 -人工的に生み出された流行に踊らされているだけなのではないだろうか。 -</p> -<p> -スーパーに行かなくなり、巷で流行っているものを消費しなくなり、 -いよいよ自分がなぜ働いているのかわからなくなった。 -</p> -<h3>やっぱ農家かな</h3> -<p> -世の中にはびこっている様々なものに価値を見いだせなくなったわけだが、 -それでも買わないと生きて行けないのが食べ物である。 -就職してからの半年間は食べ物には結構こだわっていた。 -スーパーに行けないこともあり、学生時代に商店街に通っていたこともあり、 -住処の周りにある個人商店やらを探し回った。 -家から徒歩圏内に豆腐屋と魚屋を見つけた。 -野菜は鎌倉の即売所まで買いに行った。 -米も鎌倉の米屋に求めた。 -乾物も鎌倉だ。 -休みの日は結構な時間と労力を食べ物に投資していたと思う。 -美味しいものを食べてこその人生なのである。 -</p> -<p> -やっぱり農家になりたいな。 -</p> -]]></description> -</item> -<item> -<title>SSLに対応しました。</title> -<link>https://www.mtkn.jp/journal/posts/20200926.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200926.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>SSLに対応しました。</h1> -<time>2020-09-26</time> -<p>Certbotを使ってSSLに対応しました。</p> -<p> -と言っても特に暗号化する必要のある情報は -取り扱っていないので完全に自己満足ではありますが。 -</p> -]]></description> -</item> -<item> -<title>rsyncによる投稿テスト</title> -<link>https://www.mtkn.jp/journal/posts/20200925.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200925.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>rsyncによる投稿テスト</h1> -<time>2020-09-25</time> -<p>自宅のパソコンから直接rsyncで投稿てすと。</p> -]]></description> -</item> -<item> -<title>工場見学</title> -<link>https://www.mtkn.jp/journal/posts/20200919.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200919.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>工場見学</h1> -<time>2020-09-19</time> -<p> - 実家で営んでいる工場を嗣ぐために同業大手に働きに出ているが、 - そこで何を学べばいいのかわからないので、一度実家の工場を見学 - することにして、今日行ってきた。 -</p> -<p> - 見学して思ったのは、今いる大手の工場よりうちの工場のほうが - いい工場であるということだ。 - 工場内は比較的整然としているし、データベース等のシステムも - 今自分がいる会社よりは圧倒的に進んでいた。 -</p> -<p> - いよいよ自分が今の会社で働いている意味がわからなくなってきた。 - どうやら父は今僕のいる会社には人材を育成するための教育制度 - が整備されていて、その制度によって僕という人材が育成されることを - 期待していたようだ。 - 残念ながらそんな制度はなかったようだが。 -</p> -<p> - つまり僕が今の会社に居続ける義理もそんなにないようである。 - もちろん業界の知識は少なからず必要であり、今の会社でも - 働き続ければ多少は勉強できるだろうが、そのために投資する時間 - に対して割に合わないだろう。 -</p> -<p> - ではどうするか。今の会社をやめるのであれば転職である。 - そしてその転職先は実家かそれ以外かである。 - 今実家に就職するのはいい選択なのだろうか。 - 僕は業界に関する知識もないし、ビジネスの世界も全く知らない。 - こんな状態で就職しても、おそらく他の人と同じようなことしか - できないだろう。工場に新鮮な空気を取り込めないのだ。 - だから今は一旦業界を離れ、全く別の世界を覗きに行くのがいいのではないか。 -</p> -<p> - 個人的に興味があるのはIT系である。 - 工場のDXという言葉がよく新聞に並んでいるが、その流れを - 実家に持ち帰れるかもしれない。 - もう一つ興味があるのは農業である。 - 僕がかってに妄想しているだけだが、近いうちに大量消費社会が - 終焉を迎え、自分たちにとって本当の豊かさとは何か、今一度 - 考え直す秋が来ると思う。そうなれば必然的に見直されるのが - 農業である。社会から何を削っても絶対に外せないのが食だからだ。 - そこに豊かさや幸福を求めるのは自然なことだろう。 - そんな農業とのつながりを何らかの形で事業に持ち込めれば - いいかもしれない。 -</p> -<p> - いずれにせよ今のままダラダラと働くのはごめんだ。 - 無駄なことに時間と精神を費やすのはアホである。 - 我慢して頑張っても、それで身体を壊した上に何も学べない。 - そんなのは投資とは言えない。 - 頑張るのではなく、精神の求める方に流れていくほうが自然な生き方だろう。 - とにかく現状を変化させて前に向かって進みたいのだ。 - 自ら動かなければ何もおきない。 - 連休中にエントリーシート書こうかな。 -</p> -]]></description> -</item> -<item> -<title>仕事</title> -<link>https://www.mtkn.jp/journal/posts/20200918.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200918.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>仕事</h1> -<time>2020-09-18</time> -<p> -今の仕事がつらい。 -やっているのは得意先から届く注文書のファックスを自社のデータベースに入力するだけの仕事だ。 -誰でもできる仕事であり、近い将来自動化されるだろう。その一方でファックスの様式が得意先毎に異なり、入力時にはその注文書に明記されていないことも考慮しなければいけない。 -日本企業の生産性が低い原因をまじまじと見せられている。 -このような業務なので、入力作業自体は1日もかからずに覚えられる一方、得意先毎の細かい違いを覚えるのに何年もかかるだろう。 -日に日にこの業務に慣れ、入力は速くなっているが、自分が成長しているようには感じない。この会社のこの業務という非常に限定的な分野でしか使えない技術だけがついていくからである。こんなことでは転職しようにもよその会社で使える技術が何もないので、新卒と同じ土俵にたたなければいけなくなる。採用する側もそんな人材に興味はないだろう。 -</p> -<p> -成長したい。 -成長とはなんだろう。 -多分生きていく上で使える技術を身に付けることである。 -生きていく上で使える技術とはなんだろう。究極的には畑で作物を育てる技術だと思うが、そんな世紀末のことはまだ考えなくてもいいかもしれない。 -汎用性のある人間になればいいのだろうか。 -そうすれば何でもできて食いっぱぐれない。 -しかしその「何でも」の中に今の仕事は含まれていない。 -成長が感じられない単純な作業はストレスで死んでしまう。 -つまりなんでもできるの中には成長しない仕事は含まれない。 -</p> -<p> -なぜ今の会社にいるのか。 -それは実家に帰るためである。 -実家で工場を経営しているのでそこを嗣ごうと考えた。 -そのために同業大手に就職し技術を持ってかえるように父に言われた。 -ところがいざ就職してみると、僕が考えていた技術が一向に学べていない。 -その一方で今学んでいることは父が持って帰ってほしい技術であるようだ。父は工場で必要な細かい技術や知識を持って帰ってほしいらしい。 -僕はそんなものはほしいとは思わない。この業界に特化しても生き残れないと考えるからだ。もちろん業界に特化した人材も必要なのかもしれないが、それはあなたの長男ではないのではないだろうか。長女でも次男でもなさそうだし。 -</p> -<p> -今のところだからどうしたいと言うまとまった考えがあるわけではないが、少なくとも自分の学ぶべき場所はここではないと感じている。心身に無理が生じているのを感じるからだ。 -業界の知識を短期間で軽くさらって、そのあとは別の世界を見てみたい。どこかに成長を実感できる世界がないものか。 -</p> -]]></description> -</item> -<item> -<title>pythonやめました</title> -<link>https://www.mtkn.jp/journal/posts/20200917.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200917.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>pythonやめました</h1> -<time>2020-09-17</time> -<p>pythonをやめてbashスクリプトで作ったcgiに置き換えました。</p> -<p>管理がだいぶ楽になった気がします。</p> -<p>アプリの中身ばかりいじってブログの記事が全然増やせていませんが -ぼちぼち書いていきたいと思います。</p> - -<p>サーバーからbashのcgiを動かすにあたって、nginxがややこしかったので -apacheに変えたのですが、設定が適当なのでセキュリティが心配です。</p> -]]></description> -</item> -<item> -<title>localからの投稿テスト</title> -<link>https://www.mtkn.jp/journal/posts/20200804.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200804.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>localからの投稿テスト</h1> -<time>2020-08-04</time> -<p> - 今までhtmlファイルをクラウドにscpで持って行ってsqlを実行することで - ブログ記事を投稿していましたが、ローカルから直接投稿するスクリプトを - 書いてみました。 -</p> -<p> - 今の所単にsqlを遠隔で行っているだけですが、今後投稿済みの記事を編集 - したりできるように改良したいです。 -</p> -]]></description> -</item> -<item> -<title>今日の一汁一菜</title> -<link>https://www.mtkn.jp/journal/posts/20200802.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200802.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>今日の一汁一菜</h1> -<time>2020-08-02</time> -<section> - <h3>今日の一汁一菜</h3> - <p> - 今日の夕飯は切り干し大根とザワークラウトの味噌汁に - すりごまをまぶしたもの、 - かぼちゃを蒸して豆腐のそぼろをちらしたもの、 - そしてきゅうりと茄子の浅漬。 - </p> - <p> - 切り干し大根というものを初めて食べたがこれがなかなか美味しかった。 - 細切りにしてザルに広げ一日外に置いておいただけであるが、旨味が - 凝縮される上に食感もコリコリと面白くなる。 - </p> - <p> - 大根の相手は6月の中頃に漬け込んだザワークラウトである。 - 乳酸の酸味が熱い体に染み渡る。 - </p> - <p> - 味噌を溶いて椀に注いだら、最後に煎りごまをすって入れる。 - 酸味とごまは相性が抜群である。 - </p> -</section> -<section> - <h3>野菜を干す</h3> - <p> - しばらく前に冷蔵庫の電源を落とした。 - 発酵食品ばかり仕込んでいたので冷蔵庫の中がスカスカになり、 - 冷蔵庫は不要なのではないかと考えていた。 - そんなある時とうとう空っぽになったので、これを期に - 冷蔵庫なしの生活を試してみようと考えたのだ。 - </p> - <p> - しかし一人暮らしなので、一食で野菜をまるまる使い切ることはあまりいない。 - 使いかけの野菜はどうしても出る。 - ぬか床に忍ばせたり塩漬けにしたりいろいろ工夫した。 - そのうちの一つが干すということである。 - 梅干しを作るために買ってきた竹のザルが二枚あったので、 - 余った野菜を適当に切って並べ、梅雨明けの晴天に - 晒してみた。 - </p> - <p> - この干し野菜がどれもこれも美味しいのには感動した。 - 冷蔵庫のはしっこでしんなりした野菜とは大違いである。 - </p> -</section> -<section> - <h3>当たり前?</h3> - <p> - 昔の人たちは当たり前のように行っていた干すという保存法。 - それをすっかり忘れ、冷蔵庫を家に置くことが常識と化している。 - 大学に進学して一人暮らしを始めるにあたり、なんの疑問も持たず - 冷蔵庫を購入したのが懐かしい。 - 冷蔵庫だけではなく、洗濯機や電子レンジも同じである。 - そういえばテレビは買わなかったが… - </P> - <p> - 当たり前という感覚を捨て、本当の豊かさを考えたい今日この頃。 - 冷蔵庫を捨てる日は近いか。 - </p> -</section> -]]></description> -</item> -<item> -<title>Djangoやめました</title> -<link>https://www.mtkn.jp/journal/posts/20200801.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200801.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Djangoやめました</h1> -<time>2020-08-01</time> -<section> - <h3>Djangoやめました。</h3> - <p> - タイトル通り、Djangoを使うのをやめました。 - 代わりにwsgirefを使ってます。Djangoでも間接的に使っていた - のかもしれないけれど。<br /> - 参考: <a href="https://c-bata.link/webframework-in-python/index.html"> - Webアプリケーションフレームワークの作り方 in Python - </a> - </p> - <p> - ただでさえガバガバだったセキュリティが更にザルになっていると思いますが、 - 特に大事なものは置いていないし、Docker使ってるし、大丈夫だと - 思っておいていいかな。攻撃しないでください。 - </p> -</section> -<section> - <h3>サイトのデザイン</h3> - <p> - それから、サイトのデザインも変更してます。 - 一応明確なテーマを以て作っているのですが、なかなか思うような感じに - ならないです。<br /> - 少しずつ調整していくつもりです。 - </p> -</section> -]]></description> -</item> -<item> -<title>けの日</title> -<link>https://www.mtkn.jp/journal/posts/20200727.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200727.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>けの日</h1> -<time>2020-07-27</time> -<section class="introduction"> -<p>普段の生活を少しばかり記録しておこうと思う。</p> -<p>社会人一年目の7月の終わり頃の生活である。</p> -</section> - -<section class="morning"> -<p> -朝はだいたい四時から四時半には目が覚める。 -ちょうど日の出と同じ頃である。 -前日はだいたい九時半頃布団に潜るので睡眠時間は七時間といったところである。 -本当は八時間寝たほうがいいと思っていたが、七時間で自然と目が覚めるので自分には -このくらいがあっているようだ。 -</p> -<p> -朝日を眺めながら米を火にかけ、余っている野菜で煮物を二品ほど作る。 -糠床から香の物を拝借してくれば弁当の完成である。 -朝食は食べない。 -</p> -<p> -布団を畳んで箒をかけ、フローリングは雑巾で軽く拭く。 -今の借家に越してきてから雑巾がけを始めたが、思えば小学校以来かもしれない。 -</p> -<p> -煮物に使った鍋をゆすぎお湯を沸かす。 -バットやボウルを片付けてきれいになったキッチンにコーヒーカップとビーカーを並べる。挽きたての豆で淹れたコーヒーを飲みながらこのブログのソースコードをいじるなどして七時をまつ。 -</p> -<p> -時間になれば着替えて出社。 -</p> -</section> - -<section class=evening> -<p> -五時に退社し帰宅。 -集に二回ほどは途中で豆腐を仕入れに高橋豆腐店に、魚を仕入れに小平鮮魚店に立ち寄る。 -家に着いたら米を火にかけその隣で出しをとる。 -余った野菜で味噌汁ともう一品作り、糠床から香物を拝借すれば夕飯の一汁一菜。 -</p> -<p> -その後はネットをちょつと見るくらいで、 -すぐに風呂にはいって寝てしまう。 -部屋の電気は常夜灯のみなので日が沈むと眠いのだ。 -</p> -</section> -]]></description> -</item> -<item> -<title>Django使うのやめようかな</title> -<link>https://www.mtkn.jp/journal/posts/20200725.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200725.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Django使うのやめようかな</h1> -<time>2020-07-25</time> -<p> -ホームページにも書いてあるとおり、このサイトはDjangoを使っている。 -しかしほとんど基本的な機能しか使わないのでここまで複雑で大きい -フレームワークを使う必要性は皆無である。 -全く使わない機能は結局習得することもないので、邪魔なだけだ。 -この程度のサイトであればもっとシンプルなもので作れそうだ。 -</p> - -<p> -半年ほど前にMacBookからOSXを消してLinux Mintに移行した。 -インターネットの回線に高額な料金を払うのが嫌で、一度すべて解約したのだが、 -OSXだとユーザーが何もしていなくてもバックグラウンドで大量の通信が -行われており、128kbpsでは何もできなくなったため、勝手に通信しない -Linuxに変えたのである。 -</p> - -<p> -ところがこのLinux Mint、というかデスクトップ環境のxfceには自分には全く必要の -ないアプリケーションが大量に入っているのである。もちろんOSXなんかより -圧倒的にましではあるが… -だんだん嫌になって、あまり考えずに片っ端から消していったら、 -なぜかはよくわからないが起動しなくなってしまった。 -これが確か今年の5月ごろだっただろうか。 -</p> - -<p> -丁度いい機会なのでLinuxの中でも何もない方であるArchのインストールを -試みることにした。 -過去にも何度か挑戦して、そのたびによくわからずに諦めていたが、 -今はパソコンを仕事などでも使っていないということもあり、落ち着いて -ドキュメントを読みながら進めると案外あっさりインストールできてしまった。 -</p> - -<p> -非常に快適である。 -</p> - -<p> -最近携帯を買い替え、人生で初めてAndroidというものを触ったが、 -これもかなり不要なものが入っていて不愉快だ。 -シャープお手製のよくわからないものは案外控えめだったが、 -キャリアである楽天関係のアプリに加え、Googleのアプリケーションが -大量にインストールされている上、それらはさも当たり前のように僕の -個人情報を要求するのである。 -</p> - -<p> -不必要な"便利さ"のためにただで情報を収集する。 -"最大限の便利さ"を提供することが正義で、そのためにはプライバシーを -犠牲にしてもいいと思っている。 -余計なお世話だ。 -</p> - -<p> -このページももっと軽い感じにしたいな。 -</p> -]]></description> -</item> -<item> -<title>多少体裁を整えました</title> -<link>https://www.mtkn.jp/journal/posts/20200723.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200723.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>多少体裁を整えました</h1> -<time>2020-07-23</time> -<section> -<h5>変更点</h5> -<p>とりあえず改行できなかったり装飾できなかったり不便なので、 -htmlで投稿できるように変更しました。</p> -<p>それからcssを作って多少見れるようにしました。</p> -</section> - -<section> -<h5>これから</h5> -<p>サイトのデザインですが、できるだけシンプルにしたいと考えています。 -モダンな感じのページは多いですが、視覚効果が多すぎるように感じます。 -本当に必要があってつけているのか、”いい感じ”だからつけているだけなのか… -</p> -<p> -必要なのは投稿の中身と、それから横には目次があると読みやすくなると思っています。 -サイドバーはそのために作っています。 -</p> -<p>あとは投稿の中に画像を埋め込みたいです。</p> -</section> - -<section> -<p>そういえばドメインを契約してDNSにIPアドレスを登録したのですが、丸3日たっても名前解決できません。 -いつになったらつながるのかな。</p> -</section> -]]></description> -</item> -<item> -<title>最初の投稿</title> -<link>https://www.mtkn.jp/journal/posts/20200719.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200719.html</guid> -<pubDate>Sat, 13 Aug 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>最初の投稿</h1> -<time>2020-07-19</time> -とりあえずサイトの立ち上げが完了しました。最初の投稿です。 -まだhtmlは適当でcssは全く無いので味気ないサイトですがこれからいろいろといじっていければと思います。 - -この投稿も多分改行が反映されずに読みにくいものになるかと思いますが、記録として残しておきたいので書いておきます。 - -ただしdockerとpostgresqlのことがいまいちよくわかっていないので、間違ってデータベースごとけしてしまうかもしれません。まあそれはご愛嬌。 -]]></description> -</item> -<item> -<title>冷蔵庫と豊かな生活</title> -<link>https://www.mtkn.jp/journal/posts/20200808.html</link> -<guid>https://www.mtkn.jp/journal/posts/20200808.html</guid> -<pubDate>Wed, 20 Jul 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>冷蔵庫と豊かな生活</h1> -<time>2020-08-04</time>作成<br> -<time>2022-07-20</time>更新 -(誤植を修正したが、HTMLのソースの改行に伴う半角スペースはそのままにしておいた。) - -<section> - <h3>はじめに</h3> - <p> - 冷蔵庫の必要性に疑問を感じ始めた。 - 去年の暮れあたりから発酵食品に凝り始め、 - 冷蔵庫の中が少しずつ空いてきた。 - また、同じく去年の暮れ頃、体の冷えがあまりにひどくて - 卒業研究に集中できない状態だった。今年に入り春から夏にかけて - 気温が上がっていく中でも、体が冷えていることに - 変わりはなかった。 - </p> - <p> - 冷蔵庫の必要性を感じなくなり、冷蔵庫で冷やされたものが - 体に良くないのではないかと考えるにいたり、 - とうとう冷蔵庫の電源を落とした。 - 以降何不自由なく暮らせている。 - </p> - <p> - 一度使わなくなると、そもそもなぜこのようなものが当たり前のように - 普及しているのか疑問に思ったのでいろいろ考えてみた。 - </p> -</section> -<section> - <h3>発酵食品へ</h3> - <p> - 去年の秋、引越しに伴い生活費がカツカツになり、それまで特に - 考えずにいた家計について少しばかり見直そうと思い立った。 - そして節約の一環として外食を一切やめ、全ての食事を - 自炊に頼るようにした。 - 先に書いたようにまずはお金がなかったので、近くの青果市場で - 見切り品として売られていた30円の野菜ばかり買っていたが、 - 一月ほど節約すれば余裕が出てきてすこし贅沢をするようになった。 - と言っても外食ではなくあくまで自炊である。 - 出町柳の乾物屋に行って鰹節を求め昆布を買い、味噌汁用の出汁 - をきちんと取るようになった。 - どうでもいいが味噌汁用に鰹節を買いに行くと決まって鯖節を - 勧められるので、求めたのは鰹だが実際に使っていたのは - ほぼ鯖であった。また、いつも話し方に癖のある主人が - 対応してくれるが、ある時おばあさんが店に出ていた。 - 独特の話し方が主人と全く同じだったのには驚いた。 - 味噌汁に入れる豆腐を豆腐屋で仕入れるようになったのもこの頃である。 - 豆腐屋の人はなぜか皆遠藤征四郎師範のような腕をしている。 - </p> - <p> - 自分で出汁を引いて作った味噌汁はうまい。そこに浮かんでいるのが - 豆腐屋の豆腐なのでなおさらである。 - 自分の舌が肥えていくのがわかった。 - </p> - <p> - そんなある日、スーパーで見かけた浅漬を買って食べた。 - 漬物は昔から好物だったが、金がないのもあり見ないふりをしていたが、 - なんの気なしに手にとって買い物かごに放り込んでみたのである。 - ところがこれがいまいちだった。一口含んだときはまあそれなりに - 美味しい気はするが、しかしなんというか、奥行きがないという感じ - なのだ。それ以来スーパーの漬物は買わなくなってしまった。 - </p> - <p> - しかし漬物は食べたい。 - 結局その頃通っていた近くの米屋で糠をもらってきて - 自分で漬けることにした。 - その際にいろいろ調べたが、どうやらスーパーで売っている漬物 - はどれも発酵していないようなのだ。 - 人工的にうま味を添加した液体に野菜を浸しただけのものらしい。 - 奥行きがないわけである。 - <p> - 糠漬けに始まり、烏賊の塩辛、キムチ、バター、パンの酵母、 - 梅干し、熟れ鮓等発酵食品はいろいろ作った。厳密には塩辛と梅干しは - 発酵していないのだが。 - </p> - <p> - そんなある時ザワークラウトを漬けた。 - このときは漬物が食べたいからというより、単にキャベツを保存する - ためである。 - 一人暮らしだと、冷蔵庫があってもキャベツひと玉は傷んでしまうのだ。 - </p> - <p> - 冷蔵庫でも痛むので塩漬けにする。 - </p> - <p> - だったら冷蔵庫要らんのでは? - </p> - <p> - 冷蔵庫を手放そうと思い始めたきっかけである。 - </p> -</section> -<section> - <h3>身体の冷え</h3> - <p> - 去年の冬、身体があまりにもだるかった。 - 何もできない。お腹も痛い。 - 地元の漢方薬局を樹脂下が、渡されたのは冷えに効く - 薬ばかりだった。 - 中には重度の冷え性の女性が生理中に身体を温めるための - ものも入っていたw。 - この頃はとにかく身体がだるいだけで、 - 自分では冷えているのかどうかよくわかっていなかった。 - ところが漢方薬局の先生に不調を訴えると、 - ことごとく冷えが原因だと言われた。 - 頭痛も腹痛も倦怠感も、全て冷えだと。 - そんな状態で真冬を迎えた。確かに寒い。身体がキンキンに - 冷えているのがわかるようになった。 - ふくらはぎはずっとむくんでいるし、 - 末端は冷たいし、周りが普通にしている部屋で一人だけ - 凍えていた。 - この頃から身体の言うことをもっと聞いてあげないと - 何もできないことがわかった。 - </p> - <p> - 以来身体の状態はできるだけ観察するようにしている。 - そして気づいたのだが、自分の身体がずっと冷やされているのだ。 - 春が過ぎ暖かくなっても、至るところで冷房画家明かり - 冷たい飲み物を出される。 - まるで汗をかくことが悪であるかのような世界である。 - </p> - <p> - この気付きにより、今年の夏は冷たいものは摂取しないようにしている。 - というよりあまり欲しいとも思わないのだ。 - 喉が乾いても常温のもので満足なのだ - (と言っているそばから実家の冷蔵庫にあったハーゲンダッツを - 食べてしまった)。 - </p> -</section> -<section> - <h3>冷蔵庫の電源を落とす</h3> - <p> - 身体の冷えに気づき、発酵食品にのめり込み、 - 冷蔵庫の必要性に疑問を持ち始めたある時、 - とうとう冷蔵庫の中が空っぽになってしまった。 - ものは試しと早速電源を落としてみた。 - 余った食材はぬか床に入れるか、あるいは - 塩漬けにしておけば腐る心配はない。 - </p> - <p> - 横浜に越してきてからは週末に一週間分の野菜を - 鎌倉の即売所で仕入れ、冷蔵庫に入れていた。 - 冷蔵庫の電源を落としてからは余った野菜は - すべて乳酸菌の力で酸っぱくして保存していた。 - 流石に酸味に飽きてきた頃、梅干し用に買ってきたザルが - 梅を干し終えて暇そうにしているのを見つけた。 - 干し野菜はうま味が凝縮されて美味しいというので - 試しに余ったものを干してみた。 - きゅうり、大根等水分が多いものは薄く切ってそのまま並べる。 - かぼちゃやじゃがいも等は一度蒸してから干す。 - 生のまま干したものは味が濃くなり食感もコリコリと面白くなる。 - 一方蒸したものは甘みが強くなり、ねっとりとしてこれもまたうまい。 - 一度この味を知ると、どうして今まで冷蔵庫に入れて味が劣化するのを - 気にも止めなかったのかと悔やまれる。 - </p> - <p> - 魚はその日のうちに使う分以外は塩水につけて干しておくか、 - 米と合わせてあせの葉や柿の葉で包んでおけば熟れ鮓になる。 - まだ作ったことはないが、みりん干しなんかもやってみたいものだ。 - </p> - <p> - 豆腐は水切りをして何かしら塩分の濃いもので包んでおけば - 大丈夫そうだ。 - 味噌、糠、塩。どれにつけても美味しい。塩漬けはチーズのような - 芳醇な感じになることを期待していたがそれもない。 - 水道水をそのまま使ったのがまずかったか。 - まあ保存はできているのでいいのだけれど。 - </p> - <p> - 肉は最近食べていないのでわからないが、魚と同じだろう。 - 中国には確か肉の熟れ鮓もあったような。 - 燻製なんかも興味がある。 - </p> - <p> - 冷蔵庫を使わなくなり一週間経つが、何一つ不便なことはない。 - 冷蔵庫の下が掃除できないので早くいなくなってほしいくらいだ。 - </p> -</section> -<section> - <h3>なぜ冷蔵庫がうちにあるのか。</h3> - <p> - 改めて冷蔵庫というものを見直してみると、どうしてこんなものが - 台所の一角に鎮座しているのかわからなくなってきた。 - 大学に進学し一人暮らしを始めるに当たり、 - なんの疑問もなく買ったのだ。 - 電子レンジや洗濯機も同じである。 - テレビはNHKが鬱陶しいので買わなかったが。 - 冷蔵庫は家に必要なものであるという常識のもとに生まれ、 - 冷蔵庫を当たり前のように使いながら育った。 - 一人暮らしをするというと、どこに行っても冷蔵庫を買うのが - 当たり前かのように話が進み、とうとう自分でも買うに至ったと - 言うわけである。まあ冷蔵庫を買うのは当たり前なのだろうが。 - </p> - <p> - つまり冷蔵庫がうちにあるのは世の中の常識を - そのまま自分の家に取り込んだ結果なのだ。 - </p> -</section> -<section> - <h3>冷蔵庫という常識</h3> - <p> - ではなぜ冷蔵庫を持つのが常識なのか。 - 簡単である。 - マーケティングの結果だろう。 - </p> - <p> - 今までの生活が不便だという認識を植え付け、 - その不便を解消するという謳い文句で新しい常識を売る。 - 世の中に出回っている便利な道具は大方同じであろう。 - </p> -</section> -<section> - <h3>豊かさとは</h3> - <p> - 豊かな食生活のためといって舶来の料理をはやらせ - 食物油を売り、頑固な油汚れが落ちるからと言って - 強力な洗剤を売り、荒れた手が潤うからと言って - ハンドクリームを売る。 - </p> - <p> - 忙しいからと便利な家電を売り、 - その一方で暇を潰すためのエンターテインメントに - 金を払わせる。 - </p> - <p> - 暑いからといいエアコンを売って快適な環境を整え、 - 汗をかくためにサウナに金を使わせる。 - </p> - <p> - きついからと言い肉体労働を敬遠し、 - 楽をするために自動車を買い、 - その一方で運動不足になりジムに通う。 - </p> - <p> - どれもこれもテレビや新聞等のメディアに作られた豊かさ - ではないだろうか。 - </p> - <p> - 常識や流行にとらわれず、豊かな生き方とはなんなのか、 - 本当に必要なものはなにか、自分自身に問いただす。 - 一度すべての常識を捨て、自分にとって本質的なものを - ゼロから構築する。 - 人生を本当の意味で豊かにしてくれる物だけがすべて揃った - そんな家に僕は住みたい。 - </p> -</section> -]]></description> -</item> -<item> -<title>Webサーバーの設定</title> -<link>https://www.mtkn.jp/computer/setting_up_web_server.html</link> -<guid>https://www.mtkn.jp/computer/setting_up_web_server.html</guid> -<pubDate>Mon, 27 Jun 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>Webサーバーの設定</h1> -<time>2022-06-27</time> - -<h2>はじめに</h2> -<p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p> - -<h2>環境</h2> -<ul> - <li>OS: OpenBSD 7.1</li> - <li>サーバー: httpd(OpenBSDに付属のもの)</li> - <li>サーバー証明書: Let's Encrypt</li> - <li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li> - <li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li> -</ul> - -<h2>設定の概要</h2> -<dl> - <dt>サーバーを用意</dt> - <dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd> - <dt>ドメインの取得とDNSの設定</dt> - <dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd> - <dt>httpdの設定</dt> - <dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd> - <dt>証明書の発行と自動更新の設定</dt> - <dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd> - <dt>ホームページのファイルをアップロード</dt> - <dd>ウェブページで配信したいものをVPSにアップロードする。</dd> - <dt>接続の確認</dt> - <dd>手元のブラウザからアクセスできることを確認。</dd> -</dl> - -<h2>サーバーを用意</h2> -<p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p> - -<h2>ドメインの取得とDNSの設定</h2> -<p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p> -<pre><code>HOST TYPE POINTS TO TTL -<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600 -www.<i>&lt;server_domain&gt;</i> A <i>&lt;server_ip&gt;</i> 3600</code></pre> -<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> -<p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p> -<pre><code>$ ping <i>&lt;server_domain&gt;</i> -PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms -64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms -^C</code></pre> - -<h2>httpdの設定</h2> -<p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p> -<pre><code>$ doas cp /etc/examples/httpd.conf /etc/ -vi /etc/httpd.conf</code></pre> - -<pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $ - -server "<i>&lt;server_domain&gt;</i>" { - listen on * port 80 - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location * { - block return 302 "https://$HTTP_HOST$REQUEST_URI" - } -} - -server "<i>&lt;server_domain&gt;</i>" { - listen on * tls port 443 - tls { - certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - } - location "/.well-known/acme-challenge/*" { - root "/acme" - request strip 2 - } - location "*" { - root "/htdocs/www.<i>&lt;server_domain&gt;</i>" - directory auto index - } -}</code></pre> -<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> -<p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p> -<pre><code>$ doas httpd -n -configration OK</code></pre> - -<h2>証明書の発行と自動更新の設定</h2> -<p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p> -<pre><code>$ doas cp /etc/examples/acme-client.conf /etc/ -$ doas vi /etc/acme-client.conf</code></pre> -<pre><code># -# $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $ -# -authority letsencrypt { - api url "https://acme-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-privkey.pem" -} - -authority letsencrypt-staging { - api url "https://acme-staging-v02.api.letsencrypt.org/directory" - account key "/etc/acme/letsencrypt-staging-privkey.pem" -} - -authority buypass { - api url "https://api.buypass.com/acme/directory" - account key "/etc/acme/buypass-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -authority buypass-test { - api url "https://api.test4.buypass.no/acme/directory" - account key "/etc/acme/buypass-test-privkey.pem" - contact "mailto:<i>&lt;your_mail_address&gt;</i>" -} - -domain <i>&lt;server_domain&gt;</i> { - alternative names { secure.<i>&lt;server_domain&gt;</i> } - domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key" - domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem" - sign with letsencrypt -}</code></pre> -<p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p> -<p>続いて<code>acme-client</code>を実行して証明書を発行する。</p> -<pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre> -<p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p> -<pre><code>$ doas crontab -e</code></pre> -<pre><code>... -#minute hour mday month wday [flags] command -19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd -... -</code></pre> -<p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p> - -<h2>ホームページのファイルのアップロード</h2> -<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> -<pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i> -$ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre> - -<h2>接続の確認</h2> -<p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p> -<pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre> -<p>続いてrcに登録、起動。</p> -<pre><code>$ doas rcctl start httpd -$ doas rcctl enable httpd</code></pre> -<p>ブラウザでアクセスしてみる。</p> - -<h2>おわりに</h2> -<p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p> - -<h2>参考文献</h2> -<ul> - <li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> - <li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li> - <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> -</ul> -]]></description> -</item> -<item> -<title>坊主になるために薬の服用を強要されそうになってる。</title> -<link>https://www.mtkn.jp/journal/posts/20220513.html</link> -<guid>https://www.mtkn.jp/journal/posts/20220513.html</guid> -<pubDate>Fri, 13 May 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>坊主になるために薬の服用を強要されそうになってる。</h1> -<time>2022-05-13</time> -<p>地元の寺で出家、得度し、次は宗門の道場に入って修行である。ただし修行と言ってもいい加減なもので、最近流行しているらしい感染症の対策だかなんだかで、総本山に近い新幹線の駅前にあるホテルで行うらしい。寺に滞在すれば感染するがホテルなら感染しないウイルスとはなんとも特異なものである。それとも参加者を自室に監禁してテレビ電話でも繋いで行うのか。だとしたら自宅からでもいいものを。愚痴を言ってもしかたがないのでとりあえず参加申請書を作成して健康診断書と共に提出した。</p> -<p>しばらくした今日、宗門から電話があった。健康診断書のアレルギーの欄に喘息とあるが、発作が起こった時の為に医者に行って薬を処方してもらい、道場に持参するようにとのことだ。</p> -<p>は?</p> -<p>まず喘息の発作がどのようなものかは自分がよく知っている。僕の場合咳がきつくて息苦しいが病院に行く程のものは幼い頃以来ない。そのため普段から発作を抑えるような薬は常備していないし欲しいとも思わない。</p> -<p>次にたとえどんな症状が出ても薬を飲むかどうかは本人の判断に任せるべきである。薬とは本質的に危険なものである。副作用の無い薬は無い。服用による危険性と服用しないことによる危険性を天秤にかけた上で飲むかどうか判断するべきものである。その判断には統計的な情報に加え、自分の身体の状態をよく観察する必要がある。そのため、他人が服用を強いることはあってはならないだろう。</p> -<p>最後に薬を服用した方がいい場合であっても、どうするかは本人に任せるべきである。これは死生観の問題である。僕は現代の医療に依存した生き方をするより、自然に生きて自然に死ぬ方を選びたい。</p> -<p>以上3つの理由により、宗門の要求は受け入れられないものである。ただし残念ながら突然の電話だったのでここまでうまく纏めて話すことは叶わなかった。以下に電話でのやり取りを記す。</p> -<p>宗門からの要求に対してまずは受け入れられない旨を伝えたところ、集団生活なので宗門に従えとの答えが帰って来た。周りに迷惑がかかるからと。しかしこれは僕個人の問題であり、どのように迷惑がかかるのか、あるいは薬があった場合どうして迷惑がかからないのか分からなかった。そのため僕個人の問題であり周りは関係ないだろうと伝えた。そうすると次は、僕にもしものことがあった場合、薬を持っていないと宗門では責任を取れないとも言われた。これに対して、なぜ僕の命について貴様等に責任を取られないといけないのか分からないと返した。そうすると、そういうものだからとの答えが返ってきた。意味が分からなかったので理解できない旨を伝えたところ、上司と相談して連絡しなおすとのことだった。そのまま電話を切られそうになったので、最後に念をおして、これは死生観の問題であり他人にどうこう言われる筋合いはないこと、そして集団生活と雖も個人の自由の範疇であると考えていることをはっきりと伝えた。</p> -<p>以上のやり取りは2時間ほど記憶を遡って書いたものであり、どこまで合っているか分からないことを断わっておく。</p> -<p>電話が切れた後、一応師僧に報告を入れようと寺に電話したところ、こういう時は適当に嘘でも付いてやりすごせばいいと言われた。お前は潔癖すぎだと。</p> -<p>間違いない。</p> -<p>しかし潔癖なのもある意味気持がいいのだ。会社を辞めて社会から距離を置き、失うものがなにもない状態で綺麗に生きている今はなかなか気分がいい。ただ宗門に対して嘘を付かないことにだんだんと価値を見出せなくなりつつある。こんないい加減な組織に対して綺麗でいることにどれほどの意味があろうか。もうどうでもいいか。</p> -<p>寺に報告をした後、夕飯の支度をしながら宗門とのやり取りを思い返しているとやっぱりなんだかひっかかる。薬を持参させるということは、発作が起こったら服用させるということである。つまり薬の服用を強要しているようなものだ。これは世間一般の常識に照らしても不条理なことではなかろうか。それとも僕が世間と距離を置きすぎて知らないだけで世の中ではそんなものなのか。和服で生活をするようになり、僕が覗ける社会の窓はTwitterのみになってしまった。そのTwitterを見ても、風邪を引いたら頭痛薬や解熱剤を、花粉症にはその薬を飲むのが当たり前のようだし、案外宗門は常識に則って良心的な連絡を呉れただけかもしれない。そんな世間はくそくらえだが。</p> -<p>医学が本当に人を救えているのかは甚だ疑問である。目の前の命はある程度助けられるかもしれないが、助けることが本人にとって幸せかどうかは別問題である。中途半端に助かったが為に余計な苦しみを味わって死ぬことになるかもしれない。また、どんなに医学が発達しても救えない命は零にはならない。さらに、医学が救う命というのは本来自然淘汰されるべきだったものではないだろうか。弱い遺伝子は死ぬのが自然の掟なのである(僕自身小児喘息で死にかけたことがあるので本来は淘汰されるべき人間なのかも知れない)。その掟を破って死ぬはずだった人間を助けてしまい、その人間が子供を作り遺伝子を遺す。そうしてだんだんと医学がないと自立して生きられない人間を量産することにはならないか。現代においても既に医療費が嵩んで面倒なことになっているではないか。目の前の命を救ったが為に将来より多くの苦しみを生む可能性を考えなくていいものか。</p> -<p>以上の議論は文献に基かない上、定量的なことを一切考えていないいい加減なものである。しかし今は目の前の命を救うことを絶対の正義として疑わず、その副作用を完全に無視しているのではないか。それで本当にいいのだろうか。</p> -<p>医学に縋り病気を恐れて長生きするより、日々大切に生き、死を潔く受け入れた方がよっぽど充実した人生だと僕は思う。宗教が現代も存在するのは、科学が救えない人の受け皿として必要とされているからではないか。</p> -<p>全ての人間は死ぬ時に死に、それまでは生きるのである。それでええやん。少なくとも僕はその方がいいのでほっといて欲しい。</p> -]]></description> -</item> -<item> -<title>令和4年 農業日誌</title> -<link>https://www.mtkn.jp/farm/journal/2022.html</link> -<guid>https://www.mtkn.jp/farm/journal/2022.html</guid> -<pubDate>Fri, 11 Feb 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>令和4年 農業日誌</h1> -(旧暦) - -<h3>卯月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-05-09</time> -</div> -溝掃除。しばらく雨が降っていない。最後に米を蒔いてからは一回も降っていないと思う。曇って来たので降ってくれることを期待。畑の真黒茄子の一部が発芽した。自分用のメモとしてこの日誌を書いているので作物の位置関係が分かりにくい。なんかうまいこと表示できるやつ作ろうかな。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-05-04</time> -</div> -晴れ。朝は寒く、昼から暑い。一ヶ月程機構が戻ったようだ。昨年キミノーカで買った栗南瓜を、以前蒔いた南瓜の南に、春菊を白もちとうもろこしの一回目の北に、寄居蕪を白もちとうもろこしの二回目の北に、五角オクラを米の隣の里芋の南に、ときわ地這い胡瓜をこのオクラと里芋と同じ場所に、いちずいんげんを鷹の爪から米までの間にある背丈の高い草の足元に植えた。米の所に生えていた雑草は成長が案外遅く、米の方が高くなりつつある。じゃが芋のアンデスに花が咲いていた。鷹の爪の北に蒔いた葱がようやく生えてきた。生きとったんかわれ。麦は早いものはもう収穫してもよさそうなくらい色付いてきた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-05-02</time> -</div> -米の続き。最後の4mを鷹の爪の南に蒔いた。初めに蒔いた米は既に発芽を確認。然し別のイネ科の草もたくさん生えてきた。軸が赤い草である。家のプランターにも余った米を蒔いた。あと鷹の爪と加茂大芹川丸茄子、ししとうと真黒茄子をそれぞれ一緒に蒔いた。家で苗になればいいが。 -</div> - -<h3>弥生</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">30日</div> -<time>2022-04-30</time> -</div> -米の続き。朝から半日かけて4m程。田の畔も少し補強。里芋も追加で植えた。西瓜の北と茄子の南。昼からも作業したかったが疲れてしまった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-04-25</time> -</div> -20日にも畑に出たと思うが記録していなかった。20日は米の続き。前回4m程蒔いたがこの時は2mにした。疲れは禁物である。25日も米の続きに加え、蒟蒻をアンデスの南に植えた。あとは鷹の爪を適当に蒔いた。前回蒔いた所に上からばら蒔きしただけである。米の方は今回午前には2m蒔いた。午後もできるだろうか。麦の下の方が茶色くなってきた。午後も米の続き。また2m程。旭大和西瓜を男爵の東と空豆の北に、男爵の東の西瓜の南にとある露天で買った日本南瓜を、日野菜の東のあたりに池田越瓜を植えた。滝野川牛蒡の南にしろもち玉蜀黍を植えた。男爵の南に落花生を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2022-04-19</time> -</div> -米を蒔いた。20mの畝のうち4m程。体力を消耗したうえ花粉症と喘息で眠れなかった。身体を作りアレルギーを何とかしなければ。呼吸と食事を見直さないといけない。一日寝込むだけで半年間の食糧が手に入らないのはきびしい世界である。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-04-14</time> -</div> -晴。前日の夜から朝にかけて雨だった。麦は全体的に出穂していた。畑の北側の空いていた場所と空豆が倒れたり成長が悪くてできた隙間に里芋を植えた。多分全て芽赤芋?2つ程昨年のものが混じっているかも知れない。畑の北の方はカラスノエンドウが群生している。日野菜が残っていた所に寄居蕪を蒔いた。日野菜は刈ってしまったが必要なかったか。以前大浦太牛蒡を蒔いた隣に同じ牛蒡を植えた。以前は点蒔きだったが今回は二条のすじ蒔きにした。以前のものは少しだが芽が出ていた。同じ畝の北に植えていた滝野川大長牛蒡も発芽。しろもち玉蜀黍を日野菜を蒔いた北に植えた。薩摩芋の種芋の南に真黒茄子を植えた。鷹の爪を葱の苗床の南に植えた。ノゲシとキツネアザミと多分サワオグルマのしっかりした茎が支柱代りになればと思って畝の中央だけを草刈りして両端は残した。空豆の莢が大きくなって来た。玉葱も大きいものはちゃんと玉になっている。菜っ葉類の種の一部に奇形が見られた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2022-04-09</time> -</div> -赤目自然農塾に行った。一日目は便所の補修と猪よけの柵の設置を行った。身体を保護するものが嫌いなので軍手を着用していなかったが案の定トタンの波板で指を切った。他人との共同作業においては少し考えないといけない。二日目は米の種おろしの実習だったが眠くてあまり集中できなかった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2022-04-07</time> -</div> -晴。日射しが強くて暑さがこたえるようになってきた。防止がそろそろ必要である。薩摩芋を植えた。空豆の莢が出てきているのを確認した。米を蒔く場所を軽く草刈りした。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-04-02</time> -</div> -晴。最近寒さが戻ったようで、外に出るのが億劫である。田の畔を補強した。毎日少しの時間でも畑に出ないと体ができてこないように思う。隣の畑の人が夫婦で来ていた。奥さんと顔を合わせるのはおそらく初めてである。家で薩摩芋と里芋が芽をふき始めた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-04-01</time> -</div> -晴。前日は雨。前回より排水はよくなっていた。新3月27日には麦の出穂を確認。さらに大きくなっていた。草の勢いが強い。今日は新しく買った大浦太牛蒡を蒔いた。寄居蕪を前回同様日野菜の後に蒔いた。日野菜もそのふたつ隣りの畝に蒔いた。以前蒔いていた法蓮草、春菊、牛蒡が発芽。じゃが芋の芽も出てきた。体力を付けねば。 -</div> - -<h3>如月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">22日</div> -<time>2022-03-24</time> -</div> -晴。しばらく雨ばかりで畑が水浸しだった。一部に下の田圃への水路を開けて排水を計った。注文していた種がようやく届いたので少し蒔いた。寄居蕪を日野菜が植わっていた場所に少し、牛蒡(これは以前買っていたもの)を少し、それから葱を蒔いた。高菜を収穫した。土筆がたくさんあったので取って来て佃煮にした。上の畑にれんげが咲いているのを見つけた。年末に蒔いた菜っ葉類は花盛りで蜂もたくさん来ている。交配しなければいいがさすがに近すぎるだろう... -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2022-03-15</time> -</div> -晴。日差しが暑い。隣の畑の人が何かを散布していた。除草剤だろうか。真菜が花盛りである。日野菜はほとんど花を刈り取った。大根も咲いていた。壬生菜も咲きそうだったので少し収穫。山東菜も咲きはじめ。台所で芽を出していた大蒜を植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-03-13</time> -</div> -晴後曇り。今日から明日にかけて雨が降るというので法蓮草を蒔いた。ばら蒔きして草を刈っただけだがうまく発芽してくれるだろうか。後は牛蒡も蒔いた。天気予報に頼ってしまうのは気分がよくない。体感上朝の晴れていたうちもじめじめしていた気がするし、雨の予感はあったと思うのは後付けだろうか。天気を感覚で分かるようになりたい。菜の花が咲いていた。日野菜と真菜である。白菜の葉も起き上がって、遠目には結球したように見える。麦が一段と大きくなった。やっと背が高くなりはじめた。しかし初めに蒔いた所と後れて蒔いた所の差が大きい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-03-08</time> -</div> -晴ていたように思う。竹を貰いに行ってから体調が落ちた。杉だらけだったので花粉症がひどくて眠れなかった。もう春が来た。大根と高菜を収穫し、小松菜と春菊を蒔いた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">4日</div> -<time>2022-03-06</time> -</div> -晴後曇り。大根と山東菜を少し収穫して地主さんに持って行った。地主さんが持っているという竹薮の場所を教えてもらった。今日は少し寒さが戻った。そろそろまた菜っ葉の種を蒔きたい。じゃが芋を植えるのと、米の苗床の準備もしなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">2日</div> -<time>2022-03-04</time> -</div> -晴後曇り。日野菜と大根を少し収穫。大根の葉を炒めものに、日野菜の根を煮物にした。日野菜の細いものは筋があって硬かった。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2022-03-03</time> -</div> -生協で買ったじゃがいもを芽出ししていたが、出揃ってきたので半分に切った。植付けは四日か五日頃か。 -</div> - -<h3>睦月</h3> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2022-03-01</time> -</div> -雨だったと思う。真菜を収穫して胡麻和えにした。真菜にも日野菜にも蕾が出はじめている。雨の作業も寒さがなければ楽しい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">28日</div> -<time>2022-02-18</time> -</div> -晴。突然春らしい日になった。朝はまだ寒かったが、日中はかなり気温が上がった。畑に畝を作る続きを行った。田の麦はまた育ったように見える。まだ高さはないが横に広がり、最後に種蒔きした所も全体的に緑になってきている。畑では空豆の花が咲いていた。やはり風が強いのか、あまり高くはならず横に広がっている。あるいは土が硬くて根が浅いのか。アブラ菜科も春を感じてか、とう立ちの気配がある。白菜と大根はその中心に蕾のようなものが準備されている。花の時期が少しずれてくれればいいのだが。畑に死んだ雀が落ちていた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2022-02-14</time> -</div> -曇り後晴。午前は先日落札した唐箕を貰いに言った。他にも手箕や籠を貰った。午後はじゃが芋を植えた。昨日購入したアンデスである。芽が出ていないものも数個あったが気にせず植えた。畝が低く感じたので溝を少し掘り下げて中央に盛った。昨日の雨が溜っていたので土が粘土のようになったが大丈夫だろうか。一応高さは確保できたのでいい具合に乾いてくれればいいが。株間30cm、条間40cm程度。畝幅は120cmで二条に植えた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">11日</div> -<time>2022-02-11</time> -</div> -晴。朝は非常に寒い。田の畔を少し整えた。田圃の端を隣の人が通路として使いたいとのことなので、水を漏らさないようにしないといけない。昨日地主さんに電話したところ、この田の水利費は払ってくれているという。溝掃除は各自やるとのことなので早めにやってしまおう。 -</div> - -]]></description> -</item> -<item> -<title>豚骨ラーメン</title> -<link>https://www.mtkn.jp/kitchen/recipe/tonkotsu_ramen.html</link> -<guid>https://www.mtkn.jp/kitchen/recipe/tonkotsu_ramen.html</guid> -<pubDate>Tue, 8 Feb 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>豚骨ラーメン</h1> -<time>2022-02-08</time>作成 -<figure> - <img src="../pics/tonkotsu_ramen.jpg" alt="豚骨ラーメンの画像"> - <figcaption>豚骨ラーメン</figcaption> -</figure> -<div class="recipe-ingredient"> -<h2>材料(4~5人分)</h2> -<ul> - <li>豚骨: 1本</li> - <li>鶏ガラ: 1個</li> - <li>玉葱: 1個</li> - <li>野菜くず(人参のへた、葱の頭、キャベツの芯等): 適量</li> - <li>大蒜: 1房</li> - <li>生姜: 1かけ</li> - <li>昆布: 適量</li> - <li>干し椎茸: 適量</li> - <li>豚肩ロースブロック: 500g</li> - <li>長葱: 適量</li> - <li>細葱: 適量</li> - <li>もやし: 適量</li> - <li>卵: 人数分</li> - <li>支那竹: 適量</li> -</ul> -</div> - -<div class="recipe-steps"> -<h2>手順</h2> -<ol> - <li>昆布、干し椎茸は水にかして30分以上置く。</li> - <li>豚骨を半分に割り、鶏ガラ、水と共に鍋に入れ2回ほど茹でこぼして臭みを取る。</li> - <li>豚骨、鶏ガラ、玉葱、野菜くず、大蒜、生姜、昆布、水を鍋に入れ火にかける。沸騰したら弱火にする(ただしコッテリさせる場合は強火のまま)。適宜アクを取る。水が減ってきたら足す。</li> - <li>豚肩ロースに凧糸を巻き、強火で表面を焼く。3に入れて一緒に煮込む。2時間程で野菜と肩ロースを取り出す。</li> - <li>1を水ごと弱火にかける。</li> - <li>沸騰したら昆布と干し椎茸を取り出し、味醂、酒、塩、醤油で味を付ける。この時塩分濃度が醤油と同じくらいになるようにする。</li> - <li>肩ロースを6に漬けて冷ます。冷めたら密閉できる袋に入れて空気を抜き、冷蔵庫で一晩味を染み込ませる。味玉を作る場合、茹で卵も一緒に入れて一晩置く。</li> - <li>4は6時間煮込んだらザルで漉して粗熱を取り、冷蔵庫で保存する。鶏ガラについていた肉はからし醤油で食べると美味しい。</li> - <li>7を火にかける(表面に脂が浮いて固まっているのであっさりしたスープがいい場合は加熱前に取り除く。脂はラードとして焼き飯等に使うと美味しい)。</li> - <li>具材を準備する。卵を茹でて半分に切る。長葱を白髪葱にする。細葱を刻む。肩ロースを薄く切る。もやしをゆがく。</li> - <li>麺を茹でる。</li> - <li>丼を温め7を適量入れ、9で割る。濃さは好みで調整する。</li> - <li>麺と具材を載せる。</li> -</ol> -</div> - -<h2>ひとこと</h2> -<p>焼豚は煮込み過ぎると柔らかくなりすぎてくずれる。</p> -<p>今回は麺と支那竹は市販品だった。製麺機ほしい</p> -]]></description> -</item> -<item> -<title>令和4年正月のおせち料理</title> -<link>https://www.mtkn.jp/kitchen/r4_osechi.html</link> -<guid>https://www.mtkn.jp/kitchen/r4_osechi.html</guid> -<pubDate>Fri, 4 Feb 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>令和4年正月のおせち料理</h1> -<time>2022-02-04</time> -<p>令和3年の春ごろからだったか、実家の台所に立つようになった。おせちは毎年買っていたがせっかくなので今回は自分で作ることにした。といってもうちには代々受け継がれてきたおせちはないので本やらインターネットやらで調べながらのものである。近代化によって失われたものは大きい。</p> - -<p>今回おせちに入れたものは以下の通り:</p> -<ul> - <li>慈姑</li> - <li>百合根</li> - <li>鶏そぼろ松風</li> - <li>生麩の田楽</li> - <li>炊き合わせ</li> - <li>栗金団</li> - <li>数の子</li> - <li>田作り</li> - <li>伊達巻</li> - <li>酢蓮根</li> - <li>たたき牛蒡</li> - <li>みつわ漬け</li> - <li>金柑の蜜煮</li> - <li>鱈の西京焼</li> - <li>蒲鉾</li> - <li>牛蒡巻き</li> - <li>干し柿チーズ</li> - <li>黒豆。</li> -</ul> -<figure> - <img src="pics/r4_osechi.jpg" alt="令和4年正月のおせちの画像"> - <figcaption>令和4年正月のおせち</figcaption> -</figure> - -<h2>作り方</h2> -<div class="recipe"> -<h3>慈姑</h3> -<p>おしりを切って皮を剥き出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>百合根</h3> -<p>一枚づつ剥いて出汁で煮る</p> -</div> - -<div class="recipe"> -<h3>鶏そぼろ松風</h3> -<p>鶏1Kg、魚2Kg、出汁3合、醤油70cc、味醂50cc</p> -<p>鶏のミンチを醤油と味醂で炒める。白身魚のすり身を昆布出汁、醤油、味醂で味付けし、炒めた鶏そぼろを加え型に流して蒸す。切り出して天火で乾かすように焼き、煮切り味醂を塗ってケシの実をまぶす。</p> -<p>出典: [平井、結野、日本料理店のお弁当]</p> -</div> - -<div class="recipe"> -<h3>生麩の田楽</h3> -<p>強力粉300g、水150gを捏ねる(水はもう少し多い方がいいかも)。一時間寝かせる。水で揉み洗いして澱粉を流す。白玉粉、水を混ぜて捏ねる。形成して一時間寝かせる。茹でる。浮いてからさらに5分程茹でる。切って味噌を塗り、焼く。</p> -<p>白玉粉と水の分量をメモしていなかった。インターネットで調べたレシピだったはず</p> -</div> - -<div class="recipe"> -<h3>炊き合わせ</h3> -<p>人参、干し椎茸、高野豆腐、竹の子水煮</p> -<p>干し椎茸を戻す。戻した汁で煮て酒、醤油で味付け。高野豆腐を戻す。人参を花型に、竹の子を一口大に切る。それぞれ出汁で煮て醤油、酒で味付け。</p> -</div> - -<div class="recipe"> -<h3>栗金団</h3> -<p>薩摩芋を一口大に切り、砕いたくちなし1個と水少しを入れた鍋で蒸す。裏漉しし、味醂、砂糖、栗のシロップで味付けし、栗を混ぜる。</p> -</div> - -<div class="recipe"> -<h3>数の子</h3> -<p>水で一晩塩を抜いて皮を剥く。</p> -</div> - -<div class="recipe"> -<h3>田作り</h3> -<p>ごまめを乾煎りする。手でボキっと折れるようになるまで。味醂を煮切って醤油を加え、ごまめにからめる。煎り胡麻をまぶす。</p> -</div> - -<div class="recipe"> -<h3>伊達巻</h3> -<p>魚又は海老のすり身と卵黄を混ぜる。卵白に砂糖を入れて泡立てる。以上を混ぜて味醂で味を付ける。卵焼き器を温め油を敷き、卵液を流して蓋をする。裏返して焼き目を付ける。巻き簾で巻く。</p> -</div> - -<div class="recipe"> -<h3>酢蓮根</h3> -<p>蓮根を輪切りにして酢水でゆがく。酢に鷹の爪を入れ、蓮根を浸す。</p> -</div> - -<div class="recipe"> -<h3>たたき牛蒡</h3> -<p>牛蒡を叩いて3cmに切り、縦に4つに割る。ゆがいて酢、醤油、胡麻を混ぜたものに浸す。</p> -</div> - -<div class="recipe"> -<h3>みつわ漬け</h3> -<p>蕪、人参、柚子、昆布を切る。野菜は塩揉みして絞る。酢に漬ける。</p> -</div> - -<div class="recipe"> -<h3>金柑の蜜煮</h3> -<p>金柑に縦に切り込みを入れ、さっと煮る。砂糖を加え煮つめる。</p> -</div> - -<div class="recipe"> -<h3>鱈の西京焼</h3> -<p>西京味噌と味醂を混ぜ、白身魚を漬ける。味噌を拭って焼く。</p> -</div> - -<div class="recipe"> -<h3>干し柿チーズ</h3> -<p>干し柿を縦に切り、クリームチーズ、胡桃を包むように巻く。柿を干しすぎていたため固くて食べにくかった。</p> -</div> - -<div class="recipe"> -<h3>黒豆</h3> -<p>豆を鉄と共に一晩水に浸ける。6時間程煮る。砂糖で味付けしさらに10分煮る。冷して味を染み込ませる。</p> -</div> - -<p>蒲鉾、牛蒡巻は既製品</p> - -<h3>おわりに</h3> -<p>伊達巻は妹が、みつわ漬けは母が作ってくれた。蒲鉾と牛蒡巻きは買ってきた。それ以外は自分で作った。この他、蒟蒻を買っていたが存在を忘れていたのと、棒鱈を水で戻していたが腐ってしまったことが心残りである。買ってきた蒲鉾と牛蒡巻き、それから作れなかった蒟蒻の煮物と棒鱈を作るのが今年の年末の課題である。蒲鉾や牛蒡巻きは保存料や着色料等の添加物が気になる所だ。</p> -<p>今時は百貨店やらでおせちを予約して年末はだらだら過ごし、年始もそのおせちを食べながら家でテレビ漬けが普通なのだろうか。買って来たおせちには旬という概念が欠けており、さらに保存料で日持ちさせている。本来そのとき手に入る旬のものを使い、3ヵ日常温で保存できるように砂糖、酢、塩、発酵等の力を利用したものであったはずだ。今回作ったおせちも食材は基本スーパーで入手した。少しずつ自分の畑で取れたものを取り入れたいものである。</p> -<p>おせち料理は、家族や近所、あるいは寺であれば檀家との付き合いにより成り立っていたのではないだろうか。その付き合いに充てる時間と気力を労働に回し、その労働により得られたお金でできあいのおせちを購入するのは、家族や地域社会の分断であり、また文化の破壊でもある。購入するお金を稼ぐのを辞め、自分達で作ったほうが人付き合いも増え、地域に根差した文化の継承にもなり、より充実した生き方に繋るのではないだろうか。</p> -]]></description> -</item> -<item> -<title>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</title> -<link>https://www.mtkn.jp/computer/rtx1200-qos.html</link> -<guid>https://www.mtkn.jp/computer/rtx1200-qos.html</guid> -<pubDate>Fri, 14 Jan 2022 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>ルーター(RTX1200)のQoS機能を利用して帯域を制限した</h1> -<time>2022-01-14</time>作成 -<h2>はじめに</h2> -<p>一人暮らししていた頃節約にはまり、下宿の固定回線を解約したうえ、携帯の回線を128kbpsしかでないものに変更したことがある。以来通信費をどうやって抑えるかあれこれ考えてきた。現在は実家に暮らしていて、家で契約している光回線を使わせてもらっている。携帯の方は楽天モバイルであり、外で使うことはまずないので毎月の支払いは発生していない。しかしいずれこの家をでた時に、楽天モバイルの回線だけでは結局月々3278円と大きな出費になる。また、通信速度が遅い生活というのは雑音の少ない充実したものであった経験もある。こんなことを考えていたところ、通信速度が128kbpsだが無料で利用できる格安sim<sup>[1]</sup>を発見した。この速度に慣れておけば、通信費が全くかからない生活ができる。ということで家で使っているルーターの設定を変更し、通信帯域を制限してみた。</p> -<h2>機材</h2> -<ul> - <li>ルーター: Yamaha RTX1200</li> - <li>無線アクセスポイント: elecomのルーター</li> - <li>パソコン: Lenovo x220</li> - <li>パソコンのOS: OpenBSD 7.0</li> -</ul> -<h2>設定したい内容</h2> -<p>RTX1200のLAN2ポートにWANが接続されており、LAN1には家で使っている端末がいろいろ接続されている。LAN3は今回は関係ないので割愛する。LAN1を2つのvlanに分割し、1-7番のポートをvlan1、8番のポートをvlan2する。そしてこのvlan2とインターネットとの通信を上下とも128kbpsに制限する。vlan2と他のlanとの通信は制限しない。vlan2にelecomのルーターを無線アクセスポイントとして接続し、僕が使うパソコンやスマホはこのアクセスポイントに接続する。</p> -<figure> -<pre> - Internet - | - ┌-------┬-----------┬-┴--┬----┐ - |RTX1200|LAN1 |LAN2|LAN3| - └-------┴-┬-------┬-┴----┴----┘ - vlan1 vlan2 - 192.168.100.1 192.168.101.1 - | | - ┌------------┐ | | ┌-----------┐ ┌-----┐ - |home network├--┘ └----┤elecom wifi├---┤my PC| - └------------┘ └-----------┘ └-----┘ - 192.168.100.0/24 192.168.101.0/24 -</pre> -<figcaption>図1: 接続と設定の概略</figcaption> -</figure> - -<h2>vlanについて</h2> -<p>ヤマハのページにvlanについて以下のような説明がある:</p> -<blockquote cite="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">物理的な接続形態に依存せず仮想的にグループを形成してひとつのLANとみなすものが、VLAN(Virtual LAN)です。VLANには、スイッチの物理ポート単位でVLANを形成するポートベースVLANと、パケットにタグと呼ばれるヘッダを付加してVLAN情報を格納するタグVLANとがあります<sup>[2]</sup>。</blockquote> -<p> -ここではLAN1にある8つのポートをvlanによって2つの論理的なLANに分割する。しかしこの後設定するクラス分けでは送信元や宛先のアドレスによる分類ができるので帯域幅を制限したい端末のIPアドレスを固定しておくだけでよかったんやけどな。 -</p> - -<h2>クラス分けについて</h2> -<p>クラス分けについてヤマハのページに以下のような説明がある:</p> -<blockquote cite="https://network.yamaha.com/knowledge/qos">優先して転送するデータを判別するために、受信したデータを分類します。<br /> -データの分類には、転送データに含まれている情報を使用します。<sup>[3]</sup></blockquote> -<p> -各ポートから出ていくパケットについて、そのパケットの送信元アドレスや宛先アドレス等の情報に基づきクラスに分類する。このクラス毎に様々な処理が可能なのだが[要出典]、今回はvlan2とインターネットとの通信をクラス1として、このクラスに対して帯域幅を128kbpsに制限する。 -</p> - -<h2>実際の設定</h2> -<p>RTX1200において行った設定は以下の通り。ただし、LAN2にppの設定をし、LAN1とインターネットとの通信ができるところまでは既に設定済みとし、以降の変更点だけ抜粋する。</p> -<p>始めにLAN1を2つのvlanに分割する: -<pre><code># vlan port mapping lan1.1 vlan1 -# vlan port mapping lan1.2 vlan1 -# vlan port mapping lan1.3 vlan1 -# vlan port mapping lan1.4 vlan1 -# vlan port mapping lan1.5 vlan1 -# vlan port mapping lan1.6 vlan1 -# vlan port mapping lan1.7 vlan1 -# vlan port mapping lan1.8 vlan2 -# lan type lan1 port-based-option=divide-network -</code></pre> -<p> -続いて各vlanの設定を行う。ただしvlan1はlan1の設定を受け継ぐので不要。 -</p> -<pre><code># ip vlan2 address 192.168.101.1/24 -# ip vlan2 secure filter <i>&lt;vlan1と同じパケットフィルター&gt;</i> -</code></pre> -<p>次にクラスフィルターを定義:</p> -<pre><code># queue class filter 1 1 ip 192.168.101.0/24 * * * * -# queue class filter 2 1 ip * 192.168.101.0/24 * * * -# queue class filter 3 2 ip 192.168.100.0/24 192.168.101.0/24 * * * -</code></pre> -<p> -上の2行はvlan2とその他との通信を制限するためのものである。ただしこの2つだけではvlan1からvlan2への通信まで制限してしまうので、それを除外するために3行目のクラスフィルターを定義する。 -</p> -<p>次にクラスフィルタをvlan2に適応。これによりルーターから192.168.101.0/24への通信がフィルタリングされる。</p> -<pre><code># queue lan1 type shaping -# queue vlan2 class filter list 3 2 -</code></pre> -<p> -2行目で指定したフィルターはその指定した順番で評価されるので注意が必要。<br /> -そしてクラスに対する制限を指定: -</p> -<pre><code># queue lan1 class property 1 bandwidth=128k -</code></pre> -<p>次はlan2(pp)にクラスフィルタを適応。これにより192.168.101.0/24からルーターへの通信がフィルタリングされる。</p> -<pre><code># queue lan2 type shaping -# pp select <i>n</i> -pp<i>n</i># queue pp class filter list 1 -</code></pre> -<p> -vlan2の時と同様にクラスに制限を設定: -</p> -<pre><code># queue lan2 class property 1 bandwidth=128k -</code></pre> - -<h2>パソコンでの設定</h2> -<p>最後にパソコンから今回作ったvlan2に接続するように設定する:</p> -<pre><code># cat > /etc/hostname.<i>if</i> &lt;&lt;EOS -join <i>&lt;アクセスポイントのECS-ID&gt;</i> wpakey <i>&lt;アクセスポイントの暗号化キー&gt;</i> -inet 192.168.101.2/24 -EOS -# echo 192.168.101.1 > /etc/mygate -</code></pre> - -<h2>おわりに</h2> -<p>めっちゃ遅い。</p> - -<h2>参考文献</h2> -<ol> - <li><a href="https://www.donedone.jp/plan/">料金プラン-50ギガの大容量SIM | donedone(ドネドネ) ドネーション型モバイルサービス</a>.donedone.2022-01-14閲覧</li> - <li><a href="https://www.rtpro.yamaha.co.jp/RT/docs/vlan/">VLAN</a>.RTpro.2022-01-14閲覧</li> - <li><a href="https://network.yamaha.com/knowledge/qos">QoSとは</a>.RTpro.2022-01-14閲覧</li> - <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> -</ol> -]]></description> -</item> -<item> -<title>無題</title> -<link>https://www.mtkn.jp/journal/posts/20211214.html</link> -<guid>https://www.mtkn.jp/journal/posts/20211214.html</guid> -<pubDate>Tue, 14 Dec 2021 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>無題</h1> -<time>2021-12-14</time> -<p> -図書館に本を返しに行った。最近家ではパソコンばかりいじっているので本を借りても読まずじまいのことが多い。たまに読もうと思う時もたいがい小林一郎の法華経大講座を開く。一応日蓮宗の坊主になろうというのでひととおり法華経のことは知っておきたいのだ。今日も図書館ではいろいろと漁った。ウェブサーバーやメールサーバーを立ててみたので、セキュリティ関係の本や暗号の本を探した。数冊は立ち読みしたがどうせ読まないだろうとすべて本棚に戻した。PGPの鍵を作ったりしているので暗号関連の数学は理解しておきたいという願望はあるのだが頭が多分ついていけない。場所を変えて農業の本も見てみたがあまり読みたいものがなかった。麦を育て始めたのでそのあたりの情報が欲しかったのだがなかった。とうとうなにも借りずに出てきてしまった。 -</p> -<p> -図書館からの帰りはたいてい途中にある野菜の直売所に立ち寄る。ここはスーパーにはなさそうなものがたくさんある。大根や蕪のおばけみたいなのや、里芋の親芋や葉っぱなんかも置いてある。里芋の葉っぱは家でかじって口の中がとんでもないことになって敬遠した。品種によって渋が強かったり弱かったりするので売っているものは食べても大丈夫なものだと思うが。無農薬の野菜も置いてあるのだがそうだと書いていないのも面白い。今日はその無農薬のものから紫キャベツと、別の棚から真菜をいただいてきた。キャベツはピクルスに、真菜は白和えにするのがおすすめだそうだ。 -</p> -<p> -野菜を買ったあと、家の葛が切れていたのを思いだして豆屋にも寄った。黒豆や小豆等の新豆が入っていたが家に余っているので買えなかった。しかしこの町には昔の店がいろいろ残っているものだ。生まれ育った地元であるが、今になるまでほとんど店を知らなかった。寺に通いだしてからお上人の奥さんがいろいろと店を教えてくれる。この豆屋はこの寺の檀家だそうだ。他にもかつを節屋、魚屋、肉屋、うなぎ屋、蜂蜜屋、豆腐屋、酒蔵、お茶屋、珈琲豆焙煎所等、スーパーに行かなくてもほとんど揃う。味噌と醤油の蔵もあるにはある。醤油発祥の地、湯浅であるがこれは自転車ではきつい。山を越えての50Kmである。横浜から東京まで片道50Kmを走ったことがあるがかなり疲れた。昔の人はこのくらいの距離をあたりまえのように歩いていたのだろうか。実家の辺りから山を越えて湯浅に向かう山道が今も残ってはいるが、ひとつ目の山の頂上まで行くのでもそれなりにくたびれる。体力を付けねば。 -</p> -<p> -葛を買って家に向かっていると、いつも畑で散歩がてら声を掛けてくれるおじいさんに会った。普段は簡単な挨拶だけだが今日は少し話した。40歳のときに思うところがあってお経の勉強を始めたらしい。写経していたがすぐに飽きて仏教画を始め、教室を主宰するに至ったそうだ。高野山大学の図書館にしばしば行っては画集のコピーを持って帰って来たという。なかなか変った人生を歩んできたようである。畑でもほとんどの人が頑張れと言うところ、この人は頑張りすぎるなと言うので面白い人だと思っていたが、話してみると色々考えが深そうな人である。 -</p> -<p> -仕事を辞めて以来、人と関わる機会が増えたように思う。畑を借り、道行く人と話し、寺の門を敲き、檀家と話し、その人その人の人生を垣間見ることができ、人生が何倍にも広がった。収入は無くなったが今の方が生きている。 -</p> -]]></description> -</item> -<item> -<title>赤目自然農塾</title> -<link>https://www.mtkn.jp/journal/posts/20211129.html</link> -<guid>https://www.mtkn.jp/journal/posts/20211129.html</guid> -<pubDate>Mon, 29 Nov 2021 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>赤目自然農塾</h1> -<time>2021-11-29</time> -<p> -11月13日、14日の二日間、奈良にある<a href=https://akameshizennoujuku.jimdofree.com/>赤目自然農塾</a>の勉強会に参加してきた。この塾は自然農の提唱者である川口由一さんが始められたもので、自然農の技術を学び実習できる場である。毎月一回二日間の定例の学びがあり、一日目には畑の補修等の共同作業と言葉を通しての学びが、二日目には実習が行われる。昨年12月に初参加し、今回はほぼ一年ぶりの2回目であった。1反9畝の畑を借りることになったので、本格的に自然農の技術を身に付けたい。できれば毎月通って一通りのことを教わりたいのだが続くだろうか。 -</p> -<h2>1日目</h2> -<p> -車を停めて外に出る。思っていたより暖かかった。もこもこの着物を着て来たが厚いので暑いので薄めのものに着替え、その上から作務衣を着た。普段畑に入る時は裸足だが、共同作業で何をするのか分からないので地下足袋を履いて小屋に向かう。 -</p> -<p> -午前の作業は篠竹を刈り取って枝を払い、束にして小屋の屋根裏に干すというものだった。篠竹はよく撓って使いやすそうだった。10人以上で作業していたが収穫量は思った以上に少なかった。一人でやると日が暮れる。 -</p> -<p> -午後は汲取式の便所を汲み取って別の場所に撒いた。臭いはそこまでひどくはなかった。ブルーチーズや高級な納豆でも香るアンモニア臭が中心で、吐き気を催すほどではない。発酵食品を食べすぎているのかもしれない。便所は地面に穴を掘って桶のようなものを埋め、木の板で便器を作って被せ、周囲から見えないように囲っているだけのものだ。小屋に隣接するものは建物の一部になっていて壁も木材でしっかりと作られているが、畑の中にぽつんと立っているものは先程の篠竹を束ねたもので周囲を囲っているだけの簡易なものである。桶から柄杓で排泄物を汲み取りバケツに入れる。本来は天秤棒を用いて一人で二つ運ぶというが、技術が必要なので今回は棒の中心にバケツをぶらさげて二人で一つを運ぶことになった。肥を撒く場所までの道はでこぼこで途中川を渡る必要がある。初対面の人と二人、なかなかの緊張感のなか息を合わせて肥を運ぶ。肥を撒く場所ではいきなりバケツごとあけるのは危険なので、ここでも柄杓で少しづつである。玄関先に水をうつようにその場所全体にまんべんなく撒く。柄杓にスナップを効かせると肥が帰ってくる。これもまた緊張感のある作業だった。そこそこの量があったが日没前には終わった。 -</p> -<p> -銭湯を経由して山荘に。晩御飯は菜飯とかぼちゃのサラダ、それにけんちん汁だった。ほとんどが自然農で採れた野菜である。御飯の後は言葉を通しての学びとして、今回は教育について議論した。21時ごろから始めて終ったのは日付が変わるころだった。みんな眠い目をこすり、船を漕ぎならがの議論であるが、これがなかなか面白いものである。誰かが言った言葉が直接脳に入って来くる。あまりうまくまとまっていない考えでも発言すればだれかの脳に届いてなにかしら返答がある。なんだか全員の脳味噌を直接繋いで考えているような感覚になるのだ。僕は今回寺子屋を始めたいという旨のことをぽろっと言っただけで終った。しかし言っただけでもなんとなく自分でも実現させようという心持ちになるものである。 -</p> -<h2>2日目</h2> -<p> -2日目は農作業の実演である。今回は稲の刈り方とその後の干し方、それに麦の蒔き方を見せてもらった。これが昼過ぎに終り、御飯のあとは畑の見学会に参加させてもらった。 -</p> -]]></description> -</item> -<item> -<title>令和3年 農業日誌</title> -<link>https://www.mtkn.jp/farm/journal/2021.html</link> -<guid>https://www.mtkn.jp/farm/journal/2021.html</guid> -<pubDate>Wed, 17 Nov 2021 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>令和3年 農業日誌</h1> -(旧暦) - -<h3>師走</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">25日</div> -<time>2022-01-27</time> -</div> -晴。畑の畝作り。菜っ葉の間引き。畝の間の溝に水が貯まっている。もう少し乾燥していたほうがいいのだろうか。菜っ葉はどれも成長が良いように見える。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">6日</div> -<time>2022-01-08</time> -</div> -晴。畑の方に畝を少し作った。じゃが芋を植えたいので少し高めの畝にする。昨年度は雨が続いて水没した部分が腐ってしまったのだ。今年はうまくいくといいな。新暦では年が明けた。今日は一日遅れたが七草粥を食べた。畑の隅に大根の余った苗をまとめていたのでそれを抜いて粥に入れた。成長がいいものは太さが15mm程度になっていた。玉葱の苗もまた少し定植した。始めの方に植え替えたもののうち一本だけ葉が太く、濃い緑になっていた。他のものは植えてから変化がないように見える。麦も変化があまりない。 -</div> - -<h3>霜月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-12-21</time> -</div> -晴。田圃の溝を少し整備。麦が成長してひとつめの畝は遠くからでもうっすらと緑に見えるようになった。畑の野菜もそれなりに育っている。 -<figure><figcaption>和歌山大根</figcaption><img src="pics/DSCF0249.JPG" alt="和歌山大根"></figure> -<figure><figcaption>大和真菜</figcaption><img src="pics/DSCF0252.JPG" alt="大和真菜"></figure> -<figure><figcaption>松島新二号白菜</figcaption><img src="pics/DSCF0255.JPG" alt="松島新二号白菜"></figure> -<figure><figcaption>いちばんぼし(裸大麦)</figcaption><img src="pics/DSCF0257.JPG" alt="いちばんぼし(裸大麦)"></figure> -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-12-19</time> -</div> -曇り時々雨。玉葱の定植。白菜、大根、真菜等が大きくなってきた。麦も大分育ったので踏もうとしていたら雨が降って来てできなかった。畔に子猫が居た。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">12日</div> -<time>2021-12-14</time> -</div> -晴。久々に冬らしく寒い朝だった。昼間は日が照って暑い。壬生菜の定植。畝作り。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">9日</div> -<time>2021-12-11</time> -</div> -晴。麦蒔きが完了した。庭のプランターに植えていた壬生菜を半分ほど畑に植えかえた。大根がわずかに太くなっている。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">7日</div> -<time>2021-12-10</time> -</div> -晴。日差しが強くて暑い。麦の続き。4本目の畝は小さいので草を刈らずに上から蒔いた。結局草刈りは全部は終わらず次の日に持ち越し。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">5日</div> -<time>2021-12-08</time> -</div> -晴。麦の続き。3本目の畝に蒔き終わった。始めに蒔いたところはそろそろ麦踏みか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">3日</div> -<time>2021-12-06</time> -</div> -晴。麦の続き。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">1日</div> -<time>2021-12-04</time> -</div> -曇時々晴。麦の続き。玉葱の移植。太いものから7本植えた。 -</div> - -<h3>神無月</h3> -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">29日</div> -<time>2021-12-03</time> -</div> -晴。麦の続き。疲れがでてしばらく休んでいた。気付けば一週間ぶりの作業である。急いては事を仕損じる。結局ゆっくりやったほうが早く蒔けていただろう。始めに蒔いた麦はもう5cmほどに成長していた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">21日</div> -<time>2021-11-25</time> -</div> -曇時々雨。麦を蒔くための草刈りの続き。今日は200g蒔けた。既に蒔いていたものからもやしのようなものが出ているのを確認。根っこか。玉葱と壬生菜の苗も大きくなってプランターでは窮屈そうなので早く定植しなければ。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">19日</div> -<time>2021-11-23</time> -</div> -晴のち曇。麦を蒔くための草刈りの続き。3時頃まで出掛けていたので今日は1時間だけ作業。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">17日</div> -<time>2021-11-21</time> -</div> -晴。麦蒔きの続き。蒔いてから草を刈るのではいそがしいので草を刈ってから蒔くことにした。また短期間のうちに全面蒔くのはあきらめた。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">16日</div> -<time>2021-11-20</time> -</div> -晴。麦を蒔いた。一番長い畝の2/3ほど蒔けた。ばら蒔きした後草を刈る。この草刈に思ったより時間がかかる。のこぎり鎌でないと歯がすぐに丸くなる。買い替えようか。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">14日</div> -<time>2021-11-18</time> -</div> -曇後晴。昼過ぎまで曇りで寒かったが昼から晴れて暑い。麦の畝がだいたい形になったところに丁度麦の種が届いた。和歌山県農業公社に申請していた畑を借りるための申請が通りそうだと、JAの人から連絡が入った。晴れて農家である。畑の方に山東菜を蒔いた。作業が続いて筋肉の動きが鈍ってきた。疲れない動き方ができるようになりたい。 -</div> - -<div class="farm-journal-item"> -<div class="farm-journal-date"> -<div class="luna">13日</div> -<time>2021-11-17</time> -</div> -快晴。朝は季節にふさわしく寒いが日差しが強く昼は暑い。出掛ける時、以前声を掛けてくれた92才のおじいちゃんとすれ違う。田圃に畝を作るために溝を掘った。この田圃を借りてから続けていた作業だがもう少しで終りそうだ。11月中旬が麦蒔ききの適期であり既に少し遅い。田圃の隣のおばちゃんが蜜柑をくれた。 -</div> -]]></description> -</item> -<item> -<title>畑を返すことになった。</title> -<link>https://www.mtkn.jp/journal/posts/20210806.html</link> -<guid>https://www.mtkn.jp/journal/posts/20210806.html</guid> -<pubDate>Fri, 6 Aug 2021 00:00:00 +0900</pubDate> -<description><![CDATA[<h1>畑を返すことになった。</h1> -<time>2021-08-06</time> -<h2>はじめに</h2> -<p> -昨年の秋実家の隣の畑を借り農業を始めることになった。以降好きな種を蒔いては世話をし、少しばかりの収穫をいただいてきた。夏になり冬野菜はどんなものを植えようかと考えていたところ、地主さんからある連絡があった。この秋に家を建てることになったので土地を返してほしいとのことだ。いい機会なので、この一年弱の間素人なりに試行錯誤してきたこと、考えてきたことを記録しておく。 -</p> - -<h2>農業に対する基本的な考え</h2> -<h3>農業の目的</h3> -僕が農業をする目的は自給自足の生活をすることである。一度社会人としての道を歩もうとして精神を病んだ。世の中にあふれているほとんどの物に価値を見いだせなかった。にも関らず自分の時間をお金に変換している意味がわからなかった。自分の時間を使って自分にとって価値のあるものを生みだす。それをできるのが自給自足のための農業だと考えた。 -<h3>農法</h3> -<p> -畑を借りる前から農法に関する情報は本やネット等で収集していた。そのなかでも目に付いたのが川口由一氏の自然農及び福岡正信氏の自然農法である。多少の違いはあるがどちらも無農薬、無肥料、不耕起という点で共通している。雑草や虫等を敵とせずそれらの活動によって土壌を豊かにし、その上で作物を育てるというものだ。この方法が自分に合っていると感じたので採用することにした。 -</p> -<h3>種</h3> -<p> -また、育てる作物に関しては、高橋一也氏の「古来種野菜を食べてください。」に感銘を受け、可能な限り昔から栽培されてきたものを探すようにした。現在市場で流通している野菜は一代交配種と呼ばれるものが多い。一代交配種というのは、「生物において、ある異なった対立遺伝子をホモで持つ両親の交雑の結果生じた、第一世代目の子孫のこと」(<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>)。一代交配種は収量、形質、味等がそろっているので市場競争力が高い。その一方で、一代交配種をかけあわせると、一代目ではかくれていた遺伝子が発現し、市場価値の高いものは収穫できない。このため、ひとたび一代交配種を育てはじめると、以降毎年のように種苗会社から種を購入することになる。 -</p> -<p> -僕が目指したいのは自給的な農業である。作物の市場競争力はなくていいし、種苗会社に払い続けるお金もない。また一代交配種ばかり育てられると、全国どこでも同じ野菜しか手に入らなくなり食文化もあったものではない。それに対し古来種野菜は、地域ごとに代々受けつがれてきたもので、その土地にうまく適応しその場所の食文化の形成に深く関わってきたものである。僕の地元和歌山でも、湯浅で作られる金山寺味噌で使われている湯浅なすというものが残っている。関係ないがあみ清数見商店というところの金山寺味噌がおいしい。「発酵文化人類学」(小倉ヒラク)にのっていた太田久助吟製のものはいまいちだった。表示を見ると人口甘味料(確かステビア)が入っていた。 -</p> -<p> -閑話休題。種は古来種を多数とり扱っている野口種苗研究所のものを購入するようにした。 -</p> - -<h2>生ゴミの肥料</h2> -<p> -畑を借りてから、台所からでる植物性の生ゴミは全て畑の一角に捨てるようにした。胡瓜や人参のへた、南瓜のわたや種等である。捨てたゴミは少し土とまぜ、発酵させて二年目から畑の肥やしとして利用しようと考えてのことだ。冒頭で書いた無肥料と矛盾するがまあこれも試行錯誤のうちである。 -</p> -<p> -春から夏にかけて気温が上がり、梅雨には雨も降り、微生物の活動が活発になる。始めは臭いが大丈夫か心配だったが、日中30度を越えるようになってもほとんど臭くない。1メートル以内に近づいて少し臭うが、臭いというほどではない。臭い臭いではない。一時コバエがたかっていたが、今は目立たなくなり、かわりにコオロギがうじゃうじゃしている。 -</p> -<p> -春の終りごろに買ってきた南瓜のわたと種もここに捨てた。しばらくするとそこから南瓜の芽が大量に生え、梅雨があけるころにはたくさん花をつけた。近くの養蜂場からだと思うが、セイヨウミツバチがやってきて受粉してくれる。7月の終りごろにはおおきな実をつけた。収穫して煮物にしたがとてもおいしかった。捨てた種は一代交配種で、できたのはその子供なのでおいしくなる道理はないのだが。不思議である。 -</p> -<p> -地主さんから土地の返還を打診されて畑に生ゴミを捨てるのはやめにした。ところが調理中にでるゴミの量は変化するわけでわない。野菜のうち食べない部分はすべてゴミ箱に捨てるようになった。畑を借りる前の状態に戻っただけである。ところが切った野菜のへたをゴミ箱に捨てるたびになんだか虚しくなる。畑に撒けばそこにまた植物が育ち収穫にも繋がる。ところがゴミ箱に捨ててしまうとなんにもならない。そればかりか、ゴミを集めてさらにそれを焼却しなければいけない。すべて税金である。ただ畑に捨てるだけでまた利用可能な形のエネルギーになるものを、税金を投入したうえで無にしているのだ。あまりにも勿体無い。しかも一般的な農家では、生ゴミを税金で回収してもらったうえで、肥料を購入してきて自分の畑に施すのだ。江戸時代なんかはさらに無駄がない。自分たちの排泄物まで畑に還元していたほどだ。 -</p> - -<h2>育てた作物</h2> -<h3>玉葱</h3> -祖父の知り合いに苗をもらって植えた。確か初めて植えたのがこれである。土が固く肥沃度も低いためか玉が膨らまなかった。 -<h3>小松菜</h3> -時期が悪かったのか、すぐにとう立ちしてしまった。 -<h3>法蓮草</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>春菊</h3> -実験的に雑草を刈らずに蒔いた。これもとう立ちが早く、食べられなかった。 -<h3>牛蒡</h3> -雑草を処理した場所と処理しない場所に分けて植えた。雑草の下でも元気そうに育っている。生育が遅いので土地を返却するまでに収穫できるか不明である。 -<h3>じゃが芋</h3> -六月の雨でほとんど腐ってしまった。水はけが悪いのが原因だと思う。収穫できたものは小さかったが美味しかった。 -<h3>葱</h3> -warmerwarmerというところで買ったセット野菜に入っていたものの根を切って植えた。葱坊主ができ、種を収穫できた。 -<h3>胡瓜</h3> -地這いきゅうりを植えた。雑草がしげってもそれに巻きついて元気である。種の部分だけよく太っていびつな形に育った。肥沃度の問題か。味は普通にきゅうりである。 -<h3>南瓜</h3> -上に書いた生ゴミとは別に日本南瓜を植えた。すぐに発芽したがそれ以降成長しない。花はひとつだけ目撃した記憶がある。 -<h3>冬瓜</h3> -これもwarmerwarmerの野菜から種をとりだしたものである。かぼちゃと同様、発芽したが成長しない。 -<h3>とうもろこし</h3> -雑草に負けずよく育った。ただ生育にばらつきがあり、うまく受粉できなかった。収穫できたものは歯抜けである。味はよかった。 -<h3>いんげん</h3> -白金時菜豆と、つるありいんげんをうえた。白金時菜豆は収穫できたが成長が不十分で量が少ない。つるありいんげんは発芽しただけである。せっかく立てた支柱は虚しく、すずめの遊び場である。 -<h3>伏見甘長唐辛子</h3> -発芽せず。 -<h3>胡麻</h3> -発芽せず。 -<h3>小豆</h3> -あまり大きくならないが、長い期間にわたり収穫できている。粒が小さい。 -<h3>西瓜</h3> -発芽したが成長しない。 -<h3>茄子</h3> -実験的に雑草を刈らずに蒔いた。イヌムギかノゲイヌムギか同定できていない草が茶色く枯れているところに蒔いた。日照か水の不足か。 -<h3>大豆</h3> -よく育っている。顔を近づけると枝豆のにおいがして楽しい。 -<h3>さつま芋</h3> -よく育っている。少なくとも地上部は。時期的に収穫まで漕ぎつけるか微妙なところ。 -<h3>里芋</h3> -よく育っている。と思っていたが、近所の畑のものはもっと育っていることに最近気が付いた。肥料をやっていないのでこんなものだろうか。本葉がでてすぐのころ黒いいもむしに葉脈をのこして食い荒されたが、また葉が出てきて平気そうである。こちらも土地を返却するまでに収穫できるかわからない。 -<h3>人参</h3> -最近蒔いて発芽したばかりである。好光性のため種を蒔いた上にかぶせる草を少なくしたが、少なすぎたようだ。土が乾燥ぎみで発芽率はいまいちである。 - -<h2>おわりに</h2> -<p> -不耕起では一年目はあまりなにも育たない。土が固くて痩せているからである。三年目から突然変化が起こり、土が柔らかく肥沃になってくるという。その変化をこの畑で体感したかったのだがそれはかなわなかった。 -</p> -<p> -この一年弱の短い期間にも、この土地の豊かさは格段にあがったように思う。土の上をコオロギやクモが行き交い、バッタやカエルが跳ね、チョウやトンボ、ハチが飛び回っている。土をいじればミミズやカタツムリ、アリがわんさかわいてくる。これらの虫を求めてスズメやセキレイ、イソヒヨなどの鳥が集まり、夜になればネコやイタチまで見かけるようになった。 -</p> -<p> -ここに生きた生物たちはこれからコンクリートに埋められることになる。なんだか虚しい。 -</p> -<p> -この一年弱の経験から、農業で生きていく自信が芽生えたように思う。そこにあるものを利用し、多くを求めなければいいのだ。この自信が確信にかわるにはもっと経験が必要だろうが。 -</p> -<p> -畑を返したあとはすることがなくなってしまう。他の土地を探すのもひとつだし、別のことをするのもありかもしれない。いいご縁があればいいな。 -</p> -]]></description> -</item> -</channel> -</rss> diff --git a/pub/sitemap.xml b/pub/sitemap.xml @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> -<url><loc>https://www.mtkn.jp/</loc><lastmod>2025-12-20</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/x11_32bit_window.html</loc><lastmod>2025-12-20</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/</loc><lastmod>2025-12-20</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/9p.html</loc><lastmod>2025-12-19</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20241211.html</loc><lastmod>2025-12-11</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20241202.html</loc><lastmod>2025-12-02</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20251122.html</loc><lastmod>2025-11-30</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/</loc><lastmod>2025-11-30</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/mailserver.html</loc><lastmod>2025-11-03</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/rp2040_3_interrupt.html</loc><lastmod>2025-08-27</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/</loc><lastmod>2025-07-17</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20250717.html</loc><lastmod>2025-07-17</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20250519.html</loc><lastmod>2025-05-19</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/what-i-use.html</loc><lastmod>2025-04-28</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/openbsd_on_u9310e.html</loc><lastmod>2025-04-28</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20250420.html</loc><lastmod>2025-04-23</lastmod></url> -<url><loc>https://www.mtkn.jp/poetry/</loc><lastmod>2025-04-07</lastmod></url> -<url><loc>https://www.mtkn.jp/plant/</loc><lastmod>2025-04-01</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20250221.html</loc><lastmod>2025-02-21</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20250216.html</loc><lastmod>2025-02-16</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20250101.html</loc><lastmod>2025-01-01</lastmod></url> -<url><loc>https://www.mtkn.jp/kitchen/recipe/mapo_tofu.html</loc><lastmod>2024-10-10</lastmod></url> -<url><loc>https://www.mtkn.jp/kitchen/</loc><lastmod>2024-10-10</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20241009.html</loc><lastmod>2024-10-09</lastmod></url> -<url><loc>https://www.mtkn.jp/books/</loc><lastmod>2024-07-31</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20240727.html</loc><lastmod>2024-07-30</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20240702.html</loc><lastmod>2024-07-30</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20240629.html</loc><lastmod>2024-07-30</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20240628.html</loc><lastmod>2024-07-30</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20240428.html</loc><lastmod>2024-04-28</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/rp2040_2.html</loc><lastmod>2024-02-27</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/rp2040_1.html</loc><lastmod>2024-02-25</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/git_server.html</loc><lastmod>2024-02-15</lastmod></url> -<url><loc>https://www.mtkn.jp/kitchen/recipe/miso.html</loc><lastmod>2024-02-09</lastmod></url> -<url><loc>https://www.mtkn.jp/about.html</loc><lastmod>2024-01-23</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20240101.html</loc><lastmod>2024-01-01</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20231202.html</loc><lastmod>2023-12-03</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20231018.html</loc><lastmod>2023-10-24</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20231005.html</loc><lastmod>2023-10-24</lastmod></url> -<url><loc>https://www.mtkn.jp/gallery/20231007.html</loc><lastmod>2023-10-20</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230810.html</loc><lastmod>2023-08-10</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230803.html</loc><lastmod>2023-08-03</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230802.html</loc><lastmod>2023-08-02</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230729.html</loc><lastmod>2023-07-29</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230726.html</loc><lastmod>2023-07-26</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230725.html</loc><lastmod>2023-07-25</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20220730.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20210106.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground6.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground5.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground4.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground3.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground2.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/xlib_playground1.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/archlinux_installation.html</loc><lastmod>2023-05-15</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20230119.html</loc><lastmod>2023-01-19</lastmod></url> -<url><loc>https://www.mtkn.jp/farm/</loc><lastmod>2023-01-19</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20221228.html</loc><lastmod>2022-12-28</lastmod></url> -<url><loc>https://www.mtkn.jp/books/978-4-06-288451-8.html</loc><lastmod>2022-11-23</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20221031.html</loc><lastmod>2022-10-31</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20221023.html</loc><lastmod>2022-10-23</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20220814.html</loc><lastmod>2022-08-16</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20220813.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20220729.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20201210.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20201209.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20201202.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20201201.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20201003.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200926.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200925.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200919.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200918.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200917.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200804.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200802.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200801.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200727.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200725.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200723.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200719.html</loc><lastmod>2022-08-13</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20200808.html</loc><lastmod>2022-07-20</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/setting_up_web_server.html</loc><lastmod>2022-06-27</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20220513.html</loc><lastmod>2022-05-13</lastmod></url> -<url><loc>https://www.mtkn.jp/farm/journal/2022.html</loc><lastmod>2022-02-11</lastmod></url> -<url><loc>https://www.mtkn.jp/kitchen/recipe/tonkotsu_ramen.html</loc><lastmod>2022-02-08</lastmod></url> -<url><loc>https://www.mtkn.jp/kitchen/r4_osechi.html</loc><lastmod>2022-02-04</lastmod></url> -<url><loc>https://www.mtkn.jp/computer/rtx1200-qos.html</loc><lastmod>2022-01-14</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20211214.html</loc><lastmod>2021-12-14</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20211129.html</loc><lastmod>2021-11-29</lastmod></url> -<url><loc>https://www.mtkn.jp/farm/journal/2021.html</loc><lastmod>2021-11-17</lastmod></url> -<url><loc>https://www.mtkn.jp/journal/posts/20210806.html</loc><lastmod>2021-08-06</lastmod></url> -</urlset> diff --git a/pub/style.css b/pub/style.css @@ -1,129 +0,0 @@ -:root { - --dbg: #000000; - --dbg2: #000000; - --dfg: #ffffff; - --dfg2: #80ff80; - --lbg: #ffffff; - --lbg2: #ffffff; - --lfg: #000000; - --lfg2: #009900; -} - -a { - text-decoration: none; -} - -i { - font-style: italic; -} - -figure { - padding: 1em; - overflow-x: auto; -} - -figcaption { - font-style: italic; -} - -table { - border-collapse: collapse; -} - -table th, -table td { - border: 1px solid; -} - -img { - max-width: 100%; -} - -code { -} - -pre { - padding: 1em; - border-style: solid; - border-radius: 5px; - border-width: 1px; - overflow-x: auto; -} - -body { - font-family: serif; - max-width: 1300px; - margin: 5px auto; -} - -header { - padding: 5px; - border-bottom: 1px solid; -} - -header a { - word-break: keep-all; -} - -main { - padding: 5px; -} - -footer { - padding: 5px; - border-top: 1px solid; -} - -footer *{ - display: inline; -} - -@media (prefers-color-scheme: dark) { - html { - background-color: var(--dbg); - color: var(--dfg); - } - a { - color: var(--dfg2); - } - pre { - background-color: var(--dbg2); - border-color: var(--dfg); - } -} - -@media (prefers-color-scheme: light) { - html { - background-color: var(--lbg); - color: var(--lfg); - } - a { - color: var(--lfg2); - } - pre { - background-color: var(--lbg2); - border-color: var(--lfg); - } -} - -.portrait { - margin: 10px; -} - -.farm-journal-item { - margin: 30px auto; -} - -.farm-journal-date time{ - font-size: x-small; -} - -.galind { - display: flex; - flex-wrap: wrap; - list-style: none; -} - -.galind li { - max-width: 300px; -} diff --git a/temp/footer.html b/temp/footer.html @@ -1,9 +0,0 @@ - </article> - - </main> - <footer> - <address>info(at)mtkn(dot)jp</address> - <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> - </footer> -</body> -</html> diff --git a/temp/header.html b/temp/header.html @@ -1,25 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width,initial-scale=1"> - <link rel="stylesheet" type="text/css" href="/style.css"> - <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> - <title><!--title--></title> -</head> -<body> - <header> - <a href="/">主頁</a> | - <a href="/about.html">自己紹介</a> | - <a href="/journal">日記</a> | - <a href="/farm">農業</a> | - <a href="/kitchen">台所</a> | - <a href="/computer">電算機</a> | - <a href="/poetry">詩</a> | - <a href="/books">本棚</a> | - <a href="/gallery">絵</a> | - <a href="/plant">植物</a> | - <a href="https://git.mtkn.jp">Git</a> - </header> - <main> - <article>