Orgをもう少し
Table of Contents
ub20.04は無事に世に出たと言うのに、ob6.7は予定日を過ぎても出てこない。これもそれも、コロナの影響かな。しばし、時間潰し。。。
文芸的プログラミング
昔々 文芸的プログラミング を提唱した有名な先生がおられました。しかし、流行らなかった。何故? 文芸的プログラミングが普及しなかった理由。
setup
org-modeのコードブロック(Babel)の使い方 に倣ってやってみる。事前に、init.elに使う言語を登録しておかないと、実行出来ない。
(org-babel-do-load-languages 'org-babel-load-languages '( (shell . t) (scheme . t) ))
scheme
勿論、Windowsにはschemeなんて入っていないので、guileとそのemacsのサポーターであるgeiserが入ってるdebianで試した。
まず、<sTABして、src用のブロックを作る。それから使う言語を指定する。シェバングだな。必要なら、オプションを設定。そして、ブロック内にソースを散りばめる。
#+BEGIN_SRC scheme :exports both (* 111111 111111) (cdr '(a b c)) #+END_SRC
これを実行すると(コードブロック内で、C-c C-c)、geiserがどのインプリメンテーションか聞いてきて、実行するかって確認を求めてくる。okすると、下記のようになる。
#+RESULTS: : (b c)
最初のS式の結果が出てこないのは、お約束だな。最後に実行した結果が得られるって事ね。
sh
調子こいて、言語を sh に指定し、ls -l してみると
total | 8 | |||||||
-rw-r–r-- | 1 | sakae | sakae | 2874 | Apr | 24 | 13:53 | z.html |
-rwxr-xr-x | 1 | sakae | sakae | 183 | Apr | 24 | 14:59 | z.org |
こんな表が出てきたぞ。それじゃ、dateとかpwdとか、結果が1行に収まるやつは、普通の表示となった。man pwdとかcat z.orgとか、複数行の場合はどうよ。
どうもawkで分解して、無理やり表にしてるみたいだぞ。そんなに表が好きなんて、作者は日本人かな?
date pwd なんて具合に、2行にすると、表になるしね。やり過ぎの感がする。
python
それじゃpythonはどうよ? 最近、右を見ても左をみても、ジュピターノートブックばかりでつまらないからね。走らせてみたら、
Evaluate this python code block on your system? (yes or no) yes : No org-babel-execute function for python!
無体な事に怒られた。あ、python使う許可を与えていなかった。
普通に print("Hello Org")したんだけど、結果はNone。はてなですよ。調べてみたら、
#+BEGIN_SRC python :results output print("hello Org") print("I love Org") #+END_SRC
こうすれば良いって分かった。更に発展的には、Org mode の Python コードブロックを IPython のカーネルで評価する も有り。これで、ジュピター撲滅だ。あれ、 pythonは2系が使われたのかな、それとも3系?
Org-modeの癖
上のソースブロックの例示で、ブロック自体を、EXAMPLEブロックで囲んでいる(Web上では見えないけど)。すると、何も処置をしないとorgは混乱してしまい、#+ENDEXAMPLEを外側に出してしまう(前回がそうだった)。
これを避けるおまじないがある。内側の #+END_SRC
の直前に、一つのカンマを追加する。これで、ただの文字列だよとorgは思うようになる(いわゆるエスケープだな)。
また、下記のように文字列foobarに装飾を施せるぞ。
修飾 | 効果 |
---|---|
*foobar* |
foobar |
/foobar/ |
foobar |
+foobar+ |
|
_foobar_ |
foobar |
=foobar= |
As see |
これらの効果を期待するには、前後にSPACEが必要と言う、癖がある事を承知してくれ。それから、文字列の冒頭または後端にスペースが有ると機能しない。尚、As seeは、見たままに表示する(装飾文字の機能を失わせる)。
アンダーバーでの修飾で、下線が付くはずなんだけど、オイラーの所のWindows10(firefox,cronim)では、無視されるなあ(OpenBSDのfirefoxでは、ちゃんと見えるのに)。
文芸的プログラミング(part II)
面白そうなので文芸的を検索してみると Web上での「文芸的プログラミング」 に出くわした。ユニマガに増井さんとは、懐かしい組み合わせだな。 近傍を散策していたら、どこでもメモ なんてのも見つかった。すわ、Org-mode のお出ましかと思ったら、時代が古すぎてまだorgは無かった。やはり一定の要求は有るんだね。
ジュピターノートブックが出て来る前に、パイソンで文芸的を目指した方がいた。 {python} 文芸的プログラミングのためのツール? やはりね。時代は繰り返す。
Case of haskell
haskellはどうよ? プログラミングHaskell本のソースが、それを実現してた。 9.6 文藝的コメント やや、懐かしい方が出てきた。お元気かなあ? 折角なので試してみる。
例題は、買い物に行った時の、税抜き価格から、税込み価格を計算するスクリプトにする。飲食物は税率が8%(政府の見解では酒は飲み物にあたいしないらしい)、それ以外は10%だ。 haskellのブログラミングなんて2015年の暮以来で、だいぶさび付いていた。
この為にOpenBSDにGHCを入れたら、8.6.4と言うのだった。新しいんだか古いんだか知らないけど、総容量が1.6Gって、どんだけよ。だから古いhugsなんてのが(一応)Windows10に鎮座してるのさ。
で、解説ではOrg風のコードブロックを使えるとなってたけど、hugs,GHC(ghci)共にエラーに なってしまった。
\begin{code} main :: IO Float main = do : こんなコードに対して、ghciでは、 withTax.lhs:18:1: error: parse error on input `main' | 18 | main :: IO Float | ^^^^ hugsでは、 ERROR "withTax.lhs":18 - Syntax error in input (unexpected symbol "main")
使えるのは、冒頭に"> " を置いたスタイルだ(hugs,ghciともにok)。
ob$ cat withTax.lhs This is sample of literate programming. If use "> " then need null line around there. and file suf must be .lhs ;; keyin code use words, it same as split. > keyin :: IO [String] > keyin = do cs <- getLine > return $ words cs ;; main is entry point for app/runghc/runhugs > main :: IO () > main = do > putStrLn "Input,, food price | others price | = " > res <- calc 0.0 > print res ;; accumulate with TAX > calc :: Float -> IO Float > calc v = do > cs <- keyin > if '=' == (cs !! 0 !! 0) > then return v > else > do > if 'f' == (cs !! 0 !! 0) > then calc $ 1.08 * (read (cs !! 1) :: Float) + v > else calc $ 1.10 * (read (cs !! 1) :: Float) + v
こんなコードになった。税率毎に価格を合算して、それに税率を乗算するのが正しい方法なのかな? よう知らん、それに、円以下の端数(銭)は、切り捨てだったように記憶してるけど、無視。あくまでも文芸的なサンプルですから。
Hugs> :l withTax.lhs Main> main Input,, food price | others price | = f 100 o 100 = 218.0
そしてこちらは実行例。100均で、2点のお買い上げ(フィライドオニオンと歯間ブラシ)。女房には、アンチョビの缶詰をリクエストされてたんだけど、生憎品切れでした。コロナの影響か、最近、変なもの(納豆とか蕎麦とか)の欠品が目立つね。
ob$ ghci GHCi, version 8.6.4: http://www.haskell.org/ghc/ :? for help Prelude> :l withTax.hs [1 of 1] Compiling Main ( z.hs, interpreted ) withTax.hs:1:16: error: parse error on input `of' | 1 | This is sample of literate programming. | ^^ Failed, no modules loaded.
こちらは、ちゃんとファイルのサフィックスを付けないとエラーになるよって例ね。どうでもいいけど、澄ました例だけだと、現実的じゃないから、敢えて載せました。お目汚し御免。
LaTeX
文芸的なんて言葉の繋がりで、数式をそれなりに表示出来たらカッコイイと思った。幸いな事にorg-modeには、LaTeXって機能があって、綺麗に数式を表示出来るそうだ。検索してみると、論文を書いてPDFにしようってのが良く引っかかってくる。
でも、オイラーはPDFにする程論文を書く訳でもないので、 \(E = mc^2\) ぐらいが綺麗に出れば十分過ぎるぐらいだ。
下記は、生原稿の例。何となく分かるような分からないようなモヤモヤ勘が漂う。
$\sum_{i=1}^n a_i x_i \ge b$ \begin{eqnarray*} x & = & \sqrt{\frac{a}{b}} \end{eqnarray*} $\frac{1}{2} = 0.5$ \begin{align} a &= b \\ &= c \end{align} \begin{align} \int^{b}_{a} f(x) dx = \lim_{n \to \infty} \sum^{n-1}_{i=0} f(x_{i}) \Delta x \end{align}
そこで、LaTeX 数式 記述方法 ぐらいで、数学者に教えを乞うてみた。
数式モード を見てから、詳細な LaTeX/LaTeXによる文書整形の応用/数式を記述 を見るのが吉かな。
実際に表示させると、firefoxは(比較的)さっと表示されるんだけど、chromeは一生懸命に表示用フォントを取りに行ってるみたいで、随分と待たされる。不評を買わないように程々にしておけかな。
jsMath: A Method of Including Mathematics in Web Pages こういうフォントを使えばいいのかなあ。まて、これは手元に入れておくものだろう。万人が幸せになるように、Webサーバー側に入れとくやつな無いかな?
MathJax が、本場で ちょこっと MathJax: 初期設定 されてる方が居た。真似してみるかな。