Home > PHP

PHP Archive

「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」を PHP で解いてみる【第 1 回】

  • 2008-05-30 (金)
  • PHP
  • Tags:
  • hatena add hatena users
  • send twitter

suniti さんの「blog.grayash.com - 第0回「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」をPHPでやってみよう!」というエントリーに感化されて、IDEA * IDEA の「新しくプログラミング言語を覚えたいときに行うべき10の練習問題」というエントリーで書かれている練習問題を PHP で解いてみることにします。

全部で10問ありますが、まずは第 1 問。世界のナベアツですねw

1.「なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ~ん万円!とか)」。

で、解いてみました。

<?php
$aho10 = array ('', 'じゅー', 'ぬぃじゅ', 'さぁんじゅ', 'よぉんじゅ', 'ごぉじゅ', 'ろくぅじゅ', 'ななじゅ', 'はぁちじゅ', 'きゅーじゅ');
$aho1 = array ('', 'いっち', 'ぬぃー', 'さぁーん', 'よぉーん', 'ごぉー', 'ろくー', 'しぃっち', 'はぁっち', 'きゅー');

for ($i = 1; $i <= 100; $i++) {
  if ($i % 3 == 0 || strpos((string)$i, '3') !== false) {
    print ($aho10[(int)($i / 10)].$aho1[$i % 10].'<br />');
  } else {
    print ($i.'<br />');
  }
}
?>

引っかかったところは、strpos 関数で 3 があるかどうか調べるところ。
当初 strpos((string)$i, ‘3′) >= 0 という条件にしたのですが、3 が見つからなかった場合でもこの条件が true になってしまいました。
調べた結果、false が 0 として判断されたためだと分かったので、!== 演算子を使って見つかったかどうかを判断するようにしました。

>>作成したサンプルはこちら

参考リンク

PHP で Twitter をスクレイピングする

Twitter API を使っても過去の user_timeline を取得できないので、PHP で直接 Web をスクレイピングして取得してみました。

環境

・PHP 5.2.3
・PEAR::HTTP_Client を使用

取り出す内容

・id
・メッセージ(text)
・permalink
・発言日時

コード(クラス)

<?php
require_once 'HTTP/Client.php';

class Twitter_Scrape {

  private $statuses;

  public function __construct () {
  }

  public function getTimeline ($username, $page = 1) {
    $url = 'http://twitter.com/'.$username.'?page='.$page;

    $client =& new HTTP_Client();
    $client->get($url);
    $response = $client->currentResponse();

    $res = mb_convert_encoding($response['body'], 'UTF-8', 'UTF-8,SJIS,EUC-JP,JIS');
    $dom = @DOMDocument::loadHTML($res);
    if ($dom) {
      $xml = simplexml_import_dom($dom);
      if ($xml) {
        $i = 0;

        // $page が 1 の場合は最新の発言を取得する
        if ($page == 1) {
          $entries = $xml->xpath('//div[@class="desc hentry"]');
          $content = $entries[0]->xpath('p[@class="entry-title entry-content"]');
          $meta = $entries[0]->xpath('p[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id'	 => substr($meta[0]->a[0]['href'], -9),
            'text' => strip_tags($content[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }

        // ページ内の発言を取得する
        // URL が長いと途中で切れてしまう...
        $entries = $xml->xpath('//tr[@class="hentry"]');
        foreach ($entries as $entry) {
          $content = $entry->xpath('td[@class="content"]');
          $meta = $content[0]->xpath('span[@class="meta entry-meta"]');
          $statuses[$i++] = array(
            'id' => substr($entry['id'], 7),
            'text' => strip_tags($content[0]->span[0]->asXML()),
            'permalink' => $meta[0]->a[0]['href'],
            'date' => $meta[0]->a[0]->abbr['title']
          );
        }
        return $statuses;
      } else {
        print ('xml parse error');
      }
    } else {
      print ('dom parse error');
    }
  }
}
?>

コード(呼出元)

<?php
require_once "twitter_scrape.class.php";

$req = new Twitter_Scrape();
$statuses = $req->getTimeline('yusuke0927', 1);
foreach ($statuses as $status) {
  print('<tr>');
  print('<td>'.$status['id'].'</td>');
  print('<td>'.$status['text'].'</td>');
  print('<td>'.$status['permalink'].'</td>');
  print('<td>'.$status['date'].'</td>');
  print('</tr>');
}
?>

簡単な説明

インスタンスを生成して、getTimeline でユーザ名とページ数を渡すと、スクレイピングした結果を連想配列で返します。

問題点

発言に含まれる URL が長いと切れたままになってしまう。これは発言を asXML で取得した後に strip_tags でタグを除去しているせい。なんとかしたい。

さくらのレンタルサーバに PEAR をインストール

Go-PEAR を使ってさくらインターネットのレンタルサーバに PEAR をインストールしました。
元々さくらのレンタルサーバには PEAR がインストールされていますが、そこにインストールされていないパッケージは自分でインストールできないので、自分のディレクトリにインストールしました。
以下はそのメモです。内容が必ずしも合っているとは限らないですがご容赦を。

環境:
・さくらインターネット レンタルサーバ スタンダードプラン
・PHP 5.2.5

PEAR のインストール

http://pear.php.net/go-pear を開く。そこに表示されるスクリプトを go-pear.php としてローカルに保存。

FTP 等で、Web からアクセス可能なディレクトリ(例:/home/アカウント名/www/install)を作成し、そこに go-pear.php をアップロード。
ディレクトリのパーミッションは 755 にしておく。777 にしたら Internal Server Error になったので。.htaccess とかでパスワード制限をかけておいた方がいいかも。

ブラウザで、設置した go-pear.php にアクセスします。Next >> でインストール開始。

設定画面が表示されます。注意する点は以下。
1. Installation prefix は Web からアクセスできないディレクトリを指定。
10. Filename of WebFrontend は管理画面のパス。Web からアクセスできる場所を指定。
11. php.exe path, optional はさくらの場合 /usr/local/bin/php を指定。
install ボタンでインストール開始。

インストールが終わると、ログの下の方に PEAR Installation path という箇所があるので、これを控えておきます。

php.ini の設定

php.ini に先ほど控えた PEAR Installation Path を include_path として設定します。

include_path = “.:/home/アカウント名/pear/PEAR”

パッケージのインストール

管理ページをブラウザで開きます。URL は先ほど指定した 10. Filename of WebFrontend になります。
必要なパッケージを検索してインストール。依存しているライブラリも表示されるのであれば先にインストールします。

パッケージを全てインストールした後、管理ページはパスワード制限をかけておくか削除します。

その他

管理画面ではなく、コマンドプロンプトからパッケージをインストールしようとすると、 channel-update をしろといった警告が表示されます。
「pear channel-update pear.php.net」としても、
could not create lock file: failed to open stream: Permission denied
というエラーになってしまいます。原因は今のところ分からず・・・
管理画面からはパッケージをインストールできているんですが。

参考サイト

 Page 2 of 2 « 1  2 

ホーム > PHP

Search
Feeds
Meta
あわせて読みたい
あわせて読みたいブログパーツ
Others...
フィードメーター - sukechan.net
track feed

Return to page top