2007年9月アーカイブ

2007年9月28日

Oracle Application Express3.0を1週間使ってみての感想

Oracle Application Express3.0の概要

ブラウザでWebアプリを開発するOracleのフレームワーク。無償提供されている。 同じく無償提供されているOracle10gXEと組合せれば無償でWebアプリが構築可能。

Oracleサイトのデモを見るのが視覚的にはわかりやすい。

開発の向き不向き

:-)
  • 簡易なマスタメンテを作るのにかかる時間は5分ほど(システムのインストール時間は除く)
  • フレームワークのインターフェースは直感的でわかりやすい。
  • フレームワークのボタンを全て押して試行錯誤しても学習コストは1~2週間程度(PL/SQLやOracleに慣れていることが前提

XD

  • 日本語の情報サイトが少ない(海外サイトは日本より多いけどそれでも少なめ)
  • 設定を変更して開発していくのでコーディングしているといった感覚がない。
  • 設定をDBで管理するために、ソース管理がわずらわしい。手動でSQLでエクスポートしてSVNに更新する手法をとっていたけれど自動化したほうがよかった。

導入の向き不向き

:-)
  • Excel+VBAで行っている業務システムから、Webアプリのシステムに変更するのには向いている
  • 簡易なクライアント・サーバシステムの業務システムからWebアプリのシステムに変更するのには向いている

XD

  • 複数テーブルへの更新・トランザクションの管理が必要なシステムには向いていない
  • フレームワークが対応していない凝ったことをしたい場合、逆にフレームワークが足かせになって開発コストがかかる


積上げグラフ実装のバッドノウハウ


  • 以下のようなゲーム機の売上げを積上げグラフを作成したいとする
  • 070928a.gif
  • このグラフは売上データとゲーム機器マスタの2テーブルで構成されるとする。
  • この場合、新しいゲーム機が増えた場合、ゲーム機マスタへゲーム機を追加するだけで対応したいが、
    グラフが要求するインターフェースは
    「2007/08 300 Wii 300 PS3 300 Xbox」である。
    たとえばDSを追加したい場合、
    「2007/08 300 Wii 300 PS3 300 Xbox 300 DS」にする必要がある。
    DBは動的に横にデータを増やすのには向いていなのに酷いですOracle
  • 副キーを設けて縦に

    「2007/08 300 Wii」
    「2007/08 300 PS3」
    「2007/08 300 Xbox」
    「2007/08 300 DS」
    といったデータで2007/08のグラフを構成したらいいのにと思う。

  • 思っても仕様は変更されないので、ゲーム機マスタが増えた際にグラフの積上げを動的に増やしたい場合は、SQLを動的に作成する必要がある。
  • SQLを動的に作成する方法

    グラフの作成。積上げ水平グラフをリージョン作成し、
    シリーズ問合せの問合せソース・タイプは「SQL問合せを戻すファンクション」にする。
    SQLは以下のように動的なSQL文字列を返すようにする。


    declare
    sqlstrHead Varchar2(32767);
    sqlstrBody Varchar2(32767);
    sqlstrFoot Varchar2(32767);
    cnt Integer;
    cursor cur_asset is select ゲーム機器ID,ゲーム機器名 from ゲーム機マスタ order by ゲーム機器ID;
    BEGIN
    cnt := 0;

    sqlstrHead := 'select null link, G.売上月 LABEL ';
    sqlstrBody := ' from ';
    sqlstrFoot := ',(select distinct 売上月 from 売上テーブル) G where ';
    for rec in cur_asset loop
    cnt := cnt + 1;
    sqlstrHead := sqlstrHead || ' ,T' || cnt ||'.売上総数 "' || rec.ゲーム機器名 || '"';
    IF cnt != 1 THEN
    sqlstrBody := sqlstrBody || ' ,';
    sqlstrFoot := sqlstrFoot || ' and ';
    END IF;
    sqlstrBody := sqlstrBody ||
    '(select 売上月,ゲーム機器ID, sum(売上数) 売上総数 from 売上テーブル' ||
    ' where ゲーム機器ID = ' || rec.ゲーム機器ID ||
    ' group by 売上月,ゲーム機器ID) T' || cnt;
    sqlstrFoot := sqlstrFoot || 'G.売上月 = T' || cnt || '.売上月(+) ';
    end loop;
    sqlstrFoot := sqlstrFoot || ' order by G.売上月';

    sqlstrHead := sqlstrHead || sqlstrBody || sqlstrFoot;
    return sqlstrHead;
    END;


  • 設定例で使用したテーブル定義(簡易例の為、Indexは不使用)

    CREATE TABLE ゲーム機マスタ
    (
    ゲーム機器ID NUMBER(5,0),
    ゲーム機器名 VARCHAR2(255)
    )

    CREATE TABLE 売上テーブル
    (
    売上月 VARCHAR2(7),
    ゲーム機器ID NUMBER(5,0),
    売上数 NUMBER(5,0)
    )


2007年9月27日

心を暖かくする風景

トゥモロウズ ソング

・毛布の柔らかさが!
・自転車練習の応援が!
・おでこをあわしているのが!

カゼノトオリミチ

・前半のけだるさと後半の明るさが!

暖かさと冷たさ、光と影、つぎはぎのないなめらかな風景が心を暖かくします。
望月さんの他の作品も見たいなぁ。

あこがれのゲーム業界の低迷

ヒップラインには自信のあるマンドラ子さん

ソフト開発費回収多様化・ゲーム各社、高騰に頭痛める ゲームソフト会社が開発資金の回収方法を多様化させ始めた。セガは映画公開と連動したソフトを開発、キューエンタテインメント(東京・目黒)はソフト本体を無料とし、ゲームの進行に使う道具(アイテム)をネット上で販売する多人数参加型ゲームを始める。ソフト開発費の高騰がゲーム各社の経営を圧迫しており、回収機会を増やして収益を最大化する新しいビジネスモデルを模索している。

NIKKEI NET
http://www.nikkei.co.jp/news/sangyo/20070924AT1D200BP21092007.html


不勉強で直感的な思い

■低迷の問題点として考えられるもの


  • A.他の娯楽にゲーム人口を食われている(携帯・PC)
  • B.現場のエース級人材のゲーム業界離れ(薄給で激務、好きじゃないと続けられない)
  • C.開発費高騰で冒険ができない中小ゲーム企業。余裕のない大手も(新しい可能性が生まれにくい。プレイヤは減る一方)

■解決案モデル


  • 少人数(1人~3人)で提案・ラフ動作レベルのゲームを企画する
    • メリット:始めやすい(Cの解決案)
       
    • デメリット:最初の無報酬時代を乗り切るリスクはある

  • ベンチャーキャピタル(VC)による資金供給。
    • メリット:ゲームが売れなかった場合、または発売にも至らなかった場合にも企画者への損失が少ない(B・Cの解決案)
       
    • デメリット:ゲーム会社に投資するVCが日本には少ない(世界市場を狙う?)

  • 資金が供給されたらエース級人材+エース候補の新人を雇ってプロジェクトを編成する

    • メリット:収入や環境が良い方が優秀な人材も集まる。(Bの解決案)
       
    • デメリット:開発資産の蓄積・流用が難しそう

  • おもしろいゲームがひとつでもあれば、ゲームハードの電源をつける回数が増えるし、
    そのゲームが終わったときに、別のゲームをやりたくなるから、正の連鎖でゲーム業界が盛り上がっていくのではないかなーと(Aの解決案)


■開発資産の蓄積・流用について


  • PerlのCPANのようなオープンソースライブラリをハードベンダ公認で公開すれば開発効率があがりそう
     企業独自の乱数メソッドを作るよりももっと時間や人を投入するところがあるだろうし。
  • といいつつ、IT業界でも業界どころか、同じ企業内でもモジュールが共有できてないことが多いですね。
     無駄な仕事をして人月を稼がないと仕事がなくなるのかなXD

2007年9月26日

都道府県の場所を覚える一番の方法

http://www.mapmsg.com/games/statetris/japan/

小学校で遊ぶ学ぶべき良い教材です:-)
東京の上のあたりの場所がけっこう曖昧でしたー。
「福島県でけーw」と思ったよ

2007年9月20日

俺の蹴りは稲妻だぜ!

http://virtuafighter5.jp/xbox360/index.html

2007年12月6日にXBox360でバーチャファイター5がコントローラと同時発売!
エースコンバットもやりたいし、FPSも楽しそうだしXBoxかっちゃうかぁ。

職場の人も買うらしいのでネット対戦の相手には困らなさそうです。
ikkanも買ってください。徹夜で対戦したあの頃へ還ろう(笑

2007年9月15日

暇つぶしと時間と価値

古本市場で小説を買いました。
本は以前から興味のあった有栖川有栖の双頭の悪魔。
定価1980円の本が105円で買えるのでとてもお得感があります。
2時間読んで1/3ほど読み終わったので、あと4時間後には読み終わっているでしょう。

気泡、宝石のごとく輝く

本を読んだり、ゲームで遊んだ後は楽しいのだけど、使った時間をもっと価値のあることに
使えたんじゃないだろうか、使うべきだったんじゃないかと思うことがあります。


人生暇つぶしなんだから、適当に暇つぶしでもして過ごせば?

という気持ちと、

自分が持っている中で一番価値のあるものは時間で、その価値をかけるにあたいするものに
お金も時間も全力で投入すべき。

という気持ちでもやもやしつつ、秋を感じさせる涼しい風が心地よい夜です。

そもそも価値のあることが何なのか自分中では曖昧です。
だから暇つぶししかできないというのもあるのかも。

背負うものがなさすぎるから、日々適当すぎる。

2007年9月13日

かたこりこ

最近、肩こりがひどくなってきました。
今まで肩こりらしい肩こりを経験したことがなかったのでとまどい気味です。

070913a.jpg

肩こりが特にひどくなるタイミングが2つあって、
ひとつが、仕事を終えて帰宅する電車の中。
とてもけだるい感じで手足の体温もあがりますがテンションは激下がりです。
もうひとつが、朝、目が覚めた時です。
寝た後は回復するのじゃないのかと怒りで血圧は上がりますがテンションだだ下がりです。

2007年9月10日

2007/09の水槽

10ヶ月ぶりの水槽エントリです。

私の場合、水槽の管理がテンションにとても依存します。
時間とお金をかければかけるほど綺麗になりますね。

2007/01

まだわりと調子がよくて水草がもさもさしていた時期 070910a.jpg

2007/06

管理がおろそかになってコケコケになってしまった時期 きたない!XD 070910b.jpg

2007/09

そして最近、やっとやる気をとりもどして管理を再開しました。 手を入れれば入れるほど水がピカピカになって水草が元気になってきました。 070910c.jpg


テンションがあがってきた勢いで、水槽を増やしました。
前からやりたかったコリドラス専用水槽にします。

こんな水槽にしたいって思い描いているときの楽しさがよいのです。

2007年9月 5日

嫁、かわいいよ、嫁

http://www.youtube.com/profile_videos?user=retsuzan346

嫁、かわいいよ、嫁

全部見入ってあっという間に時間がすぎてしまったw


「いぇーぇ↑」をマネしてみたら、この世は地獄と化した。

編集をすごいがんばっている新しいのもおもしろいけれど、
完全なる予定調和で進行するスペランカーが一番おもしろかったかなぁ。
あの死んだ音楽を聞くと和みます。

2007年9月 4日

PerlでSQLiteとCSVのどちらを使ったほうが検索が速いかを検証

目的



  • PerlでSQLiteとCSVのどちらを使ったほうが検索が速いかを検証する

検証方法



  • データの最後尾にあるレコードを検索する際の速度を比べる。

  • DBの検索項目にはIndexを追加した。

結果



  • 1秒間に実行できる回数(回数が多いほど高速)






    検索対象データ件数CSVSQLite
    100件3333回714回
    1,000件333回666回
    10,000件33回714回
    100,000件3回714回


  • SQLiteはIndexで検索を行っているので、検索速度がデータ件数に依存しなかった。

  • CSVの読み込みはデータの件数分順次リードを行っている為、検索速度がデータ件数に依存した。

  • データが100件の場合は、CSVのほうが速かった。

  • データが1,000件以上の場合は、SQLiteのほうが速かった。

結論



  • 扱うデータが1,000件以上になってきた場合はSQLite等のDBを使うことを考えたほうが良いかもしれない。
    データを正規化できるメリットやUPDATEの便利さも大きいし(CSVだとUPDATEがぐだぐだに)

検証データ・コード・結果一式



  • 検証に使用したデータ:日本郵政公社(全国郵便番号)
  • 検証で使用したプログラムコード

    #!/usr/local/bin/perl --
    use strict;
    use warnings;
    use Benchmark qw(timethese cmpthese);

    my $keyZipCode = '"9071801"';
    my $result = timethese(100,{
    'funcCsvRead' => 'funcCsvRead',
    'funcDbRead' => 'funcDbRead',
    });
    cmpthese($result);

    sub funcCsvRead{
    open(FILE,"< ./KEN_ALL.CSV") || die 'file open error.';
    while (){
    my(undef,undef,$new_zip) = split(/,/);
    if ($keyZipCode eq $new_zip) {
    # ヒット後の処理
    last;
    }
    }
    close(FILE);
    }

    sub funcDbRead{
    use DBIx::Simple;
    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;
    my $result;

    $result = $db->query('select * from zip where new_zip = ?', $keyZipCode) || die $db->error;
    while ($result->into(my(undef, undef, $new_zip))) {
    # ヒット後の処理
    last;
    }

    }



  • ベンチマーク結果

    データが100件の場合
    Benchmark: timing 100 iterations of funcCsvRead, funcDbRead...
    funcCsvRead: 0 wallclock secs ( 0.03 usr + 0.00 sys = 0.03 CPU) @ 3333.33/s (n=100)
    (warning: too few iterations for a reliable count)
    funcDbRead: 0 wallclock secs ( 0.01 usr + 0.13 sys = 0.14 CPU) @ 714.29/s (n=100)
    (warning: too few iterations for a reliable count)
    Rate funcDbRead funcCsvRead
    funcDbRead 714/s -- -79%
    funcCsvRead 3333/s 367% --

    データが1,000件の場合
    Benchmark: timing 100 iterations of funcCsvRead, funcDbRead...
    funcCsvRead: 0 wallclock secs ( 0.27 usr + 0.03 sys = 0.30 CPU) @ 333.33/s (n=100)
    (warning: too few iterations for a reliable count)
    funcDbRead: 0 wallclock secs ( 0.01 usr + 0.14 sys = 0.15 CPU) @ 666.67/s (n=100)
    (warning: too few iterations for a reliable count)
    Rate funcCsvRead funcDbRead
    funcCsvRead 333/s -- -50%
    funcDbRead 667/s 100% --

    データが10,000件の場合
    Benchmark: timing 100 iterations of funcCsvRead, funcDbRead...
    funcCsvRead: 3 wallclock secs ( 2.60 usr + 0.37 sys = 2.97 CPU) @ 33.67/s (n=100)
    funcDbRead: 0 wallclock secs ( 0.02 usr + 0.12 sys = 0.14 CPU) @ 714.29/s (n=100)
    (warning: too few iterations for a reliable count)
    Rate funcCsvRead funcDbRead
    funcCsvRead 33.7/s -- -95%
    funcDbRead 714/s 2021% --

    データが100,000件の場合
    Benchmark: timing 100 iterations of funcCsvRead, funcDbRead...
    funcCsvRead: 29 wallclock secs (18.93 usr + 10.62 sys = 29.55 CPU) @ 3.38/s (n=100)
    funcDbRead: 0 wallclock secs ( 0.01 usr + 0.13 sys = 0.14 CPU) @ 714.29/s (n=100)
    (warning: too few iterations for a reliable count)
    Rate funcCsvRead funcDbRead
    funcCsvRead 3.38/s -- -100%
    funcDbRead 714/s 21007% --

PerlでSQLiteを操作する

PerlからSQLiteを操作する方法について

DBIx::Simpleモジュールをインストールする。



  • 今回は多機能を求めていないので、DBに接続するラッパーはDBIx::Simpleを利用します。

    % perl -MCPAN -e 'install DBIx::Simple'

  • データベースの内容
    
    

    BEGIN TRANSACTION;
    CREATE TABLE spell (id integer primary key, name text, message text);
    INSERT INTO spell VALUES(1,'ホイミ','HPを少し回復する。');
    INSERT INTO spell VALUES(2,'ベホイミ','HPをかなり回復する。');
    INSERT INTO spell VALUES(3,'ベホマ','HPを全回復する。');
    COMMIT;

データベースへの接続



  • サンプルソース

    #!/usr/local/bin/perl --
    use DBIx::Simple;
    use strict;
    use warnings;

    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;

  • dbname=の箇所にデータベースファイルのパスを指定します。

レコードを取得(SELECT)する

  • spell テーブルの全レコードの取得と条件を指定した取得を行います。
  • サンプルソース
    
    

    #!/usr/local/bin/perl --
    use DBIx::Simple;
    use strict;
    use warnings;

    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;
    my $result;

    print "\n■spell テーブルの内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

    print "\n■spell テーブルの内容で name にベホが含まれる内容を表示する\n";
    $result = $db->query('select id, name, message from spell where name like ?', '%ベホ%') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

  • 実行結果
    
    

    ■spell テーブルの内容を全て表示する
    ホイミ, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。

    ■spell テーブルの内容で name にベホが含まれる内容を表示する
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。

レコードを追加(INSERT)する



  • spell テーブルに対して1レコード追加を行います。

  • サンプルソース

    #!/usr/local/bin/perl --
    use DBIx::Simple;
    use strict;
    use warnings;

    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;
    my $result;

    print "\n■spell テーブル(追加前)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

    $db->query('insert into spell(name, message) values(?, ?)', 'ベホマズン', '全員のHPを全回復する。') || die $db->error;

    print "\n■spell テーブル(追加後)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

  • 実行結果
    
    

    ■spell テーブル(追加前)の内容を全て表示する
    ホイミ, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。

    ■spell テーブル(追加後)の内容を全て表示する
    ホイミ, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。
    ベホマズン, 全員のHPを全回復する。

レコードを更新(UPDATE)する



  • spell テーブルに対して1レコード更新を行います。

  • サンプルソース

    #!/usr/local/bin/perl --
    use DBIx::Simple;
    use strict;
    use warnings;

    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;
    my $result;

    print "\n■spell テーブル(更新前)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

    $db->query('update spell set name = ? where name = ?', 'ケアル', 'ホイミ') || die $db->error;

    print "\n■spell テーブル(更新後)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

  • 実行結果
    
    

    ■spell テーブル(更新前)の内容を全て表示する
    ホイミ, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。
    ベホマズン, 全員のHPを全回復する。

    ■spell テーブル(更新後)の内容を全て表示する
    ケアル, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。
    ベホマズン, 全員のHPを全回復する

レコードを削除(DELETE)する



  • spell テーブルに対して1レコード削除を行います。

  • サンプルソース

    #!/usr/local/bin/perl --
    use DBIx::Simple;
    use strict;
    use warnings;

    my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./mydb.db3') || die DBIx::Simple->error;
    my $result;

    print "\n■spell テーブル(削除前)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

    $db->query('delete from spell where name = ?', 'ケアル') || die $db->error;

    print "\n■spell テーブル(削除後)の内容を全て表示する\n";
    $result = $db->query('select id, name, message from spell') || die $db->error;
    while ($result->into(my(undef, $name, $message))) {
    print " $name, $message\n";
    }

  • 実行結果
    
    

    ■spell テーブル(削除前)の内容を全て表示する
    ケアル, HPを少し回復する。
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。
    ベホマズン, 全員のHPを全回復する。

    ■spell テーブル(削除後)の内容を全て表示する
    ベホイミ, HPをかなり回復する。
    ベホマ, HPを全回復する。
    ベホマズン, 全員のHPを全回復する。

他参考になるサイト



2007年9月 3日

最近のプロ野球の楽しみ

最近はプロ野球のTV中継を見なくなってしまいました。
そんななか前田選手と多村選手の活躍はマメにチェックしています。
普段、野球をみない方もきっと好きになる偉大な選手です。

1.前田智徳選手

前田智徳 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%89%8D%E7%94%B0%E6%99%BA%E5%BE%B3

天才と評されるイチローから天才と呼ばれ、選手・ファンから絶大な支持を受ける偉大な選手。

この2000本安打のインタビューをみてると涙が…。
背中で語るというか、こんなリーダがいたら粉骨砕身で支えたいと思いますね。
日々の努力と周りへの気遣い。かっこよすぎる。


2.スペランカー多村選手

ルックス○ 野球センス◎ 健康×
どこまでが仮病でどこまでが本当の故障なのかわからない領域で活躍されている偉大な選手。

多村仁とは - はてなダイアリー
http://d.hatena.ne.jp/keyword/%C2%BF%C2%BC%BF%CE

2007年 7/2 「ちょっと鼻がムズムズする」ので全体練習を早退。病院で検査を受け、宿舎で静養。翌日の試合ではホームランを打つ。

2006年
12/25 松中信彦内野手が多村の加入ということもあり、外野フェンスを軟らかいラバーに変えるよう要望。しっかり「ガラスの大砲」であることを印象付けられる。
4/4 試合前に「食わず嫌い王決定戦」収録で荒川静香と対戦。大嫌いなアンチョビパスタを食べさせられ、もどしかける。

2004年
9/19 ストライキの際の握手会で左掌の炎症し、その後2日連続スタメン落ち

GUIでSQLiteを操作する

WindowsのGUIからSQLiteを操作する方法について

6つぐらいのGUIツールを試してみて、SQLite Database Browserが一番使いやすかったので、
ここではSQLite Database Browserを利用した場合の説明を記載します。

SQLite Database Browserが使いやすかった理由としては
・日本語(utf-8)が利用できる
・安定している
・直感的に操作がわかりやすい
といったところです。
欲をいえばExcelのようなグリッドでデータを編集したいですね。

副作用:
とてもお手軽にSQLが実行できる環境が構築できるので、
基本情報技術者試験とかのSQLの勉強にも役立てることができます。

・SQLiteのGUIツールをインストールする。


・データベースの作成


・テーブルを作成する


・レコードを追加(INSERT)する


・レコードを更新(UPDATE)する


・レコードを削除(DELETE)する


・他情報

SQLiteのGUIツールをインストールする。

http://sourceforge.net/projects/sqlitebrowser/ へアクセスする。
・Download SQLite Database Browser のボタンを選択する。
・sqlitebrowser-1.3-win.zip をダウンロードする。(1.3は20070903時点での最新)
・ダウンロードしたバイナリを解凍する。

データベースの作成

・SQLite Database Browser.exeを実行する。
・青丸のアイコンを選択する。
 sqlite001.gif
・ファイル名に mydb.db3 と入力して、保存ボタンを選択する。
・下記のテーブル作成の入力につづく

テーブルを作成する

・テーブル spell を作成する為、下記の入力を行う。
 sqlite003.gif
・Createボタンを選択する。
・テーブルが追加されたことを確認する。
 sqlite004.gif

・データベースへの変更を保存する
・青丸のアイコンを選択する。
 sqlite005.gif

・プログラムを終了する。
・mydb.db3というファイル名が追加されている。
これがSQLiteのデータベースファイル。
 sqlite002.gif


レコードを追加(INSERT)する

・SQLite Database Browser.exeを実行する。
・青い丸のアイコンを選択する。
 sqlite006.gif
・さきほど作成したmydb.db3を開く
・Browse Dataのタブを選択して、青い丸のNew Recordのボタンを選択する。
 sqlite007.gif
・入力したい値のセルでダブルクリックして入力画面を開く。
・入力画面に値を入力して Apply Changes のボタンを選択する。

・レコードが追加されていることを確認する。
・Execute SQLのタブを選択して、SQL stringの欄に 「select * from spell」と入力する。
・Execute query のボタンを選択する。
 sqlite008.gif

レコードを更新(UPDATE)する

・Browse Dataのタブを選択する。
・入力したい値のセルでダブルクリックして入力画面を開く。
・入力画面に値を入力して Apply Changes のボタンを選択する。
・表示されている内容を絞りたい場合は虫めがねのボタンを選択して
 表示条件を入力して絞る

レコードを削除(DELETE)する

・Browse Dataのタブを選択する。
・削除したいレコードを選択する。
・Delete Record のボタンを選択する。

他情報

・利用できるSQL一覧:http://www.sqlite.org/lang.html
・メニュー>File>Importで値のインポートやSQLファイルの実行が可能
・メニュー>File>Exportで値のエクスポートやDDLの出力が可能

コマンドラインでSQLiteを操作する

LinuxのターミナルからSQLiteをコマンドラインで操作する方法について

・SQLiteのコマンドラインツールをインストールする。


・データベースの作成


・テーブルを作成する


・レコードを追加(INSERT)する


・レコードを更新(UPDATE)する


・レコードを削除(DELETE)する


・他情報

SQLiteのコマンドラインツールをインストールする。

http://www.sqlite.org/ へアクセスする。
・右上にある download のページを選択する。
・sqlite3-3.4.2.bin.gz をダウンロードする。(3-3.4.2は20070903時点での最新)
・ダウンロードしたバイナリを解凍する。

#解凍前

% ls
sqlite3-3.4.2.bin.gz

#解凍

% gunzip ./sqlite3-3.4.2.bin.gz

#解凍後

% ls
sqlite3-3.4.2.bin

データベースの作成


#作成



% ./sqlite3-3.4.2.bin mydb.db3
SQLite version 3.4.2
Enter ".help" for instructions
sqlite>

#終了する

sqlite> .q

#確認

% ls
mydb.db3  sqlite3-3.4.2.bin

mydb.db3というファイル名が追加されている。
これがSQLiteのデータベースファイル。

テーブルを作成する


#さきほど作成したmydb.db3へ接続する



% ./sqlite3-3.4.2.bin mydb.db3
SQLite version 3.4.2
Enter ".help" for instructions
sqlite>

#テーブル spell を作成する

sqlite> CREATE TABLE spell (id integer primary key, name text, message text);

#テーブルが追加されていることを確認する

sqlite> SELECT name FROM sqlite_master WHERE type='table';
spell

#終了する

sqlite> .q

レコードを追加(INSERT)する


#さきほど作成したmydb.db3へ接続する



% ./sqlite3-3.4.2.bin mydb.db3
SQLite version 3.4.2
Enter ".help" for instructions
sqlite>

#テーブル spell に2レコード追加する(idは自動採番を利用)

sqlite> INSERT INTO spell (name) VALUES ('ホイミ');
sqlite> INSERT INTO spell (name) VALUES ('ベホイミ');

#レコードが追加されていることを確認する。

sqlite> select * from spell;
1|ホイミ|
2|ベホイミ|

#終了する

sqlite> .q

レコードを更新(UPDATE)する


#さきほど作成したmydb.db3へ接続する



% ./sqlite3-3.4.2.bin mydb.db3
SQLite version 3.4.2
Enter ".help" for instructions
sqlite>

#テーブル spell のid=1を更新する

sqlite> UPDATE spell SET message='HPを少し回復する。' WHERE id=1;

#id1のレコードが更新されていることを確認する。

sqlite> select * from spell;
1|ホイミ|HPを少し回復する。
2|ベホイミ|

#終了する

sqlite> .q

レコードを削除(DELETE)する


#さきほど作成したmydb.db3へ接続する



% ./sqlite3-3.4.2.bin mydb.db3
SQLite version 3.4.2
Enter ".help" for instructions
sqlite>

#テーブル spell のid=2を削除する

sqlite> DELETE FROM spell WHERE id=2;

#id2のレコードが削除されていることを確認する。

sqlite> select * from spell;
1|ホイミ|HPを少し回復する。

#終了する

sqlite> .q

他情報

利用できるSQL一覧:http://www.sqlite.org/lang.html

SQLiteを利用する

ここではSQLiteを利用するにあたってのメモを公開します。
間違いがありましたらご指摘ください。

バックボーン:
検索のシステムでCSVでデータを扱っていたが件数が増えてきた(3000件ほど)
・RDBを利用したほうが処理の効率がよいかもしれない
・CSVとSQLiteの速度の比較検証してみよう

検証のデータベースにSQLiteを選んだ理由:
・レンタルサーバの場合、DB(主にMySQL)が利用できてもWebサーバとDBサーバが別で、
 負荷ピーク時にDBサーバが死んでいて使い物にならない印象がある。
 SQLiteはWebサーバに配置する為そのようなことはない。
・インストールがお手軽である(1ファイルをコピーするのみでインストール完了)
・リッチなデータベース機能は不要である

私の開発環境:
・SQLiteのバージョン:3.*
・DB配置:Debian(coLinux)、SambaでWindowsと共有
・GUI操作:Windows
・エンコーディング:utf-8

2007年9月 1日

Perlクイズ

#!/usr/local/bin/perl --

use strict;

&main(1);

sub main {
my($val) = @_;
my $magic = "?";
if ($val eq "1") {
my $magic = "hello!!";
}

print "$magic\n";
}

"hello!!" と出力したいのに、 "?" と出力されます。
なぜでしょうか?

今日、上のような不具合ではまりました。
実際は複雑な処理を行っていて、処理の不具合かと思って調査したのだけど、
当然まったく解決しなくて、30分後にこんな初歩的な間違いに気づきました。

念のため答えも書いておきます。

続きを読む: Perlクイズ