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
=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: 初期設定 されてる方が居た。真似してみるかな。


This year's Index

Home