« 2005年08月 | メイン | 2005年10月 »

2005年09月30日

プログラミング言語の比較(5回目)

★測定方法

以下の環境でそれぞれのプログラムを5回動かし、その平均値を測定結果とします。
また、コピー対象のファイルは、約300MBの大きさの物を使用しています。

【測定環境】
OSWindows2000 SP2
CPUPentium3 860 MHz
Memory384 MB

★実行結果

結果は、以下の通りです。

【300MBファイルコピーの実行結果(秒)】

CC++JAVA(io) JAVA(nio)
1回目38.83641.4739.37632.657
2回目38.61541.7542.93227.65
3回目39.99741.58939.88729.683
4回目38.40541.42938.85629.833
5回目39.41641.6541.07929.763
平均39.053841.577640.42629.9172

この結果は、見る人によって、予想通りであったり、意外な結果であったりすると思います。
但し、1つ注意して頂きたいのは、この結果だけで言語の優劣が決まる訳では無いと言うことです。

例えば、今回の計測対象はファイルのコピー処理その物(execute関数の実行時間)だけですが、実際にプログラムの起動から終了までの時間を計測対象にすれば結果は当然変わってきます。

プログラムについても、使用するバッファサイズを適切に設定したり、C/C++ではOSに依存した機能(標準ライブラリ以外の関数)を利用する事でも、性能向上が見込めます。
(今回は比較対象外ですが、その他にも実行モジュールのサイズ、実行中の使用メモリサイズ等、速度以外のパフォーマンスでも違いがあります。)

さらに興味のある方は、これまで示したプログラムを改良したり、他の言語によるプログラムを作成して比較を行ってみて下さい。

投稿者 Tsuda : 18:38 | コメント (0) | トラックバック

2005年09月28日

第十一回 ReBirthよ永遠に

先日プレステを購入したことを書いてから
友人が我が家にウイイレを対戦しに来るようになりました。

小学生のころ新作ゲームを買った友達の家にみんなで行ったことを思い出します。

いたストとか、スト2とか ガロデンとか~

それってつまり

よ~く考えてみると

ワタクシの人望の厚さで来ているのではなく

ただウイイレやりたいから来てるってことになりませんか?( ̄□ ̄;!!


   衝撃的な事態に気づいてしまいました...


今回は先日ソフトとしての開発が終了しフリーで使用できるようになった
ReBirthというソフトウェアシーケンサーを紹介します。
まずはReBirthって何?って方のためにアツ~ク説明をさせてください!

その昔ROLANDという楽器メーカーがTB303、TR808、TR909
という三種類のシーケンサーを世に出しました。

それは生ドラムや生ベースの音には程遠い機械的な音で全くと言っていいほど売れませんでした。

ROLANDはそれらの生産を中止し無かったことくらいに扱われていました。

しかしある時、とあるプロミュージシャンがそれらを曲に使い始めました。
そのローファイで電気的な音を聴いた他のミュージシャンたちは衝撃を受け、
プロやアマチュアまでも使用するようになりました。

TB303のウニョウニョした通称ACIDベース呼ばれる音
TR808、TR909の固いキック、荒いハイハット、クラップ等

これらの機材により音楽の持つ可能性をさらに広げるものとなりました。

しかし中古でしか入手できなくなっていたため、
市場での価格は高騰し、元々数は少ない物ですから入手が難しくなりました。


そういうわけで


その音をリーズナブルに再現できないか?ということで作られたのがReBirthです。
ReBirthにはTB303、TR909、TR808が入っています。 

わかりやすい画面構成、操作性、音の良さなどでテクノ、トランスミュージシャンに
大変使用されました。ワタクシも使用していた一人です。


そのReBirthがフリーになっているんです...

ついこの間までヤッフーとかで25000円くらいで売られていたものがですよ...


ありえないですから~!!!

  時代の進歩とは恐ろしいデス...


ダウンロードページは英語の文面ばかりで少々手間をとりますが
こんなのへっちゃらですよね!


こんなに使えるソフトが無料ですたい(T∀T)


動作も軽いですし、対応OSも多くてチョットした遊びで使っても楽しめます。
もちろん本格的な曲作りにも使えます。ガンガン使い倒しましょう。

ReBirthのあるページ→ The ReBirth Museum

がお!

投稿者 Tsuda : 11:25 | コメント (0) | トラックバック

2005年09月27日

プログラミング言語の比較(4回目)

★JAVAで作成2(nioパッケージ利用)

JAVAではバージョン1.4から、NIOパッケージ(New I/O)が加えられました。
以下のプログラムは、その機能を利用したバージョンです。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopyByJava2 {
	public void execute(String src, String dest) throws IOException {
		FileInputStream in = null;
		FileOutputStream out = null;
		try {
			// ファイルのオープン
			in = new FileInputStream(src);
			out = new FileOutputStream(dest);
			
			// コピー準備
			FileChannel cIn = in.getChannel();
			FileChannel cOut = out.getChannel();

			// コピー実行
			cIn.transferTo(0, cIn.size(), cOut);
		}
		finally {
			// ファイルクローズ
			try {
				if(in != null) {
					in.close();
				}
			}
			catch(IOException e) {
			}
			try {
				if(out != null) {
					out.close();
				}
			}
			catch(IOException e) {
			}
		}
	}
	
	public static void main(String[] args) {
		if(args.length < 2) {
			System.out.println("java CopyByJava2 [コピー元ファイルパス] [コピー先ファイルパス]");
			return;
		}
		else if(args[0].equals(args[1])) {
			System.out.println("コピー元とコピー先が同じです。");
			return;
		}
		
		long start = System.currentTimeMillis();
		try {
			new CopyByJava2().execute(args[0], args[1]);
		}
		catch(IOException e) {
			e.printStackTrace();
			return;
		}
		long end = System.currentTimeMillis();
		System.out.println((end - start)/1000.0 + " 秒経過");
	}
}

JAVA(ioパッケージ利用)と殆ど同じですが、FileChannelクラスが登場しています。
このFileChannelクラスはNIOで提供される機能の一つです。そして、NIOは主に(速度的な)パフォーマンスを上げる事を目的に導入されました。
実際にパフォーマンス上の利点があるのでしょうか?その事を調べる目的も込めて比較対象に加えています。

次回は、これまでに挙げた4種類のプログラムを使用して、実際に測定をしてみましょう。

投稿者 Tsuda : 16:18 | コメント (0) | トラックバック

2005年09月26日

プログラミング言語の比較(3回目)

★JAVAで作成1(ioパッケージ利用)

JAVAでは、2通りの方法でファイルコピーを行えます。今回はその内の1つである、ioパッケージ利用編です。
JAVAのバージョンは1.4を使用します。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyByJava1 {
	public void execute(String src, String dest) throws IOException {
		int buffer_size = 2048;
		byte[] buffer = new byte[buffer_size];
		
		InputStream in = null;
		OutputStream out = null;
		try {
			// ファイルのオープン & ストリームのバッファサイズ指定
			in = new BufferedInputStream(new FileInputStream(src), buffer_size);
			out = new BufferedOutputStream(new FileOutputStream(dest), buffer_size);
			
			// コピー実行
			int readsize;
			while((readsize = in.read(buffer)) != -1) {
				out.write(buffer, 0, readsize);
			}
		}
		finally {
			// ファイルクローズ
			try {
				if(in != null) {
					in.close();
				}
			}
			catch(IOException e) {
			}
			try {
				if(out != null) {
					out.close();
				}
			}
			catch(IOException e) {
			}
		}
	}
	
	public static void main(String[] args) {
		if(args.length < 2) {
			System.out.println("java CopyByJava1 [コピー元ファイルパス] [コピー先ファイルパス]");
			return;
		}
		else if(args[0].equals(args[1])) {
			System.out.println("コピー元とコピー先が同じです。");
			return;
		}
		
		long start = System.currentTimeMillis();
		try {
			new CopyByJava1().execute(args[0], args[1]);
		}
		catch(IOException e) {
			e.printStackTrace();
			return;
		}
		long end = System.currentTimeMillis();
		System.out.println((end - start)/1000.0 + " 秒経過");
	}
}

前回と同じく、以下の項目をちょっとだけ見てみましょう。

▽クラス
クラスが登場する点はC++と同じです。但し、自作しているCopyByJava1クラスがあります。
JAVAは単独でメソッド(C/C++における関数のこと)が存在出来ません。
必ず、クラスのメンバーとしてメソッドが存在します。このルールは mainメソッドにも当てはまる為、最低でも1つのクラスが必要になります。

▽例外処理機構
try-catchは同じです。但し、JAVAではfinallyが存在します。
tryブロックに処理が入った場合、例外の発生有無に関らず、必ずfinallyブロックを通ります。
処理が成功・失敗のいずれであっても、行う処理が有る場合にfinallyを用います。

▽リソースの解放
JAVAではC++と同じくクラスが登場する事は、先ほど説明しました。
では何故、C++で必要の無かったファイルのクローズを行っているのでしょう?
JAVAにはデストラクタが無いのでしょうか?それともFileInputStreamやFileOutputStreamクラスのデストラクタでは自動的にファイルをクローズしてくれないのでしょうか?
答えは否です。デストラクタに相当する物(finalizeメソッド)も有りますし、該当クラスのfinalizeメソッドでファイルのクローズも行われます。
JAVAでは、C/C++に無い機能としてガーベッジコレクションがあります。これにより、動的に確保したメモリ(上に構築されたクラス)の解放はプログラマが意識する必要が無いので、プログラマとしては非常に助かります。
しかし、ファイルディスクプリタやソケットなどの非メモリ・リソースはこの対象外であり、これらは(finalizeメソッドの中で処理すれば)メモリ回収のついでとして解 放されるだけです。
つまり、メモリ・リソースが潤沢に存在しても、非メモリ・リソースの不足が発生する可能性があります。この様な状態を極力起さない為には、プログラマが責任を持っ て非メモリ・リソースの解放を行う事が必要になります。(その為に、先のfinallyを利用してファイルクローズを行っています)

次回は、もう1つのJAVAである、nioパッケージ利用編です。

投稿者 Tsuda : 16:30 | コメント (0) | トラックバック

2005年09月25日

プログラミング言語の比較(2回目)

★C++で作成 今回はC++ですね。
かなり間が空いてしまったので、早速行きましょう。
#include 
#include 
#include 
#include 

using namespace std;

void execute(char* src, char* dest) throw (ios_base::failure) {
	const int buffer_size = 2048;
	char buffer[buffer_size];
	// ファイルオープン
	ifstream in(src, ios_base::in | ios_base::binary);
	if(!in.is_open()) {
		throw ios_base::failure(src);
	}
	ofstream out(dest, ios_base::out |
			ios_base::binary | ios_base::trunc);
	if(!out.is_open()) {
		throw ios_base::failure(dest);
	}
	
	// ストリームのバッファサイズ指定
	in.rdbuf()->pubsetbuf(0, buffer_size);
	out.rdbuf()->pubsetbuf(0, buffer_size);
	
	// コピー実行
	out << in.rdbuf();
}

int main(int argc, char** args) {
	if(argc < 3) {
		cout << args[0] << " [コピー元ファイルパス] [コピー先ファイルパス]" << endl;
		return 0;
	}
	else if(!strcmp(args[1], args[2])) {
		cout << "コピー元とコピー先が同じです。" << endl;
		return 1;
	}
	
	int start = clock();
	try {
		execute(args[1], args[2]);
	}
	catch(const ios_base::failure& e) {
		cout << e.what() << " ファイルが見つかりません。" << endl;
		return 1;
	}
	int end = clock();
	cout << (end - start)/1000.0 << " 秒経過" << endl;
	
	return 0;
}
関数の構成・処理順序は、他の言語で作成した物と比べ易いように極力似せて作っています。
但し、そうは言っても違う所は当然あるので、以下の項目をちょっとだけ見てみましょう。(CとC++の違いを全て説明すると趣旨が曖昧になるので、C++に関して詳しく知りたければ、こちらへ) ▽例外処理機構
main関数から execute関数を呼び出す前後にtry-catch文、execute関数ではthrow文があります。これが例外処理機構です。
例外処理機構では、エラーが発生した場合、エラー発生箇所からエラー処理部分まで一気に処理を移す事が可能です。
(これにより、処理成否を判定するif文のネストや、エラー処理部分まで処理を飛ばす為のgoto文を削減する事が出来ます)

▽演算子のオーバーロード
ファイルのコピーを以下の1行で行っています。
  out << in.rdbuf();
CやJAVAしか知らない状態で見ると、シフト演算を行っているかのように見えますが、C++では演算子のオーバーロードが可能な為、これでコピーが行われます。
実際には以下の記述と同義です。
  out.operator<<(in.rdbuf());
オーバーロードは、直感的な判り易さを与えます。この例では、「inの内容をoutに入れる(コピーする)」と言った所でしょうか。

▽リソースの解放
さて、Cのプログラムと見比べると、ファイルをクローズする処理がありません。一体、どうなっているのでしょうか?
C++ではクラスと呼ばれるデータ構造が登場します。ファイル操作をしている、ifstreamやofstreamもクラスです。
さらに、クラスにはデストラクタと呼ばれる、メモリ上に構築されたクラスが破棄される直前に実行される(メンバ)関数があります。
ifstreamやofstreamクラスのデストラクタでは、開いているファイルをクローズする処理が行われるので、このクラスを使用した場合、プログラマによる明示的なクロー ズは不要です。(auto変数でない場合、クラス自体の明示的な削除が必要になるのですが、それに付いての説明は割愛します)

次回は、JAVAです。

投稿者 Tsuda : 23:09 | コメント (0) | トラックバック

2005年09月15日

菊花賞

2002年8月19日午前11時、日本競馬界の巨星が墜ちました。

日本のサラブレットの血統地図を塗り替えた、スーパーサイアー・サンデーサイレンスが蹄葉炎による衰弱性心不全のため16歳で死亡したのです。

サンデーサイレンスは初年度産駒からG1馬を輩出し、今もなお、産駒は大活躍しています。
今年の2歳世代がラストクロップということで、ファンの注目度はかなり高いでしょう。
また、孫世代の活躍も目立つところです。

・・・・・・サンデーサイレンスの冥福を祈ります・・・・・・


今年のクラシック競走はサンデーサイレンスの勝利といっても良いかも知れません。

桜花賞ではラインクラフト(母父サンデーサイレンス)が優勝。
オークスではシーザリオ(父父サンデーサイレンス)が優勝。
皐月賞とダービーではディープインパクト(父サンデーサイレンス)が優勝しました。

そして秋になり、残すクラシック競走は菊花賞のみとなりました。

今年は無敗の2冠馬・ディープインパクトが登場し、圧倒的な強さを見せ付けています。

皐月賞ではスタートで躓き、あわや落馬・・・という状態から、最後の直線で大外に持ち出し、強烈な末足を見せつけて楽勝しました。
ダービーでは当然のように1.1倍という圧倒的な人気を背負い、直線で大外に持ち出し、またも強烈過ぎる末足を炸裂させ、最内で粘るインティライミ(父スペシャルウィーク)を抜き去り、5馬身差での楽勝でした。

そして、クラシック3冠最後の菊花賞を前にして、最大のライバルと目されていたインティライミ(ダービー2着)が故障のため戦線を離脱し、最早3冠馬の誕生は決まったようなものになっています。

しかし、以前は堅い(決着)と言われていた菊花賞も、近年では大荒れ続きです。
昨年は1番人気のハーツクライ(父サンデーサイレンス)や、地方競馬の雄・コスモバルク(父ザグレブ)らを退けて、8番人気のデルタブルース(父ダンスインザダーク)が優勝。
一昨年は2冠馬・ネオユニヴァース(父サンデーサイレンス)が、5番人気のザッツザプレンティ(父ダンスインザダーク)に敗れて3着。
3年前は1番人気の皐月賞馬・ノーリーズン(父ブライアンズタイム)が、スタート直後に落馬で競走中止、優勝は10番人気のヒシミラクル(父サッカーボーイ)でした。

今年も絶対とは言い切れません。
(「競馬に絶対は無い」と言われています。)

さて、今週・来週には菊花賞トライアル(上位3着までの馬に菊花賞への優先出走権が与えられる)が有ります。
通常は本賞金の上位から出走権を得ますが、トライアルで3着以内になれば、賞金が足りない馬でも菊花賞への出走が出来ます。
(外国産馬や地方競馬所属馬はその限りでは有りませんが)
ここぞとばかりに賞金の足りない実力馬が出てきます。
大抵は少ない賞金に納得してしまうような馬なのですが、稀に素晴らしい実力馬が居たりします。
このトライアルレースで真価を発揮し、対・ディープインパクトの新勢力が出てくるのでしょうか?

今後も楽しみです。


※ G1レースとは、グレードが一番のレースのことです。(細かくは、更に「格」が有るようです)
※ クラシック競走とは、桜花賞、皐月賞、オークス、ダービー、菊花賞の5つのG1レースのことです。
※ 桜花賞とオークスは牝馬のみのレースです。(牡=オス、牝=メス)
※ 母父=母の父、父父=父の父、どちらも人間で言えば祖父。
※ ダンスインザダーク、スペシャルウィークの父はサンデーサイレンス

投稿者 Tsuda : 17:30 | コメント (0) | トラックバック

2005年09月09日

第十回 まじめなお話 ~CD屋での出来事~

猫でもできる音楽製作なんとぉ!
連載第十回目迎えました。

ピカッ!!

まさか書いている本人もこんなに続くと思いませんでした。
すべて、皆様方のご協力があってのことです。
十回記念なので特別なことをやろうと思っちゃたりしました。

が…

十回記念にふさわしいネタが見つかりません!
( ̄◇ ̄;)ガビーン!

上記の理由から、ワタクシが体験した中古CD屋での出来事を書きます。
ちなみに怖い話ではありません。(いちよ)

STEELY DANのレコードを探しに地元に昔からのある中古CD屋に寄ったときの話です。
その店内はたくさんのCDやらレコードがあるのですが、
なんと、AJAとGauchoのレコード盤を発見してしまいましたー!

これはFFのオニオンソードなみに手に入れなければ!

と思い少々興奮しながら会計にもっていくと、会計のおじいさんが
「若いのにスティーリダンを聴くなんて音楽をわかっているね。」
と声をかけてきました。

ん?

何?何?

ワタクシは少々驚き。
「ジャケが大きいからレコード盤も欲しいと思ったんです。」
と、なんてまぬけな回答。

おじいさん「レコードプレイヤーは持っているのかい?」
「いいえ、もっていません。」
おじいさん「レコードとCDでは音質は全然違うんだよ。試しにかけてあげるよ。」
と言い、今購入したAJAのレコードを店内で再生してくれました。

…..

正直、その音に驚きました。
確かにいわゆるハイ落ちしたような音なのですが、音の温かさ、低音域のスームズな再生、ブラスの響き...

「レコードの音は温かいというのはこういうことなんだなぁ」
と我ながら感心しました。

その後も少しお話したのですが、最後におじいさんが
「我々が今の若い世代にこういう音楽を伝えられないのは残念。」
と少し重い口調で話していました。

この話を聴き、自分も何か非力ながら力になることができるのではないか?
と思いまして、今回この場を借りて書いた次第でアリマース ♪( ´▽`)

AJAとGauchoについては第七回で紹介しているのでそちらをご覧ください。
記念に部屋で写真とっちゃいました。

イメージ 1

投稿者 Tsuda : 18:37 | コメント (0) | トラックバック

2005年09月04日

第九回 猫的作曲錬金術 その3 ~曲作りにつまったら?~

今年も夏がおわりですね~
夏といえば、海やら~ 山やら~ 水着やら~ なのです

が!

今年は夏らしいこと何もしていないの~
( i _ i )

つーことで先日急遽日帰りで友人と伊豆にいってきました~ぁ

温泉に入ることくらいしか目的もなく出かけたのですが、
途中で面白い博物館見かけましたよ。
その名も

怪しい少年少女博物館

自ら「怪しい」とつけるだけあって怪しすぎる建物(あたりまえか)

パンフレットを見てみると、
そこには...

ときメモのフィギア、パチンコ台、ロボット、等々
パンフレットを見ただけで全員お腹いっぱいになりました。
今回はあまりの怪しさゆえに全員撤退を余儀なくされましたが、
是非次回はいってみたいっす。興味のある方はググッてみてください!

では、本題に入ります。

曲作りにつまったらどうするか?ということを書かしてください。
曲を作っているとつまってしまうことがありますよね。
そういうときあなたならどうします?

おすすめな方法なのはズバリ!
二曲同時に作ってしまうことです。

この方法のメリットとしては別の曲に取り組むことにより
うまくいけば二曲同時に完成してしまうこと。

先程の曲でいいアイデアが思いついたのだけれども、
この曲にはあわないなぁ~と思って破棄したアイデアが使えること

おまけに時間の節約になることがあります。

ちなみにこの方法はプロの方もよく行うそうです。
すごいお方になると10曲同時とか...
!?(・_・;?

人間業ではないですから!!!

とてもおすすめなので、皆様も是非ためしてください。

でもど~しても無理ならワタクシの場合は映画を見ます。
下妻物語、ミニミニ大作戦、イノセンスなどなど
しょっちゅ~見てますよ~。
ペコリ

投稿者 Tsuda : 23:57 | コメント (0) | トラックバック