ラベル Scala の投稿を表示しています。 すべての投稿を表示
ラベル Scala の投稿を表示しています。 すべての投稿を表示

2013年7月22日月曜日

Kotlin勉強会に行くのでちょっとだけ予習した

多分日本初という触れ込みの勉強会に行くので予習したメモ

ただし、主催者は現状こんな感じらしい





kotlinの未来が不安ですね…



というわけで超適当に以下のkotlinの基本文法を眺めてみた

https://sites.google.com/site/tarokotlin/3-kotlinno-biao-zhunapi



そうそう、 Comparision to Scala ってページがあるので開くと…

If you are happy with Scala, you probably don't need Kotlin.

らしいです

あれ、じゃあ終わり?



スマートキャスト


is演算子で型チェックしてたら、それはもうその型とみなして動かしてええで!
みたいな感じらしいです



ちなみにScalaにはねーよってDocumentに書いてます

同じようなことしようとするとこんな感じ?



うん、パッとは思いつかんけど同じような挙動だよね

関数


defかfunかの違いくらい?
ローカル関数もあるし〜

と思ったらローカル関数でなかなか面白いことが



拡張関数というものが混じっている

Scalaだったら暗黙の型変換とかで同様のことを頑張る感じ?



まあサンプルと同じ内容なら

str.forall(_.isUpper)

でいいじゃん?とは突っ込まない

関数リテラル


kotlinだと関数は引数として渡せないよと。
渡すなら関数リテラルでと。





scalaの場合、関数から関数リテラルに変換できるからだろうかどっちでもOK
そういや深く考えたことねーわ…

// aliasと言って良いのか…?
val alias = sayHelloFunc _

kotlinにも関数から関数リテラルに変換するやつがあれば結局一緒な気がする

when式


matchとどう違うのか… と思ったけど、割りとswitch文よりな感じ?
(ただしcontinue書いたらコンパイル通らなかったし、まだ未実装?)

なので5.2のパターンマッチングを見てみた





同じように書いたらこんな感じ?


ちなみにweb demoだと Tuples are not supported. Use data classes instead. って怒られる…
→ 後のデータクラスの章で悲しみの答えが!

流れでバインディングパターンも






分解者パターン:// あとで書く!


とあるけど、きっとExtractorとおんなじような感じなのかな…?と脳内で勝手に完結

for とか while とか ジャンプとリターン とか


ラベル付きのbreakができるよ!らしい
この辺とかはjavaよりも強力ですよ〜な売りになるんだろうか

その他


四章チラ見して記憶したこと

out/inで共変/反変

staticなメソッド持てないよ 代わりにobjectってあるよ

5章ちら(ry

https://sites.google.com/site/tarokotlin/chap5/sec54
null安全かOptionかは使う人によって良し悪し変わるんだろうなぁ…

https://sites.google.com/site/tarokotlin/chap5/sec55
データクラスってケースクラスみたいなもんかな?
そしてさり気に一番下に「マイルストーン3以降では、タプル機能は廃止されています。」
の文言が…/(^o^)\



各所チラ見した感想としては、確かにScalaで満足してたらKotlinは要らんよ?

って感じなんだろうなぁ…と

まあそんなこと言い出したら、別にどの言語でもそれでいいじゃんになりそうな気はする。

ScalaとKotlinって、それ(Scala | Kotlin)で見たよ!
みたいな感じにお互いがなるんですかね。

ってことでざっくりテキトー予習終わり

おまけ


sbt → simple build tool
kbt → kantan build tool

だったら面白かったのに…(これが書きたかっただけだったりw)

2013年3月19日火曜日

#TDDBC Tokyo 2013-03 に参加してきました

いつかは行ってみよう〜っと思っていたTDDBCに参加して来ました。

TDDはもちろんペアプロがすごくよい経験になった、というのが最大の感想です

ドライバーとナビゲーターの入れ替えをあんなに頻繁にやるものなんだ…ということだけでも個人的にはすごくプラスになりました。

主催者やTAの方々、そして当日自分の環境に合わせてペアを組んでくれた @akuraru さん ありがとうございました。

そしてVOYAGE GROUPさん、タダ酒ありがとうございました素敵な会場ありがとうございました。

お題とか詳細は皆さんが各所でまとめてますし、togetterにもまとまってますのでそちらで。





と言ってしまったので書きます。

まず、こんな環境でした。

  • scala2.10 + specs2 + sbtでtestぶん回し

多分気になっている人もいると思いますし、一応こうやりました的なことを書いていきます



TODOもコード?



えーっと、半分本当で半分ウソです。

specs2ではこのような書き方が可能になります。



pendingを空のチェックボックス代わりに使っているだけです。
pendingを実際にテストを行うメソッドに書き換えればチェックした!みたいな。
詐欺ですねw

この書き方(specs2のサイトではacceptance specifications とあるので、受け入れテストを前提としている書き方?)だと(甘めに言えば)そのままTODOリスト書いているのと変わらない形で書けますので、
TODOリストもScalaで書いた( ー`дー´)キリッ
と言っても許され…ますよね?

というのを誇張しました、スミマセンでした。

他にもgradle同様HTML出力とかもしてくれますし、spock同様DataTablesもありますし、specs便利です。

ちなみにhtml出力画面はこんな感じ。



話それますが機会があればgradle+spockはとても触りたいですね。
あとScalaTestで同じようなことが出来るかどうかは、使ったこと無いので知りません、ごめんなさい。





なるほど…(ぉぃ
まあnullとか例外とか嫌ですよね。

で、先ほど当日未実装だった部分をテキトーにやったところ、ソースの行数が30行ぐらいになっちゃった。

改行だけの部分のカウントを除いて、dumpメソッドを再度ワンライナーに戻して、あと何かすれば10行程度になるかも?

何れにしても自分のScala力と今回のお題(Exception返せ!とか)だと10行は難しいかも…

ましてやvar使っちゃったし、もう負けてる感満載w



sbtでぶん回す



最近sbtは酢豚と読むらしいです(scala conference jpでそう聞いたw)

sbtではtestと叩くとtestが全実行されますが、「~test」で実行するとファイルが変更される度にtestを回してくれるので大変便利です。
コード書いてセーブすれば勝手に実行される素敵環境がすぐ出来ます。
PCのパワーと電源がある限りひたすらぶん回しておけばいいのです(ぇ

ただ正直なところ…テストケース一つを実行するならJava+JUnit+QuickJUnitのほうが体感速度は速くて気持ちいいと思いますw
Scalaもテストの実行そのものは早いんですけど、コンパイル待ちが…うーん…

結論:もっとマシンパワーがあればなんとかなる



あんまりここで書いちゃうと水曜日の「Scalaを勉強する会」でしゃべることがネタOnlyになっちゃうのでこのへんで許してください。

一応githubにソース置いてますので、興味がありましたら御覧ください。
あ、もちろん「フツーこう書くだろJK」的なご指導ご鞭撻もよろしくお願いします。

https://github.com/daneko/tddbc




そうそう、ペアプロにおいて環境の違いはどうやって埋めるべきなんでしょうね?
自分の環境(Intellijにvimプラグイン)とかだと、相手がemacs派だったりした場合とか…







あー、仕事でScala書きてー…

2012年10月1日月曜日

Playframework2.0 + mongo(salat) でのUnitTestに関するメモ

conf/application.confに書かれた設定値は

FakeApplication(additionalConfiguration = Map("key名" -> "値"))

で置き換えられます
ですので、mongoを使っている場合

FakeApplication(additionalConfiguration = Map("mongodb.default.db" -> "dummy_db_name"))

とかで"mongodb.default.db"を書き変えてテストを実行することで、テスト用のDBが使えます



事の経緯






ということで開催されました、第一回詳しい人が誰もいないScala勉強会@Hangout




こんなかんじで みやびさん まで巻き込まれた結果がこれ。





documentにも
「このフェイクアプリケーションに対して追加の設定値を渡す (または上書きする) したり、プラグインをモックすることも可能です。例えば、 default という名前の インメモリデータベースに接続された FakeApplication を起動する場合は、次のように書きます」

FakeApplication(additionalConfiguration = inMemoryDatabase())

とありますが、inMemoryDatabaseは次のようになっています

  def inMemoryDatabase(name: String = "default"): Map[String, String] = {
    Map(
      ("db." + name + ".driver") -> "org.h2.Driver",
      ("db." + name + ".url") -> ("jdbc:h2:mem:play-test-" + scala.util.Random.nextInt)
    )
  }

早い話がinMemoryDatabaseを使っても、「mongodb.default.db」を書き換えられるわけないってことでした
残念!

なお、database cleaner 的なものがパッと調べた感じでは見つからなかったので、
上記ではbeforeでテスト用のDBごとdropしてます

参考にしたのはこちら

上記のような方法でとりあえずは気兼ねなくテストケースが書けそうで何よりです。
ただ、毎度毎度書くのは面倒なので、「Specification」を拡張してどっかに置いておくとかのほうがいいと思います。




「いやそもそもこういう便利な方法あるしwww m9。゚(゚^Д^゚)゚。プギャーッハハハハヒャヒャヒャヒャ」

的なツッコミありましたら、教えてください♥





参考
http://playdocja.appspot.com/documentation/2.0.3/ScalaTest
http://modalsoul.github.com/Programing/2012/07/31/Getting-Started-with-Play2-Scala-and-Squeryl/
https://github.com/mongodb/casbah/blob/master/casbah-core/src/test/scala/ConversionsSpec.scala
https://github.com/leon/play-salat
http://stackoverflow.com/questions/10760131/using-specs2-and-fakeapplication-to-test-database-fails-evolution-inserts
等

サンプルとひな形を兼ねて、githubに上げています
g8 daneko/play-salat
で作成した後、play test で動くはずです。



今後も 詳しい人が誰もいないScala勉強会@Hangout をテキトーに開くと思いますw

2012年9月10日月曜日

Scalaのカリー化とか部分適応とかの俺メモ

別になんにも難しい or 怖いお話はありません



上記は問題ない。
全く問題ない。

問題は下



一旦部分適応やらで作成したメソッドを再度カリー化したり
一旦カリー化されたメソッドを更に部分適応したりするときは _ が不要
というかつけると怒られる

とりあえずはそういうものって覚えればいい?

環境は
Scala2.9.2
MacOSX10.7


2012/09/12 追記
defで宣言した関数名の後ろに「_」をつけると、「関数オブジェクト」になる
なので、一回関数オブジェクトに変わっている → 次は変える必要はない(というか既に変換済み)
ということでいいんでしょうか?


2012/09/13 追記
http://togetter.com/li/154007
このあたりかな?

2012年4月7日土曜日

Eclipse + Scala + sbt + Specs2 な環境を試してみた

水、木とJavaOneに行かれた皆様、どうでしたか?
ええ、私は会社にいましたよ…

http://togetter.com/li/283845 とか見て、とても楽しそうで羨ましい…って指咥えて仕事してました。

まあ指咥えてってのは嘘ですし、仕事し…



というわけで私も唐突にScala触ってみました。

その時のメモ

私の環境
Mac OSX 10.7.3
Eclipse 3.7.2
Scala IDE for Eclipse 2.0.0
sbt 0.11.2

まあ殆どこちらのブログ参考にしたんですけどね
http://blog.weblade.in/archives/1905

まずはEclipseを用意します
http://www.eclipse.org/downloads/

次にScala IDE for Eclipse というプラグインを入れます
http://scala-ide.org/
一応 For 2.9.x の安定版のリンクを選びました

続いてEclipse.iniを編集します。
http://www.assembla.com/wiki/show/scala-ide/Setup とか参考にして適当に
とりあえずヒープサイズだけでっかくしておけばいいと思います。たぶん。

Macの場合
Eclipse.app/Contents/MacOS/eclipse.ini
のはず

sbt(simple build tool)入れます。
homebrewで入れました
$ brew install sbt
多分今なら0.11.2が入ります

brewでインストールしたsbtを見ると
#!/bin/sh
# /usr/local/Cellar/sbt/0.11.2/bin/sbt
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.11.2/libexec/sbt-launch.jar "$@"
とあるので
https://gist.github.com/1139288 を参考にSBT_OPTSを環境変数にでも追加すればいい気がします

export SBT_OPTS="-Dfile.encoding=UTF8 -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m"
特にエンコードは指定しておかないと、macのターミナルでsbt testとか実行した時に日本語表示が化けて悲しい事になりました。


さてここまでやったらあとはbuild.sbtを作成するのですが、eclipseプロジェクトを作っては消し…ってのを結構やるので
とりあえず最低限のプロジェクトが作れるようなshスクリプトでも作ってみました。
本当にいいのかどうかは正直sbtどころかmavenだってマトモに使ったことないのでさっぱりですけど。
内容は件名のようにSpecs2が使えればいいんじゃね?的な最低限のやつです。


※なおgiter8という素晴らしいものがあります。自分でスクリプト書いている場合じゃねえぜ!




上記スクリプト(hogeと仮定)をテキトーに保存して実行権限与えたとしてあとは

$ cd てきとーな場所
$ hoge hello-scala

とかやれば、eclipseのプロジェクトがhello-scala というディレクトリの下に作られます。
追加したいライブラリ等があるのなら、hello-scala/build.sbt の libraryDependencies に追加した後 hello-scala直下で

$ sbt reload update eclipse

でOK


出来上がったプロジェクトをEclipseでImportします。

するとこんな感じ?



さて、肝心のSpecs2ですが選定した理由は、「会社でRailsだしRspecだしなんとなく…」というだけです。
あとで見たらScalaTestでもSpec的なやつあったしw
これでなければならないということもなければ、むしろ組み合わせて使うことも可能なようです。
http://etorreborre.github.com/specs2/guide/org.specs2.guide.SpecStructure.html#ScalaCheck+values

Eclipse上で実行するときの注意点は以下のように対象クラスにJUnitRunnerを付け忘れないことだけみたいです。
http://scala-ide.org/docs/user/testingframeworks.html
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner // 忘れないこと
import org.junit.runner.RunWith // 忘れないこと

@RunWith(classOf[JUnitRunner]) // 忘れないこと
class HelloSpecs2 extends Specification {

あとはフツーに走らせてやれば動きます。

もちろん sbt test で動かしてもテストは動きます。素晴らしい。(当たり前か)


おまけ

build.sbtに以下記述を追加するとSpecs実行結果がJUnit形式のxmlが出力されます
http://etorreborre.github.com/specs2/guide/org.specs2.guide.Runners.html#Simple+build+tool
testOptions in Test += Tests.Argument("junitxml")
// 贅沢にも全部出すのなら
testOptions in Test += Tests.Argument("junitxml", "html", "console")

出力先はxmlは target/test-reports 以下に
htmlは target/specs2-reports 以下 のようです。

なおhtml出力の場合は
"org.pegdown" % "pegdown" % "1.0.2"
みたいな感じでpegdownというものを依存関係に足さないと怒られます。

xmlを出力すればJenkinsさんとかもウマウマできますし便利ですね。


scala ide で設定できるformatterはscalariformというのを使っているようです。
http://mdr.github.com/scalariform/
で、sbtscalariform なんてものがあります。
https://github.com/typesafehub/sbtscalariform

入れるとコンパイル時にフォーマットしてくれるっぽいですね。素敵。
Eclipseを使わなくてもフォーマットはみんな統一できる、というかビルドサーバ(が、あればだけど)が勝手に整形してくれる
みたいなことができるんですよね、きっと。


さて、あとは使う人間のscala力を高めればいいのかな(白目