# Welcome!

ยินดีต้อนรับเข้าสู่ gitbook ของทาง mikkipastel ชื่อว่า mikkicoding ชื่อเหมือนช่องยูทูปใหม่ของเราเลยอ่า

เป็นการย้ายโปรเจกเดิม ที่ชื่อว่า [owlvegrammo](https://owlvegrammo.firebaseapp.com) ย้ายมาในนี้ พร้อม content ที่สมบูรณ์ยิ่งขึ้น

### Introduction of Programming

มาทำความรู้จักเกี่ยวกับการเขียนโปรแกรมกันก่อน ว่าภาษาคอมพิวเตอร์มีอะไรบ้าง และต้องเรียนรู้อะไรบ้างในการเขียนโปรแกรม

### Python for Beginner

เรียนรู้ภาษา python ในระดับพื้นฐาน ก่อนที่จะต่อยอดกับงานอื่นๆ เช่น back-end, embedded system และ data analysis ทุกคนสามารถเรียนรู้ได้ง่าย

### Basic of C

มาเรียนรู้การเขียนภาษา C ตั้งแต่ต้นยันจบ เพียงพอต่อการสอบวิชาโปรแกรมมิ่งเบื้องต้น ในสถาบันการศึกษาที่สอนภาษาซี แน่นอน ในตอนนี้พิมพ์สรุปแปป เดี๋ยวเอามาลงจ้า

พร้อมแล้ว ลุยเลยยยย!!!!\~\~


# การทำงานของคอมพิวเตอร์เบื้องต้น

การทำงานของคอมพิวเตอร์ นอกจากจะมีกระแสไฟฟ้าที่ทำให้คิมพิวเตอร์ทำงานได้แล้วนั้น ยังมีโปรแกรมเป็นตัวเชื่อมระหว่าง hardware กับ user การทำงานของโปรแกรมนั้น เมื่อป้อนคำสั่งเข้าไป compiler จะแปลงเป็นภาษาเครื่อง (Machine Language) ซึ่งเป็นเลขฐานสอง ภายหลังมีการพัฒนาภาษาโปรแกรม โดยเริ่มจากภาษาแอสเซมบลี (Assembly Language) เป็นภาษาระดับต่ำ (Low-level Language) จนพัฒนาภาษาให้ใกล้เคียงกับมนุษย์มากขี้น จนเป็นภาษาโปรแกรมที่เราใช้กัน คือ ภาษาระดับสูง (High-level Language) เช่น C , C++ ,C# , JAVA , PHP , Pascal เป็นต้น


# การแปลภาษาของโปรแกรม

การแปลภาษาของโปรแกรม มี 2 แบบ คือ

![](/files/LTfDDvlASQu2Bu3YLeKU)

* **Interpreter** เป็นการแปลคำสั่งทีละบรรทัดก่อนที่โปรแกรมจะทำงาน เมื่อพบข้อผิดพลาด โปรแกรมจะหยุดทำงานทันที ทำให้โปรแกรมทำงานค่อนข้างช้า เช่น ภาษา python
* **Compiler** เป็นการแปลคำสั่งทั้งโปรแกรม ถ้าพบข้อผิดพลาด โปรแกรมจะแสดงข้อผิดพลาดออกมา ทำให้โปรแกรมทำงานได้เร็วกว่า เช่น ภาษา C


# Flowchart

คือ การเขียนขั้นตอนของการทำงานของโปรแกรมคอมพิวเตอร์ เพื่อนำไปเขียนโปรแกรมต่อไป มีการเขียน algorithm อยู่ 2 ลักษณะ คือ

1. การเขียนซูโดโค้ด (Pseudocodes) : เป็นการอธิบายขั้นตอนการทำงานของโปรแกรมเป็นขั้นตอนในการเขียนโปรแกรมได้ง่ายขึ้น
2. การเขียนผังงาน (Flowchart) : เป็นแผนงานที่ใช้อธิบายการทำงานของโปรแกรม โดยใช้แผนภาพอธิบาย เพื่อศึกษาการทำงานของโปรแกรมได้ง่าย การเขียนผังงานแบ่งออกได้เป็น 2 ประเภทใหญ่ๆ คือ

* ผังงานระบบ (System Flowchart) : แสดงการทำงานภายในระบบ แต่ไม่ได้แสดงคำสั่งที่ใช่ในโปรแกรม
* ผังงานโปรแกรม (Program Flowchart) : เป็นการอธิบายการทำงานของโปรแกรม แสดงคำสั่งที่ใช้ในโปรแกรม จึงสามารถนำไปใช้ในการเขียนโปรแกรมได้

ที่นิยมเขียนกัน จะใช้มาตรฐานของ ANSI (American National Standards Institute) เช่น

![](/files/woQpd7nqSXn9UeucM7cS)


# Preprocesser Directory

ทุกไฟล์ในทุกภาษาจะต้องมีการเรียกใช้ library ต่างๆก่อน จึงจะเข้าสู่การ compile program เช่น

* ในภาษา C จะมีการ #include เพื่อเรียกใช้ library และ #define เพื่อกำหนดค่าที่ใช้ในโปรแกรม

![](/files/EYMorSIDGIKbZt8Gv3rG)

* ในภาษา JAVA หรือในภาษา python จะมีการ import เพื่อเรียกใช้ library

![](/files/iiLwNgj8mnXaNMBs5slz)


# Basic Coding

## Data type

ประเภทของตัวแปรในแต่ละภาษาจะมีคล้ายๆกัน เช่น

* Number : ตัวเลขต่างๆ `int`, `float`, `double`, `long`
* Char : ตัวอักษร
* String : ตัวหนังสือ
* Boolean : ส่วนใหญ่มีค่า true และ false เท่านั้น
* List, ArrayList

## Condition & Loop Statement

การเขียนโปรแกรมหลักๆ

* **Condition**

เป็นการเขียนโปรแกรมเพื่อเลือกอย่างใดอย่างหนึ่ง เช่น การเลือกประเภทของสัตว์ ถ้าผู้ใช้เลือกสุนัข โปรแกรมก็จะแสดงผลชื่อสายพันธุ์ของสุนัข เป็นต้น

syntax ที่ใช้หลักๆ คือ if-else, switch-case

* **Loop Statement**

เป็นการสั่งให้โปรแกรมทำงานคำสั่งเดิมซํ้าๆ ตามจำนวนรอบที่เราต้องการ เช่น การให้หุ่นยนต์วิ่งรอบสนาม

syntax ที่ใช้หลักๆ คือ for, while, do-while


# แนะนำภาษา python

python เวอร์ชั่นปัจจุบัน คือ 3.6 (19 มิถุนายน 2560) เป็น high-level language มีการแปลภาษาแบบ interpreter คือทำทีละบรรทัด เป็นภาษาที่เรียนรู้ได้ง่าย

ในชีวิตประจำวัน python ถูกนำมาใช้งานหลายอย่าง เช่นการทำ back-end ของ dynamic website, ใช้ในงาน data science, การเขียนโปรแกรมลงบน hardware สำหรับงาน embedded system เป็นต้น\
สามารถดาวน์โหลด python มาใช้งานได้ที่ <https://www.python.org/downloads/> และมี document วิธีการเขียนโปรแกรมด้วยภาษา python ที่ <https://docs.python.org/3/library/>

เราสามารถใช้ editor ในการเขียนโปรแกรมภาษา python ได้หลากหลายโปรแกรม เช่น notepad++, sublinetext, pyCharm เมื่อเราติดตั้งตัว python แล้ว ก็สามารถ run source code ภาษา python ได้

ความแตกต่างของ python 2.7 vs python 3.3 ถึงเวอร์ชั่นปัจจุบันจะเป็น python 3.x แต่มีบางโปรแกรมและบางหน่วยงานใช้ python 2.7 อยู่ ดังนั้นเราจะมาดูความแตกต่างกันระหว่าง 2 เวอร์ชั่นนี้

<table><thead><tr><th width="184.90899062327634"></th><th>python 2.7</th><th>python 3.x</th></tr></thead><tbody><tr><td>Print</td><td><code>print “hello world”</code></td><td><code>print (“hello world”)</code></td></tr><tr><td>Integer Division</td><td>3/2 = 1</td><td>3/2 = 1.5</td></tr><tr><td>Input Value</td><td><code>raw_input()</code></td><td><code>input()</code></td></tr><tr><td>Stripline in File</td><td><code>string.spilt(f.read(), “\n”)</code></td><td><code>f.read().strip().splitlines()</code></td></tr><tr><td>File Mode</td><td>rb, wb, ab</td><td>r+, w+, a+</td></tr></tbody></table>

การเลือกใช้ python ขึ้นอยู่กับโปรแกรมที่รองรับ และปัจจัยอื่นๆ ที่นอกเหนือจากความใหม่ของเวอร์ชั่น


# ติดตั้งโปรแกรม python ลงบน computer

[download จากหน้าเว็บ](https://www.python.org/downloads/) เลือก version ได้ตามชอบใจ จากนั้นลงโปรแกรมปกติเลย และส่วนสำคัญ คือ การ set path ที่ system environment

กดคลิกขวาที่ไอคอนคอมพิวเตอร์ของท่าน เลือก properties และเลือก Advances system setting

จากนั้นกดปุ่ม Environment Variables ไปที่ system variable เลือกตัวแปรชื่อ path และใส่ path ของ python ลงไปเพิ่ม แค่นี้ก็เรียบร้อย หรือจะทำที่ command line ก็ได้นะ แต่วิธีนี้ชัวร์และอุ่นใจกว่า

ตัวโปรแกรม python มีสองแบบ คือแบบ command line กับแบบ GUI

![แบบ command line
](/files/DGM9EKCPoUImFkaJgEsP)

![แบบ GUI](/files/c4oAUT8YfwuzxAtcL9HK)

ข้อดีข้อเสียอย่างย่อๆ คือ แบบ command line เวลาเราพิมพ์ผิด เราจะต้องพิมพ์ใหม่ ส่วนแบบ GUI เราพิมพ์ผิดแล้วก็อปแก้พิมพ์ใหม่ได้ มีแค่นี้แหละ


# การพิมพ์คำสั่งขั้นต้น

การพิมพ์ Hello world ออกมาสู่หน้าจอ เวลาเราเรียนภาษาใหม่ๆ มักจะเป็นคำนี้เสมอเลยเนอะ คำสั่งใช้ง่ายมากๆเลย

```python
print "Hello world" #ง่ายๆเลย แต่อันนี้ของ python 2.7
print ("Hello world") #อันนี้ของ python 3.0 ขึ้นไป
```

นี่คือสิ่งที่เราบอกว่า syntax ต่างกันไงหล่ะ

ใช้ # เพื่อ comment code นะจ๊ะ

> ข้อควรระวัง ในภาษา python ไม่ได้ใช้ ; ในการสิ้นสุดคำสั่งนะ และใช้ 2space แทน tab


# Data type และการประกาศตัวแปร

Data type ใน python ไม่ได้มียุ่บยับหรือภาษาอื่น หลักๆมีสามตัวคือ

### Number

ตัวเลขทั้งหลาย เราจะบวกลบคูณหารผ่าน python ก็ทำได้ง่าย สบายๆเลย เช่น

```python
บวก ลบ คูณ หาร : +, -, *, /          =>    7/2
การหารเอาเศษ  : mod %               =>    7/2
เลขยกกำลัง     : power **            =>    7**2
การหารแบบปัดลง : floor division //   =>    7//2
การหารแบบปัดขึ้น : round()             =>    round(7/2)
```

**ตัวอย่าง**

```python
2^n - 1 จะได้เป็น (2**n)-1
pi r^2 จะได้เป็น pi*(r**2)
```

ตัวแปรประเภท Number ประกาศ data type เป็น เลขจำนวนเต็ม `int()` และ จำนวนทศนิยม `float()`

หรือประกาศเป็นเลขฐานต่างๆก็ได้ด้วยนะ เช่น เลขฐานสอง `bin()` เลขฐานสิบหก`hex()`

**ตัวอย่าง**

```python
int(‘11001100’,2) #204 แปลงเลขฐานสองเป็นฐานสิบ
int(‘0x20’,16) #32 แปลงเลขฐานสิบหกเป็นฐานสิบ
bin(int(‘0xDEC’,16)) #แปลงเลขฐานสิบหกเป็นฐานสิบ และแปลงเป็นเลขฐานสอง
hex(int(‘101010101010’,2)) #0xAAA แปลงเลขฐานสองเป็นฐานสิบ และแปลงเป็นเลขฐานสิบหก
```

การทำ Fixed point number

```python
from decimal import Decimal
interest = Decimal(“6.4200”)
```

### String

ตัวอักษร พี่เหลือมสามารถเล่นได้เยอะแยะเลย ทั้งการเลือกตัวอักษร ตัดทิ้ง บวกสตริง เซ็คความยาว

* การสร้างตัวแปร string ใหม่ : `hello = str()`
* การตรวจสอบความยาวของ string : `len(hello)`ถ้าความยาวเป็น 0 นั่นคือเป็นตัวแปร string เปล่าๆ นั่นเอง
* ค้นหาคำที่เราต้องการในตัวแปร string : `find()`
* การนำ space หัวท้ายออกจากกัน : `strip()`
* การตัดคำออกตามที่เราต้องการ : `split()`
* การแทนค่าคำ : `replace()`

#### ช่วงลองทำดู

เนื่องจากมันเล่นได้หนุกหนาน เลยมีอะไรให้ลองทำนิดหน่อย

1. ให้ตัวแปร string ชื่อว่า hello แล้วกัน มีค่า `Hello, it's me. I was wondering if after all these years`
2. ตรวจสอบความยาวของ hello
3. หาคำว่า me ใน hello
4. ตัดคำจาก space ออกเป็นคำๆ
5. แทนค่าคำว่า me ว่า you

<details>

<summary><strong>คำเฉลย</strong></summary>

```python
hello = "Hello, it's me. I was wondering if after all these years"
len(hello)
hello.find("me")
hello.split(" ")
hello.replace("me","you")
```

</details>

> เราสามารถใช้ escaped with backslashes (\n \r\n \t \0 \x) ใน python ได้ด้วยนะ

### List

อันนี้อาจจะต่างจากพวกภาษา C แต่ภาษาอื่นๆก็มี มันคล้ายๆ array แต่ไม่ใช่ซะทีเดียว

```python
list = [1, 2, ,3, ...]
```

การใส่ค่าใน list ไม่จำเป็นต้องใส่ค่าประเทภเดียวกัน เช่น

```python
member = [“brown”, 94, True]
```

การเพิ่มสมาชิกใหม่ มี 2 แบบ คือ

* **append** : ใส่เป็นคำ หรือตัวเลขก็ได้ => `list.append()`
* **extend** : ใส่เป็น string character => `list.extend([])`

อื่นๆ

* การลบสมาชิกออก ใช้ `list.remove()` ข้างในใส่สมาชิกตัวที่เราต้องการจะลบ
* ถ้าล้างไส้ในทั้งหมด ใช้ `list.clear()`
* การตรวจสอบความยาวของ list ใช้คำสั่ง `len(list)`

#### ช่วงลองทำดู

```python
fav_stock = ["ADVANC", "BEM", "CPALL", "CPF", "AU"]
```

1. เพิ่ม "BAY"
2. ลบ "AU"
3. เปลี่ยน "ADVANC" เป็น "INTOUCH"
4. หาจำนวนชื่อหุ้นใน `fav_stock`

**คำเฉลย**

```python
fav_stock.append("BAY")
fav_stock.remove("AU")
fav_stock[0] = "INTOUCH"
len(fav_stock)
```

### Boolean

อันนี้เหมือนภาษาอื่นๆ มีค่าสองแบบเท่านั้น คือ `True` กับ `False` สรุป python ไม่ต้องประกาศตัวแปรให้วุ่นวาย เช่น `uint8 i = 0;` งี้ แค่ใส่ค่าไปเลย เช่น `i = 0` จบ


# Comparison

การเปรียบเทียบค่าในภาษา python แบ่งเป็น 4 แบบ ดังนี้

* **logical** : and, or, not, and not เช่น `(len(list) >= 0) and (boo != False)`
* **identity** : is, is not, not เช่น `not (boo)`
* **arithmetic** : >, >=, <, <=, ==, != เช่น `len(list) >= 0`, `boo != False`
* **Null** : None เช่น `list != None`ซึ่งเรื่องนี้นำไปใช้ใน condition statement


# Condition Statement

ใน python มี if-else ในการเลือกการตัดสินใจ มี syntax ดังนี้

* แบบทางเดียว

```python
if (consition):
  <statement>
```

* แบบสองทาง

```python
if (consition):
  <statement>
else:    
  <statement>
```

* แบบหลายทาง

```python
if (condition):
  <statement>
elif (condition):   
  <statement>
else:    
  <statement>
```

#### มาลองทำดูดีกว่า

เขียนโปรแกรมตัดเกรดกันเถอะ ...

การตัดเกรดของวิชาการเรียน python พื้นฐาน มีเกณฑ์ ดังนี้

100 = A+, >=80 = A, >=70 = B, >=60 = C, >=50 = D, other = F

มาลงโค้ดดิ้งกัน

ให้ input มีชื่อตัวแปรว่า score และ output ชื่อว่า `grade`

```python
# input student score
score = 78

if (score == 100):
  grade = "A+"
elif ((score >= 80) and (score < 100)):
  grade = "A"
elif ((score >= 70) and (score < 80)):
  grade = "B"
elif ((score >= 60) and (score < 70)):
  grade = "C"
elif ((score >= 50) and (score < 60)):
  grade = "D"
else:
  grade = "F"

print (grade)
```


# Loop Statement

ใน python มี for และ while ในการใช้วนลูป

มาลองทำดูดีกว่า พิมพ์ค่าสมาชิกแต่ละตัวใน `array_list`ซึ่งในภาษา python จะต่างจากภาษาอื่นๆ สามารถวนลูปค่าใน list ได้เลย ภาษาอื่นๆจะวนจากตัวเลข เช่น

```python
array_list = [‘apple’, ‘papaya’, ’banana’, ’orange’]
for i in array_list:
   print (i)
```

ให้พิมพ์เลข 1-10 ออกมาสู่หน้าจอ สามารถเขียนได้ดังนี้

```python
#print 1-10
i=1
while i <= 10:
    print(i)
    i += 1
```

function range เป็น function ที่สร้าง range ค่าในช่วงที่เราต้องการ เช่น `range(10)` สร้างค่าเริ่มจาก 0 ไป 10 ตัว ดังนั้นจะได้ค่า 0-9 เราไม่สามารถเขียนเป็นเลขโดดๆใน for ได้

```python
#print 1-10
for i in range(1,11):
   print (i)
```

#### loop comprehensions <a href="#loop-comprehensions" id="loop-comprehensions"></a>

คือการเขียน loop statement แบบลดรูป พร้อมการเปรียบเทียบค่า ตัวอย่าง เช่น หาเลขระหว่าง 0-30 ที่หารด้วย 2 ลงตัว

ถ้าเราจะเขียนแบบเต็มๆ จะได้แบบนี้ ข้อดี คือ สามารถตรวจสอบได้เวลาที่โค้ดเรามีปัญหา

```python
evens = []
for i in range(31):
   if i % 2 == 0:
      evens.append(i)
```

และการเขียนแบบลดรูปแบบ loop comprehensions

```python
evens = [i for i in range(31) if i % 2 == 0]
```


# การใช้ break, continue และ pass ใน statement

**`break`** คือ การให้โค้ดของเราหยุดทำงาน เมื่อเข้าสู่ statement ที่เรากำหนด

**`continue`** คือหลังจากเจอ statement ที่เรากำหนด ก็ให้ตรวจที่ statement ถัดไป

**`pass`** ใส่เมื่อเราไม่ให้มีการทำงานใดๆเมื่อเข้า statement ที่เรากำหนด

ตัวอย่าง

```python
# check order
if (order == 0):
  break
elsif (order == 1):
  continue
elif (order % 3 == 0):
  pass
else:
  print (order)
```


# Function

มี syntax การเขียนดังนี้

```python
def fn_name(input):
   …

   return output
```

เรามีวิธีง่ายๆ นั่นคือ การนำโปรแกรมตัดเกรดของเรามาใส่ในฟังก์ชั่น โดยมี input คือ คะแนนของนักเรียนในวิชาการเรียน python พื้นฐาน และ คืนค่าเป็นเกรดของนักเรียน

```python
def python_grade(score)
  # ใส่โปรแกรมตัดเกรดของเราลงไป
  if (score == 100):
    grade = "A+"
  elif ((score >= 80) and (score < 100)):
    grade = "A"
  elif ((score >= 70) and (score < 80)):
    grade = "B"
  elif ((score >= 60) and (score < 70)):
    grade = "C"
  elif ((score >= 50) and (score < 60)):
    grade = "D"
  else:
    grade = "F"
  return grade
```

การเรียกใช้งาน เป็นดังนี้ `python_grade(78)`

ถ้าต้องการแสดงผล สามารถใส่ print ครอบไว้ได้ `print(python_grade(78))`


# Data structure

### Tuple

เราสามารถเก็บข้อมูล data type ใดก็ได้ ในตัวแปร tuple

```python
t = 12345, 54321, 'hello!'
```

การ update ค่าใน tuple : `t[0] = 0`

เราสามารถนำ tuple นำมาบวกกันได้ด้วยนะ : `t3 = t1 + t2`

การลบค่าทั้งหมดใน tuple : `del t`

### Set

* union => `a | b`
* intersection => `a & b`
* difference => `a-b`, `b-a`
* symmetric difference => `a ^ b`

### Dictionary

การแสดงผลค่า key และ value ของสมาชิกแต่ละตัวใน dict

```python
for key, val in num.items():
 print (key, val)
```

การเรียงค่า key ของ dict โดย output จะเป็น list `sorted(num)`

การเรียงค่า key และ value ของ dict โดย output จะเป็น list เช่นกัน `sorted(num.value)`

สำหรับการ sort by key และแสดง member ทั้งหมดใน dict ออกมา จะได้ output เป็น tuples นะ `sorted(num.items(), key=lambda x:x[1])`


# การทำงานร่วมกันกับไฟล์

การอ่านไฟล์ มี syntax หลักๆ ดังนี้

```python
f = open(filename, mode)
```

parameter ตัวแรก คือ ชื่อไฟล์ และตัวที่สอง คือโหมดการอ่านเขียนไฟล์

**โหมดการเขียนอ่านไฟล์** มีดังนี้

* r : read อ่าน
* w : overwrite เขียนทับ
* a : write at end of the file เขียนต่อ
* mode++ : reading & writing => r+, w+ a+

มาดูการเขียนโค้ดกันดีกว่า

```python
# open file
f = open(‘text.txt’, ‘a’)

# read file 
code = f.read()
```

หลังจากอ่านไฟล์แล้ว สามารถส่วนนี้ไปใช้งานได้ แต่ประเภทของตัวแปรจะเป็นแบบ binary ดังนั้นอาจจะต้องแปลงเป็น string โดยใช้ `decode("utf-8")` เช่น

```python
# find word in line of file
if (code.find(b"file") >= 0):
  print (code)

elif (code.decode("utf-8").find(b"line") >= 0):
  print (code)

# spilt line
lines = code.strip().splitlines()

# read single line of a file
f.readline()

# write file
f.write(“blah blah blah”)

#close file
f.close()
```


# Exception handling

### Syntax Error

คือ การที่ compiler แจ้งในส่วนที่เราเขียนโค้ดผิด syntax ที่เราพบเห็นกัน มีดังนี้

* **SyntaxError** : invalid syntax
* **IndexError**: string index out of range
* **NameError**: name 'n' is not defined

### Exception

คือ การที่ compiler แจ้งเราว่า code error ไม่สามารถทำงานต่อได้ มี Error defect ดังนี้

* **ZeroDivisionError**: division by zero
* **NameError**: name 'test2' is not defined
* **TypeError**: unsupported operand type(s) for -: 'str' and 'int'

### Handling Exception

การจัดการเมื่อโค้ดของเรามีปัญหา มี syntax การเขียน ดังนี้

```python
try:
   // Protected code
except:
   // Catch block
else:
   // The finally block always executes.
```

การทำงาน ทำในส่วนของ try ก่อน ถ้าทำงานในส่วนนี้สำเร็จ ก็คือจบ ถ้าไม่สำเร็จ จะไปในส่วนของ except ต่อ

### Raising Exceptions

ถ้าเปรียบเทียบกับ JAVA เหมือน throw

```python
raise ValueError('A very specific bad thing happened')
```

ตัวอย่างการใช้งาน เช่น การหารด้วยศูนย์

```python
try:
   result = input1 / input2
except ZeroDivisionError:
   print (“cannot divide by 0”)
```


# Document และแหล่งเรียนรู้อื่นๆ

{% embed url="<https://docs.python.org/3/index.html>" %}
Document ของ python
{% endembed %}

{% embed url="<https://www.codecademy.com/catalog/language/python>" %}
เราเคยเรียน python จากในเว็บนี้
{% endembed %}

{% embed url="<https://www.mikkipastel.com/tag/python>" %}
บล็อก python อื่นๆของ MikkiPastel
{% endembed %}

{% embed url="<https://www.fordantitrust.com/files/python.pdf>" %}
pdf
{% endembed %}


# Introduction

หลาย ๆ คนคงเคยเล่น หรืออยู่ตาม community บน Discord กันมาบ้างแล้ว บล็อกนี้จะเล่าการทำ Discord Bot ตั้งแต่สร้างบอทก่อน และเขียน function การทำงานอย่างง่ายกัน

เป็น hands-on ของ session "**Discord Bot from my Experience: Learn by Doing**" ที่งาน "National Coding Day 2024: workshop day"

Slide: <https://docs.google.com/presentation/d/1VVan98YNYIRvQkCbw6HmZvxM-bIeojawGDnhCELMU_o/edit?usp=sharing>

Github: <https://github.com/mikkipastel/discord-bot-workshop>

<figure><img src="/files/cuz9BcmjPCxddGJgUpxx" alt=""><figcaption></figcaption></figure>

### Discord คืออะไร?

เป็นแอพพลิเคชั่นหนึ่งในการสื่อสารกับเพื่อน ๆ เป็นที่นิยมในวงการเกมส์ คริปโต developer และบางที่ใช้ทำงานด้วยนะ

feature หลัก ๆ ที่ใช้กันมี

* **Text Channel**: แบ่งเป็นห้องพูดคุยต่าง ๆ
* **Voice Channel**: เป็นห้องพูดคุยเสียง สามารถเปิดกล้องเพื่อ video call และ stream จอได้

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUcMvT_X0P7i0G_L_9z7qfpiWNJIP4bTH4IuMkdGYReCeu_j_l-QM2FIcjt4l-6K1fVLyfiHpDTcAsJKbjJKdjoqNLxFOi2kGpGdiKZcVCpDyCvDH3i7-cbtza5hpgEJa81dbhOX=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUf_j2Wm1mVyBQ_4FbT5gKjNfKIMPSbtgnyOqY5MQDyoZJNG0L1SQMOwE21dppXGxG2UHvXJoE-hr6JcyFzVSUQGna8_M6uZd5UlgyZ9ZRxSBoKsH2qzgCAjeerfjhRR6bFsRHW2Mg=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt="" width="563"><figcaption></figcaption></figure>

* **Stage**: เหมือน Clubhouse เลย ที่มี function ยกมือขอขึ้นพูด และมี feature อื่น ๆ เหมือน Voice Channel

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUd3eUrwZFz9cGvxOFEm7fYelX5fN0lrBDU4vVuxbNWdy6b62OVmZhlPCI--tnpoTsRs5YZYZdGZ6LvTdiHXg384pgWPHzZdIkr_EZe3JdrZfCsoUTM5_5sdi5bJ-keKrRXSkEcb4g=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt="" width="563"><figcaption></figcaption></figure>

และรองรับในหลาย ๆ อุปกรณ์ ไม่ว่าจะเป็น PC, MacOS, iOS, Android

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfXZ3parj9prdMNziAERjqYSe6APSKVKGsM5knQ-4V6kPARx8rhglQlUrpHUPTfhCotc075TAVI88k9P57EAzfse0LRJCCk9caNQdgWkDOCLcesxYCURqXVWeStX-LMSr11uk8QHA=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt="" width="563"><figcaption></figcaption></figure>

และเชื่อว่าหลาย ๆ คนน่าจะใช้ได้ Discord ตอนที่ MidJourney กำลังดัง ซึ่งในนั้นก็เป็น Discord bot ด้วยเช่นกัน

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUesHBqfRy-EuVsIR6425p9Qvpe6tMKKbTUXyxhFZTMdSchjecEH6CzqCuiX3dckz7w9zYYrD_MHRxKAOyg6wA86HHBSvahGAcP5OzgBdQ7eLdRMjzfxtAHRzpczlvku-LAWxvHSvw=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>


# Discord Bot & Example

เมื่อก่อนใช้ ! ตามด้วยชื่อ command ในการสั่งงาน bot แต่หลาย ๆ bot ก็มีคำสั่งที่เหมือนกัน เช่น !ping ทำให้เราเรียกคำสั่งนี้คำสั่งเดียว บอทหลาย ๆ ตัวทำงาน

จนทาง Discord มาปรับให้เรียกจาก Slash Command แทน และให้ตัว bot เป็นเหมือน application นึงใน server น้ัน ๆ

<figure><img src="/files/tiFECQNnbVqsSRgB3k8C" alt=""><figcaption></figcaption></figure>

### Example

* Pandaz Guard Beta: เป็น bot ที่รักษาความปลอดภัยใน server สำหรับคนใหม่ที่เข้ามา จะต้องอ่านกฏ ปิด DM และกรอก capcha เพื่อยืนยันตัวตน จึงจะได้เข้า

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdJooAs-pZ9XGZwvMjyoGALfUjq4DVdzmU3DBemViIhk_Giu0cLfqSvJqCdOfWka5AShAbI5OUWG2IzXGpvHqGgRWe_J8UnBxdO-2w8_aqgzByPeHe9J3hFRCa3BfH01kB2YhMFiQ=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

* The Engage: engage กับ post เพื่อเก็บแต้ม และเอาไปแลกของต่าง ๆ ใน server ได้โดยการ raffle

<figure><img src="/files/oqWc0508PgBRSm6tIbrs" alt=""><figcaption></figcaption></figure>

* ตัวอย่างกดปุ่มเพื่อกรอกฟอร์ม

<figure><img src="/files/LC8BUNWp2KRe9vi6lIN4" alt=""><figcaption></figcaption></figure>


# Create Your First Discord Bot

เริ่มต้นการสร้าง Discord Bot ตัวแรกของเรากัน มี 3 ขั้นตอนด้วยกัน

* [Create Your Discord Server](/discord-bot-hands-on/create-your-first-discord-bot/create-your-discord-server)
* [Create Discord Bot Account](/discord-bot-hands-on/create-your-first-discord-bot/create-discord-bot-account)
* [Bring Discord Bot to Server](/discord-bot-hands-on/create-your-first-discord-bot/bring-discord-bot-to-server)


# Create Your Discord Server

เริ่มมาสร้าง server กันก่อนเลย

1. เลื่อนไปที่แถบ serer ไปที่ล่างสุด กดปุ่ม + เพื่อ *Add a Server*
2. จากนั้นมี popup หน้าสร้าง server เลือก "*Create My Own*" แล้วเราเปิด server เพื่อเทสบอทเนอะ เลยจะเลือก "*For me and my friends*" ก็เพียงพอต่อการใช้งานแล้ว
3. ตรง *Customize Your Server* ตั้งชื่อ server และ upload รูปของ server (optional)

<figure><img src="/files/8Jj2UoW14FCb7kEJ9lb3" alt=""><figcaption></figcaption></figure>

เมื่อสร้าง server เสร็จแล้วจะได้หน้าตาแบบนี้เลย

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdPJZ3Z-spO6PQrBC3wrwT-T-uHUFMY1zx98efNLTDiy6wHqCFAe1_g5SPmBdWAuqIhtfKwTjaSdgdgOSDnyPPS-Bw491FDOKRrjhCFKLbRSKK4G-nH5QFWDRDqIwTt-Bcc3GK0qA=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>


# Create Discord Bot Account

ก่อนอื่นสร้าง account ของ Discord bot ของเรากันก่อน ไปที่ [Discord Developer Portal](https://discord.com/developers/applications) เลือก *New Application*

<figure><img src="/files/rYfrcEM6Qwa22yvMW8nC" alt=""><figcaption></figcaption></figure>

ใส่ชื่อ application และกดยอมรับ Developer Terms of Service และ Developer Policy

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdx2lCyoxYQprqiNDU4YpOtVYWPTPLTRUXIjy845tZ5wHUeTir3CJN-ELiwOsdml5F1OP4O2AG1SiAjNYg_sx_uYbbpGCaJJxFwrnLLZAY_t8actR5Avj4bTPU1T1UKy7jvRiJzhg=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

เมื่อสร้าง application เสร็จแล้วจะเข้ามาหน้านี้

จากนั้นใส่รายละเอียดต่างๆของน้องบอทให้เรียบร้อย หน้านี้จะมี Application ID (ตัวนี้จะถูกใช้ต่อไป) และ Public Key ของแอพนี้นะ

<figure><img src="/files/fpgsWXyRXIyeKvM79Pi5" alt=""><figcaption></figcaption></figure>

เมื่อเราสร้างแอพเรียบร้อยแล้ว มาสร้างบอทกันต่อ โดยกดที่แท็บ Bot เราจะเห็นรายละเอียดของ bot ที่เราเพิ่งสร้างไป

ไป check public bot ว่าเปิดอยู่ไหม โดย default แล้ว บอทจะเป็น public bot ใคร ๆ ก็สามารถพาน้องบอทมาที่ server ตัวเองได้

<figure><img src="/files/IhiFIkkFzBU0iT4yRHTp" alt=""><figcaption></figcaption></figure>


# Bring Discord Bot to Server

ไปที่ *OAuth2 -> OAuth2 URL Generator* เลือก **SCOPES** เป็น `bot` นะ

<figure><img src="/files/TYsNL7PI574yfiK2Qh9k" alt=""><figcaption></figcaption></figure>

เลื่อนลงมาส่วน Bot Permissions ในส่วน Text Permissions ให้ติ๊ก 3 อย่างนี้

* Send Messages
* Read Message History
* Use Slash Commands

จากนั้นเลื่อนไปที่ Generated Url แล้ว copy url นี้ไปเปิดที่หน้า browser

<figure><img src="/files/PmE2LkqslJke1kPDDrko" alt=""><figcaption></figcaption></figure>

พอเปิดลิ้งนี้จะมีหน้าต่างขึ้นแบบนี้เลย เลือก server ที่เราต้องการเพิ่ม bot จากนั้นกด Continue แล้วเราจะเห็น permission ที่ bot ขอใน server ซึ่งตรงกับที่เราติ๊กเมื่อกี้เนอะ เมื่อเรียบร้อยแล้วจะขึ้น success

<figure><img src="/files/tSD4eUXy1IXrjbUePwN0" alt=""><figcaption></figcaption></figure>

กลับไปที่ server จะเห็น bot ที่เราสร้างไว้เข้ามาใน server แล้ว

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUeNYYutT1N7A0OReZ0wsuyt1tSEHmSOHkKKXhXgGmAYpCBikc3E3jXHKjqUutvjxqBj4ekoiO84y3WVtUD1yt9tLsKOOA5bBB47BgDCf-ff9NTJ1PDhQAUgn33EdBup6Mn8_pN3cw=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>


# Workshop

### Fork Github Repo

ก่อนอื่นมา setup project กัน โดย fork repo นี้จาก Github มาก่อน

{% embed url="<https://github.com/mikkipastel/discord-bot-workshop>" %}

จากนั้นเปิด CodeSpaces ในนั้นรองรับ node 20 แล้วด้วยนะ เราใช้ library Discord version ล่าสุดเลย ที่รองรับ node 18

<figure><img src="/files/m8lN5hj4fiGW2WytDlAA" alt=""><figcaption></figcaption></figure>

หน้าตาของ Codesapces

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUe3P_5Vc73h6gb6zxOON9--s50DSsih7yqsKu84J3127q8OU97dPv26INP7dQImiT2RoeZYEgEB1PFVeQKc-q-2u-by7KQyeWtnGdyZ46SCXNeGf7mJPSr0KeTeAEG4cgZzuvjx=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

อธิบายโค้ดกันก่อน

```javascript
// server.js
require('dotenv').config();

// Import dependency
const { Client, Events, GatewayIntentBits } = require('discord.js');

// Create a new client instance
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

// If ready, run this node
client.once(Events.ClientReady, readyClient => {
   console.log(`Ready! Logged in as ${readyClient.user.tag}`);
});

// Log in to Discord with your client's token
client.login(process.env.token);

```

* Import library discord.js เรียก `Client`, `Events`, `GatewayIntentBits` สามอันนี้เป็น default ที่เราต้องเรียกใช้
* สร้าง client instance ที่เป็นตัว intent เป็น `GatewayIntentBits.Guilds` เป็นตัวที่จำเป็นในการทำงาน
* เมื่อ client พร้อมแล้ว ให้ run `client.once()`
* และอย่าลืม logic ก่อนใช้งาน

### สร้าง .env file

ต่อมาสร้างไฟล์ .env แล้วใส่ตามนี้

```
// .env
token=...
clientId=...
guildId=...

```

* `token` ไปที่ Bot แล้วกดปุ่ม *Reset Token* แล้วเราจะได้ token มาใช้

<figure><img src="/files/IWZJtF3wo6QyXIPccOf9" alt=""><figcaption></figcaption></figure>

* `clientId` เอามาจาก APPLICATION ID ที่ได้หลังจากแอพเสร็จ

<figure><img src="/files/QuT3CVAcobANqHQwH3io" alt=""><figcaption></figcaption></figure>

* `guildId` คือ server id ที่เราต้องการเทส วิธีการเอาไปใช้ ไปที่ server setting -> Widget แล้วทำการ copy ออกมา

<figure><img src="/files/GkjnFhPLMXXnMQlWj94u" alt=""><figcaption></figcaption></figure>

สุดท้ายพิมพ์ command นี้เพื่อ install package ต่าง ๆ เข้ามาในโปรเจกต์

```
npm install
```


# Create First Slash Command

ไปที่ `server.js` เพิ่มโค้ดเหล่านี้กัน

```javascript
// server.js
// Import dependency
const { ..., SlashCommandBuilder } = require('@discordjs/builders');
const { REST } = require('@discordjs/rest');

// Create new slash command
const commands = [
   new SlashCommandBuilder()
       .setName('ping')
       .setDescription('Replies with Pong!')
 ].map(command => command.toJSON());
 
// Register command
const rest = new REST({ version: '10' }).setToken(process.env.token);
rest.put(Routes.applicationGuildCommands(
    process.env.clientId, 
    process.env.guildId
), { body: commands })
    .then(() => console.log('Successfully registered application commands.'))
    .catch(console.error);

// Reply command
client.on('interactionCreate', async interaction => {
   if (!interaction.isChatInputCommand()) return;
   const { commandName } = interaction;

   if (commandName === 'ping') {
       const timeTaken = Date.now() - interaction.createdTimestamp;
       await interaction.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
   }
});

```

* `SlashCommandBuilder` ใช้เพิ่ม command
* `Routes` กับ `REST` ใช้ register command ของเรา
* สร้าง slash command โดยสร้าง `SlashCommandBuilder()` ขึ้นมา ใส่ชื่อ และ description ของคำสั่งนี้ว่าใช้ทำอะไร แล้วเอาทุกคำสั่งไป map เป็น json ในที่นี้ชื่อคำสั่งว่า ping
* register command โดยการสร้าง `REST` ขึ้นมา แล้วใส่ token เข้าไป จากนั้นให้ put คำสั่งทั้งหมดไปยัง server ของ Discord (ทำให้ตอนที่บอทไม่ online เรายังเห็น command นั้นอยู่นั่นเอง!)
* จัดการ reply command โดยดึงชื่อ command จาก interaction แล้วมา compare ถ้าเป็นคำสั่ง ping ให้เอาเวลาตอนนี้หักกับตอนพิมพ์คำสั่ง แล้ว return เป็น text กลับไป

จากนั้นพิมพ์คำสั่งนี้ เพื่อ deploy ขึ้นไป

```
npm run dev
```

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUdsOEGibBojIfQBBj3DVTSOWJwkBQZUnMhe2MYEuqsM01_T8l2rll3F-_IvFrqD5x52SIsEqIN4ZPdVUyPXxfSWdkVmJD3GcyitY5uOWO_JoTHv45lEwCpSFF4amhUaUNXNH7j7=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

เมื่อ deploy เรียบร้อยแล้วกลับไปดูที่ server พบว่าคำสั่งนี้มีให้เราใช้งานแล้ว

<figure><img src="/files/NT1Q2OPmKnTz7VYPcY8D" alt=""><figcaption></figcaption></figure>

ผลที่ได้

<figure><img src="/files/tgAfxtQRiDvKcr9x5JGE" alt=""><figcaption></figcaption></figure>

เพิ่มเติม ถ้าบางครั้งเราต้องรอผลลัพธ์มากกว่า 3 วินาที ใช้คำสั่งนี้ได้นะ user จะได้ไม่รอนานเกินไป

```javascript
// waiting response long time
await interaction.deferReply();
await interaction.editReply(`Pong! This message had a latency of ${timeTaken}ms.`;
```


# Create Slash Command with Parameter

ใน Github repo นี้มีไฟล์ json ที่ชื่อว่า `animal.json` เตรียมไว้ให้ เราจะนำไฟล์นี้มาเล่นกัน

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUd7om9QP6vO6Rj2xgtB8tJmbLj-TIon0f_66M7m-26ERVcRWlSWaqzzlALOvVMmL4pslfITLcnGsjFoP8CD1AxMeSFeyh5YLaw_100qGBVju4eOpgAINy0_8ruOwrcciJwc-VvxTQ=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

กลับไปที่ `server.js` เรามาเพิ่มคำสั่งใหม่กัน

```javascript
// server.js
// Import dependency
const { ..., SlashCommandBuilder } = require('@discordjs/builders');
const { REST } = require('@discordjs/rest');

// Create slash command
const commands = [
   new SlashCommandBuilder()
       .setName('ping')
       .setDescription('Replies with Pong!'),
   // NEW: new command
   new SlashCommandBuilder()
       .setName('animal')
       .setDescription('Encyclopedia animal')
       .addStringOption(option =>
           option.setName('animal')
               .setDescription('role category')
               .setRequired(true)
               .addChoices(
                   { name: 'Hippopotamus', value: 'Hippopotamus'},
                   { name: 'Tiger', value: 'Tiger'},
                   { name: 'Asian Elephant', value: 'Asian Elephant'},
                   { name: 'Capybara', value: 'Capybara'},
               )
       )
 ].map(command => command.toJSON());
 
// NEW: Load json static beta
const animals = require('./data/animal.json');

// Register command
const rest = new REST({ version: '10' }).setToken(process.env.token);
rest.put(Routes.applicationGuildCommands(
    process.env.clientId, 
    process.env.guildId
), { body: commands })
    .then(() => console.log('Successfully registered application commands.'))
    .catch(console.error);

// Reply command
client.on('interactionCreate', async interaction => {
   if (!interaction.isChatInputCommand()) return;
   const { commandName } = interaction;

   if (commandName === 'ping') {
       const timeTaken = Date.now() - interaction.createdTimestamp;
       await interaction.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
   } else if (commandName === 'animal') {
       // NEW: add new command
       const animalInput = interaction.options.getString('animal');
       const animalOutput = animals.find(animal => animal.name_en == animalInput);
       await interaction.reply(animalOutput.name_th);
    }

});

```

* เราเพิ่มคำสั่งที่ชื่อว่า animal และต้องกรอก parameter ด้วย 4 ตัวเลือก คือ Hippopotamus, Tiger, Asian Elephant และ Capybara
* เอา `animal.json` เข้ามาเพื่อเรียกใช้ข้อมูล
* เพิ่ม condition การจัดการคำสั่ง animal โดยเราดึง parameter ที่ user ใส่เข้ามา จากนั้นดึงข้อมูลจาก `animal.json` แล้วมาเทียบชื่อ จากนั้นให้ bot reply เป็นชื่อสัตว์ภาษาไทยออกมา

เมื่อ code ทำงานใหม่ กลับไปดูที่ Discord พบว่าบอทของเราเพิ่มคำสั่ง animal มาแล้วพร้อมตัวเลือกทั้ง 4

<figure><img src="/files/ZQqvTQ1r5Pqoa0EIxMhY" alt=""><figcaption></figcaption></figure>


# Return Embeds and Button

อยากให้มันแสดงอย่างอื่นที่ไม่ใช่ text ได้ไหม? ได้! เราสามารถใช้ Embed และ Button ในการแสดงผลที่สวยงามขึ้นได้นะ

### Embed

ก่อนอื่นเพิ่ม EmbedBuilder กันก่อน

```javascript
const { ..., EmbedBuilder } = require('discord.js');
```

ไปที่เรา handle คำสั่ง animal

```javascript
// Reply command
client.on('interactionCreate', async interaction => {
   ...
   if (commandName === 'ping') {
       ...
   } else if (commandName === 'animal') {
       const animalInput = interaction.options.getString('animal');
       const animalOutput = animals.find(animal => animal.name_en == animalInput);
       const embed = new EmbedBuilder()
            .setColor(0x0099FF)
            .setTitle(animalOutput.name_en)
            .setURL(animalOutput.reference_url)
            .setAuthor({ 
                name: 'zookeeper', 
                iconURL: "https://i.imgur.com/dxeXsqc.jpeg", 
                url: 'https://khaokheow.zoothailand.org/intro.php' 
            })
            .setDescription(animalOutput.description)
            .setThumbnail(animalOutput.image_url)
            .addFields(
                 { name: 'Scientific Name', value: animalOutput.scientific_name, inline: true },
                 { name: 'Food', value: animalOutput.diet },
                 { name: 'Zoo Place', value: animalOutput.place, inline: true },
            )
            .setImage(animalOutput.image_url)
            .setTimestamp()
            .setFooter({ text: '❤️', iconURL: "https://i.imgur.com/dxeXsqc.jpeg" }
       );   
       await interaction.reply({ embeds: [embed] });
    }
});

```

มาอธิบายแต่ละส่วนกัน

<figure><img src="/files/ZN9NKWbGSXgmnk0LLGPm" alt=""><figcaption></figcaption></figure>

* `setColor()`: set สีของตัว Embed ซึ่งจะแสดงเป็นเส้นด้านซ้าย
* `setTitle()`: ใส่ title ในที่นี้เป็น Tiger
* `setURL()`: กดที่ title แล้วไปหน้าเว็บไหนต่อ
* `setAuthor()`: ส่งโดยใคร ในที่นี้ชื่อ zookeeper เป็นรูปหมูเด้ง กดที่ author แล้วไปหน้าเว็บไหนต่อ
* `setDescription()`: ใส่รายละเอียด ในที่นี้บอกรายละเอียดเสือโคร่ง
* `setThumbnail()`: รูป thumbnail ซึ่งจะแสดงที่มุมขวาล่าง
* `addFields()`: เพิ่มการแสดง text ในส่วนหัวข้อย่อย ในที่นี้จะเป็น Scientific Name, Food และ Zoo Place
* `setImage()`: ใส่รูปใหญ่ ๆ ด้านล่าง
* `setTimestamp()`: บอกว่าข้อความนี้ถูกส่งมาเวลาไหน
* `setFooter()`: ด้านล่างจะแสดง text หรือ icon อะไร

เกี่ยวกับ Embed สามารถอ่านเพิ่มเติมได้[ที่นี่](https://discordjs.guide/popular-topics/embeds.html#embed-preview)

### Button

เพิ่ม Button กัน เพิ่ม `ButtonBuilder`, `ActionRowBuilder`, `ButtonStyle`

```javascript
const { ..., ButtonBuilder, ActionRowBuilder, ButtonStyle} = require('discord.js');

// Reply command
client.on('interactionCreate', async interaction => {
   ...
   if (commandName === 'ping') {
       ...
   } else if (commandName === 'animal') {
       const animalInput = interaction.options.getString('animal');
       const animalOutput = animals.find(animal => animal.name_en == animalInput);
       const embed = new EmbedBuilder()
            .setColor(0x0099FF)
            .setTitle(animalOutput.name_en)
            .setURL(animalOutput.reference_url)
            .setAuthor({ 
                name: 'zookeeper', 
                iconURL: "https://i.imgur.com/dxeXsqc.jpeg", 
                url: 'https://khaokheow.zoothailand.org/intro.php' 
            })
            .setDescription(animalOutput.description)
            .setThumbnail(animalOutput.image_url)
            .addFields(
                 { name: 'Scientific Name', value: animalOutput.scientific_name, inline: true },
                 { name: 'Food', value: animalOutput.diet },
                 { name: 'Zoo Place', value: animalOutput.place, inline: true },
            )
            .setImage(animalOutput.image_url)
            .setTimestamp()
            .setFooter({ text: '❤️', iconURL: "https://i.imgur.com/dxeXsqc.jpeg" }
       );
       const button = new ButtonBuilder()
            .setLabel('ข้อมูลเพิ่มเติม')
            .setStyle(ButtonStyle.Link)
            .setURL(animalOutput.reference_url);
       const row = new ActionRowBuilder().addComponents(button);
       await interaction.reply({ embeds: [embed], components: [row] });
    }
});

```

* `setLabel()`: เราอยากให้แสดง text อะไร
* `setStyle()`: style ของปุ่ม ในที่นี้คลิกเพื่อเข้าหน้า website จึงเป็น ButtonStyle.Link
* `setURL()`: เราอยากให้เปิดหน้าเว็บไหน

ตอนที่ bot reply ให้แสดง Embed และสร้าง component row ที่ข้างในมี Button ที่เราเพิ่งสร้างนั่นเอง

เกี่ยวกับ Button อ่านเพิ่มเติมได้[ที่นี่](https://discordjs.guide/message-components/buttons.html#building-buttons)


# Webhook

เราสามารถสร้างบอทที่ยิงข้อความเข้าไปใน text channel บน server ได้นะ โดยใช้ webhook

ไปที่ Server Settings -> Integations -> Create Webhook

<figure><img src="/files/Uwdd4DyCBltvYu9BDA8d" alt=""><figcaption></figcaption></figure>

จากนั้นเข้าไปที่ webhook ที่สร้าง โดยกดที่ตัว webhook เราสามารถใส่ชื่อ รูป เพื่อให้เราจำได้ แล้วก็ channel ที่เราต้องการ แล้วก็ Copy Webhook URL เพื่อเอาไปใช้ต่อ โดยหน้าตัว url นี้ จะเป็น `https://discord.com/api/webhooks/{id}/{token}`

<figure><img src="/files/BBR1lwgLG8SGwDVO1din" alt=""><figcaption></figcaption></figure>

กลับไปที่ server.js แล้วเพิ่มโค้ดเหล่านี้

```javascript
// server.js
const { ..., WebhookClient } = require('discord.js');

const webhookClient = new WebhookClient(
    { url: 'https://discord.com/api/webhooks/{id}/{token}'}
);
const webhookClient = new WebhookClient({ id: 'id', token: 'token' });

client.once(Events.ClientReady, readyClient => {
   console.log(`Ready! Logged in as ${readyClient.user.tag}`);

   // send message webhook
   try {
       webhookClient.send({
           username: 'BB-8',
           avatarURL: 'https://i.imgur.com/PHnLYAm.png',
           content: 'Webhook test',
       })
   } catch (error) {
       common.error('Error trying to send: ', error);
   }
});
```

* เพิ่ม `webhookClient` มาด้วย ตอน import library มา
* `webhookClient` สามารถสร้างเพิ่มได้ 2 วิธีด้วยกัน

ใช้ url โดยตรง

<pre class="language-javascript"><code class="lang-javascript"><strong>const webhookClient = new WebhookClient(
</strong>    { url: 'https://discord.com/api/webhooks/{id}/{token}'}
);
</code></pre>

ใช้ id และ token จาก url จาก format นี้ `https://discord.com/api/webhooks/{id}/{token}`

```javascript
const webhookClient = new WebhookClient({ id: 'id', token: 'token' });
```

* ที่ `client.once()` ใส่การส่งข้อความที่ให้ webhook ส่งข้างใน

เมื่อ code ทำงานใหม่ บอทจะส่งข้อความนี้มาที่ text channel ที่เราต้องการ

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUcyrANtQgPifZ0ObgTFyUZkYFbPHCqBf7XrkEVc0HsPyAxBeRAu4dqTVH3kJjUtTYNr8uGvFhu1tgVy3p0I0972DdNLCggiao7B2q-9sAkDptg8v9Xhao2PGneABEb9l_DRazKWsw=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

เราสามารถส่งข้อความแบบ Embed ได้ด้วยนะ

```javascript
// server.js
client.once(Events.ClientReady, readyClient => {
   console.log(`Ready! Logged in as ${readyClient.user.tag}`);

   // send message webhook
   try {
       const embed = new EmbedBuilder()
           .setTitle('Some Title')
           .setColor(0x00FFFF);

       webhookClient.send({
           username: 'BB-8',
           avatarURL: 'https://i.imgur.com/PHnLYAm.png',
           content: 'Webhook test',
           embeds: [embed]
       })
   } catch (error) {
       common.error('Error trying to send: ', error);
   }
});

```

ผลที่ได้

<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfELXDK1AOdMVDxgiB1f-KxyKEv7n3k8FCCW1_oWHQkho8lLRXNNBVYbrBcougcMDHmWwFCNa01aOlUHQQnuFUmNg5RBPlBLxXBNUqLquGwO_1RvpizYwYmMdJ8D7WSSeUTY6gsUA=s2048?key=zouhIV8Fq_fCPxgqccmT5w" alt=""><figcaption></figcaption></figure>

เกี่ยวกับ webhook สามารถอ่านเพิ่มเติมได้[ที่นี่](https://discordjs.guide/popular-topics/webhooks.html)


# Reference

ข้อมูลอ้างอิง และข้อมูลเพิ่มเติมเกี่ยวกับการทำ Discord Bot

### One More Things

* Upload Image: เอา url รูปไปใช้ตรง ๆ ไม่ได้ ต้องอัปไปที่[ imgur.com](https://imgur.com) เลียนแบบตามใน document
* Server Need Stay 247
* [Active Developer Badge](https://support-dev.discord.com/hc/en-us/articles/10113997751447-Active-Developer-Badge)

### Resource

* [Discord Developer](https://discord.com/developers/docs/intro)
* [discord.js](https://discord.js.org/#/)
* [guide](https://discordjs.guide/)

### Content

* [รีวิวการใช้ใช้ Discord ทำงานกับทีม มันจะเป็นอย่างไรบ้างนะ?](https://www.mikkipastel.com/review-working-with-team-by-discord/)
* [ทำ Discord bot แจ้งเตือนคนในทีมให้ไปประชุม](https://www.mikkipastel.com/discord-bot-webhook-and-cronjob/)
* [สร้างบอท Discord ไว้คุยกับทีมแบบง่ายๆกันเถอะ](https://www.mikkipastel.com/create-simple-discord-bot/)
* [Next Level Discord Bot กับการแจ้งเตือนประชุมหลบวันหยุด กิจกรรมในทีม และวันลา](https://www.mikkipastel.com/next-level-discord-bot-with-google-calendar/)


# Android Logcat

<figure><img src="/files/NpzHSHDmtLnS3Hn3ttNw" alt="" width="563"><figcaption></figcaption></figure>

Logcat บน Android Stuio ถูกเปลี่ยนหน้าตาไปในเวอร์ชั่น Dolphin | 2021.3.1 ซึ่งสามารถสร้างได้หลาย ๆ logcat windows ด้วยกันเนอะ

ส่วนประกอบของ logcat คร่าว ๆ ก็จะมี date แสดงวันที่และเวลา, tag ว่ามันมาจากไหน, package ก็คือมาจากแอพไหนแหละ, log level, message

แล้วตรงช่อง filter เราสามารถใส่อะไรได้บ้าง ไปดูกัน

* tag: ใส่ tag ที่เราต้องการ filter เช่น `tag:System.out`
* package: เลือก package name ที่เราต้องการ เช่นดูแค่แอพตัวเองก็ `package:mine`
* process: เลือก process name ที่เราต้องการ แต่ไม่ค่อยได้ใช้แหะ
* message: message จาก log ที่เราต้องการ เช่น `message:sendrequest`
* level: log level ที่เราอยากได้ โดยทั้งหมดจะมี Verbose (`V`, มี priority ตํ่าสุด), Debug (`D`), Info (`I`), Warning (`W`), Error (`E`), Fatal (`F`), Silent (`S` ,มี priority สูงสุด ซึ่งมันจะไม่พิมพ์อะไรออกมา) เช่นอยากดู error ก็ใส่ `level:error`
* age: เราอยากได้ logcat ล่าสุดเมื่อกี่วินาที (`s`) หรือกี่นาที (`m`) หรือกี่ชั่วโมง (`h`) หรือกี่วัน (`d`) เช่นอยากได้ log เมื่อ 5 นาทีที่ผ่านมา ก็ใส่ `age: 5m`


# Content Roadmap Rule

Content Roadmap อันนี้เราได้ไอเดียจาก FRI-MON READ เลยเอามาปรับใช้กับของเราด้วยเนอะ

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_rule.png?v=1688371004230" alt="" width="563"><figcaption></figcaption></figure>

ก่อนอื่นมาดู roadmap rule กันก่อนเลย

* ที่ใช้เป็น sprint ก็คือใช้ตามหลัก Agile ที่จะแบ่งรอบเวลาไว้ ในที่นี้คือ 2 weeks ในการวางแผนการออก content น้อย ๆ ออกมา
* เราจะเริ่ม sprint ตรงกับรอบของงานประจำเลย เพื่อความง่ายของเราในการจัดการต่าง ๆ
* เมื่อจบ sprint แล้ว จะทำการ feedback และ planing สู่ sprint ถัดไป
* ระยะเวลา เริ่มวันแรกวันจันทร์ของอาทิตย์ที่หนึ่ง เป็นวันที่ประกาศ content roadmap ออกมา จากนั้นก็ทำ content ตาม roadmap โดยตัว blog จะลงประจำทุกวันศุกร์อยู่แล้ว / จบที่วันศุกร์ของอาทิตย์ที่สอง / เสาร์อาทิตย์เราก็จะมาวางแผนกันใหม่ วนแบบนี้ไป
* แต่ละ sprint จะมีตีมอยู่แล้ว เท่าที่ลอง list ดูนะ
* สิ่งที่หยิบมาทำ: mini content, blog, project, learning, plan (นั่นหมายความว่า ถ้าหยิบ learning content อาจจะไม่ออกก็ได้แหละมั้ง)


# 2024

content release on 2024 at my website, my activity, and my site projects

38 blogs, 2 staff events, 1 site project, and 2 public speaking

## January

**📖 Blog**

* [สรุป Git command เผื่อได้ใช้กัน](https://www.mikkipastel.com/git-command-summary/)
* [มาทำความรู้จัก Growth Mindset กัน](https://www.mikkipastel.com/what-is-growth-mindset/)
* [Outward Mindset คืออะไร มาทำความรู้จักกัน](https://www.mikkipastel.com/what-is-outward-mindset/)

## February

**📖 Blog**

* [นั่งร่วมงาน Developer Creators and Online Communities Summit ของ Google](https://www.mikkipastel.com/developer-creators-and-online-communities-summit-google/)
* [อัพเดตเทรนคริปโตกับงาน Digital Assets Navigator ของ Bitkub](https://www.mikkipastel.com/digital-assets-navigator-bitkub/)

**🏕 Activity**

* 17 Feb. staff at COMPOSE BATTLE 2024: Compose at first sight

<figure><img src="/files/l5Q0azgt7IjgiJtfdlxU" alt="" width="375"><figcaption></figcaption></figure>

## March

**📖 Blog**

* [เล่าประสบการณ์การทำ Github Actions ของงาน Compose Battle](https://www.mikkipastel.com/github-action-android-compose-battle/)
* [รีวิว Work From Home Workspace หลังจากที่ใช้งานมาระยะหนึ่งแล้ว](https://www.mikkipastel.com/review-work-from-home-workspace/)&#x20;
* [เรียนรู้ Generative AI & ChatGPT กับอาจารย์เต้กัน](https://www.mikkipastel.com/generative-ai-chatgpt-unlock-working-with-ai/)&#x20;
* [เราใช้ iPad ทำอะไรบ้าง?](https://www.mikkipastel.com/overview-my-ipad-with-apple-pencil-application-widget/)

**🏕 Activity**

* contribute [ruam-mij-android](https://github.com/akexorcist/ruam-mij-android)

## April

**📖 Blog**

* [ทำไม เพจ MikkiPastel และเพจอื่น ๆ ถึงใช้ . ระหว่างบรรทัด มาอธิบายด้วย coding กัน](https://www.mikkipastel.com/why-facebook-page-use-dot-to-between-content-line/)&#x20;
* [รวมมิตรอัพเดตแพชครั้งใหญ่ กับ Kotlin DSL กับ toml](https://www.mikkipastel.com/migrate-project-to-kotlin-dsl-and-toml/)&#x20;
* [ปรับ mindset การทำแอพรองรับคนทุกกลุ่ม กับ "Intro to Web Accessibility" workshop](https://www.mikkipastel.com/intro-to-web-accessibility-workshop-skooldio/)

## May

**📖 Blog**

* [เพิ่ม table of content สำหรับ Ghost CMS กัน](https://www.mikkipastel.com/table-of-content-ghost-cms/)&#x20;
* [มารับความรู้ฝั่ง web3 developer กับงาน Sui Workshop](https://www.mikkipastel.com/sui-workshop-contribution-dao/)
* [iCreator Camp 2024 วันแรกกับ Storytelling & Creativity](https://www.mikkipastel.com/icreator-camp-2024-week1-storytelling-and-creativity/)&#x20;
* [เรียนรู้ Content Marketing เพื่อทำเงิน ในสัปดาห์ที่ 2 ของ iCreator Camp 2024](https://www.mikkipastel.com/icreator-camp-2024-week2-content-marketing/)

**🏕 Activity**

* 1 of 100 creators in iCreator Camp 2024

## June

**📖 Blog**

* [เรียนรู้ Design & Visual ในการสร้าง content ให้จับใจคน กับ iCreator Camp 2024 สัปดาห์ที่ 3](https://www.mikkipastel.com/icreator-camp-2024-week3-design-and-visual/)&#x20;
* [สัปดาห์การเรียนสุดท้าย ค่าย iCreator Camp 2024 กับเรื่อง Production & Platform](https://www.mikkipastel.com/creator-camp-2024-week4-production-and-platform/)&#x20;
* [รู้หรือไม่? เดี๋ยวนี้กล้องมี chip AI แยกแล้วนะ!](https://www.mikkipastel.com/icreator-camp-2024-sony-alpha-7c-ii/)&#x20;
* [วันสุดท้าย ที่เป็นแค่จุดเริ่มต้น กับค่าย iCreator Camp 2024](https://www.mikkipastel.com/icreator-camp-2024-final-day/)

## July

**📖 Blog**

* [ทำนามบัตรแจกคนทั้งโลก ในงบหลักสิบ ด้วย NFC card](https://www.mikkipastel.com/how-to-create-nfc-name-card-with-3-steps/)&#x20;
* [เป็นโควิดครั้งแรก! เป็นยังไงบ้างนะ?](https://www.mikkipastel.com/covid-19-first-time-2024/)&#x20;
* [เรียนรู้ 20 บทเรียน เมื่อต้องเป็น Speaker! จาก speaker มือโปร](https://www.mikkipastel.com/speaker-101-bitton-dao-learning-20-lesson-for-speaker/)
* [กลับมาอีกครั้งในรอบ 4 ปี กับ Kotlin Meetup 2024.1](https://www.mikkipastel.com/kotlin-meetup-2024-1-kotlin-multiplatform/)

## August

**📖 Blog**

* [อยากเทสแอพบน Foldable แต่ไม่มีเครื่องจริง ทำยังไงได้บ้าง?](https://www.mikkipastel.com/foldable-phone-emulator-firebase-android-device-streaming/)&#x20;
* [บอกต่อทริคไม่ลับ! ที่ทำให้คุณใช้ Canva Pro คุ้มขึ้น!!!](https://www.mikkipastel.com/how-to-use-canva-pro/)&#x20;
* [สอนใช้ Suno AI มาทำเพลงเองแบบง่าย ๆ ในยุค AI](https://www.mikkipastel.com/how-to-use-suno-ai-to-generate-music/)

## September

**📖 Blog**

* [รีวิวคอร์ส “Enhancing Business Performance with Generative AI” เรียนรู้แบบ zero to hero](https://www.mikkipastel.com/true-digital-academy-enhancing-business-performance-with-generative-ai/)&#x20;
* [เรียนรู้ว่า Product Management เอา AI มาใช้งานยังไง? กับงาน "Unlocking Product Insights"](https://www.mikkipastel.com/unlocking-poroduct-insights-integrating-ai-into-business-strategies-in-thailand-true-digital-academy/)&#x20;
* [แฝงตัวในดง Bitcoiner ที่งาน Thailand Bitcoin Conference 2024](https://www.mikkipastel.com/thailand-bitcoin-conference-2024/)&#x20;
* [ทำความรู้จัก Regular Expression แบบ 101 กัน](https://www.mikkipastel.com/regular-expression-regex-101/)

**🖥 Project**

* [bitcoin-odyssey](https://github.com/mikkipastel/bitcoin-odyssey): Bitcoin history website for beginner

## October

**📖 Blog**

* [จอภาพที่เกิดมาเพื่อโปรแกรมเมอร์ BenQ RD280U | World's First Programming Monitor Series](https://www.mikkipastel.com/benq-rd280u-worlds-first-programming-monitor-series/)
* [Android Developer ทำแอพให้รองรับ Accessibility ได้อย่างไรบ้าง?](https://www.mikkipastel.com/add-accessibility-in-application-for-android-developer/)
* [มางาน Bitkub Summit 2024 แล้วได้อะไร? มาดูกัน KUB](https://www.mikkipastel.com/bitkub-summit-2024/)

**🏕 Activity**

* 17 Oct. staff of Mobile Native Meetup #2&#x20;

<figure><img src="/files/MnXe1lMXb95G7mfE4s2T" alt="" width="375"><figcaption></figcaption></figure>

## November

**📖 Blog**

* [อัพเดตเทคบ้านเขียวประจำปี กับงาน LINE Thailand Developer Conference 2024](https://www.mikkipastel.com/line-thailand-developer-conference-2024/)
* [ทดลองทำ widget gas tracker ฉบับ Jetpack Compose กันเถอะ](https://www.mikkipastel.com/create-android-widget-first-time-by-jetpack-glance/)
* [สรุปที่เรียน Prompting Profit: Building AI-Powered Business Strategies จาก AWE2024](https://www.mikkipastel.com/prompting-profit-building-ai-powered-business-strategies-awe2024/)

**🏕 Activity**

* 17 Nov. speaker of Android Bangkok Conference 2024

<figure><img src="/files/27cK6gnMjwVPISPb4Cop" alt="" width="375"><figcaption></figcaption></figure>

* 29 Nov. speaker of National Coding Day 2024: Workshop Day

<figure><img src="/files/12OnJNltTP7XxIgDl6v4" alt="" width="375"><figcaption></figcaption></figure>

## December

**📖 Blog**

* [ได้ไปฟังอะไรที่งาน National Coding Day 2024: Workshop Day บ้าง?](https://www.mikkipastel.com/national-coding-day-2024-workshop-day/)
* .


# Content Roadmap Sprint 01/2024 (15 - 26 January)

ก่อนอื่นเลย เราต้อง [#มาเรียนธอน](https://www.facebook.com/hashtag/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%98%E0%B8%AD%E0%B8%99?__eep__=6&__cft__\[0]=AZWHunUTXuQKOUivDsYHvoj7oP5fuhzbH3vXQT3dbSTEFvTUY6_hBydL5SYHYyf1kXXa-i2QJdBaJ0TLL-gINZkuMQ7EZvGQiBELNME8Bt2uiAhNQdfq830GmkvWTdr8lcI&__tn__=*NK-R) ให้จบภายในเดือนนี้ ซึ่ง progress ที่เราเรียน Software Architecture Design ในตอนนี้คือจบไป 80% แล้ว เหลือบทสุดท้ายแล้วแบบจริงจัง พอเราเรียนจบทั้ง 3 courses เราจะมีอะไรพิเศษปล่อยมาให้ทุกคนได้ร่วมสนุกกัน (มั้ง) 555

content ใน sprint นี้เราจะกล่าวถึง Growth Mindet กับ Outward Mindset ว่ามันคืออะไร แล้วแต่ละเรื่องเกี่ยวกับอะไรบ้าง มาติดตามกัน ![😍](https://static.xx.fbcdn.net/images/emoji.php/v9/ta1/2/16/1f60d.png)

<figure><img src="/files/V5syPueUcdAFUfaXkGa8" alt=""><figcaption></figcaption></figure>


# Content Roadmap Sprint 02/2024 (29 January - 9 February)

สำหรับรอบนี้ เมื่อสัปดาห์ที่แล้ว เราได้ร่วมงาน Developer Creators and Online Communities Summit ของทาง Google แบบ online ซึ่งเนื้อหาเหมาะกับ creator ทุกสายมาก ดูสิว่าระหว่างที่ฟังไปแล้วทำงานไป แล้วมาฟังเพื่อจับรายละเอียดอีกรอบ มีอะไรที่น่าสนใจบ้าง

และเราจะเล่าประสบการณ์การเป็น Pixels Scholar ว่าเป็นยังไงบ้าง เนื้อหาเตรียมเปิดเว็บแยกที่เกี่ยวกับ web3 มาก ในบล็อกอาจจะเล่าประสบการณ์ไปก่อน เดี๋ยวเว็บแยกจะมีการจัดหมวดหมู่ให้อ่านง่ายขึ้นนะ

<figure><img src="/files/0xRn5UyMtgM2TGaiMXBv" alt=""><figcaption></figcaption></figure>


# 2023

content release on 2023 at my website, my YouTube, and my site projects

## January

**📖 Blog**

* [ทำงานไม่มีเวลา แล้วจะทำ content ยังไงให้ปัง โดยคุณอิง ดาริน](https://www.mikkipastel.com/creating-kick-ass-content-with-productive-thinking-method/)
* [ทำ links page ของตัวเองแบบง่ายๆ ด้วย Glitch in Bio](https://www.mikkipastel.com/my-bio-website-by-glitch-in-bio/)

**📹 Video**

* [ใช้ Web Clipper ของ Notion ยังไง ไปดูกันเลย](https://www.youtube.com/watch?v=Ig7rDTyUKdY)

**🖥 Project**

* [**bio link**](https://bio.mikkipastel.com/): Bio link website of MikkiPastel by Glitch in Bio.

**🏕 Activity**

* 25 January: Create website without code in Bittoon DAO community.

<figure><img src="/files/s7tqbO5dJlADoEXDojiT" alt="" width="563"><figcaption></figcaption></figure>

## February

**📖 Blog**

* [มางาน Notion Meetup Thailand 2023 First Love with Notion ที่จัดครั้งแรกในไทย](https://www.mikkipastel.com/notion-meetup-thailand-2023-first-love-with-notion/)
* [มาทำ Email Management ฉบับ Getting Thing Done กัน](https://www.mikkipastel.com/email-management-getting-thing-done/)
* [แนะนำ Tripster ทำยังไงให้ mint out ใน 45 นาที](https://www.mikkipastel.com/introduction-tripster-travel-pass-nft-project/)

**📹 Video**

* [มาทำ Email Management ฉบับ Getting Thing Done กัน](https://www.youtube.com/watch?v=74E3XpgP0pM)
* [สอนวิธีการใช้ Referral Links ของ Tripster แถมวิธีการย่อลิ้งด้วย bit.ly](https://www.youtube.com/watch?v=_RkyEmrktt4)

## March

**📖 Blog**

* [สรุปการเรียนคอร์สเจาะลึก NFT และ DeFi ปูพื้นฐานแบบจัดเต็ม ของ NFT360](https://www.mikkipastel.com/online-course-nft-defi-foundametal-from-nft360/)
* [สอนแคปจอบน macbook แบบจับมือทำ](https://www.mikkipastel.com/how-to-capture-macbook-screen/)
* [สอนแคปจอจาก Google Chrome แบบจับมือทำ](https://www.mikkipastel.com/how-to-capture-website-from-google-chrome)
* [ทดลองทำเว็บวาดรูปเป็น pixel art ด้วย Svelte แบบง่าย ๆ กันเถอะ](https://www.mikkipastel.com/drawing-pixel-art-svelte-website/)
* [รวมเว็บขอ Testnet Faucet สำหรับ developer และนักล่า airdrop](https://www.mikkipastel.com/list-of-testnet-faucet-for-developer-and-airdrop-hunter/)

**📹 Video**

* [คลิปโชว์เทพ เล่น 2048 แบบ speed run](https://www.youtube.com/watch?v=lTKLRrV3-mE)
* [แคปยังไง ให้ได้แบบนี้ ทำได้ง่าย ๆ บน Google Chrome](https://www.youtube.com/watch?v=BVfT6GgvhtE)
* [แปลงร่าง r/place เป็น pixel board](https://www.youtube.com/watch?v=b97hntdMzw4)

## April

**📖 Blog**

* [มาดูพี่ตี๋วิดพื้น เอ้ยย มาอัพเดตของใหม่ ๆ กันในงาน Firebase Dev Day 2023](https://www.mikkipastel.com/firebase-dev-day-2023/)
* [เล่าเรื่องงาน NFT Square Meetup #1 และ GASSED UP](https://www.mikkipastel.com/nft-square-meetup-1-and-gassed-up/)
* [ทำบล็อกแบบง่าย ๆ แบบไม่ต้องใช้ CMS ผ่าน Glitch กัน](https://www.mikkipastel.com/create-blog-maskdown-without-cms-by-glitch/)

## May

**📖 Blog**

* [ทดลองใช้ AI generate ภาพ แบบ text-to-image จากเว็บไซต์ต่าง ๆ](https://www.mikkipastel.com/trial-generate-ai-text-to-image-website/)

**🏕 Activity**

* 11 May: [💖MOD นักสร้างคอมเทนท์ กับ น้องมิ้น | #Modนี้มีแต่ให้ EP 15](https://www.youtube.com/watch?v=Un4PE8qB0hc)

<figure><img src="/files/MBRVSmCgnjdjVmHXCx0G" alt="" width="563"><figcaption></figcaption></figure>

* 18 May: [💖เรียนรู้จากโปร วิธีการทำ Contribution | #Modนี้มีแต่ให้ EP 16](https://twitter.com/CryptoSaiV2/status/1659179935578357760)

<figure><img src="/files/XIDxSpmKPBoIrweTpIPp" alt="" width="563"><figcaption></figcaption></figure>

## June

**📖 Blog**

* [รู้จัก Stable Diffusion เบื้องต้น ฉบับยังไม่ลองทำ](https://www.mikkipastel.com/introduction-stable-diffusion-101/)
* [นายเองก็ใช้ markdown บน discord ได้นะ!](https://www.mikkipastel.com/how-to-use-markdown-on-discord/)
* [สรุปจากงาน Web 3.0, The Future of Decentralization](https://www.mikkipastel.com/web-3-0-the-future-of-decentralization/)
* [มางาน Apetimism 1st Anniversary แล้วได้อะไรบ้าง?](https://www.mikkipastel.com/apetimism-1st-anniversary/)

## July

**📖 Blog**

* [อย่าเพิ่งทำ ... ถ้ายังไม่ได้วิเคราะห์ 3C Analysis](https://www.mikkipastel.com/3c-analysis/)
* [สุ่มผู้โชคดีในโลก web3 ด้วย Chainlink VRF](https://www.mikkipastel.com/random-lucky-winners-web3-chainlink-vrf/)
* [ทำความรู้จัก Progressive Web Apps](https://www.mikkipastel.com/what-is-progressive-web-apps/)
* [มาเรียนรู้ "Content 3.0 การใช้ Ai เขียนคอนเทนต์แบบมือโปร" กันจ้า](https://www.mikkipastel.com/content-3-0-ai-for-content-creator/)
* [ถอดเคล็ดลับ Futures Trader เทรดยังไงให้มีเงินกินหมูกระทะ](https://www.mikkipastel.com/bittoon-dao-learning-cryptoteller-tips-from-futures-trader-take/)
* [ทำโปรเจกต์ PWA แบบไม่ต้อง setup project เยอะ โดยใช้ Glitch](https://www.mikkipastel.com/create-new-pwa-project-by-glitch/)

**🖥 Project**

* [Mikki Diary](https://mikkidiary.glitch.me/): maskdown website to log my content roadmap and web3 activity
* [Position Sizing Calculator](https://position-sizing.glitch.me/)

## August

**📖 Blog**

* [แชร์วิธีการเทส deeplink สำหรับ Android Developer](https://www.mikkipastel.com/how-to-test-deeplink-for-android-developer/)
* [ดึง transaction ของ contract ลง Google Sheet แบบง่าย ๆ ใคร ๆ ก็ทำได้ ไม่ต้องโค้ดเอง](https://www.mikkipastel.com/how-to-get-transaction-from-contract-to-google-sheet/)
* [เปิดประสบการณ์ใหม่ กับงานเทคในโรงหนัง กับ Google IO Extended 2023](https://www.mikkipastel.com/google-io-extended-2023/)
* [รีวิวงาน Bitcoin Addict Meetup 2023 ที่เมืองมังกรกัน](https://www.mikkipastel.com/bitcoin-addict-meetup-2023/)

**🖥 Project**

* PWA: [Chinda Calculator](https://chinda.glitch.me/)
* PWA: [Lincha Calculator](https://lincha.glitch.me/)

## September

**📖 Blog**

* [content stack 2023- ทำ content ต้องใช้เครี่องมืออะไรบ้าง](https://www.mikkipastel.com/content-stack-2023/)
* [มาเรียนรู้ NFT บน Internet Computer Protocol กัน กับงาน ICP World NFT](https://www.mikkipastel.com/icp_world_nft_gm_club/)
* [มือใหม่จะล่า airdrop ต้องรู้อะไรบ้าง?](https://www.mikkipastel.com/how-to-crypto-airdrop-for-beginner/)
* [รู้จักคนด้วยหลักการ DISC](https://www.mikkipastel.com/disc-people-personally-assessment-tool/)

## October

**📖 Blog**

* [งาน LINE Conference Thailand 2023 มีอะไรบ้าง ไปดูกัน](https://www.mikkipastel.com/line-conference-thailand-2023/)
* [มาเรียนรู้ mindset การทำ graphic แบบเริ่มต้น ก่อนทำงานจริง](https://www.mikkipastel.com/basic-graphic-before-advance-level/)
* [“ความลับที่คนประสบความสำเร็จไม่เคยบอกคุณ” ที่รู้แล้ว ย่นเวลาให้เราประสบความสำเร็จเร็วขึ้น](https://www.mikkipastel.com/the-secret-of-enterpreneurial-success/)
* [เข้าค่าย Compose Camp ชาว Android Developer กัน (ช่วงเช้า)](https://www.mikkipastel.com/th-compose-camp-first-half/)

## November

**📖 Blog**

* [มาอัพเดตเทคกับงาน DevFest Bangkok 2023](https://www.mikkipastel.com/devfest-bangkok-2023/)
* [อัพเดตข่าวสารอาชีพประจำปี กับงาน Android Bangkok Conference 2023](https://www.mikkipastel.com/android-bangkok-conference-2023/)
* [รีวิวคอร์สสาย Tech ที่เราเรียน](https://www.mikkipastel.com/review-skooldio-tech-course/)

## December

**📖 Blog**

* [มาเรียนรู้การเทรดเบื้องต้น กับ Bittoon Trading Club](https://www.mikkipastel.com/beginner-trading-bittoon-trading-club/)

**🏕 Activity**

15 Dec. Women in Tech: Power Hour Dinner

<figure><img src="/files/wA9DLlNrcGKZbVAZUzbP" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/iyKJSoeuCau8OQPy4NyO" alt=""><figcaption></figcaption></figure>


# Content Roadmap Sprint 01/2023 (21 May - 2 June)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_01.png?v=1688371390834" alt="" width="563"><figcaption></figcaption></figure>

### Content List

* mini content: การพักผ่อน 7 มิติ
* mini content: wheel of life
* blog: รู้จัก Stable Diffusion เบื้องต้นกัน ฉบับยังไม่ลองทำ
* plan: ฝึกใช้ canva ในการทำ graphic ของเพจ ซึ่งตัว content การพักผ่อน 7 มิติ ก็ใช้ canva ทำไปแล้ว อันนี้ก็ใช้ canva ด้วยเช่นกัน

### Retrospective

รู้สึกว่าเราแอบยัดเยอะไปนิดนึง เลยทำสรุป session Stable Diffusion เสร็จในวันนี้

### **Content ใน Sprint นี้**

* การพักผ่อน 7 มิติ: [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid033E2BqMDgk9mhxQsvarC8k5kkQVmLRmsB1qqyvp7FbQg3Cr5NM3X7pY4tc6hPxbLxl) | [Twitter](https://twitter.com/mikkipastel/status/1660607170088697861)
* wheel of life: [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0xp9UJqXoZijLQrzd6JJWS9kfoFGcXtPpxtfLgUSinsZYoi7DafjrU6rgGxpnpqwQl) | [Twitter](https://twitter.com/mikkipastel/status/1663153562141233152)
* ทดลองใช้ AI generate ภาพ แบบ text-to-image จากเว็บไซต์ต่าง ๆ: [Blog](https://www.mikkipastel.com/trial-generate-ai-text-to-image-website/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0LoPvXZ2gvdP6QuEMbCwfF57QMjR9CnVjE4pDXvRtJXMRDcP9s9uV7N72vYBqPGuyl) | [Twitter](https://twitter.com/mikkipastel/status/1663881825419407361)
* รู้จัก Stable Diffusion เบื้องต้นกัน ฉบับยังไม่ลองทำ: [Blog](https://www.mikkipastel.com/introduction-stable-diffusion-101/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0FJisF7GjJUcichKjq7upd1H9pSBmrYTDG58DyLrt3VVCWBjRhQS5WZ4qZsc4rA1jl)

### **Contributor Content**

* Tripster Lucky Box (test round): [Twitter](https://twitter.com/mikkipastel/status/1662078809154424832)


# Content Roadmap Sprint 02/2023 (5 - 16 June)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_02.png?v=1688374661557" alt="" width="563"><figcaption></figcaption></figure>

### Content List

หลังจากผ่าน sprint 1 แบบเฉียดฉิวไปแล้ว รอบนี้มาแนว Android Developer นิดนึง เคลียร์งานค้าง

* Mini Content: Android Logcat
* Blog Content: สรุป Compose Camp ที่ดองมานานแล้ว

### Retrospective

เนื่องจากงานเยอะมาก เลยไม่ได้แตะตัว Compose Camp เลย อาจจะค่อย ๆ ทำไปเนอะ

### **Content ใน Sprint นี้**

* Android Logcat: [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid034XiM8CxpRB4FFH2KTaU3j9Cofi4ukPTeV3QN7ErrxEj7E71zqTxc7ABaa1PH54Hol) | [Twitter](https://twitter.com/mikkipastel/status/1667147014931615746)
* นายเองก็ใช้ maskdown บน discord ได้นะ!: [Blog](https://www.mikkipastel.com/how-to-use-markdown-on-discord) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02tNRCgncS8fPDRBnxb82b4h7L4kFubgMbrdpbpRJChBMPMvq1Jb31sqSDnTk6f4JZl) | [Twitter](https://twitter.com/mikkipastel/status/1668236567243280386)


# Content Roadmap Sprint 03/2023 (19 - 30 June)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_03.png?v=1688375574817" alt="" width="563"><figcaption></figcaption></figure>

### Content List

ในช่วงนี้จะเน้นการ research ซึ่งไม่รับประกันว่าได้ content ใน sprint นี้หรือไม่

* Blog Content: Chainlink VRF เห็นว่า Tripster ใช้ตัวนี้ในการสุ่มรางวัล Lucky Box ของเรา เลยก็เลยมาเรียนรู้เนอะว่ามันทำงานประมาณไหน เท่าที่ดูคร่าว ๆ คือโปร่งใส เพราะมันสุ่มแน่ ๆ
* Blog Content: สรุป Web3.0, The future of Decentralization อันนี้ดองมาเกินปีแล้ว อาจจะทำภาพประกอบ และ recheck เนื้อหาก่อนโพส ซึ่งจริง ๆ เนื้อหาจะคล้าย ๆ กับที่เคยสรุปอีกงานแหละ เลยไม่อยากปล่อยติดกันในตอนนั้นกลัวคนเบื่อ
* Develop Plan: Brand CI ที่กำลังค่อย ๆ ปรับของเพจ ในเรื่องของสี font (ที่เหมือนน่าจะลงตัวแล้ว) และ logo ต่าง ๆ
* Learning: #ChaiyoGCP อันนี้ไม่ได้เร่งให้จบไว ทำให้จบก่อนวันสุดท้ายก็ดี จะได้ swag

### Retrospective

เนื่องจากงานเยอะ หมดสภาพ เข้ากิจกรรม web3 เยอะไปหน่อย ตัว #ChaiyoGCP ทำเสร็จไปแค่ 2 เอง ขั้นตํ่า 7 อาจจะไม่ทัน ทำให้ตัว content Chainlink VRF เสร็จไม่ทัน เลยเลื่อนไปยังอาทิตย์ถัดไปแทน

### **Content ใน Sprint นี้**

* Web3.0, The future of Decentralization: [Blog](https://www.mikkipastel.com/web-3-0-the-future-of-decentralization) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0JzEpWCmeFcCkApzQJo7zJ1TYTKvnmkTQBVn9X7korhA9LynZvpdxG8viffkUP98yl) | [Twitter](https://twitter.com/mikkipastel/status/1672215900198670338)
* งาน Apetimism 1st Anniversary: [Blog](https://www.mikkipastel.com/apetimism-1st-anniversary/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0RKC1PDzhVH7PSd9Rz9god48JP4RBXW1ZG92k1i2s2DSPVru4PqedDuXe9dE7aqnZl) | [Twitter](https://twitter.com/mikkipastel/status/1673297653814411264)
* [HY mood x garden วันเปิด](https://twitter.com/mikkipastel/status/1674051896187789316)
* [The Art I Love ep2 + HY mood x garden collector night](https://twitter.com/mikkipastel/status/1675496727837827073)

<br>


# Content Roadmap Sprint 04/2023 (3 - 14 July)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_04.png?v=1688375577177" alt="" width="563"><figcaption></figcaption></figure>

### Content List

มี content ที่ทำต่อจาก sprint ที่แล้ว คือ Chainlink VRF นั่นเอง

* Blog Content: Chainlink VRF เหลือแค่แงะโค้ดฝั่ง smart contract นี่แหละ
* Blog Content: 3C Analysis อันนี้พี่เทอร์โบเล่าใน Bittoon DAO Learning นานแล้ว ได้เวลาทบทวน ทำกราฟฟิค และเล่าเรื่องในแบบของเรา เผื่อเป็นประโยชน์น้า เพราะจะทำเป็น template ให้ใช้เลย
* Product: LINE Sticker ทำเสร็จหมดแล้ว 16 ลาย เหลือเก็บรายละเอียด และส่งขายซะทีนะ 5555
* Project: ด้วยความที่เราไปงาน in-real-life ของ community web3 ต่าง ๆ แล้วก็น้อยอันมากที่จะลงบล็อก เพราะคนอ่านในทวิตมากกว่า ก็เลยอยากรวบรวมไว้ในที่เดียว พร้อมตัว content roadmap ด้วยเลย บนเว็บนี้ ที่เป็น web blog markdown อาจจะมีการปรับนิดหน่อย

### Retrospective

* เนื่องจากเสาร์อาทิตย์ไม่ได้ไปงาน IRL ที่ไหน เลยทำให้ content ใน sprint เสร็จก่อนกำหนด เลยเริ่มทำ content ใน sprint ถัดไปเลย
* ส่วน Sticker LINE **Pastel Crypto Boy** ส่ง submit ไปแล้ว พร้อมเข้าร่วม "LINE STICKERS CONTEST 2023" ด้วย โดยตัว sticker จะได้วางขายวันที่ 15 สิงหาคมนะ

### **Content ใน Sprint นี้**

* [Mikki Diary](https://mikkidiary.glitch.me/)
* อย่าเพิ่งทำ ... ถ้ายังไม่ได้วิเคราะห์ 3C Analysis: [Blog](https://www.mikkipastel.com/3c-analysis/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02p4T4oe8doKvuBf56Ku3YxnB2DMFkmWkvowKZpRLHjt25tJ4b2cXmMou5JJDNZCPZl) | [Twitter](https://twitter.com/mikkipastel/status/1678000427005247488)
* สุ่มผู้โชคดีในโลก web3 ด้วย Chainlink VRF: [Blog](https://www.mikkipastel.com/random-lucky-winners-web3-chainlink-vrf) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02rALEvwB2QymfnnoTRmjgTReF9XupKbnMgeRT1Heu4RRtq62ocw7k3gWVPNcjRhM9l) | [Twitter](https://twitter.com/mikkipastel/status/1679828701868097538) |

### **Contributor Content**

* What's Tripster Content: [Twitter](https://twitter.com/mikkipastel/status/1677295381397524480)


# Content Roadmap Sprint 05/2023 (17 - 25 July)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_05.png?v=1689485746952" alt="" width="563"><figcaption></figcaption></figure>

### Content List

ใน sprint นี้ เราจะมาพูดถึง PWA หรือ Progressive Web Apps กันว่าคืออะไร? และมี site project ที่ลองทำเล่น ๆ แบบไม่ยากมาฝากกันด้วยน้า

### Retrospective

มีการ stock content แรกของสัปดาห์แรกไว้ก่อน แต่ของสัปดาห์ที่สองเกือบไม่ทัน เพราะกลัวทำรูปแล้วคนอ่านจะงง ๆ แล้วมีไปงาน coffee talk ของ Enter to Start ด้วย ก็เลยมีบล็อกมาเพิ่ม กับเอา content ที่เคบสรุปบนทวิตมาทำต่อเป็นบล็อก คือ สูตรคำนวณ Future นั่นเอง

### **Content ใน Sprint นี้**

* ทำความรู้จัก Progressive Web Apps: [Blog](https://www.mikkipastel.com/what-is-progressive-web-apps) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02bL65VdtCCnuAFxNzhEqdoEyEX7jSnW4dYsPvYxcVJ8jPpnSkum66KkEMa1HqPge9l) | [Twitter](https://twitter.com/mikkipastel/status/1682369004516831233)
* มาเรียนรู้ "Content 3.0 การใช้ Ai เขียนคอนเทนต์แบบมือโปร" กันจ้า: [Blog](https://www.mikkipastel.com/content-3-0-ai-for-content-creator/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02thmgwMjynfy94MkLibh3EbkZCKteVYq3CoT2t4UBYRPvViqR5vFDsSgtcZsZnNshl) | [Twitter](https://twitter.com/mikkipastel/status/1683026091160793089)
* ถอดเคล็ดลับ Futures Trader เทรดยังไงให้มีเงินกินหมูกระทะ: [Blog](https://www.mikkipastel.com/bittoon-dao-learning-cryptoteller-tips-from-futures-trader-take/)
* ทำโปรเจกต์ PWA แบบไม่ต้อง setup project เยอะ โดยใช้ Glitch: [Blog](https://www.mikkipastel.com/create-new-pwa-project-by-glitch/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02dvUUXpum89D9BmrXhyxx5eUimfWw8xX6Bha3W6ojRcXHkrWTwZw4f3EusS44jBo4l) | [Twitter](https://twitter.com/mikkipastel/status/1684897303017222145)

### Project

* [Position Sizing Calculator](https://position-sizing.glitch.me/)


# Content Roadmap Sprint 06/2023 (31 July - 11 August)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_06.png?v=1690772183064" alt="" width="563"><figcaption></figcaption></figure>

### Content List

เนื่องจากต้น sprint ติดกับวันหยุดยาว ก็เลยลองทำอะไรยิบย่อยสนุก ๆ ดูจ้า

* การทำงานเราอาจจะต้อง test ตัว deeplink กัน ก็เลยลองวิธีเทสที่เป็นไปได้ มาแชร์ให้ทุกคนเนอะ มาแลกเปลี่ยนการ test deeplink ของฝั่ง Android กันเถอะ
* Sticker LINE ชุดแรกรอขาย ก็เริ่มทำชุดที่สองต่อแล้ว เพื่อส่งประกวดสติ๊กเกอร์ทำงานจ้า
* ทางเราและผองเพื่อนได้ทานสุกี้จินดา หรือสุกี้หม่าล่าสายพานกันบ่อย เลยทำเครื่องติดเลขซะเลย
* แน่นอนว่าเราจะลองใช้ Canva ในการตัดคลิป video demo ตัวนี้กันนะ

### Retrospective

อาจจะมีเวลาทำ content น้อยลงนิดนึง เนื่องจากมีไปช่วยทีม Tripster ตอนไป AMA แล้วก็ไปฟัง AMA โปรเจกต์อื่น ๆ ด้วย โพสลง page คนเห็นโพสน้อยมาก ส่วน Twitter คนเห็นเยอะกว่า และมี engagement ที่ดีกว่ามาก ๆ

### **Content ใน Sprint นี้**

* demo Chinda Calculator: [YouTube](https://www.youtube.com/watch?v=zXhnO1mGA7M)
* แชร์วิธีการเทส deeplink สำหรับ Android Developer: [Blog](https://www.mikkipastel.com/how-to-test-deeplink-for-android-developer/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02xtzYKaXbFt7ehzA93P2dXWvY1NUGnBCy8n8JcRKYZz7THRtw4gbm1qFBoDzJs1qvl) | [Twitter](https://twitter.com/mikkipastel/status/1689966884236791808)

### **Project**

* PWA: [Chinda Calculator](https://chinda.glitch.me/)
* PWA: [Lincha Calculator](https://lincha.glitch.me/)
* Sticker LINE: [Pastel: Work to Earn](https://store.line.me/stickershop/product/23901029/en)

### **Contributor Content**

* Tripster Lucky Box (overall): [Twitter](https://twitter.com/mikkipastel/status/1686997229507313664)
* Tripster Lucky Box (how to redeem code & my code): [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02VWrdXjhG2ereXPaHi5D6VSPGTggsNirFUydvb48zbpB52vz8bpfPDVi2TLECV3xTl) | [Twitter](https://twitter.com/mikkipastel/status/1688104978060337152)


# Content Roadmap Sprint 07/2023 (14 - 25 August)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_07.jpeg?v=1693371780660" alt="" width="563"><figcaption></figcaption></figure>

### Content List

ของวีคนี้ลงเรื่อง content stack ในปีนี้ ว่าใช้ tool อะไรทำ content บ้าง . และมี event จากฝั่ง dev ที่ประกาศวันแล้ว แต่รอประกาศกดบัตร กับงาน web3 ที่ประกาศวัน เวลา สถานที่ และกดบัตรเรียบร้อยแล้ว ก็เลยจะเว้นไว้ทำบล็อกสรุปงานเนอะ

### Retrospective

สลับเอาเรื่องการดึง transaction จากเขน Optimism และ Arbiturm มาก่อน เพราะปิดกิจกรรมของ Tripster พอดี

### **Content ใน Sprint นี้**

* ดึง transaction ของ contract ลง Google Sheet แบบง่าย ๆ ใคร ๆ ก็ทำได้ ไม่ต้องโค้ดเอง: [Blog](https://www.mikkipastel.com/how-to-get-transaction-from-contract-to-google-sheet/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid025jybCceRsK5fcE9MsefL7HHfMpjcHfJ7pyEpBJvBhzvxew6iqSym7wgoFBYFnW3El) | [Twitter](https://twitter.com/mikkipastel/status/1692507836188942365)
* Google IO Extended 2023: [Blog](https://www.mikkipastel.com/google-io-extended-2023/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid027BRJdDVraQ9YEF9Pxtomf4X4DUAz6TFU3XzLVyY2weZSbEkpvJZSAF21mtbuDTESl) | [Twitter](https://twitter.com/mikkipastel/status/1694318682275774707)
* Bitcoin Addict Meetup 2023: [Blog](https://www.mikkipastel.com/bitcoin-addict-meetup-2023/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid0y2KZSnhyCaszjKgwCUEFEtahZtSffo5hdFjCq7HHQ2Jpfoeo1w1Mbt5VEwXaaWu2l) | [Twitter](https://twitter.com/mikkipastel/status/1694703526000423416)

<br>


# Content Roadmap Sprint 08/2023 (28 August - 8 September)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_08.png?v=1693371403427" alt="" width="563"><figcaption></figcaption></figure>

### Content List

ของวีคนี้ลงเรื่อง content stack ในปีนี้ ว่าใช้ tool อะไรทำ content บ้าง จากที่สลับไปใน sprint ที่แล้ว และทำบล็อก Compose Camp ให้เสร็จใน sprint นี้ ดองมานานจนจะจำไม่ได้แล้วนะ

และมี event ฝั่ง web3 ด้วย ติดตามสรุปได้จาก Twitter เลยจ้า

### Retrospective

Compose Camp ทำไม่ทัน เลยเลื่อนไปก่อนจ้า

### **Content ใน Sprint นี้**

* Content stack 2023: [Blog](https://www.mikkipastel.com/content-stack-2023/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid03nBsctdF3wCdFa7DQsGJ7SioShkodjWxBpnqTU9d2oxvTZtwZpzSTBNXsgoeKm6pl) | [Twitter](https://twitter.com/mikkipastel/status/1697585729822732463)
* Event: ICP WORLD NFTs เรียนรู้ NFT บน ICP: [Blog](https://www.mikkipastel.com/icp_world_nft_gm_club/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02aBQEwUNDvvW8BodcUUDqWu1dBfMUgGq3MKtwA25mD6vTwxK23n3XfGLuhGo1r1DXl) | [Twiiter](https://twitter.com/mikkipastel/status/1698664143895888093)

<br>


# Content Roadmap Sprint 09/2023 (11 - 22 September)

<figure><img src="https://cdn.glitch.global/2a53279f-6b0b-496a-8c43-6bf257052e26/content_roadmap_2023_09.png?v=1694491033508" alt="" width="563"><figcaption></figcaption></figure>

#### Content List

เขียนว่าทำบล็อก Compose Camp จนกว่าจะเสร็จจ้า

วีคนี้มีสรุปจาก Bittoon DAO Learning ทั้งเรื่องของการล่า airdrop แล้วก็รู้จักคนด้วย DISC เนอะ ลงในทวิตหมด ส่วนในเพจเหมือน Facebook จะลบบางโพสที่เกี่ยวกับคริปโตออก ยากเลย ฮืออออ

#### Retrospective

TBC

**Content ใน Sprint นี้**

* Airdrop สำหรับมือใหม่: [Blog](https://www.mikkipastel.com/how-to-crypto-airdrop-for-beginner) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid031J385xEBjd4cgpKEyzWX15ymaH416YVq9W5buevrqS4JPk7btwSgdoeYNcaTfUU2l) | [Twiiter](https://twitter.com/mikkipastel/status/1702651320849805321)
* รู้จักคนด้วยหลักการ DISC: [Blog](https://www.mikkipastel.com/disc-people-personally-assessment-tool) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02nmMfpWyivC9qnaQLhZNgiz6KDC79dxyBQyzGyZbKwSn3aSro6qtshQfyygSmHh8Pl) | [Twiiter](https://twitter.com/mikkipastel/status/1705196816277570002)

**Contributor Content**

* Tripster Lucky Box round2: [Twitter](https://twitter.com/mikkipastel/status/1700101387978527083)
* Buying 50 txn for Tripster Lucky Box: [Twitter](https://twitter.com/mikkipastel/status/1700772725751697627)


# Content Roadmap Sprint 10/2023 (25 September - 6 October)

<figure><img src="/files/xm0UgD8kddQuoyHoAaVQ" alt="" width="395"><figcaption></figcaption></figure>

เขียนว่าทำบล็อก Compose Camp จนกว่าจะเสร็จจ้า ตอนนี้เหลือแค่เรียงของนิดหน่อย อาจจะไม่ละเอียดมากน้าทุกคน มันผ่านไปหลายเดือนแล้ว

พรุ่งนี้มีงาน LINE Confrence TH 2023 [#LCF23](https://www.facebook.com/hashtag/lcf23?__eep__=6&__cft__\[0]=AZUnJ87VV9JZokRe6an9fiqCkxEXG_UNLeCdoEZnySq9QUIa1Z75NZhZuw0jRpQhIiTeDliUtbhYg_WIk8Ws1bQgnA1Kf3NbA-oRPDxbYykBKU4qQSssSzgaCy2Gn_6-3aE&__tn__=*NK-R) นะทุกคน ใครมีบัตรเจอกัน แหะๆ


# Content Roadmap Sprint 11/2023 (9 - 20 October)

<figure><img src="/files/R312tVrXYkFrEdDk2tMY" alt="" width="563"><figcaption></figcaption></figure>

ปีนี้น่าจะทำ Jetpack Compose ยาว ๆ ไปถึงสิ้นปีแหละเนอะ (อีกอันคือ discord bot)

ช่วงนี้อาจจะได้อ่านบล็อก Compose Camp แบบแบ่งช่วงเช้า ช่วงเย็นกันไปเนอะ เพราะเนื้อหาเยอะ เลยใช้เวลาทบทวนด้วย เป็นประโยชน์กับทุกคนแน่นอน มีลองทำ POC บางอย่างด้วย ดูว่าทุกคนจะได้เล่นวันไหนเนอะ ทำก่อนตลาด bullrun ก็ยังดี 55555555555

ส่วน content ทั่ว ๆ ไปยังมีอยู่เรื่อย ๆ นะ ติดตาม Twitter จะได้อ่านอะไรเร็วกว่า


# Content Roadmap Sprint 12/2023 (6 - 17 November)

<figure><img src="/files/AB5tuQjinrW3RAg4msq8" alt="" width="563"><figcaption></figcaption></figure>

เป็นช่วงเสาร์อาทิตย์ที่มีงาน event มากมาย เรียกว่าออกงานกันติด ๆ เลย

* 4 Nov. DevFest Bangkok 2023
* 5 Nov. Android Bangkok Conference 2023
* 11 - 12 Nov. Blockchain Genesis 2023 ไปเป็นสตาฟเฝ้าบูธ Pudgy Thailand

สำหรับงาน DevFest Bangkok 2023 กับ Android Bangkok Conference 2023 จะมีบล็อกน้า


# Content Roadmap Sprint 13/2023 (20 November - 1 December)

<figure><img src="/files/evV6BBySujwKbOVIZnzc" alt="" width="563"><figcaption></figcaption></figure>

หลังจากที่สะสางภาระกิจหลังงาน Blochchain Genesis 2023 แล้ว เราต้องรีบปั่นบล็อกงาน Android Bangkok Conference 2023 ให้เสร็จสิ้น ตอนนี้เสร็จไปครึ่งนึงแล้ว น่าจะได้อ่านภายในอาทิตย์นี้แหละ

แล้วก็รวบรวม content trading เบื้องต้นจาก Bittoon Trading Club ที่หลาย ๆ คนอาจจะเห็นผ่าน Twitter เลยจะรวบรวมเป็นบล็อกไว้เนอะ

จากนั้นค่อย ๆ มานั่งทำบล็อกสรุป Compose Camp ช่วงบ่ายกัน คือไม่ได้จดเยอะ อาจจะชดใช้กรรมนิดนึง รอกันหน่อยแล้วกัน

แอบกระซิบนิดนึงว่า เราแอบเตรียม site project ในปีหน้าแล้ว มาติดตามกัน ๆ

**Content ใน Sprint นี้**

* อัพเดตข่าวสารอาชีพประจำปี กับงาน Android Bangkok Conference 2023: [Blog](https://www.mikkipastel.com/android-bangkok-conference-2023/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02acstTdGxh2HpXhnuzvdEE9qg1Gb97PMiQhp7X4XsCcWsRENvCcfo5Kfg2qqFu2cml) | [Twitter](https://twitter.com/mikkipastel/status/1728020646863528316)
* Review course Skooldio: [Blog](https://www.mikkipastel.com/review-skooldio-tech-course/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02Ai8VM6D9cPFjTFeJ9c4Pr7iHBR6FKq4HdWJAN9HdEBJdKDfoSWgjwtCNh3X5QhKSl) | [Twitter](https://twitter.com/mikkipastel/status/1729120859254927863)
* Beginner Trading from Bittoon Trading club: [Blog](https://www.mikkipastel.com/beginner-trading-bittoon-trading-club/) | [Facebook](https://www.facebook.com/MikkiPastel/posts/pfbid02UEE5cmab5KfCe9jJiwZhx3oqiWAy34ghtdDfSJ5HJGFtCaPYQ8xeEdWCC4Q34Et3l) | [Twitter](https://twitter.com/mikkipastel/status/1730557358181425251)


# Content Roadmap Sprint 14/2023 (6 - 22 December)

<figure><img src="https://scontent.fbkk8-4.fna.fbcdn.net/v/t39.30808-6/405411579_851502486981197_2591251019782600283_n.jpg?stp=dst-jpg_p526x296&#x26;_nc_cat=103&#x26;ccb=1-7&#x26;_nc_sid=3635dc&#x26;_nc_eui2=AeFi-uIgw1sCn4aZwt5If4OsmZB2uQAbZw6ZkHa5ABtnDuNSHvUT_3ihHxveHuH8Kk4&#x26;_nc_ohc=eUgxEoJ46EgAX_taZk6&#x26;_nc_ht=scontent.fbkk8-4.fna&#x26;oh=00_AfAdH_5RMm4pG5O46Bow_G0QtdWkY0ncUkdCtNPQOmENUQ&#x26;oe=657B119C" alt="" width="563"><figcaption></figcaption></figure>

เนื่องจากเดือนนี้ เป็นเดือนสุดท้ายของปี แถมเป็นเดือนที่วันหยุดเยอะ sprint นี้ก็เลยรวบเป็น 3 อาทิตย์ ก่อนหยุดยาว ๆ เพื่อทำงานกันต่อไปในปีหน้าเนอะ.content ที่จะทำ ก็มีสรุปที่เราเรียนเกี่ยวกับ Project Management แล้วก็ช่วงนึงเราเอา Jetpack Compose มาทำ Widget ด้วย เดี๋ยวจะทำ blog เล่าเนอะว่าเราได้เรียนรู้อะไรไปบ้าง

แล้วก็มีงานอื่น ๆ ที่ยังเปิดเผยไม่ได้ แต่สนุกแน่นอนรอชมคนับ<br>


# 2022

content release on 2022 at my website, my YouTube, and my site projects

## January

**📖 Blog**

* [วิธีการ redirect domain จาก blogger ไปยัง ghost cms](https://www.mikkipastel.com/how-to-redirect-domain-from-blogger-to-ghost-cms/)
* [ทำ Jenkins pipeline ใน Android project ของเรากันเถอะ](https://www.mikkipastel.com/jenkins-pipeline-for-android-project/)
* [ทบทวน Python กับไลฟ์การทำ Wordle ของน้อง Mari Taiga](https://www.mikkipastel.com/live-python-wordle-mari-taiga/)
* [ทดลองทำ gitbook เป็นของตัวเอง](https://www.mikkipastel.com/how-to-create-my-gitbook/)

**📹 Video**

* [Dev หาทำ! redirect domain จาก blogger ไปยัง ghost cms](https://www.youtube.com/watch?v=krx4v7xHrmU)
* [demo แอพจากมือถือ Android แบบคมชัดได้ง่ายๆและฟรี กับ scrcpy](https://www.youtube.com/watch?v=MaX7Eg1TySw)
* [Dev หาทำ? เมื่อ developer หัดใช้ scratch เขียนโปรแกรม](https://www.youtube.com/watch?v=yO0bttZSWws)

**🖥 Project**

* [**mikkicoding**](https://mikkicoding.mikkipastel.com/): Digital garden for tutorial content in Gitbook. This project is migrate from Owlvegrammo.

## February

**📖 Blog**

* [ทดลองทำ React website แบบง่ายๆบน Vercel กันเถอะ](https://www.mikkipastel.com/simple-react-website-on-vercel/)
* [วิธีการรับเหรียญไว้เทสใน Ropsten Ethereum](https://www.mikkipastel.com/get-eth-and-token-for-test-with-ropsten-ethereum-testnet-by-faucet/)
* [แนะแนววิธีการทำ Github Profile ให้สวยงาม](https://www.mikkipastel.com/guide-for-do-github-profile-to-beautiful/)
* [จดประเด็นที่น่าสนใจใน "Web3.0 เว็บไร้ตัวกลางกำลังจะมา คนทำเว็บว่ายังไง"](https://www.mikkipastel.com/note-for-web-3-decentralized-web-webpresso/)

**📹 Video**

* [Dev หาทำ! ทดลองทำ React website แบบง่ายๆบน Vercel กันเถอะ](https://www.youtube.com/watch?v=U0KDihBp1zU)
* [\[Tutorial\] วิธีการรับเหรียญไว้เทสใน Ropsten Ethereum](https://www.youtube.com/watch?v=gZwlUD4kfLA)
* [เมื่อ Android Developer ทดลองเป็น Hacker (Bitburner)](https://www.youtube.com/watch?v=wHgjBXyWPNA)

**🖥 Project**

* [**𝓰𝓸 𝓽𝓸 𝓽𝓱𝓮 𝓽𝓻𝓪𝓹**](https://gotothetrap.vercel.app/): Sample redirect to YouTube with random trap (in future) with Vercel and React.js.

## March

**📖 Blog**

* [ทำไมเราจึงห้ามให้ seed และ private key ของ wallet ของเราให้คนอื่น?](https://www.mikkipastel.com/why-dont-give-seed-and-private-key-to-other/)
* [สิ่งเตือนใจของดรอยเดฟ "อย่าปล่อยให้แอปเติบโตไปในทางที่ผิดจนสายเกินแก้"](https://www.mikkipastel.com/remain-for-android-developer-with-dont-accidentally-risk-being-distracted-until-its-too-late/)
* [วิเคราะห์เทรนคริปโตที่น่าจับตามองในปี 2022 ของคุณต้นฮ้อและเพจ Stocker Day](https://www.mikkipastel.com/crpytocurrency-trend-2022-by-tonhor-and-stocker-day/)
* [จดสรุป "NFT ตอนนี้ยังน่าเล่นอยู่ไหม ถึงขาลงแล้วหรือยัง ?"](https://www.mikkipastel.com/nft-is-still-to-invest-even-thought-downtrend-is-already/)
* [สรุป Lifelong Journey as a Software Engineer จากงาน Dev Mountain Tech Festival](https://www.mikkipastel.com/lifelong-journey-as-a-software-engineer-dev-mountain-tech-festival/)
* [สรุป session สาย blockchain แบบมัดรวม จากงาน Dev Mountain Tech Festival](https://www.mikkipastel.com/summary-all-session-blockchain-from-devmountainfestival/)

**📹 Video**

* [พาชมบ้านในโลก Metaverse ผ่านแอพ ZEPETO](https://www.youtube.com/watch?v=27XquiLo6-s)
* [เมื่อ Android Developer อยากผันตัวเป็น Data Scientist (while true learn)](https://www.youtube.com/watch?v=UUk0M6Luvh8)

**🏕 Activity**

* **Women Developers Academy SEA**: Participate in an Exclusive Online Training Program and 1-1 Mentorship with Googler for 4 weeks.

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_monthira_WDA.png" alt="" width="563"><figcaption></figcaption></figure>

## April

**📖 Blog**

* [สรุป "Workshop: Hands-on Securing Smart Contract" จากงาน KBTG Inspire2](https://www.mikkipastel.com/summary-workshop-hands-on-securing-smart-contract-kbtg/)
* [ทำความรู้จัก Web 3.0 และ WASM เพิ่มเติมจากงาน "Bkk.js #14 Back in business"](https://www.mikkipastel.com/bkk-js-14-back-in-business/)
* [Next Level Discord Bot กับการแจ้งเตือนประชุมหลบวันหยุด กิจกรรมในทีม และวันลา](https://www.mikkipastel.com/next-level-discord-bot-with-google-calendar/)

**📹 Video**

* [Procreate 101 โดยเพจ MikkiPastel](https://www.youtube.com/watch?v=_SDssfCW-88)
* [ซื้อโปรแกรม Aseprite แล้วลองใช้งานครั้งแรก (speed-run clip)](https://www.youtube.com/watch?v=gJ5S8Nctm3c)
* [Dev หาเล่น! มาเข้าใจหน้าที่ของ Data Engineer จากเกมส์ The Life of Data Engineer](https://www.youtube.com/watch?v=7G5j-tDE_tg)
* [\[Live-Recording\] มาเขียน Svelte กันเถอะ](https://www.youtube.com/watch?v=b_o5uqkOl5g)

## May

**📖 Blog**

* [ทำเว็บ todo list แบบง่ายๆ โดยใช้ Svelte และ Tailwind CSS เป็นครั้งแรก](https://www.mikkipastel.com/todo-list-by-svelte-and-tailwind-css-first-time/)
* [ทำความรู้จักกับ GitHub Actions](https://www.mikkipastel.com/get-to-know-github-actions/)
* [บันทึกจากงาน Code in the Wind #1](https://www.mikkipastel.com/diary-of-code-in-the-wind-1/)
* [ฝึกการ bridge ไป Optimism เพื่อกิจกรรมล่า airdrop ในอนาคต](https://www.mikkipastel.com/bridge-eth-to-optimism-before-airdrop-event/)

**📹 Video**

* [\[Live Recording\] ฝึกเขียน Tailwind.css](https://www.youtube.com/watch?v=VJDzVe8SeIA)
* [ทำโจทย์ Example Challenge # 2 ของงาน Code in the wind #1](https://www.youtube.com/watch?v=UXkg2C1vHok)
* [โจทย์ example Code in the Wind but Android!!! !discord](https://www.youtube.com/watch?v=mOl5dDT-o_Y)

**🏕 Activity**

* [**Code in the Wind #1**](https://showdown.space/events/code-in-the-wind-1/): Participate to join game show for create layout with Tailwind.CSS.

## June

**📖 Blog**

* [ทำความรู้จักกับ Rei Chain เชนน้องใหม่ของคนไทยกันเถอะ](https://www.mikkipastel.com/introduce-what-is-rei-chain/)
* [วิธีง่ายๆในการดู NFT ที่ได้ ในกระเป๋าของเรา](https://www.mikkipastel.com/how-to-see-my-nft-in-wallet-with-metamask-and-ipfs/)
* [จดสรุป Skooldio x Google Developers - What’s New in Android](https://www.mikkipastel.com/skooldio-x-google-developers-whats-new-in-android/)
* [เกมส์ Ni no Kuni: Cross Worlds เกี่ยวกับ Blockchain ยังไง](https://www.mikkipastel.com/ni-no-kuni-cross-worlds-blockchain-game-airdrop-event/)
* [เรียนปูพื้นฐานพร้อมสร้างเหรียญ ใน Discord Naga DAO](https://www.mikkipastel.com/smart-contract-classroom-discord-naga-dao/)
* [สรุป Svelte Meetup ครั้งแรกของประเทศไทยกันจ้า](https://www.mikkipastel.com/svelte-meetup-1-bangkok/)

**📹 Video**

* [ทำความรู้จักกับ Rei Chain เชนน้องใหม่ของคนไทยกันเถอะ](https://www.youtube.com/watch?v=M2YzRVvUi7c)
* [เอา NFT ที่ได้จาก MOBOX มาเดินเล่นใน momoverse กัน](https://www.youtube.com/watch?v=-ktozmrPSyM)
* [Highlight: Ni no Kuni: Cross Worlds กิจกรรม Airdrop และการทำเควสประจำวัน](https://www.youtube.com/watch?v=mKJBQ3iDWAw)

## July

**📖 Blog**

* [Key takeaway จากคอร์ส How to Become a Top Performer](https://www.mikkipastel.com/key-takeaway-from-how-to-become-a-top-performer-skooldio/)
* [ทำความรู้จัก NFT โปรเจกต์ใหญ่ของเรา "Next Journey" จ้า](https://www.mikkipastel.com/introduction-of-nft-mikkipastel-next-journey/)
* [เล่าเรื่องงาน Crypthon Challenge ของ Stocker DAO](https://www.mikkipastel.com/crypthon-challenge-stocker-dao/)

**📹 Video**

* [สอนวิธีการเปิด Near wallet และซื้อ NFT ใน paras.id](https://www.youtube.com/watch?v=hGLZlcrCZAQ)
* [พาชมโลก Metaverse ในแอพ ZEPETO กัน](https://www.youtube.com/watch?v=X39e5XcqjzY)

## August

**📖 Blog**

* [ทดลองทำ generative NFT แบบง่ายๆ แบบไม่ต้องโค้ดกัน บน speedboat](https://www.mikkipastel.com/try-to-do-geneative-nft-without-coding-by-speedboat/)

**🏕 Activity**

* [staff for Android Developer Meetup 08.2022](https://medium.com/android-developer-meetup-th/diary-of-staff-at-android-developer-meetup-08-2022-by-mikkipastel-b22d6f89b50)

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_staff_android_082022.jpeg" alt="" width="563"><figcaption></figcaption></figure>

## September

**📖 Blog**

* [รีวิวคริปโทแสตมป์ สแตมป์ NFT ของทางไปรษณีย์ไทย](https://www.mikkipastel.com/review-crypto-stamp-nft-thailandpost/)
* [กลับมาอีกครั้งกับงาน LINE THAILAND DEVELOPER CONFERENCE 2022](https://www.mikkipastel.com/line-thailand-developer-conference-2022/)

**📹 Video**

* [รีวิวคริปโทแสตมป์ สแตมป์ NFT ของทางไปรษณีย์ไทย](https://www.youtube.com/watch?v=emkvRKZnkWA)

**🏕 Activity**

* **Android Bangkok 2022**: I came back for a speaker in Android Bangkok again with "Level up with Android Library for Android Developer" session

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_android_bangkok_2022.jpeg" alt="" width="563"><figcaption></figcaption></figure>

## October

**📖 Blog**

* [สรุป Productive Communication & Personality Improvement จากโครงการ Skooldio Creator Square](https://www.mikkipastel.com/productive-communication-personality-improvement-skooldio-creator-square/)
* [ทดลองเป็น Creator ฝึกหัด กับเหล่า Skooldio Creator Square ที่ Creators Playground กันจ้า](https://www.mikkipastel.com/creators-playground-skooldio-creator-camp/)
* [สอนยังไงให้สนุก กับพี่ต้า แห่ง Skooldio กับ Effective and Creative](https://www.mikkipastel.com/effective-and-creative-skooldio-creator-square/)
* [มาเพิ่ม Skill ของ Android Developer ด้วยการทำ Android Library กันเถอะ](https://www.mikkipastel.com/level-up-with-android-library-for-android-developer-android-bangkok-2022/)
* [ทำเพจหลักแสน ทำกี่รอบก็ทำได้ โดยพี่เทอร์โบ เพจ Bittoon](https://www.mikkipastel.com/how-to-get-100000-follower-in-facebook-page-by-turbo-bittoon-dao/)
* [งานชาว open source เป็นยังไงบ้างนะ? กับงาน Hacktoberfest Thailand 2022](https://www.mikkipastel.com/hacktoberfest-thailand-2022/)

**🏕 Activity**

* **Skooldio Creator Square**: I joined program for tech content creator to contribute to the tech community.

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_skooldio_creator_square.jpg" alt="" width="563"><figcaption></figcaption></figure>

* [**Hacktoberfest Thailand 2022**](https://www.youtube.com/watch?v=8aVdlBhY6zU): I sent a call to paper to contribute to my session "How to contribute to tech community with your blog" for this event.

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_hacktober_thailand_2022.jpeg" alt="" width="563"><figcaption></figcaption></figure>

## November

**📖 Blog**

* [5 สิ่งแตกต่าง ที่ Kotlin ดีกว่า Java (ของดีครับน้อนๆ)](https://www.mikkipastel.com/5-difference-things-kotlin-is-great-than-java/)
* [บันทึกเกี่ยวกับงาน Dev Mountain Tech Festival ครั้งที่ 2 ที่เชียงใหม่](https://www.mikkipastel.com/dev-mountain-tech-festival-2-chiang-mai/)
* [5 สิ่งแตกต่าง ที่ Kotlin มีแต่ Java ไม่มี](https://www.mikkipastel.com/5-difference-things-kotlin-have-but-java-not-have/)

**🏕 Activity**

* Mobile Native Meetup on 8 Nov.
* [**Dev Mountain Tech Festival 2**](https://www.youtube.com/watch?v=-3Ur6Kwg65A): This is my first time public speaking in Chiang Mai and my session is "What’s about NFT for newbie" to talk about my research about How to do my NFT collection.

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_dev_mountain_tech_festival_2.jpeg" alt="" width="563"><figcaption></figcaption></figure>

## December

**📖 Blog**

* [5 สิ่งแตกต่าง ที่ Kotlin มีแต่ Java ไม่มี](https://www.mikkipastel.com/5-difference-things-kotlin-have-but-java-not-have/)
* [เรียน "มือใหม่ทํา \[กราฟิก\] อย่างไรให้.. ปัง!" จาก BitToonDAO Learning](https://www.mikkipastel.com/how-to-do-graphic-from-newbie-bittoon-dao-learning/)
* [สรุปชีวิตปี 2022 กับการเข้าโลก web3 แบบไม่ทันตั้งตัว](https://www.mikkipastel.com/review-blog-2022/)

**📹 Video**

* [ทดลอง bridge NFT จาก REI Chain ไปยัง Polygon กัน](https://www.youtube.com/watch?v=0a8vAkrWb0I)
* [Dev lifestyle! สรุปการ coding ในรอบปี ไปกับ GitHubUnwrapped 2022](https://youtu.be/ka6mUJa9JGo)

**🏕 Activity**

* Compose Camp: I am 1 of 30 Android Developers to join this camp for learning Jetpack Compose.

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_compose_camp.jpeg" alt="" width="563"><figcaption></figcaption></figure>

* [**How to do my Bio Website**](https://www.facebook.com/digitalx21/videos/713337060075294): Facebook Live with DigitalX to teach how to do bio website with Glitch

<figure><img src="https://github.com/mikkipastel/brag-document/raw/main/2022/activity_live_bio_website.jpeg" alt="" width="563"><figcaption></figcaption></figure>


