Install Theme

Your web-browser is very outdated, and as such, this website may not display properly. Please consider upgrading to a modern, faster and more secure browser. Click here to do so.

タンブラー?

Big Sky

6月 19 '13

Google Chrome を更新したら「最近閉じたタブ」が表示されなくなる問題の解決方法

Google Chrome を使っていて「新しいタブ」を開き、右下にある「最近閉じたタブ」で閉じてしまったタブを復帰させる事が良くあります。

recent closed tab
Google Chrome Dev Channel を使っているのですが、どうやら Google Chrome をアップデートするとこのツールバー自身が消えてなくなる様なのです。この機能のヘビーユーザだったのでかなり困りました。
いろいろ調べたところ、どうやら以下の設定で直す事が出来る事が分かりました。
  1. chrome://flags/#enable-instant-extended-api を開く
  2. 設定を「規定」から「無効」に変更する。
  3. ブラウザを再起動する。
この3手順で、以前と同じツールバーで「最近閉じたタブ」が表示される様になりました。


from Big Sky http://bit.ly/11LtQWv

6月 11 '13

Vim で幅跳び

先日、某所で何人かに遊んで貰ったので、ここにも書いて皆に遊んでもらおうと思います。

mattn/habatobi-vim - GitHub
http://bit.ly/19jshrA
:Habatobi
を実行すると起動します。j と k を交互にタイプすると走り出すので jkjkjkjkjkjkjkjk… とタイプして下さい。
赤い線の前でスペースキーをタイプするとジャンプします。
記録が出て、どうこうなる訳ではないですが息抜きのつもりでどうぞ。


from Big Sky http://bit.ly/13T7XaH

2 リアクション

5月 31 '13

Vimを使ったGo言語開発手法

先日、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://bit.ly/13m05y9
さて今日はVimを使ってGo言語を開発する方法を紹介したいと思います。
VimでGo言語を開発するには、Go言語のリポジトリに含まれる misc/vim にランタイムパスを追加します。以下を vimrc に追加します。
exe “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 と同様にパッケージ名が補完出来ます。

テンプレートを使う

手前味噌ですが、僕が作ってる sonictemplate-vim を使うと、ソースの書き始めが一気に楽になります。
mattn/sonictemplate-vim - GitHub
http://bit.ly/KTmuy6
これを 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,310 (2012-11-21)
 
発送可能時間:通常1~4週間以内に発送



from Big Sky http://bit.ly/13m05ye

1 リアクション

5月 14 '13

cpp-netlib と picojson で lingr bot 書いた。

おしょうさんのを盛大にパクった。罪悪感はない。
netlib で HTTP Server を書いてみた - C++でゲームプログラミング

netlib で HTTP Server を書いてみた Boost . Asio だけだとしんどそうだったので netlib でちょっと書いてみました。 [環境] netlib 0…

http://bit.ly/14cxYSD
mattn/cpp-lingrbot - GitHub
http://bit.ly/10vI39h
#include <boost/network/include/http/server.hpp>
#include <picojson.h>

struct cpp_bot {
  typedef boost::network::http::server<cpp_bot> server;

  void
  operator ()(server::request const &request, server::response &response) {
    namespace http = boost::network::http;
    typedef server::string_type string;
    string body = request.body;
    std::ostringstream data;

    std::cout « body « std::endl;
    picojson::value v;
    string err;
    picojson::parse(v, body.begin(), body.end(), &err);
    if (!err.empty()) {
      response = server::response::stock_reply(
        server::response::bad_request, “invalid request”
      );
      return;
    }

    if (!v.is<picojson::object>()) {
      response = server::response::stock_reply(
        server::response::bad_request, “invalid request”
      );
      return;
    }
    picojson::array arr;
    picojson::object obj;
    
    obj = v.get<picojson::object>();
    v = obj[“events”];
    if (!v.is<picojson::array>()) {
      response = server::response::stock_reply(
        server::response::bad_request, “invalid request”
      );
      return;
    }

    arr = v.get<picojson::array>();
    BOOST_FOREACH(auto x, arr) {
      if (!x.is<picojson::object>()) {
        continue;
      }
      picojson::value message = x.get<picojson::object>()[“message”];
      if (!message.is<picojson::object>()) {
        continue;
      }
      picojson::value text = message.get<picojson::object>()[“text”];
      if (!text.is<string>()) {
        continue;
      }
      string str = text.get<string>();
      if (str.find(“cpp”0) != string::npos) {
        data « “くぴぴ\n;
      }
    }

    std::string ret = data.str();
    size_t e = ret.find_last_not_of(“ \t\r\n);
    if (e != string::npos) {
      ret = string(ret, 0, e);
    }
    response = server::response::stock_reply(
      server::response::ok, ret
    );
  }

  void
  log(…){
    
  }
};


int
main(){
  typedef cpp_bot::server server;
  
  auto address = “localhost”;
  auto port = “11614”;
  try{
    cpp_bot handler;
    server server_(address, port, handler);
    server_.run();
  }
  catch(std::exception& e){
    std::cout « e.what() « std::endl;
    return 1;
  }

  return 0;
}
cpp という単語が含まれた発言に反応して「くぴぴ」と80年代アニメ風に応答します。

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
スコット・メイヤーズ
ピアソン・エデュケーション / ¥ 3,990 (2006-04-29)
 
発送可能時間:在庫あり。



from Big Sky http://bit.ly/10vI11g

5月 8 '13

Go言語で動く mobirc、gomirc で携帯からIRCしよう。

以前から携帯から IRC する手段として mobirc を使ってきたのだけど、使ってるサーバのリソースが少なすぎてちょくちょく困ってました。
「これ、Go言語で書いたらパフォーマンスも出るし、使用リソースも減るし万々歳じゃね?」というアホの一つ覚えみたいな動機で作り始めました。

mattn/gomirc - GitHub
http://bit.ly/10hLa4K
mobirc とほぼ同等の機能が動きます。
  • 複数ネットワーク
  • クリッカブルリンク
  • 画像インライン表示
  • 新着件数表示
  • ログイン機能
iPhoneビューも付いてます。
gomirc
あと、バックログ機能が付いてましてサーバを再起動したい場合は CTRL-C すると backlog.json というファイルに最新100件のバックログが保存されます。
config.json は以下の様に記述します。
{
    “irc”: [
        {
            “name”“freende”,
            “host”“irc.freenode.net:6668”,
            “user”“my-username”,
            “password”“my-password”,
            “channels”: [“golang-nuts”]
        },
        {
            “name”“perl”,
            “host”“irc.perl.org:6668”,
            “user”“my-username”,
            “password”“my-password”
        }
    ],
    “web”: {
        “addr”“:5004”,
        “password”“dankogai”
        “root”“/mobirc/”,
        “backlog””./backlog.json”,
        “keywords”: [“dan”“kogai”]
    }
}
root が指定出来るので、サブディレクトリにインストールしたい人も安心設計。
ちゃんと計測していませんが、perl 版を使っていた頃に比べて top の RSS が 2/3 程度に減りました。
あと先日書いた lingr-ircd を使えばこの gomirc からも扱えますし
mattn/go-lingr - GitHub
http://bit.ly/10wnwDc
znc を使えば複数のネットワークを束ねる事も出来ます。
znc
これで何時でも何処でも IRC 出来る様になりますね。よろしければどうぞ。
pull リクエストもお待ちしております。


from Big Sky http://bit.ly/10hLd0a

5月 8 '13

gomon と goalert で快適Go言語開発

ディレクトリを監視して、変更があれば指定のコマンドを実行してくれるツール gomon を c9s さんが作ってくれました。

c9s/gomon - GitHub
http://bit.ly/Yo6lFq
この gomon を活用すべく goalert というツールを作りました。
mattn/goalert - GitHub
http://bit.ly/17L1jWl
これらを組み合わせて
$ gomon . — goalert go build -x
とやっておくと、ソースの修正に伴い goalert が起動し、goalert が go build を実行します。結果としてエラーになった場合は、goalert が Growl サーバに結果を投げてくれます。
goalert
めっちゃ便利になりました。
基礎からわかる Go言語基礎からわかる Go言語
古川 昇
シーアンドアール研究所 / ¥ 2,310 (2012-11-21)
 
発送可能時間:在庫あり。



from Big Sky http://bit.ly/18t19Ey

5月 2 '13

jvgrep を iconv 非依存にした。

日本語向け grep コマンド、jvgrep は今まで go-iconv という cgo を使った iconv モジュールに依存していたのだけど、mahonia というキャラクタセットライブラリを使って非依存にした。
mattn/jvgrep - GitHub
http://bit.ly/YohcSa
mahonia - Mahonia character-set conversion library for Go - Google Project Hosting

Mahonia is a character-set conversion library implemented in Go. All data is compiled into the execu…

http://bit.ly/XEkxfq
jvgrep 自体はちょっとファイルサイズが大きくなったけど、ランタイムだと iconv が乗らなくなる分だけメモリ使用量は減ったし、なによりポータブルになった。
ただし mahonia には cp932 などのエイリアスが無いので、JVGREP_ENCODINGS 環境変数を指定していた方は、cp932 を sjis に直す必要があります。

今のところ、dev ブランチですが数日以内には master へブランチにマージします。


from Big Sky http://bit.ly/YohcSc

4月 26 '13

gcc は関数の引数評価順序を最適化する。

昨日、とある場所でこんな話で盛り上がった。

逆ポーランド計算機を作ろうと思ったんだけど、どうも結果が期待通りにならない。
ソースコードを見せて貰うと以下の様なコードだった。
#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 100

int stack[MAX_SIZE];
int stack_pointer = 0;

void push(int data){
  stack[stack_pointer++] = data;
}

int pop(){
  return stack[—stack_pointer];
}

int pop1(int n){
  printf(“pop %d\n, n);
  return stack[—stack_pointer];
}


int main(void){
  char s[MAX_SIZE];
  int a, b;

  while( scanf(%s, s) != EOF ){
    switch (s[0]) {
    case ’+’:
      push(pop() + pop());
      break;
    case ’-‘:
      /*
       * “3 4 -“などを与えると
       * -1ではなく1となってしまう
       * push(-pop() + pop());
       *
       */
      a = pop();
      b = pop();
      push(b - a);

      break;
    case ’*’:
      push(pop() * pop());
      break;
    default:
      push(atoi(s));
      break;
    }
  }
  printf(%d\n, pop());

  return 0;
}
このコードはちゃんと動作する。足し算と掛け算は間違いなく動作するだろう。でもコメント部に書いてあるコードを有効にすると結果が変わる。
push(-pop() + pop());
もちろん皆さん知ってはいるだろうが、これはスタックから取り出す順に依存する。このコードを書いた人は「3 4 -」という入力を「3 - 4」として処理したいが為に、先に4を取り出して符号を逆転し、3を取り出して加算する事で-1を得るという動作を期待した。
引数の評価順が左から右である事を期待したんですね。
push(-4 + 3);
しかしこれをgccでコンパイルして実行すると結果は -1 ではなく 1 が得られるんです。
なんと gcc は上記のコードを
push(pop() - pop());
に戻してコンパイルしてるんです。試しに pop1.c
#include <stdio.h>

int a[] = {34}, p = sizeof(a) / sizeof(a[0]);

int
pop() {
  return a[—p];
}

int
main(int argc, char* argv[]) {
  printf(%d\n, -pop() + pop());
  return 0;
}
pop2.c
#include <stdio.h>

int a[] = {34}, p = sizeof(a) / sizeof(a[0]);

int
pop() {
  return a[—p];
}

int
main(int argc, char* argv[]) {
  printf(%d\n, pop() - pop());
  return 0;
}
上記 pop1.c と pop2.c を「gcc -S」でアセンブリ出力して比較して見たら全く同じ出力内容になりました。
    .file   “pop1.c
.globl a
    .data
    .align 4
    .type   a, @object
    .size   a8
a:
    .long   3
    .long   4
.globl p
    .align 4
    .type   p, @object
    .size   p4
p:
    .long   2
    .text
.globl pop
    .type   pop, @function
pop:
    pushl   %ebp
    movl    %esp, %ebp
    movl    p, %eax
    subl    $1, %eax
    movl    %eaxp
    movl    p, %eax
    movl    a(,%eax,4), %eax
    popl    %ebp
    ret
    .size   pop, .-pop
    .section    .rodata
.LC0:
    .string ”%d\n
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    pushl   %ebx
    subl    $28, %esp
    call    pop
    movl    %eax, %ebx
    call    pop
    movl    %ebx, %edx
    subl    %eax, %edx
    movl    $.LC0, %eax
    movl    %edx4(%esp)
    movl    %eax, (%esp)
    call    printf
    movl    $0, %eax
    addl    $28, %esp
    popl    %ebx
    movl    %ebp, %esp
    popl    %ebp
    ret
    .size   main, .-main
    .ident  ”GCC: (GNU4.4.7 20120313 (Red Hat 4.4.7-3)”
    .section    .note.GNU-stack,”“,@progbits
最適化オプションは付けていないので、デフォルトの動作としてこうなります。gcc のバージョンは 4.7.2 です。
この最適化をやめるオプションを軽く探してみましたが見つけられませんでした。
これ、実は clang や MSVC だとこの最適化は行われなくて左から評価が行われる為、どちらも結果は -1 となります。
これは僕の推測なのですが、gccはたぶん、-pop+pop について
  1. 左pop
  2. 符号逆転
  3. 右pop
  4. 加算
という処理ををコンパイル時に最適化して pop-pop にする事で
  1. 本来右pop
  2. 本来左pop
  3. 加算
という風に手数を減らしてるんじゃないかと思ってます。
int
main(int argc, char* argv[]) {
  int c = 1;
  printf(%d\n, -pop()*c + pop());
  return 0;
}
こうすれば評価順をちょっとだけ強制できるけど、これも最適化次第では消されてしまうかもしれないしなによりダサい。 もちろんC言語において関数引数の評価順序は規定されていないし、本来こういう呼び出し方はしてはいけないのは皆さん知ってはいると思います。多くの人はこの問題には直面しないでしょう。
C/C++関数引数の評価順序 - yohhoyの日記

プログラミング言語C/C++では、関数実引数の評価順序は未規定(unspecified)となっている。

http://bit.ly/15TByF4
しかしながら論理演算は左から右に評価される事を期待している為、この様な副作用のあるコードを書くと処理系によっては足をすくわれる事になるという、なんとも面白い事例でした。

気になったので他の言語ではどうなのか調べてみましたが
perl も
my @a = (34);
print ((-pop @a) + (pop @a));
ruby も
a = [34]
puts (-a.pop + a.pop)
python も
a = [34]
print (-a.pop() + a.pop())
javascript も
log = typeof console != ‘undefined’ ? console.log : print;
var a = [12];
log(-a.pop() + a.pop());
java も
import java.util.Stack;

public class poptest {
    public static void main(String[] args) {
        Stack<Integer> st = new Stack<Integer>();
        st.push(1);
        st.push(2);
        System.out.println(-st.pop() + st.pop());
    }
}
vim script も(誰も聞いてない)
let s:a = [34]
functions:pop()
  let r = s:a[-1]
  let s:a = s:a[:-2]
  return r
endfunction
echo (-s:pop() + s:pop())
-1 でした。
lisp だと
(setq x (4 3))
(+ (- (pop x)) (pop x))
こう書けば -1 ですかね。

副作用のある処理を関数引数に書くのはやめましょう。

from Big Sky http://bit.ly/ZS3ilu

1 リアクション

4月 12 '13

Pownce SupportにAtomPP/WSSEのPasswordDigestの作り方が間違ってるんじゃないか?とメールしても返事が返って来ない件

Pownceをはじめました。ファイルを共有出来る所が特徴で、Twitterのいい対抗馬になるのでは?と思ってます。
Pownce Desktopというアプリケーションも付いてますので、一般ユーザにも取っ掛かり安いかもしれません。ただ、現状マルチバイト文字が入力できないので、全て英語(ぽいもの)で書かないとコミュニケーション出来ません。
もしよかったら気軽にAddしてみて下さい。

ところで…
Pownce Desktopの通信をパケットキャプチャした所、どうやらAPIは存在するようで、専用のURIも存在します。ただまだ非公開の為、変更される事もあれば、今後公開される予定もないかもしれません。
興味本位でWSSEヘッダを作成し、GETを投げて見ましたがHTTP/403。色々試しましたがやはりHTTP/403。どうやらWSSEヘッダの作り方が通常と異なるようです。
通常ならばWSSEヘッダは

base64(sha1(nonce + now + password))
となるべきなのですが、WSSEヘッダからNonceをbase64decodeした値と、Created、自分のpasswordを使ってPasswordDigestを作成してもPownce Desktopが作成したPasswordDigestと同じものにならないんです。
で、どうやらNonceを作るアルゴリズムが通常と異なるんじゃないかとPownce Supportにメールしました。
が、現状返ってきてません。WSSEでよくあるのが、仕様をはきちがえてpasswordをmd5したものを使って
base64(sha1(nonce + now + md5(password)))
と扱ったり(某○メーバブログ)、意図してNonceのランダム文字列に特殊なキーを使ったりします。
ただ、後者の特殊キーを使った場合でも、上記のようにsha1後の値は複合出来ますので、やはり今回の件はPownce側で特殊なアルゴリズムを使っているとしか考えられません。

せっかくPownceAPI.pyを作ろうと思ってたのに…
これで返事返ってきてAPI動いて、もしかしたら、API経由ならマルチバイト行けたりして…

from Big Sky http://bit.ly/10TSXJh

4月 12 '13

git でバイナリを気軽に扱える、git-largefile の dropbox 版を作った。

DSAS開発者の部屋:gitでバイナリファイルを気軽に扱えるフィルターを作りました

gits3 は Python でプロトタイプを作った後、 go で作りなおしました。

http://bit.ly/13fgFnC
S3、1年たったらタダちゃうし、Dropbox 使いたいよ… ってことで作ってみました。
mattn/git-dropbox - GitHub

Simulate hg largefile on git with dropbox Introduction When we want to add lar…

http://bit.ly/XGxntE
使い方は DSAS さんのブログと同じです。まずインストール。
$ go get github.com/mattn/git-dropbox
~/.gitconfig.git/config にフィルタを登録します。
[filter “dropbox”]
    clean = git-dropbox store
    smudge = git-dropbox load
そしてリポジトリに .gitattributes というファイルを作り、以下の様にフィルタを割り当てます。
*.png  filter=dropbox
*.jpeg filter=dropbox
*.jpg  filter=dropbox
*.gif  filter=dropbox
あとは普通に git add するだけで、dropbox の Apps/git-store というフォルダに格納されていきます。
初回だけ、ブラウザが自動で起動しますのでそこで許可ボタンを押して頂く必要があります。
ローカルにもキャッシュを持っているので、他のユーザと共有する場合は、~/.gitasset/data というフォルダを rsync しておけばOKです。
もしくは dropbox 側で共有するというのもアリかもしれません。
なお、git-dropbox には -nocache というオプションもあるので、上記フィルタの登録時に
[filter “dropbox”]
    clean = git-dropbox -nocache store
    smudge = git-dropbox -nocache load
-nocache を指定しておけばディスク容量が気になる方には良いかもしれません。

ちなみにコマンドラインから
$ git dropbox store fugafuga.txt < fugafuga.txt
$ git dropbox load fugafuga.txt
$ git dropbox drop fugafuga.txt
$ git dropbox list
という使い方も出来ます。
どうぞお役立て下さい。


from Big Sky http://bit.ly/12RwHjj

1 リアクション

4月 11 '13

Lingr のGo言語部屋に golang_bot 作った。

golang_bot 先日、Lingr がとてもホットなので「Go言語」部屋を作ったのですが、Lingr のしきたりとして、その開発言語でbotを書くというのがあったので(要出典)、go言語でbotを書いた。
mattn/go-lingrbot - GitHub
http://bit.ly/12MutSn
機能としては3つ。
  • URL が貼り付けられたらそのページのタイトルをお知らせする
  • !godoc math という発言があれば、math パッケージの説明とドキュメントの URL をお知らせする
  • mattn++ などという発言があれば、カウントアップして通算++数をお知らせする
Google AppEngine で動いてます。

URLボット

まず URL のタイトルをお知らせする部分、Go言語は内部エンコーディングが utf-8 であり、オフィシャルからはキャラクタセットを扱えるライブラリが提供されていません。かつ、Google AppEngine 上で動かすので CGO を使った物も動かせません。しかし mahonia というパッケージが CGO 無しでキャラクタセットを扱えるのでそれを使う事にしました。
mahonia - Mahonia - a character-set conversion library for Go - Google Project Hosting

Mahonia is a character-set conversion library implemented in Go. All data is compiled into the execu…

http://bit.ly/XEkxfq
得られた HTML をパースして meta タグを調べ、キャラクタセットを得た後に、title タグの内容を utf-8 に変換しています。
if charset == ”” && n.Type == html.ElementNode && n.Data == “meta” {
    kv := make(map[string]string)
    for _, a := range n.Attr {
        kv[strings.ToLower(a.Key)] = strings.ToLower(a.Val)
    }
    if v, ok := kv[“http-equiv”]; ok && v == “content-type” {
        if v, ok = kv[“content”]; ok {
            for _, t := range strings.Split(v, ”;”) {
                tt := strings.Split(strings.TrimSpace(t), ”=”)
                if len(tt) == 2 && strings.ToLower(tt[0]) == “charset” {
                    charset = tt[1]
                    break
                }
            }
        }
    }
    if v, ok := kv[“charset”]; ok {
        charset = v
    }
}
if n.Type == html.ElementNode && n.Data == “title” {
    if charset == ”” {
        charset = “utf-8”
    }
    title = mahonia.NewDecoder(charset).ConvertString(n.FirstChild.Data)
}

Godocボット

GoDoc

Popular Packages bitbucket.org/jaybill/sawsij/framework code.google.com/p/biogo code.google.com/p/go…

http://godoc.org/
github からGo言語のパッケージだけを集めてドキュメントを表示してくれるサイトを利用しました。
このサイトは Accept: text/plain ヘッダを付けて要求すると、テキスト形式で応答してくれる機能があったので、その結果からパッケージの説明を抽出しています。

プラスプラスボット

まず発言から
mattn++
mattn—
mattn+=3
mattn-=5
などという発言を抽出します。
var rePlus = regexp.MustCompile(`^\s*([a-zA-Z0-9_{^}]+)\+\+\s*$`)
var reMinus = regexp.MustCompile(`^\s*([a-zA-Z0-9_{^}]+)—\s*$`)
var rePlusEq = regexp.MustCompile(`^\s*([a-zA-Z0-9_{^}]+)\+=([0-9])\s*$`)
var reMinusEq = regexp.MustCompile(`^\s*([a-zA-Z0-9_{^}]+)-=([0-9])\s*$`)
func parsePlusPlus(message string, callback func(nick string, plus int)) bool {
    if rePlus.MatchString(message) {
        m := rePlus.FindStringSubmatch(message)
        callback(m[1], 1)
        return true
    } else if reMinus.MatchString(message) {
        m := reMinus.FindStringSubmatch(message)
        callback(m[1], -1)
        return true
    } else if rePlusEq.MatchString(message) {
        m := rePlusEq.FindStringSubmatch(message)
        callback(m[1], atoi(m[2]))
        return true
    } else if reMinusEq.MatchString(message) {
        m := reMinusEq.FindStringSubmatch(message)
        callback(m[1], -atoi(m[2]))
        return true
    }
    return false
}
そしてそこから呼ばれるコールバックで、GAE のデータストアに格納します。
parsePlusPlus(event.Message.Text, func(nick string, plus int) {
    plusplus := &PlusPlus{nick, 0}
    key := datastore.NewKey(c, “PlusPlus”, nick, 0nil)
    err := datastore.Get(c, key, plusplus)
    if err == nil || err == datastore.ErrNoSuchEntity {
        plusplus.Count += plus
        _, err = datastore.Put(c, key, plusplus)
        results += fmt.Sprintf(“%s (%d)\n, plusplus.Nickname, plusplus.Count)
    }
})
最後に通算++数を応答します。


これでだいたい、一般的な bot としての機能は満たせました。Lingr のGo言語部屋に24時間常駐しています。
お好きな様にお使い下さい。


from Big Sky http://bit.ly/12MurK3

4月 9 '13

Mersenne Twister のライセンスが変更された

乱数生成アルゴリズムは数ありますが、省リソースで循環周期の長く、生成速度が速いアルゴリズムとして Mersenne Twister が候補として上げられます。
mruby の Random でも採用されていましたが、先日ライセンスが変更され MIT への書き換えが可能となりました。ありがたいですね。
Mersenne Twisterの商用について

2001年4月6日まで、MTはGNU Public Licenseの元に配布していましたが、 多くのユーザーから「販売用プログラムに組み込むことができない」という お便りをいただきました。

松本-西村はMTを販売用プログラムにも自由に使っていただこうと決めています。 そのため、GNU Public Licenseよりも条件のゆるい”BSD License” に準拠したLicenseの元に2002年版コードmt19937ar.c, mt19937ar-cok.cは配布されています。

また、MITライセンスに書き換えて配布してくださっても結構です。

http://bit.ly/10Nl0K9
組み込み用途での利用障壁がなくなり、商用利用も可能となりました。

ちなみに Mersenne Twister は Vim script にも既に移植されていて
vim-funlib/autoload/random/mt19937ar.vim at master - ynkdir/vim-funlib - GitHub
http://bit.ly/10Nl1O4
簡単に乱数を得る事が出来ます。変態ですね。
call random#mt19937ar#seed(123)
echo random#mt19937ar#random()


from Big Sky http://bit.ly/10Nl0Ka

1 リアクション

4月 3 '13

Go言語で Lingr の IRC Gateway 書いた。

IRC クライアントを使って lingr 上のコミュニケーションを楽しむ場合
ruby であれば lig.rb

psychs/lingr-irc - GitHub
http://bit.ly/YRWWWC
perl であれば lingr-ircd
tokuhirom/lingr-ircd - GitHub
http://bit.ly/YRWWWF
がありますが、Go言語にもあるべきだろ!と思ったので書きました。
mattn/go-lingr - GitHub
http://bit.ly/10wnwDc
まず IRC に関係なく Lingr API を操作するライブラリ。そしてそれを使って IRC サーバと見立てる lingr-ircd を書きました。
lingr-ircd は go-lingr の中に含まれています。

API キーをお持ちの方は下記の様に指定して下さい。
$ lingr-ircd -apikey=”XXXXX”
これであとはお好きな IRC クライアントから 6667 番ポート(-addr=”:6668” の様に変更可能)に接続して lingr をお楽しみ下さい。

ちなみに lingr で Go言語 の部屋が無かったのでさっき作りました。
Go言語 – Lingr
http://bit.ly/10wnxHc
ゆるふわと、Go言語について語りましょう。

from Big Sky http://bit.ly/10wnxHe

3月 25 '13

3月 22 '13

それビム

vim memo - neotagの雑文
出来たらいいと思う事
  • Twitter
  • twitvim でhttp://www.vim.org/scripts/script.php?script_id=2204
  • Google検索がVimのみで完結
  • LivedoorReaderが読める
  • あった http://bit.ly/14gpBc1
  • はてブのHotentryが読める
  • 画像表示とかって無理だよね?
  • 編集してるページをリアルタイムにテキストブラウザで閲覧
http://bit.ly/14gpBbX
えーーーと。

はてブのHotentryが読める

それビム!
mattn/ctrlp-hotentry - GitHub
http://bit.ly/14gpEo3
:Hotentry vim
でホットエントリ見れるよ。
ctrlp-hotentry

画像表示とかって無理だよね?

それビム!
そうだ Vim で画像を表示させよう - C++でゲームプログラミング
http://bit.ly/Ui4enj
ちょっとインチキですが動画も…
Big Sky :: Vimで動画再生
http://bit.ly/Xukttt

編集してるページをリアルタイムにテキストブラウザで閲覧

それビム!
suan/vim-instant-markdown - GitHub
http://bit.ly/Im96Ou
僕は殆ど使ってないけどね…

以上!!





えっ「Google検索がVimのみで完結」が無い?… よろしいならば実装だ。

Google検索がVimのみで完結

さっき作った。
mattn/ctrlp-google ・ GitHub

GitHub About us Blog Contact & support GitHub Enterprise Site status Applications GitHub for Mac Git…

http://bit.ly/Xukw8D
:CtrlPGoogle 変態
とかすると…
ctrlp-google
Vimってステキですね!


from Big Sky http://bit.ly/14gpEo9