2012/11/19


redmineをwebで使っていると色々とイライラする事が多く、どうしてもコマンドラインから操作したくなった。
しかしコマンドラインから redmine を操作できる物で気に入った物が無かったのでGo言語で自作するに至った。まずライブラリ
mattn/go-redmine - GitHub
https://github.com/mattn/go-redmine
残念ながら API は全て出揃ってなくて対応状況は以下の様な感じ。
API Implements
Issues 100%
Projects 100%
Project Memberships 100%
Users 0%
Time Entries 100%
News 100%
Issue Relations 100%
Versions 0%
Wiki Pages 0%
Queries 0%
Attachments 0%
Issue Statuses 100%
Trackers 100%
Enumerations 100%
Issue Categories 100%
Roles 100%
Groups 0%
とりあえず issues 関連は出来てるので、これを使うコマンドラインプログラムを書いた。 $ go get github.com/mattn/go-redmine/godmine 名前は中二病っぽいけど「godmine」という名前にした。
使い方は、例えば issue の一覧であれば $ godmine issue list もしくは $ godmine i l issue の登録は $ godmine issue create "なんてこった" "大変だ!" みたいにするか $ godmine issue append で起動するテキストエディタ(環境変数EDITORを参照しunix改行コードが扱えるテキストエディタのみ使用可能)で ### Subject Here ###
### Description Here ###
上記の部分を書き換えて保存終了する。
設定ファイルは ~/.config/godmine/settings.json に(Windows では %APPDATA%/godmine/settings.json) {
    "endpoint""http://redmine.example.com",
    "apikey""アクセスキー",
    "project"1
}
の様に書く。Project Id は URL から調べて下さい。なお、環境変数 GODMINE_ENV を「foo」に設定すると「settings.foo.json」が読まれるので、複数のプロジェクトを扱う場合は $ GODMINE_ENV=foo godmine issue append とうい感じに使える。以下現状サポートしてるコマンド
gotmine [arguments]

Project Commands:
  add      a create project with text editor.
             $ godmine p a

  create   c create project from given arguments.
             $ godmine p c name identifier description

  update   u update given project.
             $ godmine p u 1

  show     s show given project.
             $ godmine p s 1

  delete   d delete given project.
             $ godmine p d 1

  list     l listing projects.
             $ godmine p l

Issue Commands:
  add      a create issue with text editor.
             $ godmine i a

  create   c create issue from given arguments.
             $ godmine i c subject description

  update   u update given issue.
             $ godmine i u 1

  show     s show given issue.
             $ godmine i s 1

  delete   d delete given issue.
             $ godmine i d 1

  close    x close given issue.
             $ godmine i x 1

  notes    n add notes to given issue.
             $ godmine i n 1

  list     l listing issues.
             $ godmine i l

Membership Commands:
  show     s show given membership.
             $ godmine m s 1

  list     l listing memberships of given project.
             $ godmine m l 1

User Commands:
  show     s show given user.
             $ godmine u s 1

  list     l listing users.
             $ godmine u l
管理者権限があればプロジェクトを消す事も出来ます。なんて怖い!
issue の close(x) は、ステータス一覧の先頭から見て close にチェックされている最初のステータスで issue を閉じます。
元はと言えば Windows で ruby の動作が遅すぎるのが嫌で作り始めましたが、linux でも動きます。

まだ作り始めたばかりなので、欲しい機能があれば入れていくつもりです。

基礎からわかる Go言語 基礎からわかる Go言語
古川 昇
シーアンドアール研究所 単行本(ソフトカバー) / ¥1 (2012年11月21日)
 
発送可能時間:


アジャイルサムライ−達人開発者への道− アジャイルサムライ−達人開発者への道−
Jonathan Rasmusson, 西村 直人, 角谷 信太郎, 近藤 修平, 角掛 拓未
オーム社 単行本(ソフトカバー) / ¥2,720 (2011年07月16日)
 
発送可能時間:

Posted at by



2012/11/07


livedoor Techブログ : 自家製 #isucon2 のつくりかた

先日ISUCON2は幸いにも大好評のうちに終了しましたが、このお題および関係する話題をぜひ多くの人にも知っていただきたい! というかこのまま捨てるとかちょっともったいない! ということもあり、作業対象のアプリケーションコード、およびベンチマークツール一式を公開しています。

http://blog.livedoor.jp/techblog/archives/67728751.html
Go言語が途端に書きたくなったので、Go言語で isucon2 書いてみた。
WAF として web.go を使ってますが、go get を実行すれば勝手にインストールされます。
mattn/go-isucon2 - GitHub

isucon2 written in go

https://github.com/mattn/go-isucon2
作ったばっかりなので、ベンチマーク取ったりはしてません。これからします。
興味のある方どうぞ。
Posted at by



2012/10/23


手軽に使える forward http proxy : stone, Tinyproxy - 酒日記 はてな支店

直接グローバルに繋がる経路をもたないホストから http アクセスしたいので http proxy を使いたい。Squidは定番ですが、もう少し手軽なのはなにかないかと思っていたところ twitter で教えていただきました。

http://d.hatena.ne.jp/sfujiwara/20121023/1350990163
本題からそれますが、go言語で小さいプロキシを使う場合に僕がお勧めしたいのが goproxy です。
elazarl/goproxy - GitHub

An HTTP proxy library for Go

https://github.com/elazarl/goproxy
goproxy 自身は実は実行モジュールを提供していません。ですので goproxy を使った実行モジュールは自分で作ります。
package main

import (
    "github.com/elazarl/goproxy"
    "log"
    "net/http"
)

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true
    log.Fatal(http.ListenAndServe(":8080", proxy))
}
このソースを proxy.go という名前で保存して、go build proxy.go とすれば実行モジュールが出来上がります。
ポートを変えたいであったり、監視機能を付けたいという人は勝手にソースを弄ります。
goproxy はプログラマブルなプロキシです。なので例えば package main

import (
    "github.com/elazarl/goproxy"
    "log"
    . "net/http"
    "regexp"
    "time"
)

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true
    re := regexp.MustCompile(`^(www\.)?2ch\.net/?`)
    proxy.OnRequest(goproxy.UrlMatches(re)).DoFunc(
        func(r *Request, ctx *goproxy.ProxyCtx) (*Request, *Response) {
            h,_,_ := time.Now().Clock()
            if h >= 9 && h <= 18 {
                return r,goproxy.NewResponse(r,
                    goproxy.ContentTypeText, StatusForbidden,
                    "就業時間中です。通報しました。")
            }
            return r, nil
    })
    log.Fatal(ListenAndServe(":8888", proxy))
}
こう書けば就業時間中の2ch閲覧禁止を行うプロキシが出来上がります。もちろん外部の設定を参照して制御を行うのも良いと思います。
また squid の様にキャッシュする事で高速に動作させる事も出来るかと思います。オリジナルのプロキシを作ってみたいという方は試してみる価値あるかと思います。

プログラミング言語Goフレーズブック プログラミング言語Goフレーズブック
David Chisnall, デイビッド・チズナール, 柴田 芳樹
ピアソン桐原 単行本(ソフトカバー) / ¥153 (2012年10月04日)
 
発送可能時間:

Posted at by