2012/12/15

[Juice Defender] CommuniCase で 「未受信メール」 あり

CommuniCase は、圏外や電源オフ時にメールのプッシュ受信を受け取ると 「未受信メール」 としてステータス表示される。この場合は手動でサーバーと同期させないとメールを受信してくれないのだが、Juice Defender をインストールしてから常にこうなるようになった。

Juice Defender の設定では、スクリーン OFF 後に指定した時間経過すると自動的に通信が止まるのでそれが原因かと思っていたのだが、そうではなく設定により、通常は Google との同期以外はされなくなっているらしい。プッシュは受け取るが、通信はしない、という感じだと認識している。


  • enabled
    これが通常の動き。
  • ping
    プッシュのみ受け取る。
  • disabled
    無効。
……たぶんそういうことだよな。

2012/12/07

[Active Directory] グループの初歩


グループ
Windows OS の概念。ユーザーや他のグループアカウントをまとめたもの。

セキュリティグループと配布グループ
  • セキュリティグループ
    ファイルやリソースのアクセス権限設定などで利用される。Administrators 等。
  • 配布グループ
    Exchange Server 等で使用される。複数の相手にメールの一斉送信を行うアカウント。

ユニバーサル・グループとグローバル・グループ

フォレスト全体で利用できる。
ユニバーサル・グループのメンバーを変更するとネットワークやシステムの負荷がかかる。

含めるメンバーに以下の違いがある。
  • グローバル・グループ
    同一ドメイン内の他のグローバル・グループしか含められない。
  • ユニバーサル・グループ
    フォレスト内の他のグローバル・グループ、およびユニバーサル・グループを含めることができる。

[Active Directory] ADSI Edit で属性を編集する


Active Directory の属性を追加するためには、ADSI Editを使用する。
[ファイル名を指定して実行] より、 AdsiEdit.msc を入力して起動できる。


Windows Server 2008 R2 より拡張機能として、タブに追加されるようになった。
編集方法自体は従来通り面倒な感じだが、タブで切り替えられるのでいくらか楽になったと思う。

2012/12/06

[PowerShell] Like 文で検索する


PowerShell でデータのフィルタをしたい時には、パイプで Where をつなげることで検索できる。
しかし、Like 文であいまい検索をする場合は、「%」ではなく「*」を使う。

Get-MsolGroup | Where {$_.DisplayName -like "*テスト*"}
# 「テスト」 と、名前にあるグループを検索

PowerShell には、こういう微妙な差がたまにあるな。

2012/11/22

[Office365] New-MsolLicenseOptionsでハマる


C#からPowerShellに対して、-DisabledPlansオプションを渡そうとしたのだが、うまく渡せないで少々ハマった。
例えば、'aaaa,bbbb'という文字列を渡すと、文字列の配列として認識されているようだが、うまくセットできない。
ライセンス オプションが無効であるため、このライセンスを割り当てることができません。
どうやら正解は'aaaa",'bbbb'であるらしい。すこし考えればわかることではある。

2012/11/21

[.NET 4.0] ネットワーク上の場所からアセンブリを読み込もうとしました。


.NET Framework 4.0 からセキュリティ・モデルが変更された。
.NET Framework 3.5 が入っている環境では OK でも、.NET Framework 4.0 のみインストールされている環境ではエラーが発生するケースがある。例えば、動的にアセンブリを読み込んでいる箇所などに影響が出る。

System.NotSupportedException: ネットワーク上の場所からアセンブリを読み込もうとしました。これにより、以前のバージョンの .NET Framework で、アセンブリがサンドボックス化された可能性があります。このリリースの .NET Framework では、CAS ポリシーが既定で有効になっていないため、この読み込みは危険な場合があります。この読み込みがアセンブリのサンドボックス化を目的としない場合は、loadFromRemoteSources スイッチを有効にしてください。詳細については、http://go.microsoft.com/fwlink/?LinkId=155569 を参照してください。

参照してください、といいつつ最新の日本語サイトはこっちだったりする。
http://msdn.microsoft.com/ja-jp/library/vstudio/dd409252.aspx

動作をさせたいだけであれば、
Config ファイルに loadFromRemoteSources 要素を追加すれば回避できるようになる。
しかし、セキュリティとの兼ね合いがあるので、その意味をよく考えてから設定したほうが良いだろう。

参考 : CASが廃止。.NET 4のセキュリティはどうなるのか? [@IT]
http://www.atmarkit.co.jp/fdotnet/special/dotnet4security_01/dotnet4security_01_01.html

2012/11/20

[C#] DataGridView の行をすべて削除する。

Windows フォームでよく使用される DataGridView だが、行を初期化したくて DataSource に null を入れてみたが初期化されなかった (笑)。どうやら以下のようにクリアするらしい。
DataGridView .Rows.Clear();

2012/11/12

[Windows Azure SQL] 存在しないデータを読み取ろうとしました

ふと、こんなエラーが出た。
System.AggregateException: 1 つ以上のエラーが発生しました。 ---> System.InvalidOperationException: 存在しないデータを読み取ろうとしました。
Azure 上の SQL Server で思ったのは、接続に関して Azure から切断されるような作りをしていないかというところだと思う。
長時間接続すると切断されるし、セッション数が超えていても切断される。
その結果として上記のようなエラーがログに残されるわけだが、これは問題の切り分けをするときに間違えやすい。

例えばこのソースは、Azure 環境でなければ普通に動くだろう。
using (var db = new DBEntities()) 
{ 
    var users = (from u in db.Users where u.PK == userid select u).ToList();
    if (users.Any()) 
    { 
        var selectedUser = users.Single(); 
        if (selectedUser.Password.Equals(passwordHash)) 
        { 
            var settings = (from s in db.Settings where s.User == selectedUser.PK select s).ToList(); 
        } 
    } 
} 
しかし、DBEntities の中でひたすらにループを回し続けると、Azure から切断されてしまうことがある。Azure 上では、常に短い時間でデータベースアクセスを行い、かつ、切断をするような作りになっていないとならない。

何も考えていないで作ってきたのだが、そういう部分もしっかりと基本に忠実に作らないといけないのだ。

参考:http://stackoverflow.com/questions/5310764/entity-framework-invalid-attempt-to-read-when-no-data-is-present-with-large

2012/11/10

[PowerShell] Office 365 へのユーザー登録時に複数ライセンスを付与する

Office365 のライセンスが複数ある場合、コマンドから複数のライセンスを付与させたいということがある。 複数のライセンスを付与させるのは簡単だ。-LicenseAssignment に対して、ライセンスをカンマで連結してあげればいい。
New-MsolUser -LicenseAssignment テスト:ENTERPRISEPACK,テスト:STANDARDPACK
大抵の場合はこれでよろしいと思われるのだが、サービスプランによっては競合が発生する。
というのも、ライセンス付与を行うと、デフォルトではすべてのサービスプランが有効化されるからだ。
このユーザーのライセンスを更新できません。ライセンス セットに、同時に割り当てることができない 2 つ以上のサービス プランが含まれています。競合するサービス プラン: SHAREPOINTSTANDARD, SHAREPOINTENTERPRISE
これを回避するためには、ライセンスオプションを設定する必要がある。
New-MsolUser を実行する時でも良いし、後からライセンスを付与するときでも良い。
$licenceOption = New-MsolLicenseOptions -AccountSkuId テスト:STANDARDPACK -DisabledPlans SHAREPOINTSTANDARD
$userObject = Set-MsolUserLicense -userprincipalname hoge@hoge.com -AddLicenses テスト:ENTERPRISEPACK,テスト:STANDARDPACK -LicenseOptions $licenceOption
環境によってどのサービスプランが競合するのか異なるので、なかなか難しい話ではあるが、複数のライセンスを付与する可能性がある場合はこのような考慮をしないとユーザー登録ができない。

2012/10/04

[C#] タイプ初期化子が例外をスローしました。



この類のエラーというのは原因が本当に掴みづらいのだが、App.config の設定がミスっている場合にも発生する。
コードばかり疑ってしまうが、こういう盲点もあるようだ……。

2012/10/03

[Entity Framework] Insert に失敗する。

SaveChanges() メソッドでデータを Insert しようとしたのだが、以下のエラーが出て失敗していた。
[System.Data.UpdateException] = {"EntitySet ' tablename ' を更新できません。DefiningQuery が指定されていますが、現在の操作に必要な要素 に要素 がありません。"}
原因を調べても有益な情報はなかったのだが、そういえばテーブルを追加した際に主キーの設定をしていたかな? と確認してみると、キーがなかった。主キーを設定して再実行してみると今度はちゃんと通った。

エラーメッセージがいまいちわかりづらい……。

2012/10/02

[Visual Studio] 32bit と 64bit 環境が混在する環境でのビルド

dll を読みこませるために、LoadFrom メソッドを使用したところ、
ネイティブ イメージは LoadFrom コンテキストで調査されません。
と、いうエラーが出た。

あまり考えずに、ビルド時のプラットフォームターゲットを「AnyCPU」にしていたのだが、開発環境に 32bit と 64bit 環境が混在している場合、これではよろしくないようだ。あまり調査をしていないのだが、x86 環境がある場合は、そちらに合わせておいたほうが無難にみえる。

一見するとエラーの原因がわからないので、厄介な現象だと思う。

2012/10/01

[Office] OneNote の常駐を解除する。

OneNote を使うと、Windows を起動した際に、OneNote が勝手に常駐するようになる。OneNote ジャンキーなら別になんとも思わないだろうが、気づかないうちに勝手に常駐しているのが嫌だという場合があるだろう。その場合は以下の方法でキャンセルすることができる。



  1. [スタートメニュー] - [スタートアップ]
  2. [OneNote 2010 画面の領域の取り込みと起動] を削除。


なお、現在常駐しているランチャを Windows タスクマネージャーから抹殺したい時は、ONENOTEM.EXE を終了させれば良い。

2012/08/16

[Windows] 自動更新後の再起動ダイアログを消す

コンピュータの更新を完了させ、更新を有効にするには、コンピュータを再起動してください。

「Windows キー + R」 でコマンドプロンプトを起動。
で、以下のコマンドを貼り付けて (右クリック貼り付け) Enter 。
net stop "Automatic Updates"

はっきり言ってこれはウザいw
これを設計したやつは何を考えているのかと思う。

2012/07/23

[ASP.NET AJAX] Update Panel で文字化けする。

Visual Studio 2005 のバグでハマったお話 (Visual Studio 2008 ではバグフィックスされている) 。
そもそも、VIsual Studio 2005 は、Ajax にネイティブに対応しているわけではなく、途中から追加機能として使えるようになったわけだが (Atlusってやつ) 、ページの文字コードが UTF-8 以外の場合、文字化けが発生することがあるらしい。

これは以下の JavaScript をページに埋め込むことでとりあえず解決する。

function pageLoad(sender, args) {
    if (!args.get_isPartialLoad()) {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(OnBeginRequest);
    }
}
function OnBeginRequest(sender, args) {
    args.get_request().get_headers()["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8";
}

まぁ、ページのエンコードを UTF-8 以外に変更している特殊な環境下でしか発生しないかもしれないが、VS2005 と Update Panel で文字化けしたらこれが効くかもしれない。

参考:using non UTF-8 encoding will break special character with updatepanel - connect.microsoft

2012/07/21

[iPad] 2 年間無料のソフトバンクWi-Fiスポットを申し込む

iPad をソフトバンクショップや Apple Store などで購入すると、ソフトバンクWi-Fiスポット (2years) がもれなく付いてくる。イーヤッッハー! と思ったのだが、この申し込みがかなり曲者だったので備忘録として記しておく。

経緯

  1. 購入
    自分は iPad を Apple Store で買ったのだが、購入時にソフトバンク Wi-Fi スポットが使えるということの説明と、ペラ紙をくれた。その通りやれば簡単だと普通は思う。思うよ。
  2. ペラ紙には、ソフトバンク Wi-Fi の ID を発行白とある。方法は二つ書いてあり、サイトにアクセスする方法と空メールを送る方法があるのだが、サイトへのアクセスはなぜかできなかったので、空メールを送信した。
  3. すぐに折り返し案内メールが届くので、案内メールに記載されている登録用アドレスをクリックする。しかし、何度やってもアクセスできない。全くできない。どうしてもできない。
  4. コールセンターの電話も記載してあるので、そこに電話してみる。
    すると驚愕の事実が発覚する。
  5. ソフトバンク Wi-Fi スポットは、携帯電話からのみ申し込み可能。
    IDの発行サイトは、スマートフォンは対応していない。

    いわゆる 「ガラケー(この言い方は嫌いだが)」 からのみサイトにアクセス可能。
    ソフトバンク製のスマートフォンなら一部対応している場合もあるらしいが……。
  6. コールセンターに頼むと登録はしてくれる。いったん電話を切って、登録完了後に折り返し電話をくれて、ID とパスワードが発行される。

まとめ

  • 2012 年 7 月現在、スマートフォンからの登録は不可能 (iPahone だとできるようだ) 。
    友達からガラケーを借りるか、コールセンターに電話するしか申し込み方法はない。
    なお、申し込みの際には、iPad のシリアルナンバーが必要。
  • パスワード再発行などの事態が発生した場合は、コールセンターで対応してもらうしかない。携帯電話からアクセスできるなら、照会はできるようなことは聞いた。
  • ソフトバンクWi-Fiスポット (2years) の案内ペラ紙は、その旨をさっさと追記してほしい。コールセンターも、ソフトバンクと契約している前提 (契約中の端末番号を入れろとかいう ) で機械案内されるので、最初は戸惑った。
  • 無料で 2 年間もただ乗りさせてくれるのはありがたいが、 さっさとシステムを改修しろw
ちなみに、申し込み自体も購入後数日後からという罠がある。
ソフトバンク以外のスマートフォンの人は、忘れないうちにコールセンターに電話しよう。

まぁ、コールセンターは休日でもやっているし、対応は良かったですよ (笑) 。

[ATOK 2012] パレットを表示する。

  1. コントロールパネル - 地域と言語 - キーボードまたは入力方法の変更 - キーボードの変更
  2. 「テキスト サービスと入力言語」 の 言語バー タブ。
  3. 言語バー - デスクトップ上でフロート表示する。
今まで ATOK を15 年くらい使い続けてきたが、タスクバーに合体している言語バーよりもパレットを表示していた方が慣れているのでずっとそうしてきたのだが、この仕様変更はいきなり戸惑った……。

2012/07/11

[GALAXY] 「タグの種類が不明です」 を無効にする。

スリープから復帰すると、時折出るこの画面。
いったい何かよくわからないまま毎回ウザいなぁと思っていたのだが、ようやく正体を突き詰めた。

これはどうやら IC チップに反応しているらしい。
Suica はもちろんだが、免許証にも反応する。
NFC (近距離無線通信) という機能らしいが、調べてみると GALAXY くらいでしか採用されていない。はっきり言って、いらない機能である (汗) 。
  1. 設定 - 無線とネットワーク
  2. NFC のチェックを外す。
今後も普及するか不明だが、デフォルトでオンになっているメリットはさっぱりわからない。

2012/07/05

[JSON] コロンのエスケープ

JSON でパスを保持して、Json.NET で取り出そうとしたのだが、エラーが出てしまった。
エスケープしなければいけないと思ってバックスラッシュを入れてみたがまだダメ (笑) 。

引っかかっていたのは実はコロン (:) で、これはどうやらバックスラッシュを 2 つつなげて初めてエスケープできるらしい。
XML や jQuery でも同じことらしい。
これは盲点だった……。

2012/06/25

[ASP.NET] ポストバック時にスクロールバーを保持する(Chrome, Firefox)

基本的に、Page 要素に MaintainScrollPositionOnPostBack="true"と記述すれば良かったのだが、Chrome や Firefox ではこれが効かない。有効にするためにはもうひと工夫しなければならないのだ。
  1. プロジェクトを右クリックして、ASP.NET フォルダの追加。
    App_Browsers フォルダを追加する。
  2. App_Browsers に、新しい項目 (ブラウザ ファイル) を追加。
    BrowserFIle.browser というファイルが追加されるので、以下の記述を追加する。

  
    
      
    
  
  
    
      
    
  

refID="Safari1Plus" というのが Chrome のことである。 これで今までどおり MaintainScrollPositionOnPostBack="true" を追加すれば OK。
Page_Load に this.MaintainScrollPositionOnPostBack = true; を追加するという記述があるサンプルもあるが、ページにタグを追加しても同じ効果のようだ。

[ 参考 ] http://www.codeproject.com/Tips/207917/Maintain-Scroll-Position-Problem-fix-for-Chrome - THE CODE PROJECT

2012/06/24

[WIndows] GALAXY 9600GT のファンが止まる

夏に近づくにつれ、PC の発熱が厳しくなってくる。
まぁ、今時デスクトップ PC なんてマニアしかつかっていないだろうがw

PC を起動して、しばらく経つといきなり不安定になって PC が停止する。
停止の仕方も、いきなり画面がブラックアウトしたりして、ブルースクリーンすらでない嫌な止まり方。

Windows がこういった具合に停止するというのはたいていハードウェア周りのトラブルだったりするのだが、今回もよくよく点検してみると、なんとグラフィックボードのファンが動いていなかった。


動いていなかった原因がまたひどい。 ファンに貼ってあるシールが熱ではがれてしまい、ファンがシールを巻き込んで止まっていたのだ。

今回の教訓 ファンにシールが貼ってあるグラフィックボードは買ってはいけない。

[Firefox Beta] 起動しなくなる不具合。

おそらく Beta 版だけの現象だと思うのだが、Firefox が起動しなくなるときがある。具体的にはアイコンをクリックしても無反応になってしまう。こうなるとなんどクリックしてもダメ。

ただ、PCを再起動していちばんはじめに Firefox を起動させようとするとメッセージウィンドウが出ることがある。


更新に失敗しました。
差分更新を適用できませんでした。完全更新をダウンロードしてインストールします。

とりあえずこの画面が出れば差分だろうが完全だろうが起動できるようになる。
アップデートの何かでこけているのだろう。

2012/06/09

[Windows 8] Error Code: 0x0000005D


Windows 8 のRelease Preview を VMware Player にインストールしようと思ったら、いきなりダメだった (笑) 。調べてみると、このエラーはプロセッサ関係のエラーらしい。
VMware Player のプロセッサ コア数が 1 になっていたので、いったん仮想マシンを閉じてからプロセッサ コア数を変更。再度インストールを試みたがダメだった。
ちなみに、Core 2 Quad のマシン。確かにもう古いのだが、いくら何でもこれでダメってことはないだろう……。VMware 経由なので、他に原因があるような気がするが、やはり新しい Windows というのは、常にハードウェア要件が高いのだろうかね。

2012/06/05

[C#] bit 型を抽出条件にする

SQL Server の bit 型というのは状態保持によく使われるが、これがなかなか面白い。
これはデータとしては数値として扱われる (TRUE = 1, FALSE = 0 ) のだが、 プログラムから抽出上限として使うには bool として扱わなければならない。
SELECT * FROM Hoge WHERE Hoge_Flag = 0
-- 文字列でもいける
SELECT * FROM Hoge WHERE Hoge_Flag = 'FALSE'
-- こんなのでもいけるw
SELECT * FROM Hoge WHERE Hoge_Flag = 'FaLsE'
しかしながら、プログラム内から (例えば LINQ)条件にしようとすると……。
var hogeDb = new HogeDBEntities();
var query = from hoge in hogeDb.Hoge_Flag == 1
   select hoge;
// 演算子 '==' を 'bool' と 'int' 型のオペランドに適用することはできません。
Entity Framework からだと、データベースの型も厳密に定義されているので実行前にこういうエラーがチェックされる。これは素晴らしい。
こういうフラグのようなものは数値型でよく定義されているのだが、設計者の好みによって 0 が無効なのか、-1 が無効なのかバラバラだが、bit で定義するのがいいのかもしれない。

bit (Transact-SQL) - msdn
null も取れるし。

2012/06/04

[ADO.NET] 複数のプロジェクトからモデルにアクセスする

指定された名前付き接続は、構成内に見つからないか、EntityClient プロバイダーと併用することを意図していないか、または無効です。
ADO.NET Entity Framework で DB アクセスをする際に、複数のプロジェクトから一つのモデルを参照したいということはよくあるが、この場合は参照元のプロジェクトの App.Config の connectionStrings ノードにも、接続文字列を追加する必要がある。

クラス ライブラリで定義されたモデルを使用する - msdn

2012/06/01

[Visual Studio] 型または名前空間名 ´´ は名前空間 ´´ に存在しません。アセンブリ参照が不足しています。

このエラーは、単純に参照設定が正しくされていないものなのだが、正しく参照設定を行ったにも関わらずエラーが解消されずにハマったことがあったのでメモ。実際は、やはり正しく参照設定が行われていなかったのだが(笑)。
参照元のソリューションにクラスライブラリのプロジェクトを追加しようとしたのだが、結論から言うと、.NET Framework のバージョンが合っていなかった。
で、落とし穴だったのが、微妙な違い。

参照元のバージョン: .NET Framework 4 Client Profile
参照先のバージョン: .NET Framework 4

Client Profile というのを調べてみると、
サーバ専用の機能を削除したサブセットで、軽快なインストーラーを作成できます
と、書いてある。
Microsoft .NET Framework 4 基本情報 - .NET Framework デベロッパー センター

とりあえず、バージョンの違いには特に気をつけなければいけないようだ。
昔は単に参照されていないとかそういう簡単な原因だったのだがね。同じバージョンでも違うのがあると別物として扱われるとは。

ちなみに、コンソールアプリケーションを新規作成するとデフォルトが .NET Framework 4 Client Profile になるのでハマったようだ……。

[C#] コンソールをキー入力で一時停止

よくサンプルソースなどであるコンソールアプリケーションは、普通に実行するとそのまま最後まで処理が行われたあとにウィンドウがすぐに閉じて終了してしまう。これでは何も確認できないじゃないか、というのは誰しも通る道 (笑) 。
それを回避するためには、とりあえずユーザーに入力を促すコマンドを入れてあげると良い。
 // キー入力を待つ(止める目的なら、どっちでも良い)
 Console.ReadLine();
 Console.ReadKey();
厳密に言うと、ReadLine() は行の出力。ReadKey() は、入力キーの受け取り(.NET Framework 2.0 より追加)。なので、キー入力を待っているのは ReadKey() の方。
ただ、これだけを入れるとコンソールが止まるだけなので、実際には、
 Console.WriteLine("何かキーを押してください。");
とかやらないと、ウィンドウで何が起こっているのかわかりづらかったりする。

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

2012/04/28

[Ubuntu 12.04] Dash を自動的に隠す

Ubuntu を 12.04 にアップグレードしたら、ランチャー (Dash) が常に表示されるようになっていた。これは少しうっとうしいので、設定を元の挙動に戻した。



  1. [外観] - [挙動]
  2. Launcher を自動的に隠す → ON

2012/04/26

[Firefox] Do Not Track によるプライバシー保護

Firefox では、バージョン 11 から実装された機能だ。
  1. [オプション] - [プライバシー] - [トラッキング]
  2. トラッキングの拒否を Web サイトに通知するt
Do Not Track (DNT) とは、Web サイトにアクセスした際にユーザーの行動追跡 (他にどのようなサイトを閲覧しているか、どのリンクをクリックしたか等) を行うような場合、それを拒否する意思を示すものだ。
意思を示すものであるし、現時点では効力を発揮しないのが実情だが、プライバシーの意識の高まりから、今後実装が進むと思われる。
Tracking Preference Expression - W3C
Do Not Track Test Page - Microsoft

2012/04/25

[Firefox 12] 新機能 (サイレントアップデート) を設定

Firefox 12 リリースノート
http://mozilla.jp/firefox/12.0/releasenotes/
サイレントアップデートと、地味にソースに行番号追加w


サイレントアップデートは、オプションで更新の動作を変更する必要があるのかな? (デフォルトでは従来通りの動作に設定されていた)
  1. 設定タブを開く
    [ツール] - [オプション] - [詳細] - [更新]
  2. Firefox の更新を、"自動的に更新をインストールする" に変更。
Windows2000 と Fireefox3.6 系のサポートが終了するそうだ。
portableapps.com では Firefox3.6.28 も今のところダウンロード可能だが、サポート終了に伴い今後どうなるのだろうか。セキュリティを考えると、最新バージョンを使用するのは必然ではあるがね。

2012/04/24

[SkyDrive] 容量を増やす

Skydrive のツールが発表されたのだが、新規登録時にはその容量が 7G になってしまうそうだ(今までは 25G )。なんだかいきなり損した気分だがw 既存のユーザーも一時的に 7G になってしまっている。 SkyDrive にログインして容量を追加しないと 7G のままになってしまうので、既存ユーザーはログインして容量を増やしておこう。

[ASP.NET] 認証ページに例外を追加して CSS やスクリプトファイルを反映させる

Form 認証を行う際に、アプリケーションルートに対して認証をかけてしまうと、その下にある外部ファイルが参照できなくなる時がある(CSS が反映されない等)。

[アプリケーション直下にログインページを置いて認証させている例]
    
        
            
            
        
        
            
        
    

この場合は、特定のフォルダやファイルに対して認証を外す必要がある。
[Styles フォルダ以下は認証しない]
    
        
            
                
            
        
    
location 要素は、system.web 要素の外に記述する。適切なアクセス制限をかけたいものだ。

2012/04/20

[C#] 正規表現で半角英数以外を弾く

バリデーションチェックを手動で追加する際に、つい忘れてしまいがちな正規表現をメモ。
using System.Text.RegularExpressions;

// あいうえおabcde がチェック対象。
if (!(Regex.Match("あいうえおabcde", "^[a-zA-Z0-9]+$")).Success)
{
  // 半角英数以外の文字が含まれています。
}
ちなみに、主要なチェックは以下の通り。

数値 : ^[0-9]+$
郵便番号 : ^[0-9]{3}[-][0-9]{4}$
電話番号 : ^[0-9]{2,5}-[0-9]{1,4}-[0-9]{4}$
全角かな : ^[ぁ-ん!ー]+$
全角カナ : ^[ァ-ヴ!ー]+$
半角カナ : ^[ア-゙]+$

[Plantronics M100] Bluetooth ヘッドセットはスマートフォンには必需品


これがおすすめらしいとのことで試してみた。
音がいいとか聞き取りやすいとかはよくわからないが、必要最低限の機能は満たしていると思うので不満は出ない。屋外で使用しても相手先にしっかり声が届いているようだし。
それ以外の部分で、個人的に気になったところをいくつか。

[良かったところ]
  1. 意外と電池が持つ
    iPhone ではアプリと連動して電池容量が表示されるようだ。
    ようだ、というのは私は iPhone ではないのでわからないからそのメリットを享受できない。
  2. 悪くないフィット感
    寝転がりながらでも、うつむきながらでもズレることはない。当たり前かもしれないが。
[ダメなところ]
  1. ボタンが押しづらい
    真ん中が通話終了などのボタンを兼ねているのだが、これがうっかり押しやすい。デザインは確かにいいと思うが、もう少しなんとかならなかったものかね。
  2. 電源ボタンが固い
    電源の ON, OFF は横にスライドするのだが、これが固い。
    また、動かす時に真ん中のボタンを押してしまうことがある。使いづらい。
ちなみに、ガイダンスはすべて英語。「turn on」とか「connected」だとかw
それほどバカ高いわけではないので、はじめに書いた通りおおむね満足。
が、ネットで言われるように大絶賛されるものかというと……どうだろう。
他社のものが相当ひどいのかもしれない(笑)。

[MSDN] この記事は翻訳者によって翻訳されたものです。 記事の文章にポインターを重ねると、原文のテキストが表示されます。

原文テキストの表示がうっとうしすぎるんだが(笑)。
これを変更するには、右上の歯車のアイコンをクリックして設定を変えればよい。

スクリプトなし、を選択すると高速で読み込まれる。

記事の文章にポインターを重ねるといいつつ、マウスのホイールでスクロールをさせる場合は記事にポインターが当たりっぱなしになるわけで。
この機能を実装するときに、だれも何も言わなかったのだろうかと思う。

Related Posts Plugin for WordPress, Blogger...