MongoDBをためしてみた


NoSQLが話題になりはじめてそろそろ1年くらいになるでしょうか。仕事ではMySQLで足りているしスケールアウトが求められる案件もでてこないので触ることもなく時は過ぎ・・
触ってみなければと、Herokuで使えるということもありMongoDBを使ってみました。
環境はCentOS5.5。


インストール

ここから環境にあったものをダウンロードします。

$ wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.5.tgz
$ tar zxvf mongodb-linux-i686-1.6.5.tgz
$ cd mongodb-linux-i686-1.6.5/bin

データベースを作成するディレクトリを適当に作成します。

$ makedir ~/mongodb

binディレクトリ内のmongodを実行するとフロントエンドで起動するみたい。--dbpathオプションで先ほど作成したディレクトリを指定します。

$ ./mongod --dbpath ~/mongodb

バックエンドで実行するには、--fork --logpath ~/mongodb/mongodb.log のようにします。


シェルから使ってみる

別のターミナルを開いてmongoコマンドを実行すると、シェルが起動してMongoDBに触れることができます。
ではmongoっと

$ ./mongo
MongoDB shell version: 1.6.4
connecting to: test
> 


公式にチュートリアルがありますが、Masatomo Nakanoさんが翻訳されたDeveloper Zoneがわかりやすいです。


ドキュメントの作成にはsaveを使います。コレクション名をusersとすると

> db.users.save({firstname: "taro"})

ドキュメントの取得はfindを使います

> db.users.find()
> { "_id" : ObjectId("4d6367286681d38c875e50f7"), "firstname" : "taro" }

削除はremove。

> db.users.remove({firstname: "taro"})

removeでパラメータ指定なしにすると全削除されます

> db.users.remove()

基本操作は分りやすいです。またシェルはJavaScriptを使えるのでいろいろと書けるようです。
id:babie さんの以下のページがわかりやすくまとまっています。

ハンズオンで分かる MongoDB チュートリアル - babie cruising love


MongoDBの停止

フロントエンドで動かしているときは、Ctrl+cでよいそう。バックエンドの実行は、kill -2 (プロセスID)を実行します。


MongoDBが起動しない場合

起動しなくなったら、--repairをつけて実行する。このコマンドはそのまま終了してしまうので再度通常の起動方法で実行する。

$ ./mongod --dbpath ~/mongodb --repair
・・・・・・
Tue Feb 22 17:32:20 [initandlisten] shutdown: removing fs lock...
Tue Feb 22 17:32:20 dbexit: really exiting now
$ ./mongod --dbpath ~/mongodb

サービスが開始した時に案内をもらう「Notify Me」を試してみた

MOONGIFTさんで紹介されていた、「Notify Me」を試してみた。

サービスが開始した時に案内をもらう。メールアドレス登録システム「Notify Me」|オープンソース・ソフトウェア、ITニュースを毎日紹介するエンジニア、デザイナー向けブログ


フレームワークsinatraでデータベースはsqlite3を使用しているシンプルなWebアプリケーションです。

Page not found · GitHub


■導入手順(OS: CentOS5.2)

sqlite3をいれてから、sqlite3-rubyをgemでインストールします

$ gem install sqlite3-ruby

sinatraを入れます

$ gem install sinatra sinatra-sequel

次のコマンドを実行すると、notify-me.dbというデータベースファイルが作られてサーバが起動します

$ ruby -rubygems notify_me.rb


sinatraなので、http://localhost:4567 にアクセスします。


メールアドレスを入力して「NotifyMe!」ボタンをクリックすると完了画面が表示されます。


データベースを見てみる

$ sqlite3 notify-me.db
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from subscriptions;
1|test1111@yahoo.co.jp|2011-02-09 11:34:31.491670+0900
sqlite>

ちゃんと入ってますね!

MacBook Air 11インチ欲しい!

はてなダイアリーでブログを書くだけでMacBook Airが当たるキャンペーンを実施中ですが、締め切りが迫ってきたのでエントリーしておこうかと。


MacBook Air 11インチ欲しい!とは - はてなキーワード


やっぱり、外出時にMacBook Pro13は重く感じる。
最近は勉強会へいくと、Air11を持っている人が結構いるし開発環境とするにも問題ないみたいだしな。

しかしこの日ではてブ3900もいってるのが凄いな

サーバ監視 phptopを動かしてみた

以下で紹介されていたサーバ監視ツールphptopを試してみた。


サーバ上で動いてるどのphpが重いか?を調べられる「phptop」:phpspot開発日誌


本家はこちら PhpTop – Bearstech Forge


ただすんなり動かなかったのでメモ。環境は、CentOS 5.2, PHP 5.2

phptopのサイトからダウンロードして解凍

$ wget http://forge.bearstech.com/trac/raw-attachment/wiki/PhpTop/phptop-0.5.2.tar.gz
$ tar -zxvf phptop-0.5.2.tar.gz
$ cd phptop-0.5.2/

$ ./phptop -t 15 -s mem

実行するとエラーが

Can't locate Term/Size.pm in @INC (@INC contains: 

Term-Sizeがないらしい

※2010.12.21 追記)CPANモジュールを入れるのがいいみたい

$ perl -MCPAN -e shell
cpan> install Term::Size

こちらは自分で試したもの

$ yum --enablerepo=rpmforge install perl-Term-Size


インストールして実行するとまたエラーが

Bareword "POSIX::LC_NUMERIC" not allowed while "strict subs" in use at ./phptop line 118.
BEGIN not safe after errors--compilation aborted at ./phptop line 357.

よくわからないので118行目をみてみる

$ vi phptop

setlocale(POSIX::LC_NUMERIC, 'C'); # Use . as decimal separator


locale?よくわからん。。
とりあえずこの行をコメントにして保存して実行!

Error: no log files found/processed. Tried: /var/log/apache2/error*log, /var/log/apache2/*/error*log

apache2 ?
ソースを見ると確かに356行目、

push(@log, '/var/log/apache2/error*log', '/var/log/apache2/*/error*log'        ) if !@log;


自分の環境は、/var/log/httpd なのでパスを変更して、今度こそ・・

URL                       Hit     Time     User      Sys >Mem/hit  Mem_max
http://xxxx/test1           2      0.8      0.7      0.1      8.2      8.2
http://xxxx/test2           1      0.3      0.2      0.0      8.2      8.2
http://xxxx/test3           2      0.5      0.4      0.0      8.2      8.2
http://xxxx/test4           1      0.3      0.2      0.0      8.0      8.0
http://xxxx/test5           1      0.2      0.2      0.0      8.0      8.0
http://xxxx/test6           9      2.4      1.6      0.1      7.2      7.2
Total (from last 15 min)   16      4.5      3.3      0.3


でたー!

コマンドの15は最後の15分間分を出力ということなので、適宜変更すればOK。
htmlに出力するときは、-o html オプションをつける。

$ ./phptop -t 15 -s mem -o html

Visual Studio2008でVimライクにするViEmu

かなり今更感がありますが、VS2008を使う仕事がきたため仕方なくVSを起動してみた。
VSはIDEとしてはいいのだけどVimに慣れているとハンパなくストレスがたまります。
ということでVimキーバインドにしてくれるものを探したところ、ViEmuというのがありました。


ViEmu: vi-vim editor emulation for Xcode, Visual Studio, Word, Outlook and SQL Server


99ドルですが、1ヶ月は無料で使えるようです。

インストールしてみたところ、これはいい!Vimっぽくキーバインドがなるのかと思いきや
モードがNormal,Visual,InsertなどありVimと同じように操作できます。

また、ホームディレクトリに_viemurcファイルを置くことでカスタマイズが可能です。
ただ、Ctrl-[ でESCとならなかったり(Ctrl+@になっている)、whichwrap が使えなかったりと完全にVimと同じようにはいかないところはあります。

whichwapは、

nnoremap h       <backspace>
nnoremap l       <space>
nnoremap <Left>  <backspace>
nnoremap <Right> <space>

とすることでなんとかできます。
当然インストールしてもVSの補完機能はそのまま動くのでかなり快適になりますし、VS2008が続きそうなので購入することになりそうです。

因みにVisual Studio2010にはフリーでVsVimというのがあるらしいです。


VsVim extension

Google AJAX Search API ウェブ検索の表示部分をカスタマイズしてみる

Google AJAX Search APIのウェブ検索を使うと、Googleで検索した結果をすばやく表示することができます。
ただデフォルトだとGoogleの検索の表示イメージそのままなので、今回は検索ボックスなし、結果はタイトルのみ、ページングリンクはなしというをやってみた。

<script language="Javascript" type="text/javascript">
google.load("search", "1", {"language" : "jp"});

function OnLoad() {

    var searcher = new google.search.WebSearch();  //Web検索
    searcher.setSearchCompleteCallback(searcher, searchComplete, null);
    searcher.execute('iphone4');  //検索キーワード指定

    function searchComplete(){
        showSearchResults(this.results,document.getElementById('searchResults'));
    }

    // 検索結果を表示
    function showSearchResults(searchResults,domElement){
        if (searchResults && searchResults.length > 0) {
            domElement.innerHTML = '';
            for (var i = 0; i < searchResults.length; i++) {
                var result=searchResults[i];
                domElement.innerHTML += '<a href="'+ result.url  +'" target="_blank">'+ result.titleNoFormatting + '</a><BR>';
            }
        }
    }
}

google.setOnLoadCallback(OnLoad);
</script>

<body>
<div id="searchResults"></div>
</body>


キーワード「iphone4」の結果。タイトルのみ表示してリンクをはっています。

Xcodeで「Base SDK Missing」と表示されてビルドできない

iOS4.0.1がリリースされて新しいXcodeSDKをダウンロードしてインストールすると、SDK3.2で作成したプロジェクトを開くと、「Base SDK Missing」と表示されてビルドができない状態になっています。

以下の方法で対応できます。

  1. Xcodeの上メニューの[プロジェクト]→[プロジェクト設定を編集]を選択します
  2. [ビルド]タブを選択します
  3. [ビルド設定内を検索]に「sdk」と入力すると項目が絞られすぐに見つけることが出来ます。[ベース SDK」の右側(値のところ)にある「iPhone デバイス」をクリックして目的のSDKを選択します。




これでビルドできるようになります。