Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話

3,303 views

Published on

Published in: Technology
  • Be the first to comment

Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話

  1. 1. Perl暦およそ10年(?)の僕がデータベースを使えるように なるまでの昔話 Perl Beginners #3 Lightning Talk @ytnobody
  2. 2. およそ10年前。Perlに触れて数ヶ月・・・● 先輩「そろそろデータベースつかってみようかー」● 自分「なんですかそれ」● 先輩「」
  3. 3. そもそもデータベース(=DB)とは 何なのかを 知らなかった
  4. 4. 説明しよう! ここで言うデータベースとは、正しくは「リレーショナルデータベースマネージメントシステム」 と呼ばれ、RDBMSなどと略されるものである。プログラム内で永続的にデータを保持するために 用いられる仕組みであり、 大抵はサーバソフトウェアとして提供される。プログラムはデータベースと情報をやり取りするために、SQLと呼ばれる専用の命令文を発行する必要が ある。
  5. 5. 初めてのDBを使ったプログラミング● 自分「先輩~、できましたー><」● 先輩「どれどれみせてごらん・・・」● 自分「これです!どうっすかね、動きますよ!ほら!」● 先輩「」
  6. 6. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password);my $sth = $DBH->prepare(SELECT * FROM member WHERE area=12);$sth->execute();while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... ...... .........}
  7. 7. 先輩「ダメダメだね」
  8. 8. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password); 先輩: use strict してないでしょ?my $sth = $DBH->prepare(SELECT * FROM member WHERE area=12); よくないなー$sth->execute();while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... ...... .........}
  9. 9. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password); 先輩:my $sth = $DBH->prepare(SELECT * FROM member WHERE area=12); これはuseしなくてOK$sth->execute();while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... ...... .........}
  10. 10. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password);my $sth = $DBH->prepare(SELECT * FROM member WHERE area=12);$sth->execute();while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; 先輩: $DBHを返す関数を作れば、 my $name = $field[1]; 毎回connectを書く必要がないよね? ... ...... .........}
  11. 11. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password);my $sth = $DBH->prepare(SELECT * FROM member WHERE area=12);$sth->execute();while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... 先輩: ...... こりゃひどいなー。バインド変数使おうよ。 .........}
  12. 12. 自分「え?バインド変数って何すか???」
  13. 13. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password);my $sth = $DBH->prepare(SELECT * FROM member WHERE area=?);$sth->execute(12);while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... 先輩: バインド変数ってのは、これ「?」のことだね ...... .........}
  14. 14. #!/usr/bin/perluse DBI;use DBD::mysql;my $DBH = DBI->connect(DBI:mysql:dbname, user, password);my $sth = $DBH->prepare(SELECT * FROM member WHERE area=?);$sth->execute(12);while (my @field = $sth->fetchrow_array()) { my $id = $field[0]; my $name = $field[1]; ... 先輩: で、executeするときに該当する値を渡すんだよ ...... .........}
  15. 15. ほえー・・・わかったようなわからんような・・・
  16. 16. あれから1年の月日が経過。 PHPつかってました! てへぺろっ☆
  17. 17. さらに月日は流れ、2年経ったある日のこと。● 上司「久々にPerlの案件だぞー」● 自分「ひさしぶりっすね。」● 上司「MySQL使うぜ。あ、今回はお前に開発任せるから。」● 自分「え?!」● 上司「もう大分なれてきたし、やれるだろ?」● 自分「はあ、まあ」● 上司「おーそうだ、今回開発期間短いぞ。3週間しかねえw」● 自分「」
  18. 18. 自分「どうにかして楽しないと、やばすぎる」
  19. 19. どうやって楽しようか・・・● 上司「CPANってのがあるからさ、そこからなんか探せばいいんじゃ ないのか?」● 自分「く、CPAN????」
  20. 20. 説明しよう!CPAN(しーぱん/くぱん??)とは、Perl向けに作られたモジュール(出来合いの使いまわし可能なパーツ)の 配布サイトだ。 Perlを使って開発するのなら、 便利なパーツがタダで手に入る、お得でクールな CPANを使わない手は無いぞ!
  21. 21. CPANに頼ってみよう!● 自分「自力でコードを書く量が減るってことですか!?」● 上司「たぶんそういうことじゃないかなー」● 自分「先輩に、いいパーツ知らないかきいてきます!」● 先輩「おれしらないよ」● 自分「」
  22. 22. 自分「もしかして、社内にCPANを使いこなせてる人がいない??」
  23. 23. 協力会社の開発スタッフにきいてみた● 協力「Class::DBIというモジュールを使うと楽だって聞きますけどね」● 自分「ドキュメント読んでみます」
  24. 24. 自分「え、英語・・・?!」
  25. 25. 英語の壁を乗り越えるが・・・● 自分「英語だけど、高卒英語レベルでも割と理解できる・・・」● 自分「でもしかしこれ、使うの難しいな。」● 自分「わざわざスキーマ用意するのが面倒だし・・・」● 自分「ほかにもDBを操作するモジュールは無いものか・・・」
  26. 26. 自分「こ、こ、これじゃー!!!!」
  27. 27. 人生初のORマッパー(?)それはDBIx::Simplemy $dbh = DBI->connect(...);my $sql = SELECT * FROM user WHERE id=?;my $sth = $dbh->prepare($sql);$sth->execute(123);my @col = $sth->fetchrow_array;.................. my $db = DBIx::Simple->new(...); $user = $db->select(user,*,{id => 1}); ... これがこうなった ...... .........
  28. 28. 自分「これはすげー!!!!」
  29. 29. その後のORマッパー使用遍歴● Data::Model ● キャッシュを意識せず、透過的に扱いたかった● Teng ● 最近はORマッパーといえばほぼこれ。● DBIx::Sunny ● 素のDBIにほんの少し手が加えられている。 selectとかの便利メソッドが追加 –● 自作のORマッパー ● 作ってみたかっただけ – スキーマ不要 – トランザクションをDSLっぽく書きたい – いくつかの制約(主キーが”id”固定とか)
  30. 30. でも結局・・・● 基本はDBI。 ● いまでもDBIだけで仕上げることがあるくらい。 ● Hachioji.pmの有志が開発しているwebチャット 「Yancha」も今のところDBIでDBアクセス● なんで? ● シンプルisベスト ● 基本に忠実=基本さえわかっていれば、読める理解で きる
  31. 31. これからDBを使ったプログラムを習得するなら● まずはDBI+MySQLの組み合わせでやってみよう● ORマッパーは「わかってる人間が楽をするためのもの」 ● 最初からORマッパーを使うのは避けたほうが無難かも● 使うなら「利用人口の多いもの」を選ぶと楽 ● 周りに訊けます – ツイッターとかで訊けばそれなりの回答があるかもしれない – 回答がつかなくても泣かない ● これ大事。● なれてきたら、データキャッシュ(memcached)の導入も視野に入れ てみる。 ● 負荷軽減、処理時間削減など、パフォーマンスに貢献
  32. 32. 質問タイム
  33. 33. ありがとうございました。

×