駒形電産

Mr.Tブログを復活させるべくWordPress2.8.6を実家サーバーに入れてみる。

インストール

$ sudo apt-get install libapache2-mod-php5 php5-mysql
$ mysqladmin -uroot -p create mrt
$ mysql -uroot -p -e "grant all on mrt.* to mrt@localhost identified by 'unk';"

$ wget http://ja.wordpress.org/wordpress-2.8.6-ja.zip
$ unzip wordpress-2.8.6-ja.zip
$ mv wordpress mrt
$ cd mrt
$ cp wp-config-sample.php wp-config.php
$ sudo chown deployer:www-data wp-content
$ chmod g+w wp-content
Mr.T

できた。

Mr.T

コンピュータシステムの現場というのは実に色々あって、エンジニアの飲み会なんかでは"弊社の酷い環境"なんて話題がよく酒の肴になります。

  • 前任者のスパゲッティコード
  • テストが無く、デグレしまくるコード
  • バージョン管理されていないコード
  • バックアップされていないデータ
  • sshでログインできないレンタルサーバ
  • 穴だらけのセキュリティ
  • 実際の仕様とは乖離して久しいドキュメントの更新作業
  • プロプライエタリなOS
  • 古くさい言語
  • 貧弱な処理系

web上や技術雑誌、書籍にある様な最新でスマートな技術、歴史があり学術的裏付けもしっかりした環境。勉強熱心でそうした情報に詳しいエンジニア程、理想と現実の乖離にストレスを感じることでしょう。

こんな泥臭い環境では俺/私の洗練された

「Mavenを使った統一されたプロジェクト管理とビルドプロセス」

とか

「言語内DSLを使ったスマートなメタプログラミング」

が生かせない。ここは自分の働く場所ではない。

しかし、そんな理想的な環境は滅多にありません。

「とんでもない貧民街に生まれついてしまった。」と嘆いたところで、実際"地上の大半は砂漠で、地表の7割は海である。"みたいなのが現実だったりしないでしょうか?

しかし、むしろそんな環境こそ、プログラミングやオープンソースの力を使って劇的に環境を改善できる腕の見せ所であり、とっても楽しい作業なのかもしれません。

そんな時に頭に思い浮かべるのが、レガシー改善の鉄則、

「1回のBestよりBetterの積み重ね」

「つまらない・面倒な仕事は技術的問題にすり替えると楽しい」

という二つの言葉です。

地道な改善

web系ベンチャーに絞って言うととりあえず、

  • バックアップされてない
  • バージョン管理されてない
  • テストされてない

というところに入って行って何とかしなければいけないという場面が多い気がします。優先順位から考えるとバージョン管理システムの種類とかプログラム言語の種類は変更の手間の割に重要で無く、兎に角、何人月・何人年も書けてきたコードやデータの消失や不具合に起因する障害が一番の問題だと思います。

rsyncを使ったバックアップ

幸運にもsshアクセスが可能なレンタルサーバーでサイトが稼働している場合はrsyncを使ったバックアップがとても手軽です。下記の様なスクリプトを用意し、cronで1日1回バックアップを取ります。(鍵を登録して置いて)

backup.sh:

#!/bin/sh

if [ ! $1 ] || [ ! $2 ]
then
echo "Usage: backup.sh REMOTE_DIR BACKUP_DIR"
echo "Example: backup.sh foo@example.com:/home/foo/public_html /var/backups"
exit 1
fi

REMOTE_DIR=$1
BACKUP_DIR=$2
TODAY=`/bin/date '+%Y%m%d'`
YESTERDAY=`/bin/date --date='1 day ago' '+%Y%m%d'`

[ -f $BACKUP_DIR/$YESTERDAY ] || mkdir -p $BACKUP_DIR/$YESTERDAY
[ -f $BACKUP_DIR/$TODAY ] || mkdir -p $BACKUP_DIR/$TODAY
cd $BACKUP_DIR/$TODAY && rsync -atrzv --delete --link-dest=../$YESTERDAY $REMOTE_DIR .

UNIXイズムの継承者から言わせれば、「GNUのやり方に汚染された節操のないオプション」という感じかもしれませんが、最近のrsyncにはPlan9のdumpfsみたいなハードリンクを使った差分バックアップができるオプションがあるそうです。(via g:id:g000001)

$ rsync --link-dest=ハードリンク元 コピー元 コピー先

という様に指定するとリモートのディレクトリをハードリンク元を参照しながら差分だけバックアップしていくことができます。(変更の無いファイルはハードリンクが作成される。)

さくらインターネットの500円プランを使っているfjord.jpの例で行くと下記の様な感じになります。

0 5 * * * /usr/local/bin/backup.sh fjord@fjord.jp:/home/fjord/www /var/backups/fjord.jp

このオプションの実装は結構最近の事らしいのでベテランのrsyncユーザーは逆に意外と知らないかもしれません。

ftpしかアクセス方法が無い環境では、lftpで一度ローカルに持ってきてから同じ事をすれば大丈夫だと思います。(lftpにはftpプロトコルでrsyncのようにディレクトリを簡単にmirrorするコマンドがあります。)

fjord,llcではベンチャー勝ち組セットのサーバーにバックアップして、sambaでリードオンリーでLAN内に公開しています。これならデザイナーさんでも使い易いと思います。

XREAのsshアクセス

XREAは無料or格安でWordPressが使えるレンタルサーバーとしてホビーユースやデザイナーの方にも人気のあるレンタルサーバーです。ここ最近のXREAは有料ユーザーを含めて、障害に対する対応や安定性にかなり問題があるので仕事で使うなら別のレンタルサーバーへの引っ越しをおすすめしますが、「そんなことが出来る立場なら苦労しねぇんだよ!」という方も多いと思いますのでXREAでのバックアップ方法を。

XREAではsshアクセスするのに"30日に1度、管理画面からリモートアドレスを登録する必要がある"という面倒な制限があります。Mechanizeを使うのもどうにも面倒です。この管理画面の登録フォームは非sslな上にGETメソッドを許容するのでwget等でアクセスするだけで事足りてしまいます。(via g:id:g000001)

(リンクを辿っていく通常の管理画面は非sslだけど、ssl経由でもアクセスできる。)

0 5 1 * 1 wget "http://www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null
0 5 1 * 1 wget "https://ss2.xrea.com/www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null

上記の様な感じで念のため週に1回アクセスする様にすればあとはさくらと同じ様にバックアップできます。

データベースのバックアップ

DBはほとんどの環境でmysqldumpが使えるので普通にバックアップできます。そうでないところはphpMyAdmin等のwebインターフェースがあるのでそこからのバックアップを自動化します。

水面下で進める

これらの作業は職場で発言権が無い時はメインの業務をこなしつつ同時に水面下で進める必要があります。(それまで基本的なことを行ってこなかった職場でその作業の必要性を説くのは非常に困難です。データ消失などの事件があったときに颯爽とリカバリーして見せた後なら簡単に有効性を理解してもらえるでしょう。)

メイン業務の合間にやるので最小限の手間で最大限の効果を得る必要があります。そこがパズル的でもあり、面白いところだと思い込んでやると楽しいと思います。

関連

参照

kawaduに言われてNAS上に固めてあったplnet.jpのソースを引っ張り出してきてgithubにアップした。

昔のソースは恥ずかしいけど、当時の俺のPHP4愛が注がれたコードを読んでみた。

何か、コードのテンションが全然違くて、兎に角書く!という感じ。

最近の俺は、ちょうどいいライブラリが無いだの、良い設計が思い浮かばないから実装しないだの、日和ってるなと。

「ライブラリが無いなら書けばいいじゃない。パンが無いなら(略」

「書くの?書かないの?書かないとしたら何時書くの?」

と当時の自分に劇詰めされてる気分になった。コーディング瞬発力が落ちてる。

元々俺は、ある種のトラウマから独自実装を病的に嫌う傾向があるんですが、それと怠惰が合わさり最強に見える。暗黒が持つと頭がおかしくなって死ぬ。

もっとガリガリガリガリ書くようにしよう!

参照:

認証局の鍵を作成。

$ sudo openssl genrsa -out ca.key 1024

認証局の証明書を作成。

$ sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Masaki KOMAGATA
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Masaki KOMAGATA
Email Address []:komagata@gmail.com

認証局が発行する証明書のシリアルナンバーを作成。

$ echo 01 > ca-cert.srl

認証局を使って証明書を発行。

$ sudo openssl x509 -CA ca.crt -CAkey ca.key -CAserial ca-cert.srl -req -days 3650 -in server.csr -out server.crt

関連:もう二度とハマらない、SSL証明書の設定 - p0t

参照:MacOSXでサーバー稼業 : Web共有をhttps接続できるようにしよう-Leopard編-

WordPressにはContact Form 7というお問い合わせフォームが簡単に出来るプラグインがあるそうです。

しかし、さくらインターネットのスタンダードプランの様な共有SSLを使っている場合はformのactionが別のURLを指す必要があるので動きません。PHPでベタにお問い合わせフォームの作成を依頼されたんですが、面倒なのでContact Form 7を修正してWordPress本体とは別のURLで動くようにしました。

% diff wp-content/plugins/contact-form-7/settings.php{,.org}
115c115
<       return (string) 'https://secure1111.sakura.ne.jp/example.com'.$wpcf7_request_uri;
---
>       return (string) $wpcf7_request_uri;

多分、WebサーバーがURLを書き換えているので環境変数から現在のREQUEST_URIが取れない。仕方なくベタにURLを書きました。javascriptでfromのactionを書き換えれば汎用的になりそうですがそれはキモイのでこれでいいや。

参照:Contact Form 7: WordPress のお問い合わせフォームプラグイン。シンプル、でも柔軟。

HTMLのインデントを合わせたい。

単純なテンプレートでは、partialテンプレートみたいなのを読み込むときにそのときの周りのインデントに合わせなければいけないので無理。

hamlを使えば解決だけど、デザイナーにhamlはひどいので無理。

renderやyieldをラップしてインデント幅を渡すようにしてみたけどキモイ。

HTMLとさほど書き方が変わらずにインデントを合わせる方法は無いかな?

foo.php:

<?= include "partial.php" ?>

bar.php:

<ul>
  <li>
    <?= include "partial.php" ?>
  </li>
</ul>

partial.php:

Hello!

これが・・・

http://localhost/foo.php:

Hello!

http://localhost/bar.php:

<ul>
  <li>
Hello!
  </li>
</ul>

こうなるのが嫌。

※おかげさまで、素敵な方に来て頂けることになったのでエンジニアの募集は終了しました。(デザイナーは激しく募集中!)

※給料の割に敷居が高いと指摘を頂いたので加筆修正しました。

僕が働いているアクトインディ株式会社でエンジニアとデザイナーの募集を始めました。(デザイナーに関してはデザイナーのmachidaさんが募集要項を書いてくれると思いますが、僕のところへ連絡をいただいても大丈夫です。)

大学院を半年休学してアルバイトとして参加してくれたShu MASUDAさんの残された時間が後1ヶ月ちょっとなので、早めに募集を開始しました。

社員かアルバイトの方を募集しています。

(LinuxやWeb開発を覚えたい学生の方も歓迎です)

  • 仕事でやること
    • 自社Webサービス開発
      • Ruby/Rails(ほとんどコレ)
      • PHP
      • CommonLisp
      • Scheme(サーバー管理系で一部)
    • サーバー構築
      • CentOS
      • Debian
    • 社内システム管理
  • 募集条件
    • 3ヶ月以上、週3日以上働ける方(アルバイト)
    • 五反田のオフィスに通勤可能な方
    • PC持込推奨(さもないと会社に転がってるThinkPad X32に・・・)
    • OS自由
    • 服装自由
    • ガチ鬱可(治療を受けていれば可)
    • 18歳以上の方
    • 何らかのプログラミング経験(実務/趣味問わず)
  • 待遇
    • 時給1000円以上(社員の方は別。最長6ヶ月間の試用期間があります)
  • 応募方法
    • komagata@gmail.com か recruit@actindi.net までメールをください。また下記の物も送っていただけるとありがたいです。
      • 履歴書(プレーンテキストでかまいません)
      • ブログのURL
      • 何らかの動くプログラムのソースコード(Webアプリ、バッチファイル、ユーティリティープログラムなんでもOK)

ブログやプログラムのソースコードを見せていただきたいというのは、「仕事外で趣味のコードを書くのが楽しい」という人なのかどうかを知りたいということだけです。凄いコードをかかなくちゃ駄目とかそういうのではないです。

「RailsやLinuxを覚えたい」という方や「Railsを駆逐してSmalltalkの素晴らしさを啓蒙したい」という野望をお持ちの方などをお待ちしています。

本当のところ、「プログラミングが好き」であり「僕たちと楽しく仕事ができる」方であれば大歓迎です。

今回からRailsなどのWebアプリやLinuxの経験が無い方向けに1ヶ月の研修期間を用意しています。

おすすめポイント

  • Rails等のWebアプリ開発、Linuxが覚えられる。
  • 自由な社風(ゆるふわガチ鬱ワープアニート)
  • 手段としての技術的な細部は自由。 (僕がかかわるまでRubyのコードは1行も社内に存在しませんでした。単に僕にとって手っ取り早い技術だったのでRailsのアプリケーションが増えました。1人が1サイトを担当することも多く、目的が達成されるのであればどんな技術を使ってもかまいません。他のメンバーがそれに合わせて勉強します。実際にシステム部のブログはCommonLispで構築されている。)
  • Redmine、Subversionなどのオープンソースを積極的に活用しているため、汎用性の高い開発手法が習得できる。
  • マネタイズやSEO、Web集客、営業など、Webサービスが勉強ができる。 (営業は営業の人がいますが)
  • PHPをやりたくない人でもOK。 (社内でPHPはオッサン=俺の仕事ということになっています。個人的にPHP書ける人大歓迎・・・。)
  • 週1リリースしているRailsプロジェクトが4個あるので嫌って程Rails書けます・・・。
  • 会社の隣に立正大学があるので何食わぬ顔して安い学食が食える。

エンジニア/デザイナーブログも作ったのでこちらから電波も発信して行きたいと思います。

なお、例によって決まった方には“横山光輝 史記 第七巻”と“勇午 洞爺湖サミット編 第二巻”をお贈りします。

参照:アクトインディ技術部隊報告書

@を強制的に使えなくするPECLモジュールがあるみたいです。

PECL::Package::scream

Description Allows you to disable the silence operator (@) to get all error messages

不幸な事故は減りそうです。

こちら(PHP プログラマが @ を使うべきでない 5 つの理由 – 肉とご飯と甘いもの @ sotarok)発、下記の記事、

PHPでエラー抑制演算子@を正当に使ってるなぁと思ったケース – それ図解で。・・・tohokuaikiのチラシの裏

includeって、正当に読み込んだかどうかの結果を返してるんですよね。

これ知らなかったです。

既にこちら(includeの返り値について – 受難系 – sideport)で触れられていますが、includeは先のファイルのreturnを引数に受けるので要注意ですね。

参照:includeは返り値を取る – p0t

マニュアルにもちゃんと書いてあります。

PHP: include – Manual

例5 include()とreturn()文

return.php
<?php
$var = 'PHP';
return $var;
?>

noreturn.php

<?php
$var = 'PHP';
?>

testreturns.php

<?php
$foo = include 'return.php';
echo $foo; // 'PHP'と出力されます
$bar = include 'noreturn.php';
echo $bar; // 1が出力されます
?>

perlのpackageも慣習的に最終行にreturnすら略して、

1;

と書きますよね。(最近は違うのかな?)

それを裏切って、以前の僕のエントリーの様にincludeのreturnの積極的な利用と@のエラー抑制とphpの複雑な型比較を組み合わせると、混沌とカオスが両方そなわり最強に見える。暗黒が持つと逆に頭がおかしくなって死ぬ。

そういうところを乗りこなそうと四苦八苦するのも好きです。

デフォルトでapache2のvariantが入るらしい。

sudo port install php4 +mysql5 +postgresql8
--->  Activating php4 @4.4.9_6+apache2+macosx+mysql5+postgresql8
To customize php, copy
/opt/local/etc/php4/php.ini-dist (if this is a development server) or
/opt/local/etc/php4/php.ini-recommended (if this is a production server) to
/opt/local/etc/php4/php.ini and then make changes.

If this is your first install, you need to activate PHP in your web server.

To enable PHP in Apache, run
  cd /opt/local/apache2/modules
  /opt/local/apache2/bin/apxs -a -e -n "php4" libphp4.so
* copy  /opt/local/etc/php4/pear.conf.sample to  /opt/local/etc/php4/pear.conf
--->  Cleaning php4

sudo cp /opt/local/etc/php4/php.ini{-recommended,}
cd /opt/local/apache2/modules
/opt/local/apache2/bin/apxs -a -e -n "php4" mod_php4.so
sudo vi /opt/local/apache2/conf/httpd.conf
LoadModule php4_module modules/mod_php4.so

懇切丁寧に教えてくれるので助かる。助かるが、これもやっといてくれないかな・・・。