2014年4月21日月曜日

Heroku/Play2.2/Scala で Hello, World!

初めて Play と heroku を触って、とりあえず疎通確認までやってみたいってとき、現時点(2014/04/20)のプロダクトでちゃんと動くシンプルな getting started 的な資料が、なかなか見当たらない。

heroku のドキュメントを見ると、Scala 版は Play を使っていないし、Java 版だと Play用の記事はあるもののバージョンが古いので、play newのときに Scala を選択して後は指示通りって感じだと、やっぱりちゃんと動かない。

Play のサイト(日本語版)の方では、scala 用のドキュメントがあるけど、Play 2.2.x じゃなく Play 2.1.5 なので、このままだと動かない。英語版では、一応、2.2.x 用に修正されているようだけど、PostgreSQLとの連携とか後でもいいから heroku との連携だけ確認したいってニーズにはやや冗長。

つうわけで、手短に heroku 上で Play(scala) の HelloWorld を動かしてみる手順をまとめてみた。

============================

■ まず Play プロジェクトを作る。
$ play new helloworld
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.2 built with Scala 2.10.3 (running Java 1.7.0_51), http://www.playframework.com

The new application will be created in /home/xad/devel/workspace/scala/play1/helloworld

What is the application name? [helloworld]
> 

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application helloworld is created.

Have fun!
プロジェクトが生成されるので、以降、helloworld フォルダの中で作業する。フォルダの中身は以下のような感じ。
$ cd helloworld/
$ tree
.
├── README
├── app
│   ├── controllers
│   │   └── Application.scala
│   └── views
│       ├── index.scala.html
│       └── main.scala.html
├── build.sbt
├── conf
│   ├── application.conf
│   └── routes
├── project
│   ├── build.properties
│   └── plugins.sbt
├── public
│   ├── images
│   │   └── favicon.png
│   ├── javascripts
│   │   └── jquery-1.9.0.min.js
│   └── stylesheets
│       └── main.css
└── test
    ├── ApplicationSpec.scala
    └── IntegrationSpec.scala

10 directories, 14 files

■ ソースを編集する
疎通確認としては必須ではないけど、一応 Hello Worldってことで、文言だけ変えておく。
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Hello, world!"))
  }

}

■ Procfile を書く。

heroku 上で実行されるコマンドを記述するやつで、プロジェクトのルート直下に置いとくファイルだけど、これが Play のバージョンごとに違っていて、知らないとちょっと苦労する。2.2.x では、以下のような感じ。
web: target/universal/stage/bin/helloworld -Dhttp.port=${PORT}
"web:" の後が、"play run" だとか "target/start "になってると、古い方式なので、ちゃんと起動しない。あと、port の指定の後に、$JAVA_OPTS とか $PLAY_OPTSとか指定しているチュートリアルもあるけど、これも今のプロダクトだと動かなくなる。

■ git に入れる
$ git init
$ git add .
$ git commit -m "init"

■ heroku アプリを作る
$ heroku create
ここで、ブラウザから heroku にログインすると、Apps ページに今作ったアプリケーションが表示されているのが確認できる。

■ デプロイする
$ git push heroku master

■ 確認する
$ heroku ps
=== web (1X): `target/universal/stage/bin/helloworld -Dhttp.port=${PORT}`
web.1: up 2014/04/21 16:24:01 (~ 18s ago)
何か失敗してたら、up じゃなくて crashed とかになってる。

以下のコマンドで、ブラウザ上、Hello, world!って表示されるのを確認できる。
$ heroku open 

ログを見るには、heroku logs

Procfile が間違ってると、例えば、"web: play run"とか古い Playの設定の仕方だと、"bash: play: command not found"みたいな感じで、ログに吐かれている。

あと $JAVA_OPTS とか余計な指定が入ってると、"Bad application path: -Xmx384m"って書き出される。依存ライブラリの問題なんかもログに出力される。

2014年4月17日木曜日

アジャイルPM研修に行ってきた

今日は、朝から PMI日本支部ってとこでアジャイルPM研修だった。ちょー遠かった。

受講者はだいたい皆 PMP取得者らしいけど、最近やっと「アジャイル」って単語が気になり始めた感じの、わりとウォーターフォール色濃い目の管理職の人達が多い印象で、自分としては若干アウェイ感。

ただ講師の方と他の受講者の人達の質疑応答が、予想外に興味深かった。

いわゆる上級"SE"的な「上から管理する」って技術に関しては、それなりの知識があって年季も入った人達が、アジャイル的な価値観や手法に対して、どういう懸念や抵抗感や違和感や誤解を持つのかってのが、けっこう生々しく観察できた。

研修の冒頭、各自で自己紹介するところで、「受講の目的/コースに期待すること」として、自分は「アジャイルじゃない現場にアジャイルを導入する方法に、今は特に興味があって、ヒントを得たい」みたいな感じで発言したんだけど、そういう意味でも参考になった。

ちなみに、PMP資格を維持するための PDUは、これで7PDU。

あと PMI Agile Certified Practitioner (PMI-ACP) ってアジャイル資格があって、今、取得者 5000人ちょっと(内、日本人7名)くらい。英語のテストだけど、内容的には簡単とのこと。

2014年4月4日金曜日

PoEAA のパターン一覧を頭に入れなおしてみる

Patterns of Enterprise Application Architecture』 と言えば、2000年代前半の パターン本の金字塔と言われていて、今でもいろんな文献で引用されていたりする。

ただ、だいぶ昔に一通り読んではいるものの、使っていないパターンなどで忘れていたりしているものも多くて、最近の本とか論文とかを読んでいるときに出くわしたりすると、とっさに思い出せない事がある。

というわけで今更だけど、最低限パターン名と概要だけでも、この際いったん全部頭に入れてしまおう思い、以下の暗記カードを作った。

邦訳本も一応出版されているけど、パターン名が原語のそれと全然違っていたりして、あまり評判もよくないので、原書の記述に基づいて作った。

PoEAA のパターン一覧を覚えてみる
{ "height":200, "width":400, "opacity":0.9, "start-color":"#000000", "start-bg-color":"#FEFFFE", "question-color":"#002200", "question-bg-color":"#FEFFFE", "statusbar-bg-color":"#FEFFFE", "statusbar-color":"#000000", "last-bg-color":"#FEFFFE", "last-color":"#002200", "answer-color":"#0044AA", "answer-bg-color":"#FEFFFE", "button-color":"#FEFFFE", "caption":"PoEAA のパターン一覧を覚えてみる", "caption-color":"#CCEEFF", }
以下の記述が示すPoEAAパターン名は何か?
Organizes business logic by procedures where each procedure handles a single request from the presentation.
Transaction Script
以下の記述が示すPoEAAパターン名は何か?
An object model of the domain that incorporates both behavior and data.
Domain Model
以下の記述が示すPoEAAパターン名は何か?
A single instance that handles the business logic for all rows in a database table or view.
Table Module
以下の記述が示すPoEAAパターン名は何か?
Defines an application's boundary with a layer of services that establishes a set of available operations and coordinates the application's response in each operation.
Service Layer
以下の記述が示すPoEAAパターン名は何か?
An object that acts as a Gateway to a database table. One instance handles all the rows in the table.
Table Data Gateway
以下の記述が示すPoEAAパターン名は何か?
An object that acts as a Gateway to a single record in a data source. There is one instance per row.
Row Data Gateway
以下の記述が示すPoEAAパターン名は何か?
An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data.
Active Record
以下の記述が示すPoEAAパターン名は何か?
A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself.
Data Mapper
以下の記述が示すPoEAAパターン名は何か?
Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.
Unit of Work
以下の記述が示すPoEAAパターン名は何か?
Ensures that each object gets loaded only once by keeping every loaded object in a map. Looks up objects using the map when referring to them.
Identity Map
以下の記述が示すPoEAAパターン名は何か?
An object that doesn't contain all of the data you need but knows how to get it.
Lazy Load
以下の記述が示すPoEAAパターン名は何か?
Saves a database ID field in an object to maintain identity between an in-memory object and a database row.
Identity Field
以下の記述が示すPoEAAパターン名は何か?
Maps an association between objects to a foreign key reference between tables.
Foreign Key Mapping
以下の記述が示すPoEAAパターン名は何か?
Saves an association as a table with foreign keys to the tables that are linked by the association.
Association Table Mapping
以下の記述が示すPoEAAパターン名は何か?
Has one class perform the database mapping for a child class.
Dependent Mapping
以下の記述が示すPoEAAパターン名は何か?
Maps an object into several fields of another object's table.
Embedded Value
以下の記述が示すPoEAAパターン名は何か?
Saves a graph of objects by serializing them into a single large object (LOB), which it stores in a database field.
Serialized LOB
以下の記述が示すPoEAAパターン名は何か?
Represents an inheritance hierarchy of classes as a single table that has columns for all the fields of the various classes.
Single Table Inheritance
以下の記述が示すPoEAAパターン名は何か?
Represents an inheritance hierarchy of classes with one table for each class.
Class Table Inheritance
以下の記述が示すPoEAAパターン名は何か?
Represents an inheritance hierarchy of classes with one table per concrete class in the hierarchy.
Concrete Table Inheritance
以下の記述が示すPoEAAパターン名は何か?
A structure to organize database mappers that handle inheritance hierarchies.
Inheritance Mappers
以下の記述が示すPoEAAパターン名は何か?
Holds details of object-relational mapping in metadata.
Metadata Mapping
以下の記述が示すPoEAAパターン名は何か?
An object that represents a database query.
Query Object
以下の記述が示すPoEAAパターン名は何か?
Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.
Repository
以下の記述が示すPoEAAパターン名は何か?
Splits user interface interaction into three distinct roles.
Model View Controller
以下の記述が示すPoEAAパターン名は何か?
An object that handles a request for a specific page or action on a Web site.
Page Controller
以下の記述が示すPoEAAパターン名は何か?
A controller that handles all requests for a Web site.
Front Controller
以下の記述が示すPoEAAパターン名は何か?
Renders information into HTML by embedding markers in an HTML page.
Template View
以下の記述が示すPoEAAパターン名は何か?
A view that processes domain data element by element and transforms it into HTML.
Transform View
以下の記述が示すPoEAAパターン名は何か?
Turns domain data into HTML in two steps: first by forming some kind of logical page, then rendering the logical page into HTML.
Two Step View
以下の記述が示すPoEAAパターン名は何か?
A centralized point for handling screen navigation and the flow of an application.
Application Controller
以下の記述が示すPoEAAパターン名は何か?
Provides a coarse-grained facade on fine-grained objects to improve efficiency over a network.
Remote Facade
以下の記述が示すPoEAAパターン名は何か?
An object that carries data between processes in order to reduce the number of method calls.
Data Transfer Object
以下の記述が示すPoEAAパターン名は何か?
Prevents conflicts between concurrent business transactions by detecting a conflict and rolling back the transaction.
Optimistic Offline Lock
以下の記述が示すPoEAAパターン名は何か?
Prevents conflicts between concurrent business transactions by allowing only one business transaction at a time to access data.
Pessimistic Offline Lock
以下の記述が示すPoEAAパターン名は何か?
Locks a set of related objects with a single lock.
Coarse-Grained Lock
以下の記述が示すPoEAAパターン名は何か?
Allows framework or layer supertype code to acquire offline locks.
Implicit Lock
以下の記述が示すPoEAAパターン名は何か?
Stores session state on the client.
Client Session State
以下の記述が示すPoEAAパターン名は何か?
Keeps the session state on a server system in a serialized form.
Server Session State
以下の記述が示すPoEAAパターン名は何か?
Stores session data as committed data in the database.
Database Session State
以下の記述が示すPoEAAパターン名は何か?
An object that encapsulates access to an external system or resource.
Gateway
以下の記述が示すPoEAAパターン名は何か?
An object that sets up a communication between two independent objects.
Mapper
以下の記述が示すPoEAAパターン名は何か?
A type that acts as the supertype for all types in its layer.
Layer Supertype
以下の記述が示すPoEAAパターン名は何か?
Defines an interface in a separate package from its implementation.
Separated Interface
以下の記述が示すPoEAAパターン名は何か?
A well-known object that other objects can use to find common objects and services.
Registry
以下の記述が示すPoEAAパターン名は何か?
A small simple object, like money or a date range, whose equality isn't based on identity.
Value Object
以下の記述が示すPoEAAパターン名は何か?
Represents a monetary value.
Money
以下の記述が示すPoEAAパターン名は何か?
A subclass that provides special behavior for particular cases.
Special Case
以下の記述が示すPoEAAパターン名は何か?
Links classes during configuration rather than compilation.
Plugin
以下の記述が示すPoEAAパターン名は何か?
Removes dependence upon problematic services during testing.
Service Stub
以下の記述が示すPoEAAパターン名は何か?
An in-memory representation of tabular data.
Record Set
この作業やってて、パターン名だけは一応なんとか見覚えがあっても、内容がよく思い出せないのが、3分の2くらいもあった。

まあ印象が薄いのは、そもそもあまり重要でないパターンだったのかもしれないけど、名称と概要くらいなら、いつでも取り出せる形で、脳内の引き出しに入れておいても邪魔にはならないだろう。