このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

その他プログラミング

モノグサ精神のジレンマ

モノグサはプログラマの美徳と呼ばれる。モノグサ精神は進化の原動力となるが、同時に理論的整合性を崩したり、混乱と錯誤の元凶ともなる。モノグサ精神は: 記述量を減らしたい、略記したい オーバーロードしたい 名前を考えたくない、名前を付けたくない …

データ型と型シノニム

HaskellやMLで、データ型と型シノニムの違いがある。この違いは、関数定義において、“再帰スキーマやイプシロン式で定義する”のと、“通常の関数定義する”のとの違いと類似だろう。スキーマとは、「これこれの性質を持つモノ」という性質記述をすると、その存…

型クラス

ダメさ 困ったバンドリング→ 分離分割する。 困ったエンタングルメント →絡み合い・もつれ合いをほどく。 Coqの場合は、名前が漏出する。 骨絡みの欠陥なので、修復不可能。再設計、再実装。名前管理・オーバーロード機能と構造記述機能を別に持つ。MLの型ク…

統一呼び出し構文

Nimに統一呼び出し構文というのがある。 http://nim-lang.org/docs/manual.html#procedures-method-call-syntax Eiffelでも、プロパティとメソッドをまとめてフィーチャと呼んでいて、プロパティと引数なしメソッドの区別はなかったと思う。

教養のプログラミングとは

本編に書いた→ 教養としてのC言語プログラミング入門は成立するのか - 檜山正幸のキマイラ飼育記一昨日と昨日(土日)、「教養としてのC言語によるプログラミングのお勉強」つう感じのものに付き合う機会があったのだけど、トピックや課題の選び方はなかなか…

scanf()とか

本編に書いた→ 教養としてのC言語プログラミング入門は成立するのか - 檜山正幸のキマイラ飼育記僕は最初から「scanfは使うべきではない」と教わったので、scanfの存在は知っているが使ったことはない。正体がハッキリした文字列にsscanf()を使うことはある…

スレッドを待つ

スレッドをスタートする関数が StartHogeProcess みたいな名前(にしたのは自分)で、プロセスだと思っていて、処理をスタートさせてからメイン側を終了させた。当然にプロセスが終わるので、そのなかのスレッドも終了する。このときの終了の仕方が、かなり…

MinGW環境がゲロ吐きそうに面倒

MinGW32を入れ直し - 檜山正幸のキマイラ飼育記 メモ編 の事情で MinGW.OLD/ という名前で旧版を塩漬けして、MinGW/ は新版、とした。 旧MinGW 新MinGW 混合 gcc 4.6.2 4.9.3 5.1.0 bash 3.1.17 3.1.23 4.3.42 binutils 2.22 2.25.1 2.25 これに、シュルとし…

インターフェースの仮想デストラクタ

C++では、Javaのような言語仕様としてのインターフェースはない。だけど、純粋仮想関数を並べればインターフェースの代用になる。代用になるのだが、インターフェースは言語仕様ではなくて手法なので、落とし穴がある。インターフェースのつもりのクラスに仮…

未使用な引数を警告させない

これで、-Wall -Wextra でも警告が出ない。 #define UNUSED_VAR(x) (void)x; int main(int argc, char *argv[]) { UNUSED_VAR(argc) UNUSED_VAR(argv) int k; UNUSED_VAR(k) return 0; }

サイズがはっきりした整数

サイズがはっきりした整数を使いたいなら、stdint.h を使え。unit32_t とかある。

クローズの失敗

ファイルのクローズのようなリソースの解放・後始末に関して失敗した場合、いったいどうすりゃいいの。失敗したと知っても、その後何もできない。知ってもどうにもならないことなんて知りたくない。 void close(...) でいい気もする。まーしかし、ログに出す…

Commandの分類とネーミング

メイヤー流のCommandのさらなる分類 リソース獲得 -- 増進的状態変容で、戻り値はないか、成功・失敗を告げる。 リソース解放 -- 減退的状態変容で、戻り値はないか、成功・失敗を告げる。 リソース生成 -- 増進的状態変容だが、自分で所有権を持たず、生成…

grepabilityとネーミング

Cライブラリでメモリ管理は最早しないとは思うが、alloc で malloc, calloc, alloca を検索できるから、ユーザー関数の名前で 'alloc' は使うべきではない。 同様に free も使うべきではない。 同様に、new, delete も使うべきではない。 大文字が許されるな…

爺感:参照/ポインター引数と変更

爺感:なんだか作法がわからん - 檜山正幸のキマイラ飼育記 メモ編 参照を渡すのは書き換えるためだと思うのだがなー。書き換えない意図こそconstで示すべきじゃないの。 「変更するならポインターを渡す」という人はけっこういるようだ。参照をもらって、参…

状態遷移と状態変容、メイヤーのCQ分離原則

メイヤー先生のCommand-Query分離の原則はいつだって役に立つ。ただ、若干の拡張や補足は必要になる。コマンドとして、“状態空間のendomorphismである状態遷移(transition)”以外に、“異なる状態空間のあいだの写像である状態変容(mutation)”が必要だ。tr…

所有権の問題

権利には義務が伴う、ってことで、所有権とは「破棄の義務」ってことになる。所有権を獲得するって事は、破棄の義務を背負うってことだ。Rustの所有権モデルとか(いやっ、よく知らないけど^^;)、ユニークポインターだと、所有者を単一にしているようだけど…

さらに、コピー埋め込み方式のデメリット

コレクションの設計をミスったような気がする - 檜山正幸のキマイラ飼育記 メモ編 で、リストのようなコレクションのなかでは、要素へのポインターだけを保持して、要素自体をコピーして抱え込まないほうがいいかも、と書いた。コピー&抱え込み方式は、パフ…

爺感:const参照な引数

おそらく、生々しい/禍々しいポインターを避けるコーディングが最近の傾向なんだろう。それはまったく異論がない。異論がないが、ジイサンがスタイルを変えるのはけっこう大変。とりあえず思ったのは、ポインター引数 Foo *pArg を、const Foo& rArg に変え…

爺感:コピーとポインター

リストの要素をまるまるリスト側にコピーして管理する方式は、パフォーマンスの問題を除いてもマズイ点がある。コピーを、コピー元→コピー先 の矢印で書くことにして、参照(ポインター)も、参照元→参照先 の矢印で考える。A→A' とコピーされたとき、Aへの…

フォーメーションと極限

単一のオブジェクトではなくて、複数のオブジェクトが連携するとき、編成された連合体を何と呼ぶか? あまり適切な呼び名がないような気がする。フェデレーションという言い方もあるが、大げさな気がする。2002年頃、僕はオブジェクトフォーメーションと呼ん…

リネーム、割とおおごと

ファイル名の変更 バージョン管理システムに知らせる。ファイルシステムで勝手にリネームしない。 IDEを使っている場合は、IDEにも知らせる。 Makefile内のファイル名を置き換える。 Doxyfile内のファイル名を置き換える。 ソースファイルのincludeやコメン…

コレクションの設計をミスったような気がする

クラスFooにはコピーコンストラクタと代入演算子が定義されている、とする。で、次のような、Fooを要素とするコレクションを定義する。 class FooCollection { private: std::vector<Foo> elements_; public: void addFoo(int x); }; addFoo() は次のような感じ。</foo>…

C++の初期化

どうも、最近のC++では初期化構文が統一的になるらしい。だが、丸括弧と波括弧がどう違うか(同じか)理解してない。 #include <iostream> struct Foo { int x; int y; /* // これを定義すると、{x, y} の初期化子が使えなくなる Foo() { x = 0; y = 0; } */ }; // 書</iostream>…

DoxygenのMarkdownファイルはソースファイル

Doxygenの自動リンク機能は強力で便利で、一度使い出すとやめられない。md(markdown)でも自動リンク構文が使える。ソース内のドキュメンテーションコメント以外に、独立したmdファイルのドキュメントも書いている。自動リンクを使い出すと、mdファイルも、…

古い感じの宣言

#include <stdlib.h> // _swab void _swab( char *src, char *dest, int n ); これ、_swabの第1引数は参照するだけだからconstなんだが、const付いてない。 something foo(const wchar_t *pSrc) { // ... _swap(pSrc, pDest, n); // ... } constの違いと、wchar_t* と </stdlib.h>…

爺感:メモリ管理はやっぱり面倒くさい

大昔、 「プログラマの常識」ってなによ? - 檜山正幸のキマイラ飼育記 「常識」というよりは「理解の基盤」と「説明の方法」 - 檜山正幸のキマイラ飼育記 で、 char *foo() { char buffer[BUFF_SIZE]; // ... return buffer; } は話題にしたことがある。ret…

C++のめんどくせー所

別に嫌いではないが、めんどくせーと感じるのは: プリプロセッサ。こいつは、C/C++の構文を知らないアホタレだ。なのに、言語処理系全体としては、このアホタレに強く依存している。結果として全体がアホタレになってしまっている。 メモリ管理がうざい。バ…

gccのpre-compiled headerがらみの謎の現象

対処法は分かったが理由がサッパリ分からない謎の現象。これを詮索している余裕がないので、とりあえず起きたことを記しておく。後で再現できるかどうかは分からない。まず、2つのソースコードがある。1行しか違ってない! $ diff -u t_params.cpp t_params2…

爺感:ポインターを使ってしまう

時代が変われども、ポインターは相変わらず剣呑な野郎だ。 const some_type *some_pointer とか const some_type * const some_pointer でメモリを守る。 参照のほうが安全だし使いやすいから、参照が使えるなら参照を使う。 生ポインターを扱うmalloc/free…