成人の日を組み込んで2泊3日ほど台北に遊びに行ってきた。
iPhone を持っていたんだけどもなかなか野良 Wi-Fi が掴めず、ホテルのロビーだとかバーが用意してるモノを使っていた。
台北市内の至る所で WIFLY と hinet という有料の無線 LAN の電波を拾えるんだけども、どうやってアカウントを作るのか良く判らずに歯がゆい思いをしたのだった。
この WIFLY はプリペイド式で、カードはスタバ等で買えるようだ。
スタバはちょいちょいあった気がする。101に遊びに行った流れでスタバに寄れば良い。
:: うましうまもブログ! | 台北市内でiPhoneを使う【WIFLY編】 :::
ちなみにスタバは日本のよりもちょいと味が薄かった。
24時間100NT$で、31日利用の場合は500NT$ってのはかなり良心的に思える。
とにかく台北市内においては全域って言っちゃっても良いんじゃないかって程に引っかかる。
次回は間違いない。
twitter にて報告もらいました。
As of Nov 6, 2009, we have noticed many customers reporting a new php injection exploit.
http://kb.mediatemple.net/questions/1715/Working+with+a+php+injected+website
現在は修正済みで正常にアクセス可能です。
ご迷惑お掛けしました。
テストテストテスト
Modern Warfare2 実績 1000 になりました。
もう Spec Ops やりたくない!!!
タイトルままですが。
『ディシプリン*帝国の誕生』方面で慌ただしい、どうかしている天才ゲームクリエーターであるところの飯田和敏がヴォーカルを務める我々 The Riot 怒りの10代がライブをやりますよ、今年も。
先日、母に電話したら猛烈にお怒りのご様子だったので、思わず切ってしまった。怒りの10代のマインドは不滅です。というわけでライブの告知!今週の日曜、高円寺(あとは誰かヨロシク)。
http://twitter.com/iidakazutoshi/status/5409865609
今回は高円寺フェス2009フリーホイーリンという高円寺中のライブハウスにてドリンク代のみでライブが観れるっちゅーとんでもない企画に参加しちゃうわけです。
11月8日の日曜日。時間は12:30から。昼間の。すごい。
ハコは Club Mission’s という大変キレイな所で御座います。
演奏時間は15分。短い?そうか?
15分激高し続ける事はそんなに簡単じゃないと思うんです。
でも飯田さんを始め、我々は伊達に怒りの10代なんて名前を付けてませんよ。憤死スレスレの15分をお届けするのです。
ref – 高円寺フェス2009
deflogin が unknown command だ、みたいな事を言われるようになってしまった。あと mate コマンドで TextMate が起動出来ない。
これは困るので 4.0.3_1 に戻したい。
screen はアンインストールした状態で始めます。
1. trac で確認する
MacPorts Trac
http://trac.macports.org/browser/trunk/dports
今回の件はチケットがあった。
http://trac.macports.org/ticket/18235
4.0.3_1 のリビジョンを確認する。これだ。
http://trac.macports.org/browser/trunk/dports/sysutils/screen/Portfile?rev=45522
2. svn co する
適当な所でもいいし、自分の local portfile 置き場あるならそこに。俺は $HOME/dports というディレクトリを作ってるのでそこへチェックアウト。
% cd ~/dports
% svn co –r 45522 http://svn.macports.org/repository/macports/trunk/dports/sysutils/screen \
sysutils/screen/
3. sudo port install する
Portfile のあるディレクトリで port install すると宜しくやってくれるようだ。
% cd ./sysutils/screen
% sudo port install
4. 確認する
% port installed | grep screen
screen @4.0.3_1 (active)
いいんじゃないでしょうか。
local portfile の手法でチェックアウト後に portindex したんだけれども、どうもリビジョンまでは見てもらえないっぽい? sudo port install screen @4.0.3_1 にしても 4.0.3_3 が入ってしまった。
screen に限らず MacPorts で older revision のアイテムが欲しい時はこのやり方でいけそう。
ref
https://trac.macports.org/wiki/howto/InstallingOlderPort
表題の通り。
高橋(13:38)
Mashableのページがはてブできないのはなぜ?
なぜかモバイル用ページになっちゃう…
ライブドアクリップではそういうことないかね?
Kiyoshi Yoshida(13:39)
おお
ホントだ
高橋(13:40)
だしょ
Kiyoshi Yoshida(13:40)
はてなが送ってるUAがおかしいみたいな事かなー
高橋(13:40)
なんかそんな感じだよね
ページ取得いってモバイルて言われて帰ってきてるよね
はてブするとはてな側からエントリ情報、本文(の一部)、スクリーンショットを取る為のスクリプトがいらっしゃる。
各々の UA は
- Hatena Bookmark/0.1
- Hatena2::RemoteDocument/0.02
- HatenaScreenshot/1.0 (checker)
こんなんかな。
スクリーンショットは今回の件とは関係薄そうなので上2件をテスト。
まず Hatena Bookmark/0.1 をためす。
irb(main):002:0> Net::HTTP.start('mashable.com'){|h| h.get('/', "User-Agent" => "Hatena Bookmark/0.1")}
=> #<Net::HTTPOK 200 OK readbody=true>
次に Hatena2::RemoteDocument/0.02 で。
irb(main):003:0> Net::HTTP.start('mashable.com'){|h| h.get('/', "User-Agent" => "Hatena2::RemoteDocument/0.02")}
=> #<Net::HTTPFound 302 Found readbody=true>
302 が返って来た!どうもこっちが怪しい。
「Remo」は通し。
irb(main):005:0> Net::HTTP.start('mashable.com'){|h| h.get('/', "User-Agent" => "Hatena2::Remo")}
=> #<Net::HTTPOK 200 OK readbody=true>
「Remot」は通らず。
irb(main):006:0> Net::HTTP.start('mashable.com'){|h| h.get('/', "User-Agent" => "Hatena2::Remot")}
=> #<Net::HTTPFound 302 Found readbody=true>
どうやら「mot」が通らない。
irb(main):010:0> Net::HTTP.start('mashable.com'){|h| h.get('/', "User-Agent" => "mot")}
=> #<Net::HTTPFound 302 Found readbody=true>
ユーザーエージェントが「mot」と言えば、それはモトローラ系端末。MOT-V980 とか。
mashable の UA に「mot」が入ってたらモバイル扱いするザックリ具合が主な原因。
「『mot』で判定するケースがあるから『remote』とか使うな」ってのは自分でクローラ書く時の参考になった。
ちなみに delicious には問題無くブックマーク出来ました。
グラスホッパーマニュファクチュア設立10周年記念イベント。
今年は 2 Days で3イベントという無茶苦茶なスケジュール。
2日目であるところの HOPPER’S Vol.3 に去年に引き続き「THE RIOT-怒りの十代-」のギターとして出演します。
HOPPER’S VOL.3 -A BATTLE OF THE BANDS-
熱狂のロックフェス第3弾! GhM10周年の祝砲を撃ち鳴らせ!
2008年9月20日(土) 六本木SUPER DELUXE
OPEN 18:00 START 18:30 CLOSE 22:00
入場予約価格:3,000円(税込/ドリンク別)
年齢制限:18歳未満の方は保護者の同伴が必要です。
年齢確認のため身分証明証をご持参ください。
出演バンド:GhMサウンドチーム/Spelunker/ニュートリノ/THE RIOT-怒りの十代-
※須田剛一の出演はありません
http://www.grasshopper.co.jp/GhM10th2DAYZ/ghm2days.html
チケットはすでに発売中。
RIOT を結成して1年半くらいですが、結構な数のライブもこなしてますし、CDも出しましたし。
イベントドリブンなバンドの割に相当充実。
「意思の will」にはなかなか気付けないので修業が足りない。
“will”で未来を念じているのは、人です。だから”will”は未来形であると同時に、「意志」という意味があります。
404 Blog Not Found:English – can の未来形
タイトルくらいわかりやすいと良いんですが、流れの中でポッと出てくると戸惑ってしまう。
極々個人的な経験で言うと、「意思の will」特に「頑なに〜しようとしない」の「won’t」は個人よりも物体であるとかちょっとした集団のポリシーに使われてるケースに出会う。”PS3 won’t work!”とか”We won’t do that ~”とか。
いわゆる未来の will も中学くらいでは「be going to と同じだよ」という教わり方をした(よね?)わけですけど、実は細かい違いがある。という事は予備校で知った。
で、ここでアサマシです。
大学受験で散々ブッコんだ英語知識も大学生になってからと言うもの、ボロボロと抜け落ちてしまった。それをある程度戻すのに役立ったのがこの本。「if の省略形仮定法」とか久々に思い出せた。
墺 タカユキ 石黒 昭博 桐原書店 売り上げランキング: 220
中学レベルから高校レベルまでの文法をザラっとすくっている内容。4色刷り。そして安い。各章が文法の形の解説で、基本→理解→応用のパターンがメイン。イラストをちょいちょい使ってるので、それも理解を助けてくれます。
ただ、しょーもない例文が多い。変にカッチョよくしてるのよか分かり易くて良いのかも知れないけど、ちょっと不満。あと大学に入った直後に出てるのも許せない。これが受験時期にあったら手元の文法リファレンスにしてた。ロイヤル英文法使ってました。懐かしい。
英文ブログとか読むには文法理解よりも語彙力が重要かなー。全然足りてない。
たまに堅めのコラムスタイルなブログを読む時には文法と英文解釈は必要に思える。
「英会話は単語だよ、単語!」みたいな事を言う人をみると「こやつめ、ははは」とか思ってたんですが、実際それは間違いなかった。
日本に来て半年のアメリカ人ゲームプログラマとゴールデン街で飲んだ事があって
俺「most Japanese が play する game は their friends が play してるヤツなんだよ」
彼「ah…モンハン?」
全然通じる。
PHPサイキョウ
「rocks」でやった結果。
- Results 1 – 10 of about 6,900 for “PHP rocks”
なるほど。
他はどうか。
- Results 1 – 10 of about 36,900 for “Ruby rocks”
- Results 1 – 10 of about 8,700 for “Python rocks”
- Results 1 – 10 of about 1,580 for “Perl rocks”
Ruby 圧倒的過ぎるだろ。
その他。
- Results 1 – 10 of about 10,100 for “C++ rocks”
- Results 1 – 10 of about 9,540 for “Java rocks”
- Results 1 – 10 of about 973 for “C# rocks”
- Results 1 – 10 of about 496 for “JavaScript rocks”
C++ と Java が大体同じくらいで Python より多い。意外。
ついでに「rules」でもやってみた。
- Results 1 – 10 of about 24,000 for “PHP rules”
すげえ!これは期待出来る!
- Results 1 – 10 of about 31,700 for “Ruby rules”
- Results 1 – 10 of about 9,690 for “Python rules”
- Results 1 – 10 of about 5,570 for “Perl rules”
Ruby 強すぎ。
おまけ。
- Results 1 – 2 of 2 for “UnrealScript rocks”
- Results 1 – 3 of 3 for “UnrealScript sucks”
『次世代 Mock Object フレームワークの雄』として一部から熱く注目されている(と思いたい) PHPMock ですが、ちょろっとテストコード読んだくらいで触った事が無かったのでトライ。
ちなみに PHPMock のテストコードは PHPSpec で書かれている。個人的には残念な書き味というか、読みやすくない。PHPUnit バンザイ。
ただ PHPUnit の Mock はもうちょっと融通利かせてもらえると有難い。という所で PHPMock はどうか。
Let’s do this.
PHPMock にはまともなドキュメントが一切無い。tgz 玉もないので Google Code からチェックアウトするしかない。specs ディレクトリにテストコードがあるのでこいつを見れば大体の使い方はわかる。test as document を地で行く感じだ。メソッド名は RSpec の mock/stub に似ているというか似せてある。
テストコードはこんな感じ。ダウンロードはこちら。
■ test/ProductServiceTest.php
<?php
define(DEMO_ROOT, dirname(dirname(_FILE_)));
require_once DEMO_ROOT . '/phpmock/src/PHPMock.php';
require_once DEMO_ROOT . "/lib/ProductService.php";
require_once DEMO_ROOT . '/lib/IDBConnection.php';
require_once DEMO_ROOT . '/lib/Publisher.php';
class ProductServiceTest extends PHPUnit_Framework_TestCase
{
const PRODUCT_ID = 1234;
public function test_プロダクトを全件取得する ()
{
$mockDb = PHPMock::mock('DBConnection');
$mockDb->shouldReceive('execute')
->withAnyArgs()
->once()
->andReturn(
array('name' => 'NINJA GAIDEN 2')
);
$this->service->setDBConnection($mockDb);
$this->assertNotNull($this->service->getAll());
}
public function test_プロダクトIDからパブリッシャの名前を取得する()
{
$mockPublisher =
$this->createPublisherMock(self::PRODUCT_ID);
$this->service->setPublisher($mockPublisher);
$publisher = $this->service->
getPublisherByProductId(self::PRODUCT_ID);
$this->assertEquals('Activision', $publisher['name']);
}
public function test_クイックモックでfindAllしてみる()
{
$mockPublisher = PHPMock::mock('Publisher',
array('findAll' => array()));
$mockPublisher->findAll();
$this->assertTrue($mockPublisher->verify());
}
public function test_引数がマッチしなければ例外を投げる()
{
$mockPublisher =
$this->createPublisherMock(self::PRODUCT_ID);
try {
$mockPublisher->findByProductId(9999);
} catch (Exception $e) {
return;
}
$this->fail("An expected exception has not been raised.");
}
public function test_PHPUnitのMockObjectはこんな感じ()
{
$mock = $this->getMock('DBConnection',
array('execute', 'preparedStatement'));
$mock->expects($this->once())
->method('execute')
->will($this->returnValue('aaaa'));
$this->assertEquals('aaaa', $mock->execute("sql statement"));
}
public function createPublisherMock ($productId)
{
$mock = PHPMock::mock('Publisher');
$mock->shouldReceive('findByProductId')
->with($productId)
->andReturn(
array('name' => 'Activision')
);
return $mock;
}
public function setUp ()
{
$this->service = new ProductService;
}
public function tearDown ()
{
}
}
で、このコードは実行すると「test_引数がマッチしなければ例外を投げる」でコケる。
PHPMock_Expectation#matchArgs に問題があって
■ phpmock/src/PHPMock/Expectation/Expectation.php
public function matchArgs(array $args)
{
if (empty($args) && empty($this->_expectedArgs) && is_array($this->_expectedArgs)) {
return true;
} elseif ($args == $this->_expectedArgs) {
return true;
} elseif ($this->_expectedArgs == true) {
return true;
} elseif ($this->_expectedArgs == false && empty($args)) {
return true;
}
return false;
}
「$this->_expectedArgs == true」これだと $this->_expectedArgs に値が入ってれば true になっちゃうという良く話題になるアレです。正解は「$this->_expectedArgs === true」これですな。
上のコードで使っている DBConnection はインターフェースで Publisher は空っぽのクラス。
インターフェースに定義されているメソッドは PHPMock#_generateDefForMethods がよしなに実装してくれるので安心。PHPUnit の Mock Object だと定義したメソッドをイチイチ配列で全部ツッコまないといけない。
いわゆるスタブは無くて shouldReceive 一本になると思われる。
PHPMock#mock の第二引数に array($methodName => $returnValue) を与える事で簡単にモックが作れるのは好感。
■ まとめ
- まだまだ挙動が怪しい点はある
- それでも PHPUnit の mock よりは楽できる
- テストコード内でザクザクモック作りたいなら MockInterceptor よりオススメ