カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2017年08月31日(木)

c# コントロールからテキストを取得するコード

今日も、コツコツプログラミングしたり、
ホームページの新しいページを書いたりしとりました。

まぁ、特に書くこともないので、
サンプルコードでもあげときます。

エディットボックスとかから
テキストを取得するときのコードです。

非常に短い関数ですが、よく使う汎用的な処理は
関数にしといた方がいろいろと便利です。

public static string GetText(
  Control ctrl, string emptyErr, bool trim = true
)
{
  string value = ctrl.Text;
  if (trim)
    value = value.Trim();
  if (!string.IsNullOrEmpty(emptyErr) && string.IsNullOrEmpty(value))
    throw new ControlException(ctrl, emptyErr);
  return value;
}

trim が真の場合、は文字列の前後の空白を除去します。
だいたいの場合は除去するので、ディフォルトは true でよいでしょう。

emptyErr には、文字列が空だったときの
例外を説明するテキストを渡します。

ControlException は自作のクラスで、
名前からわかるとおり、System.Exception
から派生させたクラスで、例外が発生したコントロールを
わかるようにしただけのやつです。

ControlException をキャッチすると、
例外の発生したコントロールがわかるので、
そこにフォーカスをあわせたりできて便利です。

emptyErr に null とか空文字列を渡すと、
コントロールのテキストが空でも
例外が発生しなくなります。

ま、どっちかというと使わない機能なので、
ディフォルトに設定しない方が親切でしょう。

これだけ短い関数だと、処理を共通化しなくてもよさそうですが、
共通化しておくことによって、トリムし忘れが防げたり
トリムの仕様を変更したくなったときに便利なので、
やっといた方がベターでしょうね。

とはいえ、こういう類のものはキッチリやろうとすると
時間がかかって、いつまでも完成しなくなるので注意です。

・・・

特に私にその傾向があるので困るわー。

ブログ著者のホームページはこちら です。


2017年08月25日(金)

c#、HTTP リクエスト

今日は、c# で HTTP リクエストする
コードを書いとりました。

HttpClient を使うと簡単みたいなので、使ってみましたが、
何故か、ドキュメントが不整備で、ちょっち苦労しました。

本格的に使うにはいろいろと大変みたいです が、
ちょろっと使う分には、コードは短くてすむようです。

ただ async、await は簡単に使えるわりに、
挙動を理解するのは難しいので、注意が必要。

素人は手を出さない方がいいかもね。

ブログ著者のホームページはこちら です。


2017年08月24日(木)

c#、byte 配列 (byte[]) を比較するサンプルコード

今日ちょろっと書いた byte 配列を比較するコードでも公開します。

public static int Compare(byte[] x, byte[] y)
{
  int cmp = CompareUtil.Compare(x.Length, y.Length);
  if (cmp != 0)
    return cmp; // 短い方が小さい

  int len = x.Length;
  for (int i = 0; i < len; ++ i)
  {
    cmp = CompareUtil.Compare(x[i], y[i]);
    if (cmp != 0)
      return cmp;
  }
  return 0;
}

ま、こんな感じアルね。
で、呼ばれている CompareUtil.Compare は、

public static int Compare(long a, long b)
{
  if (a > b)
    return 1;
  else if (a < b)
    return -1;
  else
    return 0;
}

っす。この Compare を別の関数に分ける方法は、
コードがシンプルになって、いいシンよ〜w。(クロちゃん)

ブログ著者のホームページはこちら です。


2017年08月10日(木)

c#、RSACryptoServiceProvider、SignHash と SignData の違い

SignHash は、ハッシュ値の署名を計算します。
SignData は、ハッシュ値を計算し、その署名を計算します。

なので、あるデーター A があった場合、
A のハッシュ値を引数に SignHash を呼んだ結果と
A を引数に SignData を呼んだ結果は同じです。

もちろん使用するハッシュアルゴリズムが同じ場合です。
具体的なコードは下記のようなものです。

SHA1Managed sha = new SHA1Managed();
byte[] msgHash = sha.ComputeHash(msgData);
byte[] sign = rsa.SignHash(msgHash, "SHA1");

下のコードの出力結果 (sign) は、↑と同じです。

byte[] sign = rsa.SignData(msgData, "SHA1");

SignHash の説明の「秘密キーで暗号化して」は、嘘ですね。
元の by encrypting it with the private key も不要。

using the preivate key くらいにしておけばよいものを。

ご意見・ご要望連絡窓口


2017年08月04日(金)

.NET RSACryptoServiceProvider と php の連携、その2

今日も、Windows クライアントと php で
RSA の暗号、複合を行う方法について調査しました。

具体的には以下の 4 種類ができれば OK です。

Windows クライアントで暗号化 > php で復元
php で暗号化 > Windows クライアントで復元
Windows クライアントで署名 > php で検証
php で署名 > Windows クライアントで検証

で、昨日調べた方法は、とても古かったので
新しいやり方を調べました。

具体的に何が古かったかというと、
phpseclib のバージョンです。

phpseclib 0.2.1a でした。古っ。

リリース中の最新バージョンは、phpseclib 2.0.6
みたいなので、それで再構成しました。

Windows クライアントで .NET を使用する場合、RSA は、
RSACryptoServiceProvider (.NET 4.0) を使います。

で、XML 形式の公開鍵、秘密鍵は、 ToXmlString
を使えば、簡単に取得できます。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

string publicKey = rsa.ToXmlString(false);
string privateKey = rsa.ToXmlString(true);

で、OK です。

昨日は、この xml 形式の表現を php にインポートするのに、
ココ にある、RSA_XML.php を利用しましたが、phpseclib 2.0.6
には、XML 形式でのインポート機能があるので、不要になります。

具体的には、こんな感じです。公開鍵 ↓。

$rsa = new RSA();
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$rsa->loadKey(xml_public_key(), RSA::PUBLIC_FORMAT_XML);

秘密鍵の場合 ↓。

$rsa = new RSA();
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$rsa->loadKey(xml_private_key(), RSA::PRIVATE_FORMAT_XML);

ちなみに、setSignatureMode は .NET と
互換性のある形式で署名と検証を行う場合に必要です。
すなわち、暗号化と複合化には、不要です。

あとはだいたい昨日と同じなので、
昨日の記事も参考にしてくださいね。

・・・

どっちかというと、最新版の
phpseclib のインストールに手間どったので
次の記事に書いときます。

ご意見・ご要望連絡窓口


2017年08月03日(木)

.NET RSACryptoServiceProvider と php の連携

今日は、Windows クライアントと php で
RSA の暗号、複合を行う方法について調査しました。

具体的には以下の 4 種類ができれば OK です。

Windows クライアントで暗号化 > php で復元
php で暗号化 > Windows クライアントで復元
Windows クライアントで署名 > php で検証
php で署名 > Windows クライアントで検証

このうち使用する予定なのは、
1 番目と 4 番目だったりしますが、
全部できることを確認しました。

Windows クライアントで .NET を使用する場合、RSA は、
RSACryptoServiceProvider (.NET 4.0) を使います。

.NET で作成したキーを php で読み込むコードは、
ココ にありました。ただし、RSA_XML.zip へのリンクは切れていたので
ページ内のコードをコピペして利用しました。

構文エラーをなくすには、 &gt; &lt; &amp;
を >、<、& に変換する必要があります。

あと、先頭に、<?php も必要かな。

それで、一応動くようにはなりますが、
コメント覧にあるサンプルコードは間違いだらけですw。

単純な間違いとしては、
誤: include('Crypt/RSA.php');
正: include('Crypt/RSA_XML.php');

誤: $rsa->loadKey($XMLpublickey);
正: $rsa->loadKeyFromXML($XMLpublickey);
ですね。

重要な論理的な誤りとしては、
privatekey をロード encrypt した後
publickey をロード decrypt してますが、
encrypt に使用するのは、publickey で
decrypt に使用するのは、privatekey なのでおかしいです。

あとは、ライブラリーの仕様なのかもしれませんが、
privatekey をロードした状態で、Encrypt すると、
Decode に失敗するデーターが出力されます。

そんなこんなで正しいサンプルプログラムは
↓ のような感じになります。

$plaintext = 'terrafrost';

$rsa1 = new Crypt_RSA_XML();
$rsa1->loadKeyFromXML(xml_public_key());
$ciphertext = $rsa1->encrypt($plaintext);

$rsa2 = new Crypt_RSA_XML();
$rsa2->loadKeyFromXML(xml_private_key());
echo $rsa2->decrypt($ciphertext);

署名は ↓ のような感じになります。

$plaintext = 'terrafrost';
  
$rsa1 = new Crypt_RSA_XML();
$rsa1->loadKeyFromXML(xml_private_key());
$signature = $rsa1->sign($plaintext);
  
$rsa2 = new Crypt_RSA_XML();
$rsa2->loadKeyFromXML(xml_public_key());
echo $rsa2->verify($plaintext, $signature) ? 'verified' : 'unverified';

.NET 側の注意点

Crypt/RSA.php に、 define('CRYPT_RSA_ENCRYPTION_OAEP', 1);
という行があるからだと思いますが、
.NET で Decrypt、Encrypt するときには、
fOAEP 引数は true を指定する必要があるようです。

あと、署名のときには、
SignHash、VerifyHash ではなく、
SignData、VerifyData を使います。

Hash 系を使って連携する方法もあるかもしれませんが
今のところはよくわかりません。

・・・

.NET でできたので、Windows API でもできるはずだけど、
すんなりできるかなぁ?

ご意見・ご要望連絡窓口


2013年09月13日(金)

c# 2010 英語のリソースを追加して国際化する方法

写真閲覧ソフト: ミルノ PC フォトフレーム
を英語に対応させたときに行った方法を書きます。

つまり、もともと日本語のみに対応していたソフトを
英語に対応させるための方法ですが、うまく読み換えれば、
別の言語の場合でも、有用な情報になっていると思います。

リソースの英語化

もともと日本語専用のソフトなので、Resources.resx は、日本語用になっていますが、Resources.resx は本来、Language: (既定値) 用のファイルで、対応する言語のリソースが無い場合に使われるリソースです。今回用意しないドイツ語圏などでは、日本語で表示されるより、英語で表示された方が好ましいと思うので、Resources.resx を英語化します。その前に、日本語のリソースを、Resources.resx をコピーして作ります。

日本語用のリソースは、Resources.ja.resx です。ファイル名によって「日本語」と判断されます。C# 2008 のソリューションエクスプローラーで、Resources.resx を Ctrl キーを押しながらドラッグするとコピーできるので、その後、Resources.ja.resx に名前を変更します。

あとは、Resources.resx を英語化するだけです。また、アイコンなど、英語と日本語で全く同じリソースについては、Resources.ja.resx の方を削除しても同じ結果になります。

ja:日本語 と ja-JP:日本語(日本) について

Resources.ja.resx の代わりに、Resources.ja-JP.resx を使用することもできますが、Resources.ja.resx の方がベターです。Resources.ja.resx は日本語圏用の汎用リソースで、Resources.ja-JP.resx は日本語圏の中の日本用のリソースです。今のところ、日本語を使う地域は、日本だけ、かつ、増えそうもないので、実質的には、どちらでも大差ありませんが、原理的にはそうです。例えば、英語の場合には、英語(英国)、英語(米国)、のように英語を使う地域が複数あります。英語(英国)、英語(米国)の違いはわずかなので、例えば、米国産のソフトなら、英語(米国)向けのリソースを英語圏用のリソースとして用意して、英語(英国)で英国特有の表現を使用することで、実行形式のサイズと手間が省けます。

フォームなどのデザイナーリソースを英語化する

フォーム (FormAbout.cs) の場合について説明します。もちろん他のフォーム名でも操作は共通なので、適宜置き換えて解釈してください。まずは、フォームのデザイン画面を開いて、プロパティの Language から、「日本語」を選択します。Language はフォームのプロパティなので、変更するときにはフォームを選択します。子のコントロールでフォームが覆われている場合など、選択しにくい場合には、フォームの子コントロール上で右クリックすると表示されるメニューから、「'FormAbout' の選択」を選ぶと選択できます。

Language に、日本語が選択されている状態で、リソースを変更して保存すると、日本語用のリソースファイル (FormAbout.ja.resx) が作成されます。もともとのリソースは日本語なので、変更する必要は無いのですが、ここで変更して保存せずに、(既定値) のリソースを英語にすると、日本語のリソースも英語になってしまいます。そこで、一時的に、全ての日本語のテキストを変更して保存することにより、日本語のリソースを無理矢理作成します。私はテキストの最初か最後に、一時的に - 記号をつけてみました。

あとは、Language を (既定値) に戻してから、テキストを英語に翻訳します。全て終わったら、Language を日本語に戻して、元のテキスト表現に戻します。FormAbout.ja.resx をテキストエディターで置換してしまうと簡単に元に戻せますが、文字コードなどを変更してしまわないように注意しましょう。

完了

以上で終わりです。この作業により、OS の環境によって、使用される言語が変わるようになります。Winodws 8 Pro の場合には、コントロールパネルの言語から、使用する言語を切り換えることができます。

最初は「日本語」しか用意されていないので、「言語の追加」で例えば、「English (United States) 」を用意します。あとは、「上へ」「下へ」ボタンを利用して、テストしたい言語を一番上に持ってくれば OK です。

Gengo

参考ページ

多言語対応 - C# フォーム階梯
@IT:.NET TIPS Windowsフォームを多言語対応にするには? - C#

・・・

自分は、一時的に付けた、- を一部取り忘れてしまいました。
リリース前に、検索機能でチェックするとよいと思います。

あんまり関係ありませんけど、英語と日本語に対応している
ミルノ PC フォトフレームのダウンロードは、下記リンクからどうぞ。

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

ご意見・ご要望はこちらから
You can contact me by this mail form.

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


2013年01月21日(月)

Windows 8+.NET Framework 4.5 で、MenuStrip.MenuDeactivate が発生しない

Windows 8 + .NET Framework 4.5 の環境で、MenuStrip の
メニューを開いてから、別の場所をクリックして閉じた場合に、
MenuStrip.MenuDeactivate イベント が発生しませんでした。


Photos by Lye Hock

例えば、ファイル(F) を 2回クリックして、ドロップダウンを
開いてから閉じたときに、Windows 7 + .NET 4.0 で発生する、
MenuDeactivate が Windows 8 + .NET 4.5 では発生しません。

このとき、MenuStrip のキーボードフォーカスは無くなっているので、
発生しないのは、Windows 8 + .NET 4.5 のバグだと思います。
(たぶん、.NET 4.5 のバグと思われるが未確認)

回避方法

MenuStrip の子アイテムが閉じたときに、
MenuStrip.KeyboardActive を false に設定すれば OK です。

↓ 子アイテムが閉じたときのイベントハンドラを設定するコード断片

foreach (ToolStripMenuItem menu in menuStrip.Items)
  menu.DropDownClosed += TopMenu_DropDownClosed;

↓ KeyboradActive を false に設定するコード断片。
↓ (KeyboardActive は、protected なので・・・)

private void TopMenu_DropDownClosed(object sender, EventArgs e)
{
  Type type = typeof(MenuStrip);
  var pi = type.GetProperty(
    "KeyboardActive", BindingFlags.NonPublic | BindingFlags.Instance
  );
  pi.SetValue(menuStrip, false, null);
}

副作用

副作用は、あまりありませんが、メニューを Esc で閉じた場合に、
Deactivated と Activated が連続して発生します。

Esc で閉じた場合には、MenuStrip がキーボード操作可能なままなので、
Deactivated、Activated の発生は、不要です。

応用例

ミルノ PC フォトフレーム の MenuStrip がアクティブな場合、
メニューパネルを自動的に隠さない処理に影響がありました。


2012年10月28日(日)

XNA 4.0 の SpriteBatch への Effect 適用について

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、SpriteBatch の Effect についてです。

XNA 3.1 では、Effect を適用するには、適用のはじめで、

effect.Begin();
effect.CurrentTechnique.Passes[0].Begin();

適用の終わりで、

effect.CurrentTechnique.Passes[0].End();
effect.End();

と書く必要がありましたが、XNA 4.0 では、適用開始で、

effect.CurrentTechnique.Passes[0].Apply();

と書けばよくなりました。適用のやめかたは必要なかったので、
調べてません。どうやるのかな?

まぁ、これだけで話がすめば簡単でいいのですが、
実は書き方だけじゃなく、挙動も変わっています。

XNA 3.1 では、上のように、Effect を適用しても、
SpriteBatch にもともとある Effect は有効で、
SpriteBatch.Draw で指定した色により画像の色を変更できました。
(主に、アルファ値を指定するのに使います)

一方、XNA 4.0 では、Effect を設定した場合、
SpriteBatch.Draw で指定した色は無視されます。

ただ、SpriteBatch.Draw で指定した色は、COLOR0 として
ピクセルシェーダーに渡されるので、自分で作った Effect で、
掛けてあげれば OK。↓ みたいな感じです。

float4 pixel_shader(float2 txp: TEXCOORD0, float4 color: COLOR0) : COLOR
{
  float4 src = tex2D(SampTx, txp);
  return src * color;
}

ミルノでは、SpriteBatch で用意されている Effect は使わずに、
全てカスタム Effect でいい感じに処理してます (笑)。

color の使い方をいじってやれば、アルファ指定用の色情報として、
.NET 4.0 用の Color(alpha, alpha, alpha, alpha) を渡さず、
.NET 3.5 のまま、Color(255, 255, 255, alpha) を渡しても、
うまく処理できます。

また、ABGR -> ARGB の変換なんかも高速に行えるので、
XNA 3.1 から 4.0 に移植するときには、おすすめの方法ですよ。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


2012年10月28日(日)

XNA 4.0 の BlendState.NonPremultiplied の不具合

写真閲覧ソフト: ミルノ PC フォトフレーム 1.5 では、
利用する XNA フレームワーク (グラフィック表示用ライブラリ) を
XNA 3.1 から、XNA 4.0 Refresh に変更しました。

そのときに、ちょっと苦労した点を、後進の方向けに、ご紹介。
この記事は、BlendState.NonPremultiplied についてです。

(過去ログ:XNA 4.0 の SpriteBatch で新しく導入された BlendState クラス)
と重複しますが、たぶん、これに引っかる人は
多いと思うので、もう 1 回書きます。

XNA 4.0 では、アルファ値が色情報に掛けられていない
Texture2D を描画するには、BlendState.NonPremultiplied
を使います。

ところが、BlendState.NonPremultiplied には不具合があります。
仕様どうり動くので、厳密には不具合では無いかもしれませんが、
設計ミスか、少なくとも注釈、注意が必要な仕様です。

BlendState.NonPremultiplied は、

AlphaBlendFunction = BlendFunction.Add,
ColorBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.SourceAlpha,
AlphaSourceBlend = Blend.SourceAlpha,
ColorDestinationBlend = Blend.InverseSourceAlpha,
AlphaDestinationBlend = Blend.InverseSourceAlpha,

と定義されているので、出力先のアルファ値が正しく計算されません。
正しくは、AlphaSourceBlend = Blend.One です。

描画先が画面の場合は、出力アルファ値は見た目に影響を与えないので、
問題ありませんが、RenderTarget2D に描画する場合、
描画先の Texture2D のアルファ値はおかしなものになります。
例えば、不透明な画像に透明な画像を描くと透明になったりします。

下のような BlendState を指定すれば、
出力アルファ値も正しくなりますが、Reach プロファイルでは
使えないみたいです。(HiDef プロファイルが必要)

public static readonly BlendState _NonPremultiplied = new BlendState()
{
	AlphaBlendFunction = BlendFunction.Add,
	ColorBlendFunction = BlendFunction.Add,
	ColorSourceBlend = Blend.SourceAlpha,
	AlphaSourceBlend = Blend.One,
	ColorDestinationBlend = Blend.InverseSourceAlpha,
	AlphaDestinationBlend = Blend.InverseSourceAlpha,
};

HiDef プロファイルを使用するには、Shader Model 3.0
に対応したグラフィックカードが必要で、敷居が高そうです。

実際、父親の結構新しめの、ノート PC でも動きませんでした。

そこで、ミルノでは、出力アルファを無視することで、
BlendState.NonPremultiplied をうまく乗りこなすことにしています。

XNA 4.0 を利用した高速画像ビューアー、ミルノ PC フォトフレーム
試用は無料なので、是非使ってみてくださいね。


| 1/3PAGES | >>