プログラム

jQueryでtwitterの最新ツイートを取得する方法

やっと最近、prototoype.jsからjQueryな人に世の中の人から7周半遅れくらいで移行してきたので簡単にメモ。
twitterの最新ツイートは、以下の様に書くと取得することができる。(Twitterの認証不要なAPI利用)
APIの応答値にJSONが使えるためすぐにjQueryで操作できる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
	<script src='js/jquery/jquery.js' type='text/javascript'></script>
	<script type='text/javascript'>
		$.getJSON(
			'http://twitter.com/statuses/user_timeline/hideack.json?callback=?',
			{},
			function(data) {
				$("#toptweet").html(data[0].text);
			}
		);
	</script>
</head>
<body>
<div id="toptweet"></div>
</body>
</html>

Javaでfor-each(拡張for文)

訳あって最近Javaで戯れる。
で、配列をいわゆるfor-each的に回したくなったときPHPだとすぐにforeach($ary as $k=> $v) と頭に浮かぶのだけど、Java書いていてついつい下の様に書いてしまった。

class Sample{
public static void main(String args[]){
String[] strary = {"foo", "bar", "hoge"};
for(int i=0; i<strary.length; i++){
System.out.println(strary[i]);
}
}
}

あぁ、旧世代。でも、昔はこう教科書にも書いてあったのだ。
ちゃんと、今のJava*1はfor-eachできるのですね。

class Sample{
public static void main(String args[]){
String[] strary = {"foo", "bar", "hoge"};
for(String val: strary){
System.out.println(val);
}
}
}

他にもいろいろ知ったことはあるのだけど、また気づいた度にメモしていこう。
一度、勉強し直した方がよいのかもしれないな。

*1:今のjavaといっても拡張for文はJDK5からの実装だから5年くらい前の話だ。恐ろしい。

StdClassをArrayに変換する方法

キャストすればよいですよ。と。

<?php
$obj = new Sample();
$obj->foo = 'foo';
$obj->bar = 'bar';
$array = (array) $obj;
print_r( $array );
/*
    Array
    (
       [foo] => foo
       [bar] => bar
    )
    */
?>

なんで気づかなかったんだろう…。

Twitter APIとPEAR::Services::Twitterで全フォロワーの情報を取得

Twitter APIを通して、あるユーザの全フォロワーを取得したいと思ったら以下の様な形になる。
ここでは、スクリーン名と設定してあるアイコンの保管位置を取得している。
ミソと言うわけではないが、$info = $twitter->statuses->followers(array("cursor" => -1)); としないと、フォロワーの人数が100人を超えた場合に続けてデータを取得するためのcursorの値が取れない。
最初設定しないで、cursorの値が取れず大いに悩んだ。

参照: Twitter REST API Method: statuses followers

<?php
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';
$consumerkey = "";        // Twitterから開発者が取得したConsumer keyを設定
$consumersecret = "";   // Twitterから開発者が取得したSecret keyを設定
$accesstoken = "";          // TwitterのOAuth認証で得ているAccess Token
$accessecret = "";           // TwitterのOAuth認証で得ているAccess Token Secret
try{
$twitter = new Services_Twitter();
$oauth   = new HTTP_OAuth_Consumer($consumerkey, $consumersecret, $accesstoken, $accessecret);
$twitter->setOAuth($oauth);
$followerprop_ary = array();
$cursor = -1;
do{
$info = $twitter->statuses->followers(array("cursor" => $cursor));
foreach($info->users as $follower){
$tmp = array(
"screen_name" => $follower->screen_name,
"profile_img" => $follower->profile_image_url,
);
$followerprop_ary[] = $tmp;
}
$cursor = $info->next_cursor_str;
}while($cursor != "0");
print_r($followerprop_ary);
printf("Total %d followers.\n", count($followerprop_ary));
} catch (Services_Twitter_Exception $e) {
echo $e->getMessage();
}
?>

PEAR::Services::Twitter

ちょっとPHPTwitterでゴニョゴニョしてみるためにインストール。
いろいろとやり方はあちこちに掲載されてはいますが、PEARのパッケージ使うのが吉なのかな。
Services_Twitterというのがあるのでインストール。ただし、betaなのでforceオプション付きで入れる。
あと、ユーザ認証にOAuthつかうので、この認証用にHTTP_OAuthインストール。

$ pear install --force services_twitter
$ pear install --force http_oauth

これで準備OK。

iモード向けXHTMLで内部リンクを作る

携帯向け(特にiモード)向けのXHTMLを書いていて、ページ内リンク・内部リンクでえらく困ってしまったのでメモがてら記録。
最初、次の様に書いていたのだけど内部リンクにできなかった。

駄目な例(1)

<h1 id="foo">MENU</h1>
(中略)
<a href="#foo">menuへ戻る</a>

iモードシミュレータも「h1タグへのid要素の割り当ては無効です」と表示して、動作させても確かに機能していない。
そういえば、以前、古典的な書き方をした記憶もかすかにあったので次の様にも書いてみた。

駄目な例(2)

<a name="foo"></a>
<h1>MENU</h1>
(中略)
<a href="#foo">menuへ戻る</a>

これでもダメであった。
で、落ち着いてよく考えるともしかして以前は単純なHTMLで今回はXHTMLなので、このあたり気をつけないといけないのかな。と思ったら、案の定だった。
ドコモのページにHTMLとXHTMLの対応表が掲載されていた。

iモード対応HTMLとiモード対応XHTML比較表
http://www.nttdocomo.co.jp/service/imode/make/content/browser/xhtml/index.html

この中で見ると、Aタグのname要素はid要素に置き換えましょう。と書いてあるので、以下の様に書くときちんと内部リンクとして認識された。

正しい例

<a id="foo"></a>
<h1>MENU</h1>
(中略)
<a href="#foo">menuへ戻る</a>

相変わらずわかってないなぁ。と反省。
これ、auやsoftbankでも問題なく動作するのだろうか。気になるところ。

EthnaのActionFormの雛形の話

ethnaコマンドでActionクラスを作ると以下の様な雛形が出力される。

<?php
class Foo_Form_Bar extends Foo_ActionForm
{
/**
     *  @access private
     *  @var    array   form definition.
     */
var $form = array(
/*
        *  TODO: Write form definition which this action uses.
        *  @see http://ethna.jp/ethna-document-dev_guide-form.html
        *
        *  Example(You can omit all elements except for "type" one) :
        *
        *  'sample' => array(
        *      // Form definition
        *      'type'        => VAR_TYPE_INT,    // Input type
        *      'form_type'   => FORM_TYPE_TEXT,  // Form type
        *      'name'        => 'Sample',        // Display name
        *
        * (中略)
        *
        *  ),
        */
);
// 以下略
?>

となっているのだけれど、ActionFormの$form変数の中が/* 〜 */ のコメントで囲まれている部分の最左に "*" が記載されているのだけど、自分が作りたいフォームの定義を追加しようとするときにこのコメント部分*1をコピーして一部を直して使おうと思ったときに少し面倒な気もするのだけど...。
もっとも、自分で手を入れて直したりエディタで置換してしまえばいいのだけの話ではあるが。

実はこういう風にFormの定義を書くのが間違っていたりすると言うオチではないだろかというのが少し怖い。
(ただ、こればっかしは手で書かないと駄目だよなぁ。。。)

*1:出力されているコメント中の'sample'=>array(...)の部分

Google Static Maps API V2

Javascript無しで利用することができるスタティック版のGoogle map APIのバージョンが上がっていたのを今日知った。

Welcome to the developer documentation for the Google Static Maps API!
The Google Static Maps API lets you embed a Google Maps image on your webpage without requiring JavaScript or any dynamic page loading.
Static Maps V2 API Developer's Guide

V1との違いは以下の通り*1

  • APIキーが不要になった
  • ピンにアイコン画像を設定できる様になった
  • 地図の上に任意の多角形のレイヤー(polygonal)を貼れる様になった

で、V1とAPIのインターフェースの違いは

等々。V2の方がパラメータが細かくなっているけど、極端に大きくは変わっていないかな。
APIのKeyが不要になったのは大きい。

*1:ざっくりドキュメント読んだ範囲

使い捨て型ブックマークを作ってみている(途中)→['10/4/3更新]とりあえず動いてるよー。

人とホームページのリンクをやり取りしたり、動画投稿系サイトのURLを集めたりするときにブックマークするためのページが作られるものがあると自分が便利だなぁ。と思って作ってみた。
イメージ的には、ブックマークページを1つ作ると、編集用ページと閲覧用ページの2種類のURLが作られて、編集用URLを知る人はURLの登録と閲覧が行えて、閲覧用URLを知る人は閲覧だけが行える。
パブリックにしたければ、閲覧用のURLを公開すればいいし、限定したければそのURLを伝えたい人だけに伝えればよしと考えている。
もちろん、そのURLが漏れたら誰でも閲覧できる訳だけど、あくまでもお気楽共有を目的にしているので…。
で、使い捨てとしているのは作られたブックマークページに対して一定期間誰もアクセスしなくなったら消えてしまう。という風にしようと考えているため。

登録するページによってブックマークページ内に表示する内容が編集して表示される様になっていて、

としてみていたりする。ここは種類を増やしたいな。

動き始めたので閲覧ページだけ置いてみた。実際にブックマークページの作成や実際のURL登録用のページはまた後日*1ということで。
http://www.feeddown.com/links/bm/ca7305d/

f:id:hideack:20100306211134p:image

['10/4/3更新]
とりあえず動いてます。変なところ多いかもしれないけれど。あくまでもお気軽・使い捨てがモットーです。
http://www.feeddown.com/links/

*1:如何せんゆっくり作ってるので…。

amazon.co.jpの長いURLを短くする

例えば、以下の様な感じ。
f:id:hideack:20100221232817p:image
amazon.co.jp上で商品を検索したり、blog等で紹介されているamazon.co.jpで扱われている商品の詳細を見るために張られているamazonへのリンクのURLはしばし非常に長い。
これは、以下の様に短くすることができる。

http://www.amazon.co.jp/dp/(asinコード)

これをPHPで作るにはasinコードを抽出すればいいのだが、そのためには以下の様に書けばよい。

<?php
$url = "http://www.amazon.co.jp/〜";  // amazonの長いURL
preg_match("/[^0-9A-Z]([B0-9][0-9A-Z]{9})([^0-9A-Z]|$)/", $url, $resp);
$returnurl = sprintf("http://www.amazon.co.jp/dp/%s", $resp[1]);
?>