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

2013年12月30日 月曜日

生存報告と総括

Filed under: WordPress,自作パソコン,雑多,電子書籍
タグ:, , , , , ,
時間:15時05分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

前回から随分と間が空いてしまいましたが、無事生きています。更新停滞の理由と、前回からの間の総括を書いてみたいと思います。

投稿停滞の理由

1記事を仕上げるまでは少なくとも1時間弱、写真加工もあるもののような長い記事ですと数日かけていたのですが、ある時を境にじっくりと仕上げることが辛いと感じるようになってしまいました。

以前であれば簡略化した記事だけ投稿する事になったと思いますが、現在は Twitter という便利なものがあります。ちょっとした思いつきのようなことは全てそちらで済ませてしまっています。

また、時々投稿していた『読書中』カテゴリーの記事はあまり続くのは良くないと思い、投稿するのは避けています。ちなみに、読書量は減っていません。後述しますが、むしろ電子書籍を購入するようになったために増えています。

総括

最後に投稿したのが今年の2月。それからいろいろありました。

新パソコン

パソコンを新しく1台組みました。AMD の A10-5700 を使用したもので、始めての 64bit OS となりました。

CPU内蔵グラフィックを生かすためにメモリもオーバークロック物の16GBとしましたが、思ったよりは性能が高くはなかったため、結局はビデオカード(AMD の Radeon HD 7750)を追加することになりました。

タブレット購入

中古ですが、Nexus 7 (2012)を購入しました。CPUもメモリも解像度も『LuvPad AD701』から格段にアップし、非常に快適となりました。Nexus 7 はGoogle純正(製造はASUS)ということもあり、Android はその後アップデートすることが可能です。現時点では、最新である4.4(KitKat)まで対応しています。

電子書籍

電子書籍を本格的に購入するようになりました。

店舗はBOOK☆WALKERを選択。BOOK☆WALKERは角川グループですが、講談社集英社早川書房などのグループ外の出版社が発行している書籍も取り扱っています。

気になりつつも置く場所が制限されているために諦めていた書籍を購入するようになり、現時点で300冊弱となります。最近は紙の書籍からあまり期間を空けずに電子版が発売されるようになり、割引キャンペーンやポイントキャッシュバックなどもあり、紙の書籍を購入することは少なくなりました。

WordBenchしずおか

WordPressイベント、第3回 WordBenchしずおかに参加してきました。前半が大曲さんを初めとした業界の有名な方々によるセッション後半が懇親会で、非常に充実した1日となりました。

尿路結石

尿路結石を発症しました。実は2回目で、1回目よりも短期間ではあったものの痛みは激しく、同じ鎮痛剤(ボルタレンサポ)を使用しても収まりませんでした。

1回目は何度か軽い(相対的な話で、楽と言う意味ではありません)症状が続いた上に最も多いと言われる夏の早朝でしたが、今回は秋に入ってからの真昼に突然の発症でした。

尿路結石は直接死に繋がるような病気ではありませんが、人間が感じる中では最も強い痛みを生じるとされています(『痛みの王様』と言われます)。兆候を認識していることで心構えができることもありますので、出来るだけ具体的な情報を交えた記事を改めて書いてみたいと思います。

今後の更新とまとめ

少なくとも現時点で更新停止は予定していません。間隔が長くなることはあるかもしれませんが、少しずつでも投稿を続けます。もちろん閉鎖はしません。

2013年も、もう少しで残り8時間となります。

自然災害の多発・電子書籍の普及・円相場の改善・ねじれ国会の解消・新しい島の誕生(12月25日に西之島と陸続きに)など、いろいろなことがおきた1年でした。

このブログが今後も誰かの疑問や悩みを解決する手助けになること。2014年が今年よりも良い年になること。この2つを願いつつ、今年最後の投稿となります。

皆さんの今年が無事に終わり、平和な年明けを迎えられますように。

Comments (0)

2013年1月5日 土曜日

マウスコンピューター LuvPad AD701 本体レポート

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

新年明けましておめでとうございます。このブログも、ついに今年で10年を迎えることに。更新が頻繁に止まるようなのんびりしたブログですが、今後ともどうぞよろしくお願いいたします。

さて、2013年の1記事目は、マウスコンピューターの7インチ Android タブレット「LuvPad AD701」の本体レポートです。梱包品などについては、昨年の開封レポートをご覧ください。

スペック

ある程度のスペックについては公式情報が出ていますので、もう少し突っ込んだところに限定して書いてみようと思います。

液晶

7インチのTFT液晶です。解像度は800×480(約133ppi)。目視でドットが見える程度ですので、お世辞にも高解像度とは言えません。たまにバックライトがちらついて見えることがあります。あまり良いものではなさそうです。

下記写真はAndroidアプリ「BOOK☆WALKER」のアイコンをアップで撮影したもの。(リンク先は1,392×1,748 1,297KB)
液晶と言うよりも、刺繍のように見えます。下の目盛りは0.5mm 刻み。

液晶のアップ LuvPad AD701

液晶のアップ LuvPad AD701

下記はiPhone4版アプリのアップ。流石は326ppiです。(リンク先は1,546×1,816 796KB)

液晶のアップ iPhone4

液晶のアップ iPhone4

タッチパネル

iPhone で使われている静電気誘導ではなく、圧力に反応する感圧式と思われます。布越しやプラスチックなどでも反応しました。

ストレージ

内臓ストレージが8GBとなっていますが、正確には0.96GBと5.97GBの2つに分かれています。1GB強が行方不明です。初期の空き容量は忘れてしまいました。

プリインストールされているファイルマネージャーで見ると、/mnt/sdcard にマウントされたストレージがあるようです。SDカードを模したと思われるアイコンの場合は /mnt/extsd で別のパスですので、内臓ストレージとしてSDカードを使っているのかもしれません。

OS

公式情報は4.0ですが、システム情報によると4.03です。
カーネルバージョン:3.0.8+ zhang@android #114
ビルド番号:crance_hractp-eng 4.0.3 IML74K 20120809 test-key

ビルド番号の「eng」から、開発版として動作するものであることがわかります。これはRoot化されており、デバッグのための機能も含んでいることを意味します。

その他

基準方向

横長になる状態が標準の向きのようです。裏側のシールもそのようになっています。後述する発熱のこともあって縦長になる向きで固定して使いたかったので、「画面回転制御」というアプリを使用しています。

発熱

スイッチやコネクタのある付近が発熱します。横長になるように持つと右手が常に触れていることになり、暑い時期はかなり気になりました。縦長になるように持つことでこの問題は解決しました。

マーケット

初期状態では Tapnow しかホームにショートカットがありませんが、Google Play ストアもインストールされています。

まとめ

安い・Playストア対応・国内サポート付きということで、初めてのAndroidタブレットとして比較的薦められます。

初めからRoot化状態なので、いろいろいじってみたいと言う方にもいいですね。裏を返せば、侵入されると何でも出来てしまうということですので、セキュリティには十分な注意が必要です。野良 Wi-Fi には繋げないようにしましょう。

小説しか読まないのであれば、文字が綺麗でないことを除けば読書用端末としても一応使えます。長手方向のサイズは、一般的な文庫本よりも4mm ほど大きくなります。本体の容量はあまりありませんが、最大32GBまでのマイクロSDカードが使えますのである程度までは大丈夫でしょう。手持ちのSDカードリーダー(GREEN HOUSE の GH-CRSDHC)をUSBコネクタに指して認識することも確認できています。

コミックや図の多い書籍を読むことが多い場合は、解像度の点で厳しいと思われます。小さな文字がつぶれてしまうので、読み取るために拡大しなくてはなりません。絵の良さも活かしきれないでしょう。mini HDMI コネクタからモニタに繋げれば1920×1080での出力が可能ですが、ポータブル性は失われてしまいます。このあたりは慣れと好みの問題ですね。

Comments (0)

2012年11月16日 金曜日

マウスコンピューター LuvPad AD701 開封レポート2/2

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

マウスコンピューターの格安7インチタブレット、LuvPad AD701 の開封レポート後半です。前半では中身を取り出しましたので、今度はそれぞれに注目したいと思います。

マニュアル

クイックガイド

クイックガイド

まずお世話になるクイックガイド。これが日本語になっていないと困ってしまいますが、その心配はまったくありません。日本国内で作られたようです。

サポートマニュアル(表紙)

サポートマニュアル(表紙)

サポートマニュアル(目次)

サポートマニュアル(目次)

サポートマニュアル(本文)

サポートマニュアル(本文)

こちらはサポートマニュアル。同じく完全に日本語版です。後ろのほうにはマウスコンピューターのサポート情報も記載されています。

保証書

保証書

保証書

購入日などの記載がありませんが、購入店で発行されたものを貼り付けるので大丈夫です。保証は1年間。

本体

カバー付きタブレット本体(表側)

カバー付きタブレット本体(表側)

カバー付きタブレット本体(裏側)

カバー付きタブレット本体(裏側)

カバーは単なる布袋です。クッション性はまったくありません。

タブレット本体(表側)

タブレット本体(表側)

タブレット本体(裏側)

タブレット本体(裏側)

カバーをはずせばこのような感じに。
両面に透明な保護シートが張られています。

本体裏のシール

本体裏のシール

裏側の右下には製造番号を記載したシールが張られています。

このシールですが、製造番号の印刷はむき出しの状態です。ちょうど指が当たる位置のためか、今ではすっかり消えてしまいました。光の加減によってはまったく読み取れません。見た目を気にしないのであれば、早い段階で保護しておくことをお勧めします。

物理キー

物理キー

右上には物理キーとマイク端子。音量スイッチはなく、戻るボタンと設定ボタンがありますがほとんど使っていません。

コネクタ類

コネクタ類

右側にはコネクタ類。マイクロSDスロットもここにあります。

その他

USBケーブル

USBケーブル

イヤホン

イヤホン

ACアダプター

ACアダプター

次回はレビューの予定です。スペックなどの情報はすでに多く公開されていますので、実物を触ってみないとわからないことを中心にしたいと思います。

Comments (1)

2012年11月10日 土曜日

マウスコンピューター LuvPad AD701 開封レポート1/2

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

格安タブレットとして、マウスコンピューターの LuvPad AD701 を購入しました。タブレット自体はいわゆる中華タブレットですが、マウスコンピューターによるパッケージングと1年間の保証が付いているのが特徴です。サイズは7インチ、OS は Android 4.0 です。

質については安かろう悪かろうであることは覚悟の上。Android もタブレットも初めてですので、入門用兼電子書籍リーダーのつもりで購入しました。購入時の価格は、コジマで9,980円。

まずは定番の開封レポートです。画像が多いので2回に分けます。今回はパッケージを開けるところまで。

パッケージ外観

パッケージ(箱)もちゃんと日本語になっています。商品名が上面・手前側・奥側にあり、「LuvPad」の上には小さくカタカナで「ラヴパッド」とあります。

パッケージ外観 上面
上面。

パッケージ外観 手前
手前側。シールのぼかしてある部分には、製造番号とそれに対応すると思われるバーコードがあります。

パッケージ外観 奥
奥側。簡単なスペックが書かれています。右端には「株式会社マウスコンピューター」の文字も。

パッケージオープン

オープン1
手前の下を持ち上げるようにして空けると、この状態に。スポンジの板がクッション材として乗っています。

オープン2
スポンジをどかすとマウスコンピューター発行の保証書が。大切に保管しておきましょう。
ぼかしの部分は、パッケージに張ってあったシールと同じ製造番号です。

オープン3
保証書の下にはステップガイド。いわゆるクイックガイドです。
ちゃんと日本語になっていますので、英語が苦手でも大丈夫です。

オープン4
ステップガイドをどかせば、ようやく本体。薄い不織布のようなもので出来た袋に入っています。

オープン5
本体の下には割りとしっかりした冊子マニュアル。こちらも全面日本語になっています。

オープン6
一番下には残りの付属品。
左がUSBケーブルとイヤホン。右はACアダプターです。USBケーブルのみビニールの袋に入っています。

今回はここまで。

Comments (4)

2012年6月30日 土曜日

Amazon アソシエイト(アフィリエイト)で価格を表示する条件

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

現在開発中の AamzonLink で価格表示が出来るようにすることを検討しています。取得することは問題なく出来るのですが、規約などでいろいろと条件が定められていて良くわからないのでまとめてみることにしました。Amazon ではアフィリエイトのことをアソシエイトと呼んでいますが、一般的ではないので以降ではアフィリエイトと表記します。

ここでのまとめは一個人の考えによるもので、きちんと公式に確認が取れたわけではありません。参考にするのは構いませんが、内容についての保証はできないことを承知の上でお願いします。

価格の表示条件

アフィリエイトとしての価格表示については、「Amazonアソシエイト・プログラム・リンク設定要件」の「すべてのリンクに適用される一般要件」として次のように書かれています。

製品の価格および在庫は、随時変化します。乙が乙のサイトに掲載した商品の価格および在庫には変動があるため、乙のサイトでは、以下の場合に限り、価格および在庫を表示できるものとします。(a)甲が価格および在庫のデータを表示しているリンクを提供する場合、または(b)乙がProduct Advertising APIを経由して商品の価格および在庫のデータを取得し、かつ当該データに適用されるライセンス契約に定める要件を乙が遵守している場合。さらに、乙が乙のサイトにて商品の価格を「比較」形式(価格比較ツールまたはその他のエンジンの使用による場合を含む。)にて、アマゾン・サイト以外のウェブサイトまたはその他の手段を通じて提供される、同じ、または類似の製品の価格とともに表示することを選択する場合は、乙は、アマゾン・サイトで提供される商品の、「新品」の最低価格、および甲が乙に提供している場合は「中古商品」の最低価格の両方を表示しなければなりません。それ以外の場合は、乙は乙のサイトに価格情報を含めることはできません。

整理しますと、価格と在庫状況を表示する場合は、次の条件 (a) (b) のどちらかを満たす必要があります。

条件 (a)

Amazon が価格および在庫のデータを表示しているリンクを提供している。

これは、下記のようなものを指すと思われます。インラインフレームで Amazon の用意したページを埋め込むものです。



条件 (b)

Product Advertising API によって取得した情報を表示する場合。今回調査の対象となるのはこちらです。Product Advertising API は、一定の条件の下で Amazon が提供している商品情報から必要な情報を取り出して利用するための仕組みです。

こちらの場合は、さらに条件が加わります。その条件とは、楽天など Amazon 以外での販売価格と比較することを目的として利用する場合に、新品および中古の最低価格が Amazon から提供されている限り表示しなくてはならないと言うものです。

現時点では私はこのような使い方をすることは考えていないのですが、想定はしておくべきかもしれません。販売価格はOfferSummary レスポンスグループで取得できるようです。

Product Advertising API で取得した情報の保存期限

Product Advertising API への情報取得要求は、間隔と回数に制限があります。この制限に収めることと表示までの時間短縮を目的として、AmazonLink は現在24時間キャッシュとして保存するようにしています。

Product Advertising API ライセンス契約(日本語参考訳)」の「4. 利用条件」には次のようにあります。

(n) お客様は、画像で構成される商品関連コンテンツを格納またはキャッシュしてはいけませんが、画像で構成される商品関連コンテンツへのリンクを、24時間まで格納することができます。お客様は、画像で構成されていないコンテンツを、データキャッシュの目的で、24時間まで格納することができますが、それをした場合は、その後直ちに Product Advertising API にリクエスト送信を行うか、または新しいデータフィードを取り込み、お客様のアプリケーション上の商品関連コンテンツを刷新することにより、商品関連コンテンツを直ちに刷新し、再表示しなければなりません。別途当方より通知されない限り、お客様は、個別の Amazon Standard Identification Number (以下、「ASIN」といいます)を、本ライセンス契約の終了まで、期間の制限なく格納することができます。前述に拘わらず、お客様のアプリケーションがクライアント アプリケーションを含む場合、かかるクライアントアプリケーションは、商品関連コンテンツを格納またはキャッシュしてはいけません。当方の要求があれば、お客様は、当方の要求から3営業日以内に、お客様が本ライセンス契約を遵守しているかを確認できるよう、かかるクライアントアプリケーションのコピーを当方に提供するものとします。
(o) お客様が商品関連コンテンツをデータフィードから取得する場合、または、お客様が Product Advertising APIに リクエスト送信をする、もしくはお客様のアプリケーション上の商品関連コンテンツを刷新する頻度が1時間に1回以下の場合は、お客様のアプリケーション上の価格情報または発送可能時期についての情報に隣接して時刻/日付のスタンプを含むものとします。ただし、お客様が、アプリケーション上に表示された価格情報および発送可能時期についての情報を同日中にリクエストおよび刷新した場合は、スタンプの日付部分を省略することができます。許容されるメッセージの例は以下のとおりです。

  • Amazon.co.jp 価格: JPY 3,200 (01/07/2008 14:11 JST 時点 -詳細はこちら-)
  • Amazon.co.jp 価格: JPY3,200 (14:11 JST時点 -詳しくはこちら-)

また、お客様は、下記の免責事項を、価格情報または発送可能時期についての情報のそばに記載するか、またはハイパーリンク、ポップアップ、スクリプト・ポップアップその他類似の方法で提供しなくてはなりません。「価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。商品の販売においては、購入の時点で [Amazon.co.jp または Javari.jp の適用ある方] に表示されている価格および発送可能時期の情報が適用されます。」上記の例において、「詳細はこちら」および「詳しくはこちら」などとすれば、エンドユーザーが免責事項を読むよう仕向けることができます。

(n) では、画像の保存は禁止、ASIN は契約が続く限り永遠に、そのほかのデータは24時間まで保存が可能とあります。価格情報は画像ではありませんので、24時間の保存が可能であると解釈しています。

(o) では、価格情報と発送可能時期の表示について書かれています。1時間以上前に取得した情報を使用する場合には、次の記述をすることが必要になります。

  • 情報の取得日時(価格・発送可能時期の近く)
  • 免責事項の表示

なお、条約の書き方がわかりにくいので判断が難しいのですが、大元と思われる「Amazon.com Product Advertising API License Agreement」では次のように書かれていることから、免責事項の記述は取得日時の記述に加えて(Additionally)の事項であると判断しています。

Additionally, you must either include the following disclaimer adjacent to the pricing or availability information or provide it via a hyperlink, popup box, scripted popup, or other similar method: “Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [amazon.com or endless.com, as applicable] at the time of purchase will apply to the purchase of this product.” In the above examples, “Details” and “More info” would provide a method for the end user to read the disclaimer.

まとめ

Amazon アフィリエイトで価格表示をする場合の条件。

  • 新品・中古の最低価格を含める。
  • 取得した情報を1時間以上使用する場合は、取得時間と免責事項を併記する。

ここから、AmazonLink に導入する場合は次の機能を実装することになります。

  • 新品・中古価格・取得日時を表示するためのコード。
  • 日時の書式とキャッシュ有効時間を設定する項目。

実装時期は試験運用中の現行バージョンを公開した後になりそうです。このサイトで価格が表示されるようになっていたらそろそろと言うことで。

Comments (0)

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年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月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ページタイトルの場合は、次のようなスニペットを使用しました。トップページ以外ではコンテンツのタイトルも含めると言うものです。

  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*] を含むようにしたのは、単にテンプレートの見通しが悪く感じたためです。

  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 というスニペットを使って表示します。このスニペットは初めから使用できるようになっていてなかなか便利です。

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

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

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

設置場所はドキュメントルートの assets/snippets/wayfinder/configs で、ファイル名は navigation.config.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)
Page 1 of 3112345...102030...Last »

HTML convert time: 2.536 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo