2018年10月6日 星期六

【AS400】COBOL REWRITE FILE

若想要寫 Cobol 變更 Physical File 的資料
  1. 檔案開啟模式須為 I-O
  2. * Update Data 
    REWRITE FILE-REC
    
  3. 另外需要注意的是,若要變更 KEY 值,先讀取舊 KEY 值資料,並給予新的 KEY 值。 此方法會 REWRITE 失敗,File Status 錯誤訊息為 23
  4. 只能 DELETE 舊 KEY 值資料,並 WRITE 新 KEY 值資料
  5. 由 Record Not Found 的錯誤訊息推論,執行 REWRITE 之前並不需要先 READ FILE,只需要先給定 KEY 值即可

2017年8月25日 星期五

【AS400】Physical File 基本概念


  1. Physical File 與 Logical File 皆為 AS 400 的 Database File
  2. Physical File 的 Source File 描述檔案結構,與 Table Schema 相似
  3. PF 的 Source Compile 之後,會產生 Type 為 *FILE 的 Object,實際存放資料
    • Type is PF:Defining a PF using DDS
    • Type is *FILE:Saving Data
  4. 有資料的 PF 再次 Compile 之後,原先資料會遺失
  5. 若要變更 PF 的 Field Attribute ,可使用 CHGPF 指令,無論是否有資料。但有其限制
    • 成功:增加欄位長度、新增欄位、新增或刪除鍵值、變更欄位順序、更名 Column Heading、更名 Alias
    • 資料遺失:縮減欄位長度、移除欄位、更名 Field Name
    • 失敗:將欄位型態由文字轉數字或數字轉文字、資料為亂碼 (ex:++++)
    • * Change Physical File (CHGPF)
      CHGPF FILE(LIB/OBJ) SRCFILE(LIB/QDBFSRC) SRCMBR(OBJ_SRC)
      
  6. 若 DSPF 同時產生於 Data Lib 與 Program Lib 之下
    • 當程式於執行階段 OPEN 該 DSPF 時,會發生 File Status = 39 Exception
    • 執行 dspjoblog 查詢錯誤訊息,會顯示該 DSPF 發生 Level Check 之錯誤

2017年8月12日 星期六

【NetBeans】環境設定二三事


  1. 版本是否為最新版
  2. JRE 和 JDK 是否安裝
  3. 專案需要 Library 是否 import
  4. NetBeans 某一版更新會失敗,若無法成功開啟,請斷網

2016年12月15日 星期四

【Git】basic command

$ git checkout -b debug
Switched to a new branch 'debug'
$ git checkout master
Switched to branch 'master'
$ git merge debug
將 debug 分支合併回 master
$ git branch -d debug
Deleted branch debug. $ git commit -m "commit message" 改變指標 $ git reset 會移動分支 $ git log 秀出分支的頭到尾

2015年5月29日 星期五

【CentOS】rsync 異地備援

需求為有四台機器 ( OS:Linux CentOS )
Master A, Client B, Client C, Client D
Master A 為有版控的開發環境
希望 commit 到 Master A 後
能夠自動同步到三台 Client 機器上

Linux 有一個很好用的異地備援指令 rsync
rsync 第一次做完 Full Backup 後
日後備份檔案會是採取差異備份的策略
大幅降低備份檔案的傳輸時間
rsync 有兩種方法在 server / client 進行傳輸
1. 透過 ssh 的通道
2. 使用 rsync 提供的 daemon 服務
採用方法一透過 ssh 的通道來同步檔案
由於希望往後能靠自動排程(crontab)來進行同步
所以需要先製作出免密碼登入的 ssh 金鑰

ssh 遠端登入免密碼
  1. 在 Master 端建立 Public Key 與 Private Key
  2. Private Key 保存於 Master A
  3. Public Key 傳送給 Client B,C,D
#用 RSA 演算法產生 Key Pair
ssh-keygen -t rsa
#查看 keys
ll ~/.ssh
#Private Key 預設位置不用變更
#Public Key to Client B
scp id_rsa.pub root@clientB:~/.ssh
#Public Key to Client C
scp id_rsa.pub root@clientC:~/.ssh
#Public Key to Client D
scp ip_rsa.pub root@clientD:~/.ssh


接下來到三台 Client 端
將 Public Key 保存至 authorized_keys
完成後,ssh 登入 Client 就免密碼
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 644 authorized_keys


將備份流程寫入 backup.sh 檔案
#!/bin/bash
# Master A 檔案路徑
localdir="/local/path"
# Client 端備份路徑
backupdir="/backups"
# Client 端 ip 位址
remoteip="192.168.100.252 192.168.100.253 192.168.100.254"
for ip in ${remoteip}
do
    rsync -av ${localdir} -e ssh root@${ip}:${backupdir}
done
# 建立 crontab 工作,每十五分鐘差異備份一次
crontab -e
0-59/15 * * * * sh backup.sh

2015年2月5日 星期四

【Ubuntu】crontab 刪除過期備份檔案

之前有寫過 crontab 排程 postgreSQL 自動備份
若沒有自動清除老舊的備份檔案
就會累積不少備份檔案
因此修改一下之前寫的 backup.sh 檔案
假設備份檔案保留三個月
#設定刪除日期
deldate=$(date -d'3 months ago' +%Y%m%d)
#刪除三個月前備份檔案
rm -f postgres."$deldate".tar.gz
設定刪除日期的地方
若是要刪除五天前的檔案
可修改為 '5 days ago'
若有需要修改自動排程
cd /etc
vi crontab
若要手動刪除過期備份檔案
可以善用 find 指令
find /path/to -mtime +5 -exec rm {} \;
-mtime 表示最後修改時間
+5 表示五天以前
-exec 接要執行的指令
{} 表示 find 指令找到的檔案

2015年1月13日 星期二

【Javascript】匯出 csv

將 table 的內容匯出成 csv 檔案
利用 encodeURIComponent
將字串轉為 Data URI
但要注意轉出的 code 為 UTF-8 編碼
若直接用 Microsoft Office Excel 開啟 csv 檔案時
中文會變成亂碼
因為 Excel 無法預設讀取 UTF-8 編碼的 CSV 檔案
所以利用增加 UTF-8 BOM 的方式
讓 Excel 直接開啟 csv 不會出現亂碼
navigator.appVersion.indexOf("Win") 若回傳值不為 -1
表示 OS 為 Windows 系列
指定 charset 為 帶 BOM 的 UTF-8

產生 CSV 內容的資料處理部分
傳入的參數 _csvString
除了每列資料要加斷行符號
不同欄位之間的資料要加逗號之外
還要額外處理兩個地方
1.資料若含有特殊符號,例如逗號,資料需加上雙引號
2.資料內容若已有雙引號,建議用 replace 取代為兩個雙引號
這樣用 Excel 開啟時,瀏覽效果較佳
function exportToCSV( _csvString ) {
    var downloadLink = document.createElement("a");
    downloadLink.download = "dataTable.csv";
    downloadLink.innerHTML = "Download File";
    if (window.webkitURL != null) {
        var code = encodeURIComponent( _csvString );
        if ( navigator.appVersion.indexOf("Win")==-1 ) {
            downloadLink.href = "data:application/csv;charset=utf-8," + code;
        } else {
            downloadLink.href = "data:application/csv;charset=utf-8,%EF%BB%BF" + code;
        }
    }

    downloadLink.click();
}