instagramのパーマリンクからユーザーIDやJSONのURLを取得する。

最近、遅ればせながらinstagram がお気に入りなのですが、この写真のギャラリーとして表示するためのWordPressプラグインをつくろうかなーっと思ってます。

しかし、instagramのAPIを取得するには、メールフォームで問い合わせが必要そうなので、プラグイン作って配布ってのはムリかな?と思ってました。

http://instagram.com/developer/

しかし、サードパーティーのAPIを使えば、そのユーザーが投稿した写真の情報などをJSONデータで取得できることがわかりました。

なんの会社かよくわかりませんが、エライ!

http://www.heroku.com/

ただし、このJSONデータを取得するには、instagramのユーザーIDを取得する必要があるのですが、これはパーマリンクのURLからHTMLを取得してDOMを掘って…という処理が必要です。

というわけで、これらを処理するPHPのクラスを作りました。

このクラスの使い方は以下のような感じです。

$ins = new instagram();

$uid = $ins->getUID($url); // User ID
var_dump($ins->getJsonURI($uid)); // JSON URL
var_dump($ins->getAtomURI($uid)); // Atom URL

あとは、このJSONを feile_get_contents() などでとってきて、json_decode() しでギャラリーを生成みたいな感じです。

WordPressプラグインはおいおい作ります。

facebookアプリ ”Tokyoでんき予報”

初のfacebookアプリを作りました。

Tokyoでんき予報

このアプリは東京電力の電力需要のデータを表示するアプリです。

いいねボタンをクリックしてもらえば、最新の需要データを受け取ることができます。

今後の予定

  • スマートフォンへの対応
  • ユーザー認証してサイドバーに常駐できるように
  • サーバー負荷の低減

とりあえず、facebookアプリ開発のいい練習になってくれました。

oEmbed Tweet 0.1

ツイートをURLをコピペするだけで引用できるプラグインを作りました。

firegoby » oEmbed Tweet – 記事内にURLをコピペするだけでツイートを挿入

以下は、つくろうと思った時から、完成するまでの私のハマリっぷりです。

あっ、ナイスアイディア思いついた!
無理か。。。意外。

記事のID等を指定して、ツイートを取得するAPIがドキュメントの中に見つからなかったので、一度あきらめかけました。

やっぱできるじゃん。しつこくしらべてよかった。

が、oembed tweet wordpressってGoogle先生に聞いたら、海外のサイトで参考になりそうなものを見つけました。

これをやるWordPressプラグインを作る。今日作る。 ”How to Embed a Tweet in WordPress: a Complete oEmbed Tutorial « planetOzh” http://bit.ly/fDSr7h

できるじゃん、と確信。

脳ミソがJavaScriptな頭から抜け出せない

しばらくJavaScripterだったので、PHPが途中からJavaScriptになったりして。。。

しんど!ロジックはすぐだったんだけど。。。

このあたりで、URLを取得してAPIたたいてJSON取るとこまで出来ましたが、CSSとかHTMLが意外とめんどくさい。すぐってかいてあるけど、実際には全然すぐじゃないし。。。

うー、wp_autopめ。。。

なぜか変なスペースが入ったりするので?と思ったところ、WordPressの悪名高きwp_autopフィルターに引っかかってHTMLが壊れていることを発見。

いったん、ショートコードをかませばwp_autopは怖くないというハックを発見した。

URLを一度ショートコードに変換すれば、wp_autopに引っかからないことに気づいて、解決。

WordPressの本家のプラグインレポジトリのディレクトリ名にハイフォンが入るのは、なんか気持ち悪い。

WordPress本家のプラグインレポジトリからサブバージョンのディレクトリがもらえました。

新作のWordPressプラグインをコミットした。英語はダメダメなのでツッコミ歓迎。 twitter謹製のblackbird pieみたいなプラグインだけど、こちらはスタイルやHTMLをテーマファイル内でカスタマイズできる。 http://t.co/Ka56nqh

めでたく公開。

って感じです。

Google Bookmarks for Chrome 0.4

Chromeブラウザの拡張機能Google Bookmarksをアップデートしました。

更新内容

  • ラベル及びブックマークを名前でソートしました。
    これで、FirefoxやIEのGoogleツールバーとほぼ同じ並び順になりました。
  • ラベルをクリックすると、そのラベル内のブックマークが全て開かれるようにしました。

Google MAPS API v3でdistanceFrom(二点間の距離を求める)

Google MAPS API V3では、V2で実装されていた二点間の距離を計算するためのメソッドdistanceFrom()が実装されていない。

そこで、Google MAPS API v3に、distanceFrom()を実装するためのソース。

以下のソースをJavaScript内にコピペ。

google.maps.LatLng.prototype.distanceFrom = function(newLatLng) {
   var lat1 = this.lat();
   var radianLat1 = lat1 * ( Math.PI  / 180 );
   var lng1 = this.lng();
   var radianLng1 = lng1 * ( Math.PI  / 180 );
   var lat2 = newLatLng.lat();
   var radianLat2 = lat2 * ( Math.PI  / 180 );
   var lng2 = newLatLng.lng();
   var radianLng2 = lng2 * ( Math.PI  / 180 );
   var earth_radius = 6378.1;
   var diffLat =  ( radianLat1 - radianLat2 );
   var diffLng =  ( radianLng1 - radianLng2 );
   var sinLat = Math.sin( diffLat / 2  );
   var sinLng = Math.sin( diffLng / 2  );
   var a = Math.pow(sinLat, 2.0) + Math.cos(radianLat1) * Math.cos(radianLat2) * Math.pow(sinLng, 2.0);
   var distance = earth_radius * 2 * Math.asin(Math.min(1, Math.sqrt(a)));
   return distance;
}

以上で以下のようにpoint0とpoint1の距離が求められる。と思う。

var distance = point0.distanceFrom(point1);

point0とpoint1は、google.maps.LatLngオブジェクトである必要があります。

計算式そのものは、もう、わけわかんないので、間違ってたら教えてください。

livedoor の天気予報 API 用クラスつくった。

いまさらって感じもあるかもしれませんが、livedoor の「お天気 Web サービス」用の XML をパースして、JSON とか PHP の配列で取得するためのクラスを作った。

PHPのlivedoor Weather Hacks API用クラス

でも、いざ使おうと思ったら、「お天気 Web サービス」そのものが当初予定していた用途にマッチしないことに気がついて、あららと思いながらも、せっかくなので完成(?)させた。

ところで

こういうことって、気象庁あたりがやるべきではないんだろうか?と、おもって調べたら、ここでアメダスのデータをほぼリアルタイムに掲載していた。

で、クローラーつくって取り込んでしまえと思ったら、HTML内に重複したIDが指定されているらしくパーサーがエラー。。。

「自動巡回ソフトは原則としてお断り」みたいなことが書いてあったが、新手のクローラー対策だろうか?(笑)

WordPressでGoogleブックマークみたいなこと(1)

先日から我がMacのFirefox上のGoogleツールバーがまともに動かなくなった。
それで従来から使っていたGoogleブックマークがまともに使えなくて、めっちゃストレスがたまる事態に!

Web開発の仕事は、ほとんどのブラウザを使用するので、これじゃー仕事にならんと思い、ブックマークレットでブックマークみたいなことをすればいいんだという結論に達した。

ブックマークレットならGoogleツールバーみたいなブラウザのアドオンに頼る必要がないので、まさにクラウドではないか!

といわけでWordPressのリンク機能をブックマークレットで出力するプラグインを作ることにした。

XBELって?

ブックマークのデータをどのように出力するかをいろいろ検討した結果、XBELというフォーマットを使用することにした。

“NETSCAPE-Bookmark-file-1″というフォーマットもあるらしいのだが、こいつはValidなXMLではないので、JavaScriptとかPHPでパースするのにいかにもめんどくさそうだぞということでボツ。

WordPressのリンクをXBELで出力する

とりあえず本日はWordPressのリンクをXBELで出力するところまではできた。
この週末辺りにJavaScriptのブックマークレットを作る予定。

<?php
/*
Plugin Name: Online Bookmark
Plugin URI: http://firegoby.theta.ne.jp/wp/obookmark
Description: Online Bookmark like Google Bookmark.
Author: Takayuki Miyauchi
Version: 0.1
Author URI: http://firegoby.theta.ne.jp/
*/

add_filter('query_vars', array('onlineBookmark', 'query_vars'));
add_filter('rewrite_rules_array', array('onlineBookmark', 'rewrite_rules_array'));
add_action('init', array('onlineBookmark', 'init'));
add_action('wp', array('onlineBookmark', 'wp'));

class onlineBookmark{

    function init(){
        global $wp_rewrite;
        $rules = $wp_rewrite->wp_rewrite_rules();
        if (!isset($rules['bookmark.xbel$'])) {
            $wp_rewrite->flush_rules();
        }
    }

    function rewrite_rules_array($rules){
        global $wp_rewrite;
        $new_rules['bookmark.xbel$'] = $wp_rewrite->index . '?bookmark=1';
        $rules = array_merge($new_rules, $rules);
        return $rules;
    }

    function query_vars($vars) {
        $vars[] = 'bookmark';
        return $vars;
    }

    function wp(){
        if (get_query_var('bookmark')) {
            global $user_login;
            $hide = 1;
            if ($user_login) {
                $hide = 0;
            }
            header('Content-type: text/xml; charset=UTF-8');
            print "<xbel>\n";
            $cats = get_terms('link_category');
            foreach ($cats as $cat) {
                print "<folder>\n";
                print "<title>{$cat->name}</title>\n";
                $params = array(
                    'category' => $cat->term_id,
                    'hide_invisible' => $hide,
                );
	    		$bookmarks = get_bookmarks($params);
                foreach ($bookmarks as $b) {
                    print "<bookmark href=\"{$b->link_url}\">";
                    print "<title>{$b->link_name}</title>";
                    print "<desc>{$b->link_description}</desc>";
                    print "</bookmark>";
                }
                print "</folder>\n";
            }
            print "</xbel>";
            exit;
        }
    }
}

?>

以上のソースをプラグインとして使用すると、

http://example.com/bookmark.xbel

にアクセスした際に以下のようなXMLが出力される。

だからといって、今日の時点では何の役にもたたない。。。

<xbel>
  <folder>
    <title>ブログロール</title>
    <bookmark href="http://www.yahoo.co.jp/">
        <title>Yahoo! JAPAN</title>
        <desc>Yahoo! JAPANのウェブサイト</desc></bookmark>
    </folder>
  <folder>
    <title>検索エンジン</title>
    <bookmark href="http://www.google.co.jp/">
        <title>Google</title>
        <desc>グーグルのウェブサイト</desc>
    </bookmark>
  </folder>
</xbel>

WordPressにFlickr画像を添付&リンク

WordPressはoEmbedというのに対応していて、YoutubeやFlickrのURLを記事に貼り付けるだけで、メディアを埋め込むことができる。

これはこれで便利なのだが、先日FlickrのURLを貼りつけた際に、画像は埋め込まれる一方で、大元のページ上にリンクが貼られないことが気になった。
(ちなみに、A要素で囲んだときには、メディアが埋め込まれない。。。)

これでは、人様の写真を紹介するつもりでも、結果的にパクったことになってしまう。
(リンクをはってもパクってることには変わりないかもしれないけど。)

Flickrにリンクをはるフィルタープラグイン

以下のソースをテーマファイルのfunctions.php内にコピペするか、この記事を参考にして簡単プラグインを作成して、その中にコピペする。

add_filter('oembed_result', 'filter_flickr', '', 3);

function filter_flickr($html, $url, $args){
    if (preg_match('/http:\/\/(www\.)?flickr\.com\/.*/', $url)) {
        return "<a href=\"{$url}\">{$html}</a>";
    } else {
        return $html;
    }
}

上記を上手く適用できると画像にリンクが貼られる。
ちなみに正規表現をimg要素にマッチするようにすれば、その他の画像共有サイトにも対応できるような気もする。

ちなみに

oEmbedの結果はキャッシュされるらしく、保存済みの投稿には適用されない。
そんなときは、保存しなおすと適用される。

実は、これに気がつかなくて、すごーくハマった。

perlでbit.lyのapiを使ってurlを短縮

GoogleがURLの短縮を始めたとのことで、もしかしたら窮地に陥っているかもしれませんが、個人的にはURLの短縮なんてGoogleさんがやらんでも!って感じでbit.lyさんを応援したい今日この頃。

というわけで、perlを使ったbit.ly APIによるURL短縮。
別のシステムに組み込んだものを、この記事用に書き換えたので、もし動かなかったらごめんなさい!

#!/usr/bin/perl -wT

use strict;
use warnings;
use JSON::XS;
use LWP::Simple;
use URI::Escape;

my $baseurl = shift @ARGV; # 短縮したいURL

my $bituser = ''; # bit.lyのユーザー名
my $bitkey = ''; # bit.lyのapiキー
my $apiurl = 'http://api.bit.ly/shorten?version=2.0.1&login=%s&apiKey=%s&longUrl=%s';
my $bitly = sprintf($apiurl,$bituser, $bitkey, $baseurl);

my $res = decode_json(get(uri_escape($bitly)));
my $shortURL = $res->{results}->{$baseurl}->{shortUrl};

print $shortURL;
exit;