約 2,252,987 件
https://w.atwiki.jp/magicman/pages/14763.html
ミッシングレンオー C 火文明 (2) クリーチャー:フレイム・モンスター 2000 S・トリガー ミッシングリンク:火のクリーチャー(このクリーチャーの上に火のクリーチャーが置かれた時、このクリーチャーのみを手札に戻してもよい) W・ブレイカー 作者:808 ミッシングリンク持ち軽量クリーチャーと真化持ち進化先。 《ピュアミッシング》or《予言者ヒューズ》→《聖帝アブラハム》or《英知ローシナク》 《シンカイミッシング》→《無敵巨兵アルファバンX》 《ヤミノミッシング》→《魔皇エヴィシミ》 《ミッシングレンオー》→《真竜凰ドラグネイション》 《ミッシングネイチャー》or《青藍の極》→《大賢者インヤフェイス》or《超空要塞シンギュラリティ》 カードリスト:808 フレーバーテキスト (未定) 評価 名前 コメント
https://w.atwiki.jp/fxshouken/pages/293.html
ナッシング・ダン(nothing done) 取引が成立(約定)しないこと。 トップページへ
https://w.atwiki.jp/chaos-touhou/pages/279.html
鬼符 ミッシングパワー 読み:おにふ みっしんぐぱわー カテゴリー:Event 作品:東方混沌符 Battle ターン終了時まで、目標の 東方混沌符 のキャラ1体は攻撃力が3上昇する。そのキャラが「伊吹 萃香」の場合、追加で『貫通』を得る。 鬼の力、萃める力、思う存分に味わうといいわ! illust:チョモラン TP-194 C 収録:ブースターパック「OS:東方混沌符 2.00」 ネームが「伊吹 萃香」であるキャラ・エクストラ一覧 萃霊花「博麗 霊夢」 「伊吹 萃香」 御伽の国の鬼が島「伊吹 萃香」 山の四天王「伊吹 萃香」 「星熊 勇儀」 密度を操る鬼「伊吹 萃香」 密度を操る程度の能力「伊吹 萃香」 夢幻に湧く酒「伊吹 萃香」 「八雲 紫」 ミッシングパープルパワー「伊吹 萃香」
https://w.atwiki.jp/familyfishing/pages/100.html
巨大魚を投稿してください。まず 6つ書きます。 1スタージオン 2リュウグウノツカイ 3ハイネリア 4シロカジキ 5シファクティヌス 6ピラルク 7ダンクルオステウス 8バショウカジキ 9ホオジロザメ 10リュウグウノツカイ 11タマカイ 12ターポン どんどん数を増やしていき、どんどん小さくしていき、(-5センチぐらいまでOKそれ以上はNG)最後には小さい魚になるのを目標にします。 バショウカジキ -- ばしょー (2012-04-30 12 23 17) ほおじろざめ -- カジキ (2012-04-30 12 51 18) リュウグウノツカイ -- コリドラス (2012-04-30 20 29 37) メダカ…はい終わりー -- ドジョウ師匠 (2012-05-07 23 04 22) それNGです。5センチさくらいで減らしてください。 -- コテツ (2012-05-20 11 42 47) ミジンコ...誰もこれより小さい魚は言えない(笑) -- 名無しさん (2012-05-31 05 39 10) ↑魚じゃない -- フクロウナギ (2012-05-31 15 35 20) クロカジキ -- s (2012-06-08 22 24 58) タマカイ -- s (2012-06-08 22 25 26) ターポン -- カジキ (2012-06-16 09 14 30) ルースターフィッシュ。 -- キヨ (2012-07-01 14 28 53) ダイオウイカ -- カジキ (2012-08-15 07 36 45) うなぎ~ -- でんきうなぎ (2014-05-17 18 56 14) でんきうなぎ。 -- うなぎ~ (2014-05-17 18 56 55) アリゲーターガー -- ハローワーク (2023-04-10 15 38 36) ソウギョ -- 鮎 (2023-04-10 15 40 06) 名前 コメント
https://w.atwiki.jp/kazu392h/pages/314.html
autolinkTOP>【み】>ミッシング・リンク ミッシング・リンク (みっしんぐりんく) 分類1【言語全般】 ジャンル1【一般】 一見なんの共通点も無い様に思われていた連続殺人事件の被害者達に、実は特定の共通点があったというミステリの形態。 エラリイ・クイーンの「九尾の猫」、我孫子武丸の「メビウスの殺人」等が代表作。 登録日 2005/03/31 【み】一覧 みえみえ 見切り発車 ミクロイドS ミクロ系 岬ユリ子 ミスジ ミスター・ルーキー Mysterious 水木一郎 水谷豊 見せパン 見立て殺人 三田村邦彦 乱れ牡丹 ミックスジュース 密室 ミッシング・リンク 蜜の味 御堂筋線 南光太郎 ミナミの帝王 南野陽子 箕面大滝 箕面温泉スパーガーデン 美濃囲い 宮内洋 宮村優子 未来少年コナン ミルキー みんなのうた ■ トップページへ移動 ▲ このページ上段に移動
https://w.atwiki.jp/winningpost10/pages/53.html
まだウイニングポスト9 2022のデータを移した段階です ブラッシンググルーム系産駒はこちら ブラッシンググルーム系画像はこちら サイアーライン 列1 列2 列3 列4 列5 Blushing Groom Tawfiq Runaway Groom Cherokee Run Yonaguska Musket Man War Pass クリスタルグリッターズ アブクマポーロ マチカネフクキタル Nassipour Mt. Livermore ハウスバスター ミッドナイトベット Peaks and Valleys Lucky Lionel Orientate Rainbow Quest 続きはレインボウクエスト系へ バイアモン Candy Stripes Leroidesanimaux アニマルキングダム Invasor アイシーグルーム グルームダンサー Pursuit of Love Rahy ファンタスティックライト ジャリスコライト Noverre Le Havre ブラッシングジョン Nashwan Swain バゴ Sillery Silic アラジ Congaree Jeranimo 種牡馬入り確定馬 調査 種牡馬名1 種牡馬名2 地域 特性 確立後 因子1 因子2 生年 種牡馬開始年 引退年 備考 ブラッシンググルーム Blushing Groom 米国 無 柔軟性 気性難 1976 1978 Tawfiq 豪州 無 1979 1983 Runaway Groom 米国 無 瞬発力 1979 1984 Cherokee Run 米国 無 スピード 1990 1996 Yonaguska 米国 無 スピード 1998 2003 Musket Man 米国 無 スピード 2006 2011 War Pass 米国 無 2005 2009 クリスタルグリッターズ Crystal Glitters 日本 無 柔軟性 1980 1985 アブクマポーロ 日本 無 瞬発力 瞬発力 1992 2000 マチカネフクキタル 日本 無 瞬発力 1994 2001 Nassipour 豪州 無 1980 1986 Mt. Livermore 米国 無 スピード 1981 1986 ハウスバスター Housebuster 日本 無 スピード パワー 1987 1992 ミッドナイトベット 日本 無 1994 2002 Peaks and Valleys 米国 無 1992 1997 Lucky Lionel 米国 無 1993 1999 Orientate 米国 無 パワー 勝負根性 1998 2003 バイアモン Baillamont 日本 無 1982 1987 Candy Stripes 米国 無 パワー 1982 1989 Leroidesanimaux 米国 無 瞬発力 柔軟性 2000 2006 アニマルキングダム Animal Kingdom 日本 無 パワー 瞬発力 2008 2014 Invasor 米国 無 瞬発力 瞬発力 2002 2008 アイシーグルーム Icy Groom 日本 無 1983 1989 グルームダンサー Groom Dancer 日本 無 1984 1988 Pursuit of Love 欧州 無 1989 1993 Rahy 米国 無 スピード 柔軟性 1985 1990 ファンタスティックライト Fantastic Light 日本 無 スピード 瞬発力 1996 2002 ジャリスコライト 日本 無 2003 2009 Noverre 欧州 無 スピード 瞬発力 1998 2003 Le Havre 欧州 無 瞬発力 2006 2010 ブラッシングジョン Blushing John 日本 無 瞬発力 1985 1990 Nashwan 欧州 無 パワー 柔軟性 1986 1990 Swain 米国 無 パワー 柔軟性 1992 1999 バゴ 日本 無 瞬発力 2001 2006 スペルはBago Sillery 欧州 無 1988 1993 Silic 米国 無 1995 2001 アラジ Arazi 日本 無 早熟 1989 1993 Congaree 米国 無 スピード 早熟 1998 2005 Jeranimo 米国 無 2006 2015 種牡馬入りしない確立可能牡馬 調査 種牡馬名1 種牡馬名2 地域 特性 確立後 因子1 因子2 生年 備考
https://w.atwiki.jp/rsds/pages/20.html
ビショップ (⇔ 追放天使) 初期ステータス 力15 敏捷15 知識10 知恵10 健康20 カリスマ15 運5 自動上昇はカリスマ スキル スキル一覧 スキル名 難易度 スキル説明 前提スキル 前提スキルLv 殴打 1 敵の頭を狙ってメイスで殴りつける。 祈り 1 神に祈りを捧げて自分の信仰心を高める。 ヒーリング 1 指定した見方の体力の少量を即座に回復する。 シールドフラッシュ 2 縦で敵の攻撃を防ぐと同時に、盾の光で相手の視界を奪う。 祈り Lv3 ブレッシング 2 神の祝福を祈り味方の体力最大値を高め、さらに光の力を付与する。 ヒーリング Lv3 PRエビル 2 味方一人の防御力を高める。 ヒーリング Lv3 Eエンカウンター 3 悪を浄化する攻撃を放つ。 殴打 Lv8 ターンアンデッド 3 自分の周囲にいるアンデッド系の敵を麻痺させたり、退けたりする。 シールドフラッシュ Lv3 レストレイション 3 周囲にいる味方の状態以上を自動的で治療する。 PRエビル Lv3 セイントシールド 4 盾に神の力を宿し、盾の防御力と回避率を上昇させる。 Eエンカウンター Lv3 ターンアンデッド Lv3 PRエレメンタル 4 味方の元素攻撃力、元素抵抗力、状態異常抵抗力を高める。 ブレッシング Lv8 レストレイション Lv3 Pヒーリング 4 周囲にいるパーティ全員の体力を回復させる。 ヒーリング Lv8 レストレイション Lv3 ゴッドハンド 5 神の手の力を込めて一撃を放つ。 殴打 Lv10 Eエンカウンター Lv5 ターンアンデッド Lv5 ディバインアーチ 5 味方の頭上に聖なるアーチを発生させ、政令の加護を与える。 祈り Lv10 セイントシールド Lv3 PRエレメンタル Lv3 リザレクション 5 行動不能になった味方を復活させ、体力を回復する。 ヒーリング Lv10 レストレイション Lv5 Pヒーリング Lv3 スキルツリー 殴打 Lv10 → ゴッドハンド Lv8 → Eエンカウンター Lv5 → 祈り Lv3 → シールドフラッシュ Lv3 → ターンアンデッド Lv5 → 殴打 Lv8 → Eエンカウンター Lv3 → セイントシルド Lv3 → ディバインアーチ 祈り Lv3 → シールドフラッシュ Lv3 → ターンアンデッド Lv3 → Lv10 → ヒーリング Lv3 → ブレッシング Lv8 → PRエレメンタル Lv3 → Lv3 → PRエビル Lv3 → レストレイション Lv3 → Lv5 → リザレクション Lv3 → Pヒーリング Lv3 → Lv8 → Lv10 → ◆殴打 Lv 1 2 3 4 5 6 7 8 獲得CP 4 6 8 10 12 14 16 18 物理ダメージ(%) 100 101 102 103 104 105 106 107 十分に強い。抵抗や防御がそろったBISの主力。 ◆祈り Lv 1 2 3 4 5 10 獲得CP 10 13 16 19 22 37 ◆ヒーリング Lv 1 2 3 4 5 10 必要CP 5 消費CP 10 12 14 16 18 28 HP回復(%) 10 11 13 14 16 24 ◆シールドフラッシュ Lv 1 2 3 必要CP 30 ブロック上昇率(%) 5 6 8 発生確率(%) 15 16 17 光属性ダメージ(最少) 18 23 28 光属性ダメージ(最大) 22 27 32 知識なくてもそこそこ。余裕があるなら。 ◆ブレッシング Lv 1 2 3 4 5 20 必要CP 30 消費CP 35 37 39 41 43 73 光ダメージ付加(最少) 5 10 15 20 25 100 光ダメージ付加(最大) 8 13 18 23 28 103 最大HP増加(%) 10 12 14 16 18 50 異常抵抗上昇(%) 10 12 14 16 18 50 効果時間(秒) 10 10.5 11 11.5 12 19.5 パーティメンバー全員の最大HP異常抵抗を上昇させる、光ダメージを付加するスキル エビと違いこちらは対象が全員なのでまずはこちらを伸ばした方が便利 かかった人の知識によってダメージが増える。エンチャもたぶん。 ◆PRエビル Lv 1 2 3 必要CP 30 消費CP 35 37 39 防御力上昇(%) 15 17 19 異常抵抗上昇(%) 10 11 13 効果時間(秒) 10 10.5 11 ◆Eエンカウンター Lv 1 2 3 必要CP 5 消費CP 12 14 獲得CP 2 4 6 物理ダメージ(%) 100 101 102 致命打率上昇(%) 5 モーション長い。 ◆ターンアンデッド Lv 1 必要CP 40 消費CP 40 麻痺付加(%) 10 効果時間(秒) 3 死霊即死(%) 10 麻痺がボスにも通るので暇ならマスしておくといいが、cp消費がひどい。 実は範囲。ブレ付加ものります。 ◆レストレイション Lv 1 2 3 4 5 必要CP 60 消費CP 10 12 14 18 発生確率(%) 10 11 12 14 罠に引っかかったとき等に意外と便利。こちらも余裕があるならマスすると幸せ。 ◆ゴットハンド モーション長すぎ。殴打のほうがいいかもしれない。致命打率はいいので一撃でしとめられるならこっち。 ◆セイントシールド ブロック率と回避が上がる。難易度の関係もあるので余裕がでたらマスターするとより堅く。 ◆PRエレメンタル 魔法攻撃力上昇。 ◆ディバインアーチ スキルと抵抗があがるのでかなり便利。ボス戦でも活躍する。切れたかどうかかわからないのが不便。 相棒操作でも結構つかってくれる。 スキルが増えると攻撃回数が増える技が多いので使っておくと相棒が・・・たぶん強くなる。 ◆Pヒーリング(パーティヒーリング) Lv 1 2 3 必要CP 50 消費CP 50 52 54 HP回復(%) 20 21 22 WIZや姫、天使と比べるとあまりにもひどい回復量。だがブレッシングのおかげで性能にそこまで不満は感じないはず。 ◆リザレクション あげておくとボスにゾンビアタックできる。基本1でいい。
https://w.atwiki.jp/heroesplacement/pages/68.html
超次元フィッシング(ちょうじげんふぃっしんぐ) 東北 イベント コスト:[東北3] 効果1 (EV): 自ターン中に使用する。自分のプレイス1つにダメージを与える。2枚ドローする。 効果2 (PL): 2枚ドローする。 収録エキスパンション:エピソード1 超日本始動編 カードナンバー:00039 レアリティ:R illust.魚 Q A Q.自ターンのバトルフェイズに「[[フィッシングジョーカー 三瓶 夢希]]」のキャラ能力、又は「超次元フィッシング」を使用しました。 その際に指定されたプレイスが「[[ヴィクトリアス 石乃 真希]]」だった場合、「石乃 真希」を登場させ、攻撃を宣言できますか? A.はい、可能です。バトルフェイズ中にキャラを登場できれば、攻撃キャラとして選択することができます エラッタ コメント
https://w.atwiki.jp/yamamura2/pages/4256.html
【TOP】【←prev】【PlayStation】【next→】 シーバス・フィッシング タイトル SEABASS FISHING シーバス・フィッシング 機種 プレイステーション 型番 SLPS-00356 ジャンル 釣り 発売元 ビクターエンタテインメント 発売日 1996-6-21 価格 6800円(税別) 【TOP】【←prev】【SEGA SATURN】【next→】 シーバス・フィッシング タイトル SEABASS FISHING シーバス・フィッシング 機種 セガサターン 型番 T-6005G ジャンル 釣り 発売元 ビクターエンタテインメント 発売日 1996-2-23 価格 6800円(税別) シーバスフィッシング 関連 SS シーバス・フィッシング シーバス・フィッシング 2 PS シーバス・フィッシング シーバス・フィッシング 2 村越正海の爆釣シーバス・フィッシング 駿河屋で購入 プレイステーション セガサターン
https://w.atwiki.jp/wiki6_takt/pages/40.html
Railsキャッシング インターネット上の大規模サイトの多くはインタープリター型言語を使っています。そうしたサイトは、Ruby と同じ方式、つまりクラスター化され、何も共有しないアーキテクチャーを採用しています。そしてキャッシュも行っています。大部分のサイトでは、可能な限り最大のパフォーマンスを得るために、効果的なキャッシング方法を必要としています。そして Rails 開発者も、そうした方式に従い始めています。 単純な Rails アプリケーションの作成に役立つ記事は、何十というほどあります。このシリーズでは、単純なブログを作成するという基礎を越え、すべての Rails サイトが解決すべき問題に入り込みます。ここでは Rails の最適化方法や、サイトをより安定にするための方法について学びます。また、Rails の基本的な制約を、プラグインを追加することで回避する方法も学びます。このシリーズの各記事を読み終わるごとに、現実の世界で Rails サイトを動作させるための方法について、さらにもう少し知ることができるはずです。 いくつかのシナリオ まず、ChangingThePresent.org の何ページかを紹介させてください。このサイトの中で、キャッシュが必要となりそうな、いくつかの場所を示すことにします。次に、私達がそれぞれの場所に対して何を選択したか、そして、そうしたページを実装するために使用したコード、つまり方式に注目します。特に、私達が下記のすべてに対して、どう対応しているかを説明します。 静的なページ全体 ほとんど変化しない動的なページ全体 動的なページの一部 (動的なページ・フラグメント) アプリケーション・データ 静的なページを考えてみましょう。ほとんどすべてのサイトには静的なページがあります。例えば図 1 は、私達の使用許諾条件を示しています。このページに行くためには、register をクリックし、次に user agreement をクリックします。ChangingThePresent の場合、私達はこのページからすべての動的コンテンツを削除したので、このページを Apache にキャッシュさせることができました。私達の Apache の構成ルールから、このコンテンツが Rails サーバーでサービスされることはありません。私はこの Rails のキャッシングをまったく考えていません。 図 1. 利用規約 次に、完全に動的なページを考えてみましょう。理論的には、ChangingThePresent は、動的に作成されても稀にしか変化しないページを持つことができます。ほとんどすべてのページはユーザーがログインしているかどうかを表示するため、私達はこのタイプのキャッシングには関心がありません。 次に、ページ・フラグメントのキャッシングを考えます。私達のホームページ (図 2) は、以前は完全に静的でした。現在では、いくつかの要素が動的です。このページは毎日、一連の寄付項目を表示します (寄付項目は、ランダムに選択されるものと私達の管理者が選択するものの両方があります)。「A Few of our Special Gifts for Earth Day」というタイトルのセクションの寄付項目に注目してください。また、右端にある「login」というリンクにも注目してください。このリンクは、ユーザーがログインしているかどうかに依存します。ページ全体をキャッシュすることはできません。このページは 1 日に 1 度だけ変更されます。 図 2. ホームページ 最後に、このアプリケーションを考えてみます。15 年前にすべてのネット・サーフィンを終えたのでもない限り、興味深いサイトの大部分は動的です。最近のアプリケーションにはレイヤーがあり、通常はレイヤー間にキャッシュを追加することで、アプリケーションを効率的にすることができます。ChangingThePresent は、少しばかりデータベース・レイヤーでキャッシングを行っています。次に、こうしたキャッシングのタイプをそれぞれ掘り下げ、私達が ChangingThePresent でどんなことをしているかを説明しましょう。 静的コンテンツのキャッシング 静的なデータのキャッシング方法については、画像を除けば、あまり言うことがありません。私達のサイトは寄付のためのポータルです。これはつまり、ユーザーの感情面に訴える必要があるということです。これは画像が、そしてさらにはビデオが必要なことを意味しています。しかし私達の Web サーバーである Mongrel は、静的データをあまり適切にサービスすることができません。そのため私達は、Apache を使って画像コンテンツをサービスしています。 Mongrel は、Zed Shaw が 2500 行の Ruby と C で作成した Web サーバーです。この、ごく小さなフットプリントを持つ小さなサーバーは、Rails や Nitro、Iowa などの Ruby Web アプリケーション用にカスタム調整されます。Mongrel は UNIX® と Linux™ で動作しますが、Win32 でも動作します。Mongrel は多くの場合、別の Web サーバー (Apache や Litespeed など) の背後で実行し、プロキシーとして動作します。しかし、必ずそうである必要はありません。Mongrel 自体が HTTP サーバーなので、皆さんの好みの HTTP ツールと合わせて Mongrel を使うことができます。 私達は最も頻繁に使われる画像をキャッシュし、私達の顧客がそうした画像を手軽に見られるように、画像アクセラレーター、Panther Express に移行しつつあります。この方法を使うために、images.changingThePresent.org というサブドメインを持つことにします。Panther Express は、そのローカル・キャッシュで任意の画像を直接サービスし、そしてリクエストを私達に対して送信します。Panther サービスは私達がいつ画像を変更するのかわからないため、私達は HTTP ヘッダーを使って画像を失効させています。下記を見てください。 キャッシュを失効させる HTTP ヘッダー HTTP/1.1 200 OK Cache-Control max-age=86400, must-revalidate Expires Tues, 17 Apr 2007 11 43 51 GMT Last-Modified Mon, 16 Apr 2007 11 43 51 GMT これらが HTML ヘッダーではないことに注意してください。こうした HTTP ヘッダーは Web ページのコンテンツとは独立に作成されます。Web サーバーは、こうした HTTP ヘッダーを作成してくれます。Web サーバーの構成は、Rails に関する記事シリーズとしては関心の対象ではないため、今度は Rails フレームワークでコントロールされるキャッシュの内容に移ることにします (Web サーバーの構成について詳しくは、「参考文献」のリンクを参照してください)。 ページ・キャッシング 稀にしか変化しない動的なページがある場合には、ページ・レベルのキャッシングをする必要があります。ブログや公開の掲示板は、そうした種類のアプリケーションの例です。ページ・キャッシングを行うと、Rails は動的な HTML ページを作成でき、それを公開のディレクトリーに保存できるため、アプリケーション・サーバーはそれを他の静的ページと同じようにサービスすることができます。 Rails は、ページがキャッシュされた場合、画像を含めないため、ページ・キャッシングは Rails では最も高速な種類のキャッシング動作です。最も基本的なレベルのページ・キャッシングであれば、実は Rails では非常に容易に行うことができます。ページ・キャッシングとフラグメント・キャッシングはどちらも、コントローラー・レベルで行われます。Rails に対して下記を指示する必要があります。 どのページをキャッシュしたいか ページのコンテンツが変化した場合、キャッシュにあるページをどのように失効させるか ページ・キャッシングを有効にするには、コントローラー・クラス内の caches_page ディレクティブを使います。例えば privacy_policy ページと user_agreement ページを about_us_controller でキャッシュするためには、下記のコードを入力します。 リスト 2. ページ・キャッシングを有効にする class AboutController ApplicationController caches_page privacy_policy, user_agreement end ページを失効させるためには expire_page ディレクティブを使います。Rails が new_pages アクションを呼び出した時に上記のページを失効させる場合には、私は下記のコードを使います。 リスト 3. ページを失効させる class AboutController ApplicationController caches_page privacy_policy, user_agreement def new_pages expire_page action = privacy_policy expire_page action = user_agreement end end ここで、いくつかの小さな問題、例えば URL に注目する必要があります。URL を URL パラメーターに依存させることはできません。例えば、gifts/water?page=1 の代わりに gifts/water/1 を使う必要があります。routes.rb では、そうした URL を容易に使うことができます。例えば私達のページは、どのタブが選択されているかを示すタブ・パラメーターを持つことがよくあります。このタブを URL の一部にするために、私達は下記のルーティング・ルールを使っています。 リスト 4. タブのためのルーティング・ルール map.connect 'member/ id/ tab', controller = 'profiles', action = 'show' 同じことを、ページ・パラメーターを持つリストや、URL パラメーターに依存する他のページにも行う必要があります。また、セキュリティーも考慮する必要があります。 ページがキャッシュの中にある場合、Rails フレームワークは無関係なため、サーバーはセキュリティーの面倒を見てくれません。Web サーバーはキャッシュの中の任意のページを構わず描画し、ユーザーがそうしたページを見る権限を持っているかどうかを気にしません。そのため、そのページを見られる人が誰かを気にする場合には、ページ・キャッシングを使うべきではありません。 単純で静的なページを単にキャッシュするだけであれば、必要なことは以上です。ある程度コンテンツが単純である限り、難しいことはありません。 しかし、もっと複雑なコンテンツをキャッシュしようとすると、トレードオフを迫られます。大幅に動的なページをキャッシュする場合には、失効ロジックが複雑になります。複雑な失効ポリシーを処理するためには、カスタムのスイーパー (sweeper) を作成して構成する必要があります。こうしたクラスは、ある種のコントローラー・アクションが起動されると、選択された要素をキャッシュから削除します。 大部分のカスタム・スイーパーは、何らかのモデル・オブジェクトを観察し、そして変化に基づいて、1 つ以上のキャッシュ・ページを失効させるためのロジックを起動します。リスト 5 は典型的なキャッシュ・スイーパーを示しています。スイーパーの中では、アクティブ・レコード・イベント (例えば after_save など) を定義することができます。そのイベントが起動すると、スイーパーが起動し、そしてキャッシュの中にある、選択されたページを無効にします。この例は expire_page メソッドに基づく無効化を示しています。多くの本格的なアプリケーションでは、こうした方法ではなく、Ruby の素晴らしいファイル・システム・ユーティリティーを直接使って、キャッシュされたページを明示的に削除しています。 リスト 5. 典型的なオブザーバー class CauseController ApplicationController cache_sweeper cause_sweeper ... class CauseSweeper ActionController Caching Sweeper observe Cause def after_save(record) expire_page( controller = 'causes', action = 'show', id = record.id) cause.nonprofits.each do |nonprofit| expire_page( controller = 'nonprofits', action = 'show', id = nonprofit.id) end end end おそらく皆さんは、ページ・キャッシングの欠点、つまり複雑さに気が付き始めたのではないでしょうか。ページ・レベルのキャッシングを適切に行うことはできますが、複雑になるという特有の問題があるため、アプリケーションはテストしにくくなり、またシステム中でバグの可能性が高まります。また、もしページがユーザーごとに異なる場合には、あるいは認証されたページをキャッシュしたい場合には、ページ・キャッシング以上のものを検討する必要があります。ChangingThePresent の場合は両方の状況に対応する必要があります。なぜなら、ユーザーがログインしているかによって基本的なレイアウト上のリンクを変更しているからです。私達の大部分のページでは、ページ・レベルのキャッシングなど、考えることすらできません。ページ・レベルのキャッシングに関して学ぶためには、いくつかの素晴らしい記事へのリンクを「参考文献」にあげましたので、それらを参照してください。次に、ページ全体のキャッシングの別形式である、アクション・キャッシングについて説明します アクション・キャッシング ここまでのところで、ページ・キャッシングの基本的な強みと、基本的な弱みの両方を学びました。大部分のページ取得では、Rails が画像を含めることはありません。強みはスピードであり、弱みは柔軟性です。アプリケーションの状態 (例えば認証など) に基づいてページ全体のキャッシングを行う必要がある場合には、ページ・キャッシングではなくアクション・キャッシングをすることができます。 アクション・キャッシングは、ページ・キャッシングと同じように動作しますが、フローは少し異なります。Rails はアクションを描画する前に、実際にコントローラーを呼び出します。もしそのアクションによって描画されたページが既にキャッシュの中にある場合には、 Rails はそのページを再度描画するのではなく、キャッシュの中にある、そのページを描画します。今度は画像の中に Rails があるため、ページ・キャッシングよりもやや遅くなりますが、有利な点もあります。ほとんどすべての Rails 認証スキーマは、コントローラーの before フィルターを使います。アクション・キャッシングでは、コントローラーによる認証と任意のフィルターを利用することができます。 構文的には、アクション・キャッシングはページ・キャッシングとまったく同じように動作しますが、使用するディレクティブは異なります。リスト 6 は caches_action ディレクティブの使い方を示しています。 リスト 6. アクション・キャッシングを有効にする class AboutController ApplicationController caches_action secret_page, secret_list end キャッシュの失効、そしてスイーパーも、同じように動作します。私達はアクション・キャッシングを使っていませんが、その理由の多くはページ・キャッシングを使わない理由と同じです。しかしフラグメント・キャッシングは私達にとって、はるかに重要です。 ページ・フラグメントのキャッシング 部分キャッシングを使うと、ページの一部 (多くの場合はレイアウトのためのコンテンツ) をキャッシュすることができます。またフラグメント・キャッシングを使うと、Web ページ上に直接置かれた rhtml ディレクティブでブロックを囲むことによって、キャッシュすべきフラグメントを特定することができます (リスト 7)。ChangingThePresent.org では、フロント・ページと他の何ページかをフラグメント・キャッシングを使ってキャッシュしています。これらのページは、どれもデータベースを頻繁にアクセスし、また私達のサイトで最も人気のあるページです。 リスト 7. キャッシュ・フラグメントを特定する % cache 'gifts_index' do % h3 Here, you can make the world a better place with a single gift. Donation gifts are also a wonderful way to honor friends and family. Just imagine what we can achieve together. /h3 h2 class="lightBlue" %= @event_title % /h2 div id="homefeatureitems" % for gift in @event_gifts % %= render partial = 'gifts/listable', locals = { gift = gift } % % end % /div ... % end % リスト 7 では、キャッシュする対象のフラグメントを cache ヘルパーが特定します。最初のパラメーターは、キャッシュ・フラグメントを特定する固有の名前です。2 番目のパラメーターは、どの RHTML フラグメントをキャッシュするかを正確に特定するコード・ブロック (最初の do と最後の end の間のコード) を含んでいます。 私達のサイトにはホームページが 1 つしかないため、ページに名前を付けるのは簡単です。他の場所では、あるページの URL を決定するメソッドを使って、キャッシュ・フラグメントを固有識別しています。例えば世界平和あるいは貧困の緩和など、大義のためのコードをキャッシュする場合、私達はリスト 8 のコードを使います。このコードは、その大義に対するパーマネント URL (パーマリンクとも呼ばれます) を発見します。 リスト 8. URL によってキャッシュ・フラグメントを特定する % cache @cause.permalink(params[ id]) do % 通常、個々のページをキャッシュする場合、それらのページをスイーパーで失効させる必要があります。しかし場合によると、単純に時間に基づいてオブジェクトを失効させる方法を使った方が容易で簡潔なことがあります。Rails はデフォルトではそうした機構を提供していませんが、timed_fragment_cache というプラグインを使うと、ちょっとしたトリックを行えます。このプラグインを使うと、キャッシュされたコンテンツの中で、あるいはページの動的データを提供するコントローラー・コードの中で、タイムアウトを指定することができます。例えばリスト 9 は、大義のリストを持つページに対する動的データを作成するコードを示しています。when_fragment_expired メソッドは、関連付けられたキャッシュ・フラグメントが失効する時にのみ実行されます。このメソッドは、タイムアウトの長さを指定するパラメーターと、どのコンテンツが失効した時にそのコンテンツを再構築するかを指定するコード・ブロックを使います。rhtml ページの中で、キャッシュ・メソッドと共にタイムアウトを指定する選択もあったのですが、私達にとってはコントローラー・ベースのメソッドの方が好ましい選択でした。 リスト 9. 時間に基づくキャッシュの失効 def index when_fragment_expired 'causes_list', 15.minutes.from_now do @causes = Cause.find_all_ordered end end 有効期限付きの方法を使うと、(少しばかり古いデータで我慢できるのなら) キャッシング方法を大幅に単純化することができます。キャッシュされる要素それぞれに対して、キャッシュしたいコンテンツと、動的コンテンツを作成する任意のコントローラー・アクション、そしてタイムアウトを指定すればよいだけです。ページ・キャッシングの場合と同じく、もし必要であれば、expire_fragment controller = controller, action = action, id = id.というメソッドを使って明示的にコンテンツを失効させることもできます。このメソッドは、キャッシュされたアクションやページの失効とまったく同じように動作します。次に、バック・エンドの構成方法を説明しましょう。 memcached ここまで、Ruby on Rails のためのページとフラグメントのキャッシング・モデルを説明してきました。API については説明したので、今度はキャッシュされたデータがどこに行くのかを定義しましょう。Rails はデフォルトで、キャッシュされたページをファイル・システムの中に置きます。キャッシュされたページもアクションも、公開のディレクトリーの中に入ります。キャッシュされたフラグメントのストレージ場所は、構成することができます。メモリー・ストアを使うこともでき、あるいは (指定したディレクトリーの) ファイル・システムやデータベース、あるいは memcached と呼ばれるサービスを使うこともできます。ChangingThePresent.org では memcached を使っています。 memcached は、ネットワークを介して到達できる巨大なハッシュ・マップと考えることができます。メモリー・ベースで行うキャッシングは高速であり、そしてネットワーク・ベースのキャッシュはスケーラブルです。プラグイン・サポートを利用することで、Rails は memcached を使ってフラグメントと ActiveRecord モデルをキャッシュすることができます。memcached を使うためには、memcached をインストールし (詳細は「参考文献」を参照)、そしてそれを environment.rb (あるいは production.rb など環境構成ファイルの 1 つ) の中で構成します。 リスト 10. キャッシングの構成 config.action_controller.perform_caching = true memcache_options = { c_threshold = 10_000, compression = false, debug = false, readonly = false, urlencode = false, ttl = 300, namespace = 'igprod', disabled = false } CACHE = MemCache.new memcache_options リスト 10 は、典型的な構成を示しています。1 行目の config.action_controller.perform_caching = true は、キャッシングをオンにします。次の行は、キャッシングのオプションを準備します。さまざまなオプションを利用することで、さらに多くのデバッグ・データを取得でき、キャッシュを無効にでき、そしてキャッシュの名前空間を定義できることに注意してください。構成オプションの詳細については、「参考文献」セクションにあげた memcached のサイトを参照してください。 モデルのキャッシング 私達が使用しているキャッシング形式の最後は、モデル・ベースのキャッシングです。私達は、CachedModel と呼ばれる、キャッシング・プラグインをカスタマイズしたものを使っています。モデル・キャッシングは限定された形式のデータベース・キャッシュであり、容易に、モデル単位で有効化することができます。 モデルでキャッシング・ソリューションを利用するためには、ActiveRecord を継承する代わりに単純に CachedModel クラスを継承します (リスト 11)。CachedModel は ActiveRecord Baseを継承します。ActiveRecord は、完全なオブジェクト・リレーショナル・マッピング・レイヤーではありません。このフレームワークは、SQL に大きく依存して複雑な機能を実行します。そしてユーザーは、必要に応じて容易に SQL の中まで入り込むことができます。ただし直接 SQL を使用すると、キャッシングに問題が起こりがちです。これはキャッシング・レイヤーが、1 つのデータベース行ではなく完全な結果セットを処理しなければならないためです。結果セットを完全に処理することは、できたとしても問題が多く、それを十分にサポートするアプリケーション・ロジックがない限り、ほとんど不可能です。こうした理由から、CachedModel は厳密に 1 つのモデル・オブジェクトのキャッシングのみに焦点を絞っており、1 つの行を返すクエリーに対してのみ高速化を行います。 リスト 11. CachedModel を使う Class Cause CachedModel 大部分の Rails アプリケーションは、(ユーザー・オブジェクトなど) いくつかの項目を繰り返しアクセスします。こうした状況では、モデル・キャッシングによって動作が高速化されます。ChangingThePresent の場合には、ようやく最近、モデル・ベースのキャッシングの活用を始めたところです。 まとめ Ruby は非常に生産的な言語ですが、インタープリター型であるため、パフォーマンスの観点からは理想的ではありません。大部分の主な Rails アプリケーションは、キャッシングを効果的に利用することで、そうした欠点をいくらか低減しています。ChangingThePresent.org の場合、私達は基本的にフラグメント・キャッシングを使っており、また基本的にタイム・ベースの方法を使うことで、コントローラーによるフラグメントのキャッシングを無効にしています。私達の場合にはログインしたユーザーに基づいて変化するページがあるのですが、この方法はうまく機能しています。 また私達は、memcached に基づく CachedModel クラスを使った場合の影響も検討しています。まだ、そうしたキャッシングがデータベースのパフォーマンスに与える影響を検討し始めたばかりですが、初期の結果を見る限り有望です。