2014/09/26


先日、golang の開発リポジトリに generate が入りました。

Go generate: A Proposal

The go build command automates the construction of Go programs but sometimes preliminary processing is required, processing that go build does not support.

https://docs.google.com/document/d/1V03LUfjSADDooDMhe-_K59EgpTEm3V8uvQRuNMAEnjg/edit

皆さんが期待している様な物なのかそうでないのか分かりませんが、ひとまずこの提案書を見る限り

  • 使うのはライブラリユーザではなくライブラリ作者
  • go build で自動で generate してくれる機能はない
  • shell 的なワンライナーは実行出来ない

どちらかと言うと使用するのは開発時で、バイナリを同梱する目的で golang のソースを吐くまでの手順であったり、構造体に特殊なメソッドを生やしたりという目的で使われます。また yacc のソースから golang のソースを吐くなどといった用途も考えられます。生成される物が golang のソースに限られている訳でもありません。

この特殊なメソッドを吐き出す、と聞くとどうしても generics を思い浮かべる方が多いと思いますが、上記の通り「自動では生成されない」という制限がある事から期待されている使い方は現状出来ません。

今日はこの新しく入った generate を使って、どの様な効果が得られるのかを gen というツールを使って説明したいと思います。

まず以下のコード(food.go)を用意します。

//go:generate gen -force

package food

// +gen *
type Food struct {
    Name string
    Price int
}

gen というツールが +gen となっている部分を扱います。

clipperhouse/gen - GitHub

README.md What’s this? gen is a code-generation tool for Go. It’s intended to offer generics-like fu...

https://github.com/clipperhouse/gen

gen はこの識別が付いている type 宣言から便利な関数群を作ってくれます。

food.go があるフォルダで以下を実行します。

$ go generate

すると food_gen.go というコードが生成されます。少し大きすぎるので gist に貼りつけました。詳しくは gen の README を参照して頂きたいですが、配列を扱う上で便利な関数群が生成されます。

あとはこれを使って処理を書くのみとなります。

package main

import (
    "fmt"
    . "github.com/mattn/go-example/food"
)

func main() {
    foods := Foods{
        {"リンゴ"110},
        {"みかん"70},
        {"メロン"400},
    }

    foods.All(func(f *Food) bool {
        if f.Price < 200 {
            fmt.Println(f.Name)
        }
        return true
    })
}

この例は gen を使いましたが、go-assetsgo-bindata でバイナリからソースファイルを生成したり、msgp を使って構造体を MessagePack 対応したりといった用途にも使用出来るかと思います。

ライブラリユーザではなくライブラリ開発者にとっては便利な機能だと思いますね。


2014/09/22


Atom 最高ですね!!

でも、Atom は 21 世紀のエディタです。まだ 21 世紀になって 14 年しか経っていないので、20 世紀最強のエディタに比べてまだまだ足りない機能があるのはしょうがないですね!!

86 年後に勝負しよう!!

って感じですね。

みんなが拡張書けば 86 年がドンドン縮んでくると思うのですが、ぶっちゃけまだまだです。 なので、最強にするための拡張書いてみました。

open-vim

Atom で今開いているファイルを Vim で開く拡張です。

「あー、Vim だと xxx 出来るのに〜」

とか脳みそがまだ 20 世紀な時とか

「あー、このファイルデカすぎて Atom で編集すると重い……」

みたいなかわいそうな作業している時とか(2050 年位のマシンだとさくさくだと思いますけど!!)にお使いください。

21 世紀に戻る

command! OpenAtom !start atom %

こんな感じのを .vimrc に書いておけばいいんじゃないでしょうか?

Back To The Future !!!

p.s.

Emacs の話はしていません

参考資料: 21 世紀のエディタである Atom を最強にする - yoshiori.github.io

ネタです。ご理解下さい。


2014/09/18


PDCurses はその名の通り Public Domain な curses 実装な訳ですが、Windows の実装こそありますが如何ともし難い問題がありました。

PDCurses には、ワイド文字列関数とバイト列で貰う実装があります。UNIX 系アプリケーションの多くは内部文字列がほぼ UTF-8 となり、C言語で受け渡される文字列は既成事実として UTF-8 になってしまいました。

しかしながら日本の Windows ではバイト列と言えば Shift_JIS な訳で、そのまま移植してしまうと文字化けが発生します。各アプリケーション側がワイド文字列でコードを書いてくれれば良いのですが、そんな事を気にする人はまずいません。ましてや各アプリケーションが UTF-8 と MBCS (Multi Byte Character Set) の変換を行うのは酷な話です。出来れば内部文字列は UTF-8 のままで Windows でも正しく表示されて欲しいのです。

mattn/pdcurses - GitHub
https://github.com/mattn/pdcurses

という訳で pdcurses に手を入れてみました。もし pdcurses.dll をリンクしていて表示が文字化けしているアプリケーションがあれば、dll を入れ替えるだけで文字化けが解消するかと思います。

今日はこれを使って、コマンドラインベースのプレゼンテーションツールである mdp を Windows で動かしてみました。

visit1985/mdp · GitHub

A command-line based markdown presentation tool.

https://github.com/visit1985/mdp

mdp 自身は大した事をやってないので、ncurses の代わりに pdcurses をリンクする様な修正を入れただけです。

diff --git a/Makefile b/Makefile
index 63a1feb..54f8327 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@
 
 CFLAGS   = -O3 -Wall
 LDFLAGS  = -s
-LDLIBS   = -lncurses
+LDLIBS   = -lpdcurses
 OBJECTS  = cstring.o cstack.o markdown.o parser.o viewer.o mdp.o
 DESTDIR ?= /usr/bin
 
diff --git a/include/viewer.h b/include/viewer.h
index 68c7a13..f6e70fb 100644
--- a/include/viewer.h
+++ b/include/viewer.h
@@ -32,7 +32,7 @@
  *
  */
 
-#include <ncurses.h>
+#include <curses.h>
 
 #include "parser.h"
 #include "cstack.h"
diff --git a/viewer.c b/viewer.c
index ba76f2f..ed83196 100644
--- a/viewer.c
+++ b/viewer.c
@@ -22,7 +22,6 @@
  */
 
 #include <locale.h> // setlocale
-#include <ncurses.h>
 #include <stdlib.h>
 #include <string.h> // strchr
 #include <unistd.h>

sample.md も日本語にして正しく動作する事が確認出来ました。

mdp1
mdp2
mdp3
mdp4