grep
grep 検索語 検索ファイル
検索ファイル中の検索語を含む行を表示する。
例
grep hoge.com /var/log/httpd/*
cat /var/log/access*|grep hoge.com
のように、他から流し込むこともできる。
df
ディスクの空き状況を表示する。
free
メモリの空き状況を表示する。
wc
行数を知る。
grep error error_log|wc
みたいに繋ぐと、該当語がある行数を簡単に調べたり出来る
(93)
grep
grep 検索語 検索ファイル
検索ファイル中の検索語を含む行を表示する。
例
grep hoge.com /var/log/httpd/*
cat /var/log/access*|grep hoge.com
のように、他から流し込むこともできる。
df
ディスクの空き状況を表示する。
free
メモリの空き状況を表示する。
wc
行数を知る。
grep error error_log|wc
みたいに繋ぐと、該当語がある行数を簡単に調べたり出来る
(93)
Linuxの定番エディタvimの設定
set fileencodings=utf-8
set encoding=utf-8
set termencoding=utf-8
UTF-8環境の設定。 termencodingはbashrcとあわせる(デフォルトのbashはeuc-jpになっている)
set autoindent
set tabstop=4
オートインデントの有効化と、ハードタブの文字数。 編集中に一時的に無効化する場合
set number
行数を表示する。
set showmatch
検索でヒットした部分をハイライトする。
:w
保存
:q
終了
合わせ技で:wq(保存終了)とか。
編集内容を破棄して終了するなら!をつけて、:q!にする。
gg
GG
ファイルエンドトップ/エンドへ
/検索語
検索。 検索後はnで次のヒットへ、Nで前のヒットへ
%s/検索語/置換/オプション
置換。 オプションはgでファイル全体、cで確認表示(確認+ファイル全体ならgc) 正規表現を使って高度な置換が出来る。
u
元に戻す。 戻しすぎたら、ctrl+r
yy
dd
p
P
1行コピー、1行削除、次の行に貼り付け、前の行に貼り付け。
ddで削除すると、削除内容が自動でバッファに入るので、yy>dd>pの動作をするとコピーしておいた内容が消えるので順序に注意。
複数行ならy行数 enter, d行数 enterとか。
(218)
PHPで共有ファンクションを使っているけど、それがどこから呼ばれているか知らなきゃならないことがある。
こういうときに利用できる関数がdebug_backtrace()というファンクション。
PHPでFatalエラーが出たときとかに呼び出し関係を表示したり出来るのはこの仕組みが働いている。
var_dump(debug_backtrace());
とか埋め込んでおくと、その関数が呼ばれたときに、呼び出し関係と各要素のダンプがみられる。
あまりスマートではないけど、ある関数で、特定のコードから呼び出されたら処理を変更したいって言うことがあるが
$backtrace = debug_backtrace();
if($backtrace[2][‘args’][0][‘logic_file’]==’parts/stockman.php’)
の様にして、バックトレースの要素を使って分岐すると言うことも出来る。
PHPの便利な定数。
PHPには便利な変数($_SERVER等)があってよく使われているけど、定数もいくらかそろっていて、これがデバッグ向けの物がほとんどなので、debugネタのついでにメモ。
__LINE__ 行番号。 「__LINE__.’で問題が発生しました’」みたいに例外を投げてみたり。
__FILE__ ファイルのフルパスとファイル名。 変数からも取得できるけどこっちの方が書きやすい。
__DIR__ ファイルの存在するディレクトリ。 dirname(__FILE__)と同義。
__FUNCTION__ 現在の関数名。
__CLASS__ 現在のクラス名。 継承した時に、継承元で定義してある__CLASS__を使ったメソッドを、継承先で呼び出しても継承元のクラス名が戻ってくる点に注意(継承先でも同じメソッドを定義して__CLASS__を呼んでやれば、継承先のクラス名がとれる) これに対して、get_class($this)を呼ぶと、継承先で呼び出せば継承先のクラス名が戻ってくる(まぁ、インスタンスの名前だから当たり前だが)
__METHOD__ 現在の(クラス)メソッド名。
__NAMESPACE__ 現在の名前空間。 名前空間が実装されたのが最近なんで使ったことがない。
(3262)
開発って言うかデザイン?
Webサイトを作る時って、デザイナーが作るわけだけど、彼らの使うディスプレイって、色の良く出るVAやIPSの良質なディスプレイな事が多いし、ビデオカードもQuadroとかFireProとかが載ってたりする。
他方、ライトユーザはオンボードビデオに安いTNディスプレイを使っていたりして、発色がめちゃくちゃなことがある。
作業場のPCで淡いカラーリングを施したページを家電量販店の安いPCで表示したら真っ白って事があったり。
昔は、デザイナーの作業の最終地点が印刷物で、AdobeカラーマッチングしたCMYKで作って、色分解して印刷所に出せば、印刷機とマッチングできているから綺麗に出てきていたわけだけど、今の最終地点はWebが多く、ここのクライアント環境は色々な物があるので、ある程度色をきつめに作っておかないとダメだったり、色がおかしく(良くある青白いもの意外に、赤傾向や緑傾向な環境もあったり)なったりすることもあるのだが、まぁ、この辺は作る側じゃどうしようもないんで、せいぜい、淡い色をちょっと濃い目にして、発色の弱い環境でも消えないようにするくらいしかないな(デザイナーがいくらマッチングしても、結局、クライアントがマッチングできていないのだから)
(97)
まじめも:collationでUTF8日本語を使う場合、候補にutf8_general_ciとutf8_unicode_ciのどちらを選ぶか迷う事がある
これについては、
MySQL5.5ユニコードキャラクタセットの説明
の中程に
For any Unicode character set, operations performed using the xxx_general_ci collation are faster than those for the xxx_unicode_ci collation.
~
A difference between the collations is that this is true for utf8_general_ci:
ß = s
Whereas this is true for utf8_unicode_ci, which supports the German DIN-1 ordering (also known as dictionary order):
ß = ss
generalはunicodeに比べて高速だと書かれている。
挙動の違いとして、上記エスツェット(ドイツ語拡張文字)の違いが挙げられているが、現在の書法ではss(unicodeの挙動)が正しい。
しかし、日本語の扱いの違いが上げられていないが、実際に評価すると以下の様な挙動を示す。
| id | name |
|---|---|
| 1 | ユニコード |
| 2 | ゆにこーど |
| collation設定 | id | name |
|---|---|---|
| unicode | 1 | ユニコード |
| 2 | ゆにこーど | |
| general | 2 | ゆにこーど |
utf8_unicode_ciにすると、なんとカタカナとひらがな表記が同じであると判定されてしまうのだ。
これだと、実運用上問題が生じることが多いだろうから、一般的には、utf8_unicode_ciではなくutf8_general_ciを使う様にした方がいい。
(335)
このWordPressを動かしていてページ送り(古い記事へ・新しい記事へ)が動作しない問題が発生した。
MySQLで全SQLログを取得してみると、SELECT文の前に必ず’EXPLAIN 実行予定SELECT文’が実行されていた。
WordPressでは、ページ数を取得するために、MySQLのFOUND_ROWS()を実行して取得している。 これは
SELECT SQL_CALC_FOUND_ROWS * FROM
stockLIMIT 0,10;
SELECT FOUND_ROWS();
このように実行すると、SQL_CALC_FOUND_ROWS キーワードをつけたSELECT文のLIMITをつけなかった場合の件数(SELECT count(*) FROM stockの結果に同じ)を得られるのだが、このFOUND_ROWS()は直近の文を読むので、今回の様にEXPLAINが挿入されると↓のようになってしまうので、FOUND_ROWSの戻り値が0になってしまう。
SELECT SQL_CALC_FOUND_ROWS * FROM
stockLIMIT 0,10;
EXPLAIN SELECT FOUND_ROWS();
SELECT FOUND_ROWS();
で、このEXPLAINがどこから来ているのか。 WordPressの全ソース検索をしても出てこない。
色々調べて、PHPに行き着いた。
PHP5.3.5ソース
php_mysql.c:1431-1432
int newql = spprintf (&newquery, 0, “EXPLAIN %s”, query);
mysql_real_query(mysql->conn, newquery, newql);
これで実行されていた。 これが実行される条件は、
php_mysql.c:1426
if (MySG(trace_mode))
の条件が指定されていて、このtrace_modeは
php_mysql_structs.h:125
long trace_mode;
で定義されていて、php.iniの
mysql.trace_mode
で設定することが出来て、On(=1)の場合にEXPLAINが自動実行されて、Off(=0)なら実行されないため、WordPressを実行するサーバではmysql.trace_mode=Offとする(php.iniでグローバル設定する以外に、wpの設置ディレクトリに.htaccessを配置してphp_flag mysql.trace_mode Offの記述を入れてもOK)か、WordPressのquery.phpでカウントするSQLをcount()を使う様に修正しなければいけない。
(458)
テーブルstockでレコードが削除されるとき自動でバックアップテーブルに挿入するトリガ
DELIMITER ..
CREATE TRIGGERstock_auto_backup
BEFORE DELETE ONstockFOR EACH ROW
BEGIN
INSERT INTOstock_backup(code,name,num,deleted_on) VALUES (OLD.code, OLD.name, OLD.num, unix_timestamp());
END..
DELIMITER ;
MySQLのunix_timestamp()関数により削除時間(now)を追加して記録することが出来る。
全てのUPDATE操作をログしたいとき、DELETEをUPDATEに書き換えれば、トリガでログしておけるので、操作側の修正の手間が省ける。
更に、一定以上古いバックアップを削除する機能もつける場合、END..の前に
DELIMITER ..
CREATE TRIGGERstock_auto_backup
BEFORE DELETE ONstockFOR EACH ROW
BEGIN
INSERT INTOstock_backup(code,name,num,deleted_on) VALUES (OLD.code, OLD.name, OLD.num, unix_timestamp());
DELETE FROMstock_backupWHERE unix_timestamp(deleted_on)<(unix_timestamp()-60*60*24*7); END.. DELIMITER ;
の様にすれば、トリガ実行タイミングで7日より前のレコードをバックアップテーブルから自動削除できる。
なお、MySQLでは同じテーブルの同じ条件に複数のトリガを設定できないので、同じ条件に機能追加する場合は
DROP TRIGGER
stock_auto_backup
のようにしてトリガを一度削除する。
とあるテーブルのAUTO_INCREMENT値を変更する。
ALTER TABLE
stockAUTO_INCREMENT = 1;
この場合はstockテーブルを1にしている。
(166)