<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>イントレ。</title>
    <link>http://intre.net/</link>
    <atom:link href="http://intre.net/rss2.xml" rel="self" type="application/rss+xml" />
    <description></description>
    <language>ja</language>
    <generator>Nucleus CMS v3.41</generator>
    <copyright>copyright 2009 MinagiSyu, intre.</copyright>
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://intre.net/nucleus/nucleus2.gif</url>
      <title>イントレ。</title>
      <link>http://intre.net/</link>
    </image>
    <item>
 <title>WebMatrixが本気過ぎる件。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6713.html</link>
 <guid>http://intre.net/item_6713.html</guid>
<description><![CDATA[<a href="http://www.microsoft.com/web/webmatrix/">Microsoft WebMatrix beta</a><br />
<br />
新しいWeb開発環境らしい。<br />
以前あったWebMatrixとも、ASP.NETホスティングサイトとも違う。<br />
WebPlatformInstaller3を使って、PHPとかSQLServerExpressなどとまとめてインストール出来る。<br />
<br />
で。今回は本気度がパネェっす。<br />
ASP.NETの新しい表記方法 razor に対応したIIS Express(7.5相当品？)、SQLCE4.0、<br />
・・・を統合した軽くてシンプルなIDEがWebMatrixらしい。<br />
<br />
まず目をひくのがrazor。<br />
HTMLにC#(やVB)のコードを混在出来るようになった感じ。(.cshtml/.vbhtml)<br />
@をひとつ入れるだけ(複数行は@{})というシンプルさで見通しがいい。<br />
これだけだとASP.NETやPHPと一緒に思えるけど、最大の違いはテンプレート機能が埋め込まれてること。<br />
<br />
レイアウト用ページ(旧ASP.NETでいうマスタページ)にRenderBody()が仕込んでおいて、<br />
表示用ページにレイアウト用ページを指定するだけで、展開してページを生成してくれる感じ。<br />
フォームでポストされた処理も同じページ内に記述するので、とにかく見通しがいい。<br />
<br />
DBを使う場合も、コード上から気軽にアクセスできて、WebMatrix上から気軽に作成・編集ができる。<br />
また、サイトのレポート機能があって、アクセスエラーしたページとかfavicon読めなかったよとか教えてくれる。<br />
<br />
自分はMS製ツール/フレームワークは複雑でクセが強いというイメージがあるんだけど、<br />
WebMatrixは必要な機能だけに絞られているので、迷うことなく使える感じがする。<br />
<br />
SQLCE4に関しては詳しい情報が謎なのでパス。COLLATE周り強化されてるといいけど・・・。<br />
IISExpressはコンソールから動かせるIISサーバーで、サービスベースのIISとほぼ同じコードを使っているらしい。<br />
SQLCE同様にインストール不要で再配布OKらしいので、アプリケーション用組み込みサーバーとしていいかも。<br />
<br />
そんな感じで、ASP.NET開発環境が一気にグレードアップしそうです。<br />
Razorみたいな見通しの良さはWPFにも是非欲しいなぁ。

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6713</comments>
 <pubDate>Sun, 11 Jul 2010 22:37:07 +0900</pubDate>
</item><item>
 <title>Google Reader APIの認証がまた変わった？</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6712.html</link>
 <guid>http://intre.net/item_6712.html</guid>
<description><![CDATA[Google Reader Notifierがおとなしいと思ったら、またログイン認証弾かれてました。<br />
アクセスすると401。<br />
<br />
多分認証APIの使用が変わったんだと思って、<a href="http://code.google.com/intl/ja/apis/gdata/docs/auth/overview.html#ClientLogin">ここ</a>見ながら作業したら割とすんなり解決したので、<br />
Google Reader Notifier 改 r3をリリースしておきました。<br />
<br />
ちなみに作業内容のメモ。<br />
・https://www.google.com/accounts/ClientLogin にアクセスしてSID/LSID/Authトークンを取得。<br />
・SID/LSIDのトークンをクッキーに詰めてアクセス (r2で対応した部分)<br />
・Authトークンを保存しておき、リクエスト時にHTTPヘッダに付加 (r3で対応した部分)<br />
 - Authorization: GoogleLogin auth=yourAuthToken の形式<br />
<br />
前にいじったのが1年前なので記憶違いかもしれませんが、<br />
前の対応が完全な状態ではなく、今回Google側でチェックをきつくした結果、弾かれるようになったのかも？<br />
<br />
Authトークンは前にもあったんだけど、クッキーに入れるように指示はなかったと思う。<br />
ていうか、SIDやLSIDをクッキーに入れろという指示が今回はないような・・・？<br />
とりあえずコードはそのままです。

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6712</comments>
 <pubDate>Wed, 23 Jun 2010 21:04:14 +0900</pubDate>
</item><item>
 <title>DynamicObjectを使ったINotifyPropertyChangedラッパー。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6710.html</link>
 <guid>http://intre.net/item_6710.html</guid>
<description><![CDATA[・・・というのを思いついたので実装してみた。<br />
<br />
パブリックプロパティと「プロパティ名Changed」という名前のイベントもどきを用意。<br />
こいつにINotifyPropertyChangedを実装して、プロパティへの書き込み時に呼び出してます。<br />
リフレクション経由のプロパティ操作が重いのが難点。

<pre name="code" class="csharp">
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Reflection;

namespace NotifyWrapper_Test
{
	public class NotifyWrapper : DynamicObject, INotifyPropertyChanged
	{
		object obj;
		Dictionary&lt;string, Tuple&lt;PropertyInfo, bool&gt;&gt; properties;	// &lt;name, &lt;info, has_setter&gt;&gt;
		Dictionary&lt;string, EventHandler&gt; events;					// &lt;name, delegate&gt;
		public event PropertyChangedEventHandler PropertyChanged;

		// Tのインスタンスをnew()で作成して使用
		public static NotifyWrapper Create&lt;T&gt;() where T : new() { return Create&lt;T&gt;(new T()); }

		// Tのインスタンスを指定して使用
		public static NotifyWrapper Create&lt;T&gt;(T instance) { return new NotifyWrapper(instance, typeof(T)); }

		NotifyWrapper(object instance, Type type)
		{
			obj = instance;
			properties = type.GetProperties()
				.ToDictionary(i =&gt; i.Name, i =&gt; new Tuple&lt;PropertyInfo, bool&gt;(i, i.GetSetMethod() != null));
			// プロパティ名Changed という名前のイベントを自動生成
			events = properties
				.Where(i =&gt; i.Value.Item2)
				.ToDictionary(i =&gt; i.Key + "Changed", i =&gt; new EventHandler(delegate { })); // チェック面倒なので空のデリゲートを...
		}

		public override bool TryGetMember(GetMemberBinder binder, out object result)
		{
			Tuple&lt;PropertyInfo, bool&gt; pi;
			EventHandler ev;
			result =
				properties.TryGetValue(binder.Name, out pi) ? pi.Item1.GetValue(obj, null) :
				events.TryGetValue(binder.Name, out ev) ? ev :
				null;
			return (result != null);
		}

		public override bool TrySetMember(SetMemberBinder binder, object value)
		{
			Tuple&lt;PropertyInfo, bool&gt; pi;
			if (properties.TryGetValue(binder.Name, out pi))
			{
				if (pi.Item2 == false)
					return false;
				pi.Item1.SetValue(obj, value, null);
				events[binder.Name + "Changed"](obj, EventArgs.Empty);
				if (PropertyChanged != null)
					PropertyChanged(obj, new PropertyChangedEventArgs(binder.Name));
				return true;
			}
			var ev = value as EventHandler;
			if (ev != null && events.ContainsKey(binder.Name))
			{
				events[binder.Name] = ev;
				return true;
			}
			return false;
		}

		// 必須じゃないけどとりあえず
		public override IEnumerable&lt;string&gt; GetDynamicMemberNames()
		{
			return properties.Select(i =&gt; i.Key)
				.Concat(events.Select(i =&gt; i.Key))
				.OrderBy(i =&gt; i);
		}

	}

	class Foo
	{
		public string Name { get; set; }
		public Foo()
		{
			Name = "Hoge";
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			dynamic item = NotifyWrapper.Create&lt;Foo&gt;();

			// メンバー名を取得してみる
			Console.WriteLine("DynamicMembers:");
			((NotifyWrapper)item).GetDynamicMemberNames().Run(Console.WriteLine);

			// イベント設定
			((INotifyPropertyChanged)item).PropertyChanged += (_,e) =&gt; Console.WriteLine("PropertyChanged: {0}", e.PropertyName);
			var name_changed = new EventHandler((_, __) =&gt; Console.WriteLine("Name Changed"));
			item.NameChanged += name_changed;

			// 読み書きテスト
			Console.WriteLine(item.Name);	// Hogeのはず
			item.Name = "Foo";				// イベントが発動するはず
			Console.WriteLine(item.Name);	// Fooのはず

			// イベント解除してテスト
			item.NameChanged -= name_changed;
			item.Name = "ほえー";
		}

	}
}
</pre>]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6710</comments>
 <pubDate>Mon, 31 May 2010 03:20:24 +0900</pubDate>
</item><item>
 <title>タブが非アクティブな時にページを書き換えるフィッシング攻撃。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6709.html</link>
 <guid>http://intre.net/item_6709.html</guid>
<description><![CDATA[<a href="http://slashdot.jp/security/article.pl?sid=10/05/28/0159205">ブラウザのタブごと書き換えてしまうフィッシング手法「Tabnabbing」</a><br />
スラッシュドットから。<br />
<br />
この攻撃は実際に<a href="http://www.azarask.in/blog/post/a-new-type-of-phishing-attack/">ここ</a>のページで試してみることが出来ます。<br />
<br />
ページを開いたら別のタブでページを開いて5秒ぐらい待ちましょう。<br />
ページアイコンとタイトル、中身がGMailっぽくなります。変動しないのはURLだけです。<br />
ちなみに、画面クリックでもとに戻ります。<br />
<br />
確かに、この状態でセッションが切れたとか、<br />
確認のために再ログインしてくださいとか書いてあるとIDやパスワードを入れそうです。<br />
<br />
これにCCSを使ったサイト訪問履歴を取得出来る攻撃(？)を併用すると、<br />
自分が使ったことがあるサイトのログイン画面を出すことができます。<br />
(これは訪問済みリンクの色が変わるのを利用して検出する方法ですね)<br />
<br />
やっぱり、「ログイン時はURLをちゃんと確認する」が大事ですね。<br />
CardSpaceみたいな、一元管理出来るログインシステムがもう本当に必要な気がするなぁ。

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6709</comments>
 <pubDate>Fri, 28 May 2010 23:24:26 +0900</pubDate>
</item><item>
 <title>Mercurialのsubrepo。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6708.html</link>
 <guid>http://intre.net/item_6708.html</guid>
<description><![CDATA[リポジトリ内のリポジトリ。<br />
Subversionのexternalみたいな感じらしい。<br />
要は入れ子になったリポジトリを管理できるってことかな？<br />
<br />
早速実験。<br />
<br />
TortoiseHg 1.0.3でリポジトリを2つ作成。<br />
アプリのリポジトリの下にライブラリのリポジトリをおいてみる。<br />
<br />
[HogeApp]<br />
+ [.hg]<br />
+ [FooLibrary]<br />
　　+ [.hg]<br />
<br />
この状態で、アプリ側のリポジトリを操作しようとしても、<br />
ライブラリ側のリポジトリを無視するため何も見えません。<br />
<br />
この状態で、アプリ側のリポジトリに.hgsubファイルを追加します。<br />
<br />
[HogeApp]<br />
+ [.hg]<br />
+ .hgsub<br />
+ [FooLibrary]<br />
　　+ [.hg]<br />
<br />
.hgsubファイルの中身は「ローカルパス = ソースパス」って感じ。<br />
FooLibrary = FooLibrary<br />
<br />
こんな感じの、孫フォルダとURLの組み合わせも出来るみたいです。<br />
Lib/FooLibrary = http://hogehoge<br />
<br />
.hgsubファイルはコマンドプロンプトを使って、<br />
「echo hoge > .hgsub」みたいな感じでやると作りやすいです。<br />
適当に作ってメモ帳で編集するのが簡単ですね。<br />
<br />
<br />
で、アプリ用リポジトリに.hgsubファイルを追加するとライブラリ用リポジトリが見えるようになります。<br />
それをコミットすると、.hgsubstateファイルが出来ます。<br />
中身はライブラリ用リポジトリのリビジョンIDみたいですね。<br />
<br />
この状態で、アプリ用リポジトリをCloneするとライブラリ用リポジトリもCloneされるようになります。<br />
<br />
最近、ソースコードのみリリースのライブラリとか多いから一緒に管理できるのは良いねぇ。<br />


]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6708</comments>
 <pubDate>Mon, 24 May 2010 02:41:33 +0900</pubDate>
</item><item>
 <title>並列化の罠？</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6707.html</link>
 <guid>http://intre.net/item_6707.html</guid>
<description><![CDATA[こんな感じのコードを書いてました。<br />
<br />
var items = GetItems();<br />
ProcessItems(items);<br />
...<br />
<br />
private void ProcessItems(IEnumerable<object> items)<br />
{<br />
　　Task.Factory.StartNew(()=><br />
　　{<br />
　　　　var array = items.Where(...).Select(...).ToArray();<br />
　　　　... arrayをいろいろいじる ...<br />
　　});<br />
}<br />
<br />
で、ProcessItemsでitemsにアクセスした瞬間にメソッドが終了します。<br />
例外は吐き出されません。<br />
VSでデバッグすると、itemsの値が表示できません。<br />
<br />
ガベージコレクトでもされたんでしょうか？<br />
Task使って並列処理をしてるせいもあるんでしょうが、原因が不明・・・。再現性も低いし。<br />
とりあえず、GetItems().ToArray()としてお茶を濁してみたけど、こういうのって厄介なバグになりそうだなぁ。<br />


]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6707</comments>
 <pubDate>Sun, 23 May 2010 01:18:57 +0900</pubDate>
</item><item>
 <title>VS2010日本語版。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6706.html</link>
 <guid>http://intre.net/item_6706.html</guid>
<description><![CDATA[21日→27日→28日とノビノビになったけど、ようやくリリースしたみたいです。<br />
Express Editionは<a href="http://www.microsoft.com/express/Downloads/">Microsoft /Express</a>からダウンロードできますね。<br />
<br />
英語版使ってきたせいか、メニューの「ファイル(F)」とかの(F)がとても邪魔に感じるｗ<br />


]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6706</comments>
 <pubDate>Wed, 28 Apr 2010 20:17:40 +0900</pubDate>
</item><item>
 <title>Full-row Selection TreeView。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6705.html</link>
 <guid>http://intre.net/item_6705.html</guid>
<description><![CDATA[以前チャレンジ失敗して放置してたんだけど、ズバリな回答案があった。<br />
<br />
<a href="http://stackoverflow.com/questions/664632/highlight-whole-treeviewitem-line-in-wpf">Highlight whole TreeViewItem line in WPF</a><br />
<br />
Borderの中にGridを配置してGrid.Marginを調整することで子要素を段落下げしている。<br />
TreeViewItemの親を辿ることで階層の深さを取得、Grid.Marginにコンバータ経由で渡している。<br />
<br />
こんなシンプルな解決案があったなんて。・・・無念。<br />
<br />
＜追記＞<br />
・・・って思ったんだけど、DataTemplateと組み合わせると問題発生。<br />
コンバータ経由で階層の深さを取得する際のタイミングの問題で、<br />
TreeViewItem.Itemsに追加→スタイル設定となって欲しいんだけど逆になるっぽい。<br />
<br />
TreeViewItem.Parentが変化したら再計算して適用すればいいのですが、<br />
それを検知する方法がない・・・。<br />
困った。<br />
＜/追記＞<br />
<br />
<br />
<br />
そして、日記を更新する癖が完全に抜けてる件。

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6705</comments>
 <pubDate>Thu, 22 Apr 2010 02:50:18 +0900</pubDate>
</item><item>
 <title>VS2010 Launch.</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6704.html</link>
 <guid>http://intre.net/item_6704.html</guid>
<description><![CDATA[<a href="http://www.microsoft.com/visualstudio/en-us">Microsoft Visual Studio 2010</a><br />
<a href="http://www.microsoft.com/express/downloads/">Microsoft /Express</a><br />
<br />
リリースきました。<br />
Express Editionもダウンロードが可能です。<br />
・・・ただし英語版のみみたいですが。<br />
<br />
日本語版はいつになるのかな～♪

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6704</comments>
 <pubDate>Tue, 13 Apr 2010 02:12:54 +0900</pubDate>
</item><item>
 <title>Directなんとか。</title>
 <author>魅椥 愁</author>
 <link>http://intre.net/item_6703.html</link>
 <guid>http://intre.net/item_6703.html</guid>
<description><![CDATA[自分の中でDirectXは9で止まっているのですが、最新はもう11ですよ。<br />
VistaにはDXGI対応のD3D9ExとD3D10、D3D10.1、そして、Vista SP2とWin7にはDirect3D11。<br />
さらにD3D10.1上で動くDirect2DとDirectWrite。・・・色々進みすぎです。<br />
<br />
ということで、SlimDX経由で遊びながら得た適当メモ。<br />
<br />
・Direct3D9Ex<br />
D3D9のDXGI対応版。<br />
リソース周りはDXGIが管理するためPool.Managedを指定すると怒られる。<br />
<br />
・DXGI<br />
D3D10以降はデバイスとリソースが明確に分離された。<br />
DXGIはリソース(GPUメモリ)周りを管理してて、サーフェイスやスワップチェインもこっちの管轄。<br />
この仕組のおかげで、別々のDirect3D間でサーフェイスの共有が可能になっている。<br />
(D3D10で作成したサーフェイスをD3D9Exで開いて操作出来る…等)<br />
<br />
・Direct3D10<br />
DXGIを意識して内部構成が大きく変化しているため、D3D9とはまるっきり性格が違う。<br />
初期化はデバイスとスワップチェインを別々に行い、Presentはスワップチェインから行う。<br />
リソース仮想化の概念もあって、頂点バッファやインデックスバッファ、テクスチャ等も全て汎用バッファとして扱う。<br />
サーフェイスも汎用バッファ扱いなので、レンダーターゲットを指定するにもRenderTargetViewを経由して操作する・・・等。<br />
固定機能が無いのでシェーダーの使用必須、D3D10対応ハードウェア必須。<br />
<br />
・Direct3D10.1<br />
Vista SP1以降で対応。<br />
機能レベルの指定が出来たので、D3D9ハードウェアでも動かせるようになった。<br />
WARPというリファレンスラスタライザよりは速いソフトウェアラスタライザが付属するため、<br />
ハードウェアが対応していない部分はWARPでエミュレーションとかが可能に。<br />
<br />
・Direct2D&DirectWrite<br />
GDI+のD3D10.1実装とも言えるようなもの。<br />
D3D10.1サーフェイスからRenderTargetを作成して、それに2D描画する。<br />
GDI+でやれるような描画はだいたいやれる。<br />
<br />
・Direct3D11<br />
デバイスからコンテキストが分離。<br />
スプライトなどが用意されなくなった。<br />
調査中。<br />
<br />
<br />
後半息切れ気味・・・。<br />
とりあえず、いっぱい変わったってことがわかった。(汗)

]]></description>
 <category>日記</category>
<comments>http://intre.net/?itemid=6703</comments>
 <pubDate>Sun, 4 Apr 2010 23:00:26 +0900</pubDate>
</item>
  </channel>
</rss>