Google Crisis Response(Google)
災害に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』を初めとするツールの提供が行われています。

2012年2月4日 土曜日

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

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

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

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

  1. define('WP_DEBUG', true);

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

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

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

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

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

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

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

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

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

  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によって文字列に置き換えられます。

  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年12月27日 火曜日

『境界線上のホライゾン4 上・中・下』

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

すみません。またこのカテゴリです。更新のないまま年末になってしまいそうなので。



とうとう3冊に分冊となった4巻です。分冊になりましたが、まったく薄くなりません。下巻は約1,000ページ。3冊合わせれば2,434ページにもなるわけです。重量にして約1.2kg。どこかで「ライトじゃないライトノベル」という紹介を見た気がしますが、まったく持ってそのとおりです。アニメ化で知って、軽い乗りで読み始めた人の中には後悔している人もいるかもしれませんね。

さて、内容のほうは立ち直りがテーマのようです。前巻で敗退となったわけですが、そこからどのように立ち直るかを描くシーンが多いように思えます。舞台が奥州ということもあり、被災からの復興のイメージが重なります。

Comments (0)

2011年10月28日 金曜日

『宇宙大作戦 時の壁を超えて 上・下』

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


宇宙大作戦(最初のスタートレック)のノベライズシリーズ。古本屋で見つけて買ってきました。案の定 Amazon.co.jp で画像が出ませんが、表紙のイラストは並べると繋がります。

時期は映画版1作目と2作目の間。カーク船長がすでに提督として地上勤務を続けるころ。同じ筆者による『過去から来た息子』の続編。かつてのメンバーが再びエンタープライズに集まり、宇宙全体の存亡に関わる異常事態を解明に乗り出すというストーリです。

Comments (0)

2011年9月25日 日曜日

『希望』

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

瀬名秀明氏の初短編集だそうです。『八月の博物館』以来約8年ぶりに読んでいますので、どう変わっただろうという気持ち半分です。収録されているのは次の7作品。

  • 魔法
  • 静かな恋の物語
  • ロボ
  • For a breath I tarry
  • 鶫とひばり
  • 光の栞
  • 希望

私の印象では、氏の作品に対して小説というよりも技術書のようなイメージを抱いています。このイメージはデビュー作の『パラサイト・イヴ』と次作品の『BRAIN VALLEY』から来ているのでしょう。『パラサイト・イヴ』は自身の専門分野が物語の中心にあるということで誤魔化しをしたくなかったのかと思いましたが、『BRAIN VALLEY』でも脳科学・人工知能・臨死体験など徹底的な調査をすることで専門的なデータを下地とした作品に仕上げていました。『八月の博物館』では博物学やエジプト考古学と、文系に変ガラッとわりましたがその徹底した情報収集は健在。

『パラサイト・イヴ』と『BRAIN VALLEY』しか読んだことがないと、氏の小説は専門情報が多すぎて入りづらいと感じるかもしれません。でも、今回の『希望』についてはかなり抑えられているように思えます。私個人としては『ガモフ全集』のようなタイプは望むところかのですが、一般向けではなく読者が絞られてしまう。その点では『希望』は大丈夫そうです。

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 です。

  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. }
  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. }
  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月25日 木曜日

『微睡みのセフィロト』

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

従来の人類である感覚者(サード)と新人類である感応者(フォース)が激しく争い、17年後何とか復興して共存している世界が舞台。感覚者の捜査官パットと感応者の少女ラファエルは、一時的なコンビを組んで要人が巻き込まれた事件の捜査に当たることに。

冲方 丁氏にしては213ページと比較的短いですが、その分まだ冲方氏の作品を読んだことのない方にはお勧めです。2002年に徳間デュアル文庫で刊行されたものに加筆修正を行っています。

Comments (0)

2011年8月18日 木曜日

夏から秋へ

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

昼間はセミが全力で鳴いていた場所が、帰りには秋の虫が鳴いていました。昼間は37度の猛暑だったようですが、夜はなんとなく前日よりも涼しくなったような気がします。ゆっくりですが、気候が夏から秋に変わって来ていることが感じられます。

先週には立秋を過ぎ、暦上ではすでに秋。来週には暑さが峠を越すとされる処暑となります。

実際、今週末には北からの寒気が入り込み、最高気温が30度前後になるとの天気予報が出ています。残念ながら天気は不安定になってしまいますが。

相変わらず暑いですが、もう少しの我慢ですね。

Comments (0)

2011年8月15日 月曜日

『青い星まで飛んでいけ』

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

小川 一水氏の、2004年から2009年にかけての6作品を収録した短編集。掲載された時期も媒体もバラバラですが、「未知なる物との出逢い」がテーマとなっています。

収録されている作品のタイトルは次のとおり。

  • 都市彗星のサエ
  • グラスハートが割れないように
  • 静寂に満ちていく潮
  • 占職術士の希望
  • 守るべき肌
  • 青い空まで飛んでいけ

SF色の強い作品もあれば、部分的にはSF要素もあるかというような作品もありますが、全体的にはコミカルな表現が多く重い感じはしません。いつも感じる読後感の良さも健在です。

なお、帯のコメントは川口 淳一郎氏(近年「はやぶさプロジェクト」のマネージャーを務めたことで知られる宇宙工学博士)、解説は坂村 健氏(「TRONプロジェクト」のプロジェクトリーダー)と、なかなか豪華なものとなっています。

Comments (0)

2011年8月10日 水曜日

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

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

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

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

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

Comments (0)
Page 3 of 5512345...102030...Last »

HTML convert time: 0.696 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo