2019年10月28日月曜日

AES暗号化

大まかな流れは
1.暗/復号器を用意
2.暗/復号器を元にストリームを作成
3.暗/復号化したいデータをストリームでやりとり

下記例はオブジェクトのシリアライズの際に書き出すデータを暗号化

            //保存するクラス(TestClass)のインスタンスを作成

            //DataContractSerializerオブジェクトを作成
            //オブジェクトの型を指定する

            DataContractSerializer serializer =
                new DataContractSerializer(typeof(Tokens));

            //BOMが付かないUTF-8で、書き込むファイルを開く

            XmlWriterSettings settings = new XmlWriterSettings();

            settings.Encoding = new System.Text.UTF8Encoding(false);


                // Encryptor(暗号化器)を用意する
            using (var am = new AesManaged())
            using (var encryptor = am.CreateEncryptor(m_key, m_iv))
            // 出力ストリームを用意する
            using (var outStream = new FileStream(strPath, FileMode.CreateNew))
            {
                // 暗号化して書き出す
                using (var cs = new CryptoStream(outStream, encryptor, CryptoStreamMode.Write))
                {
                    using (XmlWriter xw = XmlWriter.Create(cs, settings))
                    {
                        //シリアル化し、XMLファイルに保存する
                        serializer.WriteObject(xw, obj);
                    }
                }
            }


参考


2019年10月21日月曜日

WPF勉強_3

スタイル
FrameworkElementの特定のプロパティに設定する値を記述した情報を保存するスタイルオブジェクトを作成できる。
public Style ()
public Style (Type targetType)
public Style (Type targetType, Style basedOn)
TargetTypeには適用する対象の型
生成したStyleオブジェクトにスタイル情報を追加するにはSetterプロパティ

Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(Control.FontSizeProperty, 30.0));
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Red));

コントロールテンプレート
スタイルはオブジェクトの依存プロパティに設定する値を統一化するための手段に対して、オブジェクトの構造を提供するデータがコントロールテンプレート
コントロールの外観をカスタマイズするための手段
Templateプロパティとして実装
ボタンなどの一般的なコントロールの見た目はデフォルトのTemplateにより実装
描画構造はVisualTreeプロパティに設定(多分ContentPresenterとかのアレ)

            ControlTemplate template = new ControlTemplate(typeof(Button));
            template.VisualTree = new FrameworkElementFactory(typeof(Ellipse));
            template.VisualTree.SetValue(Ellipse.FillProperty, Brushes.Blue);
FrameworkElementFactoryに型情報を渡すと内部でその型がプロパティとして公開している項目を依存プロパティとして生成している?

テンプレートの定義は静的なものなので、テンプレートで定義する要素に対してバインディングを行える

VisualStateManager
Mouseoverとかのイベントを触りやすくしてくれた感じ?
追って勉強

MergedDictionaries 
リソースディクショナリを複数ファイル利用したいときに利用




2019年10月19日土曜日

Task

■Task
並列にこなしたい処理のひとつひとつ
処理の手続きをまとめたもの

■async
 メソッド内でawaitをする場合メソッドの修飾子としてこれが必要
 これ自体は単なる装飾で、コンパイル結果は通常のメソッドと変わらないとのこと。
 (await という新キーワードが C# 4.0 以前のコードを破壊しないようにという意図)
 参考

■await
 asyncメソッド内で使用可能
 修飾された処理を別スレッドにて開始し、自身は一旦止まる?
 別スレッドの処理が終わったら停止前と同じスレッドにて処理を再開する。
   コレガワカラナイ
   WPFなんかでイベントハンドラを実装するとUIスレッドにて処理が行われるが、
   イベントハンドラ中でawaitするとUIスレッドが止まっちゃわない?
   (実際に動かして確認したらなんの問題もなかった。なんで?)

■とりあえず使うだけなら
 asyncメソッド内で重たい処理をTask.Run()でawait

■Task.Waitは使ってはいけないらしい
 デッドロックのリスクが高いとか
 awaitで待とう



Taskとasync/awaitについて分かりやすく解説されてるサイトがあったら教えて下さい…。

参考

2019年10月15日火曜日

MediaElementにhttpsを渡すと例外で落ちる

題名の通り

ツイート添付の動画(httpsで始まる)からUriオブジェクトを作成してMediaElement.Sourceに渡そうとするとNullReferenceで落ちる。

検索したところ同様の現象が出てる人がいたがWPFのバグとして特に進展はなかった。

参考

Entities

Entitiesだけだと画像1個しか持ってこれない!

Extended_entitiesに複数入っているようだが、photoしか持ってこれていない。

→ツイートを取得する際、パラメータのTweetModeをExtendにする。
その際ツイート本文はFullTextになるので注意する。


外部リソースの解放

ファイルやネットワークを利用する際、Disposeを呼び出してリソースを開放しなければならないが、usingを使うと簡潔に書ける。

var reader = new StreamReader(@"Sample.txt");
try
{
    string text = reader.ReadToEnd();
    Console.WriteLine(text);
}
finally
{
    reader.Dispose();
}
上記がusingを使うと

using (var reader = new StreamReader(@"sample.txt"))
{
    string text = reader.ReadToEnd();
    Console.WriteLine(text);
}
となる
こうすると自動でrender.dispose()を呼んでくれるらしい

参考

2019年10月12日土曜日

WPF勉強_2

コントロールはコンテンツをホストする
コンテンツが表示される内容
コントロールもまた別のコントロールのコンテンツになりうる(復習)

WPFでは最終的に表示されるオブジェクトはUIElementをルートに持つ。

依存関係プロパティ
≒動的なプロパティ
子から親に情報を伝えたい際、親に合わせて子にプロパティを追加するのは冗長になるからこれを使う
UIElementクラスがDependencyObjectを継承している為ほとんどで利用できる
親が依存関係プロパティを公開し、子がそこに値を出し入れする
親はRegister()を呼び出してpublicでstaticなメンバとしてDependencyPropertyを登録
子はGet/SetValueで第一引数に上記メンバーのオブジェクトを設定
Registerの第一引数が衝突しても第3引数のオーナークラス毎に管理されるため例外は起きない。
依存プロパティはプロパティでラップして使う

アタッチプロパティ
例えば、あなたが作成するクラスで、任意の数の UIElement オブジェクトを管理しなければならないとします。このとき、オブジェクトに対して、オブジェクトをどのように扱うかなどの付加情報を追加させたい場合にアタッチプロパティを利用します。
これもDependencyPropertyクラスのメソッドRegisterAttachedを利用する

パネル
 ContenControlは任意のUIElementをホストできるが1個だけ
 パネルで複数のコンテンツを管理する
 Panelクラスはこれらのルート
 UIElementCollectionのChildrenプロパティで管理しているオブジェクトの列挙などの調査や、Addメソッドで新たに管理したいオブジェクトを渡す
 Canvasはシンプルなパネル
 コンテンツの座標を指定する際はアタッチプロパティで座標をアタッチする。