summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasaya Tojo <masaya@tojo.tokyo>2021-03-26 23:18:20 +0900
committerMasaya Tojo <masaya@tojo.tokyo>2021-03-26 23:32:17 +0900
commit72f49c071d817ecfd9273d8227596981787bec63 (patch)
tree7f4720e183479b501e3c6048ce6d6c4f773671f2
parent54ccdb558f4d23861ee5f8fb3feffb6bbd6d246f (diff)
org-mode から commonmark へ移行する
pandoc への依存をなくすため、org-mode ではなく commonmark を使用するよ うに修正する。プロセス間通信で利用している pandoc は GPLv2 でライセン スされていて、本プログラムは GPLv3 であり GPLv2 と GPLv3 には互換性が ないためにライセンス違反を起こしている可能性がある。 プロセス間通信でしか使用していないため、 pandoc が本ソフトウェアの一部 と見做されるかどうかは微妙なところだが、念のため対応する。 pandoc は org-mode で記事を書く場合にしか使用していないため、org-mode から commonmark へ移行することで対応できる。
-rw-r--r--environment.scm1
-rw-r--r--haunt.scm4
-rw-r--r--posts/about-me.md14
-rw-r--r--posts/about-me.org16
-rw-r--r--posts/add-org-mode.md94
-rw-r--r--posts/add-org-mode.org97
-rw-r--r--posts/before-sicp-about-scheme.md129
-rw-r--r--posts/before-sicp-about-scheme.org125
-rw-r--r--posts/contact.md59
-rw-r--r--posts/contact.org60
-rw-r--r--posts/freedom-for-yourself.md148
-rw-r--r--posts/freedom-for-yourself.org152
-rw-r--r--posts/launch-nextcloud.md63
-rw-r--r--posts/launch-nextcloud.org57
-rw-r--r--posts/redesign-www-tojo-tokyo.md54
-rw-r--r--posts/redesign-www-tojo-tokyo.org60
-rw-r--r--www-tojo-tokyo/reader/org.scm55
17 files changed, 563 insertions, 625 deletions
diff --git a/environment.scm b/environment.scm
index cdb131b..e1680aa 100644
--- a/environment.scm
+++ b/environment.scm
@@ -39,7 +39,6 @@
("awscli" ,awscli)
("make" ,gnu-make)
("giule-commonmark" ,guile3.0-commonmark)
- ("ghc-pandoc" ,ghc-pandoc)
("password-store" ,password-store)
("rsync" ,rsync)))
(synopsis "TojoQK's web site")
diff --git a/haunt.scm b/haunt.scm
index bca1f3a..5532702 100644
--- a/haunt.scm
+++ b/haunt.scm
@@ -22,7 +22,7 @@
(haunt builder atom)
(haunt builder assets)
(haunt reader)
- (www-tojo-tokyo reader org)
+ (haunt reader commonmark)
(srfi srfi-19)
(haunt post)
(sxml simple))
@@ -167,7 +167,7 @@
#:default-metadata
'((author . "Masaya Tojo")
(email . "masaya@tojo.tokyo"))
- #:readers (list sxml-reader org-reader)
+ #:readers (list sxml-reader commonmark-reader)
#:builders (list (blog/tojoqk)
(atom-feed)
(static-directory "static"))
diff --git a/posts/about-me.md b/posts/about-me.md
new file mode 100644
index 0000000..5e20bde
--- /dev/null
+++ b/posts/about-me.md
@@ -0,0 +1,14 @@
+title: About me
+id: about-me
+date: 2020-02-19 00:00
+updated: 2020-05-08 08:10
+description: TojoQK について
+---
+
+## 自己紹介
+
+自由ソフトウェアに関心を持っています。 Scheme というプログラミング言語が好きで、GNU Guile という Scheme
+の処理系に入門中です。
+
+GNU Guix は自由ソフトウェアと Scheme の両方に関心がある人にとっては最高の OS、パッケージマネージャで、 最近はどうしたら
+GNU Guix を普及させることができるかといったことをよく考えています。
diff --git a/posts/about-me.org b/posts/about-me.org
deleted file mode 100644
index c314018..0000000
--- a/posts/about-me.org
+++ /dev/null
@@ -1,16 +0,0 @@
-title: About me
-id: about-me
-date: 2020-02-19 00:00
-updated: 2020-05-08 08:10
-description: TojoQK について
----
-#+OPTIONS: todo:nil
-
-** 自己紹介
-
- 自由ソフトウェアに関心を持っています。
- Scheme というプログラミング言語が好きで、GNU Guile という Scheme の処理系に入門中です。
-
- GNU Guix は自由ソフトウェアと Scheme の両方に関心がある人にとっては最高の OS、パッケージマネージャで、
- 最近はどうしたら GNU Guix を普及させることができるかといったことをよく考えています。
-
diff --git a/posts/add-org-mode.md b/posts/add-org-mode.md
new file mode 100644
index 0000000..dd9a00d
--- /dev/null
+++ b/posts/add-org-mode.md
@@ -0,0 +1,94 @@
+title: org-mode で記事が書けるようになりました
+id: add-org-mode
+date: 2020-05-07 10:45
+description: haunt を拡張して org-mode を使って記事を書けるようにした
+---
+
+## org-mode で記事を書きたい
+
+今までの記事は全て `SXML` で直書きしていました。 しかし、ここ最近、 `org-mode` を本格的に使用するようになって、
+いくらS式が好きだといってもさすがに `SXML` でブログを書くのは苦行であると気づきました。 今後 Guix
+の紹介記事のような重要な記事を書く予定があるので、 `org-mode`
+の強力なタスク管理を利用して記事を作成したいと考えています。
+
+このブログは [Haunt](https://dthompson.us/projects/haunt.html) という、[GNU
+Guile](https://www.gnu.org/software/guile/)
+製の静的サイトジェネレータを使用して生成しているのですが、
+サポートしている文書の形式は, `SXML`, `Texinfo`, `Skribe`, `CommonMark` の4つのみであったため、
+デフォルトでは `org-mode` は使用できませんでした。
+
+既に `org-mode` に依存してしまっているので、 `org-mode` で記事が書けないのは致命的です。 この問題を、 `Haunt`
+を拡張することによって解決します。
+
+## Haunt の紹介
+
+[Haunt](https://dthompson.us/projects/haunt.html) は GNU Guile (Scheme
+の処理系の一つ)で実装された静的サイトジェネレータで、 サイトの生成の仕方などを Guile で割と自由に拡張できるのが特徴的です。
+このサイトでもブログ記事から対応する GitLab 上のソースコードにアクセスしたり、 記事の変更履歴を閲覧する機能が追加されています。
+[ソースコードは公開されている](https://gitlab.com/tojoqk/www-tojo-tokyo)ので、興味のある方は確認してみてください。
+
+Haunt の基本的な使い方については
+[公式ドキュメント](https://dthompson.us/manuals/haunt/index.html)
+を参照していただくことにして、 今回の説明に必要なところだけ解説します。 `haunt.scm`
+というファイルでサイトをどのように生成するのかという設定を書き、
+`posts` ディレクトリに記事を配置して `haunt build` というコマンドを実行すると良い感じにブログが生成されます。
+
+`haunt.scm` で記事の `reader` を指定することができるので、 今回は `org-reader` という `org-mode`
+用の `reader` を追加することで、 `org-mode` の記事を書けるように拡張します。
+
+## org-reader の実装について
+
+`commonmark-reader` の実装を確認したところ、 記事のファイルからメタデータと `SXML`
+形式のコンテンツに変換できれば良いことが分かりました。
+
+`Guile` だけで `org-mode` の文書を `SXML` に変換するのは骨が折れそうなので、
+[Pandoc](https://pandoc.org/) を使用して `HTML` に変換して、それを `SXML`
+に変換することで実現することにしました。
+
+`Pandoc` を使用して `HTML` に変換する部分は
+[org-string-\>html-string](https://gitlab.com/tojoqk/www-tojo-tokyo/-/blob/d85c05ec6ef778b38ade07cea05ed90b18bec606/www-tojo-tokyo/reader/org.scm#L31)
+という手続きで実現しているのですが、 Guile でパイプの入出力を行なうプログラムを書くのが意外と難しかったです。 `(ice-9
+popen)` が公式に提供している `open-pipe*` だと入力用のポートのみをクローズすることができないために、
+エクスポートされていない手続きである `open-process` を使用しています。
+
+``` scheme
+(define (org-port->html-string port)
+ (receive (read-port write-port pid)
+ (open-process OPEN_BOTH "pandoc" "-f" "org")
+ (put-string write-port (get-string-all port))
+ (close-port write-port)
+ (let ((result (get-string-all read-port)))
+ (close-port read-port)
+ (let ((status (cdr (waitpid pid))))
+ (unless (zero? status)
+ (error "pandoc return a non-zero status-code:" status)))
+ result)))
+```
+
+非公開の手続きを使用しているので、正直微妙な気持ちになっていますが、 `shell` の代替として `Guile` が使えそうな雰囲気ですね。
+
+`org-reader` 本体は下記のように実装しています。
+
+``` scheme
+(define org-reader
+ (make-reader (make-file-extension-matcher "org")
+ (lambda (file)
+ (call-with-input-file file
+ (lambda (port)
+ (let* ((metadata (read-metadata-headers port))
+ (html-string (org-string->html-string
+ (get-string-all port))))
+ (values metadata
+ ((sxpath '(dummy *))
+ (xml->sxml
+ (string-append "<dummy>"
+ html-string
+ "</dummy>"))))))))))
+```
+
+## まとめ
+
+`org-mode` でブログを書けるようになりました。
+
+Haunt は Hackable な静的サイトジェネレータで、Guile を使って簡単にカスタマイズできて結構楽しいです。
+自分でブログを作成する予定のある人は一度検討してみてください。
diff --git a/posts/add-org-mode.org b/posts/add-org-mode.org
deleted file mode 100644
index d52f5a6..0000000
--- a/posts/add-org-mode.org
+++ /dev/null
@@ -1,97 +0,0 @@
-title: org-mode で記事が書けるようになりました
-id: add-org-mode
-date: 2020-05-07 10:45
-description: haunt を拡張して org-mode を使って記事を書けるようにした
----
-#+OPTIONS: todo:nil
-
-** DONE org-mode で記事を書きたい
- CLOSED: [2020-05-07 Thu 09:37]
-
- 今までの記事は全て ~SXML~ で直書きしていました。
- しかし、ここ最近、 ~org-mode~ を本格的に使用するようになって、
- いくらS式が好きだといってもさすがに ~SXML~ でブログを書くのは苦行であると気づきました。
- 今後 Guix の紹介記事のような重要な記事を書く予定があるので、
- ~org-mode~ の強力なタスク管理を利用して記事を作成したいと考えています。
-
- このブログは [[https://dthompson.us/projects/haunt.html][Haunt]] という、[[https://www.gnu.org/software/guile/][GNU Guile]] 製の静的サイトジェネレータを使用して生成しているのですが、
- サポートしている文書の形式は, ~SXML~, ~Texinfo~, ~Skribe~, ~CommonMark~ の4つのみであったため、
- デフォルトでは ~org-mode~ は使用できませんでした。
-
- 既に ~org-mode~ に依存してしまっているので、 ~org-mode~ で記事が書けないのは致命的です。
- この問題を、 ~Haunt~ を拡張することによって解決します。
-
-** DONE Haunt の紹介
- CLOSED: [2020-05-07 Thu 09:38]
-
- [[https://dthompson.us/projects/haunt.html][Haunt]] は GNU Guile (Scheme の処理系の一つ)で実装された静的サイトジェネレータで、
- サイトの生成の仕方などを Guile で割と自由に拡張できるのが特徴的です。
- このサイトでもブログ記事から対応する GitLab 上のソースコードにアクセスしたり、
- 記事の変更履歴を閲覧する機能が追加されています。
- [[https://gitlab.com/tojoqk/www-tojo-tokyo][ソースコードは公開されている]]ので、興味のある方は確認してみてください。
-
- Haunt の基本的な使い方については [[https://dthompson.us/manuals/haunt/index.html][公式ドキュメント]] を参照していただくことにして、
- 今回の説明に必要なところだけ解説します。
- ~haunt.scm~ というファイルでサイトをどのように生成するのかという設定を書き、
- ~posts~ ディレクトリに記事を配置して
- ~haunt build~ というコマンドを実行すると良い感じにブログが生成されます。
-
- ~haunt.scm~ で記事の ~reader~ を指定することができるので、
- 今回は ~org-reader~ という ~org-mode~ 用の ~reader~ を追加することで、
- ~org-mode~ の記事を書けるように拡張します。
-
-** DONE org-reader の実装について
- CLOSED: [2020-05-07 Thu 10:35]
-
- ~commonmark-reader~ の実装を確認したところ、
- 記事のファイルからメタデータと ~SXML~ 形式のコンテンツに変換できれば良いことが分かりました。
-
- ~Guile~ だけで ~org-mode~ の文書を ~SXML~ に変換するのは骨が折れそうなので、
- [[https://pandoc.org/][Pandoc]] を使用して ~HTML~ に変換して、それを ~SXML~ に変換することで実現することにしました。
-
- ~Pandoc~ を使用して ~HTML~ に変換する部分は [[https://gitlab.com/tojoqk/www-tojo-tokyo/-/blob/d85c05ec6ef778b38ade07cea05ed90b18bec606/www-tojo-tokyo/reader/org.scm#L31][org-string->html-string]] という手続きで実現しているのですが、
- Guile でパイプの入出力を行なうプログラムを書くのが意外と難しかったです。
- ~(ice-9 popen)~ が公式に提供している ~open-pipe*~ だと入力用のポートのみをクローズすることができないために、
- エクスポートされていない手続きである ~open-process~ を使用しています。
-
- #+BEGIN_SRC scheme
-(define (org-port->html-string port)
- (receive (read-port write-port pid)
- (open-process OPEN_BOTH "pandoc" "-f" "org")
- (put-string write-port (get-string-all port))
- (close-port write-port)
- (let ((result (get-string-all read-port)))
- (close-port read-port)
- (let ((status (cdr (waitpid pid))))
- (unless (zero? status)
- (error "pandoc return a non-zero status-code:" status)))
- result)))
- #+END_SRC
-
- 非公開の手続きを使用しているので、正直微妙な気持ちになっていますが、
- ~shell~ の代替として ~Guile~ が使えそうな雰囲気ですね。
-
- ~org-reader~ 本体は下記のように実装しています。
- #+BEGIN_SRC scheme
-(define org-reader
- (make-reader (make-file-extension-matcher "org")
- (lambda (file)
- (call-with-input-file file
- (lambda (port)
- (let* ((metadata (read-metadata-headers port))
- (html-string (org-string->html-string
- (get-string-all port))))
- (values metadata
- ((sxpath '(dummy *))
- (xml->sxml
- (string-append "<dummy>"
- html-string
- "</dummy>"))))))))))
- #+END_SRC
-
-** まとめ
-
- ~org-mode~ でブログを書けるようになりました。
-
- Haunt は Hackable な静的サイトジェネレータで、Guile を使って簡単にカスタマイズできて結構楽しいです。
- 自分でブログを作成する予定のある人は一度検討してみてください。
diff --git a/posts/before-sicp-about-scheme.md b/posts/before-sicp-about-scheme.md
new file mode 100644
index 0000000..b21c475
--- /dev/null
+++ b/posts/before-sicp-about-scheme.md
@@ -0,0 +1,129 @@
+title: SICPを読む前に: Scheme 編
+id: before-sicp-about-scheme
+date: 2020-06-11 02:30
+updated: 2020-06-11 23:21
+description: 普段 Scheme を使わないプログラマ向けに SICP を快適に読むための文書です。
+---
+
+普段 Scheme を使わないプログラマ向けに SICP を快適に読むための文書です。 社内で実施する SICP
+輪読会の準備のために作成しました。
+
+## 前提: SICP は Scheme の教科書ではない
+
+SICP は計算機科学の入門書であって Scheme について学ぶ本ではありません。 実際、SICP では Scheme
+の初歩的な言語機能しか説明していないので Scheme の教科書としては不十分だと思われます。
+
+## どうして SICP を読むのに Scheme を使う必要があるのか
+
+SICP は5章編成なのですが、少なくとも3章までは Scheme 以外の多くのプログラミング言語でも通用する一般的な内容です。
+ただし、SICP は Scheme 使って読むことが前提となっていて第3章までであっても Scheme
+以外のプログラミング言語を使用して SICP を読もうとするといくつかの障壁があります。
+
+私がぱっと思いつくのは下記の3点です。
+
+ - SICP では対(pair)というデータ構造を使用する
+ - Python や Haskell にある `tuple` とは異なり、Scheme では `pair` を組み合わせて
+ `list` という構造を構成する
+ - `pair` を組み合わせて `list` を構成するようになっているプログラミング言語は少ない
+ - Lisp 方言の一つである Clojure はリストを構成するのに pair を使用していない
+ - Scheme の `pair` は破壊できる (`set-car!`, `set-cdr!`)
+ - Lisp と同じようなリスト構造を扱えるプログラミング言語で、その構成要素の pair
+ を破壊できるプログラミング言語は少ない(私は知らない)
+ - SICP では末尾呼び出しが最適化されることを前提としている
+ - 末尾呼び出しが最適化されないプログラミング言語では、SICP
+ に紹介されているようなプログラムの書き方をするのはスタイルとして良くない
+ - 関数型言語の多くで末尾呼び出しが最適化されるが、そのような関数型言語には Scheme の pair がない
+ - Scheme 以外の Lisp 方言の多くは末尾呼び出しの最適化が保証されていない
+ - SICP の 3.5 章を読むのに cons-stream が実装できないといけない
+ - これは特殊形式を追加できるプログラミング言語でないと書けない、マクロが書けないと詰んでしまう
+
+正直なところ全て些細な問題なのですが、他のプログラミング言語で SICP を読もうとした場合に障壁となるので素直に Scheme
+を使った方が良いです。
+
+## エディタについて
+
+pair と末尾呼び出しの最適化と `cons-stream` を除けば SICP では Scheme 特有の特殊な仕組みを必要としません。
+よって SICP で解説されるほとんどの言語機能は現代の他のプログラミング言語にもあるものが多く、そこで躓くことはないと思います。
+(とくに Ruby や JavaScript といったプログラミング言語を使ったことがあれば、新しいものはほとんどないはずです)
+
+ただし、Scheme というか Lisp の構文は他のプログラミング言語と大きく異なっているので注意が必要です。
+とくにインデントのルールが特殊でエディタの支援なしに正しくインデントをすることは困難です。
+
+よって、Scheme のインデントが正しくできるエディタを使用することを強く推奨します。
+
+### 私が推奨するエディタ
+
+1. Emacs
+
+ 個人的には Emacs の使用を強く推奨します。 Emacs を使用している Schemer が多いので Emacs で Scheme
+ を使うための環境構築をするためのドキュメントがたくさん存在しています。 また、私は Emacs で Scheme
+ をよく書いているので、何か問題が生じてもすぐに対応できる可能性が高いです。
+
+2. DrRacket
+
+ Emacs を使用しない場合は DrRacket がおすすめです。 DrRacket を使うと実質的に選択できる Scheme
+ の処理系が Racket に絞られてしまうのが難点なのですが SICP を読む限りは大きな問題にはならないです。
+
+ ただし、Racket の標準の言語(`#lang racket`)では `set-car!`, `set-cdr!`
+ が存在していないので普通に使うと第3章で詰みます。 `#lang r5rs` とするか
+ DrRacket の設定を変更して標準の Scheme を使用するように変更する必要があります。 また、Racket には sicp
+ 専用のモードがあるようなのでそちらを使用してもいいかもしれません。
+
+### 推奨していいのかよく分かっていないエディタ
+
+1. Vim
+
+ 軽く調べた感じ Vim でも Lisp のプログラムが書けるようです。 `if` のインデントが Scheme
+ の一般的なスタイルとは違ったので、 `lispwords` 変数から `if`
+ は取り除いた方がいいかもしれません。
+
+ また、Vim から REPL を起動できるのかといったことについては良く分かっていないので、Vim を使う場合は自己責任でお願いします。
+
+### 非推奨なエディタ
+
+1. Visual Studio Code
+
+ Scheme のコードをハイライトするプラグインを見つけることはできたのですが、
+ 正しくインデントするためのプラグインを見つけることができませんでした(良いプラグインを知っている方がいたら教えて欲しいです。Twitter
+ の tojoqk にリプライか DM もしくはメールで連絡をお願いいたします)。
+
+ 次の章で説明しますが、正しく自動でインデントができないと Scheme
+ のプログラムを書くのはかなり厳しいのでインデントの問題が解決しない限りは諦めて欲しいです……。
+
+## 初めて Scheme を書く人が遭遇するエラーと対処法
+
+他に何か思いついたら追記していきます。
+
+### 括弧の対応を間違えてしまう
+
+Scheme のコードで `(f a b c)` というような式が現われた場合、 基本的には `f` が手続きであれば `a`, `b`,
+`c` を渡して `f` を呼びだすという意味で、 `f` が特殊形式であれば `(f a b c)` が `f` 特有のルールで評価されます。
+
+これだけであれば簡単なのですが例外があって `let` や `cond` のような特殊形式の中では括弧をグルーピングのために使用しています。
+グルーピングのために使用された括弧の中で手続きを呼び出すような場合には括弧をたくさん書く必要があり、ここで括弧の対応を誤ってしまうという問題が発生しがちです。
+
+たとえば下記のように `let` の中で括弧の対応を誤ってしまう場合があります(ここでは `let` についての説明はしません)
+
+ (let ((a (+ 1 2)
+ (b (+ 3 4))))
+ (+ a b))
+
+これを Scheme に解釈させると、 `let` の構文エラーになるのですが、 ぱっと見ただけではどこがおかしいのかを判断するのは困難です。
+Scheme 側も `let` の中でどういった構文エラーが発生しているかまでは伝えることができるのですが、
+具体的にどう直せばよいのかまでは教えてくれません。
+よって正しい対処法を知らないとこのような些細なミスで多くの時間を浪費してしまいます。
+
+こういった場合にはエディタの機能で **let 式全体を再インデント** することによってエラーの箇所を特定することができます。
+今回のコードを再インデントをすると下記のような状態になります。
+
+ (let ((a (+ 1 2)
+ (b (+ 3 4))))
+ (+ a b))
+
+`(b (+ 3 4))` が右にずれてしまいました。 これは `(a (+ 1 2))`
+しないといけないのに最後の閉じ括弧を書き忘れてしまっていることが原因です。
+
+このように、エディタの **自動インデント機能は重要** です。
+括弧の対応に関するエラーはほとんど自動インデントで撲滅できるのでうまく活用してください。
+
+これさえ気をつければ、「Scheme には括弧がいっぱいあって大変」ということはないので安心してプログラムを書くことができます。
diff --git a/posts/before-sicp-about-scheme.org b/posts/before-sicp-about-scheme.org
deleted file mode 100644
index 9ef6091..0000000
--- a/posts/before-sicp-about-scheme.org
+++ /dev/null
@@ -1,125 +0,0 @@
-title: SICPを読む前に: Scheme 編
-id: before-sicp-about-scheme
-date: 2020-06-11 02:30
-updated: 2020-06-11 23:21
-description: 普段 Scheme を使わないプログラマ向けに SICP を快適に読むための文書です。
----
-#+OPTIONS: todo:nil
-
-普段 Scheme を使わないプログラマ向けに SICP を快適に読むための文書です。
-社内で実施する SICP 輪読会の準備のために作成しました。
-
-** 前提: SICP は Scheme の教科書ではない
-
- SICP は計算機科学の入門書であって Scheme について学ぶ本ではありません。
- 実際、SICP では Scheme の初歩的な言語機能しか説明していないので Scheme の教科書としては不十分だと思われます。
-
-** どうして SICP を読むのに Scheme を使う必要があるのか
-
- SICP は5章編成なのですが、少なくとも3章までは Scheme 以外の多くのプログラミング言語でも通用する一般的な内容です。
- ただし、SICP は Scheme 使って読むことが前提となっていて第3章までであっても Scheme 以外のプログラミング言語を使用して SICP を読もうとするといくつかの障壁があります。
-
- 私がぱっと思いつくのは下記の3点です。
-
- - SICP では対(pair)というデータ構造を使用する
- - Python や Haskell にある =tuple= とは異なり、Scheme では =pair= を組み合わせて =list= という構造を構成する
- - =pair= を組み合わせて =list= を構成するようになっているプログラミング言語は少ない
- - Lisp 方言の一つである Clojure はリストを構成するのに pair を使用していない
- - Scheme の =pair= は破壊できる (=set-car!=, =set-cdr!=)
- - Lisp と同じようなリスト構造を扱えるプログラミング言語で、その構成要素の pair を破壊できるプログラミング言語は少ない(私は知らない)
- - SICP では末尾呼び出しが最適化されることを前提としている
- - 末尾呼び出しが最適化されないプログラミング言語では、SICP に紹介されているようなプログラムの書き方をするのはスタイルとして良くない
- - 関数型言語の多くで末尾呼び出しが最適化されるが、そのような関数型言語には Scheme の pair がない
- - Scheme 以外の Lisp 方言の多くは末尾呼び出しの最適化が保証されていない
- - SICP の 3.5 章を読むのに cons-stream が実装できないといけない
- - これは特殊形式を追加できるプログラミング言語でないと書けない、マクロが書けないと詰んでしまう
-
- 正直なところ全て些細な問題なのですが、他のプログラミング言語で SICP を読もうとした場合に障壁となるので素直に Scheme を使った方が良いです。
-
-** エディタについて
- pair と末尾呼び出しの最適化と =cons-stream= を除けば SICP では Scheme 特有の特殊な仕組みを必要としません。
- よって SICP で解説されるほとんどの言語機能は現代の他のプログラミング言語にもあるものが多く、そこで躓くことはないと思います。
- (とくに Ruby や JavaScript といったプログラミング言語を使ったことがあれば、新しいものはほとんどないはずです)
-
- ただし、Scheme というか Lisp の構文は他のプログラミング言語と大きく異なっているので注意が必要です。
- とくにインデントのルールが特殊でエディタの支援なしに正しくインデントをすることは困難です。
-
- よって、Scheme のインデントが正しくできるエディタを使用することを強く推奨します。
-
-*** 私が推奨するエディタ
-**** Emacs
-
- 個人的には Emacs の使用を強く推奨します。
- Emacs を使用している Schemer が多いので Emacs で Scheme を使うための環境構築をするためのドキュメントがたくさん存在しています。
- また、私は Emacs で Scheme をよく書いているので、何か問題が生じてもすぐに対応できる可能性が高いです。
-
-**** DrRacket
-
- Emacs を使用しない場合は DrRacket がおすすめです。
- DrRacket を使うと実質的に選択できる Scheme の処理系が Racket に絞られてしまうのが難点なのですが SICP を読む限りは大きな問題にはならないです。
-
- ただし、Racket の標準の言語(=#lang racket=)では =set-car!=, =set-cdr!= が存在していないので普通に使うと第3章で詰みます。
- =#lang r5rs= とするか DrRacket の設定を変更して標準の Scheme を使用するように変更する必要があります。
- また、Racket には sicp 専用のモードがあるようなのでそちらを使用してもいいかもしれません。
-
-*** 推奨していいのかよく分かっていないエディタ
-
-**** Vim
-
- 軽く調べた感じ Vim でも Lisp のプログラムが書けるようです。
- =if= のインデントが Scheme の一般的なスタイルとは違ったので、 =lispwords= 変数から =if= は取り除いた方がいいかもしれません。
-
- また、Vim から REPL を起動できるのかといったことについては良く分かっていないので、Vim を使う場合は自己責任でお願いします。
-
-*** 非推奨なエディタ
-
-**** Visual Studio Code
-
- Scheme のコードをハイライトするプラグインを見つけることはできたのですが、
- 正しくインデントするためのプラグインを見つけることができませんでした(良いプラグインを知っている方がいたら教えて欲しいです。Twitter の tojoqk にリプライか DM もしくはメールで連絡をお願いいたします)。
-
- 次の章で説明しますが、正しく自動でインデントができないと Scheme のプログラムを書くのはかなり厳しいのでインデントの問題が解決しない限りは諦めて欲しいです……。
-
-** 初めて Scheme を書く人が遭遇するエラーと対処法
-
- 他に何か思いついたら追記していきます。
-
-*** 括弧の対応を間違えてしまう
-
- Scheme のコードで =(f a b c)= というような式が現われた場合、
- 基本的には =f= が手続きであれば =a=, =b=, =c= を渡して =f= を呼びだすという意味で、
- =f= が特殊形式であれば =(f a b c)= が =f= 特有のルールで評価されます。
-
- これだけであれば簡単なのですが例外があって =let= や =cond= のような特殊形式の中では括弧をグルーピングのために使用しています。
- グルーピングのために使用された括弧の中で手続きを呼び出すような場合には括弧をたくさん書く必要があり、ここで括弧の対応を誤ってしまうという問題が発生しがちです。
-
- たとえば下記のように =let= の中で括弧の対応を誤ってしまう場合があります(ここでは =let= についての説明はしません)
-
- #+BEGIN_SRC
- (let ((a (+ 1 2)
- (b (+ 3 4))))
- (+ a b))
- #+END_SRC
-
- これを Scheme に解釈させると、 =let= の構文エラーになるのですが、
- ぱっと見ただけではどこがおかしいのかを判断するのは困難です。
- Scheme 側も =let= の中でどういった構文エラーが発生しているかまでは伝えることができるのですが、
- 具体的にどう直せばよいのかまでは教えてくれません。
- よって正しい対処法を知らないとこのような些細なミスで多くの時間を浪費してしまいます。
-
- こういった場合にはエディタの機能で *let 式全体を再インデント* することによってエラーの箇所を特定することができます。
- 今回のコードを再インデントをすると下記のような状態になります。
-
- #+BEGIN_SRC
- (let ((a (+ 1 2)
- (b (+ 3 4))))
- (+ a b))
- #+END_SRC
-
- =(b (+ 3 4))= が右にずれてしまいました。
- これは =(a (+ 1 2))= しないといけないのに最後の閉じ括弧を書き忘れてしまっていることが原因です。
-
- このように、エディタの *自動インデント機能は重要* です。
- 括弧の対応に関するエラーはほとんど自動インデントで撲滅できるのでうまく活用してください。
-
- これさえ気をつければ、「Scheme には括弧がいっぱいあって大変」ということはないので安心してプログラムを書くことができます。
diff --git a/posts/contact.md b/posts/contact.md
new file mode 100644
index 0000000..d465da6
--- /dev/null
+++ b/posts/contact.md
@@ -0,0 +1,59 @@
+title: 連絡先
+id: contact
+date: 2020-02-19 00:00
+updated: 2020-05-08 07:55
+description: 問い合わせページ
+---
+
+## メールによる連絡
+
+<masaya@tojo.tokyo> にメールを送ってください。
+現状、インターネットを使用した連絡手段としては最も優れた方法であると考えています。
+
+### 秘密のメッセージを送信したい場合
+
+他の人に見られたくないメッセージを送りたい場合は 下記の公開鍵を使用して暗号化して送信してください。
+(更新し忘れそうなので、もしも有効期限が切れていたら教えてください……)
+
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
+
+ mQENBF5aSDEBCACc0PNeutt4CtkrSeno2xxk8RArchxUNtvZT50f/Zy+ocAXpBWZ
+ /P0FWqDjquYCrXf25QS3FJ6fZMcxFfsnO5DlL8v0L1bWf8QQyF25q0lwy1DO0bdx
+ To2BOzv9cN/eAiRjN0BM/Rqh29HxeiFCFGgOlrFllsRMzAv5melB1WJMml0LktSD
+ aGZFUrmo/mAnGNxnD5w0cAJBU4DHLds9pdRHZTQE4hBoXhcFDu6uo8Lz/lotUaNj
+ Kjwq2adEvZR1Ds8OaFDuyl5hIK2wTXSzN/1HvVGrDrsQ7JZclJvdHXytpoybXhji
+ AwARdyhToMATzcLdV4lo/8/u+zU+KmjR5RU7ABEBAAG0H01hc2F5YSBUb2pvIDxt
+ YXNheWFAdG9qby50b2t5bz6JAVQEEwEIAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwEC
+ HgECF4AWIQTHasfHf/RvbkLC2TVFqkJkcjdWHgUCXrSPIAUJBByt7wAKCRBFqkJk
+ cjdWHqMRB/9+4xcsSCR0DOq61T64OP/RGB4tMsqPbMFllKIhICAvhOIerAoIQsQX
+ J0u0Uj2yH04LJA4Thnu1XbNs71dZKDKCynJZfenlyk5Z/fZRKmgGT8qP7Q+5n16G
+ aM75UPAoPzDxuwsst95BlXFFzcMYLkmGB8hxztRLVSfnSM2OPcoM6BBlhIgeujW1
+ PVtohgZg5zdYLDRpVQw38Kr1r4KVX1DOZJJxjBx4O4xWy9/sj0LE7N+2qhq//mn8
+ 1iaFuJIB/IkjBme4H2rCIh/Tn6RzXoGC63mRM6eyPVdXqnEPbPnqfjPPz4tRhC9E
+ 0yx6iApysBAjEP/EolHZZBJJsjEldyAHuQENBF5aSDEBCAC1mwoJO/fMRqL6Ay5i
+ mCQOZ65KC82beG7S2yJySEdBPsVaAmyCNtgKmTneb4F4xyhh2hoJkp5t/DvEcWIK
+ p6+YcurbcTFaa/Jd77CO3T9tFx58reVPJrZkRbDMOSvqbnh67c6vG+A6Tu+Gikep
+ NojIKqpg0A6L7kaRDxuyes4OkB2RPJ1IkIh6PUI1d3KHtty+QyMxUDgoz55tbo/O
+ ZaFpncoPFNHeRs4yAXEVoLWHwPbWxOXl8uZGTj+198tDJ0ogxH5jz2lzZbO1vYam
+ Y0t+3hjHe918vA0Vfs1rVjTyP1xcY/QiGcbf/ebTesxliuSVXaMr5U0ezokwjzzl
+ 0rSVABEBAAGJATwEGAEIACYCGwwWIQTHasfHf/RvbkLC2TVFqkJkcjdWHgUCXrSP
+ QQUJBByuEAAKCRBFqkJkcjdWHtuCCACCLJKcYObemhsYUPr/kx8TJhZaze5qP/Ee
+ U5sJ1GcmUZhzuhtl9DT7UBWXoYMhELAqJgAmdV8G5ClCblee4Bf1lpKXvbOfb8U2
+ NT6Z9akthcNRFVzZquUHDemf9Kla9M9WzfXiJvm8mT5Lx7mt4FjKINXMw+/xPcYN
+ kA5fmrtYWcRJdnl95L/1XnxPndZUkddWBnzJFB1TD0PzCNbMTiZ2+VfslwamOgKR
+ ARu/Do7FriLk0zUBfteB1JSr1Ef/yvoAl06L44p/wB4yExvVCGxXnaGK1HL6YKYa
+ McpBRBbyU4/V4hQAVBmedeZU5obcgFas3uwgNILEbl2gIMmEq5wF
+ =XnQ2
+ -----END PGP PUBLIC KEY BLOCK-----
+
+公開鍵は [鍵サーバー](http://keys.gnupg.net/) にも登録されています。
+
+## SNS による連絡
+
+### Mastodon (おすすめ\!)
+
+[TojoQK](https://mastodon.tojo.tokyo/@tojoqk) へのメンションか、DM で連絡してください。
+
+### Twitter
+
+[TojoQK](https://twitter.com/tojoqk) への replay か DM で連絡することができます。
diff --git a/posts/contact.org b/posts/contact.org
deleted file mode 100644
index 21cd7fa..0000000
--- a/posts/contact.org
+++ /dev/null
@@ -1,60 +0,0 @@
-title: 連絡先
-id: contact
-date: 2020-02-19 00:00
-updated: 2020-05-08 07:55
-description: 問い合わせページ
----
-#+OPTIONS: todo:nil
-
-** メールによる連絡
- [[mailto:masaya@tojo.tokyo][masaya@tojo.tokyo]] にメールを送ってください。
- 現状、インターネットを使用した連絡手段としては最も優れた方法であると考えています。
-
-*** TODO 秘密のメッセージを送信したい場合
- DEADLINE: <2020-05-07 Thu>
-
- 他の人に見られたくないメッセージを送りたい場合は
- 下記の公開鍵を使用して暗号化して送信してください。
- (更新し忘れそうなので、もしも有効期限が切れていたら教えてください……)
-
- #+BEGIN_SRC
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-mQENBF5aSDEBCACc0PNeutt4CtkrSeno2xxk8RArchxUNtvZT50f/Zy+ocAXpBWZ
-/P0FWqDjquYCrXf25QS3FJ6fZMcxFfsnO5DlL8v0L1bWf8QQyF25q0lwy1DO0bdx
-To2BOzv9cN/eAiRjN0BM/Rqh29HxeiFCFGgOlrFllsRMzAv5melB1WJMml0LktSD
-aGZFUrmo/mAnGNxnD5w0cAJBU4DHLds9pdRHZTQE4hBoXhcFDu6uo8Lz/lotUaNj
-Kjwq2adEvZR1Ds8OaFDuyl5hIK2wTXSzN/1HvVGrDrsQ7JZclJvdHXytpoybXhji
-AwARdyhToMATzcLdV4lo/8/u+zU+KmjR5RU7ABEBAAG0H01hc2F5YSBUb2pvIDxt
-YXNheWFAdG9qby50b2t5bz6JAVQEEwEIAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwEC
-HgECF4AWIQTHasfHf/RvbkLC2TVFqkJkcjdWHgUCXrSPIAUJBByt7wAKCRBFqkJk
-cjdWHqMRB/9+4xcsSCR0DOq61T64OP/RGB4tMsqPbMFllKIhICAvhOIerAoIQsQX
-J0u0Uj2yH04LJA4Thnu1XbNs71dZKDKCynJZfenlyk5Z/fZRKmgGT8qP7Q+5n16G
-aM75UPAoPzDxuwsst95BlXFFzcMYLkmGB8hxztRLVSfnSM2OPcoM6BBlhIgeujW1
-PVtohgZg5zdYLDRpVQw38Kr1r4KVX1DOZJJxjBx4O4xWy9/sj0LE7N+2qhq//mn8
-1iaFuJIB/IkjBme4H2rCIh/Tn6RzXoGC63mRM6eyPVdXqnEPbPnqfjPPz4tRhC9E
-0yx6iApysBAjEP/EolHZZBJJsjEldyAHuQENBF5aSDEBCAC1mwoJO/fMRqL6Ay5i
-mCQOZ65KC82beG7S2yJySEdBPsVaAmyCNtgKmTneb4F4xyhh2hoJkp5t/DvEcWIK
-p6+YcurbcTFaa/Jd77CO3T9tFx58reVPJrZkRbDMOSvqbnh67c6vG+A6Tu+Gikep
-NojIKqpg0A6L7kaRDxuyes4OkB2RPJ1IkIh6PUI1d3KHtty+QyMxUDgoz55tbo/O
-ZaFpncoPFNHeRs4yAXEVoLWHwPbWxOXl8uZGTj+198tDJ0ogxH5jz2lzZbO1vYam
-Y0t+3hjHe918vA0Vfs1rVjTyP1xcY/QiGcbf/ebTesxliuSVXaMr5U0ezokwjzzl
-0rSVABEBAAGJATwEGAEIACYCGwwWIQTHasfHf/RvbkLC2TVFqkJkcjdWHgUCXrSP
-QQUJBByuEAAKCRBFqkJkcjdWHtuCCACCLJKcYObemhsYUPr/kx8TJhZaze5qP/Ee
-U5sJ1GcmUZhzuhtl9DT7UBWXoYMhELAqJgAmdV8G5ClCblee4Bf1lpKXvbOfb8U2
-NT6Z9akthcNRFVzZquUHDemf9Kla9M9WzfXiJvm8mT5Lx7mt4FjKINXMw+/xPcYN
-kA5fmrtYWcRJdnl95L/1XnxPndZUkddWBnzJFB1TD0PzCNbMTiZ2+VfslwamOgKR
-ARu/Do7FriLk0zUBfteB1JSr1Ef/yvoAl06L44p/wB4yExvVCGxXnaGK1HL6YKYa
-McpBRBbyU4/V4hQAVBmedeZU5obcgFas3uwgNILEbl2gIMmEq5wF
-=XnQ2
------END PGP PUBLIC KEY BLOCK-----
- #+END_SRC
-
- 公開鍵は [[http://keys.gnupg.net/][鍵サーバー]] にも登録されています。
-
-** SNS による連絡
-*** Mastodon (おすすめ!)
- [[https://mastodon.tojo.tokyo/@tojoqk][TojoQK]] へのメンションか、DM で連絡してください。
-
-*** Twitter
- [[https://twitter.com/tojoqk][TojoQK]] への replay か DM で連絡することができます。
diff --git a/posts/freedom-for-yourself.md b/posts/freedom-for-yourself.md
new file mode 100644
index 0000000..efdaaed
--- /dev/null
+++ b/posts/freedom-for-yourself.md
@@ -0,0 +1,148 @@
+title: 開発者による支配から身を守るために自由ソフトウェアを使いましょう
+id: freedom-for-yourself
+date: 2020-06-17 10:10
+updated: 2020-10-26 00:20
+description: 自由ソフトウェアの使用を推奨するための非エンジニア向けの文書
+---
+
+自由ソフトウェアの使用を推奨するための非エンジニア向けの文書です。
+
+## 自由ソフトウェアとは何か
+
+自由ソフトウェアは [Free Software Foundation](https://www.fsf.org/)
+が定義している用語で下記のように定義されています。
+
+> あるプログラムが自由ソフトウェアであるとは、そのプログラムの利用者が、以下の四つの必須の自由を有するときです:
+>
+> - どんな目的に対しても、プログラムを望むままに実行する自由(第零の自由)。
+> - プログラムがどのように動作しているか研究し、必要に応じて改造する自由(第一の自由)。ソースコードへのアクセスは、この前提条件となります。
+> - ほかの人を助けられるよう、コピーを再配布する自由(第二の自由)。
+> - 改変した版を他に配布する自由(第三の自由)。これにより、変更がコミュニティ全体にとって利益となる機会を提供できます。ソースコードへのアクセスは、この前提条件となります。
+>
+> <https://www.gnu.org/philosophy/free-sw.ja.html> から引用
+
+私はこの自由ソフトウェアを使用することを強く推奨します。
+この四つの自由のうち一つでも欠いてしまっている不自由なソフトウェアには致命的な欠陥があると考えているからです。
+
+## 不自由なソフトウェアによる利用者の支配
+
+不自由なソフトウェアの何が問題かといういうと、 ソフトウェアの開発者に利用者が支配されるからです。
+多くの人々はソフトウェアの利用者です、今日において何らかのソフトウェアの利用者でない人はほとんどいません。
+不自由なソフトウェアを選択してしまうと、あなたはそのソフトウェアの開発者に支配されてしまいます。 どうしてでしょうか?
+ソフトウェア開発者による利用者の支配とはどのようなものなのでしょうか?
+
+では不自由なソフトウェアだとどうして開発者に支配されてしまうのか、 自由ソフトウェアの定義に戻って確認してみましょう。
+
+### 第零の自由「どんな目的に対しても、プログラムを望むままに実行する自由」の不足
+
+まず、第零の自由すなわち「どんな目的に対しても、プログラムを望むままに実行する自由」についてですが、
+この自由のないソフトウェアというのは、「こういう使い方をするときだけ使ってもいいですよ」とソフトウェアの作者が使用するための条件を指定していることを意味しています。
+そのようなソフトウェアは、データとしてあなたが保有していたとしても実際にはあなたの物ではありません。
+あなたがソフトウェアの開発者が想像していなかった新しい使用方法を思いついたとしてもそれを試すことはできないのです。
+これは、分かりやすい開発者によるソフトウェアによる支配のパターンですね。
+
+### 第一の自由「プログラムがどのように動作しているか研究し、必要に応じて改造する自由」の不足
+
+しかし、どんな目的のためにソフトウェアを実行しても良いだけでは自由ソフトウェアとは呼べないことに注意してください。
+次の第一の自由、「プログラムがどのように動作しているか研究し、必要に応じて改造する自由」も重要です。
+あなたが利用しているソフトウェアに何らかの不備があったとしましょう。
+あなたはそのソフトウェアの問題を自分で直す、もしくは誰かに直して欲しいと依頼したいと思うかもしれません。
+この第一の自由のない不自由なソフトウェアの場合、そのソフトウェアを修正できるのは著作権を持つソフトウェアの開発者だけです。
+あなたがいくら直して欲しいと思っても、ソフトウェアの開発者が拒否すればそれは叶いません。
+目の前で起きている不具合をあなたは直すことができないし、誰にも修正を依頼できないのです。
+
+### 第二の自由「ほかの人を助けられるよう、コピーを再配布する自由」の不足
+
+では、第二の自由は何を言っているのでしょうか? 第二の自由は「ほかの人を助けられるよう、コピーを再配布する自由」ですが、これも重要です。
+ソフトウェアはコンピュータで何らかの問題を解決したり生産性を改善するのに使われます。
+たとえば、あなたの友人が自分の保有しているソフトウェアを使って解決できる問題で悩んでいたとします。
+このとき自分の持っているソフトウェアをコピーして友人に渡せば助けることができるわけですが、 第二の自由のないソフトウェアでは許されません。
+ソフトウェア開発者が指定した方法でしか、そのソフトウェアを入手することができないのです。
+これもまたソフトウェア開発者によるソフトウェアの所有者への支配なのです。
+一点補足すると、自由ソフトウェアではコピーを渡す際に対価としてお金を要求しても問題ありません。
+
+### 第三の自由「改変した版を他に配布する自由」の不足
+
+最後に第三の自由である「改変した版を他に配布する自由」についてですが、
+これは第一の自由によって、ソフトウェアの問題を直したりより良くするために改造したソフトウェアを他の人に配るための自由です。
+この第三の自由がないソフトウェアでは、
+プログラムの問題を修正したり改善したりしてもそのソフトウェアを使うことができるのは自分だけになってしまいます。
+既に解決した問題で悩んでいる人を見つけても、ソフトウェアを渡すことはできなくなってしまいます。
+また重要なことなのですが、自由ソフトウェアでは対価として改変したバージョンを渡す際にお金を要求しても問題ありません。
+この自由のおかげで、ソフトウェアに関する問題を直した人に対価としてお金を渡すことができます。
+
+## 不自由なソフトウェアの何が問題か
+
+不自由のソフトウェアを使用すると開発者に支配されてしまうこと自体については納得してもらえたと思うので、
+次にそれがどうして問題なのか考えてみましょう。
+
+不自由なソフトウェアの問題は他のものに喩えられて反論されることがしばしばあります。 過去に私が返答に困った例として料理があります。
+「料理のレシピはソフトウェアにとってのソースコードのようなものだ、自身の利益を守るために飲食店に料理を食べに来た客にレシピを秘匿するのは正当なことではないか」
+というものです。
+料理の場合でも食の安全を守るといった観点から、客が料理の工程を知ることができるという点で自由な料理にはそこそこの価値があるとは思うのですが、
+少なくとも私は自身の利益を守るためにレシピを秘匿することに対して大きな問題があるとは考えてはいません。
+
+そもそもソフトウェアを料理に喩えるべきではありません。 利用のされかたが全く異なるからです。 完成した料理の主な機能は味わって食べることです。
+それによって元気になったり、自分の体に合わなくて逆に気分が悪くなったりすることまで考慮すると、
+基本的には完成した料理を一度食べたことによる影響は数時間から数日に及ぶものだと考えて問題ないはずです。
+もしも料理がおいしくて仕方がないのであれば、特定の飲食店に通いつづけるでしょう。
+それは飲食店に支配されているようにも見えますが、そのこと自体が成果物である料理に問題がないことを意味しています。
+
+それに対して、ソフトウェアは何らかの作業をするための道具として使用されます。
+どのようなソフトウェアであっても、利用者はソフトウェアの使い方を学び、操作に慣れる必要があります。
+一度特定のソフトウェアに慣れてしまえば、同じことをするために別のソフトウェアを使用するのに苦痛を伴います。
+使用しているソフトウェアの特定の機能に依存して仕事をするようになったら、
+その機能のない別のソフトウェアを使用して仕事をすることはできなくなります。 そうやって依存したソフトウェアが不自由だったら最悪です。
+仕事に依存したソフトウェアに対して不備の修正や改善を実施しようと考えても、
+不自由なソフトウェアであれば開発者が許さない限りは修正も改善も行なわれません。
+不自由なソフトウェアによる開発者からユーザーへの支配はこのようにして成立するのです。
+
+不自由なソフトウェアを別のもので喩えるなら料理よりも家の方が適切で、ソフトウェアを選択して使うようになることは家を選んでそこに住むのと同じようなことです。
+**不自由なソフトウェアを使用することは家を建築した業者に点検や修理をする権利が独占された家に住むことと同義** です。
+家の所有者は別の業者に家の点検や修理を依頼をすることができず、
+点検や修理をする技術を持っていても家が不自由であるために自分自身では何もできません。
+場合によっては家に誰を住ませるかを決める自由(第零の自由)すらないかもしれません。
+
+このような家に住みたいと思いますか?
+
+## 自由ソフトウェアを使って支配から逃れましょう
+
+現在、スマートフォンやタブレットの使用が盛んになっていますが、不幸なことにこれらのデバイスで不自由なソフトウェアによる支配から逃れるのは極めて難しいという現実があります。
+自由なOSを搭載したスマートフォンやタブレットを入手することは現在の日本では大変困難です。 この状況は改善しなければなりません。
+
+しかし、パソコンの状況はスマホやタブレットとは違います。 実は多くの道徳的なソフトウェア開発者によって自由ソフトウェアが開発されています。
+パソコンの OS には [GNU システム](https://www.gnu.org/gnu/gnu.ja.html) の一つである
+[GNU/Linux](https://www.gnu.org/distros/free-distros.ja.html) という自由な OS
+を使用することをおすすめします。
+
+特に [GNU が推奨する自由な GNU/Linux
+ディストリビューション](https://www.gnu.org/distros/free-distros.ja.html)
+には一切不自由なソフトウェアが含まれていません\[1\]。 これらの OS
+が提供しているパッケージシステムを利用している限りは、不自由なソフトウェアが意図せずに入り込んでしまう危険が全くないので安全です。
+このなかでは [Trisquel](https://trisquel.info/) という OS
+がユーザーフレンドリらしいのでおすすめです\[2\]。
+
+プログラムを書くのが好きな方には [Guix System](https://guix.gnu.org/) という OS をおすすめします。
+ソフトウェアのパッケージシステムやシステムの定義のために [Guile
+Scheme](https://www.gnu.org/software/guile/) の API が提供されていて、
+自由にカスタマイズや拡張ができるようになっています。
+
+### Android のスマートフォンやタブレットを使用している場合
+
+[F-Droid](https://www.f-droid.org/)
+という自由かつオープンなソフトウェア(FOSS)のみ扱っているアプリケーションストアがあり、
+これを使うと簡単に自由ソフトウェアを探してインストールをしたりソフトウェアの更新をしたりできます。 Android
+では自由ソフトウェアの開発が活発で、日常生活に必要なアプリが既に揃っているので
+Google Play ではなく [F-Droid](https://f-droid.org/) を優先して使うことをおすすめします。
+
+# 注釈
+
+1. 完全に自由な OS には 不自由なファームウェアが一切含まれていないことに注意してください。
+ 現在の日本では自由ソフトウェアで動作する無線LANの子機を手に入れるのが困難な状態になっていて、
+ 事実上 Wi-Fi を使用した通信は不可能です。
+ 古いものであれば動く可能性があり、昔使っていたテレビやPCのための無線LAN子機が箪笥の奥に眠っているという場合には動作するか試す価値があると思います。
+ (どうしても受容できない場合は [Debian](https://www.debian.org/intro/about.ja.html)
+ のような不自由なファームウェアが動作する GNU/Linux の OS を使うのも良いかもしれません、
+ しかしそれは自由ソフトウェアを社会に広めるという観点からみると、現状の維持を肯定し改善の流れを止める行為であるということを認識しておく必要があります)
+
+2. 筆者は別のOSを使用していてまだ試せていません……
diff --git a/posts/freedom-for-yourself.org b/posts/freedom-for-yourself.org
deleted file mode 100644
index 9bf38da..0000000
--- a/posts/freedom-for-yourself.org
+++ /dev/null
@@ -1,152 +0,0 @@
-title: 開発者による支配から身を守るために自由ソフトウェアを使いましょう
-id: freedom-for-yourself
-date: 2020-06-17 10:10
-updated: 2020-10-26 00:20
-description: 自由ソフトウェアの使用を推奨するための非エンジニア向けの文書
----
-#+OPTIONS: todo:nil
-
-自由ソフトウェアの使用を推奨するための非エンジニア向けの文書です。
-
-** 自由ソフトウェアとは何か
-
- 自由ソフトウェアは [[https://www.fsf.org/][Free Software Foundation]] が定義している用語で下記のように定義されています。
-
- #+BEGIN_QUOTE
- あるプログラムが自由ソフトウェアであるとは、そのプログラムの利用者が、以下の四つの必須の自由を有するときです:
-
- - どんな目的に対しても、プログラムを望むままに実行する自由(第零の自由)。
- - プログラムがどのように動作しているか研究し、必要に応じて改造する自由(第一の自由)。ソースコードへのアクセスは、この前提条件となります。
- - ほかの人を助けられるよう、コピーを再配布する自由(第二の自由)。
- - 改変した版を他に配布する自由(第三の自由)。これにより、変更がコミュニティ全体にとって利益となる機会を提供できます。ソースコードへのアクセスは、この前提条件となります。
-
- https://www.gnu.org/philosophy/free-sw.ja.html から引用
- #+END_QUOTE
-
- 私はこの自由ソフトウェアを使用することを強く推奨します。
- この四つの自由のうち一つでも欠いてしまっている不自由なソフトウェアには致命的な欠陥があると考えているからです。
-
-** 不自由なソフトウェアによる利用者の支配
-
- 不自由なソフトウェアの何が問題かといういうと、
- ソフトウェアの開発者に利用者が支配されるからです。
- 多くの人々はソフトウェアの利用者です、今日において何らかのソフトウェアの利用者でない人はほとんどいません。
- 不自由なソフトウェアを選択してしまうと、あなたはそのソフトウェアの開発者に支配されてしまいます。
- どうしてでしょうか?
- ソフトウェア開発者による利用者の支配とはどのようなものなのでしょうか?
-
- では不自由なソフトウェアだとどうして開発者に支配されてしまうのか、
- 自由ソフトウェアの定義に戻って確認してみましょう。
-
-*** 第零の自由「どんな目的に対しても、プログラムを望むままに実行する自由」の不足
-
- まず、第零の自由すなわち「どんな目的に対しても、プログラムを望むままに実行する自由」についてですが、
- この自由のないソフトウェアというのは、「こういう使い方をするときだけ使ってもいいですよ」とソフトウェアの作者が使用するための条件を指定していることを意味しています。
- そのようなソフトウェアは、データとしてあなたが保有していたとしても実際にはあなたの物ではありません。
- あなたがソフトウェアの開発者が想像していなかった新しい使用方法を思いついたとしてもそれを試すことはできないのです。
- これは、分かりやすい開発者によるソフトウェアによる支配のパターンですね。
-
-*** 第一の自由「プログラムがどのように動作しているか研究し、必要に応じて改造する自由」の不足
-
- しかし、どんな目的のためにソフトウェアを実行しても良いだけでは自由ソフトウェアとは呼べないことに注意してください。
- 次の第一の自由、「プログラムがどのように動作しているか研究し、必要に応じて改造する自由」も重要です。
- あなたが利用しているソフトウェアに何らかの不備があったとしましょう。
- あなたはそのソフトウェアの問題を自分で直す、もしくは誰かに直して欲しいと依頼したいと思うかもしれません。
- この第一の自由のない不自由なソフトウェアの場合、そのソフトウェアを修正できるのは著作権を持つソフトウェアの開発者だけです。
- あなたがいくら直して欲しいと思っても、ソフトウェアの開発者が拒否すればそれは叶いません。
- 目の前で起きている不具合をあなたは直すことができないし、誰にも修正を依頼できないのです。
-
-*** 第二の自由「ほかの人を助けられるよう、コピーを再配布する自由」の不足
-
- では、第二の自由は何を言っているのでしょうか?
- 第二の自由は「ほかの人を助けられるよう、コピーを再配布する自由」ですが、これも重要です。
- ソフトウェアはコンピュータで何らかの問題を解決したり生産性を改善するのに使われます。
- たとえば、あなたの友人が自分の保有しているソフトウェアを使って解決できる問題で悩んでいたとします。
- このとき自分の持っているソフトウェアをコピーして友人に渡せば助けることができるわけですが、
- 第二の自由のないソフトウェアでは許されません。
- ソフトウェア開発者が指定した方法でしか、そのソフトウェアを入手することができないのです。
- これもまたソフトウェア開発者によるソフトウェアの所有者への支配なのです。
- 一点補足すると、自由ソフトウェアではコピーを渡す際に対価としてお金を要求しても問題ありません。
-
-*** 第三の自由「改変した版を他に配布する自由」の不足
-
- 最後に第三の自由である「改変した版を他に配布する自由」についてですが、
- これは第一の自由によって、ソフトウェアの問題を直したりより良くするために改造したソフトウェアを他の人に配るための自由です。
- この第三の自由がないソフトウェアでは、
- プログラムの問題を修正したり改善したりしてもそのソフトウェアを使うことができるのは自分だけになってしまいます。
- 既に解決した問題で悩んでいる人を見つけても、ソフトウェアを渡すことはできなくなってしまいます。
- また重要なことなのですが、自由ソフトウェアでは対価として改変したバージョンを渡す際にお金を要求しても問題ありません。
- この自由のおかげで、ソフトウェアに関する問題を直した人に対価としてお金を渡すことができます。
-
-** 不自由なソフトウェアの何が問題か
-
- 不自由のソフトウェアを使用すると開発者に支配されてしまうこと自体については納得してもらえたと思うので、
- 次にそれがどうして問題なのか考えてみましょう。
-
- 不自由なソフトウェアの問題は他のものに喩えられて反論されることがしばしばあります。
- 過去に私が返答に困った例として料理があります。
- 「料理のレシピはソフトウェアにとってのソースコードのようなものだ、自身の利益を守るために飲食店に料理を食べに来た客にレシピを秘匿するのは正当なことではないか」
- というものです。
- 料理の場合でも食の安全を守るといった観点から、客が料理の工程を知ることができるという点で自由な料理にはそこそこの価値があるとは思うのですが、
- 少なくとも私は自身の利益を守るためにレシピを秘匿することに対して大きな問題があるとは考えてはいません。
-
- そもそもソフトウェアを料理に喩えるべきではありません。
- 利用のされかたが全く異なるからです。
- 完成した料理の主な機能は味わって食べることです。
- それによって元気になったり、自分の体に合わなくて逆に気分が悪くなったりすることまで考慮すると、
- 基本的には完成した料理を一度食べたことによる影響は数時間から数日に及ぶものだと考えて問題ないはずです。
- もしも料理がおいしくて仕方がないのであれば、特定の飲食店に通いつづけるでしょう。
- それは飲食店に支配されているようにも見えますが、そのこと自体が成果物である料理に問題がないことを意味しています。
-
- それに対して、ソフトウェアは何らかの作業をするための道具として使用されます。
- どのようなソフトウェアであっても、利用者はソフトウェアの使い方を学び、操作に慣れる必要があります。
- 一度特定のソフトウェアに慣れてしまえば、同じことをするために別のソフトウェアを使用するのに苦痛を伴います。
- 使用しているソフトウェアの特定の機能に依存して仕事をするようになったら、
- その機能のない別のソフトウェアを使用して仕事をすることはできなくなります。
- そうやって依存したソフトウェアが不自由だったら最悪です。
- 仕事に依存したソフトウェアに対して不備の修正や改善を実施しようと考えても、
- 不自由なソフトウェアであれば開発者が許さない限りは修正も改善も行なわれません。
- 不自由なソフトウェアによる開発者からユーザーへの支配はこのようにして成立するのです。
-
- 不自由なソフトウェアを別のもので喩えるなら料理よりも家の方が適切で、ソフトウェアを選択して使うようになることは家を選んでそこに住むのと同じようなことです。
- *不自由なソフトウェアを使用することは家を建築した業者に点検や修理をする権利が独占された家に住むことと同義* です。
- 家の所有者は別の業者に家の点検や修理を依頼をすることができず、
- 点検や修理をする技術を持っていても家が不自由であるために自分自身では何もできません。
- 場合によっては家に誰を住ませるかを決める自由(第零の自由)すらないかもしれません。
-
- このような家に住みたいと思いますか?
-
-** 自由ソフトウェアを使って支配から逃れましょう
-
- 現在、スマートフォンやタブレットの使用が盛んになっていますが、不幸なことにこれらのデバイスで不自由なソフトウェアによる支配から逃れるのは極めて難しいという現実があります。
- 自由なOSを搭載したスマートフォンやタブレットを入手することは現在の日本では大変困難です。
- この状況は改善しなければなりません。
-
- しかし、パソコンの状況はスマホやタブレットとは違います。
- 実は多くの道徳的なソフトウェア開発者によって自由ソフトウェアが開発されています。
- パソコンの OS には [[https://www.gnu.org/gnu/gnu.ja.html][GNU システム]] の一つである [[https://www.gnu.org/distros/free-distros.ja.html][GNU/Linux]] という自由な OS を使用することをおすすめします。
-
- 特に [[https://www.gnu.org/distros/free-distros.ja.html][GNU が推奨する自由な GNU/Linux ディストリビューション]] には一切不自由なソフトウェアが含まれていません[fn:1]。
- これらの OS が提供しているパッケージシステムを利用している限りは、不自由なソフトウェアが意図せずに入り込んでしまう危険が全くないので安全です。
- このなかでは [[https://trisquel.info/][Trisquel]] という OS がユーザーフレンドリらしいのでおすすめです[fn:2]。
-
- プログラムを書くのが好きな方には [[https://guix.gnu.org/][Guix System]] という OS をおすすめします。
- ソフトウェアのパッケージシステムやシステムの定義のために [[https://www.gnu.org/software/guile/][Guile Scheme]] の API が提供されていて、
- 自由にカスタマイズや拡張ができるようになっています。
-
-*** Android のスマートフォンやタブレットを使用している場合
-
- [[https://www.f-droid.org/][F-Droid]] という自由かつオープンなソフトウェア(FOSS)のみ扱っているアプリケーションストアがあり、
- これを使うと簡単に自由ソフトウェアを探してインストールをしたりソフトウェアの更新をしたりできます。
- Android では自由ソフトウェアの開発が活発で、日常生活に必要なアプリが既に揃っているので
- Google Play ではなく [[https://f-droid.org/][F-Droid]] を優先して使うことをおすすめします。
-
-* 注釈
-
-[fn:1] 完全に自由な OS には 不自由なファームウェアが一切含まれていないことに注意してください。
-現在の日本では自由ソフトウェアで動作する無線LANの子機を手に入れるのが困難な状態になっていて、 事実上 Wi-Fi を使用した通信は不可能です。
-古いものであれば動く可能性があり、昔使っていたテレビやPCのための無線LAN子機が箪笥の奥に眠っているという場合には動作するか試す価値があると思います。
-(どうしても受容できない場合は [[https://www.debian.org/intro/about.ja.html][Debian]] のような不自由なファームウェアが動作する GNU/Linux の OS を使うのも良いかもしれません、
-しかしそれは自由ソフトウェアを社会に広めるという観点からみると、現状の維持を肯定し改善の流れを止める行為であるということを認識しておく必要があります)
-
-[fn:2] 筆者は別のOSを使用していてまだ試せていません……
diff --git a/posts/launch-nextcloud.md b/posts/launch-nextcloud.md
new file mode 100644
index 0000000..82a18bd
--- /dev/null
+++ b/posts/launch-nextcloud.md
@@ -0,0 +1,63 @@
+title: Nextcloud サーバーを構築しました
+id: launch-nextcloud
+date: 2020-08-05 06:30
+description: Nextcloud のサーバーの運用を始めた動機と構築方法について
+---
+
+最近、サーバーを運用することが多くなってきていて、現在個人で4つの公開サーバーを運用しています。
+少し前までは自分で公開サーバーを運用するとか絶対面倒だしリスクも負いたくないという考えでいましたが、
+短い期間で全く違った考えを持つようになりました。
+
+本記事では公開サーバーを運用するきっかけとなった、Nextcloud を始めた動機とその構築方法について紹介します。
+
+## 動機
+
+職場の Slack で「SICP勉強会やろうぜ」ってノリで発言したところ、
+思いのほか参加者が集まったので実際に勉強会が開催されることが決まりました。
+
+勉強会はリモートで開催するため、同一のファイルを共同編集するためのツールが必要になりました。 メンバーから
+[Scrapbox](https://scrapbox.io/) というサービスを使おうという提案があったので、
+実際に自分の登録して試してみることにしました。
+
+しかし、Scrapbox は 2020/06/12 の時点で、Google のアカウントを使用せずに会員登録する手段を有していませんでした。
+現在(2020/08/05)は Scrapbox Enterprize でのみメールアドレスの会員登録ができるようで、
+無料プランではいまだに Google のアカウントが必須のようです。
+
+私は宗教上の理由で Google のアカウントを一切使用することができないのでこれは致命的でした。 このままだと Google
+とは何ら関係のないサービスによって Google
+のアカウントを強制されるという心情的には最悪の結果になるので急いで代替案を考える必要がありました。
+
+そこで白羽の矢がたったのが Nextcloud です。 Nextcloud の
+[Text](https://github.com/nextcloud/text)
+アプリには共同編集の機能があるので、必要最低限の機能は有しています。
+これを提案したところ、メンバーに受け入れてもらえたのでこれをきっかけに Nextcloud 運用が始まりました。
+(関係者各位、私のわがままに付き合っていただき本当にありがとうございます)
+
+## 構築
+
+構築する動機が SICP 勉強会だけだったので、Nextcloud を構築すること自体には大したモチベーションはありませんでした。
+低いモチベーションにも関わらず、Nextcloud
+サーバーをすぐに構築できたのは、[Vultr](https://www.vultr.com/)
+の [One-Click Apps](https://www.vultr.com/features/one-click-apps/)
+という機能のおかげです。
+
+特定のアプリケーションを作成するだけであれば特に何も考えなくても構築することができます。 Vultr のアプリとして
+[Nextcloud](https://www.vultr.com/apps/nextcloud)
+も用意されていたので何も考えずにそれを利用して構築しました。
+その後サーバーに何をしたのかは忘れました(おい)、Firewall と
+[letsencrypt](https://letsencrypt.org/ja/) を使用して証明書を作成したくらいだと思います……。
+
+ただ、One-Click Apps は Vultr にアプリケーションを動かす環境を用意してもらう仕組で、Vultr
+を信頼する必要があってあんまり推奨はできないですね……。 思いのほか Nextcloud
+は私の生活を支える重要なサーバーになってしまったので、将来的には Guix のサーバーに引っ越して秘伝のタレのない状態で動かす予定です。
+8月の連休中にやりたい……。
+
+## その後
+
+実際に Nextcloud を使ってみると共有したファイルの共同編集だけでなく、 [RSS
+のリーダー(News)](https://apps.nextcloud.com/apps/news)、[メールクライアント(Mail)](https://apps.nextcloud.com/apps/mail)、[音楽再生(Music)](https://apps.nextcloud.com/apps/music)、[タスク管理(Tasks)](https://apps.nextcloud.com/apps/tasks)、[カレンダー](https://apps.nextcloud.com/apps/calendar)
+といった多様なアプリがあって、日常生活を送るのに欠かせないサーバーになってます。 いわゆる "Cloud"
+サービスでやりたいことは大抵できるし、企業が提供しているサービスより多機能です。
+Nextcloud は AGPL でライセンスされた自由ソフトウェアなので必要であれば自由に拡張できます。
+
+自分の情報を自分の責任の元で管理したいという方には Nextcloud はおすすめです。
diff --git a/posts/launch-nextcloud.org b/posts/launch-nextcloud.org
deleted file mode 100644
index 566ecba..0000000
--- a/posts/launch-nextcloud.org
+++ /dev/null
@@ -1,57 +0,0 @@
-title: Nextcloud サーバーを構築しました
-id: launch-nextcloud
-date: 2020-08-05 06:30
-description: Nextcloud のサーバーの運用を始めた動機と構築方法について
----
-#+OPTIONS: todo:nil
-
-最近、サーバーを運用することが多くなってきていて、現在個人で4つの公開サーバーを運用しています。
-少し前までは自分で公開サーバーを運用するとか絶対面倒だしリスクも負いたくないという考えでいましたが、
-短い期間で全く違った考えを持つようになりました。
-
-本記事では公開サーバーを運用するきっかけとなった、Nextcloud を始めた動機とその構築方法について紹介します。
-
-** 動機
-
- 職場の Slack で「SICP勉強会やろうぜ」ってノリで発言したところ、
- 思いのほか参加者が集まったので実際に勉強会が開催されることが決まりました。
-
- 勉強会はリモートで開催するため、同一のファイルを共同編集するためのツールが必要になりました。
- メンバーから [[https://scrapbox.io/][Scrapbox]] というサービスを使おうという提案があったので、
- 実際に自分の登録して試してみることにしました。
-
- しかし、Scrapbox は 2020/06/12 の時点で、Google のアカウントを使用せずに会員登録する手段を有していませんでした。
- 現在(2020/08/05)は Scrapbox Enterprize でのみメールアドレスの会員登録ができるようで、
- 無料プランではいまだに Google のアカウントが必須のようです。
-
- 私は宗教上の理由で Google のアカウントを一切使用することができないのでこれは致命的でした。
- このままだと Google とは何ら関係のないサービスによって Google
- のアカウントを強制されるという心情的には最悪の結果になるので急いで代替案を考える必要がありました。
-
- そこで白羽の矢がたったのが Nextcloud です。
- Nextcloud の [[https://github.com/nextcloud/text][Text]] アプリには共同編集の機能があるので、必要最低限の機能は有しています。
- これを提案したところ、メンバーに受け入れてもらえたのでこれをきっかけに Nextcloud 運用が始まりました。
- (関係者各位、私のわがままに付き合っていただき本当にありがとうございます)
-
-** 構築
-
- 構築する動機が SICP 勉強会だけだったので、Nextcloud を構築すること自体には大したモチベーションはありませんでした。
- 低いモチベーションにも関わらず、Nextcloud サーバーをすぐに構築できたのは、[[https://www.vultr.com/][Vultr]] の [[https://www.vultr.com/features/one-click-apps/][One-Click Apps]] という機能のおかげです。
-
- 特定のアプリケーションを作成するだけであれば特に何も考えなくても構築することができます。
- Vultr のアプリとして [[https://www.vultr.com/apps/nextcloud][Nextcloud]] も用意されていたので何も考えずにそれを利用して構築しました。
- その後サーバーに何をしたのかは忘れました(おい)、Firewall と [[https://letsencrypt.org/ja/][letsencrypt]] を使用して証明書を作成したくらいだと思います……。
-
- ただ、One-Click Apps は Vultr にアプリケーションを動かす環境を用意してもらう仕組で、Vultr を信頼する必要があってあんまり推奨はできないですね……。
- 思いのほか Nextcloud は私の生活を支える重要なサーバーになってしまったので、将来的には Guix のサーバーに引っ越して秘伝のタレのない状態で動かす予定です。
- 8月の連休中にやりたい……。
-
-** その後
-
- 実際に Nextcloud を使ってみると共有したファイルの共同編集だけでなく、
- [[https://apps.nextcloud.com/apps/news][RSS のリーダー(News)]]、[[https://apps.nextcloud.com/apps/mail][メールクライアント(Mail)]]、[[https://apps.nextcloud.com/apps/music][音楽再生(Music)]]、[[https://apps.nextcloud.com/apps/tasks][タスク管理(Tasks)]]、[[https://apps.nextcloud.com/apps/calendar][カレンダー]]
- といった多様なアプリがあって、日常生活を送るのに欠かせないサーバーになってます。
- いわゆる "Cloud" サービスでやりたいことは大抵できるし、企業が提供しているサービスより多機能です。
- Nextcloud は AGPL でライセンスされた自由ソフトウェアなので必要であれば自由に拡張できます。
-
- 自分の情報を自分の責任の元で管理したいという方には Nextcloud はおすすめです。
diff --git a/posts/redesign-www-tojo-tokyo.md b/posts/redesign-www-tojo-tokyo.md
new file mode 100644
index 0000000..8f7e571
--- /dev/null
+++ b/posts/redesign-www-tojo-tokyo.md
@@ -0,0 +1,54 @@
+title: ウェブサイトの見た目を改善しました
+id: redesign-www-tojo-tokyo
+date: 2020-05-08 06:45
+updated: 2020-05-08 12:51
+description: ダークテーマよりも普通の方がよかった
+---
+
+## ダークテーマよりも普通の方がよかった
+
+いままでこのウェブサイトはダークテーマを意識していて、黒い背景に白い文字を使用していました。 しかし、この Web で記事を閲覧するよりも
+GitLab で直接元の `org-mode` の文書を読んだ方が視認性が良いことにショックを受け、
+根本的に見た目を改善する必要があることに気づきました。
+
+ダークテーマはターミナルや Emacs で文書を書いているときには良いのですが、Web ではあまり良くないようです。 視認性の良い Web
+ページをダークテーマで作成するのは難しいと思います。
+
+基本的に配色のこだわりを捨てて Web ブラウザのデフォルトに任せることにしました。
+すると、悲しいことにその方がずっと見やすくてより良いものになりました……。
+
+## 文字を大きくしました
+
+このサイトの文字のサイズは小さすぎました。 全体的に文字が小さくて自分で記事を読み返すたびに、 「この Web
+サイトの作者はどうしてこの文字サイズでよいと思ったんだろう」と疑問に思ったほどです。
+
+なので、デフォルトでは少し大きめにしました。 かなり読みやすくなったと思います。
+
+## コードが読みやすくなりました
+
+コードの装飾をちょっと良くしました。 ソースコードが良い感じに表示されるようになっています。 例として階乗の定義を示します。
+
+``` scheme
+(define (factorial n)
+ (if (zero? n)
+ 1
+ (* n (factorial (- n 1)))))
+```
+
+また、文中のコードの表示も改善しました。 「 `(factorial 10)` の値は `3628800`
+です」というように良い感じにコードがハイライトされるようになりました。
+
+## 感想
+
+だいぶ見た目が良くなったと思います。
+このウェブサイトは[バージョン管理](https://gitlab.com/tojoqk/www-tojo-tokyo)されているので、
+暇な人は過去のコミットに戻ってサイトをビルドしてみると良いと思います。
+
+Guix を使用していれば、ビルド環境の構築をしなくても下記のコマンドで一瞬です。
+
+``` shell
+guix environment -l environment.scm -- make serve
+```
+
+特に環境を準備していなくてもこのコマンドだけで `8080` ポートを待ち受けるサーバーを起動することができます。 やはり Guix
+は最高ですね。
diff --git a/posts/redesign-www-tojo-tokyo.org b/posts/redesign-www-tojo-tokyo.org
deleted file mode 100644
index 2903f2c..0000000
--- a/posts/redesign-www-tojo-tokyo.org
+++ /dev/null
@@ -1,60 +0,0 @@
-title: ウェブサイトの見た目を改善しました
-id: redesign-www-tojo-tokyo
-date: 2020-05-08 06:45
-updated: 2020-05-08 12:51
-description: ダークテーマよりも普通の方がよかった
----
-#+OPTIONS: todo:nil
-
-** ダークテーマよりも普通の方がよかった
-
- いままでこのウェブサイトはダークテーマを意識していて、黒い背景に白い文字を使用していました。
- しかし、この Web で記事を閲覧するよりも GitLab で直接元の
- ~org-mode~ の文書を読んだ方が視認性が良いことにショックを受け、
- 根本的に見た目を改善する必要があることに気づきました。
-
- ダークテーマはターミナルや Emacs で文書を書いているときには良いのですが、Web ではあまり良くないようです。
- 視認性の良い Web ページをダークテーマで作成するのは難しいと思います。
-
- 基本的に配色のこだわりを捨てて Web ブラウザのデフォルトに任せることにしました。
- すると、悲しいことにその方がずっと見やすくてより良いものになりました……。
-
-** 文字を大きくしました
-
- このサイトの文字のサイズは小さすぎました。
- 全体的に文字が小さくて自分で記事を読み返すたびに、
- 「この Web サイトの作者はどうしてこの文字サイズでよいと思ったんだろう」と疑問に思ったほどです。
-
- なので、デフォルトでは少し大きめにしました。
- かなり読みやすくなったと思います。
-
-** コードが読みやすくなりました
-
- コードの装飾をちょっと良くしました。
- ソースコードが良い感じに表示されるようになっています。
- 例として階乗の定義を示します。
-
- #+BEGIN_SRC scheme
-(define (factorial n)
- (if (zero? n)
- 1
- (* n (factorial (- n 1)))))
- #+END_SRC
-
- また、文中のコードの表示も改善しました。
- 「 ~(factorial 10)~ の値は ~3628800~ です」というように良い感じにコードがハイライトされるようになりました。
-
-** 感想
-
- だいぶ見た目が良くなったと思います。
- このウェブサイトは[[https://gitlab.com/tojoqk/www-tojo-tokyo][バージョン管理]]されているので、
- 暇な人は過去のコミットに戻ってサイトをビルドしてみると良いと思います。
-
- Guix を使用していれば、ビルド環境の構築をしなくても下記のコマンドで一瞬です。
-
- #+BEGIN_SRC shell
- guix environment -l environment.scm -- make serve
- #+END_SRC
-
- 特に環境を準備していなくてもこのコマンドだけで ~8080~ ポートを待ち受けるサーバーを起動することができます。
- やはり Guix は最高ですね。
diff --git a/www-tojo-tokyo/reader/org.scm b/www-tojo-tokyo/reader/org.scm
deleted file mode 100644
index 2d876e6..0000000
--- a/www-tojo-tokyo/reader/org.scm
+++ /dev/null
@@ -1,55 +0,0 @@
-;;; TojoQK's website --- TojoQK's personal website
-;;; Copyright © 2020 Masaya Tojo <masaya@tojo.tokyo>
-;;;
-;;; This file is part of TojoQK's website
-;;;
-;;; TojoQK's website is free software: you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation, either version 3 of the License, or
-;;; (at your option) any later version.
-;;;
-;;; TojoQK's website is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with TojoQK's website. If not, see <https://www.gnu.org/licenses/>.
-
-(define-module (www-tojo-tokyo reader org)
- #:use-module (haunt post)
- #:use-module (haunt reader)
- #:use-module (ice-9 receive)
- #:use-module (ice-9 textual-ports)
- #:use-module (sxml simple)
- #:use-module (sxml xpath)
- #:export (org-reader))
-
-(define open-process (@@ (ice-9 popen) open-process))
-
-(define (org-string->html-string str)
- (receive (read-port write-port pid)
- (open-process OPEN_BOTH "pandoc" "-f" "org")
- (put-string write-port str)
- (close-port write-port)
- (let ((result (get-string-all read-port)))
- (close-port read-port)
- (let ((status (cdr (waitpid pid))))
- (unless (zero? status)
- (error "pandoc return a non-zero status-code:" status)))
- result)))
-
-(define org-reader
- (make-reader (make-file-extension-matcher "org")
- (lambda (file)
- (call-with-input-file file
- (lambda (port)
- (let* ((metadata (read-metadata-headers port))
- (html-string (org-string->html-string
- (get-string-all port))))
- (values metadata
- ((sxpath '(dummy *))
- (xml->sxml
- (string-append "<dummy>"
- html-string
- "</dummy>"))))))))))