« CoLinux + Ubuntu 10.04を試す | メイン

2012年1月 6日 (金)

Octopressを試してみる

以前

で色々と頑張ってみたけど、運用してると、記事のアップと画像のアップがやっぱり面倒。

これを自動化するのって結構大変(多分自分でhttpのリクエストとか出すようなスクリプトか何か書かない といけないし)だなと考えてましたが、たまたまvimのMarkdownスクリプト探しに行った際にoctopressというのが あるのを知ったので、試してみた。

導入

などを参考にして導入。

但し書いてあるとおりbundle installとすると、システムのgem領域にrubyライブラリがインストールされてしまう ので、

cd octopress
bundle install --path=vendor/bundle

とかするとvendor/bundle内にライブラリがインストールされて、複数のrubyプロジェクトがある場合にライブラリの バージョン違いとかで嵌まらなくて済むかも。

gem領域を再構築したい場合は

gem list --local | cut -d" " -f1 | xargs gem uninstall

として、システムのgem領域に入ってるライブラリを全部アンインストールした後で必要なライブラリ(bundler 等)をgem installすればいい。

見た目のカスタマイズ

デフォルトのテーマは文字がでかくてイマイチ気に入らなかったので頑張って修正。

octopress/sass内のファイルを編集すればいいみたい。

レイアウト自体はいじらずに専ら色や間隔、フォントなどをグチャグチャと調整してみた。 やってるうちに気付いたが、octopress/sass/custom内のファイルのみ変更するべきだったような気がする。

見た目はかなり希望に近づいたが、コードはなんか機能が分離し切れてないというか構造化がイマイチのような 感じ。まあ拘ってもしょうがないので暇なときに気が向けば修正しようかな?

Octopress本家の更新かけたり、間違えてrake installとかしたときに消えたりしたら悲しいので

cd octopress
cp -ar .themes/classic/ .themes/nukino
cp -arf sass/ .themes/nukino/

として新しいテーマを作ってバックアップしておいた。

運用

以前の記事にちらっと書いたけど、Windows上で運用すると変な警告出るし、ファイル内に日本語入ってると文 字コードを何にしてもきちんと動かないし・・・で、諦めた(rubyのデフォルト外部エンコーディングをUTF-8に 設定できれば動くかも)

今のところ自PCにcoLinux+Ubuntu 10.04入れてサービス化して、SSH経由で動かしてる(octopressフォルダ自体 はWindows側のファイルをsamba経由でアクセスしてる)

別PCにUbuntu 11.10を入れてSSH経由で動かした場合、previewとかしたときサーバの応答がめっちゃ遅い。

調べてみると、Octopress(正確にはJekyll)が使ってるWEBrickというのが遅いらしいUbuntuネットワーク(ssh接続, webrickサーバー)が遅いに対策が書いてあったの で、/etc/nsswitch.confhosts:行のmdns4を削除したら結構ましになった。

ユーザーページの管理

Octopressのインストールから運用管理まで

を参考に

  1. Bitbucketのアカウントを作成(こんなのあるんだ。遅れてるな>俺)
  2. アカウントのページのSSH Keysに~/.ssh/id_rsa.pubの内容を貼付 &Add Key
  3. Create new repositryでoctopressを作成(Repositry typeをgitに する)
  4. 以下のコマンドを打つ
cd octopress
git add .
git commit -m '<message>'
git remote add bitbucket git@bitbucket.org:<username>/octopress.git
git push -u bitbucket source

<message>は適当に。<username>はBitbucketのアカウント名。

なお、bundle install時にvendor以外のパスを指定した場合は.gitignoreにそのパスを入れておかないと rubyライブラリごとpushされると思う(試してないけど)。

rubyライブラリのアップデート
bundle update

Bundler 1.1を使ってる&bundle install時にパスを指定した場合、古くて使ってないライブラリを削除して くれる。

挙動が変わって嵌まるかもしれないのでバックアップしといた方がいいかも。

記事作成
rake new_post['title']

なのだが、SSH経由で運用してるため、いちいち打つのが面倒(‘title’に日本語入れたら問題ありそうだし)

別にこのコマンドを打たなくてもoctopress/source/_postsにファイルを作ったら検出してくれるみたいなので、 以下のようなvimスクリプトを作って運用してみる。

$VIMRUNTIME/autoload/myvimrc.vimに以下

func! myvimrc#new_article(title)
    let l:atitle = a:title
    if ( l:atitle == "" )
        let l:atitle = input("input title:")
    endif
    let l:time = localtime()
    let l:hantitle = l:atitle
    "Kaoriya 全角→半角関数があるなら使う
    if ( exists( "*ToHankaku" ) )
        let l:hantitle = ToHankaku(l:atitle)
    endif
    let l:match_character = '\%([ウカキクケコサシスセソタチツテトハヒフヘホ]゙\|[ハヒフヘホ]゚\|.\)'
    let l:asctitle = ""
    let l:ii = 0
    let l:len = strlen(l:hantitle)
    " titleのファイル名に使える英数字&記号だけ抜き出す。
    while ( l:ii < l:len )
        let l:char = matchstr(l:hantitle, l:match_character, l:ii)
        "全角文字は省く
        if ( l:char =~ '^\f$' && char2nr(l:char) < 256 )
            let l:asctitle .= l:char
        endif
        let l:ii += strlen(l:char)
    endwhile
    if ( l:asctitle == "" )
        let l:asctitle = "article"
    endif
    if ( !exists('g:octopress_rootdir') )
        let g:octopress_rootdir = '~/octopress'
    endif
    if ( !exists('g:octopress_article_ext') )
        let g:octopress_article_ext = 'markdown'
    endif
    let l:fbase = strftime("%Y-%m-%d-", l:time) . l:asctitle
    let l:fname = expand(g:octopress_rootdir) . '/source/_posts/' . l:fbase . '.'  . g:octopress_article_ext
    let l:is_create = 1
    if ( findfile(l:fname) != "" )
        let l:ec = tolower(input("'".l:fbase.'.'.g:octopress_article_ext."' is exist create/overwrite/edit [c/w/e]?:"))
        if ( l:ec == "w" )
            call delete(l:fname)
        elseif (l:ec == "c" )
            let l:ii = 0
            while ( 1 )
                let l:ii += 1
                let l:fname = expand(g:octopress_rootdir).'/source/_posts/'.l:fbase.'_'.l:ii.'.'.g:octopress_article_ext
                if ( findfile(l:fname) == "" )
                    break
                endif
            endwhile
        elseif (l:ec == "e" )
            let l:is_create = 0
        else
            return
        endif
    endif
    if ( l:is_create )
        let l:utf8title = ""
        if ( has('iconv') )
            let l:utf8title = iconv(l:atitle, &enc, "utf-8")
        else
            let l:utf8title = l:atitle
        endif

        let l:wlines = ['---', 'layout: post']
        let l:wlines += ['title: "' . l:utf8title . '"']
        let l:wlines += ['date: '. strftime("%Y-%m-%d %H:%M", l:time)]
        let l:wlines += ['comments: true', 'categories: ', 'description: ', 'keywords: ', '---', '']

        call writefile( l:wlines, l:fname )
    endif
    if ( l:asctitle == l:atitle )
        "タイトルに日本語が含まれない場合、明示的にutf-8にしてみる
        "タイトルにファイル名に使えない文字が含まれてる場合ここを通らないけど
        augroup au_oct_new
            au BufEnter * setl fenc=utf-8
        augroup END
    endif
    execute "edit" . " ++enc=UTF-8 " . l:fname | "normal G"
    if ( l:asctitle == l:atitle )
        augroup au_oct_new
            autocmd!
        augroup END
    endif
endfunc

_vimrcに以下を追加

command! -nargs=? OctNewPost call myvimrc#new_article(<q-args>)
let g:octopress_article_ext = "krd"
let g:octopress_rootdir = '~/octopress'

使い方は

:OctNewPost [title]

みたいにして使う。titleを省略した場合、入力を求めるように作ってみた。
vimのキーに割り振るなり、ランチャーにコマンド実行オプション付けてvim起動するように登録するなりすればいい(私は後者)

titleには日本語入れても大丈夫。またファイルの文字コードはUTF-8になるように細工してる。

ファイル名は”yyyy-mm-dd-title.ext”みたいになる。ファイル名に全角文字入れたら不味そうな気がする ので、titleの全角文字は省いたファイル名を作るようにしてみた。

但し、match_characterはKaoriya-vimに入ってるhz_ja.vimから頂いたが、イマイチ意味が分かってない。 myvimrc.vimは文字コード(または内部エンコーディング)をshift-jis(cp932)とかにしないと思った通りに 動かなかったりするのかも。


Markdown記法のパーサはデフォルトではrdiscountが使われている。Jekyllのソースコードを見てみると kramdownも対応してるみたいなので、_config.yml

markdown: kramdown

に変更して運用。多分他にもmaruku、redcarpetというパーサに対応してるぽい(癖が分からないので試してない)

Vimで拡張子krdの時kramdown用のシンタックスファイル(自作)が有効になるようにしてるので、新規作成時の 拡張子をkrdにしてるが、そうするとJekyllがMarkdown形式ファイルだと認識してくれないので_config.yml

markdown_ext: "markdown,mkd,mkdn,md,krd"

を追加してrake generate

記事のプレビュー
cd octopress
rake generate    #必要なとき
rake preview

ウチの環境ではSSHクライアントから上記コマンドを打つ。ちょっと面倒。

ブラウザで

http://server-ip-address:4000/

を見ると、プレビュー出来る。記事などを更新して、ブラウザを再読込すると自動的に更新してくれる。 素晴らしい。

記事の投稿
cd octopress
rake generate    #必要なとき
rake deploy

ウチの環境ではSSHクライアントから上記コマンドを打つ。ちょっと面倒。

rake gen_deployとするとgenerateとdeploy両方してくれるみたい。

Octopressの更新
git fetch octopress
git pull octopress master

最後に

環境の構築に手間取ったが、ローカルで色々テスト出来るし、拡張性は無限大だし、運用も快適に出来そうだ し、でかなり良い感じかも。

ということで、たぶん今後はOctopressに乗り換えると思う

ここにこのページをOctopressで作ったページを置いておく。

トラックバック

このページのトラックバックURL:
http://app.blog.eonet.jp/t/trackback/558347/27728475

Octopressを試してみるを参照しているブログ:

コメント

コメントを投稿

最近のコメント