本当は怖い情報科学

HPC屋の趣味&実益ブログ

C++ conceptsを試してみた (1)

C++20 から導入されるConceptsを試してみました。

cpp_akira さんがConceptの解説を書かれている[1]ので、自分なりに咀嚼して試してみます。

ビルド方法

現時点(2019年10月)で、Conceptを利用したプログラムをビルドするには、g++9以降が必要です。gccとclangのC++機能実装状況 (gcc[2], clang[3])によれば、

  • gccは実装済みPRが提案されている
  • clangは未対応

のようです。MacのHomebrewでインストールされたg++はパッチ適用済みのようですので、これを使います。

実際に、Mac上でConceptを使ったビルドをしてみます。 -std=c++2a および -fconcepts のフラグが必要です。

$ g++ -std=c++2a -fconcepts main.cpp

Conceptを使って型の制約を記述する

テンプレート引数の型がメンバ関数を持っている

// https://wandbox.org/permlink/njPaUxLdeDuXa81N
// コンセプト Drawable を定義
template <class T>
concept Drawable = requires(T& x) {
  x.draw();
};

// テンプレート引数のクラスが特定のメンバ関数を持っていることを規定する
template <Drawable T>
void f(T& x) {
  x.draw();
}

ただし、現時点では <concepts> ヘッダのincludeを含め、すべての機能が動くわけではないようです。

例:

// [1]より引用
// https://wandbox.org/permlink/G1SAoPNBVIwPYvVk


#include <concepts> 
template <class T, class U>
concept EqualityComparable = requires (T a, U b) {
  {a == b} -> std::convertible_to<bool>; // 式の戻り値型も制約できる (直接の戻り値型は指定できない)
};

引き続き、詳細な文法等の調査をしていこうと思います。

参考文献/リンク

変更履歴

  • 誤字修正 thanks to @takeda25 さん

目次のないPDFに目次を追加する

概要

目次の無いPDFに目次を追加する方法です。MacもしくはLinuxのコマンドラインツールgsを使い、そのツールへの入力をPythonで生成します。目次のデータ自体は、YAMLフォーマットで自分で用意します。

目的

例えば自炊したPDFには目次が含まれないため、読むときに不便です。この点、Kindleの書籍などとは雲泥の差があります。そこで、自分で目次を付与するスクリプトを作成しました。

実装

gs コマンドを使うと、PDFに目次を付与することができます。 具体的には、規定のフォーマット(慣習として pdfmarks と呼ばれる)を用意し、それを目的のPDFとともに gs コマンドに渡すことで実現できるようです。

入力する pdfmarks のフォーマットは、詳細は仕様書にありますが、概要としては以下のようにすれば良いようです。こちらのページから引用

[/Count 3 /Title (Chapter 1) /Page 1 /OUT pdfmark
[/Count -2 /Title (Section 1.1) /Page 2 /OUT pdfmark
[/Title (Section 1.1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark
[/Title (Section 1.3) /Page 7 /OUT pdfmark

これを手で書くのは骨が折れますので、現代的なフォーマットから生成できるように、スクリプトを作成します。ここではYAMLファイルを入力とします。具体的なデータ構造は適当に決めました。

コード

実際のスクリプトはここにあります。

Generate pdfmarks (TOC) file, to feed to gs command · GitHub

入力例

# Table of Contents from 「明解演習 数理統計 (明解演習シリーズ)」 by 小寺 平治
# https://www.kyoritsu-pub.co.jp/bookdetail/9784320013810

base_page: 9
toc: 
  - title: "第1章 確率"
    page: 1
    sub:
      - {"title": "順列 組み合わせ", "page": 1}
      - {"title": "確率とその声質", "page": 2}
      - {"title": "事象の独立性", "page": 5}
  - title: "第2章 確率変数"
    page: 26
    sub:
      - {"title": "2.1 確率変数 確率分布", "page": 26}
      - {"title": "2.2 多次元分布", "page": 27}
      - {"title": "2.3 確率変数の関数の分布", "page": 28}
      - {"title": "2.4 平均 分散", "page": 29}
      - {"title": "2.5 積率母関数", "page": 31}

このようなデータを用意し(手で作成)、スクリプトに食わせます。

$ python pdfmark.py --infile=pdfmarks.yaml --outfile=pdfmarks 
$ gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmarks

日本語への対応

日本語へ対応するには、一工夫必要でした。PDFにおいてはマルチバイト文字などの文字列は PDFEncoding と呼ばれる方法によってエンコードされているので、これに従って文字列をエンコードする必要があります。これは、 pdfrw というライブラリを用いることで簡単に実現できました。

今後

目次情報は手動で作成しなければいけないので、今後はこれを自動で取得できるようにしたいと思います。

参考文献

「朝型人間が成功する」のは本当なのか?

Disclaimer:この記事には、夜型人間による、朝型生活を善とする社会規範への反抗と怨嗟が多分に含まれています。

勤務先の社内では、読書会というイベントが行われています。ここで、「What the Most Successful People Do Before Breakfast: A Short Guide to Making Over Your Mornings」という書籍が紹介されていました。

基本的には、「成功者には朝型人間が多い、だからみんなも早く起きましょう」という本です。

さて、自分がいつも疑問に思うのが、「成功者には朝型人間が多い。だからあなたも朝型生活をしましょう」という論理展開についてです。

そもそも事実は?

「成功者には朝型が多い」というのは事実なのでしょうか?

もっといえば、人間には様々な個性や体質の人がいる中で、成功者には有意に朝型人間がおおいのでしょうか?

ほとんどの「朝活本」では、「誰々〜は何時に起きる、誰々〜は何時に起きる、〜」という具合で著名企業のCEOや政治家などの名前を列挙することによって「成功者には朝型人間が多い」ことを前提として印象付けようとしています。これは統計的事実なのでしょうか?

Quoraのこの質問 では、質問者がまさに同じ疑問を直球でぶつけています。それに対する答えは…「朝型だから成功するわけではないが、朝型の人の方がエネルギッシュで社会に貢献したいという意欲が強いからではないでしょうか?」というもの。うーん。

また、Quoraの質問からリンクされているこのページ には、朝型ではない成功者の例がありました。マーク・ザッカーバーグ、ウォーレン・バフェット、ウィンストン・チャーチル。しかし、これでも結局個別サンプルでしかありませんし、知りたいことは何もわからないままです。

次に見つけたのが 6 Facts About the Sleep of Famous People というページです。このページによれば、

Early Birds?

Yep! These successful people have that trait in common – they’re up early with 56% rising from 4 a.m. to 5:30 a.m. Out of those, 28% — the largest single percentage – are up at 5 a.m. Another 33% are out of bed by 7 a.m. – leaving only 11% who are in bed until 8 or 9 a.m.

成功者のうち、8時か9時までベッドで寝ているのは11%に過ぎない‥と。果たしてこれが(一般のビジネスパーソンと比較して)多いのか少ないのかよくわかりませんが、確かに絶対値としては成功者の56%が5時半までに起きているということのようです。(ただし、データの出処は不明)。

因果関係は?

さて、百歩譲りまして、「成功者には朝型が(有意に)多い」という相関関係があるとして、それはなぜなのでしょうか?いろいろ理由は考えられます。

仮説(1) 朝型であることが成功に有利(正の因果関係)

多くの「朝活本」の論旨であるところの、「朝型であることはあなたを成功に導く。だからあなたも朝型生活にしましょう」という論理がまさに正しいというケースです。

仮説(2) 成功した結果、朝型生活にせざるを得なくなった(逆の相関関係)

企業トップとして成功すると、多忙を極めます。また、決定を下すこと、そして自分の判断の遅れによって会社の動き、社員の働きを止めないことが重要になると考えられます。そのために、

  • 部下がスムーズに仕事を始められるように指示などを朝イチに出しておく必要がある
  • 運動などの個人の時間は朝しか取れない(夜は家族と過ごす)

などの理由によって、結果的に朝型にせざるを得ない、という可能性があります。「成功することによって、結果的に朝型になった」という逆の因果関係です。

仮説(3) 別の原因で朝型生活になった(第三の要因による疑似相関)

「成功者である」ことと、「朝型である」が共通の別の原因によって引き起こされている事も考えられます。

例えば、

  • 人間は、歳を重ねると朝型になる。また、成功者には中高年が多い
  • 育児をすることによって朝型生活にせざるを得ないので、結果的に朝型生活になった

など。

あるいは、朝型生活を長期間維持するためには忍耐と継続力が重要なので、そのような人は成功しやすいということなのかもしれません。つまり、「忍耐力・勤勉さ」という第三の要因による疑似相関ということになりますね。この場合、もともと夜型の人が朝型にしたからと言って成功する確率が高まるわけではないということになります。

仮説(4) 偶然

たまたま取ったデータがそうだったのかもしれませんし、「朝活本」ではそのようなデータをことさら強調しているだけかもしれません。

また、「朝型でも夜型でも、睡眠時間が取れてればどっちでもいいけど、朝型が良いという風潮があるので朝型にしてる」というケースもあるかもしれません。これもある意味で、第三の要因による擬似相関とも言えるかもしれません。

結論(は特にない)

特に結論はありませんが、データをよこせ!という感じですね。↑で紹介した本には書いてあるのかもしれません。

印象論ですが、これだけ有名な話で、古来からことわざなどでも広く言われ、しかも様々な国や文化で共通に言われているとなると、学術的に調べた結果が存在しても良さそうですが、探しても見当たらないということは…あっ(察し)(個人の印象です)

【広告】