Archive for category 技術

qmail と tcpserver

割と長時間はまってしまったので

外部からのメールを受け付けようと qmail の設定を少し変更して
再起動したところ全く受け付けず、、、更に telnet で確認すると localhost にすらつながらない状態。

/var/qmail/control

内のファイルを見ても問題なさそう ⇒ ログをみるか

tcpserver: fatal: unable to bind: address already used

もしかして、smtpが何かに使われてる?
プロセスを確認しても

root xxxxx 0.0 0.0 0 0 ? Z 00:00 0:00  tcpserver <defunct>

tcpserver が起動してない。

# netstat -tpl | grep smtp
tcp 0 0 *:smtp *:* LISTEN 2543/exim
tcp6 0 0 *:smtp *:* LISTEN 2543/exim

どうやら exim という、smtpデーモンが知らないうちに起動してしまっていたようだ。

# /etc/init.d/exim stop
# /sbin/chkconfig exim off

として、あらためて qmail を再起動
無事に qmail-smtpd が機能しだしました!
#そういや、qmail インストール時にサービスを止めた気がするzzz

ファイル名 解説
me 自分自身の完全修飾ドメイン名を示すものだそうで、各種制御ファイルのディフォルトとしても効果をなすそうです。SMTP 接続時の応答メッセージや、Received ヘッダなどで使用されるようです。
defaultdomain ドットの無いホスト名が指定された場合に付加されるドメイン名だそうです。defaulthost にドットが含まれない場合にも、この情報が付加されるとのことでした。
plusdomain ドットがなく、さらに最後が + で終わるホスト名が指定された場合に付加されるドメイン名だそうです。defaulthost についてもこの条件に該当する指定がなされていた場合は、この情報が付加される対象となるそうです。
locals ここに記されたドメイン宛てのメールを自サーバ宛てのメールとして、メールボックスへの格納対象とします。virtualdomains で指定されたドメインは含みません。
rcpthosts SMTP 接続時に、ここに記されたドメイン宛のメールを受理します。具体的には SMTP 要求の "RCPT TO: " にて指定可能な宛先のドメイン名です。locals や virtualdomains に指定されたドメインがここに含まれていないと、それら宛のメールの SMTP による送受信が行えませんので注意です。
virtualdomains バーチャルドメイン宛てに来たメールの制御を行います

redMineのアップグレード

Redmineをインストールしたディレクトリで

$ svn update

データベースのマイグレーション

$ rake db:migrate RAILS_ENV="production"

以下のメッセージで更新できない場合は、メッセージ通り「gem update –system」を実行してから再度マイグレーションを

(in /var/www/redmine)
Rails requires RubyGems >= 1.3.2 (you have 1.3.1). Please `gem update --system` and try again.

キャッシュ、セッションを消去

rake tmp:cache:clear
rake tmp:sessions:clear

sed コマンド(文字列置換)

今更なんですけど、便利だなぁーと再認識したので

$ find . -name '*.html' | xargs grep -l 'hogehoge' | xargs sed -i.bak 's/hogehoge/fugafuga/g'

1)拡張子が「.html」
2)「hogehoge」という文字列を含んでいる
3)「hogehoge」を「fugafuga」に置換する

ちなみに -i.bak というオプションは [元のファイル名].bak というバックアップファイルまで作ってくれます。

PHP:setcookie

cookieを利用するときの注意点

php.ini(もしくは.htaccess) で以下の設定してれば問題ないと思っていましたが、とんだ勘違いでした。

php_flag session.cookie_secure On
php_flag session.cookie_httponly On

マニュアルはよく読みましょうということで

setcookie

setcookie ( string $name  [, string $value  [, int $expire = 0  [, string $path  [, string $domain  [, bool $secure = false  [, bool $httponly = false  ]]]]]] )

$secure、$httponly を true にしないと意味ないです。

session.cookie_secure

session.cookie_secureは、 セキュアな接続を通じてのみCookieを送信できるかどうかを指定します。
デフォルトは、offです。 この設定は、PHP 4.0.4で追加されました。 

session.cookie_httponly

クッキーに対して、HTTP を通してのみアクセスできるようにします。
つまり、JavaScript のようなスクリプト言語からはアクセスできなくなるということです。
この設定を使用すると、XSS 攻撃によって ID を盗まれる危険性を減らせます (が、すべてのブラウザがこの設定をサポートしているというわけではありません)。 

MySQL:AUTO_INCREMENT 属性

DB(とりあえずMySQL)でテーブルのIDを生成するのに AUTO_INCREMENT 属性を使用します
この AUTO_INCREMENT について

AUTO_INCREMENT 属性をリセット
ALTER TABLE 文でできます

ALTER TABLE dtb_customer AUTO_INCREMENT = 1;

1 にリセットすることはあまりないと思いますが、会員IDや商品IDなど1桁は
ちょっとというときに 10001 にしたりすることが多いかな?

ちなみに AUTO_INCREMENT の値ですが information_schema.TABLES 格納されています。

欠番を取得するにはどうする?
テーブル自体を長いこと運用していると頻出の問題だと思います

MySQL以外でもできるかわかりませんが、以下の方法で欠番が取得できます

SELECT MIN(t1.product_id) + 1 AS product_id FROM dtb_products AS t1
LEFT JOIN dtb_products AS t2 ON t1.product_id + 1 = t2.product_id
WHERE t2.product_id IS NULL
;

最大値まで達したらどうなる?
そもそも最大値まで達することがほぼ無いので、あまり考えたことがなかったのですが
キーカラムの型次第ってことのようです。

バイト 最小値 最大値
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

まさか TINYINT ってことはないので、通常 INT が多いとすれば約21億 UNSIGNED で符号ビット
をはずせば約42億 十分といえば十分?
仮にアクセスログなんかの大量データを扱ったりするなら BIGINT のほうがいいかもしれませんね

アクセスログが日時順に並んでいない!?

今更な感がしなくもないのですが、たまたま身近でこういう現象が起こったので
メモ書きしておきます。

Apache 1.3.xのmod_log_configモジュールでは「ログを出力する時点の時刻」
を出力していますが、Apache 2.0.xのmod_log_configモジュールは
「リクエストを受け取った時点の時刻」を出力しています。
このためApache 2.0.xの場合は大きなファイルのダウンロードや処理時間が
長いプログラムを実行した場合など、リクエスト~レスポンス完了までの時間が
長い場合にログの前後関係が崩れやすくなっています。

なんだそうです、全然知りませんでした。

詳しくはこちら
http://mm.apache.jp/pipermail/apache-users/2004-April/003924.html

Tags: ,

MySQLでランダムにデータを取り出すには

いつもは適当に100件ぐらいのデータを取得して、PHPとかでランダムに配列へ格納する
なんてことをやってたんですが、MySQLでできたみたいです。

割と長くMySQLを使っていますが、全然知りませんでした。

SELECT * FROM table WHERE id > 0 ORDER BY rand() LIMIT 100;

レスポンスが遅くならないようにインデックスも含めた方がよさそうです。
う~ん、なんて便利なんだ。(早く気付けよzz)

CentOS5のPHPをアップデートする

PHPでDateTimeクラスを利用するには、どうもPHP5.2以降でないとだめらしいので
PHP5.2.6にアップデートしてみる。(CentOS5だと初期はPHP5.1.6なのかな)

RPM-GPG-KEYをインストール

rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

リポジトリ参照ファイルを作成

#vi /etc/yum.repos.d/utterramblings.repo

参照ファイルの内容

[utterramblings]
name = Jason's Utter Ramblings Repo
baseurl = http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled = 0  ・・・常に参照するわけじゃないので0にしてます。
gpgcheck = 1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

yumでPHPをアップデート

# yum --enablerepo=utterramblings update php

うまくいけばこの手順で更新されるはずです。

CakePHP関西勉強会に参加してきました

久しぶりに関西での勉強会(CakePHP関西勉強会)に参加してきました。

最近業務でCakePHPを利用する機会が増えてきたので、これは行っておかねばと
個人的にはまだまだ試行錯誤の段階ですが、そういう方にもわかりやすい勉強会で大変良かったです。
是非、続けていきたいですね。

1.CakePHP アプリケーションの流れを追う [shin1×1さん]
なかなか意識して追いかけることがない部分なので、シーケンス図をベースに全体の流れがわかって参考になりました。
componentが一押しとのことで、プライベートメソッドまでcomponentに追い出す発想はなかったです。
チューニングのポイントも参考になりました、試してみます。

2.フォームメールを生成するプラグイン [slywalkerさん]
テーブルをもたいないモデルの例として紹介されていましたが、ちょうど同じ内容のもの(テーブルを利用しますが・・)を近々やる必要があるので是非参考にさせていただきます。
pluginが一押しとのことで、VIEWの管理の部分がややネックになりそうとのことでしたが、解決方法が見つかったようです。(Cakeすげぇ~w)

3.LT1:開発事例と失敗談 [keisonさん]
かなり多くの案件でCakePHPを使われていて、酸いも甘いも経験されてこられてるようでした。
同じ道を通るのかなと感じつつ聞いていました。

4.LT2:CakePHPと私(仮) [m_takagiさん]
CakePHPというか、、、なぜかPHPすら出てこなかった発表で驚きましたが
次の懇親会に向けて非常に良い繋ぎだったと思います。(わざと?)
食べ物と風景の写真が9割ぐらいだったように思いますw

5.懇親会
隣がまさかの取引先の方でかなりのサプライズでした。(名刺交換して気付きましたw)
色々な方とお話ができて楽しかったです。

CakePHP:テーブルのカラムを変更した場合

開発作業を進めていると、当初のテーブル設計から変更になることがよくあります。
カラム追加や変更、削除などなど、、、
ただ、以下のファイルが変わらない限り、昔のテーブルレイアウトのまま動こうとします。

app/tmp/cache/models/cake_model_default_[モデルs]

頻繁にやる作業ではないので毎度のことながらすっかり忘れて、よく はまり ます。