require "rubygems"
require "dl/import"
module Lib_MSVCRT extend DL::Importable
LC_CTYPE = 2
dlload "msvcrt.dll"
extern "char* setlocale(int, char*)"
end
Lib_MSVCRT::setlocale(Lib_MSVCRT::LC_CTYPE, "")
2009/06/18
わざわざrubyからsetlocale()呼び出すのにライブラリ作らなくても呼べた。
2009/06/17
Windows版のruby-irbでも正しくマルチバイトを扱いたい。
今日はそれを解決してみる。readline-4.3-2-src.zipを持ってきて
# unzip readline-4.3-2-src.zipとするとreadline.dllが出来上がるのでそれをパスの通った場所に置く。古いreadline.dllをバックアップしておいて入れ替えるのもOK。
# cd readline-4.3-2¥win32¥shlib
# copy config.h config.h.orig
# vim config.h
diff -u config.h.orig config.h
--- config.h.orig 2003-04-14 16:04:46.000000000 +0900
+++ config.h 2009-06-17 17:04:07.234375000 +0900
@@ -128,11 +128,9 @@
/* Define if you have the <varargs.h> header file. */
//#define HAVE_VARARGS_H 1
-/*
#define HAVE_WCTYPE_H 1
#define HAVE_WCHAR_H 1
#define HAVE_MBSRTOWCS 1
-*/
/* config.h.bot */
/* modify settings or make new ones based on what autoconf tells us. */
# copy config.h ..
# mingw32-make -f GNUmakefile
次に、id:Constellationさんの記事にある以下のソースをlocale.cとして保存する。
#include <locale.h>そしてコンパイル
#include "ruby.h"
static VALUE mLocale;
static VALUE
locale_setlocale(obj)
{
setlocale(LC_CTYPE, "");
#ifdef LC_MESSAGES
setlocale(LC_MESSAGES, "");
#endif
return Qnil;
}
void
Init_locale()
{
mLocale = rb_define_module("Locale");
rb_define_module_function(mLocale, "setlocale", locale_setlocale, 0);
}
# gcc -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -shared -o locale.so locale.c libreadline.a c:/ruby/lib/msvcrt-ruby18.libワーニングが出るけど気にしない
出来上がったlocale.soを
C:¥ruby¥lib¥ruby¥1.8¥locale.soとして配置し、ホームディレクトリ(HOME環境変数を設定していないならばUSERPROFILE変数の位置)に".irbrc"というファイルを作って以下の様に書く。
begin"utility_belt"はこの記事を、win32consoleはエスケープシーケンスを色付けして表示して貰うために...
require"locale"
Locale.setlocale
rescue
end
require 'rubygems'
require 'utility_belt'
require 'win32console'
後はirbを起動すれば、マルチバイト文字でバックスペースしても正しく1文字消えてくれます。
Constellation++
これでようやく、termtterでも正しく日本語が打てる。
なお、Constellationさんの記事にも書かれていますがtime.rb周りで弊害が出る可能性があるので、気を付けて。termtterの場合なら"~/termtter/config"にLocale.setlocaleを書いた方が良いかもしれない。
Tagged as: ruby, windows
Bookmarks:
|
2009/04/09
Jekyllで始める簡単ブログ

GithubのユーザページでJekyllが使われる様になりました。
GitHub Pages Upgraded to Jekyll 0.5.0 - GitHubGithubでは
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
username.github.comというリポジトリを作成し、その中にHTMLファイルを作成すると
http://username.github.comで表示出来るという使い方が出来るのですが、このコンテンツ管理にJekyllが使われる事になりました。
mojombo's jekyll at master - GitHubJekyllは制御構文処理にliquid、コンバータとしてredclothを使用し、Marukuもしくはrdiscountを使ったMarkdown記法が可能なブログジェネレータです。Jekyll is a blog-aware, static site generator in Ruby
http://github.com/mojombo/jekyll/tree/master
起動方法によっては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>liquidの構文
<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>
{{ page.title }}や
{{ content }}があります。前者にはページのタイトルが、後者にはページのコンテンツが割り当てられます。
次に記事データ用テンプレート
_layouts/post.html
---YAML形式になっています。このlayoutの値defaultを使用して上記defaultレイアウトが選択されている事になります。
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>
そしてサイトページ
サイトページには一般的なブログと同じく、記事の一覧を表示したいと思います。
liquidのfor構文を使用して以下の様に書きます。
index.html
---デフォルトレイアウトを使用し、titleの値が指定されています。つまりこのサイトのタイトルは「つけ麺旅行記」になるのです。
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> » <a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
</div>
また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://d.hatena.ne.jp/naoya/20090405/aho_corasick)に書いてあった。
ほんとに旨いらしい。
_siteへHTML変換してくれます。ブラウザで閲覧する
デフォルトのポート番号は4000になっています。「http://localhost:4000/」でルートを表示すると以下の様に表示されます。今回は例として「つけ麺」の記事を3件書いた事にしています。
そして記事本体へのリンク(16日の記事)をクリックすると以下の様に表示されます。![]()
見事に記事が表示されました。レンタルサーバ等では上記の様にサーバとして起動するのではなく![]()
# jekyllと単体起動させて
_siteディレクトリにHTMLを出力させ、出来上がった_siteディレクトリ配下をFTPでアップロードするという流れになるかと思います。一度ここまでの環境を作成しておけば
- 記事を書く
- jekyllでHTMLファイルを出力する
- サーバへアップロードする
なお、jekyllは発展途上のプロジェクトなので要望があればgithub上でclone/push requestして欲しいと作者も書いています。ぜひcontribute authorになってみて下さい。
少しギーク仕様ぽいですが、慣れると使いやすそうな気がします。一度試してみては如何でしょうか?
Tagged as: jekyll, ruby
Bookmarks:
|
2009/02/12
mod_access_tokenで制御されたリソースにrubyからアクセス
mod_access_tokenを入れてみた - まめ畑あとはbase64に付く改行とターミネータをカットすればOKですね。ここまでは良かったのですが、Signatureを生成するスクリプトを作ろうと思ったのですが、Rubyで上手くいかない・・・。
http://d.hatena.ne.jp/con_mame/20090209
require 'openssl'結果はこんな感じ。
require 'base64'
require 'uri'
require 'time'
access_key = 'foo'
secret = 'bar'
url = 'http://localhost:8080/access_token/example.jpg'
exp = (Time.new+300).to_i.to_s
uri = URI.parse(url)
plain = "GET#{uri.path}#{exp}#{access_key}"
hmac = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA1.new, secret, plain)
sig = Base64.encode64(hmac).chomp.sub(/=*$/, '')
puts "#{url}?Signature=#{URI.escape(sig)}&AccessKey=#{URI.escape(access_key)}&Expires=#{URI.escape(exp.to_s)}"
http://localhost:8080/access_token/example.jpg?Signature=Rt2cKnnOYuDiE/XYKTLTaOuY4Wg&AccessKey=foo&Expires=1234417692ちなみに
Base64.b64encodeはエンコード結果を表示してしまうのでencode64が良さそうですね。def b64encode(bin, len = 60)
encode64(bin).scan(/.{1,#{len}}/) do
print $&, "\n"
end
end



![Validate my RSS feed [Valid RSS]](http://mattn.kaoriya.net/images/valid-rss.png)

