プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

Sphinx+翻訳 Hack-a-thon 2014.1でEpub3ビルダーの実装の続きをしてました #sphinxjp

Sphinx+翻訳 Hack-a-thon 2014.1/Sphinxハンズオン

かなり久しぶりに参加してきました。と思って調べてみたら、昨年の10月に参加していたようです。記憶は当てになりませんね。

やったこと

SphinxのEpub3ビルダー実装しようと悪戦苦闘してました。

最初に言っておきますが、Epub3ビルダーといっても、まず形式をEpub3形式にする最初の段階のものなので、これができあがったからといってすぐに縦書きだとかルビ使えるとか思わない方がいいですよ。

Epub3ビルダー、これまで躓いていたのは目次に当たるナビゲーションドキュメントの生成だったのですが、ここにきてようやく形になりつつあります。

下のスクリーンショットはMacアプリのMurasakiで開いたPython3.3のepub2ドキュメントです。目次の階層構造が複雑であるという点でテストに適しているので、Python3.3日本語ドキュメントのリポジトリをテストに使用させてもらってます。

次が今作っているEpub3ビルダーで生成したPython3.3のepub3ドキュメントです。

左メニューに表示された目次はまだ階層構造を表現できていないですが、単なるページ内での目次ならちゃんとepub2のものを写し取れるようになってきています。

…が、はっきりいってコピペ&場当たり的なコードで作っているので、現状では下のようにiBooksとか他のリーディングシステムだとinvalidだと警告が出ます*1

epub2の方だとこんな感じ。

結構長い間手を付けていなかったのでそろそろ作業再開して、いい加減報告できるような形にしたいと思ってます。

今日のハッカソンでepub2の方を生成するときの動きをデバッガ使って結構調べられたので、epub3の場合はどうするか考えながら作業進めたいですね。

*1:別にiBooksがEpubリーディングシステムとして優れているというわけではないと思いますがね。

Bootstrap3からFoundation5に移行した

昨日Bootstrap3にしたって記事を書いたばかりですが、今ちょこちょこ手を入れているゲストブックアプリに使っているCSSフレームワークFoundation5に移行してみました。

何で移行したかっていうと、

  • 元々Foundationの方に興味があった。
    • というかみんなBootstrapの方使ってるし、みんなが使っているのに興味あんまり湧かない性格なので。
    • アニメとかゲームでもそうなので。
  • ドキュメントの読みやすさはFoundationの圧勝だった(個人的に)
    • というかBootstrapのページ、あれ元々CSSフレームワークをどういう風に使うものなのか分かってる人しか読みやすくないのでは? と思うくらい、読みにくかった。
    • Bootstrapのページの読みにくい原因の大半は、最初の方に「Bootstrap2から3への移行の仕方」みたいな既存ユーザー向けの記述が来ているのに対して、新規ユーザー向けの「そもそもこんな特徴があります」「○○はこういうものです」といった説明がされてないように見える。
    • あと、Bootstrapのページ見てリファレンス見たかったのにそれっぽい項目無いなとか思ってたら、"CSS"の中にあるとかそれないだろ!
    • Foundationの方は、ドキュメントは"Docs"って分かるように書いてあったし、古いバージョンからの移行の仕方は別個に分かりやすいように置いてあったので、新規ユーザーの自分にとっては自然な流れで頭から読めたのが非常に好印象だった。

結構Foundation推しな感想ですけど、単純に第一印象のみの感想なので、地力の差を表しているわけでは無いですよ、と言っておきます。

どうせ世の中にはFoundationのノウハウよりBootstrapのノウハウの方が数が多いでしょうから、単純にいったらBootstrap使っていた方が詰まったときに解決法探しやすいと思います。

が、まだ今のところ個人的な使用しかしていないし、簡単な使い方程度ならどちらも似ているところがあるので学習移行コストもそれほど高くないだろうと思ってやっていきます。

以上。

Bootstrap3とか初めて使ってみた

今お遊びで自分のプロフィールサイトとかゲストブックアプリとかをGoogle App Engine上に乗せて遊んでいると以前記事で書いたと思うのですが、そのゲストブックアプリにBootstrapとかを使ってみました。というだけの記事です。

適当に使っただけなので全く見やすくなっていないのですが、とりあえず最初の段階はクリアしたのかなとか思ってます。

CSSフレームワークとか一つでもいいから主だったものをパッと使えるようになっているのといないのとでは多分でもサイト構築力も段違いになるんだろうなあ、とか思っているので。

今日は上記のゲストブックアプリとかを動かしているMartiniの使い方も少しまた学んだので、明日辺りにまた記事かけるといいなあ…

毎日ブログ更新できている人ってどれだけすごいんだよ、と再認識している

タイトルで言いたいことは全て言った!

新年明けてから(ほぼ)毎日ブログを更新しているが…

中身の質を問わなければ、今年に入ってからはかなりマメにブログを書いている。1日を除いて毎日一応書いているので。

で、そこでまた思ったのはタイトルの通り、「毎日ブログ更新できている人はすごいですね」ということ。

毎日更新するということはぱっと思いつく限りでもこんな障害がある。

  • 毎日更新できるだけの「ネタ」の確保
  • 毎日更新するための「時間」の確保
  • 毎日更新するための「モチベーション」の維持

特に今回、毎日に近い感覚で更新していて痛感するのは、時間の確保の難しさだ。

毎日決まった時間に書いて投稿するのが恐らく習慣を形成する意味でも楽になるので、そうした方が毎日更新できるようになると実感しているが、平日と週末で人は普通生活パターンが変わるし、そうでなくても予定があるときと無いときでは確保できる時間帯が変わってくる。

「確保できる時間が変わってくるからって何なんだよ」と思う人は一回半月だけでもいいから毎日記事書いてブログ更新してみればいいと思う。確保できる時間が変わると結構更新するリズム壊れるものですよ?

まあ、そんなわけで、定期的に更新しているブログはそれだけですごいし、記事の中身も充実しているとしたらそれだけでかなり上澄み層なんだなと思いました。まる。

…一応コード書いてるんだけど、記事にするには時間不足なんだよ!(愚痴)

Githubを散策して気になっているものとか列挙してみる

今日も空手稽古があって時間が無いので手抜き記事です。早くこういう状態から脱却したい。

Github上で気になっているプロジェクトとか列挙してみる

最近はPC立ち上げて暇になったらGithubのTrendingページをよく眺めています。特に最近はgolangをいじっているのでGoのTrendingを見たりしているのですが、そういうウォッチの中で何か気になっているけどまだ手が付けられていないものでも列挙していこうかなとか思ってます。

多分時間とやる気が無いのでリンク張るだけになると思いますが。

Goの場合

Pythonのもの

  • Zulko / picnic.py

    • "Easy Python packages creation."だそうで。未だにPythonのパッケージの作り方分かってないので気になっている。
  • skariel / webalchemy

    • PythoniumとTornado使ったWebアプリ作成のためのものっぽい?でもちょっといじっても動かなかったのでよく分かってない。
  • gregmalcolm / python_koans

    • "Learn Python through TDD"とのことなので。TDDとかのエッセンス身につけたいし。

結論

時間を上手く活用していかないといけない。

アニメでヒストリエのパロディがされる昨今なのでヒストリエ読みましょう

ザ・手抜き記事。

ヒストリエをパロったアニメ

19:42あたりから始まります。1/26頃には有料になると思われるので、パロディ部分だけでも見ましょう。

パロディ元の名作漫画

ヒストリエ(8) (アフタヌーンKC)

ヒストリエ(8) (アフタヌーンKC)

最新刊は8巻のようだけど、今からでも十分追いつける!なぜなら進行が激遅だから!

1巻進むのに余裕で年単位かかっているはず。

…というか私も最新刊まだ買ってないので早く買わなくては…

golang製フレームワークのMartiniで簡単にHTMLとかをレンダリングしてみる

前回の記事の続きというか、Martiniの使い方のちょっとした紹介です。例によって公式に書いてあるものほぼそのものですけど。

で、今日やる内容は「html/templateパッケージを使うより楽にHTMLとかレンダリングする方法」です。まあ、一言で言ってしまえばmartini-contribっていうMartiniのアドオンを使うやり方なんですが。

前準備

何はなくともgo getです。

今回はmartini-contrib/renderパッケージを使用しますので、以下のようになります。

go get github.com/codegangsta/martini
go get github.com/codegangsta/martini-contrib/render

ファイル構成と中身

では実際のコードを記載する前にファイル構成を示しておきます。

├── server.go
└── templates
    └── hello.tmpl

前回と同じく、中核のコードはserver.goに記載するものとして考えてください。

今回はテンプレートとなるファイルを用意する必要があります。それがtemplatesディレクトリ下のhello.tmplです。公式のものそのままですが、中身はこんな感じだとして進みます。

gist8519450

では次にserver.goの中身です。

gist8518799

公式に書いてあるものほぼそのままですが、前回の記事の内容を受けているので、ハンドラを切り分けてhello関数としています。

これで前回と同じようにgo run server.goとやってhttp://localhost:3000/ にアクセスすれば、Hello master!と表示されるはずです。

今回のポイント

今回のポイントはmiddlewareであるmartini-contrib/renderパッケージを使っているところで、インポートした後m.Use()の引数にmiddlewareを渡してやればそのmiddlewareを使えるようになります。

このmartini-contrib/renderパッケージを使ってやれば、hello関数の中を見て分かるように、render.Render.HTML()に引数を3つ渡してやれば、あらかじめ用意してあるテンプレート(デフォルトではtemplatesディレクトリ下のtmplファイル群)を使用してHTMLをレンダリングしてくれます。

第一引数は返すべきステータスコード、第二引数は使用したいテンプレートファイルの名前、第三引数はテンプレートをレンダリングするときに使用したい情報です*1

今回の応用

middlewareを登録するときにオプションの情報を渡してやることで挙動を変えることができます。

gist8518873

この時のファイル構成はこうです。

├── server.go
└── templates
    ├── hello.tmpl
    └── layout.tmpl

詳しくは公式の情報参照。主だったものだけ以下で紹介します。

テンプレートディレクトリの指定

デフォルトではルート下にあるtemplatesディレクトリの.tmplファイルをテンプレート候補として探すようになっていますが、以下のオプションを指定するとテンプレートディレクトリを別のものに変更することが出来ます。

m.Use(render.Renderer(render.Options{
        Directory:  "another-templates",
    }))

レイアウトの指定

レイアウトの元になるファイルを指定できます。

m.Use(render.Renderer(render.Options{
        Layout:     "layout",
    }))

こう書くとlayout.tmplをレイアウトの元として指定します。

で、layout.tmplを以下のように書くとyield functionを使用したところにテンプレートをレンダリングします。まあ要するにJinja2とかでやるテンプレートの継承とかでやるような「レイアウトを設定するファイルを定義できる」ということです。多分。

gist8519662

テンプレートファイルの拡張子の追加・変更

デフォルトでは.tmplしかテンプレートとして解釈されないみたいですが、オプションで拡張子を追加すれば.htmlもテンプレートとして使えるようになります。エディタの都合とか考えると.htmlの方がいいという場合は多いと思うのでやってみたらいいと思います。

m.Use(render.Renderer(render.Options{
        Extensions: []string{".tmpl", ".html"},
    }))

他のオプションは公式リポジトリの説明でも見てください。ぶっちゃけ使ったことあるものしか紹介できないので。

最後に

MartiniはPythonで言えばFlaskみたいなもののように感じますが、こうやってmiddlewareを使えば機能も増やせるところがいいかなと思います。自分で作ることも出来るみたいですし。*2

今回はHTMLのレンダリングだけでしたが、同じやり方でjsonレンダリングも簡単にできるみたいなのでAPIサーバとかも割合簡単に実装できるかもしれません。

*1:html/templateの使い方参照、というか私もよく分かってません

*2:まだやり方分かりませんけど