Oracle forms 12c:更新fmx後無法開啟

 在最近有遇到兩個案例,最後解決的方法的一樣的,所以記錄下來。


### 案例一:

人事系統是用Oracle forms 12c開發的,作業平台是Windows Server,開發人員在修正程式之後,編譯成.fmx並上傳到Server。

此時發現程式無法開啟,也沒有出現錯誤訊息,而新程式已有測試過是正常的。


###案例二:

用FTP上傳修改過後的.fmx時發現無法更新,Server上程式的更新日期還是舊的,但是可以更名。

將程式更名備份後,再上傳新的.fmx,此時上傳成功,但是系統卻變成無法開啟該.fmx,但是將備份程式還原名稱後,又變成正常的。


上述兩種就是要檢查.fmx是不是被frmweb給佔住了,雖然佔住了,但是還是可以更名,但是frmweb一樣會咬住原本的.fmx,有點像是快取。

如果直接刪除原本的.fmx時,系統就會提示程式已經被開啟,無法刪除了。

打開「工作管理員」 -> 「效能」的頁面 -> 下方的「開啟資源監視器」(PerfMon)或是從「開始」 -> 「Windows系統管理工具」 -> 「資源監視器」



打開「資源監視器」後,到「CPU」的頁面,在「關聯控制代碼」的右邊,有一個可以搜尋的輸入框,輸入forms的名稱,例如:APF001.fmx


按下搜尋後就可以找到開啟APF001.fmx的frmweb程式,再將frmweb刪除後即可。


犬山城御城印、名古城御朱印、伊勢神宮御朱印、郵便局風景印、星巴克隨行卡

 因為有買到比較便宜的機票,虎航兩個人來回含稅加託運共14280元,所以規劃了一趟名古屋四天三夜之旅。

今年8月底開始有數個颱風,幸好最後只有下小陣雨,沒有影響到我們的行程。

這篇是記錄這次我在日本收集到的紀念小物,之後如果有再去日本,我應該會再收集。


1、伊勢神宮御朱印

伊勢神宮有分外宮、內宮,參拜的順序通常都是先外宮、再內宮,我們大概在7點多就到了外宮,但是已經略有人潮,神宮的御朱印很簡單,但是很莊重




2、御城印

原來除了御朱印,也有御城印,所謂「御城印」便是登城紀念印,可以想成是日本城的御朱印,又被稱為「城郭符」、「御城朱印」等。

這也是我第一次知道有御城印,之前沒有注意,這次有到訪犬山城、名古屋城,當然也就順便購買。







3、郵便局風景印

這是我第一次到日本的郵便局,日本郵便局有賣一些限定的小物與區域限定明信片,可以到郵便局的網站查詢

日本郵便局有推出わたしだより(致自己)的特色明信片,不同的地區有不同的限定明信片與販售郵便局,下列的官網可以查詢:

https://www.watashidayori.jp/postal.html

這是我買到的三款明信片,我很喜歡那張富士山櫻(右下角),真的很有特色且極具代表性




買到明信片之後,通常會買郵票貼上並填寫台灣地址,寄回台灣做紀念,寄回來的明信片上會有郵局的郵戳,但是其實還有另一種很具特色的郵戳(風景印)。

它與一般觀光景點的紀念印不一樣,功能跟一般的郵戳一樣,只是有特殊的樣式,通常都是以當地著名的人、事、物來設計。

投郵筒也不行,投郵筒會用一般的郵戳,一定要在現場請郵局的人蓋才行,因為它是郵戳,所以必須要貼郵票,而且你可以選擇寄出去或是直接拿回來,當然蓋過郵戳的郵票是不能再使用的。

但是郵局的人會貼心地只在郵票的一個小角蓋上,讓風景印與郵票不會交疊在一起,以保留完整的樣貌。


我第一次是到五十鈴川郵便局,在架上選好明信片後,正要拿出手機來翻譯時,突然看到櫃台的桌上有郵局蓋好的樣版,我就直接跟人員指樣板,她就知道了,直接幫我貼郵票並蓋好風景印。

有了第一次的經驗,第二天到名古屋中央郵便局,一樣選好明信片,服務人員問我明信片的用途時,我直接拿出五十鈴川郵便局蓋好的明信片給她看,她馬上就明白了,就這樣,我很順利地拿到蓋好風景印的明信片


如下圖,是不是很有特色,如果我早點知道,之前到福岡、大阪時我就會順便去郵便局。



官網可以查到有風景印的郵便局與樣式:

https://www.post.japanpost.jp/kitte_hagaki/stamp/fuke/



4、星巴克隨行卡

日本星巴克有在許多地區推行限定的隨行卡,樣式也是依據著名的人、事、物來設計,當然名古屋也有,我已經有大阪、跟黑卡,這次名古屋當然也不能缺,一張卡預儲有1000日元,可以儲值與買咖啡,所以這張卡是沒有另外收費的。

但是只能在日本使用,所以我都是直接買咖啡,金額不足再補現金即可。



忙裡偷閒,用powershell自動撰寫檢查記錄表

#### 我有檢查系統。我有檢查系統。我有檢查系統。很重要,所以要說三遍。

其實事由是這樣的,因為每天需要檢查系統並且記錄,記錄的方式是用Word,內容部份如下:




每天手動複製前一天的Word,更改檔案名稱為今天的日期,再將內容變更日期,逐一檢查沒問題再填上ok

由上的步驟可知,有幾個是浪費時間的操作,第一個是手動複製Word,第二是更改檔案名稱,第三是更改內容的日期。


為了增加程式設計的能力,所以用powershell來幫我完成上述的動作。


首先產生一個樣版的Word,檔案為sample.doc,如下:


 

#### 完整的powershell程式碼如下,檔案名稱autoLogWord.ps1


$Path="E:\定期檢查記錄\每日檢查記錄\"


$Word=new-object -ComObject "Word.Application"

$Word.Visible=$true

$Doc=$Word.Documents.open($Path + "sample.doc")


$Table=$Word.ActiveDocument.Tables(1)


$Year=(get-date).tostring("yyyy")

$Month=(get-date).tostring("MM")

$Day=(get-date).tostring("dd")


for($i=2; $i -lt 16; $i++){

  $Table.Cell($i,1).Range.InsertAfter($Year)

  $Table.Cell($i,2).Range.InsertAfter($Month)

  $Table.Cell($i,3).Range.InsertAfter($Day)

}


$NewFile=$Path + $Year + $Month + $Day + ".doc"


$Doc.SaveAs([ref]$NewFile)


$Doc.Close()

$Word.Quit()


explorer.exe 'E:\定期檢查記錄\每日檢查記錄'


#### 程式說明:

其中$Word=new-object -ComObject "Word.Application" :為引入Word應用程式物件

$Doc=$Word.Documents.open($Path + "sample.doc") :就是開啟樣版檔案

$Table=$Word.ActiveDocument.Tables(1) :因為我們要操作的內容是Word的表格,所以要引入,參數1是指Word上第一個表格

for($i=2; $i -lt 16; $i++) :因為表格的第1列是標題,所以從第2列開始,而我的記錄表格實際上有15列,所以加上-lt(小於)的運算子

$Table.Cell($i,1).Range.InsertAfter($Year) :這個就像是Excel的儲存格操作一樣,指定第幾欄第幾列並將資料填上

$NewFile=$Path + $Year + $Month + $Day + ".doc" : 依照今天日期的年、月、日建立檔名

$Doc.SaveAs([ref]$NewFile) : 實際存檔


#### 設定排程

有了程式,當然要設定排程,這樣才能每天自動幫我執行。



  

EBS。變更APPS、APPLSYS的密碼

 每年會計師到廠來做資訊稽核,都會問有沒有定期更改系統的密碼,而且為了系統的安全,定期變更密碼是必要的。


Oracle EBS的APPS是一個特別的帳號,所以變更它的密碼需要有一些特別注意的事項,而且不能用DB直接更改APPS,這樣會有問題,因為EBS除了APPS之外,還有一個APPLSYS,這兩個帳號需要匹配。


有一次我在執行定期變更密碼的時候,在更新APPS的密碼時出現了一些問題,導致整個ERP都當掉了,最後發現是自己搞烏龍,以為密碼改為A,實際上卻是改為B,不過差點就要倒回備份資料庫來取回相關資料。


有鑑於此,所以找到EBS的文件,有一篇提到變更APPS密碼的文件,參考文件後,我的做法如下:


#### 查詢APPS密碼的修改日期

登入DB並執行下列的SQL,查看修改日期(PTIMT)

SQL> select name,  PTIME from sys.user$ where name='APPS';


#### 備份相關的Table

雖然APPS是DB的帳號,但是會影響到EBS的兩個表格:FND_USER、FND_ORACLE_USERID,為避免修改密碼時發生問題,請先備份。我之前就是一直以為只要變更DB的APPS就可以了,並沒有備份這兩個Table,差點就要倒回備份來取回這兩個Table的資料。

SQL> create table cusadmin.FND_USER_20230901 as select *  from FND_USER;
SQL> create table cusadmin.FND_ORACLE_USERID_20230901 as select *  from FND_ORACLE_USERID;

因為我比較保守,所以會檢查備份的Table與原本的Table筆數是否一樣

SQL> select count(1) from FND_USER;
SQL> select count(1) from FND_ORACLE_USERID;
SQL> select count(1) from cusadmin.FND_USER_20230901;
SQL> select count(1) from cusadmin.FND_ORACLE_USERID_20230901;

如發生問題,則可以還原至原Table,請注意要確認有把table備份,如無就必需從備份檔還原

SQL> delete from FND_USER;
SQL> delete from FND_ORACLE_USERID;
SQL> INSERT INTO FND_USER  SELECT * FROM cusadmin.FND_USER_20230901
SQL> INSERT INTO FND_ORACLE_USERID  SELECT * FROM cusadmin.FND_ORACLE_USERID_20230901


#### 變更密碼

登入EBS AP Tier,用EBS的指令來變更密碼

FNDCPASS apps/<OLD_PASSWORD> 0 Y system/<PASSWORD> SYSTEM APPLSYS <NEW_PASSWORD>

例如:FNDCPASS apps/11111 0 Y system/22222 SYSTEM APPLSYS 33333

變更完成後請在當前的目錄先確認log檔有無問題,有問題才會產生log檔

改完密碼後可以到DB去測試看看,我有發生過用FNDCPASS指令,但是沒成功,結果新密碼無法啟動AP Tier,把自己嚇出一身冷汗

SQL> connect apps/xxxx
SQL> connect applsys/xxxx

FNDCPASS不僅會更改DB上的密碼,還會修改FND_USER、FND_ORACLE_USERID這兩個表格的值,所以如果直接由DB修改apps的密碼,會因密碼與Table的值不同,在log中會有解密錯誤的訊息,如下:

FNDCPASS was not able to decrypt password for user 'A1000' during applsys password change.


如果因密碼改錯導致AP有問題時,請先以舊密碼將AP關掉,再執行AP Tier的autoconfig,所以最好先關閉AP再來變更密碼


#### 關於另一個帳號applsyspub

這個帳號(applsyspub)的密碼不要亂改,改了之後還要修改相關的xml,及重新執行adautocfg.sh,如無把握,記得不要亂改。

Docker故障一例:CPU使用率高

 今天同事告知Docker Server的CPU使用率很高,因為系統是Ubuntu,所以用top檢查一下,結果發現是docker佔用CPU很高。

由於之前並沒有這樣的情況,也沒有增加或更動Docker Container的設定,而且Container上提供使用者的服務都還是正常。

先試著連上Container看看,結果出現下列的錯誤,一連試了這台Docker Server底下的四個Container,都是一樣的情形
[root@FS-TEST ~]# docker exec -it 94ee8a1881a1 /bin/bash

connection error: desc = "transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused": unknown


連關掉Container也沒有辦法
[root@FS-TEST ~]# docker stop 94ee8a1881a1

Error response from daemon: cannot stop container: 94ee8a1881a1: Cannot kill container 94ee8a1881a1b59286282cc14790abb8806a4b3483b9fc7442e411aad99babc0: connection error: desc = "transport: dial unix /var/run/docker/containerd/docker-containerd.sock: connect: connection refused": unknown

因為docker container已經無法連上,也無法關掉,所以只好強制重開Dokcer的核心服務
[docker_server]# service docker restart

重開完docker後,container依舊是無法連上,但是container上的服務已經停掉,而container也可以成功關掉了。
[docker_server]# docker stop 94ee8a1881a1 

接著重新啟動container與服務,終於都恢復正常了。

不過,我是沒有找到為什麼Docker會佔用CPU的真正原因,因為趕著讓服務正常,所以也就沒有辦法慢慢檢查了。



Docker for MS SQL Server的建置

 微軟有為SQL Server發行Docker的版本,對於測試與學習資料庫是非常方便的。

稍微記錄一下操作,以便之後可以快速重建。

Docker Hub:https://hub.docker.com/_/microsoft-mssql-server

下面是我用來產生Docker Container的語法
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=password" -e "MSSQL_PID=Express" -p 4433:1433 -d mcr.microsoft.com/mssql/server:2019-latest


說明:

1、因為我想要測試SQL Server 2019,所以我有指定版本2019-latest

2、MSSQL_PID是指定使用的版本,如不指定預設是developer,我使用的是Express是資源受限的免費版本,可用在生產環境,但是有資源限制

3、SQL Server版本的差異:https://learn.microsoft.com/zh-tw/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver16

4、因為我的Docker還有其他的Container,所以必需指定Port:4433

5、在SQL Server Managerment Studio連線特定的port時,可用「,」來指定,例如:192.192.192.10,4433

6、查SQL Server版本的語法:select @@version

CORS Error:the resource is in more-private address space 'private'

 今天在學習React.js時,利用fetch api來取得JSON的資料時,出現了CORS的錯誤:
The request client is not a secure context and the resource is in more-private address space `private`.



但是我在Server端已經設定好CORS,應該不會出現這個訊息才是。

後來在網路上找到了問題,原來是chrome在版本94之後,它不允許不安全的公網(訪問者)存取不安全的私網资源。

解決的其中一個方式是將兩邊的網路都設置為https,但是我只是學習而已,好像沒有必要設定SSL

另一個方式是進入chrome的設置頁:chrome://flags ,找到Block insecure private network requests,把值設定為disable