一から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 らしい。
公式は
簡単なのをやってみる。
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(日本語班)は、これからですな。 こちらにも頑張って欲しいものです。(日本語版を日本語班と変換とは、ナイスな御変換)
去年のアベンドカレンダーから、今年のネタ探し
アベンドカレンダーを見るのを忘れていて、今頃トラチラと見てる。今年の方向性は いかにってね。少々興味を引いたのを挙げておく。
Ruby+d3.js+garb(Google-analytics-API)でユーザーの経路(パス)を描画
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とπの関係を 綺麗にまとめた式。よくこんな式を思い付くよな。
巨人の肩に乗って楽しめるのは無常な喜び。何か別な本も読んでみたいぞ。候補は、
さて、どちらにしようかな。まずは一冊だな。