2024年2月29日 星期四

泰國之旅 (一) 0228

泰國行程第一天, 我早上打給中華客服申請 20GB 三十日行動數據漫遊方案 (688 元), 也可以用中華電信 App 線上申請 :




中午姊姊叫了 Uber 到小港機場搭 Air Asia 航空班機到泰國廊曼機場 (此為曼谷廉航與國內線機場, 與松山機場類似), 14:45 起飛, 當地時間 17:20 到達 (台灣時間 18:20), 飛行時間約 4.5 小時. 


高雄小港

泰國廊曼

首先搭計程車去市區的是隆中心酒店 (Centre Point), 但下車時我卻算錯錢給計程車司機 (車資 350 泰銖), 因為車內昏暗, 我把皮夾中的美金 50 元紙幣誤當泰銖 50 元紙鈔後就匆忙下車去大廳 checkin 了, 等行李於房間安頓妥當準備要出發搭渡輪去換泰銖時, 怎麼皮夾中只有 3 張 50 元美鈔時, 才發現這個烏龍, 趕緊打電話給司機, 但語言不通, 只好拜託大廳經理 Alex Pachara 幫忙聽電話翻譯, 司機說他已下班回到距離飯店很遠的家, 但他明天經過這裡時會把錢拿過來, 為了表示謝意, 我拿了 1000 元泰銖給經理, 麻煩他明日司機來時轉交, 然後抱著懊悔的心去搭渡輪到觀光夜市換泰銖. 

這條流經曼谷市區的河為昭披耶河, 河上有許多艘裝飾著絢麗燈光的觀光船, 船上有音樂美食好不熱鬧 : 




兌換泰銖的地方位於河濱夜市 Asiatique 內, 裡面有摩天輪, 從河上看非常漂亮, 參考 :

【曼谷】河濱碼頭夜市Asiatique the Riverfront交通必買全整理

此旅館房間陽台可看到河, 夜景非常美麗 : 




2024-02-29 補充 :

早上起來在是隆中心酒店 (1720) 陽台補拍白天視野 : 




早上 10 點要出去吃早餐時經過大廳, 女經理趕忙叫住我們, 原來司機先生早上就趕過來把美金還給我, 經理也已將我委託的 1000 元泰銖交給他, 接受我的道謝後司機又趕著去開車了. 原本一直擔心的菁菁終於眉開眼笑, 說我就不會因為粗心而覺得愧疚了, 昨天去摩天輪那邊換泰銖時還挽起我的手, 說要想要匯那筆錢給我, 哈哈, 

參考 : 

# 【曼谷一日遊】到泰國旅遊,小費該給多少?

2024年2月28日 星期三

書籤備份 2024-02-27

LG Gram Chrome : 
LG Gram Edge : 
  1. Prompting 的邪魔歪道 (卓騰科技 Peter 演講簡報)
  2. https://github.com/miniricer/transformer-course-example (呂道誠老師 NLP 教學資料) 
  3. Scratch AI 人工智慧程式設計教學影像辨識專題實作 (茶米老師暨南大學教學簡報)
  4. https://creator.line.me/zh-hant/  
  5. https://drive.google.com/drive/folders/1XnJ88mzaVnCrA-p8bzqdDH2Fo_jkPhQg (陳文舟老師每個人都有 AI 聊天機器人上課補充資料 : AI 女友)
Acer Swift  5 筆電 Chrome :

好站 : 滑鼠醒目提示指標免費工具

今天在整理 Edge 書籤時發現之前搜尋到的一個關於設定滑鼠醒目提示的線上教學影片 :





我當時是因為 Windows 預設的白色滑鼠指標不明顯, 想將指標底色改成黃色才搜尋到此教學, 照做果然有效, 故記下來備查. 

好書 : 最強 AI 投資分析

我在去年底於 momo 買了這本旗標出版的好書 (旗標品質 No.1) :





但一季過去我只看了前兩章, 因為書中許多重要基礎 (例如 OpenAI API) 我還在打底摸索 (笨鳥慢飛), 必須一步步來. 前陣子此書編輯有在某線上教學頻道介紹此書 (但我有事錯過了), 所幸他們有錄影上傳 YT (上課錄影是好習慣) : 




2024年2月26日 星期一

0228~0303 泰國行

2020 年初水某有一次要去泰國開會, 姊姊與菁菁一直想趁機會去泰國玩, 機票都訂好了, 哪知那年春節後疫情大爆發, 只好取消行程. 這次 228 沒有連假, 我請了周四周五兩天假連起來 5 天陪她們去逛逛. 上週五我到台銀用 2819 元兌換了 3000 泰銖 (匯率 0.9397), 姊姊說到泰國再兌換較划算. 

姊姊的泰國行程規劃 : 

2/28 (三)  
17:30抵達廊曼 >> 是隆中央酒店
________________________________________
1.搭乘LimoBus廊曼>是隆路的快捷巴士
2.飯店接送  booking$680 / kkday$667

換匯:
1.SJR MONEY EXCHANGE(開到22:30) SJR MONEY EXCHANGE
從Sathorn搭乘船班到Wat Rat Singkhon的Asiatique
2.super rich 換錢 (9:00)  Superrichสีลม คอนเทนต์คีปเปอร์ เทคโนโลยี (ประเทศไทย) จำกัด

晚餐:
新記燒鴨(到20:00)
王子戲院豬肉粥
TROK SUNG 唂孙豬腳飯 ขาหมูตรอกซุงบางรัก


2/29(四) 
金湯普生博物館 >> Baac曼谷藝術中心 >> Siam商圈 >> 四面佛(19:00-21:00) >> 建興酒家
________________________________________
皆搭乘BTS KKday
曼谷王權 Mahanakhon SkyWalk 觀景台 KKday
guss damn good 冰淇淋
建興酒家(surawong分店)  Somboon Seafood 
Supanniga Eating Room  Supanniga Eating Room, Sathorn
四面佛如何參拜 


3/1(五) 
鄭王廟(泰服) >> 美功鐵路 >> 安帕瓦水上市場 >> 吞武里海鮮市場 >> iconsiam 薩通雅詩閣飯店
________________________________________
退房前往薩通雅詩閣飯店Ascott Sathorn Bangkok
包車: 掏朗泰 $2864 / KKday行程 
如何到泰服一條街::搭乘 BTS 至 Saphan Taksin(S6)站 2 號出口下,再直行到中央碼頭去搭船至 N8-THA TIEN 碼頭出來就到了鄭王廟,走出鄭王廟後門,即可抵達泰服一條街。
搭船一律找橘色旗
美功鐵路 火車出站時間:11:30、15:30 火車進站時間:11:10、14:30、17:40


3/2 (六) 
 曼谷王權觀景台 >> 恰圖恰市集 >> 
________________________________________


3/3 (日) 
9:40DMK >> 14:25回家面對現實 
________________________________________

備註
1.BTS比較建議買兔子卡,MRT現在VISA信用卡可以直接刷進站
2.按摩推薦:
  Health Land Sathon


2024-02-27 補充 :

惡補一下泰國自由行相關資訊 :
  1. 泰國插座與台灣相同, 不用帶轉接頭, 插座電壓是 220V, 手機, 電腦, 電鬍刀等 3C 充電頭 110V/220V 兩用可直接插上充電, 其他電器插之前要看一下耐壓多少.
  2. 泰國宣佈 2023/11/10-2024/5/10 開放台灣人免簽入境泰國 (可停留 30 天),只要準備好抵達泰國後 30 天內的回程機票及護照即可入境. 
  3. 泰國與台灣時差 1 小時.
  4. 到佛教廟宇參拜不可穿無袖上衣或短褲短裙. 廟宇不要亂拜. 女性勿靠近或碰觸僧侶. 
  5. 不可褻瀆泰國王室 (例如對國王肖像與旗幟不敬或出言批評王室等).
  6. 接受服務 (例如按摩或提行李) 要給小費, 要紙鈔勿用銅板. 
  7. 看到可愛小孩勿摸頭 (禁忌).
  8. 給錢或握手不可用左手, 要用右手或雙手 (右手為尊). 
  9. 入境泰國旅行須攜帶 2 萬元泰銖以上或等值貨幣 (家庭 4 萬元), 會隨機抽查. 但從泰國出境時不能攜帶超過 5 萬元泰銖. 攜帶任何外幣入出境泰國總額超過兩萬美元必需申報.
  10. 不攜帶超過等值 2 萬元泰銖的免稅品 (自用的筆電, 相機, 手錶屬於非免稅品) 可通行綠色免申報通道入境直接通關, 海關人員不會一一檢驗每位旅客行李 (但可能抽檢). 
  11. 下列物品是限制物品, 必須經過核淮並且申報後可帶入境泰國 (須走紅色通道通關並出示物品給海關人員檢查估價繳交稅金) :
    藥物及副食品, 化粧品, 植物, 動物, 槍, 空拍機
參考 :


從台灣到泰國跟到日本東京直線距離差不多 : 




第一天住交通方便, 四星級的是隆中央酒店 :





待購書籍 (旗標自造者工作坊)

旗標出了一系列自造者工作坊實作書 (含套件), 是學習物聯網的好教材, 使用的語言有 Arduino, Javascript, 或 Python/MicroPython, 其中與 MicroPython 有關的如下 : 


這四套等有特價時再來買. 

2024年2月25日 星期日

2024 年第 8 周記事

跨年似乎還是昨日記憶, 2024 居然已過了兩個月, 歲月如梭的描述很保守, 人生其實是以光速在前進. 年假後的第一周幹完工作上一件收尾的重要工程作業, 基本上此後應該就西線無戰事了, 因為去年都已忙透, 也沒甚麼機會可表現. 機器順利運轉我也可以好整以暇研究 AI. 

過年前因為測試 Line Bot 之故再次使用 Flask, 覺得還蠻好用的, 架構簡單容易上手, 所以本周先擱下 OpenAI API 測試, 把 Flask 筆記寫完再說, 或許打鐵趁入把 gradio 筆記也清完, 看過測過寫過, 這樣心裡感覺踏實些. 

本周 NLP 內訓課程從周四開始上第一課了, 上週的線上考試我沒參加, 我只要旁聽直播即可, 隔週會上一次課, 下周 228 後要請兩天假去泰國玩, 剛好沒課真是太好了, 否則我得利用遠端桌面遙控家中電腦報到錄影.  

偶然機會在臉書看到有人貼了韓劇 "閃亮的西瓜", 回家在 Friday 有找到, 這是一個 16 集的穿越劇 (我的最愛), 前兩集看起來沒甚麼, 但後面越來越精彩. 兩個女主角薛仁雅申銀秀演技真不錯, 特別是薛仁雅, 她在大力女子都奉順裡表現平平, 但在此劇非常亮眼. 

今年掃墓是 3/17 日, 阿蘭做對年是 3/28 日, 前幾天爸打電話給榮發舅媽問訂牲禮事宜時聽她說好像掃墓要在對年之前還是後甚麼的, 今天去觀音廟時恰巧遇到師姐, 我趕緊抓住機會請教她, 原來新墳須在國曆 3/15 天赦日前掃墓, 我回來翻農民曆決定 3/9 (週六) 先給阿蘭掃墓. 做完對年可請老師看日子辦添罐, 將阿蘭骨灰罐移回家族墓園, 但師姐說日子決定後必須前幾天通知她, 因為這是看時辰的她需要到場協助 (今天剛好就有一家在辦添罐出塔). 

去年底得知 Note20 是三星最後一代 Note 手機後就有想要換手機, 但後來覺得可否插卡其實不重要, 所以我等 S24U 於本月上市後買降價的 S23U, 昨天看到 momo 的 S23U 來到 33900 低點, 差一點手刀要下去了, 考量去泰國前換手機太匆促就停手了, 想想 Note8 還堪用, 何不等明年買 S24U 呢? 反正清一清 Line, 刪除一些 App 還是很好用的. 

週六下午去 Nissan 做 ㄒQRV 13 萬公里保養, 含汽車清潔消毒美容共 5956 元. 下回要預約回廠換發電機 (約 6000 元), 電池 (約 3000 元), 與 4 支火星塞 (約 2000 元). 

市圖還書 1 本 : 台股研究室

本周市圖還書一本 : 



Source : 博客來


此書為淡江大學葉怡成教授從學術面以離線資料回測 36  種投資模型績效的報告, 包含單因子, 雙因子與多因子等模型評估投資績效, 目標是達成年化報酬率 15%. 結論建議三原則 :

一. 採用三因子選股模型 :
  1. 股東權益報酬率選大 (權重 50%)
  2. 股價淨值比選小 (權重 25%)
  3. 前期季報酬率選大 (權重 25%)
二. 快穩準操作方式 :
  1. 財報公布後盡快選股並建立持股
  2. 個股權重採等權分布 (考慮流動性)
  3. 全部 20 支大型股 10 支
 三. 長期投資
  1. 至少 3 年每季更新持股
  2. 多元分散投資 10~20 支股票
投資必須透過常戰 (長期持續投資) 與多戰 (多元分散投資) 才能達到長期必勝目標. 

2024年2月24日 星期六

好站 : 高科大翻轉科技工作坊活動錄影

去年偶然機會裡得知母校 AI 金融中心舉辦的翻轉科技工作坊, 我幾乎每次都有參加, 在量化投資
知識上收穫蠻多的, 但上完沒實作幾乎都忘了, 所幸主辦單位有將錄影放在 YT 讓學員能複習, YT 頻道如下 (AIGO) :


我將歷次網址分列如下以利點閱 :


其中林萍珍與劉承彥老師的主題與量化交易相關, 含金量很高, 值得回看並實操一遍. 劉承彥老師在 Tibame 也有開課, 參考 :


高科大還書 1 本 : 深度學習的16堂課

因為預約的 "非監督式學習-使用 Python" 已到館, 昨天下班拿下面這本書去換 :


這本我只剩後面 GAN 還沒看完, 有時間讀時再回借.

2024年2月23日 星期五

如何檢查樹莓派是否有安裝網頁伺服器

昨天晚上想要查看放在高雄家鋼琴上的 Pi 3 裡面是否有安裝 Apache 伺服器, 用瀏覽器連線它的固定網址 192.168.2.193 卻無法連線, 印象中似乎有安裝過 Apache + WordPress 啊! 要怎麼檢查是否安裝過 Apache 呢? 我找到下面這篇文章 : 


首先可用 netsta -tlup 指令檢查網路連線 : 

pi@raspberrypi:~ $ netstat -tlnp   
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp6       0      0 ::1:631                 :::*                    LISTEN      -                   
tcp6       0      0 :::5900                 :::*                    LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   

有 127.0.0.1 應該就是有安裝. 但具體是甚麼伺服器則可要檢查啟用的 service :

pi@raspberrypi:~ $ sudo service --status-all   
 [ - ]  alsa-utils
 [ - ]  apache-htcacheclean
 [ - ]  apache2
 [ - ]  apparmor
 [ + ]  avahi-daemon
 [ - ]  bluetooth
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  cups
 [ - ]  cups-browsed
 [ + ]  dbus
 [ + ]  dhcpcd
 [ + ]  dphys-swapfile
 [ + ]  fake-hwclock
 [ - ]  fio
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  lightdm
 [ - ]  mysql
 [ - ]  networking
 [ - ]  nfs-common
 [ - ]  paxctld
 [ - ]  plymouth
 [ - ]  plymouth-log
 [ + ]  procps
 [ + ]  raspi-config
 [ ? ]  rng-tools
 [ - ]  rpcbind
 [ - ]  rsync
 [ + ]  rsyslog
 [ - ]  saned
 [ + ]  ssh
 [ - ]  sudo
 [ + ]  triggerhappy
 [ + ]  udev
 [ - ]  x11-common

果然有 Apache2, 接著檢視 Apache2 的目錄 : 

pi@raspberrypi:~ $ sudo ls -ls /etc/apache2   
總計 80
 8 -rw-r--r-- 1 root root  7260  5月 20  2021 apache2.conf
 4 drwxr-xr-x 2 root root  4096  5月 20  2021 conf-available
 4 drwxr-xr-x 2 root root  4096  5月 20  2021 conf-enabled
 4 -rw-r--r-- 1 root root  1782  8月  8  2020 envvars
32 -rw-r--r-- 1 root root 31063  8月  8  2020 magic
12 drwxr-xr-x 2 root root 12288  5月 20  2021 mods-available
 4 drwxr-xr-x 2 root root  4096  5月 20  2021 mods-enabled
 4 -rw-r--r-- 1 root root   320  8月  8  2020 ports.conf
 4 drwxr-xr-x 2 root root  4096  5月 20  2021 sites-available
 4 drwxr-xr-x 2 root root  4096  5月 20  2021 sites-enabled

沒錯啦, 這就確定已經有安裝 Apache2 了. 下一步是安裝 WordPress. 

牛鬼蛇人-谷正文情報工作檔案

去年底從圖書館借到一本前軍統特務谷正文於 1997 年出版的回憶錄 "牛鬼蛇人-谷正文情報工作檔案", 原本想把這本書當成寫程式之餘的消遣, 但部份章節實在太勁爆, 我一口氣熬夜看完了, 昨天這本書到期, 就記了一些筆記還了. 




谷正文本名郭守紀, 他的前半生角色多變, 原本是共產黨員, 曾經在林彪轄下的中國工農紅軍效力, 後來又在汪精衛政府當日本爪牙. 日本投降後加入國府軍委會的軍統局, 頗受特務頭子戴笠賞識, 派他出任北平特勤組組長. 1949 年來台後任職軍情局前身保密局督察室主任, 陸續破獲鍾皓東, 蔡孝乾, 吳石等共諜案與鹿窟事件等, 是白色恐怖的執行者. 

# 此處不留爺, 自有留爺處, 處處不留爺, 老子幹八路

谷認為 1945 年日本投降後, 國共局勢會在五年內逆轉, 時任參謀總長陳誠提出的大規模軍人編遣復員計畫是關鍵因素之一. 他認為 "歷史上任何朝代的軍人, 突然由軍隊裡被編遣返鄉, 鮮少成為良民". 失業的軍人無處可去, 只能投入共產黨, 所以才有了上面的順口溜. 

# 老蔣不聽勸, 致鐵路被共軍破壞, 阻礙國府軍隊接收

抗日勝利後, 閻錫山曾建議蔣介石善用尚未遣返之日軍鐵道部隊, 使其繼續維護鐵路, 因閻在抗戰期間與八路軍同屬第二戰區, 對共產黨破壞鐵路阻礙敵軍之戰術知之甚詳, 可惜老蔣未採納, 導致國軍接收速度緩慢. 

# 國府財政部長孔祥熙的最高顧問冀朝鼎是共產黨

孔祥熙是蔣介石的連襟, 宋美齡的姊夫, 國府行政院長兼財政部長, 他的最高顧問冀朝鼎是共產黨員, 冀朝鼎也是谷正文的山西同鄉, 谷正文曾到山西調查確認其身分, 並向上級舉報此事, 但報告石沉大海. 冀朝鼎是留美雙博士 (芝加哥大學法學博士 + 哥倫比亞大學經濟學博士), 他替孔祥熙制定的經濟政策目的是要擾亂金融秩序 (他主持了金圓券的發行), 導致嚴重通貨膨脹, 這是幫助共產黨奪權的經濟戰一環. 谷正文自認在情報能力上不輸共產黨, 感嘆國民黨最終失敗是因為官僚的糊塗與自私所致, 他對國民黨的頹勢感到徬徨, 擔心一旦失敗便是死路一條, 卻沒想到竟然還能守住台灣. 

# 周雨寰夫人開槍事件秘辛

蔣介石當年為了反攻大陸創建了海軍陸戰隊, 首任陸戰隊司令是身材魁梧的周雨寰, 副司令是于豪章, 參謀長是鄭為元, 都是老蔣提拔的軍中菁英. 三家人在左營明德新村比鄰而居, 三人私交甚篤, 但他們的夫人卻水火不容, 其中周雨寰夫人尤為刁蠻. 後來周雨寰被診斷出肝癌, 被蔣介石送往美國救治, 但卻因癌細胞已擴散全身無法手術而客死他鄉, 崩潰的周夫人認為是于鄭兩人忌妒周受寵而害死周, 兩人在周家被盧了整晚, 要回家時周夫人拿手槍朝兩人開槍, 于豪章腿部被擊中兩槍, 釀出了大事端. 周夫人被老蔣下令監管, 後來竟與監管她的保密局少校有私情而懷孕, 拜託谷正文讓她墮胎, 谷不許, 最後讓她子女接回去, 打傷于豪章的事件老蔣也沒指示後續如何處理, 最後竟不了了之 (于豪章後來當上陸軍總司令, 卻在搭直升機視察部隊時墜機于楊梅農田中, 摔成半身不遂).  

# 桃園八德葉家滅門血案秘辛

民國 45 年在桃園八德發生一件滅門血案, 苦主葉震是胡宗南的大舅子, 軍統局時期是戴笠的帳房, 受害的是他的大小老婆, 兩名子女與一名傭人共五人. 苦主葉震任職特務機關, 顯然不是件簡單的刑案. 谷正文書裡說保密局長毛人鳳叫他去查查是不是有共產黨在搞怪. 谷從勒人方式覺得很像是華北土匪的手法, 從現場遺留的軍靴查到一個北方兵秦同餘, 但秦卻被刑警總隊刑求致死. 後來警方抓到流氓穆萬森與其同夥, 穆被以劫財殺人判處死刑, 但上訴時皆一口咬定警方刑求, 幾經折騰最終獲判無罪, 變成了懸案. 此案我很早以前就看過管仁健寫過, 參考 :


負責偵辦此案的刑警總隊長李葆初是軍統出身, 他到現場一看就知道是自己人幹的, 主要特徵是被殺的女童與傭人等處女均被勒斃, 而葉震的大小老婆與兒子則被刀械鈍器所殺. 這是老蔣特務滅門的標準手法 (處女不見血忌諱, 與老蔣之前叫軍統特務殺西北軍楊虎城全家時手法如出一轍). 苦主葉震在案發後三天即火速將受難家人全部火化, 然後跑到香港躲起來, 完全不管案子查到哪裡了, 這不是很奇怪嗎? 李葆初都看出是特務幹的, 難道谷正文這個軍統老特務會看不出來? 更奇怪的是, 此案發生於 45 年 12 月 12 日清晨六時, 而毛人鳳則於前一天 12 月 11 日晚上因 "心臟病" 死亡, 而書裡面谷正文卻說毛人鳳叫他去查查葉家血案? 這是鬼魂在交辦任務? 所以這案子不是破不了, 而是不能破. 谷正文在寫這部分時只說變成懸案似乎不太老實啊. 證諸毛人鳳曾企圖綁架小蔣的這段恩怨, 以及葉震私吞了戴笠的小金庫 ... 這內情令人不寒而慄. (人臣永遠要記得 : 家犬就是再忠誠也比不上小犬). 

通常回憶錄大抵不脫塗粉美化, 掩過飾非居多, 這本回憶錄我覺得也差不多是這樣, 故其虛實就姑妄聽之.  

參考 : 


2024年2月22日 星期四

三星 S23U 與 S24U 比較

上個月三星推出 S24 系列 AI 手機, 讓我又動了換手機念頭 (我的 Note8 自 2018 年 9 月起已 5 年半了), 我的原則是絕不嚐新 (有踩雷及當冤大頭風險), 買前一代 CP 值較高. 但 S24 標榜 AI 又讓我有點心動, 所以上網找達人的評測 : 





摘要 : 照相部分各有千秋, 但 S24 螢幕較不反光倒是很明顯. S24 的 AI 功能三星表示會在 2024 上半年推送至 S23 機種. S23 之前的機種可以考慮換 S24, 但 S23 用戶應該不需要. 






摘要 : S24U 三星保證 7 年更新, 但綜合比較認為 S23U CP 值較高. 

我到 momo 查價, 以 512GB ROM 來說, S23U 約 34K, S24U 約 48K, 差價 14000 元 (256GB 也差不多), 256GB 與 512GB 差價約 4000 元左右 (卡好, 現在買一支頂級手機就跟買一台 LG Gram 筆電一樣) : 


有人認為 256GB 就夠不用買 512GB, 可以存雲端, 但我覺得照片放雲端不保險, 影片放雲端網速要夠, 且雲端租金也是成本, 加上 App 不知不覺越裝越多 256GB 很快就吃到剩下個位數, 應該直上 512GB. 

2024-02-24 補充 :

2/29 日前 512GB momo 特價再降 500 => 33900. (上市價直降 11000)

S23 系列機種均採用 Android 13 系統以及 One UI 5.1 介面, 三星並提供 5 年的安全性更新以及 4 版 Android 系統的免費更新服務 (S24 則是 7 年更新).


** 今天差點衝動買下去 (S23U), 但幾經思考, 不如明年買 S24U 好了. 

2024年2月21日 星期三

樂天購買補體素倍力一箱

小舅媽年初四去做第二次化療, 我想再買倍力給她喝補充體力, 今天上樂天賣場發現年前那個賣家庫瑪已經下架此商品, 故轉而向另一家專品藥局購買 :


因上回有回饋點數 32 元, 所以 Line Pay 實付 3199 元.

在樹莓派 Nginx 伺服器上佈署 Django 專案

今天在整理筆記時找到這篇 2019 年底寫的文章, 看起來有發布過, 不知為何又被改回草稿, 看完後覺得具有參考價值, 所以重新發布 : 

[2019-09-11] 

這幾天重回睽違一季的 Django 學習軌道, 雖然感覺有點陌生, 不過複習之前的三篇測試紀錄之後很快就恢復戰力了 :
  1. 在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器
  2. 在樹莓派 Nginx 伺服器上執行 Python 網頁應用程式
  3. Python 學習筆記 : Django 2 測試 (一) : 請求與回應處理
第三篇的 Django 2 測試 (一) 是在 Win 10 上進行的, 以下實驗則是在樹莓派 Pi 3 上進行.


1. 安裝或更新 Django :

因為之前安裝的 Django 版本可能有點舊了, 所以在重新測試之前先用 pip3 install django 指令升版, 在後面加上 -U 參數可更新到最新版 :

pi@raspberrypi:~ $ pip3 install django -U 
Collecting Django
  Using cached https://files.pythonhosted.org/packages/39/b0/2138c31bf13e17afc32277239da53e9dfcce27bac8cb68cf1c0123f1fdf5/Django-2.2.3-py3-none-any.whl
Collecting sqlparse (from Django)
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from Django)
  Using cached https://files.pythonhosted.org/packages/3d/73/fe30c2daaaa0713420d0382b16fbb761409f532c56bdcc514bf7b6262bb6/pytz-2019.1-py2.py3-none-any.whl
Installing collected packages: sqlparse, pytz, Django
Successfully installed Django-2.2.3 pytz-2019.1 sqlparse-0.3.0
pi@raspberrypi:~ $ python3 -m django --version 
2.2.3 

可見 Django 目前最新版為 v2.2.3, 有兩個相依套件 sqlparse  與 pytz.


2. 在 Nginx 虛擬目錄下建立 Djando 網站 :

我的目標是在樹莓派上以 Nginx 作為 HTTP 伺服器佈署 Django 專案, Nginx 伺服器的操作指令整理如下表 :

 Nginx 伺服器操作指令 說明
 nginx -s start 啟動伺服器
 nginx -s stop 停止伺服器
 nginx -t 檢視伺服器狀態
 nginx -s reload 重啟伺服器

Nginx 伺服器的所有站台設定檔放在 /etc/nginx/sites-enabled/ 目錄下, 預設站台設定檔為 default, 其預設根目錄絕對路徑為 /var/www/html, 預設監聽埠號為 80 埠. 安裝好 Nginx 後在瀏覽器中開啟 localhost 或 127.0.0.1 或我為樹莓派指定之固定 IP 192.168.2.192 都會看到一個 Nginx 的歡迎網頁.

我們可以直接在 /var/www/html 下佈署 Web 專案, 但為了保留 Nginx 預設站台之歡迎網頁 (作為測試 Nginx 有否開啟用), 我在前次的 "在樹莓派 Raspbian Stretch 上安裝 Nginx 伺服器" 這篇裡面已於 /var/www/ 下建立一個子目錄 test, 除了將 /var/www/test 設定為虛擬目錄外, 還進一步將此虛擬目錄設定成一個虛擬站台 test.com, 亦即若在 /var/www/test 下佈署 Django 專案的話, 可以用 localhost/test/mysite 或 test.com/mysite 去瀏覽網頁.

OK, 這樣就可以在 /var/www/test 底下建立一個 Django 網站了, 但是一出手就不太順, 直接以 Windows 下所用的 django-admin startproject mysite 指令建立網頁專案時就出現 "Command not found" 錯誤 :

pi@raspberrypi:~ $ cd /var/www/test 
pi@raspberrypi:/var/www/test $ django-admin startproject  mysite 
bash: django-admin:命令找不到  

經查詢才知道原來在 Linux 底下還要幫所安裝的 Django 套件在 /usr/local/bin 底下建立連結, 才能在任何目錄下執行其管理指令, Windows 因為在安裝 Python 時已把 Scripts 放在環境變數裡, 因此可以馬上執行所安裝的套件, 參考 :

Command not found: django-admin.py
-bash: django-admin: command not found

用 pip3 show 檢視 Django 安裝位置 :

pi@raspberrypi:~ $ pip3 show django 
Name: Django
Version: 2.2.3 
Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author: Django Software Foundation
Author-email: foundation@djangoproject.com
License: BSD
Location: /home/pi/.local/lib/python3.5/site-packages
Requires: sqlparse, pytz

可見 Django 被安裝在 /home/pi/.local/lib/python3.5/site-packages 底下, 用 ls 指令檢視 djando 子目錄 :

pi@raspberrypi:/var/www/test $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django
總計 84
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 apps
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 bin 
4 drwxr-xr-x  7 pi pi 4096  4月  9 00:37 conf
4 drwxr-xr-x 18 pi pi 4096  4月  9 00:37 contrib
4 drwxr-xr-x 11 pi pi 4096  4月  9 00:37 core
4 drwxr-xr-x  6 pi pi 4096  4月  9 00:37 db
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 dispatch
4 drwxr-xr-x  5 pi pi 4096  4月  9 00:37 forms
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 http
4 -rw-r--r--  1 pi pi  799  7月 31 08:30 __init__.py
4 -rw-r--r--  1 pi pi  211  7月 31 08:30 __main__.py
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 middleware
4 drwxr-xr-x  2 pi pi 4096  4月  9 00:37 __pycache__
8 -rw-r--r--  1 pi pi 5588  7月 31 08:30 shortcuts.py
4 drwxr-xr-x  5 pi pi 4096  4月  9 00:37 template
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 templatetags
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 test
4 drwxr-xr-x  3 pi pi 4096  4月  9 00:37 urls
4 drwxr-xr-x  4 pi pi 4096  4月  9 00:37 utils
4 drwxr-xr-x  6 pi pi 4096  4月  9 00:37 views

Django 的工具程式 django-admin 則是放在 bin 子目錄下 :

pi@raspberrypi:~ $ ls -ls /home/pi/.local/lib/python3.5/site-packages/django/bin  
總計 8
4 -rwxr-xr-x 1 pi pi  128  7月 30 16:45 django-admin.py    
4 drwxr-xr-x 2 pi pi 4096  4月  9 00:37 __pycache__

所以必須為此 django-admin.py 在 /usr/local/bin 底下建立連結才能在任何目錄下執行此程式 :

sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin

在建立連結之前先檢查 /usr/local/bin :

pi@raspberrypi:/var/www/test $ ls -ls /usr/local/bin 
總計 976
  4 -rwxrwxr-x 1 root staff     70  4月  6 15:49 checkwifi.sh
972 -rwxr-xr-x 1 root staff 992484  4月  5 10:58 uwsgi

目前只有之前回報 IP 檢查 WiFi 連線用的 shell 程式 checkwifi.sh 與所安裝的 uwsgi 而已. 執行建立 django-admin.py 連結之指令 :

pi@raspberrypi:/var/www/test $ sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin 
pi@raspberrypi:/var/www/test $ ls -ls /usr/local/bin 
總計 980
  4 -rwxrwxr-x 1 root staff     70  4月  6 15:49 checkwifi.sh   
  4 lrwxrwxrwx 1 root staff     70  7月 31 11:45 django-admin.py -> /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py 
972 -rwxr-xr-x 1 root staff 992484  4月  5 10:58 uwsgi

可見連結已建立, 但在 /var/www/test 底下用 django-admin.py 指令建立一個網站 mysite 時卻還是失敗, 但這回出現的是 "No module named django.core" 的錯誤訊息 :

pi@raspberrypi:/var/www/test $ django-admin.py startproject mysite 
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, <module>
    from django.core import management
ImportError: No module named django.core 

即使在 /home/pi 底下也是一樣 : 

pi@raspberrypi:~ $ django-admin.py startproject mysite    
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, in <module>
    from django.core import management
ImportError: No module named django.core   

經爬文研究在下面這篇文章發現可能是 Python 版本的關係, 參考 : 


因為 Rasbian 預設 python 指令是 v2.7 版, 而我的 Django 等套件都是安裝在 Python 3 底, 所以我之前在安裝完 Rasbian 後有用 alias 指令將 Python 3.5 版指令取 python3 的別名, 但執行 django-admin.py 時卻會預設執行 Python 2.7, 導致找不到 django.core 模組. 

依照其建議應移除 /usr/bin/python 與 Python 2.7 的連結, 再建立 Python 3 與 /usr/bin/python 的連結 :

pi@raspberrypi:~ $ sudo rm -f /usr/bin/python   
pi@raspberrypi:~ $ sudo ln -s /usr/bin/python3 /usr/bin/python       
pi@raspberrypi:~ $ python -V    
Python 3.5.3  
pi@raspberrypi:~ $ which python    
/usr/bin/python   

可見這樣執行 .py 預設就會使用 Python 3 了, 再次於 /home/pi 底下執行 django-admin.py 就成功了, 順利建立了 mysite 網站架構 :  

pi@raspberrypi:~ $ django-admin.py startproject mysite      
pi@raspberrypi:~ $ tree mysite    
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

這時切換到 mysite 底下執行 manage.py 並開啟 8000 運行 Django 本身的開發伺服器 :

pi@raspberrypi:~/mysite $ python manage.py runserver 127.0.0.1:8000 
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

July 31, 2019 - 11:07:19
Django version 2.2.3, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

然後開啟樹莓派的 Chromium 瀏覽器連線 localhost:8000 即顯示 Django 歡迎網頁 :




[31/Jul/2019 11:08:08] "GET / HTTP/1.1" 200 16348
[31/Jul/2019 11:08:08] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[31/Jul/2019 11:08:09] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
[31/Jul/2019 11:08:09] "GET /favicon.ico HTTP/1.1" 404 1972


但是如果在 Nginx 的預設站台 /var/www/html 或上一篇文章中自建的虛擬目錄 /var/www/test 執行 django-admin.py 卻出現  "No module named 'django'" 的錯誤訊息, why

pi@raspberrypi:/var/www/test $ sudo django-admin.py startproject mysite   
Traceback (most recent call last):
  File "/usr/local/bin/django-admin.py", line 2, in <module>
    from django.core import management
ImportError: No module named 'django'    

因為我對 Linux 的設定還不熟, 所以這個問題以後再研究.

總結以上測試, 結論是 :
  1. 要把 Django 安裝目錄下的 django-admin.py 與 /user/local/bin 建立連結 :
    sudo ln -s /home/pi/.local/lib/python3.5/site-packages/django/bin/django-admin.py /usr/local/bin
  2. 要把預設的 python 指令改連結到 Python 3 程式 :
    sudo rm -f /usr/bin/python
    sudo ln -s /usr/bin/python3 /usr/bin/python
只要先完成這兩個動作, 就可以在 /home/pi 下建立 Django 站台 :

django-admin.py startproject mysite


參考 :

使用uWSGI和nginx来设置Django和你的web服务器
树莓派部署django项目
在樹莓派上搭建 Nginx + uWSGI + Django 架構伺服器的過程中所學到的
Django Uwsgi Nginx 實現生產環境部署
Python/WSGI应用快速入门
树莓派:django,uwsgi,nginx安装与设置
三步在樹莓派上部署nginx+uWSGI+flask
Setting up an NGINX web server on a Raspberry Pi
树莓派部署django项目 (一鍵重啟)
树莓派:django,uwsgi,nginx安装与设置
# linux複製指定目錄下的全部檔案到另一個目錄中,linux cp 資料夾
在Raspbian上安裝nginx、PHP、Django與uWSGI
No Module named django.core


2024年2月20日 星期二

Mapleboard MP510-50 測試 (十八) : 註冊 Let's Encrypt 的 SSL/TLS 憑證

申請好網域名稱後, 網站其實只有 HTTP 協定功能, 接下來必須安裝 SSL/TLS 憑證, 這樣網站才會有 HTTPS 加密傳輸功能, 否則瀏覽器連線網站時都會先顯示這是不安全的網站, 雖然按繼續瀏覽還是可以進入網站首頁, 但這樣的存取並不安全. 

以前憑證須要花錢買 (一年大約要 2~3 千元), 且年年要續約, 現在有免費的 Let's Encrypt 可用, 但先決條件是你的網站必須要有一個域名 (domain name), 我過年前便已向 Namecheap 購買了 tony1966.cc 的域名 (10 年 59.8 美元, 每年約 191 元台幣, 如其名真的很便宜), 參考 :


我原先是在下面這本書的 16.3 節看到 Let's Encrypt 的介紹 :

# 活用 django4 建構動態網站的 16 堂課 (博碩, 2023, 何敏煌, 林亮昀) 

不過此書是以 Apache 伺服器為例說明設定方式, 但我用的是 Nginx 伺服器, 所以主要是參考下面兩篇教學文章進行設定 : 



一. 關於 SSL 與 HTTPS 加密傳輸 : 

先摘要整理 SSL 加密憑證的相關知識如下 : 
  1. 傳統的 HTTP 協定是以明碼方式傳遞, 並未將內容加密, 只要用封包探測軟體就能輕易擷取用 HTTP 傳送的機敏內容, 例如帳號密碼, API 的存取密鑰 (access key) 或權杖 (csrf_token) 等, 駭客就能利用這些資訊送出假造的請求來進行網路攻擊或滲透. 
  2. SSL (Secure Soket Layer) 使用非對稱金鑰在後端網站與前端瀏覽器之間建立可信任的 HTTPS 加密傳輸, 當以 HTTPS 連線網站伺服器時, 伺服器主機會提供一把公鑰 (public key) 給瀏覽器, 讓它用來將欲傳送的內容加密, 當伺服器收到這加密過的資料, 就會用與那把公鑰對應的私鑰 (private key) 進行解密來取得原始的資料. 不過, SSL 只是安全性憑證的通稱, 事實上現在使用的是比 SSL 更安全的進階版 : TLS (Tranport Layer Security) .
  3. 但是當瀏覽器連線 HTTPS 網站時收到對方發送的公鑰時, 要如何辨別這把公鑰是真是假? 這時候就需要一個第三方的公正單位來提供信任查詢服務, 這個公正單位稱為憑證中心. 網站管理者如果要提供 HTTPS 安全連線功能, 必須提供網域名稱等資料向憑證中心提出申請, 當驗證通過後會得到一對金鑰並安裝在伺服器主機中並做好設定, 當客戶端提出 HTTPS 請求時伺服器會向其傳送公鑰, 瀏覽器收到後自動向憑證中心查詢此公鑰持有者是否可信任, 若驗證通過才會進行 SSL 加密傳輸. 
  4. 大部分的商用憑證必須付費購買且定期重新驗證, Let's Encrypt 是由 Google, IBM, Cisco 等大企業捐資成立的免費憑證頒發機構 ( CA, Certificate Authority, 憑證中心), 任何擁有網域名稱的主機管理人均可從 Let's Encrypt 獲得可信任的憑證, 替網站啟用 HTTPS (SSL/TLS) 功能. 其頒發的憑證效期為三個月, 亦即每三個月須重新驗證 (可透過程式自動更新憑證). Let's Encrypt 的驗證方式較初階, 憑證申請者 (也就是網站管理者) 必須在伺服器的特定資料夾下放置憑證中心指定之檔案, 以證明申請者擁有網站的管理權限. 參考 :

    https://letsencrypt.org/zh-tw/

二. 使用 Certbot 套件註冊 Let's Encrypt 憑證 : 

Certbot 套件是一個軟體工具, 用來向 Let's Encrypt 註冊憑證並於到期前自動更新, 此軟體由位於美國舊金山的非營利機構電子前沿基金會 (Electronic Frontier Foundation) 設計與維護, 參考


Certbot 同時支援 Apache 與 Nginx 伺服器. 以下是安裝程序 :


1. 更新本機套件索引 : 

用下列指令更新套件索引 :

sudo apt update   

tony1966@LX2438:~$ sudo apt update     
[sudo] tony1966 的密碼: 
下載:1 http://packages.microsoft.com/repos/code stable InRelease [3,589 B]
已有:2 http://deb.mapleboard.org/mp510 jammy InRelease                 
下載:3 http://packages.microsoft.com/repos/code stable/main amd64 Packages [16.2 kB]
下載:4 https://linux.teamviewer.com/deb stable InRelease [11.9 kB]             
已有:5 http://ports.ubuntu.com jammy InRelease                                 
下載:6 http://packages.microsoft.com/repos/code stable/main arm64 Packages [16.4 kB]
下載:7 http://packages.microsoft.com/repos/code stable/main armhf Packages [16.3 kB]
下載:8 http://ports.ubuntu.com jammy-security InRelease [110 kB]
下載:9 http://ports.ubuntu.com jammy-updates InRelease [119 kB]
已有:10 http://ports.ubuntu.com jammy-backports InRelease
下載:11 http://ports.ubuntu.com jammy-updates/main arm64 Packages [1,193 kB]
下載:12 http://ports.ubuntu.com jammy-updates/main armhf Packages [768 kB]
取得 2,254 kB 用了 4s (504 kB/s)                           
正在讀取套件清單... 完成
正在重建相依關係... 完成
正在讀取狀態資料... 完成  
可升級 37 個套件。執行 apt list --upgradable 檢視


2. 安裝 Certbot 套件 : 

指令如下 :

sudo apt install certbot python3-certbot-nginx -y   

tony1966@LX2438:~$ sudo apt install certbot python3-certbot-nginx -y    
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列的額外套件將被安裝:
  python3-acme python3-certbot python3-certifi python3-configargparse python3-configobj python3-icu python3-idna
  python3-josepy python3-openssl python3-parsedatetime python3-requests python3-requests-toolbelt python3-rfc3339
  python3-tz python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
建議套件:
  python-certbot-doc python3-certbot-apache python-acme-doc python-certbot-nginx-doc python-configobj-doc
  python-openssl-doc python3-openssl-dbg python3-socks python-requests-doc
下列【新】套件將會被安裝:
  certbot python3-acme python3-certbot python3-certbot-nginx python3-certifi python3-configargparse python3-configobj
  python3-icu python3-idna python3-josepy python3-openssl python3-parsedatetime python3-requests
  python3-requests-toolbelt python3-rfc3339 python3-tz python3-zope.component python3-zope.event
  python3-zope.hookable python3-zope.interface
升級 0 個,新安裝 20 個,移除 0 個,有 37 個未被升級。
需要下載 1,440 kB 的套件檔。
此操作完成之後,會多佔用 7,316 kB 的磁碟空間。
下載:1 http://ports.ubuntu.com jammy/main arm64 python3-openssl all 21.0.0-1 [45.2 kB]
下載:2 http://ports.ubuntu.com jammy/universe arm64 python3-josepy all 1.10.0-1 [22.0 kB]
下載:3 http://ports.ubuntu.com jammy/main arm64 python3-certifi all 2020.6.20-1 [150 kB]
下載:4 http://ports.ubuntu.com jammy/main arm64 python3-idna all 3.3-1 [49.3 kB]
下載:5 http://ports.ubuntu.com jammy-security/main arm64 python3-requests all 2.25.1+dfsg-2ubuntu0.1 [48.8 kB]
下載:6 http://ports.ubuntu.com jammy/main arm64 python3-requests-toolbelt all 0.9.1-1 [38.0 kB]
下載:7 http://ports.ubuntu.com jammy-updates/main arm64 python3-tz all 2022.1-1ubuntu0.22.04.1 [30.7 kB]
下載:8 http://ports.ubuntu.com jammy/main arm64 python3-rfc3339 all 1.1-3 [7,110 B]
下載:9 http://ports.ubuntu.com jammy-updates/universe arm64 python3-acme all 1.21.0-1ubuntu0.1 [36.4 kB]
下載:10 http://ports.ubuntu.com jammy/universe arm64 python3-configargparse all 1.5.3-1 [26.9 kB]
下載:11 http://ports.ubuntu.com jammy/main arm64 python3-configobj all 5.0.6-5 [34.8 kB]
下載:12 http://ports.ubuntu.com jammy/universe arm64 python3-parsedatetime all 2.6-2 [32.9 kB]
下載:13 http://ports.ubuntu.com jammy/universe arm64 python3-zope.hookable arm64 5.1.0-1build1 [11.4 kB]
下載:14 http://ports.ubuntu.com jammy/main arm64 python3-zope.interface arm64 5.4.0-1build1 [142 kB]
下載:15 http://ports.ubuntu.com jammy/universe arm64 python3-zope.event all 4.4-3 [8,180 B]
下載:16 http://ports.ubuntu.com jammy/universe arm64 python3-zope.component all 4.3.0-3 [38.3 kB]
下載:17 http://ports.ubuntu.com jammy/universe arm64 python3-certbot all 1.21.0-1build1 [175 kB]
下載:18 http://ports.ubuntu.com jammy/universe arm64 certbot all 1.21.0-1build1 [21.3 kB]
下載:19 http://ports.ubuntu.com jammy/universe arm64 python3-certbot-nginx all 1.21.0-1 [35.4 kB]
下載:20 http://ports.ubuntu.com jammy/main arm64 python3-icu arm64 2.8.1-0ubuntu2 [486 kB]
取得 1,440 kB 用了 5s (300 kB/s)      
正在預先設定套件 ...
選取了原先未選的套件 python3-openssl。
(讀取資料庫 ... 目前共安裝了 289364 個檔案和目錄。)
正在準備解包 .../00-python3-openssl_21.0.0-1_all.deb……
解開 python3-openssl (21.0.0-1) 中...
選取了原先未選的套件 python3-josepy。
正在準備解包 .../01-python3-josepy_1.10.0-1_all.deb……
解開 python3-josepy (1.10.0-1) 中...
選取了原先未選的套件 python3-certifi。
正在準備解包 .../02-python3-certifi_2020.6.20-1_all.deb……
解開 python3-certifi (2020.6.20-1) 中...
選取了原先未選的套件 python3-idna。
正在準備解包 .../03-python3-idna_3.3-1_all.deb……
解開 python3-idna (3.3-1) 中...
選取了原先未選的套件 python3-requests。
正在準備解包 .../04-python3-requests_2.25.1+dfsg-2ubuntu0.1_all.deb……
解開 python3-requests (2.25.1+dfsg-2ubuntu0.1) 中...
選取了原先未選的套件 python3-requests-toolbelt。
正在準備解包 .../05-python3-requests-toolbelt_0.9.1-1_all.deb……
解開 python3-requests-toolbelt (0.9.1-1) 中...
選取了原先未選的套件 python3-tz。
正在準備解包 .../06-python3-tz_2022.1-1ubuntu0.22.04.1_all.deb……
解開 python3-tz (2022.1-1ubuntu0.22.04.1) 中...
選取了原先未選的套件 python3-rfc3339。
正在準備解包 .../07-python3-rfc3339_1.1-3_all.deb……
解開 python3-rfc3339 (1.1-3) 中...
選取了原先未選的套件 python3-acme。
正在準備解包 .../08-python3-acme_1.21.0-1ubuntu0.1_all.deb……
解開 python3-acme (1.21.0-1ubuntu0.1) 中...
選取了原先未選的套件 python3-configargparse。
正在準備解包 .../09-python3-configargparse_1.5.3-1_all.deb……
解開 python3-configargparse (1.5.3-1) 中...
選取了原先未選的套件 python3-configobj。
正在準備解包 .../10-python3-configobj_5.0.6-5_all.deb……
解開 python3-configobj (5.0.6-5) 中...
選取了原先未選的套件 python3-parsedatetime。
正在準備解包 .../11-python3-parsedatetime_2.6-2_all.deb……
解開 python3-parsedatetime (2.6-2) 中...
選取了原先未選的套件 python3-zope.hookable。
正在準備解包 .../12-python3-zope.hookable_5.1.0-1build1_arm64.deb……
解開 python3-zope.hookable (5.1.0-1build1) 中...
選取了原先未選的套件 python3-zope.interface。
正在準備解包 .../13-python3-zope.interface_5.4.0-1build1_arm64.deb……
解開 python3-zope.interface (5.4.0-1build1) 中...
選取了原先未選的套件 python3-zope.event。
正在準備解包 .../14-python3-zope.event_4.4-3_all.deb……
解開 python3-zope.event (4.4-3) 中...
選取了原先未選的套件 python3-zope.component。
正在準備解包 .../15-python3-zope.component_4.3.0-3_all.deb……
解開 python3-zope.component (4.3.0-3) 中...
選取了原先未選的套件 python3-certbot。
正在準備解包 .../16-python3-certbot_1.21.0-1build1_all.deb……
解開 python3-certbot (1.21.0-1build1) 中...
選取了原先未選的套件 certbot。
正在準備解包 .../17-certbot_1.21.0-1build1_all.deb……
解開 certbot (1.21.0-1build1) 中...
選取了原先未選的套件 python3-certbot-nginx。
正在準備解包 .../18-python3-certbot-nginx_1.21.0-1_all.deb……
解開 python3-certbot-nginx (1.21.0-1) 中...
選取了原先未選的套件 python3-icu。
正在準備解包 .../19-python3-icu_2.8.1-0ubuntu2_arm64.deb……
解開 python3-icu (2.8.1-0ubuntu2) 中...
設定 python3-configargparse (1.5.3-1) ...
設定 python3-parsedatetime (2.6-2) ...
設定 python3-icu (2.8.1-0ubuntu2) ...
設定 python3-zope.event (4.4-3) ...
設定 python3-zope.interface (5.4.0-1build1) ...
設定 python3-openssl (21.0.0-1) ...
設定 python3-tz (2022.1-1ubuntu0.22.04.1) ...
設定 python3-zope.hookable (5.1.0-1build1) ...
設定 python3-configobj (5.0.6-5) ...
設定 python3-certifi (2020.6.20-1) ...
設定 python3-idna (3.3-1) ...
設定 python3-josepy (1.10.0-1) ...
設定 python3-rfc3339 (1.1-3) ...
設定 python3-zope.component (4.3.0-3) ...
設定 python3-requests (2.25.1+dfsg-2ubuntu0.1) ...
設定 python3-requests-toolbelt (0.9.1-1) ...
設定 python3-acme (1.21.0-1ubuntu0.1) ...
設定 python3-certbot (1.21.0-1build1) ...
設定 certbot (1.21.0-1build1) ...
Created symlink /etc/systemd/system/timers.target.wants/certbot.timer → /lib/systemd/system/certbot.timer.
設定 python3-certbot-nginx (1.21.0-1) ...
執行 man-db (2.10.2-1) 的觸發程式……
tony1966@LX2438:~$ 


3. 向 Let's Encrypt 註冊憑證 : 

指令如下 :

sudo certbot --nginx --redirect -d tony1966.cc     

此處 -d tony1966.cc 表示為我的網站域名 http://tony1966.cc 註冊憑證, 如有多個網址就在後面加 -d domain_name 即可. --redirect 表示會自動將對 http://tony1966.cc 的請求轉成 https://tony1966.cc :

tony1966@LX2438:~$ sudo certbot --nginx --redirect -d tony1966.cc    
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): 此處輸入我的 Hinet 信箱  

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y     <== 必須輸入 Y 才能繼續

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y     <== 建議輸入 Y (可收到關於 Certbot 與 Let's Encrypt 消息)
Account registered.
Requesting a certificate for tony1966.cc

Successfully received certificate.     <== 收到憑證了
Certificate is saved at: /etc/letsencrypt/live/tony1966.cc/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/tony1966.cc/privkey.pem     <== 金鑰儲存位置
This certificate expires on 2024-05-20.    <== 憑證到期日 (有效期限 3 個月) 
These files will be updated when the certificate renews.     <== 到期前Certbot 會自動更新
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for tony1966.cc to /etc/nginx/sites-enabled/default
Congratulations! You have successfully enabled HTTPS on https://tony1966.cc

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
tony1966@LX2438:~$ 

這樣便註冊與安裝好憑證了, 有效期限為 3 個月, 但 Certbot 會自動檢查是否需要更新憑證 (使用 Crontab 計時器, 每天檢查 2 次), 所以不用擔心 HTTPS 功能會因為憑證到期未更新而停擺的問題. 可以用下列指令檢查 Certbot 自動檢查機制目前的狀態 :

sudo systemctl status certbot.timer   

tony1966@LX2438:~$ sudo systemctl status certbot.timer    
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2024-02-20 21:12:14 CST; 25min ago
    Trigger: Wed 2024-02-21 08:06:44 CST; 10h left
   Triggers: ● certbot.service

看到 active 表示自動檢查憑證是否到期功能目前正啟動中. 

如果想要手動更新憑證, 指令如下 :

sudo certbot renew    

這樣便完成 HTTPS 憑證的註冊安裝了, 亦即我的網站已有 HTTPS 加密傳輸功能了, 馬上開啟瀏覽器測試, 在網址列輸入 http://tony1966.cc :




網址果然如預期被自動轉成 https://tony1966.cc 且正常顯示網頁, 收工啦. 


2024-02-21 補充 :

Nginx 預設的網站設定檔位於 /etc/nginx/sites-enabled 下的 default, 用 cat 瀏覽此檔, 在最底下會看到 Certbot 已經幫我們自動修改內容 : 

tony1966@LX2438:~$ cat /etc/nginx/sites-enabled/default  

... (略) ...

server {
listen 80 default_server;          <== 監聽 80 埠 (HTTP)
listen [::]:80 default_server;

... (略) ...

root /var/www/html;               <== 網站根目錄位置

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
    server_name tony1966.cc; # managed by Certbot    

...(略)...

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot        <== 監聽 443 埠 (HTTPS)
    ssl_certificate /etc/letsencrypt/live/tony1966.cc/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/tony1966.cc/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = tony1966.cc) {
        return 301 https://$host$request_uri;     <== 將 http 自動轉成 https
    } # managed by Certbot


listen 80 ;
listen [::]:80 ;
    server_name tony1966.cc;
    return 404; # managed by Certbot


}

momo 購買折疊躺椅午休椅

為了午休時能躺得舒服好睡些, 今天上 momo 買了這款摺疊躺椅 : 





家裡面的是 135 度那種, 但這款則是可 180 度打平. 本來想買下面 $855 小不記的, 但這款便宜些且贈送眼罩 :


還有 1018 元 momo 幣, 先抵用 500 元, 實付 299 元 : 



露天購買折疊式蚊帳

昨晚房間跑進一隻蚊子, 害我醒來兩次, 早上出門前點一整卷蚊香關窗讓它好好享受汗蒸幕, 為了永絕後患上露天買了一個折疊式蚊帳, 我選藍色升級款 190*100 :





蚊帳要 3 天才會到貨, 所以晚上下班回去再燒一卷蚊香. 雖然房門口有掛竹簾, 以前我房間幾乎沒有蚊子, 可能開門時趁隙飛進來. 

Python 學習筆記 : OpenCV (三) 視訊讀寫與顯示

今天繼續測試 OpenCV 功能, 本系列之前的文章參考 :


OpenCV 官方教學文件 (Python) 參考 :



一. 從檔案讀取視訊 : 

本篇要來測試 OpenCV 的視訊讀寫功能, 這要用到其 VideoCapture 類別, 它可以從檔案 (例如 mp4 檔) 或攝影機讀取視訊, 呼叫其建構式 VideoCapture() 會傳回一個 VideoCapture 物件, 其參數介面如下 : 

vcap=VideoCapture(file [, flag])             # 從檔案 file (含路徑) 讀取視訊


此處用來測試的影片是從 YT 下載, 網友改編自周星馳電影 "唐伯虎點秋香", 用來提醒明天要補班的片段 :





可以用線上 YT 轉 MP4 工具下載 : 


將下載的 mp4 檔案放在工作目錄下, 然後將檔名傳給 cv2.VideoCapture() 即可, 它會傳回一個包含兩元素的 tuple

>>> import cv2   
>>> vcap=cv2.VideoCapture('唐伯虎點秋香-記得明天要上班.mp4')   
>>> type(vcap)   
<class 'cv2.VideoCapture'>   

用 dir() 檢視 VideoCapture 物件的內容 :

>>> dir(vcap)  
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'get', 'getBackendName', 'getExceptionMode', 'grab', 'isOpened', 'open', 'read', 'release', 'retrieve', 'set', 'setExceptionMode', 'waitAny']

VideoCapture 物件提供一些方法可用來讀取視訊框, 常用者如下表 : 


 VideoCapture 物件方法 說明
 isOpened() 檢查影片檔是否正常開啟, 傳回 True/False
 read() 向下讀取一幀 (frame) 訊框, 傳回 (ret, frame), ret=True 表示讀取成功
 release() 釋放儲存視訊框的記憶體


顯示所讀取之視訊要用一個 while 無窮迴圈呼叫 VideoCapture 物件的 read() 方法依序讀取物件中的視訊框, 然後用 cv2.imshow() 顯示此訊框 (圖片), 並利用傳入 cv2.waitKey() 之延遲毫秒參數控制影片播放速度, 直到讀不到訊框 (ret=False) 跳出無窮迴圈為止. 

例如 :
# opencv_read_mp4_1.py
import cv2

vcap=cv2.VideoCapture('唐伯虎點秋香-記得明天要上班.mp4')  # 讀取 mp4 檔案
if not vcap.isOpened():   # 檢查檔案是否開啟成功
    print('無法開啟影片檔')
    exit()    # 跳出程式
while True:   
    ret, frame=vcap.read()   # 讀取下一個訊框
    if not ret:    # 檢查訊框是否已讀完
        print('未收到訊框')
        break      # 跳出迴圈
    cv2.imshow('videocapture', frame)    # 顯示此訊框
    if cv2.waitKey(50) == ord('q'):    # 延遲 50ms 期間若按下 'q' 跳出迴圈
        break
vcap.release()
cv2.destroyAllWindows()

截圖如下如下 :





此例中 cv2.waitKey() 參數值調小會讓動作變快, 調大則會變慢. 適當的值可參考影片檔的總幀數 與影片時間長度來決定, 只要將時長除以總幀數即可得到每幀要停留多久時間. 如果影片檔較小, 可以用下列網站來取得總幀數與時長 :


將影片檔上傳, 播完後即可得到總 frame 數與時長 :




可見此影片總框數為 776 框, 影片總長為 12.933 秒, 故每幀時間為 12.933/776=16.7 ms, 但 cv2.waitKey() 只能傳入整數, 故取 17 ms, 但播放起來還是覺得有點快動作, 改成 50 就比較自然了. 


二. 從攝影機讀取視訊 :  

如果是筆電或有外接攝影機的電腦, 只要將攝影機編號 (第一台編號 0, 第二台編號 1, ...) 傳給 VideoCapture() 建構式即可即時從攝影機擷取視訊, 將其分解為一幀幀的圖片 :

vcap=VideoCapture(camera [, flag])     # 從攝影機 camera (0, 1, 2 ...) 讀取視訊

用法與上面讀取影片檔類似, 只是將第一參數從檔案名稱字串改成攝影機編號而已, 例如 : 

import cv2

vcap=cv2.VideoCapture(0)   # 讀取編號 0 攝影機
if not vcap.isOpened():
    print('無法開啟攝影機')
    exit()
while True:
    ret, frame=vcap.read()
    if not ret:
        print('未收到訊框')
        break
    cv2.imshow('videocapture', frame)
    if cv2.waitKey(1) == ord('q'):      # 延遲時間用 1 影像較即時
        break
vcap.release()
cv2.destroyAllWindows()

注意, 此例 cv2.waitKey() 參數改為 1ms 才能喪影像反應更即時. 截圖如下 :




2024年2月19日 星期一

市圖還書 1 本 : 一本精通 OpenCV與AI影像辨識

本周市圖還書 1 本 (被預約) :


此書前幾天發現快到期時才開始看, 才發現內容寫得極好, 認真看了第二章就得還了. 下次再預約.  

2024年2月18日 星期日

2024 年第 7 周記事

春節連假一下子就過去了, 這次感覺不一樣, 除夕晚上跟小狐狸們放沖天炮跟點仙女棒好玩! 年初五全家人去吃海港 (去年升遷一直沒時間慶祝), 很久沒吃就覺得很好吃 (姊姊說台北的海港似乎普普). 傍晚載爸回鄉下後直接折返, 因為同學邀年初五晚上聚會. 

因春節假期到周三 (年初五), 本周只上三天班 (週四~五 + 週六補班), 本來週六下班後想回鄉下, 但爸說過年期間跑這麼多趟, 還是待高雄好了. 所以今天陪水某去搭輕軌, 午後一點出發, 還是一樣逆行路線, 但到文武聖殿下車, 步行到北斗街吃豬腳湯. 以前去爬柴山下來常會去那裡充飢, 好吃價格又不貴, 我點了兩碗豬腳湯, 一碗四神湯, 一個粽子, 一個碗粿共 235 元. 







吃完往前走到七賢三路吃婆婆冰 (這家人最多, 對面阿婆冰人較少), 點了知名的鹹李冰與四果冰, 因為今天中午太熱啦 : 





我發現鼓山這邊的美食還蠻多的啊! 吃完走回文武聖殿站繼續行程, 但這回人擠到爆, 沒位子坐了, 假日去看黃色小鴨的人好多, 我們本來有想要去拍鴨鴨, 但擔心下去就擠不上來了, 且太陽還很大, 只在輕軌列車上遠遠拍了一張剛好停在高流前面的黃色小鴨 :




晚上在家跟水某看 Friday 頻道由反町隆史主演的 5 集迷你日劇 "Great Gift", 描述病理醫生藤卷 (反町隆史) 意外發現看起來是因心臟衰竭致命的病患其實是一種驗不出來的球菌所致, 想要調查將這種東西 (稱為禮物) 帶進醫院謀殺理事長等人的元凶是誰, 但卻被其妻的主治醫生得知球菌的存在, 以其妻的心臟手術要脅, 要求其繼續培養球菌以遂行其 "Justice Killing" ... 好看.