微妙に便利なgccのオプション

C++

普段アセンブリコードを眺めるときは、最初に覚えた方法であることと、たいてい同時に実行して確認しているのもあって、objdumpを使っている。 が、コンパイル結果のアセンブリコードを見たいだけなら-Sで十分である。 $ cat "double add(double x, double y…

reluを分岐無しで実装する

ReLUとは、ご存知の通り、xが正の値ならxを返し、そうでなければ0になるという非常に単純な関数である。だがこれが深層学習において重要な役割を演じたのだから面白い。バックプロパゲーションをする時に微分係数が1より小さいよくある活性化関数だと指数的…

tr1とboost/tr1でis_permutationがつらい話

C++

なんとも重箱の隅をつつくような話だ。 私が開発に参加しているプロジェクトがあり、そこでは(古くから開発されているので)C++98が使われている。だが先進的なものも積極的に使おうとするプロジェクトでもあるので、Boostやtr1を使ってもいた。CMakeでtr1…

一番簡単な画像フォーマット

世の中には画像フォーマットが沢山ある。データを圧縮してサイズが小さくなるフォーマットや、様々なメタデータを持てるフォーマットなど色々だが、自分で作るとなると何が一番楽だろうか。 ある意味ではsvgだろうが、今回はビットマップということにする。s…

shellのfor文について

最近技術系のことをしっかりまとめる時間が減ってきた。とりあえず小粒なものを書いておこうと思う。 2ヶ月前くらいに、AからJまで10個のアルファベットを順に取り出したいことがあった。つまりこういうことがしたい。 grep 'A' something.dat | some_comman…

自作プロダクトにIssueが立ったのでManjaroを触った話

背景 私が作った個人プロダクトの中で、特に宣伝していない割にはそれなりに(見ず知らずの人に)スターを貰って使ってもらえているものがあるのだが、そこにIssueが立った。 internal compiler error with gcc-7.3.1 · Issue #9 · ToruNiina/toml11 · GitHu…

プログラミングパラダイムとは制約をかけることだという見方

ふと感じたのだが、プログラミングパラダイムというのは、プログラムに制約をかけることなのではないか。 基本的に、現代で書かれるプログラムはどれも非常に長く複雑で、人間の脳みそに収まりきらない。実行パスをトレースできない規模のものはザラにあるし…

古い標準ライブラリ実装を新しいコンパイラで使って困った話

C++

背景 C++11ではconstexprメンバ関数は暗黙にconst指定される。 template<typename T> class X { public: constexpr T get_member() /* const */ {return member_;} private: T member_; }; この仕様はある程度面倒を引き起こしていた(参考:http://boleros.hateblo.jp/e</typename>…

プログラミングに挫折していた頃のこと

読者諸兄は、雪が降り積もって行くその過程を眺めていたことがあるだろうか。 雪が降り積もる時、雪は初めから着実に蓄積してゆくのではなく、初めは地面に触れては融け、触れては融けを繰り返す。そうして無為に見える時を過ごした後、地面が十分に冷えた時…

バイナリアンに出会った話

飲み会の席で隣に座っていた人が、聞いてみるとゲームのデバッガーをやっているらしい。でも開発プロジェクトの一員という訳ではなくて、コードそのものは見られない立場にいるらしい。なんだそりゃ、と思ったが、そういえばテストプレイヤーの募集を見たこ…

C++17: 動的メモリ確保とアライメント

C++

背景 アライメントまわりのことを調べていたらC++17でaligned_allocとnewの新しいオーバーロードが入っていたようで、少し規格書(N4659)と元になったP0035R4にあたってみることにした。 (最初C++2aのN4727を見て書いていたのでN4659を確認したが、内容に…

記憶と夢とストリートビュー

技術記事ではない。 知人と、互いが昔住んでいた町をグーグルストリートビューで見ながら紹介するという遊びをした。ここを曲がると昔よく遊んだ公園があって、ここを曲がると帰り道で寄っていたお店が……。なくなっていた店もあったし、改装で様変わりした建…

メモリ上での配置に関して、多次元配列と構造体の配列の比較

最近少しアライメントのことを考えているが、古めの書籍だと多次元配列のメモリ配置の説明が必ずと言っていいほどされていて、メモリアクセスが律速になる場合(殆どのケースだ)には次元の順序に十分注意せよと書かれている。 キャッシュ効率のことなどを考…

zip_iteratorとstd::iter_swap

C++

少し頑張って解決しようとした問題が実は解決できないことに気づいてしまったお話 TL;DR: std::iter_swapをフック可能にしてほしい。 背景 配列が二つあったとして、その片方をキーとして使って、両方の配列を同時にsortしたいと言う気持ちがある。 v1 = {4,…

satysfi.vimを作った

というわけで中身を読もうとやっていっていたわけだが、SATySFiにはVim向けのシンタックスハイライターがない。当たり前だ。新興の言語なのだから。だが読むに当たってシンタックスハイライトがされないというのは非常にしんどい。なので最低限のハイライト…

SATySFiのインストール

SATySFiは静的型検査の恩恵を受けられる組版処理システムである。 github.com Ubuntu16.04を使っているのだが、SATySFiを使ってみようとして少し困ったので。ちなみにそれまでのOCaml経験はHello, Worldのみ、つまりコンパイラを入れたことがある以外はゼロ…

基本ベクトルの場合の最適化(3次元幾何)

C++

数カ月触れていなかった自分が書いたコードを見た所、驚くべきものを発見した。 3次元空間内をある方向に向けてある距離だけ動いたオブジェクトが衝突するかどうかを判定し、また衝突するときはどれだけ動いたら衝突するか計算するコードがあった。 このよう…

コンパイル時ルックアップテーブル生成について

C++

(今更感) 目的 非負整数値を取る関数があるとする。そしてそれを実行中に非常に多くの回数呼ぶ(数百兆回とか)、ということは、科学技術計算ではよく見られる光景である。 整数値を取るので、恐らく何度もピッタリ同じ値を計算することになるだろう。 す…

記事のライセンスについて

ローカルに翻訳記事が溜まってきている。ブログやチュートリアルの翻訳が多いが、専門書の要約や一章まるまるの翻訳などもある。英語のまま読む方が一読する場合の効率はよいが、読んでいる途中でこんがらがる可能性があるときや見返す可能性が高い場合に翻…

エラー時はメッセージを返すが、成功しても返すものがない関数

C++

今、Cライブラリをラップしているのだが、副作用を起こす関数の戻り値をどうするか考えている。 前提:全体のエラーハンドリング 前提として、エラーハンドリングにはここまで例外送出でなくboost::optionalとexpectedを用いている。 基本的に、value_or()で…

コンパイラの最適化と専用命令について

asm

Fast inverse square rootなるものをご存知だろうか。これは、1.0 / sqrt(x)を高速に近似計算する命令である。 Fast inverse square root - Wikipedia この計算は非常によく使う。例えばベクトルがあるとする。このベクトルを規格化したい。つまり長さを1に…

コードの美しさについて

コードが綺麗とはどういうことか、の基準は人によって異なると思う。しかし例えば以下のような関数があまり綺麗ではないという気持ちは、共有できるのではないだろうか。 void func(int N, double*** v1, double*** v2, double** a, double** b, int* c, int…

数値積分のインターフェース

C++

子細合ってヤバい形の積分を解く羽目になったので数値積分をすることにした。 別に数値積分の複雑なアルゴリズムの解説や異常なまでの最適化などを紹介するわけではなく、非常に基本的な台形積分を使い、そこまで最適化も考えずにやる。 だがそれだけだと何…

apt-get upgradeでfishが大量のエラーを吐くようになった

ま た か (bobthefishでstring関係のエラーが出た - in neuro) 軽い気持ちでapt-get update && apt-get upgradeしたところ、fishが2.7.0になった。その後、argparseがないとかなんとかのエラーが出る。 bobthefishが内部で使っているコマンドなのでテーマ…

std::hash<integral_type>

C++

ふと、std::hash<std::size_t>の実装がどうなっているか気になった。 ハッシュ関数は、何かの型の値を整数型に変換する。特にstd::hashはsize_tに変換する関数である。同じ値に対しては同じハッシュ値を返し、別の値同士が同じハッシュ値を取らないようにする。一般にはハ</std::size_t>…

boost::enable_ifの居所について

C++

C++11のstd::enable_ifが使えない環境だと、boost::enable_ifなしにはテンプレート関数をガンガン使っていくのは厳しい。しかし、boost::enable_ifは途中で定義されている場所が変わっている。 boost 1.65.1のドキュメントを見てみよう。 Boost Utility Libr…

謎の演算子

C++

よく知られたネタだと思うが、while文中でカウントダウンするための演算子がある。 int N = 10; while(N --> 0) { std::cout << N << ' '; } 9 8 7 6 5 4 3 2 1 0 逆方向もあるが、カウントダウン演算子にもインクリメント・デクリメントの前置・後置と同様…

動的メモリ確保なしで派生クラスを格納できるクラスを作った

久方ぶりにdomain-specificでないコードを書いた気がする。 Qiitaに基本的なアイデアだけ書いたので、こちらでは少し立ち入った話をする。 tl;dr 先に最大サイズを決めておくことで、そのサイズ以下のオブジェクトを格納できるクラスを作った。 格納できるク…

constな変数の初期化とラムダ

この前、少し初期化が面倒な数値のリストを作らなければならなくなった。しかも結構急いでいた。 適当な例として以下のようなものを考える。 const std::vector<std::size_t> indices{1,4,7,10,13, ... 298}; //流石に手では書けない こんなもの、for文を使えばいいのでは</std::size_t>…

現代のC++

C++17での機能追加について、ネット上では「項目一覧見ただけで読む気失せる」「入門不可能」「闇」「誰も使いこなせない」「絶対に使いたくない」などと盛り上がっている。 だが私は一概にはC++はどんどん初心者を見捨てているとは言えないと思っている。C+…