2011/06/24


Go言語フリークの皆さんこんばんわ。
テンポラリ的にキャプチャ画像をアップロードする際にはgyazoが一般的ですよね。僕もよく利用しています。
今日はこのgyazoに画像をアップロードするクライアントと、サーバを書きました。
mattn/gyago - GitHub

Gyazo application written in go

https://github.com/mattn/gyago
Gyago

Gyazo on AppEngine

http://gyazo.compile-error.net/
コマンドラインで動くクライアントと、GoogleAppEngineで動くサーバです。クライアントはキャプチャ動作はしませんが、引数で与えたpngファイルをgyazoサーバにアップロード出来ます。またサーバはdatastoreを使って画像データをblobに格納する事でgyazoサーバを実現しています。

タイトルページはGoogle WebFont APIを使ってなんなーくカッコいい感じにしてみました。ほんとになんとなーくです。
Google Web Fonts

Google Web Fonts lets you browse all the fonts available via theGoogle Web Fonts API. All fonts in t...

http://www.google.com/webfonts
GoogleAppEngineの無料枠なので、すぐMax Quotaになっちゃうかも知れませんが、良かったら遊んでみて下さい。
なお、クライアントはデフォルトではgyazo.comにアップロードしちゃうので # gyago -e=http://gyazo.compile-error.net/ imagefile.png
という感じにアップロード先のエンドポイントを指定してあげて下さい。 ちなみに、sendさんがsinatraで書いたgyazoサーバにアップロードしたい場合は # gyago -e=http://gyazo.send.sh/ imagefile.png
と指定すれば動きますが、現状のGoはmultipartの処理で、先頭に空白行が1行入る動作になっていて、rack-1.2と相性が悪い(先頭に空白行があるとマッチしない)ので、golang-devにパッチを投げてあります。
と書いた所で再度見たら、もうsubmitされてましたので、hg pullしてtipsにすると入ってます。

ちなみに、rack-1.3では先頭に空白行が入っていても正しく読める様な修正が入っている模様です。

Posted at by



2011/06/16


タイトル長い!

言ったからには自分で書こう...
Twitter / mattn: 当たり前だと思うけど、PerlerならWeb::Sc ...

当たり前だと思うけど、PerlerならWeb::Scraperでアカウント名取ってNet::Twitter::Liteでfollowするよね? #perl http://d.hatena.ne.jp/...

https://twitter.com/mattn_jp/status/81320211634069504
所要時間、約10分
use strict;
use warnings;

use Config::Pit;
use Net::Twitter::Lite;
use URI;
use Web::Scraper;

my $uri = URI->new('http://d.hatena.ne.jp/sugyan/20110616/1308203734');

my $config = pit_get('api.twitter.com');
my $nt     = Net::Twitter::Lite->new(%$config);

my $helper = scraper {
    process '//div[@class="body"]//a[contains(@href,"http://twitter.com/")]',
      'link[]' => '@href';
};

$helper->user_agent->env_proxy;

my $res = $helper->scrape($uri);
for my $link (@{$res->{link}}) {
    print "$link\n";
    $link =~ s!.*/!!;
    #$nt->follow( $link ); # ココのコメント外してね
}

※ただし、動かした事がない。

Posted at by




Github
GithubのユーザページでJekyllが使われる様になりました。
GitHub Pages Upgraded to Jekyll 0.5.0 - GitHub

I just released Jekyll 0.5.0 which contains a huge overhaul that allows you to specify options in a _config.yml file. GitHub Pages will honor most of these settings, so if you want to have your Page rendered with RDiscount instead of Maruku, just put this in your config file: ...

http://github.com/blog/402-github-pages-upgraded-to-jekyll-0-5-0
Githubでは
username.github.com
というリポジトリを作成し、その中にHTMLファイルを作成すると
http://username.github.com
で表示出来るという使い方が出来るのですが、このコンテンツ管理にJekyllが使われる事になりました。
mojombo's jekyll at master - GitHub

Jekyll is a blog-aware, static site generator in Ruby

http://github.com/mojombo/jekyll/tree/master
Jekyllは制御構文処理にliquid、コンバータとしてredclothを使用し、Marukuもしくはrdiscountを使ったMarkdown記法が可能なブログジェネレータです。
起動方法によってはWEBrickを使ったWebサーバまで起動出来る便利なツールになっています。
今日はこのJekyllを使用した、簡単なブログの書き方をご紹介します。

設定ファイルとディレクトリを用意する

まず設定ファイルを用意します。ほぼデフォルトのままで十分ですが以下のファイルを用意します。

_config.yml
#destination: ./_site
#auto:        false
#lsi:         false
#server_port: 4000
pygments:    true
#markdown:    maruku
#permalink:   date
次に以下の様なディレクトリ構成を作成します。
※ルート
|   _config.yml
|  
+---_layouts
|       ※レイアウトファイルを格納するディレクトリ
|  
+---_posts
        ※記事を格納するディレクトリ

レイアウトファイルを用意する

Jekyllでブログを書く場合に機能するファイルは
  • デフォルトレイアウト(_layouts/default.html)
  • 記事データ用レイアウト(_layouts/post.html)
  • サイトページ(index.html)
  • 記事データ(_posts/yyyy-mm-dd-blog-title.html)
となります。記事データ以外はほぼテンプレート扱いのファイルになりますのでこの時点で作成します。
まずデフォルトレイアウト
_layouts/default.html
<!doctype html>
<head>
    <title>{{ page.title }}</title>
    <link rel="stylesheet" href="/css/site.css" type="text/css" />
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body>
    <div id="content">
    {{ content }}
    </div>
</body>
liquidの構文 {{ page.title }}
{{ content }}
があります。前者にはページのタイトルが、後者にはページのコンテンツが割り当てられます。

次に記事データ用テンプレート
_layouts/post.html
---
layout: default
---
<div class="post">
<h1>{{ page.title }}</h1>
Posted at <span>{{ page.date | date_to_string }}</span><br />
<br />
{{ content }}
</div>
<a href="/">もどる</a>
YAML形式になっています。このlayoutの値defaultを使用して上記defaultレイアウトが選択されている事になります。

そしてサイトページ
サイトページには一般的なブログと同じく、記事の一覧を表示したいと思います。
liquidのfor構文を使用して以下の様に書きます。
index.html
---
layout: default
title: つけ麺旅行記
---

<div class="posts">
<h1>{{ page.title }}</h1>
<ul>
{% for post in site.posts limit:3 %}
    <li><span>{{ post.date | date_to_string }}</span>&nbsp;&raquo;&nbsp;<a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
</div>
デフォルトレイアウトを使用し、titleの値が指定されています。つまりこのサイトのタイトルは「つけ麺旅行記」になるのです。
またfor構文で記事データの内3件のタイトルと日付が表示されます。
出来上がった構造は以下の様になります。
|   index.html
|   _config.yml
|  
+---_layouts
|       default.html
|       post.html
|      
+---_posts
       ※記事を格納するディレクトリ

記事データを書く

この時点で既にブログとして機能しています。試しに以下の様にサーバを実行してみましょう。
# jekyll --server --auto
--serverオプションでWEBrickを使用したサーバを起動します。起動すると_siteというディレクトリが作成され変換されたHTMLが格納されます。またバイナリファイルやCSSファイル等はルートから_siteディレクトリにコピーされる様になっています。
また--autoオプションを指定する事でディレクトリ変更を監視させます。ローカルでファイルが変更された場合、自動的に_siteディレクトリへの変換が行われます。引数で与える事が出来るパラメータは_config.ymlでも設定可能ですので詳しくはマニュアルを参照下さい。

記事データは_postsディレクトリに保存します。この時ファイル名に一定の規則がありファイル名の先頭がYYYY-MM-DDによる日付表現、その後続く名称(ハイフンやアンダースコアは空白と見なされる)が記事タイトルとなります。但しYAML記述でtitleを指定した場合にはそちらが優先されます。
今回は例えば、2009年4月16日に「つけ麺」に関する記事を書いたというデータとして以下の様に記事ファイルを作成しました。
なお、拡張子を.mdにする事でMarkdown記法しています。

_posts/2009-04-16-greeting.md
---
layout: post
title: つけ麺の美味しい店 その3
---
京都にあるらしい。
-----------------

![麺や高倉二条](http://www.hotpepper.jp/IMGDB_MP/95/19/M000009519/M000009519_368.jpg)

って[どこかのブログ](http://d.hatena.ne.jp/naoya/20090405/aho_corasick)に書いてあった。
ほんとに旨いらしい。
このファイルを作成した瞬間にサーバが更新を検知し、_siteへHTML変換してくれます。

ブラウザで閲覧する

デフォルトのポート番号は4000になっています。「http://localhost:4000/」でルートを表示すると以下の様に表示されます。
今回は例として「つけ麺」の記事を3件書いた事にしています。
jekyll1
そして記事本体へのリンク(16日の記事)をクリックすると以下の様に表示されます。
jekyll2
見事に記事が表示されました。レンタルサーバ等では上記の様にサーバとして起動するのではなく # jekyll
と単体起動させて_siteディレクトリにHTMLを出力させ、出来上がった_siteディレクトリ配下をFTPでアップロードするという流れになるかと思います。

一度ここまでの環境を作成しておけば
  1. 記事を書く
  2. jekyllでHTMLファイルを出力する
  3. サーバへアップロードする
という手順だけでブログを更新出来ます。

なお、jekyllは発展途上のプロジェクトなので要望があればgithub上でclone/push requestして欲しいと作者も書いています。ぜひcontribute authorになってみて下さい。
少しギーク仕様ぽいですが、慣れると使いやすそうな気がします。一度試してみては如何でしょうか?
Posted at by