Phonegapで一瞬ハマったこと
Windowsマシン上で、PhonegapのAndroidプロジェクトを作成するコマンドを実行すると、以下のようなエラーが出ることがある。
原因は、プロジェクトのディレクトリ("HelloPhonegap")を"Program Files (x86)"ディレクトリの下に作ろうとしたため。
Windows7のUAC (User Acount Control) のせいでプロジェクトディレクトリを作成することができず、
エラーを吐いていた。
対策は、単純にProgram Files (x86)ディレクトリ(および、Program Filesディレクトリ)以外のパスにプロジェクトディレクトリを作成すればよい。
ローカルリポジトリ作るたびに設定するのが面倒なので、、
git config --global http.postBuffer 524288000
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つ目のプロセス⇒直ちに失敗
なのか、
なのかがよく分からなかった。
なので、以下のようなスクリプトを作成して試してみた。
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_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はすでにインストール済み。
- Tomcatの後ろにJenkinsを配置する。
$CATALINA_HOME/webapps/ の下にjenkins.warを"ROOT.war"という名前で配置するだけ。
http://{サーバーのURI}:8080でJenkinsのダッシュボードが見えれば、成功。
超簡単。
- Apacheをインストールする。
最新のソースを取得して.configure。
「apr-utilがない」と、怒られる。
まずは以下の手順でaprとapr-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 installwget 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
ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
起動・停止の確認
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
CentOSにTomcatをインストールする
- Tomcatユーザーを作成しておく
- バイナリをダウンロードして解凍し、適当なディレクトリに配置する。
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/
cd /usr/local/
ln -s jdk1.6.0_41 java
ln -s apache-tomcat-7.0.37 tomcat
/etc/profileの内容は、以下のようにしておく。
startup.sh/shutdown.sh
JAVA_HOME=/usr/local/java
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
参考サイトには
「/etc/profileに書く人も多いが、」
とあったが、なぜか、ここに書いてあるだけではうまく動かなかった。
- 起動スクリプトを配置する。
/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 technologiesTOMCAT_USER=tomcat
CATALINA_HOME=/usr/local/tomcat. /etc/rc.d/init.d/functions
prog=tomcatstart() {
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
esacexit $RETVAL
chmod +x /etc/init.d/tomcat
自動起動はさせたくないので、chkconfigには追加しない。
- 動作確認
うまく起動・停止してくれれば成功