憂鬱な午後のひととき

3月16日_

reverse_iteratorでerase

同僚にC++/STLのeraseはreverse_iteratorをなぜ受け入れないのと聞かれた. 考えたことがないけどややこしいからだろうか.


  begin()        end()
   ↓     i        ↓
  +--+--+--+--+--+
  | 0| 1| 2| 3| 4|
  +--+--+--+--+--+
↑     ri       ↑
rend()        rbegin()

reverse_iteratorからbase()によって得られたiteratorはiterator方向に一つ進んだもの. つまり図でri.base() == i. だからrbegin()を指す要素を消したい場合は

v.erase(rbegin().base())

ではなく

v.erase((++rbegin()).base())

にしなければならない. 試すまで不安だったけどrend().base() == begin()は成り立つのね. 逆にiからmake_reverse_iteratorするとriに戻る.

make_reverse_iterator(i) == ri.

つまり

std::make_reverse_iterator(v.erase((++ri).base()))

でriの場所をeraseしてriの次のiteratorを返すことになる.

3月15日_

4時間

痛みが和らいでいる状態で横になって寝て痛みで目が覚めるまでどうも4時間が限界のようだ.

何が痛いのか気になったので『よくわかる首・肩関節動きとしくみ』(永木和載)を読んでみた. 専門用語が多すぎる(一つ一つ解説してくれてるのだが)のと, それをみっちり読む心の余裕が無い(とりあえず痛い)のであれだが, 肩は構造がめちゃくちゃ複雑で痛みやすいということがわかった.

夜間痛(私の症状はそういうようだ)を軽減する寝かたも載っていたので試してみたがあんまし効果がなかった.

3月14日_

over-aligned new

SIMD命令のために16byteや32byteアライメントが必要なデータはnewではなくaligned_mallocなどを使うかmallocして自分で調整しないといけなかった.

C++11でアライメントするための命令alignofが追加されたけどnewは変わらず. C++17でようやくnewを使ってアラインメントできるようになる.

gcc 7では-faligned-newをつけるか-std=c++1zで使えるようになる. Visual Studio 2017はまだのようだ.

#include <stdio.h>

struct A {
    alignas(32) int v[16];
};

int main()
{
    A *p = new A();
    printf("p=%p\n", (void*)p);
}
gcc t.cpp -std=c++11
p=0x12d5b90 // アライメントされていない

gcc t.cpp -std=c++1z
p=0xf471e0 // アライメントされている
3月13日_

レースコンディション

3年前に書いた状態遷移クラスの付近でバグが出るというので調べたらそのクラスのバグだった.

状態遷移と, commit, abortの部分はmutexで守られていたけど, commit完了からdstrで後処理する間に隙間があった. すいません.

3月11日_

BN曲線の384ビットペアリング

mclではできるだけ汎用的に作ろうとしていたけど本当に動くか心配だった. やってみたらあっさり動いて一安心. LLVMバンザイ. Skylake 3.4GHzで1.07msec. 基礎体のチューニングはこれからやってみる. 1msecは切りたいね.

3月10日_

Excelの奇妙なパスワードとマクロウイルス

7種類のアンチウイルスソフトをとっかえひっかえインストールするとマシンが不安定になるか心配だった. またあとでレジストリやファイルを走査して不要なものを削除しておこう.

3月9日_

第18回情報セキュリティ・シンポジウム参加

高機能暗号の一般的な話. 大手による実装者の本音(?)などが伺えてよかった. Microsoftが想像以上に頑張っていた. 私もできるところをふやしていこう.

3月8日_

travis-ci

mclで初めて使ってみた(.travis.yml). 何故かbin/bn256_test.exeの依存関係の解消に失敗するのでそれだけbuildしないようにした.

原因追求はまたの機会に.

3/10追記. bn256_test.cppをgit addしていなかったというしょうもない落ち. orz

3月6日_

Cインタフェース

C++のライブラリをCから呼べるようにする場合, 今までコンストラクタ, デストラクタに対応する関数としてT* createT(), void destroyT(T*)を作っていた. ただこの場合, デストラクタが無い言語でそれらを呼ぶのがいろいろ苦労する.

deferやfinalizerにたよってもそれが必ずしも発動するとは限らない.

Tの中身が固定長でsizeof(T)以外はメモリ確保を必要としない場合は, 呼び出し側の言語でメモリ確保した領域を渡す方が便利そうだ.

GoではそれがうまくいったのでJavaやC#でも試してみる.

3月5日_

法事

昨日怪我依頼, 2カ月振りに多めにあるいたのと寒い中の法事でくたくたになった. 相当体力が落ちてる. 風邪を引かないように気を付けないと.

3月4日_

散歩

法事で実家に戻る. 久り振りに友達に会っていろいろ面白いはなしを聞いた. 日々, 攻撃者とのバトルらしい. 大変だ.

天気がよかったのでこれまた久しぶりに京都駅や四条付近を散歩. 足が痛いのでそれほど歩けないけど気持ちよい.

3月1日_

『BSDを256倍使うための本』

私が担当しているサイボウズ・ラボユースの学生が読んでみたらしい. 懐かしいなと調べてみたら出版されたとき, 彼はまだ産まれていない. というか今来てる人ほとんどだれも産まれていない.

22年前だから当然なのだけど, 自分は何してたっけといろいろ思い出してしまう.


御意見は光成滋生<herumi@nifty.com>までお願いします