【MongoDB】 MongoDB事始め

なんとなく必要になってきたのでMongoDBつかってみます.
とりあえず環境構築から、DBの動作確認まで確認。

1. Mac Verでのインストール方法

方法は2種類。port or 公式サイトからバイナリ取得(まあバイナリでなくソースコードverもありますが))

1-1. port利用(ちょっとversionが古め)

sudo port install mongodb;

1-2. バイナリ取得(最新ver 利用)

curl http://downloads.mongodb.org/osx/mongodb-osx-x86_64-1.4.4.tgz
tar zxvf mongodb-osx-x86_64-1.4.4.tgz
cd mongodb-osx-x86_64-1.4.4/bin
ln -s * (どっかパスが通ってるフォルダ)

2 mongodb起動

  • サーバー起動(あるターミナルなどで実行)
mongod --dbpath="どっか適当なフォルダ"(パス指定しないと/data/dbフォルダが標準で利用される) 
  • クライアント起動(別のターミナルなどで実行)
mongo

3. 実際にmongodbを試す

クライアント側で色々と実行する。公式サイトのチュートリアルを試すと良いかと。

use mydb
j = { name : "mongo" };
t = { x : 3 };
db.things.save(j);
db.things.save(t);
db.things.find();
...


後は適当にチュートリアルやってドキュメント読んでソースコードも読めば良いかと。まあ、あまり難しいことはなさそうなイメージ?

  • 参考資料

【Scala】 Lift2.0の環境構築メモ

Lift2.0が2010年6月30日にやっとリリースされたらしいので環境構築メモを残しておいたり.

方法はsbtとmavenの2種類あるっぽいですが、sbt推奨っぽいのでsbtで環境構築。

始めにSimple build toolの設定をする.パスが通っているローカルbinフォルダ(~/bin, ~/local/bin)にsbt-launch.jarを置いて、実行ファイルを作成する

YUKI.N> wget http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.4.jar
YUKI.N> vi sbt
YUKI.N> java -Xmx512M -jar `dirname $0`/sbt-launch-0.7.4.jar "$@"
YUKI.N> chmod u+x sbt

これで、ひとまずsbtの設定は終了

次にliftをdlして解凍. liftフォルダ移動という作業を行う
もしくはgit利用して同様な作業をする。(但し、安定はしてないので環境によっては動かない場合もあるので試すぐらいならtgzの方利用した方がいいかも)

ちなみにlift.tgzってありますが一応versionは2.0です(現状)(versionについては/lift/project/build/LiftProject.scalaファイルで確認できます)

YUKI.N> wget http://liftweb.net/lift.tgz
YUKI.N> tar zxf lift.tgz
YUKI.N> cd lift

or

YUKI.N> git clone http://github.com/dpp/lift_sbt_prototype.git
YUKI.N> cd lift_sbt_prototype 


次にsbtを実行してアップデート実行後サーバー起動(jetty-run)させる

YUKI.N> sbt
> update
> jetty-run

最後にlocalhost:8080にいって動作確認チェックしてとりあえず終了.

ちなみにliftでの作業は基本的にはsrcフォルダで行ないます。

srcのtree構成は以下のとおり.わりかし謎

   |-main
   |---resources
   |-----props
   |---scala
   |-----bootstrap
   |-------liftweb
   |-----code
   |-------comet
   |-------lib
   |-------model
   |-------snippet
   |-------view
   |---webapp
   |-----WEB-INF
   |-----images
   |-----static
   |-----templates-hidden
   |-test
   |---resources
   |---scala
   |-----code
   |-------snippet


あとは、liftのドキュメントなりソースを読んでWebサイトを作ればいいんじゃないでしょうかね。

備考: Lift 2.0の特徴

  • とりあえずMongoDBとCouchDBをサポートしたのがメインっぽいですかね
Lift 2.0's new features include:

-NoSQL support including built-in support for MongoDB and CouchDB
-High performance JSON support including an elegant JSON DSL and bidirectional JSON <-> Class conversion
-Powerful, concise REST support
-Support for enterprise infrastructure including JTA and LDAP
-Declarative systems for single Screen input and validation as well as multiple screen Wizards
-Radically improved development experience including much better error messages and support for dynamically changing system configuration
-Support for running Lift apps outside of a J/EE Servlet containers
-Improved Comet support including modern browser detection and better connection starvation detection
-Improved support for testing including super-concise dependency injection and run-mode detection
-Support for Simple Build Tool
Performance improvements

参考ページ

【データセット】色々なデータセットまとめ

海外中心のデータセットのなんとなくまとめ. 将来的に利用したかったりしたくなかったり

そんなところ. まあ有名所は大体把握しているかと

デザパタGOFデザパタ使用頻度まとめ

結構有名なデザパタのサイト(http://dofactory.com/Patterns/Patterns.aspx)にのってたデザパタ使用頻度をなんとなくまとめてみました。

CがCreation, SがStructure, BがBehaviorの略です。

5

  • C:Abstract Factory
  • C:Factory
  • S:Facade
  • B:Iterator
  • B:Observer

4

  • C:Singleton
  • S:Adapter
  • S:Composite
  • S:Proxy
  • B:Command
  • B:Strategy

3

  • C:Prototype
  • S:Bridge
  • S:Decoraator
  • B:State
  • B:Template Method

2

  • C:Builder
  • B:Chain of Responsibility
  • B:Mediator

1

結論:

  • ランク5はオブジェクト生成管理, APIの抽象化とかオブジェクト監視とかまあよく使うデザパタ
  • 4もまあよく使うが印象的にSingletonは5.過剰に使われているという説あり。
  • 下位のデザパタはあんま見ないような気がする。

AmazonProduct Advertising API関連調査

久しぶりに使いそうになったのでなんとなくライブラリ調査してみました。
2009-11-01 verのが最新版っぽいかと。

swfobject備忘録

swfobject関連の作業を何かしらのキッカケで三ヶ月に一遍くらいするのですが、結構その度に忘れることがあるのでメモ

swfobjectの読み込みはGoogle Hostingを利用する

    • swfobjectを使うときは,Google-hosted content delivery network(CDN)を利用するのが手っ取り早いし、お薦めの手法
    • jQuery Cook Book(洋書, 和訳多分無い)の1.1とかにも載ってるんですけど、最近はjQueryとかPrototypeはGoogle Hostingに任せるのがお薦めの手法で、ライブラリダウンロードしてローカル読み込みは、非推奨とのこと(但し、デバッグ時などにはローカル利用もあり).なんかもう古いやり方だよね的なノリの解説で、ちなみにTwitterとかもjQueryGoogle Hosting経由で利用してます。
    • 推奨理由は以下の通り
      • 安定, 信頼性, 高速, ライブラリ複数バージョンのサポート

となんかいいことづくめな感じ

  • swfobjectの読み込みは以下のように行います
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js"></script>		

swfの読み込みが出来ない

  • きちんと設定したはずなのになぜかswfが読み込まれないというお話
  • swfの読み込みはDocumentrootを基準として読み込む必要がある(未確認)?
    • たとえば,http://hahahahaha/swf/test.swfとおいた場合にはswfobject.embedSWF("/swf/test.swf/", ...)と実行する(まあ別に相対パスでも動きますがね。。 なんか昔嵌った記憶があるのでドキュメントルート指定の方がいいかと)
swfobject.embedSWF("/swf/test.swf", "myContent", "700", "400", "9.0.0", "expressInstall.swf", flashvars, params, attributes);

ActionscriptJavascriptの連携がうまく動作しない

  • ActionscriptJavascript連携する際にはExternalInterface.callとかfscommandを使ってActionscriptからJavascript関数を呼び出すという感じのことをやるのですがこれが上手くいかない というお話。
  • まあ単純にパラメータ指定必要なんですね(たぶん)。。
    • swliveconnect:"true"と設定していない場合fscommandとかでJavascriptと通信できないっぽいです。
    • Flashの読み込みは色々とパラメータ結構多くて厄介。。
var flashvars = {};
var params = { swliveconnect:"true" };
var attributes = { id:"myCom", name:"myCom" };		
swfobject.embedSWF("/swf/test.swf", "myContent", "700", "400", "9.0.0", "expressInstall.swf", flashvars, params, attributes);

ちなみに、何かしらswfobjectに関して上手くいかない場合は, 公式wikiのDocument, FAQ,もしくはTest Suite(swfobjectのテストケース)のソースコードを読むと解決することが多い気がします。
特にtest suiteのソース読む事をお薦めします。テストケースにはswfobjectでやるべき内容が網羅されてるので、swfobjectで出来る大抵の内容は載っています(フルスクリーンとかswf同時読み込みとか)。ちなみにテスト用flaファイルも置いてあるのでそれも参考になりますね。

参考資料

  • swf object test suite
    • テストケースのまとめ. swfobjectでやりたいような内容は大抵網羅されているかと

[Ruby][MySQL] Yahoo Blog APIから取得したBlog情報をSequelを使ってDBに保存する

なんとなく前回の続き。Sequelいい感じですね。
Sequelを使えばAdapterさえあればMySQLでもPostgreSQLでもSQLite3でもほぼ同等な処理がSQLライク(かどうかは謎。。)で使えます。

ちなみに実験用のソースなんでDBのテーブル制約とかは特につけてないです。
require 'yahoo_blog'ってのは前の投稿で書いといた奴です。

とりあえずソースコードgistに貼っつけています。

# -*- coding: utf-8 -*-
require 'rubygems'
require 'sequel'
require 'yahoo_blog'

## DB接続 + テーブル作成 ##

# enocoding => utf8?
# 日本語utf8にしなきゃいけないって記事があったのですが、自分の環境だと問題無し。
options = {}

# user pass mydbは環境に応じて変更。。 
DB = Sequel.connect('mysql://user:pass@localhost/mydb', options)

# テーブルがない場合テーブルを作成(for yahoo blog data)
# BlogIdっているのかな。。

DB.create_table? :yahoo_blog do
  primary_key :id
  String :Query
  String :BlogId
  String :RssUrl
  String :Title
  Text :Description
  String :Url
  String :Creator
  String :MobileLink
  String :SiteTitle
  String :SiteUrl
  DateTime :DateTime
end


## yahoo blogデータの取得

query = "涼宮春日的憂鬱"

yobj = Yahoo_blog_search.new(query)

blog_data = yobj.get_all_processing_data

## BlogデータのDBへの挿入

yblog = DB[:yahoo_blog]

## テーブルにyahoo blogデータを導入する
blog_data.each do |i|
  yblog.insert(:BlogId => i["Id"], :Query => query, :RssUrl => i["RssUrl"],:Title => i["Title"], :Description => i["Description"] ,
               :Url => i["Url"], :Creator => i["Creator"],:MobileLink => i["mobileLink"], :SiteTitle => i["SiteTitle"] ,
               :SiteUrl => i["SiteUrl"], :DateTime => i["DateTime"] )
end

## 導入したデータの出力

puts "Blog count: #{yblog.count}"

yblog.each do |i|
  puts " Query: #{i[:Query]} Title: #{i[:Title]} DateTime #{i[:DateTime]}"
end

テーブルカラムがキャメルケースなのは如何なものかと。まあ、yahoo apiの出力結果に合わせただけなんですが。

上記のソースを実行すると以下のような出力がされまする。とりあえずテーブルにデータが入ってるのが分かるかと思います。
DateTimeをformat変更しないでも導入出来る点が大変よろしいかと。

Blog count: 35
 Query: 涼宮春日的憂鬱 Title: 交響情人夢 - のだめ中国語版 DateTime 2009-10-30 23:55:46 +0900
 Query: 涼宮春日的憂鬱 Title: diary DateTime 2009-08-24 23:59:59 +0900
 Query: 涼宮春日的憂鬱 Title: [Nico字幕組] 涼宮春日的憂鬱「飛〓!巨乳的天使(朝比奈實久瑠)」 DateTime 2009-07-02 01:00:00 +0900
 Query: 涼宮春日的憂鬱 Title: [Nico字幕組] 涼宮春日的憂鬱「我的家人不行〓」ver.2 DateTime 2009-07-01 01:00:00 +0900
 Query: 涼宮春日的憂鬱 Title: 100K+1紀念篇之2 組曲「涼宮春日的憂鬱」 DateTime 2009-06-28 01:00:00 +0900
 Query: 涼宮春日的憂鬱 Title: 「萌え本」の多様化・国際化の歴史 DateTime 2008-12-27 15:31:19 +0900
 Query: 涼宮春日的憂鬱 Title: 台湾旅行レポ〜2日目〜その1 DateTime 2008-07-20 22:51:13 +0900
...

ちなみにSequelで作られたテーブルをMySQLでカラム情報確認すると以下のようになってるのが分かります。
Stringがvarchar(255), textがtext, datetimeがdatetimeといった感じで作られてますね。

mysql> SHOW COLUMNS FROM yahoo_blog;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment | 
| Query       | varchar(255) | YES  |     | NULL    |                | 
| BlogId      | varchar(255) | YES  |     | NULL    |                | 
| RssUrl      | varchar(255) | YES  |     | NULL    |                | 
| Title       | varchar(255) | YES  |     | NULL    |                | 
| Description | text         | YES  |     | NULL    |                | 
| Url         | varchar(255) | YES  |     | NULL    |                | 
| Creator     | varchar(255) | YES  |     | NULL    |                | 
| MobileLink  | varchar(255) | YES  |     | NULL    |                | 
| SiteTitle   | varchar(255) | YES  |     | NULL    |                | 
| SiteUrl     | varchar(255) | YES  |     | NULL    |                | 
| DateTime    | datetime     | YES  |     | NULL    |                | 
+-------------+--------------+------+-----+---------+----------------+
12 rows in set (0.01 sec)

単純にMySQLでデータを見ると以下のような感じで格納されているのが確認されまする。

mysql> SELECT url FROM yahoo_blog;
+----------------------------------------------------------+
| url                                                      |
+----------------------------------------------------------+
| http://blogs.yahoo.co.jp/nakkun_xiaren/59920937.html     | 
| http://d.hatena.ne.jp/bsiyo/20090824/1251125999          | 
| http://nico.pixnet.net/blog/post/28514416                | 
| http://nico.pixnet.net/blog/post/28504268                | 
| http://nico.pixnet.net/blog/post/28462212                | 
..

ちなみに自分が欲しかった、Yahoo Blog APIのDescription(Blogの詳細情報)はBlogの本体情報の始めの部分?をN文字以内にしてsubstringした感じの内容なので、Blogの本体データが欲しい場合はあともう一段階処理する必要がありさうですね。。。

まあ何をしたかったかというと、LSA(潜在意味解析)をBlog情報を元に実行してナニかの類似度を計りたいなーと思っていたところです。。

後はblogのUrl情報からBlog本文情報とってくりゃ終わりですが、はてさて