35
Scala Edison の夢を見る jvmlang.daitokai 1.0.0 2015-02-28 西本 圭佑 @keisuke_n

jvmlang.daitokai 1: ScalaはEdisonの夢を見る

Embed Size (px)

Citation preview

Page 1: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

Scala は Edison の夢を見る

jvmlang.daitokai 1.0.02015-02-28

西本 圭佑 @keisuke_n

Page 2: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 2

自己紹介

● @keisuke_n ♂

● 仕事

– Webアプリ作成が主

● 趣味

– Web/Databaseヲレヲレフレームワークの開発

● Web Flavor, DB Flavor– 宇宙開発ウォッチャ

– プチ鉄道ヲタク

– 時々電子工作

– etc.etc....

Page 3: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 3

ファイラー編

Scala は Edison の夢を見る

Page 4: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 4

ファイラー編

Page 5: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 5

ファイラー編 : 機能

● Caffeine View for Web

● Web ブラウザで操作するファイラー

● 今プレゼンしてる画面そのもの ( ビューア機能 )

● ファイルリスト表示 ( ソート付 )

● アップロード , 名前の変更 , 削除 , ディレクトリ作成

● ビューア ( 画像などの表示 )

Page 6: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 6

ファイラー編 : 動作環境

● サーバ : Intel Edison

– Apache Tomcat 8

– Scala 2.10

– Web Flavor ( 自作 )● クライアント : Web ブラウザ

– Caffe Mobile UI ( 自作 )

– Zepto.js (jQuery 互換 )

Page 7: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 7

Scala は Edison の夢を見る

閑話休題

Intel Edison って何 ?

Page 8: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 8

Intel Edison って何 ?

● Intel Edison for Arduino

Edison本体 Arduino互換ボード

Page 9: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 9

Intel Edison って何 ?: ハード

● Intel Edison

– Intel が提供している x86 IoT デバイス

– Atom SoC(Silvermont) 500MHz, 2 Core

– Quark MCU 100MHz

– メモリ 1GB, ストレージ 4GB

– WiFi, Bluetooth

– SD カードインターフェース

– USB インターフェース

– その他 I/O ポート ( デジタル入出力 , アナログ入力 )

Page 10: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 10

Intel Edison って何 ?: ソフト

● Yocto Linux

● バイナリ

– 一般的な Unix 互換ツール

– node.js

– gcc● Arduino IDE

– Arduino 互換開発環境

● それ以外は自分でインストール

● 買ったその時から開発可能

Page 11: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 11

Intel Edison って何 ?: Scala 導入

● JDK

– Linux x86 版 JDK をダウンロード

– Wifi 経由で SCP

– JDK インストーラ実行

● Apache Tomcat

– /home/{user} などに配備

● Scala

– /home/{user} などに配備

● 普通の Linux 感覚で Ok

Page 12: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 12

Scala は Edison の夢を見る

Scala REPL 編

Page 13: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 13

Scala REPL 編

Page 14: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 14

Scala REPL 編 : 機能 環境・

● Caffe Scala REPL

● Web ブラウザベースの Scala REPL 実行環境

● サーバ上で Scala のインタプリタ動作

● ブラウザ上で実行結果を表示

● Apache Tomcat

● Scala 2.10

● Web Flavor

● Intel Edison

Page 15: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 15

Scala REPL 編 : コレクション

● リスト

– List(1, 2, 3)

– 1 :: 2 :: 3 :: Nil

– List(“foo”, “bar”, “buzz”)

– “foo” :: “bar” :: “buzz” :: Nil

● 範囲オブジェクト

– (0 until 10)

– (1 to 100)

Page 16: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 16

Scala REPL 編 : コレクション

● foreach

– List(1, 2, 3).foreachforeach {println(_)}

● map

– (1 to 10).mapmap {_ * 2}

● filter

– (1 to 10).filterfilter {_ % 3 == 0}

● foldLeft, reduceLeft

– (1 to 10).foldLeftfoldLeft(0) {_ + _}

– (1 to 10).reduceLeftreduceLeft {_ + _}

Page 17: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 17

Scala REPL 編 : コレクション

● collect

(1 to 10).collectcollect {

case n if n % 2 == 0 => 2 -> n

case n if n % 3 == 0 => 3 -> n

}

● groupBy

(1 to 10).groupBygroupBy {_ % 3}

● mkString

(1 to 10).mkStringmkString(“,”)

Page 18: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 18

Scala REPL 編 : コレクション

● par

– Parallel Collections( 並列コレクション )

– foreach, map, filter, などの標準的なメソッド完備

– 同時処理を行うので順番は保証されない

– 1 から 10000 を足す

– reduce● (1 to 10000).parpar.reduce {_ + _}

Page 19: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 19

Scala REPL 編 : コレクション

● 落ち着け、落ち着いて素数を数えるんだ…

def isPrimeNo(n: Int): Boolean = n match {

case n if n < 2 => false

case n => (2 until n).forall {n % _ != 0}

}

(1 to 10).filter {isPrimeNo(_)}

Page 20: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 20

Scala REPL 編 : コレクション

● 落ち着け、落ち着いてフィボナッチ数列を唱えるんだ…

def fib(n: Int): Int =

if (n < 2) n

else fib(n – 2) + fib(n – 1)

(1 to 10).map {fib(_)}

Page 21: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 21

Scala REPL 編 : コレクション

● FizzBuzzであほに ...

def fizzBuzz(n: Int): String = n match {

case n if n % 3 == 0 && n % 5 == 0 => "FizzBuzz"

case n if n % 3 == 0 => "Fizz"

case n if n % 5 == 0 => "Buzz"

case n => n.toString

}

(1 to 20).map {fizzBuzz(_)}

Page 22: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 22

Scala REPL 編 : L チカ

● L チカって ?

– たぶん LED チカチカ

● どんな意味があるの ?

– 特にない、自己満足

– 電子工作の Hello, world!

Page 23: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 23

Scala REPL 編 : L チカ : ハード編

● Arduino 互換 GPIO を使う

● そこに LED をつなぐ

● ただし電流をあまり流せないのでバッファ回路を付ける

● あとはソフト側からそれを直接叩くだけ

Page 24: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 24

Scala REPL 編 : L チカ : ソフト編

– デバイスファイルを開いて入出力

● /sys/class/gpio/....● 今回は自作した

– あるいは mraa というライブラリを使う

● Low Level Skeleton Library● http://iotdk.intel.com/docs/master/mraa/● 通常はこっちを使う● でもなぜか少なくない人が直接叩いてる w

Page 25: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 25

Scala REPL 編 : L チカ : ソフト編

● 自作ライブラリのおまじない

import ....GPIO

val led = new GPIO(7)

● LED 点灯

led.highhigh

● LED 消灯

● led.lowlow

Page 26: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 26

Scala REPL 編 : L チカ : ソフト編

● LED点滅

def blink(n: Int, w: Int = 500): Unit =

(0 until n).foreach {i =>

led.highhigh

sleep(w)

led.lowlow

sleep(w)

}

blink(5)

Page 27: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 27

Scala REPL 編 : L チカ : ソフト編

● LEDほわっと点滅

def fadeBlink(n: Int): Unit = (0 until n).foreach {i =>

(1 to 20).foreach {j =>

led.highhigh; sleep(j); led.lowlow; sleep(20 - j)

}

(1 to 20).foreach {j =>

led.highhigh; sleep(20 – j); led.lowlow; sleep(j)

}

}

fadeBlink(5)

Page 28: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 28

Scala REPL 編 : L チカ : ソフト編

● 落ち着け、落ち着いて素数を数えるんだ… LED 編

(1 to 10).

filter {isPrimeNo(_)}.

foreach {n => blink(n); sleep(1000)}

Page 29: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 29

Scala REPL 編 : L チカ : ソフト編

● 落ち着け、落ち着いてフィボナッチ数列を唱えるんだ…LED 編

(1 to 5).

map {fib(_)}.

foreach {n => blink(n); sleep(1000)}

Page 30: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 30

Scala REPL 編 : L チカ : ソフト編

● バイナリを数える

def writeBinary(v: Int): Unit =

leds.foldLeft(1) {(r, led) =>

led.write((v & r) != 0); r << 1

}

(1 to 5).map {fib(_)}.foreach {n =>

blink(n); sleep(1000)

}

Page 31: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 31

Scala REPL 編 : L チカ : ソフト編

● ないとらいだー

def writeBit(n: Int): Unit = leds.zipWithIndex.foreach {case (led, i) =>

led.write(i == n)

}

(0 until 5).foreach {t =>

(0 until leds.length).foreach {n =>

writeBit(n); sleep(100)

}

(0 until leds.length).foreach {n =>

writeBit(leds.length - 1 - n); sleep(100)

}

}

Page 32: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 32

最後に

という夢だったのさ ...

終わり

Page 33: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 33

Appendix: GPIO ソース

object GPIO {

import java.io._

final val Low = "0".getBytes("ISO-8859-1")

final val High = "1".getBytes("ISO-8859-1")

final val PullupEnables = List(

216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229

)

def export(no: Int): Unit = {

val pullup = PullupEnables(no)

writeNative("/sys/class/gpio/export", pullup.toString)

writeNative(s"/sys/class/gpio/gpio${pullup}/direction", "out")

}

def openValue(no: Int): OutputStream = {

val pullup = PullupEnables(no)

new FileOutputStream(s"/sys/class/gpio/gpio${pullup}/value")

}

def writeValue(outp: OutputStream, value: Boolean): Unit = {

outp.write(if (value) High else Low)

outp.flush

}

def unexport(no: Int): Unit = {

val pullup = PullupEnables(no)

writeNative("/sys/class/gpio/unexport", pullup.toString)

}

def writeNative(path: String, value: String): Unit = {

val outp = new FileOutputStream(path)

try {

outp.write(value.getBytes("ISO-8859-1"))

} finally {

outp.close

}

}

}

Page 34: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 34

Appendix: GPIO ソース

class GPIO(no: Int) {

val outp = {

GPIO.unexport(no)

GPIO.export(no)

GPIO.openValue(no)

}

def write(value: Boolean): Unit = GPIO.writeValue(outp, value)

def high: Unit = write(true)

def low: Unit = write(false)

def close: Unit = {

try {

outp.close

} catch {

case t: Throwable => log(s"${t.getClass.getName}: ${t.getMessage}")

} finally {

GPIO.unexport(no)

}

}

Page 35: jvmlang.daitokai 1: ScalaはEdisonの夢を見る

2015-02-28 jvmlang.daitokai.1.0.0 35

Appendix: sleep ソース

def sleep(w: Int): Unit = {

val s = System.nanoTime

val e = s + w * 1000000L

while (e > System.nanoTime) {

Thread.`yield`()

}

}