[WebAPI]Google Chart APIがQRコードも吐けるようになった
Developer’s Guide – Google Chart API – Google Code
Google Code Blog: QR Codes now available on the Google Chart API
ボーっとねっとサーフィンしてたら、Google Chart APIがQRコード対応していることに気がついた!よく見たら、5日前とか。
これってアレですよね。自前でQRコードライブラリ持たなくてもいいってことですよね。Google様様。
ぁ、ブログのほうみてたら、出力オプションでShift_JISにも対応しているような記述がありますね。ブログの執筆者が日本人だけに、QRコードのニーズはしっかりと理解されてるってことですかね。
[php][PEAR]Services_MixiAPIとXML_Feed_Parserを使ってみた
id:shimookaさんが持ちネタを放出したとのことで、CodeReposに追加されたようなので、Services_MixiAPIを使ってみました。
とりあえず、参考にしたサイトを先にまとめておきます。
- 持ちネタ放出 - Do You PHP はてな
- mixiのAPIが増えていたので、Services_MixiAPI作ってみた - Do You PHP はてな
- Services_MixiAPI(APIドキュメント)
- 2007-11-13 - doublenegativeの日記
- PHP: POSIX - Manual
- PHP: uniqid - Manual
- PEAR :: Manual :: XML_Feed_Parser(PEARの日本語ドキュメント)
- XML_Feed_Parserでdc:subject要素を読み込む - ほそいりょすけのほめぱげ
- PHP: DOMDocument->getElementsByTagNameNS() - Manual
まずはライブラリの入手。CodeReposのServices_MixiAPIディレクトリをチェックアウトします。Subversionがない方はmixiのAPIが増えていたので、Services_MixiAPI作ってみたにPEARパッケージにしたものがおいてあるようなので、pearコマンドでインストールできます。もちろん、おすすめはCodeReposの方です。チェックアウトしたら、/src/Servicesディレクトリをinclude_pathで通っている場所にエクスポートします。あるいは、http://svn.coderepos.org/share/lang/php/Services_MixiAPI/src/Servicesを直接エクスポートしてもいいのかな。
私がとってきたバージョンは0.0.1でした。現時点では、Services_MixiAPIは、実行環境がWindowsだと動きません。Services_MixiAPI_AbstractAPIクラスのbuildWSSEAuthメソッドががPOSIX関数を用いているためです。XAMPPerな私はWindowsの実行環境で開発したいので、たぶん一意なハッシュを得るのに必要なんだろうなと適当に解釈して、uniqid()関数でこんな感じで書き換えました。
-
private function buildWSSEAuth($user, $pass) {
-
// ----> uechoco modified begin
-
//$nonce = pack('H*', sha1(md5(time().rand().posix_getpid())));
-
// <---- uechoco modified end
-
$wsse_header = sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $user, $digest, base64_encode($nonce), $created);
-
return $wsse_header;
-
}
あと、今回はXML_Feed_ParserというPEARのライブラリも使っています。shimookaさんのサンプルだとSimpleXMLElementを使っているので、同じの使ったら記事にする意味ないかなと思って、XML_Feed_Parserに挑戦してみました。
説明が面倒なので、CYでお願いします。CY?「コード読め」ですよ。取得したAtomを眺めてたら、mixiの拡張フォーマットが指定してあって、ユーザーの画像と、マイミクなのかどうかが取得できるようなので一緒に取得してみました。
-
<?php
-
/**
-
* Services_MixiAPIとXML_Feed_Parserを用いてMixiの足跡を取得するサンプル
-
*
-
* PHP version 5
-
*
-
* @author Yusuke Ueno (uechoco)
-
* @license http://www.php.net/license/3_01.txt The PHP License, version 3.01
-
* @see http://pear.php.net/package/Services_MixiAPI
-
*/
-
-
// クラスの読み込み
-
require_once 'Services/MixiAPI/Factory.php';
-
require_once 'XML/Feed/Parser.php';
-
-
// mixiの個人情報を定義
-
class Mixi_Info {
-
// mixiのログインID
-
const LOGIN_ID = '自分のmixiのログインID';
-
// mixiのパスワード
-
const PASSWORD = '自分のmixiのログインパスワード';
-
// mixiのユーザーID
-
const USER_ID = '自分のmixiのユーザーID';
-
}
-
-
// 足跡オブジェクトの作成
-
$service = Services_MixiAPI_Factory::getInstance(
-
Services_MixiAPI_Factory::API_MODE_FOOTPRINT, // 足跡
-
Mixi_Info::LOGIN_ID, // ログインID
-
Mixi_Info::PASSWORD, // パスワード
-
Mixi_Info::USER_ID // ユーザーID
-
);
-
-
// 足跡の取得
-
$service->execute();
-
-
// とりあえず表示
-
try {
-
$feed = new XML_Feed_Parser($service->get());
-
} catch (XML_Feed_Parser_Exception $e) {
-
}
-
-
// 足跡情報の整形
-
foreach ($feed as $k => $entry) {
-
-
// 通常のAtomフィールドを取得する
-
'id' => $id,
-
'name' => $entry->author,
-
'link' => $entry->link,
-
'unixtime' => $entry->updated,
-
);
-
-
// 拡張情報を取得する
-
$model = $entry->model;
-
foreach ($tracks as $localName) {
-
$nodes = $model->getElementsByTagNameNS('http://mixi.jp/atom/ns#tracks', $localName);
-
foreach ($nodes as $node) {
-
$footprints[$k][$localName] = $node->nodeValue;
-
}
-
}
-
}
-
?>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
<title>足跡一覧</title>
-
<style type="text/css">
-
<!--
-
ul#footprint {
-
list-style-type: none;
-
}
-
-
ul#footprint li {
-
display: block;
-
border: solid 1px gray;
-
padding-left: 100px;
-
height: 76px;
-
background-repeat: no-repeat;
-
}
-
-
ul#footprint li .friend {
-
color: green;
-
}
-
-->
-
</style>
-
</head>
-
<body>
-
<h1>足跡一覧</h1>
-
<ul id="footprint">
-
<?php
-
foreach ($footprints as $footprint) {
-
'<li style="background-image: url(%s)"><a href="%s" title="%s">%s</a>さん (%s 訪問、%s)'."\n",
-
$footprint['image'],
-
$footprint['link'],
-
$footprint['name'],
-
$footprint['name'],
-
$footprint['date'],
-
$footprint['relation'] === 'friend' ? '<span class="friend">お友達</span>' : '他人'
-
);
-
}
-
?>
-
</ul>
-
</body>
-
</html>
モザイクが面倒だったので、名前だけにmd5かけてちょんぎってます。
で、この足跡のリストをどうするの?って言われると、なんとも困るんですが、適当にTwitterとかとあわせてみたりしてください。私の目的はServices_MixiAPIを使ってみたかっただけなのです。
[php][CakePHP]日英・英日翻訳コンポーネント
ようやくCakePHPの勉強を開始しました。『CakePHPガイドブック』と『PHPフレームワーク完全マスター』で勉強しています。
以前[php][WebAPI]EJ, JE translation APIは翻訳WebAPIとして使えるで紹介したEJ, JE translation APIを用いてなんか変なもの作っています。CakePHPの作法がよくわからないのですが、コントローラの中に書くのは良くなさそうなので、適当に本を見てコンポーネントにしてみました。phpのバージョンやライブラリの依存については[php][WebAPI]EJ, JE translation APIは翻訳WebAPIとして使えるを参照してください。
-
require_once 'HTTP/Client.php';
-
/**
-
* EJ, JE translation APIを用いて翻訳を行うコンポーネント
-
*
-
* @author uechoco
-
* @see http://muumoo.jp/news/2007/05/09/0translationapi.html
-
*/
-
-
class TranslateComponent extends Object
-
{
-
/**
-
* 固定ID定数
-
*/
-
const ID_EJ = 'ZM5oVmX92xGrFWiRJhOy0Q';
-
const ID_JE = 'ohZnaGr92xG36xIFyzUFzw';
-
-
/**
-
* コントローラを保持
-
*/
-
var $controller = null;
-
-
-
-
/**
-
* HTTP_Clientの初期化パラメータ
-
*
-
* @access private
-
*/
-
'timeout' => 10,
-
'allowRedirects' => true,
-
'maxRedirects' => 3
-
);
-
'Accept-Language' => 'ja-JP,ja;q=0.9,en;q=0.8'
-
);
-
-
/**
-
* POSTする先のURI
-
*
-
* @access private
-
*/
-
var $uri = 'http://pipes.yahoo.com/pipes/pipe.run';
-
-
-
/**
-
* POSTするパラメータ(固定部分)
-
*
-
* @access private
-
*/
-
'_run' => 1,
-
'_render' => 'json', // or rss
-
);
-
-
function
-
__construct()
-
{
-
parent::__construct();
-
}
-
-
function
-
startup(&$controller)
-
{
-
$this->controller =& $controller;
-
}
-
-
-
/**
-
* 英日翻訳
-
*/
-
function translate_ej(&$word)
-
{
-
return $this->_translate(TranslateComponent::ID_EJ, $word);
-
}
-
-
-
/**
-
* 日英翻訳
-
*/
-
function translate_je(&$word)
-
{
-
return $this->_translate(TranslateComponent::ID_JE, $word);
-
}
-
-
-
/**
-
* 翻訳本体
-
*/
-
function _translate($_id, &$word)
-
{
-
-
// レスポンスの発行
-
$client =& new HTTP_Client($this->http_client_default_param, $this->http_client_default_header);
-
$client->post($this->uri, $p);
-
$response = $client->currentResponse();
-
-
// JSON形式をPHPで操作可狽ネ形式にデコード
-
$ret = json_decode($response['body']); //>= php 5.2.0
-
$tuple = $ret->value->items[0];
-
-
// 翻訳結果
-
}
-
}
[php][PEAR]Services_Amazonが1年ぶりにマイナーバージョンアップ
AmazonのWebAPIを使いやすくするPEAR::Services_Amazonが2007/12/17に0.7.1にマイナーバージョンアップしました。一部のメソッドのバグの修正と、いくつかの機能追加の要望に対応したようです。ChangeLogにはServices_AmazonECS4.phpがプロキシをサポートしたとも書いてありますね。
Services_AmazonECS4.phpはオプションをいろいろと追加していくことで、Amazon WebAPIのバージョンアップによって新しく取得できるようになった項目などにも対応できています。個人的にはServices_Amazon.phpのような、特定の取得項目(たとえばISBNとか)にあわせたメソッドを量産しておいてほしいような気もします。まぁ・・・自分でWrapper作ってやれよってことですよね。はい。
[php][WebAPI]EJ, JE translation APIは翻訳WebAPIとして使える
前回のWebserviceX.NET Translation Engineに引き続き、翻訳WebAPIの調査。今回はEJ, JE translation APIの調査です。
EJ, JE translation APIは、Yahoo! Babel Fish を Yahoo! Pipes経由で呼び出すことによって文章を翻訳するAPIです。下記が本家APIのURLとMASHAPEDIAの紹介記事です。
英語←→日本語の翻訳APIとして使えるYahoo Pipesを作った
http://muumoo.jp/news/2007/05/09/0translationapi.html
JSON形式で翻訳「EJ, JE translation API」 : WEBAPI一覧 : MASHUPEDIA - マッシュペディア - : Web API x Mashup
http://www.mashupedia.jp/webapis/view/292
概要としては、REST形式でAPIにアクセスし、翻訳結果をRSS/JSON/JSONPで返す感じです。
- APIのURL
- http://pipes.yahoo.com/pipes/pipe.run
- パラメータ
- _id
- 翻訳の種類
- EJ(英語→日本語)なら、「ZM5oVmX92xGrFWiRJhOy0Q」
- JE(日本語→英語)なら、「ohZnaGr92xG36xIFyzUFzw」
- _run
- 「1」で固定
- _render
- レスポンス形式
- 「rss」または「json」
- _callback
- _render = jsonのとき、JSONP用のコールバック関数名
- text
- 翻訳する文章(エンコード済み)
- JavaScriptから実行する場合、encodeURIComponent()関数をかける必要がある
- phpから実行する場合、urlencode()関数をかける必要がある
- _id
さきほどの本家のページにはJavaScriptのみで実装するサンプルが公開されています。今回はphpでJSONを分解するサンプルを試してみました。
-
require_once 'HTTP/Client.php';
-
-
// 翻訳したいテキスト
-
$text = 'This is a pen.';
-
// HTTP_Clientの初期化パラメータ
-
'timeout' => 10,
-
'allowRedirects' => true,
-
'maxRedirects' => 3
-
);
-
-
'Accept-Language' => 'ja-JP,ja;q=0.9,en;q=0.8'
-
);
-
// POSTする先のURIとそのパラメータ
-
$uri = 'http://pipes.yahoo.com/pipes/pipe.run';
-
'_id' => 'ZM5oVmX92xGrFWiRJhOy0Q', // EJ
-
//'_id' => 'ohZnaGr92xG36xIFyzUFzw', // JE
-
'_run' => 1,
-
'_render' => 'json', // or rss
-
//'_callback' => 'example20070509callback', // JSONP
-
);
-
// レスポンスの発行
-
$client =& new HTTP_Client($http_client_default_param, $http_client_default_header);
-
$client->post($uri, $param);
-
$response = $client->currentResponse();
-
// JSON形式をPHPで操作可狽ネ形式にデコード
-
$ret = json_decode($response['body']); //>= php 5.2.0
-
$tuple = $ret->value->items[0];
-
// 表示
実行結果のサンプルは以下のようになります。
Title: This is a pen. Description: これはペンである。
いくつかプログラムの補足をしておきます。
1. レスポンスの発行にはPEAR::HTTP_Clientライブラリを使用しました。簡単なライブラリなので何をしているのかはすぐにわかると思います。
2. json_decode()関数は、php 5.2.0から標準で組み込まれるようになったJSON 拡張モジュールに依存しています。それ以前のバージョンの方は、PEAR::Services_JSONやphp-jsonなどの拡張ライブラリをインストールしてください。
これなら簡単な文章を翻訳するのに十分使えますね!

