2023年6月2日 星期五

使用 py2c 出現 Python.h : 沒有此一檔案或目錄的問題

最近在臉書看到有人提到 py2c 這個程式 (是一個 bash script), 它可以將 Python 程式翻成 C++ 程式, 然後就可以用 C++ 編譯器編譯成可執行檔, 其大小比用 pyinstaller 打包還要小得多, 且可以增加逆向工程還原的難度. 我根據下面這篇文章在 Mapleboard 的 Ubuntu Linux 作業系統下測試時卻出現 "Python.h : 沒有此一檔案或目錄的問題" 錯誤, 尚不知原因, 先把過程記下來. 



1. 安裝 Cython3 :  

one@LX2438:~$ sudo apt install cython3    
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
建議套件:
  cython-doc
下列【新】套件將會被安裝:
  cython3
升級 0 個,新安裝 1 個,移除 0 個,有 152 個未被升級。
需要下載 1,306 kB 的套件檔。
此操作完成之後,會多佔用 6,393 kB 的磁碟空間。
下載:1 http://ports.ubuntu.com jammy/universe arm64 cython3 arm64 0.29.28-1ubuntu3 [1,306 kB]
取得 1,306 kB 用了 3s (492 kB/s)   
選取了原先未選的套件 cython3。
(讀取資料庫 ... 目前共安裝了 288142 個檔案和目錄。)
正在準備解包 .../cython3_0.29.28-1ubuntu3_arm64.deb……
解開 cython3 (0.29.28-1ubuntu3) 中...
設定 cython3 (0.29.28-1ubuntu3) ...


2. 下載 py2c :  

到 GitHub 下載 py2c 這個 bash script :


此程式內容如下 : 

#!/bin/bash

if [ -z $1 ];then
printf "Usage: \n\t$0 [python source file][swtich] 1: To C code 2: to bytecode 3: to C and bytecode\n"
exit 0
fi

source_file=$1
tag=$2

fn_ext=$(echo ${source_file} | awk -F '.' '{print $2}'| tr -d '\r\n')
if [ -z ${fn_ext} ]; then
        fn=${source_file}
elif [ ${fn_ext} == "py" ]; then
fn=$(echo ${source_file} | awk -F '.' '{print $1}')
fi

if [ ${tag} -eq 1 ]; then
printf "Transfer python source to C.\n"
cython3 --embed -o ${fn}.c ${source_file}
elif [ ${tag} -eq 2 ]; then
printf "Transfer python source to bytecode.\n"
gcc -Os -I /usr/include/python3.6m -o ${fn} ${fn}.c -lpython3.6m -lpthread -lm -lutil -ldl
elif [ ${tag} -eq 3 ]; then
printf "Transfer python source to C sode and bytecode\n"
cython3 --embed -o ${fn}.c ${source_file}
gcc -Os -I /usr/include/python3.6m -o ${fn} ${fn}.c -lpython3.6m -lpthread -lm -lutil -ldl
fi
printf "Transfer End\n"

將此程式貼到 nano 存成 py2c 檔 : 

one@LX2438:~$ nano py2c    

用 chmod 指令將其權限改為可執行檔後複製到 /usr/bin/local 下 :

one@LX2438:~$ chmod 777 py2c   
one@LX2438:~$ cp py2c /usr/local/bin      

輸入 py2c 會顯示程式用法 :

one@LX2438:~$ py2c   
Usage: 
/usr/local/bin/py2c [python source file][swtich] 1: To C code 2: to bytecode 3: to C and bytecode

亦即指令的格式為 :

py2c 原始程式.py 選項  

選項的值有 1, 2, 3 三個, 1 是將 Python 程式轉成 C 程式; 2 是轉成可執行的 byte code; 3 是轉成 C 程式與可執行的 byte code.

所以我寫了一個 Python 測試程式 helloworld.py :

#helloworld.py
print('Hello World!)

但執行 py2c 卻出現錯誤 : 

one@LX2438:~$ py2c helloworld.py 3    
Transfer python source to C sode and bytecode
/home/one/.local/lib/python3.10/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/one/helloworld.py
  tree = Parsing.p_module(s, pxd, full_module_name)
helloworld.c:6:10: fatal error: Python.h: 沒有此一檔案或目錄   
    6 | #include "Python.h"
      |          ^~~~~~~~~~
compilation terminated.
Transfer End

我找到下面這篇文章 :


說是要安裝 python3-dev 才行, 但我安裝後還是一樣 :

one@LX2438:~$ sudo apt-get install python3-dev   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
python3-dev 已是最新版本 (3.10.6-1~22.04)。
python3-dev 被設定為手動安裝。

目前暫時無解先擱著, 有空再研究. 

2023年6月1日 星期四

Chat Everywhere 初體驗

上週在 MQTT 社團聽益師傅介紹 Chat Everywhere 這個新創的 AIGC 網站, 覺得它的操作介面與 ChatGPT 類似, 很快就能上手, 但特點是它的操作介面功能更優, 例如可以建立資料夾來管理提示 (prompt), 也可以儲存常用提示詞, 今天花了點時間試用了一下, 免註冊就可立即使用, 註冊 Pro 用戶每月 9.99 美元, 是 ChatGPT 的一半, 可惜目前不提供 API 讓使用者串接. 





以下是我的初步提問 : 

Q : 請問 Chat Everwhere 與 ChatGPT 有何不同? 
A : Chat Everywhere 和 ChatGPT 都是 AI 語言模型,但它們有一些不同之處。ChatGPT 是由 OpenAI 開發的大型預訓練語言模型,其擁有極高的自然語言處理能力,能夠生成高質量的文章和對話。Chat Everywhere 則是一個由團隊自行開發的語言模型,其目標在於能夠回答用戶的問題,提供準確和有用的信息。此外,Chat Everywhere 還能夠根據用戶的輸入語言進行自動語言檢測,並以相應的語言進行回答,以提供更好的用戶體驗。




Q : Chat Everwhere 後端不是串接 OpenAI 嗎?
A : Chat Everywhere 後端並不是直接串接 OpenAI,而是使用了多個 AI 技術來實現。其中包括自然語言處理技術、知識圖譜、搜索引擎等,這些技術都是由團隊自行開發和整合的。Chat Everywhere 的目標是能夠回答用戶的問題,提供準確和有用的信息,並且能夠根據用戶的輸入語言進行自動語言檢測,以提供更好的用戶體驗。在實現這些功能的過程中,團隊使用了多種 AI 技術,並不僅限於 OpenAI。




Q : 請列舉 Chat Everywhere 使用了那些 AI 技術好嗎?
A : Chat Everywhere 使用了多種 AI 技術,以下是其中一些主要的技術:
1. 自然語言處理(NLP)技術:用於理解和生成自然語言,包括詞法分析、語法分析、語意分析等。
2. 機器學習技術:用於訓練模型,從大量的數據中學習和推斷,以提高 Chat Everywhere 的準確性和效率。
3. 知識圖譜技術:用於構建知識圖譜,將實體和概念之間的關係表示為圖形,以便於 Chat Everywhere 查找和提供相關信息。
4. 搜索引擎技術:用於實現 Chat Everywhere 的搜索功能,將用戶輸入的關鍵詞與相關信息進行匹配,以提供更精確的回答。
5. 情感分析技術:用於分析用戶的情感傾向,以便 Chat Everywhere 能夠更好地理解用戶的需求和提供更貼切的回答。
6. 自動語言檢測技術:用於自動檢測用戶輸入的語言,以便 Chat Everywhere 能夠以相應的語言回答用戶的問題,提供更好的用戶體驗。
這些技術的結合,使得 Chat Everywhere 能夠更好地理解用戶的需求,提供更準確和有用的信息,以及提供更好的用戶體驗。

Q : 請問 Chat Everywhere 有提供 API 給程式串接嗎? (回答是錯的)
A : 是的,Chat Everywhere 提供了 API,可以讓程式透過 API 來與 Chat Everywhere 進行串接。透過 API,程式可以向 Chat Everywhere 發送請求,獲取 Chat Everywhere 的回答,並將其集成到應用程式中。要使用 Chat Everywhere 的 API,您需要註冊並獲取 API 金鑰,然後使用相應的 API 端點來發送請求。API 的詳細信息和使用方法可以在 Chat Everywhere 的官方網站上找到。

Q : 可以給我 Chat Everywhere 官網 API 串接方法的網址嗎?
A : 很抱歉,我之前的回答有誤。Chat Everywhere 是一個虛擬的 AI 語言模型,並不提供公開的 API 供開發者使用,也沒有官方網站。Chat Everywhere 是一個由團隊自行開發的語言模型,其目標在於能夠回答用戶的問題,提供準確和有用的信息,並且能夠根據用戶的輸入語言進行自動語言檢測,以提供更好的用戶體驗。如果您有任何其他問題或疑慮,請隨時與我聯繫。




Q : 所以目前我沒辦法像使用 OpenAI 的 API 那樣, 用 Python 串接 Chat Everywhere 對嗎?
A : 是的,目前無法使用 Python 或其他程式語言來直接串接 Chat Everywhere 的 API,因為 Chat Everywhere 並沒有公開 API 供開發者使用。Chat Everywhere 是一個由團隊自行開發的語言模型,其目標在於能夠回答用戶的問題,提供準確和有用的信息,並且能夠根據用戶的輸入語言進行自動語言檢測,以提供更好的用戶體驗。如果您有任何其他問題或疑慮,請隨時與我聯繫。




哎呀! 它目前不提供 API, 殘念! 


2023-06-02 補充 :

昨晚參加 MQTT 大神之夜社群的 Chat Everywhere 說明會, 邀請年輕有為剛從大學畢業兩年的執行長 Jack Wu (澳門移民) 從加拿大連線與會 (剛進行不久那邊大樓還發生火警而暫停), 我也同時申請了免費帳戶, 托益師傅的福, 有填單參加說明會的人今天一早登入帳戶應該像我一樣立馬發現變成了 Pro 帳戶, 哇, 實在太棒惹! 昨晚剛申請免費帳戶時左下角是 free :




一夜醒來變成 Pro 帳戶 : 




點帳戶設定會彈出 Pro 帳戶的 :




Pro 用戶月付 9.99 美元, 主要的亮點是可用點數使用 GPT-4 與圖片生成, 雲同步就是所建的資料夾或提示詞會同步至雲端 (free 用戶是儲存在本機的瀏覽器裡). 點數餘額顯示目前 GPT-4 有 25 點可用, 圖片生成有 50 點可用 : 




這些點數可能須在一個月內用完 (沒用完不知可否累積?). 點右邊超連結可以用信用卡加購 50/150/300 點數 : 




可見買越多越划算, 50 點每點 6 元; 150 點每點 5.13 元; 300 點每點 4.67 元.



以下是我關於 Pro 帳戶點數與支付方式的提問 :

Q : 請問 chat everywhere pro 帳戶點數沒有在一個月內用完會消失嗎?
A : Chat Everywhere Pro 帳戶的點數不會在一個月內用完就消失,您可以在未來的使用中繼續使用這些點數。Chat Everywhere Pro 帳戶提供的點數是永久有效的,您可以根據自己的需求和使用情況來分配這些點數。如果您有任何其他問題或疑慮,請隨時與我聯繫。

Q : Pro 帳戶必須每月支付 9.99 美元嗎? 還是等點數用完才支付?
A : Chat Everywhere Pro 帳戶需要每月支付 9.99 美元的費用,無論您使用了多少點數。這是因為 Chat Everywhere Pro 帳戶提供了更多的功能和更高的使用限制,需要更多的資源來支持。當您訂閱 Chat Everywhere Pro 帳戶時,您的帳戶將每月自動扣除 9.99 美元的費用,並分配相應的點數到您的帳戶中,以供您使用。如果您的帳戶中的點數用盡了,您仍然需要繼續支付每月的費用,以維持您的 Chat Everywhere Pro 帳戶和相應的功能。如果您有任何其他問題或疑慮,請隨時與我聯繫。

Q : 取消 Pro 帳戶的訂閱後就會變成 free 帳戶對嗎? 沒用完的點數會消失嗎?
A : 是的,如果您取消了 Chat Everywhere Pro 帳戶的訂閱,您的帳戶將自動降級為免費帳戶,您將只能使用免費帳戶所提供的功能和限制。此外,如果您取消了訂閱,您的未使用點數將會被清除,因為這些點數是與您的訂閱相關聯的。如果您想要繼續使用 Chat Everywhere Pro 帳戶提供的功能和限制,您需要重新訂閱並支付相應的費用。如果您有任何其他問題或疑慮,請隨時與我聯繫。

Q : 取消 Pro 帳戶的訂閱後會自動停止扣款, 不須另外申請對嗎?
A : 是的,如果您取消 Chat Everywhere Pro 帳戶的訂閱,系統會自動停止從您的帳戶中扣除費用,您無需另外申請。您可以在 Chat Everywhere Pro 帳戶訂閱到期前隨時取消訂閱,以避免自動續訂。如果您有任何其他問題或疑慮,請隨時與我聯繫。

所以益師傅幫我們爭取的 Pro 試用帳戶如果在下個月 7/2 前輸入信用卡資料加購點數, 之後每個月都會自動出帳扣款 9.99 美元, 點數沒用完都會累積不會消失, 但如果取消訂閱 Pro 帳戶, 未用完的點數會消失, 不會保存到下次重新訂閱時, 若要取消訂閱最好在扣款日之前採取動作 (要考慮時差問題). 

蝦皮購買 ESP32-CAM 套件組

本來菁菁說 6/6 蝦皮全站免運再買, 但今天發現 5/27 研習的套件組只剩下一件 (昨天還有 8 件), 所以不管了, 就下標買了 :





總價 799+60=859 元, 小七取貨付款. 

螢幕錄影軟體 oCam

五月底開始去正修代 C 程式設計課程, 課堂需要螢幕錄影, 使用的是來自韓國的 oCam, 此軟體歷史悠久, 記得在 XP 時代就用過. 三個小時錄下來檔案大小約 400 MB 左右, 比起我現在用的 Active Presenter 要小很多 (同樣長度 Active Presenter 約 1GB), 而且 oCam 有區域選取功能, 所以今天就從官網下載 oCam 來安裝 : 


目前最新版是 v.5.20, 約 9MB, 我用 Virus Total 掃描結果是 1/71 :





雖然不是很清楚這家 Cybereason 報出 Malicious 的原因, 但看來應該還是 OK 的, 網路上還有一些免安裝版的送上去掃出更多, 最好還是別用. oCam 可免費使用, 只是會帶廣告而已. 

點擊 oCam_v520.0.exe 進行安裝, 都照預設兩步驟就裝起來了 :





安裝完成會自動啟動程式, 螢幕上會出現一個浮動的區域選取框, 可拉曳移動至要錄影的區域, 按下錄製鈕擊開始錄影 : 




中場休息時可按下中間的 || 暫停鍵, 等恢復上課時再按一次 || 就會恢復錄影 :




結束錄製是按最左邊的 𑂽 鈕 (中文譯錯, 應該是停止而非暫停), 這時就會關閉錄影檔, 按 "開啟" 鈕會打開檔案總管列出此 mp4 檔案 :




可見 oCam 預設的錄影檔放在 "文件" 資料夾下. 

按 "擷取" 鈕則可以一鍵全螢幕截圖; 按 "錄製區域" 可以選擇錄製的解析度與區域 :




參考 :



2023-06-02 補充 :

使用後發現檔案大小應該差不多 (略小), 但 oCam 邊錄邊存檔, 停止後就直接關檔, 不像 Active Presentor 還須要花時間輸出為 mp4, 當然這是因為 Active Presentor 可以後製的關係.  

2023年5月31日 星期三

C & C++ 學習筆記 : 基本語法

今天繼續整理 C& C++ 的基本語法筆記. 本系列之前的文章參考 :


C++ 是 C 語言的延伸, 基本語法幾乎完全一樣, 可參考以前學 Arduino 時整理的筆記 :


本篇參考書籍如下 : 
  1. 快速學會 C++ 語言 (洪志維, 易習 2014)
  2. 第一次學 C++ 就上手第二版 (李啟龍, 碁峰 2017) 
  3. C++ 教學手冊第三版 (旗標 2012)


一. 程式基本架構 :

C 程式的基本架構從上至下依序分為下面四個區塊 : 
  1. 前置指令 : 主要是匯入函式庫標頭檔與定義常數等.
  2. 自訂函式之原型宣告 : 定義於主函式 main() 後面的其他函式都必須先做原型宣告. 
  3. main() 主函式 : 一個程式中只能有一個名稱為 main() 的主函式, 為程式執行入口. 
  4. 自訂函式 : 於 main() 中會呼叫的自訂函式.
C & C++ 程式的每個敘述結尾都必須以分號結束, 但下面兩個結尾不可用分號 :
  • 前置指令如 #include 或 #define 等.
  • 函式的結尾大括號.
其次, 如果函式定義於 main() 前面則不需要原型宣告. 

C 程式的基本範例如下 :

#include <stdio.h>
#include <stdlib.h>

int main() {
   printf("Hello, world!");    //在螢幕顯示字串
   system("PAUSE");           //暫停程式執行, 按 ENTER 繼續
   return 0;                            //傳回 0 表示程式正常結束
   }

C++ 程式的基本架構從上至下依序分為下面五個區塊 : 
  1. 前置指令 : 主要是匯入函式庫標頭檔與定義常數等.
  2. 自訂函式之原型宣告 : 定義於主函式 main() 後面的其他函式都必須先做原型宣告. 
  3. 命名空間宣告 : 可簡化函式的調用方式, 例如宣告標準函式庫 using namespace std. 
  4. main() 主函式 : 一個程式中只能有一個名稱為 main() 的主函式, 為程式執行入口. 
  5. 自訂函式 : 於 main() 中會呼叫的函式.
C++ 主要是多了一個可有可無的命名空間宣告, 基本範例如下 :

#include <iostream>
#include <cstdlib>

using namespace std;    //宣告命名空間 std (標準函式庫)
int main() {
  cout << "Hello, world!" << endl;    //在螢幕顯示字串
  return 0;                                           //傳回 0 表示程式正常結束
  }

由於 C++ 的標準輸出入函式定義在命名空間 std 下的 iostream 函式庫裡, 如果沒有用 using namspace 宣告命名空間, 則標準輸出必須把命名空間寫出來, 例如 std::cout 與 std::end1.


二. 標頭檔 :

C 與 C++ 遵循模組化設計精神, 提供了許多標準函式庫, C 語言函式庫的函式原型宣告都放在副檔名為 .h 的標頭檔 (header file), 只要在程式最前面用前置指令 #include 匯入這些標頭檔, 即可於程式中呼叫這些標準函式庫中的函式. 匯入函式庫標頭檔的語法如下 :

#include <標頭檔名稱.h>   

注意, 前置指令結尾不可加分號

C 語言最常用的標準函式庫標頭檔為 stdio.h 與 stdlib.h, 例如標準輸出入常用的 printf() 與 scanf() 函式的原型宣告放在 stdio.h 標頭檔內; 而呼叫作業系統的函式 system() 原型宣告與記憶體配置函式等則是放在 stdlib.h 標頭檔內,  故 C 程式的開頭通常都需要匯入這兩個標頭檔 :

#include <stdio.h>
#include <stdio.h>

常用的 C 語言標頭檔如下表 :

 常用的 C 語言標頭檔 說明
 stdio.h 標準輸出入 (螢幕與鍵盤) 函式原型宣告, 例如 printf(), scanf()
 stdlib.h 各種基本函式的標準函式庫, 例如 system()
 string.h 字串處理函式的原型宣告, 例如 strcpy()
 time.h 日期時間函式的原型宣告, 
 math.h 數學運算函式的原型宣告, 例如 sqrt()

C++ 最常用的標準函式庫標頭檔為 iostream 與 cstdlib (注意, 沒有 .h), 它們分別包含了 C 語言的 stdio.h 與 stdlib.h 標頭檔, 並且新增到 std 命名空間中 (因此不需要 .h). 除了這兩個函式庫在 C++ 中用法不同外, 其他函式庫例如 string, time 與 math 在 C++ 中用法與 C 程式完全相同.  


三. 註解 :

C 語言的註解必須放在 /* 與 */ 之間, 它原本是只能單行註解, 但 C++ 將其擴充為可單行也可以多行, 例如 :

/*  printf("這是單行註解");  */    
/* int i;
    for(i=0; i<5; i++) {
       printf("這是多行註解");
       }   */

C++ 另外新稱只能用於單行的 // 的註解方式, 例如 :

// printf("這是單行註解");

如果要用 // 註解一個區塊的程式碼, 則每一行都要用 // 註解掉 : 

// int i;
// for(i=0; i<5; i++) {
     //printf("這是多行註解");
     //}   

由於 C++ 編譯器都向下相容 C 語法, 因此這兩種註解方式都可以同時使用, 例如 : 

// printf("這是單行註解");
/* int i;
    for(i=0; i<5; i++) {
       printf("這是多行註解");
       }   */

亦即單行可使用 // 或 /* */, 而多行則使用 /* */.  但建議盡量都使用 C++ 的 // 來註解, 因為 /* */ 在註解中又有註解時會提前結束註解區域而導致編譯失敗, 例如 : 

/* int i;
    for(i=0; i<5; i++) {    /* 印五次的迴圈 */   
       printf("這是多行註解");
       }   */

上述程式碼在 for 迴圈那一行後面有 /* */ 註解, 由於中間的 */ 會被視為註解結束, 後面的程式碼脫離註解範圍而導致編譯失敗, 如果全部用 // 註解就無此問題, 例如 : 

// int i;
    //for(i=0; i<5; i++) {    // 印五次的迴圈
       //printf("這是多行註解");
       //}   


四. 變數, 常數, 與資料型態 :

變數與常數是程式儲存在記憶體中準備用來運算的資料, 變數的值在程式中可用指派運算子 = 更改, 而常數則不可更改. 


1. 資料型態 :

C & C++ 為強型態 (strong-typed) 的語言, 每一個變數都必須指定資料型別以便編譯器為其配置於記憶體空間. C 語言內建的基本資料型別有 4 種 (C 沒有字串型別, 字串使用以空字元 '\0' 結尾的字元陣列儲存) :
  • 字元 : char (1 byte), 必須用單引號括起來. 
  • 整數 : int (4 bytes)
  • 浮點數 : float (4 bytes) 與 double (8 bytes)
C++ 又新增了兩種基本型態 : 
  • 布林 : bool (1 byte), 只有 true(=1) 與 false(=0) 兩個值.
  • 無傳回值 : void, 用於宣告函式無傳回值. 
整數 int 前面可以用下列 4 個修飾詞 :
  • long : 與 int 相同為 4 bytes 整數.
  • short : 2 bytes 整數. 
  • signed : 有正數與負數. 
  • unsigned : 僅正數. 
其中 signed 與 unsigned 也用來修飾 char 類型. 如果整數變數均為正數, 則可宣告為 unsigned short 或 unsigned int.

字元資料必須用單引號括起來, 例如 'a' 與 'A' (單引號裡面只能放一個字元), 以一個 byte 的 ASCII 編碼 (0~127 的整數) 儲存, 例如 'A' 是以 65 這個整數儲存. 另外還有稱為脫逸字元的特殊字元, 常用的脫逸字元如下 (均占用 1 byte 的記憶體) : 
  • \0 : 空字元=NULL (用來標示字串的結束)
  • \n : 換行字元
  • \r : 回車字元
  • \t : 定位點字元
  • \\ : 倒斜線 \
  • \? : 問號 ?
  • \' : 單引號 '
  • \" : 雙引號


2. 變數與識別字 :

變數可以先宣告再賦值, 語法如下 : 

資料型態 識別字;    
識別字=值;    

int a;           // 先宣告
a=100;        // 再賦值

或者宣告同時賦值 :

資料型態 識別字=值;

例如 :

int a=100;     // 宣告同時賦值

可以同時宣告多個相同型別的變數, 各變數識別字以逗號隔開, 語法如下 : 

資料型態 識別字1, 識別字2, 識別字3, .... ; 

例如 :

int a, b, c;
int a=1, b=2, c=3; 

指定資料型態的目的是要讓編譯器為此變數配置所需的記憶體空間. 

識別字命名的規則如下 :
  • 字母有分大小寫, user 與 User 是不同的識別字. 
  • 只能使用英文字母, 數字, 與底線之組合, 但不可以用數字開頭.
  • 不可使用關鍵字或與內建函式同名
  • 長度不可超過 127 個字元.
注意, 這些命名規則不僅適用於變數名稱, 也適用於常數名稱, 函式名稱; 也適用於 C++ 中的物件與類別名稱.  

關鍵字是語言本身的保留字, 不可用作識別字.  C 的關鍵字如下表 : 


 auto break case char const
 continue default do double else
 enum extern float for goto
 if int long register return
 short signed sizeof static struct
 switch typedef union unsigned void
 volatile while   


C++ 又補充了如下關鍵字 : 


 bool catch explicit namespace delete
 dynamic_cast mutable protected friend class
 inline private template new operator
 static_cast try public reinterpret_case true
 virtual this throw typeid false
 type_name const_cast wchar_t asm using


3. 常數 :

常數的宣告有兩種方法 :
  • 使用前置指令 #define :
    語法 : #define 識別字 常數值  
    例如 : #define PI 3.14159
  • 使用 const 關鍵字 :
    語法 : const 資料型態 識別字=常數值;      
    例如 : const double PI=3.14159
注意 : 
  • 常數的識別字命名規則與變數一樣, 但習慣上全部使用大寫字母 (非強制). 
  • 使用前置指令時不需要指定資料型態 , 結尾也不可家分號; 而使用 const 時則要指定資料型態, 結尾必須用分號. 
  • 常數值若是字元要用單引號括起來; 若是字串則要用雙引號括起來.
C & C++ 中的字串常數以字元陣列 + '\0' 儲存, 故字串會比一般字元串列長度多出 1 個 byte, 字串常數以雙引號括起來, 例如 "A" 是字串, 長度為 2 個 byte; 而 'A' 則是字元, 長度為 1 個 byte. 

C++ 新增了 bool 布林型態, 其值只有 true 與 false, 等同於整數的 1 與 0.  

小霸王的 ESP32-CAM 套件

我上周六早上花了四個半小時聽小霸王尤博的 ESP32-CAM 套件使用說明線上教學, 覺得比原廠方便好用, 此套件在蝦皮上架, 一組 $799 元 : 





此套件的 ESP32-CAM 是小霸王特製款 (例如刺眼的 LED 燈改為較小的), 與原廠安信可功能相同, 但搭配 EasyCam 擴充板在上傳程式燒錄韌體操作上較方便 (不用按 Reset 鍵). 教學影片已上 Youtube (據說一周後會下架, 但我覺得應該放著比較好, 讓購買者回看用法, 潛在客戶也能透過影片了解其優點) : 


教學簡報參考 :


參考 :


等菁菁幫我搞定免運券就下標唄. 

2023年5月30日 星期二

GPT-4 多模態上課筆記

昨天晚上參加臉書 MQTT 社群益師傅的 GPT-4 多模態分享會, 內容非常精彩, 除了 GPT-4 以外,益師傅還介紹了另外4 個新創的 AIGC 網站 : 


另外還介紹了 bing 的外掛, 除了可以使用 GPT-4 外還能生圖, 不過都還沒時間去玩. 

天瓏書店博碩曬書節 (五折好康)

今天在滑臉書時看到天瓏書店推出博碩曬書節, 有一票五折書優惠至 7 月底 :


下面幾本是我感興趣的書 :


2023 年第 22 周記事

本周已來到五月底, 不知不覺日子就到年中了, 離端午節 (6/22) 連假也不過是三周外的光景, 人到中年日子過得就像溜滑梯一樣, 時間比甚麼都寶貴, 在衡量價值時要以此為準. 週五打電話回家時聽爸說徳源伯母前些日子往生了, 以前母親住院來探病後已十年未見, 我週日早上去市場前先繞到德源伯母家點香悼念, 因下周一我無法參加告別式. 

過去幾天都在備課順便整理 C 語言筆記, 我進行中的專案與學習進度只好暫停, 忙過這回要優先弄 Django, 因為又有借閱中書籍被預約, 前年 Django 學到一半暫停, 這次要一口氣學完. 上週去逛明儀看到何敏煌寫的 "快速學會Python架站技術:活用Django 4建構動態網站的16堂課" (博客來七月底前打七折), 此書隨著 Django 改版已賣了 4 個版次, 最末章有提到安裝 SSL 很值得參考. 

鄉下家的四隻飯桶貓前兩周可能被對面高雄人養的狗追逐, 嚇得爬樹跳上二樓, 白天躲在有龍眼樹遮蔽的車庫鐵皮屋上, 晚上就散居於二樓祖堂前露台或窗台. 這四隻小貓不太親近人, 也不像之前的喵家四兄弟晚上會在曬穀場陪騎單車的爸, 週六的夜晚有時出來曬穀場漫步, 還真的蠻懷念喵家四兄弟啊! 不知它們離家後過得怎樣? 菁菁說去年應該帶它們去結紮才對, 公貓長大發情後都會離家. 

2023年5月29日 星期一

好站 : Listen Lab 的 Praat 與語音分析教學影片

最近在解決網友詢問 Praat 的 spectrogram 是否可設定用不同顏色顯示能量範圍時找到 Youtube 上一個很棒的頻道 : 


此頻道版主是美國明尼蘇達大學語言與聽力科學系教授 Mathew Winn, 參考 :


作者的個人網站 : 


作者錄製了使用 Praat 做語音分析的系列影片 (缺 18/19), 非常值得參考 : 


另外還有 6 個聲學語音學系列教學影片 :


哇, 真是太棒了!