2011年3月6日日曜日

ScalaとMongoDBでコミュニティ機能開発中

http://croquis.fungoing.jp/demo

Scala+MongoDB(コミュニティ機能用Widget)をちまちま作っています。
ベースはLift2.2+foursquareのRogue。

今風のコミュニティ機能をいくつかのシステムで使いそうなのである程度抽象化して公開するつもり。
今のところコメントのところまではできたけどまだ公開するには微妙な感じ。

まだ書き切れてないRogueの記事はこれをコードをもとにしようと考えています。

資料はこちら。文章はかなり適当です、、、
英語なのは日本でScalaのMongoDBの情報書いてもニーズなさそうだから。
せめて文章は読み書きできるようがんばる。

2011年2月18日金曜日

Amazon S3で静的サイトが作れるようになったらしいので早速試してみた

またAWSが強化されたらしいので軽めの記事。Rogueの記事は少々お待ちください・・・。
Amazon S3 Announces New Features for Hosting Static Websites

~
With these new features, Amazon S3 now provides a simple and inexpensive way to host your website in one place. To get started, open the Amazon S3 Management Console, and follow these simple steps:

1) Right-click on your Amazon S3 bucket and open the Properties pane
2) Configure your root and error documents in the Website tab
3) Click Save
~
ということらしいので早速試して見る。実験台はリニューアル前の会社サイト。


コンソールにログインしてBucket作成→Propertyとすると確かにWebsiteというメニューがいた。
とりあえずEnableにしてIndex Documentにindex.htmlを指定。すぐ下にはEndpointURLへのリンクがあるのでファイルを一式アップロード+Permissionをeveryone/openにしてEndpointにアクセスしてみる。


おぉ、動いている。しかしこのままではURLがださすぎる。


Websiteのドキュメントではなさそうだけど↑にCNAMEで指定しなよ!と書いてあるので指定。
s3hosting.fungoing.jp CNAME s3hosting-fg.s3-website-us-west-1.amazonaws.com
で設定してアクセスしたらそんなBucketはねーよ!といわれて怒られる。よく読んだらBucket名とドメイン名一緒にしろや的なことが書いてたので気を取り直して再設定。
s3hosting.fungoing.jp CNAME s3hosting.fungoing.jp.s3-website-us-west-1.amazonaws.com


デ、デキター!

ちょっとしたサイトならほとんどお金もかからないだろうし、突発的にアクセスが増えても平気そう。設置も便利だしなかなか使える機能なんじゃないでしょうか。

それにしてもAWSは何でもありになってきてますね。使う側としては便利になってとても助かります。

WebSite Hostingのドキュメントはここから。

2011年2月15日火曜日

Lift用Scala DSL"Rogue"を使ってMongoDBにアクセス(1)~概要編~

実際に利用しはじめたので少しずつメモ。
今日はまず最初ということで
  1. Rogueの説明
  2. 静的型付け言語とMongoDB
  3. net.liftweb.mongodb.recorddbの問題
  4. タイプセーフにMongoDB
あたりを書いていこうと思います。

Scala DSL"Rogue"について

位置情報サービスのFourSquareが公開したMongoDB用のScala DSL。同社はLiftのユーザ企業としても有名でかなりノウハウが蓄積しているはずなのでとても期待できそうです。
詳細な↓の記事にありますが、タイプセーフにMongoDBのクエリを操作できることが特徴のようです。

Rogue: A Type-Safe Scala DSL for querying MongoDB

GitHub:foursquare / rogue

静的型付け言語とMongoDB

利用を始める前に、そもそもScalaからMongoDBを利用するのってどうなの?という話から。
ある程度MongoDBを理解しているという前提で書いていきますが、MongoDBの特徴としてスキーマレスであることが挙げられます。データはJSONに似たBSONで格納されておりとても自由にデータを格納していけます。

これをRuby、PHP、JavaScript等の動的型付け言語から使うぶんには非常に楽なのですが、静的型付けの場合なんらかの型に変換しないといけません。

Liftの場合、標準で利用できる方法として
  1. JavaのMongoDBライブラリを利用
  2. MongoDocumentを利用してオブジェクトにマッピング
  3. MongoRecordを利用してオブジェクトにマッピング(Rogueで利用)
があり、Rogueは3をベースに利用しています。

実際に使っていて感じるのは、やはりユーザーに提供する部分ではスキーマレスの自由さは一長一短だなということ。使いやすくはあるのですがなんでもありなのでテストや検証に結構手間がかかります。

その点、Scalaのオブジェクトにマッピングしてしまえばコンパイル時にほとんどの問題を解決してくれるので意外と相性いいんじゃないの?という印象。Javaから使うと泣ける気はしますが。

しかし、LiftのMongoRecordにはとんでもない問題があります。。。

net.liftweb.mongodb.recordの問題

結論からいうと、createとかfindしてとってきた後のアクセスはタイプセーフなのにfind用クエリやupdate用クエリがタイプセーフにならないLiftwebのWiki(http://www.assembla.com/wiki/show/liftweb/lift-mongodb-record)に掲載されている次のサンプルコードをご覧ください。

class ArticleDoc private() extends MongoRecord[ArticleDoc] with MongoId[ArticleDoc] {
def meta = ArticleDoc
object name extends StringField(this, 20)
object price extends DoubleField(this)
}
object ArticleDoc extends ArticleDoc with MongoMetaRecord[ArticleDoc] {
override def collectionName = "articles"
}
ArticleDoc.createRecord.name("milk").price(25).save
import net.liftweb.json.JsonDSL._
ArticleDoc.findAll("name" -> "milk")
ArticleDoc.findAll("price" -> ("$gte"->25))
ArticleDoc.findAll(("name" -> "milk")~("price" -> ("$gte"->25)))

最後の三行、findAllの引数がひどいですね。JsonをDSLで書いてるだけなのでまったくタイプセーフじゃありません。うっかりタイポして変な値が入る可能性がありそうです。
これじゃ書くのがめんどくさいだけの存在になってしまいます。Recordはタイプセーフなのでそこそこましではあるでしょうが・・・。

タイプセーフにMongoDB

そこでScala DSL"Rogue"の出番です。Rogueを使うとfindやupdateのクエリをタイプセーフに書くことができます。きっとFoursquareの中の人も上記MongoRecordの仕様に憤慨したんでしょう・・・。

先ほどのfindAllをRogueを使って書き直すとこうなります。

ArticleDoc where ( _.name eqs "milk" ) fetch
ArticleDoc where ( _.price >= 25 ) fetch
ArticleDoc where ( _.name eqs "milk" ) and ( _.price >= 25 ) fetch
この書き方だと存在しないプロパティを指定するとコンパイルエラーになります。あわせて記述もすっきりするのでいいことづくめですね。

LiftでMongoDBを利用する場合、今後はRogueを併用するのがよさそうです。

今後の予定

  • Rogue導入
  • MongoRecordの定義
  • Rogueの各種機能
あたりを順次書いていくつもり。

2011年1月27日木曜日

Lift+MongoDBのScala DSL「Rogue」

いつのまにやらFoursquareさんがLiftのMongoDB用DSLを公開していた。

https://github.com/foursquare/rogue/blob/master/src/test/scala/com/foursquare/rogue/QueryTest.scala
テストコードをみる限り、かなりシンプルに書けそう。

しかし今使ってるのがMongoDocumentだしLift2.1だからかなりのリファクタが必要。
新しいのをさくっと作ってそっちで試したほうがいいかな。
Updateクエリがどうしてもひどくなるから現状のJsonDSLスタイルはどうにかしたい。

2011年1月26日水曜日

.stドメインを取る時は公式レジストラのnic.stでOK

ちょっとしたドメインハックがしたくてstドメインを取得。
国内でもいくつか業者があるっぽいけど無駄に高いし公式レジストラのnic.stがよくできてるからそっちを使った方が圧倒的にいいんじゃなイカ?

stドメインはサントメ・プリンシペ共和国っていうアフリカの島国がもってるccTLD。toのトンガとかtvのツバルと同じく外国の業者に委託して外貨を稼ごうタイプのドメインで、そしてそれを管理してるのがスウェーデンのBahnhof ST Registryです。

でここが自前でnic.stってサイトをやってて普通にオンラインで買えます。ショップも使いやすいし意味不明な国内業者に頼む必要なんてまったくないです。

http://www.nic.st/

値段は1年€35。そこそこ高いけどまぁそこまで気にならない価格かな?whois情報を隠すのも€5でやってくれるのでとりあえずON。5年だと€125で結構安くなるから長期的に使いそうなら更新時に伸ばす。

Paypalのクレジット決済に対応してるのでさくっと決済もできて満足。
サイトは英語だけどたいしたこと書いてないので普通に読めるかと。

2011年1月15日土曜日

Facebookのファンページを作ってみた


慣れないながらも作ってみました。
↑トップにLikeboxも置いてみた。
※今朝更新してトップにいくと喋りはじめるのでご注意ください

Likeが増えるとパワーアップするらしいのでアカウントお持ちの方よければご協力おねがいしたく、、、

2011年1月5日水曜日

WebサービスをScala+LiftでUI Firstに作る


Scala勉強会第19回 in 渋谷で発表したスライドをアップしました。
内容はコードや仕組みよりどう使っていくかの部分。LiftはView-Firstという珍しいスタイルなので使いどころを考える必要あり、というお話。

50画面くらいで細かいパーツやフォームも多いサービスを学習時間込み1.5~2月で作れたので生産性はなかなか良いと思います。
(マークアップの時間もかなり含んでるのでLift部分だけなら1月未満)

サービス自体は11日Openなので、MongoDBもあわせていい事例になるよう頑張ります。