2010年11月25日木曜日

さくらVPSでnode.js

月額980円で始めるVPS(2週間の無料試用付き)ということで、さくらVPS
サーバサイドJavaScriptとWebSocketの勉強のため、今回はNode.JSで。

iTerm等でターミナルを起動して
  ssh username@割り当てられたドメイン名
   passwaord
の入力でログイン

node.jsのインストールにあたり先行サイトを参照しつつ進めました。

【参照】

・さくらの VPS に node.js + npm + Socket.IO をインストールする手順
http://jmblog.jp/archives/709

◇gitインストール

sudo yum install gitを実行してもエラーで入らず。

http://www.kernel.org/pub/software/scm/git/RPMS/x86_64/repodata/primary.xml.gz: [Errno -3] Error performing checksum
Trying other mirror.
Error: failure: repodata/primary.xml.gz from git: [Errno 256] No more mirrors to try.

延々とエラー対策するも治らず…以後、次の操作したら治ったみたい

  yum check-update (したら治った?)
  yum search git (でgit発見。)
  sudo yum install git





【トラブルシューティング】
・yum 実行時に「Error performing checksum」エラー
http://d.hatena.ne.jp/miau/20100404/1270384404
・CentOS 5.4 に git をインストール
http://ameblo.jp/ootokage/entry-10469782021.html


◇nodeインストール

git cloneしたnodeを、そのディレクトリ直下で
  ./configure
するも失敗。

エラーメッセージから、事前にOpenSSLを入れる必要ありとのこと。
  sudo yum install openssl-devel

その後、再度
  ./comfigure
  make

'build' finished successfully が表示された
  make install

'install' finished successfully で、
  node -v
でVersion(この時点では0.3.0-pre)が表示されたらOK?


◇npmインストール

パッケージを入れるディレクトリでコマンド入力
  curl http://npmjs.org/install.sh | sh

するも、エラーを吐く。

node cli.js cache clean
make: node: Command not found
make: *** [uninstall] Error 127

…node cli.js install npmのところでつまづいている様子。

なので、一旦npmパッケージをダウンロードしておいて展開、
 tar -xzf npm-0.2.8-1.tgz 
  make
  make install


…しても結果変わらず。。

参照サイトを見るとインストールしたnode.jsのバージョン次第で同エラーを吐くとのこと。

なので、前に入れたnode.jsを削除してから、node-v0.3.1.tar.gz を本家から落としてきて
  tar -xzf node-v0.3.1.tar.gz 

再度
   ./configure
   make
   make install
で入った。

再び、npm-0.2.8-1直下でmake,make installで今度はOK。


◇DNSサービスの利用

  1. お名前.comにログイン
  2. 左パネルで、[ドメイン設定 > ネームサーバーの設定 > レンタルDNSレコード設定] と進む
  3. 対象のドメインを選んで、[入力画面へ進む] をクリック。
  4. サブドメインを使うなら、[ホスト名]に入力。ex: www.y-fuji.com
    サブドメインを使わないなら何も入れない。ex: (空).y-fuji.com
    サブドメイン有無の両方にする場合は、それぞれを追加する。
  5. [VALUE]に「さくらVPSで割り当てられたIPアドレス」を入力。
    その後、[確認画面へ進む] をクリック。次の画面で、[設定する] をクリック。
  6. 手続きが終わったら、[ドメイン設定 > ネームサーバーの設定 > ネームサーバーの情報変更] をクリック。
  7. 対象のドメインを選んで、[ネームサーバー情報を入力する] に、「01.dnsv.jp」と「02.dnsv.jp」を入力。確認画面を経て、[設定する] で終了。
設定後、通知メールが届き、数時間程で状態が反映されました。


◇node実行テスト

動作確認のため、以下のようなコードを書いてexample.jsで保存。
※xxx.xx.xx.xxx はさくらVPSで割り当てられたIPアドレス

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen("80", "xxx.xx.xx.xxx");
console.log('Server running at http://xxx.xx.xx.xxx:80/');


ターミナルで
  node sample.js
で起動後、お名前.comの情報が反映されたら、その登録ドメインURLをブラウザで叩くと正常に動作。


◇サンプルアプリ起動

遭遇したエラー:process.nextTick error, or 'error' event on first tick
…installしたはずのモジュールが見当たらない。

一旦、npm uninstallして再インストールするも状況変わらず。

原因は .npmrcファイルのファイルの置き場所と記述内容でした。
.npmrcファイルをnpmモジュールディレクトリ直下に置いて、bin,manのパスを正しく通せばエラーは解決でした。

【トラブルシューティング】
・npmをインストールする
http://d.hatena.ne.jp/yssk22/20100814/1281802092
http://d.hatena.ne.jp/perezvon/20100929/1285780850


◇デバッガインストール

node.js用にEclipseのデバッガがあるので、それもインストール。

毎度のEclipseの[新規ソフトウェアのインストール]>[リポジトリ情報登録]>[利用許可承諾]>[OK]です。

[リポジトリ情報]
・(Name)Google Chrome Developer Tools
・(URL)http://chromedevtools.googlecode.com/svn/update/dev/


デバッガインストール後、テストコードを書いて、
  node --debug dbgtest.js
すると、デバッガ用に5858ポートが開いたと出るので、デバッグ可能に。

以上、環境構築でした。


【その他参照】
・node.js ハンズオン資料
http://dl.dropbox.com/u/219436/node.js/handson/build/html/index.html
・node.js を試してみた
http://d.hatena.ne.jp/ursm/20100925/1285359068

2010年11月18日木曜日

RingoJSインストール周辺メモ

Antが入ってる状態からのメモ@ MacOSX 10.5。

antのパスが通っているかは、ターミナルで確認。
  ant -version

基本的なインストールは本家サイトを参照しつつ、その前後で起きたエラーと対処について書きます。

【インストール時のエラーと対処】
・ERROR①:"Unable to access jarfile"
ant jarコマンドを打ち忘れると出るエラー。
ターミナルから、git cloneまたはダウンロードしてきたringojsディレクトリ直下で
  ant jar
すると、ringojs/build/classesにクラスが生成される。

・ERROR②:"java.io.FileNotFoundException: Can't find file admin/create"
或るサイトを参照してターミナルでアプリ作成コマンドを
  bin/ringo admin/create
と打つも、上記エラー。

正解は
  bin/ringo-admin create
の様子、バージョンの違い?

【アプリ起動】
・デモアプリ起動
インストールしたringojsディレクトリ直下で、
  bin/ringo apps/demo/main.js
のコマンド叩くとjettyが起動して、http://localhost:8080/でアプリが見れます。

・パッケージのインストール(GitであればUserID/RepositoryNameで良いとの公式サイトに…例:ringo-admin install robi42/ringo-hibernate)

上記installコマンド叩くも、ERROR③:”JavaException: java.util.zip.ZipException: error in opening zip file (ringo/zip.js#16)”発生。

zip.jsの16行目と調査リンク先を見る限り、Path周辺が問題の様子

けれども、コマンド打たなくてもパッケージのインストールはできる(※参照)ようなので、
  git clone git://github.com/hns/ringo-cometd.git
でローカルに落としたpackageを、ringojs/packageディレクトリにコピー



その後、ringoコマンドでパッケージ内のmain.jsを叩けば、起動します。
  bin/ringo packages/ringo-cometd/app/main.js





・アプリ作成ヘルプは
  bin/ringo-admin create -h

・Google App Engine の雛型作成は
  bin/ringo-admin create -a






たしかにスケルトンが出来上がってます。
GoogleAppEngineに載せるところは未テスト。


【参照】
・RingoJS Home
・GAE deploy 参照動画
・Comet 参照動画

2010年11月14日日曜日

mahout(ver.0.20) Webアプリ作成手順

前記事で、Mavenが動くようになったので、mvnプロジェクトからmahoutを入れてみます。

ターミナルで作業ディレクトリに移動して、
  mvn archetype:create -DgroupId=sample.recommendWeb -DartifactId=recommendWeb -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1

下記のようにrecommendWebフォルダならびにディレクトリが生成されるので、
pom.xmlを下の①のように更新し、recommendWebフォルダ直下でJavaソース配置先を作成、
  mkdir src/main/java




①pom.xml

  4.0.0
  sample.recommendWeb
  recommendWeb
  war
  0.0.1
  recommendWeb Maven Webapp
  http://maven.apache.org
  
    
      junit
      junit
      3.8.1
      test
    
    
      org.apache.mahout
      mahout-core
      0.2
     
    
      org.slf4j
      slf4j-jcl
      1.5.8
    
    
      javax.servlet
      servlet-api
      2.5
   provided
    
  
  
    recommendWeb
    
      
        maven-compiler-plugin
        
          1.6
          1.6
          UTF-8
        
          
   
     org.mortbay.jetty
     maven-jetty-plugin
     6.1.7
   
    
  


同フォルダ(pom.xmlを含むことを確認し)で、下記コマンドを実行
  mvn eclipse:eclipse -DdownloadSources=true

これで、Eclipseに対応するので、Eclipseを起動し、このプロジェクトをImport

Import後、②・③のように各ファイルを更新。


②web.xml

  Archetype Created Web Application
  
    web-recommender
    Web Recommender
    Web recommender servlet
    RecommenderServlet
    1
  
  
    web-recommender
    recommendWeb/RecommenderServlet
  


③RecommenderServlet.java
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class RecommenderServlet extends HttpServlet {
   private static final int NUM_TOP_PREFERENCES = 3;
   private static final int DEFAULT_HOW_MANY = 3;

   private Recommender recommender;
   public void init(ServletConfig config) throws ServletException {
      super.init(config);
      try {
       String csvPath= getServletContext().getRealPath("WEB-INF");
       csvPath += File.separator + "critics.csv";
    // モデル構築用のデータをファイルから読み込む
    DataModel model = new FileDataModel(new File(csvPath));
    // ユーザ類似性と類似ユーザ抽出のメソッドを決定
    UserSimilarity similarity = new EuclideanDistanceSimilarity(model);
    UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
      similarity, model);
    // ユーザベースの推薦を作成
    recommender = new GenericUserBasedRecommender(model,
      neighborhood, similarity);       
      }
      catch (Exception e) {
       throw new ServletException(e);
      }
   }

   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException {
  String userIDString = req.getParameter("userID");
  if (userIDString == null) {
   throw new ServletException("userID was not specified");
  }
  long userID = Long.parseLong(userIDString);
  String howManyString = req.getParameter("howMany");
  int howMany = howManyString == null ? DEFAULT_HOW_MANY : Integer.parseInt(howManyString);
  try {
   List items = recommender.recommend(userID, howMany);
   writePlainText(resp, userID, items);
  } catch (Exception te) {
   throw new ServletException(te);
  }
 }

 private void writePlainText(HttpServletResponse response, long userID,
   Iterable items) throws IOException, Exception {
  response.setContentType("text/plain");
  response.setCharacterEncoding("UTF-8");
  response.setHeader("Cache-Control", "no-cache");
  PrintWriter writer = response.getWriter();
  for (RecommendedItem recommendedItem : items) {
   writer.print(recommendedItem.getValue());
   writer.print('\t');
   writer.println(recommendedItem.getItemID());
  }
 }
}


recommendWeb/src/main/webapp/WEB-INF直下に、mahoutで検証するデータCSVファイル(critics.csv)を配置します。



















これで、サーブレット設定をしてからjettyを起動。
※WebApp dir をWEB-INF/web.xmlを含むディレクトリに設定
















jetty起動後、下URLのようにパラメータを渡せば、データの推定値が表示されます。
http://localhost:8080/recommendWeb/RecommenderServlet?userID=7







[以下ToDo]
・上記環境はmahout ver.0.20のTasteを利用しているためHadoop未対応とのこと、Hadoop対応版の動作検証
・MahoutでのGoogleAppEngineでの動作検証


以上です。


【参照ページ】

Apache Mahout Project
mahout/レコメンドサーブレットの作り方
Mahout インストール

MacOSX Java・Maven環境設定

macのJavaアドレスがWindowsと違い、忘れそうなのでメモ。
それと、Mavenの使い方も備忘録でメモ。

・動作環境 MacOSX(10.5)

/system/Library/Frameworks/JavaVM.framework/Versions/1.6.0
※1.5他のバージョンは/Versions以下に。

ターミナルでprofileいじり
  vi ~/.bash_profile

vi起動後に下記を追記
==
  export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
  export PATH=$JAVA_HOME/bin:$PATH
==

ターミナルで
  java -version
で、java version "1.6.0_26"になってたらOK


MavenのインストールはEclipse Plugin(Help -> new software install)から
Maven Integration for Eclipse

インストール後、ターミナルで確かめると
  mvn -v

Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)のように表示される。


Maven設定ファイルがインストールディレクトリ裏に隠れているので、編集が必要な際は
  mv .m2 m2
でリネームし、そのあと該当の.jarファイルを追加とか.pomファイルの追加。
編集後は
  mv m2 .m2
で元に戻す。

Mavenソフトのインストールはpom.xmlを含むディレクトリで
  mvn -install
コンパイルは
  mvn -compile

GoogleAppEngineインストールでついてきたjettyの起動は
  mvn jetty:run

MavenからMahoutを動かすための環境設定でした。

2010年11月2日火曜日

ヒトマネ提案サイト”ミミクリ”の使用法

Mashup Award 6 (#MA6)に向けて、Twitterのユーザーの関心ごとをキャッチアップするツールを作成しました。


Mimikury(ミミクリ)


【使用法】
①:左上のユーザ名入力欄に「Twitter ID」を入力し、「Sign in with Twitter」ボタンを押してください。

②:ポップアップウィンドウが表示されるので、「認証」ボタンを押してください。

③:ブラウザにTwitterログイン歴が残っていない場合、下記の画面が表示されるので、「ユーザ名」と「パスワード」を入力し、「許可する」ボタンを押してください。

④:認証に問題なければ、下記認証完了画面が表示されるので、「close window」を押して、このウィンドウを閉じてください。
※:下記エラーが発生して、ログインできない場合は、再度ブラウザの更新ボタンを押して、再ログインの処理を行ってください。

⑤:ログインが完了すると、『画面左パネル』にフォロー者のツイートから抽出したキーワードが表示されます。(このキーワードは、2分間隔で自動的に変わります)

⑥:項番⑤『画面左パネル』のキーワードをクリックすると、『画面真ん中パネル』のツイートと、『画面下部』のショーケースの表示が変化します。

⑦:『真ん中パネル』、『下部ショーケース』上のテキストをクリックすると、データベースに情報が登録され、該当部の☆の色が変化します。
※ここでは、気になった情報に対して、クリックをしてみてください。
クリックしたデータからキーワードと思われる情報が『画面右パネル』に表示されます。
使用法は以上です。


なお、本開発では下記ツールを用いました。
  • Google App Engine(Java)
  • jQuery
  • Yahoo! キーフレーズ検索API
  • Twitter Search API
GAE上のOAuth実装にあたり、ご協力いただいたOtchyさんありがとうございました。


Blogger Syntax Highliter