• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
 

 Scalaのplayframework2.0を使って開発することになったので、ローカルのWindows環境の構築手順をメモ。

sbtインストール

  • 下記URLから sbt-launch.jar をダウンロードします。

http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar

  • 任意のディレクトリに sbt-launch.jar を置いて、同じディレクトリ内に下記の内容で sbt.bat を作成します。

   1  set SCRIPT_DIR=%~dp0
   2  java -Xmx512M -jar "%SCRIPT_DIR%sbt-launch.jar" %*

  • 上記ディレクトリにパスを通し、sbt コマンドで起動します。

   1  C:\Users\akanuma>sbt
   2  
   3  C:\Users\akanuma>set SCRIPT_DIR=C:\sbt\
   4  
   5  C:\Users\akanuma>java -Xmx512M -jar "C:\sbt\sbt-launch.jar"
   6  Getting net.java.dev.jna jna 3.2.3 ...
   7  downloading http://repo1.maven.org/maven2/net/java/dev/jna/jna/3.2.3/jna-3.2.3.jar ...
   8          [SUCCESSFUL ] net.java.dev.jna#jna;3.2.3!jna.jar (13985ms)
   9  :: retrieving :: org.scala-tools.sbt#boot-app
  10          confs: [default]
  11          1 artifacts copied, 0 already retrieved (838kB/106ms)
  12  Getting Scala 2.9.1 (for sbt)...
  13  ~~~ 中略 ~~~
  14  [info] Resolving org.scala-tools.sbt#precompiled-2_8_1;0.11.2 ...
  15  [info] Resolving org.scala-tools.sbt#precompiled-2_8_0;0.11.2 ...
  16  [info] Resolving org.scala-tools.sbt#precompiled-2_9_0;0.11.2 ...
  17  [info] Done updating.
  18  [info] Set current project to default-83bb15 (in build file:/C:/Users/akanuma/)
  19  >

Play2.0インストール

  • 下記サイトから play-2.0.zip をダウンロードします。

http://www.playframework.org/

  • 任意の場所で解凍してパスを通し、playコマンドでインストールします。

   1  C:\Users\akanuma>play
   2  Getting net.java.dev.jna jna 3.2.3 ...
   3  :: retrieving :: org.scala-tools.sbt#boot-app
   4          confs: [default]
   5          1 artifacts copied, 0 already retrieved (838kB/510ms)
   6  Getting Scala 2.9.1 (for console)...
   7  :: retrieving :: org.scala-tools.sbt#boot-scala
   8          confs: [default]
   9          4 artifacts copied, 0 already retrieved (19939kB/3195ms)
  10  Getting play console_2.9.1 2.0 ...
  11  :: retrieving :: org.scala-tools.sbt#boot-app
  12          confs: [default]
  13          4 artifacts copied, 0 already retrieved (1472kB/566ms)
  14         _            _
  15   _ __ | | __ _ _  _| |
  16  | '_ \| |/ _' | || |_|
  17  |  __/|_|\____|\__ (_)
  18  |_|            |__/
  19  
  20  play! 2.0, http://www.playframework.org
  21  
  22  This is not a play application!
  23  
  24  Use `play new` to create a new Play application in the current directory,
  25  or go to an existing application and launch the development console using `play`.
  26  
  27  You can also browse the complete documentation at http://www.playframework.org.

  • アプリケーション用の任意のディレクトリで play new コマンドでアプリケーションを作成します。ここでは play_new_sample ディレクトリで sample という名前のアプリケーションを作成します。

   1  C:\play_new_sample>play new sample
   2         _            _
   3   _ __ | | __ _ _  _| |
   4  | '_ \| |/ _' | || |_|
   5  |  __/|_|\____|\__ (_)
   6  |_|            |__/
   7  
   8  play! 2.0, http://www.playframework.org
   9  
  10  The new application will be created in C:\play_new_sample\sample
  11  
  12  What is the application name?
  13  > sample
  14  
  15  Which template do you want to use for this new application?
  16  
  17    1 - Create a simple Scala application
  18    2 - Create a simple Java application
  19    3 - Create an empty project
  20  
  21  > 1
  22  
  23  OK, application sample is created.
  24  
  25  Have fun!

  • コマンドを実行したディレクトリにアプリケーション名のディレクトリが作成されますので、その中に移動して play run コマンドでアプリケーションを起動します。

   1  C:\play_new_sample\sample>play run
   2  Getting org.scala-tools.sbt sbt_2.9.1 0.11.2 ...
   3  :: retrieving :: org.scala-tools.sbt#boot-app
   4          confs: [default]
   5          37 artifacts copied, 0 already retrieved (7324kB/3942ms)
   6  [info] Loading project definition from C:\play_new_sample\sample\project
   7  [info] Set current project to sample (in build file:/C:/play_new_sample/sample/)
   8  
   9  [info] Updating {file:/C:/play_new_sample/sample/}sample...
  10  [info] Done updating.
  11  --- (Running the application from SBT, auto-reloading is enabled) ---
  12  
  13  [info] play - Listening for HTTP on port 9000...
  14  
  15  (Server started, use Ctrl+D to stop and go back to the console...)
  16  

  • ブラウザでlocalhostの9000番ポートにアクセスして起動を確認します。

play.jpg

  • local に scala を直接インストールしていないせいか、sbt の run コマンドだとアクセス時に 「scala.tools.nsc.MissingRequirementError: object scala not found.」 が発生しました。

  • アプリケーションをEclipseプロジェクトにするには play eclipsify コマンドを実行します。

   1  C:\play_new_sample\sample>play eclipsify
   2  [info] Loading project definition from C:\play_new_sample\sample\project
   3  [info] Set current project to sample (in build file:/C:/play_new_sample/sample/)
   4  [info] About to create Eclipse project files for your project(s).
   5  [info] Successfully created Eclipse project files for project(s): sample

  • EclipseでScalaの開発をするためのプラグインとして、Scala IDE for Eclipse があります。Eclipse3.6(Helios)が正式サポート対象で、3.7(Indigo)では一部動作しない機能があります。

  • Eclipse の Helpメニュー > Install New Software から下記URL(Scala 2.9.x用)を指定してプラグインをインストールします。

http://download.scala-ide.org/releases-29/stable/site

  • Scala2.8.xの場合は下記URLになります。

http://download.scala-ide.org/releases-28/stable/site

  • これでひとまずアプリケーションの作成はできましたので、必要なロジックを作りこんでいくことになります。
posted by Png akanuma on Fri 16 Mar 2012 at 08:31

 今更ですがScalaをちゃんと勉強するために、まずは環境の準備ということでCloudCore環境にScalaをインストールしました。

JDK Install

  • まずはJavaの環境が必要なので、JDKのrpmパッケージをダウンロード。

   1  # wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm
   2  --2012-01-22 22:41:18--  http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm
   3  download.oracle.com をDNSに問いあわせています... 118.155.230.51, 118.155.230.26
   4  download.oracle.com|118.155.230.51|:80 に接続しています... 接続しました。
   5  HTTP による接続要求を送信しました、応答を待っています... 200 OK
   6  長さ: 67641623 (65M) [application/x-redhat-package-manager]
   7  `jdk-7u2-linux-x64.rpm' に保存中
   8  
   9  100%[======================================================================================================================>] 67,641,623  1.78M/s 時間 28s
  10  
  11  2012-01-22 22:41:47 (2.30 MB/s) - `jdk-7u2-linux-x64.rpm' へ保存完了 [67641623/67641623]

  • rpmコマンドでインストール

   1  # rpm -ivh jdk-7u2-linux-x64.rpm
   2  準備中...                ########################################### [100%]
   3     1:jdk                    ########################################### [100%]
   4  Unpacking JAR files...
   5          rt.jar...
   6          jsse.jar...
   7          charsets.jar...
   8          tools.jar...
   9          localedata.jar...
  10  #
  11  # which java
  12  /usr/bin/java
  13  #
  14  # java -version
  15  java version "1.7.0_02"
  16  Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
  17  Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode)

Scala Runtime インストール

  • まずはRuntimeをダウンロード

   1  $ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
   2  --2012-01-22 22:47:37--  http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.tgz
   3  www.scala-lang.org をDNSに問いあわせています... 128.178.154.159
   4  www.scala-lang.org|128.178.154.159|:80 に接続しています... 接続しました。
   5  HTTP による接続要求を送信しました、応答を待っています... 200 OK
   6  長さ: 24993458 (24M) [application/x-gzip]
   7  `scala-2.9.1.final.tgz' に保存中
   8  
   9  100%[======================================================================================================================>] 24,993,458  4.10M/s 時間 10s
  10  
  11  2012-01-22 22:47:49 (2.33 MB/s) - `scala-2.9.1.final.tgz' へ保存完了 [24993458/24993458]

  • ダウンロードしたRuntimeを解凍して移動

   1  $ tar zxvf scala-2.9.1.final.tgz
   2  scala-2.9.1.final/
   3  ~~~中略~~~
   4  scala-2.9.1.final/meta/available
   5  $
   6  $ mv scala-2.9.1.final ../
   7  $

  • 環境変数SCALA_HOMEを設定してPATHを通します。

   1  $ cat .bashrc
   2  # .bashrc
   3  
   4  # Source global definitions
   5  if [ -f /etc/bashrc ]; then
   6          . /etc/bashrc
   7  fi
   8  
   9  # User specific aliases and functions
  10  export SCALA_HOME=/home/akanuma/scala-2.9.1.final
  11  export PATH=$PATH:$SCALA_HOME/bin

  • Runtimeの動作を確認します。

   1  $ scala
   2  Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_02).
   3  Type in expressions to have them evaluated.
   4  Type :help for more information.
   5  
   6  scala>

posted by Png akanuma on Sun 22 Jan 2012 at 23:10

 一つ前のエントリ([Spring Roo]横幅の変更)で横幅を変更する方法を書きましたが、それでも対応しきれない場合は、コンテンツエリアにスクロールバーが表示されるようにする方法が考えられます。

 standard.css に下記を追加することで、コンテンツエリアにスクロールバーが表示されるようになります。

   1  .dijitTitlePaneContentInner {
   2      overflow: scroll;
   3  }

posted by Png akanuma on Sat 14 Jan 2012 at 09:58

 Rooではデフォルトの横幅が800pxになっていますが、表示項目数が多い場合や文字数が多い場合は、もっと横幅を広げたいと思うときがあります。そういう場合は standard.css の下記項目を変更することで広げることが出来ます。

   1  #wrapper {
   2  	width:800px;
   3  	min-width: 800px;
   4  	max-width: 800px;
   5  	margin-right: auto;
   6  	margin-left: auto;
   7  
   8  	/* fix max-width incompatibility in IE6 */
   9  	width:expression(document.body.clientWidth > 800? "800px": "auto" );
  10  	
  11  	overflow:hidden;
  12  	display:block;
  13  }

 上記で800となっているところを例えば900に変更することで、横幅を900pxに変更できます。

posted by Png akanuma on Sat 14 Jan 2012 at 09:48

 Spring Rooの最もベーシックな使い方はroo shell上でentityコマンドを使ってEntityを作成していくやり方ですが、既にDB上にテーブルが存在していて、そのテーブルをEntityとして使用するアプリケーションを作ることもできます。

 Rooのインストール、プロジェクトの作成、DBの接続設定までは同様の手順で行います。

Spring Roo Install
[Spring Roo]プロジェクト作成, Logging&DB接続設定

 これ以降の手順は下記ページを参考に実施していきます。

Chapter 9. Incremental Database Reverse Engineering (DBRE) Add-On

 Database Reverse Engineering(DBRE)アドオンには database introspect と database reverse engineer の2つのコマンドがありますが、いずれかを初めて実行した場合にはJDBCドライバのインストールを促すプロンプトが表示されます。

   1  com.example roo> database introspect --schema no-schema-required
   2  Located add-ons that may offer this JDBC driver
   3  2 found, sorted by rank; T = trusted developer; R = Roo 1.1 compatible
   4  ID T R DESCRIPTION -------------------------------------------------------------
   5  01 - Y 9.0.0.801_jdbc4_0001 PostgreSQL #jdbcdriver...
   6  02 Y Y 9.0.801.0001 Postgres #jdbcdriver driverclass:org.postgresql.Driver....
   7  --------------------------------------------------------------------------------
   8  [HINT] use 'addon info id --searchResultId ..' to see details about a search result
   9  [HINT] use 'addon install id --searchResultId ..' to install a specific search result, or
  10  [HINT] use 'addon install bundle --bundleSymbolicName TAB' to install a specific add-on version
  11  JDBC driver not available for 'org.postgresql.Driver'

 ここで addon info コマンドを使うことで検出されたドライバの詳細情報を見ることが出来ます。

   1  com.example roo> addon info id --searchResultId 01
   2  Name.........: spring-roo-postgres-jdbc4-wrapper
   3  BSN..........: org.postgresql.roo.wrapper.postgresql
   4  Version......: 9.0.0.801_jdbc4_0001
   5  Roo Version..: 1.1
   6  Ranking......: 0.0
   7  JAR Size.....: 546943 bytes
   8  PGP Signature: 0x36673F56 signed by Ingo Thierack (ingothierack@googlemail.com)
   9  OBR URL......: http://spring-roo-postgres-jdbc4-wrapper.googlecode.com/svn/repo/
  10                 repository.xml
  11  JAR URL......: httppgp://spring-roo-postgres-jdbc4-wrapper.googlecode.com/svn/re
  12                 po/org/postgresql/roo/wrapper/org.postgresql.roo.wrapper.postgres
  13                 ql/9.0-801.jdbc4.0001/org.postgresql.roo.wrapper.postgresql-9.0-8
  14                 01.jdbc4.0001.jar
  15  Description..: PostgreSQL #jdbcdriver driverclass:org.postgresql.Driver. This
  16                 bundle wraps the standard Maven artifact:
  17                 postgresql-9.0-801.jdbc4.

 最新のドライバをインストールするために、下記コマンドを実行します。

   1  com.example roo> addon install id --searchResultId 01
   2  Download URL 'http://spring-roo-postgres-jdbc4-wrapper.googlecode.com/svn/repo/org/postgresql/roo/wrapper/org.postgresql
   3  .roo.wrapper.postgresql/9.0-801.jdbc4.0001/org.postgresql.roo.wrapper.postgresql-9.0-801.jdbc4.0001.jar' failed
   4  This resource was signed with PGP key ID '0x36673F56', which is not currently trusted
   5  Use 'pgp key view' to view this key, 'pgp trust' to trust it, or 'pgp automatic trust' to trust any keys
   6  Target resource(s):
   7  -------------------
   8     spring-roo-postgres-jdbc4-wrapper (9.0.0.801_jdbc4_0001)
   9  
  10  Deploying...done.
  11  
  12  Unable to install add-on: spring-roo-postgres-jdbc4-wrapper [version: 9.0.0.801_jdbc4_0001]

 おや、インストールに失敗してしまいました。どうやらドライバのダウンロードURLのKeyが信頼されていないということのようです。pgp key view コマンドを使用してkeyの情報を表示します。

   1  com.example roo> pgp key view --keyId 0x36673F56
   2  >>>> KEY ID: 0x36673F56 <<<<
   3       More Info: http://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=index&search=0x36673F56
   4       Created: 2011-1-30 18:36:08 +0000
   5       Fingerprint: dc1a2679fc6a938d6681a61389a2afd036673f56
   6       Algorithm: RSA_GENERAL
   7       User ID: Ingo Thierack <ingothierack@googlemail.com>
   8            Signed By: Key 0x36673F56 - not locally trusted
   9       Subkey ID: 0x1A2EDAED [RSA_GENERAL]

 このKeyを信頼してダウンロードを可能にするために、下記コマンドを実行します。

   1  com.example roo> pgp trust --keyId 0x36673F56
   2  Added trust for key:
   3  >>>> KEY ID: 0x36673F56 <<<<
   4       More Info: http://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=index&search=0x36673F56
   5       Created: 2011-1-30 18:36:08 +0000
   6       Fingerprint: dc1a2679fc6a938d6681a61389a2afd036673f56
   7       Algorithm: RSA_GENERAL
   8       User ID: Ingo Thierack <ingothierack@googlemail.com>
   9            Signed By: Key 0x36673F56 (Ingo Thierack <ingothierack@googlemail.com>)
  10       Subkey ID: 0x1A2EDAED [RSA_GENERAL]

 そして再度インストールコマンドを実行します。

   1  com.example roo> addon install id --searchResultId 01
   2  Target resource(s):
   3  -------------------
   4     spring-roo-postgres-jdbc4-wrapper (9.0.0.801_jdbc4_0001)
   5  
   6  Deploying...done.
   7  
   8  Successfully installed add-on: spring-roo-postgres-jdbc4-wrapper [version: 9.0.0.801_jdbc4_0001]
   9  [Hint] Please consider rating this add-on with the following command:
  10  [Hint] addon feedback bundle --bundleSymbolicName org.postgresql.roo.wrapper.postgresql --rating ... --comment "..."

 無事にインストールできました。次にDBREアドオンのdatabase introspectコマンドでテーブルの情報を表示します。

   1  com.example roo> database introspect --schema public --file --enableViews

 出力内容は割愛しますが、XML形式でスキーマの情報が表示されます。

 そして実際にテーブル情報からEntityを作成するためにdatabase reverse engineerコマンドを実行します。

   1  com.example roo> database reverse engineer --schema public --package ~.domain --testAutomatically
   2  Created SRC_MAIN_RESOURCES\dbre.xml
   3  Updated ROOT\pom.xml
   4  Updated SRC_MAIN_RESOURCES\META-INF\persistence.xml
   5  Created SRC_MAIN_JAVA\com\example\domain
   6  Created SRC_MAIN_JAVA\com\example\domain\Access.java
   7  Created SRC_MAIN_JAVA\com\example\domain\Content.java
   8  Created SRC_TEST_JAVA\com\example\domain
   9  Created SRC_TEST_JAVA\com\example\domain\AccessDataOnDemand.java
  10  Created SRC_TEST_JAVA\com\example\domain\AccessIntegrationTest.java
  11  Created SRC_TEST_JAVA\com\example\domain\ContentDataOnDemand.java
  12  Created SRC_TEST_JAVA\com\example\domain\ContentIntegrationTest.java
  13  Created SRC_MAIN_JAVA\com\example\domain\Access_Roo_Configurable.aj
  14  Created SRC_MAIN_JAVA\com\example\domain\Access_Roo_Entity.aj
  15  Created SRC_MAIN_JAVA\com\example\domain\Access_Roo_DbManaged.aj
  16  Created SRC_MAIN_JAVA\com\example\domain\Access_Roo_ToString.aj
  17  Created SRC_MAIN_JAVA\com\example\domain\Content_Roo_Configurable.aj
  18  Created SRC_MAIN_JAVA\com\example\domain\Content_Roo_Entity.aj
  19  Created SRC_MAIN_JAVA\com\example\domain\Content_Roo_DbManaged.aj
  20  Created SRC_MAIN_JAVA\com\example\domain\Content_Roo_ToString.aj
  21  Created SRC_TEST_JAVA\com\example\domain\AccessDataOnDemand_Roo_Configurable.aj
  22  Created SRC_TEST_JAVA\com\example\domain\ContentDataOnDemand_Roo_DataOnDemand.aj
  23  Created SRC_TEST_JAVA\com\example\domain\AccessDataOnDemand_Roo_DataOnDemand.aj
  24  Created SRC_TEST_JAVA\com\example\domain\ContentIntegrationTest_Roo_Configurable.aj
  25  Created SRC_TEST_JAVA\com\example\domain\ContentIntegrationTest_Roo_IntegrationTest.aj
  26  Created SRC_TEST_JAVA\com\example\domain\ContentDataOnDemand_Roo_Configurable.aj
  27  Created SRC_TEST_JAVA\com\example\domain\AccessIntegrationTest_Roo_Configurable.aj
  28  Created SRC_TEST_JAVA\com\example\domain\AccessIntegrationTest_Roo_IntegrationTest.aj

 --schemaオプションで対象のDBスキーマを、--packageオプションでEntityを作成するパッケージを指定します。--testAutomaticallyを指定することでEntityのインテグレーションテストが自動的に作成されます。

 また、--excludeTablesオプションや--includeTablesオプションで対象のテーブルを特定のテーブルに限定することも出来ます。

 これ以降の手順は、roo shellからEntityを作成したあとと同じ手順でWebアプリケーションのセットアップなどを行うことが出来ます。

posted by Png akanuma on Tue 20 Dec 2011 at 08:34

 Cloud Foundryに申し込んで使えるようになったので、Spring Roo in Actionの11章を参考にRooのアプリケーションをデプロイしてみました。

 まずはroo shellからCloud Foundryを走査するためのAddonをインストールします。インストールの間自動的に認証されるよう、下記コマンドを実行します。

   1  roo> pgp automatic trust
   2  Automatic PGP key trusting enabled (this is potentially unsafe); disable by typing 'pgp automatic trust' again

そして下記コマンドでAddonをインストールします。

   1  roo> addon install bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry;1.1.5.RELEASE
   2  Target resource(s):
   3  -------------------
   4     Spring Roo - Addon - Cloud Foundry (1.1.5.RELEASE)
   5  
   6  Required resource(s):
   7  ---------------------
   8     Spring Beans (3.0.5.RELEASE)
   9     jcl-over-slf4j (1.6.1)
  10     slf4j-nop (1.6.1)
  11     Spring AOP (3.0.5.RELEASE)
  12     Servlet Specification API (2.5.0)
  13     Spring Core (3.0.5.RELEASE)
  14     Jackson JSON processor (1.6.2)
  15     Data mapper for Jackson JSON processor (1.6.2)
  16     Spring Context (3.0.5.RELEASE)
  17     Spring Roo - Wrapping - aopalliance (1.0.0.0010)
  18     Spring Web (3.0.5.RELEASE)
  19     slf4j-api (1.6.1)
  20     Spring Roo - Wrapping - Cloud Foundry API (0.0.1.0010)
  21  
  22  Optional resource(s):
  23  ---------------------
  24     Spring Expression Language (3.0.5.RELEASE)
  25     Spring ASM (3.0.5.RELEASE)
  26  
  27  Deploying...done.
  28  
  29  Successfully installed add-on: Spring Roo - Addon - Cloud Foundry [version: 1.1.5.RELEASE]
  30  [Hint] Please consider rating this add-on with the following command:
  31  [Hint] addon feedback bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry --rating ... --comment "..
  32  ."

Roo in Actionの例では "addon install bundle --bundleSymbolicName org.springframework.roo.addon.cloud.foundry" という感じにバージョン番号を指定していないのですが、これだと最新のバージョンがインストールされます。今回のケースではSpring Rooのバージョンが1.1.5なので、Addonのインストールでもバージョンを1.1.5に指定しないとこの時点の最新である1.2.0.RC1がインストールされてしまい、うまくいきません。

インストールが終了したら自動認証をOFFに戻します。

   1  roo> pgp automatic trust
   2  Automatic PGP key trusting disabled (this is the safest option)

Addonをインストールしたことでcloud foundryコマンドが使用できるようになっています。まずはCloud Foundryにログインします。

   1  roo> cloud foundry login --email xxxxxxxxxx@xxxxx.xxx --password xxxxxxxxxx
   2  Credentials saved.
   3  Logged in successfully with email address 'xxxxxxxxxx@xxxxx.xxx'

Cloud Foundryの環境についての情報を表示するには下記コマンドを実行します。

   1  roo> cloud foundry info
   2  
   3  
   4  VMware's Cloud Application Platform
   5  For support visit http://support.cloudfoundry.com
   6  
   7  
   8  Target:     http://api.cloudfoundry.com (0.999)
   9  
  10  
  11  User:     hiroaki.akanuma@gmail.com
  12  Usage:     Memory (128MB of 2048MB total)
  13       Services (0 of 16 total)
  14       Apps (1 of 20 total)

現在デプロイされているアプリケーションのリストは下記コマンドで確認できます。

   1  roo> cloud foundry list apps
   2  
   3  =================================== Applications ===================================
   4  
   5  Name             Status      Instances     Services     URLs
   6  ----             ------      ---------     --------     ----
   7  akanumahello     STARTED     1                          akanumahello.cloudfoundry.com

上記の出力では akanumahello というアプリケーションがすでにデプロイされていることが分かります。

また、現在使用可能なサービスのリストは下記コマンドで確認できます。

   1  roo> cloud foundry list services
   2  
   3  ======================= System Services ========================
   4  
   5  Service        Version     Description
   6  -------        -------     -----------
   7  mysql          5.1         MySQL database service
   8  postgresql     9.0         PostgreSQL database service (vFabric)
   9  mongodb        1.8         MongoDB NoSQL store
  10  redis          2.2         Redis key-value store service
  11  rabbitmq       2.4         RabbitMQ messaging service
  12  
  13  
  14  There are currently no provisioned services.

ではアプリケーションをデプロイしてみます。cloud foundry deploy コマンドでデプロイすることができます。

   1  roo> cloud foundry deploy --appName cftest --path CREATE
   2  ~~中略~~
   3  Operation could not be completed: 400 Bad Request

上記のように 400 Bad Request となってしまった場合は、--appName で指定したアプリケーション名がすでに使われているということなので、アプリケーション名を変更して再度デプロイします。

   1  roo> cloud foundry deploy --appName cftestaka --path CREATE
   2  ~~中略~~
   3  The application 'cftestaka' was successfully pushed

上記のように successfully pushed と出力されればデプロイ成功です。アプリケーションの一覧を確認してみます。

   1  roo> cloud foundry list apps
   2  
   3  =================================== Applications ===================================
   4  
   5  Name             Status      Instances     Services     URLs
   6  ----             ------      ---------     --------     ----
   7  akanumahello     STARTED     1                          akanumahello.cloudfoundry.com
   8  cftestaka        STOPPED     1                          cftestaka.cloudfoundry.com

cftestakaというアプリケーションが一覧に追加されています。StatusがSTOPPEDになっていてまだ起動はしていないので、下記コマンドでアプリケーションを起動します。

   1  roo> cloud foundry start app --appName cftestaka
   2  The application 'cftestaka' was successfully started
   3  roo> cloud foundry list apps
   4  
   5  =================================== Applications ===================================
   6  
   7  Name             Status      Instances     Services     URLs
   8  ----             ------      ---------     --------     ----
   9  akanumahello     STARTED     1                          akanumahello.cloudfoundry.com
  10  cftestaka        STARTED     1                          cftestaka.cloudfoundry.com

Status が STARTED に変わり、アプリケーションが起動されました。http://cftestaka.cloudfoundry.com/ にアクセスしてトップページが表示されれば起動に成功しています。

稼働中のアプリケーションの統計情報については下記コマンドで確認できます。

   1  roo> cloud foundry view app stats --appName cftestaka
   2  
   3  ============================== App. Stats ==============================
   4  
   5  Instance     CPU (Cores)     Memory (limit)     Disk (limit)      Uptime
   6  --------     -----------     --------------     ------------      ------
   7  0            8.0 (4)         239.09M (256M)     28.0M (2048M)     0d:

さて、アプリケーションは起動しましたが、まだDBが使えるようになっていないので、Entityを操作するための画面に遷移しようとするとエラーになってしまいます。

まずはDBをサービスとして作成します。

   1  roo> cloud foundry create service --serviceName cftesakadb --serviceType postgresql
   2  The service 'cftesakadb' was successfully created

サービスの一覧を確認すると、= Provisioned Services = の部分にサービスが追加になっています。

   1  roo> cloud foundry list services
   2  
   3  ======================= System Services ========================
   4  
   5  Service        Version     Description
   6  -------        -------     -----------
   7  mysql          5.1         MySQL database service
   8  postgresql     9.0         PostgreSQL database service (vFabric)
   9  mongodb        1.8         MongoDB NoSQL store
  10  redis          2.2         Redis key-value store service
  11  rabbitmq       2.4         RabbitMQ messaging service
  12  
  13  
  14  
  15  = Provisioned Services =
  16  
  17  Name           Service
  18  ----           -------
  19  cftesakadb     postgresql

次に、作成したサービスをアプリケーションに紐付けます。

   1  roo> cloud foundry bind service --serviceName cftesakadb --appName cftestaka
   2  The service 'cftesakadb' was successfully bound to the application 'cftestaka'
   3  roo>

そしてアプリケーションを再起動します。

   1  roo> cloud foundry restart app --appName cftestaka
   2  The application 'cftestaka' was successfully restarted

これでアプリケーションがDBを使えるようになり、EntityのCRUD画面も動作するようになります。

アプリケーションのログを確認するには下記コマンドを実行します。

   1  roo> cloud foundry view logs --appName cftestaka --instance 0

長いので出力は省略しますが、stderr.logとstdout.logが閲覧できます。

それと現在のメモリの割当量は下記コマンドで確認できます。

   1  roo> cloud foundry view app memory --appName cftestaka
   2  
   3  = Application Memory =
   4  
   5  Name          Memory
   6  ----          ------
   7  cftestaka     256MB

現在は256MBのメモリが割り当てられています。この割当量を変更するには下記のようにコマンドを実行します。

   1  roo> cloud foundry update app memory --appName cftestaka --memSize 512MB
   2  
   3  = Application Memory =
   4  
   5  Name          Memory
   6  ----          ------
   7  cftestaka     512MB

メモリ量が512MBに変更されました。

RooとCloud Foundryの組み合わせなら簡単なCRUDアプリの公開はとてもスピーディーに行うことができそうです。まだCloud Foundryはベータ版なので、正式版になったときに料金体系などがどうなるかは気になりますが、Roo + Cloud Foundryで何か公開できるようなサービスでも作れないかなぁと思っています。

posted by Png akanuma on Mon 12 Dec 2011 at 00:01

 名前は聞いたことがあったもののどんなものかよく分かってなかったので、下記チュートリアルページを参考にCloud Foundryを触ってみました。

VMware Cloud Foundry入門 - Getting Started (Japanese)

 Cloud FoundryはVMwareが提供しているオープンソースのPaaSフレームワークで、ソースコードを取得してPaaS環境を構築できるほか、VMwareがvSphereデータセンター内で運営しているCloud Foundryのホステッド環境に接続することができます。現在はβ版ということで、無料で利用できるようです。

 まずは http://www.cloudfoundry.com/ でメールアドレスを登録してサインアップ。すぐに「Welcome to Cloud Foundry」という件名のメールが届きますが、これは登録を受け付けたというだけで、実際にアカウントが用意されて使用可能になるのはしばらくして「Welcome to Cloud Foundry - Your signup is approved!」という件名のメールでパスワードが届いてからになります。私の場合は2日ほどで届きました。

 とりあえず自宅PCのWindows環境で試してみました。まず http://www.rubyinstaller.org/ から rubyinstaller-1.9.3-p0.exe をダウンロードしてRubyをインストールします。

   1  C:\Users\akanuma>ruby -version
   2  ruby 1.9.3p0 (2011-10-30) [i386-mingw32]
   3  -e:1:in `<main>': undefined local variable or method `rsion' for main:Object (NameError)

なにやらエラーが出ていますが、とりあえず続行。

Cloud FoundryのCLIであるvmcをインストールします。

   1  C:\Users\akanuma>gem install vmc
   2  Fetching: spruz-0.2.13.gem (100%)
   3  Fetching: json_pure-1.5.4.gem (100%)
   4  Fetching: rubyzip2-2.0.1.gem (100%)
   5  Fetching: mime-types-1.17.2.gem (100%)
   6  Fetching: rest-client-1.6.7.gem (100%)
   7  Fetching: terminal-table-1.4.4.gem (100%)
   8  Fetching: interact-0.2.gem (100%)
   9  Fetching: vmc-0.3.13.gem (100%)
  10  Successfully installed spruz-0.2.13
  11  Successfully installed json_pure-1.5.4
  12  Successfully installed rubyzip2-2.0.1
  13  Successfully installed mime-types-1.17.2
  14  Successfully installed rest-client-1.6.7
  15  Successfully installed terminal-table-1.4.4
  16  Successfully installed interact-0.2
  17  Successfully installed vmc-0.3.13
  18  8 gems installed
  19  Installing ri documentation for spruz-0.2.13...
  20  Installing ri documentation for json_pure-1.5.4...
  21  Installing ri documentation for rubyzip2-2.0.1...
  22  Installing ri documentation for mime-types-1.17.2...
  23  Installing ri documentation for rest-client-1.6.7...
  24  unable to convert "\xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for README.rdoc, skipping
  25  Installing ri documentation for terminal-table-1.4.4...
  26  Installing ri documentation for interact-0.2...
  27  Installing ri documentation for vmc-0.3.13...
  28  Installing RDoc documentation for spruz-0.2.13...
  29  Installing RDoc documentation for json_pure-1.5.4...
  30  Installing RDoc documentation for rubyzip2-2.0.1...
  31  Installing RDoc documentation for mime-types-1.17.2...
  32  Installing RDoc documentation for rest-client-1.6.7...
  33  unable to convert "\xE2" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J for README.rdoc, skipping
  34  Installing RDoc documentation for terminal-table-1.4.4...
  35  Installing RDoc documentation for interact-0.2...
  36  Installing RDoc documentation for vmc-0.3.13...

vmcのtargetコマンドでデプロイ対象を api.cloudfoundry.com に設定します。

   1  C:\Users\akanuma>vmc target api.cloudfoundry.com
   2  Succesfully targeted to [http://api.cloudfoundry.com]

続けてログインコマンドを実行します。

   1  C:\Users\akanuma>vmc login
   2  Email: xxxxxxxxxx@xxxxx.xxx
   3  Password: ********
   4  Successfully logged into [http://api.cloudfoundry.com]

そしてアプリケーションを作成するためのディレクトリを作成して移動します。

   1  C:\Users\akanuma>mkdir hello
   2  C:\Users\akanuma>cd hello
   3  C:\Users\akanuma\hello>

次にhllo.rbという名前で下記内容のファイルを作成します。文字コードはUTF-8で、改行コードはLFにしないと失敗するようです。

   1  require 'sinatra'
   2  get '/' do
   3    "Hello from Cloud Foundry!"
   4  end

アプリケーションをデプロイします。vmc pushコマンドを実行すると追加の情報入力用のプロンプトが表示されますので、それぞれ下記のように入力します。

   1  C:\Users\akanuma\hello>vmc push
   2  Would you like to deploy from the current directory? [Yn]:
   3  Application Name: akanumahello
   4  Application Deployed URL ["akanumahello.cloudfoundry.com"]:
   5  Detected a Sinatra Application, is this correct? [Yn]:
   6  Memory Reservation ("64M", "128M", "256M", "512M", "1G", "2G") ["128M"]:
   7  Creating Application: OK
   8  Would you like to bind any services to 'akanumahello'? [yN]:
   9  Uploading Application:
  10    Checking for available resources: OK
  11    Packing application: OK
  12    Uploading (0K): OK
  13  Push Status: OK
  14  Staging Application: OK
  15  Starting Application: OK

無事デプロイされたようです。ブラウザで http://akanumahello.cloudfoundry.com/ にアクセスして「Hello from Cloud Foundry!」と表示されればひとまず成功です。

続けて変更を加えてみます。hello.rbの "Hello from Cloud Foundry!" を "Hello from Cloud Foundry and VMware!" に変更して保存します。そして下記コマンドでサーバ上に変更を反映します。

   1  C:\Users\akanuma\hello>vmc update akanumahello
   2  Uploading Application:
   3    Checking for available resources: OK
   4    Packing application: OK
   5    Uploading (0K): OK
   6  Push Status: OK
   7  Stopping Application: OK
   8  Staging Application: OK
   9  Starting Application: OK

ブラウザで再度表示を確認して、変更が反映されていれば成功です。

このチュートリアルを試す限りは簡単にアプリケーションを公開できそうです。メモリも2GBまでは使えるようですので、あまり負荷の高くないアプリケーションであれば十分に使えそうです。

posted by Png akanuma on Sun 11 Dec 2011 at 18:57

 前回まででEntityの作成まで終わったので、Webアプリケーションとして動作させるためのメモです。

以前のエントリはこちら
Spring Roo Install
[Spring Roo]プロジェクト作成, Logging&DB接続設定
[Spring Roo]Entity作成

・roo shell上でwebコマンドを実行することで、Webアプリケーションとして動作するために必要なファイルが生成されます。

   1  roo> web mvc setup
   2  Created SRC_MAIN_WEBAPP\WEB-INF\spring
   3  Created SRC_MAIN_WEBAPP\WEB-INF\spring\webmvc-config.xml
   4  Created SRC_MAIN_WEBAPP\WEB-INF\web.xml
   5  Updated SRC_MAIN_WEBAPP\WEB-INF\spring\webmvc-config.xml
   6  Created SRC_MAIN_WEBAPP\images
   7  Created SRC_MAIN_WEBAPP\images\create.png
   8  Created SRC_MAIN_WEBAPP\images\list.png
   9  Created SRC_MAIN_WEBAPP\images\resultset_previous.png
  10  Created SRC_MAIN_WEBAPP\images\resultset_next.png
  11  Created SRC_MAIN_WEBAPP\images\show.png
  12  Created SRC_MAIN_WEBAPP\images\favicon.ico
  13  Created SRC_MAIN_WEBAPP\images\delete.png
  14  Created SRC_MAIN_WEBAPP\images\resultset_first.png
  15  Created SRC_MAIN_WEBAPP\images\springsource-logo.png
  16  Created SRC_MAIN_WEBAPP\images\resultset_last.png
  17  Created SRC_MAIN_WEBAPP\images\add.png
  18  Created SRC_MAIN_WEBAPP\images\banner-graphic.png
  19  Created SRC_MAIN_WEBAPP\images\update.png
  20  Created SRC_MAIN_WEBAPP\styles
  21  Created SRC_MAIN_WEBAPP\styles\alt.css
  22  Created SRC_MAIN_WEBAPP\styles\standard.css
  23  Created SRC_MAIN_WEBAPP\WEB-INF\classes
  24  Created SRC_MAIN_WEBAPP\WEB-INF\classes\standard.properties
  25  Created SRC_MAIN_WEBAPP\WEB-INF\classes\alt.properties
  26  Created SRC_MAIN_WEBAPP\WEB-INF\layouts
  27  Created SRC_MAIN_WEBAPP\WEB-INF\layouts\default.jspx
  28  Created SRC_MAIN_WEBAPP\WEB-INF\layouts\layouts.xml
  29  Created SRC_MAIN_WEBAPP\WEB-INF\views
  30  Created SRC_MAIN_WEBAPP\WEB-INF\views\header.jspx
  31  Created SRC_MAIN_WEBAPP\WEB-INF\views\footer.jspx
  32  Created SRC_MAIN_WEBAPP\WEB-INF\views\views.xml
  33  Created SRC_MAIN_WEBAPP\WEB-INF\views\index.jspx
  34  Created SRC_MAIN_WEBAPP\WEB-INF\views\index-template.jspx
  35  Created SRC_MAIN_WEBAPP\WEB-INF\views\uncaughtException.jspx
  36  Created SRC_MAIN_WEBAPP\WEB-INF\views\resourceNotFound.jspx
  37  Created SRC_MAIN_WEBAPP\WEB-INF\views\dataAccessFailure.jspx
  38  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form
  39  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\update.tagx
  40  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\create.tagx
  41  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\dependency.tagx
  42  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\show.tagx
  43  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\list.tagx
  44  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\find.tagx
  45  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields
  46  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\select.tagx
  47  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\display.tagx
  48  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\column.tagx
  49  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\editor.tagx
  50  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\checkbox.tagx
  51  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\simple.tagx
  52  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\input.tagx
  53  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\textarea.tagx
  54  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\datetime.tagx
  55  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\table.tagx
  56  Created SRC_MAIN_WEBAPP\WEB-INF\tags\form\fields\reference.tagx
  57  Created SRC_MAIN_WEBAPP\WEB-INF\tags\menu
  58  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util
  59  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\pagination.tagx
  60  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\theme.tagx
  61  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\placeholder.tagx
  62  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\panel.tagx
  63  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\language.tagx
  64  Created SRC_MAIN_WEBAPP\WEB-INF\tags\util\load-scripts.tagx
  65  Created SRC_MAIN_WEBAPP\WEB-INF\i18n
  66  Created SRC_MAIN_WEBAPP\WEB-INF\i18n\messages.properties
  67  Created SRC_MAIN_WEBAPP\images\en.png
  68  Updated SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties
  69  Updated SRC_MAIN_WEBAPP\WEB-INF\web.xml
  70  Updated ROOT\pom.xml [added dependencies org.springframework:spring-web:${spring.version}, org.springframework:spring-we
  71  bmvc:${spring.version}, org.springframework.webflow:spring-js-resources:2.2.1.RELEASE, commons-digester:commons-digester
  72  :2.0, commons-fileupload:commons-fileupload:1.2.1, javax.servlet.jsp.jstl:jstl-api:1.2, org.glassfish.web:jstl-impl:1.2,
  73  javax.el:el-api:1.0, joda-time:joda-time:1.6, javax.servlet.jsp:jsp-api:2.1, commons-codec:commons-codec:1.4; updated p
  74  roject type to war; added dependencies org.apache.tiles:tiles-core:2.2.1, org.apache.tiles:tiles-jsp:2.2.1]
  75  Updated SRC_MAIN_WEBAPP\WEB-INF\views\footer.jspx

  • Webアプリケーションに必要なweb.xmlなどのファイルが生成されました。

  • また、Rooで作成されるのはSpringMVCアプリケーションですので、webmvc-config.xmlなどのSpringMVCのファイルも生成されます。

  • さらにデフォルトの画面を表示するためのファイルも生成されています。Rooで生成されるSpringMVCアプリケーションでは画面表示にtilesとjspxを使用しているため、デフォルト画面や共通のヘッダ、フッタ用のjspxファイルやtagxファイルが生成されました。CSSや画像ファイルも生成されます。

  • 次に各EntityのControllerを作成していきます。Project EntityのControllerを作成するには下記のようにcontroller scaffoldコマンドを実行します。

   1  roo> controller scaffold --class ~.web.ProjectController --entity ~.model.Project
   2  Created SRC_MAIN_JAVA\com\example\web
   3  Created SRC_MAIN_JAVA\com\example\web\ProjectController.java
   4  Updated SRC_MAIN_WEBAPP\WEB-INF\spring\webmvc-config.xml
   5  Created SRC_MAIN_JAVA\com\example\web\ApplicationConversionServiceFactoryBean.java
   6  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects
   7  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects\views.xml
   8  Updated SRC_MAIN_WEBAPP\WEB-INF\views\projects\views.xml
   9  Created SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx
  10  Created SRC_MAIN_WEBAPP\WEB-INF\tags\menu\menu.tagx
  11  Created SRC_MAIN_WEBAPP\WEB-INF\tags\menu\item.tagx
  12  Created SRC_MAIN_WEBAPP\WEB-INF\tags\menu\category.tagx
  13  Updated SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx
  14  Updated SRC_MAIN_WEBAPP\WEB-INF\views\projects\views.xml
  15  Updated SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx
  16  Updated SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties
  17  Created SRC_MAIN_JAVA\com\example\web\ProjectController_Roo_Controller.aj
  18  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects\list.jspx
  19  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects\show.jspx
  20  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects\create.jspx
  21  Created SRC_MAIN_WEBAPP\WEB-INF\views\projects\update.jspx
  22  Created SRC_MAIN_JAVA\com\exampler\web\ApplicationConversionServiceFactoryBean_Roo_ConversionService.aj

  • --classオプションでControllerクラス名を指定し、--entityオプションで対象になるEntityを指定します。上記の例ではProjectControllerという名前のControllerクラスが作成されました。また、Project Entityに対するCRUD画面表示用のjspxファイルや、tilesの設定ファイルも生成されています。

  • これだけでProject Entityに対する一覧表示、詳細表示、作成、更新、削除の画面・機能が一通り提供されてしまいます。

  • 同様に各Entityに対してControllerを生成します。

  • これでWebアプリケーションとして動作するようになりましたので、コマンドプロンプトからmvnコマンドを実行してアプリケーションを起動します。(roo shellではなくコマンドプロンプトです。)

   1  >mvn jetty:run

  • Webブラウザから下記のURLでアクセスすることが出来ます。

   1  http://localhost:8080/example

  • 画面左側のメニューから各Entityの操作が可能になっています。
posted by Png akanuma on Thu 1 Dec 2011 at 08:27

 以前のエントリでProjectの作成まで書いたので、Entity作成についてのメモです。

以前のエントリはこちら
Spring Roo Install
[Spring Roo]プロジェクト作成, Logging&DB接続設定

  • roo shell上でentityコマンドを実行することでEntityが作成されます。下記はProjectというEntityを作成する例です。

   1  roo> entity --class ~.model.Project --testAutomatically
   2  Created SRC_MAIN_JAVA\com\example\model
   3  Created SRC_MAIN_JAVA\com\example\model\Project.java
   4  Created SRC_TEST_JAVA\com\example\model
   5  Created SRC_TEST_JAVA\com\example\model\ProjectDataOnDemand.java
   6  Created SRC_TEST_JAVA\com\example\model\ProjectIntegrationTest.java
   7  Created SRC_MAIN_JAVA\com\example\model\Project_Roo_Configurable.aj
   8  Created SRC_MAIN_JAVA\com\example\model\Project_Roo_Entity.aj
   9  Created SRC_MAIN_JAVA\com\example\model\Project_Roo_ToString.aj
  10  Created SRC_TEST_JAVA\com\example\model\ProjectDataOnDemand_Roo_Configurable.aj
  11  Created SRC_TEST_JAVA\com\example\model\ProjectDataOnDemand_Roo_DataOnDemand.aj
  12  Created SRC_TEST_JAVA\com\example\model\ProjectIntegrationTest_Roo_Configurable.aj
  13  Created SRC_TEST_JAVA\com\example\model\ProjectIntegrationTest_Roo_IntegrationTest.aj

  • com.exampleパッケージの下にmodelパッケージが作成され、その下にProjectクラス(Project.java)が作成されます。そしてそれに関連するjavaクラスファイル、AspectJのファイルやテストクラスが自動生成されます。

  • 続いてEntity内の各プロパティを追加していきます。Entity作成直後はそのEntityにフォーカスがあたっていますが、他のEntityの作業をしたあとなど、対象のEntityにフォーカスがあたっていない場合は、focusコマンドで対象のEntityにフォーカスを当てます。

   1  roo> focus --class ~.model.Project

  • チルダ(~)はベースのパッケージを表すので、ここではcom.exampleにあたります。roo shellのプロンプトが下記のようになっていればProject Entityにフォーカスがあたっています。

   1  ~.model.Project roo>

  • プロパティの追加はfieldコマンドで行います。下記は文字列型のnameというプロパティを追加する例です。

   1  ~.model.Project roo> field string --fieldName name
   2  Updated SRC_MAIN_JAVA\com\example\model\Project.java
   3  Created SRC_MAIN_JAVA\com\example\model\Project_Roo_JavaBean.aj
   4  Updated SRC_TEST_JAVA\com\example\model\ProjectDataOnDemand_Roo_DataOnDemand.aj
   5  Updated SRC_MAIN_JAVA\com\example\model\Project_Roo_ToString.aj

  • Project.javaがと関連するファイルが更新・作成されます。

  • プロパティに最大文字数やNull禁止の制約をつけたい場合には、プロパティ追加時に下記のようなオプションを追加します。

   1  ~.model.Project roo> field string --fieldName name --notNull --sizeMax 30
   2  Updated SRC_MAIN_JAVA\com\example\model\Project.java
   3  Updated SRC_TEST_JAVA\com\example\model\ProjectDataOnDemand_Roo_DataOnDemand.aj
   4  Created SRC_MAIN_JAVA\com\example\model\Project_Roo_JavaBean.aj
   5  Updated SRC_MAIN_JAVA\com\example\model\Project_Roo_ToString.aj

  • 上記の例は最大文字数は30文字でNullは禁止する例です。

  • 数値型のプロパティを追加する場合には型としてnumberを指定し、--typeオプションでJavaのクラスを指定します。

   1  ~.model.Project roo> field number --fieldName cnt --type java.lang.Integer

  • 日付型の場合もJavaのクラス名をあわせて指定します。

   1  ~.model.Project roo> field date --fieldName createdTime --type java.util.Date

  • 他のクラスへの関連をプロパティとして持つには、fieldコマンドの型の指定でsetを指定し、--typeで対象のクラス、--cardinalityオプションで関連の持ち方、--mappedByオプションでもう一方のEntityからこのEntityを参照するためのフィールド名を指定します。下記はProject EntityがSubProject Entityへの関連を一対多で持つ例です。SubProject Entityからはprojectというフィールド名でProject Entityを参照します。

   1  ~.model.Project roo> field set --fieldName subProjects --type ~.model.SubProject --cardinality ONE_TO_MANY --mappedBy project

  • 関連が多対一の場合には上記コマンドの--cardinalityをMANY_TO_ONEに、多対多の場合にはMANY_TO_MANYに変更します。

  • ここまでを必要なEntityとプロパティに対して実行すれば、アプリケーションの起動時に対応するテーブルがDBに作成されます。

posted by Png akanuma on Wed 30 Nov 2011 at 08:38

Mahout in Action Chapter 4 についてのメモ。

4.2 ユーザベースの推薦の詳細

4.2.1 アルゴリズム

  • ユーザにアイテムを推薦する処理は下記のとおり。ユーザは u で表されている

   1  for every item i that u has no preference for yet
   2    for every other user v that has a preference for i
   3      compute a similarity s between u and v
   4      incorporate preference of v for i, weighted by s, into a running average
   5  return the top items, ranked by weighted average

  • 外側のループはユーザがまだ嗜好度を持っていない、推薦対象になりうるアイテムすべてに対するもの

  • 内側のループはこの推薦対象になりうるアイテムについて嗜好度を持っているユーザに対するもので、その嗜好度を参照している

  • 最後にそれらの値の平均値を計算し、重み平均とする

  • それぞれの嗜好値はそのユーザがターゲットのユーザとどれぐらい類似しているかの平均値から重み付けされる

  • ユーザが類似しているほど、重みが嗜好度に加えられる

  • すべてのアイテムについて検証するのはひどく遅い。

  • 実際は最も類似しているユーザを計算した後、そのユーザに知られているアイテムのみについて検討される

   1  for every other user w
   2    compute a similarity s between u and w
   3    retain the top users, ranked by similarity, as a neighborhood n
   4  for every item i that some user in n has ap preference for, but that u has no preference for yet
   5    for every other user v in n that has a preference for i
   6      compute a similarity s between u and v
   7      incorporate preference of v for i, weighted by s, into a running averate

  • 一番の違いは最も類似しているユーザが何に興味を持っているかを探す前に、類似しているユーザを探している点

  • これは基本的なユーザベースの推薦アルゴリズムで、Mahoutにも実装されている

4.2.2 GenericUserBasedRecommenderによるアルゴリズムの実装

  • Mahoutは推薦エンジンを構築するためのコンポーネントの集合で、以下のようなコンポーネントから構成されている

   1  データモデル, DataModelによって実装される
   2  ユーザ同士の類似度, UserSimilarityによって実装される
   3  近隣者の定義, UserNeighborhoodによって実装される
   4  推薦エンジン, Recommenderによって実装される(ここではGenericUserBasedRecommender)

4.2.3 GroupLensによる探索

  • GroupLensのデータを処理するためにはGroupLensDataModelを使えばよい

   1  DataModel model = 
   2    new GroupLensDataModel(new File("ratings.dat"));
   3  UserSimilarity similarity = 
   4    new PearsonCorrelationSimilarity(model);
   5  UserNeighborhood neighborhood = 
   6    new NearestNUserNeighborhood(100, similarity, model);
   7  Recommender recommender = 
   8    new GenericUserBasedRecommender(model, neighborhood, similarity);
   9  LoadEvaluator.runLoad(recommender);

  • このコードを動かすと、OutOfMemoryErrorが発生するので、メモリを増やす必要がある

4.2.5 サイズ固定のneighborhood

  • 類似度が高い順にN個のデータが使われる

4.2.6 閾値ベースのneighborhood

  • 類似度の閾値を決めてそれ以上の類似度を持つユーザを取り出すことが可能

4.3 類似度の測定方法の詳細

  • ユーザベースの推薦で他に重要なのはUserSimilarity実装。ユーザベースの推薦の大部分はこのコンポーネントに依存している

4.3.1 ピアソン相関ベースの類似度

  • ピアソン相関は -1 から 1 までの数値で、2組の配列の傾向を測定するもので、線形の関係になる

  • この傾向が高い場合は相関係数は1に近づく

  • すべての値において関連が小さい場合は、相関係数は0に近づく

  • 関連がまったく逆の場合、一方の組の値が高くなるときに他方の値が小さくなるようなケースでは、相関係数は-1に近づく

  • 類似度の計算は双方のユーザがそのアイテムに対して嗜好度を持っている場合のみ可能

4.3.2 ピアソン相関の問題点

  • ユーザ間で一致するアイテムの数を評価に加えないことが、推薦エンジンとしては欠点

  • ユーザ間で一致するアイテムがひとつしかない場合、相関は計算されない

  • 全ての嗜好度が同一のユーザについては相関が計算されない

4.3.3 重み付けを使う

  • PearsonCorrelationSimilarityは重みを追加して、ピアソン相関の問題点を軽減する

  • PearsonCorrelationSimilarityのコンストラクタの第二引数にWeighting.WEIGHTEDを渡すことができ、これによってデータ数が多い場合には1.0方向へ、少ない場合には-1.0方向へ補正される

ユークリッド距離による類似度の定義

  • 前述のサンプルコードのUserSimilarity実装部分を変更してEuclideanDistanceSimilarityを使用する

   1  new EuclideanDistanceSimilarity(model)

  • この実装はユーザ間の距離を基にしている

  • ユーザがより類似している場合にこの値は小さくなる

  • この実装が実際に戻す値は 1 / (1 + distance)

コサイン測定による類似性の適用

  • 空間にポイントされ可視化された嗜好度データによる類似度計測方法

  • ユーザ間の類似度が低い場合、それぞれの嗜好度を表す線の距離は広がり、角度も大きくなる

  • この角度のコサインが類似度を導く

  • コサイン値は常に -1 から 1 の間で、小さい角度の場合は 1 に近づき、180度近い大きい角度の場合は -1 に近づく

  • これは良いことで、小さい角度の場合は類似度が高いということで 1 に近く、大きい角度の場合は -1 に近づくということだからである

  • コサイン測定による類似度の測定はよく強調フィルタリングによる調査と関連付けられる

  • この類似度測定法を使用するにはPearsonCorrelationSimilarityを使うだけでよい

スピアマン相関での相対的階級による類似度定義

  • スピアマン相関はわれわれの目的にとってはピアソン相関の興味深い変種

  • オリジナルの相関嗜好度データの相関ではなく、嗜好度データの相対ランクに基づいて相関を計算する

  • このプロセスはいくつかの情報を失うが、嗜好度データの本質である順位付けは維持され、正確な嗜好度合いについての情報は失われる

  • SpearmanCorrelationSimilarityはこの考えを実装する

  • 前出のサンプルコードのUserSimilarityの実装でSpearmanCorrelationalSimilarityを使うことで試すことができる

  • この実装は計算のために簡単ではない処理を行いランクを保存しなければならないため、かなり遅い

  • しかしながら小さいデータセットに対しては向いているかもしれない

  • CachingUserSimilarityは他のUserSimirality実装をラップするUserSimilarity実装で、その実行結果をキャッシュする

  • 計算処理はラップしているUserSimilarity実装に委譲し、その結果を内部的に保持しておく

   1  UserSimilarity similarity = new CashingUserSimilarity(
   2      new SpearmanCorrelationSimilarity(model), model)

  • evaluate()のtrainingPercentage引数を0.95から0.99に増やすことで、テストデータの量を5%から1%に減らすことで計算量を減らすことができる

  • これによって計算にかかる時間を数十分にすることができる

谷本係数により類似度の中の嗜好度データを無視する

  • おもしろいことに、嗜好度をすべて無視するUserSimilarity実装がある

  • TanimotoCoefficientSimilarityはその実装のひとつで、谷本係数を基にしている。この値はジャカール係数としても知られている

  • この値は嗜好性のあるアイテムの集合のうち、共通する部分の比率になる

  • 二人のユーザのアイテムが完全に一致するとき、結果は1.0になり、共通部分がないとき、0.0になる。結果がマイナスになることはないが問題ない

  • 結果を次の簡単な計算によって -1 から 1 の範囲に拡張することが出来る
     similarity = 2・similarity - 1

  • この計測方法は両方のユーザが嗜好度を持っているアイテムだけでなく、一方が嗜好度をもっているアイテムにも依存することに注意

  • この類似度計測方法を使う場合は、基になるデータにはブール値(Boolean)の嗜好度データのみを含める

対数尤度によるよりスマートな類似度の計算

  • 対数尤度による類似度は、谷本係数のように二人のユーザに共通するアイテムの数を基にしているが、その他に多くの重複がある可能性がどれくら低いか、アイテムの総数、それぞれのユーザが嗜好性を持っているアイテムの数も含んでいる

  • 二人のユーザ間での偶然による重複がどれくらい起こり得ないかを評価しようとするもの。すなわち、類似しないユーザ間で同じ映画に対する評価をもつことはあるが、類似しているユーザが全くありそうもない共通点を見せることがあるということ。

  • いくつかの統計的検定で、この類似度計測手法は二人のユーザ間でどれぐらい強く類似することがありそうもないかを断定しようと試みる。

  • 結果の類似度の値は二人のユーザ間で偶然ではない重複がおこるとみなされる値

  • 汎用化は難しいが、対数尤度による類似度は谷本係数による類似度より性能が優れている

嗜好度の推測

  • ときどき少なすぎるデータが問題になることがある。いくつかのケースにおいて、例えば、ピアソン相関はユーザ間で重複しているアイテムが一つの場合には類似度を計算することができない

  • データが欠損している部分にデフォルト値が挿入されるとどうか。この戦略はPreferenceInferrerインタフェースにより可能になっており、現在はAveragingPreferenceInferrerという実装がある

  • この実装はそれぞれのユーザの平均嗜好度を計算し、この平均値をまだユーザと関連のないアイテムの嗜好度として挿入する

  • UserSimilarityのsetPreferenceInferrer()メソッドを呼ぶことで使用可能

  • 原則として実際のデータを元に純粋に情報を作るには何も加えないが、これは計算を急激に遅くする

  • Mahoutはアイテム間の類似度という概念も提供する。ユーザ間だけでなくアイテム間の類似度についても同様の計算が適用される

アイテムベースの推薦

  • アイテムベースの推薦は、ユーザとユーザの代わりに、アイテムとアイテムがどれだけ類似しているかによって行われる。Mahoutでは、UserSimilarityの代わりにItemSimilarityを基にすることを意味する

アルゴリズム

   1  for every item i that u has no preference for yet
   2    for every item j that u has a preference for
   3      compute a similarity s between i and j
   4      add preference of u for j, weighted by s, to a running average
   5  return the top items, ranked by weighted average

  • アイテムベースの推薦を選択した方がよい理由の一つとしては、アイテムの数がユーザの数と比べて少ないとき、パフォーマンスの優位性はかなり大きくなるということ

  • また、一般的にアイテムはユーザよりも変更される点が少ない

  • 事前に類似度を計算しておくことは、実行時の推薦スピードを速くする

  • Mahoutでは、GenericItemSimilarityクラスが事前の計算とItemSimilarityクラスからの結果を格納するのに使われる。これは今までに出てきたいずれの実装にも適用することが可能

アイテムベースの推薦の詳細

  • GenericUserBasedRecommenderではなくGenericItemBasedRecommenderを使うコードは下記のとおり

   1  public Recommender buildRecommender(DataModel model)
   2      throws TasteException {
   3    ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);
   4    return new GenericItemBasedRecommender(model, similarity);
   5  }

  • PearsonCorrelationSimilarityはItemSimilarityインタフェースを実装しているのでここでも使用しており、これはUserSimilarityインタフェースについても同様

  • GenericItemBasedRecommenderはシンプルで、DataModelとItemSimilarityのみ必要。ItemNeighborhoodは不要。

  • すべてのUserSimilarityがItemSimilarityも実装しているわけではない

  • アイテムベースの推薦は一般的にアイテム数がユーザ数より少ないときはユーザベースの推薦より速い

スロープワンアルゴリズムによる推薦

  • 新しいアイテムとその他のユーザの嗜好性のあるアイテムの嗜好度の差の平均を基に嗜好度を評価する

アルゴリズム

  • スロープワンという名前は推薦アルゴリズムが一つのアイテムとその他のアイテムの嗜好度の間にいくつかの直線関係があるという仮説から来ており、Yというアイテムの嗜好度を、Y=mx+bという式で表されるXの嗜好度を基にするのは妥当である

  • ここでスロープワンによる推薦は単純化するためのm=1:という仮説を追加する。この場合、b=y-xのみ残り、これはすべてのアイテムのペアの間での嗜好度の差

  • これはアルゴリズムは下記の様に、すべてのアイテム間の嗜好度の差を計算する大量の事前計算フェーズから成ること意味する

   1  for every item i
   2    for every other item j
   3      for every user u expressing preference for both i and j
   4        add the difference in preference of u for i and j to an average

  • そして、推薦アルゴリズムは下記のとおり

   1  for every item i the user u express no preference for
   2    for every item j that user u expresses a preference for
   3      find the average preference difference between j and i
   4      add this diff to preference of u value for j
   5      add this to a running average
   6  return the top items, ranked by these averages

  • アイテムベースの推薦のように、そのパフォーマンスはデータモデル内のユーザ数には依存せず、事前に計算されるすべてのアイテムのペアの間の嗜好度の平均との差のみに依存する

  • すべてのアイテム間の嗜好度の差を格納するために必要なメモリはアイテム数の二乗で増えていく。アイテム数が2倍になればメモリは4倍必要

スロープワンの実践

  • 類似度の計測方法は不要で必要なのは下記のみ

   1  new SlopeOneRecommender(model)

  • ピアソン相関のように、スロープワンアルゴリズムのもっともシンプルな形は脆弱性を持っている。アイテム間の差はそれがどのぐらい信頼できるか、どれくらいの量のデータに基づいているかということに関係なく重みとして与えられるということ

  • SlopeOneRecommenderは2種類の重み付けを提供する。アイテム数と標準偏差に基づいた重み付けである

  • スロープワンはすべてのユーザの現在の嗜好度に差を加えて評価されたものの平均で評価を形成する

  • アイテム数による重み付けはより多くのデータに基づく時に重みをさらに重くする

  • 同じように、標準偏差による重み付けは、嗜好度の標準偏差の差に基づき重み付けを行う。標準偏差が小さい場合には重み付けは重くなる

  • もし二つの映画の間の嗜好度の差が多くのユーザについて矛盾がないのであれば、それは信頼できると思われるためより多くの重みを与えられる

  • もしそれがユーザ間の場合とかなり異なってしまうのであれば、それは強調されるべきではない

  • この効果を無効にするには下記のようにする

   1  DiffStorage diffStorage = new MemoryDiffStorage(
   2      model, Weighting.UNWEIGHTED, Long.MAX_VALUE));
   3  return new SlopeOneRecommender(
   4      model,
   5      Weighting.UNWEIGHTED,
   6      Weighting.UNWEIGHTED,
   7      diffStorage);

DiffStorageとメモリの検討

  • スロープワンはメモリ消費の代償を伴う

  • MySQLJDBCDiffStorageなどの実装は、データベースからの差異データの計算や更新を可能にする

  • これはMySQLJDBCDataModelのようなJDBCに基づくDataModel実装の中で使われる必要がある

   1  AbstractJDBCDataModel model = new MySQLJDBCDataModel();
   2  DiffStorage diffStorage = new MySQLJDBCDiffStorage(model);
   3  Recommender recommender = new SlopeOneRecommender(
   4      model, Weighting.WEIGHTED, Weighting.WEIGHTED, diffStorage);

事前計算の分離

  • Hadoopによる差異の計算がサポートされている

新しい実験的な推薦手法

特異値分解による推薦

  • SVDRecommenderは特異値分解に基づいている

  • これは線形代数では重要な技術

  • SVDは独立したアイテムへのユーザの嗜好度の世界を、より汎用的であまり多くない数の特徴(例えばジャンルなど)の世界に要約する

  • この処理はいくつかの情報を失うが、推薦結果を改善することが可能なことがある。入力データを有効な方法で整形する

  • SVDRecommenderの使い方はシンプルで下記のとおり

   1  new SVDRecommender(model, new ALSWRFactorizer(model, 10, 0.05, 10))

  • SVDRecommenderはFactorizerを使用し、ここではALSWRFactorizer実装を使用している

  • 最初の数値の引数はSVDが対象とする特質の数で、正解は存在しない

  • 二つ目の引数はラムダでこれはfactorizerの正規化機能を制御する

  • 最後の引数はトレーニングステップ数

  • この実装の大きな問題点はSVDの計算がメモリ上で行われるということ

  • これはデータセットのすべてをメモリ上に格納する必要があるが、それはアピールするポイントではなく、それは出力の質を大きく低下させることなく入力データを減らすことができるためである

直線補間によるアイテムベースの推薦

  • 直線補間は幾分異なるアイテムベースの推薦方法で、KnnItemBasedRecommenderとして実装されている

  • Knnはk nearest neighborsの略で、NearestNUserNeighborhoodとしても具体化されている

  • 直線補間アルゴリズムはuser neighborhoodのコンセプトを用いているが、方法は異なる

  • このアルゴリズムはいくつかの線形代数の手法によりすべてのアイテムのペアの最適な重みのセットを計算し、ここに直線補間が用いられる

  • KnnItemBasedRecommenderの使い方は下記のとおり

   1  ItemSimilarity similarity = new LogLikelihoodSimilarity(model);
   2  Optimizer optimizer = new NonNegativeQuadraticOptimizer();
   3  return new KnnItemBasedRecommender(model, similarity, optimizer, 10);

  • このコードではもっとも近い10アイテムを計算するのに対数尤度による類似度の測定手法を用いている

  • この実装はとても機能的だが、現在の形ではほどよいサイズのデータセットにおいても遅い

集団ベースの推薦

  • 推薦はそれぞれの集団に行われ、推薦されたアイテムは最大のユーザ数に対してもっとも興味のあるものである

  • この手法の良い点としては実行時の推薦処理が速いことで、それはほとんどが事前に計算されるためである

  • この方法では個人ではなくグループに対しての推薦が計算されるため、個人性は少なくなる

  • この手法は嗜好度データが少ない新しいユーザに対して推薦を行う場合により効果的である

  • 集団化には長時間かかり、この案を実装したTreeClusteringRecommenderを用いた下記の例を実行する場合にもそれがわかる

   1  UserSimilarity similarity = new LogLikelihoodSimilarity(model);
   2  ClusterSimilarity clusterSimilarity = 
   3      new FarthestNeighborClusterSimilarity(similarity);
   4  return new TreeClusteringRecommender(model, clustersimilarity, 10);

  • 2つのSimilarity実装を用いており、ひとつは二人のもっとも類似しているユーザのペアの類似度として集団の類似度を定義し、もうひとつはもっとも類似していないユーザの類似度として集団の類似度を定義する

  • いずれのケースでも集団の端の一つの外れ値が集団の意味合いをゆがめるリスクがある

  • メンバー間の距離が平均的な二つの集団でも、一方の端に近づくとNearestNeighborClusterSimilarityにより実装されたmost-similar-userルールにより極めて近いとみなされる

  • 上記のコードでFarthestNeighborClusterSimilarityにより実装されたleast-similar-userルールも同じように、他方の集団から遠く離れた外れ値を含んでいる場合、近い集団でも距離があるとみなされてしまう

  • 三つ目のアプローチは集団の距離を中心値の距離により定義する方法で、どちらにたいしても使用可能であるがまだMahoutでは実装されていない

他の推薦手法との比較

コンテンツベースの技術をMahoutに導入する

  • アイテムベースの推薦の類似度はItemSimilarity実装にカプセル化されているが、アイテムの属性に基づいた実装にできない理由はない

  • 例えば映画の類似度をジャンルやディレクター、出演者、発売年などの関数として定義するかも知れず、この実装を従来のアイテムベースの中で使用することはコンテンツベースの推薦の例

コンテンツベースの推薦をより深く見る

  • 協調フィルタリングではユーザとアイテム間の関連の嗜好度に基づいて計算される

  • 関連を発見することとアイテムの属性を発見することで、よりユーザとアイテムの関連の意味合いに基づいた推薦エンジンを構築することが可能になる

  • Mahoutの推薦はまだこれらの技術を取り入れていないが、将来のバージョンで扱われる流れである

モデルベースの推薦との比較

  • この技術は既存の嗜好度データに基づきいくつかのユーザの嗜好度モデルを構築し、新しい嗜好度データを推測しようとするもの

  • これらは通常ユーザの嗜好度からのみ導き出されるので、この技術は一般的には協調フィルタリングのカテゴリに含まれる

  • このアルゴリズムは全てのユーザの嗜好度からアイテムが好まれる確率を判定しようとし、結果的に推薦のランク付けを行う

  • データから「ユーザがアイテムXとYを好むとき、アイテムZも好まれる」というようなルールを学習し、そのルールの信頼性を判断することで、最も新しく嗜好性のあるアイテムを推薦することが出来る

  • 集団はどのユーザがグループを形成し、それゆえに嗜好性の方向もおなじであるというモデルを表す。Mahoutはこの狭義のモデルベースの推薦をサポートしているが、その範囲は執筆時点では開発中である

posted by Png akanuma on Tue 29 Nov 2011 at 08:48