jekyllのliquid templateで配列を扱う

GitHub Pagesは内部でjekyllを利用しmarkdownからhtmlファイルを生成している。 jekyllではrubyのliquid templateが利用できる。 liquid templateで配列を扱う方法がやや特殊なので、めも。

配列の代入

空の配列の代入は以下のように行う。

{% assign array1 = "" | split: "|" %}

array1 = []のように配列を直接代入する方法は今のところないらしい。 よって、空の文字列をsplit filterで分割し長さ0の配列を作っている。 "|"の部分はなんでも良い。

配列への挿入

{% assign array1 = "" | split: "|" %}
{% assign array1 = array1 | push: "Hoge" %}

文字列でなくobject(例えばpage)もPushできる。 同様にpopも使える。

データの篩い分け

空の配列が作れたら、各pageの情報を用いてpageの分類ができる。 各pageのYAML front matterが以下のようになっているとする。

---
title: title1
categories: [hoge]
---

categoriesにhogeを含むpageのみを抽出したい場合は、次のようにする。

<!-- 空の配列を作成 -->
{% assign hoge_pages = "" | split: "|" %}

<!-- categoriesにhogeを含むものを抽出 -->
{% for site_page in site.pages %}
  {% if site_page.categories contains "hoge" %}
    {% assign hoge_pages = hoge_pages | push: site_page %}
  {% endif %}
{% endfor %}

{% for hoge_page in hoge_pages %}
  <!-- 各hoge_pageに何かをする。 -->
{% endfor %}

reveal.jsで画像の中央揃えとサイズ変更をする

htmlで書くしかない。 外部markdownファイルを使っている場合も、htmlに直接書いている場合も以下のように書けば良い。

<div style="text-align:center;">
  <img src="path/to/img.png" style="width:40%;"/>
</div>
  • 外側のsytle="text-align:center;"が中央揃えの設定である。
    • 右揃えにしたければrightにすれば良い
  • imgタグに画像ファイルへのpathとサイズをwidth:40%として書いている

Github Pagesでbuild failureがでる

12/8にGithub Pagesのupdateがあり、今までと仕様がいくつか変わっている。

Publishing with GitHub Pages, now as easy as 1, 2, 3

大きな変更点は、repositoryのmarkdown fileが全てbuildの対象になったという点。 今までは、ヘッダーに---を記載したMdファイルだけがbuildの対象だったが、デフォルトで全てのmarkdownファイルがBuildの対象となったため、jekyllでbuildが通らないmdファイルなどをおいておくとエラーで落ちる。

今まで公開してなかったファイルを非公開にするには、_config.ymlファイルをrepositoryのトップにおき、以下を記載する。

exclude: [directory, file]
  • directoryはbuildに含めないディレクト
  • fileはbuildに含めないファイル
  • 複数指定可

hubでpull-request: Unprocessable Entity (HTTP 422) Invalid value for "head"とでる

ReferenceにあるようにError Messageが適切でない場合があるので、下記の方法で必ずしも解決するかは不明。 github上にbranchがないのにpull-requestを作っているのが問題 --pushで、今いるbranchをpushしてpull requestを作ってくれる。

hub pull-request --push

Reference

boost::numeric::ublas::matrixのiterator

boostのublas::matrixにはbegin1とbegin2のiteratorがある。 どういうものか記載がなかったのでメモ。

答えは、行列の1行目と1列目のitetator

    namespace ublas = boost::numeric::ublas;
    ublas::matrix<double> m(3, 3);
    m(0, 0) = 0.0; m(0, 1) = 1.0; m(0, 2) = 2.0;
    m(1, 0) = 3.0; m(1, 1) = 4.0; m(1, 2) = 5.0;
    m(2, 0) = 6.0; m(2, 1) = 7.0; m(2, 2) = 8.0;

    for (auto e = m.begin1(); e != m.end1(); ++e) {
        std::cout << *e << std::endl;
    }
    //0
    //3
    //6

    for (auto e = m.begin2(); e != m.end2(); ++e) {
        std::cout << *e << std::endl;
    }
    //0
    //1
    //2

    for (auto e = m.rbegin1(); e != m.rend1(); ++e) {
        std::cout << *e << std::endl;
    }
    //6
    //3
    //0

    for (auto e = m.rbegin2(); e != m.rend2(); ++e) {
        std::cout << *e << std::endl;
    }
    //2
    //1
    //0

boostでdemangleする

boost/coreにはいくつかのutility系の機能がある。 boost/core/demangle.hppはdemangleを提供する。

使い方

#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T> struct X
{
};

int main()
{
    char const * name = typeid( X<int> ).name();

    std::cout << name << std::endl; // 出力は処理系による
    std::cout << boost::core::demangle( name ) << std::endl; //出力はX<int>
}

参考

demangle - master