#新宿Scala座’14年 1月号

自己紹介

  • @numa08
  • 仕事でScala使ってないマン
  • でじこちゃんかわいいガチ勢

今年も

よろしくお願い

しまScala

やったこと

  • conscriptでツール作った

    • implicit-classを今更使った
    • DSLなことをやってみた
  • scaloidを使ってみた

Conscriptとは?

作ったもの

  • halley
  • 某海外のロダからエッチな画像を取ってくる物

作った動機は不純なので省略

使い方

new urls {
    add("URL(例:http://g.e-hentai.org/g/344872/6533c3fb52/")
    add("複数記入することもできる")
    // //から始まる行はコメントだ
}
  • 上記内容のHalleyfileを作る
  • hallyコマンドを実行
  • 待つ

conscript-plugin

$ g8 n8han/conscript
# answer questions
$ cd my-app
$ sbt
> update

src/main/conscript/[app]/launchconfigに色々と書く

[app]
  version: 0.1.0
  org: net.numa08
  name: halley
  class: net.numa08.Halley #エントリポイント	
[scala]
  version: 2.10.3
[repositories]
  local #バイナリのあるリポジトリ

気になったところ

  • テストコードはテンプレートに含まれない

    • 自分で付けたそう
    • g8テンプレート作ってもいいかも?
  • Mavenリポジトリが必要

    • Maven Centralとか
    • オレオレMaveリポジトリもOk?
    • ローカルでも可

implict-class使った

  • 暗黙的な型変換をやってくれる
  • 既存クラスにメソッドを追加する感じで
  • 使いドコロを選びましょう

implict-class使った

  • FileをOptiondeラップしてあげたかった
val file = new File("Halleyfile").asOpt
file match {
  case None => sys.error
  case _ {/*do something*/}
}

implict-class使った

object FileWrapper {
  implicit class FileWrapper(val file:File) extends AnyVal {
    def asOpt : Option[File] = {
      if(file.exists){
              Some(file)
             } else {
              None
       }
    }
  }
}

詰まったところとか

  • objectでラップせずに使った

    • classなのでつい・・・
    • implicit宣言されたものは、トップクラスにはできません

詰まったところとか2

  • importで詰まった

    • implicitなメソッド、クラスは直接指定する必要がある
    • _とかつける必要がある
    • こんな感じ

DSLやった

  • ドメイン特化型言語
  • 設定ファイル書くのに便利
  • そのままオブジェクトになってくれる

DSLやった

  • twitter/uti

    • Eval
    • Scalaファイルを実行して、値を返してくれる
val code = Source.fromFile(file)
	 .mkString("import net.numa08.urls\n", "", "")
val config = Eval[urls](code)				 

詰まったところ

sbtとか

 - resolvers ++= Seq(
 - "twiiter" at "http://maven.twttr.com/"
 - )
 - libraryDependencies += "com.twitter" % "util-eval" % "6.5.0"
 + libraryDependencies += "com.twitter" % "util-eval_2.10" % "6.10.0"

Scaloidを使ってみた

  • 2014年、最も気になるScalaのフレームワーク
  • ScalaでAndroidアプリが作れる!!!!
  • ScalaでAndroidアプリをかっこ良く作れる!!!

ScalaでAndroidアプリを作る!!

  • pfn/android-sdk-pluginを発展させたものっぽい?
  • エレガントにコードが書ける!!
  • 過去のコードとの互換性もある!!
  • 簡単に使える!!

この辺りが苦行

  • メソッド数の上限

    • ビルドツールを使って、動的なライブラリのロードが必須
  • レイアウトとコードの結びつけがキモい

    • findViewByIdェ・・・
    • javaならキャストするけど、Scalaでキャスト?

この辺りが苦行

  • ジェネリクスとか

    • ScalaとJavaで差があるので、死ぬ・・・

苦行を乗り越えた者がいた

pfn/android-sdk-plugin

曰く

  • jberkel/android-pluginは複雑すぎる
  • リソースとコードの結びつけがエレガント
  • conscriptg8なんていらない

Scaloid

レイアウト周り

  • Scalaで定義可能なレイアウト
  • xmlでもレイアウト可

    • あんまり推奨されてない?
  • xml2Scalaなコンバータの提供

ライフサイクル制御

  • ライフサイクルのコールバックで必要な処理も、簡潔に
  • 例はonResumeでregist,onPauseでunregistが必須なBroadcastReceiver

非同期処理関連

  • scalaのspawnが使えるっぽい
  • コールバックもお手軽に

その他

  • AndroidのAPIをTraitでラップしている
  • イミュータブルなオブジェクトの生成がしやすい
  • お作法的な処理を簡略化している

気になったところ

  • テストの機能はないっぽい
  • Play以上のDSL祭り
  • 今までのAndroidとはかなり違うものに・・・

Scaloid

今年注目なんじゃないかなぁ?