<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/sklab/">
    <title>sklab @ ウィキ</title>
    <link>http://w.atwiki.jp/sklab/</link>
    <atom:link href="https://w.atwiki.jp/sklab/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>sklab @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2015-08-23T21:40:28+09:00</dc:date>
    <utime>1440333628</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/54.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/53.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/50.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/52.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/47.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/51.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/49.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/48.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/sklab/pages/46.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/54.html">
    <title>キャッシュ</title>
    <link>https://w.atwiki.jp/sklab/pages/54.html</link>
    <description>
      #contents  

** Generic Type Caching
generic &amp; static なクラスをキャッシュとして使うことである。~
型引数が key、static メンバが value に相当する。~
静的コンストラクタは、クラスの呼び出し時に1回だけ実行され、スレッドセーフである。~
そして、型引数はコンパイル時に解決されるため、Dictionary などの動的な key ルックアップと比べて、圧倒的に早い。
new { 変数名 }.GetType().GetProperties()[0].Nameで変数名を文字列で取得できる。

  private static class GenericCache&lt;T&gt;
    {
        public static string GetName&lt;T&gt;(this T source) where T : class
        {
            return GenericCache&lt;T&gt;.Name;
        }

        static GenericCache()
        {
            var properties = typeof(T).GetProperties();
            Name = properties[0].Name;
        }

        public static readonly string Name;
        
    }
**MyCacheを作ってみる。
-Dictionaryでkeyにオブジェクトなんかを入れている場合、そのkeyがGC対象になったときにvalueもGC対象にする
-変数（フィールドやらローカル変数やら）に格納されている参照のことを「強い参照」と言う。~
「アクセス可能なオブジェクト」とは、強い参照が存在するオブジェクトのことを言う。~
ただし、その強い参照を所持しているオブジェクトもアクセス可能なオブジェクトである必要がある。~
つまり、強い参照を所持しているオブジェクトを辿って行くとアクセス不可能なオブジェクトに辿り着く場合、~
それらは全てアクセス不可能なオブジェクトである。~
また、実際にアクセスされている最中（コンストラクタ実行中だったりメソッド実行中だったり）のオブジェクトも、~アクセス可能なオブジェクトである。~~

-「オブジェクトを使いたいんだけども、GC 的には参照していることにしないでほしい」、~
「自分以外が全員参照を手放したらその時点で削除対象にしてほしい」というような要件がまれにあります。~
 こういう、GC の参照探索上は除外してほしい参照を、弱参照(weak reference)といいます。


  public class MyCache&lt;K,T&gt;
    {
        private Dictionary&lt;K, WeakReference&gt; cache = new Dictionary&lt;K, WeakReference&gt;();
        private object locker = new object();

        public T GetItem(K key)
        {
            lock (locker)
            {
                WeakReference v;
                if (!cache.TryGetValue(key, out v)) return default(T);

                T val = (T)v.Target;
                if (val != null) return val;

                cache.Remove(key);
                return default(T);
            }
        }

        public void Add(K key, T val)
        {
            lock (locker)
            {
                cache[key] = new WeakReference(val);
            }
        }
    }    </description>
    <dc:date>2015-08-23T21:40:28+09:00</dc:date>
    <utime>1440333628</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/53.html">
    <title>スレッド</title>
    <link>https://w.atwiki.jp/sklab/pages/53.html</link>
    <description>
      #contents


**専用スレッドを使用して非同期の計算量依存の処理を実行する

-下記に当てはまる場合は専用スレッドを使用したほうがよい
--通常とは異なる優先度で動作するスレッドが必要な場合
--スレッドをフォアグラウンドスレッドとして動作させ、そのスレッドのタスクが完了するまでアプリケーションが終了しない
--計算量依存のタスクに非常に長い時間がかかる
--スレッドを開始した後で、完了する前にThreadのAbortメソッドを呼び出してスレッドを中止する場合

***専用スレッド作成
Thread dedicatedThread = new Thread(MethodName);~
dedicatedThread.Start(5);

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述

**memo

-最適なスレッド数はCPUの数と同じ。コンテキストスイッチが発生しないため    </description>
    <dc:date>2015-08-20T21:22:10+09:00</dc:date>
    <utime>1440073330</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/sklab/pages/1.html</link>
    <description>
      **デリバティブ
-[[デリバティブとは]]
-[[プライシング]]
-[[モンテカルロシミュレーション]]
-[[VAR]]
-[[先物取引]]
-[[オプション価格計算]]
-[[デルタを活用する]]
-[[実践デリバティブ講座]]
-[[リスク管理]]
-[[フィナンシャルエンジニアリング]]

**予備知識
-[[正規分布]]

**.NET
-[[.NET 第4版]]
-[[勉強 Visual C#]]
-[[Effective  C#]]

** C#
-[[プログラムを書くときに]]
-[[アセンブリとビルド]]
-[[豆知識]]
-[[using文]]
-[[配列]]
-[[イテレータ]]
-[[デリゲート]]
-[[LINQ]]
-[[匿名オブジェクト]]
-[[構造体]]
-[[IEnumerableとIEnumerator]]
-[[XML]]
-[[プリプロセッサ]]
-[[実行時の型識別]]
-[[属性]]
-[[式木]]
-[[便利]]
-[[高速化]]
-[[yield return]]
-[[オライリー]]
-[[ショートコードプログラミング]]
-[[.NETアプリケーション最適化技法]]
-[[マネージヒープとガベージコレクション]]
-[[アプリケーションドメインとCLRのホスティング]]
-[[アセンブリのロードとリフレクション]]
-[[スレッド]]
-[[キャッシュ]]

**IT全般
-[[オブジェクト指向のこころ]]
-[[MEMO]]

**Wiki操作
-[[@wikiの基本操作&gt;&gt;http://www1.atwiki.jp/guide/pages/11.html]]
-[[編集モード・構文一覧表&gt;&gt;http://www1.atwiki.jp/guide/pages/137.html]]
-[[@wikiの設定・管理&gt;&gt;http://www1.atwiki.jp/guide/pages/36.html]]

**ヘルプ
-[[@wiki ご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]
-[[よくある質問&gt;&gt;http://www1.atwiki.jp/guide/pages/21.html]]
-[[@wiki更新情報&gt;&gt;http://www1.atwiki.jp/guide/pages/143.html]]
-[[@wikiへのお問合せフォーム&gt;&gt;http://atwiki.jp/helpdesk]]
等をご活用ください

**[[アットウィキモードでの編集方法&gt;&gt;http://www1.atwiki.jp/guide/pages/226.html#id_6861418f]]
-[[文字入力&gt;&gt;http://www1.atwiki.jp/guide/pages/228.html]]
-[[画像入力&gt;&gt;http://www1.atwiki.jp/guide/pages/230.html]]
-[[表組み&gt;&gt;http://www1.atwiki.jp/guide/pages/914.html]]

**[[ワープロモードでの編集方法&gt;&gt;http://www1.atwiki.jp/guide/pages/226.html#id_a14c0938]]
-[[文字入力&gt;&gt;http://www1.atwiki.jp/guide/pages/2644.html]]
-[[画像入力&gt;&gt;http://www1.atwiki.jp/guide/pages/2645.html]]
-[[表組み&gt;&gt;http://www1.atwiki.jp/guide/pages/2646.html]]

**その他にもいろいろな機能満載！！
-[[@wikiプラグイン一覧&gt;&gt;http://www1.atwiki.jp/guide/pages/264.html]]
-[[@wikiかんたんプラグイン入力サポート&gt;&gt;http://www1.atwiki.jp/guide/pages/648.html]]
-[[まとめサイト作成支援ツール&gt;&gt;http://atwiki.jp/matome/]]

**バグ・不具合を見つけたら？ 要望がある場合は？
お手数ですが、[[お問合せフォーム&gt;&gt;http://atwiki.jp/helpdesk]]からご連絡ください。    </description>
    <dc:date>2015-08-20T21:21:08+09:00</dc:date>
    <utime>1440073268</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/50.html">
    <title>スレッドの基礎</title>
    <link>https://w.atwiki.jp/sklab/pages/50.html</link>
    <description>
      #contents

**専用スレッドを使用して非同期の計算量依存の処理を実行する

-下記に当てはまる場合は専用スレッドを使用したほうがよい
--通常とは異なる優先度で動作するスレッドが必要な場合
--スレッドをフォアグラウンドスレッドとして動作させ、そのスレッドのタスクが完了するまでアプリケーションが終了しない
--計算量依存のタスクに非常に長い時間がかかる
--スレッドを開始した後で、完了する前にThreadのAbortメソッドを呼び出してスレッドを中止する場合

***専用スレッド作成
Thread dedicatedThread = new Thread(MethodName);~
dedicatedThread.Start(5);

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述

**memo

-最適なスレッド数はCPUの数と同じ。コンテキストスイッチが発生しないため    </description>
    <dc:date>2015-08-20T21:20:25+09:00</dc:date>
    <utime>1440073225</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/52.html">
    <title>Effective  C</title>
    <link>https://w.atwiki.jp/sklab/pages/52.html</link>
    <description>
      #contents

**#1.publicなデータメンバではなく、プロパティを使う
-publicならばプロパティを使う
-全てのデータメンバは例外なくprivateにするべき
-インデクサを使用することでdictionary機能を付加することもできる

**#2.constよりもreadonlyを使う
-パフォーマンスはconstが優位
-constはリビルドしないと値が更新されない

**#3.キャスト時にはisあるいはas演算子を使う
-as演算子は型変換を行うが、is演算子は型変換が可能かを返すのみ
-as演算子とキャストではas演算子の方が高速に動作する
-as演算子は参照型のみに有効(値型はnullを取れない)

**#4.#ifの代わりにConditional属性を使用する
-実行の有無が切り替えられる。
-例：[Conditional(&quot;DEBUG&quot;)]
-voidのみ適用可能
-#if/#endifよりも最適なコードが記述される

**#5.ToString()を常に実装する
-独自にクラスを定義する場合、そのクラスを利用する全てのコードに意味のあるToString()を実装するべき
-複雑な情報を持つ型を作成する場合にはIFormattable.ToString()    </description>
    <dc:date>2015-08-19T22:14:54+09:00</dc:date>
    <utime>1439990094</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/47.html">
    <title>ショートコードプログラミング</title>
    <link>https://w.atwiki.jp/sklab/pages/47.html</link>
    <description>
      #contents

*TryParseを使用する
string src = &quot;123&quot;; ~
int result; ~
Console.WriteLine(int.TryParse(src,out result) ? result : -1); ~
処理の重い例外を避けることができる。定石は if(int.Tryparse(xxx, out yyy)){処理}

*null合体演算子
string a = &quot;We are the Hello World!!&quot;; ~
Console.WriteLine(a ?? &quot;(null)&quot;); ~
nullポインタ参照を劇的に減らす事ができる。~
WindowsフォームアプリケーションのNullチェックにも適用可能。~
string str = (string)listBox1.SelectedItem ?? &quot;not selected&quot;;

*引数にラムダ式
大事

*名前を指定したメソッド呼出
dynamicが一番

*列挙可能なオブジェクトを作ってみる
class Sample : IEnumerable&lt;int&gt;{ ~
&amp;nbsp; public IEnumerator&lt;int&gt; GetEnumerator(){ ~
&amp;nbsp; &amp;nbsp; for(int i=0,i&lt;10; i++) yield return i;~
&amp;nbsp;}

IEnumerator IEnumerator.GetEnumerator(){~
&amp;nbsp; return GetEnumerator(); ~
}~
yield returnが本当に便利。foreachが使える。

*連番の生成
Enumerable.Range(1,10)

*配列まとめ
var found = a.FindAll((c)=&gt;c&gt;0); // 0よりも大きい数値を返す ~ 
foreach(var n in a.Where((c)=&gt; c &gt; 0) //ループなしで塊をさばく1 ~
a.Where((c)=&gt;c&gt;0).Count() //ループなしで塊をさばく2 ~ 
foreach(var n in a.SkipWhile(c,i)=&gt;i &lt;= 0)) // 先頭行を飛ばす。CSVとかで便利~

*Mainメソッド以外からコマンドラインを参照したい
Environment.GetCommandLineArgs()で解決

*IsNullOrWhiteSpace,IsNullOrEmptyの活用
便利

*文字列の分割
string[] ar = s.Split(new[] {&#039;,&#039;,&#039; &#039;}); ~
Array.ForEach(ar,(c)=&gt; Console.WriteLine(&quot;[&quot; + c + &quot;]&quot;)); ~

*テキストファイル全体の読み込み
File.ReadAllText(args[0]); File.WriteAllText(args[0],testdata)もある~
File.ReadLines(args[0]).Where(c =&gt; c.Containss(&quot;xxx&quot;)).Count()など

*タスクの並列実行
System.Threading.Tasks &gt; System.Threading
Parallel.Invokeもある

*配列の計算を2つのコアに分散させる
Parallel.Forを使うべき。システムがコア数から分散数を決めてくれるため、常に最適な分割数となる。~
string[] a = {&quot;1&quot;,&quot;2&quot;,..}; ~
int[] b = new int[a.length]; ~
Parallel.For(0,a.Length,(n) =&gt; { b[n] = int.Parse(a[n]) });~
~
Parallel.ForEachも便利。~

*Windowsフォームアプリケーションの処理
task = new Task(){ () =&gt;  ^
{ this.Invoke((Action)(()=&gt;{ x.Text = &quot;test&quot;})) } ~
タスクをDictionaryに登録して実行するのも割とありな気がする。~    </description>
    <dc:date>2015-08-18T21:47:16+09:00</dc:date>
    <utime>1439902036</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/51.html">
    <title>スレッド処理</title>
    <link>https://w.atwiki.jp/sklab/pages/51.html</link>
    <description>
      #contents

**CLRスレッドプール
-CLRごとに１つのスレッドプールがある
-スレッドプールはすべてのアプリケーションドメイン間で共有
-単一のプロセス内に複数のCLRがロードされている場合は複数のスレッドプールがある
-アイドル状態が続くと、スレッドは自動で起動し、処理を実行し終了する
--リソースの問題が出そうだが、アプリケーションがそれほど多くの処理を実行していないことを意味しているため問題ない

**単純な計算量依存の処理を実行する
スレッドプールのキューにタスクを投入するには、ThreadPoolクラスが利用される

-QueueUserWorkItemメソッド
--QueueUserWorkItem(WaitCallback callback, Object state)
--callbackに実際の処理を記述    </description>
    <dc:date>2015-08-11T18:52:58+09:00</dc:date>
    <utime>1439286778</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/49.html">
    <title>アプリケーションドメインとCLRのホスティング</title>
    <link>https://w.atwiki.jp/sklab/pages/49.html</link>
    <description>
      -memo
--MSCorEE.dllはどのCLRバージョンを生成するか決める際に際に使用される。
--マーシャリングとは、プロセスのオブジェクトを境界越しに処理できるようにする過程のことです。例えば、Word のオブジェクトを Excel のスプレッドシート上に貼り付ける場合、プロセスの境界を越える必要があります。
--すべてのプロセスは、アプリケーションドメインを持ち、さらに新規のアプリケーションドメインを作成することができます。アプリケーションドメインは、独立して開始、停止させることができます。これを利用して、例えば、別のプログラマが書いたライブラリを実行する場合、２番目のアプリケーションドメインに隔離することで、このライブラリがクラッシュしても、プログラム全体を停止させてしまわないようにすることができます。    </description>
    <dc:date>2015-08-10T11:55:40+09:00</dc:date>
    <utime>1439175340</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/48.html">
    <title>マネージヒープとガベージコレクション</title>
    <link>https://w.atwiki.jp/sklab/pages/48.html</link>
    <description>
      #contents 

*マネージヒープの基本
-CLRではすべてのリソースはマネージヒープから割り当てられる。
-ヒープ内で次にオブジェクトを割り当てる場所を示すポインター(NextObjPtr)を管理する
-CLRはプロセスのアドレス空間が満杯になるまで領域を割り当てる(32bitでは1.5GB)

**マネージヒープからリソースを割り当てる
-型のフィールドに必要なバイト数を計算する。
-オブジェクトのオーバヘッドフィールドに必要なバイト数を計算する(32bitでは8byte,64bitでは16byte)。
-使用可能かどうかをCLRにて検査し、可能であればNextObjPtrにオブジェクトを格納する。ない場合はGCを呼ぶ
--マネージヒープではオブジェクトの割り当てはポインターへの加算のみであり、非常に高速

**GCのアルゴリズム
-オブジェクトの生存期間を管理するために参照カウントを行う(参照カウントALG=循環参照時に問題あり)
-参照追跡型のアルゴリズムを使用する。
-GCを開始すると、CLRはプロセス内のすべてのスレッドを停止する
--ステートが変更されるのを防ぐためである
-マーキングフェーズを開始する
--参照型の変数root(クラスの静的インスタンスフィールド、メソッドの引数などの総称)
--rootがnullであるならばそのルートを無視し、次を検査する
-コンパクションフェーズ
--どのオブジェクトが生き残るか、削除するかを前フェーズで完了している
--すべての生き残りオブジェクトをコンパクションしてメモリ上で連続するようにする =参照の局所性が上がる
--このフェーズではオブジェクトのポインタが変わるため、アプリケーションがオブジェクトを参照できなくなる。
---参照先のオブジェクトがメモリ内で移動したバイト数を各ルートから引き算している
-重要
--静的フィールドは永久にまたは型がロードアプリケーションドメインがアンロードされるまで参照先のオブジェクトを保持する。
--メモリリークが発生する主な原因はコレクションオブジェクトを参照する静的フィールドであり、コレクションオブジェクトに項目を追加したままになっていることである。

-世代別ガーベジコレクション

*memo
-IDisposableインターフェイスを実装する型を定義するときは

**アプリケーションのメモリ使用量を確認
-CollectionCount,GetTotalMemoryメソッドを使用
-ネイティブリソースをラップするオブジェクトはほとんどメモリを占有しない
-あるクラスをラップする場合、内部的にどれほどのメモリが使用されるかわからない。
--AddMemoryPressure,RemoveMemoryPressureを使用することでランタイムが感知しないところでどれほどメモリが使われているかを教えてくれる。    </description>
    <dc:date>2015-08-10T11:17:20+09:00</dc:date>
    <utime>1439173040</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/sklab/pages/46.html">
    <title>.NETアプリケーション最適化技法</title>
    <link>https://w.atwiki.jp/sklab/pages/46.html</link>
    <description>
      #contents

*型の内部
-1000万個の点の配列をメモリに格納することを考える。
--参照型
---1000万個の点の配列に含まれるのは同じ数の参照(約40MB)
---オブジェクト自体の使用量も含むとおよそ160MBにもなる。
---ヒープに格納されるとメモリ内で連続する保証はなく、アプリケーションの実行時間が遅くなる。
--値型
---無駄なく1000万個の点が収容され、合計40MBとなる。メモリ密度が大幅に異なる。

**.NETの参照型
クラス、デリゲート、インターフェイス、配列、string

**ストレージ、割り当て、解放
-参照型は常にマネージヒープ領域に割り当てられる(ポインタ操作)。
-ポインタ操作によりパフォーマンスが著しく低下する。    </description>
    <dc:date>2015-05-07T22:43:25+09:00</dc:date>
    <utime>1431006205</utime>
  </item>
  </rdf:RDF>
