Archive for 10月, 2004

日付の妥当性チェック

土曜日, 10月 30th, 2004

日付の妥当性をチェックします。
Calendar#setLenient()にfalseをセットしてDateオブジェクトの生成を試みると、ありえないCalendarインスタンスは例外を投げます。
例:2004年02月29日はOK
例:2005年02月29日は例外

JAVA:
  1. /**
  2. * 与えられた日付が妥当であるかをチェックします。
  3. * author R.NAKAYA
  4. * @param strDate 8桁の生年月日 (1981年4月15日→19810415)
  5. * @return true:妥当である false:あり得ない日付
  6. */
  7. public static boolean isNotDateLenient(String strDate) {
  8. // 生年月日が8桁でない場合はエラー
  9. if (8 != strDate.length()) {
  10. return false;
  11. }
  12.  
  13. // 年・月・日の整数に変換
  14. int year = Integer.parseInt(strDate.substring(0, 4));
  15. int month = Integer.parseInt(strDate.substring(4, 6)) - 1;
  16. int day = Integer.parseInt(strDate.substring(6, strDate.length()));
  17.  
  18. Calendar cal = Calendar.getInstance();
  19. cal.setLenient(false); // 厳密なチェックを行う
  20. cal.set(year, month, day); // 日付を指定
  21.  
  22. try {
  23. // Dateオブジェクトを生成してみて、例外が発生するかを試す
  24. Date date = cal.getTime();
  25. return false;
  26. }
  27. return true;
  28. }
  29. }

たいがい、このようなチェックはWebではJavaScriptで行うのですが、携帯サイトなどのチェック用に。



Oracleで日付を和暦で取得する

木曜日, 10月 28th, 2004

Oracleで日付データを和暦で取る。

SQL:
  1. SELECT TO_CHAR(sysdate, 'EYY.MM.DD', 'nls_calendar=''Japanese Imperial''') AS 年月日 FROM DUAL

で平成XX年XX月XX日とかが取得できる。

ちなみに1601年とかしても、サポートされていません。
文明開化以降はサポートしてるみたいです。



データベースを簡単に操作

水曜日, 10月 20th, 2004

 開発現場に行くと、たいてい、Oracle + オブジェクトブラウザの組み合わせなんですが、私はなんか、オブジェクトブラウザの操作性には不満が合って仕方ないんです。ので、私は Tsumiki Software の Common Sql Environment 派です。

 すごい使いやすいのに、フリーウェアというのがすごい。UI は、すっきりしてて、無駄が無いと思います。
 Oracle, DB2, MySql, ODBC接続といった感じで、大抵のRDBMSに接続できます。
 Oracle に接続するには、Oracle Client が入ってれば、接続文字列とユーザー名とパスワードで接続できます。
 変更のコミットとかが、「コミットした!!」という感じでサクサクできて気持ち良いです。オブジェクトブラウザはコミットできたかできてないか、いまいちパッとしない。
 要望としては、空文字との区別をしてほしいです。NULLのカラムをNULL表示、もしくはNULLとわかるようにして欲しい。
あと、クエリのエディタが使いにくい。



ライブラリのリンクについて

火曜日, 10月 19th, 2004

 あるソフトウェアを前の会社の先輩方と作ってます。趣味みたいな感じで。私はC++を仕事でやったこと無いので、足を引っ張りまくりです。私が雛型を作った、わかりにくいプロジェクト(先輩いわく、パッと見、C++だけど、中身はC言語)を先輩がまとめてくださったんですが、複雑になって返ってきました(私には複雑にみえるだけ)。特に外部ライブラリに付いて質問したところ、昨日、先輩がメールで詳細に教えてくださったので、忘れないようにメモっておく。というか、まる写し。

LIB形式でのリンクは、静的リンク(スタティックリンク)といって
ビルド時に、必要なモジュールを全てリンクするので、EXEのみで実行可能となりますので、使いやすい方法です。当然、LIBファイルを変更すると、EXEも再ビルドする必要がありますし、ファイルサイズ、使用メモリサイズが増加します。
 一方、DLL形式でのリンクは、動的リンク(ダイナミックリンク)といい、こちらは実行時に必要なモジュールをロードするので、EXE以外にDLLファイルが必要となります。反面、EXEとDLLは独立しているので、I/Fさえ同じであれば、DLLを変更した際は、DLLを入れ替えるだけでよく、EXEのファイルサイズ、使用メモリサイズは少ないことになります。

ということ。 去年はDLLを作らされたけど、いまさらその利点がわかった気がします。



Video for Windows

木曜日, 10月 14th, 2004

USBカメラなんかで、キャプチャする方法。Video for Windows というマクロを使用します。

  • まずはライブラリにリンクさせる
  • #include <vfw.h>
    #pragma comment(lib,"vfw32.lib")
  • キャプチャーウィンドウをつくる
  • // キャプチャウインドを作成する
    //失敗するとNULLが返る。成功するとキャプチャハンドルが返る。
    ghWndCap = capCreateCaptureWindow(
    	(LPTSTR) TEXT(""),// タイトルバー用の文字列
    	WS_CHILD | WS_VISIBLE,	// ウィンドウスタイル
    	225, 70, 500, 600,		// 左上の座標・横幅×高さ
    	(HWND) hWnd, 		// 親ウインドのハンドル
    	(int)0 );			// ウインドウ識別子
    
    capDriverConnect( hWndCap, 0 ); //	接続
    
    // デフォルトでプレビューを開始する
    capPreviewRate(ghWndCap, MS_FOR_15FPS) ;
    capPreview(ghWndCap, TRUE) ;

    これで何とかダイアログにキャプチャウインドウがでた。
    今回使ったカメラはI/O DATAのUSBCAM 30V です。

    参考リンク

  • Concept!のVideo Capture項
  • 。少なくとも私が持ってるMSDNのVideo for Windowsの項は日本語でないので、ここの日本語訳はものすごくたすかりました。



    帰鹿

    日曜日, 10月 10th, 2004

     「帰鹿します」といって、何のことかわかる人はあまりいないでしょうが、
    鹿児島に帰ります、ということです。
    私は約一年、転勤で鹿児島に住んでいました。いいところです。人は優しいし、焼酎はおいしいし。鹿児島には、また住みたいです。
     というわけで、鹿児島に遊びに行くときは、先輩や友達に「○月○日に帰鹿いたします。」と伝えます。
     今回もそんな感じで、友達二人と高速道路使わずに貧乏旅行をいたしました。片道7時間半…。
     着いてから、いきなり、飲み会。ハードスケジュールでしたが、楽しかったです。色々あったし。
     会社が変わってもいっしょに飲んでくださる鹿児島の方々、感謝しております。

     ところで、九州新幹線が開通して、西駅がかなり変わってました。西駅じゃなくて、鹿児島中央駅ですか。地下道できて、アミュプラザできてたし。アミュプラザは中々いろんなお店が入ってて楽しかったです。天文館むじゃきの白熊、おいしかったです。
     今度は、八代から新幹線に乗って行きたい。



    商売の為のヘッダファイル (*.h)

    火曜日, 10月 5th, 2004

     Java 言語からシステム開発の仕事を始めた私は、一般的な情報処理技術者が基とするC言語の知識に乏しい。ので、このブログの「C++」というカテゴリには初歩の初歩、みたいなことが書かれる。
     C++であるクラスを作った。ヘッダファイル (*.h) というファイルにライブラリのリンクとか変数の初期化とかを書けるらしいと気づき、とりあえずフィールド変数の初期化と include とかを記述。しかし、なんで、ヘッダファイルと本体のファイルに分けたりするのだろうか?と疑問に思っていた。
     ある日、一緒に仕事をしていたカリスマSE、(私の中で一生かけても追いつけそうにない人)Sさんにその事を聞いてみた。こんな質問をしても馬鹿にしないで答えてくれるSさんの、そんなところが尊敬できる。

    例えば、あるライブラリのソースを非公開にして高い値段で配布する。このとき、ライブラリの中身は、見えないから、そのライブラリに付随するヘッダファイルを本体にincludeしてライブラリ内の変数や関数を使う。ヘッダファイルはそんな商売の為のファイルだ。M****Softが絡むと、Javaみたいになんでもかんでもオープンソースではないのだよ。

    というような事を教えてくれた。(もっと丁寧な口調です。)
    なるほど。