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.
Google Chrome を使っていて「新しいタブ」を開き、右下にある「最近閉じたタブ」で閉じてしまったタブを復帰させる事が良くあります。
Google Chrome Dev Channel を使っているのですが、どうやら Google Chrome をアップデートするとこのツールバー自身が消えてなくなる様なのです。この機能のヘビーユーザだったのでかなり困りました。
先日、某所で何人かに遊んで貰ったので、ここにも書いて皆に遊んでもらおうと思います。
mattn/habatobi-vim - GitHub
http://bit.ly/19jshrA
:Habatobiを実行すると起動します。j と k を交互にタイプすると走り出すので jkjkjkjkjkjkjkjk… とタイプして下さい。
2 リアクション
Go 1.1 performance improvements | Dave Cheneyさて今日はVimを使ってGo言語を開発する方法を紹介したいと思います。This is the first in a series of articles analysing the performance improvements in the Go 1.1 relea…
http://bit.ly/13m05y9
misc/vim にランタイムパスを追加します。以下を vimrc に追加します。exe “set rtp+=”.$GOROOT.“/misc/vim”
$ 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> をタイプすると、あり得る関数名や、メソッド名がずらずらーっと補完出来ます。
その際、
completeopt というオプションに preview を足しておくと、補完内容が詳細に表示されて分かりやすくなります。set completeopt=menu,preview
import を追加したりしてませんか?上記のオフィシャルが提供しているVimプラグインを使っているのであれば、以下の様に実行しましょう。:Import fmtbefore
package mainafter
func main() {
fmt.Println(“hello world”)
}
package mainカーソルの移動もありませんので、引き続きコーディングが再開出来ます。また、コマンドの引数でパッケージ名の補完が効きます。
import (
“fmt”
)
func main() {
fmt.Println(“hello world”)
}
net/ht までタイプして <tab> をタイプすれば net/http を補完してくれますし、ありえる候補も補完してくれます。godoc というツールが付属しています。コマンドラインから使っても便利なのですが、Vimから使うともっと便利になります。:Godoc net/http
:Import と同様にパッケージ名が補完出来ます。mattn/sonictemplate-vim - GitHubこれを bundle ディレクトリ等に入れておき、goのファイルを新規で開きます。そこで
http://bit.ly/KTmuy6
: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-vim はGo言語だけでなく、他の言語でも同様に便利なテンプレートが用意されています。よろしければ使ってみて下さい。また pull-req によるテンプレートの追加もお待ちしています。
1 リアクション
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>cpp という単語が含まれた発言に反応して「くぴぴ」と80年代アニメ風に応答します。
#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;
}
以前から携帯から IRC する手段として mobirc を使ってきたのだけど、使ってるサーバのリソースが少なすぎてちょくちょく困ってました。
「これ、Go言語で書いたらパフォーマンスも出るし、使用リソースも減るし万々歳じゃね?」というアホの一つ覚えみたいな動機で作り始めました。
mattn/gomirc - GitHubmobirc とほぼ同等の機能が動きます。
http://bit.ly/10hLa4K
あと、バックログ機能が付いてましてサーバを再起動したい場合は CTRL-C すると backlog.json というファイルに最新100件のバックログが保存されます。![]()
{root が指定出来るので、サブディレクトリにインストールしたい人も安心設計。
“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”]
}
}
mattn/go-lingr - GitHubznc を使えば複数のネットワークを束ねる事も出来ます。
http://bit.ly/10wnwDc
これで何時でも何処でも IRC 出来る様になりますね。よろしければどうぞ。
ディレクトリを監視して、変更があれば指定のコマンドを実行してくれるツール gomon を c9s さんが作ってくれました。
c9s/gomon - GitHubこの gomon を活用すべく goalert というツールを作りました。
http://bit.ly/Yo6lFq
mattn/goalert - GitHubこれらを組み合わせて
http://bit.ly/17L1jWl
$ gomon . — goalert go build -xとやっておくと、ソースの修正に伴い goalert が起動し、goalert が go build を実行します。結果としてエラーになった場合は、goalert が Growl サーバに結果を投げてくれます。
めっちゃ便利になりました。
mattn/jvgrep - GitHub
http://bit.ly/YohcSa
mahonia - Mahonia character-set conversion library for Go - Google Project Hostingjvgrep 自体はちょっとファイルサイズが大きくなったけど、ランタイムだと iconv が乗らなくなる分だけメモリ使用量は減ったし、なによりポータブルになった。Mahonia is a character-set conversion library implemented in Go. All data is compiled into the execu…
http://bit.ly/XEkxfq
逆ポーランド計算機を作ろうと思ったんだけど、どうも結果が期待通りにならない。ソースコードを見せて貰うと以下の様なコードだった。
#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 が得られるんです。
push(pop() - pop());に戻してコンパイルしてるんです。試しに pop1.c
#include <stdio.h>pop2.c
int a[] = {3, 4}, p = sizeof(a) / sizeof(a[0]);
int
pop() {
return a[—p];
}
int
main(int argc, char* argv[]) {
printf(”%d\n”, -pop() + pop());
return 0;
}
#include <stdio.h>上記 pop1.c と pop2.c を「gcc -S」でアセンブリ出力して比較して見たら全く同じ出力内容になりました。
int a[] = {3, 4}, p = sizeof(a) / sizeof(a[0]);
int
pop() {
return a[—p];
}
int
main(int argc, char* argv[]) {
printf(”%d\n”, pop() - pop());
return 0;
}
.file “pop1.c”最適化オプションは付けていないので、デフォルトの動作としてこうなります。gcc のバージョンは 4.7.2 です。
.globl a
.data
.align 4
.type a, @object
.size a, 8
a:
.long 3
.long 4
.globl p
.align 4
.type p, @object
.size p, 4
p:
.long 2
.text
.globl pop
.type pop, @function
pop:
pushl %ebp
movl %esp, %ebp
movl p, %eax
subl $1, %eax
movl %eax, p
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 %edx, 4(%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: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)”
.section .note.GNU-stack,”“,@progbits
-pop+pop について
intこうすれば評価順をちょっとだけ強制できるけど、これも最適化次第では消されてしまうかもしれないしなによりダサい。 もちろんC言語において関数引数の評価順序は規定されていないし、本来こういう呼び出し方はしてはいけないのは皆さん知ってはいると思います。多くの人はこの問題には直面しないでしょう。
main(int argc, char* argv[]) {
int c = 1;
printf(”%d\n”, -pop()*c + pop());
return 0;
}
C/C++関数引数の評価順序 - yohhoyの日記しかしながら論理演算は左から右に評価される事を期待している為、この様な副作用のあるコードを書くと処理系によっては足をすくわれる事になるという、なんとも面白い事例でした。プログラミング言語C/C++では、関数実引数の評価順序は未規定(unspecified)となっている。
http://bit.ly/15TByF4
my @a = (3, 4);ruby も
print ((-pop @a) + (pop @a));
a = [3, 4]python も
puts (-a.pop + a.pop)
a = [3, 4]javascript も
print (-a.pop() + a.pop())
log = typeof console != ‘undefined’ ? console.log : print;java も
var a = [1, 2];
log(-a.pop() + a.pop());
import java.util.Stack;vim script も(誰も聞いてない)
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());
}
}
let s:a = [3, 4]-1 でした。
function! s:pop()
let r = s:a[-1]
let s:a = s:a[:-2]
return r
endfunction
echo (-s:pop() + s:pop())
(setq x ’(4 3))こう書けば -1 ですかね。
(+ (- (pop x)) (pop x))
1 リアクション
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と同じものにならないんです。
base64(sha1(nonce + now + md5(password)))と扱ったり(某○メーバブログ)、意図してNonceのランダム文字列に特殊なキーを使ったりします。
DSAS開発者の部屋:gitでバイナリファイルを気軽に扱えるフィルターを作りましたS3、1年たったらタダちゃうし、Dropbox 使いたいよ… ってことで作ってみました。gits3 は Python でプロトタイプを作った後、 go で作りなおしました。
http://bit.ly/13fgFnC
mattn/git-dropbox - GitHub使い方は DSAS さんのブログと同じです。まずインストール。Simulate hg largefile on git with dropbox Introduction When we want to add lar…
http://bit.ly/XGxntE
$ 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です。-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
1 リアクション
mattn/go-lingrbot - GitHub機能としては3つ。
http://bit.ly/12MutSn
!godoc math という発言があれば、math パッケージの説明とドキュメントの URL をお知らせするmahonia - Mahonia - a character-set conversion library for Go - Google Project Hosting得られた HTML をパースして meta タグを調べ、キャラクタセットを得た後に、title タグの内容を utf-8 に変換しています。Mahonia is a character-set conversion library implemented in Go. All data is compiled into the execu…
http://bit.ly/XEkxfq
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)
}
GoDocgithub からGo言語のパッケージだけを集めてドキュメントを表示してくれるサイトを利用しました。Popular Packages bitbucket.org/jaybill/sawsij/framework code.google.com/p/biogo code.google.com/p/go…
http://godoc.org/
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 {そしてそこから呼ばれるコールバックで、GAE のデータストアに格納します。
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
}
parsePlusPlus(event.Message.Text, func(nick string, plus int) {最後に通算++数を応答します。
plusplus := &PlusPlus{nick, 0}
key := datastore.NewKey(c, “PlusPlus”, nick, 0, nil)
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)
}
})
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
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()
1 リアクション
IRC クライアントを使って lingr 上のコミュニケーションを楽しむ場合
ruby であれば lig.rb
psychs/lingr-irc - GitHubperl であれば lingr-ircd
http://bit.ly/YRWWWC
tokuhirom/lingr-ircd - GitHubがありますが、Go言語にもあるべきだろ!と思ったので書きました。
http://bit.ly/YRWWWF
mattn/go-lingr - GitHubまず IRC に関係なく Lingr API を操作するライブラリ。そしてそれを使って IRC サーバと見立てる lingr-ircd を書きました。
http://bit.ly/10wnwDc
$ lingr-ircd -apikey=”XXXXX”これであとはお好きな IRC クライアントから 6667 番ポート(-addr=”:6668” の様に変更可能)に接続して lingr をお楽しみ下さい。
Go言語 – Lingrゆるふわと、Go言語について語りましょう。
http://bit.ly/10wnxHc
vim memo - neotagの雑文えーーーと。
出来たらいいと思う事http://bit.ly/14gpBbX
- Google検索がVimのみで完結
- LivedoorReaderが読める
あった http://bit.ly/14gpBc1- はてブのHotentryが読める
- 画像表示とかって無理だよね?
- 編集してるページをリアルタイムにテキストブラウザで閲覧
mattn/ctrlp-hotentry - GitHub
http://bit.ly/14gpEo3
:Hotentry vimでホットエントリ見れるよ。
そうだ Vim で画像を表示させよう - C++でゲームプログラミングちょっとインチキですが動画も…
http://bit.ly/Ui4enj
Big Sky :: Vimで動画再生
http://bit.ly/Xukttt
suan/vim-instant-markdown - GitHub僕は殆ど使ってないけどね…
http://bit.ly/Im96Ou
mattn/ctrlp-google ・ GitHubGitHub About us Blog Contact & support GitHub Enterprise Site status Applications GitHub for Mac Git…
http://bit.ly/Xukw8D
:CtrlPGoogle 変態とかすると…
Vimってステキですね!
ページ 1 / 84