Home > Perl
Perl Archive
今更ながら、人工無脳なTwitterボット作ってみた
- 2010-01-24 (Sun)
- Perl
Perlの勉強の為、久々に人工無脳を作ってみました。
説教っぽく聞こえなくもない言葉を30分に1回つぶやきます。
迷言ボット (bornneet) on Twitter
興味のある方はfollowしてみて下さい。
精度は全然ですが、まぐれで良いこというかもしれませんよ^^
最初は、以下の記事を参考にNet::Twitterでやろうとしたのですが、
Macにうまくインストールできなかったので、断念。
Twitter ボットの作り方 Perl 編 (1) – OTCHY.NET
cpanをupdate(cpan > install Bundle::CPAN)とかやってみるも、状況変わらず。
(テクノロ散策: PerlでNet::Twitterがインストールできない時はcpanをアップデート)
xreaにはNet::Twitterが入ってるので、使いたかったんですが、
仕方なく生Perlで書くことにしました。
参考にしたのはこちらの3記事。
404 Blog Not Found:API - Twitterfeed から Hatena::Bookmark Web Hookへ
nDiki: Net::Twitter - Net::OAuth を使って Twitter からフィードを取得 (2009-12-30)
LWP::UserAgentで基本認証とPOSTを - 徒書
最後の最後、xreaでの動作確認でさらにはまりました。
Storableに「Byte order is not compatible at blib/lib/Storable.pm」と言われてもうお手上げ。
またまた先人の力をお借りして何とか解決しました。
(storeを使わず、nstoreを使用)
404 Blog Not Found:perl - 勝手に添削 - Storable
Perl 5.6.2→5.8.7移行メモ
いやぁ、相変わらず、Perlには慣れませんねぇ…orz
※ おまけでxrea無料版ではcronが動かせないという罠も。(何を今さら)
というわけでcore serverのアカウントで稼働させてます。
Macにユーザ権限でmysqlをソースから(あと、DBD::mysqlも)
- 2010-01-12 (Tue)
- Perl
SQLiteでサイトを作ってたんだけど、
同時更新を頻繁にするようなやつはやめといた方が良いと聞いたので、
急遽MySQLに変更。
xamppはすぐパスワード聞いてきて嫌なので、ソースからユーザ権限で入れてみる。
あんまりSnow Leopard向けの情報がなかったのでメモっておきます。
参考サイトは以下の3つ。
MySQL 5.0.45をソースからインストールする on CentOS4.4 - Developer☆STYLE
MySQLをソースからインストール(RedHat9) - FreeStyleWiki
MySQL
では、始めます。
まず、MySQL :: MySQL 5.5
からtar.gzをダウンロードして展開しておく。
ここで多くの手順ではmysqlユーザを作れと書いてあるけど、
ハマったのでログインユーザ(僕の場合は「t」)をmysql用のユーザにする。
※ 元々_mysqlなるユーザがいたせい?
ということで特になにもせずにインストール作業に入る。
sudo rm -rf mysql
make clean
1回ミスったので消す
./configure --prefix=/Users/t/mysql --with-charset=utf8 \
--with-mysqld-user=t
make
make install
特に何もエラーは出ず
cd
cp -p mysql-5.5.0-m2/support-files/my-small.cnf ./my.cnf
ホームディレクトリに設定ファイルを置く
乳牛日記: MySQL5 パラメータファイル(my.cnf)のおき場所
vi my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
[mysqld]
default-character-set=utf8
:wq
文字コードをutf8に
mysql/bin/mysql_install_db
初期化
(mysqlユーザでやった時はここで失敗した)
mysql/bin/mysqld_safe
デーモン起動
ps -ef | grep mysql
mysql/bin/mysqladmin version
起動確認
これでルート権限不要なmysql実行環境ができた。
もうちょっと残作業を。
vi .profile
/Users/t/mysql/bin:
source .profile
PATHに追加
mysqladmin -u root password 'password'
パスワード設定
mysql -u root -p
password> ********
パスワードを使用してログイン
mysql>show variables like 'char%';
文字コードがutf8になってることを確認
mysql>show databases;
mysql>use mysql;
mysql>show tablse;
mysql>select user,password,host from user;
主要なコマンドを一通り叩いてみる。
すんなりできた。
はじめからログインユーザでやれば良かったorz
最後にperl(CGI)からの接続テスト。
参考:PerlからMySQLに接続する(DBD::mysql) - Max OS X LeopardでAMP環境を構築しよう - Apache, MySQL, PHP, Perlで作る開発環境 - futomi's CGI Cafe
mysqld_safe
mysql -u root -p
create database t;
use t;
create table test (id int, name text, blog text);
insert test values (0, 'tnantoka', 'bornneet');
select * from test;
テスト用のデータベース・テーブルを準備
sudo cpan
cpan> install DBD::mysql
cpan> q
CPANでDBD::mysql(全部小文字)のインストール
cd apache/cgi-bin
vi mysql.cgi
#!/opt/local/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect("DBI:mysql:t", "root", "xxxxxxxx");
my $sth = $dbh->prepare("SELECT * FROM test");
$sth->execute;
print "Content-Type: text/html\n\n";
print '<pre>';
print "id\tname\tblog\n";
while(my @row = $sth->fetchrow_array) {
print join "\t", @row;
}
print '</pre>';
$sth->finish();
$dbh->disconnect();
:wq
テスト用のスクリプト
chmod +x mysql.cgi
実行権限をつける
DBD::mysqlでこけるって記事を結構みかけたけど、
特に何も起こらなかった。
さて、MySQLで開発を進めるか。(大学でPHP触ってた時依頼かぁ)
CGIプログラミング第2版 その1:CGI.pmの準備
- 2009-11-30 (Mon)
- Perl
4章まで読み終わった。(遅い!)
いよいよCGI.pmをバリバリ使っていくぞ!
・・・と、思いきや、なんか準備がいるそうで。
P.99によると、
アップロードされたファイルを自動で保存する機能が、
デフォルトでONになっているそう。
(しかもファイルサイズ無制限)
そりゃ怖いので、早速チェックしてみた。
※ 今まで何もせずにuse CGI;しちゃってたけど^^;
perl -MCGI -e 'print $INC{"CGI.pm"},"\n";'
/System/Library/Perl/5.10.0/CGI.pm
※ Class::Inspector - Perlモジュールのファイルパスを取得 Kawa.netブログ(川崎有亮)/ウェブリブログ
cat -n /System/Library/Perl/5.10.0/CGI.pm | head -99 | tail -6
94 # Set this to a positive value to limit the size of a POSTing
95 # to a certain number of bytes:
96 $POST_MAX = -1;
97
98 # Change this to 1 to disable uploads entirely:
99 $DISABLE_UPLOADS = 0;
おぉ、ホントだ。。
今のバージョンは違うかなぁとか思ったけど、本の通りだー。
修正しておこう。
(方法はp.100参照。そこまで書いちゃうと著作権的にOUTなので)
CGIプログラミング第2版でperlをまじめに勉強してみる
- 2009-11-29 (Sun)
- Perl
そろそろServersideなScriptを本気で習得しないとやばそうなので。
(HTML5でサーバ側のスクリプティングが不要になるわけではないしね^^)
教材はこちら↓
CGIプログラミング
とりあえず、3章までを流し読みしてサンプルコードを動作させてみるとこまで終わった。
・クライアントのIPを表示。(P.6)
んっ!?
::1・・・?
([::1]でアクセスしてみる)
おぉ、IPv6で動いとるー。
(Perl全然関係ないけど。)
・バッファリングの確認。(P.68)
本に書いてある通り、apacheはバッファリングしてない。
とりあえずnphの方は覚えなくてよさそうだ。
さて、やるかー。
Canvasゲームプログラミングはおいといて、
当面はperlとHTML5に集中しようと思います。
sortcss.plが素晴らしかったのでコードリーディングを兼ねてJavaScriptに移植してみた
- 2009-11-22 (Sun)
- Perl
hail2u.net - Weblog - CSSのプロパティをソートするPerlスクリプト
本エントリ執筆時の最新スクリプト→sortcss.pl
いやぁ、ホントにこういうのを待ってました!
いつも自分の中で何となく、marginの次はpaddingでその次はborderで・・・とか書きながら、
決まった順番に簡単に並べ替えてくれるやつないかなぁと思ってたんですよねー。
(自分で作れよ、という話は置いといて)
これからはこのスクリプトを使って、仕様順に並んだスマートなcssを書いていきたいと思います。
さて、このお役立ちスクリプトはPerlで書かれています。
perl勉強中の身の僕としてはコードリーディングするっきゃないということで読んでみました。
あと、便利さを体感してもらうためにJavaScriptへの移植版も作ってみます。
それでは、久しぶりに長文エントリのはじまりはじまり。
※ エントリ書いてる途中に元のソースが何回か変わって
断念&放置しかけたのは秘密です。
Perlを読む
それでは順に読んでいきましょう。
1 #!/usr/bin/perl
2
3 # Author: Kyo Nagashima , http://hail2u.net/
4 # xaicron, http://blog.livedoor.jp/xaicron/
5 # License: MIT license (http://opensource.org/licenses/mit-license.php)
6 # Modified: 2009-11-17T23:09:27+09:00
1〜6行目はshebang(インタプリタの指定)とスクリプトに関するコメントです。
ライセンス代わり(?)に引用しておきます。
8 use strict;
9 use warnings;
次も問題ないですね。
strictなスクリプトのお約束です。
11 # CSS2.1
12 my @property_order = qw(
13 margin
:
:
128 speak-header
129 );
11〜129行目はCSS2.1のプロパティ一覧の配列を作成しています。
qw()は文字列リスト演算子といい、クォートとかを書かずにリストを簡単に作成できます。
131 # CSS3 and vendor extension for CSS3
132 push @property_order, qw(
133 background-clip
:
:
364 -webkit-animation-delay
365 );
367 # Vendor extension
368 push @property_order, qw(
369 -moz-background-inline-policy
:
:
469 -ms-zoom
470 );
472 # Other CSS extensions (without vendor prefix)
473 push @property_order, qw(
474 image-rendering
475 ime-mode
476 pointer-events
477 text-rendering
478 );
131〜478ではcss3やブラウザ拡張のプロパティをpush()でproperty_order配列に追加しています。
さて、ここからいよいよロジック部分に入りますので、
丁寧に見ていきます。
480 # Create hash: key => property, value => index
481 # See also: http://blog.livedoor.jp/xaicron/archives/50913074.html
482 my %property = do {
483 my $i = 0;
484 map { $_ => $i++ } @property_order;
485 };
480〜485では各プロパティと順序を対応づけたハッシュを作成しています。
と、これじゃコメントを和訳しただけか。
doブロックで囲んでるので最後の文の処理結果が変数に返ります。
で、その最後の文であるmapでは、
プロパティ配列の各要素を取り出してkeyに、
iをカウントアップしたもの(つまり、並び順)をvalueに持つハッシュを作成しています。
487 my $css = join "", <STDIN>;
さて、そろそろぱっと見で何をしてるか理解できなくなってきました。
自分のperl能力の向上してなさに愕然とします。
とまぁ自虐はいいとして、487では標準入力の内容を一気に読み込んでます。
通常は1行ごとに読み込みますが、リストで評価してやれば全部読み込むということになってます。
つまり、こういうことですね↓
#!/usr/bin/perl
use strict;
use warnings;
# これだと一気に読んじゃって比較にならない。
# printはリストコンテキストで評価するので。
# print <STDIN>;
# 1行読み込み
#my $input = <STDIN>;
# 全部読み込み
my $input = join "", <STDIN>;
print $input;
ただ、下記のコードの方が良いという記述もちらほらとありました。
(区切り文字を変えて読んだ方がjoinで処理しない分速いのかな?)
my $data = do { local $/; <STDIN> };
参考:
「Perl, Python, Ruby の比較」があまりにもいい加減な件 - odz buffer
あと、<STDIN>とかはエスケープしないとタグと解釈されちゃうので注意です。
・・・しまった、ただでさえ長文の予定なのに脱線した。
次、行きます。
488 $css =~ s/{(.*?)}/"{".sort_properties($1)."}"/imgse;
489
490 print $css;
488がソート処理の呼び出しです。
{〜}で囲まれた部分をsort_properties()の結果に置換しています。
(eオプションがあるので置換後の文字列をperl式として評価)
あと、sは"."を改行にもマッチさせるフラグです。JSにもこれが欲しいですね^^
結果を490でprintで標準出力にoutputしてこのスクリプトは終了です。
それでは、sort_properties()は何をしているのでしょうか?
492 sub sort_properties {
493 # Remove leading line-breaks
494 (my $rules = shift) =~ s/^\n+//;
495
496 # Orcish Maneuver
497 # my %temp;
498 # my @sorted_rules = sort {
499 # ($temp{$a} ||= check_order($a)) <=> ($temp{$b} ||= check_order($b))
500 # } split "\n", $rules;
501
502 # Schwartzian Transform
503 # See also: http://gist.github.com/236860
504 my @sorted_rules
505 = map { $_->[0] }
506 sort { $a->[1] <=> $b->[1] }
507 map { [ $_, check_order($_) ] }
508 split "\n", $rules;
509
510 return "\n" . join("\n", @sorted_rules) . "\n";
511 }
まず、494でshiftで取り出した引数から{直後の改行を削除しています。
(と思ってますが実はこの部分、よくわかってません。なので移植も適当です^^)
504〜508がシュワルツ(シュウォーツ)変換によるソート処理です。
シュワルツ変換とは、ソートに必要な計算を比較の都度やらずに、
事前に一度だけ処理して保持しておくことで、無駄をなくす方法です。
今回の場合は、「改行でsplit()した各行」と「計算した順序」を事前に配列に入れておき、
その配列を2列目(順序)でソートして、
1列目(各行の内容)を返すという流れになっています。
その結果を再び改行区切りに戻せば並び替え完了というわけです。
それでは、最後に並び順を計算するcheck_order()です。
513 sub check_order {
514 my $line = shift;
515 my $order = 10000;
516
517 if ($line =~ /^\s*(.+?)\s*:/) {
518 if (defined $property{$1}) {
519 $order = $property{$1};
520 }
521 # } else {
522 # warn "Unknown property: $1";
523 }
524
525 return $order;
526 }
この関数は、cssのプロパティ名を正規表現で抽出し、
propertyハッシュから順序を取り出すという単純なものです。
(なければ10000を返し、最後とする)
さて、これでこのスクリプトの全貌がわかりました(つもりです)。
※ 間違ってたらご指摘をお願いします・・・。
JavaScriptへの移植
以下に置いておきますのでご自由に。
ライセンスはオリジナルと同じくMIT。
いつも通り適当実装なので、突っ込み歓迎です。
※ ちょっと修正[2009/11/23]
→無駄なグローバル変数を削除。
CssSorter.sort()をsortcss()に。
cssSorter
長文すぎるのでコードの説明は割愛しておきます。
やってることは同じですしね。
ちなみにプロパティ配列のJSON変換はこんな感じでやりました。
sudo cpan
cpan[1]> install JSON
cpan[2]> q
cp sortcss.pl sortcss2json.pl
vi sortcss2json.pl
10 use JSON;
491 #print $css;
492 my $json = JSON->new->encode(\%property);
493 print $json;
perl sortcss2json.pl > property.js
本日のエントリは以上です。
Perl使いへの道のりはまだまだ遠いですね!
Home > Perl
- Search
-
Loading
- Feeds
- Links
- スポンサードリンク