2011年12月30日金曜日

KyotoTycoon「memcachedプロトコルでメッセージキュー」を試す



最近低GIダイエットのブログを中心に書いている気がしますが、年末ということで少し時間ができたので前々から導入しようと思っていたKyotoTycoonのメッセージキューを試すことにしました。メッセージキューによる非同期処理といえば、Q4MとかActiveMQをよく使っていていますが、これもKyotoTycoonでいいんじゃない?と思うこの頃です。
何よりmemcachedプロトコルで動作するのがとても助かりますよね。

今回の内容はこちらです。


  • ktserver起動ファイル(マスター)

  • ktserver起動ファイル(スレーブ)

  • ジョブの登録(PHP)

  • ジョブの取得と削除(PHP)

  • ベンチマークの結果

  • テスト中に気になったこと

  • kctのデフラグ

  • Net_KyotoTycoonでキューの件数を取得する(PHP)




参考 memcachedプロトコルでメッセージキューを実現する
http://fallabs.com/blog-ja/promenade.cgi?id=133


テスト環境は、以前試したこちらですが、yum updateしてCentOS 6.2になりました。

ktserver起動ファイル(マスター)


まずは、damontoolsでktserverを起動します。
起動オプションですが、メッセージキューで動作させるには、「必ずツリー系のデータベース(GrassDB、TreeDB、ForestDB)のいずれかを指定してサーバを起動する必要がある」そうです。なので、オススメ通りTreeDBで。
thオプションは1でもよいそうですが、冗長構成のためレプリケーションの使用を前提に4にしました。


#!/bin/sh

PATH=/usr/local/bin:/usr/bin:/bin
PATH=$PATH:/usr/local/kyototycoon/bin
export PATH

exec env - PATH=$PATH \
ktserver \
-host 127.0.0.1 \
-port 10001 \
-th 4 \
-log /path/to/log/queue_master.log \
-ls \
-ulog /path/to/log/ulog_queue_master \
-ulim 256M \
-sid 1 \
-plsv /usr/local/kyototycoon/libexec/ktplugservmemc.so \
-plex 'port=11311#opts=fq' \
'/path/to/db/queue_master.kct#ktopts=p' 2>&1



ktserver起動ファイル(スレーブ)




#!/bin/sh

PATH=/usr/local/bin:/usr/bin:/bin
PATH=$PATH:/usr/local/kyototycoon/bin
export PATH

exec env - PATH=$PATH \
ktserver \
-host 127.0.0.1 \
-port 10002 \
-log /path/to/log/queue_slave.log \
-ls \
-ulog /path/to/log/ulog_queue_slave \
-ulim 256M \
-sid 2 \
-th 4 \
-mhost 127.0.0.1 \
-mport 10001 \
-rts /path/to/log/rts.log \
-plsv /usr/local/kyototycoon/libexec/ktplugservmemc.so \
-plex 'port=11312#opts=fq' \
'/path/to/db/queue_slave.kct#ktopts=p' 2>&1



ジョブの登録


このような非同期処理は、そもそもキューが溜まらないように処理していくはずなのですが、
性能評価なのである程度の件数(100万件×3の300万件)の平均値で計測します。

<?php

$data = array(
'name' => 'testname',
'testdata' =>
array(1,2,3,4,5,6,7,8,9,0,'abcdefghijklmnopqrstuvwxyz',
'userid' => 'testuserid',
'entry' => '2011-10-20 12:00:00'
)
);
$mem = new Memcached();
$mem->addServer('127.0.0.1', 11311);

$time_start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$mem->set('testkey', $data);
}
$time_end = microtime(true);
echo ($time_end - $time_start) . "\n";



ジョブの取得と削除


ジョブは取得してその情報を元した処理が成功した後に削除することが想定されるため、1件ずつgetとdeleteを繰り返して計測します。

<?php

$key = 'testkey';
$m = new Memcached();
$m->addServer('127.0.0.1', 11311);

$cnt = 0;
$time_start = microtime(true);
for ($i = 0; $i < 1000000; $i++)
{
$val = $m->get($key);
if ($val)
{
$res = $m->delete($key);
if ($res)
{
$cnt++;
}
}
}
$time_end = microtime(true);
echo ($time_end - $time_start) . "\n";
echo $cnt . "\n";



バッチ処理によるベンチマークの結果









method性能(qps)
ジョブの登録(set)13806
ジョブの取得と削除(get & delete)6956

速度的にも申し分無く、ktserverの使用物理メモリーサイズも162mと少なく、kctファイルサイズ(300万件)も774Mでした。
また、setが高速なのは非同期処理に向いていると思います。
ちなみにkctのオプションに「#bnum=6000000#msiz=2g#pccap=2g」を追加して試してみたところget, deleteが10%ほど速くなりましたが、そもそも用途として1回のみの「登録」、「取得」、「削除」が想定されるので、富豪的にしてもあまり意味ないですね。

テスト中に気になったこと




  • データ削除してもkctファイルサイズが小さくならない。むしろ813Mと少し大きくなった。

  • kcやktの管理コマンドでキューのリアルタイムの件数が取得できない。-onl付けても無理。

これらは次の方法でなんとかなりそうです。

kctのデフラグ


デフラグするには、ktserverを停止してからkyotocabinetのkctreemgrコマンドを実行します。


kctreemgr defrag /path/to/queue_master.kct


今回の環境では、800MB程度ならおそらく2秒くらいで完了します。
デフラグは、そんなに肥大化しないと思うのとパフォーマンスには影響がなさそうなので、わざわざ止めてまでやる必要ないかもしれません。また、どうしてもやりたい場合も、スレーブ側を止めて切り替えるとかいろいろ手はあると思います。

Net_KyotoTycoonでキューの件数を取得する


あとkctreemgr、kttimedmgr 、ktremotemgrなどでキューの件数を取得してみましたが、ktserverを停止しないと正しい値(count)は取れなかったためNet_KyotoTycoonで取得することにしました。スレーブ側なら停止して取得してもよいかもしれませんが、APIで取得できるのでそこまでしなくてもいいですね。



  • 必要なモジュールのインストール

pear channel-discover openpear.org
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
pear install HTTP_Request2
pear install openpear/Net_KyotoTycoon-beta


<?php

require_once 'Net/KyotoTycoon.php';
$kt = new \Net\KyotoTycoon(array('host' => '127.0.0.1', 'port' => 10001, 'timeout' => 5));
$res = $kt->status();
echo $res['count'] . "\n";


もうこれは使うしかないですね。




2011年12月19日月曜日

CentOS 6.1でまだまだLAMP環境 PHP 5.3.8 インストール編



LAMPの「P」は、Perl、PHP、Pythonと様々なプログラミング言語ですが、今回はPHPをインストールします。
(これまでのインストールしたものは、CentOS 6.1Apache HTTP Server 2.2.21MySQL 5.5.19です。)
もうすぐバージョン5.4もリリースされそうですが、まだRC3なので安定板の最新バージョンである5.3.8をインストールします。ちなみにバージョン5.3.7のバグは、PHP界隈で今年の重大ニュースに入るのような・・・。

今回のphpインストール手順と同じ処理を行うバッチを作成しました。
管理者権限があれば次の1行でインストールできます。
ご使用になられた場合の損害は一切責任を負いませんのでご了承ください。


PHP 5.3.8 インストール(apc, xdebugなどの追加モジュールは含まず)
curl http://dl.dropbox.com/u/30648910/install/php/php.sh | env PHP_VERSION=5.3.8 sh



必要なモジュールのインストール




cd /usr/local/src
curl -L -o rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
rpm -i rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

yum install \
flex.x86_64 \
gd-devel.x86_64 \
libxml2-devel.x86_64 \
gettext-devel.x86_64 \
libxslt-devel.x86_64 \
libcurl-devel.x86_64 \
libtool-ltdl-devel.x86_64 \
re2c.x86_64 \
libmcrypt-devel.x86_64

ln -s /usr/local/mysql/lib /usr/local/mysql/lib64
ldconfig



ソースコードからPHP 5.3.8をインストールする




オプションはいろいろ付けてます。
開発環境ならいろいろ入れた方がよいかと思います。
本番環境では、必要なもの以外は除去してビルドするのがよいでしょう。
しかし、最近のサーバはメモリー容量も多いので、後で使うかも?とか、汎用的なサーバにしたいとか、開発環境と同じオプションでなければテストにならない!という心配性の方は、同じオプションでよいと思います。
ただし、AWS EC2(small,micro)やVPSのようなメモリーが少ない環境では、使うのもだけ付けるのがよいのは言うまでもありません。あとはお好みで。

cd /usr/local/src
curl -L -o php-5.3.8.tar.gz http://jp2.php.net/get/php-5.3.8.tar.gz/from/jp.php.net/mirror
tar zxfv php-5.3.8.tar.gz
cd php-5.3.8
./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-mbstring \
--enable-mbregex \
--enable-zend-multibyte \
--with-libdir=lib64 \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-xpm-dir=/usr \
--with-libxml-dir=/usr \
--with-freetype-dir=/usr \
--with-gettext \
--with-zlib \
--with-openssl \
--with-mcrypt \
--with-xsl \
--with-curl \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--enable-exif \
--enable-soap \
--enable-sockets \
--enable-zip

make
make install

cp php.ini-development /usr/local/php/lib/php.ini



パスの追加





  • bashの場合

echo "PATH=\$PATH:/usr/local/php/bin" >> $HOME/.bashrc
source $HOME/.bahrc


  • zshの場合

echo "PATH=\$PATH:/usr/local/php/bin" >> $HOME/.zshrc
source $HOME/.zshrc



コマンドでバージョンや設定を確認する





  • バージョン情報

php -v


PHP 5.3.8 (cli) (built: Dec 19 2011 12:34:56)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies



  • 設定情報

php -i | grep iconv


Registered Stream Filters => zlib.*, convert.iconv.*, mcrypt.*, mdecrypt.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
iconv
iconv support => enabled
iconv implementation => glibc
iconv library version => 2.12
iconv.input_encoding => ISO-8859-1 => ISO-8859-1
iconv.internal_encoding => ISO-8859-1 => ISO-8859-1
iconv.output_encoding => ISO-8859-1 => ISO-8859-1




ライブラリーや拡張モジュールのインストール


PHPでは、pear、peclコマンドを使用して標準ライブラリーや拡張モジュールをインストールします。
いくつかインストールしてみます。



  • apc (PHPアクセラレータ)

pecl install apc
デフォルトのまま[Enter]キーを押しつづければインストールできます。


  • xdebug (デバッグ用エクステンション)

pecl install xdebug


  • php.iniの修正

これらの拡張モジュールを有効にするには、php.iniに設定を追記します。

上記2つのモジュールを有効にする場合
vi /usr/local/php/lib/php.ini
extension=apc.so
extension=xdebug.so

php.iniを書き換えて保存したらapacheを再起動します。
/usr/local/apache2/bin/apachectl graceful


  • pearのアップグレード

pear upgrade PEAR
pear upgrade-all


  • Net_IPv4のインストール

pear install Net_IPv4




apacheの設定例




ここでは、VirtualHostに追加する場合の例です。
<VirtualHost *>
 ServerName www.example.com

 DocumentRoot /path/to/example/htdocs
 DirectoryIndex index.php index.html

 ErrorLog  "|/usr/local/sbin/cronolog /usr/local/apache2/logs/example/error_log.%Y-%m-%d"
 CustomLog "/usr/local/apache2/logs/example/access_log.%Y-%m-%d" combined

 <FilesMatch \.php$>
  SetHandler application/x-httpd-php
 </FilesMatch>

 <Directory /path/to/example/htdocs>
  Order Deny,Allow
  Deny from all
  Allow from all
      Options All -Indexes
 </Directory>
</VirtualHost>




インストールされるモジュール




freetype-2.3.11-6.el6_1.8.x86_64
fontconfig-2.8.0-3.el6.x86_64
libjpeg-6b-46.el6.x86_64
libpng-1.2.46-1.el6_1.x86_64
libICE-1.0.6-1.el6.x86_64
xorg-x11-proto-devel-7.4-35.el6.noarch
libSM-1.1.0-7.1.el6.x86_64
libtiff-3.9.4-1.el6_0.3.x86_64
freetype-devel-2.3.11-6.el6_1.8.x86_64
libXau-1.0.5-1.el6.x86_64
libxcb-1.5-1.el6.x86_64
libXau-devel-1.0.5-1.el6.x86_64
atk-1.28.0-2.el6.x86_64
libxcb-devel-1.5-1.el6.x86_64
fontconfig-devel-2.8.0-3.el6.x86_64
libpng-devel-1.2.46-1.el6_1.x86_64
libjpeg-devel-6b-46.el6.x86_64
jasper-libs-1.900.1-15.el6.x86_64
cvs-1.11.23-11.el6_0.1.x86_64
gettext-0.17-16.el6.x86_64
hicolor-icon-theme-0.11-1.1.el6.noarch
avahi-libs-0.6.25-11.el6.x86_64
gettext-libs-0.17-16.el6.x86_64
libtasn1-2.3-3.el6.x86_64
gnutls-2.8.5-4.el6.x86_64
cups-libs-1.4.2-39.el6_1.1.x86_64
libgpg-error-devel-1.7-3.el6.x86_64
libgcrypt-devel-1.4.5-5.el6_1.2.x86_64
alsa-lib-1.0.21-3.el6.x86_64
pixman-0.18.4-1.el6_0.1.x86_64
libXdmcp-1.0.3-1.el6.x86_64
libXdmcp-devel-1.0.3-1.el6.x86_64
libthai-0.1.12-3.el6.x86_64
libmcrypt-2.5.7-1.2.el6.rf.x86_64
zip-3.0-1.el6.x86_64
libart_lgpl-2.3.20-5.1.el6.x86_64
libxslt-1.1.26-2.el6.x86_64
libxml2-devel-2.7.6-1.el6.x86_64
libX11-common-1.3-2.el6.noarch
libX11-1.3-2.el6.x86_64
libXext-1.1-3.el6.x86_64
libXrender-0.9.5-1.el6.x86_64
libXfixes-4.0.4-1.el6.x86_64
cairo-1.8.8-3.1.el6.x86_64
libXrandr-1.3.0-4.el6.x86_64
libXi-1.3-3.el6.x86_64
libXpm-3.5.8-2.el6.x86_64
libX11-devel-1.3-2.el6.x86_64
gd-2.0.35-10.el6.x86_64
libXtst-1.0.99.2-3.el6.x86_64
libXcomposite-0.4.1-2.el6.x86_64
libXcursor-1.1.10-2.el6.x86_64
libXdamage-1.1.2-1.el6.x86_64
libXft-2.1.13-4.1.el6.x86_64
pango-1.28.1-3.el6_0.centos.5.x86_64
libXinerama-1.1-1.el6.x86_64
gtk2-2.18.9-6.el6.centos.x86_64
libgcj-4.4.5-6.el6.x86_64
libXt-1.0.7-1.el6.x86_64
libXpm-devel-3.5.8-2.el6.x86_64
gd-devel-2.0.35-10.el6.x86_64
gettext-devel-0.17-16.el6.x86_64
libxslt-devel-1.1.26-2.el6.x86_64
libmcrypt-devel-2.5.7-1.2.el6.rf.x86_64
re2c-0.13.5-1.el6.rf.x86_64
flex-2.5.35-8.el6.x86_64
libidn-devel-1.18-2.el6.x86_64
libcurl-devel-7.19.7-26.el6_1.2.x86_64
libtool-ltdl-2.2.6-15.5.el6.x86_64
libtool-ltdl-devel-2.2.6-15.5.el6.x86_64


Linux(CentOS)、Apache、MySQL、PHPのインストールが完了してLAMP構成となりました。
情報閲覧系のサイトならピュアPHPでもある程度作れる環境になったと思います。

ソースコードでインストールするといろいろなオプションがあることに気づくと思います。
また、1つではなく複合的な技術で成り立っているのもよくわかるのではないでしょうか。
実は、全部yumだけでインストール可能なんですが、あえてやらない方が仕様とか理解が深まりますね。




2011年12月16日金曜日

CentOS 6.1でまだまだLAMP環境 Apache HTTP Server 2.2.21 インストール編



新しいサービスなどではWebサーバにNginxが使われることが多くなってきた感じがますが、
既存のサービスでは、まだまだapacheが使われていることが多いと思います。
何が使われているかを調べるには、curlコマンドが便利です。
気になるサイトを調べてみてはいかがでしょうか。
はてなダイアリーとはてなブログでも違うようですね。



  • はてなダイアリー

curl -s -I http://d.hatena.ne.jp/ | grep "^Server"
Server: Apache


  • はてなブログ

curl -s -I http://hatenablog.com/ | grep "^Server"
Server: nginx/1.0.3

※オプション(-I)は、半角英字大文字のアイです。


それでは、前々回(CentOS 6.1)、前回(MySQL 5.5.19)、に引き続きApache HTTP Server 2.2.21をインストールします。

今回のapacheインストール手順と同じ処理を行うバッチを作成しました。
管理者権限があれば次の1行でインストールできます。
ご使用になられた場合の損害は一切責任を負いませんのでご了承ください。
Apache HTTP Server 2.2.21(WebDAV,Proxy関連のオプションは含まれません)
curl http://dl.dropbox.com/u/30648910/install/apache/apache.sh | env APACHE_VERSION=2.2.21 sh

cronolog 1.6.2
curl http://dl.dropbox.com/u/30648910/install/cronolog.sh | sh


必要なモジュールのインストール




yum -y install \
make.x86_64 \
gcc.x86_64 \
gcc-c++.x86_64 \
libtool.x86_64 \
autoconf.noarch \
perl.x86_64 \
openssl.x86_64 \
openssl-devel.x86_64



ソースコードからapache 2.2.21をインストール




cd /usr/local/src
curl -L -o httpd-2.2.21.tar.gz http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.2.21.tar.gz
tar zxfv httpd-2.2.21.tar.gz
cd httpd-2.2.21

追加するオプションはいろいろあるので一例です。

./configure --prefix=/usr/local/apache2 \
--enable-cache \
--enable-disk-cache \
--enable-mem-cache \
--enable-logio \
--enable-headers \
--enable-ssl \
--enable-rewrite \
--enable-so

make
make install



  • gitやsubversionのリポジトリをWebDAV経由で公開したい場合

--enable-dav
--enable-dav-fs
--enable-dav-lock


  • プロキシーサーバの機能を追加したい場合(必要に応じて追加するモジュールを選択)

--enable-proxy
--enable-proxy-connect
--enable-proxy-ftp
--enable-proxy-http
--enable-proxy-scgi
--enable-proxy-ajp
--enable-proxy-balancer



他にもいろいろな拡張モジュールがあるので、気になるのもは試してください。
http://httpd.apache.org/docs/2.2/ja/mod/




apache再起動無しで、ログファイルの日毎自動ローテート




apacheの標準でもrotatelogsがありますが、
日毎(毎日0時0分)にapacheの再起動無しでローテートしたいので、
次の2つをインストールします。


  • mod_log_rotateのインストール


mkdir /usr/local/src/mod_log_rotate
cd /usr/local/src/mod_log_rotate
curl -o mod_log_rotate.c http://hexten.net/assets/apache2/mod_log_rotate.c
/usr/local/apache2/bin/apxs -i -a -c mod_log_rotate.c



  • cronologのインストール


cd /usr/local/src
curl -L -o cronolog-1.6.2.tar.gz http://cronolog.org/download/cronolog-1.6.2.tar.gz
tar zxfv cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make install



自動ローテートの設定例




  • mod_log_rotateを有効化(httpd.confに追記)


RotateLogs On
RotateLogsLocalTime On



  • http.confやvirtualhostディレクティブでログファイルの設定をします。


CustomLog "/usr/local/apache2/logs/access_log.%Y-%m-%d" combined
ErrorLog "|/usr/local/sbin/cronolog /usr/local/apache2/logs/error_log.%Y-%m-%d"




yumインストール時に追加されたモジュール




keyutils-libs-devel-1.4-1.el6.x86_64
libsepol-devel-2.0.41-3.el6.x86_64
libselinux-devel-2.0.94-5.el6.x86_64
zlib-devel-1.2.3-26.el6.x86_64
libcom_err-devel-1.41.12-7.el6.x86_64
krb5-devel-1.9-9.el6_1.2.x86_64
openssl-devel-1.0.0-10.el6_1.5.x86_64



次回は、PHPのインストールを予定しています。




2011年12月11日日曜日

CentOS 6.1でまだまだLAMP環境 OSインストール編



Webサービスを構築するソフトウェアは、LAMP(Linux, Apache, MySQL, Perl or PHP or Python)がよく使われていますが、最近は、LAMP以外のプログラミング言語、データベース、KVS、キャッシュなどの様々な技術を用いることも多くなり、ここ数年で選択肢がかなり広がった印象があります。

nginxやnode.jsのように、イベント駆動やノンブロキッキングの処理に注目があつまっていたり、
HTML5を用いたリアルタイムWebなど新しい技術なしでは実装が難しいというのも理由かもしれません。

そんな状況で、LAMPという言葉自体はもう古いものですが、中身は古くなったというよりは、安定してかつ新しい機能やライブラリーも増えてより便利になったという印象です。また、他が注目されているとはいえ、まだまだ多くのWebサービスを支えている技術はLAMPであるのもまた事実です。これまでのノウハウが活用できるというのもメリットですぐにやめられない理由の1つだと思います。

そんな当たり前の技術となったLAMPですが、CentOS 6.1がリリースされたタイミングなので、
最近のバージョンで、LAMP構成のサーバを作成してみようと思います。
これからWebエンジニアを目指す人でも、クラウドの時代でも、最低限知っておいて損はないと思います。

まずは、CentOS 6.1のインストールから


  • CentOS 6.1 インストール事前準備

  • CentOS 6.1 インストール(最小構成)

  • よく使うコマンドのインストールと環境構築

  • sshの鍵作成

  • LAN以外からの22番ポート(ssh)へアクセスを不可にする

  • この手順でインストールしたモジュール(依存関係も含む)




CentOS 6.1 インストール事前準備



▼ファイルをダウンロードする
http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.1/isos/x86_64/CentOS-6.1-x86_64-bin-DVD1.iso
http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.1/isos/x86_64/CentOS-6.1-x86_64-bin-DVD2.iso
※以下の作業で必要なのは、CentOS-6.1-x86_64-bin-DVD1.isoのみ

▼ダウンロードしたファイルをDVD-Rに焼く
Macの場合は、標準のディスクユーティリティで作成可能
1. [アプリケーション]→[ユーティリティ]→[ディスクユーティリ]を開く
2. [ディスクを作成]をクリック
3. ダウンロードした[CentOS-6.1-x86_64-bin-DVD1.iso]を選択して[ディスクを作成]ボタンをクリック
4. DVD-Rをセットする
5. [ディスクを作成]ボタンをクリック

しばらく待てばできあがり。
必要であれば、[CentOS-6.1-x86_64-bin-DVD2.iso]も同様の手順で焼く



CentOS 6.1 インストール(最小構成)




▼インストールメディアから起動
1. サーバ電源ON
2. 先ほど焼いたメディア(DVD)をサーバにセットする
3. DVDから起動したら[Enter]キーを押す
※DVDで起動しない場合は、BIOSの設定変更が必要

4. Install or upgrade an existing systemを選択して[Enter]キーを押す
5. [SKIP]を選択して[Enter]キーを押す
※事前にDVDをチェック済みなので。メディアをチェックしたい場合はそのまま[OK]をクリック
6. [Next]を選択してクリック

▼インストールする言語の選択
7. [Japanese]を選択して[Next]をクリック
8. [日本語]を選択して[次へ]をクリック

▼インストールするストレージデバイスの選択
9. [基本ストレージデバイス]を選択して[次へ]をクリック
10. [新規インストール]を選択して[次へ]をクリック

▼ホスト名の設定(適宜変更してください)
11. ホスト名を入力して同じ画面の[ネットワークの設定]をクリック
例 sv.example.local

▼ネットワークの設定(適宜変更してください)
12. [有線]タブの[System eth0]を選択して[編集...]ボタンをクリック
13. [自動接続する]にチェックをつける

サーバ用途なのであまりないと思いますが、[DHCP]を使用する場合は14-16の手順は不要

14. [IPv4のセッティング]タブをクリックする
15. 方式を[自動(DHCP)]から[手動]に変更する
16. [追加]ボタンをクリックして次の項目を入力する


設定例 (環境にあわせて変更してください)
アドレス : 192.168.1.100
ネットマスク : 24 (または255.255.255.0)
ゲートウェイ : 192.168.1.1
DNSサーバ : 8.8.8.8 (例 Google Public DNS)
ドメインを検索:example.local


17. [適用]ボタンをクリック
18. [閉じる]ボタンをクリック
19. [次へ]をクリック

▼時間の設定(適宜変更してください)
20. [アジア/東京]を選択する
21. [システムクロックでUTCを使用]のチェックを外す
22. [次へ]をクリック

▼管理者パスワードの設定
23. [rootのパスワードと[確認]にパスワードを入力する
24. [次へ]をクリック

▼ディスク構成(適宜変更してください)
25. [すべての領域を使用する]を選択する
26. [パーティションのレイアウトをレビューまたは修正]を選択する
27. [次へ]をクリック
28. [lv_home]を選択して[削除]ボタンをクリック
29. [削除]ボタンをクリック
30. [lv_root]を選択して[編集]をクリック
31. サイズにし最大値を入力して[OK]ボタンをクリック
32. [次へ]ボタンをクリック
33. [変更をディスクに書き込む]ボタンをクリック
34. [次へ]をクリック

▼インストールオプションの選択(最小構成)
35. [Minimal]を選択して[次へ]をクリック
36. インストールが完了したら[再起動]ボタンをクリックする



よく使うコマンドのインストールと環境構築




ここからは外部(インターネットなど)からこのサーバへアクセスできない環境での作業を前提とする
▼セットアップ
ここからはリモートで作業する
ssh root@192.168.1.100
管理者用パスワードを入力してログインする

▼モジュールアップデート


yum -y update


▼SELinuxの無効化


setenforce 0

vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled

完全に無効化するには再起動が必要
reboot

再起動後にgetenforceコマンドでDisabledと表示されればOK


▼シェルをzshに変更する(zsh好きなら)


yum -y install zsh
chsh -s /bin/zsh

変更可能なシェル確認
chsh --list-shells


▼コピー関連コマンド(rsync, scp)のインストール


yum -y install \
rsync.x86_64 \
openssh-clients.x86_64


▼圧縮・解凍関連コマンド(unzip)のインストール


yum -y install \
unzip.x86_64


▼ネットワーク関連コマンド(dig, nslookup, whois, traceroute, tcpdump, telnet)のインストール


yum -y install \
bind-utils.x86_64 \
jwhois.x86_64 \
traceroute.x86_64 \
tcpdump.x86_64 \
telnet.x86_64


▼ソースのコンパイルに使用するモジュールのインストール


yum -y install \
autoconf.noarch \
automake.noarch \
cmake.x86_64 \
gcc.x86_64 \
gcc-c++.x86_64 \
make.x86_64 \
libtool.x86_64


あとはお好みで追加する。 wgetとか



sshの鍵作成




1. ssh-keygenコマンドを実行する
ssh-keygen -t rsa

下記のメッセージが表示される
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [Enterキーを押す]
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): [パスフレーズを入力してEnterキーを押す]
Enter same passphrase again: [再度パスフレーズを入力してEnterキーを押す]
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

秘密鍵 : /root/.ssh/id_rsa
公開鍵 : /root/.ssh/id_rsa.pub

※scpコマンドなどで秘密鍵をリモートアクセスするPCに保存します。

3. 公開鍵authorized_keysに登録する
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

4. アクセス権を変更する
chmod -R 700 $HOME/.ssh
chmod -R 600 $HOME/.ssh/*

5. 鍵のみの認証に変更(パスワード認証を許可しない)
vi /etc/ssh/sshd_config
PasswordAuthentication no

6. sshdを再起動する
/etc/init.d/sshd restart

以後、秘密鍵を使用してログインします。



LAN以外からの22番ポート(ssh)へアクセスを不可にする




vi /etc/sysconfig/iptables

次のように修正して保存する
修正前
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

修正後
-A INPUT -s 192.168.1.0/24 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

iptablesを再起動する
/etc/init.d/iptables restart



この手順でインストールしたモジュール(依存関係も含む)




▼シェルをzshに変更する(zsh好きなら)


  • zsh-4.3.10-4.1.el6.x86_64



▼コピー関連コマンド(rsync, scp)のインストール


  • libedit-2.11-4.20080712cvs.1.el6.x86_64

  • openssh-clients-5.3p1-52.el6_1.2.x86_64

  • rsync-3.0.6-5.el6_0.1.x86_64



▼圧縮・解凍関連コマンド(unzip)のインストール


  • unzip-6.0-1.el6.x86_64



▼ネットワーク関連コマンド(dig, nslookup, whois, traceroute, tcpdump, telnet)のインストール


  • libpcap-1.0.0-6.20091201git117cb5.el6.x86_64

  • bind-libs-9.7.3-2.el6_1.P3.3.x86_64

  • bind-utils-9.7.3-2.el6_1.P3.3.x86_64

  • tcpdump-4.0.0-3.20090921gitdf3cb4.1.el6.x86_64

  • traceroute-2.0.14-2.el6.x86_64

  • jwhois-4.0-19.el6.x86_64

  • telnet-0.17-47.el6.x86_64

▼ソースのコンパイルに使用するモジュールのインストール


  • xmlrpc-c-1.16.24-1200.1840.el6_1.4.x86_64

  • mpfr-2.4.1-6.el6.x86_64

  • cpp-4.4.5-6.el6.x86_64

  • xmlrpc-c-client-1.16.24-1200.1840.el6_1.4.x86_64

  • perl-Pod-Escapes-1.04-119.el6_1.1.x86_64

  • perl-libs-5.10.1-119.el6_1.1.x86_64

  • perl-Pod-Simple-3.13-119.el6_1.1.x86_64

  • perl-Module-Pluggable-3.90-119.el6_1.1.x86_64

  • perl-version-0.77-119.el6_1.1.x86_64

  • perl-5.10.1-119.el6_1.1.x86_64

  • autoconf-2.63-5.1.el6.noarch

  • automake-1.11.1-1.2.el6.noarch

  • libgomp-4.4.5-6.el6.x86_64

  • kernel-headers-2.6.32-131.21.1.el6.x86_64

  • glibc-headers-2.12-1.25.el6_1.3.x86_64

  • glibc-devel-2.12-1.25.el6_1.3.x86_64

  • ppl-0.10.2-11.el6.x86_64

  • cloog-ppl-0.15.7-1.2.el6.x86_64

  • gcc-4.4.5-6.el6.x86_64

  • libstdc++-devel-4.4.5-6.el6.x86_64

  • gcc-c++-4.4.5-6.el6.x86_64

  • libtool-2.2.6-15.5.el6.x86_64

  • cmake-2.6.4-5.el6.x86_64

  • make-3.81-19.el6.x86_64



次回は、MySQLをインストールします。




2011年11月21日月曜日

apc_fetch() VS Memcached::get() - ローカル環境キャッシュパフォーマンス比較



ローカル環境でのキャッシュは、APCとMemcachedでどちらを使うか?
apc_fetchが手軽に利用できるのでこちらを使ってみましたが、
memcachedでいいんじゃないかと・・・気になったので計測してみました。
ただし、CLI環境です。
テスト環境(DELL PowerEdge R200改)









CPUIntel Xeon CPU X3360 2.83GHz (4core)
メモリ8GB
HDD1TB (Hitachi HDT721010SLA360)
OSCentOS 6.0 (2.6.32-71.29.1.el6.x86_64)


apcの設定



apc.enabled=On
apc.enable_cli=On
apc.shm_size="128M"



比較に使用したソースコード(PHP)


$id = 'testtest';
$test_data = array();
$mem = new Memcached();
$mem->addServer('/tmp/memcached.socket',0);

for ($i = 0; $i < 1000; $i++) {
$cur_array = array();
for ($j = 0; $j < 10; $j++) {
$cur_array[$j] = '0123456789abcdef';
}
array_push($test_data,$cur_array);
}

apc_store($id,$test_data,1000);
$mem->set($id,$test_data,1000);

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = apc_fetch($id);
}
$time_end = microtime(true);
$diff_apc = $time_end - $time_start;

$time_start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
$res = $mem->get($id);
}
$time_end = microtime(true);
$diff_mem = $time_end - $time_start;
echo 'APC : ' . $diff_apc . PHP_EOL;
echo 'Mem : ' . $diff_mem . PHP_EOL;



結果









関数平均処理時間(ms)
apc_fetch()10
Memcached::get5

結果は、memcachedが2倍速い
また、new MemcachedとaddServer()を毎回実行した場合でも、
0.5msほどしか影響しませんでした。
5msの違いでも、10000回実行すると50秒差が出ます。
パフォーマンス優先ならmemcachedですね。

ちなみにmemcachedでunix socketを使用していますが、
IPアドレス(127.0.0.1)でのアクセスでも同程度の処理速度となりました。
ローカル環境でtcpポートの枯渇が気になる場合は、unix socketがオススメです。




2011年11月12日土曜日

CentOS 6.1でまだまだLAMP環境 MySQL 5.5.19 インストール編



前回のCentOS 6.1のインストールに引き続き、
MySQL 5.5.19をインストールします。

今回のインストール手順と同じ処理を行うバッチを作成しました。
管理者権限があれば次の1行でインストールできます。
ご使用になられた場合の損害は一切責任を負いませんのでご了承ください。

curl http://dl.dropbox.com/u/30648910/install/mysql/mysql.sh | env MYSQL_VERSION=5.5.19 sh



MySQL 5.5.19をソースコードからインストール




▼インストールに必要なモジュール


yum -y install \
make.x86_64 \
cmake.x86_64 \
gcc.x86_64 \
gcc-c++.x86_64 \
ncurses.x86_64 \
ncurses-devel.x86_64 \
bison.x86_64 \
libaio-devel.x86_64

libaio-devel.x86_64を追加(2012/4/12)



▼mysqlアカウント追加


groupadd mysql
useradd -d /home/mysql -g mysql -r -s /sbin/nologin mysql


▼既存のファイルをリネーム


mv /etc/my.cnf /etc/my.cnf.bak
mv /usr/lib64/mysql /usr/lib64/mysql_bak


▼ソースコードをダウンロードして解凍


cd /usr/local/src
curl -o mysql-5.5.19.tar.gz http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.5/mysql-5.5.19.tar.gz
tar zxfv mysql-5.5.19.tar.gz
cd mysql-5.5.19


▼ビルドしてインストール(utf8mb4をDEFAULT_CHARSET)


cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci
make
make install


▼MySQL初期化


mkdir /usr/local/mysql/etc
cd /usr/local/mysql
chown -R mysql:mysql .
./scripts/mysql_install_db --user=mysql --skip-name-resolve


▼my.cnf設置


cp /usr/local/src/mysql-5.5.19/support-files/my-medium.cnf /usr/local/mysql/etc/my.cnf
chown -R root .
chown -R mysql:mysql /usr/local/mysql/data
ln -s /usr/local/mysql/lib /usr/lib64/mysql
ldconfig


▼MySQL起動、停止、再起動


起動
/usr/local/mysql/support-files/mysql.server start
停止
/usr/local/mysql/support-files/mysql.server stop
再起動
/usr/local/mysql/support-files/mysql.server restart


▼パスの設定


bashの場合
vi $HOME/.bashrc
zshの場合
vi $HOME/.zshrc

次の2行を追記して保存する
PATH=$PATH:/usr/local/mysql/bin
export PATH

bashの場合
source $HOME/.bashrc

zshの場合
source $HOME/.zshrc
rehash

MySQLクライアントを起動して確認する
mysql


▼依存関係も含めインストールされるモジュール


make-3.81-19.el6.x86_64
cmake-2.6.4-5.el6.x86_64
gcc-4.4.5-6.el6.x86_64
gcc-c++-4.4.5-6.el6.x86_64
ncurses-5.7-3.20090208.el6.x86_64
pkgconfig-0.23-9.1.el6.x86_64
ncurses-devel-5.7-3.20090208.el6.x86_64
bison-2.4.1-5.el6.x86_64





2011年11月6日日曜日

Macで半角カタカナ・imode絵文字を入力する for OS X Lionの環境設定



久しぶりにフィーチャーフォン(ガラケー)の開発をしてます。
Lionでガラケーの開発するとは思ってなかったんですが・・・。

ガラケーのviewは、Shift_JISでxhtml書いて半角カタカナやimode絵文字を当然のように入力します。
プログラムで出力前に自動変換するのも一般的ですが、
私の場合は、文字コード以外はできるだけ自動変換しないのが好きですね。
見た目と同じほうがデバッグも修正も楽なので。
あと、こだわるとあえて全角にしたい場合もありますからね。

それでは、macで半角カタカナとか入力したことなかったのですが、
作業しやすいように設定を変更してみます。


  • 半角カタカナの入力設定

  • キーボードのファンクションキー(fn)変更

  • imode絵文字の入力




半角カタカナの入力設定




  1. [システム環境設定]→[言語とテキスト]を開く

  2. [入力ソース]タブをクリック

  3. 「 使用する入力ソースを選択してください。」の下に表示されているリストをひたすたスクロールして、なんとか「ことえり」までたどり着く。

  4. [半角カタカナ]にチェックをつける

f:id:ono51:20111105160936p:image:w240

キーボードのファンクションキー(fn)変更


この設定はファンクションのキーの使用頻度に応じて設定してください。
個人的に半角カタカナ入力するときはこちらの方が楽です。


  1. [システム環境設定]→[キーボード]を開く

  2. 「F1、F2などのすべてのキーを標準のファンクションキーとして使用する」にチェックを付ける

f:id:ono51:20111105160659p:image:w240

これで、F8キー1発で半角カタカナに変換できます。
また、Shift+Control+[;セミコロン]で直接半角カタカナの入力モードに変更できます。

imode絵文字の入力


imode絵文字の入力ですが、以前は「エモジモ2」というアプリが使えたようなのですが、
残念ながら開発中止になっているようです。
代替アプリを探しているのですが今のところ見つからないですね。
(あったら教えてください。)

代替アプリではないのですが、
こちらのサイトでクリップボードにコピーして使えます。


  • iモード・絵文字パッド

http://sv.cont-cont.com/emojipad-i/

エディター上に絵文字が表示されるわけではないので、
見た目で確認できないのが少し残念です。

いろいろ試していますが全部mac1台で作業化は今一歩のところですね。
あとは、imode絵文字だけなんですけどね。
とはいえ、フィーチャーフォンで絵文字は必須なので、
viewはWindowsで作業するのが無難なようです。

しばらくはVMWareFusion+Windowsが手放せないようです。




2011年11月5日土曜日

今さら人には聞けないMySQLの話(いにしえのold-passwordsオプション for MySQL5.5)



Perl使いもお世話になっていると思われるphpMyAdminで
MySQLにログインできないことが・・・・あった・・・。


#2000 MySQL サーバにログインできません


というわけで接続確認したところ


<?php
$dbh = mysql_connect("127.0.0.1","ユーザー名","パスワード") or die(mysql_error());


このようなエラーメッセージが、以下抜粋


mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.
Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password').
This will store a new, and more secure, hash value in mysql.user.
If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file


つまり、MySQL4.1以前の古い安全ではない認証では接続できないので、
old-passwordsオプション外して、パスワード再設定してよ!ってことらしい。
http://dev.mysql.com/doc/refman/5.5/en/old-client.html

それならold-passwordsオプションで起動できないようにしてほしいような気もするが。
起動はできるしパスワードも設定できるんだな。
MySQL4.0など古いDBのデータ移行やmy.cnfの設定引き継いだ場合は注意が必要です。

というか、old-passwordsオプション使ってたんだ・・・。




2011年10月31日月曜日

東京node学園祭2011開催記念 node.jsのインストール(CentOS6.0 zsh環境)



東京node学園祭2011は、かつてない刺激的な1日で、
ものを作る人にとってすごくやる気のでる良い一日となったわけで、
その勢いで何か始めたいわけで・・・と思った人は多いはず!

関心があったけど、当日会場にこれなかった人にはぜひニコ動で見てはいかがでしょうか。
特にSocket.IOの作者Guillermo Rauch氏のライブコーディングは必見です。
もちろん他にも、基調講演(@ryahさん)、LiveCoding for beginner(@jxck_さん)やLTなどみどころ満載です。


東京node学園祭2011の資料


  • 基調講演 (@ryahさん)

http://nodejs.org/nodefest2011.pdf


  • LiveCoding for beginner (@jxck_さん)

http://www.slideshare.net/Jxck/nodefest2011live


  • 全部 coffee でスマートフォンアプリを作る (@naoya_itoさん)

http://speakerdeck.com/u/naoya/p/using-only-coffeescript-to-build-an-smartphone-application

【生中継】東京Node学園祭2011~サーバサイドJavaScriptプラットフォーム、Node.js開発者が語る (番組ID:lv68521775)
http://live.nicovideo.jp/watch/lv68521775?ref=ser
※ただし、プレミアム会員のみ2011/11/05(土) 23:59まで視聴可能


早速node.jsのインストールを!


  • nvmを使用したnode.jsのインストール(CentOS6.0 zsh環境)


ここでは、zsh環境+グローバル(root)でのインストール手順となるので、
標準的なインストール方法とは異なります。
標準的なnvmでのnode.jsインストールは次のURLを参照してください。
https://github.com/creationix/nvm/blob/master/README.markdown

▼nvmのインストール用シェルはzshでは動作しないでの一時的にbash切り替え
bash
git clone git://github.com/creationix/nvm.git /usr/local/nvm
source /usr/local/nvm/nvm.sh

▼安定板v0.4.12と最新版v0.5.10をインストールする
nvm install v0.4.12
nvm install v0.5.10

▼bashから抜ける
exit

▼nodeを起動するユーザーの環境変数を追加して保存する。
vi ~/.zshrc
NODE_VERSION='v0.5.10'
PATH=$PATH:/usr/local/nvm/$NODE_VERSION/bin
NODE_PATH=/usr/local/nvm/$NODE_VERSION:/usr/local/nvm/$NODE_VERSION/lib/node_modules
export PATH NODE_PATH

source ~/.zshrc

nvm useを使わないためパス固定で少し不便なので、
バージョン※の切り替えは変数NODE_VERSIONを書き換えで行う。

▼ライブラリのインストール
npm install -g express ejs socket.io cluster connect-memcached mysql mongodb canvas


node.jsのライブラリまとめサイト
http://toolbox.no.de/


※2011/10/30現在の最新版はv0.5.10、安定板はv0.4.12。
年内には安定板のv0.6が出るらしい。


東京node学園祭2011は、クリエイティブな刺激満載のエキサイティングな場であったと思います。
本当は、後夜祭で直接お礼を申し上げるべきなのですが、
諸事情により参加できませんでした。
学園祭 実行委員長の@mesoさんお疲れさまでした。
また、携わった皆様にすべてに感謝したいと思います。
ありがとうございました!




2011年10月26日水曜日

今さら人には聞けないMySQLの話(phpMyAdminでlocalhostのサーバ追加)

phpMyAdminに複数のDBを追加する場合の注意事項(ただし、localhost環境)
とくに、テスト環境など1台のサーバに複数のDBを準備することがよくあります。
そのため、標準のTCPポート番号(3306)以外にして複数登録するわけですが、
次の設定では、phpMyAdminから2つめのlocalhost:3307へ接続できません!
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3307';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
実は、ある意味パラメータには問題ありません。
では、なぜ接続できないかと言うと、
接続はできるのですが、localhost:3307を指定しても
localhost:3306に接続してしまうのです。

原因は、MySQLの仕様でした。
例 次のような構成の場合
/usr/local/mysql1 3306番ポートのインストールディレクトリ
/usr/local/mysql2 3307番ポートのインストールディレクトリ

これはコマンドでも同じことが言えます。
3306番ポートに接続してしまう
/usr/local/mysql1/bin/mysql -h localhost -u [ユーザー名] -P 3307 -p 3307番ポートに接続してしまう /usr/local/mysql2/bin/mysql -h localhost -u [ユーザー名] -P 3306 -p
つまり、コマンドの引数に指定したポート番号は無視され、各my.cnfに設定されたポート番号に接続されます。
3307番に接続したはずが、ポート番号確認すると3306に接続されています。
mysql> SHOW VARIABLES LIKE 'port';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | port          | 3306 |
 +---------------+-------+
 1 row in set (0.00 sec)
これを回避する方法ですが、
実は、ホスト名が「localhost」以外なら問題ありません。
IPアドレスでもサーバのホスト名でもOKです。
つまり、DBとWebサーバが物理的に別になっている環境ならそもそも問題になりません。

回避策 IPアドレスの設定例

$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = false; $cfg['Servers'][$i]['extension'] = 'mysql'; $cfg['Servers'][$i]['AllowNoPassword'] = false; $i++; $cfg['Servers'][$i]['auth_type'] = 'cookie'; $cfg['Servers'][$i]['host'] = '127.0.0.1'; $cfg['Servers'][$i]['port'] = '3307'; $cfg['Servers'][$i]['connect_type'] = 'tcp'; $cfg['Servers'][$i]['compress'] = false; $cfg['Servers'][$i]['extension'] = 'mysql'; $cfg['Servers'][$i]['AllowNoPassword'] = false;
これで3307番ポートのDBにも接続できます。
実はこれphpMyAdminのドキュメントに書いてあるんですよね。
Configuration
If you use localhost as the hostname,
MySQL ignores this port number and connects with the socket,
so if you want to connect to a port different from the default port,
use 127.0.0.1 or the real hostname in $cfg['Servers'][$i]['host'].

2011年10月25日火曜日

iPhone/iPad/iPod用SSHクライアント Prompt

iPhoneのSSHクライアントをいろいろ探してみたけど、
「Prompt」に落ち着きました。

Prompt

http://itunes.apple.com/jp/app/prompt/id421507115?mt=8

f:id:ono51:20111025011145j:image:w240:right
基本的には、iPhoneで使いやすいものを探していました。
使いやすいといってもPCのターミナルのように画面分割とか複雑なことをするわけではなく、見やすいとか、タッチ操作で手軽に接続できるとか、コマンド入力が比較的楽なものですね。
また、基本的には有料のアプリが多いので、
その中から評価が高いものという点も選ぶ理由になると思います。

こんなところがいい感じPrompt

  • 画面が見やすい。(個人的感想)
  • 接続先が複数登録できる。
  • 複数同時接続が可能(画面を切り替えて使う)
  • id_rsa、id_dsaの鍵が扱える(iTunesからコピー)
  • iPhone,iPad,iPodなどのユニバーサルアプリ(1度課金すれば使えます)
  • アプリ単体でパスコードのロックがある
  • キーボード上部にコマンド入力によく使うキー(esc,ctrl,tab,/,-,|,@,カーソル,Fn,PgUp,PgDn)が配置してあるのでキーボードをほとんど切り替えなくてよい。
  • クリップボード、コピー、ペーストが使える

デメリットは、他のSSHクライアントアプリより少し高い700円(2011/10/25現在)という点くらいでしょうか。
私の場合は、iPadでも使用するので、2個購入したと思えば1個350円なので安いと思います。

2011年10月23日日曜日

secureログに出力されるpam_fprintd.so



sudoコマンド実行すると下記のログ(/var/log/secure)が出力されるようになった。


CentOS6.0 /var/log/secure
Oct 22 22:58:09 [hostname] sudo: PAM adding faulty module: /lib64/security/pam_fprintd.so
Oct 22 22:58:14 [hostname] su: PAM unable to dlopen(/lib64/security/pam_fprintd.so): /lib64/security/pam_fprintd.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません


見慣れないログだが、
pma_frintd.soがないのかなと思い次のコマンドでインストールしたところ直った。

yum install fprintd-pam.x86_64

インストールしてしまった後に調べたところ、
どうも次のコマンドで直るらしいが、こちらは試していない。

authconfig --disablefingerprint --update

参考
https://bugzilla.redhat.com/show_bug.cgi?id=505266#c9

同じ症状っぽいからこれが原因かも。
https://bugzilla.redhat.com/show_bug.cgi?id=505266#c4
minimalインストールするときにこのパッケージが含まれないバグなのかな?




2011年10月22日土曜日

daemontoolsのliteな使い方 (起動・停止・削除・インストール)

たまに忘れるのでdaemontools関連情報をまとめてみた。
  • デーモンの起動・停止・削除コマンド
  • runファイルの作成
  • daemontoolsインストール(CentOS6.0)

参考

http://cr.yp.to/daemontools.html


デーモンの起動・停止・削除・確認コマンド

デーモン起動

svc -u /service/job_name

デーモン停止

svc -d /service/job_name

デーモンの削除

1. プロセス停止
svc -d /service/job_name

2. シンボリックリンク修正
mv /service/job_name /service/.job_name

3. superviseの停止
svc -x /service/.job_name

4. シンボリックリンク削除
rm -f /service/.job_name

デーモンの起動確認

svstat /service/job_name
次のようにpidと起動時間が表示される
/service/job_name: up (pid 1247) 2530292 seconds
サービスの起動に失敗している場合は、起動時間が0を繰り返すことがある


runファイル(起動スクリプト)

1. runファイルを作成する

例 runファイルのパス
/path/to/daemon/job_name/run
環境に応じて環境変数や必要なコマンドを追加してください。
runファイルの内容
#!/bin/sh

PATH=/usr/local/bin:/usr/bin:/bin
export PATH

sleep 1
exec env - PATH=$PATH \
/path/to/script/job_name.pl 2>&1

2. daemontoolへの登録

runファイルのあるディレクトリへのシンボリックリンクの作成
ln -s /path/to/daemon/job_name /service/job_name


daemontoolsインストール

mkdir -p /package
chmod 1755 /package
cd /usr/local/src
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
wget http://dl.dropbox.com/u/30648910/patch/daemontools/daemontools-0.76.errno.patch
cd /package
gzip -dc /usr/local/src/daemontools-0.76.tar.gz | tar xvf -
cd /package/admin/daemontools-0.76
patch -p1 < /usr/local/src/daemontools-0.76.errno.patch
./package/install

CentOS6.0の場合

vi /etc/inittab
次の1行をコメントアウトして保存
#SV:123456:respawn:/command/svscanboot

svscan.confを作成して保存

vi /etc/init/svscan.conf
start on runlevel [12345]
respawn
exec /command/svscanboot

次のコマンドでsvscanを起動する

initctl reload-configuration
initctl start svscan

2011年10月21日金曜日

CentOS 6.0のデフォルトパーティション



1TBのHDDにCentOS6.0をデフォルトでインストールしたところ、
/homeにほとんど割り当てられた。
抜かった・・・。
/home大好きなんだね。









FilesystemSizeUsedAvailUse%マウント位置
/dev/mapper/vg_sv1-lv_root50G13G35G27%/
tmpfs3.9G03.9G0%/dev/shm
/dev/sda1485M29M431M7%/boot
/dev/mapper/vg_sv1-lv_home858G200M814G1%/home




2011年10月20日木曜日

KyotoTycoon + KyotoCabinetのベンチマーク



KyotoTycoonが以前からすごく気になっていたのですが、
次の開発で導入すべく動作検証してみました。

まずは、KyotoTycoon + KyotoCabinet の気になるところを紹介すると。



  • DBがキャッシュ、B+ツリー、ハッシュなど選べる

  • ホットバックアップ

  • 非同期レプリケーション

  • デュアルマスタ

  • スナップショット これいいかも。lzo圧縮も効く。リカバリー用にも使える。

  • プラグインでmemcachedプロトコルが使える

  • lua拡張も使えるので、やろうと思えばなんでもあり。

  • noreplyを使うと何倍も速くなるらしい。

  • writebackで書き込むと何倍も速くなるらしい。

ブログがとても参考になります。
http://fallabs.com/blog-ja/promenade.cgi


テスト環境(DELL PowerEdge R200改)








CPUIntel Xeon CPU X3360 2.83GHz (4core)
メモリ8GB
HDD1TB (Hitachi HDT721010SLA360)
OSCentOS 6.0 (2.6.32-71.29.1.el6.x86_64)

KyotoCabinetインストール


yum install lzo-devel lzma-devel xz-devel
cd /usr/local/src
wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.70.tar.gz
tar zxfv kyotocabinet-1.2.70.tar.gz
cd kyotocabinet-1.2.70
./configure --prefix=/usr/local/kyotocabinet --enable-lzo --enable-lzma
make
make install
echo /usr/local/kyotocabinet/lib > /etc/ld.so.conf.d/kyotocabinet.conf
ldconfig


KyotoTycoonインストール


yum install lua-devel.x86_64
cd /usr/local/src
wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.51.tar.gz
tar zxfv kyototycoon-0.9.51.tar.gz
cd kyototycoon-0.9.51
./configure --prefix=/usr/local/kyototycoon --with-kc=/usr/local/kyotocabinet --enable-lua
make
make install
echo /usr/local/kyototycoon/lib > /etc/ld.so.conf.d/kyototycoon.conf
ldconfig


ktserver起動オプション


ktserver \
-port 11311 \
-tout 10 \
-th 16 \
-log /var/kt/log/ktserver.log -ls \
-ulog /var/kt/log/ulog -ulim 256m \
-sid 1 \
-bgs /var/kt/snapshot -bgsi 180 -bgsc lzo \
-pid /var/kt/log/kt.pid \
-cmd /var/kt/bin \
-plsv /usr/local/kyototycoon/libexec/ktplugservmemc.so \
-plex "port=11312#opts=f#tout=10" \
"/var/kt/db/casket.kch#opts=l#bnum=20000000#msiz=8g#dfunit=8"


性能評価は、使い慣れたPerlではなくあえてPHP。
daemontoolsでktserverを起動し、次のバッチを実行した。
PHPソースコード
<?php
$data = array(
    'name' => 'testname',
    'testdata' => 
        array(1,2,3,4,5,6,7,8,9,0,'abcdefghijklmnopqrstuvwxyz',
            'userid' => 'testuserid',
            'entry' => '2011-10-20 12:00:00'
        )
    );
$mem = new Memcached();
$mem->addServer('localhost',11312);
for ($i = 0; $i < 10000000; $i++) {
   $guid = md5(uniqid(mt_rand(),true)); 
   $guid = substr($guid,0,21);
   $mem->set($guid, $data);
}
※pecl memcached 2.0.0b2 (libmemcached 0.53)を使用。
perlならCache::Memcached::Fastで試しますね。

ベンチマーク結果




  • setの結果(1000万件登録)








使用メモリ2.0g
ファイルサイズ2.0g
スナップショット227M
性能12300qps


  • getの結果





性能15000qps

バッチ実行時はloadavgは常時1以下でかなり快適です。
チューニングの余地があるんでしょうが、
本番環境では常に負荷が低い方がよいこともあり、このままでも十分かも。
また、スナップショットのファイルサイズに感動ですね。
バックアップとか助かります。




2011年10月17日月曜日

CentOS 6.0 で daemontoolsが起動しない・・・、upstartでした



CentOS6では、daemontoolsの起動方法がupstartに変更になっていたのでメモ。

インストール直後は、svscanも起動せずsvcコマンドでエラーが出た。


svc -u /service/qmail
svc: warning: unable to control /service/qmail: file does not exist


しかし、svscanを直打ちすると起動するのでインストールは問題なさそう。


svscan /service &


よく見ると、upstartに関する記述がinittabにある・・・。


# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
----------- 途中 省略 -----------
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).


つまり、upstart使うようになったらしいので、再設定してみた。


コメントアウトする
vi /etc/inittab
#SV:123456:respawn:/command/svscanboot

vi /etc/init/svscan.conf


start on runlevel [12345]
respawn
exec /command/svscanboot


次のコマンドでsvscanを起動する
initctl reload-configuration
initctl start svscan


参考
http://upstart.ubuntu.com/cookbook/




2011年10月14日金曜日

PHP5.4beta1では、php_unserialize_data構造体メンバに変更があるみたい



PHP5.4beta1でMessagePackをインストールしようとしたところ。
やはりPHP5.4.0beta1に対応できていないためかmakeでこける。
最新のgitからもってきてもダメっぽいです。


git clone https://github.com/msgpack/msgpack.git
cd msgpack/php
phpize
./configure
make
make install

とにかくいろいろ怒られるけど、 request for member 'first' in something not a structure or unionばかりみたい。
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:66: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:80: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:82: error: request for member 'first' in something not a structure or union


5.4beta1がらみと思われるエラーなので、ソースをチェックしてみたところ、
構造体(php_unserialize_data)に変更がありました。
メンバが増えてる・・・。

ext/standard/php_var.hの差分を一部抜粋




struct php_unserialize_data {
void *first;
+ void *last;
void *first_dtor;
+ void *last_dtor;
};

-typedef struct php_unserialize_data php_unserialize_data_t;
+typedef struct php_unserialize_data* php_unserialize_data_t;



php_var.hの差分




diff -uNrp ./php-5.3.8/ext/standard/php_var.h ./php-5.4.0beta1/ext/standard/php_var.h
--- ./php-5.3.8/ext/standard/php_var.h 2011-01-01 11:19:59.000000000 +0900
+++ ./php-5.4.0beta1/ext/standard/php_var.h 2011-01-01 11:17:06.000000000 +0900
@@ -16,11 +16,12 @@
+----------------------------------------------------------------------+
*/

-/* $Id: php_var.h 306939 2011-01-01 02:19:59Z felipe $ */
+/* $Id: php_var.h 306938 2011-01-01 02:17:06Z felipe $ */

#ifndef PHP_VAR_H
#define PHP_VAR_H

+#include "ext/standard/basic_functions.h"
#include "ext/standard/php_smart_str_public.h"

PHP_FUNCTION(var_dump);
@@ -37,29 +38,70 @@ PHPAPI void php_var_export_ex(zval **str

PHPAPI void php_debug_zval_dump(zval **struc, int level TSRMLS_DC);

-/* typdef HashTable php_serialize_data_t; */
-#define php_serialize_data_t HashTable
+typedef HashTable* php_serialize_data_t;

struct php_unserialize_data {
void *first;
+ void *last;
void *first_dtor;
+ void *last_dtor;
};

-typedef struct php_unserialize_data php_unserialize_data_t;
+typedef struct php_unserialize_data* php_unserialize_data_t;

PHPAPI void php_var_serialize(smart_str *buf, zval **struc, php_serialize_data_t *var_hash TSRMLS_DC);
PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash TSRMLS_DC);

-#define PHP_VAR_SERIALIZE_INIT(var_hash) \
- zend_hash_init(&(var_hash), 10, NULL, NULL, 0)
-#define PHP_VAR_SERIALIZE_DESTROY(var_hash) \
- zend_hash_destroy(&(var_hash))
-
-#define PHP_VAR_UNSERIALIZE_INIT(var_hash) \
- (var_hash).first = 0; \
- (var_hash).first_dtor = 0
-#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash) \
- var_destroy(&(var_hash))
+#define PHP_VAR_SERIALIZE_INIT(var_hash_ptr) \
+do { \
+ if (BG(serialize).level) { \
+ (var_hash_ptr) = BG(serialize).var_hash; \
+ ++BG(serialize).level; \
+ } else { \
+ ALLOC_HASHTABLE(var_hash_ptr); \
+ zend_hash_init((var_hash_ptr), 10, NULL, NULL, 0); \
+ BG(serialize).var_hash = (var_hash_ptr); \
+ BG(serialize).level = 1; \
+ } \
+} while(0)
+
+#define PHP_VAR_SERIALIZE_DESTROY(var_hash_ptr) \
+do { \
+ if (BG(serialize).level) { \
+ if (!--BG(serialize).level) { \
+ zend_hash_destroy(BG(serialize).var_hash); \
+ FREE_HASHTABLE(BG(serialize).var_hash); \
+ BG(serialize).var_hash = NULL; \
+ } \
+ } else { \
+ zend_hash_destroy*1; \
+ } \
+} while (0)
+
+#define PHP_VAR_UNSERIALIZE_INIT(var_hash_ptr) \
+do { \
+ if (BG(unserialize).level) { \
+ (var_hash_ptr) = BG(unserialize).var_hash; \
+ ++BG(unserialize).level; \
+ } else { \
+ (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \
+ BG(unserialize).var_hash = (var_hash_ptr); \
+ BG(unserialize).level = 1; \
+ } \
+} while (0)
+
+#define PHP_VAR_UNSERIALIZE_DESTROY(var_hash_ptr) \
+do { \
+ if (BG(unserialize).level) { \
+ if (!--BG(unserialize).level) { \
+ var_destroy(&(var_hash_ptr)); \
+ efree*2; \
+ BG(unserialize).var_hash = NULL; \
+ } \
+ } else { \
+ var_destroy(&(var_hash_ptr)); \
+ } \
+} while (0)

PHPAPI void var_replace(php_unserialize_data_t *var_hash, zval *ozval, zval **nzval);
PHPAPI void var_push_dtor(php_unserialize_data_t *var_hash, zval **val);




エラーログの内容




/bin/sh /usr/local/src/msgpack/php/libtool --mode=compile cc -I. -I/usr/local/src/msgpack/php -DPHP_ATOM_INC -I/usr/local/src/msgpack/php/include -I/usr/local/src/msgpack/php/main -I/usr/local/src/msgpack/php -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/msgpack/php/msgpack_unpack.c -o msgpack_unpack.lo
cc -I. -I/usr/local/src/msgpack/php -DPHP_ATOM_INC -I/usr/local/src/msgpack/php/include -I/usr/local/src/msgpack/php/main -I/usr/local/src/msgpack/php -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib -DHAVE_CONFIG_H -g -O2 -c /usr/local/src/msgpack/php/msgpack_unpack.c -fPIC -DPIC -o .libs/msgpack_unpack.o
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:66: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:80: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:82: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_var_access':
/usr/local/src/msgpack/php/msgpack_unpack.c:96: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_stack_push':
/usr/local/src/msgpack/php/msgpack_unpack.c:130: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:144: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:146: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_stack_pop':
/usr/local/src/msgpack/php/msgpack_unpack.c:168: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_unserialize_var_init':
/usr/local/src/msgpack/php/msgpack_unpack.c:285: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:286: error: request for member 'first_dtor' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c: In function 'msgpack_unserialize_var_destroy':
/usr/local/src/msgpack/php/msgpack_unpack.c:294: error: request for member 'first' in something not a structure or union
/usr/local/src/msgpack/php/msgpack_unpack.c:314: error: request for member 'first_dtor' in something not a structure or union
make: *** [msgpack_unpack.lo] Error 1




*1:var_hash_ptr

*2:var_hash_ptr




2011年10月13日木曜日

iOS5アップデートでエラー3200、Macでは



iOS5のアップデートに失敗する人が多発しているようですね。
私もその1人でした。
さすが初日ですね。お祭りです。

3200というキーワードが飛び交っていますが、
Windows版でのiTunesでは、不明なエラーが発生しました(3200)。らしいですが、

Macではこのエラー。Aninternal error occureed.
f:id:ono51:20111013100708p:image

そして「詳しい情報」ボタンを飛ばし先
http://support.apple.com/kb/TS1275

また夜にチャレンジします。
それまでには落ち着いているかと。




2011年10月12日水曜日

TIME_WAITのチューニングとkernelリビルド for CentOS 6.0



久しぶりにSRPMからkernelリビルドしてみたので、
過去を振り返りつつ手順をメモ。

ソーシャルゲームや外部のAPIを使用するサービスなどにありがちなんですが、
Webサーバは、受けるHTTPリクエストが多くなると、
外部のWebサーバにHTTPリクエストを送る処理も多くなったりします。
その場合に問題となるのが、tcpのコネクションです。

TIME_WAIT状態のコネクションが多くなると、
接続できる数は上限があるので、接続できたりできなかったり不安定な状態になります。
そうなると、まあ担当者はかなりテンパってますね。
でも負荷的にはサーバはテンパってなかったりします。

TIME_WAIT多発対策はざっくり


  • サーバ増強

    • 緊急対応ということで、あくまで一時的な対応。富豪ならこれでよし。

  • 使用できるTCPポート番号を増やした

    • 増加量が上回る場合は、焼け石に水。

  • tcp_tw_recycleを有効にしてコネクションの再利用

    • パケットのタイムスタンプの影響で外部との通信で問題あり

  • TIME_WAITの値を60秒→15秒に変更

    • TIME_WAITが減り安定動作



そんなわけで、TIME_WAITのチューニングで落ち着きました。
CentOS 5.3でTIME_WAITを15秒にしたカーネルを数年利用していますが、
とくに問題もなく安定しています。

手間だったのは、
この設定変更をするためには、カーネルのリビルドが必要となるため、
全てのサーバに適用するため数台ずつ停止し少しずつ適用していきました。

以下、CentOS 6.0のTIME_WAIT 15秒版カーネルのリビルド手順です。
CentOS5.3の頃と手順はあまり変わらないですが、
少しパスの変更があったようです。


参考 centosとfedora projectのwiki
http://wiki.centos.org/HowTos/RebuildSRPM
http://fedoraproject.org/wiki/Building_a_custom_kernel


TIME_WAITのチューニングとkernelリビルド手順 for CentOS 6.0
1. rpmのビルドに必要なモジュールのインストール


yum install rpm-build.x86_64 \
redhat-rpm-config.noarch \
patchutils.x86_64 \
elfutils-libelf-devel.x86_64 \
binutils-devel.x86_64 \
hmaccalc.x86_64 \
rng-tools.x86_64

他にgccなども必要です


2. SRPM(カーネル)の入手と解凍


cd /usr/local/src
wget http://mirror.centos.org/centos/6.0/updates/SRPMS/kernel-2.6.32-71.29.1.el6.src.rpm
rpm -ivh kernel-2.6.32-71.29.1.el6.src.rpm


3. パッチの作成


■パッチ作成のためのソースをコピーする
cd ~/rpmbuild/SPECS
rpmbuild -bp kernel.spec
cd ~/rpmbuild/BUILD
cp -r ~/rpmbuild/BUILD/kernel-2.6.32-71.29.1.el6/linux-2.6.32-71.29.1.el6.x86_64 ~/rpmbuild/BUILD/kernel-2.6.32-71.29.1.el6.orig
cp -r ~/rpmbuild/BUILD/kernel-2.6.32-71.29.1.el6/linux-2.6.32-71.29.1.el6.x86_64 ~/rpmbuild/BUILD/kernel-2.6.32-71.29.1.el6.new


rpmbuild中にPGPの鍵作成に時間がかかりすぎる場合は、
次のコマンドを別コンソールで実行する。

rngd -r /dev/urandom

特にOS新規インストールのサーバは、この画面から進まない・・・。


### Now generating a PGP key pair to be used for signing modules.
### ---------------- 途中 省略 ---------------
### If one isn't available, the pseudo-random number generator can be used:
###
### rngd -r /dev/urandom
###
+ gpg --homedir . --batch --gen-key /root/rpmbuild/SOURCES/genkey
gpg: WARNING: unsafe permissions on homedir `.'




■tcp.hファイルを修正する
cd ~/rpmbuild/BUILD
vi kernel-2.6.32-71.29.1.el6.new/include/net/tcp.h

次の1行を修正する。(TIME_WAITを60秒→15秒)
修正前
#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
修正後
#define TCP_TIMEWAIT_LEN (15*HZ) /* how long to wait to destroy TIME-WAIT

■パッチを作成する
diff -uNrp kernel-2.6.32-71.29.1.el6.orig kernel-2.6.32-71.29.1.el6.new > ../SOURCES/tcph.patch


4. ビルドの準備


■パッチを適用するためkernel.specファイルを修正する
cd ~/rpmbuild/SPECS
vi kernel.spec

修正前
# % define buildid .local
修正後
%define buildid .tcp15

※新カーネルインストールの際にkernel-firmwareの同じbuildid版を要求されたのでやめました。

# empty final patch file to facilitate testing of kernel patches
Patch00: tcph.patch  ←追加
Patch999999: linux-kernel-test.patch

ApplyOptionalPatch tcph.patch  ←追加
ApplyOptionalPatch linux-kernel-test.patch

5. TIME_WAIT変更版カーネルのビルド


rpmbuild -ba kernel.spec


6. カーネルのアップデート


cd ~/rpmbuild/RPMS/x86_64
rpm -Uvh --force kernel-2.6.32-71.29.1.el6.x86_64.rpm kernel-2.6.32-71.29.1.el6.x86_64.rpm

再起動
reboot


7. TIME_WAITの確認


1秒間隔でウォッチ
watch -n 1 "netstat -a | grep http"

次のようにTIME_WAITになるので、
15秒後に消えたら動作しています。

Every 1.0s: netstat -a | grep http tcp 0 0 *:http *:* LISTEN
tcp 0 0 ::ffff:192.168.xxx.xxx:http ::ffff:192.168.xxx.xxx:30439 TIME_WAIT



以上、とくにかくリビルドに時間かかるので、時間に余裕があるときに放置しながらがよいかと思います。




2011年10月8日土曜日

Yamaha Steinberg FW Driver アンインストール for Mac



YamahaのLion正式対応を待っている今日この頃です。

とりあえず、正式対応するまでYamaha Steinberg FW Driverを削除したかったのですが、
アンインストーラーが見当たらない・・・

ない?
そんなはずは・・・

Mac版はWindows版の二の次のようです。

こんなところに情報ありました。
http://www2.yamaha.co.jp/manual/pdf/emi/japan/synth/fwdriver_ja_ig_d0.pdf

せめて最新ドライバーの配布ファイルに同梱してほしいところ。
削除するファイル数も多く、何度か使いそうだったのでバッチファイルを作ってみました。



rmコマンドで関連するファイルやディレクトリを削除するバッチファイルです。
このファイルを使用した場合の損害は一切保証できません。
利用する場合は、内容のわかる方のみ自己責任でお願いします。

■手順


  1. バッチファイルをダウンロードする

http://dl.dropbox.com/u/30648910/uninstall_yamaha_fw_driver.sh


  1. [アプリケーション]→[ユーティリティー]→[ターミナル]を起動する

  2. 次のコマンド入力して[enter]キーを押す


sudo sh $HOME/Downloads/uninstall_yamaha_fw_driver.sh
Password: 管理者のパスワードを入力して[enter]キーを押す



バッチファイルの内容は下記のとおり


rm -fr /Applications/Yamaha/FWDriver/Yamaha\ Steinberg\ FW\ Control\ Panel.app
rm -fr /Applications/Yamaha/FWDriver/YamahaFWCM.app
rm -fr /System/Library/Extensions/YamahaFWAudioDriver.kext
rm -fr /System/Library/Frameworks/YamahaFWEnabler.framework
rm -fr /User/$USER/LibraryPreference/com.yamaha.YamahaFWCM.plist
rm -fr /Library/Application\ Support/Yamaha/FWDriver/HAL/YamahaFWHAL.bundle
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_10000D.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_10000E.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_110006.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_110007.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_110008.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_110009.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_11000B.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_11000C.tiff
rm -f /Library/Audio/MIDI\ Devices/Yamaha/Images/FW_11000D.tiff
rm -fr /Library/Audio/MIDI\ Drivers/YamahaFWMIDI.plugin
rm -fr /Library/LaunchAgents/com.yamaha.YamahaFWCM.plist
rm -fr /Library/PreferencePanes/Yamaha Steinberg FW.prefPane
rm -fr /Library/Preferences/com.yamaha.FWDriver.plist
rm -fr /Library/Receipts/YamahaFWAudioDriver.pkg
rm -fr /Library/Receipts/YamahaFWCM.pkg
rm -fr /Library/Receipts/YamahaFWCP.pkg
rm -fr /Library/Receipts/YamahaFWDriverplist.pkg
rm -fr /Library/Receipts/YamahaFWEnabler.pkg
rm -fr /Library/Receipts/YamahaFWHAL.pkg
rm -fr /Library/Receipts/YamahaFWMIDIIcon.pkg
rm -fr /Library/Receipts/YamahaFWMIDIPlugIn.pkg





2011年10月7日金曜日

bashのログインシェル



環境変数の設定の際、忘れていたのでメモ

bashのログインシェルは次の順序で読み込まれる
(CentOS 6.0のbash環境)


  1. /etc/profile

  2. /etc/profile.d/*.sh

  3. $HOME/.bash_profile

  4. $HOME/.bashrc

  5. /etc/bashrc



suやscreenを起動した場合


  1. $HOME/.bashrc

  2. /etc/bashrc

  3. /etc/profile.d/*.sh




同様の記事を見つけた。


bashが起動時に実行するファイル

http://www.itmedia.co.jp/enterprise/articles/0803/10/news012.html




とりあえずruby1.9.2でもインストールしてみるか



環境構築する機会があるので、
rubyをインストールしてみた。

複数バージョンを切り替えられるのが最近の主流
ということでRuby Version Manager (以下rvm)の導入から

ワンライナーのインストールも定番かも。


bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )


参考 http://beginrescueend.com/rvm/install/


追記 事前にインストール済みのモジュール
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel
yum install -y make bzip2 autoconf automake libtool bison
yum install -y iconv-devel
iconvは別途ソースコードからインストール済み


あとはrvmを使って各バージョン毎にインストールする

rvm install 1.8.7-p352
rvm install 1.9.2-p290

環境変数再読み込み
source /etc/profile
→/etc/profile.d/rvm.shがインストールされるため

1.9.2を使う設定
rvm use 1.9.2-p290

パスを確認すると
echo $PATH
/usr/local/rvm/gems/ruby-1.9.2-p290/bin:/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin:/usr/local/rvm/rubies/ruby-1.9.2-p290/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

なるほど。
パスの切り替えで使用するバージョンの切り替えているのか。

インストール済みの確認
ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]

1.8.7も試してみる
rvm use 1.8.7-p352
ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
echo $PATH
/usr/local/rvm/gems/ruby-1.8.7-p352/bin:/usr/local/rvm/gems/ruby-1.8.7-p352@global/bin:/usr/local/rvm/rubies/ruby-1.8.7-p352/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


------------------------------
ちなみに最初に1.9.2をインストールしようとしたら怒られた

rvm install 1.9.2
ERROR: Error running 'make ', please read /usr/local/rvm/log/ruby-1.9.2-head/make.log
ERROR: There has been an error while running make. Halting the installation.

make.logの内容を抜粋
echo executable host ruby is required. use --with-baseruby option.; false -I. ./tool/compile_prelude.rb ./prelude.rb miniprelude.c
executable host ruby is required. use --with-baseruby option.
make: *** [miniprelude.c] エラー 1

rubyをビルドするためのrubyが必要なんだそうだ。
まじすか!




2011年10月6日木曜日

PHP 5.4.0 beta1 にxdebugをインストール



PHP5.4でレガシー機能が削除された影響か?xdebugのmakeでエラーが出まくり・・・・

さすがにまだ対応していないかなと思ってみたものの、
最後の望みgitリポジトリを召喚しました。

git clone https://github.com/derickr/xdebug.git
cd xdebug
phpize
./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-config
make
make install

無事インストールに成功しました。


ちなみにエラー出まくりのログ
------------------------------
/usr/local/src/xdebug-2.1.2/php_xdebug.h:247: error: expected specifier-qualifier-list before ‘php_output_globals’
/usr/local/src/xdebug-2.1.2/xdebug.c:277: error: ‘zend_xdebug_globals’ has no member named ‘profiler_aggregate’
/usr/local/src/xdebug-2.1.2/xdebug.c:297: error: ‘zend_xdebug_globals’ has no member named ‘do_scream’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_silence_handler’:
/usr/local/src/xdebug-2.1.2/xdebug.c:437: error: ‘zend_xdebug_globals’ has no member named ‘do_scream’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_include_or_eval_handler’:
/usr/local/src/xdebug-2.1.2/xdebug.c:448: error: ‘znode_op’ has no member named ‘u’
/usr/local/src/xdebug-2.1.2/xdebug.c:448: error: request for member ‘constant’ in something not a structure or union
/usr/local/src/xdebug-2.1.2/xdebug.c:448: error: request for member ‘value’ in something not a structure or union
/usr/local/src/xdebug-2.1.2/xdebug.c:448: error: request for member ‘lval’ in something not a structure or union
/usr/local/src/xdebug-2.1.2/xdebug.c:448: 警告: ポインタと整数との比較を行なっています
/usr/local/src/xdebug-2.1.2/xdebug.c:454: 警告: passing argument 2 of ‘xdebug_get_zval’ from incompatible pointer type
/usr/local/src/xdebug-2.1.2/xdebug_var.h:57: note: expected ‘struct znode *’ but argument is of type ‘union znode_op *’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘zm_startup_xdebug’:
/usr/local/src/xdebug-2.1.2/xdebug.c:490: error: ‘zend_xdebug_globals’ has no member named ‘aggr_calls’
/usr/local/src/xdebug-2.1.2/xdebug.c:490: 警告: passing argument 1 of ‘_zend_hash_init_ex’ from incompatible pointer type
/usr/local/php/include/php/Zend/zend_hash.h:100: note: expected ‘struct HashTable *’ but argument is of type ‘const struct zend_ini_entry (*)[1]’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘zm_shutdown_xdebug’:
/usr/local/src/xdebug-2.1.2/xdebug.c:608: error: ‘zend_xdebug_globals’ has no member named ‘profiler_aggregate’
/usr/local/src/xdebug-2.1.2/xdebug.c:618: error: ‘zend_xdebug_globals’ has no member named ‘aggr_calls’
/usr/local/src/xdebug-2.1.2/xdebug.c:618: 警告: passing argument 1 of ‘zend_hash_destroy’ from incompatible pointer type
/usr/local/php/include/php/Zend/zend_hash.h:101: note: expected ‘struct HashTable *’ but argument is of type ‘const struct zend_ini_entry (*)[1]’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘add_used_variables’:
/usr/local/src/xdebug-2.1.2/xdebug.c:942: error: ‘zend_op_array’ has no member named ‘size’
/usr/local/src/xdebug-2.1.2/xdebug.c:942: 警告: ポインタと整数との比較を行なっています
/usr/local/src/xdebug-2.1.2/xdebug.c:946: error: ‘znode_op’ has no member named ‘op_type’
/usr/local/src/xdebug-2.1.2/xdebug.c:946: 警告: ポインタと整数との比較を行なっています
/usr/local/src/xdebug-2.1.2/xdebug.c:947: error: ‘znode_op’ has no member named ‘u’
/usr/local/src/xdebug-2.1.2/xdebug.c:947: error: request for member ‘var’ in something not a structure or union
/usr/local/src/xdebug-2.1.2/xdebug.c:947: 警告: passing argument 2 of ‘zend_get_compiled_variable_name’ makes integer from pointer without a cast
/usr/local/php/include/php/Zend/zend_compile.h:418: note: expected ‘zend_uint’ but argument is of type ‘const struct zend_ini_entry *’
/usr/local/src/xdebug-2.1.2/xdebug.c:947: 警告: assignment discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug.c:950: error: ‘znode_op’ has no member named ‘op_type’
/usr/local/src/xdebug-2.1.2/xdebug.c:950: 警告: ポインタと整数との比較を行なっています
/usr/local/src/xdebug-2.1.2/xdebug.c:951: error: ‘znode_op’ has no member named ‘u’
/usr/local/src/xdebug-2.1.2/xdebug.c:951: error: request for member ‘var’ in something not a structure or union
/usr/local/src/xdebug-2.1.2/xdebug.c:951: 警告: passing argument 2 of ‘zend_get_compiled_variable_name’ makes integer from pointer without a cast
/usr/local/php/include/php/Zend/zend_compile.h:418: note: expected ‘zend_uint’ but argument is of type ‘const struct zend_ini_entry *’
/usr/local/src/xdebug-2.1.2/xdebug.c:951: 警告: assignment discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_throw_exception_hook’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1017: 警告: passing argument 2 of ‘xdebug_hash_extended_find’ discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug_hash.h:68: note: expected ‘char *’ but argument is of type ‘const char *’
/usr/local/src/xdebug-2.1.2/xdebug.c:1019: 警告: passing argument 6 of ‘xdebug_globals.context.handler->remote_breakpoint’ discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug.c:1019: note: expected ‘char *’ but argument is of type ‘const char *’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_execute’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1217: 警告: passing argument 1 of ‘xdebug_profiler_init’ discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug_profiler.h:27: note: expected ‘char *’ but argument is of type ‘const char *’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_execute_internal’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1349: 警告: passing argument 1 of ‘xdebug_zval_ptr’ from incompatible pointer type
/usr/local/src/xdebug-2.1.2/xdebug_compat.h:41: note: expected ‘struct znode *’ but argument is of type ‘union znode_op *’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_compile_file’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1388: error: ‘zend_op_array’ has no member named ‘done_pass_two’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘zif_xdebug_break’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1564: 警告: assignment discards qualifiers from pointer target type
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘zif_xdebug_dump_aggr_profiling_data’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1642: error: ‘zend_xdebug_globals’ has no member named ‘profiler_aggregate’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘zif_xdebug_clear_aggr_profiling_data’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1659: error: ‘zend_xdebug_globals’ has no member named ‘profiler_aggregate’
/usr/local/src/xdebug-2.1.2/xdebug.c:1663: error: ‘zend_xdebug_globals’ has no member named ‘aggr_calls’
/usr/local/src/xdebug-2.1.2/xdebug.c:1663: 警告: passing argument 1 of ‘zend_hash_clean’ from incompatible pointer type
/usr/local/php/include/php/Zend/zend_hash.h:102: note: expected ‘struct HashTable *’ but argument is of type ‘const struct zend_ini_entry (*)[1]’
/usr/local/src/xdebug-2.1.2/xdebug.c: In function ‘xdebug_statement_call’:
/usr/local/src/xdebug-2.1.2/xdebug.c:1698: 警告: assignment discards qualifiers from pointer target type
make: *** [xdebug.lo] エラー 1