2013年8月31日土曜日

Google App Engine SDK for PHP を使ってみた

Google App Engine を1年ぶりいじることにしたのですが、さっぱり忘れていたので備忘録としてこれを残しておきます。
今回、Google App Engine を使った目的はこちらになります。

当初は Python を使うことを想定していましたが、PHP の SDK が出ていました。
preview 版のようでしたがサイト監視を PHP で書いていたので、使ってみることにしました。

では、さっそくセットアップからしていきましょう。

環境セットアップ
ダウンロード
環境のダウンロードはこちらから行います。

で、SDK をダウンロードするには Limited Preview に登録しないといけないとのこと。
リンクをクリックすると Google App Engine for PHP のページが開くので、「Register for the Limited Preview」のボタンをクリック。


ログインしていたら、「Congratulations, you've been whitelisted!」と出るので、これで終わり。
セットアップ方法のページへのリンクがあるのでそこを開きます。
Windows なので、「Installing on Windows」を開きます。

そこに書かれているとおりに Python 2.7 と PHP 5.4 をダウンロード、展開します。
PHP は「VC9 x86 Thread Safe」です。
展開後、それぞれパスを通しました。

つづいて、SDK をダウンロードします。
こちらも .zip ファイルになっているので、適当な場所に展開します。

Hello World!
ダウンロードができたら、さっそく試してみましょう。こちらを参考に進めていきます。

適当なフォルダに .php ファイルを作り、簡単なコードを記述します。
<?php
    echo 'Hello World!';
(> で閉じなくていいのか…)

続いて app.yaml ファイルを作成します。
ファイルの内容は以下のように記述します。
application: sample
version: 1
runtime: php
api_version: 1

handlers:
- url: /.*
  script: sample.php
script のところは先ほど作成した php のファイル名を設定します。
このファイルは php ファイルと同じディレクトリに保存します。

次に、コマンドプロンプトを開き、
以下のコマンドを入力してテストサーバーを起動させます。
dev_appserver.py --php_executable_path=C:\Users\hogehoge\php ./sample
php_executable_path には php-cgi のあるパスを絶対パスで、
最後の引数には php と app.yaml ファイルのあるパスを渡します。

サーバーが起動したら、ブラウザで以下の URL を開きます。
http://localhost:8080/

すると、ブラウザに Hello World! と表示されます。
のはずでしたが、エラーが出ました。


エラー文でぐぐったらドンピシャな答えがありました。
google app engine - Permission denied error when i try to start appengine php server - Stack Overflow

--php_executable_path には php-cgi.exe のあるディレクトリパスではなく、php-cgi.exe のパスそのものを指定する必要があったようです。
dev_appserver.py --php_executable_path=C:\Users\hogehoge\php\php-cgi.exe ./sample

うまくいきました。


次に目的の php に差し替えてテストし、動作することを確認しました。
(今回は使わないので、いくつかのスタートガイドを飛ばしてます。)

アップロードする
まずはアプリケーションを作成します。
https://appengine.google.com/ にアクセスし、「Create Application」のボタンを押します。
必要な項目を記入して、もう一度「Create Application」ボタンを押すと作成完了です。
作成できたら、app.yaml ファイルの application の名前を登録したアプリケーションIDに変更をしておきます。
今回は便宜上 hogehoge とします。

次に以下のコマンドを実行します。
appcfg.py update sample/
最後の引数はファイルのあるパスを指定します。
実行するとメールアドレスとパスワードを聞かれるので入力し Enter 。
正常に終了すると「PM Competed update of app: hogehoge, version 1」と出力されます。

最後に、アップロードしたアプリケーションにアクセスしてみましょう。
ブラウザで http://hogehoge.appspot.com を開くと実行されます。

次回
今回無事にアップロードでき、これで目的の php が実行できるところまで出来ました。
次回は、スケジューリングとメール送信に対応していきたいと思います。

また、つづく。

2013年8月26日月曜日

PHP で HTML 解析してみた

とあるサイトで状態の変化を監視してメール通知したいなぁーと思い作ってみました。

なぜ、PHP かというと twitter の bot を作った時にいじっていたことと、
なんか簡単にできそうだったから。

参考サイト:
たった3行のコードでひたすらアイドル水着画像をあつめる(PHPで)

PHP Simple HTML DOM Parser
PHP Simple HTML DOM Parser を使いました。
これのおかげでスゴク楽に書けました~(^0^)

Jenkins の設定
メール通知とかは Cloudbees の Jenkins 使ってやりました。
プロジェクトの設定はマトリックスにして、
定期間隔に問い合わせをするジョブ(1時間分) x 必要な時間分の構成
という形にしました。

拡張E-mail プラグインが使えないのが残念ですが、
目的は果たせたので満足満足。



然うは問屋が卸さない

無料分を使いきってしまった
Cloudbees の無料の制限って、300「ビルド」だと思っていたら 300「分」だったみたいで、
(min って書いてあるし、数値の変動が腑に落ちないとは思っていたのだけど…)
1時間 x N のジョブを実行したため、あっ…という間に制限超えてしまいましたorz...

Google App Engine を使うことにした
無料でメール送信可能で cron として利用可能なサービスということで、Google App Engine を使うことにしました。
bot 作ったときも利用したのですが、メール送信も可能らしいのでこちらを選択しました。

使ったことあるしーと思ったのですが、何しろ1年以上前のことなのでサッパリ覚えてません。
というわけで、備忘録がてらにまとめつつやろうかと思います。

つづく。

2013年8月20日火曜日

iutest_c v1.3.0 をリリースしました

iutest_c 1.3.0 をリリースしました。

今回の変更点は以下のとおりです。

  • iuCombine を追加
  • IUTEST_*_FATAL_FAILURE, IUTEST_*_NON_FATAL_FAILURE を追加
  • IUTEST_*_NO_FATAL_FAILURE, IUTEST_*_NO_FAILURE を追加
  • 明示的な成功と失敗を追加
  • 値のパラメータテストの明示的登録に対応

iuCombine を追加
今回の変更での目玉です。
v1.2.0 で値のパラメータテストに対応しましたが、Values と Range しか使えませんでした。
今回 v1.3.0 で iuCombine を追加し、パラメータの組み合わせテストを書けるようになりました。

iuCombine の使い方は iutest や gtest のそれとは少し違うので簡単にですが説明しておきます。

typedef IUTEST_P_TYPE((int, char, unsigned int)) TestCombineParamType;
IUTEST_INSTANTIATE_TEST_CASE_P((int, char, unsigned int), A
                               , TestCombine, iuCombine
                               , (iuRange, ( 0, 2)), (iuStepRange, (100, 110, 2)), (iuValues, (0, 4, 2)) );

IUTEST_P(TestCombineParamType, TestCombine, Test)
{
    const int x0 = param.value0;
    const char x1 = param.value1;
    const unsigned int x2 = param.value2;
    iuConsole_Output("%d %d %d\n", x0, x1, x2);
}
まずはじめに、IUTEST_P_TYPE マクロを使ってパラメータの型を定義します。
第一引数に、型のリストを()で括った形(以下、タプルと呼びます)で渡します。
これは、IUTEST_P のテスト関数に渡されるパラメータ変数の型として使います。

次にテスト関数を作成します。
こちらは通常の値のパラメータテストと同じように IUTEST_P で定義します。
第一引数に先ほど定義した型を指定、
第二引数がテストケース名、第三引数がテスト名です。

次に組み合わせを作成します。
IUTEST_INSTANTIATE_TEST_CASE_P を使うのは通常の値のパラメータテストと同じです。
第一引数には、IUTEST_P_TYPE で渡したものと同じ型のリストをタプルで渡します。
(※ 2回も書く必要があって面倒ですが…)
第二引数には、このパラメータのインスタンスのプレフィックス名を渡します。
これは重複しない名前ならなんでも構いません。
第三引数にはテストケース名、第四引数に iuCombine を指定します。

ここからが iuCombine の特殊な書き方になります。
第五引数以降には、iuCombine のパラメータを渡します。
個々のフォーマットは、
( ジェネレータ名, (ジェネレータのパラメータ) )
のようになります。
ジェネレータとジェネレータのパラメータを () で一纏めにして渡しています。
また、ジェネレータのパラメータもタプル形式でまとめています。
ジェネレータには iuValues や iuRange などが使用できます。

最後にパラメータの取り出し方ですが、
IUTEST_P のテスト関数に param 変数名でパラメータを保持した構造体が渡されます。
各パラメータは param.value0,param.value1... のように格納されているので、
そこから参照することができます。

実行するとこんな感じになります。


IUTEST_*_FATAL_FAILURE, IUTEST_*_NON_FATAL_FAILURE を追加
gtest における spi にあたる機能に対応しました。
若干ログメッセージがあれですが、とりあえずテストが失敗することを検証できるようになりました。

IUTEST_*_NO_FATAL_FAILURE, IUTEST_*_NO_FAILURE を追加
今度は逆に、テストが失敗していないことを検証するマクロです。
サブルーチンで発生したテスト失敗を検知するために使ったりします。

明示的な成功と失敗を追加
表題通り、明示的な成功と失敗に対応しました。

値のパラメータテストの明示的登録に対応
v1.2.0 のバグ修正です。
テスト関数の自動登録が使えない環境では、テストを明示的に登録する必要がありますが、
値のパラメータテストの関数が登録できないバグを修正しています。

次のバージョン
次のバージョンでは組込み環境で使ってみたりして、コードサイズとか細かいところをケアしていこうと思います。

2013年8月12日月曜日

続・Arduino はじめました

Arduino の続報です。

あれから、ちょっと忙しくて全然コードを書けていない状態です…

とりあえず、ブレッドボード使って LED チカチカさせました。
そもそもブレッドボードってなんだ
そもそもブレッドボードの使い方がわからない、ってことでググったらいっぱい情報がでてきた。


とりあえず、+(赤) と -(青)は一直線につながっている。
それ以外は縦のラインがつながっているってことは理解しました。


(これは別のブレッドボードですが、こうやってみるとわかりやすいですね。)

調子に乗った…
13pin からの出力で LED チカチカはできたので、他のこともしてみようと
Arduino の 5V 出力から電源を取って、LED を接続してみたところ、

見事に焼き切れたΣ(゜□゜)っっ

とっても芳しい香りが…
あぁ、そうか。ですよねぇ…
抵抗つけなきゃダメですよねぇ…

LED マトリックスも届いたけど、先が不安…

2013年8月6日火曜日

[Visual Studio] 検索対象が「現在のドキュメント」に戻る

Visual Studio で検索をかけようとして [Ctrl + Shift + F] して検索文字列入力してリターン!タタターン!



だが、ヒットするはずなのに何もヒットしないっ…




と思ったら、検索対象が「現在のドキュメント」に戻ってる…





なんてことがたまにおこる。
発生条件を調べようと思って、色々試してもその時は再現しなくて、忘れた頃に発生する…


誰か原因・条件知りませんか?