64
Scalaやろうぜ Java Programing上級 講師: 有田一平@Cambridge Energy Data Lab 1 Saturday, September 7, 13

早稲田大学授業 - Java Programing上級

Embed Size (px)

DESCRIPTION

Scalaで説明したJavaの授業

Citation preview

Page 1: 早稲田大学授業 - Java Programing上級

Scalaやろうぜ

Java Programing上級講師: 有田一平@Cambridge Energy Data Lab

1Saturday, September 7, 13

Page 2: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

2Saturday, September 7, 13

Page 3: 早稲田大学授業 - Java Programing上級

講師紹介 有田一平現職はArchitect@Cambridge Energy Data Lab, Ltd

前職はグリー株式会社、JPモルガン証券株式会社

名古屋出身

趣味はアウトドアスポーツ

2005年早稲田大学人間科学部卒業

github: @peisan

twitter: @ippeeeee

3Saturday, September 7, 13

Page 4: 早稲田大学授業 - Java Programing上級

皆さんの事も教えて下さい :-)

名前

受講した理由

趣味

出身

などなんでも

生徒自己紹介

4Saturday, September 7, 13

Page 5: 早稲田大学授業 - Java Programing上級

講義の目的

本科目では、インターネットにおいて主力のプログラミング言語の一つとなっているJava言語をもとにプログラミングの応用なスキルを身につける。授業は、講義・演習のサイクルの繰り返しで行われる。講義では、まずオブジェクト指向の基礎を学び、続けてJavaプログラミングの概念(例外処理、ファイル入出力、スレッド、ネットワークなど)について知識を習得する。演習では講義内容をふまえて実際にプログラミングを行う。第13回—15回では自身でテーマを決めて、学習したプログラミングスキルを活用してソフトの作成を行う。

5Saturday, September 7, 13

Page 6: 早稲田大学授業 - Java Programing上級

提案: ScalaやりませんかScalaはイケてるJava

JVM上で動くプログラミング言語(という意味ではJavaの一種)

Javaのライブラリがそのまま使えます(ので基本的にJavaでできることは全部できる)

記述が簡単で、すぐに覚えられるので学習用途に最適

イメージ的にはJavaの進化系(Java 20くらい)

オブジェクト指向言語かつ関数型言語

6Saturday, September 7, 13

Page 7: 早稲田大学授業 - Java Programing上級

Javaの特徴

Java

JVM(Javaの実行環境)上で動く、強い静的片付け、オブジェクト指向言語、文法が厳しい

一方Script言語(Python, Ruby, Perl)は

動的型付け、インタープリタ、文法が緩い

7Saturday, September 7, 13

Page 8: 早稲田大学授業 - Java Programing上級

Scalaを使っている会社

8Saturday, September 7, 13

Page 9: 早稲田大学授業 - Java Programing上級

JVM

How does Scala work?hello.java

hello.classjav

ac

java

Hello!

hello.scala

hello.classscalac

scala

Hello!

OS

9Saturday, September 7, 13

Page 10: 早稲田大学授業 - Java Programing上級

Java vs ScalaHello.java Hello.scala

やっぱりJavaは冗長すぎるScalaだとコードの量は半分くらいになります

10Saturday, September 7, 13

Page 11: 早稲田大学授業 - Java Programing上級

Hello.javaを作って実行しよう

Hello.javaファイルをエディタで開く(e.g. #vim Hello.java)

Helloクラスを作る

main methodを作る

compile する(#javac Hello.java)

実行する (#java Hello Fujikura)

11Saturday, September 7, 13

Page 12: 早稲田大学授業 - Java Programing上級

Javaは面倒くさい

Editorで長いコードを書き書きして

javacでコンパイルしてclassファイル作って

javaで実行

12Saturday, September 7, 13

Page 13: 早稲田大学授業 - Java Programing上級

ScalaならREPLで楽々

コマンドラインで確認しながら楽々実行もできます

13Saturday, September 7, 13

Page 14: 早稲田大学授業 - Java Programing上級

提案: JavaとScalaを対比しながらScalaで実装

あくまでも効率のよいJavaとして利用実装はScalaでサクサクやりましょう

14Saturday, September 7, 13

Page 15: 早稲田大学授業 - Java Programing上級

Java7のインストールJDK7をインストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html

環境変数 (~/.profileとかに)

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/

export PATH=$PATH:$JAVA_HOME/bin

15Saturday, September 7, 13

Page 16: 早稲田大学授業 - Java Programing上級

ScalaのインストールXcodeのCommand Line Toolsをインストール

Preference -> Downloads -> Command Line Tools

16Saturday, September 7, 13

Page 17: 早稲田大学授業 - Java Programing上級

ScalaのインストールHomebrew(http://brew.sh/)でgitとScalaとsbtのインストール

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

#brew install git scala sbt --with-docs

Proxy設定

ダウンロードが上手く行かない場合は以下を試してみてください

export https_proxy=www-proxy.waseda.jp:8080

export http_proxy=www-proxy.waseda.jp:8080

環境変数

export SCALA_HOME=/usr/local/Cellar/scala/2.10.1/

17Saturday, September 7, 13

Page 18: 早稲田大学授業 - Java Programing上級

Hello.scalaを作って実行しよう

Hello.scalaファイルをエディタで開く(e.g. #vim Hello.scala)

Helloオブジェクトを作る

main methodを作る

compile する(#scalac Hello.java)

実行する (#scala Hello Fujikura)

18Saturday, September 7, 13

Page 19: 早稲田大学授業 - Java Programing上級

GitHubの設定GitHubとは

gitという分散バージョン管理システムのWebでのコラボレーションツール

My Account

https://github.com/peisan

授業のRepository

https://github.com/peisan/WasedaAdvancedJavaClass

19Saturday, September 7, 13

Page 20: 早稲田大学授業 - Java Programing上級

GitHubの使い方

授業のRepositoryを自分のRepositoryにFork

Local PCにcloneする

課題の提出は授業のRepositoryにPull Requestで行う

Someone’sRepository

Local Repository

clone

My Repository

My Local Repository

clonegithub.com

Local PC

Push

Pull Request

Fork

20Saturday, September 7, 13

Page 21: 早稲田大学授業 - Java Programing上級

GitHub Tutorial

Tutorial

http://git-scm.com/docs/gittutorial

Video

http://git-scm.com/videos

gitの使い方を1ステップずつ学べるサイト

http://try.github.io

21Saturday, September 7, 13

Page 22: 早稲田大学授業 - Java Programing上級

IDE: IntelliJ IDEAIDE (Integrated development environment)

シンタックスハイライト、デバッグ機能、補完機能などを備えた 統合開発環境

IntelliJ IDEAのダウンロード(FreeのCommunity Editionで十分)

http://www.jetbrains.com/idea/

Projectの準備

$sbt compile

$sbt gen-idea

gen-ideaで生成されたprojectをOpen

22Saturday, September 7, 13

Page 23: 早稲田大学授業 - Java Programing上級

Scala Pluginplugins -> Browse RepositoriesからScala Pluginのインストール

23Saturday, September 7, 13

Page 24: 早稲田大学授業 - Java Programing上級

Scala CompilerCompilerからUse External Compilerのチェックを外す

Compiler -> Scala Compilerからインストールしたscala 2.10.2を選択

24Saturday, September 7, 13

Page 25: 早稲田大学授業 - Java Programing上級

Java Tutorials「Java 1 はじめてみようプログラミング」「Java 2 アプリケーションづくりの初歩」サポートページ

http://mitani.cs.tsukuba.ac.jp/book_support/java/

25Saturday, September 7, 13

Page 26: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)

第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

26Saturday, September 7, 13

Page 27: 早稲田大学授業 - Java Programing上級

Main Method

一番初めに書くいつものやつです

27Saturday, September 7, 13

Page 28: 早稲田大学授業 - Java Programing上級

変数定義

valで定数宣言varで変数宣言: <Type>で型指定(しなくてもよい)

final修飾子で定数宣言修飾子なしで変数宣言宣言時の型指定は必須

28Saturday, September 7, 13

Page 29: 早稲田大学授業 - Java Programing上級

変数の型Java

(Primitive/Class)Scala

(Classのみ)型なしなんでも文字文字列

4Byte整数8Byte整数

4Byte浮動少数8Byte浮動少数真偽値配列

void / Void UnitNA / Object Any

char / Character Char NA / String Stringint / Integer Intlong / Long Longfloat / Float Float

double / Double Doublefool / Boolean Booleanarray / Array Array

29Saturday, September 7, 13

Page 30: 早稲田大学授業 - Java Programing上級

条件分岐

if文はJavaと同じmatch文を使うとより簡潔

に書けます

30Saturday, September 7, 13

Page 31: 早稲田大学授業 - Java Programing上級

ループ1から10まで出力するだけの単純なループ

for文も一行でスッキリ豆知識: toとuntilはInt型のmethod

31Saturday, September 7, 13

Page 32: 早稲田大学授業 - Java Programing上級

実習: FizzBuzz以下のルールに従って1から100までの文字列を出力するプログラムを作る

3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」

完成したらPull Requestを出してみましょう

https://help.github.com/articles/using-pull-requests

32Saturday, September 7, 13

Page 33: 早稲田大学授業 - Java Programing上級

関数定義

Hello or Gaoと出力する関数

def <関数名>(引数) : <返り値の型> = {<関数の式>}で宣言返り値の型は省略可

33Saturday, September 7, 13

Page 34: 早稲田大学授業 - Java Programing上級

実習: Count関数与えられたArrayの要素数を数える関数を作る

Object名: CountArray

関数名: Count

引数: Array[Int]

返り値: Int

与えられたArrayの中で3の倍数と5の倍数の要素数を数える関数をつくる

関数名: CountIfFactorOfThreeOrFive

(上級編)与えられたArrayの中で 任意の条件式に一致する要素数を数える関数を作る(カリー化)

関数名: CountIf

34Saturday, September 7, 13

Page 35: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認

第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

35Saturday, September 7, 13

Page 36: 早稲田大学授業 - Java Programing上級

オブジェクト指向とは?

オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方であるオブジェクトとは?属性(変数)と振る舞い(関数やMethod)を持つ

オブジェクト指向のテクニックカプセル化多様性継承

36Saturday, September 7, 13

Page 37: 早稲田大学授業 - Java Programing上級

オブジェクトの生成

Human

firstNamelastNameagegetName()

Class (Type)New

New

Human Object 1

firstName => IppeilastName => Aritaage => 31getName() => “Ippei Arita”

Human Object 1

firstName => ShigekilastName => Fujiokaage => 22getName() => “Shigeki Fujioka”

Human Object 1

firstName => ShoheilastName => Fujikuraage => 23getName() => “Fujikura Shohei”

New

37Saturday, September 7, 13

Page 38: 早稲田大学授業 - Java Programing上級

オブジェクトの基礎

38Saturday, September 7, 13

Page 39: 早稲田大学授業 - Java Programing上級

オブジェクトの基礎Animal Class

name : 動物の名前kind : 動物の種類

say() : nameとkindを含む文字列を出力

39Saturday, September 7, 13

Page 40: 早稲田大学授業 - Java Programing上級

演習: オブジェクトの基礎

以下のように定義されたBook Classを作成

Booktitle : 本のタイトルauthor : 本の著者description() : titleとauthorを含む文字列を返す

Bookクラスから任意のtitleとauthorを持ったオブジェクトを作成してdescriptionを出力

40Saturday, September 7, 13

Page 41: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)

第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

41Saturday, September 7, 13

Page 42: 早稲田大学授業 - Java Programing上級

継承とは?スーパークラスの構造と機能がサブクラスにそのまま引き継がれるスーパークラスを継承したサブクラスは、そのクラスと同等の型としての使用が可能になる

Animal

namekindsay()

スーパークラス(親クラス)

継承(extends)

Dog

namekind(上書き)say()bark()(追加)

サブクラス(子クラス、派生クラス)

スーパークラスの属性と振る舞いを受け継ぎつつ、サブクラスで上書きまたは追加ができる

42Saturday, September 7, 13

Page 43: 早稲田大学授業 - Java Programing上級

継承

Dog Class (Animal Classを継承)name : 動物の名前kind : 動物の種類(Dogで固定)

say() : nameとkindを含む文字列を出力bark() : Wan!と吠える

43Saturday, September 7, 13

Page 44: 早稲田大学授業 - Java Programing上級

演習: 継承以下のように定義されたCat Classを作成Cat Class (Animal Classを継承)

name : 動物の名前

kind : 動物の種類(Catで固定)say() : nameとkindを含む文字列を出力bark() : Nyan!と吠える

44Saturday, September 7, 13

Page 45: 早稲田大学授業 - Java Programing上級

演習: 継承応用編以下のルールに従って任意のスーパークラス及びサブクラスを作成

スーパークラスは一つ以上の属性及び振る舞いを持つ

サブクラスは一つ以上の独自の属性及び振る舞いを持つ

サブクラスはスーパークラスの属性と振る舞いを一つ以上上書き(override)する

サブクラスは2つ以上定義する

サブクラスは2階層以上でもOK

45Saturday, September 7, 13

Page 46: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)

第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

46Saturday, September 7, 13

Page 47: 早稲田大学授業 - Java Programing上級

例外とは?

プログラムがある処理を実行している途中で、なんらかの異常が発生すること

0 division

Null Pointer Exception

Array Index Out of Bounds Exception

Class Not Found Exception

47Saturday, September 7, 13

Page 48: 早稲田大学授業 - Java Programing上級

例外

throw new <Exception>で例外を投げる

try / catchでエラーハンドリング

48Saturday, September 7, 13

Page 49: 早稲田大学授業 - Java Programing上級

演習: 例外

JavaやScalaの実行時にも以下のようにいろいろな例外が発生します。以下のような例外をハンドルするようなプログラムを書いてください

null.toStringjava.lang.NullPointerException

123 / 0java.lang.ArithmeticException

Array(1,2,3)(4)java.lang.ArrayIndexOutOfBoundsException

"abc".toIntjava.lang.NumberFormatException

49Saturday, September 7, 13

Page 50: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)

第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

50Saturday, September 7, 13

Page 51: 早稲田大学授業 - Java Programing上級

File ReadやっぱJavaはめんどくさい

51Saturday, September 7, 13

Page 52: 早稲田大学授業 - Java Programing上級

File Write

PrintWriterを使いました

52Saturday, September 7, 13

Page 53: 早稲田大学授業 - Java Programing上級

演習: ファイル処理

text fileを読み込んで行番号をつけて別のファイルとして書きだすプログラムを書く

53Saturday, September 7, 13

Page 54: 早稲田大学授業 - Java Programing上級

スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)

第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表

54Saturday, September 7, 13

Page 56: 早稲田大学授業 - Java Programing上級

Threadとは

処理の分割の単位

Computer

ProcessThread

Thread

Memory Space

ProcessThread

Thread

Memory SpaceMemory

CPU

CPU

56Saturday, September 7, 13

Page 57: 早稲田大学授業 - Java Programing上級

Thread

ScalaではActorを使うのが定石

57Saturday, September 7, 13

Page 58: 早稲田大学授業 - Java Programing上級

Actor

Message Queueを持ち、メッセージを逐次処理できるThread

Threadとして実行される

メールボックス(キュー)にメッセージを受信する

メールボックスからメッセージを取り出して処理、またパターンマッチでメッセージを選択して処理をする

58Saturday, September 7, 13

Page 59: 早稲田大学授業 - Java Programing上級

おまけ: Web FrameworkPlay - かんたん

http://www.playframework.com/

Struts - ふるい

http://struts.apache.org/

Spring - むずい

http://www.springsource.org/javaconfig

59Saturday, September 7, 13

Page 60: 早稲田大学授業 - Java Programing上級

おまけ: ポインタ?Stackにある変数はHEAPにあるオブジェクトへの参照(ポインタ)(*)プリミティブ型はStack領域に値を持つ

HEAPStack

s String Object“test”

n Null

GCにより掃除される

60Saturday, September 7, 13

Page 61: 早稲田大学授業 - Java Programing上級

おまけ: jvisualvm

javaのプロセスの確認やモニタリングができるツール

61Saturday, September 7, 13

Page 62: 早稲田大学授業 - Java Programing上級

演習: 素数の確認与えられた値が素数かどうかを確認する関数isPrime(n : Int) : Booleanを作る

Example1 => false2 => true3 => true4 => false

62Saturday, September 7, 13

Page 63: 早稲田大学授業 - Java Programing上級

演習: 素因数分解

引数で与えられたIntに対して素因数分解をして結果をStringで返す関数を作る

Example: 99999 = 3 * 3 * 3 * 3 * 41 * 41 * 271 * 271

63Saturday, September 7, 13

Page 64: 早稲田大学授業 - Java Programing上級

演習: エイト・クイーン

エイト・クイーンのプログラムを作る

http://ja.wikipedia.org/wiki/エイト・クイーン

(ヒント)碁盤をBooleanの2次元配列で表現して置ける場所を表現、後は力ずくで計算すれば…

(上級編)Actorを利用して各パターンを並列に試行するように変更する

64Saturday, September 7, 13