jvmlang.daitokai 1: scalaはedisonの夢を見る
TRANSCRIPT
Scala は Edison の夢を見る
jvmlang.daitokai 1.0.02015-02-28
西本 圭佑 @keisuke_n
2015-02-28 jvmlang.daitokai.1.0.0 2
自己紹介
● @keisuke_n ♂
● 仕事
– Webアプリ作成が主
● 趣味
– Web/Databaseヲレヲレフレームワークの開発
● Web Flavor, DB Flavor– 宇宙開発ウォッチャ
– プチ鉄道ヲタク
– 時々電子工作
– etc.etc....
2015-02-28 jvmlang.daitokai.1.0.0 3
ファイラー編
Scala は Edison の夢を見る
2015-02-28 jvmlang.daitokai.1.0.0 4
ファイラー編
2015-02-28 jvmlang.daitokai.1.0.0 5
ファイラー編 : 機能
● Caffeine View for Web
● Web ブラウザで操作するファイラー
● 今プレゼンしてる画面そのもの ( ビューア機能 )
● ファイルリスト表示 ( ソート付 )
● アップロード , 名前の変更 , 削除 , ディレクトリ作成
● ビューア ( 画像などの表示 )
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 互換 )
2015-02-28 jvmlang.daitokai.1.0.0 7
Scala は Edison の夢を見る
閑話休題
Intel Edison って何 ?
2015-02-28 jvmlang.daitokai.1.0.0 8
Intel Edison って何 ?
● Intel Edison for Arduino
Edison本体 Arduino互換ボード
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 ポート ( デジタル入出力 , アナログ入力 )
2015-02-28 jvmlang.daitokai.1.0.0 10
Intel Edison って何 ?: ソフト
● Yocto Linux
● バイナリ
– 一般的な Unix 互換ツール
– node.js
– gcc● Arduino IDE
– Arduino 互換開発環境
● それ以外は自分でインストール
● 買ったその時から開発可能
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
2015-02-28 jvmlang.daitokai.1.0.0 12
Scala は Edison の夢を見る
Scala REPL 編
2015-02-28 jvmlang.daitokai.1.0.0 13
Scala REPL 編
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
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)
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 {_ + _}
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(“,”)
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 {_ + _}
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(_)}
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(_)}
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(_)}
2015-02-28 jvmlang.daitokai.1.0.0 22
Scala REPL 編 : L チカ
● L チカって ?
– たぶん LED チカチカ
● どんな意味があるの ?
– 特にない、自己満足
– 電子工作の Hello, world!
2015-02-28 jvmlang.daitokai.1.0.0 23
Scala REPL 編 : L チカ : ハード編
● Arduino 互換 GPIO を使う
● そこに LED をつなぐ
● ただし電流をあまり流せないのでバッファ回路を付ける
● あとはソフト側からそれを直接叩くだけ
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
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
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)
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)
2015-02-28 jvmlang.daitokai.1.0.0 28
Scala REPL 編 : L チカ : ソフト編
● 落ち着け、落ち着いて素数を数えるんだ… LED 編
(1 to 10).
filter {isPrimeNo(_)}.
foreach {n => blink(n); sleep(1000)}
2015-02-28 jvmlang.daitokai.1.0.0 29
Scala REPL 編 : L チカ : ソフト編
● 落ち着け、落ち着いてフィボナッチ数列を唱えるんだ…LED 編
(1 to 5).
map {fib(_)}.
foreach {n => blink(n); sleep(1000)}
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)
}
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)
}
}
2015-02-28 jvmlang.daitokai.1.0.0 32
最後に
という夢だったのさ ...
終わり
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
}
}
}
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)
}
}
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`()
}
}