ここ最近phpばっかりやってて、開発環境にNetBeansを使ってます。
で、先日NetBeans 6.9.2⇒7.0にしたら初めての起動には成功したものの
次からは「JVM creation failed」というエラーが出て起動しない。
どうにも動かないので、コミュニティで検索してみたら、下記を発見。
http://netbeans.org/bugzilla/show_bug.cgi?id=183941

etc\netbeans.confの中の「-J-XX:MaxPermSize」をv6.9.2と同じ200に設定したら動きますた。

てか、来月からは本格的にAndroidとiphoneアプリをやることになりそうです。。

最近Androidの携帯アプリに興味がわいたので、メモ的に記事にしてみる。
とりあえず、開発環境の準備をしなくてはいけないので、そこから始めます。

まずAndroidのアプリはJavaで作成するので、JDKかJREをインストールする必要があります。
とりあえず下記のサイトから最新のJDK(今時点でJDK 6 Update 21)をダウンロードして、インストールを行います。
Java JDK/JREのダウンロード

次に統合開発環境であるEclipseをインストールします。

次にAndroidSDKをセットアップします。
①はじめにAndroid Developersからスターターパッケージをダウンロードして、任意のディレクトリに展開します。

②展開したディレクトリ下にある/toolsにパスを通します。XPの場合は[コンパネ]⇒[システム]⇒[詳細設定タブ]⇒[環境変数]⇒[システム環境変数]の変数Pathの最後にtoolsまでのpathを追加します。
※既に設定されているpathは不用意に弄らないで下さい。
※他のパスとはセミコロン「;」で区切って設定します。

③①で展開したディレクトリにある「SDK Manager.exe」を実行します。
この段階ではスターターパッケージのみしかインストールされていないので、追加可能なプラットフォームやコンポーネント等のパッケージリストがダイアログ上に表示されます。
とりあえず、最新のプラットフォームとドキュメント、サンプルを選択してインストールします。

④さらにテスト的なAndroid Virtual Devices(AVD)の設定もやっちゃいます。
というのも、ADVがないと「Hello! World」な、お試しプログラムもできないので、あくまでお試し的に設定しておきます。
まず、コマンドプロンプトを起動して、

android list targets

と入力すると、

通常JavaはVM(仮想マシン)上で動作するが、Androidの場合はJavaVMではなく、Android用に開発されたDalvik上で動作し、Javaクラスから再度コンパイルしてDalvikの実行形式で動作する。

この辺は統合開発環境であるEclipseを使用する事で、作業を容易に行う事が可能。
また、Eclipseは日本語化も行われている。
Pleiades – (Eclipseプラグイン日本語化プラグイン)
Eclipse 日本語化言語パック(サードパーティ版)

あとはまた後日。。。

phpをインストールする前にApacheをインストールしませう。

①phpのバイナリをダウンロード
http://www.php.net/downloads.php
今回はv5.2のzipを使用。
ダウンロードしたら任意のフォルダに展開する。特に理由が無ければ、c:\php5へ保存で良いでしょう。

②Apacheのconfにphpモジュールの設定を追加する。
因みに今回使用しているApacheはv2.2.14
追加する場所は、分かりやすいように他のLoadModule指示子が記載されてる辺りが良いと思います。

# phpモジュールApache2.2用
LoadModule php5_module c:/php5/php5apache2_2.dll

# Apacheがv2.0系の場合は
LoadModule php5_module c:/php5/php5apache2.dll

# ついでにphp.iniのフォルダも指定しておく
PHPIniDir "c:/php5"

③次にApacheにphpのmimeタイプを追加します。
これも他のAddType指示子と同じあたりに記述した方が良いでしょう。

# phpのMimeタイプを追加
AddType application/x-httpd-php .php

# ソース表示が必要なら以下も記述
AddType application/x-httpd-php-source .phps

④phpフォルダ内の「php.ini-dist」をコピーして「php.ini」にファイル名を変更する。
これでApacheを再起動すると、とりあえずApacheにphpが組み込まれる。

⑤その他
php.iniを編集してphpの設定を行う。必要に応じて以下とそれ以外の設定を行う。

register_globals = Off
magic_quotes_gpc = Off
include_path = ".;c:\php5\includes"
doc_root = "ドキュメントルート"
extension_dir = "c:\php5\ext"
extension=php_mbstring.dll
extension=php_mysql.dll

MySQLのエクステンションはMySQLがインストールされていないとだめです。
iniの記述が終了したら、Apacheの再起動を忘れずに!

いよいよAPIを叩いてみます。

# ■なにかつぶやいてみる例
# このソースはかなり簡略化してますので、自分のソースに合った改変は必須かと思います。
# statuses/updateを使用して、結果をXMLで受け取る例です。

use LWP::UserAgent;
use Encode;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

# 前回取得したアクセストークンとシークレット
my $access_token = 'アクセストークン';
my $access_secret = 'トークンシークレット';

# 各APIメソッド毎にURLとリクエストメソッドが異なるので注意
my $API_Method_url = 'https://twitter.com/statuses/update.xml';
my $request_method = 'POST'; 

# なにかつぶやく
my $message = 'PENTAX K-7は良いカメラだぜぃ';

# OAuthリクエスト
my $request = Net::OAuth->request("protected resource")->new(
        consumer_key 	=> 'Twitterから取得したキー',
        consumer_secret => 'Twitterから取得しシークレット',
        request_url => $API_Method_url,
        request_method => $request_method,
        signature_method => 'HMAC-SHA1',
        timestamp => time,
        nonce => 'ランダム文字列', # 毎回変更
        token => $access_token,
        token_secret => $access_secret,
        extra_params => { status => decode_utf8($message) },
   );

# extra_paramsに各APIメソッドのパラメータ値のハッシュをセットする(今回は"status")
# decode_utf8についてはNet::OAuthのドキュメント(下記URL)を見てください。
# http://search.cpan.org/~kgrennan/Net-OAuth-0.19/lib/Net/OAuth.pm#I18N

$request->sign;

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $API_Method_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);

# 結果のXML
my $res_xml = $http_res->content;

これでつぶやくはず。。。

あ、ソースは全部utf8で書いてます。
あ、エラー処理とか全力で省いてます。
あ、今回色々試したい事もあったので、Net::OAuthにしましたですが、Net::Twitterとか使ったほうが、以外に簡単かもしれませんよ?w

2010/02/06追記: Syntax-Hilighter入れてみたw

さて、先の記事でリクエストトークンを取得しましたが、このままでは使えない訳で、このトークン値を使ってTwitterにリダイレクトしてユーザの承認を行います。
この辺の処理はブラウザ/デスクトップベースのクライアントかによっても違ってきますし、Botのようなクライアントなら自分で承認すればOKですが、他のユーザが使う場合なら各ユーザに承認してもらう必要もあり、各トークンの管理等も含めて複雑になって行きます。

今回はbotがつぶやく仕様、これです。
botがつぶやくには、つぶやくTwitterアカウントでログインして、アプリの承認を自分で行います。

# 前回のソースから直接承認画面にリダイレクトする場合。
my $authorize_url = 'http://twitter.com/oauth/authorize';
my $request_token = '[取得したリクエストトークン]';
print "Location: ".$authorize_url."?oauth_token=".$request_token."\n\n";

リダイレクトすると、Twitteのアプリ承認画面が開きます。
この画面で許可を選択すれば、コールバックURLへリダイレクトされます。
※デスクトップクライアントの場合は、ここで暗証番号らしき数字が表示されるみたいです。それは、またの機会に確認してみます。

コールバックURLにリダイレクトされると同時に、承認済リクエストトークンとヴェリファイア値がPOSTされるので、適当な方法でこのPOST値を拾います。簡単な方法だとCGIモジュールとか。。。
で、今度はこの各値を使って、アクセストークンとシークレットを取得します。

# アクセストークンとシークレットの取得 --------------------
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。

use CGI;
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

my $q = CGI->new;
my $access_token = $q->param('oauth_token'); #承認済みトークン
my $access_verifier = $q->param('oauth_verifier'); #ヴェリファイア

my $access_token_url = 'http://twitter.com/oauth/access_token';
my $request_method = 'POST'; #アクセストークン取得はpostなので注意

my $request = Net::OAuth->request("access token")->new(
    consumer_key => 'Twitterから取得したキー',
    consumer_secret => 'Twitterから取得しシークレット',
    request_url => $access_token_url,
    request_method => $request_method,
    signature_method => 'HMAC-SHA1',
    timestamp => time,
    nonce => 'ランダム文字列', #毎回変更
    callback => '',
    token => $access_token,
    verifier => $access_verifier,
    token_secret => '',
    );

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('User-Agent' => $ClientUA_name);
my $http_req = HTTP::Request->new($request_method, $access_token_url, $http_hdr, $request->to_post_body);
my $http_res = $ua->request($http_req);

my $AccessTokenStr = $http_res->content;

こんな感じです。$AccessTokenStrは前回同様に分解して下さい。

2010/02/06追記: Syntax-Hilighter入れてみたw

まず、Twitterのアプリ登録ページで各種設定を行い、Consumer KeyとConsumer Secretを取得します。とりあえず後でも変更は可能なので、アプリ名とか決まって無くても、間に合わせで設定しても大丈夫。
ただ、Application Typeの設定によって、承認済リクエストトークンとヴェリファイアの取得方法が変わって来るので、ココはきちんと設定しておきましょう。今回の例はブラウザベースで話を進めます。

で、コンシューマキーとシークレットを取得したら、その各値を使ってRequestTokenを取得します。

# ■リクエストトークンの取得
# このソースは簡略化してますので、自分のソースに合った改変は必須かと思います。
use LWP::UserAgent;
use Net::OAuth;
$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;

my $request_token_url = 'http://twitter.com/oauth/request_token';
my $request_method = 'GET';

my $request = Net::OAuth->request("request token")->new(
    consumer_key 	=> 'Twitterから取得したキー',
    consumer_secret => 'Twitterから取得しシークレット',
    request_url => $request_token_url,
    request_method => $request_method,
    signature_method => 'HMAC-SHA1',
    timestamp => time,
    nonce => 'ランダム文字列', #要毎回変更
    callback => 'http://yoursite', #アプリ登録時のコールバックアドレス
    );
# nonceとtimestampについてはhttp://oauth.net/core/1.0/#nonce を参照

$request->sign;

my $ua = LWP::UserAgent->new;
my $http_hdr = HTTP::Headers->new('Authorization' => $request->to_authorization_header);
my $http_req = HTTP::Request->new($request_method, $request_token_url, $http_hdr);
my $http_res = $ua->request($http_req);

my $RequestTokenStr = $http_res->content;

以上w
$RequestTokenStrには
「oauth_token=[未承認RequestToken値]&oauth_token_secret=[ReuestTokenSecret値]&oauth_callback_confirmed=true」な感じで値が返りますので、Net::OAuth->responseや、その他お好みの方法で各値に分解します。

2010/02/06追記: Syntax-Hilighter入れてみたw

TwitterのOAuthについて、大まかな流れとしては、
①Twitterでアプリケーション登録を行う
②①で取得したコンシューマキーとシークレットを使って、未承認リクエストトークンとシークレットを取得
③未承認リクエストトークンを使ってTwitterにリダイレクト
④アプリケーションの承認(ユーザ側)
⑤コールバック用スクリプトで、承認済みリクエストトークンとベリファイアを受け取る
⑥リクエストトークンとベリファイアを使ってアクセストークンとシークレットを取得する
⑦アクセストークンとシークレットでAPIを叩く

ざっとこんな感じ。。。w
今の所アクセストークンの有効期限は無いみたいなので、一度取得したらそのまま使い続けられるようです。

使ったOAuthの為のモジュールはNet::OAuthで、OAuthのヘッダやPOST値を生成してLWP::UserAgentでGET/POSTします。

K-7の退院早々、比較するのもなんかアレなんですが・・・w

なんとなく気になってる人も結構いるかな、とか思ってですね、簡単な方法でやってみました。
因みにこの比較はレリーズタイムラグではありません。
単にファインダー像の消失を比べたものですので、ご注意下さいw

方法は簡単。ファインダー像をコンデジの動画で撮りましたw
k-7、K20Dともにシャッタースピード1/125s、絞り値はF4。
動画撮影に使ったコンデジはペンタのA40。
録画の後で消失している間のフレーム数を数えます。

撮った動画の中からブラックアウトの前後を含め、50フレーム分切り出したのが下の動画です。
モデルは、タチコマ君。一瞬で終わりますw

K20Dファインダー内の動画(AVI)
K-7ファインダー内の動画(AVI)
※DivXなので、もしかしたら見れない人もいるかもしれません。

更にこの動画をコマ毎に抜き出したのが、次の画像です。
右下の数字は、動画の何フレーム目かを表しています。
※画像はクリックで拡大します。

K20Dファインダー像消失時間のイメージ

K20D
K-7ファインダー像消失時間のイメージ

K-7

K20Dは5コマ分、K-7は21フレーム目が半端に消えかかってますので2.5コマくらいとしましょう。
これで大体半分くらいに短縮されているのがわかります。

A40は30fpsで録画しますので、一コマ約33.3msとして計算すると、
K20D ⇒ 166.5ms
K-7 ⇒ 83.25ms

こんな感じです。
全く正確ではありません。すいませんw

あと、もうひとつ気がついたのは、K-7の24と25コマ目が僅かにぼやけて見えますが、
これはミラーが落ちきる直前で減速させてるか、一旦止めてるかの、どちらかではないかと
勝手な想像をしてます。
K-7のシャッターが静かで、手に伝わるショックも少ないのはこの2コマ分のおかげでしょうw

ひどくアバウトな比較ですが、皆様の参考になれば幸いです。
間違った点はご遠慮なくご指摘下さい。

そんな訳で、明日からは再びK-7で撮りに行こうと思います。

————————————————–
CrystalDiskMark 2.2 (C) 2007-2008 hiyohiyo
Crystal Dew World : http://crystalmark.info/
————————————————–

Sequential Read : 21.441 MB/s
Sequential Write : 18.676 MB/s
Random Read 512KB : 21.263 MB/s
Random Write 512KB : 7.556 MB/s
Random Read 4KB : 5.057 MB/s
Random Write 4KB : 0.096 MB/s

Test Size : 100 MB
Date : 2009/07/10 21:43:54

————————————————–
CrystalDiskMark 2.2 (C) 2007-2008 hiyohiyo
Crystal Dew World : http://crystalmark.info/
————————————————–

Sequential Read : 19.067 MB/s
Sequential Write : 6.809 MB/s
Random Read 512KB : 18.535 MB/s
Random Write 512KB : 1.987 MB/s
Random Read 4KB : 3.946 MB/s
Random Write 4KB : 0.021 MB/s

Test Size : 100 MB

Environment

GreenBlog green-web-hosting

twitter

Posting tweet...

Powered by Twitter Tools

My Favorite

定期購読はFujisanが便利

FujisanのWebサイトへ