2012年2月25日土曜日

JSpinnerの表示文字列を中央寄せに

JSpinnerといえば

どうも、プログラマのyu1rowです。
以前「JSpinnerのちょっと困った話」っていう小ネタのエントリを投稿しましたが、これが結構アクセス数多いんですね。
今回はその続きというか、派生の話題です。

要は「horizontalAlignment」が欲しいってだけ

JSpinnerにはhorizontalAlignmentがありませんでした。
でも欲しかったんで足しました。
今回はそれだけです。
需要、あるかなぁ?

JSpinnerにメソッドを付け足したクラスを作ります。
足された公開メソッドは以下の2つ。
  • void setHorizontalAlignment(int alignment)
  • int getHorizontalAlignment()
JSpinnerを継承したJAlignSpinnerクラスのコードを以下に示します。
package com.yu1row.blog;

import javax.swing.JFormattedTextField;
import javax.swing.JSpinner;

/**
 * Spinner implemented property horizontalAlignement.
 * @author yu1row
 */
public class JAlignSpinner extends JSpinner {

 private static final long serialVersionUID = 1L;

 private JFormattedTextField getTextField() {
  return (JFormattedTextField) getEditor().getComponents()[0];
 }

 public void setHorizontalAlignment(int alignment) {
  getTextField().setHorizontalAlignment(alignment);
 }

 public int getHorizontalAlignment() {
  return getTextField().getHorizontalAlignment();
 }
}


使い方

setHorizontalAlignmentの引数には以下を指定できます。
javax.swing.SwingConstants.LEFT左詰
javax.swing.SwingConstants.CENTER中央
javax.swing.SwingConstants.RIGHT右詰
javax.swing.SwingConstants.LEADING(日本語環境なら)左詰:デフォルト
javax.swing.SwingConstants.TRAILING(日本語環境なら)右詰

実際に使ってみたコード例を以下に示します。
import java.awt.Container;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.SwingConstants;

import com.yu1row.blog.JAlignSpinner;


public class ShowAlignSpinner {
 public static void main(String args[]) {
  JFrame frame = new JFrame();
  Container c = frame.getContentPane();

  c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
  JAlignSpinner spinner;

  // LEFT
  spinner = new JAlignSpinner();
  spinner.setHorizontalAlignment(SwingConstants.LEFT);
  c.add(spinner);
  // CENTER
  spinner = new JAlignSpinner();
  spinner.setHorizontalAlignment(SwingConstants.CENTER);
  c.add(spinner);
  // RIGHT
  spinner = new JAlignSpinner();
  spinner.setHorizontalAlignment(SwingConstants.RIGHT);
  c.add(spinner);
  // LEADING
  spinner = new JAlignSpinner();
  spinner.setHorizontalAlignment(SwingConstants.LEADING);
  c.add(spinner);
  // TRAILING
  spinner = new JAlignSpinner();
  spinner.setHorizontalAlignment(SwingConstants.TRAILING);
  c.add(spinner);

  frame.setSize(300, 200);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);  
 }
}

以上です!

2012年2月24日金曜日

R+Ubuntu Server+Apache+PHP

R+俺=無限大の可能性?

Osaka.Rでの刺激を受け、Ubuntu ServerにRをインストールしてみたのはこないだの話。
さてそれでは一体これを使ってどう遊ぶんだ?ということで。

今WordPressってものに興味がありまして。
とりあえず「第2回WordBench大阪」参加してきます。
まだ触ったこともありませんがw

そんでもってWordPressはPHPで実装されているらしいです。
ならばRにアクセスするライブラリをとりあえずPHPで書いてみようかって思いまして。
↓こんなイメージです

はいできた!

で、とりあえずパフォーマンスは置いておくとして、ブラウザからちょっとスクリプト走らせて結果を見られるものができました。

■実行中のスクリーンショット



これ頑張って作り込めばIDEみたいなもの作れるんちゃうかな?

と思ったんですがっ!

後で知ったんですが、RStudioっていう素晴らしいIDEが既にあったようです。

まぁIDEは諦めよう。
二番煎じはなんだかイヤだ。

PHPで書いたし、WordPressと一緒に仲良く動いてくれるんちゃうかな?
WordPressまだよぅ知らんけどw

アイディアとか、ないですか?

作ったものの、活用するアイディアが今のところ思いついていませんw
なんか面白いアイディア、ないでしょうか?

作ったスクリプトを公開するかはちょっと考え中です。
実験してみたいって人は連絡下さい。
スクリプトをブン投げますお渡しします。

Rのほかに、apache2、php5、ghostscriptを使います。
インストールはRが動くUbuntu(※)があれば↓5ステップぐらいでできます。
  1. Install packages(apache2, php5, and ghostscript)
  2. Create app(web) directory
  3. Configure permission and owner to directory
  4. Copy script files
  5. Start http service(and open port no.80)
Rが動くUbuntu Serverは、前に書いたエントリが参考になるかもしれません。
実験なら別にVMware Playerでお使いのPCで仮想マシン作っても良いんじゃないでしょうか?

これ使って携帯電話でR!とかできたら、ワクワクしません?

...しませんよねぇw

2012年2月22日水曜日

R+Ubuntu Server

R・中田・雄一郎

↑のタイトルに全く意味はありません。
ただ思いついたことを垂れ流しただけです。

Osaka.Rでの刺激を受け、Ubuntu ServerにRをインストールしてみました。
実験環境なんで無茶苦茶やっても大丈夫ですw
マシンVMware Player 4.0.2
OSUbuntu 11.10 Server x64
コスト¥0+やる気

ホントはね、EC2とかで実験するとまた勉強になるかもなんやけどね。
ちょっと今ケチンボな気分なのw

1.リポジトリ追加

Ubuntu Serverのインストールは完了しているものとします。
VMware Playerならサクっとインストールできるし!
まずはaptでインストールするパッケージのあるサーバをリポジトリに追加せねばなりません。
「/etc/apt/sources.list」の最後に一行加えるだけでいいんやけど、管理上別のファイルのほうが良いと思う。
なんかカッコええし。
というわけで、まずはファイルを以下のコマンドで一つ作成。
# "oneric"は下の注釈を参考にしながらOSのバージョンによって書き換え
$ printf 'deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu oneiric/ \n' | sudo tee /etc/apt/sources.list.d/cran.list

※「printf 'deb...」のところ
上記コマンドの"oneiric"って書いてあるのは、Ubuntuのバージョンによって変更してください。
ウチではUbuntu11.10なので"oneiric"です。
他のバージョン使ってる人は↓見て書き換えなされ。
deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu natty/    # 11.04
deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu maverick/ # 10.10
deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu lucid/    # 10.04 LTS
deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu hardy/    # 8.04 LTS
deb http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu dapper/   # 6.06 LTS

※サーバはミラーリストから「http://essrc.hyogo-u.ac.jp/cran/」を選びました。
単純に兵庫県はウチから近いからですw

2.CRANサーバの鍵をインストール

以下のように鍵をダウンロードしてインストールします。
$ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
$ gpg -a --export E084DAB9 | sudo apt-key add -

※「gpg --keyserver...」のところの「E084DAB9」について
http://essrc.hyogo-u.ac.jp/cran/bin/linux/ubuntu/README
↑から辿ると、2015-10-18までこのキー(E084DAB9)でいけるらしい。
まぁそれまでに変更されたら知らんです。
Couldn't be verifiedが出た場合は鍵の更新をしようねってお話です。

鍵をインストールしたら、忘れずに以下のコマンドでパッケージリストを更新しときます。
$ sudo apt-get update

3.Rをインストール!

↓のコマンド叩いて終わりですw
$ sudo apt-get -y install r-base-dev

インストールできたら、以下のコマンドでRの起動ができますよ!
$ R

フォントぅっ!!

まず何しよっかなって感じですが、Osaka.Rでちょっと疑問に思っていたフォントについて調べてみました。
…が、挫折しましたw(早
あきらめではない。見切りなのだよ。(何

まぁ結局familyに日本語系のフォント指定してPDF作って、ghostscript通して作ったラスタイメージに別に不満はありませんでしたよってお話。

・ぉコード例(Encoding: UTF-8)
par(family = "Japan1GothicBBB")
par(mar = c(5, 5, 5, 5))
plot(
 rnorm(100,-10,10),
 type="l",
 main = "タイトルぅ!乱数っ!!", cex.main = 2,
 xlab = "X軸に意味は無い", ylab = "Y軸など飾り", cex.lab = 2)

ここいらで今回は力尽きましたとさw

2012年2月21日火曜日

Osaka.R #7

日時:2012/02/12 13:30~18:30

遅くなりましたが、参加してきましたので簡単にレポート、というかまぁいつもの感想です。
毎日コツコツちょっよずつ書いてるのですよ!

会場の阪大、自宅から超近いんで油断してたら遅刻しそうになって車飛ばして行きました。
…が、開始時間を30分間違えていてちょっと時間つぶしていたのは内緒ですw

自己紹介

参加者が一様に自己紹介を行うという…
色々な勉強会がありましたが、こういうのは初めてでした。
学生や院生や教員、教授だったりと、大学関係者が多い感じでした。
サラリーマンってのはそんなおりません。若干アウェーだけど気にしない。

入門者講習

主催者「@phosphor_m」氏自らの発表です。

初心者も安心の、インストール&実際に触ってみよう講座です。

インストールできる環境はWin & Mac & Linuxと充実!
PC持って行きませんでしたが、他の参加者の習熟度具合や環境がちょっと見れて逆に良かったかもしれません。
一番後ろからジロジロ見てましたw

RはApacheなんかと組み合わせて面白いことできないかなーって軽い気持ちで勉強会に参加したので、個人的にはLinuxでのインストールとか気になりました。

統計の勉強とか1ミリたりともしたこと無かったので、そこに触れる話題には全く付いていけませんでしたが、ライブラリの開発の部分がすごく魅力的でした。
あと、Rのスクリプトの配列?っていうかコレクションかな?のインデックスって1から始まるんですって!VBみたいやねw
スクリプトを見ていて、「R言語」?はオブジェクト指向言語と関数型言語の両方を特徴を持っているように見受けられた。
なんかちょっと他の「プログラミング言語」とはちょっと違ったイメージです。

主催のススメ:Nagoya.Rの発足から引退まで&フォントのオハナシ

発表者は「@sakaue」氏。

勉強会なんかの主催はどんどんやったほうがいいよっていうメッセージから。
うん。言えてる。確かに。
チャンスを掴もうぜ!若人よ!って感じですかw

あと、Rでプロットするグラフなんかで使うフォントの変更方法について。
っていうかWindowsとMacでフォント変更の関数が違うんやねwマジっすかw
Linuxではどうなんやろね?ってのが気になるので、後で調べてみよう。

WindowsのMS系フォントではアンチエイリアスが効かないんできちゃないーって言ってはりました。
あとフォントきれいだからMac買え。阿呆。とも(←言ってない

そう、MS系フォントは小さいとビットマップフォントになるんです。
たしか16ポイントくらいまではビットマップフォントやったっけな??
XPあたりで搭載されたメイリオフォントを使えば少し綺麗。等幅やけどねw

Rzパッケージの紹介

主催者「@phosphor_m」氏再登場です!

Rでは「パッケージ」って呼ばれているライブラリを自作できます。
主催者自ら製作した「Rz」っていうパッケージの紹介でした。
っていうかRってGUIのフォーム?的なモノも作れるんや?ほほう。
SPSSでは簡単にできるけど、RではメンドイようなことをGUIで簡単にポチポチっと操作できるパッケージらしいです。
しかしSPSSとはいったいどのような味がするのだ?というレベルの俺には利点があまりわかりませんでした。すんません。
フォームエディタだの高機能なIDEとかは存在するんだろうか?
でなければ、まぁまぁメンドぅーんなコーディングしてそうやなぁって思ったり。でした。

Rでテキストマイニングをする前に

発表者は「@langstat」氏。

データを機械に通す前にそのデータ自身をキレイな形にしておきなさいって話です。
余分なものは取り除いて、ダブってるものは統合して…
全く地味で目立たない作業かもしれないけど、とっても大事。

ホントそのとおりだと思います!

統計だとかもう関係なくて、こういうのを面倒くさがって疎かにしてしまうことへの危険性について、声を大にして警告したい!
ニュースサイト(っていうか2chとか)でチラ見した内容を誇大妄想的に語るおっちゃん!
どこかのサイトで拾ってきたコード例をそのまま実務アプリにコピペしてろくにテストもしないエンジニア!!!

自分の思うものと一致しているか、妥当性を検討したか?
間違いが混じりこんでいないか確認したか?
いらないものが混じりこんでいないか?っていうか全部いらないものじゃないか?
チームメンバーの偉大なる努力の歯車を再開発していないか!?

インターネットが当たり前、情報のコピペが簡単にできる現状、その情報にゴミが沢山紛れていると考えてほしい。
こういったゴミを丹念に取り除いて磨き上げた情報の珠玉を作り出す作業はとっても大事だと。

俺はこうしてすっかり感化されてしまいましたとさw

Google AnalyticsとRを使ったアクセスログの主成分分析

発表者は「@seisumi」氏。

実はアジェンダを見ていて一番気になっていた発表でした。
moodleでとあるサイトを構築し、そのアクセスログをGoogle AnalyticsにかけてやってRでデータマイニングしてやったんだぜって内容です。俺は昔社員研修用にmoodleでeラーニングを構築しようとして放り出した人ですwwあれから転職してしばらく経ったことだし、もう一度手を染めたいなと、「moodle」って単語を聞かされて刺激を受けました。

seisumiさんのキャラクターにもう首ったけだったんですが、興奮はやや抑え目にワクワクして聞いてました。

が、正直やっぱりデータマイニングの部分は知識がゼロなんでさっぱりでした。
それ以外の内容については、耳で聞いていて、目で見ていてすごくわかりやすい発表で俺は好きです。
思わずコクります。

個人的にはログをどのように整形して、どのようにRに流し込んでやったのかなーなんて、実際の手順の部分が気になりました。
最終的にプロットに落とし込むまでにどうデータを料理してやろうかなーって考えるのに手間がかかる感じなんでしょうか。
一つ前の発表の、「データの整形」って部分が非常に大切だってことが再認識させられます。
あとはどの情報が必要で、いらないのか、経験とデータに対しての十分な理解が必要なんだなと、データマイニングの奥深さが垣間見えました。

Rで方言のネットワーク分析

発表者は「@aonoa732384」嬢。
まずは一言。美人でした。
見たい人は勉強会に参加しなはれw

内容としてはオンラインのフリーのデータ(「日本語情報資料館」より)をターゲットにしてデータマイニング、プロットを作るデモでした。
っていうか「めばちこ」にそんなに沢山の言い方があるのかとちょっと驚きました。

スクリプトのことを「おまじない」って呼んでましたので、我々プログラミングをする人々は「まじない師」と呼ぶのがいいんだと思います。

それはともかく、実際に行った作業をスライド上でキレイに可視化、スクリプトコードも短めにまとめてあってすごい聞きやすかったです。
で、肝心の「ネットワーク分析」ですが、これ実は何のことかわからなくて、EthernetやWebやらの用語の「ネットワーク」をイメージしていました。
ぜんぜんちゃいましたw

いや、ネットワークが何らかのリレーションを持った集合体だと考えるならば、意味的にはつながるのかもしれません。
分析結果が何らかのリレーションを持つものとして、その関係性?強度?そのあたりを可視化するのがネットワーク分析なんでしょうか?
ぜんぜんわかりませんw
ググレカスって感じですよね。わかります。


まとめー!

Rへの興味は、とある目的のためインターネットからクロールしたデータをRを使って分析し、結果を利用してWebサービスを構築できないか、といったところが発端でした。
しかし勉強会に参加してみて、統計学や言語学なんかへの造詣も少なからず必要ではないかと、またその奥深さの一端に触れて少し二の足を踏んでいる今です。

しかし、目的があればそれを実現するためにはどのようなステップを踏めばいいのか考えて一つずつ達成していく。
このステップのアイディア引き出しに一つ「R」が加わったのは大きな成果だったと言えます。
あとは自分の得意分野とRとをどう結びつけられるかが鍵だろう、そのように思います。

それでは、ここまでっ!

2012年2月15日水曜日

第2回大阪Jenkins勉強会

日時:2012/02/10 19:00~21:00


参加してきましたのでレポート、というか感想です。
会場に着いてからノートを忘れていたことに気づいて、 前にガシャポンで出てきたすんげぇちっちゃいミッキーマウスのノートで必死にメモ取ってました。

コレで↓。女子かよ。

乙女っぽいサラリーマン、それは俺です。
こういうのオトメンって言うの?

ソースコードレビューシステム「Gerrit」との連携


gitはたまにチョロっと使ったりしてたんですが、Gerritってのは正直知りませんでした。
ゲリットとか、なんだか腹痛起こしそうな名前やなぁなんて瞬間的に思いました。ごめんなさい。
Gerritってのは、gitを使ったソースコードレビューシステムだそうです。

修正したソースを編集して、コミット。ってのが普通の流れです。
その間にレビュー、ベリファイの手順をシステム的に挟み込む仕組みのようです。

今回はJenkinsをさらに組み合わせることで
  1. Jenkins上でテスト
  2. テストがOKとなれば、Jenkinsがベリファイ
  3. レビュアー(人)がレビュー
という流れで、1~2の部分が自動化できるということで、テストが通ったソースのみコミットさせるCIのパターン(Pre-Tested Commit)だということでした。
デモを見せてもらいましたけど、なんだか不備があったようでドタバタした寸劇が笑いを誘っていてとても楽しかったです。
しかしgitに慣れている人がいないと普通のプロジェクトに適用するにはちょっと敷居が高いなぁなんて思いました。
画面を見る限り沢山カスタマイズの余地があるようですし、以後の発展に期待です!

中規模プロジェクトでのJenkinsの運用を支える技術


えーっと。
パネラーは知っている方でしたので、とてもニコニコして見ていました。
「※資料は後で公開するよ☆」 ってメモには書いてました。

すげぃたくさんの、Eclipseで言うところの「プロジェクト」が3桁レベルで発生するような規模を人の手でチマチマ管理するのは大変!ってことです。
AntとIvyを組み合わせたり、Jenkins上でコンソールを使ったりしてもう、ラクできちゃっててすみませぇん☆的な内容です。
スライドで盛大にスベった挙句に、ものすごくウケたことにしようとしていたのがおもしろかったです。

関西で発表するからって、なんかネタ仕込まなアカンとかいうプレッシャーは無くても大丈夫な気がします。

Amazon EC2でJenkinsを使ってみる


パネラーは2012/02/22発売のJenkins本の翻訳をされている方でした。
せっかくなんでペタっと貼ります。買いましょう。
[Jenkins: 蛙本]

JenkinsとEC2Pluginを組み合わせて、あらかじめ作っておいたEC2のAMIを動的に起動してスレーブとして使っちゃおうってのをデモを行いながらの紹介でした。
AMIは"Amazon Linux"ってのを使ってましたけど、これってFedoraなんですって!
yumでサクサクっとインストールを進めて、EC2のコンソールでポート8080をブチ開けて完了!って感じです。

あと注意点で「気をつけないとお金かかりますよー!」ってのがあってタメになりました。
いわく、EC2は1時間毎課金らしいんですが、3分使って終了ってのをたとえば5回やったら、実際は全部で15分なのに、5時間分の課金になっちゃうらしいんです。
こわいね!

しかしAmazonのクラウドサービス系は略語が沢山あって頭こんがらがっちゃうんです。
自分用にメモっときましょうか。
省略形省略前すんごい適当な説明
AWSAmazon Web ServicesAmazonが提供する(クラウドをはじめとする)Webサービス
EC2Amazon Elastic Compute Cloud仮想コンピュータを提供するクラウドサービス
VPCAmazon Virtual Private Cloud仮想ネットワークサービス(IPsecで通信は暗号化されるらしい)
AWS Direct Connect↑の専用線版、って所らしい
AMIAmazon Machine Image仮想マシンのイメージファイル、かな?

Building Jenkins plugin with Ruby


RubyだけでJenkinsプラグインを作り上げちゃおうっていう意欲溢れる発表でした。
jpiっていう、RubyでJenkinsのプラグインを作るツールを使用してのデモありです。

手順はRubyOnRailsに似ています。
gemでjpiをサクっとインストールして、プラグインのスケルトンをgenerate、hello worldを書くって感じです。
jpiにはコミュニティに公開する機能もあるようです。

ハックセッションが毎週金曜日、日本時間1時より行われているようですので、気になる方は是非!
しかし深夜族だなww

Arduino でつくる XFD のつくり方とその効果


ArduinoっていうオープンデバイスとJenkinsを組み合わせたLTのデモでした。
昔ハード屋さんを志したこともあり、実はとてもワクワクして見ていました。
XFDってのは"eXtreme Feedback Device"の略です。

発表は、Jenkinsで赤くなってもみんな結構無視しちゃうでしょ?XFDだと解決できるかも!?って内容です。
赤が出てブラウザで警告されたりメールが飛んできても無視されちゃう。
無視させないようにするには…パトランプをピカピカ光らせたらどうよ!?ってw

すんごいおもろいwww

発表が終わってから前に見に行ったら、ブレッドボードでパトランプじゃなくてブザーに差し替えたりしてて、すんげぇ耳障りな感じになってた。

すんごいおもろいwwwwww

PICが(自分の中で)流行ってたころ、ワンチップマイコンがこんなに安く遊べるのかと思っていました。が。
色々買い足していくと結局高いんです。アセンブラオンリーでいくならともかく、PICCとか高いですし。
あと最近のPCからはプリンタポートもRS-232Cも無くなってきてますね。

Arduino、安いです。お勧めです。
詳しくはググってくださいw

まとめ


Jenkins勉強会は今回が初めての参加でしたが、業務で使っていることもありもうちょっと細かく知りたいなと思わせるには十分な刺激となりました。

懇親会にも参加させていただきましたが、.NETでもJenkinsを利用していることを教えてもらったり、業界がちょっと違う現場の苦労を教えてもらったり、技術者ってホンッとに…いいもんですねぇ!(水野晴郎調)

まとめきれてませんが、これにて!

2012年2月14日火曜日

RawInputを.NETで使う

Windows7における、グローバルフックの問題点


Windows 7ではグローバルフックで捕まえたメッセージを300ms以内で処理出来ないことが10回続いた場合、そのプロセスは強制的にフックを解除され二度と登録できません。
今回の話題はそんな感じです。[ソース元]
http://bit.ly/d3a1HW
http://bit.ly/bS4BsP


解決案


解決方法として考え得るものを列挙します。
  1. レジストリを操作して、300msを10000msくらいに変更する
  2. プロセスを数分ごとに再起動させる
  3. RawInput系のAPIを代替手段として用いる
  4. 300ms以内で処理できるようにアプリケーションを改善する

解決案に対する考察


  • 1 は、ユーザ視点でない限りまず採られない方法だと思います
  • 2 は手っ取り早く、現実的に解決させる方法であると思います
  • 3 はWindowsXP以降で実現するのに適しているかもしれませんが、それ以前のOSにも対応するのであれば、OSによってRawInputとグローバルフックを切り替えると良いかもしれません
  • 4 のような、「短い時間で最良のパフォーマンスを」というような思想は、技術者なら常に頭に入れておく必要があると思います
自分のアプリでは、3と4を同時に採用しようかと思います。

RawInputManager


RawInput系のAPIを使用してグローバルフックに似た動きをする、C#やVB.Netで使えるDLL、「RawInputManager」を作成して公開します。
ダウンロードは以下のエントリから行ってください。
[RawInputManager]

RawInputManager使用上の注意


  • Windows XP, Windows Server 2003以降でのみ使用可能です
  • .NET Framework 2.0が必要となります
  • DLLはx86でコンパイルされています
  • CodeProjectのHookManagerに似せた実装になっていますが、メッセージを「ハンドルされた」として握りつぶすことはRawInputManagerではできません
    [Ref: codeproject] http://bit.ly/y9hNoM
  • HookManagerに似せた実装ということで、捕まえられるイベントのデバイスはマウスとキーボードのみです

グローバルフックとの違い


ホットキーのKeyDownを捕まえられないことがあります。
具体的にはAlt+TabのTab-KeyDown等が来ないことがあります。
この現象はWindowsVista以降で発生する可能性があります。
KeyUpは捕まえられるのでそちらを判定すると良いかもしれません。
多分、原因はコレ(↓)です
[Using the IgnoreAltTab Fix] http://bit.ly/yROOL6

RawInputManagerの使用例


前述の通り、RawInputManagerはCodeProjectのHookManagerに似せた実装を行っており、同じように使用することができます。
以下にRawInputManagerを使用する例を示します。
using System;
using System.Windows.Forms;
using com.yu1row.tools;

public class frmTest : Form
{
   ...
   public frmTest()
   {
      InitializeComponent();
      RawInputManager.KeyDown += new KeyEventHandler(RawInputManager_KeyDown);
      RawInputManager.MouseDown += new MouseEventHandler(RawInputManager_MouseDown);
   }

   void RawInputManager_MouseDown(object sender, MouseEventArgs e)
   {
      Console.WriteLine("Click: {0}", e.Button);
   }

   void RawInputManager_KeyDown(object sender, KeyEventArgs e)
   {
      Console.WriteLine("KeyDown: {0}", e.KeyData);
   }
   ...
}

KeyDownのKeyEventArgs


RawInputManagerのKeyEventArgsのKeyEventArgsは.NET Frameworkのクラスをそのまま使用していますが、メンバのAlt, Control, Shiftはtrueになることはありません。
 もしAlt, Control, Shiftキーが押されているかをハンドリングする場合、GetKeyStateを使用してキーの状態を調べるようにする方法があります。
以下にコード例を示します。
using System;
using System.Windows.Forms;
using com.yu1row.tools;

public class frmTest2 : Form
{
   [System.Runtime.InteropServices.DllImport("user32")]
   private static extern short GetKeyState(int vKey);
   private const int VK_SHIFT = 0x10;
   private const int VK_CONTROL = 0x11;
   private const int VK_MENU = 0x12;

   ...
   public frmTest2()
   {
      InitializeComponent();
      RawInputManager.KeyDown += new KeyEventHandler(RawInputManager_KeyDown);
   }

   void RawInputManager_KeyDown(object sender, KeyEventArgs e)
   {
      bool isDownShift   = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);
      bool isDownControl = ((GetKeyState(VK_CONTROL) & 0x80) == 0x80 ? true : false);
      bool isDownMenu    = ((GetKeyState(VK_MENU) & 0x80) == 0x80 ? true : false);
      if (isDownShift)   { Console.WriteLine("Pressed Shift key."); }
      if (isDownControl) { Console.WriteLine("Pressed Control key."); }
      if (isDownMenu)    { Console.WriteLine("Pressed Alt key."); }
      Console.WriteLine("KeyDown: {0}", e.KeyData);
   }
   ...
}

RawInputManager

ライブラリを公開します。
.NET Framework 2.0以降で使用可能な、RawInput系のAPIを使用して
グローバルフックに似た動きをする、C#やVB.Netで使えるDLLです。
このライブラリはWindows XP、Server 2003以降でのみ使用できます。
------------------------------
■Title
RawInputManager
■Version
0.0.1
■Date
2012/02/14
■ダウンロード
Direct link
------------------------------
使用例や作成に至った動機のエントリは以下を参照して下さい。
[RawInputを.NETで使う]