<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7370796000776920436</id><updated>2011-11-28T08:40:14.833+09:00</updated><category term='C++'/><category term='C#'/><category term='Unix'/><category term='Win64'/><category term='RO'/><category term='dojo'/><category term='CSS'/><category term='VisualStudio'/><category term='Linux'/><category term='C'/><category term='html'/><category term='Win32'/><category term='assembler'/><category term='Apache'/><category term='Regexp'/><category term='JavaScript'/><category term='.NET'/><title type='text'>佐祐理ブログ</title><subtitle type='html'>.NETとWin32ネタが主です。UNIXもいじるのでその辺りも混じるかも。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-5973786201485888542</id><published>2011-07-13T20:23:00.000+09:00</published><updated>2011-07-13T20:23:51.298+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>IStructuralEquatableの使い方</title><content type='html'>IStructuralEquatableについて今までいまいちわからずにいました。ググって出てきたページを読んでいたら使い方が微妙で違和感を覚えたためじっくり調べてみました。そうしたらもうちょっと使いやすいものだということがわかりました。&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.collections.structuralcomparisons.structuralequalitycomparer.aspx"&gt;StructuralComparisons.StructuralEqualityComparer&lt;/a&gt;はオブジェクトそのものではなく、その要素を比較するIEqualityComparerを提供します。これを使ってIEqualityComparer&amp;lt;T&amp;gt;の実装例を書いてみました。&lt;blockquote class="code"&gt;public class StructuralEqualityComparer&amp;lt;T&amp;gt; : IEqualityComparer&amp;lt;T&amp;gt; where T: IStructuralEquatable {  public bool Equals(T x, T y) {    return StructuralComparisons.StructuralEqualityComparer.Equals(x, y);  }  public int GetHashCode(T obj) {    return StructuralComparisons.StructuralEqualityComparer.GetHashCode(obj);  }}&lt;/blockquote&gt;こう書いてしまえばどう使うのかわかりやすいでしょうか。このサンプルそのものは new StructuralEqualityComparer&amp;lt;int[]&amp;gt;() のように使えます。&lt;br /&gt;なんでこんなクラスをわざわざ作るのかというと、LINQで要求される比較演算子はどれもIEqualityComparerでなくIEqualityComparer&amp;lt;T&amp;gt;だからです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-5973786201485888542?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/5973786201485888542/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=5973786201485888542' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5973786201485888542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5973786201485888542'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2011/07/istructuralequatable.html' title='IStructuralEquatableの使い方'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8439644532133718550</id><published>2011-02-01T20:02:00.000+09:00</published><updated>2011-02-01T20:02:14.882+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>TransactionScope classの使い方</title><content type='html'>.NET Frameworkでtransactionを扱うには&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.transactions.transactionscope.aspx"&gt;TransactionScope class&lt;/a&gt;を使いますが、嵌りやすいのでメモっておきます。&lt;br&gt;&lt;br&gt;class説明にはisolation levelについて記載されていませんが、デフォルトではSerializableになっています。例えばSQL ServerのデフォルトはReadCommittedなので勘違いしてしまいそうです。では、isolation levelを指定しようとすると、constructorにもpropertyにもそれらしいものがありません。実はpublic TransactionScope( TransactionScopeOption scopeOption, TransactionOptions transactionOptions )のTransactionOption classで指定することになります。しかし今度は余計なparameterまで渡す必要があります。&lt;ul&gt;&lt;li&gt;TransactionScopeOption…これはRequiredがデフォルトです。&lt;/li&gt;&lt;li&gt;TransactionOptionsのIsolationLevel…これは指定したかったReadCommittedにします。&lt;/li&gt;&lt;li&gt;TransactionOptionsのTimeout…これは指定しないと初期化されず0になってしまい、timeoutなしになってしまいます。デフォルトの値にするためにはTransactionManager.DefaultTimeoutを指定します。&lt;/li&gt;&lt;/ul&gt;結局、&lt;blockquote class="code"&gt;using( var transaction = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions{  IsolationLevel = IsolationLevel.ReadCommitted,  Timeout = TransactionManager.DefaultTimeout,} ) ){  ...;  transaction.Complete();}&lt;/blockquote&gt;とやることになるでしょう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8439644532133718550?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8439644532133718550/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8439644532133718550' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8439644532133718550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8439644532133718550'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2011/02/transactionscope-class.html' title='TransactionScope classの使い方'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-16718104574190186</id><published>2010-12-29T10:57:00.002+09:00</published><updated>2010-12-29T11:00:07.222+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>IsDuplicated拡張メソッド</title><content type='html'>気が向いたので何となく書いてみました。&lt;blockquote class="code"&gt;public static class Enumerable {  public bool IsDuplicated&amp;lt;TSource&amp;gt;( this IEnumerable&amp;lt;TSource&amp;gt; source ) {    var keys = new HashSet&amp;lt;TSource&amp;gt;();    return !source.All( keys.Add );  }  public bool IsDuplicated&amp;lt;TSource, TKey&amp;gt;( this IEnumerable&amp;lt;TSource&amp;gt; source, Func&amp;lt;TSource, TKey&amp;gt; keySelector ) {    var keys = new HashSet&amp;lt;TKey&amp;gt;();    return !source.Select( keySelector ).All( keys.Add );  }}&lt;/blockquote&gt;IsDuplicated() つまり重複があるかどうかを判断する拡張メソッドです。&lt;br /&gt;巷にはDistinct()を使ったりして項目数を数えている方法もありますが、数えるということはIEnumerableを最後まで確認する必要があります。&lt;br /&gt;&lt;br /&gt;しかし、重複があるかどうか知りたいだけ、同じものが１ヶ所でもダブっていればそれが知りたい、そんなときに最後まで確認するのは無駄です。IsUnique()でなくIsDuplicated()というメソッド名にしたのもそのためです。どうせダブってるんでしょ？ ダブってるなら早く教えてよ、と。&lt;br /&gt;&lt;br /&gt;仕組みは簡単。&lt;a href="http://msdn.microsoft.com/ja-jp/library/bb359438.aspx"&gt;HashSet&lt;/a&gt;を使います。&lt;a href="http://msdn.microsoft.com/ja-jp/library/bb353005.aspx"&gt;HashSet.Add()メソッド&lt;/a&gt;は戻り値として重複の有無を教えてくれるのでそれを使います。&lt;br /&gt;更に&lt;a href="http://msdn.microsoft.com/ja-jp/library/bb548541.aspx"&gt;All()拡張メソッド&lt;/a&gt;は１つでもfalseを見つけると即座に中断して返ってきます。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-16718104574190186?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/16718104574190186/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=16718104574190186' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/16718104574190186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/16718104574190186'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2010/12/isduplicated.html' title='IsDuplicated拡張メソッド'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3971753831382520029</id><published>2010-02-14T18:14:00.003+09:00</published><updated>2010-02-14T18:19:40.235+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Dojo基礎文法最速マスター ～CSS編～</title><content type='html'>Dojoにはテーマがあります。&lt;blockquote class="code"&gt;&amp;lt;style type="text/css"&amp;gt;  @import "http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/resources/dojo.css";  @import "http://ajax.googleapis.com/ajax/libs/dojo/1.4/dijit/themes/soria/soria.css";  @import "http://ajax.googleapis.com/ajax/libs/dojo/1.4/dijit/themes/nihilo/nihilo.css";  @import "http://ajax.googleapis.com/ajax/libs/dojo/1.4/dijit/themes/tundra/tundra.css";&amp;lt;/style&amp;gt;&lt;/blockquote&gt;最初の１つはいわゆるリセットCSS。残りの３つがテーマ。読み込んだだけでは適用されません。テーマを適用したい範囲にclass="テーマ名"の属性を付けます。全体に適用したいなら、&lt;blockquote class="code"&gt;&amp;lt;body class="soria"&amp;gt;&lt;/blockquote&gt;こんな感じで&amp;lt;body&amp;gt;タグに設定します。&lt;hr /&gt;Dojoは読み込まれると&amp;lt;html&amp;gt;タグに次のクラスを設定します。&lt;ul&gt;&lt;li&gt;dj_ie / dj_ie6 / dj_ie7 / dj_ie8 / dj_iequirks&lt;/li&gt;&lt;li&gt;dj_gecko / dj_ff2 / dj_ff3&lt;/li&gt;&lt;li&gt;dj_khtml / dj_safari / dj_chrome&lt;/li&gt;&lt;li&gt;dj_opera&lt;/li&gt;&lt;li&gt;dj_contentBox / dj_borderBox&lt;/li&gt;&lt;/ul&gt;このため、ブラウザごとに挙動が違う場合もCSSで簡単に解決できます。たとえば、IEだけ異なる挙動をする場合、&lt;blockquote class="code"&gt;&amp;lt;style type="text/css"&amp;gt;/* ブラウザ共通 */.someClass {  ...;}/* IEのみ異なる部分を上書き */.dj_ie .someClass {  ...;}&amp;lt;/style&amp;gt;&lt;/blockquote&gt;こうすると、CSSの優先順位により!importantしなくてもIEでのみ上書きされます。CSSだけで解決できるので、JavaScriptで書き換えとかしなくて済みます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3971753831382520029?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3971753831382520029/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3971753831382520029' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3971753831382520029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3971753831382520029'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2010/02/dojo-css.html' title='Dojo基礎文法最速マスター ～CSS編～'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6894834364783362410</id><published>2010-02-14T18:13:00.004+09:00</published><updated>2010-02-14T18:20:17.604+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Dojo基礎文法最速マスター ～HTML編～</title><content type='html'>Dojoにはdojo.parserという機能があり、これがhtmlを編集してくれます。ページ読み込み時にdojo.parserを動作させるには&lt;blockquote class="code"&gt;&amp;lt;script  type="text/javascript"  src="http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/dojo.xd.js"  &lt;b&gt;djconfig="parseOnLoad: true"&lt;/b&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/blockquote&gt;と読み込み時に設定するだけ。&lt;br /&gt;&lt;br /&gt;dojo.parserはdojotype属性に反応します。&lt;blockquote class="code"&gt;&amp;lt;input  dojotype="dijit.form.TextBox"  jsid="textbox1"  type="text"  name="textbox"  value="てきすと" /&amp;gt;&lt;/blockquote&gt;これで、このtextboxにはdojoの追加機能が付与されます。dojoにはこのinputに対応するJavaScriptオブジェクトがあるわけですがjsid="textbox1"と指定されていた場合、JavaScriptのtextbox1という変数に割り当てられます。&lt;br /&gt;よくdocument.getElementById()で毎回検索しているコードを見かけますが、変数に割り当てられているので必要な時はいつでも簡単にアクセスできます。&lt;br /&gt;&lt;br /&gt;dojo.parserは入れ子にも対応していて&lt;blockquote class="code"&gt;&amp;lt;form dojotype="dijit.form.Form" jsid="form1"&amp;gt;&amp;lt;input dojotype="dijit.form.TextBox" type="text" name="textbox1" value="てきすと１" /&amp;gt;&amp;lt;input dojotype="dijit.form.TextBox" type="text" name="textbox2" value="てきすと２" /&amp;gt;&amp;lt;/form&amp;gt;&lt;/blockquote&gt;今度はformを拡張してJavaScript変数のform1に割り当てています。&lt;br /&gt;どんな機能があるかというと、form1.attr('value')とやると{textbox1:"てきすと１",textbox2:"てきすと２"}が返ってきたり。逆にform1.attr('value', {textbox1:"ほえほえ",textbox2:"はにゃ～ん"})と値を初期化できたり。&lt;br /&gt;&lt;br /&gt;クラスはたくさんあって、それぞれ機能が違うのでそこは調べてください☆&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6894834364783362410?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6894834364783362410/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6894834364783362410' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6894834364783362410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6894834364783362410'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2010/02/dojo-html.html' title='Dojo基礎文法最速マスター ～HTML編～'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3546194919933498865</id><published>2010-02-14T18:12:00.003+09:00</published><updated>2010-02-14T18:21:12.838+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Dojo基礎文法最速マスター ～JavaScript編～</title><content type='html'>何はともあれまずは読み込み。&lt;a href="http://code.google.com/intl/ja/apis/ajaxlibs/documentation/index.html#dojo"&gt;Google AJAX Libraries API&lt;/a&gt;ならダウンロード＆インストール不要。&lt;blockquote class="code"&gt;&amp;lt;script  type="text/javascript"  src="http://ajax.googleapis.com/ajax/libs/dojo/1.4/dojo/dojo.xd.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/blockquote&gt;以降はJavaScriptの説明になるので、&amp;lt;script type="text/javascript"&amp;gt;～&amp;lt;/script&amp;gt;内に書きます。&lt;br /&gt;Dojoは細かくモジュール分けされているので、必要なモジュールは読み込む必要があります。&lt;blockquote class="code"&gt;dojo.require("dijit.form.Button");&lt;/blockquote&gt;などなど。JavaScriptとhtml読み込み完了後に処理をするにはdojo.addOnLoad()を使います。&lt;blockquote class="code"&gt;dojo.addOnLoad(function(){  ...; // やりたいこと});&lt;/blockquote&gt;JavaScriptについてはほとんど説明することはありません。&lt;br /&gt;というのもこれに続くHTML編とCSS編の説明が必要になるからです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3546194919933498865?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3546194919933498865/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3546194919933498865' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3546194919933498865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3546194919933498865'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2010/02/dojo-javascript.html' title='Dojo基礎文法最速マスター ～JavaScript編～'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-5186438311148424972</id><published>2009-12-28T00:46:00.002+09:00</published><updated>2009-12-28T00:47:46.518+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win64'/><title type='text'>Hyper-V with PowerShell</title><content type='html'>Hyper-V Serverを導入しました。これは機能制限されたWindows Server 2008 Server Coreみたいなものです。Server Coreと同じくローカルではコマンドプロンプトでの管理しかありません。基本的にはfirewallを必要な分解放して、リモートから管理するわけですが、ここはあえてひねくれて、Hyper-V Server単独でどこまでできるかを試してみました。デフォルトでは有効になっていませんが、&lt;blockquote class="code"&gt;dism /online /enable-feature /featurename:NetFx2-ServerCore /featurename:MicrosoftWindowsPowerShell&lt;/blockquote&gt;とすることでPowerShellが有効になります。さてこのPowerShell + WMIを使ってHyper-Vは管理できます。気合いで書いてみました。&lt;blockquote class="code"&gt;# Switch作成$vsm = gwmi -namespace root\virtualization Msvm_VirtualSwitchManagementService$vs = [wmi]$vsm.CreateSwitch("ExternalNetwork", "ExternalNetwork", 4096).CreatedVirtualSwitch$esp = [wmi]$vsm.CreateSwitchPort($vs, "ExternalNetwork_ExternalPort", "ExternalNetwork_ExternalPort").CreatedSwitchPort$isp = [wmi]$vsm.CreateSwitchPort($vs, "ExternalNetwork_InternalPort", "ExternalNetwork_InternalPort").CreatedSwitchPort$eep = gwmi -namespace root\virtualization Msvm_ExternalEthernetPort  #NICが複数ある場合は注意$vsm.SetupSwitch($esp, $isp, $eep, "ExternalNetwork", "ExternalNetwork")# VM作成、CPU、Memoryまで $vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService$gsd = (([wmiclass]"root\virtualization:Msvm_CirtualSystemGlobalSettingData").CreateInstance()$gsd .ElementName = "web"$vm = $vsm.DefineVirtualSystem($gsd.GetText([Management.TextFormat]::WmiDtd20)).DefinedSystem$sd = $vm.getRelated("Msvm_VirtualSystemSettingData") | select -first 1$psd = $sd.getRelated("Msvm_ProcessorSettingData")$psd.VirtualQuantity = 2$msd = $sd.getRelated("Msvm_MemorySettingData")$msd.Limit = $msd.Reservation = $msd.VirtualQuantity = 1024$vsm.ModifyVirtualSystemResources($vm, (@($psd, $msd) |% {$_.GetText([Management.TextFormat]::WmiDtd20)}))# NIC追加$vsm = gwmi -namespace root\virtualization Msvm_VirtualSwitchManagementService$guid = [Guid]::NewGuid().ToString()$sp = $vsm.CreateSwitchPort($vs, $guid, $guid).CreatedSwitchPort$ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=10 and ResourceSubType='Microsoft Synthetic Ethernet Port'").__Path.Replace('\', '\\') # 10=EthernetAdapter$esd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent$esd.Connection = $sp.__Path$esd.ElementName = "Synthetic Ethernet Port"$esd.VirtualSystemIdentifiers = [Guid]::NewGuid().ToString("B")$vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService$vsm.AddVirtualSystemResources($vm, $esd.GetText([Management.TextFormat]::WmiDtd20))# Disk追加$im = gwmi -namespace root\virtualization Msvm_ImageManagementService$dir = (gwmi -namespace root\virtualization Msvm_VirtualSystemManagementServiceSettingData).DefaultVirtualHardDiskPath$im.CreateDynamicVirtualHardDisk( (Join-Path $dir "test.vhd"), 127GB )$ide = ($sd.getRelated("MSVM_ResourceAllocationSettingData")| where {$_.ResourceSubType -eq "Microsoft Emulated IDE Controller" -and $_.Address -eq 0})$ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=22 and ResourceSubType='Microsoft Synthetic Disk Drive'").__Path.Replace('\', '\\') # 22=Disk$dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent$dsd.Parent = $ide.__Path$dsd.Address = 0$vsm = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService$drive = [wmi]($vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20)).NewResources | select -first 1)$ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=21 and ResourceSubType='Microsoft Virtual Hard Disk'").__Path.Replace('\', '\\') # 21=StorageExtent$dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent$dsd.Connection = Join-Path $dir "test.vhd"$dsd.Parent = $drive.__Path$vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20))# DVD追加$ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=16 and ResourceSubType='Microsoft Synthetic DVD Drive'").__Path.Replace('\', '\\') # 16=DVDDrive$dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent$dsd.Parent = $ide.__Path$dsd.Address = 1$drive = [wmi]($vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20)).NewResources | select -first 1)$ac = (gwmi -namespace root\virtualization Msvm_AllocationCapabilities -filter "ResourceType=21 and ResourceSubType='Microsoft Virtual CD/DVD Disk'").__Path.Replace('\', '\\') # 21=StorageExtent$dsd = [wmi](gwmi -namespace root\virtualization Msvm_SettingsDefineCapabilities -filter "GroupComponent='$ac' and ValueRange=0").PartComponent$dsd.Connection = (gwmi Win32_CdromDrive -filter "Drive='D:'").DeviceID # D:ドライブ$dsd.Parent = $drive.__Path$vsm.AddVirtualSystemResources($vm, $dsd.GetText([Management.TextFormat]::WmiDtd20))&lt;/blockquote&gt;これぐらいでVMが作成できるはず。ここまで書いてようやく気付きました。VMの画面が見れません。VMにOSがインストールできないわけです…。もちろんP2Vとかすればできますが…。結局、長いものに巻かれろということで、私もリモート管理することにしました。というわけで本当に動作確認できていません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-5186438311148424972?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/5186438311148424972/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=5186438311148424972' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5186438311148424972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5186438311148424972'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/12/hyper-v-with-powershell.html' title='Hyper-V with PowerShell'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7772328811801975832</id><published>2009-11-27T00:27:00.003+09:00</published><updated>2009-11-27T00:39:05.065+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>CSS Animations Module Level 3 と CSS Sprite</title><content type='html'>CSS3のAnimation Moduleに失望しました。&lt;br /&gt;&lt;br /&gt;GIF Animationは広く使われているものの、色数がおおよそ256色、半透明の未サポート、ファイルサイズが大きくなりやすい、などなど、欠点があるので、他の方法を模索していました。&lt;br /&gt;&lt;br /&gt;今のところ、JavaScriptを使ってちまちまと書き換えする方法を採っています。&lt;br /&gt;&lt;br /&gt;そこでCSS SpriteとCSS3のAnimationを組み合わせることで、GIF Animationの代わりにならないかという案を思いつきました。&lt;br /&gt;CSS Animationはkeyframeでstyleを指定するとタイムラインに従ってstyleが変化するというもの。つまり、background-positionを指定すればアニメーションする！ と思ったわけです。&lt;br /&gt;&lt;br /&gt;１つ目の問題点はbackground-positionはxとyを同時に指定してしまう点。片方だけを指定してもう片方をinheritすることはできません。これは案外痛いです。&lt;br /&gt;もう１つが致命的。background-positionがlinear変化する点。linearでなくてもベジエ曲線で定義することはできるものの、CSS Spriteで求められているのはstepというか、keyframeで指定した値に直接変化すること。おかげで、にょろにょろにょろとCSS Sprite画像がスムーズにスクロールしてしまいます。&lt;br /&gt;&lt;br /&gt;まさにどうしてこうなった状態。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7772328811801975832?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7772328811801975832/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7772328811801975832' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7772328811801975832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7772328811801975832'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/11/css-animations-module-level-3-css.html' title='CSS Animations Module Level 3 と CSS Sprite'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6191490795171261644</id><published>2009-10-17T11:33:00.000+09:00</published><updated>2009-10-17T11:34:13.269+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>dojo.Deferred</title><content type='html'>JavaScriptにはスレッドがありません。時間のかかる処理をするにはsetTimeoutを使った疑似スレッドを使うことになります。&lt;br /&gt;すると今度は完了待ちのための手段が大変です。いくつかの処理が終わったら最後にこれをする、とかあるわけです。&lt;br /&gt;そんなときのための対策にこんな関数を用意して使っていました。&lt;br /&gt;&lt;blockquote class="code"&gt;// ちょー適当な関数名…&lt;br /&gt;function doat(count, func) {&lt;br /&gt;  return function() {&lt;br /&gt;    if( --count == 0 )&lt;br /&gt;      func();&lt;br /&gt;  };&lt;br /&gt;}&lt;/blockquote&gt;この関数は関数を返します。返ってきた関数はcount回呼び出すとfuncを呼びます。&lt;br /&gt;これで、各疑似スレッドに返ってきた関数を呼び出させれば、最後に終わったスレッドがfuncを実行してくれるわけです。&lt;br /&gt;&lt;br /&gt;でもdojoにdojo.Deferredクラスを見つけました。dojo的にはこっちを使うみたいです。&lt;br /&gt;まだ使い慣れていませんが、そのうちこっちに乗り換えよう…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6191490795171261644?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6191490795171261644/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6191490795171261644' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6191490795171261644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6191490795171261644'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/10/dojodeferred.html' title='dojo.Deferred'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2297807421044819933</id><published>2009-09-19T23:38:00.001+09:00</published><updated>2009-09-19T23:40:55.550+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly</title><content type='html'>データからBitmapの生成をよくするんですが、だいたいこんなコードを書きます。&lt;br /&gt;&lt;blockquote class="code"&gt;byte[] pixels;&lt;br /&gt;&lt;br /&gt;var bitmap = new Bitmap( width, height, PixelFormat.Format32bppArgb );&lt;br /&gt;var data = bitmap.LockBits( new Rectangle( 0, 0, width, height ), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb );&lt;br /&gt;Marshal.Copy( pixels, 0, data.Scan0, pixels.Length );&lt;br /&gt;bitmap.UnlockBits( data );&lt;/blockquote&gt;Marshal.Copy()が無駄に思えたのでImageLockMode.UserInputBufferを使ってみました。するとこんな風に書き換わります。&lt;blockquote class="badcode"&gt;byte[] pixels;&lt;br /&gt;&lt;br /&gt;var bitmap = new Bitmap( width, height, PixelFormat.Format32bppArgb );&lt;br /&gt;bar handle = GCHandle.Alloc( pixcels, GCHandleType.Pinned );&lt;br /&gt;try{&lt;br /&gt;  var data = new BitmapData{&lt;br /&gt;    PixelFormat = PixelFormat.Format32bppArgb,&lt;br /&gt;    Width = width,&lt;br /&gt;    Height = height,&lt;br /&gt;    Stride = stride,&lt;br /&gt;    Scan0 = Marshal.UnsafeAddrOfPinnedArrayElement( pixels, 0 ),&lt;br /&gt;  };&lt;br /&gt;  bitmap.LockBits( new Rectangle( 0, 0, width, height ), ImageLockMode.UserInputBuffer|ImageLockMode.WriteOnly,&lt;br /&gt;    PixelFormat.Format32bppArgb, data );&lt;br /&gt;  bitmap.UnlockBits( data );&lt;br /&gt;}&lt;br /&gt;finally{&lt;br /&gt;  handle.Free();&lt;br /&gt;}&lt;/blockquote&gt;無駄なコピーが排除できた！ と喜んだものの、処理がかなり遅くなりました…。GCHandle.Alloc()のせいではなく、ImageLockMode.UserInputBufferが原因のようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2297807421044819933?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2297807421044819933/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2297807421044819933' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2297807421044819933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2297807421044819933'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/09/imagelockmodeuserinputbuffer.html' title='ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7217045168317236416</id><published>2009-09-07T21:20:00.003+09:00</published><updated>2009-09-19T23:27:33.387+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>IE6 CSSのclass selectorの酷さ</title><content type='html'>IE6の酷いところはいろいろ言われていますが、今更ながらこんなことではまるとは。と言うことで書き留めておきます。&lt;br /&gt;&lt;blockquote class="code"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;  .a.c {&lt;br /&gt;    color: red;&lt;br /&gt;  }&lt;br /&gt;  .b.c {&lt;br /&gt;    color: blue;&lt;br /&gt;  }&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;/blockquote&gt;何の変哲もないスタイルです。classにa cが同時に含まれていれば赤く、b cが同時に含まれていれば青くなります。&lt;br /&gt;そうこんな感じ&lt;blockquote class="code"&gt;&amp;lt;div class="a c"&amp;gt;&lt;br /&gt;  color: red;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;…ところが、IE6はclassにbが含まれていないのに青くなります。いやマジで。&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;追記：&lt;br /&gt;間違ってました。IE6はCSS1しかサポートしておらず、CSS1ではclass selectorのネストを許していませんでした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7217045168317236416?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7217045168317236416/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7217045168317236416' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7217045168317236416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7217045168317236416'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/09/ie6-cssclass-selector.html' title='IE6 CSSのclass selectorの酷さ'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4286398517875451948</id><published>2009-08-13T09:20:00.002+09:00</published><updated>2009-08-13T09:30:43.116+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win64'/><title type='text'>Windows 7 導入</title><content type='html'>Windows 7を導入しました。Hyper-Vが使いたかったのでWindows Server 2008 R2の方がよかったのですが、Hyper-Vを有効にするとスリープが使えないのは痛いです。サーバーOSだから当たり前ですね。&lt;br /&gt;&lt;br /&gt;以降、愚痴です。&lt;br /&gt;今更ながらIRQの競合が起きてる模様？&lt;br /&gt;video card、onboard sound、onboard nicがIRQを共有しているらしく、Windows 7起動時にsoundやnicが認識されない現象が。必ずvide cardは認識される辺り怪しいです。&lt;br /&gt;XP / Vistaでは発生しなかった現象です。またWindows Server 2008 R2でも発生します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4286398517875451948?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4286398517875451948/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4286398517875451948' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4286398517875451948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4286398517875451948'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/08/windows-7.html' title='Windows 7 導入'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4761485994583581197</id><published>2009-06-07T09:58:00.004+09:00</published><updated>2009-06-07T10:08:29.895+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Visual Studio 2010 beta1 C++でのinclude</title><content type='html'>なんでもVC++が進化しているそうなので試してみたく。&lt;br /&gt;プログラムを書こうとして#include &amp;lt;...&amp;gt;まで書いて気がついた。はてさて、header fileのdirectoryはどう設定するの？&lt;br /&gt;&lt;br /&gt;Visual Studio 2008までは ツール - オプション - プロジェクトおよびソリューション - VC++ディレクトリ という設定項目があり、そこにディレクトリを入力できた。が、2010 beta1ではそこがなくなっている。&lt;br /&gt;もちろんプロジェクトのプロパティに設定してもコンパイルできることにはできるが、システムにインストールしたheader fileのdirectoryをプロジェクトごとに書くのはおかしい。&lt;br /&gt;&lt;br /&gt;プロジェクトファイルを参照したところ答えがあった。&lt;blockquote class="code"&gt;&amp;lt;ImportGroup Label="PropertySheets"&amp;gt;&lt;br /&gt;  &amp;lt;Import Project="$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props"&lt;br /&gt;    Condition="exists('$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.props')" /&amp;gt;&lt;br /&gt;&amp;lt;/ImportGroup&amp;gt;&lt;/blockquote&gt;つまり$(LocalAppData)\Microsoft\VisualStudio\10.0\Microsoft.Cpp.$(Platform).user.propsに書けば取り込まれます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4761485994583581197?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4761485994583581197/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4761485994583581197' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4761485994583581197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4761485994583581197'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/06/visual-studio-2010.html' title='Visual Studio 2010 beta1 C++でのinclude'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8589742576685297019</id><published>2009-06-05T18:45:00.003+09:00</published><updated>2009-06-05T18:49:59.775+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# 4.0 dynamic その2</title><content type='html'>というわけでサンプルコードを使って、C# 3.0とC# 4.0とでどのように変わってくるかを説明します。&lt;br /&gt;サンプルは、Outlook 2007の受信トレイ以下のフォルダにある重複メール（Message-Idが一致するメール）をゴミ箱へ移動するコードです。Outlook 2007の新機能Tableオブジェクトを使用しているのでOutlook 2003以前では動作しません。&lt;br /&gt;&lt;br /&gt;まずはC# 3.0でのコード&lt;blockquote class="code"&gt;static class Program {&lt;br /&gt;  // Outlookを初期化し、受信トレイに対してVisit()を呼びます。&lt;br /&gt;  static void Main( string[] args ) {&lt;br /&gt;    var application = new Application();&lt;br /&gt;    Visit( application.Session.GetDefaultFolder( OlDefaultFolders.olFolderInbox ) );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // 各フォルダに対してProcess()を呼びます。また再帰的にフォルダを探索していきます。&lt;br /&gt;  static void Visit( MAPIFolder folder ) {&lt;br /&gt;    Process( folder );&lt;br /&gt;    foreach( MAPIFolder f in folder.Folders )&lt;br /&gt;      Visit( f );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // ちょっとだけ読みやすくなる拡張メソッドです。&lt;br /&gt;  static IEnumerable&amp;lt;Row&amp;gt; AsEnumerable( this Table table ) {&lt;br /&gt;    while( !table.EndOfTable )&lt;br /&gt;      yield return table.GetNextRow();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // 本題の処理です。Message-Id一覧を作成し、重複するものがあったらゴミ箱へ移動します。&lt;br /&gt;  static void Process( MAPIFolder folder ) {&lt;br /&gt;    var messageIds = new HashSet&amp;lt;string&amp;gt;();&lt;br /&gt;    var table = folder.GetTable( &lt;span style="color: rgb(51, 204, 0);"&gt;null, OlTableContents.olUserItems&lt;/span&gt; );&lt;br /&gt;    table.Columns.RemoveAll();&lt;br /&gt;    table.Columns.Add( "http://schemas.microsoft.com/mapi/proptag/0x1035001E" );&lt;br /&gt;    table.Columns.Add( "EntryID" );&lt;br /&gt;    var ns = folder.Session;&lt;br /&gt;    var trash = ns.GetDefaultFolder( OlDefaultFolders.olFolderDeletedItems );&lt;br /&gt;    foreach( var row in table.AsEnumerable() )&lt;br /&gt;      if( !messageIds.Add( &lt;span style="color: rgb(51, 204, 0);"&gt;(string)row[1]&lt;/span&gt; ) ) {&lt;br /&gt;        &lt;span style="color: rgb(51, 204, 0);"&gt;MailItem mailItem = (MailItem)ns.GetItemFromID( (string)row[2], null );&lt;/span&gt;&lt;br /&gt;        Console.WriteLine( "{0}", mailItem.Subject );&lt;br /&gt;        mailItem.Move( trash );&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;続いてC# 4.0でのコード。違いがあるのはProcess()メソッドだけです。&lt;blockquote class="code"&gt;  static void Process( MAPIFolder folder ) {&lt;br /&gt;    var messageIds = new HashSet&amp;lt;string&amp;gt;();&lt;br /&gt;    var table = folder.GetTable( &lt;span style="color: rgb(51, 102, 255);"&gt;TableContents: OlTableContents.olUserItems&lt;/span&gt; );&lt;br /&gt;    table.Columns.RemoveAll();&lt;br /&gt;    table.Columns.Add( "http://schemas.microsoft.com/mapi/proptag/0x1035001E" );&lt;br /&gt;    table.Columns.Add( "EntryID" );&lt;br /&gt;    var ns = folder.Session;&lt;br /&gt;    var trash = ns.GetDefaultFolder( OlDefaultFolders.olFolderDeletedItems );&lt;br /&gt;    foreach( var row in table.AsEnumerable() )&lt;br /&gt;      if( !messageIds.Add( &lt;span style="color: rgb(51, 102, 255);"&gt;row[1]&lt;/span&gt; ) ) {&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;MailItem mailItem = ns.GetItemFromID( row[2] );&lt;/span&gt;&lt;br /&gt;        Console.WriteLine( "{0}", mailItem.Subject );&lt;br /&gt;        mailItem.Move( trash );&lt;br /&gt;      }&lt;br /&gt;  }&lt;/blockquote&gt;まず、デフォルト引数に対応したため、本質的でないnull引数を記述しなくてもよくなっています。&lt;br /&gt;&lt;br /&gt;次に、row[1]とrow[2]の実体はstring型ですが宣言はobject型でした。C# 4.0ではここがdynamic型になっているため、明示的なキャストなしでメソッド引数に使えます。&lt;br /&gt;ns.GetItemFromID()の戻り値もobjectがdynamicに変わっています。実体はCOMオブジェクトです。dynamicのまま扱ってもSubjectプロパティやMove()メソッドは呼び出せますが、MailItem型ということがわかっていますのでキャストしています。その際にも明示的にキャスト式を書く必要はありません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8589742576685297019?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8589742576685297019/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8589742576685297019' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8589742576685297019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8589742576685297019'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/06/c-40-dynamic-2.html' title='C# 4.0 dynamic その2'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8161596164156200613</id><published>2009-06-04T21:16:00.003+09:00</published><updated>2009-06-04T21:29:46.271+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# 4.0 dynamic</title><content type='html'>Visual Studio 2010 beta1で遊んでいます。&lt;br /&gt;C# 4.0および.NET Framework 4.0で提供されるdynamicキーワードについて誤解していました。&lt;br /&gt;&lt;br /&gt;dynamic宣言した変数はメソッド呼び出しを行っても、実行時にバインドされます。&lt;br /&gt;ここまでは合ってます。&lt;br /&gt;&lt;br /&gt;誤解していたのは、ソースコード上で明示的に宣言したもののみがdynamic変数になると考えていました。（object→dynamicにキャストするイメージでした。）しかし、Visual Studio 2010で試していてわかったのですが、PIAなどのクラスメソッドの戻り値がそもそもdynamicになっています。（C# 3.0まではobject型）&lt;br /&gt;なので、今までstringなどの変数に代入するためにはobject→stringの明示的なキャストが必要でした。C# 4.0ではdynamicになっているため、stringに代入しようとするだけで自動的にキャストされます。C# 3.0のvarで受けた場合、dynamicのままでした。&lt;br /&gt;&lt;br /&gt;文字だけなのでイメージがわきづらいですが、PIAを使った場合に思った以上にdynamicの恩恵が受けられそうです。&lt;br /&gt;&lt;br /&gt;サンプルコードでも書けばわかりやすいかな？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8161596164156200613?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8161596164156200613/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8161596164156200613' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8161596164156200613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8161596164156200613'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/06/c-40-dynamic.html' title='C# 4.0 dynamic'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4802369177202040679</id><published>2009-04-19T21:21:00.000+09:00</published><updated>2009-04-19T21:22:35.111+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>mod_cacheまわり</title><content type='html'>Apache Web Serverでコンテンツのcacheをしたくなり調査しました。&lt;br /&gt;まず、cache方法には３種類あって&lt;ol&gt;&lt;li&gt;Reverse Proxy&lt;br /&gt;Web serverとWeb browserとの間に介入して、cacheする。Apacheにもその機能はあるし、別のツールでも実現できる。Web serverとは別モノを必要とするので構造がややこしくなるのでパス。&lt;/li&gt;&lt;li&gt;mod_file_cache&lt;br /&gt;Apacheが最終的に読み込むfileそのものをcacheしてしまう。方法をfile openしっぱなしやmmap()しっぱなしなど、安直だけどうまくいけば効果的。cacheの対象がfileなので動的なコンテンツには対応できない。パス。&lt;/li&gt;&lt;li&gt;mod_cache&lt;br /&gt;Apacheのfilterとして動作し、出力内容をcacheし、次に同じリクエストがあればcache内容を返す。動的なコンテンツにも対応する。本命。&lt;/li&gt;&lt;/ol&gt;というわけでmod_cacheの設定をします。&lt;hr /&gt;そもそも&lt;a href="http://sonic64.com/2005-09-15.html"&gt;mod_rewriteを使った記事&lt;/a&gt;を参考に、コンテンツ圧縮をしていました。というのもApacheのmod_deflateはリクエストの度にコンテンツ圧縮をするので効率が悪かったのです。mod_cacheで圧縮後のコンテンツをcacheできればmod_rewriteのトリッキーな方法ともおさらばです。&lt;br /&gt;&lt;br /&gt;さてmod_cacheにはdisk cacheを行うmod_disk_cacheとmemory cacheを行うmod_mem_cacheがあります。ディスクアクセスを減らしたいのでここはmod_mem_cacheで決まりです。&lt;br /&gt;mod_mem_cacheはプロセスごとにmemory cacheを行うためマルチプロセスとなるpreforkモデルでは効果がありません。ここはマルチスレッドを併用するworkerモデルに切り替えます。（Debianなのでapache2-mpm-workerパッケージをインストールするだけ。）&lt;br /&gt;&lt;br /&gt;次にmod_deflateによるコンテンツ圧縮の設定です。&lt;blockquote class="code"&gt;AddOutputFilterByType DEFLATE text/plain text/xml application/javascript&lt;/blockquote&gt;text/htmlは加えません。そもそも細かい設定もしません。そこには事情があります。&lt;br /&gt;text/htmlをコンテンツ圧縮したところIE6が固まりました。正確にはKeep Aliveが切断されるまで処理が固まり、他のコンテンツはタイムアウトエラーになりました。mod_setenvifを使用してIE6のみKeep Aliveを拒否してみましたがいまいち効果もなく、またConnection continueが使えないのは応答速度にも影響します。htmlコンテンツは大きくもなく、数も少ないため圧縮対象外としました。&lt;br /&gt;mod_deflateに対して細かい設定をしないことにも事情があります。コンテンツ圧縮を行うことで古いブラウザでは問題を引き起こします。一般的にはそこでブラウザごとに圧縮可否を変えます。これを行ってしまうと、Varyレスポンスヘッダに影響を与えてしまいます。つまり、User-Agentリクエストヘッダに応じてコンテンツを切り替えていることになり「Vary: Accept-Encoding, User-Agent」となってしまいます。mod_cacheはこれを見てUser-Agentごとに異なるcacheを生成します。User-Agentにはブラウザバージョンなどの文字列が含まれているためほとんどcache hitが見込めなくなります。というわけであえてUser-Agentには依存しない設定にしました。&lt;br /&gt;&lt;br /&gt;Vary: Accept-Encodingにも問題がありました。リクエストヘッダに「Accept-Encoding: gzip」とあれば圧縮する（なければ圧縮しない）わけですから、Varyに含めるのは当然なのですが、Accept-Encodingの内容がブラウザごとに異なるため、それぞれにcacheを生成してしまいます。そこで考えました。&lt;blockquote class="badcode"&gt;SetEnvIf Accept-Encoding "\bgzip\b" gzip&lt;br /&gt;RequestHeader set Accept-Encoding gzip env=gzip&lt;br /&gt;RequestHeader unset Accept-Encoding env=!gzip&lt;/blockquote&gt;Accept-Encodingにgzipを含むか含まないかの２択でヘッダを書き換えてしまう方法です。これはどうやらダメでした。cacheのhit判定にはこの書き換えは含まれず、逆にcache保存時にはこの書き換えの影響を受けるためcache hitしなくなりました。というわけでこれに関しては目をつぶります。&lt;br /&gt;&lt;br /&gt;他にも問題がありました。mod_deflateはコンテンツ圧縮後のETagに「-gzip」を付与します。cacheのhit判定には「-gzip」が付与されていないためこれまたcache hitしませんでした。そこで&lt;blockquote class="code"&gt;FileETag None&lt;/blockquote&gt;でETagを消しました。元々Last-Modifiedレスポンスヘッダは付いているのでそれほど問題にはなりません。&lt;br /&gt;&lt;br /&gt;最後にmod_cacheとmod_mem_cacheの設定です。これはパラメータを適切に設定するだけです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4802369177202040679?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4802369177202040679/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4802369177202040679' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4802369177202040679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4802369177202040679'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/04/modcache.html' title='mod_cacheまわり'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7034664526125646783</id><published>2009-04-11T22:24:00.003+09:00</published><updated>2009-04-11T22:33:57.226+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ToolStripMenuItem.CheckOnClick</title><content type='html'>こんな機能が欲しかった！&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.windows.forms.toolstripmenuitem.checkonclick.aspx"&gt;ToolStripMenuItem.CheckOnClick&lt;/a&gt;より&lt;blockquote&gt;ToolStripMenuItemが自動的にチェックされた状態で表示され、クリックしたときにチェック解除されるかどうかを示す値を取得または設定します。&lt;br /&gt;...&lt;br /&gt;クリックしたときにToolStripMenuItemが自動的にチェックされた状態で表示される場合はtrue。それ以外の場合はfalse。既定値はfalseです。&lt;/blockquote&gt;何か矛盾してる。ソースコードを追ってみたところ、前半はウソ。後半が正しい。もう一度、引用しよう。&lt;blockquote&gt;&lt;span style="font-weight:bold;"&gt;クリックしたときにToolStripMenuItemが自動的にチェックされた状態で表示される&lt;/span&gt;場合はtrue。それ以外の場合はfalse。&lt;/blockquote&gt;翻訳すると、trueにした場合の振る舞いとして、このメニューをクリックするとチェックが付く…チェックを外す方法については言及していません。&lt;br /&gt;&lt;br /&gt;大事なことなので２度言いましたよ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7034664526125646783?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7034664526125646783/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7034664526125646783' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7034664526125646783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7034664526125646783'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/04/toolstripmenuitemcheckonclick.html' title='ToolStripMenuItem.CheckOnClick'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7895743833615563075</id><published>2009-04-04T10:23:00.003+09:00</published><updated>2009-04-04T10:44:18.755+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C#でできることはC++/CLIでもできる</title><content type='html'>私にもそう思っていた頃がありました。&lt;br /&gt;ADO.NET周りに新機能が多くて何か使ってみようと思って調べてみました。&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Data Entity Framework&lt;/dt&gt;&lt;dd&gt;C#とVB.NETのみ。code generatorがC++/CLIに対応してない。ちなみにVisual Studioが生成するファイルとcode generatorが引数に要求するファイルは異なるので自分で処理するのは面倒。次バージョンに期待。&lt;/dd&gt;&lt;dt&gt;SQL Server Compact 3.5 SP1&lt;/dt&gt;&lt;dd&gt;C++/CLIからも使用可能。やったね☆&lt;/dd&gt;&lt;dt&gt;Linq to SQL&lt;/dt&gt;&lt;dd&gt;さすがにC#のような構文拡張はC++/CLIに期待しないとして…C#とVB.NETのみ。code generatorがC++/CLIに対応してない。更にSQL Server Compact 3.5 SP1はLinq to SQLに未対応。&lt;/dd&gt;&lt;dt&gt;型指定されたDataSet&lt;/dt&gt;&lt;dd&gt;C#とVB.NETのみ。code generatorがC++/CLIに対応してよくわからないエラーを吐く。そのためなのか、Visual Studioでも「新しい項目の追加」のテンプレートからも外されている。&lt;/dd&gt;&lt;dt&gt;Linq to DataSet&lt;/dt&gt;&lt;dd&gt;型指定されたDataSetが作れない時点で終わってます。&lt;/dd&gt;&lt;dt&gt;番外編…Settings.settings&lt;/dt&gt;&lt;dd&gt;動いてるような、動いてないような。型指定されたwrapperクラスを作ろうとSettings.hファイルを作成しstdafx.hに書き込むところまで自動でやってくれます。Settings.hファイルの中身？ しらんがな。そのためなのか、Visual Studioでも「新しい項目の追加」のテンプレートからも外されている。&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;C++/CLIはnativeと.NETとの橋渡し程度に考えておくべきかもしれません…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7895743833615563075?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7895743833615563075/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7895743833615563075' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7895743833615563075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7895743833615563075'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/04/cccli.html' title='C#でできることはC++/CLIでもできる'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7055063204075490820</id><published>2009-04-02T20:39:00.002+09:00</published><updated>2009-04-02T20:49:59.880+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>逆double thunking</title><content type='html'>double thunkingに逆も何もないけどなんとなく…。&lt;br /&gt;&lt;br /&gt;状況としては次の関数をnative C++でコンパイルしa.dllに入れます。&lt;blockquote class="code"&gt;__declspec(dllexport) LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam );&lt;/blockquote&gt;&lt;br /&gt;そしてa.dllにリンクするb.exe内でC++/CLIを使って次の呼び出しをします。&lt;blockquote class="code"&gt;HINSTANCE module = GetModuleHandleW( L"a.dll" );&lt;br /&gt;SetWindowsHookExW( WH_CBT, CBTProc, module, 0 );&lt;/blockquote&gt;するとどうなるか。&lt;br /&gt;&lt;br /&gt;コンパイラは単なる関数ポインタCBTProcをmanaged codeから呼べるようwrapします（１段目のthunk）。&lt;br /&gt;次にwrapされたmanagedな関数ポインタをunmanaged codeから呼べるようにwrapします（２段目のthunk）。&lt;br /&gt;この２重にthunkされた関数ポインタをSetWindowsHookExW()に渡します。&lt;br /&gt;&lt;br /&gt;#pragma unmanagedとか試してみましたが変化しませんでした。結局、この部分だけソースコードを独立させ、/clrコンパイルオプションを外して強制的にnative C++としてコンパイルすることで回避できました。もっとsmartな方法がありそうですが、見つけられなかった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7055063204075490820?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7055063204075490820/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7055063204075490820' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7055063204075490820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7055063204075490820'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/04/double-thunking.html' title='逆double thunking'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2438740394544935117</id><published>2009-03-29T23:23:00.003+09:00</published><updated>2009-03-29T23:34:01.867+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>/NODEFAULTLIB:msvcmrt.lib</title><content type='html'>どこかでVS2008のC++/CLIだと.NET Frameworkを使用しているのにVC++ランタイムライブラリとの依存関係が切れなくて、結局VC++ランタイムライブラリもインストール必要になってしまう＆x86とx64で共存できない、というような記述を見かけた…気がしました。&lt;br /&gt;後になって探したのですがどこで見かけたのやら。&lt;br /&gt;&lt;br /&gt;で、&lt;a href="http://msdn.microsoft.com/ja-jp/library/ms235238.aspx"&gt;方法 : CRT ライブラリ DLL との依存関係を削除して部分信頼アプリケーションを作成する&lt;/a&gt;によると/NODEFAULTLIB:msvcmrt.libを指定することにより依存関係を切れるとのこと。ただしこれでは必要な処理が足りていないのでptrustm.libかptrustmd.libのどちらかとリンクすること。&lt;br /&gt;&lt;br /&gt;えっとこの.libによってx86かx64のどちらかに固定されてしまうのか。でも.NET Frameworkだけで動作できるようになる、VC++ランタイムライブラリのインストール不要となるならそれはそれで大きいかな。&lt;br /&gt;&lt;br /&gt;あ、ちなみに結果がどうなるか試してません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2438740394544935117?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2438740394544935117/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2438740394544935117' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2438740394544935117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2438740394544935117'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/03/nodefaultlibmsvcmrtlib.html' title='/NODEFAULTLIB:msvcmrt.lib'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-770306406046963938</id><published>2009-03-28T13:57:00.000+09:00</published><updated>2009-03-28T13:57:12.885+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>zh-Hansとzh-CHS</title><content type='html'>カルチャには特定カルチャとニュートラルカルチャとインバリアントカルチャがある。&lt;br /&gt;特定カルチャはja-JPとかen-USとか、言語＋地域情報を持つもの。&lt;br /&gt;ニュートラルカルチャはjaとかenとか、言語だけで地域情報を持たないもの。特定カルチャで完全一致できなかった場合にニュートラルカルチャにフォールバックします。&lt;br /&gt;インバリアントカルチャは言語も地域も表さないもの。「要するに、体系を体系たらしめるために要請される意味の不在を否定する記号なんだよ。そのアナログなのが神で、デジタルなのがゼロ。どうかな？」&lt;br /&gt;&lt;br /&gt;で、ニュートラルカルチャには唯一の例外としてzh-CHSとzh-CHTがある。中国語には簡体字と繁体字があるから。そしてこのカルチャ名はWindows Vistaからzh-Hansとzh-Hantに変更されてたりする。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows XP上の.NET Framework 2.0 SPなしだとzh-Hansを認識しない&lt;/li&gt;&lt;li&gt;Windows XP上の.NET Framework 2.0 SP1以降だとzh-Hansを認識し、zh-CHS→zh-Hansの順でフォールバックする&lt;/li&gt;&lt;li&gt;Windows Vista上の.NET Framework 2.0 SPなし（SP1以降も）zh-CHSを認識し、zh-CHS→zh-Hansの順でフォールバックする&lt;/li&gt;&lt;/ul&gt;結局の所、Windows XPを意識するならzh-CHSを使うことになるが、例えば.NET Framework 3.5 SP1 Client Profileだと.NET Framework 2.0 SP2を含むのでzh-Hansでもいいかもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-770306406046963938?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/770306406046963938/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=770306406046963938' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/770306406046963938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/770306406046963938'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/03/zh-hanszh-chs.html' title='zh-Hansとzh-CHS'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1488692502858210929</id><published>2009-03-22T01:10:00.001+09:00</published><updated>2009-03-22T01:11:19.055+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win64'/><title type='text'>自作ツールのWindows 7対応</title><content type='html'>対応に向けて調査を始めました。途中で飽きたらそのまま放置になりますが…。&lt;br /&gt;まず今のツールはUIを設計する気がないため設定項目は全てiniを使い、タスクトレイに置いたアイコンのメニューから最低限の操作ができるようになっています。&lt;br /&gt;Windows 7ではタスクトレイはデフォルトで非表示なので困ってしまうため抜本的な見直しを行うことにしました。&lt;br /&gt;&lt;br /&gt;Windows Live Messengerがtaskbarを使いこなしているためこれを参考に調査を進めます。まずWindows 7環境ではこんな感じ。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-dLEIGFeJ2o/ScTymPk8yPI/AAAAAAAAAEA/envpXOcbPVY/s1600-h/desktop.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_-dLEIGFeJ2o/ScTymPk8yPI/AAAAAAAAAEA/envpXOcbPVY/s400/desktop.png" alt="" id="BLOGGER_PHOTO_ID_5315640199034489074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;タスクトレイにはアイコンが出なくなります。メインウィンドウの他にもう一つウィンドウが存在するような。そしてタスクバーを右クリックするとこんな感じ。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-dLEIGFeJ2o/ScUAIk0SObI/AAAAAAAAAEI/M_h1wh9AqTo/s1600-h/tasrkbar-menu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 255px; height: 400px;" src="http://4.bp.blogspot.com/_-dLEIGFeJ2o/ScUAIk0SObI/AAAAAAAAAEI/M_h1wh9AqTo/s400/tasrkbar-menu.png" alt="" id="BLOGGER_PHOTO_ID_5315655082502666674" border="0" /&gt;&lt;/a&gt;プログラムから好きなメニューを登録できます。ちなみにこのメニューはスタートメニューにも表示されてこんな感じ。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-dLEIGFeJ2o/ScUAqZB-y_I/AAAAAAAAAEQ/JABmG4_hbtc/s1600-h/startmenu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 374px;" src="http://3.bp.blogspot.com/_-dLEIGFeJ2o/ScUAqZB-y_I/AAAAAAAAAEQ/JABmG4_hbtc/s400/startmenu.png" alt="" id="BLOGGER_PHOTO_ID_5315655663454440434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;さてメインウィンドウを閉じるとこんな感じ。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-dLEIGFeJ2o/ScUBIPIm6uI/AAAAAAAAAEY/rYHxr2MOuac/s1600-h/mainlist-closed.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 261px; height: 278px;" src="http://2.bp.blogspot.com/_-dLEIGFeJ2o/ScUBIPIm6uI/AAAAAAAAAEY/rYHxr2MOuac/s400/mainlist-closed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315656176193956578" /&gt;&lt;/a&gt;&lt;br /&gt;やはり何かいるようです。spyで見ると&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-dLEIGFeJ2o/ScURQgRLf4I/AAAAAAAAAEg/teRKrg918c0/s1600-h/hidden-window.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_-dLEIGFeJ2o/ScURQgRLf4I/AAAAAAAAAEg/teRKrg918c0/s400/hidden-window.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315673910418308994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-dLEIGFeJ2o/ScURXCo4NyI/AAAAAAAAAEo/lqwyFLAzFjc/s1600-h/hidden-window-style.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 246px;" src="http://4.bp.blogspot.com/_-dLEIGFeJ2o/ScURXCo4NyI/AAAAAAAAAEo/lqwyFLAzFjc/s400/hidden-window-style.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315674022723729186" /&gt;&lt;/a&gt;&lt;br /&gt;とんでもない座標に隠しWindowがいました。これを参考にしてみようと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1488692502858210929?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1488692502858210929/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1488692502858210929' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1488692502858210929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1488692502858210929'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/03/windows-7.html' title='自作ツールのWindows 7対応'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-dLEIGFeJ2o/ScTymPk8yPI/AAAAAAAAAEA/envpXOcbPVY/s72-c/desktop.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2790617196176371657</id><published>2009-03-19T21:48:00.002+09:00</published><updated>2009-03-20T00:18:27.271+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>二項係数</title><content type='html'>どこかの影響を受けて書いてみました。&lt;br /&gt;&lt;blockquote class="code"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;title&amp;gt;二項係数&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;base href="http://ajax.googleapis.com/ajax/libs/dojo/1.2.3/" /&amp;gt;&lt;br /&gt; &amp;lt;link rel="stylesheet" type="text/css" href="dojo/resources/dojo.css" /&amp;gt;&lt;br /&gt; &amp;lt;link rel="stylesheet" type="text/css" href="dijit/themes/soria/soria.css" /&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript" src="dojo/dojo.xd.js" djconfig="parseOnLoad: true"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;  // &amp;lt;![CDATA[&lt;br /&gt;  dojo.require("dijit.form.NumberTextBox");&lt;br /&gt;  var MAX = 10000000;&lt;br /&gt;  function onChange() {&lt;br /&gt;   var n = N.attr('value');&lt;br /&gt;   var k = K.attr('value');&lt;br /&gt;   if (isNaN(n) || isNaN(k) || k &amp;gt; n)&lt;br /&gt;    return;&lt;br /&gt;   k = Math.min(k, n - k);&lt;br /&gt;   if(k == 0)&lt;br /&gt;    k = 1;&lt;br /&gt;   else {&lt;br /&gt;    var numerator = [];&lt;br /&gt;    for(var i = 0; i &amp;lt; k; i++)&lt;br /&gt;     numerator.push(n - i);&lt;br /&gt;&lt;br /&gt;    for(var i = 2; i &amp;lt;= k; i++) {&lt;br /&gt;     var j = i;&lt;br /&gt;     for(var p = 2; j &amp;gt; 1; p++) {&lt;br /&gt;      while(j % p == 0) {&lt;br /&gt;       j /= p;&lt;br /&gt;       for(var l = 0; l &amp;lt; numerator.length; l++) {&lt;br /&gt;        if(numerator[l] % p == 0) {&lt;br /&gt;         numerator[l] /= p;&lt;br /&gt;         break;&lt;br /&gt;        }&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;    var result = [1];&lt;br /&gt;    dojo.forEach(numerator, function(i) {&lt;br /&gt;     var rest = 0;&lt;br /&gt;     for(var j = 0; j &amp;lt; result.length; j++) {&lt;br /&gt;      var k = result[j] * i + rest;&lt;br /&gt;      result[j] = k % MAX;&lt;br /&gt;      rest = (k - result[j]) / MAX;&lt;br /&gt;     }&lt;br /&gt;     if(rest &amp;gt; 0)&lt;br /&gt;      result.push(rest);&lt;br /&gt;    });&lt;br /&gt;    k = result.pop().toFixed();&lt;br /&gt;    dojo.forEach(result.reverse(), function(i) {&lt;br /&gt;     k += (i + MAX).toFixed().substr(1);&lt;br /&gt;    });&lt;br /&gt;   }&lt;br /&gt;   dojo.byId('result').innerHTML = k;&lt;br /&gt;  }&lt;br /&gt;  // ]]&amp;gt;&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body class="soria"&amp;gt;&lt;br /&gt; &amp;lt;h1&amp;gt;&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;C&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt; n = &amp;lt;input type="text" dojotype="dijit.form.NumberTextBox" jsid="N" value="0"&lt;br /&gt;  required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt; k = &amp;lt;input type="text" dojotype="dijit.form.NumberTextBox" jsid="K" value="0"&lt;br /&gt;  required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt; &amp;lt;span id="result"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2790617196176371657?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2790617196176371657/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2790617196176371657' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2790617196176371657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2790617196176371657'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/03/blog-post.html' title='二項係数'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7027129357773096749</id><published>2009-03-13T08:01:00.002+09:00</published><updated>2009-03-13T08:08:51.297+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win64'/><title type='text'>Windows Server 2008 R2 build 7048</title><content type='html'>そろそろ2008 R2に環境を移そうとしています。ベータテストと、自作アプリのWindows 7対応のために。&lt;br /&gt;Windows 7ではタスクバーが新しくなり、右下の通知領域がデフォルトで非表示になってしまうので、&lt;br /&gt;アプリケーションの設計を見直す必要が。&lt;br /&gt;で、どうせならHyper-Vとか使いたいので2008 R2です。&lt;br /&gt;&lt;br /&gt;build 7048ですがところどころ不安定でした。まだ翻訳がおかしいですし、機能の追加の後の再起動に&lt;br /&gt;失敗したりVirtual Clone Driveのインストールの直後はシャットダウンできなかったり。&lt;br /&gt;ただ、RadeonのバグいドライバでWindows Vistaだとblue screenなのが、2008 R2だとドライバの&lt;br /&gt;再起動を繰り返しつつも耐えてました。（耐えてる間に正常に再起動がかけれた。）&lt;br /&gt;まぁRadeonがわるいんですが。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7027129357773096749?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7027129357773096749/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7027129357773096749' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7027129357773096749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7027129357773096749'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/03/windows-server-2008-r2-build-7048.html' title='Windows Server 2008 R2 build 7048'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1682190404242963129</id><published>2009-02-22T15:52:00.002+09:00</published><updated>2009-02-22T15:59:31.188+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>PNGの再圧縮</title><content type='html'>GDI+で作成したPNGファイルをGIMPで開いて保存し直したところ結構ファイルサイズが大きくなってびっくり。そういえば色形式も色々ありましたっけ。&lt;br /&gt;調べたところ、&lt;a href="http://optipng.sourceforge.net/"&gt;OptiPNG&lt;/a&gt;とか他にもいろいろ再圧縮ツールがあるそうで。&lt;br /&gt;手元のWebページの画像7,433ファイルをこのツールにかけたところ82MB→65MBと削減できました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1682190404242963129?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1682190404242963129/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1682190404242963129' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1682190404242963129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1682190404242963129'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/02/png.html' title='PNGの再圧縮'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-115661337617387793</id><published>2009-02-21T11:18:00.003+09:00</published><updated>2009-02-21T11:58:15.048+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Debian 5.0 lenny</title><content type='html'>Debian 5.0 (lenny)がリリースされたのでアップグレードしました。&lt;br /&gt;思兼 GNU/Linuxからアップグレードを繰り返してそろそろ10年でしょうか。&lt;blockquote class="code"&gt;find /etc/ -type f | xargs ls -ltdr | head&lt;/blockquote&gt;で/etc内にある一番古いファイルが2000/01/29でした。&lt;br /&gt;&lt;br /&gt;アップグレードの中でproftpdがはまることがわかっています。FTPにはそもそもファイル名に関する規定がありません。今までproftpdは8bit cleanでしたが、Debian 5.0にパッケージされているproftpd 1.3.1は8bit cleanではなくなり、日本語ファイル名を通すことが困難になりました。&lt;br /&gt;こんなときでもDebianは古いパッケージをholdしておけば共存できます。つまりproftpdとそれに依存するパッケージはDebian 4.0のままで、それ以外はDebian 5.0に移行しました。&lt;br /&gt;&lt;br /&gt;それでもまだはまることがあるんですね。&lt;br /&gt;iptablesがバージョンアップして以前のiptables.confが使えませんでした。おかげでfirewall設定が消えて外部から攻撃を受ける羽目に…。&lt;br /&gt;udev絡みでしょうか、mdのデバイスファイル名が/dev/md/1から/dev/md1に変わってしまいました。おかげでmount失敗に泣きました。&lt;br /&gt;dhcpサーバが設定に厳しくなりました。ノートパソコンに対して無線LAN経由でも有線LANでも同じIPアドレスを割り当てていましたが、まとめて１つの設定にできなくなり、２つに分ける必要がありました。&lt;br /&gt;rexecプロトコルが勝手にtcpd経由にされ、接続できなくなりました。tcpd嫌いっ&lt;br /&gt;&lt;br /&gt;Apache、samba辺りは設定もややこしく毎回見直すべきなのは、それなりに。&lt;br /&gt;&lt;br /&gt;まぁそれでもいい感じにアップグレードできたと思います。&lt;br /&gt;ちなみにGCC周りが4.1から4.3にアップグレードされていますが、なぜか4.1のパッケージも残ったままなので手動で消す必要があります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-115661337617387793?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/115661337617387793/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=115661337617387793' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/115661337617387793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/115661337617387793'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/02/debian-50-lenny.html' title='Debian 5.0 lenny'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6170491703510259684</id><published>2009-02-06T07:39:00.003+09:00</published><updated>2009-02-06T07:57:43.689+09:00</updated><title type='text'>ADODB.SreamのSaveToFile()メソッド</title><content type='html'>ADODB.SreamオブジェクトにSaveToFile()メソッドがあります。書き込みのオプションとして&lt;a href="http://msdn.microsoft.com/ja-jp/library/cc389870.aspx"&gt;SaveOptionsEnum&lt;/a&gt;を設定します。これによると…&lt;table style="border: 1px solid gray;"&gt;&lt;tr&gt;&lt;td&gt;adSaveCreateNotExist&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;既定値です。FileNameパラメータで指定したファイルがない場合は新しいファイルが作成されます。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;adSaveCreateOverWrite&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;FileNameパラメータで指定したファイルがある場合は、現在開かれているStreamオブジェクトのデータでファイルが上書きされます。&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;一見普通のEnumです。&lt;br /&gt;でもよく読むと…&lt;blockquote&gt;これらの値はAND演算子で結合することができます。&lt;/blockquote&gt;ちょっと待て。新規作成もしくは上書きをするにはAND結合？ 1と2をAND結合すると0ですよね？ ね？&lt;br /&gt;こういうとき普通はOR結合して3になりませんか？ いえ、値が重複していない以上、識別は可能ですが。&lt;br /&gt;で、試してみる……0→引数エラー、1→OK、2→OK、3→引数エラー。&lt;br /&gt;あれっ？ ANDもORも受け付けないんですが。&lt;br /&gt;&lt;br /&gt;仕方がないのでSRきりました。最終回答は出ていないもののドキュメントミスで次のようになるらしいとのこと。&lt;table style="border: 1px solid gray;"&gt;&lt;tr&gt;&lt;td&gt;adSaveCreateNotExist&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;既定値です。&lt;b&gt;新規作成します。ただし上書きはしません。&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;adSaveCreateOverWrite&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;b&gt;新規作成もしくは上書きします。&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6170491703510259684?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6170491703510259684/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6170491703510259684' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6170491703510259684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6170491703510259684'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/02/adodbsreamsavetofile.html' title='ADODB.SreamのSaveToFile()メソッド'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6562053053729476269</id><published>2009-01-28T09:09:00.003+09:00</published><updated>2009-01-28T09:15:06.685+09:00</updated><title type='text'>Windows 7 RRP</title><content type='html'>世の中、Windows 7βで賑わってますが、RRPというのを試してみました。何の略語かわかりません。&lt;br /&gt;ともかくβのビルド番号が7000でRRPは7022となってました。&lt;br /&gt;よく言われているようにセットアップ直後の感想として早い気がします。Vistaよりスムーズ、動きがなめらかな印象です。&lt;br /&gt;今後、時間を見つけてアプリを入れてソフトの動作確認などもしていこうかと。&lt;br /&gt;&lt;br /&gt;ちなみにβを試している友人と表示を比較させてもらいましたが、文字化けが酷い…悪化してます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6562053053729476269?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6562053053729476269/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6562053053729476269' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6562053053729476269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6562053053729476269'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/01/windows-7-rrp.html' title='Windows 7 RRP'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2063369180963332214</id><published>2009-01-15T21:45:00.003+09:00</published><updated>2009-01-15T22:06:47.731+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>RAIDの拡張</title><content type='html'>Linuxのsoftware RAID（md）の場合、disk controllerをまたがって好きなようにRAIDを構成できるため重宝します。云々は&lt;a href="/2008/02/raid.html"&gt;前&lt;/a&gt;に書きました。&lt;br /&gt;&lt;br /&gt;今回ハードディスクを更新したので、RAIDの拡張をしてみました。&lt;br /&gt;&lt;blockquote class="code"&gt;md2 : active raid5 sdf[0] sdg[3] sde[2] sdh[1]&lt;/blockquote&gt;という４玉構成のRAID5に対してsda4とsdc4を追加して６玉構成にしようと思います。&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="code"&gt;# mdadm /dev/md2 -a /dev/sda4&lt;br /&gt;# mdadm /dev/md2 -a /dev/sdc4&lt;br /&gt;# mdadm /dev/md2 -G -n 6&lt;/blockquote&gt;最初にSpare Devicesとして２玉追加し、次にgrowコマンドでActive Devicesを６玉に変更します。えー、7800min後に完了とか言い出しました。&lt;br /&gt;&lt;br /&gt;よく見ると&lt;blockquote class="code"&gt;md: reshape of RAID array md2&lt;br /&gt;md: minimum _guaranteed_  speed: 1000 KB/sec/disk.&lt;br /&gt;md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reshape.&lt;br /&gt;md: using 128k window, over a total of 488386496 blocks.&lt;/blockquote&gt;とか言って本気を出していません。&lt;br /&gt;こんなときLinux Kernelはオープンソースなので出しているメッセージや理由、どうすればいいかなどをソースコードから調べることができます。&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="code"&gt;# cat /proc/sys/dev/raid/speed_limit_min &lt;br /&gt;1000&lt;br /&gt;# echo 6000 &amp;gt; /proc/sys/dev/raid/speed_limit_min&lt;/blockquote&gt;他のプロセスの邪魔にならないようにこうやって速度が抑えられていたようです。その上で、早く完了させたいためスピードアップしてみました。これで残り1300minに…それでも丸一日かかるのね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2063369180963332214?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2063369180963332214/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2063369180963332214' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2063369180963332214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2063369180963332214'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/01/raid.html' title='RAIDの拡張'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2287887760093049931</id><published>2009-01-11T20:01:00.002+09:00</published><updated>2009-01-11T20:21:41.123+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>S.M.A.R.T on Linux</title><content type='html'>久々にハードディスクの健康状態が知りたくなり、smartmontoolsで情報を見てみました。&lt;br /&gt;まずはありきたりなところからHDDの温度&lt;blockquote class="code"&gt;# for d in a b c d e f g h; do echo -n "sd$d "; smartctl -a -d ata /dev/sd$d|grep Temperature_Celsius; done&lt;br /&gt;sda 194 Temperature_Celsius     0x0022   035   055   000    Old_age   Always       -       35 (Lifetime Min/Max 0/17)&lt;br /&gt;sdb 194 Temperature_Celsius     0x0002   196   196   000    Old_age   Always       -       28 (Lifetime Min/Max 16/55)&lt;br /&gt;sdc 194 Temperature_Celsius     0x0002   196   196   000    Old_age   Always       -       28 (Lifetime Min/Max 16/58)&lt;br /&gt;sdd 194 Temperature_Celsius     0x0022   034   047   000    Old_age   Always       -       34 (Lifetime Min/Max 0/16)&lt;br /&gt;sde 194 Temperature_Celsius     0x0002   214   214   000    Old_age   Always       -       28 (Lifetime Min/Max 14/50)&lt;br /&gt;sdf 194 Temperature_Celsius     0x0022   120   099   000    Old_age   Always       -       30&lt;br /&gt;sdg 194 Temperature_Celsius     0x0002   230   230   000    Old_age   Always       -       26 (Lifetime Min/Max 14/38)&lt;br /&gt;sdh 194 Temperature_Celsius     0x0022   120   097   000    Old_age   Always       -       30&lt;/blockquote&gt;あからさまな温度差はなさそうです。&lt;br /&gt;次にread error&lt;blockquote class="code"&gt;# for d in a b c d e f g h; do echo -n "sd$d "; smartctl -a -d ata /dev/sd$d|grep Raw_Read_Error_Rate; done&lt;br /&gt;sda   1 Raw_Read_Error_Rate     0x000f   109   099   006    Pre-fail  Always       -       0&lt;br /&gt;sdb   1 Raw_Read_Error_Rate     0x000b   094   094   016    Pre-fail  Always       -       851977&lt;br /&gt;sdc   1 Raw_Read_Error_Rate     0x000b   085   085   016    Pre-fail  Always       -       6029424&lt;br /&gt;sdd   1 Raw_Read_Error_Rate     0x000f   119   091   006    Pre-fail  Always       -       0&lt;br /&gt;sde   1 Raw_Read_Error_Rate     0x000b   100   100   016    Pre-fail  Always       -       0&lt;br /&gt;sdf   1 Raw_Read_Error_Rate     0x000f   200   200   051    Pre-fail  Always       -       0&lt;br /&gt;sdg   1 Raw_Read_Error_Rate     0x000b   100   100   016    Pre-fail  Always       -       0&lt;br /&gt;sdh   1 Raw_Read_Error_Rate     0x000f   200   200   051    Pre-fail  Always       -       0&lt;/blockquote&gt;sdbとsdcでエラーが出てる…そろそろやばいかも。&lt;br /&gt;&lt;br /&gt;そして「for d in a b c d e f g h; do echo sd$d; smartctl -A -d ata /dev/sd$d; done」を眺めて気になる表示をピックアップ。&lt;blockquote class="code"&gt;sda 190 Unknown_Attribute       0x0022   064   045   045    Old_age   Always   In_the_past 756809764&lt;br /&gt;sda 195 Hardware_ECC_Recovered  0x001a   061   058   000    Old_age   Always       -       6361756&lt;br /&gt;sdd 190 Unknown_Attribute       0x0022   064   053   045    Old_age   Always       -       740032548&lt;br /&gt;sdd 195 Hardware_ECC_Recovered  0x001a   067   064   000    Old_age   Always       -       42581156&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;そこでテストを実行し、エラーの確認&lt;br /&gt;&lt;blockquote class="code"&gt;# for d in a b c d e f g h; do smartctl -t short -d ata /dev/sd$d; done&lt;br /&gt;# for d in a b c d e f g h; do echo "sd$d "; smartctl -l error -d ata /dev/sd$d; done&lt;br /&gt;（特にエラーなし）&lt;br /&gt;# for d in a b c d; do smartctl -t long -d ata /dev/sd$d; done&lt;br /&gt;# for d in a b c d e f g h; do echo sd$d; smartctl -l selftest -d ata /dev/sd$d; done&lt;br /&gt;sbc &lt;br /&gt;Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error&lt;br /&gt;# 1  Extended offline    Completed: read failure       30%     22500         387518271&lt;br /&gt;&lt;/blockquote&gt;うわーsbcダメかも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2287887760093049931?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2287887760093049931/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2287887760093049931' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2287887760093049931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2287887760093049931'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2009/01/smart-on-linux.html' title='S.M.A.R.T on Linux'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4771989833755107583</id><published>2008-12-28T14:31:00.004+09:00</published><updated>2008-12-28T15:00:45.070+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>DataContractJsonSerializerでDictionaryを表現</title><content type='html'>DataContractJsonSerializerはまじめなので、.NETとJSONとの双方向で型が復元されることを前提にしています。そのため、Dictionary&amp;lt;TKey,TValue&amp;gt;を素直にobject表現してくれません。（TKeyがstringに限定され、intなどが復元できないため。TValueの型が不明なため。）&lt;br /&gt;具体的にどうなるかというと&lt;blockquote class="code"&gt;new Dictionary&amp;lt;string,object&amp;gt;{ { "abc", 1 }, { "def", "ghi" } };&lt;/blockquote&gt;は&lt;blockquote class="code"&gt;[{"Key":"abc","Value":1},{"Key":"def","Value":"ghi"}]&lt;/blockquote&gt;になります。&lt;br /&gt;一般的にJSONを扱う人は&lt;blockquote class="code"&gt;{"abc":1,"def":"ghi"}&lt;/blockquote&gt;を期待していることでしょう。&lt;br /&gt;&lt;br /&gt;どうにかしたいと思い、必死に対策を考え、遂に実現しました。&lt;blockquote class="code"&gt;class Surrogate: IDataContractSurrogate {&lt;br /&gt;    [Serializable]&lt;br /&gt;    class JsonDictionary: ISerializable {&lt;br /&gt;        Dictionary&amp;lt;string, object&amp;gt; Dictionary { get; set; }&lt;br /&gt;        public JsonDictionary( Dictionary&amp;lt;string, object&amp;gt; dictionary ) {&lt;br /&gt;            Dictionary = dictionary;&lt;br /&gt;        }&lt;br /&gt;        public void GetObjectData( SerializationInfo info, StreamingContext context ) {&lt;br /&gt;            foreach( var pair in Dictionary )&lt;br /&gt;                info.AddValue( pair.Key, pair.Value );&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Type GetDataContractType( Type type ) {&lt;br /&gt;        return type == typeof( Dictionary&amp;lt;string, object&amp;gt; ) ? typeof( JsonDictionary ) : type;&lt;br /&gt;    }&lt;br /&gt;    public object GetObjectToSerialize( object obj, Type targetType ) {&lt;br /&gt;        var dictionary = obj as Dictionary&amp;lt;string, object&amp;gt;;&lt;br /&gt;        if( obj == null )&lt;br /&gt;            throw new NotImplementedException();&lt;br /&gt;        return new JsonDictionary( dictionary );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #region NotImplemented&lt;br /&gt;    object IDataContractSurrogate.GetCustomDataToExport( Type clrType, Type dataContractType ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    object IDataContractSurrogate.GetCustomDataToExport( MemberInfo memberInfo, Type dataContractType ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    object IDataContractSurrogate.GetDeserializedObject( object obj, Type targetType ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    void IDataContractSurrogate.GetKnownCustomDataTypes( Collection&amp;lt;Type&amp;gt; customDataTypes ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    Type IDataContractSurrogate.GetReferencedTypeOnImport( string typeName, string typeNamespace, object customData ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    CodeTypeDeclaration IDataContractSurrogate.ProcessImportedType( CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit ) {&lt;br /&gt;        throw new NotImplementedException();&lt;br /&gt;    }&lt;br /&gt;    #endregion&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;あとはDataContractJsonSerializerコンストラクタのIDataContractSurrogate引数にSurrogateインスタンスを渡せば、変換してくれます。&lt;br /&gt;もちろん型保証が外れるため、deserializeはできません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4771989833755107583?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4771989833755107583/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4771989833755107583' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4771989833755107583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4771989833755107583'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/12/datacontractjsonserializerdictionary.html' title='DataContractJsonSerializerでDictionaryを表現'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-5998575469702161025</id><published>2008-12-16T23:32:00.002+09:00</published><updated>2008-12-17T00:20:24.941+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Regexp'/><title type='text'>グループ定義の均等化 Balancing group definition</title><content type='html'>グループ定義の均等化と言われても、何のことかさっぱり想像がつきませんが、.NET Frameworkの正規表現に不思議な機能があります。実際、役立つシーンがあります。&lt;br /&gt;ネストされる()のペアを対応関係を維持しつつマッチさせたい、というときに使えます。具体的にはCの関数呼び出しやキャストなど。&lt;br /&gt;&lt;blockquote class="code"&gt;(?:(?'Open'&amp;lt;)[^&amp;lt;&amp;gt;]*)+(?:(?'Close-Open'&amp;gt;)[^&amp;lt;&amp;gt;]*)+&lt;/blockquote&gt;丸括弧だと正規表現エスケープで読みづらくなるため山括弧の一致にしていますが、もちろん丸括弧でも対応できます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-5998575469702161025?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/5998575469702161025/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=5998575469702161025' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5998575469702161025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5998575469702161025'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/12/balancing-group-definition.html' title='グループ定義の均等化 Balancing group definition'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1158376090998052463</id><published>2008-12-16T21:59:00.010+09:00</published><updated>2008-12-16T23:02:11.411+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><title type='text'>べき乗 pow() xy</title><content type='html'>ふとべき乗計算を考えてみた。&lt;blockquote class="code"&gt;double pow( double x, int y ){&lt;br /&gt;  return y &amp;gt; 0 ? pow( x, y - 1 ) * x : 1;&lt;br /&gt;}&lt;/blockquote&gt;整数の時は簡単。&lt;br /&gt;&lt;br /&gt;実数になると&lt;blockquote class="code"&gt;__declspec(noinline) double pow( double x, double y ){&lt;br /&gt;  __asm{&lt;br /&gt;    fld y&lt;br /&gt;    fld x&lt;br /&gt;    fyl2x&lt;br /&gt;    fst ST(1)&lt;br /&gt;    frndint&lt;br /&gt;    fxch ST(1)&lt;br /&gt;    fsub ST(0), ST(1)&lt;br /&gt;    f2xm1&lt;br /&gt;    fld1&lt;br /&gt;    faddp ST(1), ST(0)&lt;br /&gt;    fscale&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;なんかinline assemblerを使ってしまった。うん、何やってるのかさっぱりです。命令とそのときのスタック状態を表にすると&lt;br /&gt;&lt;table style="border: 1px solid gray"&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;ST(0)&lt;/th&gt;&lt;th&gt;ST(1)&lt;/th&gt;&lt;th&gt;ST(2)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fld y&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fld x&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fyl2x&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fst ST(1)&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;frndint&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fxch ST(1)&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fsub ST(0), ST(1)&lt;/td&gt;&lt;td&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;f2xm1&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;-1&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fld1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;-1&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;faddp ST(1), ST(0)&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fscale&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;&amp;#215;2&lt;sup&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;ここで&lt;span style="font-size: larger"&gt;2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt;&amp;#215;2&lt;sup&gt;&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt; = 2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x-&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;+&amp;#8970;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&amp;#8971;&lt;/sup&gt; = 2&lt;sup&gt;y&amp;#215;log&lt;sub&gt;2&lt;/sub&gt;x&lt;/sup&gt; = x&lt;sup&gt;y&lt;/sup&gt;&lt;/span&gt;です。&lt;br /&gt;はい、さっぱりわかりませんでした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1158376090998052463?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1158376090998052463/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1158376090998052463' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1158376090998052463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1158376090998052463'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/12/pow-x-y.html' title='べき乗 pow() x&lt;sup&gt;y&lt;/sup&gt;'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3653833685336107353</id><published>2008-12-03T08:49:00.004+09:00</published><updated>2008-12-03T09:00:58.600+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ファイルの高速コピー</title><content type='html'>Webサイトのコンテンツを更新するとき、ローカルディスクからWebサーバにアップロード（ファイルのコピー）をしていますが、ファイル数が多くてExplorerじゃとてもとても。&lt;br /&gt;調べたところFastCopyとかコピーツールがありましたが、ふとC#で書いてみたらどうなるんだろう、と。&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="code"&gt;static void Copy( FileInfo source, FileInfo destination ) {&lt;br /&gt;  var src = new FileStream( source.FullName, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true );&lt;br /&gt;  var buffer = new byte[ source.Length ];&lt;br /&gt;  src.BeginRead( buffer, 0, buffer.Length, rar =&amp;gt; {&lt;br /&gt;    src.EndRead( rar );&lt;br /&gt;    src.Close();&lt;br /&gt;    if( destination.Exists )&lt;br /&gt;      destination.Attributes &amp;amp;= ~FileAttributes.ReadOnly;&lt;br /&gt;    var dst = new FileStream( destination.FullName, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true );&lt;br /&gt;    dst.BeginWrite( buffer, 0, buffer.Length, war =&amp;gt; {&lt;br /&gt;　    dst.EndWrite( war );&lt;br /&gt;      dst.Close();&lt;br /&gt;    }, null );&lt;br /&gt;  }, null );&lt;br /&gt;}&lt;br /&gt;static void Copy( DirectoryInfo source, DirectoryInfo destination ) {&lt;br /&gt;  if( !destination.Exists )&lt;br /&gt;    destination.Create();&lt;br /&gt;  foreach( var src in source.GetDirectories() )&lt;br /&gt;    Copy( src, new DirectoryInfo( Path.Combine( destination.FullName, src.Name ) ) );&lt;br /&gt;  var srcfiles = source.GetFiles();&lt;br /&gt;  foreach( var dst in destination.GetFiles() )&lt;br /&gt;    if( !srcfiles.Any( src =&amp;gt; String.Equals( src.Name, dst.Name, StringComparison.OrdinalIgnoreCase ) ) )&lt;br /&gt;      dst.Delete();&lt;br /&gt;  foreach( var src in srcfiles )&lt;br /&gt;    Copy( src, new FileInfo( Path.Combine( destination.FullName, src.Name ) ) );&lt;br /&gt;}&lt;br /&gt;static void Main( string[] args ) {&lt;br /&gt;  Copy( new DirectoryInfo( args[ 0 ] ), new DirectoryInfo( args[ 1 ] ) );&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;まずはお試しで、属性やタイムスタンプなどは保存しませんが。&lt;br /&gt;で、コピー時間ですがFastCopyが740秒なのに対して、C#は200秒…。&lt;br /&gt;何も考えずに並列でファイルオープンしているためハンドル数やバッファサイズなど問題点はいろいろあるとは思いますが、この所要時間の差はいったい…？！&lt;br /&gt;ちなみにこのコード、途中に1回だけ30秒間ストールが発生しています。この問題を解決すれば更に30秒短くなるはず…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3653833685336107353?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3653833685336107353/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3653833685336107353' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3653833685336107353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3653833685336107353'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/12/blog-post.html' title='ファイルの高速コピー'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4835317234116542849</id><published>2008-11-29T22:33:00.004+09:00</published><updated>2008-11-29T22:59:17.043+09:00</updated><title type='text'>PtrToStructureArray(): 配列のマーシャリング</title><content type='html'>Marshal.PtrToStructure()を使うと、メモリの内容を元に構造体などを復元することができます。これでC言語などとデータをやりとりできるようになります。&lt;br /&gt;構造体の配列に関してもMarshalAs属性を使用すれば扱えますが、この場合、コンパイル時にサイズを決定した固定長配列に限られます。&lt;br /&gt;そこで、実行時にサイズを決定できるPtrToStructureArray()を作ってみました。どれほど使い道があるやら。&lt;br /&gt;&lt;blockquote class="code"&gt;public class Marshal{&lt;br /&gt;  static ModuleBuilder moduleBuilder;&lt;br /&gt;  static ModuleBuilder ModuleBuilder {&lt;br /&gt;    get {&lt;br /&gt;      if( moduleBuilder == null ) {&lt;br /&gt;        var name = new AssemblyName( "Sayuri.Dynamic" );&lt;br /&gt;        var ab = AppDomain.CurrentDomain.DefineDynamicAssembly( name, AssemblyBuilderAccess.Run );&lt;br /&gt;        moduleBuilder = ab.DefineDynamicModule( name.Name );&lt;br /&gt;      }&lt;br /&gt;      return moduleBuilder;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  public static T[] PtrToStructureArray&amp;lt;T&amp;gt;( IntPtr ptr, int size ) {&lt;br /&gt;    var type = typeof(T);&lt;br /&gt;    var typeName = string.Format( "{0}Array{1}", type.Name, size );&lt;br /&gt;    var arrayType = ModuleBuilder.GetType( typeName );&lt;br /&gt;    if( arrayType == null ){&lt;br /&gt;      var tb = ModuleBuilder.DefineType( typeName, TypeAttributes.SequentialLayout );&lt;br /&gt;      var fb = tb.DefineField( "array", type.MakeArrayType(), FieldAttributes.Public|FieldAttributes.HasFieldMarshal );&lt;br /&gt;      var ctype = typeof( MarshalAsAttribute );&lt;br /&gt;      var cb = new CustomAttributeBuilder( ctype.GetConstructor( new[] { typeof( UnmanagedType ) } ),&lt;br /&gt;        new object[] { UnmanagedType.ByValArray }, new[] { ctype.GetField( "SizeConst" ) }, new object[] { size } );&lt;br /&gt;      fb.SetCustomAttribute( cb );&lt;br /&gt;      arrayType = tb.CreateType();&lt;br /&gt;    }&lt;br /&gt;    var obj = SystemMarshal.PtrToStructure( ptr, arrayType );&lt;br /&gt;    var fi = arrayType.GetField( "array" );&lt;br /&gt;    return (T[])fi.GetValue( obj );&lt;br /&gt;  }&lt;br /&gt;}&lt;/blockquote&gt;やってることはT型とサイズ20が与えられた場合に&lt;blockquote class="code"&gt;[StructLayout(LayoutKind.Sequential)]&lt;br /&gt;class &lt;strong&gt;T&lt;/strong&gt;Array&lt;strong&gt;20&lt;/strong&gt;{&lt;br /&gt;  [MarshalAs(UnmanagedType.ByValArray, SizeConst=&lt;strong&gt;20&lt;/strong&gt;)]&lt;br /&gt;  public &lt;strong&gt;T&lt;/strong&gt;[] array;&lt;br /&gt;}&lt;/blockquote&gt;というクラスをその場で生成して使っています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4835317234116542849?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4835317234116542849/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4835317234116542849' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4835317234116542849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4835317234116542849'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/11/ptrtostructurearray.html' title='PtrToStructureArray(): 配列のマーシャリング'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7738038537118456245</id><published>2008-11-28T08:45:00.004+09:00</published><updated>2008-11-28T09:27:16.026+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>IComparable&lt;T&gt;とその派生</title><content type='html'>以前、&lt;a href="http://www.blogger.com/2008/01/dictionary-tvalue.html"&gt;Dictionary&amp;lt;TKey, TValue&amp;gt;とIEquatable&amp;lt;T&amp;gt;&lt;/a&gt;で実行時エラーもなくハマる問題を書きましたが、今度は類似で実行時エラーでわかる問題がありました。&lt;br /&gt;&lt;blockquote class="code"&gt;class Base: IComparable&amp;lt;Base&amp;gt;{&lt;br /&gt;}&lt;br /&gt;class Derived: Base{&lt;br /&gt;}&lt;/blockquote&gt;とした場合、DerivedはIComparable&amp;lt;Base&amp;gt;を実装するため、通常の比較は行えます。しかしIComparable&amp;lt;Derived&amp;gt;は実装していないため、List&amp;lt;Derived&amp;gt;.Sort()などは行えません。&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="code"&gt;class Base&amp;lt;T&amp;gt;: IComparable&amp;lt;T&amp;gt; where T: Base{&lt;br /&gt;}&lt;br /&gt;class Derived: Base&amp;lt;Derived&amp;gt;{&lt;br /&gt;}&lt;/blockquote&gt;とかやり出すか、素直にIComparableに切り替えるか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7738038537118456245?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7738038537118456245/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7738038537118456245' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7738038537118456245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7738038537118456245'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/11/icomparable.html' title='IComparable&amp;lt;T&amp;gt;とその派生'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2235039035138493280</id><published>2008-11-04T08:01:00.009+09:00</published><updated>2008-11-04T08:45:09.810+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>swprintf()とwsprintf()</title><content type='html'>Cランタイムライブラリにsprintf()があります。同様の機能を持つwsprintf()がUSER32.dllにもあります。実はsprintf()はntdll.dllにもあります。&lt;br /&gt;&lt;br /&gt;これらの関係を整理すると&lt;table style="border-style: solid; border-width: 1px;"&gt;&lt;tr&gt;&lt;th&gt;宣言&lt;/th&gt;&lt;th&gt;DLL&lt;/th&gt;&lt;th&gt;TCHAR.Hのルーチン&lt;/th&gt;&lt;th&gt;ANSI版&lt;/th&gt;&lt;th&gt;Unicode版&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tchar.h&lt;/td&gt;&lt;td&gt;MSVCRT90.dll&lt;/td&gt;&lt;td&gt;_stprintf()&lt;/td&gt;&lt;td&gt;sprintf()&lt;/td&gt;&lt;td&gt;swprintf()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;windows.h&lt;/td&gt;&lt;td&gt;USER32.dll&lt;/td&gt;&lt;td&gt;wsprintf()&lt;/td&gt;&lt;td&gt;wsprintfA()&lt;/td&gt;&lt;td&gt;wsprintfW()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;ntdll.dll&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;sprintf()&lt;/td&gt;&lt;td&gt;swprintf()&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;となります。&lt;br /&gt;&lt;br /&gt;ちなみに注意点がいくつか。&lt;br /&gt;swprintf()の第２引数はバッファサイズで書式指定文字列は第３引数にずれています。他のものは第２引数が書式指定文字列です。代わりに他のものと互換のある_swprintf()も第２引数が書式指定文字列になっています。&lt;br /&gt;wsprintf()は指定できる書式に制限があります。例えば浮動小数（%f）がサポートされていません。&lt;br /&gt;ntdll.dllに含まれるsprintf()は使用方法が公開されてなく、サポートされている機能も公開されていません。ただし、全てのプロセスにロードされるDLLなので何かの役に立つかも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2235039035138493280?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2235039035138493280/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2235039035138493280' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2235039035138493280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2235039035138493280'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/11/swprintfwsprintf.html' title='swprintf()とwsprintf()'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-535644273067035001</id><published>2008-11-03T23:30:00.000+09:00</published><updated>2008-11-03T23:30:48.792+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>CallNextHookEx()のHHOOK引数</title><content type='html'>SetWindowsHookEx( WH_CBT, CBTProc, ... )でDLL injectionしています。この&lt;a href="http://msdn.microsoft.com/en-us/library/ms644977(VS.85).aspx"&gt;CBTProc()のドキュメント&lt;/a&gt;によると、正確な型宣言は&lt;blockquote class="code"&gt;LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam );&lt;/blockquote&gt;です。そしてこのhookプロシージャの中ではnCodeが負のときはCallNextHookEx()を呼び更にその戻り値を返すこととあります。&lt;br /&gt;&lt;br /&gt;さて&lt;a href="http://msdn.microsoft.com/en-us/library/ms644974(VS.85).aspx"&gt;CallNextHookEx()のドキュメント&lt;/a&gt;によると、正確な型宣言は&lt;blockquote class="code"&gt;LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam );&lt;/blockquote&gt;です。ちなみに記述が矛盾していて、CallNextHookEx()の呼び出しはoptionalだが、呼び出すことを強く推奨するそうです。CBTProc()側では負の時呼べばいいのに、こう書かれてしまうと0または正の時にも呼ばざるを得なくなります。仕方がないので呼ぶことにしましょう。&lt;br /&gt;&lt;br /&gt;問題はここからです。CallNextHookEx()の第一引数hhk。hookプロシージャは進入した各プロセスで実行されます。にもかかわらずCBTProc()には存在しないパラメータが要求されています。とても面倒くさいですが、SetWindowsHookEx()の戻り値を共有メモリに格納しておき、それを読み出して使っていました。&lt;br /&gt;&lt;br /&gt;ところが今日ふと気がついたら、&lt;blockquote&gt;Windows NT/XP/2003: Ignored.&lt;/blockquote&gt;などと書かれているではありませんか。うーん…今まで共有メモリにわざわざ準備していたhhkは無駄でしたか…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-535644273067035001?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/535644273067035001/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=535644273067035001' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/535644273067035001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/535644273067035001'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/11/callnexthookexhhook.html' title='CallNextHookEx()のHHOOK引数'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-5335257127497710506</id><published>2008-11-01T20:04:00.001+09:00</published><updated>2008-11-01T20:07:25.298+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>ウィンドウプロシージャとメンバ関数その２</title><content type='html'>&lt;a href="/2008/10/blog-post_26.html"&gt;ウィンドウプロシージャとメンバ関数&lt;/a&gt;を書いてみたものの、１つのthreadに複数のWindow Procedureが混在する場合、うまく振り分けできませんね。&lt;br /&gt;どうすればいいんだろう…？ まぁ、複数Windowを扱ったことがないからいいけど…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-5335257127497710506?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/5335257127497710506/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=5335257127497710506' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5335257127497710506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5335257127497710506'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/11/blog-post.html' title='ウィンドウプロシージャとメンバ関数その２'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8985859278128897026</id><published>2008-10-26T23:39:00.006+09:00</published><updated>2008-10-27T00:17:05.526+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>ウィンドウプロシージャとメンバ関数</title><content type='html'>コールバック関数の１つウィンドウプロシージャWindowProc()をクラスメンバ関数にしたいという話。&lt;br /&gt;調べたところ、ATLはlinked listでクラスインスタンスを管理しておき、atlbase.inlファイルのAtlWinModuleExtractCreateWndData()関数でthread idをキーにして検索をしていました。これウィンドウメッセージが届くたびにやってる気がします。&lt;br /&gt;読んで勉強になったのは、CreateWindowを呼び出したスレッドにウィンドウメッセージが届くのね。だからthread idがキーとして使える、と。&lt;br /&gt;&lt;br /&gt;なら１歩進めてthread local storageに情報を置いてしまえばいいのでは？&lt;blockquote class="code"&gt;class Window{&lt;br /&gt;  LRESULT WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,LPARAM lParam ){&lt;br /&gt;    // ここが本体&lt;br /&gt;    ...;&lt;br /&gt;  }&lt;br /&gt;  static __declspec(thread) Window* window;&lt;br /&gt;  static LRESULT CALLBACK StaticWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ){&lt;br /&gt;    return window-&gt;WindowProc( hwnd, uMsg, wParam, lParam );&lt;br /&gt;  }&lt;br /&gt;  void CreateWindowOnThisThread(){&lt;br /&gt;    Window::window = this;&lt;br /&gt;    CreateWindowEx( .../* 適切に */ );&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;Window* Window::window = NULL;&lt;/blockquote&gt;&lt;br /&gt;こうすれば無難な関数に仕上がりました。ちなみにStaticWindowProc()はかなり負担の少ない実装になっていました。&lt;blockquote class="code"&gt;mov  eax, DWORD PTR _lParam$[esp-4]&lt;br /&gt;mov  ecx, DWORD PTR _wParam$[esp-4]&lt;br /&gt;mov  edx, DWORD PTR fs:__tls_array&lt;br /&gt;push ebx&lt;br /&gt;mov  ebx, DWORD PTR _hwnd$[esp]&lt;br /&gt;push eax&lt;br /&gt;mov  eax, DWORD PTR _uMsg$[esp+4]&lt;br /&gt;push ecx&lt;br /&gt;mov  ecx, DWORD PTR [edx]&lt;br /&gt;mov  ecx, DWORD PTR Window::window[ecx]&lt;br /&gt;call Window::WindowProc&lt;br /&gt;pop  ebx&lt;br /&gt;ret  16&lt;br /&gt;; 一部構文に矛盾がありますが、読みやすさのためのデマングルですので…&lt;/blockquote&gt;呼び出し規約がCALLBACKから__thiscallに変わるので、無意味なスタックの積み直しが行われてますが、まぁ仕方がありませんね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8985859278128897026?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8985859278128897026/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8985859278128897026' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8985859278128897026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8985859278128897026'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/10/blog-post_26.html' title='ウィンドウプロシージャとメンバ関数'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7470732781129811505</id><published>2008-10-22T09:10:00.002+09:00</published><updated>2008-10-22T09:16:22.425+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>DateTimeと時差情報</title><content type='html'>DateTime構造体は2.0からKind情報を持つようになり、UTCとローカル時間を区別できるようになりました。これによってどんなことが起きるかというと…&lt;blockquote class="code"&gt;DateTime now = DateTime.Now;&lt;br /&gt;DateTime utcNow = now.ToUniversalTime();&lt;br /&gt;Console.WriteLine( "now {0} utcNow", now == utcNow ? "==" : "!=" );&lt;br /&gt;// =&amp;gt; now != utcNow&lt;/blockquote&gt;ダメじゃん。epoch秒に慣れてる人は確実にはまりますね。&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.datetime.aspx"&gt;MSDN&lt;/a&gt;を読むと…あー書いてある書いてある&lt;blockquote&gt;DateTime オブジェクトの計算および比較では、対象となる複数のオブジェクトが同じタイム ゾーンの時刻を表している場合にのみ、意味のある結果を得ることができます。&lt;/blockquote&gt;裏返せば、タイムゾーンが違ったら意味がない…。&lt;br /&gt;&lt;br /&gt;この場合どうすればいいかというと、DateTimeOffset構造体を使うそうです。ただし、こちらは2.0SP1から。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7470732781129811505?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7470732781129811505/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7470732781129811505' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7470732781129811505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7470732781129811505'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/10/datetime.html' title='DateTimeと時差情報'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2966817754612492922</id><published>2008-10-21T23:14:00.002+09:00</published><updated>2008-10-21T23:36:58.416+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win64'/><title type='text'>Data Entity FrameworkとSQL Server Compact 3.5 SP1</title><content type='html'>Visual Studio 2008 SP1の新機能Data Entity Frameworkを使ってみたくなりました。ついでにずっと気になっていたSQL Server Compact 3.5 SP1と組み合わせて試してみることにしました。&lt;br /&gt;SQL Server Compactはプロセス内で動作する軽量なSQLエンジンです。SQLiteみたいなものと言えばわかりやすいでしょうか。&lt;br /&gt;&lt;br /&gt;Wizardに従って作っていきいざ実行すると…&lt;blockquote&gt;ハンドルされていない例外: System.ArgumentException: 指定されたストア プロバイダが構成内に見つからないか、無効です。&lt;br /&gt; ---&amp;gt; System.ArgumentException: 要求された .Net Framework データ プロバイダが見つかりません。これは、インストールされていない可能性があります。&lt;/blockquote&gt;何を言っているのかわからない例外になります。&lt;br /&gt;「指定されたストア プロバイダ」とか言われてもWizardの生成したデフォルトそのままだし。「データ プロバイダが見つかりません」と言われてもサーバエクスプローラでもWizardでも表示できてるし…。&lt;br /&gt;&lt;br /&gt;いろいろググりましたが見つかりません。ならばまずSQL Server Compact 3.5 SP1を単体で動かしてみましょう…&lt;blockquote&gt;ハンドルされていない例外: System.DllNotFoundException: DLL 'sqlceme35.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)&lt;/blockquote&gt;見つからないってどういうこと？&lt;br /&gt;&lt;br /&gt;ならば&lt;a href="http://msdn.microsoft.com/ja-jp/library/aa983326.aspx"&gt;プライベート ファイル ベースの配置&lt;/a&gt;をしてみましょう…&lt;blockquote&gt;ハンドルされていない例外: System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外: 0x8007000B)&lt;/blockquote&gt;…やっとっわかった気がする。&lt;br /&gt;&lt;br /&gt;&lt;span id="nsrTitle"&gt;&lt;a href="http://download.microsoft.com/download/a/9/1/a91e4ef5-1f16-4ca7-8bd4-6ecaf3a8efe1/ReadmeSSC35.htm"&gt;Microsoft SQL Server Compact 3.5 Readme&lt;/a&gt;や&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/aa983341.aspx"&gt;SQL Server Compact 3.5 と Visual Studio&lt;/a&gt;に色々書いてありました。&lt;ul&gt;&lt;li&gt;SQL Server Compact 3.5 SP1 の 64 ビット リリースは、&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=DC614AEE-7E1C-4881-9C32-3A6CE53384D9"&gt;Microsoft ダウンロード センター&lt;/a&gt;からダウンロードできます (Web からの提供のみ)。&lt;/li&gt;&lt;li&gt;Visual Studio と SQL Server Compact 3.5 で 64 ビット開発を行う場合は、&lt;span class="ui"&gt;[コンパイラの詳細設定]&lt;/span&gt; の &lt;span class="ui"&gt;[ターゲット CPU]&lt;/span&gt; オプションを明示的に &lt;span class="ui"&gt;[x86]&lt;/span&gt; に設定する必要があります。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;ええ、私はVista x64で開発してますよ…。Visual Studio自身が32bitで動作していることを忘れてましたよ。普通、開発環境なんだから64bit版もインストール済みと思うよっ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2966817754612492922?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2966817754612492922/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2966817754612492922' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2966817754612492922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2966817754612492922'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/10/data-entity-frameworksql-server-compact.html' title='Data Entity FrameworkとSQL Server Compact 3.5 SP1'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-18343185451230336</id><published>2008-10-20T14:24:00.004+09:00</published><updated>2008-10-20T14:39:43.157+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ArraySegment classと拡張メソッド</title><content type='html'>C#で部分配列を扱いたくなったとき、unsafe fixedしてpointerを使うこともできますが、ArraySegment classでがんばってみようと思いました。ところがArraySegmentにはインデクサなどのアクセッサが用意されてなく扱いづらいです。&lt;blockquote class="code"&gt;var array = new int[10];&lt;br /&gt;var segment = new ArraySegment&amp;lt;int&amp;gt;( array, 5, 5 );&lt;br /&gt;segment.Array[ segment.Offset + 3 ]; // array[8] 相当&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ここで拡張メソッドを思い出しました。といっても拡張インデクサは実装できません。気を取り直してArray.GetValue()やArray.SetValue()の真似をしてみました。&lt;blockquote class="code"&gt;public static class ArraySegmentUtility{&lt;br /&gt; public static T GetValue&amp;lt;T&amp;gt;( this ArraySegment&amp;lt;T&amp;gt; segment, int index ){&lt;br /&gt;   return segment.Array[ segment.Offset + index ];&lt;br /&gt; }&lt;br /&gt; public static void SetValue&amp;lt;T&amp;gt;( this ArraySegment&amp;lt;T&amp;gt; segment, T value, int index ){&lt;br /&gt;   segment.Array[ segment.Offset + index ] = value;&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;こうすれば最初の例は&lt;blockquote class="code"&gt;segment.GetValue( 3 );&lt;/blockquote&gt;おおいい感じ。&lt;br /&gt;早速使ってみよう…&lt;blockquote class="code"&gt;segment.Array[ segment.Offset + i ] ^= x;&lt;/blockquote&gt;ぽか～ん。アクセッサが用意されてない理由がわかった気がする…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-18343185451230336?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/18343185451230336/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=18343185451230336' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/18343185451230336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/18343185451230336'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/10/arraysegment-class.html' title='ArraySegment classと拡張メソッド'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2946428661260763104</id><published>2008-10-19T19:30:00.003+09:00</published><updated>2008-10-19T19:34:18.794+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>演算子の優先順位</title><content type='html'>自分でも呆れるくらいのミスを…&lt;br /&gt;演算子の優先順位を勘違いしてました。&lt;br /&gt;シフト演算&lt;&lt;や&gt;&gt;よりも先に二項演算子＋や－が結合されるんですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2946428661260763104?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2946428661260763104/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2946428661260763104' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2946428661260763104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2946428661260763104'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/10/blog-post.html' title='演算子の優先順位'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-829753112511854473</id><published>2008-09-30T08:54:00.002+09:00</published><updated>2008-09-30T09:17:46.025+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>XmlWriter.Flush()</title><content type='html'>XmlWriterを使っているとよくXMLが崩れます。ってXmlWriterが悪いような書き方ですが、単に使い方が間違っていました。&lt;br /&gt;普段、auto flushに慣れているわけですが、残念ながらXmlWriterはauto flushモードがなく、定期的にFlush()メソッドを呼び出す必要があります。&lt;br /&gt;といっても、元々buffer fullになればFlush()されるわけですから本当に必要なのは、最後の１回だけです。&lt;br /&gt;デストラクタが自動的にFlush() / Close()してくれるんじゃ…と思いましたがなんとデストラクタがありません。&lt;br /&gt;となると手動でFlush()かClose()かDispose()を呼ぶ必要があるわけですが、Dispose()がpublicではありません。この場合のFlush()は意味が違いますし、Close()で変なステートメントを増やしたくないですし…&lt;br /&gt;&lt;br /&gt;結局、using構文が一番しっくりきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-829753112511854473?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/829753112511854473/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=829753112511854473' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/829753112511854473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/829753112511854473'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/09/xmlwriterflush.html' title='XmlWriter.Flush()'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7704523081090484437</id><published>2008-08-31T22:06:00.005+09:00</published><updated>2008-08-31T22:26:00.343+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>IEでのinherit</title><content type='html'>ググったけど話題になっていなかったので。CSSには親要素から値を継承するinherit値がありますが、実はIEではこれがあまり動作しません。&lt;br /&gt;&lt;blockquote class="code"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;test&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;    body{ font-weight: normal; }&lt;br /&gt;    span{ font-weight: bold; }&lt;br /&gt;    span{ font-weight: inherit; }&lt;br /&gt;  &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;span&amp;gt;normalが継承される&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;spanはbold指定を打ち消し、bodyからnormalを継承しなければなりませんが、IE7ではinherit行自体が指定されていなかったものと見なし、boldで表示されてしまいます。&lt;br /&gt;&lt;br /&gt;ちなみにIE8 beta2で確認したところ、こちらは正しくnormalで表示されていました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7704523081090484437?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7704523081090484437/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7704523081090484437' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7704523081090484437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7704523081090484437'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/08/ieinerit.html' title='IEでのinherit'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2814665559953822048</id><published>2008-08-11T08:00:00.002+09:00</published><updated>2008-08-11T08:08:24.412+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET Framework 3.5 SP1とSQL Server 2008</title><content type='html'>.NET Framework 3.5 SP1 betaとVistal Studio 2008 SP1 betaを試していましたが、.NET Framework 3.5 SP1側がこっそりリリース？されていました。&lt;br /&gt;正確にはダウンロード可能になっていませんし、再配布可能ものジュールも提供されていないのでまだまだ使えませんが、SQL Server 2008にさりげなく入っていました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2814665559953822048?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2814665559953822048/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2814665559953822048' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2814665559953822048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2814665559953822048'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/08/net-framework-35-sp1sql-server-2008.html' title='.NET Framework 3.5 SP1とSQL Server 2008'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4233281086157844385</id><published>2008-07-21T10:45:00.002+09:00</published><updated>2008-07-21T10:55:22.044+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>TextureCoordinates</title><content type='html'>WPFを使って3Dを扱っていたのだが、TextureCoordinatesという概念がよくわからなかった。MSDNの記述もいい加減で&lt;blockquote&gt;テクスチャ座標に関する追加の情報は、後続のトピックまたは Managed Direct3D SDK を参照してください。&lt;/blockquote&gt;と逃げているし…Managed Direct3Dってもう終わったんじゃ？&lt;br /&gt;ググっていたら&lt;a href="http://blogs.msdn.com/danlehen/archive/2005/11/06/489627.aspx"&gt;Daniel Lehenbauer&amp;#39;s Blog : 3D for the Rest of Us: Texture Coordinates&lt;/a&gt;を見つけた。これはわかりやすいかも？&lt;br /&gt;&lt;br /&gt;…何の情報もない投稿だなぁ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4233281086157844385?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4233281086157844385/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4233281086157844385' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4233281086157844385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4233281086157844385'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/07/texturecoordinates.html' title='TextureCoordinates'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-558704728745375921</id><published>2008-05-30T01:09:00.000+09:00</published><updated>2008-05-30T01:09:20.589+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>FizzBuzz Questions</title><content type='html'>思いつきで&lt;a href="http://www.codinghorror.com/blog/archives/000781.html"&gt;FizzBuzz Questions&lt;/a&gt;をやってみる。お題はこちら：&lt;br /&gt;&lt;blockquote&gt;Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;普通に解くと&lt;blockquote class="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;void FizzBuzz( int n ){&lt;br /&gt;  if( n % 15 )&lt;br /&gt;    if( n % 5 )&lt;br /&gt;      if( n % 3 )&lt;br /&gt;        cout &amp;lt;&amp;lt; n;&lt;br /&gt;      else&lt;br /&gt;        cout &amp;lt;&amp;lt; "Fizz";&lt;br /&gt;    else&lt;br /&gt;      cout &amp;lt;&amp;lt; "Buzz";&lt;br /&gt;  else&lt;br /&gt;    cout &amp;lt;&amp;lt; "FizzBuzz";&lt;br /&gt;  cout &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;  for( int i = 1; i &amp;lt; 101; i++ )&lt;br /&gt;    FizzBuzz( i );&lt;br /&gt;}&lt;/blockquote&gt;こんな感じ？&lt;br /&gt;&lt;br /&gt;当たり前ですが実行時に分岐しています。でもTMP（Template MetaProgramming）を使えばコンパイル時に分岐できます。&lt;blockquote class="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;template&amp;lt;int n, int mod3 = n % 3, int mod5 = n % 5&amp;gt;&lt;br /&gt;struct FizzBuzz{&lt;br /&gt;  static ostream&amp;amp; print(){&lt;br /&gt;    return FizzBuzz&amp;lt;n-1&amp;gt;::print() &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;int n, int mod5&amp;gt;&lt;br /&gt;struct FizzBuzz&amp;lt;n, 0, mod5&amp;gt;{&lt;br /&gt;  static ostream&amp;amp; print(){&lt;br /&gt;    return FizzBuzz&amp;lt;n-1&amp;gt;::print() &amp;lt;&amp;lt; "Fizz" &amp;lt;&amp;lt; endl;&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;int n, int mod3&amp;gt;&lt;br /&gt;struct FizzBuzz&amp;lt;n, mod3, 0&amp;gt;{&lt;br /&gt;  static ostream&amp;amp; print(){&lt;br /&gt;    return FizzBuzz&amp;lt;n-1&amp;gt;::print() &amp;lt;&amp;lt; "Buzz" &amp;lt; endl;&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;int n&amp;gt;&lt;br /&gt;struct FizzBuzz&amp;lt;n, 0, 0&amp;gt;{&lt;br /&gt;  static ostream&amp;amp; print(){&lt;br /&gt;    return FizzBuzz&amp;lt;n-1&amp;gt;::print() &amp;lt;&amp;lt; "FizzBuzz" &amp;lt;&amp;lt; endl;&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;template&amp;lt;&amp;gt; ostream&amp;amp; FizzBuzz&amp;lt;0&amp;gt;::print(){&lt;br /&gt;  return cout;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;  FizzBuzz&amp;lt;100&amp;gt;::print();&lt;br /&gt;}&lt;/blockquote&gt;本当はループ展開とかもTMPでできるかも…でもやり方がよくわかりませんでした。&lt;br /&gt;&lt;br /&gt;しかし更にすごい方法が…&lt;blockquote class="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;boost/preprocessor/arithmetic/mod.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/preprocessor/control/if.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/preprocessor/repetition/repeat_from_to.hpp&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;#define FizzBuzz( z, n, data )            \&lt;br /&gt;  BOOST_PP_IF( BOOST_PP_MOD( n, 15 ),     \&lt;br /&gt;    BOOST_PP_IF( BOOST_PP_MOD( n, 5 ),    \&lt;br /&gt;      BOOST_PP_IF( BOOST_PP_MOD( n, 3 ),  \&lt;br /&gt;        #n,                               \&lt;br /&gt;        "Fizz" ),                         \&lt;br /&gt;      "Buzz" ),                           \&lt;br /&gt;    "FizzBuzz" )                          \&lt;br /&gt;  "\n"&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;  cout &amp;lt;&amp;lt; BOOST_PP_REPEAT_FROM_TO( 1, 101, FizzBuzz, );&lt;br /&gt;}&lt;/blockquote&gt;コンパイル前にすべての処理を終わらせてしまい、preprocessorだけで単一の文字列を作り上げてしまうことも。いやはや。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-558704728745375921?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/558704728745375921/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=558704728745375921' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/558704728745375921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/558704728745375921'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/05/fizzbuzz-questions.html' title='FizzBuzz Questions'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7122722593729932728</id><published>2008-05-16T08:46:00.004+09:00</published><updated>2008-05-16T09:00:49.650+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>SslStream</title><content type='html'>&lt;a href="http://www.blogger.com/2008/05/boostasio.html"&gt;Boost.Asio&lt;/a&gt;を書いたけど、.NET Frameworkにも同様にSslStreamクラスが用意されている。&lt;br /&gt;使い方もほぼ同じで&lt;blockquote class="code"&gt;var c = new TcpClient( "ホスト名", 443 );&lt;br /&gt;var s = new SslStream( c.GetStream() );&lt;br /&gt;&lt;br /&gt;s.AuthenticateAsClient( "ホスト名" );&lt;br /&gt;&lt;br /&gt;s.Write( Encoding.Default.GetBytes( "GET / HTTP/1.0\r\n\r\n" ) );&lt;br /&gt;&lt;br /&gt;var r = new StreamReader( s, Encoding.Default );&lt;br /&gt;Console.WriteLine( r.ReadToEnd() );&lt;/blockquote&gt;こんな感じ。違いは&lt;ul&gt;&lt;li&gt;Windows環境ではgetservbyname()が信用できないので直接443と書いている点&lt;/li&gt;&lt;li&gt;.NET FrameworkはByteとCharを区別しているので明示的な変換が必要になる点&lt;/li&gt;&lt;li&gt;Byte→Char変換を中断するのは面倒くさいのでReadToEnd()ですべて読み込んでしまっている点&lt;/li&gt;&lt;/ul&gt;でしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7122722593729932728?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7122722593729932728/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7122722593729932728' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7122722593729932728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7122722593729932728'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/05/sslstream.html' title='SslStream'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8999404888255168227</id><published>2008-05-16T00:00:00.004+09:00</published><updated>2008-05-16T09:05:10.866+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Boost.Asio</title><content type='html'>BoostというC++ライブラリが気になっていたのですが、1.35がリリースされ、Boost.Asioという非同期I/Oライブラリが追加されていることを知りました。このライブラリはWindows、Linux、各種Unix上で動作し、各種コンパイラをサポートしています。さらによく見たらOpenSSLによるSSLまでサポートしていました。&lt;br /&gt;&lt;br /&gt;まずは試しに同期I/Oでhttps clientを書いてみました。&lt;br /&gt;&lt;blockquote class="code"&gt;io_service i;&lt;br /&gt;ssl::context c( i, ssl::context::sslv3_client );&lt;br /&gt;ssl::stream&lt;ip::tcp::socket&gt; s( i, c );&lt;br /&gt;s.lowest_layer().connect( *ip::tcp::resolver(i)&lt;br /&gt;  .resolve( ip::tcp::resolver::query( "ホスト名", "https" )  ) );&lt;br /&gt;&lt;br /&gt;s.handshake( ssl::stream_base::client );&lt;br /&gt;&lt;br /&gt;write( s, buffer( "GET / HTTP/1.0\r\n\r\n" ) );&lt;br /&gt;&lt;br /&gt;asio::streambuf res;&lt;br /&gt;error_code e;&lt;br /&gt;while( read( s, res, transfer_at_least(1), e ) )&lt;br /&gt;  cout &amp;lt;&amp;lt; &amp;amp;res;&lt;/blockquote&gt;うーん、これだけで動いちゃいました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8999404888255168227?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8999404888255168227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8999404888255168227' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8999404888255168227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8999404888255168227'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/05/boostasio.html' title='Boost.Asio'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6686036777851064083</id><published>2008-04-26T09:02:00.002+09:00</published><updated>2008-04-26T09:10:13.400+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>Windows XP SP3</title><content type='html'>Windows XP SP3が公開されたようです。Release To Manufacturing(RTM)後、１週間ほどでRelease To Web(RTW)されるそうです。&lt;br /&gt;SP2と互換は高いという噂なので特に言及することもなさそうでしたが…１点、すでにWindows Vistaがリリースされていることもあり、Windows XP with SP3は作られないとかなんとか。というわけで後からSP3を追加する形のみになるようです。…ちなみにSP3のインストール条件にSP1が入っていました。つまり素のXPには一旦SP1aかSP2を入れた後にSP3を入れることになるようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6686036777851064083?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6686036777851064083/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6686036777851064083' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6686036777851064083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6686036777851064083'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/04/windows-xp-sp3.html' title='Windows XP SP3'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-842619238415100383</id><published>2008-03-29T14:06:00.001+09:00</published><updated>2008-03-29T14:10:52.111+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>インサイドWindows第４版下</title><content type='html'>&lt;a href="/2007/11/windows.html"&gt;インサイドWindows第４版上&lt;/a&gt;に続いてようやくインサイドWindows第４版下を買えました。近くの本屋さんにはいつ見ても上しか置いてなくて…でも注文するのは負けた気がするし。&lt;br /&gt;読んでいて一つ参考になった話題を。大容量のメモリを搭載しているWindows XPでもタスクマネージャのシステムキャッシュを見ると512MBで抑えられている場合があります。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-dLEIGFeJ2o/R-3Nyyp0m9I/AAAAAAAAABM/wf-8Ih1eNbs/s1600-h/task-manager.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_-dLEIGFeJ2o/R-3Nyyp0m9I/AAAAAAAAABM/wf-8Ih1eNbs/s400/task-manager.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5183025018647649234" /&gt;&lt;/a&gt;このPCは68MBとしょぼしょぼですが（；；&lt;br /&gt;こういう場合、パフォーマンス オプションで「システム キャッシュ」を選択すると512MB以上のメモリをシステムキャッシュに割り当てられるようになります。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-dLEIGFeJ2o/R-3ImCp0m8I/AAAAAAAAABE/Poku9iyGFaQ/s1600-h/performace-option.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_-dLEIGFeJ2o/R-3ImCp0m8I/AAAAAAAAABE/Poku9iyGFaQ/s400/performace-option.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5183019302046178242" /&gt;&lt;/a&gt;メモリが余ってる人はどうぞ。&lt;br /&gt;64bit版やWindows Vistaはこのリミッターが最初から解除されています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-842619238415100383?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/842619238415100383/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=842619238415100383' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/842619238415100383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/842619238415100383'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/03/windows.html' title='インサイドWindows第４版下'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-dLEIGFeJ2o/R-3Nyyp0m9I/AAAAAAAAABM/wf-8Ih1eNbs/s72-c/task-manager.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6650121821835153860</id><published>2008-03-29T13:00:00.002+09:00</published><updated>2008-03-29T13:15:36.509+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>HTTP Server API</title><content type='html'>以前からWindows OSにはIISが含まれていたけど、Windows XP SP2、Windows Server 2003以降にはOS側にWebサーバ機能が組み込まれていて、IISもこれを使う設計らしい。&lt;br /&gt;試しにこのHTTP Server APIを使ってみた。&lt;br /&gt;&lt;blockquote class="code"&gt;HTTPAPI_VERSION version = HTTPAPI_VERSION_1;&lt;br /&gt;HttpInitialize( version, HTTP_INITIALIZE_SERVER, NULL );&lt;br /&gt;&lt;br /&gt;HANDLE handle;&lt;br /&gt;HttpCreateHttpHandle( &amp;handle, NULL );&lt;br /&gt;&lt;br /&gt;HttpAddUrl( handle, L"http://+:80/", NULL );&lt;br /&gt;&lt;br /&gt;while( !stop ){&lt;br /&gt;  HTTP_REQUEST_ID requestId;&lt;br /&gt;  HTTP_SET_NULL_ID( &amp;requestId );&lt;br /&gt;  char buffer[ 4096 ] = {};&lt;br /&gt;  PHTTP_REQUEST request = reinterpret_cast&amp;lt;PHTTP_REQUEST&amp;gt;( buffer );&lt;br /&gt;  ULONG size;&lt;br /&gt;  HttpReceiveHttpRequest( handle, requestId, 0, request, sizeof buffer, &amp;size, NULL );&lt;br /&gt;&lt;br /&gt;  HTTP_RESPONSE response;&lt;br /&gt;  memset( &amp;response, 0, sizeof response ); // デフォルトコンストラクタ用意してください（；；）&lt;br /&gt;  HTTP_DATA_CHUNK chunk;&lt;br /&gt;  HANDLE file = INVALID_HANDLE_VALUE;&lt;br /&gt;  if( request-&gt;Verb != HttpVerbGET )&lt;br /&gt;    response.StatusCode = 503;&lt;br /&gt;  else{&lt;br /&gt;    // URLパスの先頭の'/'をスキップ&lt;br /&gt;    file = CreateFileW( &amp;request-&gt;CookedUrl.pAbsPath[1], FILE_READ_DATA, 0, NULL, OPEN_EXISTING, 0, NULL );&lt;br /&gt;    if( file == INVALID_HANDLE_VALUE )&lt;br /&gt;      response.StatusCode = 404;&lt;br /&gt;    else{&lt;br /&gt;      chunk.DataChunkType = HttpDataChunkFromFileHandle;&lt;br /&gt;      chunk.FromFileHandle.ByteRange.StartingOffset.QuadPart = 0;&lt;br /&gt;      chunk.FromFileHandle.ByteRange.Length.QuadPart = HTTP_BYTE_RANGE_TO_EOF;&lt;br /&gt;      chunk.FromFileHandle.FileHandle = file;&lt;br /&gt;      response.StatusCode = 200;&lt;br /&gt;      response.EntityChunkCount = 1;&lt;br /&gt;      response.pEntityChunks = &amp;chunk;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  HttpSendHttpResponse( handle, request-&gt;RequestId, 0, &amp;response, NULL, &amp;size, NULL, 0, NULL, NULL );&lt;br /&gt;  if( file != INVALID_HANDLE_VALUE )&lt;br /&gt;    CloseHandle( file );&lt;br /&gt;}&lt;br /&gt;HttpRemoveUrl( handle, L"http://+:80/" );&lt;br /&gt;CloseHandle( handle );&lt;br /&gt;HttpTerminate( HTTP_INITIALIZE_SERVER, NULL );&lt;/blockquote&gt;サンプルなのでエラー処理は省いてます。機能的には、カレントディレクトリのファイルを返します。&lt;br /&gt;stop = trueとしてもすぐには終了しません。HttpReceiveHttpRequest()でブロックされているので、次のリクエストを処理したところでループを抜けます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6650121821835153860?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6650121821835153860/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6650121821835153860' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6650121821835153860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6650121821835153860'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/03/http-server-api.html' title='HTTP Server API'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8411551339288174886</id><published>2008-03-02T23:17:00.003+09:00</published><updated>2008-03-02T23:50:55.333+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>fwrite()と改行コード</title><content type='html'>fwrite()は任意のバイナリデータをstreamに書き込むライブラリ関数だと理解していましたが、今更ながらstreamがテキストモードの場合、&lt;b&gt;任意文字列&lt;/b&gt;を書き込むものだと知りました。具体的にはバイナリデータを文字列と見なし、その中からNL（0x0A）をCR-LF（0x0D-0x0A）に置き換えられてはまりました。&lt;br /&gt;テキストとバイナリを混在させたstreamの場合、その都度モードを切り替える必要があるそうです。&lt;blockquote class="code"&gt;FILE* stream;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/ja-jp/library/tw4k6df8.aspx"&gt;_setmode&lt;/a&gt;( _fileno( stream ), _O_BINARY );&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8411551339288174886?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8411551339288174886/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8411551339288174886' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8411551339288174886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8411551339288174886'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/03/fwrite.html' title='fwrite()と改行コード'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3967181255222766643</id><published>2008-02-27T20:53:00.003+09:00</published><updated>2008-02-27T21:24:52.999+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>WPADのContent-Type</title><content type='html'>Web Proxy Auto-Discovery ProtocolいわゆるWPADですが、なんとWindows Update ClientはContent-Typeをちゃんと見ていました。application/x-ns-proxy-autoconfigに設定されていないと、無効と見なされてしまうようです。&lt;br /&gt;これ気づいてる人は少ないようで、proxycfg.exeに頼ってる記述が多々ありました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3967181255222766643?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3967181255222766643/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3967181255222766643' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3967181255222766643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3967181255222766643'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/wpadcontent-type.html' title='WPADのContent-Type'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7628772906818984351</id><published>2008-02-20T21:54:00.000+09:00</published><updated>2008-02-20T21:55:15.298+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>RAIDデバイス名の変更</title><content type='html'>Linuxのsoftware RAID（md）の場合、disk controllerをまたがって好きなようにRAIDを構成できるため重宝します。またhardware RAIDの場合、raid controllerが故障すると読み出せませんが、そのような欠点もありません。&lt;br /&gt;mdはディスク内に自身のデバイス名（md0）などを保持しています。ここで例えばディスク交換のために、/パーティションをmd0からmd1にコピーした場合、新たに作られる/はmd1というデバイス名を持ってしまいます。これを繰り返すとデバイス名がどんどんいびつになっていきます。&lt;br /&gt;これをどうにか整理したかったのですが、どこにも書かれていなかったので自力で解決しました。&lt;br /&gt;&lt;br /&gt;まだまだ説明が続きます。多くのドキュメントではmdのcreateについてしか記述されていませんでした。しかし実際にはassembleとstopという行為が重要になってきます。なぜこれらが記述されていないのかというと、Linuxの各ディストリでは起動時やshutdown時のscriptにあらかじめ組み込まれていて、説明する必要がないわけです。そして、試した結果わかったのですが、「mdはディスク内に自身のデバイス名（md0）などを保持しています。」これはcreate時だけでなくassemble時にも更新されるようです。&lt;br /&gt;&lt;br /&gt;いよいよデバイス名の変更の仕方です。例えばmd2をmd1に変更するには&lt;blockquote&gt;# umount md2&lt;br /&gt;# mdadm -S /dev/md2&lt;br /&gt;# mdadm -A /dev/md1 /dev/sd... /dev/sd...&lt;br /&gt;# mount ...&lt;/blockquote&gt;わかってしまえば簡単でした。&lt;br /&gt;このあと/etc/fstabの変更も忘れずに。&lt;br /&gt;&lt;br /&gt;ただしこれができるのはumount可能なパーティションだけです。CD bootなどでもいいかもしれません。&lt;br /&gt;CD bootできなくてもがんばれば更新できます。例えば/のデバイス名をmd0に変更する場合kernel optionで&lt;blockquote&gt;raid=noautodetect md=0,/dev/sd...,/dev/sd... root=/dev/md0&lt;/blockquote&gt;で変更されます。raid=noautodetectを指定しておかないと、autodetectされ、保持されているデバイス名でassembleされてしまい変更できません。またデバイス名が変わるためroot=/dev/md0の指定をしないと起動に失敗します。&lt;br /&gt;このあと/boot/grub/menu.listや/etc/fstabの更新も忘れずに。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7628772906818984351?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7628772906818984351/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7628772906818984351' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7628772906818984351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7628772906818984351'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/raid.html' title='RAIDデバイス名の変更'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1166778457854844223</id><published>2008-02-11T17:55:00.000+09:00</published><updated>2008-02-11T17:56:29.155+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>ハードディスクの2TBの壁</title><content type='html'>750GB×4のハードウェアRAID5で、2.25TBになります。このときハードディスクのパーティションテーブルは32bit sectors（4giga sectors）×512bytes/sector＝2TBまでしか表現できないという、2TBの壁にぶつかりました。&lt;br /&gt;Debian GNU/Linux（etch）をインストールしたところ、パーティションエディタは2TBの壁を超えるために新しいGPT形式に対応していて、ファイルのインストール自体はできました。ところがブートローダのGRUBがGPTに未対応のバージョンのため、結局ブート不可能なインストール結果となってしまいました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1166778457854844223?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1166778457854844223/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1166778457854844223' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1166778457854844223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1166778457854844223'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/2tb.html' title='ハードディスクの2TBの壁'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7971218207571310417</id><published>2008-02-09T13:40:00.000+09:00</published><updated>2008-02-09T13:41:53.302+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>ハードディスクの問題が検出されました</title><content type='html'>時々、OSからハードディスクが認識されなくて、先週からは起動時のBIOSからも認識されなくなって、やばいと思っていました。週末ということもあり、&lt;a href="/2008/02/robocopy.html"&gt;バックアップ&lt;/a&gt;して徹底的にチェック！ …まずはバックアップを～&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-dLEIGFeJ2o/R60mv-n6y-I/AAAAAAAAAA8/xi97MMtm5cc/s1600-h/hdd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_-dLEIGFeJ2o/R60mv-n6y-I/AAAAAAAAAA8/xi97MMtm5cc/s400/hdd.png" alt="" id="BLOGGER_PHOTO_ID_5164826953369963490" border="0" /&gt;&lt;/a&gt;こんなダイアログが出ました。Windows VistaってSelf-Monitoring, Analysis and Reporting Technology、いわゆるS.M.A.R.T.に対応してたのね。&lt;br /&gt;ググると遭遇している方が結構いらっしゃるようです。でも…この警告を無視するコメントが多数…う～ん、無理に使ってデータが壊れても自己責任ですよ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7971218207571310417?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7971218207571310417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7971218207571310417' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7971218207571310417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7971218207571310417'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/blog-post.html' title='ハードディスクの問題が検出されました'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-dLEIGFeJ2o/R60mv-n6y-I/AAAAAAAAAA8/xi97MMtm5cc/s72-c/hdd.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1431529347005021529</id><published>2008-02-09T13:27:00.000+09:00</published><updated>2008-02-09T13:40:57.373+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>Windows Vista SP1 RTM</title><content type='html'>2/4にWindows Server 2008とWindows Vista SP1のRelease To Manufacturing、RTMがアナウンスされました。それと同時にMSDNでWindows Server 2008の提供も開始されましたが、Vista SP1に関しては３月中旬に公開されるそうです。&lt;br /&gt;…と、これでは寂しいのでVista SP1のRTM版を入手してインストールしました。普通にインストールできました。ハイ、それだけです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1431529347005021529?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1431529347005021529/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1431529347005021529' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1431529347005021529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1431529347005021529'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/windows-vista-sp1-rtm.html' title='Windows Vista SP1 RTM'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4345947195007356292</id><published>2008-02-09T13:19:00.000+09:00</published><updated>2008-02-09T13:25:14.218+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>robocopy</title><content type='html'>ファイルを多数コピーしたくなりました。Explorerでは遅いからここはxcopyコマンドだと思い、まずはコマンドヘルプを…&lt;blockquote&gt;C:\Users\sayuri&gt;xcopy /?&lt;br /&gt;ファイルとディレクトリ ツリーをコピーします。&lt;br /&gt;&lt;br /&gt;注意: Xcopy は現在推奨されていません。Robocopy を使用してください。&lt;br /&gt;&lt;br /&gt;XCOPY 送り側 [受け側] [/A | /M] [/D[:日付]] [/P] [/S [/E]] [/V] [/W]&lt;br /&gt;                      [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]&lt;br /&gt;                      [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B]&lt;br /&gt;                      [/EXCLUDE:ファイル1[+ファイル2][+ファイル3]...]&lt;/blockquote&gt;…ん？&lt;blockquote&gt;C:\Users\sayuri&gt;robocopy /?&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------&lt;/blockquote&gt;&lt;br /&gt;これはバックアップとか便利に使えそうなコマンドのようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4345947195007356292?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4345947195007356292/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4345947195007356292' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4345947195007356292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4345947195007356292'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/robocopy.html' title='robocopy'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8437296638404252382</id><published>2008-02-02T19:15:00.000+09:00</published><updated>2008-02-02T19:28:12.774+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>LoadLibrary</title><content type='html'>今までLoadLibrary()を使ってましたが、実はLoadLibraryEx()にLOAD_WITH_ALTERED_SEARCH_PATHフラグを付けた方がいいことが判明。&lt;br /&gt;こうすることによって、ロード対象のDLLがさらに依存するDLLを探す際に、DLL自身のdirectoryを検索対象に含めることができるようになる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8437296638404252382?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8437296638404252382/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8437296638404252382' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8437296638404252382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8437296638404252382'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/02/loadlibrary.html' title='LoadLibrary'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7579341018094542083</id><published>2008-01-26T14:26:00.000+09:00</published><updated>2008-01-26T14:37:47.087+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Dictionary&lt;TKey, TValue&gt;とIEquatable&lt;T&gt;</title><content type='html'>ある意味当たり前ですが、気づかずにはまってしまいました。&lt;br /&gt;Dictionary&amp;lt;TKey,TValue&amp;gt;はIEquatable&amp;lt;T&amp;gt;が実装されていればそれを使って比較してくれます。&lt;span id="nsrTitle"&gt;Object&lt;span class="languageSpecificText"&gt;&lt;span class="cs"&gt;.&lt;/span&gt;&lt;span class="vb"&gt;&lt;/span&gt;&lt;span class="cpp"&gt;&lt;/span&gt;&lt;span class="nu"&gt;&lt;/span&gt;&lt;/span&gt;Equal&lt;/span&gt;s()と違って型保証されているので便利に使っていました。&lt;br /&gt;しかし、Dictionary&amp;lt;TKey,TValue&amp;gt;はTKeyを比較する前にまずハッシュします。この際、IEquatable&amp;lt;T&amp;gt;の有無にかかわらずObject.GetHashCode()を使います。つまり、このハッシュ値が異なるTKeyはIEquatable&amp;lt;T&amp;gt;.Equals()が呼び出されることなく異なる値として扱われてしまいます。&lt;br /&gt;むーん。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7579341018094542083?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7579341018094542083/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7579341018094542083' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7579341018094542083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7579341018094542083'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/01/dictionary-tvalue.html' title='Dictionary&amp;lt;TKey, TValue&amp;gt;とIEquatable&amp;lt;T&amp;gt;'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1995643611414914295</id><published>2008-01-07T20:26:00.000+09:00</published><updated>2008-01-07T20:39:08.700+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ILogicalThreadAffinativeとThread Local Storage</title><content type='html'>TLSつまりThread Local Storageは便利で、コンテキスト情報を持たせるときに活用しようとずっと考えていました。すでにある例としてはIPrincipalでしょうか。Threadにプリンシパルを持たせることで、実行に必要な権限があるかをいつでもテストできます。&lt;br /&gt;ですがこれ、Thread Localということは当然Threadをまたぐことができません。.NETでは簡単に非同期処理などを利用でき複数Threadにまたがってしまう。そうなったときTLSは使えません。&lt;br /&gt;&lt;br /&gt;そこで自分の生成した子スレッドにのみ引き継がれる都合のいいTLSはないかと.NETクラスライブラリを調べていましたがなかなか出合えませんでした。&lt;br /&gt;が、やはり根気よく調べればありました。それが&lt;a href="http://msdn2.microsoft.com/ja-jp/library/system.runtime.remoting.messaging.ilogicalthreadaffinative.aspx"&gt;ILogicalThreadAffinative&lt;/a&gt;です。このinterfaceはメンバがありません。ただ継承すればそれだけでTLSの内容が子スレッドにも引き継がれるようになります。&lt;br /&gt;日本語圏でググったところ、まだあまり使われていないようですが、これはかなり使えます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1995643611414914295?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1995643611414914295/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1995643611414914295' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1995643611414914295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1995643611414914295'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/01/ilogicalthreadaffinativethread-local.html' title='ILogicalThreadAffinativeとThread Local Storage'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3740877627286656533</id><published>2008-01-07T20:16:00.000+09:00</published><updated>2008-01-07T20:23:47.371+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>??演算子</title><content type='html'>C#で&lt;a href="http://msdn2.microsoft.com/ja-jp/library/ms173224%28VS.80%29.aspx"&gt;??演算子&lt;/a&gt;というものを見つけました。調べたところ、C# 2.0、つまりVS2005からあったそうで、ずっと気づいていませんでした。&lt;br /&gt;&lt;blockquote class="code"&gt;a = b ?? c;&lt;/blockquote&gt;は&lt;blockquote class="code"&gt;a = b != null ? b : c;&lt;/blockquote&gt;とほぼ等価です。違うのは、bが１回しか評価されないことです。Perlの||的な動きをすると言えばいいでしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3740877627286656533?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3740877627286656533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3740877627286656533' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3740877627286656533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3740877627286656533'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2008/01/blog-post.html' title='??演算子'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-810688860795398344</id><published>2007-12-16T12:50:00.000+09:00</published><updated>2007-12-16T12:59:54.331+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++/CLIと#include &lt;Windows.h&gt;</title><content type='html'>&lt;blockquote&gt;&lt;a href="/2007/12/vs2008-c.html"&gt;もっと根本的な問題#define MessageBox MessageBoxWとSystem::Windows::Forms::MessageBoxの名前がぶつかる問題とか解決してほしいなぁ。&lt;/a&gt;&lt;/blockquote&gt;と書いたけど、一応現時点での対策も書いておきます。&lt;br /&gt;&lt;blockquote class="code"&gt;#include &amp;lt;Windows.h&amp;gt;&lt;br /&gt;...&lt;br /&gt;#pragma push_macro("MessageBox")&lt;br /&gt;#undef MessageBox&lt;br /&gt;  MessageBox::Show( "message", "caption" );&lt;br /&gt;#pragma pop_macro("MessageBox")&lt;/blockquote&gt;です。でも面倒くさい…。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-810688860795398344?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/810688860795398344/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=810688860795398344' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/810688860795398344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/810688860795398344'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/12/ccliinclude.html' title='C++/CLIと#include &amp;lt;Windows.h&amp;gt;'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4503939576875194557</id><published>2007-12-16T12:37:00.000+09:00</published><updated>2007-12-16T12:39:04.255+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>VS2008の変更点： C++</title><content type='html'>VS2008を使い始めて気がついた点をあげていきます。今回はC++について。&lt;br /&gt;&lt;br /&gt;まず/Wp64（64 ビット移植性の問題の検出）のサポートがなくなっています。VS2005の１代でつぶれました。せっかく警告たとしても、Win32では無理やりcastするのが正しいときが多々あり、警告の意味が薄れてしまうからでしょうか。更にはx64コンパイラも用意されていますし、x64プロセッサもクライアントPCにまで出回ってきて、実機でテストしなさい、ってことかもしれません。&lt;br /&gt;&lt;br /&gt;新しくSTL/CLRライブラリとC++マーシャリングライブラリが増えています。STL/CLRは本当はVS2005に入るはずだったとか間に合わなかったとかだそうで？ C++/CLIは個人的にはC#で書ききれないWin32 nativeな部分のマーシャリング？に使うものという位置づけで、STLの出番はちょっと少ないです。JITで最適化していく.NETでSTL/CLRのコンパイル時インライン展開の最適化はどうなんでしょう？&lt;br /&gt;もう一つのC++マーシャリングはまぁ、今まで必要になった人が書いていたものをあらかじめ用意しましたよ、程度で。こちらもgenericではなくtemplateで書かれているのでコンパイル時にインライン展開されます。&lt;br /&gt;マーシャリングはうれしいけど、もっと根本的な問題#define MessageBox MessageBoxWとSystem::Windows::Forms::MessageBoxの名前がぶつかる問題とか解決してほしいなぁ。&lt;br /&gt;&lt;br /&gt;今回なくなったライブラリとしてはATL ServerとATL_MIN_CRT関連。obsolateではなくきれいさっぱり削除されています。ATL Serverは使っていませんでしたがATL_MIN_CRT関連は使っていたのでちょっと痛手。もちろん#ifdefで分けていたので、ファイルサイズが大きくなる程度ですが、気分的に。&lt;br /&gt;一応&lt;blockquote&gt;&lt;a href="http://msdn2.microsoft.com/ja-jp/library/ms237326(VS.90).aspx"&gt;Visual C++ 2008では、ATL_MIN_CRTが定義されているかどうかに関係なく、ATLプロジェクトのCRTに対する依存はすべて最小限に抑えられます。&lt;/a&gt;&lt;/blockquote&gt;と書かれていますが、この説明に意味はなく、ソースを見る限り「リンカが選択的にリンクしますよ」程度のことでした。&lt;br /&gt;&lt;br /&gt;ついでにATLのソースをVS2005とVS2008で比較してみたところ、気づいたことが２点ありました。VS2005ではATL_MIN_CRTの影響なのかセキュリティ強化されたCRTを使わないバージョンが存在しましたが、VS2008ではセキュリティ強化されたCRTが強制的に使われます。おかげでガンガンにCRTを使います。&lt;br /&gt;もう１点、なぜかVS2008でも_MTを見ています。VS2005以降、シングルスレッドCRTライブラリが削除されてマルチスレッドCRTライブラリしか存在しないわけですが、ATLは_MTを見てシングルスレッド動作も意識しています。…でもATL_MIN_CRTが廃止されたためにマルチスレッドCRTライブラリが必須なはずですが f(^^;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4503939576875194557?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4503939576875194557/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4503939576875194557' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4503939576875194557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4503939576875194557'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/12/vs2008-c.html' title='VS2008の変更点： C++'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-7536626696043816992</id><published>2007-12-15T12:31:00.000+09:00</published><updated>2007-12-15T12:51:23.859+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>Visual Studio Team System 2008 Team Suite</title><content type='html'>&lt;a href="/2007/11/vs2008.html"&gt;VS2008&lt;/a&gt;の続報です。Visual Studio Team System 2008 Team Suite日本語版が12/14にリリースされていました。国内での販売は2008/02/01からだそうです。&lt;br /&gt;ところで、.NET Framework 2.0 SP1日本語 Language Packや.NET Framework 3.0SP1はどうなってることやら。インストールして詳しく調べることにします。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-7536626696043816992?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/7536626696043816992/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=7536626696043816992' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7536626696043816992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/7536626696043816992'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/12/visual-studio-team-system-2008-team.html' title='Visual Studio Team System 2008 Team Suite'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3453088057581283885</id><published>2007-12-03T23:09:00.000+09:00</published><updated>2007-12-04T00:01:11.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ダイアログの表示のされ方（２）</title><content type='html'>&lt;a href="http://www.blogger.com/2007/12/blog-post.html"&gt;ダイアログの表示のされ方（１）&lt;/a&gt;の続きです。&lt;br /&gt;ダイアログには、タイトルバーがあり各種ボタンが並びますが、これまた制御がややこしいため調査しました。&lt;br /&gt;ボタンの場合、表示されているかどうかの他に、動作するかどうかもあります。簡単な話に聞こえますが、表示されていなくてもマウス操作やショートカットキーで動作することもあるため、独立して調査する必要があります。&lt;br /&gt;&lt;blockquote class="code"&gt;// ControlBoxが表示される条件&lt;br /&gt;Form.ControlBox == true &amp;amp;&amp;amp; Form.ShowIcon == true &amp;amp;&amp;amp;&lt;br /&gt;  ( Form.FormBorderStyle == FormBorderStyle.FixedSingle || Form.FormBorderStyle == FormBorderStyle.Fixed3D ||&lt;br /&gt;    Form.FormBorderStyle == FormBorderStyle.Sizable ||&lt;br /&gt;    Form.FormBorderStyle == FormBorderStyle.FixedDialog &amp;amp;&amp;amp; Form.Icon != null );&lt;br /&gt;&lt;br /&gt;// ControlBoxが動作する条件&lt;br /&gt;Form.ControlBox == true &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.None;&lt;/blockquote&gt;アイコンが表示されていなくても、Alt+Spaceで動作します。最初からかなりややこしい条件で、泣けました。&lt;br /&gt;&lt;blockquote class="code"&gt;// HelpButtonが表示される条件、及び動作する条件&lt;br /&gt;Form.HelpButton == true &amp;amp;&amp;amp; Form.ControlBox == true &amp;amp;&amp;amp; Form.MinimizeBox == false &amp;amp;&amp;amp; Form.MaximizeBox == false &amp;amp;&amp;amp;&lt;br /&gt;  ( Form.FormBorderStyle == FormBorderStyle.FixedSingle || Form.FormBorderStyle == FormBorderStyle.Fixed3D ||&lt;br /&gt;    Form.FormBorderStyle == FormBorderStyle.FixedDialog || Form.FormBorderStyle == FormBorderStyle.Sizable );&lt;/blockquote&gt;Shift+F1については確認できていません。今やヘルプボタンはマイナーな存在になりつつあるため、気にする必要はないかもしれませんね。&lt;br /&gt;&lt;blockquote class="code"&gt;// MinimizeBoxが表示される条件、及びMaximizeBoxが表示される条件&lt;br /&gt;( Form.MinimizeBox == true || Form.MaximizeBox == true ) &amp;amp;&amp;amp; Form.ControlBox == true &amp;amp;&amp;amp;&lt;br /&gt;  ( Form.FormBorderStyle == FormBorderStyle.FixedSingle || Form.FormBorderStyle == FormBorderStyle.Fixed3D ||&lt;br /&gt;    Form.FormBorderStyle == FormBorderStyle.FixedDialog || Form.FormBorderStyle == FormBorderStyle.Sizable );&lt;br /&gt;&lt;br /&gt;// MinimizeBoxが動作する条件&lt;br /&gt;Form.MinimizeBox == true &amp;amp;&amp;amp; Form.ControlBox == true &amp;amp;&amp;amp;&lt;br /&gt;( Form.FormBorderStyle == FormBorderStyle.FixedSingle || Form.FormBorderStyle == FormBorderStyle.Fixed3D ||&lt;br /&gt;  Form.FormBorderStyle == FormBorderStyle.FixedDialog || Form.FormBorderStyle == FormBorderStyle.Sizable );&lt;br /&gt;&lt;br /&gt;// MaximizeBoxが動作する条件&lt;br /&gt;Form.MaximizeBox == true &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.None;&lt;/blockquote&gt;最小化ボタン・最大化ボタンどちらかが有効になっているときに表示されます。最小化のショートカットを知らないため、見えていて有効になっているとき動作するとしました。最大化に関してはタイトルバーのダブルクリックを含めています。&lt;br /&gt;&lt;blockquote class="code"&gt;// CloseBoxが表示される条件&lt;br /&gt;Form.ControlBox == true &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.None;&lt;br /&gt;&lt;br /&gt;// CloseBoxが動作する条件&lt;br /&gt;true;&lt;/blockquote&gt;ControlBoxプロパティそのものでした。Alt+F4は絶えず有効でした。&lt;br /&gt;&lt;br /&gt;…疲れました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3453088057581283885?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3453088057581283885/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3453088057581283885' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3453088057581283885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3453088057581283885'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/12/blog-post_03.html' title='ダイアログの表示のされ方（２）'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-6622244779378547271</id><published>2007-12-02T19:24:00.000+09:00</published><updated>2007-12-02T19:26:36.718+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ダイアログの表示のされ方（１）</title><content type='html'>タイトルは何の変哲もないものになってしまいました。&lt;br /&gt;Windowsでは、ダイアログを出すとき、タスクバーに表示されるか・Alt+TABのリストに並ぶか・タスクマネージャに表示されるか、それぞれ制御できるようです。ところが.NET Frameworkには直接的に制御できるのはShowInTaskbarというプロパティぐらいしかなく、制御しづらい上にわかりにくいです。&lt;br /&gt;そこでひたすらパターンを組み合わせてどのように表示されるかまとめてみました。とはいえ、総当たり表を見てもパターンが多すぎてわかりづらいので、逆引き形式で並べてみます。&lt;br /&gt;&lt;blockquote class="code"&gt;// タスクバーに表示される条件&lt;br /&gt;Form.ShowInTaskbar == true;&lt;br /&gt;&lt;br /&gt;// 3D Flipに表示される条件&lt;br /&gt;Form.ShowInTaskbar == true;&lt;br /&gt;&lt;br /&gt;// Alt+Tabに表示される条件&lt;br /&gt;Form.ShowInTaskBar == true ||&lt;br /&gt;  Form.FormBorderStyle != FormBorderStyle.FixedToolWindow &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.SizableToolWindow;&lt;br /&gt;&lt;br /&gt;// タスクマネージャに表示される条件&lt;br /&gt;Form.FormBorderStyle != FormBorderStyle.FixedToolWindow &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.SizableToolWindow;&lt;/blockquote&gt;&lt;br /&gt;だんだん、関係ないパラメータに依存してきていることがわかりました。&lt;br /&gt;&lt;br /&gt;さらに、タスクバー・Alt+Tab・タスクマネージャにはダイアログアイコンが表示されます。表示されるアイコン自体は共通したものでしたが、アイコンの選択のされ方には微妙な違いがありました。&lt;br /&gt;&lt;blockquote class="code"&gt;if( Form.ShowIcon == true &amp;amp;&amp;amp; Form.Icon != null )&lt;br /&gt;  TheIcon = Form.Icon;&lt;br /&gt;else if( Form.ShowIcon == true &amp;amp;&amp;amp; Form.Icon == null &amp;amp;&amp;amp; Form.FormBorderStyle != FormBorderStyle.FixedDialog )&lt;br /&gt;  TheIcon = Form.ParentForm.Icon;&lt;br /&gt;else&lt;br /&gt;  TheIcon = null;&lt;/blockquote&gt;&lt;br /&gt;この式でTheIconに値が設定されないときはタスクバーなりタスクマネージャなりのデフォルトが使われる模様？&lt;br /&gt;こうもややこしいと困りますね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-6622244779378547271?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/6622244779378547271/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=6622244779378547271' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6622244779378547271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/6622244779378547271'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/12/blog-post.html' title='ダイアログの表示のされ方（１）'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1544235308383321935</id><published>2007-11-29T20:20:00.000+09:00</published><updated>2007-11-29T20:27:22.598+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Dictionary.TryGetValue</title><content type='html'>&lt;a href="http://msdn2.microsoft.com/ja-jp/library/zkw5c9ak.aspx"&gt;Dictionary.TryGetValue()&lt;/a&gt;にはまった。&lt;blockquote&gt;このメソッドから制御が戻るときに、キーが見つかった場合は、指定したキーに関連付けられている値が格納されます。それ以外の場合は value パラメータの型に対する既定の値。このパラメータは初期化せずに渡されます。&lt;/blockquote&gt;と書かれているものの深く読んでなくて、valueは変更されないものと勘違い。&lt;br /&gt;書かれているとおり、見つからなかった場合は既定値で初期化されます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1544235308383321935?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1544235308383321935/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1544235308383321935' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1544235308383321935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1544235308383321935'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/dictionarytrygetvalue.html' title='Dictionary.TryGetValue'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4392267201619803866</id><published>2007-11-23T12:24:00.000+09:00</published><updated>2007-12-04T22:00:09.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Bitmap、ColorPalette</title><content type='html'>ごめんなさい、&lt;a href="/2007/11/colorpalette.html"&gt;ColorPalette&lt;/a&gt;のAccessViolationExceptionは別の原因でした。&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/ja-jp/library/zy1a2d14%28VS.80%29.aspx"&gt;Bitmapコンストラクタ&lt;/a&gt;には&lt;blockquote&gt;scan0パラメータで指定されたメモリブロックの割り当てと解放は呼び出し元が行いますが、関連するBitmapが解放されるまでメモリは解放されません。&lt;/blockquote&gt;とありますが、これを守っていませんでした。Bitmapコンストラクタが終了した時点でメモリブロックを解放していました。Bitmap.LockBits()をするのが正解なようです。&lt;br /&gt;&lt;br /&gt;ColorPaletteクラスが変則的な理由を調べるためにGDI+について調べました。&lt;br /&gt;GDI+はもともとnative（unmanaged）で実装されていてBitmapクラスなどはそのwrapperになっています。そしてColorPaletteはというと、単なる構造体であり対応するnativeクラスはありません。…だからと言って扱いづらいクラス設計をしていいわけではありませんがっ。&lt;br /&gt;&lt;br /&gt;見た感じColorPaletteクラスは複数のBitmapクラスで共有してもよさそうです。というよりも対応するnativeクラスが存在しないため、Bitmap.Paletteに代入された時点で値だけがnativeクラス側にコピーされColorPaletteの共有状態にはならないようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4392267201619803866?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4392267201619803866/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4392267201619803866' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4392267201619803866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4392267201619803866'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/bitmapcolorpalette.html' title='Bitmap、ColorPalette'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-8957456837063667784</id><published>2007-11-22T08:39:00.000+09:00</published><updated>2007-11-22T09:20:05.430+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>ColorPalette</title><content type='html'>複数のBitmapが同一のColorPaletteを持つとき、この&lt;a href="http://msdn2.microsoft.com/ja-jp/library/system.drawing.imaging.colorpalette%28vs.90%29.aspx"&gt;ColorPalette&lt;/a&gt;が非常に扱いづらい。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;なぜかコンストラクタがない。&lt;/li&gt;&lt;li&gt;そのためBitmap.Paletteプロパティから取得する必要がある。&lt;/li&gt;&lt;li&gt;ところがBitmap.Paletteプロパティにアクセスするたびに新しいインスタンスが生成される。&lt;/li&gt;&lt;/ol&gt;文章だと説明しづらいので問題になるコードを&lt;blockquote class="badcode"&gt;Bitmap[] bitmaps; // ここにColorPaletteを設定したい&lt;br /&gt;Color[] colors; // このColorを設定したい&lt;br /&gt;&lt;br /&gt;foreach( Bitmap bitmap in bitmaps ){&lt;br /&gt;  for( int i = 0; i &amp;lt; 256; i++ )&lt;br /&gt;    bitmap.Palette.Entries[i] = color[i];&lt;br /&gt;  bitmap.MakeTransparent(); // ついでに透明色の設定&lt;br /&gt;}&lt;/blockquote&gt;ちゃんとColorを設定しているつもりでも、毎回ColorPaletteが生成され直してColor値が保存されない。じゃあ、どうするかというと&lt;blockquote class="code"&gt;Bitmap[] bitmaps; // ここにColorPaletteを設定したい&lt;br /&gt;Color[] colors; // このColorを設定したい&lt;br /&gt;&lt;br /&gt;foreach( Bitmap bitmap in bitmaps ){&lt;br /&gt;  ColorPalette palette = bitmap.Palette; // ColorPaletteを取得、この時点でBitmapとは切り離されている&lt;br /&gt;  for( int i = 0; i &amp;lt; 256; i++ )&lt;br /&gt;    palette.Entries[i] = color[i];&lt;br /&gt;  bitmap.Palette = palette;&lt;br /&gt;  bitmap.MakeTransparent(); // ついでに透明色の設定&lt;br /&gt;}&lt;/blockquote&gt;こんな感じ。コンストラクタが提供されないにも係わらず、インスタンスの設定が求められるのはおかしい。&lt;br /&gt;ここでふと気づく。ループごとにColorPaletteを作成し直すのは無駄では？ つまり&lt;blockquote class="badcode"&gt;Bitmap[] bitmaps; // ここにColorPaletteを設定したい&lt;br /&gt;Color[] colors; // このColorを設定したい&lt;br /&gt;&lt;br /&gt;ColorPalette palette = bitmaps[0].Palette; // ColorPaletteを取得、この時点でBitmapとは切り離されている&lt;br /&gt;for( int i = 0; i &amp;lt; 256; i++ )&lt;br /&gt;  palette.Entries[i] = color[i];&lt;br /&gt;foreach( Bitmap bitmap in bitmaps ){&lt;br /&gt;  bitmap.Palette = palette;&lt;br /&gt;  bitmap.MakeTransparent(); // ついでに透明色の設定&lt;br /&gt;}&lt;/blockquote&gt;こうすればColorPaletteの作成は１回で済む…というのは罠です。ColorPaletteはクラスなので、複数のBitmapでインスタンスが共有されてしまいます。具体的にはMakeTransparent()でAccessViolationExceptionが発生したりする。&lt;br /&gt;インスタンスを独立させたくてもICloneable.Clone()も提供されないので、ひたすらコピーするしかない。なんとも迷惑な話です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-8957456837063667784?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/8957456837063667784/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=8957456837063667784' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8957456837063667784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/8957456837063667784'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/colorpalette.html' title='ColorPalette'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-2809258249222643588</id><published>2007-11-20T22:11:00.000+09:00</published><updated>2007-11-20T22:23:15.631+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>インサイドWindows第４版上</title><content type='html'>&lt;a href="http://journal.mycom.co.jp/column/sopinion/195/index.html"&gt;セカンド・オピニオン OS小論:OSの構造をもう少し考えてみる&lt;/a&gt;を見つけました。&lt;br /&gt;奥深くまでいろいろ語られていて参考になりました。その影響で「インサイドWindows第４版上」なる本を買ってしまいました。下は売ってなかったのでそのうちにでも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-2809258249222643588?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/2809258249222643588/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=2809258249222643588' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2809258249222643588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/2809258249222643588'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/windows.html' title='インサイドWindows第４版上'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3522496793735694554</id><published>2007-11-20T21:10:00.000+09:00</published><updated>2007-11-20T21:18:22.132+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>VS2008</title><content type='html'>Visual Studio Team System 2008 Team Suite提供開始。まずは英語版を入手。&lt;br /&gt;LINQやAjaxや面白い機能がいっぱい。既にβ版を試してたけど、自分の目線で追々紹介していきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3522496793735694554?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3522496793735694554/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3522496793735694554' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3522496793735694554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3522496793735694554'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/vs2008.html' title='VS2008'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-4828021035106768414</id><published>2007-11-19T22:43:00.000+09:00</published><updated>2007-11-20T00:07:47.170+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Win32'/><title type='text'>プロセッサの情報</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-dLEIGFeJ2o/R0GTK3_Ou9I/AAAAAAAAAAU/4RS-Dp-dYLQ/s1600-h/computer-property.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_-dLEIGFeJ2o/R0GTK3_Ou9I/AAAAAAAAAAU/4RS-Dp-dYLQ/s400/computer-property.jpeg" alt="" id="BLOGGER_PHOTO_ID_5134546865216207826" border="0" /&gt;&lt;/a&gt;コンピュータのプロパティはVistaだとこんな感じ。xpもダイアログは違うけど、プロセッサについて書かれてる。周波数は２回書かれてるし、空白のバランスが悪い。&lt;br /&gt;でもこれには理由があって、赤下線部分の文字列、これはCPUから直接取得できる。こんな感じ。Visual C++依存のコードです。&lt;br /&gt;&lt;blockquote class="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;intrin.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(){&lt;br /&gt;  int cpuInfo[4];&lt;br /&gt;  __cpuid( cpuInfo, 0x80000000 );&lt;br /&gt;  if( cpuInfo[0] &gt;= 0x80000004 ){&lt;br /&gt;    char brand[48];&lt;br /&gt;    __cpuid( (int*)&amp;amp;brand[ 0], 0x80000002 );&lt;br /&gt;    __cpuid( (int*)&amp;amp;brand[16], 0x80000003 );&lt;br /&gt;    __cpuid( (int*)&amp;amp;brand[32], 0x80000004 );&lt;br /&gt;    printf( "%.48s\n", &amp;amp;brand[0] );&lt;br /&gt;  }&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-4828021035106768414?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/4828021035106768414/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=4828021035106768414' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4828021035106768414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/4828021035106768414'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/blog-post_19.html' title='プロセッサの情報'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-dLEIGFeJ2o/R0GTK3_Ou9I/AAAAAAAAAAU/4RS-Dp-dYLQ/s72-c/computer-property.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-3972360591023344941</id><published>2007-11-18T14:10:00.000+09:00</published><updated>2007-11-18T14:24:39.379+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='RO'/><title type='text'>プレビュー</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-dLEIGFeJ2o/Rz_JgX_Ou8I/AAAAAAAAAAM/6wpmE3FjS1w/s1600-h/preview.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_-dLEIGFeJ2o/Rz_JgX_Ou8I/AAAAAAAAAAM/6wpmE3FjS1w/s400/preview.jpg" alt="" id="BLOGGER_PHOTO_ID_5134043658257873858" border="0"&gt;&lt;/a&gt;&lt;br /&gt;こんなことして遊んでいます。RO以外でも使えるclass libraryができました。&lt;ul&gt;&lt;li&gt;ZlibStream&lt;br /&gt;zlibなstreamを読み書きできる。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FileDataObject&lt;br /&gt;実在しないfileをclipboardに入れる。explorerにdropするときにも使える。ただしDataObject classと相性が悪い。&lt;/li&gt;&lt;li&gt;Tga&lt;br /&gt;TGA形式の画像をBitmapクラスに読み込む。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-3972360591023344941?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/3972360591023344941/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=3972360591023344941' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3972360591023344941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/3972360591023344941'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/blog-post.html' title='プレビュー'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-dLEIGFeJ2o/Rz_JgX_Ou8I/AAAAAAAAAAM/6wpmE3FjS1w/s72-c/preview.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-5851367374098733002</id><published>2007-11-18T09:55:00.000+09:00</published><updated>2007-11-18T12:09:59.475+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>IDataObject</title><content type='html'>&lt;a href="http://msdn2.microsoft.com/ja-jp/library/system.runtime.interopservices.comtypes.idataobject%28VS.80%29.aspx"&gt;IDataObject&lt;/a&gt;、DataFormats.Format、FORMATETCこの辺りは定義がいい加減で困る。&lt;br /&gt;&lt;br /&gt;しょーもないところではIDataObject.DUnadvise()。戻り値voidなのに戻り値の解説がついてます。Cの#define値を見せられてもどうにもなりません…そもそもどうやって返せと。.NET Framework 3.5ではドキュメント修正されてめでたしめでたし…んなことありません。&lt;br /&gt;お隣りのIDataObject.DAdvise()。戻り値intだから解説が…ふむふむ真っ当に見える？ ところが、OLE_E_ADVISENOTSUPPORTEDを返そうとすると、refやらoutの値を設定しなさいとコンパイルエラーが。いえ、設定できないからOLE_E_ADVISENOTSUPPORTEDを返したいのですが…結局、戻り値ではなく例外を投げることに。&lt;br /&gt;&lt;br /&gt;本題はこっち。FORMATETC.cfFormatはshort型。実際の値としてはshortで負になる値がよく使われる。&lt;br /&gt;でもDataFormats.Format.Idとしてはint型なので正に…単純に==演算子で比較すると一致しません。結局&lt;blockquote class="code"&gt;FORMATETC formatEtc;&lt;br /&gt;DataFormats.Format dataFormat;&lt;br /&gt;if( formatEtc.cfFormat == unchecked((short)dataFormat.Id) ){&lt;br /&gt;   ...;&lt;br /&gt;}&lt;/blockquote&gt;とするしかないでしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-5851367374098733002?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/5851367374098733002/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=5851367374098733002' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5851367374098733002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/5851367374098733002'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/idataobject.html' title='IDataObject'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7370796000776920436.post-1514953219480110522</id><published>2007-11-17T21:32:00.000+09:00</published><updated>2007-11-17T21:55:57.635+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>GCHandle.AddrOfPinnedObject()とToIntPtr()の違い</title><content type='html'>&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;GCHandle&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;managed objectに対するHandleを表す。&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GCHandle.Alloc()&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;managed objectに対するGCHandleを取得する。同時に固定することも可能。&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GCHandle.AddrOfPinnedObject()&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;GCHandleが表しているmanaged objectのaddressを返す。このとき、GCHandleが表しているmanaged objectはあらかじめ固定していないと例外が発生する。&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GCHandle.ToIntPtr()&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;GCHandle自身のaddressを返す。GCHandleが表しているmanaged object自体は固定されている必要はない。&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GCHandle.FromIntPtr()&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;GCHandle.ToIntPtr()で得られたaddressからGCHandleへ復元する。もちろん同じmanaged objectが追跡できている。&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7370796000776920436-1514953219480110522?l=sayurin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sayurin.blogspot.com/feeds/1514953219480110522/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7370796000776920436&amp;postID=1514953219480110522' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1514953219480110522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7370796000776920436/posts/default/1514953219480110522'/><link rel='alternate' type='text/html' href='http://sayurin.blogspot.com/2007/11/gchandleaddrofpinnedobjecttointptr.html' title='GCHandle.AddrOfPinnedObject()とToIntPtr()の違い'/><author><name>佐祐理</name><uri>http://www.blogger.com/profile/16992937986398474632</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
