Lecture

LectureOld

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

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

試験問題(予定) Exam Question

  • 身の回りの環境や日用品の機能を計算機により増幅するアイディア
  • または,身につけたコンピュータにより人の活動を支援するアイディアを考案せよ.
    • アイディアの新規性の他に,実装方法の面白さがあればそれも評価するので,その場合は実現方法についても簡単に述べよ
  • Propose an idea that
    • Augment everyday-environment or everyday-things by ubiquitous computers, or
    • Support everyday human activities by wearable computers.
      (Besides novelty of your idea, state your implementation method. )

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

欠席状況

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

学籍番号欠席回数判定
11205013
11205021
11205151
11205171
11205291
11205341
11205353
11205372
11205393
11205401
1120541取消
11205422
082051011不可

講義予定

月日内容
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のマニュアル

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

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

マルチメディアプログラミングの最終課題

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

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

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

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

機能拡張の詳細はSimpleDraw

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

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

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

取扱説明書の作り方

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

出来上がったプログラムの提出方法

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

締切

  • 締め切りは2月1日とします
    • この日までに提出してください

2013年1月10日

今日の提出課題

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

Eclipseを使ってみよう

http://siio.jp/gyazo/4383db7fb81f9eacbf5cc959ff77a33d.png

Eclipseの警告を消す方法

	private static final long serialVersionUID = 42L;

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

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

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

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

線を引く簡単なプログラム

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();
	}

}

マウスイベント

マウスイベントを受け取るには、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);
	}
	
}

サウンドファイルを再生する

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

http://siio.jp/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日

簡単なアニメーション

  • まずはなにもしないウィンドウを出します
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();
	}
}

マルチスレッドについて

Javaでは次のようにしてマルチスレッドを実現します

  1. Runnableをimplementsしたクラスを作る
  2. そのインスタンスを作る
  3. そのインスタンスを引数にしてThreadクラスのインスタンスを作る
  4. そのインスタンスの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){}
		}
	}
}

マルチスレッド化する

上記のボールを動かすプログラムでは、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){}
		}
	}
}

本日の演習

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

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){}
		}
	}
}

本日のレポート

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

Mac OS X

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming? を見てください

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#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の作り方

いままでは、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://siio.jp/gyazo/637225a1c08bef7e853944ad9b8ed390.png

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

appletviewer index.html 

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

http://siio.jp/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://siio.jp/gyazo/2c88f97c8f7234e5e3eb72dcd9b2713a.png

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

http://siio.jp/gyazo/143be91363a277f04a0fa8b1f5d5a43a.png

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

http://siio.jp/lecture/applet/

2011年12月20日

第13章 様々なコンポーネントとレイアウト

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

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

演習13.1をやってください

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

http://siio.jp/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を実行してください

http://siio.jp/gyazo/4755cce7280963b32050db455d265cc1.png

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

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

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

http://siio.jp/gyazo/2d9c3b6534e7b87fcd3ec22be00d5fed.png

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

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

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

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

		button.setForeground(color);

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

今日のレポート

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

2011年12月13日

第12章 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);
       }
}

JFrameを継承するプログラミング(1)

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)

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();
	}
}

ラベルを表示するウィンドウ

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

http://siio.jp/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個表示するウィンドウ

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

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

http://siio.jp/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();
	}

}

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

ボタンが押されたイベントを受け取るためには,

  1. ActionListener?をimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンにaddActionListener?()で登録する 必要があります.

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

http://siio.jp/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();
	}

}

今日のレポート

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

2011年12月13日 (宿題提出)

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

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

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

宿題(1)の回答例を書いておきます

  • 解答例
import java.io.*;
import java.net.*;

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

public class URLJpeg2 {
	public static void main (String argv[]) {
		byte[] data = new byte[512];
		try {
			URL targetURL = new URL("http://siio.jp/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日授業開始時に提出)

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

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

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

宿題(1)写真読み込みの高速化

今日の例では写真データを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をファイルにするプログラムを考えてみましょう

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

curl http://ocha.ac.jp/

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

curl http://siio.jp/cat.jpg > cat.jpg

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

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

とすると、htmlが見られ、

java Curl http://siio.jp/cat.jpg > cat.jpg

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

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

2011年11月22日

第11章 入出力(つづき)

プログラム11.3をやってみてください

作ったファイルを

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);
		}
	}
}

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

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をやってください

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

http://siio.jp/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/の内容を表示するプログラムを書いてみよう

http://siio.jp/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?のインスタンスが得られる。

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...");
		}
	}
}

写真ファイルのダウンロード

http://siio.jp/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://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

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

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/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...");
		}
	}
}

今日のレポート

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

2011年11月15日(つづき)

第11章 入出力

整数を出力する例

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

整数を入出力する例

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 をやってください

作ったファイルを

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.1で作ったjavaとclassと、作成したデータファイル(dout.datなど)を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年11月15日

第10章 Stringクラスとコレクションフレームワーク

入力した文字を逆に出力するプログラムを作る

[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 の練習

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

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

などと定義すると良い。

Hash Mapの練習

プログラム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章 エラーと例外処理

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

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日

Osaifuクラスを作ってみよう

  • 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://siio.jp/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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

第8章 継承

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

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

http://siio.jp/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クラスの改造

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

http://siio.jp/gyazo/39a7b24a8c45e15ac55693592c2eb7cf.png

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

今日のレポート

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

2012年10月18日

第6章

  • 演習問題6.1, 6.2, 6.3

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

http://siio.jp/gyazo/deeb78a70a724a01ce76945235d42ab8.png

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

http://siio.jp/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());
	}

今日のレポート

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

第5章

for-each文は新しい手法なので練習しましょう

先週やりのこした5章の続き(最後のところ)です。

演習

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

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

http://siio.jp/gyazo/8d8effac163e0dc939e74f237d8507b1.png

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

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

今日のレポート

  • ArgsTes2.javaとclass (いずれかのバージョン1つで可) を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

出来上がったプログラムの提出方法

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

http://siio.jp/gyazo/20121011193708.png

http://siio.jp/gyazo/20121011195105.png

http://siio.jp/gyazo/20121011195203.png

http://siio.jp/gyazo/20121004193059.png

2012年10月11日

第3, 4, 5章

  • 演習
  • 演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。
  • arg[0]とarg[1]をprintlnの中で+でつないで表示する

hhttp://siio.jp/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://siio.jp/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://siio.jp/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://siio.jp/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);
	}
}
}

今日のレポート

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

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

2012年10月4日

教科書

http://siio.jp/gyazo/de3288074dae1c75f6df4ef3c0b9b3d4.png

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

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

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

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

第1章および第2章

Mac OS XでJavaを使う

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

terminalを起動する

http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png

  • terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。
  • ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)
  • メニューのターミナル/環境設定...を開きます。 ここで、テキストを選んで、「テキストをアンチエイリアス処理」に チェック入れておくとフォントが奇麗なのでおすすめです。

http://siio.jp/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png

  • おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。 Javaの場合、ここで「Unicode (UTF-8)」を選んでおきましょう。 (日本語コードにはいろいろな種類があって混乱しますが、21世紀に生きるみなさんはUnicodeで統一していきましょう)
  • ターミナルから、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を用意しておく

http://siio.jp/gyazo/2c0e58d1b83d396e1fbe6f5d247670ff.png

  • Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

http://siio.jp/gyazo/7579915fefe1ecd9c0e4e2ddfa55177d.png

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、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://siio.jp/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.setVisible(true);
       }

}

これをSimpleWindow.javaという名前で保存して、

javac SimpleWindow.java
java SimpleWindow

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

simplewindow.png

昨年度以前の講義の情報

理学総論 (2012.11.19講義分)

理学総論レポート (2012.11.19講義分)

Page1 Page2 Page3

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

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

  • 締め切り: (前半の他の講義と同じ)
  • 形式分量:A4, ページ数は1-3ページ程度
  • 提出先・提出方法:(前半の他の講義と同じ)
  • 提出していただいた学生さんの学籍番号は以下です

http://siio.jp/gyazo/20121203172028.png
1240655

ヒューマンインタフェース 2012年度前期

レポートのお知らせ

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

レポートの課題

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

出欠表

  • 学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします.
    • 授業回数が12回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません.
    • 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.
学籍番号欠席回数評価
10205031
10205071
10205091
10205141
10205169不可
10205201
10205223
10205262
10205281
10205301
10205311
10205321
10205341
10205381
10205392
082051010不可
08205126不可

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

教科書

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

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

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c4.ppt.pdf
  5. http://siio.jp/lecture/humaninterface/HCI_c5.ppt.pdf
  6. http://siio.jp/lecture/humaninterface/HCI_c6.ppt.pdf
  7. http://siio.jp/lecture/humaninterface/HCI_c7.ppt.pdf
  8. http://siio.jp/lecture/humaninterface/HCI_c8.ppt.pdf
  9. http://siio.jp/lecture/humaninterface/HCI_c9.ppt.pdf
  10. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

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

教科書サポートページ

予定

  • 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

宿題

人の反応速度を測定するプログラムを作って測定してください。(2012.4.26)

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

GUI黎明期のPC性能を調べてください (2012.4.12)

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

欠席状況2012年度前期

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

ヒューマンインタフェース 2012年前期

学籍番号欠席回数出席点

レポート提出状況2011年度後期

理学総論 (2011.11.28講義分

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

学籍番号提出日
10406792011.12
11406612011.12
10406742011.12

欠席状況2011年度後期

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

情報と職業 2011年後期

学籍番号欠席回数出席点
09205101
09205113
09205141
09205201
09205221
09205232
09205312
092053310不可
09205341
09205371
09305423
09306117不可
08101329不可
08101583
081022410不可
082050510不可
08205191
08205273
08205351

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

情報と職業 2011年後期

シラバス

  • 第1章 デジタル時代
    • 情報システムと生活/ビジネス/暮らし
    • デジタル情報システムと生活/ビジネス/暮らし
    • デジタルである事
    • アナログ(レコード,写真,電話)デジタルの違い
  • 第2章 マルチメディアシステム
    • マルチメディアシステム
    • 数字から文字,文字から画像音声
    • 画像と動画のデータ量
    • 画素とは
    • デジカメの画素
    • 圧縮の効果
  • 第3章 情報社会の無料と格安
    • 格安のハード
    • 大量生産(フォードの自動車)
    • 家庭用ゲーム機
    • 携帯電話商法
    • サプライで収益
    • 有料サイト囲い込み
    • 無料のソフトウェア
    • フリーウェア
    • シェアウェア
    • 無料で配布ーシェア拡大ー技術支援で課金(コンサルタント,出版)
    • 無料のサイト(サービス)
    • GNUの思想, 寄付(シェアウェア)
    • 広告で収入
    • 技術力を示しビジネスにつなげる
  • 第4章 WWW
    • WEB以前の世界
    • WEBの歴史
    • ブラウザの変遷
    • 検索エンジン以前の世界
    • 検索エンジン
    • 新規なビジネス形態
    • 新しいコミュニティ
    • フォークソノミー(folksonomy)
    • クラウドコンピューティング
  • 第5章 互換ビジネス(コンパチブル,コンパチ)
    • 大型計算機の互換機
    • 互換マイクロプロセッサ
    • パーソナルコンピュータの互換機
    • 互換機との戦い
    • プリンタの互換機
  • 第6章 情報関連企業のビジネス戦略
    • 格安のハードウェア,ソフトウェア,サービス
    • webの発達
    • ビジネスモデル
    • 企業はどこで儲けているのか.どこが稼ぎ場所なのか.
  • 第7章ユビキタスコンピューティング
    • 今後の情報技術と生活

予定

  • 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講義分)

理学総論レポート (2011.11.28講義分)

Page1 Page2 Page3

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

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

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

集中演習「ヒューマンインタフェース」出題範囲 (2012年1月実施予定)

  • 教科書第5章5.4節「多ビットの入出力」の図5.5に関係する説明を読んでおいてください。理解のために必要ならば、第5章5.1節から5.4節の他の部分にも目を通しておいてください。
  • 次のような問題を予定しています
    • 図5.5のようにコンピュータに16個のスイッチを取り付け、それぞれのスイッチに11から44までの名前を付けたとします。
    • http://siio.jp/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年前期

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

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

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

0920502
0920506
0920507
0920528
0920532
0920540

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

締めきりました 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年前期

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

ヒューマンインタフェース 2011年前期

学籍番号欠席回数出席点
09205011
09205031
09205052
09205082
09205113
09205124不可
09205141
09205171
09205181
09205201
09205212
09205233
09205243
09205261
092052910不可
09205351
09205361
09205372
09205381
09205424不可
082051011不可
08205274不可
04205219不可

(2011.7.7現在)

マルチメディアプログラミング実習2011年前期

学籍番号欠席回数出席点
10205071
10205091
10205163
10205221
10205251
10205301
10205381
10205391
082051012不可
08205403

(2011.7.12現在)

ヒューマンインタフェースレポート

レポートのお知らせ

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

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

課題

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

マルチメディアプログラミングの最終課題

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

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

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

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

機能拡張の詳細はSimpleDraw

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

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

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

取扱説明書の作り方

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

出来上がったプログラムの提出方法

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

締切

  • 締め切りは7月12日とします
    • この日までに提出してください

マルチメディアプログラミング実習2011年前期

2011年7月12日

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

2011年7月5日

Java Appletの作り方

いままでは、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://siio.jp/lecture/applet/

今日の課題

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

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

2011年6月28日

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

Eclipseの警告を消す方法

	private static final long serialVersionUID = 42L;

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

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

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

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

2011年6月21日

終章 おまけ

Eclipseを使ってみよう

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

線を引く簡単なプログラム

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();
	}

}

簡単なアニメーション

  • まずはなにもしないウィンドウを出します
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://lab.siio.jp/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); 
  • 余力があれば、ボールが当たったら音が出るようにしてみよう。

今日のレポート

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

Mac OS X

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming? を見てください

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#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で実行してください.

サウンドファイルを再生する

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

http://siio.jp/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();
       	}
	}
}

マウスイベント

マウスイベントを受け取るには、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 の提出

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

2011年6月14日

宿題提出お願い

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

第13章 様々なコンポーネントとレイアウト

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

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

演習13.1をやってください

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

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を実行してください

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

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

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

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

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

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

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

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

宿題:プログラム13.6

今日のレポート

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

2011年6月7日

写真読み込みの高速化

上記の例では写真データを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://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。

public class URLJpeg2 {
	public static void main (String argv[]) {
		byte[] data = new byte[512];
		try {
			URL targetURL = new URL("http://siio.jp/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をファイルにするプログラムを考えてみましょう

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

curl http://ocha.ac.jp/

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

curl http://siio.jp/cat.jpg > cat.jpg

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

第12章 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);
       }
}

JFrameを継承するプログラミング

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();
	}
}

ラベルを表示するウィンドウ

プログラム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個表示するウィンドウ

プログラム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();
	}

}

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

ボタンが押されたイベントを受け取るためには,

  1. ActionListener?をimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンに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

今日のレポート

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

2011年5月31日

第11章 入出力

整数を出力する例

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

整数を入出力する例

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 をやってください

作ったファイルを

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をやってみてください

作ったファイルを

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);
		}
	}
}

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

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をやってください

キーボードから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/の内容を表示するプログラムを書いてみよう

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...");
		}
	}
}

写真ファイルのダウンロード

http://siio.jp/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://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

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

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/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...");
		}
	}
}

今日のレポート

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

2011年5月24日

第9章 エラーと例外処理

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

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クラスとコレクションフレームワーク

入力した文字を逆に出力するプログラムを作る

[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 の練習

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

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

などと定義すると良い。

Hash Mapの練習

プログラム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");
	}

	}
}

今日のレポート

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

2011年5月17日

Osaifuクラスを作ってみよう

  • 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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

第8章 継承

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

  • OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
  • あたらしく追加するメソッドは以下です
    • void inUSD(int x) xドルをお財布に入金します。このとき円に換算して残高に追加します
    • int outUSD(int x) xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
    • 1ドルは90円にしてください
  • 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クラスの改造

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

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

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

今日のレポート

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

2011年5月10日

  • 演習問題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());
	}

今日のレポート

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

2011年4月26日

第3章

  • 演習
  • 演習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章

演習

  • 演習問題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文は新しい手法なので練習しましょう

演習

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);
       }
}

今日のレポート

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

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

2011年4月19日

javaのマニュアル

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

出来上がったプログラムの提出方法

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

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

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

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

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png

教科書

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

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

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

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  3. 出席状況(参考程度)

第1章および第2章

Mac OS XでJavaを使う

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

terminalを起動する

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

  • terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。
  • ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)
  • メニューのターミナル/環境設定...を開きます。 ここで、テキストを選んで、「テキストをアンチエイリアス処理」に チェック入れておくとフォントが奇麗なのでおすすめです。
  • おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。 Javaの場合、ここで「Unicode (UTF-8)」を選んでおくと良いです。
  • ターミナルから、javac helpとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。

miを用意しておく

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

  • Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

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

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、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.setVisible(true);
       }

}

これをSimpleWindow.javaという名前で保存して、

javac SimpleWindow.java
java SimpleWindow

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

simplewindow.png

ヒューマンインタフェース 2011年前期

教科書

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

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

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c4.ppt.pdf
  5. http://siio.jp/lecture/humaninterface/HCI_c5.ppt.pdf
  6. http://siio.jp/lecture/humaninterface/HCI_c6.ppt.pdf
  7. http://siio.jp/lecture/humaninterface/HCI_c7.ppt.pdf
  8. http://siio.jp/lecture/humaninterface/HCI_c8.ppt.pdf
  9. http://siio.jp/lecture/humaninterface/HCI_c9.ppt.pdf
  10. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

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

教科書サポートページ

マルチメディアプログラミング実習2010年後期

最終課題提出者一覧

もし、提出したにもかかわらず、ここに掲載されていない人がいましたら、大至急椎尾 (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

授業時間変更と休講のお知らせ

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

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

javaのマニュアル

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


マルチメディアプログラミングの最終課題

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

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

以下のことができれば加点します

  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

取扱説明書の作り方

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

出来上がったプログラムの提出方法

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

締切

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

2010年12月16日

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#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

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming? を見てください

線を引く簡単なプログラム

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を使ってみよう

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

Eclipseで出るwarningは、以下の変数を定義するとなおります

private static final long serialVersionUID = 42L;

(冬休みの宿題)上のお絵描きプログラムを改良してください

上のプログラムでは,描画すると一筆書きになってしまいます。 これを直して、普通に描画できるようにしてください。 また、 マウスの位置とずれたところに線が引かれるのも直してください。(すこしずらせばok)

ヒント

2010年12月9日

オブジェクト指向用語の復習

import javax.swing.*;
public class SimpleWindow extends JFrame {
	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.setVisible(true);
	}
}

で,非常に簡単なウィンドウが出ます. ここで何をやっているのか,オブジェクト指向の用語を使って説明してみましょう.

継承することのメリットを考えてみよう

ボタンが押されたイベントを処理する方法

先週作った, プログラム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();
	}

}

ボタンが押されたイベントを受け取るためには,

  1. ActionListener?をimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンに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を実行させてください

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

演習13.1をやってください

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を実行してください

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

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

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

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

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

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

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

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

レポート提出

演習ができたかどうかに従って、以下の3本から5本のプログラム(.javaと.class)を いつものように学籍番号+名前のフォルダに入れて、圧縮して提出してください。

  1. プログラム13.2
  2. 演習13.1のプログラム
  3. プログラム13.5
  4. 演習13.2のプログラム
  5. プログラム13.6

2011年11月25日

写真ファイルのダウンロード (先週の宿題のヒント)

http://siio.jp/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://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

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

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/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...");
		}
	}
}

高度な課題

上記の例では写真データを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 バイトを出力ストリームに書き込みます。

を使ってください。

とても簡単なウィンドウ

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);
       }
}

継承を使ったプログラム

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();
	}

}

ラベルを表示するウィンドウ

プログラム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個表示するウィンドウ

プログラム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日

プログラム11.3をやってみてください

作ったファイルを

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 をやってください

作ったファイルを

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);
		}
	}
}

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

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をやってください

キーボードから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/の内容を表示するプログラムを書いてみよう

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...");
		}
	}
}

宿題:写真ファイルのダウンロード

http://siio.jp/cat.jpg 

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

ヒント1:

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

2010年11月4日

OsaifuUSDクラスの改造

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

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

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

エラーと例外処理

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

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.

入力した文字を逆に出力するプログラムを作る

[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 の練習

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

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

などと定義すると良い。

Hash Mapの練習

プログラム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");
	}

	}
}

整数を出力する例

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

整数を入出力する例

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日

他の点との距離を返すメソッドの例を説明しました

	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クラスを作ってみよう

  • 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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

  • OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
  • あたらしく追加するメソッドは以下です
    • void inUSD(int x) xドルをお財布に入金します。このとき円に換算して残高に追加します
    • int outUSD(int x) xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
    • 1ドルは90円にしてください
  • 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日

クラスとインスタンスの説明をしました

  • クラスは型、インスタンスはそれから作られたもの
    • クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
    • クラスは設計図でインスタンスはそれから作られたもの
  • クラスとインスタンスそれぞれにメソッドと変数がある
    • クラス変数 例:何個のインスタンスを作ったか?
    • クラスメソッド 例:インスタンスを作れ
    • インスタンス変数 例:ひとつのたいやきの重さ
    • インスタンスメソッド 例:たいやきをxxグラム食べる

プログラム6.1-6.4を作ってみてください。

public static void main の説明をしました

  • javaコマンドは、引数のクラスのクラスメソッドmainを実行します
    • staticと付いているのがクラス変数、クラスメソッドの印です
  • Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます

変数にはメソッド経由でアクセスするのが良いという説明をしました

  • 変数の型などを将来変更してもメソッドの書き換えで対応できます
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();
	}

}

演習

  • 演習問題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日

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

配列の定義方法

クラスのインスタンス化(後日説明します)と同じやりかたですので、 覚えておきましょう。教科書39ページにあるように、

int[] vec;
vec = new int[3];

または、これを1行にまとめて、

int[] vec = new int[3];

と書きます。

vecというのは、ここで作った変数の名前です。 int型の変数を3個分だけ格納するメモリー領域を、new int[3]というコマンドで作ります。 C言語では、malloc()でメモリーを確保するのと同じことです。 その領域を、参照するために、vecという変数を使います。C言語のポインターと同じです。

コマンドライン引数の表示

  • args[0]も文字列です。表示してみましょう。
class ArgsTest {  
public static void main (String args[]) {
	System.out.println(args[0]);
        }
}
  • args[1]もためしてみましょう。args[]は、引数文字列の配列です。

args[0]とargs[1]をprintlnの中で+でつないで表示するプログラムを作ってください

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

解答

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://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/02e29fc82d2706a2a01516d325100b25.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);
	}
}
}

モンテカルロ法で円周率を計算してみる(ループの練習)

  • 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文は新しい手法なので練習しましょう

  • プログラム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

演習 (これを提出してください)

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);
       }
}

2010年10月7日

教科書

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

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

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

javaのマニュアル

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

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  • 不可になる条件(いかのいずれか)
    • 出席回数60%未満(ただしJavaエキスパートを除く)
    • 最終課題未提出

Mac OS XでJavaを使う

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

terminalを起動する

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

  • terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。
  • ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)
  • メニューのターミナル/環境設定...を開きます。 ここで、「テキストをアンチエイリアス処理」に チェック入れておくとフォントが奇麗なのでおすすめです。
  • おなじウィンドウの詳細タブを選ぶと、「文字エンコーディング」という項目があります。 Javaの場合、ここで「Unicode (UTF-8)」を選んでおくと良いです。
  • ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。

miを用意しておく

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

  • Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

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

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、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編)

  • 次に簡単なウィンドウを出してみましょう。
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);
       }

}

これをSimpleWindow.javaという名前で保存して、

javac SimpleWindow.java
java SimpleWindow

とタイプしてコンパイル/実行します。

simplewindow.png

以上のプログラムが完成したら、以下の方法で提出してください。

出来上がったプログラムの提出方法

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

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

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

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

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png

ヒューマンインタフェース 2010年前期

レポート提出いただいている人のリスト

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

0820504
0820515
0820517
0820522
0820525
0820542

レポートのお知らせ

  • 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
  • 締め切り2010年8月31日火曜日
  • 形式分量:A4, 表紙をのぞいて1-2枚程度
  • 提出先:情報科学科5階図書室レポート受付箱もしくはsiio@me.comまでPDFをメール添付 (メール添付の場合は,確認の返事をします.返事が来ない場合は,受付されていないかもしれません.もう一度催促してください)

課題

グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)

  1. GUIのメリットを考察して述べよ。
    (ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
  2. GUIのデメリットをCUIと比較して考察せよ。
    (ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
  3. 上の問いで考察したGUIのデメリットを解消する手法について述べよ。
    (ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)

集中演習「ヒューマンインタフェース」出題範囲 (2009年後期)

英文購読からの集中演習出題範囲(2009年後期)

マルチメディアプログラミング実習2009年後期

最終課題の提出状況

2/1 15時現在の状況です. 出したけどここに掲載されていないという人は, 至急,椎尾(siio@mac.com)まで連絡ください. そのときに,課題を添付して送っていただけると良いかと思います.

http://gyazo.com/e432bdf2525cf3789da670463222d2c0.png

2010年1月の予定

椎尾です。昨夜から熱が出て、今朝はだいぶよくなったのですが、 新型インフルエンザだといけないので、念のために欠席します。 申し訳ありませんが1月14日はTAのみなさんの指導を受けて、昨年から説明している、以下の最終課題(お絵かきプログラム)を 進めてください。(1月14日10pm 椎尾)

5--8時限備考
1月14日課題をすすめてください。TAが対応します椎尾急病で欠席。出欠はとります
1月21日課題をすすめてください。椎尾とTAが対応します。出欠とります
1月28日自主的に課題をすすめてください。TAが対応します椎尾海外出張で休講 。出欠とりません

マルチメディアプログラミング2009の最終課題

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

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

以下のことができれば加点します

  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

取扱説明書の作り方

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

出来上がったプログラムの提出方法

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

締切

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

授業時間変更と休講のお知らせ

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

3-4時限5-6時限7-8時限備考
10月1日休講休講椎尾出張
10月8日休講休講休講台風
10月15日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月22日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
10月29日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
11月5日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月12日マルチメディアIマルチメディアIマルチメディアI伊藤
11月19日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月26日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月3日休講休講椎尾出張
12月10日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月14日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月21日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月28日休講休講椎尾出張

javaのマニュアル

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

2009年12月10日

宿題(レポート)の提出方法

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

演習13.1をやってください

Eclipseを使ってみよう

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

2009年11月26日

宿題:プログラム12.3

JFrameを継承するプログラミング

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();
	}
}

とても簡単なウィンドウ

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);
       }
}

写真ファイルのダウンロード

http://siio.jp/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://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

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

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/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/の内容を表示するプログラムを書いてみよう

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をやってください

キーボードから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をやってみてください

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

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日

宿題:演習11.1

作ったファイルを

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);
		}
	}
}

エラーと例外処理

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

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.");
		}
	}
}

入力した文字を逆に出力するプログラムを作る

[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 の練習

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

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

などと定義すると良い。

Hash Mapの練習

プログラム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");
	}

	}
}

整数を入出力する例

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日

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

  • OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
  • あたらしく追加するメソッドは以下です
    • void inUSD(int x) xドルをお財布に入金します。このとき円に換算して残高に追加します
    • int outUSD(int x) xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
    • 1ドルは90円にしてください
  • 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クラスの改造

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日

クラスとインスタンスの説明をしました

  • クラスは型、インスタンスはそれから作られたもの
    • クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
    • クラスは設計図でインスタンスはそれから作られたもの
  • クラスとインスタンスそれぞれにメソッドと変数がある
    • クラス変数 例:何個のインスタンスを作ったか?
    • クラスメソッド 例:インスタンスを作れ
    • インスタンス変数 例:ひとつのたいやきの重さ
    • インスタンスメソッド 例:たいやきをxxグラム食べる

public static void main の説明をしました

  • javaコマンドは、引数のクラスのクラスメソッドmainを実行します
    • staticと付いているのがクラス変数、クラスメソッドの印です
  • Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます

変数にはメソッド経由でアクセスするのが良いという説明をしました

  • 変数の型などを将来変更してもメソッドの書き換えで対応できます
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();
	}

}

他の点との距離を返すメソッドの例を説明しました

	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とよびます

(教科書ではモリモーフィズムのことをオーバーロードと書いてあります)

演習

  • 演習問題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クラスを作ってみよう

  • 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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

2009年10月22日

演習

  • 演習問題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);
	}
}
}

モンテカルロ法で円周率を計算してみる(ループの練習)

  • 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文は新しい手法なので練習しましょう

  • プログラム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);
	     }
       }
}

演習

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);
       }
}

2009年10月15日

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  3. 出席状況(参考程度)

Mac OS XでJavaを使う

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

terminalを起動する

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を用意しておく

  • Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、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.setVisible(true);
       }

}

これをSimpleWindow.javaという名前で保存して、

javac SimpleWindow.java
java SimpleWindow

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

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年前期

レポートのお知らせ

  • 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
  • 締め切り2009年8月31日月曜日
  • 形式分量:A4, 表紙をのぞいて2-3枚程度
  • 提出先:情報科学科5階図書室レポート受付箱

課題

以下の課題についてレポートを書き,まとめて提出してください。

1982年にIBMが発売したIBM PCは,その後のパーソナルコンピュータ (PC) の標準になり,さまざまな改良が施されつつも,現在のほとんどのPCの起源と言える.しかしながら,IBMは主導権をとることができず,PC部門の利益が悪化したため事業から撤退してしまった.一方で,IBMへの部品提供業者として,CPUやOSを提供したインテル社,マイクロソフト社いまだにPC事業が看板部門であり,大きな利益をあげて業界を主導している.

  • IBMがPC業界で主導権を失っていった理由を,述べよ.
  • あなたが,もし,IBMがPC分野で最盛期を迎えたころにIBM PC部門担当副社長になった ジム・キャナビーノ の立場だったとしたら,この事態をどう立て直すだろうか.考えを述べよ.

ヒューマンインタフェース 2009年前期

レポートのお知らせ

  • 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.
  • 締め切り2009年8月31日月曜日
  • 形式分量:A4, 表紙をのぞいて1-2枚程度
  • 提出先:情報科学科5階図書室レポート受付箱

課題

グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)

  1. GUIのメリットを考察して述べよ。
    (ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
  2. GUIのデメリットをCUIと比較して考察せよ。
    (ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
  3. 上の問いで考察したGUIのデメリットを解消する手法について述べよ。
    (ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)

授業で使う予定のプレゼン資料(一部)

集中演習 (2009年2月) のヒューマンインタフェースの範囲

人の短期記憶について説明されている以下の文を読んでおいてください.

ここに書かれている短期記憶,魔法の数字,チャンクなどの用語を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.

  1. グラフィカルユーザインタフェース(GUI)で用いられるメニューの項目は,5から9項目であることが望ましいと言われている

    #ref(): File not found: "menu1.png" at page "LectureOldOld"

  2. メニュー項目がどうしてもこれを超える場合には,
    • 関連項目を線で区切ってまとめて5から9項目のグループにしたり,
    • 階層的なメニューにして,一階層のメニュー項目を5から9項目にすると良いとされている

      #ref(): File not found: "menu2.png" at page "LectureOldOld"

  3. このように言われているのはなぜだろうか?人の短期記憶について考察して,その理由を推察して述べよ.

マルチメディアプログラミング実習2008年後期

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

以下のことができれば加点します

  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

取扱説明書の作り方

  • ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
    • デスクトップにピクチャxx.pdfというファイルができます
    • これをダブルクリックで開きます
    • 欲しい部分を矩形ツールで選択してコピーします
    • WordかText Editにペーストします
  • ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
  • Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。

出来上がったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
  • このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
  • このフォルダを圧縮してください
  • この圧縮したファイルを以下の手順でサーバにおいてください
  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)
  • 締め切りは1月29日の授業終了(4:20pm)とします
    • この時間までにとりあえず提出してください
    • どうしてもそのあともがんばりたい人は1月29日の11:59pmまでに提出してください
    • 可能な限り差し替えます(見落としていたらごめん)

授業時間変更と休講のお知らせ

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

3-4時限5-6時限7-8時限備考
10月2日休講休講休講海外出張
10月9日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月16日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月23日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月30日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
11月6日マルチメディアIマルチメディアIマルチメディアI伊藤
11月13日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月20日休講休講休講海外出張
11月27日休講休講休講学会出張
12月4日マルチメディアIマルチメディアIマルチメディアI伊藤
12月11日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月18日(マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月8日(月曜授業)(月曜授業)(月曜授業)時間割通り
1月15日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月22日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月29日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り

javaのマニュアル

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

冬休みの課題

年明けからはEclipseを使います。授業で説明しますが、あらかじめ使ってみておいていただけるとわかりやすいかと思います。Eclipseについてはネット上にたくさん情報があります。本家は以下です。

http://www.eclipse.org/

2008年12月18日

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

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

ヒント: 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://lab.siio.jp/index.php?plugin=attach&pcmd=open&file=SimpleAnime.class&refer=Lecture

以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

簡単なアニメーション

動くボールを出す

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();
	}
}

なにもしないウィンドウを出す

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をやってみよう

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

http://lab.siio.jp/index.php?plugin=attach&pcmd=open&file=JTextFieldSample.class&refer=Lecture

完成したら以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

2008年12月11日

ボタンのイベントを処理するプログラム

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();
	}
}

ボタンを表示するプログラム

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を継承するプログラミング

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();
	}
}

とても簡単なウィンドウ

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);
       }
}

宿題の提出

11/13の宿題その1とその2を以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

宿題その1解答編

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解答編

import java.io.*;
import java.net.*;

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

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/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日

宿題その1

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

http://siio.jp/cat.jpg

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

ヒント:InputStream?のインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

きょうの復習

演習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日

エラーと例外処理

名前と名字を入れると挨拶するけど、入力される引数が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.");
		}
	}
}

である。

入力した文字を逆に出力するプログラムを作る

[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? の練習

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

と定義すると良い

HashMap?の練習

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

[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日

Osaifuクラスを作ってみよう

  • 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 解答編

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クラスにコンストラクタを追加してみよう

  • Osaifu() で残金0のインスタンスを作る
  • Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

  • 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 解答編

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日

Point3Dのメソッドを充実

次のプログラムで

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をやってみましょう

クラスとインスタンスの説明をしました

  • クラスは型、インスタンスはそれから作られたもの
    • クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
    • クラスは設計図でインスタンスはそれから作られたもの
  • クラスとインスタンスそれぞれにメソッドと変数がある
    • クラス変数
      • 例:何個のインスタンスを作ったか?
    • クラスメソッド
      • 例:インスタンスを作れ
    • インスタンス変数
    • インスタンスメソッド

モンテカルロ法で円周率を計算してみる(ループの練習)

  • 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);	
	}
}

授業で作ったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイル を入れてください。
  • このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
  • このフォルダを以下の手順でサーバにおいてください
  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)

2008年10月9日

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)

Mac OS XでJavaを使う

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

terminalを起動する

terminal.png
  • terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。
  • ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。(うちの子はこのアイコンを「顔テレビ」と呼んでいます」)
  • メニューのターミナル/ウィンドウ設定...を開きます。 ここで、ディスプレイを選んで、「アンチエイリアス処理を行う」に チェック入れておくとフォントが奇麗なのでおすすめです。
  • おなじウィンドウの下に、「文字セットエンコーディング」というのがあります。 Javaの場合、ここで「日本語(Shift JIS)」を選んでおくと良いです。 この設定は今開いているウィンドウだけに有効です。 以後、この設定をデフォルトにするためには、「設定をデフォルトとして設定」をクリックします。
  • ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。

miを用意しておく

  • Javaのプログラムを作るエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして エディタを呼び出せば良いです。
  • でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
  • いくつかありますが、おすすめの一つはmi (みみかきエディタ) という、便利なフリーウェアのテキストエディタです。
  • これも便利なのでdockに入れておくとよいと思います。

超簡単なプログラム(hello world)を作ってみる

  • ターミナルから、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!   (結果)

本日やった演習

  • 演習3.4 自分の名前の最初の文字の文字コードを表示する
  • arg[0]とarg[1]をつないで表示する
  • 演習5.5 10万円が20万円になる年
  • arg[]の文字をすべてfor-each文で表示する

ヒューマンインタフェース 2008年前期

授業で使う予定のプレゼン資料(一部)

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート締め切り/提出先

  • 締め切り2008年9月8日月曜日
  • 提出先:情報科学科図書室カウンター(501号室)
  • 提出方法:A4用紙のレポート。

レポート課題

以下の課題についてレポートを書き,まとめて提出してください。

  1. 身の回りの道具について以下の考察をせよ.
    1. 以下の日用品を1つ以上例示せよ
      • 使いやすい/使いにくい道具
      • 利用者によって貼紙された道具
    2. 上記の日用品が,なぜこのような状態であるかを、分析せよ
      • 制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、 標準化の問題か、などを議論せよ。
      • また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.

集中演習 (2008年2月) のヒューマンインタフェースの範囲

授業で使ったプレゼン資料

のうち,2,3,4,6ページにある,マッピングとモデルの項目を見ておいてください. このページにある図を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.

  1. 座席の形をした車の電動シート調節スイッチが使いやすいのはなぜでしょうか?
  2. 製品の操作がわかりやすいかどうかの評価実験をする際に,開発関係者が 被験者になっては意味がないと言われています.その理由はなぜでしょうか.

マルチメディアプログラミング2007年後期

javaのマニュアル

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

追試課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

追試提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにしてください (ダブルバッファを使う)
  • 絵や写真のファイルを取り込めるようにしてください
  • 絵をファイルへ書き出す機能を作ってください

以下のことができれば加点します

  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

取扱説明書の作り方

  • ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
    • デスクトップにピクチャxx.pdfというファイルができます
    • これをダブルクリックで開きます
    • 欲しい部分を矩形ツールで選択してコピーします
    • WordかText Editにペーストします
  • ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
  • Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。

出来上がったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
  • このフォルダに名前を付けてください。フォルダの名前は、「学籍番号+氏名(ローマ字フルネーム)+もし必要なら適当な文字か数字」にしてください。
  • このフォルダをzip等で圧縮してファイルにしてください
    • Macintoshではフォルダの上で右クリック(もしくはコントロールキーを押しながらクリック)すると現れるメニューから"を圧縮"を選択します.
  • 圧縮したファイルをsiio@mac.comまでメール添付で送ってください.
  • 受け取ったら返事しますのでかならず確認してください.
  • 締め切りは2月29日の11:59pmとします.締め切り厳守です.

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューとカラーパレットで変えられるようにしてください
  • 消しゴム機能を追加してください
  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)

以下のことができれば加点します

  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

取扱説明書の作り方

  • ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
    • デスクトップにピクチャxx.pdfというファイルができます
    • これをダブルクリックで開きます
    • 欲しい部分を矩形ツールで選択してコピーします
    • WordかText Editにペーストします
  • ちなみに、コマンド(リンゴマーク)+シフト+4を押すとそのあとドラッグした任意の場所が、また、コマンド(リンゴマーク)+シフト+4のあとでスペースキーを押すとそのあとクリックしたウィンドウの画像をキャプチャできます。
  • Control キーを押しながらキーボードショートカットを押すと、画像はファイルではなく、クリップボードに保存されるので、直後に書類にペーストできます。

出来上がったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
  • このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
  • このフォルダを以下の手順でサーバにおいてください
  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)
  • 締め切りは1月24日の授業終了(4:20pm)とします
    • この時間までにとりあえず提出してください
    • どうしてもそのあともがんばりたい人は1月24日の11:59pmまでに提出してください
    • 可能な限り差し替えます(見落としていたらごめん)

ヒューマンインタフェース 2007年前期

授業で使う予定のプレゼン資料

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート課題

  • 締め切り2007年9月7日金曜日
  • 提出先:情報科学科図書室カウンター(501号室)
  • 提出方法:A4用紙のレポート。

課題

以下の2つの課題についてレポートを書き,まとめて提出してください。

  1. 身の回りの道具について以下の考察をせよ.
    1. 以下の日用品を1つ以上例示せよ
      • 使いやすい/使いにくい道具
      • 利用者によって貼紙された道具
    2. 上記の日用品が,なぜこのような状態であるかを、分析せよ
      • 制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、 標準化の問題か、などを議論せよ。
      • また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.
  2. グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して, 以下のことを述べよ.
    1. CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、 WYSIWYG」などの言葉を使って説明せよ.
    2. CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、 正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.

情報と職業 2007年前期

  • 5/2は海外出張のため休講します
  • 5/9, 5/23, 6/6は招待講演になります.詳細はGuestTalksを見てください.

レポートのお知らせ

  • 締め切り2007年9月7日金曜日
  • 提出先:情報科学科5階図書室受付

課題

以下の2つの課題についてレポートを書き,まとめて提出してください。

  1. みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが どういうビジネスモデルで運営されているか調べてください。 たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか) を調べて/推測してください。 (インターネット上の記事をそのままコピーペーストすることは避けてください. 自分の文章で書いてください.もし, 引用する場合はかならずそれがわかるように書いてください.)
  2. 某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。 売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、 チケット、旅行サービス、大学グッズなどを販売しています。 顧客のほとんどが、インターネットを日常的に利用しているため、 インターネットの技術と結びついたビジネス展開を計画しています。 そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。 インターネット技術を活用したビジネスモデルを提案してください。 また,このモデルを実現するための, 具体的なサイトのイメージ(入り口のページ,注文のページなど)も示してください. そのビジネスモデルを実現した場合に、生協にとってどのような メリットがあるかも述べてください。

マルチメディアプログラミング2006年後期

javaのマニュアル

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

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

  • ペンの太さをメニューで変えられるようにしてください
  • ペンの色をメニューで変えられるようにしてください
  • 消しゴム機能を追加してください

以下のことができれば加点します

  • ウィンドウの大きさを変えても絵が消えてしまわないようにする (ダブルバッファを使う)
  • 絵や写真のファイルを取り込めるようにする
  • いろいろな効果のペンを作る(たとえばペンの動きに従って文字が出る)
  • 絵をファイルへ書き出す機能を作る
  • そのほか、世の中のお絵描きプログラムにありそうな機能を実現する

詳細はSimpleDrawを見てください

取扱説明書の作り方

  • ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの取扱説明書を書いてください。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
    • デスクトップにピクチャxx.pdfというファイルができます
    • これをダブルクリックで開きます
    • 欲しい部分を矩形ツールで選択してコピーします
    • WordかText Editにペーストします

出来上がったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイルと、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
  • このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
  • このフォルダを以下の手順でサーバにおいてください
  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名「氏名(ローマ字フルネーム)+適当な文字か数字」の後半を数字だったら増やして、アルファベットだったら辞書順の後の文字にください。)

1月10日の課題

  • ドラッグして書き始めるときの不要な直線を消してください
  • マウスポインタの位置と書いている場所がずれているのを直してください

1月10日の線を引く簡単なプログラム

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日のマウスイベントのサンプル

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の回答例

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読み込みの例

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日の宿題

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日の解答例

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年前期

授業で使っているプレゼン資料

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート課題

  • 提出期限: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年後期

演習課題;お絵描きプログラムを作る

  • 授業で紹介したテクニックを使ってお絵描きプログラムを完成させてください
  • ツールはテキストエディタ+ターミナルでも、Eclipseでもよいです
  • 機能を充実させてください。市販のお絵描きプログラムをまねて、いろいろ機能を考えてください。たとえば、以下のような機能が考えられます
  • ペンの色を変える機能
  • ペンの太さを変える機能
  • 消しゴム機能(白色の太いペンで代用できるかも)
  • 画面を一気にクリアする機能
  • 文字を書き込む機能
  • 画面をスクロールする機能
  • コピーアンドペーストの機能(上級編かも?)
  • 画像ファイルとして保存する機能(上級編かも?)
  • 線で囲まれた部分を塗りつぶす機能(これはさらに上級かも)
  • そほのかお遊び機能
    • 写真を取り込む機能
    • スタンプ機能(マウスの場所に小さなイメージを貼付けていく)
    • かわったブラシ(筆タッチとか)のペンを実現する機能
    • テキスト列をマウスの移動にそって描いていく
  • 基本的な骨組みはDrawFrame.javaを参考にするとよいかも

説明マニュアルの作り方

  • ApplicationsからMicrosoft Office 2004/Microsoft Wordもしくは、Text Editを選択して、これを使って、今回作成したプログラムの使い方マニュアルを書いてください。
  • せっかくですので作った機能はぜんぶここで説明してください。(プログラムは私も試してみますが機能を見逃すかもしれません)
  • スクリーンキャプチャした図も入れてください。図は次のようにして作ります
    • スクリーンキャプチャしたいところで、コマンド(リンゴマーク)+シフト+3を押します。
    • デスクトップにピクチャxx.pdfというファイルができます
    • これをダブルクリックで開きます
    • 欲しい部分を矩形ツールで選択してコピーします
    • WordかText Editにペーストします

出来上がったプログラムの提出方法

  • フォルダを作ってその中にjavaファイルとclassファイルと、説明マニュアルファイルと、それ以外に必要なファイルがもしあればそれらを入れてください。フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
  • このフォルダに名前を付けてください。フォルダの名前は、「氏名(ローマ字フルネーム)+適当な文字か数字」にしてください。
  • このフォルダを以下の手順でサーバにおいてください
  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
  • レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
  • 同じ名前のフォルダを投げ込むと、前のが消えます。ということで新しいバージョンができたら同じ名前のフォルダを作って提出し直してください。(他人が同じ名前のフォルダを投げ込むと、やっぱり消えてしまいます。そういう間違いやいたずらを防止するために、フォルダ名「氏名(フルネーム)+適当な文字か数字」の後半は秘密にしておいてください。

入れておくと便利なソフトウェア

mi (みみかきエディタ)

便利なフリーウェアのテキストエディタです。 http://www.mimikaki.net/からダウンロードして/Users/ユーザ名/Applicationsにコピーします。 (Applicationsディレクトリが存在しない場合は作成)。

Terminal Here Plugin

ファインダーの上で右クリック(もしくはコントロールキー+クリック)すると現れる メニューの中に、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

  • これはすでに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を使う方法

How2Java

お絵描きソフトの作り方のヒント

DrawFrame.java

情報と職業2005年前期

レポートのお知らせ

  • 締め切り2005年9月末
  • 提出先:情報科学科5階図書室受付

課題

以下の3つの課題の中から2つを選んで、提出してください。

  1. みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが どういうビジネスモデルで運営されているか調べてください。 たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか) を調べて/推測してください。
  2. 某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。 売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、 チケット、旅行サービス、大学グッズなどを販売しています。 顧客のほとんどが、インターネットを日常的に利用しているにもかかわらず、 インターネットの技術と結びついたビジネス展開をほとんど行っていません。 そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。 インターネット技術を活用したビジネスモデルを提案してください。 そのビジネスモデルを実現した場合に、生協にとってどのような メリットがあるかを述べてください。
  3. 授業のノートを提出してください。自筆ならコピーでも可。 だれかのノートを写してもokですが、その場合は誰のノートを写したかを明記してください。 オリジナルのノートの人の方に高い点数をつけます。一方、欠席した授業の分を補うために、 他人のノートを参照して完璧なノートを作っていただいた場合は、高く評価します。 ノート返却を希望する人は、メモ書きしておいてください。 後日、研究室のドアのところで返却いたします。

人間機械系特論 2005年前期

レポート課題

  • 提出期限:2005年9月30日(金曜日)
  • 提出先:情報科学科図書室カウンター(501号室)
  • 提出方法:A4用紙のレポート。
  • 課題

(1-1) 以下の日用品を1つ以上例示せよ

  • 使いやすい/使いにくい道具
  • 利用者によって貼紙された道具

(1-2) なぜ(1-1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

(2) 以下のような計算機の応用を、1つ以上考えて、提案せよ

  • 身の回りの環境や日用品の機能を計算機により増幅するアイディア、または
  • 身につけたコンピュータにより人の活動を支援するアイディア、 例えば、賢い家電製品、道案内コンピュータ、賢い引き出し、机、椅子、家具、賢い鏡、ニュースを印刷するトースター、ネットワークで連携する日用品、バーチャル看板などのようなアイディア。

ヒューマンインタフェース 2005年前期

レポート課題

  • 提出期限:2005年9月30日(金曜日)
  • 提出先:情報科学科図書室カウンター(501号室)
  • 提出方法:A4用紙のレポート。
  • 課題

(1) 以下の日用品を1つ以上例示せよ

  • 使いやすい/使いにくい道具
  • 利用者によって貼紙された道具

(2) なぜ(1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

玉川大学での非常勤講師の授業について

LectureTamagawa をご覧ください.


このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-03 (木) 08:36:58 (1510d)