Archive for 6月, 2009

python:リストの内包表現

リストが持つデータに着目して新たなリストを作り出す書き方

memberList = [{'id': 1 ,'name': 'Jhon' ,'sex': 1 },{'id': 1 ,'name': 'Mary' ,'sex': 2 }]
このようなリストから性別=1のリストの’name’だけを抜き出したいときはこう書く
newMemberList = [lst['name'] for lst in memberList if lst['sex'] == 1]

Linux:rsyncでファイル同期

まずrsyncコマンドの基本

rsync [option] [同期元ファイルパス] [同期先ファイルパス]

リモートサーバと同期するときはファイルパスの前に:で区切ってサーバ名またはIPアドレスを指定する
rsync [option] user@192.168.0.2:/tmp /tmp
※この例ではuserアカウントで192.168.0.2にアクセスしようとしているので、目的のサーバに接続した後、パスワードを聞かれる。
パスワードを答えると同期が行われる。

cron等で定期的に同期したい場合、このパスワード入力が面倒。
リモートのrsyncサーバにユーザを登録していれば--password-fileというオプションをつけてコマンドラインにパスワードを含めることができる。

rsyncサーバの設定

rsyncの設定ファイルを作成しする。
設定ファイルにはリモートでアクセスできる接続元や、ディレクトリ、ユーザの設定を書く。
/etc/rsync.conf
#
# Global options
#
uid = root
gid = root
use chroot = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.0.1/24
hosts deny = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png

#
# Module options
#
[remote1]
comment = rsync server
path = /tmp/remote1
auth users = remote_user1
secrets file = /etc/rsyncd.secrets
read only = no

[remote2]
comment = rsync server
path = /tmp/remote2
auth users = remote_user2
secrets file = /etc/rsyncd.secrets
read only = no

次にユーザのパスワードを設定する。
※ここで作成するユーザ(上記のrsync.confのremote_user1,remote_user2にあたる)はrsyncのユーザである。
Linuxに同じユーザを作成する必要は無い。

rsync.confで”secrets file”に指定したファイルを編集する。
/etc/rsync.secrets
remote_user1:password
remore_user2:password

※secrets fileのパーミッションは600にすること。それ以外のパーミッションでは認証できない。

以上でrsyncサーバの設定は終わり。サーバを起動するには
rsync --daemon --config=/etc/rsyncd.conf

rsyncユーザで接続

rsyncサーバに設定したユーザ、ディレクトリで同期できるかのテストは以下のようなコマンドで行う。
rsync -r /tmp/test remote_user1@192.168.0.2::remote1

パスワードを聞かれないようにするにはパスワードファイルを作成し、コマンドオプションでそのパスワードファイルを指定する。
rsync -r --password-file=/etc/rsync.passwd /tmp/test remote_user1@192.168.0.2::remote1
/etc/rsync.passwdにはパスワードを平文で書いてよい。但し、他のユーザにアクセスされない場所に置くこと。
またこのファイルもパーミッション600でなければ認証できないので注意

mysql:DATETIME型とTIMESTAMP型

DATETIME型は8バイト、TIMESTAMP型は4バイト。
サポートする日付の範囲は
DATETIME: 0000年~9999年
TIMESTAMP: 1970年~2037年

4バイトくらいケチらずにDATETIME型を使うのが基本か。
TIMESTAMP型で更新日時など内部データを持つのはアリかもしれない。
けど、生年月日のようなデータ入れられない。
システムの中で何種類も日付型を使うのが面倒ならDATETIME型に統一したほうがいい。

mysql:リモートログインできるユーザの追加

mysqlにリモートログインできるユーザを追加するコマンド

GRANT ALL PRIVILEGES ON DBNAME.* TO username@”%” IDENTIFIED BY ‘password’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
“%”のところにIPアドレスを指定してアクセスできる接続元IPを指定することができる。
“%”なら何処からでも接続可になる。