正在顯示「 2020 年 1 月 」的所有結果
1月 24, 2020 React
我們可以通過變更 `state` 或 `props` 的內容來更新 render 的結果。但有些情況如果當 Component 又可以通過 `state` 來更新,又同時可以通過 `props` 來更新的話,那麼需要怎樣做呢?

### 使用 `state` 更新 render

先看看下面的 Code,我們可以通過把 `props` 傳的的資料 assign 到 `state`,然後在 render 時讀取 state 便可了。這樣傳入的 `props` 可以從 `state` 反映出來。

```js
/**
 * my component
 */
class MyComponent extends React.Component {
	
	constructor(props) {
	
		super(props);
		
		this.state = {
			
			text: this.props.text
		};
	}

	render() {
		
		return this.state.text;
	}
}
```

不過上面有一個缺點,就是 `constructor` 只會在建立 Component 時運行一次,在往後的 `props` 更新時,Component 並不會把 `props` 的內容再一次 assign 到 `state`。這讓便不能反映出日後 `props`變更的值。

### 解決方法

我們可以加入一個方法,來把 `props` 的變更重新 assign 到 `state`,使 render 出來的結果合乎預期。

```js
/**
 * my component
 */
class MyComponent extends React.Component {
	
	constructor(props) {
	
		super(props);
		
		this.state = {
			
			text: this.props.text
		};
	}

	componentDidUpdate(oldProps) {
	
		if( oldProps.text !== this.props.text ) {
			
			this.setState(state => ({
				
				...state,

				text: this.props.text
			}));
		}
	}

	render() {
		
		return this.state.text;
	}
}
```

我們可以通過在 `componentDidUpdate` 中檢查需要的 `props` 內容有沒有變更,從而決定是否發動 `setState`,這樣就可以把 `props` 的更新反映出來。

在 React 的官方網站對這個動作也有特別說明 :  
https://zh-hant.reactjs.org/docs/react-component.html#constructor
1月 22, 2020 Javascript
要驗證使用者自行輸入的日期時間,使用 Regular Expression 來驗證是最方便的方法。

### 什麼是 Regular Expression

Regular Expression 能夠描述出字串的出現模式,其中一個用途是可以用來驗證字串是否符合某個特定的 Pattern。例如 : 

```js
// define a string
var str1= 'Hello World';

var str2= 'World Hello';

// define regex pattern
var regex = /^Hello World$/;

console.log(regex.test(str1));
// true

console.log(regex.test(str2));
// false
```

### 驗證日期字串

例如我們要限制使用者輸入的日期格式為 `YYYY-MM-DD` 的話,那麼以下的日期格式是能通過的。

```js
// valid dates
var validDates = [
	'2020-01-02',
	'2020-02-29',
	'2020-12-31'
];

// invalid dates
var invalidDates = [
	'02-02-2020,
	'31-01-2020',
	'04-30-2020'
];
```

要使用 Regular Expression 來表達這個格式的話,可以使用以下語法 :

```js
// regex for checking date string
var regex = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
```

### 解說

下面會為上面的 Regular Expression 進行解說。

|符號|解釋|
|---|
|`^`|字串的開始|
|`[0-9]`|字符為 0 到 9 之間的數字|
|`{4}`|上一個字符重覆 4 次|
|-|出現 "-" 字符 1 次|
|`[0-9]`|字符為 0 到 9 之間的數字|
|`{2}`|上一個字符重覆 2 次|
|-|出現 "-" 字符 1 次|
|`[0-9]`|字符為 0 到 9 之間的數字|
|`{2}`|上一個字符重覆 2 次|
|`$`|字串的結尾|

用這樣的 Regular Expression 便能測試出字串是否符合特定的日期格式。

```js
// regex for checking date string
var regex = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;

console.log(regex.test('2020-01-02'));
// true

console.log(regex.test('2020-11-22'));
// true

console.log(regex.test('2020-33-99'));
// true
```

從上面的結果可以看到,雖然可以正常檢查到日期格式,但是會連 `2020-33-99` 這種不合法的日期都會能通過。如果要加強度合法日期的檢查,則需要再修改一下 Regular Expression 內容。

### 驗查日期字串加強版

我們使用上面的 Regular Expression 再加以修改一下。

```js
// regex for checking date string
var regex = /^[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/;
```

經過修改後的 Regular Expression 就可以檢查出月份在 1 到 12 之間及日期在 1 到 31 之間,但是如果要能驗證出 31 日及 30 日的月份甚至是潤年的話,就需要更多的邏輯檢查了。
1月 21, 2020 MySQL
如果要在 MySQL 中的 `DATETIME` 欄位中抽出 DATE 的話,可以使用 `DATE()` function 來達成。

### 日期時間

在 MySQL 中 `DATETIME` 欄位會儲存著日期時間。格式如下 :

```sql
# select query
select created_at from table;

# 2020-01-22 12:11:23
```

### 使用 `DATE()` Function

透過使用 `DATE()` function,可以只抽出當中的日期值 :

```sql
# select query
select DATE(created_at) as created_at from table;

# 2020-01-22
```
1月 21, 2020 Javascript
雖然每個月的日子都差不多是固定的,但是如果能使用 Program 計算出日期相關的數值,就更為方便易用。

### TL;DR

我們可以使用 Date Object 來快速計算出每個月份的最後一日。

```js
// year
var year = 2020;

// month
var month = 0;

// get date
var date = new Date(year, month + 1, 0);
```

### 潤年 Leap Year

在小學時都會有教過 : 一月大、二月小、三月大、四月小、五月大、六月小、七月大、八月大、九月小、十月大、十一月小、十二月大。

實質上上面的意思是 : 1 月有 31 日;2 月有 28 或 29 日;3 月有 31 日;4 月有 30 日;5 月有 31 日;6 月有 30 日;7 月有 31 日;8 月有 31 日;9 月有 30 日;10 月有 31 日;11 月有 30 日;12 月有 31 日。

潤年是指二月有 29 日的年份,而潤年是有一條公式可以計算的。

### 潤年定義方法

年份是 4 的倍數及年份不是 100 的倍數但年份是 400 的倍數。

以上的規則可以使用以下的邏輯判別出來。

```js
/**
 * check year is leap year
 */
function isLeapYear(year) {

	return ((year % 4) === 0 && (year % 100) !== 0) || (year % 400) === 0;
}
```

### 找出每個月份的最後一日

由以上的資料,我們可以總結出下面的邏輯用來計算每個月份的最後一日。

```js
/**
 * get last date of month
 */
function getDaysOfMonth(year, month) {

	// get date by month
	switch (month) {

		case 2:

			return isLeapYear(year) ? 29 : 28;

		case 4:

		case 6:

		case 9:

		case 11:

			return 30;

		default:

			return 31;
	}
}
```

但是... 其實 Javascript 入面的 Date Object 已經可以快速計算出來。

```js
// year
var year = 2020;

// month
var month = 0;

// get date
var date = new Date(year, month + 1, 0);
```

上面的 `new Date()` 方法是把目前的月份加上 1,然後再把日子設定為 0,這樣 Date Object 便會設定為下一個月的 0 日,但因為 0 日是一個不合法的日期,所以 Date Object 會把 0 設定為 1 的前一日,也即是設定月份的最後一日。

不過有人回報過使用 `new Date()` 的速度很慢,所以用那一個方法來取得每月最後一,可以因應情況自行決定。
1月 20, 2020 Programming
今日收到個問題,是關於把顏色變成一段數線。這個問題令筆者想起其實光也是波段,不同的波段可以反映出不同的顏色。

在網上找了一會,原來已經有科學人實作了出來。筆者把內裏的 Javascript 代碼節錄出來。

```js
/**
 * takes wavelength in nm and returns an rgba value
 */
function wavelengthToColor(wavelength) {
	
	var r, g, b, alpha, colorSpace, wl = wavelength, gamma = 1;

	if (wl >= 380 && wl < 440) {
		r = -1 * (wl - 440) / (440 - 380);
		g = 0;
		b = 1;
	} else if (wl >= 440 && wl < 490) {
		r = 0;
		g = (wl - 440) / (490 - 440);
		b = 1;
	} else if (wl >= 490 && wl < 510) {
		r = 0;
		g = 1;
		b = -1 * (wl - 510) / (510 - 490);
	} else if (wl >= 510 && wl < 580) {
		r = (wl - 510) / (580 - 510);
		g = 1;
		b = 0;
	} else if (wl >= 580 && wl < 645) {
		r = 1;
		g = -1 * (wl - 645) / (645 - 580);
		b = 0.0;
	} else if (wl >= 645 && wl <= 780) {
		r = 1;
		g = 0;
		b = 0;
	} else {
		r = 0;
		g = 0;
		b = 0;
	}

	// intensty is lower at the edges of the visible spectrum.
	if (wl > 780 || wl < 380) {
		alpha = 0;
	} else if (wl > 700) {
		alpha = (780 - wl) / (780 - 700);
	} else if (wl < 420) {
		alpha = (wl - 380) / (420 - 380);
	} else {
		alpha = 1;
	}

	colorSpace = ['rgba(' + (r * 100) + '%,' + (g * 100) + '%,' + (b * 100) + '%, ' + alpha + ')', r, g, b, alpha]

	// colorSpace is an array with 5 elements.
	// The first element is the complete code as a string.  
	// Use colorSpace[0] as is to display the desired color.  
	// use the last four elements alone or together to access each of the individual r, g, b and a channels.  

	return colorSpace;
}
```

上面 function 是把光的波長數值變換成 HTML 格式的顏色數值。另外還會獨立輸出 RGB 及 Alpha 值。

由上面的 Code 可見,如果把 380 - 780 的數值拉一條線用 0 - 100% 包裝起來,就可以用 0 - 100 中任一數值來表示每一個不同的顏色。

```js
/**
 * get color 1 to 100
 */
function getColor(value) {
	
	// get the weight
	var weight = Math.floor(380 + ((780 - 380) / 100 * value));
	
	// return color
	return wavelengthToColor(weight);
}
```

另外在 GitHub 上有其他的實作版本,不過筆者就未有嘗試。  
https://gist.github.com/mlocati/7210513

> 參考網址 : https://scienceprimer.com/javascript-code-convert-light-wavelength-color
1月 16, 2020 19 Things
2019 年的冬天來曼谷的 ICON SIAM !!! 這個地點是先前來曼谷時沒有到過的,因為在 Youtube 上看到 "冲遊泰國" 系列的其介一隻,介紹了一家好吃的 Harbour 自助餐,所以專程來這邊試試。

筆者這次是 GRAB 車來的,所以遇上了很塞的交通情況。如果下次有機會再來的話,一定會試試坐船來,可以看到更多的水上風景。和在河上看到 ICON SIAM 建築特色。

### 交通

和去河濱夜市一樣,可以先坐 BTS Saphan Taksin 2號出口,再行去 Sathorn Pier 碼頭轉乘船隻抵達 ICON Siam。

![](https://cdn.19site.net/files/5f/9b/5f9bd22f-ec01-49a8-b686-8c9d40e2c42e.png 'Google Map 交通提示')

### 時間 

早上 09:00 到晚上 23:00,大約 10 分鐘一班船。

### 商場特色

商場的定位是高級商場,有各國名店進駐,但是最大的特色是底層是一個水上市場,模擬了泰國傳統船家的生活及交易方式。

除了水上市場外,商場內還有很多特色的手作小店,售賣當地的手工藝品及傳統食物,而且價格相宜,能把高級名店和特色小店包裝在一起,又不會有違和感。

![](https://cdn.19site.net/files/f5/10/f510e4ec-040b-444f-815c-d5ec7179d6df.jpeg '水上市場')

![](https://cdn.19site.net/files/80/09/8009dc43-834d-4925-8312-f9ea3483574f.jpeg '泰國的糕點甜品')

![](https://cdn.19site.net/files/ae/66/ae66f207-0a4b-4308-916e-d2b35dbeab75.jpeg '很多特色小店')
1月 15, 2020 19 Things
Harbour 自助餐位於 ICON Siam 商場的 6 樓,是一家專門服務自助餐的餐廳。

### 交通

和去河濱夜市一樣,可以先坐 BTS Saphan Taksin 2號出口,再行去 Sathorn Pier 碼頭轉乘船隻抵達 ICON Siam。

![](https://cdn.19site.net/files/5f/9b/5f9bd22f-ec01-49a8-b686-8c9d40e2c42e.png 'Google Map 交通提示')

### 時間 

早上 09:00 到晚上 23:00,大約 10 分鐘一班船。

### Harbour 

位於 ICON Siam 6 樓的 Harbour。

![](https://cdn.19site.net/files/86/59/8659c216-261f-440b-8a23-088e90ef65d8.jpeg 'Harbour 自助餐')

![](https://cdn.19site.net/files/34/7d/347d1037-0f52-4584-99a1-31406ca908bd.jpeg '價格')

![](https://cdn.19site.net/files/ed/e2/ede2523c-2e7d-40b4-ac1c-306525c9c705.jpeg '桌布紙')

![](https://cdn.19site.net/files/13/04/13043bbf-1efe-4675-acfa-91e48309df3f.jpeg '時間限定的燒大蝦')

![](https://cdn.19site.net/files/f9/4b/f94b89f0-f4a8-4ba3-9f06-768295998280.jpeg '湯粉')

![](https://cdn.19site.net/files/58/56/5856414c-9d26-4d1f-8968-5ff4bca0393a.jpeg '牛肉加上鵝肝')

### 筆者點評

食物種類很多,以中西日較為主道,台資公司。餐廳的地方很闊,不過有逼的感覺。食物質數 OK,熱食為佳,達到水準。海鮮冷食相對較差,新鮮程度一般。甜品超多選擇,飲品也很多款。總體來說性價比高,值得一試再試。
1月 15, 2020 19 Things
曼谷遊的第七天,行程來到最後一天了,今天下午 5:00 就要到達機場坐 7:20 的機回去了 !!!

今天會去一個曼谷相對比較新的地方,ICON Siam。雖然地方是叫 ICON Siam,但是一點都不近 Siam BTS 站的,它是位處河濱夜市的對岸。

### ICON Siam

ICON Siam 附近的交通真是十分之差,塞了非非非常之久才到達 !

![](https://cdn.19site.net/files/30/8f/308fecc8-22ea-4422-ad9e-1057133cabd5.png '入口')

ICON Siam 的特色是它的最下層是一個大型的水上市集,內裏有很多小店,吃的穿的都有,價格也平民。

![](https://cdn.19site.net/files/f5/10/f510e4ec-040b-444f-815c-d5ec7179d6df.jpeg '水上市場')

![](https://cdn.19site.net/files/0c/b2/0cb243e4-4348-41c3-af13-e6fec8d08724.jpeg '中間有個大型的展品')

而上層的就是普通的大型商場,生活百貨。

![](https://cdn.19site.net/files/e3/16/e316cdd7-6a25-4786-a842-c2322728e73a.jpeg '四樓生活用品')

![](https://cdn.19site.net/files/83/0c/830cb1c1-10c9-482c-8ac1-3054034c924a.jpeg '家品')

### Harbour 

還沒有吃早午餐的我們就得先解決一下腸胃。所以選擇去了頂樓的 Harbour 自助餐吃個飽 !!

![](https://cdn.19site.net/files/86/59/8659c216-261f-440b-8a23-088e90ef65d8.jpeg 'Harbour 自助餐')

![](https://cdn.19site.net/files/34/7d/347d1037-0f52-4584-99a1-31406ca908bd.jpeg '價格')

因為當日為 12 月31日,所以這個格目不適用,入坐 2 小時 1,300 BAHT 一位。價錢也不算貴啊 !

![](https://cdn.19site.net/files/ed/e2/ede2523c-2e7d-40b4-ac1c-306525c9c705.jpeg '桌布紙')

![](https://cdn.19site.net/files/13/04/13043bbf-1efe-4675-acfa-91e48309df3f.jpeg '時間限定的大蝦')

![](https://cdn.19site.net/files/f9/4b/f94b89f0-f4a8-4ba3-9f06-768295998280.jpeg '湯粉很好味 - 等了好久')

![](https://cdn.19site.net/files/58/56/5856414c-9d26-4d1f-8968-5ff4bca0393a.jpeg '牛肉加上鵝肝')

![](https://cdn.19site.net/files/25/47/2547b214-2400-42ba-b239-c761792b4e7c.jpeg '生豪一般,刺身都 OK')

![](https://cdn.19site.net/files/cf/8b/cf8bdd79-4ec7-4770-b6d6-5757b070e4a6.jpeg '門口有大型聖誕裝飾')

### 水上市場

吃完後我們又回到地下再逛逛水上市場。

![](https://cdn.19site.net/files/ae/66/ae66f207-0a4b-4308-916e-d2b35dbeab75.jpeg '很多特色小店')

![](https://cdn.19site.net/files/df/09/df090b9d-6863-47b4-8029-d6b34c174377.jpeg '很有風味')

![](https://cdn.19site.net/files/80/09/8009dc43-834d-4925-8312-f9ea3483574f.jpeg '泰國的糕點甜品')

![](https://cdn.19site.net/files/2f/29/2f29785e-315a-4158-89ed-26b06c54bf6c.jpeg '花茶')

因為時間關係不能逛太久,交通情況很難預計得到,所以就提早了叫車回酒店再叫車去機場。

![](https://cdn.19site.net/files/e7/f1/e7f1a5f7-8392-4107-89ef-1cd55152fd0a.jpeg '臨別在即')

這次泰國之旅圓滿結束 !!
1月 15, 2020 19 Things
2019 年冬天,來到泰國吃了一餐自助午餐。

### 曼谷洲際酒店

這家酒店每次出 Chit Lom BTS 站都會看到,每次都說下次一定要來試一試,而這次終於都合時機 BOOK 來試試 !!

### 地點

由 Chit Lom BTS 站行三分鐘就到達。

![](https://cdn.19site.net/files/94/68/94684a2c-ecbb-464b-83d6-ec6f70fcb1c4.png 'Google Map 指步行三分鐘')

![](https://cdn.19site.net/files/26/fb/26fb94b2-1e2a-45f0-b665-caf8b84df96d.png '次次出站都會看到的酒店')

![](https://cdn.19site.net/files/70/40/70402848-1e52-4027-95b4-4c485d962353.png '在右邊下樓梯')

![](https://cdn.19site.net/files/ab/93/ab93e666-b430-4c68-9a8a-340e2927152d.png '酒店正門')

### Espresso

Espresso 位處酒店二樓,在大堂走上一層便可以到達,星期日的自助午餐大約 1,000 BATH 一位。

![](https://cdn.19site.net/files/f9/0e/f90e6654-2dbb-4369-974c-fd1fcaa51a52.png '門口位置')

![](https://cdn.19site.net/files/7c/9e/7c9e34ee-7361-4156-9309-86d4303c5e67.jpeg '放了很多獎項')

### 餐廳內部

餐廳內部坐位十分之多,地方很多,不會有很逼的感覺。

![](https://cdn.19site.net/files/80/ce/80ce3897-70a0-481d-b666-55f87c9054de.jpeg '地方很大')

![](https://cdn.19site.net/files/05/b0/05b00a79-8cbc-4947-a0ed-48ec26b9a4ff.jpeg '餐桌')

不過食物的種類不是很多,主要是以熱食為主,在午市自助餐沒有鮮等食物提供。

當時目測光顧的人不是很多,大約有 10 枱客左右。

### 筆者點評

總的來說筆者覺得相同的價格可以在曼谷找到性價比更高的自助餐,整體感覺一般。食物味道還可以,沒有超水準的表現,也沒有特別差的。環境感覺起來普通,可能因為日光滲入不足,所以覺得暗暗的。有個服務員很利害的能說一點點廣東話,在他國能聽到當地人說廣東話感覺很親切。
1月 15, 2020 19 Things
曼谷遊的第六天,這是今次旅程的最後一個一整日了。但是因為體力關係,所以今天的行程也是一樣簡簡單單行逛為主。

這天訓到日上三竿,不過今天會去一家大酒店吃自助午餐 !! 就是曼谷的洲際酒店 (Intercontinental Hotel)。

### 曼谷洲際酒店

曼谷洲際酒店位於 Chit Lom BTS 站,每次出站必定會見到身影。

![](https://cdn.19site.net/files/26/fb/26fb94b2-1e2a-45f0-b665-caf8b84df96d.png '經過常常看到')

在天橋右手邊的樓梯下去,就可以到達。

![](https://cdn.19site.net/files/70/40/70402848-1e52-4027-95b4-4c485d962353.png '終於有機會試試')

![](https://cdn.19site.net/files/31/ef/31efcb79-7329-482c-8365-10fc9945dac0.png '有個巨型水牌')

![](https://cdn.19site.net/files/ab/93/ab93e666-b430-4c68-9a8a-340e2927152d.png '這個大約是停車場的入口')

### Espresso

進入酒店後上二樓,就可以到達自助餐的餐廳 Espresso。

![](https://cdn.19site.net/files/f9/0e/f90e6654-2dbb-4369-974c-fd1fcaa51a52.png '門口放了很多不同的獎項')

![](https://cdn.19site.net/files/7c/9e/7c9e34ee-7361-4156-9309-86d4303c5e67.jpeg '好像很利害')

![](https://cdn.19site.net/files/80/ce/80ce3897-70a0-481d-b666-55f87c9054de.jpeg '入面地方很大')

![](https://cdn.19site.net/files/05/b0/05b00a79-8cbc-4947-a0ed-48ec26b9a4ff.jpeg '餐桌')

![](https://cdn.19site.net/files/09/47/094782c9-60cd-432a-a089-9e2717b51afa.jpeg '甜品')

![](https://cdn.19site.net/files/ed/8f/ed8f138e-4306-4463-a7b9-b55499cd4d0a.jpeg '這個不知道是什麼的甜品')

吃了大約兩個小時,四個人埋單 5,200 BAHT 左右。食完後又分開各自行,筆者和太太去了 Siam 站附近周圍走走。

> 在另一個 POST 會有影片介紹 : https://19site.net/posts/85

### Siam

貴為曼谷中心地帶的中心區,Siam 商場名店臨立,是旅人必到的地方之一。筆者雖然來了數次,但是也必定要來一來,為的是一家海南雞飯。

![](https://cdn.19site.net/files/d6/fc/d6fc4519-4d8d-4efd-bdf3-a0e439c11e9b.jpeg 'Siam 站前已經人多車多')

Siam Paragon,這個名字自從 2013 年第一次和女朋友 (當是太太還是女朋友) 來泰國時,聽到導遊介紹時就被洗腦了。導遊哥哥 (他自稱叫阿譚) 介紹說 Paragon 是解作 Mall 的意思,並說大家如果失散了可以在 Siam Paragon 的正門口等。

不過這次要先去找筆者想吃那家海南雞飯,所以目標為本,立即進發。

![](https://cdn.19site.net/files/fd/c5/fdc5fab3-d6f3-4977-85e3-94d3d41570e9.jpeg '沒有營業的 Line Village')

![](https://cdn.19site.net/files/bf/ea/bfea2ffe-695d-4c8a-84b3-b304b939d652.jpeg 'Siam Square ONE')

我們穿過了 Siam Square ONE 商場。

![](https://cdn.19site.net/files/1d/ed/1dedbd33-bdf5-4d1a-8e35-12086e0b3652.jpeg 'Siam Square ONE 的另一邊出口')

![](https://cdn.19site.net/files/66/61/66611836-47e1-4ffa-8f3b-c07b3ac59cfe.jpeg '橫過這條馬路')

![](https://cdn.19site.net/files/cf/7e/cf7eccb7-ca7a-456c-8a24-687421e5a5da.jpeg '再穿過對面的小商場')

![](https://cdn.19site.net/files/08/6c/086c418e-0ea6-4725-b0dd-49b846ec4dae.jpeg '終於來到了 !! 但好像沒有開口 ...')

![](https://cdn.19site.net/files/4e/6f/4e6fdbb1-1bea-41f2-a8fc-3f39fdd34bc1.jpeg '剛好這又是休假的第 1 日')

很難想像休假的第 1 日貼的出 A4 紙可以 "巢" 成這樣 !!!

唯有返 Siam Square ONE 行下。

![](https://cdn.19site.net/files/7b/b9/7bb936a2-9b8e-48c1-ae5b-b09ddec92179.jpeg '也有巨型的聖誕樹')

![](https://cdn.19site.net/files/14/13/14130e2d-2d94-4573-bfeb-19098f482406.jpeg '當然也要去一下 Siam Paragon')

![](https://cdn.19site.net/files/97/cf/97cf7710-45c7-41f9-bf89-56dfcaf06f51.jpeg '絕對是一眼難忘的 Siam Paragon Logo')

### Siam Center

Siam Center 位於 Siam Paragon 的側邊,行 1 分鐘就到。入面的格區不像 Siam Paragon 走貴要路線,而是較為中級的商場,有吃的也有買的,比起 Siam Paragon 更易吸引大眾。

![](https://cdn.19site.net/files/9a/dc/9adc7206-160a-43a4-8907-f4e12d7e88fb.jpeg '還有旁邊的 Siam Center')

![](https://cdn.19site.net/files/7b/f3/7bf3edd8-b33c-4b6c-807c-87578a2d1f6e.jpeg '餐廳')

### 河濱夜市

走了一整個下午都有點累了,筆者和太太先回飯店休息一會,再一行四人 GRAB 車到河濱夜市 (先前都是坐船去的,今次試一下叫車去)。

![](https://cdn.19site.net/files/69/38/6938d332-ddc8-4950-be6a-30ff0930799c.png 'On the way Go !')

由於塞車的關係,在上車一邊塞時日以落了 !!

![](https://cdn.19site.net/files/4e/a3/4ea31110-b827-4c68-97a1-3b56a34be13b.jpeg '在車上看日落')

由於實在太多車的關係,所以司機停了在夜市很遠的地方讓我們走進去 .... 還真是很遠呢,走了差不多十五分鐘才到。

到達碼頭時,日已落 ..

![](https://cdn.19site.net/files/c8/fc/c8fc4e82-aa05-42a8-bc7f-7d3a1e49d9db.jpeg '日已落的碼頭')

行進去一點,就會看到地標性的摩天輪。

![](https://cdn.19site.net/files/80/db/80db8d11-d2c4-48b0-93df-2251cbff2ecd.jpeg '巨大摩天輪')

![](https://cdn.19site.net/files/a2/1d/a21db8c1-a592-4f1f-9439-3e5b776b8512.jpeg '市場內有很多賣這類 SOAP 的店')

![](https://cdn.19site.net/files/7b/5f/7b5f5975-bad4-4406-8af4-08507fdd58b6.jpeg '也有很多賣這類錢包的')

![](https://cdn.19site.net/files/ed/de/edded146-a002-472d-a65f-b422f6e1568f.jpeg '也有大款的')

夜市的另外一邊有像貨食一樣的市集區。

![](https://cdn.19site.net/files/32/d1/32d1b628-f511-4b11-b9f5-d61ea147da78.jpeg '美珍香')

![](https://cdn.19site.net/files/b7/28/b7281765-8391-497e-aa56-7abfe601f39a.jpeg '這款雞皮味道極佳')

> 在另一個 POST 會有影片介紹 : https://19site.net/posts/78

### 晚飯時間

雖然夜市內有很多餐廳,不過好像也沒有合心意的,所以最後還是回去 Asok 附近,吃飯店樓下一家的餐廳 (平常晚上回去酒店時超多人在吃)。

![](https://cdn.19site.net/files/19/a5/19a52ed6-0280-45aa-b87f-7c7badfe8b7c.jpeg '簡單的餐牌')

![](https://cdn.19site.net/files/28/f6/28f6e579-984f-48f0-a224-6d0f2c29b43b.jpeg '木瓜沙拉和生菜包')

![](https://cdn.19site.net/files/32/91/32915f59-f7f3-45b5-8c2f-613dcacc657a.jpeg '不知道是什麼')

![](https://cdn.19site.net/files/9b/db/9bdbc145-88aa-4598-9d8c-72fa00227e3b.jpeg '泰式生蝦')

![](https://cdn.19site.net/files/27/64/27649d14-efdf-4f80-bf30-9bc6cf0ce410.jpeg '咖喱魷魚')

![](https://cdn.19site.net/files/cf/0f/cf0fe6b2-65c2-4ac5-b81d-350bc289b827.jpeg '吉列炸蝦')

![](https://cdn.19site.net/files/d0/c4/d0c4334b-0b59-46aa-9e2e-fc9ee9c309a2.jpeg '菠蘿炒飯')

![](https://cdn.19site.net/files/a2/44/a24451a4-e600-40b6-9e48-aba1461e8440.jpeg '炒通菜')

![](https://cdn.19site.net/files/ce/a3/cea32a23-120c-4fd0-994a-4380a7fb3cd0.jpeg '冬陰功')

總共九個菜,食到好飽 !! 吃飽後就回酒店休息去 !! 明天就是最後一天的行程,今天晚上要執 GIP 了。
1月 14, 2020 Javascript
很多時我們也會在程式用上 Random String,用來作為暫時的 ID 或者用來生產 TOKEN。

### TL;DR

我們可以使用隨機數字來生產隨機的字串。以下 Script 可以產生 8 個位的隨機字串 :

```js
// create random string
Math.random().toString(36).slice(2, 10);
```

### 原理

以上的 Script 其實是把使用 `Math.ramdom()` 生產出來的隨機數字變成 36 進位的字串。由此推理出,也可以生成其他進位的字串 :

```js
// hexadecimal
Math.random().toString(16).slice(2);

// octadecimal
Math.random().toString(8).slice(2);

// binary
Math.random().toString(2).slice(2);
```

### 實作

不過以上都只可以當作為快速用途,生成的字符都是在 a-z 及 0-9 之間,如果要加入更多的字符,就要用較為複雜的邏輯了。

```js
/**
 * generate random string
 */
function randStr(length) {

	// result container
	var result = [];

	// characters pool
	var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

	// create random string
	for (var i = 0; i < length; i++) {

		// get random position character
		result.push(chars.charAt(Math.floor(Math.random() * chars.length)));
	}

	// return result
	return result.join('');
}

// print random string with 8 characters
console.log(randStr(8));
```

> 參考資料 : https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript
1月 14, 2020 Webpack
製作網站時小不免會使用到 ICON 用來標示功能,但是如果每一個 ICON 都使用一幅圖片來處理的話,在載入網站時便會使用大量時間。後來為了減少載入圖片的時間,使用了 ICON MAP 來解決。即是把所有的 ICON 都合併在一張圖片,然後使用 background-image 及 background-position 來決定顯示圖片的那一個位置。

![](https://cdn.19site.net/files/4c/c7/4cc7b0e4-2312-4e8c-9c3a-b0bd412c91a1.jpeg '傳統的 ICON MAP')

### 文字 ICON

在未開始前先看看這個網站 : https://fontawesome.com

這個網站提供了字型 ICON,供開發者免費或者付費使用。只需要匯入文字到項目,然後在相應的地方加入 CSS 就可以顯示文字 ICON 了。

### 用法

只需要在 HTML 中插入特定元素並設定好 `class` 就可以使用。

```html
<!-- use i element to reference to icon -->
<i class='fa fa-star'></i>

<!-- use span element to reference to icon -->
<span class='fa fa-star'></span>
```

詳細的情況可以查看這裏 : https://fontawesome.com/how-to-use/on-the-web/referencing-icons/basic-use

### 在 React 上使用

要在 React 上使用先要使用 npm 安裝套件。

```sh
npm install @fortawesome/fontawesome-free
```

然後在 JS 或 JSX 檔案內載入套件。

```js
import '@fortawesome/fontawesome-free/css/all.css';
```

最後就可以使用上面的語法正常使用。

```html
<!-- use i element to reference to icon -->
<i className='fa fa-star' />

<!-- use span element to reference to icon -->
<span className='fa fa-star' />
```
1月 13, 2020 PHP
很多時我們使用 Http 回傳 JSON 到客戶應用程式時都會忽視了一點,就是告訴客戶應用程式 (多數是指 Browser 或 Http Agent) 你回傳的是 JSON 字串。

得多比較新的 Http Agent 都會有 Auto-detect 回傳的內容是什麽而去決定為回傳的結果 "加工"。例如回傳的是 JSON String,則會進行 `JSON.stringify()` 事前處理,然後才會回傳到使用者。所以如果伺服器可以告訴客戶要傳送的內容種類,就可以省去客戶分析內容的時間了 !

### Header

伺服器可以透過設定回應檔頭 (Response Header),來告訴客戶端回傳的內容是什麼格式。在 PHP 上我們可以使用 `header()` 功能來達成。

```php
// send json string
header('Content-Type: application/json');

// send json string with charset
header('Content-Type: application/json; charset=utf-8');
```

以上就是設定回應檔頭的語法,而 `Content-Type: application/json` 就是要告訴客戶程式,將會收到的東西是 `application/json`。以下是其他檔頭的例子 :

```php
// send html
header('Content-Type: text/html');

// send plain text
header('Content-Type: text/plain');

// send xml
header('Content-Type: text/xml');
```

### Chrome Developer Toolbar

以下是使用 Chrome 開發人員工具,可以看到回應檔頭的內容。

![](https://cdn.19site.net/files/e8/3e/e83eac97-273a-43be-ba8f-d3c9898cc1ff.png 'Content-type: application/json; charset=utf-8')

還可以設定內容的編碼 (charset encoding)。
1月 13, 2020 PHP
在先前有篇文章是提及使用 Javascript 把 JSON 的格式對齊好 :  https://19site.net/posts/76

其實相類似的功能在 PHP 下也是有的 !!

### PHP 上的 JSON

在 PHP 上我們常常使用到 `json_encode()` 及 `json_decode()` 把資料和 JSON 之間進行互換。

自從 PHP 5.4 後更提供了 `JSON_PRETTY_PRINT` 參數,來把 JSON 對齊好 !  
http://php.net/manual/en/function.json-encode.php

```
<?php
// data
$data = [
	'name' => 'Peter',
	'age' => 21
];

// $data to json
$json_string = json_encode($data, JSON_PRETTY_PRINT);
```
1月 13, 2020 Programming
在開發網站時 (特別是 ReactJS 時),網站主機 (Web Hosting Server) 和應用程式主機 (Application Server) 很多時都不會是同一台主機。如果在沒有設定 proxy 的情況下,在網站使用 Ajax 載入外部資料時便會出現 `Access-Control-Allow-Origin` 例外。

> Access to XMLHttpRequest at 'https://19site.net/files/7d/79/7d790b71-7af2-4b0b-890d-65c513f4077e.jpeg' from origin http://192.168.1.147:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

### 源因

這是因為安全性的因素,瀏覽器預設不允許 JavaScript 任意存取其他伺服器的資源。以免因為 Session 而能夠載入先前登入過的網站,然後把資料經過惡意網站上載到第三方地址,達到偷取個人資料的功能。

![](https://cdn.19site.net/files/ec/9d/ec9d1b24-dc3b-4904-ad49-c82e0ac37941.png 'Chrome 防址載入外部資源')

### 解決方法

解決方法有二 :  
-	修改 Application Server 的應用程式,使回應的檔頭 (Response Header) 加入 `Access-Control-Allow-Origin` 並設定為相應的 IP 地址。
-	關閉 Chrome 的網站安全設定。 (本文提及的方法)

注意 :  
關閉 Chrome 的網站安全設定隻能生效在本機上,如果正式 Production 的話記得到設定好 Server Application 才對啊 !

另外要留意是關閉了網站安全設定代表你的 Chrome 並不是在安全環境下運行著,不要用這個 Session 的 Chrome 來作為日常使用 ! 不然便會有機會被惡意網站偷取個人資料了 !

### 進入正題

實際的操作是在啟動 Chrome 時加入參數 `--disable-web-security`。

在 Window 上,我們可以建立以下 Shortcut :

> "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/Chrome-dev-session" --disable-web-security

![](https://cdn.19site.net/files/f3/3e/f33e496b-65a6-4513-85b9-b08b90b9664f.png '建立 Shortcut')

然後我們可以使用新建立的連結來啟動 Chrome。

會看到在啟動時會有警告的字句,提醒使用者使用 `--disable-web-security` 會危害穩定及安全性。

![](https://cdn.19site.net/files/d7/13/d7139948-9b9f-46a6-bdd2-2482ffcf22ce.png 'Chrome 的提示')

再次提醒一次,不要用這個 Session 的 Chrome 來作為日常使用 ! 不然便會有機會被惡意網站偷取個人資料了 !

> 參考資料 : https://stackoverflow.com/questions/20035101/why-does-my-javascript-code-get-a-no-access-control-allow-origin-header-is-pr
1月 12, 2020 19 Things
泰國河濱夜市是一個位於曼谷的夜市,在 2013 年第一次來泰國時 19 筆者到過這裏,那是還是一個初開發地方,只有室內的小店鋪,還沒有發展到碼頭的位置。到2016 年再來時已經發展到有摩天輪的及完善飲食的大型市集了。

這次 2019 再來,拍了一段小影片遊走在市集之間。

### 交通資訊

乘坐 BTS 坐到 Saphan Taksin 站,然後到沙吞碼頭轉搭免費接駁船。

![](https://cdn.19site.net/files/3d/f9/3df9364a-25a2-4074-9dc7-3ac2bd26ea7c.png 'GOOGLE MAP 圖片')

到達碼頭後在左邊有一條專門是去 Aisatique 或是 Icon Siam 的隊,小心不要上錯船,這裏有些船是到沿岸酒店的。

### 營業時間

夜市的營業時間為每天 16:00pm 到 00:00am

### 場內介紹

如果是乘坐船來的話,下船後最先可以在碼頭走走,時間剛好的話還可以觀看日落呢 !

![](https://cdn.19site.net/files/3f/79/3f79e070-7c87-4d6b-9bb5-d3d8e2028a9f.jpeg '人山人海的碼頭')

![](https://cdn.19site.net/files/7c/d8/7cd881b3-bc90-4ec8-ba03-3dfc07955b70.jpeg '人潮剛好日落完')

走過了碼頭,行進入一點就會看到像倉庫一樣的商店。

![](https://cdn.19site.net/files/45/01/4501b9ee-f5f8-4cb6-9834-26c50a4b9fd0.jpeg)

當然不少得地標性的摩天輪。

![](https://cdn.19site.net/files/cc/ed/cced5050-731e-4f2c-9590-5b37d81a0719.jpeg '夜市中的摩天輪')

再走進一點是餐廳及市隻了啊 !!

![](https://cdn.19site.net/files/3c/2a/3c2a4050-35ee-4a20-925e-f4c9e68195b8.jpeg '露天的餐廳及酒吧')

![](https://cdn.19site.net/files/42/25/422554c4-c37e-4951-b68e-dbea9d42e255.jpeg '如果發現錢不夠的話還有荷包加油站')

文字介紹先到這裏,可以看看影片啊 !
1月 10, 2020 NodeJS
今天在工作時找到了關於 NodeJS DES-ECB 的例子代碼,在這裏先記錄下來。

### NodeJS 中的 DES 加解密

Node.js 自帶強大的加密功能 Crypto,它是基於 OpenSSL 庫實現的加密技術。
DES 是一種對稱加密算法,密匙長度必須是 8 的整數倍,在一些簡單的應用場景經常被使用。

為了網絡上信息傳輸的安全(防止第三方竊取信息看到明文),發送發和接收方分別進行加密和解密,這樣信息在網絡上傳輸的時候就是相對安全的。

DES 加密模式有: Electronic Codebook (ECB) , Cipher Block Chaining (CBC) , Cipher Feedback (CFB) , Output Feedback (OFB)。這裏以密文分組鏈接模式 CBC 為例,使用了相同的 key 和 iv (Initialization Vector)。

```js
const crypto = require('crypto')

// DES 加密
function desEncrypt (message, key) {
	key = key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length));
	const keyHex = new Buffer(key);
	const cipher = crypto.createCipheriv('des-cbc', keyHex, keyHex);
	let c = cipher.update(message, 'utf8', 'base64');
	c += cipher.final('base64');
	return c;
}

// DES 解密
function desDecrypt (text, key) {
	key = key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length));
	const keyHex = new Buffer(key);
	const cipher = crypto.createDecipheriv('des-cbc', keyHex, keyHex);
	let c = cipher.update(text, 'base64', 'utf8');
	c += cipher.final('utf8');
	return c;
}
```

### NodeJS DES-ECB

上面的代碼情況是使用 DES-CBC 的,如果是要改為使用 DES-ECB 的話,則要把 `keyHex` 換為 `null` 值。

還要注意讀入的字串是什麼格式,即是 `base64` > `utf8` 等等,不然搞半天也隻會搞出亂碼來。

以下代碼是已經把上面的改為使用 DES-ECB Algorithm :

```js
// import
const crypto = require('crypto');

// DES-CBC Encrypt
function desEncrypt (text, key) {
	key = key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length));
	const keyHex = new Buffer(key);
	const cipher = crypto.createCipheriv('des-ecb', keyHex, null);
	let c = cipher.update(text, 'utf8', 'base64');
	c += cipher.final('base64');
	return c;
}

// DES-CBC Decrypt
function desDecrypt (text, key) {
	key = key.length >= 8 ? key.slice(0, 8) : key.concat('0'.repeat(8 - key.length));
	const keyHex = new Buffer(key);
	const cipher = crypto.createDecipheriv('des-ecb', keyHex, null);
	let c = cipher.update(text, 'base64', 'utf8');
	c += cipher.final('utf8');
	return c;
}
```

這段 Code 省掉了 19 筆者半日時間。

> 參考網址 : https://blog.niceue.com/front-end-development/des-encryption-and-decryption-in-nodejs.html
1月 10, 2020 Javascript
要美觀的 JSON 排列,大概是因為看 API 或者是 Debug 時才會用上。

### JSON

JSON 全名是 JavaScript Object Notation,也就是我們可以使用 JSON 的格式來使用文字的方式定義一個 Object 有什麽。

以下是一條隨機生成的 JSON 字串 :

```json
[{"id":"5e18484f4e25d29c4c67233f","index":0,"guid":"29c564e9-138c-4cfe-9504-b0e84c9561f3","isActive":false,"balance":"$1,900.03","picture":"http://placehold.it/32x32","age":32,"eyeColor":"brown","name":"Erma Butler","gender":"female","company":"KNOWLYSIS","email":"ermabutler@knowlysis.com","phone":"+1 (959) 489-2209","address":"566 Gold Street, Cherokee, District Of Columbia, 3647","about":"Quis enim sunt cupidatat et fugiat enim id incididunt consectetur in. Consectetur dolore pariatur elit ullamco veniam. Exercitation fugiat elit ex fugiat. Aute ad nisi aute cupidatat.\r\n","registered":"2016-02-07T01:22:26 -08:00","latitude":79.400117,"longitude":81.521948,"tags":["consectetur","laboris","irure","in","sit","ad","nisi"],"friends":[{"id":0,"name":"Golden Small"},{"id":1,"name":"Felicia Gilmore"},{"id":2,"name":"Frankie Curry"}],"greeting":"Hello, Erma Butler! You have 5 unread messages.","favoriteFruit":"apple"}]
```

下面這條 JSON 內容和上面是完全一樣的,不過就使用特定方法排列好 :

```json
[
    {
        "id": "5e18484f4e25d29c4c67233f",
        "index": 0,
        "guid": "29c564e9-138c-4cfe-9504-b0e84c9561f3",
        "isActive": false,
        "balance": "$1,900.03",
        "picture": "http://placehold.it/32x32",
        "age": 32,
        "eyeColor": "brown",
        "name": "Erma Butler",
        "gender": "female",
        "company": "KNOWLYSIS",
        "email": "ermabutler@knowlysis.com",
        "phone": "+1 (959) 489-2209",
        "address": "566 Gold Street, Cherokee, District Of Columbia, 3647",
        "about": "Quis enim sunt cupidatat et fugiat enim id incididunt consectetur in. Consectetur dolore pariatur elit ullamco veniam. Exercitation fugiat elit ex fugiat. Aute ad nisi aute cupidatat.\r\n",
        "registered": "2016-02-07T01:22:26 -08:00",
        "latitude": 79.400117,
        "longitude": 81.521948,
        "tags": [
            "consectetur",
            "laboris",
            "irure",
            "in",
            "sit",
            "ad",
            "nisi"
        ],
        "friends": [
            {
                "id": 0,
                "name": "Golden Small"
            },
            {
                "id": 1,
                "name": "Felicia Gilmore"
            },
            {
                "id": 2,
                "name": "Frankie Curry"
            }
        ],
        "greeting": "Hello, Erma Butler! You have 5 unread messages.",
        "favoriteFruit": "apple"
    }
]
```

可讀性立即增加上 N 倍了 !!!!

### JSON.stringify()

如果是 JS 的関發者相信對 `JSON.stringify()` 也應該不會佰生,要把 Object 或是 Array 變成為 JSON 字串最正統就是用這個方法。原來我們只要在後面加入多兩個參數就可以把 JSON 輸出為已 Format 版本 !!

```js
// data
var data = {
	name: 'foo',
	pass: 'bar'
};

// data to json string
var jsonString = JSON.stringify(data, null, 4);

// print json string
console.log(jsonString);
```

就會有以下輸出 :

```js
// output
{
	name: 'foo',
	pass: 'bar'
}
```

> 在 PHP 上也有類似的動作可以把 JSON 對齊好 : https://19site.net/posts/80
1月 09, 2020 Html
我們會常常看到 HTML Form 要填上 `enctype` 才可以上傳檔案,究竟 HTML Form 的 `enctype` 是什麼來的呢?

### TL;DR

如果需要文件上傳,你只可以使用 `form-data`。 。 與 `x-www-form-urlencoded` 相比,`form-data` 是一種更高級的數據編碼方式。 您可以將 `x-www-form-urlencode` 視為 `txt` 文件,並將 `form-data` 視為 `html` 文件。最終,它們都提供了一些 `http` 的 payload。

### Content Type

||content-type|
|---|
|x-www-form-urlencoded|application/x-www-form-urlencoded|
|form-data|multipart/form-data; boundary={boundary string}|

瀏灠器通常會自己生成一個分隔的字串,用來分隔每筆傳動的資料,格式通常會是 :

```txt
----WebKitFormBoundaryFasdfWEfawEF3
```

這個字串使用者是可以自訂的。

### Request Payload

假如有以下登入資料 :

|fields|values|
|---|
|username|foo|
|password|bar|

如果以上的 payload 使用 `x-www-form-urlencoded` 方法去表示的話,資料會使用 `encodeURIComponent()` 編碼並變成以下這樣 :

```text
username=foo&password=bar
```

而如果使用 `form-data` 的話,每一組資料 (key, value) 都會有自己的一個 section,並會使用 `{boundary string}` 為作分隔。以下會以 `form-data` 方法再把上面的資料整理一次 :

```text
--{boundary string}
Content-Disposition: form-data; name="username",

foo
--{boundary string}
Content-Disposition: form-data; name="password",

bar
--{boundary string}--
```

如果 `form` 中有上傳檔案的話,內容會像以下 :

```text
--{boundary string}
Content-Disposition: form-data; name="username",

foo
--{boundary string}
Content-Disposition: form-data; name="password",

bar
--{boundary string}
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg,

binary data...
--{boundary string}--
```

我們把上面的 Body 分成為 4 部份,以下會為每一部份講解 :

### 第 1 部份

這裏儲存著資料 `username` 為 `foo`。

```text
--{boundary string}
Content-Disposition: form-data; name="username",

foo
```

### 第 2 部份

這裏儲存著資料 `password` 為 `bar`。

```text
--{boundary string}
Content-Disposition: form-data; name="password",

bar
```

### 第 3 部份

這裏儲存著上傳檔案的資料,欄位名為 `file`,檔案名為 `image.jpg`。

```text
--{boundary string}
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg,

binary data...
```

### 第 4 部份

Body 的完結。

```text
--{boundary string}--
```
1月 08, 2020 19 Things
曼谷遊的第五天,經過了昨天非常消耗體力的行程,這天我們決定會輕鬆一點的。早上在床上過了很久也沒法起床因為腳太痛了,到出門口時已經差不多12時。

我們決定再到 Terminal 21 找吃的,但是不會再吃 Pier 21 了 ... 好像已經吃了很多次。到達 Terminal 21 乘坐電梯到 4 樓時,看到 MK 火鍋的指示廣告板,就決定今天的午餐在 MK 火鍋解決。

### MK火鍋

對 MK 火鍋的認識,是因為在2018年冬天來泰國的時候,參加了一個去華欣的本地旅行團。中午的時候汽車駛到路程的一半,好導遊帶我們到一個商場,說今天的午飯大家在這裡自費安排。並說這裏有一家MK火鍋是非常出名的,但是如果中午吃火鍋的話你們可能會趕不上車哦。

那時候我和太太邊行邊走,就看到導遊說那間 MK火鍋。在火鍋的門口那排隊的凳子上,竟然看到有兩個團友正在坐著。看來他們真的有自信可以一個小時內吃完火鍋呢 !

然後我和太太便去了另一家吃泰菜的餐廳。吃完泰菜之後看時間也差不多,想預留少少時間去樓上的超市逛逛。當再次經過 MK 火鍋的時候那兩位團友還在裏面努力中。當然我們逛完超市後那兩位團友剛好吃完了,真是厲害,真的可以在一個小時內完成火鍋午餐。

那次之後便想,如果有機會必然會到 MK火鍋吃一餐。終於機會來了 !!!

![](https://cdn.19site.net/files/8b/55/8b55df71-7778-44a7-8ecf-ce5c62180779.jpg '平板電腦的點菜系統')

在科技的加持下,點菜不再是難度了 !!!

![](https://cdn.19site.net/files/46/94/4694fdf4-046b-4f66-8db6-0be4dc6188dc.jpeg '和港式的有得揮')

![](https://cdn.19site.net/files/bb/9b/bb9ba18a-d1dd-4619-b1ef-77b1d23625ba.jpeg '咩都有少少的拼盤')

![](https://cdn.19site.net/files/0a/42/0a42c0af-f01d-47bf-b2ee-c95ce0fec03c.jpeg '泰國特色的魚蛋')

![](https://cdn.19site.net/files/27/48/2748827f-0124-4a7c-8676-24064da56b54.jpeg '燒鴨')

MK 火鍋係有燒鴨叫的,不過比起港式的燒鴨,這裏的口味可能不太岩港人胃口,因為那個汁是好像用花生醬弄成的。味道不是不好,就是有怪不相襯。

![](https://cdn.19site.net/files/36/c1/36c11be8-8c2f-4d3e-b837-ba134fad066c.jpeg '拼盤 2 號')

![](https://cdn.19site.net/files/2d/71/2d718194-6ccb-463b-984c-0bab8e7cc5ee.jpeg '菜類')

四個人埋單大約 2,300 BAHT 左右,比起當地物價唔算是平,不過也是一個值得一試的地方,湯低弄得不錯。

### Platinum Fashion Mall

在下午的時間我們決定分頭事,筆者會和老婆到 Platinum Fashion Mall 逛逛街。這是女士來曼谷必到的地方之一,在那裏筆者認為是曼谷的 "旺中"。衣服款式多,價格也相宜。

![](https://cdn.19site.net/files/d9/70/d970b11d-febe-4be5-80a8-eb3d9cb2cc06.png '可以由 Chit Lom BTS 站行過去 11 分鐘')

![](https://cdn.19site.net/files/82/80/8280f596-8b15-4a84-a11c-5609912a7b07.jpeg '四面佛每次經過也是很多信眾參拜')

筆者在上年來的時間,Platinum 商場還只是個 "Platinum 商場",一年之差已經變為了 "Platinum Fashion Mall",其實這個商場一直也是在賣女裝衣服為主,早在第一次來泰國時已經是。不過經過重新命名後,更為專業。

![](https://cdn.19site.net/files/ee/83/ee83bfeb-90b7-452c-9dcc-bb629ff3a655.jpeg '在 Central World 對出上天橋')

![](https://cdn.19site.net/files/0b/1d/0b1d2a6b-0043-4dad-8ea5-70a5cc3c1b5b.jpeg '向前走便可以到達 Platinum Fashion Mall')

逛完後再由原路走回去。

![](https://cdn.19site.net/files/26/9d/269da74c-119b-422c-b6f7-4654c26995c7.jpeg '已經差不多日落')

![](https://cdn.19site.net/files/cb/0f/cb0ff4ba-7fce-4bd5-81ed-39e55e6f9954.jpeg '四面佛依然多人')

### 晚餐

由於行得太累,所以先回飯店休息一會,然後到 Terminal 21 的 Foot Court 隨使吃了點東西就回去休息了。
1月 08, 2020 19 Things
2019 泰國遊這次跟了 KKDAY 的一日團遊泰國大城,探索一下泰國的歷史古都 !

如果想看看筆者的大城遊記,可以到下面這篇文章 :  
2019 曼谷遊 - Day4 https://19site.net/posts/66

### 大成府

面積約為 2,556.6 平方公里,距首都曼谷約76公里。其疆域北連紅統府及華富里府;東瀕沙拉武里府,南毗巴吞他尼府,西臨素攀府及暖武里府。

大城府為廣闊平原,河道縱橫,是三條河流的匯合處。農業發達,為全泰國最大產米區。另外,水產豐富,且有不少大、中、小型工廠。

### 歷史資料

1563年,緬甸東吁王朝攻滅阿瑜陀耶王朝,及後復國並延續30多年。

1767年,緬甸貢榜王朝軍隊攻陷大城,阿瑜陀耶王朝正式滅亡。後鄭昭重建王國,將首都南遷至吞武裏。

原王城遺址現為阿瑜陀耶遺蹟公園,被列為聯合國教科文組織世界遺產。該府作為大城王國時代的首都時,其文化、藝術、國際貿易均非常發達,很可惜,此古城遭入侵緬甸軍人縱火徹底破壞,現只剩下部份宮殿遺跡、珍貴佛像和精美雕刻等供人憑弔。

### 參觀景點

##### 邦芭茵夏宮

![](https://cdn.19site.net/files/01/b0/01b0c78f-9f21-4c94-8225-3f825114247a.jpeg '夏宮內的建築')

![](https://cdn.19site.net/files/f8/43/f8432fd9-ef52-4167-b701-4d6f1f16f8b5.jpeg '有高塔')

建於 17 世紀的泰皇夏日行宮,鄭王將首都遷至曼谷吞武里區後,邦芭茵夏宮漸漸被荒廢,隨著時間的流逝,年久失修的木製宮殿逐漸腐爛,後在19世紀開始重建,因當時西方文化的傳入,從邦芭茵夏宮的建築可以看出多種元素的融合,包含維多莉亞式、哥德式、中國式,當然還有泰國本身特有的建築風格。在此可以欣賞精心打理的園藝,享受宛如貴族的悠閒氣氛。

##### 大城水上市場

![](https://cdn.19site.net/files/e9/9a/e99acc2a-fb43-418e-a841-5ed7f91cbf6f.jpeg
 '水上市場')

![](https://cdn.19site.net/files/c8/49/c849eb7b-122e-4a5d-85f5-34cd1fa68aa9.jpeg
 '地道小吃')

乾淨整齊的大城水上市場,不同於丹能莎朵的喧鬧,是許多泰國本地人的景點名單之一。避開炎熱的太陽,沿著河岸兩旁建立的商家,探索濃厚古城特色的玩物,品嚐各樣經典泰式小點。若逛到腳酸,不妨體驗道地的泰式按摩。

##### 崖差蒙空寺


![](https://cdn.19site.net/files/e8/1f/e81f5821-d6c3-410d-915a-a1860c6a4af5.jpeg
 '藏經閣')

保留完整的崖差蒙空寺,14世紀為紀念戰勝緬甸軍隊而修建,以戶外臥佛跟寶塔最為知名。高聳雄偉的錫蘭式高塔、連綿壯觀的佛像,你可以爬上塔頂,將硬幣投入許願井中,或是把硬幣貼在臥佛的腳底,許下心願、祈求好運。

##### 瑪哈泰寺

![](https://cdn.19site.net/files/fe/88/fe888200-6580-43f8-a62c-1dfa2f89fc64.jpeg
 '被戰火洗禮')

![](https://cdn.19site.net/files/57/bd/57bd594e-a158-4a9d-a0b2-80cd8a47066f.jpeg
 '樹中佛')

位在遺址中心的瑪哈泰寺是城內最古老的廟宇,「樹中佛陀」更為大城必看景點之一。相傳當時緬甸軍人砍下這尊佛像時,落下的佛首滾到菩提樹旁,被樹根團團包圍保護,緬甸軍因此奇景被嚇退,才得以保有現在所看到的佛寺景象。

##### 帕席桑碧寺 & 帕蒙空博大皇宮&涅槃寺

![](https://cdn.19site.net/files/06/90/0690b91c-f842-4e68-9ee9-ae07ff2e6159.jpeg
 '修建後')

![](https://cdn.19site.net/files/ee/ad/eead86e9-81ee-4bbd-b282-e32b1d3760f1.jpeg
 '修建前的圖片')

主要用來舉行皇家儀式和典禮的帕席桑碧寺,分別存放國王及皇室成員的骨灰在三座鐘型佛塔。即使遭遇戰亂的洗劫,這些佛塔至今仍昂然聳立在寺廟內, 一排排主殿屋簷的圓柱上仍保留姿態千萬的蓮花雕刻,向世人展示大城王朝歷久不衰的傲氣。

> 參考資料 : Wikipedia - https://zh.wikipedia.org/wiki/%E5%A4%A7%E5%9F%8E%E5%BA%9C  
> 參考資料 : KKDAY - https://www.kkday.com/zh-hk/product/18532
1月 08, 2020 19 Things
19Site 的 Youtube Channel 正式啟動 !!

連結網址 : https://www.youtube.com/channel/UCM96oVSbCazZfGwhl2uqbsA

或者可以點擊網站右上角的 Youtube Logo 也可以進入 19Site Youtube Channel !!

Youtube Channel 目的在於記錄遊記剪輯出來的影片 !! 分享 19 筆者的足跡 !!

![](https://cdn.19site.net/files/f4/ce/f4ce9f58-5a29-49e1-9c70-cd2c2fcd7cb1.png '19Site Youtube Channel')

日後可能會以影片的方式分享更多不同的資訊 !! 
我們會常常使用到 Youtube 影片的縮圖作為影片的簡介,這裏會介紹如果得到 Youtube 影片的縮圖。

### 縮圖

我們可以通過 `i1.ytimg.com` 取得影片的縮圖檔案,URL 的格式如下 :

https://i1.ytimg.com/vi/<youtube-video-id>/0.jpg

如果大家有過 Youtube 都會知道其實每一條的影片也會有一組 ID 用來識別。這組 ID 通常都可以在 URL 上找得到,只要我們把這組 ID 貼到上面 `<youtube-video-id>` 的位置,我們便可以得到影片的縮圖了。

### 縮圖大小

以下的縮圖大小是保證會出現的:

| Thumbnail Name| Size (px) | URL|
|---|
| Player Background| 480x360   | https://i1.ytimg.com/vi/<VIDEO ID>/0.jpg|
| Start| 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/1.jpg|
| Middle| 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/2.jpg|
| End| 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/3.jpg|
| High Quality| 480x360   | https://i1.ytimg.com/vi/<VIDEO ID>/hqdefault.jpg |
| Medium Quality| 320x180   | https://i1.ytimg.com/vi/<VIDEO ID>/mqdefault.jpg |
| Normal Quality| 120x90    | https://i1.ytimg.com/vi/<VIDEO ID>/default.jpg|

以下的縮圖大小是不保證會出現的:

| Thumbnail Name| Size (px) | URL|
|---|
| Standard Definition | 640x480   | https://i1.ytimg.com/vi/<VIDEO ID>/sddefault.jpg|
| Maximum Resolution  | 1920x1080 | https://i1.ytimg.com/vi/<VIDEO ID>/maxresdefault.jpg |

在實際使用起來時必需要小心啊 !

> 參考資料 : https://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api
最新因為 Project 需要的關係,所以要為原本的 Server Project 加入一個 OAuth2 的功能。

### OAuth2

RFC6749 詳細說明了 OAuth2 的概念 :  
https://tools.ietf.org/html/rfc6749

如果上面太難睇得明,可以睇下面這篇 :  
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

### OAuth2 角色

OAuth定義了四個角色 :

-	資源所有者 (Resource Owner)
-	客戶 (Client)
-	資源服務器 (Resource Server)
-	授權服務器 (Authorization Server)

##### 資源所有者:用戶

資源所有者是授權應用程序訪問其帳戶的用戶。 該應用程序對用戶帳戶的訪問僅限於所授予授權的“範圍”(例如,讀取或寫入訪問權限)。

##### 資源/授權服務器:API

資源服務器託管受保護的用戶帳戶,授權服務器驗證用戶的身份,然後向應用程序頒發訪問令牌。

從應用程序開發人員的角度來看,服務的API既擔當資源角色又擔當授權服務器角色。 我們將把這兩個角色結合在一起,稱為服務或API角色。

##### 客戶:申請

客戶端是想要訪問用戶帳戶的應用程序。 在此之前,必須先由用戶授權,並且必須由API驗證授權。

### OAuth2 流程

1.	應用程序請求用戶授權訪問服務資源
2.	如果用戶授權了該請求,則應用程序將獲得授權
3.	應用程序通過提供其自身身份的身份驗證和授權授權,從授權服務器(API)請求訪問令牌 (access token)
4.	如果應用程序身份經過驗證並且授權授予有效,那麼授權服務器(API)會向該應用程序發出訪問令牌。 授權完成。
5.	該應用程序從資源服務器(API)請求資源,並提供用於身份驗證的訪問令牌
6.	如果訪問令牌有效,則資源服務器(API)將資源提供給應用程序

該過程的實際流程將根據所使用的授權授予類型而有所不同,但這是一般性的想法。

### 申請註冊

在對應用程序使用 OAuth 之前,您必須在服務中註冊應用程序。這是通過服務網站 “開發人員” 或 “ API” 部分中的註冊表格完成的,您將在其中提供以下信息(可能還包括有關您的應用程序的詳細信息):

-	應用名稱
-	申請網站
-	重定向 URI 或回調 URL

重定向 URI 是服務在用戶授權(或拒絕)您的應用程序後重定向用戶的位置,因此,應用程序中將處理授權代碼或訪問令牌的部分。

##### 客戶編號和客戶密碼

註冊您的應用程序後,該服務將以客戶端標識符和客戶端機密的形式發布“客戶端憑據”。客戶端 ID 是服務API用於標識應用程序的公開字符串,還用於構建提供給用戶的授權 URL。客戶密碼用於在應用程序請求訪問用戶帳戶時向服務 API 驗證應用程序的身份,並且必須在應用程序和 API 之間保持私密狀態。

### 授權

在上面的流程中,前四個步驟涉及獲得授權授權和訪問令牌。 授權授予類型取決於應用程序用於請求授權的方法以及 API 支持的授予類型。 OAuth2 定義了四種授權類型,每種類型在不同情況下都很有用:

-	授權代碼:與服務器端應用程序一起使用
-	隱式:與移動應用程序或Web應用程序(在用戶設備上運行的應用程序)一起使用
-	資源所有者密碼憑證:與受信任的應用程序一起使用,例如服務本身擁有的那些
-	客戶端憑據:與應用程序 API 訪問一起使用

### 實作

由於筆者 Project 現在需要的只是第三方 Server 部份要讀取現時 System 的使用者資料,所以這次只需要使用 "授權代碼" 方式授權就可解決問題了。

關於要如何實作 "授權代碼",可以直接參考 GOOGLE 自家的 OAuth2 方法

GOOGLE: [Using OAuth 2.0 for Web Server Applications](https://developers.google.com/identity/protocols/OAuth2WebServer)

這絶對是可以完全照著流程實作就可以 !
1月 06, 2020 19 Things
曼谷遊的第四天,今天訂了 Local Tour 跟團遊大城。

如果想了解更多大城的歷史和 KKDAY 的相關行程,在另一篇文章會有更多資料 :  
泰國大城府 https://19site.net/posts/70

### Ayutthaya

大城是泰國舊有的首都,因為經過戰事的洗禮後,變成文化遺產。那裏有著舊有的泰國文化氣色,是一個十分值得到的地方。

### 出發

走出去飯店的行道,發覺今天天氣非常好 !! 由於出發地點,是距離在一個地鐵站外的小紅屋,所以我們先到地鐵站坐地鐵去。

![](https://cdn.19site.net/files/f4/72/f47212db-757b-448b-b3e5-3f30077391dc.jpeg '天清氣朗')

然後在 Asoke 坐地鐵到 Phetchaburi 站去集合地點。

![](https://cdn.19site.net/files/dc/6d/dc6d7db9-0b09-4005-a14c-d10ee84b8ea6.jpeg '坐地鐵')

出地鐵站後會看到一間賣咖啡的店鋪,然後轉左便會看到長長的電梯。上天梯後便會看到長長的天橋,當走到長長天橋的中間時便會看到遠處有一所紅色小屋。

![](https://cdn.19site.net/files/10/43/10439f84-b065-46cf-8095-2babb3920a11.jpeg)

就會看到遠處的 "紅色小屋",那裏就是今天的集合點。

![](https://cdn.19site.net/files/22/5e/225e7fe4-c953-47c6-af13-71227cd727bf.jpeg)

那裏的人超多的,站著都是等待本地旅行團的遊客。然後就坐車出發 !!!

### 第一站 - 邦芭茵夏宮

這個地方是第五世國皇時建立的皇宮,當中有很多歐式建築風格。

![](https://cdn.19site.net/files/01/b0/01b0c78f-9f21-4c94-8225-3f825114247a.jpeg)

![](https://cdn.19site.net/files/f8/43/f8432fd9-ef52-4167-b701-4d6f1f16f8b5.jpeg)

![](https://cdn.19site.net/files/e3/4d/e34d077a-a39d-41c4-8616-a0ddb0039f42.jpeg)

### 第二站 - 河邊市集午餐

這個市集是在一條公路的側邊,旅遊巴入去時我還以為是進去吃 "超值餐"。後來發現原來是進去一個市集 !!! 裏面有得多本地製作的手工藝品及當地手作的小食 !! 是日的午餐也是在這裏解決 !

![](https://cdn.19site.net/files/48/7c/487cbb38-89c3-4408-8f21-57895a4e5e0a.jpeg '這個市集')

![](https://cdn.19site.net/files/10/6c/106c96f0-00bd-4a25-b591-6b12c92644d3.jpeg '不知道什麼名字的市集')

![](https://cdn.19site.net/files/e9/9a/e99acc2a-fb43-418e-a841-5ed7f91cbf6f.jpeg '市集的負責人要來個歡迎會')

![](https://cdn.19site.net/files/c8/49/c849eb7b-122e-4a5d-85f5-34cd1fa68aa9.jpeg '椰汁做的甜品')

![](https://cdn.19site.net/files/84/de/84de2794-8a76-4dda-a59f-fb4ac3358b6e.jpeg '這個不知名的小食')

### 第三站 - 帕蒙空博碧大皇宮

吃過午飯後,就要去最主要的目的地 "帕蒙空博碧大皇宮" 了 !

![](https://cdn.19site.net/files/5a/94/5a9456ed-72e7-4278-a5d2-aef6c139820c.jpeg '在路上看到的巨大石牌')

![](https://cdn.19site.net/files/fe/d5/fed5fd2a-73f9-4547-b306-03fe4e762a0e.jpeg '古代的石建築群')

![](https://cdn.19site.net/files/e8/1f/e81f5821-d6c3-410d-915a-a1860c6a4af5.jpeg '角度一轉變成耀眼的陽光')

![](https://cdn.19site.net/files/ca/6c/ca6cab9d-9d81-4251-a5f1-05e9b7d570e9.jpeg '依導遊所說,這是藏經閣')

![](https://cdn.19site.net/files/3e/17/3e178f21-12de-4de0-8733-e977ab270893.jpeg '藏經閣的內部')

![](https://cdn.19site.net/files/f6/3c/f63c41f9-cf69-41e4-bd14-1ce87913f32b.jpeg '中間的樓梯可以直入藏經閣')

![](https://cdn.19site.net/files/da/56/da56853f-b639-4698-b2f6-e95674e67c02.jpeg '這裏可以參拜佛')

![](https://cdn.19site.net/files/38/b0/38b0de7b-9bf4-4961-99b3-252cb63b57f5.jpeg '信徙可以買黃布,為佛像們加上黃衣')

### 第四站 - 世界文化遺產石碑銘

來的時候這裏的時候,導遊姐姐說這裏有個特別的廁所,這個廁所要收 10 元的。是因為廁所來回播放音樂還有冷氣 ...

而正正在這個音樂廁所的後面,有一個免費的廁所。

![](https://cdn.19site.net/files/a1/75/a175ef2e-0b7d-4080-a72f-113426a1fe76.jpeg '在門口附近有個模型展示舊有的建築群')

![](https://cdn.19site.net/files/52/51/525165c2-ac3b-4951-82d5-eaf91f10e950.jpeg)

![](https://cdn.19site.net/files/57/bd/57bd594e-a158-4a9d-a0b2-80cd8a47066f.jpeg '樹中佛')

![](https://cdn.19site.net/files/1c/3e/1c3e92bc-22ed-416b-bf32-28a020f18641.jpeg '一遍荒涼')

![](https://cdn.19site.net/files/fe/88/fe888200-6580-43f8-a62c-1dfa2f89fc64.jpeg '因為戰亂所以變得殘破不堪')

### 第五站 - 涅槃寺

在停車場下車後,行出過一個很舊的市場,便來到這個寺廟。

![](https://cdn.19site.net/files/06/90/0690b91c-f842-4e68-9ee9-ae07ff2e6159.jpeg '現時的寺院')

![](https://cdn.19site.net/files/ee/ad/eead86e9-81ee-4bbd-b282-e32b1d3760f1.jpeg '寺院的舊相片,因為戰亂所以變得殘破不堪')

![](https://cdn.19site.net/files/23/30/23302191-135e-491f-9ab8-bf037878dedc.jpeg)

### 最後一站 - 拉查達火車夜市

當進入到火車夜市時,真的太可怕了 !!! 門外竟然企了大約 500 人 ...

原來火車夜市已經變成了中國旅行團必到的景點 ... 那邊的人真的多得有點可怕,筆者快快的吃點東西就立即走人 ...

走時還看到有三到四團旅行團在地鐵站上來 ... 每團也有 30 - 40 人 ...

1月 02, 2020 19 Things
曼谷遊的第三天,因為昨天的行程在太過高強度了,所以今天要去一點舒服的地方。

每天出發前都一定要食個靚早餐,今天也是不會例外的,所以這天到船面一條街,食泰國地道的美食,船面 !

### 船面

來到泰國都必定要吃一吃船面 !!

![](https://cdn.19site.net/files/e0/df/e0df0fe0-f4dc-4710-a44a-11079c00e188.png 'Rua Thong Noodle 在 Google Map 上的位置')

由於出門口時已經時大約早上 11 時多了,為免太過晏食飯,所以決定 GRAB 車去,130 BAHT 大約 20 分鐘就到,非常方便。

話說今次來泰國是沒有想過再去食船面的,因為上次食完一次後的經驗不是太好。第一次食船面是在 2016 年,那時和太太來泰國,剛好在行程上遇到朋友 POLO 哥,我們行完 JJ Market 後,他帶我們去勝利紀念碑站食船面。那一家是在商場內的,湯好飲,面好食,食了很多碗 !!!

但係食食下看到餐廳好多甲由行來行去,之後去比錢時,更加有甲由在收錢枱面走來走去,店員好像很熟的把甲由用手弄走....

吃完後我和太太先回酒店休息,事後痾了數次...  畢生難忘。

然後上次去是 2018 年,因為船面的味道仲係好難忘,但係唔想再去食甲由面...  所以去了第二家比較出名的 !!! 就是船面一條街最出面那一家了 !! 可是味道真的是差太多... 沒有當年食甲由面那種味道。

今次決定行入一點,吃裏面一點那家,這次好像有驚喜 !!! 因為有很多人在等呢,還要是泰國當地人 !!

人很多但是地方也很大,等了一會就有位置了 !! 先立即點吃的 !!!

![](https://cdn.19site.net/files/70/a4/70a478e5-c58b-48ad-9ce1-7f938a5ff804.jpeg '先來個可樂和豬油渣')

第三次食船面也算是有點心得,知道什麼比較岩胃口,所以主力都是叫岩口味的 !

![](https://cdn.19site.net/files/16/91/1691ae30-a9ca-4620-a8f5-333821f69005.jpeg
 '再來 12 個面')

![](https://cdn.19site.net/files/2d/fd/2dfd36e9-3d01-49c6-bbc0-28f81efe4451.jpeg
 '這次的面非常好味,找到甲由面的味道,但是沒有甲由了 !')

這次十分滿足 !!! 食完之後有另一個景點 !!!  都是在勝利紀念碑站的 !!!

### Kay's Cafe

Kay's Cafe 是太太找的一間 Cafe,有什麼特別 ? 是因為店內一個位置放了個花牆作為影相位 !! 女仔一定會為此變心心眼 !

![](https://cdn.19site.net/files/c8/77/c877993f-51b8-4da1-9e7f-c644b9fe06c9.png
 '在船面一條街行過去')

![](https://cdn.19site.net/files/a0/e4/a0e46696-b3ea-428f-a9b2-f4bb138fd9c9.jpeg '船面一條街')

![](https://cdn.19site.net/files/c3/03/c303ea36-1d8c-4477-bb48-8563f4f276c2.jpeg
 '勝利紀念碑站必到超長天橋')

![](https://cdn.19site.net/files/d2/82/d282dca0-2bcd-44ac-a1b4-2a3270d999ef.jpeg
 '在路上看到的日式店')

![](https://cdn.19site.net/files/19/e0/19e0e140-b9df-4194-b87c-6d910d6cfe4e.jpeg
 'Kays Cafe 就在裏面 !')

![](https://cdn.19site.net/files/49/34/4934a1f0-7a8c-4818-8b4d-0f56b8f94815.jpeg
 '點了東西喝')

左邊的是 Thai Latte,右邊是 Chococino。

![](https://cdn.19site.net/files/cf/dc/cfdcc576-4fcc-490c-ae69-6df3a77b3cde.jpeg
 '還有天然採光')

![](https://cdn.19site.net/files/32/e8/32e88d2b-2e2e-4763-b739-a9f1cd621258.png
 '主打的大花牆')

很多當地的年輕男女也來拍拍照片 !!! 我們也拍了很多照片 !!

大約休息一個小時左右,因為日光實在太強的關係,所以決定先回酒店休息一會,晚上再去轉戰第三目的地,霓虹夜市。

### 霓虹夜市

在 2018 年來的那一次,看到有廣告片在介紹水門夜市 !! 但是行了半天也在水門找不到夜市,後來在一次 GRAB 車時經過一個地方,問問司機原來那裏就是水門夜市 !! 那時知道只會在星期四晚上才會開的。

時至今日,那個夜市命為霓虹夜市,天天開門 !!

![](https://cdn.19site.net/files/00/82/008286df-3042-4946-9b6b-7dd2d95d75a9.jpeg
 '有很多東西賣')

不過因為肚子餓的關係,所以決定先去醫醫肚 !!

![](https://cdn.19site.net/files/cb/76/cb7665b6-019b-4eeb-a277-ed4dbb1eb085.jpeg '菜單很多選擇')

這裏有個文化是其他夜市沒有的,就是這裡的餐廳都會以 8 折作招來,吸引客人入來消費。如果你的定力足夠的話,他更會開個 75 折給你。所以不用急著進一家餐廳。

最後找了一家 25% off 的吃 !

![](https://cdn.19site.net/files/58/b1/58b10e7d-9d4a-47be-8092-c09bff330640.jpeg '炒通菜')

![](https://cdn.19site.net/files/26/87/2687c501-cb6c-4786-9fb5-fd51d2b00ae2.jpeg '泰式生蝦')

![](https://cdn.19site.net/files/38/d6/38d69d0b-94c8-4f1d-b113-56b3c0d3cd6e.jpeg '波蘿炒飯')

![](https://cdn.19site.net/files/0f/6f/0f6f6525-9184-4bd0-91c5-18c0431ac624.jpeg '冬陰功')

這個冬陰功湯很好味,少有地在泰國能夠吃到這個水準。

![](https://cdn.19site.net/files/97/bd/97bd30f2-133d-46ea-960e-d9f466da6603.jpeg '咖喱炒蟹')

吃飽後因為我們需要乘坐 BTS 的關係,所以也要穿過那條車水馬龍的馬路,向水門西飯那個方向進發 !

![](https://cdn.19site.net/files/2f/18/2f18a394-2d17-4327-9776-3dc1a09ff23b.jpeg '晚上的水門河畔原來有野食')

![](https://cdn.19site.net/files/29/56/295608a3-ac6c-4430-b679-31e6a1264710.jpeg '現在的 Central World 交通好像好了很多')

![](https://cdn.19site.net/files/d7/b3/d7b3f566-15ed-43c8-b970-6a6f7e12cb1f.jpeg '海南雞飯宵夜')

在路過水門海南雞飯時,買了兩合回來當宵夜 !
1月 02, 2020 19 Things
曼谷遊的第二天,起身當然要食返個早餐補充下能量,因為今次住近 Asoke Terminal 21,所以就去返 Pier 21 食個靚早。

![](https://cdn.19site.net/files/06/30/0630f3ee-5c27-40a2-bda7-22eea6b2efe4.jpeg '靚早')

食完個靚早,就出發去今日的目的地,大皇宮。

### 出發大皇宮

Grap 車去大皇宮,話近唔近,話遠都唔遠。

![](https://cdn.19site.net/files/93/a7/93a74714-c816-48f6-8233-fb1d3b7b39d2.png)

### 到達

今日天氣晴朗,得好少雲。特別的熱啊 !!

先去買門票 !

![](https://cdn.19site.net/files/ae/2b/ae2b54b3-d260-4d08-98c5-8933479a49a3.jpeg '500 BAHT 一位')

![](https://cdn.19site.net/files/ab/97/ab97e206-5ea6-492b-939c-1a16321248a0.jpeg '好多金色的建築')

![](https://cdn.19site.net/files/48/ee/48ee7284-5162-423c-8004-75562a6d4078.jpeg '金色的建築')

![](https://cdn.19site.net/files/70/f2/70f223de-effa-45f9-8be4-a0b8b29296a2.jpeg '每個細節都造得好靚')

前一次來的時間因為泰王離世的關係,所以大皇宮內很多地方也沒有開放出來。事隔兩年,現在開放能進入了。

![](https://cdn.19site.net/files/1d/71/1d71d0c6-c1bb-4b9b-8033-6ff08067d3a2.jpeg '後院')

![](https://cdn.19site.net/files/ae/0c/ae0caf78-ae88-469e-9133-669436793ad3.jpeg '很多遊人')

天氣實在太熱,離開大皇宮後到了一所 cafe 喝喝坐坐回一下體力。

![](https://cdn.19site.net/files/49/25/49256185-3a9a-4c1c-a866-724b4e0d842e.jpeg '有閣樓的 cafe')

### 鄭王廟

行回出去大碼頭,只需要比 4 BAHT 就可以坐船到鄭王廟,鄭王廟的日落可是很出名的。另一出名的,是鄭王廟的樓梯很斜的。

![](https://cdn.19site.net/files/b8/c9/b8c9aff8-d54c-4592-9f1e-5aeef693b15e.jpeg '差不多黃昏的時間')

![](https://cdn.19site.net/files/68/39/68396db8-5724-4628-835e-6f388ea6bb99.jpeg '以白色為主色的建築')

![](https://cdn.19site.net/files/4f/fe/4ffeea31-a906-431a-8ad0-bf9ae09c1c8e.jpeg '太陽快要下沉了')

![](https://cdn.19site.net/files/cb/30/cb3054fe-b7ab-4f47-807f-b4f137736c73.jpeg '總共有4 層,只開放 2 層給遊人上去')

### 回去

行完大皇宮和鄭王廟已經超級累 ...  就拿拿淋 GRAP 車回去 Asoke Terminal 21 按摩去 !!! 然後又去 Pier 21 食晚飯 !!!

因為太累了,相也沒有影。
1月 02, 2020 19 Things
又到了年尾的時間,當然又是遊泰國的時間。因為 12 月的泰國相對較為涼快,所以差不多每年的 12 月也會去泰國玩玩。今年也是一樣 !!

### 曼谷遊

因為筆者上年和太太遊完泰國之後,發現曼谷實在太多野玩 (及好方便)。於是就計劃今年可以和外父外母一齊來泰國自由行。

在出發之前去了買泰國用的電話卡,AIS 7 日卡只係要 $45 蚊,真係抵到爛 !!! (電話卡個哥仔無介紹錯),下載埋個 GRAP APP,真係 1 GRAP 在手,叫車無難度 !

### 出發

![](https://cdn.19site.net/files/00/f5/00f5001e-11d6-40fd-98e6-4b7b206c8b95.jpeg '今年坐 CX 單丁位對住走廊')

![](https://cdn.19site.net/files/83/e2/83e259dd-1e03-4497-8275-d52ad0bf459b.jpeg '對於坐開廉航的筆者來說,這是十分豐富的飛機餐')

![](https://cdn.19site.net/files/0e/6f/0e6fb83b-4bdc-43a2-bb21-3e9c1c2cf696.jpeg '原來坐位有電視 ! 現在才發現 !')

![](https://cdn.19site.net/files/37/34/373443d0-505c-40e8-9e00-2614f0c8379f.jpeg '經過了 3 小時 20 分鐘,到達了 BKK 機場 !')

### 到達

到達後回到飯店已經是當地時間大約 4:30,時間尚早可以去一轉 Big C 買呢幾日用的日用品。

### Chit Lom 站

![](https://cdn.19site.net/files/65/7f/657f4b89-f7ce-47ea-b6d5-0631e1daaa52.jpeg 'Chit Lom 出站必定會看到的洲際酒店')

上年去泰國時,新商場已經起好了並已經通行,以後去 Big C 不用再由 Central World 轉個大圈才能過去。

![](https://cdn.19site.net/files/30/de/30de78f3-15aa-4cfc-9324-189b40d6b837.jpeg '現在可以行行人天橋')

![](https://cdn.19site.net/files/e4/6c/e46ce4aa-544b-412a-bee9-96404138ce17.jpeg 'Central World 的超巨型廣告燈箱')

在未去 Big C 前先去水門食個飯醫下肚仔先,點知下橋後又見到新商場 !!

![](https://cdn.19site.net/files/5a/07/5a07bdc8-77b4-4ef4-89d3-1b04e4bb10ef.jpeg '上年聖誕還沒有的商場')

![](https://cdn.19site.net/files/de/71/de7189ec-c25b-4a96-a582-796d535307ea.jpeg '4 個人的分量')

吃飽後決定到新的商場走走。

![](https://cdn.19site.net/files/7a/7e/7a7e9a02-ba1b-414c-9875-bf21d6c8bff5.jpeg '地方很大,樓底超高')

商場的格區主要也是小店居多,有吃的也有買衣服的。

走過這間 AIIZ (連鎖服裝店),被排得非常整齊的衣服吸引住了 !

![](https://cdn.19site.net/files/34/f8/34f8043d-5564-4f9a-8a72-2fcc0fc7359a.jpeg '太整齊了')

![](https://cdn.19site.net/files/d4/41/d441f8de-218c-448c-b102-7a8b648affcc.jpeg '顏色也是放得好好的')

![](https://cdn.19site.net/files/05/15/0515735a-575e-48fd-b9de-d2acf1627d55.jpeg 'Central World 對出的馬路依然是車水馬龍')

不知道是否因為節日關係,Central World 對出的空地現在變成了夜市 !!

![](https://cdn.19site.net/files/e2/a7/e2a7c3a9-f2a2-40a8-ab98-45384e34275f.jpeg 'Central World 夜市')

行完夜市就回去 Big C 購物 !!

![](https://cdn.19site.net/files/8f/92/8f9237b2-220b-47e2-9835-545fd56163a3.jpeg '大量戰利品')

### 回飯店

回到飯店前到了 7 仔買了個三文字吃 ! 這個超好吃,每天也要必吃一個 !

![](https://cdn.19site.net/files/91/73/9173aa35-0d39-4ffb-b2e5-a20012e2f709.jpeg '店員可以幫你加熱')

開電視看看泰國新聞,看到有報道有關香港的 "和你 SHOP" 活動,驚方又出來濫捕。

![](https://cdn.19site.net/files/f0/32/f032bb96-f07f-49a2-af50-e4dbd1e9eb3b.jpeg '聖誕節行下街好正常')

![](https://cdn.19site.net/files/5a/9b/5a9b6757-30ba-4667-a185-b616a79b0710.jpeg '唔洗出水炮車下嘩')
1月 02, 2020 Ubuntu
每次要裝新機時,都會有機會做一次這個動作。

### 檢查主機時間

可以透過使用以下指令取機主機現時時間:

```sh
$ timedatectl
```

應該會有類似以下的結果 :

```sh
                      Local time: Thu 2020-01-02 04:32:15 UTC
                  Universal time: Thu 2020-01-02 04:32:15 UTC
                        RTC time: Thu 2020-01-02 04:32:15
                       Time zone: Etc/UTC (UTC, +0000)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no
```

預設應該是使用 UTC 的設定。

其實系統的時間是在 `/etc/localtime` 設定的,我們可以查看一下它:

```sh
$ ls -l /etc/localtime
```

會看到它是一個 Symbolic Link 指向一個 zoneinfo 檔案。

```sh
lrwxrwxrwx 1 root root 27 Oct  3 06:18 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
```

### 使用 timedatectl 來變更 timezone 設定

首先我們可以透過以下指令取得可以使用的 timezone :

```sh
$ timedatectl list-timezones
```

會列出大量的結果:

```sh
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
Africa/Ceuta
Africa/Conakry
Africa/Dakar
Africa/Dar_es_Salaam
...
```

然後使用 `timedatectl` 變更時區:

```sh
$ sudo timedatectl set-timezone Asia/Hong_Kong
```

上面的指令是變更時區到香港,如要變更其他地方時區則只要填上其他地方便可以。

然後可以再次使用 `timedatectl` 查檢變更後的時區 :

```sh
$ timedatectl
```

現在變更為 Asia/Hong_Kong 了。

```sh
                      Local time: Thu 2020-01-02 12:49:30 HKT
                  Universal time: Thu 2020-01-02 04:49:30 UTC
                        RTC time: Thu 2020-01-02 04:49:30
                       Time zone: Asia/Hong_Kong (HKT, +0800)
       System clock synchronized: yes
systemd-timesyncd.service active: yes
                 RTC in local TZ: no
```
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)