簡易SQL使用者界面 / simple sql ui
這邊是純粹功能性頁面,若要佈署,要加上安全性管控,避免客戶端可以隨意執行SQL。
●simpleSQLUI_doSQL.php
<?php
$strJson=file_get_contents('php://input'); // 讀入 json 資料
$oInpData=json_decode($strJson);
require_once 'lib_mariadb.php'; // 請參考常用類別
$oMySQL=new CMySQL();
if($oInpData->strMethod=='indupddel')
{
$oR=$oMySQL->insUpdDel("default", $oInpData->strSQL);
}
else if($oInpData->strMethod=='bigquery')
{
$oR=$oMySQL->bigQuery("default", $oInpData->strSQL);
}
else
{
$oR=["strError"=>"wrong method!"];
}
echo json_encode($oR, JSON_UNESCAPED_UNICODE); // 輸出 json 資料
?>
●simpleSQLUI.php
<!doctype html>
<html lang="zh-Hant-TW">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Simple SQL UI</title>
<style>
textarea
{
width: calc( 100vw - 2em );
height: 6em;
border-radius: 1em;
}
#taInput
{
background-color: #efbcad;
}
#taOutput
{
background-color: #ffbbcc;
}
</style>
</head>
<body>
<div>SQL語法</div>
<div>
<textarea id="taInput" placeholder="select * from tb1;"></textarea>
</div>
<br>
<div>
<button type="button" onclick="doInsUpdDel();">執行insUpdDel</button>
<button type="button" onclick="doBigQuery();">執行bigQuery</button>
</div>
<br>
<div>回傳結果</div>
<div>
<textarea id="taOutput"></textarea>
</div>
<div id="divResult"></div>
<script>
function gebi(strId)
{
return document.getElementById(strId);
}
function getStrToInnerHTML(str1)
{
str1=String(str1);
return str1.split("&").join("&").split("<").join("<").split(">").join(">").split(" ").join(" ").split("'").join("'").split('"').join(""");
}
async function doInsUpdDel()
{
gebi('taOutput').value="";
gebi('divResult').innerHTML="";
var oR=await getOFetchSync(strUrl='simpleSQLUI_doSQL.php', oInputData={strMethod: "indupddel", strSQL: gebi("taInput").value});
gebi('taOutput').value=JSON.stringify(oR);
var straHtml=[];
while(true)
{
if(oR.booSuccess==false)
{
straHtml.push("失敗1,"+getStrToInnerHTML(oR.oError)+"<br>");
straHtml.push("responsetext:"+getStrToInnerHTML(oR.strResponseText)+"<br>");
break;
}
if(oR.oOutputData.booSuccess==false)
{
straHtml.push("失敗2,"+getStrToInnerHTML(oR.oOutputData.strErrorMessage)+"<br>");
break;
}
straHtml.push("異動筆數:"+String(oR.oOutputData.iAffectedRows));
break;
}
gebi('divResult').innerHTML=straHtml.join("\r\n");
}
async function doBigQuery()
{
gebi('taOutput').value="";
gebi('divResult').innerHTML="";
var oR=await getOFetchSync(strUrl='simpleSQLUI_doSQL.php', oInputData={strMethod: "bigquery", strSQL: gebi("taInput").value});
gebi('taOutput').value=JSON.stringify(oR);
var straHtml=[];
while(true)
{
if(oR.booSuccess==false)
{
straHtml.push("失敗1,"+getStrToInnerHTML(oR.oError)+"<br>");
straHtml.push("responsetext:"+getStrToInnerHTML(oR.strResponseText)+"<br>");
break;
}
if(oR.oOutputData.booSuccess==false)
{
straHtml.push("失敗2,"+getStrToInnerHTML(oR.oOutputData.strErrorMessage)+"<br>");
break;
}
if(oR.oOutputData.iResultAmount<1)
{
straHtml.push("失敗3,無資料集可用。<br>");
}
for(var iR=0; iR<oR.oOutputData.iResultAmount; iR++)
{
var oResult=oR.oOutputData.aryResult[iR];
straHtml.push("<table>");
// 標題
straHtml.push("<tr>");
for(var iCol=0; iCol<oResult.straFieldName; iCol++)
{
straHtml.push("<th>"+getStrToInnerHTML(oResult.straFieldName[iCol])+"</th>");
}
straHtml.push("</tr>");
// 內容
for(var iRow=0; iRow<oResult.iRows; iRow++)
{
straHtml.push("<tr>");
for(var iCol=0; iCol<oResult.iCols; iCol++)
{
straHtml.push("<td>"+getStrToInnerHTML(oResult.aryRawData[iRow][iCol])+"</td>");
}
straHtml.push("</tr>");
}
straHtml.push("</table>");
}
break;
}
gebi('divResult').innerHTML=straHtml.join("\r\n");
}
async function getOFetchSync(strUrl='', oInputData={})
{
// 使用範例
//
// var oFetchResult=await getOFetchSync(strUrl, oInputData);
//
// oFetchResult.booSuccess (true/false)
// oFetchResult.oError
// oFetchResult.strResponseText
// oFetchResult.oOutputData
//
// PHP 部分範例參考
//
// <?php
//
// $strJson=file_get_contents('php://input'); // 讀入 json 資料
// $oInpData=json_decode($strJson);
//
// $oOutData=array("words"=>"hello, world!");
// echo json_encode($oOutData, true); // 輸出 json 資料
//
// ?>
try
{
var oResponse=await fetch(
strUrl,
{
method: 'POST', // *GET, POST, PUT, DELETE, etc.
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(oInputData)
}
);
}
catch(oError)
{
return { booSuccess: false, oError: oError, strResponseText: "", oOutputData: {} };
}
try
{
var strText=await oResponse.text();
var oOutputData=JSON.parse(strText);
}
catch(oError)
{
return { booSuccess: false, oError: oError, strResponseText: strText, oOutputData: {} };
}
return { booSuccess: true, oError: {}, strResponseText: strText, oOutputData: oOutputData };
}
</script>
</body>
</html>
python + espeak 讀取論語述而篇
import subprocess
straTextShown=[]
straTextRead=[]
straTextShown.append("1. 子曰:「述而不作,信而好古,竊比於我老彭。」")
straTextShown.append("2. 子曰:「默而識之,學而不厭,誨人不倦,何有於我哉?」")
straTextShown.append("3. 子曰:「德之不脩,學之不講,聞義不能徙,不善不能改,是吾憂也。」")
straTextShown.append("4. 子之燕居,申申如也,夭夭如也。")
straTextShown.append("5. 子曰:「甚矣吾衰也!久矣吾不復夢見周公。」")
straTextShown.append("6. 子曰:「志於道,據於德,依於仁,游於藝。」")
straTextShown.append("7. 子曰:「自行束脩以上,吾未嘗無誨焉。」")
straTextShown.append("8. 子曰:「不憤不啟,不悱不發,舉一隅不以三隅反,則不復也。」")
straTextShown.append("9. 子食於有喪者之側,未嘗飽也。")
straTextShown.append("10. 子於是日哭,則不歌。")
straTextShown.append("11. 子謂顏淵曰:「用之則行,舍之則藏,唯我與爾有是夫!」子路曰:「子行三軍,則誰與?」子曰:「暴虎馮河,死而無悔者,吾不與也。必也臨事而懼,好謀而成者也。」")
straTextShown.append("12. 子曰:「富而可求也,雖執鞭之士,吾亦為之。如不可求,從吾所好。」")
straTextShown.append("13. 子之所慎:齊,戰,疾。")
straTextShown.append("14. 子在齊聞韶,三月不知肉味。曰:「不圖為樂之至於斯也!」")
straTextShown.append("15. 冉有曰:「夫子為衛君乎?」子貢曰:「諾。吾將問之。」入,曰:「伯夷、叔齊何人也?」曰:「古之賢人也。」曰:「怨乎?」曰:「求仁而得仁,又何怨。」出,曰:「夫子不為也。」")
straTextShown.append("16. 子曰:「飯疏食飲水,曲肱而枕之,樂亦在其中矣。不義而富且貴,於我如浮雲。」")
straTextShown.append("17. 子曰:「加我數年,五十以學易,可以無大過矣。」")
straTextShown.append("18. 子所雅言,詩、書、執禮,皆雅言也。")
straTextShown.append("19. 葉公問孔子於子路,子路不對。子曰:「女奚不曰,其為人也,發憤忘食,樂以忘憂,不知老之將至云爾。」")
straTextShown.append("20. 子曰:「我非生而知之者,好古,敏以求之者也。」")
straTextShown.append("21. 子不語怪,力,亂,神。")
straTextShown.append("22. 子曰:「三人行,必有我師焉。擇其善者而從之,其不善者而改之。」")
straTextShown.append("23. 子曰:「天生德於予,桓魋其如予何?」")
straTextShown.append("24. 子曰:「二三子以我為隱乎?吾無隱乎爾。吾無行而不與二三子者,是丘也。」")
straTextShown.append("25. 子以四教:文,行,忠,信。")
straTextShown.append("26. 子曰:「聖人,吾不得而見之矣;得見君子者,斯可矣。」子曰:「善人,吾不得而見之矣;得見有恆者,斯可矣。亡而為有,虛而為盈,約而為泰,難乎有恆矣。」")
straTextShown.append("27. 子釣而不綱,弋不射宿。")
straTextShown.append("28. 子曰:「蓋有不知而作之者,我無是也。多聞擇其善者而從之,多見而識之,知之次也。」")
straTextShown.append("29. 互鄉難與言,童子見,門人惑。子曰:「與其進也,不與其退也,唯何甚!人潔己以進,與其潔也,不保其往也。」")
straTextShown.append("30. 子曰:「仁遠乎哉?我欲仁,斯仁至矣。」")
straTextShown.append("31. 陳司敗問昭公知禮乎?孔子曰:「知禮。」孔子退,揖巫馬期而進之,曰:「吾聞君子不黨,君子亦黨乎?君取於吳為同姓,謂之吳孟子。君而知禮,孰不知禮?」巫馬期以告。子曰:「丘也幸,苟有過,人必知之。」")
straTextShown.append("32. 子與人歌而善,必使反之,而後和之。")
straTextShown.append("33. 子曰:「文,莫吾猶人也。躬行君子,則吾未之有得。」")
straTextShown.append("34. 子曰:「若聖與仁,則吾豈敢?抑為之不厭,誨人不倦,則可謂云爾已矣。」公西華曰:「正唯弟子不能學也。」")
straTextShown.append("35. 子疾病,子路請禱。子曰:「有諸?」子路對曰:「有之。誄曰:『禱爾于上下神祇。』」子曰:「丘之禱久矣。」")
straTextShown.append("36. 子曰:「奢則不孫,儉則固。與其不孫也,寧固。」")
straTextShown.append("37. 子曰:「君子坦蕩蕩,小人長戚戚。」")
straTextShown.append("38. 子溫而厲,威而不猛,恭而安。")
straTextRead.append("1. 子曰:「述而不作,信而好古,竊比於我老 peng2 。」")
straTextRead.append("2. 子曰:「默而 zhi4 之,學而不厭,誨人不倦,何有 yu2 我 zai1?」")
straTextRead.append("3. 子曰:「德之不 xiu1,學之不 jiang3 ,聞義不能 xi3 ,不善不能改,是 wu2 憂也。」")
straTextRead.append("4. 子之燕居,申申如也,yao1 yao1 如也。")
straTextRead.append("5. 子曰:「甚 yi3 wu2 衰也!久 yi3 wu2 不 fu4 夢見周公。」")
straTextRead.append("6. 子曰:「志 yu2 道,據 yu2 德,依 yu2 仁,游 yu2 藝。」")
straTextRead.append("7. 子曰:「自行束 xiu1 以上, wu2 未嘗無 hui4 yan1。」")
straTextRead.append("8. 子曰:「 bu2 憤不啟,不 fei3 不發,舉一 yu3 不以三 yu3 反,則 bu2 fu4 也。」")
straTextRead.append("9. 子食 yu2 有喪者之側,未嘗飽也。")
straTextRead.append("10. 子 yu2 是日哭,則不歌。")
straTextRead.append("11. 子謂顏淵曰:「用之則行,舍之則藏,唯我與爾有是夫!」子路曰:「子行三軍,則誰與?」子曰:「暴虎馮河,死而無悔者, wu2 不與也。必也臨事而懼,好謀而成者也。」")
straTextRead.append("12. 子曰:「富而可求也,雖執鞭之士, wu2 亦為之。如不可求,從 wu2 所好。」")
straTextRead.append("13. 子之所慎:齊,戰,疾。")
straTextRead.append("14. 子在齊聞韶,三月不知肉味。曰:「不圖為樂之至 yu2 斯也!」")
straTextRead.append("15. 冉有曰:「夫子為衛君乎?」子貢曰:「諾。 wu2 將問之。」入,曰:「伯夷、叔齊何人也?」曰:「古之賢人也。」曰:「怨乎?」曰:「求仁而得仁,又何怨。」出,曰:「夫子不為也。」")
straTextRead.append("16. 子曰:「飯疏食飲水,曲肱而枕之,樂亦在其中矣。不義而富且貴, yu2 我如浮雲。」")
straTextRead.append("17. 子曰:「加我數年,五十以學易,可以無大過矣。」")
straTextRead.append("18. 子所雅言,詩、書、執禮,皆雅言也。")
straTextRead.append("19. 葉公問孔子 yu2 子路,子路不對。子曰:「女奚不曰,其為人也,發憤忘食,樂以忘憂,不知老之將至云爾。」")
straTextRead.append("20. 子曰:「我非生而知之者,好古,敏以求之者也。」")
straTextRead.append("21. 子不語怪,力,亂,神。")
straTextRead.append("22. 子曰:「三人行,必有我師yan1。擇其善者而從之,其不善者而改之。」")
straTextRead.append("23. 子曰:「天生德 yu2 予,桓魋其如予何?」")
straTextRead.append("24. 子曰:「二三子以我為隱乎? wu2 無隱乎爾。 wu2 無行而不與二三子者,是丘也。」")
straTextRead.append("25. 子以四教:文,行,忠,信。")
straTextRead.append("26. 子曰:「聖人, wu2 不得而見之矣;得見君子者,斯可矣。」子曰:「善人, wu2 不得而見之矣;得見有恆者,斯可矣。亡而為有,虛而為盈,約而為泰,難乎有恆矣。」")
straTextRead.append("27. 子釣而不綱,弋不射宿。")
straTextRead.append("28. 子曰:「蓋有不知而作之者,我無是也。多聞擇其善者而從之,多見而識之,知之次也。」")
straTextRead.append("29. 互鄉難與言,童子見,門人惑。子曰:「與其進也,不與其退也,唯何甚!人潔己以進,與其潔也,不保其往也。」")
straTextRead.append("30. 子曰:「仁遠乎哉?我欲仁,斯仁至矣。」")
straTextRead.append("31. 陳司敗問昭公知禮乎?孔子曰:「知禮。」孔子退,揖巫馬期而進之,曰:「 wu2 聞君子不黨,君子亦黨乎?君取 yu2 吳為同姓,謂之吳孟子。君而知禮,孰不知禮?」巫馬期以告。子曰:「丘也幸,苟有過,人必知之。」")
straTextRead.append("32. 子與人歌而善,必使反之,而後和之。")
straTextRead.append("33. 子曰:「文,莫 wu2 猶人也。躬行君子,則 wu2 未之有得。」")
straTextRead.append("34. 子曰:「若聖與仁,則 wu2 豈敢?抑為之不厭,誨人不倦,則可謂云爾已矣。」公西華曰:「正唯弟子不能學也。」")
straTextRead.append("35. 子疾病,子路請禱。子曰:「有諸?」子路對曰:「有之。誄曰:『禱爾于上下神祇。』」子曰:「丘之禱久矣。」")
straTextRead.append("36. 子曰:「奢則不孫,儉則固。與其不孫也,寧固。」")
straTextRead.append("37. 子曰:「君子坦蕩蕩,小人長戚戚。」")
straTextRead.append("38. 子溫而厲,威而不猛,恭而安。")
def speakText(strText):
strFilename="read.txt"
with open(strFilename, "w", encoding="utf-8") as file:
file.write(strText)
subprocess.run(["C:\\Program Files (x86)\\eSpeak\\command_line\\espeak", "-v", "zh", "-f", strFilename])
while True:
print("")
print("exit 退出。0手動輸入。1-38讀。")
strInput=input("請輸入指令:")
print("")
if strInput=="exit":
break
else:
try:
iInput=int(strInput)
if iInput==0:
strInput=input("請輸入要念的文字:")
speakText(strInput)
elif iInput>=1 and iInput<=38:
print(straTextShown[iInput-1])
print(straTextRead[iInput-1])
speakText(straTextRead[iInput-1])
except ValueError:
print("非整數,請重新輸入")
print('下次再見')
raspberry pi 5 文字轉語音
樹苺派5 的 terminal 底下
sudo apt install espeak-ng
espeak-ng -v cmn-latn-pinyin "子曰:學而時習之,不亦樂乎!"
espeak-ng -v cmn-latn-pinyin "子曰:學而時習之,不亦(yuè)乎!"
espeak-ng -v cmn-latn-pinyin "六度萬 heng4"
若在 win7 底下
https://github.com/espeak-ng/espeak-ng/releases
下載 espeak-ng.msi 並安裝
程式要在 cmd.exe 執行
來到 c:\Program Files\eSpeak NG 之類的
espeak-ng -v cmn-latn-pinyin -f from.txt -w to.wav
用 -f 是因為,在 cmd 底下的編碼會導致中文字讀取錯誤,from.txt 用 utf-8 編碼存檔,可以正確讀取
用 -w 是因為,在 cmd 底下執行時,聽不到聲音,要輸出為 wav 檔案,再用其他軟體播放
注音符號轉拼音對照表
ㄅ b
ㄆ p
ㄇ m
ㄈ f
ㄉ d
ㄊ t
ㄋ n
ㄌ l
ㄍ g
ㄎ k
ㄏ h
ㄐ j
ㄑ q
ㄒ x
ㄓ zh
ㄔ ch
ㄕ sh
ㄖ r
ㄗ z
ㄘ c
ㄙ s
ㄧ i
ㄨ u
ㄩ ü
ㄚ a
ㄛ o
ㄜ e
ㄝ ê
ㄞ ai
ㄟ ei
ㄠ ao
ㄡ ou
ㄢ an
ㄣ en
ㄤ ang
ㄥ eng
ㄦ er
---------------------------
raspberry pi 5
sudo apt install espeak
sudo apt install espeak-ng
espeak -v zh "六度萬heng4"
espeak-ng -v cmn-latn-pinyin "六度萬heng4"
假如你兩個都有安裝的話 pyttsx3 就會發生混亂現象!
用 python 播放 mp3 歌曲
import pygame
# 初始化混音器
pygame.mixer.init()
# 加載 MP3 文件
##pygame.mixer.music.load("E:\\temp\\20231204_music\\長月燼明\\14_界 - 袁娅维 Tia Ray电视剧长月烬明 OST MV桑酒 & 冥夜 Till The End Of The Moon.mp3")
##pygame.mixer.music.load("E:\\temp\\20231204_music\\又是吳海英OST.mp3")
pygame.mixer.music.load("E:\\temp\\20231204_music\\abc.mp3")
# 設置音量(範圍 0.0 - 1.0)
pygame.mixer.music.set_volume(0.5)
# 播放
pygame.mixer.music.play()
# 控制選項
while True:
command = input("輸入 p(暫停), r(恢復), s(停止), v(調整音量 0-1): ")
if command == "p":
pygame.mixer.music.pause()
elif command == "r":
pygame.mixer.music.unpause()
elif command == "s":
pygame.mixer.music.stop()
break
elif command.startswith("v"):
try:
volume = float(command.split()[1])
pygame.mixer.music.set_volume(volume)
except:
print("請輸入正確的數值 (範圍 0-1)!")
python 讀取 webcam 並置於最上層
請先安裝 pip install opencv-python
import cv2
# 開啟 webcam(0 代表預設攝影機)
cap = cv2.VideoCapture(0) # 在樹苺派5用這行
#cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 在 Windows 用這行 (會使用 DirectShow)
# 設定視窗名稱
window_name = "Webcam Feed - press q to quit"
# 建立視窗
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) # 使用者可以調整大小
cv2.resizeWindow(window_name, 160, 120) # 先給一個預設大小 160x120
# 設定視窗置頂
cv2.setWindowProperty(window_name, cv2.WND_PROP_TOPMOST, 1)
while True:
# 讀取攝影機畫面
ret, frame = cap.read()
if not ret:
break
# 顯示影像
cv2.imshow(window_name, frame)
# 按 'q' 鍵離開
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放攝影機資源
cap.release()
cv2.destroyAllWindows()