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

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

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

正規表現の使い方

正規表現の使い方を知ったので忘れないうちに。 grepっぽいの。 import System.Environment import Text.Regex grep ptn ss = [s| s <- ss, matchRegex (mkRegex ptn) s /= Nothing] main = do args <- getArgs s <- getContents mapM_ putStrLn $ grep (hea…

複数の言語で書く意義

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

C++でもFizzBuzz、ふたたび

C++

ちょっとひっかかっていたことがあって。先日Haskellで書いたFizzBuzz。この考え方のままC++に持ってこられないものか。で、書いてみました。Rangeクラスが無駄に大きくなってしまったのを除くと、意外に移し替えできた気分。 #include <iterator> #include <iostream> #include <algorithm></algorithm></iostream></iterator>…

ポリノミアルカウンタ

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

引っ込み思案も損をしないように…

仕事の話。 成果主義、競争の世の中といわれても…メンバーの人が引っ込み思案であっても損をさせないリーダーに、なりたいなと、仕事をしながら思った。 自分が引っ込み思案で、損をしているから思ったのかもしれないけど。

合計を計算

ペーストボード(クリップボード)にあるテキストの中の数値を合計してみます。プロンプトから入力します。いわゆるワンライナー? $ pbpaste | grep -Eo [0-9]+ | ruby -e 'sum = 0.0; ARGF.each{ |x| sum += x.to_f }; puts sum' もっとスマートな解法がある…

名前、大事!

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

安易に面倒なことを選択する

わたしの好きな言葉に「楽をするためには労を厭わず」というのがあります。この場合の「楽」というのは手抜きとか横着とかそういうのでなくて、うまく賢く苦労をせずにといった、そんな感じの意味です。ソフトウェア開発は複雑さとの戦いですから、いかに複…

集中力

ここ最近(この1年余り…?)集中力がなくて困っていたのだけれど。今日久々に、ひとつのことに没頭してみたら、そのあとの雑用がちゃっちゃと済んだ。充分使ったことで、脳みそも未練なく切り替えることができたのかも。脳みそを充分使ってやらないと、いつまで…

コーチング・トレーニング体験

最近コーチングに興味があり、それが長じて、コーチング・トレーニング体験に参加。参加といっても、このトレーニングは電話会議システムを使ったものなので、参加も自宅から電話するだけ。トレーニング・コーチもおっしゃっていましたが、電話を使うと聴く…

FizzBuzz

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm問題の定義が曖昧、という意見もありますが。そこんところはちょっと目をつぶって。 Haskellでこんな感じ? fizzBuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 5 == 0 = "Buzz…

移設

ココログから移設。最近はコードを書くことが多いこともあって、コードの表現力のよい方に流れた結果になりました。ぽつぽつでありながら、この2年弱の間に書いたことを読み返してみると、「いろいろ考えてるんだな、オレ」という気分になります。こんなアイ…

C++でもFizzBuzz

C++

C++なら。Boost使って変態コード(笑)。 #include <boost/lambda/lambda.hpp> #include <boost/function.hpp> #include <iostream> int main(int, char* []) { boost::function<void(int)> f[] = { (std::cout << boost::lambda::_1 << '\n'), (std::cout << boost::lambda::constant("Fizz\n")), (std::cout << boost::lambda::c</void(int)></iostream></boost/function.hpp></boost/lambda/lambda.hpp>…

RubyでもFizzBuzz

Rubyでも書いてみた。こんな感じか? (1..100).map{|x| if x%15==0 then 'FizzBuzz' elsif x%5==0 then 'Buzz' elsif x%3==0 then 'Fizz' else x end }.each {|x|puts x} Rubyが、構文を変えたLisp(構文を変えた関数型言語)と言われることがあるのが分かる気…

selectを知った

今日になって、Rubyの配列やハッシュにselectというメソッドがあるのを知った。 Rubyを使い始めて何年目。Enumerableの存在は知っていたものの、きちんと調べたことがなかったなぁ。始めて使ったselectは、こんな感じ。 Info = Struct.new(:id, :name) infos…

ゲームになった…か?

amazon:入門Haskellを参考に、判定を追加してみたものの。スコア計算をどうしたものか。困った。スマートな方法が思いついていません。以下、コード。

ゲーム画面を作る

2日ほどこねくり回してようやくゲーム画面に相当するものができた。乱数の扱いが、最初いまひとつピンとこなかったのだけれど、ようやく把握…できたと思う。 以下、コード。

位置を記憶させる

昨日は再表示すると画像が消えてしまっていたけれど、IORefを使ってポイントを覚えさせておいて、再表示のときに全てのポイントを再描画させることに成功。細かいところがいろいろ変わっているけれど気にせずに。 import Graphics.UI.GLUT import Control.Ex…

半端にOpenGLに手を出す

MonadiusがOpenGLでグラフィックを作っているのを見て、amazon:入門HaskellのさめがめをOpenGLで作り直してみようかと、中途半端にいろいろ手を出してみる。クリックしたところに八角形を表示するのができた。ウィンドウが再表示されると表示が消えてしまい…

双子素数をHaskellでも計算してみた。

HaskellのIntegerが大きい数を扱える、ということで「双子素数の大きさ、記録更新 - rubyco(るびこ)の日記」を思い出した。計算してみる。 Prelude> print $ length $ show $ 2003663613 * (2::Integer) ^ 195000 58711Haskellでも計算できた。確かに58711…

番号を振る

numbering :: [String] -> [String] numbering ss = map format $ zip [1..] ss where format (n,s) = setw 6 (show n) ++ ": " ++ s setw n s = replicate (n - length s) ' ' ++ s amazon:ふつうのHaskellプログラミングにもこの例はあるんですが、興味を…

配列っぽいビット列

C++

ちと長くなってしまった。 STLと連携できるように、イテレータも定義したいところ。 #include <limits> template<int N> class BitArray { public: typedef unsigned int ValueType; static const int BitsPerValue = std::numeric_limits<ValueType>::digits; static const int ArrayS</valuetype></int></limits>…

計算機、のパーサ、その3

どうにかここまで整理。 module Main (main) where import Text.ParserCombinators.Parsec -- 数式の要素(四則演算の演算子と整数値) data Elem = Plus | Minus | Times | Divide | Value Integer -- 後置法(逆ポーランド)で格納された要素を計算する関数 ca…

計算機、のパーサ、その2

昼休みの時間を使って中置表記のパーサを考えてみる。 まだいろいろわかってません。結構必死です(苦笑)。 expression :: Parser [Elem] expression = do { many space; t <- term; ts <- many $ try terms; many space; return $ t ++ (concat ts) } where …

計算機、のパーサ

Parsecを使ってパーサを作ってみる。今のところ単純に要素を読み出しただけ。Elemの定義は昨日と一緒。 import Text.ParserCombinators.Parsec -- 数値パーサ number :: Parser Elem number = do ds <- many1 digit return $ Value $ read ds -- 演算子パー…

計算機

最初にパーサを書くのが正当なような気がするものの。先に内部表現を書いてしまうのが「あ、やっぱりオレだ」と思う瞬間。昔、インタプリタを書いたときもそうだったっけ。 data Elem = Plus | Minus | Times | Divide | Value Int calc :: [Elem] -> Int ca…

Byte Writer

C++

今度は書き込む方。BYTEとかの定義はReaderと同じと思ってください。 同じように抽象クラス。 class Writer { public: virtual ~Writer() {} void writeByte(BYTE value) { write(value); } void writeHalf(HALF value) { writeByte(static_cast<BYTE>(value >> BI</byte>…

レビュー・レビュー・レビュー

レビュー三昧の毎日。今のプロジェクトのように、ウォーターフォール型のプロセスを踏んでソフトウェア開発をしていると(ウォーターフォールで作ってるのかよ、というツッコミは、ここでは聞き流します)、同じ時期に同じ作業が重なってしまいます。そんなわ…

Byte Reader

C++

まずは骨格になる抽象クラス。 typedef unsigned char BYTE; typedef unsigned short HALF; typedef unsigned long WORD; static const int BITS_PER_BYTE = 8; static const int BITS_PER_HALF = BITS_PER_BYTE * 2; static const int BITS_PER_WORD = BITS…

人の管理ってなんだろうね

自分自身が管理されるのが嫌いだからなのか、それとも人を管理する能が自分にないからなのか。人の管理っていったいなんだろうね、とこのところひどく思います。できるものはできるし、できないものはできない。できるとできないとのどちらに転ぶかは実践者…