發表文章

排查IIS ASP.NET網站應用程式記實

 事情發生在windows domain controller (DC)伺服器的硬碟故障導致我們直接放棄該台DC並將所有DC工作全部轉移到另一台DC之後。登入網域驗證的工作沒有問題的移轉了, 但問題出在DNS: client若使用DHCP取得IP的, 基本沒什麼問題。問題在固定IP的電腦或伺服器, 基本上若有變慢或卡住的情形, 檢查其DNS設定做更改就是。但有些情況是比較難排查的: 我們注意到內部一套使用ASP.NET開發的系統, 之前都流暢運行, 現在在登入或操作數分鐘之後, 會出現卡住10多秒的情形, 但之後又可以持續正常運行一段時間。 一開就懷疑是名稱解析問題, 但該伺服器的DNS已改成正確的, 狀況還是沒有改善。問Copilot意見,由它的建議中,找到查IIS Log的方法:   📑 檢查 IIS 日誌 日誌位置 預設路徑: 程式碼 %systemroot%\system32\LogFiles\W3SVC1\ (不同網站會有不同的 W3SVC 編號資料夾)    打開最可能的日誌檔後,複製全部的內容,再貼回給Copilot去分析。它告訴我幾個要注意的地方, 其中出現302重導, POST請求的問題, 可能是登入流程, session驗證, 或後端SQL查詢延遲。這讓我將注意力放到登入的部份, 確實問題是在登入或操作數分鐘之後, 會出現卡住10多秒的情形。而我們的ASP.NET應用程式, 也是在登入時必須和後端資料庫比對資料成功後才發給session。先看看是否連線到資料庫正常, 用tnsping: C:\Documents and Settings\ops>tnsping xxx TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 25-6月 -2 026 10:53:52 Copyright (c) 1997 Oracle Corporation. All rights reserved. 已使用的參數檔案: 使用 TNSNAMES 介面程式來解析別名 Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOS...

Ubunt 24.04 加裝XFCE桌面環境

圖片
 微軟的Copilot一直推薦我使用XFCE來取代GNOME桌面: 為了讓你在 XRDP 下獲得穩定的使用者體驗,尤其是在登入後不閃退、不依賴 GNOME 和 systemd --user ,我建議你使用 XFCE 或 MATE 桌面環境,並重新配置 session 啟動鏈條。  我就信它一次, 來試試看: 🧰 1. 安裝 XFCE 桌面環境(推薦) sudo apt update  sudo apt install xfce4 xfce4-session xfce4-goodies dbus-x11 為什麼選 XFCE: 它不依賴 systemd --user ,且在 XRDP 下表現穩定、資源消耗低。 📝 2. 編輯 /etc/xrdp/startwm.sh 請將內容改成如下: #!/bin/sh  . /etc/profile  . ~/.profile  exec startxfce4 ✅ 確保該檔案可執行: sudo chmod +x /etc/xrdp/startwm.sh  ⚙️ 3. 設定 PAM 與 D-Bus 相容性(選用) 確認 XRDP session 使用 PAM 載入環境: sudo grep pam_systemd /etc/pam.d/xrdp-sesman || echo "session required pam_systemd.so" 如果沒有該行,可加入: echo "session required pam_systemd.so" | sudo tee -a /etc/pam.d/xrdp-sesman  🧹 4. 清理殘留 .Xauthority 及 lock file(首次修復建議) sudo rm -f /tmp/.X11-unix/X*  sudo rm -f /tmp/.X*-lock  rm -f ~/.Xauthority  touch ~/.Xauthority  chown ops:ops ~/.Xauthority 🚀 5. 重啟 XRDP sudo systemctl restart xrdp  sudo systemctl...

Ubuntu 24.04 XRDP+GNOME桌面狀況(黑畫面+閃退)

圖片
 Ubuntu 24.04的GNOME桌面, 使用XRDP, 由遠端桌面工具登入時, 使用界面真的很棒。非常現代化的設計, 多個桌面任你增減, 應用程式隨你拖拉, 非常直覺的設計, 而且反應流暢快速, 令人愛不釋手。   但是我碰到許多問題, 一開始是用遠端桌面連線工具程式連入時, 畫面卡住, 只看到滑鼠遊標變成X, 就是所謂的黑畫面。找了一下, 有人說是將/etc/xrdp/startwm.sh加入以下幾行: unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile 一開始, 還管用, 但不久又出狀況, 用遠端桌面連線工具程式連入時, 打完帳號密碼, 就立刻閃退。又找了一下, 網上有人說, 可以在client端的機器, 找default.rdp這個檔案, 把檔案的這行: use redirection server name:i:0 改成 use redirection server name:i:1 試了一下, 可以哦! 連進去了。 但好景不常, 沒幾天, 它自己斷線, 然後就再也連不進去了, 一直閃退!  所以開始和Copilot一起找問題: 1. 先看/etc/xrdp/xrdp.ini, /etc/xrdp/sesman.ini, 沒什麼特別問題 2. 查看/var/log/xrdp-sesman.log, Copilot看完後說: " XRDP session 啟動順利地完成使用者驗證並啟動了 Xorg,但在 window manager 啟動階段卻快速崩潰。這是造成 session 秒斷的主要原因。" 然後它建議我檢查 /etc/xrdp/startwm.sh, 我就直接把這個.sh檔案內容給它看。它回答看起來就是預設的寫法, 依賴/etc/X11/Xsession來啓動桌面環境。並建議我大改/etc/xrdp/startwm.sh, 我覺得不知道在改什麼, 就告訴它, 重開機就可以連進去, 但一段時間後會斷線, 然後就連不進去。於是它要我試試:   2-1 檢查之前連線殘存的lock file     ls -la /tmp/.X11-unix/     ls -la /tmp/.X*-loc...

Windows AD裡若有多台DC, 當其中一台出現問題時, 解決過程! (考古文)

 沒錯! 2025年了, 還在用Windows 2003 server的AD網域。所以, 最新版的Windows AD應該已經不會有這些問題了吧! 我不知道! 但是windows 2003的AD, 就已經可以有多台DC, 當然是為了防止單一台主機故障, 我們辛苦一筆一筆建立的使用者帳號就不見了。有了多台DC, 就可以把這些帳號資料同時存在不同的DC, 萬一有一台機器壞了, 還有其他DC保存個這些資料。   那麼平常使用AD帳號登入機器時, 自然也是去DC查詢帳號密碼對不對。是不是多台DC環境下, 只要有一台DC正常運作, 就可以了呢? 很多人都會理所當然的這麼想的, 但在2003, 其實不是這樣的。我們有一台主機, 在登入畫面, 當選擇登入AD網域時, 一直出現 "無法登入, 因為無法連線到網域" 的錯誤訊息。因為之前已經檢查了相關主機狀況, 所以我知道多台DC中有一台有點問題。它出現了以下幾個徵狀:     1. 在Active Directory使用者及電腦, 要查找使用者時出現問題     2. 查看事件檢視器的目錄服務分類, 看到一些複寫的錯誤及警告, 例如: ------------------------------------------------------------------------------------------------------------------------ 這個伺服器是下列 FSMO 角色的擁有者,但並不認為它是有效 的。對於含有 FSMO 的磁碟分割,這個伺服器自從重新啟動後即 未以任何它的協力電腦成功複寫過。複寫錯誤正阻礙這個角色的 確認。   要求連絡 FSMO 操作主機的操作將會失敗直到這個問題被更正 為止。   FSMO 角色: CN=RID Manager$,CN=System,DC=princo,DC=com,DC=tw   使用者動作:   1. 初始同步處理是系統啟動時所做的第一個早期複寫,初始 同步處理失敗可能說明了為什麼無法確認 FSMO 角色。這個程序 已在 KB article 305476 中說明。  2. 這個伺服器擁有一 或多個複寫協力電腦...

在Windows 2003 server裡備份檔案, 使用ShadowSpawn + robocopy (考古文)

 時光來到2025, 還在用Windows 2003 server, 大家就知道我的年資不少了。反正, 基於各種原因, 就是要用Windows 2003就對了。而且有備份檔案的需求, 上網找了一下可能的方案, 發現robocopy有不少愛好者, 評價很好。所以就想用, 而robocopy在windows 2003是透過resource kit提供。沒想到微軟的網站上, 已經找不到這個resource kit了, 所幸在Archive網站仍然可以找到。 Windows 2003 Resource Kit x86 Internet Archive的連結 注意一下, 似乎只支援x86, 還好的是我使用的那台機器是x86。安裝方法很簡單, 下載下來的 rktools.exe檔直接執行, 然後一直下一步就可以了。預設會在C:\Program Files\Windows Resource Kits\Tools目錄下安裝許多工具程式, 其中也包括robocopy。 Robocopy的使用方法, 可以參考這個網站:  Robocopy使用詳例 ********************************************************** 接著, 我發現了一件事: 有些檔案因為被鎖定, 所以一直沒有被robocopy備份到! 才想到要做Shadow copy! 又研究了一下, 發現ShadowSpawn的評價不錯, 它的網址:  Candera/shadowspawn  是GitHub的一個公開專案, 可是專案owner Candera說已經十多年沒認真使用Windows平台了, 目前也沒心力再支援這個專案了, 也希望有心人可以fork它的專案來接手維護。而且, 之前的已編譯好的可執行程式目錄也不見了。所以只能自己編譯了(還好有source code), 但我試了一下, 發現我編出來的程式, 沒辦法在Windows 2003上面跑, 因為使用的微軟開發環境太新了!  所幸, Candera有指出明路:  關於可在Windows 2003執行的ShadowSpawn可以在那裡找的討論文 , 所以下載這支程式, 不用安裝, 直接放到HD, 再安裝vcredist-2010_x86.exe (如果原本沒裝過的話...

在Ubuntu 24.04上使用nsd安裝一台Authoritative DNS Server

 我發現安裝Ubuntu 24.04 Server後預設會有systemd-resolved service在跑, 使用netstat -l指令查看, 會看到127.0.0.53之類的socket出現, 還有使用ls -l /etc/resolv.conf, 會發現這個檔案變成軟連結。問了Copilot, 它說: "127.0.0.53 是 Linux 系統(特別是使用 systemd 的發行版,如 Ubuntu)中 systemd-resolved 的本地 DNS stub resolver。它的作用是作為本機 DNS 中介,將應用程式的查詢轉發給實際的上游 DNS 伺服器。"而systemd-resolved的上遊是那台DNS server呢? 應該是放在 /etc/systemd/resolved.conf 這個設定檔, 這個檔可以如下設定: [Resolve] DNS=8.8.8.8 FallbackDNS=1.1.1.1 然後, 下指令: sudo systemctl restart systemd-resolved 重啓systemd-resolved, 應該就可以正常的ping的到主機名稱了。  問題是, 我要安裝nsd時, 會發現port 53已經被佔用, 不能安裝了。所以第一個動作, 我必須先禁用systemd-resolved, 改回使用原本的/etc/resolv.conf檔的老方法。Copilot告訴我的詳細作法: ------------------------------------------------------------------------------------------------------- 關閉 systemd-resolved 的完整步驟: - 停止並禁用服務 sudo systemctl disable --now systemd-resolved - 移除 /etc/resolv.conf 的符號連結(symbolic link) 預設這個檔案其實是連到 /run/systemd/resolve/stub-resolv.conf sudo rm /etc/resolv.conf - 建立一份你自己的 resolv.conf 檔案 你可以手動指定 DNS,例如使用 Google DNS: ...

Khadas VIM3 開發板Android的源碼編譯好後,如何燒錄?

 在Khadas community找到的文章 vim3-vim3l-aosp-android-14-0-upside-down-cake , 以下試著照做看看! 1﹒ 先跳過自行編譯源碼的部份,直接下載他們已經編好的影像檔   2﹒ 準備燒錄工具 pyamlboot 直接在命令列,下以下指令: pip3 install pyamlboot  結果出現錯誤訊息:error: externally-managed-environment,找了一下,有一文 stackoverflow ,很多人在討論並提出很多解法。我採用python venv的做法: (1)  先安裝venv: sudo apt install python3-venv (2)  建立一個venv: python3 -m venv .venv (3) 啟動這個venv:  source .venv/bin/activate (4) 在這個venv下安裝pyamlboot: (.venv) $ pip3 install pyamlboot    3. 讓VIM3開發板進入USB upgrade mode (1) 供電 (2) 在2秒內,快速按F鍵3次,放開 (3) 藍色LED燈會閃3秒,然後熄滅, 這樣就進入 USB upgrade mode          

Khadas VIM3 開發板Android的源碼編譯

圖片
 續上篇, 完成源碼的下載後, 如何編譯呢? 首先要把相關的工具準備好, 官網有文章 install-toolchains 說明, 有2個方法, 第一個方法是直接在ubuntu下一些指令, 另一個方法是利用Docker, 把預先弄好的Docker Image抓下來, 再跑起來, 就可以在裡面進行編譯Android源碼的動作。 因為我之前在電腦上已經裝過編譯Orange Pi的Android 12的工具, 不想2個開發板的環境混在一起, 加上想試一下Docker怎麼使用, 所以選擇了第二個方法。 基本上依文件的指令下就可以, 但裝Docker的部份, 若要取得最新的版本, 可能要去查一下Docker的文件。接著取得 wesion / khadas_android:v0.6 這個Image, 然後把它跑起來。 文件上寫下這個指令: sudo docker run --privileged -i -t -v / home / you_name: / home / android wesion / khadas_android:v0.6 bash 全部照抄就可以, 但是/home/you_name:/home/android這個部份要改一下, 前面我們下載Android源碼時, 文件有叫我們建一個工作目錄, 我使用/home/ops/work這個目錄名稱, 所以整個Android源碼的程式都放置在這個目錄下。為了讓Docker跑起來後, 可以存取到Android源碼目錄, 指令的這個部份我改為/home/ops/work:/work (用來取代前面提到的/home/you_name:/home/android)。改成這樣, 下指令, 會看到命令提示字元變成類似: root@3458795s8df812:/work# 這樣就進去Docker這個環境了, 如果要離開, 只要下exit指令就可, 同樣命令提示字元會回到原來的樣子。在這個環境裡下df指令, 就可以看到可以存取的目錄有那些, 我們只要關心是不是有/work這個目錄就可以了。有的話, cd進去, 然後照著官網的 build-android 文件做就可以。 以編譯Android 9 64位元為例: 分為2個步驟: 1. 先編譯bootloader $ cd /home $ cd bootloader / ubo...

Khadas VIM3 開發板的Android源碼下載

 最近在學習Khadas VIM3這個開發板, 特別是跑Android, 第一個問題就是要先下載源碼。官網有文件 download-android-source-code 說明。以下記錄依文件操作所碰到的問題和思考如何解決, 但可能我的想法也不見得是最好的! 1. 先安裝git-lfs工具 查了一下, git-lfs是git的擴充套件, 針對大型檔案儲存對git造成的問題提供解法, 主要是大型檔案就放在雲端, 本地端就放指標就好。看了git-lfs官網說明, 建議要升到3.6.1版本。Khadas的文件仍叫我們安裝2.3.4的版本。如果要試安裝3.6.1版, 可以使用以下網址連結。 https://github.com/git-lfs/git-lfs/releases/download/v3.6.1/git-lfs-linux-amd64-v3.6.1.tar.gz 下載並解壓縮, 下 sudo ./install.sh 指令, 會出現錯誤訊息, 就下git init指令, 再重下 sudo ./install.sh 就不會有錯誤訊息了。 2. 建立工作目錄, 並下載manifest, 為什麼要下載這個檔案呢? 我問了ChatGPT, 他提到在同步特定Android設備的源碼時, 有些部份是特定廠商的Git Repo(也就是該設備特有的檔案物件), 不同的設備使用不同的manifest檔案來區別要同步的源碼。Khadas VIM3維護了3個不同的Android版本, 我先試用主要維護版本Android 9 64位元版。 下以下指令: $ repo init -u https: // github.com / khadas / android_manifest.git -b khadas-vim3-p-64bit 3. 開始同步源碼, 下 repo sync -c -j4, 這裡我才想到, 為什麼不是用git, 而是用repo呢? 同樣問ChatGPT, 他說repo是Google開發的一種git repo管理工具, 主要用於管理多個git repo的Android源碼。它是git的一個封裝工具, 簡化管理多個git repo的操作。這樣我就理解了, 主要是Android源碼太大, 分散放在不同的git repo, 所以要同步所有源碼時, 總不能每個git r...

Orange Pi Zero 2W開發板, 自行編譯好的Android 12映像檔, 如何燒到SD卡, 才能成功開機?

圖片
 Orange Pi官方網站, 可以找到Orange Pi Zero 2W的使用手冊, 一個370頁的PDF檔案, 其中有一個章節提到如何編譯Android 12的原始檔, 如下圖: 第一步是下載原始檔, 由官網給定的Google Drive:  H618_Android12_Source , 將原始檔下載下來, 因為原始檔太大, 被壓縮後還要分成多個檔案。約40GB的大小, 用100mbps的網速, 也花了半小時以上的時間才完成。接下來依手冊說明操作, 先檢查MD5, 確認檔案沒有缺損問題。就可以把多個檔案合併回一個壓縮檔了。然後解壓縮成一個原始檔目錄, 再將Orange Pi Zero 2W特定的修改碼(opizero2w_android12_patches.tar.gz)解壓縮後, 複製到原始檔的目錄去。  第二步是編譯原始碼, 如下圖, 手冊是說, 需要一台跑Ubuntu 22.04的電腦, 16GB以上的記憶體, 以及200GB以上的硬碟空間, CPU當然是愈快愈好。 因為我之前剛裝好一台Ubuntu 24.04的電腦, 雖然版本比較新, 可能會碰到一些問題, 但還是先嘗試一下, 看可不可以。果不期然, 在安裝編譯所需的套件時, 就有兩個套件找不到無法安裝: lib32ncurses5-dev和  libncurses5。就先試著安裝libncurses6, 想可能版本有更新, 也許就可以用了。但其實後面就碰到困難, 編譯會失敗! 如下圖, 在 make -j8 這行指令下下去之後, 就出現錯誤。 錯誤訊息是libncurses.so.5檔案不存在之類的, Google了一下, 發現 libncurses-so-5-library-missing-in-ubuntu-22-04-installation-for-arm64-rapsberr 這個討論串, 看來似乎是發問者, 最後自己找到答案, 回來留下了解法。因為他的文字說明, 沒操作過的, 一開始不太能看得懂。我解釋一下: 1. 如果是64位元的Ubuntu, 需先設定i386外國架構(foreight architecture)。 ----> $ sudo dpkg --add-architecture i386 2. 要修改/etc/apt/so...

QNAP TR-004, TR-002使用感想

圖片
 最近有儲存空間的需求, 買了QNAP的TR-004和TR-002, 這不是NAS, 是DAS, 簡單的說可以看成是有硬體RAID功能的"大"型隨身碟或外接硬碟。 因為重視的是資料保存安全, 所以使用RAID 1或5, 這樣硬碟若有一顆故障, 只要更換就可以。這種外接RAID都是熱插拔, 也不會中斷系統的使用。試過硬碟有問題時, 機器會發出異常聲響, 燈號會閃爍。只是若機器放在機房, 可能不會聽到! 監控軟體就很重要, 管理員從監控軟體可以看到硬碟狀況, 或者主動寄電子郵件通知, 就比較可以掌握實際情況。 QNAP External RAID Manager可以由官網下載使用, 用來查看機器和個別硬碟的情況, 其實是簡單明瞭, 够用了。但可惜的是, 這個官方提供的工具只有Windows和Mac版本, 沒有Linux版本!  針對Linux, 我在網路上找了一下, 發現:  Tr-004 Drive Health Status Linux  這討論文, 有人提到可以下這個指令:   smartctl -d jmb39x-q,0 -a /dev/sdb1 試了一下是可以用的, 在ubuntu要有安裝smartmontools套件: sudo apt install smartmontools  而因為TR-004是使用JMicron晶片, 所以要下-d jmb39x-q參數, 後面加上第幾顆硬碟的參數(0代表第一顆, 1代表第二顆, ...) 指令執行結果, 如下: $ sudo smartctl -d jmb39x-q,0 -H /dev/sda1 smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-53-generic] (local build) Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Status not supported: NO DATA ATA commands not implemented [JMB39x] SMART overall-healt...

安裝ubuntu server 24.04, 含RAID 1, GUI 紀錄

圖片
 1. 組裝好PC後, 記得先更新主機板的firmware!  以ASUS主機板來說, 到官網找到對應板子的BIOS下載, 會拿到一個ZIP檔, 解開後, 放到格式化為FAT32的USB隨身碟, 開機按F1或DEL進入BIOS。找到更新firmware的地方, 插入USB隨身碟, 選取新的firmware檔案。(以我的例子來說, 是TUF-GAMING-Z790-PLUS-WIFI-ASUS-1805.CAP的檔案, 更新時間並不快, 要等一下!) 2. 到ubuntu官網取得ubuntu server 24.04的ISO檔。(我拿到的是ubuntu-24.04.1-live-server-amd64.iso) 3. 將ISO檔燒錄到USB隨身碟去, 一般使用balenaEtcher。用該USB隨身碟開機, 依螢幕指示, 輸入帳號等資訊, 然後要設定二個硬碟做成RAID 1(Mirror), 這個部份可以參考以下文章:  https://kifarunix.com/install-ubuntu-24-04-with-uefi-and-software-raid-1/ 。大致上是要先設定二個硬碟為開機碟(boot device), 此時安裝程式會在硬碟上劃分出一個約1GB大小的分區; 然後剩下的空間再分割成一個GPT分區(GPT Partition), 記得要指定為未格式化(unformatted)。然後就可以選取 Create Software RAID (md) 的選項, 將分別位於2個硬碟上的分區組成一個md0的raid 1磁碟並格式化為EXT4格式且mount到/根目錄後, 就可以往後進行將ubuntu server裝到這個目錄。 到這裡還沒完! 重開機後, 檢查RAID 1是否正常運作。記得將開機分區, 由運作中的那個, 複製到另一個去。這樣就完成了! 之後可以拔掉任何一個硬碟, 看可不可以正常開機。 4. Ubuntu server沒有GUI, 所以登入都只有指令列可以使用。但有些工具, 就是需要GUI, 其實GUI還是比較人性化的。可以參考這篇文章:  https://phoenixnap.com/kb/how-to-install-a-gui-on-ubuntu , 大致上來說, 就是先裝一個Display Man...

實體主機轉成虛擬機器後, 原網路卡被隱藏並佔用了之前指定的固定IP (考古文)

圖片
 將老舊的Windows 2003實體主機, 利用VMWare Converter轉成虛擬機器後, 因原主機為固定ip; 打開虛擬機器後, 網路卡變成VMWare的虛擬網卡, 而且自動設為DHCP, 我就將它改為原來的固定ip。結果Windows 2003跑出訊息說這個ip和隱藏的Broadcom NetXtreme GigabitEthernet網卡的ip相同, 可能會造成問題, 要不要改設另一個ip?  我才了解到, 原來Converter會將原來實體網路卡隱藏起來, 並給一張新的虛擬網卡, 而且預設為DHCP。這樣當我將新的虛擬網卡設成原來固定IP時, 二張網卡的IP就會相衝突。合理的解決是將那張隱藏實體網路卡移除。2012年8月的社群討論  Hidden Network Card configurations (Spiceworks Community)  就已經有這個問題的解法。 因為原文是單純文字描述解法, 我將其實際操作畫面附上, 可以更快了解其意: 大意如下: 1. 打開命令提示字元視窗 2. 打指令: set devmgr_show_nonpresent_devices=1 3. 打指令: Start DEVMGMT.MSC 4. 出現裝置管理員, 選'檢視'-> '顯示隱藏裝置'; 然後展開'網路介面卡', 就會看到如上圖的多張隱藏網卡, 選取要移除的, 按右鍵, 選'解除安裝'即可。 -------------------------------------------------------------------

sendmail routing: virtusertable, mailertable, smarttable

圖片
 公司老闆對信件的管制都會有一些要求, sendmail的routing機制, 其實都可以應付的來, 其中3個主要設定表格應該就可以處理大部份狀況: virtusertable, mailertable, smarttable, 分別討論如下。 1. virtusertable   這個表格原本用來做主機代管, 一台主機要host 10家公司(網域)的email, 必然會收到10個不同網域的信件, 但實際上這主機的名稱只有一個; 這時, 就用這個表格來將對應虛擬email address到實際的位址。例如: sales@example.com            jill info@book.org                    sara@writer.com 2. mailertable  這個表格用來決定特定收件者網域的信要用什麼協定轉寄到那台主機(或網域), 它不管寄信者是誰。所以如果你想要設定的規則是"由誰寄來的都如何....", 那麼這個表格無法處理。它可以處理的是"寄到某網域的信都轉到那裡..."這樣的要求, 例如: book.org                  smtp:writer.com 這樣的設定, 會將要寄到book.org這個網域的信都轉寄到writer.com這個網域, 而且改用smtp這個協定來傳送, 現在一般都使用esmtp這個比較新的協定, 如果有比較老舊的主機無法處理新的協定, 利用這個mailertable, 也是一個方式。 writer.com               local:pat 這個設定可以將所有要寄到writer.com網域的信, 都轉寄給本機上的pat這個使用者。  writer.net                 esmtp:[192.16...

pca10059 (nRF52840 Dongle) + circuitPython + micro SD card 讀取或寫入資料

圖片
 有些時候,我們的IoT裝置並不連網,又或者我們就是想存些資料在micro SD卡上。在nRF52840 Dongle上,實現這個要求,搭配circuitPython的情況下,只要加裝一片SD Card模組和撰寫少許程式就可以完成。 我使用這個模組,這應該是市面上最常見也最便宜的micro SD card模組了,大約NT$40-50.  nRF52840 Dongle就長得如上圖,硬體接線的話要使用到總共6條線,我選擇使用Dongle(以上圖來看)下方的6個接腳(由左到右分別是:1.15, 0.02, 0.29, 0.31, GND, VDO OUT): micro SD card module         nRF52840 Dongle ------------------       ---------------- CS                                    1.15 MISO                                0.02 MOSI                                0.29 SCK                                 0.31 GND                    ...

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. 針對這個服務帳戶, 建立金鑰, 並...