header image

Categories

FEED

  • goo RSSリーダーへ追加
  • Livedoorリーダーへ追加
  • はてなRSSへ追加
  • Googleへ追加
  • myyahooへ追加
  • feedpathへ追加
  • NewsGator Onlineへ追加
  • Bloglinesへ追加

携帯対応

QRコード

RING

人気ブログランキング



2008/08/02 02:40:55 Perl none Comments
add Hatena Bookmark

仕事でとあるサイトのGoogle Page Rankをいっぱい調べないといけないらしいのだが、驚いたことに手打ちで調べようとしている人がいる。こういうのはシステムが得意なのに。システムで自動でできちゃうようなことを人手で力技でやろうとするから残業地獄になっちゃうんだよ~。
ということで、Perlでのやり方のメモ。

肝は、CPANのモジュールにあるWWW::Google::PageRankを使えば一発だ、ってこと。

1.CPANからWWW::Google::PageRankをインストールする。

cpan -i WWW::Google::PageRank

2.もう準備完了。以下のようなスクリプトを書けば良い。

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Google::PageRank;

my @URL = (
    'http://www.ryuzee.com/',
    'http://www.yahoo.co.jp',
    'http://search.cpan.org',
);

my $gp = WWW::Google::PageRank->new;
foreach(@URL) {
    my $val = scalar($gp->get($_));
    print $_ . "\t" . $val . "\n";
}

これで@URLに指定されたURLのページランクをまとめて取得できる。結果は以下のように表示される。

http://www.ryuzee.com/  2
http://www.yahoo.co.jp  8
http://search.cpan.org  7

簡単すぎる。
似たような話で、WebService::Hatena::BookmarkCountを使うと、はてなBookmarkの被ブックマーク数とかも自動で分かる。

2008/06/30 16:50:51 Perl none Comments
add Hatena Bookmark

CPANのSYNPSISを見ると

use HTML::Tidy;

my $tidy = HTML::Tidy->new( {config_file => 'path/to/config'} );
$tidy->ignore( type => TIDY_WARNING );
$tidy->parse( "foo.html", $contents_of_foo );

for my $message ( $tidy->messages ) {
  print $message->as_string;
}

ってあるので、foo.htmlを用意して、上記の通りやってみたんだけどうまくいかない。
なんでかと思ったら、parse関数って、

The $filename parm is only used as an identifier for your use.
The file is not actually read and opened.

ということで、このファイル名って実際には、単なる識別のためだけで、実際には、ファイルを開いたり読んだりしてないそうな。
まぎらわしすぎる。

実際には

use HTML::Tidy;

my $tidy = HTML::Tidy->new( {config_file => 'path/to/config'} );
$tidy->ignore( type => TIDY_WARNING );
open(F, "foo.html") or die('die...');
@DATA = <f>;
close(F);
$contents_of_foo = "";
foreach(@DATA) {
    $contents_of_foo .= $_;
}
$tidy->parse( "foo.html", $contents_of_foo );

for my $message ( $tidy->messages ) {
    print $message->as_string ."\n\n";
}

とかして、第二引数にファイルの中身を渡さないといかん。(File::Dataとか使っても良い)

configファイルについては、こちらが参考になる。

2008/04/20 19:42:25 Perl none Comments
add Hatena Bookmark Tags:

仕事では、あまりにも糞な粗製濫造ライブラリが多いのでげんなりしている今日この頃。
個人ごとの技術力の差が出てしまうことは仕方がないのだが、その差がなるべく出ないような仕掛け作りと教育プロセスは重要だろう。
ということでModule-Starter-PBPを使ってBest Practiceに従ったモジュールを作る方法。

1.インストール
cpan -i Module::Starter::PBP

2.使い方

module-starter --module=作りたいモジュール名

module-starter --module=My::Test
とすると、作業ディレクトリには以下のような構成でファイルが作られる。

Build.PL
MANIFEST
Makefile.PL
lib
t
Changes
Makefile
README

とりあえず、インストールしようと思えばいつもの通り

perl Makefile.PL
make
make test
make install

とすれば良い。

ただし現在のModule-Starter-PBP-v0.0.3では、作成されたモジュールの7行目において

package My::Test2;

use warnings;
use strict;
use Carp;

use version; $VERSION = qv('0.0.3');

となっており、テストケースが通らない。以下のように変更すること。

package My::Test2;

use warnings;
use strict;
use Carp;

use version; our $VERSION = qv('0.0.3');

なお、自動で作成されたテストケースでPerl::Criticとして書式チェックがPBPに基づいて行われるので
糞味噌な書き方のソースが作成される可能性は大幅に減ることを期待する。

2008/04/18 12:06:37 Perl none Comments
add Hatena Bookmark Tags:

ある案件でActivePerlを使っているのだが、それに関するメモ。(いつも忘れるので備忘)
Proxy環境では、ppmコマンドをたたく際には、環境変数HTTP_PROXYが必要になる。

以下のようにコマンドプロンプトで設定すれば良い。
・認証なしのProxy

set HTTP_PROXY=http://proxyname:port

・認証ありのProxy

set HTTP_PROXY=http://userid:password@proxyname:port

2008/01/08 04:45:45 Perl none Comments
add Hatena Bookmark Tags: , ,

眠れない・・・。
で、いろいろ実験したり、すでに実開発に投入しちゃったりしているのだが、「なんだかなー」な点が見つかったのでメモ。

たとえば単純にPATH_INFOを出力するだけのプログラム(test1.pl)を用意する。

#!/usr/bin/perl
use strict;
my $path_info = $ENV{"PATH_INFO"};
print "Content-type: text/html\n\n";
print $path_info . "\n\n";

これ、EPICで実行させるとき、例えばURIはtest1.pl/hogehogeみたいな形でのアクセスになるのだが、わざわざ、test1.plディレクトリにhogehogeというファイルがないかどうか調べにいってしまい、PATH_INFOとしては認識してくれない。ログは以下のとおり。

LOG: 5 5007-127.0.0.1-3: file.: Looking for file: (C:/dev/workspace)(\perl_test\test1.pl\hogehoge)
LOG: 4 5007-127.0.0.1-3: file.: no such file: C:\dev\workspace\perl_test\test1.pl\hogehoge
LOG: 3 5007-127.0.0.1-3: Error: 404 Not Found: /perl_test/test1.pl/hogehoge

正解は、実行ダイアログを開き、
perl_epic
上記のように、環境タブで、環境変数を設定すれば良い。前回のエントリでREMOTE_USERなんかはここに設定すべし、と書いたがPATH_INFOまで、そうだとは・・・。(って同じ環境変数だからな~orz)
しかしPATH_INFOで画面を切り替えるようなアプリをデバッグする場合、起動構成に全部のPATH_INFOのパターンを登録しないといけない。面倒すぎる・・・。

2008/01/06 07:25:02 Perl none Comments
add Hatena Bookmark Tags: ,

eclipse上でPerlの開発を行うには、EPICと呼ばれるプラグインを利用する。

インストール

eclipseのメニューのヘルプ(H)→ソフトウェア更新(S)→検索およびインストール(F)とたどり、インストールする新規フィーチャーを検索(S)を選択し、新規リモート・サイト(T)を押下。
そこで、

EPIC
http://e-p-i-c.sourceforge.net/updates/

を追加し、表示されるプラグインをインストールする。インストール完了後にいったんeclipseを再起動

続いて、ウィンドウ(W)→設定(P)からPerl EPICを選択し、最低でもPerlのパスは設定する。(PerlはActivePerlかCygwin)

デバッガのインストール

PadWalkerをインストールする必要がある。

ppm install PadWalker

出来ること

コード補完や文法チェック、シンタックスハイライト等を行ってくれる。またPerlDocの検索も出来る。
コード補完ではmy @data;みたいに配列を定義しておくと、$daとうってShift+スペースを押すとちゃんと補完されるが、ちょっと癖があり

my $c = CGI->new();
my $aaa = $c->param("aaa");

ではコード補完が働くが

my $c = new CGI();
my $aaa = $c->param("aaa");

ではコード補完が働かないので注意が必要

CGIの実行

実行(R)→実行ダイアログを開く(N)をクリック。左側のツリーの中にある、「Perl CGI」を選択し、左上の新規ボタンを押下する。ここで名前、対象プロジェクト、ドキュメントルート等を設定する。
これでCGIモードでアプリケーションを実行できる。
環境変数等特殊な値は、環境タブの中で指定する(たとえばREMOTE_USERとか)
なお、内臓HTTPDデーモンは毎回起動のたびにポート番号が違うので注意が必要だ。

感想

とりあえず便利。

2007/12/20 23:50:29 Perl none Comments
add Hatena Bookmark Tags:

Class::DBIは超便利なわけだが、全レコードを並び替えて取得する、というのが何故か一発では出来ない(ように思える)

直感的には

Obj->retrieve_all({ order_by => 'hoge' });

とか出来そうなもんなのだが、NG。DBIだけでやるのであれば

Obj->retrieve_from_sql(qq{ [常に成立するwhere句の中身] order by [ソート順] });

かなり無理やり。

ただ、こいつはプラグインを使うと簡単に解決できる。利用するのはClass::DBI::Sweet。
使い方は以下の通り。この関数では引数にorder byを指定できるようになっている。

$iterator = MyApp::Article->retrieve_all( order_by => 'created_on' );

CPANのモジュールなので導入も簡単。

#補足だが、純粋にorder句を指定して全件取得できれば良いだけなら、Class::DBI::Plugin::RetrieveAllというのもある。こっちの方が使い方もインストールも簡単だ。

2007/05/09 01:01:35 Perl none Comments
add Hatena Bookmark Tags:

こまつさんからのコメント感謝。

エラーの内容は

SSLeay.xs:102:25: openssl/err.h: そのようなファイルやディレクトリはありません
SSLeay.xs:103:27: openssl/lhash.h: そのようなファイルやディレクトリはありません
SSLeay.xs:104:26: openssl/rand.h: そのようなファイルやディレクトリはありません
(以下略)

でNet::SSLeayのmakeで失敗しているようだ。
ログを見る限り、OpenSSLのヘッダファイルが存在しないか、ライブラリへのパスが通っていないのが原因。
んで

[root@kamakura IO-Socket-SSL-1.06]# find / -name lhash.h

の結果は何も該当しないので、ヘッダが無いためであると断定。

[root@kamakura IO-Socket-SSL-1.06]# rpm -aq | grep ssl
openssl-0.9.7a-43.14
xmlsec1-openssl-1.2.6-3
mod_ssl-2.0.52-28.ent.centos4

なのでヘッダ系がない。ということで

[root@kamakura IO-Socket-SSL-1.06]# yum install openssl-devel

んで、改めてCPANからインストールしたところ無事make testも完了。

#しかしこんなに嵌らずとも、CentOSのパッケージで
perl-IO-Socket-SSL.noarch
がextraパッケージに用意されてた・・・・。
Perlのモジュール突っ込む前に、yumで調べるようにしないといけないね。

#それにしても色々なトラブル中に俺は何やってるんだ。。。

2007/05/08 06:57:51 Linux, Perl 1 Comments
add Hatena Bookmark Tags: ,

昨日の続き。IO::Socket::SSLがCPAN経由ではインストールできなかった件だが、とりあえずtar玉からインストールすることで解決。

wget http://search.cpan.org/CPAN/authors/id/S/SU/SULLR/IO-Socket-SSL-1.06.tar.gz
tar xvfz IO-Socket-SSL-1.06.tar.gz
cd IO-Socket-SSL-1.06
perl Makefile.PL
make
make install

の順に実施してインストール完了。とりあえず問題なさそうで、ddclientの処理モードをSSLに変えることが出来た。

なお、ddclientを非デーモンモードでデバッグログ付で出力するには以下のコマンドを使う。

ddclient -daemon=0 -debug -verbose -noquiet>debug.log 2>&1

2007/01/27 22:07:55 Perl none Comments
add Hatena Bookmark Tags:

Perlのサブルーチンが何をやっているか調べたいときには

perl -MO=Deparse <スクリプト名>

« 前の記事 


ads

Ryuzeeのお気に入り