2011年4月29日金曜日

Java上でPHPを使いたい(Quercus編)CommandLineやってみた。

Servletでしか使えないと思われがちのQuercusですが、CommandLineでうごかせました。

やりかたもそんなに難しくなかった、なんで解説してるサイトが存在しないんだろう・・・
とりあえず早速やり方

QuercusのサイトにいってQuercusの最新版warファイルを入手する。
WEB-INF/libの中のinject-16.jar、javamail-141.jar、resin.jarと
javax.servletのライブラリ(僕はjavaee-api-5.1.1.jarを使いました。)
を準備する。

あとは以下のプログラムで動作します。

Java側
package com.ttProject.quercus;

import java.io.IOException;
import com.caucho.quercus.Quercus;

public class Main extends Quercus{

 /**
  * @param args
  */
 public static void main(String[] args) {
  Main q = new Main();

  q.parseArgs(args);
  q.setFileName("path to PHP program");
  q.init();
  q.start();
  try {
   for(int i = 0;i < 8;i ++) {
    long start = System.currentTimeMillis();
    q.execute();
    long end = System.currentTimeMillis();
    System.out.println("Time spent = " + (end - start) + "ms");
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public Main() {
  super();
  init();
 }
}
PHP側
<?php 
echo "start";
$val = 0;
for($i=0;$i < 100000;$i ++){
 $val += $i;
}
var_dump($val);
echo "end"

動作結果はこんな感じ
startint(4999950000)
endTime spent = 122ms
startint(4999950000)
endTime spent = 39ms
startint(4999950000)
endTime spent = 17ms
startint(4999950000)
endTime spent = 16ms
startint(4999950000)
endTime spent = 16ms
startint(4999950000)
endTime spent = 18ms
startint(4999950000)
endTime spent = 16ms
startint(4999950000)
endTime spent = 16ms

JITコンパイルも効いてるみたいですね。よきかなよきかな

Java上でPHPを使いたい(Quercus編)

僕が働いている会社は基本言語はPHPとなってます。

担当している動的コンテンツでは、リアルタイム処理が必須でいろんなサーバーを導入するのですが、ベースがJavaなんで社の連中にはちと敷居が高いです。

そこでPHPでサーバーを書いちゃってそれでうごかしちゃおうと思ってます。
ついでにコマンドをおくったら、サーバー内部のデータが書きかわってプログラムが刷新されればなおよし。

JRubyならルビーで書いて、Javaからルビーのクラスを呼び出して処理をさせることでそのようなことができるんですけどね。
んで、そこで目をつけたのが「Quercus」
resinのサーバーの内部で使っているPHPエンジン(Javaでかかれてる)ですね。

んで、昨日からずっと調べているのですが
resin・・・なんとJavaの生ソースを内部でコンパイルしたりもできるらしい。
phpもJavaのコードにコンパイルしてくれるので、そのあとJITコンパイルがひろってくれればめちゃくちゃ高速で動作することが期待できます。
こいつぁすげぇぜ。

ただし。いくら情報を探してもservletとして動作させる方法はあるけど、JavaからPHP関数やクラスを呼び出すという方法はないようです。
仕方ないので、Quercusのソースコードにまで手を出すことになりました。

はてさて、どうなることやら。
この動作をさせるのがかなりややこしいものならgithubにでも登録してオープンソースにしようかなとおもってます。

ではでは〜

2011年4月23日土曜日

red5の動作を変更する。

Red5をインストールしたので、早速最適化する。

まずはRed5のインストール先
/home/red5にしておく。
$ cd red5
$ mv * /home/red5/
これで移動完了

コンフィグデータの変更、とりいそぎ、ログ出力を抑制しておく。
次にlogback.xmlのログ出力設定がinfoであるのが大量にあるのでWARN以上にする。
red5.logはみるつもりないので、出力しないようにした。

red5.propertiesを書き換える。
rtmp.io_threadsは16もいらない8にする。
rtmp.receive_buffer_sizeは262144に変更
外部からアクセスされるいわれのない部分
RTMPS、RTMPT、MRTMP、JMX
host設定を127.0.0.1(ローカルホストのみ)にかえておく。
HTTPもかえておきたいがservletは使えるとデバッグが楽になるので、とりあえずは使えるようにしておくことにする。

よけいなアプリがはいっていると、そこをつかって不正アクセスされる可能性があるのでwebappsディレクトリの中にあるroot以外抹消しておく。
rootでRtmpコネクションを貼られて動画データをながされても困るのでそこもつぶしておく。
$ vi webapps/root/WEB-INF/red5-web.properties
virtualHostの設定をwo127.0.0.1のみにしておく。
(接続失敗してNullPointerExceptionでます、まだ研究が必要なとこだなぁ。)

これでとりいそぎ必要な変更は終わったつもり。

サクラのVPSを借りてみた。その3(java-red5編)

oracleのページでjdkをダウンロードしてきたのだが、その前にred5のコンパイルに必要なsubversion(ダウンロード用)やant(コンパイル用)をダウンロードしてこようと思いました。

subversion
# yum install subversion

ant(これいれちゃだめ。)
# yum install ant

ここでantのインストールって内部でjavaをつかっているのをわすれていて
実行したらopenjdkがインストールされてしまいました。
まぁはいっちゃったものは仕方ない。バージョンがちと古いかもしれないが、とりあえずjava 1.6なのでよしとしよう。
# java -version
java version "1.6.0_17"

oracleの方は
$ ./java -version
java version "1.6.0_22"
(だったと思う。)

red5のソースコードをダウンロードしてきて、導入することにする。
http://code.google.com/p/red5/source/checkout
$ svn checkout http://red5.googlecode.com/svn/java/server/trunk/ red5
red5 のディレクトリの中に移動してant発動
$ cd red5
$ ant
antがごねる
red5/build.xml:4: Class org.apache.tools.ant.taskdefs.ConditionTask doesn't support the nested "antversion" element.

タグがサポートされてない?なんだこれ。
4行目のantversion最低でも1.7.0以降でたのむという部分が理解できないらしい。

<!--condition property="ant-at-least-7">
<antversion atleast="1.7.0"/>
</condition-->
コメントアウトしてなかったことにする。
よく見たらyumで入れたantバージョン1.6.5になってる。

# yum remove ant
antを削除

Antのページから最新のバージョンを取得し解凍しました。
$ wget http://www.meisei-u.ac.jp/mirror/apache/dist//ant/binaries/apache-ant-1.8.2-bin.tar.gz
$ tar zxvf apache-ant-1.8.2-bin.tar.gz
$ apache-ant-1.8.2-bin/bin/ant -version
これでantの1.8.2がはいったことを確認
あとは、red5のソースのところに戻って
$ ../apache-ant-1.8.2-bin/bin/ant (パスは環境にあわせて適当に)
これでコンパイルがすすんで完了します。

red5のディレクトリの中でconfディレクトリが足りないのでコピーする。
$ cd red5
$ cp -r src/conf ./
実行
$ ./red5.sh
これで動作させてみて、ブラウザでアクセスしてみる。
http://xxxxxxxxxxx:5080/
Red5のデモが表示されればOK

antのせいで苦労した。

サクラのVPSを借りてみた。その2(git編)

ソースコードの管理が面倒なので(というか別のPCでの共有が大変なので)、gitでなんとかすることにします。
サーバー内に/home/gitというディレクトリをつくって、そこにgitリポジトリをためていくことにします。
公開リポジトリの設定
$ cd /home/git
$ mkdir (リポジトリ).git
$ cd (リポジトリ).git
$ git --bare init
これで準備OK

あとは適当なところでリポジトリをつくって、ここにpushしてやればOK
(注意点)
この状態のリポジトリをcloneして空のリポジトリをclone、作業を続けることができるはずなんですが、なんかうまく動作しないです。

実際の作業側でなんかつくる
$ mkdir test
$ cd test
$ git init
$ vi test.txt
(なんか書き込む)
$ git push ssh://user@サーバー/home/git/(リポジトリ) master
でデータをpushしてあとは普通に使うだけ。

これでgitの準備はOK
あとはJavaとRed5?node.jsもいれますかね?

サクラのVPSを借りてみた。その1

ブックマークレットによる、アバターチャットのプログラムがだいぶできてきたので、そろそろ情報の中継を行うサーバーを準備しようと思います。

手軽にはじめることのできるVPSでやろうかと思うので
を借りることにしました。

さくっと情報を登録。
VPN用のサーバーアドレスとroot用のパスワードがメールで届いたので、さっそくログイン

すると、sshでつなぐことができない、コントロール用のページにはアクセスできるのでおかしいなとおもったら、マシンが立ち上がっていなかったようです。
起動しpingの状態を確認。
pingがとおるようになったので、sshでログイン
unameコマンドでサーバーの状態を確認
# uname -m
x86_64

64bitみたい。
メモリーほかの確認
# top
CPU2個、メモリーは512Mか・・・

性能がひくいからなぁ、やっぱりデータベースや表のページ表示とかは、GAEにまかせちゃおうかな。

rootでは作業がしにくいので、一般ユーザーを作成。
ログインが面倒なので、公開鍵を仕込みました。
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ vi authorized_keys
鍵情報書き込んで
$ chmod 600 authorized_keys
ログアウトして再度ログイン、問題なし。

ログインするときにコマンド入力するのが面倒なので、sshのconfigを書いておくことにする。
iMacのターミナルで
$ cd ~/.ssh
$ vi config
Host sakura
  HostName xxx.xxx.xxx.xxx
  User xxxxxxxx
と必要な項目を書き込む
あとはターミナル上で
$ ssh sakura
でログインできるようになった。
ssh 経由でgitを使う予定なので、
git clone ssh://sakura/....でアクセスできるようになるのもグッド!

CentOSなのでyumでインストールしようかと思う。
とりあえずgitとjavaとred5かな。
極力yumでやりたいので、yum install gitとしたら、パッケージが見つからない
rpmforgeいれないとダメなのね・・・

こちらを参考にrpmforgeのyum拡張をセット。

ちと長くなりそうなので、続きは別のページで

2011年4月7日木曜日

ブックマークレットのURLを短くしてみました。

クリック

javascript:var d=document,s=d.createElement('script');s.src="http://poepoemix.appspot.com/webHack.js";d.body.appendChild(s);void(0);

現在いるページのデータは取得できるようです。
これで、自分がいるページをキーに同じサイトにいる人同士、情報を共有できるようにすれば、アバターチャットのできあがりですね。

アクセスした瞬間にパネルをだして、キャラ選択や名前入力するようにしたら、Javascript側の実装はとりあえずおわりかなって思ってます。

内部の通信の作り方はとりいそぎswfファイルを埋め込んでRed5ですかね。
Javascript -> swf -> Red5みたいな感じで。
どっかのVPSでもかりようかな。

2011年4月4日月曜日

firefoxに対応してみた。

GAEにおいてある、アバターチャットにする予定のブックマークレット

FireFoxに対応してみました。
javascript:var i=0,d=document,s,ss=['http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js','http://poepoemix.appspot.com/webHack.js'];l();function l(){if(i<ss.length){s=d.createElement('script');s.src=ss[i++];s.onload=l;d.body.appendChild(s);}};void(0);

でも将来的にwebSocketでサーバー組むつもりなので、Firefoxは結局対応できそうにないですね。うーん

2011年4月3日日曜日

jQueryベースのプログラムに組み替えほか

今日、Javascriptのプログラムの動作をしらべていたところ
こんなページをみつけました。
僕がつくりたいと思っているのが実現していますね。
まぁ、ブックマークレットで割り込むのと、それ専用のページをつくるという違いはありますが・・・

モチベーションがあがったところで、他のブラウザソフトでも動作するようにしたいなとおもったので、jQueryベースで動作するように、ブックマークレットの変更と内部プログラムの書き換えをおこないました。

あとは、キーボード入力にも対応して、コメントをだせるように変更してみました。
なんかサイトによっては、キャラの位置がおかしくなることがあるようなので、そのあたり今後修正していきたいとおもっています。

あとはそろそろサーバーと、そのためのプログラムの準備しないとだめですね。

2011年4月2日土曜日

ウェブ上でアバターチャットをつくってみたいと思います。

ウェブサイトにJavascriptタグをいれると、そのページに対してちょっかいをかけることができます。

塊魂のHtml5Hackのページでもこの方法を利用して、塊魂をウェブページ上にだしています。
これ利用すると、あらゆるウェブページ上でいろんなことができます。
で、ここ数日google app engineを利用してちょっとしたものをつくってみました。
作成中のもの (Google Chromeのみ動作すると思います。)
右クリックした場所にキャラクターが移動していきます。
ページ上を歩き回ることができるようになってるとおもいます。

javascript:var i=0,d=document,s,ss=['http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js','http://poepoemix.appspot.com/webHack.js'];l();function l(){if(i<ss.length){s=d.createElement('script');s.src=ss[i++];s.onload=l;d.body.appendChild(s);}};void(0);
これをコピーして、ブラウザのアドレスバーにペースト、実行すると、任意のページにキャラクターを呼び出すことができます。
(相性問題もあると思うので、動作しないとこもあるとおもいます)


画像の作成能力はないので、First Seed Materialで公開しているRPGツクールのキャラクターを使わせていただきました。

18:52呼び出しJavaScriptを変更しました。

21:18さらに呼び出しJavaScriptを変更しました。

プログラマーのpoepoemixです。

こんにちは、プログラマーをやっているpoepoemixというものです。

98年にPCを買ってから、VisualC++、Java、PHP、Ruby、Python等つかってきました。
最近では、JavaSciprtやHtml5に興味があります。

先日塊魂のHtml5Hackの記事をみて、おもしろ!?っておもったので、いまはウェブページ上でできるアバターチャットをつくってみたいなとおもってます。

ネット上のハンドルは主に
taktodというのとpoepoemixの2つをつかってます。どこかでみかけたら、「あ、こいつかも?」と思っていただければ幸いです。
趣味は、プログラミングとピアノ、あとはサイクリング(家のまわりをふらっと探索するだけですが)くらいです。

そのうち気が向いたら「ピアノひいてみようか」みたいなブログ書くかもしれません。

それでは、「プログラムしてみようか」をよろしくおねがいします。