Tags

Recent Entries

Recent Comments

Recent Trackback

Feeds

More Links


タグ:「tips」の記事一覧

PHPのURLマッピング

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]

.htaccess


Options +FollowSymLinks
IndexIgnore */*
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

index.php


base = parse_url($_SERVER['SCRIPT_NAME']);
$uri = parse_url($_SERVER['REQUEST_URI']);
$base = split('/', $base['path']);
$uri = split('/', $uri['path']);
$params = array_values(array_diff_assoc($uri, $base));


これでおk?
Posted by: simpraight at 2007/04/04 22:22:18 | Tags: [php] [tips] | Comments:106 | Trackbacks:0

このコマンドを処理するのに必要な記憶域をサーバーに確保できません

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
レジストリエディタで

HKLM\System\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\IRPStackSize



10進で12とか15とかに設定すればおk。たぶん悪いのはノートン先生。悪気はないと思う。
Posted by: simpraight at 2007/03/05 17:57:34 | Tags: [嵌る] [tips] | Comments:13 | Trackbacks:0

Safariのデバッグメニューを有効にする

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
defaults write com.apple.Safari IncludeDebugMenu -bool true

でいけるらしい。知らなんだ。
Posted by: simpraight at 2007/02/19 22:43:58 | Tags: [tips] | Comments:34 | Trackbacks:0

NagiosのnrpeプラグインでMysqlの監視

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
Nagiosのnrpeプラグイン使ってリモートのサーバを色々監視できます。
プラグインはバイナリだったりperlでかかれてたりするんですが基本的に実行してステータスを返すことができたら何でもよいらしいので、phpで書いてみました。

check_mysql.php


#!/opt/php5/bin/php -q
<?php
$u = array_search('-u', $argv);
$p = array_search('-p', $argv);
$d = array_search('-d', $argv);
$P = array_search('-P', $argv);
$H = array_search('-H', $argv);
$S = array_search('-S', $argv);

$user = ($u) ? $argv[$u+1] : '';
$password = ($p) ? $argv[$p+1] : '';
$database = ($d) ? $argv[$d+1] : '';
$port = ($P) ? $argv[$P+1] : '3306';
$host = ($H) ? $argv[$H+1] : 'localhost';

################################################
# connect check
################################################
$db = mysql_connect("{$host}:{$port}", $user, $password) || die("CRITICAL: ".mysql_errno().":".mysql_error()."\n");
mysql_select_db($database) || die("CRITICAL: ".mysql_errno().":".mysql_error()."\n");
################################################
# status check
################################################
$result = mysql_query("SHOW STATUS");
$status = mysql_fetch_assoc($result);
if(mysql_errno())
die("CRITICAL: ".mysql_errno().":".mysql_error()."\n");
################################################
# slave check
################################################
if($S){
$result = mysql_query("SHOW STATUS");
$status = mysql_fetch_assoc("SHOW SLAVE STATUS");
if(mysql_errno())
die("CRITICAL: ".mysql_errno().":".mysql_error()."\n");
if($status['slave_io_running']!='Yes' && $status['slave_sql_running']!='Yes')
die("CRITICAL: Slave_IO_Running = ".$status['slave_io_running'].", Slave_SQL_Running = ".$status['slave_sql_running']."\n");
}

exit("STATUS OK\n");
?>


# check_mysql.php -u [接続ユーザ名] -p [パスワード] -d [データベース名] -P [ポート番号] -H [ホスト名]
Status OK


でチェックできます。スレーブのチェックをしたい場合はオプションに「-S」を付ければおk。

nrpeから呼び出して使用する場合は、
サーバ側(nagiosサーバ)で、
# sudo vi /etc/nagios/services.cfg
define service{
use generic-service
host_name [ホスト名1,ホスト名2,...]
service_description Mysql Status
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups [コンタクトグループ名]
notification_interval 120
notification_period 24x7
notification_options w,u,c,r
check_command check_nrpe!check_mysql_php
}

のようにサービスの定義をした上で、クライアント側(監視されるサーバ)に上記phpスクリプトを作成し
# sudo vi /etc/nagios/nrpe.cfg
command[check_mysql_php]=/usr/lib/nagios/plugins/check_mysql.php -u [ユーザ名] -p [パスワード] -d [DB名]
 ↑
この記述を追加

とすれば監視可能になります。
Posted by: simpraight at 2007/01/04 13:19:00 | Tags: [server] [tips] | Comments:7 | Trackbacks:0

courieer-imap + postfix + mysql + smtp auth

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
嵌りどころ。

・mysqlに保存するパスワードはplaintextに
・smtpはjail環境で動かさない。

# tail /var/log/mail.log
warning: SASL authentication failure: cannot connect to Courier authdaemond: No such file or directory

こんなエラーが出てる場合は、

# vi /etc/postfix/master.cf
smtp inet n - - - - smtpd
 ↓
smtp inet n - n - - smtpd


とりあえずこれで動作しますがセキュリティ的にはもちろん微妙。。
Posted by: simpraight at 2006/12/09 02:17:28 | Tags: [嵌る] [server] [tips] | Comments:1 | Trackbacks:0

複数のJavascriptファイルを圧縮して出力するSmartyプラグイン

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
つくりました。

とりあえずプラグインのソース。
<?php
/*
* Smaryプラグイン # JavaScriptファイルを圧縮してファイルを生成しファイルを出力
*
* @params array $params パラメータ
* @params object $smarty 親Smartyオブジェクト
* @return string scriptタグ
*/
function smarty_function_build_javascript($params, &$smarty)
{
if(!is_array(($smarty->_file_js))) return "<!-- No input files. -->";
$output = '';
foreach($smarty->_file_js as $js){ $output .= "\n".file_get_contents($js); }
$outfile = "script/build/".md5($output).".js";
if($params['output']=='file' && is_file($outfile))
return "<script type='text/javascript' src='{$outfile}'></script>";
// compress
$p = array(
"/[\r\n]+/", "/^[\s\t]*\/\/.+$/m", "/\/\*.+?\*\//s",
"/([\{\(\[,;=\?:\-\+\/\*])\n+/", "/[\s\t]*([\{\(\[,;=\+\*-<>\|\&\?\:!])[\s\t]*/", "/\n\}/","/(\})\n(return)/",
"/^[\s\t]+/m", "/[\s\t]+$/m", "/[\s\t]{2,}/",
);
$r = array (
"\n", "", "",
"$1", "$1", "}","$1$2",
"", "", "",
);
do{$output=preg_replace($p,$r,$output);}while($output!=preg_replace($p,$r,$output));
if($params['output']=='file') {
$fp = @fopen($outfile, "w+");
if(!$fp || !fwrite($fp, $output)) return "<!-- Error -->";
fclose($fp);
return "<script type='text/javascript' src='{$outfile}'></script>";
} else{
return "<script type='text/javascript'>".$output."</script>";
}
}

使い方は以下のような感じでSmartyのクラスを作成した上で、
<?php
class extSmarty extends Smarty{
var $_file_js;
function extSmarty (){
$this->_file_js = array();
// 以下は環境設定。説明は省略
$this->template_dir = SMARTY_TEMPLATE_DIR;
$this->config_dir = SMARTY_CONFIG_DIR;
$this->compile_dir = SMARTY_COMPILE_DIR;
$this->cache_dir = SMARTY_CACHE_DIR;
$this->left_delimiter = SMARTY_LEFT_DELIM;
$this->right_delimiter = SMARTY_RIGHT_DELIM;
// プラグインを登録
$this->register_function('build_javascript' ,'smarty_function_build_javascript');
}
/**
* Javascriptファイルを追加
*
* @param string $script SCRIPTファイル名
*/
function addJs($js){
if(is_array($js)) foreach($js as $v) $this->addJs($v);
if(is_file($js)) $this->_file_js[] = $js;
}
}

メインプログラムからは以下のように記述し、
<?php
$tpl = new extSmarty();
$tpl->addJs('script/prototype.js');
$tpl->addJs('script/moo.fx.js');

$tpl->display('example.tpl');

テンプレートファイルに以下のように書けばおk。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-script-type" content="text/javascript; charset=UTF-8" />
<meta http-equiv="content-style-type" content="text/css; charset=UTF-8" />
<base href="http://.../" />・・・①
<title>example</title>
<{build_javascript output=file}>・・・②
</head>
<body>
...
</body>
</html>

①・・・「<base href="~">」を設定しておいた方が階層深くなっても対応できて無難です。
②・・・Smartyのデリミタは基本的に「<{~}>」に設定して使っています。「output=file」をのけるとファイルを生成せずに<script>~</script>に出力します。


とりあえず取得した内容のmd5を取り、変更がある場合だけファイルを再生成するようにしています。
この方法だと、「script/build」内に古いファイルがどんどん溜まっていくわけですが・・・なんとかなりませんかね。
Posted by: simpraight at 2006/12/04 12:36:13 | Tags: [php] [javascript] [tips] | Comments:17 | Trackbacks:0

PHPでJavascriptを圧縮する

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
簡単な関数でJavascriptの圧縮をします。
ネットワーク負荷の気になる環境下では基本的にmod_deflate使ってる場合が多いのでgzip圧縮は既に導入済み。であれば、あとは正規表現使って不要な改行や空白などを除去し少しでも元のスクリプトファイルを軽量化するくらいのものです。

軽量化したものは同時に難読化されてしまうので開発環境下では元のファイルを使用して、本番環境では圧縮したファイルを使えるようにSmartyプラグインを作成しておくと結構嬉しいです。(あとで作る)

サンプル→PHPでJavascriptを圧縮する

function jsCompresser($js){
$p = array(
"/[\r\n]+/",
"/^[\s\t]*\/\/.+$/m",
"/\/\*.+?\*\//s",
"/([\{\(\[,;=])\n+/",
"/[\s\t]*([\{\(\[,;=\+\*-<>\|\&\?\:!])[\s\t]*/",
"/\n\}/",
"/^[\s\t]+/m",
"/[\s\t]+$/m",
"/[\s\t]{2,}/",
);
$r = array (
"\n",
"",
"",
"$1",
"$1",
"}",
"",
"",
"",
);
do{$js=preg_replace($p,$r,$js);}while($js!=preg_replace($p,$r,$js));
return $js;
}
Posted by: simpraight at 2006/12/02 17:16:36 | Tags: [php] [javascript] [tips] | Comments:1,162 | Trackbacks:1

rsyncでコピーしたHDDから起動する

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
rsyncでパーティションまるごとコピーする」のシェルスクリプトでcron走らせて日次バックアップをしている状況で、プライマリのHDDが故障した場合rsyncでまるごとミラーリングコピーしたセカンダリのHDDをプライマリに差し替えて起動すればうまくいくかといえばそううまくはいきません。

ハードウエアでRAIDできる環境であればこんな事心配する必要はないんですが、何しろSunのNetraT1+Debian(SPARC)な環境だったりすると簡単にはRAIDボードなんて挿せないワケですからこういう事も考えておかなければなりません。
もちろんソフトウエアRAIDとかへの移行が可能な場合や、既に運用している場合はそれで良いと思います。
この場合はハードウエア追加・ソフトウエアRAID構成への変更が困難な環境で、とりあえずrsyncでバックアップするしかない淋しい状況下での話。

とりあえず、ブートローダが何なのかによりますが、当環境(NetraT1+Debian)では問答無用で「SILO」です。

試しに何も小細工なしにHDDを入れ替えてブートしてみます。
Boot device: /pci@1f,0/pci@1,1/scsi@2/disk@0,0:a File and args.
:217: The file just loaded does not appear to be excutable.

はい無理。まぁ当たり前ですけど。
ブートローダ(SILO)が無いとどうしようもないのでインストールCDからブートしてみます。
ok boot cdrom
Boot device: /pci@1f,0/pci@1/pci@1/ide@e/cdrom@2:a File and args.
SILO Version 1.4.9
\
boot:

とSILOが上がってくるのでブートパラメータを
boot: /pci@1f,0/pci@1,1/scsi@2/disk@0,0:a;1/boot/vmlinuz root=/dev/sda4
initrd=/pci@1f,0/pci@1,1/scsi@2/disk@0,0:a;1/boot/initrd.img
※実際は改行無し。

な感じで入力してブートすると無事起動することができました。
また、次回からこの操作をしなくても良いようにブートローダを設定しておきます。
# silo -f -C /boot/silo.conf
Posted by: simpraight at 2006/12/01 15:20:49 | Tags: [server] [tips] | Comments:0 | Trackbacks:0

rsyncでパーティションまるごとコピーする

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
再利用の為にメモ。
#!/bin/sh

echo "`date +%Y-%m-%d\ %k:%M:%S`: start syncing" >> /var/log/backup.log

if [ ! -d "/mnt/sdb" ]; then
mkdir /mnt/sdb
fi
/bin/mount -t xfs /dev/sdb3 /mnt/sdb 2>> /var/log/backup.log

if [ ! -d "/mnt/sdb/boot" ]; then
mkdir /mnt/sdb/boot
fi
/bin/mount -t ext3 /dev/sdb1 /mnt/sdb/boot 2>> /var/log/backup.log


/usr/bin/rsync -aH --delete \
--exclude=/proc \
--exclude=/sys \
--exclude=/mnt \
/* /mnt/sdb

if [ ! -d "/mnt/sdb/proc" ]; then
mkdir /mnt/sdb/proc
fi
if [ ! -d "/mnt/sdb/sys" ]; then
mkdir /mnt/sdb/sys
fi
if [ ! -d "/mnt/sdb/mnt" ]; then
mkdir /mnt/sdb/mnt
mkdir /mnt/sdb/mnt/boot
fi

/bin/umount /mnt/sdb/boot 2>> /var/log/backup.log
/bin/umount /mnt/sdb 2>> /var/log/backup.log

echo "`date +%Y-%m-%d\ %k:%M:%S`: end syncing" >> /var/log/backup.log

rsyncの「-H」って付ける方が良いのか付けない方が良いのか。。

参考:rsyncで自動バックアップ
Posted by: simpraight at 2006/11/30 17:44:33 | Tags: [server] [tips] | Comments:0 | Trackbacks:0

スクロールバーを左に。

[Permalink] [Post to del.icio.us] [Post to hatena] [Post to livedoorClip]
デザインをLDRっぽくフレーム風にしました。一応ブラウザサイズによって可変するような感じです。
で左のツリー部分のスクロールバーが左側に表示されてたのを見て、「見やすいよなぁコレ」とか思っていたんですが、やり方とかは特に気にしてませんでした。
てっきりJavascriptで裏技的にやってるのかと思いきや、CSSで簡単にできるんですね。
<div id="side"><div class="container">
~リスト~
</div></div>

最近の流行りだと、こんな感じでサイド部分を作ると思うんですが、普通に「overflow:scroll」させると当然右側にスクロールバーが表示されます。そこで、
#side {
width: 200px;
height: 800px;
overflow: auto;
overflow-y: scroll;
direction: rtl;
}
#side .container {
padding: 5px;
direction: ltr;
}

とすると、スクロールバーは左側になります。実におしゃれ。
「#side」には文章の方向を「RightToLeft(右から左)」にしスクロールバーの表示を逆転させて、コンテナ部分は通常通り「LeftToRight(左から右)」に戻す。頭良いコレ。
Posted by: simpraight at 2006/11/20 18:58:52 | Tags: [css] [tips] | Comments:1 | Trackbacks:0