OStatusの仕様をかいつまんで適当に和訳するよ

OStatus 1.0 Draft 2 http://ostatus.org/sites/default/files/ostatus-1.0-draft-2-specification.html

概要

OStatusは異なるソーシャルネットワーク上のユーザーが、互いにフォローできる仕組みを提供します。
この仕様は関連するいくつかのプロトコルPubSubHubbub, ActivityStreams, Salmon, Portable Contacts, and Webfinger)からなります。

OStatusは分散更新通知やマイクロブログのための最小の仕様です。
RSSAtomフィードを配信するサービスであれば、OStatusを利用することができます。
たとえば、旅行サイト、イベント通知サイト、Wiki、写真共有システム、ソーシャルニュースサイト、ソーシャル音楽サイト、podcastサーバー、ブログ、バージョン管理システム、その他の汎用的なソーシャルサービスなど。

1.ライセンス

(原文参照)

2.表記・用法

(原文参照)

3.用語定義

User
サービスの利用者またはbot
Group
ユーザーの集まり。
Update
Userの状態や行動の変更通知。Userが直接通知するか、またはシステム的に自動生成される。
Feed
最近のUpdateのリスト。たとえば、UserやGroupのすべてのUpdate、検索条件にマッチするUpdateなど。
Publisher
Updateを通知するUserまたはGroup
Subscriber
Publisherからの通知を受け取るUser。いわゆるFollower。
Follow
PublisherからのUpdateを受け取ること。
Publisher Server
PublisherがUpdateを通知する際に使用するWebサーバー。
Subscriber Server
SubscriberがUpdateを受け取る際に使用するWebサーバー。

4.要件

この仕様で解決しようとする要件・問題領域は以下の通り。

  • UpdateはUTF-8のプレーンテキスト。
  • UpdateはHTML。
  • Updateは複数の添付ファイルを含む。
  • UpdateはほかのUpdateへの返信になる。(twitterのreply)
  • UpdateはほかのUpdateのコピーや転送になる。(twitterの公式・非公式retweet
  • Updateはトピックに関連付けられる。(twitterハッシュタグ
  • Updateは受信者を指定できる。(twitterのmention)
  • Updateは位置情報を持てる。
  • 誰でもUpdateに「お気に入り」マークをつけたりはずしたりできる。
  • Userはユニークな識別情報を持つ。(グローバルユニーク、という意味かと)
  • Userは名前や所在地、ニックネーム/ユーザー名、略歴、関連するURLなどのプロフィールをもてる。
  • Userはアバターを設定できる。(プロフィール写真程度の意味っぽい)
  • SubscriberはPublisherのUpdateをすぐに受け取れる(ほぼリアルタイム、プッシュ通知が欲しい)。
  • Publisher ServerはあるPublisherのSubscriberのリストを、識別情報とプロフィールも含めて保持できる。
  • Subscriber ServerはあるSubscriberのPublisherのリストを、識別情報とプロフィールも含めて保持できる。
  • Publisher ServerはPublisherのUpdateに対する返信のリストをすべて保持できる。
  • Publisher Serverはコピーや転送されたPublisherのUpdateをすべて保持できる。
  • Publisher Serverは「お気に入り」マークされたPublisherのUpdateをすべて保持できる。
  • 各サーバーは、Updateに含まれるコンテキストやメタデータを、テキストのパースをすることなく取得できる。(位置情報とかのメタデータをテキストに無理やり埋め込むんじゃなくて、ちゃんとスキーマを定義してメッセージのやり取りをしようということ)
  • SubscriberはGroupや検索結果、タグに関連するUpdateなど、複数の更新元からのUpdateを受け取れる。(タグ=twitterハッシュタグ的なもので、User以外のものもフォローできる、という意味っぽい)

5.対象外

以下のような内容はOStatusでは規定しない。

マイクロブログの文法
ハッシュタグの記法(#)とか、@によるリプライとかは規定しない。そもそもそういったメタデータについて、OStatusではテキストのパースが不要なように、スキーマを規定する。
クライアントAPI
ユーザーとサーバー間のプロトコルAPIについては規定しない。Webでもメールでもなんでもいい。
プライベートメッセージ
twitterのDMのような1対1のメッセージ送受信については規定しない。
ソーシャルグラフ
User間の関連情報のデータ表現や保持方法については規定しない。ただし、関連情報を検索する際のプロトコルについては規定する。必要であればFOAFかXFNに従う。(曖昧・・・まだ規定してないっぽい。)

6.Updateの表現

Atomの仕様で定義されたActivitiesを使う。Updateはいわゆる"Post"のことで、型としては"Note", "Status", "Comment"となる。各サーバーはこれらの標準の型をサポートすべきで、その他の型のサポートは任意とする。

位置情報はGeoRSSの仕様に沿ってエンコードし、activity内のオブジェクトとして表現される。

添付データはactivityに含まれる形で表現される。

Updateが何かに対するreplyであった場合、Atomの"in-reply-to"の仕様に沿って表現される。

タグ情報はAtomのカテゴリーとして表現される。

OStatusはActivity Streamsに以下の2つの拡張を定義する。

  • link[@rel=ostatus:attention]/@href
    • Updateが特定の誰か宛だった場合は、この形式で対象ユーザーのURIをあらわします。
  • link[@rel=ostatus:conversation]/@href
    • Updateがほかの会話の一部だった場合、この形式で会話のURIをあらわします。

7.Userの表現

ユーザーはURIで識別される。

ユーザーは適切な型のactivityオブジェクトとして表現される。通常は"Person"となる。

追加の情報が無ければ、付加情報の無いActivityデータとして、AtomRSSフィードの"Post"として表現される。この場合、フィードのauthor要素には<email>か<uri>のいずれか一方を持っている必要がある。

Subscriberは以下の順序でURIを探す。

  1. Activityオブジェクトの<id>エレメント
  2. Atomのauthorの<uri>エレメント
  3. Webfingerのacct: URIとして扱われる、Atomのauthorの<email>エレメント

PublisherはプロフィールのURLをURIとして提供する場合があるが、そのURLが将来的に変わらないものとしなければならない。

UserはHTTP(s)で参照できて、HTMLで表現されていて、そのUserのFeedへのリンクを含んだプロフィールのURLを持つべき。プロフィールのURLは link[@rel=alternate,@type=text/html] の形式でActivityのsubject, actorなどの項目として表現すべき。さもなければ、HTTP(s)のURIで表現すべき。

プロフィール情報を追加するために、authorエレメントやactorエレメントがPortable Contacts形式のデータとして拡張可能になっています。

preferredUsername
ログイン名/ユーザー名
displayName
フルネーム。author/name や actor/title の値。
note
説明文。
address/formatted
現在の所在地。
urls[type=home]/value
ユーザーの紹介ページ。Activityのactorエレメントに必要となる link[@rel=alternate,@type=text/html] とは異なる。

Subscriberはmicroformatsなどのほかの形式で提供する場合があるが、非推奨とする。

8.Feedの表現

FeedはActiveStreamsのActivityと同様とする。

すべてのFeedはsubjectエレメントを持つべき。UserのFeedは1つのsubjectかauthorを持つべき。GroupのFeedはそのGroupをあらわす1つのsubjectを持つべき。

すべてのFeedは link[@rel=hub] 形式でPubSubHubbubのエンドポイントURLを持たなければならない。(Updateをを購読するために必要となる)

すべてのFeedは link[@rel=salmon] 形式でSalmonのエンドポイントURLを持つべき。(replyやnotificationを受け取るために必要となる)

9.Updateの配布

Publisher ServerはPubSubHubbubプロトコルにより、更新情報をSubscriberにプッシュ通知する。

複数のSubscriverが同じSubscriber Serverを使って同じPublisherの更新通知を受け取る場合、Subscriber Serverは1つのPubSubHubbub接続を使用するべき。

10.Userへの通知

サーバーはSalmonプロトコルを使って別のUserやGroupに対してイベントを通知する。サーバーはユーザーがPubSubHubbubが使用可能でFeedを受け取れているとは仮定してはいけない。

通知の送信元と送信先はSubscriberとPublisherの関係を持っているとは限らない。

重要なイベントは以下の通り。(細かく書いてあるけど省略)

  • Attention
  • Reply
  • Subscribe
  • Unsubscribe
  • Join
  • Leave
  • Favorite
  • Unfavorite
  • Repeat

11.探索・検索

UserやGroupへのFeedから、それを購読したり通知を送るのに必要な情報を取得できるようにする。プロフィールのデータ、SalmonプロトコルのエンドポイントURL、PubSubHubbubのエンドポイントURLがすべてFeedの中にエンコードされる。

Feedの所在を探索する方法は以下の3通りある。

  1. ユーザーが直接入力する。
  2. ユーザーのXRDファイルに含まれる Link/Rel=http://schemas.google.com/g/2010#updates-from エレメントから。
  3. プロフィールページのHTMLに含まれる link[@rel=alternate,@type=application/atom+xml] 形式のエレメントから。

プロフィールページのURLを取得する方法は以下の2通りある。

  1. ユーザーが直接入力する。
  2. ユーザーのXRDファイルに含まれる Link/Rel=http://schemas.google.com/g/2010#updates-from エレメントから。

ユーザーのXRDファイルを取得する方法は以下の2通りある。

  1. nickname@example.comのようなWebfingerのacct: URIから
  2. プロフィールページのHTTPヘッダから

ユーザーのXRDドキュメントは、そのユーザーのSubscription Serverに対して購読の初期化処理を行うためのURLテンプレートを、http://ostatus.org/schema/1.0/subscribe に添った形でのリンクを提供する場合がある。URLテンプレートはどのアカウントを購読するか、という引数を1つとる。

12.Usage scenarios

12.1.Subscriber ServerからのFeedの取得
  1. SubscriberがSubscriber Serverに取得したいFeedを伝える。(URL, Webfinger account, Feedのリストからの選択)
  2. SubscriberがFeedのURLを見つける。
  3. SubscriberがすでにFeedを取得していたら、6へ。
  4. Subscriber ServerはHTTPでFeedをダウンロードする。
  5. Subscriber ServerはFeedの中からPubSubHubbubのURLを見つける。PubSubHubbubのURLが無ければ、Feedの取得は終了。ポーリングするのはOStatusの範疇じゃない。
  6. Subscriber ServerはPubSubHubbubの仕組みでFeedを取得する。(プッシュ通知を受ける状態にする、ということっぽい。このへんはPub...の仕様を要確認)
  7. Subscriber ServerはSalmonプロトコルでFeedに対するコメントをPublisher Serverにプッシュ通知する。(ここ良くわからない・・・)
12.2.Publisher ServerからのFeedの取得
  1. SubscriberはWebFingerアカウントをPublisher Serverに提供する。(クエリパラメータかPOSTで)
  2. Publisher ServerはWebFingerを通じてそのUserに対するURITemplateを探す。
  3. Publisher ServerはURITemplateをPublisherのFeedのURLで置き換える。
  4. Publisher Serverは先ほど置き換えたURLにリダイレクトさせる。
  5. 12.1の1に戻ってFeedの取得を行う。

13.参考資料

  • [LRDD] Hammer-Lahav, E., “Link-based Resource Descriptor Discovery,” March 2010.
  • [RFC2119] Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels,” BCP 14, RFC 2119, March 1997 (TXT, HTML, XML).
  • [RFC4287] Nottingham, M., Ed. and R. Sayre, Ed., “The Atom Syndication Format,” RFC 4287, December 2005 (TXT, HTML, XML).
  • [RFC4685] Snell, J., “Atom Threading Extensions,” RFC 4685, September 2006 (TXT).
  • [Webfinger] “the WebFinger protocol.”
  • [activitiesinatom] Atkins, M., Recordon, D., Messina, C., Keller, M., Steinberg, A., and R. Dolin, “Atom Activity Extensions (Draft),” March 2010.
  • [activityschema] Atkins, M., Recordon, D., Messina, C., Keller, M., Steinberg, A., and R. Dolin, “Atom Activity Base Schema (Draft),” March 2010.
  • [georss] “GeoRSS-Simple.”
  • [poco] Smarr, J., “Portable Contacts 1.0 Draft C,” August 2008.
  • [push] Fitzpatrick, B., Slatkin, B., and M. Atkins, “PubSubHubbub Core 0.3 -- Working Draft,” February 2010.
  • [salmon] Panzer, J., “The Salmon Protocol,” February 2010.

ActiveMQを使ってみる

Apache ActiveMQhttp://activemq.apache.org/)はオープンソースJMX実装です。

ActiveMQを使うことで、非同期メッセージングサービスの基盤をJVM上で動かすことができます。

導入

ActiveMQのサイトにあるチュートリアルドキュメントは若干古いらしく、現在の最新版(5.4.1)とは微妙に異なります。

$ wget http://ftp.riken.jp/net/apache//activemq/apache-activemq/5.4.1/apache-activemq-5.4.1-bin.tar.gz
$ tar xzf apache-activemq-5.4.1-bin.tar.gz
  • ひとまず起動。
$ cd apache-activemq-5.4.1
$ bin/activemq start
  • ログの確認。
$ tail data/activemq.log
2010-10-12 15:23:17,639 | INFO  | jetty-7.0.1.v20091125 | org.eclipse.jetty.util.log | main
2010-10-12 15:23:18,185 | INFO  | ActiveMQ WebConsole initialized. | org.apache.activemq.web.WebConsoleStarter | main
2010-10-12 15:23:18,396 | INFO  | Initializing Spring FrameworkServlet 'dispatcher' | /admin | main
2010-10-12 15:23:19,164 | INFO  | ActiveMQ Console at http://0.0.0.0:8161/admin | org.eclipse.jetty.util.log | main
2010-10-12 15:23:19,664 | INFO  | Initializing Spring root WebApplicationContext | /camel | main
2010-10-12 15:23:26,272 | INFO  | Connector vm://localhost Started | org.apache.activemq.broker.TransportConnector | main
2010-10-12 15:23:30,693 | INFO  | Camel Console at http://0.0.0.0:8161/camel | org.eclipse.jetty.util.log | main
2010-10-12 15:23:30,882 | INFO  | ActiveMQ Web Demos at http://0.0.0.0:8161/demo | org.eclipse.jetty.util.log | main
2010-10-12 15:23:30,967 | INFO  | RESTful file access application at http://0.0.0.0:8161/fileserver | org.eclipse.jetty.util.log | main
2010-10-12 15:23:31,354 | INFO  | Started SelectChannelConnector@0.0.0.0:8161 | org.eclipse.jetty.util.log | main

Jettyで http://localhost:8161/ に何か起動してますが、管理用のWeb Consoleだそうです。

$ netstat -an | grep 61616
tcp   0 0 :::61616    :::*    LISTEN

MQ自体はデフォルトで61616で待ち受けてます。

  • 止める。
$ bin/activemq stop

続きはまた。

突然ですがOStatusについて

OStatusという仕様について調べてみました。

OStatusについてはこちら。http://ostatus.org/

何者か?

「分散型ソーシャルネットワークを実現するための仕様」のようです。


僕はFacebook、あなたはmixiみたいな状況で、Facebookにしか登録していない僕があなたのmixiフォトをフォローできちゃうよ、というWebサービスの垣根を越えたソーシャルサービスを実現し、


加えて、フォロー、フォロられの仕組みや、フォロワーへの通知処理を分散処理できるようにするよ。


ということのようです。詳しくはこのあたりを。http://shelterroom.net/?q=node/95

どんな仕様か?

最初のURLにも書いてありますが、OStatus自体は以下のようないくつかのプロトコルのベースとした仕様です。

WebFinger

プロフィールを提供するAPIの仕様です。ID管理とか認証とかは関係なく、単に「あなたはだあれ?」というリクエストを解決してくれるもののようです。
詳しくはこのあたりを。http://d.hatena.ne.jp/ritou/20091018/1255798184

PubSubHubbub

PublisherとSubscriberの間にHubを置いて、Publisherからの更新通知(メッセージ投稿とかreplyとか)をSubscriberにプッシュ通知するためのプロトコルです。
詳しくはこのあたりを。http://labs.unoh.net/2009/08/what-is-pubsubhubbub.html

Salmon

これがどうも良くわからないですが、PubSubHubbubを使ったリアルタイムコメント通知のためのプロトコルのようです。
詳しくはこのあたりを。http://www.salmon-protocol.org/

ActivityStreams

RSSフィードのように、フォローしている対象の更新通知を受け取るための仕様のようです。
詳しくはこのあたりを。http://activitystrea.ms/

実装は?

http://status.net/ という実装があります。というか、これを作るにあたっての仕様がOStatusとして定められたようです。


このStatus.netを使えば、フォローシステムを備えたソーシャルWebサービスが簡単に(??)作れて、OStatusの仕様に沿ったサービスと連携できるというわけです。

HotSpot server VMのバグ

JDK1.4.2からJDK1.6.0にあげたら、こんなエラー出た。

#
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 2147483664 bytes for Chunk::new. Out of swap space?
#
#  Internal Error (allocation.cpp:215), pid=26889, tid=1083394400
#  Error: Chunk::new
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0-b16 mixed mode linux-amd64 )
# An error report file with more information is saved as:
# /usr/local/jakarta-tomcat-5.0.30/bin/hs_err_pid26889.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

GCのログを追う限りではメモリが足らないわけではなく、突発的に大量のメモリが必要な処理をしたわけでもなく、突如2Gbyteのchunkをアロケートしようとして落ちるという現象。(物理メモリの空きがほとんど無くて、swapは1Gしかないので・・・)

とりあえず再起動しても、数時間後に同じように落ちる。しかも要求してるchunkのサイズは決まって2147483664 bytes(2^31 -16)。なんかおかしい。

VM起動時の引数は以下のとおり。(一部抜粋)

-Xms700m -Xmx700m -Xnoclassgc
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
-XX:MaxGCPauseMillis=30 -XX:GCPauseIntervalMillis=140

G1GCなんてファンキーなものを使っていたので、これをやめて以下のようにしてみましたが(さまざまな事情により数字が色々変わってます)

-Xss512k -Xms720m -Xmx720m -Xmn320m
-XX:SurvivorRatio=32 -XX:TargetSurvivorRatio=20
-XX:MaxTenuringThreshold=32
-XX:PermSize=80m -XX:MaxPermSize=80m
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
-XX:+UseParNewGC -XX:ParallelGCThreads=2

それでも同じように落ちる。G1GCは関係なかったです。

で、調べてみるとどうやらHotSpot server VMのバグで、JITコンパイラが原因らしいとのこと。*1

というわけで、32bitのJDKを入れて -client でclient VMを使うようにしたら、問題は発生しなくなりました。なりましたが、client VMでずっと動かすのはちょっと。。。

スレッドダンプからJITコンパイラコンパイルしようとしていたクラスとメソッドの情報が出るので、

Current CompileTask:
C2:2054  !   my.package.name.ClassName.methodName(parameter...)Lmy.package.name.ReturnType; (809 bytes)

この情報に基づいて、JITコンパイルから該当メソッドを除外するオプションを指定。

-XX:CompileCommand=exclude,my/package/name/ClassName,methodName

で、64bit server VMに戻したところ、無事稼働中。バグを踏んだメソッドの何がいけなかったのかは。。。不明です。

あと、Sun、というかOracleのバグ情報を探そうとしたんですが、bugs.sun.comがものすごく不親切かつ検索がタイムアウトするので断念。たぶんJDK1.6.0 update 18あたりから既に発生していたようです。要注意。

Scala + Eclipse + Maven on Windows

そういえば、単に開発環境を整えるだけでも一苦労するので、社内の開発環境構築手順としてまとめた内容を加筆修正して晒すことにします。

想定してる環境は以下のとおりです。

  • Windows XP
  • 32bit
  • 2ギガ以上のメモリ(重要)

Java入れる

JDKをダウンロードしてインストールします。

  • Oracleのサイトに行って、環境にあった最新のJDKをダウンロード。いまのとこJDK1.6.0 update 21。
  • ダウンロードした jdk-6u21-windows-i586.exe 的なやつを実行してインストール。
  • 環境変数JAVA_HOMEにJDKのインストールパスを設定。通常は C:\Program Files\Java\jdk1.6.0_21 とか。
  • 環境変数PATHの先頭に %JAVA_HOME%\bin を追加*1

ここまでできれば、コマンドプロンプトからjavaが実行できるはずです。

> java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)

JDK1.6.0 update 21のb06だと、Eclipse Helios(3.6)がうまく動かないので、b07が必要です。
update21のリリース直後にインストールした人はb06になっているので、一度JREJDKを両方アンインストールして、再度インストールしなおしてください。
さらについでに言うと、b07はWindows版だけだそうで、Linux版とSolaris版はb06でOKみたいです。
update22出せよわかりにくいから、という話ですが。

Maven入れる

Mavenをシェルから実行できるようにします。

ここまでできれば、コマンドプロンプトからmavenが実行できるはずです。

> mvn -version
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.6.0_21
Java home: c:\Program Files\Java\jdk1.6.0_21\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"

Scala入れる

Scalaをシェルから実行できるようにします。Eclipseだけでやるなら不要ですが、REPLとか使うのにあったほうがいいです。

ここまでできれば、コマンドプロンプトからscalaが実行できるはずです。

> scala -version
Scala code runner version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL

Eclipse入れる

Eclipseを実行できるようにします。日本語化とかすると動く気がしません。PleiadesとかAll-In-Oneとか入れると安定しません。余分なものを入れると、何か問題があっても原因が良くわからなくなるので、オススメしません。

会社ではGalileo SR2(3.5.2)を使ってますが、ここではHelios(3.6)で説明します。安定してるかどうかはわかんないです。

-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.0.v20100503
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vm
C:\Program Files\Java\jdk1.6.0_21\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xss1M
-Xms40m
-Xmx756m

以下の2行を -vmargs の前に追加。

-vm
C:\Program Files\Java\jdk1.6.0_21\bin\javaw.exe

最後のメモリ関連のVM引数を追加・変更してあります。

-Xss1M  #なくてもいいですが、StackOverflowErrorとか出たら適当に増やしてください
-Xms40m
-Xmx756m  #デフォルトで384mになってますが、適当に増やしてください

Scala IDE入れる

EclipseScalaを使うためのプラグインを入れます。scala-ide.orgに何種類かupdate siteが載ってますが、ここではHelios + Scala 2.8.0.final + リファクタ機能付きのupdate siteを使います。

m2Eclipse入れる

EclipseMavenを使うためのプラグインm2Eclipseを入れます。

  • Scala IDEと同じように、以下のupdate siteからプラグインをインストール&Eclipse再起動。
  • 再起動後、メニューの"Window" -> "Preferences"から"Maven" -> "Installations"を開く。
  • "Add"ボタンを押して、先ほどMavenをインストールしたディレクトリを指定する。C:\App\apache-maven-2.2.1 とか。
  • 画面右下に"Updating indexes"とか出るので、消えるまで気長に待つ。

とりあえずこれで開発準備ができたはず。

*1:環境変数がらみはお好みのやり方で

第一回 Scala座@名古屋

名古屋で開催された第一回Scala座に参加してきました。

http://scalaza.com/?%C2%E81%B2%F3+Scala%BA%C2


プログラミング言語Scala」を肴に盛り上がる、年に1回のScalaのイベント』との名目で @keisuke_n さんの主催で行われました。
まずは @keisuke_n さんはじめ、スタッフの方々に本当に感謝です。すごく楽しいイベントでした。


内容については、Ustreamに録画されたものが残っているようですので、そちらを。

LTの最後のやつは必見です。

http://www.ustream.tv/channel/%E7%AC%AC1%E5%9B%9Escala%E5%BA%A7


さて、発表内容もそうだったんですが、お昼の席でも懇親会でも、OCamlとF#の話が頻繁に出てきて驚きました。
そういうクラスタの人が集まったのかなぁ、という気もしますが、世の中も変わっていくんだよなぁ、という気もしました。

本編で聞いたのか懇親会で聞いたのか忘れてしまいましたが、「Scalaを知っているとF#にも入りやすいよ」とか「OCamlをやることでScalaのことが良く分かると思うよ」という話が印象的でした。

というわけでOCamlの勉強をしようと思います。


あと、東京方面から来ていた人たちで集まって、ホテルでgdgdした挙句、渋谷Scala勉強会(9/8に第2回だそうです)にも参加させていただくことになりました。よろしくお願いします。

http://atnd.org/events/7695


ちなみに、拙いながら事例紹介でLTさせてもらいました。資料は↓です。

https://docs.google.com/leaf?id=0B3gzkyf0Dd_5M2QzMGRkOTUtYTJlNC00YWZhLTg4ODgtOTlmYTg1M2NiNWU3

諸般事情により、当日の資料とは一部異なりますが、そこらへんは察してやってください。

todo

  • twitterアイコンを実写にする
  • 名刺にtwitterアイコンとidを載せる

ボクらのScala 次世代Java徹底入門

「ボクらのScala 次世代Java徹底入門」をようやく読み終えました。

「実質的に」3冊目の日本語Scala本で、かなり平易な記述の入門書です。これまでの2冊「Scalaスケーラブルプログラミング」と「Scalaプログラミング入門」は難易度高めでしたが、こちらはプログラミング初心者でも読めるような作りになってます。

言語が広く普及していくために、こういう入門書って大事ですよね。非常によい本だと思います。

内容はScala2.7.7を対象にしていて、一部Actorのコードなどが2.8ではうまく動かなかったりします。

著者の浅見さんがたぶん一番書きたかったであろう、DSLとActorについての章が最後の30ページくらいにありました。ここはもっと突っ込んだ内容が読みたいなーと思うところです。

ボクらのScala ~ 次世代Java徹底入門

ボクらのScala ~ 次世代Java徹底入門