ハローワールド

木 22 3月 2018

ブログを移転した

これまでは約二年ほど はてブロに, メモや学習ログなどを投稿し, 利用させて頂いていたが, LATEX の記述においてはてブロ固有の独特な記法を必要とされることがあり, これらの点で 少し不便に感じていたので, 新たにブログを立ち上げこちらに移転することとした. このブログは github pages でホスティングされており, Pelican という Static site generator によって成り立っている. またテーマは, nikhil-themeフォークして利用させて頂いている.

移転で行った作業

流れとしては, 通常通り, pip で Pelican を導入し, pelican-quickstart によって必要なディレクトリ階層と, 最低限のファイル構成を得て, そこから諸々の設定を行った. Pelican + github pages でブログを管理する事例はとても多く, またドキュメントも充実しており, 特別困ることはなかったが, いくつかテーマの修正, 機能追加などを行った. 本ブログ構造や管理に関する変更の記録は, 本エントリにて随時更新している.

#!/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()
view raw live_preview.py hosted with ❤ by GitHub
#!/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
view raw live_preview.sh hosted with ❤ by GitHub
  • ローカルマシンでのサイト生成をやめ, 特定ブランチへのプッシュをトリガーに Bitbucket Pipeline によってサイト生成, デプロイを行うこととした.

構造

フォークしたテーマと pelican-plugins をマスターブランチのサブモジュールとして置いた. マスターブランチには, ブログ記事の下書きなども貯めようと思っていたため, 特別これを公開する意味はない. そこで, マスターブランチは private リポジトリとして bitbucket に, gh-pages ブランチは github にホスティングして頂くこととした2.

  • master (非公開なのでここに貼っても特別意味はないが)
  • gh-pages

gh-pages への反映は, ghp-import を利用している. 記事を公開しようとするたびに毎度ブランチをチェックアウトするのは面倒なので, Makefile にコマンドを書いておき, そのコマンド一発で記事の生成と gh-pages へのプッシュを行えるようにした. また, bitbucket には標準搭載の CI (bitbucket Pipelines) があるので, master ブランチへのプッシュをトリガーに, 自動で記事の生成テストを行うようにしている.


  1. おそらく #349 の問題も, この関係なのではないかと思われる. 

  2. 2019/1/7, The GitHub Blog でアナウンスされた通り, マイクロソフトに買収された GitHub はプライベートリポジトリの機能を一般ユーザへ無償で公開した. 従って, プライベートリポジトリの機能を使うために, GitHub 以外のサービスを用いるということの必然性はなくなったわけであるが, なんとなくベンダーロックインしてしまうことに抵抗があるので, この構成で運用を続けていく予定.