タグ:perl ( 6 ) タグの人気記事

ちょっとだけPerlの勉強しました -part4

a0033832_8413740.jpg

CPANモジュールを使う時に

use Number::Format qw /format_bytes/

のように、qw xxx としている部分の意味がイマイチわかんないけど、とりあえずそのままサンプルの通りにコードを書いていたのですが、続・初めてのPerl 改訂版を読み始めて、このモヤモヤした気分が解決しました。
モジュール名の後にインポートリストと呼ばれるサブルーチンリスト名リストを付ければ、インポートされるサブルーチンを制限できます。
use File::Basename ('basename','dirname');
(3.4 インポートする関数を選ぶにはより)
というのがあったのですが、

use File::Basename ('basename','dirname')

とある部分については
これは入力しづらいので、qw()リストを使った書き方の方が一般的です。(3.4 インポートする関数を選ぶにはより)
ということで、

use File::Basename qw(basename dirname)

という風に書くことが出来、読み込んだモジュールの中で必要とする関数を制限したい時にこういう指定をするということなのですね。

ちょっと1つ賢くなった気がします。
[PR]
by h5y1m141 | 2007-07-15 08:41

ちょっとだけPerlの勉強しました -part3

a0033832_19283859.jpgWEB+DB PRESS Vol.39の連載記事のRecent Perl Worldの記事を読みながらコマンドラインでサーバのCPU、メモリ情報を取得するスクリプトを本のソースを見ながらですが無事にできました。

--csv というオプションを付けて
./server-info-03.pl --csv 192.168.xxx.xxx
とやると
"192.168.231.128"," Genuine Intel(R) CPU T2400 @ 1.83GHz","1","248.6K"
という結果になりオプションをつけずに
./server-info-03.pl 192.168.xxx.xxx
とやると、以下のようにアスキーテーブルで出力されます

.---------------------------------------------------------------------.
| Title | Value |
+------------------+--------------------------------------------------+
| Host | 192.168.231.128 |
| CPU Model | Genuine Intel(R) CPU T2400 @ 1.83GHz |
| Number of CPU | 1 |
| Amout of Memmory | 248.6K |
'------------------+--------------------------------------------------'

で、ここまでは、連載記事でいうと、前置きというか、あまり良いコードとはいえないそうで、
一見して汚いだけでなく拡張性が乏しいのも問題です。
ということで、リファクタリングしていくことになるのですが、ちょっと意外だったのが
ところで今回わざとスクリプトを汚く書いているようにも見えますが、筆者は普段もこういう手順で書くことが多いです。まずはやりたいことを決めて、そのやりたいことが本当に実現できるか、ベタなスクリプトを書いてとりあえず試します。
と書かれていて、結構最初からある程度綺麗なコードを書かれているのかと思ったので、なんかうまく言えないけど励みになったのと、著者の方が汚いと言われているコードから綺麗なコードにちょっとづつ変えていくのを実際に読んでいくことで、オブジェクト指向っぽく書かれているPerlのソースをいきなり読むよりも最初汚く書かれているベタなやつから読み進めることで、個人的にはとっても理解しやすいなぁー


今日の勉強はとりあえずここまで。

余談
スクリプトと関係ないのですが、OS Xから、SSHするターミナルとして、iTermを使っているのですが、SSHした後に各種コマンドを実行した際にエラーメッセージが文字化けしていたのですが、ヘルプを読んで以下の手順で設定変更したらOKだった。
1.Infoアイコンをクリック
2.encodingの設定がDefaultが、Western(ASCII)になっているので、 Japanese(EUC)に変更
[PR]
by h5y1m141 | 2007-07-08 19:32

ちょっとだけPerlの勉強しました -part2

※ここん所、Perlの勉強が意外に続いているので、ちょっとタイトル変更しました
先日書いたちょっとだけPerlの勉強しましたというエントリで
sshできる環境はVMWare上のLinuxがあるので、OKなんだけど、公開鍵でログインできるようにしていないから、本の通りコーディングして実行しても

Permission denied (publickey,password).

という結果になるので、Net::SSHの処理の所を工夫するか、公開鍵でログインできるような設定に変更しないとダメだね....

と書きましたが、この続きをしようと思って、カフェで勉強していたのですが、インターネットに接続できない状況なのでこの部分どうにか調べようと思って、こういう時には、Net::SSHのドキュメントを見ればなんとかわかるかなぁーと思い、/Library/Perl/5.8.6/Net/cat SSH.pmの中身を見たところ、FAQが見つかり
Q: How do you supply a password to connect with ssh within a perl script
using the Net::SSH module?

A: You don't. Use RSA or DSA keys. See the ssh-keygen(1) manpage.

ということで、SSH公開鍵でログインできるようにしておかないとダメなんですね。これは家に帰ってからやらないと。ということで、OS X上のターミナルで
ssh-keygen -t rsa
として、公開鍵と秘密鍵のペアを作って、
scp .ssh/id_rsa.pub xxx.xxx.xxx.xxx:.ssh/authorized_keys
とすることで、見事、VMware上のLinuxにいちいちパスワード入力しなくてもsshできるようになったので、引き続きPerlの勉強していこうかと思います

前のエントリで、

あとコーディングしていて、いっつもPerlのソースでわかんない
my $cpuinfo = shift;
のshiftの部分の所と
と書いたけど、このshift の意味は、この前、続・初めてのPerl 改訂版
を読んでやっとわかった。shift、mapとかって、読んだ限りでは使い方を工夫すればとっても便利そうだけど、やっぱりこういうのは、体系だった本でしっかりと基礎を抑えた方が良いのかなぁと思ったので、amaoznで買うことにしました。
続・初めてのPerl 改訂版
Randal L. Schwartz brian d foy Tom Phoenix 吉川 英興 伊藤 直也 田中 慎司 株式会社ロングテール/長尾 高弘
オライリー・ジャパン (2006/10/21)
売り上げランキング: 13346

[PR]
by h5y1m141 | 2007-07-07 14:14

ちょっとだけPerlの勉強しました

一昨日、会社帰りにWEB+DB PRESS Vol.39を購入したのですが、連載記事のRecent Perl Worldで、綺麗なコード+ノウハウの関係という内容で、シェルスクリプトを最初はとりあえず動かせるレベルのものから徐々にリファクタリングして、綺麗なコードにしていくという内容で、実行するスクリプトも、コマンドラインでサーバ情報を取得するという面白そうな内容だったので、本を読みながら昨日はコーディングの勉強してました。

いくつか、つまづいた所をピックアップすると、Mac 上で開発しているので、Linux上だと
#!/usr/local/bin/perl
となる所は、OS Xだと
hoyamada-mac:~/bin hoyamada$ which perl
/usr/bin/perl
ということなので
#!/usr/bin/perlとしないといけないことに最初気づかなかったのでここを修正。

今回の連載記事で想定している環境は
簡単のために、サーバのOSはLinuxであると限定します。またサーバにはSSH公開鍵でログインできることを前提とします。
ということで、sshできる環境はVMWare上のLinuxがあるので、OKなんだけど、公開鍵でログインできるようにしていないから、本の通りコーディングして実行しても

Permission denied (publickey,password).

という結果になるので、Net::SSHの処理の所を工夫するか、公開鍵でログインできるような設定に変更しないとダメだね....

あとコーディングしていて、いっつもPerlのソースでわかんないのが
my $cpuinfo = shift;
というようなソースの場合のshiftの部分の所と

if ($line = ~ m/^model name\s+:(.*)/)

の$line以降の正規表現の所。
あとは、本筋とは離れるけど、CarbonEmacs上でコーディングしていたんだけど、バージョン管理のためのPCL-CVSというのをたまたま見つけて、試しに使ってみて、変更履歴も以下のように確認できました。

revision 1.6locked by: hoyamada;
date: 2007/06/24 07:52:28; author: hoyamada; state: Exp; lines: +2 -2
xxxxxxx

最近、ブログを書く時に、基本的にはCarbon Emacs上で書いたやつをコピペすることが多いんだけど、意味も無くこのCVSの機能使ってみようかなぁ。本当はSubversion使いこなしたいんだけど、元々こいうバージョンコントロールのツールの使いこなしに慣れていないから、このPCL-CVSから徐々に慣れていくというのもありかなぁと思いつつ、全くまとまりが無い文章になってしまった...
[PR]
by h5y1m141 | 2007-06-25 21:19 | メモ

Yahoo のAPIを使った検索

ウェブ検索Webサービスのサンプルをほぼそのまま流用なんだけど、Yahoo で、派遣 CCNPというキーワードを使ってのソース。

#!/usr/local/bin/perl

#use strict;
use LWP::Simple;
use XML::Simple;


# Set your unique Yahoo! Application ID
my $appID = "xxxxxxxxxx";
my $query = "派遣 CCNP";

# Construct a Yahoo! JAPAN Web Search
my $base_url = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch";
my $type = "all"; #alternates: any, phrase.
my $results = 100;
my $language = "ja";
my $results_sort = "rank"; #alternate: date.
my $req_url = "$base_url?appid=$appID&query=$query&results=$results";

$req_url .= "&language=$language&sort=$results_sort";

# Make the request
my $yahoo_response = get($req_url);

# Parse the XML
my $xmlsimple = XML::Simple->new();
my $yahoo_xml = $xmlsimple->XMLin($yahoo_response, ForceArray=>['Result']);

# Set some variables
my $out;
my $result_count = 0;

# Add the column header
my $totalresult = $yahoo_xml->{totalResultsAvailable};

# Loop through the items returned
foreach my $result (@{$yahoo_xml->{Result}}) {

$result_count++;
my $y_url = $result->{Url};
my $y_click_url = $result->{ClickUrl};
my $y_modificationdate = $result->{ModificationDate};
(my $sec,my $min,my $hour,my $mday,my $mon,my $year) = localtime($y_modificationdate);
$year += 1900; $mon++;
my $y_mimetype = $result->{MimeType};
my $y_cache = $result->{Cache}{Url};
my $y_cachesize = $result->{Cache}{Size};
if ($y_url eq "xxxxxxx") {
$out .= "○.$result_count.$y_url\n";
} else {
$out .= "$result_count.$y_url\n";
}
}

print $out;
[PR]
by h5y1m141 | 2006-06-21 16:49

ちょっと勉強

MacでPerlの勉強しはじめているんだけど、さしあたって会社にあったSpidering hacksのLWP::Simpleを用いた簡単なデータ取得っていうやつを書いていたんだけど、本に書いてある通りにやってもうまくいかなかったんだけど、どうもPerlがLWP::Simpleのディレクトリを検索してくれなくてえらーになっていたみたい

なので、

BEGIN {
unshift @INC,'/Users/xxxxxx/.cpan/build/libwww-perl-5.805';
}

という一文を追加したらできた!

!/usr/bin/perl -w
use strict;
BEGIN {
unshift @INC,'/Users/xxxxxx/.cpan/build/libwww-perl-5.805';
}
use LWP::Simple;
use Encode;
use encoding 'shiftjis';
binmode(STDERR, ':raw:encoding(shiftjis)');
my $url = 'http://www.yahoo.co.jp';

my $content = get($url);
$content = decode('shiftjis',$content);
print $content;
[PR]
by h5y1m141 | 2006-06-18 21:38