2012/10/29


Github Notification API が出ました。
Notifications API - GitHub

Recent posts in this category Notifications API technoweenie on October 26, 2012 Latest commit per d...

https://github.com/blog/1306-notifications-api
github の通知を取得する場合、これまでは miyagawa さんが github growler でやっていた様に、ダッシュボードのRSSを使って自分のイベントを抽出しなければなりませんでしたが、Notification API を使う事で Github 上と同じ通知メッセージが取れる様になりました。
今日は Perl で Github のメッセージを通知するアプリケーションを作ってみました。
#!perl

use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Encode;
use JSON;
use Term::ReadKey;
use Data::Deduper;
use Growl::Any;

my ($username$password);

print "Username: ";
chomp($username = <STDIN>);
print "Password: ";
ReadMode(2);
chomp($password = ReadLine(0));
ReadMode(0);
print "\n";

my $ua = LWP::UserAgent->new;
$ua->ssl_opts(verify_hostname => 0);

my $req = HTTP::Request->new('POST''https://api.github.com/authorizations');
$req->content(to_json {
    scopes => ['notifications'],
    note => 'github-notification.pl',
    note_url => 'https://github.com/mattn/github-notification',
});
$req->authorization_basic($username$password);
my $res = from_json $ua->request($req)->decoded_content;
my $token = $res->{token};

my $dd = Data::Deduper->new(
    expr => sub {
        my ($a$b) = @_;
        $a->{id} eq $b->{id}
    },
);

my $growl = Growl::Any->new(
    appname => 'Github Notification',
    events => ['notification''error'],
);

while (1) {
    $res = $ua->get("https://api.github.com/notifications?access_token=$token");
    my $items = from_json decode_utf8 $res->decoded_content;
    for ($dd->dedup($items)) {
        $growl->notify(
            'notification',
            $_->{subject}->{title},
            $_->{description},
            $_->{repository}->{owner}->{avatar_url})
    }
    sleep($res->header('X-Poll-Interval') || 60);
}
前半部分はトークンを取る処理で、パスワードは token を得る為だけに使っています。
簡単ですね。これでどんなネタ振りも取りこぼす事無く反応出来ますね!
github notification
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 の様にキャッシュする事で高速に動作させる事も出来るかと思います。オリジナルのプロキシを作ってみたいという方は試してみる価値あるかと思います。

Posted at by



2012/10/22


私も結構長くvimを使ってきましたが、実はsnippet系やsorround系のプラグインは殆ど使っていません。理由は入力の規則が多様すぎて覚えられないのと、それくらい手で入力出来るんじゃないか...と思っていたのが理由でもあります。
sorround.vimなんかは何度か常用をチャレンジしてみましたが、結局諦めました。
先日、zen-codingを見つけ、「へー便利そうだなぁ」と思ったと同時にこのくらいならvimscript(pure vimscript)だけで書けるな...と思ったので書いてみました。
と言ってもEmacsへの移植なんかと同様に「Expand Abbreviation」だけです。
正直言うとzen-codingのプロジェクトページにvimがラインナップされていなかったのがキッカケだったりもしますが...。ただ、後から知ったのですがsnipMateという物でzen-codingらしき事が出来るらしく、またsparkupというプラグイン(python拡張使用)でzen-codingと同等の事が出来るらしいのです。
しまった...とも思ったのですが残念ながらそれを知ったのが完成間近だったので、思いっきり後出しジャンケンになってしまいました。
でももったいなかったので紹介しておきます。

zen-codingとはHTML/CSSを入力するのに便利な機能で、どんな物かはこの辺を見てもらえると分かるかと思います。
以下、vim版の動作として紹介します。
キーバインドはzen-codingの移植先エディタによって異なります。

例えば、「よーしパパ、今日はHTML5書くぞ!」って時には html:5_ "_"はカーソル位置(挿入モード)です。
までタイプして<c-y>,とタイプすると <!DOCTYPE HTML>
<html lang="en">
<head>
    <title></title>
    <meta charset="UTF-8">
</head>
<body>
    _
</body>
</html>
こんな感じに展開されてママもご機嫌です。これだけだと単なるsnippet機能でしかありませんが、例えば「じゃぁ今度はid属性が"foo"のDIVにclass属性が連番でbar1,bar2,bar3ってなる様なアンカー作るぞ!」って時には div#foo > a.bar$*3
とタイプして、おもむろに<c-y>,をタイプします。すると
<div id="foo">
    <a href="" class="bar1">_</a>
    <a href="" class="bar2"></a>
    <a href="" class="bar3"></a>
</div>
と展開されママもニコニコ、もう夫婦円満間違いなしです。
zen-codingとしてはほぼ完成してます。ただ上記で言った様にsparkupを見つけて悔しかったのでsparkupが採用している拡張記法もサポートしてみました。
たとえば a[href=index.html]{Home}
こんなのが <a href="index.html">Home</a>
この様に展開されたり #header > ul > li < p{Footer}
こんなのが <div id="header">
    <ul>
        <li>_</li>
    </ul>
    <p>Footer</p>
</div>
こんな風に展開されたりします。一応、現状sparkupと同様にzen-codingの上位互換でありながら、sparkupの拡張記法も使える様にしました。
更に変数 g:user_zen_settings を設定する事で自前の snippet や展開式を書く事が出来ます。
例えばperlであれば
let g:user_zen_settings = {
\  'perl' : {
\    'indentation' : '  ',
\    'aliases' : {
\      'req' : "require '|'"
\    },
\    'snippets' : {
\      'use' : "use strict\nuse warnings\n\n",
\      'w' : "warn \"|\";",
\    }
\  }
\}
こんな風にしておき
(perl専用のindentationの位置はperlの下です。)
w<c-y>, と挿入モードでタイプすると warn "_";
と展開されてメシウマウマです。


使っているvimでpython拡張が動かなかったり、夫婦仲がピンチって方、お一つどうでしょうか。
mattn's zencoding-vim at master - GitHub

zen-coding for vim: http://code.google.com/p/zen-coding/

http://github.com/mattn/zencoding-vim
Posted at by