feed
2013年11月17日, 編集履歴
JekyllのPaginationとは、一ページ中にブログ記事がいくつか羅列してあり、一番下まで行くと「前の記事へ」「次の記事へ」などと前後の記事羅列ページへのリンクが貼ってあり、当該前後ページでまた記事が羅列されているという、よくあるアレである。
_config.yml
の設定
Paginationを設定するにはまず_config.yml
に、
paginate: 5
paginate_path: "blog/page:num"
のように記述する。上記の場合、一ページ中に羅列される記事数は5件。paginate_path: "blog/page:num"
で指定したblog
ディレクトリィの中にあるindex.html
ファイルが最初のページとなる。blog/index.html
内では変数paginator
を使い、記事羅列ページを作成する(したがって、blog/index.html
はJekyll(Liquid)の変換対象ファイルでなければならないので、YAML Front-matterが必要となる)。
以降のページは、そのblog/index.html
がテンプレート的な扱いとなり、blog/page2/index.html
、blog/page3/index.html
、…と作られる(page1
は作られないことに注意)。
記事の出力
paginator
はposts
変数を持っており、そのページ内で羅列される件数分(この場合は5件)の記事情報が保持されている。blog/index.html
内で以下のように記述すれば、5件分の記事が出力される。
{% for post in paginator.posts %}
<article>
<p class="date">{{ post.date | date: "%Y年%m月%d日" }}</p>
<h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
{{ post.content }}
</article>
{% endfor %}
上記は各記事の全文を出力している。全文が必要ない場合はpost.content
の代わりにpost.excerpt
を使う。
blog/page2/index.html
以降ではblog/index.html
がテンプレート的に使われて同じ形態のファイルが出力される。paginator.posts
には、そのページが出力するべき記事情報が入っている。全記事数が12件でpaginate: 5
指定の場合、最初のページ(blog/index.html
)では最新5件分、2ページ目(blog/page2/index.html
)で次の5件分、3ページ目(blog/page3/index.html
)で最後の2件分がpaginator.posts
に入っている。paginator
が持つその他の変数も出力するページにあわせて変化する。
前後ページへのリンク出力
前後ページへのリンクにはpaginator.previous_page
、paginator.next_page
を使う。これらには前後のページ番号(なければnil
)が入っている。以下のようにblog/index.html
に書いた場合、前後ページへのリンクのリストが出力される。
<ul>
{% if paginator.previous_page %}<li><a href="/blog/{% if paginator.previous_page != 1 %}page{{ paginator.previous_page }}/{% endif %}">前の記事</a></li>{% endif %}
{% if paginator.next_page %}<li><a href="/blog/page{{ paginator.next_page }}/">次の記事</a></li>{% endif %}
</ul>
ひとつ注意が必要なのは、2ページ目以降のパスはblog/page2/index.html
、…であるが、最初のページのパスはblog/index.html
であって、blog/page1/index.html
ではないということである。したがって、paginator.previous_page
が1
のときとそれ以外で処理を分ける必要がある。
追記(2013年11月30日)
前節「前後ページへのリンク出力」について、previous_page
は日付上では新しい方向のページ番号を、next_page
は古い方向のページ番号を意味する。前節のように、変数名に合わせてそれぞれのリンク文字列を「前の〜」「次の〜」とすると、(考え方にもよるが、私は)気持ち悪い。
なので、リンク文字列をそれぞれ「新しい〜」「古い〜」と改めた。
<ul>
{% if paginator.previous_page %}<li><a href="/blog/{% if paginator.previous_page != 1 %}page{{ paginator.previous_page }}/{% endif %}">新しい記事</a></li>{% endif %}
{% if paginator.next_page %}<li><a href="/blog/page{{ paginator.next_page }}/">古い記事</a></li>{% endif %}
</ul>
2013年11月13日, 編集履歴
Jekyllを使ってウェブサイトとブログの再構築をした。その際に用いたMarkdown用の設定メモ。
現時点での_config.yml
ファイルのMarkdown関係の設定は以下。
markdown: redcarpet
redcarpet:
extensions: ["autolink", "hard_wrap"]
生の設定ファイルはgenjiapp.github.io/_config.yml at master。
Markdownレンダラの変更
JekyllのディフォルトのMarkdownレンダラはMaruku。これをRedcarpetに変更した。なぜ変更したか。きっかけは、MarukuではTwitterの埋め込みコード(以下のようなもの)
<blockquote class="twitter-tweet"><p>ヘウレーカ! JekyllでコンテンツをHTMLで書いて良いことと、レイアウト側だけではなくコンテンツ側でも include が使えることに気がついて、蒙が啓けた気がする</p>— Genji (@genji_tw) <a href="https://twitter.com/genji_tw/statuses/398471861828206592">November 7, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
がうまく変換できずエラーを吐くことに気がついたから。_config.yml
でmarkdown: redcarpet
と指定することで、MarkdownレンダラをMarukuからRedcarpetに変更できる。Redcarpetなら上記の埋め込みコードを正常に処理できる。
Redcarpetの拡張設定
指定した拡張はautolink
、hard_wrap
の2つ。
autolink
は http://genjiapp.com/ のような文字列を自動でリンクに変換してくれる。
次にhard_wrap
。Markdownは標準では空行を挿入しないと改段落にならない(ブラウザでの表示で行分けされない)。つまり、
とMarkdownを書くと、変換後のHTMLは
<p>あめんぼあかいなあいうえお</p>
<p>ほげほげ</p>
のようになる。Markdown上での単なる改行は改段落とはならずひとつの<p>
タグに纏められ(「あめんぼあかいなあいうえお」が一行で表示される)、空行を挟んで新しい<p>
タグが始まる。これは他の軽量マークアップ言語でもよくある仕様である。個人的な趣味でこの仕様があまり好きではない。
hard_wrap
を有効にすると上記のMarkdownは
<p>あめんぼあかいな<br/>あいうえお</p>
<p>ほげほげ</p>
のように変換される。Markdown上での改行が変換後に改段落されないのは同様であるが、改行部分に<br/>
タグが挿入されるようになる(ブラウザでの表示において行分けされる)。
HTMLの<p>
タグひとつが日本語の意味段落に相当し、形式段落を<br/>
で作るというイメージである。
追記(2013年11月18日)
当初、Redcarpetの拡張設定はもうひとつ、no_intra_emphasis
を指定していた。そして記事中では以下のようなことを書いた。
Markdownは標準では複数のアンダーバー_
間の文字列をHTML変換時に強調タグ<em>
でくくる。これの何が問題かというと、プログラムの変数名等でありがちなhoge_foo_bar
のような文字列が意図せず強調されてしまう。no_intra_emphasis
はその動作を抑制する。
Markdownの強調構文にはアンダーバーを使う方法ともうひとつ、アスタリスク*
を使う方法がある。ここで私が誤解していたのが、no_intra_emphasis
はアンダーバーを使う強調構文のみが対象であると思い込んでいたことである。しかしno_intra_emphasis
はアスタリスクを使う構文でも同様に作用する。
これの何が問題かというと、分かち書きをしない日本語文中では、余分な空白を入れないと強調構文が使えなくなるということである。つまり、
と書いても、
と出力される。強調構文にするには、余分な空白を挿入して
としなければならなくなる。そうすると出力にも当然余分な空白が入り込む。それはイヤなのでno_intra_emphasis
は外すことにした。
プログラムの変数名等でアンダーバーが意図しない強調になってしまうという問題は、インラインコード/コードブロック構文中なら関係ないと気づいた。コード片を書くときは元々インラインコード/コードブロック構文を使っていたので、そもそもno_intra_emphasis
は必要ないという結論に至った。
2013年11月13日, 編集履歴
Jekyllという静的ウェブサイト&ブログ生成システムとGitHub Pagesを用いて、ウェブサイトを再構築しました。
以前からウェブページのホスティングにはGitHubが提供するGitHub Pagesというホスティングサーヴィスを利用してローカルで作成したHTML等をアップロードしていましたが、今回はそれに加えてJekyllという静的ウェブサイト&ブログ生成システムを用いました。
GitHub Pagesでは、完全なウェブページをそのままアップロードする他にも、Jekyllというシステムを用いる方法が提供されています。
JekyllはテンプレートとなるHTMLのガワを用意しておき、Markdown等を用いたコンテンツ文書を(HTML断片に変換して)流し込むことで静的なウェブページを生成します。ブログ等のように同じデザインのページを多く生成する必要がある場合に役立ちます。
GitHub PagesのホスティングサーヴィスはJekyllを内蔵しており、構成ファイルをリポジトリィにプッシュすることで、自動的に静的なウェブサイトを生成してくれます。
Jekyllを使ってウェブサイトの再構築をしようと思ったきっかけは、ブログを以前から使用していたGoogleのBloggerから移行し、新しく別のブログを始めたかったからです。Bloggerから離れたい理由はGoogleへの不信感ですが、それ以外にもブラウザ上のウェブインターフェイスで文章を書くのがやりづらいという理由もあります。しょーもないことをたくさん書いてある過去のブログ記事を抹消したいという思いもあります(なので旧ブログはそのうち閉鎖します)。
他のよくあるブログサーヴィスに移行したところで、ウェブインターフェイスからは離れられません。であれば、元々利用していたGitHub Pagesが内蔵するJekyllを用いてブログを書こう、ブログをJekyllで書くならばウェブサイトの方もJekyllで管理しよう、というのが今回の再構築の理由です。
余談
Jekyllの使い方を紹介しているページ等では、コンテンツ文書をMarkdown等の軽量マークアップ言語で書き、それをテンプレートに流し込んでいます。テンプレートではHTMLのガワを記述し、複数のテンプレート間で共通する構成要素があればそれを部品化してinclude
しています。それがJekyllの基本的な使い方なので、当然そのように書きます。
ブログ記事以外のページを書くときに、そこではたと困りました。テンプレートに流し込むシンプルな構成のブログ記事であればMarkdownで書けますが、ペラいちのページを単純なMarkdownの流し込みで表現するのは難しいです。Markdownはシンプルな構成の文書を書く際には有用ですが、HTMLの表現力を100%使うことはできません。
異なるデザインの複数ページを作る場合(このウェブサイトの場合は各アプリケーションの紹介ページのような)はテンプレートを使い回しにくいので、各ページごとに専用のテンプレートを作成しなければならないのだろうか? それとも完全にふつうのHTMLを書くしかないのだろうか?
悩むことしばし。
コンテンツ文書を書くのにMarkdownではなく、HTMLが使えることに気づきました。さらに、include
コマンドをテンプレート文書だけではなく、コンテンツ文書にも書くことができることに気付き、問題は解決しました。
通常はテンプレート内で使うことが多いであろうinclude
コマンドをHTMLで書くコンテンツ文書内でも多用して、アプリケーション紹介ページ等を作成しました。このウェブサイトはGitHub Pagesでホスティングしているので、リポジトリィを見れば、どういう設定でどういう構成になっているのかが解ります。
2013年10月02日, 編集履歴
「Google Adwordsが一ヶ月分無料」というようなプロモーションコードがGoogleから郵送されてくることがある。無視しても忘れた頃にまた何度も郵送してきたりする。同じようなダイレクトメールを受け取ったことがあるひともいるだろう。
AdwordsはGoogleの検索結果等に広告を掲載してくれるサーヴィスである。広告を出稿するには当然料金が掛かるわけだが、それを「一ヶ月分無料でお試しください」と謳っているのが前述のプロモーションコードである。
無料なら、ということでプロモーションコードを入力し、一ヶ月間広告の出稿を行なっていた。
ところが、ふとクレジットカードの明細を見るとGoogle Adwordsの料金の請求が掛かっている。プロモーションコードの入力は正常に行えており、期間も料金も上限を超えていない。どういうことかとサポートに連絡したところ、以下のような返答をもらった。
- プロモーションコードの入力によって、一ヶ月間の利用金額と同額(最大15000円分)が登録から40日以内にアカウントに付与される。
- その一ヶ月分の利用金額の支払いには、付与された分は使えず、クレジットカード等で通常の支払いをしなければならない。
- 次からその付与分が使える。
プロモーションコードで「利用金額」分が付与されるので、当然Adwordsを「利用」しなければならない。ところが付与された金額分で「利用」した分を相殺できないというのである。
ダイレクトメールの文言には「一ヶ月分無料でお試しください」などとあるが、料金は必ず掛かり、その後も利用を継続しなければプロモーションコードの恩恵を受けられないのであれば、それは「無料でお試し」とは言えないのではないか?
サポートでは請求の取り消しは難しいということである。サポート曰く、同様の連絡がこれまでにもあったということで、過去に比べればダイレクトメールの文面も改善されているということであるが、私はこのように実際に請求されて困っているわけである。
諦めるしかないのだろうか。
追記(2013年10月21日)
その後、Google Adwordsの「料金」ページを見ていると「処理中の払い戻し」なる項目があり、払わされた金額分と同額が表示されているのに気がついた。
これは何だろう、結局返金してくれるのかだろうか。サポートに問い合わせをしたところ、この表示は間違いである、不具合である、払い戻しはない、という返答。
なるほどなるほど。仮に今回のトラブルの原因がこちらの勝手な誤解、間違いにあったとして、こちらの間違いには容赦なく料金請求をする。しかしGoogleが「払い戻し」の表示をしておいて、払い戻しはない、不具合であるとして自分の間違いからは逃げるわけか。
ご立派。
2013年08月20日, 編集履歴
佐野昌一(海野十三)の「虫喰い算大会」を横組みにし、問題部分をSVG画像化した電子書籍をGitHubで公開しました。
「虫喰い算大会」は、探偵小説家の海野十三が本名の佐野昌一名義で出版した虫喰い算が多数掲載された本で、青空文庫で公開されています。
AmazonのKindleストア等、青空文庫の作品をラインナップしている電子書籍プラットフォームからでもこの本を入手することは可能ですが、ひとつ問題があります。
たとえばKindleストアの「虫喰い算大会」は、他の一般的な小説等と同じように縦組みで組版されています。これの何が問題かというと、青空文庫の「虫喰い算大会」の問題部分はプレインテキストでベタ組みされており、そのまま縦組みにすると問題の筆算が90度回転したかたちになってしまいます。さらに筆算の途中でページを跨いでしまうという問題もあり、読みにくいものになっています。
Kindleストアに並んでいる青空文庫の本は自動変換されたものでしょうし、虫喰い算を扱った本書が一般の小説とは異なる特殊なものであるということで、これは仕方のない事です。
そこで、「虫喰い算大会」を横組みにし、問題部分をSVG画像化して読みやすくした電子書籍を作成しました。
問題部分を画像化することで美しく、かつページ跨ぎをさせないように読みやすくしました。底本である元々の「虫喰い算大会」は縦組みっぽいのですが、序文の解き方解説等で数字を多く扱うので、横組みの方が読みやすいだろうということで、横組みにしました。
Mac用EPUBリーダMurasakiでEPUB版を表示
Kindle PreviewerでMOBI版を表示
iPhoneのKindleでAZK版を表示
iPhoneのiBooksでEPUB版を表示