開発関連の覚書

 今までに自分が携わったプロジェクトで関連した記述関連の覚書です。
そのため、公開することを目的にしている訳ではありませんので、多少いい加減なところや、間違っている説明や、情報がかなり古いものもあります。
そのことを踏まえたうえで、ご参考にして下さい。

タイトル 概要 作成日 更新日
swing swing関連の簡単なサンプル 2004/04/26
JAVA1.4 java1.4関連の簡単な説明 2004/04/26
TOMCAT tomcat設定関連の簡単な説明 2004/04/26
Struts1.2 Struts1.2関連の簡単なサンプル 2004/04/26
Struts1.3 Struts1.3関連の簡単なサンプル 2007/03/12
Cactus Cactus関連の簡単な説明 2004/04/26
Ajax Ajax関連の簡単な説明 2007/12/19
Selenium Selenium関連の簡単な説明 2007/03/26
BREW 某大手通信会社のプロジェクトで初めてBREWを使いました。 2006/12/01 2006/12/01
SQL関連 SQL関連の簡単な覚書 2009/02/12
テーブル設計 某大手求人広告出版会社のプロジェクトで、テーブル設計を担当した時の設計手順をまとめてみました。 2007/01/25 2007/01/25
MFC MFCに関する覚書です。各アプリケーションのソース公開をしている共通関数の説明になります。
ソースを見たほうが理解が早い方は、ソースをダウンロードして下さい。
C++Builder3 C++Builder3に関する覚書です。
16ビット版アセンブラ 仕事ではアセンブラに関わる事は全くありませんでした。趣味でPICボードのプログラムをしていた際に、勉強のためにまとめてみました。 2007/01/25
LINUX関連 忘れた頃に、LINUX関連の開発に携わることがあるので、簡単にまとめてみました。 2007/09/13
家電制御 趣味で作成した家電を制御するWEBシステムの構築方法。 2007/01/25
その他 インストールなどに関する情報。 2007/03/25 2007/03/25


■SWING
■グラフィック【ダブルバッファリング】
java.awt.Image off_img = null;
Graphics off_g = null;

  this.prepareImage( img, バッファサイズX, バッファサイズY, this);
  off_img = createImage(バッファサイズX, バッファサイズY);
  off_g = off_img.getGraphics();

  public void paint( Graphics g ) {
    super.paint(off_g);
    off_g.描画メソッド
    g.drawImage(off_img,0,0,this);
  }

■テーブル【行モードの変更】
行モードを変更したいテーブルに対して、モード変更を行うだけで良い。以下の例は1行選択モードの場合です。
なお、デフォルトのテーブルモードは、複数選択可能なモードに設定されています。
  Table table = new JTable(model);
  table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

■テーブル【列サイズの変更】
  int[] col = {10,10,10,10,};
  Table table = new JTable(model);
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  TableColumnModel colModel = table.getColumnModel();
  for( int loopCounter=0; loopCounter TableColumn tableCol = colModel.getColumn(loopCounter);
    tableCol.setPreferredWidth( col[loopCounter] );
  }

■テーブル【読み取り専用のテーブル】
以下のように使用しているテーブルモデルを派生する形で、isCellEditableメソッドをオーバーライドする方法が一番簡単である。
なお、デフォルトでは、isCellEditableメソッドは常にTRUEを返します。
class NoEditTableModel extends DefaultTableModel {

  public NoEditTableModel( String[][] data, String[] colmun ) {
    super(data, colmun);
  }

  public boolean isCellEditable(int rowIndex,int colmunIndex) {
    return false;
  }
}

■アクションリスナー【リスナーの追加】
以下は、マウスリスナーの追加例です。
リスナーを追加したいオブジェクト.addMouseListener(
  new MouseListener() {
    public void mouseClicked(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){} } );

■その他【確認ダイアログの表示】
JOptionPane.showMessageDialog(null, "ここにメッセージを設定します。",
  "ERROR", JOptionPane.ERROR_MESSAGE);

■JAVA1.4
■外部プログラムを実行する
    Process proc = Runtime.getRuntime().exec("C:\\Temp\\xxxx.exe");
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line = "";
    while ( (line = in.readLine()) != null )
    {
      System.out.println(line);
    }
    in.close();
    proc.waitFor();
    proc.destroy();

■TOMCAT
■TOMCATで用意されているエラーページを非表示にする
アプリケーションで例外処理を行っていない場合には、アプリケーションサーバーで用意されているエラーページ(通常は例外情報)が表示される。
このエラーページでなく、オリジナルのエラーページを表示するには、WEB.XMLに以下の設定を追加する。
<web-app> <error-page> <error-code>404</error-code> <location>/error/error.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/error.jsp</location> </error-page> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/error/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.StackOverflowError</exception-type> <location>/error/error.jsp</location> </error-page> </web-app>

■サーブレット起動の初期値設定
アプリケーションサーバーには、サーブレット起動時に予め定義したパラメータを渡すことができる。
<web-app> <servlet> <servlet-name> サーブレットエイリアス名 </servlet-name> <servlet-class> サーブレット名 </servlet-class> <init-param> <param-name>KEY</param-name> <param-value>初期値のデータ</param-value> </init-param> </servlet> </web-app>

■JSP以外のファイル設定
<web-app>
    <servlet-mapping>
        <servlet-name>jsp </servlet-name>
        <url-pattern>*.txt</url-pattern>
    </servlet-mapping>
</web-app>

■BREW
■BREWに関連する資料
 BREWに関連する資料は、ほとんどない状態といっても良いでしょう。
BREWに関する情報が少ない中で、下記の書籍は、とても詳しく説明されています。C言語を2年程度経験があり、組み込み系の開発経験があれば、この書籍に書かれている説明で、問題ないと思います。

■テーブル設計

 設計の手順、方法は、色々な種類があります。私の場合には、ほとんどのプロジェクトでは詳細設計からの参画がほとんどなので、正式に一連のフェーズを経験したことがありません。
そんな自分に、2006年12月の中旬から、テーブル設計を担当することになりました。

もちろんテーブル設計も初めて経験です。
不安もありますが、担当者になってしまったからには、やるしかありません。どの仕事もそうでしょうが、仕事を選べないというのは、本当に辛いです。でも、信用されているから、一人でこのような仕事を任されたんだと自分を励ましながらがんばりたいと思います。

まずは、代表的な設計手順を知るために、以下にまとめてみました。

このような大まかな流れのなかで、テーブル設計は外部設計に属します。

それでは、今回の設計での大まかな流れを以下にまとめてみました。
例 DB項目の洗い出し一覧
No 大機能 中機能 小機能 論理名称 物理名称 属性 桁数
1 ○○機能 □□機能 △△機能 ユーザー名称 user_name 文字列 40
2 ○○機能 □□機能 △△機能 生年月日 birthday 日付型 -
50 ○○機能 □□機能 △△機能 請求金額 amount 数値型 11,0

■MFC
■ダイアログベースのアプリケーションのループ処理
  while(true) {
    //ゲーム処理をここに記述
    while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {
      if(::GetMessage(&msg,NULL,NULL,NULL)) {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
      }
    }
  }

■乱数生成
  //  乱数系列の変更
  srand((unsigned) time(NULL));
  int startRand = rand() % 10 + 1;

■C++Builder3
■RS232C関連
/*---------------------------------------------------------------------*/
/* (HANDLE)                                                            */
/* Open( BSTR lpComName )                                              */
/* [機  能] : RS232Cポートをオープンして、バッファを初期化する   */
/* [引  数] : lpComName(BSTR) : オープンするRS232Cポート名       */
/*                              (例:com1)                             */
/* [戻り値] : hRsFd(HANDLE)   : RS232Cのファイルディスクプリタ   */
/*                               ( -1 の場合はエラー)                  */
/*---------------------------------------------------------------------*/
int CRs232c::Open( LPSTR lpComName )
{
	// RS232Cポートのオープン
	hRsFd = CreateFile( ( LPSTR )lpComName, GENERIC_READ|GENERIC_WRITE,
        0, NULL, OPEN_EXISTING, 0, NULL );
	if ( hRsFd == INVALID_HANDLE_VALUE )
	{
		dwErrNo = GetLastError();
		return( ( HANDLE )-1 );
	}
	return 0;
}

/*---------------------------------------------------------------------*/
/* (int)                                                               */
/* Init( int BaudRate, int ByteSize,                                   */
/*                        int StopBits, int Parity, BOOL XONOFF )      */
/* [機  能] : RS232Cポートを初期化する。                         */
/* [引  数] : hRsFd(HANDLE) : ファイルディスクプリタ                   */
/*            BaudRate(int) : ボーレート                               */
/*            ByteSize(int) : データ( 4 〜 8 )                         */
/*            StopBits(int) : ストップビット( 1=1 or 2=1.5 or 3=2 )    */
/*            Parity(int)   : パリティー                               */
/*                             ( 1=EVEN or 2=ODD or 3=NON or 4=MARK )  */
/*            XONOFF(BOOL)  : XON/OFF制御( TRUE or FALSE )             */
/* [戻り値] : 0(int)        : 正常終了                                 */
/*            -1(int)       : 異常終了                                 */
/*---------------------------------------------------------------------*/
int CRs232c::Init( int BaudRate, int ByteSize, int StopBits, int Parity,
                                                                   BOOL XONOFF )
{
	DCB   dcb;   // DCB構造体

	// 現在のRS232C設定情報を取得する
	// 取得した情報を外部変数に保存する
	memset( &OrgDcb, 0x00, sizeof( OrgDcb ) );
	if ( GetCommState( hRsFd, &OrgDcb ) == FALSE )
	{
		dwErrNo = GetLastError();
		return( -1 );
	}

	// 既存情報を内部変数にコピーする
	memset( &dcb, 0x00,    sizeof( dcb )    );
	memcpy( &dcb, &OrgDcb, sizeof( OrgDcb ) );

	// 通信設定
	dcb.DCBlength     = sizeof( DCB );	// DCB構造体サイズ
	dcb.fAbortOnError = TRUE;			// アボートエラー設定

	dcb.BaudRate      = BaudRate;		// ボーレート設定
	dcb.ByteSize      = (BYTE)ByteSize;		// データビット設定
	dcb.fOutX         = XONOFF;		// XON設定
	dcb.fInX          = XONOFF;		// XOFF設定

	dcb.fBinary           = TRUE;		// バイナリー転送(WindowsNTは必ずTRUE)
	dcb.fOutxCtsFlow      = FALSE;
	dcb.fOutxDsrFlow      = FALSE;
	dcb.fDtrControl       = DTR_CONTROL_HANDSHAKE;
	dcb.fDsrSensitivity   = FALSE;
	dcb.fTXContinueOnXoff = TRUE;
	dcb.fErrorChar        = FALSE;
	dcb.fRtsControl       = RTS_CONTROL_HANDSHAKE;
    	dcb.StopBits          = TWOSTOPBITS;

	// パリティ設定
	switch( Parity )
	{
		case 1 :   // 偶数パリティー
			dcb.fParity           = TRUE;
			dcb.Parity            = EVENPARITY;
			break;
		case 2 :   // 奇数パリティー
			dcb.fParity           = TRUE;
			dcb.Parity            = ODDPARITY;
			break;
		case 4 :   // マーク
			dcb.fParity           = TRUE;
			dcb.Parity            = MARKPARITY;
			break;
		default :   // パリティーなし
			dcb.fParity           = FALSE;
			dcb.Parity            = NOPARITY;
			break;
	}

	// 設定
	if ( SetCommState( hRsFd, &dcb ) == FALSE )
	{
		dwErrNo = GetLastError();
		return( -1 );
	}

	// RS232Cバッファの初期化
	PurgeComm( hRsFd, PURGE_TXCLEAR|PURGE_RXCLEAR );

	// 正常終了
	return( 0 );
}

/*---------------------------------------------------------------------*/
/* (int)                                                               */
/* Close( void )                                                       */
/* [機  能] : RS232Cポートをクローズする。                       */
/* [引  数] : hRsFd(HANDLE) : ファイルディスクプリタ                   */
/* [戻り値] :  0(int)       : 正常終了                                 */
/*            -1(int)       : 異常終了                                 */
/*---------------------------------------------------------------------*/
int CRs232c::Close( void )
{
	// RS232Cポートがオープンされているかチェックする
	if ( hRsFd <= 0 )
		return( 0 );

	// RS232Cのクローズ
	if ( CloseHandle( hRsFd ) != TRUE )
	{
		dwErrNo = GetLastError();
		return( -1 );
	}

	// 正常終了
	return( 0 );
}

/*---------------------------------------------------------------------*/
/* (int)                                                               */
/* TimeOutSet( HANDLE hRsFd, DWORD dwReadTimeOut,                      */
/*                              DWORD dwWriteTimeOut )                 */
/* [機  能] : RS232Cの操作(read,write)に関するタイムアウト時間   */
/*            を設定する。                                             */
/* [引  数] : hRsFd(HANDLE)         : ファイルディスクプリタ           */
/*            dwReadTimeOut(DWORD)  : 読込みのタイムアウト設定値(m秒)  */
/*            dwWriteTimeOut(DWORD) : 書込みのタイムアウト設定値(m秒)  */
/* [戻り値] :  0(int)               : 正常終了                         */
/*            -1(int)               : 異常終了                         */
/*---------------------------------------------------------------------*/
int CRs232c::TimeOutSet( DWORD dwReadTimeOut, DWORD dwWriteTimeOut )
{
	COMMTIMEOUTS   tmo;   // タイムアウト設定構造体

	// タイムアウトの設定
	tmo.ReadIntervalTimeout         = 0;
	tmo.ReadTotalTimeoutMultiplier  = 0;
	tmo.ReadTotalTimeoutConstant    = dwReadTimeOut;
	tmo.WriteTotalTimeoutMultiplier = 0;
	tmo.WriteTotalTimeoutConstant   = dwWriteTimeOut;
	if ( SetCommTimeouts( hRsFd, &tmo ) == FALSE )
	{
		dwErrNo = GetLastError();
		return( -1 );
	}

	// 正常終了
	return( 0 );
}

/*---------------------------------------------------------------------*/
/* (void)                                                              */
/* BuffReset( HANDLE hRsFd )                                           */
/* [機  能] : RS232Cのバッファを初期化する。                     */
/* [引  数] : hRsFd(HANDLE) : ファイルディスクプリタ                   */
/* [戻り値] : 無し                                                     */
/*---------------------------------------------------------------------*/
void CRs232c::BuffReset( void )
{
	// RS232Cバッファの初期化
	PurgeComm( hRsFd, PURGE_TXCLEAR|PURGE_RXCLEAR );
}

/*---------------------------------------------------------------------*/
/* (int)                                                               */
/* Write( BSTR bsBuff, DWORD dwSize )                    */
/* [機  能] : RS232Cに指定された情報を書き込む。                 */
/* [引  数] : hRsFd(HANDLE)  : ファイルディスクプリタ                  */
/*            bsBuff(BSTR)   : 書き込む情報                            */
/*            dwSize(DWORD)  : 書き込む情報のバイト数                  */
/* [戻り値] : dwSndSize(int) : 実際に書き込んだバイト数                */
/*                             ( -1 の場合はエラー)                    */
/*---------------------------------------------------------------------*/
int CRs232c::Write( LPSTR bsBuff, DWORD dwSize )
{
	DWORD   dwSndSize;   // 書き込んだサイズ

	// RS232Cへデータを書き込む
	if ( WriteFile( hRsFd, bsBuff, dwSize, &dwSndSize, NULL ) == FALSE )
		return( -1 );

	// 正常終了
	return( ( int )dwSndSize );
}

/*---------------------------------------------------------------------*/
/* (int)                                                               */
/* Read( BSTR* bsBuff, DWORD dwSize )                                  */
/* [機  能] : RS232Cから指定されたバッファに情報を読込む。       */
/* [引  数] : hRsFd(HANDLE)   : ファイルディスクプリタ                 */
/*            bsBuff(BSTR)    : 読込んだ情報の格納先                   */
/*            MaxBuffLen(int) : 読込む情報の最大バイト数               */
/* [戻り値] : dwRcvSize(int)  : 実際に読込んだバイト数                 */
/*                              ( -1 の場合はエラー)                   */
/*---------------------------------------------------------------------*/
int CRs232c::Read( LPSTR bsBuff, int MaxBuffLen)
{
	DWORD   dwRcvSize;   // 読込みサイズ
	LPSTR   lpBuff;      // バッファ

	// 変数の初期化
	lpBuff = ( LPSTR )bsBuff;

    	// RS232Cからデータを読込む
	if ( ReadFile( hRsFd, ( LPVOID )lpBuff, MaxBuffLen, &dwRcvSize, NULL ) == FALSE ){
		dwErrNo = GetLastError();
		return( -1 );
	}
	// 正常終了
	return((int) dwRcvSize );
}


■16ビットアセンブラ
■COMのサンプルプログラム
CODE	SEGMENT
	ASSUME	cs:CODE,ds:CODE
	ORG	100H
START:
	mov	ah,09H
	mov	dx,OFFSET MSG
	int	21H
	mov	ah,4CH
	int	21H

MSG	DB	"HELLO WORLD", 0DH, 0AH, '$'
CODE	ENDS
	END	START

■アセンブラに関連する資料
■その他
■PCG-Z505D
WindowsXPのインストールに成功しました。
Windows2000にインストールには失敗したので、駄目かなあと思っていたのですが、正常に動作できました。
ただし、動作はかなり重いのでメモリは512Mくらいはあったほうが良いでしょう。



■その他関連のリンク