忍者ブログ

Home > Perl

Perl Archive

[PR]

  • 2024-04-27 (Sat)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • Comments (Close):
  • TrackBack (Close):

今更ながら、人工無脳な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のアカウントで稼働させてます。

PR

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プログラミング
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
スポンサードリンク

Page Top