跳到主要內容

文章

dialogflow fulfilment webhook傳json給LINE

 我在dialogflow已經設定好LINE,直接測試也是沒有問題。 但是在自己架設API Server後,卻一直無法正確將json傳給LINE。 最後發現需要設定text區段才能將json正確傳回給LINE。 我在dialogflow測試輸入,按下「DIAGNOSTIC INFO」按鈕, 在下圖中發現Raw API response沒有fulfillmentMessages, 但是fulfillment response卻有值,表示我的webhook是有被呼叫成功並回傳json給dialogflow 加上text區段後,可以在下圖中發現Raw API response有fulfillmentMessages的區段,這樣才是成功的。 也就是payload的區段中需要設定line與text,但是我測試的結果text的值LINE不會顯示 json = {     "fulfillmentMessages": [      {         "payload":{             "line": {                 "type": "sticker",                 "packageId": "11537",                 "stickerId": "52002734"             },             "text": { //text區段必須宣告                 "text": ["預設值" ]             }         }      }     ] } 更新:之後我又把text區段拿掉再測試一次,這次又可以了,所以目前我還是不知道是什麼原因。

Node.js Response 中文亂碼

 今天在測試node.js時,response出來的中文變成亂碼,在網路上找了一些文件及自己最後解決方式,記錄一下。 我的情形是這樣的,我在Windows上的docker有跑一個node.js,中文顯示是正常的;我在Cloud上跑的node.js,中文顯示是亂碼。但是程式碼內容是一樣的。 Cloud上安裝是Debian GNU/Linux 9 (stretch) 網路上有提到文件需要是utf-8的格式,所以我在Cloud上檢查我的app.js檔: # file -i app.js app.js: text/plain; charset=utf-8 文件是utf-8,內容也是utf-8,所以原則上應該是沒有問題的。 另一個需要注意的是header,所以我在app.js上加上下列: res.header("Content-Type", "application/json; charset=utf-8"); 但是response的中文還是亂碼,最後發現是我的ssh client的問題。 因為Cloud上沒有辦法輸入中文,所以我是先在Windows的vs code編輯好後再複製程式碼貼到Cloud上。 我使用的是xshell來連線Cloud,需要在「檔案」->「內容」,找到「終端機」的設定頁,將編碼改為UTF-8 這樣貼上程式碼時才會是UTF-8,重啟cloud上的node.js後中文就可以正常顯示了。

Raspberry Pi 開機自動執行python程式

 我有自行開發的一支網頁監控程式,需要在樹莓派上啟用python3的http服務。 參考網路上的作法在init.d設定新的daemon沒有成功,手動測試啟動時會出現下列錯誤: Failed to start prtg.service: Unit not found. Raspberry Pi的OS版本如下: pi@raspberrypi:~ $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" 經查詢之過才知道OS已將sysvinit改為systemd,依步驟設定好systemd之後終於可以開機自啟動。 1、在程式server_pi.py的第一行加入 #!/usr/bin/python3,並付予執行的權限 # sudo chmod +x server_pi.py 2、在/lib/systemd/system/新增檔案prtg,並將下列內容加入: [Unit] Description=Prtg Python Server [Service] Type=simple ExecStart=/home/pi/Desktop/prtg_monitor_fh/Server/app/server_pi.py Restart=always [Install] WantedBy=multi-user.target 3、設定開機時自動啟動 # sudo systemctl enable prtg 4、測試是否可以正確啟動 # sudo systemctl start prtg 5、可以查詢service的狀況 # sudo systemctl status prtg 6、重開樹莓派看看是否開機可以自動啟動

樹莓派Raspberry Pi關閉休眠、螢幕長亮

 記錄一下同事找到的作法,以備日後有需要時可以參考。 # cd /etc/lightdm # vi lightdm.conf 找到xserver-command並將註解拿掉,其值改為如下: xserver-command=X -s 0 -dpms 其中 -s # 設置螢幕保護不啟用 dpms 關閉電源節能管理 重開樹莓派即可。 還有另一種方式就是安裝 xscreensaver 套件 # sudo apt-get install xscreensaver 在X window的畫面左上點擊樹莓派icon > 偏好設定 > 螢幕保護程式 將 Mode 改為 Disable Screen Saver

EBS更換guest帳號密碼(11i)

 為了安全性,所以更改了一些EBS帳號的預設密碼,但是遇到guest帳號密碼卻無法更改 原本以為只是一個Guest帳號,於是把它停用,結果造成EBS無法登入,這下可糗了。 這表示guest帳號並不是單純的帳號,所以到網路上搜尋一下。 找到的一份文件提到System Administrator -> System profile中也有guest password的參數,當然也是無法修改 而且Oracle的這篇文件上有提到不能停用guest帳號: Do not disable the GUEST user account. Do not disable the SYSADMIN user account until you have created other accounts with similar privilege. 所以只好再找一下文件,看看是否有其他的方式可以更改,最後找到的步驟如下,先記錄下來,以備之後使用。 「注意密碼必須要大寫」 1、在Unix上以AP帳號登入,如applmgr 2、修改AutoConfig的context file的value,變數名稱是「s_guest_pass」 路徑:<INST_TOP>/appl/admin/<CONTEXT_NAME>.xml 3、重跑AP上的AutoConfig 4、檢查密碼是已更新,執行下列SQL,回傳值應該要是「Y」 SQL> select fnd_web_sec.validate_login(‘GUEST’,”) from dual; 5、以sysadmin登入EBS,選擇「CRM HTML Administration」 responsibility,並依下列路徑點選 Setup -> Settings -> System -> Properties -> Self Service User 6、Self Service User網頁開啟,再點選Properties -> Advanced -> JTF,並檢查參數guest_password的密碼是否正確 7、重啟AP

反向代理伺服器

  前篇 提到記錄自己用ubuntu 18.04 來安裝nginx與certbot,主要目的在架設一個反向代理伺服器。 這篇記錄一下自己對反向代理的理解,以免日後又忘了。 我有三台API的服務,分別是s1.test.com、s2.test.com、s3.test.com,其中s1、s2是Docker Container,因此IP是一樣的,利用不同的Port來區分。 以前遇到這樣的架構時,我會設定防火牆的規則,可是也產生了一些問題。 1、防火牆必須開放Port 1234、5555 2、外部網站需要使用https,則每個API服務都要各別設定SSL憑證 3、前端應用可能基於安全原則,只允許呼叫https(Port 443)的服務 因此,利用nginx建置了反向代理伺服器,並設定了三個proxy rule: 1、如下圖當前端呼叫https://s1.test.com時,反向代理伺服器就會轉送要求給10.10.10.1:1234 2、我只需要在反向代理啟用SSL,後端可以不必額外的設定 3、防火牆只需要開通Port 443即可 4、外部只與反向代理伺服器連接,不與後端連線,增加一層安全性

Raspberry pi OS取得Oracle DB的資料

 因為要做監控Oracle DB狀況的一個小型專案,想用樹莓派來當做Server,以節省建置成本。 一開始在我的電腦上測試,是以python+cx_oracle+Oracle Client來設計,使用上並沒有問題。 把程式轉到Raspberry pi時發現Oracle Clinet並沒有ARM CPU版本,也就是說無法由python直接讀取Oracle DB 最後是用paramiko,以SSH連線至DB Server,由DB Server執行Script來取得資料並回傳給Raspberry pi上的python 首先在Raspberry pi OS 安裝python模組paramiko # pip3 install paramiko 接著程式分為兩個部份,第一個是Raspberry pi OS的python程式 import paramiko port =22 username = test password = 123456 IP = 192.168.1.10 oraonCom = "./test.sh" #DB Server上欲執行的Script檔,此檔放在家目錄底下 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(IP,port,username, password) stdin, stdout, stderr = ssh.exec_command(oraonlineCom) oradata = stdout.readlines() print( str(oradata[0].strip('\n')) ) stdout.close() stdin.close() stderr.close() ssh.close()   第二個是DB Server的Script程式,主要是利用sqlplus來執行SQL並傳回資料。 因為sqlplus會有一些檔頭等我們不需要的資訊,所以必需用一些參數來避掉。 #!/bin/bash sqlplus -s USERNAME/PASSWORD << EOF SET SERVEROUTPUT ON SET FEEDBACK OFF