[Scala]RubyでいうFile.joinに似た事を実装してみる

Scalaでパスを生成する時

素直にStringのジョインにする
[scala]”/tmp” + “/” + “data”[/scala]
とか
[scala]”/” + (“” /: Array(“tmp”, “data”)) (_ + “/” + ?)[/scala]
とか毎回やるのが面倒になったので、

Array(“tmp”, “data”) createPath

という感じで/tmp/data

という文字列を作れるようにしてみる。
[scala]trait createpathtrait[T];
implicit def createpathimp(a: Array[String]) = new createpathtrait[Array[String]]{def createPath = {(“” /: a)(_ + “/” + _)}}[/scala]
これをどこかグローバルに呼べるファイルに入れておけば
[scala]Array(“tmp”, “data”) createPath[/scala]

[scala]res1: java.lang.String = /tmp/data[/scala]
が帰ってくるようになる

[Scala]Scalaプロジェクトをsbtを使って管理する時に、実行可能なjarを作成する方法

sbtでパッケージ管理しているScalaのプロジェクトから

単体で実行できるjarファイルを作成するには。

sbt-assemblyというプラグインを使います。

githubはこちら

インストールは

プロジェクトのディレクトリ内で

project/plugins.sbt

というファイルを作り、この中に

と設定します。

つづいて、build.sbtの先頭に

ファイルの最後に

を追加

sbtコマンドを叩きます。

これで、プラグインがダウンロードされます。

jarファイルを作成するには

とすれば、targetディレクトリの中に作成されます。

[Scala]sbtを使ってScalaのプロジェクトをeclipseで編集する

前の記事で、Scala IDEのインストールについては書きました。

その上で、sbtでパッケージ管理をしたいといった場合の方法です。

sbtのbuild.sbtなどで依存パッケージを定義した場合など、eclipseのビルドパスに反映されません。

そーいう時は、

sbteclipse

というプラグインを使います。

githubはこちら

このプラグインは、sbtで定義した依存関係をもとに、eclipseのビルドパスを設定してくれるという物です。

また、sbteclipseはsbt 0.11.2以降で使用できます。

このプラグインのインストールは

~/.sbt/pluginsにplugin.sbtファイルを作り、

と書き加えます。

続いて、実験用のプロジェクトをeclipse上で作り、コンソール上でそのディレクトリに移動します。

sbtコマンドを実行

以上で、sbteclipseのプラグインが自動でダウンロードされます。

ここで、一度eclipse上のプロジェクトをクローズします。

コンソール上では、sbtコンソールに入っていると思うので、ここでeclipseコマンドを入力します。

となり、クラスパスなどの情報がbuild.sbtの依存関係の内容で更新されます。

依存関係の修正をした時は、このeclipseコマンドを打つ必要がありますが、これでScalaをsbtでパッケージ管理してeclipse上で開発が出来るようになります。

[Hadoop]Hadoop上でMahoutを使って「このアイテムを見た人は、こちらのアイテムも見ています」というレコメンドをやってみる

前回はHadoopのインストールで、今回がいきなり実用的な内容で、ちょっと基礎を飛ばしてますが、気にしない。

レコメンドというと、パッと思いつくのはAmazonのレコメンドではないでしょうか。

商品を見ていると、「この商品を買った人はこれも一緒に買っています。」といった感じの物ですね。

今回はこのレコメンドを簡単に実装する方法を探ってみます。

まず、解析後に欲しいデータとして

あるアイテム(item1)に対して、関連するアイテム(item2,item3,item4)をひもづけるデータです。

データベースに入れて使える状態で言うと

(ユーザが今開いたアイテムのID), (ユーザが開いたアイテムに関連するアイテムのID)
item1, item2
item1, item3
item2, item4

というキーバリューのペアです。

この結果を得るために必要な情報ですが

ユーザ毎にアクセスしたアイテムの一覧を、解析にかける元データとします。

ユーザID, アイテムID
user1, item1
user1, item2
user1, item4
user2, item1
user2, item5
user3, item3

というキーバリューのペアです。

このデータから解析結果を導き出すのですが

Hadoop界隈には、便利な機械学習ライブラリがあります。

Mahoutというライブラリで、様々な解析をするジョブがたくさん入っています。

今回はこの中のItemSimilarityJobという機能を使います。

ItemSimilarityJobには解析方法として

SIMILARITY_COOCCURRENCE
SIMILARITY_LOGLIKELIHOOD
SIMILARITY_TANIMOTO_COEFFICIENT
SIMILARITY_CITY_BLOCK
SIMILARITY_COSINE
SIMILARITY_PEARSON_CORRELATION
SIMILARITY_EUCLIDEAN_DISTANCE

というオプションが指定できます。

今回はSIMILARITY_COSINEという、コサイン関数による類似アイテムの解析を実行します。

とりあえず、ItemSimilarityJobのオプションを見てみましょう。

とすれば、オプションの一覧が表示されます。

このオプションの中で今回設定する物は、

–input
–output
–similarityClassname
–booleanData

です。

inputは、解析する元データ

outputは解析結果の保存場所

similarityClassnameは解析方法

booleanDataは、元データにレートがあるかどうか

今回の元データには、レートがないので、booleanDataにはtrueを指定

similarityClassnameにはSIMILARITY_COSINEを指定します。

では、元データを準備してみましょう。

○user-item.tsv(実際に使った物はもっとでかい)

このファイルを、HadoopのHDFS上に送り込みます。

これでhadoopのHDFS上にファイルが送信されました。

このファイルをItemSimilarityJobで解析するようにコマンドオプションを組み立ててみます。

このコマンドを実行すると、outputに解析結果ファイルが作成されます。

という感じで、できあがります。

一つ目のアイテムIDに対して、二つ目が関連するアイテムID、最後にそのアイテムのレート(おすすめ度?)となります。より近いアイテムほど数値が高くなります。

なので、おすすめとして表示する時にはレートでソートして表示するのが良いかもしれません。

Ubuntu11で、スクロールバーがマウスオーバーでしか掴めないので、普通のスクロールバーに変更する方法

Ubuntu11のスクロールバーは、なんか、本来スクロールバーがあるあたりにマウスを持って行くと、掴む部分が表示されて、それを掴んでスクロールしたりする仕様になってたりするのですが、これがとにかく使いにくいし、eclipse入れると、掴む物が表示されないので、マウスのホイールでしかスクロールが出来ない。

ということで、旧式?のスクロールバーに戻す方法です。
[shell] echo “export LIBOVERLAY_SCROLLBAR=0” | sudo tee /etc/X11/Xsession.d/80overlayscrollbars[/shell]

これをコンソールを開いて実行するだけです。

UbuntuにHadoopをインストールしてみる(1マシン上に)

そろそろHadoop入れてみようか。

ということで、例のごとくVMware PlayerにUbuntu11 64bitをインストールして、そこにHadoopを入れてみます。

Ubuntuのインストールなどは省略

Hadoopというのは、Apacheで開発されているオープンソースの大規模データの分散処理です。

詳しくはHadoop(http://hadoop.apache.org/)

ではさっそくインストール。

HadoopはJava上で動くので、まずはJavaを入れます。

本家(http://java.sun.com/)から、とりあえず最新版のJDKをダウンロードします。

/usr/localあたりに展開します。

パスを通します。

~$ java -version
java version “1.7.0_03”
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

となれば、Javaのインストールは完了です。

続いて、Hadoopですが

Ubuntu では、サードパーティ(Cloudera社)が、簡単インストール用のパッケージを作っているので、それを使います。

aptパッケージ管理で入れられるので便利です。

まずは

/etc/apt/sources.list.d/cloudera.list

というファイルを作成し、このファイルの中身は
[text]deb http://archive.cloudera.com/debian <RELEASE>-cdh3 contrib
deb-src http://archive.cloudera.com/debian <RELEASE>-cdh3 contrib[/text]
とします。

は今回は「maverick」を設定。

リポジトリキーを設定
[shell]curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -[/shell]
パッケージリストの更新
[shell]sudo apt-get update[/shell]
hadoopの検索
[text]apt-cache search hadoop[/text]
[text]hadoop-0.20 – A software platform for processing vast amounts of data
hadoop-0.20-conf-pseudo – Pseudo-distributed Hadoop configuration
hadoop-0.20-datanode – Data Node for Hadoop
hadoop-0.20-doc – Documentation for Hadoop
hadoop-0.20-fuse – HDFS exposed over a Filesystem in Userspace
hadoop-0.20-jobtracker – Job Tracker for Hadoop
hadoop-0.20-namenode – Name Node for Hadoop
hadoop-0.20-native – Native libraries for Hadoop (e.g., compression)
hadoop-0.20-pipes – Interface to author Hadoop MapReduce jobs in C++
hadoop-0.20-sbin – Server-side binaries necessary for secured Hadoop clusters
hadoop-0.20-secondarynamenode – Secondary Name Node for Hadoop
hadoop-0.20-source – Source code for Hadoop
hadoop-0.20-tasktracker – Task Tracker for Hadoop[/text]
という一覧が含まれていれば、設定完了です。

続いて、Hadoopを入れます。
[shell]sudo apt-get install hadoop-0.20[/shell]
hadoopのコアしか入らないので、1マシンで全部入れる場合には、デーモン名を後ろに付けたパッケージも入れる必要があります。

が、今回は1マシンで全部入りとするので、
[shell]sudo apt-get install hadoop-0.20-conf-pseudo[/shell]
というパッケージで全部入ります。

次に、namenodeのファイルシステムを初期化する必要があります。
[shell]sudo su – hdfs[/shell]
として、hdfsユーザにログインします。

namenodeを初期化します。
[text]hadoop namenode -format[/text]
Hadoopの各種デーモンを再起動する。

WebUIにアクセスしてみる。

http://localhost:50070/

これで、Hadoop NameNodeのWebUIが表示されれば、インストール成功です。

[Scala]Play frameworkで作ったプロジェクトをeclipseで編集する

Play frameworkでは、eclipseでプロジェクトを開けるようにするコマンドが存在するのでその機能を使用する。

まず、作ったプロジェクトのディレクトリに移動する。

コマンドを叩く

これで、eclipseで読み込む準備が完了

続いてeclipse側でPlayScalaExampleをインポートします。

eclipseのworkspaceにPlayScalaExampleを移動して、eclipseのメニューから
[File]-[Import…]-[Existing Projects info Worksplace]を選択
PlayScalaExampleを選択して完了するとインポート完了。