2010.04.01

Category: Shell / Tags:

rsync Missing trailing-” in remote-shell command. ってなるばあい

shellとかで、rsync を利用していて。

Missing trailing-” in remote-shell command.
rsync error: syntax or usage error (code 1) at main.c(335) [sender=2.6.8]

と出る場合の対処法。

RSYNC_RSH=”/usr/bin/ssh -i /home/username/.ssh/backup.key”
export RSYNC_RSH

として、sshの部分を環境変数に入れてしまえばOK

上記をおこなうと、
RSYNC=’/usr/bin/rsync -avz –rsh=”ssh -i /home/username/.ssh/backup.key”‘
と書いていたところが
RSYNC=’/usr/bin/rsync -avz’
でよくなる。

スクリプトの解釈で、ダブルコーテーションとかの部分で上手く処理できてないみたいです。
rsyncが。

2010.02.10

Category: Apache, Command, Shell / Tags:

logrotateで日付付のログをバックアップする。

過去に
「logrotate & bash で日付付のログをバックアップする。」
っていうのをメモっているけど、別ファイルのbashをつくるのもめんどうなのでより簡単メモ

/var/log/httpd/*log {
daily
rotate 10
create
compress
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
EXT=date +%Y%m%d -d ‘1 days ago’
for f in $1;
do mv $f.1.gz $f.$EXT.gz;
done
endscript
}

EXT=date +%Y%m%d -d ‘1 days ago’
for f in $1;
do mv $f.1.gz $f.$EXT.gz;
done

が追加分、corn では、通常4時2分に起動するので、基本的に前日の日付をつけておく。
でもって、ローテートしたファイルをリネームしているだけ、
これだと、本来、「rotate 10」のところは、1でもいいのだけど、念のための保険で10回
にしているだけです。
こっちの方が簡単だな。

追記:2010.02.23
EXT=date +%Y%m%d -d ‘1 days ago’
の部分をそのままコピペすると、WPが変換かけてるのでうごきません。
「1 days ago」をシングルコーテーションで囲み直して、
「date +%Y%m%d -d ‘1 days ago’」全体を実行演算子で囲んでください。

でもって、バージョンの違いかわからないけど、compress が postrotate
の後に行われる場合がある。こうなると日付のファイル名にリネーム
できなくなる。(gzで圧縮した後のファイル名をリネームしようとしてるので)

という事で、さらに改訂。compressをlogrotateにまかせずに。

/var/log/httpd/*/*log {
daily
rotate 10
create
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
EXT=date +%Y%m%d -d ‘1 days ago’
for f in $1;
do
if [ -e $f.1 ] ; then
gzip $f.1;
mv $f.1.gz $f.$EXT.gz;
fi
done
endscript
}

といった形で、postrotateのなかでしてしまう。先に、killプロセス送っているので
ログも新しいファイルに書き出されているので、圧縮中のログが消える心配も
ないので、こちらの方がいいかも。

2009.09.03

Category: CakePHP / Tags:

cakephp Behavior の動的呼び出し

環境によって少しずつ違うみたいなのでメモ、
php5の環境で
modelの中から、actsAsを使わずに呼び出す場合は、
$this->Behaviors->attach(’Convert’);
$this->getConvertData( $data );//getConvertDataは、ConvertBehaviorの中のメソット
で、OK。

2009.08.06

Category: PHP / Tags: ,

phpの try and catch のサンプル

挙動の確認の為のサンプル
ini_set("display_errors","on");
class a
{
function aa()
{
$bool = false ;
if($bool){
//何かの処理
}else{
throw new Exception('error message');
}
}
}
class b extends a
{
function bb()
{
try{
$a = new a();
$a->aa();
}catch(Exception $e){
throw $e ;
}
}
}
class c extends b
{
function cc()
{
try{
$b = new b();
$b->bb();
}catch(Exception $e){
$this->_catchError($e);
}
}
function _catchError($e)
{
$error = “”;
$error .= “
\n”;
$error .= “Catch error in “. $e->getFile() . “ on line ” . $e->getLine() . “
\n”;
$error .= $e->getMessage() . “
\n”;
$error .= “trace
\n”;
$trace = $e->getTrace();
foreach($trace as $key => $val){
$error .= ““. $val['file'] . “ on line ” . $val['line'] . “
.” in class = {$val['class']}”
.”, function = {$val['function']}”
.”, type = {$val['type']}”
.”, function ={$val['function']}”
// .”, args = ” . print_r($val['args'])
. “
\n”
;
}
print_r($e);
print $error ;
       // mailが飛べば本番も安心だね
// mail(’admin@ecamlpe.com’,'php error’, $error);
}
}
$c = new c();
$c->cc();

2009.07.16

Category: PHP / Tags:

自分メモ 配列と文字列の切り替え

/**
* 文字列を配列に変換 (ここに有るべきでない)
* @parame $str string 配列になるべき文字列_(アンダースコア)つなぎ
* @return array _(アンダースコア)をデミタリにされた配列
*/
function getStrToArray($str)
{
$ary = explode( “_”, substr($str,1,-1) );
$a = “”;
if( is_array($ary) ){
foreach( $ary as $value ){
$a[] = $value ;
}
}
return $a ;
}
/**
* 配列を文字列に変換 (ここに有るべきでない)
* @parame array _(アンダースコア)をデミタリにされた配列
* @return $str string 配列になるべき文字列_(アンダースコア)つなぎ
*/
function getArrayToStr($ary)
{
if( is_array($ary) ){
$str = “_”. implode(”_”,$ary) . “_” ;
}else{
$str = “__”;
}
return $str ;
}

2009.04.17

Category: PHP / Tags:

Hyper Estraier を phpからつかってみる(検索のみ)

http://page2.xrea.jp/
に、ノード API の Pure PHP クラスライブラリ EstraierPure があったので、これを利用して
Hyper Estraier をつかってみる。
でだしは、MTの検索が重いので、全文検索のnamazuを利用していたのだけど、つかいこなして
ないこともあって、いまいち検索結果がピンとこない。
てことで、文章ドラフトをつくれる、Hyper Estraierで、やってみようかとというところと,
PHP Namazu モジュールでは、URIを指定しての検索ができない(つまりはブロガー指定の検索ができない)ので、

一応、Cのソースまで見てみたのですが、実装ができてないみたいだったので、できるならごめんなさい。
自分で実装すれば、っていうのも今回はなしで。

P2Pあたりの機能で実装できそうなこちらにチャレンジしてみます。
ブログ登録があると自動で検索対象にしてくれるモジュールがあるのも決めてでした。
namazuだと、毎日indexの更新するcronが動くまでまたないといけなかったので。
下記にドキュメントはあるのですが
http://page2.xrea.jp/doc/all/index.php?package=Services_HyperEstraier
多くの人がとりあえず、indexの生成とかは、サーバーがわのシェルスクリプトとかでやって
検索インターフェイスの実装だけをしたいと思うので、(というかおいらが)その分のメモ書き
現状の検索は
html -> js(ajax) -> api -> namazu -> api -> js -> html
のながれで、jsから、apiにアクセスして、apiが内部でnamazuの検索結果を取得して、XML
に変換して返しているので、この aip の書き直しと namazuを hyper estraier への移行で
対応したいと思います。
Class HyperEstraier_Condition が検索で主に使われるクラスになります。
簡単なながれで、
1.検索のオプション値(検索ワード、表示順、取得数)を設置して、
2.検索メソット(serach)にアクセスして、結果を取得
3.取得したデータを加工して表示
  (xmlでも結果を取得できるので上手くいけばいらないかもしれない)
を想定
HyperEstraier_Conditionの初期値(つまりは、検索の初期値)は、下記の通り
//初期値
$this->phrase = null;
$this->attrs = array();
$this->order = null;
$this->max = -1;
$this->skip = 0;
$this->options = 0;
$this->auxiliary = 32;
$this->distinct = null;
$this->mask = 0;
それぞれ、setterとgetterのメソットがあるので、あとはそれらを利用して自由に検索してください。
簡易一覧 – そのうち適当な日本語に置き換える予定
function_name param の順です
//Set the search phrase.
set_phrase($phrase) (string $phrase A search phrase.) void
//Add an expression for an attribute.
add_attr($expr) (string $expr A search expression.) void
//Set the order of a condition object.
set_order($order) (string $order An expression for the order. By default, the order is by score descending.) void
//Set the maximum number of retrieval.
set_max($max) (int $max The maximum number of retrieval. By default, the number of retrieval is not limited.) void
//Set the number of documents to be skipped.
set_skip($skip) (int $skip The number of documents to be skipped. By default, it is 0.) void
//Set options of retrieval.
set_options($options) (int $options Options: * – ESTRAIERPURE_CONDITION_SURE’ specifies that it checks every N-gram key. * – ESTRAIERPURE_CONDITION_USUAL’, which is the default, * specifies that it checks N-gram keys with skipping one key. * – ESTRAIERPURE_CONDITION_FAST’ skips two keys. * – ESTRAIERPURE_CONDITION_AGITO’ skips three keys. * – “ESTRAIERPURE_CONDITION_NOID” F’ specifies not to perform TF-ID F tuning. * – ESTRAIERPURE_CONDITION_SIMPLE’ specifies to use simplified phrase. * – ESTRAIERPURE_CONDITION_ROUGH’ specifies to use rough phrase. * – ESTRAIERPURE_CONDITION_UNION’ specifies to use union phrase. * – ESTRAIERPURE_CONDITION_ISECT’ specifies to use intersection phrase. * Each option can be specified at the same time by bitwise or. * If keys are skipped, though search speed is improved, the relevance ratio grows less.) void
//Set permission to adopt result of the auxiliary index.
set_auxiliary($min) (int $min The minimum hits to adopt result of the auxiliary index. If it is not more than 0, the auxiliary index is not used. By default, it is 32.) void
// Set the attribute distinction filter.
set_distinct($name) (string $name The name of an attribute to be distinct.) void
//Set the mask of targets of meta search.
set_mask($mask) (int $mask A masking number. 1 means the first target, 2 means the second target, 4 means the third target, and power values of 2 and their summation compose the mask.) void
// getter methods
それぞれのgetter methods
function phrase()
function attrs()
function order()
function max()
function skip()
function options()
function auxiliary()
function distinct()
function mask()

上記の、設定がおわったら
EstraierPure_Node の search メソットになげれば、検索結果(EstraierPure_NodeResultのobject)が返ってきます。
get_doc
get_doc_attr
get_doc_attr_by_uri
get_doc_by_uri
あたりをつかって、加工すればOK

2009.01.31

Category: PHP / Tags:

PHP再起処理-MLから

——————————————————
$arr = array();
$a = “”;
func1($hogehoge,&$arr,$a);
function func1($hogehoge,$arr,$a){
foreach( $hogehoge as $key => $value){
if(is_array($value)){
func1( $value,&$arr,$a.”/”.$key);
}else{
array_push($arr,$a.”/”.$value);
}
}
}
——————————————————
foreach($arr as $value){
echo $value.”\n”;
}

2008.11.06

Category: PHP / Tags:

PHPのネタ帳-環境変数表示

phpinfoでもいいんだけどね。
echo "SERVER_SOFTWARE = ".getenv(SERVER_SOFTWARE)."
n”;
echo “SERVER_NAME = “.getenv(SERVER_NAME).”
n”;
echo “GATEWAY_INTERFACE = “.getenv(GATEWAY_INTERFACE).”
n”;
echo “SERVER_PROTOCOL = “.getenv(SERVER_PROTOCOL).”
n”;
echo “SERVER_PORT = “.getenv(SERVER_PORT).”
n”;
echo “REQUEST_METHOD = “.getenv(REQUEST_METHOD).”
n”;
echo “PATH_INFO = “.getenv(PATH_INFO).”
n”;
echo “PATH_TRANSLATED = “.getenv(PATH_TRANSLATED).”
n”;
echo “SCRIPT_NAME = “.getenv(SCRIPT_NAME).”
n”;
echo “QUERY_STRING = “.getenv(QUERY_STRING).”
n”;
echo “REMOTE_HOST = “.getenv(REMOTE_HOST).”
n”;
echo “REMOTE_ADDR = “.getenv(REMOTE_ADDR).”
n”;
echo “AUTH_TYPE = “.getenv(AUTH_TYPE).”
n”;
echo “REMOTE_USER = “.getenv(REMOTE_USER).”
n”;
echo “”REMOTE_ID” ENT = “.getenv(”REMOTE_ID” ENT).”
n”;
echo “CONTENT_TYPE = “.getenv(CONTENT_TYPE).”
n”;
echo “CONTENT_LENGTH = “.getenv(CONTENT_LENGTH).”
n”;
echo “PHP_SELF = $_SERVER[PHP_SELF]
n”;
echo “argv = $_SERVER[argv]
n”;
echo “argc = $_SERVER[argc]
n”;
echo “GATEWAY_INTERFACE = $_SERVER[GATEWAY_INTERFACE]
n”;
echo “SERVER_NAME = $_SERVER[SERVER_NAME]
n”;
echo “SERVER_SOFTWARE = $_SERVER[SERVER_SOFTWARE]
n”;
echo “SERVER_PROTOCOL = $_SERVER[SERVER_PROTOCOL]
n”;
echo “REQUEST_METHOD = $_SERVER[REQUEST_METHOD]
n”;
echo “QUERY_STRING = $_SERVER[QUERY_STRING]
n”;
echo “DOCUMENT_ROOT = $_SERVER[DOCUMENT_ROOT]
n”;
echo “HTTP_ACCEPT = $_SERVER[HTTP_ACCEPT]
n”;
echo “HTTP_ACCEPT_CHARSET = $_SERVER[HTTP_ACCEPT_CHARSET]
n”;
echo “HTTP_ACCEPT_ENCODING = $_SERVER[HTTP_ACCEPT_ENCODING]
n”;
echo “HTTP_ACCEPT_LANGUAGE = $_SERVER[HTTP_ACCEPT_LANGUAGE]
n”;
echo “HTTP_CONNECTION = $_SERVER[HTTP_CONNECTION]
n”;
echo “HTTP_HOST = $_SERVER[HTTP_HOST]
n”;
echo “HTTP_REFERER = $_SERVER[HTTP_REFERER]
n”;
echo “HTTP_USER_AGENT = $_SERVER[HTTP_USER_AGENT]
n”;
echo “REMOTE_ADDR = $_SERVER[REMOTE_ADDR]
n”;
echo “REMOTE_PORT = $_SERVER[REMOTE_PORT]
n”;
echo “SCRIPT_FILENAME = $_SERVER[SCRIPT_FILENAME]
n”;
echo “SERVER_ADMIN = $_SERVER[SERVER_ADMIN]
n”;
echo “SERVER_PORT = $_SERVER[SERVER_PORT]
n”;
echo “SERVER_SIGNATURE = $_SERVER[SERVER_SIGNATURE]
n”;
echo “PATH_TRANSLATED = $_SERVER[PATH_TRANSLATED]
n”;
echo “SCRIPT_NAME = $_SERVER[SCRIPT_NAME]
n”;
echo “REQUEST_URI = $_SERVER[REQUEST_URI]
n”;
?>

2008.11.06

Category: PHP / Tags:

PHPのネタ帳

自分と同じ階層の別のファイルを呼び込む
require_once dirname(__FILE__).’/exception.php’;

2008.06.10

Category: PHP, 未分類 / Tags:

PHPを出来るだけ早く処理するためのテクニック(トピックス)

1.ループ内の換算、減算は、「前置加算子、減算子」の方が「後置加算子、減算子」よりはやい
つまりは、++$i, –$i をつかえってこと。
2.ループの場合は、do-whileが、whileより、ちょこっとが早い。for文が一番おそい。
可視性をあげるためにも、whileを推奨
3.foreach と while(each()) は、foreachがはやい
4.foreach で、keyを取得しない froeach( $array as $value ){} だけの方が1.1倍~1.3倍早い。
参考URL
http://itpro.nikkeibp.co.jp/article/COLUMN/20070704/276650/

« Older Entries