goo blog サービス終了のお知らせ 

CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

銀行の勘定系システムについて

2025-04-05 16:35:04 | COBOL
銀行の勘定系システム(預金、融資、為替などのコア業務を処理するシステム)では、**信頼性・保守性・処理性能**が最優先されるため、主に以下の言語や技術が使用されています。

---

### **1. 主流のプログラミング言語**
#### **(1) COBOL(コボル)**
- **使用領域**:勘定系の基幹処理(預金入出金、利息計算、振込処理など)
- **理由**:
- バッチ処理(大量のトランザクション一括処理)に最適。
- 長年の実績があり、金融機関の既存システムの多くがCOBOLで構築されている。
- 高い数値計算精度(金融計算で必須)。
- **課題**:
- 技術者の高齢化・減少により、保守が困難になりつつある。

#### **(2) Java**
- **使用領域**:オンラインシステム(ATM・ネットバンキング)、新規システムの開発
- **理由**:
- プラットフォーム非依存(異なるOSでも動作可能)。
- 堅牢なメモリ管理とセキュリティ機能。
- 大規模システムでの開発効率が高い(Spring Framework等の利用)。

#### **(3) C/C++**
- **使用領域**:高性能が要求される処理(為替システム、高頻度取引など)
- **理由**:
- ハードウェアに近いレベルで最適化可能。
- リアルタイム性が求められる場面で利用。

#### **(4) RPG(IBM i系列)**
- **使用領域**:IBMメインフレーム(AS/400)上で動作するシステム
- **理由**:
- 銀行の基幹システムで歴史的に利用されてきた。

---

### **2. データベース**
- **リレーショナルデータベース (RDBMS)** が主流:
- **Oracle Database**(高可用性・障害耐性)
- **IBM Db2**(メインフレーム環境で利用)
- **PostgreSQL**(オープンソース系で新規システムに採用増)

---

### **3. 近年のトレンド**
- **レガシーシステムの刷新**:COBOLからJavaや**マイクロサービスアーキテクチャ**への移行が進む。
- **クラウド活用**:AWS、Azureなどを利用したシステム再構築(ただし、勘定系はセキュリティ要件からオンプレミスがまだ多い)。
- **FinTech技術の導入**:
- **Kotlin/Python**(データ分析・AI活用)
- **ブロックチェーン**(国際送金システムなど)

---

### **4. 銀行システムの特徴**
- **24時間365日停止できない**ため、以下の技術が重要:
- **二重化・フェイルオーバー**(障害時も自動で切り替え)
- **バッチ処理**(夜間の利息計算、帳票発行など)
- **厳格なトランザクション管理**(ACID特性を遵守)

---

### **まとめ**
|| **言語/技術** | **主な用途** |
|---|---|---|
| **レガシー系** | COBOL, RPG | 既存の基幹システム |
| **モダン系** | Java, C++ | オンラインシステム・新規開発 |
| **データ管理** | Oracle, Db2 | トランザクション処理 |

**今後はCOBOLからJava/クラウドへの移行が加速**すると予想されますが、完全な置き換えには時間がかかるでしょう。

簡易セキュリティ対策を施したGo言語・COBOL勘定系システム

2025-03-02 04:08:16 | COBOL
以下は、**フロントエンドをGo言語**、**バックエンドをCOBOL**、**データベースをCockroachDB**で実装し、セキュリティホール対策を施した完全なプログラムです。セキュリティ対策として、以下の点を考慮しています:

1. **SQLインジェクション対策**: プレースホルダを使用してSQLクエリを実行します。
2. **TLS/SSL接続**: CockroachDBへの接続をTLS/SSLで暗号化します。
3. **環境変数による機密情報の管理**: データベースの接続情報や認証情報を環境変数から取得します。
4. **エラーハンドリング**: エラーを適切に処理し、機密情報が漏れないようにします。
5. **ロギング**: セキュアなロギングを行い、機密情報をログに残さないようにします。
6. **COBOLプログラムのセキュリティ対策**: 外部プログラムの呼び出し時に適切なエラーハンドリングを行い、不正な入力値を検証します。

---

### 1. データベースの準備
CockroachDBに`accounts`テーブルを作成します。日本語のデータはUTF-8エンコーディングで保存されます。

```sql
CREATE TABLE accounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
card_number TEXT NOT NULL UNIQUE,
pin TEXT NOT NULL,
balance DECIMAL(10, 2) NOT NULL,
name TEXT -- 日本語の名前を保存するためのカラム
);
```

---

### 2. Go言語外部プログラムの実装
COBOLから呼び出されるGo言語プログラムを実装します。このプログラムはCockroachDBに接続し、認証や残高更新を行います。

#### Goプログラム (authenticate.go)
```go
package main

import (
"database/sql"
"fmt"
"log"
"os"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
fmt.Println(-1)
return
}

cardNumber := os.Args[1]
pin := os.Args[2]

// 環境変数からデータベース接続情報を取得
dbURL := os.Getenv("DATABASE_URL")
if dbURL == "" {
log.Fatal("DATABASE_URL environment variable is not set")
}

// TLS/SSLを使用してデータベースに接続
db, err := sql.Open("postgres", dbURL)
if err != nil {
log.Fatal("Failed to connect to the database: ", err)
}
defer db.Close()

var balance float64
err = db.QueryRow("SELECT balance FROM accounts WHERE card_number = $1 AND pin = $2", cardNumber, pin).Scan(&balance)
if err != nil {
if err == sql.ErrNoRows {
fmt.Println(-1)
} else {
log.Fatal("Failed to execute query: ", err)
}
return
}

fmt.Println(balance)
}
```

#### Goプログラム (update_balance.go)
```go
package main

import (
"database/sql"
"log"
"os"
"strconv"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
log.Fatal("Insufficient arguments")
}

cardNumber := os.Args[1]
balance, err := strconv.ParseFloat(os.Args[2], 64)
if err != nil {
log.Fatal("Invalid balance value: ", err)
}

// 環境変数からデータベース接続情報を取得
dbURL := os.Getenv("DATABASE_URL")
if dbURL == "" {
log.Fatal("DATABASE_URL environment variable is not set")
}

// TLS/SSLを使用してデータベースに接続
db, err := sql.Open("postgres", dbURL)
if err != nil {
log.Fatal("Failed to connect to the database: ", err)
}
defer db.Close()

_, err = db.Exec("UPDATE accounts SET balance = $1 WHERE card_number = $2", balance, cardNumber)
if err != nil {
log.Fatal("Failed to update balance: ", err)
}
}
```

---

### 3. COBOLプログラムの実装
COBOLプログラムは、Go言語から呼び出され、Go言語の外部プログラムを呼び出してCockroachDBに接続し、データを操作します。セキュリティ対策として、外部プログラムの呼び出し時に適切なエラーハンドリングを行います。

#### COBOLプログラム (account_backend.cbl)
```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCOUNT-BACKEND.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CARD-NUMBER PIC X(16).
01 PIN PIC X(4).
01 BALANCE PIC 9(7)V99.
01 AMOUNT PIC 9(7)V99.
01 CHOICE PIC 9.
01 RESPONSE PIC X.
01 AUTHENTICATE-CMD PIC X(100).
01 UPDATE-BALANCE-CMD PIC X(100).
01 ERROR-CODE PIC 9(4) VALUE 0.

PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Welcome to the Account Management System".
DISPLAY "Please insert your card number: ".
ACCEPT CARD-NUMBER.
DISPLAY "Please enter your 4-digit PIN: ".
ACCEPT PIN.

MOVE SPACES TO AUTHENTICATE-CMD.
STRING "go run authenticate.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
PIN DELIMITED BY SPACE
INTO AUTHENTICATE-CMD.
CALL "SYSTEM" USING AUTHENTICATE-CMD
ON EXCEPTION
MOVE 1 TO ERROR-CODE
END-CALL.

IF ERROR-CODE = 1 THEN
DISPLAY "Error: Failed to execute authenticate.go"
STOP RUN
END-IF.

ACCEPT BALANCE FROM COMMAND-LINE.

IF BALANCE = -1 THEN
DISPLAY "Authentication failed. Please try again."
STOP RUN
END-IF.

PERFORM UNTIL CHOICE = 0
DISPLAY "Main Menu"
DISPLAY "1. Check Balance"
DISPLAY "2. Deposit"
DISPLAY "3. Withdraw"
DISPLAY "4. Transfer"
DISPLAY "0. Exit"
DISPLAY "Enter your choice: "
ACCEPT CHOICE

EVALUATE CHOICE
WHEN 1 PERFORM CHECK-BALANCE
WHEN 2 PERFORM DEPOSIT
WHEN 3 PERFORM WITHDRAW
WHEN 4 PERFORM TRANSFER
WHEN 0 DISPLAY "Thank you for using our service."
WHEN OTHER DISPLAY "Invalid choice. Please try again."
END-EVALUATE
END-PERFORM.

STOP RUN.

CHECK-BALANCE.
DISPLAY "Your current balance is: ", BALANCE.
DISPLAY "Do you want to print the statement? (Y/N): ".
ACCEPT RESPONSE.
IF RESPONSE = 'Y' OR RESPONSE = 'y' THEN
DISPLAY "Statement printed successfully."
ELSE
DISPLAY "Thank you for using our service."
END-IF.

DEPOSIT.
DISPLAY "Enter deposit amount: ".
ACCEPT AMOUNT.
ADD AMOUNT TO BALANCE.
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD
ON EXCEPTION
MOVE 1 TO ERROR-CODE
END-CALL.

IF ERROR-CODE = 1 THEN
DISPLAY "Error: Failed to execute update_balance.go"
STOP RUN
END-IF.

DISPLAY "Deposit successful. New balance: ", BALANCE.

WITHDRAW.
DISPLAY "Enter withdrawal amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD
ON EXCEPTION
MOVE 1 TO ERROR-CODE
END-CALL.

IF ERROR-CODE = 1 THEN
DISPLAY "Error: Failed to execute update_balance.go"
STOP RUN
END-IF.

DISPLAY "Withdrawal successful. New balance: ", BALANCE
END-IF.

TRANSFER.
DISPLAY "Enter transfer amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD
ON EXCEPTION
MOVE 1 TO ERROR-CODE
END-CALL.

IF ERROR-CODE = 1 THEN
DISPLAY "Error: Failed to execute update_balance.go"
STOP RUN
END-IF.

DISPLAY "Transfer successful. New balance: ", BALANCE
END-IF.
```

---

### 4. Go言語フロントエンドの実装
Go言語の`fyne`ライブラリを使用してGUIを構築し、COBOLプログラムを呼び出します。

#### Goプログラム (account_system.go)
```go
package main

import (
"fmt"
"log"
"os/exec"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)

func main() {
a := app.New()
w := a.NewWindow("口座管理システム")
w.Resize(fyne.NewSize(400, 300))

cardNumberEntry := widget.NewEntry()
pinEntry := widget.NewPasswordEntry()

loginButton := widget.NewButton("ログイン", func() {
cardNumber := cardNumberEntry.Text
pin := pinEntry.Text

cmd := exec.Command("./account_backend", cardNumber, pin)
output, err := cmd.CombinedOutput()
if err != nil {
dialog.ShowError(fmt.Errorf("認証に失敗しました"), w)
log.Println("Authentication failed: ", err)
return
}

dialog.ShowInformation("ログイン成功", string(output), w)
})

loginContainer := container.NewVBox(
widget.NewLabel("カード番号:"),
cardNumberEntry,
widget.NewLabel("PIN:"),
pinEntry,
loginButton,
)

w.SetContent(loginContainer)
w.ShowAndRun()
}
```

---

### 5. 環境変数の設定
データベース接続情報を環境変数として設定します。以下は設定例です。

```bash
export DATABASE_URL="postgresql://root@localhost:26257/bank?sslmode=verify-full&sslrootcert=/path/to/ca.crt"
```

---

### 6. 実行方法
1. CockroachDBを起動し、`accounts`テーブルを作成します。
2. Goプログラムをビルドします。
```bash
go build authenticate.go
go build update_balance.go
go build account_system.go
```
3. COBOLプログラムをコンパイルします。
```bash
cobc -x account_backend.cbl
```
4. Goプログラムを実行します。
```bash
./account_system
```

---

### 7. 動作確認
1. **ログイン画面**でカード番号とPINを入力します。
2. COBOLプログラムが呼び出され、Go言語の外部プログラムを介してCockroachDBに接続し、認証や残高更新が行われます。
3. 結果がGoプログラムに返され、適切に表示されます。

---

### 8. セキュリティ対策のポイント
1. **TLS/SSL接続**: CockroachDBへの接続をTLS/SSLで暗号化し、中間者攻撃を防ぎます。
2. **環境変数による機密情報の管理**: データベースの接続情報を環境変数から取得し、ソースコードに直接記述しないようにします。
3. **エラーハンドリング**: エラーを適切に処理し、機密情報が漏れないようにします。
4. **ロギング**: セキュアなロギングを行い、機密情報をログに残さないようにします。
5. **COBOLプログラムのセキュリティ対策**: 外部プログラムの呼び出し時に適切なエラーハンドリングを行い、不正な入力値を検証します。

---

このプログラムにより、CockroachDBとGo言語を使用した安全で厳重な対策を施した勘定系システムを実現できます。

GoとCOBOL、Cockroach DBを用いた勘定系システムに日本語全文検索機能を搭載、日本語表示できるように依頼してみた

2025-03-02 03:57:23 | COBOL
以下は、**フロントエンドをGo言語**、**バックエンドをCOBOL**、**データベースをCockroachDB**で実装し、外部プログラムもGo言語で実装した完全なプログラムです。Go言語の`fyne`ライブラリを使用してGUIを構築し、COBOLプログラムを呼び出してバックエンドのロジックを実行します。COBOLプログラムはGo言語の外部プログラムを呼び出し、CockroachDBに接続してデータを操作します。

---

### 1. データベースの準備
CockroachDBに`accounts`テーブルを作成します。日本語のデータはUTF-8エンコーディングで保存されます。

```sql
CREATE TABLE accounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
card_number TEXT NOT NULL UNIQUE,
pin TEXT NOT NULL,
balance DECIMAL(10, 2) NOT NULL,
name TEXT -- 日本語の名前を保存するためのカラム
);
```

---

### 2. COBOLプログラムの実装
COBOLプログラムは、Go言語から呼び出され、Go言語の外部プログラムを呼び出してCockroachDBに接続し、データを操作します。

#### COBOLプログラム (account_backend.cbl)
```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCOUNT-BACKEND.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CARD-NUMBER PIC X(16).
01 PIN PIC X(4).
01 BALANCE PIC 9(7)V99.
01 AMOUNT PIC 9(7)V99.
01 CHOICE PIC 9.
01 RESPONSE PIC X.
01 AUTHENTICATE-CMD PIC X(100).
01 UPDATE-BALANCE-CMD PIC X(100).

PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Welcome to the Account Management System".
DISPLAY "Please insert your card number: ".
ACCEPT CARD-NUMBER.
DISPLAY "Please enter your 4-digit PIN: ".
ACCEPT PIN.

MOVE SPACES TO AUTHENTICATE-CMD.
STRING "go run authenticate.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
PIN DELIMITED BY SPACE
INTO AUTHENTICATE-CMD.
CALL "SYSTEM" USING AUTHENTICATE-CMD.
ACCEPT BALANCE FROM COMMAND-LINE.

IF BALANCE = -1 THEN
DISPLAY "Authentication failed. Please try again."
STOP RUN
END-IF.

PERFORM UNTIL CHOICE = 0
DISPLAY "Main Menu"
DISPLAY "1. Check Balance"
DISPLAY "2. Deposit"
DISPLAY "3. Withdraw"
DISPLAY "4. Transfer"
DISPLAY "0. Exit"
DISPLAY "Enter your choice: "
ACCEPT CHOICE

EVALUATE CHOICE
WHEN 1 PERFORM CHECK-BALANCE
WHEN 2 PERFORM DEPOSIT
WHEN 3 PERFORM WITHDRAW
WHEN 4 PERFORM TRANSFER
WHEN 0 DISPLAY "Thank you for using our service."
WHEN OTHER DISPLAY "Invalid choice. Please try again."
END-EVALUATE
END-PERFORM.

STOP RUN.

CHECK-BALANCE.
DISPLAY "Your current balance is: ", BALANCE.
DISPLAY "Do you want to print the statement? (Y/N): ".
ACCEPT RESPONSE.
IF RESPONSE = 'Y' OR RESPONSE = 'y' THEN
DISPLAY "Statement printed successfully."
ELSE
DISPLAY "Thank you for using our service."
END-IF.

DEPOSIT.
DISPLAY "Enter deposit amount: ".
ACCEPT AMOUNT.
ADD AMOUNT TO BALANCE.
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Deposit successful. New balance: ", BALANCE.

WITHDRAW.
DISPLAY "Enter withdrawal amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Withdrawal successful. New balance: ", BALANCE
END-IF.

TRANSFER.
DISPLAY "Enter transfer amount: ".
ACCEPT AMOUNT.
IF AMOUNT > BALANCE THEN
DISPLAY "Insufficient balance."
ELSE
SUBTRACT AMOUNT FROM BALANCE
MOVE SPACES TO UPDATE-BALANCE-CMD.
STRING "go run update_balance.go " DELIMITED BY SPACE
CARD-NUMBER DELIMITED BY SPACE
BALANCE DELIMITED BY SPACE
INTO UPDATE-BALANCE-CMD.
CALL "SYSTEM" USING UPDATE-BALANCE-CMD.
DISPLAY "Transfer successful. New balance: ", BALANCE
END-IF.
```

---

### 3. Go言語外部プログラムの実装
COBOLから呼び出されるGo言語プログラムを実装します。このプログラムはCockroachDBに接続し、認証や残高更新を行います。

#### Goプログラム (authenticate.go)
```go
package main

import (
"database/sql"
"fmt"
"os"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
fmt.Println(-1)
return
}

cardNumber := os.Args[1]
pin := os.Args[2]

db, err := sql.Open("postgres", "postgresql://root@localhost:26257/bank?sslmode=disable")
if err != nil {
fmt.Println(-1)
return
}
defer db.Close()

var balance float64
err = db.QueryRow("SELECT balance FROM accounts WHERE card_number = $1 AND pin = $2", cardNumber, pin).Scan(&balance)
if err != nil {
fmt.Println(-1)
return
}

fmt.Println(balance)
}
```

#### Goプログラム (update_balance.go)
```go
package main

import (
"database/sql"
"fmt"
"os"
"strconv"

_ "github.com/lib/pq"
)

func main() {
if len(os.Args) < 3 {
return
}

cardNumber := os.Args[1]
balance, err := strconv.ParseFloat(os.Args[2], 64)
if err != nil {
return
}

db, err := sql.Open("postgres", "postgresql://root@localhost:26257/bank?sslmode=disable")
if err != nil {
return
}
defer db.Close()

_, err = db.Exec("UPDATE accounts SET balance = $1 WHERE card_number = $2", balance, cardNumber)
if err != nil {
return
}
}
```

---

### 4. Go言語フロントエンドの実装
Go言語の`fyne`ライブラリを使用してGUIを構築し、COBOLプログラムを呼び出します。

#### Goプログラム (account_system.go)
```go
package main

import (
"fmt"
"os/exec"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)

func main() {
a := app.New()
w := a.NewWindow("口座管理システム")
w.Resize(fyne.NewSize(400, 300))

cardNumberEntry := widget.NewEntry()
pinEntry := widget.NewPasswordEntry()

loginButton := widget.NewButton("ログイン", func() {
cardNumber := cardNumberEntry.Text
pin := pinEntry.Text

cmd := exec.Command("./account_backend", cardNumber, pin)
output, err := cmd.CombinedOutput()
if err != nil {
dialog.ShowError(fmt.Errorf("認証に失敗しました"), w)
return
}

dialog.ShowInformation("ログイン成功", string(output), w)
})

loginContainer := container.NewVBox(
widget.NewLabel("カード番号:"),
cardNumberEntry,
widget.NewLabel("PIN:"),
pinEntry,
loginButton,
)

w.SetContent(loginContainer)
w.ShowAndRun()
}
```

---

### 5. 実行方法
1. CockroachDBを起動し、`accounts`テーブルを作成します。
2. Goプログラムをビルドします。
```bash
go build authenticate.go
go build update_balance.go
go build account_system.go
```
3. COBOLプログラムをコンパイルします。
```bash
cobc -x account_backend.cbl
```
4. Goプログラムを実行します。
```bash
./account_system
```

---

### 6. 動作確認
1. **ログイン画面**でカード番号とPINを入力します。
2. COBOLプログラムが呼び出され、Go言語の外部プログラムを介してCockroachDBに接続し、認証や残高更新が行われます。
3. 結果がGoプログラムに返され、適切に表示されます。

---

このプログラムにより、Go言語のフロントエンド、COBOLのバックエンド、CockroachDBのデータベースを連携させた勘定系システムを実現できます。

Gnu COBOL2.2でWebアプリを作る計画

2024-12-01 09:23:34 | COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. WRITE-HTML.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT HTML-FILE ASSIGN TO "output.html"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD HTML-FILE.
01 HTML-LINE PIC X(255).

WORKING-STORAGE SECTION.
01 WS-CRLF PIC X(2) VALUE X"0D0A".

PROCEDURE DIVISION.
MAIN.
OPEN OUTPUT HTML-FILE
MOVE "Content-type: text/html" TO HTML-LINE
WRITE HTML-LINE
MOVE "<!DOCTYPE html>" TO HTML-LINE
WRITE HTML-LINE
MOVE "<html lang=""ja"">" TO HTML-LINE
WRITE HTML-LINE
MOVE "<head>" TO HTML-LINE
WRITE HTML-LINE
MOVE "<meta charset=""UTF-8"">" TO HTML-LINE
WRITE HTML-LINE
MOVE "<title>タイトル</title>" TO HTML-LINE
WRITE HTML-LINE
MOVE "</head>" TO HTML-LINE
WRITE HTML-LINE
MOVE "<body>" TO HTML-LINE
WRITE HTML-LINE
MOVE "Hello HTML!" TO HTML-LINE
WRITE HTML-LINE
MOVE "</body>" TO HTML-LINE
WRITE HTML-LINE
MOVE "</html>" TO HTML-LINE
WRITE HTML-LINE
CLOSE HTML-FILE
DISPLAY "HTML file 'output.html' has been written successfully."
STOP RUN.

何をやろうとしているのかというと、

<!DOCTYPE html>
<html lang=""ja"">
<head>
<meta charset=""UTF-8"">
<title>タイトル</title>
</head>
<body>
Hello HTML!
</body>
</html>

というHTMLタグをGnu COBOL2.2で書いたプログラムを動かしてテキストファイルに書き込ませ、htmlファイルに変換してHello HTML!という文字を表示させる簡単なWebアプリを作ることだ。

まず、Androidのコードエディタに上記のソースコードをコピペし、




実行ボタンを押してみた。




結果は失敗。



出来てもいないのにHTML file 'output.html' has been written successfully.と表示して終了するインチキプログラムであった。
ちなみにこのプログラムの作成者はChatGPTだ。

ちなみにタグ自体を表示するプログラムはうまくいったのだが。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO_HTML.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CR PIC X VALUE LOW-VALUE.
PROCEDURE DIVISION.
MAIN.
MOVE FUNCTION CHAR(13) TO CR
DISPLAY "Content-type: text/html" UPON CONSOLE
DISPLAY CR UPON CONSOLE
DISPLAY "<!DOCTYPE html>" UPON CONSOLE
DISPLAY "<html lang=""ja"">" UPON CONSOLE
DISPLAY "<head>" UPON CONSOLE
DISPLAY "<meta charset=""UTF-8"">" UPON CONSOLE
DISPLAY "<title>タイトル</title>" UPON CONSOLE
DISPLAY "</head>" UPON CONSOLE
DISPLAY "<body>" UPON CONSOLE
DISPLAY "Hello HTML!" UPON CONSOLE
DISPLAY "</body>" UPON CONSOLE
DISPLAY "</html>" UPON CONSOLE
STOP RUN.











Gnu COBOL2.2でFIZZBUZZ問題をやってみた。

2024-12-01 08:45:17 | COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(3).
01 HENSHU-IKI PIC X(4).
01 HENSHU-NUM REDEFINES HENSHU-IKI PIC X(4).
01 DUMMY-IKI PIC X(1).

PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
EVALUATE TRUE
WHEN FUNCTION MOD(I 3) = 0 AND FUNCTION MOD(I 5) = 0
DISPLAY "FIZZBUZZ"
WHEN FUNCTION MOD(I 3) = 0
DISPLAY "FIZZ"
WHEN FUNCTION MOD(I 5) = 0
DISPLAY "BUZZ"
WHEN OTHER
MOVE SPACES TO HENSHU-IKI
MOVE I TO HENSHU-NUM
UNSTRING
HENSHU-IKI DELIMITED BY ALL SPACE
INTO DUMMY-IKI HENSHU-IKI
END-UNSTRING
DISPLAY FUNCTION TRIM(HENSHU-IKI)
END-EVALUATE
END-PERFORM.
STOP RUN.








COBOLでGUIアプリは可能か?その2

2024-07-05 23:45:32 | COBOL


identification division.
program-id. CALL-TEST.
data division.
working-storage section.
01 numeri PIC 9(4).
procedure division.
move 0721 to numeri.
call 'sub1' using by value numeri.
display "Hello After C".
stop run.

jsコードは省略。


COBOLでGUIアプリは可能か?

2024-07-05 23:18:12 | COBOL
COBOLでGUIアプリを作りたい。例えば四則演算電卓のCOBOLソースを書いて。

【ChatGPT】
COBOL自体は古いプログラミング言語であり、GUIアプリケーションの開発には通常向いていません。COBOLでGUIを作成する場合、外部のライブラリやツールキットを利用する必要があります。例えば、COBOLコードを使ってJavaやC#のGUIコンポーネントを操作する方法が考えられます。

ここでは、COBOLのGUIアプリケーションの例として、四則演算電卓の簡単なサンプルを示します。この例では、COBOLプログラムがバックエンドのロジックを処理し、GUI部分はJavaを使って実装しています。以下にその例を示します。

【COBOLソースコード (Calculator.cbl)】

IDENTIFICATION DIVISION.

PROGRAM-ID. Calculator.


DATA DIVISION.

WORKING-STORAGE SECTION.

01 WS-NUM1 PIC 9(5)V9(2).

01 WS-NUM2 PIC 9(5)V9(2).

01 WS-RESULT PIC 9(5)V9(2).


LINKAGE SECTION.

01 LK-NUM1 PIC 9(5)V9(2).

01 LK-NUM2 PIC 9(5)V9(2).

01 LK-OPERATION PIC X.

01 LK-RESULT PIC 9(5)V9(2).


PROCEDURE DIVISION USING LK-NUM1 LK-NUM2 LK-OPERATION LK-RESULT.

MOVE LK-NUM1 TO WS-NUM1

MOVE LK-NUM2 TO WS-NUM2

EVALUATE LK-OPERATION

WHEN '+'

COMPUTE WS-RESULT = WS-NUM1 + WS-NUM2

WHEN '-'

COMPUTE WS-RESULT = WS-NUM1 - WS-NUM2

WHEN '*'

COMPUTE WS-RESULT = WS-NUM1 * WS-NUM2

WHEN '/'

IF WS-NUM2 NOT = 0

COMPUTE WS-RESULT = WS-NUM1 / WS-NUM2

ELSE

MOVE 0 TO WS-RESULT

END-IF

WHEN OTHER

MOVE 0 TO WS-RESULT

END-EVALUATE

MOVE WS-RESULT TO LK-RESULT

GOBACK.

END PROGRAM Calculator.

Gooブログの糞仕様でJavaのコードは書けないらしい。
【Java GUIコード (CalculatorGUI.java)】
i m p o r t j a v a . a w t . * ; i m p o r t j a v a . a w t . e v e n t . * ; i m p o r t j a v a x . s w i n g . * ; i m p o r t j a v a . n i o.file.*; p ublic class C alculatorGUI { static{ S ystem.loadLibrary("Calculator"); } p ublic native float calculate(float num1, float num2, char operation); p ublic static void main(String[] args) { JFrame frame = new JFrame("COBOL Calculator"); f rame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f rame.setSize(300, 300); JTextField num1Field = new JTextField(10); JTextField num2Field = new JTextField(10); JTextField r esultField = new JTextField(10); r esultField.setEditable(false); String[] operations = {"+", "-", "*", "/"}; J ComboBox<String> operationBox = new J ComboBox<>(operations); J Button c alculateButton = new J Button("Calculate"); c alculateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try {float num1 = F loat.parseFloat(num1Field.getText()); float num2 = F loat.parseFloat(num2Field.getText()); c har operation = ((String) operationBox.getSelectedItem()).charAt(0); CalculatorGUI calc = new C alculatorGUI(); float result = c alc.calculate(num1, num2, operation); r esultField.setText(String.valueOf(result));} c atch (NumberFormatException ex) { r esultField.setText("Error"); } } }); J Panel panel = new JPanel(); p anel.add(new JLabel("Num 1:")); p anel.add(num1Field); p anel.add(new J Label("Operation:")); p anel.add(operationBox); p anel.add(new J Label("Num 2:")); p anel.add(num2Field); p anel.add(calculateButton); p anel.add(new JLabel("Result:")); p anel.add(resultField); f rame.add(panel); f rame.setVisible(true); } }

ビルドと実行手順

  1. COBOLコードをコンパイルして、動的ライブラリ(例:.so.dllなど)を生成します。
  2. Javaコードをコンパイルして実行します。

これらの手順は環境によって異なりますが、以下は一般的な手順です。

1.COBOLコードのコンパイル:

cobc -m -o Calculator.so Calculator.cbl

2.Javaコードのコンパイルと実行:
javac CalculatorGUI.java
java -Djava.library.path=. CalculatorGUI

この例では、COBOLの計算ロジックをJavaのGUIから呼び出しています。COBOLとJavaのインターフェースを作成するために、Java Native Interface (JNI) を使用しています。これにより、COBOLの強力なバックエンドロジックとJavaの柔軟なGUIを組み合わせたアプリケーションが作成できます。


COBOL埋め込みSQLの例をChatGPTに書かせた。

2024-05-11 12:48:55 | COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SQL-STATEMENT PIC X(100).
01 SQL-RESULT PIC S9(4) COMP.

PROCEDURE DIVISION.
MAIN-PROCEDURE.
MOVE "SELECT * FROM EMPLOYEES WHERE DEPARTMENT = 'SALES'" TO SQL-STATEMENT.
EXEC SQL
PREPARE SQL-STATEMENT
END-EXEC.
EXEC SQL
OPEN EMPLOYEE-CURSOR
END-EXEC.
EXEC SQL
FETCH NEXT FROM EMPLOYEE-CURSOR INTO :EMPLOYEE-ID, :EMPLOYEE-NAME
END-EXEC.
PERFORM UNTIL SQL-RESULT = 100
DISPLAY "EMPLOYEE ID: " EMPLOYEE-ID " EMPLOYEE NAME: " EMPLOYEE-NAME
EXEC SQL
FETCH NEXT FROM EMPLOYEE-CURSOR INTO :EMPLOYEE-ID, :EMPLOYEE-NAME
END-EXEC.
END-PERFORM.
EXEC SQL
CLOSE EMPLOYEE-CURSOR
END-EXEC.
STOP RUN.

このプログラムは、部署が "SALES" の従業員を表示する単純な例です。SQL文は文字列変数SQL-STATEMENTに格納され、EXEC SQLステートメントによって実行されます。このコードは、実際のデータベース接続や設定には関係なく、SQL文の埋め込み方法を示しています。

実際には、プログラム内で使用するデータベースにアクセスするためには、データベース接続情報などの追加の設定が必要です。また、プリプロセッサを使用してCOBOLプログラムを生成するための手順もありますが、この手順はCOBOLの特定のコンパイラに依存します。

とのこと。

https://amzn.asia/d/8BeCip1

COBOLエンジニアのためのOracle/SQLレッスン

という本のレビュー覧で「COBOL埋め込みSQL」という文言が出てきたので、気になっていた。

レビューではさんざんなことが書かれていたが、このレビューをきっかけにPython埋め込みVisualBasic.netとかいろいろ閃いた。

さらにこんな情報も・・・

https://itpfdoc.hitachi.co.jp/manuals/3020/30203D6240/USR20403.HTM

https://software.fujitsu.com/jp/manual/manualfiles/M080271/J2X02268/06Z201/aplsq03/aplsq062.html

https://software.fujitsu.com/jp/manual/manualfiles/m140016/j2ul1756/03z200/j2ul-1756-03z0.pdf

Googleで「cobol 埋め込みsql」と入力して検索すべし。

【追伸】

Androidでコンパイルしてみたらエラーとなった。

main.cob: 20: warning: line not terminated by a newline

main.cob: 1: error: PROGRAM-ID header missing

main.cob: 1: error: ENVIRONMENT DIVISION header missing

main.cob: 1: error: CONFIGURATION SECTION header missing

main.cob: 1: error: SPECIAL-NAMES header missing

main.cob: 1: error: invalid system-name 'WHERE'

main.cob: 1: error: syntax error, unexpected =