iconv binding for golang を書いてみた

golang の DB モノは、なにやら、database api とやらで共通化しようという動きがあるようだ。それに合わせて、書き直したいと思いつつも、日本語エンコード対策に手をだしてしまった。21世紀になっても、政権交代しても、UTF-8 ですべて片づくというわけにはいかないものだ。

ということで、まずは、iconvでやってみた。本当は nkf にしたかったが、複雑だったので、あきらめた。


github: go-iconv


しかし、iconv でも、些細なことにはまってしまった。

iconv(libiconv) を使うときの一般的な注意点:

  • iconv_open()は toencode, fromencode の順である。
  • ポインタでわたすのはバッファと、バイト長。
  • ポインタで戻ってくるのはバッファと、エンコード成立回数
  • malloc() とか事前にしておくこと。

go-iconv では、このへんはゴニョゴニョしてある。しかし、もっとちゃんと書き直すつもり。

PostgreSQL bindings for golang アップデート

GetLength() とか追加。API デザインは CPAN Pg を真似ている。

続々でてくるライブラリをみて、yyyc514/go-datamapperとか、tokuhirom/go_datamapperが気になるところ。


アクセス方法を抽象化して、DBMS 依存を分離するのを協調してやりたい。


あと、rdoc(ruby) や perldoc みたいなのがほしい。

go-pg に FetchRow() 追加

PostgreSQL binding for golang をアップデート。


github: go-pg


CHANGES

  • FetchRow() を実装(implemented FetchRow())
  • GetIsNull() が Bool を返すように(GetIsNULL() return bool type)
  • PgExec が PgResults を返すように(PgExec() return PgResult type)

KNOWN-THING

  • FetchRow()で、どこかのカラムが nil を返すとき、"" を返す。(FetchRow() return ""(not nil) when GetValue() return nil)


これで、最低限の機能として、connect, exec, close ができるので、SELECT なんかも普通に使えるはずなので、何かに役に立てばうれしい。次は、test と、その他のお便利関数を実装したい。


golang の for についてだが、while や untile がないのはシンプルでいいんだけど、脱出をきれいに書くにはどうすればいいのか、理解できていない。よくわからんエラーメッセージもでるし。

GO 言語で PostgreSQL につなぐ

早速、実用に使いたいので、GO 言語(golang)で PostgreSQL につないでみたくなった。


課題:
 1.GO 言語から、PostgreSQL につなぐ。
PostgreSQL bindings for golang


 2.そのためには、GO 言語から、外部の C ライブラリを呼び出す必要がある。
C library(libpq) binding for golang.


いい加減だが、なんとかクリア。

続きを読む

CentOS 5.2 で GO 言語

寝つけないので、ちまたで、話題になっている、GO 言語に参加。

ちなみに、家のサーバのハードウエアは、しょぼい。
CPU: AthlonXP 1700+
MEM: 768MB

OS は CentOS 5.2 だ。
今回は、その上で GO をインストールしてうごかしてみる。

$ sudo yum --enablerepo=rpmforge install mercurial
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
$ vi ~/.bash_profile
GOHOME=$HOME/go
GOARCH=386
GOOS=linux
GOBIN=$GOHOME/bin
PATH=$PATH;$GOBIN
export GOHOME GOARCH GOOS GOBIN PATH
(上記を追加)
$ source ~/.bash_profile
$ cd $GOROOT/src
$ ./all.bash

10分ぐらい待って、ビルド完了。
早速。

$ cat hello.go
package main
import "fmt"
func main() {
  fmt.Printf("Hello, World!\n")
}

$ 8g hello.go
$ 8l hello.8
$ ./8.out
Hello, World!

なるほど。


お作法で気になる点

  • メソッドの頭は大文字なのか。
  • インデントは1なのか?

まあ、ぼちぼちためそう。

XPから、7のディスクを共有することのトラブルシュート その2

XP、7、共有のキーワードで、ここを見に来る人が多いようなので、基本的なトラブルシューティングを書いておく。

やったのはこの環境。

  +--------------+   |   +--------------------+
  |  win XP Pro  |   |   | win 7 Home Premium |
  | 192.168.10.2 |   |   |    192.168.0.1     |
  |              |---|-->|      C:\Share      |
  |  user: foo   |   |   |     user: bar      |
  +--------------+   |   +--------------------+
  192.168.10.0/24    |      192.168.0.0/24

XP 側
OS: Windows XP Pro
IP address: 192.168.0.1
User: foo

7 側
OS: Windows 7 Home Premium
IP address: 192.168.0.2
User: bar


ホームグループとか参加なし。
XP Pro から 7 Home Premium のディスクをマウント。


1. Windows 7 側設定
1-1. C:\Share フォルダ作成
1-2. 右クリックで「共有」-> 「特定のユーザー...」。
1-3. 共有オーナー(bar)を追加しておく。
   誰でも(Everyone)にしておけと書いてる解説も多いが、適宜制限するように。
1-4. 「共有」ボタンを押す。
1-5. 「終了」ボタンを押す。
1-6. スタートメニュー->「コントロールパネル」->「ネットワークの状態とタスクの表示」
1-7. アクティブなネットワークの表示 -> 社内ネットワーク
1-8. 左メニューにある「共有詳細設定の変更」を押す。
1-9. ホームまたは社内
   ・ネットワークの探索を有効にする
   ・ファイルとプリンタの共有を有効にする
   ・パスワード保護の共有を有効にする
1-10. 「変更の保存」ボタン押す。


2. Windows XP 側設定
コマンドプロンプト起動の場合
2-1. XP のスタートメニューから、
「ファイル名を指定して実行...」より、"cmd" を実行。
2-2. 共有

net use Z: \\192.168.0.1\Share /USER:bar /PERSISTENT:YES

ここでパスワード入れる。
"/PERSISTENT:YES" で再起動後も共有。


直接共有
2-1. XP のスタートメニューから、
「ファイル名を指定して実行...」より
\\192.168.0.1\
ここでユーザー・パスワード入れる。

3. ファイアウォール
Nortonファイアウォールの設定をしている場合、今回、セグメントが異なるので、Inbound を許可しておく。
Netbios In-Boundを許可
SMB In-Boundを許可


あいかわらず、適当だが、こんな感じ。