2010/01/31

[本]学校の勉強だけではメシは食えない!

先ほど、読了
学校の勉強だけではメシは食えない!―世界一の職人が教える「世渡り力」「仕事」「成功」の発想
学校の勉強だけではメシは食えない!―世界一の職人が教える「世渡り力」「仕事」「成功」の発想
岡野 雅行

1章 「人間関係のカラクリ」がわからないキミたちへ!

2章 「自分の夢のかなえ方」がわからないキミたちへ!

3章 「どんな仕事についたらよいか」がわからないキミたちへ!

4章 「成功するためのプラスα」がわからないキミたちへ!

5章 「アイデアの出し方」がわからないキミたちへ!

6章 「人生の壁の乗り越え方」がわからないキミたちへ!

via:目次

弾さんの
岡野節ベスト - 書評 - 学校の勉強だけでは飯は食えない!
と弾言で紹介されていたので読んでみました。

本書は、世界一細い注射針と携帯電話のバッテリーケースを作りケータイを普及させた岡野さんがQ&A方式で43の質問について仕事や遊びになど語っているのですが、読んでいて考えが後押しされたような気分がしてホットしました。

やはり腕に職をつけた方がいいんだなーって。
職人はお金のことを考えずにいいものを作る為にひたすら誰もやっていないことをやれと。

確かに、なんの見返りや報酬をもとめずにiGoogle gadgetをたくさん作った結果、この前、gadget venturesに応募できたし、仕事とは全くもって関係ないけどiPhoneのアプリを作ったことによってインタビューを受けたりと、無意識の内に結果に繋がり、何か上の内容と通じるもがあったんじゃーないのかなと。

本書では「技術」といってもITや製造業といった業界に使われる技術ではなくて、もっと広い意味として「技術」という言葉を定義していました。

技術=人よりも突出している能力

と解釈。

もっともっと腕に磨きをかけて、頑張るぞ〜っと♪



2010/01/30

[oracle]Tableの複製

TABLEの複製する方法について、ざっとこんな感じでいけるんじゃーないのかなと。

create table table_name_to
as
select *
from table_name_from
;

エクスポート、インポートを行わず、同じDB上でデータのバックアップがとれるので、便利です。

2010/01/29

[OAuth][php]UnAuthorizedRequestTokenを取得するリクエスト

今、データをクラウドに保存する候補として、Google App Engineももちろんのこと、Google Fusion Tablesも検討の一つに入れています。

Google Fusion Tables上にあるデータをやりとりするためには、OAuthが必要ということで、さっそく調査をしてみました。

まず、認証の流れはこちらにあってちょっと説明が長いので割愛。

リンク先の1と2について書いてみたいと思います。

UnAuthorizedRequestTokenを取得するためにリクエストを出すのですが、主なパラメータはOAuthGetRequestTokenにあって、これをもとにphpで表現するとこんな感じになりました。

mb_http_output("utf-8");
require_once('HTTP/Request.php');

//urlの設定
$url = 'https://www.google.com/accounts/OAuthGetRequestToken';

$method = "GET";

$params["oauth_callback"] = rawurlencode("コールバック先のurl");
$params["oauth_consumer_key"] = "anonymous";
$params["oauth_nonce"] = md5(microtime().mt_rand());
$params["oauth_signature_method"] = "HMAC-SHA1";
$params["oauth_signature"] = "";
$params["oauth_timestamp"] = time();
$params["oauth_version"] = "1.0";

$params["scope"] = rawurlencode("http://tables.googlelabs.com/api/query");

$params["oauth_signature"] = make_Signature_Base_String($method,$url,$params);
$params["oauth_signature"] = base64_encode(hash_hmac("sha1" ,$params["oauth_signature"],"anonymous&",true));

$request = new HTTP_Request();
$request->setURL($url);

$request->addHeader("Authorization"," OAuth");

$request->
addQueryString("oauth_callback",$params["oauth_callback"],true);
$request->
addQueryString("oauth_consumer_key",$params["oauth_consumer_key"],false);
$request->
addQueryString("oauth_nonce",$params["oauth_nonce"],false);
$request->
addQueryString("oauth_signature_method",$params["oauth_signature_method"],false);
$request->
addQueryString("oauth_signature",$params["oauth_signature"],false);
$request->
addQueryString("oauth_timestamp",$params["oauth_timestamp"],false);
$request->
addQueryString("oauth_version",$params["oauth_version"],false);

$request->addQueryString("scope",$params["scope"],true);

//メソッドをセット
$request->setMethod($method);

//リクエストを実行
$result = $request->sendRequest();
$ret = $request->getResponseBody();

print($ret);

function make_Signature_Base_String($aMethod,$aUrl,$aParams){
$ret = "";
foreach($aParams as $key => $value){
if($key != "oauth_signature"){
$ret = $ret."&".$key."=".$value;
}
}
$ret = substr($ret,1);
$ret = rawurlencode($ret);
$ret = $aMethod."&".rawurlencode($aUrl)."&".$ret;
return $ret;
}

これを実行すると、結果として
oauth_token=hoge1&oauth_token_secret=hoge2&oauth_callback_confirmed=true

みたいな感じで表示されると思います。

一番悩んだのが、oauth_signatureを作り方。。。
(まる3日間悩みました。)

アルファベット順に並べてエンコードをかけるというところまではオッケーだったのですが、コールバック関数にあらかじめエンコードをかけておく必要があり(つまり2回エンコードする)、さらに、hash_hmac関数の第二引数の最後に「&」が必要だというのに気づくのにすっげー苦労した。

どうして気がついたのかというと、[OAuth]PHPを読んだことある人のためのOAuthのSignature解説に紹介されていたPHP用ライブラリのプログラムを読んで気がつきました。

次回は、ここら先について書きいきたいと思います。

2010/01/28

[oracle]閏年の確認

oracleで閏年の確認方法は下のように叩けばオッケー♪

--うるう年検索

--2006年2月28日を返す
select last_day(to_date('20060301','yyyymmdd')-1)
from dual
;

--2004年2月29日を返す
select last_day(to_date('20040301','yyyymmdd')-1)
from dual
;

これで、DB側での閏年確認も怖くないぞと。

2010/01/27

やっと念願の念願の

ドラゴンクエスト9をゲットしました。
(と言っても去年のくれにゲットしたのですが。)

しかし、しかしだが、仕事が忙しくてまだ封からあけていないのと、クロノトリガーもまだ全面クリアーしていない状況で、しかもドラクエ6も今度リリースされるんですね。

すっげー欲しい。

2010/01/26

[iPhone]アプリ3個目Gozzurl(ゴザール)リリース

やっとこさ、審査が通りましたので、3個目のアプリをリリースします。

その名もGozzurl
icon
(通称:ゴザール)

このアプリは、ソーシャルブックマークサイトのBuzzurl新着エントリーと、Myエントリーを表示するアプリです。

タブが3つにわかれていて、一番左のタブは、新着エントリーを表示します。
Photobucket

つづいて、2番目は、Myエントリーを表示する画面です。
Photobucket
リンクの部分をタッチすると、実際のページに遷移します。
Photobucket

Myエントリーは、ユーザー登録をしていないと表示することができなくて、登録は、無料でBuzzurlで行うことができます。
ユーザー登録をされている方は、アプリの一番右の設定ページで半角英数字または「_」、「-」を入力することによってMyエントリーを表示することができます。

もちろん一度設定していただいたユーザー名は次回以降入力していただく必要はありません。
(もし、Buzzurlサイトでユーザー名を変更した場合は、こちらのユーザー名も変更していただく必要があります。)

是非、よろしく御願いいたします。

2010/01/25

[PHP]@(アットマーク)出現の意味とは?

PHPのオープンソースを見ながら勉強しているのですが、その中で、変数名の前に、「@」(アットマーク)がついているものがありましたが、これって一体名に?

ぐぐってみると、お友達がその答えを書いていたので、ここで引用を

$test = @$_GET["test"];

とすると、エラーが出なくなります。

この@(アットマーク)は「エラー制御演算子」といって、エラーがあってもエラーメッセージを出力させないようにさせるためのものらしいです。

via:PHPでの@(アットマーク)の意味

つまりエラーを回避できるみたいなんだけど、、、

そもそも回避しちゃっていいのだろうか?とちょっと突っ込みを入れたくなってしまうような。。。

2010/01/24

[本]インターネット

ついさっき読了



序章 インターネットの力
第1章 インターネットの仕組み
第2章 インターネットの空間
第3章 メディアとしての可能性
第4章 インターネットの変遷
第5章 インターネットの重要課題

via:目次

本書は、弾さんの#空気本_ - 小飼弾が選ぶ最強の100冊+1で紹介されていたので、さっそく読みました。

インターネットって一体なんなの?というところからスタートしてその特徴や歴史|遷移、課題などが論じられている本書なのですが、4章当たりから、物語調になっていて、まるでフィクション作品を読んでいるような感覚になりました。

それもそのはずです。

なんと、著者は、IETFから選ばれるIABの初めてのアジアのメンバーとして選ばれ、まさに今のインターネットの基礎を作り上げためちゃくちゃすごい人なんですね。
(リンクを貼りましたが、詳細を知りたい方は本書で。)

ブロードバンド接続が当たり前となってしまった今ではとても想像できないのですが、当時、日本にインターネットを普及させる時に発生した課題などが鮮明に書かれていて、おもしろかったです。

勉強になったのは、どうしてドメインが「co.jp」や「com」みたいになったのか?というところ、とCSMA/CDが具体的にどうなっているのか?というところ。

後、最初に手にとってびっくりしたのが、インターネットの概念を説明するために、図や表がでてくるのかなーっと思ったら一切でてこないで字しかなかったこと。
これで、インターネットの説明ができるのかなーっと思っていたのですが、「鉄道」の仕組みを取り入れてわかりやすく説明されていました。

ただ本当にインターネットを知らない人が読むのは若干難しいんじゃーないのかなーっと。あくまでネットをちょこっとでもやったことがある人が、「理論的にインターネットって何?」という問題を解決するために読むべき本書だと感じました。

そう言った意味では、大学の一般教養の教材にもいいのかも。ちょーど本格的にパソコンを使った勉強を始めるので。
(しかし、最近は、小学生からパソコンの授業があるので、ひょっとしたら、小学校の時から読んだ方がいいかもしれない。ちなみに、小学生からパソコンの授業があることを知っているののは、小学生の子供を持っていらっしゃる仕事仲間から聞いた情報だからです。)

結論として、「インターネットって何なの?」というのを理論的にかつそれほど難しい内容に入ることなく知りたい人におすすめの一冊かなと。

2010/01/23

[oracle]spool機能

実行したsqlの結果を残しておくための機能としてh、spool機能というものがあります。

これは下記のようにsqlをたたきこめばオッケーです。

spool C:¥test.txt
・・・
sql文を入力
・・・
spool off

するとこの場合は、test.txtに入力したsql文の実行結果が残るわけです。

後でデバッグする時に便利かなと。


2010/01/22

[iGoogle gadget]Google Gadget Venturesに応募しました

goo辞書が、250000ユーザーを突破し、Google Gadget Venturesの応募資格を満たしたので、勢いでGoogle Gadget Venturesに応募しちゃいました。

Ventures形態として
Grants
Seed investments
の2種類があって、
1.Grants:$5000
2.Seed investments:$100000
(ただし、2の場合、事業計画書が必要ともに1の受け取った方のみ対象)
それぞれ出資していただけるシステムとなっています。

詳しい説明は
Itmediaのガジェット作者に資金援助する「Google Gadget Ventures」
Google、ガジェット開発者への投資を行うGoogle Gadget Venturesを開始
に書いてあります。

上記に加えてProgram FAQを読んで調べてわかったことを書くと、
応募するには、
a:18歳以上。
(Eligibilityの4に該当)
b:2のSeed investmentsを受け取るには、アメリカで始める必要がある。
(Eligibilityの5に該当)
c:応募自体は無料。
(How to applyの6に該当)
d:提案書には、
・メールアドレス
・gadgetのURL
・ガジェットを作る上で工夫した点
・開発工数
を記載する。
(How to applyの2に該当)
e:受理できるかどうかの返信に、だいたい一ヶ月ぐらいかかる。
(How to applyの10に該当)
g:2のSeed investmentsの場合、事業のオーナーシップはgoogleがもち、1のgrant(補助金)の場合、googleは事業のオーナーシップを持たない。
(General informationの4に該当)

Seed investmentsを受けるには、アメリカに住んでいる必要があるため、今回は、Grantsとして応募しました。

Program FAQを読んでみると、返信は、だいたい1ヶ月ぐらい後でくるのではないかと。

これで、もし審査が通れば、google本社から出資をしていただいた初の個人の日本人開発者になっちゃうじゃーないの??と期待に胸を膨らませて、今を生きています。

for(;;){
すっげー合格したい。合格したい。合格したい。
}

2010/01/21

[oracle]特定の数字を取り除く

今、google docsに保管しているoracleに関するノウハウをブログに書いていこうかなと思っています。

今日は、ある特定の数字を取り除く処理を。

今回は、0を取り除くSQLを題材にしてみます。

--1500を返す
select to_char(to_number('01500'))
from dual
;

--2300を返す
select ltrim('02300','0')
from dual
;

--1234を返す
select trim('0' from '12340')
from dual
;

一つ目のSQLは、文字列をいったんNUMBER型にして、再度、char型にすることで、一番左側にある余分な0だけを削除しています。

同様に2番目も一番左側にある0だけを削除していますが、一番目の違いは、NUMBER型に変換せず、char型のまま処理をしているところ。

そして最後も、確かに0を削除していることは削除しているのですが、右側にある0まで削除を行っていて、本来12340と表現したいところが1234となってしまい若干残念な感じ。

一番簡潔な2がいいのかなと。

2010/01/20

[Objective-C][iPhone sdk]「""」を出力

だいぶ前に、NSStringで改行を出力する方法を書きましたが、今日は、「"」を出力する方法について。

改行は「\n」でオッケーでしたが、「"」は「\"」で出力することができます。

NSLogなどを使った時に、「"」を表示することができるので、便利になると思います。

2010/01/19

[本]おもてなしの経営学

風邪で寝込んでいる時に、こちらを読了。



第1章 おもてなしの経営学
(『現代用語の基礎知識』に収録された「おもてなし」
ユーザー・インターフェイスとユーザー・エクスペリエンスの違い
なぜグーグルはYouTubeを買収しなければならなかったのか? ほか)
第2章 ITビジネス蘊蓄
(マイコン少年から経営者へ。『月刊アスキー』と私の「縁」
ダブル・メジャーたった1ページの仕様書から始まったウィンドウズ95 ほか)
第3章 特別対談
(西村博之―ニコニコ動画と2ちゃんねるのビジネス哲学
古川享―私たちがマイクロソフトを辞めた本当の理由
梅田望夫―「ギーク」「スーツ」の成功方程式)

via:目次


Life is beautifulを運営しているNakajimaさんが書かれた本。

Nakajimaさんは、プログラマ兼経営者としてとても尊敬している方であり、ついに本書をゲット!!

本書は、

1章は、過去のブログエントリーの引用
2章は、月刊アスキーのコラムの転載
3章は、特別対談

という3部構成になっています。

1章は、いつもブログを拝読させていただいているので、スラスラ楽しんでよむことができました。
ブログの引用した部分については、エントリーした日付まで入っていて、時間の流れとともにappleやgoogleがどう変遷して、またそれについて、どのように分析されたのかが書かれていて、ついつい懐かしみながら読んでしまいました。
(iPhoneがリリースされた時点が最新のエントリーだったので。)

2章は、月刊アスキーのコラムだったのですが、この雑誌を読んでいなかったので、どんな内容なのかなーっとワクワクしながら読むことができました。
1章と比較して、詳細な考察で、ITというよりもおもてなしを通したビジネスよりのお話でした。

この章のコラムの中で一番気持ち的に焦ってしまったのは、グローバル市場で通用するエンジニアになるためには、英語力を鍛えるというところ。

今は、アジア(主に中国)やインドの人たちが、アメリカの大学をでて(中には、MBAを取得される方もいたりとか)、自国に知識を持って帰り国際競争力のあるビジネスをガンガン展開するのは常識になっており、日本がそれに対抗するためには、国際競争力のあるビジネスに育てることが必要なのではないかということ。

そのためには、共通言語である英語がなによりも必須ということで、もっと英語を勉強して少しでも市場価値を高めないとなーっと思いました。

確かに、日本以外のアジアの方の向上心はパネエと思ったことがあります。
それは以前、台北に行ったときに、おなかが減ったので、家内と夜市に行ったときに、麺を買おうと思ったのですが、その時の店員さんの気迫がまたすごいのなんのって。
中国語(だと思った)が通用しないなら英語で、英語がだめなら日本語でと次々と言葉を変えて必死になって売ろうとするんですよね。

あの気迫はすごかったです。
なので競争力があるのかなっーと客観視してみたり、同じことが日本人でもできるのかなーっと思うと甚だ疑問に感じてきました。
(例えば、日本語がダメなら英語で、英語がダメなら中国語でという流れで日本人も商売をするということ。)

3章は、2chを作った西村さんと、MSの社長を務めた古川さん、そして最後に、web進化論の梅田さんの特別対談だったのですが、中でも一番興味深かったのは、古川さんとの対談にあったwindowsやIEの誕生秘話。

普段、何も意識せずwindowsパソコンを使っていますが、裏ではそんなストーリーがあったんだーっと感動してしまった。

またこの話を通して、MSは世界でもトップクラスの企業に飛躍していくのですが、会社がでかくなりすぎた結果によって生じるイノベーションのジレンマとは何か?ということに関してもその一端に触れることもできます。

同じ会社でも規模によって生じてくる問題が変わってくるんだなーっと。

ここからは要望ですが、、2章のコラムの転載ですが、具体的にいつの時点のコラムを記載したのか日付が欲しかったです。
なぜなら、もし他にも今回の本に掲載されていないコラムがあったら読みたいと思ったからです。
追加でネットで販売されていれば買ったと思います。

後、3章が全体の半分以上も占めており、もっと1章の部分を増やして欲しかったです。
是非、1章の内容がたくさん詰まった次回作を出版してほしいと思いました。

最後に、Nakajimaさんのサポートページは
アルファ・ブロガーはなぜ本を書くことになるのか?
です。

後、追加で弾さんの書評もあったので、そちらも紹介。
ペア書評 - おもてなしの経営学/パラダイス鎖国

2010/01/18

[gadget]goo辞書250000ユーザー突破

しました。

Photobucket

念願の

Google Gadget Ventures

に応募ができそうです。

緊張します。

2010/01/17

[iPhone app]実は、3個目のアプリの審査が通っていました

まだリリースはしていないのですが、3個目のアプリに審査が通りました。

早くリリースしたいなーっと。

ごめんなさい

風邪でダウンしています。

2010/01/16

[Objective-C][iPhone sdk]NSStringの@使用時のメモリ解放

NSString *hoge = @"foo";
みたいな感じで変数を宣言した時に、どうやってメモリーを解放するのかなーっと思って調べていたら、ここによると、どうやら自動的に解放してくれるみたいなので、明示的に解放する必要なないみたいです。

なんと便利な!!

2010/01/15

[Objective-C][iPhone sdk]UIFontでallocやinitはNG

よくテキストのフォントをUIFontで設定するのですが、インスタンスオブジェクトを[[UIFont alloc] fontWithSize:14]みたいな形で生成しようとすると、なぜか固まっていまう。

なぜかなーっと思ってマニュアルとにらめっこしていると、なんと、allocやinitメソッドを使って設定しないでくださいって思いっきり書いてありました。

注意しよーっと。

2010/01/14

[Objective-C][iPhone sdk]NSLogによるデバッグ出力

ちょっと前までUIAlertを使って実行結果を確認していましたが、最近は、NSLog関数を使ってログの確認をしています。

ここのサイトを参考に、NSLogの使い方を勉強したのですが、NSLogに関して便利だなーっと思ったのは、C言語のprintf関数に相当する機能を持っているということ。

%dをInt型に変換してくれるので、一回、一回、NSString型に変換することがなくデバッグすることができて便利です。(%fなども同様に浮動小数点型に変更してくれます。)

これでもっと効率よく開発できるぞと。
(ソースもコンパクトになるしね。)

参考までに、NSLogのログの出力先の確認は、「実行」→「コンソール」でウィンドウが表示されるのでそこで確認ができます。

しかも、コンソール上でコンパイル及び実行もできるのでログを確認しながら実行できます。

2010/01/13

[Objective-C][iPhone sdk]Documents内にテキストファイルを書き出す

前回に引き続き、やっとこさ、Documents内にファイルを出力する方法がわかったので、まとめてみようかなと。

リファレンスでは、バイナリデータでファイルを保存する方法が記載されていましたが、テキストファイルでの保存方法がなかったので、今回はテキスト形式でファイルを保存する方法について書きたいと思います。

//ホームディレクトリ直下にあるDocumentsフォルダを取得する
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory
, NSUserDomainMask
, YES
);
NSString *dataPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"hoge"];

//ファイルが存在しない場合(初回ロード時のみに使われる)
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]) {
  //ファイルを作成する
  NSString *temp = @"任意の文字列";
  [temp writeToFile:dataPath atomically:NO
  encoding:NSUTF8StringEncoding
  error:nil
  ];
}

上のプログラムは、Documentsフォルダ内にhogeファイルの検索を行い、ファイルが存在しない場合のみ、hogeファイルを作成し、文字列(変数:temp)をhogeファイルに書き出す処理を書いています。

最初、「hoge.txt」というように拡張子をつけて書いていたのですが、実行結果を確認したところ、フォルダができてしまい、テキストファイルができなかったので、拡張子をなくしたらうまくファイル作成できました。

ファイル作成及び、writeToFileメソッドで行っています。

これでやっとテキストファイルによる書き出しができるようになりました。

単一のデータ保存の場合は、これで困る事ないぞと。

2010/01/12

[本]弾言 成功する人生とバランスシートの使い方

#空気本_ - 紹介 - 「空気を読むな、本を読め。」で紹介されていたので、さっそく読みました。




あなたは、自分という会社の社長で筆頭株主

第1章 ヒト part1 ——自分の価値を「見える化」してレベルアップ

第2章 カネ ——相互理解のツールとして戦略的に使いこなす

第3章 ヒト part2 ——ネットワークにおける自分の価値をアップする

第4章 モノ ——「本当は所有できない」ということを理解する

via:目次

自分(本書を読んでいる読者)は、自分という会社の社長であり筆頭株主であるという前提で自分という会社を経営をしていくべきだということからお話はスタート。

その自分という会社を「モノ」、「カネ」、「ヒト」という観点から立て直す方法を、弾さんが述べています。

「第1章 ヒト part1」は、自分の価値を向上させるために時間を投資せよということなのですが、時間を作るための具体的な方法が書かれています。

内容的には、空気を読むな、本を読め。と重複している部分が多くかつ、すでに実践している部分が多かったのでサクサク読めました。

一番勉強になったのは、「辞め時のタイミング」。
何事にも辞め時というのがあるが、それを教えてくれるビジネス書は今までなかったかなーっと。

「第2章 カネ」は物事をバランスシートを使って考えるということなのですが、成人になる前から既にバランスシートを使って考える癖ができてしまっているのでここもそっこーで読むことができました。

ただ本書では、バランスシートをお金だけではなく、他のことにも応用できることが書かれていたのでその部分は、ブラッシュアップとしてバランスシートのバージョンアップとして利用できるのかなと。

「第3章 ヒト part2」は、ネットワークの価値について書かれています。
おもしろかったのは、ネットワークの価値を方程式を使って算出する方法が書かれていること。抽象的に判断するのではなく定量的にずばっと判断することで、ネットワークの価値を算出し、優先順位をつけ、結果的に自分の時間を作りドンドン価値を向上していこうというのではないかと思いました。

最後の「第4章 モノ」では、環境問題からベーシックインカムについて書かれています。

唯一敷居が高くなるのではと思ったのが、物理や化学の用語が出てくるので、理系科目が苦手な方には難しいのかなと。
バランスシートに関しては他の書籍でもわかりやすいものがあるので、本書を読んで挫折してしまった方は、まずそちらも読むのも手かなと思います。

定性的ではなく定量的に物事を考える人におすすめできる一作です。

弾さんの紹介ページは
紹介 - 「弾言」本日発売です。
「弾言」 - Amazon在庫切れでごめんなさい
「弾言」、絶賛増刷決定!
です。

iPhone版の弾言もリリースされているみたいです。
iPhone版-弾言icon

紹介ページは
おしらせ - #弾言_ & #決弾_ on #iPhone
iBookがアプリ名になる日 - #弾言_ & #決弾_ に見た「読むの未来」

です。

2010/01/11

[php]PHP5でxmlをパースす方法について

カフェ関連サイトのシステム開発日記のPHP4でXMLをパースするによるとPHP5では、simplexml関数を使えば簡単にxmlをパースできちゃうみたいです。

というわけで、simplexml関数についてちょっと調べてみることにしました。

ただ説明をするだけだとわけがわからないので、プログラムを作ってみました。
題材としてYahoo画像検索を扱っています。
(Yahoo画像検索結果のフォーマットについてはこちらを参照。)

$yahoo_start_row = 1;
// Yahoo japan seacrh ここから
$url = "http://search.yahooapis.jp/ImageSearchService/V1/imageSearch";
$url = $url."?appid=Yahooのキー";
$url = $url."&query=".$url_string;
$url = $url."&results=30";
$url = $url."&start=".$yahoo_start_row;
//$url = $url."&adult_ok=1";

//リクエストインスタンスの作成
$request = new HTTP_Request();
//問い合わせ先の設定
$request->setURL($url);

//リクエスト開始
$result = $request->sendRequest();
//リクエストが失敗した場合
if(PEAR::isError($result)){
exit();
}

//DOMオブジェクトを作成
$dom = new DOMDocument;

//GETした内容からBODYの部分を取り出し、さらにその内容をxmlとして読み込む
$dom->loadXML($request->getResponseBody());
//読み込みが失敗した時
if(!$dom){
exit();
}

//DOMオブジェクトをSimpleXMLノードとして解析する。
//(こちらの方が解析しやすいみたいです)
$s = simplexml_import_dom($dom);
//domの解析エラーが発生した場合
if(!$s){
exit();
}

//検索結果合計数を取得
//ResultSetタグのtotalResultsReturned属性を取得する
$RecordCount = $s["totalResultsReturned"];

//検索結果の表示を行う
for($i=0;$i<$RecordCount;$i++){
//ResultSetタグの小要素であるResultタグの内容を取得する
$result = $s->Result[$i];
//ここでは例として、Resultタグの小要素であるUrlタグの内容
//(属性ではないので注意)を表示する
print($i.":".$result->Url."<br>");
}

とこんな流れでいけるみたいで、実際に動かしてみたところ確かに、URLが表示されました。

「$dom = new DOMDocument;」から上の部分は、GETリクエストをしているだけなので、これに関しては、前回の記事を参考にしてください。

そこから下が新しい部分で、よーうはいったんDOMオブジェクトを生成し、それを簡単に処理できるようにsimplexml_import_domを使っていますよーということ。

作ってみて思ったのは、なぜ、DOMオブジェクトを経由させてsimplexml_import_dom関数を使わなくちゃいけないのかなと。

simplexml_import_dom($request->getResponseBody())みたいにしてloadXMLメソッドを使わずに直接解析できるようにすればいいじゃんっと思ってしまうのだが。

確かにリファレンスを読むとsimplexml_import_domの引数はDOMオブジェクトだから、いったんloadXMLメソッドを使わなくちゃーいけないっていうのはわかっているんだけど、なんか色々と事情があるんでしょうね。

後、simplexml_import_domで解析した後は、トップがResultSetタグになっていることにも注意したいです。
(つまり、トップノードのxmlのドキュメントバージョンなどが含まれている部分がではないということ)

小タグには、メソッドのようにアクセスを行い、属性は、配列のようにアクセスすればいいみたいです。

この辺は慣れですね。

最後にYahooの画像検索から返ってくる結果のサンプルを掲載します。
(で参考にしたのは、こちらで一部変更を加えています。)

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:yahoo:jp:srchmi"
xsi:schemaLocation="urn:yahoo:jp:srchmi http://・・・省略・・・"
totalResultsAvailable="437530"
totalResultsReturned="2"
firstResultPosition="1"
>
<Result>
<Title>02 1024</Title>
<Summary>ひまわり大好き</Summary>
<Url>http://www.sunf.jp/wallpaper/02_1024.jpg</Url>
<ClickUrl>http://ClickUrl>
<RefererUrl>http://Url>
<FileSize>202.2kB</FileSize>
<FileFormat>jpeg</FileFormat>
<Height>768</Height>
<Width>1024</Width>
<Thumbnail>
<Url>http://Url>
<Height>105</Height>
<Width>140</Width>
</Thumbnail>
</Result>
<Result>
<Title>pa021228 11</Title>
<Summary />
<Url>http://Url>
<ClickUrl>http://ClickUrl>
<RefererUrl>http://Url>
<FileSize>87.2kB</FileSize>
<FileFormat>jpeg</FileFormat>
<Height>450</Height>
<Width>600</Width>
<Thumbnail>
<Url>http://Url>
<Height>93</Height>
<Width>125</Width>
</Thumbnail>
</Result>
</ResultSet>

もう一つ追加で、

xmlをパースするに当たって参考にしたサイト
Do You PHP?:PHP5を試してみる - SimpleXML関数でRSSしてみる

2010/01/10

[ASP][VBScript]ByValとByRefの違い

長年悩んでいた悩みがついに解決

ASPでよく使われるByValとByRefの違いがどうしてもわかりませんでした。

そこで、下記のプログラムを作って検証してみることに

Sub Test1(ByVal arg1)
arg1 = "Test1により値が変わりました"
End Sub

Sub Test2(ByRef arg2)
arg2 = "Test2により値が変わりました"
End Sub

hoge = "Test"

Response.Write(hoge)
Response.Write("<br>")

Call Test1(hoge)
Response.Write(hoge)
Response.Write("<br>")

Call Test2(hoge)
Response.Write(hoge)

結果は

Test

Test


Test2により値が変わりました

となりました。

このことから、ByValは引数の値を変更せず、一方、ByRefは引数の値を変更してしまうことがわかりました。

これは、PL/SQLと対応させるとわかりやすいかもしれません。

ASP   |  PL/SQL
----------------

ByRef | in out

ByVal | in

とすれば、いざ、実装するにあたり、どちらがどっちとイチイチ悩む必要はなくなります。

ByVal と ByRefを読むと、ByRefは、「参照渡し」でByValは「値渡し」と書かれていますが、そこまで意識する必要なく上の対応表で考えればすむのかなと。

2010/01/09

[Objective-C][iPhone sdk]Documentsディレクトリを取得

確か、だいぶ前のことですが、iPhoneのディレクトリ構造について書きました。

そこで今回は、iPhoneのアプリの中にあるDocumentsディレクトリにアクセスする方法について書いてみたいと思います。

下のソースで取得できました。

//ホームディレクトリ直下にあるDocumentsフォルダを取得する
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory
, NSUserDomainMask
, YES
);
[paths objectAtIndex:0]

[paths objectAtIndex:0]の部分をアラートで出力した結果、下のようになりました。
Photobucket
一部黒くなっている部分は、数字やら文字が羅列した文字列が表示されていました。

きちんと、Documentsフォルダまでのパスが表示されています。

NSUserDomainMaskはユーザーのホームディレクトリを表し、そこからNSDocumentDirectoryを第一引数にセットすることで、ホームディレクトリからDocumentsディレクトリまでのパスを表示してくださいという流れになっています。

第三引数は、絶対パスで表現するに当たってチルダが使われていた場合に、それを展開するかどうかを訪ねています。

YESの場合は、展開、NOの場合は、展開を行いません。

この処理自体は一種のおまじないみたいなものなので、覚えた方が早いかもしれません。