開発時のテスト用に、呼ぶたびに2つの値(緯度・経度)の値が0.1ずつ増えて表示されるようなPHPスクリプトが欲しくなりました。
セッションが使えれば良いのですが、今回はクライアント側が特殊で上手く使えないため、サーバ上のファイルに保存してしまいます。
要するに値が2つ保存されるアクセスカウンタと同じです。とにかく、例外処理などを省いて簡単にすることだけを考えてみます。
//初期値 (BPSの位置です)
//35.508642
//139.442771
$latitude = 35.508642;
$longitude = 139.442771;
//前回のデータを読み込む
$data = eval('return ' . file_get_contents('data.txt') . ';');
if (is_array($data)) {
extract($data);
}
$latitude += 0.1;
$longitude += 0.1;
//新しいデータを保存
file_put_contents('data.txt', var_export(array('latitude' => $latitude, 'longitude' => $longitude), true));
//表示
echo $latitude . '\n' . $longitude;
突っ込みどころ満載ですが、スクリプト言語なんだから、たまにはevalが使いたいなーと思って書いただけですので・・・
Visual Studio 2010 beta特有の問題かもしれませんが、windows.hをincludeしたときに、以下のようなエラーが出る場合があります。
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\objidl.h(11280): error C2061: 構文エラー : 識別子 ‘__RPC__out_xcount_part’
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\objidl.h(11281): error C2059: 構文エラー : ‘)’
c:\program files (x86)\microsoft sdks\windows\v7.0a\include\objidl.h(11281): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。

エラー
これは、objidl.hの読み込み順序が影響しているようです。
プロジェクトの設定→構成プロパティ→VC++ Directories→Include Directoriesで、objidl.hのある以下のディレクトリを追加すると直りました。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

Includeディレクトリの設定

Includeディレクトリを追加
WordPressでも、ページを上手く使えばTOPページなどの各種ページを作って、それぞれにテーマを割り当てることが出来ます。
これらのページをCMS管理する際、ページコンテンツをすべて1ページにしてしまうと、編集者がうっかりHTMLを書き換えて、レイアウトが崩れてしまう恐れがあります。
そこで、「新着情報」「ごあいさつ」のように1ページ内の各種コンテンツごとにページを用意すれば、安全に編集できます。
テーマファイル内で特定ページの内容を表示するには、以下のようにします。
<?php
$page = query_posts('pagename=news');
echo $page['page_content'];
?>
このようにquery_postsを使えばOKなのですが、ページID指定の p=2 といった書式では、ページを取得できません(投稿のみ対応しているようです)。
かならず、pagename=news のようにページスラッグを指定する必要があります。
テーマファイルとページが強く結合してしまい、美しい使い方とは言えませんが、WordPressで綺麗さを追求すると痛い目を見るので・・・
週末のお楽しみ、町田へ買い物に行ってきました。
会社用に買ったもの:DVIケーブル、HDMIケーブル、LANケーブル、PCI-E電源変換コネクタ等

会社用に買ったもの
趣味で買ったもの:CPUクーラー、HDD

趣味に買ったもの
なんだか疑われそうな買い物になってしまいました。
もう少し趣味の範囲を広げていった方が良さそうです。
それから、町田のブックオフに改装してから初めて行ってみました。東急の上に移る前と同じ場所です。
さすが全国最大級だけあって、品揃えが素晴らしい。とりあえず、ビジネス関係の本を5冊くらい買ってみました。
町田は歩いて買い物に行くのに丁度良くて好きです。
Ajaxを使う際、PHP側からJSON形式の値を出力したいことは良くあると思います(入力はだいたいPOSTで事足りますね)。
PHPでJSON形式の値を出力したい場合、いちばん簡単なのはjson_encode()です。
//本来はheaderなども正しく処理した方が良いが省略
$list = array('apple', 'orange', 'banana');
echo json_encode($list);
ただし、json_encode()はPHP 5.2.0以上の関数なので、それ未満の環境だとundefined functionでエラーになります。
http://php.net/manual/en/function.json-encode.php
リリース後にPHPのバージョン違いに気がついた可哀想な人には、Zend_Jsonがおすすめです。
まずはZend FrameworkのページからZend Frameworkをダウンロードします(minimalでOK)。
そして、回答したフォルダのZend/Json.phpと、Zend/Jsonフォルダをinclude_pathが通ったフォルダにコピーします。
あとは、コード内で
require_once 'Zend/Json.php';
$list = array('apple', 'orange', 'banana');
echo Zend_Json::encode($list);
とやるだけ。
関数の名前が変わるだけで、同じ使い勝手が実現できていますね。これなら一括置換も簡単。
iPhoneでXML_RPCを使おうとすると、地味に苦労します。
XMLParserはあるので、自力でやっても良いのですが、出来ればライブラリが欲しいですよね。
eczarny xmlrpcがiPhone対応ということですが、私の環境ではターゲットをiPhone OSにするとビルドエラーが出ました。
MacOSをターゲットにすると正常にビルドできます。NSXMLDocumentなどを内部で利用しており、これがiPhone非対応なのが原因みたいです。2.0~2.2.1まで全滅でした。
ということで他を当たったところ、WordPress for iPhoneの内部で使われているものが良さそうでした。
これもeczarmy xmlrpcをベースに作られているようですが(未確認)、iPhoneでもちゃんと動きます。
ということで、以下からソースコードをダウンロードします。ライセンスはGNU GPLでした。
http://iphone.trac.wordpress.org/browser(trunkを開いて、下の方にあるZip Archiveをクリック)
色々入っていますが、Classes/XMLRPCフォルダ丸ごとと、Classes以下でファイル名に「+」が含まれるものを全部コピーして、プロジェクトにインポートすればOKです。

このようにインポートします
使い方は、以下のようにやります。
#import "XMLRPCRequest"
#import "XMLRPCResponse"
#import "XMLRPCConnection"
- (void)test {
//requestを生成
NSURL *url = [NSURL URLWithString:@"http://www.bpsinc.jp"];
XMLRPCRequest *request = [[XMLRPCRequest alloc]initWithHost:url];
[request setMethod:@"Test.version" withObjects:[NSArray array]]; //引数を指定するときはarrayの部分にデータを入れる
NSLog(@"%@", [request source]); //XMLRPCのリクエストソースが見られます
//通信
XMLRPCResponse *response = [XMLRPCConnection sendSynchronousXMLRPCRequest: request];
NSLog(@"%@", [response source]); //XMLRPCのレスポンスソースが見られます
NSLog(@"%@", [response object]); //objectメソッドは、戻り値の型になります。サーバ側で明示的に型を指定しましょう
}
ソースコードは短く読みやすいので、簡単に使いこなせると思います。
非同期通信は、以下の2つを実装すれば、XMLRPCConnectionのinitWithRequestで実行できます。
- (void)connection:(XMLRPCConnection *)connection
didReceiveResponse:(XMLRPCResponse *)response forMethod:(NSString *)method;
- (void)connection:(XMLRPCConnection *)connection
didFailWithError:(NSError *)error forMethod:(NSString *)method;
XML_RPCのクライアントを開発するとき、ダミーでサーバが必要になります。
手っ取り早いダミーとして、PHPのPEAR::XML_RPC2が便利です。以前クライアント側は紹介しましたが、今回はサーバの超基本的な使い方。
ダウンロード
http://pear.php.net/package/XML_RPC2からダウンロードできます。
使い方
適当な場所に設置したら、以下のようにincludeして、各アクションに対応する関数を定義します。
そして、XML_RPC_Serverでアクション名と実行するアクションの対応を配列で渡せばOKです。
require_once("XML/RPC.php");
require_once("XML/RPC/Server.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";
function version($params) {
return new XML_RPC_Response(new XML_RPC_Value('1.0', 'string'));
}
function average($params) {
$v1 = $params->getParam(0)->scalarval();
$v2 = $params->getParam(1)->scalarval();
return new XML_RPC_Response(new XML_RPC_Value($v1 + $v2, 'int'));
}
new XML_RPC_Server(array(
"Test.version" => array("function" => "version"),
"Test.average" => array("function" => "average"),
));
とってもかんたん。
先日に引き続き、timeoutIntervalが無視される件について。
POSTする際は、NSMutableURLRequestを用いて、setHttpBodyでPOSTデータを入れます。
しかし、これを行うとtimeoutIntervalが強制的に240秒に設定されてしまいます。
さらに酷いことに、その後setTimeoutIntervalを行っても無視されます。
以下検証コード↓
NSURL *url = [NSURL URLWithString:@"http://www.bpsinc.jp"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSLog(@"%g", [req timeoutInterval]); //60
[req setHTTPBody:[NSData data]];
NSLog(@"%g", [req timeoutInterval]); //240
[req setTimeoutInterval:10.0];
NSLog(@"%g", [req timeoutInterval]); //240
これはCocoaのバグでしょうか?
あまりに酷すぎるので、何か基本的な間違いを犯していると信じたいところです。
どなたか情報をお持ちなら教えて下さい!
1月14日追記
詳しい方から、「仕様です」との情報を頂きました。
非同期通信を使って、タイムアウトは自分で処理する必要があるそうです・・・
突然ですが、僕は文章を書くのが下手です。なので
所々見にくい箇所があったり、急に書き方が変わったりするかもしれませんが
どうか温かい目で見てやってください。。。
0.2 環境変数の設定
環境変数ってなに?
詳しい説明を書いても、ここではあまり理解しにくいと思いますので
読んでみて、良く分からなくても、先に進んでしまってください。
やっているうちに、分かると思います。
実はこの環境変数、する必要がありません。
「しなくてもできる」と書いた方が正しいかもしれません。
しかし、環境変数の設定をしない場合
例: C:\WORK>C:\Program Files\Java\jdk1.6.0_17\bin\javac HelloWorld.java
プログラムを実行するたびに、このような長い文字を書かなければならないのです。
(詳しいプログラムの実行の方法については別の記事に書きます)
これはとても面倒なので、簡略化するためにするのが「環境変数の設定」です。
「プログラムのファイルを実行する時、分からなかったらここを見てね」と
パソコンにお願いしておくようなものでしょうか?
(この書き方は正確ではないかもしれませんが、こんな感じだと思います)
どうやって設定するの?
1. マイコンピュータを右クリック
2. プロパティをクリック
3. 詳細設定タブをクリック
4. 環境設定をクリック
5. 「○○(アカウント名)ユーザの環境変数」または「システムの環境変数」のどちらでもいいので「PATH」があるか確認
6. PATHがない場合は、「新規」から変数名をPATH、変数値をJDK内のbinファイルの絶対パス
(例:C:\Program Files\Java\jdk1.6.0_17\bin)で新しく作成
7. PATHがある場合は、「編集」から変数値を「元々の変数値;JDK内のbinファイルの絶対パス」
のように、セミコロンをつけて並べて編集
以上で設定が完了しているはずです。
とりあえずやったけど、本当に設定できてるの?
確認できているかどうか、確かめてみましょう。
1. スタート→すべてのプログラム→アクセサリ→コマンド プロンプト を選択
2. javac と入力してみる
3. java と入力してみる
2と3で、よくわからない文字がいっぱい出てきたら、とりあえず成功です。
(現段階では気にする必要はありませんが、出てくる文字はそれぞれのhelpです)
「見つかりません」のようなメッセージが出てきた場合は、何かが失敗しているので調べて治しましょう!
余談
知らなくても支障はないので詳しくは書きませんが、実は上記の”javac”は最初のほうに書いた
例: C:\WORK>C:\Program Files\Java\jdk1.6.0_17\bin\javac HelloWorld.java
の代わりをしてくれています。毎回これを書くことを思えば、やはり設定した方がいいですね。
「読もうと思っていた本を家に忘れて、急遽会社で手軽そうな本を借りてみた」
「簡単そうで、短時間で読み終わる本が良い」
・・・読み始めた動機が不純です。

通勤電車で寝てはいけない!―通勤電車と成功の不思議な法則
著者/訳者:久恒 啓一
出版社:三笠書房( 2006-05 )
定価:¥ 1,050
Amazon価格:¥ 1,050
単行本 ( 173 ページ )
ISBN-10 : 4837921906
ISBN-13 : 9784837921905
そんなわけで、あまり収穫のない本でした。
内容は
- 通勤電車で1時間以上座っていける場所に住み、電車を書斎にする
- 早起きをして朝の時間を活用
- 継続は力なり
と、最初以外はごく一般的なタイムマネジメントの一部を切り出したものです。
で、主題の「通勤電車を書斎にする」ですが、いまいち賛成できません。
確かに、家が近いとだらだらする時間が増えるというのはあるかも知れませんが、それを強い意志で克服している人が身近にいるので、非効率な逃げ道に頼らず、それを見習いたいものです。
読んでいて一番違和感を感じたのは、「会社から遠くに住むことで家賃も安くなる」という記述でした。
交通費は会社が出すから自分の懐は痛まない。
確かに社員はそれでも良いのかもしれませんが、見習いたくない考え方ですね。