読者です 読者をやめる 読者になる 読者になる

std::stringでtolower/toupper

C++
#include <algorithm>
#include <string> 

std::string data = "Abc"; 
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Reference

MathJaxでQED記号をかく

数学 MathJax

MathJaxで証明終了の記号をかく。 記号自体は\Boxで与えられるが、右寄せにhtmlタグを使う必要がある。

<div class="QED" style="text-align: right">$\Box$</div>

class="QED"は特に意味がないので、消しても良い。

Travis CIでビルドの回数を抑える時

CI C++

C++の場合は、一回のビルド・テストに非常に時間がかかるので、ビルドを減らしたい場合がある。 Travis CIでは、設定で

  • Build pushs
    • push時にビルド
  • Build pull requests
    • pull request 時にビルド

がある。 両方ONにすると、PR時に2回ビルドが走ることになる。 Travis CIの場合この2回のビルドは同じビルドではないが、PRのビルドだけ通れば十分である場合が多い。 以下のような設定を実現する方法を記載する。

  • PRでのbranchは全てビルド
  • pushでのビルドはmaster branchのみ

単純にBuild pushsをoffにすると、merge後のmasterのビルドが行われずに、badgeが更新されない。

補足

PRのビルドはmaster branchへのmerge後のビルドをしているので、pushのビルドとは異なる。 Travis CIが裏でmergeのコミットを作成し、ビルドしている。

方法

Travis CIの設定から以下をONにする。

  • Build pushs
  • Build pull requests

.travis.ymlに以下を記載する。

branches:
  only:
    # branchs through PR are built
    - master

Travis CIのOSXのビルドの開始が遅い

Mac Linux CI

OSXのビルドは、物理マシンを利用しているので、利用者が多い場合は開始に時間がかかる。 下記にTravis CIのビルドステータスがある。

OSXでのjob数はずっと同じ値になっており、Jobがスタックしているのが分かる。

Reference

MathJaxで最適化問題を書く

TeX最適化問題を書く時と同じで良い。

\begin{align}
    \max_{\beta_{0} \in \mathbb{R}, \beta \in \mathbb{R}^{d}}
    & & &
    M
    \nonumber
    \\
    \mathrm{subject\ to}
    & & &
    y_{i} \frac{f(x_{i})}{\| \beta \|} \ge M,
    \quad
    \forall i = 1, \ldots, N
    \nonumber
\end{align}

maxとsubject toの間に&が3つくらい入っているが、alignでは右揃えと左揃えが&の偶数番目と奇数番目で自動で選択される為、見栄えの為に入れている。

vimscript中でコマンドを実行

vim

vimscriptの中で:vsplit variableのようなことをやりたい。

if cond
    execute "vsplit " . variable
endif

で良い。

if cond
     vsplit variable
endif

だとvariableは文字列として認識される。

jekyllのliquid templateで配列を扱う

Ruby jekyll

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 %}