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

2009年5月31日 日曜日

PHPバージョンアンケート

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

AmazonLink を Product Advertising API(旧 Amazon アソシエイト Web サービス)に対応させるに当たり、PHPのバージョンの傾向を知るためのアンケートを開始しました。アンケートはサイドバーにも掲載されます。

PHPは4.x がすでに公式に開発終了となっていますが、まだまだ生き残っています。5.x に移行するべきではありますが、サーバー側で対応していなければどうしようもありません。大手レンタルサーバーはすでにかなり対応していますが、4.x しか使えないところも残っているようです。

現時点でどれくらいのサーバーが移行できているのかを知ることが目的です。ご協力よろしくお願いします。

メインサーバーで使えるPHPのバージョンは?
View Results
Comments (0)

2009年5月10日 日曜日

”Amazon アソシエイト Web サービス”が”Product Advertising API”に

Filed under: AmazonLink,アフィリエイト,プログラミング
タグ:, , , , , , ,
時間:17時46分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

Amazon.co.jp からいろいろな情報を取得することができる”Amazon アソシエイト Web サービス”というサービスがありますが、”Product Advertising API”という名称に変わるとのことです。そして、情報のリクエストには署名による認証が必要になるとのこと。

拙作 WordPress プラグインの AmazonLink でもこのサービスを使用しているので他人事ではありません。

基本方式はほとんど変わらないとのことですが、認証で使用する電子署名の作成には、開発者登録をしたときに作成した Secret Access Key というものが必要になるようです。リクエスト時のデータによって変わるため、電子署名データだけをプログラムに埋め込んでおくことができません。また、Secret Access と言うくらいなのでこれを公開するのも駄目でしょう。

詳しい情報がまだ得られていないのでなんとも言えませんが、ただ使うだけの人にも開発者登録をしてもらわないと駄目になるかもしれません。

今のところは、たつをさんによる記事が一番詳しそう。

電子署名データの作成には RFC 2104-compliant HMAC with the SHA256 hash algorithm という変換処理のようなものが必要で、これを行うための関数である hash は PHP5 でないと標準では使用できません。PHP4 はすでに終了宣言が出ているのですが、まだ PHP5 が使用できないサーバーもあるので悩みどころです。

Comments (0)

2008年11月29日 土曜日

WordPress 用プラグイン monthchunks のバグを修正

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

 このブログでは、月ごとアーカイブをコンパクトに表示してくれるプラグイン monthchunks を使用していますが、記事がないのに表示されている月があることが判明しました。

 問題の月は、2006年の9月。Google ウェブマスターツールのリンクエラー報告によると、76箇所で表示されているとのこと。さすがに数が多いので、本腰を入れて調べてみることにしました。久しぶりのプラグインハックです。

 何はともあれ、まずはプラグインのコードを読みます。使用しているバージョンは、最新の2.1。関数が1つ定義してあるだけでコメントを含めても154行と非常に短いので、初めてのハックにはお勧めかもしれません。

 大まかな流れは、SQL 文を生成して実行するだけ。オプションによって多少分岐がありますが、上から追いかけていけば大したことはありません。101行目からと114行目(110行目から始まる foreach の中)からの2箇所でデータベースにアクセスしています。1箇所目は記事のある年度の取得、2箇所目は各年度別に記事のある月の取得をしています。

  1. // get an array of the years in which there are posts
  2.     $wpdb->query("SELECT DATE_FORMAT(post_date, '%Y') as post_year
  3.                  FROM $wpdb->posts
  4.                  WHERE post_status = 'publish'
  5.                  GROUP BY post_year
  6.                  HAVING post_year <> '0000'
  7.                  ORDER BY post_year $year_order");
  8.     $years = $wpdb->get_col();
  1. // get an array of months for the current year without leading zero
  2.         // sort by month with leading zero
  3.         $months = $wpdb->get_results("SELECT DATE_FORMAT(post_date, '%c') as post_month,
  4.                                      $month_format AS display_month,
  5.                                      DATE_FORMAT(post_date, '%M') as post_month_name
  6.                                      FROM $wpdb->posts
  7.                                      WHERE DATE_FORMAT(post_date, '%Y') = $year
  8.                                      AND post_status = 'publish'
  9.                                      GROUP BY DATE_FORMAT(post_date, '%m')
  10.                                      ORDER BY post_date");

 今回問題になっているのは月の情報なので、2箇所目を詳しく見ていきます。PHP のコードと SQL が混在してわかりにくいので、最終的な SQL 文を記述してみます。オプションを特に指定しない場合は、次のようなものが出来上がります。(改行やインデントなどを加えてあります)

  1. SELECT
  2.     DATE_FORMAT(`post_date`, '%c') AS `post_month`,
  3.     DATE_FORMAT(`post_date`, '%c') AS `display_month`,
  4.     DATE_FORMAT(`post_date`, '%M') AS `post_month_name`
  5. FROM `wp_posts`
  6. WHERE
  7.     DATE_FORMAT(`post_date`, '%Y') = 2006
  8.     AND post_status = 'publish'
  9. GROUP BY DATE_FORMAT(`post_date`, '%m')
  10. ORDER BY `post_date`;

 実際にこの SQL 文を手がかりに検索してみると、記事ではなく固定ページが見つかりました。記事と固定ページを区別していないため、固定ページしかない月も表示してしまっていたのです。

 ここまでわかればあとは簡単。検索条件に記事であることを加えればいいのです。記事の場合は post_type というフィールドの値が post となるので(WordPress 2.1以降)、post_type = 'post' を加えます。変更後は次のようになります。私は120行目に加えました。

  1. // get an array of months for the current year without leading zero
  2.         // sort by month with leading zero
  3.         $months = $wpdb->get_results("SELECT DATE_FORMAT(post_date, '%c') as post_month,
  4.                                      $month_format AS display_month,
  5.                                      DATE_FORMAT(post_date, '%M') as post_month_name
  6.                                      FROM $wpdb->posts
  7.                                      WHERE DATE_FORMAT(post_date, '%Y') = $year
  8.                                      AND post_status = 'publish'
  9.                                      AND post_type = 'post'
  10.                                      GROUP BY DATE_FORMAT(post_date, '%m')
  11.                                      ORDER BY post_date");

 これにより、その年の公開されている記事という条件で絞り込むことができるようになりました。現在2006年の9月は表示されなくなっています。

2010年6月21日追記

prioさんからコメントをいただきましたので、年度の表示についても追記します。確認はしていませんので、参考程度にどうぞ。

100行目からの年度のコードを見ると、月の取得同様に固定ページも含むようになっています。SQLにしてみるとこんな感じ。

  1. SELECT
  2.     DATE_FORMAT(post_date, '%Y') as post_year
  3. FROM `wp_posts`
  4. WHERE
  5.     post_status = 'publish'
  6. GROUP BY post_year
  7. HAVING post_year <> '0000'
  8. ORDER BY post_year DESC

記事の投稿に限定する条件を加えると次のようになります。

  1. // get an array of the years in which there are posts
  2.     $wpdb->query("SELECT DATE_FORMAT(post_date, '%Y') as post_year
  3.                  FROM $wpdb->posts
  4.                  WHERE post_status = 'publish'
  5.                  AND post_type = 'post'
  6.                  GROUP BY post_year
  7.                  HAVING post_year <> '0000'
  8.                  ORDER BY post_year $year_order");
  9.     $years = $wpdb->get_col();

104行目が追加した行です。意味については、月の場合と同じです。

Comments (2)

2008年11月15日 土曜日

アンケートを設置しました

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

 WordPress のシェアを知りたかったので、アンケートを設置しました。右ペインのカレンダーの下にありますので、気が向いたらお願いします。

 アンケートは、Democracy AJAX Poll というプラグインを使用しています。Ajax を使用することで、ページのリロードなしで投票できます。導入方法などについては、ぼのさんによる記事が参考になると思います。

 なお、日本語リソースは配布していたサイトが閉鎖してしまったため導入していません。普通に日本語が使えましたので、とりあえずはこのままで行く予定です。

Comments (0)

2008年8月13日 水曜日

WordPress 2.6 の投稿ページはシステムが変わったらしい

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

 久しぶりの WordPress ネタです。ちょっとだけですが・・・。

 昨日、拙作プラグインの AmazonLink のテストをするために、ローカル環境に WordPress 2.6 をインストールしました。そして、ざっと管理画面を眺めたらおもむろに AmazonLink をインストール。真っ先に記事投稿ページへ飛んで、フォームが表示されていることを確認。早速検索!

 「wordpress」(テストはいつもこれです)とキーワードフォームに打ち込んで、エンター!

 クルクルとあの画像が回転し始めそのまま待っていると、なぜか記事管理ページへ。投稿されてしまったようです。ここは検索結果が出るだけで画面遷移は起こらないはずなのですが。

 とりあえず戻ってキーワードを入力。今度は検索ボタンをクリック。でも何も起こりません。検索は始まらないし、送信中でもなさそうです。この瞬間頭の中は疑問符がいっぱいでした。

 ここでふと思い出したのが、2.6では submit は専用の JavaScript プログラムを経由することが推奨されているとどこかに書かれていたはず。どうやら簡単には動いてくれないようです。

 すでに2.6にしてしまった方ごめんなさい。対応は2.0以降にします。

2008年8月14日 追記

JavaScript ではなく PHP だったようです。

 よくわかりませんが、アクションフックに登録すればいいんでしょうか。日本語での詳しい説明がほしいところです。

Comments (1)

2008年5月24日 土曜日

Amazon Web Service の価格情報と発送時期

Filed under: AmazonLink,アフィリエイト,プログラミング
時間:17時25分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 AmazonLink 2.0 を開発中ですが、価格情報と発送時期の表示で悩んでしまっています。

 基本的に、Amazon Web Service では商品情報を24時間までキャッシュとして所持することが可能です。めったに変更されない情報については1ヶ月まで可能ですが、現時点では24時間を基準として更新するという実装をしています。

 今のところはうまく動いているのでこのまま価格についても実装するつもりだったのですが、途中で価格情報と発送時期はキャッシュ禁止となっていることが判明しました。規約に、other than pricing or availability information とあります。

 キャッシュが出来ないとなると毎回取得することになるのですが、1秒に1回というリクエスト制限があるために表示に時間がかかってしまいます。WordPress プラグインの仕様上記事単位の処理となり、1ページに複数の記事がある場合では1回のリクエストで一括して取得するという方法が使えません。

 現在の選択肢は次の2つ。

  1. 表示時間がかかってもいいから毎回リクエスト
  2. 価格情報および発送時期の表示機能をつけない

 今のところ1のやり方で出来ないかと検討しています。テンプレートに価格情報か発送時期のコードがあるときにだけリクエスト処理をすれば、使う人が選択することが出来ます。プログラムが汚くなりそうなのが心配ですが・・・。

 一番いいのはキャッシュをさせてくれるようになることですね。期限を1時間とか30分とかにしたとしても、アクセスの多い大手ブログでは効果が出ると思うのです。
 規約によると、表示された価格と発送時期を1時間ごとに強制更新する必要があるのだそうです。逆に言えば、1時間は同じままでもいいということですよね。だったら、「価格と発送時期は1時間までキャッシュ可能」とすればいいはず。

 いい解決手段があればぜひご連絡ください。

Comments (0)

2008年4月19日 土曜日

AmazonLink用の代替画像を作ってもらいました

Filed under: AmazonLink
時間:16時42分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 AmazonLink 2.0 で新たに必要になる素材として、商品がないときに使用する代替画像があります。”No image” だったり “Now printing” だったりしますが、商品写真の代わりとなるものです。正式な名前がなんというのかわかりませんが・・・・。

 今までのバージョンでは Amazon.co.jp が用意したものが使われるので問題なかったのですが、2.0からは自前で用意する必要があり、それなりのものが欲しいと思っていました。試行錯誤しながら作ってはみたのですが、悲しいほど出来が悪い。単純に “Image not found” とか入れてみたりしても面白くないし、Amazon.co.jp から持ってきてしまうのはいろいろ問題になりそうです。出来の悪さを認識しながらも、先日そのままサーバーにアップしてしまいました。

 そんな話を同僚に話したところ作ってもらえることに。デザインを担当しているので、私よりもはるかに上手い。喜んでお願いすることになりました。

 出来上がったのがこちら。

AmazonLink用代替画像

 お願いしたのは2つ。どんなサイトで使われるかわからないのでニュートラルな感じにして欲しいことと、主張しすぎないこと。派手すぎず地味すぎず、落ち着いた感じになりました。青みがかったグレーがお気に入りです。

 この画像は大中小の3つのサイズのうちの中です。ほかの2つも同じデザインで作っていただきました。AmazonLink 2.0 から同梱され、表示する商品に指定したサイズの画像がないときに使用されます。オプション設定で好みのものを指定できる機能をつける予定ですが、このブログではこの画像を使おうと思います。

Comments (0)

2008年4月12日 土曜日

AmazonLink 次期バージョンをテスト中

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

 WordPress 用 Amazon.co.jp アソシエイト支援プラグインの AmazonLink 次期バージョンの開発をしています。このブログでも動作させています。

 開発中ということで、表示が崩れたりサイト自体が表示できないことがあるかもしれません。その場合はすぐ変更を戻したり、最悪でもプラグインをはずすことで対応しますので、しばらくすれば表示されるようになると思います。

 次期バージョンの目標は、アソシエイト広告の表示フォーマットをある程度自由に出来ること。

 現在のバージョンでは Amazon.co.jp の個別商品リンクを表示するようになっているため、自由自在にデザインを変えるということは出来ません。実際に使ってくださっていても、その点が不満であるという方が多いようです。私自身不満だったりします。

 管理画面で検索する機能を実装したことで、Amazon Associates Web Service(旧 Amazon E-Commerce Service)の使い方もかなりわかりました。データの取得に関しては大体出来ていますので、表示の仕方を煮詰めていこうと思います。今のところ、管理画面でテンプレートを入力してもらい、それを使って表示するデータを作る予定です。

 テンプレートは、多分こんな感じ。

  1. <a href="_DETAIL_PAGE_URL_">_TITLE_</a><br />
  2. <a href="_DETAIL_PAGE_URL_"><img src="_IMG_MIDDLE_URL_" width="_IMG_MIDDLE_WIDTH_" height="_IMG_MIDDLE_HEIGHT_" /></a>

 誰でも出来るというものではなくなってしまっていますが、個別商品リンクを使った方法も残していけばいいかなと思っています。また、いろんな人がテンプレートを公開してくれて、自分では作れないような人はそれを使ってもらうというような、コミュニティーの広がりが出来たらうれしいですね。

 バージョンナンバーですが、1.0を飛ばして2.0にするかもしれません。
 現在の最新リリース版は0.9番台ですが、これはボタンクリックでコードを挿入する機能が実装できたら1.0にしようと考えていたからです。残念ながらいまだに実現できていません。クリックされたというイベントに連動させる方法がわからないのです。実現できたときのために、1.0は空けておこうかなと。

Comments (0)

2008年1月14日 月曜日

Amazon アソシエイト支援プラグイン AmazonLink 0.9.2 リリース

Filed under: AmazonLink,WordPress,アフィリエイト
時間:15時10分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Amazon アソシエイト支援プラグイン AmazonLink の0.9.2 をリリースしました。今回はバグの修正のみです。ダウンロードは、いつものように WordPress Plugins/JSeries のページから。

修正内容の解説

 修正したバグは、プラグインファイルを置いてあるディレクトリの名前が正しく取得できないというものです。Windows サーバーでは、そのディレクトリのフルパスとなっていました。

 0.9.1 では、AmazonLink.php の76行目に次のように記述してあります。

  1. $dirs = explode('/', dirname(__FILE__));

 これを、0.9.2 では次のように変更しました。80行目です。

  1. $dirs = explode(DIRECTORY_SEPARATOR, dirname(__FILE__));

 この行の処理は、自分自身(AmazonLink.php)のフルパスからディレクトリ部分を取り出し、それを階層ごとに分割した配列を取得するというものです。Linux などでは階層の区切り文字は /(スラッシュ)ですが、Windows では \(バックスラッシュ。日本語版 Windows では円マークで表示されます)です。区切り文字が正しくなかったため、分割ができていませんでした。

 対応方法として、文字を直接指定するのではなく、定数 DIRECTORY_SEPARATOR を使用するように変更をしました。この定数には実行環境に合わせて階層の区切り文字が入ります。

 ちなみに、次の行で取得した配列の最後の要素を取り出して使用しています。この値が、プラグインファイルの入っているディレクトリの名前となります。

Comments (2)

2007年12月1日 土曜日

akismet-multibyteview のリンクの修正

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

 WordPress のアップグレードと一緒に、そのままになっていた akismet-multibyteview のアップグレードもしました。1.20 からはダッシュボードのボックス枠(名前はあるんでしょうか。hook が activity_box_end なので、アクティビティーボックス?)にマルチバイトスパムの数が表示されるようになってさらに便利に。

 サイト内トラックバックが捕獲されてしまったので早速リンクから一覧に飛ぼうとしたのですが、File Not Found になってしまいました。ブラウザのアドレス覧を見ると http://edit-comments.php?page=akismet-admin&multibyte=true となっています。ソースコードでもやはりおかしなことに。

 こういうのを見るとついつい調べてみたくなります。早速ハックです。

ソースを見る

 何はともあれ、ソースコードを見ます。該当の処理は akismet-multibyteview.php の関数 akismet_stats_mbinfo が行っています。1.21 では139行目から始まっていて、目的の場所は156行目です。

  1. if ( $mbs_count ) {
  2.             echo
  3.                 '<li><a href="' . clean_url("{$this->akismet_admin_uri}&multibyte=true") .
  4.                 '"><strong>要チェック</strong></a>: スパムじゃないかもしれないコメントを ' .
  5.                 $mbs_count.' 件捕獲中です。</li>';
  6.         } else {
  7.             echo '<li>この中に日本語を含むものはありません。</li>';
  8.         }

 clean_url() という関数が使われています。URL として正しくなるように修正をするもので、WordPress ME2.1.3では wp-includes/formatting.php で次のように定義されていました。

  1. function clean_url( $url, $protocols = null ) {
  2.     if ('' == $url) return $url;
  3.     $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%]|i', '', $url);
  4.     $strip = array('%0d', '%0a');
  5.     $url = str_replace($strip, '', $url);
  6.     $url = str_replace(';//', '://', $url);
  7.     // Append http unless a relative link starting with / or a php file.
  8.     if ( strpos($url, '://') === false &&
  9.         substr( $url, 0, 1 ) != '/' && !preg_match('/^[a-z0-9]+?\.php/i', $url) )
  10.         $url = 'http://' . $url;
  11.    
  12.     $url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&#038;$1', $url);
  13.     if ( !is_array($protocols) )
  14.         $protocols = array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet');
  15.     if ( wp_kses_bad_protocol( $url, $protocols ) != $url )
  16.         return '';
  17.     return $url;
  18. }

 1078行目で、:// を含まなく / で始まっていなくて半角英数字+拡張子 php になっていない場合に http:// をつけるという処理をしています。

 そして、引数の文字列に含まれる変数 $this->akismet_admin_uri は、同じファイルの62行目で次のように定義されています。

  1. $this->akismet_admin_uri = 'edit-comments.php?page=akismet-admin';

 さて、ここで関数に渡される引数を確認してみます。変数が展開されると、引数は edit-comments.php?page=akismet-admin&multibyte=true となります。拡張子は php ですが、半角英数のファイル名ではありません。ハイフン(-)が入ってしまっています。そのため、clean_url() は http:// をつけてしまっていました。

 初めは akismet-multibyteview のバグだと思い解析をしていましたが、実は WordPress 側のバグでした。2.2.1 のコードでは次のように修正されています。

  1. if ( strpos($url, '://') === false &&
  2.         substr( $url, 0, 1 ) != '/' && !preg_match('/^[a-z0-9-]+?\.php/i', $url) )
  3.         $url = 'http://' . $url;

 作者のひろまささんはすでに2.3系になっていますので気が付かなかったのかもしれません。

修正

 コアファイルのほうを修正してもいいのですが、影響範囲が少ないプラグインのほうを直してしまいます。固定アドレスなので、関数の処理は必要ないと判断。156行目を次のように変更しました。ついでに & を文字参照にしてあります。やらなくても大丈夫ですが、気分的に。

  1. '<li><a href="' . "./{$this->akismet_admin_uri}&amp;multibyte=true" .

 これによってリンク先が正しくなり、マルチバイトスパムの一覧に飛ぶことができるようになりました。

Comments (1)
Page 2 of 612345...Last »

HTML convert time: 0.389 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo