MySQL で create文と select文を組み合わせてテーブルをコピーする方法

2009年12月14日 20:48

create文の中で select文を実行することで、特定のテーブルのコピーを作成することができます。

create table new_table as select * from old_table;

これで、「old_table」と同内容の「new_table」が作成できます。

ただし、インデックス等は別途作成する必要があります。

テーブルの構造だけをコピーして、中身のデータはいらない、という場合は、select文の where句で、ありえない条件を設定すればOK。

例えば、「user_id」というレコードが必ず1以上の数値であるテーブル「old_table」の構造だけコピーしたければ、

create table new_table as
 select * from old_table where user_id < 1;

という感じになります。

カテゴリー
MySQL
タグ
MySQL | RDBMS | SQL | コマンドライン
関連するブログ記事

コメント(0) | トラックバック(0)

 

さくらのレンタルサーバーで PHP を .html 等の拡張子で実行させる方法

2009年9月20日 16:07

先日.htaccess で .html 等の拡張子で PHP を実行させる方法という記事を書きましたが、さくらのレンタルサーバーでは、PHP が CGI として動いているため、上記記事の設定では、.html 等の拡張子で PHP を実行することができません。

なので、今回はさくらのレンタルサーバーに絞った、設定方法の解説です。

php-cgi をドキュメントルートにコピーする

SSH でサーバーにログインし、php-cgi というバイナリファイルを、自分のドキュメントルートにコピーします。

cp /usr/local/php/default/bin/php-cgi ~/www/php.cgi

コピーする際に、ファイル名を php.cgi のように拡張子を .cgi にしておくのがポイント。

ついでに、コピーした php.cgi のパーミッションも変えておきましょう。

chmod 0705 php.cgi

.htaccess の編集

さて、続いて .htaccess を編集します。

以下の二行を追加。

Action myphp-script	/php.cgi
AddHandler myphp-script	.php .html

これで .html でも PHP が動くようになります。

ただし、この方法だと、PHP の CGI版バイナリファイルを直接ドキュメントルートに持ってきて、それを実行するようになってますので、レンタルサーバー側の PHP がバージョンアップされても、コピーした PHP は古いままです。
なので、バージョンアップ情報等は自分でチェックして、そのたびにコピーし直す必要があるでしょう。

あるいは、コピーせずにシンボリックリンクを作ってもいけるのかな?
これは試していないので、ちょっと不明です。

カテゴリー
.htaccess | PHP | レンタルサーバー
タグ
.htaccess | CGI | PHP | UNIX | さくらのレンタルサーバー | コマンドライン | シェル | 拡張子
関連するブログ記事

コメント(0) | トラックバック(0)

 

サーバー上で FTP を自動実行する方法

2009年9月14日 21:46

例えば、 abe-tatsuya.com というサーバーのバックアップデータを、定期的に FTP で別の goodhope.jp というサーバーにコピーしておきたい、というような時に使う、自動実行処理の方法です。

まず、以下のようなシェルスクリプト(というほどのものでもないですが)を用意します。
今回は、goodhope.jp というサーバーに対して、 backup.tgz というデータをFTPで転送すると仮定します。

#-- 転送先サーバーを指定
/usr/bin/ftp -n goodhope.jp << _EOF_
#-- FTP のユーザー名とパスワードを指定
user username password
#-- バイナリモードで転送
bin
#-- ローカル側サーバーのカレントディレクトリを移動
lcd /usr/home/tatsuya/BackUp
#-- 転送先サーバーのカレントディレクトリを移動
cd /usr/home/goodhope/BackUp
#-- データを転送
put backup.tgz
#-- 終了
bye
_EOF_

各種 FTPコマンドに関しては、超初級ftpコマンドリファレンスなんかを参考にして頂ければ。

というわけで、上記のように記述したファイルを、例えば ftp.sh というファイル名で、データ転送元サーバーに置いておきます。
後は cron で定期的に ftp.sh を実行すればOK。
今回は例として、/usr/home/tatsuya/sh というディレクトリに置いたことにしておきます。

#-- 毎日午前5時に実行する場合
0 5 * * * /bin/sh /usr/home/tatsuya/sh/ftp.sh

cron の設定に関しては、crontabの設定方法などを参考にどうぞ。

これで、毎日午前5時に、自動的にバックアップデータを FTP で別サーバーに転送する、という処理が設定完了です。
もちろん逆に、定期的に別サーバーのデータを転送して取得する、ということも可能です。

カテゴリー
Linux/UNIX
タグ
crontab | FTP | UNIX | アップロード | コマンドライン | シェル | ダウンロード | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

MySQL で select したデータを別のテーブルに insert する

2009年9月11日 23:01

基本的な SQL 文は MySQL だろうが PostgreSQL だろうが、MS Access だろうが何だろうが、変わりはないんですが、一応メモ。

あるテーブルAからデータを select で取り出して、そのままそのデータを別のテーブルBに insert するには、以下のようにします。

insert into tableB (id, name, mailaddress)
select tableA.id, tableA.name, tableA.mailaddress
from tableA
where tableA.id = 'hoge';

これで、テーブルAから特定の条件のデータだけを取り出して、直接テーブルBに insert することができます。

insert文や select文の基本については、PostgreSQLの初歩あたりにまとめてあります。

カテゴリー
MySQL
タグ
MySQL | RDBMS | SQL | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

MySQL の update 文で inner join する

2009年4月25日 17:47

基本的な SQL 文は MySQL だろうが PostgreSQL だろうが、MS Access だろうが何だろうが、変わりはないんですが、一応メモ。

MySQL の update 文の中で inner join するには、以下のようにします。

update table1
inner join table2 on table1.id = table2.id
set table1.cellname1 = hoge
where table2.cellname2 = 'huga';

inner join については、PostgreSQLで複数のテーブルを結合して処理する方法に、詳しく書いています。

カテゴリー
MySQL
タグ
inner join | MySQL | RDBMS | SQL | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

さくらのレンタルサーバでメール受信時にスクリプトを起動させる方法

2009年4月 5日 16:24

以前、メール受信時に perl スクリプトを起動して自動処理させる方法とかメール受信時に PHP スクリプトを起動して自動処理させる方法なんかを書きましたが、今回は、具体的に特定のレンタルサーバー(さくらのレンタルサーバ)で、メール受信時にスクリプトを起動させる方法を書いてみようと思います。

自分のアカウントのメールアドレスを確認する

さくらのレンタルサーバのサービスで、普通にメールアカウントを追加しても、メールサーバーとWebサーバーが分かれているため、そのままではメール受信時にWebサーバー上のスクリプトを起動させることができません。

しかし、さくらのレンタルサーバでは、申込時には通知されませんが、Webサーバーアカウントに対して、ひとつメールアドレスが発行されています。
このアドレスを使用して、受信時にスクリプトを起動させることができます。

というわけで、そのWebサーバーアカウントに割り当てられた、自分のメールアドレスがどんなアドレスなのか確認する方法を説明します。

まず、コントロールパネルにログインします。
「サーバ情報の表示」⇒「サーバに関する情報」と進むと、以下のような画面が表示されるかと思います。

さくらのサーバ・コントロールパネル1

一部画像を修正してありますが、こんな感じの画面が表示されます。

今回必要となる情報は「ホスト名」の部分です。
「www.****sakura.ne.jp」(****は数字)と表示されているかと思います。

これが本来の Webサーバーのホスト名になります。
このホスト名の前に、自分のサーバーアカウント名(FTP や SSH でログインする際に使用するユーザー名)と @(アットマーク)をつけたものが、あなたの Webサーバーのメールアカウントになります。

例えば、Webサーバーのホスト名が「www.9999sakura.ne.jp」で、サーバーアカウント名が「abetatsuya」なら、メールアドレスは「abetatsuya@www.9999sakura.ne.jp」になります。

 

Webサーバーのメールアドレスに転送するためのメールアカウントの作成

上記で確認したメールアドレスを、直接スクリプト同様のメールアドレスとしてもいいのですが、Web上に公開しているサービスで、メールから起動するスクリプトを使うような場合は、このアドレスを公開するのはあまりお勧めできません。

別にスクリプト起動専用のメールアドレスを作成して、そのアドレスから、上記の Webサーバーのメールアドレスに転送するようにしておくのが無難かと思います。

というわけで、再びさくらのレンタルサーバのコントロールパネルに入り、「メールアドレスの管理」から一つメールアカウントを作成し、そのアカウントから「xxxxx@www.****sakura.ne.jp」に転送するように設定しておきましょう。

スクリプトのパーミッションの変更

実際にメール受信時に起動されるスクリプトのパーミッションを変更しておきましょう。

オーナーに実行権限が必要なので、「700」とか「755」とかにしとけば良いかと。

.forward の設定

SSH でログインし、vi 等で ~/.forward を以下のように編集します。

| /home/userame/dirname/scriptname

「|」(縦棒)を書いて、半角スペースを入れて、起動するスクリプトをフルパスで書けばOKです。

以上で設定は完了です。
コントロールパネルで作成したメールアドレス宛にメールを送れば、用意したスクリプトが起動されるはずです。

カテゴリー
Linux/UNIX | レンタルサーバー
タグ
.forward | sendmail | SMTP | UNIX | さくらのレンタルサーバー | コマンドライン | シェル | メール | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

メール受信時に PHP スクリプトを起動して自動処理させる方法

2009年4月 3日 19:27

以前、メール受信時に perl スクリプトを起動して自動処理させる方法という記事を書きましたが、それのPHP版です。

上記のエントリでも書いていますが、メール受信時に何らかの処理を行なうプログラムを作る場合、

  1. 特定のメールアカウントにメールが届いた際に、何らかのプログラムが起動するように設定する
  2. そのプログラムを書く

という2つのステップが必要ですが、そのうち1番目のステップに関しては、perl だろうが PHP だろうが、全く関係ありません。
なので、1ステップ目のメールサーバー側の設定に関しては、メール受信時に perl スクリプトを起動して自動処理させる方法を参照してください。

メールを処理する PHP スクリプトの書き方

PHP というと、Webアプリケーションに特化した言語、というイメージがありますが、もちろん perl と同じように、シェル的な使い方もできます。

メールを受け取った PHP スクリプトで、標準入力の内容を読めば、メール受信時の処理を行なえます。

ちなみに PHP の場合、PEAR の Mail_Mime というパッケージを使うと、メール受信時の処理が非常に簡単になります。

PEAR については、さくらのレンタルサーバーに PEAR をインストールするも参考にどうぞ。

#-- PEAR の Mail/mimeDecode.php を読み込む
require_once 'Mail/mimeDecode.php';

#-- メールデータ取得
$params['include_bodies'] = true; 
$params['decode_bodies']  = true; 
$params['decode_headers'] = true; 
$params['input'] = file_get_contents("php://stdin"); // 標準入力
$params['crlf'] = "\r\n"; 
$mail_data = Mail_mimeDecode::decode($params); 

#-- From フィールドの取得
$FromAddress = $mail_data->headers['from']; 

#-- To フィールドの取得
$ToAddress = $mail_data->headers['to']; 

#-- Subject フィールドの取得
$Subject = $mail_data->headers['subject'];
$Subject = mb_convert_encoding($Subject,"UTF-8","JIS");

#-- 本文の取得
$MailBody = $mail_data->body;
$MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");

後は、取得したデータを元に、色々処理すれば良いです。

なお、添付ファイルつきのメールの場合、本文を上記の方法で取得できないと思います。あくまでテキストメールの場合の例ですので悪しからず。

カテゴリー
PHP
タグ
Mail_Mime | PEAR | PHP | sendmail | SMTP | UNIX | ケータイメール | コマンドライン | メール | モバイル | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

さくらのレンタルサーバーに PEAR をインストールする

2009年4月 1日 19:23

PEAR とはPHP Extension and Application Repository の略で、PHP のライブラリが色々入っているパッケージ群です。

さくらのレンタルサーバーには、一応 PEAR は入ってるみたいですが、用意されているパッケージが少ないので、もともと用意されているライブラリ以外のものを使いたい場合は、自分のサーバー領域にローカルコピーをインストールする必要があります。

というわけで、さくらのレンタルサーバーに PEAR をインストールする手順のメモです。

1. SSH でサーバーにログインする

SSH でサーバーにログインします。

2. 設定ファイルの作成

以下のコマンドで、PEAR のローカル設定ファイルを作成。

pear config-create /home/user/pear .pearrc

user」の部分はもちろん自分のユーザー名にすること。

3. .cshrc にパスを追加する

vi か何かで .cshrc を開き、「set path」の行に、以下を追加する。

~/pear/bin

4. PEAR のインストール

以下のコマンドで、ホームディレクトリに「pear」というディレクトリが作られ、パッケージが保存できるようになります。

pear install -o PEAR

5. 追加したいパッケージのインストール

続いて、自分が使いたいパッケージをインストールします。

例えば、Mail_Mime が使いたければ、

pear install Mail_Mime

とやればOK。

6. パッケージのリストを確認

以下のコマンドで、インストールされている PEAR パッケージのリストが確認できます。

pear list

これで、先ほどインストールしたパッケージ(前述の例では Mail_Mime)が一覧に表示されていれば、完了です。

7. 実際に PHP スクリプト内で PEAR を使うとき

普通なら、

require_once ("Mail/mimeDecode.php");

みたいな感じで、使用するパッケージを指定しますが、そのままだとパスが通っていないので、 include_path に「/home/user/pear/php」を追加するか(未確認)、以下のようにフルパスでパッケージを指定すればOKです。

require_once ("/home/user/pear/php/Mail/mimeDecode.php");

参考: Manual :: 共有ホストでの PEAR のローカルコピーのインストール

カテゴリー
PHP | レンタルサーバー
タグ
PEAR | PHP | UNIX | さくらのレンタルサーバー | コマンドライン | シェル | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

超初級ftpコマンドリファレンス

2007年12月 7日 18:16

今日も旧ブログから転載です。

これもだいぶ前に書いたエントリーですが、今回のネタは、まあ今でも需要は微妙にあるかな?


今更コマンドラインでftpする機会なんてさほどないんですが、ネットワーク系のスクリプトを組む時とかには使いまくりますし、以前仕事で新規にソフトを入れちゃ駄目なPC(しかもftpソフトが入っていない!)で作業させられた時には当然コマンドラインからftpするしかありませんでしたし。
あと、WebサーバーAからWebサーバーBにちょっとデカめのファイルを移したい時なんかは、WebサーバーAから一旦DLしてWebサーバーBに再upなんてするよりも、SSHでWebサーバーAに入ってそこからコマンドラインでftpしてWebサーバーBに移した方が遥かに速い(Webサーバー間は上位回線で繋がってることも多いですし)。

そしてこれをメモっておく一番のきっかけは、友人がちょっとした手違いで全角文字を含む名前のファイルをWebサーバー上に作ってしまった時、削除しようとしても普通のftpソフトだとファイル名をうまく認識しなかったようなので、コマンドラインから直接mdelで削除してみてもらったらうまくいった、ということがつい先日あったからです。

というわけで、メモとして残しておけばそれなりに役に立つかなということで、調べなくても私がすぐ書けるような超基本的なものだけでもまとめておきます。


ログインする

まず、コマンドプロンプトを開き、

ftp www.servername.com

と入力。
www.servername.comの部分にはサーバーのホスト名を。

Connected to www.servername.com.
220 ProFTPD 1.2.9 Server () [www.servername.com]
User (www.servername.com:(none)):

と返って来るので、ユーザー名を入力。

331 Password required for username.
Password:

と返って来るので、パスワードを入力。

230 User username logged in.

これでログイン完了。


超初級コマンドリファレンス

pwd
カレントディレクトリのパスを表示する。

ls
カレントディレクトリのファイル・ディレクトリ一覧を見る。
-a オプション: 「.」で始まるファイルも表示する
-l オプション: 各ファイルの詳細を表示する
私は ls -al として使うことが多いです。

cd
カレントディレクトリの移動
cd directory_name という風に、後に移動先のディレクトリ名を指定する

ascii
転送モードを ascii に指定する

bin
転送モードを binary に指定する

put
ファイルのアップロード
put file_name という風に、後にアップロードするローカルのファイル名を指定する

mput
複数のファイルのアップロード
mput *.txt という風に、ワイルドカードを使って一度に複数のファイルをアップロードする

get
ファイルのダウンロード
get file_name という風に、後にダウンロードするホスト側のファイル名を指定する

mget
複数のファイルのダウンロード
mget *.txt という風に、ワイルドカードを使って一度に複数のファイルをダウンロードする

ren
ファイル・ディレクトリの名前変更
ren old_name new_name という風に、変更前のファイル名、変更後のファイル名の順で指定する

del
ファイルの削除
del file_name という風に、削除するファイル名を指定する

mdel
複数のファイルの削除
mdel *.txt という風に、ワイルドカードを使って一度に複数のファイルを削除する

mkdir
ディレクトリの作成
mkdir directory_name という風に、後に作成するディレクトリ名をつける

rmdir
ディレクトリの削除
rmdir directory_name という風に、後に削除するディレクトリ名をつける

quote site chmod
パーミッションの変更
quote site chmod 755 sample.cgi という風に、変更後のパーミッション、対象ファイル名の順で指定する

bye
ホストとの接続を切断し、終了する

ちなみに、ftp接続時のローカル側の操作は、頭に!をつけてコマンドを使えばOKです。
例: Windowsなら !dir とすれば現在のローカル側のカレントディレクトリの一覧が表示できる。

カテゴリー
Web制作技術
タグ
FTP | コマンドライン
関連するブログ記事

コメント(0) | トラックバック(0)

 

PostgreSQL で連番の数字のフィールドを作る方法 (sequence について)

2007年12月 1日 23:59

データベースでデータを管理する上で、何らかの連番の数字を割り振って、一意の ID とするのは、よくある手法かと思います。

例えば「最近飲んだお酒リスト」なんていうテーブルがあったら、

LiquorList
LiquorID LiquorName LiquorDate
1 モスコミュール 2007-11-26
2 白ワイン 2007-11-27
3 モスコミュール 2007-11-28
4 モスコミュール 2007-11-29
5 ウォッカ 2007-11-30

こんな感じで、「LiquorID」に数字を連番で振っていく、というケースですね。

こういう風に、順番に番号を振っていく際に使うのが、sequence(シーケンス)というものです。

sequence (シーケンス) の作成

sequence (シーケンス) は、「create sequence シーケンス名 オプション」という SQL文で、作成できます。

例えばシンプルに、1 からスタートして、1 ずつ増加していく「LiquorID_seq」シーケンスを作る場合は、下記のような SQL文になります。

create sequence LiquorID_seq;

初期値を 1 ではなく、例えば 10001 にしたい場合は、「start」というオプションをつけて、

create sequence LiquorID_seq start 10001;

とやれば OK 。

sequence (シーケンス) を使ったテーブルへのデータ追加 (insert文)

とりあえず、連番の数字を管理するためのシーケンスはできあがりました。

次は、実際にこのシーケンスで管理している数字を、テーブルに反映しないといけないわけです。

前述の「最近飲んだお酒リスト」の例だと、「2007年12月1日はビールを飲んだ」場合、このテーブルに 6番目のデータとして、

  • LiquorID ⇒ 6
  • LiquorName ⇒ ビール
  • LiquorDate ⇒ 2007-12-01

を追加する必要があります。

で、LiquorID の連番の数字は先ほど作成したシーケンス「LiquorID_seq」で管理しているので、そのデータを参照する必要があります。

シーケンスで管理している連番の数字の「次の番号」を取得する際には「nextval」という関数を利用します。

具体的には、

insert into LiquorList (LiquorID, LiquorName, LiquorDate)
values (nextval('LiquorID_seq'), 'ビール', '2007-12-01');

という SQL文でデータを追加すれば、自動的にLiquorIDには「次の数字」である 6 が入るわけです。

nextval 関数を呼び出したら、自動的に、参照したシーケンス内の数値は「次の数字」に更新されるので、楽チンです。

もっと楽に連番を発行する方法

実は、create table 文でテーブルを作成する際に、フィールドに対して「serial」というデータ型を指定すれば、勝手にシーケンスを作って、データ挿入時も勝手に連番を発行してくれます。

なので今回の例の場合でも、最初にテーブルを作る際に、

create table LiquorList (
LiquorID serial PRIMARY KEY,
LiquorName text NOT NULL,
LiquorDate timestamp NOT NULL);

みたいな感じにしておけば、勝手に LiquorList_LiquorID_seq という名前のシーケンスも同時に作成してくれます。

さらに、その後テーブルにデータを追加する際も、

insert into LiquorList (LiquorName, LiquorDate) values ('ソルティドッグ','2007-12-02');

という風に、LiquorID には何も指定せずに insert しても、自動的に LiquorID には LiquorList_LiquorID_seq の「次の数字」が入ってくれます。
凄く楽です。

カテゴリー
PostgreSQL
タグ
PostgreSQL | RDBMS | sequence | serial型 | SQL | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

PostgreSQLで複数のテーブルを結合して処理する方法

2007年11月26日 03:15

今日は久々に旧ブログから記事を引っ張ってきました。

以下は二年以上前に書いたブログ記事の転載です。


新鮮なネタがないので、ストックの中からPostgreSQLネタでも。
というわけで、PostgreSQLで複数のテーブルを結合して処理する方法のメモです。

「複数のテーブルを結合して集計する」というのがどういう意味かと言うと、例えばまず会員制のショッピングサイトなどでユーザーの情報を管理するDBがあると仮定します。
で、一つ目のテーブル「TABLE1」には下記のように、ユーザーID・ユーザーの氏名・ユーザーのメールアドレス等の基本情報が格納されているとします。

TABLE1
UserID UserName MailAddress
Amethyst 鬼瓦 権三郎 amethyst@amethyst-web.org
Alexandrite 俵田山 兼松 alexandrite@amethyst-web.org
Sapphire 平等院 鳳凰堂 sapphire@amethyst-web.org

次に、二つ目のテーブル「TABLE2」には、各ユーザーの購入商品の情報が格納されているとします。
例えば、注文ID・注文者のユーザーID・商品名・商品価格etc。

TABLE2
OrderID UserID ItemName ItemPrice
1 Amethyst 扇風機 2980
2 Amethyst エアコン 99800
3 Sapphire コーヒーメーカー 2800
4 Amethyst 電気コタツ 5800
5 Alexandrite 上戸彩写真集 4800
6 Sapphire マグカップ 1200
7 Alexandrite エロマンガ 980

さて、上記の注文商品の情報が格納されたTABLE2のデータを元に、注文したユーザー宛に一括で受注確認のメールを送信するプログラムを作りたい時、どうすれば良いでしょうか。

単純に処理しようと思えば、まずTABLE2のデータを一行ずつ取得し、その情報の中からユーザーIDを取得し、次にそのユーザーIDをキーにしてTABLE1からメールアドレスを取得、という流れになります。
perlで書くと、下記のような感じ

#-- TABLE2のデータを取得
$SQLstat1 = $DB->prepare("select OrderID, UserID, ItemName, ItemPrice from TABLE2");
#-- 一行ずつ処理する
while(@DATA = $SQLstat1->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice) = @DATA;
    #-- $UserIDをキーにしてTABLE1のデータを取得
    $SQLstat2 = $DB->prepare("select UserName, MailAddress from TABLE1 where UserID = '$UserID'");
    #-- 取得したデータを変数にセット
    ($UserName,$MailAddress) = $SQLstat->execute;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

※上記の処理の場合は、実際にはプレースホルダを使った方が良いと思いますが、ここでは処理の流れをわかりやすくするために敢えてこういう記述にしました。

さて、上記のスクリプトの場合は一つ目のselect文の中で何度も別のselect文を発行していることになります。
が、select文にinner joinという句を使うと、一度のSQL文で上記の処理を済ますことができます。
↓こんな感じ。

#-- TABLE2のデータを元にTABLE1からUserIDをキーにしてデータを取得
$SQLstat = $DB->prepare("select TABLE2.OrderID, TABLE2.UserID, TABLE2.ItemName,
 TABLE2.ItemPrice, TABLE1.UserName, TABLE1.MailAddrss
 from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID");
#-- 一行ずつ処理する
while(@DATA = $SQLstat->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice,$UserName,$MailAddress) = @DATA;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

上記スクリプトの
from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID
の部分がポイントです。
これは「TABLE2とTABLE1を結合するよ。条件として"TABLE2のUserIDとTABLE1のUserIDが同じ"データを結合してね」
ということです。
ちなみに、上記select文で出てくる TABLE2.OrderID とか TABLE1.UserID とかはそれぞれ「TABLE2内のOrderID」「TABLE1内のUserID」を表します。

このinner join句は、select文だけではなくupdate文にも使えますので何かと便利です。
delete文には使った記憶がないのでよくわかりません。多分使えるんじゃないですかね?

カテゴリー
PostgreSQL | perl/CGI
タグ
inner join | perl | PostgreSQL | RDBMS | SQL | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

メール受信時に perl スクリプトを起動して自動処理させる方法

2007年11月20日 10:46

メールが届くと同時に何らかのアクションを起こすプログラムというのは、かなり作る機会の多い部類に入るかと思います。

ここ数年で特に多いものだと、ケータイ向けサイトの案件で、空メールを受信したら自動でユーザー登録用のフォームのアドレスを書いたメールを、空メール送信者に送る、みたいなものとか、ブログやSNSの日記なんかを、ケータイメールで投稿できるようにする処理とかですね。
そして王道の自動返信メールとか。

後、途中で飽きちゃったんですが、昔、送られてくるメールの内容を自分で学習して言葉を覚えて、文章を生成して返信する bot (人工無脳)を趣味で作ってたことがあります。

で、実際こういう「メールを受け取ったら何らかの処理を自動で行なう」という機能を実現するには、どうすれば良いかというと、

  1. 特定のメールアカウントにメールが届いた際に、何らかのプログラムが起動するように設定する
  2. そのプログラムを書く

という二つのステップが必要になります。

まずは、この1ステップ目の「特定のメールアカウントにメールが届いた際に、何らかのプログラムが起動するように設定する」方法について、簡単にまとめてみます。

aliases を使う場合

aliases の設定と使い方についてのメモにも書きましたが、下記のようにすることで、特定のアカウントに届いたメールを、パイプを使って直接何らかのプログラムに渡して実行することができます。

entry: "|/home/tatsuya/entry.pl"

上記の例では、「entry」というメールアカウントにメールが届いた際に、自動的に「/home/tatsuya/entry.pl」という perl スクリプトが起動するように設定しています。

~/.forward を使う場合

サーバーの各ユーザーアカウント毎に、個別に設定が可能な ~/.forward を使う場合は(レンタルサーバーを使う場合はこちらの方が利用する機会が多いかもですね)、~/.forward に以下のように書けばOKです。

"|exec /home/tatsuya/entry.pl"

procmail を使う場合

届いたメールに対して、自動でマッチング処理等を行なって、結果によって行なう処理を振り分けてくれる便利な存在である procmail を使う場合は、~/.procmailrc に以下のように書きます。

:0 :
* ^To: entry
| /home/tatsuya/entry.pl

^To: entry」の部分は正規表現が使えるので、メールのヘッダ(FromやSubject等)に対して細かい条件を設定して振り分けることで、一つのメールアカウントで様々な処理を行なうことができるのも良いですね。

メールを処理する perl スクリプトの書き方

さて、続いて第2ステップ「そのプログラムを書く」の部分です。

aliases、~/.forward、procmail の三種類の設定方法を紹介しましたが、どの方法を用いても、「指定したプログラムの標準入力に、受け取ったメールの内容を渡す」というのは同じです。

つまり、受け取る側の perl スクリプトでは、標準入力の内容を読めば良いだけです。

while(<STDIN>){
	#-- 「$_」にメールの内容(ヘッダも本文も添付ファイルも全て)が
	#-- 一行ずつ代入されていくので、正規表現とかを使って色々処理する
}

これだけです。

後は、「メール送信者のアドレスをデータベースに登録しておいて、ユーザー登録用のURIを生成してメールを返信する処理を書く」とか、「メール送信者のアドレスからユーザーIDを引っ張ってきて、メール本文の内容をそのユーザーIDの日記に投稿させる」とか、「本文を形態素解析して、内容を bot (人工無脳)に覚えさせる」とか、色々とやれば良いわけです。

カテゴリー
Linux/UNIX | perl/CGI
タグ
.forward | aliases | perl | procmail | sendmail | SMTP | UNIX | ケータイメール | コマンドライン | メール | モバイル | レンタルサーバー | 人工無脳
関連するブログ記事

コメント(3) | トラックバック(1)

 

aliases の設定と使い方についてのメモ

2007年10月21日 01:47

順番的には、virtmapsの設定と使い方についてのメモよりも先にこっちを書くべきだったかなぁ、とか思ったりもして、とりあえず今回は aliases についてのメモです。

aliases とは

/etc/aliases (VPS の場合は ~/etc/aliases) にある設定ファイルのことです。

このファイルを編集することで、sendmail のメールアカウントに対して、別名(エイリアス)を設定することができます。

aliases の設定方法

例えば、「info」というアカウント宛のメールを、実際には「webmaster」というアカウントに配送したい、という時には、

info: webmaster

と書きます。

同一サーバー内ではなく、別のドメインのメールアドレス等に転送をしたいという場合は、

info: another@domain.com

のようにすれば、「info」宛のメールを「another@domain.com」に直接転送できます。

さらに、サーバーのメールボックスに保存しつつ転送、ということも可能です。
その場合、

info: webmaster, another@domain.com

と書けば、「info」宛のメールを「webmaster」のメールボックスに保存しつつ、「another@domain.com」に転送できます。

また、

junk: /dev/null

という風に、配送先を/dev/nullに指定すると、どこにも届かなくなるので、ムダなエラーメール・SPAMメールのログで容量を取りたくない、なんて時には virtmaps のワイルドカードと組み合わせる事で、役に立つかもしれません。

届いたメールを、パイプを使って直接何らかのプログラムに渡して実行することもできます。

autoresponse: "|/usr/bin/autoresponse-script"

等と設定すれば、「autoresponse」というアカウント宛のメールが届いた時に、自動で「/usr/bin/autoresponse-script」というプログラムが実行されます。

特定のメールに対する自動返信スクリプト等を書いた際に便利ですね。

設定ファイルを編集した後は、シェル上で、

% newaliases

というコマンドを実行すれば、設定が反映されます。

ただし、VPS(バーチャル・プライベート・サーバー)の場合には、

% vnewaliases

というコマンドになります(VPSにもよるんでしょうけど)。

aliases でできないこと

virtmaps の設定と使い方についてのメモでも書いた通り、 aliases では所謂「バーチャルドメイン」とか「バーチャルサブホスト」等と呼ばれる、複数ドメインをひとつのサーバーアカウントで管理する場合には、その「複数ドメイン」という概念に対応できません。

「goodhope.jp」と「abe-tatsuya.com」という二つのドメインを管理していた場合、 aliases で、

hatsunemiku: miku

と設定していたら、「hatsunemiku@goodhope.jp」宛のメールも「hatsunemiku@abe-tatsuya.com」宛のメールも、どちらも「miku」というアカウントに配送されてしまいます。

aliases だけでは異なるドメインのメールアカウントに対しての別名(エイリアス)を設定することはできないので、それを実現するためには virtmaps を使う必要があります。

ただし、 virtmaps の方はパイプを使って、メール受信時に直接プログラムを起動するようなことができないので、どちらも併用することになるでしょう。

ちなみに、メールが届いた際に処理される順番は、 virtmaps ⇒ aliases の順番です。

カテゴリー
Linux/UNIX
タグ
aliases | sendmail | SMTP | UNIX | virtmaps | VPS | コマンドライン | シェル | メール | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

virtmapsの設定と使い方についてのメモ

2007年10月18日 04:25

virtmaps とは

同一サーバーで、複数のドメインを利用する、所謂バーチャルドメインとかバーチャルサブホストとか、そんな感じで呼ばれているやつで使います。

SMTPサーバーは、このバーチャルドメインとかバーチャルサブホストとか呼ばれるものを処理できないらしいです。

例えば、僕が使っているこのレンタルサーバーで、今「abe-tatsuya.com」(このブログのドメインですね)と「goodhope.jp」(仕事の方のサイトのドメインです)の二つを管理しています。

その場合、Apache(Webサーバー)は、「abe-tatsuya.com と goodhope.jpは別物だ」と理解していますが、SMTPサーバーの方は、「hatsunemiku@abe-tatsuya.com と hatsunemiku@goodhope.jp は、どちらも同じうちのサーバーの hatsunemiku アカウント宛のメールだ」としか理解できません。
つまり、どっちのドメイン宛にメール出しても「hatsunemiku」という同一のメールボックスに届くわけです。

これだと、複数のドメインの「info@~~」とか「webmaster@~~」とか「support@~~」みたいな、よくあるわかりやすいメールアドレスを、それぞれ別のメールボックスで管理できなくて不便ですよね。

それを解決するのが、 virtmaps です。

virtmaps の設定方法

~/etc/virtmaps という設定ファイルを編集することで、virtmaps の挙動を設定することができます。

基本的な使い方は簡単。例えば上記の例の場合なら、

hatsunemiku@abe-tatsuya.com	hatsunemiku_a
hatsunemiku@goodhope.jp	hatsunemiku_g

という二行を追加すれば、「hatsunemiku@abe-tatsuya.com」宛のメールは「hatsunemiku_a」というメールボックスへ。「hatsunemiku@goodhope.jp」宛のメールは「hatsunemiku_g」というメールボックスへ。それぞれ渡されます。
※もちろん、事前に「hatsunemiku_a」「hatsunemiku_g」というメールアカウントを作成しておく必要があります。

設定ファイルを編集したら、シェル上で、

% vnewvirtmaps

というコマンドを実行すれば、編集した設定が反映されます。

また、ちょっと便利な使い方としては、例に出した「hatsunemiku@goodhope.jp」なんていうメールアドレスの場合、メール送信者がアドレスを直接入力して送ろうとした際に、間違って「hatunemiku@goodhope.jp」宛に送ってしまう、というようなことは、ありがちですよね。

こういう時に、

hatsunemiku@goodhope.jp	hatsunemiku_g
hatunemiku@goodhope.jp		hatsunemiku_g

としておけば、スペルミスの方のメールアドレスでも、ちゃんとメールボックスにメールが届きます。
(まあこれは本来 aliases で設定するべきものかもですが……それを複数ドメインで実現するには virtmaps じゃないと無理ですよね)。

それと、 virtmaps ではドメイン名でのワイルドカードが使えるので、

abe-tatsuya.com	tatsuya

としておくと、「aaaaa@abe-tatsuya.com」だろうが「kameda-brothers@abe-tatsuya.com」だろうが、そのメールアカウントを作っている・作っていないおかまいなしに、全ての「abe-tatusya.com」ドメイン宛のメールが「tatusya」のメールボックスに届きます。
※もちろん「tatsuya」というメールアカウントだけは作っておかないといけませんが。

なお、virtmaps の設定ファイルは、上から順に判定されていき、マッチした時点で処理され、そこから先は判定されません。
ですので、

abe-tatsuya.com		tatsuya
hatsunemiku@abe-tatsuya.com	hatsunemiku_a

とやっちゃうと、「hatsunemiku@abe-tatsuya.com」宛のメールも一行目の条件にマッチしてしまうため、「hatsunemiku_a」には届かず「tatsuya」に届いてしまいます。

virtmaps でできないこと

まず、正規表現は使えません。

正規表現が使えたら、何かのWebアプリケーションの動作確認テストとかで大量にメールアドレスを作って、新規登録のエラーパターンを試したい、とかいう時に、

test\d{3}@goodhope.jp	test

とか設定できると、凄く便利なんですけどね……。

それと、届いたメールを、パイプを使って何らかのプログラムに渡すようなこともできません。

Webアプリケーション側で、ランダムな文字列でメールアドレスを生成して、そのアドレス宛にユーザーからメールを送ってもらうことで、何らかの認証をする、なんていう仕組みは、特に携帯関連でこれからどんどんニーズが高まっていくと思いますが(mixiとかOpenPNEなんかも携帯での投稿機能をそれで実現してますよね)、それを virtmaps だけで実現することは出来ません。

mobile-service.com	"|/home/tatsuya/mail-filter.pl"

みたいなことができたら、凄く便利なんですけどね……。

ただ、これには抜け道があります。
virtmaps と aliases では、virtmaps が先に処理されて、その後 virtmaps によって振り分けられたアカウントに対して、aliases での設定が処理されるからです。

aliases ならパイプが使えるので、 virtmaps には

mobile-service.com	mailfilter

みたいな感じで、全てのメールを mailfilter アカウントに渡すようにしておいて、 aliases の設定ファイルに、

mailfilter: "|/home/tatsuya/mail-fileter.pl"

という風に「mailfilter」というアカウント宛のメールを「/home/tatsuya/mail-fileter.pl」に渡すように設定しておけば、結果的に「mobile-service.com」ドメイン宛の全てのメールを、「/home/tatsuya/mail-fileter.pl」というプログラムに渡して、何らかの認証処理等を行うことができるわけです。

カテゴリー
Linux/UNIX
タグ
aliases | OpenPNE | sendmail | SMTP | UNIX | virtmaps | VPS | ケータイメール | コマンドライン | シェル | メール | モバイル | レンタルサーバー
関連するブログ記事

コメント(0) | トラックバック(0)

 

crontabの設定方法

2007年10月16日 23:59

今回は旧ブログから記事を引っ張ってきました。

cronの設定に関するメモ書きです。


予め定められたスケジュール通りに、定期的に処理を実行する cron 。
この名前はギリシャ神話の時の神クロノスから取ってるそうな。
以下、FreeBSDでのcron利用方法。

現在登録しているスケジュールの設定を表示するには、シェル上で、

% crontab -l

とする。

スケジュール設定を編集する時は、

% crontab -e

とすると、エディタが起動し、設定ファイル編集画面になる。

設定ファイルの記述方法は、一行につきひとつのスケジュールで、
分 時 日 月 曜日 コマンド
という形式。
「分 時 日 月 曜日」のそれぞれには * が使える。

例えば、サーバーのアクセスログを解析する /home/amethyst/src/analyze.pl というperlスクリプトを作った後、それを毎日朝の5時に実行したい、という時は、

0 5 * * * /usr/local/bin/perl /home/amethyst/src/analyze.pl

とすれば良い。

曜日は0が日曜で6が土曜となる。
毎週月曜と木曜の13時にcommandを実行したいなら、

0 13 * * 1,4 command

となる。
上記の例のように、コンマで区切ることで複数の条件を指定することができる。

標準出力に出力されるコマンドの実行結果は、設定したアカウントのメールアドレス宛に送信される。
結果をメールで受け取りたくない場合は、出力を /dev/null に渡せば良い。

0 13 * * 1,4 command 1> /dev/null

上記のように設定しても、標準エラー出力に対する出力(要するに何らかのエラーがあった際のメッセージ)はメールで送信される。
エラー出力もメールで受け取りたくい場合は、

0 13 * * 1,4 command /dev/null 2>&1

とすれば良い。

cronからのコマンド実行時は環境変数がほとんど設定されないことが多いので、cronから直接コマンドを実行するよりも、最初からシェルスクリプト内に環境変数設定とコマンドを書いて、cronからそのシェルスクリプトを実行した方が余計な手間が省けることが多い。


ここまでが旧ブログの記事。

ここからは今回の追記です。

例えば、10分毎になんらかのプログラムを起動するするように設定したい場合、

0,10,20,30,40,50 * * * * command

と書けばいいわけですが、ちょっとめんどくさいですよね。

そういう場合は、

*/10 * * * * command

と書けば、10分毎にcommandが実行されます。

カテゴリー
Linux/UNIX
タグ
crontab | FreeBSD | UNIX | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

PostgreSQLの初歩

2007年8月 7日 23:59

毎度毎度、旧サイトからの転載で申し訳ないんですが……。
ちょうど今日客先でWebアプリ構築の仕事をやっていて、単純なSQL文すら忘れていることに愕然としたんですよ。

最近、PostgreSQLを全然触ってなかったからなぁ……。
こんな程度を忘れるのはさすがに自分でも酷いと思うけど。

結局、客先でWayBack Machineから自分の旧サイトをひっぱり出して、これを調べる始末。

なので次に同じことが起きたときのために、今のうちにこっちに移しておきます。

というわけで、以下は旧サイトからの転載です。


データベースを作る

シェル上で createdb コマンドを実行。

% createdb Amethyst	# "Amethyst"はデータベース名
CREATE DATABASE	# レスポンス

これでデータベース作成完了。
レンタルサーバーなんかだと、最初から自分のアカウント名のデータベースを用意してくれてることが多いみたい。
そういうところは大抵自分で新たにデータベースを作成することはできないと思う。
そんな場合はデータベース作成は飛ばして次へ。


psqlの起動

シェル上で psql コマンドを実行する。引数としてデータベース名を指定。
この際、引数を指定しない場合は自動的に自分のアカウント名が引数にセットされる。

% psql Amethyst
# 以下、レスポンス
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit
# ここまで
Amethyst=>

psqlを起動すると、プロンプトは「データベース名=>」になる。
この際、設定によってはユーザー名やパスワードを要求されることもある。

psql起動中は、SQL文の他に「internal slash commands」(個人的に「\コマンド」と呼んでる)とやらが使える。
個人的によく使うのは以下。

  • \q psqlの終了
  • \d データベース内のテーブルを一覧表示
  • \h SQL文のヘルプを表示
  • \? \コマンドの一覧表示

テーブルの作成

テーブルの作成は
「create table テーブル名 ( フィールド(列)名 データ型 オプション , フィールド名 データ型 オプション , ……);」
というSQL文で行う。
create table に限らず全てのSQL文のラストには、セミコロン「;」をつけなければならない。
逆に言うと、セミコロンをつけるまで、一つのSQL文を何行にも渡って記述することも可能。
というか、そうしないとやってられない。

ID,Name,Password,Email という四つのフィールド持つ UserList というテーブルを作るには下記のようにする。

Amethyst=> create table UserList (
# 以下、括弧内の部分を記述しているということが一目でわかるよう
# プロンプトが「(>」に変わるところが便利
Amethyst(> ID text PRIMARY KEY,
Amethyst(> Name text NOT NULL,
Amethyst(> Password text NOT NULL,
Amethyst(> Email text
Amethyst(> );
# 以下、レスポンス
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'userlist_pkey' for table 'userlist'
CREATE

フィールド「ID」に「PRIMARY KEY」のオプションをつけたので、自動的に「userlist_pkey」というindexが作成される。
indexが何なのか理屈はよく知らないけど、とりあえずこれでIDをキーに検索するときは効率が良くなるらしい。


データ型

個人的によく使う、フィールドのデータ型は下記。

numeric
バイト数可変の1000桁までの正数と小数。
数値を格納するフィールドはよっぽど特殊な場合以外はこれでOKだと思う。
text
バイト数可変の文字列。
上に同じく文字列を格納するフィールドはよっぽど特殊な場合以外はこれでOKだと思う。
timestamp
日付・時刻。
入力・取り出しは「2003-04-20 17:05:06」の形式が使いやすいと思う。
inet
IPアドレス。
ネットワーク系の処理のために使うのでなければtext型でも充分だけど、せっかく専用のデータ型が用意されてるので使ってるだけ……。

オプション

個人的によく使う、フィールドのオプション(という呼び方は正しくないような気もするけど)は下記。

PRIMARY KEY
ひとつのテーブルにつきひとつのフィールドにしか指定できない。
indexが作成されるので、このフィールドをキーにした検索は効率が良いらしい。
フィールドが一意で、かつ、NULLではないという条件がある。
UNIQUE
ひとつのテーブル内の複数のフィールドに指定できること以外は PRIMARY KEY と基本的に同じだと思う。
PRIMARY KEY に指定したフィールドは、自動的に UNIQUE も指定されている。
NOT NULL
NULL値を認めないフィールドに指定。
PRIMARY KEY や UNIQUE に指定したフィールドは、自動的に NOT NULL も指定されている。
DEFAULT value
新たな行が追加された時に、自動的に挿入されるデフォルト値(value)を指定できる。

フィールドの追加

既存のテーブルにフィールドを追加する時は
「alter table テーブル名 add フィールド名 データ型 オプション;」
というSQL文で行う。

先程作ったテーブル UserList に BirthDay というフィールドを追加する場合は下記のようにする。

Amethyst=> alter table UserList add BirthDay timestamp;
ALTER TABLE	# レスポンス

numeric型のフィールドを追加する時は、デフォルト値として 0 をセットしといた方が良いと思う。
そうしないと、フィールドを追加する前に存在した行の該当フィールドの値は全てNULLになるため後々不便(0 と NULL は別物なので)。
perlからデータベースを使う場合は特に。


既存フィールドのデフォルト値の設定

既存のフィールドの DEFAULT value の設定・変更は
「alter table テーブル名 alter フィールド名 set default デフォルト値;」
というSQL文で行う。

先程作ったテーブル UserList の Email フィールドにデフォルト値 anonymous を設定する場合は下記のようにする。

Amethyst=> alter table UserList alter Email set default 'anonymous';
ALTER TABLE	# レスポンス

なお、デフォルト値の設定を破棄する場合は「set default デフォルト値」の代わりに「drop default」を使う。

Amethyst=> alter table UserList alter Email drop default;
ALTER TABLE	# レスポンス
2003.04.26 追記

データの挿入

テーブルにデータを挿入するときは
「insert into テーブル名 (フィールド名1,フィールド名2,……) values (値1,値2,……);」
というSQL文で行う。

先程作ったテーブル UserList にデータを挿入する場合は下記のようにする。

Amethyst=> insert into UserList(
Amethyst(> ID,Name,Password,Email,BirthDay)
Amethyst-> values (	# SQL文の途中、かつ括弧内でない場合のプロンプトは「->」になる
Amethyst(> '00001',
Amethyst(> 'Amethyst',
Amethyst(> '01234567',
Amethyst(> 'amethyst@amethyst-web.org',
Amethyst(> '1976-05-06'
Amethyst(> );
INSERT 2910628 1	# レスポンス

値を入力するとき、数値以外はシングルクォーテーション「'」で囲むこと。


データの表示

テーブル内のデータを表示するときは
「select フィールド名1,フィールド名2,…… from テーブル名 条件 (ソート方法);」 というSQL文で行う。

先程作ったテーブル UserList から、「Emailが空でないデータのみ、NameとEmailを表示」する場合は下記のようにする。

Amethyst=> select Name,Email from UserList where Email != '';
# 以下、レスポンス
   name   |           email
----------+---------------------------
 Amethyst | amethyst@amethyst-web.org
(1 row)	# マッチした件数(行数)が表示される

全てのフィールドを表示したい時は、フィールド名をアスタリスク「*」一文字にするだけでOK。
「select * from テーブル名 条件 (ソート方法)」

where句以下の条件を指定しなければ、テーブル内のデータ全てが表示される。

特定のフィールドの値を元に昇順にソートして表示したい場合は、select文末尾に「order by フィールド名」
降順にソートして表示したい場合は「order by フィールド名 desc」


データの検索

前項の例のように、データの検索には
「where 条件」
という句をSQL文に追加して実行する。

単純にフィールドが条件と合致しているものを検索するには「where フィールド名 = 条件」。

複数の条件で検索するには「where フィールド名 in(条件1,条件2,……)」

逆に条件と合致していないものを検索するには「where フィールド名 != 条件」。

値の一部が合致しているものを検索するには「where フィールド名 like 条件」。
「%」が「0文字以上の何か」を表すので、「Aから始まる文字列」の検索は「where フィールド名 like 'A%'」という感じ。

numeric型やtimestamp型では「> < <= >=」もよく使う。

and や or を使って、複数の条件を指定するすることも可能。

別のテーブルの検索結果を条件に指定することも可能。
「where フィールド名 in (select文)」


データの更新

既存のデータの値を更新する時は
「update テーブル名 set フィールド名1=値1,フィールド名2=値2,…… 条件(where句)」
というSQL文で行う。

先程挿入したデータのPassword「01234567」を「abcdefgh」に変更する場合は下記のようにする。

Amethyst=> update UserList set Password='abcdefgh' where ID = '00001';
UPDATE 1	# レスポンス

where句以下の条件を指定せずに実行すると、テーブル内のデータ全てが更新されるので一括更新がしたいときは楽。
ただし、一括更新するつもりがない時はwhere句の指定を忘れないよう注意が必要。


データの削除

既存のテーブルからデータを削除する時は
「delete from テーブル名 条件(where句)」
というSQL文で行う。

先程挿入したデータを削除する場合は下記のようにする。

Amethyst=> delete from UserList where ID = '00001';
DELETE 1	# レスポンス

where句以下の条件を指定せずに実行するとテーブル内のデータは綺麗さっぱりなくなってしまうので要注意。


テーブルの削除

既存のテーブルそのものを削除する時は
「drop table テーブル名」
というSQL文で行う。

先程作成したテーブル UserList を削除する場合は下記のようにする。

Amethyst=> drop table UserList;
DROP TABLE	# レスポンス

前項のdelete文で全てのデータを削除してもテーブル自体は残っているので、テーブルそのものを削除する時はこちらを使う。


データベースのバックアップ

データベースのバックアップを取るときは、シェル上で pg_dump コマンドを実行。

% pg_dump Amethyst > AmethystDB.bak
# "Amethyst"はデータベース名。"AmethystDB.bak"はバックアップファイル名

これで"AmethystDB.bak"という名前のバックアップファイルが作成される。
中身はSQL文とかが沢山書かれたテキストファイル。

バックアップファイルをもとにデータベースを再作成するときは psql コマンドに -e オプションをつけて実行する。

% psql -e Amethyst < AmethystDB.bak
# "Amethyst"はデータベース名。"AmethystDB.bak"はバックアップファイル名
カテゴリー
PostgreSQL
タグ
PostgreSQL | RDBMS | SQL | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

.htaccessによるBasic認証のかけ方

2007年8月 6日 23:59

さて、昨日書いた通り、早速前のサイトで書いていたTipsをこちらに移行し始めることにします。

まずは、.htaccessによるBasic認証のやり方。

以下は、旧サイトからの転載です。


便利なんだけど一度設定したらそれっきりなので、それほど頻繁に設定をするわけでもない.htaccess。
いざ使おうとすると「あれ、どうやるんだっけ」てな感じになることが多々あるので備忘録としてメモっておきます。

人から設定の仕方をよく訊かれたようなものを中心に。
ということで、まずはBasic認証のかけ方を。

Basic認証をかけるためには、.htaccessに記述する前に、認証用のユーザー名と暗号化されたパスワードの記述されたファイルを作成する必要があります。
SSHまたはtelnetでサーバーにログインし、任意のディレクトリに移動した後、以下のコマンドでパスワードファイルを作成します。

% htpasswd -c password.dat Amethyst
New password:password
Re-type new password:password
#-- 下記はレスポンス
Adding password for user Amethyst

password.datはパスワードファイル名。任意のファイル名を設定すること。
Amethystは設定するユーザー名。任意のユーザー名を設定すること。
passwordは設定するパスワード。任意のパスワードを設定すること。実際には入力したパスワードは表示されない。

上記作業が終わると、ユーザー名:Amethyst、パスワード:passwordのパスワードファイル password.dat が作成されます。

上記パスワードファイルにさらに別のユーザーを追加する場合は、htpasswdコマンドに -c オプションをつけずに実行すれば良いです。

% htpasswd password.dat Sapphire
New password:abcdefg
Re-type new password:abcdefg
#-- 下記はレスポンス
Adding password for user Sapphire

とすれば、さきほど作成したパスワードファイル password.dat にユーザー名:Sapphire、パスワード:abcdefgの情報が追加されます。

なお、htpasswdコマンドで作成したパスワードファイルのフォーマットは、
ユーザー名:パスワード(暗号化済)
という形式で1ユーザーにつき1行ずつ記述されるので、perlのcrypt関数等を利用して、cgiを経由して作成することもできます。
なので、telnetやSSHでのログインが許可されていないレンタルサーバー等を利用している場合も、こういうやり方をすればパスワードファイルは作成できます。

さて、パスワードファイルを作成したら、次はBasic認証をかけたいディレクトリに、以下を記述した.htaccessを設置します。

AuthUserFile    /home/amethyst/data/pass/password.dat
AuthGroupFile   /dev/null
AuthName        "Input Your Name And Password"
AuthType        Basic
<Limit GET POST HEAD>
require valid-user
</Limit>
AuthUserFile
先ほど作成したパスワードファイルのパスを指定します。
AuthGroupFile
グループファイルによる認証を行なう時に使用。
単にユーザー名とパスワードだけで認証を行なう場合は /dev/null (未定義)としておけばOK。
AuthName
ユーザー名・パスワード入力用のウィンドウに表示させるメッセージ。
スペースを含む場合はダブルクォーテーションで囲む必要がある。
2バイト文字を使用すると多分文字化けする。
AuthType
認証のタイプ。Basic認証をかける場合は Basic とする。
<Limit method>~~</Limit>
methodの部分に、認証をかけたいメソッドを指定。
GET,POST,HEADの各メソッドに対して認証をかけたい場合はGET POST HEADとする。
メソッドを指定しない場合は、<Limit>~~</Limit>は記述しなくて良いはず。
require
認証するユーザーを指定する。パスワードファイルに記述したユーザー全てに対して認証を行なう場合はvalid-userとする。
特定のユーザーのみを認証する場合は、そのユーザー名を記述する。上記の例の場合、Amethystと記述しておけば、ユーザー名Sapphireで正しいパスワードを入力しても、認証は通らない。

この.htaccessを認証をかけたいディレクトリに設置すれば、そのディレクトリ及び下位ディレクトリに対して、Basic認証が働くようになります。

カテゴリー
.htaccess
タグ
.htaccess | Basic認証 | アクセス制限 | コマンドライン | シェル
関連するブログ記事

コメント(0) | トラックバック(0)

 

このブログについて

阿部辰也

Webコンサルタントやシステムエンジニア、執筆業などをやっている、グッドホープ代表・阿部辰也のブログです。
Web技術系のTipsから仕事の話、趣味の話まで色々と。
人生は所詮生まれてから死ぬまでの壮大な暇つぶし。
だったら有意義に暇をつぶして生きましょー。

Twitter: @t_abe
読書メーター: ID:t-abe

このブログのサイトマップ
このブログのはてなブックマーク数

Feed/RSS購読

最近一週間の人気記事

タグクラウド

最近のトラックバック

阿部辰也の著書

77のキーワードで知る インターネットで稼ぐ 図解 ブログ・メルマガ・Webサイト構築の基本

77のキーワードで知る インターネットで稼ぐ 図解 ブログ・メルマガ・Webサイト構築の基本

頑張って書いたのに、出版後すぐに出版社が倒産して印税も貰えずじまいで俺涙目(笑)。

Powered by Movable Type 4.261