[IME] Management Studio で、IME が日本語入力に勝手に変わる

SQL Server の Management Studio で、クエリを実行した後に IME が勝手に日本語入力に変わってしまうことがある。IME の相性かとも思うが、原因は不明で、Management Studio の再起動しかないらしい。
2014 になった今でも発生し続けるバグのような印象だ。

Management Studioでストアドを編集後、実行するとIMEが勝手にONになる。 - msdn
https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/559e4757-f601-486d-b2bb-3e04a3640483/management-studioimeon?forum=sqlserverja

[ASP.NET] クッキーレス・セッションが消える

やや枯れた話題であるが、ASP.NET アプリケーションにおいてクッキーレス・セッション機能を使用している場合に、セッションが消えてしまうことがあったので調べてみた。
結論から言うと、そもそも ASP.NET アプリケーションは、URL の大文字と小文字を区別するらしいので、相対パスでアドレスが厳密に一致していないと、画面は遷移するもののセッションが消えてしまうという挙動を見せる。

Cookieless Session State May Be Lost in ASP.NET Applications

機械翻訳版
http://support.microsoft.com/KB/828330

再現手順としては、以下のような例を挙げている。
http://localhost/WebApplication1/(uwvgovu0hljrmdqcl1aajf2f)/WebForm1.aspx

http://localhost/WEBAPPLICATION1/(uwvgovu0hljrmdqcl1aajf2f)/WebForm1.aspx
※ セッションが消える。

しかし、WebForm1.aspx を、webform1.aspx としてアクセスする場合にも同様にセッションが消える。

[ASP.NET] This application is currently offline.

This application is currently offline. To enable the application, remove the app_offline.htm file from the application root directory.

ルートに app_offline.htm ファイルがあると、アプリケーションが開始できない。

App_Offline.htm ファイルは、Web アプリケーションを一時的に停止するための特殊ファイルであり、このファイルがあるとデバッグもできなくなってしまう。

[ASP.NET]Webアプリケーションを一時的に停止するには?[2.0のみ]- @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/684appoffline/appoffline.html

[C#] ArrayList を string.Join で文字列結合する

ArrayList にセットされている文字列を、カンマ区切りの文字列として出力したい場合、foreach で回すのもいいのだが、string.Join メソッドを使用した方がスマートに出力できる。
ArrayList arr = new ArrayList();
arr.Add("山口太郎");
arr.Add("山田次郎");
arr.Add("山品三郎");
string s =  string.Join(",",(string[])arr.ToArray(typeof(string)));
// 山口太郎,山田次郎,山品三郎
Console.WriteLine(s);
あえて ArrayList を使用しなくても良いが、古いソースを改修する場合などのためのメモ。

[C#] SqlCommand.ExecuteScalar の戻り値が Null

あまり意識していなかったのだが、少々ハマった。
SqlCommand.ExecuteScalar メソッド「クエリを実行し、そのクエリが返す結果セットの最初の行にある最初の列を返します」とある。SQL でカウントなど の集計値を取る場合に使うことがあるが、サンプルを見ると、以下のようになっている。
 cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";
 Int32 count = (Int32) cmd.ExecuteScalar();
しかし、結果セットがない場合(レコード件数ゼロ)、上記の式だと Int に変換できずに System.NullReferenceException (オブジェクト参照がオブジェクト インスタンスに設定されていません)が発生する。
Int32 count = (Int32) cmd.ExecuteScalar();
cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";
object value = cmd.ExecuteScalar();
if (firstColumn != null) {
  count = Convert.ToInt32(value);
}
クエリ次第なところがあるのだろうが、やはり一旦チェックは行ったほうが良いのではないか?

[C#] StringBuilder の AppendLine の終端文字列

StringBuilder の AppendLine メソッドは、ログ出力等の人の目で確認する場合に見やすく出力させたい場合によく使用されるが、これはメソッドが \r\n を自動的に追加してくれるもので、最後の文字列を何かしたい場合は気をつけなければならない。
var sb = new StringBuilder();
sb.AppendLine("AAAA,");
sb.AppendLine("BBBB,");
sb.AppendLine("CCCC,");
// "AAAA,\r\nBBBB,\r\nCCCC,\r\n"
var val = sb.ToString().TrimEnd(',');

var sb2 = new StringBuilder();
sb2.AppendLine("AAAA,");
sb2.AppendLine("BBBB,");
sb2.AppendLine("CCCC");
sb2.Append(",");
// "AAAA,\r\nBBBB,\r\nCCCC\r\n"
var val2 = sb2.ToString().TrimEnd(',');
改行コードが必要いなら、String.Join メソッドで連結したほうがスマートだが、改行コード付きとなると自分で改行するしかないか…。
見た目はきれいに出力してくれるのだがね。
var lst = new List();
lst.Add("AAAA");
lst.Add("BBBB");
lst.Add("CCCC");
// "AAAA,BBBB,CCCC"
var val3 = string.Join(",", lst);

[C#] StringBuilder の数値計算

StringBuilder.Append メソッドを使用して文字列を連結する際に、引数に数値型が含まれている場合の挙動には注意を払う必要がある。
int price = 10000;
int tax = 800;

StringBuilder sb = new StringBuilder();
sb.AppendLine("合計金額 = " + price + tax);
sb.AppendLine("消費税 = " + price * 0.08);

// 合計金額 = 10000800
// 消費税 = 800
Console.WriteLine(sb.ToString());

文字型への変換が必要だと思われるが、プラス(+) を使用すると文字列として連結される。しかし、他の演算子を使用した場合は計算後の結果が文字列として連結される。
結果ですぐに気づくだろうが、注意しなければならない。

[IIS7] アプリケーションプールをコマンドでリサイクルする

IIS7 から用意された Appcmd.exe により、コマンドから様々な操作を行うことができるようになった。以下の例では DefaultAppPool をリサイクルしている。

appcmd recycle apppool /apppool.name:"DefaultAppPool"

注意点は以下のとおり。

  1. コマンドプロンプトは管理者権限で実行すること(バッチファイルももちろん同じ)。
  2. name: の後ろにアプリケーションプール名を指定するのだが、ダブルクォーテーション ( " ) で囲まなければいけない。

他にも色々と管理上便利なコマンドが用意されている。

Appcmd.exe - TechNet
http://technet.microsoft.com/ja-jp/library/cc772200%28v=ws.10%29.aspx

[Google Chrome] 本体の場所

Google Chrome は Program Files にインストールされていないと思っていたのだが、バージョン 36 移行は 行儀よく Program Files にインストールするようだ。

Windows 7
C:\Users\Username\AppData\Local\Google\
Windows 8 や最近のバージョン
C:\Program Files (x86)\Google\Application\

[ASP.NET] Web サーバーでデバッグを開始できません

Web サーバーでデバッグを開始できません。統合 Windows 認証が無効になっているため、デバッグに失敗しました。詳細については、ヘルプを参照してください。

ASP.NET 2.0 のレガシーなアプリケーションをデバッグしようとしたら、いつか見たことがあるような悲しいダイアログが出る。以下を確認後、デバッグできるようになった。

Windows 認証の確認

そもそも Windows 認証が有効であるか確認。
  • コントロールパネル - プログラムと機能
  • Windows の機能の有効化または無効化
  • インターネットインフォメーションサービス - World Wide Web サービス - セキュリティ - Windows

IIS の設定

  • コントロールパネル - 管理ツール - インターネット インフォメーション サービス (IIS) マネージャー
  • 対象となるアプリケーションの 「認証」
  • Windows 認証を「有効」にする。

環境 : Windows 7, IIS 7.5

[C#] String.Split メソッドで空白データを除外する


String.Split メソッドに StringSplitOptions 引数を指定すると、空の配列要素が除外される。しかし、実際には空文字で構成されたデータを除外することができない。
ここでいう空の配列要素とは、あくまで区切り文字が連続で続いていたケースのみを指すのだ。

完全に除去したいのなら、ラムダを使用すると一行で消せる。
var ret1 = mail.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
// [1] test1@exsample.com
// [2]
// [3] test2@exsample.com

var ret2 = mail.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x));
// [1] test1@exsample.com
// [2] test2@exsample.com

// char で区切り文字を指定すれば、そもそもオプションはいらない。
var ret3 = mail.Split(new char[] { ';' }).Select(x => x.Trim()).Where(x => !string.IsNullOrWhiteSpace(x));
// [1] test1@exsample.com
// [2] test2@exsample.com 

String.Split メソッド
http://msdn.microsoft.com/ja-jp/library/System.String.Split(v=vs.110).aspx

[Explzh 64bit] .tar.xz ファイルを解凍する


SourceForge にある圧縮ファイルでよく使用されている .tar 形式を Explzh で解凍するためのメモ。
Explzh は tar ファイルの解凍もできるのだが、[メニュー] - [アーカイバ DLL の自動ダウンロード] を行ってもエラーが出るだけで、手動で DLL を導入しなければならない。

DLL 自体は、以下のウェブサイトで配布されている方がいるのでそれを使用する。

綾川的趣味之接続集
http://homepage1.nifty.com/Ayakawa/index.html
[Software] -> [tar64.dll ver 2.42 私家版]

ダウンロードした tar64.dll を、C:\Windows\System32 フォルダへコピーする。
(実は、C:\Program Files\Explzh へコピーしても動作する。あまり好ましくないと思うが……)

Explzh for Windows
http://www.ponsoftware.com/

[Explzh] 圧縮後の拡張子

"Explzh for Windows" で圧縮を行った際に、圧縮後の拡張子が小文字になったり大文字になったりと意味不明な挙動を見せるのだが、試しに検証してみると、圧縮対象のファイル名によって法則があるようだ。

小文字の拡張子になるケース

圧縮しようとするファイル名がすべて小文字。 2 文字目が小文字。
  • test1.txt → test1.zip
  • TeEST4.txt → TeEST4.zip

大文字の拡張子になるケース

圧縮しようとするファイル名がすべて大文字。 2 文字目が小文字。

  • TEST2.txt → TEST2.ZIP
  • tEST3.txt → tEST3.ZIP
複数のファイルを圧縮する際には複雑な仕様になっていそうだが、とりあえず元のファイル名によって拡張子が変わるらしい。圧縮後に自分で拡張子を変更すれば良いだけの話だが、はじめから固定で指定できるようになっているといいと思う。

Explzh
http://www.ponsoftware.com

[C#] DataRow から値を取得する(タイプセーフ)。

DataRow.Field は、.NET Framework 3.5 で拡張されたメソッドである。
DataRow といえば、アクセスする際に毎回型変換を明示的に書いていたものだが、Field メソッドを死傷することで、明示的に型を指定してアクセすることができる。
また、最大の違いは NULL 許容型がサポートされたこと。これにより取得したオブジェクトの中身が NULL であった場合でも長々と NULL チェックを書かなくても良くなった。セットした後の値の扱いは今までどおり注意を払う必要があるが、従来よりもスマートな書き方ができるようになったと思う。
DataTable dt = new DataTable();
// なんかデータ取得。

foreach (DataRow dr in dt.Rows)
{    
    // 従来までの書き方。
    string sHogeOld = (string)dr["HOGE"];
    // 値型は変換できない場合は落ちる。
    int iHogeOld = (int)dr["HOGEE"];

    string sHoge = dr.Field<string>("HOGE");
    // 値型でも、NULL 許容型にしておけば、いきなり落ちることはない。
    int? iHoge = dr.Field<int>("HOGEE");
}

DataRow.Field メソッド | msdn
http://msdn.microsoft.com/ja-jp/library/system.data.datarow.field%28v=vs.90%29.aspx

{SQL Server] 日付を曜日に変換する


日付から曜日を求めるには、DATENAME 関数を使用する。引数として正式には WEEKDAY を渡すのだが、これは DW や W だけでも良い。
結果は "曜日" と付くので、文字列を置換すると曜日のみ取得できる。
SELECT
 DATENAME(W, GETDATE()) AS 曜日
 ,DATENAME(DW, GETDATE()) AS 曜日
 ,DATENAME(WEEKDAY, GETDATE()) AS 曜日
 ,REPLACE(DATENAME(W, GETDATE()), '曜日', '') AS 曜日

[Opera] Chrome の拡張機能を使う


Opera はマイナーなブラウザではあるが、アドオンのひとつである Download Chrome Extension をインストールすると、なんと Chrome の拡張機能が使用できるようになる。 

Download Chrome Extension https://addons.opera.com/ja/extensions/details/download-chrome-extension-9/?display=en

インストールすると、Google Chrome の拡張機能ページの [CHROMEに追加] ボタンが、赤くなり、Opera にインストールできるようになる……のだが、Opera 26 では、Chrome ウェブストアからのリンクから表示させたアプリにはボタンが消えてしまっている。


検索をして、直接アプリを表示させた場合はボタンが出る。
いずれ解消されるのだろうが、Chrome の拡張機能が利用可能というのはかなり強力だ。