onda Vi30 精英版その後

先日買いました中華パッドさんのその後です。 いくつか追加アクセサリを買ってみました。

なかなかよいおもちゃになってくれまして、お気に入っておりますぞ。 🙂

さて Android のカーネルは USB のゲームコントローラに対応しているような記憶があったので、ふと刺してみたところやっぱりちゃんと動くではありませんか。 OS の UI もなんとなく操作できたりして凝っています。

せっかくなのでスーファミ風の USB ゲームコントローラと、HDMI もついているのでミニから普通のに変換するコネクタを購入してテレビに接続…。

20120427_220722

いい感じに動きました。 ゲーム動かしたらポータブルなゲーム機になります。 😀

買ったのは次のふたつ。

iBUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー BSGP801GY

SANWA SUPPLY HDMI変換アダプタ ミニHDMI 黒 AD-HD07M

次。

ソフトウェア系では、まずフォントを変更。

/sysctrm/fonts/DroidSansFallback.ttf がシステムで使われる日本語フォントのようだったので、こちらを上書きで変更してしまいました。

Android 4.0 は FreeType つかっていると思うのですが、TrueType のヒンティングの扱いのデフォルト設定が日本語を扱うにはいまいちっぽく、入れたフォントでは違和感があったので FontForge をつかってヒントを削除したものを使っています。(ヒント使わない方がぼける気もするのですが)

ファイル->フォントを出力->オプションから「ヒント」をチェック外して書き出してあげれば良いと思います。 ありなしでスクリーンショットとっておけば良かったのですが忘れてました。。

ブラウザのほうは、いろいろ使ってみましたが Opera Mobile が一番相性が良いようです。 読み込みも分かりやすく、飛ぶようにスクロールするので気持ちいいですね。

Firefox Beta も割と速いですが、非同期読み込みと画面描画は Opera Mobile には及ばないようです。 Chrome Mobile も Firefox と似たようなひっかかりを感じます。

device-2012-04-27-223122

Opera のフォント設定は、opera:config を URL に入れて CSS Font から。 指定するフォント名は、/system/fonts 配下の”フォント名”を正しく CSS 指定のように正確に入れてあげることで認識するようです。 認識できないと、せっかく入力した設定が Robote フォントに戻っていらっとします(笑)

あとは、BubbleUPnP や VPlayer などを入れてみました。 VPlayer はバージョンアップしてから音ずれするようになったような…。 きっとそのうち直るでしょう!

最後はスタンド。

iPad / iPad 2 / Xoom / P7100 / TouchPad対応スタンド 180度まで調節可能 ブラック

20120427_220213

なんの変哲もないスタンドですが、この機械でもよい具合に収まりました。 たためば持ち歩きも可能です。

20120427_215942

GyaO でふじこちゃんを堪能しているの図。。 立てばなんでもいいと思いますが、角度も変えれたりして意外と便利でした。

てな感じで、ゲームや Opera Mobile の動きをみていますと、素性はなかなか高速な機械のようで、まだまだ遊べそうです。 🙂

PHP カンファレンス北海道2012 WordPressセッション&ハンズオン

2012/4/21 に開催されました、PHP カンファレンス北海道で「PHPを活用したWordPressサイト制作」のセッションとハンズオン「初めて作る WordPress オリジナルテーマ」のお手伝いをさせて頂きました。:)

PHP カンファレンスは北海道では初開催ということでしたが興味深いセッションも多く、Local の方達の運営もしっかりされており良い感じのカンファレンスでした。

WordPress がメインではないイベントでお話しするのは実は初めてだったような気がしますが、興味を持っていただけた方もいらっしゃいまして良かったと思います。

「PHPを活用したWordPressサイト制作」セッション開始前のひろまさ。

20120421_111456

twitter の #phpcondo タイムラインにはのっけから、

「とりあえず蝶ネクタイの説明からしてもらおうか。」

「発表者の蝶ネクタイに二度見した」

「スカート男子かと思ったら、バリスタか何か?」

等々。 すいません、すいません(笑)

[tegaki]コスプレしてみたかったの。。[/tegaki]

みつけて声をかけてくださった方、ありがとうございました!

プレゼン資料の方ですが、一応こちらに掲載しておきます。

PHPConDo2012.pdf

内容の方ですが、テーマ作成中のスクリーンキャストの動画がメインになっていますので、.pdf だけだとよく分からないかもしれません。 後日、USTREAM の録画が公開されるそうですので、もし興味がありましたらそちらでどうぞ。

公開していただきました。:)

さて、スクリーンキャストの撮り方のご質問をうけることがありますので、ここで簡単にご紹介します。

まず録画ソフトですが Ubuntu の RecordMyDesktop で撮っています。 他の OS でも同様のものあると思います。

ポイントは、プロジェクタの解像度で撮ることで、大抵 4:3 の 1024×768 なのでそれに合わせると大きく綺麗に出力できます。 ぼくは、モニタをもうひとつつないで、片方の解像度を 1024 にしてそちらで録画するようにしています。

あとは心の中でしゃべりながら録画。。 Ubuntu は Compiz の機能で Super + Ctrl + マウスクリックで画面拡大が効きます。

本番開始前は、自分の操作ながら何をやっているのか意外に忘れてしまっている時があるので、何回か見直して練習しておきます。 今回は先日買いました Android タブレットに .ogv 動画ファイルいれて VPlayer で再生して練習していました。

Ubuntu の RecordMyDesktop で撮ると .ogv ファイルになるのですが、このファイルは再生できる PC が限られるので、万が一の当日マシントラブルに備えて ffmpeg で mpeg4 とかにして USB メモリに入れておくとよいです。

find . –name ‘*.ogv’ –exec ffmpeg –i {} –sameq –vcodec mpeg4 –f mp4 {}.mp4 \;

とかで前の晩にでもバッチエンコードしておくと良いでしょう。

以上、あんまり関係ありませんがスクリーンキャストの撮り方でした。

ハンズオン「初めて作る WordPress オリジナルテーマ」の講師面々。

20120421_161452

写真手前から コモモさん、メイン講師 Nao さん、ハムさん。

来てくださった方、ありがとうございました。 お疲れ様でした!

さて、6/16 はオープンソースカンファレンス北海道 のブース & セミナーを WordPress(WordBench札幌) で申し込ませていただいています。 セミナーはコモモすにお願いしたので面白いと思いますぞ。

興味がありましたらぜひお立ち寄りくださいっ。 🙂

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