Category Archives: その他

Scala-Tools のサービスが終了した件

sbt で標準で参照しているリポジトリ、scala-tools のサービスが先日終了したようです。しばらく移行期間として移行先のリポジトリにリダイレクトをしていたのですが、それも終了したとのこと(たまたま今落ちてるだけかもしれないとのこと。でも将来なくなるのは確か)。

そこで scala-tools を参照しているビルドツールは設定変更を余儀なくされています。とりあえず、Play 2.0 は、project/Build.scala を以下のように修正すれば良いようです。

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

  val appName = "myapp"
  val appVersion = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
  )

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
    // Add your own project settings here
    // 以下のように移転先リポジトリを指定
    resolvers ++= Seq(
      "sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases/",
    ),
    // 以下のようにこれまでの Scala-Tools リポジトリを見ないようにする
    externalResolvers ~= (_.filter(_.name != "Scala-Tools Maven2 Repository"))
  )

}

MongoURI がいい加減すぎワロエナイ

Heroku + MongoLab 環境に Casbah を使って MongoDB に接続する Play 2.0 で作成したアプリケーションをデプロイしようとしました。

それで Heroku 上で MONGOLAB_URI の設定値として提供される MongoDB の接続 URI を com.mongodb.casbah.MongoURI(com.mongodb.MongoURI)に食わせたらまったくもってでたらめなパースをするので自分でなんとかするコードを書きました。使い方は以下のコード内のコメント参照。MongoDB の接続 URI は conf/application.conf 内で mongodb.default.uri で設定するか、起動時に -D オプションで与えるようにしてください。

package mongodb

import play.api._
import Play.current
import com.mongodb.casbah.Imports._

/**
 * MongoDB をサクッと使うためのオブジェクトです。
 */
object Mongo {
  /**
   * MongoDB 接続用 URI をパースするための正規表現
   */
  val uriPattern = "mongodb://(?:([^:^@]+)(?::([^@]+))?@)?([^:^/]+)(?::(\\d+))?/(.+)".r

  /**
   * MongoDB に接続されたブロックを提供します。
   * 接続 URI は mongodb.default.uri の設定値を使用します。
   *
   * 使い方の例
   * {{{
   *   MongoDB.withDB { db =>
   *     db("employee").findAll().toSeq
   *   }
   * }}}
   */
  def withDB[A](f: MongoDB => A): A = withDB("default")(f)

  /**
   * MongoDB に接続されたブロックを提供します。
   *
   * 使い方の例
   * {{{
   *   MongoDB.withDB("mydb") { db =>
   *     db("employee").findAll().toSeq
   *   }
   * }}}
   *
   * @param name 設定名
   */
  def withDB[A](name: String)(f: MongoDB => A): A = {
    // Play を使わない場合は↓このあたりを変えるといい
    val uri = Play.configuration.getString("mongodb." + name + ".uri").getOrElse("mongodb://localhost/test")

    // URI のパース
    val (usernameOpt, passwordOpt, host, portOpt, database) = parseURI(uri)

    // MongoDB に接続
    val conn = portOpt map { port =>
      MongoConnection(host, port.toInt)
    } getOrElse {
      MongoConnection(host)
    }

    try {
      // DB 取得
      val db = conn(database)
      // 必要とあれば認証処理を行う
      (usernameOpt, passwordOpt) match {
        case (Some(username), Some(password)) => db.authenticate(username, password)
        case _ =>
      }
      // 引数で指定された処理を実行
      f(db)
    } finally {
      conn.close()
    }
  }

  /**
   * MongoDB 接続 URI をパースします。
   */
  def parseURI(uri: String) = {
    uri match {
      case uriPattern(username, password, host, port, database) =>
        (Option(username), Option(password), host, Option(port), database)
    }
  }
}

アナリスト、ストラテジストが足りない

我々の業界(ソフトハウス、SIer)には、圧倒的に「アナリスト」や「ストラテジスト」が足りないと思います。

「私はカンナ掛けが最高に上手いです」「寸分の狂いなく木組みします」という腕のいい大工がやってきて「さあ、どんな家を作りましょうか?」といったところで家を建てようと思う人からは仕事を取れるはずもないでしょう。

では最高に上手い設計をする建築士ではどうでしょうか? たぶん、それでもダメです。

お客さんの夢、これからの人生をどうあゆんでいきたいかを汲み取った上で「こんな家はどうでしょう?」と言えるようでなければなりません。

SEには提案力が求められると簡単に言われますが、業務的、経営的分析力と戦略を立てる能力がなければカンナ掛けの上手さのアピールの延長線上から抜け出すことはできないと思います。