‘Perl’ カテゴリーのアッー!カイブ

Mojolicious::Liteで掲示板作成に着手しました

超簡単な仕様↓
DB:SQLite
イカ娘:Acme::Ikamusume
フレームワーク:Mojolicious::Lite

とりあえずここまで出来ました↓

#!/usr/bin/perl

use utf8;
use Acme::Ikamusume;
use Mojolicious::Lite;

get '/' => sub {
    my $self = shift;

    $self->render_text( Acme::Ikamusume->geso("こんにちは、世界。") );
} => 'index';

app->start;

アウトプット↓

こんにちは、世界でゲソ。

DBもフレームワークもCGIで使うのは初めてなので学ぶことがいっぱいです。モダンモジュール使いまくりたいです。

PerlにはAcme::というジョークモジュールの名前空間があって、そこにIkamusumeというイカ娘(自分はアニメは数話ぐらいしか見てないけど)の口癖で出力するモジュールがあります。

こいつを掲示板で実用的に使おうと考え中です。

「パール力」(バールではないぞ!?)

「入門vi 第6版」の終盤に「viリファレンスTシャツ」というのがあるという情報が載っていました。他にもないんかな?と検索した結果がこれだよ↓

(自分で作った顔隠すツールが初めて役に立った瞬間 隠す意味あるのか知らんけど)

PERL_POWER

「PERL」に「POWER」って「Perl」好きな「pawa」さんのためにデザインしたTシャツじゃないのか!?と思った。これは買わずにはいられない!!

このモデルの人、ファイアーエムブレムの最初から仲間にいる、ステータス高いけど成長率低いオッサンキャラみたいだけど、こういうオッサンキャラ大好きだぜ?

今日はVimを集中調教しました。「neoなんとか.vim」とか「unite.vim」とかは言うまでもなく便利ですが、ref.vimも地味に便利でした。

テキストベースのWebブラウザをインストールするとVim内で英単語の意味を調べることができます。(perldocはWebブラウザをインストールしなくても見れました)↓

vim_alc

変数の名前考えるのに調べることが少なくないので便利ですじゃ。

Vimの調教はとりあえず終わったので、明日からPerlベストプラクティスの続き・・と行きたいところですが、卒研のテーマ案をもうちょっと考えたい。

代替テーマ案は正直微妙なんですよね。できたらできたでまあまあ面白そうだけど、俺得じゃないのが好かん。

画像処理じゃなくても良いとのこと(といっても教授パワーが得られないのは必至ですが)なので自然言語処理も視野に入れてもうちょっと探ってみたい。

オレはゾンビですか?

いいえ、病人です。

今日は卒研の代替テーマを考えて新年会行って電車内でゾンビ化してました。どうやら他の人より酔うのが遅いみたいで、いつも電車内でゾンビ化します。今日はもうちょっとで吐きかけたので途中下車して小便して涼んでから帰って難を逃れました。

実は、新年会行く前に本屋でAR本(いつの間にか新しい本がいろいろと出てたので)を1時間ほど同じ態勢で立ち読みしていました。そろそろ本屋出るかと思ってカバンを取ろうとした瞬間、腰にふくらはぎをつったような痛みがぁぁ。(軽いぎっくり腰っぽい)

くにおくん風にいうと「どっくーんときたよー!」です。あまりの痛さにフルヘッヘッヘ。

なんとか歩けるぐらいだったので新年会は行けました。(春休み中 && 草野球でない で良かった) 新年会では、上がり症なのに加えて、こう言ったら傷つくかなとか、こう言い返されたらどうしようとか考え込んでしまうタイプで、やはりいまいち雑談できませんでした。

ちなみに本屋で読んだAR本には大したことは書かれたなかった。論文読んだほうが面白いことに気づきました。

ところで、論文読んでると、「Pachube」というのを見つけました。どうやらユーザーがセンサーの情報を送信したり、ユーザーが他のユーザーのセンサーの情報を取得できるサービスみたい。

ど、どうせCPANに「Pachube」のモジュールあるんでしょ!?と思ったらやはりありました。
Pachubeモジュール

面白いセンサーがあればインストールして使ってみたいけど、まだ微妙な感じかな。

明日(今日)は卒研の代替テーマをPDFにしてボスに送ります。卒研のテーマ発表で発表したテーマとはかなり違うテーマになっちゃった・・・。テーマ発表で発表したテーマは研究じゃなくて開発なので、これは趣味の時間に回して開発します。

さくら鯖でText::MeCabをインストールする方法(UTF-8対応)

これは誰でもハマると思うので、インストール手順をまとめておきます。「username」を自分のアカウント名に置き換えて利用してください。

ちなみに著者は「さくらのレンタルサーバ スタンダード」です。

「tar zxfv ******」の「******」は予め「/home/username/」にダウンロードしておくか、wgetを使ってください。

ひとつインストールできる度に「/home/username」に戻ってください。(念のため)

libiconvをインストール

tar zxfv libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --with-prefix=/home/username/local
make
make install prefix='/home/username/local' exec_prefix='/home/username/local' libdir='/home/username/local/lib'

mecabをインストール

tar zxfv mecab-0.98.tar.gz
cd mecab-0.98
./configure --prefix=/home/username/local --with-charset=utf-8 LIBS=-liconv CPPFLAGS=-I/home/username/local/include LDFLAGS='-L/home/username/local/lib -R/home/username/local/lib'
make
make check
chmod 755 install-sh
make install

↓のエラーが出るけど大丈夫っぽいです。
(少なくとも自分はこれが出ても動きました)

runtests faild in
exit: Illegal number: -1
FAIL: run-cost-train.sh
===================
1 of 3 tests failed
===================

mecab-ipadicをインストール

tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --prefix=/home/username/local --with-charset=utf-8
make
make install

mecab-configのパスを調べる(次のステップで聞かれるため)

whereis mecab-config
mecab-config: /home/username/local/bin/mecab-config

Text::MeCabのインストール

tar zxvf  Text-MeCab-0.20008.tar.gz
cd Text-MeCab-0.20010
perl Makefile.PL prefix=/home/username/local/lib/perl5/ LIB=/home/username/local/lib/perl5/ INSTALLMAN1DIR=~/home/username/local/man/man1 INSTALLMAN3DIR=~/home/username/local/man/man3

↓のメッセージが出る場合は(恐らく出る)

Can't link/include 'mecab', 'mecab'

「/home/username/Text-MeCab-0.20010/Makefile.PL」をテキストエディタで開いて「check_lib($config);」を「#check_lib($config);」にしてコメントアウト。

コメントアウトしたら、「Text::MeCabのインストール」のコマンドを再度入力。

Warning: prerequisite Test::Requires 0 not found.

↑のエラーが良くみたら出ている場合は、

cpan
install Test::Requires

で一応インストール。

「Test::Requires」をインストールしたら「Text::MeCabのインストール」のコマンドを再入力。

無事に終わったら完了です!もしエラーが出ていたら、まずはエラーの英語をよく読みましょう。

サンプルコード↓(文字コード:UTF-8)

#!/usr/bin/perl

use strict;
use warnings;
use lib qw(/home/username/local/lib/perl5/i386-freebsd-64int);
use Text::MeCab;

print "Content-Type: text/html; charset=UTF-8\n\n";

my $mecab = Text::MeCab->new();

my $str = "私はかわいいものが好きなだけであってロリコンではないぞ!";

my $node = $mecab->parse($str);

for(my $node = $mecab->parse($str); $node; $node = $node->next)
{
	print " 表層:" . $node->surface . "<br />\n"; # 表層
	print " 品詞:" . $node->feature . "<br />\n"; # 現在の品詞
	print "コスト:" . $node->cost    . "<br />\n"; # その形態素までのコスト
	print "<br />\n";
}

サンプルコードに対するアウトプット↓

 表層:私
 品詞:名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
コスト:2737

 表層:は
 品詞:助詞,係助詞,*,*,*,*,は,ハ,ワ
コスト:3163

 表層:かわいい
 品詞:形容詞,自立,*,*,形容詞・イ段,基本形,かわいい,カワイイ,カワイイ
コスト:9394

 表層:もの
 品詞:名詞,非自立,一般,*,*,*,もの,モノ,モノ
コスト:11400

 表層:が
 品詞:助詞,格助詞,一般,*,*,*,が,ガ,ガ
コスト:10091

 表層:好き
 品詞:名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
コスト:10402

 表層:な
 品詞:助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
コスト:9498

 表層:だけ
 品詞:助詞,副助詞,*,*,*,*,だけ,ダケ,ダケ
コスト:13285

 表層:で
 品詞:助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
コスト:14327

 表層:あっ
 品詞:助動詞,*,*,*,五段・ラ行アル,連用タ接続,ある,アッ,アッ
コスト:10781

 表層:て
 品詞:助詞,接続助詞,*,*,*,*,て,テ,テ
コスト:11972

 表層:ロリコン
 品詞:名詞,一般,*,*,*,*,ロリコン,ロリコン,ロリコン
コスト:16804

 表層:で
 品詞:助詞,格助詞,一般,*,*,*,で,デ,デ
コスト:17505

 表層:は
 品詞:助詞,係助詞,*,*,*,*,は,ハ,ワ
コスト:17740

 表層:ない
 品詞:形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ
コスト:19285

 表層:ぞ
 品詞:助詞,終助詞,*,*,*,*,ぞ,ゾ,ゾ
コスト:21801

 表層:!
 品詞:記号,一般,*,*,*,*,!,!,!
コスト:22256

 表層:
 品詞:BOS/EOS,*,*,*,*,*,*,*,*
コスト:20519

さくらたんのレンタルサーバでEmail::Sender

Twitterで「Perlでのモダンなメールの送信方法はNet::SMTPかな!?」とつぶやいたら、「Email::Sender」だよ!と教えてもらったのでモジュールのインストールからやりました。

CPANのインストール手順は省略するとして、Email::Senderのインストールは他のモジュールをインストールする手順で普通にできました。Moose依存なので少し時間がかかりましたが・・・。

とりあえず日本語のメールも送信できるコード↓

#!/usr/bin/perl

use utf8;
use strict;
use warnings;
#use CGI::Carp qw/fatalsToBrowser/;
use Encode    qw/encode/;
use lib       qw(Emaill::Senderをインストールしたパス);
use Email::Sender::Simple qw/sendmail/;
use Email::MIME;
use Email::MIME::Creator;
binmode STDOUT => ':utf8';

my $email = Email::MIME->create
(
	header =>
	[
		To      => encode('MIME-Header-ISO_2022_JP' => '"ぱわ" <pawaアッー!とdojikko.com>'),
		From    => encode('MIME-Header-ISO_2022_JP' => '"くりえ" <kurieアッー!とk-hanyan.com>'),
		Subject => encode('MIME-Header-ISO_2022_JP' => "てすとめぇる"),
	],

	attributes =>
	{
		content_type => 'text/plain',
		charset      => 'ISO-2022-JP',
		encoding     => '7bit',
	},

	body => encode('iso-2022-jp' => "がぉぉぉ!nなのです!n"),
);

sendmail($email);

print "Content-Type: text/html; charset=UTF-8nn";
print "送信完了!";

ちなみに、本文の部分はISO-2022-JPに、ヘッダー部(To,From,Subjectなどの部分)はISO-2022-JPをさらにMIMEという形式に変換したものでなければならないようです。