ASP.NETのセッション管理をAppFabric Cachingで!

AppFabricのインストール(ポイントだけ)

Windows Server AppFabricのダウンロードはこちらから。

4つほどありますが、Server2008R2やWindows7の64bit版であれば、

WindowsServerAppFabricSetup_x64_6.1.exe  

をダウンロードしてインストール。きっちりCachingサービスと管理ツールを選択するのを忘れずに。

あとドメインに参加していないと、設定はSQLServerに保存できず、共有フォルダを作ってXML管理になります。

なお、AppFabric Cachingの管理ツールは以下から、

スタートメニュー > Windows Server AppFabric > Windows PowerShell のキャッシュ管理

右クリックして管理者として実行しないとダメです。通常権限でも起動しますが、ことごとくコマンドが失敗します。

とりあえずCaching管理ツールから以下のコマンドでAppFabric Cachingを動くようにしておきます。

PS C:\Windows\System32> Use-CacheCluster

PS C:\Windows\System32> Start-CacheCluster

アプリケーションのインストール

今回は勉強がてらEdtterを利用しました。ダウンロードはこちら

ASPNETDBとEDTTERのmdfがついているので、適宜SQLServerにアタッチして、

Web.configのApplicationServices(ユーザー管理)とEdtterEntities(Edtterの投稿管理)のConnectionStringを書き換えましょう。

あとはIIS7で適当に設定すれば動くようになります。

AppFabric Cachingの設定

セッション管理のためのキャッシュの作成と、セキュリティ関連の設定の変更をします。

まず、キャッシュを作成します。今回はsessionという名前でキャッシュを作成します。これは後述するweb.configの設定と合わせる必要があります。

PS C:\Windows\System32> New-Cache session

そしていったんCacheClusterを停止しましょう。

PS C:\Windows\System32> Stop-CacheCluster

次に、セキュリティ関連の設定をします。Webサーバーと同じサーバーで実行するのであれば、

PS C:\Windows\System32> Grant-CacheAllowedClientAccount

Account: IIS APPPOOL\ASP.NET v4.0

みたいな感じで、アプリケーションプール名を指定します(\の右の部分)。

動作するアプリケーションがNETWORK SERVICE権限で動くのであれば、NETWORK SERVICEを指定しておきます。

が、別サーバーで動かす場合のやり方がわからんので、今回はセキュリティ関連の設定を全部Offにします。(せめてID/PWD認証があれば楽なんですがそれすら無いので)

PS C:\Windows\System32> Set-CacheClusterSecurity

SecurityMode: None

ProtectionLevel: None

以上でAppFabric Cachingの(最低限の)設定は完了です。細かい設定をするともっと大変なのですが、英語のドキュメントも翻訳済みドキュメントも、

ベストプラクティス的なのがどうにも見当たらないので今回はそのままで。

最後にCacheClusterを再開しておきましょう。

PS C:\Windows\System32> Start-CacheCluster

アプリケーションの設定

EdtterのWeb.configを開き、<Configuration>要素の直下に以下の設定を追加します。

  <!-- configSectionsに追加 -->
  <configSections>
    <section name="dataCacheClient"
        type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
           Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0,
           Culture=neutral, PublicKeyToken=31bf3856ad364e35"

        allowLocation="true"
        allowDefinition="Everywhere"/>
  </configSections>

  <!-- dataCacheClient要素を追記 -->
  <!-- キャッシュの設定などはここに記述する -->
  <dataCacheClient>
    <localCache isEnabled="true" />
    <hosts>
      <host name="localhost" cachePort="22233" />
    </hosts>
    <securityProperties mode="None" protectionLevel="None" />
  </dataCacheClient>

そして<system.web>要素の直下に以下の設定を追加します。

    <!-- system.webにsessionState要素を追記 -->
    <sessionState mode="Custom" customProvider="Velocity">
      <providers>
        <add name="Velocity" type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider" cacheName="session" />
      </providers>
    </sessionState>

 最後に、Edtterのソリューションの参照設定に以下のDLLを追加します。

C:\Windows\assembly\GAC_MSIL\Microsoft.ApplicationServer.Caching.Client\1.0.0.0__31bf3856ad364e35\Microsoft.ApplicationServer.Caching.Client.dll

追加したら、参照のプロパティでローカルコピーをTrueにしておきましょう。そうすることで、Microsoft.ApplicationServer.Caching.Client.dllがアプリケーションへの発行時にコピーしてくれます。

(これが正しいやり方なのかどうかわかりません。手動でbinフォルダ内にコピーしてもいいです)

動作確認

ここまで出来たら、VS2010からアプリケーションを発行します。まぁWeb配置ツールはそこまで難しくないので、そのあたりはなんとなくやりましょう。

でもローカルIISへの発行は管理者権限でVS2010を起動していないと許してくれないので注意(めんどくせぇ)

アプリケーションを無事発行、つまりIISにアプリケーションとして配置できたら、Edtterを開いてください。

ここで長時間待たされる場合は、AppFabric Cachingが立ち上がってないとか、導通していないとか、アクセス権がないとか、そこらへんで詰まっている可能性が高いです。

そのあたりで問題が起きなければ、通常通りEdtterの画面がブラウザに表示されるはずです。

試しに、何かセッションを利用するコードを書いて、AppFabric Cachngが使われているかどうか確認してみましょう。

なんでもかまわないので、Controllers\HomeController.csのIndexメソッドに以下を追加してみます。

        public ActionResult Index([DefaultValue(1)] int id)
        {
            // 書き込み
            Session["now"] = DateTime.Now;

            ViewData["TotalPages"] = _er.TotaltPages();
            ViewData["CurrentPage"] = id;

            var entries = _er.GetList(id);

            // 呼び出し
            var now = Session["now"];

            if (Request != null &amp;&amp; Request.IsAjaxRequest())
                return PartialView("EntryList2", entries);
            else
                return View(entries);
        }

確認用に、Views\Home\Index.aspxの好きなところに、

<%: ViewData["now"] %>

とでも書いておきましょう。

 以上で再度ビルドして発行できたら、再度Edtterの画面を開いてみましょう。

わかりやすいよう、VisualStudioでブレークポイントを設定してみます。 

 ブレークポイントを設定

これだけだとホントにAppFabric Cachingを使っているかどうかわからないので、

Caching管理ツールで以下のコマンドを実行してみましょう。

PS C:\Windows\system32> Get-CacheStatistics session

Size         : 508
ItemCount    : 2
RegionCount  : 2
RequestCount : 24
MissCount    : 2

こんな具合で、きっちりAppFabric Cachingが利用できていることが確認できました。

リロードするたびに、カウントが増えていくのが確認できるかと思います。

とらのあな実店舗でのポイント値引き計算について

いつ頃からかわかりませんが、最近はとらのあな実店舗でも、ポイントによる値引きが利用できるようになりました。

こちらのページによると、ポイントは20円ごと1ポイント(つまり5%で切り捨て)が貯まるようです。

また、消費税は対象外となるため、本体価格(税抜き金額)からの計算になります。つまり税抜き1000円、税込み1050円の商品の場合は50ポイント。

# というか店舗でのポイント利用の案内早く書いた方が良いと思いますよ、とらのあなさん。

じゃあポイントを利用した場合はどなるのか、ざっくり計算してみました。

Excelでざっくり

とりあえずレジのバイトのおねーちゃんに言われるがまま、100ポイント100円らしいので100円分値引きしてもらっています。

ちなみにレシートに記載された発生ポイントは77ポイント。

本体価格の合計は1653円となりますが、1653 * 0.05は82.65になるはずなので、少なくとも値引き前の金額でポイント計算されているということはありません。

おそらく、本体価格合計からポイント値引き分を引いて、その金額の5%を発生ポイントとして計算しているかと思われます。

…が、このやり方だと『ポイントが発生しない商品を含んだ会計でポイント値引きをした場合』に対応できないため、内部的にはポイント値引きを各商品に按分して計算している可能性もあります。

(上のキャプチャでいう右の方のポイント値引き額の欄参照。でも今のところそういうことはやってないようですが)

え、なんでそんなめんどくさいことするの? と一瞬思われるかもしれませんが、商品毎にポイントついたりつかなかったり、ポイント率が違ったりすると、ポイント値引きも商品毎にやらないといけません。

早い話が、ポイント率が高い商品からポイント値引きしたことにすると、ポイント率が低い商品からポイント値引きしたことにした場合より、発生ポイントが少なくなってしまうわけです。

というか『どの商品から値引きするか自動的に決める』なんてのはシステム的には死ぬほどめんどくさそうなので私なら絶対にやりたくありません。

これがさらにオンラインでの決済だったりするとさらに面倒で、いざ出荷するときに値段変わってたりしたらどうするの? なんていう問題もあります。

ショップ都合での金額変更であれば、あくまで注文時のこととして割り切れなくもないですが、こと書籍に至っては本体価格がわりとあやふやだったりします。

# 基本、出版社というのは価格にしても発売日にしてもかなり不安定で、早い話が残念な連中です。

このあたりについては、Amazonがかなりしっかりした仕組みを持って運用しているようです。Amazonポイントについてのヘルプなどはかなり参考になるでしょう。

Amazon.co.jp ヘルプ:Amazonポイント 

まぁそのAmazonも、最近はポイントがつく商品はかなり少なく、色々みてまわったものの、以下のページぐらいでしかポイントがつく商品が見当たりませんでした。

Amazon.co.jp:「みんなが選ぶ本 10%ポイント還元」キャンペーン(AA)

予約商品で値段が変わった場合は、支払い価格に応じたポイントが付与されるようなので、

システム的には、注文データに購入時のポイント率を持っておいて、実際の請求金額で付与ポイント数を再計算する感じでしょうか。ああめんどくさい。

 

とまぁこんな感じで、ポイント計算などいうのものは地味でありながらも、かくもめんどくさいのよ、というお話でした。

ちなみに上のExcelの表、価格やポイント発生率、ポイント値引きの数値を変更すれば、発生ポイントも自動的に計算されるよう、式を織り交ぜて構成させていますが、

一点、致命的な考慮漏れが存在します。それはなにか。支払金額を全額ポイントで支払いした場合です。

税抜き価格の合計が1653円なのに、税込み価格合計の1735円を1735ポイント使って値引きしました。

発生ポイントの計算用に、ポイント値引き分を税抜き価格合計から引いて計算します。

( 1653 -1735 ) * 0.05 = -4.1

おおっと、マイナスになっちゃいました。

まぁそもそも、100ポイント100円とかバイトのおねーちゃんは言っていたので、もしかしたら100ポイント単位でしか使えなかったり、

ポイント利用も実は税込み金額に対する値引きではなく、税抜き金額に対する値引きであるなら大丈夫なのですが、

請求される金額は1050円なのに、ポイントで全額支払おうとしたら1000ポイントで済んだ、とか客的にはイミフかと思うので、そのセンは薄いかなとは思います。

まぁ、システム的には、利用ポイント数が税抜き金額合計を上回った時点で、発生ポイント全部ゼロにすれば済む話ではありますが。ああめんどくさい。

evolus pencilが凄い

画面設計をしていて、evolus pencilのあまりの素晴らしさに感銘を受けたので、勢いでエントリを書いてます。

pencilはいわゆる HTMLモック を作成できるソフトウェア。モックに限らず、汎用的なGUIプロトタイピングも可能です。

(というかもとよりそっちがメインコンセプト)

ダウンロードはこちらから。本家サイトはどうもつながりません。Donateしようとしたらサイトが落ちていて全然、という。

なお、Pencil-1.2.0.win32.installer.exeというのがWindows用のスタンドアローンで動くアプリケーション本体のインストーラになります。

元々はFirefoxのプラグインだったようですが、いつからかスタンドアローンで動くバージョン(でもおそらくFx関連のコンポーネントで動いてる)が出ており、

さらに最近はSketch系のステンシルも追加されて、かなり本格的なアプリケーションになってきました。

なお、 ファイル名の右に緑色の文字でTemplateと書かれたファイルは、エクスポート形式の追加プラグイン、Stencilと書かれたファイルは追加の図形になります。

Export TemplateじゃないTemplateはいまいち使い方がわかりませんが…

とりあえず、インストーラとSimple HTML Export Templateをダウンロードしておきます。

Pencil-1.2.0.win32.installer.exeを叩いて、普通にインストールしましょう。

 pencil起動画面

起動後の画面です。使い方はなんてことはない、左ペインに表示されたステンシル(図形)を右側の図面にドラッグ&ドロップしていくだけです。

…が。

いつのバージョンからか、Sketch GUIという、スケッチ風のステンシルが標準で同梱されているようになりました。

 Sketch GUI ステンシル

 このステンシル、Microsoft Expression Blend 3 Sketch Flowのような、ラフ書き風のシェイプ(ステンシル)になります。

ラフ書きの何がいいかというと、画面設計を顧客に説明する際に、あくまでこれは画面設計である、という点をわかってもらいやすいという利点があります。

画面設計はあくまでラフ、プロトタイプなので、デザインについては後から詰めるものなので、画面設計について打ち合わせをする場合にデザインの話はしてはいけません。

(なのであまり緻密すぎる画面設計書をこの時点で客に見せるべきではない)

というところでSketch風プロトタイピングの出番というわけです。

pencilのこのSketchy GUIステンシルですが、プロトタイピングには十分なシェイプを備えています。

汎用Box(Border付きのDivのようなもの)、ライン(角度、長さ調整可能)、テキストボックス、パスワードフォーム、ラベル(ただの文字列)、ハイパーリンク文字列、

パンくずメニュー、ボタン、チェックボックス、ラジオボタン、コンボボックス、リストメニュー、スライダー、テーブルなどなど。

これだけあれば、まずプロトタイピングには困らないでしょう。Excelのような使い方をしたい向きには、

Annotationステンシルに吹き出しや文字入り丸形図形なども入っているため、注釈なども簡単につけられます。

では、ちょっとした画面設計をしてみましょう。Sketchy GUIから適当にシェイプをDnDして配置していきます。

ステンシルの配置

こんな具合に、VisualStudioのフォームデザイナのように他の配置済みステンシルの座標に吸着する機能もあります。

VisualStudioほど洗練はされていませんが、 かなり嬉しい機能のひとつです。

 テーブルなど

テーブルなども簡単。配置した テーブルのシェイプをダブルクリックすると、エディットモードになります。

 テーブルの編集

Shift + Enterで次の行の入力が出来ます。セルの区切りは|(パイプ)で、[]でチェックボックス(中に*を書くとチェック済み)、()でラジオボタンが描けます。

行が増えた場合や、たまにズレがおきる場合などが、ありますが、まぁなんとかなるレベルです。

もちろん、Microsoft Officeによくある「シェイプのグループ化」「背面に移動」なども右クリックメニューから可能。

シェイプをまとめて選択して、ツールバーのボタンから左揃え、上端揃え、等間隔化なども可能(凄い!)

もちろんシェイプのプロパティから色やフォントサイズの変更なども当然出来ます。

 色をつけてみる

では、単純なCRUDアプリケーションとして、新規登録画面も作ってみましょう。

右上の +New Page…ボタンから新しいページを作成できます。当然、ページに名前をつけることも、さらにはコメントをつけることも出来ます。

 新規登録

こんな感じの画面にしました。スタンダードな感じです。

さて、当然検索画面から新規登録画面が表示され、登録画面から検索画面に戻るのが普通な流れです。

(ポップアップする場合もありましょうが)

というわけで画面遷移を定義します。新規登録ボタンを右クリックし、Link To > で遷移させたいページを選択します。 

 画面遷移の定義

同様に、新規登録画面の登録ボタンにも、検索画面へのリンクを定義しておきましょう。

ここまでやったら、画面設計をエクスポートしてみましょう。

メニューのTools > Manage Export Templateから、先ほどのダウンロードページにあったHTML Templateを登録します。

エクスポートテンプレートの設定

Install New Templateボタンでファイル参照して、ダウンロードしてきたZIPをそのまま指定するだけ。簡単です。

そして、メニューのDocument > Export Documentをクリックします。

いろいろ形式はありますが、Single web pageを選んでNextボタンを押してください。

(いろいろ試しましたがODTとPDF、DOCはうまくいきませんでした。ODTは一応ファイルは開けるのですが…)

Single web pageを選択

あとは適当にNext、Nextして、ファイルの出力場所を選んでFinishするだけです。

エクスポートされたファイル

こんな感じでファイルが出力されます。

では、index.htmlを開いてみましょう。

HTMLエクスポートされたファイルをブラウザで表示

こんな感じで(わかりづらいですが…)、新規登録ボタンのところがClickableになっており、

クリックすると新規登録画面のところまでページ内遷移するようなHTMLができあがります。

流石にpencilで編集したモックアップからベクターデータを作ってくれるまではしてくれませんが…

(あとテーブルのチェックボックスとラジオボタンはExportするとズレる)

とまぁ、こんな感じでpencilは画面設計については最強レベルに良くできたツールかと思います。

ぶっちゃけ、使いやすさだけでいうならExpression Blend Sketch Flowなんかより全然使いやすいです。

まぁ、テーブルがズレたり、たまに落ちたりするなど、若干難があったりしますが…

というわけでWebアプリの設計をする際はpencilちょーつかいやすいよ、というお話でした。

つか、Donateしようにもhttp://pencil.evolus.vn/Donation.aspxマジ繋がらなくてどうしようもないんだけど…

ネタが無いのでまた料理の話でも

豚カツ

再掲。豚カツです。作り方は普通のトンカツとだいたい同じ。

豚肉スライスを3枚ほど重ね、塩、コショウを振って小麦粉つけて、ガーリックプレスでつぶしたニンニク、五香粉、一味を和えた溶き卵につけてパン粉つけて揚げるだけ。

揚げ物って実は包丁で切らないといけない素材とかが少ないので意外と楽ちん。

ちなみに肉が肉なので、トンカツのようなジューシーな感じは無いので、串カツ感覚でガブガブするのが無難です。

あんましご飯には合わないかなと。

揚げ物ブーム

とんかつ・・?

とんかつのようなもの。が、見た目も食感もとんかつではない。

強いて言うならば、パン粉じみた豚の唐揚げ。まぁモモ肉使ってるのも悪いんだけど。

…いや最寄りのスーパーが金曜豚モモブロックgram88円とかやってたんでつい。

しかもとんかつソースが無いのでタバスコとマヨネーズで頂くってのもトンカツ風味を損なわしている原因だよな…

次は真面目にやろう。

M3 2010春 お疲れ様でした

東京流通センター

というわけで5/5、アニソン三昧と日程かぶりつつもM3 2010春(M3-25)終了。お疲れ様でした。

お目当ての物はだいたい買えたし、過ごしやすい陽気だったしで(待機列が日陰だったので)良い感じでした。

ちなみに会場、1Fと2Fに分かれていましたが移動はしやすく、初めて来ましたが同人イベントの会場としてはなかなか悪くない箱。

いつもは女性向けの同人誌イベントなどが多いみたい。まぁちょっと待機列の作り方がやりづらい形状なのかな、という気がしないでもないですが。

にしても東京モノレール近辺のマンションとかいったいどれだけの収入があれば住めるのだろうか。

少なくとも独身者が住むような場所ではないんだろうが…

久々に料理ネタ

近くの100円ショップでシーザードレッシングが安かったので今週はサラダ強化週間です。

サラダ菜、タマネギ、水菜の生ハムサラダ

サラダ菜、タマネギ、水菜の生ハムサラダ

近くのコンビニでハイネケン置いてなかったのでプレモル(プレミアムモルツ)で我慢。

なんかなぁ、国内大手メーカーのビールはどれも微妙。セブンイレブンまで足をのばせばギネス売ってるとはいえ…

つか、GRIFFONで地ビール飲み出してからというもの、国産ピルスナーがどうにも美味く感じられない。てか最近スタウト信者になりつつある。

でも癖のある地ビールもやっぱり好きなんだよねぇ。横浜ビールスコーピオンデスロックとかさ、ちょっと有り得んぐらい苦いんだけど、ああいう尖ったビールじゃないと満足出来ない。

一番好きなのは箕面スタウトで、次点で黒姫スタウトなんですが。とかいいつつ今度は無茶苦茶酸っぱいベルギービールとか飲みたくなってくる。

来週は久々にBisCafeでも行くかなぁ。

…しかし生ハムうめぇ。