# About Me

關於我

## 聯絡我

* Name：Guan-Lin
* E-Mail：<allen@ggl.tw>&#x20;
* GitHub：[gglin928](https://github.com/gglin928)&#x20;
* Linkedin：[gglin289](https://www.linkedin.com/in/gglin928)&#x20;

### 技能概覽

* **PHP**：精通網頁設計與開發。
* **Python**：爬蟲及資料擷取腳本的開發。
* **Ragic**：Ragic資料庫開發的認證夥伴。

### 技術技能

* **網域規劃與註冊代管**：擅長規劃及管理網域註冊。
* **客製化POS系統**：擁有設計和開發客製化POS系統的專長。

### 領域專長

* 提供客戶針對特定需求的系統


# Bank Account

銀行帳號

{% tabs %}
{% tab title="391 一卡通" %}

```
1501689533
```

<figure><img src="/files/yv1dSQ0lmaSGaFb7Sp2S" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="812 台新銀行" %}

```
28881004348292
```

<figure><img src="/files/DTndqr6V2OsdBgwckFjO" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="822 中國信託" %}

```
901560501232
```

<figure><img src="/files/HyDEJfWnX2DXgxAMPgQo" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="824 連線銀行" %}

```
111000006954
```

<figure><img src="/files/9WqUzFhoWIOke5rw8Tb5" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

<details>

<summary>共通 QR Code 標準</summary>

基本上這個共通 QR 標準的編碼方式如下:&#x20;

```
TWQRP://銀行自己取的服務名稱/國家代碼/交易類別/V1?各類交易參數 
```

國家代碼以 ISO 3166 的三位數代碼作為標準，台灣是 158 \
詳參: <https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes>

### 交易類別&#x20;

* 01 = 掃碼收付 (金融卡smart pay)
* 02 = 轉帳類交易
* 03 = 繳費類交易&#x20;

### 交易參數&#x20;

* D1 = 金額 格式為XXXXXXX00 (最多七位數，後方補小數兩位0)&#x20;
* D2 = 訂單編號&#x20;
* D3 = 交易驗證碼&#x20;
* D4 = 繳費期限(帳單上所列之期限) 格式為 YYYYMMDD&#x20;
* D5 = 轉入銀行代碼 (3位數)&#x20;
* D6 = 轉入銀行帳號 (16位數，不足前方補0)&#x20;
* D7 = 銷帳編號&#x20;
* D8 = 服務名稱 (店家收單名稱)&#x20;
* D9 = 附言欄&#x20;
* D10= 交易幣別 (ISO 4217的三位數幣別代碼，未填寫則預設為 901新台幣) \
  詳見: <https://en.wikipedia.org/wiki/ISO_4217>&#x20;
* D11= 收單銀行及其註記欄位&#x20;
* D12= 繳費期限 (超過這個日期則QR Code失效) 格式為YYYYMMDDHHMMSS&#x20;
* D14= 電子發票載具&#x20;
* D15= 手續費 (一樣要補兩位小數0，但這個只是顯示在交易確認頁面上的手續費 實際上不管你改成多少，還是會按照原標準收費)&#x20;
* D16= 費用名稱&#x20;
* D20= 備用欄位&#x20;
* D97= QR條碼產生時間&#x20;
* D98= ?????&#x20;
* D99= 某種檢算碼...&#x20;

D類參數一旦給定，轉帳者不可任意變更，但若改用M類參數，則可以在轉帳時自己修改。 例如 M1=金額、M9=附言欄、M14=電子發票載具...... 舉例來說，想要轉帳到 PTT 銀行(銀行代碼001)，帳號598759875987，金額3254 其 QR Code 編碼為:&#x20;

```
TWQRP://這裡隨便要打甚麼都可以/158/02/V1?D1=325400&D5=001&D6=000598759875987
```

</details>


# Linux

<details>

<summary>Reboot 重新啟動</summary>

```sh
$ sudo reboot
$ last -x reboot
```

</details>

<details>

<summary>Apt</summary>

```sh
sudo apt update
apt list --upgradable
```

</details>

<details>

<summary>Python</summary>

```sh
sudo apt install python3-pip
pip3 --version
pip3 install requests
pip3 install bs4
```

</details>

<details>

<summary>Crontab 定時任務</summary>

依序是分鐘(0-59), 小時(0-23), 日期(1-31), 月份(1-12), 星期(0-6), command&#x20;

* 星期參數為0代表星期日

```sh
$ crontab -l: 列出該使用者擁有的 crontab 指令
$ crontab -e: 編輯該使用者的 crontab 指令
$ crontab -r: 將使用者的 crontab 全部清除！（ 小心使用 ）
```

```sh
0 */8 * * * /usr/bin/python3 /home/user/FamilyMart.py
30 */8 * * * /usr/bin/python3 /home/user/OK_Mart.py
0 18,22 * * 1-5 /usr/bin/python3 /home/user/Shopee_Get_Logistics.py
```

</details>

<details>

<summary>Traceroute 追蹤路由</summary>

```sh
apt-get install traceroute
traceroute www.ggl.tw
```

</details>

<details>

<summary>Timedatectl 時區設定</summary>

```shell
sudo timedatectl set-timezone Asia/Taipei
```

</details>


# PHP

<details>

<summary>PDO 資料庫連結</summary>

### 連結資料庫

```php
try {
    $Connection = new PDO('mysql:host=localhost;dbname=資料庫名稱;charset=utf8', '使用者帳號', '使用者密碼');
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit;
}
```

## 讀取資料

```php
$Customer = $Connection->query("SELECT * FROM `表格名稱` 
WHERE `Name` LIKE '查詢條件' 
or `Phone` LIKE '查詢條件'")->fetchAll(PDO::FETCH_ASSOC) 
```

## 編輯資料

```php
$stmt = $Connection->prepare("UPDATE `Customer` SET `Name`=?, `Phone`=?, `Address`=?, `Remarks`=? WHERE `ID` LIKE ?")    
->execute([
	$_POST['Name'],
	$_POST['Phone'],
	$_POST['Address'],
	$_POST['Remarks'],
	$_POST['ID']
]);

if ($stmt) {
	$Json['Status'] = "Ok" ;
	$Json['Msg'] = $_POST['ID'] ;
} else {
	$Json['Status'] = "Error" ;
	$Json['Msg'] = "失敗" ; 
}
```

## 創建資料

```php
$Query = $Connection->prepare("INSERT INTO `Customer` (`ID`, `Name`, `Phone`, `Address`, `Remarks`, `Create_Time`) VALUES (?, ?, ?, ?, ?, ?)");
$Fetch = $Query->execute([
  $Microtime,
  $_POST['Name'],
  $_POST['Phone'],
  $_POST['Address'],
  $_POST['Remarks'],
  date('Y/m/d H:i:s')
]);
$Count = $Query->rowCount();

if ($Count) {
  $Json['Status'] = "Ok" ;
  $Json['Msg'] = $Microtime ;
} else {
  $Json['Status'] = "Error" ;
  $Json['Msg'] = "失敗" ;
}
```

</details>

<details>

<summary>JSON 陣列轉換</summary>

## Json To Array

```php
// 定義要處理的字串
$Json = '["A","B","C"]';
print_r(json_decode($Json, True));
// 輸出：Array ( [0] => "A" [1] => "B" [2] => "C")
```

## Array To Json

```php
// 定義要處理的字串
$Array = array("A", "B", "C");
echo json_encode($Array); // 輸出：["A","B","C"]
```

</details>

<details>

<summary>Count 統計陣列數量</summary>

```php
count(array())
```

</details>

<details>

<summary>Preg_replace 移除括號內內容</summary>

```php
// 定義要處理的字串
$str = '[路竹中山店] 買家取件成功';

// 使用 preg_replace() 函數和正規式匹配括號內內容
$pattern = '/\[(.*?)\]/';
$replacement = '';
$new_str = preg_replace($pattern, $replacement, $str);

// 輸出處理後的字串
echo $new_str; // 輸出：買家取件成功
```

</details>

<details>

<summary>Number_format 數字千分位逗號分隔函數</summary>

```php
// 定義要處理的字串
$number = 1234.56;

// 英文表示法(默認)
$english_format_number = number_format($number); // 輸出：1,235

// 英文表示法，不帶千分位
$english_format_number = number_format($number, 2, '.', ''); // 輸出：1234.56

//中文最常用的表示法,千分位為','，浮點分割為'.',保留兩位浮點數
$chinese_format_number = number_format($number,2,'.',','); // 輸出：1,234.56
```

</details>

<details>

<summary>Foreach 陣列迴圈</summary>

```php
foreach ($Array as $Key => $Value) {
    echo $Value
}
```

</details>

<details>

<summary>Switch</summary>

```php
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
        echo "i is not equal to 0, 1 or 2";
}
```

</details>


# SQL

## 日期時間

{% tabs %}
{% tab title="今天" %}

```sql
CURDATE() // 輸出：2024-01-01 01:02:03
```

{% endtab %}

{% tab title="取出日期" %}

```sql
DATE('2003-12-31 01:02:03') // 輸出：2003-12-31
```

{% endtab %}

{% tab title="取出時間" %}

```sql
TIME('2003-12-31 01:02:03') // 輸出：01:02:03
```

{% endtab %}
{% endtabs %}

## 字串處理

{% tabs %}
{% tab title="擷取" %}

```sql
SUBSTRING('www.ggl.tw', 5, 3) // 輸出：ggl
```

{% endtab %}

{% tab title="合併" %}

```sql
CONCAT('M','y','S','Q','L') // 輸出：MySQL
```

{% endtab %}
{% endtabs %}

<details>

<summary>JSON</summary>

```sql
SELECT sentence->>"$.mascot"
```

</details>

<details>

<summary>查詢限制</summary>

```sql
LIMIT 3,5 // 第三筆資料開始回傳五筆資料
```

</details>


# Google Apps Script

<details>

<summary>Send Email</summary>

```javascript
function doPost(e) {
  var param = e.parameter ;
  var title = '' ;
  var body = '' ;
  switch (param.Order_Status)  {
    case "新成立":
      title = "新訂單成立" ;
      body = "如有現貨，寄貨時間為1~3天內。" ;
      break;
    case "缺貨中":
      title = "品項缺貨中" ;
      body = "﹝目前訂單內品項尚有缺貨﹞" ;
      break;
    case "已完成":
      title = "訂單已完成" ;
      body = "感謝您本次購買<br>如使用商品符合您的期待<br>歡迎再次回購<br>購物網站：<br>https://jay.twl.ink/" ;
      break;
    case "取消單":
      title = "訂單已取消" ;
      body = "取消原因：" + param.Order_Remarks ;
      break;
    default:
      title = "";
      break;
  }
  try {
    MailApp.sendEmail({
      name: "Jay 管理系統",
      to: param.Client_Email,
      bcc: "jay@1oe0.com",
      replyTo: "jay@1oe0.com",
      subject: "小傑的賣場﹝" + title + "﹞",
      htmlBody: "<p>" + param.Client_Name + " 您好，訂單資訊如下</p>"+
                "<p>訂單編碼：" + param.Orders_ID +
                "<br>下單時間：" + param.Time_Create +
                "<br>目前狀態：" + param.Order_Status +
                "</p><p>" + body + "</p>" +
                "<a href=\"https://jay.1oe0.com/Data.php?SID=" + param.Orders_ID + "\" target=\"_blank\"> 點我查看訂單 </a>" +
                "<p>此為系統自動發送，請勿直接回覆。</p>"+
                "<p>若您對訂單有任何問題，歡迎透過客服信箱：<br>jay@1oe0.com<br>或者聯絡本人Instagram：<br>https://www.instagram.com/_____28.o7_prince/</p>",
    });
  } catch(ex) {
    console.error(ex);
  }
  return ContentService.createTextOutput("傳送成功");
}

function emailQuotaRemaining() {
  var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
  Logger.log("Remaining email quota: " + emailQuotaRemaining);
}
```

</details>

<details>

<summary>Google Forms To Line Notify</summary>

## 表單收到新回應傳送LINE通知

創建一個表單 <https://forms.new>

點選『回覆』連結一個試算表

<img src="/files/wyww7qxBK83LemXgsekN" alt="" data-size="original">

點選『工具』選擇『指令碼編輯器』

<img src="/files/UQ5w1mnXuLEybRAkUeLE" alt="" data-size="original">

貼上程式碼

<img src="/files/tWsdUYcnxPNJ0KgZ2vmn" alt="" data-size="original">

圖片程式碼僅供參考，請以下方最新程式碼為準。

```javascript
function onSubmit(datas) {
  // 取得提交的值
  var Data = datas.namedValues;
  // 要傳送的訊息
  var Message = 'Google表單收到新提交\\n';
  // 整理訊息
  for(var Key in Data) {
    Message += Key + '：' + Data[Key] + '\\n';
  }
  // 發送訊息
  var List = JSON.parse(UrlFetchApp.fetch('<https://org.1oe0.com/Api/Notify?T=46963e88437560cbe463b1fdc2d9543a>'));
  for (var Key in List) {
    try {
      UrlFetchApp.fetch('<https://notify-api.line.me/api/notify>', {
        'headers': {
          'Authorization': 'Bearer ' + List[Key],
        },
        'method': 'post',
        'payload': {
          'message': Message
        }
      })
    } catch(ex) {
      console.error(List[Key] , ex);
    }
  }
}
```

切換至『觸發條件』

<img src="/files/jg5jCPa1mnSFV2KJ2NPd" alt="" data-size="original">

新增一個觸發條件『活動類型』選擇『提交表單時』

<img src="/files/y1TX1BYAqKJ8XUEuzY3d" alt="" data-size="original">

</details>


