Perlの聖書(ラクダ本)が届いた!
ついに、ペーパーバックの英語の中古本だけど、
2,050円(送料込み)で買った『Programming Perl』が届いたー!!
よくよく見ると、2000年出版の3rd Edition でPerl 5.6までしかカバーしてなかったりするw
Unicode の節が、「将来実装予定だぜ」的なこと書いてあるし。
欲を言えば、どのレンタルサーバでも標準になってて
Unicode正式対応して、Encode.pmが標準ライブラリ入りしたPerl5.8を
カバーしたやつがよかったけど、そんなバージョンの「The Camel」はそもそも無いようだ(爆)
本屋でフツーに買ったら2冊で9,000円くらいだから、
安いお買い物。
めっちゃテンション上がるわー!!!
Perl=>WWW::Mechanizeでの日本語の扱いでつまづき、解決した件。
WWW::Mechanizeを使いこなしたい
オライリーの『SPIDERING HACKS』を買ってからというもの、「MADにWEBの情報を集めて整理してエグイ感じで発信してやるぜ、グヘヘ」と思っていたが、いまいち進んでいない。
一番の原因は、日本語マルチバイトの壁。
使っていても「Wide Characterうんたら」というエラーが出たり、文字コードの扱いがうまくいっていなくて欲しい結果が得られない。
Perlモチベーションが高まってしまった今日、久しぶりにMechを使ってみた。
やろうとしたことは、非常にシンプル。
(1)ターゲットURLにアクセス
(2)URL内のリンクを辿ってページ遷移
(3)ページ遷移先のコンテンツを表示する
ポータルみたいなのを作るベースとしての動作確認のつもりで行った作業。
#!/usr/bin/perl # # Mechでスクレイピング♪(use encoding使用。こいつは非推奨なやり方だよ。良い子は真似しちゃダメ。) use strict; use warnings; use utf8; use WWW::Mechanize; use encoding 'cp932'; binmode(STDERR, ':raw :encoding(cp932)'); # ターゲットURLをセットする my $url = 'http://www.akb48.co.jp/'; my $agent = WWW::Mechanize->new(); # ホームページを取得する $agent->get($url); # スケジュールページを取得する $agent->follow_link(text => 'スケジュール'); print $agent->{content}, "\n";
とりあえず動けばいいぢゃんという感じで上のスクリプトを作ってみた。
でも、encodingプラグマを使って文字コードのエンコードとかデコードを理解せずに
うやむやでやってる感が否めない。
dankogaiが非推奨してたのも気になるし->『perl - use encoding; #は黒歴史』
そこで encodingプラグマ無しにして探求してみた。
Encode使って何とかなるはずだ。
・・・で、なんとかなった。
#!/usr/bin/perl # # Mechでスクレイピング♪(utf8プラグマなし。ファイル保存形式はUTF8-N) use strict; use warnings; use WWW::Mechanize; #use encoding 'cp932'; #binmode(STDERR, ':raw :encoding(cp932)'); use Encode; # ターゲットURLをセットする my $url = 'http://www.akb48.co.jp/'; my $agent = WWW::Mechanize->new(); # ホームページを取得する $agent->get($url); # スケジュールページを取得する=>Mechに送る前にデコード $agent->follow_link(text => decode('utf8', 'スケジュール')); # 標準出力先であるWinXPコマンドプロンプトの文字コードにエンコード print encode('cp932', $agent->{content}, "\n");
んでもって、utf8プラグマを使って「スケジュール」のdecode を無くすのが一番よさげ。
#!/usr/bin/perl # # Mechでスクレイピング♪(utf8プラグマあり。ファイル保存形式はUTF8-N) use strict; use warnings; use utf8; use WWW::Mechanize; #use encoding 'cp932'; #binmode(STDERR, ':raw :encoding(cp932)'); use Encode; # ターゲットURLをセットする my $url = 'http://www.akb48.co.jp/'; my $agent = WWW::Mechanize->new(); # ホームページを取得する $agent->get($url); # スケジュールページを取得する $agent->follow_link(text => 'スケジュール'); # 標準出力先であるWinXPコマンドプロンプトの文字コードにエンコード print encode('cp932', $agent->{content}, "\n");
半年ぐらい前から悩んでいたところが、だいぶスッキリしたー。
これで、スクレーピングし放題だなw
CentOS 5.5のPHPをバージョン5.3.5 にアップグレードしてみた件。
CentOS 5.5のPHPをバージョン5.3.5 にアップグレードしてみたお。
探せばいるもので、CentOS 5.5のPHPをバージョン5.3.5 にアップグレードしてみました。
基本的には(というか1から10まで)Natzさんのブログの手順通りにやりました。
Natzさん、スペシャルサンクス!!
入力コマンド(1)
# rpm -qa | grep php | sort
出力結果(1)
php-5.2.16-jason.1 php-cli-5.2.16-jason.1 php-common-5.2.16-jason.1 php-ldap-5.2.16-jason.1
入力コマンド(2)
# rpm -qa | grep mysql | sort
出力結果(2)
mysql-5.0.77-4.el5_5.4
入力コマンド(3)
# rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
出力結果(3)
http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm を取得中 警告: /var/tmp/rpm-xfer.NA0dVL: ヘッダ V3 DSA signature: NOKEY, key ID 217521f6 準備中... ########################################### [100%] 1:epel-release ########################################### [100%]
入力コマンド(4)
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
出力結果(4)
http://rpms.famillecollet.com/enterprise/remi-release-5.rpm を取得中 警告: /var/tmp/rpm-xfer.Hi6rXD: ヘッダ V4 DSA signature: NOKEY, key ID 00f97f56 準備中... ########################################### [100%] 1:remi-release ########################################### [100%]
入力コマンド(5)
# yum info php --enablerepo=remi
出力結果(5)
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: rsync.atworks.co.jp * base: rsync.atworks.co.jp * epel: ftp.riken.jp * extras: rsync.atworks.co.jp * remi: iut-info.univ-reims.fr * updates: rsync.atworks.co.jp epel | 3.7 kB 00:00 epel/primary_db | 3.0 MB 00:01 remi | 2.6 kB 00:00 remi/primary_db | 253 kB 00:02 Installed Packages Name : php Arch : i386 Version : 5.2.16 Release : jason.1 Size : 9.4 M Repo : installed Summary : PHP HTML 埋め込みのスクリプト言語 (PHP: Hypertext Preprocessor) URL : http://www.php.net/ License : PHP Description: PHP is an HTML-embedded scripting language. PHP attempts to make it : easy for developers to write dynamically generated webpages. PHP : also offers built-in database integration for several commercial : and non-commercial database management systems, so writing a : database-enabled webpage with PHP is fairly simple. The most common : use of PHP coding is probably as a replacement for CGI scripts. : : The php package contains the module which adds support for the PHP : language to Apache HTTP Server. Available Packages Name : php Arch : i386 Version : 5.3.5 Release : 1.el5.remi.1 Size : 1.3 M Repo : remi Summary : PHP scripting language for creating dynamic web sites URL : http://www.php.net/ License : PHP Description: PHP is an HTML-embedded scripting language. PHP attempts to make it : easy for developers to write dynamically generated web pages. PHP : also offers built-in database integration for several commercial : and non-commercial database management systems, so writing a : database-enabled webpage with PHP is fairly simple. The most common : use of PHP coding is probably as a replacement for CGI scripts. : : The php package contains the module which adds support for the PHP : language to Apache HTTP Server.
入力コマンド(6)
# yum remove php php-* mysql
出力結果(6)
Loaded plugins: fastestmirror Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package mysql.i386 0:5.0.77-4.el5_5.4 set to be erased --> Processing Dependency: libmysqlclient.so.15 for package: dovecot --> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package: dovecot ---> Package php.i386 0:5.2.16-jason.1 set to be erased ---> Package php-cli.i386 0:5.2.16-jason.1 set to be erased ---> Package php-common.i386 0:5.2.16-jason.1 set to be erased ---> Package php-ldap.i386 0:5.2.16-jason.1 set to be erased --> Running transaction check ---> Package dovecot.i386 0:1.0.7-7.el5 set to be erased --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Removing: mysql i386 5.0.77-4.el5_5.4 installed 7.9 M php i386 5.2.16-jason.1 installed 9.4 M php-cli i386 5.2.16-jason.1 installed 6.7 M php-common i386 5.2.16-jason.1 installed 1.5 M php-ldap i386 5.2.16-jason.1 installed 105 k Removing for dependencies: dovecot i386 1.0.7-7.el5 installed 3.6 M Transaction Summary ================================================================================ Remove 6 Package(s) Reinstall 0 Package(s) Downgrade 0 Package(s) Is this ok [y/N]:
入力コマンド(7)
Is this ok [y/N]: y
出力結果(7)
Downloading Packages: Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Erasing : dovecot 1/6 警告: /etc/dovecot.conf は /etc/dovecot.conf.rpmsave として保存されました。 Erasing : php 2/6 Erasing : php-ldap 3/6 Erasing : php-common 4/6 Erasing : mysql 5/6 Erasing : php-cli 6/6 Removed: mysql.i386 0:5.0.77-4.el5_5.4 php.i386 0:5.2.16-jason.1 php-cli.i386 0:5.2.16-jason.1 php-common.i386 0:5.2.16-jason.1 php-ldap.i386 0:5.2.16-jason.1 Dependency Removed: dovecot.i386 0:1.0.7-7.el5 Complete!
入力コマンド(8)
# yum install php php-ldap php-cli php-common dovecot mysql --enablerepo=remi
出力結果(8)
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: rsync.atworks.co.jp * base: rsync.atworks.co.jp * epel: ftp.riken.jp * extras: rsync.atworks.co.jp * remi: rpms.famillecollet.com * updates: rsync.atworks.co.jp Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package dovecot.i386 0:1.0.7-7.el5 set to be updated --> Processing Dependency: libmysqlclient.so.15 for package: dovecot --> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package: dovecot ---> Package mysql.i386 0:5.1.55-1.el5.remi set to be updated --> Processing Dependency: mysql-libs = 5.1.55-1.el5.remi for package: mysql --> Processing Dependency: libmysqlclient.so.16(libmysqlclient_16) for package: mysql --> Processing Dependency: libmysqlclient_r.so.16(libmysqlclient_16) for package: mysql --> Processing Dependency: libmysqlclient_r.so.16 for package: mysql --> Processing Dependency: libmysqlclient.so.16 for package: mysql ---> Package php.i386 0:5.3.5-1.el5.remi.1 set to be updated ---> Package php-cli.i386 0:5.3.5-1.el5.remi.1 set to be updated --> Processing Dependency: libedit.so.0 for package: php-cli ---> Package php-common.i386 0:5.3.5-1.el5.remi.1 set to be updated ---> Package php-ldap.i386 0:5.3.5-1.el5.remi.1 set to be updated --> Running transaction check ---> Package libedit.i386 0:2.11-2.20080712cvs.el5 set to be updated ---> Package mysql-libs.i386 0:5.1.55-1.el5.remi set to be updated ---> Package mysqlclient15.i386 0:5.0.67-1.el5.remi set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: dovecot i386 1.0.7-7.el5 base 1.6 M mysql i386 5.1.55-1.el5.remi remi 1.1 M php i386 5.3.5-1.el5.remi.1 remi 1.3 M php-cli i386 5.3.5-1.el5.remi.1 remi 2.6 M php-common i386 5.3.5-1.el5.remi.1 remi 966 k php-ldap i386 5.3.5-1.el5.remi.1 remi 52 k Installing for dependencies: libedit i386 2.11-2.20080712cvs.el5 epel 79 k mysql-libs i386 5.1.55-1.el5.remi remi 1.7 M mysqlclient15 i386 5.0.67-1.el5.remi remi 1.3 M Transaction Summary ================================================================================ Install 9 Package(s) Upgrade 0 Package(s) Total download size: 11 M Is this ok [y/N]: y Downloading Packages: (1/9): php-ldap-5.3.5-1.el5.remi.1.i386.rpm | 52 kB 00:01 (2/9): libedit-2.11-2.20080712cvs.el5.i386.rpm | 79 kB 00:00 (3/9): php-common-5.3.5-1.el5.remi.1.i386.rpm | 966 kB 00:02 (4/9): mysql-5.1.55-1.el5.remi.i386.rpm | 1.1 MB 00:03 (5/9): mysqlclient15-5.0.67-1.el5.remi.i386.rpm | 1.3 MB 00:04 (6/9): php-5.3.5-1.el5.remi.1.i386.rpm | 1.3 MB 00:04 (7/9): dovecot-1.0.7-7.el5.i386.rpm | 1.6 MB 00:00 (8/9): mysql-libs-5.1.55-1.el5.remi.i386.rpm | 1.7 MB 00:04 (9/9): php-cli-5.3.5-1.el5.remi.1.i386.rpm | 2.6 MB 00:04 -------------------------------------------------------------------------------- Total 351 kB/s | 11 MB 00:31 警告: rpmts_HdrFromFdno: ヘッダ V4 DSA signature: NOKEY, key ID 00f97f56 remi/gpgkey | 1.3 kB 00:00 Importing GPG key 0x00F97F56 "Remi Collet <RPMS@FamilleCollet.com>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-remi Is this ok [y/N]: y warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 217521f6 epel/gpgkey | 1.7 kB 00:00 Importing GPG key 0x217521F6 "Fedora EPEL <epel@fedoraproject.org>" from /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction WARNING : This php-* RPM are not official Fedora/Redhat build and overrides the official ones. Don't file bugs on Fedora Project nor Redhat. Use dedicated forums http://forums.famillecollet.com/ Installing : php-common 1/9 WARNING : This MySQL RPM is not an official Fedora/Redhat build and it overrides the official one. Don't file bugs on Fedora Project nor Redhat. Use dedicated forums http://forums.famillecollet.com/ Installing : mysql-libs 2/9 Installing : libedit 3/9 Installing : php-cli 4/9 Installing : mysqlclient15 5/9 Installing : dovecot 6/9 Installing : mysql 7/9 Installing : php 8/9 Installing : php-ldap 9/9 Installed: dovecot.i386 0:1.0.7-7.el5 mysql.i386 0:5.1.55-1.el5.remi php.i386 0:5.3.5-1.el5.remi.1 php-cli.i386 0:5.3.5-1.el5.remi.1 php-common.i386 0:5.3.5-1.el5.remi.1 php-ldap.i386 0:5.3.5-1.el5.remi.1 Dependency Installed: libedit.i386 0:2.11-2.20080712cvs.el5 mysql-libs.i386 0:5.1.55-1.el5.remi mysqlclient15.i386 0:5.0.67-1.el5.remi Complete!
入力コマンド(9)
# php -v
出力結果(9)
PHP 5.3.5 (cli) (built: Jan 22 2011 10:11:01) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
よっしゃー!!PHP5.3.5 ゲッツ!!
CentOS5.5 の標準PHPバージョンが5.1.6なので、yum でPHP5.2.16にアップグレードしてみた。
CentOS5.5 の標準PHPバージョンが5.1.6なので、yum でアップグレードしてみたときのメモ。
入力コマンド(1)
# yum update
出力結果(1)
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: rsync.atworks.co.jp * base: rsync.atworks.co.jp * extras: rsync.atworks.co.jp * updates: rsync.atworks.co.jp Setting up Update Process No Packages marked for Update
入力コマンド(2)
# rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
出力結果(2)
#
入力コマンド(3)
# vi /etc/yum.repos.d/utterramblings.repo
vi で utterramblings.repo に追加した内容(3)
[utterramblings] name=Jason’s Utter Ramblings Repo baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/ enabled=0 gpgcheck=1 gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
入力コマンド(4)
# yum --enablerepo=utterramblings update php
出力結果(4)
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: rsync.atworks.co.jp * base: rsync.atworks.co.jp * extras: rsync.atworks.co.jp * updates: rsync.atworks.co.jp utterramblings | 951 B 00:00 utterramblings/primary | 39 kB 00:00 utterramblings 140/140 Setting up Update Process Resolving Dependencies --> Running transaction check ---> Package php.i386 0:5.2.16-jason.1 set to be updated --> Processing Dependency: php-common = 5.2.16-jason.1 for package: php --> Processing Dependency: php-cli = 5.2.16-jason.1 for package: php --> Running transaction check ---> Package php-cli.i386 0:5.2.16-jason.1 set to be updated --> Processing Dependency: php-common = 5.1.6-27.el5_5.3 for package: php-ldap ---> Package php-common.i386 0:5.2.16-jason.1 set to be updated --> Running transaction check ---> Package php-ldap.i386 0:5.2.16-jason.1 set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Updating: php i386 5.2.16-jason.1 utterramblings 3.6 M Updating for dependencies: php-cli i386 5.2.16-jason.1 utterramblings 2.6 M php-common i386 5.2.16-jason.1 utterramblings 513 k php-ldap i386 5.2.16-jason.1 utterramblings 59 k Transaction Summary ================================================================================ Install 0 Package(s) Upgrade 4 Package(s) Total download size: 6.8 M
入力コマンド(5)
Is this ok [y/N]: y
出力結果(5)
Downloading Packages: (1/4): php-ldap-5.2.16-jason.1.i386.rpm | 59 kB 00:00 (2/4): php-common-5.2.16-jason.1.i386.rpm | 513 kB 00:00 (3/4): php-cli-5.2.16-jason.1.i386.rpm | 2.6 MB 00:02 (4/4): php-5.2.16-jason.1.i386.rpm | 3.6 MB 00:03 -------------------------------------------------------------------------------- Total 652 kB/s | 6.8 MB 00:10 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Updating : php-common 1/8 Updating : php-cli 2/8 Updating : php 3/8 Updating : php-ldap 4/8 Cleanup : php 5/8 Cleanup : php-ldap 6/8 Cleanup : php-common 7/8 Cleanup : php-cli 8/8 Updated: php.i386 0:5.2.16-jason.1 Dependency Updated: php-cli.i386 0:5.2.16-jason.1 php-common.i386 0:5.2.16-jason.1 php-ldap.i386 0:5.2.16-jason.1 Complete!
入力コマンド(6)
# php -v
出力結果(6)
PHP 5.2.16 (cli) (built: Dec 17 2010 14:09:03) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies [root@localhost rpm-gpg]#
よーし!無事にPHPアップグレード完了!!
っと思ったけど、symfony1.4 を触るためのPHPアップグレードで
symfony1.4の取説に
「少なくとも PHP 5.2.4 がインストールされていることを確認してください。」
の文字が無情に踊ってる。
あー、微妙に足りないぢゃん。
PHPバージョン0.0.24 足りないので、もちょっとガンバル!!
Perlでテキストファイルの半角スペースを取り除く
#!/usr/bin/perl use strict; use warnings; use utf8; # フィルハンドルを開いてコンテンツを読み込む open my $contents, '<', 'digital_dic2.txt'; # 半角スペースを取り除き半角スペースタグ除去後のコンテンツを表示する # 改行は残したいのでケツに\nを付ける while(<$contents>){ $_=~ s/\s//g; print $_ . "\n"; } # フィルハンドルを閉じる close my $contents;
少しずつWindowsからLinuxに移行していきつつ、
EmacsとLispを使って効率的なことを進める1年にしたいなー。
とミサカはミサカは切実に思うのです。
【Perl正規表現】たった1行でHTMLタグを取り除く
HTMLを加工して、テキストごにょごにょする作業に出会いました。
こんなときこそPerlでしょ。
「LWPでHTMLを引っこ抜いて、HTMLパーサーとか使おうかなー」
なんて、ぼんやり考えながらネットサーフィンしてたら、午前3時30分。
もうすぐ夜が明ける。ぐだぐだスクリプト書いてる時間ねぇなぁ。
と怠惰な自分を恨みつつ、ググると見つけた。
HTMLタグを取り除く - にししの Perl/CGI Tips ふぁくとりー
にしし、ありがとう。
で、早速活用。
AKB48の公式サイトでテスト。
#!/usr/bin/perl use strict; use warnings; use utf8; use Encode; use LWP::Simple; # ターゲットURLを指定する my $url = "http://akb48.co.jp/"; # コンテンツをGETリクエスト my $contents = get( $url ); # 取得したコンテンツを確認する(デバッグ用) # print encode( 'shiftjis', $contents ); # HTMLタグを取り除く $contents =~ s/<.*?>//g; # HTMLタグ除去後のコンテンツを表示する print encode( 'shiftjis', $contents );
取得した結果は以下の通り
続きを読むEC-CUBE 2.4.4 商品ごとの送料設定をカスタマイズ
俺のPerl力があれば、PHPとかSmartyなEC-CUBEとか楽勝でしょ?という勘違い
今でこそCで書かれてたりしますが、PHPは元々Perlベースで作られてたんだから、なんとかなるんじゃね?
なーんて甘い考えで始めたEC-CUBE構築。
いやぁ、何度も洗礼を受けましたよ。
管理画面からの入力項目を増やしたり、
表示する項目を増やしたりというのは割とペペッとできたんですが、
カートの処理部分で大きくつまづきましたねー。
チェンジセット17970,17971,18114 あたりを参考に
グチャグチャといじってたんですが、
埒があかず。
やりたい処理は、商品ごとに送料を設定できるようにして、
カートの決済時に合計するだけ。
決して複雑な処理ではないので、
気を取り直してソースを追いかけることに。
ちなみに、商品ごとの送料設定はDBテーブルカラムあるくせに
<!--{* 送料の個別指定は次期開発で追加予定
とかってコメントアウトされてたりする。
EC-CUBEのいけず!
EC-CUBEのソース追っかけるときに見つけたクロスリファレンス
めちゃくちゃ見やすい。
そうそう、直接の解決のきっかけになったのは
シンプルなカスタマイズなのに要件を満たしているあたりが素敵です。
ほんとにありがとうございましたー。
ちなみに僕は、
管理画面の[システム設定]-[パラメータ設定]で
「OPTION_PRODUCT_DELIV_FEE」を'1'にするのを忘れていてしばらくハマりました。