気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Youtubeビューワーのベータ版をリリースします。このバージョンでは以下の機能が使用可能です。

・新着動画の閲覧
・動画の検索
・関連動画の閲覧
・指定した著者の動画の閲覧
・コメントの参照

その他、コメント投稿やお気に入りの登録機能などの追加を現在進めているところです。

ご使用はフリーですので、いたらないところがたくさん有ると思いますが、是非お試しください。

○使用方法

インストールの必要はありません。以下からZIPファイルをダウンロードして、展開して出来たディレクトリのexeファイルをクリックすると
アプリケーションを起動できます。ご使用前に同じディレクトリ内の「LICENSE.html」と「notice.txt」の内容をご確認ください。

Youtubeビューワーのダウンロード

○動作環境
本ソフトウェアの稼動には「.NET Framework3.5」が必要です。

Windowss Updateの「カスタム」インストール、または以下のURLからダウンロードしてインストールしてください。

.NET Framework3.5

・「Microsoft .NET Framework 3.5 日本語 Language Pack」について

上記URLからインストールされる方は、同じページ内にあるリンクから「Microsoft .NET Framework 3.5 日本語 Language Pack」もインストールしてください。
Windows Updateを利用された場合は、自動的にインストールされます。

現時点で、「Microsoft .NET Framework 3.5 Service Pack 1」がリリースされていますので、
.NET Framework3.5のインストール後に、こちらもインストールしてください。
こちらも、.NET Framework3.5のインストール後、Windows Updateの「カスタム」インストールを行うことにより、インストールすることが可能です。

○リリースにあたって
・本ソフトウェアはGoogleの「Youtube APIを利用しております。
・アプリケーションのアイコンとして「2s-space」の作品を使わせていただいております。

○ソースファイル
以下からダウンロード可能です。汚くなっちゃいましたがお役に立てば。

ソースのダウンロード

○ご意見・ご要望
ご意見、ご要望がございましたら、コメント、もしくはこちらにメールしてください。

よろしくお願いいたします。



スポンサーサイト
Youtubeビューワーの方ですが、近々、まずベータ版として公開させていただく予定で、現在準備を進めています。

このソフトはもちろんフリーソフト、オープンソースで公開する予定なのですが、
ソフトウェアの一部として、Google Data APIsのクライアントライブラリを使用しているため、
少しライセンスには気を使う必要があります。

わたくしも今回のように自分の作ったソフトを公開するのは初めてなので、
よく理解できていないところもあり、少し勉強してみました。

GoogleのクライアントライブラリがApacheライセンス 2.0でライセンスされているので、
YoutubeビューワーもApacheライセンス 2.0でライセンスすることにしました。

今回はApacheライセンス 2.0でライセンスされているライブラリを含めたソフトウェアを再配布することに
なるので再配布する条件に従う必要があります。

Wikipediaによると再配布の条件は以下。

ソフトウェアのトップディレクトリに以下の2つを置く。

・LICENSE - ライセンスの条文そのもののコピー
・NOTICE - ライセンスされ使用されているライブラリ名とその開発者名のリスト

1つ目の条件については、http://www.apache.org/licenses/LICENSE-2.0から
ダウンロードした条文を置きました。

2つ目の条件に関しては以下のようなNoticeを作成しました。

----------------------------------------------------------------------


本ソフトウェアは、以下のライブラリを一部修正し、使用しています。

ライブラリ名:
Google Data APIs .NET client library, Google Inc

修正点:
日本語を含むGoogle Data APIへのリクエストが正しく処理されるように
URLをUTF-8でエンコードするように修正。

----------------------------------------------------------------------

また、ライセンスされているライブラリを修正した場合はそれを明記する
必要があるらしいので、それもNoticeに記述しています。

ちょっと自信が無いのですが、調べた限りでは
問題なさそう。詳しい方、間違っていれば是非ご指摘ください。


久しぶりの更新になりました。ブログを更新しない間にビューワーの開発の方はかなり進みまして、
画面はこんな感じになっています。


(画像をクリックすると拡大表示されます)

ここまでに実装した機能は以下です。

・新着動画リストを取得
・関連動画の取得
・特定のユーザがアップロードした動画リストを取得
・動画の検索
・動画の再生
・コメントの取得

筆者は日ごろからよくYoutubeを利用するのですが、テストがてら最近このツールで見るようにしています。
手前味噌ですが、結構使いやすいです。

画面左の「動画のリストを表示するエリア」、「動画を再生するエリア」、「コメントを表示するエリア」がそれぞれ独立しているので、
例えば1つの動画を再生しながら、他の動画を探したりすることができるので非常に便利です。Webブラウザだと
関連リストを全て見ようとしたりすると動画の再生もSTOPし、画面全体が更新されてしまうので、それに比べるとこれはかなり快適です。

また、YoutubeのAPI自体も結構高速にレスポンスを返してくれるので、Webブラウザで見るよりも快適に動画を探すことができます。

良いことばかり言ってきましたが、課題もあります。

まず、一つ目はAPIの制限で1000件までしかデータを取得することができません。実際1000件以上ページをめくる人が少ないと思うのですが、
コメントに関しても1000件まで表示できず、しかも検索が出来ないので、コメントを全部見たいかたなどは使いにくいかもです。

2つ目はYoutubeで動画を検索する際、よく検索されるワードのリストが表示されると思うのですが、このAPIは提供されていないので、
この機能は実装できません。

初版の機能としては、このあたりにして、テストをして一度公開したいと思っています。どうぞ皆さんも使ってみてください。

その後もコメント返信やお気に入り登録などの機能を追加していく予定です。



このブログでは、ソフトウェアの開発日記の他にソフトの開発途中で得たC#のTipsを紹介していきたいと思っています。
初回の今回は、WindowsフォームのパフォーマンスについてのTipsです。

日ごろ、いろいろなアプリケーションを使用している時、画面が真っ白になってタスクバーに「応答なし」と表示されてしまったりすることを見かけると思います。
落ちちゃったのかなと思っていると突然また動き出したりする場合もあると思います。

この時、アプリケーションの内部では、決して処理が止まってしまっているわけではありません。順に説明していきます。

応答なしの原因


Windowsは常にコンピュータ上で起こった様々な出来事をそれに関連しているアプリケーションにメッセージとして伝えるということをしてくれています。
例えば、ユーザがアプリケーション内のボタンをクリックしたり、重なっていたウィンドウが閉じられたことによって
アプリケーションのフォームが前面に出てきた場合などがその例です。

そして、各アプリケーションは、Windowsから送られてくるこのメッセージを処理することにより、ソフトウェアとして機能しているのです。
しかし、このメッセージが長い間処理されずに無視されると、ユーザから見ると、アプリケーションが止まってしまったように見えるのです。
画面の描画もメッセージを受けて行われるので、画面が真っ白になるのも、描画しろというメッセージが処理されないとことが原因なのです。

では、なぜメッセージが処理されなくなってしまうのかを説明します。
Windowsから送られるメッセージは各アプリケーション毎のキューに入れられます。そして、各アプリケーションはキューからメッセージを1つずつ取り出して処理をしていきます。
このキューの中身を確認し、メッセージがあれば取り出して処理をする一連の処理を「メッセージループ」といいます。

Windowsの各アプリケーションは、必ずメッセージループを行う必要があります。C#のWindowsフォームアプリケーションの場合、「Application.Run()」を呼び出すと、
呼び出したスレッドを使ってメッセージループが開始されます。
(「Visual Studio」ではWindowsフォームプロジェクトのProgram.csに自動的にApplication.Run()が記述されています。)

Application.Run()呼び出し後、呼び出したスレッドがメッセージの取り出しとメッセージの処理を行うことになりますが、
この時点では、1つのスレッドがメッセージの取り出しと、処理を行っているため、1つのメッセージの処理に時間がかかると、他のメッセージが処理されない状態になってしまいます。

例えば、私が現在開発しているYoutubeビューワーのようにWebAPIに接続してデータを取得してくるようなアプリケーションでは、WebAPIから結果が返されるまで待機するので、
その間、他のメッセージが処理されなくなってしまうのです。

これが、応答なしの原因です。

応答なしの対策


応答なしを回避する一番簡単な方法は、時間がかかる処理の途中で、「Application.DoEvents()」をコールして、キューにあるメッセージを全て処理するようにすることです。
しかし、この方法だと、1行の処理で時間がかかる処理があった場合や、キューの中に同じく時間のかかるメッセージが有った場合、同じ結果になってしまいます。

最も良い方法は、メッセージの処理をメッセージループを行っているスレッド以外の他のスレッドにやらせることです。
メッセージループを行っているスレッドはキューからメッセージを取り出したら、その処理を行う他のスレッドを起動し、自身はメッセージループを継続するのです。

こうすることによって、キューの中に処理待ちのメッセージが溜まっていくことを回避することが出来ます。

スレッドの起動方法


C#にはスレッドを起動する方法が3つ用意されています。

1つ目は直接、スレッドを起動する方法です。


     private void _searchBtn_Click(object sender, EventArgs e)
     {
         try
         {
             Thread thread = new Thread(new ThreadStart(ExecuteSearch));
             thread.Start();

         }
         catch {}
     }

     private void ExecuteSearch()
     {
        //処理
     }


この方法だとメッセージが処理される度にスレッドが生成され、破棄されるため、オーバーヘッドが生じます。
以下のようにすることでFrameworkに備えられているスレッドプールの仕組みを利用することができます。


     private void _searchBtn_Click(object sender, EventArgs e)
     {
         try
         {
             ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteSearch));
         }
         catch {}
     }

     private void ExecuteSearch(Object state)
     {
        //処理
     }


3つ目は非同期デリゲートを使用する方法です。


     private delegate void ExecuteSearchDelegate();

     private void _searchBtn_Click(object sender, EventArgs e)
     {
         try
         {
             ExecuteSearchDelegate dlgt = new ExecuteSearchDelegate(ExecuteSearch);
             dlgt.BeginInvoke(new AsyncCallback(ExecuteSearchCallback), dlgt);
         }
         catch {}
     }

     private void ExecuteSearch()
     {
        //処理
     }

     //処理が終了した際のコールバックメソッド
     private void ExecuteSearchCallback(IAsyncResult ar)
     {
        //処理
     }


内部的には2番目と同じく、スレッドプールのスレッドが使用されます。

個人的には、記述が簡単なので、2番目の方法が好きです。

別スレッドからのControlへのアクセス


Windowsフォームアプリケーションで、別スレッドを使用する場合の考慮点があります。Windowsフォームの各コントロールのメソッドやプロパティはスレッドセーフで無いため、
コントロールを作成したスレッドと別スレッドからアクセスすると予期しない動作をする可能性があります。(デバックモードでは100%例外が発生するようになっています。)

通常、コントロールの作成はメッセージループをおこなっているスレッドが行うことになるため(別スレッドで作成するととても面倒くさいことになります)、
前述のように別スレッドに処理させた結果をコントロールに反映させたい場合、問題になります。

これを回避するために、Controlクラスには、Controlを作成したスレッドを呼び出して、そのスレッドに指定した処理を実行させるためのメソッド「Invoke()」が提供されています。


     private void _searchBtn_Click(object sender, EventArgs e)
     {
         try
         {
             ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteSearch));
         }
         catch {}
     }

     private void ExecuteSearch(Object state)
     {
        //処理

        Invoke((MethodInvoker)delegate()
        {
            //コントロールにアクセスするコード
        });
     }

ちなみに筆者が今回、開発しているYoutubeビューワーでは、このInvoke()処理を行っている途中に動画の再生が一瞬止まってしまうように見えるため、
出来るだけInvoke()の中身を細かく切り、 どうしても切れない場合は、その中で「Application.DoEvents()」を呼ぶという手間をかけています。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。