一からGo

この所、数学よりなんで、昔読んだ本を再読しでみた。今から20年前にヒットした本、 『博士の愛した数式』(新潮社)。オイラーの記憶では、映画にもなってたような。。。

交通事故で脳に障害(記憶が80分しか保持出来ない)を負った数学者の所へ、これで9人目と なる家政婦がやってくる。

博士はいきなり彼女に、あなたの靴のサイズは幾つかね? と、ぶいつけに問う。 いぶかしげに、24ですけどって答えると、博士は、素晴らしい! それって、4!じゃ ないかって答える。

翌日も同じ質問と、すこしばかり別な質問も。あなたの所の電話番号は? XXX-XXXXです。 それって、1億までの素数の数じゃな。所で誕生日は? XXXです。おーー、あなたと私は 不思議な数で結びついているね。取り出したのは、彼が若かりし頃に頂いた腕時計。 こいつのシリアル番号が、あなたの誕生日と友愛数じゃないか。。。。

家政婦さんは、実はバツ一。10歳になる息子を育てている。ひょんな事から、母子と博士が 対面する。博士は息子名前の変わりに、頭の特徴(頭頂部が平ら)から、ルートって名前をつけた。その事を 忘れないように、メモを書いて、そのメモを背広にピンで留めた。勿論、家政婦さんも 忘れないように、似顔絵付きのメモを貼り付けていた。

なんか、博士と母子の交流がほんわかとしてて、とても気持ちが良かったぞ。作者の小川洋子さん、 どうもありがとう。

素数に関するうんちくが載ってた。小川さんよく調べてる。素数は孤高な数。どれもが独立 してるんだけど、何故か2つのグループに分ける事が出来るとか。

(数の)元素なんだから、周期律表の何とか族みたいにね。nを自然数とした時、素数は、 4n - 1 か 4n + 1 のグループに分類されるとな。(但し2だけは除く)

例えば、有名な双子素数、11、13なら、nが3の時、確かにそうなるな。素数が31なら、nが 8で、条件を満たしてる。他にもいろいろやってみれ!

小説に出て来る家政婦さんも、友愛数を探そうと、チラ裏で一生懸命に計算してたぞ。 そして、阪神タイガーズの偉大な選手、江夏の背番号28の秘密を発見した。

ソースからGo

今までLinuxディストロが用意してくれたGoを使ってきたけど、FedoraでもGoするに当たって、 ソースから入れてみたい。えと、どうやるんだ? 調べたら、 Installing Go from sourceに出てた。

まず、Mercurialを入れろとな。そしてソースを取ってきて、後はsrcに下りて行って、bash スクリプトを叩くだけ。簡単と言えば簡単だわな。指示通りにやると、1.3.3になっちゃったので、

[sakae@fedora go]$ hg branches
default                    21923:9ef10fde754f
release-branch.go1.4       21872:efe62e6c4f3d
release-branch.go1.3       20235:f44017549ff9
release-branch.go1.2       18502:9c4fdd8369ca
release-branch.go1.1       16840:414057ac1f1f
release-branch.go1         13681:d5666bad617d
release-branch.r60          9516:c1702f36df03
release-branch.r59          9023:d5785050f61d
release-branch.r58          8741:acaddf1cea75
release-branch.r57          8306:9d7967223815
dev.garbage                21919:d1238958d4ae (非アクティブ)
dev.cc                     21911:81884b89bd88 (非アクティブ)
dev.power64                21718:f57928630b36 (非アクティブ)
[sakae@fedora go]$ hg update release-branch.go1.4

したよ。世の中go1.4の世界になってるからね。

ツールは別途インストールせいとな。ツールのお取り寄せリンクは

go get golang.org/x/tools/cmd/...

こちらが正解かな。

で、srcの中に色々なメニューがある。オイラーに関係しているのは、

all.bash   コマンドとパッケージを作ってからテスト
run.bash   パッケージを作ってからテスト
make.bash  コマンドとパッケージを作成

実際にやってみる。

[sakae@fedora src]$ ./make.bash
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, linux/386.
lib9
libbio
liblink
cmd/cc
cmd/gc
cmd/8l
cmd/8a
cmd/8c
  :
testing/quick
text/scanner

---
Installed Go for linux/386 in /home/sakae/go
Installed commands in /home/sakae/go/bin

これだけだと、binの下には、goとgofmtしか出来ない。godocはツール扱いなのね。 run.bashの方は、テストに大幅に時間がかかるよ。

Who make golang

所で、誰がgoを作っているの? hgのコミット・ログを探ってみる。

[sakae@fedora go]$ hg log|grep user|sort|uniq -c|sort -nr|head -20
   5053 user:        Russ Cox <rsc@golang.org>
   2615 user:        Rob Pike <r@golang.org>
   2109 user:        Robert Griesemer <gri@golang.org>
   1334 user:        Andrew Gerrand <adg@golang.org>
   1097 user:        Brad Fitzpatrick <bradfitz@golang.org>
    695 user:        Dmitriy Vyukov <dvyukov@google.com>
    683 user:        Ian Lance Taylor <iant@golang.org>
    564 user:        Shenghou Ma <minux.ma@gmail.com>
    508 user:        Ken Thompson <ken@golang.org>
    473 user:        Alex Brainman <alex.brainman@gmail.com>
    433 user:        Mikio Hara <mikioh.mikioh@gmail.com>
    397 user:        Adam Langley <agl@golang.org>
    354 user:        Nigel Tao <nigeltao@golang.org>
    336 user:        R?my Oudompheng <oudomphe@phare.normalesup.org>
    332 user:        David Symonds <dsymonds@golang.org>
    316 user:        Dave Cheney <dave@cheney.net>
    211 user:        Keith Randall <khr@golang.org>
    158 user:        Anthony Martin <ality@pbrane.org>
    153 user:        Kai Backman <kaib@golang.org>
    150 user:        Joel Sing <jsing@google.com>

断トツにCoxさん、Pikeさん、Griesemerですかね。Mikio Haraさんって日本の方? おや、 Ken Thompsonもいるぞ。

gocodeの起動

goを始めた時、gocodeなんていうアプリを入れた。こやつ、goの補完をやってくれる、お助け アプリだった。emacs上から勝手に起動してくれるんだけど、どうやって起動されるか謎に 包まれたまま、年を越していた。もう一度、起動の仕組みを探ってみたい。だって、喉に小骨 が刺さっているみたいで、気分が悪いじゃないですか。

素直にemacsから起動してるんだろうと当たりをつける。だって、それしか無いよね。 軽くgrepしてみると、go-autocomplete.elで引っかかった。

(defun ac-go-invoke-autocomplete ()
  (let ((temp-buffer (generate-new-buffer "*gocode*")))
    (unwind-protect
        (progn
          (call-process-region (point-min)
                               (point-max)
                               "gocode"
                               nil
                               temp-buffer
                               nil
                               "-f=emacs"
                               "autocomplete"
                               (or (buffer-file-name) "")
                               (concat "c" (int-to-string (- (point) 1))))
          (with-current-buffer temp-buffer (buffer-string)))
      (kill-buffer temp-buffer))))

引数を一杯取る、call-process-regionが出てきた。んで、C-h f call-process-regionして みると、point-minからpoint-maxの範囲を処理すべきデータとして、gocodeを呼び出せって 機能みたい。gocodeの引数は、-f=emacsね。

ならば、素直に呼び出してみよう。

[sakae@fedora ~]$ gocode -f=emacs
[sakae@fedora ~]$ ps awx | grep gocode
 1405 pts/2    Sl     0:00 gocode -s -sock unix -addr localhost:37373

難だ? 呼び出しと違ったものに変身してるよ。でも、以前もこうなってたな。鍵は、gocodeの ソース嫁か。

client.goで、起動の根っ子を見つけたぞ。

func try_run_server() error {
    path := get_executable_filename()
    args := []string{os.Args[0], "-s", "-sock", *g_sock, "-addr", *g_addr}
    cwd, _ := os.Getwd()
    procattr := os.ProcAttr{Dir: cwd, Env: os.Environ(), Files: []*os.File{nil, nil, nil}}
    p, err := os.StartProcess(path, args, &procattr)

    if err != nil {
        return err
    }
    return p.Release()
}

上記は、do_client内から呼ばれている。呼び出し条件はサーバーが見つからなかったらって条件でね。 で、更にdo_clientを呼んでる所は、gocode.goの中のmain関数。この中では、サーバーか クライアントかで場合分けしてる。

結局、emacsからは、クライアントとしてgocodeを起動。gocodeの中ではクライアント モードで動こうとして、何だサーバー動いてないじゃんて事で、サーバーを動かしてから、 サービスを受けるって寸法だな。

少しemacsから補完を効かせてから、gocode statusすると

Server's GOMAXPROCS == 1

Package cache contains 30 entries

Listing these entries:
        name: /usr/local/go/pkg/linux_386/io/ioutil.a (default alias: ioutil)
        imports 9 declarations and 3 packages
             :
Last edited file: /home/sakae/godev/src/github.com/nsf/gocode/client.go (package: main)

Other files from the current package:
        /home/sakae/godev/src/github.com/nsf/gocode/autocompletecontext.go
        /home/sakae/godev/src/github.com/nsf/gocode/autocompletefile.go
           :

こんな具合に、覚えた補完状況を確認出来る。裏方さんは、努力してんのね。 ああ、上記でパッケージがあらぬ所から出現してるのは、goのbinaryを素直に入れ直した からです。

cgo

goにはいわゆるFFI機能、外部のライブラリーを呼び出す機能があるようだ。Rubyにもパイソン にもあったね。だから、近代的なgoにも有るはずと思って探してみたんだよ。

ぐぐる様に聞いてみると、やっぱりオイラーと同じでみんなで試してたぞ。たとえば、 こちらの方みたいにね。 合言葉は、cgo らしい。

公式は

cgo

Command cgo

簡単なのをやってみる。

package main

/*
#include <stdio.h>
void show(char* s) {
    printf("%s by C lang\n", s);
}
*/
import "C"

func main() {
    s := C.CString("This is go-side string")
    C.show(s)
}
[sakae@fedora cf]$ go run mix.go
This is go-side string by C lang

C語はgoのコメントの中。そのコメントの直後で import C すると、コメントが特別 扱いされるようになる。goの世界にCの世界を移住させたような感覚。但し、Cの世界は コメントでコロニーに押し込まれている。なお、コメントの中にC世界を構築せず、別 ファイルに書いておいて、それをincludeするのも有り。こうすると、植民地が 目立たなくなって、平静かも?

コロニーの中と通信するには、特任大使であるパッケージCを使えとな。上記をバイナリーに すると言うまでもなく、ダイナミックリンクになる。

[sakae@fedora cf]$ ldd mix
        linux-gate.so.1 =>  (0xb7702000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb76da000)
        libc.so.6 => /lib/libc.so.6 (0xb750d000)
        /lib/ld-linux.so.2 (0xb7703000)

それじゃ、有りそうなシチエーションとして、本国のGoと混ぜたら、どうなるだろう? fmt.Printを追加してみた。

[sakae@fedora cf]$ ./mixGo
This is go-side string by C lang
This is PURE go string by Golang fmt.Print

領土の大きさは?

[sakae@fedora cf]$ size mix mixGo a.out
   text    data     bss     dec     hex filename
 366587   13688   70308  450583   6e017 mix
1068481   20920   72292 1161693  11b9dd mixGo
   1157     276       4    1437     59d a.out

どーんと肥大した。Go国家は偉大(肥大?)也。こういう領土問題は大変ですなあ。 ちなみに、a.autはC語によるハロワ。

世界地図を俯瞰してて、国境がエイヤって直線になってる所は、昔の覇権国家が蹂躙して 植民地だった所。アフリカとか中東とかが顕著だよね。

独立戦争が勃発して、どんどんと独立していった。大体植民地にされるような所は、特産品が ある所。石油とか炭素の結晶とか希少金属とか。

最近、ガソリンの値段が下がっているのは、とりあえず嬉しい限り。取り合えずと書いた のは、サウジの王様の胸先にかかっているから。ええい、値上げしちゃえってなると、 エネルギーの経済戦争が顕著になるな。エネルギーもさる事ながら、隣国の大食いには 頭を悩まされますなあ。これ、おせちを調達した女房の嘆きです。

今の王様は、サウジの敵国と米国のシェールガスを叩いておきたいから、安くしてるだけ。 日本は、油断 してると、本当に油を断たれるぞ。漢語ってなかなか意味深だな。

こんな日本に秘策を。無尽蔵の太陽エネルギーに注目しろよな。太陽エネルギーで発電。その電気を 使って、水を電気分解。電気を水素に変換して蓄電すればいいよ。

夢の燃料電池車は馬鹿高いけど、軌道に乗れば量産効果で安くなるはず。この技術を 押さえておけば、左団扇ですよ。どう、安倍ちゃん、頑張ってやれよな。

ああ、馬鹿話しちゃったわい。

GoでGUI

なんだかんだとGoで色々出来る事は証明された。じゃ、オイラーに取っちゃ鬼門と 言うべき、GUIは出来るの? 恐々と調べてみたよ。 そしたら、 Go言語でGUIしたいかー?! なんてのに当たりました。Qiitaには、1900を超えるGoの記事が投稿されてて、すっかり メジャーになりましたな。

satckoverflow(日本語班)は、これからですな。 こちらにも頑張って欲しいものです。(日本語版を日本語班と変換とは、ナイスな御変換)

去年のアベンドカレンダーから、今年のネタ探し

アベンドカレンダーを見るのを忘れていて、今頃トラチラと見てる。今年の方向性は いかにってね。少々興味を引いたのを挙げておく。

GOPARTS「テキストファイル・文字列操作」編

継続は力なり #FsAdvent

elm

Rubyistに贈るHaskell入門

PythonistaのためのJulia100問100答

OCamlで信号処理

Pythonによる簡単なLispインタープリタ実装方法

プログラムでシダを描画する

プログラミング言語Gnuplot基礎文法最速マスター

はじめるDeep learning

Ruby+d3.js+garb(Google-analytics-API)でユーザーの経路(パス)を描画

物理学 Advent Calendar 2014

LISP Implementation Advent Calendar

ソース嫁

上でemacsの関数の説明を求めた時、関数のソースも読める事を知った。emacs24.4からは、 elispのソースも添付されるようになったのね。これはきっと、elisp離れを懸念したRMSの 作戦に違いない。直ぐにソースを見られれば、ちょっと探ってみるかってなるだろ。

24.4で入った、ewwがどうなってるか調べてみる。C-h f eww

eww is an interactive autoloaded Lisp function in `eww.el'.

(eww URL)

Fetch URL and render the page.
If the input doesn't look like an URL or a domain name, the
word(s) will be searched for via `eww-search-prefix'.

へー、要領よく説明してんな。URLに見えなかったら、特製サーチしますだってさ。 どんな風にやってるの? eww.elの所がリンクになってるんで、そこにカーソルを合わせて リターンキーを叩くと、、、

(defun eww (url)
  "Fetch URL and render the page.
If the input doesn't look like an URL or a domain name, the
word(s) will be searched for via `eww-search-prefix'."
  (interactive "sEnter URL or keywords: ")
  (cond ((string-match-p "\\`file://" url))
        ((string-match-p "\\`ftp://" url)
         (user-error "FTP is not supported."))
        (t
         (if (and (= (length (split-string url)) 1)
                 (or (and (not (string-match-p "\\`[\"\'].*[\"\']\\'" url))
                          (> (length (split-string url "\\.")) 1))
                     (string-match eww-local-regex url)))
             (progn
               (unless (string-match-p "\\`[a-zA-Z][-a-zA-Z0-9+.]*://" url)
                 (setq url (concat "http://" url)))
               ;; some site don't redirect final /
               (when (string= (url-filename (url-generic-parse-url url)) "")
                 (setq url (concat url "/"))))
           (setq url (concat eww-search-prefix
                             (replace-regexp-in-string " " "+" url))))))
  (url-retrieve url 'eww-render (list url)))

eww系のソースが開かれましたよ。これは便利。ホー、お決まりのhttp:// は、省略しても おぎなってくれるんか。近辺を散策してみると、検索エンジンが見つかったよ。

(defcustom eww-search-prefix "https://duckduckgo.com/html/?q="
  "Prefix URL to search engine"
  :version "24.4"
  :group 'eww
  :type 'string)

ここをぐぐる様にしてないのは、RMS大将らしいな。って言うか、生物多様性ならぬ、 検索多様性も大事。ぐぐる様が閻魔大王だったらプライバシー破滅になりますから。 でもね、、、duckduckgo.comって何者よ? ぐぐる様のフロント企業じゃないだろうね? Topページみたらポリシーが書いてあった。ちゃんと確認しれ。憶測はいけませんぞ。

数学本を一冊

枕に書いた、博士の愛した数式に、有名なオイラーの式が出て来る。eとiとπの関係を 綺麗にまとめた式。よくこんな式を思い付くよな。

巨人の肩に乗って楽しめるのは無常な喜び。何か別な本も読んでみたいぞ。候補は、

新装版 オイラーの贈物

素数夜曲―女王陛下のLISP

さて、どちらにしようかな。まずは一冊だな。