『東日本大震災』関連情報のまとめサイト

Google Crisis Response 東日本大震災(東北地方太平洋沖地震)(Google)
震災に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』があります。Google Checkout による日本赤十字社への義援金もこちらから出来ます。
地震・津波災害に関する情報(Yahoo!Japan)
震災関連情報源へのリンク集。天気情報コンテンツの中にありますが、ライフライン、交通、震災関連の迷惑メール情報など多岐に渡っています。

2012年2月4日 土曜日

開発者必見 WordPressのデバッグモード

Filed under: WordPress,ハック,プラグイン
タグ:, , ,
時間:17時47分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録
Popularity: unranked
by Popularity Contest 日本語版

WordPressにはデバッグモードがあります。このモードでは普段抑制されている警告メッセージが表示されるようになり、非推奨APIを使用した場合にメッセージが表示されます。実装されたのは2.5からのようです。

デバッグモードにするには、定数 WP_DEBUGtrue にするための記述を wp-config.php に次のように記述します。3.0からは wp-config-sample.php に初期状態で記述があり、値は false です。

PHP:
  1. define('WP_DEBUG', true);

今までデバッグモードでの動作確認をしたことのないプラグイン開発者の方は、ぜひ1度行ってください。予想以上に警告が表示されると思います。可能であれば開発用のWordPress環境を用意し、常にデバッグモードにしておくことをお勧めします。

初期化されていない変数への参照

ありがちなのは、初期化されていない変数や配列要素への参照が行われたと言うもの。PHPは初期化しなくても変数と配列要素が使用できますが、これは警告メッセージが表示されます。

PHP:
  1. print $data;    // 警告が出る
  2. $data = '';
  3. print $data;    // 警告は出ない

PHP:
  1. $data = array();
  2. print $data[0]// 警告が出る
  3. $data[0] = '';
  4. print $data[0]// 警告は出ない

PHP:
  1. $data = array();
  2. print $data['i1']// 警告が出る
  3. $data['i1'] = '';
  4. print $data['i1']// 警告は出ない

最後のコードでは次のような内容となります。

Notice: Undefined index: i1 in ファイルのパス on line 警告対象のある行

拙作の AmazonLink では配列要素への参照でこの警告が多く出ました。例えば次のようなコードです。

PHP:
  1. if ( '' != $dataList['idx'] )
  2. {
  3.     // 処理
  4. }

この場合、初期化していない $dataList['idx'] を参照すると警告が出ます。そこで、次のように変更しました。

PHP:
  1. if ( isset($dataList['idx']) and '' != $dataList['idx'] )
  2. {
  3.     // 処理
  4. }

非推奨APIの使用

WordPressはAPIの整理を以前から行っており、多くのAPIが非推奨になったり特定の使用方法が非推奨となっています。デバッグモードにするといつから非推奨になったかと代替APIの有無を表示してくれますが、該当箇所として表示されるのは実際の場所ではなく、そのメッセージを表示するための関数が記述された場所になっています。自分のプログラムではないと勘違いしないよう注意が必要です。

次の例は、 get_settings が2.1から非推奨となっているので get_option を使うようにと言うものです。

Notice: get_settings is deprecated since version 2.1! Use get_option() instead. in ファイルのパス/wp-includes/functions.php on line 3237

この例ではほぼ単純な置き換えだけですのでわかりやすいのですが、中には何が悪いのかわかりにくいものがあります。

add_option

Function Reference/add option(WordPress.ORG Codex)

オプションを追加するためのAPIです。引数が4つありますが、オプションの説明を指定する3つ目の引数は2.3から非推奨となりました。メッセージだけを見るとAPI自体が非推奨になって代替APIがないように思えてしまいますが、実際には引数の1つだけが対象です。警告が表示されないようにするには、引数を空文字('')にします。

add_options_page

Function Reference/add options page(WordPress.ORG Codex)

管理画面にオプションページへのサブメニューを追加するAPIです。ややこしいのは、WP_User::has_cap での警告となること。その処理の過程で WP_User::has_cap が呼ばれるためこのようになってしまうのです。

2.0以前はユーザーレベルとして0~10の数値だった3つ目の引数が2.0で権限を示す文字列になり、3.0からは数値での指定は非推奨となりました。

なお、数値での指定をすると同じ関数にある次のAPIによって文字列に置き換えられます。

PHP:
  1. /**
  2.      * Convert numeric level to level capability name.
  3.      *
  4.      * Prepends 'level_' to level number.
  5.      *
  6.      * @since 2.0.0
  7.      * @access public
  8.      *
  9.      * @param int $level Level number, 1 to 10.
  10.      * @return string
  11.      */
  12.     function translate_level_to_cap( $level ) {
  13.         return 'level_' . $level;
  14.     }

置き換えられた結果得られる文字列は、権限グループに再度割り当てなおされると説明されています。単純にこの処理と同じことをすれば警告は出なくなりますが、将来のことを考えればきちんと権限または権限グループを示す文字列に置き換えるのが賢明でしょう。

Comments (0)

2012年1月31日 火曜日

更新再開&アンケート

Filed under: WordPress
タグ:, ,
時間:23時28分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

年末からいろいろありまして、すっかり更新が止まってしまっていました。ようやく落ち着いてきましたので、少しずつ再開したいと思います。

まずは、サイドバーと専用ページにあるWordPressのバージョンアンケートを2012年前期のものに差し替えました。2011年後期の結果は専用ページの下の方に残してあります。

ちなみに、今回テーブル(表)を扱うために WP-Table Reloaded と言うプラグインを導入しました。管理画面でテーブルごとに編集管理が出来るため、テーブルを頻繁に扱うサイトには便利かと思います。日本語リソースも入っています。

それでは、本年も当ブログをよろしくお願いします。

Comments (0)

2011年9月17日 土曜日

WordPress の Transients API

Filed under: WordPress,ハック,プログラミング
タグ:, , ,
時間:18時29分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

ウェブアプリケーションでは、一定期間状態を保持したいことが多くあります。それを実現するためにさまざまな方法が提案され、利用されてきました。古くはブラウザに保持させる Cookie、サーバーに保存させるセッション。最近では HTML5 の Web Storage があります。

WordPress には、この一定期間保持するという目的にぴったりのAPI(Application Programming Interface)があります。Transients API と呼ばれるもので、指定した秒数が経過するまでデーターベース上に保持してくれるというものです。保存・取り出し・削除の3つの関数で構成されているシンプルなものです。WordPress 2.8.0 から使えるようになったもので、現在ではコアファイルのさまざまなところで使われています。

使い方については他のサイトを見ていただくとして、この記事ではhackネタを書いてみたいと思います。

まずは、ちょっと長いですが関数の定義部分から。引用元は WordPress 3.2.1 の wp-includes/function.php です。

PHP:
  1. /**
  2. * Delete a transient
  3. *
  4. * @since 2.8.0
  5. * @package WordPress
  6. * @subpackage Transient
  7. *
  8. * @uses do_action() Calls 'delete_transient_$transient' hook before transient is deleted.
  9. * @uses do_action() Calls 'deleted_transient' hook on success.
  10. *
  11. * @param string $transient Transient name. Expected to not be SQL-escaped.
  12. * @return bool true if successful, false otherwise
  13. */
  14. function delete_transient( $transient ) {
  15.     global $_wp_using_ext_object_cache;
  16.  
  17.     do_action( 'delete_transient_' . $transient, $transient );
  18.  
  19.     if ( $_wp_using_ext_object_cache ) {
  20.         $result = wp_cache_delete( $transient, 'transient' );
  21.     } else {
  22.         $option_timeout = '_transient_timeout_' . $transient;
  23.         $option = '_transient_' . $transient;
  24.         $result = delete_option( $option );
  25.         if ( $result )
  26.             delete_option( $option_timeout );
  27.     }
  28.  
  29.     if ( $result )
  30.         do_action( 'deleted_transient', $transient );
  31.     return $result;
  32. }

PHP:
  1. /**
  2. * Get the value of a transient
  3. *
  4. * If the transient does not exist or does not have a value, then the return value
  5. * will be false.
  6. *
  7. * @uses apply_filters() Calls 'pre_transient_$transient' hook before checking the transient.
  8. *  Any value other than false will "short-circuit" the retrieval of the transient
  9. *  and return the returned value.
  10. * @uses apply_filters() Calls 'transient_$option' hook, after checking the transient, with
  11. *  the transient value.
  12. *
  13. * @since 2.8.0
  14. * @package WordPress
  15. * @subpackage Transient
  16. *
  17. * @param string $transient Transient name. Expected to not be SQL-escaped
  18. * @return mixed Value of transient
  19. */
  20. function get_transient( $transient ) {
  21.     global $_wp_using_ext_object_cache;
  22.  
  23.     $pre = apply_filters( 'pre_transient_' . $transient, false );
  24.     if ( false !== $pre )
  25.         return $pre;
  26.  
  27.     if ( $_wp_using_ext_object_cache ) {
  28.         $value = wp_cache_get( $transient, 'transient' );
  29.     } else {
  30.         $transient_option = '_transient_' . $transient;
  31.         if ( ! defined( 'WP_INSTALLING' ) ) {
  32.             // If option is not in alloptions, it is not autoloaded and thus has a timeout
  33.             $alloptions = wp_load_alloptions();
  34.             if ( !isset( $alloptions[$transient_option] ) ) {
  35.                 $transient_timeout = '_transient_timeout_' . $transient;
  36.                 if ( get_option( $transient_timeout ) <time() ) {
  37.                     delete_option( $transient_option  );
  38.                     delete_option( $transient_timeout );
  39.                     return false;
  40.                 }
  41.             }
  42.         }
  43.  
  44.         $value = get_option( $transient_option );
  45.     }
  46.  
  47.     return apply_filters( 'transient_' . $transient, $value );
  48. }

PHP:
  1. /**
  2. * Set/update the value of a transient
  3. *
  4. * You do not need to serialize values. If the value needs to be serialized, then
  5. * it will be serialized before it is set.
  6. *
  7. * @since 2.8.0
  8. * @package WordPress
  9. * @subpackage Transient
  10. *
  11. * @uses apply_filters() Calls 'pre_set_transient_$transient' hook to allow overwriting the
  12. *  transient value to be stored.
  13. * @uses do_action() Calls 'set_transient_$transient' and 'setted_transient' hooks on success.
  14. *
  15. * @param string $transient Transient name. Expected to not be SQL-escaped.
  16. * @param mixed $value Transient value. Expected to not be SQL-escaped.
  17. * @param int $expiration Time until expiration in seconds, default 0
  18. * @return bool False if value was not set and true if value was set.
  19. */
  20. function set_transient( $transient, $value, $expiration = 0 ) {
  21.     global $_wp_using_ext_object_cache;
  22.  
  23.     $value = apply_filters( 'pre_set_transient_' . $transient, $value );
  24.  
  25.     if ( $_wp_using_ext_object_cache ) {
  26.         $result = wp_cache_set( $transient, $value, 'transient', $expiration );
  27.     } else {
  28.         $transient_timeout = '_transient_timeout_' . $transient;
  29.         $transient = '_transient_' . $transient;
  30.         if ( false === get_option( $transient ) ) {
  31.             $autoload = 'yes';
  32.             if ( $expiration ) {
  33.                 $autoload = 'no';
  34.                 add_option( $transient_timeout, time() + $expiration, '', 'no' );
  35.             }
  36.             $result = add_option( $transient, $value, '', $autoload );
  37.         } else {
  38.             if ( $expiration )
  39.                 update_option( $transient_timeout, time() + $expiration );
  40.             $result = update_option( $transient, $value );
  41.         }
  42.     }
  43.     if ( $result ) {
  44.         do_action( 'set_transient_' . $transient );
  45.         do_action( 'setted_transient', $transient );
  46.     }
  47.     return $result;
  48. }

基本的には、2つの項目をセットにしてオプションとして保存しています。項目はデータ自体となる _transient_識別子文字列 と、保持期限となる _transient_timeout_識別子文字列

識別子文字列と値に対してのサニタイズやシリアライズ処理は関数が面倒を見てくれますが、識別子文字列が長い場合は注意が必要です。テーブルのカラムから来る制限で45文字を超えることが出来ないのですが、サニタイズによってこの長さを超えてしまう可能性があります。半角英数を使うのが無難でしょう。

取り出すときには有効期限ないかどうかを確認し(756行目)、期限を過ぎている場合には削除もしてくれます(757・758行目)。Codex を見る限りでは何もしなくても期限が過ぎれば削除してくれるようですが、相当する処理は見つけられませんでした。

オブジェクトキャッシュが有効になっている場合には、データーベースの変わりにそちらを使うので更なる高速化が期待できます。

拙作プラグインの AmazonLink でも試験的に導入してみました。自前で行っていた処理がほとんどいらなくなったおかげで、プログラムがかなり簡略化できています。今のところ問題も起きていないので、このまま次のリリースに入れる予定です。2.8.0以上という条件はありますが、これはお勧めです。

Comments (2)

2011年8月10日 水曜日

WordPressバージョンアンケート始めました

Filed under: WordPress
タグ:, , ,
時間:0時12分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

WordPressのどのバージョンがどれくらい使われているのかという情報がほしいのですが、MovableTypeとのシェア比較くらいしか見つかりません。Twitterで呼びかけたりもしましたがリアクションなし。

これは駄目だということで、自前でアンケートを始めることにしました。今までもやっていましたが、今度は半年に1回ペースで項目を変えてゆくつもりです。

サイドバーにあるアンケートもこのページにあるものに差し替えました。Twitterでも改めて呼びかけましたが、果たしてどれくらいの方が協力してくれるか・・・。

Comments (0)

2011年5月21日 土曜日

MODXを使ってみました

Filed under: インターネット,ソフトウェア
タグ:, , ,
時間:18時54分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

WordPressで構築したサイトを、CMSのMODXを使って再構築をしてみました。WordPress使用者の視点から導入の解説を簡単にしてみたいと思います。

WordPressとCMS

もともとブログを目的として作られたWordPressですが、最近はCMS的な使い方をされることも多くなりました。導入事例として紹介されている中には、かなり知名度の高い大手企業も複数含まれます。いくつか例を挙げてみます。

私も、MMORPGで参加しているギルドサイトの構築で試しにWordPressを使用してみたことがあります。ページ数が少なくてコンテンツが増える予定もなかったので、固定ページだけで構成してしまう方法を採用しました。テーマのどのファイルを使用するか指定できますし、アドレスも意味のある単語が使用できます。

サイトは完成し、これといって問題もないまましばらく運用していました。問題はなかったのですが、なんとなくCMSを使ってみたくなり、思い切って再構築を行うことにしました。

CMSの絞込み

私も改めて調べてから気がついたのですが、世の中には非常にたくさんのCMSが存在します。一般的に公開されている中ではWikiとXOOPSしか知りませんでしたが、ウィキペディアのコンテンツマネージメントシステムの項で汎用CMSとして掲載されているだけでも100近く。すべて見るのは不可能なので、ウィキペディアに項目があるものは取りあえず見るところから始めました。その中でPHPで構築されていて、尚且つ日本語で情報が得られるものを絞り込み。

この段階で数個まで絞り込むことが出来たので、それぞれ詳しい情報を収集。最終的にはDOMXを選びました。管理画面でサイトの構成が見やすいことと、バージョンが古いながらも書籍が1冊出ており日本語の公式サイトがある点が決め手になりました。

MODXによるサイト構築

まず、MODXで再構築したサイトはこちら。デザインは公式配布されている素材を使って知人にお願いしたものです。再構築前と変更はほとんどありません。

インストール

WordPressで構築したものを再現するため、ローカルサーバーに場所を確保してMODXをインストールしました。MODXには一般向けのEvolutionと大規模向けのRevolutionの2つがあり、今回使用したのはEvolutionです。

インストールは簡単です。WordPressに比べるとステップは多いですが、出来るだけ自動化しようとしたためでしょう。パーミッションの設定などはやや煩雑に感じました。詳しくは、公式サイトにあるインストールの説明をご覧ください。

コンテンツの入力

管理画面上でコンテンツを増やしていけます。コンテンツには、存在しないページにアクセスがあったときに表示するもの(「Page Not Found」です)も含めます。

階層構造にすることも出来ますが、今回はすべてフラットです。トップページは別の場所で指定するだけなので、特別扱いせずに同じ階層に作ります。

WordPressのページスラッグのようなフレンドリーURLを使用することを前提にしているので、トップページの名前はindexとして index.html でアクセスできるようにしました。

中身が出来たら、取りあえずサイトを見て確認です。デザインは後から設定するので、この時点ではデフォルトのままです。

テンプレートの作成

WordPressではサイトデザインがテーマとしてまとまっていますが、MODXの場合はテンプレートファイルに相当するものはデータベース上に登録されるだけでファイルではありません。MovableTypeと同じですね。

まずは、WordPressで構築したサイトのトップページではないページのソースを持ってきてテキストエディタに貼り付けます。そのままテンプレートにしてしまうことも出来ますが、それではCMSである意味がありませんのできちんと作ります。

コンテンツとなる部分をテンプレート変数 [*content*] に置き換えます。WordPressでは、the_content() を呼ぶのに相当します。同じように、コンテンツで登録したデータを利用したいところもテンプレート変数に置き換えます。

トップページは少し構成が異なるのでそのままでは問題があります。方法としては2つあって、1つは専用にテンプレートを作る方法。違いが多い場合はこの方法がわかりやすいです。

もう1つは、1つのテンプレートの中で分岐処理をする方法。違いがわずかな場合は変更作業などが楽になるのでお勧めです。今回は違いが次の2つだけなのでこの方法を採用しました。

  • HTMLページタイトルにコンテンツのタイトルを含めるかどうか。
  • コンテンツ内にコンテンツタイトルを表示するかどうか。

MODXのテンプレートはPHPのコードを直接書けないどころか、Smartyのような分岐処理も出来ません。自由度は下がりますが、メンテナンス性を高めるためだそうです。どうしても必要な場合は、スニペットという拡張機能としてのPHPプログラムに記述し、その結果を使いたい場所には [[スニペット名]] と記述します。

HTMLページタイトルの場合は、次のようなスニペットを使用しました。トップページ以外ではコンテンツのタイトルも含めると言うものです。

PHP:
  1. <?php
  2. if( $modx->documentIdentifier == $modx->config['site_start'] )
  3. {
  4.     return '[(site_name)]';
  5. }
  6. else
  7. {
  8.     return '[*pagetitle*]  | [(site_name)]';
  9. }
  10. ?>

また、コンテンツ内にコンテンツタイトルを含めるかどうかについては、Not Found のページでも対象にしたかったため別の方法を使用しています。表示の有無を選べるテンプレート変数を登録し、それを取得して分岐するようなスニペットを登録します。前半でテンプレート変数 DisplayH2Tag の値を取得し、後半で [*content*] を含む出力をしています。[*content*] を含むようにしたのは、単にテンプレートの見通しが悪く感じたためです。

PHP:
  1. <?php
  2. $tmplvar_info = $modx->getTemplateVar('DisplayH2Tag');
  3. if ($tmplvar_info !== FALSE)
  4. {
  5.     $display_h2_tag = (bool) $tmplvar_info['value'];
  6. }
  7.  
  8. print '<div id="content">';
  9. if ( true == $display_h2_tag )
  10. {
  11.     print '<h2>[*pagetitle*]</h2>';
  12. }
  13.     print '<div class="main">
  14. [*content*]
  15. </div>
  16. </div>';
  17. ?>

スニペットの登録が終わったら、テンプレートの [*content*] をスニペット変数に置き換えます。

最後に、ナビゲーション部分を Wayfinder というスニペットを使って表示します。このスニペットは初めから使用できるようになっていてなかなか便利です。

テンプレートのメニューを表示したいところに、次のようにスニペット変数を記述します。

CODE:
  1. [[Wayfinder?startId=0&config=`navigation`]]

次に、設定ファイルを作成してFTPでアップロードします。設定ファイルはパラメーターを指定する替わりになるものです。設置場所が決められないのは難点。

設置場所はドキュメントルートの assets/snippets/wayfinder/configs で、ファイル名は navigation.config.php です。ファイルの内容は下記のとおり。

PHP:
  1. <?php
  2. /*
  3. * Wayfinder設定
  4. *
  5. * グローバルナビゲーション
  6. */
  7.  
  8. // ----------
  9. // テンプレート
  10. // ----------
  11.  
  12. $hereTpl = '@CODE:<li[+wf.id+][+wf.classes+]>[+wf.linktext+][+wf.wrapper+]</li>';
  13.  
  14. // ----------
  15. // パラメーター
  16. // ----------
  17.  
  18. $hideSubMenus = 'true';
  19. $level = '1';
  20. $rowIdPrefix = 'page-item-';
  21.  
  22. ?>

Wayfinderの使い方については、Let's enjoy MODxの解説が非常に参考になりました。パラメーターの意味については、そちらをご覧ください。

まとめとお礼

以上で解説終了。MODXについては素人にも届かないので、間違っているところがあったらごめんなさい。

それから、設置作業中にツイッターでPHPのmagic_quotes_gpcがオンになっていると問題になることをつぶやいたのですが、それに対して本家コミッターyamaさんから次のバージョンで修正するとのご連絡が。その後も何度かアドバイスを頂け、非常に助かりました。ありがとうございました。

Comments (0)

2011年2月27日 日曜日

依存されていない ports の探し方

Filed under: FreeBSD
タグ:, ,
時間:15時30分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

FreeBSD には、ports というパッケージ管理システムがあります。ソースコードのダウンロードし、パッチをあて、コンパイルし、インストールするという手順を簡略化してくれます。package というものもありますが、こちらはコンパイル済みになっています。

昔はコンパイルに時間がかかるために package を利用することが多かったのですが、スペックアップにより余裕ができたため ports に移行しました。必ずしも package で公開されているとは限らないのと、ports のほうが早く公開されるためというのが理由です。

さらに言えば、ports 管理が楽になる portupgrade があるおかげでもあります。このツールによって、毎晩更新のあった ports をメールで通知させることが出来ていますし、更新作業も非常に簡単になりました。

さて、前置きはここまで。

ports で困るのは、依存関係の把握が大変であるということ。数が少ないうちはいいのですが、依存する ports のインストールを繰り返しているうちにどんどん増えてしまいます。昨日の段階では300を超える ports がインストールされていました。

このほとんどは Xorg というGUI環境のための関係。FreeBSD のインストールのときに使うつもりでインストールしてあったのですが、結局使わないまま肥やしとなっていました。依存する ports の把握が出来ないために手をつけられなかったのです。

実は一昨日のメールで Xorg のアップグレードがあり、一気に膨大な ports の更新通知がありました。まとめて更新してしまうことも出来なくはないのですが、ちょうど週末ということもあってよい方法がないか情報収集をしてみることになったのです。

そして、非常にありがたい情報を発見しました。それがこのページ。

pkg_root は、uyota さんが作ったシェルスクリプトの名前。pkg_tree と AWK を使って、どこからも依存されていない ports をリストアップするというもの。スクリプトといっても短いものなので、ワンライナー的な使い方が出来ます。私は次のようにしました。

CODE:
  1. pkg_tree | awk 'NF == 1{ prog[$1]++ } NF == 2{ prog[$2]-- } END{for(i in prog) if(prog[i]> 0) print i }'

AWK に詳しくないのですが、pkg_tree の実行結果を AWK で受け取り、依存する側の場合はカウントアップし、依存される側の場合はカウントダウン。最終的にカウント数が正のもの(依存されていないもの)だけを表示するという仕組みのようです。

実行結果から必要な ports を取り除くと、1回目は120個以上となりました。これを元に、地道に portupgrade 付属の pkg_deinstall でアンインストールをします。1度終わったら、再び依存されていない ports をリストアップ。依存していた ports が前回の作業でアンインストールされていれば、新たに依存されていない ports が増えます。

これを何度も繰り返し、最終的に必要な ports だけになれば終了です。最終的には100を切るまで減らすことが出来ました。如何に無駄が多かったかということですね。

最後にお決まりの一言。

この記事の内容は無保証です。自己責任で行ってください。

Comments (0)

2011年2月19日 土曜日

WordPress の HTTP API

Filed under: WordPress,プログラミング
タグ:, , , , ,
時間:12時49分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

WordPress には、Snoopy という HTTP 通信用のライブラリが以前から使われています。自前で用意するには結構大変なので、拙作の AmazonLink でも利用しています。

WordPress 2.7.0 では、これに変わるものとして HTTP API が導入されました。ライブラリの変更ではなく、WordPress の持つ機能の1つという扱いです。

導入された段階では実験的な扱いでしたが、次第に多くの部分で使われるようになり、WordPress 3.0 でついに Snoopy が非推奨扱いとなっています。HTTP API が十分熟したと判断したのでしょう。

これを機会に、AmazonLink でも導入してみることにしました。現時点では Snoopy と併用するか完全に切り替えてしまうかは検討中ですが、最終的には完全な切り替えを行うことになると思います。

Snoopy の場合は別のライブラリということで、ファイルのインクルードを行い、Class のオブジェクトを取得し、実際に使用するという3段階の作業が必要です。

PHP:
  1. include_once(ABSPATH.'wp-includes/class-snoopy.php');
  2. $Snoopy = new Snoopy();
  3.  
  4. $url = 'http://www.example.com';
  5. $Snoopy->fetch($url);
  6. $content = $Snoopy->results;

これに対して、HTTP API の場合は自動的にオブジェクトを取得してくれるので、いきなり実行することができます。WordPress に組み込まれているおかげです。

PHP:
  1. $url = 'http://www.example.com';
  2. $result = wp_remote_get($url);
  3. $content = $result['body'];

ほかにもいろいろな機能が含まれています。残念ながら本家 Codex でもドキュメントが充実しているとは言えない状況ですので、興味のある方は実際のコードを参照してみてください。ファイルは wp-includes/http.php です。Codex 以上の説明があり、かなり参考になると思います。

ちなみに、自動的にオブジェクトを取得してくれる仕組みですが、内部でそのための関数を呼び出しています。

PHP:
  1. /**
  2. * Retrieve the raw response from the HTTP request using the GET method.
  3. *
  4. * @see wp_remote_request() For more information on the response array format.
  5. *
  6. * @since 2.7.0
  7. *
  8. * @param string $url Site URL to retrieve.
  9. * @param array $args Optional. Override the defaults.
  10. * @return WP_Error|array The response or WP_Error on failure.
  11. */
  12. function wp_remote_get($url, $args = array()) {
  13.     $objFetchSite = _wp_http_get_object();
  14.     return $objFetchSite->get($url, $args);
  15. }

その関数の定義はこちら。プライベート関数なので直接利用するのは厳禁です。

PHP:
  1. /**
  2. * Returns the initialized WP_Http Object
  3. *
  4. * @since 2.7.0
  5. * @access private
  6. *
  7. * @return WP_Http HTTP Transport object.
  8. */
  9. function &_wp_http_get_object() {
  10.     static $http;
  11.  
  12.     if ( is_null($http) )
  13.         $http = new WP_Http();
  14.  
  15.     return $http;
  16. }

注目するべきは、10行目の static $http; という部分。関数から出てもこの変数は維持され、再利用が可能になります。このような手法をメモ化と言うようです。10年以上プログラムを扱ってきましたが、単語自体知りませんでした。まだまだです。

PHP のメモ化については、次のサイトを参考にしました。

ベンチマーク結果を見るとかなりの高速化が期待できそうです。HTTP 通信を行うプラグインが複数動く場合には効果的かもしれません。最近はコアでも通信を行っているようですし。

Comments (0)

2011年2月6日 日曜日

zenbackを試しに導入

Filed under: WordPress
タグ:,
時間:15時51分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

最近多くのブログで、同じような表示を見かけるようになりました。記事の下に、関連した記事やキーワードやはてなブックマークの情報を表示しているあれです。

気になったので調べてみると、zenbackというサービスによるものでした。同じような機能はそれぞれでは存在しましたが、1つのサービスでできるというのは便利そうです。無料で導入も簡単そうでしたので、試しということでこのサイトでも導入してみることにしました。

ちなみに、このサービスを運営しているのは、かつて世界中で人気だったブログソフトの Movable Type を開発・販売し、それを利用したブログサービスの TypePad を運用しているシックス・アパートです。

基本的な導入方法は、規約をよく読み、メールアドレスとパスワードと設置するサイトを申請し、提供されたコードをサイトに張るだけ。必要に応じて、表示したい項目の選択などもできます。最近のウェブ系サービスでは一般的な流れですね。

WordPress ではテーマファイルにコードを追記するだけですが、ASP型のブログサービスを利用している場合は個別に案内がありますのでそれを参考にするといいでしょう。

Comments (0)

2011年1月24日 月曜日

中点付き0

Filed under: コンピューター
タグ:, , , ,
時間:19時34分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

3年ほど前に、こんな記事を書きました。

数字の0のフォントについての記事で、アルファベットのOと区別をつけるために斜線をつけているというところから始まり、最後に斜線ではなく中点を使ったものを見た記憶があるというところで終わっています。

中点付きの0についてはその後も謎のままだったのですが、昨日ついに解決しました。

きっかけとなったのは、ウィキペディアの0に関する項目。この項目に、0とOの区別についての項があります。

この項によると、IBM 3270 というコンピューターターミナル表示装置サブシステムで、中点つきの0が使用されていたとのことです。IE4 と共にインストールされ、マイクロソフトが以前配布していた Andale Mono というフォントにもこのデザインは引き継がれていたそうです。

残念ながら配布は終了してしまったためにそのものを見ることは出来ませんが、ウィキペディアで表示サンプルを見ることが出来ました。

一番下の中央やや右あたりに0があります。まさしくこれです。

やっとすっきりしました。

Comments (0)

2010年12月14日 火曜日

『BambooFun CTH-461/S0』開封レポート(2)

Filed under: ハードウェア
タグ:, , ,
時間:19時12分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

気がついたら1ヶ月以上経ってしまいました。ワコムのタブレット『BambooFun CTH-461/S0』の開封レポート2回目です。

内箱の取り出し

化粧箱は外箱と内箱の2重になっています。

化粧箱の内箱1

化粧箱の内箱1

外箱の一部は空いていて、そこから引っ張り出すようにして内箱を出します。ロゴが逆さまですが、この向きでないと内箱の蓋部分が邪魔になるのでこれで正解。

化粧箱の内箱2

化粧箱の内箱2

これが正しい向き。下から開けます。

メッセージ1

メッセージ1

蓋を開けると、12ヶ国語でメッセージの書かれたカバーが現れます。

メッセージ2

メッセージ2

メッセージのアップ。黒地に白い文字ということで、文字がにじんでしまいました。何とか修正しようとしましたが、残念ながら力不足。

内箱 - タブレット

内箱 - タブレット

カバーをはずすと商品が見えます。中央にタブレット本体、その上にペンと芯交換用の器具。

内箱 - 保証書

内箱 - 保証書

内箱の手前には、セロテープで貼られた保証書が。左側だけ固定されていて、ここだけ妙に適当です。

内箱 - タブレットの下

内箱 - タブレットの下

本体をどかすと、小さな黒い箱が。中身は後ほど。

内箱 - 底

内箱 - 底

箱をどかすと、もう何もありません。

長いのでもう1回。次で最後の予定です。

Comments (0)
Page 1 of 3112345»...Last »

HTML convert time: 3.532 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo