<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8596808384528009854</atom:id><lastBuildDate>Wed, 06 Nov 2024 02:43:51 +0000</lastBuildDate><category>C#</category><category>Javascript</category><category>Google</category><category>Blogger</category><category>jQuery</category><category>API</category><category>App Engine</category><category>Feed</category><category>Sites</category><category>regexp</category><category>Ajax</category><category>CSS</category><category>Docs</category><category>GPC</category><category>Picasa</category><category>browser</category><category>color</category><category>event</category><category>Aptana</category><category>HP</category><category>highslide</category><category>Chrome</category><category>IE</category><category>Python</category><category>SkyDrive</category><category>Template</category><category>Visual Studio</category><category>lightbox</category><category>plugin</category><category>Accordion</category><category>Bookmark</category><category>Bookmarklet</category><category>Excel</category><category>Opera</category><category>RSS</category><category>Tool</category><category>iTunes</category><category>C++</category><category>Chart</category><category>Code</category><category>Data</category><category>Date</category><category>Firefox</category><category>FizzBuzz</category><category>Font</category><category>GMarks</category><category>Java</category><category>Live</category><category>Pack</category><category>SQL</category><category>Search</category><category>StarSuite</category><category>Subversion</category><category>Talk</category><category>TortoiseSVN</category><category>Trends</category><category>Windows</category><category>Writer</category><category>XAMPP</category><category>YouTube</category><category>etc</category><category>overlay</category><category>php</category><category>prettify</category><category>shortcut</category><category>sitemap</category><title>humming bird</title><description>論理的より感じるままに...  気ままなアウトプット</description><link>http://yas-hummingbird.blogspot.com/</link><managingEditor>noreply@blogger.com (y@s)</managingEditor><generator>Blogger</generator><openSearch:totalResults>187</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-5467973584608746029</guid><pubDate>Sun, 23 May 2010 15:30:00 +0000</pubDate><atom:updated>2010-05-25T22:02:52.291+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">App Engine</category><title>インタラクティブなコンソール - GAE</title><description>&lt;a href=&quot;http://code.google.com/intl/ja/appengine/articles/remote_api.html#console&quot;&gt;インタラクティブなコンソール&lt;/a&gt;で紹介されている「&lt;code&gt;appengine_console.py&lt;/code&gt;」を今現在使えるように書き換えました。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
事前準備として、&lt;code&gt;app.yaml&lt;/code&gt;に以下を追加。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;handlers:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- url: /remote_api
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;login: admin
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;#appengine_console.py
import os, sys, code, getpass

# append path
#C:\\google_appengine
#C:\\google_appengine\lib\webob
#C:\\google_appengine\lib\django
#C:\\google_appengine\lib\yaml\lib
gae_path = &#39;C:\\google_appengine&#39;
sys.path = [gae_path,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.path.join(gae_path,&#39;lib&#39;,&#39;webob&#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.path.join(gae_path,&#39;lib&#39;,&#39;django&#39;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.path.join(gae_path,&#39;lib&#39;,&#39;yaml&#39;,&#39;lib&#39;)] + sys.path

from google.appengine.ext            import db
from google.appengine.ext.remote_api import remote_api_stub

def auth_func():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return raw_input(&#39;Username:&#39;), getpass.getpass(&#39;Password:&#39;)

if len(sys.argv) &amp;lt; 2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print &#39;Usage: %s app_id [host]&#39; % (sys.argv[0],)
else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arg2 = len(sys.argv) &amp;gt; 2 and sys.argv[2]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app_id = sys.argv[1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host = &#39;localhost:8080&#39; if arg2 else &#39;%s.appspot.com&#39; % app_id

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remote_api_stub.ConfigureRemoteDatastore(app_id, &#39;/remote_api&#39;, auth_func, host)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code.interact(&#39;App Engine interactive console for %s%s&#39; % (app_id,&#39; @local&#39; if arg2 else &#39;&#39;), None, locals())
&lt;/pre&gt;&lt;br /&gt;
本番データストアにアクセスできるだけでなく、ホストをローカルに設定すれば、当然ローカルのサーバーにもアクセスできるようになるだろうと思い試したらできたので、第3引数に&lt;code&gt;True&lt;/code&gt;と評価される値を渡してやれば、ローカルサーバーにアクセスするよう修正した。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;gae_path&lt;/code&gt;、ポート番号は適宜置き換えて下さい。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;python appengine_console.py app_id [host]&lt;/blockquote&gt;&lt;code&gt;[host]&lt;/code&gt;に何も渡さなければ本番サーバーに、&lt;code&gt;True&lt;/code&gt;を渡すとローカルサーバーにアクセスすることになる。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;remote_api&lt;/code&gt;オモシロイ。&lt;br /&gt;
でもその話はまた気が向いたら。</description><link>http://yas-hummingbird.blogspot.com/2010/05/google-app-engine-python-interactive.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-6883107413351809392</guid><pubDate>Sat, 22 May 2010 15:50:00 +0000</pubDate><atom:updated>2010-05-24T01:26:28.304+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">App Engine</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Entityの削除について - GAE</title><description>まず、以下のようなデータ モデルあるとして、&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Foo(db.Model):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index = db.IntegerProperty()
&lt;/pre&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Entityを取得する&lt;/h4&gt;&lt;a href=&quot;http://code.google.com/intl/ja/appengine/docs/python/datastore/modelclass.html#Model_all&quot; title=&quot;Model クラス - Google App Engine - Google Code&quot;&gt;Model.all()&lt;/a&gt;を使用してEntityを取得する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;query = Foo.all()
&lt;/pre&gt;&lt;code&gt;Model.all()&lt;/code&gt;によって返される値は&lt;a href=&quot;http://code.google.com/intl/ja/appengine/docs/python/datastore/queryclass.html&quot; title=&quot;Query クラス - Google App Engine - Google Code&quot;&gt;Query&lt;/a&gt;オブジェクト。&lt;br /&gt;
&lt;br /&gt;
こんな風に取得しても良い。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;query = db.GqlQuery(&#39;SELECT * FROM Foo&#39;)
#   or
query = db.GqlQuery(&#39;SELECT __key__ FROM Foo&#39;)
&lt;/pre&gt;&lt;code&gt;db.GqlQuery()&lt;/code&gt;によって返される値は&lt;a href=&quot;http://code.google.com/intl/ja/appengine/docs/python/datastore/gqlqueryclass.html&quot; title=&quot;GqlQuery クラス - Google App Engine - Google Code&quot;&gt;GqlQuery&lt;/a&gt;オブジェクト(のインスタンス)。&lt;br /&gt;
&lt;br /&gt;
「Entityを削除する」という目的の上ではどちらでも構わない。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Entityを削除する&lt;/h4&gt;上記のような操作によって取得した&lt;code&gt;GqlQuery&lt;/code&gt;オブジェクト、または&lt;code&gt;Query&lt;/code&gt;オブジェクトの&lt;code&gt;Entity&lt;/code&gt;の数が一つであれば、&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;db.delete(query)
&lt;/pre&gt;このようにしても問題なく&lt;code&gt;Entity&lt;/code&gt;を削除できる。&lt;br /&gt;
&lt;br /&gt;
しかし、取得した&lt;code&gt;Entity&lt;/code&gt;が複数である場合は例外が発生する&lt;br /&gt;
&lt;blockquote&gt;BadArgumentError: Expected only one model or key&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;複数のEntityを一度に削除する&lt;/h4&gt;&lt;a href=&quot;http://code.google.com/intl/ja/appengine/docs/python/datastore/functions.html#delete&quot; title=&quot;関数 - Google App Engine - Google Code&quot;&gt;delete&lt;/a&gt;メソッドの引数は以下。&lt;br /&gt;
&lt;blockquote&gt;引用:&lt;a href=&quot;http://code.google.com/intl/ja/appengine/docs/python/datastore/functions.html#delete&quot; title=&quot;関数 - Google App Engine - Google Code&quot;&gt;関数 - Google App Engine - Google Code&lt;/a&gt;&lt;br /&gt;
削除するモデル インスタンス、エンティティの Key、エンティティのモデル インスタンスまたはキーのリスト。&lt;/blockquote&gt;&lt;br /&gt;
つまり、複数のEntityを一度に削除するには&lt;code&gt;Model&lt;/code&gt;インスタンスのリストにしてから&lt;code&gt;delete&lt;/code&gt;メソッドに渡す必要がある。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Model&lt;/code&gt;インスタンスのリストにするには&lt;code&gt;fetch&lt;/code&gt;メソッドを使用する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;query.fetch(&lt;i&gt;limit&lt;/i&gt;)
&lt;/pre&gt;&lt;code&gt;fetch&lt;/code&gt;の戻り値は「&lt;code&gt;Model&lt;/code&gt;インスタンス or 空」のリスト&lt;br /&gt;
&lt;br /&gt;
その後、&lt;code&gt;db.delete()&lt;/code&gt;で削除すれば良い。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;db.delete(&lt;i&gt;model_list&lt;/i&gt;)
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
まとめるとこんな流れになる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;query = Foo.all()
m_list = query.fetch(100)
db.delete(m_list)
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Entity&lt;/code&gt;の数が多い、または削除したい&lt;code&gt;Model&lt;/code&gt;の種類が複数なら、以下のようなメソッドを用意する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;def clear_data(model):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q = model.all()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while q.count():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = q.fetch(100)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.delete(m)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q = model.all()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&lt;/pre&gt;&lt;code&gt;try&lt;/code&gt;で囲む必要はないかも。&lt;br /&gt;
&lt;br /&gt;
使い方。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;clear_data(Foo)
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
違う書き方をするならこんな感じかな。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;def clear_data(model):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = &#39;SELECT * FROM %s&#39; % model.entity_type()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q = db.GqlQuery(s).fetch(100)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while len(q):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;db.delete(q)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q = db.GqlQuery(s).fetch(100)
&lt;/pre&gt;</description><link>http://yas-hummingbird.blogspot.com/2010/05/entity-gae.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-9190861271068469969</guid><pubDate>Wed, 12 May 2010 15:05:00 +0000</pubDate><atom:updated>2010-05-13T01:45:40.346+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>jQueryでムリクリ文字列を扱う</title><description>jQueryで配列や簡単なオブジェクトが扱えることが分かったので、それなら文字列も扱ってやろうじゃないか、という安易な発想で。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
例えば、&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;$(&quot;foo&quot;)
&lt;/pre&gt;とすると、この&lt;code&gt;&quot;foo&quot;&lt;/code&gt;はドコに格納されるのか？というと、&lt;code&gt;selector&lt;/code&gt;プロパティに格納されている。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;alert( $(&quot;foo&quot;).selector );
&lt;/pre&gt;これで&lt;code&gt;&quot;foo&quot;&lt;/code&gt;と表示される。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
なので、こんなメソッドにしてみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;jQuery.fn.alert = function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(this.selector);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this;
}

$(&quot;foo&quot;).alert();//foo
&lt;/pre&gt;&lt;br /&gt;
難点はメソッドチェーンが行えないこと。上記のようにメソッド内で完結すれば良いのだが、値を返さなければ意味がない。&lt;br /&gt;
処理を行い、その都度&lt;code&gt;selector&lt;/code&gt;から文字列を取得する方法も考えられるがあまり現実的ではない気がする。&lt;br /&gt;
そもそも今やっていることが現実的ではないか... (^_^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そんなことを思いつつも&lt;br /&gt;
&lt;h4&gt;padLeftメソッド追加する&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;jQuery.extend(jQuery.fn,{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;times: function( n ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var ret = &quot;&quot;, s = this.selector;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( n *= 1 ; n &amp;gt; 0 ; n &amp;gt;&amp;gt;&amp;gt;= 1, s += s ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (n &amp;amp; 1) 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret += s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//easy, but a little slow.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//return new Array(+n + 1).join(this.selector);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;padLeft: function(totalWidth, paddingChar){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var s = this.selector, len  = totalWidth - s.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ( len &amp;lt; 1 ? &quot;&quot; : jQuery(paddingChar).times(len).slice(0, len) ) + s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
});
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;Usage&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;var s = $(&quot;123&quot;).padLeft(6,&quot;0&quot;);
//s -&amp;gt; 000123
&lt;/pre&gt;</description><link>http://yas-hummingbird.blogspot.com/2010/05/jquery.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-240375658329000900</guid><pubDate>Wed, 12 May 2010 11:00:00 +0000</pubDate><atom:updated>2010-05-13T01:42:13.330+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>要素がDom Nodeに追加されているかを確認する</title><description>要素が&lt;code&gt;Dom&lt;/code&gt;ノードに追加されているかを調べる。&lt;br /&gt;
&lt;br /&gt;
例えば、まだ&lt;code&gt;Dom&lt;/code&gt;ノードに追加されていない要素の高さや幅を取得しようとしても&lt;code&gt;0&lt;/code&gt;が返ってくる。 &lt;br /&gt;
これではまずいこともあるだろう。&lt;br /&gt;
&lt;br /&gt;
ということで、こんな関数を書いてみる。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function isAddedToDom(elm){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (elm.parentNode &amp;amp;&amp;amp; elm.parentNode.tagName) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elm = elm.parentNode;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return elm.tagName.toLowerCase() === &quot;html&quot;;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;code&gt;tagName&lt;/code&gt;まで見ている理由&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;code&gt;fragment&lt;/code&gt;でループから抜ける&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Document(elm.ownerDocument)&lt;/code&gt;にまで到達しないようにする&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
親要素が&lt;code&gt;fragment&lt;/code&gt;であれば、まだその要素は&lt;code&gt;Dom&lt;/code&gt;に追加されていないということなので、その時点でループから抜ける。&lt;br /&gt;
&lt;br /&gt;
また、この&lt;code&gt;while&lt;/code&gt;ループはほっとくと &lt;code&gt;ownerDocument&lt;/code&gt;にまで到達してしまう場合がある。&lt;br /&gt;
&lt;code&gt;ownerDocument&lt;/code&gt;は&lt;code&gt;Dom&lt;/code&gt;に追加されていない要素でも同様に取得できてしまう。&lt;br /&gt;
そこで&lt;code&gt;tagName&lt;/code&gt;を見ることによって&lt;code&gt;ownerDocument&lt;/code&gt;まで到達しないようにする。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;この関数をjQueryで使う&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;$.extend($.expr[&#39;:&#39;],{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addedToDom: function (elm){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//tagNameを見る理由
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// - fragmentで抜ける
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// - Document(elm.ownerDocument)にまで到達しないようにする
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (elm.parentNode &amp;amp;&amp;amp; elm.parentNode.tagName) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elm = elm.parentNode;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return elm.tagName.toLowerCase() === &quot;html&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
});
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;Usage&lt;/h4&gt;&lt;br /&gt;
&lt;code&gt;is&lt;/code&gt;を使う&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function foo( elm ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($(elm).is(&quot;:addedToDom&quot;)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//something...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;&lt;br /&gt;
&lt;code&gt;filter&lt;/code&gt;を使う&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var elm = $(&quot;foo&quot;).filter(&quot;:addedToDom&quot;);
&lt;/pre&gt;</description><link>http://yas-hummingbird.blogspot.com/2010/05/dom-node.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-2404379272688899500</guid><pubDate>Thu, 06 May 2010 15:05:00 +0000</pubDate><atom:updated>2010-05-07T00:19:38.879+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">regexp</category><title>正規表現のパターンチェッカーをリニューアル - ЯegExpR</title><description>JavaScriptの正規表現のパターンチェッカーをリニューアル!!&lt;br /&gt;
今回でVersion 3。&lt;br /&gt;
新しい機能も追加して、アドレスも変更。&lt;br /&gt;
名前も新たに「ЯegExpR」として公開。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;ЯegExpR&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;http://regexpr-rer.appspot.com/&quot;&gt;&lt;img alt=&quot;http://regexpr-rer.appspot.com/&quot; height=&quot;300&quot; src=&quot;http://capture.heartrails.com/large?http://regexpr-rer.appspot.com/&quot; title=&quot;ЯegExpR β&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
因みに以前のバージョンはこれ。&lt;br /&gt;
&lt;a href=&quot;http://humming-bird.appspot.com/tool/js.regexp.pattern.check.html&quot;&gt;&lt;img alt=&quot;http://humming-bird.appspot.com/tool/js.regexp.pattern.check.html&quot; height=&quot;150&quot; src=&quot;http://capture.heartrails.com/medium?http://humming-bird.appspot.com/tool/js.regexp.pattern.check.html&quot; title=&quot;Javascript Regular Expressions Pattern Check β ver. 1.4&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;新機能:profiler&lt;/h4&gt;何がしたいか、一度使ってもらえれば理解できると思うが、正規表現パターンを分解して理解しやすい形にしようと試みた。&lt;br /&gt;
正規表現はパターンが長くなると何やってるか理解するのに苦労するからね。&lt;br /&gt;
&lt;br /&gt;
正直、見切り発車な部分はあるが、完成すれば結構便利な機能じゃないかな？&lt;br /&gt;
&lt;br /&gt;
今回の無駄なこだわりは全く画像を使用していないトコロ。&lt;br /&gt;
だから、IEなんかだと見た目がしょぼいのであしからず。</description><link>http://yas-hummingbird.blogspot.com/2010/05/egexpr.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7603356803571417299</guid><pubDate>Sun, 25 Apr 2010 14:00:00 +0000</pubDate><atom:updated>2010-04-25T23:00:22.591+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>jQueryメソッドにトリガーを仕込む</title><description>&lt;code&gt;dom&lt;/code&gt;に追加される前に要素のフォントサイズを取得しようとしてもIEではできない。&lt;br /&gt;
それなら要素に追加されたタイミングで取得すれば良いんじゃないかな、と。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;append&lt;/code&gt;にトリガーを仕込む。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var foo = $(&quot;&amp;lt;p&amp;gt;&quot;).addClass(&quot;foo&quot;);

var wrap = $(&quot;#foo-wrap&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.bind(&quot;appended&quot;, function(e, args){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;args.text(args.css(&quot;font-size&quot;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

var _append = wrap.append;

wrap.append = function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(arguments[0].css(&quot;font-size&quot;));//IE -&amp;gt; undefined
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_append.apply(this, arguments);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.trigger(&quot;appended&quot;, arguments);
}

wrap.append(foo);
&lt;/pre&gt;&lt;code&gt;foo&lt;/code&gt;要素自身のフォントサイズが表示される。&lt;br /&gt;
&lt;br /&gt;
本当なら&lt;code&gt;foo&lt;/code&gt;要素に何らかの処理を施すことで実現することが最善な方法と思われるが、それが可能なら苦労はしないのだよ。(-。-)y-゜゜゜&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
汎用的だが、現実的じゃない方法も一つ。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var _append = jQuery.fn.append;

jQuery.fn.append = function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_append.apply(this, arguments);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(arguments).each(function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($(this).is(&quot;.foo&quot;)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(document).trigger(&quot;foo-appended&quot;, this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
}

$(document).bind(&quot;foo-appended&quot;,function(e, foo){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(foo).css(&quot;color&quot;,&quot;#f00&quot;);
});


var a = $(&quot;&amp;lt;p&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = a.clone().addClass(&quot;foo&quot;);

a.text(&quot;another&quot;);
b.text(&quot;foo&quot;)

$(document.body).append(a,b);
&lt;/pre&gt;&lt;code&gt;foo&lt;/code&gt;クラスの属性を持つ要素の文字色を赤色にしている。&lt;br /&gt;
&lt;br /&gt;
ムチャするわ~ (^_^;)</description><link>http://yas-hummingbird.blogspot.com/2010/04/jquery_25.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-4668077435890187409</guid><pubDate>Fri, 23 Apr 2010 15:40:00 +0000</pubDate><atom:updated>2010-05-13T18:21:39.056+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>jQueryのことが少しわかった気がする</title><description>「あ、そうか!」みたいな感覚。&lt;br /&gt;
jQueryというより、Javascriptを(少しだけ)理解できたと言った方が良いかな?&lt;br /&gt;
&lt;br /&gt;
常に型を意識して引数や戻り値を扱う言語出身故に、気付くのが遅かったのかもしれない。&lt;br /&gt;
&lt;br /&gt;
振りかえると、私はjQueryオブジェクトとそれ以外のオブジェクトを全く別モノとして捉えていたことが結果として、Javascriptという言語の柔軟性を失わせていたように思う。&lt;br /&gt;
&lt;br /&gt;
jQueryの最も重要である「&lt;code&gt;$()&lt;/code&gt;」がナニモノか?　を探りたい。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
まずは配列を渡してみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function say(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&quot;hello&quot;);
}

$([say, say]).each(function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item();
});
//output:
//hello
//hello
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
つまり、このように同じことをしているだけ。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var ary = [1, 2, 3];

$(ary).each(function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item );
});
//output:
//1
//2
//3

$.each(ary, function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item );
});
//output:
//1
//2
//3
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
逆にjQueryオブジェクトを渡してみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var p = $(&quot;&amp;lt;p&amp;gt;&quot;).text(&quot;foo&quot;);
$.each(p, function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( $(item).text() );
});
//output:
//foo
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
jQueryでは&lt;code&gt;each&lt;/code&gt;メソッドにオブジェクトを渡すと配列を扱うような動作をする。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var o = {a:&quot;foo&quot;, b: &quot;bar&quot;};

$.each(o, function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item );
});
//output:
//foo
//bar
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
いろいろ試してみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var o = {a:&quot;foo&quot;, b: &quot;bar&quot;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
$([o, o]).each(function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item.a );
});
//output:
//foo
//foo

$(o).each(function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item.a );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item.b );
});
//output:
//foo
//bar

$(o).add(o).each(function(i,item){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item.a );
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( item.b );
});
//output:
//foo
//bar
//foo
//bar
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
少し無茶なことをしてみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;ret = $([1, 2, 3, 4]).filter(function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this % 2 === 0;
});
//ret -&amp;gt; [2, 4]

ret = $([0, 1, 99, 3]).index(99);
//ret -&amp;gt; 2
&lt;/pre&gt;&lt;code&gt;filter&lt;/code&gt;メソッドの戻り値はjQueryオブジェクトだが、その中身は普通に扱える。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最後に、&lt;code&gt;animate&lt;/code&gt;メソッドで&lt;code&gt;opacity&lt;/code&gt;値を変化させる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;$(&quot;&amp;lt;div&amp;gt;&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.css({opacity: 0})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.animate({opacity: 1}, {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;duration: 500,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step    : function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log($(this).css(&quot;opacity&quot;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&lt;/pre&gt;&lt;br /&gt;
これを応用して、&lt;code&gt;value&lt;/code&gt;値を変化させる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;$({value: 0}).animate({value: 100}, {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;duration: 500,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step    : function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(this.value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
});
&lt;/pre&gt;何やらおかしなことをしているように見えるかも知れないが、&lt;code&gt;jQuery.fx.cur&lt;/code&gt;辺りを見ると理解できると思う。&lt;br /&gt;
&lt;br /&gt;
私も&lt;a href=&quot;http://james.padolsey.com/javascript/fun-with-jquerys-animate/&quot; title=&quot;Fun with jQuery’s “animate()” – James Padolsey&quot;&gt;ココ&lt;/a&gt;で初めてこのような処理を見たときには何でこうなるのか正直理解できなかった。&lt;br /&gt;
&lt;br /&gt;
しかし、閃きと言うか、気付いたと言うべきか、&lt;code&gt;$()&lt;/code&gt; に&lt;code&gt;dom&lt;/code&gt;要素ではないナニモノかを渡して何らかの処理を行うことも可能であることに最近ようやく気付くことができた。</description><link>http://yas-hummingbird.blogspot.com/2010/04/jquery.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-700964582877889326</guid><pubDate>Thu, 22 Apr 2010 16:00:00 +0000</pubDate><atom:updated>2010-04-24T01:34:29.261+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>C# - 拡張メソッドでIsUniq</title><description>拡張メソッドで遊んでみた。&lt;br /&gt;
配列内の全ての値がユニークであるかを調べるメソッド「IsUniq」だすぅ。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;code-1&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 176ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; source.Length - 1; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Array.IndexOf(source, source[i], i + 1) != -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;code-2&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;//非破壊的ソート
public static T[] Sort&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T[] clone = (T[])source.Clone();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array.Sort(clone);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return clone;
}

//loop 1E6 -&amp;gt; 455ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T[] clone = source.Sort();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0, j = clone.Length - 1; i &amp;lt; j; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (clone[i].Equals(clone[i + 1]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;非破壊的ソートメソッドを書き足したのだが、そのせい(?)でパフォーマンスが今一つ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;code-3&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 2050ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; source.Length - 1; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T tmp = source[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (source.Skip(i + 1).ToArray().Any((item) =&amp;gt; tmp.Equals(item)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;Linqを使ってコードを少々シンプルにした。&lt;br /&gt;
やろうとしていることは「&lt;code&gt;code - 1&lt;/code&gt;」に近いかな?&lt;br /&gt;
パフォーマンス的に論外。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;code-4&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 145ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source, Func&amp;lt;T, T, bool&amp;gt; comparer)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int length = source.Length;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0, j = length - 1; i &amp;lt; j; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T currentItem = source[i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int n = i + 1; n &amp;lt; length; n++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (comparer(currentItem, source[n]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;これが一番パフォーマンスが良い結果になった。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Usage&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;int[] arr = { 12, 34, 56, 78, 90};
bool ret = arr.IsUniq();
//or
//bool ret = arr.IsUniq((x, y) =&amp;gt; x == y);
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ここからは御ふざけで御座います。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Distinct&lt;/code&gt;を使う。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 787ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return source.Length == ((T[])source.Clone()).Distinct().Count();
}
&lt;/pre&gt;やはり、配列コピーしたり&lt;code&gt;Linq&lt;/code&gt;メソッド使うと重くなるよね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Where&lt;/code&gt;を使う。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 1615ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; source.Length - 1; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T tmp = source[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (source.Skip(i + 1).Where((item) =&amp;gt; tmp.Equals(item)).Count() &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;お話になりません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;All&lt;/code&gt;を使う&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;//loop 1E6 -&amp;gt; 1380ms
public static bool IsUniq&amp;lt;T&amp;gt;(this T[] source)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; source.Length - 1; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T tmp = source[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!source.Skip(i + 1).All((item) =&amp;gt; !tmp.Equals(item)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;
}
&lt;/pre&gt;...飽きた。</description><link>http://yas-hummingbird.blogspot.com/2010/04/c-isuniq.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-8787939883821870919</guid><pubDate>Wed, 21 Apr 2010 22:30:00 +0000</pubDate><atom:updated>2010-04-24T01:42:12.145+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">etc</category><title>ブログ進化論</title><description>これまでWebサイト(Webアプリケーション)はローカルで使用するアプリケーションを真似たインターフェイスにしようと努力されてきたように感じる。&lt;br /&gt;
&lt;br /&gt;
それと同じように、これからのWebにおける情報は電子書籍チックになっていくのではないだろうか。&lt;br /&gt;
iPadが普及し、電子書籍化が進むのに並行して、ブログというものの形も変わるはず。&lt;br /&gt;
「ブログ」と言うより、「個人が情報を公開する手段」と言い換えた方が適切かもしれないが敢えて。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
「&lt;b&gt;書籍を出版するかのようにWebに公開する個人サイト&lt;/b&gt;」&lt;br /&gt;
&lt;br /&gt;
例えば小説のような物語の続きを更新していくブログや、雑誌のように様々な情報を日々アップしていくブログはこれまでにもあっただろう。&lt;br /&gt;
&lt;br /&gt;
だが、これからは上から下ではなく、本のページを捲るような感覚で閲覧、最新号を発行するかのような更新、欲しいモノがあればそれをクリックすると販売しているサイトへ移動、そして読者の感想がリアルタイムに更新される。&lt;br /&gt;
&lt;br /&gt;
まるで出版物を制作するかのような感覚で、サイトを創り上げていく。&lt;br /&gt;
また、それらをCVSなどでリポジトリ管理できたら尚良いだろう。&lt;br /&gt;
そんな個人サイトを公開できるサービスが出てきてほしい。&lt;br /&gt;
&lt;br /&gt;
誤字の修正などに迅速に対応可能、何より経費が掛らず誰でも公開できるというWebのメリットは大きい。&lt;br /&gt;
そのような場所で何らかを公開したいと思うユーザーは少なくないのでは(主観)。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
私がこのようなサービスを期待する理由の一つとして、書籍のような段組みを可能とするHTML5の存在がある。これにCSS3とJavascriptを組み合わせれば、多くの表現の自由が与えられる。&lt;br /&gt;
さらに個人的にもう一つ付け加えるならIEが死んでくれると尚良いのだが...&lt;br /&gt;
&lt;br /&gt;
つまるところ、Webの進化がまた新しいサービスを生み出していく、というだけの話。&lt;br /&gt;
&lt;br /&gt;
すでに電子書籍を作成する会社が存在するご時世。Webサイトの作成にもこの波が必ず影響していくはず。それは公開する「モノ」によっては大きな波となるのではないだろうか。&lt;br /&gt;
&lt;br /&gt;
私がどんなモノを想像しているのか、伝わりにくいだろうことは理解した上で書き綴ったのだが、暇と気力があったらApp Engineでも使って擬似的に私が想像するサイト(サービスは無理)を作れたら、と思う。</description><link>http://yas-hummingbird.blogspot.com/2010/04/blog-post_22.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-2434538081502456453</guid><pubDate>Mon, 12 Apr 2010 13:20:00 +0000</pubDate><atom:updated>2010-04-12T23:25:58.474+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><category domain="http://www.blogger.com/atom/ns#">regexp</category><title>タグにマッチさせる正規表現</title><description>&lt;code&gt;HTML&lt;/code&gt;タグ文字列にマッチさせる正規表現を書いてみた。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;//html
var rtag = /&amp;lt;\w+(?:\s+\w+(?:\s*=\s*(?:&quot;.*?&quot;|&#39;.*?&#39;|[^&#39;&quot;&amp;gt;\s]+))?)?(?:\s?\/)?&amp;gt;|&amp;lt;\/\w+&amp;gt;/g;

//(x)html
var rxtag = /&amp;lt;\w+(?::\w+)?(?:\s+\w+(?:\s*=\s*(?:&quot;.*?&quot;|&#39;.*?&#39;|[^&#39;&quot;&amp;gt;\s]+))?)?(?:\s?\/)?&amp;gt;|&amp;lt;\/\w+(?::\w+)?&amp;gt;/g;
&lt;/pre&gt;&lt;br /&gt;
何かこんなに書かなくても良いように思う。(-_-;)&lt;br /&gt;
&lt;br /&gt;
とりあえず、簡単にテスト。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var tagStr = [
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;br/&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;br /&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;p&amp;gt;abc&amp;lt;br&amp;gt;abc&amp;lt;br&amp;gt;abc&amp;lt;/p&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;h1&amp;gt;&amp;lt;/h1&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;&amp;lt;div style=&quot;vertical-align:bottom;&quot;&amp;gt;&amp;lt;span&amp;gt;foo&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;img src=&#39;http://www.example.com&#39; alt=&#39;&amp;amp;&#39;/&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;script type=&#39;text/javascript&#39;&amp;gt;&amp;lt;&quot; + &quot;/script&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;p&amp;gt;１２３ABCあいうえお&amp;lt;/p&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;abc&amp;lt;span&amp;gt;def\t\u3000\nghi&amp;lt;/span&amp;gt;jklm&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;input type=&#39;text&#39; value=&#39;A &amp;gt; B&#39; /&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;style type=&#39;text/css&#39;&amp;gt;\nbody{\n\tfont-family:&#39;メイリオ&#39;,Meiryo;\n}\n&amp;lt;/style&amp;gt;&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;gd:name value=&#39;foo&#39;/&amp;gt;&quot;
];

for ( var i = 0; i &amp;lt; tagStr.length ; i++ ) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//bug?回避のため毎回newする。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var rgx = new RegExp(rtag);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log( tagStr[i].match(rgx) );
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;コンソール:結果&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;[&quot;&amp;lt;br/&amp;gt;&quot;]
[&quot;&amp;lt;br /&amp;gt;&quot;]
[&quot;&amp;lt;p&amp;gt;&quot;, &quot;&amp;lt;br&amp;gt;&quot;, &quot;&amp;lt;br&amp;gt;&quot;, &quot;&amp;lt;/p&amp;gt;&quot;]
[&quot;&amp;lt;h1&amp;gt;&quot;, &quot;&amp;lt;/h1&amp;gt;&quot;]
[&quot;&amp;lt;div style=&quot;vertical-align:bottom;&quot;&amp;gt;&quot;, &quot;&amp;lt;span&amp;gt;&quot;, &quot;&amp;lt;/span&amp;gt;&quot;, &quot;&amp;lt;/div&amp;gt;&quot;]
[&quot;&amp;lt;img src=&#39;http://www.example.com&#39; alt=&#39;&amp;amp;&#39;/&amp;gt;&quot;]
[&quot;&amp;lt;script type=&#39;text/javascript&#39;&amp;gt;&quot;, &quot;&amp;lt;/script&amp;gt;&quot;]
[&quot;&amp;lt;p&amp;gt;&quot;, &quot;&amp;lt;/p&amp;gt;&quot;]
[&quot;&amp;lt;span&amp;gt;&quot;, &quot;&amp;lt;/span&amp;gt;&quot;]
[&quot;&amp;lt;input type=&#39;text&#39; value=&#39;A &amp;gt; B&#39; /&amp;gt;&quot;]
[&quot;&amp;lt;style type=&#39;text/css&#39;&amp;gt;&quot;, &quot;&amp;lt;/style&amp;gt;&quot;]
[&quot;&amp;lt;gd:name value=&#39;foo&#39;/&amp;gt;&quot;] //(x)html
&lt;/pre&gt;最後のタグ文字列だけは&lt;code&gt;(x)html&lt;/code&gt;バージョンの正規表現にのみマッチします。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;もうちょっと簡単にする&lt;/h4&gt;&lt;pre class=&quot;prettyprint&quot;&gt;//html
var rtag = /&amp;lt;\w+(?:\s+[^&amp;gt;]+)?\/?&amp;gt;|&amp;lt;\/\w+&amp;gt;/g;

//(x)html
var rxtag = /&amp;lt;\w+(?::\w+)?(?:\s+[^&amp;gt;]+)?\/?&amp;gt;|&amp;lt;\/\w+(?::\w+)?&amp;gt;/g;
&lt;/pre&gt;HTMLに&lt;code&gt;&quot;&amp;amp;gt;&quot;&lt;/code&gt;と書かずに&lt;code&gt;&quot;&amp;gt;&quot;&lt;/code&gt;とか書いてもちゃんと表示されちゃうワケだが、この簡易版の正規表現では許容できない。&lt;br /&gt;
というか、それを許すようなパターンを書こうとすると私ごときでは上記のようにパターンが長くなりすぎる。&lt;br /&gt;
&lt;br /&gt;
なので、7行目の結果はこうなる。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;[&quot;&amp;lt;input type=&#39;text&#39; value=&#39;A &amp;gt;&quot;]
&lt;/pre&gt;が、これはそうなることが予想されていることなのでヨシとする。&lt;br /&gt;
&lt;br /&gt;
まあ、ちゃんと&lt;code&gt;&quot;&amp;amp;gt;&quot;&lt;/code&gt;と書けよ、と。&lt;br /&gt;
&lt;br /&gt;
とりあえずこれでOK?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQueryにこんなのがあった。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;// Match a standalone tag
rsingleTag = /^&amp;lt;(\w+)\s*\/?&amp;gt;(?:&amp;lt;\/\1&amp;gt;)?$/
&lt;/pre&gt;これはシングルタグにマッチさせるパターンなのだが&lt;code&gt;&quot;\1&quot;&lt;/code&gt;とか使ってなかなか秀逸とか思ったが、これが&lt;code&gt;&quot;&amp;lt;p&amp;gt;&quot;&lt;/code&gt;なんかにもマッチしちゃうので、使い方を工夫しないとこのままでは使えない。</description><link>http://yas-hummingbird.blogspot.com/2010/04/blog-post.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-1647486839869072491</guid><pubDate>Fri, 02 Apr 2010 00:30:00 +0000</pubDate><atom:updated>2010-05-15T00:22:32.914+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>空白文字が2種類あるから混乱するのだよ(全角空白じゃないよ)</title><description>&amp;nbsp;空白文字が2種類あることを知らなかったんですよね(^_^;)&lt;br /&gt;
&lt;br /&gt;
まず、空白文字についての話の前に、知っておくべきことから。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Javascriptで&lt;code&gt;&quot;a&quot;&lt;/code&gt;という文字を表現する方法。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;alert(&quot;a&quot;);//a
alert(&quot;\x61&quot;);//a
alert(&quot;\u0061&quot;);//a
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
これを比較してみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;alert(&quot;\x61&quot; == &quot;a&quot;);//true
alert(&quot;\x61&quot; == &quot;\u0061&quot;);//true
alert(&quot;\u0061&quot; == &quot;a&quot;);//true
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
正規表現ではどうだろう?&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var ret
ret = /\u0061/.test(&quot;\x61&quot;);//true
ret = /\u0061/.test(&quot;a&quot;);//true
ret = /a/.test(&quot;\x61&quot;);//true
ret = /a/.test(&quot;\u0061&quot;);//true
ret = /\x61/.test(&quot;a&quot;);//true
ret = /\x61/.test(&quot;\u0061&quot;);//true
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
ワタクシ的にはこれを知ったぐらい仰け反った(・Д・;)&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&quot;12&quot; + 3 //-&amp;gt; &quot;123&quot;
&quot;12&quot; - 3 //-&amp;gt; 9
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;本題へ&lt;/h4&gt;&lt;br /&gt;
「マジメに正規表現パターンを書こう!!」&lt;br /&gt;
↓&lt;br /&gt;
「正規表現で「&lt;code&gt;\s&lt;/code&gt;」は何にマッチするのか?」&lt;br /&gt;
&lt;br /&gt;
というのが発端。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&quot; &quot;&lt;/code&gt;(半角空白)は&lt;code&gt;&quot;\x20&quot;&lt;/code&gt;に等しい。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&quot; &quot; == &quot;\x20&quot; //true
/\s/.test(&quot; &quot;) //true
/\s/.test(&quot;\x20&quot;) //true
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
ここでjQueryで使われている正規表現を思い出した。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g;
&lt;/pre&gt;&lt;br /&gt;
「&lt;code&gt;\u00A0&lt;/code&gt;」って何だ?&lt;br /&gt;
調べるとやはりこれは空白文字だった。&lt;br /&gt;
&lt;br /&gt;
つまり、文字コード32(0x20)と160(0xA0)の二つが空白文字だった。&lt;br /&gt;
&lt;br /&gt;
文字コードが違うので当然この二つは同じ文字ではない。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&quot;\x20&quot; == &quot;\xA0&quot;　//false
&lt;/pre&gt;&lt;br /&gt;
で、正規表現の「&lt;code&gt;\s&lt;/code&gt;」がこの二つにマッチすれば良いのだが、IEでは&lt;code&gt;&quot;\xA0&quot;&lt;/code&gt;にマッチしてくれない。&lt;br /&gt;
ということでjQueryではあのような正規表現となっていることが理解できた。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;全角空白文字は?&lt;/h4&gt;全角空白もIEではマッチしない。&lt;br /&gt;
なので、正しいトリムの正規表現はこうなる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;rtrim = /^(\s|\u00A0|\u3000)+|(\s|\u00A0|\u3000)+$/g;
&lt;/pre&gt;&lt;br /&gt;
しかし、私的にはこうした方が良いように思う。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;rtrim = /^[\s\u00A0\u3000]+|[\s\u00A0\u3000]+$/g;
&lt;/pre&gt;トリム関数の動作についての解釈の違いかな?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;さらに&lt;/h4&gt;もう少し調べてみると、&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;引用:&lt;/b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Regular_Expressions&quot;&gt;Regular Expressions - MDC&lt;/a&gt;&lt;br /&gt;
...ホワイトスペース以外の 1 文字にマッチする。[^ \f\n\r\t\v\u00A0\u2028\u2029] と同等。...&lt;/blockquote&gt;ということで&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;rtrim = /^[\f\n\r\t\v\u0020\u00a0\u2028\u2029\u3000]+|[\f\n\r\t\v\u0020\u00a0\u2028\u2029\u3000]+$/g;
&lt;/pre&gt;となり、&lt;br /&gt;
&lt;br /&gt;
さらに&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;引用:&lt;/b&gt;&lt;a href=&quot;https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp#section_5&quot;&gt;RegExp - MDC&lt;/a&gt;&lt;br /&gt;
1. 註: equivalent_s&lt;br /&gt;
&lt;br /&gt;
これは以下の表現と同等です。： &lt;br /&gt;
[\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]&lt;/blockquote&gt;ということで最終的にこうなった。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;rtrim = /^[\f\n\r\t\v\u0020\u00a0\u2000-\u200b\u2028-\u3000]+|[\f\n\r\t\v\u0020\u00a0\u2000-\u200b\u2028-\u3000]+$/g;
&lt;/pre&gt;たかが空白文字を取り除くのに長すぎ(-_-;)</description><link>http://yas-hummingbird.blogspot.com/2010/04/2.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-3848978231732058396</guid><pubDate>Tue, 30 Mar 2010 22:00:00 +0000</pubDate><atom:updated>2010-05-13T15:08:54.439+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Blogger</category><title>Bloggerの新しいテンプレートの設定について</title><description>正直な話し、まだ2,3度ほどしか触っていないので、もっと調べれば他にも色々出てくるかもしれないが、とりあえずBloggerユーザーのハシクレとして、何かのお役に立てればこれ幸い。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
今回はテンプレートを眺めていて気付いたこと。&lt;br /&gt;
&lt;br /&gt;
このテンプレートをイジるには&lt;code&gt;Variable&lt;/code&gt;タグ(&lt;code&gt;&amp;lt;Variable/&amp;gt;&lt;/code&gt;)を詳しく追ってみる必要がありそうだ。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Groupタグ&lt;/h4&gt;&lt;code&gt;Variable&lt;/code&gt;タグには&lt;code&gt;Group&lt;/code&gt;タグ(&lt;code&gt;&amp;lt;Group/&amp;gt;&lt;/code&gt;)に囲まれたモノとそうでないものがある。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Group&lt;/code&gt;タグに囲まれた場合、&lt;code&gt;Group&lt;/code&gt;タグの&lt;code&gt;selector&lt;/code&gt;属性(&lt;code&gt;selector=&#39;.post&#39;&lt;/code&gt;など)の値によって取得される要素に変更が加えられるということになる。&lt;br /&gt;
例えば、&lt;code&gt;selector&lt;/code&gt;の値が&lt;code&gt;&quot;.post&quot;&lt;/code&gt;なら&lt;code&gt;&quot;post&quot;&lt;/code&gt;というクラスを持つ要素に対して、子要素に持つ&lt;code&gt;Variable&lt;/code&gt;タグの値をそれぞれ適用します、ということになる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Variableタグ&lt;/h4&gt;&lt;b&gt;name&lt;/b&gt;&lt;br /&gt;
固有の変数名と捉えれば良いでしょう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;description&lt;/b&gt;&lt;br /&gt;
テンプレート デザイナーの[アドバンス]で表示される文字と関係している。&lt;br /&gt;
&lt;code&gt;Group&lt;/code&gt;タグの場合、&lt;code&gt;&quot;Backgrounds&quot;&lt;/code&gt;なら&lt;code&gt;&quot;背景&quot;&lt;/code&gt;と表示され、その文字をクリックするとその横に表示される設定項目のタイトルに子要素の&lt;code&gt;description&lt;/code&gt;属性の値がそれぞれ表示されるようになっています。&lt;br /&gt;
&lt;br /&gt;
例えば、&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&quot;Outer Background&quot;なら&quot;外側の背景&quot;&lt;/li&gt;
&lt;li&gt;&quot;Header Background&quot;なら&quot;ヘッダーの背景&quot;&lt;/li&gt;
&lt;li&gt;&quot;Post Background&quot;は&quot;投稿の背景&quot;&lt;/li&gt;
&lt;/ul&gt;というように。&lt;br /&gt;
&lt;br /&gt;
ある程度の定形語ならクライアントの言語、つまり日本語に変換されて表示されるようになっている。&lt;br /&gt;
ここに適当な言葉を入れても、単にそのまま表示されるだけなので、すべて日本語にしてしまっても自分で使用する分には何の問題もありません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;default&lt;/b&gt;&lt;br /&gt;
テンプレート デザイナーで「...デフォルトにリセット」を行うと現在の設定がこの値に戻されます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;type&lt;/b&gt;&lt;br /&gt;
値の種類、型のようなものですね。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;value&lt;/b&gt;&lt;br /&gt;
実際に適用される値がこれになります。&lt;br /&gt;
中には「&lt;code&gt;$(widget.title.text.color)&lt;/code&gt;」というような、「&lt;code&gt;$()&lt;/code&gt;」で囲まれた文字がありますが、これを例にするとVariableタグのname属性が&lt;code&gt;&quot;widget.title.text.color&quot;&lt;/code&gt;の値を参照していることになります。&lt;br /&gt;
つまり&lt;code&gt;&quot;widget.title.text.color&quot;&lt;/code&gt;と同じ値を設定します、ということですね。&lt;br /&gt;
&lt;br /&gt;
もし、この&lt;code&gt;&quot;widget.title.text.color&quot;&lt;/code&gt;というname属性の&lt;code&gt;Variable&lt;/code&gt;タグが無かったらどうなるか?&lt;br /&gt;
まず、&lt;code&gt;default&lt;/code&gt;の値を参照します。&lt;br /&gt;
それでも無い場合はテンプレートの保存時に警告が出る仕様になっています。&lt;br /&gt;
例えば、「&lt;code&gt;default=&quot;$(foo)&quot; value=&quot;$(bar)&quot;&lt;/code&gt;」みたいなことになっていて&lt;code&gt;Variable&lt;/code&gt;タグのいずれにも「&lt;code&gt;name=&quot;foo&quot;&lt;/code&gt;」や「&lt;code&gt;name=&quot;bar&quot;&lt;/code&gt;」が無かったらテンプレートの保存時に警告するということです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
こんなのプログラマの類でないと分かりづらいですよね。&lt;br /&gt;
そういう私はもののけの類ですが...&lt;br /&gt;
&lt;br /&gt;
これで、&lt;code&gt;Variable&lt;/code&gt;タグを独自に追加したり、CSSをイジるのが容易になるのではないでしょうか。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
余談:&lt;br /&gt;
firefoxでテンプレート デザイナーが表示できないのって私だけですか?(^_^;)</description><link>http://yas-hummingbird.blogspot.com/2010/03/blog-post_31.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-1768594467591512961</guid><pubDate>Tue, 23 Mar 2010 15:30:00 +0000</pubDate><atom:updated>2010-04-12T21:58:03.224+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Date</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>javascript で.Net形式のDate フォーマットに変換する</title><description>私を含め、.NET Frameworkに慣れた人がJavascriptで容易に日付を取得できるよう、&lt;code&gt;Date&lt;/code&gt;オブジェクトの&lt;code&gt;toString&lt;/code&gt;を.NET Frameworkの&lt;code&gt;DateTime&lt;/code&gt;に合わせた動作を実装する。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/az4se3k1%28VS.95%29.aspx&quot; title=&quot;標準の日時書式指定文字列&quot;&gt;標準の日時書式指定文字列&lt;/a&gt;を参考にしました。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Usage&lt;/h4&gt;&lt;b&gt;定型書式&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var date = new Date(&quot;2010/03/24&quot;);
alert(date.toString(&quot;D&quot;));
//=&amp;gt; 2010年3月24日
&lt;/pre&gt;現在&quot;O&quot;、&quot;o&quot;、&quot;U&quot;には対応していません。今後対応するかも未定です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;定型書式 + 言語指定&lt;/b&gt;&lt;br /&gt;
.Netの場合、&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/system.globalization.cultureinfo%28VS.80%29.aspx&quot; title=&quot;CultureInfo クラス (System.Globalization)&quot;&gt;CultureInfo&lt;/a&gt;を引数に渡すとそのカルチャに合わせた結果を返すのでこれを実装してみた。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;alert(date.toString(&quot;D&quot;,&quot;en&quot;));
//=&amp;gt; Wednesday, March 24, 2010
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;カスタム書式&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;alert(date.toString(&quot;yyyy/MM/dd&quot;));
//=&amp;gt; 2010/03/24
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;attension&quot;&gt;&lt;b&gt;Demo:&lt;/b&gt;&lt;a href=&quot;http://humming-bird.googlecode.com/svn/trunk/misc/dateFormat.html&quot; title=&quot;dateFormat.html - humming-bird - Project Hosting on Google Code&quot;&gt;dateFormat.html&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;attension&quot;&gt;&lt;b&gt;Source:&lt;/b&gt;&lt;a href=&quot;http://code.google.com/p/humming-bird/source/browse/trunk/misc/dateFormat.js&quot; title=&quot;dateFormat.js - humming-bird - Project Hosting on Google Code&quot;&gt;dateFormat.js&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;備考&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;Date.prototype.toString&lt;/code&gt;に関しては渡された引数がどのパターンにも一致しなければデフォルトの処理を行うようにしてあるので問題は無いと思われる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;今後&lt;/b&gt;&lt;br /&gt;
今回サポートした言語は「en」と「ja」の二つだが、できればどの言語にも容易に対応できるような実装に変更したい。&lt;br /&gt;
それを行った上で、「en」と「ja」を二つのファイルに分割し、ファイルを小さくしたい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;追記&lt;/b&gt;&lt;br /&gt;
2010-04-12:&lt;br /&gt;
&lt;code&gt;f,F&lt;/code&gt;についての解釈の間違いによる不具合を修正。</description><link>http://yas-hummingbird.blogspot.com/2010/03/javascript-netdate.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-5636257604950396939</guid><pubDate>Tue, 09 Mar 2010 09:00:00 +0000</pubDate><atom:updated>2010-04-02T08:21:38.526+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Convertを使わずに2進数、10進数の相互変換を行う - C#</title><description>通常ならこのような変換には&lt;code&gt;System.Convert&lt;/code&gt;を使うだろうが、これを使わずに変換を行う処理を自身で書いてみたくなった。&lt;br /&gt;
&lt;br /&gt;
.NET Frameworkに勝るモノを自身で書ける、などとは思わないが、デモンストレーション的な感じでね。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;10進数 → 2進数&lt;/h4&gt;例えば、10進数から2進数への変換は以下のように行う。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;string bin = Convert.ToString(22, 2);//10110
&lt;/pre&gt;&lt;br /&gt;
これを自身で実装してみる。&lt;br /&gt;
色々書いてみたが、結局ビット演算を使うのが一番速いし、コードもシンプルになる。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;/// &amp;lt;summary&amp;gt;
/// 10進数を2進数文字列に変換します。
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&quot;dec&quot;&amp;gt;10進数&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;2進数文字列&amp;lt;/returns&amp;gt;
static string DecimalToBinaryString(long dec)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string ret = string.Empty;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (; dec &amp;gt; 0; dec &amp;gt;&amp;gt;= 1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret = (dec &amp;amp; 1) + ret;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;code&gt;dec &amp;amp; 1&lt;/code&gt;で右端のビットのみを取得している。&lt;br /&gt;
右端のビットを取得したら変数&lt;code&gt;dec&lt;/code&gt;右へビットシフトする。&lt;br /&gt;
変数&lt;code&gt;dec&lt;/code&gt;を追っていくと以下のようになる。&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;//引数:22
dec: 22(10110)
dec: 11(01011)
dec:  5(00101)
dec:  2(00010)
dec:  1(00001)
dec:  0(00000)&lt;/pre&gt;このようにしてビットを一つづつ取得して文字列にしている。&lt;br /&gt;
&lt;br /&gt;
処理速度は？というと&lt;code&gt;Convert&lt;/code&gt;クラスと比較して約8倍掛る結果となった。&lt;br /&gt;
&lt;br /&gt;
ん~...　使えね~(^_^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;2進数 → 10進数&lt;/h4&gt;&lt;code&gt;Convert&lt;/code&gt;クラスを使用して2進数文字列から10進数への変換は以下のように行う。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;long dec = Convert.ToInt64(&quot;10110&quot;, 2);//22
&lt;/pre&gt;&lt;br /&gt;
これを実装してみる。&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;/// &amp;lt;summary&amp;gt;
/// 2進数文字列を10進数(long)に変換します。
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&quot;bin&quot;&amp;gt;2進数文字列&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;10進数&amp;lt;/returns&amp;gt;
static long BinaryToDecimalNumber(string bin)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long ret = 0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (var chr in bin)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret = (ret &amp;lt;&amp;lt; 1) | ((long)chr &amp;amp; 1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;
}
&lt;/pre&gt;文字を一つづつ取り出して足していくのですが、ここでもビット演算が処理を簡単にしてくれる。&lt;br /&gt;
&lt;br /&gt;
コード内の「&lt;code&gt;(long)chr &amp;amp; 1&lt;/code&gt;」を説明すると、&lt;code&gt;string&lt;/code&gt;型から文字を一つづつ&lt;code&gt;char&lt;/code&gt;型として取りだしたモノが&lt;code&gt;chr&lt;/code&gt;になりますが、これを数値型(&lt;code&gt;long&lt;/code&gt;)にキャストし、そして右端のビットのみを取得しています。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Type:Char 0 = Ascii:48　binay:11000&lt;span style=&quot;color: red;&quot;&gt;0&lt;/span&gt;&lt;br /&gt;
Type:Char 1 = Ascii:49　binay:11000&lt;span style=&quot;color: red;&quot;&gt;1&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;
コード内の「&lt;code&gt;ret &amp;lt;&amp;lt; 1&lt;/code&gt;」は先程説明した値&lt;code&gt;chr&lt;/code&gt;を常に右側のビットとして足していくので、既存の値を左へシフトして一番右側のビットを開けてやっているワケです。&lt;br /&gt;
&lt;br /&gt;
処理の過程を表すと以下のようになる。&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;//引数:&quot;10110&quot;
&amp;nbsp;0(00000) + 1 =  1(00001)
&amp;nbsp;2(00010) + 0 =  2(00010)
&amp;nbsp;4(00100) + 1 =  5(00101)
10(01010) + 1 = 11(01011)
22(10110) + 0 = 22(10110)&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これを&lt;code&gt;Convert&lt;/code&gt;クラスを使用した場合の処理速度と比較してみる。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1000 * 1000回処理を行う際に掛った時間&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;//引数:&quot;10110&quot;(22)
Convert.ToInt32       : 112ms
Convert.ToInt64       : 174ms
BinaryToDecimalNumber :  80ms
&lt;/pre&gt;&lt;br /&gt;
何故か私が書いたモノのが一番速かったのだが、私の書いたモノには欠点がある。&lt;br /&gt;
それは1以上の値しか扱えないこと。つまり「0」もダメ。&lt;br /&gt;
しかし&lt;code&gt;Convert&lt;/code&gt;クラスなら負の数も扱えるのでこちらの方が優秀。&lt;br /&gt;
扱う値の範囲が分かっているなら、私の書いたモノを使っても問題ない場合もあるだろうが、やはり&lt;code&gt;Convert&lt;/code&gt;クラスを使う方が無難ですよね。&lt;br /&gt;
&lt;br /&gt;
一つの発見は&lt;code&gt;ToInt32&lt;/code&gt;と&lt;code&gt;ToInt64&lt;/code&gt;では処理速度に差がある、ということでした。</description><link>http://yas-hummingbird.blogspot.com/2010/03/convert210-c.html</link><author>noreply@blogger.com (y@s)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-3899602440172577887</guid><pubDate>Wed, 03 Mar 2010 22:30:00 +0000</pubDate><atom:updated>2010-03-04T23:17:57.178+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>初期値 != 既定値???</title><description>初期値と既定値は同じだと勝手に思い込んでいた。&lt;br /&gt;
&lt;br /&gt;
しかし、違うのねん!! というお話し。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
初期値と既定値、そしてそれに関連して初期化が絡み、私の頭の中で適当に解釈されていたこれらを整理したい。&lt;br /&gt;
&lt;br /&gt;
「&lt;a href=&quot;http://www.google.co.jp/search?hl=ja&amp;amp;q=C%23+%8F%89%8A%FA%92l&quot; title=&quot;C# 初期値 - Google 検索&quot;&gt;C# 初期値&lt;/a&gt;」と検索すると何故か二番目に表示されるのが&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/83fhsxwc.aspx&quot; title=&quot;既定値の一覧表 (C# リファレンス)&quot;&gt;既定値の一覧表 (C# リファレンス)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
読んで字のごとく、&lt;b&gt;既定値&lt;/b&gt;の一覧だ。&lt;br /&gt;
だが、&lt;b&gt;初期値と既定値は必ずしも一致しない&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
例えば、こんなクラスがあったとする。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Hoge
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue { get; set; }
}
&lt;/pre&gt;この&lt;code&gt;Hoge&lt;/code&gt;クラスのインスタンスを生成すると、&lt;code&gt;IntValue&lt;/code&gt;には&lt;code&gt;int&lt;/code&gt;型の既定値である「0」が入る。&lt;br /&gt;
&lt;br /&gt;
つまり、初期化を明示的に行っていない&lt;code&gt;IntValue&lt;/code&gt;プロパティの初期値はその型の既定値となるワケだ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
では、&lt;code&gt;IntValue&lt;/code&gt;プロパティの初期化を行う。&lt;br /&gt;
初期値を1とする。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;パターン1:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Hoge1
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Hoge1()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.IntValue = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue { get; set; }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;パターン2:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Hoge2
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int intValue;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Hoge2()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intValue = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return intValue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intValue = value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;パターン3:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Hoge3
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private int intValue = 1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return intValue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intValue = value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;分かりやすいように&lt;code&gt;int&lt;/code&gt;型の既定値「0」ではない値「1」を設定した。&lt;br /&gt;
&lt;br /&gt;
どれもやっていることに大差はない。&lt;br /&gt;
ここで重要なのは初期値を設定したことにある。&lt;br /&gt;
最初に何らかの値を設定することを初期化と言い、初期化によって設定された値が初期値である。&lt;br /&gt;
&lt;br /&gt;
何だか当り前のことを書いてて若干アホらしくなってきた...&lt;br /&gt;
&lt;br /&gt;
初期値と既定値が同じ値となる可能性もあるが、初期値と既定値が同じ場合の初期化の必要性をここで四の五の言うつもりはないのでそれに関してはスルー。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
「何で私が混乱してしまったのか?」を最初に説明すべきだったかも知れないが、今更に述べるが、&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/system.componentmodel.defaultvalueattribute%28VS.80%29.aspx&quot; title=&quot;DefaultValueAttribute クラス (System.ComponentModel)&quot;&gt;DefaultValueAttribute&lt;/a&gt;が何モノなのか?分からなくなってしまったから。&lt;br /&gt;
説明には「プロパティの既定値を指定します。」とある。&lt;br /&gt;
&lt;br /&gt;
私は勝手に「これを使えば初期化しなくてもその値が設定される？」と思ったのだが、どうやらそういうことではないようだ。&lt;br /&gt;
&lt;br /&gt;
例えば、こんなクラスがあったとする。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Foo
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Foo()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//this.IntValue = 100;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//this.BoolValue = true;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//this.ColorValue = Color.White;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(int), &quot;100&quot;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue { get; set; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(bool), &quot;True&quot;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public bool BoolValue { get; set; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(Color), &quot;White&quot;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Color ColorValue { get; set; }
}
&lt;/pre&gt;この&lt;code&gt;Foo&lt;/code&gt;クラスのインスタンスを生成しても、そのプロパティの値はそれぞれの型の既定値のままだった。&lt;br /&gt;
&lt;br /&gt;
ん~~　(-。-;)y-゜゜゜&lt;br /&gt;
&lt;br /&gt;
やはり初期化しないとダメなのか？&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/system.componentmodel.defaultvalueattribute%28VS.80%29.aspx&quot;&gt;引用&lt;/a&gt;:&lt;b&gt;解説&lt;/b&gt;&lt;br /&gt;
任意の値を指定して&lt;code&gt;DefaultValueAttribute&lt;/code&gt;を作成できます。通常、メンバの既定値はその初期値になります。ビジュアル デザイナでは、その既定値を使用してメンバの値をリセットできます。コード ジェネレータでも、既定値を使用して、メンバに対してコードを生成する必要があるかどうかを判断できます。&lt;/blockquote&gt;&lt;br /&gt;
なんかIDEが勝手に吐くコードに関係ありそう。&lt;br /&gt;
逆に言えば、コンソールアプリでは無意味かも...?!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
さらに&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/system.componentmodel.defaultvalueattribute%28VS.80%29.aspx#ctl00_MTCS_main_ctl53_ctl00_ctl01_CSharp&quot; title=&quot;DefaultValueAttribute クラス (System.ComponentModel)&quot;&gt;引用&lt;/a&gt;:&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;private bool myVal=false;

[DefaultValue(false)]
public bool MyProperty {
&amp;nbsp;&amp;nbsp;&amp;nbsp;get {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return myVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;set {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myVal=value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;あれ?ちゃっかり初期化してる(-_-;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
半分やけくそでコンストラクタを書き換えてみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;class Foo
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Foo()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//書き加えた処理
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (PropertyInfo fi in typeof(Foo).GetProperties())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AttributeCollection attrs =
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TypeDescriptor.GetProperties(this)[fi.Name].Attributes;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi.SetValue(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((DefaultValueAttribute)attrs[typeof(DefaultValueAttribute)]).Value,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;null);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(int), &quot;100&quot;)]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int IntValue { get; set; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(bool), &quot;True&quot;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public bool BoolValue { get; set; }

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DefaultValue(typeof(Color), &quot;White&quot;)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Color ColorValue { get; set; }
}
&lt;/pre&gt;コンストラクタで&lt;code&gt;DefaultValue&lt;/code&gt;に設定した値で初期化されるようにしてみた。&lt;br /&gt;
&lt;br /&gt;
実際に使ってみる。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;Foo foo = new Foo();

Console.WriteLine(&quot;IntValue:{0}\nBoolValue:{1}\nColorValue:{2}\n&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo.IntValue,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo.BoolValue,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo.ColorValue);

//Output
//IntValue:100
//BoolValue:True
//ColorValue:Color [White]&lt;/pre&gt;&lt;br /&gt;
これでイイとは思ってないけど、これでおわり。</description><link>http://yas-hummingbird.blogspot.com/2010/03/blog-post.html</link><author>noreply@blogger.com (y@s)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7812385363005324288</guid><pubDate>Thu, 25 Feb 2010 15:10:00 +0000</pubDate><atom:updated>2010-02-26T00:39:40.546+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>StructLayoutとFieldOffset属性 - C#</title><description>属性を学んでいてなかなかおもしろいなぁと感じたのでメモる。&lt;br /&gt;
&lt;code&gt;StructLayout&lt;/code&gt;と&lt;code&gt;FieldOffset&lt;/code&gt;を使用すると便利なモノができるようだ。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;StructLayout&lt;/b&gt; - クラスまたは構造体のデータ フィールドの物理的なレイアウトを制御できる。&lt;br /&gt;
&lt;b&gt;FieldOffset&lt;/b&gt; - フィールドの物理的な位置を示す。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;StructLayout&lt;/code&gt;属性でレイアウトの種類を指定して、&lt;code&gt;FieldOffset&lt;/code&gt;属性で先頭からの距離をバイト単位で指定することになる。&lt;br /&gt;
下記の例では&lt;code&gt;byte&lt;/code&gt;型の&lt;code&gt;Alpha&lt;/code&gt;、&lt;code&gt;Red&lt;/code&gt;、&lt;code&gt;Green&lt;/code&gt;、&lt;code&gt;Blue&lt;/code&gt;の計4つのフィールド、つまり4バイトの構造体を作成している。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;[StructLayout(LayoutKind.Explicit)]
struct ARGBColor
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FieldOffset(3)] public byte Alpha;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FieldOffset(2)] public byte Red;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FieldOffset(1)] public byte Green;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FieldOffset(0)] public byte Blue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[FieldOffset(0)] public uint Argb;
}
&lt;/pre&gt;&lt;code&gt;Alpha&lt;/code&gt;、&lt;code&gt;Red&lt;/code&gt;、&lt;code&gt;Green&lt;/code&gt;、&lt;code&gt;Blue&lt;/code&gt;フィールドでは1バイトのデータにアクセスする。&lt;br /&gt;
&lt;code&gt;Argb&lt;/code&gt;フィールドでは4バイトのデータにアクセスする。&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;Argb&lt;/code&gt;に値を設定すると&lt;code&gt;Alpha&lt;/code&gt;、&lt;code&gt;Red&lt;/code&gt;、&lt;code&gt;Green&lt;/code&gt;、&lt;code&gt;Blue&lt;/code&gt;のそれぞれに値が設定される。&lt;br /&gt;
またその逆に&lt;code&gt;Alpha&lt;/code&gt;、&lt;code&gt;Red&lt;/code&gt;、&lt;code&gt;Green&lt;/code&gt;、&lt;code&gt;Blue&lt;/code&gt;のそれぞれに値を設定するとArgb値も当然変化する。&lt;br /&gt;
&lt;br /&gt;
すごく便利だ(^-^)&lt;br /&gt;
&lt;br /&gt;
欲を言えば、&lt;code&gt;public int Rgb&lt;/code&gt;&lt;/code&gt;として、&lt;code&gt;Alpha&lt;/code&gt;を省いたRGB値も取得できたらもっと良かったのだが、どうもうまくいかない(-_-;)&lt;br /&gt;
&lt;br /&gt;
色を16進数で表す場合「ARGB」つまり、「&lt;code&gt;Alpha&lt;/code&gt;、&lt;code&gt;Red&lt;/code&gt;、&lt;code&gt;Green&lt;/code&gt;、&lt;code&gt;Blue&lt;/code&gt;」の順番となるので、&lt;code&gt;FieldOffset&lt;/code&gt;属性に設定する値でその順番を間違えないように気を付けたい。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;ARGBColor color = new ARGBColor();
color.Argb = 0x8033ff;

FieldInfo[] fields = color.GetType()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetFields(BindingFlags.Instance | BindingFlags.Public);

Console.WriteLine(&quot;{0,-6} {1,12}{2,12}&quot;, &quot;Name&quot;, &quot;hex&quot;, &quot;int&quot;);
foreach (FieldInfo field in fields)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&quot;{0,-6}:{1,12}{2,12}&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;field.Name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Convert.ToString(Convert.ToInt64(field.GetValue(color)), 16),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;field.GetValue(color));
}

color.Alpha = 0xff;
color.Red = 0x33;
color.Green = 0x66;
color.Blue = 0x99;

Console.WriteLine(&quot;\n{0,-6} {1,12}{2,12}&quot;, &quot;Name&quot;, &quot;hex&quot;, &quot;int&quot;);
foreach (FieldInfo field in fields)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&quot;{0,-6}:{1,12}{2,12}&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;field.Name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Convert.ToString(Convert.ToInt64(field.GetValue(color)), 16),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;field.GetValue(color));
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;font-family:monospace;&quot;&gt;Name            hex         int
Alpha :           0           0
Red   :          80         128
Green :          33          51
Blue  :          ff         255
Argb  :      8033ff     8401919

Name            hex         int
Alpha :          ff         255
Red   :          33          51
Green :          66         102
Blue  :          99         153
Argb  :    ff336699  4281558681&lt;/pre&gt;</description><link>http://yas-hummingbird.blogspot.com/2010/02/structlayoutfieldoffset-c.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7834674084201016240</guid><pubDate>Thu, 25 Feb 2010 11:00:00 +0000</pubDate><atom:updated>2010-03-01T00:23:16.649+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>続・画像ファイルのパスを取得する - C#</title><description>&lt;a href=&quot;http://yas-hummingbird.blogspot.com/2010/02/c_18.html&quot; title=&quot;画像ファイルのパスを取得する - C#:humming bird&quot;&gt;前回&lt;/a&gt;の処理をもう少し見直してみる。&lt;br /&gt;
&lt;br /&gt;
前回の処理では画像形式の種類を問わずファイルを取得しているので、特定のファイル形式のみを取得する処理にしたい。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
取得したい画像形式を簡単に指定出来るようにしたいので引数として使用するenumを用意する。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39; style=&quot;font-family:monospace;&quot;&gt;[Flags]
public enum ImageTypeFlags
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BMP  = 1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EMF  = 1 &amp;lt;&amp;lt; 1, //  2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GIF  = 1 &amp;lt;&amp;lt; 2, //  4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ICO  = 1 &amp;lt;&amp;lt; 3, //  8
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JPEG = 1 &amp;lt;&amp;lt; 4, // 16
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PNG  = 1 &amp;lt;&amp;lt; 5, // 32
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TIFF = 1 &amp;lt;&amp;lt; 6, // 64
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WMF  = 1 &amp;lt;&amp;lt; 7  //128
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
各画像形式には複数の拡張子が存在するのでその拡張子を直に取り出せるように&lt;code&gt;ImageTypeFlags&lt;/code&gt;をKeyにした&lt;code&gt;Dictionary&lt;/code&gt;を作成する。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;Dictionary&amp;lt;ImageTypeFlags, string[]&amp;gt; extDict = ImageCodecInfo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetImageDecoders()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ToDictionary(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ici =&amp;gt; (ImageTypeFlags)Enum.Parse(typeof(ImageTypeFlags),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ici.FormatDescription, true),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ici =&amp;gt; ici.FilenameExtension.Split(&#39;;&#39;));
&lt;/pre&gt;ここで一つ問題がある。&lt;br /&gt;
ImageTypeFlagsの列挙子と上で取得するFormatDescriptionとが必ず一致する保証がない。&lt;br /&gt;
現在の.NET Frameworkのバージョンでは問題なく動作するが、今後サポートする画像形式が変更される可能性は決してゼロではないため、これについての対処がされていないという意味でちぃとマズイかも...&lt;br /&gt;
&lt;br /&gt;
以下が本体。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;string[] GetImageFiles(string root, SearchOption so)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return GetImageFiles(root, so, (ImageTypeFlags)0xff); //255 = All
}

string[] GetImageFiles(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string root, SearchOption so, ImageTypeFlags imgTypeFlags)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerable&amp;lt;string&amp;gt; imgFiles = new string[0];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (ImageTypeFlags flg in Enum.GetValues(typeof(ImageTypeFlags)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((imgTypeFlags &amp; flg) != 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string sp in extDict[flg])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgFiles = imgFiles.Concat(Directory.GetFiles(root, sp, so));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return imgFiles.ToArray();
}
&lt;/pre&gt;&lt;code&gt;ImageTypeFlags.All&lt;/code&gt;があった方が良かったかもしれないが、あるとそれに関する余計な処理が増えるので省き、メソッドのオーバーロードで対応した。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;//JpegファイルとBitmapファイルを取得します。
string[] s = GetImageFiles(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SearchOption.AllDirectories,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageTypeFlags.JPEG | ImageTypeFlags.BMP);
&lt;/pre&gt;これで簡単に画像ファイルのパスを取得できる。</description><link>http://yas-hummingbird.blogspot.com/2010/02/c_25.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7360821907595907193</guid><pubDate>Thu, 18 Feb 2010 10:00:00 +0000</pubDate><atom:updated>2010-02-21T19:42:07.371+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>画像ファイルのパスを取得する - C#</title><description>画像ファイルのパスを取得するために、.NETで扱える画像の種類を取得する方として、他にも色々あるかもしれないが、私はこのようにする。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
まず、ファイルのパスを取得するメソッドである&lt;code&gt;Directory.GetFiles&lt;/code&gt;の引数のサーチパターンとして使用するものを用意する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;string[] IMAGE_SEARCH_PATTERN_ALL = ImageCodecInfo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetImageDecoders()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Select(ici =&amp;gt; ici.FilenameExtension.Split(&#39;;&#39;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Aggregate((current, next) =&amp;gt; current.Concat(next).ToArray());
&lt;/pre&gt;&lt;br /&gt;
これを出力すると以下になる。&lt;br /&gt;
&lt;blockquote&gt;*.BMP&lt;br /&gt;
*.DIB&lt;br /&gt;
*.RLE&lt;br /&gt;
*.JPG&lt;br /&gt;
*.JPEG&lt;br /&gt;
*.JPE&lt;br /&gt;
*.JFIF&lt;br /&gt;
*.GIF&lt;br /&gt;
*.EMF&lt;br /&gt;
*.WMF&lt;br /&gt;
*.TIF&lt;br /&gt;
*.TIFF&lt;br /&gt;
*.PNG&lt;br /&gt;
*.ICO&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
これを使用した画像ファイルのパスを取得するメソッドを書いてみる。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;string[] GetImageFiles1(string root, SearchOption so)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;string&amp;gt; imgFileList = new List&amp;lt;string&amp;gt;();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string ext in IMAGE_SEARCH_PATTERN_ALL)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgFileList.AddRange(Directory.GetFiles(root, ext, so));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return imgFileList.ToArray();
}
&lt;/pre&gt;因みに&lt;code&gt;Directory.GetFiles&lt;/code&gt;は大文字と小文字を区別しない。&lt;br /&gt;
つまり、「jpg」も「JPG」も「Jpg」も拾う。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これを少し見直してみる。&lt;br /&gt;
Listを使うと少々処理が遅くなるので、これを使わない方法で書いてみる。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;string[] GetImageFiles2(string root, SearchOption so)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerable&amp;lt;string&amp;gt; imgFiles = new string[0];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string ext in IMAGE_SEARCH_PATTERN_ALL)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgFiles = imgFiles.Concat(Directory.GetFiles(root, ext, so));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return imgFiles.ToArray();
}
&lt;/pre&gt;&lt;br /&gt;
Listではなく、IEnumerableにしてConcatで配列をまとめているのだが、処理時間を計測するとIEnumerableを使用した方が若干だが速い。&lt;br /&gt;
こちらの方が低レベルな処理ということなのかな?</description><link>http://yas-hummingbird.blogspot.com/2010/02/c_18.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-2827117227643000540</guid><pubDate>Tue, 16 Feb 2010 23:00:00 +0000</pubDate><atom:updated>2010-03-04T23:32:57.778+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>再帰でハマる - C#</title><description>ループの代わりに再帰を使って繰り返し処理を行ってみたのだが、何やら予想外の動作になった。&lt;br /&gt;
「なぜそうなるのか？」についてまではまだたどり着いていないのであしからず。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
N番目のフィボナッチ数を求める関数で説明すると、 まずwhile文で単純に処理すると以下のようになる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;static int Fibonacci_1(int num)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int x = 0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y = 1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_x;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (num &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_x = x;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = y;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y = old_x + y;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return x;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;int n = 12;
Console.WriteLine(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;{0}th:{1}&quot;, n, Fibonacci_1(n));
//12th:144
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今度は再帰を行い同様の処理をしてみる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;delegate int[] Fib(int[] n, Fib fib);
static int Fibonacci_2(int num)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fib fib = (xy, fn) =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (num &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fn(new[] { xy[1], xy[0] + xy[1] }, fn);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&quot;{0}, {1}&quot;, xy[0], xy[1]);//①

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return xy;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return fib(new[] { 0, 1 }, fib)[0];
}
&lt;/pre&gt;&lt;br /&gt;
上記と同様に使用してみると結果は以下のようになった。&lt;br /&gt;
&lt;blockquote&gt;144, 233&lt;br /&gt;
89, 144&lt;br /&gt;
55, 89&lt;br /&gt;
34, 55&lt;br /&gt;
21, 34&lt;br /&gt;
13, 21&lt;br /&gt;
8, 13&lt;br /&gt;
5, 8&lt;br /&gt;
3, 5&lt;br /&gt;
2, 3&lt;br /&gt;
1, 2&lt;br /&gt;
1, 1&lt;br /&gt;
0, 1&lt;br /&gt;
12th:0&lt;/blockquote&gt;&lt;br /&gt;
何番目を求めても答えは0。&lt;br /&gt;
コード内の&lt;b&gt;①の部分で出力されている回数とその内容が逆転しているのがへんだ&lt;/b&gt;。&lt;br /&gt;
私の頭の中ではこれが出力されるのは最後の一度だけなのだが、どうにも理解し難い結果が出てくる。&lt;br /&gt;
もし仮に毎回出力されたとしても、なぜにその内容が逆転しているのか？&lt;br /&gt;
出力されるなら「0,1」から始まり「144,233」で終わるはず。&lt;br /&gt;
&lt;br /&gt;
誰か分かる方がいらっしゃたら教えて下さいマセマセ m(__)m&lt;br /&gt;
&lt;br /&gt;
一応手探りで解決したモノが以下。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;static int[] Fibonacci_5(int num)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (num == 0){return new[] { 0, 1 };}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ((Func&amp;lt;int[], int[]&amp;gt;)((n) =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return new[] { n[1], n[0] + n[1] };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}))(Fibonacci_5(--num));
}
&lt;/pre&gt;これで思った通りの結果が得られるわけだが...&lt;br /&gt;
しかし、なぜこれで良いのか書いた本人は分かっていない...　(^_^;)&lt;br /&gt;
勝手にぐるぐるループしてるけど、そのとき&quot;n&quot;の値も勝手に書き変わっているので、出力するのは1回にすれば正しい結果になるはず、という発想で書いてみただけ。&lt;br /&gt;
&lt;br /&gt;
処理に掛る時間はおよそ倍になるのでボツですなぁ。(-ω-;)&lt;br /&gt;
&lt;br /&gt;
行き当たりばったりで良しとする思考回路じゃないのねん!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;追記:&lt;/b&gt;&lt;br /&gt;
思った通りの動作となるように書き直したものです。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;delegate int Fib(int n1, int n2, Fib fib);
static int Fibonacci_3(int num)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fib fib = (n1, n2, fn) =&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (num &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return fn(n2, n1 + n2, fn);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return n1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return fib( 0, 1 , fib);
}
&lt;/pre&gt;はい、私だけスッキリ(^-^)&lt;br /&gt;
&lt;br /&gt;
欲を言えば、Javascriptで言うところの&lt;code&gt;arguments.callee&lt;/code&gt;のようなことができたら、もっとシンプルに書けるんだけどなぁ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/3dasc8as.aspx&quot; title=&quot;方法 : スレッド プールを使用する (C# プログラミング ガイド)&quot;&gt;MSDN&lt;/a&gt;にもフィボナッチ数を求めるコードが載っていた。&lt;br /&gt;
&lt;br /&gt;
必要な部分だけを抜き出し、メソッドにすると以下になる。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;static int Fibonacci_7(int n)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (n &amp;lt;= 1) { return n; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return Fibonacci_7(n - 1) + Fibonacci_7(n - 2);
}
&lt;/pre&gt;一見シンプルで良さげだが、実際に使ってみると超遅い。&lt;br /&gt;
まあ、参考までに。</description><link>http://yas-hummingbird.blogspot.com/2010/02/c_17.html</link><author>noreply@blogger.com (y@s)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-4877830590407630715</guid><pubDate>Sun, 31 Jan 2010 22:30:00 +0000</pubDate><atom:updated>2010-04-01T22:01:23.884+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>フォルダ(ファイル)サイズを適切な単位に変換する - C#</title><description>フォルダ(ファイル)サイズを取得したはイイが、バイトで表示されてもピンとこないので、適切な単位で表示したい。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
まず、フォルダサイズを取得します。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;/// &amp;lt;summary&amp;gt;
/// フォルダのサイズを取得します
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&quot;dirInfo&quot;&amp;gt;サイズを取得するフォルダ&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;フォルダサイズ&amp;lt;/returns&amp;gt;
public static long GetFolderSize(string path)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return GetFolderSize(new DirectoryInfo(path));
}

public static long GetFolderSize(DirectoryInfo dirInfo)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long size = 0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//フォルダ内のファイルサイズを計算します。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (FileInfo fi in dirInfo.GetFiles())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size += fi.Length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//サブフォルダのサイズを合計します。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (DirectoryInfo di in dirInfo.GetDirectories())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size += GetFolderSize(di);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return size;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
取得したサイズを適切な単位に変換します。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;string GetFormatSizeString(float size)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return GetFormatSizeString(size, 1024);
}

string GetFormatSizeString(float size, int p)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return GetFormatSizeString(size, p, &quot;#,##0.##&quot;);
}

string GetFormatSizeString(float size, int p, string specifier)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] suffix = { &quot;&quot;, &quot;K&quot;, &quot;M&quot;, &quot;G&quot;, &quot;T&quot;, &quot;P&quot;, &quot;E&quot;, &quot;Z&quot;, &quot;Y&quot; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int index = 0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (size &amp;gt;= p)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size /= p;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Format(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;{0}{1}B&quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size.ToString(specifier),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index &amp;lt; suffix.Length ? suffix[index] : &quot;-&quot;);
}
&lt;/pre&gt;当分はテラバイト(TB)まであれば十分だろうが念のため、出来る限り単位は付加されるようにしてある。&lt;br /&gt;
ulong.MaxValueをこのメソッドで変換すると、&quot;16EB&quot;となるため、これ以上の単位は不要とも思われるが、上の処理では一番大きな単位となる&quot;YB&quot;(ヨタバイト:yottabyte)以上の単位となる場合は&quot;-B&quot;となるようにしている。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;string path = Environment.GetFolderPath(
        Environment.SpecialFolder.MyPictures);

long folderSize = GetFolderSize(path);

Console.WriteLine(folderSize);
Console.WriteLine(SizeFormat(folderSize));
&lt;/pre&gt;&lt;br /&gt;
念のため、&quot;ディスク上のサイズ&quot;ではなく、単なる&quot;サイズ&quot;と一致します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Win APIを使用する&lt;/h4&gt;&lt;br /&gt;
こんな感じでファイルサイズを変換してくれるモノもある。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;[DllImport(&quot;shlwapi.dll&quot;, CharSet = CharSet.Auto)]
private static extern long StrFormatByteSize(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long fileSize,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MarshalAs(UnmanagedType.LPTStr)] StringBuilder buffer,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int bufferSize);

public static string GetFormatSizeString(long size)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder builder = new StringBuilder(32);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StrFormatByteSize(size, builder, 32);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return builder.ToString();
}
&lt;/pre&gt;しかし、この処理は私が書いた上記の処理よりもパフォーマンスが悪い。&lt;br /&gt;
私が調べたところ、処理に掛る時間に約7倍の差が出た。&lt;br /&gt;
やはりやってみないと分からないことってありますねぇ。&lt;br /&gt;
&lt;code&gt;API&lt;/code&gt;を使ったり、&lt;code&gt;unmanage&lt;/code&gt;コードを書けば何でも速くなると思っているアホにはなりたくないからね!!(^-^)v</description><link>http://yas-hummingbird.blogspot.com/2010/02/c.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7759477934223107025</guid><pubDate>Sun, 31 Jan 2010 14:55:00 +0000</pubDate><atom:updated>2010-02-01T00:46:53.441+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>指定されたパスがフォルダかを調べる - C#</title><description>指定されたパスがフォルダかを調べるにはどうしたら良いのか。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ディレクトリであるかを調べる&lt;code&gt;Directory.Exists&lt;/code&gt;メソッドを使うと &quot;C:\&quot; などのルートディレクトリでもtrueを返す。&lt;br /&gt;
&lt;br /&gt;
これを良しとしないのなら、&lt;code&gt;File.GetAttributes&lt;/code&gt;メソッドで属性を取得して比較することになる。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;bool ret = File.GetAttributes(path).Equals(FileAttributes.Directory);
&lt;/pre&gt;これなら、指定したパスがルートディレクトリの場合、falseを返す。一応これで、期待通りの答えが返るワケだが... しかし、指定したパスが存在しない場合、例外が発生するのでこれを回避するために結局&lt;code&gt;Directory.Exists&lt;/code&gt;メソッドを使い、指定したパスの存在チェックを行うとなると、なんか「え～～(-д-)」といった感じ。&lt;br /&gt;
&lt;br /&gt;
下記のようにメソッドにして&lt;code&gt;try catch&lt;/code&gt;で処理しても、パスが存在しないと余計に時間が掛る結果となった。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;public static bool IsFolder(string path)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return File.GetAttributes(path).Equals(FileAttributes.Directory);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ex.GetType() == typeof(FileNotFoundException))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw ex;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}
&lt;/pre&gt;&lt;br /&gt;
結局、時と場合に応じてこの二つの方法を使い分けるべきか。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
もし、&lt;code&gt;Directory.Exists&lt;/code&gt;を使うなら、こんな感じになるかな?&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;public enum FileType
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File = 0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory //(Folder)
}

//Sample - 1
public static bool IsFileType1(string path, FileType filetype)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Func&amp;lt;string, bool&amp;gt;[] isType = new Func&amp;lt;string, bool&amp;gt;[]{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.Exists,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory.Exists
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return isType[(int)filetype](path);
}

//Sample - 2
public static bool IsFileType2(string path, FileType filetype)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Func&amp;lt;string, bool&amp;gt; isType = filetype == FileType.File ?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Func&amp;lt;string, bool&amp;gt;)File.Exists : Directory.Exists;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return isType(path);
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Usage&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;string path = Path.Combine(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@&quot;test&quot;);

Console.WriteLine(IsFileType1(path, FileType.Directory));
&lt;/pre&gt;</description><link>http://yas-hummingbird.blogspot.com/2010/01/c.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-4776524273327558147</guid><pubDate>Fri, 04 Dec 2009 01:00:00 +0000</pubDate><atom:updated>2010-03-17T01:29:02.391+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>LIAR GAME - 17Pokerのカラクリと矛盾</title><description>LIAR GAMEトーナメント4回戦の中堅戦、17(セブンティーン)ポーカーの「ココおかしいです」。&lt;br /&gt;
&lt;br /&gt;
録画していたのを最近見たのでタイムリーな話しではないことを十分理解した上で、&lt;br /&gt;
「&lt;b&gt;そんなことはどうでもイイ!!&lt;/b&gt;」&lt;br /&gt;
&lt;br /&gt;
※再放送を見たので、さらに書き加えました。&lt;br /&gt;
&lt;br /&gt;
それでは本題へ。&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
念のため、17ポーカーを簡単に説明すると&lt;code&gt;J×4&lt;/code&gt;, &lt;code&gt;Q×4&lt;/code&gt;, &lt;code&gt;K×4&lt;/code&gt;, &lt;code&gt;A×4&lt;/code&gt;, &lt;code&gt;Joker&lt;/code&gt;の計17枚で行うポーカーです。詳しいルールは番組の&lt;a href=&quot;http://wwwz.fujitv.co.jp/LG2/special/game2.html&quot;&gt;サイト&lt;/a&gt;でチェックして下さい。&lt;br /&gt;
&lt;br /&gt;
今回取り上げるのは、秋山の要求によりヒンズーシャッフルを止めて、リフルシャッフルのみとなった6th Gameと7th Gameです。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB_%28%E3%82%AB%E3%83%BC%E3%83%89%29#.E3.83.AA.E3.83.95.E3.83.AB.E3.82.B7.E3.83.A3.E3.83.83.E3.83.95.E3.83.AB&quot; title=&quot;シャッフル (カード) - Wikipedia&quot;&gt;リフルシャッフル&lt;/a&gt;により規則的に変化するカードの並び順を調べることによって、秋山の「&lt;b&gt;5枚交換による2連続4カードを本当に再現できるか?&lt;/b&gt;」を確かめる。&lt;br /&gt;
&lt;br /&gt;
どうやって調べたか？ →  サクッとJavascriptで。&lt;br /&gt;
規則的に動作するモノを再現するのはプログラミングは最も適しているトコロ。&lt;br /&gt;
&lt;br /&gt;
そして、調べるうちに「&lt;b&gt;おかしい&lt;/b&gt;(-_-;)」と思われるところがやはり出てきた。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;新品のカードの並びを再現する&lt;/h4&gt;菊池の手掛かりをまとめると、&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;一番下は♠A&lt;/li&gt;
&lt;li&gt;下から二番目は♠J&lt;/li&gt;
&lt;li&gt;一番上はJoker&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function create17Cards(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;suit = [&quot;♥&quot;, &quot;♣&quot;, &quot;♦&quot;, &quot;♠&quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num = [&quot;K&quot;, &quot;Q&quot;, &quot;J&quot;, &quot;A&quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards = [&quot;Jk&quot;]; //Jk = Joker
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; suit.length; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var k = 0; k &amp;lt; num.length; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards.push(suit[i] + num[k]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cards;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;結果:上→下&lt;/b&gt;&lt;br /&gt;
&lt;blockquote class=&quot;nowrap&quot; style=&quot;font-family: monospace;&quot;&gt;[Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♣K][♣Q][♣J][♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♠K][♠Q][♠J][♠A]&lt;/blockquote&gt;&lt;br /&gt;
後に秋山が行う説明の中での並び順とも完全に一致する。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;リフルシャッフルを再現する&lt;/h4&gt;簡単に説明すると、二つに分けたカードを一枚づつ重ね合わせる方法のこと。 &lt;br /&gt;
全カードの枚数が奇数(17枚)なのでカードを2分割するとき、「8,9」とするか「9,8」にするかで結果がことなるため重要なポイントとなる。&lt;br /&gt;
私が何度か試した結果とドラマ中の説明と一致するのは「8,9」であった。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;//Perfect Shuffle
function riffleShuffle(cards, count){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var tmp = [], cardsA, cardsB;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; count; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsA = cards.slice(0, 8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsB = cards.slice(8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var k = 0; k &amp;lt; cardsB.length; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp[k * 2] = cardsB[k];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var n = 0; n &amp;lt; cardsA.length; n++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp[n + n + 1] = cardsA[n];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards = tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cards;
}
&lt;/pre&gt;if文を使わない方が直観的か?と感じたのでこのような形にしたが間違った結果は返さないのでこれで良しとする。&lt;br /&gt;
&lt;br /&gt;
上のcreate17Cards関数で17枚のカードを生成し、このriffleShuffle関数で指定の回数だけシャッフルすると以下のような結果となる。&lt;br /&gt;
&lt;blockquote class=&quot;nowrap&quot; style=&quot;font-family: monospace;&quot;&gt;0: [Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♣K][♣Q][♣J][♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♠K][♠Q][♠J][♠A]&lt;br /&gt;
1: [♣A][Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♠K][♣K][♠Q][♣Q][♠J][♣J][♠A]&lt;br /&gt;
2: &lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[Jk][♠K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;[♣K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;[♠Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;[♣Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;[♠J]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;[♣J]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;[♠A]&lt;br /&gt;
3: [♠Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;[♣A][♣Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;[Jk][♠J][♠K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;[♣J][♣K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;[♠A]&lt;br /&gt;
4: [♠J][♠Q][♠K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;[♣A][♣J][♣Q][♣K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;[Jk][♠A]&lt;br /&gt;
5: [♣J][♠J][♣Q][♠Q][♣K][♠K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;[Jk][♣A][♠A]&lt;br /&gt;
6: &lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;[♣J]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;[♠J]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;[♣Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;[♠Q]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;[♣K]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;[♠K][Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♠A]&lt;br /&gt;
7: &lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;[♣K][♣J]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;[♠K][♠J][Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♣Q][♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♠Q][♠A]&lt;br /&gt;
8: [Jk]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♥A]&lt;/span&gt;[♣K][♣Q][♣J][♣A]&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦K]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦Q]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦J]&lt;/span&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;[♦A]&lt;/span&gt;[♠K][♠Q][♠J][♠A]&lt;/blockquote&gt;コンプリートシャッフルを8回行うと元の並びに戻ることが分かる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;カットを再現する&lt;/h4&gt;両プレイヤーそれぞれが上から何番目かを指定し、ディーラーがその位置でカードの位置を上下入れ替える。 &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function cut(cards, n){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = Math.max(Math.min(n, cards.length), 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsA = cards.slice(0, n),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsB = cards.slice(n);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cardsB.concat(cardsA);
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そして、最終的にディーラーを再現すると以下のようになる。&lt;br /&gt;
&lt;pre class=&#39;prettyprint&#39;&gt;var Dealer = (function(){

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cards = [];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function create17Cards(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;suit = [&quot;♥&quot;, &quot;♣&quot;, &quot;♦&quot;, &quot;♠&quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num  = [&quot;K&quot;, &quot;Q&quot;, &quot;J&quot;, &quot;A&quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret  = [&quot;Jk&quot;]; //Jk = Joker
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; suit.length; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var k = 0; k &amp;lt; num.length; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.push(suit[i] + num[k]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//set new cards
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newGame : function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards = create17Cards();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Perfect Shuffle
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;riffleShuffle: function(count){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var tmp = [], cardsA, cardsB;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; count; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsA = cards.slice(0, 8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsB = cards.slice(8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var k = 0; k &amp;lt; cardsB.length; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp[k * 2] = cardsB[k];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var n = 0; n &amp;lt; cardsA.length; n++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp[n + n + 1] = cardsA[n];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards = tmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//cut the cards
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cut:function(n){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = Math.max(Math.min(n, cards.length), 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsA = cards.slice(0,n),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardsB = cards.slice(n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards = cardsB.concat(cardsA);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//First Deal
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;firstDeal:function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cards.length &amp;lt; 10) return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;decks = [[],[]],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i     = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (; i &amp;lt; 10; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;decks[i % 2].push(cards.shift());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return decks;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//change the card
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;change: function(n){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = Math.min(Math.max(Math.min(n, 5), 1),cards.length);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var ret = cards.slice(0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cards.splice(0, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Remaining cards
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remainingCards:function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return cards;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
})();
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そしてこれから、6th Gameと7th Gameを見ていく。&lt;br /&gt;
&lt;br /&gt;
念のため:&lt;br /&gt;
プレイヤーは髪が長めの男の名が&quot;秋山&quot;。サングラスをした男が&quot;菊池&quot;。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;6th Game&lt;/h4&gt;&lt;br /&gt;
6th Gameからリフルシャッフルを何回行うことになっているのか明らかになっていない。&lt;br /&gt;
最初に決められた回数通りと考えるのが妥当だが、この17Pokerというゲームを始める際の説明として、「ヒンズーシャッフルとリフルシャッフルを行います。」と説明されているが、&lt;b&gt;そのシャッフルを何回行うのかドラマ中に明言されていない&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;カットのコール&lt;/b&gt;&lt;br /&gt;
菊池:9&lt;br /&gt;
秋山:2&lt;br /&gt;
&lt;br /&gt;
秋山の最初の手札:ドラマ中一度も見せていない&lt;br /&gt;
菊池の最初の手札:♠K, ♦K, ♦J, ♠J, ♣A&lt;br /&gt;
&lt;br /&gt;
5枚交換後の秋山の手札:♥A, Jk, ♠Q, ♦Q, ♥Q&lt;br /&gt;
1枚交換後の菊池の手札:♠K, ♦K, ♦J, ♠J, ♥J&lt;br /&gt;
&lt;br /&gt;
秋山の方が先にカードの交換を行っているので、残されたカードは「♥A, Jk, ♠Q, ♦Q, ♥Q, ♥J, ?」の7枚だったということになる。&lt;br /&gt;
並び順までは分からないが最初の5枚の内、JokerとQeenが3枚、その後6枚目に必ず♥Jがある、ということまでは特定できる。&lt;br /&gt;
&lt;br /&gt;
これと同じ状況を作り出せるか検証する。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;検証用関数&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function game(shuffleCount, cutNumA, cutNumB){

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$div = $(&quot;&amp;lt;div&amp;gt;&quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dealtCards, playerA, playerB;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Set new cards.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.newGame();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Shuffle
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.riffleShuffle(shuffleCount);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Cut
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.cut(cutNumA);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.cut(cutNumB);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$div.append($(&quot;&amp;lt;span&amp;gt;&quot;).append([
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;shuffle: &quot; + shuffleCount,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;  cut 1: &quot; + cutNumA,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;  cut 2: &quot; + cutNumB
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;].join(&quot;&amp;lt;br&amp;gt;&quot;)),&quot;&amp;lt;br&amp;gt;&quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$div.append($(&quot;&amp;lt;span&amp;gt;&quot;).append(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;before deal:&quot; + Dealer.remainingCards().join(&quot;,&quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;&amp;lt;br&amp;gt;&quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//deal cards
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dealtCards = Dealer.firstDeal();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$div.append($(&quot;&amp;lt;span&amp;gt;&quot;).append([
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;       player A: &quot; + dealtCards[0].join(&quot;,&quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;       player B: &quot; + dealtCards[1].join(&quot;,&quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;remaining cards: &quot; + Dealer.remainingCards().join(&quot;,&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;].join(&quot;&amp;lt;br&amp;gt;&quot;)));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $div;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}
&lt;/pre&gt;&lt;br /&gt;
この検証用関数を以下のように使用する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;for (var i = 0; i &amp;lt; 8; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(document.body).append(game(i, 9, 2));
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6th Game Pattern:結果&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;shuffle&lt;/b&gt;:リフルシャッフルをする回数&lt;/li&gt;
&lt;li&gt;&lt;b&gt;cut 1,2&lt;/b&gt;:両プレイヤーが要求するカットの枚数&lt;/li&gt;
&lt;li&gt;&lt;b&gt;before deal&lt;/b&gt;:シャッフルとカットを終え、プレイヤーにカードを配る前のカードの並び順&lt;/li&gt;
&lt;li&gt;&lt;b&gt;player A&lt;/b&gt;:プレイヤーAに配られるカード&lt;/li&gt;
&lt;li&gt;&lt;b&gt;player B&lt;/b&gt;:プレイヤーBに配られるカード&lt;/li&gt;
&lt;li&gt;&lt;b&gt;remaining cards&lt;/b&gt;:プレイヤーにカードを配り終えた後、ディーラーの下に残されたカード&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;blockquote class=&quot;nowrap&quot;&gt;shuffle: 0&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♦J,♦A,♠K,♠Q,♠J,♠A,Jk,♥K,♥Q,♥J,♥A,♣K,♣Q,♣J,♣A,♦K,♦Q&lt;br /&gt;
player A: ♦J,♠K,♠J,Jk,♥Q&lt;br /&gt;
player B: ♦A,♠Q,♠A,♥K,♥J&lt;br /&gt;
remaining cards: ♥A,♣K,♣Q,♣J,♣A,♦K,♦Q&lt;br /&gt;
&lt;br /&gt;
shuffle: 1&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♣K,♠Q,♣Q,♠J,♣J,♠A,♣A,Jk,♦K,♥K,♦Q,♥Q,♦J,♥J,♦A,♥A,♠K&lt;br /&gt;
player A: ♣K,♣Q,♣J,♣A,♦K&lt;br /&gt;
player B: ♠Q,♠J,♠A,Jk,♥K&lt;br /&gt;
remaining cards: ♦Q,♥Q,♦J,♥J,♦A,♥A,♠K&lt;br /&gt;
&lt;br /&gt;
shuffle: 2&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♥Q,♠J,♦J,♣J,♥J,♠A,♦A,♣A,♥A,Jk,♠K,♦K,♣K,♥K,♠Q,♦Q,♣Q&lt;br /&gt;
player A: ♥Q,♦J,♥J,♦A,♥A&lt;br /&gt;
player B: ♠J,♣J,♠A,♣A,Jk&lt;br /&gt;
remaining cards: ♠K,♦K,♣K,♥K,♠Q,♦Q,♣Q&lt;br /&gt;
&lt;br /&gt;
shuffle: 3&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♦K,♣J,♣K,♥J,♥K,♠A,♠Q,♦A,♦Q,♣A,♣Q,♥A,♥Q,Jk,♠J,♠K,♦J&lt;br /&gt;
player A: ♦K,♣K,♥K,♠Q,♦Q&lt;br /&gt;
player B: ♣J,♥J,♠A,♦A,♣A&lt;br /&gt;
remaining cards: ♣Q,♥A,♥Q,Jk,♠J,♠K,♦J&lt;br /&gt;
&lt;br /&gt;
shuffle: 4&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♥A,♥J,♥Q,♥K,Jk,♠A,♠J,♠Q,♠K,♦A,♦J,♦Q,♦K,♣A,♣J,♣Q,♣K&lt;br /&gt;
player A: ♥A,♥Q,Jk,♠J,♠K&lt;br /&gt;
player B: ♥J,♥K,♠A,♠Q,♦A&lt;br /&gt;
remaining cards: ♦J,♦Q,♦K,♣A,♣J,♣Q,♣K&lt;br /&gt;
&lt;br /&gt;
shuffle: 5&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♦Q,♥K,♦K,Jk,♣A,♠A,♣J,♠J,♣Q,♠Q,♣K,♠K,♥A,♦A,♥J,♦J,♥Q&lt;br /&gt;
player A: ♦Q,♦K,♣A,♣J,♣Q&lt;br /&gt;
player B: ♥K,Jk,♠A,♠J,♠Q&lt;br /&gt;
remaining cards: ♣K,♠K,♥A,♦A,♥J,♦J,♥Q&lt;br /&gt;
&lt;br /&gt;
shuffle: 6&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♠K,Jk,♥A,♣A,♦A,♠A,♥J,♣J,♦J,♠J,♥Q,♣Q,♦Q,♠Q,♥K,♣K,♦K&lt;br /&gt;
player A: ♠K,♥A,♦A,♥J,♦J&lt;br /&gt;
player B: Jk,♣A,♠A,♣J,♠J&lt;br /&gt;
remaining cards: ♥Q,♣Q,♦Q,♠Q,♥K,♣K,♦K&lt;br /&gt;
&lt;br /&gt;
shuffle: 7&lt;br /&gt;
cut 1: 9&lt;br /&gt;
cut 2: 2&lt;br /&gt;
before deal:♣Q,♣A,♦Q,♦A,♠Q,♠A,♥K,♥J,♣K,♣J,♦K,♦J,♠K,♠J,Jk,♥Q,♥A&lt;br /&gt;
player A: ♣Q,♦Q,♠Q,♥K,♣K&lt;br /&gt;
player B: ♣A,♦A,♠A,♥J,♣J&lt;br /&gt;
remaining cards: ♦K,♦J,♠K,♠J,Jk,♥Q,♥A&lt;/blockquote&gt;注目すべきはリフルシャッフルを2回、または6回行った場合のディーラーに残されたカードだ。&lt;br /&gt;
結果、&lt;b&gt;何度シャッフルをしたとしてもこのゲームのようなカードの並びにはならない。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;それではどうのようなパターンなら再現されるのだろうか?&lt;/b&gt;&lt;br /&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;/ul&gt;全ての組み合わせを再現し、6th Gameで菊池が最初に手にした5枚のカードと同じカードが配られるパターンがあるかを調べてみる。&lt;br /&gt;
&lt;br /&gt;
テスト用の関数が以下の通り&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function samePattern(cards){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var dealtCards;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function same(cardsA, cardsB){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var flg;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var k = 0; k &amp;lt; cardsA.length; k++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flg = false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var j = 0; j &amp;lt; cardsB.length; j++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flg = cardsA[k] === cardsB[j];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (flg) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//console.log(&quot;j:&quot; + j);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!flg) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//console.log(&quot;not found:&quot; + cardsA[k]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return flg;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Shuffle count
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; 8; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//cut 1 Number
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var n = 0; n &amp;lt; 17; n++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//cut 2 Number
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (var m = 0; m &amp;lt; 17; m++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.newGame();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.riffleShuffle(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.cut(n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dealer.cut(m);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dealtCards = Dealer.firstDeal();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (same(dealtCards[0], cards)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return [n, m, i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (same(dealtCards[1], cards)) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return [n, m, i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;
}
&lt;/pre&gt;&lt;br /&gt;
そしてこのsamePattern関数を以下のように使用する。&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var kikuchi = [&quot;♠K&quot;,&quot;♦K&quot;,&quot;♦J&quot;,&quot;♠J&quot;,&quot;♣A&quot;];
console.log(samePattern(kikuchi));//false
&lt;/pre&gt;結果はfalse。&lt;br /&gt;
つまり、&lt;b&gt;どのようなパターンであったとしても、菊池の最初の手札の組み合わせは生まれないのだ&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;7th Game&lt;/h4&gt;このゲームでは秋山の要求により、さらに3回多くリフルシャッフルが行われている。&lt;br /&gt;
秋山:「...念のためあと2回、いや3回シャッフルしてくれ。」&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;カットのコール&lt;/b&gt;&lt;br /&gt;
秋山:8&lt;br /&gt;
菊池:7&lt;br /&gt;
&lt;br /&gt;
秋山の最初の手札:♥J, ♦A, ♥A, ♠K, ♣K&lt;br /&gt;
菊池の最初の手札:♠A, ♣A, Jk, ♦K, ♥K&lt;br /&gt;
&lt;br /&gt;
5枚交換後の秋山の手札:♠J, ♣Q, ♠Q, ♦Q, ♥Q&lt;br /&gt;
菊池は交換なし&lt;br /&gt;
&lt;br /&gt;
最初の手札を配り終わった後のディーラーの下に残されているカードの上から5枚に秋山が5枚交換で手にしたカードがある組み合わせはあるか？&lt;br /&gt;
&lt;br /&gt;
6th Gameと同じようにパターンを出してみる。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;nowrap&quot;&gt;shuffle: 0&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♠J,♠A,Jk,♥K,♥Q,♥J,♥A,♣K,♣Q,♣J,♣A,♦K,♦Q,♦J,♦A,♠K,♠Q&lt;br /&gt;
player A: ♠J,Jk,♥Q,♥A,♣Q&lt;br /&gt;
player B: ♠A,♥K,♥J,♣K,♣J&lt;br /&gt;
remaining cards: ♣A,♦K,♦Q,♦J,♦A,♠K,♠Q&lt;br /&gt;
&lt;br /&gt;
shuffle: 1&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♣J,♠A,♣A,Jk,♦K,♥K,♦Q,♥Q,♦J,♥J,♦A,♥A,♠K,♣K,♠Q,♣Q,♠J&lt;br /&gt;
player A: ♣J,♣A,♦K,♦Q,♦J&lt;br /&gt;
player B: ♠A,Jk,♥K,♥Q,♥J&lt;br /&gt;
remaining cards: ♦A,♥A,♠K,♣K,♠Q,♣Q,♠J&lt;br /&gt;
&lt;br /&gt;
shuffle: 2&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♥J,♠A,♦A,♣A,♥A,Jk,♠K,♦K,♣K,♥K,♠Q,♦Q,♣Q,♥Q,♠J,♦J,♣J&lt;br /&gt;
player A: ♥J,♦A,♥A,♠K,♣K&lt;br /&gt;
player B: ♠A,♣A,Jk,♦K,♥K&lt;br /&gt;
remaining cards: ♠Q,♦Q,♣Q,♥Q,♠J,♦J,♣J&lt;br /&gt;
&lt;br /&gt;
shuffle: 3&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♥K,♠A,♠Q,♦A,♦Q,♣A,♣Q,♥A,♥Q,Jk,♠J,♠K,♦J,♦K,♣J,♣K,♥J&lt;br /&gt;
player A: ♥K,♠Q,♦Q,♣Q,♥Q&lt;br /&gt;
player B: ♠A,♦A,♣A,♥A,Jk&lt;br /&gt;
remaining cards: ♠J,♠K,♦J,♦K,♣J,♣K,♥J&lt;br /&gt;
&lt;br /&gt;
shuffle: 4&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:Jk,♠A,♠J,♠Q,♠K,♦A,♦J,♦Q,♦K,♣A,♣J,♣Q,♣K,♥A,♥J,♥Q,♥K&lt;br /&gt;
player A: Jk,♠J,♠K,♦J,♦K&lt;br /&gt;
player B: ♠A,♠Q,♦A,♦Q,♣A&lt;br /&gt;
remaining cards: ♣J,♣Q,♣K,♥A,♥J,♥Q,♥K&lt;br /&gt;
&lt;br /&gt;
shuffle: 5&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♣A,♠A,♣J,♠J,♣Q,♠Q,♣K,♠K,♥A,♦A,♥J,♦J,♥Q,♦Q,♥K,♦K,Jk&lt;br /&gt;
player A: ♣A,♣J,♣Q,♣K,♥A&lt;br /&gt;
player B: ♠A,♠J,♠Q,♠K,♦A&lt;br /&gt;
remaining cards: ♥J,♦J,♥Q,♦Q,♥K,♦K,Jk&lt;br /&gt;
&lt;br /&gt;
shuffle: 6&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♦A,♠A,♥J,♣J,♦J,♠J,♥Q,♣Q,♦Q,♠Q,♥K,♣K,♦K,♠K,Jk,♥A,♣A&lt;br /&gt;
player A: ♦A,♥J,♦J,♥Q,♦Q&lt;br /&gt;
player B: ♠A,♣J,♠J,♣Q,♠Q&lt;br /&gt;
remaining cards: ♥K,♣K,♦K,♠K,Jk,♥A,♣A&lt;br /&gt;
&lt;br /&gt;
shuffle: 7&lt;br /&gt;
cut 1: 8&lt;br /&gt;
cut 2: 7&lt;br /&gt;
before deal:♠Q,♠A,♥K,♥J,♣K,♣J,♦K,♦J,♠K,♠J,Jk,♥Q,♥A,♣Q,♣A,♦Q,♦A&lt;br /&gt;
player A: ♠Q,♥K,♣K,♦K,♠K&lt;br /&gt;
player B: ♠A,♥J,♣J,♦J,♠J&lt;br /&gt;
remaining cards: Jk,♥Q,♥A,♣Q,♣A,♦Q,♦A&lt;/blockquote&gt;&lt;br /&gt;
この結果から、2回シャッフルしたときにドラマと同じ組み合わせが再現できることが分かった。&lt;br /&gt;
&lt;br /&gt;
しかし、秋山はシャッフルの回数を通常の回数に加えて&lt;b&gt;更に3回行わせている&lt;/b&gt;。&lt;br /&gt;
ということは、シャッフルの回数は2回であるはずがないので、そうすると次にこの組み合わせが現れるのは10回目となる。&lt;br /&gt;
7th Gameはこのゲームの設定として、&lt;b&gt;最初にリフルシャッフルを7回行うことを前提に成り立つ&lt;/b&gt;ことになる。&lt;br /&gt;
計10回もリフルシャッフルを行わせるというは少々疑問に感じるのだが、仮に10回行ったと仮定すると、それ以前のゲームまでは10 - 3で7回行っていたことになる。&lt;br /&gt;
そうすると、6th Gameの結果に益々無理が生じてくることになる。&lt;br /&gt;
&lt;br /&gt;
つまり、7th Gameの結果から6th Gameは7回リフルシャッフルを行っていることになり、上で示したように、そのパターンで秋山が5枚交換で&lt;code&gt;Joker + Q × 3&lt;/code&gt;の4カードを引き当てることは&lt;b&gt;不可能&lt;/b&gt;なのだ。</description><link>http://yas-hummingbird.blogspot.com/2009/12/17poker.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-1892775520592567153</guid><pubDate>Thu, 26 Nov 2009 22:45:00 +0000</pubDate><atom:updated>2009-12-01T10:12:31.463+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>ビットシフトの規則性を知りたくなった</title><description>ビットシフトの規則性を知りたかったのでC#でちょっと調べてみた。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;右シフト&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;int x = 144;
string binString = Convert.ToString(x, 2);
int ln = binString.Length;

Console.WriteLine(
    &quot;target value:{0}\n&quot; +
    &quot;binary string:{1}\n&quot; +
    &quot;binary string length:{2}\n&quot;,
    x , binString, ln);

for (int i = 1; i &amp;lt;= ln; i++)
{
    int ret = x &amp;gt;&amp;gt; i;
    Console.WriteLine(
        &quot;{0} &amp;gt;&amp;gt; {1} =&amp;gt; {2}\t= {0} / {3}&quot;,
        x, i, ret, ret &amp;gt; 0 ? x / ret : 0);
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Result:&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;target value:              144
binary string:        10010000
binary string length:        8

144 &amp;gt;&amp;gt; 1 =&amp;gt; 72  = 144 /   2
144 &amp;gt;&amp;gt; 2 =&amp;gt; 36  = 144 /   4
144 &amp;gt;&amp;gt; 3 =&amp;gt; 18  = 144 /   8
144 &amp;gt;&amp;gt; 4 =&amp;gt;  9  = 144 /  16
144 &amp;gt;&amp;gt; 5 =&amp;gt;  4  = 144 /  36
144 &amp;gt;&amp;gt; 6 =&amp;gt;  2  = 144 /  72
144 &amp;gt;&amp;gt; 7 =&amp;gt;  1  = 144 / 144
144 &amp;gt;&amp;gt; 8 =&amp;gt;  0  = 144 /   0
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;左シフト&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;int n = 2;
for (int i = 1; i &amp;lt; 12; i++)
{
    int ret = x &amp;lt;&amp;lt; i;
    Console.WriteLine(
        &quot;{0} &amp;lt;&amp;lt; {1} =&amp;gt; {2}\t= {0} * {3}&quot;,
        x, i, ret, n);
    n = n * 2;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Result:&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;144 &amp;lt;&amp;lt;  1 =&amp;gt;    288     = 144 *    2
144 &amp;lt;&amp;lt;  2 =&amp;gt;    576     = 144 *    4
144 &amp;lt;&amp;lt;  3 =&amp;gt;   1152     = 144 *    8
144 &amp;lt;&amp;lt;  4 =&amp;gt;   2304     = 144 *   16
144 &amp;lt;&amp;lt;  5 =&amp;gt;   4608     = 144 *   32
144 &amp;lt;&amp;lt;  6 =&amp;gt;   9216     = 144 *   64
144 &amp;lt;&amp;lt;  7 =&amp;gt;  18432     = 144 *  128
144 &amp;lt;&amp;lt;  8 =&amp;gt;  36864     = 144 *  256
144 &amp;lt;&amp;lt;  9 =&amp;gt;  73728     = 144 *  512
144 &amp;lt;&amp;lt; 10 =&amp;gt; 147456     = 144 * 1024
144 &amp;lt;&amp;lt; 11 =&amp;gt; 294912     = 144 * 2048
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2乗&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;int m = 2;
for (int i = 1; i &amp;lt; 12; i++)
{
    int ret = m &amp;lt;&amp;lt; i;
    Console.WriteLine(
        &quot;{0} &amp;lt;&amp;lt; {1} =&amp;gt; {2}\t= {0} * {0}\t{3}&quot;,
        m, i, ret, Convert.ToString(m, 2).PadLeft(12, &#39;0&#39;));
    m = m * 2;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Result:&lt;/b&gt;&lt;br /&gt;
&lt;pre style=&quot;font-family: monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2 &amp;lt;&amp;lt;  1 =&amp;gt;       4   =    2 *    2   000000000010
&amp;nbsp;&amp;nbsp;&amp;nbsp;4 &amp;lt;&amp;lt;  2 =&amp;gt;      16   =    4 *    4   000000000100
&amp;nbsp;&amp;nbsp;&amp;nbsp;8 &amp;lt;&amp;lt;  3 =&amp;gt;      64   =    8 *    8   000000001000
&amp;nbsp;&amp;nbsp;16 &amp;lt;&amp;lt;  4 =&amp;gt;     256   =   16 *   16   000000010000
&amp;nbsp;&amp;nbsp;32 &amp;lt;&amp;lt;  5 =&amp;gt;    1024   =   32 *   32   000000100000
&amp;nbsp;&amp;nbsp;64 &amp;lt;&amp;lt;  6 =&amp;gt;    4096   =   64 *   64   000001000000
&amp;nbsp;128 &amp;lt;&amp;lt;  7 =&amp;gt;   16384   =  128 *  128   000010000000
&amp;nbsp;256 &amp;lt;&amp;lt;  8 =&amp;gt;   65536   =  256 *  256   000100000000
&amp;nbsp;512 &amp;lt;&amp;lt;  9 =&amp;gt;  262144   =  512 *  512   001000000000
1024 &amp;lt;&amp;lt; 10 =&amp;gt; 1048576   = 1024 * 1024   010000000000
2048 &amp;lt;&amp;lt; 11 =&amp;gt; 4194304   = 2048 * 2048   100000000000
&lt;/pre&gt;&lt;br /&gt;
多少の規則性は見つけることができたかな?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
脱線して関係ないことまで知ることになったのはいつものこと。&lt;br /&gt;
以下、関係なし。&lt;br /&gt;
&lt;br /&gt;
ネイピア数:&lt;a href=&quot;http://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E5%AF%BE%E6%95%B0&quot; title=&quot;自然対数 - Wikipedia&quot;&gt;自然対数&lt;/a&gt;の底の値 (オイラー定数)&lt;br /&gt;
&lt;blockquote&gt;Math.E&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
結果は同じ&lt;br /&gt;
&lt;blockquote&gt;Math.Pow(Math.E, 2)&lt;br /&gt;
Math.Exp(2)&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
144 ... フィボナッチ数列の中の&lt;b&gt;唯一の平方数&lt;/b&gt;(12番目)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sqrt, Pow, Log&lt;/b&gt;&lt;br /&gt;
144 = x&lt;span style=&quot;font-size: 80%; vertical-align: super;&quot;&gt;2&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;Math.Sqrt(144) //12
&lt;/pre&gt;&lt;br /&gt;
x = 12&lt;span style=&quot;font-size: 80%; vertical-align: super;&quot;&gt;2&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;Math.Pow(12, 2) //144
&lt;/pre&gt;&lt;br /&gt;
144 = 12&lt;span style=&quot;font-size: 80%; vertical-align: super;&quot;&gt;x&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;Math.Log(144, 12) //2
&lt;/pre&gt;この三つの関数の関係を表したかっただけ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
同じことをしている。&lt;br /&gt;
&lt;blockquote&gt;Math.Log10(144)&lt;br /&gt;
Math.Log(144, 10)&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
これも同じことをしている。&lt;br /&gt;
&lt;blockquote&gt;Math.Log(144)&lt;br /&gt;
Math.Log(144, Math.E)&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
指数をもとめるのに使用するMath.Logは便利だなぁ(^o^)、とか言いながらも実際はあまり使わない。(^_^;)</description><link>http://yas-hummingbird.blogspot.com/2009/11/blog-post_27.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-797193402687440830</guid><pubDate>Wed, 25 Nov 2009 22:40:00 +0000</pubDate><atom:updated>2009-12-01T05:37:19.436+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Keyword = 遅延 Lazy...?</title><description>頭の中でどうも気になる「遅延」という言葉。&lt;br /&gt;
それが遅延処理とか遅延評価だとか、その辺のニュアンスはどうでもイイ。&lt;br /&gt;
頭の中で引っ掛かってしまったこのキーワードを調べずにはいられない衝動が...。&lt;br /&gt;
このブログのサブタイトルどおりの行動ということで。(^。^)y-.。o○&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;h4&gt;DOMContentLoaded&lt;/h4&gt;まず引っ掛かったのが「DOMContentLoaded」。&lt;br /&gt;
ページを構成するHTMLの解析が終わった段階で発生するのでloadイベントよりも先に実行される。&lt;br /&gt;
&lt;br /&gt;
これはjQueryで実装されていて、ソースを見るとクロスブラウザに対応するのに結構手間の掛る処理を必要としていることが分かる。&lt;br /&gt;
&lt;br /&gt;
jQueryを使用して書いたモノ、&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;$(function(){
&amp;nbsp;&amp;nbsp;//something...
});
&lt;/pre&gt;この中に書いたモノはloadイベントより早く実行されるのは知っていたが、どのように実装されているかまでは知らなかったのでソースを見るだけでもタメになった。&lt;br /&gt;
&lt;br /&gt;
気になる人はbindReady Functionを見るとイイ。&lt;br /&gt;
例えば「DOMContentLoaded」の代わりに「onreadystatechange」を使ったり、またそれ以外の場合の対応など、その辺のことをちゃんと理解してないと出来ないなぁ...と。&lt;br /&gt;
&lt;br /&gt;
自分で書くぐらいならjQueryを利用した方がイイ、というjQueryを使う理由が一つできた感じ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Lazy Function&lt;/h4&gt;正直あまり遅延評価なるものを意識したことがなかったので、これを見て「オモシロイ」と思ってしまった。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://peter.michaux.ca/articles/lazy-function-definition-pattern&quot; title=&quot;Lazy Function Definition Pattern&quot;&gt;Lazy Function Definition Pattern&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;特におもしろいと感じたのは#4。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;引用:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;var foo = function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var t = new Date();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo = function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return t;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return foo();
};
&lt;/pre&gt;&lt;br /&gt;
初回呼び出し時に自身を書き換えている。&lt;br /&gt;
&lt;br /&gt;
つまり、fooは&lt;br /&gt;
&lt;b&gt;初回呼び出し時&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var t = new Date();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo = function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return t;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return foo();
};
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;初回呼び出し以降&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return t;
};
&lt;/pre&gt;という形になる。&lt;br /&gt;
&lt;br /&gt;
Wikipediaの言葉を借りて言うならば、「計算量の最適化」という発想がただ私自身になかっただけ、と言われればそれまでだが、確かにこのようなことを意識して書くのも大切なことだろうし、私的にはかなりツボに入っておもしろいと感じてしまった。</description><link>http://yas-hummingbird.blogspot.com/2009/11/keyword-lazy.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8596808384528009854.post-7589271364511038340</guid><pubDate>Thu, 19 Nov 2009 22:30:00 +0000</pubDate><atom:updated>2009-11-21T01:51:16.958+09:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>なぜ文字列リテラルのメソッドを呼び出すと遅いのか?</title><description>&lt;a href=&quot;http://yas-hummingbird.blogspot.com/2009/07/javascript.html&quot;&gt;Javascript 型判定の方法とその処理速度について:humming bird&lt;/a&gt;での投稿の時点ではまだ分からなかったこと。&lt;br /&gt;
&lt;br /&gt;
端的に言えば『[].constructor』より『&quot;foo&quot;.constructor』の方が処理に時間が掛る。&lt;br /&gt;
文字列リテラルだけではなく、真偽値リテラル、数値リテラルも同様に他(例えば Array)と比べて処理に時間が掛る。&lt;br /&gt;
&lt;br /&gt;
その理由が以下。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;b&gt;引用:&lt;/b&gt;&lt;br /&gt;
文字列リテラルの値でなら、String オブジェクトのどんなメソッドでも呼び出すことができます。JavaScript が自動的に文字列リテラルを一時的な String オブジェクトに変換し、メソッドを呼び出し、その一時的な String オブジェクトを破棄するのです。...&lt;br /&gt;
&lt;a href=&quot;https://developer.mozilla.org/Ja/Core_JavaScript_1.5_Guide/Literals&quot; title=&quot;Literals - MDC&quot;&gt;Literals - MDC&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
これは文字列リテラルの説明ですが、真偽値リテラルと数値リテラルも同様の理由と考えるのが妥当と思われる。&lt;br /&gt;
&lt;br /&gt;
「instanceof」を使うと違いが分かる。&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&quot;foo&quot; instanceof String // false
&lt;/pre&gt;&lt;br /&gt;
表にすると以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&lt;table cellSpacing=&quot;0&quot; style=&quot;table-layout: fixed; text-align: center;&quot;&gt;&lt;caption&gt;Value &lt;b&gt;instanceof&lt;/b&gt; ObjectType&lt;/caption&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Value&lt;br /&gt;
&lt;/th&gt;&lt;th&gt;Result&lt;br /&gt;
&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;String&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;&quot;foo&quot;&lt;br /&gt;
&lt;/td&gt;&lt;td style=&quot;background-color: #ccaaaa;&quot;&gt;false&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new String(&quot;foo&quot;)&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;Number&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;0&lt;br /&gt;
&lt;/td&gt;&lt;td style=&quot;background-color: #ccaaaa;&quot;&gt;false&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new Number(0)&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;Boolean&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;td style=&quot;background-color: #ccaaaa;&quot;&gt;false&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new Boolean(true)&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;Array&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;[]&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new Array([])&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;RegExp&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;/(?:)/&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new RegExp()&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th rowspan=&quot;2&quot;&gt;Object&lt;br /&gt;
&lt;/th&gt;&lt;td&gt;{}&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;new Object()&lt;br /&gt;
&lt;/td&gt;&lt;td&gt;true&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
つまり、「&lt;b&gt;文字列リテラル&quot;foo&quot;はインスタンスはStringのインスタンスではない。しかし、コンストラクタはStringですよ&lt;/b&gt;」という、ちょっと首を傾げる結果を返すということだ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
理由が分かってスッキリした。＼(^o^)／&lt;br /&gt;
&lt;br /&gt;
でも、頻繁にメソッドを使用するならString オブジェクトを利用した方がイイってことにならないか?&lt;br /&gt;
&lt;br /&gt;
Firefoxで処理に掛る時間を計測すると&lt;b&gt;その差は約3倍&lt;/b&gt;。&lt;br /&gt;
construtorメソッドしか調べてないが、いちいち new String() とかするなんてハッキリ言って...&lt;br /&gt;
&lt;br /&gt;
そんなの&lt;b&gt;メンドクサイ&lt;/b&gt;(-_-;)</description><link>http://yas-hummingbird.blogspot.com/2009/11/blog-post.html</link><author>noreply@blogger.com (y@s)</author><thr:total>0</thr:total></item></channel></rss>