#contents
#author("2018-12-06T07:56:25+00:00","ocha","ocha")
//#contents

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

教科書の3.5節を読んで、
ユーザモデルとデザインモデル(設計者のモデル)について理解しておいてください(36ページから40ページ)。
この部分を授業で説明した資料を以下に置いておきます。

*HCI特論 2016年度後期 [#h87f9a58]
- https://www.dropbox.com/s/q4zhn205vrvyfgr/forexam2018.pdf?dl=0

**2016年12月20日 [#se491e7e]
皆さんは、自分が作ったプログラムを人に使ってもらった時に、
思いもしないようなバグを発見してもらった経験がありますでしょうか?
他人は、
プログラムを作った自分だったら絶対に行わないような操作をやってしまいます。
そこで、
- 製品になって人々が使うようになってから発覚するプログラムのバグ、
- 多くの人々が使う機械の誤操作や故障を引き起こしてしまう設計ミス
を設計者、開発者が排除できない原因について考えておいてください。

- https://www.dropbox.com/s/bsrageh878pmg6t/HCI_c7.ppt.pdf

xcodeのプログラミング

http://www.siio.jp/index.php?How2MacOSXProgramming

*大学院HCI演習および人間機械系演習 2018年度後期 [#r13a4a15]


*マルチメディアプログラミング実習 2016年度後期 [#s6662b38]
**講義予定 [#ab05a7eb]

10月30日の福地先生講義は延期になり、通常授業になります。

**2016年11月24日(自習) [#w64e91e4]
-10月9日ガイダンス
-10月16日休講
-10月23日
-10月30日
-11月6日
-11月13日
-11月20日[[明治大学福地先生:https://www.meiji.ac.jp/ams/professor/6t5h7p00000qmg84.html]]
-11月27日
-12月4日
-12月11日
-12月18日
-12月25日
-1月8日
-1月15日
-1月22日

**第12章 Swing (つづき) [#k3c5ec7f]

***ラベルを表示するウィンドウ(復習) [#t8735d81]

前回、ウィンドウの中に、Hello!という文字を出してみました。
//レポート提出者一覧(2017/2/10 12:00現在)

http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png
**発表の記録 [#m6c7145e]

 学籍番号
 1840702
 1840706
 1840708
 1840709
 1840710
 
 1840644 (聴講)
 1840645 2018年11月6日
 1840648
 1840649 2018年11月6日
 1840651
 1840655
 1840658
 1840659
 1840661
 1840662
 1840663
 1840665
 1840669
 1840673 2018年11月6日
 1840675
 1840677
 1740671




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

**出席表明アプリケーション [#s026a135]

- http://siio.jp/IamAttending.zip

#ref(http://siio.jp/gyazo/b1128c100d39263a8480428af2d05da0.png,200x200)


- 初めて起動する時は、右クリックして、「開く」ボタンを選んでください。

**2018年12月6日 [#nef14ee4]

**第12章 Swing 続き [#mfed109b]



***ボタンを1個貼り付ける [#c069f727]

JLabelのところをJButtonにしてみましょう

解答例:

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

http://www.siio.jp/index.php?plugin=attach&pcmd=open&file=button.png&refer=How2JavaProgramming

JFrameのインスタンスにgetContentPaneをお願いするとContainerインスタンスを返してくれます。
これに、JLabelのインスタンスを貼り付けると表示されるわけです(この文章に現れる?マークは無視してください)
***ボタンを2個表示するウィンドウ [#cb6cf696]


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

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

そこでプログラム12.2では、
JPanel (パネル) に2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。


http://gyazo.com/03c28df2419065241b8736b7b69d7fd3.png

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

(解答例を見て実行できたら次に進んでください)
 


***ボタンのイベントを受け取るプログラム [#z7cc6061]

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

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

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

必要があります.ActionListenerをimplementするクラスはなんでも良いのですが、
教科書のプログラムでは、JFrameから作る本体クラスをイベント受け取り手にしています。
イベント受け取り専用クラスを作るなどの設計も、もちろん可能です。
プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

プログラム12.3とこれに関する教科書の説明を読んで,
ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

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


ヒント(最初の6行です)
 import javax.swing.*;
 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 () {
 	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();
 	}
 
 }

(解答例を見て実行できたら次に進んでください)
ここではボタンを区別するために、インスタンス(への参照)を比較した。それ以外の方法もある。
一つは、ボタンのテキストを入手することである。ボタンのテキストを入手してそれを比較しても良い。
ボタンのテキストを表示するだけなら以下のようにしても良い。

         public void actionPerformed(ActionEvent e){
                 System.out.println(((JButton)e.getSource()).getText());
         }

***プログラム12.4を入力して動かしてください [#a8be911d]
もう一つは、ボタンにコマンドを書く方法である。
ボタンにsetActionCommand(String)を定義しておくと、getActionCommand()で知ることができる。

 button1.setActionCommand("hello");

ボタンは、並べ方の規則を決めて、配置することができます。このプログラムは、いくつかの方法を紹介しています。
ボタンを並べたいときの参考にしてください。
としておけば、actionPerformedの中で

 e.getActionCommand();

で文字列を得られる。例えば、

         public void actionPerformed(ActionEvent e){
                 System.out.println(e.getActionCommand());
         }

でコマンド部分を印刷できる。

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


***プログラム13.1のようにボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。 [#f4fb000e]
***プログラム12.4をやってください。 [#f163e343]

まずは、プログラム12.4を見て、上記のプログラムを拡張して5個のボタンに対応して, WEST, EAST, SOUTH, NORTH, CENTERと表示されるプログラムをつくってください。さらにこれを拡張して、プログラム13.1のようなボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。
***演習12.2(改) [#b195cae9]

なお、以下のようにすると、ボタンの名前を印刷することができます。
上で作った二つのボタンのプログラムに対して、レイアウトマネージャのFlowLayoutを使って、左寄せ、センタリング、右寄せを試してください。

         public void actionPerformed(ActionEvent e){
                 System.out.println(((JButton)e.getSource()).getText());
         }
演習のヒント

 		bt1 = new JButton("button1");
 		bt2 = new JButton("button2");
 		panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
 		bt1.setActionCommand("this is b1");
 		bt2.setActionCommand("this is b2");

FlowLayoutにはCENTER, LEFT, RIGHTなどの揃え方の指定がありますが、これをコンストラクタの引数で指定できるようです。addのところではレイアウト指定しないようです。

***プログラム13.1の説明図 [#ec2d7584]


- panel1はFlowLayoutを使っています。これは流れるように均等にボタンを配置するレイアウトです。
- panel2はY軸方向のBoxLayoutを使っています。Y軸方向に並べます。
- panel3は3 x 2のGridLayoutです。3行2列に並べています。
- panel4はBorderLayoutです。NORTHとSOUTHを使っています。
- panel5はX軸方向のBoxLayoutを使っています。X軸方向に並べます。
**第13章 様々なコンポーネントとレイアウト [#nfdf4f5e]

この5枚のラベルをウィドウのcontainerに貼り付けているのですが、そこでもレイアウトのオプションを使っています。
BorderLayoutを使って、東西南北、センターに、ラベルを貼り付けています。



***プログラム13.1の説明図 [#ec2d7584]
http://gyazo.com/649bbe400f96c8c31923bcf7e5aebbd4.png

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

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

***提出 [#ge1f31d6]

***演習13.1をやってください [#xc59c932]
本日作ったボタンを二つ表示するプログラム(どのバージョンでも良いです)のjava, classを、いつものように学籍番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

こんなのをつくってください。
左のテキストフィールドに文字を書き込むことができます。
left to rightボタンを押すと、その文字が右のフィールドに転送されます。
clearボタンを押すと、文字が消えます。

[以下を、宿題としていましたがみなさん苦労されているので撤回します。演習にします。次回の授業の最初に皆さんでやっていただきます。]

http://gyazo.com/999f1e766551a994186cc3d159bde0bf.png
***演習:プログラム13.1のようにボタンを配置して、それぞれを押すと、それぞれのボタンの名前が表示されるプログラムを作ってください。 [#kc595c15]

ヒント:プログラム12.4を見て、上記のプログラムを拡張して5個のボタンに対応して, WEST, EAST, SOUTH, NORTH, CENTERと表示されるプログラム作るとわかりやすいかもしれません。そうすれば、プログラム13.1のボタンの名前を表示するプログラムが作りやすいと思います。次回の授業でつづきをやります。

BorderLayoutでもできるようですが、私はGridLayour使ってみました。
なお、以下のようにすると、ボタンの名前を印刷することができます。

  		panel.setLayout(new GridLayout(2,2));
 		panel.add(textleft);
 		panel.add(textright);
 		panel.add(button);
 		panel.add(clearbutton);
         public void actionPerformed(ActionEvent e){
                 System.out.println(((JButton)e.getSource()).getText());
         }


ボタンが複数になるので、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);
 	}
 }


(解答例を見て実行できたら次に進んでください)

***どのボタンからのイベントであるかを識別する方法 [#i076dba0]
**講義予定 [#ab05a7eb]

-10月4日ガイダンス
-10月11日
-10月18日休講
-10月25日
-11月1日休講
-11月8日
-11月15日
-11月22日
-11月29日
-12月6日
-12月13日
-12月20日
-12月27日
-1月10日
-1月17日
-1月24日

-プログラム12.3では
--ボタンへの参照を、action Performedから参照できる変数に入れて
--action Performedの中で、e.get Source()してButtonのインスタンスを得て比較している
-プログラム12.4では、
--準備として button.set Action(button.get Text());でボタン文字をactionとして設定して
-- action Performedの中で e.get Action Command()でアクションを得て文字比較している 
-ということで以下のようなことも可能
--acttion Performedの中で、get Source()してボタンを得る
--そのボタンからget Textしてボタンの文字列を得て文字比較する
--ただし、get Sourceで得られるのはボタンの親クラスなのでButtonにキャストする
--以下をaction Performedのなかで試してみよう
 System.out.println((JButton)(e.getSource()).getText());




***13.5節を読んで,プログラム13.5を実行してください [#o616a647]
**javaのマニュアル [#beafbfad]

ここではJMenuBarインスタンスをJFrameにsetMenuBarメソッドで取り付けています。
JMenuBarインスタンスにはJMenuインスタンスを貼り付けることができます。
これがメニューバーに現れる項目になります。
メニューバー項目をクリックして現れるメニュー項目がJMenuItemのインスタンスです。
JMenuItemのインスタンスはaddメソッドでJMenuBarに貼り付けます。
//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
//http://docs.oracle.com/javase/jp/6/api/
http://docs.oracle.com/javase/jp/8/docs/api/index.html

** 出来上がったプログラムの提出方法 [#bd9cbbf8]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら
を入れてください。
フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiro01のように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順で
 /home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
 cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで
以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。

http://siio.jp/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-授業中でしたら、[[ココを見ると:http://siio.jp/lecture/java_report.html]]一覧をみることができます。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)

http://gyazo.com/dd4e103c011682b3a78b9ed0c8d5134b.png

JMenuItemの代わりに、JMenuBarのインスタンスをaddメソッドでJMenuBarに貼り付けると、
カスケードメニューが作れます。
***教科書 [#a7e1ce26]

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

http://gyazo.com/4755cce7280963b32050db455d265cc1.png
http://www.amazon.co.jp/dp/4883732258/

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。
買ってください。もしくは、先輩から安く譲ってもらってください。

***演習13.2をやってください(メニュー項目は何でも良いです) [#rba61398]
*** この講義の目的 [#l5592b29]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

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

http://gyazo.com/2d9c3b6534e7b87fcd3ec22be00d5fed.png
*** 成績評価 [#c732dbb9]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)

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

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

 ... implements ActionListener6: {
**今学期の授業(終了分) [#od53d56c]

とありますが、これは、

 ... implements ActionListener {
**第1章および第2章 [#y3ae1beb]

の間違いのようです。

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

**終章 おまけ [#s65aaa02]
//#ref(How2Java/terminal.png)

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

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

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。
以下のようにするとイベントをうけとれるます。
以下のプログラムを動かして試して見てください。
- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。

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

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


---------------------------------------
***おすすめテキストエディタCotEditor[#c7258b9c]

https://coteditor.com/img/appicon/128@2x.png

**2016年11月17日(自習) [#ja1be39d]
- Javaのプログラムを作るテキストエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

*** オブジェクト指向に関する小テスト [#t456c822]
- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

TAの皆さんの指示に従って、テストを受けて、相互で採点してください。
- いくつかありますが、おすすめの一つはCotEditorという、便利なフリーウェアのテキストエディタです。

*** 【課題1】写真ファイルのダウンロード(つづき) [#j95a8deb]
- これも便利なのでdockに入れておくとよいと思います。

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作りました。
解答例は以下でした。
こちらからダウンロードできます。
演習室のOSにあわせたバージョンをダウンロードして~/Applicationsにコピーします。

解答例
https://coteditor.com/archives.ja

 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バイトずつ読み書きすることで、処理速度が向上すると期待できます。
そこで、複数バイト読み書きするよう、上記のプログラムを変更して、
実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。
*** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293]


 read
 
 public int read(byte[] b)
          throws IOException
 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
 実際に読み込まれたバイト数は整数として返されます。
 戻り値は、バッファに読み込まれたバイトの合計数。ストリームの終わりに達してデータがない場合は -1
- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、cotEditerを起動して作成します。

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

 write
 
 public void write(byte[] b,
                   int off,
                   int len)
            throws IOException
 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。
 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

を使ってください。
http://siio.jp/gyazo/20121004010107.png

-ヒント1

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

 byte[] data = new byte[512];
 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)

という配列を用意して、

 	int datalength;
 	while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
- 次に簡単なウィンドウを出してみましょう。

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

- ヒント2

このヒントでは512バイトを読み込むことにしています。でも、InputStreamのメソッドを見ると、available()というのがあります。
 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);
        }
 
 }

 available()
 この入力ストリームのメソッドの次の呼出しによって、ブロックせずにこの入力ストリームから読み込むことができる(またはスキップできる)推定バイト数を返します。
これをSimpleWindow.javaという名前で保存して、

これを使えば、適切な長さを見積もれるかもしれません。
 javac SimpleWindow.java
 java SimpleWindow

*** 【課題2】引数で指定したURL先データのダウンロード [#v6d50b46]
とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.

#ref(How2Java/simplewindow.png)

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

 curl http://ocha.ac.jp/

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

 curl http://siio.jp/cat.jpg > cat.jpg
**第3章 [#xc22f04b]

などとすると、ファイルとして保存できます。
上のプログラムを発展させて、curlに近いプログラムを作ってみましょう。
-演習1

また、ここでも1バイトずつ読み込むのではなく、まとめて読むことで速度の改善を図りましょう。
--演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。

***提出 [#i22f76b9]
-演習2

上記の引数のURLをファイルにするプログラムを作ってください。
また、cat.jpgのファイル取得で、1バイトずつ読むのに比べて、
まとめて読むことでどれくらい速度が改善したかを、
レポートにしてください。レポートの書式は任意です。(テキストファイルでかまいません)
--コマンドの引数はarg[0], arg[1] ... などにString型の配列としてプログラムに引き渡されます。
--二つの引数を与えたときに、それが+でつないで表示されるプログラムを作りましょう。

これらのjava, class, レポートのファイルをまとめて、出席番号+名前のフォルダに入れて、
圧縮して提出してください。

***ラベルを表示するウィンドウ [#xedfffec]
http://gyazo.com/8159f78165e17781a7110de3763c833c.png

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

http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png

--以下は引数一つを表示するだけのサンプルです。これをもとに考えてください。
--arg[0]とarg[1]をprintlnの中で+でつないで表示すれば良いです。

解答例:

 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();
 	}
 
 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }


**2016年11月10日 [#h9594472]
解答

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

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

 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);
 		}
 	}
 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }


これでdout.datという名前のファイルができあがるはずです。 作ったファイルを
**第4章 [#f2e95643]

 od -h dout.dat
 
または
--演習4.2をやってみよう

 hexdump dout.dat

してみてください
**第5章 [#p54c6568]

 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004
***演習 [#leda55b3]

-演習問題5.4(変更)

乱数を10個表示する

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

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

***宿題:演習11.1 をやってください [#z72d00c6]
次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDを表示するプログラムを書け。
動作例を以下に示す。

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください
http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png

解答例
解答例:


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


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

解答例:

作ったファイルを
 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);
 		}
 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.001%だと倍になるのに何年かかるだろうか。確かめてみよう。

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

ヒント:
//http://gyazo.com/95cd94db39b407e7961355b20da8fc67.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);
 		}
 	}
 }

-演習5.6をやってみよう

while文をfor文に変えてみる

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

 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);
 		}
 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文は新しい手法なので練習しましょう [#s17e2f54]

***プログラム11.5をやってこれを拡張して演習11.2をやってください [#ya1ca508]
-プログラム5.7の代わりに以下をやってみよう

キーボードから1行入力された文字列によるテキストファイルを作る
 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/f9aee7f492d574f870e85e2022df374c.png
*** 演習 [#vc946bd9]

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

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

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

-解答例


解答例

 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);
 			}
 	}
 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }


-今日の課題提出

ArgsTest2.javaとArgsTest2.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

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

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png
**第6章 クラスの基礎 [#h5b270c6]

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

ヒント1

 import java.net.*;
http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png

が必要です。

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

でURLクラスのインスタンスが得られる。
今作ったTestPoint3D.javaを変更して

 InputStream istream = targetURL.openStream();
- 二つのインスタンスpt1, pt2を作り、
- それぞれのインスタンス変数x, y, zを10,20,30と-10,-20,-30にして、
- それぞれのインスタンスメソッドpinrt()を呼ぶ

でこれからInputStreamのインスタンスが得られる。
ようにしてください。
この結果、以下のような実行結果が出るようにしてください

 InputStreamReader isreader = new InputStreamReader(istream);
http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

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

 BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。
***クラス変数・メソッドとインスタンス変数・メソッド [#w88794f1]

- staticとついているのがクラス変数、クラスメソッド
- staticが付いていないのがインスタンス変数、インスタンスメソッドです

ヒント2


 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }
***public static void main の説明をしました [#p8e5e198]
-javaコマンドは、引数のクラスのクラスメソッドmainを実行します
--staticと付いているのがクラス変数、クラスメソッドの印です
-Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます


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

ヒント3:
http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

 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 );
 		
 ここで一行ずつ読み込む
 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

***変数にはメソッド経由でアクセスするのが良いという説明をしました [#c813a888]
-変数の型などを将来変更してもメソッドの書き換えで対応できます

解答例:

 import java.io.*;
 import java.net.*;
 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;}
 
 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...");
 		}
 	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();
 	}
 
 }


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

***写真ファイルのダウンロード [#edb3e256]
 10, 20, 30
 -10, -20, -30

 http://siio.jp/cat.jpg 
という結果が出るようにしましょう

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

ヒント1:

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


ヒント2:

 import java.io.*;
 import java.net.*;
        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();
 
 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");
        }

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

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

 istream.read()
 10, 20, 30
 -10, -20, -30
 74.83314773547883

で読んで、
という結果が出るようにしましょう

 fout.write(1バイト)

で書き出します。


解答例

 import java.io.*;
 import java.net.*;
        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();
 
 //http://siio.jp/cat.jpg
 //をダウンロードして、cat.jpgというファイルを作るプログラム
                System.out.println(pt1.distance(pt2));
 
 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...");
 		}
 	}
 }
        }

--解答例

	
 	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 ( Point3D p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}


**第12章 Swing [#w5863135]

-今日の課題提出

***とても簡単なウィンドウ [#r57b34f9]
Point3D.javaとPoint3D.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

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

**2018年10月25日宿題: Osaifuクラスを作ってみよう [#ce76c10a]

次回は休講ですので再来週11/8の授業の最初に回収します。

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

*** JFrameを継承するプログラミング [#y09a72d9]
 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[]) {
 		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();
 	}
 
 	public static void main (String argv[]) {
 		SimpleWindow sw = new SimpleWindow();
 		sw.initialize();
 	}
 }
http://gyazo.com/c618901458edc1ba338cab87d2810157.png


-Osaifu.java 解答編

***本日のレポート [#o4524903]
 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();
 	}
 }

上記のプログラム(URLJpeg.java, URLJpeg.class) を、出席番号+名前のフォルダにいれて、ZIP圧縮して提出してください。`
--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

***ラベルを表示するウィンドウ [#xedfffec]
--このためには、例えばoutメソッドを以下のようにすれば良い

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、
Hello!という文字を出してみよう。
 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	



http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png

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

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

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

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

とすることになる。

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

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

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

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

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


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

**2016年11月3日 [#u190338b]


**第8章 継承 [#ka97b6ac]

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

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



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

-動作例

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {



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

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



-解答例


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


*** OsaifuUSDクラスの改造(1) [#g8c0b7a2]

親のメソッドを活用しても良い

 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		return ( out( use * 90) / 90 );
 	}
 
 	public void inUSD(int usd) {
 		in( usd * 90 );
 	}
 	
 …
 
 }


親のメソッドを呼ぶことを明示的に書くためにsuper.をつかってもよい。


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		return ( super.out( use * 90) / 90 );
 	}
 
 	public void inUSD(int usd) {
 		super.in( usd * 90 );
 	}
 	
 …
 
 }


*** OsaifuUSDクラスの改造(2) [#sa44f577]

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


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


-解答例

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

***小テスト練習 [#g4c60a6e]

以下のプログラムの中で、
クラス、インスタンス、サブクラス、スーパクラス、クラスメソッド、インスタンスメソッドがどれであり、
インスタンス化、継承がどこで行われているのか確認してください。
(importで始まる一行目はまだ説明していない内容なので小テストでは扱いません。無視してください)


 import javax.swing.JFrame;
 
  public class SampleWindow extends JFrame {
 	public static void main(String args[]) {
 		SampleWindow w = new SampleWindow();
  		w.setVisible(true);
 	}
  }



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

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

 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で指定します。
エラーが出たらそれを捕捉する処置を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クラスとコレクションフレームワーク [#w938c6ce]
**第10章 Stringクラスとコレクションフレームワーク [#t1974e59]

*** 入力した文字を逆に出力するプログラムを作ってみましょう [#xeaa862c]
***最初の引数(文字列)を表示するプログラムを作る。クラス名はTestString [#h1a15f22]

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


***演習10.1改:最初の引数(文字列)を逆に出力するプログラムを作る [#baa14121]

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


さらには、引数がない場合は引数入力を促すことを表示してみよう。
 
 [e100:?/Documents/java] siio% java TestString
 please input a word
 [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 の練習 [#d2a5cbd0]

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

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

などと定義すると良い。


***program 10.2 改造 [#j2f946c0]

Alice --> Bob  --> Cindy  --> DaveというLinkedListをつくって、
それからtoArray()メソッドでString配列を作ってfor each文で要素を印刷する

 import java.util.*;
 
 public class LinkedListTest{
 
         public static void main(String[] argv) {
 
                 LinkedList<String> list = new LinkedList<String>();
                 list.add("Alice");
                 list.add("Bob");
                 list.add("Dave");
                 list.add("Cindy");
 
                 Object[] names = list.toArray();
 
                 for(Object s: names ) System.out.println(s);
 
         }
 
 }


***宿題:Hash Mapの練習 [#jf7eb616]
***Hash Mapの練習 [#jf7eb616]

教科書の10.5節をよんでください。

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



- 今日の課題提出

-------------
EtoJ.javaとEtoJ.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

**2016年10月27日 [#u190338b]
**第11章 入出力 [#hb3a05b8]

今週と椎尾は手術入院でお休みします。
その代わり自習とします。

それぞれの課題は、次のページをみてください。
***一番簡単なファイル書き出し [#e97b1c07]

- [[2016年10月27日:http://www.siio.jp/index.php?JavaProgramming20161027]]
 import java.io.*;
 
 public class FoutTest {
 	public static void main(String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("fout.dat");
 			fout.write(1234);
 			fout.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }

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

 od -h fout.dat
 
または

 hexdump fout.dat

**2016年10月20日 [#e68c98af]
してみてください

**第6章 クラスの基礎 [#h5b270c6]

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

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

http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png



-演習問題6.1, 6.2, 6.3

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

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

***public static void main の説明をしました [#p8e5e198]
-javaコマンドは、引数のクラスのクラスメソッドmainを実行します
--staticと付いているのがクラス変数、クラスメソッドの印です
-Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます


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

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png




***変数にはメソッド経由でアクセスするのが良いという説明をしました [#c813a888]
-変数の型などを将来変更してもメソッドの書き換えで対応できます

 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;}
 import java.io.*;
 
 	void print () {
 		System.out.println(x + ", " + y);
 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);
 		}
 	}
 
 	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();
 	}
 
 }


-Point3Dのメソッドを充実させて次のmain()メソッドで 
これでdout.datという名前のファイルができあがるはずです。 作ったファイルを

 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();
 od -h dout.dat
 
        }
または

 hexdump dout.dat

してみてください

-Point3Dに、他の点との距離を返すメソッド distance ( Point3D p ) を実装して、次のmain()メソッドで 
 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004


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

という結果が出るようにしましょう
***整数を入出力する例 [#j899e2e7]


        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();
 import java.io.*;
 
                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);
 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);
 		}
 	}
 	
 	double distance ( Point3D p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}
 }

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

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

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

**2016年10月13日 [#oa15ca00]

解答例

***CotEditorもおすすめです [#c7258b9c]

https://coteditor.com/img/appicon/128@2x.png

こちらからダウンロードできます。
演習室のOSにあわせたバージョンをダウンロードします。

https://coteditor.com/archives.ja


**第3章 [#xc22f04b]

-演習

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


-argv[0]を表示する

 class ArgsTest {  
 public static void main (String argv[]) {
 	System.out.println(argv[0]);
         }
 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);
 		}
 	}
 }


--argv[0]とargv[1]をprintlnの中で+でつないで表示する
***プログラム11.3をやってみてください [#h15edee7]

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

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

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

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


**第5章 [#p54c6568]

***演習 [#leda55b3]

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

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

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

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

ヒント:

解答例:

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



***for-each文は新しい手法なので練習しましょう [#s17e2f54]
***文字ストリームをファイルに書いて読み込むプログラム [#bed8144f]

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


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

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。
キーボードから1行入力された文字列によるテキストファイルを作る

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

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

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

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


- 今日の課題提出

**第6章 クラスの基礎 [#h5b270c6]
「キーボードから1行入力された文字列によるテキストファイルを作る」プログラムの.javaと.classファイルを、出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。

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

- 解答例

http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.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);
 			}
 	}
 }


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

**欠席状況 [#l124acfe]
3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。
//欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。
***http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう [#kf0c5bf6]

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

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

//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
ヒント1

http://docs.oracle.com/javase/jp/8/docs/api/index.html
 import java.net.*;

が必要です。

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

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

 InputStream istream = targetURL.openStream();

**レポート提出方法 [#ac87d6ac]
でこれからInputStreamのインスタンスが得られる。

 /home/isstaff/siio/Public/Drop Box/.
 InputStreamReader isreader = new InputStreamReader(istream);

に提出してください。ターミナル.appからなら
でこれからInputStreamReaderのインスタンスが得られる。

 cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
 BufferedReader breader = new BufferedReader(  isreader );

としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで
以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。
でこれからBufferedReader のインスタンスが得られる。

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

ヒント2

** 出来上がったプログラムの提出方法 [#bd9cbbf8]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら
を入れてください。
フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiro01のように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順で
 /home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
 cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで
以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。

http://siio.jp/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-授業中でしたら、[[ココを見ると:http://siio.jp/lecture/java_report.html]]一覧をみることができます。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)
 import java.io.*;
 import java.net.*;
 
 public class URLTest {
 	public static void main (String argv[]) {
 		try {
 			
			 
			 ここにプログラムを書く
			 
			 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }


***教科書 [#a7e1ce26]
ヒント3:

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png
 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 );
 		
 ここで一行ずつ読み込む
 
 		} catch (IOException e) {
 			System.out.println("error...");
 		}
 	}
 }

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

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

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

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

*** 成績評価 [#c732dbb9]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)
***写真ファイルのダウンロード [#edb3e256]

 http://siio.jp/cat.jpg 

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

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

ヒント1:

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

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

*** terminalを起動する [#ia8beba9]
 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");

//#ref(How2Java/terminal.png)

http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png
というインスタンスを作って、

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

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

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

http://siio.jp/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png
で書き出します。

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

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

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

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


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

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

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

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

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。
 read
 
 public int read(byte[] b)
          throws IOException
 入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
 実際に読み込まれたバイト数は整数として返されます。
 戻り値は、バッファに読み込まれたバイトの合計数。ストリームの終わりに達してデータがない場合は -1

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

- miを使うには、http://www.mimikaki.net/からダウンロードして~/Applicationsにコピーします。
 write
 
 public void write(byte[] b,
                   int off,
                   int len)
            throws IOException
 指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

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

http://siio.jp/gyazo/7579915fefe1ecd9c0e4e2ddfa55177d.png
-ヒント


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

という配列を用意して、

- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、miを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。
 	int datalength;
 	while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

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

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

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

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

http://siio.jp/gyazo/20121004010107.png
ここでは1024バイトを読み込むことにしました。でも、InputStreamのメソッドを見ると、available()というのがあります。

 available()
 この入力ストリームのメソッドの次の呼出しによって、ブロックせずにこの入力ストリームから読み込むことができる(またはスキップできる)推定バイト数を返します。

- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。
これを使えば、適切な長さを見積もれるかもしれません。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)
**第12章 Swing 続き [#r35d7464]


- 次に簡単なウィンドウを出してみましょう。
***とても簡単なウィンドウ [#r57b34f9]

授業の最後の方で紹介する,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.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }

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

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.
*** JFrameを継承するプログラミング [#y09a72d9]
 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();
 	}
 }

#ref(How2Java/simplewindow.png)


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

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



http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png



*ヒューマンインタフェース 2016年前期 [#q0729239]
解答例:

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


//**宿題 [#i19fb64a]

//***人の反応速度を測定するプログラムを作って測定してください。(2014.4.24) † [#jbad7411]
//-連休明けの授業(5/15)の開始時に、A4, 1枚(両面印刷でも可)で提出してください。
//--用紙の上辺に学籍番号、学年、氏名を1行で書いておいてください。
//-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定できます。
//--http://siio.jp/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示されます。乱数を使って表示までの時間を変える改良をしてもらっても良いです。(改良したらそのこともレポートしてください)
//-これによりあなたの応答速度を複数回実測して、人の応答速度が 300ms 程度であることを確認してください。 
//-また個人差や年齢などで結果は変わるかもしれません。周りの複数の人に被験者になってもらって調査しても面白いかもしれません。
//-また何度も測定することで、習熟して速度が向上したり、それでも限界があったり、さらには、逆に疲労により速度が低下することがあるかもしれません。
//--そのような現象が観察できたら、これも報告してください。(教科書8章の学習曲線を参考にしてください)

***ボタンを1個貼り付ける [#c069f727]

**出席状況 [#id495fc6]
JLabelのところをJButtonにしてみましょう

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


|学籍番号|4月8日|4月15日|4月22日|5月6日|5月13日|5月20日|5月27日|6月3日|6月17日|6月24日|7月1日|7月15日|7月22日|7月29日|出席点|
|1420501|出|出|出|出|出|出|出|出|出|出|出|欠|出|出||
|1420502|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420503|出|出|出|出|出|出|出|出|出|出|出|出|欠|出||
|1420504|出|出|出|出|出|出|出|出|出|出|出|出|出|欠||
|1420505|出|出|出|出|出|出|出|欠|出|出|出|出|出|出||
|1420506|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420507|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420508|出|欠|出|出|出|出|出|出|出|出|出|出|出|出||
|1420509|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420510|出|出|出|出|出|出|出|出|出|欠|欠|出|出|出||
|1420511|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420512|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420513|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420514|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420515|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420516|出|出|出|出|出|出|出|出|欠|出|出|出|出|出||
|1420517|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420518|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420519|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420520|出|出|出|出|出|出|出|出|出|出|出|出|出|欠||
|1420521|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420522|出|出|出|出|出|出|欠|出|出|出|出|出|出|欠||
|1420523|出|出|出|出|欠|出|出|出|出|出|出|出|出|出||
|1420525|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420526|出|出|出|出|出|出|出|出|出|出|出|出|欠|欠||
|1420527|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420528|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420529|出|出|欠|欠|出|欠|出|出|出|出|出|出|欠|出||
|1420530|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420531|出|出|出|出|出|出|出|出|出|出|出|欠|出|欠||
|1420532|出|出|出|出|出|出|出|出|出|出|出|欠|出|欠||
|1420533|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420534|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420535|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420536|出|出|出|出|欠|出|出|出|出|出|出|出|出|出||
|1420537|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420538|出|出|出|出|出|欠|出|出|出|出|出|出|出|出||
|1420539|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420540|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1420541|出|出|出|出|出|出|出|出|出|出|出|出|出|出||
|1220116|出|欠|欠|欠|欠|欠|欠|欠|欠|欠|欠|欠|欠|欠|不可|
|1220121|出|出|出|欠|出|出|出|欠|出|出|出|出|出|出||
**本日の課題 [#i1cc2d8c]

ボタンを出すプログラムのjavaとclassを提出してください。

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

//** ヒューマンインタフェースのレポート 2015年前期 [#o7c956d4]

//案内が遅れてすみません。案内が遅れたことを配慮して締め切りを予告より1週間延期しました。
**欠席状況 [#tfa637d9]

**期末レポートのお知らせ [#ha061f9f]
- 提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.(出席点不可はくつがえりません)
- 締め切り2016年8月31日水曜日
//- 締め切りその他は未定です
-形式分量:A4, ページ数は2-3ページ程度
-提出先・提出方法:PDFにしてsiio@mac.comまでメール添付で送付
--メールの標題は「ヒューマンインタフェースレポート: 14205XX」としてください。数字部分は出席番号です。
--提出いただいた方はここのページで学籍番号でお知らせします。提出してしばらく経つのに、
//--提出いただいた方は以下のとおりです。提出してしばらく経つのに、
自分の番号がなかなか表示されない場合は,受付されていないかもしれません.もう一度催促してください
(提出を確認出来るよう締め切りより早めに提出していただくことをお勧めします)
--提出したことを学籍番号で公開されたくない方は、秘密のペンネームをおしらせください。
3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。
欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。
(病欠、公欠、忌引などは0になっているはずですが間違っていたら連絡ください。)


|提出日|学籍番号もしくはペンネーム|
|2016/8/31|1420512|
|2016/8/31|1420513 |
|2016/8/31|zzz|
|2016/8/31|1420507|
|2016/8/31|1420532|
//|1320501|
//|あこがれは早寝早起き|
//|ヒューマン|
|学籍番号|10/4|10/11|10/25|11/8|11/15|11/22|合計|
|1720501|0|0|0|0|0|0|0|
|1720502|0|0|0|0|0|0|0|
|1720503|0|0|0|0|0|0|0|
|1720504|0|0|0|0|0|0|0|
|1720505|0|0|0|0|0|0|0|
|1720506|0|0|0|0|0|0|0|
|1720507|0|0|0|0|0|0|0|
|1720508|0|1|0|0|0|0|1|
|1720509|0|0|0|0|0|0|0|
|1720510|0|0|0|0|0|0|0|
|1720511|0|0|1|0|0|1|2|
|1720512|0|0|0|0|0|0|0|
|1720513|0|0|0|0|0|0|0|
|1720514|0|0|0|0|0|0|0|
|1720515|0|0|0|0|0|0|0|
|1720516|0|0|0|0|0|0|0|
|1720517|0|0|0|0|0|0|0|
|1720518|0|0|0|0|0|0|0|
|1720519|0|0|0|0|0|1|1|
|1720520|0|0|0|0|0|0|0|
|1720521|1|0|0|0|0|1|2|
|1720522|0|0|0|0|0|0|0|
|1720523|0|0|0|0|0|0|0|
|1720524|0|0|0|0|0|0|0|
|1720525|0|0|0|0|0|0|0|
|1720526|0|0|0|0|0|0|0|
|1720527|0|0|0|0|1|0|1|
|1720528|0|0|0|0|0|1|1|
|1720529|0|0|0|0|0|0|0|
|1720530|1|0|0|0|1|1|3|
|1720531|0|0|0|0|0|1|1|
|1720532|0|0|0|0|0|0|0|
|1720533|0|0|0|0|0|0|0|
|1720534|0|0|0|0|0|1|1|
|1720535|0|0|0|0|0|0|0|
|1720536|0|0|0|0|0|1|1|
|1720537|0|0|0|0|0|0|0|
|1720538|0|0|0|0|0|0|0|
|1720539|0|0|0|0|0|0|0|
|1720540|0|0|0|0|0|1|1|
|1720541|0|0|0|0|0|0|0|
|1720542|0|0|0|0|0|0|0|
|1720543|0|0|0|0|0|0|0|
|1620514|1|1|1|1|1|1|6|
|1520520|0|1|0|0|1|0|2|
|1740665|0|0|0|0|0|0|0|


//|学籍番号|受理日|
//| 1320516 |2015年8月19日|
//| 1120506 |2013年9月6日|
//| 1120513 |2013年9月6日|
//| 1120503 |2013年9月6日|
//| 1120532 |2013年9月6日|
//| 1120537 |2013年9月6日|
//| 1120507 |2013年9月6日|
//| 1120528 |2013年9月6日|


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



** ヒューマンインタフェースの予定 2016年前期 [#u19fb704]
-4/8
-4/15
-4/22
-5/6
-5/13
-5/20 
-5/27
-6/3 
-6/10 授業なし
-6/17
-6/24
-7/1
-7/8 椎尾学会出張のため休講
-7/15
-7/22
-7/29


//**宿題
//
//***人の反応速度を測定するプログラムを作って測定してください。(2014.4.24) † [#jbad7411]
//-連休明けの授業(5/15)の開始時に、A4, 1枚(両面印刷でも可)で提出してください。
//--用紙の上辺に学籍番号、学年、氏名を1行で書いておいてください。
//-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定できます。
//--http://siio.jp/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示されます。乱数を使って表示までの時間を変える改良をしてもらっても良いです。(改良したらそのこともレポートしてください)
//-これによりあなたの応答速度を複数回実測して、人の応答速度が 300ms 程度であることを確認してください。 
//-また個人差や年齢などで結果は変わるかもしれません。周りの複数の人に被験者になってもらって調査しても面白いかもしれません。
//-また何度も測定することで、習熟して速度が向上したり、それでも限界があったり、さらには、逆に疲労により速度が低下することがあるかもしれません。
//--そのような現象が観察できたら、これも報告してください。(教科書8章の学習曲線を参考にしてください)

//***GUI黎明期のPC性能を調べてください(2014.4.17) [#ba9db6ff]
//-GUI黎明期PCのCPU名、CPUクロック、メモリ容量、画素数を調べてください
//--現在,Windows を使っている人は,最初の Windows が出荷された 1985 年当時に使われていたIBM PC/AT
//--Mac OS Xを使っている人は,1984に出荷された最初の Macintosh 
//-今あなたが使っているコンピュータと比較してください. 
//-次回の授業(4/24)最初に配布するA5サイズの用紙に各自で記入して提出してもらいます

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

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

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

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

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

-http://lab.siio.jp/index.php?CSL11HCI




//**宿題:ボタンを押すたびに点灯/消灯を繰り返す(トグルする)プログラム (2015/7/17提出)[#s369672d]
//
//以下は、Arduinoの2ピンに接続された押しボタンスイッチを押すとLEDが点灯するプログラムです。これを改造して、押しボタンスイッチを押すたびに、点灯/消灯を切り替えるプログラムを作ってください。
//ちなみにHIGHとLOWはintの値で、int型の変数で保存することができます。
//
// int outpin=13; //An LED is connected to ping 13
// int inpin=2;  //A switch is connected to pin 2
// 
// void setup() {                
//   // initialize the digital pin as an output and input.
//   pinMode(outpin, OUTPUT);     
//   pinMode(inpin, INPUT);
// }
// 
// void loop() {
//   if ( digitalRead(inpin) == HIGH) {
//     digitalWrite(outpin, LOW);   // set the LED on
//   }
//   else {
//     digitalWrite(outpin, HIGH);    // set the LED off
//   }
//   delay(30);              // wait for 30 second
// }
//

//**宿題:人の反応速度を測定するプログラムを作って測定してください。(2015.5.1) [#gc9f981e]
//-連休明けの授業(5/8)の開始時に、A5, 1枚に書いて提出していただきます。
//-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定できます。
//--http://siio.jp/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示されます。
//-- 乱数を使って表示までの時間を変える改良をしてもらっても良いです。(改良したらそのこともレポートしてください)
//-これによりあなたの応答速度を実測して、人の応答速度が 300ms 程度であることを確認してください。(複数回実測して平均とってもらえるとさらに正確ですね)
//




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


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS