ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Javaの画面表示-その6:Struts(その1:インストール)

2006-12-28 16:09:08 | JavaとWeb

シリーズJavaの画面表示のつづきです。前回までで、「JSPで画面表示部分とコントローラー、Javaのクラスでモデル」というのをやりました。今回から、MVCのフレームワークである、Strutsについてやります。

 まず、ダウンロードしてインストールからです。




■その前にTomcatをいれて置いてください
 Strutsは、Tomcatを使います(正しくは、サーブレットコンテナを使います。で、サーブレットコンテナの代表的なものとしてTomcatなので、Tomcatを使いましょう)。

 なので、Tomcatを入れて置いてください。

 なお、Tomcat4.1と4.0では若干違います。




■ダウンロード
 まず、Strutsのページに行きます。
 ここ http://struts.apache.org/

 そこに「Recent Releases」ってかいてあって、リリースしてあるStrutsの
バージョンとリリース日がかいてあるので、そこから選びます。

 まあ、1.3.5でも、落としてきて見ましょうか。
 ここ http://struts.apache.org/download.cgi#struts135

 まあ、Full Distributionでもえらんで、そいつを保存します。

 ZIPファイルなので、解凍してください。




■インストール
 そうすると、struts-1.3.5のフォルダの下に、appsとあって、その下に、いくつか
ファイルがあると思います。

 そのうち、struts-blank-1.3.5.warというファイルに対して、

1.コピーをとって

2.コピーしたものを、適当な名前.war というファイル名にして
  →適当な名前は、自分で勝手に決めてください
  (ここではstestとします。つまり、stest.warというファイル名にしたとします。)

3.Tomcatのフォルダの下にあるwebappsフォルダを開いて

4.そのwebappsフォルダの下に、2のwarファイルをおきます。

5.ここで、Tomcatが4.1なら、ちょっと待っていると、フォルダが作成されます。
  4.0以前の場合は、Tomcatが動いていなかったら、起動、
  動いていたら再起動してください。
  →webappsの下に、その「適当な名前」のフォルダができるはずです。
  (上記の例だとstestというフォルダができます)

6.ブラウザでTomcat経由でそこをみると、
  すなわち、http://127.0.0.1:8080/適当な名前
  (例の場合http://127.0.0.1:8080/stest)
  なんか、でてきたらOKです。
  ちなみに、今までのことが英語で出てくるので、
  「今頃そんなことかいても、意味ねージャン」とか、「欧米か」とか
  適当にディスプレイに向かってツッコミを入れてください
  (うそ、いれなくていいです ^^;)




 ということで、このシリーズの次回から、インストールはできたということにして、
 その先の話を書きます。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その26:イベント追加 説明)。

2006-12-28 14:12:43 | ケータイ

 BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 前回、ソースを公開したのですが、字数の関係上、説明が書けませんでしたので、
 その説明を書いておきます。



■ソースの概要
 マクロは、それぞれの仕様書によってことなる固有部分と、
 この雛形からソースを出す場合には、共通する標準処理とかありますが、
 今回は固有部分を説明します。

 標準処理に関しては、
仕様書からBREWのソースファイル自動生成
http://www.geocities.jp/xmldtp/bw_makebrew.htm

のダウンロードから、ダウンロードしていただき、そこの仕様書のマクロを見ればあります。
それと、まったく同じものです。

固有部分に関しては
・標準処理の前処理initAppData
・標準処理の後処理freeAppData
は記述しないといけないことになっています。
(何もすることがなければ、中身は空っぽの関数を書く)
なので、以下それと、そこから呼ばれる関数などについて書きます。




■前処理initAppData
 前処理に関しては前々回書いたとおりです((4)の内容をちょっとかえています*)。

 つまりこんな感じ
(1)作業一覧シートをクリア
(2)シートに対して、以下の処理をする
    (あ)シートが画面一覧だったら、
      アプリ用ソース、ヘッダ、バージョンファイルの書き出し指示を
      作業一覧シートに書き出す

    (い)シートが画面定義だったら
      画面名を保持し、画面用ソース、ヘッダの書き出し指示を
      作業一覧シートに書き出す
    
(3)保持しておいた画面名をもとに、画面用作業シートを作成する
      この中で、イベントがあれば、
       関数makeSagyoSheetで、画面イベント用作業シートも作成する

(4)保持しておいた画面名をもとに、画面用作業シートを検索し
   画面イベント用ソースとヘッダの書き出し指示を
   作業一覧シートに書き出す

のちに、今回出てきた、画面用作業シート作成makeSagyoSheetについて書きます

*従来の(4)、すなわち、画面イベント用のシート書き出しは、makeSagyoSheetの中で行っています。そして、イベント用の作業一覧シートへの書き出しについて、前に触れていませんでしたが、ここで行いますので、かわりに(4)に書いてあります。




■後処理freeAppDataについて

 作業用シートは画面用でもイベント用でも、頭に@をつけているので、

1.まず、@がついているシートを探して、
2.そのあとで、それらを削除しています。

ただ、単純に削除しようとすると、ダイアログが
でて、削除していいか聞いてきます。それを抑制するために
Application.DisplayAlerts = False
でとめて
Application.DisplayAlerts = True
で元に戻しています。



■画面用作業シート書き出しmakeSagyoSheet
画面定義が書かれているシートを初めからみていって、

”メニュー一覧”という言葉が出てくるまでは、画面定義とみなし、
   その内容を、作業用シートの画面定義のところにコピーします。

”メニュー一覧”から、”イベント一覧”までは、メニューの定義とみなし、
   その内容を、作業用シートのメニューのところにコピーします。

”イベント一覧”という言葉以降は、イベント定義とみなし、
   makeEventListという関数を使ってイベントのための処理をします

以降、イベント定義の処理makeEventListを説明します




■イベント定義の処理makeEventList
ここでは、
・画面定義のイベント一覧の内容を、作業用シートにうつす
・イベントの種類をgetEventModeを使って決定し、書き出し
・イベントクラスを取得し、そのシートがなかったら、
  makeEventSheetでシートを作成し、基本的事項を書いた上で、
  作業用シート、イベント用シートにイベント関数を書き出す

と、以上の処理をおこなっています。
ただし、現在これは、1つの画面に複数のイベントの場合しか対応していません。
複数の画面で、1つのイベント処理というケースにもち追うさせるには、この
makeEventListのイベントクラスと、イベント用シートの書き方を修正しないと
いけませんが、今回は複雑になりそうなので、ここでやめています。




■このシリーズの今後について

 これで、「仕様書からプログラムソースを生成」したので、このシリーズは、ここで終わりです。ということで、BREWのシリーズも、ここで終了ということになり、今後のBREWの内容は、このブログでは、(シリーズでなく)単発的にとりあげることになると思います。

 また新たなお話ができそうだったら、新しいBREWシリーズをやりますけど、今のところ予定はないです。

 なお、この仕様書の公開、及び、今後のBREWに関するウィリアムのいたずらの活動拠点は、以下のサイト
BREW関係
http://www.geocities.jp/xmldtp/index_brew.htm

ということになります。いままでも、このサイトはありましたが、今後のウィリアムのいたずらのBREWの活動は、こっちに書いて、ブログのほうは、メモとかサブ的な役割になります。

 なお、来年から、このシリーズの続きとして、iアプリを利用して、同じように仕様書からプログラムを自動生成することを考えます。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

子供に、ゲーム「制作者の意図まで理解させ」る。。すげー(@_@!)マネージャーの悲哀とか?

2006-12-27 18:31:03 | Weblog

ここの
「ゲームが暴力を助長。"倒された者の家族の気持ち"などを考えさせるゲームリテラシー教育を」…専門家
http://blog.livedoor.jp/dqnplus/archives/885694.html

なんだけど、いや、途中までは、よくある話で、面白くないんだけど。。

こんな文があるのよ(以下斜体は上記記事より引用)

倒された者の家族はどんな気持ちか-など、「ゲームに描かれていないもの」を考えることで、暴力は「ゲームの中のもの」と理解させることは可能だという。

ゲームリテラシー教育とは、子供にゲームに描かれていない背景、制作者の意図まで理解させ、子供がゲームにコントロールされないように教えることだ。


ゲームの「制作者の意図まで理解させ」るんだって(@_@!)
えーっとえーっと、じゃあ、

どうしてここのグラフィックが荒いかというと、
ここを細かくしてしまうと、グラフィックの
処理スピードが間に合わなくなってしまうので、
荒くしてる
とか。。。

どうして、こーいう画面割なの?
とかいったら、いや、こういう開発ツールをつくってしまっているので、
それ以外の画面だとシステムつくりなおさないといけないのよ
とか。。。。

どーして、暴力シーンが多いの?
っていったら、いや、企画の何々さんが、そー言うのが好きで、
さらにこの前ヒットしたんで、
冒険したくない上の連中は、またもや、おなじものを作って
2匹目のどじょうをねらってるわけ。

いや、もっと、リズムゲーとか、つくりたいんだよ、つくりたいんだけど、
上が認めてくれないのさー、アクションモノのほうが、あたるだろー。
ほら、それに、グラフィックエンジンも作っちゃってるわけで、
さらにデザイナーも抱えちゃってるわけで。。

。。。とか、そーいうもんだよねえ。。
「制作者」の意図って、
よーするに、マネージャーの悲哀とか。。

うーん、たしかに、そーすれば、暴力シーンも、押さえられるかもしれませんね。
つまり、暴力シーンが多いのは、そういうのを買う人が多いからであって、
みんなが、オシャレ魔女に夢中になれば、そっちのゲームが増えると。。

そこまで考えたら、ゲームに左右されることもなくなるかもしれません。。




 それと、

 「ゲームに描かれていないもの」を考える。。。

 って、仕様書とか? 企画書とか。。

 このプラットホームだと、ユーザーがこれくらいいそうだから、
 この程度の開発費をペイさせるには。。
 やっぱ、グラフィックはさておき、
 このプラットフォームで行きましょうとか?


 たしかに、そこまで考えたら、

「ゲームに描かれていないもの」を考えることで、暴力は「ゲームの中のもの」と理解させることは可能

 かもしれない。つまり、ゲームメーカーは、採算をとることが必要なんであって、
 ゲームの企画者やマネージャーの多くは別に暴力が好きなわけじゃない。
 (もっと売れる分野があったら、そっちのほうが好きだ)
 →下のほうの人には、個人的に好きという人は、もちろんいると思いますが、
  上に行けばいくほど、それより、採算を重視すると思います。

 つまり、暴力シーンは、売れるからゲームの中でやってるわけであって、
 売れなくなって、たとえば、美少女萌え萌え系が、はやれば、
 すぐに、そっちのほうをつくる。。

 っていう現実を知ってしまえば、夢も希望もなくなって、
 子供はゲームしなくなるかも。。

 それが良いか悪いかは別として、
 そこまでいけば、世の中、すごいことになるかもしんない。。

幼稚園でも早すぎることはありません

 うーん、そこまでの現実を知ってしまうことは、幼稚園でも早くないのか。。
 そーすると、その子たちは、小学生になったら、株でもやりだすだろうな。。




 って、ウィリアムのいたずら、なにか、勘違いしてる??
 文字通りによむと、そうやって読めてしまうんだけど。。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その25:イベント追加 ソース)

2006-12-27 17:38:37 | Weblog

 シリーズ仕様書からプログラムソースを生成する方法の続きです。
字数の関係で、以下、いきなりですが、ソースです
Public Const gamen_teigi_str_gyo As Integer = 5

'//=========================//
'//     前処理              //
'//=========================//
Sub initAppData()
    Dim gyo As Integer
    Dim pathdir As String
    Dim i As Integer
    Dim j As Integer
    Dim gamenSu As Integer
    Dim sagyoShname As String
    Dim sagyoSh As Worksheet
    Dim shname() As String
    
    gyo = Sheets("作業一覧").Range("A65536").End(xlUp).Row
    If (gyo >= 5) Then
        Sheets("作業一覧").Range("A5:C" & CStr(gyo)).Clear
    End If
    
    '// 値の初期設定
    pathdir = ActiveWorkbook.Path 
    gyo = 5
    
    '// 主処理:作業一覧の書き出し
    gamenSu = 0
    For i = 1 To Sheets.Count

            '■ 画面一覧の場合
        If (Sheets(i).Range("B1") = "画面一覧") Then
                
                '// アプリ用ソース書き出し
            Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥app_c.txt"
            Sheets("作業一覧").Cells(gyo, 2) = Sheets(i).Name
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(i).Range("B2") & ".c"
            gyo = gyo + 1
            
                '// アプリ用ヘッダー書き出し
            Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥app_h.txt"
            Sheets("作業一覧").Cells(gyo, 2) = Sheets(i).Name
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(i).Range("B2") & ".h"
            gyo = gyo + 1
            
                '// バージョン用書き出し
            Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥version_h.txt"
            Sheets("作業一覧").Cells(gyo, 2) = Sheets(i).Name
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥version.h"
            gyo = gyo + 1
        End If

            '■ 各画面定義の場合
        If (Sheets(i).Range("B1") = "画面定義") Then
                
                '// 新規画面用にシート名保存
            ReDim Preserve shname(gamenSu + 1)
            shname(gamenSu) = Sheets(i).Name
            sagyoShname = "@" & Sheets(i).Name
            gamenSu = gamenSu + 1
            
                '// 画面用ソース書き出し
            If (Sheets(i).Cells(gamen_teigi_str_gyo, 1) = "") Then
                Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_c.txt"
            Else
                Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_b_c.txt"
            End If
            Sheets("作業一覧").Cells(gyo, 2) = sagyoShname
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(i).Range("D2") & ".c"
            gyo = gyo + 1
            
                '// 画面用ヘッダ書き出し
            If (Sheets(i).Cells(gamen_teigi_str_gyo, 1) = "") Then
                Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_h.txt"
            Else
                Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_b_h.txt"
            End If
            Sheets("作業一覧").Cells(gyo, 2) = sagyoShname
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(i).Range("D2") & ".h"
            gyo = gyo + 1
        End If
    
    Next
    
    '// 主処理2:作業用画面定義の作成
    For i = 0 To gamenSu - 1
        Set sagyoSh = Sheets.Add()
        sagyoShname = "@" & shname(i)
        sagyoSh.Name = sagyoShname
        Call makeSagyoSheet(sagyoShname, shname(i))
        Set sagyoSh = Nothing
    Next
    
    '// 主処理3:画面イベント処理の作成
    For i = 0 To gamenSu - 1
        sagyoShname = "@" & shname(i)
        j = 5
        Do While (Sheets(sagyoShname).Cells(j, 13) <> "")
            Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_event_h.txt"
            Sheets("作業一覧").Cells(gyo, 2) = "@" & Sheets(sagyoShname).Cells(j, 13)
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(sagyoShname).Cells(j, 13) & ".h"
            gyo = gyo + 1
            Sheets("作業一覧").Cells(gyo, 1) = pathdir & "¥gamen_event_c.txt"
            Sheets("作業一覧").Cells(gyo, 2) = "@" & Sheets(sagyoShname).Cells(j, 13)
            Sheets("作業一覧").Cells(gyo, 3) = pathdir & "¥" & Sheets(sagyoShname).Cells(j, 13) & ".c"
            gyo = gyo + 1
            j = j + 1
        Loop
    Next
    
End Sub

'//=========================//
'//     後処理              //
'//=========================//
Sub freeAppData()
    Dim sagyoShname As String
    Dim sagyoSh As Worksheet
    Dim shname() As String
    Dim i As Integer
    Dim j As Integer
    
    '// 主処理1:作業用画面定義の取得
    j = 0
    For i = 1 To Sheets.Count
        If (Left(Sheets(i).Name, 1) = "@") Then
                '// 新規画面用にシート名保存
            ReDim Preserve shname(j + 1)
            shname(j) = Sheets(i).Name
            j = j + 1
        End If
    Next
    
    '// 主処理2:作業用画面定義の削除
    Application.DisplayAlerts = False
    For i = 0 To j - 1
        Sheets(shname(i)).Delete
    Next
    Application.DisplayAlerts = True

End Sub


'//=========================//
'//  作業用シート書き出し   //
'//=========================//
Sub makeSagyoSheet(shname As String, motoname As String)
    Dim sakiSheet As Worksheet
    Dim motoSheet As Worksheet
    Dim lastGyo As Integer
    Dim i As Integer
    Dim j As Integer
    Dim sts As Integer
    Dim strMenuGyo As Integer
    Dim strEventGyo As Integer
    
    '// 元、先シートと最後の行を求める
    Set sakiSheet = Sheets(shname)
    Set motoSheet = Sheets(motoname)
    lastGyo = motoSheet.Range("A65536").End(xlUp).Row
    
    sts = 0
    For i = 1 To lastGyo
        Select Case sts
        Case 0:
            If (motoSheet.Cells(i, 1) = "メニュー一覧") Then
                sts = 1
                strMenuGyo = i
                For j = 1 To 4
                    sakiSheet.Cells(i - strMenuGyo + 3, j + 14) = motoSheet.Cells(i, j)
                Next
            ElseIf (motoSheet.Cells(i, 1) = "イベント一覧") Then
                sts = 2
                strEventGyo = i
                Call makeEventList(sakiSheet, motoSheet, strEventGyo, i)
            Else
                For j = 1 To 12
                    sakiSheet.Cells(i, j) = motoSheet.Cells(i, j)
                Next
            End If
        Case 1:
            If (motoSheet.Cells(i, 1) = "イベント一覧") Then
                sts = 2
                strEventGyo = i
                Call makeEventList(sakiSheet, motoSheet, strEventGyo, i)
            Else
                For j = 1 To 4
                    sakiSheet.Cells(i - strMenuGyo + 3, j + 14) = motoSheet.Cells(i, j)
                Next
            End If
        Case 2:
            Call makeEventList(sakiSheet, motoSheet, strEventGyo, i)
        End Select
    Next

    '//あとしまつ
    Set sakiSheet = Nothing
    Set motoSheet = Nothing
    
End Sub

'//=========================//
'//  イベント一覧書き出し   //
'//=========================//
Sub makeEventList(sakiSheet As Worksheet, motoSheet As Worksheet, _
                strEventGyo As Integer, gyo As Integer)
    Dim j As Integer
    Dim i As Integer
    Dim ecName As String
    Dim eventName As String
    Dim eGyo As Integer
    Dim eventSheet As Worksheet
    Dim eWriteGyo As Integer
    
    i = gyo
    For j = 1 To 6
        If (motoSheet.Cells(i, 2) <> "") And _
        (j >= 3) And (j <= 4) And _
        (motoSheet.Cells(i, j) = "") Then
           sakiSheet.Cells(i - strEventGyo + 3, j + 19) = 0
        Else
            sakiSheet.Cells(i - strEventGyo + 3, j + 19) = motoSheet.Cells(i, j)
        End If
    Next
    
    '// イベントモードの設定
    sakiSheet.Cells(i - strEventGyo + 3, 26) = _
        getEventMode(motoSheet.Cells(i, 2), motoSheet.Cells(i, 3), motoSheet.Cells(i, 4))
                
    '// イベントがわかんない行(イベント種類がない)は、ここで終わり
    If (sakiSheet.Cells(i - strEventGyo + 3, 26) = "") Then
        Exit Sub
    End If
                
    '// イベントクラスとメソッド取得
    ecName = motoSheet.Cells(i, 5)
    eventName = motoSheet.Cells(i, 6)
    eGyo = 5
    Do While (sakiSheet.Cells(eGyo, 13) <> "")
        If (sakiSheet.Cells(eGyo, 13) = ecName) Then
            Exit Do
        End If
        eGyo = eGyo + 1
    Loop
    
    '// イベントシートの取得(なければ追加)
    If (sakiSheet.Cells(eGyo, 13) = "") Then
        sakiSheet.Cells(eGyo, 13) = ecName
        Set eventSheet = makeEventSheet(ecName, motoSheet.Range("D2"))
    Else
        Set eventSheet = Sheets(CStr("@" & ecName))
    End If
   
    '// イベントの書き出し
    eWriteGyo = eventSheet.Range("A65536").End(xlUp).Row + 1
    eventSheet.Cells(eWriteGyo, 1) = eWriteGyo - 4
    eventSheet.Cells(eWriteGyo, 2) = eventName
    Set eventSheet = Nothing
    
End Sub

'//=========================//
'//  イベントモード決定    //
'//=========================//
Function getEventMode(eCode As String, wParam As String, dwParam As String) As String
    
    If (InStr(eCode, "EVT") = 0) Then
        getEventMode = ""
        Exit Function
    End If
    
    If (dwParam = "") Then
        If (wParam = "") Then
            getEventMode = "IEVENTLIST_KIND_ECODE"
        Else
            getEventMode = "IEVENTLIST_KIND_WPARAM"
        End If
    Else
        getEventMode = "IEVENTLIST_KIND_DWPARAM"
    End If
End Function
'//=========================//
'//  イベントシート作成    //
'//=========================//
Function makeEventSheet(ecName As String, gamenName As String) As Worksheet
    Dim sagyoSh As Worksheet
    Set sagyoSh = Sheets.Add()
    sagyoSh.Name = "@" & ecName
    sagyoSh.Range("A1") = "イベントクラス名"
    sagyoSh.Range("B1") = ecName
    sagyoSh.Range("C1") = StrConv(ecName, vbUpperCase)
    sagyoSh.Range("A2") = "画面名"
    sagyoSh.Range("B2") = gamenName
    sagyoSh.Range("A4") = "イベント一覧"
    Set makeEventSheet = sagyoSh
End Function


(上記 < > ¥ は、本当は半角)
字数いっぱいなので説明は次回

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

単体テストを省略できるという理論的根拠と、その条件

2006-12-27 16:18:23 | 開発ネタ

 ちょっと全然別のことを考えていたときに、なぜか、思いついたので。。
メモメモ。




 よく、開発のときに、単体テストを線表上はあるけど、時間がなくて省略することがある。
 このとき、省略しても、うまくいくケースとうまくいかないケースが、経験的にある。
 (単純に、人の問題とか、そういうのではない気もする)。

 この条件って、なに?っていうのが、大体分かっているんだけど、それって、理論的に
説明できてなかったんだけど、いま、「そうだよね」と思ったので。。メモ。




もともと、単体テストを省略しないでやろうと思った時点では、
単体テストで
・単体テストの仕様書(どのように行うか)
・とその結果(エビデンスを含む)
を提出するつもりでいる。

さて、最近、プログラムを開発するときは、昔のように、
・コーディングシートに書いて
・パンチして
・一気にコンパイルして確認する
ということは、まずしない。

ふつう、
・トップダウンにつくっていって、
・ダミーモジュール(スタブ)を作成し
・ダミーモジュールを呼び出す形で確認を取り
・OKだったら、今度はそのダミーモジュールを作っていく
というように、テストファーストの手法で、多分組んでいると思う。




この場合、コーディングが全部終わった時点で(JUNITを使っていれば、
ダミーモジュールがなくなって、すべて実装し、緑色になった時点で)、
テスト仕様書は1ページも書いていないけど、実質単体テストまで完了
している。
完了していないと、プログラムは、実装できないので。。

 ところが、テスト仕様書とそのエビデンスはまったく書いていないので、
テストは、まったく、していないことになっている。
 なので、ここから仕様書を書かなければならないが、しかし、ここで
書いてしまってもムダになる可能性は大きい。
 というのも、この時点では結合テストをしていない。
 結合テストの結果によっては、プログラムは変わり、そしたら、単体テスト
やりなおしになる。
 ということは、先に結合をやって、安全なことを確かめたほうがいい。

 ってなると、単体テストを省略し、結合を先にやったほうがいいことになる。

 この場合、単体テストは省略しても、品質に問題ないことになる。




 という場合、じゃあ、これが成立する条件は?と考えると

・トップダウンで作っていき、分からないところにスタブを入れていく
・で、トンドンスタブを奥ふかくまでつくり、スタブの部分がなくなるようにする
・すべてのテストはOKとなっている(JUNITで緑になる)

っていうことになると。。スタートの時点の問題になる。
初めの時点で、入力データと出力データに対するダミーデータがそろっていて、
そのダミーデータがすべてのケース分、存在すること。

 まず、データがないとテストできないのでX
 で、正常形だけあっても、異常系でおかしくなるかもしれないのでX
 正常、異常、すべてのケース分の入出力データがあれば、それをもとに、テストファーストで
テストできる。




 ここで問題なのは、この「正常、異常、すべてのケース分の入出力データ」を
確認しないといけないのは、構造設計レベルである(単体のプログラムではない。
単体プログラムはそれが呼び出されるプログラムとのインターフェースの整合性
まではわからない。コレが分かるのは、構造設計)。

 つまりよく、プログラムの出来が悪いと、単体を作ってるプログラマが馬鹿だからとか
単体テストやってないからとかいったり、ITレベルで落ちると、単体テスト以下だろうとか
言う人が、非常に多くいるが、本質的な問題は、構造設計における、インターフェース設計の
甘さと事象の読みの甘さ、あと、PG担当者に対するPGの進め方の指示ミスであることが多い。

 このように、本質的な問題は解決されず、PG側に責任転嫁し、まわりもこの事象を
見抜けないため、この問題は何度も繰り返し、起こっている。




 っていうことは、分かりきっていることなんで、どうでもいいんだけど、
せっかく思いついたことがまとまったんで、一応書いておいて見た。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その24:イベント追加 マクロ仕様)

2006-12-27 15:13:44 | ケータイ

 BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 前回までで、雛形サンプルの公開をしました。
 なので、今度は雛形サンプルを読んで、ソースを出力する、マクロを作成すればOK!ってことになります。

 で、そのマクロなのですが、今回は、どういうものを作るかについて説明します。




■概要
 今回は、画面ソースと画面用イベント用ソースを書き出します。
 ところが、画面と画面用イベントは、1対1に対応しません。
 画面1個にたいして、イベント用のソースを分けてもかまわないし、
 逆のことも言えるわけです。

 ということで、コレを解決するために
   画面定義から、画面用の作業シートと、イベント用の作業シート
 を別々に作成することにしました。
 (なお、作業用シートは作業開始時に作成され、終了時に削除されます)

 以下、作業シートごとに、説明します。




■画面用作業シート
 画面用作業シートは、1画面に1つできます。
 シート名は、日本語の画面名に@を付けたものです。
 こんな感じのシートです

(全体を入れるため、縮小し、一部の桁の幅を縮小しています)
画面、メニュー、イベントが、横に並んでいます。
なお、M桁に、この画面で使うイベントクラスが並んでいます。
本来ここではないのですが、バグのためか、Z桁以上が入れられないので、
むりやり、ここに突っ込みました。




■画面イベント用作業シート
 画面イベント用作業シートは、1イベントクラスに1つできます。
 シート名は、イベントクラス名に@を付けたものです。
 こんな感じのシートです

(全体を入れるため、一部の桁の幅を拡大しています)
イベント関連の内容が並んでいます。

P.S いまのこの方式だと2つの画面から、同じ画面イベントファイルを参照する場合、
  ヘッダファイルに1つしかかなないので、困ってしまいます。
  参照される画面用に、たとえばG桁5行目あたりから書けばいいのですが、
  それ以外にもやることがあって、複雑になってしまうので、今回は省略します。



■各シートと、書き出すファイルとの関係
上記のシートと、書き出すファイルの関係は以下のとおりです

<<1アプリ1つ>>
・アプリ用ソース(アプリ名.c)=>画面一覧シート
・アプリ用ヘッダ(アプリ名.h)=>画面一覧シート
・バージョンファイル(version.h)=>画面一覧シート

<<画面分できる>>
・画面用ソース(画面名.c)=>画面用作業シート(@画面名.c)
・画面用ヘッダ(画面名.h)=>画面用作業シート(@画面名.h)

<<イベントクラス分できる>>
・画面イベント用ソース(イベントクラス名.c)
        =>画面イベント用作業シート(@イベントクラス名.c)
・画面イベント用ヘッダ(イベントクラス名.h)
        =>画面イベント用作業シート(@イベントクラス名.h)

なお、この内容は、作業一覧シートに書き出されます。




■マクロの概要
 マクロは、前処理のinitAppDataと後処理のFreeAppDataのところを作成します。
 
●前処理のinitAppDataの内容
(1)作業一覧シートをクリア
(2)シートに対して、以下の処理をする
    (あ)シートが画面一覧だったら、
      アプリ用ソース、ヘッダ、バージョンファイルの書き出し指示を
      作業一覧シートに書き出す

    (い)シートが画面定義だったら
      画面名を保持し、画面用ソース、ヘッダの書き出し指示を
      作業一覧シートに書き出す
    
(3)保持しておいた画面名をもとに、画面用作業シートを作成する
      この中で、イベントがあれば、
        画面イベント用作業シートも作成する

(4)保持しておいた画面名をもとに、画面用作業シートを検索し
   画面イベント用作業シートを書き出す




実際のマクロのソースは、次回のこのシリーズで書きます。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

<発信者情報>同意なしで開示へネット被害で業界が新指針、コレで安倍首相夫人がブログ書いても。。

2006-12-26 23:44:01 | Weblog

本家でも取り上げたけど、ここのニュース
<発信者情報>同意なしで開示へ ネット被害で業界が新指針
http://headlines.yahoo.co.jp/hl?a=20061226-00000010-mai-soci

によると(以下斜体は、上記ニュースより引用)

 インターネット上のプライバシー侵害や名誉棄損について総務省と業界団体は、情報を書き込んだ発信者の同意がなくても被害者に発信者の氏名や住所などを開示する方針を固めた。これまでは発信者が開示を拒否すれば、誰が悪質な情報を流したか被害者側には分からず、泣き寝入りするケースが多かった。業界団体は新たなガイドライン(指針)を年明けに作り、来春から導入する。【ネット社会取材班】


で、


 業界と総務省は一般からの意見も募集したうえで、早ければ来年2月にも導入する方針。


だそうな。。
 なお、プライバシー侵害と、名誉毀損と書いてあるだけで、著作権違反とは、書いていない。

 ところで安倍首相夫人のブログができたそうだけど(ここ http://akie-abe.jp/)この法律ができれば、大手掲示板でいろいろ書かれても、住所氏名しらべて名誉毀損で訴えられるから大丈夫(^^;)。。。

 なーんて、ばかなこと書いてると、自分が危なくなるから、この辺で。。。

P.S.でも、きっこさんとか、だいじょうぶなのかなあ?公共性や公益性、真実性などが認められないとアウトといっても、正直、なにが真実かはっきりしないこともあると思うしなあ。。





  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その23:イベント追加 雛形-2)

2006-12-26 20:28:19 | Weblog

 BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 前回は、雛形サンプルの公開ということで、今回修正追加される

   ・画面ソースの雛形:gamen_b_c.txt 
   ・画面ヘッダの雛形:gamen_b_h.txt
   ・画面用イベントソースの雛形:gamen_event_c.txt
   ・画面用イベントヘッダの雛形:gamen_event_h.txt

のうち、gamen_b_c.txtだけで、制限字数になってしまいました。
今回は、のこり3つを公開します。



■画面ヘッダの雛形:gamen_b_h.txt
以下のとおりです
/*===========================================================================

FILE: $#$CELL D2$#$.h
===========================================================================*/
#ifndef _$#$CELL K2$#$_H
#define	_$#$CELL K2$#$_H
/*=============================================================
INCLUDES AND VARIABLE DEFINITIONS
============================================================= */
#include "version.h"

#include "AEEModGen.h"          // Module interface definitions
#include "AEEAppGen.h"          // Applet interface definitions
#include "AEEShell.h"           // Shell interface definitions

#include "AEEStdLib.h"		//	追加:メモリ関係
#include "AEEFile.h "		//File:HTMLファイル読込に使う
#include "AEEHTMLViewer.h "	//	追加:HTMLViewer
#include "AEEWeb.h"
#include "AEEText.h"
#include "AEEMenu.h"

#include	"IHtmlCtl.h"
#include	"$#$CELL B2$#$.h"
#include	"IKHMap.h"


//==================================//
//	定数定義			  //
//==================================//

/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/
// create an applet structure that's passed around. All variables in
// here will be able to be referenced as static.
typedef struct _$#$CELL D2$#$ {
    	IDisplay      *pIDisplay;
    	IShell        *pIShell;
	int			curno;	//カーソルの番号
	IKHMap			*pMap;	//共通領域
	IEventList		*pElist;//イベント領域
	$#$CELL B2$#$		*poya;	//親領域

$#$REP 5$#$
$#$IFKETA C,HTMLCTL$#$
	IHtmlCtl		*$#$KETA B$#$;	//IHtmlCtl	
$#$IFEND$#$
$#$IFKETA C,TEXTCTL$#$	
	ITextCtl		*$#$KETA B$#$;	//テキスト
$#$IFEND$#$
$#$IFKETA C,MENUCTL$#$	
	IMenuCtl		*$#$KETA B$#$;	//メニュー
$#$IFEND$#$
$#$REPEND A$#$
} $#$CELL D2$#$;

/*-------------------------------------------
Function Prototypes
---------------------------------------------*/
#ifdef _$#$CELL K2$#$_C
boolean $#$CELL D2$#$_HandleEvent($#$CELL B2$#$* pMe,
		AEEEvent eCode, uint16 wParam,uint32 dwParam);
boolean $#$CELL D2$#$_InitAppData($#$CELL B2$#$* pMe);
void    $#$CELL D2$#$_FreeAppData($#$CELL B2$#$* pMe);

		//	画面表示
boolean $#$CELL D2$#$_DispAppData($#$CELL D2$#$* pMe);
int	$#$CELL D2$#$_NextCurItem($#$CELL D2$#$* pMe,int flg);

#else

extern boolean	$#$CELL D2$#$_HandleEvent($#$CELL B2$#$* pMe,
			AEEEvent eCode, uint16 wParam,uint32 dwParam);
extern boolean	$#$CELL D2$#$_InitAppData($#$CELL B2$#$* pMe);
extern void	$#$CELL D2$#$_FreeAppData($#$CELL B2$#$* pMe);

		//	画面表示
extern boolean	$#$CELL D2$#$_DispAppData($#$CELL D2$#$* pMe);
extern int	$#$CELL D2$#$_NextCurItem($#$CELL D2$#$* pMe,int flg);
#endif
#endif

(上記 ¥ < > は本当は半角です)



■画面用イベントソースの雛形:gamen_event_c.txt
以下のとおりです。

 なお、イベント用には、画面用とは異なり、イベント用シートが作成され
(1イベントクラス1シートで、そこに各イベント関数が一覧になっている)
それを参照しています。詳しくは、次回のこのシリーズで書きます。

/*=======================================================
FILE: $#$CELL B1$#$.c
========================================================*/
#define	_$#$CELL C1$#$_C

/*========================================================
INCLUDES AND VARIABLE DEFINITIONS
=========================================================== */
#include "AEEModGen.h"      // Module interface definitions
#include "AEEAppGen.h"      // Applet interface definitions
#include "AEEShell.h"       // Shell interface definitions
#include "$#$CELL B2$#$.h"
#include "$#$CELL B1$#$.h"

$#$REP 5$#$
//==========================================//
//	関数名:$#$KETA B$#$		    //
//	内容 :			    //
//==========================================//
boolean $#$KETA B$#$(void* pArg, AEEEvent eCode,
			 uint16 wParam, uint32 dwParam)
{
	return	TRUE;
}
$#$REPEND A$#$

(上記 ¥ < > は本当は半角です)



■画面用イベントヘッダの雛形:gamen_event_h.txt
以下のとおりです

 なお、イベント用には、画面用とは異なり、イベント用シートが作成され
(1イベントクラス1シートで、そこに各イベント関数が一覧になっている)
それを参照しています。詳しくは、次回のこのシリーズで書きます。

/*===================================================
INCLUDES AND VARIABLE DEFINITIONS
=================================================== */
#ifndef _$#$CELL C1$#$_H
#define	_$#$CELL C1$#$_H
#include "AEE.h"        // Standard AEE definitions
#include "AEEShell.h"   // AEE Shell Services
#include "AEEStdLib.h"  // AEE stdlib stuff

#ifdef _$#$CELL C1$#$_C
$#$REP 5$#$
boolean $#$KETA B$#$(void* pMe, AEEEvent eCode, 
				uint16 wParam, uint32 dwParam);
$#$REPEND A$#$
#else
$#$REP 5$#$
extern boolean $#$KETA B$#$(void* pMe, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam);
$#$REPEND A$#$
#endif
#endif

(上記 ¥ < > は本当は半角です)



急いで作った割には、ちゃんと確かめてないので、バグもあるかも(^^;)
次回は、仕様書側のソースとなります。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その22:イベント追加 雛形-1)

2006-12-26 18:43:33 | ケータイ

 BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 前回、出力サンプルを出しました。
 そこで、新規あるいは修正になるものは、
・画面ソースgamen1.c
・画面ヘッダgamen1.h
・画面用イベントソースgamen1event.c
・画面用イベントヘッダgamen1event.h
と書きましたので、今回は、これに対応する雛形、
・画面ソースの雛形:gamen_b_c.txt
・画面ヘッダの雛形:gamen_b_h.txt
・画面用イベントソースの雛形:gamen_event_c.txt
・画面用イベントヘッダの雛形:gamen_event_h.txt
について説明しますというか。。載せます。
制限字数の関係で、2回に分けます。

 なお、これ以外に1箇所、アプリケーションの雛形app_h.txtに

#include "IEventList.h" // イベントリスト

の1行が追加になるのですが(#include "IKHMap.h"の下)
逆に言えば、これしか変わらないので、app_h.txtは、特にソースは
だしません。



■画面ソースの雛形:gamen_b_c.txt
以下のとおりです
/*============================================
FILE: $#$CELL D2$#$.c
==============================================*/
#define _$#$CELL K2$#$_C
#define _$#$CELL K2$#$_C

#include	"$#$CELL D2$#$.h"
$#$REP 5$#$
$#$IFCELL T3,イベント一覧$#$
#include	"$#$KETA M$#$.h"
$#$IFEND$#$
$#$REPEND M$#$

/*==================================*/
//	関数名:$#$CELL D2$#$_HandleEvent		//
//	内容 :イベント処理			//
/*==================================*/
boolean $#$CELL D2$#$_HandleEvent($#$CELL B2$#$* poya, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam)
{  
	$#$CELL D2$#$	*pMe;

	//	チェック
	if ( poya	==	NULL )
		return FALSE;
	if ( 	( poya->gno	!=	1 	) || 
		(poya->garea	==	NULL 	))
	{
		return FALSE;
	}
	pMe	=	($#$CELL D2$#$ *)poya->garea;

	//	項目NULLチェック
$#$REP 5$#$
	if ( pMe->$#$KETA B$#$	==	NULL )
		return	FALSE;
$#$REPEND A$#$

$#$REP 5$#$
$#$IFKETA C,HTMLCTL$#$
	//	フォームのデータ取得
	IHTMLCTL_HandleEvent(pMe->$#$KETA B$#$,eCode,wParam,dwParam);
	if ( pMe->$#$KETA B$#$->text_flg !=	0 )
	{
		return	TRUE;
	}
$#$IFEND$#$
$#$IFKETA C,TEXTCTL$#$	
	//	テキストエリア
	if ( ITEXTCTL_HandleEvent
		(pMe->$#$KETA B$#$,eCode,wParam,dwParam) == TRUE )
	{
		return	TRUE;
	}
$#$IFEND$#$
$#$IFKETA C,MENUCTL$#$	
	//	メニュー
	if ( IMENUCTL_HandleEvent
		(pMe->$#$KETA B$#$,eCode,wParam,dwParam) == TRUE )
	{
		return	TRUE;
	}
$#$IFEND$#$
$#$REPEND A$#$

	//	追加:イベント処理
	return	IEVENTLIST_HandleEvent(pMe->pElist,eCode,wParam,dwParam);
}

/*==================================*/
//関数名:$#$CELL D2$#$_InitAppData //
//内容 :領域確保・描画	         //
/*==================================*/
boolean $#$CELL D2$#$_InitAppData($#$CELL B2$#$* poya)
{
	char		*fdata;
	$#$CELL D2$#$	*pMe;
	AEERect		rect;
	AECHAR		*menubuf;
	char		*menuTitle;

	//==========================================//
	//	領域確保			        //
	//==========================================//
	pMe	=	($#$CELL D2$#$ *)MALLOC(sizeof($#$CELL D2$#$));
	if (pMe	==	NULL )
	{
		$#$CELL D2$#$_FreeAppData(poya);
		return	FALSE;
	}
	//	アプリ領域へ設定
	poya->garea	=	(void *)pMe;
	poya->gno	=	$#$CELL H2$#$;

	//	初期設定
$#$REP 5$#$
	pMe->$#$KETA B$#$		=	NULL;
$#$REPEND A$#$
	pMe->pIDisplay	= poya->pIDisplay;
	pMe->pIShell	= poya->pIShell;

	//==========================================//
	//	イベント処理		    	    //
	//==========================================//
	//	親領域の設定(イベント先で使う)
	pMe->poya	=	poya;

	//	イベント領域確保
	if ( (pMe->pElist = IEVENTLIST_Create() )	==	NULL )
	{
		return FALSE;
	}

	//	イベント設定
$#$IFCELL T3,イベント一覧$#$
	IEVENTLIST_Add(pMe->pElist,pMe,$#$KETA Z$#$,
		,$#$KETA U$#$,$#$KETA V$#$,$#$KETA W$#$,$#$KETA Y$#$);
$#$IFEND$#$
$#$REPEND T$#$


$#$REP 5$#$
$#$IFKETA C,HTMLCTL$#$
	//==========================================//
	//	表示するHTMLファイルの取得     //
	//==========================================//
	fdata = IHTMLCTL_GetDispFileData(pMe->pIShell,"$#$KETA H$#$");
	if (fdata	==	NULL )
	{
		$#$CELL D2$#$_FreeAppData(poya);
		return	FALSE;
	}


	//==========================================//
	//	HTMLViewer生成		       //
	//==========================================//
	//	読み込んだfdataをHTMLViewerに設定する
	if ( (pMe->$#$KETA B$#$ 
		= IHTMLCTL_Create(pMe->pIShell,pMe->pIDisplay))
			==	NULL )
	{
		FREEIF(fdata);
		$#$CELL D2$#$_FreeAppData(poya);
		return	FALSE;
	}

	//==========================================//
	//	HTMLViewerデータ設定	       //
	//==========================================//
	if ( IHTMLCTL_SetDispData(pMe->$#$KETA B$#$,fdata)
		!=	TRUE)
	{
		FREEIF(fdata);
		$#$CELL D2$#$_FreeAppData(poya);
		return	FALSE;
	}

	//==========================================//
	//	追加:HTMLViewer大きさ設定     //
	//==========================================//
	rect.x	=	$#$KETA D$#$;
	rect.y	=	$#$KETA E$#$;
	rect.dx	=	$#$KETA F$#$;
	rect.dy	=	$#$KETA G$#$;
	IHTMLCTL_SetRect(pMe->$#$KETA B$#$,&rect);
	
	//==========================================//
	//	HTMLViewer表示・メモリ解放     //
	//==========================================//
	FREEIF(fdata);
$#$IFEND$#$
$#$IFKETA C,TEXTCTL$#$	
	//==========================================//
	//	テキストエリア設定	       	    //
	//==========================================//
	if	( ISHELL_CreateInstance( pMe->pIShell, 
		AEECLSID_TEXTCTL, (void**)&pMe->$#$KETA B$#$ ) != SUCCESS )
	{
		$#$CELL D2$#$_FreeAppData(poya);
		return FALSE;
	}
	rect.x	=	$#$KETA D$#$;
	rect.y	=	$#$KETA E$#$;
	rect.dx	=	$#$KETA F$#$;
	rect.dy	=	$#$KETA G$#$;
	ITEXTCTL_SetRect(pMe->$#$KETA B$#$,&rect);
	ITEXTCTL_SetProperties(pMe->$#$KETA B$#$,TP_FRAME|TP_MULTILINE);
$#$IFEND$#$
$#$IFKETA C,MENUCTL$#$	
	//==========================================//
	//	メニュー設定		       	    //
	//==========================================//
	if	( ISHELL_CreateInstance( pMe->pIShell, 
		AEECLSID_MENUCTL, (void**)&pMe->$#$KETA B$#$ ) != SUCCESS )
	{
		$#$CELL D2$#$_FreeAppData(poya);
		return FALSE;
	}
	rect.x	=	$#$KETA D$#$;
	rect.y	=	$#$KETA E$#$;
	rect.dx	=	$#$KETA F$#$;
	rect.dy	=	$#$KETA G$#$;
	IMENUCTL_SetRect(pMe->$#$KETA B$#$,&rect);
$#$IFEND$#$
$#$REPEND A$#$

$#$IFCELL O3,メニュー一覧$#$
	//==========================//
	//	メニュー項目の表示  //
	//==========================//
$#$IFEND$#$
$#$REP 5$#$
$#$IFCELL O3,メニュー一覧$#$
	menuTitle = "$#$KETA R$#$";
	menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR));
	if ( menubuf	==	NULL )
	{
		$#$CELL D2$#$_FreeAppData(poya);
		return FALSE;
	}
	MEMSET(menubuf,0,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	STREXPAND(menuTitle,STRLEN(menuTitle),menubuf,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	IMENUCTL_AddItem(pMe->$#$KETA P$#$,NULL,NULL,$#$KETA Q$#$,menubuf,NULL);
	FREEIF(menubuf);
$#$IFEND$#$
$#$REPEND O$#$

	$#$CELL D2$#$_DispAppData(pMe);

	//	共通領域を設定
	pMe->pMap	=	poya->pMap;

    return TRUE;
}

/*==================================*/
//	関数名:$#$CELL D2$#$_FreeAppData		//
//	内容 :領域のフリー			//
/*==================================*/
void $#$CELL D2$#$_FreeAppData($#$CELL B2$#$* poya)
{
	$#$CELL D2$#$	*pMe;
 
	// 対象かどうかチェック
	if ( poya->gno	!=	1 )
		return;
	if ( poya->garea	==	NULL )
		return;
	pMe	=	($#$CELL D2$#$ *)poya->garea;

$#$REP 5$#$
$#$IFKETA C,HTMLCTL$#$
	//	フリー
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		IHTMLCTL_Release(pMe->$#$KETA B$#$);
		pMe->$#$KETA B$#$	=	NULL;
	}

$#$IFEND$#$
$#$IFKETA C,TEXTCTL$#$	
	//	テキストフリー
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		ITEXTCTL_Release(pMe->$#$KETA B$#$);
		pMe->$#$KETA B$#$	=	NULL;
	}
$#$IFEND$#$
$#$IFKETA C,MENUCTL$#$	
	//	メニューフリー
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		IMENUCTL_Release(pMe->$#$KETA B$#$);
		pMe->$#$KETA B$#$	=	NULL;
	}
$#$IFEND$#$
$#$REPEND A$#$

	//	イベントフリー
	if (	pMe->pElist	!=	NULL )
	{ 
		IEVENTLIST_Release(pMe->pElist);
	}

	//	全体フリー
	FREEIF(pMe);

	//	親のエリアをクリア
	poya->garea	=	NULL;


}

/*==================================*/
//	関数名:$#$CELL D2$#$_DispAppData		//
//	内容 :画面の初期表示		//
/*==================================*/
boolean $#$CELL D2$#$_DispAppData($#$CELL D2$#$* pMe)
{
	int	curpos,buhinpos;

	//	初期化
	curpos		=	0;
	buhinpos	=	0;

	//==================================//
	//	リドローする		    //
	//==================================//
	//	ここに、
	//	1.リドローと、
	//	2.次のフォーカス指示を書く
$#$REP 5$#$
$#$IFKETA C,HTMLCTL$#$
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		//	リドロー
		IHTMLCTL_Redraw(pMe->$#$KETA B$#$);
//		カーソル番号pMe->curnoを、htmlの項目順に数えた番号に変換する。
//		その番号をcurposとすると
		IHTMLCTL_DispData(pMe->$#$KETA B$#$,curpos,pMe->$#$KETA B$#$->scr);

//		カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に
//		変換する。その番号をbuhinposだとすると
		if(buhinpos	==	$#$KETA A$#$)
			IHTMLCTL_SetActive(pMe->$#$KETA B$#$,TRUE);
		else
			IHTMLCTL_SetActive(pMe->$#$KETA B$#$,FALSE);
	}

$#$IFEND$#$
$#$IFKETA C,TEXTCTL$#$	
	//	テキストエリアのRedrawやUpdateする
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		//	リドロー
		ITEXTCTL_Redraw(pMe->$#$KETA B$#$);
//		カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に
//		変換する。その番号をbuhinposだとすると
		if(buhinpos	==	$#$KETA A$#$)
			ITEXTCTL_SetActive(pMe->$#$KETA B$#$,TRUE);
		else
			ITEXTCTL_SetActive(pMe->$#$KETA B$#$,FALSE);
	}
$#$IFEND$#$
$#$IFKETA C,MENUCTL$#$	
	//	メニューのRedrawやUpdateする
	if ( pMe->$#$KETA B$#$	!=	NULL )
	{
		//	リドロー
		IMENUCTL_Redraw(pMe->$#$KETA B$#$);
//		カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に
//		変換する。その番号をbuhinposだとすると
		if(buhinpos	==	$#$KETA A$#$)
			IMENUCTL_SetActive(pMe->$#$KETA B$#$,TRUE);
		else
			IMENUCTL_SetActive(pMe->$#$KETA B$#$,FALSE);
	}
$#$IFEND$#$
$#$REPEND A$#$

	return	TRUE;
}

//=================================*//
//関数名:$#$CELL D2$#$_NextCurItem		//
//内容 :カーソル移動先を求める	//
//=================================*//
int	$#$CELL D2$#$_NextCurItem($#$CELL D2$#$* pMe,int flg)
{
	//======================================//
	//	次のカーソル移動箇所に		//
	//	ついて、			//
	//	プログラムを書いてください	//
	//======================================//
	return	0;			//	該当なし
}

(上記 ¥ < > は本当は半角です)



ここで切らないと、制限字数を超えてしまうので、
いったんここで切ります。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Javaの画面表示-その5:JSPで表示、JavaBeanで処理(MVC版)(その3:配置など)

2006-12-26 14:46:51 | JavaとWeb

 シリーズJavaの画面表示のつづきです。前回、JSPで画面表示部分とコントローラー、Javaのクラスでモデルを行うためのソース

JSP
・index.jsp:View
・kekka.jsp:View
・shori.jsp:コントローラー

JavaBean
・Shori1.java:モデル

を示しました。今回は、まず、この配置についてと、この後の話であるStrutsの話とのつながりについて書きます。



■配置について

 配置については、MVC版でないときの配置とおなじです。

Javaの画面表示-その4:JSPで表示、JavaBeanで処理(その3:配置)
http://blog.goo.ne.jp/xmldtp/e/860cdeac89b7a009c68e7cd0884e1753

に書いてあります。

 で、そのときなかった、shori.jspは、index.jspやkekka.jspと同じフォルダに入れてください。




■Strutsとの関係
 MVCにわけてJSPを利用するものとしてはStrutsがあります。
 それとの関係について言うと、

・Strutsの場合は、Shori.jspでやっていたコントローラー部分を、Javaでやります。
・画面のJSPでやっていた、値をとってきて、埋める部分をStrutsタグでやります。

 で、このとき、今回のshori.jspの役割を考えると、
(1)画面の値を取り出す
(2)モデルを呼び出す
(3)画面に値をセットして表示する

となります。

 Strutsでは、この(1)と(3)を、ActionFormを継承したクラスで行います。
これは、画面ごとに存在することになります。

(2)の部分は、Actionを継承したクラスで行います。
 これはActionごと(ボタンがいくつもあって、それを押すとサーバーに行って何かするという仕組みの場合、そのボタンごと)になります。

 なので、画面にいくつもボタンがあって処理が違う場合、画面より、Actionのクラスのほうが多くなります。

 で、さらに、それらのクラスと画面などの関係を書いたXMLファイルも必要になります。




■MVCにするだけなら。。

 とまあ、いろんなファイルがあるのですが、
 別にMVCにしたいだけなら、コントロール、つまりStrutsのActionの部分をサーブレットにして、他の画面表示の部分をJSPにする、すなわち、

Javaの画面表示-その2:JSPで表示部分、サーブレットで処理部分でやっていた方法で十分だったりするわけです。

JSPは、表示だけでしか使いませんし、その程度ならStrutsでタグを入れてるのと、かわんないわけです(Strutsタグを覚える必要もないし)。
 一方Strutsとちがって、画面の(ActionFormから継承される)クラスは必要ありませんし、XMLもいらないので、管理は簡単。

 っていうことで、いいこと尽くめのようにも思えるのですが、実際は、世の中はStrutsが出回っていて、Strutsでやんないと、「オープンソースで提供されているのに!!」云々という人が出てきて、うるさいわけです。

 ということで、普通MVCは、Strutsでやります。。やんないほうが簡単なのに。。
(事実、やらなかったプロジェクトも知っている。そのまま呼び出したほうが簡単ジャン!っていうので)




 ということで、このシリーズの次回から、Strutsをやります。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

個人ブログに成りすまして企業の宣伝をするflogなどを、アメリカで法的規制の動き

2006-12-26 13:57:20 | Weblog

 Flog(Fake Blog)については、NHKのビジネス英会話のテキストの中で、
取り上げられていた(たしか、先月のテキストの気がする。。
企業ブログについて、規制するかどうかの話題のとき。
いまのヘリコプターペアレントの話ではない)

 そこで、紹介されていたフログ(flog)とは、

 会社が広告目的で、

  「ねえねえ、きいてきいて、このまえねえ。。。」

っていう感じの個人ブログをたちあげ、紹介していくというものだった気がする。
(バイラルマーケティングは、個人ブログを使う場合、その個人が実在するが、
 FlogはFakeであって、その個人は実在しないで、企業が、個人になりすまして、
 書いている。。実質広告)ちがっていたらごめんなさい。

それに対して、アメリカでは規制が出てきそうだ

「ステルスマーケティング」規制の対象に
http://www.gamenews.ne.jp/archives/2006/12/post_1765.html


 ただねー、こんなこというと、非難ごうごうかもしれないけど、
 これ、バイラルマーケティングとの線引き、難しいと思うよ。。

 上記のように実在しない会社なら、かんたん。

 でも、お金を渡して、個人が書いたとした場合(ステルスマーケティングはそれも含まれる)、その人の意思に反しているかどうかは疑問。

 じゃあ、お金を渡したものを、規制するっていっても、
 たとえば、その宣伝してもらいたいものが、高価なもの(たとえばダイエット商品)だった場合、それを宣伝してくれる人にあげてしまった場合は。。。。

 っていうことで、意外と、規制は難しい気がするけど。。
 どーなんでしょ(^^)


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

iPodを入れる「ネクタイ」だって。。。

2006-12-25 23:50:45 | Weblog

ここ
【ネット限定】 ipocket アイポケット 四角ドット
http://www.belluna.net/sh/do/online/ProductDetailCmd?op=showDetailProductsDisplay&catalogCode=NEB0&productCode=02175&genreCode=0000

によると(以下斜体は、上記サイトより引用)

今大流行しているipodをネクタイの大剣の裏に携帯できるアイポケット。
ポケットには表面に透明なビニールになっています。
通勤途中、満員電車もバッグやポケットから取り出しにくい時が多いですが、
ネクタイの裏なら絶えず携帯したいビジネスマンにはピッタリの携帯場所ではないでしょうか。


上記のサイトに写真があるのですが。。
うーん、微妙。。。好きな人や、プレゼントには、アリかも。。

なお、

<対応機種>
i Pod nano,i Pod shuffle

価 格
6,825 円(本体 6,500 円)


だそうです。

P.Sなお、上記は、GIZMODOのこの記事を参考にしました。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

内部統制報告書と、ITにおける監査と、業務のまとめシート

2006-12-25 17:56:54 | Weblog

 今日、オープニングベルをみていたら、「内部統制報告書」の話がでてきてました。

 これは、J-SOX法において、内部統制の監査をする際、経営者サイドで作成する書類のようだ。
 くわしくは、ここ(PDF)
Ⅲ.財務報告に係る内部統制の監査(案)
http://www.fsa.go.jp/singi/singi_kigyou/siryou/naibu/20061106/01-03.pdf


 それによると、この、内部統制報告書を監査して、内部統制監査報告書を出すようだ。

 で、IT部分に関しても監査があるわけなんだが、問題は、15ページのc
(以下斜体は、上記資料から引用)

 評価対象となった業務処理統制に係る統制上の要点ごとに、一部の取引を抜き出し(サンプリング)、当該取引に係るシステムへの入力情報とシステムからの出力情報を比較し、予想していた出力情報が得られているかを、例えば、入力データに基づいて、検算を行うこと等により確認する。


 これ、業務の書き方によっては、結構わかんないかも。。。

 たとえば、UMLで書く場合、業務1つ1つに関しては、アクティビティ図で明らかになる。
 でも、ある業務1個をとってきて、この業務の入力は何で、出力は何ですか?と聞かれると、はっきりとは、答えられない場合がある。




 具体的に言うと、1つの売り上げデータをとりあげ、その売り上げデータの変遷をたとっていく、つまり、入力から、売り上げ計上されるまでの過程をたどるとした場合、このプロセスは、たどれる。アクティビティ図があるから。。

 でも、たとえば、売り上げのスタートラインとなる受注で、どのテーブルに、どのように書き出されていますか?
 というのは、たどれないかもしれない。アクティビティ図には、テーブルの書き出し内容まで書かれていない。なので、クラス図を解析することになるが、クラス図をみて、わかるかどうかは。。。さらに、書き出し先まで考えると、それは下流工程になってしまうし。。


 つまり、いいたいことは、UMLの場合、アクティビティ図からクラス図に簡単に機械的に落ちるわけでもなく、また、クラス入出力情報がアクティビティ図に反映されないので、業務の流れはアクティビティ図でわかっても、そこから、入出力まで、かんたんにチェックできるかというと。。??




そーすると、ウィリアムのいたずら提唱の、業務をまとめたシートみたいに、各アクティビティに関して、入出力を明確にし、それを、どんどん落として言って、最後には、そのアクティビティが1つのメソッドになるくらいまでにしていき、それを実装するという形にしたほうが、いいかもしれない。

 さっきの例だと、受注の入出力は分かるし、それに対応するプログラムをしりたければ、実装したメソッドに行き着くまで、子アクティビティをどんどん子供のほうに下りていけばいいことになる。




 まあ、ウィリアムのいたずら提唱のがいいか悪いかは別として、これ、まじ監査されると、入出力を明らかにするドキュメントが必要になってくるかもしれない。とくに、DBにどうやって格納しているかというドキュメントが。。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

アプリゲットのスパイシーソフトが、オープンアプリの開発方法等説明会、だけどね(>_<!)

2006-12-25 16:33:59 | Weblog

 アプリゲットが、auのオープンアプリのゲームコンテストをやるそうな。

 ここ http://appget.com/contest/au2007/

 で、それに先立ち(以下斜体は上記サイトより引用)


アプリ開発のクリエータ様向けに、OAPの仕組みや、開発方法、移植方法などの説明を行うセミナーを開催いたします。


へ、(@_@!)
こりゃ、いかなきゃ!!


参加料は無料です。ふるってご参加ください。
■日時:2007年1月13日(土) 開場 14:00~ 開演 14:30~
■場所:ベルサール西新宿ホール(住友不動産西新宿公園3号館)
■アクセス:
東京都新宿区西新宿4-15-3 住友不動産西新宿公園3号館1F
(地図)
「都庁前」駅「A5出口」徒歩3分(大江戸線)
「西新宿五丁目」駅「A2出口」徒歩6分(大江戸線)
「新宿」駅「西口」徒歩15分(JR線他)
「新宿」駅「7番出口」徒歩10分(新宿線、京王新線)
■参加費:無料(事前登録制)
■定員:100名 (参加希望多数の場合は抽選とさせて頂きます)
■参加申込締切:2007年1月5日(金)メール必着


いくいくう!!と思って、
「説明会イベントに参加する!」
をクリックしたら。。。

なんか、作者登録している人でないと、だめみたい(>_<!)

作者登録って、なに。。。

なんか、だめぽそう。。。

うぇーん(>_<!)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PLCのレビューが載ってるんですけど、PLCって、勝ち組正社員サラリーマンのための商品なの?

2006-12-25 15:50:10 | Weblog

ここの記事
解禁された高速PLCでシアワセになれるか?――パナソニック「BL-PA100KT」 (1/2)
http://plusd.itmedia.co.jp/pcuser/articles/0612/25/news010.html


に、パナソニックが出したPLC、「BL-PA100KT」のレビューが載っているのですが。。

ウィリアムのいたずら、勘違いしてました。

てっきり、こいつに、ADSL回線をさして、モデムとおなじことをしてくれるのかと思ったら、
(以下斜体は上記ニュースより引用)

 BL-PA100KTは家庭内LANの配線のみを受け持つ製品なので、単体でインターネットに接続することはできない。インターネットに接続するためにはADSLやFTTHといった回線とブロードバンドモデムなどの機器が別途必要だ。また、ブロードバンドルータの機能も備えていない点に注意したい。電源の接続については、壁面のコンセントに直接接続することが推奨されており、たこ足配線は推奨されていない


あ、モデムは必要だし、壁面のコンセントから直接取らないといけないんだ。。
ウィリアムのいたずらの家は1間(ひとま=一部屋)です。

で、壁面のコンセントの近くにモデムがあります。。

えーっと、そうすると。。。。メリットないぞ(^^;)

あ、PLCって、勝ち組正社員サラリーマンなどが、2階建てで、いくつかの部屋があるときに
部屋の間や、1・2階間なんかで、LANを引くのにいいものなのか(^^;)

負け組みで、一間の人は、用のない商品なのかも。。。(^^;)

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする