Web サイトいじりのための Ubuntu (その2)

前回に引き続きまして、Web サイトいじりのための Ubuntu (その2)です。 WordPress 個人ブログなどをレンタルサーバに持っている方向けの、Ubuntu Tips。 前回は SSH でレンタルサーバに鍵認証で接続して、Nautilus と統合までしましたので、その次に進んでみます。 :)

hiromasa.another :o )» Blog Archive » Web サイトいじりのための Ubuntu (その1)

ここみたいな個人 WordPress サイト(レンタルサーバのPHPアプリ)をいじる感じ向けの Ubuntu Tips を書いていこうと思います。 そうじゃないのも混ざってくるかもですがよろしくおつきあいを。

Linux を使っていると GUI と CUI のハイブリットが使えて結構便利ですが、GNOME の場合、Nautilus ファイルマネージャに以下の拡張をいれると表示ディレクトリを cd することなく端末に開いてくれるようになり、両利用が使いやすくなります。

後で使いますので、とりあえずいれておきましょう。 :)

sudo apt-get install nautilus-open-terminal

さて、今回のテーマはレンタルサーバのファイル編集。

前回 SSH で接続しましたので、Nautilus ファイルマネージャからローカルファイルを転送できるようになりましたが、実は Nautilus はリモート側のファイルを直接編集することができます。

Nautilus の SSH 接続は内部的に Linux の FUSE (Filesystem in Userspace) と GNOME の gvfs で実装されていますが、これはリモートコンピュータをローカルディレクトリにマッピングしている感じの動作になります。 ゆえに、そこのファイルをアプリで書き換えるとうまいことリモートが書き換わります。

理屈は抜きに実践は簡単。 普通にレンタルサーバのディレクトリを Nautilus で開いて…

ubuntu1101

こうですら。 いちいちローカルにファイル落として編集後転送し直す必要はありません。

たとえば Geany テキストエディタで編集して保存すればそれだけでレンタルサーバ側が更新できます。 ローカルでの確認の必要ないちょいなおしの場合、急ぎの場合に非常に便利です。

# ぼくの環境だけかもですが Ubuntu 10.04 のときは保存後ファイルが 0byte になる不具合がでたことがあるので、初めてやるときは一応バックアップとってからやってください。 10.10 では問題ないようです。

さてこんなことやっていると、サーバ側がマスターになりはじめ何がなんだかになってしまいますが、UNIX の rsync というコマンドを使うとリモート –> ローカルに同期コピーしておくことができます。

これは wp-content 配下の画像ファイルなどのバックアップにも有効ですので、たまに実行しておくとよいです。

まずはローカルのどこかにディレクトリを作成して以下のファイル構成にします。 current ディレクトリは空です。

ubuntu1102

backup.sh の内容を以下のように作成します。

#!/bin/sh
 
rsync -avz --delete [ユーザ名]@[接続先ホスト名]:/[バックアップするディレクトリ]/ ./current/

コアサーバ/XREA 系であればこんなかんじです。 最後のスラッシュとか気をつけてください。 ぼくは面倒なので public_html 配下をフルバックアップとっていますが、wp-content の下だけでもいいかもしれません。

rsync -avz --delete another@s8.coreserver.jp:/virtual/another/public_html/ ./current/

できたら、backup.sh に実行権限をつけます。「プログラムとして実行できる。」

ubuntu1104

でもって、Nautilus から先にインストールした「端末の中で開く」を行って、

ubuntu1102

ターミナルをひらいて、、

./backup.sh

これで、ドヴァーっとファイルがリモートから転送されてきます。 ログイン認証は、前回の鍵認証をつかってくれます。 初回はホスト登録をきいてくるかもしれないので、”yes” してください。

初回なのでリモートファイルが全部転送されてきます。 この場合コアサバとかだと転送制限かたまにとまりますので、何回か試行します。 差分で持ってきますのでそのうち error なしで終わるはずです。

エラーの場合。 rsync error の文字列がみえます。

rsync: connection unexpectedly closed (255369687 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [receiver=3.0.7]
rsync: connection unexpectedly closed (1345764 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7]

うまくいった場合。

sent 836 bytes  received 1668777 bytes  90249.35 bytes/sec
total size is 1139108950  speedup is 682.26

一度全部取得すれば、あとは差分でとってくれますのでたまに実行してあげるとファイルバックアップになってよいでしょう。 :)

WordPress のバージョンアップ前など、必要に応じて current を別にコピーしておくとそちからバージョンアップ前に復元できます。(もちろんその前に DB も戻しが必要がありますね)

あとこの current ディレクトリはあくまでバックアップとしてここのファイルは編集しないほうがよいでしょう。 編集する場合は他にコピーしてからという方向で。

また、Ubuntu の場合、Ubuntu One 監視ディレクトリでこの操作を行うと、自動的にクラウド側にさらにバックアップできることになります。 Dropbox Linux 版でも同様にできるのかな。 便利ですね。

というわけで、以上その 2 でした。 次は、subversion についてか、xampp のインストールか、、ちょっと古くてよければ関連記事(↓)にでていると思いますので先にそちらを。 :D

ぼのを 「ちょっぱーを寝かせてきます。」

    W      W
 ( '∇')(´—`)
ヽ| P |人| P |ノ

Web サイトいじりのための Ubuntu (その1)

ここみたいな個人 WordPress サイト(レンタルサーバのPHPアプリ)をいじる感じ向けの Ubuntu Tips を書いていこうと思います。 そうじゃないのも混ざってくるかもですがよろしくおつきあいを。

Web サイトを配置するレンタルサーバは Linux や BSD など UNIX 系の OS が大半ですので、いじるクライアントも UNIX 系にしておくと何かと都合がよいものです。 またこういった知識があると、レンタルサーバ側での操作の理解も深まります。 :)

さて、UNIX 系の OS を触ることの最初の関門はターミナルでしょうか。 インターネットを検索しても操作説明がコマンドベースで書かれていることも多いです。

ということで、まずはコマンドシェル (bash) の練習3つしておきましょう。

ubuntu1001

その1。 コマンド補完。

入力するパスなどを正確にキーボードから入力するのはなかなか大変なものです。 そんなときは、途中までうってTAB キーを押下しましょう。 ユニークに認識できる部分まで入力されていれば勝手に入りますし、ユニークまであと一歩なら候補をだしてくれます。 とりあえず、TAB 連打でなんとかなる! (笑)

その2。 ヒストリー。

さっきうったコマンドや、いつもよく入力するコマンドををもう一回うちたいなって場合は、とりあえずカーソルのキー上下でたどることができます。 近くにあることがわかっている場合はこれでよい。

結構昔にうったなぁって場合は、いくつか方法がありますが CTRL + r 押下で後方検索してもらうのがひとつ。 また $ history | grep 文字列 で検索後、でてきた左の番号を $ !番号 で実行するという方法も覚えておくと便利かもしれません。

その3。 ショートカットキー。

カーソルキーの移動にショートカットキーを使うと便利です。 カーソルキーに慣れている人でもネットブックとか小さいキーボードを使うときに覚えておくと、有効性が分かると思います。

ヒストリ表示などカーソル上下相当。 CTRL + p, CTRL + n。

カーソル左右。 CTRL + f, CTRL + b。

Home, End キー相当。 CTRL + a, CTRL +e。

Backspace キー相当。 CTRL + h。

とりあえずこれだけ覚えておけば便利に使えると思います。 だいたいのキーは英語スペルの頭文字です。 forward とか back とか previous とか next とかですね。

ちなみにこれができると emacs がそのまま使えます。 nano エディタもこのアサインで操作できますね。 vi のキーアサインといっしょに使っていると頭がおかしくなりそうになりますが(笑)

では実践。 Web サイトいじりといえば、レンタルサーバへの接続。

お使いのレンタルサーバに SSH の鍵認証で接続する設定を Ubuntu でしてみます。 おそらく SSH 接続許可のサーバであれば適応可能だと思います。 そしてこの後の GUI から接続でも使えますので是非設定しておきましょう。

鍵認証とは(たとえば) Ubuntu に秘密鍵を置き Web サーバに公開鍵を置いてペアの確認で接続するといった認証方式です。

ではまずは Ubuntu 側で鍵のペアを作成します。 ちなみにコマンド入力時、ssh-k くらいで TAB を押すとコマンドが補完されるのが分かります。

$ cd ~/.ssh
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/hiromasa/.ssh/id_dsa): id_dsa.internet
Enter passphrase (empty for no passphrase): [エンター押下]
Enter same passphrase again: [エンター押下]
Your identification has been saved in id_dsa.internet.
Your public key has been saved in id_dsa.internet.pub.

鍵はホームディレクトリの .ssh に格納しておきます。

Ente file is which to save the key では好きなファイル名を設定してください。 パスフレーズの設定はここではなしにしています。(鍵自体に任意のパスワードを設定できます)

できたかどうか確認するため ls。 .pub となっているのが Web サーバに設定する公開鍵となります(ついてないのが秘密鍵、大事にしましょう)。 公開鍵の内容を cat で表示させてメモ(?)っておきましょう。

hiromasa@hiromasa-netbook:~/.ssh$ ls -laF
合計 20
drwx------  2 hiromasa hiromasa 4096 2010-10-30 14:03 ./
drwxr-xr-x 52 hiromasa hiromasa 4096 2010-10-30 14:00 ../
-rw-------  1 hiromasa hiromasa  668 2010-10-30 14:03 id_dsa.internet
-rw-r--r--  1 hiromasa hiromasa  615 2010-10-30 14:03 id_dsa.internet.pub
-rw-r--r--  1 hiromasa hiromasa  982 2010-10-30 14:00 known_hosts
hiromasa@hiromasa-netbook:~/.ssh$ cat id_dsa.internet.pub
ssh-dss AAAAB3NzaC1kc3MAAACBAKh7oNSM2..ww== hiromasa@hiromasa-netbook

次に SSH で接続時にこのファイルを検索してもらえるように、このディレクトリに config という名前のファイルを作成して以下の内容にします。 vi に慣れていない方は GUI のテキストエディタでつくるとよいです。

IdentityFile ~/.ssh/id_rsa.internet

いくつか鍵がある場合はこのファイルに同じように追加していけばOKです。

さて次は、レンタルサーバ側に公開鍵を登録します。 とりあえず、ssh のパスワード認証でログイン。

   1: $ ssh -l [レンタルサーバ・ユーザ名] [レンタルサーバ・ホスト名]
   2: Are you sure you want to continue connecting (yes/no)? yes

はじめてつなぐサーバの場合 yes/no を聞いてきますので、yes を選択しましょう。でもって、サーバに接続するいつものパスワードを入力します。 コアサバ/XREA などは SSH で接続する前に Web 管理画面からホストの登録が必要なのでそのように。

つながったらそこはレンタルサーバの UNIX の世界。

やりたいことは、.ssh/authorized_keys というファイルに公開鍵の内容を記入しレンタルサーバ側に配置することです。

$ cd ~/.ssh
$ vi authorized_keys

vi を起動して先ほどの .pub ファイル ssh-dss で始まる1行を全部コピペしてあげてください。 vi の使い方は気合いで。。(笑) 起動後 ESC 押して i おして、GUI から貼り付けて、ESC 押して :wq[エンター] とうてば良いかもしません。

コアサバとかの場合は nano も入っているみたいですのでそちらのエディタでもかまいません。 下に表示されているコマンドは CTRL を押しながらで発動します。

本当はリモートコピーとか簡単にやる方法があるのですが、練習ということで。 終わったら exit とうつとレンタルサーバから自分世界に戻ってこれます。 どーしてもできない! って場合はいつものやり方でファイルを転送してあげてください。 :)

ほいでもって、

$ ssh -l [レンタルサーバ・ユーザ名] [レンタルサーバ・ホスト名]

とすると、鍵認証でログインできることが確認できます。

さてここからがお待ちかね(?)、GUI の世界です。 今の設定をつかって SSH 接続のファイル転送をしてみましょう。 FTP の転送は安定もしません(大量ファイル転送で FTP が止った経験はありませんでしょうか?)ので、SSH つかえるならこちらの方法がおすすめです。

GNOME 環境では Nautilus という Windows でいうところのファイルマネージャが利用できます。 こいつは SSH 接続も対応していますのでこちらから接続します。

ファイル –> サーバの接続。

ubuntu1010

こんな感じで設定して接続! するとさっきの SSH の設定をつかって鍵認証接続してくれます。

ubuntu1011

こんな感じ。 向こうもこっちも UNIX 系なので同じインターフェースで操作できます。 ファイルの属性変更もいつも通りです。

ファイル転送はやっぱり2ペインだよ~って方は、F9 押して F3 おしましょう。

ubuntu1012

エキストラペインを使えば2画面ファイラにもできます。 :)

せっかくなので Nautilus  の TIPS をもう一つ。 Ubuntu で作業していると NAS など Windows 共有をみたくなることもあります。 そんなときは CTRL + L。

ubuntu1013

smb:// で相手先の IP アドレスをうてばさくっと表示できます。 ブックマークも可能ですのでよく見るところはしておくと早いでしょう。

…。

思いかけずいい加減長くなってきたので、ここからは

駆け足(笑)

レンタルサーバにつながったので、ばりばりソースいじるぞって場合は Geany という GTK ベースのエディタがよいかもしれません。 オープンソースの Scintilla ベースのテキストコンポーネントを利用しており、内部リストの性能も悪くないようです。

Geany はプラグインアーキテクチャも持っていますので、とりあえずファイルブラウザを入れる。

ubuntu1020

しかるに左ペインでファイル一覧ができるようになりますので、WordPress いじるときは便利でしょう。

ubuntu1021

正規表現を伴う grep や矩形選択もできますのでいろいろ試してみてください。 よく使われる機能では、キーボードマクロ以外のことはできると思われます。

他にもソースいじる系では Eclipse や Aptana なんかも問題なく動作します。

さて、最後に Web 開発とはあんまり関係ありませんが GNOME Do を紹介です。 ぱかぱかコード書いているとあんまりマウスってさわりたくないものですが、そんなのを解消してくれるアプリです。

とりあえず、インストールして Super(Winキー) + スペースを押してみます。 でもって、fi くらいまでキーボードをうつ。

ubuntu1030

左に対象がでて、右に操作が出ます。 それらのフォーカスは TAB で動かせて選択がある場合はカーソルキーの上下で選べます。 この場合は Firefox の起動。

最近だと Windows 7 も Windows キーからそのまま fire とかうつと起動まではできるようになりましたが、GNOME Do はもーちょっとあります。

何かしら文字を選択した状態で、transl くらいまで入力。

ubuntu1032

選択されたテキストとすると、翻訳サイトにふっとばしてくれます。 とても便利あるね。 GNOME Do さんもいろいろプラグインがありますので試してみてください。 設定は GNOME Do 画面の右上の三角から表示できます。

ubuntu1031

Ubuntu 10.10 Netbook Remix を使っている方は、Unity に Super キーをとられてしまっているので動作しません。 Unity のショートカットはいまいち使えないので、ぼくは gconf-editor で Super のアサインを解除しています。 (apps の下です)

ubuntu1033

うっへ~、とりとめなく長っ、。

ここまで読んでくれた人に、読者サービス。

チラッ☆ (←不要です

Masayan 「…」

ぼのを「…」

続く。(のか?

さくらの VPS で撃沈 (WordPress + HipHop 編)

高速化、最適化へのあくなき挑戦は続く。

今回は、PHP のアプリケーションを C++ に変換してネイティブ動作させてしまうという、にいさんに教えてもらった HipHop for PHP で WordPress を動作させることに挑戦です。

きまったリソースの中で最大限を求めるロマンは、コンピュータの世界もバイクの世界も同じに違いない、きゅるるるるる…、ぼぼん! では、いってみましょう。 :)

…結論から言いますと、WordPress を動かすことは失敗しています。。 にいさんに夢を託します。(笑)

まずは、HipHop for PHP から。

Home – hiphop-php – GitHub

HipHop transforms your PHP source code into highly optimized C++ and then compiles it with g++ to build binary files. You keep coding in simpler PHP, then HipHop executes your source code in a semantically equivalent manner and sacrifices some rarely used features – such as eval() – in exchange for improved performance.

最近では JavaVM や .NET の CLI ではランタイム最適化でネイティブのスピードを超えてしまうこともあるらしいですが、PHP のインタプリタにそれを望むのは厳しいというわけで、C++ にしてネイティブにしてしまえ! というプロダクトです。

Facebook で使われているそうですが、すごいっすね。

sakura-hiphop

スクリーンショットに意味はない。。

さてちょうどいいことに、さくら VPS のデフォルト OS である CentOS 5 AMD64 用の rpm が Hiphot サイトで提供されています。

Installing or Building HipHop-PHP via RPM on CentOS 5 – hiphop-php – GitHub

HipHop has been developed on CentOS and Fedora, but only based on source code and some patches. You may found this way is hard.
So, I create some patched RPM’s for easy HipHop installation on CentOS 5

At the moment, RPM’s only for 64 bits systems. I work on 32bits in that moment, and you can get RPMS as soon as possible.

じゃ、じゃ、じゃー、さくらの VPS で動かしてスピードの向こう側をみてやろうじゃないか、というのがこの企画。

サイトの手順でいけるかなと思ったのですが、依存関係でなかなか手強い。。 おそらく以下の手順で依存は解消できると思われます。(ただし、後述するとおりセグるのでだめなのかもです)

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
yum install cvsps
 
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum install --enablerepo=remi mysql-server mysql-libs
yum install --enablerepo=remi mysql-devel-5.1.50-2.el5.remi
 
/etc/init.d/mysqld start
 
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm 
yum install --enablerepo=rpmforge perl-Error.noarch
 
wget http://www.n0c.org/RPM/centos/5/x86_64/tla-1.3.5-7.x86_64.rpm
rpm -ivh tla-1.3.5-7.x86_64.rpm 
 
yum install tk gd gd-devel mcrypt libmcrypt tidy mhash freetds net-snmp httpd-mmn libtool-ltdl
yum remove subversion
yum install libc-client subversion-perl
yum install pcre pcre-devel libidn-devel expat-devel libmcrypt-devel libcap-devel
yum install binutils binutils-devel cmake gcc
 
yum update
 
yum remove libxml2-2.6.26-2.1.2.8.i386
yum remove curl-7.15.5-9.el5.i386

どーしても rpm のありかが分からなくて、なぞのリポジトリ(tla)も一部つかっていますのでご注意ください。 その他は、手順にあるリポジトリを利用しています。

でもって、提供されている .rpm をインストール。 ここで使った .rpm は以下の通りです。 sourceforge.net にあったもの全部です。

#!/bin/sh
 
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-doc-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-devel-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xmlrpc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xml-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-tidy-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-soap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-snmp-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pgsql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pdo-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-odbc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-ncurses-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mysql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mssql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mhash-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mcrypt-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mbstring-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-imap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-gd-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-devel-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-dba-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-common-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-cli-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-bcmath-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/perl-Git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-devel-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/m4-1.4.13-4.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-static-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-python-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-devel-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-doc-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-devel-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-devel-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/icu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/hiphop-php-1.0-2.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gnupg-1.4.10-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-svn-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gitk-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-gui-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-email-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-cvs-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-arch-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-all-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/flex-2.5.35-7.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-devel-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-doc-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-devel-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/autoconf-2.63-3.noarch.rpm/download

でもって、以下で HipHop for PHP のインストール、環境設定はOKだと思います。

# rpm -ivh *.rpm
# cd /usr/lib64/hphp
# export HPHP_HOME=`pwd`
# export HPHP_LIB=`pwd`/bin

あとは、WordPress のディレクトリに cd して変換、コンパイルをかければ…。

# cd /opt/sakura.maple4ever.net/
# find . -name "*.php" > files.list 
# $HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

…。

parsing inputs took 0'00" (157 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (75 ms) wall time
inferring types...
inferring types took 0'00" (142 ms) wall time
post-optimizing...
post-optimizing took 0'00" (15 ms) wall time
creating CPP files...
Core dumped: Segmentation fault
セグメンテーション違反です

マイガー!

というわけで、コンパイルに入る前にセグって落ちてしまうようです。。

ちなみにうまく C++ に変換されたソースは以下の感じです。

#include <php/wp-content/themes/twentyten/functions.h>
#include <php/wp-content/themes/twentyten/single.h>
#include <cpp/ext/ext.h>
 
namespace HPHP {
 
Variant pm_php$wp_content$themes$twentyten$single_php(bool incOnce /* = false */, LVariableTable* variables /* = NULL */) {
 
  LINE(10,invoke_failed("get_header", Array(), 0x26068646792ABCAELL));
  echo("\n\t\t<div id=\"container\">\n\t\t\t<div id=\"content\" role=\"main\">\n\n");
 
  if (toBoolean(LINE(15,invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL)))) LOOP_COUNTER(1);
  {
    while (toBoolean(invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL))) {
      LOOP_COUNTER_CHECK(1);
      {
        invoke_failed("the_post", Array(), 0x41F4B03CC3C890CFLL);
        echo("\n\t\t\t\t<div id=\"nav-above\" class=\"navigation\">\n\t\t\t\t\t<div class=\"nav-previous\">");

ここでは分かりやすいようにかなり抜粋していますが、PHP が C++ に変換されているのがワカリマス。 これは twentytn の single.php 部分ですがなんてことを、って感じですね(笑)

ちなみに、WordPress 以外はというと bbPress も同様に変換がおちました。 ごくごく簡単な、test.php ひとつだけだとうまくサーバ起動まで動作しました。

ランタイムでおちるのなら依存のライブラリかなとかも思うのですが、この段階で動くプロダクトが何かがよく分からなくて手詰まりとなりました。 最初さくら VPS 上でやっていたのでメモリ不足かなとおもって、ローカルの仮想マシンの CentOS 5.5 でもやってみたのですが同様の結果に。

もうちょっと時間があれば、file.list を増減させたりしてみたかったのですが、なんせ ここまでくるのに 12時間近く、、、わたしまけましたわ(笑)

まぁ小中学生のときはコンピュータうまく動かないことにハマって数ヶ月一人もんもんするくらいへーきだったので、根性なくなったな自分、などと思いつつ今日はここまでにしておきます。 :D

さくらの VPS で遊ぶ (WordPress 編)

昨日に引き続きまして、さくらさんの VPS。 今度は我らが WordPress のインストールに挑戦してみたいと思います。

WordPress なら VPS じゃなくて普通のレンサバでいいじゃないか、という声も聞こえてきそうですが、VPS の場合は レンサバでは自分で自由にいれることができない PHP アクセラレータとか memcached とか、MySQL のクエリーキャッシュとかをいじれるのがポイントになります。

まぁ面白そうだというのが一番だったりもしますです。 :)

てなわけで さくら VPS は初期状態、本当にまっさらな感じなので、まずは Apache と PHP と MySQL のインストールから。

# yum update
# yum install httpd php php-mbstring php-mysql php-gd mysql-server

まぁこんな感じで…(SSH のログとばしてしまったので、間違っていたらすいません。。)

で、httpd.conf を設定します。 ここではこんな感じで。

   1: # cat /etc/httpd/conf/httpd.conf 
   2: <VirtualHost sakura.maple4ever.net:80>
   3:    ServerName sakura.maple4ever.net
   4:    DocumentRoot /home/apache/sakura.maple4ever.net/public_html
   5:    <Directory /home/apache/sakura.maple4ever.net/public_html>
   6:       AllowOverride all
   7:       Options -MultiViews
   8:    </Directory>
   9: </VirtualHost>

ディレクトリの権限などは chown –R apache:apache しておきます。 また、wp-config.php と .htaccess をつくらせるために public_html に書き込み権限を。 あとで落としてください。 (試験の適当設定なので本気でやるときはユーザを作成するなど注意深くやってください)

でもって、httpd と mysqld を起動して mysql にデータベースを作成。 ここではやってませんが、mysql のパスワードもちゃんと設定のこと。

# /etc/init.d/httpd start
# /etc/init.d/mysqld start
# mysql -u root -p
パスワードは初期状態なし
\ create database 'sakura' default character set utf8 collate utf8_general_ci;

あとはいつも通り、WordPress を public_html にいれて、URL にアクセスでございます。、 :)

   1: # cd /home/apache/sakura.maple4ever.net/public_html
   2: # wget http://ja.wordpress.org/wordpress-3.0.1-ja.tar.gz
   3: # tar zxvf wordpress-3.0.1-ja.tar.gz
   4: # cp -R wordpress/* .
   5: # rm -Rf wordpress
   6: # cd ..
   7: # chown -R apache:apache public_html
   8: # chmod +w public_html

ということで、無事起動します。 データもプラグインも入っていないのでなかなかさくさく動きます。

いけるか!?。。

これだと実運用の動きが分からないので、hiromasa.another (ここ)のデータをインポートしてみました。 画像の http セッションも確認したかったので、画像も移して URL を置換しています。

いけ~。

きゅるるるるるる、ぼぼん!

ひろまさ「ずがーん、のこりメモリ 40MByte。。。。。」

ひろまさ「ちょっぱ~を寝かせてきます。」

Masayan「…」

失意のひろまさくん。

ちなみにこのブログで一番重い処理は、kougabu のサムネイル作成だったりします。 複数画像を非同期で縮小かけにいくので結構メモリをくいます。(そのため kougabu ではプログラムで一定数以上同時につくらないように動作を制限しています。 なかなかサムネイルできないときあるのはこの機能のせいです)

はたして残りメモリ 40M じゃ、PHP アクセラレータも memcached もいけんわなぁと思いつつ、せっかくだからと言うことでどうなるのか APC のインストールをしてみる。

PHP: 導入 – Manual

Alternative PHP Cache (APC) は、PHP の実行コードをキャッシュする仕組みで、 フリーかつオープンに使用できます。PHP の中間コードのキャッシュ・最適化を行うための、 フリーでオープンかつ堅牢なフレームワークを提供するということを目標としています。

# yum install php-pear php-devel 
# pecl install APC
no と答えた
# vi /etc/php.ini
extension=apc.so # 入れる
# /etc/init.d/httpd restart

うまくはいると phpinfo() にこんなんでます。

sakura21 

そして、WordPress を表示して、いろいろアタックしてみたあとに free。

ひろまさ「なんと、のこりメモリ 200M キター!」

ぼのを「…」

どうやら APC でバイトコードをつくるとメモリ使用量がずいぶん減るようです。(たぶん) しかも速度が 1.5倍くらい速くなりました。

Powered by WordPress. Built on the Thematic Theme Framework. (75 queries.1.902seconds.)

最初は 3秒以上くらいかかっていたのでだいぶいい感じです。

そして調子に乗って memcached も導入して、WordPress コアのクエリなどをキャッシュしてみます。

# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
# yum install memcached php-pecl-memcache
# /etc/init.d/memcached start
# cd /home/apache/sakura.maple4ever.net/public_html/wp-content
# wget http://plugins.trac.wordpress.org/export/285287/memcached/trunk/object-cache.php
# chown apache:apache object-cache.php

これで、PHP から memcached がみえて WordPress が使ってくれるハズです。

sakura20 

で、キャッシュを効かせる感じで、ブラウザからぽちぽちあくせす。。 :)

Powered by WordPress. Built on the Thematic Theme Framework. (28 queries.1.415seconds.)

1.9 秒かかっていたのが、1.4 秒になりました! (昔やったときはクエリ 4 くらいまで落ちたのですが、テーマとかプラグインなど対応していない SQL のせいかもです。 チューニングの余地あり)

で、しばらく触った後のメモリを観測。

# free
             total       used       free     shared    buffers     cached
Mem:        510532     504212       6320          0       3372     111752
-/+ buffers/cache:     389088     121444
Swap:      2048276      28984    2019292
# memcached-tool 127.0.0.1 display
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B       478s       1       3      no        0        0    0
  2     120B       478s       1       3      no        0        0    0
  3     152B      1068s       1       4      no        0        0    0
  4     192B       963s       1       3      no        0        0    0
  5     240B      1062s       1       3      no        0        0    0
  7     384B       574s       1      34      no        0        0    0
  8     480B       957s       1      62      no        0        0    0
  9     600B       957s       1     145      no        0        0    0
 10     752B       957s       1      32      no        0        0    0
 11     944B      1640s       1       5      no        0        0    0
 13     1.4K      1640s       1       3      no        0        0    0
 14     1.8K      1640s       1       2      no        0        0    0
 16     2.8K      1654s       1       3      no        0        0    0
 17     3.5K       958s       1       4      no        0        0    0
 18     4.4K      1655s       1       4      no        0        0    0
 19     5.5K       958s       1      10      no        0        0    0
 20     6.9K      1644s       1       4      no        0        0    0
 21     8.7K      1655s       1       2      no        0        0    0
 22    10.8K       958s       1       5      no        0        0    0
 23    13.6K       958s       1       4      no        0        0    0
 24    16.9K       958s       1       4      no        0        0    0
 25    21.2K       958s       1       6      no        0        0    0
 26    26.5K         0s       1       0      no        0        0    0

のこり 121M キター。 これならいける。 いける。

さすがに VPS なので CPU 的な部分はやはり遅いようで、ここのコアサバの表示速度には及びませんが(ちなみに最近ひどく調子がいい。 0.3秒くらいでレンダリング終了します)、必ず一定の速度で動けて、その他工夫次第でチューニングもできるので遊ぶには面白いのではないかと思います。

ちなみに今回動かしたサイトは、こんなかんじです。 (そのうち消えます)

ひろましゃ.さくらVPS :o )

というわけで、もうすこしいろいろな角度から検証は必要そうですが、APC いれるとなかなかいけそうな気がします。 もちろん使い方、サイトの規模にもよると思いますので、やられる方は2週間の試用期間で確認するといいと思います。 :)

以上、デプロイ田中でした。

DVC00012

あ、関係ない。(笑)

さくらの VPS で遊ぶ (Redmine + Subversion 編)

さくらインターネットさんが低価格 VPS をはじめたということで、さらに2週間のお試し期間もあるということで、どういった感じか見るために早速登録してみることにしました。

VPS のポイントは何はなくてもそのメモリ。 さくらさんのは 512M ということで、まずは確実にちょっと厳しいことが予想される、Java + Serlvet + PostreSQL アプリからやってみました。 まぁ実験と言うことで。 :)

ターゲットは最近おなじみ Redmine と Subversion サーバです。

さくらのVPS|VPS(仮想専用サーバ)はさくらインターネット

さくらのVPSは、仮想化技術を用いて1台の物理サーバ上に複数の仮想サーバを構築し、お客様だけの仮想専用サーバとしてご利用いただけるサービスです。専用サーバの自由度と共用サーバの低価格、そして仮想サーバならではの機能を合わせ持ったホスティングサービス、さくらのVPSをぜひご利用ください。

仮想化 VPS ということで、OS (標準で CentOS 5.5 64bit版)の root のパスワードがもらえます。 root があればどんなアプリ動作環境でもライブラリでも、好きに入れることができるのが最大の嬉しいところ。 ここでは、一般のいわゆるレンタルサーバではサポートされていない、Java + サーブレットの環境をつくってアプリを配置してみました。

ちなみに、コントロールパネルより root のパスワード通知のメールが少し遅れてきて、初期パスワードをどこだどこだと最初に探したのはここだけの秘密です。。

さて、さくらさん VPS で面白いなと思ったのが、コンソールログインがブラウザ上からできること。 JavaScript で実装されている?! top コマンドとかもちゃんとでてすごいですね。

redmine31

これのおかげで、まちがって SSH のサービスおとしちゃったとか、iptables ミスってネットワークログインできなくなっちゃったとかも回復することができます。 他には、OS の起動停止やリソースの閲覧が可能です。 残念ながら仮想マシンのスナップショットバックアップはとれませんが、これは低価格ゆえ仕方がないところでしょう。

では Java + Tomcat6 + PostgreSQL + mod_dav_svn(Subversionサーバ) をインストールしてみます。 まずは気になる初期状態のメモリは以下のような感じでした。 (起動して yum update しただけの状態)

# free
             total       used       free     shared    buffers     cached
Mem:        510532     433784      76748          0      53672     340188
-/+ buffers/cache:      39924     470608
Swap:      2048276          0    2048276

起動サービスはたいぶ初期状態でしぼってあり、バッファ、キャッシュを除いて 470M ほど Free な感じです。

これに mod_dav_svn をインストール。 rpmforge から yum install mod_dav_svn しています。 で、Apache とともに起動。

# free
             total       used       free     shared    buffers     cached
Mem:        510532     442624      67908          0      53804     341040
-/+ buffers/cache:      47780     462752
Swap:      2048276          0    2048276

まぁ起動させただけなので、、460M ほど Free。

次に Redmine で使う PostgreSQL をインストール。 yum install postgresql-server の感じで。

# /etc/init.d/postgresql start
Initializing database:                                     [  OK  ]
Starting postgresql service:                               [  OK  ]
[root@www1431u opt]# free
             total       used       free     shared    buffers     cached
Mem:        510532     483876      26656          0      11332     416120
-/+ buffers/cache:      56424     454108
Swap:      2048276         80    2048196

まぁこちらも起動しただけなので、450M。

で、Tomcat6 をインストール。 jsvc を使ってデーモン起動しています。

まず、jsvc (commons-daemon-1.0.2-native-src) をコンパイルするために、JDK の64bit 版を (jdk-6u21-linux-x64-rpm.bin)をインストールしています。 でもって、起動シェルを以下の感じで。

# cat /etc/rc3.d/S80tomcat6 
#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc
 
# Source function library.
. /etc/init.d/functions
 
JAVA_HOME=/usr/java/default
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS="-Xmx256M -Xms128M"
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc
 
start(){
    #
    # Start Tomcat
    #
 
    echo -n "Starting tomcat6: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
 
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
    fi
    echo
}
 
stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down tomcat6: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}
 
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: jsvc {start|stop|restart|status}"
        exit 1
        ;;
esac

CATALINA_OPTS="-Xmx256M -Xms128M" として最大 256M を JavaVM に割り当てみました。 あと、mod_proxy_ajp で Apache を経由させています。

ではいってみましょう。

きゅるるるるるる…、ぼぼん!

redmine30

動きました!

気になるメモリは、、

[root@www1431u logs]# free
             total       used       free     shared    buffers     cached
Mem:        510532     504736       5796          0       3528      33020
-/+ buffers/cache:     468188      42344
Swap:      2048276     382568    1665708

42M。(笑)

この状態でブラウザ操作レベルで、多重アクセスの負荷をかけてみましたがさすがに5多重くらいにすると OutOfMemoru Exception で落ちてしまうようです。

Subverion へ大量ファイル(WordPress のファイル)のコミットもしてみました。 こちらはうまくいきましたが、バックで Redmine を操作するとやはり厳しい模様。 また、tag と trunk など大量の差分比較も難しそうです。(broken pipe してた)

てなわけで、やる前から厳しいなとは思っていたのですが、Java のアプリは 512M だとなかなか厳しそうです。 Redmine に関しては(未検証ですが)素直に Passenger(mod_rails) を使えばうまくいくような気もしますが、ここは実験ということで。 :)

Tomcat に関しては標準で入っている manager アプリとかおとして、768M メモリだったらいけそうなので、実におしい。。 デプロイ田中もにっこり。

それにしても VPS は手軽面白いですね。 実践的に Linux で遊べるという部分で 1台もっていると何かと嬉しいかもしれません。

てなわけで、次は WordPress を入れてみたいと思います。 お楽しみに。 :D

最近の WordPress 的な写真

先月の OSC 北海道からの WordPress 的な写真達です。 ここ1年、2年、WordPress のオフライン活動も活発になってきていてみなさん楽しそうです。 :)

というわけで、OSC 北海道にからめて北海道にきてくれた、てぃあーこさんおでこさんとジンギスカン写真からいってみよう!。

2010/6/23。

wordpress00-01 

2次会でジンギスカンに(笑) てぃあこさん、食べれないかと心配でしたが、大丈夫だったようで良かったです。 :-)

次は OSC 北海道、前夜祭。

(ここからおでこさんの、フリッカー写真をお借りしています)

かんぱーい。(^ ^

wordpress01-01

活ほっけって、ぼくもはじめて。

wordpress01-02

おいしかったす。 :)

OSC 北海道、当日。

ブースにて。

wordpress01-03

セミナ中。 姿勢悪いな、おれ。(笑)

wordpress01-04

(ここまでおでさんのフリッカーより。 さんきゅ~!)

後日。

前夜祭、OSC に来てくださいました、りぃさんとそのお仲間に混ぜていただいて、すすきの的な何か。

wordpress02-01

wordpress02-02

飲むときに薄暗いのは好きですなぁ。(←どういうオチだ!

オープンソースカンファレンス 2010 北海道 + WordPress セミナ & ブース

昨日 6/26 に札幌市産業振興センターで行われました、オープンソースカンファレンス 2010 北海道にて、WordPress ブース展示とセミナの開催をWordBench 札幌として実施させていただきました。  :)

セミナで「世界標準ブログツール WordPress の最新版 3.0 と豊富なプラグイン」ということでお話しさせていただきましたので、資料のほうをこちらで公開したいと思います!。

東京からはるばる札幌まで支援に来ていただきました、yuriko さんてぃあこさんおでこさん、札幌よりさっちん、どうもありがとうございましたっ。

オープンソースカンファレンス2010 Hokkaido – オープンソースの文化祭!

内容:オープンソースに関する最新情報の提供
・展示 – オープンソースコミュニティ、企業・団体による展示
・セミナー – オープンソースの最新情報を提供

自分は普段ソフトウェア会社所属なもので、WordPress のブース・セミナに興味を持って多く足を運んでくださるであろう、札幌の Web 製作会社の方との交流が実はなく、実際どの程度着ていただけるのかが未知数でしたが、ふたを開けてみればセミナの方は立ち見までということで、札幌で活動をされている方と交流を持たせていただけたことを嬉しく思いました。 :)

というわけで、セミナ資料を公開いたします。

世界標準ブログツール WordPress の最新版 3.0 と豊富なプラグイン

本日お話しする内容

  • 日本時間 6/18 にリリースされた WordPress 3.0 について、WordPress の CMS としての紹介とともに新機能を解説します。(6/23 に日本語版がリリースされました)
  • その中で WordPress の動作を追いながらプラグインの仕組みと、その仕組みを使った具体的な例を紹介します。
  • 最後に、WordPress コミニュティサイト WordBench をご案内します。

ご存じの通り人前でしゃべるのが苦手なもので分かりづらくてホントすいません。。 当日の資料で口頭にしてしまっているところには、若干ですが補足いれましたので、来られていない方も見ていただければと思います。

セミナ終わった後にご挨拶させていただけた方、ありがとうございました。 今後ともヨロシクお願いいたします。 :)

WordPress ブースの方もみなさん足を運んでくださってありがとうございました!

IMG_0092

yuriko さんが、WordPress グッズを東京から輸入してくださいました。 :D

前日のお食事会の様子や、OSC 中の楽しげな写真などは次のエントリでいきます!(おでこさんの写真待ちともいう(笑))

WordPress 3.0 と プラグインアクション・フィルターフックへのクロージャ渡し

3.0 開発中は全然気がつかなかったのですが、WordPress 3.0 からプラグインのアクション・フィルターフックにクロージャが渡せるようになりました。

クロージャが使えるのは PHP 5.3 からなのでみんなに使ってもらうプラグインなどではあまり使えませんが、5.3 と決まった環境でのテーマつくりなどの作業の場合は楽できるかもです :)

特に、Thematic などテーマフレームワークの functions.php で小さなフックをつくらなければいけない場合に威力を発揮しそうです。 ついでに 5.3 じゃなくても楽する方法も紹介します。

修正元の trac はこちらです。

#10493 (Allow closures as callbacks) – WordPress Trac

PHP 5.3 allows closures, which means we can replace this:

add_action('init', create_function('', '//do something'));

with this:

add_action('init', function() { // do something });

and it only requires two lines of extra code.

実はサンプル上の create_function を使うパターンは少し前からマイブームだったのでタイムリー。 こちらは PHP 5.3 じゃなくてもいけます。

でもって、これって何の話かというと…。

いつもの、the_content のフィルターをつかった、記事の頭に☆をつけるサンプルでご説明。

まず、以下のソースが一般的にかいたフィルタープラグインフックです。

// 普通のパターン
function add_star($content) {
    return "☆" . $content;
}
 
add_filter('the_content', 'add_star');

 

別にこれでいいわけなんですが、問題は add_star っていう関数。 こんな小さい関数に名前をいちいち考えるのも大変ですし、他とかぶってはいけないという制約もあります。 要は面倒であります。

ってことで、PHP では create_function というのを使うと匿名関数というのがつくれますので(名無しさんですね)これを利用すると…。

// 匿名関数(create_function)
add_filter('the_content'
    , create_function('$content', 'return "▲" . $content;'));

 

add_star をなくせました。 create_function でつくりだした匿名の関数をフックに渡してしまいます。 ちょいフックならこれで十分。 これは PHP 5.3 じゃなくても動きます。

でもちょっと問題がありまして、見ての通り関数の内容がただの文字列。 IDE サポートもうけられませんし、何より分かりづらい。 SQL をソースコードに直接書いているようながっかり感があります(笑)

というわけで PHP 5.3 から登場した、無名関数。 PHP マニュアル見ると匿名と無名で分けてみるみたいですね。

php 無名関数 – Manual

無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 コールバック パラメータとして使う際に便利ですが、用途はそれにとどまりません。

どうなるかというと、

// 無名関数(PHP 5.3)
add_filter('the_content'
    , function($content) { return '△' . $content;});

 

やぁすっきりしました。 function() {} ということで名前なしで関数を定義して、直で add_filter に渡してしまいます。(これが WordPress 3.0 からサポートされました)

ここまでで十分便利ですが、調子に乗って「振る舞いを変えた」無名関数を the_content に登録してみます。

// 無名関数(エンクロージャ参照)
function enclosure($value) {
    $add = $value;
    return function($content) use($add) {
        return $add . $content;
    };
}
 
add_filter('the_content', enclosure('□'));
add_filter('the_content', enclosure('■'));
 

 

これは今までは class でやっていたことを、関数で実装する感じです。 PHP のクロージャは外側の変数を参照するのに use を使うようです。 :)

さてさて、これらを全部テーマの functios.php いれるとこんな感じになります。

closure01

予定通り全部動いていますね。 :)

最後に thematic テーマフレームワークで head 部に generator meta タグを復帰させるコードをサンプルに。

// 匿名関数版(create_function)
add_action('init', create_function('',
    "remove_filter(
        'the_generator'
        , 'thematic_remove_generators');"), 999);
 
// 無名関数版(PHP 5.3)
add_action('init', function() {
    remove_filter(
        'the_generator'
        , 'thematic_remove_generators');},999);
 

 

というわけで、小さいフックをかかねばならない場合は、是非是非(←3回目…

WordPress 3.0 Thelonious リリースとカスタムメニュー

幾度かの RC を経まして WordPress 3.0 Thelonious がリリースされました!

ja(日本語)版リリースに先駆けまして、ここ hiromasa.another も 3.0 にアップグレード。 実は少し前から RC 版で動かしておりましたので、トラブルなく動作しました。

3.0 はマルチブログ、カスタム投稿、カスタムメニューの機能追加、カスタム分類強化などなどデータ構造の変更を含む大きなリリースとなっています。

その他の大量の変更内容も含めまして、codex をみると非常によく分かります。 :)

Version 3.0 – WordPress Codex 日本語版

2010年6月17日(木)(米国時間)、WordPress バージョン 3.0 がリリースされました原文)。このバージョンのバグフィクスについての情報は、Trac のクローズチケット一覧をご覧ください。

カスタム投稿 + カスタム分類は強力な変更ですが、ここのような既に動作しているブログでは品行方正(?!)が必要な部分もありいきなりの導入はちょっと難しい(笑)ですので、まずはカスタムメニューを導入してみました。

WordPress を CMS 的に使う場合、コンテンツがスタックする部分にカテゴリやタグを、変更が累積しない場合にはページを使うというのがあちこちでみる常套手段となっていますが、その統一ナビゲーションメニューをつくるのって結構大変です。

wp_page_manu だと基本ページの一覧しかだせないので、カテゴリリンクとまぜて ol li を構築するのがやっかいです。 あとページだけでも順番そろえたりとか結構面倒、てなわけで登場したのが wp_nav_menu。

管理画面の UI 操作で、カテゴリ、タグ、カスタム投稿、その他手動設定のリンクや個別の投稿を選択してメニュー化できます。

nav02

階層構造ももつことができて、対応する CSS を書いてあげればドロップダウンメニューとかもできるようになっています。

使い方は簡単で、今テーマで wp_page_menu とかしているところを、wp_nav_manu テンプレートタグに置き換えればとりあえず、それとなく動くようになっているようです。 本来的にはテーマの functions.php で register_nav_menu してあげてからにすると、複数のメニューを任意の位置にだすことができます。

nav01 

たとえば、ここのサイトで使っているテーマフレームワーク Thematic の場合は、functions.php に以下を追加すると既存のヘッダページメニューをカスタムメニューに置き換えられます。(そのうち Thematic 本家も対応すると思いますのでこれはサンプルってことで :)

/******************************************************************************
 * メニュー変更
 *****************************************************************************/
function refrect_setup() {
    // thematic 標準ナビゲーション(wp_page_nav)削除
    remove_filter('thematic_header','thematic_access', 9);
    // テーマにナビゲーション登録
    register_nav_menu('primary', 'ヘッダのところのナビゲーション');
    // thematic ナビゲーション変更
    add_action('thematic_header','add_custom_menu', 9);
}
 
function add_custom_menu() {
?>
    <div id="access">
    <div class="skip-link"><a href="#content" title="<?php _e('Skip navigation to the content', 'thematic'); ?>"><?php _e('Skip to content', 'thematic'); ?></a></div>
        <?php wp_nav_menu(array(
            'theme_location' => 'primary'
            , 'container_class' => 'menu'
            ,'menu_class' => 'sf-menu sf-js-enabled')); ?>
    </div><!-- #access -->
<?php
}
 
add_action('after_setup_theme', 'refrect_setup');

 

このソースは Thematic 特有のコードが入っていますが、基本はそれぞれのテーマの functions.php に

register_nav_menu('primary', 'ヘッダのところのナビゲーション');

 

この1行を追加しまして、テーマでカスタムメニューをだしたい部分に、

<?php wp_nav_menu(array('theme_location' => 'primary')); ?>

 

とかけば OK のハズです。 primary っていうのが id で任意の名前をつけて複数メニューがある場合はこれで識別します。 簡単あるね。

wp_nav_manu には引数で html の id や class を指定できますので、CSS にいい感じに合わせれば良いと思います。

テーマファイルもいじりたくないって場合は、3.0 からこのカスタムメニューを表示するウィジェットが用意されていますので、これをぺたっと張ればサイドバーとかにはすぐだせますね。 :)

nav03

ちなみに、このサイトの上のナビゲーションはカスタムメニュー化しています。 ページしか使っていなかったので、見た目「ホーム」が「Home」になっただけですが、順番を UI で変えられるのは便利です。

まずは、是非是非。 :)

WordCamp Yokohama 2010 に行ってきました!

5/28 ~ 5/30 にかけまして、WordCamp Yokohama 2010 に参加するために、横浜に行って参りました。 :) ブログ書くのも困るくらい、楽しいことがたくさんありました。 みなさま、どうもありがとうございました!

相変わらず、カメラを持って行ったのに1枚も撮っていなかったという事態のため、以下写真はおでこさんのフリッカーより拝借です!

5/28(金)。

夕方に札幌を出発で、20:30 くらいに羽田到着しました。 おでこさん達がレセプション後、遊んでくれると言ってくれる勇んで渋谷に。 向かおうとしたら、羽田空港で自分の母親と出会う。 東京で会うとか意味が分からない。

21:30 渋谷到着。

おでこさんはレセプション中でお忙しそうでしたので、渋谷駅のハチ公さんのところで試験的に若者に混ざってしゃがんでいてみたりする。 途中、をかもとにーさんののびた写真が送られてきてわくわくする。

おでこさんと連絡がつき「どーげんざか」と教えてもらうもどこかよく分からない。 教えてもらったとおりにウォーク。

あ!!

ぼーいみーつがーる。 広瀬香美がかかった気がする。 しかし、ガールではない。

そこには、をかもとにーさんがそびえ立っていた。 何を隠そう初対面であります。

いつも通り、ぼくは訳が分からなくなってかんだのは言うまでもない。 にいさんは想像通り、いや想像を超えたにいさんであり、お会いできてうれしかった。

yokohama01

おでこさん、てぃあこさん、じゅんさん、をかもとにいさんに歓迎会を開いていただきました。 ありがとうございます!!。 :)

5/29(土)。 WordCamp Yokohama 2010 当日。

この日は、おでこさんのプレゼンにちょっとおじゃまするのであった。

WordCamp Yokohama 2010 で「すばらしき WordPress コミュニティーの世界」についてたっぷり語りました!  Odysseygate.com

最初は一人で全部やろうと思っていましたが、どんどん広がるコミュニティの世界を一人ではつたえきれない!と思い、急遽ひろまささん、じゅんさんにもプレゼンをお願いし、リレーセッションに挑戦してみました。いかがだったでしょうか。

どうやらカンペの iPod touch をもつ手が震えていたらしい(気がつかなかった)。 でも、3人でできて面白かったです!!

yokohama03

まさにコミニュティーって感じで良かったデス。 おでこさんは相変わらずエロく、じゅんさんはいちいち爽やかでした。 そりゃもてるっつーの(笑)

その他、会場をちょろちょろしてお手伝いなど。 じゃまだったらすいません。。

柏岡さんとは相変わらずエロい感じでした。 確実にオーラが。。。 :)

yokohama02

そうこうしているうちに、あっという間に懇親会。

WordPress オフ会 2006年組のみなさん、WordCamp Tokyo 2009年組のみなさん、micc さん、再会できてうれしかったです。 お初の皆様もありがとうございました!! :D

最後ににいさんとぱちり。

yokohama04

いつも同じソースコードみているというのに、初対面という不思議さ。 ギャグあとに、ニヤリとするそのお姿はこれからもなにとぞヨロシクお願いしますという気持ちに。

オープンソースとインターネット、そしてみんなが顔を合わせるオフラインミーティングがそろうと、ものすごいパワーを生み出すなぁと思った WordCamp Yokohama 2010 でした。 :)

あ、Nao さんと写真撮ってないじゃないかっ! 不覚(笑)