読者です 読者をやめる 読者になる 読者になる

あれもPython,これもPython

Pythonで世界を包みたい

IPythonNotebookのノートがたくさんなのが嫌なのでブログに変換する

IPythonNotebook、便利ですよね。
データ分析ツールとしても良し。
コードの確認としても良し。
実際のノートとして使っても良し。
HTMLしたら共有も楽勝〜。

でもわがままな人はこう思ったりするんです。
「ノートがファイルに別れてるから、共有しにくい」

それ、解決しましょう。
Pythonの静的CMS「Pelican」にIPythonNotebookのノートが流し込めます。
ブログとして閲覧できるようになります。

Pelicanとは

動的CMSと言えば、Wordpress
これはデータベースに記事を格納してます。
Pelicanはそれとは異なりPython製の静的CMS
対して、静的CMSは事前にHTMLを出力して、
それを静的サーバでブログとして提供します。

なので、DropboxのPublicフォルダや、GitHubPageでもブログが公開できるんです。
ちょっとした身内用のブログ公開に便利です。
で、IPythonNotebookのノートを研究室メンバーだけとか、
チームメンバーだけにチョッパヤで公開出来ます。

Pelican入門

pip install pelican

基本はreSTなので、欲しければmarkdownモジュールも。

あとはブログ用のプロジェクトを作るだけです。

mkdir blog
cd blog

pelican-quickstart

こうするとPelicanがブログ名などを聞いてきます。
わかんなければエンター連打で。
タイムゾーンと使用言語だけはちゃんと答えておいてもいいかも。
(後で設定ファイルで変えられます)

一通り終わると、プロジェクトが出来てます。

blog
├content
├output
├pelicanconf.py
└publishconf.py

contentディレクトリに記事ファイルを置いて、

pelican content

とターミナルから実行すると、
outputに出力ファイルができています。
確認したいときは、outputディレクトリに移動して
python -m SimpleHTTPServer=>ブラウザで確認。

なお、公開用の出力を行うときはpelican content -s publisconf.pyを実行します。

記事の作成

contentフォルダにいれる記事のファイルには

Title:
Slug:
Date:
Category:
Tags:
Author:
Summary:

というヘッダー情報を入れておく必要があります。
あとはMarkdownやreSt書式で書いておけばOK。

IpythonNotebookのノートを変換する

IPythonNotebookのノートから記事をつくるには、
プラグインが必要です。

github.com からクローンしてきます。

blog
├content
├output
├plugins
│└ipynb
├pelicanconf.py
└publishconf.py

のようにplugins/ipynbディレクトリをつくり
、 クローンしてきたファイルをそこに置きます。

pelicanconf.pyに

MARKUP = ('md', 'ipynb')
PLUGIN_PATHS = ['./plugins']
PLUGINS = ['ipynb.markup']

という記述を追加。
これで下準備は完了。

ノートをつくる

ここまできたら、
普通にIPythonNotebookでノートをつくります。
contentフォルダに作ってください。
ノートができたら、ノートをテキストエディタで開きます。
(ノートはjsonファイルなのでテキストエディタで編集できます)
そしたら、セル情報ではない、ノート情報のmetadataにPelican用の情報を足します。

{
====セルの情報=====
 "metadata": {
        "name": ,
        "Title": ,
        "Date": ,
        "Category":,
        "Tags": ",
        "slug": ",
        "Author": ,
====その他情報====
}

あとはPelican contentをすればブログ用のHTMLが出力されます。

注意

私のPython2.7系環境だと、
プラグイン実行時にエラーが出ます。
core.pyの85行目のBeautifulSoupの記述を以下のように変えます。

       soup = BeautifulSoup(content,"html.parser")

また、markup.pyの92行目もcodecエラーを起こすので以下のように変えます。

          content=content.decode("utf-8")

これで一旦動きます。

なお、IPythonNotebookに関してはこの本が今のところはおすすめです。