發表文章

目前顯示的是 2023的文章

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      ...

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

圖片
  這支基金成立至今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. 針對這個服務帳戶, 建立金鑰, 並...

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...

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) Run...

超簡單做出低功耗藍牙温度計-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_...

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

圖片
同樣都使用nRF52840 Dongle, 上一次是用MicroPython, 這一次來用用CircuitPython。不管怎麼說, CircuitPython有Adafruit在支持, 文件和資源是更多的。而且, 目前CircuitPython支持的MCU就是以SAMD21/51和nRF系列為主。但要讓nRF52840 Dongle可以跑CircuitPython, 我們要先做些工作, 網路上有2個地方可以參考, 第1個是這篇文章,  Eric Pietrowicz 使用PCA10056開發板上的JLink除錯器來燒錄具UF2功能的Bootloader。 Bluetooth Low Energy with CircuitPython on a nRF52840 USB Dongle 第2個是這個影片, rdagger使用的是OpenOCD除錯器配合Raspberry Pi 3B來燒錄具UF2功能的Bootloader到nRF52840 Dongle。 當然, 直接使用JLink來燒錄也是可以。 具UF2功能的Bootloader是CircuitPython開發板的標配, 這個Bootloader讓開發板一插到電腦USB, 就會出現一個小硬碟, 讓你感覺這個開發板就是一個小磁碟機, 接下來我們要燒錄firmware, 就只要直接拖拉firmware檔案進去就可以了。 nRF52840 Dongle的UF2 Bootloader, 以及其CircuitPython firmware可以在以下連結找到 https://circuitpython.org/board/pca10059/ 依照前面提到的文章說明, 把nRF52840 Dongle的Bootloader燒成具UF2功能的, 之後插入這支Dongle到電腦的USB埠, 就會出現一個名為NRF52BOOT之類的小磁碟機, 然後將CircuitPython的.uf2 firmware拖拉進去, 就會打造出一個跑CircuitPython的開發板了。 這個過程需要一些工作, 如果覺得太累, 也可以買一個出廠就已經幫你燒好UF2 Bootloader的開發板,  Adafruit Feather nRF52840 Express 就是一個, S EEED STUDIO XIAO NRF52840 也是...

超簡單做出低功耗藍牙温度計(nRF52840 Dongle + TMP102 + MircoPython)

圖片
 MicroPython支援nRF52840 Dongle (pca10059), 這支在Mouser上只要台幣343左右就可以買到。買來後要燒錄MicroPython的firmware, 寫作時, MicroPython出到1.20.0版。燒錄方法, 可以參考 燒錄Micropython 1.12至nRF52840 Dongle 。這連結有更新, 文章下方有增加1.20.0版的燒錄方式, 不用擔心, 現在的燒錄方法是可以還原的, 以後仍可燒回其他firmware。 有了可跑MicroPython的nRF52840 Dongle後, 可以直接寫Python程式來實作低功耗藍牙温度計。其實不用傷腦筋如何寫, MicroPython官網就有一個範例程式, 直接拿來用就可以有這個功能了! 這麼好, 當然了, 這不就是MicroPython給我們的承諾嗎? 簡單好用! 連結在此:  ubluepy_temp.py 註: 這個程式和MicroPython 1.20.0在nRF52840上, 會有RTC被用掉的問題, 要改一下! 如下圖, 1改成2就可以了。 改好, 直接跑, 然後用手機上的nRF Connect App (或其他BLE App), 找micr_temp這個裝置, 連接上去, 注意連接上去後, Dongle的LED燈會亮起來。找Environmental Sensing服務下的Temperature特徵值, 按下通知啟用, 並修改Data parser為符號整數。查看log部份, 就可以看到每5秒左右會更新一次温度值。如下圖: 如上圖, 第2點所圈起處, 看到2800, 這表示為28度C。如果沒有修改Data parser, 預設會是看到16進位數值, 如上圖第3點所圈起處0xF00A, 這個格式我們人類看不懂! 大家都注意到了吧! 現在温度都出現2700, 2800, 2900之類的, 後面那2個0都不會出現其他數字, 這是因為現在這個範例程式是存取nRF52840內建的温度感測器, 而這個温度感測器基本是查看MCU的温度用的, 而且目前firmware的實作也沒有取得小數點部份, 可能覺得沒必要! 而且, MCU通常會發熱, 比實際上的環境温度要高一些。 因此, 以下使用TMP102這顆TI的温度感測器來取得較為接近實際環境的温度。修改部份...

再論TI TMP102

圖片
 雖然TMP102只是一個温度感測器, 但因為它使用I2C溝通界面, 讓我們可以學習I2C的用法, 而且架構簡單, 用起來不難, 但又有許多功能可以設定, 玩起來很有意思, 最主要的是其温度感測算是很準, 所以我一直很喜歡這顆。加上網路上也有很多人在用, 討論的文章和驅動程式都很容易找到, 所以這裡我想再談一下這顆的一些用法。 1. 驅動程式的寫法:  其實可以不用自己寫驅動程式, 如果你使用Arduino, 那Sparkfun已經幫大家寫好了:  SparkFun_TMP102_Arduino_Library  請直接拿去用就好了! 如果你使用MicroPython, 那khoulihan也寫好一個:   khoulihan/micropython-tmp102 ,  他其實已經寫得很好。 但是我還是自己用MicroPython再寫了一次, 原因是khoulihan的驅動太完整了, TMP102所有的功能都實作了! 可惜的是我想用的一個開發板的Flash空間太小, 放了這個驅動後, 剩下的空間就太小了, 要寫其他的程式就很受限! 另外, 在自己改寫的過程中, 我發現自己又學到一些東西。雖然多花了幾天時間在嘗試, 還是收穫不少! 其實2017年在玩PyMata的時候, 就已經寫過TMP102的驅動, 參見 python code for pymata tmp102 , 但這個是架在PyMata之上的, 基本上是在PC上面執行, 稱之為驅動, 似乎有些奇怪。但程式邏輯和想法基本上相同。 操作TMP102的方法, 很簡單, 就是設定其暫存器的值就可以了, 如下圖 (取自TMP102的datasheet), TMP102主要有4個暫存器, (還有一個指位暫存器Pointer Register), 要取得温度值, 就讀取Temperature Register的內容值, 再做一些格式轉換即可。要讓TMP102進入省電的Shutdown模式, 就只要將Configuration Register內的某一個位元設成1就可以了。問題是如何指定要存取那個暫存器呢? 那就要在指位暫存器先指定就可以了, 例如, 將指位暫存器設成0x01, 就可以存取Configuration Register。 不過, 在讀或寫暫存器值時, 指...