chmod -R 755 ${dir}

Internal Server Error

[vagrant@localhost acs]$ cd /var/www/cgi-bin
[vagrant@localhost cgi-bin]$ chmod -R 755 asset

あ”

Since the cgi-bin directory is recognized as in the normal apache@unix environment it is only “CGI program”, the server attempts to execute the CSS files as a obviously program it is the cause of the error.

There are several workaround options, but it is easy to move the CSS and JS files under htdoc/ directory (where index.html by default).

htmlディレクトリ配下に移動させます。

print "	<link rel=\"stylesheet\" type=\"text/css\" href=\"../html/asset/css/styles.css\" />";

htmlはいらない模様。。修正します。

print "	<link rel=\"stylesheet\" type=\"text/css\" href=\"../asset/css/styles.css\" />";

これでOK。なるほどー

perl cgiのインデント

そもそもperlは使わない、なんてことは触れないとして、
cgiでhtmlをタグを書く際に、半角スペース4つ分のインデントを開けるのか?という疑問が湧いてくる。
他のコードを見ると、インデントは開けずに書いているように見えるが。。果たして。。

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

print "Content-type:text/html\n\n";
print "<!DOCTYPE html>";
print "<html>";
print "<head>";
print "	<meta charset=\"UTF-8\">";
print "	<title>ログイン|入稿管理支援システム</title>";
print "	<link rel=\"stylesheet\" type=\"text/css\" href=\"asset/css/styles.css\" />";
print "</head>";
print "<header>";
print "	<p><a href=\"index.html\">Hpscript</a></p>";
print "	<nav>";
print "		<p>入稿管理支援システム</p>";
print "	</nav>";
print "</header>";
print "<body>";
print "    <div id=\"content\">";
print "	<h1>ログイン</h1>";
print "	<form action=\"cgi-bin/hoge.cgi\" method=\"post\">";
print "		<p>";
print "		    ユーザーID:<input type=\"text\" name=\"login_id\" size=\"30\">";
print "		</p>";
print "		<p>";
print "		    パスワード:<input type=\"text\" name=\"password\" size=\"30\">";
print "		</p>";
print "		<p>";
print "		    <input type=\"submit\" value=\"ログイン\">";
print "		</p>";
print "	</form>";
print "	</div>";
print "</body>";
print "</html>";

インデントを付けたからと言って見やすくなるわけでもないから、いらないようにも思える。。

.pl and .cgi extension

1).pl extension
A common extension is “.pl” in the perl source file. In other words, it is an extension attached when writing source code of perl, such as in Notepad.

2).cgi extension
Apply .cgi extension to Perl program that runs as CGI.

On ordinary web servers, .cgi is used to distinguish CGI programs. In other words, regardless of the language used, in C, Perl or PHP, it is often the case that .cgi is used as a criterion if you run it “with CGI”. This depends on the setting of the server, so if you only set it as .pl, it means that it works with .pl, Perl or C(However, it depends on the server whether there is an operating envrionment other than Perl.)

Also, on ordinary web servers, .pl will also use Perl code when the web server interprets Perl code directly. This does not start an external process unlike CGI, but interprets it inside the web server using mod_perl etc. It is assumed that mod_perl is installed on the server.

In the former case, CGI etc. that is distributed will also work if you change. CGI to .pl and then istall it normally. if it is the latter, it may be necessary to add some hands depending on circumstances.

Perl Internal Server Error

test.cgi

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

print "Content-type:text/html\n\n";
print "<html>\n";
print "<head></head>\n";
print "<h1>Hello World</h1>";
print "</html>";

Internal Server Errorが表示されたら、
file permissionを644から755に変更する

mod_perl, mod_ssl, mod_wsgi

mod_perlは、Perl言語で記述されたプログラムを高速に実行できる機能を持った、apacheのモジュール。このモジュールを組み込むと、perlでapache APIを利用することができるようになる。

ApacheをSSL対応するためには、mod_sslとOpenSSLが必要。ApacheでSSL/TLSを利用するためのモジュールとしてmod_sslが利用されている。

mod_wsgiは、WSGI(Web Server Gateway Interface)インターフェイスに準拠したPythonのプログラムをApache HTTP Serverで動作させるためのモジュール。

sudo perl -MCPAN -e shell

http://www.cpan.org/SITES.html

setting url to get

Japan
ftp://ftp.nara.wide.ad.jp/pub/CPAN/
http://ftp.nara.wide.ad.jp/pub/CPAN/
rsync://ftp.nara.wide.ad.jp/cpan/

install Test::Pod
-> PODの書式に誤りがないかを確認する

install YAML
-> YAML形式のファイルを読み込む

install CGI
-> サーバ上で動作

install CGI::Session
-> CGIアプリケーションにおける持続的なデータのセッション

install Pod::Escapes
-> This module provides things that are useful in decoding Pod E<..> sequences. Presumably, it should be used only by Pod parsers and/or formatters.

install Pod::Simple
-> Pod::Simple is a Perl library for parsing text in the Pod (“plain old documentation”) markup language that is typically used for writing documentation for Perl and for Perl modules. The Pod format is explained in perlpod; the most common formatter is called perldoc.

install Jcode
-> 日本語文字集合ハンドラ。Jcode.pmはオブジェクト的なアプローチと従来のアプローチの両方をサポート。オブジェクト的なアプローチでは、 $iso_2022_jp = Jcode->new($str)->h2z->jis とすることもできる。

install Mail::Sendmail
-> Simple platform independent e-mail from your perl script. Only requires Perl 5 and a network connection. After struggling for some time with various command-line mailing programs which never what i wanted, i put together this perl only solution.

use Mail::Sendmail;
%mail = ( To => 'hoge@gmail.com',
          From => 'me@here.com',
          Message => 'This is very short message');
sendmail(%mail) or die %Mail::Sendmail::error;

print "OK, Log says:\n", $Mail::Sendmail::log;

install OLE::Storage_Lite
-> Simple Class for OLE document interface. allow you to read and write an OLE structured file. class representing PPS.

install Spreadsheet::ParseExcel
-> read information from an Excel file.

install Net::OpenSSH
-> OpenSSH is a secure shell client package implemented on top of OpenSSH binary client. This package is implemented around the multiplexing feature found in later version of OpenSSH.

install Capture::Tiny
-> Capture::Tiny provides a simple, portable way to capture almost anything sent to STDOUT or STDERR, regardless of whether it comes from Perl, from XS code or from an external program. Optionally, output can be teed so that it is captured whilebeig passed through to the original filehandles.

install Date::Calc
-> グレゴリオ暦に基づいた日付計算

install FCGI
-> CGI.pmによって作成されるCGIオブジェクトのサブクラス。 Open Market FastCGI標準でうまく機能するように特殊化されている。

install Time::HiRes
-> 高精度のalarm, sleep, gettimeofday, インターバル・タイマー。

install DBI
-> Database independent interface for Perl

install Text::CSV_XS
-> CSV形式の操作ルーチン。コンマ区切り文字列CSVを組み立てたり切り分けたりするのに便利な機能を提供する。フィールド群を連結してCSV文字列にしたり、パースしてフィールド群にすることができる。

install ExtUtils::MakeMaker
-> モジュール用Makefileの生成。Makefile.PLにおいて拡張モジュールのためのMakefileを書くために設計されている。

install DBD::mysql
-> MysqlのためのPerl DBIドライバ。

install IO::Stringy
-> I/O on in-core objects like strings and arrays. This toolkit primarily provides modules for performing both traditional and object oriented i/o on things.

Check the packages installed on Linux

A command to return the package list(yum list installed, rpm -qa)
you can obtain a list of package names you want to search by piping to grep command to search for caracter strings.

[vagrant@localhost ~]$ yum list installed | grep gcc
gcc.x86_64                         4.4.7-23.el6                      @base
gcc-c++.x86_64                     4.4.7-23.el6                      @base
libgcc.x86_64                      4.4.7-23.el6                      @base

うん、インストールされているようだね。
[vagrant@localhost ~]$ yum list installed | grep perl
perl.x86_64 4:5.10.1-144.el6 @base
perl-CPAN.x86_64 1.9402-144.el6 @base
perl-DBD-MySQL.x86_64 4.013-3.el6 @base
perl-DBI.x86_64 1.609-4.el6 @base
perl-Digest-SHA.x86_64 1:5.47-144.el6 @base
perl-Error.noarch 1:0.17015-4.el6 @base
perl-ExtUtils-MakeMaker.x86_64 6.55-144.el6 @base
perl-ExtUtils-ParseXS.x86_64 1:2.2003.0-144.el6 @base
perl-Git.noarch 1.7.1-9.el6_9 @base
perl-Module-Pluggable.x86_64 1:3.90-144.el6 @base
perl-Pod-Escapes.x86_64 1:1.04-144.el6 @base
perl-Pod-Simple.x86_64 1:3.13-144.el6 @base
perl-Test-Harness.x86_64 3.17-144.el6 @base
perl-devel.x86_64 4:5.10.1-144.el6 @base
perl-libs.x86_64 4:5.10.1-144.el6 @base
perl-version.x86_64 3:0.77-144.el6 @base
[vagrant@localhost ~]$ perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

Copyright 1987-2009, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using “man perl” or “perldoc perl”. If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

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