2012/05/31

[Launchy] コマンドラインランチャの使い方

PC の操作に慣れてくるほどマウスよりもキーボードショートカットを使うわけだが、コマンドラインランチャはアプリケーションやファイルを素早く操作するためには非常に役に立つ。

以前は Aqulina を気に入って使っていたのだが、ショートカットキーで起動しない時があるし、メモリはけっこう食うので使用をやめていた。デザインと直感的にショートカットやファイルを登録できるのは良かったのだが……。他にも色々とランチャはあるのだが、いかんせんデザインがダサいし、直感的に使えなかったので興味がわかなかった。

で、Launchy
これは素晴らしい。 Aqulina で不満に思っていたことがすべて解決している。

デフォルト状態では、 プログラムメニューの項目が登録されているので、「Alt + Space」 で何か入力すればある程度のプログラムは登録済みになっているはず。
まぁ、以下の Vector の説明を読むのがいいかもしれない。

インターネット検索やブックマーク検索にも対応したコマンドラインランチャ - Vector

自分の使い方としては、ショートカットを置くフォルダを切って、そこにドバドバとショートカットのリンクを置いている。ファイルの拡張子でフィルタをかけられるし、フォルダ階層の設定もできるので、余計なファイルがひっかかってこなくて便利。

注意点としては、拡張子すべてを対象に登録したい場合は、「.lnk」 ではなく 「*.lnk」 と、ワイルドカード指定をしてあげる必要がある。 逆に言うと、ファイル名を厳密に指定して登録することもできるわけだ。

2012/05/28

[Google 日本語入力] ひらかな入力に戻す

知らない間に半角英数に固定化されている時がある。
キーボードの「変換」キーを押下しても戻らないという、わけのわからん挙動になっている時は、「カタカナ・ひらがな・ローマ字」キーを押下すると戻る。

2012/05/26

[ubuntu 12.04] パッケージファイルのダウンロードに失敗しました。

アップデートマネージャーからアップデートしようとしたら、こんな表示が出てアップデートできなくなってしまった。 端末を呼び出して、以下のコマンドをたたく。
sudo apt-get autoclean
で、さらにこれを。
sudo apt-get update
エラー表示されていたアップデート情報が削除されるようだ。 やはりコマンドから色々やった方が便利なことが多いみたいね。

2012/05/24

[Excel] Windows 7 で、Excel ファイルを別ウィンドウで複数開く。

Windows Vista / 7 以降は、フォルダオプションの 「ファイルの種類」 から新しいウィンドウで開く設定が行えなくなった。解決策としては、レジストリを設定するしかないのだが、そうまでしたくない場合には以下の Excel アドオンを使用するとよい。

別のウィンドウで開く - Vector

このアドオンをインストールすると、表示メニューに 「別のウィンドウ」が追加される。
いちいち確認ダイアログが出たり、一度開いてからじゃないとウィンドウが分離できなかったりと、細かい使い勝手は好みがあるだろうが、別のウィンドウで開きたいならこれで十分だろう。

[Google] "インターネットをもっと快適に。" ボタンを非表示にする (笑)

Chrome 以外のブラウザで Google にアクセスすると、トップページに 「インターネットをもっと快適に。Google Chrome をインストールしよう」 という表示がされる。これはログインボタンのそばにあって、目障りに感じている人も多いようだ。

まぁ、一度閉じるボタンを押すと表示されないようになって いるのだが、「Chrome なんか見るのもうざい!」 という男気あふれる Firefox 使い (笑) は、 Stylish というアドオンでこの表示を強引に消すことができる。
  1. Stylish をインストール。
  2. Firefox のアドオンページを開いて、「新しいスタイルを書く」 で編集画面へ。
  3. スタイルを追加する。
[追加するスタイル]
@namespace url(http://www.w3.org/1999/xhtml);
    #pmocntr2.pmoabs {
        visibility: hidden !important;
    }
}

ちょっと無理やりすぎるうえに、仕様変更された場合には対応できないが、これでクリーンなGoogleトップページを取り戻すことができる (笑) 。

2012/05/23

[Firefox 13 Beta] 新機能 SPDY とホームボタンがいい感じ


Chrome のメモリ使用量がひどすぎるので、Firefox に戻してみたんだが、メモリ使用量は最近の Firefox の方が少ない印象。さらに、現在ベータ版が公開されている 13 はけっこういい感じ。全体的にキビキビしている。あと、スムーズスクロール機能がなめらか。
メモリ使用量の少なさと表示の速さを武器にしていけば 、まだまだ他のブラウザに対抗できる実力はあるね。

2012/05/22

[Firefox] テキストの書式を無視してコピー & ペースト


Copy Plain Text 2ページ内のテキストをコピー & ペーストする際に、書式を無視してコピーすることができる Firefox の拡張機能。書式だけではなく、余計な空白や行の削除もできる。
設定は、アドオンのメニューから行う。

Firefox 12 にも対応したものは、これくらいしか見当たらなかった。他のものはインストールしたり、以前のバージョンしか対応していなかったりと残念な感じのアドオンが多い。

ちなみに、Chrome にも同様のものがある。

[C#] リソースファイル (.resx) から文字列を読み込む

リソースファイルは画像や国際化対応などにも使うが、単純にエラーメッセージ等を格納しておくのにも便利だ。で、このリソースファイルの簡単な取得方法をメモ。
 // 名前で直接アクセスする。
 string msg1 = Resources.Resource1.MSG001;
 // 引数として名前を与える。
 string msg2 = Resources.Resource1.ResourceManager.GetString("MSG001");
実際にはユーティリティクラス等を別に用意して、各画面からアクセスするような使い方になるだろう。

方法 : プログラムでリソース値を取得する - msdn

2012/05/21

[C#] テキストファイルを検索しながら効率的に読み込む File.ReadLines メソッド

.NET Framework 4 から追加された System.IO.File.ReadLines メソッド は巨大なファイルの読み込みにも対応した便利なメソッドだ。
サンプル・テキストファイル (d:\test_utf8.txt)
Michael Williams
Christopher White
John Taylor
Robert Smith
James Jones
Charles Johnson
Daniel Thomas
Mark Wilson
John Williams
William Thomas
Christopher Jackson
William Thomas
Charles Thomas
Michael Smith
Thomas Jones
Richard Taylor
Michael Johnson
Mark Smith
Michael Miller
Paul Wilson
using System.IO;

 foreach (var line in File.ReadLines(@"d:\test_utf8.txt").Where(line => line.Contains("Taylor")))
 {
  Console.WriteLine(line);
 }

 // 出力
 // John Taylor
 // Richard Taylor

テキストファイルを読み込みつつ、"Taylor" が含まれる行を検索して列挙している。これが一行で完結してしまうのだからすごい。
ただ、一つだけ注意しなければいけないことは、テキストファイルのエンコードである。
UTF-8 の場合はそのまま読み込むことができるのだが、日本語が含まれた Shift-JIS などのエンコード形式のファイルは文字化けする。
その場合は、エンコード形式を指定する必要がある。

サンプル・テキストファイル (d:\test.txt)
いちろう やまだ
じろう すずき
たろう やまだ
しろう やまおか
ごろう やまもと
using System.IO;

 foreach (var line in File.ReadLines(@"d:\test.txt", Encoding.GetEncoding("Shift_JIS")).Where(line => line.Contains("やまだ")))
 {
  Console.WriteLine(line);
 }

 // 出力
 // いちろう やまだ
 // たろう やまだ
エンコードは注意。

[Windows7] デスクトップの表示を無効化する


Windows7 のタスクバーの端にあるボタンのような部分にマウスを持っていくと、勝手に全ウィンドウが半透明になり、デスクトップが表示される。……はっきり言ってうっとうしい機能だ。ちょっとマウスが触れただけで半透明になってしまうのだから。


これは、そのままそのボタンを右クリックして、デスクトップのプレビュー、のチェックを外すと無効化できる。

2012/05/18

[秀丸] 文字数カウント用マクロのまとめ


文字数を数えるマクロも様々あるのだが、古い環境向けで使えないものも多々ある。

マクロの置き場所も Windows 7 (Vista 以降) 環境では、
%UserProfile%\Application Data\Hidemaruo\Hidemaru\Macro
に変わっているし (別にここでなくても良いのだが) 。

いくつかあるマクロを使ってみた。
  • 文字数数えます。
    文字数を数える、という要求を見事に果たしてくれる。シンプル イズ ベスト。
  • 文字数カウントマクロ
    はじめに上限値を入力して、オーバーしているかどうかの判定を行う多機能マクロ。
    バイト数と文字数が詳細表示される。ひと手間かかるが、文字の上限が決められている場合には便利。
  • 文字数・語数を数えるマルチマクロ
    かなりの多機能マクロだが、実行に 「田楽DLL」 という dll を用意しなければならないので使うまでに少しめんどくさい。
  • 選択文字数カウントマクロ
    バイト数から文字数を数えているので、全角文字が入っていると正しくカウントできない。文字数カウントではなく、バイト数カウントと改名した方が良いのではないか… …。
マクロの登録は、メニューの [マクロ] - [マクロ登録] から行える。
まぁ、サクラエディタを使えば普通に数えてくれた気がするのだが……。

[SQL Server] インストール済みのデータベースのバージョンを確認する。

様々なバージョンの SQL Server をインストールしていると、どのバージョンのデータベースがインストールされているかわからなくなる時がある (と思うw) 。あらかた把握はできるのだが、たとえばサービスパックの適用の有無等も含めて正しいバージョンを確認したいときのメモ。
  1. スタートメニューから、Microsoft SQL Server を開く。
  2. [構成ツール] - [SQL Server インストール センター] を開く (要管理者権限)。
  3. [ツール] - [インストール済み SQL Server 機能の検出レポート] を開く。
  4. ブラウザにてレポートが表示される。
これでレポート表示されるのはいいんだが、バージョンは数値でしか表示されない (笑)。
主要な SQL Server のバージョン番号は以下の通りになっているそうだ。
  • SQL Server 2008 R2
    Service Pack 1 : 10.50.2500.0
    RTM : 10.50.1600.1
     
  • SQL Server 2008
    Service Pack 3 : 10.00.5500.00
    Service Pack 2 : 10.00.4000.00
    Service Pack 1 : 10.00.2531.00
    RTM : 10.00.1600.22
     
  • SQL Server 2005
    Service Pack 4 : 9.00.5000.00
    Service Pack 3 : 9.00.4035
    Service Pack 2 : 9.00.3042
    Service Pack 1 : 9.00.2047
    RTM : 9.00.1399
簡単に言うと、10.5 系統が 2008 R2。10 系統が 無印 2008。9 系統が 2005 である。
詳細は、Microsoft のサポートサイトに掲載されている。
SQL Server とそのコンポーネントのバージョンとエディションを確認する方法 - support.microsoft.com

2012/05/17

[7-Zip] PowerShell のコマンドラインから圧縮して、自動バックアップスケジュールを組む

7-Zip は優秀なファイルアーカイバであるが、素晴らしいことにコマンドラインから操作することもできる。これによりバッチで定期的にファイルを圧縮してバックアップということが簡単に行える。PowerShell からでも簡単な記述で圧縮可能。
7-Zip のコマンドライン版は、ここからダウンロードできる。
# 圧縮対象フォルダ
$copyFolderName = "wk"
$copy = "D:\" + $copyFolderName

# 圧縮先 (圧縮元フォルダ名)
$destinationFolder  = "D:\"
$destination = $destinationFolder + (Get-Date -Format yyyyMMdd) + "_" + $copyFolderName + ".7z"

# -MMT=ON:マルチスレッド
# -MX=9:圧縮率 (9=高圧縮)
# -SSW:開かれているファイルも圧縮対象ファイルとして含める
D:\7za.exe a $destination $copy -MMT=ON -MX=9 -SSW
上の例だと、7-Zip 本体が D ドライブに配置してある想定。「D:\wk」 フォルダを圧縮日を付与したファイル名で 7z 形式に圧縮している。コメントにある通り、オプションでマルチスレッドにも対応している。
-SSW スイッチは、圧縮時にファイルが使用中だった場合 (Excel ファイルが開かれている等) 、そのファイルも圧縮対象に含められるようになっている。このオプションを付けないと、ロックされているファイルは圧縮されないので注意。

PowerShell での例だが、ようは 7-Zip のパスを指定して、"a {コピーファイルパス} {コピー元パス}" と、記述しているだけ。


これを 「.ps1」 形式で保存して、タスクスケジューラーに登録すると自動バックアップができる。PowerShell が入っていればの話だが (Windows 7 以降なら問題ない) 。

ただし、注意しなければいけないのは、操作の編集ではプログラムに 「powershell」、引数の追加に対象の 「.ps1」 ファイルを指定する。

2012/05/16

[C#] enum の ToString() は確かに遅いが……

enum (列挙型) の ToString() メソッドは、確かに遅い。遅いんだが、何十万回と繰り返した時にその差がはっきりするわけで、そんなにループするような処理は現実的ではない。それでもまぁ、パフォーマンスが良い方を選択するのが良き実装者という感じか。
 using System.Diagnostics;

 Stopwatch sw = new Stopwatch();
 sw.Start();
 for (int i = 0; i < 100000; i++)
 {
     string s = SampleNames.hans.GetDisplay();
 }
 sw.Stop();
 long millisec = sw.ElapsedMilliseconds;
 Debug.WriteLine("拡張メソッド : " + millisec.ToString() + "ミリ秒");

 sw.Start();
 for (int i = 0; i < 100000; i++)
 {
     string s = SampleNames2.ジョン.ToString();
 }
 sw.Stop();
 millisec = sw.ElapsedMilliseconds;
 Debug.WriteLine("ToString() : " + millisec.ToString() + "ミリ秒");

 // 出力結果
 // 拡張メソッド : 1ミリ秒
 // ToString() : 75ミリ秒
数値だけ見ると、たしかに遅い (笑) 。
あとは、enum が日本語名の変数にしないと名前が取れないので、スマートではないように見えるという主観的な話だけか。


ただ最近は、インテリセンスに 「使用しないでください」 と出るのね。
FlagsAttribute を指定すると、戻ってくる値が安全ではないから推奨されないとかなんとか。

[MyDefrag] スケジューリングされた MyDefrag の UAC ダイアログをスキップする

MyDefrag は完成度の高いデフラグソフトで、HDDの端末では自分も愛用している。
また、インストール時にタスクスケジューラーに登録してくれて、毎日知らずにデフラグすることもできる――できるのだが、Windows Vista や Windows 7 以降だと、スケジューリングされた時間になるといきなり UAC (ユーザーアカウント制御) にひっかかるw

これを変更するには、タスクスケジューラーの設定を変えなければならない。
  1. マイコンピューターを右クリックして 「管理」 を開く。
  2. システム ツールのタスク スケジューラを開く。インストール時にスケジューリングする設定をしていれば、MyDefrag のスケジュールが登録されているはずなので、これをダブルクリックして開く。
  3. 「最上位の特権で実行する」 にチェックオン。
    ログオンに関わらず実行は、ログオフする機会があるならチェックしておく (これを設定するとログオンするアカウントのパスワードを求められる) 。



以上の設定をすることによって、完全自動でデフラグしてくれる。

[Chrome] Chrome19 でも MacType は動作 OK

Chrome 18 にアップグレードした時は、gdi++ 騒動で阿鼻叫喚だったが (笑)、Chrome 19 では、MacType の設定はそのまま有効なようだ。

今回の新機能であるタブ追加機能は、Chrome にログインしないと有効にならないのだが、Chrome にログインするとデフォルトではブックマークなども同期されて、ちょっと気味が悪かったのであまり印象はよくない。個人的にはこの機能を使うことはないだろうな……。

2012/05/15

[smtp4dev] 開発時に便利な SMTP サーバで メール送信のテストをする

【 追記 】
smtp4dev は、開発が進み現在は別のものとなっている。
下記の記事にあるバージョンは、v2.0 となった。

https://github.com/rnwood/smtp4dev/releases/tag/v2.0.10
smtp4dev-{ バージョン }.msi



Web アプリケーションでは、メール送信機能の要望がほぼあるといっていいだろう。しかし、開発時にうっかり本番データでメールの誤送信をしてしまうこともよくある話。そんな時は、気軽に SMTP サーバを立てられる smtp4dev というアプリが便利である。


特に難しい設定等はない。起動すれば待機状態になる。
using System.Net;
 using System.Net.Mail;
 
 var client = new SmtpClient("localhost");
 client.Credentials = new NetworkCredential("user", "");
 
 // メール本文を作成
 var msg = new MailMessage();
 msg.From = new MailAddress("test@exsample.com");
 msg.To.Add("test_to@exsample.com");
 msg.Subject = "【テスト】送信テスト";
 msg.Body = "ローカルから送信するテスト。";
 
 client.Send(msg);
メール送信用サンプルソースを動かすと、こんな感じにメールが到着する。適当なユーザ名でも認証され、メール送信が行われる。

日本語環境でも問題なく表示される。
メール送信テスト時の「うっかり」も防げるし、サーバを立てる手間も省けるし、役に立つ。

[QTTabBar] 新しいタブを開くときにマイコンピューターを指定する

QTTabBar は、Windows のエクスプローラーをタブ化できる便利なソフトウェアだ。きめ細かいカスタマイズが可能である。

機能の一つとして、タブバーをダブルクリックして新しいタブを開く先に、パスを指定することができる。これにマイコンピューターをしたいのだが、デフォルト状態ではマイコンピューターの設定はできない。


これを設定するには、「パス / グループ名 : 」に直接以下のパスを指定する。
::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
これは Windows の特殊フォルダにアクセスするためのコマンドであるが、この指定でマイコンピューターを新しいタブを開いた際のデフォルト設定にすることができる (コロンも入れること) 。

あまり意味はないが、以下のように設定すると、「ごみ箱」 をデフォルトにすることもできる (笑) 。
::{645FF040-5081-101B-9F08-00AA002F954E}
興味がある方は、Windows の特殊フォルダで調べてみるといいかもしれない。QTTabBar の設定として使えるかどうかは不明だが……。

2012/05/14

[PowerShell] 文字列をヒアドキュメントで出力する

改行をはじめ、ダブルクォーテーションやシングルクォーテーションを含んだ長い文字列を出力させる際には、ヒアドキュメントとして出力した方が確実だ。
$hoge = "john"
Write-Output @"
私の名前は
$hoge です。

"$hoge" なんですよ。
"@

# 出力
# 私の名前は
# john です。
#
# "john" なんですよ。
`@ の後は改行させること。

[PowerShell] 文字列の自動展開

PowerShell の文字列の扱いについて、ちょっと Ruby に似ている面白い挙動がある。
$hoge = "john"
Write-Host "私の名前は $hoge です。"
# 出力
# 私の名前は john です。

Write-Host '私の名前は $hoge です。'
# 出力
# 私の名前は $hoge です。
「 " 」 (ダブルクォーテーション) の場合は、変数名を引用符の中に含めてあっても自動的に展開してくれる。しかし、「 ' 」 (シングルクォーテーション) の場合は、そのまま文字列として出力される。Ruby と違って式 ( #{ } ) で囲む必要はない。
エスケープシーケンスでも、同様の展開が行われる。
$hoge = "john"
Write-Output "私の名前は`n$hoge です。"
# 出力
# 私の名前は
# john です。
覚えておくといいかもしれない。

[PowerShell] 文字列出力とコマンドモード・式モードの解釈

PowerShell で文字列を出力する際には、 PowerShell のクセを把握しておく必要がある。
Write-Host "ho" + "ge"
# 出力結果
# ho + ge

Write-Host "ho" + "ge" -foregroundcolor red
# 出力結果
# ho + ge (文字色が変更される)
Write-Host は、改行が入らない。
Write-Output "ho" + "ge"
# 出力結果
# ho
# +
# ge
echo "ho" + "ge"
# 出力結果
# ho
# +
# ge
Write-Output と echo は改行が入る。
改行の有無というよりも、コマンドモードとして解釈されていることを理解しなければならないらしい。しかし、以下の書き方では式モードとして解釈される。
Write-Host ("ho" + "ge")
# 出力結果
# hoge
 $hoge = "ho" + "ge"
 Write-Host $hoge
 Write-Output $hoge
 echo $hoge
 # 出力結果
 # hoge
このような書き方だと式モードとして解釈され、すべて同じ出力となる。

コマンドモード (command mode) と式モード (expression mode)

コマンドモードと式モードというのは、ちょっと複雑だ……。
  • コマンドモード
    文字、「&」 (アンパサンド) 、「 . 」 (ピリオド) で開始。その後に空白、文字が続く場合。
  • 式モード
    数値、変数、引用符で囲まれた文字列の場合。

[Chrome] 書式を無視してコピー & ペーストする


ページ内のテキストをコピー & ペーストする際に、貼り付け先に書式までコピーされてしまう うっとうしさにオサラバできる Chrome の拡張機能。
設定は特に複雑な部分はないが、デフォルトだと 「Ctrl + Shift + C」 で書式なしコピーに設定されている。書式なんていらん、という場合は、通常のコピーコマンド (Ctrl + C) に変更するといいだろうね。

2012/05/11

[PowerShell] Office 365 の特定のユーザーを検索して CSV 出力

Office 365 のユーザーデータを抽出して、CSV に出力するサンプル。
 # 認証済みである前提。
 # 山田 さんを出力。
 Get-MsolUser | where {$_.LastName -like "山田"} | Export-Csv d:\users.csv -Encoding utf8
この例では LastName が "山田" である人を抽出し、D ドライブに CSV 出力している。
注意しないといけないのは、データに日本語 (マルチバイト) が含まれている場合は Unicode で出力しないと日本語部分がうまく出力されない。CSV 出力の際にはつねにエンコードに気を付けなければならない。
当然ながら、出力先に書き込みの権限がある事。

[PowerShell] Office 365 へ接続

Office 365 の管理には PowerShell が利用できるが、
コマンドから管理を行った方が便利であることの方が多い。
接続は以下の通り行う。
 # Office 365 にログイン
 $user = " < 管理者用メールアドレス > "
 $cred = Get-Credential -Credential $user

 Import-Module MSOnline
 Connect-MsolService -Credential $Cred

 # Exchange の機能を使う場合のみ
 $msoExchangeURL = “https://ps.outlook.com/powershell/”

 $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $msoExchangeURL -Credential $cred -Authentication Basic -AllowRedirection
 Import-PSSession $session

 # Exchange にログインした場合のみ、処理終了後にセッションをクリアする方が良い
 #Remove-PsSession $session

いくつか注意点。

  1. 管理者用アカウント
    管理者以外のアカウントでは、ログインはできるものの、自分しかいじることができない。 Get-MsolUser ですら、ほかのユーザーの情報を表示できないので (※アクセスが拒否されました。このコマンドレットを呼び出すためのアクセス許可がありません) 、色々な操作を行うなら管理者アカウントでログインした方が良い。
  2. Exchange について
    Exchange のログインは、機能を使わないのであればログインしなくてもよい。ログインした場合は処理の最後で明示的にセッションをクリアした方が良いみたい。
  3. Office 365 コマンドレット
    PowerShell で Office 365 を管理するなら、まずコマンドレットをインストールする必要がある。また、PowerGUI で Office 365 のインテリセンスを有効にするには、[ファイル] - [PowerShellライブラリ] から MSOnline を有効にする。

[PowerShell] GUI 操作の PowerGUI エディタが便利

Windows 7 では標準である PowerShell 。
DOS 窓みたいな画面から延々と操作してもよいのだろうが、やはりヌルい初心者としては、エディタがあると学習もはかどる。


標準では Windows PowerShell ISE という GUI ツールがあるのだが、PowerGUI というツールもある。使ってみた感じ、こちら方が便利だった。
アイコンの列車がよくわからんセンスだがw 日本語にも対応しているし、インテリセンスも強力だし、なによりエディタのフォントがすぐに変えられるのがいいね (PowerShell ISE のフォント変更はここで紹介されている) 。

2012/05/10

[Firefox 12] 新機能 (よく見るページ一覧) を設定

FIrefox 13 から、新しいタブを開いたときに履歴から "よく見るページの一覧" が表示されるようになる。他のブラウザにはすでに実装済みである機能だが、Firefox 12 でも実験的にこの機能を ON にすることができる。

まずはおなじみのアドレスバーに 「about:config」 を入力。
browser.newtab.url の値を about:newtab に変更。

browser.newtabpage.enabled の値を true に (ダブルクリックすればよい)。

Firefox を再起動すれば、新しいタブを開いた際によく見るページが一覧表示される。

2012/05/09

[ASP.NET MVC 3] バリデーション実装


ASP.NET Web フォームでは、バリデーションのコントローラーを配置して、すぐにできたものだったが、ASP.NET MVC では多少やり方が異なる。いくつか方法があるようだが、今回はモデル側で発生したエラーを表示する方法を試してみた。

Model
 public class UserInfo
 {   
  [Display(Name = "年齢")]
  [Required(ErrorMessage = "年齢が入力されていません。")]
  public int Age { get; set; }
    
  [Display(Name = "名前")]
  [Required(ErrorMessage = "名前が入力されていません。")]
  public string Name { get; set; }
 }

View

バリデーション・サンプル

@Html.ValidationSummary(false)
登録情報 名前: @Html.TextBox("Name", Model.Name) @Html.ValidationMessageFor(m => m.Name, "*") 年齢: @Html.TextBox("Age", Model.Age.ToString()) @Html.ValidationMessageFor(m => m.Age, "*")
@Html.ValidationSummary(false) が、Web コントロールでいうところの ValidationSummary にあたる。それぞれのコントロールに設定してある @Html.ValidationMessageFor(m => m.Name, "*") が Validator といったところか。
一番簡単なバリデーションは、これで実装できる。

MVC3 のバリデーションについては、以下の記事が参考になる。
連載:ASP.NET MVC入門【バージョン3対応】 第3回 モデル・バインドとアノテーション検証の実装 - @IT

[ASP.NET MVC] 正規表現で URL ルーティングを設定する

ASP.NET MVC でのルート定義について、様々なパターンを紹介している。
ハマりやすいポイントは、URL ルーティングは登録順に判断されるので、汎用的な定義を一番初めに定義してしまうと、それにマッチしてしまい、以降の定義はすべて無視されてしまう。

また、パラメータに正規表現で制約をかけるときには注意?が必要 (msdn の記事にて触れている) 。
 routes.MapRoute(
    "Reports",
    "Reports/{id}",
    new { controller = "Reports", action = "Details", id = @"\d{4}" }
    );
4 ケタの数値という制限を付けようとしても、これでは駄目である。正規表現は、MapRoute の第 4 引数で定義しなければならない。
routes.MapRoute(
    "Reports", 
    "Reports/{id}", 
    new { controller = "Reports", action = "Details" }, new { id = @"\d{4}" }
    );
これで OK なのだが、実際にこの制約以外のアクセスをたたくと、エラーが発生する。



URL リライトの時点で弾くか、プログラム内でパラメータをチェックするのかは実装方法によって様々だろうが、URL リライトで弾く場合は、エラー画面に飛ぶということは覚えておかなければならない。

なお、ASP.NET WEbフォームを使ったアプリケーションでも、ASP.NET 4.0 から URL のルーティングがサポートされている。
Web フォームの場合でも、URL 自体はルーティングしたものとなるが、実際には該当するページにポストバックを行っている。

2012/05/08

[.NET] ASP.NET MVC について調べてみた

ふと思ったこと

どちらかというと、ASP.NET は社内で使用する業務系アプリの作成で使用されることが多く、そのような案件も多いと思う。しかし、まだまだ .NET Framework 2.0 (Visual Studio 2005) のものが残っているのではないかと思う。

しかし、(事情はいろいろあるにせよ) そういう案件にばかり触れていると、ASP.NET MVC や LINQ といった技術についていけなくなってくる。そろそろそれら最新 (でもないが) の環境にアップデイトしないと .NET 開発者は置いてきぼりを食う時期に来ているのだと感じる。

もちろん、ASP.NET 2.0 でもデザインパターンを利用して厳格な設計がされたものもあることは知っている。意味もなく最新の環境にすればよいというわけでもないとは思うが。
それでも、選択肢の一つとして知っておくほうが良いと思う。自分もそう思ったので。

さて、ASP.NET MVC については、以下の記事が参考になる。
基本的に、上の二つの記事は同様のことを書いているのだが、@IT の記事は、初めにバージョン 3 対応版を読み流してから、再度入門を読むと理解が深まった。 
概念的な部分は msdn の記事が役立つ。

で、MVC とは何?

結局のところ、ASP.NET Web フォーム (従来までの ASP.NET) と、ASP.NET MVC は共存共栄していくのだと感じた。各所でも、そういわれている通り、そう感じた。

ASP.NET MVC
  • 画面とコードが完全分離。html の出力等も完全に制御できるし、URL も SEO に有利なものになる。
    デザイナとの分業が容易であり、外向けサイトに向いている。モバイル対応にも最適。
  • テストの自動化。
  • Java や php 開発をしてきた人にもわかりやすい概念モデル。

ASP.NET Web フォーム
  • 高い生産性。イベント ドリブンのわかりやすい実装。
  • ViewState による状態保持の容易さ。画面コントロールが多い場合にも楽に開発。
  • Windows フォームのアプリとコードが共有できる場合もあるので、 業務アプリには引き続きこちらが最適だと思う。

現存あるシステムを、無理して ASP.NET MVC に変更する必要はもちろんないわけだが。ただ、どちらの場合でも LINQ や ADO.NET Entity Framework などといった新しいことは覚えておくといいのだろう。

2012/05/07

[C#] Null 非許容の値型であるため、null を 'int' に変換できません

参照型は null が許容されているが、値型は null が許容されていない。この制約は、null 許容型を使用することで回避できる。回避するだけならね。
 int? i = null;
 int? j = 3;
 System.Diagnostics.Debug.WriteLine(i + j);
 // 出力: null
この、?マークがついた宣言が null 許容型となる。値が入っていれば、そのままその値が評価されるが、null の場合は評価されない。上記の例でいうと、計算自体が行われないで null として評価されるのだ。
また、null 許容型は、三項演算子のように条件式を書くことができる。
 int? i = null;            
 System.Diagnostics.Debug.WriteLine(i ?? 0);
 // 出力: 0
null 許容型については、@IT の記事が参考になる。

for Visual Basic
 ' VB の場合、null 許容型は以下の書き方ができる。
 Dim i As Integer? = Nothing
 Dim ii? As Integer = Nothing
 Dim iii As Nullable(Of Integer) = Nothing

 Dim j As Integer = 3
 System.Diagnostics.Debug.WriteLine(i + j)
 ' null 許容型の判断(VB)
 Dim k As Integer? = Nothing
 System.Diagnostics.Debug.WriteLine(If(k, 0))

[SP モード] 送信できない文字コードが含まれています

これは、送信できない文字コード (多くの場合は使用できない顔文字) が含まれている場合に出ることが多いようだが、他のアプリから文字をコピー&ペーストした際に、まれにコピー元の文字コードが異なっていてチェックに引っかかる時がある。

自分の場合は Evernote に保存してあった文字列が、文字コードが違うということでチェックに引っかかっていた。見た目上は正しい文字列なので原因がわかりづらい。
貼り付け時に、あくまでプレーンテキストでないと、内部的に持っている文字コードでチェックに引っかかることがあるようだ。

しかし、このエラーメッセージ。どこがひっかかっているのかさっぱりわからない。どうしようもない設計だ……。

[C#] デバッグ時のみ実行・出力させる

プリプロセッサ ディレクティブ - msdn を利用することで、デバッグ時のみ実行する命令や、エラー、通知などを細かく制御することができる。
 #if DEBUG
   System.Diagnostics.Debug.WriteLine("デバッグモードで実行");
 #endif

[実行結果]
ただし、いくつか注意点がある。
  • #if DEBUG は、「#if debug」 では動作しない。 DEBUG や Debug は無視される。
  • リリース・ビルドは条件として存在しない。
また、シンボルを独自に定義することで独自の条件を追加することができる。

プロジェクトのプロパティから、"TEST" というシンボルを追加。
 #if TEST
   System.Diagnostics.Debug.WriteLine("シンボル追加");
 #endif

出力ウィンドウに文字列が出力される。独自に定義したシンボルを条件とすることができるはず。

VBの場合は、以下のようになる。基本的には同じ。
 #If DEBUG Then
   System.Diagnostics.Debug.WriteLine("デバッグモードで実行")
 #End If
Related Posts Plugin for WordPress, Blogger...