kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scala 2.11.0で標準ライブラリから分離されたライブラリのjarファイル

今日のScala勉強会第124回 in 本郷で話題に出てたことの備忘録。Scala 2.11で、scala.util.parsing.combinatorscala.xmlscala.util.continuationsが標準のライブラリから分離されたのだが、これを今まで通りに使うにはどうすればいいのか。実は、分離されたライブラリの内、前者二つは以下に

https://oss.sonatype.org/content/repositories/releases/org/scala-lang/modules/

continuations

https://oss.sonatype.org/content/repositories/releases/org/scala-lang/plugins/

に入っているので、これらを今まで通りに使うにはsbtの設定ファイルに

libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1",
  "org.scala-lang.modules" %% "scala-xml" %  "1.0.1",
  "org.scala-lang.plugins" %% "scala-continuations-library" % "1.0.1"
)

という記述を追加してやればよい。

追記:コメントにある通り、継続(continuations)プラグインを使うには、

autoCompilerPlugins := true

addCompilerPlugin("org.scala-lang.plugins" % "scala-continuations-plugin_2.11.0" % "1.0.1")

scalacOptions += "-P:continuations:enable"

という記述が追加で必要になる。今までもcontinuation pluginを使うには必要な記述であったが、2.11.0ではcontinuation pluginの置き場所が異なっている点に注意。

初学者向けの Scala Tips (1) - Option#map()を使おう

唐突に始まったScala Tipsコーナー、初学者が陥りがちなScalaのコードパターンを例にして、より良い方法を解説していきます。第一回はOptionクラスのmap()メソッドを使おうというものです。知ってる人には今更ですが、Option#map(f)は、レシーバーの値がSome(v)の場合は、fvを渡した結果のSome(f(v))が、Noneの場合はNoneが返ります。したがって、パターンマッチを使った以下のようなコードは

val result = exp1 match {
  case Some(v1) =>
    val vx = //expression using v1
    Some(vx)
  case None =>
    None
}

常に以下のような形に書き換えることができます。

val result = exp1.map{v1 =>
  val vx = //expression using v1
  vx
}

より一般的なコードでは、flatMap()を使う事が有用な事がありますが、それはまた今度。

Sonatype Nexus repositoryにライブラリをアップロードしようとしてはまった話

昨日、Scala 2.11.0がリリースされたということで、自分(たち)がメンテしているライブラリnscala-timeScala 2.11.0対応版をSonatype Nexus Repository(これ、正式名称は何なのだろうか未だに悩んでいる)にアップロードしようとしていたのだが、

こんな画像

な感じで何故か301が返ってきてはまっていた。

原因はわかってみると簡単。どうも、いつのまにかSonatypeがhttps://で始まるURLしか受け付けないようになっていたのに、アップロード先のURLがhttp://のままなのであった。

修正は簡単で、

publishTo <<= version { v =>
  val nexus = "http://oss.sonatype.org/"
  if (v.endsWith("-SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/snapshots")
  else
    Some("releases" at nexus + "service/local/staging/deploy/maven2")
}

となっていたのを

publishTo <<= version { v =>
  val nexus = "https://oss.sonatype.org/"
  if (v.endsWith("-SNAPSHOT"))
    Some("snapshots" at nexus + "content/repositories/snapshots")
  else
    Some("releases" at nexus + "service/local/staging/deploy/maven2")
}

にするだけ。

名前を簡単に変えられることのありがたさ

何を当たり前のことを、と言われそうだが、最近の静的型付き言語のIDEには、「名前変更」のリファクタリングを自動的に行ってくれる機能があり(リフレクションなどIDEが追跡可能な範囲を超える場合を除いて)、後から簡単に名前を変更することができる。このような機能は動的型付き言語用のIDEにもみられるものではあるが、IDEが追跡できる範囲がより限定的であるため、結局、IDEによる変更が正しいかどうかは目視に頼らざるを得ない。

静的型付き言語であっても、文字列を使ってリフレクションAPIを使用する場合など注意すべき点はあるのだが、その範囲が限定的であるため、名前の変更を安心して行うことができる。名前というのは後になってから変更したくなるものの一つであるため、これは静的型付き言語用の高度なIDE(Eclipse, NetBeans, IntelliJ IDEA等)の利点という事ができるだろう。

特にプロジェクトの初期に恥ずかしいtypoあるいは勘違いをしてしまい、その名前をあちこちで使った後に間違いに気づいた時にはとてもありがたい(動的型付き言語のIDEでこのテの、全体に広まってしまったtypoを直すのは結構大変である。たとえば、筆者はRubyMineというRuby on RailsIDE( このIDE自体は非常によくできている)で、Ruby on Railsで作られたアプリケーションに対してこのような作業を行った事があるが、なかなか大変な作業であった…)。

女子マネ弁当というものを体験してみた

ドワンゴに入社して最初のエントリなのにとてもくだらないことだが、入社してから7日目の今日、初めて女子マネ弁当に参加してきた。

最初、勝手が全くわからなかったので、同じチームの同僚に聞いたところ、それぞれの席についていたら10時30分からその場でラジオ体操をするとのこと。いわれてみれば、大量にいるドワンゴのエンジニアが一カ所に集まって体操をしたら凄まじい人口密度になると思われるわけで、これは当たり前か。ちなみに、朝、席についたところ、同じチームの人から「水島さん、朝、早いですね」とのお言葉が。入社1週間で早くもこんなことになっている。

というわけで、10時30分を待ったところ、女子マネ(?)の方がフロアに来て、体操を始める旨を告げる。その後、昔なつかしのラジオ体操をその場で行って終了。「女子マネ弁当」カードにスタンプを押してもらって終わり。

あとは昼頃になると、このスタンプ付きカードと引き換えに、弁当を得ることができるらしい(メニューは社内IRCで知ることができると聞いた)。この「女子マネ弁当」自分が起きる時刻にも合わないし、今後は出ることはないだろうなと思っていたのだが、意外と時間に合わせてラジオ体操をするのは悪くないもので、今後も出るかもしれない。

株式会社ユビレジを退職します

2014年3月末をもって、株式会社ユビレジを退職することになりました。在職期間は2年3ヶ月とそれほど長くありませんが、スタートアップ企業の顧客に近い位置で仕事をすることができて、とてもいい経験が出来たと考えています。

退職に関して

  • 新しい職場で自分の力量を試してみたくなったことと
  • 現在のユビレジにおいて自分が果たせる役目が一通り終わったという実感
  • そもそもユビレジにジョインした時点で、働き始めて2年間経ったら転職先を考えようと思っていた

というのが大きな理由です。

ユビレジに入った当初~去年4月までは、駒場東大前近くにある、通称ユビハウスという一軒家の1階をオフィス用として利用していました。おかげで、

  • 柿の木から柿を収穫(!)して食べた
  • 東大駒場キャンパスの食堂で昼食を食べた
  • タイカレーを皆で作って食べた
  • たこやきを皆で作って食べた

といった貴重な経験をすることができました…というのは冗談で(上記の話は本当ですが)、

  • ユビレジAPIの設計・実装・メンテナンス
  • Jenkin番人として社内のJenkins環境を整備。特に、pull requestに対して自動テストを走らせるように環境を整備するなど
  • iOSアプリ「ユビレジ2」の同期エンジンの再実装(20122013)
  • サーバサイドのユビレジWebアプリのメンテナンス・デプロイ
  • 技術的なトラブル対応
  • その他状況によって色々

等、様々なことをすることができました。

特に、私の場合体調が安定せず迷惑をかけたことがあるかなーという部分が正直あるのですが、寛大な処置で対応してくれたユビレジの皆様には本当に感謝しています(特にid:soutaroさん)。ユビレジでは現在もエンジニアを募集しているので、何かあったら、募集要項を読んで応募してみると良いと思います。私にどんな感じだったか聞いてもらっても良いです。

次の仕事

2014年4月1日から株式会社ドワンゴにて働くことが決まっています。Scalaで色々書いたりScala環境をよくするお仕事を主にする予定です。

なんだか最近、ドワンゴScalaな人が吸い込まれている気がしますね。特に気負わず、淡々とやるべきことをこなしていく所存です。今までよりScalaに関する時間を取れそうなので、情報発信やライブラリのメンテナンス、Scalaエヴァンジェリスト()としての活動も積極的にしていきたいところです。

Scala Conference in Japan 2014(仮)の正式名称を(Twitter上等で)公募しています

内容は表題の通りです。先日のエントリで書いたScala Conference in Japan 2014(仮)のキックオフミーティングですが(リモート参加もあるよ!)、参加してくださる予定の方は20名以上になったものの、正式名称公募の話をするのを忘れていたのでした。

ルールは簡単で、

2014年3月8日10:00(日本時間)までにTwitter上で #scalaconfjp タグを付けて、「Scala Conference in Japan 2014(仮)」の正式名称っぽいものをつぶやくだけです。このブログのコメント欄でも構いません。

その場のノリで考えたものでもいいので、応募お待ちしております。基本的にはつぶやかれたものから投票形式で正式名称を選びます(応募数がよほど少ない場合は除く)。なお、当選者(?)には商品はありませんが「Scala Conference in japan 2014(仮)」本番では、この名称が使われます。