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

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

プログラミング

どう書くのたのしみ

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

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

お題。 オフラインリアルタイムどう書く第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++です。この話が出るたびに「コンストラクタ書いとけ、クラスにしとけ!」と心の中で言って…