Skip to content

ScalaのFutureがブロックする?(深く調べてない)

ScalaのFutureがブロックする?(深く調べてない) published on ScalaのFutureがブロックする?(深く調べてない) への3件のコメント

ScalaのFutureで(あるいはPlay?)で処理がブロックされてしまう現象があった。

環境

  • Scala 2.10.1
  • Play 2.1.3
  • (Playのモデルクラスを使っているだけで、scalaコマンドから起動されるバッチ処理)

簡略化するとこんなコード(実際はもっと分割されてるし、whileじゃなくてtailrecだけど)。

import scala.concurrent.Await
import scala.concurrent.duration._
import play.api.libs.concurrent.Execution.Implicits._
 
for {
  photo <- listOfPhotos
} yield {
  // downloadはサードパーティライブラリのメソッドで
  // Future[java.io.File]を返す
  val fut = photo.download map { file =>
    Logger.debug("start!") //ここまでは実行される。
    // SomeApi.postFileの挙動は、responseが返るまでブロックする。
    // しかし、↓が実行されない
    SomeApi.postFile(file) map { jobId =>
      var complete = false
      var result = None
      while (!complete) {
        Thread.sleep(5000)
        val job = SomeApi.getJob(jobId)
        if (job.isComplete()) {
          complete = true
          result = job.getResult()
          // resultに対して処理
        }
      }
    }
  }
  try {
    Await.result(fut, 120 seconds)
  } catch {
    case e: Exception => Logger.error(e.getMessage())
  }
}

Continue reading ScalaのFutureがブロックする?(深く調べてない)

Mahout 0.8でレコメンデーションエンジンを作る

Mahout 0.8でレコメンデーションエンジンを作る published on Mahout 0.8でレコメンデーションエンジンを作る への1件のコメント

最近2つのプロジェクトで「オススメの◯◯」とかそれに類する機能を作ったので、ちょっとまとめてみる。

基本的なことはMahout in Actionに書いてあるので、そっちを読んで欲しい。一応、本エントリーでも基本的なことは簡単には説明するけど、本に載っていないこととかを主に書こうかと。

Mahout in Actionが発売された頃は、Mahoutの最新バージョンは多分0.6とかだったと思うけど、今は0.8がリリースされていて、0.9も開発中。自分が使ってるのは0.8なので、0.6とかの古いバージョンとの差異も分かる範囲で書く予定。

Continue reading Mahout 0.8でレコメンデーションエンジンを作る

bitcoin触ってみた

bitcoin触ってみた published on bitcoin触ってみた へのコメントはまだありません

bitcoin って、みんな名前は知ってると思うけど、実体は知らない人が多そうな気がする。そういう自分もよく分かってなかったので、少し触ってみる事にした。

bitcoinとは何か?使い方は?

これは色んなサイトで解説されているので省略。この辺見て下さい。ググれば一杯情報出てくるはず。

どうやって入手するの?

以下の3つ。

  • 購入(現金=リアルマネーと交換)
  • 採掘(=mining、後述)
  • その他(アンケートに答えたり、広告見たりして、その対価にもらう)

Continue reading bitcoin触ってみた

EC2で、非LVMパーティションを拡張する

EC2で、非LVMパーティションを拡張する published on EC2で、非LVMパーティションを拡張する へのコメントはまだありません

最近だとAWS等のクラウドを使う機会が増えていて、逆に物理サーバーを使うことが少なくなってきており、以前みたいにサイジングを細かくやることが少なくなってきた。

また、随分前から多くのLinuxディストリビューションでは、デフォルトのセットアップでLVMを使うようになっているので、仮想ディスクを追加してLVMのボリューム拡張という方法で、サービスを止めずにディスク容量の拡張が可能になっている。

これだけだと「便利な時代になったね」でおしまいの話なんだけど、EC2の場合、非LVMのパーティションも比較的簡単に拡張が可能なので、それについて説明する。ただし以下の制約がある。

  • / パーティションは拡張できない
  • サービス停止は必要
  • (当然だけど)ext4等、拡張可能なファイルシステムを使用している必要がある

今回紹介する方法以外で、もっといい方法があれば是非教えて下さい。

Continue reading EC2で、非LVMパーティションを拡張する

Play! framework 2.xでJSONを扱う方法をいくつか

Play! framework 2.xでJSONを扱う方法をいくつか published on Play! framework 2.xでJSONを扱う方法をいくつか へのコメントはまだありません

Webサイト作ってると、JSONを扱うことが多い。なので、Play! frameworkで、ScalaのオブジェクトからJSON文字列に、あるいはその逆をやりたいよね、と(特に前者)。

そんな今回はObject -> JSONの方法をいくつかまとめてみた。

環境は Play 2.1.1。そのうち2.2にアップグレードしようと思うけど。

ちなみに Scala Advent Calendar 2013 の 12日目の記事ですら。

Continue reading Play! framework 2.xでJSONを扱う方法をいくつか

DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(3)

DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(3) published on DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(3) へのコメントはまだありません

前回からかなり間が空いてしまったけど、今回で完結予定。

前回はHiveの話を中心に、S3に置いたファイルをHiveでどう扱うかなどについて書いた。また、第1回では全体の流れを書いたので、どんなことをやるかは詳しくはそちらを参照。

今回は、DynamoDBに書き込んでいるデータを定期的にS3にエクスポートしたり、MySQLからエクスポートしたデータに対して、EMR上のHiveからクエリーを実行して結果を取得してみる。

Continue reading DynamoDB + S3 + EMRでコホート分析(cohort analysis)をする(3)

bashのドル記号の用法をいくつか

bashのドル記号の用法をいくつか published on bashのドル記号の用法をいくつか へのコメントはまだありません

bashではドル記号($)で色々な場面で使う(Bourne shellでも使うけど)。自分が知ってる範囲でまとめてみた。

変数の参照

基本中の基本なんで敢えて書く必要はないかも。

foo=1234       # 変数の定義
echo $foo      # 変数の参照
ary=(1 2 3)    # 配列の定義
echo ${ary[1]} # 配列の要素の参照
for e in ${ary[@]} .... # 配列全体の参照

Continue reading bashのドル記号の用法をいくつか

Ubuntuで/var/lib/mysqlを移動したらエラーが

Ubuntuで/var/lib/mysqlを移動したらエラーが published on Ubuntuで/var/lib/mysqlを移動したらエラーが へのコメントはまだありません

開発環境(Ubuntu on VirtualBox)のディスク容量が少なくなってきたので、/var/lib/mysql を 別のディレクトリ ( /data の下)に移動して、シンボリックリンクを張ったんだけど、MySQL起動時に以下の様なエラーが出た。

/usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
131203 18:27:23 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
131203 18:27:23  InnoDB: Initializing buffer pool, size = 8.0M
131203 18:27:23  InnoDB: Completed initialization of buffer pool
131203 18:27:23  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

結論から言うと、/etc/apparmor.d/usr.sbin.mysqld で、/data/mysql への権限を追加すればOK。

  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /data/mysql/ r,
  /data/mysql/** rwk,

環境: Ubuntu 10.04.4 (面倒なのでアップグレードしていない・・・)

Cache play already exists

Cache play already exists published on Cache play already exists へのコメントはまだありません

バッチからPlay.startを実行するとエラー

こちらを参考に、play frameworkで作ったwebサイトのバックグラウンド用タスクを作成し実行した。それに関しては別途エントリーを書くとして、以下のようにPlay.startを実行すると、

    Play.start(new DefaultApplication(new java.io.File("."), cl, None, Mode.Prod))

その時に以下の様なエラーが出た。

Continue reading Cache play already exists