今日もまたよく降る雪だ。
積った雪を毎日のように掻き出し、押し退け、捨てる。
この繰り返し。
でも次の日にはまた同じかそれ以上に積る。
元の木阿弥。
エンドレス。
なるほど、辛抱強い県民性を生むのも無理はない。
こんなにも自分のやったことが無意味に感じられるのはなかなか無い。
しかも、雪の相手をすると体力を相当に消耗する。
体力がなければ気力も湧いてこない。
雪は心を削る。
とか、テキトーに書き散らかしてみた。
今日もまたよく降る雪だ。
積った雪を毎日のように掻き出し、押し退け、捨てる。
この繰り返し。
でも次の日にはまた同じかそれ以上に積る。
元の木阿弥。
エンドレス。
なるほど、辛抱強い県民性を生むのも無理はない。
こんなにも自分のやったことが無意味に感じられるのはなかなか無い。
しかも、雪の相手をすると体力を相当に消耗する。
体力がなければ気力も湧いてこない。
雪は心を削る。
とか、テキトーに書き散らかしてみた。
ASP.NET Webフォームアプリケーションを作成する際、楽観的排他制御を行うのが一般的です。
このとき、排他エラーを検知した際の処理を集約例外ハンドラーに任せてしまえば楽ですが、実際は「業務エラー」扱いとして再実行させたいケースもままあると思います。
そんな時に使える拡張メソッドを作ってみました。
この例ではEFの排他チェック例外をキャッチし、排他チェックエラーが発生した旨をCustomValidatorを追加することで、ValidationSummaryに表示します。
もちろん、プロジェクト共通の既定Webフォーム等を用意して、エラー領域に表示してもいいでしょう。
(主題とは外れますが、排他チェック例外って使用するデータアクセステクノロジーごとに違う例外になっちゃうから、ビジネスロジック層あたりで独自例外にWrapしてやるのが良さそうですね。)
使い方はこんな感じです。
var logic = new MyItemLogic();
logic.Update(item);
});
}
引数なしのラムダ式で排他チェック例外が発生する処理を記載してやります。
色々な画面ですべてのコマンドボタンのイベントハンドラーにtry-catchを書くなんてのはナンセンスなので、こういった方法で共通化してみてはどうでしょうか。
また、自分はこうやってるとかあればぜひ教えてください。
もはやVSSは古き良き時代の遺物ですが、参加するプロジェクトによっては、未だにVSSを使用しなければならない時もあります。
そんな時は、作業コピーのフォルダにGitのリポジトリ―を作っちゃいましょう。そして、トピックブランチ作成→git commit * n→git rebase –i でまとめちゃって、VSSにチェックインってやれば、ストレスが少なく作業ができますね!
ただ、この時VSS用のファイルは世代管理したくないですよね。
そんなあなたは/.git/info/excludeファイルを編集し、次のようにしましょう。VSプロジェクト、VSS関連ファイルが、Git管理対象外になります。
#このファイルはGistにもあげてあります→exclude file in VSS working folder — Gist
Entity FrameworkのEntity Data Modelにはナビゲーション プロパティというものがあり、データベース上で外部キー制約がついていた場合、その外部キーに紐づくデータを取得できます。
通常、ナビゲーション プロパティはそのプロパティにアクセスされた際に初めてデータアクセスが発生します。(なお、これをLazy Loadといいます。)
しかし、必ずナビゲーション プロパティにアクセスすることが分かっている場合、一緒に読み込みを済ませておきたいケースもあります。(なお、これをEager Loadといいます。)
そんなときに使用するのが、Includeメソッドです。
クエリの結果に含める関連オブジェクトを指定します。
しかし、Includeメソッドの引数は文字列で、タイプミスなどをすぐには検出できません。よく訓練されたC#erとしては、型安全に指定したいですよね?
というわけで、拡張メソッドとして作ってみました。
var entityName = memberExp.Member.Name;
return query.Include(entityName);
}
使い方はシンプルで、次のようにラムダ式で指定します。
本来は、引数に本当にナビゲーション プロパティを指定されているかどうかをチェックしたりも必要だと思いますが、とりあえずプロトタイプということで。
#Expressionからプロパティ名を取得する方法は、こちらの記事を参考にさせていただきました。
#元ネタはこちら→Entity Framework and ASP.NET – Getting Started Part 1: The Official Microsoft ASP.NET Site
例えば、以下のようなPersonとProjectの多対多の関係を表すために、PersonProjectという連関エンティティがあるとします。
この情報を元にEDMを生成すると、PersonProjectはアソシエーションとして定義されます。
EFってうまくできているんだなぁと思ったのでメモ。
MSDNライブラリにも明記されています。
テキスト ボックスが表示されるとき、このプロパティの内容は HTML エンコードされます。 たとえば、このプロパティを "<b>Test</b>" に設定した場合、太字の "Test" ではなく "<b>Test</b>" がブラウザーに表示されます。
Text プロパティには HTML を含めることができます。 そうである場合、HTML は未変更でブラウザーに渡されますが、ブラウザーでテキストではなくマークアップとして解釈されることがあります。 ブラウザーで HTML マークアップをプレーン テキストとして表示する場合は、クラス概要の例で示すように HtmlEncode メソッドを使用できます。
データバインド式を書くときなど、Label.TextプロパティはHttpUtility.HtmlEncodeメソッドを入れるのを忘れないようにしましょう。
なお、TextBox.Textでも同じように書くと、HTMLエンコードが2回行われてしまいますのでご注意を。
でも、TextBoxとLabelで統一した書き方ができないのはちょっと気持ちが悪いですね・・・
Zipメソッドを使うともっと簡単でした。
namespace ConsoleApplication1
{
public static class EnumerableEx
{
public static IEnumerable<TResult> MapBetween<TValue, TResult>(this IEnumerable<TValue> source, Func<TValue, TValue, TResult> f)
{
return source
.Zip(
source.Skip(1),
(x, y) => new { OldValue = x, NewValue = y })
.Select(x => f(x.OldValue, x.NewValue));
}
}
public class Program
{
public static void Main(string[] args)
{
var q = new[] { 1, 2, 3, 4, 5 }.MapBetween((a, b) => a + b);
foreach (var n in q)
{
Console.WriteLine(n);
}
}
}
}
パク・・・参考にしたのは、MVP for Linqことneueccさんの以下のエントリ。
neue cc – Reactive Extensionsで前後の値を利用する
流石・・・流石すぎる!
#またしてもGistに上げました。
404 Blog Not Found:algorithm – mapBetween – 配列の隣接する2項にそれぞれ演算を施した配列
配列の隣接する2項にそれぞれ演算を施した配列を得たい。つまり、
f (+) [1,2,3,4,5] = [3,5,7,9]のような f が欲しい。
C#でもやってみましょう。
namespace ConsoleApplication1
{
public static class EnumerableEx
{
public static IEnumerable<TResult> MapBetween<TValue, TResult>(this IEnumerable<TValue> source, Func<TValue, TValue, TResult> f)
{
return from a in source.Select((x, i) => new { X = x, Index = i })
join b in source.Skip(1).Select((x, i) => new { X = x, Index = i }) on a.Index equals b.Index
select f(a.X, b.X);
}
}
public class Program
{
static void Main(string[] args)
{
var q = new[] { 1, 2, 3, 4, 5 }.MapBetween((a, b) => a + b);
foreach (var n in q)
{
Console.WriteLine(n);
}
}
}
}
やってることは、
だけです。
もちろん拡張メソッドにして使いまわしましょうね。
Enjoy!
#ソースはGistにもあげました。
WordPress.comにWindows Live Writerから投稿すると、「記事のURLが日本語になっちゃって嫌だなー」って思ってたんですが、任意のパーマリンクURLをつけられることが分かったのでメモ。
記事のプロパティの「スラッグ」を設定するだけでした。
ね?記事のURLがhttps://takanosho.wordpress.com/2012/01/04/live-writer-permalink-setting/になったでしょ?
#恥ずかしながら、今更気づきました・・・
第24回勉強会(2012/01/29) – 長岡 開発者 勉強会(NDS)
「○○つくってミタ〜視聴率40%めざせ」縛りで
※縛りとは、最近のNDS勉強会ではなにかテーマを決めないと、発表がバラバラすぎて無法状態になるので、ある程度のテーマを決めて発表をお願いしております。
そのテーマとして今回は「○○つくってみた」という条件を設定しました。例えば、「Webサービス作ってみた」「ハードウェア作ってみた」「ホームページつくってみた」など
なんでも「作ってみた」というテーマで発表することを、ひとつの基準としています。ただしこれは、目安なので、縛りに拘ずにノンジャンルでもOKです。
日時
2012/01/29(日) 13:00~18:00 (開場12:30ぐらい)
場所
長岡市 まちなかキャンパス 5F 501会議室
中央公民館ではありません!
参加料金
無料
内容
現在予定されているセッションです。(時間の都合や、初スピーカー優先の原則により変更する可能性があります)
スピーカー募集中!
参加者・発表者の方々へ注意事項
- 紙の配布資料は、スピーカーが人数分印刷する 必要はありません。
- たとえば、PC持ち込んで配布資料をPCで閲覧する人。資料を全部印刷して紙を持ち込む人。
- 勉強会は、発表者の方の好意で成り立っています。できるかぎり皆で協力し合いましょう。
- 時間どおりスムーズに進行できるよう、開始時間を確かめて余 裕をもって集合してください。
- コンセント等は少なめです。コンセントは床下埋め込みのため延長ケーブルなどの利用をオススメします。
- パソコンを使う場合、自分の分のマルチタップ・延長ケーブルなどを用意してください。
懇親会
勉強会の終了後に懇親会を実施します。人数が多くなければ、予約を取らずにブラブラと適当なお店に飛び込んで適当に注文します。懇親会のみの参加もOKです。
参加申し込み
初参加でも、遠慮なく申し込んで下さい。(毎回、どなたか初参加の方がいらっしゃいますので、常連ばかりで入りづらいということはないはずです)
Twitterハッシュタグ
ustream(予定)
http://www.ustream.tv/channel/nds-online
※ちゃんと配信できるかは分かりません。あまりあてにしないでください。
今回はWebサービス、アプリ、Webサイトなどなど、何かしら作ったものについてのセッションとなりそうです。私は今のところ発表の予定はありませんf(^^;
が、おそらく興味をそそる発表がそろうと思いますので、みなさま奮ってご参加ください。