## 蔣駿杰 linux的作業 ## Ubuntu 什麼是Ubuntu 簡單來說Ubuntu是一個GNU/Linux作業系統,就像你我平常在使用的微軟公司的Windows作業系統或Apple公司的Mac OS一樣,而這個作業系統也有用在伺服器系統上。那麼GNU與 Linux到底是什麼;GNU是一個計劃,主要是開發一套與Unix(一套作業系統)向上兼容的名為「GNU」(GNU's Not Unix)的完全自由的軟體系統,而前述中的"自由"這個單詞並不是指價格,而是可以自由的使用。您可以為得到GNU軟體付費,也可以不付。無論如何,一旦得到了軟體,您便擁有了使用它的三項指定的自由: 1.複製軟體並將其送給您的朋友和同事的自由。 2.通過對源碼的完全控制而可以隨意改變程序的自由。 3.發布改進的版本從而幫助建設社群的自由。(如果您再發布GNU軟體,您可以為傳遞拷貝過程中的物理行為收取一定的費用,您也可以贈送拷貝。) ![image](https://hackmd.io/_uploads/rk_-ASP_0.png) ## 權限類型 在 Linux 系統中,chmod、chown 和 ls -l 是三個非常常見且重要的命令,它們分別用來管理文件和目錄的權限、擁有者和查看文件的詳細信息。讓我們逐一介紹這些命令: 1. chmod — 改變文件的權限 例子 ``` 給所有者添加執行權限: chmod u+x file.txt 去除群組的寫入權限: chmod g-w file.txt 設置所有人具有讀取權限: chmod a=r file.txt ``` 2. chown — 改變文件的擁有者和群組 chown 用來改變文件或目錄的擁有者(user)和群組(group)。這對於管理多用戶系統中的文件和目錄非常重要。 例子 ``` 將文件的擁有者設為 alice,群組設為 staff: chown alice:staff file.txt 將文件的擁有者設為 alice,不改變群組: chown alice file.txt 將文件的群組設為 staff,不改變擁有者: chown :staff file.txt ``` 3. ls -l — 查看文件詳細信息 ls -l 是用來查看文件或目錄的詳細信息的命令。它會列出文件的權限、擁有者、群組、大小、修改時間等信息。 例子: ``` ls -l file.txt 輸出解釋: diff -rwxr-xr-- 1 alice staff 1234 Jan 29 12:34 file.txt ``` ## Linux 中的權限分為三種基本類型: 讀取 (r):允許查看文件內容或列出目錄內容。 寫入 (w):允許修改文件內容或添加、刪除目錄中的檔案。 執行 (x):允許執行文件(如果是程式)或進入並操作目錄。 2. 權限等級 Linux 系統中的權限是基於三個不同的權限等級設定的: 所有者 (Owner):文件或目錄的擁有者(通常是創建文件的用戶)。 群組 (Group):文件或目錄所屬的用戶組。該群組內的所有用戶共享對該文件的權限。 其他人 (Others):指非所有者且不屬於該文件群組的所有其他用戶。 這些權限會以 rwx 的形式顯示,分別表示「讀取」、「寫入」和「執行」。例如: rwxr-xr--: 第一部分 rwx 是 所有者 的權限。 第二部分 r-x 是 群組 的權限。 第三部分 r-- 是 其他人 的權限。 權限的顯示格式 當你使用 ls -l 命令列出文件或目錄時,會看到類似以下的權限顯示: ``` bash -rwxr-xr-- 1 owner group 1234 Jan 29 12:34 myfile ``` 這裡的第一欄顯示文件的權限: 第一個字母 (- 或 d) 表示文件類型: - 表示普通文件 d 表示目錄 接下來的三個字母 表示所有者的權限(rwx)。 接下來的三個字母 表示群組的權限(r-x)。 最後的三個字母 表示其他人的權限(r--)。 4. 權限數值表示法 Linux 也允許使用數字來表示文件權限,這是通過將每個權限類型對應的數值相加來實現的: 讀取權限 (r) = 4 寫入權限 (w) = 2 執行權限 (x) = 1 每個權限等級的數字會被加總: 所有者權限的數字(Owner) 群組權限的數字(Group) 其他人權限的數字(Others) 例如,rwxr-xr-- 可以轉換為: 所有者:rwx = 4 + 2 + 1 = 7 群組:r-x = 4 + 0 + 1 = 5 其他人:r-- = 4 + 0 + 0 = 4 因此,權限 rwxr-xr-- 就是數值 754。 5. 改變權限 你可以使用 chmod 命令來修改文件或目錄的權限。chmod 允許使用符號模式或數字模式來設置權限。 使用符號模式 ``` bash chmod u+x file.txt # 給所有者 (user) 增加執行權限 chmod g-w file.txt # 去除群組 (group) 的寫入權限 chmod o=r file.txt # 設定其他人 (others) 只有讀取權限 ``` 使用數字模式 ``` bash chmod 755 file.txt # 設定所有者擁有 rwx 權限,群組和其他人擁有 rx 權限 chmod 644 file.txt # 設定所有者擁有 rw 權限,群組和其他人擁有 r 權限 ``` 6. 改變擁有者和群組 你也可以使用 chown 命令來更改文件的所有者和群組: ``` bash chown owner:group file.txt # 設定文件的所有者和群組 chown owner file.txt # 只改變所有者 chown :group file.txt # 只改變群組 ``` 在 Linux 和類 Unix 系統中,sudo 是一個非常常用的命令,它讓普通用戶能夠以管理員(root 用戶)身份執行命令,從而獲得更高的權限。除了 sudo,還有許多其他相關命令和概念,這些都是用來管理系統的不同層面。讓我們詳細了解一下 sudo 以及其他常見命令和解釋。 ## 1. sudo — 以超級用戶身份執行命令 sudo 代表 "superuser do"(超級用戶執行)。它使得普通用戶能夠執行通常需要根(root)權限的命令,而無需直接登錄為 root 用戶 ## 2. root 用戶與 sudo 的關係 root 用戶:是 Linux 系統中的超級用戶,擁有對系統的所有權限,可以執行任何操作。直接使用 root 用戶執行命令會讓你獲得最高級別的控制權限。 sudo:不需要直接登錄為 root 用戶,而是通過 sudo 提升當前用戶的權限來執行需要高權限的操作。這樣做的好處是可以限制 root 權限的濫用,並且每次使用 sudo 都會有審計記錄。 ``` sudo:用來以 root 或其他用戶的身份執行命令,避免直接登錄為 root,用戶需要輸入當前用戶的密碼。 su:用來切換到指定用戶(通常是 root)並執行命令,切換後需要提供目標用戶的密碼。 chmod:用來修改文件或目錄的權限,讓用戶控制誰可以讀、寫或執行文件。 chown:用來修改文件的擁有者和群組。 ls:用來列出目錄中的文件和子目錄,並可以顯示詳細的文件信息。 ps:用來查看當前系統中運行的進程。 ``` ## 第一題 搜尋python3開頭 ```bash $ apt-cache search python | grep '^python3' ``` ## 第二題 顯示時間 過濾出包含 `datetime` 的行 使用 `cut` 命令,以 `T` 為分隔符,提取第二部分,時間時區信息 再次使用 `cut` 命令,以 `+` 分隔符,提取時間部分,去掉時區信息 最后使用 `cut` 命令,以 `.` 為分隔符,去掉毫秒部分,僅保留 `HH:MM:SS`。 `watch` 命令每隔 5 秒運行一次指定的命令 ```bash curl -s http://worldtimeapi.org/api/timezone/Asia/Taipei.txt | grep '^datetime:' | awk -F'T' '{print $2}' | cut -d'.' -f1 watch -n 5 'curl -s http://worldtimeapi.org/api/timezone/Asia/Taipei.txt | grep datetime | cut -d "T" -f 2 | cut -d "+" -f 1 | cut -d "." -f 1' 擷取 24-31僅保留 `HH:MM:SS` [watch] 是一個可以定期執行指令 -n 1 每隔0.1秒間看 echo $(curl -s http://worldtimeapi.org/api/timezone/Asia/Taipei | cut -d, -f 3|cut -c 24-31 ) watch -n 1 "curl -s http://worldtimeapi.org/api/timezone/Asia/Taipei | cut -d, -f 3|cut -c 24-31" ``` ## 第三題 將台積電股票資訊爬下來 網址: https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw&json=1&delay=0&_=1635167108897 回傳的JSON欄位說明: 欄位名稱 描述 z 當前盤中成交價 tv 當前盤中盤成交量 v 累積成交量 b 揭示買價(從高到低,以_分隔資料) g 揭示買量(配合b,以_分隔資料) a 揭示賣價(從低到高,以_分隔資料) f 揭示賣量(配合a,以_分隔資料) o 開盤價格 h 最高價格 l 最低價格 y 昨日收盤價格 u 漲停價 w 跌停價 tlong 資料更新時間(單位:毫秒) d 最近交易日期(YYYYMMDD) t 最近成交時刻(HH:MI:SS) c 股票代號 n 公司簡稱 nf 公司全名 注意 爬下來的資料請透過管線給jq指令做格式化,比較容易拆解資料。 請抓取nf欄位和z欄位資訊,然後組成結果如下: 台灣積體電路製造股份有限公司 今日價格: 838 ``` 使用 `jq` 處理 JSON 數據,並使用 `-r` 來輸出原始字符串 使用 `jq` 的字符串插值功能,提取 `nf`(公司全名)和 `o`(開盤價)字段,並格式化輸出。 JSON 中提取 `msgArray` 數组中的每個元素 ```bash ``` ![螢幕擷取畫面 2024-05-31 132914](https://hackmd.io/_uploads/ryV5NSrHA.png) curl -s 'https://mis.twse.com.tw/stock/api/get StockInfo.jsp?ex_ch=tse_2330.tw&json=1&delay=0&_=1635167108897' | jq -r '.msgArray[] | "\(.nf) 今日價格: \(.o)"' ## 第四題 取得目前目錄下全部的子目錄和檔案佔據的硬碟空間,並以下面的格式顯示 此目錄檔案總大小為: 185M 提示: 可以使用du指令計算 dh檔案顯示 h資料大小 tail -1` 從du -h` 的輸出中提取最後一行 cut -f 1獲取tail -1提取的最後一列 $執行括號中的命令 echo印出 ```bash echo "此目錄檔案總大小為: $(du -h | tail -1 | cut -f 1)" ``` ![image](https://hackmd.io/_uploads/ByNaSkG8R.png) ## 第五題 ###### get_google_trend.sh ``` 從google trends抓取熱門搜尋排行榜資料,並以下面格式輸出到畫面上: 林雅各:1000+ 趙天麟:1000+ 魔獸:1000+ 黃仁勳:5萬+ MBTI:5萬+ 內田有紀:1萬+ Popeyes:1萬+ 台灣野馬隊:5000+ 李西河:5000+ 李海魯肉飯:5000+ 炎亞綸:2000+ 廣達:2000+ 長庚大學:2000+ 張學友:2000+ 東海大學:2000+ 中興大學:2000+ 雷驤:2000+ T1:2000+ 東吳大學:2000+ TAT:2000+ 噩盡島:2000+ MSCI 調整:1000+ 今永昇太:1000+ Google Trends資料抓取curl指令 ``` ![LINE_ALBUM_程式紀錄_240611_3](https://hackmd.io/_uploads/BkssZrHrR.jpg) ![427989733_3367719686705131_3926148466420266097_n](https://hackmd.io/_uploads/ByWXfHBrR.jpg) ![image](https://hackmd.io/_uploads/H1T8MJfUC.png) 我想說明 ```bash curl -s 'https://trends.google.com/trends/api/dailytrends?hl=zh-TW&tz=-480&geo=TW&hl=zh-TW&ns=15' -H 'accept: application/json, text/plain, */*' -H 'accept-language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7' -H 'cookie: __utmc=10102256; __utma=10102256.1988690101.1717122572.1717122582.1717124682.2; __utmz=10102256.1717124682.2.2.utmcsr=trends.google.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmt=1; __utmb=10102256.2.9.1717124699155; SEARCH_SAMESITE=CgQIm5sB; AEC=AQTF6HxX-R9ngeztx-zrIwJTfvmFSLN9rTvkfN4O25Q1PskDRAc6PYsKfSk; NID=514=i4H9axvH-OMMwM0VPNqAgrbQxLw9PtToEHwpe9CaoQ_cgNip9k7bhLdpcu1r9SH4xvndMse2zw8OQT63tTwF-CfJLzYUT559XM5FUoTKHbZ8H0VCaudYzYO6ywwUkmUcvvmAGZXKQFV3dWgjGT3Ns8TWjT7OnGIWOsWnyKUFhnzLbWY4e9Ixb4pG2ZvPV8Kq_IjWQAHc1Qro_u6SETkX6hNfUNd8EqBQG47voaopVYFgRc8jlWqPVyVEbpaFEeRXCwgJtisy5ok8-gdUs7sX4sOaFE9sfsr7sSZUMU2Lw3-7pvA1VFA8ZvOuXpge; _gid=GA1.3.377492726.1717122573; 1P_JAR=2024-05-31-03; OTZ=7580345_24_24__24_; _ga=GA1.3.1988690101.1717122572; _ga_VWZPXDNJJB=GS1.1.1717122571.1.1.1717124894.0.0.0' -H 'priority: u=1, i' -H 'referer: https://trends.google.com/trends/trendingsearches/daily?geo=TW&hl=zh-TW' -H 'sec-ch-ua: "Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"' -H 'sec-ch-ua-arch: "x86"' -H 'sec-ch-ua-bitness: "64"' -H 'sec-ch-ua-full-version: "125.0.6422.113"' -H 'sec-ch-ua-full-version-list: "Google Chrome";v="125.0.6422.113", "Chromium";v="125.0.6422.113", "Not.A/Brand";v="24.0.0.0"' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-model: ""' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-ch-ua-platform-version: "10.0.0"' -H 'sec-ch-ua-wow64: ?0' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-origin' -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' -H 'x-client-data: CIS2yQEIorbJAQipncoBCPbuygEIlqHLAQiFoM0BCN3uzQEIpYrOAQjik84BCOiTzgEI4pfOAQjUmM4BGPXJzQE=' > googletrends.txt cat googletrends.txt | tail +2 | jq | grep query | grep -v " " | cut -c 25- | tr -d "\"," > 1.txt cat googletrends.txt | tail +2 | jq | grep formattedTraffic | cut -c 34- | tr -d "\"," > 2.txt paste -d: 1.txt 2.txt > 3.txt cat 3.txt ``` > **備註:** > 小心被Google ## 第六題 ![image](https://hackmd.io/_uploads/r1IsgGcBR.png) ![LINE_ALBUM_程式紀錄_240611_2](https://hackmd.io/_uploads/HJH9ZHHHC.jpg) ![LINE_ALBUM_程式紀錄_240611_1](https://hackmd.io/_uploads/HyJtZHBSA.jpg) ``` echo "現在氣溫: $(curl -s -X 'GET' 'https:/ /opendata.cwa.gov.tw/api/v1/rest/datastore/O-A0001-001?Authorization=CWA-AC4D5 FC7-3E97-43F6-AEB0-CBAD45145C74&StationId=C0C700&WeatherElement=AirTemperature ' -H 'accept: application/json' |jq |grep '"AirTemperature":'|cut -c 29-33)" ; echo "目前降雨率: $(curl -s -X 'GET' 'https://opendata.cwa.gov.tw/api/v1/ rest/datastore/O-A0001-001?Authorization=CWA-AC4D5FC7-3E97-43F6-AEB0-CBAD45145 C74&StationId=C0C700&WeatherElement=Now' -H 'accept: application/json' |jq | grep '"Precipitation":'|cut -c 29-33)";echo "目前天氣: $(curl -s -X 'GET' 'h ttps://opendata.cwa.gov.tw/api/v1/rest/datastore/O-A0001-001?Authorization=CWA -AC4D5FC7-3E97-43F6-AEB0-CBAD45145C74&StationId=C0C700&WeatherElement=Weather' -H 'accept: application/json' |jq |grep '"Weather":'|cut -c 22-23)" ``` 操作影片 https://www.youtube.com/watch?v=6K_NuTeN5SI&t=141s ## 第七題 提示用户輸入數據 將入數據存到temp.txt檔中 從temp文件中讀取數據 echo顯示您输入的資料是 xxxxx ``` read -p "請输入數據: " user_input echo "$user_input" > temp.txt content=$(cat temp.txt) echo "您输入的資料是: $content" ``` user_input 存入變數 到temp_file=(mktemp)到建立暫存檔案 顯示echo "user_input" > "temp_file暫存檔 導入顯示echo "您输入的資料是 temp_file數據 ``` read -p "請输入數據: " user_input; temp_file=$(mktemp); echo "$user_input" > "$temp_file"; echo "您输入的資料是: $(cat "$temp_file")" ``` ## 第八題 ![螢幕擷取畫面 2024-06-03 152217](https://hackmd.io/_uploads/BkvMeHrrR.png) ![螢幕擷取畫面 2024-06-03 150113](https://hackmd.io/_uploads/HJuPfBHBC.png) #生成1到20隨機數 #提示用戶輸入猜測的數字 檢查用户輸入的數字是否為20 ``` #!/bin/bash random_number=$(( RANDOM % 20 + 1 )) echo "請輸入一個1到20之間的數字: " read user_guess if [ "$user_guess" -eq 20 ]; then echo "答對了" else echo "答錯再接再厲" fi ``` ## 第九題 ![螢幕擷取畫面 2024-06-03 133527](https://hackmd.io/_uploads/H15hkHrSR.png) ![螢幕擷取畫面 2024-06-03 134759](https://hackmd.io/_uploads/HJ-01SHrR.png) ![螢幕擷取畫面 2024-06-04 101527](https://hackmd.io/_uploads/BkS4lrrrC.png) ![未命名](https://hackmd.io/_uploads/HkEmEHrHC.png) ``` #!/bin/bash read -p "請輸入搜尋站台名稱: " user remain=$(grep "$user" ubike.csv | cut -d, -f2) available=$(grep "$user" ubike.csv | cut -d, -f2) if [ "$remain" -lt 10 ]; then echo "請同學加快腳步喔." else echo "超過10量還很多,慢慢來." fi echo "站台: $user" echo "剩餘數量: $remain" echo "可借數量: $available" ``` ![image](https://hackmd.io/_uploads/ryidpRZI0.png) ``` #!/bin/bash # 讀取站台 read -p "請輸入搜尋站台名稱: " user # 查找指定站台的信息 station_info=$(grep "$user" ubike.csv) # 檢查是否找到站台 if [ -z "$station_info" ]; then echo "無此站台" elif [ "$(echo "$station_info" | wc -l)" -gt 1 ]; then echo "多個匹配站台,請更具體" else # 獲取站台數量可借數量 remain=$(echo "$station_info" | cut -d, -f13) available=$(echo "$station_info" | cut -d, -f14) # 顯示站台名稱、剩餘數量和可借數量 echo "站台: $user" echo "剩餘數量: $remain" echo "可借數量: $available" # 檢查剩餘數量是否小於 10,並顯示相應的提示 if [ "$remain" -lt 10 ]; then echo "請同學加快腳步喔." else echo "超過10量還很多,慢慢來." fi fi ``` ![螢幕擷取畫面 2024-06-04 101854](https://hackmd.io/_uploads/r1lUSBSHR.png) ![image](https://hackmd.io/_uploads/HylXTA-L0.png) ## 第十題 ![未命4](https://hackmd.io/_uploads/BJKrESBHR.png) ``` !/bin/bash if [ -z "$1" ]; then echo '請輸入要查詢帳號' exit 1 fi # 用戶信息寫入 who.log who > who.log # 使用 csvtool 和 grep 查找用戶 result=$(csvtool -t " " col 1 who.log | uniq | grep "^$1$") # 檢查 result 變量是否為空 if [ -z "$result" ]; then echo "$1 不在線上" else echo "$1 正在開心聊天" fi ``` ![螢幕擷取畫面 2024-06-03 114746](https://hackmd.io/_uploads/B1GOyHHBA.png) ## 第十一題 初始化一個數组來存儲用戶輸入的數字 寫一程式,讓使用者輸入任意個數字,輸入quit可以結束輸入,當結束的時候,把使用者輸入的數字全部顯示出來 ``` /bin/bash numbers=() echo"=======================================================" echo 'hello' echo"=======================================================" echo "炸彈密碼" # 進入一個無限循環來讀取用戶輸入 while true; do read -p "請輸入數字(quit 結束): " input # 檢查用戶是否輸入了 "quit" if [ "$input" == "quit" ]; then break fi # 將輸入的數字添加到數组中 numbers+=("$input") done # 輸出所有輸入的數字 echo "您輸入的密碼是: ${numbers[@]}" ``` ## 第十二題 ``` #!/bin/bash for a in * do if [ -f "$a" -a -x "$a" ]; then echo "$a 是執行檔" fi done ``` ## 第十三題 寫一程式,可以在畫面上輸出指定層數的聖誕樹 例如: $ tree.sh 5 會顯示 ``` * ** *** **** ***** ``` ![未命名.4](https://hackmd.io/_uploads/SydsHrrrC.jpg) ``` for i in $` seq 1 1 $1` do for j in `seq 1 1 $i` do printf '*' done printf '\n' done ``` 聖誕樹 ``` height=10 for ((i = 1; i <= height; i++)) do for ((j = i; j < height; j++)) do ``` ## 第十四題 寫一程式,可以顯示九九乘法表如下: ``` 2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 5 x 1 = 5 2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10 2 x 3 = 6 3 x 3 = 9 4 x 3 = 12 5 x 3 = 15 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16 5 x 4 = 20 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 1 = 6 7 x 1 = 7 8 x 1 = 8 9 x 1 = 9 6 x 2 = 12 7 x 2 = 14 8 x 2 = 16 9 x 2 = 18 6 x 3 = 18 7 x 3 = 21 8 x 3 = 24 9 x 3 = 27 6 x 4 = 24 7 x 4 = 28 8 x 4 = 32 9 x 4 = 36 6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 6 x 6 = 36 7 x 6 = 42 8 x 6 = 48 9 x 6 = 54 6 x 7 = 42 7 x 7 = 49 8 x 7 = 56 9 x 7 = 63 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64 9 x 8 = 72 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81 ``` ``` for ((i = 1; i <= 9; i++)) do for ((j = 1; j <= 9; j++)) do printf "%d*%d=%2d\t" $i $j $((i * j)) done echo done ``` ![image](https://hackmd.io/_uploads/rJl6UJzI0.png) ![image](https://hackmd.io/_uploads/rJ2gzkzLR.png) ## BeautifulSoup台灣銀行匯率 ``` import requests from bs4 import BeautifulSoup import csv import time # Taiwan Bank exchange rate URL url = 'https://rate.bot.com.tw/xrt?Lang=zh-TW' # Step 1: Fetch the HTML content from the website response = requests.get(url) # Step 2: Parse the HTML content using BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') # Step 3: Extract exchange rate data result = [] # Find all rows in the table body (exchange rates are inside the tbody) trs = soup.tbody.find_all('tr') # Iterate over each row in the table for i in trs: rate = [] # Currency name (like USD, EUR, etc.) currency = i.td.div.find_all('div')[1].text.strip() print(currency) # Print the currency name rate.append(currency) # Find the different exchange rates for data_table in ['本行現金買入', '本行現金賣出', '本行即期買入', '本行即期賣出']: # Find the exchange rate by searching for the correct data-table attribute flag = i.find(attrs={'data-table': data_table}) rate_value = flag.text.strip() if flag else 'N/A' print(f' - {data_table}: {rate_value}') # Print the exchange rate rate.append(rate_value) # Add the extracted data to the result list result.append(rate) # Step 4: Save the data to a CSV file # Generate a filename based on the current date and time filename = time.strftime('%Y%m%d_%H%M%S.csv') with open(filename, 'w', encoding='utf-8', newline='') as file: writer = csv.writer(file) # Write headers to the CSV file writer.writerow(['幣別', '本行現金買入', '本行現金賣出', '本行即期買入', '本行即期賣出']) # Write the exchange rate data to the CSV file writer.writerows(result) print(f"Exchange rates have been saved to {filename}") ``` ## AI生成圖 ** openart** ![image](https://hackmd.io/_uploads/SyNOwDJUC.png) ![image](https://hackmd.io/_uploads/Sk7GSw1UC.png) The output image will have the same aspect ratio ![image](https://hackmd.io/_uploads/SkhKYDyI0.png) ![image](https://hackmd.io/_uploads/Sy7LtD1LC.png) ![image](https://hackmd.io/_uploads/rkvXIPk8R.png) ![image](https://hackmd.io/_uploads/rkQZDPk80.png) ![image](https://hackmd.io/_uploads/HJuEUwJUA.png) ![image](https://hackmd.io/_uploads/SyKrLvkU0.png) ![image](https://hackmd.io/_uploads/rytU8DJ8A.png) ## leonardo ai ![image](https://hackmd.io/_uploads/BJR58PkUC.png) ![image](https://hackmd.io/_uploads/SkNnLv1U0.png) ![image](https://hackmd.io/_uploads/ryT_8w1UR.png) ![image](https://hackmd.io/_uploads/HyOFLvk8C.png) ![image](https://hackmd.io/_uploads/BJzqLPk8R.png) ## git版本控制 參考 https://w3c.hexschool.com/git/b9be5b1e github 本地端 ![image](https://hackmd.io/_uploads/HyHYvacwA.png) 遠端 ![image](https://hackmd.io/_uploads/SJ2iwp5vC.png) ## python 控制瀏覽器 關機 ``` import subprocess # 打開檔案總管 subprocess.run('explorer') # 打開Chrome並前往Yahoo subprocess.run('C:\Program Files\Google\Chrome\Application\chrome.exe https://www.yahoo.com.tw') # 關機 subprocess.run('shutdown /s') ``` ## Git 指令來新增版本 開新資料夾,git init 建立數據庫 新增一個 ind.txt 檔案 這時,您可以輸入 git status 指令去查看 Git 偵測到你有新增這筆檔案,但尚未是 Git 追蹤的對象。 所以必須先將它加入到 (索引)裡 Changes to be committed的意思是,放在索引的檔案即將會被提交成一個新版本(commit)。 此時可以透過以下指令,來提交一個新版本。 git commit -m "<填寫版本資訊>" 所以這裡我就輸入git commit -m "新增網頁"來提交版本後,系統如果回饋以下訊息,就恭喜你,你透過 Git 建立出第一個版本出來了。 簡易版 開新資料夾,git init 建立數據庫 新增一個 ind.txt 檔案 加入索引:git add . 提交版本:git commit -m "新增網頁" 觀看歷史紀錄:git log,並會看到一個版本紀錄 ![image](https://hackmd.io/_uploads/ByoEsLSt0.png) git remote add <url>:在本地端數據庫,添加遠端數據庫 git push <數據庫簡稱> <分支名稱>:更新遠端數據庫資料 查看遠端倉庫的資訊 指令: git remote -v 功能: 顯示已配置的遠端倉庫。 GitHub 上建立遠端數據庫,再 clone 下來 在 GitHub 建立了一個遠端數據庫 使用 git clone <url> 指令,抓取一份數據庫下來在本地 新增了兩個 commit 在本地數據庫 使用 git push origin master 指令推送到 GitHub 更新 ## 簡化加入本地數據庫的方法: 新建本地數據庫(Local Repository 只需要新建一次就好) ``` git init ``` 將檔案移入索引中 ``` git add . ``` 將索引內的檔案提交至本地數據庫 ``` git commit -m "message" ``` 加入遠端數據庫(GitHub)的方法: 先自行新建好 GitHub 的 Repository,開啟終端機,在該目錄下輸入以下指令 # 這行指令只需要輸入第一次即可 ``` git remote add origin <your url> ``` # 分支 ``` git branch -M main ``` ``` git push -u origin main ``` 所以當接下來有新增檔案 或是 修改檔案時,只需要執行以下幾個步驟即可: ``` git add . git commit -m "message" git push -u origin main ``` 而幾個較常用來查看 Git 的指令: 當檔案還在檔案(File) 與索引(Index) ``` git status ``` 當檔案已經加入本地數據庫(Local Repository) ``` git log ``` https://youtu.be/F-IXLMQZAP0