declval<T>() の返り値型が T&& である理由
メモ。
そもそも declval
とは?
型T1
, T2
があり、それらの値を乗算した結果の型を得たい場合、
素直に考えると
decltype( T1() * T2() )
で得られそうだが、これは T1, T2 共にデフォルトコンストラクタが無いと
T1()
,T2()
がコンパイルエラーになってしまう。
そこで std::declval
が使える。
decltype( std::declval<T1>() * std::declval<T2>() )
以下略
もし返り値型が T
だった場合
struct Widget;
template<class T>
T my_declval();
decltype( my_declval<Widget>() * my_declval<Widget>() ) val;
T
が不完全型の時にエラーになる。
もし返り値型が T&
だった場合
struct Widget {
Widget(Widget const&) = delete;
Widget(Widget&&);
};
template<class T>
T& my_declval();
int somefunc( Widget );
// エラー!
decltype( somefunc( my_declval<Widget>() ) ) val1;
// OK
decltype( somefunc( std::move(my_declval<Widget>()) ) ) val1;
ムーブ構築しか出来ない場合に面倒くさくなる。
補足
尚、 declval
は基本的に T&&
を返すので
int somefunc( int& );
decltype( somefunc( std::declval<int>() ) ) val;
このコードがエラーになる(msvcだと通っちゃうんだけど)。 こういう場合は、
int somefunc( int& );
decltype( somefunc( std::declval<int&>() ) ) val;
と、渡す型に & を付けてやれば良い。
これが何故通るかというと、実は declval
の返り値型は add_rvalue_reference<T>::type
だからである。
add_rvalue_reference
は T, T&&
を T&&
で返し、 T&
を T&
で返す。
では何故 add_rvalue_reference<T>::type
は T&
を T&
で返すかというと、
N3337 の 20.9.7.2 曰く
This rule reflects the semantics of reference collapsing (8.3.2).
とのことです(丸投げ)。
SDL2 の適当なサンプルコード
とりあえず動くコードをメモしとくと後で環境構築したときに本当に動くのかパパッと確認するときにたまに役に立つ
続きを読むRedmine Startpage plugin で任意のプロジェクトの「概要」ページを指定する方法
Controller: projects
Action : show
Id : プロジェクト名
特定の Wiki ページをトップに指定する方法しかWeb検索だと出てこない……
SDL2で出来る事メモごく一部
SDLのバージョン2が出ると同時になんかサイトもオシャレになってるので, チマチマWikiを眺めてて知ったことをメモ.
尚,この記事は http://wiki.libsdl.org/ に書いてあること以上の内容はありません.
続きを読むLaTeXでgraphvizのコードを直接埋め込み記述する
graphvizzz - A LaTeX package for inline graphviz code - Google Project Hosting
これを用いると良い.
自分の環境では指定されたスタイルファイルの関係上pdflatexは使えず,platexを用いてたので少し改造して使った.↓がdiff
27,30c27,30
< \immediate\write18{dot -Tpdf #2.dot > #2.pdf}
< \IfFileExists{#2.pdf}
< % the pdf exists: include it
< { \includegraphics[#1]{#2} }
---
> \immediate\write18{dot -Tps:cairo #2.dot > #2.eps}
> \IfFileExists{#2.eps}
> % the eps exists: include it
> { \includegraphics[#1]{#2.eps} }
C++11のささやかなネタコード
C++11 では initializer_list が実装されたのでこんなことができます
data.txt
{
{
{1, 3},
{5, 8}
},
{
{3, 8},
{1, 0},
{8, 8}
}
}
main.cpp
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
vector<vector<pair<int, int>>> dataset
#include "data.txt"
;
int main(){}
展開結果↓
http://melpon.org/wandbox/permlink/oh88hZW9pc6Rpe9z
int arr[] = {
#include "a.csv"
};
を思い出しますね
サーバに Alminium をインストールした
動機
- 色々がんばって構築したサーバを些細なミスから環境壊してしまった.
- もう一度設定するのめんどい
- Alminium(https://github.com/alminium/alminium)がその辺やってくれるらしい
- まっさら環境じゃないと入れにくいらしい
- ちょうどサーバまっさらにしたし入れてみよう
入れる
- さくらVPSでCentOSインストール直後の状態
- https://github.com/alminium/alminium に書いてる通りに入れた.Jenkinsも入れた.
- 30分くらいで入った
カスタマイズというか追加というか
- バックアップのために Mondo Rescue - GPL disaster recovery solution 入れた.
- 自動設定された iptables の設定を変えた
- SSL 証明書は StarSSL で持ってたので Apache の設定から証明書を変えた.
- Redmineに Overview - Extended Fields - Andriy Lesyuk site 入れた.
- Redmineに Redmine Plugin: add link to overall activities page 入れた.
- Redmineに martin-denizet/redmine_login_audit · GitHub 入れた.
- Jenkinsに Doxygen プラグイン入れた.
- サーバのホスト名変えた.
- サーバのsshの設定変えた.
- 色々Redmine内でログイン必須にしたり設定した
- 色々Jenkins内で権限とか設定した
- メールの設定はされてなかったので config.yml 作って設定した
- VSプロジェクトビルドのためにWindowsのスレーブをJenkinsに追加した
- 他にも何かしたかもしれない
すごいとおもったとこ
- JenkinsとかSVNのリポジトリへのアクセスがRedmineのアカウントと共有できてる,すごい!
- プラグインのおかげでRedmineからサーバ内にリポジトリ作成出来る,すごい!
- Github風テーマでオシャレっぽい!
- プラグインいくつか勝手に入れててくれて便利っぽい!バックログとかよくわからんけど
- まぁとにかく時間かければ自分でも出来るけどちゃんと色々自動化されててパッと構築できて楽に出来て良い!
ちょっと気になってるとこ
- Jenkinsでビルド中にRedmineからHudson画面に行く→活動→Hudsonとするとサーバエラーになる.
- アカウント認証の共有本気でやるなら LDAP 自分で設定した方が良さそう?
Redmine SCM プラグインのおかげでサーバ内にリポジトリ作れるのは良いんだけど,副作用なのかリモートのリポジトリをRedmineで設定出来ない……*1
つまり
すごいべんり