ブログを移転した
これまでは約二年ほど はてブロに, メモや学習ログなどを投稿し, 利用させて頂いていたが, LATEX の記述においてはてブロ固有の独特な記法を必要とされることがあり, これらの点で 少し不便に感じていたので, 新たにブログを立ち上げこちらに移転することとした. このブログは github pages でホスティングされており, Pelican という Static site generator によって成り立っている. またテーマは, nikhil-theme をフォークして利用させて頂いている.
移転で行った作業
流れとしては, 通常通り, pip
で Pelican を導入し, pelican-quickstart
によって必要なディレクトリ階層と, 最低限のファイル構成を得て, そこから諸々の設定を行った. Pelican + github pages でブログを管理する事例はとても多く, またドキュメントも充実しており, 特別困ることはなかったが, いくつかテーマの修正, 機能追加などを行った.
本ブログ構造や管理に関する変更の記録は, 本エントリにて随時更新している.
- HTTP コンテンツが入り混じっていたため, これを修正した.
- Pelican の 3.7.0 から
PAGES
という context variable がpages
に変更されており, そのままでは正常にレンダリングされないためこれを修正した. - favicon の生成を ImageMagick で行い, これを Wiki 通りに設定した.
- コメント機能となる DISQUS を追加した.
- CC ライセンスを追加した.
- 検索機能を追加した.
- 404 ページを追加した.
- pelican_dynamic プラグインを fork し, 少し修正して導入して d3.js が動くようにした.
- テーマ内臓のシンタックスハイライトのスタイルシートが Mathjax の利用するスタイルシートと衝突しており(該当部分), 数式が緑色でレンダリングされてしまっていた. これを, ワークアラウンドとして Mathjax の使うクラスに対して
color: inherit;
を指定し, 修正した1. - python-livereload を用いて記事のライブビューができるようにした. バックグラウンドで立ち上がって欲しいので, それら諸々をシェルスクリプトで書いた(以下の gist をサブモジュールとしてマスターブランチに登録している).
#!/usr/bin/env python3 | |
from livereload import Server, shell | |
from sys import argv | |
class live_view: | |
def __init__(self): | |
self.sv = Server() | |
self.is_run = False | |
def __enter__(self): | |
return self | |
def run(self, is_open): | |
self.is_run = True | |
self.sv.watch('./content', shell('make html -f ./Makefile')) | |
if is_open: | |
self.sv.serve(open_url_delay=1, debug=False, root='./output', port=8000, host='localhost') | |
else: | |
self.sv.serve(root='./output', port=8000, host='localhost') | |
def __exit__(self, exception_t, exception_v, traceback): | |
if self.is_run == False: | |
self.run(False) | |
def run(is_open): | |
with live_view() as lv: | |
lv.run(is_open) | |
def main(): | |
if len(argv) == 2 and argv[1] == 'browse': | |
run(True) | |
elif len(argv) >= 2: | |
print ('Usage: {} [OPTION]\nOPTION:\n\tbrowse -- Opening new page in default browser.'.format(argv[0])) | |
else: | |
run(False) | |
if __name__ == '__main__': | |
main() |
#!/bin/bash | |
BASE_DIR=$(pwd) | |
LIVE_PREV_PID=${BASE_DIR}/live_preview.pid | |
GREEN=$(tput setaf 2) | |
RED=$(tput setaf 1) | |
NORMAL=$(tput sgr0) | |
COLUMNS=$(tput cols) | |
alive() { | |
kill -0 $1 >/dev/null 2>&1 | |
} | |
failed_message() { | |
failed="[Failed]" | |
cl_width=$(($COLUMNS-$1)) | |
printf '%s%*s%s\n' "$RED" $cl_width "$failed" "$NORMAL" | |
} | |
ok_message() { | |
ok="[OK]" | |
cl_width=$(($COLUMNS-$1)) | |
printf '%s%*s%s\n' "$GREEN" $cl_width "$ok" "$NORMAL" | |
} | |
usage() { | |
echo -e "Usage: $0 [OPTION]\nOPTION" | |
echo -e "\tstart [start_option] -- start live preview on background\n\tstart_option:\n\t\tbrowse -- Opening new page in default browser\n" | |
echo -e "\tstop -- stop live preview on background\n" | |
exit 1 | |
} | |
shut_down() { | |
mes="shutting down live preview..." | |
echo -n $mes | |
if [ ! -e $LIVE_PREV_PID ]; then | |
failed_message ${#mes} | |
echo "not found pid file in ${BASE_DIR}" | |
exit 1 | |
fi | |
pid=$(cat $LIVE_PREV_PID) | |
if alive $pid; then | |
kill $pid | |
while alive $pid; do | |
sleep 0.5 | |
done | |
ok_message ${#mes} | |
else | |
failed_message ${#mes} | |
echo "stale pid detected, cleaning" | |
fi | |
rm $LIVE_PREV_PID | |
} | |
start_up() { | |
if [ -e $LIVE_PREV_PID ]; then | |
echo "Pid file detected. Checking status..." | |
pid=$(cat $LIVE_PREV_PID) | |
if alive $pid; then | |
echo "Live preview is alive, restarting" | |
shut_down | |
start_up $1 | |
else | |
echo "stale pid detected, cleaning and restarting" | |
rm $LIVE_PREV_PID | |
start_up $1 | |
fi | |
else | |
if [ $# -eq 1 ] && [ $1 != "browse" ]; then | |
./live_preview.py | |
else | |
echo "starting live preview..." | |
./live_preview.py $1 & | |
pid=$! | |
echo $pid > $LIVE_PREV_PID | |
fi | |
fi | |
} | |
### main | |
if [ $# -eq 0 ] || [ $1 != "start" -a $1 != "stop" ]; then | |
usage | |
elif [ $1 = "start" ]; then | |
start_up $2 | |
elif [ $1 = "stop" ]; then | |
shut_down | |
fi |
- ローカルマシンでのサイト生成をやめ, 特定ブランチへのプッシュをトリガーに Bitbucket Pipeline によってサイト生成, デプロイを行うこととした.
構造
フォークしたテーマと pelican-plugins をマスターブランチのサブモジュールとして置いた. マスターブランチには, ブログ記事の下書きなども貯めようと思っていたため, 特別これを公開する意味はない. そこで, マスターブランチは private リポジトリとして bitbucket に, gh-pages ブランチは github にホスティングして頂くこととした2.
gh-pages への反映は, ghp-import を利用している. 記事を公開しようとするたびに毎度ブランチをチェックアウトするのは面倒なので, Makefile にコマンドを書いておき, そのコマンド一発で記事の生成と gh-pages へのプッシュを行えるようにした. また, bitbucket には標準搭載の CI (bitbucket Pipelines) があるので, master ブランチへのプッシュをトリガーに, 自動で記事の生成テストを行うようにしている.
-
2019/1/7, The GitHub Blog でアナウンスされた通り, マイクロソフトに買収された GitHub はプライベートリポジトリの機能を一般ユーザへ無償で公開した. 従って, プライベートリポジトリの機能を使うために, GitHub 以外のサービスを用いるということの必然性はなくなったわけであるが, なんとなくベンダーロックインしてしまうことに抵抗があるので, この構成で運用を続けていく予定. ↩