月別アーカイブ: 2014年1月

[scala]case classでJAVA-Beanスタイルのプロパティを実装

自動生成されるgetter、setterをget〜やset〜みたいな形にする方法です。
case classをjavaで使用する時に使うと良いかも。

方法.
@reflect.BeanProperty って書けばOK

ex.

case class Book(
  @reflect.BeanProperty var id:String, 
  @reflect.BeanProperty var title:String)


val book = Book(“100″,”kokoro”)
book.getId()
book.setId(“102”)

残念ながら Boolean のプロパティは is〜になってくれない模様

(2014.10.09) version2.3.xでは @scala.beans.BeanProperty に変更されているもよう

[Play] AnormでダイナミックSQL

Anorm面倒ですね。
静的なパラメータクエリは簡単にできますが、動的にwhere句・パラメータを生成しなければならない場合もあるわけで。。

SQLのwhereについては単なる文字列なのでどうとでもなりますが、問題はon{・・}に記述するパラメータです。
これにはすっごく悩みましたが下記の方法にて動的にwhereの生成とパラメータの設定を行う事が可能です。

val datamap = { //(省略)マッピング定義 }

def selectBooks(offset: Int, pageSize: Int, orderBy: String
    , filterTitle: Option[String] = None,filterAuthor:Option[Int] = None):List[Book] = {
  DB.withTransaction { implicit connection => 
  
    // 条件をtupleで定義する(項目ID,条件演算子,値)
	// 無視する条件は値にNoneを設定
    val conditions = Seq(
      ("title", "like",filterTitle),
      ("author_id", "=",filterAuthor)
    )
	
    // Someな値を抽出してwhere句を生成
    val filterString = conditions.filter(_._3.isDefined).map(flt => {
      "%s %s {%s}".format(flt._1,flt._2,flt._1)
    }).mkString(" where "," and ","")
    
	// 同じくSomeな値に対してのパラメータリストを作成
    val filterParams = conditions.filter(_._3.isDefined).map(flt => { 
      flt._1 -> toParameterValue(flt._3)
    })       
	
	// 常に設定するパラメータを作成
    val baseParams =  Seq(
      "pageSize" -> toParameterValue(Option(pageSize)),
      "offset" -> toParameterValue(Option(offset))
    )
	// パラメータのリストを結合
    val params = baseParams ++ filterParams

    // queryを実行
    SQL("""
        select * from books
        %s order by %s limit {pageSize} offset {offset}         
        """.format(filterString,orderBy))        
        .on(params: _* )
        .as(datamap *)
  }
}

条件項目をOptionで受け取り、Someな項目のみを条件として設定しています。
もうちょっと綺麗に書きたいのですが、イマイチscala的な書き方が良くわかっていないので。。

[Play]ネストしたFormを使う

playframework2.2でネストしたFormをListで使うサンプルがなかなか見つからなかったのでメモしておきます。

最初にエンティティの定義
今回は簡単にcaseクラスで下記の用に定義します。

case class User(
  userId: String,
  codename: String,  
  skills: List[Skill])
 
case class Skill(skillname:String,level:Int)
 

UserにネストしてSkillを持ちますよ。

controllerでは下記のようにFormのパース定義を記述します。

val userFormDef :Form[User] = Form(
  mapping(
    "userId" -> number,
    "codename" -> text,            
    "skills" ->  list[Skill](
      mapping(
        "skillname" -> text,
        "level" -> number
      )(Skill.apply)(Skill.unapply))                      
  )(User.apply)(User.unapply))

エンティティのネストと同様にFormの定義もネストして記述しています。

これを受けるビューはこんな感じで記述
@(form:Form[User])(implicit request: RequestHeader)
<!DOCTYPE html>
・・省略・・
<h2>UserID: @form.get.userId <h2>
@helper.inputText(form("codename"))<br />

@helper.repeat(form("skills"), min = 1) { skill =>
<div>
  @helper.inputText(skill("skillname"))
  @helper.inputText(skill("level"))
</div>
}

</html>

念のため表示させる時のコードも書いておきます

val user = User(・・・・・)
Ok(views.html.user(userFormDef.fill(user)))

パースさせる時も普段どおりこんな感じでOkす

userFormDef.bindFromRequest.fold(
      formWithErrors => BadRequest,
      form => {
	・・・
      })

以上、参考になれば。

bitcasaの退会がクソ面倒な件

bitcasaにちょっと期待していた自分がいたんですよね。
数ヶ月ほど前。
で、ご存知の方も多いでしょうけど11/21に価格改正が行われ、99ドル/1年だったものが999ドル/1年のビックリ価格になったのです。
(無制限プランの場合ね)

当初からサービスには99ドルで維持可能なのか疑問視されていたわけですが、CEOさんは「うちの重複除去と圧縮アルゴリズムすげーし大丈夫よ!w」と自身満々でおっしゃってらして「これは期待!」と思ってたわけです。
開発者用APIの公開もあることですしね。

しかし結局約10.1倍の価格改正となりガッカリしたわけです。
これが11/21の私。

んで、ここからが本題。
もうbitcasa見限ったのでアカウント消そうと思ったんですけど、
やってみるとこれがクソ面倒!

まずWEBのUIで退会を探してもどこにもない!
もしかして日本語UIだけないのかな?と思って英語UIで探しても無い!
しょうがないのでサポートから退会方法を探してみると↓が見つかった。
How Do I Downgrade/Cancel My Bitcasa Account?

なんでもsupport requestのDescriptionに”Delete my account.”と入力して送れとか。。。マジか!
※support requestはここね→ https://support.bitcasa.com/requests/new

送信すると1日位たってからこんなメールが飛んできます。

bitcasa-del1

マジでいいの?ファイル全部消えるけど?みたいな事聞いてきたので

Yes. of course!
Please delete my account!

とメールで返信。
これで一安心と思ったのですが、しばらくたってもアカウントが生きている。
うーん?
くそ改悪のせいで退会者が多いのかな??とか思って待ってたらこんなメールが。。

bitcasa-del2

はぁ?
そんなURL全く通知されてませんけど??
ペンディングってボール持ってるのはそっちでしょが!

・・どうやら削除の確認はメールで送るのではなく、このリンクにあるサポートサイトで返信しなければならないらしい。

bitcasa-del3

これでようやく削除できましたとさ。

ちなみにリクエストチケットのURLはhttps://support.bitcasa.com/requests/リクエスト番号
です。