PerlとRubyがくしゅう帳

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_です。 最近は主にPerl関連の勉強会やコミュニティに参加しています。

カテゴリ: Perl

ある日、リスペクトしている、とある偉いperlハッカー先生がツイッターでつぶやいていた。

twitter

perl入学式で、無いものはcpanモジュールを駆使して自分で作れば良いと教わっていたので、自分でtwitterbotを作って見ることにした。

・・・何ヶ月か前に勉強会perl鍋に参加した時に作り、ローカル環境で実験してうまく動いてからずっと放置していたので、きちんとスクリプトを仕上げてさくらvpsのサーバーに上げて自動実行させようとしたら色々ハマッてしまったので、その解決策を備忘録として書いておく。


twitterbotのスクリプトは、cpanのNet::Twitter::Lite::WithAPIv1_1モジュールを使った。TwitterAPIの利用登録から実際の使い方は@yusukebeさんのブログ記事「イカ娘でTwitter OAuth認証」を参考にさせていただいた。


作ったtwitterbotは、

@で話しかけられると定型文を返すというbotなので、perlのスクリプトでは、@で話しかけれられているかを取得->話しかけられていれば、@で返す

の部分を作り、その.plファイルをcronという定期的にスクリプトを実行してくれるデーモンで5分毎に実行させるような仕組みにした。


cronの設定は、crontab -eというコマンドで以下の書式で設定ファイルを書く。

PATH=/home/ユーザー/perl5/perlbrew/bin:/home/ユーザー/perl5/perlbrew/perls/perl-5.16.3/bin

*/5 * * * * /home/ユーザー/ディレクトリ/スクリプト.pl


注意点は、PATHで使うperlの位置を設定しておかないと、デフォルトで入っているシステムのperlで実行しようとしてしまうので、perlbrwでインストールした新しいperlを使うには、PATHを設定する。

で、いざcronを実行してみると、5分毎にスクリプトの実行を試みているが、エラーが帰ってきてスクリプトが動いていない。エラーの内容は、

Can't locate JSON.pm in @INC (@INC contains: ・・・

cpanモジュールが然るべき位置に無いと怒られた。


cpanm -reinstallコマンドでインストールしなおしてもエラーは変わらず。

エラーの出てるcpanモジュールのuse宣言の順番を最後に回すと、一番最初にuseしているモジュール名で同様のCan't locate エラーが出た。どうも全てのcpanモジュールが読み込めてない様だ。


色々ググってこちらのブログ記事「PerlによるTwitter bot制作」を参考にさせていただいた。

どうやら、crontabで設定したPATHは、使用するperlのディレクトリ位置情報のみで、インストール済みのcpanモジュールのディレクトリ位置情報は別の模様。cpanモジュールの位置は、フルパスで指定しなければならない様だ。


cpanモジュールの絶対パスをスクリプトの最初に記述、FindBinというcpanモジュールで、現在実行している.plスクリプトのディレクトリ位置を取得し、スクリプト中に出てくる設定ファイル等のディレクトリ位置を読み込めるように設定しなおしたら、twitterbotのスクリプトは見事動いた。


完成したbotはこちら。何かやらかしてしまった時に、@dakarabot にメンションを飛ばすと反応します。


twotterbotを作ってみて、困った点

  • twitterのAPIの制限で、同じツイートは短時間の間にツイートできない。(スパム対策か?)だから、スペースをかましたダミーのツイートとかをいくつか作って誤魔化してみた。だから、大量に@が飛んでくると、多分動かない。
  • 自分には絵心が全く無いので、twitter用アイコンの作成ができませんでした。なので、偉いperlハッカー先生の趣向を尊重してみた。

perlでsqlite3で作成したDBに接続するコードを書いてテストしてみました。

  • 参考にした本
    • perl鍋で使っていたcpanモジュールガイドで、DBIのページを参考にスクリプトを書いてみました。
  • 準備
    • あらかじめ、MACにデフォルトで付属しているデータベース、SQLIte3でデータベースとテーブル定義、サンプルレコードを作っておく。
  • やった事
    • DBIをcapnからインストール。
  • 書いたコード
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use DBI;
use Data::Dumper;

my $db = DBI->connect('dbi:SQLite:../database/gakusyuu.db','',''); 
 print Dumper $db;

接続文字列の引数に今回の実行環境、'dbi:SQLite;dbname=DBのパス/DBのファイル名'を設定して実行してみたところ・・・

=> install_driver(SQLite)と怒られる。DBD::SQLite等の各データベースに接続する為のドライバモジュールは別でインストールする必要があるみたい。cpanからDBD::SQLiteをインストールして、もう一度実行。

=>DBIのオブジェクトのハッシュが返されたので、とりあえず成功?

続きのテストコードをサンプルに習って書いてみた。

my $st = $db->prepare('select * from type');
$st->execute();
while (my $row = $st->fetch row){
	print Dumper $row;
} 

コードの内容を自分なりに整理。

  1. DBI->connect()でデータベースに接続するオブジェクトを生成する
  2. 上記データベース接続オブジェクトのprepare()メソッドで、引数のSQL文を実行する事ができる、SQL命令オブジェクトを生成。
  3. 上記SQL命令オブジェクトのexecute()メソッドを実行し、SQL文の実行結果(今回はselect文)がSQL命令オブジェクトに格納される。
  4. 上記SQL命令オブジェクトに格納された実行結果は、fetchrow_hashrefでワンレコードごと取り出す事が可能。while文で$row変数にワンレコードずつ取り出してプリントしてみた。

{'フィールド名1'=>'データ',

'フィールド名2'=>'データ'

}

の形式のハッシュ(リファレンス)の取り出しに成功。

なんと、めっちゃ簡単に接続してレコードが取り出せてしまった!cpanモジュール、すごい。

※今回の疑問

データベース本体は、どのディレクトリに入れるのが定石?

※格納されるとか、生成するというのは、それぞれデータ等の場所への参照が格納されているイメージを脳内で補完しておくとイメージしやすいかな?

昨年度、Perl入学式式第一期生として1年間受講者として参加していた勉強会にサポーターとして参加して来ました。
今日の課題はLinux、Plenv、Perlのインストール(環境構築)と誰もが通る第一歩、

「Hello,world !」を出力するコードを書くところまででした。

環境構築は、意外とハマるとことも有り、手こずった感じでした。(in東京、大丈夫かな?マンパワー的な意味で)インストールしようとするPCの環境って十人十色なので、ハマる時はハマるって感じでしょうか。

参加者は、何かしらの言語経験があり、Perl ”も” 使ってみたいという方が大多数でした。中には、プログラミング言語自体を勉強したいという方もおられました。

自分自身が後者側の者として昨年度参加し、今年は気がついたら何故かサポーター側に回っていたという人間です。ですので、自分のポジションとしては、初学者特有の悩み?を初学者視点で・・・例えば、

「こんなしょうもない事聞いていいのだろうか?」とか、

「質問して帰ってきた答えが難しくてわからない」とか、

「(ごく簡単な質問をしたつもりが)質問した内容が(回答者側で)高度に解釈されてしまい、帰ってきた答えが求めていたものと違った」

などの部分を埋められる感じで役に立てれば良いなぁと思っています。(ですので、手に負えない高度な質問は、真のプロの方に私も助けを求めるでしょう(笑)) 

ですので、どんな質問でも遠慮せず、 #Perl入学式 のハッシュ タグを付けての質問してもらえれば幸いです。Perl入学式は、「プログラミング初心者大歓迎」が売りのハードルを低く設定した勉強会ですので。


次回は6月、偶数月に開催の予定です。今日の資料は、総裁がweb上に上げてくれるはずなので、上がれば リンクを張ります。

昨日のtwitterで、「今度、Perl入学式の総裁に聞いてみよう」とつぶやいた時、思いついたサービスを作ってみた。

思いついた経緯はこんな感じ。

Perl入学式の総裁 -> 電車
今度 -> こんど


初めて東京へ行った時、電車の案内板の「こんど」と「つぎ」、どっちが早いのかわからなくて「つぎ」に乗ったら「こんど」が先に出発して悲しかった。

ニュアンス的には、「つぎ」が直近ぽくて「こんど」は随分先のイメージなのに、、、 
この春、東京に初めて出て困っている人も多かろう。 

ということで、 初めて東京に出て「つぎ」と「こんど」のどちらの電車が先に出発するかすぐに分かるサービスをつくってみました。


さくらVPSで、Perlで書いた自動メール送信DAEMONを使うため、使っているcpanモジュールをインストールしてみたが、いくつかのモジュールがエラーで入らなかった時の対処メモ。

入らなかったモジュールは
Email::Sender::Simple
Email::Sender::Transport::SMTP::TLS

さくらVPSのOSは、標準でセットアップされているCentOS6.4。
インストール方法は、cpanm  コマンド。
インストールログを確認すると、どうやらperl-Net-SSLeayとかのモジュールが原因っぽい。 

ググってみると、どうやら、Perlの基本モジュール?の一部がデフォルトでインストールされておらず、その一部がperl-Net-SSLeayらしいという記事を発見。LinuxとかUnixとかズブの素人なので、かなり自分の感覚で解釈して読んでるいるので、本当にそれが原因で合っているのか不安ながら、ま、失敗すればOS再インストールからやりなおせばいいかの精神で試してみました。

こちらのブログ記事を参考にさせて頂きました。

記事通りに3つのモジュールをインストールしてから、再度cpanmでEmail::~モジュールをインストールしたら、見事入りました!

perlbrewの不具合とか原因が何なのかよくわからない手探り状態から何とか解決。
とりあえず、何でもやって見ることが大切なんでしょうね。
あと、Perlコミュニティの人のヘルプはとても助かります。感謝。 

このページのトップヘ