UNIXタイムスタンプについて。
ちょっと思い違いをしていたのでメモ。

UNIXタイムスタンプは、1970年1月1日 0時0分0秒(GMT 世界標準時刻)からの通算秒。

MySQLのUNIX_TIMESTAMP()は、指定時刻に対して↑からの通算秒を返す。

time_zoneの設定をもとにしてGMT標準時刻からの差分を判断している模様。

JSTで、UNIX_TIMESTAMP(’2008-08-16 20:00:00′)をかますと2008-08-16 11:00:00までの通算秒が返る。

+01:00 でUNIX_TIMESTAMP(’2008-08-16 20:00:00′)をかますと2008-08-16 19:00:00までの通算秒が返る。

MySQLのタイムゾーンを変更するには、set time_zone=”+01:00″ など。

now()でMySQLに設定されているタイムゾーンの現在時刻(Y-m-d H:i:s)が入る。

UTC_TIMESTAMP()で世界標準の現在時刻(Y-m-d H:i:s)が入る。

 

現在 CORESERVER の2週間お試し期間中。
MySQL DB の文字設定がなんか微妙というメモ。

とりあえず DB はいくらでも作れるとの事なので、とりあえず1個つくってみた所、なんか文字コードが混在してる・・・

¥s の結果

Server characterset: utf8
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1

show variables like ‘character%’; の結果

| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-src-5.1.22/share/mysql/charsets/ |

latin1が混ざっとるがな・・・。

とりあえず、SET NAMES utf8; を忘れないようにしよう。

 

ulimit

資源の制限を設定, 確認できます。

ulimit -a で全部確認。

epollを試そうとして同一ユーザで5000クライアントぐらいやったら
ファイルディスクリプタの割り当てが全然足りなかったというオチ。

ulimit -n 5050 ぐらいにしとけば大丈夫でしょう。

 

#————————————-
# シェルスクリプト
# あちこちネット検索が手間なのでメモ
#————————————-

【気をつけること】
・文字と改行コードに注意

【変数】
$0 ・・・スクリプト名
$n ・・・第 n 引数の値
$# ・・・引数の個数

【算術】
NUM=`expr ${NUM} + 10`
NUM=`expr ${NUM} ¥* 10`

【 if 】
if[ ]
then
fi

○ 形式
-b ファイル名 ・・・ブロックデバイスファイルなら真
-c ファイル名 ・・・キャラクタデバイスファイルなら真
-d ファイル名 ・・・ディレクトリなら真
-f ファイル名 ・・・通常ファイルなら真
-L ファイル名 ・・・シンボリックリンクなら真
-p ファイル名 ・・・名前つきパイプなら真
-S ファイル名 ・・・ソケットなら真

○ パーミッション
-g ファイル名 ・・・SGIDがセットされてるなら真
-k ファイル名 ・・・スティッキービットがセットされてるなら真
-r ファイル名 ・・・読み取り可能なら真
-u ファイル名 ・・・SUIDがセットされてるなら真
-w ファイル名 ・・・書き込み可能なら真
-x ファイル名 ・・・実行可能なら真

○ その他
-e ファイル名 ・・・ファイルが存在すれば真
-s ファイル名 ・・・ファイルサイズが0より大きければ真

○ 数値
1 -eq 2 ・・・1と2は同じなら真
1 -ge 2 ・・・1が2以上なら真
1 -gt 2 ・・・1が2より大きいなら真
1 -le 2 ・・・1が2以下なら真
1 -lt 2 ・・・1が2未満なら真
1 -ne 2 ・・・1が2等しくなければ真

【 case 】
case ${STR} in
  sec)
    echo “sec”
    ;; 
  min)
    echo “min”
    ;;
esac

【 for 】
for num in “a b c”
do
  echo ${num}
done

結果
a
b
c

【 while 】
○ 10回繰り返し
i=0
while[ $i -le 10 ]
do
  i=`$i + 1`
done

○ ファイルから読み込み
while read line
do
  echo ${line}
done < test.txt

11月 072007
 

MySQL 5.0 系では、log_slow_queries を SET GLOBAL で設定できない。

5.1系から設定できるようになっている様子。

設定するには、my.cnf に記述、もしくは、起動時に指定する。

 

UNIX の便利なコマンドを自分の中で整理の意味もこめてメモ。

条件を正規表現
ls -lt | grep -e ‘.*[.].*’

指定ディレクトリ内のディレクトリのみ検索。
find ./ -mindepth 1 -maxdepth 1 -type d -name abc

指定ファイル内の文字列を置換。 abc → def
perl -i.bak -pe s/abc/def/g *.txt

権限、ソフトリンクを維持し、ディレクトリを再帰的にコピーする。
rsync -prlv /usr/local/test1/ /usr/local/test2

ssh を使って別 PC にコピーする。
rsync -prlv -e ssh /usr/local/test1/ host:/usr/local/test2

MySQL をコマンドライン上から実行。
mysql -h 192.168.1.4 –port=3306 –user=root –password=root –database=testdb -N -B -e “select * from test_table;”

使おうと思ったときに大体細かいオプションを忘れてるからな。

これで良し。

awk

6月 222007
 

さて最近、噂の古代言語 awk を知りました。

たぶん、UNIX で文書を読み取る必要があるときにいい感じ。

今回は、CSV ファイルを awk さんに解析して頂いた。

仮に test.csv として、中身は

one,two,three
two_one,two_two,two_three

こんな感じだったとする。
two_one ってのは、2行目の1つめみたいな脳内変換で。

そして、解析を行う awk さんの全貌が以下。

print.awk

BEGIN が最初に実行するところで、FS=”,” は , をスペースに
置き換える組み込み変数。

真ん中の { } で囲まれた部分が、メインループ。

どうやら1行ずつ読んできて、$1 にひとつめ、$2 にふたつめの値
が入ってくるっぽい。

END が最後に実行するところ。今回は、動的配列のように格納した
値を最後にびゃっと表示させている。
文字連結もなんか意外に簡単。

実行すると

./print.awk test.csv
started….
one-two-three
two_one-two_two-two_three
end of file…

ちなみに

print “abc” >> “test.txt”;

とやると test.txt が作成されて abc と出力される。
デフォルトでなんか改行まで入るけど。
テンプレートファイルを大量に作成するときとか便利かも。

あらかじめエクセルで定義しておいて、awk さんに読み取って
色々して貰えるとなにかと楽出来そうだなー。

 

ssh でもう1個の Linux をリモート操作してたんだけど、
その際、いちいちパスワード打つのがめんどっちくなったから
ssh の公開鍵の作成をシェルで組んでみた。
とりあえず公開鍵の作成は、手打ち。で今回は DSA 認証。

local$ ssh-keygen -t dsa
空エンター連打

local$ cd ~/.ssh/
local$ cp identity.pub ~/authorized_keys2
local$ cd ~
local$ chmod 600 authorized_keys2

↑ ~ は、チルダ。

と公開鍵を作ったら・・・てか、思ったらこれもシェルスクリプトに
しとけば、いちいち打たなくて済むなー。

local$ ./key.sh リモート先の Host or IP

例)./key.sh 192.168.1.2

以下、key.sh のソース。巷で噂の gvim を試しに使ってみた。

実行すると、パスワード聞かれると思うけど、それ打って
無事終了したら、次からパスワード無しで繋げるよーになる。

やってることは、リモート先に公開鍵を送りつけてるぐらい。

ssh 試してパスワードなしでログイン出来たら

local$ rm -f authorized_keys2

で削除して終了。いやーシェルって便利!