Phonegapで一瞬ハマったこと

Windowsマシン上で、PhonegapのAndroidプロジェクトを作成するコマンドを実行すると、以下のようなエラーが出ることがある。

原因は、プロジェクトのディレクトリ("HelloPhonegap")を"Program Files (x86)"ディレクトリの下に作ろうとしたため。
Windows7UAC (User Acount Control) のせいでプロジェクトディレクトリを作成することができず、
エラーを吐いていた。

対策は、単純にProgram Files (x86)ディレクトリ(および、Program Filesディレクトリ)以外のパスにプロジェクトディレクトリを作成すればよい。

PHPのLOCK_NBの挙動について

flock関数の第2引数に使用できるフラグに、"LOCK_NB"というものがある。

flock($fp, LOCK_EX | LOCK_NB);

のように、他のフラグのビットマスクとして使うことができる。
PHP.netによると、このフラグの意味は

It is also possible to add LOCK_NB as a bitmask to one of the above operations if you don't want flock() to block while locking. (not supported on Windows)

とあり、私の英語力だと

  • 1つ目のプロセス⇒LOCK_NBを使用してflock、2つ目のプロセス⇒直ちに失敗

なのか、

  • 1つ目のプロセス⇒LOCK_NBを【使用せず】flock、2つ目のプロセス⇒LOCK_NBを使用してflockを試みると、直ちに失敗

なのかがよく分からなかった。

なので、以下のようなスクリプトを作成して試してみた。

lock.php

$fp = fopen("lock.txt", "r");
var_dump($fp);
$result = flock($fp, LOCK_EX);
var_dump($result);
if ($result) {
sleep(10);
}
var_dump(flock($fp, LOCK_UN));
var_dump(fclose($fp));

lock_NB.php

$fp = fopen("lock.txt", "r");
var_dump($fp);
$result = flock($fp, LOCK_EX | LOCK_NB);
var_dump($result);
if ($result) {
sleep(10);
}
var_dump(flock($fp, LOCK_UN));
var_dump(fclose($fp));

で、結果どうなったかというと、

  • lock.php ⇒ lock_NB.php の順だと、直ちに失敗する。
  • lock_NB.php ⇒ lock.php の順だと、ロックが解除されるまで待つ

という動作になった。
つまり、LOCK_NBは、
「ファイルのロックに失敗した場合、【自分自身を】直ちに失敗させるフラグということになる」

JenkinsでJAVA_HOMEとANT_HOMEの設定にハマった件

Antを自動インストールでなく、自分でインストールしたものを指定してジョブを実行したが、以下のようなエラーが出てハマった。

FATAL: Cannot find executable from the chosen Ant installation "Ant"

さんざん悩んだ挙句、"Jenkinsの設定"⇒"インストール済みAnt"の"ANT_HOME"に、Antのインストールパスを設定してやらまければならないことに気付いた。

ちなみに、ここに環境変数"$ANT_HOME"と書いても
ディレクトリではありません」
と、怒られて終わるorz

ちなみに、JAVA_HOMEも同様に設定してやらなければ、以下のように怒られる。

Error: JAVA_HOME is not defined correctly.

Apacheの後ろでTomcatを動かして、さらにその後ろでJenkinsを動かす手順

前提:Tomcat、Jenkinsはすでにインストール済み。

  1. Tomcatの後ろにJenkinsを配置する。

$CATALINA_HOME/webapps/ の下にjenkins.warを"ROOT.war"という名前で配置するだけ。

http://{サーバーのURI}:8080でJenkinsのダッシュボードが見えれば、成功。
超簡単。

  1. Apacheをインストールする。

最新のソースを取得して.configure。
apr-utilがない」と、怒られる。

まずは以下の手順でaprapr-utilをインストールする。

wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//apr/apr-1.4.6.tar.gz
tar zxvf apr-1.4.6.tar.gz
cd apr-1.4.6
./configure
make
make install

wget http://ftp.riken.jp/net/apache//apr/apr-util-1.5.1.tar.gz
tar zxvf apr-util-1.5.1.tar.gz
cd apr-util-1.5.1
./configure --with-apr=/usr/local/apr/ ※aprにパスを通していないため。
make
make install

改めてapacheの.configureを実行するが、今度は
「pcreがない」
と怒られる。

なのでpcreをインストールする。

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.32.tar.gz
tar zxvf pcre-8.32.tar.gz
cd pcre-8.32
./configure --disable-cpp ※このスイッチをつけないと、「C++コンパイラがない」と怒られるため
make
make install

ようやくApacheをインストール。
ちょっと順番が前後したが、最初から手順を示すと以下のようになる。

wget http://ftp.kddilabs.jp/infosystems/apache//httpd/httpd-2.4.3.tar.gz
tar zxvf httpd-2.4.3.tar.gz
cd httpd-2.4.3
./configure
make
make install

  1. Apacheの起動・停止スクリプトを配置する。

ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache

起動・停止の確認

service apache start
service apache stop

  1. ApacheTomcatを連携させる

Tomcat側の設定

Tomcatに直接アクセスできないよう、HTTPプロトコルによるアクセスを禁止する。
以下の設定を、コメントアウトしてしまう。

$CATALINA_HOME/conf/server.xml

今回はAJPプロトコルApacheと連携するため、8009番ポートがAJPプロトコル用にあけられていることを確認する。

$CATALINA_HOME/conf/server.xml

Apache側の設定

以下のモジュールを読み込むよう、httpd.confを編集する。

/usr/local/apache2/conf/httpd.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

続けて、Tomcatへのプロキシ設定ファイルをロードする。

/usr/local/apache2/conf/httpd.conf


Include conf/extra/httpd-proxy.conf

httpd-proxy.confの内容は、以下のようになる。
今回はVertual Hostを使わないため、Location設定のみとなる。

/usr/local/apache2/conf/extra/httpd-proxy.conf


ProxyPass ajp://localhost:8009/

Apacheを再起動し、http://{サーバのURI}/でJenkinsのダッシュボードが見えれば、設定成功。

CentOSにTomcatをインストールする

  1. Tomcatユーザーを作成しておく

groupadd tomcat
useradd -g tomcat tomcat

  1. バイナリをダウンロードして解凍し、適当なディレクトリに配置する。

wget http://ftp.tsukuba.wide.ad.jp/software/apache/tomcat/tomcat-7/v7.0.37/bin/apache-tomcat-7.0.37.tar.gz
tar zxvf apache-tomcat-7.0.37.tar.gz
mv apache-tomcat-7.0.37 /usr/local/

  1. 念のため、環境変数の向き先をシンボリックリンクにしておく

cd /usr/local/
ln -s jdk1.6.0_41 java
ln -s apache-tomcat-7.0.37 tomcat

/etc/profileの内容は、以下のようにしておく。

JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/tomcat

  1. 起動・停止スクリプトの先頭に、以下の環境変数を定義する。

startup.sh/shutdown.sh

JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME

参考サイトには
「/etc/profileに書く人も多いが、」
とあったが、なぜか、ここに書いてあるだけではうまく動かなかった。

  1. 起動スクリプトを配置する。

/etc/init.d/tomcat

#!/bin/bash
#
# Startup script for the Tomcat Servlet Container
#
# chkconfig: 2345 35 65
# description: Tomcat is the servlet container that is used in the official \
# Reference Implementation for the Java Servlet and JavaServer \
# Pages technologies

TOMCAT_USER=tomcat
CATALINA_HOME=/usr/local/tomcat

. /etc/rc.d/init.d/functions
prog=tomcat

start() {
echo -n $"Starting $prog: "
daemon --user $TOMCAT_USER $CATALINA_HOME/bin/startup.sh > /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
echo_success
else
echo_failure
fi
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
daemon --user $TOMCAT_USER $CATALINA_HOME/bin/shutdown.sh > /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
echo_success
else
echo_failure
fi
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
INSTANCES=`ps --columns 512 -aef|grep java|grep tomcat|grep org.apache.catalina.startup.Bootstrap|wc -l`
if [ $INSTANCES -eq 0 ]; then
echo $prog is stopped
RETVAL=3
else
if [ $INSTANCES -eq 1 ]; then
echo $prog is running 1 instance...
else
echo $prog is running $INSTANCES instances...
fi
RETVAL=0
fi
;;
*)
echo $"Usage: $prog {start|stop|restart|status|help}"
exit 1
esac

exit $RETVAL

chmod +x /etc/init.d/tomcat

自動起動はさせたくないので、chkconfigには追加しない。

  1. 動作確認

うまく起動・停止してくれれば成功

/etc/init.d/tomcat start
/etc/init.d/tomcat stop