Upload
ippei-arita
View
1.579
Download
7
Embed Size (px)
DESCRIPTION
Scalaで説明したJavaの授業
Citation preview
Scalaやろうぜ
Java Programing上級講師: 有田一平@Cambridge Energy Data Lab
1Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
2Saturday, September 7, 13
講師紹介 有田一平現職はArchitect@Cambridge Energy Data Lab, Ltd
前職はグリー株式会社、JPモルガン証券株式会社
名古屋出身
趣味はアウトドアスポーツ
2005年早稲田大学人間科学部卒業
github: @peisan
twitter: @ippeeeee
3Saturday, September 7, 13
皆さんの事も教えて下さい :-)
名前
受講した理由
趣味
出身
などなんでも
生徒自己紹介
4Saturday, September 7, 13
講義の目的
本科目では、インターネットにおいて主力のプログラミング言語の一つとなっているJava言語をもとにプログラミングの応用なスキルを身につける。授業は、講義・演習のサイクルの繰り返しで行われる。講義では、まずオブジェクト指向の基礎を学び、続けてJavaプログラミングの概念(例外処理、ファイル入出力、スレッド、ネットワークなど)について知識を習得する。演習では講義内容をふまえて実際にプログラミングを行う。第13回—15回では自身でテーマを決めて、学習したプログラミングスキルを活用してソフトの作成を行う。
5Saturday, September 7, 13
提案: ScalaやりませんかScalaはイケてるJava
JVM上で動くプログラミング言語(という意味ではJavaの一種)
Javaのライブラリがそのまま使えます(ので基本的にJavaでできることは全部できる)
記述が簡単で、すぐに覚えられるので学習用途に最適
イメージ的にはJavaの進化系(Java 20くらい)
オブジェクト指向言語かつ関数型言語
6Saturday, September 7, 13
Javaの特徴
Java
JVM(Javaの実行環境)上で動く、強い静的片付け、オブジェクト指向言語、文法が厳しい
一方Script言語(Python, Ruby, Perl)は
動的型付け、インタープリタ、文法が緩い
7Saturday, September 7, 13
Scalaを使っている会社
8Saturday, September 7, 13
JVM
How does Scala work?hello.java
hello.classjav
ac
java
Hello!
hello.scala
hello.classscalac
scala
Hello!
OS
9Saturday, September 7, 13
Java vs ScalaHello.java Hello.scala
やっぱりJavaは冗長すぎるScalaだとコードの量は半分くらいになります
10Saturday, September 7, 13
Hello.javaを作って実行しよう
Hello.javaファイルをエディタで開く(e.g. #vim Hello.java)
Helloクラスを作る
main methodを作る
compile する(#javac Hello.java)
実行する (#java Hello Fujikura)
11Saturday, September 7, 13
Javaは面倒くさい
Editorで長いコードを書き書きして
javacでコンパイルしてclassファイル作って
javaで実行
12Saturday, September 7, 13
ScalaならREPLで楽々
コマンドラインで確認しながら楽々実行もできます
13Saturday, September 7, 13
提案: JavaとScalaを対比しながらScalaで実装
あくまでも効率のよいJavaとして利用実装はScalaでサクサクやりましょう
14Saturday, September 7, 13
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
ScalaのインストールXcodeのCommand Line Toolsをインストール
Preference -> Downloads -> Command Line Tools
16Saturday, September 7, 13
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
Hello.scalaを作って実行しよう
Hello.scalaファイルをエディタで開く(e.g. #vim Hello.scala)
Helloオブジェクトを作る
main methodを作る
compile する(#scalac Hello.java)
実行する (#scala Hello Fujikura)
18Saturday, September 7, 13
GitHubの設定GitHubとは
gitという分散バージョン管理システムのWebでのコラボレーションツール
My Account
https://github.com/peisan
授業のRepository
https://github.com/peisan/WasedaAdvancedJavaClass
19Saturday, September 7, 13
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
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
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
Scala Pluginplugins -> Browse RepositoriesからScala Pluginのインストール
23Saturday, September 7, 13
Scala CompilerCompilerからUse External Compilerのチェックを外す
Compiler -> Scala Compilerからインストールしたscala 2.10.2を選択
24Saturday, September 7, 13
Java Tutorials「Java 1 はじめてみようプログラミング」「Java 2 アプリケーションづくりの初歩」サポートページ
http://mitani.cs.tsukuba.ac.jp/book_support/java/
25Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)
第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
26Saturday, September 7, 13
Main Method
一番初めに書くいつものやつです
27Saturday, September 7, 13
変数定義
valで定数宣言varで変数宣言: <Type>で型指定(しなくてもよい)
final修飾子で定数宣言修飾子なしで変数宣言宣言時の型指定は必須
28Saturday, September 7, 13
変数の型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
条件分岐
if文はJavaと同じmatch文を使うとより簡潔
に書けます
30Saturday, September 7, 13
ループ1から10まで出力するだけの単純なループ
for文も一行でスッキリ豆知識: toとuntilはInt型のmethod
31Saturday, September 7, 13
実習: FizzBuzz以下のルールに従って1から100までの文字列を出力するプログラムを作る
3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」
完成したらPull Requestを出してみましょう
https://help.github.com/articles/using-pull-requests
32Saturday, September 7, 13
関数定義
Hello or Gaoと出力する関数
def <関数名>(引数) : <返り値の型> = {<関数の式>}で宣言返り値の型は省略可
33Saturday, September 7, 13
実習: Count関数与えられたArrayの要素数を数える関数を作る
Object名: CountArray
関数名: Count
引数: Array[Int]
返り値: Int
与えられたArrayの中で3の倍数と5の倍数の要素数を数える関数をつくる
関数名: CountIfFactorOfThreeOrFive
(上級編)与えられたArrayの中で 任意の条件式に一致する要素数を数える関数を作る(カリー化)
関数名: CountIf
34Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認
第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
35Saturday, September 7, 13
オブジェクト指向とは?
オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方であるオブジェクトとは?属性(変数)と振る舞い(関数やMethod)を持つ
オブジェクト指向のテクニックカプセル化多様性継承
36Saturday, September 7, 13
オブジェクトの生成
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
オブジェクトの基礎
38Saturday, September 7, 13
オブジェクトの基礎Animal Class
name : 動物の名前kind : 動物の種類
say() : nameとkindを含む文字列を出力
39Saturday, September 7, 13
演習: オブジェクトの基礎
以下のように定義されたBook Classを作成
Booktitle : 本のタイトルauthor : 本の著者description() : titleとauthorを含む文字列を返す
Bookクラスから任意のtitleとauthorを持ったオブジェクトを作成してdescriptionを出力
40Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)
第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
41Saturday, September 7, 13
継承とは?スーパークラスの構造と機能がサブクラスにそのまま引き継がれるスーパークラスを継承したサブクラスは、そのクラスと同等の型としての使用が可能になる
Animal
namekindsay()
スーパークラス(親クラス)
継承(extends)
Dog
namekind(上書き)say()bark()(追加)
サブクラス(子クラス、派生クラス)
スーパークラスの属性と振る舞いを受け継ぎつつ、サブクラスで上書きまたは追加ができる
42Saturday, September 7, 13
継承
Dog Class (Animal Classを継承)name : 動物の名前kind : 動物の種類(Dogで固定)
say() : nameとkindを含む文字列を出力bark() : Wan!と吠える
43Saturday, September 7, 13
演習: 継承以下のように定義されたCat Classを作成Cat Class (Animal Classを継承)
name : 動物の名前
kind : 動物の種類(Catで固定)say() : nameとkindを含む文字列を出力bark() : Nyan!と吠える
44Saturday, September 7, 13
演習: 継承応用編以下のルールに従って任意のスーパークラス及びサブクラスを作成
スーパークラスは一つ以上の属性及び振る舞いを持つ
サブクラスは一つ以上の独自の属性及び振る舞いを持つ
サブクラスはスーパークラスの属性と振る舞いを一つ以上上書き(override)する
サブクラスは2つ以上定義する
サブクラスは2階層以上でもOK
45Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)
第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
46Saturday, September 7, 13
例外とは?
プログラムがある処理を実行している途中で、なんらかの異常が発生すること
0 division
Null Pointer Exception
Array Index Out of Bounds Exception
Class Not Found Exception
47Saturday, September 7, 13
例外
throw new <Exception>で例外を投げる
try / catchでエラーハンドリング
48Saturday, September 7, 13
演習: 例外
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
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)
第9回: ファイル処理第10回: ファイル処理(演習)第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
50Saturday, September 7, 13
File ReadやっぱJavaはめんどくさい
51Saturday, September 7, 13
File Write
PrintWriterを使いました
52Saturday, September 7, 13
演習: ファイル処理
text fileを読み込んで行番号をつけて別のファイルとして書きだすプログラムを書く
53Saturday, September 7, 13
スケジュール第1回: イントロダクション(授業の概要と進め方)第2回: Java言語の基礎的知識の確認第3回: クラスとオブジェクト1:オブジェクトの基礎第4回: クラスとオブジェクト1:オブジェクトの基礎(演習)第5回: クラスとオブジェクト2:継承第6回: クラスとオブジェクト2:継承(演習)第7回: 例外処理第8回: 例外処理(演習)第9回: ファイル処理第10回: ファイル処理(演習)
第11回: スレッド(演習)第12回: スレッド(演習)第13回: ミニプロジェクト第14回: ミニプロジェクト第15回: ミニプロジェクト発表
54Saturday, September 7, 13
Threadとは
スレッド(thread)とは、CPU利用の単位。プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが早くなる。スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。
(Wikipediaより)
55Saturday, September 7, 13
Threadとは
処理の分割の単位
Computer
ProcessThread
Thread
Memory Space
ProcessThread
Thread
Memory SpaceMemory
CPU
CPU
56Saturday, September 7, 13
Thread
ScalaではActorを使うのが定石
57Saturday, September 7, 13
Actor
Message Queueを持ち、メッセージを逐次処理できるThread
Threadとして実行される
メールボックス(キュー)にメッセージを受信する
メールボックスからメッセージを取り出して処理、またパターンマッチでメッセージを選択して処理をする
58Saturday, September 7, 13
おまけ: Web FrameworkPlay - かんたん
http://www.playframework.com/
Struts - ふるい
http://struts.apache.org/
Spring - むずい
http://www.springsource.org/javaconfig
59Saturday, September 7, 13
おまけ: ポインタ?Stackにある変数はHEAPにあるオブジェクトへの参照(ポインタ)(*)プリミティブ型はStack領域に値を持つ
HEAPStack
s String Object“test”
n Null
GCにより掃除される
60Saturday, September 7, 13
おまけ: jvisualvm
javaのプロセスの確認やモニタリングができるツール
61Saturday, September 7, 13
演習: 素数の確認与えられた値が素数かどうかを確認する関数isPrime(n : Int) : Booleanを作る
Example1 => false2 => true3 => true4 => false
62Saturday, September 7, 13
演習: 素因数分解
引数で与えられたIntに対して素因数分解をして結果をStringで返す関数を作る
Example: 99999 = 3 * 3 * 3 * 3 * 41 * 41 * 271 * 271
63Saturday, September 7, 13
演習: エイト・クイーン
エイト・クイーンのプログラムを作る
http://ja.wikipedia.org/wiki/エイト・クイーン
(ヒント)碁盤をBooleanの2次元配列で表現して置ける場所を表現、後は力ずくで計算すれば…
(上級編)Actorを利用して各パターンを並列に試行するように変更する
64Saturday, September 7, 13