ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2009年7月18日土曜日

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

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月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);
}