Scala入門時に役立つ情報まとめ

## はじめに
Scalaの勉強を始めた時にJavaやRubyと比べると情報量が少なく苦戦したので、今まで調べたことや経験者から聞いた情報などをまとめてみようと思います。
私自身まだまだ初心者ですが、これからScalaやってみようかなと思っている人の参考になれば幸いです。

## WEBサイトで勉強する
ScalaのインストールやHelloWorldなどは検索するとすぐ見つかるので割愛します。
Scala特有の記法や概念などを勉強するのに以下のサイトが参考になりました。

### 技術系
* [ひしだま's 技術メモページ - Scala](http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html)
* [Qiita - やってみよう Scala！(Fringe81社)](http://qiita.com/f81@github/items/369d3ad97112b20d9bc5)
* [Scala Cookbook](http://xerial.org/scala-cookbook/)
* [Scala の省略ルール早覚え](https://gist.github.com/gakuzzzz/10104162)
* [Scala School!](http://twitter.github.io/scala_school/)
* [Scala School 意訳一覧(瀬良和弘さんによる日本語訳)](http://seratch.hatenablog.jp/entry/20120218/1329531294)
* [Effective Scala](http://twitter.github.io/effectivescala/index-ja.html)
* [はてな教科書 - Scalaによるプログラミングの基礎](https://github.com/hatena/Hatena-Textbook/blob/master/foundation-of-programming-scala.md)
* [ドワンゴ社 新入社員Scala研修資料](https://github.com/dwango/scala_text)
* [Scaps: Scala API Search](http://scala-search.org/)

### 読み物系
* [Scala Tech Blog(サイバーエージェント社)](http://adtech.cyberagent.io/scalablog/)
* [AdTech Studio Scala Girls Blog(サイバーエージェント社)](https://adtech.cyberagent.io/girlsblog/)
* [scala先駆者インタビュー(アットウェア社)](http://www.atware.co.jp/search?q=Scala%E5%85%88%E9%A7%86%E8%80%85%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%93%E3%83%A5%E3%83%BC&f_collectionId=546d8fc4e4b06f0363347eaa)


## 勉強会・イベントに参加する
技術書選びやネットでの勉強が意外と苦戦したので、勉強会を探して経験者に直接聞く作戦に切り替えました。ただ勉強会も他の言語に比べると少ないです。
関東で唯一？定期開催している芸者東京エンターテインメント社の「[Scala勉強会in東京](https://rpscala.doorkeeper.jp/)」にお邪魔させていただきました。
結果として作戦は大成功で、有益な情報がたくさん聞けました。可能な限り通いたいと思います。
またScalaをテーマにした日本最大級のカンファレンス「[ScalaMatsuri](http://scalamatsuri.org/)」が2016年1月30、31日に開催されるので参加してみようと思います。

* [Scala勉強会in東京(芸者東京エンターテインメント社)](https://rpscala.doorkeeper.jp/)
* [ScalaMatsuri 2016(2016.1.30 〜 31)](http://scalamatsuri.org/)


## 書籍で勉強する
通称コップ本と呼ばれる「~~[Scalaスケーラブルプログラミング第2版](http://book.impress.co.jp/books/3084)~~ (2016/09/20に[第3版](http://amzn.to/2iH3bxM)が出版されました！)」がいちばん有名です。ただし全35章、700ページ超えと、初心者が読み切るにはそれなりの覚悟が必要です。苦笑


業務でScala使っている方に伺ったところ、普段は「[Scala逆引きレシピ](http://amzn.to/2iJM9Nc)」で調べて、深く知りたい箇所をコップ本で勉強するのが良いのでは。との回答でした。
個人的には「[関数プログラミング実践入門](http://amzn.to/2hWmRcL)」「[Javaによる関数型プログラミング](http://amzn.to/2hWmeA0)」を読んでいたおかげで比較的すんなり頭に入ってきた感があるので、関数型プログラミングを全く知らない方は合わせて読むと良いかも知れません。


* [Scalaスケーラブルプログラミング第3版 / インプレス](http://amzn.to/2iH3bxM)
* [Scala逆引きレシピ / 翔泳社](http://amzn.to/2iJM9Nc)
* [関数プログラミング実践入門 / 技術評論社](http://amzn.to/2hWmRcL)
* [Javaによる関数型プログラミング――Java 8ラムダ式とStream / オライリー](http://amzn.to/2hWmeA0)

<a href="https://www.amazon.co.jp/dp/4844381490/ref=as_li_ss_il?ie=UTF8&linkCode=li1&tag=nesheep5-22&linkId=a03b060cfdd8e4ff16ff615a2b88c92b" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4844381490&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li1&o=9&a=4844381490" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> <a href="https://www.amazon.co.jp/Scala%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94-%E7%AB%B9%E6%B7%BB-%E7%9B%B4%E6%A8%B9/dp/4798125415/ref=as_li_ss_il?s=books&ie=UTF8&qid=1483661214&sr=1-1&keywords=Scala%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94&linkCode=li1&tag=nesheep5-22&linkId=942c4f217d78ce3d0fdb3ac5c37ccfbe" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798125415&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li1&o=9&a=4798125415" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> <a href="https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82-%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-PRESS-plus/dp/4774183903/ref=as_li_ss_il?s=books&ie=UTF8&qid=1483661316&sr=1-1&keywords=%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&linkCode=li1&tag=nesheep5-22&linkId=413eaec4fa8b83a976e581163bf56928" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4774183903&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li1&o=9&a=4774183903" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> <a href="https://www.amazon.co.jp/Java%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-_Java-8%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%A8Stream-Venkat-Subramaniam/dp/4873117046/ref=as_li_ss_il?s=books&ie=UTF8&qid=1483661385&sr=1-1&keywords=Java%E3%80%80%E9%96%A2%E6%95%B0&linkCode=li1&tag=nesheep5-22&linkId=325c35791855df4c566be0367bd4b654" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873117046&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nesheep5-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nesheep5-22&l=li1&o=9&a=4873117046" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※ 参考：[Scalaを学ぶためのScala本の読み進め方 (10冊)](http://etc9.hatenablog.com/entry/20110620/1308585963)


## 問題を解く
とにかくコード書くのが上達の近道とのことで、別言語技術書のサンプルソースをScalaに書き直す、などやったりするそうです。
最近はオンラインでプログラミングの問題を解くことができるので、簡単なレベルのものからScalaで書いています。プロコン系は開催日が指定されていることが多いので、自分のペースで進められる「[Paiza](https://paiza.jp/challenges)」「[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)」あたりがオススメです。
また「[AtCoder](http://atcoder.jp/)」は過去問について他ユーザの回答を閲覧できるので、自力で解いた後に他の回答を見て良いところを盗む、といった使い方ができます。

* [AtCoder](http://atcoder.jp/)
* [AOJ - オンライン プログラミング チャレンジ](http://judge.u-aizu.ac.jp/onlinejudge/index.jsp?lang=ja)
* [Paiza - コーディングスキルチェック](https://paiza.jp/challenges)

## Scala界の著名エンジニアを追う
Scalaの最新情報をキャッチアップする方法について勉強会で相談したところ、口を揃えて「吉田さんをフォローしろ」と言われました。
てっきりどこかのサイトを教えてもらえるものだと思っていたので、エンジニアをフォローするというアプローチはかなり新鮮でした。
私が参考にさせてもらっているエンジニアの方たちを挙げさせてもらいます。(50音順)

##### 瀬良 和弘さん
SmartNews社ソフトウェアエンジニア。
ScalikeJDBC、Skinny Framework など Scala OSS プロジェクトリード。
Scalatra、json4s、Scalate のメンテナ。

* twitter：[@seratch](https://twitter.com/seratch)/[@seratch_ja](https://twitter.com/seratch_ja)
* GitHub：https://github.com/seratch
* SlideShare：http://www.slideshare.net/seratch
* SpeakerDeck：https://speakerdeck.com/seratch
* 技術ブログ：[seratch's weblog in Japanese](http://seratch.hatenablog.jp/)

##### 竹添 直樹さん
ビズリーチ社チーフアーキテクト。
Scala逆引きレシピ著者、GitBucketファウンダー。

* twitter：[@takezoen](https://twitter.com/takezoen)
* GitHub：https://github.com/takezoe
* SlideShare：http://www.slideshare.net/takezoe
* 技術ブログ：[たけぞう瀕死ブログ](http://takezoe.hatenablog.com/)

##### 中村 学さん(がくぞさん) 
株式会社Tech to Value 代表取締役。
株式会社エフ・コード CTO。
Japan Scala Association理事。

* twitter：[@gakuzzzz](https://twitter.com/gakuzzzz)
* GitHub：https://github.com/gakuzzzz
* 技術ブログ：[がくぞーのメモ](http://d.hatena.ne.jp/gakuzo/)

##### 水島 宏太さん
ドワンゴ社プログラマ。
Japan Scala Association代表理事。

* twitter：[@kmizu](https://twitter.com/kmizu)
* GitHub：https://github.com/kmizu
* 技術ブログ：[kmizuの日記](http://kmizu.hatenablog.com/)

##### Kenji Yoshidaさん
scalazとsbtとargonautとscalikejdbcのコミッター。

* twitter：[@xuwei_k](https://twitter.com/xuwei_k)
* GitHub：https://github.com/xuwei-k
* SlideShare：http://www.slideshare.net/KenjiYoshida
* 技術ブログ：[scalaとか・・・](http://d.hatena.ne.jp/xuwei/)


## フレームワーク関連
###WEBアプリフレームワーク
「[Play Framework](https://www.playframework.com/)」がデファクトスタンダードと言ってよさそうです。執筆時点で安定版である2.4系の情報が意外と少ないので、古い記事は公式の[移行ガイド](https://www.playframework.com/documentation/2.4.x/Migration24)などを見ながら読み替えをする必要になるかも知れません。ビズリーチ社の[ハンズオン](https://github.com/bizreach/play2-hands-on)は2.3系、2.4系が用意されているのでとても参考になりました。
シンプルでSinatraライクなWebフレームワークとして「[Scalatra](http://www.scalatra.org/)」も人気があるようです。


* [Play Framework](https://www.playframework.com/)
* [Play2 + Slickハンズオン(ビズリーチ社)](https://github.com/bizreach/play2-hands-on)
* [Play 2.4 Migration Guide](https://www.playframework.com/documentation/2.4.x/Migration24)
* [Play2.3.xから2.4への移行ではまったところ](http://qiita.com/shunjikonishi/items/099ee091769900916c64)
* [Scalatra](http://www.scalatra.org/)
* [Scala用のシンプルなWebフレームワーク「Scalatra」](http://codebreak.com/blog/takezoe/page/6b03555f/)
* [はてな教科書 - ScalaによるWebアプリケーション開発(Scaratra)](https://github.com/hatena/Hatena-Textbook/blob/master/web-application-development-scala.md)


### DBアクセスライブラリ
[Slick](http://slick.typesafe.com/)と[ScalikeJDBC](http://scalikejdbc.org/)が二大勢力のようです。SlickはPlayFrameworkの標準ライブラリになりました。
ScalikeJDBCは前述のエンジニアの方たちが作っているので、本当に困ったら直接聞けるというメリットがあります。(と勉強会で教わりました。笑)
私個人はScalikeJDBCを勉強し始めた段階なので、それぞれの良さがわかった頃に改めてまとめたいと思います。

* [Slick](http://slick.typesafe.com/)
* [ScalikeJDBC](http://scalikejdbc.org/)
* [はてな教科書 - Scala によるデータベースプログラミング](https://github.com/hatena/Hatena-Textbook/blob/master/database-programming-scala.md)

※ 参考：[Slick vs ScalikeJDBC](http://togetter.com/li/559426)

### その他
scalazを使うエンジニアを業界では「Z戦士」と呼ぶそうです。笑

* [scalaz](https://github.com/scalaz/scalaz)
* [独習 Scalaz](http://eed3si9n.com/learning-scalaz/ja/)
* [Cats](https://typelevel.org/cats/)
* [猫番](http://eed3si9n.com/herding-cats/ja/)



## 開発環境関連
### IntelliJ IDEA 
PlayFrameworkの勉強時、始めはEclipseにScalaIDEというプラグインを入れて使っていたのですが、動作が不安定&重いのでIntelliJ IDEAに乗り換えてみました。まだ使い始めなので慣れないですが、サクサク動いておすすめです。

* [Scala 開発環境構築(IntelliJ IDEA, SBT, scalaenv)](http://blog.chopschips.net/blog/2014/09/07/scala-get-started/)
* [IntelliJ IDEAがPlay Framework 2.4のroutesを解決してくれない](http://dev.classmethod.jp/server-side/intellij-idea-play-framework-24-routes-syntax-error/)
* [忙しい人のためのIntelliJ IDEAショートカット集（´-`）](http://qiita.com/yoppe/items/f7cbeb825c071691d3f2)

### ATOM
最近注目のテキストエディタ、ATOMを使って開発環境を整えることもできるそうです。IDEを使うには大げさすぎる時など状況によって使い分けるといいかもしれません。

* [AtomでのScala開発環境 - たけぞう瀕死ブログ](http://takezoe.hatenablog.com/entry/2015/12/14/075257)

## 小ネタ
### REPLでシンタックスハイライト
* Scala 2.11.4より、ターミナルで"scala -Dscala.color"と入力してREPLを起動するとちょっとだけ(REPL結果の変数と型だけ)カラー表示となる。