RPubsイケてないなー。ログイン画面暗号化されてないのやだなー。
と思ったときに、yihuiさんのこんな記事を見つけてしまいました。
Github Pagesとは
参考:GitHub Pages
Github Pagesとは、ウェブページを公開できるGithubの機能です。
このウェブページの作り方には2種類あります。表示するHTMLファイルをローカルでつくってGithubにアップするか、Markdownとかで書いてJekyllでHTMLを自動生成するか、です。
Jekyllとは
Jekyllは、Markdownとかプレーンテキストをウェブサイトやブログに変換するためのソフトです。
Wordpressは動的にページを生成しますが、Jekyllは静的なページ生成です。サーバーとのやりとりが必要な処理はできません。たとえばコメント欄はDisqusを埋め込んだりしないとつけられません。
静的ページ生成は似たようなのが色々できています。HTMLファイルを直接pushするつもりならこの辺のを使ってもいいかも。
- http://octopress.org/:title
- Hugo :: A fast and modern static website engine(Go製)
- Hakyll - Home(Haskell製)
Github PagesでJekyllを使うには
参考: GitHub Pagesについて(Jekyll側のドキュメント)、Using Jekyll with Pages - User Documentation(Github側のドキュメント)
やってることはこうです。
0) レポジトリの設定で「Automatic Page Generator」を有効にする
1) レポジトリにjekyll newでJekyllに必要なファイルを配置する
2) ローカルでjekyll buildして生成されるページを確かめる
3) 問題なければpushする
4) 新しいファイルがGithub側でjekyll buildされ、新しいページが生成される
で、yihuiさんの記事は、2)でjekyll buildの代わりにservr::jekyll()というコマンドを使えば、markdownファイルからじゃなくてR Markdownファイルからサイトが生成できますよ、という感じのことが書いてます。
ちょっとやってみます。
Jekyllのインストール
Ruby使ったことなくてどのバージョンがいいの分かりませんが、2.2を入れてみます。
Ubuntu用にはbrightboxというところがPPAを用意しているようなので、それを使ってみます。
https://www.brightbox.com/docs/ruby/ubuntu/
sudo apt-get install software-properties-common sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update sudo apt-get install ruby2.2-dev
Jekyllをインストールします。手順は、Githubがgemを用意してくれてるのでそれを使います。:Using Jekyll with Pages - User Documentation
あと、よく分かりませんがNode.jsかtherubyracerというのもインストールしておかないとエラーが出るらしいです。(色々やっているうちに動いてしまったのでよく分からない...)
参考:Rails - Could not find a JavaScript runtime? - Stack Overflow
sudo apt-get install nodejs sudo gem install bundler dd of=./Gemfile <<EOF source 'https://rubygems.org' gem 'github-pages' EOF # ここはsudoをつけない bundle install
これでたぶんインストールできたはずです。
レポジトリをつくる
参考:Creating Pages with the automatic generator - User Documentation
ここめんどくさいので省略。↑のドキュメントを読んでください。
私の場合は yutannihilation.github.io というレポジトリをつくりました。
Jekyllの設定
とりあえずgit cloneしてきて、.gitignoreだけ残して他のファイルを全部消します。そのうえで、jekyll newでJekyllのひな形をつくります。
cd /path/to/repo/ rm -r * jekyll new
たぶん以下のファイルができているはずです。
about.md _config.yml feed.xml index.html css/ _includes/ _layouts/ _posts/ _sass/
ブログ記事用のMarkdownファイルを置くのは_posts/下です。about.mdはAboutページ用のMarkdownファイル、_config.ymlはJekyllの設定ファイルです。
これに加えて、R Markdownファイルを置くディレクトリをつくります。_sourceがjekyll()のデフォルトなのでそれにしておきます。
mkdir _source
設定ファイル_config.ymlを少し変更します。
ブログのタイトルとか説明とかは適当にうめましょう。
markdownのエンジンがkramdownになってますが、Github Flavored Markdown記法で書きたいのでredcarpetにします。(後述するbuild.Rでの設定はたぶんここと合わせる必要があります。)
markdown: redcarpet
servr::jekyll()の準備
servr::jekyll()は、R Markdownファイルから(いったんMarkdownファイルを生成してから)HTMLファイルを生成するコマンドです。
ただし、servr::jekyll()だけでは動きません。R Markdownをビルドするためのスクリプトが必要です。build.Rという名前のRスクリプトかMakefileか、いずれかをつくる必要があります。私は、yuhuiさんのを参考にしてこんなのを書きました。
※knitr::render_markdown()を決め打ちで使ってますが、_config.ymlでkramdownを選んでいる場合は、knitr::render_jekyll()にする必要があります。
knitr::render_markdown() local({ # input/output filenames are passed as two additional arguments to Rscript a = commandArgs(TRUE) knitr::opts_chunk$set( fig.path = sprintf('figure/%d/', digest::digest(a[1])) ) knitr::opts_knit$set( base.url = '/', width = 70 ) knitr::knit(a[1], a[2], quiet = TRUE, encoding = 'UTF-8', envir = .GlobalEnv) })
(yutannihilation.github.io/build.R at master · yutannihilation/yutannihilation.github.io · GitHub)
これで準備完了です(たぶん)。いよいよページを生成してみます。
R Markdownファイル
JekyllではMarkdown ファイルの名前に決まりがあります。YYYY-MM-DD-foobar.mdという名前にしないといけません。R MarkdownファイルもYYYY-MM-DD-foobar.Rmdという名前にします。これで、たとえば_source/2015-04-01-you-fool.Rmdというファイルを置くと、_posts/2015-04-01-you-fool.mdと_site/XXX/2015/04/01/you-fool.html(XXXは.Rmdの中で指定したカテゴリ)が生成されます。
あと、Front Matterにlayout: postという指定がないと記事用のスタイルが当たりません。RStudioのテンプレにはこの指定は入ってないので忘れず書いてください。
--- title: "You Are Fool" author: "Hiroaki Yutani" date: "2015/4/1" output: html_document layout: post ---
で、いよいよページを生成します。
servr::jekyll(serve = FALSE, input = "_source", output = "_posts")
次のファイルができているはずです。
figure/unnamed-chunk-X-X.png(画像があれば)_posts/2015-04-01-you-fool.md_site/XXX/2015/04/01/you-fool.html
これを、レポジトリにpushします。
git push origin
これでGithub Pagesにページが生成されているはずです。
もうちょっといろいろ手をいれないと使えなそうですけど、とりあえずメモ。