2008年8月28日木曜日

 

【XPath】特定要素取得

特定のclass属性を持った任意の要素にマッチするXPath - 3.14
$path->xpath('//*[contains(concat(" ",@class," "), "hoge ")]');
//class属性「hoge」を持つ要素全て(「hoge」以外の複数のclass属性を持つものも含む)
$path->xpath('//*[@class="hoge "]');
//class属性「hoge」を持つ要素全て(「hoge」のclass属性のみ)
$href = $path->xpath('//a[@rel="next"]/@href');
//rel属性「next」を持つa要素からhref属性を取得

ラベル:


2008年8月22日金曜日

 

【PHP】スクレイピングあれこれ(メモ)

PHPでのスクレイピングに役立つライブラリ - (DxD)
ライブラリ、関数とか。
* tidyでHTMLのパースを実現したい - PHPプロ!
Tidy関数。
PHP汎用スクレイピングライブラリを作ってみた - Liner Note
PEAR::HTTP_Client。
PHPでTwitterのBotを作ってみる - uyarinの日記
PEAR::HTTP_Client。
PHP+SimpleXMLElementでTwitterのスクレイピング - GRANADA Hatena @ sotarok
SimpleXMLElement関数。
DOM::loadHTML - 「PHPで街を育てる」の続きの続きの続き - Do You PHP はてな
DOM::loadHTML。
XREAでPHP-Tidyを使うメモComments - ぬっ記
うまくいかなくて泣きたい。
phpによるスクレイピング処理入門
Tidy関数。
Snoopy でHTMLを取得する - bnote
Snoopyライブラリ。Webページの取得(全文・リンクのみ)やアクセスしたページ内のフォームにクエリを送って結果を得られる。便利。
SnoopyとHTTP_Request - ITT-WEB
SnoopyとHTTP_Requestの比較。
[9181] Snoopy(Webブラウザシミュレータ用PHPライブラリ。) - GAC なぜなにGAC->PHP
Snoopyメソッド一部。

参考書

Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Spidering hacks―ウェブ情報ラクラク取得テクニック101選

ラベル:


2008年8月20日水曜日

 

【PHP】クローラのためのライブラリ(追記:2008/08/21)【Perl】

PHP - cURL

cURL 関数 - PHPマニュアル
例1 PHP の cURL モジュールを使用して example.com のホームページを取得する

<?php
  $ch = curl_init("http://www.example.com/");
  $fp = fopen("example_homepage.txt", "w");
  curl_setopt($ch, CURLOPT_FILE, $fp);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_exec($ch);
  curl_close($ch);
  fclose($fp);
?>
[PHP-users 28997] Re:curl関数によるデータ収集について - MLog:

while(条件) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $global_values["user_agent"]);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
}
上記のコードであれば良いが以下は駄目。アクセスのオープン・クローズのタイミング。

$ch = curl_init();
while(条件) {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $global_values["user_agent"]);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
}
curl_close($ch);
このような構造になっていると、curl_exec()を実行するたびに少しずつ解放 されないメモリが蓄積されていき、いずれ動かなくなります。
cURL関数で3つのハードルを乗り越えて投稿するCommentsAdd Star - SLYWALKER
クローラからアクセスしてベーシック認証にログイン(クッキー・セッション)、サイトに投稿する。
追記:2008/08/21
php curlをつかったオリジナルクラス (myCurlRequest) - hiyuzawa.jpn.org
APIの複数リクエスト。
php curlを使って2ちゃんねると高速通信 - へぼいいいわけ
datファイルを差分取得。

Perl - CPAN::Gungho

Gungho - search.cpan.org
Perlメモ/Gungho/簡単なRSSクローラ - Walrus, Digit.
Gunghoモジュールの解説と例。
なんちゃってクローラーでURL漁りComments - pomo123の日記
サムネイルを作成するWebページのURLを自動的に漁ってくる

ラベル: ,


 

【Perl】Catalyst入門のためのメモ【CPAN】

Catalyst::Manual::Intro - はじめてのCatalyst
マニュアル。インストール方法やMVCモデルの解説など。
use Catalyst qw(初挑戦); - Elementary, ...
解説。構造、関数など。
Catalyst入門してみたよComments - Perl-Life
上リンクを参考にしたエントリ。

開発サンプル

Perl の MVC フレームワーク Catalyst に入門してみた - NDO::Weblog
TinyURL.comのようなURL短縮プログラム。
Catalystの基礎 アプリケーション編
Bookmarkアプリケーション。
第4回 Catalyst(前編)---Perl向けWebアプリ・フレームワーク - ITpro
メモ・アプリ。

XREAレンタルサーバでCPANモジュールをインストールする

xreaでcpanモジュールをユーザディレクトリにインストールする方法 - WebCrawl
XREAサーバにインストールされているモジュールを確認。

/usr/bin/find `/usr/local/bin/perl -e 'print join(" ", @INC)'` -type f -name "*.pm"
なければCPANからダウンロード、任意ディレクトリで解凍。
以下のコマンドでインストール。
ここではインストール先のディレクトリを「~/perl」とする。

perl Makefile.pl INSTALL_BASE=~/perl
make
make install
インストールしたディレクトリをPerlプログラムで指定する。
以下は例。

use lib 'perl/lib/perl5/i686-linux/';

参考書

Catalyst: Accelerating Perl Web Application Development
Catalyst: Accelerating Perl Web Application Development

The Definitive Guide to Catalyst: Writing Extensible, Scalable and Maintainable Perl–Based Web Applications
The Definitive Guide to Catalyst: Writing Extensible, Scalable and Maintainable Perl–Based Web Applications

"Catalyst本"を一通り読了してみた - RemovableType

ラベル:


2008年8月13日水曜日

 

【symfony】セッションの利用~アクション~

ユーザーのセッションを管理する方法 -
//セッションの登録
$this->getUser()->setAttribute('session', 'foo');
  $session = 'foo';
  session_register('session')
  又は
  $_SESSION['session'] = 'foo';
//セッションの値を取得
$this->getUser()->getAttribute('session');
//セッションの確認
$hasNickname = $this->getUser()->hasAttribute('session');
  session_is_registered  ('session')
//セッションを破棄
$this->getUser()->getAttributeHolder()->remove('session');
  session_unregister('session')

セッション処理 - PHP マニュアル

ラベル:


 

【symfony】プロジェクトの作成・アプリケーションの作成・モジュールの作成

symfonyコマンドのメモ。
symfony(+XAMPP)でhello world - 634 Incubator

symfonyプロジェクトディレクトリ作成


symfony init-project [プロジェクト名]

アプリケーション作成


symfony init-app [アプリケーション名]

モジュール作成


symfony init-module [アプリケーション名] [モジュール名]
作成したモジュールは以下のURLでアクセス。
http://[サイト]/[プロジェクト名]/web/[モジュール名]
プロジェクト・ディレクトリ「symfony」にアプリケーション「myapp」、モジュール「module」で作成したら
http://www.example.com/symfony/web/module/
となる。

ラベル:


2008年8月12日火曜日

 

【symfony】エラー対処

symfonyでどうしてもエラーが解決しない場合、クリアキャッシュをしてみると良い。

$ symfony cc

symfonyにはキャッシュ機能があるので、変更があってもすぐには反映されない。
テンプレートやアクションの編集、データベース・モデルの再構築などあった場合は上記のコマンドを実行してキャッシュをクリアすることをオススメする。
自分も原因不明なエラーが発生し、検索していたら全く別のエラーにはまった人の解決策として見つけて試したら解決した。

ラベル:


 

【Symfony】モデルからDBを操作

symfony/MVC/モデル実践(CRUD) - 634 Incubator
symfony - データベースを扱うには? - てくめも@coop

次の様なテーブルがDBにあるとする。

DBモデル - テーブル名:user
user_idnameagecreated_atupdated_at
1Suzuki242008-08-12 12:30:372008-08-12 12:30:37
2Tanaka262008-08-12 12:30:372008-08-12 12:30:37
3Chiba282008-08-12 12:30:372008-08-12 12:30:37

検索・データの取得(Read)

// プライマリ・キーが1のデータを取得

$user = UserPeer::retrieveByPK(1);
echo $user->getUser_id();
echo $user->getName();
echo $user->getAge();

//出力

1
Suzuki
24

[TableName]Peer::retrieveByPK()を使って取得。各カラムの値はget[CulmName]()メソッドを使って取得する。
UserPeer::retrieveByPK(1,3);とすると2つのフィールドが返される。

条件を指定したデータの検索はCriteria()クラスを使う。詳しくは以下。
条件(検索条件やソート順等)を指定した読み取り(Criteriaクラスの利用)

//カラム"age"が"26"のデータ検索

$criteria = new Criteria();
$criteria->add(UserPeer::AGE, 26);
$user = UserPeer::doSelect($criteria);

挿入・データの追加(Create)


$user = new User();
$user->setName("Yamada");
$user->setAge(26);
$user->save();

set[CulmName]()メソッドを使って挿入。created_atupdated_atというカラム名を付けるとSymfonyが自動でデータ作成日時とデータ更新日時を入れてくれる。

更新・データの編集(Update)


// プライマリ・キーが1のデータを取得
$user = UserPeer::retrieveByPK(1);
// 年齢を更新
$user->setAge($user->getAge() + 1);
// 変更をテーブルに反映
$user->save();

データの追加同様にset[CulmName]()メソッドを使って編集。UserPeer::retrieveByPK()で事前にデータを取得しているかどうか。

削除(Delete)

//プライマリ・キー(user_id)で削除

UserPeer::doDelete(1);

doDelete()で削除。

//条件で検索したデータを削除

$user = UserPeer::retrieveByPK(1);
UserPeer::doDelete($user);

または次の様な感じだろうか。

//カラム"age"が"26"のデータを削除

$criteria = new Criteria();
$criteria->add(UserPeer::AGE, 26);
$user = UserPeer::doSelect($criteria);
UserPeer::doDelete($user);

ラベル:


2008年8月8日金曜日

 

【Symfony】MySQLの利用

MySQL用の設定方法 - symfonyの奏でかた

プロジェクト作成後に出来る「symfonyディレクトリ/config/」内の「databases.yml」と「propel.ini」にMySQLの設定を記述。

「databases.yml」デフォルト

#all:
#  propel:
#    class:          sfPropelDatabase
#    param:
#      dsn:          mysql://root:@localhost/dbname

「databases.yml」変更後

all:  propel:
  class: sfPropelDatabase
  param:  encoding: utf8 # 文字コード
    phptype: mysql # 使用するデータベースシステム
    host: localhost # ホスト名
    database: sample # データベース名
    username: root # 接続ユーザー名
    password: root # 接続パスワード

「propel.ini」デフォルト
~(略)~
propel.database            = mysql
propel.database.createUrl  = mysql://localhost/
propel.database.url        = mysql://localhost/symfonyプロジェクト
~(略)~
「propel.ini」変更後
~(略)~
propel.database = mysql
propel.database.createUrl = mysql://root:root@localhost/
propel.database.url = mysql://root:root@localhost/sample
propel.mysql.tableType = InnoDB
~(略)~

ラベル:


2008年8月7日木曜日

 

【Perl】すぐわかるオブジェクト指向Perl~その0

$this->get if $you->learn(slow) - 書評 - すぐわかるオブジェクト指向Perl - 404 Blog Not Found
"id:dankogaiにそそのかされて"始めるその前に。

~(略)~
本書を使い終わった後で、コーディングスタイルにおいてuse strict;の直後にuse warnings;を書き加えて下さい。
本書の例


#!/bin/perl -w
use strict;

現在の業界標準


#!/usr/bin/perl  use strict;
use warnings;

という感じです。
理由は、

perl - use warnings; # -w でなくて

をご覧下さい。

なので、リンクを辿って辿って…以下から抜粋・まとめ。

404 Blog Not Found
perl - use warnings; # -w でなくて
perl - use strict; # and be happy
iandeth.
Perl/CGI辞典 - 土井 毅さん 著 - にて use strict が推奨されていない件について

理由は以下2つ。

-wは.plには有効でも.pmには有効ではない
-wスイッチを付けてプログラムを実行するとエラーを表示してくれる。
これだけだとpmファイルのエラーを表示してくれない。実行ファイルplファイルのみ有効。
use warnings;でpmファイルも対応。
no warnings 'whatever';できない
部分的にエラーを止めるno warnings;というのがあるから。
-wで同じことをしようとすると面倒。

ついでにuse strict;はコードミスをチェックしてくれるらしい。no strict 'refs';で機能をオフに出来る。
更にuse diagnosticsで詳しい説明が表示される。
diagnostics, splain - 冗舌な診断警告の生成 - fleur.hio.jp

my $hoge = 1; のように「スコープ (関数) 内でのみ有効な変数宣言」をする。

ラベル:


2008年8月5日火曜日

 

Perl事始め~ActivePerlインストール

id:dankogaiにそそのかされて。
$this->get if $you->learn(slow) - 書評 - すぐわかるオブジェクト指向Perl - 404 Blog Not Found

某jkondoにあこがれて宜しく、Perl勉強用のブログ立てようかと思ったけどいつもの様に飽きそうなので止めた。
横にもリンク張ったけど以下が参考書。あ、今更Amazonアフィリエイト張ってみますよ~と。

すぐわかる オブジェクト指向 Perl - 深沢 千尋 (著)

Active Perlダウンロード

ActivePerlダウンロード
リンク先「ActivePerl」の「Download」をクリック。
ユーザ情報を求められるのでスルーして(親切な人は入力して)「Continue」をクリック。
バージョンと環境に応じてインストローラを選んでダウンロード。
ここでは最新版(2008/08/05現在)「ActivePerl 5.10.0.1003」の「Download ActivePerl 5.10.0.1003 for Windows (x86)」MSIファイルを入手。
あとはインストローラ起動して「NEXT」「NEXT」「NEXT」…

コマンドプロンプトが見つからなくて頓挫しかけたけど「C:\WINDOWS\system32」から「cmd.exe」を発掘。
参考書は丁寧だし説明が難しくない。文章が堅くなく口語、ブログとかの文体に近い。レビューにもあるが、冗談など余談が多いのでそれが煩わしく感じる人はいるかも。

ラベル:


2008年8月4日月曜日

 

【API】【Javascrip】Google AJAX Feed APIで複数RSS

Google AJAX Feed APIを使ってみたよ。

Google AJAX Feed APIでRSSを読み込む - MotuLog

リンク先のコードを参考。
今回使ったgoogle.feeds.Feed以外にgoogle.feeds.FeedControlというクラスがあって複数のURLをaddFeed(url, label)というメソッドで渡せる(labelは表示用のタイトル)。
これは取得したRSSを、タブ型とかいくつかのデザインに成形して表示してくれたりする。
サイト関係なく日付順で表示したかったので使わなかった。


<script type="text/javascript"> 
var url=[
            "http://~RSS その1~",
            "http://~RSS その2~"
           ];
var num=10;
var array=[];
var j=0;
google.load("feeds", "1");
function initRSSFeed() {
    var feed = new google.feeds.Feed(url[0]);

    feed.setNumEntries(num);
    feed.load(onComplete); 
}

function cmp(a,b){return b.publishedDate - a.publishedDate; }

function onComplete(result){
    if (!result.error) {
        for (var i = 0; i < result.feed.entries.length; i++) {
            array.push(result.feed.entries[i]);
        }
    }
    if (url.length > j ) {
    var feed = new google.feeds.Feed(url[j++]);
    feed.load(onComplete);
    } else {
    onComplete2();
    }
}

function onComplete2(){
        var container = document.getElementById("rss");
        var temp = '';
        array.sort(cmp);
        for (var i = 0; i < array.length; i++) {
            var entry = array[i];
            temp += '<dt>'+'<a href="' + entry.link + '">'+entry.title+'</a></dt>\n';
            temp += '<dd class="feedTitle">\n';
            temp += entry.contents+'<br />\n';
            temp += changeDate(entry.publishedDate)+'\n';
            temp += '</dd>\n';
        }
        container.innerHTML = temp;
}

//日付表記を変換
function changeDate(str){
    var myDate=new Date(str);
    var YYYY=myDate.getFullYear();
    var MM=myDate.getMonth()+1;
    if(MM<10){MM="0"+MM;}
    var DD=myDate.getDate();
    if(DD<10){DD="0"+DD;}
    var date=YYYY+"/"+MM+"/"+DD;
    return date;
}
google.setOnLoadCallback(initRSSFeed);

</script>

もっとまともなのがあったら教えて欲しい。ダメなところも教えて欲しい。直すから。彼方の好みのコードになるから。
各エントリのデータ(feed.entries)をまとめてるので、それ以外のフィード情報を捨ててるのが問題。
feed.titleは必要な気がするので、onComplete()内でentry.feedtitleみたいに追加するやり方を誰か教えてください。

関連記事

2008年8月1日

ラベル: ,


2008年8月2日土曜日

 

【Javascript】配列操作‐結合とかソートとか

配列を結合したり、配列を初期化したり -


var array1 = [1, 2, 3];
var array2 = [4, 5, 6];
[].push.apply(array1, array2);
alert(array1);

 // [1, 2, 3, 4, 5, 6]

function Data(name, point) {
        this.name = name;
        this.point = point;
}
var array;
array[0] = new Data("name1", 3);
array[1] = new Data("name2", 10);
array[2] = new Data("name3", 9);

上記の配列をソート。


array.sort(cmp);//pointで昇順ソート
array.reverse(cmp);//pointで降順ソート

function cmp(a,b) {
  return b.point - a.point;
}

忘れがちなのでメモ。Javascriptは面倒くさいが楽しいなぁ。

ラベル:


2008年8月1日金曜日

 

【Javascript】Google AJAX Feed API

参考サイト

Google AJAX Feed APIの使い方 - The Star of Web2.0
サンプルコードの丁寧な解説。
Google AJAX Feed APIでとても簡単にRSS Readerを作ってみる - throw Life
APIの使用(メソッドや返り値とか)を詳しく解説。
Google AJAX Feed APIでRSSを読み込む - MotuLog
RSSリーダーのサンプル・コード。全体的に見やすかったのでお世話になりました。
早速Google AJAX Feed APIを導入してみました - ZAPAnet総合情報局
さまざまなAPIの利用方法を扱ったサイト。

関連サイト

using API;
日本で公開されているAPIとマッシュアップに関連する情報

ラベル: , ,


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google