Home > アーカイブ > 2009-05

2009-05

CakePHP フレームワークのソースをapp/で置き換える

この記事の所要時間: 135

こないだのCakePHP勉強会でやったネタですが、需要がありそうなんで書きます。

CakePHPは1.2Finalになって色々と改良が成されて拡張性も増えたのですが、良くなってきた分、さらに色々とやりたくなるのが人の常です。そこでフレームワークのソースをどうしても書き換えたい時にcake/を触るのではなく、せめてapp/でフレームワークソースを置き換えましょう、という話です。

[目標] ConnectionManagerをapp/に置く

デモではDispatcherの置き換えをやったのですが、cake bake diaryさんのエントリのように需要があるかもなので、ConnectionManagerをapp/に置いてフレームワークに読ませようと思います。

1. ConnectionManagerのソースをapp/以下にコピー

ConnectionManagerを一から書いても良いのですが、それも大変なので、まずフレームワークのConnectionManagerのソースをapp/以下にコピーします。

ConnectionManagerはcake/libs/model/connection_manager.phpになるので、それに倣ってapp/modles/connection_manager.phpにコピーします。

$  cp -a cake/libs/model/connection_manager.php app/models/

2. ConnectionManagerのソースを変更する

app/にコピーしたConnectionManagerを変更します。ここでは読み込まれたソースが分かりやすいように先頭にファイルパスをvar_dump()しておきます。

[app/models/connection_manager.php]

<?php
var_dump(__FILE__); // <---追加
/* SVN FILE: $Id: connection_manager.php 8120 2009-03-19 20:25:10Z gwoo $ */
/**
 * Datasource connection manager
 *
 * Provides an interface for loading and enumerating connections defined in app/config/database.php
 *
 * PHP versions 4 and 5

&#91;/php&#93;
<h3>3. ConnectionManagerをフレームワークに読ませる</h3>
<p>最後にapp/のConnectionManagerをフレームワークに読み込ませます。これにはApp::import()のキャッシュ機能を使います。</p>
<p>方法は簡単で、bootstrap.phpに以下のように書くだけでokです。</p>
<p>[app/config/bootstrap.php]</p>

App::import('Core', 'ConnectionManager', array('file' => '../app/models/connection_manager.php'));

ブラウザからアクセスすると下のように画面上に2.で書いたパスが表示されて、[app/models/connection_manager.php]が読み込まれているのが分かります。

あとはこのソースをガシガシ書き換えていけばokです。

いざという時使えるかも

少しトリッキーな方法ですが、フレームワークのソースを書き換える手段としては覚えておいて損は無いと思います。

ただし、この方法はApp::import()の機能を利用しているので、フレームワークがApp::import()で読まないソース(Objectとか)は残念ながら使えません。あしからず。

CakePHP routes.phpの確認はユニットテストで

この記事の所要時間: 423

第4回CakePHP勉強会@Tokyoでakiyanの男前な発表があったので、今後急増するであろうroutes.phpを極めていく人にオススメな確認方法をご紹介します。

routes.phpの確認にはユニットテストをオススメします。

routes.php設定でありがちなループとして、

  • routes.phpを設定 -> ああ動いた
  • routes.phpに設定追加 -> ああー動かない
  • routes.phpを修正 -> あれ?前動いたところも動かなくなってるorz

というのがあるのですが、せっかくCakePHPにはユニットテスト機構があるのでテストを書いて動作確認をしましょう。

SimpleTestをダウンロードしていない人はダウンロードして、app/vendors/かvendors/に展開しておいて下さい。

routes.phpで設定する目標

Web2.0(最近あんまり聞かないですが。。。)なサイトではありがちなユーザIDを含めるURLを実現します。

URL コントローラー アクション パラメータ
/ TopController index none
/shin1x1 UserController index $params[‘user_id’] = ‘shin1x1’
/shin1x1/edit UserController edit $params[‘user_id’] = ‘shin1x1’
それ以外 NothingController index none

routes.phpを仕様に合わせて設定しておきます。

<?php
  //
  Router::connect('/:user_id/edit', array('controller' => 'user', 'action' => 'edit'));
  Router::connect('/', array('controller' => 'top', 'action' => 'index'));
  Router::connect('/:user_id/*', array('controller' => 'user', 'action' => 'index'));

  // Nothing
  Router::connect('*', array('controller' => 'nothing'));
?>

最後はシステムが取るべきURL以外ならNot Foundを出すように設定しています。これにより想定外のコントローラーやアクションが実行されるのを防ぎます。

テストケースを作る

テストケースは何でも良いですが、とりあえず[app/tests/cases/url_routing.test.php]としておきましょう。スケルトンなソースは以下になります。

当然ながらこれはGREENでとおります。

<?php
App::import('Core', 'Dispatcher');

class UrlRoutingTestCase extends CakeTestCase {
}
?>

テストケースを書く [‘/:user_id/edit’]

まず[URLパターン=’/:user_id/edit’]のテストです。shin1x1がユーザIDとなっています。URLの正引き(URLからコントローラーやアクション、パラメータ等々を決定)はtest_parseParams~()に、URLの逆引き(コントローラーやアクション、パラメータ等々からURLを決定)はtest_url~()に実装しています。

URLの正引きではDispatcher#parseParams()に対象URLを与えて、その戻り値をassertで確認しています。実際の正引き処理はRouterクラスが行うのですが、戻り値の扱いやすさ、分かりやすさを考えてDispatcherを使っています。よりディープなテストをするならRouter::parse()を使った方が良いですね。

↓では[/shin1x1/edit]というURLに対してどのような正引きを行うかとテストしています。

<?php
  public function test_parseParams_user_edit() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/edit');
    $this->assertIdentical('user', $params['controller']);
    $this->assertIdentical('edit', $params['action']);
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);
  }

?>

次は逆引きです。こちらはRouter::url()にパラメータを設定して、URLを求めています。Router::url()はパラメータからURLを生成するシーン(HelperとかController#redirect()とか)の裏で使われているメソッドなので、ここで求められるURLを確認すれば、実際のアプリケーションの挙動が確認できます。

↓では[controller=’user’、action=’edit’, ‘user_id’=shin1x1]というパラメータからどのようなURLが生成されるかをテストしています。

<?php
  public function test_url_user_edit() {
    $url = Router::url(array('controller' => 'user', 'action' => 'edit', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/shin1x1/edit', $url);
  }

?>

テストケースを書く [‘/’]

以下、同様です。正引き、逆引きをテストしています。

<?php
  public function test_parseParams_user_top() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'top');
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);
  }
  public function test_url_user_top() {
    $url = Router::url(array('controller' => 'user', 'action' => 'top'));
    $this->assertIdentical('/', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'top', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/user/top/user_id:shin1x1', $url);
  }
?>

テストケースを書く [‘/:user_id/*’]

こちらも同様ですね。正引き、逆引きをテストしています。ここではnamedパラメータやQUERY_STRINGも簡易的にテストに入れています。

<?php
  public function test_parseParams_user_index() {
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1');
    $this->assertIdentical('user', $params['controller']);
    $this->assertIdentical('index', $params['action']);
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/a');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array('a'), $params['pass']);
    $this->assertIdentical(array(), $params['named']);

    // namedパラメータ
    $Dispatcher =& new Dispatcher();
    $params = $Dispatcher->parseParams('/shin1x1/page:1');
    $this->assertIdentical($params['controller'], 'user');
    $this->assertIdentical($params['action'], 'index');
    $this->assertIdentical('shin1x1', $params['user_id']);
    $this->assertIdentical(array(), $params['pass']);
    $this->assertIdentical(array('page' => '1'), $params['named']);
  }
  public function test_url_user_index() {
    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1'));
    $this->assertIdentical('/shin1x1', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1));
    $this->assertIdentical('/shin1x1/page:1', $url);

    $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1, '?' => array('mode' => 'hoge')));
    $this->assertIdentical('/shin1x1/page:1?mode=hoge', $url);
  }
?>

ユニットテストで楽々確認

というわけでユニットテストでroutes.phpをテストしてみました。

routes.phpの設定は凝っていくと色々な事ができて楽しいのですが、複雑にしていくとハマリがちです。特に条件が複雑になると意図せぬルーティングにマッチしてしまうことがままあります。

そんな時にテストを書いておけば、手軽に動作が確認できます。また、設定変更等に伴うデグレも簡単に判別することができます。例えば、冒頭にあるroutes.phpの内容も順番を入れ替えるとルーティングが変わるのですが、こういった事もテストを実行すれば、どのような挙動になっているかをすぐに判別がつきます。

URLルーティングのテストは書きやすいですし、書いていくと病みつきになりますよ。来月の自分のためにもバンバンテストを書いておきましょ-。

第4回CakePHP勉強会@Tokyoが終了しました&発表資料

この記事の所要時間: 433

第4回CakePHP勉強会@Tokyoが無事に終了しました。


photo by iogi

私自身は司会やりつつLTもありつつで相変わらずバタバタしていましたが、東京でのCakePHP勉強会は久しぶりだっただけに盛り上がりましたね。

LTではApp::import()について発表しました。何気なく使っても動くのですが、少し内容をおさえておくとより便利に使えますよ:-D。

発表資料をアップしておきます。

10分で分かるApp::import()

View more presentations or Upload your own.

以下、つらつらとメモ書きです。

1. candycane

  • エバンジェリストで今回ももろもろお疲れ様なyandodさん
  • Cakeまんじゅうは意外と旨い
  • BTSの概要から、candycaneへ
  • アルファテスト開始!
  • いちおう名前は入れて貰ってますが、貢献はわずかですorz
  • pushします!

2. Ktai Library

  • MASA-Pさん
  • Ktai Libraryの概要
  • まずは衝撃の事実からw(頑張って下さい!)
  • 携帯は細かなケアが大変なので、ライブラリは嬉しい人が多いですね
  • 一つのビューで3キャリア対応
  • タイムリーなdocomo新機種仕様
  • さらに今後に期待ですね

3. 極めるroutes.php

  • akiyanさん
  • routes.phpの解説を具体例を交えて
  • paramsルーティング
  • 怖がらずにroutes.phpを使おう!
  • 丁寧な解説は勉強になった人も多いかと。
  • さらにPrefix Routingを使うとハマりポイントがあったりで楽しいですよw
  • ウチはホワイトリスト的に通過するURLは全て設定して、それ以外は404出すようにしてます

LT1. CakePHP1.3

  • cakephperさん
  • CakePHP1.3について
  • bakeでFixtureの項目は出るのに、まだ操作できないとか
  • 1.2 to 1.3なマイグレーションとか
  • deployとか
  • 今のところ、1.3は1.2の熟成バージョンな印象

LT2. phpUnderControl + CakePHP

  • miauさん
  • ツールも話し方もまさにLT!
  • ツールが知りたいです。。。
  • CakeでCIなアプローチをマジメにやっているのは面白いですね。
  • phpUnderControlは本当に触ってみたい
  • ただphpUnderControlはphpUnit前提なので、SimpleTestなCakeではXML変換など細工が必要
  • さらにノウハウが公開されるのに期待!

LT3. CakePHPにPEARのImage_Graphを入れてみた

  • s_yo_koさん
  • ImageGraphの紹介
  • 簡単にグラフ作成
  • 日本語もok
  • 一番苦労したのはPEARのインストールw
  • 最近、私はグラフはJavaScriptのライブラリ使ったりしてます

LT4. ビヘイビアの紹介と使い方

  • matsuuraさん
  • Sun Limited Mt.の中の人!
  • 便利なビヘイビアの紹介
  • $behaviorsは一度はやりますねー
  • メ○チを論理削除w
  • 野球ファンにはこれほど分かりやすい例は無いw
  • ビヘイビアはホントに便利!
  • 特に自作するとその便利さが実感できます

LT5. プラグイン三段活用

  • slywalkerさん
  • ここから第2部(懇親会)での発表
  • くだけた雰囲気で異様な盛り上がりw
  • とても東京発表デビューとは思えない落ち着いた発表&ネタw
  • 笑いだけでなく、内容もキッチリあるのがさすが。
  • プラグインを使いこなしているslywalkerさんならではの視点ですね
  • 修復しながら建築メソッドw
  • 来月(関西勉強会)もよろしくお願いしますー

LT6. 10分で分かるApp::import()

  • shin1x1
  • 突っ込んで頂いた皆さんありがとうございました!
  • 楽しかったです!
  • こんなにゆるく発表したのはさすがに初めてだったw
  • この雰囲気だと話しやすい人多いでしょうねー
  • 懇親会->勉強会とかも良いかも
  • 妙にハイテンションだったので、五月蠅く思われた方スミマセン。。。

懇親会

  • 色々とお話しました
  • 自社フレームワーク、とか
  • iPhoneアプリ、とか
  • 勉強会について、とか
  • 勉強会に遠征する、とか
  • インフル、とか
  • 皆さん盛り上がっている様子で嬉しかったり
  • 日本のイベントに海外から来てくれるのに、日本からほとんど行かないのはどうよ。
  • チケットでもTips書くでも何でももっと英語圏にも情報発信すべきでは?
  • ↑二つは耳が痛い。。。頑張らないと!

お疲れ様でした!

発表を詰め込んだので落ち着かない雰囲気でしたが、参加された皆さんが楽しんで頂けたのなら嬉しいです。(私は楽しかったです:-D)

発表者の皆さん、せっかくの発表なのにせかしてスミマセンでした。これは全く持って、自分の時間調整の問題なので、申し訳無かったです。

最後になりますが、会場・機材提供頂いたグリーさん、そしてサポート頂いたいちいさん、本当にありがとうございました!おかげで快適に会が運営できました。

参加された皆さん、発表者の皆さん、運営チームのみんな、本当にお疲れ様でした!!

勉強会を楽しむなら発表しよう!

この記事の所要時間: 59

せっかく勉強会に参加するなら発表してみましょう!という話です。


Photo by Kiryu Tsukimiya

演台に立って、プロジェクタに資料を写しながら発表をする。

勉強会に良くある発表の風景ですね。あなたもこの登場人物になってみませんか?

発表のメリット

勉強会で発表するとこんな良いことがあります。

1. より深くテーマを学ぶことができる

発表するとなると、内容を考え、資料を作るでしょう。となると発表内容について、調べ、考え、まとめるわけです。この過程でより深く学ぶことができるわけです。特に初めての発表なら、失敗したくはないでしょうから(失敗しても良いんですけどね)、必死のぱっちでやるでしょう。明確な目的を持った学習は効果が高いのはあなたも経験済みだと思います。

2. 勉強会への予習ができる

1.のおまけですが、そうやって勉強会のテーマについて少しでも学習して行くと、他の方の発表もより楽しむことができます。

3. 数十人(数百人?)が自分の話を聞いてくれる

もちろん緊張しまくるのですが、これって冷静に考えるとすごいことではないでしょうか。同じ興味を持った数十人(数百人)が自分の話をちゃんと聞いてくれるわけです。路上で弾き語りしても、この人数は簡単には集まらないでしょう。まして路上でCakePHPについて語り出したら、色んな意味で大変です。

4. 懇親会が楽しくなる

懇親会まで参加する人は基本そのテーマの話をしたい、聞きたいわけなんです。ただ知らない人同士だとなかなか話しづらいし、会話も弾まない。という時にまず共通のテーマになるのが勉強会の発表なんです。さらに発表した人のことは参加者は知っているので話しやすいわけです。

というわけで発表した人は懇親会でモテモテ、は言い過ぎでも、確実に話しかけられます。「発表良かったですよ」「あそこを教えて下さい」「blogとか書いてないんですか?」等々。自分から話すのが苦手な人はいっそのこと発表してしまえば良いんです。

5. 発表のフィードバックがある

勉強会以後にも楽しみがあります。参加者からの勉強会レポです。「良かった」「悪かった(これはあまり書かれないけど)」「ためになった」なども感想だけでも嬉しいですが、わりと具体的な内容に踏み込んだレポも多いです。間違っていたところがあれば指摘もして貰えるし、その人なりの意見が聞けたりもします。

勉強会から数日は「○○勉強会」をググりまくること請け合いです。

発表をためらう理由

どうでしょう、「発表してみようかな」という想いが芽生えてきましたか?

心の中に少なからず「発表してみたい」「あんな風に前に立って話してみたい」という想いがあるのに、なぜ発表することをためらうのでしょうか。

自分の経験から考えると、以下のような理由からではないでしょうか。

話すネタないよ。。。

例えばCakePHPの勉強会なら、普段から何かしらCakePHPに触れていればきっと話すネタはあります。発表する内容は、何も小難しいことや、斬新な切り口でなくても良いのです。あなたがCakePHPを触っていて、普段やっていること、感じていること、疑問、悩みを発表にしてしまえば良いのです。

「君の当たり前に僕らは感嘆させられるんだ」

人前で話すのが恥ずかしい。。。

全然大丈夫です。何が大丈夫だと言うと、緊張して、顔が真っ赤になって、汗が出て、かんで、頭が真っ白になって「普通」なんです。

もちろん仕事でも勉強会でも発表を見ているとプレゼン慣れされていて、とても上手い発表をされる方はいらっしゃいます。でもそういう方を良く観察してみると、実は緊張してたりするのです。発表中はそんな素振りはなくても、発表前はそわそわしてたり、顔色が悪かったりします。そんなスゴイ人でも緊張するのです。

緊張の度合いは人それぞれですが、上手い人が緊張するのですから、初めての人が緊張するのは当たり前のことです。

さらに「緊張している」ことは勉強会の発表では大した問題ではありません。聞いている側は緊張していることは分かりますが、そんな事は全く気にしません。「頑張れ!」「大丈夫!」と思っているだけです。そんなことよりあなたの話が聞きたいのです。

「君の話が聞きたいんだ」

人前で話すことなんか無いし。。。

本当に無いですか?数十人、数百人の前で話す機会は無くとも、数人の前で話すことなら、学校でも会社でもあるのではないでしょうか。自分の考えをまとめて、それを発表する、というのはこういったプレゼンテーションの場だけに限らず、打ち合わせや報告の場ではよくあることです。

何ならここで練習してしまえば良いのです。そして、その成果を本業で生かせば良いのです。

「うまく生かすどうかは君次第」

発表してみよう!

ここまで読んだあなたなら発表したくて、ウズウズしてきたんじゃないですか?

ご心配なく。5/22に第4回CakePHP勉強会@Tokyo、6/5に第2回CakePHP関西勉強会がありますよ。

どちらもLT枠がまだ空いてます。

CakePHPを触っている方ならきっと話すネタがあります。例えば、以下の内容なんかは話しやすいのではないでしょうか。

  • CakePHPとの出会い(前はSmarty使ってたけど。。。、Railsから、etc)
  • CakePHPで開発してみて(ここに詰まった、ここは便利!etc)
  • こうやってCakePHPで開発してる(まず画面を作って、DB設計して、bakeを使って、、、etc)
  • ○○とCakePHPを比べて(symfonyとかCodeIgniterとか、etc)

@東京で発表したい方は第4回CakePHP勉強会@Tokyoからyandoさんにメールを送ってみて下さい。

関西勉強会で発表したい方は、メール(shin1x1[at]gmail.com)でも、このblogのコメントでも、是非、手を挙げてみて下さい。お待ちしてます-。
(関西勉強会は、参加申込出来なかった方もLT発表されるなら参加できます!)

@see 懇親会を楽しむ5つの方法

CakePHP cache()はCache::write()に

この記事の所要時間: 230

CakePHPにはキャッシュを行う関数cache()があるのですが、1.2.2のソースを見るとdeprectatedになってました。

[cake/basics.php]

<?php
/**
 * Reads/writes temporary data to cache files or session.
 *
 * @param  string $path File path within /tmp to save the file.
 * @param  mixed  $data The data to save to the temporary file.
 * @param  mixed  $expires A valid strtotime string when the data expires.
 * @param  string $target  The target of the cached data; either 'cache' or 'public'.
 * @return mixed  The contents of the temporary file.
 * @deprecated Please use Cache::write() instead <---ココ
 */
        function cache($path, $data = null, $expires = '+1 day', $target = 'cache') {
?>

代わりにCache::write()を使えとのことなので、cache()とCache::write()との違いを見てみました。

1. キャッシュエンジンが選べる

これが一番の違いかと。

cache()ではキャッシュの保存先にはファイルしか選べません。おかげで単純な実装で分かり易いという利点もあるのですが、APCやmemcachedなどにキャッシュを保存できません。

Cache::write()では[app/config/core.php]で設定を行えば、APC/XCache/Memcacheと色々なキャッシュエンジンを選ぶことができます。特にMemcacheではサーバを分散させた時にキャッシュをサーバ間で共有できるので、これは良いです。

パフォーマンスもファイルよりAPC等の方が良いです。

2. 連想配列やオブジェクトがそのままキャッシュできる

cache()ではキャッシュの保存にfile_put_contents()を使っているので、連想配列やオブジェクトをキャッシュする際はserialize()が必要でした。(逆に取得したキャッシュを使うにはunserialize()が必要。)

Cache::write()では連想配列でもオブジェクトでもそのままキャッシュしてくれます。これもちょっとしたことですが、便利です。

3. キャッシュ有効期限が手軽に変更できなくなった

cache()では第3引数がキャッシュ有効期限となっているので、cache()の呼び出し毎にキャッシュ有効期限を設定することが簡単でした。

Cache::write()では引数でキャッシュ有効期限を渡すことができないようで、[app/config/core.php]等にCache::config()を使って、あらかじめ有効期限を設定しておく必要があります。

<?php
   Cache::config('default', array(
    'engine' => 'Apc', //[required]
    'duration'=> 10, //[optional] <----キャッシュ有効期間(秒)
    'probability'=> 100, //[optional]
      'prefix' => Inflector::slug(APP_DIR) . '_', //[optional]  prefix every cache file with this string
  ));
   Cache::config('app', array(
    'engine' => 'Apc', //[required]
    'duration'=> 360, //[optional] <----キャッシュ有効期間(秒)
    'probability'=> 100, //[optional]
      'prefix' => Inflector::slug(APP_DIR) . '_', //[optional]  prefix every cache file with this string
  ));
?>

上記例なら’default’なら10秒、’app’なら360秒がキャッシュの有効期間となります。

ビューキャッシュはcache()のまま

キャッシュと言えばビューの出力をキャッシュするビューキャッシュがあるのですが、こちらは1.2.2でもキャッシュの保存にcache()を利用しています。つまり、キャッシュエンジンをAPC等に変更してもビューキャッシュだけはファイルに保存されます。

複数サーバでビューキャッシュを共有したい時はビューの出力をフックしてCache::write()でキャッシュするなど、一工夫が要りそうです。

deprecatedとするなら、まずフレームワークで実行するビューキャッシュCache::write()にすべきだとは思うのですが、これはいずれは実装されるのでしょう。

ウチの環境からtwitter.comに繋がらない件

この記事の所要時間: 26

久しぶりのTwitterネタ。

実は今年の2月頃からウチの環境からtwitter.comに接続できなくなりました。

「twitter.comが落ちてるからでしょ?」

という声が聞こえてきそうですが、そうで無い時も繋がりません。

pingは通るのですが、

$ ping twitter.com
PING twitter.com (128.121.146.100) 56(84) bytes of data.
64 bytes from 128.121.146.100: icmp_seq=0 ttl=128 time=143 ms
64 bytes from 128.121.146.100: icmp_seq=1 ttl=128 time=134 ms
64 bytes from 128.121.146.100: icmp_seq=2 ttl=128 time=141 ms
64 bytes from 128.121.146.100: icmp_seq=3 ttl=128 time=142 ms

80への接続ではレスポンスが返ってきません。。。

$ telnet twitter.com 80
Trying 128.121.146.100...
[CTRL + C]
telnet: connect to address 128.121.146.100: Connection timed out
telnet: Unable to connect to remote host: Connection timed out

ごく時々何かの気まぐれで繋がることはあるのですが、ほとんどの場合接続できません。

ところが同じPCからでもemobileだと問題無く繋がったりします。

で、この接続をしようとしているIPは実はTwitter検索のクローラーと同じIPだったりします。普通に考えればアク禁食らったという話ですね。

それまで1年半くらい見逃されていたのがラッキーだったという事でしょうか。

まあTwitterは検索に力を入れているようなので、そこらへんも何か関係あるのか、無いのか。(こちらのtwitter検索は問題無いようですが。APIは規制するけど、webはokとか?)

というわけでめっきりTwitterへのpostが減っているのはその辺の事情もあるという事で。

あと他のクローラを使ったサービスを運営されている方はくれぐれもご注意を!

第2回CakePHP関西勉強会を開催します

この記事の所要時間: 122

6/5(金)に第2回CakePHP関西勉強会を大阪で開催します。

■内容
CakePHPに関する発表(Tipsや事例紹介等)と質疑応答を行います。

■概要
日時: 2009年06月05日(金) 19:00~
会場: 扇町インキュベーションプラザ(メビック扇町)
URL: http://www.mebic.com/outline/
MAP: http://www.mebic.com/access/
費用: 200円~500円程度(会場・機材費を参加者で頭割り)
events.php.gr.jp – 第2回CakePHP関西勉強会

前回から半年近くご無沙汰ですが、ぎりぎり春の終わりくらいに開催となります。

今回も前回と同じスタイルで自己紹介、発表、LT、懇親会という流れです。

発表者には、Rails使いの方がいらっしゃったり、pluginな方がいらっしゃったりと、となかなか楽しみな内容になりそうです。(私も発表する予定です)

今回もLT枠があります。「オレ(わたし)に話させろ」な方も、「初めてだけどせっかくだし話してみたい」な方も、是非この機会に発表してみませんか?発表希望な方は、このblogのコメントでも、メール(shin1x1[at]gmail.com)でもお気軽にご連絡下さい。

なお参加にはevents.php.gr.jpにて申込が必要となります。申込開始は5/11 0:00からとなります。申込を受け付けています。

関西のbaker、PHPer同士交流を持てる良い機会ですので、是非ご参加下さい!

参加申込み

Home > アーカイブ > 2009-05

検索
フィード
メタ情報

Return to page top