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プラグインはおいおい作ります。

twitterの最新のツイートをfacebookに投稿する。

twitterで指定したユーザーの最新のツイートをfacebookのウォールに投稿するPHPスクリプトを作りました。

このアプリのために作りました。

ただーし、実際にこれを動かすには、

  • facebook にアプリケーション登録をする。
  • アクセストークンを取得する。

という一見簡単そうだけど、めっちゃめんどくさい手続きが必要です。

以上が完了したら、以下のスクリプトの”YOUR …”の部分を修正して Cron でぶん回してください。

twitterのユーザー名は、コマンドライン引数で渡すようになっています。

あと、require してるファイルは facebook のPHP 用の SDK です。

Cronには、以下のように渡したほうが幸せになれると思います。

*/10 * * * * export LANG=ja_JP.UTF-8; /usr/bin/php /path/to/cron.php twitter_user

WordPressで記事の最終更新日を取得

WordPressで最終更新日を表示したいのだが、the_modified_を使うと、予約投稿時に、公開日よりも更新日が早くなってしまう。何か良い方法はないものか。誰か知ってたら教えてください。

これではダメ?

/*
  get_the_modified_time()の結果がget_the_time()より古い場合はget_the_time()を返す。
  同じ場合はnullをかえす。
  それ以外はget_the_modified_time()をかえす。
*/

function get_mtime($format) {
    $mtime = get_the_modified_time('Ymd');
    $ptime = get_the_time('Ymd');
    if ($ptime > $mtime) {
        return get_the_time($format);
    } elseif ($ptime === $mtime) {
        return null;
    } else {
        return get_the_modified_time($format);
    }
}

使い方

  • 上記のソースをfunctions.phpにコピペしてください。
  • 最終更新日を表示したいところに以下のようなソースを記述してください。
<?php if ($mtime = get_mtime('Y/m/d')) echo '最終更新日: ', $mtime; ?>

住所からGoogle MAPに変換するショートコードなどを修正しました。

久しぶりにGoogle MAPに触る機会があったのでこのサイトで配布している以下の二つのスクリプトを修正しました。

いまさらですけど。(^^;)

「さくらのVPS」上のWebサーバーのパフォーマンス向上

このサイトは「さくらのVPS」を使用しているのだが、徐々にパフォーマンスが低下するという現象が発生するようになった。
ひどい時には1ページの表示に30秒以上かかる。。。

Apacheを再起動すると状況が改善するため、ApacheとかPHPのチューニングを行うことにした。

以下は次回以降「さくらのVPS」を使用する際のメモということで。

httpd.conf の修正

以下のように設定を変更した。

  • MaxKeepAliveRequestsの値を200から50に変更
  • KeepAliveTimeoutの値を5から2に変更

以上はTCPコネクションの無駄遣いを減らすために行った。
今回のように徐々にパフォーマンスが低下するのは関係ないような気もするけど、そのあたりは詳しくないので、これはなんとなく。

  • PreforkのMaxRequestsPerChildの値を4000から50に変更

このサイトはPHP(WordPress)で動作しており、こまめにプロセスを生成しなおしてメモリーリークなどに備えたいと考えたので。
Apacheが徐々に重くなったのは、この設定で改善されると期待している。

memcacheの導入

以下のコマンドを実行して必要なパッケージをインストールした。
インストールした後は、memcachedの起動とApacheの再起動をしただけで特に設定の変更は行わなかった。

# yum install memcached
# yum install php-pecl-memcache

これはかなり効果があった気がする。
ただ、一時的にパフォーマンスが改善しても、今回のように徐々に重くなった事に対しては、上述のhttpd.confの変更が重要な気がする。

WordPressのキャッシュプラグインについて

いれようかどうしようか迷ったのだが、結局入れなかった。

どのプラグインを入れるべきか悩んだ挙句に面倒になったのと、今回は直感的にボトルネックがWordPressではないような気がしたので。。。

現時点ではキャッシュ系のプラグインをインストールしなくても状況は大幅に改善された。

その他

今回の現象はこれをやっても改善されなかったが、数日前に一応対策済み。

[001387]さくらのVPSで「CentOS」を利用していますが、回線速度が遅くアクセスに時間がかかります。 | FAQ Search – さくらインターネット

phpのescapeshellarg()に日本語を渡す際の注意

めっちゃハマったのでメモ。

これはマニュアルにも記載されていないみたい。

escapeshellarg() の引数に日本語を渡す

もともと別のサーバーで動作していたphpスクリプトを別のサーバーに移行した際に、以下のような不具合に遭遇した。

<?php

$tmp = '日本語';
$tmp = escapeshellarg($tmp);

echo $tmp; // $tmpの中身がカラ!?

?>

要はescapeshellarg()に日本語を渡すと値がカラ(シングルクォートのみ)になるということ。

原因

いろいろ調べた結果、どうやらescapeshellarg()は、OS側の環境変数LANGの値によって挙動が変わるらしい。

今回はインストール直後の某VPSに移行したばかりだったのでLANGが設定してなかった。

そこで、/etc/sysconfig/i18nに以下のような記述を追加したら正常に動作した。

LANG=ja_JP.UTF-8

無効なマルチバイト文字列は処理しないということらしい。

なるほど、かしこい!

PHPで条件付きGETとかEtagとかでパフォーマンス向上

先程アップデートしたWordPressプラグインで実装したコードの一部をご紹介。

以下で紹介する関数はPHPで条件付きGET(Conditional GET)に対応するための関数です。

どういうものかというと、ブラウザからリクエストがあった際に、最終更新日(Last-Modified)をレスポンスヘッダでおくると、そのブラウザは次回以降のアクセスの際に「あの日以降更新した?」と聞いてくるので、更新してなかったときには「まだしてないよ」とだけ返す(コンテンツは返さない)仕組みのことです。

ソース

function conditional_get($time = 0)
{
  $last_modified = gmdate('D, d M Y H:i:s T', $time);
  $etag = md5($last_modified);
  header('Last-Modified: '.$last_modified);
  header('ETag: "'.$etag.'"');
  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $last_modified) {
      header('HTTP/1.1 304 Not Modified');
      exit;
    }
  }
  if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
    if (preg_match("/{$etag}/", $_SERVER['HTTP_IF_NONE_MATCH'])) {
      header('HTTP/1.1 304 Not Modified');
      exit;
    }
  }
}

使い方

あらかじめ、コンテンツの最終更新日を取得して、conditional_get() に渡すと、必要な処理をいろいろやってくれます。

そのあとで、実際のコンテンツを取得して出力です。
実際には、$time以降の更新がない場合は、conditional_get() 内で終了します。

$time = get_modified() // コンテンツの更新日時をローカルタイムスタンプで取得

conditional_get($time);

$html = get_contents(); // コンテンツを取得
echo $html;

conditioal_get() の前にコンテンツを取得しちゃうと意味が半減することがあるかもしれないので注意。

Enhancing CSS & JavaScriptでTwenty Tenテーマをカスタマイズ

このサイトで配布しているEnhancing CSSプラグインとEnhancing JSプラグインは、それぞれ外部CSSと外部JavaScriptをWordPressに添付するプラグインです。

今回の記事では、これらのプラグインを使ってTwenty Tenテーマをカスタマイズする方法をご紹介します。

カスタマイズ例

以下の画像はTwenty TenテーマにEnhancing CSS及びEnhancing JavaScriptを使用して、外部CSS及びJavaScriptでカスタマイズした事例です。

CSSとJavaScript以外はメニューの設定も含めて全て同じです。もちろんテーマファイルの書き換えも一切行っていません。

はじめに

以下のサンプルを試す前にプラグインをインストールしてください。

メニューの位置を変更する

カスタマイズ例ではメニューの位置が画像の上部に変更されています。
この修正は、CSSでも可能ですが、JavaScriptにて行ないました。

  1. まず、Enhancing JavaScriptの管理画面(外観->拡張JavaScript)を開いて、Enqueue Scriptsの中からprototypeにチェックを入れて保存してください。
    以上の操作でテーマファイル側にprototype.jsが組み込まれます。
  2. 以下のソースをコピーしてJavaScriptのエディター内にペーストしてください。

コピー&ペーストするソース

function init(){
  var oImg = $('branding').getElementsByTagName('IMG')[0];
  if (document.getElementsByTagName('BODY')[0].className.indexOf('home') >= 0) {
    $('masthead').appendChild(oImg);
  } else {
    $('branding').removeChild(oImg);
  }
}

Event.observe(window, 'load', init);

サイトタイトル部分に画像を使用する

  1. まず任意のロゴ画像を作成して、WordPressのメディアからアップロードして、画像のURLをコピーしてください。
  2. 以下のソースを”外観” -> ”拡張CSS” のCSSエディター内にペーストして、画像のパスの部分をアップロード画像と書き換えてください。(画像の横幅や高さもかえましょう!)
#site-title a
{
  background-image: url(/wp-content/uploads/2010/09/buttonw-grey-8bit.png);
  background-position: left top;
  background-repeat: no-repeat;
  display: block;
  width: 178px;
  height: 58px;
  text-indent: -9999px;
  overflow: hidden;
}

#site-description
{
  text-align: right;
}

サイトを確認してください。
もし、何も表示されていなければ画像のURLに間違いがあります。
また、ロゴ画像の上下左右が欠けている場合は、横幅と高さを調べて上記のソースと差し替えてください。

メニューをカッコよくする

以下のソースを”外観” -> “拡張CSS” のCSSエディター内に追加してください。

/* メニュー全体の背景の設定 */
#access
{
  background-color: #ffffff;
  background-image: url(/wp-content/uploads/2010/09/menu.png);
  background-repeat: repeat-x;
  background-position: left top;
  color: #000000;
  border-bottom: 1px solid #cccccc;
  margin-bottom: 5px;
  padding: 5px 0;
}

/* メニューのリンク文字列 */
#access a
{
  color: #000000;
}

/* メニューの項目別の背景 */
#access li > a
{
  background-image: url(/wp-content/uploads/2010/09/menu-items.png);
  width: 150px;
  height: 40px;
  padding: 0px;
  text-align: center;
  margin-right: 3px;
}

/* メニューの項目別の背景(マウスオーバー及びカレントページ) */
#access ul li.current_page_item > a,
#access li:hover > a
{
  background-image: url(/wp-content/uploads/2010/09/menu-items.png);
  background-position: left bottom;
  color: #666666;
}

/* ポップアップメニューを無効にする */
#access ul li:hover > ul
{
  display: none;
}

まとめ

すごく、ざっとした説明で恐縮ですが、以上のような手順で、JavaScriptによるHTMLの書き換え+CSSというテクニックを使用すれば、複雑なテンプレートタグを使用しなくても十分に実用的なサイトが作れることがおわかりいただければ幸いです。

参考までにサンプルで使用した画像をおいておきますので、ご利用いただければ上記の事例が簡単に再現できると思います。

サンプル画像のダウンロード

WordPressプラグインEnhancing JavaScript 0.1をリリース

WordPress上で外部JavaScriptを取り扱うためのプラグインをリリースしました。

firegoby » WordPressに外部JavaScriptを追加するプラグイン

このプラグインを使用するとビジュアル エディターでJavaScriptを編集したり、WordPressにデフォルトで組み込まれているprototype.jsやjqueryなどのJavaScriptフレームワークを簡単にテーマに組み込むことが可能です。

Enhancing CSS 0.2

先日リリースしたEnhancing CSSのアップグレードを行ないました。

WordPressに外部CSSを追加するプラグイン

変更内容

  1. CSSの入力用のインターフェースに、行番号表示や、「取り消し」「やり直し」「検索」「置換」のボタンの追加など、ビジュアルエディターとしての機能を向上しました。
  2. 同梱のCodeMirrorのライセンスファイルも添付しました。
  3. その他、いくつかの外観に関する細かい修正を行ないました。