2009年7月19日日曜日

乗法的モデルと正規分布

S(k+1)=u(k)S(k)
がk=0,1,...,N-1がある。
この時、u(k)は独立同分布の確率変数。
対数をとると、
InS(n+1)=Inu(n)+InS(n)=InS(0)+\sum^{n}_{k=0}Inu(k)

となる。
u(k)が独立同分布だから当然Inn(k)も独立同分布。
nが十分大きいとき、中心極限定理より、InS(n)は正規分布になるので、Inu(k)の期待値が、
{\mu}
で分散が
{\sigma}^2
を持つなら、InS(n)の期待値と分散はそれぞれ
E[InS(k)]=InS(0)+{\mu}k

var[InS(k)]=k{\sigma}^2

である。期待値と分散はkに関して線形的に増加する。

2009年7月18日土曜日

株式の2項格子モデル

株式の2項格子モデルだが、期間Tを定めて、先ほどのように
{\epsilon}^{u(n)}
に変動する確率がqで、
{\epsilon}^{d(n)}
に変動する確率が(1-q)とする。また、R(n)を安全金利とする。
ここで、
InS(k+1)=q(n)\left(u(n)+lnS(k)\right)+(1-q)\left(d(n)+InS(k)\right)

ここでInS(n+1)-InS(n)が独立同分布ならq(n)u(n)+d(n){1-q(n)}が独立同分布である。このことからnが十分大きいときInS(n)-InS(0)の分布は、正規分布になる。また、期待値と分散は線形に増える。
InS(k+1)=q(n)\left(u(n)+lnS(k)\right)+(1-q)\left(d(n)+InS(k)\right)
ただしZは正規分布

並び替えの問題を解くアルゴリズムを考える。

n種類の異なる名前にそれぞれ優先順位を表す数字が割り当てられており、その優先順位で並び替える。上からk番目までの名前をすべて求める。ただし数字が同じ場合は、k番目でもk個以上ある可能性はある。また、k+1個以上名前がある時は、そのk+1個の中で優先順位が最小の集合とそれ以外の集合を分けて求める。(priorityは1〜9)

→キーの並び替えと、重なりを数えるという作業が必要。重なりも多いので両方を同時に処理するのがなかなか難しそう

悩んだのですが、こんなのはどうでしょうか?
順番を数えながら配列にいれると、なんかめちゃくちゃ面倒くさい。だから順番は最後まで数えないアルゴリズムならシンプルではないかなと思いました。

phpの正規表現を使って実現します。
まず、
:1:,:2:,:3:,:4:,:5:,:6:,:7:,:8:,:9:,
上のような文字列を用意します。
nameがりんご,priorityが3があったらstr_replaceの関数を使って、":3:,"を":3:,apple,,"に書き換える。
すべてのカラムをこの文字列の中に入れてやる。
そのあとkの数に応じて、こんなパターンを作ってやる。/,(.*?),.*,(.*?) 必要数 ,(.*):(\d):/これでこの配列を取り出してやり、さらに最後の配列に格納されている数字より一つ小さい数字を使って、/:数字:(.*?):/で必要な文字列を取り出し、最後に配列に格納。ここで数を数えてやれば簡単に必要なものを手に入れることができる。

正規表現と数字の大小の比較の計算スピードや配列の数などにも応じてスピードが変わってきそうだが、人が行うような感じで動くのがなにか心地良かった。

2009年7月17日金曜日

ウィナー過程とランダムウォーク

長さが
{\Delta}t
の期間がN期あるとする。この時の加法過程をzとし、以下のように定義する。
z(t_{k+1})=z(t_{k})+{\epsilon}(t_{k})\sqrt[]{{\Delta}t}

t_{k+1}=t_{k}+{\Delta}t

この過程は1次対象ランダムウォークと呼ばれる。ただし、
{\epsilon}(t_{k})
は平均0、分散1の標準正規確率変数である。
確率過程の差分は、
z(t_{k})-z(t_{j})=\sum^{k-1}_{i=j}{\epsilon}(t_{i})\sqrt[]{{\Delta}t}

これは、正規確率変数の和なので、同然同分布で期待値は0。分散は、独立かつ同分布であることから、
var\[z(t_{k})-z(t_{j})\]=E\left[\sum^{k-1}_{i=j}{\epsilon}(t_{i})^2{\Delta}t\right]^2=(k-j){\Delta}t

つまり分散は2点間の時間の差に完全に一致する。
ここで区間が重ならないとき、上の確率過程の差分は独立である。
このようなことから
{\epsilon}(t_{k}){\rightarrow}0
とすると、
dz={\epsilon}(t_{k})\sqrt[]{dt}

上の式が存在し、ウィナー過程と呼ぶ。
1.初期値が0。
2.ウィナー過程の区間が重ならないとき、独立
3.任意のs<tについてz(t)-z(s)が平均0、分散t-sの正規確率変数となる。
(4.確率1で、見本関数(経路)が連続。)
このウィナー過程を拡張してやると以下が成り立つ。
dx(t)=adt+bdz


\{{\sigma}W_{t}+bt\}_{t=>0}
という形の確率過程を一般化されたBrown運動と呼ぶ。また
S_{t}=S_{0}exp\left({\sigma}W_{t}+bt\right)

とうい形の確率過程を幾何Brown運動という。
*性質1,2,4及び定常増分性を満たすような確率過程は、一般化されたBrown運動に限られる。

伊藤の公式

伊藤の定理
 zをウィナー過程として、確率過程xが伊藤過程、
dx(t)=a(x,t)dt+b(x,t)dz
で定義されているものとする。また
y(t)=F(x,t)
と定義されているとする。このとき、y(t)は次の伊藤方程式をみたす。
dy(t)=\left(\frac{{\partial}F}{{\partial}x}a+\frac{{\partial}F}{{\partial}t}+\frac{1}{2}\frac{{\partial}^2F}{{\partial}x^2}b^2\right)dt+\frac{{\partial}F}{{\partial}x}bdz

ここで確率過程であることなどを考えず簡易に証明
y+{\Delta}y=F(x,t)+\frac{{\partial}F}{{\partial}x}{\Delta}x+\frac{{\partial}F}{{\partial}t}{\Delta}t+\frac{{\partial}^2F}{{\partial}x^2}({\Delta}x)^2

ここで
{\Delta}t
に関してオーダー1より大きい項を整理すると、
y+{\Delta}y=F(x,t)+\left(\frac{{\partial}F}{{\partial}x}a+\frac{{\partial}F}{{\partial}t}+\frac{1}{2}\frac{{\partial}^2F}{{\partial}x^2}b^2\right){\Delta}t+\frac{{\partial}F}{{\partial}x}b{\Delta}z

上の式から微分の公式を思い出すと、伊藤の公式がだいたい成り立ちそうな気がする。

伊藤解析を用いずにB-S式を導く

 デリバティブの定義を一般化した上で、アービトラージを用いて等式を成立させ、最後に連続時間のモデルを作り、B-S式を証明していきます。

 満期Tのデリバティブのペイオフを
f(S_{T})
とすると、時刻tにおけるデリバティブの価値を
C(t,S_{t})
とする。
 時間tにおけるポジションは1単位のデリバティブとx単位の株(原資産)を持っているとする。このとき資産価値は、
C(t,S_{t})+xS_{t}
で、時間t+1における資産価値は、
{\mu}S_{t}
が株の配当で
{\sigma}S_{t}
が株価の変動を表すと、株価が上昇したときのポジションは、
C(t+1,S_{t}+{\mu}S_{t}+{\sigma}S_{t})+x(S_{t}+{\mu}S_{t}+{\sigma}S_{t})
株価が下落した時のポジションは、
C(t+1,S_{t}
+{\mu}S_{t}-{\sigma}S_{t})+x(S_{t}+{\mu}S_{t}-{\sigma}S_{t})
になる。
 アービトラージが組めないようにするとxが決まって、
x=\frac{C(t+1,S_{t}+{\mu}S_{t}+{\sigma}S_{t})-C(t+1,S_{t}+{\mu}S_{t}-{\sigma}S_{t})}{-2{\sigma}S_{t}}
r\left(C(t,S_{t})+xS_{t}\right)=C(t+1,S_{t}+{\mu}S_{t}+{\sigma}S_{t})+x(S_{t}+{\mu}S_{t}+{\sigma}S_{t})

にxを代入して整理すると、次の方程式が成立する。
C(t+1,S_{t})-C(t,S_{t})+\frac{r-{\mu}}{2{\sigma}}\{C\left(t+1,(1+{\mu}+{\sigma})S_{t}\right)-C\left(t+1,(1+{\mu}-{\sigma})S_{t}\right)\}+\frac{1}{2}\{C\left(t+1,(1+{\mu}+{\sigma})S_{t}\right)-2C(t+1,S_{t})+C\left(t+1,(1+{\mu}-{\sigma})S_{t}\right)\}-rC(t,S_{t})=0

この時の境界条件(満期条件)によってオプションの価格や先物の価格などの商品の現在価値や時刻tでの価値について求めることができます。

多期間二項モデルからオプション価格を求める

 まず最初に期間が増えていくと、原資産はどのように変化していくか想像してみてください。そして、期間tが経った後のコールオプション価格は、
S_{t}-K
になります。期間t-1の場合は、
S_{t-1}-K
ですが、これは1期間の2項モデルを使って
S_{t}-K
の価格から計算することができます。

 このことから、
C_{0}=\sum_{k=0}^n\frac{1}{R^n}{}_nC_kq^{n-k}(1-q)^kmax\{u^{n-k}d^kS_{0}-K,0\}}

 コールオプション価格は求めることができましたが、このままではブラックショールズの方程式を導くことができません。さらにブラックショールズの方程式は、より一般的に解くことができます。

2009年7月16日木曜日

1期間2項モデル

 1期間2項モデルとは、原資産が上昇するか減少するかの2パターンしかないときをさします。
 例えば、原資産の現在価格を100。1期間の間に90%の確率で原資産は200になり、10%の確率で50になります。この時、行使価格120のコールオプションはいくらでしょう。ただし安全金利を20%とします。(計算しやすいため)

下の方程式が成り立ち、コールオプションの価格を求めることができる。
200$\phi$+\frac{5}{4}$\psi$=80
50$\phi$+\frac{5}{4}$\psi$=0
CallOption=100\phi$+$\psi$

この連立方程式を解くことでコールオプションの価格を決めることができる。
僕は、上の方程式がピンとこなかったので、確率に関係なくアービトラージが組める最小のコールオプションの価格を計算してみます。
コールオプション
xC
xmax\{S_{t}-K,0\}
原資産
S_{0}
S_{t}
銀行
-\left(xC+S_{0}\right)
-\left(R\right)\left(xC+S_{0}\right)

右側の項目の和が正になればアービトラージ成立だから、右側の項目の和が0になる時を考える。すると、以下の変数変換をしてやると、上の連立方程式と等しくなる。
$\psi$=C+\frac{1}{x}S_{0}
$\phi$=-\frac{1}{x}

 考察としては、1期間2項モデルのオプションの価格は確率と関係なくその振れ幅(volatility)によって決まることが分かる。それは、アービトラージの成立が確率とは無関係だからである。
 このvalatilityに関してさらに考えてみるために、2項モデルの動き方を
uS_{0}
dS_{0}
とする。この時、オプション価格を計算してやると、
C=\frac{1}{R}\left(\frac{R-d}{u-d}C_{u}+\frac{u-R}{u-d}C_{d}\right)

ここでリスク中立確率というものを定義する。
q(risk-neutral probability)=\frac{R-d}{u-d}

するといかのように表すことができる。
C=\frac{1}{R}\left(qC_{u}+\left(1-q\right)C_{d}\right)

上の式だけ眺めてやると、リスク中立確率という確率空間上でのオプションの期待値の現在価値が現在のオプション価格になる。このように考えると時間を連続時間にして期待値を積分して求めたらオプション価格になりそうな気がします。また、1期間でなくこれを連続させてやり、最後に時間を小さくしてやるとどうなるみたいなことがしたくなります。

2009年7月15日水曜日

アービトラージとプットコールパリティ

次に、コールオプションとプットオプションの関係について説明します。アービトラージとは、必ず儲かる取引のことを言います。だから、アービトラージは長くは続かず、アービトラージが組めないように相場は決まります。
一応以下の内容を先に仮定しておきます。

* 無リスク金利で借金ができる。
* 株式を負の量保有できる。
* 取引コストがゼロ。
* 取引相手の信用リスクがゼロ。

上の条件が成り立つとき、プットコールパリティが成立する。
C_{0}-P_{0}=S_{0}-\frac{K}{1+R}
K:オプションの行使価格 S:原資産の価格 P:プットオプションの価格 C:コールオプションの価格 R:安全金利とします。
C_{0}-P_{0}>S_{0}-\frac{K}{1+R}
の時
コールオプション
-C_{0}
-max\{S_{t}-K,0\}
プットオプション
P_{0}
max\{K-S_{t},0\}
銀行
\left(C_{0}-P_{0}-S_{0}\right)
\left(1+R\right)\left(C_{0}-P_{0}-S_{0}\right)
原資産
S_{0}
S_{t}

-max\{S_{t}-K,0\}+max\{K-S_{t},0\}+\left(1+R\right)\left(C_{0}-P_{0}-S_{0}\right)+S_{t}=\left(1+R\right)\left(\frac{K}{1+R}+C_{0}-P_{0}-S_{0}\right)

このようなトレードをアービトラージと言います。もちろん新聞でプットオプションとコールオプションを調べてみると上の等式がほぼ成り立っていることが確認できます。

オプションとはなにか

オプションとはなにか?
 調べてみると、特定の期日に、特定の売買を行う権利。なにかを「買う」権利をコールオプション(call option)、「売る」権利をプットオプション(put option)と言うようです。では、プットオプションのロング(買い)とコールオプションのショート(売り)はどのように違うのでしょうか?このように文系ぽくオプションを説明していくとわけ分からなくなります。
Long Call Option=max\{S_{t}-K,0\}

Long Put Option=max\{K-S_{t},0\}

K:オプションの行使価格 S:原資産の価格
 つまり、コールオプションは購入するものが今より満期時に高くなったときには、オプションの価値は0で、逆に満期時に安くなっていた場合にはオプションは、その差額だけの価値になります。
 上のオプションのことをヨーロピアンオプションと呼び、期日内であればいつでも権利を行使できることをアメリカンコールオプションと言います。他にも、権利を行使する期間がある時期にだけ限定されるものなど複雑なものはたくさんあり、それを総称してエキゾチックオプションと言います。(あとで余裕があれば説明します。)ただこれから話をするB-S式(ブラックショールズ式)は、満期の期日を決めてますから、ヨーロピアンオプションにしか適応できません。

*満期とは、権利を行使する日のことを言います。デリバティブ(派生商品derivative security)とはある別の商品(原資産underlying security)の価格を基に価格が決まるような証券のこと。ペイオフとは、満期時のデリバティブの価値です。

 オプションをもう少しイメージするために、特約付外貨預金を例に上げてみます。下は、実際にソニー銀行で売られている商品です。
ソニー銀行の特約付外貨定期預金・タイプ1について









特約付外貨定期預金・タイプ1のイメージ
より高い金利を期待できる代わりに、特約レートより円安時の為替差益は放棄。

特約付外貨定期預金・タイプ1(以下、「タイプ1」)は、参照レートが特約レートと同じか円安の場合、満期日に元利金を特約レートで円に交換し、お客さま名義の円普通預金口座へ入金する特約が付されている外貨定期預金です。参照レートが特約レートより円高となった場合には、この特約は消滅し、満期日に元利金を預け入れ通貨のままお客さま名義の預け入れ通貨の外貨普通預金口座へ入金します。


 どのような商品か分かりましたか?

 このソニー銀行の特約付外貨預金では、契約者は(預金者)ドルを原資産とするプットオプションのショートの取引をしていることになります。個人的には、ショートプットオプション付き外貨預金と命名したほうがわかりやすいと思いますが。。笑

2009年7月13日月曜日

phpでgmailのサーバ(smtp.gmail.com)を利用して、メールを送信する方法。

gmailのsmtpサーバー(smtp.gmail.com)を利用してmailを送信する方法。文字化けするのでutf8にする必要がある。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

$to = "送信先のアドレス";
$toName = "送信先の名前";
$subject = "phpによるmail送信";
$message = "成功";
$user = "googleアカウント(gmailのアドレス)";
$pass = "アカウントのパスワード";

$config = array('auth' => 'login', 'ssl' => 'ssl', 'username' => $user, 'password' => $pass);
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
$mail = new Zend_Mail('UTF-8');
$mail->setFrom($user, 'dumsco');
$mail->addTo($to, $toName);
$mail->setSubject($subject);
$mail->setBodyHtml($message);

$mail->send($transport);



追記
・docomoとsoftbank当てにメールを送る方法。
 ドコモとソフトバンクは、UTF-8が使えるため、特にコードを書き換える必要無し。

$config = array('auth' => 'login', 'ssl' => 'ssl', 'username' => $user, 'password' => $pass);
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
$mail = new Zend_Mail('UTF-8');
$mail->setFrom($user, $fromName);
$mail->addTo($to, $toName);
$mail->setSubject($subject);
$mail->setBodyHtml($message);
$mail->send($transport);

・auにメールを送る方法。
auはutf8が使えないのでShift_JISに文字コードを変換した。しかし、本文が見れず、しかたないのでtextの形式で送った。

$config = array('auth' => 'login', 'ssl' => 'ssl', 'username' => $user, 'password' => $pass);
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
$fromName = mb_convert_encoding($fromName, 'Shift_JIS' ,'UTF-8');
$user = mb_convert_encoding($user, 'Shift_JIS' ,'UTF-8');
$toName = mb_convert_encoding($toName, 'Shift_JIS' ,'UTF-8');
$subject = mb_convert_encoding($subject, 'Shift_JIS' ,'UTF-8');
$message = mb_convert_encoding($message, 'Shift_JIS' ,'UTF-8');
$mail = new Zend_Mail('Shift_JIS');
$mail->setFrom($user, $fromName);
$mail->addTo($to, $toName);
$mail->setSubject($subject);
$mail->setBodyText($message);
$mail->send($transport);

カレンダーのIDを指定してgoogle calendarから情報を受け取る方法。

newEventQuery()を実行することで、Zend_Gdata_Calendar_EventQueryオブジェクトを受け取る。
getCalendarEventFeed(Zend_Gdata_Calendar_EventQueryオブジェクト)を実行することで、Zend_Gdata_Calendar_EventEntryの配列を受け取る。
getWhenという関数を用いてZend_Gdata_Extension_When Objectの配列を受け取る。
あとは、自由に必要なモノをとりだすだけ。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleのアカウント";
$pass = "アカウントのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$service = new Zend_Gdata_Calendar($client);

$calendar_id = "カレンダーのID";

$query = $service->newEventQuery();
$query->setUser($calendar_id);
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$query->setFutureevents('true');

try {
$eventFeed = $service->getCalendarEventFeed($query);
} catch (Zend_Gdata_App_Exception $e) {
echo "エラー: " . $e->getMessage();
}

echo "<ul>";
foreach ($eventFeed as $event) {
$when = $event->getWhen();
$starttime = $when[0]->startTime;
preg_match("/(....)-(.*?)-(.*?)T(.*?):(.*?):(.*?)\./" , $starttime, $startrow);
$timestamp[start] = gmmktime($startrow[4], $startrow[5], $startrow[6], $startrow[2], $startrow[3], $startrow[1]);

$x = getdate($timestamp[start]);
$date = $x[year].'年'.$x[mon].'月'.$x[mday].'日'.$x[hours].'時'.$x[minutes].'分'.$x[seconds].'秒';
print $date;

echo "<li>" . $event->title . " (Event ID: " . $event->id . ")</li>";
}
echo "</ul>";


追記
・カレンダーのXMLは、自分のカレンダーの設定画面からも確認することができる。
/User/Visibility/Projectionという形でアクセスするので必要にZend_Gdata_Calendar_EventQueryにセットする。
・時間を指定して検索する場合、

//$query->setFutureevents('true');
//上のコードを消して、下記を追加する必要がある。
$query->setStartMin('2009-07-23');
$query->setStartMax('2009-07-30');

2009年7月12日日曜日

phpでgoogle calendarの権限を削除する方法。

google calendarを削除する時と同様方法。カレンダーのIDと削除したいユーザのIDを調べて、Zend_Gdata_Calendarクラスのdelete()を使うだけでOK。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleのアカウント";
$pass = "アカウントのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$service = new Zend_Gdata_Calendar($client);

$calendar_id = "カレンダーのID";
$user = "権限を削除したいユーザーのアカウント";

$uri = 'http://www.google.com/calendar/feeds/'.$calendar_id.'/acl/full/user%3A'.$user;

$service->delete($uri,null);


2009年7月11日土曜日

phpで指定したgoogleカレンダーに権限を追加する。

Zend_Gdata_Calendar クラスを利用してxmlを送る。
・post() を使ってxmlを特定のurlに送る。
・レスポンスはZend_Http_Responseクラスで受け取る。
・今回は、getStatusを利用してレスポンスコードを受け取りそれで完了したことを確認する。

□権限の種類
owner 変更および共有の管理権限
editor 予定の変更権限
read 閲覧権限(すべての予定の詳細)
freebusy 予定の時間枠のみ表示(詳細は非表示)


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleのアカウント";
$pass = "googleのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$calendarid = "グーグルカレンダーのID";

addACL($client,'追加したい人のgoogleのアカウント','権限',$calendarid);

function addACL($client,$user,$role, $calendar_id){
$xml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gAcl='http://schemas.google.com/acl/2007'>
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/acl/2007#accessRule'/>
<gAcl:scope type='user' value='[USER]'></gAcl:scope>
<gAcl:role value='http://schemas.google.com/gCal/2005#[ROLE]'></gAcl:role>
</entry>";

$gdataCal = new Zend_Gdata_Calendar($client);


$uri = 'http://www.google.com/calendar/feeds/'.$calendar_id.'/acl/full';
$xml = str_replace('[USER]', $user, $xml);
$xml = str_replace('[ROLE]', $role, $xml);

$response = $gdataCal->post($xml, $uri);
if($response->getStatus() == 200 or $response->getStatus() == 201){
print "OK";
}
}


追記
・googleの権限を追加するためのアドレス(googleアカウント)、googleのカレンダーのアドレスとでは@の処理の仕方が違う。httprequestのurlに指定するのでgoogleカレンダーのアドレスは%40に変換する必要がある。

phpで指定したgoogleカレンダーの権限を表示する。

Zend_Gdata_CalendarクラスのgetFeedの関数を使うと、Zend_Gdata_App_Feedのオブジェクトで返ってくる。
次にgetEntry()の関数を使い、 Zend_Gdata_App_Entryのオブジェクトが格納されたarrayで返す。
arrayだからcount($array)でarrayの数を数える。
→ここまではgoogleカレンダーのリストの取得と同じ。
今回は、ユーザーIDの取得を他の場所から取得してみる。
Zend_Gdata_App_EntryのextensionElementsという関数を使い、Zend_Gdata_App_Extension_Element Objectの形にする。
このオブジェクトはZend_Gdata_App_Extension_Elementのオブジェクトが配列の形で格納されている。
このオブジェクトをとりだした後、extensionAttributesの関数を使い、配列を取り出す。
あとは、必要なものを取り出すだけ。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleのアカウント";
$pass = "googleのアカウントのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$service = new Zend_Gdata_Calendar($client);

$clendar_id = "カレンダーのID";
$uri = "http://www.google.com/calendar/feeds/".$clendar_id."/acl/full";

$response = $service->getFeed($uri,'Zend_Gdata_App_Feed');

$entry = $response->getEntry();
$i = 0;
while($i<count($entry)){
print $entry[$i]->extensionElements[0]->extensionAttributes[value][value];
print "=";
print $entry[$i]->title;
print "<br/>";
$i += 1;
}

phpで使用しているgooglecalendarをリストにしてすべて取得する方法。

Zend_Gdata_CalendarクラスのgetFeedの関数を使うと、Zend_Gdata_App_Feedのオブジェクトで返ってくる。
次にgetEntry()の関数を使い、 Zend_Gdata_App_Entryのオブジェクトが格納されたarrayで返す。
arrayだからcount($array)でarrayの数を数える。
あとは、Zend_Gdata_App_Entryのオブジェクトから必要なものだけとりだせばおっけ。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleのアカウント";
$pass = "googleのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Calendar($client);
$response = $service->getFeed('http://www.google.com/calendar/feeds/default/allcalendars/full','Zend_Gdata_App_Feed');

$entry = $response->getEntry();
$i = 0;
while($i<=count($entry)){
print $entry[$i]->id;
print "=";
print $entry[$i]->title;
print "<br/>";
$i += 1;
}

phpでgoogle calendarを削除する方法。

google calendarを削除する方法は簡単。カレンダーのIDを調べて、Zend_Gdata_Calendarクラスのdelete()を使うだけでOK。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "googleアカウントのユーザ名";
$pass = "googleアカウントのパスワード";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata_Calendar($client);
$calendar_id = "カレンダーのID";
$data = 'http://www.google.com/calendar/feeds/default/owncalendars/full/'.$calendar_id;

$service->delete($data,null);


追記
apiを使用するときに便利なことのメモ
・クラス名をgoogleで検索し、詳細な仕様を確認する。(今回の場合は、Zend_Gdata_Calendar)
・googleソースコード検索で、使用したい関数およびクラスを検索する。(今回の場合は、Zend_Gdata_Calendarとdelete)

phpでgoogle calendarを作成する方法。

phpを使ってgoogle apiを使うことはzendのフレームワークを使えば簡単にできるのだが、権限をつけたりcalendarを作成したりというものは存在しない。だから自分でXMLを作成する必要がある。

Zend_Gdata_Calendar クラスを利用してxmlを送る。
・post() を使ってxmlを特定のurlに送る。
・レスポンスはgetBodyで表示できる。


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// ClientAuth 認証用のパラメータ
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
$user = "ここにgoogleアカウントのuser名を入力";
$pass = "ここにgoogleアカウントのpasswordを入力";
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

createCalendar($client,'calendar_name','A new calendar','#2952A3','America/Los_Angeles','false','Berkeley');

function createCalendar($client,$title = 'My New Calendar',$summary = 'A new calendar', $color = '#2952A3',$timezone='America/Los_Angeles', $hidden='false',$where='Berkeley'){
$xml = "<entry xmlns='http://www.w3.org/2005/Atom'
xmlns:gd='http://schemas.google.com/g/2005'
xmlns:gCal='http://schemas.google.com/gCal/2005'>
<title type='text'>[TITLE]</title>
<summary type='text'>[SUMMARY]</summary>
<gCal:timezone value='America/Los_Angeles'></gCal:timezone>
<gCal:hidden value='false'></gCal:hidden>
<gCal:color value='[COLOR]'></gCal:color>
<gd:where rel='' label='' valueString='Oakland'></gd:where>
</entry>";

$gdataCal = new Zend_Gdata_Calendar($client);
$uri = 'http://www.google.com/calendar/feeds/default/owncalendars/full';
$xml = str_replace('[TITLE]', $title, $xml);
$xml = str_replace('[SUMMARY]', $summary, $xml);
$xml = str_replace('[COLOR]', $color, $xml);
$response = $gdataCal->post($xml, $uri);
}

2009年7月6日月曜日

水蒸気が増えると温度は上昇しつづける!?

1.水蒸気はとても強い温室効果ガス
(CO2の数十倍。)
2.気温が高いほど、大気中の水蒸気は増える。

1が起きると、2が起きて、また1が起きてそれが続く。しかし、2は実際にこのようになるかは不明。それは水蒸気の量がどのような理屈で決まっているのか明らかではないから。

また、もうひとつ。
中心星輻射加熱(太陽から地球に与えるエネルギーの量)

F_{s}=\frac{S(1-A)}{4}

S 中心星からの距離で決まる。
A 惑星アルベド

上のように太陽から地球までのエネルギーの量は惑星のアルベドによってきまる。この惑星アルベドとはどういうものかというと、雲があると太陽の光を遮るというような効果のことです。地球では、このアルベドは安定しているのだが、一般的にアルベドがどのようにして安定しているのか理屈は明らかではない。アルベドがもし1%変化すると二酸化炭素の増加などはまったく影響しないくらい強い影響力を持つ。
下の表から分かるように、雲の量はこのアルベドの値を決めるのに重要な役割を果たす。





雲の量アルベド
金星1000.77
地球500.30
火星~00.15


 今回二つのことを言いたい。
 ひとつは、水蒸気の動きの予測は地球温暖化にとってとても重要なファクターであり、その詳細な理屈が分かっていないので、地球温暖化の予測が100%正しいものではない。これはどの国も分かっている。もし、映画のような影響が地球に起きるならアメリカも中国も動くだろう。ただ理屈が分からないので、地球温暖化が嘘だということもできない。
 もうひとつは、ネットの温暖化に関する内容の貧弱さが目立った。科学的にどのようなことが言えるか知りたかったのだが、間違えた引用を繰り返されており、なにが正しいか調べることは非常に難しくなっている。googleの検索が正しく機能していない例の典型例になっている。

2009年7月2日木曜日

ブログにソースコードを埋め込む。

ブログにソースコードを貼り付けるためのよいサイトがありました。

下記のサイトからウィジェットを追加すれば簡単にソースコードが貼り付けれます。また、< や > をコードとして表示するためのスクリプトもあり、大変便利です。

http://www.kuribo.info/2008/04/code-prettify.html

ブログに数式を埋め込む。

 数式をtetexなどで書けることは知っていたがなかなか面倒だなと思っていた。

 まだこれが完全にベストではないかも知れないが、なかなかよい方法があったので紹介します。

1.ブログはgoogle bloggerを選択してください。
2.レイアウトのページ要素の追加のガジェットの追加を選択し、HTML/javascriptを選んでください。
3.以下のコードをコンテンツの中に書き加え、タイトルは空白にしてください。

<script src="http://tex.yourequations.com/" type="text/javascript"></script>

4.あとは、以下のような内容を投稿のなかに書き加えるだけです。

<pre lang="eq.latex">
\int_{0}^{1}\frac{x^{4}\left(1-x\right)^{4}}{1+x^{2}}dx
=\frac{22}{7}-\pi
</pre>

すると、以下のように表示されます。

\int_{0}^{1}\frac{x^{4}\left(1-x\right)^{4}}{1+x^{2}}dx
=\frac{22}{7}-\pi