August 2008のブログ記事

長いタイトルになってしまったが、
MT4.2のダイナミックパブリッシングでのページ分割の続き。

ダイナミックパブリッシングでのページ分割
http://www.movabletype.jp/documentation/designer/pagination.html

をやってPagerに対応したものの、ダイナミックパブリッシングのキャッシュがONになっていると2ページ目を表示しても1ページのキャッシュが表示されてしまうという問題があります。

つーわけで、cacheidにPagerを意識させてみた。

修正するのはmt/php/mt.php

ちなみにphp/lib/MTViewer.phpがsmartyの派生クラスで、こいつがmt/php/mt.phpから呼ばれる。

mt.phpの523行目あたりを見ると、MTクラスのviewメソッドにおいて、MTViewer、すなわちsmartyに渡すcacheidが次のようになっている。
$cache_id = $blog_id.';'.$fi_path;

$fi_pathをつくるときにクエリストリングなどはきれいに除去されてしまっているので、ここにさらにlimitとoffsetを追加すればよい。

// 修正前
$cache_id = $blog_id.';'.$fi_path;
// 修正後
$cache_id = $blog_id.';'.$fi_path;
if (isset($_REQUEST['limit']) || isset($_REQUEST['offset'])) {
  $cache_id .= ":".$_REQUEST['limit'].":".$_REQUEST['offset'];
}

たくさんページキャッシュができてしまうのが場合によっては問題。ファイルサイズの問題もあれば、ファイル数の問題もある。適当にキャッシュディレクトリを散らしたいところ。

しかし、ページキャッシュあると速いわ。なんか知らんがMT4に移行したときにページキャッシュがオフになってしまっていたので、なおさら速く感じる。

MT3のときにプラグインか何かでページ分割してたんですが、MT4に移行したときにプラグインやテンプレートを全初期化したのでページ分割もなくなりました。

で、世の中のブログを見てるとMT4でページ分割してる人がいるのでググってみたところ、Movable Type Hackathonでお会いしたjunnamaさんが、下記のような記事を書いておられました。

MT4.2のダイナミックパブリッシングでのページ分割互換、静的ページ分割プラグイン。
http://junnama.alfasado.net/online/2008/06/mt42.html

これによると、MT本家のドキュメントの下記を参照すれば良いと言うことだ。
ダイナミックパブリッシングでのページ分割
http://www.movabletype.jp/documentation/designer/pagination.html

(すでにphpダイナミックパブリッシングの設定が終わってる前提の手順っす)

これに従い、まず。.htaccessを修正。
RewriteRule ^(.*)$ /mtview.php [L,QSA]

RewriteRule ^(.*)(\?.*)?$ /mtview.php$2 [L,QSA]
に変更する

で、メインページのテンプレートのMTEntriesのところを下記の用にして、offsetをautoに、limit(1ページあたりに表示する記事数)を10にする。

<MTEntries offset="auto" limit="10">
    <$MTEntryTrackbackData$>
    <$MTInclude module="ブログ記事の概要"$>
</MTEntries>

で、Pagerを表示したいところに下記を入れる。

<div class="content-nav">
  <MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">
           &laquo; Previous</a>&nbsp;&nbsp;</MTIfPreviousResults>
  <MTPagerBlock>
    <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage>
    <mt:unless name="__last__">&nbsp;</mt:unless>
  </MTPagerBlock>
 <MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">
         Next &raquo;</a>
 </MTIfMoreResults>
</div>

すると。

はい、やりすぎー。

ちょっっとテンプレートを直してみる。

<$MTCurrentPage setvar="curpage"$>
<$MTTotalPages setvar="totalpage"$>
<MTIf name="totalpage" gt="1">
<div class="content-nav">
  <MTSetVarBlock name="beginpage"><MTGetVar name="curpage" value="4" op="-"></MTSetVarBlock>
  <MTIf name="beginpage" lt="1"><MTSetVar name="beginpage" value="1"></MTIf>
  <MTSetVarBlock name="endpage"><MTGetVar name="beginpage" value="14" op="+"></MTSetVarBlock>
  <MTIf name="endpage" gt="totalpage"><MTSetVar name="endpage" value="$totalpage"></MTIf>
  <MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">&laquo; Previous</a>&nbsp;&nbsp;</MTIfPreviousResults>
  <MTPagerBlock>
    <MTIf name="__counter__" le="$endpage"><MTIf name="__counter__" ge="$beginpage">
      <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage>
      <MTIf name="__counter__" ne="$endpage">&nbsp;</MTIf>
    </MTIf></MTIf>
  </MTPagerBlock>
  <MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">Next &raquo;</a></MTIfMoreResults>
</div>
</MTIf>

これでいいかな?

と思ったら、MTTotalPages の値がとれない。MTTotalPages のチェックを省く。

うむ。良い感じだ。

でもMTTotalPages のチェックを省いてるのでページが1ページしかないときに、以下のようになってしまう。

これはダサイ。

あと何故かわらかないが、全部で2ページのときの1ページ目を表示しているときにMTIfMoreResultsがでない。

なめやがってー。

ここまで来たら後にひけないので直しました。

php/lib/function.mttotalpages.php

// 修正前
function smarty_function_mttotalpages($args, &$ctx) {
    $limit = $ctx->stash('__pager_limit');
    if (!$limit) return 1;
    $offset = $ctx->stash('__pager_offset');
    ceil( $count / $limit );
}

残念。PHPはPerlと違って最後の行の出力はreturnされません。というか、そもそも$countが未定義だよー。で、下記が修正後。

// 修正後
function smarty_function_mttotalpages($args, &$ctx) {
    $limit = $ctx->stash('__pager_limit');
    if (!$limit) return 1;
    $count = $ctx->stash('__pager_total_count');
    return ceil( $count / $limit );
}

php/lib/block.mtifmoreresults.php

// 修正前
function smarty_block_mtifmoreresults($args, $content, &$ctx, &$repeat) {
    if (!isset($content)) {
        $limit = $ctx->stash('__pager_limit');
        $count = $ctx->stash('__pager_total_count');
        $offset = $ctx->stash('__pager_offset');
        if ( $limit && !$offset ) $offset += $limit;
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat, ( $limit + $offset ) < $count);
    } else {
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
    }
}
?>

な、何故 $limit を2回足す?とりあえず押せ押せでintにcastしよう。

// 修正後
function smarty_block_mtifmoreresults($args, $content, &$ctx, &$repeat) {
    if (!isset($content)) {
        $limit = (int)$ctx->stash('__pager_limit');
        $count = (int)$ctx->stash('__pager_total_count');
        $offset = (int)$ctx->stash('__pager_offset');
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat, ( $limit + $offset ) < $count);
    } else {
        return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
    }
}

これで思い通りに動いたさ。どうせならMTOSのtrunkなおしたいんだけど。。。

ここまで来てさらに気がついたが、
設定 > 公開設定 > ダイナミックパブリッシング設定 > キャッシュする
にチェックが入っているとパラメータが変わっても同じキャッシュが使い回されるので、
Pagerが機能しない。。。眠くなってきたのでとりあえずキャッシュはOFFにして、このあたりの修正はまた今度。

※2008/08/26追記:Movable Type 4.2でキャッシュ付きダイナミックパブリッシングでのページ分割 にて対応。

負けはしたものの、久しぶりに良い親善試合を見た気がする。

ウルグアイもワールドカップ予選を控えてるだけあってか、なかなかよいパフォーマンスを出してくれたように見えた。圧倒されるほど力の差があるわけじゃなく、日本がミスから自滅した面もあるのだけど、そのミスを的確に得点に結びつけるあたりはさすが古豪といった感じ。

日本も後半開始あたりはよかった。

こんなときにテストしてる場合か?というのもあるけれど、五輪代表や欧州組が呼びづらいなかで何もしないよりはましだと思う。小野、剣豪は前に向かうプレーが良かった。阿部は代表でもクラブでも便利屋として使われてるけどボランチでいいと思うなぁ。啓太より良いと思うんだけど。大黒はもうクラブで結果を出しからかな。

親善試合は、結果より内容とかテストとかを見る場所だよね。逆に公式戦は内容とか銅でも良いから勝って欲しい。とくにワールドカップ予選は(本戦もだけど)。

何にせよ、親善試合の勝ち負けを取り出して、オシムが上とかジーコが上とか言うのは全くくだらないことだと痛感した。

先日リリースされたMovable Type 4.2をkwLogに導入しました。

前にブログに書いたようにあえて、Movable Type Open Source(MTOS)にしてみました。(日本は個人利用に限り製品版のMovable Typeが使えるのでMTOSじゃなくてもよかったりする)

微量ながら今回ベータテストに参加してバグレポートなどもしました。

関係者の皆様、リリースお疲れ様でした。

4.2はパフォーマンスが大幅に改善されたとのことですが、再構築にかかった時間が表示されるのはわかりやすいですね。ダイナミックパブリッシングしてるんですが、全部ページをつくるのに3分かかりました。カテゴリごとに月の出力してるのが無駄なのかなぁ。。。

北京五輪サッカーでのビックマウスで非難轟々の彼だけど、今回のプレーで見直した数少ない選手であったりもする。

正直、それまではなぜ代表に選ばれているのかもわからないくらいの勢いだったんだけど、本戦GLではまともにボールキープできていたのは本田だけだったので、たまに中田と比較されるのも少しはわかる気もした。

とはいえ、中田はキープした上にラストパスもミドルシュートも打てたから比較対象としてはまだまだ。

浦和レッズが獲得の意志を表明してるらしいけど、フェンロに残るのかな。個人的には一年くらいだったらオランダ2部でも欧州にとどまったほうがよいと思う。日本に戻ったら次の海外移籍が厳しくなると思うし、リーグのレベルは違えど五輪のあとフランス2部から着実に経験を積んだ松井という見本もあるし。

サッカー北京五輪は残念ながら終わってしまったよ。

ドイツワールドカップのときのような失望感はないものの、どこか心にぽっかり穴が開いたような感じ。こうもあっさりと終わってしまうとは・・・ナイジェリア戦で点が取れたことが攻めてもの救いだけど、正直0-2になったときは0得点3敗を覚悟してしまった。

アテネが谷間の世代と言われたけど、挟んだ山は中田・俊輔に黄金世代を抱えたシドニー世代とこの北京世代だったはずなのに・・・

この世代には平山、水野、梅崎、柏木、家長と攻撃に魅力のある選手がたくさんいたのにケガやらチームでの出場機会の喪失やらでメンバーに選ばれなかった。OAの招集もできず最終的に選ばれたメンバーでどうやって攻撃を組み立てるのか想像ができなかった。そして、現実にも想像ができないまま終わってしまった。むなしい。

このチームには両サイドバックにA代表でも攻撃的なプレーができる選手がいて彼らが五輪で経験を積めたのは少ない収穫だったと思うけれど、サイドの攻撃が目立ったのは彼らの能力もあるけれどそれよりも中から攻めるすべがなかったからのような気がしてならないわけで。もう今更言ってもしょうがないんだけど1トップするんだったらFW一人の代わりに梅崎、柏木のどちらかを連れて行って欲しかったなー。本田圭、香川の代わりがいないから点が欲しいときにFWを増やすしかないってどうよ。

逆に中盤に期待しないでサイド攻撃やセットプレーを武器にするんだったらそれを徹底的にやって欲しかった。ひたすらコーナー狙いとかファウル狙いとか。

もうゴール前でのパス回しとか考えて走るとかはどうでもいいんだよ。もっと具体的なチャレンジを求む。

テレビのチャンネルとかすぐ行方不明になるものって結構ある。

よく困るからスペアを用意するのだけど、それでも見つからないもの。

・耳かき:2つとも行方不明
・爪切り:1つ行方不明
・ヘアバンド:1つ行方不明

耳掃除できない。

電車で新聞読んで、毎週のようにamazonで技術書やビジネス本が届くので、漫画読んでると意外がられるのだけど、かなり漫画好きだよ。

ジャンプで人気なのはワンピースやナルトやブリーチなのかもしれないが、ここ数週間の流れなら言える。ジャンプで面白いのは銀魂とSKET DANCE(完全主観)。

異論は認める!

AppStore + Jailbreakとか言うと。どうやるん?って聞かれてググれと応えるのもあれなんでちょっとやったことを書いてみることにする。

基本的にはMacのpwnage Tool 2.0を使って下記記事に沿ってやった。
http://www.macotakara.jp/blog/index.php?ID=576

うまく行けば上の記事の通りに行くのでここからは自分の事情とはまった事だけ書く。

1) iPhone/iPod touchをクリーンにしておく

まず対象になったのはfirmwwareが1.1.4でZiphoneでJailbreakしたiPod touch。

で、一部の情報によるとziphoneとpwnage Toolのjailbreakのやり方は違うらしくziphoneでjailbreakしたものに対してpwnage Toolを使うとうまく復元できなかったりするらしい。

「らしい」というのは・・・実はjailbreak済みfirmwareでリストアするときに"option"キーを押し忘れて純粋な2.0でfirmwareでリストアしてしまったから。。。ようするにziphone jailbreak済み -> pwnage jailbreakとならず。ziphone jailbreak済み -> 2.0 純粋 firmware -> pwnage jailbreakという流れになってしまった。まぁ、データが消えても構わないのであればziphoneユーザには一旦純粋なfirmwareにしてからjailbreakする方が良いのかもしれない。

2) 復元時にファイルが選べない!

結局未だに回避できていない問題。iTunesにiPhone/iPod touchをつないで「復元」ボタンを押すとiTunesがwebから最新のfirmwareを取得してリストアしてくれる。で、「復元」ボタンをクリックするときMacなら"option"キー、Windowsなら"shift"キーを押しながらやると、復元するfirmwareのファイルを選べるという裏技も周知の事実だと思う。

が、なぜか"option"キーを押してもファイル選択画面がでない!(#1でoptionキーを押し忘れて純粋firmwareで更新してしまったが実は押し忘れなくてもこうなっていたと思われる・・・)
-> command、shitf, control・・・別のボタンを押してもダメ。
-> またしてもATOKの問題か?(iTunes 7.7.0.43 for Win + ATOK2008でMobileHelperが落ちまくる問題あり)と思いATOKをきってもだめ
-> 7.7.1のバグかと思いWebで見つけたiTunes 7.6にダウングレードしたら7.6ではiPhone/iPod touch 2.0が認識しない問題発覚。
-> がんばって7.7.0.43を見つけて入れたもののやっぱりファイル選択できない
-> Apple Discussionを眺めてもそれらしい同件の内容はない

結局、WindowsのiTunes 7.7.1だと問題なくshiftキーを押しながらの復元ボタンでファイルを選択できたのでWindowsでやった。

Macのpwnage Tool 2.0で作った「iPod1,1_2.0_5A347_Custom_Restore.ipsw」「x12220000_4_Recovery.ipsw」をWindowsマシンにもってきて

「x12220000_4_Recovery.ipsw」は
%AppData%\Apple Computer\iTunes\Device Support\x12220000_4_Recovery.ipsw
に置いて、

復元するときのファイルにiPod1,1_2.0_5A347_Custom_Restore.ipswを選べば一応WIndowsのiTunesでも復元できた。

3) DFUモードとリカバリモードは違う

さいこーにはまったのはoptionキー効かない問題だが、その次にはまったのはDFUモードに対する知識。

pwnage Toolを使うと復元する前にDFUモードに入れといわれる。

DFUとはDevice Firmware Upgradeの略らしいのだが、知っておかないといけないのはDFUモードのときはiPhone/iPod touchの画面が真っ暗になる。iTunesアイコンとUSBを接続するような画面のときはリカバリモードを指すということである。リカバリモードだとjailbreak済みfirmwareへの復元に失敗する。しばらくこれにはまってしまいやっぱりwindowsにはできないのかと勘違いしそうになった。

ちなみにDFUモードは下記手順で入れる。


  1. デバイスのをPCに接続する

  2. デバイスの電源を切る

  3. デバイスのスリープボタンとホームボタンを10秒間押す。

  4. デバイスのスリープボタンを離す。(ホームは押したまま)。

  5. さらに10~15秒ほど待つとDFUモードでiTuneが認識する

iTunesのいろんなバージョンを落としたり、Macでやったり、WindowsでやったりごちゃごちゃやっているうちにDFUモードという状態から外れてしまってリカバリモードになってしまうので注意が必要。

実際にやってみたが上記手順でリカバリモードからDFUモードに入ることも可能だった。一度PCに接続してない状態でやってみたが無理だった。PCに接続していないとダメらしい。

全然ブログを書いてなかったので会社からだろうが書く。

金曜日にiPod touchのFirmwareを2.0にしてJailbreakしました。AppStoreが使いたかったもので・・・・

IMG_0001.PNG

2.0にあげたら勝手アプリの量が大分減ってしまいました。(地味にMobileScrobblerが無くなったのが痛い。自分で作るか?)が、sshありーの、terminalありーのやっぱりで楽しすぎ。

それに対してとりあえずmixiアプリとか入れてみて久しぶりにログインしてみたけど、何かすら(誰かの日記を読むとか)すると全部ブラウザに飛ばされるこの仕様って・・・これだったら最初からiPhone専用のページを作った方が絶対良いと思うのだけど・・・わざわざクライアントアプリで実現するメリットって何??

2.0にしたらホームボタン + 電源ボタンでキャプチャーが簡単に取れるようになって便利。でもiTunesと同期しても写真のuploadできなかったのでよくわからずscpでコピー。画像は
/private/var/mobile/Media/DCIM/999APPLE
にあった。

会社のマシンのiTunesで同期したのだけど、iTunesアプリがめっちゃ削除されたよ。。。どういう同期ルールですか。

Twitter

WALKMAN.LOG

このアーカイブについて

このページには、August 2008に書かれたブログ記事が新しい順に公開されています。

前のアーカイブはJuly 2008です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。