2020-01-01から1年間の記事一覧

2020年にやったこと

去年同様、主にプログラミング関係のアクティビティを見直してみる。GitHubのActivityはこういうときとても便利だ。Starしたレポジトリの一覧にも日付が出てくれたらいいのにな。 読んだ本や論文とかのメモもひとところに纏めておいたらよいのだろうけど、テ…

Static Initialization Order Fiasco

C++

これはC++アドベントカレンダーが埋まっていなかったので急遽書こうと思い立って急いで寝る前にバーっと書いてたら気づいたときには2時を回っていた記事です。何かあったら教えるか見逃してください。 そもそも何の話? Static Initialization Order Fiasco…

__VA_ARGS__の引数をループするやつはなぜ動くのか

C++ C

今更マクロの話です。求められてるのはそういうのではなくモダンな解決方法の話だということは知っているけれど、例えばreflection TSとかは紹介するには重すぎるので……。まあとりあえず今回は伝統的なテクニックの話をします。他所でも解説されている可能性…

toml11でコメントが増えるバグを修正した

ちょっと面白いバグを直したので久々にブログを書く。最近は少し状況が悪く、あまりよそ事に手を出せていなかった。今もそんなに状況は改善していないが、明らかに書けるネタがあるので書こう。 直したバグはこれだ。 github.com 背景 問題の話をする前に、…

separo-rsの記事

もう三週間くらい前になると気づいて結構驚愕しているのだが、SEPAROというゲームの対戦相手を書いた。 SATySFiで有名な@bd_gfngfn氏が作ったSeparoというボードゲームで昔遊んだことがあり、また遊びたくなったもののルールを知っている/覚えてくれそうな人…

gcc 4.8.xでの標準ライブラリのバグについて

結構昔に書いていたっぽい下書きがあったので手直しして出しておこう。まあイマドキgcc-4.8.5を使う羽目になっている人はあまりいないだろうが、少なくともIssueが立つ程度には存在するようなので。 広く知られていることっぽいが、GCC 4.8系統の標準ライブ…

hugo-bookで左のmenuを折りたたむ

なぜか動かなくて2時間くらい溶かしたので備忘録。 まず、以下のようにfront matterにbookCollapseSection: trueを書いておくとそのセクションはメニュー上でFoldされる。 --- bookCollapseSection: true --- # TitleOfSectionThatShouldBeFolded これで動け…

テンプレート非型メタプログラミングでコンパイル時LISPを書く

C++

人類はちょっと窮屈な言語があったらすぐLISPとかBrainfxxkを作る 前回の記事でC++20でテンプレート非型メタプログラミングが簡単にできるようになって嬉しいねという話をした。まあ実際には型に情報を埋め込んでいるのでこの呼び名はミスリードだが。 やろ…

テンプレート非型メタプログラミング

C++

C++での黒魔術といえばテンプレート型メタプログラミングだ。これは、テンプレートがパターンマッチと再帰を使えることを利用して、型レベルで計算を行う技術を指す。 template<int X> struct factorial { // 再帰的に展開できる static const int value = factorial<X-1></x-1></int>…

コーディングスタイルと文章の認識

コーディングスタイルのことを考えるよりコードを書いたほうがいいということはわかっているのだが、コーディングスタイルのことは結構考えてしまう。恋か? 私は割とコーディングスタイルの好みが激しいのだが、自分がなぜそのやり方を好んでいるか、あるい…

今更github actionsでcmake + boost unit_test_framework

今更すぎる。 自作の粗視化分子動力学エンジンのPRのチェック項目にTravisが表示されなくなっているのに気づいて、どうせならActionsでCI流すかと思って始めたのだがクッソもたついた。 何度かActionsは(C++, CMake, Boost.unit_testの組み合わせで)使った…

作る側の気持ちで理解する浮動小数点数

浮動小数点数を理解している人は比較的少ない[要出典]。だが基本的なアイデアは思うよりも難しくないはずだ。できるだけ短い説明をしたい。そこで、あなたが浮動小数点数を設計する人間になったと思い込んでほしい。すると気持ちが理解できる。ただ、簡潔さ…

rsqrtの精度とレイトレのアーティファクト 再訪

こんな記事を書いたことがあった。 in-neuro.hatenablog.com これの誤差に関してもう少し掘り下げた記事を、英語と日本語の両方で書いてみた。 toruniina.github.io 英語はまだ拙いところが多いだろうが(クソ時間かかった)、まあここから飛ぶ人は日本語を…

variadic templateを前に置きたい!

C++

variadic templateを関数の引数にすると最後までマッチしてしまうので関数の先頭に任意個の引数を取るような関数を書けない。困りますよね。 可変個の引数を先に渡して、最後に追加で何かを渡したい、そんなこともあると思います。 template<typename ... Ts, typename F> void f(Ts&& ...</typename>…

C++ Conceptとエラーメッセージ

C++

C++20 Conceptに少し慣れようと思い、練習がてら雑JSONを出力できるライブラリを書いてみようと思った。 C++20となると色々考えるべきことが増える(std::u8stringをどうするか? とか)が、今回はそのへんは主題ではないのでできるだけ今までのC++の範囲内…

atcoderに参加してみた

ABC167と168に出た。両方4完でパフォーマンスはギリ水(1293)と緑(1091)。今回下がったのはCでWAしまくったからだろう。ロジックにミスが見当たらなかったので誤差の扱いが雑だったっぽい。まだどういうケースで落ちてたのか見つけられていない。提出したコー…

個人サイトを作った

なんかそういうのがあったほうがいいのかなと思って作りました。多分数年前にもちょっとやろうとして放置していたと思う。 toruniina.github.io 将来への不安に苛まれてる時の方がこういうのをやったほうがいいのかなという気持ちになる。 一応Blog的にも使…

AtCoderに登録してみた

男もすなる競プロといふものを女もしてみむとてすなり(女ではない)。そもそも出場していないので「すなり」とか言ってるけど実際にはしてすらいない。 年明けに「今年はもう少し色々記事を書くぞ」とか言っときながら書類とセミナー発表とゲームと書類と書…

コア数が多いマシンが手に入ったのでslurmで計算クラスターにする

slurmはオープンソースのジョブスケジューラーだ。 これは何かというと、例えば、俺は今から1000種類の条件でシミュレーションを投げるぞ! ウオオ という時に、サーバーにログインして、シェルのfor文で1000個のバッチスクリプトを登録し、そのままログアウト…

trailing comma問題

C++

別名ケツカンマ問題。 最後の要素の後にはカンマを入れてはいけない、という場合にどう対処するか。 要素のインデックスやイテレータを使ってループしているなら、普通にそれを見ればいい。 std::cout << "["; for(std::size_t i=0; i

static variableの初期化順序

C++

template structの中にstaticなstd::mapを作ってmain()よりも前にアクセスしたらその時点ではまだコンストラクタが呼ばれておらず、中身がゼロ埋めされていてセグフォになった。 静的変数の初期化順序は基本的に書いた順、翻訳単位が違ったら実装定義、実装…

std::variantと不動点演算子

C++

実は、std::vectorはC++17から不完全型をサポートしたので、std::variantと組み合わせると以下のようなコードが書ける。 struct config_t { std::variant<bool, int, double, std::string, std::vector<config_t>> data; }; これを上手く使えばJSONなどの木構造をかなり簡単に(ポインタを陽に触らずに)扱える。std</bool,>…

アセンブリ解読:Fortran配列の中身

前回の続きです。 以下のコードを-O3でコンパイルすると、 pure function nth(v, n) result(out) implicit none integer, intent(in) :: v(:) integer, intent(in) :: n integer :: out out = v(n) return end function nth こんなアセンブリになって驚いた…

x64で配列の添字にintを使うと遅い

こういうツイートを見た。気になったので試してみたら本当にそうらしい。 x64でEAXに値を入れるとRAXの上位は(符号拡張ではなく)0になる。なのでC/C++で配列の添え字に32bit整数を使うと符号拡張命令が追加されて遅くなる。LP64環境で配列の添え字にintを使…

thrustのバグを見つけて直した話

thrustがasync対応していたのを先月見つけた。 in-neuro.hatenablog.com ドキュメントがまるで書かれていないところをコードを読み進めて試していたのだが、そこで不可解な動作を発見した。 以下のようなコードを書いたとする。thrustの関数を非同期に読んで…

tomlの複数行文字列内でのクオートの取り扱いに関するエッジケース

何が起きたのか TOML規格レポジトリにこの記事のタイトルの通りのアップデートがあった。 github.com 基本的に、toml11ではTOMLのmasterブランチに入った変更は TOML11_USE_UNRELEASED_FEATURES を define しないと有効にならないようにしている。だがこの手…

TravisでOpenMPは使える

使えるみたいです。ただしOMP_NUM_THREADSを小さめの値、4とか、にしておかないといけないらしい。というのも、VMを動かしているハードのコア数(めちゃくちゃ多いんだと思う)を取得するからだそうで。CIに投げてる全員がそんな数のスレッドを立ち上げたら…

OpenMPの挙動を見る

少し前、ちょっと面白い挙動に出くわしたので、順を追って説明しておこうと思った。知ってる人には当たり前のことが書かれているので下の方まで飛ばしてくれても構わない。 OpenMPはプラグマを書くだけでメモリ共有並列化ができるというやつで、手をつけやす…

CMake 3.16でprecompiled headerがサポートされていた

CMakeの最新バージョン、3.16でtarget_precompile_headerがサポートされていた。ドキュメントは以下の通り。 cmake.org precompiled headerは、大規模なプロジェクトなどで変更がないのに様々な.cppファイルから何回もインクルードされるヘッダーファイルを…

-ffinite-math-onlyでも動くNaN/infチェック

以前こういう記事を書いた。 in-neuro.hatenablog.com まあNaNじゃないことを仮定しての高速化なんだからstd::isnan(x)を常にfalseだと思ってdead code eliminationするのは当たり前じゃんという気はするが、備忘録的に。 とはいえ、コンパイルオプションに-…