<?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-38418138</id><updated>2012-01-20T19:20:29.493+09:00</updated><category term='C#'/><category term='Visual Studio'/><category term='AutoIt'/><category term='Twitter'/><category term='VM'/><category term='e-Tax'/><category term='メモ'/><category term='algorithm'/><category term='blog'/><category term='WPF'/><category term='Test'/><category term='misc'/><category term='Silverlight'/><category term='Greasemonkey'/><title type='text'>ksksts's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-38418138.post-8884642426470845740</id><published>2011-01-23T14:53:00.001+09:00</published><updated>2011-01-23T16:37:51.019+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoIt'/><category scheme='http://www.blogger.com/atom/ns#' term='e-Tax'/><title type='text'>e-Tax平成22年分（2010年分）確定申告の先物取引と配当のAutoItによる自動入力</title><content type='html'>&lt;a href="https://www.keisan.nta.go.jp/h22/ta_top.htm"&gt;e-Taxの平成22年分（2010年分）確定申告書等作成コーナー&lt;/a&gt;の先物取引（日経225先物など）と上場株式の配当の入力を支援する&lt;a href="http://www.autoitscript.com/autoit3/index.shtml"&gt;AutoIt&lt;/a&gt;スクリプトを書いた。&lt;br /&gt;動機はただ単純に手動で入力するのが面倒だったから。特に「先物取引に係る雑所得等」は最大で990件（330ページ * 3件）入力可能にされているのに、構造化したデータをアップロードするなどの方式が提供されずにWebブラウザで手動での入力が想定されているのはおかしい。面倒ってレベルじゃない。&lt;br /&gt;去年もAutoItのスクリプトを書いたけど、去年のものはキー入力やマウス操作の命令ばかり使ったもので処理が遅くて不安定で良い出来ではなかった。今年は&lt;a href="http://mga8cak.sitemix.jp/UDFsHelp/html/libfunctions/IE%20Management.htm"&gt;IE操作用のUDF "IE.au3"&lt;/a&gt;を使ってそれなりにまともなものができたと思うので晒してみる。&lt;br /&gt;&lt;br /&gt;動作を確認した環境は次の通り。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows 7 Pro. x64&lt;/li&gt;&lt;li&gt;InternetExplorer 8&lt;/li&gt;&lt;li&gt;AutoIt v3 (v3.3.6.1)&lt;/li&gt;&lt;li&gt;2011/01/22時点のe-Tax平成22年分確定申告書作成コーナー&lt;/li&gt;&lt;/ul&gt;InternetExplorerはAutoItやe-Taxのサイトが対応していればいいと思う。&lt;br /&gt;&lt;br /&gt;内容の簡単な説明としては、普通にInternetExplorerを操作してデータを入力するページ（「先物取引に係る雑所得等」ページとか）を開いた状態にしてAutoItのスクリプトを実行するというのが主操作手順。そうするとAutoItがデータ（タブ区切りテキスト形式で事前に作成しておく）を入力してくれて、それが完了したらまた自分でInternetExplorerを操作してデータを保存するとか次の処理に進んだりできる。&lt;br /&gt;AutoItで処理するのはデータの入力部分だけで、保存しておいた確定申告書データを読み込んで作成を再開するとかデータの入力後に確定申告書データを保存するとかの処理は、自然に手動で操作するだけで済むようになっている（AutoItで処理するよりも柔軟かつ分かりやすい）。またAutoItで処理する範囲が小さくて済むためAutoItのスクリプトも簡単になっている。&lt;br /&gt;&lt;br /&gt;処理の所要時間は私の環境で1件の入力に約0.8秒だった。まあこんなものだと思う。&lt;br /&gt;オンライン送信ではなく郵送すれば済む話だけど、折角可能なんだからオンライン送信に固執するつもりで書いた。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;先物取引のデータの入力支援のスクリプトの使い方&lt;/h3&gt;&lt;h4&gt;入力データの作成&lt;/h4&gt;入力する先物取引の内訳をタブ区切りテキスト形式で作成する。&lt;br /&gt;テンプレートは&lt;a href="http://bitbucket.org/ksksts/junk/raw/f3fc3ff2e5f4/misc/etax-2010/etax-future-sample.xlsx"&gt;etax-future-sample.xlsx&lt;/a&gt;。&lt;br /&gt;入力項目は「【確定申告書作成コーナー】-先物取引に係る雑所得等」ページ(https://www.keisan.nta.go.jp/h22/syotoku/ta_subB62.jsp)の取引の内訳と全く同じ。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/TTu7xFbFwmI/AAAAAAAAAFw/4foDrwBlby8/s1600/etax-future-fields.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="288" width="320" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/TTu7xFbFwmI/AAAAAAAAAFw/4foDrwBlby8/s320/etax-future-fields.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;etax-future-sample.xlsxの列順でデータを作成してタブ区切りテキスト形式で保存して、項目の説明である先頭の2行を削除すればいい。入力データのサンプルは&lt;a href="http://bitbucket.org/ksksts/junk/raw/f3fc3ff2e5f4/misc/etax-2010/etax-future-sample.txt"&gt;etax-future-sample.txt&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;入力データ作成時の注意点:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;正しいデータを作成すること&lt;/li&gt;&lt;li&gt;作成されたデータはそのまま入力ページへの入力に使われる&lt;/li&gt;&lt;li&gt;スクリプトではデータのバリデーションをしていない。おかしなデータが含まれていると入力ページのバリデーション処理によりメッセージを通知するダイアログが表示されるため、データの入力処理がそこで止まってしまう。&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;スクリプトの実行&lt;/h4&gt;InternetExplorerを操作して（保存しておいた確定申告書データから作成を再開するなどして）「【確定申告書作成コーナー】-先物取引に係る雑所得等」ページ(https://www.keisan.nta.go.jp/h22/syotoku/ta_subB62.jsp)を開いておく。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/TTu8wMpPJZI/AAAAAAAAAF4/Zqrcx7knvK4/s1600/ta_subB62.jsp.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="246" width="320" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/TTu8wMpPJZI/AAAAAAAAAF4/Zqrcx7knvK4/s320/ta_subB62.jsp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;その状態でAutoItのスクリプト&lt;a href="http://bitbucket.org/ksksts/junk/raw/f3fc3ff2e5f4/misc/etax-2010/etax-future-2010.au3"&gt;etax-future-2010.au3&lt;/a&gt;を実行する。&lt;br /&gt;&lt;br /&gt;スクリプトの10行目付近の$filename変数が入力データ（タブ区切りテキスト形式）のファイル名。&lt;br /&gt;とりあえず次のようにしてある。この場合etax-future-2010.txtという名前のファイルが読み込まれる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;;$filename = "etax-future-sample.txt"  ; 取引の内訳データのファイル名（タブ区切りテキストファイル）&lt;br /&gt;$filename = "etax-future-2010.txt"  ; 取引の内訳データのファイル名（タブ区切りテキストファイル）&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1件入力するごとに進捗を標準出力に書き出すのでそれを確認できる環境でスクリプトを実行するのが良い。&lt;br /&gt;コマンドラインでもいいし、&lt;a href="http://www.autoitscript.com/autoit3/scite/"&gt;AutoIt Script Editor(SciTE4AutoIt3)&lt;/a&gt;（AutoIt Full Installationに含まれる）でスクリプトを開いてメニューの「Tools」－「Go」で実行すると、エディタのOutputペインが開いてそれが標準出力になるので、スクリプトを変更して実行する場合にはこれが便利。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/TTu9XUTRbKI/AAAAAAAAAGA/Y0JxjW759dc/s1600/SciTE4AutoIt3.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="252" width="320" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/TTu9XUTRbKI/AAAAAAAAAGA/Y0JxjW759dc/s320/SciTE4AutoIt3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;配当のデータの入力支援のスクリプトの使い方&lt;/h3&gt;構成や使い方は先物取引のデータ入力と同じなので省略。&lt;br /&gt;スクリプトやテンプレートとサンプルは&lt;a href="http://bitbucket.org/ksksts/junk/src/f3fc3ff2e5f4/misc/etax-2010/"&gt;ksksts / junk / source – Bitbucket&lt;/a&gt;のetax-dividend-*という名前のファイル。&lt;br /&gt;対象としているのは「【確定申告書作成コーナー】-配当所得、配当控除(上場株式等)」ページ(https://www.keisan.nta.go.jp/h22/syotoku/ta_subX5b.jsp)への入力。&lt;br /&gt;これは「配当所得、配当控除(取引区分の選択)」ページで「１ 上場株式等」－「(２)  源泉徴収口座への受入れを行っていない配当等」を選択したケースのこと。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/TTvAfHUWkyI/AAAAAAAAAGI/qyezUQZMIok/s1600/ta_subX5a.jsp.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="210" width="320" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/TTvAfHUWkyI/AAAAAAAAAGI/qyezUQZMIok/s320/ta_subX5a.jsp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-8884642426470845740?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/8884642426470845740/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=8884642426470845740' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/8884642426470845740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/8884642426470845740'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2011/01/e-tax222010autoit.html' title='e-Tax平成22年分（2010年分）確定申告の先物取引と配当のAutoItによる自動入力'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/TTu7xFbFwmI/AAAAAAAAAFw/4foDrwBlby8/s72-c/etax-future-fields.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-3874191460714325841</id><published>2010-09-29T23:11:00.000+09:00</published><updated>2010-09-29T23:11:42.178+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#の構造体の引き渡し方によるパフォーマンスの違い</title><content type='html'>メソッドの引数として構造体を渡す場合にちょっと気になったので調査用のコードを書いた。&lt;br /&gt;比較したのは次の3つのケース。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;構造体を値渡し&lt;/li&gt;&lt;li&gt;構造体を参照渡し（ref修飾子）&lt;/li&gt;&lt;li&gt;構造体が実装するインターフェースで渡す&lt;/li&gt;&lt;/ul&gt;コードは次の通り。struct Pointがinterface ITupleを実装している。&lt;br /&gt;&lt;pre class="prettyprint"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace StructInterface&lt;br /&gt;{&lt;br /&gt;    interface ITuple&lt;br /&gt;    {&lt;br /&gt;        int X { get; set; }&lt;br /&gt;        int Y { get; set; }&lt;br /&gt;        int Z { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    struct Point : ITuple&lt;br /&gt;    {&lt;br /&gt;        public int X { get; set; }&lt;br /&gt;        public int Y { get; set; }&lt;br /&gt;        public int Z { get; set; }&lt;br /&gt;        public Point(int x, int y, int z) : this() { X = x; Y = y; Z = z; }&lt;br /&gt;        public void AddStruct(Point point)&lt;br /&gt;        {&lt;br /&gt;            X += point.X;&lt;br /&gt;            Y += point.Y;&lt;br /&gt;            Z += point.Z;&lt;br /&gt;        }&lt;br /&gt;        public void AddRefStruct(ref Point point)&lt;br /&gt;        {&lt;br /&gt;            X += point.X;&lt;br /&gt;            Y += point.Y;&lt;br /&gt;            Z += point.Z;&lt;br /&gt;        }&lt;br /&gt;        public void AddInterface(ITuple tuple)&lt;br /&gt;        {&lt;br /&gt;            X += tuple.X;&lt;br /&gt;            Y += tuple.Y;&lt;br /&gt;            Z += tuple.Z;&lt;br /&gt;        }&lt;br /&gt;        public override bool Equals(object obj)&lt;br /&gt;        {&lt;br /&gt;            if (!(obj is Point))&lt;br /&gt;                return false;&lt;br /&gt;            var p = (Point)obj;&lt;br /&gt;            var result = X == p.X &amp;amp;&amp;amp; Y == p.Y &amp;amp;&amp;amp; Z == p.Z;&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;        public override int GetHashCode()&lt;br /&gt;        {&lt;br /&gt;            var result = X ^ Y ^ Z;&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;        public override string ToString()&lt;br /&gt;        {&lt;br /&gt;            var str = string.Format("{0}, {1}, {2}, ", X, Y, Z);&lt;br /&gt;            return str;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            for (var size = 1000; size &amp;lt;= 1000000; size *= 10)&lt;br /&gt;                Run(size);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void Run(int size)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("size: {0}", size);&lt;br /&gt;&lt;br /&gt;            var count = 10;&lt;br /&gt;            var sw = new Stopwatch();&lt;br /&gt;            var structTicks = 0L;&lt;br /&gt;            var refStructTicks = 0L;&lt;br /&gt;            var interfaceTicks = 0L;&lt;br /&gt;&lt;br /&gt;            for (var c = 0; c &amp;lt;= count; c++)&lt;br /&gt;            {&lt;br /&gt;                var random = new Random(count);&lt;br /&gt;                var points = Enumerable.Range(0, size)&lt;br /&gt;                                       .Select(_ =&amp;gt; new Point(random.Next(), random.Next(), random.Next()))&lt;br /&gt;                                       .ToList&lt;point&gt;();&lt;br /&gt;&lt;br /&gt;                // Point.AddStruct&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                var sp = new Point();&lt;br /&gt;                foreach (var point in points)&lt;br /&gt;                    sp.AddStruct(point);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                structTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                // Point.AddRefStruct&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                var rsp = new Point();&lt;br /&gt;                foreach (var point in points)&lt;br /&gt;                {&lt;br /&gt;                    var p = new Point(point.X, point.Y, point.Z);&lt;br /&gt;                    rsp.AddRefStruct(ref p);&lt;br /&gt;                }&lt;br /&gt;                sw.Stop();&lt;br /&gt;                refStructTicks = sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                // Point.AddInterface&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                var ip = new Point();&lt;br /&gt;                foreach (var point in points)&lt;br /&gt;                    ip.AddInterface(point);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                interfaceTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                // correctness&lt;br /&gt;                if (!sp.Equals(rsp))&lt;br /&gt;                    Console.WriteLine("!sp.Equals(rsp)");&lt;br /&gt;                if (!sp.Equals(ip))&lt;br /&gt;                    Console.WriteLine("!sp.Equals(ip)");&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("AddStruct: {0} ({1:F})", structTicks / count, structTicks / (double)structTicks);&lt;br /&gt;            Console.WriteLine("AddRefStruct: {0} ({1:F})", refStructTicks / count, refStructTicks / (double)structTicks);&lt;br /&gt;            Console.WriteLine("AddInterface: {0} ({1:F})", interfaceTicks / count, interfaceTicks / (double)structTicks);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="https://bitbucket.org/ksksts/junk/src/c2d34c723bb5/cs/others/StructInterface/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;結果は次の通り。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;AddStruct: 832 (1.00)&lt;br /&gt;AddRefStruct: 31 (0.04)&lt;br /&gt;AddInterface: 789 (0.95)&lt;br /&gt;size: 10000&lt;br /&gt;AddStruct: 1023 (1.00)&lt;br /&gt;AddRefStruct: 119 (0.12)&lt;br /&gt;AddInterface: 1803 (1.76)&lt;br /&gt;size: 100000&lt;br /&gt;AddStruct: 9916 (1.00)&lt;br /&gt;AddRefStruct: 1100 (0.11)&lt;br /&gt;AddInterface: 16277 (1.64)&lt;br /&gt;size: 1000000&lt;br /&gt;AddStruct: 102814 (1.00)&lt;br /&gt;AddRefStruct: 11699 (0.11)&lt;br /&gt;AddInterface: 159081 (1.55)&lt;br /&gt;&lt;/pre&gt;感想としては、はじめ参照渡しが早いことを意外に感じた（値型と参照型のインスタンス作成の速度差から値型のインスタンスのコピーはそれほどの負荷にならないと思っていた）けど、コピーを発生させるよりは参照渡しにした方が軽いということは納得できた。&lt;br /&gt;インターフェース経由が遅いのは疑問。型変換的な処理が入ってしまうのかな。&lt;br /&gt;&lt;br /&gt;メソッドの引数に構造体を渡す場合に（変更しないのに）ref修飾子を使いまくるか、素直にコピーを発生させるか迷う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-3874191460714325841?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/3874191460714325841/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=3874191460714325841' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3874191460714325841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3874191460714325841'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2010/09/c.html' title='C#の構造体の引き渡し方によるパフォーマンスの違い'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-8540471064039565622</id><published>2010-03-21T21:01:00.002+09:00</published><updated>2010-03-21T21:02:27.393+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>Google Chromeの検索エンジンの設定</title><content type='html'>Firefoxから移行してある程度経ったのにGoogle Chromeのデフォルトの検索エンジンの設定が気に入らない。悪いというわけじゃなくてFirefoxを使っていた時と同じような検索結果が欲しいから、Google Chromeの検索エンジンの設定を変更してみた。&lt;br /&gt;まずはデフォルトのGoogleでの検索エンジン設定を削除する。&lt;br /&gt;追加するのはGoogleの日本語版と英語版の2つ。&lt;br /&gt;&lt;br /&gt;日本語版(google.co.jp):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;名前とキーワード: google.co.jp&lt;/li&gt;&lt;li&gt;URL: http://www.google.co.jp/search?q=%s&amp;amp;hl=jp&amp;amp;lr=lang_ja&amp;amp;safe=off&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&lt;/li&gt;&lt;/ul&gt;非日本語限定版(google.com):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;名前とキーワード: google.com&lt;/li&gt;&lt;li&gt;URL:&amp;nbsp;http://www.google.com/search?q=%s&amp;amp;hl=en&amp;amp;safe=off&lt;/li&gt;&lt;/ul&gt;エロ判定なコンテンツが含まれているせいでのフィルタリングを避けたいからsafe=offなんだけど状況によっては画像検索に勇気が必要だったりするからこれは別にするのがいいのかもしれない。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-8540471064039565622?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/8540471064039565622/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=8540471064039565622' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/8540471064039565622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/8540471064039565622'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2010/03/google-chrome.html' title='Google Chromeの検索エンジンの設定'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-3356913291512943001</id><published>2010-01-23T14:22:00.003+09:00</published><updated>2010-01-23T14:26:30.643+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>MSTestExpressionAssertion - VisualStudioの単体テスト用のGallio(MbUnit)のAssertEx.Thatの改造版</title><content type='html'>&lt;a href="http://ksksts.blogspot.com/2009/11/visualstudio-2008vs2008-custom.html"&gt;VisualStudio 2008の単体テスト機能のカスタマイズ(VS2008 custom assertion example)&lt;/a&gt;の続き。&lt;br /&gt;これも放置していたけど一段落つけるまでやった。&lt;br /&gt;&lt;br /&gt;前のエントリで書いた通り&lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt;の&lt;a href="http://blog.bits-in-motion.com/2008/10/announcing-gallio-and-mbunit-v304.html"&gt;AssertEx.Thatで構成要素の式ををキャプチャしてその結果を出力できる&lt;/a&gt;のがおもしろくて同じようなことをVisualStudioの単体テストで使いたいと思ったのが動機。&lt;br /&gt;いじり方としては、Gallioのソースから欲しいファイルを部分を抜き出してそのまま使ったり変更したりしてMSTestExpressionAssertion.dllという名前のアセンブリを作った。&lt;br /&gt;これに含まれるAssertExクラスのIsTrueメソッドとIsFalseメソッドが、&lt;a href="http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.testtools.unittesting.assert_members.aspx"&gt;Microsoft.VisualStudio.TestTools.UnitTesting.AssertクラスのIsTrueとIsFalse&lt;/a&gt;の式ツリーを受け取るバージョン相当。&lt;br /&gt;MSTestExpressionAssertion.dllを参照に追加して、&lt;br /&gt;&lt;pre class="prettyprint"&gt;AssertEx.IsTrue(() =&amp;gt; true)&lt;/pre&gt;と書いたテストは成功して、&lt;br /&gt;&lt;pre class="prettyprint"&gt;AssertEx.IsTrue(() =&amp;gt; false)&lt;/pre&gt;と書いたテストは失敗する。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;テストコード:&lt;br /&gt;&lt;pre class="prettyprint"&gt;var p = new Point(1.0, 2.0);&lt;br /&gt;var tole = 1.0e-12;&lt;br /&gt;AssertEx.IsFalse(() =&amp;gt; Math.Abs(p.CalculateDistance(Point.ORIGIN) - Math.Sqrt(5.0)) &amp;lt;= tole);&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1nADMbz6CI/AAAAAAAAAFI/JguaxBpW1sg/s1600-h/MSTestExpressionAssertion-Test00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1nADMbz6CI/AAAAAAAAAFI/JguaxBpW1sg/s320/MSTestExpressionAssertion-Test00.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;エラーメッセージ:&lt;br /&gt;&lt;pre class="prettyprint"&gt;AssertEx.IsFalse failed.&lt;br /&gt;Math.Abs((p.CalculateDistance(Point.ORIGIN) - Math.Sqrt(5))) &amp;lt;= tole: True&lt;br /&gt; Math.Abs((p.CalculateDistance(Point.ORIGIN) - Math.Sqrt(5))): 0&lt;br /&gt;  p.CalculateDistance(Point.ORIGIN) - Math.Sqrt(5): 0&lt;br /&gt;   p.CalculateDistance(Point.ORIGIN): 2.23606797749979&lt;br /&gt;    p: (1, 2)&lt;br /&gt;    Point.ORIGIN: (0, 0)&lt;br /&gt;   Math.Sqrt(5): 2.23606797749979&lt;br /&gt; tole: 1E-12&lt;br /&gt;&lt;/pre&gt;まあこんなものかと。 式の中でのリテラルが浮動小数点数ではなくなっていたり、結果の出力はToString()メソッドにしているせいでそのあたりにも少し不満があるけど。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;テストコード:&lt;br /&gt;&lt;pre class="prettyprint"&gt;var m = Matrix.MakeRotation(Math.PI * 0.25);&lt;br /&gt;var tole = 1.0e-12;&lt;br /&gt;AssertEx.IsFalse(() =&amp;gt; m.Transform(new Point(1.0, 0.0)).CalculateDistance(new Point(Math.Sqrt(2.0) * 0.5, Math.Sqrt(2.0) * 0.5)) &amp;lt;= tole);&lt;br /&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/S1p7VQqC1pI/AAAAAAAAAFQ/TsdFNo6OapM/s1600-h/MSTestExpressionAssertion-Test01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/S1p7VQqC1pI/AAAAAAAAAFQ/TsdFNo6OapM/s320/MSTestExpressionAssertion-Test01.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;エラーメッセージ:&lt;br /&gt;&lt;pre class="prettyprint"&gt;AssertEx.IsFalse failed.&lt;br /&gt;m.Transform(new Point(1, 0)).CalculateDistance(new Point((Math.Sqrt(2) * 0.5), (Math.Sqrt(2) * 0.5))) &amp;lt;= tole: True&lt;br /&gt; m.Transform(new Point(1, 0)).CalculateDistance(new Point((Math.Sqrt(2) * 0.5), (Math.Sqrt(2) * 0.5))): 1.11022302462516E-16&lt;br /&gt;  m.Transform(new Point(1, 0)): (0.70710678118654757, 0.70710678118654746)&lt;br /&gt;   m: (0.70710678118654757, 0.70710678118654757, &lt;br /&gt;       0.70710678118654746, 0)&lt;br /&gt;   new Point(1, 0): (1, 0)&lt;br /&gt;  new Point((Math.Sqrt(2) * 0.5), (Math.Sqrt(2) * 0.5)): (0.70710678118654757, 0.70710678118654757)&lt;br /&gt;   Math.Sqrt(2) * 0.5: 0.707106781186548&lt;br /&gt;    Math.Sqrt(2): 1.4142135623731&lt;br /&gt;   Math.Sqrt(2) * 0.5: 0.707106781186548&lt;br /&gt;    Math.Sqrt(2): 1.4142135623731&lt;br /&gt; tole: 1E-12&lt;br /&gt;&lt;/pre&gt;この程度で既にうるさく感じる。 "Math.Sqrt(2) * 0.5"（とその下の"Math.Sqrt(2)"）が2回出力されるのもどうかと思うけど、オブジェクトが変更されるケースも当然あるから同一の式＆結果ならまとめるとかいうのもあまりよくない気がする。 細かいけどデフォルトのフォント設定ではmの結果のインデントがずれる（結果が複数行の場合のインデント処理をせっかく入れたのに）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;例外をスローするテストコード:&lt;br /&gt;&lt;pre class="prettyprint"&gt;AssertEx.IsTrue(() =&amp;gt; string.Format("{0}", null) == "");&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1p7jiVTC0I/AAAAAAAAAFY/QUa3D45bgI8/s1600-h/MSTestExpressionAssertion-Test02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1p7jiVTC0I/AAAAAAAAAFY/QUa3D45bgI8/s320/MSTestExpressionAssertion-Test02.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;エラーメッセージ:&lt;br /&gt;&lt;pre class="prettyprint"&gt;テスト メソッド MSTestExpressionAssertionTest.AssertExSample.Test02 は例外をスローしました:  System.ArgumentNullException: 値を Null にすることはできません。&lt;br /&gt;パラメータ名: args。&lt;br /&gt;&lt;/pre&gt;スタックトレース: &lt;br /&gt;&lt;pre class="prettyprint"&gt;System.String.Format(IFormatProvider provider, String format, Object[] args)&lt;br /&gt;lambda_method(ExecutionScope )&lt;br /&gt;Gallio.Common.Linq.ExpressionInstrumentor.Intercept[T](Expression expr, Func`1 continuation)&lt;br /&gt;Intercept[T](Expression expr, Func`1 continuation)&lt;br /&gt;Gallio.Common.Linq.ExpressionInstrumentor.InterceptNonVoid[T](Expression expr, Func`1 continuation)&lt;br /&gt;lambda_method(ExecutionScope )&lt;br /&gt;Gallio.Common.Linq.ExpressionInstrumentor.Intercept[T](Expression expr, Func`1 continuation)&lt;br /&gt;Intercept[T](Expression expr, Func`1 continuation)&lt;br /&gt;Gallio.Common.Linq.ExpressionInstrumentor.InterceptNonVoid[T](Expression expr, Func`1 continuation)&lt;br /&gt;lambda_method(ExecutionScope )&lt;br /&gt;Eval(Expression`1 condition)&lt;br /&gt;MSTestExpressionAssertion.AssertEx.IsTrue(Expression`1 condition, String message, Object[] parameters)&lt;br /&gt;MSTestExpressionAssertion.AssertEx.IsTrue(Expression`1 condition)&lt;br /&gt;MSTestExpressionAssertionTest.AssertExSample.Test02() C:\home\development\projects\bitbucket\junk\cs\MSTestExpressionAssertion\MSTestExpressionAssertionTest\AssertExSample.cs 内: 行 42&lt;br /&gt;&lt;/pre&gt;スローされた例外クラスはSystem.ArgumentNullExceptionクラス。&lt;br /&gt;例外クラスの型とスタックトレースの両方をうまく維持する方法が分らなかった（というか多分ない）から、スローされる例外クラスを優先した。そのためスタックトレースにMSTestExpressionAssertionのコードも含まれてしまっている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gallioからの主な変更内容:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;式ツリーに含まれる定数式以外のすべての式とその結果を出力するようにした&lt;/li&gt;&lt;li&gt;式の中で発生した例外はcatchせずにそのまま挙げるようにした&lt;/li&gt;&lt;li&gt;結果の出力はToString()メソッドを使うようにした&lt;/li&gt;&lt;/ul&gt;その他感想とか:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;すべての式を出力するための式のフォーマッタが面倒だった。Gallioの&lt;a href="http://code.google.com/p/mb-unit/source/browse/tags/v3.1-Update2/src/Gallio/Gallio35/Runtime/Formatting/ExpressionFormattingRule.cs"&gt;ExpressionFormattingRule.cs&lt;/a&gt;をベースにした&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MSTestExpressionAssertion/MSTestExpressionAssertion/Core/ExpressionFormatter.cs"&gt;ExpressionFormatter.cs&lt;/a&gt;（と補助的に&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MSTestExpressionAssertion/MSTestExpressionAssertion/Core/ExpressionExtensions.cs"&gt;ExpressionExtensions.cs&lt;/a&gt;）がその部分。staticメンバやthisのメンバの判定処理についてはもっとうまい方法があるかも。&lt;/li&gt;&lt;li&gt;デバッガで楽にテストの式にステップインできるようにMSTestExpressionAssertionプロジェクトのReleaseビルドでは/debug:none指定。デバッグシンボルがないアセンブリを読み込むと警告を表示するのがデフォルトなのがうざい。対象のコードに&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerstepthroughattribute.aspx"&gt;DebuggerStepThroughAttribute&lt;/a&gt;や&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerhiddenattribute.aspx"&gt;DebuggerHiddenAttribute&lt;/a&gt;や&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggernonusercodeattribute.aspx"&gt;DebuggerNonUserCodeAttribute&lt;/a&gt;を指定しようかと思ったけどGallioのコードを変更するのを避けるため止めた。&lt;/li&gt;&lt;li&gt;でも式が連続して実行される感じではなくなっている（結果を取得するため分解して書き換えているから）のでステップ実行が微妙。まあ使えなくはない。&lt;/li&gt;&lt;li&gt;それにしても&lt;a href="http://code.google.com/p/mb-unit/source/browse/tags/v3.1-Update2/src/Gallio/Gallio35/Common/Linq/ExpressionInstrumentor.cs"&gt;ExpressionInstrumentor.cs&lt;/a&gt;と&lt;a href="http://code.google.com/p/mb-unit/source/browse/tags/v3.1-Update2/src/Gallio/Gallio35/Runtime/Formatting/ExpressionFormattingRule.cs"&gt;ExpressionFormattingRule.cs&lt;/a&gt;はうまい。こんなのよく書くなと同時によく書けるなと思う。&lt;/li&gt;&lt;/ul&gt;ソースは&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MSTestExpressionAssertion/"&gt;BitBucketのMSTestExpressionAssertion&lt;/a&gt;。&lt;br /&gt;Gallioのソースからの変更部分は&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MSTestExpressionAssertion/MSTestExpressionAssertion/modified-files.diff"&gt;modified-files.diff&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-3356913291512943001?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/3356913291512943001/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=3356913291512943001' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3356913291512943001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3356913291512943001'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2010/01/mstestexpressionassertion.html' title='MSTestExpressionAssertion - VisualStudioの単体テスト用のGallio(MbUnit)のAssertEx.Thatの改造版'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1nADMbz6CI/AAAAAAAAAFI/JguaxBpW1sg/s72-c/MSTestExpressionAssertion-Test00.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-4636505848790455430</id><published>2010-01-16T20:45:00.005+09:00</published><updated>2010-01-16T22:00:00.080+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><title type='text'>MiniTwitter-ma - MiniTwitterの複数アカウント対応版+α</title><content type='html'>&lt;a href="http://ksksts.blogspot.com/2009/12/minitwitter.html"&gt;MiniTwitterの複数アカウント対応&lt;/a&gt;の続き。&lt;br /&gt;放置していたけど手をつけたからには一段落するまでやっておく。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/shiba-yan/"&gt;(まめ)しばやん&lt;/a&gt;さんの&lt;a href="http://minitwitter.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37447"&gt;MiniTwitter&lt;/a&gt;のバージョン1.05.2（たぶん&lt;a href="http://minitwitter.codeplex.com/SourceControl/changeset/view/62377"&gt;changeset 62377&lt;/a&gt;）をベースにして複数アカウント対応（同時に扱えるのではなくアカウントを切り替えられるという感じ）とたくさんのポストを表示できるタイムライン表示機能を追加してみた。&lt;br /&gt;&lt;br /&gt;複数アカウント対応については次の通り。&lt;br /&gt;「What's happening?」の右側に現在のアカウントを表示するボタンを追加。このボタンをクリックするとアカウントを選択するメニューがポップアップされる。&lt;br /&gt;複数のアカウントの登録できるように設定ダイアログを変更。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1GtC2RoBaI/AAAAAAAAAEo/sejIA-WXGEw/s1600-h/MiniTwitter-ma-00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1GtC2RoBaI/AAAAAAAAAEo/sejIA-WXGEw/s320/MiniTwitter-ma-00.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/S1GtKfGPHSI/AAAAAAAAAEw/a5m8FZ5tJ44/s1600-h/MiniTwitter-ma-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/S1GtKfGPHSI/AAAAAAAAAEw/a5m8FZ5tJ44/s320/MiniTwitter-ma-01.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;タイムライン表示の変更については次の通り。&lt;br /&gt;スクリーンショットは「標準」と「タイト」。どちらもテーマは「ネットブック最適化」を選択。&lt;br /&gt;「タイト」の表示は「標準」をベースにしてフォントサイズと行の高さとマージンを小さめに変更したもの。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1GuTUeJqII/AAAAAAAAAFA/TY3fAbR_24w/s1600-h/MiniTwitter-ma-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1GuTUeJqII/AAAAAAAAAFA/TY3fAbR_24w/s320/MiniTwitter-ma-03.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1GuOLUChEI/AAAAAAAAAE4/2WJ64XaEKOI/s1600-h/MiniTwitter-ma-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/S1GuOLUChEI/AAAAAAAAAE4/2WJ64XaEKOI/s320/MiniTwitter-ma-02.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ソースは&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MiniTwitter-ma/MiniTwitter-ma/"&gt;BitbucketのMiniTwitter-ma&lt;/a&gt;。オリジナルのMiniTwitterからの変更箇所は&lt;a href="http://bitbucket.org/ksksts/junk/src/tip/cs/MiniTwitter-ma/MiniTwitter-ma/modified-files.diff"&gt;modified-files.diff&lt;/a&gt;。&lt;br /&gt;ライセンスはオリジナルと同じく&lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;Apache License, Version 2.0&lt;/a&gt;。&lt;br /&gt;使う人がいるとはあまり思わないけど一応ビルド済みバイナリを&lt;a href="http://cid-9a95ebc6d71c2da1.skydrive.live.com/browse.aspx/.Public/MiniTwitter-ma"&gt;Windows LiveのSkyDriveに置いた&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;やってみた感想:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;WPFおもしろい（しばやんさん＆MiniTwitterに感謝）。&lt;/li&gt;&lt;li&gt;Apache Licenseの4-2が微妙。変更したファイルの中に変更箇所を明示する必要はなく、変更したファイルがあればそれを明示しろと解釈した（※それでは条項を満たさないと思われる場合は教えてください）。&lt;/li&gt;&lt;li&gt;相場関連を別アカウントでやっていたから複数アカウント対応が欲しかったけどアカウントを分けない方が良いように思えてきた。分けたときは「人生ｵﾜﾀ＼(^o^)／」とか素人丸出しなポストと結び付けたくないなと思っていたけど、前者になるような取引をしそうにないし、後者はそもそも素人レベルなんだからそれを隠そうとするのもどうよって思うようになってきた。フォローする人たちが全然違うけどアカウントを分けるのを止めてまとめようかと思う。&lt;/li&gt;&lt;li&gt;オリジナルのMiniTwitterのタイムライン表示はスペースを贅沢に使いすぎ、件数少なすぎ、どんだけの解像度で使っているんだよｗ、というくらいに思っていたけど自然に作るとそんな感じになると思った。&lt;/li&gt;&lt;li&gt;その上で余白少なめ、行間小さめなタイムライン表示を追加したら&lt;a href="http://eeepc.asus.com/jp/product4.htm"&gt;Eee PC 900-X&lt;/a&gt;でも使えなくないな、と。ただしUIデザインセンスのない効率性重視（&amp;lt;-機能的に必要なものを詰め込む傾向）だなぁ。&lt;/li&gt;&lt;li&gt;いじってみた上でやっぱりWPF面白い。学習が必要。&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://twitter.com/yuki1090"&gt;@yuki1090さん&lt;/a&gt;の&lt;a href="http://minitwitterkai.codeplex.com/"&gt;MiniTwitter勝手に改造版&lt;/a&gt;のテキスト選択できるようにFlowDocumentを使うのはいいなぁ…と思って今見てみたらなんか作成中プロジェクトがある。期待してみる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-4636505848790455430?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/4636505848790455430/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=4636505848790455430' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4636505848790455430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4636505848790455430'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2010/01/minitwitter-ma-minitwitter.html' title='MiniTwitter-ma - MiniTwitterの複数アカウント対応版+α'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/S1GtC2RoBaI/AAAAAAAAAEo/sejIA-WXGEw/s72-c/MiniTwitter-ma-00.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-5763301094291730077</id><published>2009-12-19T22:23:00.001+09:00</published><updated>2009-12-19T22:25:15.298+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>MiniTwitterの複数アカウント対応</title><content type='html'>Twitterクライアントを&lt;a href="http://echofon.com/"&gt;Echofon&lt;/a&gt;から&lt;a href="http://minitwitter.codeplex.com/"&gt;MiniTwitter&lt;/a&gt;に切り替えようかと思ってMiniTwitterを複数アカウント対応にしてみていた。対応の仕方としてはEchofonのように複数のアカウント情報を保存＆容易に切り替え可能という感じ、複数アカウントを同時に操作とかは要らない（それだったら複数のクライアントを使えばいい）。&lt;br /&gt;きっかけは普段使いのWebブラウザをFirefoxからGoogle Chromeに変更しようかと考えたこと。面倒くさくなってきてもう止めるかもしれないから今のうちに書いておく。&lt;br /&gt;ベースは&lt;a href="http://minitwitter.codeplex.com/SourceControl/changeset/view/61673" tooltip="linkalert-tip"&gt;Change Set 61673&lt;/a&gt;。これをやっている間にバージョン1.05系列がリリースされてた。&lt;br /&gt;&lt;br /&gt;変更内容は次の通り。&lt;br /&gt;メインウィンドウのupdateボタンの右に最後にログインしたユーザーを表示。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SyzPlhbO4LI/AAAAAAAAAEQ/YKsQFoL7wNY/s1600-h/mt-multiaccount-main-window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SyzPlhbO4LI/AAAAAAAAAEQ/YKsQFoL7wNY/s320/mt-multiaccount-main-window.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Echofonと同じようにこのログインユーザー表示をクリックすると切り替えるアカウントを選択するメニューがポップアップ。ここでアカウントを選択するとログインユーザーが切り替わる。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SyzQ46qZ0JI/AAAAAAAAAEY/o9uORAwnNtw/s1600-h/mt-multiaccount-switch-account.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SyzQ46qZ0JI/AAAAAAAAAEY/o9uORAwnNtw/s320/mt-multiaccount-switch-account.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;アカウント情報を登録したり編集したりするフォームは至ってノーマルのはず。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SyzRakNFQZI/AAAAAAAAAEg/7MdNgjZ_SgE/s1600-h/mt-multiaccount-account-setting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SyzRakNFQZI/AAAAAAAAAEg/7MdNgjZ_SgE/s320/mt-multiaccount-account-setting.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ログ保存機能は使う気がないから後回し。&lt;br /&gt;もうちょっとやりたいことをやったら変更部分の扱いをどうするか考える。&lt;br /&gt;&lt;a href="http://minitwitterkai.codeplex.com/"&gt;MiniTwitter勝手に改造版&lt;/a&gt;のコードも見てみる。&lt;br /&gt;&lt;br /&gt;この程度のことをしただけなのにXAMLとWPFについてけっこう調べて勉強になった。XAML/WPFおもしろそう。これからはWindowsフォームなんか使わないでWPFを使おう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-5763301094291730077?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/5763301094291730077/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=5763301094291730077' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/5763301094291730077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/5763301094291730077'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/12/minitwitter.html' title='MiniTwitterの複数アカウント対応'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/SyzPlhbO4LI/AAAAAAAAAEQ/YKsQFoL7wNY/s72-c/mt-multiaccount-main-window.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-1694818178117561002</id><published>2009-11-22T22:20:00.003+09:00</published><updated>2009-11-23T16:23:50.818+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>VisualStudio 2008の単体テスト機能のカスタマイズ(VS2008 custom assertion example)</title><content type='html'>結構前に&lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt;の&lt;a href="http://blog.bits-in-motion.com/2008/10/announcing-gallio-and-mbunit-v304.html" tooltip="linkalert-tip"&gt;AssertEx.Thatの式ツリーの要素をキャプチャして出力できる点&lt;/a&gt;がすごいと思ってちょっといろいろいじっていた。&lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt;は素晴らしいけどちょっと重い感じがするし、機能とか装備されているものが豊富なのはいいんだけど、もうちょっと簡単にいじれる大きすぎないフレームワークを使いたいというのが感想。&lt;br /&gt;最近それをある程度の形にしようと思って、アレンジしてVisual Studio 2008の単体テスト機能で使えるようにしようとしてVisual Studio 2008の単体テスト機能のカスタマイズを調べてみた。&lt;br /&gt;&lt;br /&gt;基本的には自前のassertionでテスト失敗の場合は&lt;a href="http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.testtools.unittesting.assertfailedexception.aspx" tooltip="linkalert-tip"&gt;AssertFailedException&lt;/a&gt;をスローすればいいんだけど、そうするとスタックトレースに診断処理や例外をスローする処理のメソッドが含まれてしまう。&lt;br /&gt;これは&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerhiddenattribute.aspx" tooltip="linkalert-tip"&gt;DebuggerHiddenAttribute&lt;/a&gt;や&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggernonusercodeattribute.aspx" tooltip="linkalert-tip"&gt;DebuggerNonUserCodeAttribute&lt;/a&gt;を使っても避けられない。デバッガとスタックトレースは別。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Swo4BebukCI/AAAAAAAAAD4/0jyb-1uVwmo/s1600/stacktrace-ng.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Swo4BebukCI/AAAAAAAAAD4/0jyb-1uVwmo/s320/stacktrace-ng.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;スタックトレースに含まれないように回避するための属性はないみたいなので、スタックトレースを操作する方向で行こうとすると例外のスタックトレース（&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.exception.stacktrace.aspx"&gt;Exception.StackTraceプロパティ&lt;/a&gt;とか）は&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stacktrace.aspx"&gt;StackTrace型&lt;/a&gt;ではなくて文字列だったりする上にSetterがない。&lt;br /&gt;どうすればいいの？例外のスタックトレースは変更できないの？と思ったけどよく見ると&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.exception.stacktrace.aspx"&gt;Exception.StackTraceプロパティ&lt;/a&gt;はvirtual宣言されているから派生させてオーバーライドすれば、このプロパティで返される値は変更できる。&lt;br /&gt;&lt;br /&gt;それでこんなコードでスタックトレースに含められないようにできそう。&lt;br /&gt;&lt;pre class="prettyprint"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Linq.Expressions;&lt;br /&gt;using System.Text;&lt;br /&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;&lt;br /&gt;&lt;br /&gt;namespace MSTestCustomAssertion&lt;br /&gt;{&lt;br /&gt;    public class ExpressionAssert&lt;br /&gt;    {&lt;br /&gt;        public static void IsTrue(Expression&amp;lt;Func&amp;lt;bool&amp;gt;&amp;gt; expr)&lt;br /&gt;        {&lt;br /&gt;            var result = expr.Compile().Invoke();&lt;br /&gt;            if (!result)&lt;br /&gt;                throw new FailedException("ExpressionAssert.IsTrue failed");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public class FailedException : AssertFailedException&lt;br /&gt;        {&lt;br /&gt;            public FailedException() : base() { }&lt;br /&gt;            public FailedException(string msg) : base(msg) { }&lt;br /&gt;            public override string StackTrace&lt;br /&gt;            {&lt;br /&gt;                get&lt;br /&gt;                {&lt;br /&gt;                    var lines = base.StackTrace.Split(new string[] { Environment.NewLine, }, StringSplitOptions.None);&lt;br /&gt;                    var index = Array.FindIndex(lines, x =&amp;gt; !x.Contains("ExpressionAssert."));&lt;br /&gt;                    var st = string.Join(Environment.NewLine, lines, index, lines.Length - index);&lt;br /&gt;                    return st;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/30fa8ac1fd2f/cs/others/MSTestCustomAssertion/" tooltip="linkalert-tip"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Visual Studioの単体テスト機能でテストを失敗させた場合のスタックトレースにExpressionAssertクラスの処理が含まれない。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/Swo4GPmuwnI/AAAAAAAAAEA/nCY3MjTqGt4/s1600/stacktrace-ok.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/Swo4GPmuwnI/AAAAAAAAAEA/nCY3MjTqGt4/s320/stacktrace-ok.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Visual Studioに統合された単体テストの機能以外で試してもいないし、例外クラスが&lt;a href="http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.testtools.unittesting.assertfailedexception.aspx" tooltip="linkalert-tip"&gt;AssertFailedException&lt;/a&gt;ではないという点が気になるけど、とりあえず手軽にするならこの方法でもいいかもしれない。&lt;br /&gt;&lt;br /&gt;手間は増えるだろうけどInternalPreserveStackTraceを使ったやり方のほうがちゃんとしていそう。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://yama-mayaa.livejournal.com/14588.html" tooltip="linkalert-tip"&gt;yama_mayaa - Having your InternalPreserveStackTrace and eating it&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://addinit.com/?q=node/56" tooltip="linkalert-tip"&gt;Re-throwing Exceptions in C# with InternalPreserveStackTrace | A.D.D. In IT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://clarius.svn.codeplex.com/svn/Assertions.txt"&gt;Clarius Consulting labsのAssertions.txt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.clariusconsulting.net/blogs/kzu/archive/2009/07/25/163348.aspx"&gt;Daniel Cazzulino's Blog : Extensible Test Assertions With MSTest VSTS&lt;/a&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/38418138-1694818178117561002?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/1694818178117561002/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=1694818178117561002' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1694818178117561002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1694818178117561002'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/visualstudio-2008vs2008-custom.html' title='VisualStudio 2008の単体テスト機能のカスタマイズ(VS2008 custom assertion example)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pBXOwAPpQ6w/Swo4BebukCI/AAAAAAAAAD4/0jyb-1uVwmo/s72-c/stacktrace-ng.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-2492757578122779254</id><published>2009-11-15T22:30:00.001+09:00</published><updated>2009-11-15T22:31:00.069+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>配列やList&lt;T&gt;をIList&lt;T&gt;型のインデクサでアクセスするとパフォーマンスが悪い(don't use IList&lt;T&gt;'s indexer)</title><content type='html'>&lt;a href="http://ksksts.blogspot.com/2009/11/csort-algorithms-in-c.html"&gt;C#でのソートアルゴリズムのまとめ(sort algorithms in C#)&lt;/a&gt;とか&lt;a href="http://ksksts.blogspot.com/2009/11/ilist-getenumeratorforeach.html"&gt;IList&amp;lt;T&amp;gt;の走査処理の比較（インデクサ／GetEnumerator／foreach）&lt;/a&gt;で「配列の添字アクセスが遅い」とか書いたけどこれは間違い。「配列をIList&amp;lt;T&amp;gt;型にキャストしてインデクサでアクセスすると遅い」というのが正しい。&lt;br /&gt;実際には配列をそのまま添字でアクセスする処理はList&amp;lt;T&amp;gt;のインデクサアクセスよりも速い。&lt;br /&gt;それにList&amp;lt;T&amp;gt;もIList&amp;lt;T&amp;gt;型にキャストしてインデクサでアクセスすのは（List&amp;lt;T&amp;gt;のインデクサよりも）遅い。&lt;br /&gt;インターフェースってこんなに影響するものなのか。配列やList&amp;lt;T&amp;gt;の特殊な最適化処理があったりしてそれが適用されなくなったりした影響なのかな。&lt;br /&gt;&lt;br /&gt;測定した結果は次の通り。&lt;br /&gt;int[]に対する配列の添字アクセスが最も速くてIList&amp;lt;T&amp;gt;のインデクサを通すとなぜか10倍弱の時間がかかるようになる。&lt;br /&gt;List&amp;lt;T&amp;gt;のインデクサアクセスは配列の添字アクセスより遅いらしい。これもIList&amp;lt;T&amp;gt;のインデクサを通すと配列ほどじゃないけど遅くなる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;array: 662 (1.00)&lt;br /&gt;(IList&amp;lt;T&amp;gt;)array: 6259 (9.45)&lt;br /&gt;list: 1325 (2.00)&lt;br /&gt;(IList&amp;lt;T&amp;gt;)list: 1592 (2.40)&lt;br /&gt;IListArrayWrapper: 1166 (1.76)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/0ff9bb6b1c37/cs/others/IListArray/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/0ff9bb6b1c37/cs/others/IListArray/IListArrayWrapper.cs"&gt;IListArrayWrapper&lt;/a&gt;は値型の配列をラップしてポインタを使ったunsafeなインデクサを実装したクラス。&lt;br /&gt;ジェネリックに実装しようとしたけどジェネリック引数の型のポインタを取得する方法が分からなかった。"where T : struct"の指定があればOKにしてもいいんじゃないかと思うけど、とりあえずできなかったからint型用のコードにした。&lt;br /&gt;&lt;br /&gt;ダメだったコード:&lt;br /&gt;&lt;pre class="prettyprint"&gt;public class IListArrayWrapper&amp;lt;T&amp;gt; where T : struct&lt;br /&gt;    {&lt;br /&gt;        public T[] Source { get; set; }&lt;br /&gt;        unsafe public T this[int index]&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                fixed (T* p = &amp;Source[0])&lt;br /&gt;                    return *(p + index);&lt;br /&gt;            }&lt;br /&gt;            set&lt;br /&gt;            {&lt;br /&gt;                fixed (T* p = &amp;Source[0])&lt;br /&gt;                    *(p + index) = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        public IListArrayWrapper(IList&amp;lt;T&amp;gt; source)&lt;br /&gt;        {&lt;br /&gt;            Source = (T[])source;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/0ff9bb6b1c37/cs/others/IListArray/IListArrayWrapper.cs"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;まとめとしては、配列とIList&amp;lt;T&amp;gt;を実装したランダムアクセス可能なコレクションの両方を処理する＆パフォーマンスを気にするコードを書く場合は分けたほうがいいみたい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-2492757578122779254?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/2492757578122779254/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=2492757578122779254' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/2492757578122779254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/2492757578122779254'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/list-ilist-dont-use-ilist-s-indexer.html' title='配列やList&amp;lt;T&amp;gt;をIList&amp;lt;T&amp;gt;型のインデクサでアクセスするとパフォーマンスが悪い(don&apos;t use IList&amp;lt;T&amp;gt;&apos;s indexer)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-1237030908989913980</id><published>2009-11-15T20:09:00.004+09:00</published><updated>2009-11-15T22:35:33.424+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#でのソートアルゴリズムのまとめ(sort algorithms in C#)</title><content type='html'>&lt;a href="http://www.stereopsis.com/radix.html"&gt;stereopsis : graphics : radix tricks&lt;/a&gt;や&lt;a href="http://stlport.sourceforge.net/"&gt;STLport&lt;/a&gt;のソースをパクったりしたC#でのソートのまとめ。&lt;br /&gt;&lt;br /&gt;それぞれのアルゴリズムとか関連エントリとか。 &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/cradix-sortarraysortquick-sort.html" tooltip="linkalert-tip"&gt;ksksts's blog: C#で実装したradix sortとArray.Sortのquick sortとの比較&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/cradix-sort.html" tooltip="linkalert-tip"&gt;ksksts's blog: C#で符号付整数／浮動小数点数対応の基数ソート(radix sort)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/cin-place-merge-sort.html" tooltip="linkalert-tip"&gt;ksksts's blog: C#でin place merge sortを書いてみたらかなり遅かった&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/merge-sort-with-buffer-in-c.html" tooltip="linkalert-tip"&gt;ksksts's blog: バッファを使用するマージソートも書いてみた(merge sort with buffer in C#)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/introsort-in-c.html"&gt;ksksts's blog: イントロソートも書いてみた(introsort in C#)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;配列に対するソートとList&amp;lt;T&amp;gt;に対するソートに対するソートとの差や&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.linq.enumerable.orderby.aspx" tooltip="linkalert-tip"&gt;Enumerable.OrderBy メソッド (System.Linq)&lt;/a&gt;とかも含めた測定結果は次の通り。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;Array.Sort: 1186 (1.00)&lt;br /&gt;List.Sort: 1050 (0.89)&lt;br /&gt;Array.OrderBy: 6592 (5.56)&lt;br /&gt;List.OrderBy: 3305 (2.78)&lt;br /&gt;CombSort Array: 31971 (26.94)&lt;br /&gt;CombSort List: 6909 (5.82)&lt;br /&gt;NumberRadixSorter.Sort Array: 4943 (4.17)&lt;br /&gt;NumberRadixSorter.Sort List: 2291 (1.93)&lt;br /&gt;InPlaceMergeSorter.Sort Array: 40326 (33.98)&lt;br /&gt;InPlaceMergeSorter.Sort List: 12642 (10.65)&lt;br /&gt;MergeSorter.Sort Array: 24463 (20.61)&lt;br /&gt;MergeSorter.Sort List: 9604 (8.09)&lt;br /&gt;IntroSorter.Sort Array: 22909 (19.30)&lt;br /&gt;IntroSorter.Sort List: 4158 (3.50)&lt;br /&gt;&lt;br /&gt;size: 10000&lt;br /&gt;Array.Sort: 12771 (1.00)&lt;br /&gt;List.Sort: 12497 (0.98)&lt;br /&gt;Array.OrderBy: 41599 (3.26)&lt;br /&gt;List.OrderBy: 41126 (3.22)&lt;br /&gt;CombSort Array: 465802 (36.47)&lt;br /&gt;CombSort List: 101879 (7.98)&lt;br /&gt;NumberRadixSorter.Sort Array: 27803 (2.18)&lt;br /&gt;NumberRadixSorter.Sort List: 22234 (1.74)&lt;br /&gt;InPlaceMergeSorter.Sort Array: 553976 (43.38)&lt;br /&gt;InPlaceMergeSorter.Sort List: 202408 (15.85)&lt;br /&gt;MergeSorter.Sort Array: 224039 (17.54)&lt;br /&gt;MergeSorter.Sort List: 128939 (10.10)&lt;br /&gt;IntroSorter.Sort Array: 158357 (12.40)&lt;br /&gt;IntroSorter.Sort List: 52881 (4.14)&lt;br /&gt;&lt;br /&gt;size: 100000&lt;br /&gt;Array.Sort: 146888 (1.00)&lt;br /&gt;List.Sort: 145938 (0.99)&lt;br /&gt;Array.OrderBy: 520984 (3.55)&lt;br /&gt;List.OrderBy: 518649 (3.53)&lt;br /&gt;CombSort Array: 6044506 (41.15)&lt;br /&gt;CombSort List: 1311650 (8.93)&lt;br /&gt;NumberRadixSorter.Sort Array: 279857 (1.91)&lt;br /&gt;NumberRadixSorter.Sort List: 218608 (1.49)&lt;br /&gt;InPlaceMergeSorter.Sort Array: 8215845 (55.93)&lt;br /&gt;InPlaceMergeSorter.Sort List: 2860999 (19.48)&lt;br /&gt;MergeSorter.Sort Array: 2931658 (19.96)&lt;br /&gt;MergeSorter.Sort List: 1869126 (12.72)&lt;br /&gt;IntroSorter.Sort Array: 1945971 (13.25)&lt;br /&gt;IntroSorter.Sort List: 658093 (4.48)&lt;br /&gt;&lt;br /&gt;size: 1000000&lt;br /&gt;Array.Sort: 1666666 (1.00)&lt;br /&gt;List.Sort: 1668472 (1.00)&lt;br /&gt;Array.OrderBy: 6961424 (4.18)&lt;br /&gt;List.OrderBy: 6901036 (4.14)&lt;br /&gt;CombSort Array: 76084478 (45.65)&lt;br /&gt;CombSort List: 16674472 (10.00)&lt;br /&gt;NumberRadixSorter.Sort Array: 2864637 (1.72)&lt;br /&gt;NumberRadixSorter.Sort List: 2245710 (1.35)&lt;br /&gt;InPlaceMergeSorter.Sort Array: 110817348 (66.49)&lt;br /&gt;InPlaceMergeSorter.Sort List: 38880094 (23.33)&lt;br /&gt;MergeSorter.Sort Array: 35271234 (21.16)&lt;br /&gt;MergeSorter.Sort List: 20756358 (12.45)&lt;br /&gt;IntroSorter.Sort Array: 24093398 (14.46)&lt;br /&gt;IntroSorter.Sort List: 8047601 (4.83)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/54e16cf6554f/cs/Sort/" tooltip="linkalert-tip"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;まとめ:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;安定でないソートなら&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.array.sort%28VS.80%29.aspx" tooltip="linkalert-tip"&gt;Array.Sort メソッド (System)&lt;/a&gt;か&lt;a href="http://msdn.microsoft.com/ja-jp/library/3da4abas.aspx" tooltip="linkalert-tip"&gt;List(T).Sort メソッド (System.Collections.Generic)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;安定なソートなら&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.linq.enumerable.orderby.aspx" tooltip="linkalert-tip"&gt;Enumerable.OrderBy メソッド (System.Linq)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt; &lt;a href="http://stlport.sourceforge.net/"&gt;STLport&lt;/a&gt;のソースをパクった結果としては速い順にIntroSort（STLのstd::sort）, InPlaceMergeSort（STLのstd::stable_sortのバッファを使わない版）, MergeSort（STLのstd::stable_sortのバッファを使う版）。そしてRadixSort（基数ソート）はこいつらより速い。&lt;/li&gt;&lt;li&gt;&lt;strike&gt;配列の添字でのランダムアクセスはList&amp;lt;T&amp;gt;のインデクサでのアクセスより遅い？&lt;/strike&gt;（これはIList&amp;lt;T&amp;gt;を経由しているのが原因だったみたい &lt;a href="http://ksksts.blogspot.com/2009/11/list-ilist-dont-use-ilist-s-indexer.html" tooltip="linkalert-tip"&gt;ksksts's blog: 配列やList&amp;lt;T&amp;gt;をIList&amp;lt;T&amp;gt;型のインデクサでアクセスするとパフォーマンスが悪い(don't use IList&amp;lt;T&amp;gt;'s indexer)&lt;/a&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/38418138-1237030908989913980?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/1237030908989913980/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=1237030908989913980' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1237030908989913980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1237030908989913980'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/csort-algorithms-in-c.html' title='C#でのソートアルゴリズムのまとめ(sort algorithms in C#)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-28509212210862151</id><published>2009-11-14T13:24:00.001+09:00</published><updated>2009-11-14T13:26:39.952+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>イントロソートも書いてみた(introsort in C#)</title><content type='html'>&lt;a href="http://ksksts.blogspot.com/2009/11/cin-place-merge-sort.html"&gt;バッファを使わないマージソート&lt;/a&gt;と&lt;a href="http://ksksts.blogspot.com/2009/11/merge-sort-with-buffer-in-c.html"&gt;バッファを使うマージソート&lt;/a&gt;のついでに&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AD%E3%82%BD%E3%83%BC%E3%83%88"&gt;イントロソート&lt;/a&gt;も&lt;a href="http://stlport.sourceforge.net/"&gt;STLport&lt;/a&gt;からパクってみた。&lt;br /&gt;&lt;br /&gt;STLportの&lt;a href="http://stlport.git.sourceforge.net/git/gitweb.cgi?p=stlport/stlport;a=tree;f=stlport/stl;hb=HEAD"&gt;_algo.c, _heap.h, _heap.c&lt;/a&gt;の__introsort_loop, __unguarded_partition, __final_insertion_sort, __unguarded_linear_insert, __partial_sort, __make_heap, __adjust_heap, __push_heap_aux, __pop_heap_aux, sort_heapあたりをC#で書いただけ。&lt;br /&gt;かなり手抜きだと思う。マージソートとの速度差をみたいだけだから。&lt;br /&gt;&lt;br /&gt;結果は次の通り。&lt;br /&gt;Array.Sortの十数倍の時間がかかっている。&lt;a href="http://ksksts.blogspot.com/2009/11/merge-sort-with-buffer-in-c.html"&gt;バッファを使用するマージソート&lt;/a&gt;よりは多少速い。&lt;br /&gt;ソート対象を&lt;a href="http://ksksts.blogspot.com/2009/11/ilist-getenumeratorforeach.html"&gt;配列からList&amp;lt;T&amp;gt;に変更するだけで数倍良くなるはず&lt;/a&gt;だから後でまとめて試してみる。&lt;br /&gt;今になって&lt;a href="http://ksksts.blogspot.com/2009/11/cradix-sortarraysortquick-sort.html"&gt;基数ソート(radix sort)がかなり速い&lt;/a&gt;ということを実感。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;IntroSorter.Sort: 20622 (18.78)&lt;br /&gt;Array.Sort: 1098 (1.00)&lt;br /&gt;size: 10000&lt;br /&gt;IntroSorter.Sort: 139073 (10.98)&lt;br /&gt;Array.Sort: 12667 (1.00)&lt;br /&gt;size: 100000&lt;br /&gt;IntroSorter.Sort: 1771360 (12.22)&lt;br /&gt;Array.Sort: 144995 (1.00)&lt;br /&gt;size: 1000000&lt;br /&gt;IntroSorter.Sort: 21275858 (12.85)&lt;br /&gt;Array.Sort: 1656005 (1.00)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/d017387db9b3/cs/IntroSort/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-28509212210862151?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/28509212210862151/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=28509212210862151' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/28509212210862151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/28509212210862151'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/introsort-in-c.html' title='イントロソートも書いてみた(introsort in C#)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-3674434520309946988</id><published>2009-11-12T13:20:00.001+09:00</published><updated>2009-11-14T12:58:29.098+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>バッファを使用するマージソートも書いてみた(merge sort with buffer in C#)</title><content type='html'>&lt;a href="http://ksksts.blogspot.com/2009/11/cin-place-merge-sort.html"&gt;in-place merge sort&lt;/a&gt;を&lt;a href="http://www.eqatec.com/tools/profiler"&gt;EQUATEC Profiler&lt;/a&gt;でプロファイルしてみたけど特におかしいと感じるところは見つからず、結局マージ回数が多すぎじゃないかと思う（あとお手玉Rotatenってやっぱり速いのかなと）。&lt;br /&gt;in-placeじゃないアルゴリズムとの比較をするために&lt;a href="http://stlport.sourceforge.net/"&gt;STLport&lt;/a&gt;の&lt;a href="http://stlport.git.sourceforge.net/git/gitweb.cgi?p=stlport/stlport;a=tree;f=stlport/stl;hb=HEAD"&gt;_algo.c&lt;/a&gt;のstable_sortから__stable_sort_adaptive, __merge_sort_with_buffer, __chunk_insertion_sort, __merge_sort_loop, mergeあたりを辿って、ソート対象の要素個数分のバッファを使用するマージソートをC#で書いてみた。&lt;br /&gt;結果は下記の通り。&lt;a href="http://ksksts.blogspot.com/2009/11/cin-place-merge-sort.html"&gt;in-place merge sort&lt;/a&gt;よりは良い。でもまだArray.Sortの十数倍の時間がかかっている。&lt;br /&gt;いろいろ小賢しいことをやっているからもっとシンプルな素直なコードを書いてみたほうがいいかもしれない。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;InPlaceMergeSorter.Sort: 37314 (33.24)&lt;br /&gt;MergeSorter.Sort: 21869 (19.48)&lt;br /&gt;Array.Sort: 1122 (1.00)&lt;br /&gt;size: 10000&lt;br /&gt;InPlaceMergeSorter.Sort: 502465 (39.24)&lt;br /&gt;MergeSorter.Sort: 198861 (15.53)&lt;br /&gt;Array.Sort: 12805 (1.00)&lt;br /&gt;size: 100000&lt;br /&gt;InPlaceMergeSorter.Sort: 7425488 (47.00)&lt;br /&gt;MergeSorter.Sort: 2556782 (16.18)&lt;br /&gt;Array.Sort: 157988 (1.00)&lt;br /&gt;size: 1000000&lt;br /&gt;InPlaceMergeSorter.Sort: 98928451 (58.09)&lt;br /&gt;MergeSorter.Sort: 31298754 (18.38)&lt;br /&gt;Array.Sort: 1703143 (1.00)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/398b5e901dc0/cs/MergeSort/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-3674434520309946988?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/3674434520309946988/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=3674434520309946988' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3674434520309946988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3674434520309946988'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/merge-sort-with-buffer-in-c.html' title='バッファを使用するマージソートも書いてみた(merge sort with buffer in C#)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-7591817703948662185</id><published>2009-11-10T23:38:00.002+09:00</published><updated>2009-11-12T12:21:33.966+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#でin place merge sortを書いてみたらかなり遅かった</title><content type='html'>C#で簡単に使いまわせる安定なソートを用意しておこうと思って&lt;a href="http://thomas.baudel.name/Visualisation/VisuTri/inplacestablesort.html"&gt;In place stable Sort (merge sort)&lt;/a&gt;を参考に書いてみたらかなり遅かった。&lt;br /&gt;&lt;a href="http://thomas.baudel.name/Visualisation/VisuTri/inplacestablesort.html"&gt;In place stable Sort (merge sort)&lt;/a&gt;のソースの不自然さが気になったから&lt;a href="http://stlport.sourceforge.net/"&gt;STLport&lt;/a&gt;の&lt;a href="http://stlport.git.sourceforge.net/git/gitweb.cgi?p=stlport/stlport;a=tree;f=stlport/stl;hb=HEAD"&gt;_algo.cとか_algobase.cとか&lt;/a&gt;も参考にした。&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.array.sort%28VS.90%29.aspx"&gt;Array.Sort&lt;/a&gt;の数十倍時間がかかるとか、これじゃあまり使う気にならない。&lt;br /&gt;何かミスっているのかもしれないし、in placeでなければもうちょっとましかもしれない。明日もう少し調べてみる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;merge sort: 37580 (30.34)&lt;br /&gt;Array.Sort: 1238 (1.00)&lt;br /&gt;size: 10000&lt;br /&gt;merge sort: 506318 (41.50)&lt;br /&gt;Array.Sort: 12199 (1.00)&lt;br /&gt;size: 100000&lt;br /&gt;merge sort: 7170923 (50.21)&lt;br /&gt;Array.Sort: 142813 (1.00)&lt;br /&gt;size: 1000000&lt;br /&gt;merge sort: 97304833 (60.94)&lt;br /&gt;Array.Sort: 1596662 (1.00)&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c4531f56ab04/cs/InPlaceMergeSort/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-7591817703948662185?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/7591817703948662185/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=7591817703948662185' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7591817703948662185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7591817703948662185'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/cin-place-merge-sort.html' title='C#でin place merge sortを書いてみたらかなり遅かった'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-4211017056628521171</id><published>2009-11-07T23:51:00.002+09:00</published><updated>2009-11-14T12:56:40.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#で符号付整数／浮動小数点数対応の基数ソート(radix sort)</title><content type='html'>&lt;a href="http://www.radiumsoftware.com/0310.html#031028" tooltip="linkalert-tip"&gt;Radium Software Development&lt;/a&gt;経由で&lt;a href="http://codercorner.com/RadixSortRevisited.htm" tooltip="linkalert-tip"&gt;Radix Sort Revisited&lt;/a&gt;を見て、さらに&lt;a href="http://d.hatena.ne.jp/toge/20060723#1153681956" tooltip="linkalert-tip"&gt;2006-07-23 - togeの日記&lt;/a&gt;経由で&lt;a href="http://www.stereopsis.com/radix.html" tooltip="linkalert-tip"&gt;stereopsis : graphics : radix tricks&lt;/a&gt;も読んだから書いてみた。&lt;br /&gt;&lt;a href="http://ksksts.blogspot.com/2009/11/cradix-sortarraysortquick-sort.html" tooltip="linkalert-tip"&gt;ksksts's blog: C#で実装したradix sortとArray.Sortのquick sortとの比較&lt;/a&gt;で実行速度で.NET Frameworkの&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.array.sort.aspx" tooltip="linkalert-tip"&gt;Array.Sort メソッド (System)&lt;/a&gt;とかを上回るのは難しいと感じた時点で目的を実装例を示すだけに変更。&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.decimal.aspx" tooltip="linkalert-tip"&gt;Decimal型&lt;/a&gt;や&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.string.aspx" tooltip="linkalert-tip"&gt;String型&lt;/a&gt;に対応しようと思っていたけど、面倒くさくなったから符号なし整数型、符号付整数型、浮動小数点数型で止めとく。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stereopsis.com/radix.html" tooltip="linkalert-tip"&gt;stereopsis : graphics : radix tricks&lt;/a&gt;のコードを参考にして書いた。&lt;br /&gt;おおまかな処理の流れは次の通り。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ヒストグラムをまとめて作成（histgramming）&lt;/li&gt;&lt;li&gt;ヒストグラムの値を加算（sum the histgrams）&lt;/li&gt;&lt;li&gt;要素の並べ替え（read/write histgram, copy）&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;インターフェースはこんな感じ。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c92d086a19e9/cs/RadixSort/RadixSort/RadixSorter.cs"&gt;RadixSorter.cs&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;public static void Sort&amp;lt;T&amp;gt;(IList&amp;lt;T&amp;gt; list, Func&amp;lt;T, UInt32&amp;gt; converter, SortOrder sortOrder)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ソートに使用するキーを指定しながらソートできるのがおもしろい。&lt;br /&gt;&lt;pre class="prettyprint"&gt;struct Pair&amp;lt;TFirst, TSecond&amp;gt;&lt;br /&gt;{&lt;br /&gt;    public TFirst First { get; set; }&lt;br /&gt;    public TSecond Second { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;このPair型に対して、&lt;br /&gt;&lt;pre class="prettyprint"&gt;RadixSorter.Sort(result, x =&amp;gt; x.Second, RadixSorter.SortOrder.Ascending);&lt;br /&gt;RadixSorter.Sort(result, x =&amp;gt; x.First, RadixSorter.SortOrder.Ascending);&lt;br /&gt;&lt;/pre&gt;とすると、次のCompareTo（Firstで比較＆Firstが等しい場合はSecondで比較）でソートした場合と同じ結果が得られる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;public int CompareTo(Pair&amp;lt;TFirst, TSecond&amp;gt; x)&lt;br /&gt;{&lt;br /&gt;    var result = First.CompareTo(x.First);&lt;br /&gt;    if (result == 0)&lt;br /&gt;        result = Second.CompareTo(x.Second);&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あとは書いてみて思ったこととか。&lt;br /&gt;&lt;br /&gt;ヒストグラムをずらして作っておくと加算する処理が簡単になること、降順にソートする場合はヒストグラムの加算の処理で対応できること。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c92d086a19e9/cs/RadixSort/RadixSort/NumberRadixSorter.cs"&gt;NumberRadixSorter.csのSort(IList&lt;uint32&gt; list, SortOrder sortOrder)&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// histgramming&lt;br /&gt;            var histgramOffset = ascending ? 1 : -1;&lt;br /&gt;            foreach (var x in list)&lt;br /&gt;            {&lt;br /&gt;                var y = x;&lt;br /&gt;                for (var p = 0; p &amp;lt; tables.Length; p++)&lt;br /&gt;                {&lt;br /&gt;                    tables[p][(y + histgramOffset) &amp; 0xFF]++;&lt;br /&gt;                    y = y &amp;gt;&amp;gt; 8;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // sum the histgrams&lt;br /&gt;            if (ascending)&lt;br /&gt;            {&lt;br /&gt;                foreach (var table in tables)&lt;br /&gt;                {&lt;br /&gt;                    table[0] = 0;&lt;br /&gt;                    for (var n = 1; n &amp;lt; table.Length; n++)&lt;br /&gt;                        table[n] += table[n - 1];&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                foreach (var table in tables)&lt;br /&gt;                {&lt;br /&gt;                    table[0xFF] = 0;&lt;br /&gt;                    for (var n = 0xFE; n &amp;gt;= 0x00; n--)&lt;br /&gt;                        table[n] += table[n + 1];&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;符号付整数型でも同様。ただし符号ビットを含む部分だけ工夫する。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c92d086a19e9/cs/RadixSort/RadixSort/NumberRadixSorter.cs"&gt;NumberRadixSorter.csのSort(IList&lt;int32&gt; list, SortOrder sortOrder)&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// sum the histgrams&lt;br /&gt;            if (ascending)&lt;br /&gt;            {&lt;br /&gt;                for (var p = 0; p &amp;lt; tables.Length - 1; p++)&lt;br /&gt;                {&lt;br /&gt;                    var table = tables[p];&lt;br /&gt;                    table[0] = 0;&lt;br /&gt;                    for (var n = 1; n &amp;lt; table.Length; n++)&lt;br /&gt;                        table[n] += table[n - 1];&lt;br /&gt;                }&lt;br /&gt;                {&lt;br /&gt;                    var table = tables[tables.Length - 1];&lt;br /&gt;                    table[0x80] = 0;&lt;br /&gt;                    for (var n = 0x81; n &amp;lt;= 0xFF; n++)&lt;br /&gt;                        table[n] += table[n - 1];&lt;br /&gt;                    table[0x00] += table[0xFF];&lt;br /&gt;                    for (var n = 0x01; n &amp;lt; 0x80; n++)&lt;br /&gt;                        table[n] += table[n - 1];&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                for (var p = 0; p &amp;lt; tables.Length - 1; p++)&lt;br /&gt;                {&lt;br /&gt;                    var table = tables[p];&lt;br /&gt;                    table[0xFF] = 0;&lt;br /&gt;                    for (var n = 0xFE; n &amp;gt;= 0x00; n--)&lt;br /&gt;                        table[n] += table[n + 1];&lt;br /&gt;                }&lt;br /&gt;                {&lt;br /&gt;                    var table = tables[tables.Length - 1];&lt;br /&gt;                    table[0x7F] = 0;&lt;br /&gt;                    for (var n = 0x7E; n &amp;gt;= 0x00; n--)&lt;br /&gt;                        table[n] += table[n + 1];&lt;br /&gt;                    table[0xFF] += table[0x00];&lt;br /&gt;                    for (var n = 0xFE; n &amp;gt;= 0x80; n--)&lt;br /&gt;                        table[n] += table[n + 1];&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;浮動小数点数の場合は、要素が数値でそれを変更できる場合はヒストグラムを作るときにビットをflipして、ソート後に元に戻すとかできる（&lt;a href="http://www.stereopsis.com/radix.html"&gt;stereopsis : graphics : radix tricks&lt;/a&gt;のコードでやっている）。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c92d086a19e9/cs/RadixSort/RadixSort/NumberRadixSorter.cs"&gt;NumberRadixSorter.csのSort(IList&lt;double&gt; list, SortOrder sortOrder)&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;// histgramming&lt;br /&gt;            var histgramOffset = ascending ? 1 : -1;&lt;br /&gt;            for (var n = 0; n &amp;lt; list.Count; n++)&lt;br /&gt;            {&lt;br /&gt;                var y = BitConverter.DoubleToInt64Bits(list[n]);&lt;br /&gt;                y ^= -(Int64)((UInt64)y &amp;gt;&amp;gt; 63) | unchecked((Int64)0x8000000000000000);  // flip&lt;br /&gt;                list[n] = BitConverter.Int64BitsToDouble(y);&lt;br /&gt;                for (var p = 0; p &amp;lt; tables.Length; p++)&lt;br /&gt;                {&lt;br /&gt;                    tables[p][(y + histgramOffset) &amp; 0xFF]++;&lt;br /&gt;                    y = y &amp;gt;&amp;gt; 8;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;pre class="prettyprint"&gt;// read/write histgram, copy&lt;br /&gt;            IList&amp;lt;Double&amp;gt; array = new Double[list.Count];&lt;br /&gt;            Action swap = () =&amp;gt; { var temp = list; list = array; array = temp; };&lt;br /&gt;            for (var p = 0; p &amp;lt; tables.Length - 1; p++)&lt;br /&gt;            {&lt;br /&gt;                var table = tables[p];&lt;br /&gt;                foreach (var x in list)&lt;br /&gt;                {&lt;br /&gt;                    var y = BitConverter.DoubleToInt64Bits(x);&lt;br /&gt;                    y = (y &amp;gt;&amp;gt; p * 8) &amp; 0xFF;&lt;br /&gt;                    array[table[y]] = x;&lt;br /&gt;                    table[y]++;&lt;br /&gt;                }&lt;br /&gt;                swap();&lt;br /&gt;            }&lt;br /&gt;            {&lt;br /&gt;                var p = tables.Length - 1;&lt;br /&gt;                var table = tables[p];&lt;br /&gt;                foreach (var x in list)&lt;br /&gt;                {&lt;br /&gt;                    var w = BitConverter.DoubleToInt64Bits(x);&lt;br /&gt;                    var y = (w &amp;gt;&amp;gt; p * 8) &amp; 0xFF;&lt;br /&gt;                    w ^= (Int64)((UInt64)w &amp;gt;&amp;gt; 63) - 1 | unchecked((Int64)0x8000000000000000);  // flip back&lt;br /&gt;                    array[table[y]] = BitConverter.Int64BitsToDouble(w);&lt;br /&gt;                    table[y]++;&lt;br /&gt;                }&lt;br /&gt;                swap();&lt;br /&gt;            }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/c92d086a19e9/cs/RadixSort/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-4211017056628521171?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/4211017056628521171/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=4211017056628521171' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4211017056628521171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4211017056628521171'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/cradix-sort.html' title='C#で符号付整数／浮動小数点数対応の基数ソート(radix sort)'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-3683795257987687329</id><published>2009-11-06T23:09:00.003+09:00</published><updated>2009-11-14T12:48:27.027+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>Decimal型のフォーマット</title><content type='html'>&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.decimal.getbits.aspx" tooltip="linkalert-tip"&gt;Decimal.GetBits メソッド (System)&lt;/a&gt;で解説されている。&lt;br /&gt;&lt;blockquote&gt;Decimal 数値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および整数値を除算し、小数部を指定するために使用するスケール ファクタから構成されます。スケール ファクタは黙示的に数値 10 になり、0 から 28 の範囲の指数で累乗されます。&lt;br /&gt;戻り値は、4 要素の 32 ビット符号付き整数配列です。&lt;br /&gt;この配列の 1 ～ 3 番目の要素は、96 ビット整数の下位 32 ビット、中位 32 ビット、および上位 32 ビットをそれぞれ格納しています。&lt;br /&gt;4 番目の要素は、スケール ファクタと符号を格納しています。この要素は、次に示す部分から構成されています。&lt;br /&gt;ビット 0 ～ 15 の下位ワードは未使用で、0 である必要があります。&lt;br /&gt;ビット 16 ～ 23 には、0 から 28 までの範囲の指数部を格納する必要があります。この指数部は、整数を除算する 10 の累乗を示します。&lt;br /&gt;ビット 24 ～ 30 は未使用で、0 である必要があります。&lt;br /&gt;ビット 31 は符号を格納している必要があります。0 は正、1 は負を表します。&lt;br /&gt;ビット形式では負の 0 と正の 0 が区別されます。これらの値はすべての演算で等値として扱われます。&lt;br /&gt;&lt;/blockquote&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.decimal.getbits.aspx" tooltip="linkalert-tip"&gt;Decimal.GetBits メソッド&lt;/a&gt;の戻り値はint[]でいまいち分かりにくいから確認用のコードを書いた（下手なコードだと思うけど良い方法を思いつけなかった）。&lt;br /&gt;指数部が10の累乗なんだからSingle/Doubleとは違う分かりやすい値に変えた。&lt;br /&gt;&lt;pre class="prettyprint"&gt;unsafe private static void PrintDecimal()&lt;br /&gt;        {&lt;br /&gt;            Func&amp;lt;Decimal, byte[]&amp;gt; toBytes = x =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                var p = (byte*)&amp;x;&lt;br /&gt;                var bytes = new byte[sizeof(Decimal)];&lt;br /&gt;                for (var n = 0; n &amp;lt; bytes.Length; n++)&lt;br /&gt;                    bytes[n] = *p++;&lt;br /&gt;                return bytes;&lt;br /&gt;            };&lt;br /&gt;            WriteLine("Decimal:");&lt;br /&gt;            WriteLine("0.0M", toBytes(0.0M));&lt;br /&gt;            WriteLine("-0.0M", toBytes(-0.0M));&lt;br /&gt;            WriteLine("0.12M", toBytes(0.12M));&lt;br /&gt;            WriteLine("1.2M ", toBytes(1.2M));&lt;br /&gt;            WriteLine("12M  ", toBytes(12M));&lt;br /&gt;            WriteLine("120M ", toBytes(120M));&lt;br /&gt;            WriteLine("1200M", toBytes(1200M));&lt;br /&gt;            WriteLine("-0.12M", toBytes(-0.12M));&lt;br /&gt;            WriteLine("-1.2M ", toBytes(-1.2M));&lt;br /&gt;            WriteLine("-12M  ", toBytes(-12M));&lt;br /&gt;            WriteLine("-120M ", toBytes(-120M));&lt;br /&gt;            WriteLine("-1200M", toBytes(-1200M));&lt;br /&gt;            WriteLine("Decimal.MinValue", toBytes(Decimal.MinValue));&lt;br /&gt;            WriteLine("Decimal.MaxValue", toBytes(Decimal.MaxValue));&lt;br /&gt;            WriteLine("");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private static void WriteLine(string value)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(value);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void WriteLine(string label, byte[] bytes)&lt;br /&gt;        {&lt;br /&gt;            Console.Write("{0}: 0x", label);&lt;br /&gt;            var bs = (byte[])bytes.Clone();&lt;br /&gt;            Array.Reverse(bs);&lt;br /&gt;            foreach (var x in bs)&lt;br /&gt;                Console.Write("{0:X2}", x);&lt;br /&gt;            Console.WriteLine();&lt;br /&gt;        }&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/5d1ed02775e6/cs/others/NumberBytes/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;結果は次の通り。0.0Mと-0.0Mの指数部は1になるみたい。&lt;br /&gt;&lt;pre class="prettyprint"&gt;Decimal:&lt;br /&gt;0.0M: 0x00000000000000000000000000010000&lt;br /&gt;-0.0M: 0x00000000000000000000000080010000&lt;br /&gt;0.12M: 0x000000000000000C0000000000020000&lt;br /&gt;1.2M : 0x000000000000000C0000000000010000&lt;br /&gt;12M  : 0x000000000000000C0000000000000000&lt;br /&gt;120M : 0x00000000000000780000000000000000&lt;br /&gt;1200M: 0x00000000000004B00000000000000000&lt;br /&gt;-0.12M: 0x000000000000000C0000000080020000&lt;br /&gt;-1.2M : 0x000000000000000C0000000080010000&lt;br /&gt;-12M  : 0x000000000000000C0000000080000000&lt;br /&gt;-120M : 0x00000000000000780000000080000000&lt;br /&gt;-1200M: 0x00000000000004B00000000080000000&lt;br /&gt;Decimal.MinValue: 0xFFFFFFFFFFFFFFFFFFFFFFFF80000000&lt;br /&gt;Decimal.MaxValue: 0xFFFFFFFFFFFFFFFFFFFFFFFF00000000&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-3683795257987687329?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/3683795257987687329/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=3683795257987687329' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3683795257987687329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/3683795257987687329'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/decimal.html' title='Decimal型のフォーマット'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-2743973793191570952</id><published>2009-11-04T22:13:00.005+09:00</published><updated>2009-11-15T22:37:29.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>IList&lt;T&gt;の走査処理の比較（インデクサ／GetEnumerator／foreach）</title><content type='html'>twitterで&lt;a href="http://twitter.com/ksksts/status/5383373778" tooltip="linkalert-tip"&gt;「IList&amp;lt;t&amp;gt;を走査する場合でforとforeachとで意外に差が出た」&lt;/a&gt;とか書いたら&lt;a href="http://twitter.com/okazuki/status/5384807585" tooltip="linkalert-tip"&gt;「IListの内部実装にもよりますけど、結構変わったりしますよねー」&lt;/a&gt;とRTがあった。&lt;br /&gt;それで処理速度を計測するコードを書いてみたらよく分からない結果になった。&lt;br /&gt;&lt;pre class="prettyprint"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace IListEnumerationBenchmark&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            var size = 1000000;&lt;br /&gt;            var count = 10;&lt;br /&gt;            var sw = new Stopwatch();&lt;br /&gt;&lt;br /&gt;            Action&amp;lt;IList&amp;lt;int&amp;gt;&amp;gt; run = list =&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                var useIndexerTicks = 0L;&lt;br /&gt;                var useEnumeratorTicks = 0L;&lt;br /&gt;                var useForeachTicks = 0L;&lt;br /&gt;&lt;br /&gt;                for (var c = 0; c &amp;lt; count; c++)&lt;br /&gt;                {&lt;br /&gt;                    var random = new Random(c);&lt;br /&gt;                    for (var n = 0; n &amp;lt; list.Count; n++)&lt;br /&gt;                        list[n] = random.Next(int.MinValue, int.MaxValue);&lt;br /&gt;&lt;br /&gt;                    // use indexer&lt;br /&gt;                    sw.Reset();&lt;br /&gt;                    sw.Start();&lt;br /&gt;                    var useIndexerResult = UseIndexer(list);&lt;br /&gt;                    sw.Stop();&lt;br /&gt;                    useIndexerTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                    // use enumerator&lt;br /&gt;                    sw.Reset();&lt;br /&gt;                    sw.Start();&lt;br /&gt;                    var useEnumeratorResult = UseEnumerator(list);&lt;br /&gt;                    sw.Stop();&lt;br /&gt;                    useEnumeratorTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                    // use foreach&lt;br /&gt;                    sw.Reset();&lt;br /&gt;                    sw.Start();&lt;br /&gt;                    var useForeachResult = UseForeach(list);&lt;br /&gt;                    sw.Stop();&lt;br /&gt;                    useForeachTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                    // correctness&lt;br /&gt;                    if (useIndexerResult != useForeachResult)&lt;br /&gt;                        Console.WriteLine("useIndexerResult: {0}, useForeachResult: {1}", useIndexerResult, useForeachResult);&lt;br /&gt;                    if (useEnumeratorResult != useForeachResult)&lt;br /&gt;                        Console.WriteLine("useEnumeratorResult: {0}, useForeachResult: {1}", useEnumeratorResult, useForeachResult);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                Console.WriteLine("use indexer: {0} ({1:F})", useIndexerTicks / count, useIndexerTicks / (double)useForeachTicks);&lt;br /&gt;                Console.WriteLine("use enumerator: {0} ({1:F})", useEnumeratorTicks / count, useEnumeratorTicks / (double)useForeachTicks);&lt;br /&gt;                Console.WriteLine("use foreach: {0} ({1:F})", useForeachTicks / count, useForeachTicks / (double)useForeachTicks);&lt;br /&gt;                Console.WriteLine();&lt;br /&gt;            };&lt;br /&gt;&lt;br /&gt;            // int[]&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("int[]: ");&lt;br /&gt;                var array = new int[size];&lt;br /&gt;                run(array);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // List&amp;lt;int&amp;gt;&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("List&amp;lt;int&amp;gt;: ");&lt;br /&gt;                var list = new List&amp;lt;int&amp;gt;();&lt;br /&gt;                for (var n = 0; n &amp;lt; size; n++)&lt;br /&gt;                    list.Add(0);&lt;br /&gt;                run(list);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static int UseIndexer(IList&amp;lt;int&amp;gt; list)&lt;br /&gt;        {&lt;br /&gt;            var result = 0;&lt;br /&gt;            for (var n = 0; n &amp;lt; list.Count; n++)&lt;br /&gt;                result = unchecked(result + list[n]);&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static int UseEnumerator(IList&amp;lt;int&amp;gt; list)&lt;br /&gt;        {&lt;br /&gt;            var result = 0;&lt;br /&gt;            var e = list.GetEnumerator();&lt;br /&gt;            while (e.MoveNext())&lt;br /&gt;                result = unchecked(result + e.Current);&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static int UseForeach(IList&amp;lt;int&amp;gt; list)&lt;br /&gt;        {&lt;br /&gt;            var result = 0;&lt;br /&gt;            foreach (var x in list)&lt;br /&gt;                result = unchecked(result + x);&lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/0da1a784a4c6/cs/others/IListEnumerationBenchmark/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;結果は次の通り。&lt;br /&gt;配列ではインデクサでのアクセスがforeachより遅いのにList&amp;lt;t&amp;gt;では逆になるのが意味が分からない。あと両方でGetEnumeratorでのアクセスがforeachよりも速いのも意味が分からない（foreachの方が最適化する余地があるんじゃないかと思う）。&lt;br /&gt;こんな処理にフォーカスした速度なんかほとんどのケースで無視していいだろうから、インデクサでのアクセスが必要じゃない処理では常にforeachを使うけど。&lt;br /&gt;書きながら&lt;a href="http://msdn.microsoft.com/ja-jp/library/bwabdf9z.aspx"&gt;List&amp;lt;t&amp;gt;.ForEach&lt;/a&gt;を思い出した（IList&amp;lt;t&amp;gt;には無い）。使える場合ならforeachよりもそれを使うと思う。ILとかコンパイル後のコードはたぶん見ない。&lt;br /&gt;&lt;pre class="prettyprint"&gt;int[]:&lt;br /&gt;use indexer: 578500 (5.57)&lt;br /&gt;use enumerator: 87133 (0.84)&lt;br /&gt;use foreach: 103895 (1.00)&lt;br /&gt;&lt;br /&gt;List&amp;lt;int&amp;gt;:&lt;br /&gt;use indexer: 132922 (0.76)&lt;br /&gt;use enumerator: 154705 (0.89)&lt;br /&gt;use foreach: 174277 (1.00)&lt;br /&gt;&lt;/pre&gt;追記: 上の結果はIList&amp;lt;T&amp;gt;を通した結果だから不正確。&lt;a href="http://ksksts.blogspot.com/2009/11/list-ilist-dont-use-ilist-s-indexer.html"&gt;ksksts's blog: 配列やList&amp;lt;T&amp;gt;をIList&amp;lt;T&amp;gt;型のインデクサでアクセスするとパフォーマンスが悪い(don't use IList&amp;lt;T&amp;gt;'s indexer)&lt;/a&gt;を参照。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-2743973793191570952?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/2743973793191570952/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=2743973793191570952' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/2743973793191570952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/2743973793191570952'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/ilist-getenumeratorforeach.html' title='IList&amp;lt;T&amp;gt;の走査処理の比較（インデクサ／GetEnumerator／foreach）'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-9201337792104010025</id><published>2009-11-03T22:22:00.005+09:00</published><updated>2009-11-03T22:36:24.909+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#で実装したradix sortとArray.Sortのquick sortとの比較</title><content type='html'>radix sort（基数ソート）のコードを書いてて、適当に処理速度を比較してみたら遅かったから簡単なベンチマークを書いてみた。&lt;br /&gt;比較するのは次の3つ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;radix sort（&lt;a href="http://en.wikipedia.org/wiki/Radix_sort" tooltip="linkalert-tip"&gt;WikipediaのRadix sort&lt;/a&gt;と&lt;a href="http://www.stereopsis.com/radix.html" tooltip="linkalert-tip"&gt;stereopsisのradix tricks&lt;/a&gt;を参考にして書いたコード）&lt;/li&gt;&lt;li&gt;comb sort（&lt;a href="http://en.wikipedia.org/wiki/Comb_sort" tooltip="linkalert-tip"&gt;WikipediaのComb sort&lt;/a&gt;を参考に書いたコード、というかほぼそのまま）&lt;/li&gt;&lt;li&gt;quick sort（&lt;a href="http://msdn.microsoft.com/ja-jp/library/system.array.sort%28VS.90%29.aspx" tooltip="linkalert-tip"&gt;.NET Framework 3.5のArray.Sort&lt;/a&gt;）&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace SortBenchmark&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            for (var size = 1000; size &amp;lt;= 1000000; size *= 10)&lt;br /&gt;                Run(size);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void Run(int size)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("size: {0}", size);&lt;br /&gt;&lt;br /&gt;            var count = 10;&lt;br /&gt;            var sw = new Stopwatch();&lt;br /&gt;            var radixSortTicks = 0L;&lt;br /&gt;            var combSortTicks = 0L;&lt;br /&gt;            var arraySortTicks = 0L;&lt;br /&gt;            for (var c = 0; c &amp;lt; count; c++)&lt;br /&gt;            {&lt;br /&gt;                var random = new Random(c);&lt;br /&gt;                var list = new UInt32[size];&lt;br /&gt;                for (var n = 0; n &amp;lt; list.Length; n++)&lt;br /&gt;                    list[n] = (UInt32)random.Next(Int32.MinValue, Int32.MaxValue);&lt;br /&gt;&lt;br /&gt;                // radix sort&lt;br /&gt;                var radixSortResult = (IList&amp;lt;UInt32&amp;gt;)list.Clone();&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                RadixSort(radixSortResult);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                radixSortTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                // comb sort&lt;br /&gt;                var combSortResult = (IList&amp;lt;UInt32&amp;gt;)list.Clone();&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                CombSort(combSortResult);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                combSortTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                // Array.Sort&lt;br /&gt;                var arraySortResult = list.ToArray();&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                Array.Sort(arraySortResult);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                arraySortTicks += sw.ElapsedTicks;&lt;br /&gt;&lt;br /&gt;                // correctness&lt;br /&gt;                for (var n = 0; n &amp;lt; size; n++)&lt;br /&gt;                {&lt;br /&gt;                    if (radixSortResult[n] != arraySortResult[n])&lt;br /&gt;                        Console.WriteLine("radixSortResult[{0}]: {1}, arraySortResult[{0}]: {2}", n, radixSortResult[n], arraySortResult[n]);&lt;br /&gt;                    if (combSortResult[n] != arraySortResult[n])&lt;br /&gt;                        Console.WriteLine("combSortResult[{0}]: {1}, arraySortResult[{0}]: {2}", n, combSortResult[n], arraySortResult[n]);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Console.WriteLine("radix sort: {0} ({1:F})", radixSortTicks / count, radixSortTicks / (double)arraySortTicks);&lt;br /&gt;            Console.WriteLine("comb sort: {0} ({1:F})", combSortTicks / count, combSortTicks / (double)arraySortTicks);&lt;br /&gt;            Console.WriteLine("Array.Sort: {0} ({1:F})", arraySortTicks / count, arraySortTicks / (double)arraySortTicks);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        static void RadixSort(IList&amp;lt;UInt32&amp;gt; list)&lt;br /&gt;        {&lt;br /&gt;            var tables = new int[sizeof(UInt32)][];&lt;br /&gt;            for (var p = 0; p &amp;lt; tables.Length; p++)&lt;br /&gt;                tables[p] = new int[0xFF + 1];&lt;br /&gt;&lt;br /&gt;            // histgramming&lt;br /&gt;            foreach (var x in list)&lt;br /&gt;            {&lt;br /&gt;                var y = x;&lt;br /&gt;                for (var p = 0; p &amp;lt; tables.Length; p++)&lt;br /&gt;                {&lt;br /&gt;                    tables[p][(y + 1) &amp; 0xFF]++;&lt;br /&gt;                    y = y &amp;gt;&amp;gt; 8;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // sum the histgrams&lt;br /&gt;            foreach (var table in tables)&lt;br /&gt;            {&lt;br /&gt;                table[0] = 0;&lt;br /&gt;                for (var n = 1; n &amp;lt; table.Length; n++)&lt;br /&gt;                    table[n] += table[n - 1];&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // read/write histgram, copy&lt;br /&gt;            IList&amp;lt;UInt32&amp;gt; array = new UInt32[list.Count];&lt;br /&gt;            Action swap = () =&amp;gt; { var temp = list; list = array; array = temp; };&lt;br /&gt;            for (var p = 0; p &amp;lt; tables.Length; p++)&lt;br /&gt;            {&lt;br /&gt;                var table = tables[p];&lt;br /&gt;                foreach (var x in list)&lt;br /&gt;                {&lt;br /&gt;                    var y = (x &amp;gt;&amp;gt; p * 8) &amp; 0xFF;&lt;br /&gt;                    array[table[y]] = x;&lt;br /&gt;                    table[y]++;&lt;br /&gt;                }&lt;br /&gt;                swap();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        static void CombSort(IList&amp;lt;UInt32&amp;gt; list)&lt;br /&gt;        {&lt;br /&gt;            const double shrinkFactor = 1.247330950103979; // 1.0 / (1.0 - 1.0 / Math.Pow(Math.E, Math.PI));&lt;br /&gt;            var gap = list.Count;&lt;br /&gt;            var swapped = true;&lt;br /&gt;            while (gap &amp;gt; 1 || swapped)&lt;br /&gt;            {&lt;br /&gt;                if (gap &amp;gt; 1)&lt;br /&gt;                    gap = (int)(gap / shrinkFactor);&lt;br /&gt;                swapped = false;&lt;br /&gt;                for (int i = 0; i + gap &amp;lt; list.Count; i++)&lt;br /&gt;                {&lt;br /&gt;                    if (list[i].CompareTo(list[i + gap]) &amp;gt; 0)&lt;br /&gt;                    {&lt;br /&gt;                        var t = list[i];&lt;br /&gt;                        list[i] = list[i + gap];&lt;br /&gt;                        list[i + gap] = t;&lt;br /&gt;                        swapped = true;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/b4599eafa23e/cs/Sort/SortBenchmark/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;結果は次の通り。&lt;br /&gt;適当に比較したときは処理時間がArray.Sortの2倍以上で話にならないと思っていたけど、要素数が膨大になるにつれてそれなりに差が小さくなってきて少し嬉しい。&lt;br /&gt;comb sortは遅いけどバブルソートの改良版と考えるとそれなりに良いような気がする。&lt;br /&gt;&lt;pre class="prettyprint"&gt;size: 1000&lt;br /&gt;radix sort: 3541 (2.88)&lt;br /&gt;comb sort: 27689 (22.50)&lt;br /&gt;Array.Sort: 1230 (1.00)&lt;br /&gt;size: 10000&lt;br /&gt;radix sort: 20451 (1.68)&lt;br /&gt;comb sort: 417744 (34.33)&lt;br /&gt;Array.Sort: 12167 (1.00)&lt;br /&gt;size: 100000&lt;br /&gt;radix sort: 207950 (1.45)&lt;br /&gt;comb sort: 5288921 (36.95)&lt;br /&gt;Array.Sort: 143143 (1.00)&lt;br /&gt;size: 1000000&lt;br /&gt;radix sort: 2081360 (1.30)&lt;br /&gt;comb sort: 65056745 (40.50)&lt;br /&gt;Array.Sort: 1606207 (1.00)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-9201337792104010025?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/9201337792104010025/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=9201337792104010025' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/9201337792104010025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/9201337792104010025'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/cradix-sortarraysortquick-sort.html' title='C#で実装したradix sortとArray.Sortのquick sortとの比較'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-6240104337436731335</id><published>2009-11-01T16:38:00.015+09:00</published><updated>2009-11-14T12:44:29.181+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C#で浮動小数点数のバイナリ表現（ビットパターン）を取得する</title><content type='html'>double型の値のバイト表現をlong型で得るために、&lt;a href="http://msdn.microsoft.com/en-us/library/system.bitconverter.doubletoint64bits%28VS.80%29.aspx" tooltip="linkalert-tip"&gt;BitConverter.DoubleToInt64Bits&lt;/a&gt;を使う場合とunsafeで無理やりキャストするのではどちらが速いのか比較してみた。&lt;br /&gt;&lt;strike&gt;手元の環境では&lt;a href="http://msdn.microsoft.com/en-us/library/system.bitconverter.doubletoint64bits%28VS.80%29.aspx" tooltip="linkalert-tip"&gt;BitConverter.DoubleToInt64Bits&lt;/a&gt;の方が速かった（経過時間が50%）けど、ほとんどのケースでは相対的に十分軽い処理になるだろうからどっちでもいい。ただキャストを使うやり方はunsafeの指定が必要だし、見た目もアレだからfloat型を相手にする場合以外は使わないと思う（BitConverter.FloatToInt32Bitsは存在しない）。&lt;/strike&gt;ストップウォッチのリセットを忘れてた。処理速度に差はない。&lt;br /&gt;そもそもdouble型と整数型との&amp;amp;演算子があればこんなことしなくていいのが残念。&lt;br /&gt;&lt;pre class="prettyprint"&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;namespace BinaryRepresentation&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            var sw = new Stopwatch();&lt;br /&gt;            var random = new Random(0);&lt;br /&gt;            var num = 1000000;&lt;br /&gt;            var vals = new double[num];&lt;br /&gt;            for (var n = 0; n &amp;lt; vals.Length; n++)&lt;br /&gt;                vals[n] = random.NextDouble();&lt;br /&gt;&lt;br /&gt;            // BitConverter.DoubleToInt64Bits&lt;br /&gt;            var bc = new long[vals.Length];&lt;br /&gt;            {&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                for (var n = 0; n &amp;lt; vals.Length; n++)&lt;br /&gt;                    bc[n] = BitConverter.DoubleToInt64Bits(vals[n]);&lt;br /&gt;                sw.Stop();&lt;br /&gt;                Console.WriteLine("BitConverter.DoubleToInt64Bits: {0}", sw.ElapsedMilliseconds);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // unsafe cast&lt;br /&gt;            var uc = new long[vals.Length];&lt;br /&gt;            unsafe&lt;br /&gt;            {&lt;br /&gt;                sw.Reset();&lt;br /&gt;                sw.Start();&lt;br /&gt;                for (var n = 0; n &amp;lt; vals.Length; n++)&lt;br /&gt;                {&lt;br /&gt;                    var val = vals[n];&lt;br /&gt;                    uc[n] = *(long*)&amp;amp;val;&lt;br /&gt;                }&lt;br /&gt;                sw.Stop();&lt;br /&gt;                Console.WriteLine("unsafe cast: {0}", sw.ElapsedMilliseconds);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            // correctness&lt;br /&gt;            for (var n = 0; n &amp;lt; vals.Length; n++)&lt;br /&gt;                if (bc[n] != uc[n])&lt;br /&gt;                    Console.WriteLine("bc[{0}]: {1:X}, uc[{0}]: {2:X}", n, bc[n], uc[n]);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/6e0b58de18a5/cs/others/BinaryRepresentation/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-6240104337436731335?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/6240104337436731335/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=6240104337436731335' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/6240104337436731335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/6240104337436731335'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/11/c.html' title='C#で浮動小数点数のバイナリ表現（ビットパターン）を取得する'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-1972793159250795409</id><published>2009-10-31T23:30:00.009+09:00</published><updated>2009-11-01T16:22:22.671+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>google-code-prettifyを使えるようにしてみた</title><content type='html'>&lt;pre class="prettyprint"&gt;class Voila {&lt;br /&gt;public:&lt;br /&gt;  // Voila&lt;br /&gt;  static const string VOILA = "Voila";&lt;br /&gt;&lt;br /&gt;  // will not interfere with embedded tags.&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html"&gt;&lt;/a&gt;&lt;br /&gt;はじめに&lt;a href="http://code.google.com/p/google-code-prettify/" tooltip="linkalert-tip"&gt;google-code-prettifyプロジェクト&lt;/a&gt;で&lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html" tooltip="linkalert-tip"&gt;ドキュメント&lt;/a&gt;を眺める。 &lt;br /&gt;レンタルサーバにgoogle-code-prettifyのファイルを置こうかと思ったけど、 &lt;a href="http://learninglogbook.blogspot.com/2008/03/blogger.html" tooltip="linkalert-tip"&gt;Learning Log Book: Bloggerでシンタックス・ハイライト&lt;/a&gt; で紹介されていたHTML/JavaScriptガジェットを使う方法でやってみた。&lt;br /&gt;やり方は、HTML/JavaScriptガジェットを追加して、タイトルは空欄、コンテンツにJavaScriptのソース（prettify.jsと必要ならlang-xxx.jsとかも）とCSS（prettify.css）を貼り付けるというだけ。HTML/JavaScriptガジェットをこんな風に使うのかと感心。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Su0eSWzJI1I/AAAAAAAAADQ/W6ob1a_OIaM/s1600-h/blogger-google-code-prettify.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Su0eSWzJI1I/AAAAAAAAADQ/W6ob1a_OIaM/s320/blogger-google-code-prettify.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;あとはページのHTMLの編集でbody要素にonload="prettyPrint()"を追加すると、&amp;lt;pre class="prettyprint"&amp;gt;...&amp;lt;/pre&amp;gt;や&amp;lt;code class="prettyprint"&amp;gt;...&amp;lt;/code&amp;gt;のコードが色付けされて表示される。&lt;br /&gt;"&amp;lt;"と"&amp;gt;"は実体参照で書かなきゃいけないことに注意（というか面倒くさい、使わないかもという気がしてくる）。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.37to.net/2007/06/syntax_highlighter/" tooltip="linkalert-tip"&gt;あなたのソースコードを彩る、Syntax Highlighterまとめ | Blog.37to.net&lt;/a&gt; が&lt;a href="http://code.google.com/p/google-code-prettify/" tooltip="linkalert-tip"&gt;google-code-prettify&lt;/a&gt;以外にもいろいろと紹介していて参考になった。&lt;br /&gt;その中で&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" tooltip="linkalert-tip"&gt;SyntaxHighlighter&lt;/a&gt;は対応言語が多くて良さそう。特に、&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Usage" tooltip="linkalert-tip"&gt;Usage&lt;/a&gt;によるとバージョン2.1では&amp;lt;script type="syntaxhighlighter" class="brush: js"&amp;gt;&amp;lt;![CDATA[...]]&amp;gt;&amp;lt;/script&amp;gt;というようにscript要素＋CDATAを使うからコードをそのまま貼り付けることができることと、&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting" tooltip="linkalert-tip"&gt;Hosting&lt;/a&gt;で「&lt;a href="http://alexgorbatchev.com/pub/sh/"&gt;http://alexgorbatchev.com/pub/sh/&lt;/a&gt;にファイルを置いておくからこれを使っていいよ」とホストすることをはっきり書いてくれていること。&lt;br /&gt;&lt;br /&gt;というのも、google-code-prettifyのSVNリポジトリのソースを読み込む方法を紹介しているページを見かけてそれってどうかのかなと思った。&lt;br /&gt;すくなくとも&lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html" tooltip="linkalert-tip"&gt;google-code-prettifyのREADME&lt;/a&gt;では「you will need to make sure the css and js file are on your server」と書かれている。そのあたりの議論があった／あるのか知らないし、&lt;a href="http://code.google.com/intl/ja/projecthosting/" tooltip="linkalert-tip"&gt;Project Hosting on Google Code&lt;/a&gt; がOKを出しているかもしれないけど。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" tooltip="linkalert-tip"&gt;SyntaxHighlighter&lt;/a&gt;みたいにライブラリの開発者がホストすると表明してくれると使いやすいし、よく使われるようになりやすいかも。 &lt;br /&gt;GoogleやYahooのAJAXライブラリのホスティング（&lt;a href="http://code.google.com/intl/ja/apis/ajaxlibs/" tooltip="linkalert-tip"&gt;AJAX Libraries API - Google Code&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/3/configurator/" tooltip="linkalert-tip"&gt;The YUI Configurator&lt;/a&gt;）に追加されたら最高だろうな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-1972793159250795409?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/1972793159250795409/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=1972793159250795409' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1972793159250795409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/1972793159250795409'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/10/google-code-prettify_31.html' title='google-code-prettifyを使えるようにしてみた'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pBXOwAPpQ6w/Su0eSWzJI1I/AAAAAAAAADQ/W6ob1a_OIaM/s72-c/blogger-google-code-prettify.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-7373948479831177649</id><published>2009-10-27T00:12:00.004+09:00</published><updated>2011-01-23T12:19:19.366+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>チャート（グラフ）の見え方と印象</title><content type='html'>tumblrですこしおもしろい見せ方をしているチャートが流れていたからいじってみた。&lt;br /&gt;&lt;br /&gt;流れてきた経路は &lt;a href="http://www.geocities.jp/yamamrhr/ProIKE0911-52.html" tooltip="linkalert-tip"&gt;独り52-いじめられるサラリーマン&lt;/a&gt; の「図1 男女別平均年収の推移」が &lt;a href="http://www.mudaijp.com/wp/5938.html" tooltip="linkalert-tip"&gt;日本人は世界で４番目に貧しい国　年収200万円以下が1000万人もいる！ | 無題ブログ&lt;/a&gt; の643に貼られて、それを &lt;a href="http://theemitter.tumblr.com/post/222834569/plasticdreams-643-a" tooltip="linkalert-tip"&gt;the Emitter&lt;/a&gt; がtumblrにポストしたのが &lt;a href="http://windsock.tumblr.com/post/222850801/theemitter-plasticdreams-643" tooltip="linkalert-tip"&gt;Windsock - Online trend following - theemitter: plasticdreams: 643 名前：..&lt;/a&gt; 経由でdashboardに表示されていた、という感じ（たぶん）。&lt;br /&gt;&lt;br /&gt;おもしろいと思ったのは男女の平均年収に大きな差があるけど、男性の平均年収額を左縦軸、女性の平均年収額を右縦軸にとって、両方の縦軸の目盛り間隔を合わせていたことと1995年時のプロット位置を一致させていたことの2点。&lt;br /&gt;前者は、はじめは年収400万円台と200万円台では10万円前後の増減による効用は違うだろうと思ったけど、収入が200万円でも400万円でも10万円前後の金額の捉え方は同じようなものに思えたこと（平均を個々のケースにあてはめて考えるのはおかしいけど）。&lt;br /&gt;後者についてはわざわざ元データの数値を合わせないで増減額か増減率を示したほうがいいんじゃないかと思ったから。&lt;br /&gt;&lt;br /&gt;チャートを作るためにデータを探してみる。&lt;br /&gt;&lt;a href="http://www.nta.go.jp/kohyo/tokei/kokuzeicho/jikeiretsu/01_02.htm" tooltip="linkalert-tip"&gt;民間給与実態統計調査結果｜長期時系列データ｜国税庁&lt;/a&gt; の  &lt;a href="http://www.nta.go.jp/kohyo/tokei/kokuzeicho/jikeiretsu/deta/m03.xls" tooltip="linkalert-tip"&gt;M03.xls&lt;/a&gt; の「３－１」シートの「1年勤続者」－「給料・手当(1)」が同じ数値っぽい（賞与抜きの額面の金額）。&lt;br /&gt;&lt;br /&gt;いくつか作ってみたチャートを貼ってみる。&lt;br /&gt;共通なことは、横軸は1995年から2007年まで、縦軸は金額または増減率、金額の場合の単位は千円。&lt;br /&gt;&lt;br /&gt;そのまんまな平均年収の折れ線のチャートA。&lt;br /&gt;男女ともに横ばい（差は縮まらない）。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SuWvTUeSo9I/AAAAAAAAABw/qIaH44WbRHE/s1600-h/chart-a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/SuWvTUeSo9I/AAAAAAAAABw/qIaH44WbRHE/s320/chart-a.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;チャートAの縦軸の下限を200万円に変更したチャートB。&lt;br /&gt;男女間の差額とそれが変わらないことを強調する場合はこれがいいかも。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuWwSpfDU4I/AAAAAAAAAB4/JdRihxVRu1k/s1600-h/chart-b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuWwSpfDU4I/AAAAAAAAAB4/JdRihxVRu1k/s320/chart-b.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;男性の平均年収を左軸、女性の平均年数を右軸に割り当てたチャートC。&lt;br /&gt;目盛り間隔はExcel2007におまかせ。左軸の5万円が右軸の4万円に対応している。微妙な差を気付かれにくくするにはこれみたいのがいいかも。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/SuWxcKDolvI/AAAAAAAAACA/EgUM-8yxDbk/s1600-h/chart-c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/SuWxcKDolvI/AAAAAAAAACA/EgUM-8yxDbk/s320/chart-c.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;チャートCの左右の縦軸のスケールを一致させたチャートD。&lt;br /&gt;流れてきた元のチャートはこんな感じ。「1995年から2000年までは男女の平均年収が約10万円増加したけど、その後、男性の平均年収は下がって1995年と同水準に戻ったね。それに対して女性の平均年収は2000年から横ばいだね。（※左右の縦軸に注意）」。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/SuWxs9GxprI/AAAAAAAAACI/ReuWFegXMGY/s1600-h/chart-d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/SuWxs9GxprI/AAAAAAAAACI/ReuWFegXMGY/s320/chart-d.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;そもそも増減額を示せばいいじゃない？ということで1995年を基準とした増減額のチャートE。&lt;br /&gt;増減額は分かるけど実際の年収額が分からない。「女性の平均年収は男性と比較すると堅調です」みたいなことを伝えたい場合はいいかも。&lt;br /&gt;タイトルが適切じゃないけど直すのが面倒だからこのままで。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuWzqPvBCLI/AAAAAAAAACQ/At6b2DZVDZw/s1600-h/chart-e.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuWzqPvBCLI/AAAAAAAAACQ/At6b2DZVDZw/s320/chart-e.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;増減額じゃなくて、1995年を1.0とした場合の増減率のチャートF。&lt;br /&gt;増減率なので分母の影響が出てしまう。チャートEよりも「女性の平均年収は男性と比較すると堅調です」を強く伝えられるはずなんだけど、男性の2001年からの下落具合がチャートEよりも弱くなる点に注意。 &lt;br /&gt;これもタイトルが適切じゃないけど直すのが面倒だからこのままで。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SuW0a3UD-II/AAAAAAAAACY/Tndq-lsVA9g/s1600-h/chart-f.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SuW0a3UD-II/AAAAAAAAACY/Tndq-lsVA9g/s320/chart-f.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;チャートE/Fに実際の平均年収額をラベルで付けたのがチャートH/I。&lt;br /&gt;チャートGが抜けているのはただのミス、飛ばしてしまったみたい。&lt;br /&gt;これもタイトルが適切じゃないけど直すのが面倒だからこのままで。あと凡例は不要だった。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SuW2953j-tI/AAAAAAAAACg/N5rZLzEH-XE/s1600-h/chart-h.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/SuW2953j-tI/AAAAAAAAACg/N5rZLzEH-XE/s320/chart-h.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuW3D1HajSI/AAAAAAAAACo/9_W3z1p-wOk/s1600-h/chart-i.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/SuW3D1HajSI/AAAAAAAAACo/9_W3z1p-wOk/s320/chart-i.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.geocities.jp/yamamrhr/ProIKE0911-52.html" tooltip="linkalert-tip"&gt;独り52-いじめられるサラリーマン&lt;/a&gt; や &lt;a href="http://www.mudaijp.com/wp/5938.html" tooltip="linkalert-tip"&gt;日本人は世界で４番目に貧しい国　年収200万円以下が1000万人もいる！ | 無題ブログ&lt;/a&gt; が何を伝えようとしているのか知らないし、チャートがおかしいとか言うつもりは全くない（読んでいないし読む気もない）。&lt;br /&gt;単に見せ方を変えると印象が変わりそうなデータだと思ったからやってみた。&lt;br /&gt;&lt;br /&gt;自分なら特に強い意図がなければI/H、A/Bあたりを使うと思う。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.co.jp/search?q=%9Ds%91%A2%96_%83O%83%89%83t"&gt;捏造棒グラフ - Google 検索&lt;/a&gt; とか &lt;a href="http://www.amazon.co.jp/dp/4492555226" tooltip="linkalert-tip"&gt;Amazon.co.jp： マッキンゼー流図解の技術: ジーン ゼラズニー, 数江 良一, 管野 誠二, 大崎 朋子: 本&lt;/a&gt; とか思い出した。あと1冊コンサルタント系の人の本も記憶にあるけど名前が思い出せない。&lt;br /&gt;&lt;br /&gt;一応データはbitbucketに入れておいた。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/f3fc3ff2e5f4/misc/salary-1995-2007/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-7373948479831177649?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/7373948479831177649/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=7373948479831177649' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7373948479831177649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7373948479831177649'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/10/blog-post.html' title='チャート（グラフ）の見え方と印象'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/SuWvTUeSo9I/AAAAAAAAABw/qIaH44WbRHE/s72-c/chart-a.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-6595559447069409189</id><published>2009-10-09T23:00:00.000+09:00</published><updated>2009-11-14T13:00:37.482+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>リクナビNEXTの求人件数の推移</title><content type='html'>毎水曜日に受信する&lt;a href="http://rikunabi-next.yahoo.co.jp/rnc/"&gt;リクナビNEXT&lt;/a&gt;からのメールの新着求人数を集計してみた。&lt;br /&gt;半分は興味でもう半分はPythonの練習。&lt;br /&gt;&lt;br /&gt;メールを受信しているのはGmailアカウントだけどそこからfetchしてとかまでは面倒くさいから、Beckyで受信＆保存されたメールをmbox形式でエクスポートしてそれを処理するというやり方。&lt;br /&gt;Beckyからメールを抽出する時の条件は、検索文字列「すべての新着・更新求人： 件の求人が今週掲載開始。 ▼新着・更新求人：」の「いずれかを含む」で。&lt;br /&gt;&lt;br /&gt;エクスポートしたmbox形式のファイルをPythonのmailbox.UnixMailboxでparseして、Messageオブジェクトのdateヘッダの値とpayloadに含まれる新着＆更新件数を正規表現で取得してタブ区切りテキストで出力。&lt;br /&gt;それをExcelで開いて移動平均を追加してチャートを作るとこんな感じ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Ss9HqMXYEKI/AAAAAAAAABo/IpsNxWpwCog/s1600-h/rn.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Ss9HqMXYEKI/AAAAAAAAABo/IpsNxWpwCog/s320/rn.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390606069185122466" /&gt;&lt;/a&gt;&lt;br /&gt;2007年から減少が始まって2008年以降はペースがちょっと加速して最近底を打ったように見える。まあ底を打ったらすぐに前と同じ水準に反発するわけじゃないし、雇用関係は遅行指標だし、しばらくはこのあたりの水準なのかな。&lt;br /&gt;&lt;br /&gt;PythonのスクリプトとExcelブックファイルはBitBucketに入れておいた。&lt;br /&gt;&lt;a href="http://bitbucket.org/ksksts/junk/src/4813c0a2f459/misc/rikunabi-next-count/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-6595559447069409189?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/6595559447069409189/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=6595559447069409189' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/6595559447069409189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/6595559447069409189'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/10/next.html' title='リクナビNEXTの求人件数の推移'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pBXOwAPpQ6w/Ss9HqMXYEKI/AAAAAAAAABo/IpsNxWpwCog/s72-c/rn.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-7958229446484190374</id><published>2009-09-26T13:42:00.003+09:00</published><updated>2011-03-16T15:47:20.558+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Abbreviation Scoring(LiquidMetal)をC#で書いてみた</title><content type='html'>&lt;a href="http://steps.dodgson.org/?date=20090912" tooltip="linkalert-tip"&gt;steps to phantasien(2009-09-12)&lt;/a&gt;を読んでおもしろそうだったからC#で書いてみた。&lt;br /&gt;といってもObjective-CもRubyも知らない（読めない）ので&lt;a href="http://code.google.com/p/blacktree-alchemy/source/browse/trunk/Crucible/Code/NSString_BLTRExtensions.m" tooltip="linkalert-tip"&gt;元のNSString_BLTRExtensions.m&lt;/a&gt;のJavaScript版である&lt;a href="http://github.com/rmm5t/liquidmetal/"&gt;LiquidMetal&lt;/a&gt;をC#で書き直しただけ。誰でもできる簡単なお仕事。&lt;br /&gt;&lt;br /&gt;ソースコードはBitBucketのリポジトリ&lt;a href="http://bitbucket.org/ksksts/junk/src/1fd78cba6db4/cs/AbbreviationScore/"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;に。&lt;br /&gt;&lt;br /&gt;あとサンプル（デモ）をよくわかんないけどSilverlightで書いてみた。&lt;br /&gt;StringsとAbbreviationの変更に応じてインクリメンタルにスコアを再計算してResultsを更新するだけ。&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Sr2cyn-0iNI/AAAAAAAAABg/81hEcELkYE8/s1600-h/abbrev-score-sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Sr2cyn-0iNI/AAAAAAAAABg/81hEcELkYE8/s320/abbrev-score-sample.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt; &lt;br /&gt;&amp;nbsp;-&amp;gt;&lt;a href="http://bore0ut.com/junk/abbreviation-score-sample/AbbreviationScoreSample.html" tooltip="linkalert-tip"&gt;AbbreviationScoreSample&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんなのJavaScriptでもできるからわざわざSilverlightでする意味もないけど、C#で書いたものを簡単に動かして見せることができるのは便利かも、という感想。&lt;br /&gt;ただ一般のクラスライブラリとSilverlightのクラスライブラリのプロジェクトが別っぽいのが面倒。両方で使いたい場合はどうすればいいんだろう？ソースは共通でプロジェクトを別に（2つ）作るのかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-7958229446484190374?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/7958229446484190374/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=7958229446484190374' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7958229446484190374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/7958229446484190374'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/09/abbreviation-scoringliquidmetalc.html' title='Abbreviation Scoring(LiquidMetal)をC#で書いてみた'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pBXOwAPpQ6w/Sr2cyn-0iNI/AAAAAAAAABg/81hEcELkYE8/s72-c/abbrev-score-sample.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-345393392746339136</id><published>2009-09-15T20:06:00.002+09:00</published><updated>2011-04-04T21:12:45.817+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VM'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>リモートデスクトップ接続先PCの設定</title><content type='html'>ソフトの試用とかテストとか特定の処理用にVMware Serverで動かしっぱなしにしているWindows XP仮想マシン用。&lt;br /&gt;色数以外はローカルセキュリティポリシーでも設定できるけど、グループポリシー(gpedit.msc) でまとめて設定する。&lt;br /&gt;&lt;br /&gt;ブルートフォースアタックをされてもイヤなので一応アカウントロックを設定しておく。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sq9yaGXLWJI/AAAAAAAAABA/ickMDAJxzjc/s1600-h/xp-vm-gpedit0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sq9yaGXLWJI/AAAAAAAAABA/ickMDAJxzjc/s320/xp-vm-gpedit0.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;少なくともログオン失敗（または成功も）を記録するように監査ポリシーを設定。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Sq9zOjXox-I/AAAAAAAAABI/wHc35zpFl0o/s1600-h/xp-vm-gpedit1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Sq9zOjXox-I/AAAAAAAAABI/wHc35zpFl0o/s320/xp-vm-gpedit1.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;administratorsグループ以外のユーザーアカウントでも強制シャットダウンを可能にしておく。スタートメニューにシャットダウンメニューを追加する設定があったかもしれないけどどうでもいい。shutdownコマンドのオプションは単純だしシャットダウンする機会も少ないから。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Sq9z5xSzyCI/AAAAAAAAABQ/5uacHmTbAvg/s1600-h/xp-vm-gpedit2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_pBXOwAPpQ6w/Sq9z5xSzyCI/AAAAAAAAABQ/5uacHmTbAvg/s320/xp-vm-gpedit2.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;スクリーンショットを32bitカラーで撮りたいときがあるから「色の解像度の制限」は「クライアント互換」（クライアントで指定した色数を使用する）に設定する。WindowsXPの場合はデフォルトで16bitカラー上限に制限されている（「ターミナルサービス」が存在しない場合は「管理用テンプレート」を選択してメニュー「操作」－「テンプレートの追加と削除」からsystem.admを追加する）。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sq90hs41t3I/AAAAAAAAABY/1AGbSPa_RRI/s1600-h/xp-vm-gpedit3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sq90hs41t3I/AAAAAAAAABY/1AGbSPa_RRI/s320/xp-vm-gpedit3.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-345393392746339136?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/345393392746339136/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=345393392746339136' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/345393392746339136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/345393392746339136'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/09/pc.html' title='リモートデスクトップ接続先PCの設定'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sq9yaGXLWJI/AAAAAAAAABA/ickMDAJxzjc/s72-c/xp-vm-gpedit0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-4700555382524504100</id><published>2009-09-09T23:37:00.002+09:00</published><updated>2009-09-11T08:05:24.960+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Greasemonkey'/><title type='text'>ニューズウィーク日本版(newsweekjapan.jp)のリンクを書き換えるGreasemonkeyスクリプトを書いてみた</title><content type='html'>&lt;a href="http://newsweekjapan.jp/"&gt;ニュースウィーク日本版&lt;/a&gt;のトップページなどからの記事へのリンクを書き換えるGreasemonkeysスクリプトを書いてみた。&lt;br /&gt;&lt;br /&gt;分量がちょうど良い感じで最近ちょくちょく読んでいるんだけど、記事へのリンクがonclickイベントハンドラでcommon.jsのclickLink関数を呼び出すようになっているのが気に入らなかった。これだとCtrl+左クリックで現在のタブでも記事へのリンクが開かれてしまって、見出しを眺めながら読みたい記事を別のタブに開いてからまとめて読むということができないから。&lt;br /&gt;&lt;br /&gt;元のニューズウィーク日本版のページでは次の画像の枠内でクリックするとjavascriptで書かれたclickLink関数で記事のページが開くようになっている。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_pBXOwAPpQ6w/Sqe5MSXwd0I/AAAAAAAAAAw/SIymZmvv6FY/s1600-h/nwj-before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_pBXOwAPpQ6w/Sqe5MSXwd0I/AAAAAAAAAAw/SIymZmvv6FY/s320/nwj-before.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;これを、onclickイベントハンドラでclickLink関数を呼び出さないようにして、見出しやその画像に記事へのリンク（HTMLのa要素）を付加するようにした。&lt;br /&gt;次の画像の枠内がリンク適用箇所。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Sqe7TjWOVqI/AAAAAAAAAA4/uthM24KfrBk/s1600-h/nwj-after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" tooltip="linkalert-tip"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_pBXOwAPpQ6w/Sqe7TjWOVqI/AAAAAAAAAA4/uthM24KfrBk/s320/nwj-after.png" tooltip="linkalert-tip" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;これでCtrl+左クリックで新しいタブに記事のページを開けるようになった。&lt;br /&gt;ただし&lt;a href="http://newsweekjapan.jp/special/"&gt;特集のページ&lt;/a&gt;は調べるのが面倒になったので放置。&lt;br /&gt;&lt;br /&gt;ソースは&lt;a href="http://bitbucket.org/ksksts/junk/src/242afab86426/gm-scripts/newsweekjapan_html_link.user.js" tooltip="linkalert-tip"&gt;ksksts / junk / source — bitbucket.org&lt;/a&gt;。インストールする場合は&lt;a href="http://bitbucket.org/ksksts/junk/raw/242afab86426/gm-scripts/newsweekjapan_html_link.user.js" tooltip="linkalert-tip"&gt;raw&lt;/a&gt;から。&lt;br /&gt;cho45さんの$X関数（&lt;a href="http://lowreal.net/blog/2007/11/17/1" tooltip="linkalert-tip"&gt;Nov 17 2007 :: New version of $X / nulog, NULL::something : out of the washer&lt;/a&gt;）と$N関数（&lt;a href="http://www.amazon.co.jp/dp/4844323644" tooltip="linkalert-tip"&gt;まるごとJavaScript &amp;amp; Ajax ! Vol.1&lt;/a&gt;）を使っています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-4700555382524504100?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/4700555382524504100/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=4700555382524504100' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4700555382524504100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/4700555382524504100'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/09/newsweekjapanjpgreasemonkey.html' title='ニューズウィーク日本版(newsweekjapan.jp)のリンクを書き換えるGreasemonkeyスクリプトを書いてみた'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pBXOwAPpQ6w/Sqe5MSXwd0I/AAAAAAAAAAw/SIymZmvv6FY/s72-c/nwj-before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-38418138.post-5871223495533973087</id><published>2009-09-07T21:06:00.000+09:00</published><updated>2009-09-07T21:06:50.835+09:00</updated><title type='text'>テスト用のエントリ</title><content type='html'>テスト用のエントリ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/38418138-5871223495533973087?l=ksksts.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ksksts.blogspot.com/feeds/5871223495533973087/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=38418138&amp;postID=5871223495533973087' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/5871223495533973087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/38418138/posts/default/5871223495533973087'/><link rel='alternate' type='text/html' href='http://ksksts.blogspot.com/2009/09/blog-post.html' title='テスト用のエントリ'/><author><name>ksksts</name><uri>http://www.blogger.com/profile/15104730762198526562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_pBXOwAPpQ6w/Sm7me1Ct8NI/AAAAAAAAAAM/hZJOftkbKgY/S220/ksksts.jpeg'/></author><thr:total>0</thr:total></entry></feed>
