いくつかWordPressプラグインを開発しているのだけど、基本的に自分のブログでテストするのは最後で開発時は別に開発専用のWordPressを用意している。

その環境はVMWare PlayerでUbuntuをゲストOSとして実行している。いままではApache2で動かしていたけれど、Ubuntu 12.04 LTSのリリースのタイミングと今回さくらVPSに移行したタイミングから開発環境でもNginxでテストすることに。

WordPress開発環境の構成

URL

開発時はwordpress-devというサーバ名で運用している。ブラウザでテストするマシン(ホストOS)の/etc/hosts(Windowsの場合はC:\Windows\System32\drivers\etc\hosts)に以下を追加しておく。

192.168.0.1 wordpress-dev

192.168.0.1は例であって実際はVMWareの仮想ネットワークが振るアドレスに変更となる。ゲストOSのUbuntuでifconfigと打てばDHCPに振られているIPアドレスがわかる。

ディレクトリ構成

試行錯誤したのち、WordPress開発環境では以下のような構成にしている。

/var/www/wordpress-dev/2.8/ja/ -> 特定バージョンのWordPressを配置
/var/www/wordpress-dev/beta/en/ -> 正式リリース前のWordpressを配置
/var/www/wordpress-dev/stable/en/ -> 最新のWordPressを配置
/var/www/wordpress-dev/stable/ja/ -> 最新のWordPressを配置

WordPressバージョンによってAPIが変わるのでAPIの変更が大きかったバージョンを幾つか用意しておく。新しいWordPressバージョンでの動作確認のためbetaディレクトリに用意。普段の開発は最新版を自動更新するstableディレクトリを用意しておく。プラグインでは日英ローカライズにも対応しているのでen,jaといったディレクトリにその言語でのWordPressをそのまま配置している。

データベース接続

WordPressは同一データベースで複数のWordPressを管理することが可能。具体的には同じSQLデータベース内で別のテーブルを使うことができる。wp-config.phpにはtable_prefixという変数名があり、これをそれぞれバラバラに設定しておけば同じデータベースでも別のテーブル名が使われるので複数のWordPressを共存することができる。

デフォルトは’wp_’で、先程のディレクトリ階層に沿って例えば/var/www/stable/ja/wp-config.phpでは以下のようにwp_stable_ja_というように設定している。

/**
 * WordPress データベーステーブルの接頭辞
 *
 * それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
 * インストールすることができます。半角英数字と下線のみを使用してください。
 */
$table_prefix  = 'wp_stable_ja_';

Ubuntu 12.04でNginxを実行する

Ubuntuではnginx-extrasパッケージが普通に見つかったのでDebinaでdotdebリポジトリを追加したときの手順と変わらない。

sudo apt-get install nginx-extras
sudo apt-get install php5-fpm

でnginxからphpを実行する環境を構築できる。

トラブル apacheをバックエンドにするとリダイレクトする

そうは言ってもNginxの設定を書きなおすのが面倒だったので今まで使っていたApacheの設定をそのまま使い、Apacheをポート8080で動かし、NginxからApacheに振ってみた。

proxy_pass          http://127.0.0.1:8080;

結論からいうとうまく動かなかった。

ブラウザから http://wordpress-dev/stable/ja/ にアクセスするとNginxがproxy_passの設定に従いhttp://127.0.0.1:8080/stable/ja/を参照した結果を返そうとする。http://127.0.0.1:8080/stable/ja/ではApacheがWordpressを実行してレスポンスを返すのだが、おそらくWordPressのブログのURLとこのアクセスしたURL(http://127.0.0.1:8080/stable/ja/)が違うのでWordPressはこのURLにリダイレクトしようとしてしまう。

リダイレクトのレスポンスを受けてブラウザはhttp://127.0.0.1/stable/ja/にアクセスするが、(ホストOSの)ブラウザから見た場合127.0.0.1はNginxやApacheを動かしているゲストOSではなくホストOS自身なので期待する結果は得られない。ホストOSでWebサーバを実行していなければただの接続エラーがブラウザに表示される。

渋々Nginxの設定をする

大した手間でもないので諦めてリダイレクトの問題は調査せずにNginxの設定を書く。

upstream php {
    server 127.0.0.1:9000;
}
server {
    server_name wordpress-dev;
    error_log /var/log/nginx/error_wpdev.log debug;
    root /var/www/wordpress-dev;
    index index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
    }
}

上記ファイルは以下のコマンドで有効にする

    pushd /etc/nginx/sites-enabled/
    sudo ln -s ../sites-available/wordpress-dev wordpress-dev
    popd
    sudo service nginx reload

WP_SITEURL定義のTips

接続で使うURLをWordPressがデータベースに保存しているサイトのURLが違うとリダイレクトなり問題が起きるようなのだが、wp-config.phpに以下のような記述を入れるとデータベースのサイトURLよりこちらを優先して使ってくれるようだ。URLを移行したときに接続できない場合は移行後のURLをWP_SITEURLに設定してWordPressを開き、wp-adminからサイトのURLを編集すればよいだろう。

define('WP_SITEURL', 'http://wordpress-dev/stable/ja');

さくらVPS 512からさくらVPS 2Gに移行していろいろ作業している間に Redmineは1.4.xがリリースされ、さらに Rails3向けのRedmine 2.0がリリースされた。

取り残されないうちにRedmine 2.0に更新する。Nginx+Passengerで動かしているがほとんどの作業はコマンドラインからでウェブサーバの違いが手順に影響することはあまりない。

本家サイトの手順にそっていく
http://www.redmine.org/projects/redmine/wiki/RedmineUpgrade

なおCentOS版の更新手順はredmine.jpで公開されている
http://blog.redmine.jp/articles/redmine-2_0-installation_centos/

Step 1 – Check requirements

Redmine 1.3.2の環境でRubyは1.8.7のみ、Railsは 2.3.14、gemは古いという状態。

一方、Redmine 2.0はRubyは1.8.7, 1.9.2, 1.9.3, jruby-1.6.7、Railsは3.2.3が必要。他のパッケージが記載されていないのでよく読んでみると、Redmine 1.4から依存パッケージをインストールする「bundle install」が使えるようになっているようだ。

さて今回はいろいろあって(後述)、Ruby 1.8.7を継続して使うことにした。Redmineの依存パッケージをインストールしていく。

su
PATH="$PATH:/var/lib/gems/1.8/bin"
gem install bundler
cd /path/to/redmine
bundle install --without development test

Debign/Ubuntuはgemのバイナリのパスが通っていないの面倒。

RMagickの依存ライブラリのインストール

RMagickのインストールに失敗したので補足しておく。いままでRMagickはオプションだったし、別に要らないと思ってインストールしていなかった。しかし、bundle installの途中で失敗してストップしてしまうので諦めてRMagickをインストールする。

apt-cache search magick でそれらしいパッケージを検索し、以下のコマンドを実行。

apt-get install imagemagick
apt-get install libmagickcore-dev
apt-get install libmagickwand-dev

正直なところ3回実行した。最初にCan’t install RMagick 2.13.1. Can’t find Magick-configというエラーだったので薄々開発モジュールが要りそうだと思っていてimagemagickをインストールしてもMagick-configは入らなかったので続けてlibmagickcore-devをインストール。しかしそれでも Can’t install RMagick 2.13.1. Can’t find MagickWand.h. というエラーがでたので libmagickwand-dev をインストール。これでRMagickはインストールできた。

Step 2 – Backup

MySQLデータベースだけ。ここからはrootではなく通常ユーザで実行。

mysqldump -u redmine -p redmine > ~/redmine.dump.sql

Step 3 – Perform the upgrade

redmineはgitからインストールしている。
gitリポジトリを使ってredmine 1.1から1.2に更新

gitで管理しているので2.0のローカルブランチを作成する。

cd /path/to/redmine
git status
git checkout master
git pull
git pull --tags
git checkout -b redmine/2.0.0 2.0.0

Step 4 – Update the database

mv vendor/plugins/* plugins/
rm  config/initializers/session_store.rb
rake generate_secret_token
rake db:migrate RAILS_ENV="production"
rake redmine:plugins:migrate RAILS_ENV=production

1行目について
プラグインのディレクトリが変更されたらしい。(プラグインを使っていなかったので未検証)

2,3行目について
Redmine 1.4からsessionまわりが変わったらしいのだが
rake db:migrate RAILS_ENV=”production”
Please remove config/initializers/session_store.rb and run `rake generate_secret_token`.

と怒られたので従う。

5行目について
rake db:migrate_plugins RAILS_ENV=production
Note: The rake task db:migrate_plugins has been deprecated, please use the replacement version redmine:plugins:migrate

ということでdb:migrate_pluginsはredmine:plugins:migrateに置き換わった。

プラグインを入れてなかったのでRedmine 2.0とプラグインの互換性についてはなんとも言えない。自作テーマはRedmine 2.0でも問題なさそうだ。

その自作のテーマはこちらから
GithubテイストなRedmineのテーマを自作してみた

undefined method `log_path’

データベースのマイグレーションを実行しようとすると以下のようなエラーが表示された。

rake db:migrate RAILS_ENV="production"
rake aborted!
undefined method `log_path' for #<Rails::Application::Configuration:0x7f0a75721448>

Configクラスにlog_pathがないので怒られている模様。config/additional_environment.rbに記載していたログのカスタマイズのコードが該当していた。ドキュメントのまま記述していいたのだけど・・・とりあえずコメントアウト。

#config.logger = Logger.new(config.log_path)
#config.logger.level = Logger::WARN

本家サイトでも報告されているのでそのうち修正されるか、回避策が提示されるだろう。それまではデフォルトの設定でいく。
undefined method ‘log_path’
install redmine 2.0, when rake generate_secret_token, an error appear..

Step 5 – Clean up

rake tmp:cache:clear
rake tmp:sessions:clear
sudo service nginx restart

Redmineが無事表示できたら、ログインして管理 > 情報からバージョンを確認しておく。
次に 管理 > ルールと権限から新しい権限のチェック。

管理者にて
「チケットをプライベートに設定」
「自分のチケットをプライベートに設定」
「関連するチケットの管理」
チェックが入っていなかった。いつから増えたのかは不明。

Ruby 1.9系のインストール

移行を諦めたRuby 1.9の話。

Debianは1.8系がruby1.8、1.9系がruby1.9.1をそれぞれapt-get installでインストールできる。もともとruby1.9だったのだが問題があってパッケージ名がruby1.9.1になったようで混乱する。apt-cache show ruby1.9.1で以下のように表示される。

Package: ruby1.9.1
Version: 1.9.3.0-2.1

しかし実際いれてみて ruby1.9.1 -vとすると ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] で1.9.3にならなかった。。

sudo apt-get install ruby1.9.1 ruby1.9.1-dev
# /usr/bin/gem is already managed by gem
# gemは別にmasterで管理されてるよと怒られたので削除
sudo update-alternatives --remove-all gem
sudo update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.8 120\
  --slave /usr/bin/irb ruby-irb /usr/bin/irb1.8\
  --slave /usr/bin/gem ruby-gems /usr/bin/gem1.8
sudo update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 150\
  --slave /usr/bin/irb ruby-irb /usr/bin/irb1.9.1\
  --slave /usr/bin/gem ruby-gems /usr/bin/gem1.9.1\
  --slave /usr/bin/rake ruby-rake /usr/bin/rake1.9.1
sudo update-alternatives --config ruby

一応ruby1.9.1には切り替えられるようにはしたが、最新版を使うならRVMから入れた方が良いような気もしている。いずれにせよRedmine以外Rubyアプリケーションは動かしていないので一旦保留にした。

「コンプガチャ」という仕組みが法的に規制されるとかされないとかで、グリーやらDeNAなどの会社が自主的にそのサービスを中止したという。そもそも「コンプガチャ」とはどういうもので、何が悪いのかいまいちわかっていないので調べてみた。

コンプガチャとは

コンプガチャンプガチャとは、コンプリートガチャの略で、元々は「ガチャ」と呼ばれる有料くじびきゲームがはじまり(無料ガチャも存在する)
話題の「コンプガチャ」についていまさら聞けない人のためのやさしい解説

有料くじびきゲームでその景品をコンプリート、全部揃えることを意味するようだ。ソーシャルゲーム内でくじのようなものを購入し、全部揃えることでさらに何か良いものを得られるようなシステムが問題とされているらしい。

コンプガチャの何が問題なん?

コンプガチャの問題について調べると「射幸心をあおる」というキーワードがよく出てくる。

射幸心とは、人間の心理として幸運を得ることを願う気持ち。
Wikipedia 射幸心

全部揃えると良いことがあるという気持ちを煽ってくじを売ること、これが一種のギャンブル性があるらしい。

だからそれの何が問題なん?

調べてもすっと落ちてこない。じゃぁ、銀のエンゼルを揃えるためにチョコボールを買い続けていたのもダメだったのか?俺はそれを納得した上で買ってたわけだから本人がそれで対価を払って良いと思っているならそれでいいじゃないか。

こういった人間の心理を利用した販売方法は世の中で氾濫しているわけで射幸心をあおることが問題だというならお守りを売る(実際には買っているじゃなくて納めているわけだが)ことだってダメじゃないか。

「ランダムに出てくる特定のアイテムを組み合わせることで、他の景品を入手できるくじ」のような商品は景表法で禁止されている
話題の「コンプガチャ」についていまさら聞けない人のためのやさしい解説

結局のところ、結論は景表法で禁止されてるからダメらしい。この点については以下の内容がわかりやすかった。

懸賞の方法が禁止となった背景には、かつて、子供たちに人気のあったプロ野球選手やアニメーションのキャラクターのカードを集めると景品類がもらえるといった懸賞が爆発的な人気を呼び、カード欲しさに商品を買い続けることに親から苦情が多く寄せられたことや、特定カードの枚数を制限してカードを集めにくくするなど、企業側が不正行為をする可能性が指摘されたことがある。

これを受けて公正取引委員会は、こうした懸賞の方法に対し、(1)それらが主に児童向けの価格の安いものに利用されるものであること、(2)児童の射幸心をあおるものであること、(3)すぐに当たるような気持ちにさせる方法であるため、懸賞の方法自体に欺瞞性が高いことや、児童は大人と比べ判断力が十分でないことなどに配慮し、このやり方自体を全面禁止した。
当たり券3種類そろうと応募できる懸賞は可能か?

そしてこの規制を真面目に読めば、チョコボールの銀のエンゼルは絵合わせでないので問題にならないと考えることができるとのこと。

これに「絵合わせ条項」となる「二以上の種類の文字、絵、符号等を表示した符票のうち、異なる種類の符票の特定の組合せを提示させる方法を用いた懸賞による景品類の提供は、してはならない。」と記載されているのですが、この2以上の種類というのがミソだったりします。例えばコンプガチャの場合は「数種類の異なる種類の付票の特定の組み合わせにより景品を提供」しているのです。逆に森永のエンゼルの場合は「金1種類、もしくは銀1種類であり、同一の付票の枚数により景品を提供」しているのです。
【景表法のわかりやすいお話】コンプガチャがアウトで森永の金銀エンゼルがセーフな理由

細かい理由はよくわからない

子供がお金を使うとか、いろんな理由を背景にあげられているが、そんな商売は世の中に沢山あるわけでソーシャルゲームがやり玉にされるのは単に出る杭は打たれるからに思える。細かい理由を考えていくと年齢で規制すればOKなのかとか線引きがよくわからなくなってくるので「景表法で禁止されてるからダメ」理由はこれだけにしないと堂々巡りになりそう。

確実に叩かれるから誰もやらないと思うが、お金を納めてお守りを手に入れてそれが5つ揃えばいいことがある、というサービスならセーフなのかと思えたりして怖い。お守りは行き過ぎでも、エンゼルマークのように絵が同じものだったらいいんでしょ?とほとぼりが冷めたころにやる人は確実に出てくるんじゃなかろうか。

あれちょっと待て。ドラゴンボールは星の数が違うから景表法に引っかかるんじゃないのか??

検索したらつぶやかれていた(笑)

神龍 「ドラゴンボール廃止のお知らせ」 「七つ集めるとどんな願いでも叶える」ことに財貨性があり「絵合わせ」にあたるのではないかとの消費者庁の問題意識を踏まえ、このたび、「ドラゴンボール」を廃止することとしました。
https://twitter.com/#!/sakai/statuses/200122152018657280

責任はみんなにある

根本的に言えば、ソーシャルサービスにおけるアイテム課金そのものを規制せざるを得ないし、実際にプラットフォーム側はそういった動きを見せている。

[重要なお知らせ]15才以下の方による、アメーバピグ・ピグライフのご利用に関して
グリー、利用環境向上に関する施策を導入・実施
DeNA、「Mobage」における青少年ユーザの月額課金制限を追加導入

何もしなければ社会的に非難されるし、規制をかければユーザから苦情をうけるという袋小路だが儲かっているからいろいろ言われるんだろう。子供が行う課金は親が払っているはずだから、理想としてはプラットフォーム側は規制する仕組みだけを用意してどう適応するかは親が決めればよいと思う。しかし残念ながら世の中の流れの速さにみんなついて行けていないのが一括で規制せざるをえないのが現実なのだろう。

結局のところサービスを提供する側だけじゃなく、使う子供にもその親にもみんなに責任がある気がする。

このブログをさくらVPSに移行して記事を書いて終わり!と思ったが長期戦の予感がしてきたのでとりあえず書いてみることにする。これを書いている時点ではすでに移行しているので今日はそこまで話。

サーバの情報

今まで使っていたレンタルサーバはCORESERVER.JPのCORE-MINI。ずっとCORE-Aだと思ってた・・・。CORE-MINIだと300以下のアカウントで共有しているのでまぁそれは重いこともあるよなー。Load Avarageが10とかザラだったし。

XREA+/CORESERVER.JPはsafeモードでphpが動くのでSuper Cacheをレガシーモードで動かさざるを得なかったり、よく空のレスポンスが返ってくる(ChromeでERR_EMPTY_RESPONSEというエラーが表示されるやつ)ことがあっていい加減うんざりしていたのでVPSに移行することにした。

で移行先のサーバはさくらのVPS 2G。メモリ2Gの仮想3コア。さくらのバックボーンがあるので回線的なパフォーマンスも期待。OSはCentOSではなくDebian 6。

と、その前に

実はNginxにしたからといって速くなるとはまったく期待していなかった。自分が抱いていたNginxのイメージは静的ファイルの配布のパフォーマンスがいいのと、同時アクセス数が多くなってもパフォーマンスが落ちないというあたり。このブログ程度であれば別にNginxにしたところで対して変わらんだろうと思っていた。

Before you consider using nginx, be aware that PHP APC or a similar opcode cache with a WordPress caching plugin is going to offer significant performance improvements over just switching from Apache to nginx. If you aren’t already using a PHP opcode cache and WordPress caching plugin, nginx will do squat for your WordPress-based website’s performance. Also, WordPress is intertwined with the Apache world so support for nginx-based setups is limited but growing. Factor these things into your decision to use nginx.
http://codex.wordpress.org/Nginx

WordPress Codexにも上のように書いてあった。「オマイラもちつけ、APCやキャッシュプラグインを使えばApcheでも十分パフォーマンスはでる」と。

Nginx x WordPressで検索するといろんな記事がヒットするが意外に鉄板な設定はなく、運用を見極めながら決めないといけない。実際設定をしていて思ったが、Nginxは機能がシンプルだけに奥が深い。VPSなどサーバ構築の敷居が下がっているだけになんか速いんでしょ?と軽い気持ちで移行をすすめてはいけないと思った。

自己満足でNginxにします宣言

じゃぁ、なんでNginxにするのよ?ということだが理由は2つほどある。

1つはPHP Ninjaの存在から。これまでにない速さという触れ込みのWordPressのサービスでベータ版に飛びついてみたが、その後判明した価格帯や機能から相当なアクセスがあるブログでしかサービスの良さを享受できないことがわかった。PHP NinjaはZ Cloud、Nginx、WordPress Tuningで高パフォーマンスを実現している。これならVPSで自分で同じような構成にするからいいよ。と完全な負け惜しみからくる自己満足で構築することを決意した。

2つ目はすこしまともな理由。NginxはWebサーバでもあるがリバースプロキシの機能が豊富なのが素敵。特にバックエンドの機能と疎結合に見えるのがいい。設定ファイルで正規表現を使いまくれるのも素敵。ソフトウェアエンジニアの視点から見ると体の良いdispatcherのように見える。正規表現でこのリクエストはNginxで、これはApacheで、とか、別のサーバに処理させるなども可能なのでいろんなチャレンジができそうというのが良い。

自分のテンション(モチベーション)を上げるのは重要なのでこういう邪な理由でも意味があるのである。

PHP5-FPMのインストール

Nginxのインストールは この記事 で終わっている。NginxでPHPアプリケーションを実行する場合はバックエンドをCGIとしてを動かすことになる。それを実現する一つの方法が PHP-FPM (FastCGI Process Manager) である。以前はセットアップが面倒だったが、PHP5.3.3から本家に統合されたのでNginxではこれが主流になるだろう。

Debianではdotdebリポジトリを使えば、以下のコマンドでインストール可能。

aptitude install php5-fpm

Debian/UbuntuのPHP設定ファイルの階層は以下のようになっている。当然別ファイルなので注意が必要。デフォルトではポート9000で受け付ける(php-fpm.conf)。これはNginxの設定で使う。

/etc/php5/cli/php.ini
/etc/php5/apache2/php.ini
/etc/php5/fpm/php-fpm.conf
/etc/php5/fpm/php.ini

サービスはいつものように止めたり、動かしたりできる。

service php-fpm restart

WordPressアプリケーションの移行

レンタルサーバだけどドメインは自分のものを使っていた。つまり今回の移行ではURLは変わらないのでデータベースやWordPressのファイルはそのまま移行した(wp-content/cache/は除く)。移行後、権限の変更が必要なファイルがあったので備忘録として残しておく。ちなみにdotdebからインストールしたNginxのデフォルトの設定ではNginxはwww-dataで動作する。

sitemap.xml
sitemap.xml.gz
wp-content/wp-cache-config.php
wp-content/advanced-cache.php

最初の2つはGoogle XML Sitemapsプラグイン、残りの2つはWP Super Cacheプラグインにプラグインの設定ページから再生成できるので単にファイルを削除しておけばよい。基本的にアプリケーションが書き込むファイル以外の所有者や権限は変えたくない派。

WordPressを動かすためのNginxの最低限の設定

ようやく本題。

WordPressのためのNginxの設定はNginxのサイトやWordPressのサイトに書いてある。そして微妙に違うw

http://wiki.nginx.org/WordPress
http://codex.wordpress.org/Nginx

これ以外にも検索するといろいろ出てくる。どれも微妙に違うけど別にどれでもさほど問題なかったりもする。でもやはり知らない設定をコピペして使いたくない。とりあえずの最低限の設定は以下。あとはデフォルト。

upstream php {
    server 127.0.0.1:9000;
}

server {
    server_name blog.example.com;
    root /var/www/blog.example.com;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php;
    }
    location ~ /\. {
       deny all;
    }
}

設定の補足。
1. 全部 /index.php に振っとけばindex指定は要らなくね?と思ったが index index.php;がないと管理ページ(/wp-admin/(index.php))にアクセスできなかった罠。
2. Nginxのサイトの設定 “try_files $uri $uri/ /index.php” を使っていたらパラメータが引き継がれないのでパーマリンクをカスタマイズしているときに投稿のプレビューが更新されない問題に遭遇。これはWordPress側の”try_files $uri $uri/ /index.php?$args;”が正解。

safeモードから解放されて、ようやくSuper Cache プラグインの「レガシーなページキャッシング」から「キャッシュファイルの提供に PHP を利用する」に変更できた。

これから調整していきたいこと

さくらVPSに変えただけで快適になったのでまずは満足している。以下は徐々に対応していきたい。

・Nginx/PHP-FPMの設定を調整
・tcp portでアクセスするのがいいのかどうか
・エラーページのカスタマイズ
・適切なphpスクリプトだけを対象にする
・静的ファイルの有効期限の設定
・ログファイルに出力すべきものをフィルタ
・APCを有効にしたらSIGSEGVが起きる原因の調査
・Super Cacheプラグインでキャッシュをrewriteする設定

参考になったもの

書籍は以下の2冊を見ながらやっています。

WordPress 高速化&スマート運用必携ガイド ハイパフォーマンスHTTPサーバ Nginx入門

登録者証とメッセージカード

4/24, 25の2日間、Windows Developer Daysに行って来ました。受付で20-30分待たされたり、ランチセッションで弁当が行き渡らなかったりして多少混乱はありましたが、セッション自体は興味深いもので全体を通してみれば有意義な2日間でした。

今回のテーマはWindows 8、Metroスタイルアプリということで、マイクロソフトも今までのWindowsをぶっ壊して作りなおす気満々です。あれだけ大きな会社これだけの方針変換をするというのはここまで相当な議論が積み上げてきた結果だろうし、あるいはそれだけマイクロソフトも追い詰められているという見方もできます。

イベントにも金がかかっているなぁということからも伝わりましたw。8つながりで八天堂クリームパンをもらったり、ランチエリアでミスタードーナツが配られてたり、イベント料を取られているとは言え至れり尽くせり。個人的には本だけじゃなくWindows 8対応機種などを割引で売ってくれるとなおやる気がでたのですが。

まぁ開発者の立場からすれば高い生産性が整った環境で面白そうなアプリが作れるという場が提供されるというのは歓迎以外なんでもないわけで、じっくり楽しませてもらおうかと思っています。

Evernoteでセッションのメモと、資料をアップしました。
一日目のメモ
二日目のメモ
イベントプログラム(PDF)
Windows 8 Consumer Previewの紹介資料(PDF)

ブログのエントリのヘッダ部分にあるtwitterのアイコンは今までやっつけでつくったものでクリックするとただエントリのURLがtwitterの投稿画面に出るだけだった。最初つくったときはこれで十分だと思っていたが最近のいろんなサイトのtwitterボタンでは「タイトル URL @screename さんから」のような形式で投稿できるものが多く、実際に自分が使ったときにエントリのタイトルが出ないようでは読む人が困るとtweetをためらったので自分のサイトも直さないとイカンと思った。

twitterボタンを配置するには

いろんなサイトが似たようなことをやっているのでおそらく何か仕様があるはずだと調べてみたところ以下のページで発見した。
https://dev.twitter.com/docs/tweet-button

twiterボタンの配置には3つの方法があり、推奨はjavascriptを使う方法だけど、今回は「Build Your Own Tweet Button」の簡単に使える https://twitter.com/share URL.
を使って自分で好きなanchorタグを入れる形をとる。「タイトル URL @screename さんから」をつくるにはshare?url=xxx&text=xxx&via=xxxのようなURLを指定すればよい。クエリーに使えるパラメータは以下のようなものがある。

url ページのURL
via twitterのscreename
text デフォルトテキスト
related 関係のあるアカウント、この人フォローしますかと提案されたりする
count tweet数ボックスの位置
lang tweetボタンの言語
counturl URL to which your shared URL resolves。よくわからん
hashtags ハッシュタグ、カンマで区切れる
size ボタンのサイズ

幾つかはjavascriptでtweet buttonを作るときに使うものなので自前でanchorタグを作る場合は、count、lang、sizeとかは無視してよいと思われる。今回はWordPressでエントリのURLやタイトルを使うために以下のように実装した。

<?php
$title = get_the_title();
$permalink = get_permalink();
$twitter = 'makoto_kw';
?>
<a class="twitter" href="https://twitter.com/share?url=<?php echo urlencode($permalink)?>&text=<?php echo urlencode($title)?>&via=<?php echo $twitter?>" target="_blank" title="tweet">
<img src="twitter.png" width="12" height="12" alt="tweet"/>
</a>

zenbackの機能は便利だけど、エントリ一覧ページでは表示していないので一欄ページから簡単にtweetするための簡易機能としてはこれで十分に思える。

Titanium Mobile 2.0ローンチ記念イベントに行ってきました。


お土産のステッカー

Titanium Mobileでちょっとアプリを作ろうとしたらどうもXcode 4.3とは相性が悪くて2.0を待った方がよさそうだったので、待ち望んだローンチ。

イベントは@masuidriveさんよりTitanium Mobile 2.0の紹介、Titanium Studio 2.0の紹介、FAQ、LTという流れ。

Titanium Mobile 2.0

Titanium Mobile 2.0の大きく変わったというより堅実なアップデートとのこと。アプリ開発者にとって大きな点は、レイアウトシステムの刷新とCloud Serviceのリリース。あとはTitanium WebがRC。

レイアウトシステムの刷新

レイアウトシステムでは今まではwidth/heightをautoに設定したときに、コンポーネントのコンテンツに合わせて最小サイズになるのか、親のコンポーネントいっぱいに表示するかがまちまちだった。今までレイアウトはプラットフォームに任せていたためこのようなことが起きていたが2.0からはTiが全てコントロールするようになった。autoの代わりにTi.UI.SIZE、Ti.UI.FULLを指定することでそのどちらかを指定できる。もちろんautoのままでも動くし、どちらのモードで動くかはドキュメント化されるとのこと。

詳しい説明はTransitioning to the New UI Layout Systemあたりか。

レイアウトでバッチ処理ができるようになった。今まではコンポーネントの複数のプロパティ(topとかleft)を設定すると各々のプロパティを設定した時点で再描画が起こってしまう。2.0からは以下のように描画のタイミングが制御できる。これで描画処理を改善できる、いいことを聞いた。

myView.startLayout();
myView.top = 50;
myView.left = 50;
myView.width = 200;
myView.finishLayout();

以下のようにまとめて設定する技もある。

myView.updateLayout({
  top: 50,
  left: 50,
  width: 200
});

このへんも先のTransitioning to the New UI Layout Systemに書いてあった。

Cloud Service

Appcelerator Cloud Services

これは説明が難しい。Titanium Mobileからも使えるサーバサイドのコンポーネント集という形か。すごい便利そうなものが出てきたという印象。デモではFacebookの認証を簡単にTitanium Mobileで実現していた。ようはありきたりなサーバサイドの実装はこれを使うことで開発者はクライアント(Ti)サイドの実装に専念できる。

ただRESTFul APIをつかって自分で開発したサーバサイドのプログラムと連携したり、JavaやObjective-Cで使えるNative SDKも用意されているそうでもはやTitanium Mobileの領域を超えている。これはこれでちゃんと検証した方がよさそう。

Titanium Web

Android/iOSアプリだけでなくHTML5アプリとしてWebアプリも作れる。恐らくサブセットになってしまうだろうがTitanium Mobileと共通なものも使える。うまくモジュールのテストとして使えるとよいのだが。今のところそれ以外ではあんまり使いそうにはない。jQuery MobileSencha Touchを普通に使った方がよいかな。

そういえばSencha Touch 2.0からNativeアプリにパッケージングができる機能がついたそうなのでそれも試さないとね。

Titanium Studio

痒いところに手がとどくような細かい修正をたくさん、400くらいしたそうです。iOS SDK/Android SDKの認識が向上してセットアップの失敗が少なくなった。なんか今までAndroid SDK 2.1を入れておかないとAndroid SDKを認識しないことがあったような。コード補完の機能改善、ビルドの検証エラーが見つかったらビルドをすぐ停止するようになったり、開発効率をあげることができそう。

LT

@sngmrさん モトクロス選手とかが使う業務アプリっぽいもの
@ryugoo_さん sampleのtodolistめっちゃ警告ができるので消してみた。
@donayamaさん Tiドキュメントサイト紹介
もとはしさん 表計算的な業務用コンポーネント
@daoki2さん xib2js。IBでつくったものをTiに使える形式に変換

xib2jsが便利そうだった。ただ変換するだけじゃなくてiPhone Simulatorで動いているTiアプリに通信して即時チェックできる機能があって至れり尽くせり。

まとめ

ドキュメントが改善されたり、サーバサイドのコンポーネントが提供されたり、本格的に使えそうになってきたTitanium Mobile。2.0から始めるのはちょうどよさそうだ。moduleのドキュメントも正式なものが出てきたということでmoduleを書いたり、Cloud Serviceを調べたり先は長そうだが。最初からNativeで書く場合とTiを使う場合をうまく使い分けられるようになりたい。コア部分はmoduleで書いてプロトタイプ的にTiで作ってあとからNativeに切り替えても大丈夫とかいろいろ武器は増やしておかないとね。

SCE、DTCP-IP対応のネットワークレコーダー「nasne」(ナスネ)を発表
http://plusd.itmedia.co.jp/pcuser/articles/1204/17/news090.html

でAmazonとかで予約できるよと中の人から聞いたので早速予約してみた。
nasne (ナスネ) (CECH-ZNR1J)

最近はApple TVとか、NTT西日本の光BOX+とかテレビにつけるサブシステムという形の商品が増えてきた。この手の商品は価格帯が1万円前後なので買いやすい。液晶テレビも十分に安くなってきているけど、そもそもテレビなんてそう買い換えるものではないから欲しい機能が別のメーカーのテレビにあったときにただ手をこまねいて見ていることしかできない。だからこういう外からのアプローチは正しいんだと思う。

このまま行くとテレビはただ映像を映すだけの商品でも良いのかもしれない。あとどう考えてもレコーダーの価格帯は異常に高いと思う。テレビ・レコーダー業界っていうのはとっと再編したほうがいいんじゃないかと思っていて、家電メーカーがテレビの再建だ、なんとか言っているとそれでいいのだろうかと不安になる。というか結局のところ液晶パネルがApple TVなりGoogle TVなりで採用されればそれで事業的にはいいんでしょ?別にテレビを売りたいわけじゃないんでしょ?ビジネスなんでしょ?って冷めた目でも見ている。

あと、これソニー・コンピュータエンタテインメントからの商品なんだけど、もうソニーとか、ソニー・コンピュータエンタテインメントとかどっちでもいいよね。別に誰がホームラン売ってもいいし、香川が中心でも本田が中心でもいいのよね。Appleだって結局iPhoneがMacOSXを救うような形になったわけじゃん。世の中何が主導権をとるのかなんてわからないんだから、形式にとらわれずやりたいことをやるのが一番だと思うよ。

TweetでmsysGitがUTF8対応されたという話を聞いてWindowsマシンのmsysgitを置き換え。
UTF-8 対応の msysGit 1.7.10 リリース! いよいよ Windows で git できるよ!!!

今まではUTF8で使えるように幾つかのバイナリにパッチを当てていたが、今回でそれが不要になる。ところでmsysgitって展開しているだけでインストーラーではないのだろうか?普通に古いバージョンを削除して新しいものを入れなおした。

同じ場所にインストールしたが古いショートカットで起動しなかったので、デスクトップにショートカットをつくりなおし。

/share/msysGit/add-shortcut.tcl Desktop

git logなどのコマンドで日本語が普通に表示されるようになった。日本語ファイルを使う場合にはまだ注意があるらしい。自分の場合はその他のSCMでも問題がおきるので絶対に日本語ファイルは使わない。将来gitから別のSCMに置き換える場合もあるし、よってこの問題は放置。それ以外だと先のブログにもあるようにコマンドラインでの日本語IMEからの入力がうまくいかない。そこで今まで同様にコメント入力用の外部エディタを設定する。

秀丸を使う場合

git config --global core.editor "'C:\Program Files (x86)\hidemaru\hidemaru.exe' //f70" 

TeraPadを使う場合

git config --global core.editor "'C:\Program Files (x86)\TeraPad\TeraPad.exe' //cu8 //el"

日本語向けのエディタはデフォルトでShift-JISモードで起動することが多いのでそれぞれに指定しているのはUTF8モードで起動する引数のオプション。(ちなみにglobalなgitの構成ファイルは$HOME/.gitconfigにあるのでmsysgitの再インストールで設定をし直す必要はない)

ちなみに最近知ったんだけどMac向けのGithubアプリが便利。http://mac.github.com/ 自分のgithubアカウントのリポジトリを簡単にcloneしたり、githubとは関係ないローカルのgitリポジトリの履歴が見れたりする。

魔法のお片づけでもう電子書籍の自炊はやりたくないと思ったが、慣れてしまえば定期的な自炊はこなせている。
考えるべきなのは何百冊もある書籍をいっきに自炊するとき。これは間違いなく業者に頼んだ方がいいだろう。金銭面を考慮して時間を欠けてもいいという勇気があれば自炊にチャレンジしてもいいかもしれない。
ただ定期的な自炊という意味ではそれほど苦ではないということがわかってきた。

今は定期的な自炊の扱いとして新しく本を買ったときに本棚に埋まるだけの量の本を残してあふれた分を自炊するという形をとっていて、これは「魔法のお片づけ」で必要なものを残したときの量が適切な量らしいということを読んでそういう風にしている。

人生がときめく片づけの魔法

実際のところ自炊をしているとは言え、電子書籍にして読むというケースは少ない。購入した本はまず本として読んで内容が一過性のものだと思ったら自炊行き、そうでないものは本棚に残したいかどうかを考えて入れ替えを行う。この方式だとあまり読みなおすことのない本が自炊行きになる。内容的に必要なものがあっても局所的だったりして全章本として残したいと思える書籍との出会いはそう多くない。

これを守るとまぁ1週間、1ヶ月に5,6冊を自炊することになる。これは作業時間的に1,2時間くらい掛かるのだが、サッカー、F1、映画などの番組を見ながら作業するとちょうど良いことがわかった。自炊作業で注意が必要なところってスキャナへの給紙くらいだったりする。たまに試合に夢中になって入れ忘れてあとでPDFを結合しないといけないことになるがそれもリカバー可能だし、それ以外の作業もだいたいはながらで作業できる。一週間に5冊以上も購入する人はそれほどいないと思うのでこれくらいのペースであれば週末ちょっとながらで作業すればいいだけなのでまぁ続けていけるのではなかろうか。