[C#] ContextSwitchDeadlock の例外

マネージ デバッグ アシスタント 'ContextSwitchDeadlock' では '' に問題を検出しました。
追加情報: CLR は、COM コンテキスト 0x352be0 から COM コンテキスト 0x352a70 へ 60 秒で移行できませんでした。ターゲット コンテキストおよびアパートメントを所有するスレッドが、ポンプしない待機を行っているか、Windows のメッセージを表示しないで非常に長い実行操作を処理しているかのどちらかです。この状態は通常、パフォーマンスを低下させたり、アプリケーションが応答していない状態および増え続けるメモリ使用を導く可能性があります。この問題を回避するには、すべての Single Thread Apartment (STA) のスレッドが、CoWaitForMultipleHandles のようなポンプする待機プリミティブを使用するか、長い実行操作中に定期的にメッセージをポンプしなければなりません。

長いメッセージだ。
Windows Form で長い処理を行っている間に、このようなメッセージが表示されることがある。
メッセージを出なくさせるには、ContextSwitchDeadlock の例外が出ても中断させないように設定すればよい (問題が解決したわけではないので、なんらかの対処は必要だろうが……)。

  1. デバッグ -> 例外 (Ctrl + D, E)
  2. Managed Debugging Assistants, ContextSwitchDeadlock のチェックをオフにする。

[Chrome33] User StyleSheets と、新しいタブの改悪が確定?


Chrome は勝手にアップデートされるので、ある日突然仕様変更が行われている。
そして、今回のアップデートで Custom.css が効かなくなったようだ。

これは Chrome で強制的にスタイルシートを適用させて、すべてのウェブサイトを好みのフォントで表示させるものだったのだが……。これがなくなるとフォントレンダリングのクソな Windows では痛い。

そもそも、設定ページから行えるフォント設定を行ってもあまり意味がないからこの機能を重宝していたのだが、これでは自由がなさ過ぎる。
厄介なことに、あるページやテキストボックスの一部によっては、その設定のフォントで表示されていたりするので、意味がわからない。

漢字のない英語圏の人間にはこういう機能がどれほど重要なのか理解できないのだろう。


さらに、今回のアップデートでは、新しくタブを開いた際、「よく開くタブの一覧」 が表示されるようになった。これは少し前のアップデートで無効にできたのだが、これが見事に強制的に戻り、しかも無効にできなくなった。

Chromeの「おせっかい」な新しい新規タブページを以前の設定に戻す方法
http://www.lifehacker.jp/2013/10/131004chrome.html

Chrome ひどい。

[facebook] ショップのアカウント


ログインパスワードを忘れたわけではないのに、メールアドレスを確認画面がでる。そして、登録時のメールサービスが終了している場合、このアカウントは二度と使えない。

ここ数年でサービス自体を止めてしまうメールサービスが相次いでいる。
これに伴って、二度と使用不可能なアカウントが EC をはじめ、Web サービスでも大量に発生しているのだろうと感じる瞬間であった……。

[SQL Server] SQLOLEDB と SQLOLEDB.1

Microsoft OLE DB Provider for SQL Server の 接続文字列 (ConnectionString ) は以下の通り。
"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;"

Provider の指定は、SQLOLEDB と、SQLOLEDB.1 ができるが、これは明示的にバージョンを指定するかどうかの違い。パフォーマンスは、ほぼ誤差のようだが、相当量データ件数がある場合は多少違ってくるのかもしれない。

SQL Server 2008 R2
データ件数 : 85,000

Microsoft OLE DB Provider for SQL Server - msdn
http://msdn.microsoft.com/ja-jp/library/cc426831.aspx

[C#] 指定したフォルダにあるファイル一覧を取得する。

指定したフォルダ下にあるファイル一覧を取得するためには、Directory クラスの GetFiles メソッドを使用する。オプションとして、特定の拡張子を持つファイルのみリスト化することもできる (拡張子は大文字でも小文字でも関係ない)。
配列 (String[]) には、フルパスを含むファイル名が格納されるのだが、Path クラスによりファイル名のみを取得することも簡単にできる。
using System.IO;
using System.Diagnostics;

// フルパスを含んだ .jpg ファイル名を取得。            
string[] files = Directory.GetFiles(@"C:\", "*.jpg");
foreach (string file in files)
{
 // 拡張子を含んだファイル名
 Debug.WriteLine(Path.GetFileName(file));
 // 拡張子を含まないファイル名
 Debug.WriteLine(Path.GetFileNameWithoutExtension(file));
 // 拡張子のみ
 Debug.WriteLine(Path.GetExtension(file));
}

[C#] 文字列から数値のみ抽出する

特定の文字列から数値のみ・英数字のみを抽出したい場合、正規表現を使って必要な文字以外を変換する。
以下を応用すると、必要な文字以外を別の文字に変換することも可能。
using System.Text.RegularExpressions;
using System.Diagnostics;

string s = "L1123452HZZ";
Regex re = new Regex(@"[^0-9]");
// 出力 : 1123452
Debug.WriteLine(re.Replace(s, ""));

string s2 = "ああああL1123452HZZ";
Regex re2 = new Regex(@"[^0-9a-zA-Z]");
// 出力 : L1123452HZZ
Debug.WriteLine(re2.Replace(s2, ""));

string s3 = "HあEあLあLあO";
Regex re3 = new Regex(@"[^0-9a-zA-Z]");
// 出力 : H_E_L_L_O
Debug.WriteLine(re3.Replace(s3, "_"));
Regex クラス - msdn
http://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.regex(v=vs.110).aspx

[Windows Search] インデックスの格納場所は変更しない方が無難

ローカルコンピューターの Windows Search サービスを開始できません。
エラー 3: 指定されたパスが見つかりません。

RAM ディスクなど、システムドライブとは別の場所にインデックスファイルの置き場所を変更した場合、そのドライブが何らかの理由でなくなった際 (ドライブレターが消えた際) にインデックスサービスが起動不可能になり、インデックスが作成されなくなってしまう。

私の場合、RAM ディスクにインデックスファイルを置いていたのだが、RAM ディスクを消した際にインデックスサービスに不都合がでてしまった。
しかもこの場合、以下のレジストリからパスを変更しても修復不可能であり、システムの Search フォルダの参照も削除もできなくなってしまう。

システムフォルダ
C:\ProgramData\Microsoft\Search

レジストリ関係
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search

以下のパス関係のキーに参照不可能なパスが含まれていると、うまく起動できないような感じだった。
  • DataDirectory
  • DefaultDataDirectory
    Gathering Manager
  • DefaultApplicationsPath
    TempPath
Windows 7 以降だと特に、インデックスサービスで素早くアクセスできることも多いので、インデックスが効かないのはわりと不便だ。

[ThinkPad] Win 7/8 英語キーボードを設定

ThinkPad はカスタマイズしやすいため、中古で出回っているものの中には US キーボードに置換されている場合がある (別に中古でなくてもいいのだが)。
ただ、Windows 7/8 ではうまくキーボードが認識されないことがあるのか、「`」 キーが入力できないケースがある (日本語入力の切り替えがされてしまう)。

この現象は、レジストリキーを修正し、キーボードを正しく認識させることで解決する。 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411 

[ Layout File ] KBDJPN.DLL → KBDUS.DLL

日本語切り替えは Alt + ` を入力しないとできなくなるが、正しい動作だ。
なお、上記は別に ThinkPad に限った話ではなく、英語キーボードで不具合があった場合は有効な方法だ。

[Windows 8/8.1] エクスプローラーやアイコンのフォントを変更

Windows 8/8.1 では、システムフォントに Meiryo UI が使用されている。
それ自体はいいとしても、システムフォントの変更ができなくなってしまった。
Meiryo UI は UI と言いつつも若干間延びした表示になるので、エクスプローラーでは半角なのか全角なのかも判別できないのが痛い。そういう部分を気にする場合はそれだけで使いづらく感じる。

以前はコントロールパネルの 「色とデザイン・デザインの詳細設定」 から変更はできたものの、Windows 8/8.1 からはこの項目自体が消滅してしまっている。


そこで、Meiryo UIも大っきらい!! というソフトを使う。
これを使えば、システムフォントの変更が簡単に行える。すばらしい。

Tatsu's room on the Web
http://homepage3.nifty.com/Tatsu_syo/

[ドコモメール] SP モードメールから、ドコモ ID の設定

苦難の果てに 2013 年末サービス・インしたドコモメールだが、その設定方法があまりにも難解すぎて、使わせる気がないのではないかと穿った見方をしてしまう。以下、自分なりに理解した部分を備忘録として残す。

ドコモのメールについて

そもそも癖がある。拡張につぐ拡張を繰り返してカオスだ。
  • i モードメール
    いわゆるガラケーで使用するメールサービス。
  • sp モードメール
    スマートフォンで使うメールサービス。内部的には、i モードメールとの互換性はないようだ。
  • ドコモメール
    クラウドに対応したメールサービス。sp モードのメールに戻すこともできる。
以上のメールサービスを切り替える際、表面的には同じキャリアのメールであっても、内部的には別物として扱われているようだ。

sp モードメールから ドコモ ID へ

ブラウザからアクセスできる ドコモメール (ブラウザ版) はここである。

ドコモメール (ブラウザ版)

しかし、時分の場合は docomo ID とパスワードを入力しても、以下のエラーが表示されるばかりだった。

spモードメールをご利用中のため、ドコモメールをご利用いただけません。(1301_lwprap26)

ドコモメールを使うようにするためには、正確には以下の条件を満たしている必要がある。
もちろん、対応機種を使用しているというのは言うまでもない。
  1. docoomo ID の取得。
  2. sp モードメールではなく、docomo ID の利用設定。
色々とめんどくさい設定が山盛りである。

docomo ID の取得

以下から発行する。

docomo IDのポータルサイト
http://id.smt.docomo.ne.jp/src/utility/pc/top.html

sp モードメールのアップデート

ドコモは CommuniCase というアプリを鳴り物入りで登場させておきながら、このアプリは ドコモメール非対応である。わけがわからないが、そのため、CommuniCase ではなく、sp モードメールアプリをアップデートしなければならない。
紛らわしいのは、sp モードメールアプリはあくまでドコモが端末に付けているものなので、Google Play ストアにはない。見つかるのは本体ではなく、補助的なアプリのみなので注意しよう。

ダウンロードは、ドコモの公式からできる。
  1. d メニューという 誰が使っているのか不明なw アプリをタップ。
  2. お客様サポート をタップ (レイアウトが変更されなければ右上)。
  3. ドコモアプリ → アップデート一覧
  4. sp モードメールをアップデートする。途中で利用規約の同意が必要になる。
これでようやく docomo ID へと切り替えができるようになる。利用規約に同意させたいためにこういう仕様にしているのか不明だが、この設定は盲点だった。

docomo ID の利用設定


このままではまだダメである。ブラウザを始め、メーラー。iPhone や iPad からメールを参照するためには、以下の設定を行う。行わないと、以下のようなエラーメッセージが表示される。

現在、ご利用いただけません。docomo ID利用設定をご確認ください。(1305_lwprap29)

以下、設定方法。
  1. d メニュー → お客様サポート
  2. サービス・メールなどの設定 → メール設定
  3. 設定確認 → docomo ID 利用設定確認
  4. ドコモメール認証
    ドコモメールと言いつつ、これは sp モードパスワード (おそらく 4 桁の数字)。変更していなければ 0000 であるw
  5. docomo ID でドコモメールを利用しますか? を 「利用する」 に。
Web ブラウザから、docomo ID とパスワードを入力してみよう。キャリアのメールがブラウザから読めて、書けて、同期される。

個人的には、i モードメール時代に、i モード.net というサービスを利用していて、IE からのみで、操作性が最悪ながらも PC 画面からメールの返信などができて重宝していたものだ。

iPad から docomo のメールを読む

クラウドの便利なところだ。
ドコモメールの設定を行うと、ドコモメールアプリ以外でもメールが参照できるようになる。ウェブブラウザやメーラー、iPhone や iPad からもアクセスできる。

ドコモメールアプリ以外の各種設定は以下のページにまとめられている。

ドコモメールアプリ以外のメールソフトでのご利用方法 - nttdocomo.co.jp
https://www.nttdocomo.co.jp/service/docomo_cloud/docomo_mail/function/other/

ドコモの iPhone

iPhone では、そもそも IMAP からのみしかメールを参照できないので、上記の設定はデフォルトで有効になっているらしい。

ひょっとすると、ドコモ側は apple に i モードメールの受信が可能なように働きかけを行っていたのかもしれない。しかし、それは拒否され、i モードメールをクラウドに対応させるために内部で大改修が行われていたのだろう。ドコモから iPhone が投入されるのが遅れたのは、このためなのかもしれない。

IMAP でアクセスできるようにしてしまうと、彼らの最も嫌っている 「土管屋」 へとどんどん近づいていってしまうだろうからね。

[EXCEL] COUNTA 関数で 歯抜け列に連番を振る

歯抜け列に連番を振りたい場合、自身のセルの上にいくつデータが入っているセルがあるかを数えるのが手っ取り早い。もう少しスマートな方法もあるが、とりあえず連番を振るだけの方法。

この例だと、まず「1」のみ固定入力をし、「2」の位置には以下の関数を入力する。
=COUNTA($A$1:A2)+1

「3」の位置にコピー & ペーストすると、絶対参照してるセル以外は自動的にカウントアップされるので、以下のような関数がペーストされる。
=COUNTA($A$1:A3)+1

常に自身の上のセルまでのデータが入っている個数をカウントしてくれるので、連番が振られる。
歯抜け部分に数値を入れたい場合は、関数を貼り付ければ勝手に連番が揃えられる。

COUNTA 関数 - Office.com

[SQL Server] トランザクションログがいっぱいです

メッセージ 9002、レベル 17、状態 2、行 10
データベース 'xxxxx' のトランザクション ログがいっぱいです。ログの領域を再利用できない理由を確認するには、sys.databases の log_reuse_wait_desc 列を参照してください。
* 'xxxxx' は、データベース名。

SQL Server のトランザクション ログは、特に指定をしない限りディスク容量の上限に達するまで肥大化し続けるという仕様がある (復旧モデルが 「単純」 である場合はその通りではない) 。
上限に達してしまた場合、エラーログが出力され、それ以上トランザクションを実行することができなくなる。
Management Studio からログを圧縮するには、以下の手順にて行う。
  1. 該当するデータベースを右クリック。タスク -> 圧縮 -> ファイル
  2. ファイルの種類 を ログ に変更
  3. 圧縮アクションは、ファイルを圧縮する場合はを「未使用領域の解放前にページを再構成する」に変更して、圧縮左記のファイル容量を指定する。

トランザクションログについては、以下のドキュメントが参考になる。

トランザクション ログの管理 - TechNet

SQL Server 2005 Tips and Tips - TechNet第 5 回 トランザクション ログをしっかり管理しよう

HowTo: Management Studio を使ってトランザクションログファイル (ldf) のサイズを小さくする方法 - MSDN Blogs

SQL Server でのトランザクション ログが満杯の場合のエラー - 松本崇博 Blog (SQL Server Tips)

[SQL Server] 列名を変更 (リネーム) する

SQL Server 2005 以降では、テーブル名や列名などを変更するストアドプロシージャが用意されている。
-- ABC テーブルにある NAME 列を、USER_NAME へ変更。
EXEC sp_rename 'ABC.NAME', 'USER_NAME', 'COLUMN';

-- HOGE にある ABC テーブルを DEF へ変更。
EXEC sp_rename 'HOGE.ABC', 'DEF'
その他、インデックス名や制約の名前なども変更できる。
sp_rename (Transact-SQL) - TechNet

[SQL Server] データ型を変更する

Management Studio のデザイン画面からデータ型の変更は簡単にできるが、テーブルに大量のデータが格納されていたりすると変更に失敗する可能性もある。SQL コマンドから変更するためには以下のようなコマンドを発行する。
なお、データが格納されている場合は型が変換されるが、変換ができない場合はエラーとなる。
-- HOGE テーブルの ABC カラムを NVARCHAR (10) に変更する。
ALTER TABLE HOGE ALTER COLUMN ABC NVARCHAR(10);
細かいオプションなども指定できる。
ALTER TABLE (Transact-SQL) - TechNet

[SQL Server] データ変換サービス (DTS パッケージ) によるデータ移行

DTS (Data Transformation Services) とは、データ変換サービスを意味し、他のデータソースからのデータ変換を行う機能である。汎用機やオフコンなどからのデータ移行の際に使用されてきたようだ (ようだ、というのは私が実際に試していないからだ) 。

なお、SQL Server 2008 以降は推奨されていない。

SQL Server 2008 R2 における SQL Server 2000 DTS のサポート -msdn

DTS は、プログラムメニューには「データのインポートおよびエクスポート (32 ビット) 」という名称になっている。Management Studio からなら、該当する DB を右クリック、タスク -> データのインポート (エクスポート) をクリックする。

基本的にはウィザードに従って設定していけば良いが、項目のマッピング等は細かく行わないとデータがうまく移行されない。

データ変換サービス (DTS) パッケージの実行 - msdn

[Android 4.0] GALAXY S II LTE でのスクリーンショットの撮り方

Android 4.0 における、OS がサポートしているスクリーンショットの撮り方を調べると、以下のように記載してあるサイトが散見される。

音量を下げるボタンと電源ボタンの同時押し

しかし、GALAXY S II LTE (SC-03D) においては、その操作ではなく、以下の操作を行う。

ホームボタンと電源ボタンの同時押し

保存場所は、以下のようだ。
sdcard/Pictures/Screenshots

[RC-S370] IC カードリーダライタ設定画面に機器が出てこない


e-Tax 等、公的個人認証サービス (JPKI) を使用する際に、IC カードリーダライタ設定で機器 (RC-370) が出てこない事がある。 Suica やnanaco など他の IC カードは読み込めているのに、住基カードのみうまく読めないという困った現象だ。確定申告の時期にしか使わないでいると、あれ? 去年はどうだっただろう? と毎年困ってしまう。

これは、Sony の PC/SC アクティベーター for Type B というソフトウェアをインストールすることで解決する場合があるようだ。



この設定をした後、JPKI 利用者ソフトで動作確認をしてみて OK であれば証明書の参照もできるだろう。

この現象に至る前に、利用者証明書表示画面にて、
エラーが発生しました。IC カードに接続できません。
と、表示された場合は、今回のようにまず住基カードが認識されているのかを確かめよう。

[C#] Enum の文字列を取得

Enum は数値で扱うのが、その項目自体を文字列で取得したいケースもある。
foreach で列挙すると、以下のようになる。
using System.Diagnostics;
enum Size
{
    S,
    M,
    L,
    すーぱーさいず,
}
foreach (string x in Enum.GetNames(typeof(Size)))
{
    // 出力結果
    // S
    // M
    // L
    // すーぱーさいず
    Debug.WriteLine(x.ToString());
}
Enum.GetNames メソッド
http://msdn.microsoft.com/ja-jp/library/system.enum.getnames(v=vs.110).aspx

Enum については、こちらでも色々と書いている。