パスワード Triple DES

twitter client を作って遊んでいたら、パスワードを保存する必要があり、昔のメモ(2004年!) を引っ張り出して実装した。すげー、備忘録役になっているなぁ・・・=>自分。

パスワードを暗号化してレジストリに保存する

http://uchukamen.com/Programming/EncryptDecrypt/index.htm

using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Security
{
    class Encription
    {
        /// PasswordEncoder はパスワードをTriple DESでエンコード、デコードします。

        /// keyStringから TripleDESCryptoServiceProvider のKey を生成します。
        /// 注意: この生成方法を変更するとデコードできなくなります。
        ///
        private static byte[] GenerateKey(string keyString, int len)
        {
            byte[] key = new byte[len];
            for (int i = 0; i < len; i++)
                key[i] = (byte)(keyString[i % keyString.Length] + i);
            return key;
        }

        /// keyStringから tripledescryptoserviceprovider のiv を生成します。
        /// 注意: この生成方法を変更するとデコードできなくなります。
        ///
        private static byte[] GenerateIV(string keyString, int len)
        {
            byte[] iv = new byte[len];
            for (int i = 0; i < len; i++)
                iv[i] = (byte)(keyString[i % keyString.Length] – i);

            return iv;
        }

        /// パスワード文字列 password をキー key でTriple DES暗号化を行います。
        ///
        public static byte[] Encrypt(string password, string key)
        {
            // Tripe DES のサービス プロバイダを生成します
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();

            tDes.Key = GenerateKey(key, tDes.Key.Length);
            tDes.IV = GenerateKey(key, tDes.IV.Length);

            // 文字列を byte 配列に変換します
            byte[] source = Encoding.Unicode.GetBytes(password);

            // 入出力用のストリームを生成します
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms,
                tDes.CreateEncryptor(tDes.Key, tDes.IV), CryptoStreamMode.Write);

            // ストリームに暗号化するデータを書き込みます
            cs.Write(source, 0, source.Length);
            cs.Close();

            // 暗号化されたデータを byte 配列で取得します
            byte[] destination = ms.ToArray();
            ms.Close();

            return destination;
        }

        /// パスワード文字列 password をキー key でtriple des復号化を行います。
        ///
        public static string Decrypt(byte[] source, string key)
        {
            // Tripe DES のサービス プロバイダを生成します
            TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();
            tDes.Key = GenerateKey(key, tDes.Key.Length);
            tDes.IV = GenerateKey(key, tDes.IV.Length);

            // 入出力用のストリームを生成します
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms,
                tDes.CreateDecryptor(tDes.Key, tDes.IV), CryptoStreamMode.Write);

            // ストリームに暗号化されたデータを書き込みます
            cs.Write(source, 0, source.Length);
            cs.Close();

            // 復号化されたデータを byte 配列で取得します
            byte[] destination = ms.ToArray();
            ms.Close();

            // byte 配列を文字列に変換して表示します
            return Encoding.Unicode.GetString(destination);
        }
    }
}

DoubleAnimation の例

Opacity の変更

private void ChangeOpacity(Label label)
{  
    string name = "labelOpacity" + num++;
    this.RegisterName(name, label);

    label.RenderTransform = label.translateTransform;

    DoubleAnimation myDoubleAnimation = new DoubleAnimation();
    myDoubleAnimation.From = 1.0;
    myDoubleAnimation.To = 0.0;
    myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
    myDoubleAnimation.AutoReverse = true;
    myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;

    Storyboard.SetTargetName(myDoubleAnimation, name);
    Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Label.OpacityProperty));

    myStoryboard1.Children.Add(myDoubleAnimation);
}

フォントサイズの変更

private void ChangeFontSize(Label label)
{
    string name = "labelFontSize" + num++;
    this.RegisterName(name, label);

    label.RenderTransform = label.translateTransform;

    DoubleAnimation myDoubleAnimation = new DoubleAnimation();
    myDoubleAnimation.From = 12.0;
    myDoubleAnimation.To = 50.0;
    myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
    myDoubleAnimation.AutoReverse = true;
    myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;

    Storyboard.SetTargetName(myDoubleAnimation, name);
    Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Label.FontSizeProperty));

    myStoryboard1.Children.Add(myDoubleAnimation);
}

Storyboard myStoryboard1 = new Storyboard();

         ChangeOpacity(label1);
         ChangeFontSize(label1);

         myStoryboard1.Begin(label1);

Storyboard で、textBoxの TranslateTransform を変更

SetTargetPropertyあたりのプログラミングで、どのように表記すればいいのかが分からず難しい。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace wpfsbtest1
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Play1();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            translateTransform1.BeginAnimation(TranslateTransform.XProperty, daukf);
        }

        Storyboard myStoryboard1 = new Storyboard();

        DoubleAnimationUsingKeyFrames daukf = new DoubleAnimationUsingKeyFrames();

        TranslateTransform translateTransform1 = new TranslateTransform();
        private void Play1()
        {
            textBox1.RenderTransform = translateTransform1;

            SplineDoubleKeyFrame sdkf1 = new SplineDoubleKeyFrame(0, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0)));
            SplineDoubleKeyFrame sdkf2 = new SplineDoubleKeyFrame(200, KeyTime.FromTimeSpan(new TimeSpan(0, 0, 3)));

            daukf.BeginTime = new TimeSpan(0, 0, 0);
            daukf.Duration = new TimeSpan(0, 0, 3);
            daukf.KeyFrames.Add(sdkf1);
            daukf.KeyFrames.Add(sdkf2);

            Storyboard.SetTargetName(daukf, this.textBox1.Name);
            Storyboard.SetTargetProperty(daukf, new PropertyPath(TranslateTransform.XProperty));

            myStoryboard1.Children.Add(daukf);
        }
    }
}

Storyboard で textBoxの幅を変更

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Animation;

namespace wpfsbtest1
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Play1();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            myStoryboard1.Begin(button1);

        }

        Storyboard myStoryboard1 = new Storyboard();
        DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();

        private void Play1()
        {
            myDoubleAnimation1.From = 100;
            myDoubleAnimation1.To = 300;
            myDoubleAnimation1.Duration = new Duration(TimeSpan.FromMilliseconds(3000));

            Storyboard.SetTargetName(myDoubleAnimation1, this.textBox1.Name);
            Storyboard.SetTargetProperty(myDoubleAnimation1, new PropertyPath(TextBox.WidthProperty));

            myStoryboard1.Children.Add(myDoubleAnimation1);
        }
    }
}

Twitter Client

かずきのBlog http://blogs.wankuma.com/kazuki/archive/2008/04/24/135133.aspx に、 Twitter Client のコードが載っていた。

面白そうなので、ちょっとビルドしてみたら、簡単にデータが取れてしまった。

コードをイベントハンドラを呼び出すように少し変えたので、メモ。

using System;
using System.Collections.Generic;
using System.Net;  
using System.Text;
using System.Linq;
using System.Xml.Linq;

namespace t1
{
    public struct Account
    {
        public string UserID { get; set; }
        public string Password { get; set; }
    }

    public class TwitterStatus
    {
        public long ID { get; set; }
        public string Text { get; set; }
    }  

    class TwitterClient
    {
        private readonly string PUBLIC_TIMELINE_URL = "http://api.twitter.com/statuses/public_timeline.xml";
        private readonly string FRIENDS_TIMELINE_URL = "http://api.twitter.com/1/statuses/friends_timeline.xml";

        public Account UserAccount { get; set; }

        public void GetFriendsTimeline()
        {
            var client = new WebClient();
            // 認証情報セット  
            client.Credentials = CreateNetworkCredential();

            // GET!  
            var data = client.DownloadData(FRIENDS_TIMELINE_URL);

            var xml = XElement.Parse(Encoding.UTF8.GetString(data));

            // ID, Textを抜きだす  
            var result = from status in xml.Descendants("status")
                         select new TwitterStatus
                         {
                             ID = long.Parse(status.Element("id").Value),
                             Text = status.Element("text").Value
                         };
            DataReceived(result.ToList(), null);
        }

        public delegate void EventHandler(Object sender, EventArgs e);

        public event EventHandler DataReceived;

        private NetworkCredential CreateNetworkCredential()
        {
            return new NetworkCredential(UserAccount.UserID, UserAccount.Password);
        }
    }
}

呼び出しは、

private void button1_Click(object sender, RoutedEventArgs e)
{
    string user = ***;
    string pass = ***;

    var twitter = new TwitterClient
    {
        UserAccount = new Account { UserID = user, Password = pass }
    };

    twitter.DataReceived += new TwitterClient.EventHandler(twitter_DataReceived);
    twitter.GetFriendsTimeline();
}

void twitter_DataReceived(object sender, EventArgs e)
{
    IList<TwitterStatus> lis = (IList<TwitterStatus>)sender;

    foreach (var r in lis)
    {
   string str = string.Format("{0}:{1}", r.ID, r.Text);
   textBox1.Text += str + "\n";
    }
}

実行結果: ここまで、1時間かからないで来てしまう。
バックグラウンドワーカー入れて、タイマー入れて、文字列をあーして、こーして、あっという間にクライアントができてしまいそう。
C# 偉大すぎる。

image

Twitter Screensaver for Visual Studio 2010

http://visualstudiogallery.msdn.microsoft.com/ja-JP/d48ac618-3cdf-4f1d-8366-316d508fb6d6

にTwitter Screensaver (CS)(Free) の記事があった。

Screensaver.Template.CS.vsix をダウンロードし、実行すると、次のような拡張機能インストーラが起動される。

image

インストールボタンを押すと、次のようにインストールが完了する。

image 

または、拡張機能マネージャーのオンライン ギャラリーに、さまざまなテンプレートなどがあり、ダウンロードできるようになっている。その中から、Twitter Screensaver (CS)を選び、ダウンロードボタンを押し、インストールする。

image

しかし、このままだと拡張機能マネージャーからみると”無効”になっていて、テンプレートに現れない。ユーザーごとの有効・・・というメッセージに従って、有効にする。

image 

新しいプロジェクトのインストールされたテンプレートに、”Twitterscreensaver”が現れる。

image

そのままビルドすると、twitter screensaver が動いてしまう・・・

スクリーンセーバーとしてインストールするには、”Screensaver1.exe.scr” を右クリックして、インストールすれば OK となる。

設定は、ハッシュタグだけど、こんな感じになる。

image

.NET Micro Framework 4.0 Features

Microsoftは、組み込みシステム向けの開発および実行環境である「.NET Micro Framework」の大部分をオープンソース化した。

今回のエンハンスポイントは次にような感じらしい。

  1. HTTP と HTTPs:
    System.Net.HttpWebRequest、System.Net.HttpWebResponse、および System.Net.HttpListener のサポート
  2. Multi-touch
    multi-touch イベントが、オブジェクト モデルと、エミュレータでサポート。 ジェスチャ サポートの再設計により高速化かつ柔軟性の向上。
  3. バージョン管理:
    以下、意味がよくわからないけれど、バージョン管理の強化。構築時と、デバイス上のアセンブリ バージョン番号で、厳密なバージョニング、および不足しているアセンブリの再配布。同じアセンブリで別のバージョン番号に属する型のサイドバイサイドロードとバインドをサポート。 バージョン番号を含む名前付けアセンブリのサポート追加。
  4. SSL および HTTPS のエミュレータ サポート:
    SSL および HTTPs エミュレーションをエミュレータでサポート。
  5. ネイティブ XML Parser:
    XML パーサー ネイティブ コードでパフォーマンスを向上。
  6. ネイティブのコレクション:
    コレクション クラスはネイティブ コードで実装され、Queue と Stackをサポート。
  7. 時刻の同期:
    新しい時刻同期 API により、システム時刻を指定したサーバーの時刻から自動または手動で同期。
  8. 任意の表示サイズ:
    760 KB を超えるビットマップをサポート、カスタムのヒープと割り当て領域を提供。
  9. 大きなバッファ:
    新しい型、Microsoft.SPOT.Hardware.LargeBufferをサポート。これにより、マネージド ヒープに収まるらない 760 KB を超えるバッファの割り当てが可能。
  10. ウォッチドッグと電力制御:
    電力レベルとウォッチドッグ動作の振る舞いの制御が、Microsoft.SPOT.Hardware.PowerState、Microsoft.SPOT.Hardware.Watchdog により可能。Microsoft.SPOT.Hardware.dll を使用して、マネージ アプリケーションから制御。
  11. 太いペンやグラデーション塗りつぶし:
    ウィジェットとコントロールをデザインするため、豊富なグラフィック モデルを提供。
  12. TinyCore パフォーマンスの向上:
    イベントのディスパッチとレイアウトで TinyCore のパフォーマンスを強化。

Visual Studio 2010 Beta 2

Visual Studio 2010 Beta 2 がダウンロードできるようになっていますが、その新機能は・・・

注意: 当然ながらリリース前なので、リリース時点でどうなるかはわかりません。

全体にで洗練されたデザインになった感じがします。トップページは、作業の開始、ガイダンスとリソース、最新ニュースがタブになり、見やすくなっています。

image

新しいプロジェクトでは、.NET Framework 4 が標準でサポートされるようになっています。また、F#がサポートされるようになりました。F#は、関数型言語で、ML(Meta Language)の1つ。Beta 2では、プロジェクトに F#ライブラリ、F# アプリケーション、F# チュートリアル、F# Sliverlight ライブラリが用意されています。

image

また、C#プロジェクトでは、ASP.NET MVC 2 Web Application プロジェクトテンプレートが用意されていてます。

image

また、Office プロジェクトテンプレートでは、Office 2010 対応のアドインテンプレートが追加されています。いよいよ Office 2010 ですね。

image

また、新しいプロジェクトテンプレートとして、Enable Windows Azure Tools が追加されており、Azure 対応が可能になるようです。

image

さらに、SharePoint 関連のプロジェクトテンプレートが追加されていて、C# でパーツなどを開発できるようになるようですね。

image

Silverlight も同列のプロジェクトテンプレートとして、Silverlight アプリケーション、ナビゲーションアプリケーション、クラスライブラリが用意されています。

image

インストール関連では、InstallShield Limited Edition のプロジェクトが追加されています。

image

今回、フローティングウィンドウが、Visual Studio のメイン画面の外に移動することができるようになり、マルチモニターの大画面で広々と使えるようになります。VS2008まではかなり狭かったので、思いっきり広く使えるようになります。

image

Visual Studio 2010 では、Silverlight のプロジェクトテンプレートが追加され、今までより楽に Silverlight アプリケーションが作れるようになります。コントロールは現時点で次のようなものがあります。

image

また、コードエディタで、コードを修正すると、左側に修正したところを黄色、緑色などで表示し、どこを編集したいのかわかりやすくなっています。

image 

ちょっとみただけで、かなり大幅な機能エンハンスが行われています。ただ、まだベータ2なので、かなり不安定なところがありますね。このため、Virtual PC上で復元ディスクをイネーブルにして試したほうがいいです。

インストール方法には、従来の DVD からインストールする方法に加えて、今回 Web Installer というものが追加されていて、Web Installer はわずか4.6MBです。この Web Installer を実行すると必要なものをネットからダウンロードしてきて、インストールを行ってくれます。

あと、 これまで Visual Studio Team System と呼ばれていた最上位バージョンは、Visual Studio 2010 Ultimate という名前になっています。