マガジンのカバー画像

技術メモ

72
運営しているクリエイター

記事一覧

ラッチ──初期化は一回だけ

関数に入ったとき、それが最初のときだけある処理をしたい。そんな要求がわりとある。

static bool initialized = false;if (!initialized) { // 初期化処理 initialized = true;}// 通常処理

これで十分目的は達しているのだけれど、まだコードがアセンブラで書かれていた古い時代に「自己書きかえ」という黒魔術があったという話がい

もっとみる

CS0579、属性の重複エラー

クラスライブラリープロジェクトを作成してアプリケーションプロジェクトに参照を追加してビルドしたところ CS0579、属性が重複しているとエラーが出てビルドできなくなった。

System.Reflection.AssemblyVersionAttribute など、いや、バージョンはライブラリーとアプリケーションとで独立しているはずで重複とかおかしいでしょ?
ネットを検索して情報をあさるも、重複し

もっとみる

似たコード(ループ)の整理

ざっくり以下のようなコードを組みたててから遠目に見ると、ほとんど同じだ、と気づく:

if (packed){ var value = read(stream); while (count-- != 0) { yield return value; }}else{ while (count-- != 0) { yield return

もっとみる

OpenMP でのループ途中脱出、是か非か

結論:仕様 3.0 ではループ途中の中断は禁止されている。
つまりループ途中の break や throw によるループ脱出は不可。
#pragma omp parallel forfor (int i = 0; i < 1000000; ++i) { // no break nor throw (except catch it in this scope).}

ループ本体で条件を都度確認し

もっとみる

クリティカルセクション

マルチスレッドでの並行処理を書いているとき、共有リソース(主には共有変数)を同時に書きかえないよう排他アクセスする必要がある。

排他制御を実現するためにコンピューター・サイエンスではセマフォやミューテックスを使う、と習う。 Windows ではこれらより軽量なクリティカルセクション(CRITICAL_SECTION)オブジェクトが使える。
プロセスやセッションをまたいだ排他制御が不要──つまりプ

もっとみる

終了ステータスコード

定義プログラムがどのように終了したかを示すコード。
C プログラムの main 関数が return で戻す整数値。

main の戻り型は int のため「符号つき」におもえるけれど、 POSIX で定められている有効な値の範囲は 0 から 255 までの整数(符号なし)。
値の使いかたには「これ!」という決定的な文書は存在しない?(ご存じのかた、いらっしゃったら教えてください)

意味プログラ

もっとみる

[C++] std::find_if アルゴリズム

for 文と if 条件による探索

特定の条件に合致する要素を配列やコンテナの中から探す。

int index = -1;for (int i = 0; i != LENGTH_OF(items); ++i) { if (items[i] matches blah blah blah…) { index = i; break; }}

非常によくある処理で、それだけにたくさんの

もっとみる

n要素のstd::vectorを初期化する

すべてを同じ要素で初期化するなら vector のコンストラクターでよい。
そうではなく、異なる要素で初期化したいなら generate_n がつかえる。
たとえば 0 から n-1 の値で埋めたいなら、こうする:

auto&& vector = std::vector<int>();vector.reserve(n);int i = 0;std::generate_n(std::back_in

もっとみる

コンテナ内の要素を定数倍する(C++)

std::vector に格納した要素を、一律定数倍するのってどう書けばよいのだったっけ?

すぐにおもいだせず悔しかったのでメモを残す。いわゆる map 関数をつかうというのが答えでした。(C++ なので map した結果を直接コンテナに書き戻せる)

日本語をふくむ URL を urlencode 状態でクリップボードにコピーする(macOS)

日本語をふくむ URL を urlencode 状態でクリップボードにコピーする(macOS)

Wikipedia (日本語)のページリンクをツイートにのせるとき、(⌘L で)アドレスバーに移って(⌘C で)コピーすると日本語がデコードされた状態でクリップボードに入ってしまう。

見た目にわかりやすいのでありがたい。
しかし Twitter クライアントは日本語を URL とは認識してくれないため、ただしいリンクにならずに困ってしまう。

これを解決するために Automator とキーボー

もっとみる

システムインストール済みの Windows SDK バージョンの確認

Explorer で以下を覗くと、どのバージョンがインストールされているか確認できる。

64bit システム%PROGRAMFILES(x86)%\Windows Kits\10\Include

32bit システム%PROGRAMFILES%\Windows Kits\10\Include

ファイルパスの正規化

パソコンをつかっていると「ファイル」という概念にでくわす。避けてとおることはできない。そしてプログラマーならばファイルを掌を指すようにつかえなければならない。

しかしこのファイル、いろいろな側面があってとにかく扱いが面倒。タイトルにかかげた「ファイルパス」の「正規化」もそのひとつ。

* * *

ファイルには名前がある。現代的な OS では「ファイルシステム」という管理構造で整理している。ハー

もっとみる

いいコードを書くための戦

む? Gist リンクが動かない?(下には gist の URL https://gist.github.com/ryohji/c4ea6fe1c4958eb75fa794aaa43cb669 を貼ったのだけれど)

どうでもいい人にはどうだっていい話。

ぼくは「いいコード」が書きたい。
いいコードとはなにか。
とことん突きつめていきたい。とにかく磨いていたい。

Bazel で指定する Google Test アーカイブ

ユニットテストをしたいな、と考えて数年前にお世話になった Google Test をおもいだす。
(10年くらい前のような気がする。まだメインの開発環境として Visual Studio を使っていたころ)
(スタティックリンクライブラリーをビルドして、それをプロジェクトでリンクして…… とか、そんなことをしていた)

さて、時は流れてもう令和も3年。(もうすぐ4年だ)
Google Test は

もっとみる