perlでinsertするときに文字化け

db->do(“set names utf8”);をいれる。

my $user = 'root';
my $passwd = '';
my $db = DBI->connect('DBI:mysql:count:localhost', $user, $passwd);
my $sth = $db->prepare("INSERT INTO accounts(password, email, name, name_kana) VALUES ('password2','test@gmail.com2','横山健','よこやまけん')");
$db->do("set names utf8");
$sth->execute;

$sth->finish;
$db->disconnect;

mysql> select * from accounts;
+—-+———–+—————-+——————–+———————————————+
| id | password | email | name | name_kana |
+—-+———–+—————-+——————–+———————————————+
| 1 | password | test@gmail.com | 横山健 | よこやまけん |
| 2 | password | testgmail.com | 横山� | よ�や��ん |
| 3 | password2 | testgmail.com2 | 横山� | よ�や��ん |
| 4 | password2 | testgmail.com2 | 横山健 | よこやまけん |
+—-+———–+—————-+——————–+———————————————+
4 rows in set (0.00 sec)

おお、文字化けが治った。
ところで、@がインサートできんぞ。

DBの設計

まずDBの設計をして、mysqlにテーブルを作っていきます。

create database count;
use count;
create table accounts(
id int auto_increment not null primary key,
password varchar(255) not null,
email varchar(255),
name varchar(128),
name_kana varchar(128)
);
create table campaigns(
campaign_name varchar(255) not null,
campaign_id varchar(20) not null,
device char(1),
distribution date,sho
age_start int,
age_end int,
gender char(1)
);
create table clicks(
campaign_id varchar(20) not null,
mail_open int,
mai_click int
);

mysql> show tables;
+—————–+
| Tables_in_count |
+—————–+
| accounts |
| campaigns |
| clicks |
+—————–+
3 rows in set (0.00 sec)

#!/usr/bin/perl --
use strict;
use DBI;

print "Content-type:text/html\n\n";
my $user = 'root';
my $passwd = '';
my $db = DBI->connect('DBI:mysql:count:localhost', $user, $passwd);
my $sth = $db->prepare("INSERT INTO accounts(password, email, name, name_kana) VALUES ('password','testgmail.com','横山健','よこやまけん')");
$sth->execute;

$sth->finish;
$db->disconnect;

print("finish\n");

mysql> select * from accounts;
+—-+———-+—————-+——————–+———————————————+
| id | password | email | name | name_kana |
+—-+———-+—————-+——————–+———————————————+
| 1 | password | test@gmail.com | 横山健 | よこやまけん |
| 2 | password | testgmail.com | 横山� | よ�や��ん |
+—-+———-+—————-+——————–+———————————————+
2 rows in set (0.00 sec)

文字化けしてますな。

cpanをインストール

[vagrant@localhost perl]$ sudo yum install perl-CPAN.x86.64
パッケージ perl-CPAN.x86.64 は利用できません。
エラー: 何もしません
[vagrant@localhost perl]$ cpan
-bash: cpan: コマンドが見つかりません

どいうこと? とりあえず、こういう時は、sudo yum updateでしたね。
[vagrant@localhost perl]$ sudo yum update

ここから再度インストール
[vagrant@localhost perl]$ sudo yum install perl-CPAN.x86_64

依存性関連をインストールしました:
perl-Digest-SHA.x86_64 1:5.47-144.el6
perl-ExtUtils-MakeMaker.x86_64 0:6.55-144.el6
perl-ExtUtils-ParseXS.x86_64 1:2.2003.0-144.el6
perl-Test-Harness.x86_64 0:3.17-144.el6
perl-devel.x86_64 4:5.10.1-144.el6

完了しました!

Warning (maybe harmless): ‘YAML’ not installed.

yamlを入れます。
# yum -y install libyaml-devel

# perl -MCPAN -e shell
cpan[1]> o conf prerequisites_policy follow
cpan[2]> o conf commit
cpan[3]> upgrade

ec2でperlを動かそう

/var/www/cgi-bin

[ec2-user@ cgi-bin]$ ls
hello.cgi
[ec2-user@ cgi-bin]$ sudo chmod +x hello.cgi

#!/usr/bin/perl --
print "Content-type: text/html \n\n";
print "Hello";

きた

mysql
mysql> create database perldb;
Query OK, 1 row affected (0.02 sec)

mysql> use perldb;
Database changed
mysql> create table t1(
-> a int,
-> b varchar(10)
-> );
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t1 values(1, ‘asakura’),(2, ‘adachi’),(3, ‘kobayakawa’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t1;
+——+————+
| a | b |
+——+————+
| 1 | asakura |
| 2 | adachi |
| 3 | kobayakawa |
+——+————+
3 rows in set (0.01 sec)

$ perl hoge.pl
Can’t locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at hoge.pl line 4.
BEGIN failed–compilation aborted at hoge.pl line 4.

sudo yum -y install perl-DBI perl-DBD-MySQL

きた!OKKKKKKKKKKKKKKKK

次はservlet mysqlだ。ここわなー

perlでmysqlからselectする(cgi編)

#!/usr/bin/perl --

use strict;
use DBI;

our $DB_NAME = "perldb";
our $DB_USER = "hoge";
our $DB_PASS = "hogehoge";
our $DB_HOST = "localhost";
our $DB_PORT = "3306";

my $dbh = DBI->connect("dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT","$DB_USER","$DB_PASS") or die "$!\n Error: failed to connect to DB.\n";
my $sth = $dbh->prepare("SELECT * FROM t1;");
$sth->execute();

print "Content-Type: text/html; charset=Shift_JIS\n\n";
while (my $ary_ref = $sth->fetchrow_arrayref) {
  print "<p>$ary_ref->[0], $ary_ref->[1]</p>\n";
}

$sth->finish;
$dbh->discconect;

なんや、OKだ。

次は、このままec2にperlを載せたい。

perlでmysqlからselectする(コマンドライン編)

#!/usr/bin/perl

use strict;
use DBI;

# MySQL
our $DB_NAME = "perldb";
our $DB_USER = "hoge";
our $DB_PASS = "hogehoge";
our $DB_HOST = "localhost";
our $DB_PORT = "3306";

my $dbh = DBI->connect("dbi:mysql:dbname=$DB_NAME;host=$DB_HOST;port=$DB_PORT","$DB_USER","$DB_PASS") or die "$!\n Error: failed to connect to DB.\n";
my $sth = $dbh->prepare("SELECT * FROM t1;");
$sth->execute();
while (my $ary_ref = $sth->fetchrow_arrayref) {
  my ($a, $b) = @$ary_ref;
  print "$a, $b\n";
}
$sth->finish;
$dbh->disconnect;

おおおおおおお、selectできるやんけ。
[vagrant@localhost cgi-bin]$ perl hoge.pl
1, asakura
2, adachi
3, kobayakawa
1, 1st

ということは、cgiも行けるかな(ワクワク)^^

Perl・MySQLのドライバーをインストールする

DBIモジュールとMySQLのDBDモジュールをインストール

[vagrant@localhost ~]$ sudo yum -y install perl-DBI perl-DBD-MySQL

mysql
create database perldb;
use perldb;
create table t1(
a int,
b varchar(10)
);

insert into t1 values(1, ‘asakura’),(2, ‘adachi’),(3, ‘kobayakawa’);
select * from t1;

use DBI;

$user = 'root';
$passwd = '';
$db = DBI->connect('DBI:mysql:perldb:localhost', $user, $passwd);
$sth = $db->prepare("INSERT INTO t1 VALUES (1,'1st')");
$sth->execute;
$sth->finish;
$db->disconnect;

mysql> select * from t1;
+——+————+
| a | b |
+——+————+
| 1 | asakura |
| 2 | adachi |
| 3 | kobayakawa |
| 1 | 1st |
+——+————+
4 rows in set (0.00 sec)

centosにcpanを入れる

今度こそ行けるかな?
$ sudo yum install cpan

これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/2): perl-CPAN-1.9402-144.el6.x86_64.rpm | 247 kB 00:00
(2/2): perl-Digest-SHA-5.47-144.el6.x86_64.rpm | 65 kB 00:00
——————————————————————————–
合計 128 kB/s | 312 kB 00:02

ほう。

cpanのupgrade
# perl -MCPAN -e shell
cpan[1]> o conf prerequisites_policy follow
cpan[2]> o conf commit
cpan[3]> upgrade

upgradeがやたら長いぞ。
なんだこれ、永遠と終わらんぞ。。

git hubからgit cloneします。
git clone https://github.com/PerlDancer/Dancer2.git

ここからどーするか。。

ルーティングのサンプルはいっぱいあるんだが、どこにファイルを置けばいいの?

cpan update

$ sudo cpan
cpan[1]> upgrade

$ cpan Dancer
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
………….
New CPAN.pm version (v2.16) available.
[Currently running version is v2.00]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.

…………………………………………….Killed
あああああああああ、もうubuntuではできん。。centosでやろう。

perl dancer

なんだこりゃ、どうしろってんだ。。。


CPAN(シーパン、Comprehensive Perl Archive Network)とは、Perlのライブラリ・モジュールやその他のPerlで書かれたソフトウェアを集めた巨大なアーカイブで、世界中のサーバにその内容がミラーリングされている。再利用性・汎用性の高いモジュールが登録されており、Perlプログラマができるだけ車輪の再発明をせずに済むための支援環境となっている。登録モジュールの検索システムも提供されているため、Perlプログラマは望む機能を持ったモジュールを容易に入手することができる。

vagrant@vagrant-ubuntu-trusty-64:~/perl$ cpan Dancer
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
Warning: Your system date is 1 days behind this index file!
System time: Mon Sep 10 07:24:39 2018
Timestamp index file: Tue, 11 Sep 2018 09:17:02 GMT
Please fix your system time, problems with the make command expected.

なんだと!
vagrant@vagrant-ubuntu-trusty-64:~/perl$ sudo ntpdate ntp.nict.jp
11 Sep 13:19:42 ntpdate[20614]: step time server 133.243.238.164 offset 107448.537336 sec
vagrant@vagrant-ubuntu-trusty-64:~/perl$ date
Tue Sep 11 13:21:24 UTC 2018

いいね~

vagrant@vagrant-ubuntu-trusty-64:~/perl$ cpan Dancer
Fetching with HTTP::Tiny:
http://ftp.jaist.ac.jp/pub/CPAN/authors/01mailrc.txt.gz
Reading ‘/home/vagrant/.cpan/sources/authors/01mailrc.txt.gz’
………………………………………………………………….DONE
Fetching with HTTP::Tiny:
http://ftp.jaist.ac.jp/pub/CPAN/modules/02packages.details.txt.gz
Reading ‘/home/vagrant/.cpan/sources/modules/02packages.details.txt.gz’
Database was generated on Tue, 11 Sep 2018 09:17:02 GMT
HTTP::Date not available
………….
New CPAN.pm version (v2.16) available.
[Currently running version is v2.00]
You might want to try
install CPAN
reload cpan
to both upgrade CPAN.pm and run the new version without leaving
the current session.

……………………………………………Killed