VPS にデーモンを常駐させて遊ぶ

さくらインターネットさんが値段を下げてにわかに活気づく VPS。

VPS のよいところは、root 権限があることで、もう Web サーバやら PHP やら MySQL やらの束縛からは解放されて、好きな言語や環境でインターネットのアプリケーションがつくれる環境が整いました。 🙂

たぶん VPS で動かして一番面白いのは、デーモンとして常駐してリアルタイムで処理を行うアプリケーション。 じゃーってことで、Groovy でやってみることにしましょう。

まずは UNIX Daemon のつくりかた。 C でやれば fork して tty 切り離してみたいな感じになるとおもいますが、ここは Groovy ってことで、JVM 上のアプリを daemon 扱いにしてシグナルをとばしてくれる Apache Commons の commons-daemon を使うとよいです。

Daemon : Java based daemons or services

Daemon is made of 2 parts. One written in C that makes the interface to the operating system and the other in Java that provides the Daemon API.

commons-daemon には jsvc という UNIX Daemon と Java を取り持つバイナリのソースが入っています。 まずはこれを VPS の環境なりでコンパイルします。 Java のホームディレクトリを指定して configure をかけるのがポイントです。

src/unix$ ./configure --with-java=/usr/lib/jvm/java-6-sun

make すると jsvc のバイナリができます。

次に Java でデーモン用のソースをかきます。 ここでは Groovy で。

org.apache.commons.daemon.Daemon を implements してシグナルハンドラと結びつく規定のインターフェースを実装してあげればOKです。 サービスクラスはスレッドにして、ちゃんと途中でとまるようにつくる感じになるでしょう。

ここではおなじみ twitter4j のストリーミング API をサービスクラスにしています。 VPS とは関係ないですが、ストリーミング API でうけたメッセージを Ubuntu の NotifyOSD で通知するサンプルです。 (画面ならデーモンじゃなくて UI スレッドでやれって感じですが、サンプルということで…)

package net.maple4ever.daemon import java.security.MessageDigest import org.apache.commons.daemon.* import org.apache.log4j.Logger import org.gnome.gtk.Gtk import org.gnome.gdk.Pixbuf import org.gnome.notify.Notify import org.gnome.notify.Notification import twitter4j.Status import twitter4j.TwitterFactory import twitter4j.TwitterStream import twitter4j.TwitterStreamFactory import twitter4j.User import twitter4j.UserStreamAdapter import twitter4j.conf.ConfigurationBuilder class TwitterDaemon implements Daemon { private static TwitterDaemon daemon = new TwitterDaemon() private static Logger logger = Logger.getLogger(TwitterDaemon.class) private TwitterStream stream = null // twitter oAuth 設定(取得して入れます) def consumer = "" def consumerSecret = "" def accessToken = "" def accessTokenSecret = "" @Override public void init(DaemonContext arg0) throws DaemonInitException, Exception { // twitter 認証設定 def builder = new ConfigurationBuilder() builder.setOAuthConsumerKey(consumer) builder.setOAuthConsumerSecret(consumerSecret) builder.setOAuthAccessToken(accessToken) builder.setOAuthAccessTokenSecret(accessTokenSecret) def config = builder.build() // GTK 初期化 Gtk.init([] as String[]) Notify.init("notify.groovy") // Strinming API 取得 def twitter = new TwitterFactory(config).getInstance() stream = new TwitterStreamFactory(config).getInstance( twitter.getOAuthAccessToken()) // Strinming API イベント登録 stream.addListener(new UserStreamAdapter() { @Override public void onStatus(Status status) { User user = status.getUser() def url = user.getProfileImageURL() def screenname = user.getScreenName() def text = status.getText() try { // twitter アイコン取得 MessageDigest md5 = MessageDigest.getInstance("MD5") def md5str md5.with { md5str = new BigInteger( 1, digest(new File(url.file).name.bytes)) .toString(16).padLeft(32, '0') } def filename = "/tmp/" + md5str File file = new File(filename) if(!file.exists()) { file << url.getBytes() } def pixbuf = new Pixbuf( filename, 40, 40, true) // NotifyOSD 通知 def notify = new Notification( "@${screenname}", "${text}", null) notify.setIcon(pixbuf) notify.show() } catch (e) { logger.error(e.message) } } }) } @Override public void start() throws Exception { stream.user() } @Override public void stop() throws Exception { stream.cleanUp() } @Override public void destroy() { } static main(args) { daemon.init(null) daemon.start() } }

# こんなの動かす人いないと思いますが、GTK-Java のライブラリ jar は sudo apt-get install libjava-gnome-java で /usr/share/java かその辺に入ると思います。

デーモンではなく、通常実行でも動作させてデバッグしやすいように static main(args) もいれています。

で、できたら次のように jsvc にクラスを渡してデーモン化してもらいます。

/opt/twitter-daemon/bin/jsvc-ubuntu \ -pidfile /opt/twitter-daemon/bin/TwitterDaemon.pid \ -user hiromasa \ -home /usr/lib/jvm/java-6-sun/ \ -cp /opt/twitter-daemon/lib/*:/opt/twitter-daemon/classes \ -Dlog.home=/opt/twitter-daemon/logs/TwitterDaemon.log \ -Dstream.user.repliesAll=false \ net.maple4ever.daemon.TwitterDaemon

次のように Java のプロセスが 2つ常駐すれば成功です。

hiromasa 6975 1 0 23:09 ? 00:00:00 jsvc.exec -pidfile hiromasa 6976 6975 17 23:09 ? 00:00:01 jsvc.exec -pidfile

NotifyOSD で twitter の投稿がリアルタイムに通知されてきます。 🙂

moz-notify

停止は以下のようにします。 start / stop/ restart 用のシェルをつくることになるでしょう。

/opt/twitter-daemon/bin/jsvc-ubuntu \ -stop \ -pidfile /opt/twitter-daemon/bin/TwitterDaemon.pid \ net.maple4ever.daemon.TwitterDaemon

ここではソースのサンプルとして画面通知にしてしまっていますが、たとえば twitter 関係で VPS で動かすようなものなら、 bot 的なものも cron とかの無理な方法をとることなく簡単に扱いやすいアプリケーションが作れると思います。

常時インターネットにつながっている VPS でリアルタイム処理ができるのは、いろいろ夢が広がりますね。

GroovyClassLoader をうまくつかって Java と Groovy のインターフェースをつくってあげれば、スクリプトテキストファイルのまま、コンパイルすることなくデーモンをつくるようなことも可能です。

daemon

え、最後のそれ、らい子ちゃんを載せたかっただけだろって、、、。はい。 orz

中華パッド – onda Vi30 精英版購入

東京にいく用事がありましたので、前からちょっと気になっていた Android のタブレットを見に秋葉原に行ってみました。 このジャンル、iPad ならぬ aPad とか中華パッドとかめんこい名前がついているようです。

通販でももちろん買えるのですが、タッチパネルを触った動きを見たかったので現地にて購入です。

日本初のapad(android pad)専門ショップ[ネット通販・販売]/TOPページ

最初 7インチ ICOO D70W に目星をつけていたのですが、店頭で操作してみるとどうも”もたる”感じがしたので、8インチの onda Vi30 精英版にしてみました。 店員の中国人(かな?)のおねーさんに無線 LAN つないでもらったり、リセットしてもらったりよくしてもらえました。 🙂

apad-04

どうやらこの機械、まだ出たばかりなようですが Android 4.0.3 + 1024×600 液晶 + 1G メモリの機械で、ちゃんと操作が指についてきてなかなかいい感じです。

Google Play! が最初から入っているので、アプリも普通に入れることが出来ます。(以下、スクリーンショットは縮小していますので念のため..)

apad-01

Firefox。 スマートフォンで動かすといまいっぽですが、タブレットで動かすと普通の感じですっ。

apad-02

日本語初期設定で入っている FreeWnn フリック対応版はちょっと相性バグがあるようで、入力は出来るのですがフリック時に画面が乱れます。 てなわけで ATOK をインストール。 こちらもうまく動きます。

apad-03

そのほか、BubbleUPnP でローカルサーバの DLNA 経由で動画を再生したり、Seemic で twitter してみたりもきちんと動作。 ちょっと驚いたのが背面のスピーカ。 良いものを使っているようで、うちの ThinkPad とかよりずっと良い音がします。 寝ながら動画向きですね。

apad-05

モノも安っぽくなくちゃんとしています。

I/O は USB と HDMI、それから充電用のコネクタ。 最初、充電はこのアダプタからのみかなぁって思っていましたが、USB からも充電できています。 おそらく電圧の関係で USB だと充電が遅いので外付けもあるのだと思われます(たぶん) なので出先できれても、USB で延命可能でしょう。:)

adb shell するとルートが既にとれていますので、いろいろできそうです。 それから、気になるのが ARM 版の Ubuntu。 まぁぼくの力量では入れれないかもですが、、しばらく遊べそうですぞ。 🙂

ThinkPad T420s + Ubuntu 11.10 + xbmc 導入

長年苦楽をともにしてきた(?)愛機の ThinkPad X61 くんですが、そろそろあちこちにガタがきましたので、ここで思い切って ThinkPad T420s を買いました!。

12 インチ系 X シリーズにするか、14/15 インチ系の T シリーズにするかだいぶ迷ったのですが、s 付きの T シリーズは X とそれほど重さも値段も変わらず、大きさもちょうどいいくらいと気がついたので T420s とあいなりました。 このところずいぶん持ち歩いて使っていましたが、うまいこと動いてくれています。 🙂

X61 の液晶解像度 1024×768 から 1600×900 の 16:9 液晶にパワーアップ。 Core 2 / 2Gメモリから Core i5 / 4Gメモリなので使っている感じもずいぶん速く感じます。

thinkpad01

キーボードの左右の余白(スピーカ部)が X シリーズとの大きさの違いと思えばだいたい当たっています。

液晶の発色は、、視野角がかなり狭い感じですがまぁ正面にいけばなんとか(笑) 事務所では X220 と T510 使っていますが、液晶はそちらのほうが良いです。 バックライトLEDの関係かと思いますが、ほとんど持ち歩かないのであれば T5x0 シリーズがいいと思います。

左右のスピーカは 600円くらいでついでに買った Lenovo のスピーカです。

…なんてことしているうちに、デスクトップの Windows 機のキーボードまで壊れてしまいました。。 エンターだけきかなくなるという謎の現象。。 というわけで、Microsoft Confort Curve 3000 も買ってみました。

keyboard01

おしゃれな感じですが、山鳴りになっていて特殊な感じのキーボードです。 少しなれるまでに時間かかりますが、慣れてしまえば問題ない感じです。 CTRL が少し遠いので、CapsLock にあててしまっています。

あと、Microsoft InteliType Pro がなぜか動かないようです。 標準ドライバのみで動かす模様。 マルチファンクションキーにミュートがないのがちょっといたい。

話はもどって ThinkPad T420s くんですが、買って Windows のリカバリDVDつくりおわってすぐ Ubuntu 化しました。 Windows7 は削除っ。 ちょっと急いでいて X61 からすぐ環境移行したかったので、まずは X61 と同じ Ubuntu 11.04 を。

11.04 では Intel のグラフィックドライバの関係で、T420s では X がフリーズする不具合があるようです。 とりあえず、intel-edger の PPA を入れてしのいでいましたが、こちらもフリーズまでいかなくても、ドライバ再起動のような動作で画面が乱れることがあるようです。 12.04 では直りそうな雰囲気なので待つこととしましょう。 🙂

さて、実は Ubuntu 11.10 はいくつか設定が面倒そうなところがあったので、X61 ではパスしていたのですが、本日時間が合ったので T420s に 11.10 を 11.04 からのアップグレードで入れてみました。 🙂

thinkpad02

無事導入できました。 Nautilus がめんこい感じでいいですね!。

T420s の液晶は 16:9 でビデオみるのにちょうど良いので、次のメジャーバージョンの完成が近づいているフル画面型のメディアプレイヤー、 xbmc の unstable も入れてみました。

sudo add-apt-repository ppa:team-xbmc/unstable
apt-get update
apt-get install xbmc xbmc-standalone
apt-get install update

こんな感じでインストールできると思います。

xbmc01

Ubuntu 版はフォントの設定なども対応できるようで、設定を変更するだけで日本語化可能になっていました。

外観->設定->スキン->フォントを Arial based に。

xbmc02

外観->設定->インターナショナルから Japanese / Japan / Japanese(Shfit-JIS)で日本語化されます。

xbmc03

相変わらずかっこいいかんじで、便利です。 🙂

xbmc04

xbmc05

てなわけで、早速働かされている T420s くんですが、最強と言われている新キーボードは使いやすく、相変わらずうまく動くトラックポインタとマシンスペックの向上は間違いなく作業速度をあげてくれました。

ありがとう、ありがとう。 今後ともよろしくね。 🙂