Hatena::ブログ(Diary)

ドナドナごとごと

2011-12-14

Play!ScalaでGAE

19:11

scalaplay?gae

Play!がいつの間にやらScalaフレームワークになっていたから触ってみた

モジュールインストール

とりあえずPlay!ScalaGAE、sienaモジュールインストールしてプロジェクト作成する

sienaというライブラリがあること初めて知った

$play install scala
$play install gae
$play install siena
$play new miyukiti --with scala

実行するときは

プロジェクトの中まで移動して

$play run

もしくは

$play run miyukiti

で実行できます

モジュール設定

conf/application.confにモジュールの設定を行う。

これで各モジュールが利用できるようになります。

module.scala=${play.path}/modules/scala-0.9.1

module.gae=${play.path}/modules/gae-1.4

module.siena=${play.path}/modules/siena-2.0.6

デプロイ

war/appengine-generatedフォルダにappengine-web.xmlがあるのでアプリケーションIDなどを書き換えて

$play gae:deploy

デプロイできます。

Todoアプリ

Todoアプリを作成してみます。

モデル

app/models/Todo.scala

package models

import play.modules.siena._
import siena._
import java.util._

class Todo (
    @NotNull
    n:String,
    @NotNull
    t:String,
    f:Boolean = false
) extends Model {
    val task:String = t
    val name:String = n
    var finish:Boolean = f
    @Id
    var id: Long = _
}

object Todo {
    def all(): Query[Todo] = Model.all(classOf[Todo])
    def allfetch = all.fetch()
    def getAllTask = all.filter("finish", false).fetch()
    def get(id: Long) = all.filter("id", id).get()
}
コントローラ

app/controllers.scala

package controllers

import play._
import play.mvc._
import play.modules.gae._
import com.google.appengine.api.users._
import models._
import scala.collection.JavaConversions._

import java.util._

object Application extends Controller{

    import views.Application._

    def index = {
        html.index(todos = Todo.getAllTask.toList)
    }
    
    def insert = {
        val name = params.get("name")
        val task = params.get("task")
        val todo = new Todo(task , name)
        todo.insert
        Action(index)
    }

    def done(id:Long) = {
        val todo = Todo.get(id)
        todo.finish = true
        todo.update
        Action(index)
    }

    def delete = {
        val todos = Todo.allfetch.toList
        for(todo <- todos){
            todo.delete
        }
        Action(index)
    }

}
ビュー

@の後はScalaのコードが書けるみたい

app/views/main.scala.html

@(title:String = "")(body: => Html)

<!DOCTYPE html>
<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@asset("public/stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@asset("public/images/favicon.png")">
        <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script>
    </head>
    <body>
        The Hello world app.
        <hr />
        @body
    </body>
</html>

app/views/Application/index.scala.html

@(todos:List[models.Todo])

@main(){
    Welcome!
    <a href="@action(controllers.Application.login)">Login</a>
    <a href="@action(controllers.Application.logout)">Logout</a>
    @form(controllers.Application.insert){
        <input type="text" name="name" />
        <input type="text" name="task" />
        <input type="submit" value="add" />
    }

    @if(!todos.isEmpty){
        @todos.map{ todo =>
            <li>
                <span>task: @todo.name</span>
                <span>task:@todo.task</span>
                <a href="@action(controllers.Application.done(todo.id:Long))">Done!</a>
            </li>
        }
    }else{
        <p>No Entity</p>
    }
}

簡単!こんなんで動いた!凄い簡単!Scalaよく分かってないけど書けた。

ローカルデータストアを見たいんだけどどうしたらいいかわからない。今まではhttp://localhost:8080/_ah/adminでローカルデータストア一覧したり削除したりできたのに…。deleteメソッド作成したけど何か一覧できる方法あるのかしら…。

efef 2012/01/14 20:50 このサンプルのおかげでGAEへのデプロイデバッグが捗りました!
ありがとうございます。

1つだけ自分の環境では足りていなかった点があったので報告しておきます。

app/views/Application/index.scala.html で使われているlogout,loginメソッドの定義がapp/controllers.scalaから抜けていて自分の環境では動きませんでした。

ちなみに、環境は
play-1.2.4
gae-1.6.0_b1
scala-0.9.1
siena-2.0.6

でした。

2011-09-07

m2eclipseでインデックス作成失敗してリポジトリの検索ができない

02:36

m2eclipseのインストール後初回起動時にインデックス作成のために非常に時間がかかる。時間がかかるからといってダウンロードを中止したり、コマンドラインmavenをいじったりしているとインデックス作成に失敗してリポジトリの検索ができなくなり泣くはめになる。以下その対処方法色々。

インデックスの更新

Window→Show View→Other→MavenMaven Repositories→Global Repositories→centralを右クリックして「Update index」

初回起動で作成されるフォルダの削除

$HOME/.m2/repository/.cache/m2e以下にダウンロードしたm2eclipseのバージョン番号の名前がついたフォルダがある。今回の場合「0.12.0」。これを削除してeclipseを起動し再度インデックスの更新を行う。そのときにはインデックスの更新が終わるまでぼーっとしてること

私の場合後者でなおった

2011-07-12

Mavenで指定したクラスを実行する

10:08

Maven

mvn test -Dtest=org.sample.Hoge

とするとテストファイルを実行してくれます。

main/javaの中にあるファイルを指定して実行したいと思ってたらあった。

Exec Maven Plugin - Introduction

pom.xml編集して

mvn exec:java -Dexec.mainClass="com.example.Main"

みたいにやるとできるみたい。

test/javaの中にあるファイルはテストファイルとして実行されるけど普通のファイルのみたくmainメソッド呼べないのかな

2011-06-23 GALAXYS IIをUbuntuで認識させる

GALAXYS II側の設定

設定>アプリケーション>開発>USBデバッグ

を有効にする。これだけです

android-sdkの導入

Android SDK | Android Developers からandroid-sdkを取得し、適当な所に解凍しパスを通します。

export PATH=$PATH:/android-sdkまでのパス/android-sdk-linux_86/tools

よくわからないけど

/etc/udev/rules.d/51-android.rules

を開いて以下を追加します。

SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"

USBデバイスベンダIDを登録しないといけないらしくSamsungは"04e8"となります。

これらの設定をしたらUSB銀河2とPCをつないでターミナル

adb devices

と入力すれば銀河2が認識されているのがわかるとおもいます。

2011-04-06

IS04(REGZA Phone)で実機テストする方法

16:52

自分の環境では

開発環境を構築するには - 逆引きAndroid入門

Android biboroku;): IS04に開発アプリを入れてみる - HelloWorld

の記事通りにやればできた。

後輩の環境構築でつまったのでその時のメモ。

とりあえず

adb devices

で確認したがどうも認識されていないっぽい

windowsXPでコントロールパネル→システム→ハードウェアデバイスマネージャ、からデバイスマネージャを開く。

AndroidPhoneみたいな項目があるはずなので右クリックでプロパティドライバタブ→ドライバの更新、でドライバの更新を行った。

「今インストールされているのよりいい感じのソフトがみつかんねーよ」みたいなこと言われて変化なし。

なのでデバイスマネージャ上で右クリックして削除して再起動

もう一度インストールをしようとした、するとインストールの途中に

WinUSBCoInstaller.dllがあるフォルダどこや

というウィンドウが表示された。いまいちどういった文章がでてたか覚えてない…

なのでIS04開発用USBドライバ(下記からダウンロードできる)の中に

携帯電話(IS04 USBドライバ ダウンロード) - FMWORLD.NET(個人) : 富士通

usb_driver_IS04/i386/WinUSBCoInstaller.dll

あった。

これを指定してあげたらインストールできた。正しく認識されてる!!adb devicesって叩くとリストに表示される!