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

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

2009-01-01から1年間の記事一覧

Fizz Buzz by C++

C++

分岐もループもなくして、めんどくさく解いてみる。 #include <iostream> template<int N> struct Fizz { static const bool enabled = false; typedef Fizz<N + 1> next; }; template<int N> struct Buzz { static const bool enabled = false; typedef Buzz<N + 1> next; }; template<> struct Fi</n></int></n></int></iostream>…

Luaの戻り値のない関数の戻り値

Lua

入門Luaプログラミングを読んでいると、次のような記述がありました。 関数内にreturn文が存在しない場合は関数の出力がないということなので、nilが戻り値になる、と考えます。 入門Luaプログラミング P.33 「と考えます」が気になったのですが、次のような…

Fizz Buzz by Lua part2

Lua

で、Haskellで書いたやり方でLuaで書けないかやってみた。 function cycle(x) return function(x, i) i = i or 0 i = x[i + 1] and i + 1 or 1 return i, x[i] end, x, nil end fizz = coroutine.create(function() for k, v in cycle({ "", "", "Fizz" }) d…

Fizz Buzz by Haskell part2

もう一段階簡単にする方法をコメントで教えて頂きました。ありがとうございました。 fizz = cycle [ "", "", "Fizz" ] buzz = cycle [ "", "", "", "", "Buzz" ] fizzbuzz = zipWith max (map show [1..]) $ zipWith (++) fizz buzz 大小を比較できる要素か…

オブラブ忘年会2009

一昨日開催された「オブラブ忘年会」に参加してきました。 宴ということで、すでに話の輪ができていて、わたしも会場に着いたそばからビールを頂き。 ビールを飲みつつ、ゆるやかに宴は始まり、まずは10ヶ月前になる冬合宿の報告から。 話を伺いながら、高密…

Fizz Buzz by Haskell

fizz = cycle [ "", "", "Fizz" ] buzz = cycle [ "", "", "", "", "Buzz" ] fizzbuzz = zipWith ( \ n s -> if s /= "" then s else (show n) ) [1..] $ zipWith (++) fizz buzz main = mapM_ putStrLn $ take 20 fizzbuzz もう一段階、簡単になりそうな気…

Fizz Buzz by Lua

Lua

fizzbuzz = { [0] = "Fizz Buzz", [3] = "Fizz", [5] = "Buzz", [6] = "Fizz", [9] = "Fizz", [10] = "Buzz", [12] = "Fizz", print = function(self, i) print(self[i % 15] or i) end } for i = 1, 15 do fizzbuzz:print(i) end 実行結果。 1 2 Fizz 4 Buz…

double dispatch by Lua

Lua

module("message", package.seeall) FOO = 1 BAR = 2 BAZ = 3 ALPHA = 1 BETA = 2 GAMMA = 3 -- NULLメッセージ(インタフェースはあるが中身がないメッセージ)をつくる function create_null_message() local result = { protocol = "null", type = "null"…

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

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

多重継承の使い方の一例

C++

C++の多重継承に熟知された方から見れば(そうでない方でも?)、なにをいまさら感、が漂ってますが、こういう使い方をすれば便利なのか、と気付いたのでメモ。 わたし自身の考えとしては、多重継承はぜんぜん否定していないんですが、うまい使い方というの…

浮動小数点数値をバイト列にする

C++

今週、仕事場で協業している某社からリリースされてきたコードを見ていて。次のような雰囲気のコードを見つけました。実際に目にしたものからだいぶ書き換えてますが、こんな雰囲気ということで。 // double value = ...; UINT64* p = reinterpret_cast<UINT64*>(&val</uint64*>…

アジャイルマインド勉強会イベントに参加

先週の土曜日、11月14日に開催された、アジャイルプロセス協議会の「アジャイルマインド勉強会イベント」に参加してきました。メインは風岡先生をお招きしての医療看護の現場についてお話。とても興味深い内容でした。わたし自身、いく度か入院し手術を受け…

メソッドホルダ・分析篇

C++

昨日のエントリではかなりダメダメな感じになったのですが、「じゃぁBoost Libraryではどうやっているのか?」が知りたくなり、昨日のエントリの最後にBoost Libraryで書いたコードをプリプロセッサに通した結果を表示させてみた。 なんと、こんな感じだった…

メソッドホルダ・失敗篇

C++

Delphiでは、戻り値の型と引数の数と型さえあっていればどんなオブジェクトのメソッドも格納できるメソッドホルダ(と言うんだったかな?)がありますが、これをC++で実践しようとした結果。 一種類で100行超えるとはどういうこったい。なにかやり方を間違え…

言葉に降り積もる意味

「ガラパゴス」という言葉が使われるようになっています。ガラパゴス諸島の生物になぞらえて、「独自の変化を遂げた」とか「特定の環境に適応した」という意味のたとえとして使われているのだと、耳にしはじめた頃は思っていたのですが、どうもそういうわけ…

googletestまとめ

導入 →googletestについてのまとめ テストの記述 基本的な使い方 →基本的な使い方 前処理・後処理のあるテスト →前処理・後処理のあるテスト アサーション 二種類のアサーション(FatalなアサーションとNonFatalなアサーション) 真偽を評価するアサーション…

その6:アサーションの解説(3)

例外を扱うアサーションマクロです。 Fatal assertionNonfatal assertionVerifies ASSERT_THROW(statement, exception_type) EXPECT_THROW(statement, exception_type) statement throws an exception of the given type ASSERT_ANY_THROW(statement) EXPECT…

その5:前処理・後処理のあるテスト

各々のテストで同様の前処理や後処理がある場合、テストケース単位で設定することができます。 まず、::testing::Testの派生クラスとしてテストケース名のクラスを定義します。そしてこのクラスに前処理が必要であればSetUp関数を、後処理が必要であればTear…

「数学ガール/ゲーデルの不完全性定理」発売

MATSUMOTO Eiji on Twitter: "フライング!?#mathgirl http://f.hatena.ne.jp/twitter/20091024161354" …というわけで。発売予定日を明後日にひかえた今日、入手致しました。この書店では、レジの正面に話題の本を集めた棚があるんですが、そこに既刊の2巻…

その4:アサーションの解説(2)

残りのアサーションマクロのうちの、2つのグループの解説です。 無条件の成功と失敗 ここでのマクロは値や式を評価せず、直接に成功あるいは失敗を生成します。 SUCCEED() 成功を生成するマクロです。ただし、このマクロが評価されたとしてもテストが成功し…

上司のタイプ

上司に限らない話かもしれない。この1年半で3回上司がかわって、つまり4人の上司の下で仕事をすることになった。 今週、その4人目の上司と面談があって、そこで感じたこと。 上司には少なくとも4つのタイプがある。 話をするのをためらわせる上司 話を…

boost::dynamic_bitsetから部分ビット列を切り出す、のつづき

C++

昨日のコード、少し短くなることに気がついた。 #include <iostream> #include <string> #include <boost/dynamic_bitset.hpp> int main(int, char* []) { boost::dynamic_bitset<> b1(std::string("10110011100011110000")); std::cout << b1 << std::endl; std::string s; boost::to_string(b1, s); boo</boost/dynamic_bitset.hpp></string></iostream>…

boost::dynamic_bitsetから部分ビット列を切り出す

C++

boost::dynamic_bitsetをさわったついでに、もとのビット列から部分ビット列を切り出す方法を探してみたんですが、どうも見つかりません。イテレータがあればこんな感じで書けると思うのですが。 // 注意:これはイメージです。コンパイルできません。 // も…

その3:実行時オプションと環境変数(1)

主立った実行時オプションについて説明します。 実行時オプションには(--gtest_list_testsをのぞいて)対応する環境変数があります。環境変数に値を設定しておくと、実行時オプションを指定したときと同じ効果が得られます。 オプション 環境変数 機能 --gt…

ひさしぶりにワークショップに参加

今日は午後から「最高の居場所フォーラム」に参加してきました。久々のイベント参加です。 ただ。誘われるままに参加を決めたはいいものの、ワークショップでなにをするかは知らされていなくて。こんなに身体を動かすことになるとは思ってませんでした。さっ…

会社の仕事場

会社の仕事場は、仕事をするには、一番不適な場所だと、思った。 少なくとも、いまの会社の、いまの仕事場は。

std::basic_stringで戯れる

C++

std::vectorの連結で演算子が使えない、という話題に対して。 どういう話かというと、こういうことです。 #include <iostream> #include <vector> #include <algorithm> #include <iterator> int main(int, char* []) { std::vector<int> v1; std::vector<int> v2; v1.push_back(10); v1.push_back(20); v1.pus</int></int></iterator></algorithm></vector></iostream>…

その2:アサーションの解説(1)

二種類のアサーション googletestのアサーションには大きく二種類のアサーションマクロが用意されています。 一つは評価が失敗した時点でテストを終了する、名前がASSERT_で始まるマクロ。もう一つは評価が失敗してもテストを継続する、名前がEXPECT_で始ま…

その1:基本的な使い方

最低限テストとして利用できる基本的な使い方について解説します。応用についてはおいおい。 テストを記述する テストは、関数のように見えるTESTマクロを使って記述します。 TEST(テストケース名, テスト名) { テスト本体 } 個々のテストは特に登録などの手…

その0:googletestについてのまとめ

探すとたくさんの情報があり、ドキュメントの翻訳をされているかたも少なくありませんが、自分で使うためにまとまった形にしておくと便利だと思い立ち、まとめてみることにしました。内容は“GitHub - google/googletest: Google Test”から、ドキュメントとし…