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

中華パッド – 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。 まぁぼくの力量では入れれないかもですが、、しばらく遊べそうですぞ。 🙂