goauth2 インストール時のエラーについて #golang

Go言語のauth2ライブラリ、goauth2をインストールしようとしたらエラーになったのでメモ。
go get したら以下のエラーが発生。

% go get code.google.com/p/goauth2/oauth
go: missing Mercurial command. See http://golang.org/s/gogetcmd
package code.google.com/p/goauth2/oauth: exec: hg: executable file not found in $PATH

Mercurial を使用しているらしくそれがインストールされていないため、エラーになっていたようです。Mercurialをインストールしたら無事 goauth2 が入りました。

Go言語でのJSONデータ読み込みについて #golang

Go言語でのJSONデータをパースするにはencoding/jsonパッケージのUnmarshalを使います。
XMLの時と同じように、struct定義にjsonデータをマッピングさせることができます。またjsonが階層になっている場合は、下位の構造をstruct定義して、上位側でそのstruct型を定義します。サンプルデータは、Weather Hacksのデータを一部抜粋したものを使用しました。

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

const data = `
{
    "date": "2013-11-06", 
    "dateLabel": "明日", 
    "telop": "晴れ", 
    "temperature": {
        "max": {
            "celsius": "19", 
            "fahrenheit": "66.2"
        }, 
        "min": {
            "celsius": "13", 
            "fahrenheit": "55.4"
        }
    }
}
`

type JsonData struct {
    Date        string        `json:"date"`
    Datelabel   string        `json:"dateLabel"`
    Telop       string        `json:"telop"`
    Temperature Temperature   `json:"temperature"`
}

type Temperature struct {
    Max Max `json:"max"`
    Min Min `json:"min"`
}

type Max struct {
    Celsius    string `json:"celsius"`
    Fahrenheit string `json:"fahrenheit"`
}

type Min struct {
    Celsius    string `json:"celsius"`
    Fahrenheit string `json:"fahrenheit"`
}


func main() {
    jd := new(JsonData)
    err := jd.JsonProc()
    if err != nil {
        log.Fatalf("Log: %v", err)
        return
    }
    fmt.Printf("%v %v: %v  最高気温:%v  最低気温:%v\n", jd.Date, jd.Datelabel, jd.Telop, jd.Temperature.Max.Celsius, jd.Temperature.Min.Celsius)
}

func (p *JsonData) JsonProc() (err error){
    err = json.Unmarshal([]byte(data), &p)
    if err != nil {
        return err
    }
    return nil
}

ramtiga/go-samples・Github

Go言語の Array ライブラリを書いてみた #golang

golang やってます。がしかし ruby をやり始めたころより進みがよくありません。コンパイルエラーで悩んだり等々。
Go言語の組み込みパッケージは充実してるのですが、配列(Array)のライブラリはないので(githubにはあると思いますが)、さくっと直感的に処理を書くことができません。
ということで、Go言語の勉強のために、int用のArrayモジュールを書いてみました。まあそれスライスでやればいいやん、というのもありますが、それは勉強ということで。

ramtiga/go-array · GitHub

使い方は、README.md にあるように、ruby の Array のメソッドっぽく書けます。

import (
    "github.com/ramtiga/go-array"
)

arry := array.IntArray{1, 2, 3, 4, 5}

arry.Length()    // returns => 5
arry.Push(6)     // arry => {1, 2, 3, 4, 5, 6}
arry.Pop()       // arry => {1, 2, 3, 4, 5}
arry.First()     // returns => 1
arry.Last()      // returns => 5
arry.Shift()     // arry => {2, 3, 4, 5}

// other methods  
// Unshift, Concat, Clear, Delete, Delete_at, 
// Index, Index, Reverse, Join, Uniq, Sort

テストもこれくらいなら簡単だったので書いてみた。Push のテストは以下のような感じ。

// Push
func TestPush(t *testing.T) {
    var d IntArray = IntArray{5, 3, 1, 2, 6}
    chk := IntArray{5, 3, 1, 2, 6, 7}
    d.Push(7)
    
    for i, _ := range d {
       if d[i] != chk[i] {
          t.Errorf("result=%v, index=%v", d, i)
       }
    }
}

新しい言語は、とにかく書いて覚えるしかないかなと。
enjoy #golang!!!

Go言語で RSS Feed を取得する

Go言語を最近やっているがまだまだわからないことが多い。とりあえず簡単そうなとこでRSSを取得して表示するものを書いてみた。
RSSlivedoorの Weather Hacks を利用した。

処理の流れ
  • net/http の http.get でXMLデータを取得。
  • http のレスポンスデータを io/ioutil の ReadAll に渡す。
  • 取得するデータを struct 定義して encoding/xml の Unmarshal に渡す。
package main

import (
    "fmt"
    "encoding/xml"
    "net/http"
    "io/ioutil"
    "log"
)
var FEED_URL string = "http://weather.livedoor.com/forecast/rss/area/130010.xml"

type WeatherHack struct {
    Title string `xml:"channel>title"`
    Description []string `xml:"channel>item>description"`
}

func main() {
    wh, err := getWeather(FEED_URL)

    if err != nil {
        log.Fatalf("Log: %v", err)
        return
    }

    fmt.Println(wh.Title)
    for n, v := range wh.Description {
        if n > 0 {
            fmt.Printf("%s \n", v)
        }
    }
}

// Get Weather Hacaks
func getWeather(feed string) (p *WeatherHack, err error) {

    res, err := http.Get(feed)
    if err != nil {
        return nil, err
    }

    b, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return nil, err
    }
    wh := new(WeatherHack)
    err = xml.Unmarshal(b, &wh)

    return wh, err
}

実行結果

$ go run go-weather-xml.go
東京都 - 東京の天気 - livedoor 天気情報
29日(火)の天気は曇時々雨、最高気温は16℃ でしょう。 
30日(水)の天気は晴時々雨、最高気温は23℃ 最低気温は14℃でしょう。 
31日(木)の天気は晴時々曇、最高気温は21℃ 最低気温は13℃でしょう。 
01日(金)の天気は晴時々曇、最高気温は21℃ 最低気温は13℃でしょう。 
02日(土)の天気は晴時々曇、最高気温は21℃ 最低気温は13℃でしょう。 
03日(日)の天気は曇時々晴、最高気温は23℃ 最低気温は15℃でしょう。 
04日(月)の天気は晴時々曇、最高気温は21℃ 最低気温は15℃でしょう。 

ramtiga/go-weather-xml · GitHub

Vim で実行する ruby のバージョンについて

Vim 上で ruby を単純に実行するには、:!ruby % を実行すればよいのですが、たまたま Nokogiri でエラーがでてしまった。

`require': no such file to load -- nokogiri (LoadError)

ターミナルから、ruby hoge.rb は実行できているのに。Vimruby のバージョンを確認すると

f:id:ramtiga:20130905030632p:plain

ruby 1.8.7 だった。rbenv で設定している バージョンが指定されていないようだ。

ググってもなかなか見つからない情弱orz.. やっと見つけた以下の記事。

VimからrbenvのRubyが呼び出せない問題が発生してハマった

感謝です! .zshrc にあった以下の記述を、.zshenv に書かないといけないみたい。

if [ -d ${HOME}/.rbenv ] ; then
  PATH=${HOME}/.rbenv/bin:${PATH}
  export PATH
  eval "$(rbenv init -)"
fi

source ~/.zshenv して再度バージョンを確認すると

f:id:ramtiga:20130905030716p:plain

rbenv で設定しているバージョンが指定されました。

開発環境
  • Mac OSX 10.8.4
  • ruby バージョン管理:rbenv
  • zsh 4.3.11

homebrew での Vim インストール

Mac を Mountain Lion にアップデートして Vim を再インストールしたのでメモ。インストールしたバージョンは 7.3.682。

homebrew でのインストール

以下の記事の通りにインストールする。パッチの数が多いので多少時間がかかる。

Homebrew の Vim formula 書いた – Yarukidenized:ヤルキデナイズド

$ brew install https://gist.github.com/uasi/721952/raw/843b390acb9f86226133ce3e94ed99ee485c494f/vim.rb --enable-interp=ruby --force
・・・
==> ./configure --disable-gui --without-x --disable-gpm --disable-nls --with-tlib=ncurses --enable-multibyte --prefix=/usr/local/Cellar/vim/7.3.682 --mandir=/usr/local/Cellar/vim/
==> make install
🍺  /usr/local/Cellar/vim/7.3.682: 1233 files, 21M, built in 21.1 minutes

インストール先と ruby の確認

$ which vim
/usr/local/bin/vim

$ vim --version | grep ruby
 -python -python3 +quickfix +reltime -rightleft +ruby +scrollbind +signs
Linking: cc   -L.     -L/usr/local/lib -o vim       -lm  -lncurses -liconv -framework Cocoa        -lruby -lobjc

vi コマンドで vim を実行したいので .zshrc に alias を設定する。

alias vi='/usr/local/bin/vim'