エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

プログラミング

どう書くのたのしみ

横浜へなちょこプログラミング勉強会 オフラインリアルタイムどう書く が神田に移ってきてやがて半年になります。 場所が住んでいるところから近くに移ったということもあって、ようやくオフラインで参加できるようになりました。ふりかえってみるとオンライ…

エントロピー符号をステートマシンで解く

お題。 オフラインリアルタイムどう書く第8回の参考問題 - Qiita この問題は、名前が示す通り、エントロピー符号で符号化されています。 エントロピー符号 - Wikipedia と、いうことは。一定の手順を踏むことで復号が可能ということになります。 と、いうこ…

プログラミングの攻めと守り

周回遅れ。すでに第9回の参考問題が出題されているという状況で第8回の参考問題を解くという。 オフラインリアルタイムどう書く第8回の参考問題 - Qiita 以下、コード。コードの全体はGitHubに格納しています。 #include <iostream> #include <sstream> #include <string> static const </string></sstream></iostream>…

バロックタワーのパズルを解く(演算で)

ドラクエVIIのバロックタワーのパズルを解く - 虎塚 じーっと、内容を眺めて。「演算で解けそう」と感じたので、やってみた。 いつものように。あんまり厳密ではないです。と、最初に言い訳。 パズルの内容と数値との対応はこんな感じ。 像の番号: 上=0, 右=…

バックトラッキング、C++で、Prologも、Haskellでも

「第7回オフラインリアルタイムどう書くの問題」を解いていて気がついたこと、学んだことを明日のじぶんのために、記録。 のんびり座りたい 〜 横へな 2013.2.2 いろいろ問題をコネているうちに、この問題はパタンマッチングで解けることに気がつきました。…

問題を解く難しさ、問題を作る難しさ

難しさで言ったら圧倒的に、 問題を解く < 問題を作る なわけで。 ソフトウェア開発の難しさのうちのかなりの部分が、じつはこの問題を作る難しさに起因しているじゃないかと。 仕事でソフトウェア開発をしていても、「これ、解く問題を間違えてるんじゃな…

2点を対角の頂点とする矩形の内側の点を判別せよ

「オフラインリアルタイムどう書く第6回の参考問題 - Qiita」は前回一度解いていますが、別の方法――対象となる点をすべて数え上げるという方法で解く場合のお話。この問題では判定が必要な点の個数は10×10のたかだか100とわかっているので、こういう力技法で…

プログラムコードの、ひとつ上の視点で

今年の後半は、鍋谷さんが主催されている「オフラインリアルタイムどう書く」にオンラインで非リアルタイムで参加させてもらいました(参加というか、勝手にコード書いてアップしてただけですが)。以前にも書きましたが、鍋谷さんが出題される問題の難易度…

組み合わせ(combination)と部分列(subsequence)

備忘録。 Combination - Wikipedia Subsequence - Wikipedia C++で vector以外でキチンと動作するか、まだ確かめてないです。 combination #ifndef COMBINATION_H #define COMBINATION_H #include <vector> #include <iterator> template<typename iterator_t> void combination(iterator_t begin, i</typename></iterator></vector>…

組み合わせ(数学の) 〜 combination

C++で ベクタから指定した個数の要素を持つ部分集合のベクタを生成します。 #include <vector> template<typename T> struct Combination { typedef std::vector<T> source_type; typedef std::vector<source_type> values_type; Combination(const source_type& source, int n) { std::vector<int> v(</int></source_type></t></typename></vector>…

左右がつながっている場合、左右の番兵はひとりで兼任できる

いつも絶妙で楽しい問題を提供してくださっている@Nabetaniさん。すでに第5回の募集と参考問題の公開が始まっています。興味のある方はぜひ参加して、また問題を解いてみてください。問題の絶妙さが実感できます。 第5回 オフラインリアルタイムどう書く : A…

iOS プログラミング 始めました

そんなこんなで。トレーニング中 GitHub - mattsan/iOSsampleApp1 Objective-Cに最初に手を出したのが2006年だったと思います。Mac OS Xでネイティブなプログラミングだーっ、と手を出したまではよかったのですが。Objective-C Mac OS Xプログラミング作者: …

補遺(「すごいことを見る者にすごいと意識させないということ」についての)

そういえば。 よいプログラムほど簡単に見える、という逆説というか経験則というかを今日になって思い出した。 よくできたプログラムは読んでも理解しやすいので簡単なことしかやっていなように見えるというもの。逆に、難解なプログラムは難しいことをやっ…

「手続き的」と「宣言的」のはざまで

lis.py → lis.rb → lis.hs …ときたので、当然のように lis.cpp に挑戦している最中。 現在いささか苦戦中なので、C++のコードをポストするまでのあいだに気がついたことを、めも。 Haskellで書いたとき、関数を評価するコードではまったことはすでに書きまし…

「意図どおりに動く」では半分

現在のプロジェクトのソースコードを静的解析ツールにかけた結果がレポートされたので、昨日はその内容を見ていました。 ツールが警告を出した場合、警告が出た箇所にどのように対処するかを報告しないといけないのですが、その報告の中に「現状とする/意図…

シリアライズ/デシリアライズ/バイナリパーサ

あとでよく読む。 バイナリシリアライズ形式「MessagePack」 - Blog by Sadayuki Furuhashi http://code.google.com/intl/ja-JP/apis/protocolbuffers/ バイナリファイル形式パーサージェネレータが欲しい - 言語ゲーム バイナリファイルパーサジェネレータ…

プログラミングについて討論したいとき

ふと思ったことを記録。プログラムとかプログラミングについて討論したいけれど、近くにそういった人がいないとき、みんなどうしてるんでしょう? そういった集まりとかって、わたしが知らないだけで普通に行われているんでしょうかね? …とか言っていても、 P…

わたしはコンパイルスイッチがきらいです

// Foo.h #ifndef FOO_H #define FOO_H typedef struct foo_tag { int hoge; #if defined(USE_FUGA) int fuga; #endif int uhyo; } Foo; #endif//FOO_H // IncUhyo.cpp #include "Foo.h" void incUhyo(Foo* foo) { ++foo->uhyo; } // Main.cpp #include <stdio.h> #in</stdio.h>…

Lispが突然にわかる

長らく理解できなかったLispで書かれたプログラム。どんな構成かはわかるものの、プログラムとしては理解できなかったLisp。 ここ数日、とある理由でLispのプログラムを眺め、「やっぱりわからないなぁ」とか感じつつ、S式の定義とか見ていた。 で、突然、は…

C with lambda

http://daikiti41.blogspot.com/2009/01/c-with-lambda.html面白い面白い。Cプログラムを生成するプログラム(一種のプリプロセッサ)というのもあるけれど、200行程度でできてることがちょっと驚きだった。 ただ。普段C++を使う身としては、文字列扱うのでメ…

言語と言語の距離

どう抜く?にエントリしています。主にC++とHaskellで書いたコードを投稿しているんですが、ふと気がついたことが。 使い慣れているC++で書いてから、次にHaskellで書いてみることが多いんですが、このときC++からHaskellへ書き直しているわけではないんです…

スペシャリストのいないプログラム

BLOB(肥満児)クラス増殖中!という、アンチパターンの典型にはまっているということなんですが。責務の分割がうまくできていない。今日気がついたんですが、最初からBLOBクラスを作ろうとしているわけではないんですよね。機能ややることが増えるたびに、さて…

コードがかわいそう

「コードがかわいそう」とか思ってしまったわたし、どんだけコード好き(…というかフェチか…?)なんだか。 とはいえ「かわいそう」とまでは行かずとも、もうちょっとどうにかならないだろうか、と思ったことは少なくなく。そんだけコードに変化がないというわ…

二つの言語

C/C++における、プリプロセッサとコンパイラ。 わたしはC/C++のプリプロセッサがどうも好きになれなくて。より正しくは、プリプロセッサのある種の書き方がすきになれなくて。いわゆる、こういう書き方。 void foo() { #ifdef DEBUGGING デバッグのときだけ…

操作の横恋慕

仕事をしていて、こういうコードをしばしば目にしてます。 class A { public: void doSomething() { doSomethingForB(b); } private: void doSomethingForB(B& b) { // Bに対する操作 } B b; }; 「操作の横恋慕」ですね。 これを、こう書いたほうがよいよ、…

概要と詳細

ここ2、3日、少しずつ時間をとってコンスタントにコードを書いてみて感じたこと。 わたしは割とボトムアップでコードを書く癖があります。今回のコードでしたら、まず自機を表示して、次に動かせるようにして、次に弾を撃てるようにして、次にエイリアンを表…

DRY

DRY --- Don't Repeat Yourself. もう原則中の原則と自分では認識しているんですが、まだまだリピートしている設計やコードをいくつも見かけます。きーっ!もっとプログラミングの腕を磨けっ!…とか、声を上げたくなったり愚痴ったりしたくなるわけですが。少…

分断されるコンテクスト

先日、コードレビューで不思議なコードを見ました。再現してみるとこんな感じです。 if(! running) { start(); // (A) } if(running) { // (B) } 最初に見たとき、本当になにが起こっているのかわかりませんでした。コードを見れば明らかに(A)と(B)は排他に…

いつ学ぶか

2年近く前に書いたエントリです。 仕事でソフトウェア開発をするのでしたら、開発が始まる前に学習しておくのが本来でしょう。実際は…ある意味予想通り…開発の現場で学習する、という事態になっています。わたしは、当然のように、この事態は間違っていると…

POD

レビューにて。 試験の結果、不具合がいくつか見つかりました。初期化漏れで構造体に不定値が入っていた、という不具合がごろごろ。使っているプログラミング言語はC++です。この話が出るたびに「コンストラクタ書いとけ、クラスにしとけ!」と心の中で言って…

カプセル化と関数と名前づけ

註:ここでの関数はC言語の関数のことです。「オブジェクト指向のこころ」を読みながら。同書でカプセル化を「あらゆる種類の隠蔽」と説明しています。それをふまえて。仕事の現場で、最近思ったのが「関数ってのもカプセル化なんだな」と。 手続きのまとまり…

複数の言語で書く意義

わたしの場合。いくつかの言語でFizzBuzzを書いてみているのは、知的好奇心という側面と(この面がたしかに大きい)以外に、特定のやり方に捕われないようにするための練習だと思っています。 言語の特徴は同時に思考を制限する部分もあるわけで、同じ言語ばか…

ポリノミアルカウンタ

以前、仕事でIC設計に関わった時に使ったカウンタ。ふと思い出したので、記録。そのカウンタは次のような感じで定義されるものです。 Kビットからなる値xの各ビットをx[i]、つまりx=(x[K-1], x[K-2],...,x[0])として、 数列x0,x1,...,xnを次のように定義する…

名前、大事!

今日はコードレビュー。言語はC++。 関数の説明を求める。いろんなことをやっている関数。関数名はやっていることを表していますか?とたずねると、悩まれてしまった。コードレビューとしては失格だった−−コードをレビューしなくはいけないのに、書いた人の方…

オブジェクト指向へ跳躍

C++を使ってソフトウェアの開発をしているわけですが。「オブジェクト指向っぽくないな」という設計に出会います。 オブジェクト指向は普通の技術者が普通に使う普通の技術だと、今では思っているのですが、それとて学ばずにその技術が身に付くわけもなく、…

あえて組み込みでC++を使うというのならば

必要なのは、標準となるライブラリだと思います。リソースが足りないことを言い訳にしているのか、どうも組み込みの環境のライブラリは貧相な気がしてなりません。デバイスを操作するためのビット演算やビット列の分割結合、タスク間通信のためのシリアライ…

「マジックナンバー」はなにか?

プログラマとしては、今更な話題ですが。プログラミングの基礎として、マジックナンバーを使うのをよそうというのがあります。 for(int i = 0; i < 10; ++i) // `10'ってなに? ちゃんと名前をつけようと。 static const int ArrayCount = 10; // ... for(int…

いまさらICFP Programming Contest

いまさらながらICFP Programming Contestに手を付けてみたところ。まるまる半日がかりで仮想マシンを書いてみたものの、ひとまず動けばいいと、いたって低機能、必要最小限。夜中になってシステムが動きだし、その中に課題があるのだけれども。階層の違う思…

パーサライブラリを作ってみた。

Boost.spiritに触発されて、自分でもパーサライブラリを作ってみました。サブセットの模倣みたいなものですが、シンプルな割には機能するものができたのではないかと自己満足。2006/04/12 追記 再帰構文に対応できないことに気がつきました。それと、一部よ…

日本語を日本語に翻訳する

「パターン指向リファクタリング入門」を読んでいます。一つ一つの事柄を読んでいくと、普段わたしがソフトウェア開発をする中で、よく感じることが裏付けを持って書かれてる、と感じます。本家「リファクタリング」を読んだときもそうだったのですが、自分…

「メンテナンス容易性」という品質

一緒に仕事をしているプログラマに、昨日また、おおよそプログラマであれば考慮しなければならない「メンテナンス容易性(たとえばここ)」を説いて、そして説得に失敗しました。一ヶ月以上ことあるごとに説いてきましたが、連敗中。我慢強くないわたしは、…

いつオブジェクト指向を学ぶか

仕事でソフトウェア開発をするのでしたら、開発が始まる前に学習しておくのが本来でしょう。実際は…ある意味予想通り…開発の現場で学習する、という事態になっています。わたしは、当然のように、この事態は間違っていると信じています。しかし、これがエン…

「設計する」こと・余談

「設計する」ことと「設計書を書くこと」を取り違えていると、書きましたが、設計書を書くことについても「ワープロで清書すること」と思っている人がいるようです。それはそれとして。わたしはワープロが好きではありません。ひとくくりにして扱ってしまう…

「繰り返さない」再び

「繰り返さない」という話を先日書きました。 実際、ソフトウェアを設計していると、機能として、繰り返しを必要とすることに出くわすことはあまりないように感じます。むしろ言語などの制約から、必要な機能を繰り返しで実現しているだけのほうが多いのでは…

なにをやるか、どうやるか

設計や実装でも、なにをやるかとどうやるかの違いを、つまりは目的と手段を、きちんと意識する必要があると思います。言葉にするとあたりまえなのですが、書かれたコードを見ると、そうでもないようです。なにをやるかを置いてけぼりにしているコードが、少…

「繰り返さない」「分岐しない」「処理を書かないしない」

構造化プログラミングに喧嘩を売っているようなタイトルになってしまいました。 よりよいソフトウェアを作るためには何が必要か、とたびたび考えます。特に「堅い」ソフトウェアを作ることに興味があります。わたしが考える「堅い」とは、堅牢という意味で、…