マガジンのカバー画像

プログラミング千夜一夜(コーディングナイト)

15
プログラミングにまつわるあれこれの話をまとめます。
運営しているクリエイター

記事一覧

while を単体テストする

興味深いポストを見た。曰く:

単体テストでテストできる対象は「評価できる値」で「比較できるもの」となるため、 while そのものをテストすることは難しい。(単体テストが `Assert.Equals` 的な(結果の)値の比較をするツールだという前提で)
while 文の while は、単体で値を持つものではないからである。

ただ While 関数を実装することで間接的に確かめることはできそ

もっとみる

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

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

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

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

もっとみる

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

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

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).}

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

もっとみる
今年ももう M/D か……

今年ももう M/D か……

一年で数回、「日付」と「経過日数の割合」がつりあう日があります。
それが 1/19、 3/15、 4/14、 8/13 の4日、直近では 4/14 です。

どういうことか。
もう少し噛みくだくと 4/14 は、年初 1/1 を一番目として一年間で 104 番目に当たります。(英語では day number と言うそう)
経過日数の割合 104/365 と日付表示の 4/14 それぞれを分数として

もっとみる

あと何日?

6、4、5、2、1の5つの数字に四則演算を挟んでどんな数字が作れるだろう?

もちろん頭を働かせて色々試すのも楽しい。
けれどプログラマーだったらサラッと全通り、出してみたくなりますよね?

数字は固定なので変数は四則演算四つの4箇所。
つまり可能な組み合わせは4の4乗。256通りの数字が作れます。

こういうときは Python を使うのが便利。
四則演算4つの組み合わせは以下でサクッと作れます

もっとみる
『人に伝わるプログラム』講演会

『人に伝わるプログラム』講演会

去る9月20日、「人に伝わるプログラム」と題して講演しました。
「議論メシ編集部」さまにもご紹介いただきました。(感謝!)

日頃、コードを書きながら感じているあれこれを聞いてもらいたい! と、そんなおもいが嵩じたこと。自分から打って出ないかぎり、だれにも決して気づいてもらえないという常日頃のくすぶり。
なにより大学教授やベンチャー社長などなどそうそうたる肩書きが登壇・講演する中で一介の平社員が話

もっとみる

和と積

C++ の話。配列やコンテナの値の総和を取りたい、けれど std::sum はない。ああ今日も車輪の再発明。

sumsum は std::accumulate アルゴリズムをつかって実装できる。

template<typename InputIter, typename Type = typename std::iterator_traits<InputIter>::value_type>in

もっとみる

終了ステータスコード

定義プログラムがどのように終了したかを示すコード。
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; }}

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

もっとみる

バーチャル

仮想と実質

「バーチャル」は「仮想」と訳される。
そして、すがすがしいほどに正反対の訳をあてられた語である。

一方の virtual。

明示されていないとしても、実効的でそのように効果を発揮するもの──だ。同じページの末尾に「MORE ABOUT VIRTUAL」というコラムがあり、このように書かれている:

『ある対象がその他のものとあらゆる面でおなじで、名前や技術的観点でささいな違いがあ

もっとみる

リファクタリング

「プログラムの外部的振る舞いを保ったままで、内部の構造を改善していく作業」(『リファクタリング:プログラミングの体質改善テクニック』、マーチン・ファウラー著、児玉公伸ほか訳)(新装版『リファクタリング 既存のコードを安全に改善する』でも同訳)。

つまり同じ動作をしつつも、違う実装に変える作業、あるいはそのためのテクニックをリファクタリングという。
配列要素を昇順に並べ替えるための実装をバブルソー

もっとみる

プログラムが扱う変数を「型」(タイプ)で捉えると理解がすすむ。(BASIC や JavaScript など明示的に型を扱えない言語も存在する)

単純な型として、真と偽いずれかをとるブール型、四則演算が可能な整数型と実数をあらわす浮動小数点型、1文字をあらわす文字型がある。そして配列型が、別の型の要素を複数まとめる。(文字の配列を文字列型として特別扱いする言語もある)

変数の値の型から、これに「

もっとみる

作用と副作用

プログラムを学習していると「副作用」という単語を耳にするようになる。 
この概念/感覚は、なかなか掴みづらい。
というのも、ふだん書いているプログラムは「副作用」こそを期待して書いているから。(期待する結果を生むことが「(主)作用」になりそうなのに)

大雑把に言うと、プログラムでいう「副作用」は以下の三つ。

変数の値の更新

プログラム外部からの値の読みとり

プログラム外部への値の書きだし

もっとみる