Go言語の不満点

Google App Engineでアプリケーションを作りたくてやり始めたGo。
pythonと比較して満足いくスピードで,これなら作りたいものが出来る!と手応えを感じている。

しかし不満点がないわけでない。

例えば

ネットで"go"で検索するとろくなことがない

Goで検索しても目的のものがなかなか見つからない。
目的のものとは程遠いページや画像が紹介されてしまう。

結局「golang」あるいは「go言語」をキーワードにして毎回検索している。
Goはナカナカいい名前だとは思うけどもうすこしひねってもよかったのでは?

C++Pythonでは普通に出来たネット使って調べるという技が使いづらいのはちょっとね…

関数の定義開始にもちいる波括弧 { を関数名の次行に持ってくる事ができない点

これは

func Function() stirng 
{
    return "test"
}

では駄目で,波括弧前に改行をはさまない

func Function() stirng {
    return "test"
}

という形でないと駄目という仕様の事。

この仕様についていろんな所で言われているので今さらここでアレコレ書く気はないけど,
やっぱり改行したいなぁ〜。まぁ慣れてきたけど。

プリプロセッサが使えない点

C++メインで開発している期間が長いから

#ifdef DEBUG
  ....
#endif

とかやりたいんだけどね〜。まぁデバッグ版とリリース版の区分けなどはtestingパッケージを持ちいるべきなかなと最近は受け入れるようになってきたような。

使ってない変数はコンパイルエラー

これはGoの仕様の方が正しいという事は充分に分かってる。
でも個人的にもうすこーしぐらい優しさを出してほしいな。

goはpythonよりどれぐらい高速か?

goとpython数値計算の速度比較を行いました。

比較するのはCG法を使った連立方程式の解法です。

処理内容

処理は大きく分けて2つです。

  1. 連立方程式の作成
  2. 作成した連立方程式をCG法で解く行列計算
    • CG法で解く前の行列に前処理はしない

連立方程式の未知数が400ぐらいの小規模なもので,行列は疎行列です。

環境

速度比較を行った環境は

OS Mac OS X バージョン10.6.8(Snow Leopard)
CPU Intel Core 2 Duo 2GHz
メモリ DDR3 1067MHz 2GB
python バージョン 2.7
go バージョン 1.1

ビルド

pythonの方はあらかじめコンパイルしておきます,pythonコンパイル方法はソースファイルのある場所で

 $ python -m compileall .

goの方は標準のものを使いました。(gccgoは使っていません)

結果

go 0.014秒
python 0.371秒

goの方が25倍以上速いという事になりました。

高知の美丈夫

最近よく飲んでいた日本酒,美丈夫(びじょうふ)。

このお酒は四国の高知県にある酒蔵が作っています。
ちなみに高知県は日本酒を作っている酒蔵が数多く存在する県であり(南や文佳人,土佐しらぎくなんかが有名ですね),加えて毎年多くの蔵が日本酒の品質を評価する鑑評会で金賞を受賞しているという素晴らしい県です。

美丈夫は高知の酒の中でもかなり有名で,地酒でおしている居酒屋にいけば置いてある事も多いと思います。

ちなみに僕が愛飲していたのは美丈夫の夏酒です。
[rakuten:yamasake:10003730:detail]

吟醸酒でもないのに,注ぐとフルーティーな香りが広がります。
味はキリっとしたやや甘でいてキレのよい後味。ただアルコールによる若干のピリピリ感を喉に感じます。


ところで,この美丈夫は最近,JAL のファーストクラスに採用されました。(詳しくは下記のリンクを見てください)
JALの告知

個人的には日本酒の中でJALのファーストクラス機内酒に採用された物はいい酒だと思っています。


最後に,美丈夫とはイケメンって意味です。

go言語についてメモ

最近GoogleAppEngineのアプリを趣味で作っています。
使っている言語はgoogleが提供しているgo言語。

go言語はほかの言語と結構違うのでアレ?どうするんだっけ?的な事が多いです。

そこで個人的な備忘録をブログに。

リテラル

配列や構造体のリテラルは型名の後に{ }で囲んでデータを書いていきます。(データの区切りは普通にカンマ)

たとえばint型の配列なら

 array := [...]int{1,2,3,4}

※スライスなら[...]ではなく[]

構造体なら,

 data := DataName{1.0, 2.0}

入れ子の構造体なら

 data := DataName1{1.0, DataName2{1,0}}

実行

main.goというファイルに書かれたプログラムを実行するならgoというコマンドの引数にrunを指定します。

 $ go run main.go

この場合exeファイルはできません。

newは括弧ではさむ

 data := new(型名)

いらない変数はアンダーバーで

配列の要素を一個ずつ取り出してくれるrange関数は便利だけどインデックスはいらない,しかしgoだといらない変数が宣言されていると怒られます。

そんな時はアンダーバーでいらない戻り値を受け取っておきます。

 for _, obj := range(array) {
 }

rangeはコピーが渡される

for index, obj := range( {...} ) {
}

このfor文でobjに値を代入してももとのデータには何の影響もない
rangeは第二戻り値にコピーが渡される。

神田界隈で

最近は飲み相手との交通の都合上,神田界隈で飲むことが多い。
駅で言ったら御茶ノ水,神保町,小川町あたり。

で,いろいろな居酒屋を知ったので,特に気に入った居酒屋を3つほど紹介しようかと
まあ自分は飲み=日本酒+和食なんで,そういうお店しか書きませんが。

1. 酔の助(よのすけ)
神保町の駅から出て,靖国通りを一本裏道に入った場所にあります。
ここは割と雑誌やTV等にも登場している居酒屋なので知っている方も多いかな。
料理はどれも美味しいですね〜。
刺身,酢の物,炒め物,揚げ物なんでもいけます。
値段も都心にしては優しい。
日本酒は都内では珍しい広島の銘酒,本州一が置いてありました。
(本州一はIWCのサケ部門でも上位に入るなかなか美味しいお酒です)

そういえばドラマ相棒にもでてましたよ!


2. Good One
この店は小川町近くにある日本酒バー。
人気の銘柄,鳳凰美田や飛露喜,鶴齢,寫樂などの日本酒が800円ぐらいで飲めます。
量は1合(180mlです)。
安い!
山手線内側でこれほどリーズナブルな所は知らないです。
しかし半合の注文は店としてNGです…。
種類も豊富なんで三,四人で行ってみんなでまわし飲みがいいかも

僕がここで飲んだお酒は鳳凰美田や鍋島,寫樂に鶴齢など。
人気の銘柄が沢山あって嬉しかったですね〜
保存状態も良好です。
ただ,長野の銘柄は無い…なんでも店主的にピンとこないそうで。
(水尾や御湖鶴とか良い銘柄が一杯あるのですが…)

それとバーなので料理はあまりありません,二軒目に行くお店って感じですね。

3. さらさら
神田にあるお店で靖国通りから裏手通りの坂道を登ると地下一階にあります。
看板に銘酒と書いてあるだけあってな素晴らしいラインナップ。
ただグラスで800円ぐらいだったのでGood Oneと比べると若干割高ですねかね〜。
しかし僕が行く時は上品なお客さんばかりで落ち着いて飲めるのが素敵です。

Windowsマシンでpythonを使ってutf-8のBOM付きファイルを触る

相変わらずpython文字コードの扱いを腰を据えて勉強しないまま公私共にpythonをガンガン使っているんだが…
当然のように文字列処理でちょこちょこ詰まります。(文字コードの扱いをしっかりやってないので当たり前ですね)


この前はまったのはutf-8形式のテキストファイルにBOMと呼ばれる情報があった場合はpythonでは素直にやっていたのでは読み込めない件。

どういう事かというと…
まずBOMとはバイト・オーダー・マークの略で,Unicodeのデータの先頭数バイトに存在してデータの種類を表すもの。
ところが,符号単位を8bitにとるutf-8はその形式上バイト・オーダー・マークが必要ない。
フォーマットのルールとしては,あっても無くても構わない的な感じになっている。

それは,つまりutf-8のデータの先頭に0xEF, 0xBB, 0xBFというバイト・オーダー・マークがあったりなかったりするという事となる。

で,pythonutf-8のファイルに対してバイト・オーダー・マークは無いものとして扱う。というかあったら駄目的な…
rubyとかはあってもなくても構わない的な扱い)
逆にMicrosoft社なんかは律儀にutf-8のデータにはバイト・オーダー・マークをしっかり入れてくれている。

そんなわけでWindows上では特に,テキストファイルを単純にutf-8で読み込んで表示させようとするとこんなエラーが出やすい。

 UnicodeEncodeError: 'cp932' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

解決策として,読み込む側のpythonのコードをこんな感じにしてあげればOK

def GetFileTextArray(path):
    import codecs
    text_array = []
    for line in codecs.open(path,"r",'utf-8-sig')
       text_array.append(line)
    return text_array

解決策は実にシンプルでcodecsライブラリの方にutf-8-sigを指定してあげる。
そうすると"あっても無くても"いいように読み込んでもらえる。

Snow Leopardにアップグレード

プライベートで使っているMacBook,買ったのはもう随分前です。快適に使っていたのですがOS Xのバージョンは10.5系。さすがにキツくなって来ました〜。
いろんなソフトがインストールできない状態です。

それでもだましだまし使っていたんですが,先日GO言語をやろうと手を出したらインストーラーに弾かれてしまいました。

強引に入れてみようとしたんですが共有ライブラリのロードの時点で弾かれていてどうにもできない状態。どうも10.6以降じゃないと入っていない物とかあるみたい。

そこで腹を決めてOS Xのバージョンアップを。

とりあえず10.6系のSnow Leopardってまだ売ってるの?ってところから始めたんですが,売ってますね!普通にネットを使ってアップルストアで注文出来ました。

手に入れたSnow LeopardのCDをMacBookのドライブにいれて起動してみるとSnow Leopardのインストール…あれ?インストール?アップデートってないの?

ネットでいろいろ見ましたがアップデートもインストールを選べば良いみたいなので,そのまま実行し無事アップデートできました。Emacsなどはそのまま使えて一安心だしデータも消えませんでした。
その後,Core 2 Duoだったので64bit起動にしました〜


アップグレード後に挙動不審になってしまったのはmac portsだけでしたね。こちらは素直にuninstallしてもう一度はじめから入れなおしました(pythonSubVersionぐらいなんでそこまで時間はかかりませんでした)。