goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

かたつむり型(というかアンモナイト型)のPCケースが発売

2006-09-06 22:14:08 | Weblog

うーん、これって、どーなの。。。
ここのニュース
かたつむり型のLian-Li製タワー型PCケースが発売
http://www.watch.impress.co.jp/akiba/hotline/20060902/etc_pc777.html


そこに写真が出てるんですけど、たしかに
かたつむり型。。。つーか、アンモナイトですな(^^;)

でも、うしろに小さく見えるほかのケースとくらべると。。
これ、すごく、大きいとおもうんですけどお。。

会社におくには、ちょっと反対意見の人が多そうな気が(^^;)
いや、会社の受付においたら、かっこいいかも。。。かあ??


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Javaの入出力:ファイル入力について、3通りの方法

2006-09-06 17:25:37 | JavaとWeb

 Javaについて、いままで、基本処理について書いてきたので、

 今度は入出力について、まとめてみたいと思います。

 まず、ファイル、それも入力について。



■ファイル入力の方針
 ファイルには、可変長、固定長などありますが、可変長の読み方について、代表的なものをまとめたあと、そのほかの読み方についてまとめたいと思います。

●可変長ファイルの入力方法は、大きく3通りある。

1.ファイル全体を一気に読み込む
 →XMLのDOMやイメージファイルなど、最後まで分からないと
  処理できないようなケースでよく行う
 →低レベルIO処理を行えばよいことが多い
  (Cではreadで行う)

2.1バイトずつよんでくる
 字句解釈が必要な場合など、1バイトごとに読み込み、判断が必要な
場合で使うことが多い。
(Cでは、いわゆるintのc(*注)によるfgetc等で行う。
 このintのcと、エヴァでいうintのcと同じかどうか不明)

3.1行ずつ読んでくる
 1レコード1行になっている場合(CSVなどで、これが多い)で
よく行う(cではfgetsで行う)

●そして、可変長以外では、以下の方法もある(上記の方法もある)
4.フォーマットが決まっているとき、Cでは、fscanfでとってくることある。

5.レコードが固定長の場合は、
 read(バッファ、オフセット、バッファの大きさ)
で、とってくることもある。

●今回は、1,2,3について説明します。
Javaで4はしない(そもそも、ないかも?)と思います。
5は、3のreadをread(char[] cbuf, int offset, int length)
にしてください



■ファイル入力の方法

●ファイル全体を一気に読み込む
 Fileクラスでファイルの大きさを取得、その大きさのバイト配列を用意します
 その後、FileInputStreamで一気に読み込みます。

●ファイルを1バイトずつ読む
 FileInputStream、InputStreamReader、BufferedReaderの3点セットで
 入力のストリームを用意します。
 そして、BufferedReaderのread()で、1文字づつ読み込みます。
 このとき、Cでいう、intのcと同じなので、EOFを受け取るには、(charでなく)
 intのcにしてください。

 なお、BufferedReaderは、効率化してるだけなので、
 FileInputStream、InputStreamReaderの2つでも読み込むことは可能です。

●1行ずつ読んでくる
 FileInputStream、InputStreamReader、BufferedReaderの3点セットで
 入力のストリームを用意します。

 そして、BufferedReaderのreadLine()で、1行づつ読み込みます。

 行末の改行は、カットされてはいってきます。
 なお、InputStreamReaderにreadLineはないので、これは、3点セットでないと
できません。

 なお、なぜ、3点セットなのか、1つでいいじゃん!という話は、
別の入出力を説明しないと説明できないので、別の機会にします。
ここのDecoratorにヒントは書いてあるけど)




■サンプルプログラム
csv.txtというファイルを、
・ファイル全体を一気に読み込む
・ファイルを1バイトずつ読む(3点セット)
・1行ずつ読んでくる
・ファイルを1バイトずつ読む(BufferedReaderを使わない)

で、読み込みます。
import java.util.*;
import java.io.*;

public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) 
	{
		String fname = "test.txt";	//	読み込みファイル
		try
		{
			//==============================//
			//	いっぺんに読み込む     //
			//==============================//
			File f = new File(fname);
			byte[] b = new byte[(int) f.length()];
			FileInputStream fi = new FileInputStream(f);

			//	読み込みreadで一気に読み込む
			String	s;
			fi.read(b);	
			s = new String(b);
			
			//	クローズ処理
			fi.close();
			System.out.println("いっぺんに読み込んでみた");
			System.out.print(s);					


			//==============================//
			//	1バイトずつ読み込む   //
			//==============================//
			FileInputStream 	fi2 = new FileInputStream(fname);
			InputStreamReader 	ir2	= new InputStreamReader(fi2);
			BufferedReader 		br2	= new BufferedReader(ir2);

			//	読み込み
			int	c;	//	いわゆるintのc
			System.out.println("1バイトずつ読込");
			while((c = br2.read()) != -1)
			{
				System.out.print((char)c);
			}
			
			//	クローズ処理
			fi2.close();
			ir2.close();
			br2.close();

			//==============================//
			//1byteずつのときはbrなくてもOK//
			//==============================//
			FileInputStream 	fi22 = new FileInputStream(fname);
			InputStreamReader 	ir22 = new InputStreamReader(fi22);

			//	読み込み
			int	c2;	//	いわゆるintのc
			System.out.println("1バイトずつbrなしず読込");
			while((c2 = ir22.read()) != -1)
			{
				System.out.print((char)c2);
			}
			
			//	クローズ処理
			fi22.close();
			ir22.close();

			//==============================//
			//	1行ずつ読み込む	    //
			//==============================//
			FileInputStream 	fi3 = new FileInputStream(fname);
			InputStreamReader 	ir3	= new InputStreamReader(fi3);
			BufferedReader 		br3	= new BufferedReader(ir3);

			//	読み込み
			System.out.println("一行ずつ読む");
			String line;
			while((line=br3.readLine()) != null)
			{
				//改行がカットされてるので、printlnになる。
				System.out.println(line);
			}
			
			//	クローズ処理
			fi3.close();
			ir3.close();
			br3.close();

			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}	
	}

}

(上記< > ¥は、本当は半角です)

とこんなかんじです。



*注 (ここで言っている)intのc(エヴァのものと、一緒かはわかりません)

 getcは、返り値はcharではなく、intである。
 これは、文字が0x00から0xFFまでありえるため、charやbyteにしてしまうと
EOF(-1)の0xFFなのか、文字に0xFFがたっているのか
分からない。そこで、intにして、EOFだと-1がかえるようにしている。

 しかし、内容的には、入ってくるのはcharである。

 そのため、ハンガリアン記法の例外として、intでとっておきながら、(ならハンガリアン記法ではiなのに)c(キャラクタ)が入ることを明示する。この手法、つまり、

int c;
while((c = getc(fp)) != EOF)
{

}
の一連の処理をintのcというと思います(少なくともウィリアムのいたずらはこの言葉を普通に使ってきたし、intのcをこれ以外の意味で使ったことはない)。

 ただ、これ、このブログに当たり前のことと思って書いたら、以前のブログで、エヴァの箇所に関しては批判があったので、エヴァに関しては違うのかなあ?

 ちなみに、現在はintのcを行う場合、上記1の方法、すなわち全文とってくるのが普通なので、intのcでやる理由を明示しておくのも、(それこそエヴァみたいに)悪くないとおもいますけど、コメントに、そんなことまで書いたら、長くなっちゃうよね。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

結局、仕様は入出力と、その「のりしろ」部分の基本処理に、まとめられる

2006-09-06 13:08:08 | 開発ネタ

 以前から、ユーザーと、システム開発者が、共通に理解できる最小単位の機能で仕様を書けば、理解間のギャップが無いし、自動化の可能性が高まるという話を書いてきた。

 で、その「共通に理解できる最小単位の機能」とは、ユーザーがわから見ると、産能大記号で表されるものであり、システム開発者がわから見ると、「外部入出力」と「内部処理」である。
 そして、外部入出力って言うのは。。。
   帳票出力とか
   ファイル出力とか
   DB出力とか
   メール出力とか。。
   (FAX出力とか。。。??)
 いろいろあって、

 基本的な処理方法は、
 ・エディッティング/フォーマッティング
   ・数字の表現
   ・日付、時間の表現
   ・文字列操作
 ・四則演算、計算
 ・分類(仕分け)
 ・ソート
 ・マージ
 ・チェッキング
 だと、書いてきた(ここにまとめ)




じゃあ、本当に、産能大記号は、それら、入出力と基本処理で書き表せるのか?ということについてしめそう。以下斜体は、産能大記号である。

新しい帳票を用意する
 これは、入出力の帳票(画面のケースもある)である。

記入・押印する
 出力した帳票に記入押印する場合、どこかの画面でその情報を入力する。
 画面から直接入力するケースも考えられる。
 どちらの場合も、入出力の画面である。

図示の省略
 処理を省略する記号なので、どの処理とは言い切れないが、基本処理の組み合わせの省略である。

集める
 集めるまでは、基本処理の「分類」処理のレコード表現形式にすることを意味する。
 ただし、このデータは、メモリ上にあることもあるが、
 入出力のファイル、DB(に限らない。とにかく入出力)を使って集めることもある

仕分け・分類する
 基本処理の「分類」そのものである

二つ以上の部・課・係に分ける
 基本処理の「分類」そのものである
 コンピューターの世界では課にまたがるかどうかというのはあんまし関係ない。

会議・面談・電話
 「会議・面談」については、
 ここでいってるのは、テレビ会議システムっていう話ではなく、
 その会議に必要な資料の出力と、議事録などのデータ入力となる。
 資料出力は入出力の帳票であり、議事録は、ファイルまたは画面入力となる。

 「電話」については後述の電話連絡に相当する
 

一時保管の帳票を取り出す
 実際には、帳票の元となるデータをとりだすことになり、
 入出力のファイルか、DBの操作となる。

承認・受領印を押す
 入出力の画面から、データを入力し、基本処理で加工し、
 入出力のファイル、DBに書き出すということになる。

参照・検索
 基本操作のチェッキングにあたる。

キーイン
 入出力の画面にあたる

プリントアウト
 入出力の帳票にあたる

ファックス
 入出力のFAXにあたる。。。
 がJavaではないとおもうので、もしやるとすると、デバイスドライバのSDKに
 たいして、ネイティブで操作するか、
 デバイスドライバ操作を、ソケット通信でできるようなラッパーをつくって
 そのラッパーに対して入出力のソケット間通信を行うことになる。

 なお、入出力のメールや、HTTP通信、ソケット通信、DB、ファイルで
 間に合ってしまうこともある。

コピー
 システム内にないデータをコピーする場合は、コピー機を使うので関係ない
 システム内にあるデータの場合は、入出力の帳票にあたる。

オフコン
 これは、特定の処理をあわらすものではない。

パソコン
 これは、特定の処理をあわらすものではない。

マシン使用
 処理をする一般論であり、特定の処理をあわらすものではない。

作業を表す基本形
 処理をする一般論であり、特定の処理をあわらすものではない。

郵送
 入出力の帳票で、宛名や中身を出力することを表すか、
 入出力のメール、ソケット、HTTP通信を表す
 それ以外は、一般に人手で行う。

運ぶ
 入出力のファイル、DBに書き出すか、
 入出力のメール、ソケット、HTTP通信を表す
 それ以外は、一般に人手で行う。

受取る
 入出力で、メール、ソケット、HTTP通信で来た場合、
 入出力のファイル、DBをつかって書き出す

一時保管
 入出力のファイル、DBをつかって書き出す

破棄する
 入出力のファイル、DBを削除する
 それ以外は、一般に人手で行う。

内容の検査
 基本操作のチェッキングにあたる

量の検査
 基本操作のチェッキングにあたる

伝票の流れ線
 流れを示すものであり、特定の処理をあわらすものではない。

現品・現金の移動線
 流れを示すものであり、特定の処理をあわらすものではない。

運搬の基本形
 処理をする一般論であり、特定の処理をあわらすものではない。
 なお、運搬のように、距離的にはなれているものは、通信を、
 保管のように時間的にはなれているものは、永続性のあるもの*
 の入出力を使う。2つあわせて使うことも多い

 *永続性のあるもの:コンピューターの電源を切っても
  データが、なくならないもの
  ファイル、DBなど

新たに使用する帳票
 入出力の帳票に関係する

2度目以降使用する帳票
 入出力の帳票に関係する

現品
 入出力の対象物を表記する物であり、特定の処理をあわらすものではない。

現金
 入出力の対象物を表記する物であり、特定の処理をあわらすものではない。

ディスプレイ
 入出力の画面に当たる

ドキュメント
 入出力の帳票に当たる

電話連絡
 前述のファックスの記述中、
 ファックスを電話に書き換えたものに相当する

面談・会談
 前述の会議・面談・電話に相当する




 というわけで、ほとんどの処理は、入出力がらみであり、それに対して、基本機能を使った処理加工が(のりしろのように)入るという感じになる。

 しかし、実際の開発では、基本機能だけで全てを書くのは大変である
 たとえば、「形態素解析をせよ」というとき、基本機能で記述するのは大変である。
 そこで、決まった処理をライブラリ化(サブルーチン化、モジュール化、コンポーネント化いいかたはなんでもいいけど)するわけなんだけど、このライブラリ化する過程で、問題が起こる。

 そんな話と、ライブラリの典型的な形(入出力と内部表現の違いによるフォーマット変換、高度な内容のために中身を隠したい場合、共通処理)とその注意点について、気が向いたら、いつか書きます。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

iPodでカラオケ!より、ケータイでカラオケのほうが。。。

2006-09-06 10:56:16 | Weblog

ここのブログ
「doPi iPod adapter」:iPodでカラオケ!
http://www.gizmodo.jp/2006/09/dopi_ipod_adapteripod.html

によると(以下斜体は上記ブログより引用)

「doPi iPod adapter」は、iPod用のカラオケ。doPiのサーバーからMPEG-4のデータをダウンロードして自分のiPodに入れるとい仕組み。再生するとiPodの画面に歌詞がでます。

この製品にはマイクがついていて、iPodと接続して使うようになっているのですが…ACアダプターも必要で、だから屋外で楽しむことができません。そのせいでiPodのポータブル性が損なわれているのが残念です。


うーん、そこまで必要か???

ケータイで動画を送るようになったら、同じようにケータイでカラオケって出てきたりして。。。
(ヘッドフォンのかわりに、スピーカーをつなぐのかなあ??)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする