Home

技術日記
ADO.NET Entity Frameworkで自動生成されたモデルクラスを拡張する方法Edit

ADO.NET Entity Frameworkで自動生成されたモデルクラスを拡張する方法はあるんだろうか? Foo.edmxに対応するFoo.Designer.csファイルは、Foo.edmxファイルをいじると自動的に上書き再生成されてしまうんで、直接そのファイルを変更することはできない。

でも、データ処理がらみの機能を実装する場合、別クラスを作ってそちらで書くのではなく、モデルクラスの方を直接いじってそちらで拡張した方が直観的な設計になることも多いよね。

で、Foo.Designer.csファイルの中身をよく見てみたら、モデルクラスはpartialで定義されていた。ってことは別ファイルにpartialで追加メソッドを用意すればいいだけなのか。たとえば、barテーブルに対応するBarクラスにメソッドを追加したければ、適当なクラスファイルを用意して、

[sourcecode language="c#"]
public partial class Bar : EntityObject
{
    public string ExtendedMethod()
    {
        return "extended!";
    }
}
[/sourcecode]
とかでOK。

これで機能拡張はできるとして、標準的な操作をoverrideしたりはできないのかな? たとえばinsert、update時にはcreated_at、modified_atとかを自動で更新したりとか。

調べてみたところ、EntityObjectにはPropertyChangedというイベントがあるので、それをフックすれば良さそう。

[sourcecode language="c#"]
public partial class Bar: EntityObject
{
    public Bar() : Base()
    {
        PropertyChanged += OnPropertyChanged;
    }

    protected void OnPropertyChanged(object sender, PropertyChangedEventArgs e)     {         if (new string[]{"updated_at", "created_at"}.Contains(e.PropertyName)) return;         if (id == 0) {// primary keyがセットされていない=新規作成             created_at = DateTime.Now;         }         updated_at = DateTime.Now;  } } [/sourcecode]

一応なんてコードでそれっぽく動いている。新規作成 or 更新の区別をid == 0かどうかで識別しているのが妥当かどうかはちょっと怪しい。ほかにもっとちゃんとした方法はないかな。

EntityStateってのを使うとそれっぽいことができそう。オブジェクトの作成・更新・削除状態が取得できるプロパティの模様。と思ったが、これはオブジェクトコンテキストにAttachされていないと状態が取得できないのか。

EntityObjectインスタンスメソッドのスコープからは親オブジェクトコンテキストが見えないから、いったんAttachして確認することもできないし、副作用もありそうだからあまりやりたくもないなー。ひとまずはidを見て切り分けることにしておくか。

Published At2011-11-11 21:40Updated At2011-11-11 21:40

テニス観戦記
ATP1000パリ5日目Edit

Tennis - ATP World Tour - Paris 2011 Friday - Djokovic Pulls Out Of Parisというわけで、ジョコビッチが右肩の治療のためQFをキャンセル。ツォンガがSFに進むことになった。

最終戦には出場するつもりみたい。まあ最終戦に出る気ならば、早めに休んで少しでも肩の調子を整えておいた方がいいだろう。トロイキ相手にはああいう戦い方で競り勝てても、トップ4同士のつぶし合いだともっと強打を多用しないときついだろうし、そうなると肩に掛かる負担も大きくなる。

  • ツォンガ def. ジョコビッチ WO
  • ベルディヒ def. マレー 4-6 7-6(5) 6-4
  • フェデラー def. モナコ 6-3 7-5
  • イズナー def. フェレール 6-3 3-6 6-3
マレーはベルディヒに逆転負けを食らってる。ベルディヒの調子が上がってるのか、マレーの調子が下がっているのか。マレーはこんな感じで最終戦を迎えたら、また不完全燃焼気味になっちゃいそうだ。バンコク、東京、上海と連勝しておいて、パリ、最終戦がいまいちだったら、相変わらずピークのもってきかたが下手だなーってことになっちゃうな。

フェデラーは順当。初っぱなからブレイクされてて、やっぱりフェデラーはパリはいまいちなのかなーと思っていたら、その後はあっさり逆転してストリート勝ちか。

フェレールはイズナーに負け。インドアハードでイズナーのサーブが有効に働いたかな。でもまあフェレールも最近疲れがたまっていそうだし、最終戦前にちょっと休んでおいた方がいいかも。

これでSFに残ったのは、フェデラー vs. ベルディヒとツォンガ vs. イズナー。USオープン後、最終戦に向けてしっかりコンディションを整えてきているようにみえるフェデラーだけど、今まで勝てたことがないパリで、最近分が悪いベルディヒ、ツォンガ相手に勝ちきれるかどうか。

そういえばラフバラのチャレンジャーに出ている添田は

  • Torebko def. 添田 0-6 7-6(8) 6-2
と大逆転負けを食らっている。セカンドセットのタイブレークを競り負けたのがなー。

Published At2011-11-12 08:11Updated At2011-11-12 08:11

テニス観戦記
ATP1000パリ6日目Edit

ATP1000パリ6日目結果。

  • ツォンガ def. イズナー 3-6 7-6(1) 7-6(2)
  • フェデラー def. ベルディヒ 6-4 6-3

フェデラーは一度もブレイクポイントを握られないフェデラーらしい完璧な試合運びだったみたいだな。バーゼル、パリ、最終戦を三つ取るためにコンディションはばっちりっぽい。

一方のツォンガはファーストセットを取られてから、タイブレイクを二つ取り返しての逆転勝ち。地元の観客を煽って盛り上げての逆転劇が目に見えるようだ。

ツォンガがフェデラーに勝つには、自分のサーブゲームはしっかりキープしつつ、タイブレイク勝負で二回取っていくしかないかなー。

Published At2011-11-13 06:53Updated At2011-11-13 06:53

テニス観戦記
ATP1000パリ決勝Edit

ATP1000パリ決勝。

  • フェデラー def. ツォンガ 6-1 7-6(3)
フェデラーがかつてのナルバンディアンのようにシーズン最後にポイントを稼ぎに来たな。これでバーゼル、パリと合わせて1500ポイント。今年のマスターズ初勝利&パリマスターズの初勝利のおまけ付き。

ツォンガは、フェデラーに勝つためにいつもよりもちょっと無理に攻撃する球を増やしていたけど、大事なポイントでその成功率が低かったな。フェデラーが、ツォンガに攻撃された球を苦しい体勢(特に超ライジング)からうまく返していて、強打を何度も続けなければポイントが取れなかったのもきつかった。

一方のフェデラーはいつも通りの攻撃的なプレイで、スーパーフェデラー状態じゃなかったからそこそこミスもあったけど、大事なポイントではとてもいいプレイをできていた。特に欲しいポイントをネットに出て取りに行くプレイの確率が高かったな。

あと、フェデラーは最近フォアハンドのランニングショットの切り返しがあまり良くなかったんだけど、この試合を見る限りでは、全盛期並みにいいショットを打っていた。フットワークが復活してきたのかな?

あと、おそらくナダル対策のために去年辺りから増やしていたバックハンドのストレートへの強打が、威力はあるけど確率が悪くていまいちぎくしゃくしていた感じだったのが、今回はだいぶ自然な感じのショットセレクションの中に組み込まれていた。

ただこれは、相手がツォンガだからあまりバックハンドの高い打点で打たされることがなく、無理せずスピンをかけやすかっただけかもしれない。最終戦でナダルやジョコビッチ相手でも、あのくらい自然にバックハンドストレートの強打を打てるかな。

ともかくこれで最終戦、トップ4の戦いがだいぶ楽しみになった。パリを回避して体調万全のナダルと、コンディションばっちりでバーゼル、パリと連覇してきたフェデラー、肩の不安があるが今シーズンを圧倒してきたジョコビッチ、直前で失速したがアジアシリーズを圧倒してきたマレー。トップ4のグループ分けはどうなるだろうなー。

Published At2011-11-14 06:58Updated At2011-11-14 06:58

ニュース記
ニュース記Edit

HBFav というはてなブックマーク iPhone アプリを作りました - naoyaのはてなダイアリー

HBFav はタイムライン形式でソーシャル・ブックマークを楽しむためのアプリ。はてなブックマークのお気に入り機能を活用しているぜ! という方におすすめです。

TwitterのタイムラインでURLが含まれるツイートだけを表示するツールじゃだめなのかのー。通常のタイムラインと分けたいのならば、リストとか使って分類したりとか。

(合気達人)柳龍拳 VS (総合格闘家)岩倉豪 - YouTube

お知らせ|札幌市の武術・整体・気功なら、大東流合気道の柳武術整体気功院へ

魅惑の変貌を遂げまくる!コーギーといろんな犬種のミックスまとめ - NAVER まとめ

なんか不自然なミックスが多いな。シーズーとかパピヨンとのミックスは単にコーギーの子犬に見えるんだけど、これは成犬なのか?

モバイルFlashの死因をAdobeの社員がブログで語る–すべての道はHTML5へ

Flashはスマートフォンの世界で、PC上で享受していたような遍在性に到達できない
モバイルデバイスの上ではHTML5が、Flash Playerがデスクトップ上で提供したような遍在性を提供する
ユーザの頭の中には、スマートフォン==アプリ、という概念が固着している
大勢の技術者たちを、(1)OSやその構成ごとに調整を要する、(2)しかも彼らが願ったほどには普及しない、製品に向けるのではなく、HTML5の開発に向けたほうが得策
でもモバイル向けのAIRは続けるんだよね。この理屈だとあれもやめるのか? AIR to アプリ変換のプラットフォームとしてAIRを続けるってだけか?

Objective-C で ARC を有効にしたプロジェクトで、一部ファイルのみ ARC を無効にする方法 « Zero4Racer PRO Developer's Blog

Published At2011-11-14 14:33Updated At2011-11-14 14:33

技術日記
ASP.NET MVCの認証にMySQL(MySqlMembershipProvider)を使うEdit

MySQL :: MySQL 5.5 Reference Manual :: 21.2.4.2 Tutorial: MySQL Connector/Net ASP.NET Membership and Role Providerが、関連ドキュメント。

ただし、machine.configを云々って説明がよくわからん。web.configのほかにmachine.configを用意して、そっちにMySqlMembershipProviderがらみの設定を書けってこと? なんでweb.configじゃだめなんだ? 設定ファイルを分散させたくないんで、web.configで完結させる方向で試してみる。

まず上記ドキュメントを見ながら、configuration/system.web/membership/providers以下にデフォルトで書かれている、AspNetSqlMembershipProviderキーの内容を以下に変更。

ドキュメントのようにMySqlMembershipProviderというキーで定義しても、デフォルトのAspNetSqlMembershipProviderの方が参照されてしまうので、AspNetSqlMembershipProviderを書き換える方法を選んだ。

たぶんどこかで(machine.config?)デフォルト参照先のプロバイダー名を変更できるんだろうけど、RoleProviderとかTokenRoleProviderとかとの参照関係とかの内容がよくわからないので、追求するのはあきらめた。

[sourcecode language="xml"]

[/sourcecode]
ドキュメント上のサンプルではMySqlMembershipProviderのバージョンがずいぶん古い記述だったので、インストールされているバージョンに合わせた。

続いて、DB接続文字列をここで設定したApplicationServicesという名前で追加。

[sourcecode language="xml"]
    
[/sourcecode]
これで試しにASP.NET MVCアプリケーションのデフォルトのアカウント関連ページに接続すると、必要なテーブル(my_aspnet_*)が自動的に登録されているのが確認できる。

あと、ロール関連のプロバイダーもMySQLのものに変更。

[sourcecode language="xml"]
        
[/sourcecode]
typeで細かいバージョン名まで指定しないと読み込んでくれなかった。

これでASP.NET Webサイト管理ツールを起動したら、ユーザー登録情報の変更やロールの追加などが一通り動くようになった。

続いて、パスワード変更機能を有効化。単にリンクがないだけなんで、Views/Shared/_LogOnPartial.cshtmlのログアウトの後ろに、

[sourcecode language="c#"]
[@Html.ActionLink("パスワード変更", "ChangePassword", "Account")]
[/sourcecode]
を追加。

あと、自由にユーザー登録できるサイトじゃなくしたいんで、AcciontControllerのRegster関連アクションメソッドに[Authorize(Role="superuser")]属性をつけておいて、superuser権限を持つユーザー以外は呼べないようにしておいた。ただ、デフォルトだとユーザー登録したらそのユーザーでログインしてしまうんで、

[sourcecode language="c#"]
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
[/sourcecode]
をコメントアウトして、単なるユーザー登録のみの処理に変更。あとはログイン画面の登録リンクや文言を修正すれば、自由にユーザー登録できないサイトになる。

ちなみにビュー内でユーザー権限チェックなどで条件分岐したい場合は、

[sourcecode language="c#"]
@if (User.IsInRole("superuser")) {
  

superuser向けの表示

} [/sourcecode]
なんて感じでUser経由でアクセスできる。

Published At2011-11-14 17:43Updated At2011-11-14 17:43

テニス日記
テニス日記Edit

今日は朝練に出かけようと車に乗ったら、バッテリーが上がっていた。土日に出かけた時にシートアレンジを変更していて、帰ってから元に戻す作業をしたあとに室内灯を消し忘れていた。

しょうがないんで、半年くらい放置していた自転車のタイヤに空気をいれて、慌てて自転車で出発。自転車はちょっとギアチェンジが渋いくらいで、何とか普通に動いてくれた。

と、出だしからばたばたしたせいで、練習にはあまり集中できず。頭をろくに使わずに過ごしてしまった。筋肉疲労がない状態だったんで、プレイの内容的にはそれなりだったけど、中身の薄い練習だった。

車のバッテリーは外してチャージャー(昔バッテリーが弱い車に乗っていたんで、家庭用電源から12Vを充電するチャージャーを持っている)につないで来たから、夜までには充電されているだろう。明日からは平常営業に戻ってちゃんとやろう。

Published At2011-11-15 12:12Updated At2011-11-15 12:12

ニュース記
リチウムイオン電池の発明、著作権侵害非親告罪化について、JavaScript開発の今後、デマの立証、シークレットウィンドウ、レーシックEdit

モバイル・デバイスに革命か―リチム・イオン電池の容量が10倍、充電時間が10分の1になる?

1、2年で実用化してくれないかな。

TPPで著作権侵害が非親告罪化されたら~同人誌・コスプレを守る方法とは -INTERNET Watch

TPPがどうなるにしろ、二次創作関連はそろそろ本格的に法的にグレーな状況から脱却する方法を考える必要がありそう。

サバクラ両方で動く JavaScript の大規模開発を行うために — Gist

JavaScript on サーバー+クライアント 時代のWebアプリケーション実装のためのMVCおよび派生デザインパターンの実例付き紹介。そして、新しいResource-View-Presenterパターンの紹介。

ユーザー操作をViewで受け取るのではなくてコントローラー(とその前段のディスパッチャー)で受け取るパターンは、MVCじゃなくてModel2(MVC)というのか。

MVPとMVVMとの違いは、Modelでのイベント(情報変更)がViewModelを通してViewまで連動するところか。MVPだとPresentor上のロジックで明示的にViewをアップデートする必要があるのね。で、MVPおよびMVVMならば、PもしくはVMが、MとVとの結び付けを処理するんで、Vがサーバーサイドの場合でもクライアントの場合でも、ここで処理して両用に書くことができそう、と。

Backbone.jsの場合。DOMからの操作はViewが直接Modelを操作するのか。Modelの変更はイベントとしてViewが直接受け取って、その結果を反映させることができるのね。URL変化の場合は、ControllerがViewとModelを用意し、ModelにURLから受け取った変化を渡すと、その内容が自動的にViewに反映される、と。

Batman.jsの場合。ModelとViewを結びつけるデータバインディングエンジンをフレームワーク側が持っているので、Modelへの操作はバインディングエンジン経由でViewに反映される。Controller(ViewModel)から直接Viewを操作せず、Modelがデータバインディングエンジン経由でViewと結びつけられてしまうのか。なんかすごく用途が限定されそうだな。

リアルタイム対応するためには、ModelとViewがリアルタイムで結びつけられる必要があるので、Model2型だとうまくいかない。

どちらにしろ、今まで紹介したパターンは、クライアント・サーバー両対応で書くのは難しい。そこでResource-View-Presenter。この説明だといまいちどうなってるのかわからない。クライアントサイドではMVPっぽく動作し、サーバーサイドではModel2 MVCっぽく動作していて、でもPresenterとResourceが永続しているから、サーバーサイドでもリアルタイムに対応できるよ、って感じ?

どうもドキュメントを読むだけだと、いろいろと腑に落ちない感じだ。これはそれぞれのフレームワークで実際にサンプルを作るか動かすかしてみないと、納得できないだろうな。

岩上安身氏「デマといったね。デマだと立証してもらおうか」「えっ?」 - Togetter

その子供の先天性の異常が放射能に関係ないと、なぜ今の段階で断言できるのか、医者なら根拠を示してもらおう。

無脳症の件、デマといったね。デマだと立証してもらおうか。私はあの後も取材を続けている。

「可能性はゼロではないからあり得ると言ったが、今のところ具体的な根拠はない。それをデマだというならデマだと言う方が、可能性がゼロであると証明して見せろ」か。「事実がはっきりしないことを言う=間違っているとも言い切れない=デマ(虚偽)ではない」ということなんだろうな。デマという言葉を使わずに、「根拠がない憶測の段階で言うな」ならOKかな。

Chromeの「シークレットウィンドウ」はWeb開発にとても使える | Stocker.jp / diary

CTRL+SHIFT+Nで履歴やCookieを共有しないウィンドウを開くことができる。

昨日レーシック受けました - 歩きつづける ゆり 咲きつづける

ひとまず初日はポジティブな感想の模様。今後に注目。

Published At2011-11-15 16:35Updated At2011-11-15 16:35

技術日記
ASP.NET MVC 3でファイルダウンロードEdit

この前、ASP.NET MVC 3でファイルダウンロードする方法として、ネイティブなResponseオブジェクト処理をすればちゃんとできたという話を書いたけど、もっと圧倒的に簡単な方法があった。

普通のコントローラのアクションメソッドの戻り値では、ViewResultを返してViewでのレンダリング結果を返しているけれども、第3回 ActionResultオブジェクトでアクション操作も自由自在 - @ITにあるとおり、ActionResultにはFilePathResultなんていう、ファイルの内容をそのまま返すActionResultも用意されていた。ってことで、

[sourcecode language="c#"]
string filename = ""; //ダウンロードしたいファイルパス
string downloadname = ""; //  ダウンロードの際に指定したいファイル名
var result = new FilePathResult(filename, "application/octet-stream"); // content-typeは適当にどうぞ
result.FileDownloadName = downloadname;
return result;
[/sourcecode]
なんてアクションメソッド内で書けば、ファイルダウンロード処理が行われる。FileDownloadNameを指定するとContent-Dispositionヘッダがつく。

ASP.NET MVC 3はVisual Studio 2010で自動的にヘルプドキュメント検索が効かないから、こういう便利な機能があちこちに隠れていそうだな。でも、フレームワークのドキュメントを全部読むのはきついからなー。ぼちぼち隙間で読もう。

Published At2011-11-15 20:06Updated At2011-11-15 20:06

テニス日記
テニス日記Edit

今日は予報が外れて強風。風速3〜4m/hが常時吹き続けている感じ。しかも寒い。ただし天気はいいのが少しは救い。

昨日に続き今日もいまいち集中できず。せめて風への対応能力を少しでも向上しようと意識してみる。

逆風側は、できるだけ食い込まれない様に、玉が浅くならないように意識してみるが、コントロールがいまいち。深くを意識しすぎてバックアウトが増えてしまったり。その割にはショートクロスやドロップショットのクオリティも低い。

一方の追い風側は、最初力加減でコントロールしていたらつまらないミスが増えたんで、しっかり低い軌道で叩くようしたら安定した。ただし、相手の球が高く弾まない時限定。高い打点で打たされると、とたんに不安定になる。追い風サイドの高い打点の処理は今後の課題。

サーブに関しては、風でトスが流されるのを計算にいれつつトスをあげ、さらにトスが流された場合は、しっかり最後まで微調整しながら打つ、というのを意識していたんだけど、その辺りに集中するとコースとか確率とかがおろそかになるな。あと、向かい風側よりも追い風側の方が、風に流された時の対応が難しい。

全体としては今日の練習も不完全燃焼気味。ただ、そろそろ寒くなって来て練習もちゃんとできる日が少なくなるから、今のうちにちゃんとやっておかないと。

Published At2011-11-16 11:13Updated At2011-11-16 11:13