SSH周り

公開鍵の登録

毎回、sshでログインするたびにパスワードを打つのは面倒なので、公開鍵を登録する。

local$ ssh-keygen -t rsa
local$ scp ~/.ssh/id_rsa.pub mzp.sakura.ne.jp:
local$ ssh mzp.sakura.ne.jp

remote$ cat id_rsa.pub >> ~/.ssh/authorized_keys
remote$ rm id_rsa.pub
remote$ exit

で、あとは毎回

ssh-agent zsh

とかで起動するようにすれば、パスワード無しで入れる。

ファイルの同期

rsync -avz -e ssh . mzp.sakura.ne.jp:www/wiki/

とかね。

hparserの使い方

Wikiに書き込むための下書き。

はてな記法をHTMLに変換するプログラム(make_hatena)を作ってみる。

前提

  • RubyGemsのための設定が終了している
  • hpaserがインストールされている

仕様

引数がある場合は、そいつをhtmlに変換して標準出力に出力する。

$ make_hatena sample.html
<html>
<body><p>Hatena Format Paser Sample.</p></body>
</html>

引数がない場合は、標準入力から受け取る。

$ echo "foobar" | make_hatena
<html>
<body><p>foobar</p></body>
</html>

引数の処理

引数のファイルを開くか、標準入力を使うかを決めるための処理をまず行う。

ここは本質じゃないので、さくっと終わらせる。


#!/usr/local/bin/rubyrequire 'hparser'

def to_html(input)
# ...end

if ARGV.length == 0 then
puts to_html(STDIN)
else
open(ARGV[0]) { |io|
puts to_html(io)
}
end

HTMLの変換

HParser::Parser#parseにはてな記法を渡すと、はてな記法が各要素に分解されます。

たとえば、


parser = HParser::Parser.new
parser.parse("hoge") # -> [#<HParser::Block::P>]parser.parse("*head") # -> [#<HParser::Block::Head>]parser.parse("*head\nfoo") # -> [#<HParser::Block::Head>,#<HParser::Block::P>]
というふうに分解されます。

あとは、HParser::Block::P#to_htmlなどのto_htmlと名前の付いたメソッドを呼び出すことで、HTMLに変換することができます。

なので、HTMLの変換は次のようになります。


def to_html(input)
parser = HParser::Parser.new
node = parser.parse input.read
"<html><body>\n"+node.map{|x| x.to_html}.join("\n")+"\n</body></html>"
end

結果

最終的に次のようになります。


#!/usr/local/bin/rubyrequire 'hparser'

def to_html(input)
parser = HParser::Parser.new
node = parser.parse input.read
"<html><body>\n"+node.map{|x| x.to_html}.join("\n")+"\n</body></html>"
end


if ARGV.length == 0 then
puts to_html(STDIN)
else
open(ARGV[0]) do |io|
puts to_html(io)
end
end

出力例:

$ cat sample.txt
*Hello,world!!
test

- foo
-- bar
-- baz
--- bar

$ ruby make_hatena.rb sample.txt
<html><body>
<h1>Hello,world!!</h1>
<p>test</p>
<ul><li>foo</li><ul><li>bar</li><li>baz</li><ul><li>bar</li></ul></ul></ul>
</body></html>