發表文章

Oracle 11g R2 突然無法連入事件 (CLOSE_WAIT, TIME_WAIT)

 昨日我們一台Oracle 11g主機突然無法連入, 檢查後發現用SSH連入主機正常, 在主機上存取Oracle也都正常, 主機CPU, 記憶體, HD用量也都正常。只有透過網路存取Oracle的連線變得很難連上, 有時等很久之後可以連上。同事直接重開該台主機(shutdown, reboot)後, 就可以正常連上, 但沒多久又發現同樣連不上的情況! 我將listener 關下, 再打開後, 也一樣正常一下子, 然後就又連不上了。同事發現listener log檔已經非常大, 決定將log檔copy走, 刪除, 讓log檔重新開始。但是重開listener後, 情況一樣沒改善! 此時, listener log檔內可以看到一些錯誤訊息: 26-DEC-2023 12:02:54 * (CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGRAM=c:\windows\system32\inetsrv\w3wp.exe)(HOST=xxxx )(USER=NETWORK?SERVICE))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.xx.xx.xx)(PORT=1234)) * establish * orcl * 12518 TNS-12518: TNS:listener could not hand off client connection  TNS-12547: TNS:lost contact   TNS-12560: TNS:protocol adapter error    TNS-00517: Lost contact     Linux Error: 32: Broken pipe 使用netstat -ant, netstat -anp | grep 1521 或者lsof -i:1521查看會發現有很多TCP/IP連線的狀態一直都呈現TIME_WAIT, CLOSE_WAIT之類的的不正常狀態, 而且很多都不會消失, 還愈來愈多! tcp        0      0 127.0.0.1:62333             127.0.0.1:1521              ESTABLISHED 4316/ora_pmon_orcl tcp        0      0

基金日記: 基金的績效怎麼看?

圖片
  這支基金成立至今2年多, 成立時正好是FED為了因應全球Covid-19疫情造成的全球經濟困局, 而大量印鈔的時候。當時, FED救市, 直昇機式的大撒幣, 美國人手上現金滿滿, 股票市場熱鬧。利率降到0, 如下圖。此時也成就了不少少年股神!  但接著, 通膨就來了, FED為了對抗通膨, 已開始有傳出要升息的聲音。那時, 我對基金公司在此時成立這支基金, 心裡就有一些疑問? 這種全球趨勢的基金, 又不是反做或平衡型, 以趨勢來看, 不是正好去接掉下來的刀子嗎? 但因為理專的推銷, 我就意思意思的買一點點, 反正當做一個指標來觀察也好。 果然, FED開始升息後, 其淨值就開始掉掉掉, 到現在2年多, FED抗通膨有了一些成果, 開始傳出明年會啟動降息的消息, 這個基金的淨值就慢慢的回升。 現在事後諸葛一下, 檢討如何操作才是比較好的策略:  1. 一般人會想, 買在最低, 賣在最高是最好的策略, 但這個策略的問題在於, 沒有人知道什麼時候是最低點, 什麼時候是最高點。所以, 理論很好, 但現實不可行。 2. 一個說法是最好的買點是十年前, 其次是今天。但這個策略的問題是, 很可能買在最高點, 當然也很可能買在最低點, 反正全看運氣。 3. 我想, 應該盡可能買在低點, 利用一些工具來提高猜測的準確度, 就可以有不差的效果。以FED的利率來看, 升息開始後約半年, 就是基金淨值的最低點。到利率最高點時, 淨值都是向上的走法。當然此期間, 淨值還是上上下下的走。這段期間, 如果定期分批買進, 其實是會獲利的。 配合基金的績效圖表來看, 孤注一擲的在2年前下好離手, 到現在就是-9.43%(虧錢)。那如果是孤注一擲的在1年前下好離手, 到現在就是29.18%(大賺錢), 即使在半年前孤注一擲, 至今也有8.14%。但這種策略其實很難實行! 因為很難猜到何時是最低點。 實戰後, 會發現, 比較好實行的策略會是, 依照FED的利率, 配合全球景氣的相關數據, 定期(不)定額的買入。以績效圖表來看2年前就開始定期定額, 到現在也有15.61%, 就算是1年前開始到現在也有14.41%。

nRF52840 Dongle CircuitPython 類比輸入腳位

圖片
 如同大多數的MCU只有特定幾支腳有支援類比輸入的功能, nRF52840 Dongle 也是只有幾支腳位有類比輸入功能。但其實我也懶得查文件,所以就直接測試看看: 進入REPL,輸入指令: >>> import board >>> from analogio import AnalogIn >>> analog_in = AnalogIn(board.P1_10) Traceback (most recent call last):   File "<stdin>", line 1, in <module> ValueError: Invalid pin 這樣P1_10 (即下圖中的左下角 1.10 Pin) 這支腳位就是不支援的,如此,有點耐心的一支腳一支腳的試,全部試完,就知道了,:-) >>> analog_in = AnalogIn(board.P0_31) >>> analog_in = AnalogIn(board.P0_29) >>> analog_in = AnalogIn(board.P0_02) 結果,只有這3支腳位 (0.02, 0.29, 0.31) 沒有出現錯誤訊息。 那應該就是這樣了,之後找時間,實際接個電路來試試。

由Python程式來存取Google sheets (試算表)

圖片
 可以在Raspberry Pi上讀取TMP102的温度值後, 我想要把温度值存放在那裡? 存在本機的檔案上, 網路上已有現成Python程式, 放在MQTT Server, 以前就玩過。想到放到Google 試算表應該也不錯, 以前也沒試過, 不如來試試! 首先找到這一貼文 Reading and writing to Google Spreadsheets using Python , 此文言簡意賅, 只有3個步驟就做完, 文章印出來也只要2頁! 但是第一個步驟因為要操作 Google API Console , 而這個網頁看來操作方式有些修改過了, 所以照著做會有些困難。自己摸索一陣時間後, 才弄清楚! 其實網路上討論這個部份的貼文不少,  【Python 網頁爬蟲 #1】設定 google sheet API 並取得 json 金鑰,讓我們的資料能同步更新至雲端 google sheet 表格 (內含完整圖片說明) 這篇貼文就很詳細, 文章是去年寫的, 還算新, Google API Console的操作界面和現在的一致。另外,  How to Read and Write Google Sheets Data Using Python 這篇貼文在設定Google Cloud Console部份, 描述的更詳細, 而且Python程式部份使用不同的套件。還有一篇陳濤半年前寫的 [筆記] 使用 pygsheets 記錄實驗數據到 google sheet 也很不錯, 特別是把Python pygsheets套件的幾個常用操作點出, 值得看一下。 我就不重複講了, 只提幾個重點: ===  步驟 1 === 1. 要先建專案  2. 在建好的專案裡, 啟用2個API。Google Drive API, Google Sheets API (有些文章只提到要啟用Google Sheets API, 那就要看你之後的程式的寫法, 我因為後面Python程式有用到, 所以要這2個都啟用) 3. 建立憑證 (有3個可以選: API, OAuth ID, 服務帳戶。要選服務帳戶, 建完後會得到一個電子郵件地址, 類似 xxx@xxx.iam.gserviceaccount.com ) 4. 針對這個服務帳戶, 建立金鑰, 並下載其JSON檔案 (命名為creds.json

How to add (and remove) Tmp102 sensor to Raspberry Pi 4

圖片
(註: 此圖截自SparkFun文章:  Python Programming Tutorial: Getting Started with the Raspberry Pi , 本文的接線方式和此相似, 只是GND接到Pin 9, 而不是Pin 6, 因為Pin 6被散熱風扇佔走! ) 將TMP102温度感測器連接到Raspberry Pi (R-pi), 之後就可以利用R-pi來監測環境温度。只是簡單的把環境温度記錄到log檔, 或者儲存到雲端讓人們隨時可透過網路查詢; 或者加上觸發條件在温度高於或低於特定值時可進行通知的動作。這些都是可以做的。本文先嘗試踏出第一步, 將TMP102接上R-pi, 讓系統可以存取其感測到的温度值, 也讓我們可以寫Python程式來存取温度值。 Raspberry Pi temperature sensor using TMP102 這篇貼文, 其實就在說明如何將TMP102連接到R-pi, 但因為Raspberry Pi出來很多年了, 出的板子種類也很多(2, 3, 4, Zero, Zero 2, etc), 同樣的在其上跑的OS也很多, 有官方的Raspberry Pi OS, Ubuntu, Freebsd, 等等。所以, 這文章以現在來說,有一些需要小修改的地方。 本文針對Raspberry Pi 4B, 使用官方Raspberry OS 64bit的環境,嘗試加入TMP102,基於以上所提文章做一些補充。 先進行以下設定: 1. Enable I2C $ sudo raspi-config 選3 Interface Options 然後選I5 I2C, 接下來會問你要enable I2C嗎? 選是. 往下記得重開機! 2. 安裝以下套件: $ sudo apt-get install lm-sensors   (出現一些問題, 但不用管它!) $ sudo apt-get install i2c-tools ================== 硬體接線 ================== TMP102模塊上的4支腳(VCC, SDA, SCL, GND), 分別接到Raspberry Pi GPIO的(1,3,5,9), 如上圖, 都在上面左方, 我打勾的4個腳位。記得接線前, 先把Raspberry Pi關機,

reject=403 4.7.0 TLS handshake failed (2)

 reject=403 4.7.0 TLS handshake failed 這個訊息總是會出現在我們sendmail的log檔, 之前找到msn.com網域的信, 其實是寄到outlook.com網域去的。這次是另一個類似的案例: # mailq Warning: Option: AuthMechanisms requires SASL support (-DSASL)                 /var/spool/mqueue (1 request) -----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------- 3781ZYIW045303   164044 Tue Aug  8 09:35 <>                  (Deferred: 403 4.7.0 TLS handshake failed.)                                          <bounce-833_HTML-127233725-9424761-700                 Total requests: 1 在mailq裡面看到一封寄不出去的信, 之前查過, 知道這應該是寄到我們合法使用者的廣告信, 收到使用者信箱後, 自動彈回的收到回條! (bounce-xxx...) 我們要求sendmail自動重送queue裡的信, 來看看問題何在? # sendmail -v -q Warning: Option: AuthMechanisms requires SASL support (-DSASL) Running /var/spool/mqueue/3781ZYIW045303 (sequence 1 of 1) <bounce-833_HTML-127233725-9424761-7002400-1004@bounce.email.savills-asia.com>... Connecting to inbound.s6.exacttarget.com. via esmtp... 220 orionsmtp-172.s6.exacttarget.com ESMTP Postfix

超簡單做出低功耗藍牙温度計-Part 3(nRF52840 Dongle + BME280 + CircuitPython)

圖片
 之前用TMP102, 只有温度值可以看, 若加上溼度值, 會更具實用性! 那就要改用別顆感測器了, 具温溼度感測功能的sensor有很多選擇, 之前試了DHT11, AM2320, BME280, 覺得BOSCH BME280比較好用, 晶片本身具有I2C, SPI界面, 有些模塊二個界面都有把pin腳引出, 有些模塊只引出I2C, 這種的價錢便宜許多。這裡, 只使用I2C, 所以寫程式方式和之前(TMP102)文章相似, 也可以使用便宜的模塊就好。 同Part 2的文章, 使用CircuitPython來實作BLE低功耗藍牙傳輸資料, 可以使用Adafruit寫好的Bluefruit Connect App, 我們只要在nRF52840 Dongle上面透過現成的BLE UART服務, 把温度和溼度的數值傳送出去給App就可以了。先看一下完成的樣子: 送出來的資料格式就是温度值接著是逗號, 然後是溼度值再接著換行符號。這樣在Plotter就會出現2條線, 一條代表温度, 一條代表溼度。 因為BLE UART服務的寫法, 之前的文章已經看過, 我們現在只要克服讀取BME280這個問題就好了。之前在使用TMP102的時候, 提過可以使用別人現成寫好的驅動, 但為了更深入掌握TMP102, 之前的文章有去了解驅動的寫法, 而且我們自己也動手寫了一支適合自己的TMP102驅動。但這其實很花時間! 在這裡, 我們直接使用現成的BME280驅動。一樣去CircuitPython Librarys (adafruit cricuitpython bundle)找就有 (adafruit_bme280), 如下圖, 把這個目錄複製到開發板上的lib目錄下面: 我買的BME280, 如下圖, 只用到左邊4支接腳(VCC, GND, SCL, SDA)。 同樣接到nRF52840 Dongle的(VDD OUT, GND, 0.31, 0.29), 如下圖圈起處: 把下面程式存入至Dongle上面的code.py, Ctr-D, 同樣由終端機來觀察看看, 如果都成功取得數值, 那麼就成功連通BME280了。 import time import board import busio from adafruit_bme280 import basic as adafruit_bme2