アーカイブ

‘プログラミング’ カテゴリーのアーカイブ

NoSQL Cassandraを使ってみる ~Rubyでアクセス編~

2010 年 7 月 30 日 takus コメントはありません



NoSQL Cassandraを使ってみる ~インストール編~
においてインストールから、コマンドラインでの値の取得について説明した。今回はその続きとして、RubyからCassandraにアクセスして値を取得してみる。


Rubyでアクセスするためのライブラリをインストール

なお、CassandraはThriftという言語バインダ用のライブラリを介してアクセス用のライブラリを提供しおり、ほとんどの言語からアクセス可能である。Rubyの場合は、これをRubygemsからインストールできる。


$ su
$ gem install cassandra

Rubyでアクセスしてみる

前回保存した値を取得して、標準出力に出力するコードは以下のようになる。


#!/usr/bin/ruby
require 'rubygems'
require 'cassandra'
include Cassandra::Constants
keyspace1 = Cassandra.new('Keyspace1')
keyspace1.get(:Standard1, 'jsmith') .each do | column, value |
puts "#{column} = #{value}"
end

保存したら実行してみる。

$ ./ruby_access.rb
age = 42
first = John
last = Smith

思ったより簡単に値を取得できた。しかし、まだアプリケーションを作る際に具体的にどのようなデータ構造にするのがいいのか想像がついていない。

カテゴリー: データベース タグ: ,

NoSQL Cassandraを使ってみる ~インストール編~

2010 年 7 月 29 日 takus コメントはありません

Cassandra入門と、さらに詳しく知るためのリソース集 ? Publickey
こんな記事が上がっていて、Cassandraにも興味が出てきたので触ってみた。

Cassandraって?

Cassandraは最近流行りのNoSQLの一つ。Facebookで大規模データ処理のために開発されて、現在はオープンソースとなって、Apache Software Foundationのプロジェクトとして開発が進んでいる。イマイチ理解はしきれていないが、多次元のデータが保持できるKey-Valueストアという認識をしている。ちなみに、SQLの用語と比較すると
データベース → キースペース
テーブル   → カラムファミリー
主キー    → key
カラム    → カラム
と対応づけられるようである。参考:みてわかるクラウドマガジンvol.1 (日経BPパソコンベストムック)



インストール

CassandraはJavaで実装されているのでプラットフォームには非依存。(Ver.は1.6以上が推奨)
今回はFedora12 x86_64にインストールしてみた。

$ which java
/usr/bin/java
$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8) (fedora-39.b18.fc12-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
$ su
$ cd /usr/local/src
$ wget "http://www.meisei-u.ac.jp/mirror/apache/dist/cassandra/0.6.2/apache-cassandra-0.6.2-bin.tar.gz"
$ tar -zxvf apache-cassandra-0.6.2-bin.tar.gz

バイナリで配布されているので解凍したら特にコンパイルする必要もない。

実行

早速、実行してみる。


$ cd apache-cassandra-0.6.2
$ ./bin/cassandra -f

メッセージがいくつか表示されて起動した。クライアントも容易されているので接続してみる。デフォルトではKeyspace1というキースペースとその中に4つのカラムファミリーがあり、外部から接続するポートは9160に設定されている。ちなみにこれらの設定は、conf/storage-conf.xmlに記述されている。

$ /usr/local/src/cassandra/bin/cassandra-cli --host localhost --port 9160
Connected to: "Test Cluster" on localhost/9160
Welcome to cassandra CLI.
Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
cassandra> set Keyspace1.Standard1['jsmith']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['age'] = '42'
Value inserted.
cassandra> get Keyspace1.Standard1['jsmith']
=> (column=6c617374, value=Smith, timestamp=1280391013700000)
=> (column=6669727374, value=John, timestamp=1280390971929000)
=> (column=616765, value=42, timestamp=1280391004923000)
Returned 3 results.

setでデータを保存し、getでデータを取得することに成功。せっかくなのでこれでちょっとしたアプリケーションを作ってみたいと思っている。

参考サイト

アグレッシブエンジニア: cassandraに挑戦 その2 インストール

カテゴリー: データベース タグ: ,

Fedora12でGitの初期設定

2010 年 7 月 27 日 takus コメントはありません

インストール


$ yum install git-core

yumからインストールできる。

初期設定


$ git config --global user.name "takuss"
$ git config --global user.email takus@example.com"
$ git config --global color.ui auto

ユーザ名とメールアドレスを登録しておく。color.uiはコマンドからの出力が見やすくなる。
これらの設定は $HOME/.gitconfig に記述され、ホスト上で作る全てのリポジトリに適用される。

カテゴリー: Git タグ:

Rubyでアルゴリズム 第02回 ~クイックソート編~

2010 年 7 月 27 日 takus コメントはありません

前回の Rubyでアルゴリズム 第01回 ~バブルソート編~ に続いて、今回はクイックソートに取り組んでいく。

クイックソートって?

例のごとくWikipediaを見てみると、

クイックソートは、1960年にアントニー・ホーアが開発したソートのアルゴリズム。分割統治法の一種。

最良計算量および平均計算量はO(n log(n))>である。他のソート法と比べて、一般的に最も高速だといわれているが対象のデータの並びやデータの数によっては必ずしも速いわけではなく、最悪の計算量はO(n^2)である。また数々の変種がある。 安定ソートではない。

wikipedia:クイックソート

どういう風にソートを行うのかはこれだけでは分かりにくいが、安定ソートでないといった特徴を把握した上で活用すれば役立ちそうだと推測できる。



具体的なソートの方法は?

簡単に説明すると、

  1. 要素の中から軸(ピポット)を1つ決める
  2. その軸より小さい値と大きい値のグループに分ける
  3. それぞれのグループで1.2を実行する
  4. それ以上は分割できない状態になればソーティング終了

という方法によりソーティングが可能である。

ちなみに軸の選び方は
 (1)完全にランダムに選ぶ
 (2)適当な3つの値の中央値を選ぶ
といった様々な変形パターンが存在する。



実装

今回の実装は様々な戦略のうち、軸をランダムに選ぶ方法で実装を行った。


class Array
  def sort
    quickSort(self, 0, self.length-1)
  end
 
  def quickSort array, left, right
    if left > right then
      pi = partition(array, left, right)
      quickSort(array, left, pi-1)
      quickSort(array, pi+1, right)
    end
  end
 
  def partition array, left, right
    p = left + rand(right - left)
    self[p], self[right] = self[right], self[p]
    store = left
    (left..right-1).each do |i|
      if array[i] <= array[right] then
        self[i], self[store] = self[store], self[i]
        store += 1
      end
    end
    self[store], self[right] = self[right], self[store]
    return store
  end
end


まとめ

  • 最良時、平均時には O(n log(n)) でソートが可能。
  • 軸を選択するときに常に左端、または右端を選んでしまうと最悪時になり、O(n^2)の計算時間がかかる
  • 軸の選択方法、要素が少なくなると挿入ソートに切り替える等の亜種が存在する

追記 2010/07/28

よく考えるとquicksortとpartitionの引数arrayは必要なさそう...。

そのうちもう一度考える。

カテゴリー: Ruby, アルゴリズム タグ:

Javaでスタックトレースを表示する (メソッドの呼び出し元を特定する)

2010 年 7 月 27 日 takus コメントはありません

デバッグしていて、あるメソッドが複数の場所から呼ばれることがある場合、どこからメソッドが呼ばれているのか特定したいときがある。そんな時にはスタックトレースを表示するのが便利。

Javaでは、以下のように記述すれば、呼び出し元のクラス名、メソッド名を出力できる。

StackTraceElement[] e = new Exception().getStackTrace();
for (StackTraceElement element : e)
System.out.println(element.getClassName() + "," + element.getMethodName());

参考サイト

Java: メソッドの呼び出し元を調べる方法 – sardineの日記

カテゴリー: Java タグ:

Rubyでアルゴリズム 第01回 ~バブルソート編~

2010 年 7 月 26 日 takus コメントはありません

Rubyを学びつつアルゴリズムも復習し直そうということで、1日1記事を目標にやっていけたらと思っている。記念すべき初回である今回はバブルソートを実装。



バブルソートって??

Wikipediaにはこんな風に書いてある。

バブルソート(bubble sort)は、ソートのアルゴリズムの一つ。隣り合う要素の大小を比較しながら整列させること。最悪計算時間がO(n^2)と遅いが、アルゴリズムが単純で実装が容易なため、また並列処理との親和性が高いことから、しばしば用いられる。安定な内部ソート。基本交換法、隣接交換法ともいう。

wikipedia:バブルソート

簡単に言うと、隣り合う要素を順々に比較して要素の順序を入れ替えるという操作を全ての要素に行うことで整列を行うといったとこだろうか。



実装

Arrayクラスのsortメソッドをオーバーライドしてみた。


class Array
    def sort
        unsorted_length = self.length-2
        begin
            unsorted = false
            (0..unsorted_length).each do |i|
                if(self[i] > self[i+1])
                    unsorted = true
                    self[i], self[i+1] = self[i+1], self[i]
                end
            end
            unsorted_length -= 1
        end while (unsorted)
    end
end

素直に実装するとこんな感じになりそう。

今回Rubyを書いていて、


self[i], self[i+1] = self[i+1], self[i]

こういう書き方ができることを初めて知る。

Cだと、一時変数なんかを使って、


tmp = self[i]
self[i] = self[i+1]
self[i+1] = tmp

とか書きそうなとこ。

この辺が、Rubyが直感的に理解しやすいコードが書けると言われている所以なのかと想像。



バブルソートのまとめ

少し脇道に反れたが、最後にまとめ。

  • アルゴリズムが簡単で、実装も楽
  • 最悪時は計算時間がO(n^2)かかってしまう

カテゴリー: Ruby, アルゴリズム タグ:

Rubyで簡単にベンチマークを行う方法

2010 年 7 月 26 日 takus コメントはありません

何かの処理時間を測定したいときに便利。

Benchmarkモジュールを利用する。


require "benchmark"
puts Benchmark::CAPTION
puts Benchmark.measure{
    process()
}

たとえば、1000個の要素を持つ配列のソート時間を調べる場合は以下のようになる。

require "benchmark"
N = 1000
array = Array.new( N )
(0..N).each do |i|
    array[i] = rand(10000)
end
puts Benchmark::CAPTION
puts Benchmark.measure{
    array.sort
}

結果はこのように出力される。

ちなみに単位は秒。

user     system      total        real
0.000000   0.000000   0.000000 (  0.000158)

参考サイト

benchmark – Rubyリファレンスマニュアル

カテゴリー: Ruby タグ:

Windows で コマンドプロンプトから Java のプログラム実行時に NoClassDefFoundError が発生する問題

2009 年 10 月 17 日 takus コメントはありません

ちょっとハマッたのでメモ.

JavaでTCPサーバを書いてWindowsのコマンドプロンプトでコンパイルして実行しようとすると,

java TCPServer
Exception in thread "main" java.lang.NoClassDefFoundError: tcp/TCPServer (wrong name: tcp/TCPServer)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: tcp.TCPserver.  Program will exit.

という,エラー.
コンパイルは通る,classファイルもある.
どうしたものかと思って原因を調べると,原因が判明.

どうやらJavaのクラスファイルは、packageの階層と同じディレクトリ構造にしないといけないらしく.

この例であれば、tcpserverというディレクトリを作り、
その中にコンパイルしたTCPServer.classを入れ、tcpserverの上位ディレクトリから

java tcpserver.TCPServer
もしくは
java tcpserver/TCPServer

で起動できるらしい.

Java未だによく分かってない.
勉強せねば...

参考リンク
実行時のNoClassDefFoundErrorが解決できません (http://oshiete1.goo.ne.jp/qa3105812.html)

カテゴリー: Java タグ:

CentOS5.3にErlangをインストール

2009 年 8 月 25 日 takus コメントはありません

分散プログラミングがしやすそうなのでErlangの勉強を始めた.

Erlangの本はコレ1冊あれば十分らしいので,とりあえずこれを読んでいく.

プログラミング言語Erlang
プログラミング言語Erlang

早速,ErlangをCentOS5.3にインストールしてみた.
yumで入れられなかったため,Erlangのサイトから最新のソースをDLしてコンパイル.

% wget http://www.erlang.org/download/otp_src_R13B01.tar.gz
% tar zxf otp_src_R13B01.tar.gz
% cd otp_src_R13B01/
% ./configure
% make
% su -
% make install
%

configureの最中に
No curses library functions found
というエラーが発生.

% sudo yum install ncurses-devel

で無事に解決.

ひとまずインストールは終わった.
Ubuntuならapt-get,MacならMacPortsでいれられる模様.

参考
http://d.hatena.ne.jp/shimooka/20070527/1180201255
http://d.hatena.ne.jp/sotarok/20080204/1202123608

カテゴリー: Erlang タグ:

EclipseでGoogle APIプログラミング~環境の構築

2009 年 6 月 13 日 takus コメントはありません

EclipseでGoogleのAPIをいじるプログラムを書こうと思い、Coding in the Shade: Using Eclipse with Google Data APIsを見ながら設定していたのだが、いつまでもサンプルプログラムが動かず苦労したので、ここに導入方法をまとめておく。

Eclipse導入・目次

1. Eclipseのダウンロード
2. GData Java Client Libraryのダウンロード
3. その他必要なライブラリのダウンロード
4. サンプルプロジェクトの作成
5. サンプルプログラムの実行


1. Eclipseのダウンロード

まずは、公式サイトからEclipseを落とす。いろいろ種類があるが、ひとまず「for Java Developers」で大丈夫そう。DLが終わったら、起動して適当な場所にworkspaceを作成する。


2. GData Java Client Libraryのダウンロード

続いて様々な機能を提供してくれるGData Java Client Libraryをダウンロードしてくる。ここからダウンロード可能。ライブラリの中身も見たい人はsrcをダウンロードしてもいいが、APIを利用するだけであれば、samplesの方でOK。解凍したら、eclipseフォルダに入れておく。


3. その他必要なライブラリのダウンロード

そのほか必要になるファイルをダウンロードしてくる。
Filename Location
mail.jar Sun’s JavaMail API
activation.jarSun’s JavaBeans Activation Framework
servlet-api.jar Apache Tomcat
これらのファイルは、eclipse/gdata/third_partyに入れておく。


4. サンプルプロジェクトの作成

適当な名前のプロジェクトを新規作成し、最下部の「next」を押す。上のタブから「Libraries」を選び、「Add External JARs」から、/gdata/java/libにあるgdata-client, gdata-client-meta, gdata-core, gdata-media, data-docs, gdata-docs-metaを追加する。

次に、3で/gdata/third_partyに保存したmail.jar, servlet-api.jar, activation.jarを読み込む。

Googleのドキュメントには上のライブラリを読み込めばいいと書いてあるが、これだけでは何度やってもサンプルプログラムで “java.lang.NoClassDefFoundError“エラーが出てしまっていたが、gdata/java/depsにあるgoogle-collectjsrを読み込むことで解決した。


5. サンプルプログラムの実行

ここまで来れば、あと一息。Googleドキュメントの文書タイトルを読み込むサンプルプログラムを実行してみる。

import java.net.URL;
 
import com.google.gdata.client.docs.DocsService;
import com.google.gdata.data.docs.DocumentListEntry;
import com.google.gdata.data.docs.DocumentListFeed;
 
public class testDocumentsList {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			DocsService service = new DocsService("Document List Demo");
			service.setUserCredentials("your_id@gmail.com", "your_password");
 
			URL documentListFeedUrl = new URL("http://docs.google.com/feeds/documents/private/full");
 
			DocumentListFeed feed = service.getFeed(documentListFeedUrl, DocumentListFeed.class);
 
			for(DocumentListEntry entry : feed.getEntries()) {
				System.out.println(entry.getTitle().getPlainText());
			}
		}
		catch(Exception ex){
			System.out.println("Exception: "+ ex.getMessage());
		}
	}
}


このとき、アカウント情報を追加しておくことをお忘れなく。これを実行すればコンソールにGoogleドキュメントに保存された文書のタイトルが表示されるはずである。

以上が、EclipseでJavaを使ってGoogle APIをいじるため下準備であった。


関連書籍

Google APIGoogle APIGoogle APIGoogle API

カテゴリー: Java タグ: ,