イベントログを抽出したい場合、foreach ですべて列挙すると時間がかかってしまう。
これをラムダ式で検索したい場合は、以下のように行う。
// 一週間のうち、ソースが SecurityCenter であるイベントログを取得。
// 戻り値は IEnumerable となる。
var period = DateTime.Now.AddDays(-7);
var logName = "Application";
var machineName = ".";
if (EventLog.Exists(logName, machineName))
{
var log = new EventLog(logName, machineName);
var ret = log.Entries.Cast().Where(m => m.TimeGenerated >= period &&
↧
[C#] イベントログをラムダ式で検索
↧
[VS2013] Private メソッドへの単体テスト実装
単体テストプロジェクトで Private メソッドへのテストを書きたい場合、方法はいくつかあるようだが、外部からアクセスできる public メソッドを書いてしまうのが手っ取り早い。
クラスそのものは public である必要がある。
#if DEBUG を書いておけば、デバッグ時のみ有効化される。
テスト対象クラス
using System;
namespace Sample
{
public static class Program
{
static void Main(string[] args)
{
}
#if DEBUG
public static string UtGetCodeName(string name) { return GetCodeName(name); }
#endif
↧
↧
[C#・単体テスト] Shim を利用したアセンブリからの分離
単体テストメソッド作成時に Shim を利用するとメソッドのふるまいを変更したり、.NET アセンブリの呼び出しを変更したりできる。
shim を使用して単体テストでアプリケーションを他のアセンブリから分離する -msdn
http://msdn.microsoft.com/ja-jp/library/hh549176.aspx#AddFakes
サンプルを作成してみて気を付けなければならない(自分がはまった)のは、参照設定の System.dll を右クリックして 「Fakes アセンブリに追加」 を行うことだ。
Exception を判定したければ、catch をする必要があるのではないかと思う(私はテスト実装に慣れていないので他の方法があるかもしれないが)。
なお、shim はメソッドを書き換えるため、動作速度は遅くなる。
テスト対象クラス
namespace
↧
[C#] 中央ディレクトリの終わりレコードが見つかりません。
エラーメッセージがややわかりづらいのだが、ZipFile クラスに zip アーカイブを読み込ませようとしたが、有効な zip ファイルでないか破損しているとこんなエラーが出る場合がある。
有効な zip アーカイブがどうかのチェックはなさそうなので、System.IO.InvalidDataException でキャッチするしかないようだ。
↧
[C#] PowerShell Office 365 への接続準備
Import-Module : モジュール ディレクトリに有効なモジュール ファイルが見つからなかったため、指定されたモジュール 'MSOnline'は読み込まれませんでした。
+ Import-Module <<<< MSOnline
+ CategoryInfo : ResourceUnavailable: (MSOnline:String) [Import-Module]、FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
PowerShell から Office 365 へ接続する場合には、モジュールをインストールしておく必要がある。
Office
↧
↧
[Windows] 削除の確認メッセージを消す
Windows 8 以降の操作性で変わったところのひとつに、ファイルやフォルダの削除時に確認ダイアログが出なくなったことがある。はじめはやや違和感を感じたのだが、慣れると確認ダイアログはいらないと思うようになった。そして Windows 7 などを使うと、今度はダイアログが出ることが煩わしく感じるようになった。
確認ダイアログの表示・非表示は、ゴミ箱を右クリックして表示される設定ダイアログから簡単に変更できる。
↧
[Visual Studio] Text Sharp でフォントを読みやすくする
Text Sharp
http://visualstudiogallery.msdn.microsoft.com/7aafa2ea-8c54-4da8-922e-d26bf018514d
Visual Studio に Clear Type 等を適用して、フォントを読みやすくするための拡張機能。ギザギザな文字が気に入らない場合に最適である。
拡張機能を入れると、Visual Studio のオプションの中に、 Text Sharp というメニューが追加される。
英語表記であるが、エディタの再起動なしに効果がすぐにわかるので、特に迷うことはないだろう。デフォルトではテキストビュー (Text views) とエディタ全体 (Main Window) に対して適用されるが、いずれかのみ適用させることもできる。
↧
[ASP.NET MVC] FilePathResult で zip ファイルを返す際にエラーが発生する。
'/'アプリケーションでサーバー エラーが発生しました。
パス 'C:\temp\exportroot\Osg2-20033-Osg2sFileImporter-Batchlog_20140818132059430'へのアクセスが拒否されました。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.UnauthorizedAccessException: パス 'C:\temp\'へのアクセスが拒否されました。
ASP.NET は、要求されたリソースへのアクセスを許可されていません。ASP.NET の要求 ID に、リソースへのアクセス権を付与することを検討してください。アプリケーションが偽装していない場合、ASP.NET
↧
[C#] AD のオブジェクトを SID で検索する。
Active Directory のオブジェクトを DirectorySearcher を使って取り出す場合、SID (objectSid) を検索条件に指定するには以下のようにする。
複数の SID を指定する場合には若干書き方が変わる。
var directoryPath = "TEST-SV/OU=Hoge,DC=Hoo,DC=local";
var userName = @"Hoo\Administrator";
var password = "hogehoge";
using (var searcher = new DirectorySearcher(CreateDirectoryEntry(directoryPath, userName, password)))
{
// 一つのみ指定する場合。
searcher.Filter = ("(objectSid=
↧
↧
[PowerDVD] 引き続き、このコンテンツを再生するには、CyberLink PowerDVDをアップデートする必要があります
久しぶりに PowerDVD を使用としたら、以下のメッセージが出て再生できない。
引き続き、このコンテンツを再生するには、CyberLink PowerDVDをアップデートする必要があります。
この現象は、自動アップデートをかけても解消されず、手動でアップデートをかけるしかないようだ。アップデートファイルは、以下からダウンロードする。
アップデート・ユーザーガイドダウンロード - jp.cyberlink.com
途中で使用不可能になってしまうのはどうかと思う。
↧
[Explzh 64bit] サーバーに 7-ZIP64.DLL が見つかりません。
Explzh (64bit) のヘルプから「アーカイバ DLL の自動アップデート」を実行し、7-Zip の DLL しようとすると失敗する。サイトには以下のサイトより 64bit 版 7-zip64.dll をダウンロードして、システムフォルダに配置しろとの記述がある。
綾川的趣味之接続集
http://homepage1.nifty.com/Ayakawa/
Windows 7 64bit 環境の場合、C:\Windows\SysWOW64 にコピーしろと書いてあるのだが( http://www.ponsoftware.com/archiver/help/X64DLL.htm )、実際にはなぜか C:\Windows\System32 に配置しないと動作しない……。
↧
[Explzh 64bit] DataRow の「アクセスできない保護レベル」
DataRow 型を初期化する際、つい以下のように記述しがちだが、エラーが出てしまう。
'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)'はアクセスできない保護レベルになっています。
以下のように記述する。
// エラー
var dr1 = new DataRow();
// 初期化成功
var dr2 = new DataTable().NewRow();
↧
[WinMerg] 行番号表示
デフォルト状態では行番号が表示されていないのだが、実はメニューから設定する。
[表示] - [行番号を表示 (N)]
↧
↧
[C#] DataTable の Row に対して LINQ とラムダによる検索をする
DataTable を使用している業務システムは多いものだが、foreach で回しているケースも少なくない。.NET Framework のバージョンが古い場合はどうしようもないが、バージョンだけ上がっている場合は LINQ や ラムダを使用して高速に検索することができる。
var dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
for (var i = 0; i <= 10; i++)
{
var dr = dt.NewRow();
dr["Name"] = "hoge" + i.ToString();
dt.Rows.Add(dr);
}
var ret = 0;
// Name の末尾が 0 であるレコードをカウントする(LINQ)。
ret = (from x in
↧
[jQuery] 複数の data をサーバー(ashx)に渡す
以下のように渡してしまうと、code1 しか渡すことができず、code2 を参照すると null 参照となってしまう。
$.ajax({
type: "POST",
url: "http://exsample.com/code.ashx",
data: { "code1": $("#txtCode1").val() },
data: { "code2": $("#txtCode2").val() },
dataType: "json",
cache: true,
success: function (result) {
hoge(result);
},
error: function (obj, err) {
}
});
以下のように Json の変数に整形すると値を渡すことができる。
受け取り側は HttpContext の Request で取得する。
↧
[ASP.NET] テキストボックスにウォーターマークを表示させる
テキストボックスに対して、入力して欲しい値を予め薄く表示するウォーターマーク。実装方法は様々あるが、HTML5 対応ブラウザが対象であれば、以下のように placeholder タグを追加するだけで驚くほど簡単に実装できる。
なまえ:
↧
[Google Chrome] 指定したサイトを常にシークレットモードで開く
Incognito-Filter は、指定したサイト(アドレス)を開く際に自動的にシークレットモードで立ち上げてくれる拡張機能である。アドレスの指定は正規表現も使用できるので柔軟な設定が可能。
Incognito-Filter
https://chrome.google.com/webstore/detail/incognito-filter/cifilbmpnkjinlkchohdfcpdkmpngiik
↧
↧
[C#] 文字列の分割時に空白を無視
Split メソッドは色々と便利な使い方ができるが、何も指定しないと分割時に空白も含まれてしまう。これをオプション指定して空白を無視するには、若干書き方が変わってくる。
var s1 = "abc,def,,ghi,";
var s2 = s1.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
// s2[0] = "abc"
// s2[1] = "def"
// s2[2] = "ghi"
StringSplitOptions 列挙体
http://msdn.microsoft.com/ja-jp/library/system.stringsplitoptions(v=vs.110).aspx
↧
[C#] ラムダ式での IN 句
ラムダ式で SQL の WHERE IN のようなことをするためには、検索の元となる値を配列にしてしまい、Contains を使用する。
そもそもデータを取得する時点で絞り込んでおくべきではあるが、こんな書き方もできるというメモ。
// 今さら DataTable ではあるが、使用されているケースは多い…はず?
var dt = new DataTable();
dt.Columns.Add("Class", typeof(int));
dt.Columns.Add("Name", typeof(string));
for (var i = 0; i <= 10; i++)
{
var dr = dt.NewRow();
dr["Class"] = i;
dr["Name"] = "Hoge " + i.ToString() + "世";
↧
[Android] 二段階認証をかけたアカウントを追加する。
Android 端末に Google アカウントを追加する際、対象アカウントに二段階認証を設定している場合は、通常のパスワードを入力しても認証が失敗する。二段階認証を設定しているアカウントを追加するには、「アプリ固有のパスワード」を設定する必要がある。
Google のアカウント設定画面を開く。
[2 段階認証プロセス] - [設定]
[アプリケーション固有のパスワードの管理] を開く。
端末を選択し、アプリを選択(特に厳密である必要はない)したのちに「生成」ボタンを押下する。
パスワードが表示されるので、表示されたパスワードを使用して端末でログインする。
なお、Android だけではなく、未登録の PC のメーラー、iPhone や iPad などで設定する場合にもこの方法でセットアップを行う。
↧