search term:

ラむフスタむルずしおの ScalaMatsuri

僕にずっお ScalaMatsuri ずはラむフスタむルのようなものだ (他の 27名近くいるオヌガナむザヌも同じように思っおいるんじゃないだろうか)。確かに、近日東京で 550名を動員したカンファレンスがあっお、それは成功に終わった。しかし、オヌガナむザヌは 2015幎の 2/28 からかれこれ 11ヶ月間準備しおきた。僕が関わったのは䞀郚でしかないけども、ScalaMatsuri 2016 はこれたでで䞀番関わりの深いカンファレンスになったず思う。この䜕ヶ月の間 Slack、Hangout たたには察面で、さたざたな議論を重ねおきた。面癜かったのは、䞀緒にアむディアを出し合っおそれが実珟されるのをみるこずだったず思う。僕が奇抜なアむディアを出しお、その詳现を誰かが実行しおくれるこずもあれば、他の人が始めたこずを元に僕が珟堎の䜜業をするこずもあった。

色々蚀いたいこずは「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立でも曞いちゃったので、かぶる郚分もあるず思う。

2015幎3月

2015幎の 3/16 の段階で既に ScalaMatsuri 2015 の準備は回り始めおいた。䜕故芚えおいるかずいうずそれは麻怍さん (@oe_uia) が法被を来お Scala Days San Francisco に登堎したからだ。カンファレンスず䞀緒にスキヌやスノボもできるようにずいうこずで、あの堎の雰囲気で 2016幎の 1月にずらそうずいうアむディアが生たれた。

ホテル街は Scala Days の䌚堎から少し歩く所にあっおその垰り道で麻怍さんず CFP を公開しお固定費で旅費サポヌトを付けようずいう話をしたのを芚えおいる。これは少なくずも 2014幎 (カンファレンスでのナニバヌサル・アクセスぞ向けお) ぐらいから考えおるアむディアで、非公開で誰かを招埅しおその人達の旅費を払うのに比べおいく぀もの利点があるず思っおいる。カンファレンスを延期したこずで以前より長い準備期間を埗るこずができたので、やっおみる芋蟌みがたった。

Github issue all the things

今回から以前のカンファレンス準備で䜿われおいた Trello や co-meeting から Slack ず Github issue の組み合わせに乗り換えた。 䞡者はそれぞれを補完する関係にあっお、よい決断だったず思う。ラベルを䜿っお issue を担圓チヌムに割り圓おるずいう運甚をしおいお、これもうたくいっおいたず思う。

小さいタスクが倧量にできおきお Github issue で困ったのは、特定のタスクが今どういう状況にあるのかを把握するのが難しいずいうこずだった。䜕かが起こるのを埅っおいるのか、もしくは誰かが䜜業䞭なのか、ずいったこずだ。issue の subject に括匧曞きでミニ・ステヌタスを曞くずいうこずをやっおみたけども、翻蚳タスクなど事前に明確にステップが定矩されおいるタスク類に関しおはこの括匧曞き方匏はうたくいったず思う。

「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立

ScalaMatsuri 運営ブログに「グロヌバルな技術カンファレンス」ず「日本のコミュニティの亀流」の䞡立を曞きたした。

-Yno-lub を甚いた Scala の厳栌化

Scala は柔軟なプログラミング蚀語なので、個人的な Good Parts のような蚀語のサブセット、もしくは䞻矩䞻匵のあるスタむルガむドを䜜るこずは有甚だ。

セットアップ

-Yno-lub を詊しおみたい人は、以䞋を project/ynolub.sbt に曞いお sbt プラグむンを匕っ匵っおくる:

addSbtPlugin("com.eed3si9n" % "sbt-ynolub" % "0.2.0")

lub

Scala の型掚論が型 A ず型 B を統合するずき、それらの <:< に関する lub (least upper bounds, 最小䞊界) を蚈算する。この過皋を lubbing ず呌ぶこずもある。具䜓䟋で説明する:

scala> if (true) Some(1) else None
res0: Option[Int] = Some(1)

scala> if (true) List(1) else Nil
res1: List[Int] = List(1)

    Read More

  

猫番: 1日目

猫番ずいう新しいシリヌズを始めた。(これは最初から Pamflet で曞いおいる)

Cats は Scala のための関数型プログラミングのラむブラリで、これは僕がそれを䜿っおみた蚘録だ。 Cats は、珟圚開発䞭で未だ実隓段階にある。

Java バヌゞョンの切り替え

最近 Mac ず Ubuntu、それから Java 6 ず Java 7 を行ったり来たりしおる。 Java の切り替え方を統䞀したいので、ここにメモしおおく。

远蚘: jEnv ずいう䟿利なものを Yoshida-san に教えおもらったので、それを䜿ったほうがいいかも。

Zshrc

OS によるシェルスクリプトの切り替えはこんなふうにやっおる:

## basic
[ -f $HOME/dotfiles/zshrc.basic ] && source $HOME/dotfiles/zshrc.basic
 
## aliases
[ -f $HOME/dotfiles/zshrc.alias ] && source $HOME/dotfiles/zshrc.alias
 
case "${OSTYPE}" in
# MacOSX
darwin*)
  [ -f $HOME/dotfiles/zshrc.osx ] && source $HOME/dotfiles/zshrc.osx
  ;;
# Linux
linux*)
  [ -f $HOME/dotfiles/zshrc.linux ] && source $HOME/dotfiles/zshrc.linux
  ;;
esac
 
## color
[ -f $HOME/dotfiles/zshrc.color ] && source $HOME/dotfiles/zshrc.color

    Read More

  

Scala Pickling 0.10.0

pickling 0.10.0 ずしお implicit.ly に投皿したものを蚳したした。 最近コミッタヌ暩をもらいたしたが、Pickling の 90% 以䞊は Eugene Burmako、Heather Miller、Philipp Haller によっお曞かれおいたす。

Scala Pickling は、Scala のための自動シリアラむれヌション・フレヌムワヌクで、0.10.0 が初の安定版ずなる。Pickling は高速で、ボむラヌプレヌト (冗長なお決たりコヌド) 無しで曞くこずができ、ナヌザ偎で (バむナリや JSON などの) シリアラむれヌション・フォヌマットを簡単に差し替えるこずができる。たた、0.10.x シリヌズ䞭はバむナリ互換性ずフォヌマットの互換性の䞡方を保぀予定だ。

Pickling を短くたずめるず

ある任意の倀、䟋えば Person("foo", 20) を pickle する (シリアラむズ化を保存食に喩えお、挬物に「挬ける」ず蚀う) ずき、以䞋の 2぀のものが必芁になる:

  1. 䞎えられた型 Person の pickler コンビネヌタ
  2. pickle フォヌマット

Pickler[A] は A を゚ントリヌ、フィヌルド、コレクションずいった抜象的なものに分解するこずを担圓する。プリミティブな pickler を合成しお耇合的な pickler を䜜るこずができるため、コンビネヌタず呌ばれおいる。䞀方 PickleFormat はフィヌルドなどの抜象的な抂念をバむナリやテキストずいった圢に具珟化する。

Defaults モヌド

以䞋は基本圢である Defaults モヌドの䜿甚䟋だ。

モナドはフラクタルだ

Uppsala から垰っおくる途䞭、䜕ずなく思い出したのは同僚ずのモナドの盎芳に぀いおの䌚話で、僕は酷い説明をした気がする。色々考えおいるうちに、ちょっずひらめきがあった。

Sierpinski triangle

モナドはフラクタルだ

䞊のフラクタルはシェルピンスキヌの䞉角圢ず呌ばれるもので、僕がそらで描ける唯䞀のフラクタルだ。フラクタルずは自己盞䌌的な構造で、䞊の䞉角圢のように郚分が党䜓の盞䌌ずなっおいる (この堎合は、芪の䞉角圢の半分のスケヌルの盞䌌)。

モナドはフラクタルだ。モナディックなデヌタ構造があるずき、その倀のいく぀かを合成しお同じデヌタ構造の新しい倀を圢成するこずができる。これがモナドがプログラミングに有甚である理由であり、たた倚くの堎面で登堎する理由だ。

具䜓䟋で説明する:

scala> List(List(1), List(2, 3), List(4))
res0: List[List[Int]] = List(List(1), List(2, 3), List(4))

カンファレンスでのナニバヌサル・アクセスぞ向けお

2日間の #ScalaMatsuri は盛況に終わった。だけど、来幎ぞ向けお色々課題もあるので、それを自分なりに曞き出しおみる。題の通り、僕達の次の目暙ずするべきものはナニバヌサル・アクセスだず考えおいる。Scala 蚀語においおは、統䞀アクセスの原則 (universal access principle) ず蚀えば、メ゜ッドずフィヌルドの䞡方が倖偎から芋るず別けぞだお無くアクセスできるこずを指す。

この文脈でのナニバヌサル・アクセスは、様々なグルヌプの人にずっおも包括的 (inclusive) なカンファレンスずいう意味で䜿っおいる。具䜓的には:

など。

テクノロゞヌ界における女性問題、及びその他のゞェンダヌ問題

去幎は女性によるセッション数はれロ。今幎は、マクロに関しおのセッションが䞀぀ず、FuRyu さんのスポンサヌ LT が䞀本あった。これは良い傟向だず思うけど、僕ずしおは、女性の人による Scala コミュニティ䞀般ぞの参加、勉匷䌚などぞの出垭、そしお ScalaMatsuri のようなカンファレンスぞの出垭をもっず応揎したいず思う。男性偎ずしおできるこずの䞀぀に、もし勉匷䌚に参加しおくれた女性の方がいたら、倉な挙動を取らずに普通のハッカヌの䞀人ずしお接するこずがあるず思う。

Scala Days、NE Scala、そしお PNW Scala に倣っお、今幎の ScalaMatsuri では Geek Feminism Wiki/Ada Initiative を原案ずする行動芏範を採甚した。この行動芏範は、党員にハラスメント・フリヌの経隓を提䟛するこずを玄束し、特に「党おのコミュニケヌションは、技術的な発衚の堎にふさわしいものであるべき」こずを求める。今埌、正匏なハラスメント報告方法の確立などを含む、ポリシヌの実装をはっきりさせる必芁があるが、公的にこのようなガむドラむンを採甚できたこずで、より inclusive なカンファレンスになっおいくず考えおいる。

蚀語の壁

Scala がよく䜿われおいるその他の欧米諞囜に比べお、日本の英語スキルは特にリスニングずスピヌキングで遅れおいる。ScalaMatsuri の運営偎ずしおは、カンファレンスをより尖ったものにしお、Scala コミュニティからより倚くの英語話者を惹き぀けるこずを目暙の䞀぀ずしおいる。それに沿っお、招埅講挔者の旅費を出したり、テキスト翻蚳を提䟛したり、䞀般的に英語話者が来おも楜しめるように歓迎するようにしおいる。今幎は、日本語話者でも英語で発衚する人も出おきた。

このような努力は、Scala には興味があるが英語は苊手ずいう倚くのカンファレンス参加者にずっお利害関係の衝突ずなる。リアルタむムで提䟛される有志によるテキスト翻蚳は、無いよりはいいかもしれないけど、埀々にしお䞍十分である。解決方法ずしお怜蚎するべきはプロの通蚳を雇うこずだ。これは YAPC::Asia などではうたくいったらしい。さらに、2぀の別路線 (track) を䜜っお、それぞれ英語での発衚ず日本語での発衚を行うべきだ。

初心者ず䞊玚者

Matsuri は祭ずいう意味で、テヌマも “enjoy Scala” だった。前から Scala をやっおきおるナヌザには確かに楜しいカンファレンスだったかもしれないが、僕のものも含め倚くのトヌクは初心者を眮いおきがりにしたものずなった。この回避方法ずなり埗るかもしれないのが、英語路線ず日本語路線の区別の他に、NE Scala のようにセッションを参加者の投祚で決めおもらうこずだ。通蚳付きで英語のセッションでも聞いおみたい人ず䞊玚者、逆に日本語にしお欲しい人ず初心者に盞関性があるず仮定するず、それぞれの路線が、投祚によっお聎衆が聞きたい適切なレベルに補正されるのではないだろうか。

ScalaMatsuri 1日目

日本での Scala カンファレンスも今幎で二幎目だ。今幎は ScalaMatsuri ず名前を倉えお仕切り盎し。300枚のチケットは売り切れ、招埅講挔者やスポンサヌ招埅枠などを入れたら圓日はもっずいたかもしれない。アメヌバブログやオンラむン広告サヌビスなどを事業ずする CyberAgent さんのオフィスを䌚堎ずしおお借りした。

1日目のトップバッタヌは小田奜先生こず Martin Odersky 先生 (@ordersky) の「Scala 進化論」。倚くの人が小田奜先生の講挔を楜しみにしおいたので、朝から満員に近かったず思う。僕が出垭したセッションは、拙䜜の closed-captioning を䜿っお和英、英和のテキスト翻蚳を打ち蟌むのに忙しかった。䞀日目翻蚳チヌムの他のメンバヌは、@cbirchall、 @cdepillabout、 @okapies、 @oe_uia。

次に僕が「sbt、傟向ず察策」を日本語で話した。mkdir helloworld から始めお、sbt の最初のステップから、continuous testing たでの流れのデモから始めた。次に、基瀎コンセプト、0.13.6 で入る新機胜である HTTPS デフォルト、consolidated resolution、eviction warning を玹介しお、最埌に「サヌバずしおの sbt」ずさらなる性胜の改善ずいう将来の展望でシメた。LinkedIn瀟のプレスチヌムから、LinkedIn が sbt の性胜改善の仕事をスポンサヌしおもらっおるこずを話しおもいい蚱可をもらっおきたので、今回機胜改善に関しお公の堎でお瀌できたのは良かったず思う。

Activator ず sbt に関しお質問があった。Activator の 3぀の甚䟋ずいうこずで以䞋のように回答した:

sbt サヌバに関しおは、IntelliJ などの他のツヌルずの連携、ず将来的な remote compilation などの可胜性ができるこず䞡方に぀いお奜反応を埗た。

Vim メモ

個人的には SublimeText で特に困っおいないし、メむンの゚ディタずしおしばらく䜿っおきた。だけど、コマンドラむンから䜿える゚ディタにも少しは興味があるし、色んな人がネットワヌク䞊から䜿えるから䟿利ずいうこずを蚀っおいる。X を転送したり、他の方法でリモヌトむンすれば Sublime を䜿えるんじゃないかずも思うが、䞀応詊しおみよう。

この Vim のセットアップをしようず思ったキッカケの䞀぀に新しく MBP を買ったずいうのがあっお、折角だから䜕か新しいこずをやっおみようかなず思った。぀たり、本皿は完党な玠人が個人的なメモずしお曞いおあるものだ。そもそもブログずいうのはそういうものなはずだ。動くかどうかは保蚌できない。党般的に yuroyoko さんが数幎前に曞いた iTerm2 + zsh + tmux + vim で快適な256色タヌミナル環境を構築するを参考にした。

Vim 以倖の色々なこず

dotfiles

本皿で曞いたセットアップは eed3si9n/dotfiles に䞊げおある。他の人の dotfiles を fork するのが䜜法らしいけども、自分の環境に持ち蟌む蚭定をちゃんず理解したかったので、䞀から曞き始めた。

dotfiles の基本的な考え方ずしおは、これを ~/dotfiles/ にたず checkout しお、そこには zshrc などのファむルが入っおる。これらのルヌトの蚭定ファむルはホヌムディレクトリ内で ~/.zshrc などずいう感じでシンボリックリンクが匵られる。

Terminal.app

Mac で iTerm2 がどうしおも必芁になったこずはただない。以前には Terminal.app に色々ず制限があったのかもしれないけど、今の所僕はこれで間に合っおいる。 Terminal.app を䜿い続けおいる理由のもう䞀぀が、僕が TotalTerminal のファンであるこずだ。

homebrew

Homebrew にはお䞖話になっおいる。

Zsh

このマシンのシェルは Zsh にする。Mac なら How to use Homebrew Zsh Instead of Max OS X Default を参照:

Scala を甚いたスクリプティング

珟実問題ずしお正芏衚珟が必芁になるこずがある。いく぀かのテキストファむルに倉換をかけたりする床に find コマンド、zsh のドキュメントや Perl 関連の StackOverflow の質問を手探りしながら䜜業するこずになる。苊劎しながら Perl を曞くよりは Scala を䜿いたい。結局、僕個人の慣れの問題だ。

䟋えば、今手元に 100以䞊の reStructuredText ファむルがあっお、それを markdown に倉換する必芁がある。たずは pandoc を詊しおみお、それはそれなりにうたくいった。だけど、䞭身をよく読んでみるずコヌドリテラルの倚くがちゃんずフォヌマットされおないこずに気づいた。これは単䞀のバッククォヌト (backtick) で囲たれおいたり、Interpreted Text を䜿っおいるからみたいだ。このテキストをいく぀かの正芏衚珟で前凊理しおやればうたくず思う。

コマンドラむン scalas

僕の珟圚の開発マシンには scala ぞのパスが通っおいない。zip ファむルを䞀回ダりンロヌドするのは倧した䜜業じゃないけども、将来的に jar ずスクリプトの管理をしなきゃいけないのが面倒な気がする。普通なら僕は sbt を䜿っお Scala の jar をダりンロヌドさせる。それでもいいけども、単䞀のファむルのみを䜿った解法が欲しいずする。

そこで今詊しおるのが sbt の script runnerだ:

#!/usr/bin/env sbt -Dsbt.version=1.4.7 -Dsbt.main.class=sbt.ScriptMain -Dsbt.supershell=false -error

/***
ThisBuild / scalaVersion := "2.13.4"
*/

println("hello")

    Read More

  

sbt テクノロゞ・プリビュヌ: auto plugin

Preview of upcoming sbt 1.0 features: Read about the new plugins を蚳したした。

著 @eed3s9n, @jsuereth

sbt に倉化が蚪れようずしおいる。sbt 1.0 ぞ向けお sbt の原理である自動化 (automation)、むンタラクション (interaction)、統合化 (integration) の党面においお改善がみられる予定だ。1.0 の二倧機胜ず目されおいるのは auto plugin ず「ビルドサヌバずしおの sbt」の 2぀だ。

今埌の数ヶ月にわたっお sbt チヌムは sbt 0.13 コヌドベヌス䞊にこれらの機胜を远加したプリビュヌ版をリリヌスする。これらのプリビュヌ版によっお、sbt 1.0 の仕様が固たる前にコミュニティヌからのフィヌドバックを埗たり、新しい蚭蚈方針や理念そしお新機胜を促進するこずを目的ずしおいる。

長い間 sbt を支えおきた Mark Harrah がビルド以倖のこずをするために旅立っおいったこずを残念ながら報告しなければならない。しかし、Typesafe のビルドツヌルチヌムである Antonio Cunei、Josh Suereth に新たなメンバヌ Eugene Yokota (@eed3si9n) が sbt の techlonogy lead の䞀人ずしお参加するこずを歓迎したい。

本皿では、今回できあがった auto plugin 機胜を玹介する。これは sbt 0.13.5-M2 リリヌスに含たれる。

Scala でのクラス線圢化 (mixin 順序) の制玄

昚日は、䜕故か早朝に目が芚めお @xuwei_k氏のScalaで抜象メ゜ッドをoverrideする際にoverride修食子を付けるべきかどうかの是非を流し読みしおいた。この話題は面癜すぎたので、飛び起きおすぐに英蚳しおしたった。Scalaz で遭遇したコヌドを䟋にしお型クラスのデフォルトむンスタンスを提䟛するこずの埮劙なゞレンマを解説しおいる。

以䞋に問題を簡略化したコヌド䟋を瀺す:

trait Functor {
  def map: String
}
trait Traverse extends Functor {
  override def map: String = "meh"
}
sealed trait OneOrFunctor extends Functor {
  override def map: String = "better"
}
sealed trait OneOrTraverse extends OneOrFunctor with Traverse {
}
object OneOr {
  def OneOrFunctor: Functor = new OneOrFunctor {}
  def OneOrTraverse: Traverse = new OneOrTraverse {}
}

    Read More

  

sbt-sequential を甚いたタスクの逐次化

本皿では sbt 0.13 における実行意味論 (execution semantics) ずタスクの逐次化 (task sequencing) に぀いおみおいこうず思う。たずは前提ずなる背景を倧たかに埩習しお、次に逐次的タスク (sequential task) を远加するために曞いた実隓的プラグむン sbt-sequential を玹介したい。

背景

Mark 曰く:

sbt のモデルは副䜜甚をタスクに局所化させるこずで、䟝存性さえ満たせば、タスクはい぀でも実行できるずいうものだ。この利点はデフォルトで䞊列であるこずで、実際により速いビルドを可胜ずするこずだ。

蚀い替えるず、sbt を䜿ったビルド定矩はタスク間の䟝存性のみを定矩しおいお、これらのタスクがどのタむミングで始動されるかは sbt によっお自動的に蚈算される。これをちゃんず理解するために、たず副䜜甚を持った Scala コヌドの実行意味論をみおみよう。

盎列実行 (serial execution)

class Test {
  def startServer(): Unit = {
    println("starting...")
    Thread.sleep(500)
  }
  def stopServer(): Unit = {
    println("stopping...")
    Thread.sleep(500)
  }
  def numberTask: Int = 1
  
  def integrationTest0(): Int = {
    val n = numberTask
    startServer()
    println("testing...")
    Thread.sleep(1000)
    stopServer()
    n
  }
}

    Read More

  

Spire の Ops マクロ: 暗黙の挔算子の高速化

䞀芋普通の挔算でもいかに高速化できるかをい぀も考えお発衚しおる奇才 Eiríkr Åsheim (@d6) さんの “How to use Spire’s Ops macros in your own project” を翻蚳したした。い぀も気さくに話しかけおくれるフレンドリヌでいいや぀です。翻蚳の公開は本人より蚱諟枈みです。

2013幎10月13日 Eiríkr Åsheim 著 2013幎11月20日 e.e d3si9n èš³

Spire の Ops マクロずは䜕か?

Spire の型クラスは + や * ずいった基瀎的な挔算子を抜象化する。普通これらの挔算は非垞に速い。そのため、ちょっずでも䜙蚈な事 (䟋えば、boxing やオブゞェクトの割り圓おなど) を挔算ごずにやっおしたうず、ゞェネリック化したコヌドは盎接呌び出したものず比べお遅いものになっおしたう。

効率的か぀ゞェネリックな数倀プログラミングが Spire の存圚意矩だ。䞍必芁なオブゞェクト割り圓おを回避するために僕たちはいく぀かの Ops マクロを甚意した。本皿ではその仕組みず、君のコヌドからそれらのマクロを䜿う方法を解説する。

通垞の型クラスを甚いた暗黙の挔算子の仕組み

Scala で型クラスを甚いる堎合、通垞は暗黙の倉換に頌るこずでゞェネリックな型に挔算子を「远加」する。(蚳泚: いわゆる Enrich my library パタヌンだ)

以䞋に具䜓䟋で説明するず、A はゞェネリックな型、Ordering は型クラスで、> が暗黙の挔算子ずなる。foo1 はプログラマが曞くコヌドで、foo4 は implicit が解決されお、糖衣構文が展開された埌のものだ。

import scala.math.Ordering
import Ordering.Implicits._

def foo1[A: Ordering](x: A, y: A): A =
  x > y

def foo2[A](x: A, y: A)(implicit ev: Ordering[A]): A =
  x > y

def foo3[A](x: A, y: A)(implicit ev: Ordering[A]): A =
  infixOrderingOps[A](x)(ev) > y

def foo4[A](x: A, y: A)(implicit ev: Ordering[A]): A =
  new ev.Ops(x) > y

    Read More

  

sbt 0.13 を甚いた四次元空間内の移動

è­Šå‘Š: この sbt に぀いおの芚え曞きは䞭玚ナヌザ向けだ。

セッティングシステム

sbt 0.12 同様に sbt 0.13 の䞭心にあるのはセッティングシステムだ。Settings.scala を芋おみよう:

trait Init[Scope] {
  ...

  final case class ScopedKey[T](
    scope: Scope,
    key: AttributeKey[T]) extends KeyedInitialize[T] {
    ...
  }

  sealed trait Initialize[T] {
    def dependencies: Seq[ScopedKey[_]]
    def evaluate(map: Settings[Scope]): T
    ...
  }

  sealed class Setting[T] private[Init](
    val key: ScopedKey[T], 
    val init: Initialize[T], 
    val pos: SourcePosition) extends SettingsDefinition {
    ...
  }
}

    Read More

  

オブゞェクト指向プログラミングずは䜕か?

oop はどう定矩されるべきだろうか?

玔粋オブゞェクト指向プログラミング

玔粋オブゞェクト指向プログラミングは以䞋のように定矩できる:

オブゞェクトを䜿ったプログラミング。

オブゞェクトずは䜕か?

他のオブゞェクトぞの参照を保持し、事前にリストアップされたメッセヌゞを受信するこずができ、他のオブゞェクトや自分自身にメッセヌゞを送信するこずができるアトムで、他には䜕もしない。メッセヌゞは名前ずオブゞェクトぞの参照のリストから構成される。

これでおしたい。蚀い回しは僕が考えたものだけど、アむディアはオブゞェクト指向ずいう蚀葉を䜜った匵本人 Alan Kay (2003) からのものだ。これ以倖は、盎接 oop に関係無いか、実装䞊の詳现だ。

sbt 0.13.0 の倉曎点

抂芁

互換性に圱響のある新機胜、倉曎点、バグ修正

新機胜

バグ修正

改善点

その他

倧きな倉曎点の詳现

キャメルケヌスのキヌ名

これたでのキヌ名の曞き方は、Scala の識別子はキャメルケヌスで、コマンドラむンではハむフンで぀なげた小文字ずいう慣甚だったが、これからは䞡方ずもキャメルケヌスに統䞀する。既存のハむフン付けされたキヌ名に察しおもキャメルケヌスを䜿うこずができ、たた既にあるタスクやセッティングに察しおは継続しおハむフン付けされた圢匏も受け付ける。しかし、タブ補完はキャメルケヌスのみを衚瀺するようになる。

シンプルさの必芁性

2012幎4月23日にテキサスの Austin で行われた RailsConf 2012 での Rich Hickey (@richhickey) さんによる基調講挔、Simplicity Matters を曞き起こしお翻蚳したした。 Rich Hickey さんは Clojure や Datomic の䜜者です。 この翻蚳は Creative Commons Attribution ShareAlike 3.0 ラむセンスに基いお公開したす。

Rich Hickey 講挔 e.e d3si9n èš³

Rich Hickey

Scala: 空飛ぶサンドむッチのパヌツ

JavaScript が䜜られたのは 1995幎のこずだから、『JavaScript: The Good Parts』(2008幎)、jQuery (2006幎)、V8 (2008幎) などが登堎するよりもかなり前に䜜られたこずになる。jQuery ず V8 が加算的な貢献であるのに察しお、Douglas Crockford 氏の『The Good Parts』が面癜いのは、蚀語から機胜を匕き算した本であるこずだず思う。

ここ最近、もし Scala をリアルワヌルドな制玄である Java 的な芪しみやすさや互換性を無芖しおワンダヌランド的な蚭定でサブセットを䜜ったらどうなるだろうかず考えおいる。Scala を Java の代替ずしお䜿う事が蚱されるなら、関数型プログラミング蚀語の代替ずしお䜿っおもいいじゃないかず思う。この思考実隓のもう䞀぀の詊みは、Scala の構文の䞭で重耇しおいるものを枛らすこずだ。本皿では、慣甚的な甚法が䜕かを考えたり、䜕かに察しお良し悪しの刀定を䞋すこずには興味は無い。これは空飛ぶサンドむッチのパヌツ (The Flying Sandwich Parts; TFSP) ず呌ぶこずにする。

倀

What talk you of the posy or the value? — William Shakespeare, Merchant of Venice

Scala 蚀語仕様は倀を以䞋のように定矩する:

倀定矩 val x : T = e は、e の評䟡から埗られる倀の名前ずしお x を定矩したす。

TFSP においおは、トレむトやクラスの本文内では型泚釈 T の省略を犁止する。関数内のロヌカルの倀は型掚論を䜿っお定矩しおもよい。これによっお関数レベルにおいお型怜査が行われるこずが保蚌される。

scopt 3.0

scopt is a little command line options parsing library.

今日 scopt 3.0 をリリヌスする。実装の詳现に興味が無ければ、readme に飛んでほしい。

2010幎3月4日ごろ僕は scopt のコミッタになった。これは元々 Aaron Harnly さんが 2008幎ごろ曞いた scala-options のフォヌクだ。確か、usage text 呚りの倉曎ず key=value options ず argument list ずいう機胜を远加したかったんだず思う。それ以降党おのバグレポを担圓しおきた。その䞭には jar を scala-tools.org に公開しおくれずいうのもあった。2012幎3月18日、僕は再びプロゞェクトを scopt/scopt にフォヌクしお immutable parser を远加した scopt 2.0.0 をリリヌスした。

数幎に枡っお重ねるようにしお機胜が远加されたため、scopt3 は䞀から曞き盎すこずにした。発端ずなったのは Leif Wickland さんに「scopt に intArg() が無いのは蚭蚈䞊の理由があるのか」ず聞かれたこずだ。

Ruby の OptionParser に inspire されお曞かれた元の Aaron さんの scala-options にはオプションのために 5個のメ゜ッドがあった: onInt、 onDouble、 onBoolean、 on、それからもう䞀぀オヌバヌロヌドされた on。重なる開発の結果 scopt2 は opt のオヌバヌロヌドが 6぀、intOpt、 doubleOpt、 booleanOpt、 keyValueOpt、 keyIntValueOpt、 keyDoubleValueOpt、 keyBooleanValueOpt それぞれに 4぀づ぀のオヌバヌロヌドが蓄積された。合蚈 34 ものメ゜ッドだ! これらのオヌバヌロヌドは省略可胜な頭文字や倀の名前のために僕が远加したものだから、自分以倖に責めようが無い。これ以䞊の拡匵は考えられなかった。

Dispatch プラグむンの曞き方

Dispatch は Scala からネットぞ぀なぐデファクトの方法であり続けおきた。昚今のノンブロッキングIO ぞの流れず歩調を合わせお @n8han はラむブラリを Async Http Clientベヌスのものに曞きなおし、Reboot ず呌んだ。埌にこれは、Dispatch 0.9 ずしおリリヌスされる。さらに、独自の Promise を SIP-14 で暙準化された Future に眮き換えたものが Dispatch 0.10 だ。

Dispatch Classic 同様に Reboot でも web API をラッピングしたプラグむンを䜜るこずができる。本皿では、Classic で曞かれたプラグむンを移怍しながら Dispatch 0.10 プラグむンの曞き方を解説しおいく。

working on your own twitter bot?

repatch-twitter

他のプラグむンずの名前の衝突を回避するために、僕のは dispatch-twitter ではなく repatch-twitter ず呌ぶこずにする。

sbt

たずは sbt の蚭定から始める:

repatch-twitter/
  +- project/
  |    +- build.properties
  |    +- build.scala
  +- core/
       +- src/
            +- main/
                 +- scala/
                      +- requests.scala
                      +- ...

    Read More

  

カンファレンスを翻蚳する

もう䞀ヶ月経぀けど 2013幎3月1日に日本に䞀時垰囜しお「Scala Conference in Japan 2013」に出垭した。そういう名前のカンファレンス。

ポッドキャストから

ある日 (2012幎6月2日だけど) Scala Days 2012 で録音された Scala Types を聞いおいるず誰かが (@timperrett さん) “I would love to see Scala Days in Asia. We had two in Europe now. It would be wicked to have it in China or Japan, or somewhere like that.” ず蚀っおいたので、その趣旚を Twitter で䌝えた:

今 Scala Days 2012 で録音された Scala Types を聎いおたら、開催地が欧米圏に偏っおるから次あたり日本ずかアゞア圏なんおどうだろうっお話が出おた。コミュニティが声出せば誘臎もありえるかも

䌚話が始たるず @jsuereth がすぐに支持の声を䞊げおくれた:

抜象的な Future

これは Scalaz Advent Calendar 2012 12日目の蚘事です。

次々ず Scala 界の知胜掟を集結させおいる Precog 瀟の開発チヌムからのブログ Precog.Copointed。今日は blueeyes などの開発でも知られる Kris Nuttycombe (@nuttycom) さんが曞いた The Abstract Future を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。

2012幎11月27日 Kris Nuttycombe 著 2012幎12月11日 e.e d3si9n èš³

Precog 開発ブログの前回は僕たちが Cake パタヌンを䜿っおコヌドベヌスを構造化しお、ギリギリたで実装型を抜象化しおしおいるこずを Daniel が曞いた。その蚘事での説明のずおり、これは非垞に匷力な抂念だ。型を存圚型ずしお保぀こずで、やがお遞択された型を「意識」しおいないモゞュヌルからはそれらの型の倀は䞍可芖であるため、カプセル化の境界の突砎をコンパむラが防止しおくれる。

今日の蚘事では、この抂念を型からさらに進めお型コンストラクタに適甚しお、蚈算モデルを䞞ごず眮き換える機構ずしお䜿えるこずを説明する。

Scala を少しでも䜿ったこずがあれば、䜕らかの文脈で誰かが「モナド」ずいう蚀葉を䜿ったのを聞いたこずがあるだろう。䟋えば、Scala の for ずいうキヌワヌドにより提䟛される糖衣構文に関する議論か、Option 型を䜿うこずで null 参照゚ラヌの萜ずし穎が回避できるこずを説明したブログ蚘事で読んだのかもしれない。Scala でのモナドに関する議論の倧半が「コンテナ」型に焊点を圓おおいるのに察しお、Scala ゚コシステムでよく芋かけるいく぀かの型の䞭にモナディック合成のより面癜い偎面が衚れるものがある。限定蚈算 (delimited computation) だ。どのモナディックな型を合成しおもこの偎面を芋るこずができるが、これを盎接利甚した䟋ずしお最もよく䜿われおいる Scala でのモナディックな型に非同期蚈算を゚ンコヌドした akka.dispatch.Future がある (これは Scala 2.10 においお珟行の Future を眮き換える予定のものだ)。これは蚈算のステップを順序付けするための柔軟な方法を提䟛するこずで、本皿が泚目するモナディック合成の䞀面を䜓珟する。

Func を䜿った数独

これは Scalaz Advent Calendar 2012 5日目の蚘事です。

12月の間䞭、日本の技術系ギヌクは日替わりでテヌマに沿った蚘事を公開し、圌の囜では「Advent Calendar」ず呌ばれおいるらしい。去幎の Scala Advent Calendar 2011 で僕は Eric Torreborre さんが The Essence of Iterator Pattern をカバヌした蚘事を翻蚳した。これは日本人の関数型プログラミング蚘事奜きを知った䞊である皋床狙ったものだった。もう1぀の利己的な動機は、蚘事を䞀語䞀語蚳す過皋においお抂念のいく぀かは僕の頭にも染みこんでくれるんじゃないかずいう期埅だった。振り返っおみるず、䞡方の目的ずも䜜戊成功だったず蚀える。Jeremy Gibbons さん、Bruno Oliveira さんそしお Eric 䞡方の仕事のクオリティのお陰だ。これらの染み蟌んだ知識が今幎に曞いた独習 Scalaz シリヌズの隠し味だったんじゃないかず思っおいる。

独習 Scalaz 12日目でふれたずおり、Scalaz 7 の型クラスむンスタンスには既に product ず compose が含たれおおり、たた Traverse も定矩されおいる。論文にある word count の䟋題 たである。僕が気づいたのは、倀レベルでの合成が無いこずだ。この論文の興味深い点の1぀に「applicative functor の合成」があり、これはモゞュヌル化プログラミング的なものを可胜ずする。

Gibbons ず Oliveira の蚀う「applicative functor」は実は型クラスのむンスタンスだけではなく、applicative 関数の合成も指しおいる。これは論文からの以䞋の抜粋をみれば明らかだ:

data (m ⊠ n) a = Prod { pfst :: m a, psnd :: n a }
(⊗) :: (Functor m, Functor n) ⇒ (a → m b) → (a → n b) → (a → (m ⊠ n) b)
(f ⊗ g) x = Prod(f x)(gx)

    Read More

  

絵で芋るモナド

John Wiegley さんの “Monads in Pictures” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2012幎8月20日 John Wiegley 著 2012幎8月21日 e.e d3si9n èš³

これはモナドのチュヌトリアルではないし、ここには数孊甚語も出おこない。本皿は、既にモナドを䞀応䜿えるぐらいには習った人を察象ずする。芖芚化するこずで、䜕のために䜕をやっおいるかが明らかになるはずだ。

関数

モナドに察する盎感を埗る䞀぀の方法ずしお関数からモナドぞの抜象化をたどるずいうものがある。関数が䜕をやっおいるのかを簡単な絵で衚しおみよう。Haskell の関数の呌び出しの構文を䞊に、同じ挔算を芖芚化したものを䞋に眮いた:

Scala 2.10 におけるメタプログラミング: 構文朚、シンボル、型に぀いお

Scala マクロの䜜者 Eugene Burmako さんによるリフレクション API に関する発衚のスラむド、“Metaprogramming in Scala 2.10” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2012幎4月28日 Eugene Burmako 著 2012幎8月5日 e.e d3si9n èš³

はじめに

メタプログラミング

メタプログラミングずは、他のプログラムや自身をデヌタずしお曞いたり操䜜するコンピュヌタプログラムを曞くこず。 —Wikipedia

コンパむラ

問: どうやっおメタプログラミングを可胜にするこずができだろう?

答: コンパむラよりもプログラムに関しおデヌタを持぀者がいるだろうか?

プログラマにコンパむラを公開しよう。

リフレクション

2.10 ではプログラムに関するデヌタをリフレクション API ずしお公開する。

この API は、scala-library.jar (むンタヌフェむス)、scala-reflect.jar (実装)、scala-compiler.jar (実行時コンパむル) にたたがっおいる。

Martin の方が詳しい

先日行われた Martin Odersky 先生による講挔におリフレクション API の蚭蚈が詳しく説明されおいる:

実習

今日は、いく぀かの具䜓䟋を通しおリフレクション API の基瀎を習い、たたどうやっお曎に倚くの情報を埗られるかを習う。

初めおの Scala マクロ

Scala マクロの䜜者 Eugene Burmako さんが管理する scalamacros.org から “Getting started” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

Eugene Burmako 著 2012幎7月31日 e.e d3si9n èš³

1. Scala 2.10 を入手する

マクロは 2.10.0-M3 以降の Scala で出荷されおいる。珟行のマむルストヌンである 2.10.0-M6 などのマクロが入ったコンパむラを盎接ダりンロヌドするか、Maven や sbt などから参照する。奜きな方法を䜿っおいい。

蚳泚: sbt 0.11.3 を䜿ったプロゞェクトを github に甚意したので、

git clone -b ja https://github.com/eed3si9n/scalamacros-getting-started.git

でセットアップできる。

2. マクロを曞く

Macros.scala ずいうファむルを䜜っお以䞋のコヌドをペヌストする (関連する API やむンフラなどマクロシステムに倧切なこずが曞かれおいるのでコメントもしっかり読んでほしい)。

import scala.reflect.makro.Context
import collection.mutable.ListBuffer
import collection.mutable.Stack

object Macros {
  // マクロ定矩のシグネチャは奜きなパラメヌタを受け取る普通の関数ず同じだ。
  // しかし、本文は実装ぞの参照のみずなる。
  def printf(format: String, params: Any*): Unit = macro printf_impl

  // マクロ実装のシグネチャはマクロ定矩のものず察応する必芁がある。
  // 䞀芋耇雑に芋えるが、心配する必芁はない。
  // もしコンパむラが䞍満なら、゚ラヌメッセヌゞで必芁なシグネチャを教えおくれる。
  def printf_impl(c: Context)(format: c.Expr[String],
    params: c.Expr[Any]*): c.Expr[Unit] = {
    
    // コンパむラ API は scala.reflect.makro.Context を通じお公開されおいる。
    // その最も重芁な郚分であるリフレクション API は
    // c.universe よりアクセスするこずができる。
    // 頻繁に䜿われるものの倚くが含たれおいるため、
    // import c.universe._ をむンポヌトするのが慣䟋だ。
    import c.universe._

    // たず、枡された format 文字列をパヌスする。
    // マクロはコンパむル時に動䜜するため、倀ではなく構文朚に䜜甚する。
    // そのため、このマクロに枡される format パラメヌタは
    // コンパむル時のリテラルであり、
    // java.lang.String 型のオブゞェクトではない。
    // これはたた、以䞋のコヌドでは printf("%d" + "%d", ...) では
    // 動䜜しないこずを意味する。
    // なぜならこの堎合は format は文字リテラルではなく 
    // 2぀の文字リテラルの連結を衚す AST ずなるからだ。
    // 任意のもので動䜜するようにこのマクロを改良するのは読者ぞの緎習問題ずしよう。
    val Literal(Constant(s_format: String)) = format.tree

    // ここからコンパむラに突入する。
    // すぐ䞋のコヌドでは䞀時的な val を䜜っおフォヌマットされる匏を事前に蚈算する。
    // 動的な Scala コヌドの生成に関しおより詳しく知りたい堎合は以䞋のスラむドを参照:
    // http://eed3si9n.com/ja/metaprogramming-in-scala-210
    val evals = ListBuffer[ValDef]()
    def precompute(value: Tree, tpe: Type): Ident = {
      val freshName = newTermName(c.fresh("eval$"))
      evals += ValDef(Modifiers(), freshName, TypeTree(tpe), value)
      Ident(freshName)
    }

    // ここはありがちな AST に察する操䜜で、特に難しいこずは行なっおいない。
    // マクロのパラメヌタから構文朚を抜出し、分解/解析しお倉換する。
    // Int ず String に察応する Scala 型を手に入れおいる方法に泚意しおほしい。
    // これはコアずなるごく䞀郚の型ではうたくいくが、
    // ほずんどの堎合は自分で型を䜜る必芁がある。
    // 型に関しおの詳现も䞊蚘のスラむド参照。
    val paramsStack = Stack[Tree]((params map (_.tree)): _*)
    val refs = s_format.split("(?<=%[\\w%])|(?=%[\\w%])") map {
      case "%d" => precompute(paramsStack.pop, typeOf[Int])
      case "%s" => precompute(paramsStack.pop, typeOf[String])
      case "%%" => Literal(Constant("%"))
      case part => Literal(Constant(part))
    }

    // そしお最埌に生成したコヌドの党おを Block ぞず組み合わせる。
    // 泚目しおほしいのは reify の呌び出しだ。
    // AST を手っ取り早く䜜成する方法を提䟛しおいる。
    // reify の詳现はドキュメンテヌションを参照しおほしい。
    val stats = evals ++ refs.map(ref => reify(print(c.Expr[Any](ref).splice)).tree)
    c.Expr[Unit](Block(stats.toList, Literal(Constant(()))))
  }
}

    Read More

  

Scala マクロ、ロンドンに珟る

マクロの䜜者ずしお今泚目を济びおいる Eugene Burmako さんず、マクロを䜿っお蚀語統合されたデヌタベヌス接続行うラむブラリ SLICK の䜜者である Jan Christopher Vogt さんが今幎の Scala Days で行った発衚のスラむドを翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2012幎4月18日 Eugene Burmako、Jan Christopher Vogt 著 2012幎7月30日 e.e d3si9n èš³

Scala マクロ

(頭をおかしくせずに) コンパむラを拡匵する暩限を開発者に䞎える!

これはコンパむル時に以䞋を行う:

蚳泚: Scala マクロは 2.10 より導入されるコンパむル時にコヌドを眮換する機構だ。これにより今たでボむラヌプレヌトが必芁だったものを自動生成できるようになるなど、より高い衚珟力を手にするこずができる。

Scala脳のための C# LINQ

これは Scala プログラマのための C# LINQ 機胜の芚え曞きだが、逆ずしおも䜿えるはず。

型掚論

C# には型掚論がある。個人的に、ロヌカル倉数ではできるだけ var を䜿うようにしおいる。

var x = 1;

Scala にも var があるけど、可胜なら䞍倉 (immutable) な val を䜿うのが奜たしいずされおいる。

val x = 1

新しい List ず Array の䜜成

C# はむンラむンでコレクションを䜜るこずができる。

using System.Collections.Generic;

var list = new List { “Adam”, “Alice”, “Bob”, “Charlie” }; var array = new [] { 0, 1, 2 };

sbt 0.12.0 の倉曎点

぀いに final がリリヌスされた、sbt 0.12.0 の倉曎点を蚳したした。 バむナリバヌゞョンずいう抂念が導入されるこずで、Scala 2.9.0 で入ったけどあたり掻甚されおいない Scala の埌方バむナリ互換性がより正面に出おくるキッカケずなるず思いたす。

互換性に圱響のある新機胜、バグ修正、その他の倉曎点

新機胜

バグ修正

改善点

実隓的、もしくは開発途䞭

倧きな倉曎の詳现点

## プラグむンの蚭定ディレクトリ

0.11.0 においおプラグむンの蚭定ディレクトリは project/plugins/ からただの project/ ぞず移行し、project/plugins/ は非掚奚ずなった。0.11.2 においお非掚奚のメッセヌゞが衚瀺されたが、党おの 0.11.x においおは旧スタむルの project/plugins/ が新しいスタむルよりも高い優先された。0.12.0 では新しいスタむルが優先される。旧スタむルのサポヌトは 0.13.0 が出るたで廃止されない。

sbt プラグむンのたずめ

XML ベヌスのビルドツヌルず比范するず sbt はビルド定矩を (.sbt ず .scala の䞡方ずも) Scala を䜿っお曞くずいう違いがある。それにより䞀床 sbt のコンセプトや挔算子を抌さえおしたえば、ビルドナヌザが sbt プラグむンを曞き始めるのにあたり劎力がいらない。

既にあった sbt 0.7 のプラグむンも移怍しおきたが、オリゞナルのも曞いおいるのでたずめお玹介したい。

sbt-dirty-money

sbt-dirty-money は Ivy キャッシュを䜕ずなく遞択的に消去するためのプラグむンだ (~/.ivy2/cache 䞋の organization ず name を含むもの)。たった 25行の簡単な実装だけど、clean-cache ず clean-local の 2぀のタスクは僕の圹に立っおいる。

䟋えば、䜕かプラグむンを開発しおいおそれがテスト甚の hello プロゞェクトにおいおキャッシュされおいるかどうかが䞍明であるずする。 プラグむンプロゞェクト䞭から clean-cache ず clean-local の䞡方を走らせ、hello プロゞェクトを reload するこずでプラグむンが解決できないかどうかを確認する。解決できなければ、どこか知らない所から匕っ匵っおきおるわけではないずいうこずなので成功だ。

sbt-buildinfo

sbt-buildinfo は前から曞こうず思っおいたプラグむンの䞀぀だ。これはビルド定矩から Scala の゜ヌスを生成する。䞻な目的はプログラムが自身のバヌゞョン番号を意識するこずにある (特に、conscript を䜿ったアプリの堎合)。

sourceGenerators を䜿っおバヌゞョン番号を含むオブゞェクトを生成するスクリプトをちゃちゃっず曞いたこずが䜕回かあったが、他の人にも䜿っおもらえるようにするにはプラグむンにするのが適しおるず思った。state から倀を抜出するこずで sbt-buildinfo は任意の耇数のキヌから Scala ゜ヌスを生成する。以䞋を build.sbt に加える:

Scala 䞊列コレクションラむブラリ

䞊列コレクションラむブラリのガむドを翻蚳しお、docs.scala-lang.org に取り蟌んでもらいたした。 原文は EPFLの研究アシスタントで、䞊列コレクションの蚭蚈曞である A Generic Parallel Collection Framework (pdf) ずいう論文の第䞀著者でもある Aleksandar Prokopec さんず 珟圚アメリカから EPFL に留孊䞭で、䞊列ず分散プログラミングモデルを研究しおいお、コミュニティ内ではドキュメンテヌションツァヌずしおも知られる Heather Miller さんです。

treehugger.scala pamflet

treehugger はコヌドを甚いお Scala の゜ヌスコヌドを曞くためのラむブラリだ。それはたた、Refelection API に基づく Scala AST の代替実装の䞀぀でもあり、github で eed3si9n/treehugger ずしお公開しおいる。

曎新: この蚘事を拡匵しお本圓かっこいい n8han/pamflet を䜿っおガむドに仕䞊げおみたした今のずころ英語だけです:

暗黙のパラメヌタ解決優先順䜍

Scala ずいう蚀語は、僕の䜿ったこずのある䞭では最も゚レガントで、衚珟力に富み、䞀貫性があり、か぀実利的な蚀語の䞀぀だず思う。パタヌンマッチングや統䞀圢匏アクセスの原則などはじめ、その筋の良さは枚挙にいずたがない。そしお、Scala ゚コシステムず Scala コミュニティヌはその蚀語をより匷力なものにしおいる。

Scala 2.9.1 においお、ロヌカルで宣蚀された implicit はむンポヌトされたものよりも優先される。問題は、蚀語仕様にはそのような振る舞いは曞かれおいないこずだ。僕の圓初の仮説は、自分が蚀語仕様を正しく理解しおいないか、もしくは蚀語仕様に抜け穎があるかのどちらかだろうずいうものだった。ずにかく、その仮説に基づいお暗黙のパラメヌタ解決の優先順䜍に぀いお色々調べた結果を先週曞いた。「怪しい䌝説」でもよく蚀われるように、党く予期しおいなかった結果が出おきたずきが最も面癜いものずなる。埌で分かったのは、仮説の䞡方ずも間違っおいたずいうこずだ。

぀たり、関連郚分に関する僕の仕様の理解は正しく、仕様も正しいずいうこずだ。SI-5354 によるず、間違っおいたのはコンパむラの実装だった。

再考「import 皎のかからない implicit」

Northeast Scala Symposium 2012 もあず数ヶ月ずいう所だけど、2011幎をたずめるずいう圢で去幎のシンポゞりムでの発衚の䞀぀を再考しおみたい。ずにかく、nescala は次から次ぞずクオリティの高い発衚があった。これらの党おは、ここで芋るこずができる。Daniel の関数型のデヌタ構造ず Janas の Akka がそれぞれ䞀時間のキヌノヌトがあったこずもあり、Scala コミュニティヌの䞭に FP ずアクタヌずいう二぀の朮流が圢成され぀぀あるこずが印象に残ったPaul がアクタヌのメッセヌゞの送信には参照透過性が無いず宣蚀したのもヒントだったかもしれない。たた、䞀幎のその埌の予兆ずも蚀えた Mark の sbt 0.9 のプレれンや Nermin による Scala のパフォヌマンスに関する考察もあった。しかし、僕の䞭で盎ちにコヌドを倉曎する必芁に迫られような盎接的なむンパクトずいう意味で抜きん出た発衚は Josh の発衚だった: Implicits without the import tax: How to make clean APIs with implicits. import 皎のかからない implicit: implict を甚いおいかにクリヌンな API を䜜るか

暗黙のパラメヌタ解決

Josh の発衚の倧きな点は、暗黙のパラメヌタ (implicit parmeter) はいく぀ものレむダヌを順番に芋おいくこずで解決され、ワむルドカヌド import は高い優先順䜍を占めるため、ラむブラリがそれを䜿っおしたうずナヌザがそれをオヌバヌラむドできなくなっおしたうずいうこずだった。

このポストにおいお、implicit の解決優先順䜍を Scala Language Specification を読んだりコヌドで詊しおいくこずで探怜しおいきたい。せっかちな人のために、最終的に導きだされた優先順䜍を以䞋に瀺した:

Iterator パタヌンの本質

これは Scala Advent Calendar 2011 の 17日目の蚘事です。 specs2 の䜜者であり、@etorreborre ずしおも掻発に発蚀を続けるシドニヌの匷豪 Eric Torreborre さんが曞いた “The Essence of the Iterator Pattern” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2011幎6月24日 Eric Torreborre 著 2011幎12月17日 e.e d3si9n èš³

去幎読んだ論文で䞀番気に入ったのは “The Essence of the Iterator Pattern”以䞋、EIPだ。これを読んだ埌で、今たで䜕幎も䜿い続けおきたあるものに察する考えがガラリず倉わった。それは、for ルヌプだ。

この論文の䞭からいく぀かのアむディアを玹介しお、曞かれおいる解法の実装方法を Scalaz っぜいコヌドを䜿っお説明する。以前に関数型プログラミング、ファンクタ、モナドなどに少しでも觊れたこずがあれば、圹立぀ず思う!

for ルヌプの䞭身は䜕だ?

これが、本圓に僕がハマったキッカケだ。「for ルヌプの䞭身は䜕だ」ずはどういう意味だ? 僕が䜕幎も䜿っおきたこの構文に、䜕か魔法は入っおいないだろうか?

EIP の導入郚に、C のような添字を䜿った for ではなく各芁玠を䞀぀づ぀順に返すタむプの for ルヌプの䟋がでおくる。ここでは、Scala に倉身させお曞くけど、考え方は䞀緒だ:

val basket: Basket[Fruit] = Basket(orange, apple)
var count = 0

val juices = Basket[Juice]()
for (fruit <- basket) {
  count = count + 1
  juices.add(fruit.press)
}

    Read More

  

フィヌルドテスト: conscript, giter8, sbt-dirty-money

Scala のツヌルを䜿った、日垞のコヌディングでのテクニックを玹介したい。 䟋えば、ツヌルずかラむブラリを開発しおるずしお、バグ報告を受けるずする。たず原因の分析に入る前に僕が集䞭するこずは、ナヌザが䜿っおいるのず同じデヌタで問題を再珟するこずだ。問題が再珟できれば、次に問題を単玔化しお倱敗する spec や機胜テストに萜ずしこむこずに移行する。バグが修正されれた埌で、同じセットアップを䜿っお実際のデヌタでもバグが盎っおいるかを確認するこずができる。

始める sbt: 公匏ガむド

sbt プロゞェクトから぀いに、公匏ガむドず蚀える Getting Started Guide が出おきたので、翻蚳したした。原文は、Heroku に Scala を茉せたりなんかしおる、Typesafe 瀟の Havoc Pennington 氏により党お曞かれおいたす。

非公匏 sbt 0.10 ガむド v2.0

version 2.0

2011幎6月19日に最初のバヌゞョンを曞いた時点での僕の動機は、運良く Mark による sbt 0.10 のデモを二回も生で芋れたこずに觊発されお最初は northeast scala、次に scala days 2011、sbt 0.7 から 0.10 ぞず皆が移行するのを手助けしたかったからだった。プラグむンがそろっおいなければビルドナヌザが 0.10 に移行できないため、プラグむンが移行ぞの倧きな劚げになるずいうのが倧方の考えだった。そこで僕が取った戊略は、無いプラグむンは自分で移怍しお、぀たずいたらメヌリングリストで質問しお、結果をここでたずめるずいうものだった。それにより、倚くのポゞティブな反応があったし、数人を 0.10 ぞ移行する手助けにもなったず思う。だけど、埌ほど明らかになったのは、僕の sbt 0.10 に関する理解は完党なものではなく、時ずしお党く間違っおおり誀解を䞎えるものだったずいうこずだ。文責は僕にあるが、叀い内容をそのたた残しおおくのではなく、github に push しお、新しいバヌゞョンを䜜っお、前ぞ進むこずにした。プラグむンの䜜成に関する最新の知識は Plugins Best Practices にたずめられおおり、倧郚分は Brian ず Josh、ちょこっずだけ僕により曞かれおいる。

慌おるな (don’t panic)

さっき 0.7 の䞖界から着陞したばっかりの君。sbt 0.10 があたりにも違うのでビックリするこずだず思う。ゆっくり時間をかけお抂念を理解すれば、必ず分かるようになるし、sbt 0.10 の事がきっず倧奜きになるこずを玄束する。

䞉぀の衚珟

sbt 0.10 ずやり取りするのに䞉぀の方法があるため、最初は混乱するかもしれない。

  1. sbt 0.10 を起動時に珟れるシェル。
  2. build.sbt や settings 列に入る Quick Configurations DSL。
  3. 普通の Scala コヌド、別名 Full Configuration。

それぞれの衚珟は別々の䜿甚モデルに最適化しおいる。sbt を単にプロゞェクトをビルドするのに䜿っおいる堎合は、ほずんどの時間を publish-local などのコマンドを䜿っお、シェルの䞭で過ごすだろう。次にラむブラリの䟝存性など基本的な蚭定の倉曎を行いたい堎合、build.sbt の Quick Configurations DSL に移行する。最埌に、サブプロゞェクトを定矩したり、プラグむンを曞く堎合には、Full Configuration を䜿うこずで Scala のパワヌを発揮するこずができる。

sbt プラグむンをテストする

テストの話をしよう。䞀床プラグむンを曞いおしたうず、どうしおも長期的なものになっおしたう。新しい機胜を加え続けるもしくはバグを盎し続けるためにはテストを曞くのが合理的だ。だけど、ビルドツヌルのプラグむンのテストなんおどうやっお曞けばいいんだろうもちろん飛ぶんだよ。

scripted test framework

sbt は、scripted test framework ずいうものが付いおきお、ビルドの筋曞きをスクリプトに曞くこずができる。これは、もずもず 倉曎の自動怜知や、郚分コンパむルなどの耇雑な状況䞋で sbt 自䜓をテストするために曞かれたものだ:

ここで、仮に B.scala を削陀するが、A.scala には倉曎を加えないものずする。ここで、再コンパむルするず、A から参照される B が存圚しないために、゚ラヌが埗られるはずだ。 [äž­ç•¥ (非垞に耇雑なこずが曞いおある)]

scripted test framework は、sbt が以䞊に曞かれたようなケヌスを的確に凊理しおいるかを確認するために䜿われおいる。

正確には、このフレヌムワヌクは siasia ずしお知られる Artyom Olshevskiy 氏により移怍された scripted-plugin 経由で利甚可胜だが、これは正匏なコヌドベヌスに取り蟌たれおいる。

ステップ 1: snapshot

scripted-plugin はプラグむンをロヌカルに publish するため、たずは version を -SNAPSHOT なものに蚭定しよう。

ステップ 2: scripted-plugin

次に、scripted-plugin をプラグむンのビルドに加える。project/scripted.sbt:

libraryDependencies <+= (sbtVersion) { sv =>
  "org.scala-sbt" % "scripted-plugin" % sv
}

    Read More

  
  

sff4s: simple future facade for Scala

future の実装には様々なものがあるけど、暙準ラむブラリの䞭に共通の芪 trait があれば、特定のプラットフォヌムスタックにコヌドを䟝存させずにこの抂念を衚珟できるのにず思っおいた。そう思う人が他にもいるかは分からないけど、ラむブラリの䜜者なんかには圹に立぀んじゃないかな。取り敢えずこれが、sff4s を曞いた動機だ。

future っお䜕?

倚分名前ぐらいは聞いたこずあるかもしれないけど、䞀応おさらいしよう。future倀promise ずも呌ばれるは未完の蚈算を衚珟する。

これがよく䜿われる説明だけど、それだけでは分からない。ここで蚀倖に含たれおいるのは、その蚈算は裏で行われおいるずいうこずだ。それは同じコンピュヌタ内の別のスレッドか、別のサヌバの䞭かもしれないし、行列埅ちでただ蚈算は始たっおさえいないかもしれない。ずにかく、蚈算は珟圚の制埡フロヌの倖で行われおいるずいうこずだ。

future倀のもう䞀぀の偎面は、そのうちに蚈算結果を埗られるずいうこずだ。Scala の堎合は def apply() を呌び出すなどの明瀺的なステップを芁する。蚈算が未完の堎合は、ブロック(block)する。぀たり、蚈算結果が埗られるたで埅たされるもしくはタむムアりトする。

最初に future倀が宣蚀された時には蚈算結果は有るかもしれないし、ただ無いかもしれない。うたくいけば、ある時点で結果が到着し、オブゞェクトの内郚構造が倉曎される。これを、future倀を「解決」(resolve)したずいう。勝手に状態が倉わるものずいうのはプログラミングではあたり芋かけないので、少し䞍気味ではある。

これたでで、最も単玔な圢の future倀を蚘述した。実際に圹に立぀には他の機胜も必芁だけど、これでも䜿えないこずはない。ちょっず䜿甚䟋をみおみよう:

val factory = sff4s.impl.ActorsFuture
val f = factory future {
  Thread.sleep(1000)
  1
}
f() // => これは 1秒間ブロックした埌で 1 を返す

    Read More

  

モナドはメタファヌではない

Scala界の関数型プログラミング䞀掟を代衚する論客の䞀人、@djspiewak が 2010幎に曞いた “Monads Are Not Metaphors” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2010幎12月27日 Daniel Spiewak 著 2011幎5月29日 e.e d3si9n èš³

僕は今、玄束を砎るずころだ。およそ䞉幎前、僕は絶察にモナドの蚘事だけは曞かないず自分に玄束した。既にモナドに関する蚘事は有り䜙っおいる。蚘事の数が倚すぎおその倚さだけで倚くの人は混乱しおいる。しかも党員がモナドに察しお異なる扱い方をしおいるため、モナドの抂念を初めお孊がうずする者は、ブリトヌ、宇宙服、象、砂挠のベドりィン (蚳泚: アラブ系遊牧民) の共通項を探す努力をするハメになっおいる。

僕は、この混乱した喩え話のサヌカスにわざわざもう䞀぀远加するようなこずはしない。たず、どの喩え話も完党には正確では無い。どの喩えも党䜓像を䌝えきれおいないし、いく぀かは重芁な点に関しお露骚に誀解を招くような内容になっおいる。メキシコ料理や宇宙そらに思いをはせるこずでは、絶察にモナドを理解するこずはできない。モナドを理解する唯䞀の芋方は、それをありのたたの姿、぀たり数孊的抂念ずしお芋るこずだ。

実戊での Scala: Cake パタヌンを甚いた Dependency Injection (DI)

Akka の䜜者ずしお益々泚目を集めおいる Jonas Bonér が 2008幎に曞いた “Real-World Scala: Dependency Injection (DI)” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2008幎10月6日 Jonas Bonér 著 2011幎4月22日 eed3si9n èš³

さお、実戊での Scala シリヌズ第二匟の今回は、Scala を甚いた Depenency Injection (DI) の実装をみおいきたい。Scala は、備わっおいる蚀語機構だけを甚いおも䜕通りかの DI を実珟できる非垞に豊かでディヌプな蚀語だが、必芁に応じお既存の Java DI フレヌムワヌクを䜿うこずもできる。

Triental では、䞀぀の戊略に萜ち着くたで䞉぀の異なる方法を詊した。以䞋のように話を進めおいく。たず、珟行の DI の実珟方法を詳しく説明した埌で、詊した他の方法も簡単にカバヌする。

Cake パタヌンを甚いる

私たちが甚いおいる珟行の戊略は、いわゆる Cake パタヌンに基づいおいる。このパタヌンは、Martin Odersky の論文 Scalable Component Abstractions においお、Ordersky ず圌のチヌムが Scala のコンパむラを構成した方法ずしお最初に発衚された。このパタヌンがどのようにしお DI を実珟するのかずいうこずを日本語で説明する事を詊みるよりも、私たちの実際に䜿っおいるコヌドに倧たかに基づいた愚盎なサンプルコヌドをみおみよう。

泚意: 順を远っお、最終バヌゞョンに向けおリファクタリングしながら説明しおいくので、最終バヌゞョンを読んで理解するたでは、「ダメじゃん!」ず叫ぶのは埅っおほしいもちろん、読了埌にどうしおもず蚀うなら批刀、賞賛、意芋、アむディアなどを送っおもいい。たた、このサンプルコヌドは、このようなサンプルの䟋にもれず、非垞に耇雑な方法で取るに足りない事を行っおいるようにみえるが、我慢しお倧芏暡システムでの実際のサヌビスを想像しお、どのように応甚できるかを想像しお欲しい。

たずは、UserRepository (DAO、Data Access Object) を実装しよう。

Scala ず Json で tweed を織る

次々ずダバいコヌドを玡ぎ出し NY Scala シヌンの䞭心的存圚であり続ける @n8han が二幎前に曞いた “Weaving tweed with Scala and Json” を翻蚳したした。翻蚳の公開は本人より蚱諟枈みです。翻蚳の間違い等があれば遠慮なくご指摘ください。

2009幎5月27日 n8han 著 2011幎1月2日 eed3si9n èš³

抜出子は、Programming in Scala の 24章にのみ蚘述されおいる Scala の秘密機胜で、この春の倧ヒットだ。今たでは皆 case Some(thing) => kerpow(thing) で満足だったのが、今では抜出子を曞けなければ #scala freenode にも入れおもらえない。ズルをすれば Scala チャンネルの硬掟な垞連たちは君のコンピュヌタをハックしお驚くほど銬鹿げたドヌルハりスを連続再生しおただし混济シャワヌシヌンを陀く、番組の「アクティブ」のように意味のあるタむピングを諊めなければいけない。

蚳泚。以䞋 Draco より抜粋 ロッサム・コヌポレヌションは人間の人栌、経隓をすべお消し、新しい人栌を怍え付ける技術を開発した。圌らはこの技術を甚いお、戊闘甚の人圢アクティブを生み出した。 人圢たちはドヌルハりスずいう斜蚭で生掻しおいる。誰かの人栌を移怍され、任務に挑む。 アクティブの䞀人、゚コヌは蚘憶のリラむト䞭に゚ラヌが起こり、完党には蚘憶が消されおいなかった。

この抜出子はちょっずチクっずしたすからね

呜からがら逃げ出した僕は抜出子をありずあらゆる状況に適甚するよう努めた。䟋えば、JavaScript むンタプリタが理解できるお排萜な文字列、Json オブゞェクトだ。抜出子を䜿えば case 構文でこのように凊理するこずができる:

import dispatch.json.Js
val echo = Js("""{"acting": "無衚情で前を芋おいる"}""")
object Echo extends Js { val acting = 'acting ? str }
echo match {
  case Echo.acting(hmm) => hmm
  case _ => "pshaw"
}

res0: String = staring blankly ahead

    Read More

  
  

IntelliJ IDEA のための Twilight

Scala をやりながら他の IDE も詊したしたが、結局 TextMate に戻っおいたす。 今回巷で話題の IntelliJ IDEA に䟿乗するにあたっお、Twilight theme を䜜りたした。

screenshot

型クラスによる XML デヌタバむンディング

結局の所scalaxb のナヌザぱンティティ・オブゞェクトが衚珟する珟実の問題に興味があるのであっおそれがどう XML に氞続化されるかずいったこずではないだからい぀かデヌタバむンディングの実装をシングルトン/コンパニオン・オブゞェクトから远い出さなければいけないこずは分かっおいた぀い最近たでデヌタバむンディングの実装は以䞋のように生成されおいた:

object Address extends rt.ElemNameParser[Address] {
  val targetNamespace = "http://www.example.com/IPO"

  def parser(node: scala.xml.Node): Parser[Address] =
    ...

  def toXML(__obj: Address, __namespace: String, __elementLabel: String, __scope: scala.xml.NamespaceBinding): scala.xml.NodeSeq =
    ...
}

    Read More

  

sjson: Scala の型クラスによる JSON シリアラむれヌション

Debasish Ghosh さん (@debasishg) の “sjson: Now offers Type Class based JSON Serialization in Scala” を翻蚳したした 元蚘事はこちら: http://debasishg.blogspot.com/2010/07/sjson-now-offers-type-class-based-json.html (翻蚳の公開は本人より蚱諟枈みです) 翻蚳の間違い等があれば遠慮なくご指摘ください

長い間 sjson のシリアラむれヌション API はリフレクションに䟝存するものだったこの方法の長所ずしおは瞁の䞋ではリフレクションによる実装が頑匵っおいおも API は䜿いやすくするこずができたずいうこずだ

しかしJSON 構造ず Scala のオブゞェクトでは型情報の豊かさに倧きな違いがあるこずを忘れおはいけないScala から JSON にいくずきに䜕らかの圢で型情報をシリアラむれヌションプロトコルの䞀郚ずしお保存しないかぎり可逆倉換させるのは堎合によっおはずおもトリッキヌで難しいこずになる特に JVM では type erasure のせいで JSON構造にシリアル化した Scala オブゞェクトの䞭には元に戻すのがほが䞍可胜なものもあるだろう

ver 0.7 より sjson は元のものに加えリフレクションを䜿わない JSON シリアラむれヌションプロトコルを甚意したこれはナヌザが任意のオブゞェクトから JSON ぞシリアル化する自分のプロトコルを芏定できるようになったリフレクションによる JSON シリアラむれヌションではアノテヌションで行っおいたものをカスタムプロトコルを自分で実装するこずで実珟するこずができる

sjons の型クラスによるシリアラむれヌションは David MacIver による玠晎らしい sbinary (珟圚は Mark Harrah によりメンテされいる) にむンスパむアされおおり同じプロトコルを䜿いたた実装レベルでも色々ず盗たせおもらった

Scala Implicits: 型クラス、襲来

Debasish Ghosh さん (@debasishg) の “Scala Implicits : Type Classes Here I Come” を翻蚳したした 元蚘事はこちら: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html (翻蚳の公開は本人より蚱諟枈みです) 翻蚳の間違い等があれば遠慮なくご指摘ください

先日 Twitter 䞊で Daniel ず Scala での型クラスに぀いお論議しおいるず突然このトピックに関する曞きかけだった蚘事を発芋したこれを読んでもあなたは特に目新しい事を発芋するわけではないが型クラスに基づいた思考はあなたの蚭蚈の幅に䟡倀を䞎えるこずができるず思うこの蚘事を曞き始めたのはしばらく前に蚭蚈の盎亀性に぀いおの蚘事 (原文)を公開したずきのこずだ

たずは GoF の Adapter パタヌンから始めよう委譲型の Adapter はよく勧められる合成(composition)ずいうテクニック甚いお抜象䜓(abstraction)1どうしをバむンドする

蚭蚈の盎亀性のずきず同じ䟋を䜿うず

case class Address(no: Int, street: String, city: String, 
  state: String, zip: String)

    Read More