KUMA TYPE

猫、パソコン、プログラム、映画、ドラマ、アニメ、perl、etc.

【perlメモ】SQLite DBI/DBDを使ったCREATE TABLE,INSERT,SELECT,UPDATE,DELETEのサンプル

SQLiteとDBI/DBDを使ってperlでプログラミングすることがよく有りますが、よく使うけどそのたびに過去のに書いたソース探したりして面倒なのでまとめておきます。


データベースファイルの作成

データベースファイルとテーブルを作成するサンプル。

make.pl

#!/usr/bin/perl
#
#
#http://www.sqlite.org/datatype3.html
#
#    1. Storage Classes
#    Each value stored in an SQLite database (or manipulated by the database engine) has one of the following storage classes:
#
#   * NULL. The value is a NULL value.
#   * INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
#   * REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
#   * TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16-LE).
#   * BLOB. The value is a blob of data, stored exactly as it was input.
#
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

my $sql = "CREATE TABLE TBL_USERS(
    idx INTEGER PRIMARY KEY,
    name TEXT,
    stat INTEGER
)";

my $ret = $hDB->do($sql);
unless($ret){
    die $hDB->errstr . " ret=$ret";
}

$hDB->disconnect;

実行するとTEST.DBというデータベースファイルが作成されます。


データの挿入(INSERT)

データベースにデータを追加します。

prepareしてexcuteするやり方

insertdb01.pl

#!/usr/bin/perl
#
#http://www.sqlite.org/datatype3.html
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use strict;
use warnings;
use utf8;
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

#$hDB->do(‘BEGIN’);

my $sql = "INSERT INTO TBL_USERS VALUES(NULL,?,?)";
#戻り値はDBハンドル
my $hst = $hDB->prepare($sql);
unless($hst){
    my $errstr = $hDB->errstr;
    $hDB->disconnect;
    die $errstr;
}
my $ret;
#戻り値は真偽値、select以外は影響を受けたレコード数0件の時は0E0(真値の0)を返す。
$ret = $hst->execute(‘TANAKA’,0);
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hst->finish;
    undef $hst;
    $hDB->disconnect;
    die $errstr;
}

$ret = $hst->execute(‘NAKAMURA’,0);
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hst->finish;
    undef $hst;
    $hDB->disconnect;
    die $errstr;
}

$ret = $hst->execute(‘SUZUKI’,0);
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hst->finish;
    undef $hst;
    $hDB->disconnect;
    die $errstr;
}

#$hDB->do(‘COMMIT’);
$hDB->commit;
$hst->finish;
undef $hst;#SQLiteバグ対策のおまじない
$hDB->disconnect;

 

doでやる方法
insertdb02.pl

#!/usr/bin/perl
#
#http://www.sqlite.org/datatype3.html
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use strict;
use warnings;
use utf8;
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

#$hDB->do(‘BEGIN’);

my $sql = "INSERT INTO TBL_USERS VALUES(NULL,?,?)";
my $ret;
#doはprepareとexecuteをまとめて行なう。影響を受けたレコード数を返す0件の時は0E0(真値の0)を返す。
$ret = $hDB->do($sql,undef,(‘ITOU’,1));
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hDB->disconnect;
    die $errstr;
}

$ret = $hDB->do($sql,undef,(‘SAKATA’,2));
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hDB->disconnect;
    die $errstr;
}

$ret = $hDB->do($sql,undef,(‘SATO’,3));
if(!$ret || $ret==0E0){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hDB->disconnect;
    die $errstr;
}

#$hDB->do(‘COMMIT’);
$hDB->commit;
$hDB->disconnect;

上記3つのプロうグラムの実行結果

F:\kumacchi\MyProgram\perl\sample\sqlite>perl makedb.pl

F:\kumacchi\MyProgram\perl\sample\sqlite>perl insertdb01.pl

F:\kumacchi\MyProgram\perl\sample\sqlite>perl insertdb02.pl

F:\kumacchi\MyProgram\perl\sample\sqlite>


データの抽出(SELECT)

総レコード件数と前レコードを抽出して表示するサンプル。

selectdb01.pl

#!/usr/bin/perl
#
#http://www.sqlite.org/datatype3.html
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use strict;
use warnings;
use utf8;
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

my $hst = $hDB->prepare(‘SELECT COUNT(*) FROM TBL_USERS’);
unless($hst){
    my $errstr = $hDB->errstr;
    $hDB->disconnect;
    die $errstr;
}

#戻り値は真偽値、select以外は影響を受けたレコード数0件の時は0E0(真値の0)を返す。
my $ret = $hst->execute();
unless($ret){
    my $errstr = $hDB->errstr;
    $hst->finish;
    undef $hst;
    $hDB->disconnect;
    die $errstr;
}

if(my $ref = $hst->fetchrow_arrayref){
    my $count = $ref->[0];
    print "count = $count\n";
}

#my $sql = "SELECT idx,name,stat FROM TBL_USERS WHERE stat=?";
my $sql = "SELECT idx,name,stat FROM TBL_USERS";
#戻り値はDBハンドル
$hst = $hDB->prepare($sql);
unless($hst){
    my $errstr = $hDB->errstr;
    $hDB->disconnect;
    die $errstr;
}

#戻り値は真偽値、select以外は影響を受けたレコード数0件の時は0E0(真値の0)を返す。
#$ret = $hst->execute(0);
$ret = $hst->execute();
unless($ret){
    my $errstr = $hDB->errstr;
    $hst->finish;
    undef $hst;
    $hDB->disconnect;
    die $errstr;
}

while(my $ref = $hst->fetchrow_arrayref){
    my($idx,$name,$stat) = @$ref;
    print "idx=$idx name=$name stat=$stat\n";
}

$hst->finish;
undef $hst;#SQLiteバグ対策のおまじない
$hDB->disconnect;

実行結果

F:\kumacchi\MyProgram\perl\sample\sqlite>perl selectdb01.pl
count = 6
idx=1 name=TANAKA stat=0
idx=2 name=NAKAMURA stat=0
idx=3 name=SUZUKI stat=0
idx=4 name=ITOU stat=1
idx=5 name=SAKATA stat=2
idx=6 name=SATO stat=3

F:\kumacchi\MyProgram\perl\sample\sqlite>


データの更新(UPDATE)

statが0のレコードのnameをYAMADA、stat=33に更新するプログラム

updatedb.pl

#!/usr/bin/perl
#
#http://www.sqlite.org/datatype3.html
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use strict;
use warnings;
use utf8;
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

#$hDB->do(‘BEGIN’);

my $sql = "UPDATE TBL_USERS SET name=?, stat=? WHERE stat=?";

my $ret;
#doはprepareとexecuteをまとめて行なう。影響を受けたレコード数を返す0件の時は0E0(真値の0)を返す。
$ret = $hDB->do($sql,undef,(‘YAMADA’,33,0));
#if(!$ret || $ret==0E0){
if(!$ret){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hDB->disconnect;
    die $errstr;
}

print "ret=$ret\n";

#$hDB->do(‘COMMIT’);
$hDB->commit;
$hDB->disconnect;

 

実行結果

  1. selectdb01.plで更新前の状態を表示。
  2. updatedb.plを実行しデータを更新。
  3. selectdb01.plを実行し更新後のデータを表示。

F:\kumacchi\MyProgram\perl\sample\sqlite>perl selectdb01.pl
count = 6
idx=1 name=TANAKA stat=0
idx=2 name=NAKAMURA stat=0
idx=3 name=SUZUKI stat=0
idx=4 name=ITOU stat=1
idx=5 name=SAKATA stat=2
idx=6 name=SATO stat=3

F:\kumacchi\MyProgram\perl\sample\sqlite>perl updatedb.pl
ret=3

F:\kumacchi\MyProgram\perl\sample\sqlite>perl selectdb01.pl
count = 6
idx=1 name=YAMADA stat=33
idx=2 name=YAMADA stat=33
idx=3 name=YAMADA stat=33
idx=4 name=ITOU stat=1
idx=5 name=SAKATA stat=2
idx=6 name=SATO stat=3

F:\kumacchi\MyProgram\perl\sample\sqlite>

 


データの削除(DELETE)

statが33のレコードを削除するプログラムサンプル。

deletedb.pl

#!/usr/bin/perl
#
#http://www.sqlite.org/datatype3.html
#
#    テーブル名:TBL_USERS
#0    idx        INTEGER PRIMARY KEY    プライマリーキー
#1    name    INTEGER                名前
#2    stat    INTEGER                ステータス
#
use strict;
use warnings;
use utf8;
use DBI;

my $mydb = "TEST.DB";

my $hDB = DBI->connect("dbi:SQLite:dbname=$mydb","","",{PrintError=>0});
die $DBI::errstr unless($hDB);

#$hDB->do(‘BEGIN’);

my $sql = "DELETE FROM TBL_USERS WHERE stat=?";

#doはprepareとexecuteをまとめて行なう。影響を受けたレコード数を返す0件の時は0E0(真値の0)を返す。
my $ret = $hDB->do($sql,undef,(33));
#if(!$ret || $ret==0E0){
if(!$ret){
    my $errstr = $hDB->errstr;
    $hDB->rollback;
    $hDB->disconnect;
    die $errstr;
}

print "ret=$ret\n";

#$hDB->do(‘COMMIT’);
$hDB->commit;
$hDB->disconnect;

 

実行結果

  1. selectdb01.plで削除前の状態を表示。
  2. deletedb.plでレコードの削除。
  3. selectdb01.plで削除後の状態を表示。

F:\kumacchi\MyProgram\perl\sample\sqlite>perl selectdb01.pl
count = 6
idx=1 name=YAMADA stat=33
idx=2 name=YAMADA stat=33
idx=3 name=YAMADA stat=33
idx=4 name=ITOU stat=1
idx=5 name=SAKATA stat=2
idx=6 name=SATO stat=3

F:\kumacchi\MyProgram\perl\sample\sqlite>perl deletedb.pl
ret=3

F:\kumacchi\MyProgram\perl\sample\sqlite>perl selectdb01.pl
count = 3
idx=4 name=ITOU stat=1
idx=5 name=SAKATA stat=2
idx=6 name=SATO stat=3

F:\kumacchi\MyProgram\perl\sample\sqlite>


参考

タグ : , , ,

カラーチャート作ってみた。

 

20100513

カラーコード表 カラーチャート

カラーコード表とかカラーチャートとかよく使うので、自分用の物をつくってみた。ずいぶん昔に作ったものをベースにzeroclipboardを付けてどのブラウザでもクリップボードにカラーコードをコピーできるボタンを追加したり、テキストボックスにカラーコードを入力すると画面に反映するようにしてみた。


使い方

  • 背景色チャートの各色をクリックするとそのカラーコードが背景色に設定され下部テキストボックスに表示されます。
  • 文字色チャートの各色をクリックするとそのカラーコードが文字色に設定され下部テキストボックスに表示されます。
  • [背景色をコピー][文字色をコピー]の各ボタンをクリックすると現在の色がコピーされます。
  • [背景色をコピー][文字色をコピー]の各ボタンをクリックすると現在の色がコピーされます。
  • [背景色][文字色]にカラーコードを直接入力して指定することもできます。

 

20100514

背景色と、文字色をマウスでクリックして選択すると上の様に画面に反映されます。

タグ : ,

【海外ドラマ】『Re:Genesis』の感想

Re:Genesis VOL.1 [PPV-DVD]
GyaOで海外ドラマ『Re:Genesis』の第1話を視聴した感想。製作国はカナダ。2004年から放映されている。バイオテロなどを扱ったSFサスペンス。

Re:Genesis|無料動画 GyaO![ギャオ]|ドラマ・アジア


ストーリー

NORBAC(ノーバック)という研究機関で働くデビッド・サンドストロム博士とその他研究員達が活躍するどドラマ。エボラ出血熱とラクダ天然痘の両方の特徴を持った凶悪な伝染病の感染者が発生し始める。調べているうちにこれが人工的に作られたバイオテロらしいということが判明する。それとは別にデビッドは自分はクローンなのでもうすぐ死んでしまうので何とかしてほしいという少年に付きまとわれる。


感想

出だしはちょっと低調でな感じだったのでどうしたものかと思ったが、徐々に話が盛り上がってきていい感じ。おもしろそう。まだ第1話しか見ていないので今後どうなるのかわからないが楽しみ。作品自体の感じとしては例えるならダスティン・ホフマン主演の映画『アウトブレイク』みたいな感じ、アウトブレイクが面白いと思う人ならおすすめできるかと思う。

リ・ジェネシス バイオ犯罪捜査班 – Wikipedia

タグ : , , ,

【映画】『死霊の罠2 ヒデキ』の感想

GyaO!で『死霊の罠2 ヒデキ』を視聴した感想。ジャンルはホラー1992年の邦画。出演は中島唱子、佐野史郎、近藤理枝。

死霊の罠2 ヒデキ|無料動画 GyaO![ギャオ]|映画


ストーリー

映画館の映写室で働く亜紀は人と話すのが苦手な女であるが、映写室から観客席を見るといないはずの子供が見えたりする。亜紀はよなよな女性を斬殺し子宮を引きずりだしたりする。


感想

意味不明。不条理な感じのホラー。あんまり意味が無い。内容もない。基本的に面白くない。でも、逆に興味がわいて最後まで見てしまう感じ。でもやっぱりつまらない、見ていて早く終わらないかなーという感じ。バブル時代臭が半端ない。怖いというより後半グロイ。バブル時代には金余りで税金対策なのかこういうゴミを量産したんだろうなーといった感じ。基本的に時間を無駄にしたくない人は見るのをおすすめしない。ホラーと言っても怖くないしグロイだけなのできもちわるいだけ。ルビーモレノとか出てるので若かりし日のルビーモレノや佐野史郎をみたい人グロイの好きな人はどうぞ。

評価:評価:1.5/5.0

死霊の罠2/ヒデキ – Wikipedia

タグ : , , , ,

【perlメモ】短縮URLなどからリダイレクト先の実際のURLを取得する方法

http://goo.gl/ne3oL

上記は、Google URL Shortenerで作成したこのブログの短縮URLです。アクセスすると実際にはhttps://blog.kumacchi.com/にリダイレクトされます。

この短縮URLから実際のURLを取得する方法。実行環境はWindowx XP Home、perl 5.8.8 ActivePerl

ソース:redirect02.pl
リダイレクト先のURLだけでなくサーバーのIPも取得するようにしています。

use strict;
use warnings;
use LWP::UserAgent;

my $url = ‘http://goo.gl/ne3oL’;

my $ua   = LWP::UserAgent->new;
#my $base = $ua->head($url)->base;
my $r    = $ua->head($url);

my $base = $r->base;
my $cp   = $r->header(‘client-peer’);

print "cp  : $cp\n";
print "base: $base\n";

実行結果

F:\kumacchi\MyProgram\perl\sample\リダイレクト先>redirect02.pl
cp  : 202.172.26.21:80
base: https://blog.kumacchi.com/

F:\kumacchi\MyProgram\perl\sample\リダイレクト先>

簡単です。

スパム対策などに活用できそうですね。

タグ : ,

【映画】『エイリアンVSプレデター』の感想

AVP2 エイリアンズVS.プレデター [Blu-ray]

GyaO!で『エイリアンVSプレデター』を視聴した感想。2004年のアメリカ映画。ジャンルはSF・アクション。興行的には成功している。

エイリアンvs.プレデター|無料動画 GyaO![ギャオ]|映画


ストーリー

ある日突然南極の氷の下に熱源が現れたことを衛星がキャッチする。どうやらピラミッドらしきものが氷の下600メートルにあるらしい事が判る。ある資産家は病に侵され残り少ない人生を掛けて歴史に名を残すべく世界中からスペシャリストをあつめこのピラミッドの探検を試みる。


感想

前にも何かで見たことがある。普通に見る分には十分面白い。普通に考えると、1980年代の兵士に倒されるプレデターと、宇宙航海時代の装備の人間たちでさえ全滅させられてしまうエイリアンがまともに戦ってもエイリアンが強いに決まってるだろうというイメージがどうしてもある。あまりSFという感じじゃない。取ってつけたようなプレデターとエイリアンの関係の設定がもうちょっと頑張って欲しいと思う。

ギリギリ助かるか助からないかというアクションがあまりにもギリギリすぎて、普通助からないだろ感がすごい。逆にギリギリすぎて助かるのが見え見えになってしまう。

あまりにもCGがでしゃばりすぎている感が半端ない。もうちょっとCG使ってることがわからないくらいにうまくやって欲しい。

エイリアンVSプレデターというのが安直過。探検が始まるまでの前半の映像がなんか凄く軽い。色々凄いストーリーに盛り上げようとしているが空回り感がある。

個人的には、エイリアンVSプレデターというより、エイリアンVSアーノルド・シュワルツェネッガーとかエイリアンVSブルース・ウィリスとかで全盛期の二人の映画がみたかった。


ネタバレ

普通に面白いとは思うが、気に入らない部分が多少あるので書いてみると、

  • アレクサにエイリアンを解体して武器を作ってあげるプレデターに萌える。わけねーだろ。萎える。
  • アメリカ人がよく日本のゲームはヴィジュアル系のなよっとしたのがでっかい剣を振り回して敵を倒すのがおかしいとのたまわっているが、その意見には賛成であるが、この映画も軍人ぽいのが全然活躍しないで簡単にやられて女性が活躍してしまうってのはどうなの?まあ、エイリアン ファースのリプリーのオマージュなんだろうけど?
  • プレデターの設定がよくわからない。戦闘民族で闘いの名誉を重んじるのは分かるけど、最後に剣を渡して去っていくとか前作でも1700年代の拳銃を渡されたりしてるけど、なんか演出としてあんまりパッとしない。
  • プレデターが肩に装着するレーザー兵器みたいな物をピラミッドの中に置いてあるわけだけど、なんで最初から装備してないでわざわざそんなところに置いてあるのか意味不明。凄くつまらない設定だと思う。
  • プレデターが地上に登場シーンにポッドみたいなもので派手に地上降下するわけだけど、隠密行動のプレデターがあんな派手な物的証拠が残るような登場するという設定がどうも受け付けない。科学力あるんだしもっとスマートに地上に降りてこれないの?最後は普通に大きな宇宙船で帰っていくし。
  • プレデターの装備がエイリアンの酸の血液で溶けるという設定はあんまりよくない気がする。酸ぐらいでは解けなさそうな装備だと思ってたのにがっかり。
  • そもそも、ピラミッドのおびき寄せたプレデターが地球人より遅れて到着するとかどうなのよ?
  • ラストの腹から飛び出すオチは萎えた。『うわーやっちゃったよ』って思った。

評価:3.0/5.0

エイリアンVSプレデター – Wikipedia

タグ : , , ,

やっとBフレッツ回線復旧

回線の修理に来てもらってやっとBフレッツ回線が復旧、人づてなのでよく原因がわからないが、外の線が(どの部分かわからないけど)折れ曲がってたとかなんとか、その折れ曲がった原因がわからないとなんとも不安なんですけどそこをなぜ聞かないかと小一時間(ry

昨日繋がらなくなった時間にちょうど局内の故障が発生しているのがなんというか紛らわしい。本当に関係ないの?それとも他の電気とか有線の工事とかカラスとかがうちの光の回線になんか悪さしたのだろうか?とにかく困った。

まあとにかくNTTさんは9:00-17:00の間しか対応してないので、日中に故障かなと思ったら早めに連絡するのが吉ですね。

タグ :

Google検索で世界の時刻が検索可能になったらしい

Google Japan Blog: 世界各地の現在時刻が検索可能に!

20100505

20100506

20100507

FacebookやMySpaceをやってて外国に友人が多い人には便利そうですね。

タグ :

Bフレッツの故障、既に18:12分に回復したことになってるけど未だに繋がらない件

お客さま各位

平成22年11月15日

故障発生/回復のお知らせ(台東区エリア/吉原ビルの一部)

日頃よりNTT東日本のフレッツサービスをご利用いただき、誠にありがとうございます。
ご利用のお客様におかれまして、故障によりサービスがご利用いただけない事象が発生しておりました。
お客様には多大なご迷惑・ご不便をおかけいたしましたことを深くお詫び申し上げます。

発生日時
平成22年11月15日(月)15:43

回復日時
平成22年11月15日(月)18:12

対象
台東区エリア/吉原ビルにてBフレッツをご利用されている一部のお客様

原因
地域IP網設備故障

NTT東日本:フレッツ|ご利用者向け|工事・故障情報|東京都

既に回復したことになってるけど全然繋がらない。PR-200NE再起動してみたけど全然リンクが確立しない。どうなってんの?今日中に直らなかったら電話する。

今わかったけど、ひかり電話まで使えなくなってる。回復前より悪化しとるwww。

タグ :

Bフレッツつながんねー

NTT東日本:フレッツ|ご利用者向け|工事・故障情報|東京都

 

20100504

お客さま各位

平成22年11月15日

故障発生のお知らせ(台東区エリア/吉原ビルの一部)

日頃よりNTT東日本のフレッツサービスをご利用いただき、誠にありがとうございます。
ご利用のお客様におかれまして、故障によりサービスがご利用いただけない事象が発生しております。
お客様には多大なご迷惑・ご不便をおかけしますことを深くお詫び申し上げます。

発生日時
平成22年11月15日(月)15:43

対象
台東区エリア/吉原ビルにてBフレッツをご利用されている一部のお客様

原因
地域IP網設備故障

もう一時間以上繋がらない。早く直って欲しい。今は別回線から接続中。っていうか故障情報出されてもネットに繋げられない人は確認しようがないよねw。まあ普通の人は故障情報すら見ようとしないのが普通ですけど。というか故障情報のページにたどり付けないよね。

タグ :

 
© KUMA TYPE