Más contenido relacionado Beginners Scala in FAN 201210231. 第3回
初心者Scala
ひとりではじめる
Scala
2012/10/09
@shitai246_
2. 自己紹介
❖ シラトリタイスケ
๏ Twitter: @shitai246_
๏ Blog: http://a4p.me/
❖ エンジニア
๏ Java歴8年・Scala歴1年・JoJo歴18年
๏ Webサービスとかアドテクノロジーとか
❖ マネージャー
๏ 管理しないこともひとつの管理手法です
❖ ㈱ファンコミュニケーションズではエンジニアを募集しています
๏ 成果報酬型のアフィリエイト、A8.net/Moba8.netを開発・運用・保守するお仕事。
๏ Javaがメイン、ところによりPerl、稀にC。もれなくレガシー。Scalaは積極採用中。
3. ひとりではじめるScala
❖ 仕事でScalaを使う上での障害
๏ 会社や上司の理解が得られない/説得できない
๏ Scalaを書ける同僚が少ない/居ない
๏ Scalaでコードを書いた経験が少なく、自信が持てない
4. どうする?
❖ ちょっとした処理をScalaで書いてみる
๏ 1回しかやらない
๏ 処理する量は多い(手作業でやるのはだるいor不可能)
๏ 他の言語(JavaとかPerlとか)だとめんどい
๏ コードにバグがあってもすぐわかるorトラブルに発展しない
๏ etc...
❖ メリット
๏ ひとりではじめられる
๏ 実際にScalaを使ってみて「Scala る」と周りに言える
5. Case1. 画像ファイルの縦横幅を取得する
❖ 背景
๏ 数万くらいある画像ファイルの横幅・縦幅を取得する必要があった
๏ 画像ファイルは全てWebから取得可能、且つURLは全てデータ化できていた
❖ Scalaを使った理由
๏ 僕のスキルセット的にJavaかScalaかしか選択肢がなかった
๏ 既にJavaのコードを書くとイライラする病を発病していたためScalaで書いた
6. Case1. 画像ファイルの縦横幅を取得する
❖ 実際に書いたコード
※ 大人の事情で多少変更しています。
import javax.imageio.ImageIO
import java.net.URL
import scala.io.Source
object Main {
def main(args : Array[String]) : Unit = {
val source = Source.fromFile(“/tmp/banner_url.txt”)
val lines = source.getLines
lines.foreach(getBannerSize)
}
def getBannerSize(url : String) : Unit = {
try {
val image = ImageIO.read(new URL(url))
println(url + “,” + image.getWidth + “,” + image.getHeight)
} catch {
case e:Exception => Thread.sleep(100); getBannerSize(url)
}
}
}
7. Case2. Xmlを解析する
❖ 背景
๏ 8月にAmazonアソシエイトで特定カテゴリの商品の紹介料率が変わった
๏ 弊社でもAmazonアソシエイトと連携する部分があり、改修が必要になった
๏ 事前調査のため、APIから返却されるXmlのデータの一部を確認したかった
๏ APIの返却値がXMLで数百レコードもあり、手作業でやるのは不可能だった
❖ Scalaを使った理由
๏ ScalaはXmlがファーストクラスで扱えるため、やりたいことがシンプルに実現できた
8. Case2. Xmlを解析する
❖ 実際に書いたコード
import scala.io.Source
import java.io.File
import scala.xml.XML
object Main {
def main(args : Array[String]) : Unit = {
val xml = XML.loadFile(new File(“./amazon/orders.xml”))
val items = xml “Item”
val tag = items “@Tag”
tag.foreach(println)
}
}
9. やってみよう
❖ REPLでXmlを解析してみる
scala> val xml =
| <list>
| <recode>
| <id>1</id><data value="data1" />
| </recode>
| <recode>
| <id>2</id><data value="data2" />
| </recode>
| <recode2>
| <id>3</id><data value="data3" />
| </recode2>
| </list>
scala> println(xml "recode" "id")
<id>1</id><id>2</id>
scala> println(xml "id")
<id>1</id><id>2</id><id>3</id>
scala> (xml "@value").foreach(println)
data1
data2
data3
scala>
10. さいごに
❖ 書いたコードは共有しよう
๏ みんなから見えるところにコードと実行結果を置くと興味を持つ人がいるかもしれない
๏ 僕の場合は Trac のチケットにコードをそのまま載せている
๏ 過剰な期待はしないこと
❖ どうしてもプロダクトコードをScalaで書きたい人は…
๏ ㈱ファンコミュニケーションズではエンジニアを募集しています
Notas del editor \n \n \n \n \n \n \n \n \n \n