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#