焼肉が食べたい

ただの日記です。技術的に学んだことも書こうと思っていますが、あくまで自分用メモです。 プロフィールはこちら。https://chie8842.github.io/aboutme/

Python3.5.3+conda+Jupyter Notebookでpyarrow(apache arrow)を使えるようにする

pythonのライブラリには、apache Arrowではない、arrowという日付や時刻に関する処理を行うライブラリもあるので注意。

ドキュメントでは、pipでインストールできると書いてあるのに、 pipではそんなパッケージはないと怒られた。

chie8842@chie-no-ubuntu:~/work/tensorflow$ pip install pyarrow
Collecting pyarrow
  Could not find a version that satisfies the requirement pyarrow (from versions: )
No matching distribution found for pyarrow

JIRAを見ると、pipはarrow0.2では使えなくて、次のバージョンから対応する予定らしい。
https://issues.apache.org/jira/browse/ARROW-240

仕方ないのでconda環境構築。
※3/8現在、pyarrowの対象バージョンは、2.7,3.4,3.5のみ。
最新のanaconda3-4.3.0はpython3.6ベースなので、
python3.5.2ベースのanaconda3-4.2.0を入れる。

chie8842@chie-no-ubuntu:~/work/tensorflow$  pyenv install anaconda3-4.2.0
chie8842@chie-no-ubuntu:~/work/tensorflow$ pyenv local anaconda3-4.2.0
chie8842@chie-no-ubuntu:~/work/tensorflow$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (64-bit)

## 上記でpythonバージョンが切り替わっていない場合は、以下を実施して環境を更新する
chie8842@chie-no-ubuntu:~/work/tensorflow$ pyenv rehash


chie8842@chie-no-ubuntu:~/work/tensorflow$ conda create -n py3.5.3-conda4.2.0 python=3.5.3 anaconda
chie8842@chie-no-ubuntu:~/work/tensorflow$ source ~/.pyenv/versions/anaconda3-4.2.0/bin/activate py3.5.3-conda4.2.0
(py3.5.3-conda4.2.0) chie8842@chie-no-ubuntu:~/work/tensorflow$ conda info -e
# conda environments:
#
py3.5.3-conda4.2.0    *  /home/chie8842/.pyenv/versions/anaconda3-4.2.0/envs/py3.5.3-conda4.2.0
root                     /home/chie8842/.pyenv/versions/anaconda3-4.2.0

(py3.5.3-conda4.2.0) chie8842@chie-no-ubuntu:~/work/tensorflow$ conda update conda
(py3.5.3-conda4.2.0) chie8842@chie-no-ubuntu:~/work/tensorflow$ conda install -c conda-forge pyarrow

ついでにほかのライブラリもインストールしておく。

(py3.5.3-conda4.2.0) chie8842@chie-no-ubuntu:~/work/tensorflow$ conda install matplotlib seaborn scikit-learn

インストールされているライブラリ一覧を見る

(py3.5.3-conda4.2.0) chie8842@chie-no-ubuntu:~/work/tensorflow$ conda list (-n environment_name)

jupyter notebookを立ち上げる

jupyter notebook

これだとpyarrowが使えなかった。。。
py3.5.3-conda4.2.0をdeactivateして、condaのrootにpyarrowをインストールして、jupyter notebookを再起動すると、使えるようになってた。

docker インストールとTensorflowコンテナの起動

Dockerのインストール・設定とTensorflowコンテナを起動した時の手順。
Dockerインストール手順はちょくちょく変わっているようなので、最新の情報は公式ドキュメントを参照すること。

公式ドキュメントでのUbuntuへのDockerインストール手順
Get Docker for Ubuntu - Docker Documentation

Dockerインストール

sudo apt-get update
# …
# Reading package lists... Done

sudo apt-get -y install \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual
# …
# Setting up linux-image-generic (4.4.0.66.70) ...
# Setting up linux-image-extra-virtual (4.4.0.66.70) ...
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# [sudo] password for chie8842:
# OK
sudo apt-key fingerprint 0EBFCD88
# pub   4096R/0EBFCD88 2017-02-22
#       Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88 <- 公式ドキュメント(https://docs.docker.com/engine/installation/linux/ubuntu/#install-using-the-repository)に載っているフィンガープリントと一致しているか確認すること。
uid                  Docker Release (CE deb) <docker@docker.com>
# sub   4096R/F273FCD8 2017-02-22

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

sudo apt-get update
# …
# Reading package lists... Done
sudo apt-get install docker-ce
apt-cache madison docker-ce
#  docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
sudo docker run hello-world
# Unable to find image 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# 78445dd45222: Pull complete
# BDigest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
# Status: Downloaded newer image for hello-world:latest

# Hello from Docker!
# This message shows that your installation appears to be working correctly.

# To generate this message, Docker took the following steps:
#  1. The Docker client contacted the Docker daemon.
#  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#  3. The Docker daemon created a new container from that image which runs the
#     executable that produces the output you are currently reading.
#  4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

# To try something more ambitious, you can run an Ubuntu container with:
#  $ docker run -it ubuntu bash

# Share images, automate workflows, and more with a free Docker ID:
#  https://cloud.docker.com/

# For more examples and ideas, visit:
#  https://docs.docker.com/engine/userguide/

インストール後の設定

現在のユーザでDockerを実行できるように権限付与する

sudo groupadd docker
# groupadd: group 'docker' already exists
sudo usermod -aG docker $USER
docker run -it ubuntu bash
# docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied.

# 公式ドキュメントの通りだと、ここでdocker run に成功するはずだが、
# 上記のように失敗する。OS再起動したらうまくいくようになった。
sudo shutdown -r now
docker run -it ubuntu bash
# Hello from Docker!
# This message shows that your installation appears to be working correctly.

# To generate this message, Docker took the following steps:
#  1. The Docker client contacted the Docker daemon.
#  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
#  3. The Docker daemon created a new container from that image which runs the
#     executable that produces the output you are currently reading.
#  4. The Docker daemon streamed that output to the Docker client, which sent it
#     to your terminal.

# To try something more ambitious, you can run an Ubuntu container with:
#  $ docker run -it ubuntu bash

# Share images, automate workflows, and more with a free Docker ID:
#  https://cloud.docker.com/

# For more examples and ideas, visit:
#  https://docs.docker.com/engine/userguide/

Dockerサービスの起動と自動起動の設定

sudo systemctl enable docker
# [sudo] password for chie8842:
# Synchronizing state of docker.service with SysV init with /lib/systemd/systemd-sysv-install...
# Executing /lib/systemd/systemd-sysv-install enable docker

sysv-rc-conf --list |grep docker
# docker       0:off      1:off   2:on    3:on    4:on    5:on    6:off
# 自動起動がONになっていない場合は、自動起動をONにする。
sudo sysv-rc-conf docker on

Tensorflowコンテナの起動

docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow # 初回はDockerイメージのダウンロードが行われるので時間がかかる
# …
#     Copy/paste this URL into your browser when you connect for the first time,
#     to login with a token:
#         http://localhost:8888/?token=******* <-このURLでブラウザを開くと、Jupyter Notebookにアクセスできる。 

開いたJupyter Notebookのキャプチャ

デフォルトでGetting StartedやMNistなどのサンプルのノートブックが入っている。

f:id:chie8842:20170327174654p:plainf:id:chie8842:20170327174658p:plainf:id:chie8842:20170327174702p:plainf:id:chie8842:20170327174705p:plain

起動スクリプトrc.localがFailする場合の対処

/etc/rc.localスクリプトで共有ディレクトリのマウント処理を行うようにしていたのだけれど、 なぜかわからないけれど、dockerを入れた後に、再起動してもマウントされなくなっていた。

source /etc/rc.local

とすると、きちんとマウントされる。 rc.localのサービスステータスを確認すると、以下のようになっていた。

chie8842@chie-no-ubuntu:~$ sudo systemctl start rc-local
● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: failed (Result: exit-code) since 月 2017-03-27 14:22:15 JST; 2min 1s ago
  Process: 897 ExecStart=/etc/rc.local start (code=exited, status=32)

 3月 27 14:22:15 chie-no-ubuntu systemd[1]: Starting /etc/rc.local Compatibility...
 3月 27 14:22:15 chie-no-ubuntu rc.local[897]: mount: mount //169.254.173.204/share on /home/chie8842/share f
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Control process exited, code=exited status=32
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: Failed to start /etc/rc.local Compatibility.
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Unit entered failed state.
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Failed with result 'exit-code'.
...skipping...
● rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
  Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: failed (Result: exit-code) since 月 2017-03-27 14:22:15 JST; 2min 1s ago
  Process: 897 ExecStart=/etc/rc.local start (code=exited, status=32)

 3月 27 14:22:15 chie-no-ubuntu systemd[1]: Starting /etc/rc.local Compatibility...
 3月 27 14:22:15 chie-no-ubuntu rc.local[897]: mount: mount //169.254.173.204/share on /home/chie8842/share f
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Control process exited, code=exited status=32
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: Failed to start /etc/rc.local Compatibility.
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Unit entered failed state.
 3月 27 14:22:15 chie-no-ubuntu systemd[1]: rc-local.service: Failed with result 'exit-code'.

手動で起動しようとしても失敗する。

chie8842@chie-no-ubuntu:~$ sudo systemctl start rc-local
Job for rc-local.service failed because the control process exited with erro                                r code. See "systemctl status rc-local.service" and "journalctl -xe" for det                                ails.

標準出力にあるコマンドを実行してみるが、原因はわからず。

chie8842@chie-no-ubuntu:~$ sudo systemctl start rc-local.service
Job for rc-local.service failed because the control process exited with erro                                r code. See "systemctl status rc-local.service" and "journalctl -xe" for det                                ails.
chie8842@chie-no-ubuntu:~$ journalctl -xe
 3月 27 14:10:21 chie-no-ubuntu systemd[1]: Time has been changed
-- Subject: Time change
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The system clock has been changed to REALTIME microseconds after January
 3月 27 14:10:21 chie-no-ubuntu systemd[1]: snapd.refresh.timer: Adding 1h 5                                1
 3月 27 14:10:21 chie-no-ubuntu systemd[1]: snapd.refresh.timer: Adding 5h 3                                3
 3月 27 14:10:21 chie-no-ubuntu systemd[1]: apt-daily.timer: Adding 6h 51min                                
 3月 27 14:10:21 chie-no-ubuntu systemd[1080]: Time has been changed
-- Subject: Time change
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The system clock has been changed to REALTIME microseconds after January
 3月 27 14:10:21 chie-no-ubuntu systemd[1695]: Time has been changed
-- Subject: Time change
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The system clock has been changed to REALTIME microseconds after January

最終的に、起動スクリプトの最初にsleepを入れるとうまくいった。

sleep 10
mount -t cifs …
exit 0

機械学習で遊びたいときに使えるデータまとめ

GroupLens

Datasets | GroupLens GroupLensは、推薦システム、オンラインコミュニティ、モバイルおよびユビキタステクノロジ、デジタルライブラリ、地理情報システムに特化したミネソタ大学のコンピュータサイエンスおよびエンジニアリング部門の研究室。
推薦システムの入力データとして利用できるデータセットが用意されている。
映画の視聴履歴データMovieLensが特に有名。
MovieLensは、csv形式で、データの欠落やばらつきがあるので、前処理も含めた処理を行う必要がある。
100k、10M、20Mなどいくつかのデータ量のデータセットがあり、それぞれデータ形式が微妙に違う。

Wikipedia

Wikipedia:データベースダウンロード - Wikipedia Wikipediaのデータ。
形態素解析を行うような処理で利用される。
データはXML形式で記述されているので、XMLをparseする前処理が必要。

UCIマシンラーニングレポジトリ

UCI Machine Learning Repository: Data Sets 様々な機械学習の論文などで利用されている機械学習用データのリポジトリ
たくさんのデータセットが登録されている。 各データセットの特徴はあまり見やすくない。

https://www.yelp.com/dataset_challengeYelp Captcha Yelpが提供しているデータセット
飲食店の情報やマスキングされた利用者のデータ。

AWSのパブリックデータセット

大規模なデータセットのリポジトリ | AWS のパブリックデータセット AWSが提供しているデータセットAmazon Elastic Block Store (Amazon EBS) スナップショットと Amazon Simple Storage Service (Amazon S3) バケットのいずれかのフォーマットで提供される。
提供されるデータの例: * AWS でのランドサット: ランドサット 8 号衛星により作成中の地球全土の衛星画像コレクション (解像度は中程度) * 1000 ゲノムプロジェクト: 人の遺伝的多様性の詳細なマップ * Google ブックスN-gram: Google ブックスN-gram コーパスを含むデータセット

Kaggle

Datasets | Kaggle 機械学習コンペティションKaggleのデータセット
コンペ用のデータだが、データだけダウンロードしてコンペに応募しなくてもOK。

LIBSVM

LIBSVM Data: Classification, Regression, and Multi-label LIBSVMは、機械学習に適した形式でデータを読み込むためのオープンソースAPI及びデータ形式のこと。
このLIBSVMのドキュメントページに、libsvm形式のデータセットの入手先がまとまっている。
データのクラス数や特徴量の数、データ量なども確認できる。

楽天 Rakuten Institute of Technology | 楽天データ公開 楽天技術研究所が大学、公的研究機関の研究での利用のために公開しているデータ。

  • 楽天市場 全商品データ (約1億5600万商品)、レビューデータ (約6400万レビュー)
  • 楽天トラベル 施設データ (約13万施設)、レビューデータ (約620万レビュー)
  • 楽天GORA 施設データ (1,669施設)、レビューデータ (約32万レビュー)
  • 楽天レシピ レシピデータ (約80万レシピ)、レシピ画像 (約80万画像)、Pickupレシピ (1,854レシピ)、デイリシャスニュース (362件)
  • 楽天Viki ビデオ属性情報 (623本)、ユーザー行動評価 (約488万件

利用できるビッグデータに関するスライドも見つけたので貼っておく。

www.slideshare.net

2017/5/28追記

Ubuntu16.04でVNCサーバを起動する

# VNCサーバのインストール
sudo apt-get install vnc4server

# VNC接続時のパスワードの設定
vncpasswd
# Password:
# Verify:

# VNCサーバの初回起動。これによって設定ファイルが作成される。
vncserver :1
# New 'chie-no-ubuntu:1 (chie8842)' desktop is chie-no-ubuntu:1

# Starting applications specified in /home/chie8842/.vnc/xstartup
# Log file is /home/chie8842/.vnc/chie-no-ubuntu:1.log


# 起動確認ができたらVNCサーバを停止する
vncserver -kill :1

~/.vnc/xstartupの内容を以下のとおりにする。

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey 
vncconfig -iconic &
x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
x-window-manager &
        
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &

VNCサーバを起動する

vncserver :1

再起動後もvncserverを起動しておきたい場合は、~/.bashrcもしくは/etc/rc.localのexit 0の前に以下を追記する。 ※/etc/rc.localに記述するときは、vncの設定をrootで行っておくこと。

vncserver :1

参照:

Install VNC on Ubuntu 16.04

HeapStatsの使い方メモ

HeapStatsの使い方。ツールの使い方はすぐ忘れるのでメモ。

HeapStatsとは

HeapStatsのWikiページ抜粋

HeapStats とは、JavaVM のヒープやGC状況を監視する軽量なツールで、エラーの兆候を検知してSNMPを通してリアルタイムなアラートを発します。生成するログはかなり小さいもので、GUIツールで解析することができます。 HeapStatsは、次の二つのプログラムで構成されます: エージェント(agent) - JavaVMの情報を収集するJVMTIエージェントプログラムです。 アナライザ(analyzer) - 上記の情報を解析する Javaアプリケーションプログラムです。

エージェントを使ってみる

環境はUbuntu16.04.2。

Javaインストール

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

インストールしたら、Javaのバージョンを確認する。

java -version
# java version "1.8.0_121"
# Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
# Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

プロファイリングを行うサンプルアプリの作成

ArrayListに要素を追加していき、ゆっくりとヒープサイズが大きくなるようにする

// OOMESample.java

import java.util.ArrayList;
import java.util.List;

public class OOMESample {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        long i = 0;
        while (true) {
            if (i++ % 2000 == 0) list.add("aaa");
        }
    }
}

作成したアプリケーションをコンパイルする

javac OOMESample.java
ls
# OOMESample.class  OOMESample.java

OOMESample.classができていること。

HeapStatsのインストール

git clone https://github.com/HeapStats/heapstats.git
sudo apt-get install ant maven binutils-dev libsnmp-dev
./configure
make
su -
make install
ldconfig
exit

HeapStatsをアタッチしてサンプルアプリを実行してみる

java -Xmx512m -agentlib:heapstats OOMESample
# heapstats INFO: HeapStats 2.0.trunk
# heapstats INFO: Supported processor features: AVX
# heapstats INFO: Agent Attach Enable = true
# heapstats INFO: SnapShot FileName = heapstats_snapshot.dat
# heapstats INFO: Heap Log FileName = heapstats_log.csv
# heapstats INFO: Archive FileName = heapstats_analyze.zip
# heapstats INFO: Console Log FileName = None (output to console)

エージェントがアタッチされると、heapstatsの標準出力が現れる。
アプリケーションが終了すると、以下のようにログが出力されている。

ls
# heapstats_analyze170309235501.zip
# heapstats_log.csv
# heapstats_snapshot.dat

エージェントの設定ファイルを操作する

今回は、ソースコードからビルドを行っているので、設定ファイル(heapstats.conf)のテンプレートは/usr/local/etc/にある。
設定を変更する場合は、これをコピーして使用する。

cp /usr/local/etc/heapstats.conf ./
# heapstats.confの設定を行う

java -Xmx512m -agentlib:heapstats=/path/to/heapstats.conf OOMESample

実行中のアプリケーションにエージェントをアタッチするf:id:chie8842:20170325134717p:plain

wget http://icedtea.classpath.org/people/yasuenag/heapstats_tools/raw-file/tip/AgentAttacher/AgentAttacher.java
javac -cp $JAVA_HOME/lib/tools.jar AgentAttacher.java

アプリケーション動作中に、以下を実行する

java -Xmx512m OOMESample # アプリケーションを起動する

java -cp $JAVA_HOME/lib/tools.jar:. AgentAttacher /usr/local/lib/libheapstats.so /path/to/heapstats.conf # アプリケーション実行中に別のプロンプトで実行する。
# Num Process-Info
#   0 AgentAttacher /usr/local/lib/libheapstats.so
#   1 OOMESample
# Input attach target process-number:1 <- エージェントをアタッチしたいプロセスの番号を入力する
# Attacher is successed.

アナライザを使ってみる

Analyzerを起動する

GUI画面上のエクスプローラで、/path/to/heapstats/analyzer/fx/target/heapstats-analyzer-2.0.trunkを開き、heapstats-analyzer.jarをダブルクリックすると、アナライザが起動する。

  • Log Data

    • Resource Data f:id:chie8842:20170325134726p:plain

    • Log Detail Data f:id:chie8842:20170325135147p:plain

  • SnapShot Data

    • Summary Data f:id:chie8842:20170325134729p:plain

    • Histogram f:id:chie8842:20170325134732p:plain

    • SnapShot Data
      f:id:chie8842:20170325134720p:plain:w260f:id:chie8842:20170325134714p:plain:w260

    • Reference Tree
      表示されなかった。理由は不明。

  • Thread Recorder f:id:chie8842:20170325134717p:plain

  • JVMLive
    リアルタイムでプロファイリング結果が見える機能っぽい。JVisualVMで見えるみたいなもの? 今回試していないので、後で試したら追記する。

アナライザの詳しい説明は以下のページにある。
HeapStats/Analyzer-version2 - IcedTea

使ってみての所感

インストールや設定は簡単にできて、取得できる情報量も多い。
(エージェントが一括でログを取得してくれてらくちん)
アナライザのGUIについて、Resource Dataなどメモリや凡例がなく、パッと見方がわからないところがあり、改善の余地があるように感じた。
カーソルを当てたら説明がでてくるような機能などあれば便利だと思った。
なぜだかReference Treeの内容が見えなかった。(前に使ったときは見えた。)なぜだろう。

参考にしたページ

JavaVM監視・解析ツール HeapStatsを使ってみた | キャスレーコンサルティング 技術ブログ HeapStats/jp - IcedTea https://github.com/HeapStats/heapstats

GitHub PagesとHUGOでブログサイトを構築する

はじめに

ブログサイト構築について、 WordpressGitHub Pages+HUGO→medium→はてな ということで、現在はてなに落ち着いている。 せっかく試したので、GitHub Pages+Hugoでのブログサイト構築についてもメモしておく。

HUGO環境構築

まずgoをインストールする。

wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz

※ バージョンやOSは環境にあった最新版のものを確認してインストールすること。 goのダウンロード資材のURLはこちら

~/.profileに追記

export PATH=$PYENV_ROOT/bin:$PATH:/usr/local/go/bin
export GOPATH=$HOME/go

追記したら環境変数の変更を現在のセッションに反映すること。

source ~/.profile

続いてHUGOのインストール

go get -v github.com/spf13/hugo
hugo version # インストールしたら、バージョンの確認を行う。
# Hugo Static Site Generator v0.2-DEV linux/amd64 BuildDate: 2017-02-27T23:55:32+09:00

HUGOで新しいサイトを構築する。

cd /pass/to/
hugo new site myblog  # myblogは新しく作成するサイトの名称

基本的な使い方をメモしておく。

  • テーマの利用 HUGOのテーマのページから、気に入ったテーマをクローンして利用する。 私はHugo-Octopressを選んだ。テーマは自分でカスタマイズすることも可能。
 cd /pass/to/myblog/
 git clone https://github.com/parsiya/Hugo-Octopress.git themes/Hugo-Octopress

このサイトのテーマとかかわいくてシンプルでいいなぁ、と思うので、参考にしてカスタマイズしてみたい。

  • 設定ファイル 基本的な設定ファイルは、config.tomlを利用する。Hugo-Octopressの中にsample-config.toml が含まれていたので、それをテンプレートとして利用した。
cp /pass/to/myblog/themes/Hugo-Octopress/sample-config.toml /pass/to/myblog/
  • 新しいコンテンツの投稿 新しいコンテンツを投稿するには、以下のコマンドを実行する。
hugo new post/test.md
# /pass/to/myblog/contents/post/test.mdが作成される。

/pass/to/myblog/contents/post/test.mdを開くと、以下のヘッダが記述されている。ページの内容はヘッダの下にマークダウン形式で記述する。

+++
title = "test"
type = "post"
date = "2017-03-23T16:01:06+09:00"
+++

ブログの要素として、categoriesやtags、authorなども記述しておきたい場合は、/pass/to/myblog/archetypes配下に、 default.md、もしくはpost.mdを配置しておくと、その要素も含めたヘッダを作成してくれる。

cat default.md
# +++
# categories = ["未分類"]
# tags = [""]
# description = ""
# draft = true
# author = "chie8842"
# type = "post"
# +++

default.mdに記述した場合はすべてのコンテンツ、post.mdに記述した場合はpost/*.mdに対してのみ反映される。 詳しくはArchetypesのページ参照。

$ ~/go/bin/

  • ローカルにWebサーバをたててサイトの内容を確認する

    hugo server --theme=Hugo-Octopress-Orange --buildDrafts --baseURL=WebサーバのIPアドレス --bind=0.0.0.0 --disableLiveReload=false --watch

    オプションについて一部説明する。

    • –bind 今回Ubuntuでたてた仮想サーバ上でHUGOを動かしており、ホストのWindows上で画面を確認をしたかったが、デフォルトだとローカルからしかHUGOでたてたWebサーバへのアクセスができないため、–bindオプションで全てのNICのアドレスをバインドして、ホスト側から閲覧可能なようにした。
    • –buildDrafts HUGOでは、下書きと公開用のコンテンツを、コンテンツのヘッダのdraft = true/falseで判別している。デフォルトでは、draft = falseのコンテンツのみ静的コンテンツのジェネレートを行うが、下書きの確認をしたい場合は、–buildDraftsオプションを利用する。
    • –disableLiveReload, –watch disableLiveReloadはHUGOでサイトをrebuildしたときにブラウザをリロードするかどうかの設定。watchはファイルシステムを監視して変更があった場合はリクリエイトする設定。サイトの内容をリアルタイムに確認しながら編集したい場合に使用するとよい。
  • アップロード用のページをジェネレートする

hugo

上記のコマンド一発で、config.tomlのpublishDirで指定したディレクトリ配下に、サイトのHTML/CSS/JSなどのファイルが作成・格納される。

Wordpressからの移行

Wordpressに投稿したブログの移行もやってみた。

ブログを Wordpress から Hugo に移行したを参考にした。

Wordpressには、wordpress-to-hugo-exporterというHUGOへの移行のためのプラグインがあるので、それを利用する。 ちなみに、他のブログサイトとの間の移行ツールもいろいろあり、以下にまとまっている。 https://gohugo.io/tools/

GitHubでの管理と、GitHubページの設定

以下のような構成で管理するようにした。

├── myblog --> masterブランチ
│   ├── archetypes
│   ├── config.toml
│   ├── content
│   ├── docs(HUGOでジェネレートされたファイルのディレクトリ) --> gh-pagesブランチ→GitHub Pagesで公開
│   ├── layouts
│   ├── static
│   └── themes ── mytheme --> themeブランチ

尚、GitHub PagesはデフォルトだとJekyllを使ってビルドしようとする。今回はJekyllは利用しないので、docsディレクトリ配下には、.nojekyllという名前のファイルを作成しておく。

touch /path/to/myblog/docs/.nojekyll

使ってみての所感

使ってみて、いいな、と思ったところは以下のとおり。 * マークダウンで記事がかける。 * githubで記事を管理できる。 * サイトの管理にお金がかからない。 * カスタマイズできる。アフィリエイトなども自由にできる。

一方で、以下の点で使い勝手が悪かった。 * HUGOをインストールしたPCからでないと、記事がアップできない。 * HUGO自体に不具合があったときに、GO言語に詳しくないので直せなくて困る。 * テーマがあまり豊富でない。かわいい系のテーマがない。  気に入ったものを自分で作る必要があるがそこに時間をかけたくない場合は面倒。 * SEO対策を自分でがんばらないと、最初は全然見てもらえない。 * 全てマークダウンで記事を書くので、表現に制約がある。 * 画像を載せるときとか、小さく表示しておいてクリックしたらポップアップしたい、とかそういうかゆいところは自分で頑張って実装する必要がある。

最終的に、サイトは見やすくしたいけど自分でメンテするのに労力をかけたくなかったので、一旦はてなに移った。 また時間ができたらいじってみようと思う。

最後に、一応HUGOで作ったサイトのURLを載せておく。 https://chie8842.github.io/blog/

参照

Go言語のページ: https://golang.org/
HUGOのドキュメント:https://gohugo.io/
HUGOのテーマのページ: http://themes.gohugo.io/
GithugPagesのページ:https://pages.github.com/