Loading [MathJax]/extensions/tex2jax.js

2012年12月24日月曜日

[書籍]「C#クックブック 」を読んで

C#クックブック を購入したので、読んで気づいた点などについて、書いていこうかなぁと思ってます。随時更新予定。


4章 例外処理
・引数のないcatchブロックは使いべきではない。
・階層が浅い所にいる関数でtry- catch or try - catch - finallyを行う。
・階層が深いところでは、リソースの解放とかが必要な場合に、try - finallyを行う。

2012年12月17日月曜日

c# youtube api 2 (Api呼んでみる)

やりたいこと
Developerkeyを入手して、Apiを呼び出してみるところまでやってみる。


準備
■参考にしたサイト
本家
https://developers.google.com/youtube/2.0/developers_guide_dotnet?hl=ja
デベロッパーキー入手の参考にしたサイト
http://ryushimiz.blogspot.jp/2010/02/youtube-api.html

手順1 Developerkeyの入手
上述のデベロッパーキー入手の参考にしたサイトを参考にしてdeveloperkeyを作成する。


手順2 Apiをコール
本家のページにあるサンプルをコピーして以下のようなコードを作成する。
YouTubeRequestSettingsをnewするところでは、developerkey飲みを引数とした。

※本家のサイトではclientIDなるものも引数としているが、
cleinetIDがなんなのかわからなかったことと、developerkeyの入手画面でももう必要ないみたいなことが書いてあったので無視した。
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. // youtube  
  8. using Google.GData.Client;  
  9. using Google.GData.Extensions;  
  10. using Google.GData.YouTube;  
  11. using Google.GData.Extensions.MediaRss;  
  12. using Google.YouTube;  
  13.   
  14. namespace YoutubeTest001  
  15. {  
  16.     class Program  
  17.     {  
  18.         static void Main(string[] args)  
  19.         {  
  20.             string developerKey = "作成したデベロッパーキー";  
  21.             YouTubeRequestSettings settings = new YouTubeRequestSettings("example app", developerKey);  
  22.             YouTubeRequest request = new YouTubeRequest(settings);  
  23.   
  24.             Uri videoEntryUrl = new Uri("http://gdata.youtube.com/feeds/api/videos/ADos_xW4_J0");  
  25.             Video video = request.Retrieve<video>(videoEntryUrl);  
  26.             printVideoEntry(video);  
  27.   
  28.             Console.ReadKey();  
  29.         }  
  30.   
  31.         static void printVideoEntry(Video video)  
  32.         {  
  33.             Console.WriteLine("Title: " + video.Title);  
  34.             Console.WriteLine(video.Description);  
  35.             Console.WriteLine("Keywords: " + video.Keywords);  
  36.             Console.WriteLine("Uploaded by: " + video.Uploader);  
  37.             if (video.YouTubeEntry.Location != null)  
  38.             {  
  39.                 Console.WriteLine("Latitude: " + video.YouTubeEntry.Location.Latitude);  
  40.                 Console.WriteLine("Longitude: " + video.YouTubeEntry.Location.Longitude);  
  41.             }  
  42.             if (video.Media != null && video.Media.Rating != null)  
  43.             {  
  44.                 Console.WriteLine("Restricted in: " + video.Media.Rating.Country);  
  45.             }  
  46.   
  47.             if (video.IsDraft)  
  48.             {  
  49.                 Console.WriteLine("Video is not live.");  
  50.                 string stateName = video.Status.Name;  
  51.                 if (stateName == "processing")  
  52.                 {  
  53.                     Console.WriteLine("Video is still being processed.");  
  54.                 }  
  55.                 else if (stateName == "rejected")  
  56.                 {  
  57.                     Console.Write("Video has been rejected because: ");  
  58.                     Console.WriteLine(video.Status.Value);  
  59.                     Console.Write("For help visit: ");  
  60.                     Console.WriteLine(video.Status.Help);  
  61.                 }  
  62.                 else if (stateName == "failed")  
  63.                 {  
  64.                     Console.Write("Video failed uploading because:");  
  65.                     Console.WriteLine(video.Status.Value);  
  66.   
  67.                     Console.Write("For help visit: ");  
  68.                     Console.WriteLine(video.Status.Help);  
  69.                 }  
  70.   
  71.                 if (video.ReadOnly == false)  
  72.                 {  
  73.                     Console.WriteLine("Video is editable by the current user.");  
  74.                 }  
  75.   
  76.                 if (video.RatingAverage != -1)  
  77.                 {  
  78.                     Console.WriteLine("Average rating: " + video.RatingAverage);  
  79.                 }  
  80.                 if (video.ViewCount != -1)  
  81.                 {  
  82.                     Console.WriteLine("View count: " + video.ViewCount);  
  83.                 }  
  84.   
  85.                 Console.WriteLine("Thumbnails:");  
  86.                 foreach (MediaThumbnail thumbnail in video.Thumbnails)  
  87.                 {  
  88.                     Console.WriteLine("\tThumbnail URL: " + thumbnail.Url);  
  89.                     Console.WriteLine("\tThumbnail time index: " + thumbnail.Time);  
  90.                 }  
  91.   
  92.                 Console.WriteLine("Media:");  
  93.                 foreach (Google.GData.YouTube.MediaContent mediaContent in video.Contents)  
  94.                 {  
  95.                     Console.WriteLine("\tMedia Location: " + mediaContent.Url);  
  96.                     Console.WriteLine("\tMedia Type: " + mediaContent.Format);  
  97.                     Console.WriteLine("\tDuration: " + mediaContent.Duration);  
  98.                 }  
  99.             }  
  100.         }  
  101.     }  
  102. }  
  103.   
  104. </video>  


実行結果
こんなのが出力されたので、ひとまずApiの呼び出しには成功しているのではと思ってる。
------------------------------------
Title: Introduction to Google Data
Jeff Fisher walks through basic history and concepts behind the Google Data prot
ocol. Visit the documentation for more information and list of available APIs:
http://code.google.com/apis/gdata/
Keywords:
Uploaded by: googledevelopers
------------------------------------

2012年12月16日日曜日

c# youtube api 1 (SDK導入)

やりたいこと
C# で youtube のapiを使ってみたい。
ひとまず、Googleが用意している.Net用のSDkを導入するところまで。


準備
■参考にしたサイト
本家
https://developers.google.com/youtube/2.0/developers_guide_dotnet?hl=ja
デベロッパーキー入手の参考にしたサイト
http://ryushimiz.blogspot.jp/2010/02/youtube-api.html

■ためした環境
OS : win8
VS : Visual Studio 2012 Express for desktop


手順1 ライブラリをインストール
本家のサイトの「downloading the client library」というリンクからそれらしいものをダウンロードし、インストール。
どれをダウンロードすればよいかよくわからなかったので、上の二つをダウンロードし、インストール。 (たぶん一番上の1個だけでよさそう。)
手順2 Visual Studioで参照設定
1.Visual Studioを起動し、C# コンソールプログラムのプロジェクトを作成する。
2.本家のサイトに記載してある名前空間を追加する。
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. // youtube  
  8. using Google.GData.Client;  
  9. using Google.GData.Extensions;  
  10. using Google.GData.YouTube;  
  11. using Google.GData.Extensions.MediaRss;  
  12. using Google.YouTube;  
  13.   
  14. namespace YoutubeTest001  
  15. {  
  16.     class Program  
  17.     {  
  18.         static void Main(string[] args)  
  19.         {  
  20.   
  21.         }  
  22.     }  
  23. }  

※ここまでだとビルドエラーになる。
3.参照設定を追加する
ソリューションエクスプローラー -> 参照設定を右クリック -> 参照の追加...
4. C:\Program Files (x86)\Google\Google Data API SDK\Redist
フォルダにある。3つのdllを追加する。
これでビルドが通るようになる。

これだけだと、まだapiが使えなくて、develperkeyというものを取得する必要がある。

次回へ...

苦労した点
本家のこちらのぺーじを参考にしてたんですが、solution fileを開けってかいてあるのに、solution fileが見当たらなくて四苦八苦しました。結局みつからず...

2012年12月14日金曜日

Dosコマンドを実行し、「内部コマンドまたは...」を取得する。

やりたいこと
Dosコマンドを実行するプログラムで、コマンド自体が有効になってなくて、
「'aaa' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」の状態の場合がある。
例えば、windowsの機能を有効にしてないと実行できないコマンドなど。

この結果を取得する方法がわかったので、書いておきます。
方法
1.まずC#でコマンドを実行するコードはこちらのページを参考にするとできる。
http://dobon.net/vb/dotnet/process/standardoutput.html
2.上記のコードに以下のコードをそれらしいところに追記して、 コマンドをAAAとか適当なものに置き換える。
  1. ①psi.RedirectStandardError = true;  
  2.   
  3. ②string error = p.StandardError.ReadToEnd();  
  4.   
  5. ③Console.WriteLine(error);  
結果
「'aaa' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

2012年12月7日金曜日

C# デリゲート6(イベントってなに?)

イベントってなに?
フォームでいうところのOnButtonClick()を自前でやる方法のこと。
そもそもイベントってなに?ということをたとえ話で説明すると、課長に相談したいんだけど電話中で、電話が終わったら課長から「電話おわったよ」と連絡がくるような仕組みのこと。
どうやって使う?
上に書いた例を参考にソースを書いてみた。課長 kousakuと 平社員だめおがいて、課長の電話が終わったタイミングでだめおが相談に行くというソースを書いてみた

課長と平社員側でそれぞれこのような実装を行う。結構大変。
[課長側]
①イベントハンドラ追加
②イベント実行用の関数を定義 (On~関数を定義)
※On~という関数でラップしているけど、文法的にはなくてもよいが、普通は作るとのこと。
③イベントを発生させる。(On~関数を呼ぶ)
⑥だめおにイベントを受け取らせるための準備

[平社員側]
④受け取るイベントと受け取ったときに呼ばれる関数をひもづける

※-=にするとイベントを受け取らないようになる。
⑤イベント発生時に実施する処理を定義
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.   
  6.         Kacho kousaku = new Kacho();  
  7.         kousaku.Work();  
  8.   
  9.         Console.ReadLine();  
  10.     }  
  11. }  
  12.   
  13. class Kacho  
  14. {  
  15.     // 部下を加える  
  16.     Hira dameo = new Hira();  
  17.   
  18.     //(1)イベントハンドラ追加 (発行する人が定義する)  
  19.     public event EventHandler DenwaEnd;          // 電話が終わった  
  20.   
  21.     //(2)イベント実行用の関数を定義  (発行する人が定義する)  
  22.     private void OnDenwaEnd(EventArgs e)  
  23.     {  
  24.         if (DenwaEnd != null)  
  25.         {  
  26.             DenwaEnd(this, e);  
  27.         }  
  28.     }  
  29.   
  30.     public Kacho()  
  31.     {  
  32.         //(6)だめおにイベントを受け取らせるための準備  
  33.         dameo.Subscribe(this);  
  34.     }  
  35.   
  36.     public void Work()  
  37.     {  
  38.         //課長仕事開始  
  39.         for (int i = 0; i < 10; i++)  
  40.         {  
  41.             Console.WriteLine("課長電話中。");  
  42.             System.Threading.Thread.Sleep(1000);  
  43.         }  
  44.   
  45.         //(3)イベントを発生させる。  
  46.         OnDenwaEnd(EventArgs.Empty);  
  47.   
  48.     }  
  49. }  
  50.   
  51. class Hira  
  52. {  
  53.     // (4)イベントを受け取る設定をする。  
  54.     // 受け取るイベントと受け取ったときに呼ばれる関数をひもづける  
  55.     public void Subscribe(Kacho kacho)  
  56.     {  
  57.         kacho.DenwaEnd += KachoDenwaEnd;  
  58.     }  
  59.   
  60.     // (5)イベント発生時に実施する処理を定義  
  61.     public void KachoDenwaEnd(object sender, EventArgs e)  
  62.     {  
  63.         Console.WriteLine("課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?");  
  64.     }  
  65. }  
出力結果
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長電話中。
課長。例の件なのですが、AAAなので、BBBにします。よろしいでしょうか?
参考資料
プログラミングC#

2012年11月25日日曜日

C# デリゲート5 (その他のジェネリックデリゲート)

ジェネリックデリゲートってなに?
Actionのこと。
ただし、Action以外にももう少しある。

Predicate<T>
これは引数を1つもち、戻り値がboolのデリゲート型。
Func<T、TResult>
引数を0~16個まで持ち、戻り値がTResult型のデリゲート型。

2012年11月24日土曜日

C# デリゲート4 (ラムダ式ってなに?)C#

ラムダ式ってなに?
匿名メソッドをもう少し簡単なかたちで書くことができる機能。
() ⇒ {} みたいな感じで書ける。
どうやって使うの?
  1. delegate()  
  2. {  
  3. }  
  1. () =>  
  2. {  
  3. }  
で置き換えるように使う。
サンプル
前回までのももたろうのサンプルで匿名メソッドにラムダ式を導入。
  1. static void Main(string[] args)  
  2. {  
  3.     // 3人をお供に加える。  
  4.     Dog dog = new Dog();  
  5.     Monkey monkey = new Monkey();  
  6.     Kiji kiji = new Kiji();  
  7.   
  8.     // 攻撃の作戦をたてる  
  9.     Action[] attacks = new Action[4];  
  10.     attacks[0] = dog.Attack;  
  11.     attacks[1] = monkey.Attack;  
  12.     //attacks[2] = delegate()       // 匿名メソッドを  
  13.     attacks[2] = () =>              // ラムダ式で書き換え  
  14.     {   
  15.         //ここで関数を直に定義している。  
  16.         Console.WriteLine("ここで一休み");   
  17.     };  
  18.     attacks[3] = kiji.Attack;  
  19.   
  20.     // 攻撃する  
  21.     for (int i = 0; i < attacks.Length; i++ )  
  22.     {  
  23.         attacks[i]();  
  24.     }  
  25.   
  26.     Console.ReadLine();  
  27. }  
備考
・ラムダ式の表現の仕方はいっぱいある。
  1. () =>  {式}  
  2. (変数) => {式}  
  3. 変数 => {式}  // ()を省略  
  4. 変数 => 式  // {}を省略  

C# デリゲート3 (匿名メソッドってなに?)

匿名メソッドってなに?
デリゲート型の変数に渡す関数をその場で定義するような感じ。
サンプル
前回までの例で説明すると、犬、猿に攻撃した後に一休みして、きじに攻撃させようというときに、 一休みを匿名メソッドで書いてみる。
  1. static void Main(string[] args)  
  2. {  
  3.     // 3人をお供に加える。  
  4.     Dog dog = new Dog();  
  5.     Monkey monkey = new Monkey();  
  6.     Kiji kiji = new Kiji();  
  7.   
  8.     // 攻撃の作戦をたてる  
  9.     //Attack[] attacks = new Attack[3];  
  10.     Action[] attacks = new Action[4];  
  11.     attacks[0] = dog.Attack;  
  12.     attacks[1] = monkey.Attack;  
  13.     attacks[2] = delegate()                //★匿名メソッド★  
  14.     {   
  15.         //ここで関数を直に定義している。  
  16.         Console.WriteLine("ここで一休み");   
  17.     };  
  18.     attacks[3] = kiji.Attack;  
  19.   
  20.     // 攻撃する  
  21.     for (int i = 0; i < attacks.Length; i++ )  
  22.     {  
  23.         attacks[i]();  
  24.     }  
  25.   
  26.     Console.ReadLine();  
  27. }  
どういうときに使うの?
よくわかってない。めんどくさいときにつかうのかな? 関数が短くて大量に必要なときとかかな?

2012年11月23日金曜日

C# デリゲート2 (Actionってなに?)

Actionってなに?
前回の説明でデリゲートを使う場合は、
  1. delegate void Attack();   
という宣言が必要とのことだったけど、実は戻り値がvoidのようなデリゲートの関数は、.Net側で準備してあるのでわざわざ宣言しなくてもよいよというような機能。
それがAction
引数はなし~16個まで対応している。(.net4だと。)
なので、戻り値がvoidで引数が17個あるような関数の場合は自分で宣言する必要がある。
Actionの使い方は?
前回からの変更点として説明すると
まず、delegete~という宣言を削除する。
で以前delegete~を使っていた部分をActionに置き換える。
これでOK
ソース
前回のももたろうのサンプルだとこんな感じで書き換えることができる。
  1. namespace MomoTaro  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             // 3人をお供に加える。  
  8.             Dog dog = new Dog();  
  9.             Monkey monkey = new Monkey();  
  10.             Kiji kiji = new Kiji();  
  11.   
  12.             // 攻撃の作戦をたてる  
  13.             //Attack[] attacks = new Attack[3]; // 不要になった  
  14.             Action[] attacks = new Action[3];  
  15.             attacks[0] = dog.Attack;  
  16.             attacks[1] = monkey.Attack;  
  17.             attacks[2] = kiji.Attack;  
  18.   
  19.             // 攻撃する  
  20.             for (int i = 0; i < attacks.Length; i++ )  
  21.             {  
  22.                 attacks[i]();  
  23.             }  
  24.   
  25.             Console.ReadLine();  
  26.         }  
  27.     }  
  28.   
  29.     // delegate void Attack();  // 不要  
  30.   
  31.     class Dog  
  32.     {  
  33.         public void Attack()  
  34.         {  
  35.             Console.WriteLine("BowWow");  
  36.         }  
  37.     }  
  38.     class Monkey  
  39.     {  
  40.         public void Attack()  
  41.         {  
  42.             Console.WriteLine("ウキー");  
  43.         }  
  44.     }  
  45.     class Kiji  
  46.     {  
  47.         public void Attack()  
  48.         {  
  49.             Console.WriteLine("ケーン");  
  50.         }  
  51.     }  
  52. }  
補足
Visual Studioの定義へ移動の機能でActionの定義を見てみると、
  1. public delegate void Action();  
と定義されていることがわかる。

2012年11月21日水曜日

C# デリゲート

デリゲートってなに?
関数を変数みたいに使いたいときに使う機能のこと。
どうやって使う?
変数みたいに使いたい関数をこんな感じで定義しておく。
  1. delegate void Attack();  
そうすると、この例でいうとAttackを型として使える。 Attack型にはAttackと引数と戻り値が一致する関数がなんでも代入できる。この例でいうと引数が0で戻り値がvoidのものを代入できる。
参考ソースの説明
犬、猿、キジに攻撃させるというソースを考えてみました。 Attack型の配列を作ってそこにそれぞれのAttackを代入しておき、最後に使うということをしてます。
コード
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         // 3人をお供に加える。  
  6.         Dog dog = new Dog();  
  7.         Monkey monkey = new Monkey();  
  8.         Kiji kiji = new Kiji();  
  9.   
  10.         // 攻撃の作戦をたてる  
  11.         Attack[] attacks = new Attack[3];  
  12.         attacks[0] = dog.Attack;  
  13.         attacks[1] = monkey.Attack;  
  14.         attacks[2] = kiji.Attack;  
  15.   
  16.         // 攻撃する  
  17.         for (int i = 0; i < attacks.Length; i++ )  
  18.         {  
  19.             attacks[i]();  
  20.         }  
  21.   
  22.         Console.ReadLine();  
  23.     }  
  24. }  
  25.   
  26. delegate void Attack();  
  27.   
  28. class Dog  
  29. {  
  30.     public void Attack()  
  31.     {  
  32.         Console.WriteLine("BowWow");  
  33.     }  
  34. }  
  35. class Monkey  
  36. {  
  37.     public void Attack()  
  38.     {  
  39.         Console.WriteLine("ウキー");  
  40.     }  
  41. }  
  42. class Kiji  
  43. {  
  44.     public void Attack()  
  45.     {  
  46.         Console.WriteLine("ケーン");  
  47.     }  
  48. }  

2012年11月13日火曜日

c# 修飾子 new overrideの違い

やりたいこと
継承したときのメソッドにつける修飾子にnewとoverrideがあるけど、その違いについてまとめてみる。 現状わかっていることだけ.
準備
猫クラスと猫王クラスを準備する。まずは修飾子をつけない。
  1. class Cat  
  2. {  
  3.     public void Cry()  
  4.     {  
  5.         Console.WriteLine("にゃお~");  
  6.     }  
  7. }  
  8.   
  9. class CatKing : Cat  
  10. {  
  11.     public void Cry()  
  12.     {  
  13.         Console.WriteLine("にゃお~猫王だぞ~");  
  14.     }  
  15. }  
そうすると警告はでるが、コンパイルは通る。警告はnewを使用してください。というような内容。
newの場合
基底クラスの型に代入すると、基底クラスのメソッドが呼び出される。
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         Cat tama = new CatKing();  
  6.         tama.Cry();  
  7.   
  8.         Console.ReadLine();  
  9.     }  
  10. }  
  11.   
  12. class CatKing : Cat  
  13. {  
  14.     public new void Cry()  
  15.     {  
  16.         Console.WriteLine("にゃお~猫王だぞ~");  
  17.     }  
  18. }  
  19.   
  20. class Cat  
  21. {  
  22.     public void Cry()  
  23.     {  
  24.         Console.WriteLine("にゃお~");  
  25.     }  
  26. }  
結果は「にやお~」になる。
overrideの場合
基底クラスの型に代入しても、派生クラスのメソッドが呼び出される。
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         Cat tama = new CatKing();  
  6.         tama.Cry();  
  7.   
  8.         Console.ReadLine();  
  9.     }  
  10. }  
  11.   
  12. class CatKing : Cat  
  13. {  
  14.     public override void Cry()  
  15.     {  
  16.         Console.WriteLine("にゃお~猫王だぞ~");  
  17.     }  
  18. }  
  19.   
  20. class Cat  
  21. {  
  22.     public virtual void Cry()  
  23.     {  
  24.         Console.WriteLine("にゃお~");  
  25.     }  
  26. }  
結果は「にゃお~猫王だぞ~」になる。

2012年11月7日水曜日

[書籍]プログラミングC# を読んで

プログラミングC# を購入したので、読んで気づいた点などについて、書いていこうかなぁと思ってます。随時更新予定。


めんどくさいので3章から読み始めました。
3章 クラスと構造体によるアイデアの抽象化
・パスカル記法...GetString
型(クラスも型)/プロパティ/メソッドに使う
キャメル記法...bigCat
変数/フィールドとかに使う
・MSDNには命名規則を含むいろいろなガイドラインがある。
http://msdn.microsoft.com/ja-jp/library/ms229042(v=vs.100).aspx
・DRY・・・Don't Repeat yourself(自分で繰り返すな。)
・プロパティ : get/setを持つメンバ変数みたいなもの。
・フィールド : いつものメンバ変数。
・自動実装プロパティとは?
いままでこんな感じで書かなければいけなかったコード(C#3より前)
  1. private string myName;  
  2. public string MyName  
  3. {  
  4.     get  
  5.     {  
  6.         return myName;  
  7.     }  
  8.     set  
  9.     {  
  10.         myName = value;  
  11.     }  
  12. }  
を、こんな感じで省略できるようになったこと。
  1. public string MyName  
  2. {  
  3.     get;  
  4.     set;  
  5. }  
C#コンパイラは、内部的には前者のようなコードを作ってるので、実装者からは見えないけど、プロパティに対応するフィールドが内部的には存在しているとのこと。

・読み取り専用フィールドとは?
最初に一回だけ(コンストラクタでだけ)書き込みが可能なフィールドのこと。
例えば猫クラスの名前のように、一度変更したら変えないようなフィールドに使用する。開発中に誤って名前を書き換えたりできないようにする意味があるとのこと。
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         cat tama = new cat("タマ");  
  6.         tama.SayName();  
  7.         Console.ReadKey();  
  8.     }  
  9. }  
  10.   
  11. class cat  
  12. {  
  13.     //読み取り専用フィールド  
  14.     private readonly string name;  
  15.   
  16.     public cat(string newName)  
  17.     {  
  18.         name = newName;  
  19.     }  
  20.   
  21.     public void SayName()  
  22.     {  
  23.         //name = "にゃんこ";  // ここを有効にするとコンパイルエラーになる。  
  24.         Console.WriteLine(name + "です。");  
  25.     }  
  26. }  
・クラスは値でなく参照型なので、代入しても実態は一つ。コピーされない。
  1. cat tama = new cat("タマ");  
  2. tama.Age = 3;  
  3. cat tama2 = tama;  // コピーはされない。tama2もtamaも同一。  
  4. tama2.Age = 4;  
とすると、tamaもtama2も4歳になる。
・参照型はヒープメモリに記録される。値型はいつもスタックに記録されるわけではない?(訳者が悪いのかどっちともとれるような書き方に...)
例えばクラスが持っているフィールドはヒープに作られる。

・構造体で既定のコンストラクタを提供しないでくださいとは?
MSDNの構造体のデザインでそういうことが書いてあるけど、どういう意味?と思ってました。その答えがとても丁寧に解説してあり、ようはデフォルトコンストラクタを独自に実装できないという理由とのこと。本にはもっと詳しく書いてある。
・フィールドだけの構造体の場合は、上記の内容に従ってデフォルトコンストラクタを書かなければ問題なしでこんな風に書ける。
  1. struct position  
  2. {  
  3.     public position(int x, int y, int z)  
  4.     {  
  5.         m_x = x;  
  6.         m_y = y;  
  7.         m_z = z;  
  8.     }  
  9.     public int m_x;  
  10.     public int m_y;  
  11.     public int m_z;  
  12. }  
・なんだけどプロパティをもつ構造体の場合は、また制約があり、こういう風に書くとコンパイルエラーが発生する。デフォルトコンストラクタを呼ぶ前にメソッドを呼び出すとだめという制約がある。
  1. struct position  
  2. {  
  3.     public position(int x, int y, int z)  
  4.     {  
  5.         X = x;  
  6.         Y = y;  
  7.         Z = z;  
  8.     }  
  9.     public int X { get; set; }  
  10.     public int Y { get; set; }  
  11.     public int Z { get; set; }  
  12. }  
で、これに対応する場合はこうすればい。
  1. struct position  
  2. {  
  3.     public position(int x, int y, int z)  
  4.         :this()  // デフォルトコンストラクタを呼ぶ。  
  5.     {  
  6.         X = x;  
  7.         Y = y;  
  8.         Z = z;  
  9.     }  
  10.     public int X { get; set; }  
  11.     public int Y { get; set; }  
  12.     public int Z { get; set; }  
  13. }  
・C#4からは省略可能な引数というのがある。引数の数だけことなるようなオーバーロードをするときの代替として使える。型がちがうオーバーロードの代わりにはならないので、オーバーロードがいらなくなるわけではないと思う。 ・オブジェクト初期化子とは? newするときにプロパティを設定できる機能。コンストラクタとの使い分けが難しそう。。。
4章 拡張性とポリモーフィズム
・アソシエーションとは?
車と運転手
・集約(アグリゲート)とは?
消防車と着脱可能なホース(has-a)
・コンポジションとは?
はしご車とはしご(contains-a)
・継承とは?
消防署長と消防士(is-a)
・ポリモーフィズムとは?
消防署長クラスを消防署長と消防士の両方で使えるということ?こんなだったけ?
・リスコフの置換原則とは?
派生クラスは基底クラスに置き換えて使用できなきゃいけないよということ。
メソッドをオーバーライドしたらもうだめなのかな?
・継承するときのメソッドの修飾子newとoverrideは何が違うの?
別途まとめる。
・protectedってなに?
基底クラスのメンバなどにつける修飾子で、これをつけると派生クラスからだけは使えるようになる。publicとprivateのあいだぐらいのもの。
・internalってなに?
これをつけると別のライブラリから使えなくなる。あまり使用されてないみたいだけど、使ったほうがよいのだとか。
・sealedってなに?
これをつけると、派生できなくなる。派生させたくないクラスにはこれをつけとくとよい。
・抽象クラスのなまえは~baseにしたほうがよい。
・すべての型はObjectの派生である。(intとかもすべてのclassもobjectの派生)
・ボックス化ってなに?
objectがたの変数に値を代入すること。(とても重い)
・ボックス化の解除ってなに?
object型の変数を別の型の変数に代入すること。(こちらも重いがボックス化よりは軽い)
・C#では多重継承がないかわりにインタフェースがある。
・インタフェースって何?
イメージとしては抽象クラスのような感じ。使い分けはよくわからないけど、インタフェースの方が使いやすいのかな?
インタフェースは多重継承みたいなことができる。

5章 デリゲートによる関数合成
・デリゲートとは「単に、任意の関数をいくつかのプロパティに登録し、順番に呼び出すオブジェクトでしかない」とのこと。
・5-1まで読んだが、なんだがしっくりこず。http://ufcpp.net/study/csharp/sp_delegate.html こちらのほうが参考になった。関数を型として扱うような感じとのこと。deleget ~と宣言するとそれと同じ引数と戻り値をもった関数を同じ型として扱うことができる。(別途まとめたい) ・戻り値を持たないデリゲートの場合は、型を宣言しなjくてもAction<引数>というもので代用できる。
・デリゲート型の変数をプロパティとすることもできる。その場合、関数をgetしたり、setしたりできる。
・匿名メソッドは親の関数で定義されている変数にもアクセスできる。
・その他は別の記事にまとめた。
6章 エラー処理
・エラーが起きたときの対処策としては、一般的には次の方法がある。
1.気にせず継続する
2.対処する(まるめるとかそんな感じ。)
3.エラー値で処理する
4.停止する。

で、1だと期待した結果にならなかったり、プログラムが突然落ちたりなんかするのでNG
2だといい場合もあるけど、ダメな場合もある。
※詳細は書籍で。
3だと正常系と同じぐらい異常系のためのコードが必要になり、それ以外にもいろいろ大変とのこと。
4については説明がないけど、なので、例外を使いましょうという感じ。
・例外(excepttion)を使うメリットは?
 エラー処理が不要になる。(エラーコードを伝搬させるよくある処理)
 (⇒サブサブサブサブ関数で、エラーが起きたときに例外を投げれば、一番上まで届くので)
 ということで、エラー系にひとまず頭をなやませなくてもよい。
 デバッカを使っていれば、エラーが発生した場所(exception)した場所が明確にわかる。
・暗黙的な再スローって何?
throw;でもう一回スローすること。
この方法だと呼び出し履歴の情報がのこるとのこと。
・明示的な再スローってなに?
throw 例外オブジェクト;でスローしなおすこと
この方法だと呼び出し履歴の情報が再スローしなおしたところからになるとのこと。
再スローしなおすと、元の例外は再スローした例外のinnerExceptionプロパティとして記録される。
・カスタムの例外はできるだけ使わないほうがよい。

7章 配列とリスト
・配列にはFindAllというメソッドがある。便利そう。
・多次元配列には、配列の配列 int[][]と
・四角形配列 int[ , ]がある。

2012年10月27日土曜日

Windows8導入履歴

やりたいこと

Windows7 64bit PC に Windows8 をインストールし、デュアルブートにする。
(win8用のHDDは新規に購入。)

HDD購入

こちらのHDDを購入し、PCに設置。

設置後に、Windows7を起動しディスクの管理を開くと、HDDをMBRで初期化するかGPTで初期化するか聞いてくる。ネットの情報を頼りに2GBだとMBRが無難ということだったので、MBRで初期化。

Windows8購入 1


MSのサイトにいって、
http://windows.microsoft.com/ja-JP/windows/buy?ocid=GA8_O_WOL_DIS_ShopHP_FPP_Light

「Proを3300円でダウンロードする」ボタンを押す。

Windows8-UpgradeAssistant.exe がダウンロードされるので、こちらを実行する。



Windows8購入 2

互換性のチェックをやりだすので、少し待つと結果が表示される。

次へボタンを押す。

別ボリュームにインストールする予定だったので、なにも引き継がないを選択して次へ。

DVDはOFFで、確認ボタン押す。
個人情報を入力。とりあえず全部入力した。
支払情報画面が表示されるので、クレジットカードを選択して、情報を入力し、次へ。
そうすると「ご注文ありがとうございました。」画面に遷移する。画面には、プロダクトキーが記載されている。
次へ。ボタンを押す。

ダウンロードが始まる。
ここからはスクリーンショットなしになります。(とっとけばよかった。)

ダウンロードが終わると、以下の選択肢が表示される。
◎今すぐインストール
◎メディアを作ってインストール
◎後でデスクトップからインストール


メディアを作ってインストールを選択。



以下の選択肢が表示される。
◎USBフラッシュドライブ
◎ISOファイル

ISOファイルを選択する。

そうすると、ISOファイルが作成できる。

できたISOファイルを元にDVDを作成する。

これで購入は完了。



Win8 インストール

※ここからはポイントのみ。

1.PCを再起動し、Windows8 のDVDで起動する。
2.Win8のインストーラが実行される。
3.今すぐインストールボタン押す。
3.アップグレード か カスタムインストールか聞かれるのでカスタムを選択する。
4.どこにいれるか画面になるので、増設したHDDのパーティション作成 & フォーマットを実施。
5.作成したボリュームを選択して、次へ。
6.インストールがはじまる。

あとは待つだけ。

完了後

Win8のインストール後に、もともとあったWin7が動くのか気になったので、再起動。

起動画面で Win8っぽい青い窓の絵が表示され、ドキッとしたが、

OS選択画面が表示されたので、一安心。(OS選択画面もWin8っぽいのでこちらもどきっとする)

Win7も問題なく起動できた。

おわり。



2012年10月25日木曜日

twitterで

ツイッターにかんけいしたなにかツールを作りたいなぁとぼんやり考えてます。

ひとまず、Vectorでほかのアプリをおとして研究してみようかと。

2012年10月20日土曜日

c# アイコン 荒い

システムのアイコンを取得して、表示したらなんだか荒い。

という場合は、イメージリストのcolordepthプロパティを32bitにすればよい。
 imagelist.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;

2012年10月7日日曜日

squid

やりたいこと
squidの簡易的なラッパーのようなGUIをつくりたいと思う。 でひとまず勉強を兼ねてプロキシサーバーの設定をしてみる。
環境
サーバ:windows2008 (vmware) クライアント:windows7
手順
こちら に記載されていることをほぼそのままやったらうまくいった。
苦労した点
(1)squidを適当なフォルダに解凍してやってたので、すこしつまずいた。c\:squidにおかないといけないみたい。 (2)Firewallの設定でc:\squid\sbin\squid.exeを登録しておかないとつながらない。 (3)acl localnet srcにサーバーのipアドレスを入れてて失敗。

GlyphTypeFaceクラス

GlyphTypeFaceクラスで取得できる情報(グリフインデックスとか)を表示するソフトを作ったので、Vectorに投稿中。 http://www.vector.co.jp/soft/winnt/writing/se499620.html

2012年9月30日日曜日

wpfでDataGrid

やりたいこと
DataGridにデータを登録する。
この辺に書いてあるのとは違って、データベースとかは使わないで自分で保持している配列的なものを登録する方法を紹介。
http://www.atmarkit.co.jp/fdotnet/chushin/learningdatagrid_02/learningdatagrid_02_01.html
listviewでやった方法でやってみたらできたので、これでよいのかなぁという感じですが。
step1
ツールボックスからDataGridをウィンドウにD&Dする。 D&Dしただけだと小さいので大きくする。
step2
DataGridのプロパティを表示させて、名前欄にDataGrid1と入力する。 そのあと、DataGridのXAMLに、ItemsSource="{Binding}"を追記する。
  1. <window height="350" title="MainWindow" width="525" x:class="gridviewtest.MainWindow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">  
  2.     <grid>  
  3.         <datagrid height="162" horizontalalignment="Left" itemssource="{Binding}" margin="49,91,0,0" verticalalignment="Top" width="394" x:name="DataGrid1">  
  4.   
  5.     </datagrid></grid>  
  6. </window>  
step3
イベントハンドラWindow_Loaded_1を追加して、次のようなコードを書く。
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Windows;  
  7. using System.Windows.Controls;  
  8. using System.Windows.Data;  
  9. using System.Windows.Documents;  
  10. using System.Windows.Input;  
  11. using System.Windows.Media;  
  12. using System.Windows.Media.Imaging;  
  13. using System.Windows.Navigation;  
  14. using System.Windows.Shapes;  
  15.   
  16. using System.Collections.ObjectModel;    
  17. namespace gridviewtest  
  18. {  
  19.     /// <summary>  
  20.     /// MainWindow.xaml の相互作用ロジック  
  21.     /// </summary>  
  22.     public partial class MainWindow : Window  
  23.     {  
  24.         public MainWindow()  
  25.         {  
  26.             InitializeComponent();  
  27.         }  
  28.   
  29.         CollectionViewSource view = new CollectionViewSource();  
  30.         ObservableCollection<customer> customers = new ObservableCollection<customer>();  
  31.         private void Window_Loaded_1(object sender, RoutedEventArgs e)  
  32.         {  
  33.             int itemcount = 107;  
  34.             for (int j = 0; j < itemcount; j++)  
  35.             {  
  36.                 customers.Add(new Customer()  
  37.                 {  
  38.                     ID = j,  
  39.                     Name = "item" + j.ToString(),  
  40.                     Age = 10 + j  
  41.                 });  
  42.             }  
  43.   
  44.             view.Source = customers;  
  45.             this.DataGrid1.DataContext = view;    
  46.         }  
  47.   
  48.         class Customer  
  49.         {  
  50.             public int ID { get; set; }  
  51.             public string Name { get; set; }  
  52.             public int Age { get; set; }  
  53.         }    
  54.     }  
  55. }  
  56. </customer></customer>  
結果
こんな感じになる。

2012年9月29日土曜日

Visual Studio 2012 Install

いつのまにかリリースされてたので、インストールしてみました。 Visual Studio 2012 Express for Windows Desktop。
Visual Studio Express 2012 for Windows 8 こっちはwindows7にはインストールできない模様。windows 8のリリースを待つことに。

ツールボックスがモノクロになってて、なんだが使いずらい。このへんは2010のほうがよかったかも。
2010                    2012

そのた違和感を覚えた点。
・かみなりマーク(イベントハンドラ)もモノクロになったのでわかりずらかった。
・コントロールの名前がデフォルトだと空になってる。2010だとcombobox1とか勝手に名前がついてた。
・コメントアウトするアイコンがいままでと違うものになってる。

2012年9月28日金曜日

WPF で ListView

やりたいこと
WPFのListViewに見出しをつけて、項目をいれたい。 MSのサイトでやり方とサンプルコードがおいてあるので、 これをもう少し簡単に説明したい。 MSのサイトに記載されている以上のことはなにもやってないので、そちらで理解できる方はまったく見る必要なし。
◆説明
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.listview(v=vs.80).aspx
◆MSのサンプル
http://code.msdn.microsoft.com/windowsdesktop/CSWPFPaging-ce1ce482
どんなのを作るか?
Step1
ツールボックスの中のListViewをWPFのウィンドウにはっつける。
Step2
XAMLのソース(UIの下にあるXML)を以下のように書き換える。
  1. <listview margin="18,32,20,45" name="listView1" itemssource="{Binding}">  
  2.     <listview.view>  
  3.         <gridview>  
  4.             <gridviewcolumn header="ID" displaymemberbinding="{Binding ID}" width="50">  
  5.             <gridviewcolumn header="Name" displaymemberbinding="{Binding Name}" width="100">  
  6.             <gridviewcolumn header="Age" displaymemberbinding="{Binding Age}" width="100">  
  7.              
  8.         </gridviewcolumn></gridviewcolumn></gridviewcolumn></gridview>  
  9.     </listview.view>  
  10. </listview>  
これで見出しができる。ここまででこんな感じになる。
Step3
Loded のイベントハンドラを追加する。
Step4
あとはコードのほうに、こんな感じのソースを書く。(MSのサンプルから少し省いた。)
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows;  
  6. using System.Windows.Controls;  
  7. using System.Windows.Data;  
  8. using System.Windows.Documents;  
  9. using System.Windows.Input;  
  10. using System.Windows.Media;  
  11. using System.Windows.Media.Imaging;  
  12. using System.Windows.Navigation;  
  13. using System.Windows.Shapes;  
  14.   
  15. using System.Collections.ObjectModel;  
  16.   
  17.   
  18. namespace WpfApplication1  
  19. {  
  20.     /// <summary>  
  21.     /// MainWindow.xaml の相互作用ロジック  
  22.     /// </summary>  
  23.     public partial class MainWindow : Window  
  24.     {  
  25.         public MainWindow()  
  26.         {  
  27.             InitializeComponent();  
  28.         }  
  29.   
  30.         CollectionViewSource view = new CollectionViewSource();  
  31.         ObservableCollection<customer> customers = new ObservableCollection<customer>();  
  32.         private void Window_Loaded(object sender, RoutedEventArgs e)  
  33.         {  
  34.   
  35.             int itemcount = 107;  
  36.             for (int j = 0; j < itemcount; j++)  
  37.             {  
  38.                 customers.Add(new Customer()  
  39.                 {  
  40.                     ID = j,  
  41.                     Name = "item" + j.ToString(),  
  42.                     Age = 10 + j  
  43.                 });  
  44.             }  
  45.   
  46.             view.Source = customers;  
  47.             this.listView1.DataContext = view;  
  48.         }  
  49.     }  
  50.     class Customer  
  51.     {  
  52.         public int ID { get; set; }  
  53.         public string Name { get; set; }  
  54.         public int Age { get; set; }  
  55.     }  
  56. }  
  57. </customer></customer>  
つまついた点
listviewのコントロールを貼り付けたら、あとはWindowsのFormと同じだろう。というのりでやってみたら、全然ビルドが通らなかった。

2012年9月23日日曜日

C# ウィンドウがアクティブになるのを待つ

WaitForInputIdle()
でできる。

http://www.atmarkit.co.jp/fdotnet/dotnettips/838waitidle/waitidle.html

c# 最近しったこと。

■コンボボックスのイベントで、SelectedIndexChangedだと、呼ばれすぎて困るんだけどSelectionChangeCommittedだと呼ばれないときがあって困るとき。

http://gpsoft.dip.jp/hiki/?VC.NET+%A1%C1+%A5%B3%A5%F3%A5%DC%A5%DC%A5%C3%A5%AF%A5%B9%A4%CE%C1%AA%C2%F2%CA%D1%B9%B9%A4%F2%CA%E1%C2%AA%A4%B9%A4%EB


■TTCの場合に、Glyphtypefaceを作るとき
#に何番目のフォントかを指定する。

            Uri u = new UriBuilder("file", "", -1, フォントファイルのパス, #1).Uri;
            GlyphTypeface typeface = new GlyphTypeface(u);

ttcの数を取得するようなAPIはいまのところわかってない状況。


■typefaceからfontのfamilynameを取得する
カルチャというものの指定が必要なので、とりあえず、現在のカルチャを指定して、
それだとうまく取れないフォントがおおいので、取得できないときはen-USで取得。


IDictionary dictfacename = typeface.FamilyNames;
string FamilyName = dictfacename[CultureInfo.CurrentCulture];
if (String.IsNullOrEmpty(FamilyName))
{
    CultureInfo tmpCurrentCulture = new CultureInfo("en-US", false);
    FamilyName = dictfacename[tmpCurrentCulture];
}

2012年8月31日金曜日

BJD で プロキシサーバー

やりたいこと
BlackJumboDogでプロキシサーバー(ブラウザ)を構築したい。
環境
(1)サーバー
BlackJumboDog 5.7.1.0(Windows Server 2008 にインストール)

(2)クライアント
Windows7

手順
[サーバー側]
1.BlackJumboDogを入手(http://www.sapporoworks.ne.jp/spw/)
2.BJDを起動し、オプション - プロキシサーバ - ブラウザを開く。

3.プロキシサーバ[Browser]を使用するにチェックを入れる。 その他はいじらない。

4.ACLタブに移動し、名前欄は適当で、アドレスにクライアントPCのIPアドレスを入力する。



5.追加ボタンを押して登録する。OKも押す。

そうすると、BJDのステータス画面にプロキシサーバを起動したとかのログが表示される。

6.FireWallの例外設定にBJDを登録しておく。
プログラムの追加からBJDを登録する。


[クライアント側]
インターネットオプションでプロキシサーバーのアドレスとポートを指定する。
これで完了。
クライアント側のブラウザで適当なサイトに接続すると、BJDのステータス画面にちらちら文字列が出てくる。


苦労した点
FireWallの設定をしてなくて、つながらなくて四苦八苦した。
設定しないとBJDのステータスにもなんもでない。

参考にしたサイト


http://ratan.dyndns.info/supaiwea/localproxy.html

2012年4月26日木曜日

ipv6 hostsファイル windows7

やりたいこと
hostsファイルを編集して、ホスト名でサーバーにアクセスする。

ipv6で..

 まずはipv4で..
用意したもの
クライアントPC : windows7
サーバーPC : server2008 (評価版をVMwareにインストール)

C:\Windows\System32\drivers\etc
\hosts
を開いて、サーバーのIPアドレスと適当なホスト名を書く。


  1. # localhost name resolution is handled within DNS itself.  
  2. # 127.0.0.1       localhost  
  3. # ::1             localhost  
  4. 192.168.XXX.XXX test.server.local server    ← 追加  
書いたら保存する。

 ※上書き禁止になっているので、デスクトップとかに持ってきて編集して、
それをまたコピーする。

 ブラウザでhttp://test.server.localにアクセスする。
 IISの画面が出たのでOK.. 


で、ipv6で 


サーバー側でipconfigコマンドを実行して、ipv6のリンクローカルアドレスを確認。 これをhostsファイルに書いてみた。
  1. # localhost name resolution is handled within DNS itself.  
  2. # 127.0.0.1       localhost  
  3. # ::1             localhost  
  4. 192.168.XXX.XXX test.server.local server  
  5. fe80::XXXX:XXXX:XXXX:XXXX test.server.v6.local server2   


これでpingすると、

「ping 要求ではホスト test.server.v6.local が見つかりませんでした。ホスト名を確認
してもう一度実行してください。」

となる。


そこで

なんかよくわからないけど、v6のアドレスの後に%~という表記が必要だということが判明。

netsh interface ipv6 show interface

を実行し、表示されるidxの値を上から順にためしてみたら、うまくいった。

結局こんな感じになる。


fe80::XXXX:XXXX:XXXX:XXXX%YY test.server.v6.local server2

 %~の数値はどれを選べばよいのかよくわからない。

これでpingも通るし、ブラウザからアクセスできるようにもなった。


参考にしたサイト

http://serverfault.com/questions/234711/how-do-i-add-ipv6-address-into-system32-drivers-etc-hosts