2023/01/17
[Linux] 相見恨晚 rsync 取代 cp 的複製指令
markdown
### 問題情境
在 Linux Server 傳輸檔案,絕大多數的使用情境是可以直接用有 UI 介面的工具透過 SFTP 傳輸檔案。
但有時會遇到僅有文字介面的遠端操作環境,即先遠端到客戶主機,然後用 SSH 連線到指定的 Server。
以前只會在文字介面下用 `cp` 複製的指令,但這個指令的問題點在於:
1. 不會覆蓋已存在的檔案,若要覆蓋需加 -i (interactive),但會一個一個詢問是否要覆蓋。一兩個檔案還沒什麼,當要更新的檔案很多時,操作上有點沒效率。
2. 若在 root 的權限操作下,會蓋掉原使用者及群組的權限 (這可是大件事啊...)
### 相見恨晚的 rsync
一直以為 rsync 只是用來同步用,透過跟社群朋友交流,發現它是有更新檔案覆蓋的功效,操作上跟 cp 類似,但是最棒的是可以保留指定使用者及群組權限,還可比對各檔案差異的傳輸狀況。
我目前的操作情境是把差異更新的檔案程式先下載到主機再做更新,所以只會做複製及更新檔案的動作,不做任何刪除檔案的異動。(若遇到真需要刪檔的時候,才再行確認手動刪除)
更新操作動作如下:
```
rsync -avh /source/update_folder/ /target/project_folder/
```
常用參數:
- `-v` : verbose 模式
- `-r` : recursive 遞迴所有子目錄下的目錄及檔案
- `-a` : 相當於 `-rlptgoD` 參數,遞迴備份所有子目錄下的目錄與檔案,保留連結檔、檔案的擁有者、群組、權限以及時間戳記
- `-z` : 使用壓縮
- `-h` : 將數字以比較容易閱讀的格式輸出
對應 cp 的類似的用法則是
```
cp -ia /source/update_folder/* /target/project_folder/
```
透過 rsync 來做檔案更新操作,真的是相見恨晚呀!rsync 還有更多強大的使用情境,待日後慢慢研究啦~
同場加碼 Windows 也可以使用 rsync (工具: [cwRsync](https://itefix.net/cwrsync))
### 參考資料
- [Linux 使用 rsync 遠端檔案同步與備份工具教學與範例](https://blog.gtwang.org/linux/rsync-local-remote-file-synchronization-commands/)
2023/01/16
[MySQL] 解決匯入資料時出現 Got a packet bigger than max_allowed_packet bytes 問題
markdown
### 問題
在 MySQL 匯入 *.sql 資料時出現 `[Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes` 的錯誤資訊。
### 解決方法
1. 修改 MySQL 設定檔案
在 [mysqld] 的設定區塊下加上 `max_allowed_packet=100M` 即可接受 100MB 以內的檔案 (預設為 16MB)
可依匯入的檔案大小做設定修改,最大值為 1GB,修改後必需重啟 Server 以生效
2. 不修改設定檔的狀況下,可在 Commandline 加上 `--max_allowed_packet` 參數設定
例如:
```
mysql --max_allowed_packet=100M -u root -p database < dump.sql
```
### 相關連結
- [mysql Client Options](https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_max-allowed-packet)
2022/12/27
[VS2022] 如何更新 IIS Express 開發憑證
markdown
### 前言
繼上回更新 ASP.NET Core 的開發憑證,恰巧 IIS Express 的本機開發憑證也到期了。今天就來解決如何更新 IIS Express 的開發憑證。
### 問題
今天在 Visual Studio 2022 執行 ASP.NET MVC 的網站時,出現 "根據驗證程序,遠端憑證是無效的。" 的錯誤訊息。檢查後發現原先本機的開發憑證已經到期了。
API 呼叫遠端憑證無效這件事,程式端也是有對應的解決方式,但是在不改程式的狀況下,啟用 https 網站的開發模式一定還是會遇到,先治本吧!
2022/12/18
[.NET] 更新信任 ASP.NET Core 開發憑證
markdown
### 前言
每年都要更新 ASP.NET Core 本機端自簽的開發憑證,剛好就在不久前憑證過期。透過剛結束的 [.NET Conf Taiwan 2022](https://dotnetconf.study4.tw/) 從保哥那裡學到一招更新方法。立即現學現賣。
### 過期的憑證
寫部落格的同時恰巧經歷了正常到過期的憑證變化。
```
$ dotnet dev-certs https --check --trust
```
原本的 `A valid certificate was found` 變成 `The following certificates were found, but none of them is trsuted.`
> 我的開發環境: Windows 10,若是其他的平台可以查詢 [Microsoft Learn - 使用 .NET CLI 產生自我簽署憑證](https://learn.microsoft.com/zh-tw/dotnet/core/additional-tools/self-signed-certificates-guide?WT.mc_id=DT-MVP-5002629) ### 更新步驟 1. 先清掉舊的憑竳 ``` $ dotnet dev-certs https --clean ``` 2. 再重新建立新憑證 ``` $ dotnet dev-certs https --trust ``` ### 見證更新過程 正常 -> 過期 -> 清除 -> 重建 -> 正常
### 相關資料 - [使用 .NET CLI 產生自我簽署憑證](https://learn.microsoft.com/zh-tw/dotnet/core/additional-tools/self-signed-certificates-guide?WT.mc_id=DT-MVP-5002629)
> 我的開發環境: Windows 10,若是其他的平台可以查詢 [Microsoft Learn - 使用 .NET CLI 產生自我簽署憑證](https://learn.microsoft.com/zh-tw/dotnet/core/additional-tools/self-signed-certificates-guide?WT.mc_id=DT-MVP-5002629) ### 更新步驟 1. 先清掉舊的憑竳 ``` $ dotnet dev-certs https --clean ``` 2. 再重新建立新憑證 ``` $ dotnet dev-certs https --trust ``` ### 見證更新過程 正常 -> 過期 -> 清除 -> 重建 -> 正常
### 相關資料 - [使用 .NET CLI 產生自我簽署憑證](https://learn.microsoft.com/zh-tw/dotnet/core/additional-tools/self-signed-certificates-guide?WT.mc_id=DT-MVP-5002629)
2022/12/11
[C#] 如何修正錯誤 CS1738 "named argument specifications must appear after all fixed arguments have been specified" 問題
markdown
### 問題
最近遇到客戶拿到原始碼在編譯過程出現 "CS1738 named argument specifications must appear after all fixed arguments have been specified" 錯誤
中文錯誤訊息 "CS1738 必須在所在固定引數皆已指定之後,具名引數規格才可出現。請使用語言版本 7.2 或更高的版本,以允許非後置的具名引數。"
- 開發環境: 使用 VS2022
- 客戶環境: 使用 VS2017
相同的程式,在 VS2022 下編譯沒有問題,而在 VS2017 卻遇到無法正確編譯。
程式大致如下:
```
context.MapRoute(
name: "MyRouteName",
url: "MyArea/News/{type}",
new { controller = "News", action = "TypeList" }
);
```
### 解決方法
1. 依照參數位置給予對應值, 不加任何具名引數 (把具名引數 `name:` 及 `url:` 都拿掉)
2. 把所有具名引數都加上去, 即第三個參數前須加上具名引數 `defaults:`
3. 更新 Visual Studio 到新版本 (需支援 C# 7.2 以上的版本)
### 相關連結
- [Named and Optional Arguments (C# Programming Guide)](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments?WT.mc_id=DT-MVP-5002629)
- [How to fix Error CS1738 Named argument specifications must appear after all fixed arguments have been specified](https://stackoverflow.com/questions/57062106/how-to-fix-error-cs1738-named-argument-specifications-must-appear-after-all-fixe)
2022/10/20
[.NET6] ASP.NET Core MVC 如何設定 routing 小寫英數字串的 URL
markdown
#### 前言
在 ASP.NET MVC 或是 ASP.NET Core MVC 預設的 Route 會自動指定 Controller 及 Action 名稱的路徑,因為我們都是用大寫英文,而自動生成的路徑也都是以大寫顯示,雖然在路徑上直接打小寫的也是可以連到指定的路徑,但是在網站生成的連結都是大寫來顯示。
原本在 ASP.NET MVC 我要特定指定小寫的做法會是在 RouteConfig 設定 `routes.MapMvcAttributeRoutes()` 並且在 Controller 指定 RoutePrefix 及 Route 屬性。
然而今天在查詢資料時才發現原來有更簡單的方法,而且很久很久以前就支援了。
雖然手邊目前執行的專案是 ASP.NET MVC,筆記就一併記錄目前最新的版本 ASP.NET Core MVC (.NET6)。
#### ASP.NET MVC
修改 `App_Start/RouteConfig.cs`
在所有的 routes 設定之前加上
```cs
routes.LowercaseUrls = true;
```
居然這麼簡單就設定完成了,完全不用再打開 Controller 一一指定。這個方法適用於不需特殊指定名稱,僅是把預設路徑皆改變為小寫。
### 方法二:指定 Route attribute
這個明確的指定方法是可以更客製化,哪天路徑名稱想改是可以把名稱任意改變的,例如加上 v1 或 v2
```cs
routes.MapMvcAttributeRoutes()
```
以 HomeController 為範例,直接指定小寫的字串 (/Home/Privacy 變成 /home/privacy)
```cs
[RoutePrefix("home")]
public class HomeController : Controller
{
[Route("privacy")]
public ActionResult Privacy()
{
return View();
}
}
```
#### ASP.NET Core MVC (.NET6)
修改 `Program.cs`,在
```cs
// 記得在 app build 之前加入此設定,把 LowercaseUrls 設為 true
builder.Services.Configure(options =>
{
options.LowercaseUrls = true;
});
var app = builder.Build();
```
而 Route 指定則是直接在 Controller 的 Action 上明確指定
以下範例路徑即會將預設的 /home/privacy 變為 /home/test
```
public class HomeController : Controller
{
[Route("home/test")]
public ActionResult Privacy()
{
return View();
}
}
```
#### 參考資料
- [RouteCollection.LowercaseUrls Property](https://learn.microsoft.com/en-us/dotnet/api/system.web.routing.routecollection.lowercaseurls?view=netframework-4.8&WT.mc_id=DT-MVP-5002629)
- [Attribute Routing in ASP.NET MVC 5](https://devblogs.microsoft.com/dotnet/attribute-routing-in-asp-net-mvc-5/?WT.mc_id=DT-MVP-5002629)
- [ASP.NET MVC 5 brings attribute based routing](https://www.computerworld.com/article/2705350/asp-net-mvc-5-brings-attribute-based-routing.html)
- [ASP.NET Core 中的路由至控制器動作](https://learn.microsoft.com/zh-tw/aspnet/core/mvc/controllers/routing?view=aspnetcore-6.0&WT.mc_id=DT-MVP-5002629)
- [How to enforce lowercase routes in .NET 6?](https://stackoverflow.com/questions/70572519/how-to-enforce-lowercase-routes-in-net-6)
2022/10/04
[Ubuntu] 解決在 Ubuntu 22.04 設定網路固定 IP 遇到的問題
markdown
### 前言
大部分接觸客戶的主機都是已經在完善的環境下操作,很少需要設定到跟硬體有關的部分
今日剛好遠端執行遇到,特地記錄一下
### 主機環境
- Hyper-V
- Ubuntu 22.04
主機是在 Hyper-V 下執行安裝 Ubuntu 22.04 的 VM
### 問題
準備遠端操作時被告知主機網路設定不正確,而在過程中遇到的主要錯誤問題有兩項
1. eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP>
2. `blk_update_request`:I/O error,dev fd0,sector0
### 解決方法
第一個 `eth0 NO-CARRIER`
因為是第一次在僅文字介面下實際設定網路,對這個錯誤訊息很陌生,但它是一個重要訊息關鍵字,查詢後得知它是因為跟實體網路為斷線狀態,告知網管後,立即排除網路連線問題
- [eth0 NO-CARRIER, ifconfig shows no IP address](https://askubuntu.com/questions/497850/eth0-no-carrier-ifconfig-shows-no-ip-address)
第二個 `blk_update_request:I/O error,dev fd0,sector0`
在套用網路設定,這個錯誤訊息一直出現,原來是因為 Hyper-V 會自動開啟軟碟機 (Floppy) 的驅動
執行 `sudo rmmod floppy` 就可以排除這個錯誤訊息
- [ubuntu 解決 blk_update_request i/o error dev fd0 錯誤訊息](https://m.xuite.net/blog/tolarku/blog/590009179)
### 操作指令
#### 查詢網卡及 IP 資訊
```
$ ip a
```
其中列出例如 eth0 的名稱, 此名稱為設定檔案時會需要用到的網卡名稱
- [Ubuntu manual - ip](https://manpages.ubuntu.com/manpages/jammy/man8/ip.8.html)
#### 設定固定 IP
```
$ sudo vi /etc/netplan/00-installer-config.yaml
```
在此放上範例檔案: (/usr/share/doc/netplan/examples/static.yaml)
```
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.10.10.2/24
nameservers:
search: [mydomain, otherdomain]
addresses: [10.10.10.1, 1.1.1.1]
routes:
- to: default
via: 10.10.10.1
```
註: 另外 Ubuntu 22.04 的設定把 gateway4 設定棄用了 (錯誤訊息: gateway4 has been deprecated, use default routes instead), 要改用 `routes`
- [Netplan - gateway has been deprecated](https://askubuntu.com/questions/1410750/netplan-gateway-has-been-deprecated)
- [netplan generate: gateway4 has been deprecated, use default routes instead](https://unix.stackexchange.com/questions/681220/netplan-generate-gateway4-has-been-deprecated-use-default-routes-instead)
#### 套用網路設定
在套用之前也可以用 `netplan try` 有 120 秒的後悔時間
```
$ sudo netplan apply
```
- [Ubuntu 22.04 network configuration](https://linuxconfig.org/ubuntu-22-04-network-configuration)
- [How to Configure Static IP Address on Ubuntu 22.04](https://tecadmin.net/how-to-configure-static-ip-address-on-ubuntu-22-04/)
訂閱:
文章 (Atom)

