[[Lecture]]

[[LectureOld]]

#contents


*メディア創造論 2013年集中講義(北陸先端大) [#a4c28c23]

**授業資料 [#g5c2ec35]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c10.ppt.pdf

**試験問題(予定) Exam Question [#h4849517]

-身の回りの環境や日用品の機能を計算機により増幅するアイディア
-または,身につけたコンピュータにより人の活動を支援するアイディアを考案せよ.
--アイディアの新規性の他に,実装方法の面白さがあればそれも評価するので,その場合は実現方法についても簡単に述べよ

-Propose an idea that 
--Augment everyday-environment or everyday-things by ubiquitous computers, or
--Support everyday human activities by wearable computers.
&br;(Besides novelty of your idea, state your implementation method. )





*マルチメディアプログラミング実習 2012年度前期 [#c97dd298]


**欠席状況 [#a94b5cf3]

3/4以上出席してください。(欠席は3回まで)

|学籍番号|欠席回数|判定|
|1120501|3||
|1120502|1||
|1120515|1||
|1120517|1||
|1120529|1||
|1120534|1||
|1120535|3||
|1120537|2||
|1120539|3||
|1120540|1||
|1120541|取消||
|1120542|2||
|0820510|11|不可|

**講義予定 [#q1d06d33]

|月日|内容|
|10/4|第1,2章|
|10/11||
|10/18||
|10/25|椎尾海外出張のため休講|
|11/1|学会研究会のため休講|
|11/8||
|11/15||
|11/22||
|11/29|創立記念日|
|12/6|椎尾学会出張のため休講|
|12/13||
|12/20||
|12/25|木曜授業の日だそうですので授業実施します|
|1/10||
|1/17||
|1/24||
|1/31|大学院入試のため休講|


**javaのマニュアル [#a7c8103d]

//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html

//http://java.sun.com/javase/ja/6/docs/ja/api/index.html

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html

http://docs.oracle.com/javase/jp/6/api/



*マルチメディアプログラミングの最終課題 [#me75bca7]

-課題:お絵描きプログラムを作成してさらに取扱説明書を作成して2月1日までに提出すること
--この課題のヒントは SimpleDraw をみてください。


** 提出課題として最低やってほしいこと [#k3dc5bb4]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

** 機能拡張:以下のことができれば加点します [#j3d44126]

-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(パレット)などを使って使いやすくする
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

機能拡張の詳細はSimpleDrawの

-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra

を見てください。SimpleDrawのページでは、

-機能の拡充
-使いやすさの追求

の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。
説明書に、工夫したところを書いておいてください。


** 取扱説明書の作り方 [#qe1de3ea]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます
--以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。
--もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。
-がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。


** 出来上がったプログラムの提出方法 [#j6cb7dba]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)+必要ならばバージョン番号の数字」にしてください。
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつてください)

** 締切 [#b276ed4e]
-締め切りは2月1日とします
--この日までに提出してください
//--どうしてもそのあともがんばりたい人は7月12日の11:59pmまでにsiio@mac.comまでメール添付で提出してください
//--可能な限り差し替えます(見落とす可能性がありますので保証はできません)




**2013年1月10日 [#l729849f]


***今日の提出課題 [#z8dc61fa]
一筆書きを解消したプロジェクトファイル(~Documents/workspace/SimpleDraw)を
複製してフォルダ名を「ファイル名+学生名」にしてzipで圧縮して提出してください。

***Eclipseを使ってみよう [#q4984603]

http://is.ocha.ac.jp/~siio/gyazo/4383db7fb81f9eacbf5cc959ff77a33d.png



***Eclipseの警告を消す方法 [#o4cf5a8b]

 	private static final long serialVersionUID = 42L;

という変数を定義しておきます。


**(演習課題1)上のお絵描きプログラムを改良してください [#f8a7868e]

+下のプログラムでは、マウスポインターの位置と、描かれる線の位置がずれています。直してください。
+下のプログラムでは,描画するとゴミが出ます.
(前回描き終わった場所から線が引けてしまって、一筆書き状態になっています)
これを出ないように改良してください.

一筆書きを解消するヒント

-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimplementします
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/event/MouseListener.html
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/event/MouseListener.html




*** 線を引く簡単なプログラム [#d0d54112]

JPanelのサブクラスを作りました。

 import javax.swing.JPanel;
 import java.awt.Graphics;
 
 public class DrawPanel extends JPanel {
 
 	public void drawLine(int x1, int y1, int x2, int y2){
 		Graphics g = this.getGraphics();
 		g.drawLine(x1, y1, x2, y2);
 	}
  }
 

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。
リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

 
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionListener;
 
 import javax.swing.JFrame;
 
 public class SimpleDraw extends JFrame implements MouseMotionListener {
 
 	int lastx=0, lasty=0, newx, newy;
 	DrawPanel panel;
  
 
 	public void mouseMoved(MouseEvent arg0) {
        }
 
 	public void mouseDragged(MouseEvent arg0) {
 		newx=arg0.getX();
 		newy=arg0.getY();
 		panel.drawLine(lastx,lasty,newx,newy);
 		lastx=newx;
 		lasty=newy;
 	}
 
 
 	private void init() {
 		this.setTitle("Simple Draw");
 		this.setSize(300, 200);
 		this.addMouseMotionListener(this);
 		panel=new DrawPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleDraw frame=new SimpleDraw();
 		frame.init();
 	}
 
 }
 



***マウスイベント [#v734787a]

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。
以下のようにするとイベントをうけとれるます。

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{
 	
 	public void mouseClicked(MouseEvent e) {
 		System.out.println("mouse clicked!");
 	}
 	public void mouseEntered(MouseEvent e) {
 		System.out.println("mouse entered!");
 	}
 	public void mouseExited(MouseEvent e) {
 		System.out.println("mouse exited!");
 	}
 	public void mousePressed(MouseEvent e) {
 		System.out.println("mouse pressed!");
 	}
 	public void mouseReleased(MouseEvent e) {
 		System.out.println("mouse released!");
 	}
 	public void mouseDragged(MouseEvent e) {
 		System.out.println("mouse dragged!");
 	}
 	public void mouseMoved(MouseEvent e) {
 		System.out.println("mouse moved!");
 	}
 	
 	public static void main(String[] args) {
 		MouseTest test = new MouseTest();
 		test.setTitle("MouseTest");
 		test.addMouseListener(test);
 		test.addMouseMotionListener(test);
 		test.setSize(400,300);
 		test.setVisible(true);
 		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 }




***サウンドファイルを再生する [#k347fd75]

-以下のファイルをダウンロードしてください。

http://is.ocha.ac.jp/~siio/lecture/Sounds/Ping.aiff

(他にも、Basso.aiff	Frog.aiff	Hero.aiff	Pop.aiff	Submarine.aiff
Blow.aiff	Funk.aiff	Morse.aiff	Purr.aiff	Tink.aiff
Bottle.aiff	Glass.aiff	Ping.aiff	Sosumi.aiff
を置いておきました)

これを再生するプログラムを作ってみましょう。以下で再生できます。

 import java.io.*;
 import javax.sound.sampled.*;
 
 public class AudioPlay {
 	public static void main(String[] args)  {
        	try{
           		File audioFile = new File("Ping.aiff");
            		AudioFormat format = AudioSystem.getAudioFileFormat(audioFile).getFormat();
           		DataLine.Info info = new DataLine.Info(Clip.class, format);
            		Clip clip = (Clip)AudioSystem.getLine(info);
 
 	    		clip.open(AudioSystem.getAudioInputStream(audioFile));
            		clip.start();
 	    		clip.drain();
 	    		clip.close();
         	}
         	catch(Exception e){
              		e.printStackTrace();
        	}
 	}
 }




**2012年12月25日 [#d1267462]

*** 簡単なアニメーション [#c61f1013]

-まずはなにもしないウィンドウを出します

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }



-次に動くボールを出します

このアニメーションはかなり手抜きです。
本来は、マルチスレッドにして、アニメーションを動かすパートと、
それ以外の処理をするパートに分けて動かします。
今回は、アニメーション以外の処理を何もしないという前提で、
無限ループでアニメーションを動かしています。

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 	JPanel panel;
 	Graphics g;
 	
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		panel = new JPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		g=panel.getGraphics();
 		g.setColor(Color.blue);
 
 		int x=0, xdelta=10;
 		while(true) {
 			g.fillOval(x,100,50,50);
 			try{Thread.sleep(50);}catch(Exception e){}
 			g.clearRect(x, 100, 52,52);
 			x+=xdelta;
 			if(x>250) xdelta=-10;
 			if(x<0) xdelta=10;
 		}
 		
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }



*マルチスレッドについて [#xb2d96c2]

Javaでは次のようにしてマルチスレッドを実現します
+Runnableをimplementsしたクラスを作る
+そのインスタンスを作る
+そのインスタンスを引数にしてThreadクラスのインスタンスを作る
+そのインスタンスのstart()メソッドを呼ぶ

例えば以下のプログラムではメインとサブのスレッドが別個にに数字を表示していきます。

 import java.lang.Thread;
 
 class SubThread implements Runnable {
 	public void run() {
 		int i=0;
 		while(true) {
 			System.out.println("this is sub:" + i++);
 			try {Thread.sleep(1000);}catch(Exception e){}
 		}
 	}
 } 
 
 class ThreadTest {
 	public static void main(String[] args) {
 		SubThread sub=new SubThread();
 		new Thread(sub).start();
 		for(int i=0;;i++) {
 			System.out.println("this is main:" + i);
 			try {Thread.sleep(2000);}catch(Exception e){}
 		}
 	}
 }


*マルチスレッド化する [#yf7887cd]

上記のボールを動かすプログラムでは、main()で、frame.init()したあと、このメソッドで無限にアニメーション書き換えを行うことになります。なので、二度とmain()には戻ってきません。(以下で示した、メニューは、また別のスレッドで動くので、このままでも動きます)

アニメーションだけをするなら、これでも良いのですが、他にも仕事をしたい場合には難しいですし、やれないことはないですが、タイミングを計るのが難しいです。ということで、アニメーションする部分は、別のスレッドにして、そちらに任せてしまうのが通常です。

以下のように、別のインスタンスを別スレッドで動かします。別スレッドで動かすインスタンスを作るために、Animatorという名前のクラスを用意しました。別スレッドで動かすためには、Runnableをimplementする必要があります。ここで必須のrunというメソッドが、裏で実行されるので、そこに、上記のプログラムのアニメーション描画部分をそっくり移動させます。Graphics gの情報を伝えておく必要があるので、それを設定するメソッドも作りました。アニメーションしつつ、main()の方で数字を表示しています。



 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 import java.lang.Thread;
 
 class Animator implements Runnable {
 	Graphics g;
 
 	public void setGraphics(Graphics animeG) {
 		g=animeG;
 	}
 
 	public void run() {
 		int x=0, xdelta=10;
 		while(true) {
 			g.fillOval(x,80,50,50);
 			try{Thread.sleep(50);}catch(Exception e){}
 			g.clearRect(x, 80, 52,52);
 			x+=xdelta;
 			if(x>250) xdelta=-10;
 			if(x<0) xdelta=10;
 		}
 	}
 }
 
 class SimpleAnime extends JFrame {
 	JPanel panel;
 	Graphics g;
 	Animator animator;
 	
 	private void init() {
 		animator=new Animator();
 		this.setTitle("SimpleAnime");
 		this.setSize(300,200);
 		panel = new JPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		g=panel.getGraphics();
 		g.setColor(Color.blue);
 		
 		animator.setGraphics(g);
 		new Thread(animator).start();
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 		
 		for(int i=0;;i++) {
 			System.out.println(i);
 			try {Thread.sleep(500);}catch(Exception e){}
 		}
 	}
 }



***本日の演習 [#rd30f9c9]

上記のプログラムにメニューを追加して、
ボールの色と速さをメニューで指定できるようにしてください


http://gyazo.com/d5db8ca6fa153520e94ee7d2b7a93915.png


-ヒント


 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 import java.lang.Thread;
 
 class Animator implements Runnable, ActionListener {
 	Graphics g;
 	int xdelta =5;
 
 	public void setGraphics(Graphics animeG) {
 		g=animeG;
 	}
 			
 	public void actionPerformed(ActionEvent e) { 
 		String command = e.getActionCommand(); 
 		if(command !=null) { 
 			System.out.println(command); 
 		} 
 		if(command=="red") g.setColor(Color.red); 
		 //ここに追加
 		if(command=="fast") xdelta=30; 
		 //ここに追加
                //でも本当はもうすこしちゃんとしないといけない
                //このままだとxdeltaがマイナスの時にも+30にしてしまうので動きがおかしくなる
 	} 
 	
 	public void run() {
 		int x=0;
 		while(true) {
 			g.fillOval(x,80,50,50);
 			try{Thread.sleep(50);}catch(Exception e){}
 			g.clearRect(x, 80, 52,52);
 			x+=xdelta;
 			if(x>250) xdelta=-xdelta;
 			if(x<0) xdelta=-xdelta;
 		}
 	}
 }
 
 class SimpleAnime extends JFrame  {
 	JPanel panel;
 	Graphics g;
 	Animator animator;
 	 
 	private void makeMenu() { 
 		JMenuBar menubar = new JMenuBar(); 
 		JMenu menu = new JMenu("color"); 
 		JMenu menuSpeed = new JMenu("speed"); 
 		 
 		JMenuItem item1 = new JMenuItem("red"); 
 		item1.addActionListener(animator); 
 		item1.setActionCommand("red"); 
 		JMenuItem item2 = new JMenuItem("blue"); 
 		item2.addActionListener(animator); 
 		item2.setActionCommand("blue"); 
 		JMenuItem item3 = new JMenuItem("yellow"); 
 		item3.addActionListener(animator); 
 		item3.setActionCommand("yellow"); 
 		menu.add(item1); 
 		menu.add(item2); 
 		menu.add(item3); 
 		 
 		JMenuItem item4 = new JMenuItem("fast"); 
 		item4.addActionListener(animator); 
 		item4.setActionCommand("fast"); 
 		JMenuItem item5 = new JMenuItem("slow"); 
 		item5.addActionListener(animator); 
 		item5.setActionCommand("slow"); 
 		menuSpeed.add(item4); 
 		menuSpeed.add(item5); 
 	 
 		menubar.add(menu); 
 		menubar.add(menuSpeed); 
 		this.setJMenuBar(menubar);
 	} 
 	
 	private void init() {
 		animator = new Animator();
 		this.setTitle("SimpleAnime");
 		this.setSize(300,200);
 		this.makeMenu();
 		panel = new JPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		g=panel.getGraphics();
 		g.setColor(Color.blue);
 		
 		animator.setGraphics(g);
 		new Thread(animator).start();
 	}
 
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 		
 		for(int i=0;;i++) {
 			System.out.println(i);
 			try {Thread.sleep(500);}catch(Exception e){}
 		}
 	}
 }

***本日のレポート [#rde38100]

SimpleAnime.javaとclassを「ファイル名+学生名」のフォルダにまとめてzipで圧縮して提出してください。

***Mac OS X [#f999668f]

How2MacOSXProgramming を見てください


***iPhone [#y33e2243]

How2iPhoneProgramming を見てください


***他の環境でのGUIプログラミングの例 [#u0702bfc]

***X11 [#c7237329]

以下の内容の新しいファイル,buttontest.cを作ってください.
printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください.
入力が面倒なら,添付ファイルの
[[buttontest.c:http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=buttontest.c&refer=Lecture]]
をダウンロードしてください.


 #include <X11/Xlib.h>
 #include <stdio.h>
  
 int main (){
 	Display *display = XOpenDisplay (NULL);
 	XEvent event;
 	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
 	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
 	XMapWindow(display, window);
 	XFlush(display);
 
 	while(1) {
 		XNextEvent(display,&event);
 		switch (event.type) {
 		  case KeyPress: 
 			printf("key\n");
 			break;
 		  case ButtonPress:
 			printf("button down\n");
 			printf("button\n");
 			break;
 		  case ButtonRelease:
 			printf("button up\n");
 			break;
 		}
 	}
 	return 0;
 }

以下のコマンドでコンパイルしてください.

 cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.




***Java Appletの作り方 [#sfe48bb0]

いままでは、Java Applicationを作ってました。
これはjavaコマンドから実行するアプリケーションでした。
このほか、Javaには、Java Appletという実行形式式があります。
Appletは、webページなどで動かすことができます。
もともとは、webサービスでクライアント側でアプリケーションを動かすために
開発されました。


AppletはAppletクラスを継承して作ります。
Appletクラスは、java.awt.Panelを継承しています。
なにができるのかは、java のマニュアルをみてください。

たとえば、次のようなプログラムをAppletTest.javaとして作ります。
これをコンパイルします。


 import java.awt.*;
 import java.applet.*;
 
 public class AppletTest extends Applet {
     public void paint(Graphics g) {
         g.drawString("Hello World!!", 60, 30);
     }
 }


これはhtmlの中から呼び出すことができます。
たとえば、つぎのような、index.htmlをつくります。

 <html>
 <head><title>Applet Test</title></head>
 <body>
 
 <applet code="AppletTest.class" width="300" height="150">
 </applet>
 
 </body>
 </html>

これを、さきほどコンパイルしたclassと同じディレクトリにおいて、
webブラウザで開くと、java appletのプログラムが動きます。

http://is.ocha.ac.jp/~siio/gyazo/637225a1c08bef7e853944ad9b8ed390.png

または、このhtmlファイルをアップレットビューアでみることもできます。

 appletviewer index.html 

などして動作を確認できます。

http://is.ocha.ac.jp/~siio/gyazo/d8174aace858dc50e603ee0fef62bcf7.png


つぎのようにすれば、お絵描きプログラムも作ることができます。
下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。
init()は、起動したときに最初に一度だけ呼び出されるメソッドです。

 import java.awt.*;
 import java.applet.*;
 import java.awt.event.MouseMotionListener;
 import java.awt.event.*;
 
 public class AppletTest extends Applet implements MouseMotionListener {
 
 int lastx,lasty,newx,newy;
 Graphics g;
    
     public void mouseMoved(MouseEvent arg0) {
     }
 
     public void mouseDragged(MouseEvent arg0) {
 	newx=arg0.getX();
 	newy=arg0.getY();
 	g.drawLine(lastx,lasty,newx,newy);
 	lastx=newx;
 	lasty=newy;
     }
 
     public void paint(Graphics g) {
 	g.drawString("Hello World!!", 60, 30);
     }
 
     public void init() {
 	g=this.getGraphics();
 	this.addMouseMotionListener(this);
     }
 
 }


appletviewerで見てみます。

http://is.ocha.ac.jp/~siio/gyazo/2c88f97c8f7234e5e3eb72dcd9b2713a.png

webブラウザでもみてみましょう。
(注意:Safariでは、読み込まれたappletが残っていますので、
更新したappletを試すためには、
Safariを一旦終了して起動しなおしてください。)

http://is.ocha.ac.jp/~siio/gyazo/143be91363a277f04a0fa8b1f5d5a43a.png


webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。

http://is.ocha.ac.jp/~siio/lecture/applet/



**2011年12月20日 [#ze724771]

//***宿題提出お願い [#pe641de6]
//
//前回、プログラム12.4をやってくる宿題をお願いしました。
//この、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**第13章 様々なコンポーネントとレイアウト [#t751cf3b]

***13.2節を読んで,プログラム13.2を実行させてください [#j2fa3770]

ボタンが一つしかないプログラムなので、ActionPerformedの中で、
ボタン種類のチェックを省略してしまっているところが特徴です。

***演習13.1をやってください [#s0145426]

こんなのをつくってください。

http://is.ocha.ac.jp/~siio/gyazo/999f1e766551a994186cc3d159bde0bf.png


BorderLayoutでもできるようですが、私はGridLayour使ってみました。

  		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearbutton);


ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。


解答例

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class JTextFieldSample extends JFrame implements ActionListener {
 	JButton button, clearButton;
 	JTextField textleft, textright;
 	
 	JTextFieldSample(String title) {
 		setTitle(title);
 		button = new JButton("left to right");
 		clearButton = new JButton("clear");
 		button.addActionListener(this);
 		clearButton.addActionListener(this);
 		
 		textleft = new JTextField(10);
 		textright = new JTextField(10);
 		JPanel panel=new JPanel();
 		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearButton);
 		Container container=this.getContentPane();
 		container.add(panel);
 	}
 	
 	public void actionPerformed(ActionEvent e) {
 		if(e.getSource()==(button)) {
 			textright.setText(textleft.getText());
 			textleft.setText("");
 		}else if(e.getSource()==(clearButton)) {
 			textright.setText("");
 		}
 	}
 	
 	public static void main(String[] args) {
 		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
 		sample.pack();
 		sample.setVisible(true);
 		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 }



***13.5節を読んで,プログラム13.5を実行してください [#w820e03f]

http://is.ocha.ac.jp/~siio/gyazo/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。


***演習13.2をやってください(メニュー項目は何でも良いです) [#l2d65300]

演習ができそうにないという人は、飛ばして、次に進んでください。

http://is.ocha.ac.jp/~siio/gyazo/2d9c3b6534e7b87fcd3ec22be00d5fed.png



***13.6節を読んで,プログラム13.6を実行してください [#q6e1ebf9]


教科書203ページのプログラム13.6の5行めのところに、

 ... implements ActionListener6: {

とありますが、これは、

 ... implements ActionListener {

の間違いのようです。

ボタンの色がかわるはずですが、javaのバージョンでは機能しないこともあるようです。

 		button.setForeground(color);

として試してみてください(この場合ボタンの文字の色が変わります)



//***今日のレポート [#abe99eb6]
//今日作ったいろいろな工夫したメニューを出すプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


***今日のレポート [#c391a863]
今日作った色選択プログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。




**2011年12月13日 [#k4ff1d5f]


**第12章 Swing [#qd77c6bd]


***とても簡単なウィンドウ [#f9694fbd]

 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 }


*** JFrameを継承するプログラミング(1) [#o257c56b]
 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.setTitle("私が作った最初の窓");
 		sw.setSize(200,100);
 		sw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		sw.setVisible(true);
 	}
 }


*** JFrameを継承するプログラミング(2) [#h5cf77a5]
 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setSize(200,100);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }



***ラベルを表示するウィンドウ [#m80dba67]

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。



http://is.ocha.ac.jp/~siio/gyazo/c6efe47de19436f7564660377fe8b98c.png




解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JLabel label = new JLabel("Hello!");
 		Container container = this.getContentPane();
 		container.add(label);
 		this.pack();
 		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 
 }


回答例2(こうしても良い)

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.getContentPane().add(new JLabel("hello"));
 		this.pack();
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }



***ボタンを2個表示するウィンドウ [#t7698f4b]

プログラム12.2をみてください。
getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、
貼付けられるのは一つのボタンだけのようです。
パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、
2個のボタンを出してみよう。


http://is.ocha.ac.jp/~siio/gyazo/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleButton extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JPanel panel = new JPanel();
 		JButton button1 = new JButton("button1");
 		JButton button2 = new JButton("button2");
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);	
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }


このプログラムでは,ボタンを押しても何もおこりません.

ボタンが押されたイベントを受け取るためには,
+ActionListenerをimplementしたクラスを作る
+そのインスタンスを作る
+これをボタンにaddActionListener()で登録する
必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://is.ocha.ac.jp/~siio/gyazo/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {



ヒント2(最初の5行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {



解答例

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 	
 		JPanel panel = new JPanel();
 		button1 = new JButton("button1");
 		button2 = new JButton("button2");
 		button1.addActionListener(this);
 		button2.addActionListener(this);
 
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public void actionPerformed (ActionEvent e) {
 		if(e.getSource()==button1) 
 			System.out.println("Hello");
 		else
 			System.out.println("Goodbye");
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }




***今日のレポート [#v143ecd3]
プログラム12.4に相当するプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。



**2011年12月13日 (宿題提出) [#x71bf8a7]

前回の授業でお願いした宿題を提出してください。

-宿題(1)の.javaと.classファイル
-宿題(1)で何倍高速化されたかを書いたテキストファイル
-宿題(2)の.javaとclassファイル

以上を、番号+名前のフォルダに入れて、zipで圧縮して、いつもの課題と同様に提出してください。

***宿題(1)の回答例を書いておきます [#med836c0]

-解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
 //データはテキストじゃなくて、バイナリーです。
 
 public class URLJpeg2 {
 	public static void main (String argv[]) {
 		byte[] data = new byte[512];
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int datalength;
 			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }



**宿題(2011年12月13日授業開始時に提出) [#o29e2fc8]

来週、再来週と2回休講するので、宿題を用意しました。
12/3の授業の冒頭で以下のファイルを提出していただきます。

-宿題(1)の.javaと.classファイル
-宿題(1)で何倍高速化されたかを書いたテキストファイル
-宿題(2)の.javaとclassファイル

以上を、番号+名前のフォルダに入れて、zipで圧縮して、12/3の授業の冒頭で提出してください。


***宿題(1)写真読み込みの高速化 [#n961b2c0]

今日の例では写真データを1バイトずつ読み書きしていました。
InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。
たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。
そこで、複数バイト読み書きするよう、上記のプログラムを変更して、
実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。

 
 public int read(byte[] b)
          throws IOException
 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
 実際に読み込まれたバイト数は整数として返されます。
 このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
 あるいは例外がスローされるまでブロックします。

を使って読みこみ、
 
 public void write(byte[] b,
                   int off,
                   int len)
            throws IOException
 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。

-ヒント


 		byte[] data = new byte[512];

という配列を用意して、

 			int datalength;
 			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

とします。

このプログラムで何倍速くなったか計測してください。


***宿題(2)引数のURLをファイルにするプログラムを考えてみましょう [#ab23aef5]

curlというコマンドがあります。

 curl http://ocha.ac.jp/

などとすると、htmlが見られますし、

 curl http://is.ocha.ac.jp/~siio/cat.jpg > cat.jpg

などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。
たとえば、

 java Curl http://ocha.ac.jp/

とすると、htmlが見られ、

 java Curl http://is.ocha.ac.jp/~siio/cat.jpg > cat.jpg

とすると、ファイルとして保存できるプログラムを作ってください。

ちなみに>を使ってファイルにリダイレクトするのはOSの仕事ですので、皆さんがつくるものは、第一引数のURLから1バイト取得して、それを標準出力に出力することを繰り返すプログラムとなります。


**2011年11月22日 [#q4220a9a]


**第11章 入出力(つづき) [#la58ba7b]

***プログラム11.3をやってみてください [#l118531f]


作ったファイルを
 od -h 
または
 hexdump
してみてください

 $ hexdump writer.txt 
 0000000 32 30 30 36 0a 4a 61 76 61 20 e6 95 99 e7 a7 91
 0000010 e6 9b b8 0a                                    
 0000014



文字列をかきだすだけならFile Writerでもできる

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			//pwriter.println("Java教科書");
 			fwriter.write("Java教科書");
 			pwriter.close();	
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }



つぎに、プログラム11.4を参考にして、
このPrint Write Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作ってください。

ヒント:

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
			 
			 
			 ここに書き足す
			 
			 
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }





***文字ストリームをファイルに書いて読み込むプログラム [#x43ff20a]


 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println("java 教科書" + 2001 );
 			pwriter.close();			
 		//writer.txtのファイルの中身をSystem.out.printlnで表示する
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			String tmp;
 			while( (tmp=breader.readLine() ) != null) {
 				System.out.println(tmp);
 			}
 			breader.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }











***プログラム11.5をやってこれを拡張して演習11.2をやってください [#s42c869d]




キーボードから1行入力された文字列によるテキストファイルを作る




http://is.ocha.ac.jp/~siio/gyazo/f9aee7f492d574f870e85e2022df374c.png




ヒント




  import java.io.*;
  
  public class En112 {
  	public static void main(String[] args) {
  	
  		try {
 
 
 ここにプログラムを書く
  		
  			}
 			catch(IOException e) {
  				System.out.println(e);
   			}
     }
  }


解答例

 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {
 			InputStreamReader ireader = new InputStreamReader (System.in);
 			BufferedReader breaderK = new BufferedReader(ireader);
 			String line = breaderK.readLine();
 			
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(line);
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breaderF = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breaderF.readLine())  != null)
 				System.out.println(tmp);
 			
 			breaderF.close();
 		
 			}
			catch(IOException e) {
 				System.out.println(e);
 			}
 	}
 }

***http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#o4512868]




http://is.ocha.ac.jp/~siio/gyazo/13044fdd9d372118a1f6fe93896eadb3.png








ヒント1

 import java.net.*;

が必要です。

 URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

 InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

 InputStreamReader isreader = new InputStreamReader(istream);
// InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

 BufferedReader breader = new BufferedReader( isreader );

でこれからBufferedReader のインスタンスが得られる。


ヒント2

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }





解答例:

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream);
 			BufferedReader breader = new BufferedReader(  isreader );
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }




***写真ファイルのダウンロード [#xf825fce]

 http://is.ocha.ac.jp/~siio/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。
1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。



ヒント2:

 import java.io.*;
 import java.net.*;
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");


というインスタンスを作って、

 istream.read()

で読んで、

 fout.write(1バイト)

で書き出します。


解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラム
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int aData;
 			while((aData  = istream.read()) != -1) fout.write(aData);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }





***今日のレポート [#sb0b2ed1]
写真ファイルのダウンロードのプログラム、
上の例では、URLJpeg.javaとURLJpeg,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。





//************************************


**2011年11月15日(つづき) [#v2cec83d]


**第11章 入出力 [#b351599d]

***整数を出力する例 [#tcb68061]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


これでdout.datという名前のファイルができあがるはずです。 作ったファイルを

 od -h dout.dat
 
または

 hexdump dout.dat

してみてください

 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004










***整数を入出力する例 [#re282e05]



 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readInt());
 			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }

Stringインスタンスも読み書きできる

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeUTF("hello java");
 			dout.writeInt(100);
 			dout.close();
 			
  			FileInputStream finput = new FileInputStream("dout.dat");
  			DataInputStream dinput = new DataInputStream(finput);
  			System.out.println(dinput.readUTF());
 			System.out.println(dinput.readInt());
  			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}

ファイルの中身も見ておこう。hello javaが10文字なので、最初に10という数字が入っている。

 $ hexdump dout.dat 
 0000000 00 0a 68 65 6c 6c 6f 20 6a 61 76 61 00 00 00 64
 0000010



***演習11.1 をやってください [#k11d850d]

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください



解答例


 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		try {
                        int i;
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


**今日のレポート [#odc51fc1]
演習11.1で作ったjavaとclassと、作成したデータファイル(dout.datなど)を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

**2011年11月15日 [#xffe98d9]


**第10章 Stringクラスとコレクションフレームワーク [#q3a0614d]

*** 入力した文字を逆に出力するプログラムを作る [#v08c7909]

 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 

ヒント:

 public static void main(String argv[]){

と書いた場合、argv[0] が最初の引数を示すString型のインスタンスになる


ヒント:これで順方向の表示ができる

 			int len = argv[0].length();
 			for(int i = 0; i<len; i++) {
 				System.out.print(argv[0].charAt(i));
 			}


できた人は、tryを使ったエラー処理も作ってください。


解答例

 public class TestString {
 	public static void main (String argv[]) {
 		try{
 			System.out.println(argv[0]);
 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}
 			System.out.println();
 		}
 		catch (Exception e) {
 			System.out.println("please input a word");
 		}
 	}
 }



***Linked List の練習 [#rb958252]


サンプルプログラムを実行するときは、

 	LinkedList<String> list = new LinkedList<String>();

などと定義すると良い。


***Hash Mapの練習 [#s937c822]


プログラム10.4を参考にして、
以下のように動作する英語ー日本語単語変換プログラムを作ってください。


 [e100:~/Documents/java] siio% java EtoJ banana
 バナナ
 [e100:~/Documents/java] siio% java EtoJ apple
 りんご
 [e100:~/Documents/java] siio% java EtoJ
 Please input an English word




ヒント:
 	HashMap<String,String> map = new HashMap<String,String>();
 
 	map.put("apple","りんご");


ヒント:

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");//ヒント:


解答例:

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");
 	map.put("orange","みかん");
 	map.put("pineapple","パイナップル");
 	map.put("grape","ぶどう");
 	map.put("peach","もも");
 	map.put("melon","メロン");
 	map.put("lemon","レモン");
 	
	try {
 	System.out.println(map.get(args[0]));
 	}
 	catch(Exception e) {
 	System.out.println("Please input an English word");
 	}
 
 	}
 }





**第9章 エラーと例外処理 [#od089a6b]

次のプログラムを作って試してください。
引数が少ないとエラーが出るのを確認してください。

 public class TestException {
 	public static void main(String argv[]){
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 	}
 }

エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを補足する処置をcatchで指定します。




 public class TestException {
 	public static void main(String argv[]){
 		try{	
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 		}
 		catch (Exception e) {
 			System.out.println("please input 2 words.");
 		}
 	}
 }

**2012年11月8日 [#e5b8340f]


*** Osaifuクラスを作ってみよう [#zf9678c9]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print();
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 
http://is.ocha.ac.jp/~siio/gyazo/c618901458edc1ba338cab87d2810157.png


-Osaifu.java 解答編

 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

--このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	

*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#ma331694]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。


***コンストラクタ解答編 [#x9abe813]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }


**第8章 継承 [#kd659847]

継承の話をしました。
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。



*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#s9749a7e]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは90円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print()   お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

-動作例

http://is.ocha.ac.jp/~siio/gyazo/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {


-ヒント:mainはこんな感じ

 	public static void main(String argv[]) {
 		OsaifuUSD saifu1= new OsaifuUSD();
 		OsaifuUSD saifu2=new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}


-解答例


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		okane-=usd * 90;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 90;
 	}
 	
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 		
 	}
 }

*** OsaifuUSDクラスの改造 [#j7dba5e4]

OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。
円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。

http://is.ocha.ac.jp/~siio/gyazo/39a7b24a8c45e15ac55693592c2eb7cf.png


-解答例

 	public void print() {
 		super.print();
 		System.out.println("( " + (okane / 90) + " usd )" );
 	}



**今日のレポート [#vee5d420]
OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**2012年10月18日 [#ke3c5ed9]

**第6章 [#l1368c4f]

-演習問題6.1, 6.2, 6.3

例えば以下のような実行結果が出るようにしてください

http://is.ocha.ac.jp/~siio/gyazo/deeb78a70a724a01ce76945235d42ab8.png

-クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://is.ocha.ac.jp/~siio/gyazo/bdef2ab8e69f7f6e62273c2d67d7af2e.png


-Point3Dのメソッドを充実させて次のmain()メソッドで 

 10, 20, 30
 -10, -20, -30

という結果が出るようにしましょう

        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
        }



-Point3Dに、他の点との距離を返すメソッドを実装して、次のmain()メソッドで 


 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }

--解答例

	
 	double distance ( int ptx, int pty, int ptz ) {
 		int dx = ptx - this.getx();
 		int dy = pty - this.gety();
 		int dz = ptz - this.getz();
 		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
 	}
 	
 	double distance ( Point3D p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}


**今日のレポート [#lbda92d2]
Point3D.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。



**第5章 [#x73207bd]

***for-each文は新しい手法なので練習しましょう [#w532f184]
先週やりのこした5章の続き(最後のところ)です。

*** 演習 [#qe9614ef]

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。

先週作ったArgTest.javaをArgTest2.javaに複製して(クラス名も変更して)書いてみましょう。次のような動作をすれば完成です。

http://is.ocha.ac.jp/~siio/gyazo/8d8effac163e0dc939e74f237d8507b1.png

ヒント:for(String s: args)を使います

-解答例
 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }

**今日のレポート [#g5a5720e]
-ArgsTes2.javaとclass (いずれかのバージョン1つで可)
を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。





*** 出来上がったプログラムの提出方法 [#g6b053a2]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら
を入れてください。
//フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiroのように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにmango.siio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+"SIIO Itiro のパブリックフォルダ" を選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

//http://is.ocha.ac.jp/~siio/gyazo/4b3bd729de9a5bff13fadef9d2f3f1d7.png
http://is.ocha.ac.jp/~siio/gyazo/20121011193708.png

//http://gyazo.com/78afe2136aced11e393a50336a5fa706.png
//http://is.ocha.ac.jp/~siio/gyazo/20121004193409.png
http://is.ocha.ac.jp/~siio/gyazo/20121011195105.png


//http://gyazo.com/35618d5a0582802a7888b3ee50ba3cf2.png
//http://is.ocha.ac.jp/~siio/gyazo/20121004192149.png
http://is.ocha.ac.jp/~siio/gyazo/20121011195203.png


//http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png
http://is.ocha.ac.jp/~siio/gyazo/20121004193059.png


**2012年10月11日 [#f60805e6]


**第3, 4, 5章 [#y4aac07e]

-演習

--演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。

--arg[0]とarg[1]をprintlnの中で+でつないで表示する

hhttp://is.ocha.ac.jp/~siio/gyazo/8159f78165e17781a7110de3763c833c.png

ヒント(最初の引数の文字だけを表示するプログラム)

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }

解答

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }


-演習問題5.4(変更)

乱数を10個表示する

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.println(a);
 		}
 	}
 }

次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDEを表示するプログラムを書け。
動作例を以下に示す。

http://is.ocha.ac.jp/~siio/gyazo/829b04a7fc82cdfe9dd0dfa650af873e.png



解答例:

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.print(a + " ");
 			if(a<40) System.out.println("D");
 			else if(a<60) System.out.println("C");
 			else if(a<80) System.out.println("B");
 			else System.out.println("A");
 		}
 	}
 }



または、

 public class Score {
 	public static void main(String argv[]) {
 		int i,a;
 		char score;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			if(a<40) score='D';
 			else if(a<60) score='C';
 			else if(a<80) score='B';
 			else score='A';
 			System.out.println(a + " " + score);
 		}
 	}
 }


-演習問題5.5をやってみよう

http://is.ocha.ac.jp/~siio/gyazo/1733defca0c709c41c69ea729320ab61.png


解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	year=1;
 	while(okane < 200000) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	 	year++;
 	}
 }
 }


現在の普通預金の金利0.02%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://is.ocha.ac.jp/~siio/gyazo/7a30f764158c89aeb678481cfa4c157a.png


-演習5.6をやってみよう

while文をfor文に変えてみる

解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	for(year=1;okane < 200000; year++) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	}
 }
 }


**今日のレポート [#if44f3e5]

-Score.javaとclass (いずれかのバージョン1つで可)
-Kinri.javaとclass (いずれかのバージョン1つで可)

を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**2012年10月4日 [#y8f9556c]





***教科書 [#o458d8aa]




http://is.ocha.ac.jp/~siio/gyazo/de3288074dae1c75f6df4ef3c0b9b3d4.png




http://www.amazon.co.jp/dp/4883732258/




買ってください。もしくは、先輩から安く譲ってもらってください。




*** この講義の目的 [#be08c16c]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする




*** この講義の順序 [#o2464ba2]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる




*** 成績評価 [#we458491]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考にします)
+出席状況(成績の参考にします。3/4以上出席してください。欠席は3回まで)


**第1章および第2章 [#y3ae1beb]


*** Mac OS XでJavaを使う [#g3e7de3f]

Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#ia8beba9]

//#ref(How2Java/terminal.png)

http://is.ocha.ac.jp/~siio/gyazo/7366bfab668207c6598c4d88ef70d2d4.png

- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)

- メニューのターミナル/環境設定...を開きます。
ここで、テキストを選んで、「テキストをアンチエイリアス処理」に
チェック入れておくとフォントが奇麗なのでおすすめです。

http://is.ocha.ac.jp/~siio/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png

- おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。
Javaの場合、ここで「Unicode (UTF-8)」を選んでおきましょう。
(日本語コードにはいろいろな種類があって混乱しますが、21世紀に生きるみなさんはUnicodeで統一していきましょう)

//http://gyazo.com/1b36039be113ef9e8ed04842aaeb3da6.png

- ターミナルから、javac helpとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。
--最近のMac OS X (Mountain Lionなど)では、Javaが標準で入っていない場合もあります。
その場合は、ダインロードするかどうか聞かれますので、ダウンロードしましょう。
--ここでの日本語表示が化けていたら、javaがUnicodeじゃなくてShift-JISなどのコードで動いていることになります。ターミナルをShift-JISなどに設定しても良いのですが、ここは、JavaをUnicodeで動かすようにしましょう。

-JavaをUnicodeで動かす(前項で文字化けした場合の対処)
--javacを起動するときに、javac -J-Dfile.encoding=UTF-8 とオプションを付けます
--javaを起動するときには、java -Dfile.encoding=UTF-8 とオプションを付けます。
--面倒なので、.bash_profileに登録しておきましょう
-- ~/.bash_profileを開いて以下の行を追加します
 alias javac='javac -J-Dfile.encoding=UTF-8'
 alias java='java -Dfile.encoding=UTF-8'


*** miを用意しておく [#qfba9e5b]


http://is.ocha.ac.jp/~siio/gyazo/2c0e58d1b83d396e1fbe6f5d247670ff.png

- Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。

- これも便利なのでdockに入れておくとよいと思います。

http://is.ocha.ac.jp/~siio/gyazo/7579915fefe1ecd9c0e4e2ddfa55177d.png


*** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

-このときmiで改行コードをLF (UNIX)にしておいてください。またUTF-8になっていれば日本語も正しく出るはずです。

http://is.ocha.ac.jp/~siio/gyazo/20121004010107.png


- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)


- 次に簡単なウィンドウを出してみましょう。

授業の最後の方で紹介する,Swingというフレームワークを使ってウィンドウを出してみます.


 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
//                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }

これを&#x53;impleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.

#ref(How2Java/simplewindow.png)


*昨年度以前の講義の情報 [#v098b685]
- LectureOld

*理学総論 (2012.11.19講義分) [#f17dfd89]

**理学総論レポート (2012.11.19講義分) [#pc1b8dab]

[[Page1:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large1.jpg]]
[[Page2:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large2.jpg]]
[[Page3:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large3.jpg]]

上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。
これを読んで、以下の考察をしてください。

「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、
2つ以上の例を示して、
これらが如何に「透明な技術」であるのかを説明し、
未来のコンピュータがどのような存在になるのか記述してください。

-締め切り: (前半の他の講義と同じ)
-形式分量:A4, ページ数は1-3ページ程度
-提出先・提出方法:(前半の他の講義と同じ)
//PDFにしてsiio@is.ocha.ac.jpまでメール添付で送付 
-提出していただいた学生さんの学籍番号は以下です

http://is.ocha.ac.jp/~siio/gyazo/20121203172028.png
&br;
1240655


* ヒューマンインタフェース 2012年度前期 [#rbaa8734]

** レポートのお知らせ [#l19f0d7c]
- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
- 締め切り2012年9月24日月曜日
-形式分量:A4, ページ数は2-3ページ程度
-提出先・提出方法:PDFにしてsiio@me.comまでメール添付で送付&#160;
--メールの標題は「授業レポート: 10205XX」としてください。数字部分は出席番号です。
--提出いただいた方は以下のとおりです。提出してしばらく経つのに、
自分の番号がなかなか表示されない場合は,受付されていないかもしれません.もう一度催促してください

|学籍番号|受理日|
|1020523|2012年7月26日|
|1020524|2012年8月7日|
|1020515|2012年9月4日|
|1020519|2012年9月22日|
|1020506|2012年9月24日|
|1020509|2012年9月24日|
|1020533|2012年9月24日|
|1020540|2012年9月24日|

**レポートの課題 [#b9493115]
+身の回りの携帯機器、家電製品、機械製品、コンピュータソフトウェア、
道具、日用品、調度品、設備などから、
使いにくいと思われる道具を見つけ出して欲しい。
+そして、それがなぜ使いにくいのかを、
授業で説明した、
制約、マッピング、Affordance、モデル、
エラー対策、 標準化、直接操作、メタファー、モードなどの用語を使って分析せよ。
(全部の用語を使う必要は無い)
+また,自分ならこのように設計して使いやすくするというアイディアを、
これも授業で使った用語を交えて、述べよ.

//グラフィカルユーザインタフェース(GUI)は、コンピュータの
//画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、
//操作可能なグラフィカルなオブジェクトを表示して、
//これらをマウスなどの指示装置を用いて操作するユーザインタフェースの
//手法である。
//
//一方、文字だけを表示するディスプレイとキーボードを用いて、
//文字によるコマンドをタイプしてコンピュータを操作する手法を
//コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。
//現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。
//
//この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。
//(ヒントとして示したキーワードをできるだけ多く使用すること)
//
//+ GUIのメリットを考察して述べよ。&br;
//(ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
//+ GUIのデメリットをCUIと比較して考察せよ。&br;
//(ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
//+ 上の問いで考察したGUIのデメリットを解消する手法について述べよ。&br;
//(ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)

**出欠表 [#w0a9a412]
-学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします.
--授業回数が12回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません.
--以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

|学籍番号|欠席回数|評価|
|1020503|1||
|1020507|1||
|1020509|1||
|1020514|1||
|1020516|9|不可|
|1020520|1||
|1020522|3||
|1020526|2||
|1020528|1||
|1020530|1||
|1020531|1||
|1020532|1||
|1020534|1||
|1020538|1||
|1020539|2||
|0820510|10|不可|
|0820512|6|不可|


注:初回(4/12)の欠席は含んでいません。(2012.7.12.現在)

**教科書 [#z7855bdf]
http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_AA300_.jpg

http://www.amazon.co.jp/dp/4781912605/

**授業資料 [#i9dc3a0f]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c4.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c5.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c7.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c8.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c10.ppt.pdf

(授業開始直前や直後に差し替えされている可能性があります。)

**教科書サポートページ [#jd28b8ae]

-http://is.ocha.ac.jp/~siio/index.php?CSL11HCI

** 予定 [#j57fc864]
-4/12
-4/19
-4/26
-5/10 海外出張のため休講
-5/17 国内出張のため休講
-5/24 (開講します!)
-5/31
-6/7
-6/14
-6/21
-6/28 (開講します!)
-7/5
-7/12
-7/19 休講
-9/13 夏休み
-9/20


**宿題 [#h8e396f0]

***人の反応速度を測定するプログラムを作って測定してください。(2012.4.26) [#t0d2bb5c]
-連休明けの授業(5/24)の開始時に、A41枚で提出してください。
-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定できます。
--http://is.ocha.ac.jp/~siio/hci/hitnow.c
-これによりあなたの応答速度を複数回実測して、人の応答速度が 300ms 程度であることを確認してください。&#160;
-また何度も測定することで、習熟して速度が向上したり、それでも限界があったり、さらには、逆に疲労により速度が低下することがあるかもしれません。
--そのような現象が観察できたら、これも報告してください。(教科書8章の学習曲線を参考にしてください)

***GUI黎明期のPC性能を調べてください (2012.4.12) [#v0124238]
-CPU名、CPUクロック、メモリ容量、画素数、色数をしらべてください
--現在,Windows を使っている人は,最初の Windows が出荷された 1985 年当時に使われていたIBM PC/AT
--Mac OS Xを使っている人は,1984に出荷された最初の Macintosh&#160;
-今あなたが使っているコンピュータと比較してください.&#160;
--限られたコンピュータ資源で当時の GUI が 実現されていたことを実感してみましょう

*欠席状況2012年度前期 [#ece7ef88]
学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします.
授業回数が10回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません.
以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

**ヒューマンインタフェース 2012年前期 [#b011a2f5]

|学籍番号|欠席回数|出席点|
||||

//注:初回(10/6)の欠席は含んでいません。(2012.1.29.現在)
//*レポート提出状況2012年度前期 [#k25afab2]
//**ヒューマンインタフェース2011年前期レポート提出状況(提出は任意です) [#i26f91d7]
//
//
//提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.
//
//漏れがありましたら至急 siio@mac.com まで至急連絡ください
//
// 0920502
// 0920506

//
//** レポート提出いただいている人のリスト [#l8456147]
//
//漏れがありましたら至急 siio@mac.com まで連絡ください
//
// 0820504
// 0820515
// 0820517
// 0820522
// 0820525
// 0820542
//
//
//** レポートのお知らせ [#mb5ebcf0]
//- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
//- 締め切り2010年8月31日火曜日
//-形式分量:A4, 表紙をのぞいて1-2枚程度
//- 提出先:情報科学科5階図書室レポート受付箱もしくはsiio@me.comまでPDFをメール添付
//(メール添付の場合は,確認の返事をします.返事が来ない場合は,受付されていないかもしれません.もう一度催促してください)
//
//*** 課題 [#wd700057]
//
//グラフィカルユーザインタフェース(GUI)は、コンピュータの
//画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、
//操作可能なグラフィカルなオブジェクトを表示して、
//これらをマウスなどの指示装置を用いて操作するユーザインタフェースの
//手法である。
//
//一方、文字だけを表示するディスプレイとキーボードを用いて、
//文字によるコマンドをタイプしてコンピュータを操作する手法を
//コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。
//現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。
//
//この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。
//(ヒントとして示したキーワードをできるだけ多く使用すること)
//
//+ GUIのメリットを考察して述べよ。&br;
//(ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
//+ GUIのデメリットをCUIと比較して考察せよ。&br;
//(ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
//+ 上の問いで考察したGUIのデメリットを解消する手法について述べよ。&br;
//(ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)


*レポート提出状況2011年度後期 [#q9fe4f64]

**理学総論 (2011.11.28講義分 [#p1b88073]

現在,提出していただいている学生さんは以下の方々です.
もし,提出したのに漏れているという学生さんがいらしたら, siio@is.ocha.ac.jp まで至急お知らせ下さい.

|学籍番号|提出日|
|1040679|2011.12|
|1140661|2011.12|
|1040674|2011.12|


//**ヒューマンインタフェース2011年前期レポート提出状況(提出は任意です) [#i26f91d7]
//
//
//提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.
//
//漏れがありましたら至急 siio@mac.com まで至急連絡ください
//
// 0920502
// 0920506

*欠席状況2011年度後期 [#o9abe9e4]

学部「情報と職業」は出席重視の授業です.そのため70%以上出席お願いします.
授業回数が12回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません.
以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

**情報と職業 2011年後期 [#b7796b65]

|学籍番号|欠席回数|出席点|
|0920510|1||
|0920511|3||
|0920514|1||
|0920520|1||
|0920522|1||
|0920523|2||
|0920531|2||
|0920533|10|不可|
|0920534|1||
|0920537|1||
|0930542|3||
|0930611|7|不可|
|0810132|9|不可|
//|0810137|10|不可|
|0810158|3||
|0810224|10|不可|
|0820505|10|不可|
|0820519|1||
|0820527|3||
|0820535|1||

注:初回(10/6)の欠席は含んでいません。(2012.1.29.現在)



//*情報と職業レポート [#z26bcffc]

//**レポート提出いただいている人のリスト
//
//漏れがありましたら至急 siio@mac.com まで連絡ください
//
// 12345678

//**レポートのお知らせ [#fa579ac2]
//
//提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.
//(出席回数が70%に満たないことの充足にはしません)
//
//-締め切り: 2011年8月31日水曜日
//-形式分量:A4, ページ数は2-3ページ程度
//-提出先・提出方法:PDFにしてsiio@me.comまでメール添付で送付 
//--メールの標題は「授業レポート: 09205XX」としてください。数字部分は出席番号です。
//--このページに提出者の出席番号を書き込みます。
//このページに自分の番号が出ない場合は,受付されていないかもしれません.もう一度催促してください

//**課題


*情報と職業 2011年後期 [#cebb0a49]

**シラバス [#x7c1fd16]

-第1章 デジタル時代
--情報システムと生活/ビジネス/暮らし
--デジタル情報システムと生活/ビジネス/暮らし
--デジタルである事
--アナログ(レコード,写真,電話)デジタルの違い

-第2章 マルチメディアシステム
--マルチメディアシステム
--数字から文字,文字から画像音声
--画像と動画のデータ量
--画素とは
--デジカメの画素
--圧縮の効果

-第3章 情報社会の無料と格安
--格安のハード
--大量生産(フォードの自動車)
--家庭用ゲーム機
--携帯電話商法
--サプライで収益
--有料サイト囲い込み
--無料のソフトウェア
--フリーウェア
--シェアウェア
--無料で配布ーシェア拡大ー技術支援で課金(コンサルタント,出版)
--無料のサイト(サービス)
--GNUの思想, 寄付(シェアウェア)
--広告で収入
--技術力を示しビジネスにつなげる

-第4章 WWW
--WEB以前の世界
--WEBの歴史
--ブラウザの変遷
--検索エンジン以前の世界
--検索エンジン
--新規なビジネス形態
--新しいコミュニティ
--フォークソノミー(folksonomy)
--クラウドコンピューティング

-第5章 互換ビジネス(コンパチブル,コンパチ)
--大型計算機の互換機
--互換マイクロプロセッサ
--パーソナルコンピュータの互換機
--互換機との戦い
--プリンタの互換機

-第6章 情報関連企業のビジネス戦略
--格安のハードウェア,ソフトウェア,サービス
--webの発達
--ビジネスモデル
--企業はどこで儲けているのか.どこが稼ぎ場所なのか.

-第7章ユビキタスコンピューティング
--今後の情報技術と生活

**予定 [#x35c17cd]

-10/6
-10/13
-10/20
-10/27
-11/3 祝日
-11/10
-11/17
-11/24 休講?
-12/1 休講
-12/8
-12/15 休講
-12/22
-1/12 休講(情報科学科集中演習のため)
-1/19
-1/26
-2/2 
--2/2は大学院入試で休講かと思っていましたが教務に問い合わせたところ違うとのことでしたので授業実施します


*理学総論 (2011.11.28講義分) [#t48d6ac5]



**理学総論レポート (2011.11.28講義分) [#a779caba]

[[Page1:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large1.jpg]]
[[Page2:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large2.jpg]]
[[Page3:http://is.ocha.ac.jp/~siio/gyazo/Weiser-large3.jpg]]

上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。
これを読んで、以下の考察をしてください。

「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、
2つ以上の例を示して、
これらが如何に「透明な技術」であるのかを説明し、
未来のコンピュータがどのような存在になるのか記述してください。

-締め切り: (後半の他の講義と同じ)
-形式分量:A4, ページ数は1-3ページ程度
-提出先・提出方法:PDFにしてsiio@me.comまでメール添付で送付 
-提出確認方法:提出していただいた学生学籍番号をこのページに掲載します



*集中演習「ヒューマンインタフェース」出題範囲 (2012年1月実施予定) [#v9a20230]
-教科書第5章5.4節「多ビットの入出力」の図5.5に関係する説明を読んでおいてください。理解のために必要ならば、第5章5.1節から5.4節の他の部分にも目を通しておいてください。
-次のような問題を予定しています
--図5.5のようにコンピュータに16個のスイッチを取り付け、それぞれのスイッチに11から44までの名前を付けたとします。
--http://is.ocha.ac.jp/~siio/gyazo/20111230135734.png
--どれかのスイッチが押された時(だけ)に、そのスイッチの名前を表示するC言語風プログラムを作ってもらいます。
---言語はC言語か、もしくは類似の言語で。
---Oputput1から4を1(高電圧)や0(低電圧)にする関数、Input1から4の値を読む関数は用意されているとします。
---スイッチの状態を走査して表示し続ける無限ループを作ってもらいます。
---C言語だったらprintf()文で、以下のような出力を期待しています。(14,23,32,41スイッチを順番にon/offした場合)
 14
 14
 14
 23
 23
 32
 32
 32
 41
 41
---(スイッチを走査するたびに状態を表示していただけばよいので、上記のように複数回出力しても良いです)

-(質問と回答)この説明に細かい設定がかかれてなくてわかりにくいという質問がありました。
細かい設定をちゃんと書いたら、問題そのものになってしまうので、わざとぼかして書いてあります。
ご理解ください。





*レポート提出状況2011年前期 [#mc4f3573]


**ヒューマンインタフェース2011年前期レポート提出状況(提出は任意です) [#lc17a383]


提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.

漏れがありましたら至急 siio@mac.com まで至急連絡ください

 0920502
 0920506
 0920507
 0920528
 0920532
 0920540



**マルチメディアプログラミング実習2011年前期最終課題提出状況 [#x5a81488]

締めきりました 2011年7月13日10:47

    4037  7 12 16:17:30 2011 0820540暫定版.zip
  374899  7 12 16:26:00 2011 1020501arimotoakane.zip
   37291  7 12 16:26:37 2011 1020502anbesayuri.zip
   46486  7 12 16:45:04 2011 1020502anbesayuri_new.zip
  317756  7 12 16:25:57 2011 1020503ishikawachisako.zip
  317729  7 12 16:32:41 2011 1020503ishikawachisako2.zip
  278108  7 12 16:15:52 2011 1020504itoukaori.zip
 4498216  7 12 16:23:07 2011 1020505ushijima.zip
  107481  7 12 16:46:17 2011 1020506kattouhitomi13.zip
 2278049  7 12 16:26:56 2011 1020507kadowakikyoko_last.zip
  684411  7 12 16:59:06 2011 1020508kannosaya.zip
  158190  7 12 16:25:38 2011 1020509kinchikukaoru.zip
  137298  7 12 16:28:02 2011 1020510kurosakiyuko.zip
  503724  7 12 16:35:04 2011 1020510kurosakiyuko_part2.zip
  149693  7 12 16:22:23 2011 1020511 gojimiyabi.zip
  533954  7 12 16:24:33 2011 1020512komatsuakiko.zip
  626497  7 12 17:55:18 2011 1020513gomierika 2 2.zip
  587267  7 12 16:35:56 2011 1020513gomierika 2.zip
  129925  7 12 16:42:48 2011 1020514saitouami1.zip
  274472  7 12 16:37:49 2011 1020515sakomiho.zip
   26698  7 12 16:26:32 2011 1020516sasohtomoko.zip
  260590  7 12 16:54:37 2011 1020517shigedomimami-2.zip
  254610  7 12 16:29:44 2011 1020517shigedomimami.zip
 1461011  7 12 20:36:06 2011 1020518shimizuran_2.zip
   39364  7 12 16:42:11 2011 1020519souyuuyuu2.zip
  396476  7 12 20:29:52 2011 1020519souyuuyuu_final.zip
  366478  7 12 17:33:43 2011 1020520Tadanohanae.zip
  111048  7 12 16:37:07 2011 1020521tanakaairi15.zip
  230311  7 12 16:23:27 2011 1020522tanimotosatoko.zip
  218458  7 12 16:36:22 2011 1020523tsujiyumari.zip
  141211  7 12 16:27:11 2011 1020524tsubakidamegumi.zip
  355770  7 12 16:26:25 2011 1020525nakamuraayako.zip
  139379  7 12 16:35:35 2011 1020526nodayuriko.zip
  425143  7 12 16:26:30 2011 1020527hashimotonatsumi.zip
 5106145  7 12 16:21:54 2011 1020528hamazonoyumi.zip
  346493  7 12 16:33:09 2011 1020529hinomayumi.zip
   27848  7 12 16:47:06 2011 1020530fujiiayaka13-2.zip
    5215  7 12 16:29:14 2011 1020530fujiiayaka13.zip
  324592  7 12 16:32:04 2011 1020531fujitamai.zip
 1303961  7 12 16:26:53 2011 1020532hosoya.zip
  232274  7 12 16:37:58 2011 1020533 Masuda Eri 12.zip
    6196  7 12 16:31:15 2011 1020534mizunokanako.zip
  533985  7 12 16:24:20 2011 1020536motohashishiho.zip
  471173  7 12 16:36:54 2011 1020537ryuyuechin.zip
  679495  7 12 16:40:43 2011 1020538wadamegumi 13.zip
   23079  7 12 16:26:18 2011 g1020518shimizuran.zip
  655778  7 12 16:24:31 2011 g1020539watanabelisa12.zip





*欠席状況2011年前期 [#k6d433f8]

今期の授業はいずれも出席重視の授業です.そのため70%以上出席お願いします.
いずれも授業回数が12回ですので,欠席が3回を超えた場合は単位が出ません.
以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

**ヒューマンインタフェース 2011年前期 [#i8e83b94]

|学籍番号|欠席回数|出席点|
|0920501|1||
|0920503|1||
|0920505|2||
|0920508|2||
|0920511|3||
|0920512|4|不可|
|0920514|1||
|0920517|1||
|0920518|1||
|0920520|1||
|0920521|2||
|0920523|3||
|0920524|3||
|0920526|1||
|0920529|10|不可|
|0920535|1||
|0920536|1||
|0920537|2||
|0920538|1||
|0920542|4|不可|
//|0820208|11|不可|
|0820510|11|不可|
|0820527|4|不可|
|0420521|9|不可|

(2011.7.7現在)

**マルチメディアプログラミング実習2011年前期 [#xbcdaa56]

|学籍番号|欠席回数|出席点|
|1020507|1||
|1020509|1||
|1020516|3||
|1020522|1||
|1020525|1||
|1020530|1||
|1020538|1||
|1020539|1||
//|0820208|12|不可|
|0820510|12|不可|
|0820540|3||

(2011.7.12現在)



*ヒューマンインタフェースレポート [#bd36a2fc]


//**レポート提出いただいている人のリスト
//
//漏れがありましたら至急 siio@mac.com まで連絡ください
//
// 12345678

**レポートのお知らせ [#lfbda9ae]

提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.
(出席回数が70%に満たないことの充足にはしません)

-締め切り: 2011年8月31日水曜日
-形式分量:A4, ページ数は2-3ページ程度
-提出先・提出方法:PDFにしてsiio@me.comまでメール添付で送付 
--メールの標題は「授業レポート: 09205XX」としてください。数字部分は出席番号です。
--このページに提出者の出席番号を書き込みます。
このページに自分の番号が出ない場合は,受付されていないかもしれません.もう一度催促してください

**課題 [#e7d71387]

+身の回りの携帯機器、家電製品、機械製品、コンピュータソフトウェア、
道具、日用品、調度品、設備などから、
使いにくいと思われる道具を見つけ出して欲しい。
+そして、それがなぜ使いにくいのかを、
授業で説明した、
制約、マッピング、Affordance、モデル、
エラー対策、 標準化、直接操作、メタファー、モードなどの用語を使って分析せよ。
(全部の用語を使う必要は無い)
+また,自分ならこのように設計して使いやすくするというアイディアを、
これも授業で使った用語を交えて、述べよ.



*マルチメディアプログラミングの最終課題 [#r0ee4df6]

-課題:お絵描きプログラムを作成してさらに取扱説明書を作成して7月12日までに提出すること
--この課題のヒントは SimpleDraw をみてください。

** 提出課題として最低やってほしいこと [#m496a042]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

** 機能拡張:以下のことができれば加点します [#h9e24f59]

-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-他の絵データをスタンプのように押す機能
-コピーアンドペースト
-メニューバーだけでなく、スライダ、ボタン、別ウィンドウ(パレット)などを使って使いやすくする
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

機能拡張の詳細はSimpleDrawの

-http://is.ocha.ac.jp/~siio/index.php?SimpleDraw#extra

を見てください。SimpleDrawのページでは、

-機能の拡充
-使いやすさの追求

の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。
説明書に、工夫したところを書いておいてください。


** 取扱説明書の作り方 [#c555ee17]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます
--以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。
--もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。
-がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。


** 出来上がったプログラムの提出方法 [#b1c90420]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)+必要ならばバージョン番号の数字」にしてください。
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつてください)

** 締切 [#ja1b9881]
-締め切りは7月12日とします
--この日までに提出してください
//--どうしてもそのあともがんばりたい人は7月12日の11:59pmまでにsiio@mac.comまでメール添付で提出してください
//--可能な限り差し替えます(見落とす可能性がありますので保証はできません)





///////////////////////////////////////////////



-----------------------------------------------



*マルチメディアプログラミング実習2011年前期 [#c1003a23]


**2011年7月12日 [#ua8a66e9]


-いままでの授業の補足:
--アニメーションについて補足します。詳しくは、 How2JavaAnime をみてください。
-いままでの復習:
--クラスメソッド、インスタンスメソッド、クラス、インスタンス、継承、インスタンス化、サブクラス、スーパークラス、などの用語をしっかり確認してください。
--上記の小テストをします。
-4:30pmまでに最終課題の結果を提出してください。提出方法は、最終課題の項目をみてください。


**2011年7月5日 [#s3557239]



***Java Appletの作り方 [#a99c285d]

いままでは、Java Applicationを作ってました。
これはjavaコマンドから実行するアプリケーションでした。
このほか、Javaには、Java Appletという実行形式式があります。
Appletは、webページなどで動かすことができます。
もともとは、webサービスでクライアント側でアプリケーションを動かすために
開発されました。


AppletはAppletクラスを継承して作ります。
Appletクラスは、java.awt.Panelを継承しています。
なにができるのかは、java のマニュアルをみてください。

たとえば、次のようなプログラムをAppletTest.javaとして作ります。
これをコンパイルします。


 import java.awt.*;
 import java.applet.*;
 
 public class AppletTest extends Applet {
     public void paint(Graphics g) {
         g.drawString("Hello World!!", 60, 30);
     }
 }


これはhtmlの中から呼び出すことができます。
たとえば、つぎのような、index.htmlをつくります。

 <html>
 <head><title>Applet Test</title></head>
 <body>
 
 <applet code="AppletTest.class" width="300" height="150">
 </applet>
 
 </body>
 </html>

これを、さきほどコンパイルしたclassと同じディレクトリにおいて、
webブラウザで開くと、java appletのプログラムが動きます。

http://gyazo.com/637225a1c08bef7e853944ad9b8ed390.png

または、このhtmlファイルをアップレットビューアでみることもできます。

 appletviewer index.html 

などして動作を確認できます。

http://gyazo.com/d8174aace858dc50e603ee0fef62bcf7.png


つぎのようにすれば、お絵描きプログラムも作ることができます。
下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。
init()は、起動したときに最初に一度だけ呼び出されるメソッドです。

 import java.awt.*;
 import java.applet.*;
 import java.awt.event.MouseMotionListener;
 import java.awt.event.*;
 
 public class AppletTest extends Applet implements MouseMotionListener {
 
 int lastx,lasty,newx,newy;
 Graphics g;
    
     public void mouseMoved(MouseEvent arg0) {
     }
 
     public void mouseDragged(MouseEvent arg0) {
 	newx=arg0.getX();
 	newy=arg0.getY();
 	g.drawLine(lastx,lasty,newx,newy);
 	lastx=newx;
 	lasty=newy;
     }
 
     public void paint(Graphics g) {
 	g.drawString("Hello World!!", 60, 30);
     }
 
     public void init() {
 	g=this.getGraphics();
 	this.addMouseMotionListener(this);
     }
 
 }


appletviewerで見てみます。

http://gyazo.com/2c88f97c8f7234e5e3eb72dcd9b2713a.png

webブラウザでもみてみましょう。
(注意:Safariでは、読み込まれたappletが残っていますので、
更新したappletを試すためには、
Safariを一旦終了して起動しなおしてください。)

http://gyazo.com/143be91363a277f04a0fa8b1f5d5a43a.png


webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。

http://is.ocha.ac.jp/~siio/lecture/applet/

***今日の課題 [#ga47cbd9]

上のappletを、一筆書きにならないように変更してみてください。
やりかたは、前回やったお絵かきプログラムの改良と同じです。
//本日までにできたところ(.java、.classファイルなど)を、
完成したら、.html, .java、.classファイルを、
いつものように、出席番号+名前のフォルダに入れて、
zipで圧縮して、
//16:30までに
ファイルサーバから提出してください。


提出した後は、
引き続き、お絵かきプログラム最終課題を進めてください。


**2011年6月28日 [#pdd5e443]


本日までにできたところ(.java、.classファイルなど)を、
いつものように、出席番号+名前のフォルダに入れて、
zipで圧縮して、
16:30までにファイルサーバから提出してください。




***Eclipseの警告を消す方法 [#me247857]

 	private static final long serialVersionUID = 42L;

という変数を定義しておきます。

**(演習課題1)上のお絵描きプログラムを改良してください [#o64c8d99]

+下のプログラムでは、マウスポインターの位置と、描かれる線の位置がずれています。直してください。
+下のプログラムでは,描画するとゴミが出ます.
(前回描き終わった場所から線が引けてしまって、一筆書き状態になっています)
これを出ないように改良してください.

一筆書きを解消するヒント

-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimplementします
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/event/MouseListener.html
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/event/MouseListener.html




**2011年6月21日 [#zd2698c7]




**終章 おまけ [#qaf4ca1a]



***Eclipseを使ってみよう [#c4c1c9a0]

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png






*** 線を引く簡単なプログラム [#s8762280]

JPanelのサブクラスを作りました。

 import javax.swing.JPanel;
 import java.awt.Graphics;
 
 public class DrawPanel extends JPanel {
 
 	public void drawLine(int x1, int y1, int x2, int y2){
 		Graphics g = this.getGraphics();
 		g.drawLine(x1, y1, x2, y2);
 	}
  }
 

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。
リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

 
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionListener;
 
 import javax.swing.JFrame;
 
 public class SimpleDraw extends JFrame implements MouseMotionListener {
 
 	int lastx=0, lasty=0, newx, newy;
 	DrawPanel panel;
  
 
 	public void mouseMoved(MouseEvent arg0) {
        }
 
 	public void mouseDragged(MouseEvent arg0) {
 		newx=arg0.getX();
 		newy=arg0.getY();
 		panel.drawLine(lastx,lasty,newx,newy);
 		lastx=newx;
 		lasty=newy;
 	}
 
 
 	private void init() {
 		this.setTitle("Simple Draw");
 		this.setSize(300, 200);
 		this.addMouseMotionListener(this);
 		panel=new DrawPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleDraw frame=new SimpleDraw();
 		frame.init();
 	}
 
 }
 



*** 簡単なアニメーション [#u97f97ce]

-まずはなにもしないウィンドウを出します

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }


-次に動くボールを出します

このアニメーションはかなり手抜きです。
本来は、マルチスレッドにして、アニメーションを動かすパートと、
それ以外の処理をするパートに分けて動かします。
今回は、アニメーション以外の処理を何もしないという前提で、
無限ループでアニメーションを動かしています。

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 	JPanel panel;
 	Graphics g;
 	
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		panel = new JPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		g=panel.getGraphics();
 		g.setColor(Color.blue);
 
 		int x=0, xdelta=10;
 		while(true) {
 			g.fillOval(x,100,50,50);
 			try{Thread.sleep(50);}catch(Exception e){}
 			g.clearRect(x, 100, 52,52);
 			x+=xdelta;
 			if(x>250) xdelta=-10;
 			if(x<0) xdelta=10;
 		}
 		
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }



-アニメーションボールの設定ができるアプリケーションを作ってみよう

こういうのを作ってほしい

http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=SimpleAnime.class&refer=Lecture


ヒント:上のアニメーションのプログラムに、メニューを取り付けて、
action Performedでメニューからのイベントを受け取れば良いです。
メニューの動きは、プログラム本来の動きと並列に動いてくれるので、
上のアニメーションのようなアニメーション以外何もできない手抜きアニメーションでも、
メニューは動いてくれます。


ヒント: action Performed ではこうしたら良い

 public void actionPerformed(ActionEvent e) { 
 		String command = e.getActionCommand(); 
 		if(command=="red") g.setColor(Color.red); 
 		if(command=="blue") g.setColor(Color.blue); 

-余力があれば、ボールが当たったら音が出るようにしてみよう。


***今日のレポート [#l9811c9c]

ボールのプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


***Mac OS X [#o15e152b]

How2MacOSXProgramming を見てください


***iPhone [#w556ee0b]

How2iPhoneProgramming を見てください


***他の環境でのGUIプログラミングの例 [#hff4bdb1]

***X11 [#lf884e5e]

以下の内容の新しいファイル,buttontest.cを作ってください.
printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください.
入力が面倒なら,添付ファイルの
[[buttontest.c:http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=buttontest.c&refer=Lecture]]
をダウンロードしてください.


 #include <X11/Xlib.h>
 #include <stdio.h>
  
 int main (){
 	Display *display = XOpenDisplay (NULL);
 	XEvent event;
 	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
 	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
 	XMapWindow(display, window);
 	XFlush(display);
 
 	while(1) {
 		XNextEvent(display,&event);
 		switch (event.type) {
 		  case KeyPress: 
 			printf("key\n");
 			break;
 		  case ButtonPress:
 			printf("button down\n");
 			printf("button\n");
 			break;
 		  case ButtonRelease:
 			printf("button up\n");
 			break;
 		}
 	}
 	return 0;
 }

以下のコマンドでコンパイルしてください.

 cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.




***サウンドファイルを再生する [#kf073b21]

-以下のファイルをダウンロードしてください。

http://is.ocha.ac.jp/~siio/lecture/Sounds/Ping.aiff

(他にも、Basso.aiff	Frog.aiff	Hero.aiff	Pop.aiff	Submarine.aiff
Blow.aiff	Funk.aiff	Morse.aiff	Purr.aiff	Tink.aiff
Bottle.aiff	Glass.aiff	Ping.aiff	Sosumi.aiff
を置いておきました)

これを再生するプログラムを作ってみましょう。以下で再生できます。

 import java.io.*;
 import javax.sound.sampled.*;
 
 public class AudioPlay {
 	public static void main(String[] args)  {
        	try{
           		File audioFile = new File("Ping.aiff");
            		AudioFormat format = AudioSystem.getAudioFileFormat(audioFile).getFormat();
           		DataLine.Info info = new DataLine.Info(Clip.class, format);
            		Clip clip = (Clip)AudioSystem.getLine(info);
 
 	    		clip.open(AudioSystem.getAudioInputStream(audioFile));
            		clip.start();
 	    		clip.drain();
 	    		clip.close();
         	}
         	catch(Exception e){
              		e.printStackTrace();
        	}
 	}
 }




***マウスイベント [#af6e2c9d]

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。
以下のようにするとイベントをうけとれるます。

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{
 	
 	public void mouseClicked(MouseEvent e) {
 		System.out.println("mouse clicked!");
 	}
 	public void mouseEntered(MouseEvent e) {
 		System.out.println("mouse entered!");
 	}
 	public void mouseExited(MouseEvent e) {
 		System.out.println("mouse exited!");
 	}
 	public void mousePressed(MouseEvent e) {
 		System.out.println("mouse pressed!");
 	}
 	public void mouseReleased(MouseEvent e) {
 		System.out.println("mouse released!");
 	}
 	public void mouseDragged(MouseEvent e) {
 		System.out.println("mouse dragged!");
 	}
 	public void mouseMoved(MouseEvent e) {
 		System.out.println("mouse moved!");
 	}
 	
 	public static void main(String[] args) {
 		MouseTest test = new MouseTest();
 		test.setTitle("MouseTest");
 		test.addMouseListener(test);
 		test.addMouseMotionListener(test);
 		test.setSize(400,300);
 		test.setVisible(true);
 		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 }




***前回の宿題:プログラム13.6 の提出 [#w5aa4f17]

プログラム13.6 の、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**2011年6月14日 [#r8e0df83]

***宿題提出お願い [#e58134ff]

前回、プログラム12.4をやってくる宿題をお願いしました。
この、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

**第13章 様々なコンポーネントとレイアウト [#p514292b]

***13.2節を読んで,プログラム13.2を実行させてください [#x99eae01]

ボタンが一つしかないプログラムなので、ActionPerformedの中で、
ボタン種類のチェックを省略してしまっているところが特徴です。

***演習13.1をやってください [#x826383d]

こんなのをつくってください。

http://gyazo.com/999f1e766551a994186cc3d159bde0bf.png


BorderLayoutでもできるようですが、私はGridLayour使ってみました。

  		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearbutton);


ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。



解答例

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class JTextFieldSample extends JFrame implements ActionListener {
 	JButton button, clearButton;
 	JTextField textleft, textright;
 	
 	JTextFieldSample(String title) {
 		setTitle(title);
 		button = new JButton("left to right");
 		clearButton = new JButton("clear");
 		button.addActionListener(this);
 		clearButton.addActionListener(this);
 		
 		textleft = new JTextField(10);
 		textright = new JTextField(10);
 		JPanel panel=new JPanel();
 		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearButton);
 		Container container=this.getContentPane();
 		container.add(panel);
 	}
 	
 	public void actionPerformed(ActionEvent e) {
 		if(e.getSource()==(button)) {
 			textright.setText(textleft.getText());
 			textleft.setText("");
 		}else if(e.getSource()==(clearButton)) {
 			textright.setText("");
 		}
 	}
 	
 	public static void main(String[] args) {
 		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
 		sample.pack();
 		sample.setVisible(true);
 		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 }

***13.5節を読んで,プログラム13.5を実行してください [#s313095e]

http://gyazo.com/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。


***演習13.2をやってください(メニュー項目は何でも良いです) [#p70facf6]

演習ができそうにないという人は、飛ばして、次に進んでください。

http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png

***13.6節を読んで,プログラム13.6を実行してください [#k46432fe]


教科書203ページのプログラム13.6の5行めのところに、

 ... implements ActionListener6: {

とありますが、これは、

 ... implements ActionListener {

の間違いのようです。



***宿題:プログラム13.6 [#c4a78be5]


***今日のレポート [#df5adb78]
今日作ったメニューを出すプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。






**2011年6月7日 [#sd341923]

***写真読み込みの高速化 [#k61f68a8]

上記の例では写真データを1バイトずつ読み書きしていました。
InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。
たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。
そこで、複数バイト読み書きするよう、上記のプログラムを変更して、
実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。


 read
 
 public int read(byte[] b)
          throws IOException
 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
 実際に読み込まれたバイト数は整数として返されます。
 このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
 あるいは例外がスローされるまでブロックします。

を使って読みこみ、

 write
 
 public void write(byte[] b,
                   int off,
                   int len)
            throws IOException
 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。

-ヒント


 		byte[] data = new byte[512];

という配列を用意して、

 			int datalength;
 			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

とします。

-解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
 //データはテキストじゃなくて、バイナリーです。
 
 public class URLJpeg2 {
 	public static void main (String argv[]) {
 		byte[] data = new byte[512];
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int datalength;
 			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }



***引数のURLをファイルにするプログラムを考えてみましょう [#adbbd1cc]



curlというコマンドがあります。

 curl http://ocha.ac.jp/

などとすると、htmlが見られますし、

 curl http://is.ocha.ac.jp/~siio/cat.jpg > cat.jpg

などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。




**第12章 Swing [#jc3ec655]


***とても簡単なウィンドウ [#pf50fabe]

 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 }



*** JFrameを継承するプログラミング [#f7cfd710]
 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setSize(200,100);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }

***ラベルを表示するウィンドウ [#m42ec104]

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。



http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png


解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JLabel label = new JLabel("Hello!");
 		Container container = this.getContentPane();
 		container.add(label);
 		this.pack();
 		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 
 }

***ボタンを2個表示するウィンドウ [#zcb3c7e0]

プログラム12.2をみてください。
getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、
貼付けられるのは一つのボタンだけのようです。
パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、
2個のボタンを出してみよう。


http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleButton extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JPanel panel = new JPanel();
 		JButton button1 = new JButton("button1");
 		JButton button2 = new JButton("button2");
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);	
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }


このプログラムでは,ボタンを押しても何もおこりません.

ボタンが押されたイベントを受け取るためには,
+ActionListenerをimplementしたクラスを作る
+そのインスタンスを作る
+これをボタンにaddActionListener()で登録する
必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {

ヒント2(最初の5行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {

解答例

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 	
 		JPanel panel = new JPanel();
 		button1 = new JButton("button1");
 		button2 = new JButton("button2");
 		button1.addActionListener(this);
 		button2.addActionListener(this);
 
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public void actionPerformed (ActionEvent e) {
 		if(e.getSource()==button1) 
 			System.out.println("Hello");
 		else
 			System.out.println("Goodbye");
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }



***宿題:プログラム12.4 [#da5c7eab]


***今日のレポート [#s263774b]
ボタンを押すとHelloとGoodbyeを表示するプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**2011年5月31日 [#tfaa3443]

**第11章 入出力 [#l7b5e96d]

***整数を出力する例 [#q67be3ca]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


これでdout.datという名前のファイルができあがるはずです。 作ったファイルを

 od -h dout.dat
 
または

 hexdump dout.dat

してみてください

 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004




***整数を入出力する例 [#ab67367f]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readInt());
 			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


***演習11.1 をやってください [#u15c2697]

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください

解答例


 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		try {
                        int i;
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


***プログラム11.3をやってみてください [#j36ec2b3]


作ったファイルを
 od -h 
または
 hexdump
してみてください

http://gyazo.com/74c061dfe2fcd6b72885878f867c78ba.png


文字列をかきだすだけならFile Writerでもできる

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			//pwriter.println("Java教科書");
 			fwriter.write("Java教科書");
 			pwriter.close();	
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


つぎに、プログラム11.4を参考にして、
このPrint Write Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作ってください。

ヒント:

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
			 
			 
			 ここに書き足す
			 
			 
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }



***文字ストリームをファイルに書いて読み込むプログラム [#qa7024fe]

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println("java 教科書" + 2001 );
 			pwriter.close();			
 		//writer.txtのファイルの中身をSystem.out.printlnで表示する
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			String tmp;
 			while( (tmp=breader.readLine() ) != null) {
 				System.out.println(tmp);
 			}
 			breader.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }




***プログラム11.5をやってこれを拡張して演習11.2をやってください [#w634d70b]

キーボードから1行入力された文字列によるテキストファイルを作る

http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png

ヒント

  import java.io.*;
  
  public class En112 {
  	public static void main(String[] args) {
  	
  		try {
 
 
 ここにプログラムを書く
  		
  			}
 			catch(IOException e) {
  				System.out.println(e);
   			}
     }
  }



解答例

 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {
 			InputStreamReader ireader = new InputStreamReader (System.in);
 			BufferedReader breaderK = new BufferedReader(ireader);
 			String line = breaderK.readLine();
 			
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(line);
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breaderF = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breaderF.readLine())  != null)
 				System.out.println(tmp);
 			
 			breaderF.close();
 		
 			}
			catch(IOException e) {
 				System.out.println(e);
 			}
 	}
 }


***http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#lfbde62b]

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png


ヒント1

 import java.net.*;

が必要です。

 URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

 InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

 InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

 BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

ヒント2


 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }



解答例:

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
 			BufferedReader breader = new BufferedReader(  isreader );
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }


***写真ファイルのダウンロード [#o00699a2]

 http://is.ocha.ac.jp/~siio/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。
1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。

ヒント2:

 import java.io.*;
 import java.net.*;
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");


というインスタンスを作って、

 istream.read()

で読んで、

 fout.write(1バイト)

で書き出します。

解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラム
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int aData;
 			while((aData  = istream.read()) != -1) fout.write(aData);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }


//引数のURLをファイルにするプログラムを考えてみましょう


***今日のレポート [#a4e9ddff]
写真ファイルのダウンロードのプログラム、
上の例では、URLJpeg.javaとURLJpeg,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。




**2011年5月24日 [#d65c644f]


**第9章 エラーと例外処理 [#o5ae7d88]

次のプログラムを作って試してください。
引数が少ないとエラーが出るのを確認してください。

 public class TestException {
 	public static void main(String argv[]){
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 	}
 }

エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを細くする処置をcatchで指定します。

 public class TestException {
 	public static void main(String argv[]){
 		try{	
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 		}
 		catch (Exception e) {
 			System.out.println("please input 2 words.");
 		}
 	}
 }


**第10章 Stringクラスとコレクションフレームワーク [#f7c5551b]

*** 入力した文字を逆に出力するプログラムを作る [#f811765f]

 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 



ヒント:


 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}



解答例

 public class TestString {
 	public static void main (String argv[]) {
 		try{
 			System.out.println(argv[0]);
 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}
 			System.out.println();
 		}
 		catch (Exception e) {
 			System.out.println("please input a word");
 		}
 	}
 }

である。

***Linked List の練習 [#rf3cc3c1]

サンプルプログラムを実行するときは、

 	LinkedList<String> list = new LinkedList<String>(); 

などと定義すると良い。

***Hash Mapの練習 [#c7470380]


プログラム10.4を参考にして、
以下のように動作する英語ー日本語単語変換プログラムを作れ。


 [e100:?/Documents/java] siio% java EtoJ banana
 バナナ
 [e100:?/Documents/java] siio% java EtoJ apple
 りんご
 [e100:?/Documents/java] siio% java EtoJ 
 Please input an English word


ヒント:
 	HashMap<String,String> map = new HashMap<String,String>();
 
 	map.put("apple","りんご");

ヒント:

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");//ヒント:

解答例:

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");
 	map.put("orange","みかん");
 	map.put("pineapple","パイナップル");
 	map.put("grape","ぶどう");
 	map.put("peach","もも");
 	map.put("melon","メロン");
 	map.put("lemon","レモン");
 	
	try {
 	System.out.println(map.get(args[0]));
 	}
 	catch(Exception e) {
 	System.out.println("Please input an English word");
 	}
 
 	}
 }




**今日のレポート [#v3afbb7e]
EtoJ.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。


**2011年5月17日 [#wa91e082]


*** Osaifuクラスを作ってみよう [#u1b07f1c]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print();
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 
http://gyazo.com/c618901458edc1ba338cab87d2810157.png

-Osaifu.java 解答編

 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

--このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	


*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#jd277840]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。

***コンストラクタ解答編 [#o1ecd512]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }

**第8章 継承 [#fbe1fd5e]

継承の話をしました。
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。

*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#paebc183]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは90円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print()   お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

-動作例

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {


-ヒント:mainはこんな感じ

 	public static void main(String argv[]) {
 		OsaifuUSD saifu1= new OsaifuUSD();
 		OsaifuUSD saifu2=new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}


-解答例


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		okane-=usd * 90;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 90;
 	}
 	
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 		
 	}
 }

*** OsaifuUSDクラスの改造 [#dd0f34db]

OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。
円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。

http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png


-解答例

 	public void print() {
 		super.print();
 		System.out.println("( " + (okane / 90) + " usd )" );
 	}



**今日のレポート [#b1d2a751]
OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。



**2011年5月10日 [#s429e4f5]

-演習問題6.1, 6.2, 6.3

例えば以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

-クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

-Point3Dのメソッドを充実させて次のmain()メソッドで 

 10, 20, 30
 -10, -20, -30

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
        }

-Point3Dに、他の点との距離を返すメソッドを実装して、次のmain()メソッドで 


 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }

--解答例

	
 	double distance ( int ptx, int pty, int ptz ) {
 		int dx = ptx - this.getx();
 		int dy = pty - this.gety();
 		int dz = ptz - this.getz();
 		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
 	}
 	
 	double distance ( Point3D p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}


**今日のレポート [#ka01d916]
Point3D.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。



**2011年4月26日 [#z80b3e84]



**第3章 [#k560ef8c]

-演習

--演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。

--arg[0]とarg[1]をprintlnの中で+でつないで表示する

http://gyazo.com/8159f78165e17781a7110de3763c833c.png


ヒント

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }



解答

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }

**第5章 [#lc235933]

***演習 [#hbfb43f2]

-演習問題5.4(変更)

乱数を10個表示する

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.println(a);
 		}
 	}
 }

次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDEを表示するプログラムを書け。
動作例を以下に示す。

http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png

解答例:

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.print(a + " ");
 			if(a<40) System.out.println("D");
 			else if(a<60) System.out.println("C");
 			else if(a<80) System.out.println("B");
 			else System.out.println("A");
 		}
 	}
 }


-演習問題5.5をやってみよう

http://gyazo.com/1733defca0c709c41c69ea729320ab61.png


解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	year=1;
 	while(okane < 200000) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	 	year++;
 	}
 }
 }


現在の普通預金の金利0.02%だと倍になるのに何年かかるだろうか。確かめてみよう。


http://gyazo.com/7a30f764158c89aeb678481cfa4c157a.png

-演習5.6をやってみよう

while文をfor文に変えてみる


解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	for(year=1;okane < 200000; year++) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	}
 }
 }

 
***for-each文は新しい手法なので練習しましょう [#l9e583d5]


*** 演習 [#n19ca773]

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。

http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png

ヒント:for(String s: args)を使います

-解答例

 
 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }


**今日のレポート [#g6b747db]

-Score.javaとclass (いずれかのバージョン1つで可)
-Kinri.javaとclass (いずれかのバージョン1つで可)
-ArgsTestまたはArgsTest2.javaとclass (いずれかのバージョン1つで可)

を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。





**2011年4月19日 [#z1d7b372]

**javaのマニュアル [#ud3563e4]

//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html

//http://java.sun.com/javase/ja/6/docs/ja/api/index.html

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html




** 出来上がったプログラムの提出方法 [#p1d9f43e]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiroのように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

http://gyazo.com/4b3bd729de9a5bff13fadef9d2f3f1d7.png

http://gyazo.com/78afe2136aced11e393a50336a5fa706.png

http://gyazo.com/35618d5a0582802a7888b3ee50ba3cf2.png

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png




***教科書 [#c5ade86e]

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

http://www.amazon.co.jp/dp/4883732258/

買ってください。もしくは、先輩から安く譲ってもらってください。

*** この講義の目的 [#w1dddb73]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

*** この講義の順序 [#ef8ce6d5]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる

*** 成績評価 [#e66b2a03]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)


**第1章および第2章 [#gb6877ed]


*** Mac OS XでJavaを使う [#xa30b155]

Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#w0e3552c]

//#ref(How2Java/terminal.png)

http://gyazo.com/7366bfab668207c6598c4d88ef70d2d4.png

- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)

- メニューのターミナル/環境設定...を開きます。
ここで、テキストを選んで、「テキストをアンチエイリアス処理」に
チェック入れておくとフォントが奇麗なのでおすすめです。

//http://gyazo.com/8aa6f5ab8878bc57c0657b94f5ae7a58.png

- おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。
Javaの場合、ここで「Unicode (UTF-8)」を選んでおくと良いです。

//http://gyazo.com/1b36039be113ef9e8ed04842aaeb3da6.png

- ターミナルから、javac helpとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。

*** miを用意しておく [#hea8a3be]


http://gyazo.com/2c0e58d1b83d396e1fbe6f5d247670ff.png

- Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。

- これも便利なのでdockに入れておくとよいと思います。

http://gyazo.com/7579915fefe1ecd9c0e4e2ddfa55177d.png

*** 超簡単なプログラム(hello world)を作ってみる [#t3b5ece5]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)


- 次に簡単なウィンドウを出してみましょう。

授業の最後の方で紹介する,Swingというフレームワークを使ってウィンドウを出してみます.


 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
//                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }

これを&#x53;impleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.

#ref(How2Java/simplewindow.png)





*ヒューマンインタフェース 2011年前期 [#v9e00594]

**教科書 [#j8e248bf]

http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_AA300_.jpg

http://www.amazon.co.jp/dp/4781912605/

**授業資料 [#i132ebf4]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c4.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c5.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c7.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c8.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c10.ppt.pdf

(授業開始直前や直後に差し替えされている可能性があります。)

**教科書サポートページ [#sa8afa8f]

-http://is.ocha.ac.jp/~siio/index.php?CSL11HCI

//
//** レポート提出いただいている人のリスト [#l8456147]
//
//漏れがありましたら至急 siio@mac.com まで連絡ください
//
// 0820504
// 0820515
// 0820517
// 0820522
// 0820525
// 0820542
//
//
//** レポートのお知らせ [#mb5ebcf0]
//- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
//- 締め切り2010年8月31日火曜日
//-形式分量:A4, 表紙をのぞいて1-2枚程度
//- 提出先:情報科学科5階図書室レポート受付箱もしくはsiio@me.comまでPDFをメール添付
//(メール添付の場合は,確認の返事をします.返事が来ない場合は,受付されていないかもしれません.もう一度催促してください)
//
//*** 課題 [#wd700057]
//
//グラフィカルユーザインタフェース(GUI)は、コンピュータの
//画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、
//操作可能なグラフィカルなオブジェクトを表示して、
//これらをマウスなどの指示装置を用いて操作するユーザインタフェースの
//手法である。
//
//一方、文字だけを表示するディスプレイとキーボードを用いて、
//文字によるコマンドをタイプしてコンピュータを操作する手法を
//コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。
//現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。
//
//この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。
//(ヒントとして示したキーワードをできるだけ多く使用すること)
//
//+ GUIのメリットを考察して述べよ。&br;
//(ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
//+ GUIのデメリットをCUIと比較して考察せよ。&br;
//(ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
//+ 上の問いで考察したGUIのデメリットを解消する手法について述べよ。&br;
//(ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)




* マルチメディアプログラミング実習2010年後期 [#bfe5f02c]

**最終課題提出者一覧 [#ebb9c6fb]

もし、提出したにもかかわらず、ここに掲載されていない人がいましたら、大至急椎尾 (siio@is.ocha.ac.jp) まで連絡ください。

 0820542hasegawayuka.zip
 0820543 柳本望帆.zip
 0920501IimuraNaho.zip
 0920502IkematsuKaori.zip
 0920503YukiIshii.zip
 0920504 IsomuraMitomo.zip
 0920505ichikawashiori.zip
 0920506EriguchiAkiko.zip
 0920507onokeiko11.zip
 0920508okamura.zip
 0920509ogurayukari.zip
 0920510kakizawamiho11.zip
 0920511KAKINOKI.zip
 0920512*Kusaoke Midori 8.zip
 0920513kubota.zip
 0920514koikeeriko.zip
 0920515saitomidori.zip
 0920516kiho.zip
 0920517Shinboakane.zip
 0920518 sugahara iori.zip
 0920519SatokoSuzuki.zip
 0920520takahashi.zip
 0920521Tagyo4.zip
 0920522Tanaka.zip
 0920523tamadamarina.zip
 0920524danke.zip
 0920525ChikugoSaho8-2.zip
 0920526toidasayaka8 2.zip
 0920527tomita.zip
 0920528NishimuraAyano.zip
 0920529HasegawaAyako.zip
 0920530  hayakawa ai.zip
 0920531hayashiayana.zip
 0920532BambaFumie*.zip
 0920533AsamiHigai.zip
 0920534SatokaFujii.zip
 0920535 fujisawasayaka10.zip
 0920536 ChikaMtsueda.zip
 0920537MatsudaNarumi10.zip
 0920538AiMiyata.zip
 0920539makiko.zip
 0920540yanomidori*.zip
 0920541AyanoYoshikuni.zip
 0920542NarumiWatanabe.zip


----------------

**授業時間変更と休講のお知らせ [#v2be72d0]

伊藤先生と椎尾で休講を少なくするよう授業時間を調整しました.
その結果,
マルチメディアI(伊藤先生)の授業と,
マルチメディアプログラミング実習(椎尾)の授業を以下のように
行います.

||3-4時限|5-6時限|7-8時限|備考|
|10月7日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|10月14日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|10月21日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|10月28日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|伊藤出張|
|11月4日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|11月11日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|11月18日|マルチメディアI|マルチメディアI|マルチメディアI|椎尾出張|
|11月25日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|12月2日|休講|休講|休講|伊藤・椎尾出張|
|12月9日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|12月16日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月6日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月13日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月20日|未定|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|伊藤出張?|
|1月27日|未定|自習|自習|伊藤出張?・椎尾出張|

**javaのマニュアル [#pfc3bf8d]
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html


------------

*マルチメディアプログラミングの最終課題 [#i4eac2b7]

-課題:お絵描きプログラムを作成してさらに取扱説明書を作成して1月27日までに提出すること
--この課題のヒントは SimpleDraw をみてください。

** 提出課題として最低やってほしいこと [#g1ae663d]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

** 以下のことができれば加点します [#ie4181a3]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

** 取扱説明書の作り方 [#uca965f7]

-ApplicationsからMicrosoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます
--以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。
--もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。
-がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。


** 出来上がったプログラムの提出方法 [#qde635bc]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)+必要ならばバージョン番号の数字」にしてください。
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

** 締切 [#b8438873]
-締め切りは1月27日とします
--この日までに提出してください
--どうしてもそのあともがんばりたい人は1月30日の11:59pmまでにsiio@mac.comまでメール添付で提出してください
--可能な限り差し替えます(見落とす可能性がありますので保証はできません)




//http://gyazo.com/f306b823044f8e4e08485a715f63d9c5.png


------------


**2010年12月16日 [#a2d9975c]



***他の環境でのGUIプログラミングの例 [#w415a58c]

***X11 [#x20f3af4]

以下の内容の新しいファイル,buttontest.cを作ってください.
printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください.
入力が面倒なら,添付ファイルの
[[buttontest.c:http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=buttontest.c&refer=Lecture]]
をダウンロードしてください.


 #include <X11/Xlib.h>
 #include <stdio.h>
  
 int main (){
 	Display *display = XOpenDisplay (NULL);
 	XEvent event;
 	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
 	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
 	XMapWindow(display, window);
 	XFlush(display);
 
 	while(1) {
 		XNextEvent(display,&event);
 		switch (event.type) {
 		  case KeyPress: 
 			printf("key\n");
 			break;
 		  case ButtonPress:
 			printf("button down\n");
 			printf("button\n");
 			break;
 		  case ButtonRelease:
 			printf("button up\n");
 			break;
 		}
 	}
 	return 0;
 }

以下のコマンドでコンパイルしてください.

 cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.



***Mac OS X [#e56fdd97]

How2MacOSXProgramming を見てください


***iPhone [#c501d5b3]

How2iPhoneProgramming を見てください




*** 線を引く簡単なプログラム [#h75fd4cb]

JPanelのサブクラスを作りました。

 import javax.swing.JPanel;
 import java.awt.Graphics;
 
 public class DrawPanel extends JPanel {
 
 	public void drawLine(int x1, int y1, int x2, int y2){
 		Graphics g = this.getGraphics();
 		g.drawLine(x1, y1, x2, y2);
 	}
  }
 

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。
リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

 
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionListener;
 
 import javax.swing.JFrame;
 
 public class SimpleDraw extends JFrame implements MouseMotionListener {
 
 	int lastx=0, lasty=0, newx, newy;
 	DrawPanel panel;
  
 
 	public void mouseMoved(MouseEvent arg0) {
        }
 
 	public void mouseDragged(MouseEvent arg0) {
 		newx=arg0.getX();
 		newy=arg0.getY();
 		panel.drawLine(lastx,lasty,newx,newy);
 		lastx=newx;
 		lasty=newy;
 	}
 
 
 	private void init() {
 		this.setTitle("Simple Draw");
 		this.setSize(300, 200);
 		this.addMouseMotionListener(this);
 		panel=new DrawPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleDraw frame=new SimpleDraw();
 		frame.init();
 	}
 
 }
 



***Eclipseを使ってみよう [#q1cee94c]

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png


Eclipseで出るwarningは、以下の変数を定義するとなおります

 private static final long serialVersionUID = 42L;

**(冬休みの宿題)上のお絵描きプログラムを改良してください [#gcf17447]

上のプログラムでは,描画すると一筆書きになってしまいます。
これを直して、普通に描画できるようにしてください。
また、
マウスの位置とずれたところに線が引かれるのも直してください。(すこしずらせばok)

ヒント

-マウスのクリックで線を引く最初の座標を指定します.
--マウスのクリックを受け取れるようにMouse Listenerもimplementします
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/event/MouseListener.html
//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/event/MouseListener.html



**2010年12月9日 [#uc5b8a45]

***オブジェクト指向用語の復習 [#fb523e72]

 import javax.swing.*;
 public class SimpleWindow extends JFrame {
 	public static void main(String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.setVisible(true);
 	}
 }

で,非常に簡単なウィンドウが出ます.
ここで何をやっているのか,オブジェクト指向の用語を使って説明してみましょう.

***継承することのメリットを考えてみよう [#kc1e6692]


**ボタンが押されたイベントを処理する方法 [#a8b332d2]

先週作った,
プログラム12.2をみてください。
このプログラムでは,ボタンを押しても何もおこりません.



http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png


プログラム12.2

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleButton extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JPanel panel = new JPanel();
 		JButton button1 = new JButton("button1");
 		JButton button2 = new JButton("button2");
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);	
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }


ボタンが押されたイベントを受け取るためには,
+ActionListenerをimplementしたクラスを作る
+そのインスタンスを作る
+これをボタンにaddActionListener()で登録する
必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {

ヒント2(最初の5行です)

 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {

解答例

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 
 public class SimpleButton extends JFrame implements ActionListener {
 
 JButton button1, button2;
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 	
 		JPanel panel = new JPanel();
 		button1 = new JButton("button1");
 		button2 = new JButton("button2");
 		button1.addActionListener(this);
 		button2.addActionListener(this);
 
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public void actionPerformed (ActionEvent e) {
 		if(e.getSource()==button1) 
 			System.out.println("Hello");
 		else
 			System.out.println("Goodbye");
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }


***13.2節を読んで,プログラム13.2を実行させてください [#i438bee9]

ボタンが一つしかないプログラムなので、ActionPerformedの中で、
ボタン種類のチェックを省略してしまっているところが特徴です。

***演習13.1をやってください [#sdce6759]

http://gyazo.com/7932a0e8327be4ebd2f6c90e620d8c90.png

BorderLayoutでもできるようですが、私はGridLayour使ってみました。

  		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearbutton);


ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。
演習ができそうにないという人は、飛ばして、次に進んでください。

***13.5節を読んで,プログラム13.5を実行してください [#o3541e7f]

http://gyazo.com/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。

***演習13.2をやってください(メニュー項目は何でも良いです) [#j172984f]

演習ができそうにないという人は、飛ばして、次に進んでください。

http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png

***13.6節を読んで,プログラム13.6を実行してください [#qae92fdf]

教科書203ページのプログラム13.6の5行めのところに、

 ... implements ActionListener6: {

とありますが、これは、

 ... implements ActionListener {

の間違いのようです。


***レポート提出 [#uc2bae63]

演習ができたかどうかに従って、以下の3本から5本のプログラム(.javaと.class)を
いつものように学籍番号+名前のフォルダに入れて、圧縮して提出してください。

+プログラム13.2
+演習13.1のプログラム
+プログラム13.5
+演習13.2のプログラム
+プログラム13.6


**2011年11月25日 [#uca39ac8]

*** 写真ファイルのダウンロード (先週の宿題のヒント) [#hb2d0655]

 http://is.ocha.ac.jp/~siio/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント:
InputStream?のインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

 import java.io.*;
 import java.net.*;
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");

というインスタンスを作って、

 istream.read()

で読んで、

 fout.write(1バイト)

で書き出します。


解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラム
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int aData;
 			while((aData  = istream.read()) != -1) fout.write(aData);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

***高度な課題 [#ybbaabcd]

上記の例では写真データを1バイトずつ読み書きしていました。
InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。
たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。
そこで、複数バイト読み書きするよう、上記のプログラムを変更して、
実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。


 read
 
 public int read(byte[] b)
          throws IOException
 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
 実際に読み込まれたバイト数は整数として返されます。
 このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
 あるいは例外がスローされるまでブロックします。

を使って読みこみ、

 write
 
 public void write(byte[] b,
                   int off,
                   int len)
            throws IOException
 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。




**とても簡単なウィンドウ [#pdc834a9]

 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 }

**継承を使ったプログラム [#m61c1f6b]

 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setSize(200,100);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main(String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 
 }

**ラベルを表示するウィンドウ [#n0964e4a]

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。



http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png


解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JLabel label = new JLabel("Hello!");
 		Container container = this.getContentPane();
 		container.add(label);
 		this.pack();
 		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 
 }

**ボタンを2個表示するウィンドウ [#od0ae709]

プログラム12.2をみてください。
getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、
貼付けられるのは一つのボタンだけのようです。
パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、
2個のボタンを出してみよう。


http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

 import javax.swing.*;
 import java.awt.*;
 
 public class SimpleButton extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		
 		JPanel panel = new JPanel();
 		JButton button1 = new JButton("button1");
 		JButton button2 = new JButton("button2");
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);	
 	
 		this.pack();		
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 
 	public static void main(String argv[]) {
 		SimpleButton sw = new SimpleButton();
 		sw.initialize();
 	}
 
 }



**2010年11月11日 [#l915a1df]



***プログラム11.3をやってみてください [#xae331eb]

作ったファイルを
 od -h
または
 hexdump
してみてください


http://gyazo.com/74c061dfe2fcd6b72885878f867c78ba.png

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


***演習11.1 をやってください [#j9671b69]

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください


作った.java .class dout.datをいつもの方法で提出してください。

解答例


 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		int i;
 		try {
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }




つぎに、プログラム11.4を参考にして、
このPrint Write Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作ってください。

ヒント:

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
			 
			 
			 ここに書き足す
			 
			 
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }





***文字ストリームをファイルに書いて読み込むプログラム [#kc71a2db]

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println("java 教科書" + 2001 );
 			pwriter.close();			
 		//writer.txtのファイルの中身をSystem.out.printlnで表示する
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			String tmp;
 			while( (tmp=breader.readLine() ) != null) {
 				System.out.println(tmp);
 			}
 			breader.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }



***プログラム11.5をやってこれを拡張して演習11.2をやってください [#be98e5b8]

キーボードから1行入力された文字列によるテキストファイルを作る

http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png



ヒント

  import java.io.*;
  
  public class En112 {
  	public static void main(String[] args) {
  	
  		try {
 
 
 ここにプログラムを書く
  		
  			}
 			catch(IOException e) {
  				System.out.println(e);
   			}
     }
  }




解答例

 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {
 			InputStreamReader ireader = new InputStreamReader (System.in);
 			BufferedReader breaderK = new BufferedReader(ireader);
 			String line = breaderK.readLine();
 			
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(line);
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breaderF = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breaderF.readLine())  != null)
 				System.out.println(tmp);
 			
 			breaderF.close();
 		
 			}
			catch(IOException e) {
 				System.out.println(e);
 			}
 	}
 }


***http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#c85c3e59]

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png


ヒント1

 import java.net.*;

が必要です。

 URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

 InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

 InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

 BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

ヒント2


 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }




ヒント3


 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
 			BufferedReader breader = new BufferedReader(  isreader );
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }



解答例:

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
 			BufferedReader breader = new BufferedReader(  isreader );
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }


***宿題:写真ファイルのダウンロード [#t140dd8b]

 http://is.ocha.ac.jp/~siio/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。
1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。



//////////////

**2010年11月4日 [#abb03659]



*** OsaifuUSDクラスの改造 [#h745266d]

OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。
円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。

http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png


-解答例

 	public void print() {
 		super.print();
 		System.out.println("( " + (okane / 90) + " usd )" );
 	}



**エラーと例外処理 [#m1e76172]

次のプログラムを作って試してください。
引数が少ないとエラーが出るのを確認してください。

 public class TestException {
 	public static void main(String argv[]){
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 	}
 }

以下のように動きます。

 e100:java siio$ java TestException Itiro Siio
 Itiro Siio
 Nice to meet you.

でも引数の数が足りないとエラーになります。

 e100:java siio$ java TestException Itiro
 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
 	at TestException.main(TestException.java:3)


エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを細くする処置をcatchで指定します。

 public class TestException {
 	public static void main(String argv[]){
 		try{	
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 		}
 		catch (Exception e) {
 			System.out.println("please input 2 words.");
 		}
 	}
 }

このようにすると、エラーが起きたときに、catchのブロックに移行し、以下のようにメッセージが出力されます。

 e100:java siio$ java TestException Itiro
 please input 2 words.


*** 入力した文字を逆に出力するプログラムを作る [#x56f5f80]

 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 

このソースは、


 public class TestString {
 	public static void main (String argv[]) {
 		try{
 			System.out.println(argv[0]);
 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}
 			System.out.println();
 		}
 		catch (Exception e) {
 			System.out.println("please input a word");
 		}
 	}
 }

である。

***Linked List の練習 [#u5e739e0]

サンプルプログラムを実行するときは、

 	LinkedList<String> list = new LinkedList<String>(); 

などと定義すると良い。

***Hash Mapの練習 [#j2ab484f]


プログラム10.4を参考にして、
以下のように動作する英語ー日本語単語変換プログラムを作れ。


 [e100:?/Documents/java] siio% java EtoJ banana
 バナナ
 [e100:?/Documents/java] siio% java EtoJ apple
 りんご
 [e100:?/Documents/java] siio% java EtoJ 
 Please input an English word

ヒント:


 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");
 	map.put("orange","みかん");
 	map.put("pineapple","パイナップル");
 	map.put("grape","ぶどう");
 	map.put("peach","もも");
 	map.put("melon","メロン");
 	map.put("lemon","レモン");
 	
	try {
 	System.out.println(map.get(args[0]));
 	}
 	catch(Exception e) {
 	System.out.println("Please input an English word");
 	}
 
 	}
 }



***整数を出力する例 [#hfca3bd1]


 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
			  
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


これでdout.datという名前のファイルができあがるはずです。
作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください

 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004


***整数を入出力する例 [#ec9f6ca0]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readInt());
 			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }

////////////////


**2010年10月28日 [#v435c86e]


***	他の点との距離を返すメソッドの例を説明しました [#m4c49d96]

 	double distance ( int ptx, int pty ) {
 		int dx = ptx - this.x;
 		int dy = pty - this.y;
 		return  Math.sqrt(dx * dx + dy * dy);
 	}
 	
 	double distance ( Point p ) {
 		return this.distance(p.getx(), p.gety());
 	}

distanceという名前は同じでも、引数の違いで、異なる動作をさせることができます。
これをメソッドのオーバーロードと呼びます。

-Point3Dに、他の点との距離を返すメソッドを実装して、次のmain()メソッドで 


 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう



        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }

--解答例

	
 	double distance ( int ptx, int pty, int ptz ) {
 		int dx = ptx - this.x;
 		int dy = pty - this.y;
 		int dz = ptz - this.z;
 		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
 	}
 	
 	double distance ( Point p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}



*** Osaifuクラスを作ってみよう [#yb49245b]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print();
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 
http://gyazo.com/c618901458edc1ba338cab87d2810157.png


-Osaifu.java 解答編

 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

--このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	


*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#cd7d9e23]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。

***コンストラクタ解答編 [#f93d76fe]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }




継承の話をしました。
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。

*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#rf243f1e]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは90円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print()   お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

-動作例

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {


-ヒント:mainはこんな感じ

 	public static void main(String argv[]) {
 		OsaifuUSD saifu1= new OsaifuUSD();
 		OsaifuUSD saifu2=new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}

-解答例


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		okane-=usd * 90;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 90;
 	}
 	
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 		
 	}
 }
 
または、outUSD, inUSDで親のin, outを活用して以下のようにしても良い

 	public int outUSD(int usd) {
 		return  this.out(usd * 90) / 90;
 	}
 
 	public void inUSD(int usd) {
 		this.in(usd * 90);
 	}

///////////////////



**2010年10月21日 [#xc0e1799]


***クラスとインスタンスの説明をしました [#d93558d4]
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる

***プログラム6.1-6.4を作ってみてください。 [#me831a1a]


***public static void main の説明をしました [#n1ea173d]
-javaコマンドは、引数のクラスのクラスメソッドmainを実行します
--staticと付いているのがクラス変数、クラスメソッドの印です
-Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます


***変数にはメソッド経由でアクセスするのが良いという説明をしました [#cf57b0a1]
-変数の型などを将来変更してもメソッドの書き換えで対応できます

 public class Point {
 	private int x, y;
 	void set(int newx, int newy) {x=newx; y=newy;}
 	int getx() { return x;}
 	int gety() { return y;}
 
 	void print () {
 		System.out.println(x + ", " + y);
 	}
 
 	public static void main(String argv[]) {
 		Point pt1= new Point();
 		Point pt2 = new Point();
 		pt1.set(10,20);
 		pt2.set(-pt1.getx(), -pt1.gety());
 		pt1.print();
 		pt2.print();
 	}
 
 }

***演習 [#u55ed479]

-演習問題6.1, 6.2, 6.3

例えば以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

-クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

-Point3Dのメソッドを充実させて次のmain()メソッドで 

 10, 20, 30
 -10, -20, -30

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
        }

///////////////////////////////////





**2010年10月14日 [#a807a014]


***演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。 [#vb1a89ec]


***配列の定義方法 [#yac340d6]

クラスのインスタンス化(後日説明します)と同じやりかたですので、
覚えておきましょう。教科書39ページにあるように、

 int[] vec;
 vec = new int[3];

または、これを1行にまとめて、

 int[] vec = new int[3];

と書きます。

vecというのは、ここで作った変数の名前です。
int型の変数を3個分だけ格納するメモリー領域を、new int[3]というコマンドで作ります。
C言語では、malloc()でメモリーを確保するのと同じことです。
その領域を、参照するために、vecという変数を使います。C言語のポインターと同じです。

***コマンドライン引数の表示 [#z50416fd]

-args[0]も文字列です。表示してみましょう。


 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }


-args[1]もためしてみましょう。args[]は、引数文字列の配列です。

***args[0]とargs[1]をprintlnの中で+でつないで表示するプログラムを作ってください [#a72e79c4]

http://gyazo.com/8159f78165e17781a7110de3763c833c.png


解答

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }



***演習問題5.4(変更) [#ub05448b]

乱数を10個表示する

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.println(a);
 		}
 	}
 }

次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDEを表示するプログラムを書け。
動作例を以下に示す。

http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png


解答例:

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.print(a + " ");
 			if(a<40) System.out.println("D");
 			else if(a<60) System.out.println("C");
 			else if(a<80) System.out.println("B");
 			else System.out.println("A");
 		}
 	}
 }


***演習問題5.5をやってみよう [#z8ae98e9]

http://gyazo.com/1733defca0c709c41c69ea729320ab61.png


解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	year=1;
 	while(okane < 200000) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	 	year++;
 	}
 }
 }

現在の普通預金の金利0.02%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://gyazo.com/02e29fc82d2706a2a01516d325100b25.png
//http://gyazo.com/95cd94db39b407e7961355b20da8fc67.png

***演習5.6をやってみよう [#z4ac1759]

while文をfor文に変えてみる


解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	for(year=1;okane < 200000; year++) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	}
 }
 }


***モンテカルロ法で円周率を計算してみる(ループの練習) [#k9284ef5]

--1x1の正方形のエリアにランダムに矢を当てた場合、1/4円の中に当たる矢の数は、
面積に比例すると考えられます。あたりの矢の割合を調べれば円周率がわかります。

http://gyazo.com/e4f68c7ed1045c10801ec201ed00b5e6.png



-- MonteCarlo.java というファイルを作ります。
--まずは100個乱数を表示するプログラムを作ってみましょう。

 class MonteCarlo {  
 public static void main (String args[]) {
 	int i;
 	for(i=0;i<100;i++)
         System.out.println(Math.random());
         }
 }

矢の落下点x,yをランダムな位置にするには、乱数で指定します。
これがあたりかどうかは、原点からの距離で調べます

 			x = Math.random();
 			y = Math.random();
 			if(x*x + y*y < 1)  hit++;

--100個の矢、1000個の矢などいろいろためしてで円周率を計算してみてください



-- 解答例です

 class MonteCarlo {
 	public static void main (String args[]) {
 		int i;
 		double hit = 0;
 		double x, y;
 		for(i=0;i<1000;i++) {
 			x = Math.random();
 			y = Math.random();
 			if(x*x + y*y < 1) {
 				hit++;
 			}
 		}
 		System.out.println(4 * hit / 1000);	
 	}
 }



***for-each文は新しい手法なので練習しましょう [#v7b9965b]

-プログラム5.7の代わりに以下をやってみよう

 class ArrayTest {  
 public static void main (String args[]) {
 	int[] vec = new int[3];
 	vec[0]=1;
 	vec[1]=2;
 	vec[2]=3;
 	for (int x: vec) {
 	     System.out.println(x);
 	     }
        }
 }


http://gyazo.com/46937d835776a23a845ca5aa641b93c9.png

*** 演習 (これを提出してください) [#s61efa50]

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。

http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png

ヒント:for(String s: args)を使います


-解答例

 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }


//--arg[]の文字をすべてfor-each文で表示する

// javac ArgsTest2 cat dog cow fox
// catdogcowfox

//ヒント

//--arg[]の文字をすべてfor-each文で+つけて表示する
//
// javac ArgsTest2 cat dog cow fox
// cat + dog + cow + fox


//arg[0]とarg[1]をつないで表示する
//演習5.5 10万円が20万円になる年
//arg[]の文字をすべてfor-each文で表示する
//--演習4.2をarg[0]に対してやってみよう


**2010年10月7日 [#o65d0fea]

***教科書 [#zec2f17a]

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

http://www.amazon.co.jp/dp/4883732258/

買ってください。もしくは、先輩から安く譲ってもらってください。

***javaのマニュアル [#u48e785a]

//http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html


*** この講義の目的 [#za30032e]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

*** この講義の順序 [#j02bc3d8]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる

*** 成績評価 [#ja12b7bb]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)

-不可になる条件(いかのいずれか)
--出席回数60%未満(ただしJavaエキスパートを除く)
--最終課題未提出

*** Mac OS XでJavaを使う [#ac54bb8b]

Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#jeb4e7cf]

//#ref(terminal.png)

http://gyazo.com/7366bfab668207c6598c4d88ef70d2d4.png


- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)

- メニューのターミナル/環境設定...を開きます。
ここで、「テキストをアンチエイリアス処理」に
チェック入れておくとフォントが奇麗なのでおすすめです。

- おなじウィンドウの詳細タブを選ぶと、「文字エンコーディング」という項目があります。
Javaの場合、ここで「Unicode (UTF-8)」を選んでおくと良いです。

- ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。

*** miを用意しておく [#ee86e501]

http://gyazo.com/2c0e58d1b83d396e1fbe6f5d247670ff.png

- Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。

- これも便利なのでdockに入れておくとよいと思います。

http://gyazo.com/7579915fefe1ecd9c0e4e2ddfa55177d.png

*** 超簡単なプログラム(hello world)を作ってみる [#o5e53d88]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)



*** GUIのプログラムをする  (Swing編) [#d3edf7c8]

- 次に簡単なウィンドウを出してみましょう。


 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }


これを&#x53;impleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。

#ref(How2Java/simplewindow.png)


以上のプログラムが完成したら、以下の方法で提出してください。


** 出来上がったプログラムの提出方法 [#if976ef9]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiroのように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

http://gyazo.com/4b3bd729de9a5bff13fadef9d2f3f1d7.png

http://gyazo.com/78afe2136aced11e393a50336a5fa706.png

http://gyazo.com/35618d5a0582802a7888b3ee50ba3cf2.png

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png




*ヒューマンインタフェース 2010年前期 [#s196ec49]

** レポート提出いただいている人のリスト [#race8740]

漏れがありましたら至急 siio@mac.com まで連絡ください

 0820504
 0820515
 0820517
 0820522
 0820525
 0820542


** レポートのお知らせ [#h8dad2d5]
- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
- 締め切り2010年8月31日火曜日
-形式分量:A4, 表紙をのぞいて1-2枚程度
- 提出先:情報科学科5階図書室レポート受付箱もしくはsiio@me.comまでPDFをメール添付
(メール添付の場合は,確認の返事をします.返事が来ない場合は,受付されていないかもしれません.もう一度催促してください)

*** 課題 [#s66c5e4c]

グラフィカルユーザインタフェース(GUI)は、コンピュータの
画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、
操作可能なグラフィカルなオブジェクトを表示して、
これらをマウスなどの指示装置を用いて操作するユーザインタフェースの
手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、
文字によるコマンドをタイプしてコンピュータを操作する手法を
コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。
現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。
(ヒントとして示したキーワードをできるだけ多く使用すること)

+ GUIのメリットを考察して述べよ。&br;
(ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
+ GUIのデメリットをCUIと比較して考察せよ。&br;
(ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
+ 上の問いで考察したGUIのデメリットを解消する手法について述べよ。&br;
(ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)




* 集中演習「ヒューマンインタフェース」出題範囲 (2009年後期) [#wa972995]

-以下の資料の4.3節から出題します.読んできてください.
--http://is.ocha.ac.jp/~siio/pdf/affordance.pdf

* 英文購読からの集中演習出題範囲(2009年後期) [#cde2fd69]

-30 pageのSensors and Actuatorsの節
-64 pageのAnalogue Inputの節
-このページに該当するPDFファイルは以下です
--http://is.ocha.ac.jp/~siio/pdf/arduino3064.pdf



* マルチメディアプログラミング実習2009年後期 [#zb14a55d]

** 最終課題の提出状況 [#t03c010e]

2/1 15時現在の状況です.
出したけどここに掲載されていないという人は,
至急,椎尾(siio@mac.com)まで連絡ください.
そのときに,課題を添付して送っていただけると良いかと思います.

//http://gyazo.com/80f7e5b072218e821921a243d08d9b5f.png
//http://gyazo.com/dbf3a594cc428b99b57abcaf287e2657.png
//http://gyazo.com/d9b14d57f668c558b5a0455f7917daab.png
http://gyazo.com/e432bdf2525cf3789da670463222d2c0.png



**2010年1月の予定 [#tc422e5d]

椎尾です。昨夜から熱が出て、今朝はだいぶよくなったのですが、
新型インフルエンザだといけないので、念のために欠席します。
申し訳ありませんが1月14日はTAのみなさんの指導を受けて、昨年から説明している、以下の最終課題(お絵かきプログラム)を
進めてください。(1月14日10pm 椎尾)

||5--8時限|備考|
|1月14日|課題をすすめてください。TAが対応します|椎尾急病で欠席。出欠はとります|
|1月21日|課題をすすめてください。椎尾とTAが対応します。|出欠とります|
|1月28日|自主的に課題をすすめてください。TAが対応します| 椎尾海外出張で休講 。出欠とりません|


*マルチメディアプログラミング2009の最終課題 [#lfcc4f58]

-課題:お絵描きプログラムを作成してさらに取扱説明書を作成して1月31日までに提出すること
--この課題のヒントは SimpleDraw をみてください。

** 提出課題として最低やってほしいこと [#c736dbb7]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

** 以下のことができれば加点します [#c6239070]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

** 取扱説明書の作り方 [#f3fb1e56]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。すると画面全体のスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押すとマウスドラッグで任意の場所の部分的なスクリーンショットがとれます
--もしくは、コマンド(リンゴマーク)+シフト+4を押し、さらにスペースキーを押し、任意のウィンドウをクリックすると、そのウィンドウのスクリーンショットがとれます
--以上の操作で、デスクトップにピクチャファイルができます。これをWordかText Editにドラッグアンドドロップします。
--もしくは、デスクトップのピクチャファイルをダブルクリックで開き、欲しい部分を矩形ツールで選択してコピーし、WordかText Editにペーストします
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。
-がんばったところ、大変だったところなどを書いていただいても結構です。また、できれば自力でやって欲しいのですが、だれかに教えてもらったり、web上のサンプルプログラムを参考にした場合は、そのことを説明書に書いてください。また、クラスメートににプログラムを教えた場合も、だれのどこを手伝ったかを書いておいてください。


** 出来上がったプログラムの提出方法 [#nd0338ea]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)+必要ならばバージョン番号の数字」にしてください。
-このフォルダを圧縮してください
-このフォルダを圧縮してください
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

** 締切 [#d4d7a0a2]
-締め切りは1月31日とします
--この日までに提出してください
--どうしてもそのあともがんばりたい人は1月31日の11:59pmまでにsiio@mac.comまでメール添付で提出してください
--可能な限り差し替えます(見落とす可能性がありますので保証はできません)




//http://gyazo.com/f306b823044f8e4e08485a715f63d9c5.png









-----------------------------------------------

**授業時間変更と休講のお知らせ [#ycff2869]

伊藤先生と椎尾で休講を少なくするよう授業時間を調整しました.
その結果,
マルチメディアI(伊藤先生)の授業と,
マルチメディアプログラミング実習(椎尾)の授業を以下のように
行います.

||3-4時限|5-6時限|7-8時限|備考|
|10月1日||休講|休講| 椎尾出張 |
|10月8日|休講|休講|休講| 台風|
|10月15日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|10月22日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|10月29日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|11月5日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|11月12日|マルチメディアI|マルチメディアI|マルチメディアI|伊藤|
|11月19日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|11月26日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|12月3日||休講|休講|椎尾出張|
|12月10日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月14日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月21日||マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月28日||休講|休講| 椎尾出張 |

**javaのマニュアル [#i047c66d]

//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html

http://java.sun.com/javase/ja/6/docs/ja/api/index.html

*2009年12月10日 [#a1728386]

** 宿題(レポート)の提出方法 [#f4341731]
- フォルダを作ってその中にjavaファイルとclassファイルを入れてください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の性か名)」にしてください。
-このフォルダを圧縮してください
-圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

**演習13.1をやってください [#d72f9a6f]

**Eclipseを使ってみよう [#afdf7402]

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

*2009年11月26日 [#c36c1cd2]

**宿題:プログラム12.3 [#lb4b8dc7]

** JFrameを継承するプログラミング [#paf96b14]
 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setSize(200,100);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }


**とても簡単なウィンドウ [#z5c63df4]

 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 }


**写真ファイルのダウンロード [#hb8b0905]

 http://is.ocha.ac.jp/~siio/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
データはテキストじゃなくて、バイナリーです。

ヒント:InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

 import java.io.*;
 import java.net.*;
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");


というインスタンスを作って、

 istream.read()

で読んで、

 fout.write(1バイト)

で書き出します。

解答例

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラム
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int aData;
 			while((aData  = istream.read()) != -1) fout.write(aData);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

**http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#l084a26b]

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png


ヒント

 import java.net.*;

が必要です。

 URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

 InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

 InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

 BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
 			BufferedReader breader = new BufferedReader(  isreader );
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }


**プログラム11.5をやってこれを拡張して演習11.2をやってください [#u84a3840]

キーボードから1行入力された文字列によるテキストファイルを作る

http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png



解答例

 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {
 			InputStreamReader ireader = new InputStreamReader (System.in);
 			BufferedReader breaderK = new BufferedReader(ireader);
 			String line = breaderK.readLine();
 			
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(line);
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breaderF = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breaderF.readLine())  != null)
 				System.out.println(tmp);
 			
 			breaderF.close();
 		
 			}
			catch(IOException e) {
 				System.out.println(e);
 			}
 	}
 }

**プログラム11.3をやってみてください [#s851cdc9]

**文字ストリームをファイルに書いて読み込むプログラム [#o59738a4]

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println("java 教科書" + 2001 );
 			pwriter.close();			
 		//writer.txtのファイルの中身をSystem.out.printlnで表示する
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			String tmp;
 			while( (tmp=breader.readLine() ) != null) {
 				System.out.println(tmp);
 			}
 			breader.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


*2009年11月19日 [#pb7820d0]

**宿題:演習11.1 [#y1916bcc]

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください

解答例


 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		int i;
 		try {
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


**エラーと例外処理 [#vcf05774]

次のプログラムを作って試してください。
引数が少ないとエラーが出るのを確認してください。

 public class TestException {
 	public static void main(String argv[]){
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 	}
 }

エラーが出る可能性のある場所をtryでくくっておき、
エラーが出たらそれを細くする処置をcatchで指定します。

 public class TestException {
 	public static void main(String argv[]){
 		try{	
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 		}
 		catch (Exception e) {
 			System.out.println("please input 2 words.");
 		}
 	}
 }

*** 入力した文字を逆に出力するプログラムを作る [#v688a0e6]

 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 

このソースは、

 public class TestString {
 	public static void main (String argv[]) {
 		try{
 			System.out.println(argv[0]);
 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}
 			System.out.println();
 		}
 		catch (Exception e) {
 			System.out.println("please input a word");
 		}
 	}
 }

である。

***Linked List の練習 [#q6dd5d19]

サンプルプログラムを実行するときは、

 	LinkedList<String> list = new LinkedList<String>(); 

などと定義すると良い。

***Hash Mapの練習 [#me2cf537]


プログラム10.4を参考にして、
以下のように動作する英語ー日本語単語変換プログラムを作れ。


 [e100:?/Documents/java] siio% java EtoJ banana
 バナナ
 [e100:?/Documents/java] siio% java EtoJ apple
 りんご
 [e100:?/Documents/java] siio% java EtoJ 
 Please input an English word

ヒント:

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");
 	map.put("orange","みかん");
 	map.put("pineapple","パイナップル");
 	map.put("grape","ぶどう");
 	map.put("peach","もも");
 	map.put("melon","メロン");
 	map.put("lemon","レモン");
 	
	try {
 	System.out.println(map.get(args[0]));
 	}
 	catch(Exception e) {
 	System.out.println("Please input an English word");
 	}
 
 	}
 }

***整数を入出力する例 [#c632743a]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readInt());
 			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }

**2009年11月5日 [#k677a8bd]

継承の話をしました。
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。

*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#hae9a99d]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは90円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print()   お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

-動作例

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {


-ヒント:mainはこんな感じ

 	public static void main(String argv[]) {
 		OsaifuUSD saifu1= new OsaifuUSD();
 		OsaifuUSD saifu2=new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}

-解答例


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		okane-=usd * 90;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 90;
 	}
 	
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 		
 	}
 }

*** OsaifuUSDクラスの改造 [#ca54a776]

OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。
円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。

http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png


-解答例

 	public void print() {
 		super.print();
 		System.out.println("( " + (okane / 90) + " usd )" );
 	}









**2009年10月29日 [#j1ba2135]


***クラスとインスタンスの説明をしました [#ga0c7913]
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる

***public static void main の説明をしました [#jcb4deb7]
-javaコマンドは、引数のクラスのクラスメソッドmainを実行します
--staticと付いているのがクラス変数、クラスメソッドの印です
-Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます

***変数にはメソッド経由でアクセスするのが良いという説明をしました [#ba845046]
-変数の型などを将来変更してもメソッドの書き換えで対応できます

 public class Point {
 	private int x, y;
 	void set(int newx, int newy) {x=newx; y=newy;}
 	int getx() { return x;}
 	int gety() { return y;}
 
 	void print () {
 		System.out.println(x + ", " + y);
 	}
 
 	public static void main(String argv[]) {
 		Point pt1= new Point();
 		Point pt2 = new Point();
 		pt1.set(10,20);
 		pt2.set(-pt1.getx(), -pt1.gety());
 		pt1.print();
 		pt2.print();
 	}
 
 }

***	他の点との距離を返すメソッドの例を説明しました [#mf4b02dc]

 	double distance ( int ptx, int pty ) {
 		int dx = ptx - this.x;
 		int dy = pty - this.y;
 		return  Math.sqrt(dx * dx + dy * dy);
 	}
 	
 	double distance ( Point p ) {
 		return this.distance(p.getx(), p.gety());
 	}

distanceという名前は同じでも、引数の違いで、異なる動作をさせることができます。
これをオブジェクト指向における多様性、ポリモーフィズム、polymorphismとよびます

(教科書ではモリモーフィズムのことをオーバーロードと書いてあります)

***演習 [#dba19040]

-演習問題6.1, 6.2, 6.3

例えば以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

-クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

-Point3Dのメソッドを充実させて次のmain()メソッドで 

 10, 20, 30
 -10, -20, -30

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
        }

-Point3Dに、他の点との距離を返すメソッドを実装して、次のmain()メソッドで 


 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }

--解答例

	
 	double distance ( int ptx, int pty, int ptz ) {
 		int dx = ptx - this.x;
 		int dy = pty - this.y;
 		int dz = ptz - this.z;
 		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
 	}
 	
 	double distance ( Point p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}


*** Osaifuクラスを作ってみよう [#l72ff24a]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print();
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 
http://gyazo.com/c618901458edc1ba338cab87d2810157.png

-Osaifu.java 解答編

 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

--このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	


*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#k44322fc]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。

***コンストラクタ解答編 [#g4d9c350]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }


///////////////////////////////////


**2009年10月22日 [#w688b4ad]

***演習 [#nbf3ef0e]

-演習問題5.4(変更)

乱数を10個表示する

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.println(a);
 		}
 	}
 }

次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDEを表示するプログラムを書け。
動作例を以下に示す。

http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png

解答例:

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.print(a + " ");
 			if(a<40) System.out.println("D");
 			else if(a<60) System.out.println("C");
 			else if(a<80) System.out.println("B");
 			else System.out.println("A");
 		}
 	}
 }

-演習問題5.5をやってみよう

http://gyazo.com/1733defca0c709c41c69ea729320ab61.png

解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	year=1;
 	while(okane < 200000) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	 	year++;
 	}
 }
 }

現在の普通預金の金利0.04%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://gyazo.com/95cd94db39b407e7961355b20da8fc67.png


-演習5.6をやってみよう

while文をfor文に変えてみる

解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	for(year=1;okane < 200000; year++) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	}
 }
 }

***モンテカルロ法で円周率を計算してみる(ループの練習) [#zbcf4d1b]

--1x1の正方形のエリアにランダムに矢を当てた場合、1/4円の中に当たる矢の数は、
面積に比例すると考えられます。あたりの矢の割合を調べれば円周率がわかります。

http://gyazo.com/e4f68c7ed1045c10801ec201ed00b5e6.png



-- MonteCarlo.java というファイルを作ります。
--まずは100個乱数を表示するプログラムを作ってみましょう。

 class MonteCarlo {  
 public static void main (String args[]) {
 	int i;
 	for(i=0;i<100;i++)
         System.out.println(Math.random());
         }
 }

矢の落下点x,yをランダムな位置にするには、乱数で指定します。
これがあたりかどうかは、原点からの距離で調べます

 			x = Math.random();
 			y = Math.random();
 			if(x*x + y*y < 1)  hit++;

--100個の矢、1000個の矢などいろいろためしてで円周率を計算してみてください

-- 解答例です

 class MonteCarlo {
 	public static void main (String args[]) {
 		int i;
 		double hit = 0;
 		double x, y;
 		for(i=0;i<1000;i++) {
 			x = Math.random();
 			y = Math.random();
 			if(x*x + y*y < 1) {
 				hit++;
 			}
 		}
 		System.out.println(4 * hit / 1000);	
 	}
 }

***for-each文は新しい手法なので練習しましょう [#g0ab1ae3]

-プログラム5.7の代わりに以下をやってみよう

 class ArrayTest {  
 public static void main (String args[]) {
 	int[] vec = new int[3];
 	vec[0]=1;
 	vec[1]=2;
 	vec[2]=3;
 	for (int x: vec) {
 	     System.out.println(x);
 	     }
        }
 }

*** 演習 [#ta2776d4]

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。

http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png

ヒント:for(String s: args)を使います

-解答例

 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }


//--arg[]の文字をすべてfor-each文で表示する

// javac ArgsTest2 cat dog cow fox
// catdogcowfox

//ヒント

//--arg[]の文字をすべてfor-each文で+つけて表示する
//
// javac ArgsTest2 cat dog cow fox
// cat + dog + cow + fox


//arg[0]とarg[1]をつないで表示する
//演習5.5 10万円が20万円になる年
//arg[]の文字をすべてfor-each文で表示する
//--演習4.2をarg[0]に対してやってみよう




**2009年10月15日 [#f59a3871]

*** この講義の目的 [#z3a1e291]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

*** この講義の順序 [#xf258a6b]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる

*** 成績評価 [#jde08afd]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)

*** Mac OS XでJavaを使う [#t5bbbe65]

Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#qfb67f9e]

#ref(How2Java/terminal.png)

- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)

- メニューのターミナル/環境設定...を開きます。
ここで、テキストを選んで、「テキストをアンチエイリアス処理」に
チェック入れておくとフォントが奇麗なのでおすすめです。

http://gyazo.com/8aa6f5ab8878bc57c0657b94f5ae7a58.png

- おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。
Javaの場合、ここで「Unicode (UTF-8)」を選んでおくと良いです。

http://gyazo.com/1b36039be113ef9e8ed04842aaeb3da6.png

- ターミナルから、javac helpとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。

*** miを用意しておく [#b127b6af]

- Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。

- これも便利なのでdockに入れておくとよいと思います。


*** 超簡単なプログラム(hello world)を作ってみる [#wfb4cd78]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)


- 次に簡単なウィンドウを出してみましょう。

授業の最後の方で紹介する,Swingというフレームワークを使ってウィンドウを出してみます.


 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
//                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }

これを&#x53;impleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.

#ref(How2Java/simplewindow.png)


-演習

--演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。

--arg[0]とarg[1]をprintlnの中で+でつないで表示する

http://gyazo.com/8159f78165e17781a7110de3763c833c.png


ヒント

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }

解答

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }

--演習4.2をやってみよう



//-----------------------

*情報と職業2009年前期 [#h0363d04]

** レポートのお知らせ [#rb476591]
- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
- 締め切り2009年8月31日月曜日
-形式分量:A4, 表紙をのぞいて2-3枚程度
- 提出先:情報科学科5階図書室レポート受付箱

*** 課題 [#a82ae71a]

以下の課題についてレポートを書き,まとめて提出してください。


1982年にIBMが発売したIBM PCは,その後のパーソナルコンピュータ (PC) の標準になり,さまざまな改良が施されつつも,現在のほとんどのPCの起源と言える.しかしながら,IBMは主導権をとることができず,PC部門の利益が悪化したため事業から撤退してしまった.一方で,IBMへの部品提供業者として,CPUやOSを提供したインテル社,マイクロソフト社いまだにPC事業が看板部門であり,大きな利益をあげて業界を主導している.

-IBMがPC業界で主導権を失っていった理由を,述べよ.

-あなたが,もし,IBMがPC分野で最盛期を迎えたころにIBM PC部門担当副社長になった
[[ジム・キャナビーノ:http://jibun.atmarkit.co.jp/ljibun01/rensai/gyoukai/004/01.html]]
の立場だったとしたら,この事態をどう立て直すだろうか.考えを述べよ.




*ヒューマンインタフェース 2009年前期 [#jf6a101f]


** レポートのお知らせ [#h7e5637c]
- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
- 締め切り2009年8月31日月曜日
-形式分量:A4, 表紙をのぞいて1-2枚程度
- 提出先:情報科学科5階図書室レポート受付箱

*** 課題 [#idd6a646]

グラフィカルユーザインタフェース(GUI)は、コンピュータの
画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、
操作可能なグラフィカルなオブジェクトを表示して、
これらをマウスなどの指示装置を用いて操作するユーザインタフェースの
手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、
文字によるコマンドをタイプしてコンピュータを操作する手法を
コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。
現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。
(ヒントとして示したキーワードをできるだけ多く使用すること)

+ GUIのメリットを考察して述べよ。&br;
(ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
+ GUIのデメリットをCUIと比較して考察せよ。&br;
(ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
+ 上の問いで考察したGUIのデメリットを解消する手法について述べよ。&br;
(ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)







**授業で使う予定のプレゼン資料(一部) [#fda223e3]
-4/23の授業 http://is.ocha.ac.jp/~siio/lecture/humaninterface/chapter1.pdf
-4/30の授業 http://is.ocha.ac.jp/~siio/lecture/humaninterface/chapter3.pdf

//
//人とモノとのインタフェース http://is.ocha.ac.jp/~siio/lecture/humaninterface/everydaythings.pdf
//グラフィカルユーザインタフェース(GUI) http://is.ocha.ac.jp/~siio/lecture/humaninterface/gui.pdf
//
//レポート締め切り/提出先 †
//締め切り2008年9月8日月曜日
//提出先:情報科学科図書室カウンター(501号室)
//提出方法:A4用紙のレポート。
//↑
//レポート課題 †
//以下の課題についてレポートを書き,まとめて提出してください。
//
//身の回りの道具について以下の考察をせよ.
//以下の日用品を1つ以上例示せよ
//使いやすい/使いにくい道具
//利用者によって貼紙された道具
//上記の日用品が,なぜこのような状態であるかを、分析せよ
//制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、 標準化の問題か、などを議論せよ。
//また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.




*集中演習 (2009年2月) のヒューマンインタフェースの範囲 [#lea77655]

人の短期記憶について説明されている以下の文を読んでおいてください.

-http://is.ocha.ac.jp/~siio/lecture/humaninterface/shorttermmem.pdf

ここに書かれている短期記憶,魔法の数字,チャンクなどの用語を使って,
つぎのような質問に答えていただく記述式の問題を作成する予定です.

+グラフィカルユーザインタフェース(GUI)で用いられるメニューの項目は,5から9項目であることが望ましいと言われている&br;
#ref(menu1.png);
+メニュー項目がどうしてもこれを超える場合には,
--関連項目を線で区切ってまとめて5から9項目のグループにしたり,
--階層的なメニューにして,一階層のメニュー項目を5から9項目にすると良いとされている&br;
#ref(menu2.png);
+このように言われているのはなぜだろうか?人の短期記憶について考察して,その理由を推察して述べよ.






* マルチメディアプログラミング実習2008年後期 [#j66144b6]


**課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること [#r8dfd6f0]

この課題のヒントは SimpleDraw をみてください。

*** 提出課題として最低やってほしいこと [#d0fc90aa]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

*** 以下のことができれば加点します [#u132f143]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください


*** 取扱説明書の作り方 [#y34fb0b7]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
--デスクトップにピクチャxx.pdfというファイルができます
--これをダブルクリックで開きます
--欲しい部分を矩形ツールで選択してコピーします
--WordかText Editにペーストします
-ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。


*** 出来上がったプログラムの提出方法 [#s6eae23f]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
-このフォルダを圧縮してください
-この圧縮したファイルを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)
-締め切りは1月29日の授業終了(4:20pm)とします
--この時間までにとりあえず提出してください
--どうしてもそのあともがんばりたい人は1月29日の11:59pmまでに提出してください
--可能な限り差し替えます(見落としていたらごめん)







**授業時間変更と休講のお知らせ [#k4187dd3]

今年度後期は,伊藤先生と椎尾の出張が多いため,できるだけ休講を少なくするよう授業時間を調整しました.
その結果,
マルチメディアI(伊藤先生)の授業と,
マルチメディアプログラミング実習(椎尾)の授業を以下のように
行います.

||3-4時限|5-6時限|7-8時限|備考|
|10月2日|休講|休講|休講|海外出張|
|10月9日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|10月16日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|10月23日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|10月30日|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|椎尾|
|11月6日|マルチメディアI|マルチメディアI|マルチメディアI|伊藤|
|11月13日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|11月20日|休講 | 休講 |休講|海外出張|
|11月27日|休講|休講|休講|学会出張|
|12月4日|マルチメディアI|マルチメディアI|マルチメディアI|伊藤|
|12月11日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|12月18日|(マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月8日|(月曜授業)|(月曜授業)|(月曜授業)|時間割通り|
|1月15日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月22日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|
|1月29日|マルチメディアI|マルチメディア&br;プログラミング実習|マルチメディア&br;プログラミング実習|時間割通り|




**javaのマニュアル [#x63a0f52]

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

**冬休みの課題 [#p29cf210]

年明けからはEclipseを使います。授業で説明しますが、あらかじめ使ってみておいていただけるとわかりやすいかと思います。Eclipseについてはネット上にたくさん情報があります。本家は以下です。

http://www.eclipse.org/


**2008年12月18日 [#r0422267]

***アニメーションボールの設定ができるアプリケーションを作ってみよう [#bd3fd709]

こういうのを作ってほしい

ヒント: action Performed ではこうしたら良い

 	public void actionPerformed(ActionEvent e) { 
 		String command = e.getActionCommand(); 
 		if(command=="red") g.setColor(Color.red); 
 		if(command=="blue") g.setColor(Color.blue); 

http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=SimpleAnime.class&refer=Lecture


以下の方法で提出してください.

http://is.ocha.ac.jp/~siio/index.php?Lecture#u5201c9d

*** 簡単なアニメーション [#g68f3494]

***動くボールを出す [#p990bf18]
 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 	JPanel panel;
 	Graphics g;
 	
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		panel = new JPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		g=panel.getGraphics();
 		g.setColor(Color.blue);
 
 		int x=0, xdelta=10;
 		while(true) {
 			g.fillOval(x,100,50,50);
 			try{Thread.sleep(50);}catch(Exception e){}
 			g.clearRect(x, 100, 52,52);
 			x+=xdelta;
 			if(x>250) xdelta=-10;
 			if(x<0) xdelta=10;
 		}
 		
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }

***なにもしないウィンドウを出す [#y76a95c7]

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 class SimpleAnime extends JFrame {
 
 	private void init() {
 		this.setTitle("SimpleAnime");
 		this.setSize(300,400);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	public static void main(String[] args) {
 		SimpleAnime frame = new SimpleAnime();
 		frame.init();
 	}
 }


***演習13.1をやってみよう [#q64e9866]

こういうのを作ってほしい

http://is.ocha.ac.jp/~siio/index.php?plugin=attach&pcmd=open&file=JTextFieldSample.class&refer=Lecture

完成したら以下の方法で提出してください.

http://is.ocha.ac.jp/~siio/index.php?Lecture#u5201c9d

**2008年12月11日 [#oc562ea8]

***ボタンのイベントを処理するプログラム [#z8c915cc]

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 
 public class JButtonSample extends JFrame implements ActionListener {
 	
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		
 		JButton button1 = new JButton("Push Me!");
 		JButton button2 = new JButton("Push Me!2");
 		button1.addActionListener(this);
 		button2.addActionListener(this);
 		JPanel panel = new JPanel();
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);
 		this.pack();
 		this.setVisible(true);
 	}
 
 	public void actionPerformed(ActionEvent e) {
 		//System.out.println("hello");
 		System.out.println(e.getActionCommand());
 	}
 
 	public static void main (String argv[]) {
 		JButtonSample w = new JButtonSample();
 		w.initialize();
 	}
 }

***ボタンを表示するプログラム [#rc1a12b3]

 import javax.swing.*;
 import java.awt.*;
 
 public class JButtonSample extends JFrame {
 	
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		
 		JButton button1 = new JButton("Push Me!");
 		JButton button2 = new JButton("Push Me!2");
 		JPanel panel = new JPanel();
 		panel.add(button1);
 		panel.add(button2);
 		Container container = this.getContentPane();
 		container.add(panel);
 		this.pack();
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		JButtonSample w = new JButtonSample();
 		w.initialize();
 	}
 }

*** JFrameを継承するプログラミング [#f64b2fb9]
 import javax.swing.JFrame;
 public class SimpleWindow extends JFrame {
 
 	public void initialize () {
 		this.setTitle("私が作った最初の窓");
 		this.setSize(200,100);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		this.setVisible(true);
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }


***とても簡単なウィンドウ [#gbf60d37]
 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 }

***宿題の提出 [#qc0dc317]

11/13の宿題その1とその2を以下の方法で提出してください.

http://is.ocha.ac.jp/~siio/index.php?Lecture#u5201c9d

**宿題その1解答編 [#e90b5f2a]

 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
 			BufferedReader breader = new BufferedReader(  isreader );
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

**宿題その2解答編 [#m2719634]

 import java.io.*;
 import java.net.*;
 
 //http://is.ocha.ac.jp/~siio/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
 //データはテキストじゃなくて、バイナリーです。
 
 public class URLJpeg {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://is.ocha.ac.jp/~siio/cat.jpg");
 			InputStream istream = targetURL.openStream();
 			
 			FileOutputStream fout = new FileOutputStream("cat.jpg");
 			
 			int aData;
 			while((aData  = istream.read()) != -1) fout.write(aData);
 			
 			istream.close();
 			fout.close();
 			
 			
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }



**2008年11月13日 [#ud1baa3f]

*** 宿題その1 [#e5e5040e]

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう。
ヒント、

 import java.net.*;

が必要です。

 URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

 InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

 InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

 BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

*** 宿題その2 [#g9a16fa5]

 http://is.ocha.ac.jp/~siio/cat.jpg
をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
データはテキストじゃなくて、バイナリーです。

ヒント:InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。


***きょうの復習 [#c89ca37c]

演習11.2

 
 //キーボードから一行打ち込んでファイルに書いて読んで表示する
 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {
 			InputStreamReader ireader = new InputStreamReader (System.in);
 			BufferedReader breaderK = new BufferedReader(ireader);
 			String line = breaderK.readLine();
 			
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(line);
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breaderF = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breaderF.readLine())  != null)
 				System.out.println(tmp);
 			
 			breaderF.close();
 		
 			}
 		catch (FileNotFoundException e) {
 			System.out.println(e);
 			}
 		catch(IOException e) {
 			System.out.println(e);
 			}
 	}
 }

文字ストリームをファイルに書いて読み込むプログラム

 import java.io.*;
 
 public class PrintWriterTest {
 	public static void main(String[] args) {
 	
 		try {
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			for(int i=0; i<10; i++)
 			pwriter.println( i + "----" + 2006 + " Java 教科書");
 			pwriter.close();
 			
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			
 			String tmp=null;		
 			while(  (tmp=breader.readLine())  != null)
 				System.out.println(tmp);
 			
 			breader.close();
 			
 			}
 		catch (FileNotFoundException e) {
 			System.out.println(e);
 			}
 		catch(IOException e) {
 			System.out.println(e);
 			}
 	}
 }

演習11.1

 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		int i;
 		try {
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


バイトストリームをファイルに書いて読み込むプログラム

 import java.io.*;
 
 public class DoutTest {
 
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			
 			dout.writeInt (2006);
 			dout.writeUTF("Java 教科書");
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			
 			System.out.println(dinput.readInt());
 			System.out.println(dinput.readUTF());
 			dinput.close();
 			
 			
 			}
 		catch (FileNotFoundException e) {
 			System.out.println(e);
 			}
 		catch(IOException e) {
 			System.out.println(e);
 			}
 	}
 }

**2008年10月30日 [#j918ff57]

*** エラーと例外処理 [#b33c9252]

名前と名字を入れると挨拶するけど、入力される引数が2文字未満のときにはエラーメッセージを出すプログラムを、tryとcatchを使って作ってみよう

 [e100:?/Documents/java] siio% java TestException Itiro Siio
 Itiro Siio
 Nice to meet you.
 [e100:?/Documents/java] siio% java TestException Itiro 
 please input 2 words.
 [e100:?/Documents/java] siio% 

このプログラムのソースは、

 public class TestException {
 	public static void main(String argv[]){
 		try{
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 		}
 		catch (Exception e) {
 			System.out.println("please input 2 words.");
 		}
 	}
 }

である。

*** 入力した文字を逆に出力するプログラムを作る [#vcef8ceb]
 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 

このソースは、

 public class TestString {
 	public static void main (String argv[]) {
 		try{
 			System.out.println(argv[0]);
 			int len = argv[0].length();
 			for(int i = len - 1; i>=0; i--) {
 				System.out.print(argv[0].charAt(i));
 			}
 			System.out.println();
 		}
 		catch (Exception e) {
 			System.out.println("please input a word");
 		}
 	}
 }

である。

***LinkedList の練習 [#u31c9897]

 	LinkedList<String> list = new LinkedList<String>(); 

と定義すると良い

***HashMapの練習 [#ccb4896e]

以下のように動作する英語ー日本語単語変換プログラムを作れ。

 [e100:?/Documents/java] siio% java EtoJ banana
 バナナ
 [e100:?/Documents/java] siio% java EtoJ apple
 りんご
 [e100:?/Documents/java] siio% java EtoJ 
 Please input an English word

このプログラムのソースは、以下である。

 import java.util.*;
 
 public class EtoJ{
 
 public static void main(String args[]) {
 	HashMap<String,String> map = new HashMap<String,String>();
 	
 	map.put("apple","りんご");
 	map.put("banana","バナナ");
 	map.put("orange","みかん");
 	map.put("pineapple","パイナップル");
 	map.put("grape","ぶどう");
 	map.put("peach","もも");
 	map.put("melon","メロン");
 	map.put("lemon","レモン");
 	
	try {
 	System.out.println(map.get(args[0]));
 	}
 	catch(Exception e) {
 	System.out.println("Please input an English word");
 	}
 	
 	}
 }


**2008年10月23日 [#mbe763f7]

*** Osaifuクラスを作ってみよう [#u10140f7]
-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出勤できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print();
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

*** Osaifu.java 解答編 [#d396e538]
 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

-このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

-このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	

*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#fdc95f69]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。

***コンストラクタ解答編 [#m5808eb6]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }


///////////////////////////////////



*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#c1b79d6f]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります
-スーパークラスのメソッドを上書きするメソッドは以下です
-- void print()   お財布の残高を円とドルで表示します
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

*** OsaifuUSD.java 解答編 [#gff8c13d]

 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		return ( super.out(usd * 97) );
 	}
 
 	public void inUSD(int usd) {
 		super.in( usd * 97);
 	}
 	
 	public void print() {
 	//okane = 230 yen
 	//(2 usd)
 	//と印刷するメソッド
 	super.print();
 	System.out.println("(" + ( super.okane / 97) + "usd)" );
 	}
 
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}
 }


**2008年10月16日 [#naf4af87]

*** Point3Dのメソッドを充実 [#bb872647]

次のプログラムで 

 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }


*** 演習6.1-6.2-6.3をやってみましょう [#o9b405ae]

*** クラスとインスタンスの説明をしました [#fc989baf]

-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数
---例:何個のインスタンスを作ったか?
--クラスメソッド
---例:インスタンスを作れ
--インスタンス変数
--インスタンスメソッド

*** モンテカルロ法で円周率を計算してみる(ループの練習) [#xfbb4c9e]

- MonteCarlo.java というファイルを作ります。
-まずは100個乱数を表示するプログラムを作ってみましょう。

 class MonteCarlo {  
 public static void main (String args[]) {
 	int i;
 	for(i=0;i<100;i++)
         System.out.println(Math.random());
         }
 }

-100個の矢、1000個の矢などいろいろためしてで円周率を計算してみてください
- 解答です

 class MonteCarlo {
 	public static void main (String args[]) {
 		int i;
 		double hit = 0;
 		double x, y;
 		for(i=0;i<1000;i++) {
 			x = Math.random();
 			y = Math.random();
 			if(x*x + y*y < 1) {
 				hit++;
 			}
 		}
 		System.out.println(4 * hit / 1000);	
 	}
 }

*** 授業で作ったプログラムの提出方法 [#j1e53928]

- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら
を入れてください。
//フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
-このフォルダを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)
//-締め切りは1月24日の授業終了(4:20pm)とします
//--この時間までにとりあえず提出してください
//--どうしてもそのあともがんばりたい人は1月24日の11:59pmまでに提出してください
//--可能な限り差し替えます(見落としていたらごめん)





**2008年10月9日 [#y4cdc92a]

*** この講義の目的 [#h437219b]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

*** この講義の順序 [#cc285bdb]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる

*** 成績評価 [#e470e3b3]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)

*** Mac OS XでJavaを使う [#qf44b570]

Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#s99da06b]

#ref(How2Java/terminal.png)

- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)

- メニューのターミナル/ウィンドウ設定...を開きます。
ここで、ディスプレイを選んで、「アンチエイリアス処理を行う」に
チェック入れておくとフォントが奇麗なのでおすすめです。

- おなじウィンドウの下に、「文字セットエンコーディング」というのがあります。
Javaの場合、ここで「日本語(Shift JIS)」を選んでおくと良いです。
この設定は今開いているウィンドウだけに有効です。
以後、この設定をデフォルトにするためには、「設定をデフォルトとして設定」をクリックします。

- ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。

*** miを用意しておく [#dd1eb258]

- Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。

- これも便利なのでdockに入れておくとよいと思います。


*** 超簡単なプログラム(hello world)を作ってみる [#kd9cb9bb]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)

*** 本日やった演習 [#s5c6856b]
-演習3.4 自分の名前の最初の文字の文字コードを表示する
-arg[0]とarg[1]をつないで表示する
-演習5.5 10万円が20万円になる年
-arg[]の文字をすべてfor-each文で表示する


* ヒューマンインタフェース 2008年前期 [#s8da6a94]

//-4/23 「人のパーフォマンス」
//--人の認知モデル,応答速度,Keystroke-Level Model, フィッツの法則についてお話ししました
//-5/1は海外出張のため休講します

** 授業で使う予定のプレゼン資料(一部) [#kbef1aac]

+ 人とモノとのインタフェース http://is.ocha.ac.jp/~siio/lecture/humaninterface/everydaythings.pdf
+ グラフィカルユーザインタフェース(GUI) http://is.ocha.ac.jp/~siio/lecture/humaninterface/gui.pdf

**レポート締め切り/提出先 [#oe2ca5e5]
- 締め切り2008年9月8日月曜日
-提出先:情報科学科図書室カウンター(501号室)
-提出方法:A4用紙のレポート。

*** レポート課題 [#ef08e0c9]
以下の課題についてレポートを書き,まとめて提出してください。

+身の回りの道具について以下の考察をせよ.
++以下の日用品を1つ以上例示せよ
---使いやすい/使いにくい道具
---利用者によって貼紙された道具
++上記の日用品が,なぜこのような状態であるかを、分析せよ
---制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、
標準化の問題か、などを議論せよ。
---また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.
//+ グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して,
//以下のことを述べよ.
//++CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、
//WYSIWYG」などの言葉を使って説明せよ.
//++CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、
//正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.



* 集中演習 (2008年2月) のヒューマンインタフェースの範囲 [#j4ebc8e2]

授業で使ったプレゼン資料

- 人とモノとのインタフェース http://is.ocha.ac.jp/~siio/lecture/humaninterface/everydaythings.pdf

のうち,2,3,4,6ページにある,マッピングとモデルの項目を見ておいてください.
このページにある図を使って,
つぎのような質問に答えていただく記述式の問題を作成する予定です.

+座席の形をした車の電動シート調節スイッチが使いやすいのはなぜでしょうか?
+製品の操作がわかりやすいかどうかの評価実験をする際に,開発関係者が
被験者になっては意味がないと言われています.その理由はなぜでしょうか.


* マルチメディアプログラミング2007年後期 [#idb5879a]

**javaのマニュアル [#sa00e338]

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

**追試課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること [#r0df2e15]

この課題のヒントは SimpleDraw をみてください。

*** 追試提出課題として最低やってほしいこと [#a598cf54]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにしてください
(ダブルバッファを使う)
-絵や写真のファイルを取り込めるようにしてください
-絵をファイルへ書き出す機能を作ってください

*** 以下のことができれば加点します [#fbe45e9c]
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する



*** 取扱説明書の作り方 [#t6148460]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
--デスクトップにピクチャxx.pdfというファイルができます
--これをダブルクリックで開きます
--欲しい部分を矩形ツールで選択してコピーします
--WordかText Editにペーストします
-ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。


*** 出来上がったプログラムの提出方法 [#j4f51a6e]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「学籍番号+氏名(ローマ字フルネーム)+もし必要なら適当な文字か数字」にしてください。
-このフォルダをzip等で圧縮してファイルにしてください
--Macintoshではフォルダの上で右クリック(もしくはコントロールキーを押しながらクリック)すると現れるメニューから"を圧縮"を選択します.
-圧縮したファイルをsiio@mac.comまでメール添付で送ってください.
-受け取ったら返事しますのでかならず確認してください.
-締め切りは2月29日の11:59pmとします.締め切り厳守です.




**課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること [#e0eb439c]

この課題のヒントは SimpleDraw をみてください。

*** 提出課題として最低やってほしいこと [#mc4176f5]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューとカラーパレットで変えられるようにしてください
-消しゴム機能を追加してください
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)

*** 以下のことができれば加点します [#b2b572d2]
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください


*** 取扱説明書の作り方 [#u4337470]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
--デスクトップにピクチャxx.pdfというファイルができます
--これをダブルクリックで開きます
--欲しい部分を矩形ツールで選択してコピーします
--WordかText Editにペーストします
-ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
-Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。


*** 出来上がったプログラムの提出方法 [#o12e6799]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
-このフォルダを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)
-締め切りは1月24日の授業終了(4:20pm)とします
--この時間までにとりあえず提出してください
--どうしてもそのあともがんばりたい人は1月24日の11:59pmまでに提出してください
--可能な限り差し替えます(見落としていたらごめん)






* ヒューマンインタフェース 2007年前期 [#w5d827c2]

//-4/24 「人のパーフォマンス」
//--人の認知モデル,応答速度,Keystroke-Level Model, フィッツの法則についてお話ししました
//-5/1は海外出張のため休講します

** 授業で使う予定のプレゼン資料 [#e4e7a04d]

+ 人とモノとのインタフェース http://is.ocha.ac.jp/~siio/lecture/humaninterface/everydaythings.pdf
+ グラフィカルユーザインタフェース(GUI) http://is.ocha.ac.jp/~siio/lecture/humaninterface/gui.pdf

**レポート課題 [#c22d0910]
- 締め切り2007年9月7日金曜日
-提出先:情報科学科図書室カウンター(501号室)
-提出方法:A4用紙のレポート。

*** 課題 [#e31e8008]
以下の2つの課題についてレポートを書き,まとめて提出してください。

+身の回りの道具について以下の考察をせよ.
++以下の日用品を1つ以上例示せよ
---使いやすい/使いにくい道具
---利用者によって貼紙された道具
++上記の日用品が,なぜこのような状態であるかを、分析せよ
---制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、
標準化の問題か、などを議論せよ。
---また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.
+ グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して,
以下のことを述べよ.
++CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、
WYSIWYG」などの言葉を使って説明せよ.
++CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、
正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.


*情報と職業 2007年前期 [#g1b5584b]

-5/2は海外出張のため休講します
-5/9, 5/23, 6/6は招待講演になります.詳細はGuestTalksを見てください.


** レポートのお知らせ [#lebfd1e6]
- 締め切り2007年9月7日金曜日
- 提出先:情報科学科5階図書室受付

*** 課題 [#w4f38211]
以下の2つの課題についてレポートを書き,まとめて提出してください。

+みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが
どういうビジネスモデルで運営されているか調べてください。
たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net
などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか)
を調べて/推測してください。
(インターネット上の記事をそのままコピーペーストすることは避けてください.
自分の文章で書いてください.もし,
引用する場合はかならずそれがわかるように書いてください.)
+某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。
売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、
チケット、旅行サービス、大学グッズなどを販売しています。
顧客のほとんどが、インターネットを日常的に利用しているため、
インターネットの技術と結びついたビジネス展開を計画しています。
そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。
インターネット技術を活用したビジネスモデルを提案してください。
また,このモデルを実現するための,
具体的なサイトのイメージ(入り口のページ,注文のページなど)も示してください.
そのビジネスモデルを実現した場合に、生協にとってどのような
メリットがあるかも述べてください。
//+授業のノートを提出してください。自筆ならコピーでも可。
//だれかのノートを写してもokですが、その場合は誰のノートを写したかを明記してください。
//オリジナルのノートの人の方に高い点数をつけます。一方、欠席した授業の分を補うために、
//他人のノートを参照して完璧なノートを作っていただいた場合は、高く評価します。
//ノート返却を希望する人は、メモ書きしておいてください。
//後日、研究室のドアのところで返却いたします。




* マルチメディアプログラミング2006年後期 [#ze46debb]

**javaのマニュアル [#v22e6e8f]

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html



**課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること [#ae4c89c1]

この課題のヒントは SimpleDraw をみてください。

*** 提出課題として最低やってほしいこと [#n7af4de4]
-ペンの太さをメニューで変えられるようにしてください
-ペンの色をメニューで変えられるようにしてください
-消しゴム機能を追加してください

*** 以下のことができれば加点します [#s54de511]
-ウィンドウの大きさを変えても絵が消えてしまわないようにする
(ダブルバッファを使う)
-絵や写真のファイルを取り込めるようにする
-いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
-絵をファイルへ書き出す機能を作る
-そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください


*** 取扱説明書の作り方 [#a98d4c83]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
--デスクトップにピクチャxx.pdfというファイルができます
--これをダブルクリックで開きます
--欲しい部分を矩形ツールで選択してコピーします
--WordかText Editにペーストします


*** 出来上がったプログラムの提出方法 [#hb4b91da]
- フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
-このフォルダを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)



** 1月10日の課題 [#j47cd0be]

-ドラッグして書き始めるときの不要な直線を消してください
-マウスポインタの位置と書いている場所がずれているのを直してください

** 1月10日の線を引く簡単なプログラム [#pb378838]

 import javax.swing.JPanel;
 import java.awt.Graphics;
 
 /**
  * 
  */
 
 /**
  * @author siio
  *
  */
 public class DrawPanel extends JPanel {
 
 	public void drawLine(int x1, int y1, int x2, int y2){
 		Graphics g = this.getGraphics();
 		g.drawLine(x1, y1, x2, y2);
 	}
  }
 


 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 
 import javax.swing.JFrame;
 
 /**
  * 
  */
 
 /**
  * @author siio
  *
  */
 public class SimpleDraw extends JFrame implements ActionListener,
 		MouseListener, MouseMotionListener {
  
 
 	int lastx, lasty, newx, newy;
 	DrawPanel panel;
  
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
 	 */
 	public void actionPerformed(ActionEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
 	 */
 	public void mouseClicked(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
 	 */
 	public void mouseEntered(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
 	 */
 	public void mouseExited(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
 	 */
 	public void mousePressed(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 	 	lastx=arg0.getX();
 	 	lasty=arg0.getY();
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
 	 */
 	public void mouseReleased(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	/* (non-Javadoc)
 	 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
 	 */
 	public void mouseDragged(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 		newx=arg0.getX();
 		newy=arg0.getY();
 		panel.drawLine(lastx,lasty,newx,newy);
 		lastx=newx;
 		lasty=newy;
 	}
 
  
 
 	public void mouseMoved(MouseEvent arg0) {
 		// TODO Auto-generated method stub
 
 	}
 
 	private void init() {
 		this.setTitle("Simple Draw");
 		this.setSize(300, 200);
 		this.addMouseListener(this);
 		this.addMouseMotionListener(this);
 		panel=new DrawPanel();
 		this.getContentPane().add(panel);
 		this.setVisible(true);
 		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		// TODO Auto-generated method stub
 		SimpleDraw frame=new SimpleDraw();
 		frame.init();
 	}
 
 }
 

**12月21日のマウスイベントのサンプル [#v5fef6df]

 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class SimpleDraw extends JFrame implements MouseListener, MouseMotionListener{
 
 	SimpleDraw(String title) {
 		setTitle(title);
 		addMouseListener(this);
 		addMouseMotionListener(this);
 	}
 	
 	public void mouseClicked(MouseEvent e) {
 		System.out.println("mouse clicked!");
 	}
 	public void mouseEntered(MouseEvent e) {
 		System.out.println("mouse entered!");
 	}
 	public void mouseExited(MouseEvent e) {
 		System.out.println("mouse exited!");
 	}
 	public void mousePressed(MouseEvent e) {
 		System.out.println("mouse pressed!");
 	}
 	public void mouseReleased(MouseEvent e) {
 		System.out.println("mouse released!");
 	}
 	public void mouseDragged(MouseEvent e) {
 		System.out.println("mouse dragged!");
 	}
 	public void mouseMoved(MouseEvent e) {
 		System.out.println("mouse moved!");
 	}
 	
 	public static void main(String[] args) {
 		SimpleDraw sample = new SimpleDraw("Drawing application");
 		sample.setSize(400,300);
 		sample.setVisible(true);
 		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 	
 }
 


**12月14日にやった演習13.2の回答例 [#t5769282]
 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 
 public class JTextFieldSample extends JFrame implements ActionListener {
 	JButton button, clearButton;
 	JTextField textleft, textright;
 	
 	JTextFieldSample(String title) {
 		setTitle(title);
 		button = new JButton("left to right");
 		clearButton = new JButton("clear");
 		button.addActionListener(this);
 		clearButton.addActionListener(this);
 		
 		textleft = new JTextField(10);
 		textright = new JTextField(10);
 		JPanel panel=new JPanel();
 		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearButton);
 		Container container=this.getContentPane();
 		container.add(panel);
 	}
 	
 	public void actionPerformed(ActionEvent e) {
 		if(e.getSource()==(button)) {
 			textright.setText(textleft.getText());
 			textleft.setText("");
 		}else if(e.getSource()==(clearButton)) {
 			textright.setText("");
 		}
 	}
 	
 	public static void main(String[] args) {
 		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
 		sample.pack();
 		sample.setVisible(true);
 		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	}
 }

**11月30日に説明したURL読み込みの例 [#dcb14e23]
 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			URL targetURL = new URL("http://www.ocha.ac.jp/");
 			InputStream istream = targetURL.openStream();
 			BufferedReader breader = new BufferedReader
 			(new InputStreamReader(istream, "JISAutoDetect"));
 		
 			String line;
 			while((line=breader.readLine()) != null) System.out.println(line);
 		
 		
 		}catch(IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

**11月2日の宿題 [#jc045eda]

 Class Osaifuを作り、以下のクラスメソッドが
 java Osaifuコマンドで動くようにせよ。
 
	public static void main(String argv[]) {
		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
		//最初の保持金額を1000円にする
		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
		//最初の保持金額を500円にする
		saifu2.in(saifu1.out(200));//saifu1からsaifu2に200円移す
		saifu1.print();//現在の金額を表示
		saifu2.print();//現在の金額を表示
	}

**11月2日の解答例 [#m7407c5f]

 public class Point3D {
	private int x, y, z;
	void putx( int ptx) { x=ptx; }
	void puty(int pty) { y=pty; }
	void putz(int ptz) { z=ptz; }
	int getx() { return x; }
	int gety() { return y; }
	int getz() { return z; }
	
	Point3D(int ptx, int pty, int ptz) {
		//x=ptx; y=pty; z=ptz; 
		this.putx(ptx); this.puty(pty); this.putz(ptz);
	}
	
	//指定された点との距離を求めるインスタンスメソッド
	double distance(int ptx, int pty, int ptz) {
		double d;
		int dx = ptx - x;
		int dy = pty - y;
		int dz = ptz - z;
		d =   Math.sqrt(dx * dx + dy * dy + dz * dz);
		return d;
	}
	//指定された点との距離を求めるインスタンスメソッド
	double distance(Point3D pt) {
		return this.distance(pt.getx(), pt.gety(), pt.getz());
	}
 //Point3Dクラスに以下のクラスメソッドを追加して、
 //これがjava Point3Dコマンドで動くようにせよ。
	public static void main(String argv[]) {
		Point3D pt1 = new Point3D(1,2,3);
		Point3D pt2 = new Point3D(30,20,10);
		System.out.println(pt1.distance(pt2)); //pt1,pt2の距離を表示
	}
 }
	


* ヒューマンインタフェース 2006年前期 [#g91d19e5]

** 授業で使っているプレゼン資料 [#hb8c353a]

+ 人とモノとのインタフェース http://is.ocha.ac.jp/~siio/lecture/humaninterface/everydaythings.pdf
+ グラフィカルユーザインタフェース(GUI) http://is.ocha.ac.jp/~siio/lecture/humaninterface/gui.pdf

**レポート課題 [#f1832079]
-提出期限:2006年9月22日(金曜日)
-提出先:情報科学科図書室カウンター(501号室)
-提出方法:A4用紙のレポート。

-課題

(1-1) 以下の日用品を1つ以上例示せよ

-使いやすい/使いにくい道具
-利用者によって貼紙された道具

(1-2) なぜ(1-1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

(2) グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して,以下のことを述べよ.

(2-1)CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、WYSIWYG」などの言葉を使って説明せよ.

(2-2)CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.


* マルチメディアプログラミング2005年後期 [#ecb6be22]

** 演習課題;お絵描きプログラムを作る [#s85ff337]

-授業で紹介したテクニックを使ってお絵描きプログラムを完成させてください

-ツールはテキストエディタ+ターミナルでも、Eclipseでもよいです

-機能を充実させてください。市販のお絵描きプログラムをまねて、いろいろ機能を考えてください。たとえば、以下のような機能が考えられます

--ペンの色を変える機能
--ペンの太さを変える機能
--消しゴム機能(白色の太いペンで代用できるかも)
--画面を一気にクリアする機能
--文字を書き込む機能
--画面をスクロールする機能
--コピーアンドペーストの機能(上級編かも?)
--画像ファイルとして保存する機能(上級編かも?)
--線で囲まれた部分を塗りつぶす機能(これはさらに上級かも)
--そほのかお遊び機能
---写真を取り込む機能
---スタンプ機能(マウスの場所に小さなイメージを貼付けていく)
---かわったブラシ(筆タッチとか)のペンを実現する機能
---テキスト列をマウスの移動にそって描いていく

-基本的な骨組みはDrawFrame.javaを参考にするとよいかも

*** 説明マニュアルの作り方 [#lf2f7314]

-ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの使い方マニュアルを書いてください。
-せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
-スクリーンキャプチャした図も入れてください。図は次のようにして作ります
--スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
--デスクトップにピクチャxx.pdfというファイルができます
--これをダブルクリックで開きます
--欲しい部分を矩形ツールで選択してコピーします
--WordかText Editにペーストします

*** 出来上がったプログラムの提出方法 [#ra7547bd]
- フォルダを作ってその中にjavaファイルとclassファイルと、説明マニュアルファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
-このフォルダを以下の手順でサーバにおいてください
+Finderの移動メニューから、「サーバへ接続...」を選んでください
+サーバアドレスのところにsiio.jpと書いてください
+接続ボタンを押してください
+ゲストのラジオボタンを選んで、接続ボタンを押してください
+Publicを選択してください
+画面にjava_reportというフォルダが見えると思います
+このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-同じ名前のフォルダを投げ込むと、前のが消えます。ということで新しいバージョンができたら同じ名前のフォルダを作って提出し直してください。(他人が同じ名前のフォルダを投げ込むと、やっぱり消えてしまいます。そういう間違いやいたずらを防止するために、フォルダ名「氏名(フルネーム)+適当な文字か数字」の後半は秘密にしておいてください。

** 入れておくと便利なソフトウェア [#c7f1bbc0]

*** mi (みみかきエディタ) [#z64a633c]

便利なフリーウェアのテキストエディタです。
http://www.mimikaki.net/からダウンロードして/Users/ユーザ名/Applicationsにコピーします。
(Applicationsディレクトリが存在しない場合は作成)。

*** Terminal Here Plugin [#r6fca79e]

ファインダーの上で右クリック(もしくはコントロールキー+クリック)すると現れる
メニューの中に、Open Terminal Hereという項目を追加します。
そうすると、その場所をカレントディレクトリとしてTerminalが起動します。
日本語のディレクトリ名にはうまく対応していないようです。
説明は、http://pcweb.mycom.co.jp/column/osx/118/参照。
http://www.pyehouse.com/lynn/termopen.phpからダウンロード。
/Users/ユーザ名/Library/Contextual Menu Items/
ディレクトリへプラグインをコピー(ディレクトリが存在しない場合は作成)。
その後、シェルから「killall Finder」を実行してFinderを再起動。

***Eclipse [#g80b03e0]

- これはすでにApplicationsに入っています。使い方は授業で説明します。


- なお、コンパイルすると以下の警告が出ることがあります。
 The serializable class xxxxxxx does not declare a static final serial Version UID field of type long

-この警告を消すには、
	private static final long serialVersionUID = 42L;
というインスタンス変数を宣言しておくとよいようです。

** Mac OS XでJavaを使う方法 [#s11f6a24]
How2Java

** お絵描きソフトの作り方のヒント [#vc13e3b4]
DrawFrame.java

* 情報と職業2005年前期 [#z8f00b58]
** レポートのお知らせ [#e4b5cd7d]
- 締め切り2005年9月末
- 提出先:情報科学科5階図書室受付
*** 課題 [#s97178cf]
以下の3つの課題の中から2つを選んで、提出してください。

+みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが
どういうビジネスモデルで運営されているか調べてください。
たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net
などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか)
を調べて/推測してください。
+某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。
売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、
チケット、旅行サービス、大学グッズなどを販売しています。
顧客のほとんどが、インターネットを日常的に利用しているにもかかわらず、
インターネットの技術と結びついたビジネス展開をほとんど行っていません。
そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。
インターネット技術を活用したビジネスモデルを提案してください。
そのビジネスモデルを実現した場合に、生協にとってどのような
メリットがあるかを述べてください。
+授業のノートを提出してください。自筆ならコピーでも可。
だれかのノートを写してもokですが、その場合は誰のノートを写したかを明記してください。
オリジナルのノートの人の方に高い点数をつけます。一方、欠席した授業の分を補うために、
他人のノートを参照して完璧なノートを作っていただいた場合は、高く評価します。
ノート返却を希望する人は、メモ書きしておいてください。
後日、研究室のドアのところで返却いたします。

* 人間機械系特論 2005年前期 [#ve89faf4]

**レポート課題 [#tf3b7f7b]
-提出期限:2005年9月30日(金曜日)
-提出先:情報科学科図書室カウンター(501号室)
-提出方法:A4用紙のレポート。

-課題

(1-1) 以下の日用品を1つ以上例示せよ

-使いやすい/使いにくい道具
-利用者によって貼紙された道具

(1-2) なぜ(1-1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

(2) 以下のような計算機の応用を、1つ以上考えて、提案せよ

-身の回りの環境や日用品の機能を計算機により増幅するアイディア、または
-身につけたコンピュータにより人の活動を支援するアイディア、
例えば、賢い家電製品、道案内コンピュータ、賢い引き出し、机、椅子、家具、賢い鏡、ニュースを印刷するトースター、ネットワークで連携する日用品、バーチャル看板などのようなアイディア。

* ヒューマンインタフェース 2005年前期 [#wb363216]

**レポート課題 [#tb1cc0e7]

-提出期限:2005年9月30日(金曜日)
-提出先:情報科学科図書室カウンター(501号室)
-提出方法:A4用紙のレポート。

-課題

(1) 以下の日用品を1つ以上例示せよ

-使いやすい/使いにくい道具
-利用者によって貼紙された道具

(2) なぜ(1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

* 玉川大学での非常勤講師の授業について [#c56acd6e]

LectureTamagawa をご覧ください.

------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS