sohatach's blog

http://github.com/soha

FlywayでDBマイグレーション

FlywayとはDBマイグレーションフレームワークです。
DBマイグレーションというと少し難しく聞こえますが、
私は、「SQLの変更を差分SQLファイルとしてバージョン管理するしくみ」と理解しています。
最新の状態の全ての最終結果のSQLをまとめてバージョン管理するのではなく、
実際にDBに適用可能な状態の差分のSQLファイルとして管理します。
またSQLの「変更の差分」を管理するため、DBを以前の状態に戻したり、
既存のデータを残したまま、最新のスキーマに上げたりすることが手軽にできます。
Railsなどでも同様のしくみがありますが、それのJava版です。
(ただしFlywayには、まだバージョンダウングレードの機能はないとのこと。。。

使い方

使い方は、公式サイトの以下のページに乗っているものを見るととても簡単であることがわかります。
http://flywaydb.org/getstarted/firststeps/gradle.html
(注:以降Gradleコマンドはインストールされ、PATHが通ってる前提で記載します。)

build.gradleの作成

build.gradle(Mavenで言うところのpom.xmlファイル)に以下の記載をします。

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.h2database:h2:1.3.170'
classpath 'org.flywaydb:flyway-gradle-plugin:3.0'
}
}

apply plugin: 'flyway'
apply plugin: 'java'

flyway {
url = 'jdbc:h2:file:target/foobar'
user = 'sa'
}

ここでは、データベースにh2を使うため、h2のJDBCライブラリと
flywayのプラグインのライブラリを依存ライブラリとして定義しています。

最初のマイグレーションファイルの作成

Flywayは、src/main/resources/db/migrationにあるマイグレーションファイル(SQLファイル)を
順次適用するようです。

そのため、以下のようなSQLファイルを用意しておきます。
ファイル名の冒頭に「V1__」とついているのが特に重要です。
これがマイグレーションする際に適用される順番になります。

src/main/resources/db/migration/V1__Create_person_table.sql

create table PERSON (
ID int not null,
NAME varchar(100) not null
);

マイグレーション実行

gradle flywayMigrate -i

ここでデータベース(h2)上にPERSONというテーブルが作成されます。

2つ目のマイグレーションファイル

src/main/resources/db/migration/V2__Add_people.sql

insert into PERSON (ID, NAME) values (1, 'Axel');
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

マイグレーション実行

gradle flywayMigrate -i

ここでPERSONテーブルに3つレコードが登録されます。

ここまでが公式資料のgetstartedで記載しているところですが、
追加で以下のようなことも試してみます。

3つ目のマイグレーションファイル

ファイル名の命名ルールはバージョン番号以外は特に制限はないようですが、
何をするかわかりやすいファイル名にすると良いようです。
以下の例では、PERSONテーブルにEMAILカラムを追加しています。


src/main/resources/db/migration/V3__Add_email_to_person.sql

alter table PERSON add EMAIL varchar(100);

マイグレーション実行

gradle flywayMigrate -i

ここでPERSONテーブルにEMAILカラムが追加されます。
既存の3つのレコードもそのまま残ります。


Flywayは、他のフレームワークなどとの依存関係も少なく
SQLファイルの変更の管理の仕方を変えるだけなので、
DDLを手で書いているような開発をしている場合には、
適用しておいて損はないしくみだと思いました。

Skinny Frameworkを使ってみる。その3

前回まででリクエストを受け付けてからの一連の流れが大体理解できました。

まず見るべきは、Controllers.scalaRailsで言うところのroutes.rb相当)であり、
ここから各URLに対応する処理が記載されています。

val indexUrl = get("/companies")(showResources).as('index)

上記の例では、companyの一覧を表示する画面の定義ですが、
「/companies」にアクセスがあると「showResources」というメソッドが呼ばれます。
「showResources」の具体的な処理は、CompaniesController.scalaに以下の通り定義されています。

  protected def enablePagination = true

...

  def showResources = {
    if (enablePagination) {
      val pageNo: Int = params.getAs[Int]("page").getOrElse(1)
      val pageSize: Int = 20
      val totalCount: Long = Company.count()
      val totalPages: Int = (totalCount / pageSize).toInt + (if (totalCount % pageSize == 0) 0 else 1)
      set("items", Company.findAllWithPagination(Pagination.page(pageNo).per(pageSize)))
      set("totalPages" -> totalPages)
    } else {
      set("items", Company.findAll())
    }
    render(s"/companies/index")
  }

この中の

val pageNo: Int = params.getAs[Int]("page").getOrElse(1)

リクエストからのパラメータの取り方は、上記のようになるようです。
実際に
/companies/?page=3
などとアクセスするとデータ件数によっては、一覧に1件も表示されなくなりました。
ちなみにここでは、「.getOrElse(1)」としているため、Intにできないような文字が渡ってきた際は、
こちらが呼ばれ、pageNoは、1となるようです。

Scaffoldのその先へ

Controllerの作りが大体わかってきたところで、
今回やりたいことは、EventとMemberの紐付けなので、
EventのIDとMemberのIDを紐付ける画面を作成して、
params.getAsして両者のIDをDBに保存してやればよさそうです。
scaffoldから先のやり方が少し見えてきました。

EventにMemberが参加するJoin画面を以下の通り作りました。

skinny g controller join

何が生成されたかは、こちらを見た方が早いかと思います。
https://github.com/soha/atumeru/commit/4777d8dcf9f0f796cd2dd604134efadefac1051a

skinny-framework-exampleの
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/CompaniesController.scala
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/webapp/WEB-INF/views/companies/index.html.ssp
を参考にEvent一覧画面を作成しました。(Memberを紐付けるための画面)
https://github.com/soha/atumeru/commit/92db7fd3aa708b2b88635e5385b9f4ab78a6d971

skinny-framework-exampleの方では、問題ないようですが、
4777d8dcf9f0f796cd2dd604134efadefac1051aにて生成したControllers.scalaの修正では、
ページング用のURLが適切でないようでしたので、修正しました。
https://github.com/soha/atumeru/commit/292e292b52b49978faca24b7d51725a37ea8b8ef
自動生成されたものをそのまま使用すると
/join/??page=2
などのように?が2つ生成されてしまっていたようです。

まだEvent一覧が表示されるだけで、肝心のMemberとの紐付け画面ができていませんが、
今日はここまで。

Spring BootでHot Reloading

Spring Bootをいじっていると、少しコードを修正しただけで、
毎回パッケージングしてjarファイルから起動とやっていると時間が掛かってとても面倒。
Spring Loadedというライブラリを使うとHot Reloadingが可能とのことのため、試してみました。

1.Spring Loadedのダウンロード

http://search.maven.org/remotecontent?filepath=org/springframework/springloaded/1.2.0.RELEASE/springloaded-1.2.0.RELEASE.jar
をダウンロードします。
現在は、1.2.0が最新のようですが、そのときの最新版を使うのが良いと思います。

2.Eclipseでの設定方法

プロジェクト右クリック → Run As → Run Configurations… → Java Application → <プロジェクト名> → Arguments

ここのVM Argumentsに以下のように設定します。

-javaagent://springloaded-1.2.0.RELEASE.jar -noverify

このようにJavaプロセスの起動時にspringloadedを介することで、Hot Reloadingが可能となるようです。

3.Thymeleafの設定

Thymeleaf(テンプレートエンジン)でHot Reloadingを行うには、上記設定だけでは足りず
application.propertiesに以下の設定が必要です。

spring.thymeleaf.cache: false

これにてHot Reloadingが可能となります。
いちいち再起動せずにコードの変更結果が確認できる。
開発するうえでこれはかなり重要です。


参考サイト

・Hot Swapping in Spring Boot with Eclipse STS
http://coderpills.wordpress.com/2014/05/21/hot-swapping-in-spring-boot-with-eclipse-sts/

Spring BootからのSpring Dataを使ってみる。

個人的には最近Scala大好きになりつつあり、できることならScalaで仕事をしたいところですが、
現実には、やはり現場の実態を考えるとJavaにせざる得ない様々な事情もあるため、
Javaで使用するフレームワーク(Spring)について調べてみました。
DIコンテナとしてのSpring Frameworkは、以前から使っていましたが、
たくさんプロダクトがあり、把握しきれていないものも多く
改めてSpring BootやSpring Dataのあたりを勉強しています。
最近のやり方をきちんとマスターすれば、そんなにめんどくさくないものになってる気がしています。

Spring Bootとは

関連するプロダクトが増えすぎて、複雑になってしまったSpringアプリケーションの開発を簡単に実現するためのプロダクトだそうです。
http://projects.spring.io/spring-boot/

Spring Dataとは

様々なデータストアに対するアクセスを抽象化するライブラリ。
今回は、JavaRDBMSアクセス仕様であるSpring Data JPAを使う。
QueryDSLのtypesafeクエリに対応しているようなので、こちらをぜひとも活用したいところ。

調べたこと

Spring Bootについては、以下のサイトなどを参考にさせていただきました。
確かに簡単にSpringによるWebアプリが作れるようです。

・Spring Boot 入門
http://www.techscore.com/blog/2014/05/01/spring-boot-introduction/

・Spring Bootで高速アプリ開発
http://dev.classmethod.jp/server-side/java/springboot/


ここまでは良いものの、データベースを使ったより実践的な作り方が知りたかったため、少し調べてみました。
Springでは、データベースアクセスにSping Dataというプロダクトを使用するようであり、
上記サイトにて以下のサンプルが紹介されていました。
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-jpa

これを読んでみます。
ソースを追いやすくするために、Eclipseにインポートします。

git clone https://github.com/spring-projects/spring-boot.git
cd spring-boot\spring-boot-samples\spring-boot-sample-data-jpa
mvn eclipse:eclipse

Eclipseプロジェクトファイルが生成されるため、Eclipseにインポートできるようになります。

どこから見ていったらいいかわからなかったため、とりあえずテストを実行してみました。

mvn test

ずらずらと処理が行われ、3つほどあったテストがすべて通りました。
データベースにアクセスするテストなので、テスト実行時に自動的にテーブルなども作成してくれたようです。(hqsldb)


調べた結果以下のことがわかりました。

CityなどのEntityクラスとそれに対応するRepositoryインターフェース(CityRepository)があり、
インターフェースにメソッドを定義するだけで、(実装メソッドを書かずに)クエリが発行できるようです。
RepositoryインターフェースがいわゆるDAOクラスに相当するものと考えられそうです。
上記サンプルでは、CityServiceImplクラスで、CityRepositoryとHotelRepositoryクラスを使うなどの実装になってました。


Spring Dataの基本的な使い方については、以下のサイトが非常に役に立ちました。

・intra-mart Accel Platform / TERASOLUNA Global Framework プログラミングガイド
第3版 2014-04-01
Spring Data JPAを使用したプログラミング方法
http://www.intra-mart.jp/download/product/iap/development/tgfw_programming_guide/texts/application/database/programing/jparepository/index.html

ある特定のネーミングルールに従いメソッド名を定義すると、Spring Data JPAの機能によってメソッド名から実行するQuery(JPQL)が生成されます。

List findByEmailAddressAndLastname(String emailAddress, String lastname);

select u from User u where u.emailAddress = ?1 and u.lastname = ?2

のようなクエリに自動変換されるとのことです。
SQLを直接書く必要がない。

Queryアノテーションを使用すれば直接クエリを書くこともできるようです。

@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

都度都度クエリを全部書く必要のあるMyBatisなどと比べるとこちらの方が楽そうです。



DBアクセスなどの設定の書き方がプロパティファイルだったり、XMLだったり、アノテーションだったり、
application.propertiesに書くべきなのか、persistence.xmlに書くべきなのかなど
https://github.com/spring-projects/spring-data-jpa-examples/tree/master/spring-data-jpa-example
こちらのサンプルでは、persistence.xmlにDB接続情報が書いてあるようです。)
結局どう書くのがいいのかよくわかっていないところがありますが、
動かしながら理解していきたいと思います。できれば個人的には、XMLはなくしていきたいところ。。。
Spring BootからSpring Data(QueryDSL)使ってXMLのないWebアプリを作ってみたい。

Skinny Frameworkを使ってみる。その2

このところ業務が忙しくなかなか思うように時間取れてませんでしたが、
少し落ち着いてきたので改めてSkinny Frameworkの学習再開。

とあるWebアプリを作ることを目標にしていますが、
scaffoldするところまではいいものの、Scalatraの知識も全くない私には、
その後自動生成されたControllerクラスをどう修正したらいいのかさっぱりわからない。。。
なのでまずは、Controllerの書き方を理解し整理します。

まずは公式のskinny-framework-exampleを参照してみる

https://github.com/skinny-framework/skinny-framework-example

特に解説はないようですが、以下の実装を見る限り、MembersControllerというのがscaffoldされたもので、
CompaniesControllerの方が具体的にソースを記載した場合のやり方と思われます。
Controllersの方は、URL呼び出しの起点となるファイルのようで、Railsで言うところのroutes.rbみたいなもののようです。
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/Controllers.scala
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/MembersController.scala
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/CompaniesController.scala

Controllers.scalaには、CompaniesControllerの処理については細かく記述されていますが、
MembersControllerについては一切記述が無いため、MembersControllerの方は、おそらくデフォルト動作をするものと思われます。
CompaniesControllerの記述を見てみるも、sinatraもscalatraの知識もない私には何が書いてあるのかすぐには理解できませんした。。。
調べて理解した(と思っている)ものを記載します。

Controllerからのリクエスト処理の一連の流れ(indexへのアクセス例)

val indexUrl = get("/companies")(showResources).as('index)

例えばこの記載などは、ブラウザから/companiesのパスのURLにアクセスされると
showResourcesメソッド(CompaniesControllerにて定義)が呼ばれるようです。
「get("/companies")」がURLのパス、続く「(showResources)」が対応するメソッドのようです。
そのshowResourcesの中で

render(s"/companies/index")

https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/scala/controller/CompaniesController.scala#L31
が呼ばれていますので、
/src/main/webapp/WEB-INF/views/companies/index.html.ssp
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/webapp/WEB-INF/views/companies/index.html.ssp
によりブラウザにHTMLが返されるところまではわかりました。

また「.as('index)」の意味するところとしては、Railsのroutes.rbと同じと考えると
このURLに名前をつけているということだと思われます。
(シングルクォートで囲っているから、Scala的にはシンボルになる。)
http://skinny-framework.org/documentation/controller-and-routes.html
のReverse Routesのところに

val showUrl = get("/members/:id")(show).as('show)

として定義しておくと、テンプレート上で以下の通り呼び出せるよと書いてありました。
Controllers.members.showUrlのところ。Rails同様後ろにUrlは付ける必要があるもよう。

a(href={s.url(Controllers.members.showUrl, "id" -> member.id)}) Show detail

・Play ドキュメントを Skinny で書くと - HTTP routing
http://seratch.hatenablog.jp/entry/2013/12/11/075312

ちなみにRailsの場合のURLルーティングについては、以下のサイトが大変参考になりました。
・Rails3 routes.rb まとめ
http://akkunchoi.github.io/rails3-routes.html

Controllerからのリクエスト処理の一連の流れ(showへのアクセス例)

続いてControllers.scala

val showUrl = get("/companies/:id") {
params.getAs[Long]("id").map(id => showResource(id)).getOrElse(haltWithBody(404))
}.as('show)

引数を1つ持つshowResourceメソッドについては、CompaniesController.scalaに定義されてます。

def showResource(id: Long) = {
set("item", Company.findById(id).getOrElse(haltWithBody(404)))
render(s"/companies/show")
}

set("item", Company.findById...
としてパラメータより取得したidをもとにCompanyのオブジェクトを設定しています。
/src/main/webapp/WEB-INF/views/companies/show.html.ssp
https://github.com/skinny-framework/skinny-framework-example/blob/master/src/main/webapp/WEB-INF/views/companies/show.html.ssp
を見ると

<%@val item: model.Company %>

して

${item.id}

などとitem変数の値をテンプレートの中で使用しています。

getOrElse()
の引数にhaltWithBody(404)というのを指定しています。
これがどこで定義されているのかちょっとよくわからなかったのですが、
表示されているHTMLの内容を見ると
src/main/webapp/WEB-INF/views/error/404.html.ssp
が読み込まれているように思います。

set("item", Company.findById(id).getOrElse(haltWithBody(404)))
この場合は、item変数に何が入るのだろう???

params.getAs[Long]("id").map(id => showResource(id)).getOrElse(haltWithBody(404))
アクションメソッドのこちらの方は、showResource(id)がNoneを返したときに、
アクションメソッドの戻りとして、haltWithBody(404)の結果が返されるというのはわかるのですが。。。

実際に試してみました。

haltWithBody(404)
//render(s"/companies/show")

item変数に値を入れず、renderも呼ばなくても、同じ404 Not Foundのページが表示されたため、
haltWithBody(404)が呼ばれることで途中の処理をすっ飛ばし、エラー画面へ遷移するようです。
ググッたところ、特に本メソッドに関する説明は見つからなかったので、
Scalatraが持つメソッドなのかSkinny Frameworkが定義しているものなのかよくわかりませんでした。
こうなったらソースを当たるしかないようです。
まあhaltってついているので単語の意味からおおよそ動きは予想できますが。

ソースを検索したところ、SkinnyControllerBase.scalaにて定義されていましたので、Scalatraが持つメソッドではないようでした。
https://github.com/skinny-framework/skinny-framework/blob/bb8b818ffba9518c7dc40a7c2a2b650e1d70d6d5/framework/src/main/scala/skinny/controller/SkinnyControllerBase.scala#L75
結局のところ、haltメソッド(こちらはScalatraのメソッド)を呼んでいました。

protected def haltWithBody[A](httpStatus: Int)(implicit format: Format = Format.HTML): A = halt(status)

haltメソッドについて記載があるドキュメント
http://www.scalatra.org/2.2/guides/http/routes.html

Scalaのimplicitについて非常にわかりやすい解説
http://d.hatena.ne.jp/gakuzo/20111204/1323007376


うーん、実際の開発の方が全然進んでいない。
まだまだ私は勉強が足りないなと痛感。。。わからない中書いているため文章も無駄に長くなってる気がする。
しかしタイプセーフなRails(Skinny Framework)が使いこなせるようになればかなり有益なはず。
この後もしばらくはControllerまわりの理解を深めたいと思います。

Skinny Frameworkを使ってみる。その1

・作るアプリ

イベントとそのイベントへの参加者を管理するWebアプリ。
Atndもどきのようなものを目指す。

・データモデルの説明

 イベント(Event):タイトル、開始日時、終了日時を持つモデル。
 参加者(Member):名前、メールアドレスを持つモデル。
 イベント参加者:イベントID、参加者IDとの紐付けモデル。

イベント -<(1:n) イベント参加者 >-(n:1) 参加者
の関係。

・やったこと

1.プロジェクトの雛形ファイルとしてのブランクアプリのダウンロード

https://github.com/skinny-framework/skinny-framework/releases/download/1.0.14/skinny-blank-app-with-deps.zip
上記を展開して、フォルダ名をatumeruとリネームしました。


2.プロジェクトのIntelliJ IDEA化

プロジェクトフォルダ(ここではatumeru)に移動し、以下のコマンドを実行。

skinny idea

と.gitignoreへの.idea,*.imlの追加。(環境ファイルコミットするといろいろめんどいので除外する)
具体的には以下のコミット。
https://github.com/soha/atumeru/commit/4bb020be03cdbeac22d5220d32ee7c18ee1f1199


3.イベントモデル追加

scaffoldにより、イベントの登録更新削除可能な機能を自動生成する。
以下のコマンドを実行する。

skinny g scaffold events event title:String startDateTime:Option[DateTime] endDateTime:Option[DateTime]

skinny db:migrate

skinny runで起動し、ブラウザで http://localhost:8080/events にアクセスする。


4.メンバーモデル追加

こちらも同じくscaffoldにより、イベントの登録更新削除可能な機能を自動生成する。
以下のコマンドを実行する。

skinny g scaffold members member name:String email:String

skinny db:migrate

skinny runで起動し、ブラウザで http://localhost:8080/members にアクセスする。


5.イベント参加者モデル追加

skinny g scaffold eventMembers eventMember event_id:Long member_id:Long

(イベント参加者モデルは、リレーションモデルなのでscaffoldは冗長かも)

skinny db:migrate

skinny runで起動し、ブラウザで http://localhost:8080/event_members にアクセスする。
デフォルトでは、URLはスネークケースになる。EventMembersController参照。

このあたり、言語は違いますが、なにげにRailsチュートリアルの11章が凄く役に立ちました。考え方は同じかと。
http://railstutorial.jp/chapters/following-users?version=4.0#sec-the_relationship_model
今回は、モデル(イベント)とモデル(メンバー)の紐付けモデル(イベント参加者)。


6.scaffold成果物の確認

ここまででテスト通してみる。
自動生成しかしてないので通るはず。

テスト用DBの作成。

skinny db:migrate test

これをやっておかないとテストに失敗する。
続いてテストの実行。

skinny test

テスト結果

[info] Passed: Total 50, Failed 0, Errors 0, Passed 50
[success] Total time: 45 s, completed 2014/05/18 21:56:17

7.リレーションモデルの設定

scaffoldされた不要なファイルを削除し、
EventMemberモデルをリレーションモデル(SkinnyJoinTable)にする。
https://github.com/soha/atumeru/commit/fb931c393647c7c274a0563bb201bc5712f2ac22


8.ORMのテストクラス追加
https://github.com/soha/atumeru/commit/4e2b4511bf86aabbb751f8ac03ec944e2fa9f5b1
テストを動かしてみる。

skinny testOnly skinny.orm.SkinnyORMSpec

実行結果

[info] SkinnyORMSpec:
[info] EventMembers
[info] - should Event has Members
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 21 s, completed 2014/05/21 0:34:33


今日はここまで。
無駄なことやってるところあるかもしれませんが、
情報も少ないため、今後もとりあえず手探りでやってみる。
次はとりあえず画面からイベントと参加者を紐づけ登録できるようにしたい。

GREE Tech Talk #05 : 並行/並列プログラミングに参加しました。

GREE Tech Talk #05 : 並行/並列プログラミング
http://techtalk5.labs.gree.jp/
に参加しました。

【基調講演】ここから始める並行プログラミング

高橋 晶(株式会社ロングゲート)
http://www.slideshare.net/faithandbrave/start-concurrent

C++の少し難しい話になるのかと思っていましたが、
並行プログラミングに対する概念的な説明となっており、普段サーバサイドJavaPHPを本業とし
並列プログラミングをあまり意識していない私でも理解しやすかったです。
でもそういえば推薦書のJava並行処理プログラミングは、昔頑張って読んだなあ。殆ど内容覚えてないけど。
また探して読み直すかなあ。

魔導書に書いていない、エラーハンドリング周りや、go/nodeの比較について(仮)

幾田 雅仁(株式会社 gumi)

ErlangやElixir、ScalaのAkkaの話。Goやnode.jsについても触れられていた。
普段私もJavaPHPだけでなく、RubyPython、初歩的なScalaやかつてはCなどいくつか言語をかじったつもりでしたが、
まだまだ知らない世界も多く完全に勉強不足だなあと痛感じました。
Akkaについては、去年のScalaカンファレンス(しかも英語のスピーチ)で、さっぱりわからず
心折れながら帰宅したのを思い出す。なんか凄そうなのはわかったけど具体的にどういうものなのか
どんなところで使ったらいいのかはわかっていなかった。
今回は、ErlangやAkkaなどを使うことで耐障害性の高いシステムが構築できるということがわかった。
今年こそAkka理解し使いこなせるようになりたい。プロセスと呼ばれているのは、OSレベルのプロセスの話なのか、JVMだからスレッドの話なのか。
サーバが物理的に分かれている場合のシステム構成とか、そもそも基本的なことがわかってない。。。出直そう。

STMの設計と進化

熊崎 宏樹(日本電信電話株式会社)

お恥ずかしいながらSTM(Software Transactional Memory)について存在を知りませんでした。
STMとは、「データベーストランザクションに似た並行性制御機構であり、並列計算を行う際の共有メモリへのアクセス法である。」とのこと Wikipediaより
当初何の話のことだかよくわかっていませんでしたが、聞いてみたら非常に面白かったです。純粋に好奇心をすごく掻き立てられた。
共有メモリアクセスにおけるトランザクションアルゴリズムの話。進化の系譜を順を追って説明されてた。
2フェーズロックについては、さすがに私も知ってましたが、今回その偉大さを痛感しました。
ただしそれでもパフォーマンスに問題があるとのことで、さらに様々な改良方法があるとのお話。
時間の都合で最後まで聞けなかったのが非常に残念。ほんとに残念。

サーバサイドの並行プログラミング(仮)

池原 潔(グリー株式会社)

主催でもあるGREEさんの社員の方のお話。
PHPばかりと思っていたGREEさんの異なる側面が見れたようでとても興味深かったです。
KVS管理システムのフロントエンドなどでHaskellが使われているとのこと。
並行/並列プログラミングがどういう使われ方をしているかなどがわかり、
ある意味今回一番理解しやすく勉強になりました。



今回のお話を聞いて、怖がって手を出さなかったErlangHaskellあたりに
少し手を出してみようと思いました。
実際に使う機会はないとしても、教養としては知っておきたいなと。