ImageToolsを使用してSilverlightアプリケーション上でGIFを再生する

ImageToolsというライブラリを使用して、Silverlightアプリケーション上でGIFを再生する方法を書きます。

ImageTools 公式サイト
imagetools.codeplex.com

使い方

  1. ImageToolsライブラリをダウンロードする。

上記公式サイトから、ライブラリをダウンロードしてください。


2.Silverlight アプリケーションのプロジェクトにImageToolsのDLLを参照設定する。
 GIFを再生するために必要なDLLはおおよそ以下の4つ。
 ImageTools.dll
 ImageTools.Controls.dll
 ImageTools.Utils.dll
 ImageTools.IO.Gif.dll

3.参照設定後、xamlファイルに以下のように記述する。
 namespaceにImageToolsを追加し、GIFを表示するためのImageToolsのAnimatedImageタグを定義する。

<UserControl x:Class="ImageToolsSampleApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:imagetools="clr-namespace:ImageTools.Controls;assembly=ImageTools.Controls"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <imagetools:AnimatedImage x:Name="image" Height="100" Width="100" Stretch="Fill" MouseLeftButtonUp="image_MouseLeftButtonUp"></imagetools:AnimatedImage>
    </Grid>
</UserControl>


4.上記xamlファイルのコードビハインドで以下のように記述する。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using ImageTools;
using ImageTools.IO;
using ImageTools.IO.Gif;

namespace ImageToolsSampleApp
{
    public partial class MainPage : UserControl
    {
        // GIFアニメーションの動いてるか止まっているかを持つフラグ
        private bool isAnimate = false;

        public MainPage()
        {
            InitializeComponent();
            Decoders.AddDecoder<GifDecoder>();

            ExtendedImage extendedImage = new ExtendedImage();

            // GIF読み込み完了時の処理
            extendedImage.LoadingCompleted += (sender, args) =>
            {
                Dispatcher.BeginInvoke(() =>
                {
                    image.Source = extendedImage;
                    isAnimate = true;
                    
                    // GIFの再生秒数を抽出
                    double totalDelayTime = 0F;
                    for (int i = 0; i < extendedImage.Frames.Count; i++)
                    {
                        totalDelayTime += (extendedImage.Frames[i].DelayTime / 100.0) * 1000.0;
                    }
                    totalDelayTime += (extendedImage.DelayTime / 100.0) * 1000.0;
                });
            };

            // GIF読み込み
            extendedImage.UriSource = new Uri("Image/sample.gif", UriKind.Relative);
        }

        // GIFクリック時の処理
        private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            // GIFの状態をみて、再生するか止めるか行う
            if (isAnimate == false)
            {
                image.Start();
                isAnimate = true;
            } else 
            {
                image.Stop();
                isAnimate = false;
            }
        }
    }
}


以上

【資格受験記】LPIC 202 合格 LPIC Level2 取得

先日、LPIC 202を受験し、合格。LPIC Level2を取得したので、受験記録を書きます。

取得点

640点

内訳
  • ドメインネームサーバ      75%
  • Webサービス          81%
  • ファイル共有          87%
  • ネットワーククライアントの管理 90%
  • 電子メールサービス       87%
  • システムのセキュリティ     78%
受験回数・勉強期間

1回目の受験。勉強期間は11日間。20〜30時間程度かなぁ。

勉強に使ったもの

ping-t
ping-t.com

Linux教科書 LPICレベル2 スピードマスター問題集 Version4.0対応
www.shoeisha.co.jp

勉強法

まず、3日間で、ping-tの問題を1周。次に2日間でping-tの問題を1周。
その後、スピードマスターの問題を解く。ping-tの模擬試験をやる。
最後に、スピードマスターの模擬試験をやる。みたいな感じです。

本番試験の感想

60問解くのに22分程度かかり、入力問題は10問出ました。
スピードマスターやping-tで見たような問題も結構出ました。

以下の条件を満たした状態で受験すれば、ほぼ受かるかと思います。

ping-tの模擬試験で常に90%以上取れる。
スピードマスターの問題を全てやって、模擬試験で7割程度取れる。

Rails チュートリアルでrails testした時に、「ActiveRecord::PendingMigrationError」が発生した時の対処

Railsチュートリアルをやっていてちょっとはまったところがあったので、同じことで困っている人のためにメモ。

【発生箇所】
Rails チュートリアルの第6章 6.3.1 ハッシュ化されたパスワード付近。

【現象】
6.3.1 ハッシュ化されたパスワードで、最初にusersテーブルにpassword_digestカラムを
追加するために、マイグレーションした後で、rails testコマンドを実行すると、以下のエラーが出る。

[vagrant@localhost sample_app]$ rails test
Running via Spring preloader in process 13972
/home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:573:in `check_pending!': (ActiveRecord::PendingMigrationError)

Migrations are pending. To resolve this issue, run:

bin/rails db:migrate RAILS_ENV=test

from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:586:in `load_schema_if_pending!'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:592:in `block in maintain_test_schema!'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:823:in `suppress_messages'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:597:in `method_missing'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/migration.rb:592:in `maintain_test_schema!'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_help.rb:15:in `'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/rails_tutorial_since_20170315/sample_app/test/test_helper.rb:3:in `'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/rails_tutorial_since_20170315/sample_app/test/controllers/static_pages_controller_test.rb:1:in `'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `block in require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:259:in `load_dependency'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/activesupport-5.0.1/lib/active_support/dependencies.rb:293:in `require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_unit/test_requirer.rb:11:in `block in require_files'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_unit/test_requirer.rb:10:in `each'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_unit/test_requirer.rb:10:in `require_files'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_unit/minitest_plugin.rb:86:in `plugin_rails_init'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/minitest-5.10.1/lib/minitest.rb:80:in `block in init_plugins'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/minitest-5.10.1/lib/minitest.rb:78:in `each'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/minitest-5.10.1/lib/minitest.rb:78:in `init_plugins'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/minitest-5.10.1/lib/minitest.rb:129:in `run'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/railties-5.0.1/lib/rails/test_unit/minitest_plugin.rb:73:in `run'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/gems/2.3.0/gems/minitest-5.10.1/lib/minitest.rb:62:in `block in autorun'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/vagrant/.rbenv/versions/2.3.2/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from -e:1:in `

'


【対処法】
まず、データベースをリセットするために以下のコマンドを実行。

[vagrant@localhost sample_app]$ rails db:migrate:reset
Dropped database 'db/development.sqlite3'
Dropped database 'db/test.sqlite3'
Created database 'db/development.sqlite3'
Created database 'db/test.sqlite3'
== 20170403115448 CreateUsers: migrating ======================================

    • create_table(:users)

-> 0.0036s
== 20170403115448 CreateUsers: migrated (0.0037s) =============================

== 20170408025509 AddIndexToUsersEmail: migrating =============================

    • add_index(:users, :email, {:unique=>true})

-> 0.0039s
== 20170408025509 AddIndexToUsersEmail: migrated (0.0040s) ====================

== 20170408091417 AddPasswordDigestToUsers: migrating =========================

    • add_column(:users, :password_digest, :string)

-> 0.0023s
== 20170408091417 AddPasswordDigestToUsers: migrated (0.0023s) ================


次に、先ほどのエラーメッセージに表示されていた以下のコマンドを実行。

[vagrant@localhost sample_app]$ bin/rails db:migrate RAILS_ENV=test
== 20170403115448 CreateUsers: migrating ======================================

    • create_table(:users)

-> 0.0023s
== 20170403115448 CreateUsers: migrated (0.0024s) =============================

== 20170408025509 AddIndexToUsersEmail: migrating =============================

    • add_index(:users, :email, {:unique=>true})

-> 0.0021s
== 20170408025509 AddIndexToUsersEmail: migrated (0.0025s) ====================

== 20170408091417 AddPasswordDigestToUsers: migrating =========================

    • add_column(:users, :password_digest, :string)

-> 0.0018s
== 20170408091417 AddPasswordDigestToUsers: migrated (0.0019s) ================

こうすると、rails testが実行できるようになる。

以上

SQL Serverに大量のテストデータを登録するときのコツ

アプリケーションのテストで、データベース(SQL Server)に十数万件のテストデータを登録する必要がありました。
SQLファイルに自動でINSERT文を生成して、SQL Server Management Studioでそのクエリを実行すると、メモリ不足のエラーになり、データ登録ができずに困っていたのですが、INSERT文のあとに「GO」を付けるとうまくいきました。


以下のようにひたすら、INSERT文を書き続けると、メモリ不足でエラーになる。

INSERT INTO テーブル名 VALUES(1, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(2, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(3, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(4, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(5, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(6, "Japan", 0, "TEST");
・
・
・
・(何十万行のINSERT文)


そこで、以下のように「GO」を付けるとメモリ不足にならずクエリが成功する。

INSERT INTO テーブル名 VALUES(1, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(2, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(3, "Japan", 0, "TEST");
GO
INSERT INTO テーブル名 VALUES(4, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(5, "Japan", 0, "TEST");
INSERT INTO テーブル名 VALUES(6, "Japan", 0, "TEST");
GO
・
・
・
・(何十万行のINSERT文)


まぁ、「GO」を付けることで、1つのステートメントが終了しましたよ〜と通知するみたいですね。
「GO」を付けないとずっと1つのステートメントが続いてしまって、メモリが解放されずにどんどん圧迫してしまい、失敗していたみたいです。


知らないとちょっと困るので、メモ。

ASP.NETでJavaScriptのアラートダイアログを表示する

ASP.NETで作ったWebアプリケーションで、JavaScriptのアラートダイアログを表示する方法についてちょっと苦労したので、紹介します。
最初は、C#のメッセージボックスを使ってダイアログを表示しようとしたのですが、ASP.NETでは使えません。
そのため、JavaScriptでダイアログを表示する方法を調べたのですが、情報を見つけるのに少し時間がかかりました。

今回は、ボタンがクリックされた時にJavaScriptのアラートを表示する方法を紹介します。

目次

  1. 単純なアラートダイアログ表示
  2. アラートダイアログ表示の有無をC#側で判断する

単純なアラートダイアログ表示

単純にボタンがクリックされた時に、アラートを必ず表示したいということであれば、ボタンコントロールのOnClientClickプロパティを設定するだけで実現できます。

aspx

<asp:Button ID="test" runat="server" OnClientClick="sayHello();" />

JavaScript(aspxファイル内に書きます)

<script>
function sayHello() {
    alert("Hello!");
}
</script>

アラートダイアログ表示の有無をC#側で判断する

しかし、条件によってアラートを表示するかどうか判断したい場合があると思います。
しかもJavaScriptではなく、C#側で判断したいケース。
私の場合もそうでした。。。
その場合は、もうちょっと手順を踏む必要があります。

手順

1. aspxファイルにScriptManagerタグを定義し、EnablePageMethodsプロパティをtrueに設定する。
2. ボタンコントロールに、OnClientClickプロパティを設定する。
3. aspx.csファイルに、JavaScriptから呼び出されるメソッドを定義する。
4. aspxファイルのscriptタグに、OnClientClickプロパティに指定するメソッドを定義する。

1. aspxファイルにScriptManagerタグを定義し、EnablePageMethodsプロパティをtrueに設定する。

aspxファイルに以下のようにScriptManagerタグを定義します。
JavaScriptからC#のメソッドを呼び出すためには、EnablePageMethodsプロパティをtrueにする必要があるので、trueに設定します。

aspx

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
2. ボタンコントロールに、OnClientClickプロパティを設定する。

アラートを表示したいボタンコントロールにOnClientClickプロパティを設定します。
値には、ボタンが押下された時に最初に呼び出されるJavaScriptのメソッドを設定します。

aspx

<asp:Button ID="test" runat="server" Text="クリック" OnClientClick="sayHello();" />
3. aspx.csファイルに、JavaScriptから呼び出されるメソッドを定義する。

aspx.csファイルに、JavaScriptから呼び出されるメソッドを定義します。
このメソッドは、staticメソッドである必要があります。
また、「System.Web.Services.WebMethod」属性を付与します。
JavaScript側へ戻り値を返すこともできます。

aspx.cs

[System.Web.Services.WebMethod]
public static bool sayHello(int count)
{
      return count == 0 ? true : false;
}
4. aspxファイルのscriptタグに、OnClientClickプロパティに指定するメソッドを定義する。

ボタンが押された時に、処理が渡るメソッドを、記述します。
このメソッドから、先ほどC#で定義したstaticメソッドへ処理が進みます。
ここでは、C#メソッドを呼び出した結果がコールバックとしてJavaScript側に返ってくるので、処理に成功した時に呼ばれるSuccessメソッドと失敗した時に呼ばれるErrorメソッドを定義しておきます。
JavaScriptからC#に引数を渡すこともできます。

JavaScript

<script>
        function sayHello() {
            PageMethods.sayHello(0, onSuccess, onError);
        }

        function onSuccess(result, userContext, methodName) {
            if (result === true) {
                alert("count is 0.");
            }
        }

        function onError(result, userContext, methodName) {
            // エラー時の処理
        }
    </script>

以上でアラートダイアログを表示することができます。

【資格受験記】UMTP UMLモデリング技能試験 L1 合格

2016年9月11日(日)、

2週間前のJSTQBに続き、またまた試験を受けてきました。

今回は、UMTPという団体が開催しているUMLの試験です。

 

UMTPは、L1 - L4まで4段階ある試験で(L0もあるが無料で受験できるので割愛)、

私は、その第一段階であるL1試験を受けました。

結果はギリギリでしたが合格することができました。

これから受験される方に少しでも役に立つように、勉強方法や試験の感想などを書いていきます。

 

試験結果

合格得点:80%   取得得点:83%

【セクション別スコア】

開発プロセス/モデリングの基本概念    :100

要求定義モデリング(ユースケース図)      :100

構造モデリング(クラス図)           :87

振る舞いモデリング(シーケンス図)       :66

振る舞いモデリング(コミュニケーション図)   :100

振る舞いモデリング(ステートマシン図)     :66

振る舞いモデリング(アクティビティ図)     :100

実装モデリング(コンポーネント図)       :0

実装モデリング(配置図)            :100

複数の図を使用したモデリング(複数の図)    :75

 

 受験前の私のレベル

この試験勉強を始めるまでの私のUMLに関するレベルは、「実務でクラス図、フローチャート、シーケンス図などは多少作ったことがある。ただ、細かい記述の仕方や意味は分からないものも多い。」といった状態でした。

 

勉強法

試験のために行った勉強は以下です。

  1. [改訂版]UMLモデリング技能認定試験<入門レベル(L1)>問題集 -UML2.0対応を読み、問題を解く。
  2. ITトレメに掲載されているUMTP L1の問題を解く。

上記の2つです。

 

まず、1の方は、解説部分をさらっと読み、問題を二回ほど解きました。結構分厚い本なので、解説部分はあまり熟読せずに、問題を多く解いた方が良いと思います。私は、2周問題を解きました。

 

[改訂版] UMLモデリング技能認定試験<入門レベル(L1)>問題集 -UML2.0対応

[改訂版] UMLモデリング技能認定試験<入門レベル(L1)>問題集 -UML2.0対応

 

 

2の方は、ITトレメというサイトにUMTP L1の問題が64題載っているので、1度だけですが、全て解きました。実際の試験でもITトレメに掲載されている問題によく似た問題がいくつか出題されていました。

 

ITトレメ − @IT自分戦略研究所

 

試験の感想

すべての問題を解き終わるのに、約28分程度かかりました。その後、20分かけて見直しをしました。試験時間は80分あるので、時間的には余裕がありました。

試験の難易度としては、それほど難しいとは感じませんでした。

ただ、L1は合格ラインが80%と高く、問題数も30問と少ない(6問しか間違えられない)ので、1問のミスが合否を分けてしまいます。その点は注意が必要です。

実務で、実際にUMLを使用している人であれば、試験用の特別な勉強をすることなく、合格できるレベルの問題だと思います。

 

 

私は、続けてL2の勉強に入ります。

 

【ふるさと納税】2016年 第一弾 岩手県北上市

今日はふるさと納税の話です。

 

先日、初めてふるさと納税をしました。理由は、税金が控除され、かつお礼の品がもらえる大変お得な制度だと思ったからです。今年から毎年限度額いっぱいまでふるさと納税をしようと思っています。

 

さて、記念すべきふるさと納税第一弾は、岩手県北上市へ行いました。金額は5,000円です。

 

ふるさと納税ポータルサイトであるふるさとチョイスというサイトから申し込みを行いました。

北上市とは、特に関わりがあるわけではないのですが、お礼の品として野菜が欲しいと思い、探していたところ5,000円の寄付金額に対して、北上市の野菜セットが種類・量ともに満足いくものだったので北上市に決めました。

 

申し込んだお礼の品は「いっぺ北上の野菜食ってげでぇ〜たっぷり野菜セット」です。

 

www.furusato-tax.jp

 

お目当のお礼の品は、先月の20日過ぎに申し込んで、今月の初めには家に届いたので、思っていたよりも早くいただくことができました。

 

届いたお礼の品

f:id:takumetal:20160904175953j:plain

 

届いた野菜の内訳は以下です。

  1. 玉ねぎ…4
  2. ナス…2
  3. きゅうり…6
  4. キャベツ…1
  5. 肉厚ピーマン…3
  6. 山東菜…4
  7. ネギ…1
  8. 小ネギ…1
  9. ミニトマト…10
  10. とうもろこし…2
  11. りんご…2

計11品もの野菜をいただきました。

 

おかげで今週末はスーパーに野菜を買いに行かずに済みました。

 

 

次回のふるさと納税はお米を狙おうと思っています。