2014/03/10


このエントリーをはてなブックマークに追加
Twitter / ymmt2005: むう、mime/multipart の ...

むう、mime/multipart の CreateFormFile の Content-Type は application/octet-stream 固定になっている。泣ける。。#golang https://code.google.com/p/go/source/browse/src/pkg/mime/multipart/writer.go#128

https://twitter.com/ymmt2005/status/431143170659717120
ファイルから multipart.CreateFormFile を呼ぶと io.Writer が返ります。この writer は隠ぺいされているのでパートのヘッダを書き換える事は出来ません。
この場合は multipart.CreatePart を使います。
package main

import (
    "bytes"
    "io"
    "log"
    "mime/multipart"
    "net/textproto"
    "os"
)

func main() {
    var b bytes.Buffer
    w := multipart.NewWriter(&b)
    part := make(textproto.MIMEHeader)
    part.Set("Content-Type""application/vnd.ms-excel")
    part.Set("Content-Disposition"`form-data; name="file"; filename="Foo.xlsx"`)
    pw, err := w.CreatePart(part)
    if err != nil {
        log.Fatal(err)
    }
    f, err := os.Open("Foo.xlsx")
    if err != nil {
        log.Fatal(err)
    }
    io.Copy(pw, f)
    w.Close()

    b.WriteTo(os.Stdout)
}

2014/02/19


このエントリーをはてなブックマークに追加
最強というか、正直懐かしい感じではありますが...
まず mpd と mpc と podget を入れましょう。
$ sudo apt-get install mpd mpc podget
そして ~/.podget/serverlist に rebuild.fm を足しましょう。
http://feeds.rebuild.fm/rebuildfm Rebuild
crontab で自動起動します。
0 0 * * * /usr/bin/podget -s
Ubuntu の場合 /usr/lib/mpd にファイルを置く事になるので
$ sudo usermod -aG audio `whoami`
として書き込み権限を得た後
$ sudo ln -s ~/POD/Rebuild /usr/lib/mpd/Rebuild
シンボリックリンクを張りましょう。
次に mpd のインデックスを自動更新にしましょう(コメントを外す)。
auto_update "yes"
これだけで Linux や OSX 環境では聞ける様になったので Music Player Daemon プロトコル対応のプレーヤさえ探してくれば再生出来ますし、mpd なので何処からでも誰でも(パスワード設定可能)音楽を鳴らせます。mpd はサーバで音を鳴らす代物なので会社のBGMサーバなんかにいいんじゃないかなーとか思います。
また audio_output を httpd にすればストリーミング配信出来るので別の端末でも再生出来ます。
audio_output {
    type        "httpd"
    name        "My HTTP Stream"
    encoder     "vorbis"        # optional, vorbis or lame
    port        "8000"
    #quality        "5.0"           # do not define if bitrate is defined
    bitrate     "128"           # do not define if quality is defined
    format      "44100:16:1"
}
こうしておけば http://localhost:8000/mpd.ogg でストリーミング再生出来ますし、bind_to_address をネットワークアドレスに設定して MPDroid 入れれば、いつでもどこでも Rebuild.fm が聞けますね。この環境、一度作っておくと上記の mpd のフォルダに適当に mp3 ファイルを放り込んでおけば自宅を出ても MPDroid で聞ける様になります。

Rebuild.fm 関係ないですねそうですね。


ちなみに...

golang で rebuild.fm クライアント書いてますんで、使いたい人はどうぞ。
mattn/rebuildfm - GitHub
https://github.com/mattn/rebuildfm
あと vim 版もあります。
mattn/ctrlp-rebuildfm - GitHub
https://github.com/mattn/ctrlp-rebuildfm


このエントリーをはてなブックマークに追加
大量にあるファイルのファイル名を一括で変更する場合、どうしても GUI での操作であったりマッチパターンを書くのが面倒だったりしましたが、massren を使えば誰でも簡単にファイル名の一括置換が出来る様になります。
laurent22/massren - GitHub

massren - Easily rename multiple files using your text editor

https://github.com/laurent22/massren
お気に入りのテキストエディタを使って、好きな様にファイル名を変更出来ます。サポートしているOSは Windows, Linux, OSX です。中身は golang で書かれています。
それぞれバイナリが用意されているので自分でビルドする必要はありません。Linux と OSX の人はリンク先にある手順を、Windows の人は専用ページからダウンロード出来ます。
起動する前にエディタを設定しましょう。
$ massren --config editor vim
そしてファイル名を一括変更したい場所に移動して massren を起動します。エディタ内にファイルの一覧が書かれているので、vim やお気に入りのテキストエディタで好きな様に編集します。
最後に書き込んでエディタを終了すればファイル名が変更されています。
massren
Windows であれば
$ massren /n
OSX や Linux では
$ massren -n
で dry-run モードで起動出来ます。また引数にディレクトリやワイルドカードなファイル名も指定出来ます。
めちゃめちゃ便利ですね。

2014/02/13


このエントリーをはてなブックマークに追加
先日、Go言語バージョン1.1がリリースされました。安定しているのは勿論、幾つか新機能が追加されましたが、何よりもパフォーマンスチューニングが施された一番嬉しいですね。
Go 1.1 performance improvements | Dave Cheney

This is the first in a series of articles analysing the performance improvements in the Go 1.1 relea...

http://dave.cheney.net/2013/05/21/go-11-performance-improvements
さて今日はVimを使ってGo言語を開発する方法を紹介したいと思います。
VimでGo言語を開発するには、Go言語のリポジトリに含まれる misc/vim にランタイムパスを追加します。以下を vimrc に追加します。
set rtp+=$GOROOT/misc/vim

入力補完を行う

入力補完として gocode を入れます。正直、これは必須と言っていいです。
$ go get github.com/nsf/gocode
を実行します。$GOPATH/bin にインストールされるのでパスを通しておきましょう。
$GOROOT に入ってしまった人は一度削除して、$GOPATH を設定後にもう一度、上記のコマンドを実行します。
$GOPATH にインストールされているはずなので以下の様にvimrcに追加します。
exe "set rtp+=".globpath($GOPATH"src/github.com/nsf/gocode/vim")
gocodeを入れると、パッケージ名の途中であったり変数の後の "." をタイプした後<c-x><c-o> をタイプすると、あり得る関数名や、メソッド名がずらずらーっと補完出来ます。
gocode
その際、completeopt というオプションに preview を足しておくと、補完内容が詳細に表示されて分かりやすくなります。
set completeopt=menu,preview

パッケージをインポートする

Go言語でも、欲しい機能があればパッケージをインポートします。その際、いちいちファイルの先頭に移動して、import を追加したりしてませんか?上記のオフィシャルが提供しているVimプラグインを使っているのであれば、以下の様に実行しましょう。
:Import fmt
before
package main

func main() {
    fmt.Println("hello world")
}
after
package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}
カーソルの移動もありませんので、引き続きコーディングが再開出来ます。また、コマンドの引数でパッケージ名の補完が効きます。net/ht までタイプして <tab> をタイプすれば net/http を補完してくれますし、ありえる候補も補完してくれます。

ドキュメントを見る

Go言語には godoc というツールが付属しています。コマンドラインから使っても便利なのですが、Vimから使うともっと便利になります。
:Godoc net/http
godoc

:Import と同様にパッケージ名が補完出来ます。

整形する

Go言語には go fmt というコマンドが付属しており、相応しいソースに整形する事が出来ます。
インデントが崩れたりした場合でも
:Fmt
を実行するだけで、綺麗なソースコードに整形されます。

テンプレートを使う

手前味噌ですが、僕が作ってる sonictemplate-vim を使うと、ソースの書き始めが一気に楽になります。
mattn/sonictemplate-vim - GitHub
https://github.com/mattn/sonictemplate-vim
これを bundle ディレクトリ等に入れておき、goのファイルを新規で開きます。そこで
:Template web-app
を実行すれば以下のコードが展開されます。
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/"func (w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "")
    })
    http.ListenAndServe(":8080"nil)
}
この後、http.ListenAndServe(":8080", nil) の1行上で空行を開け、:Template <tab> をタイプすると、web-app に特化した候補が優先的に表示されます。
sonictemplate
sonictemplate-vim はGo言語だけでなく、他の言語でも同様に便利なテンプレートが用意されています。よろしければ使ってみて下さい。また pull-req によるテンプレートの追加もお待ちしています。

これだけあれば、この夏のビーチでモテモテ間違いなしですね!

基礎からわかる Go言語 基礎からわかる Go言語
古川 昇
シーアンドアール研究所 / ¥ 2,376 (2012-11-21)
 
発送可能時間:在庫あり。