Skip to content

Commit

Permalink
Add Thai translation for Lesson 1
Browse files Browse the repository at this point in the history
  • Loading branch information
mollymoll13 committed Jan 29, 2018
1 parent 895766d commit 0fa712c
Show file tree
Hide file tree
Showing 21 changed files with 1,419 additions and 1 deletion.
4 changes: 3 additions & 1 deletion index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import en from './en'
import zh from './zh'
import pt from './pt'
import jp from './jp'
import th from './th'

export default {
en, // English (source for all translations)
zh,
pt,
jp
jp,
th
}
7 changes: 7 additions & 0 deletions th/1/00-overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: มาสร้างโรงงานซอมบี้กัน
header: Welcome, human!
roadmap: roadmap.jpg
---
ในบทเรียนนี้จะสอนเกี่ยวกับการสร้างเกมบน Ethereum โดยแพลตฟอร์มนี้ถูกออกแบบขึ้นสำหรับผู้ใช้ Solidity มือใหม่ แต่อย่างไรก็ตามผู้ใช้จะต้องมีประสบการณ์ด้านการเขียนโปรแกรมอื่นๆ มาแล้วด้วยบ้าง (e.g. Javascript)

75 changes: 75 additions & 0 deletions th/1/arrays.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
title: Arrays
actions: ['checkAnswer', 'hints']
material:
editor:
language: sol
startingCode: |
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
// start here
}
answer: >
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
}
---

เมื่อคุณต้องการชุดข้อมูลของอะไรบางอย่าง คุณสามารถใช้ **_array_** มาช่วยในการจัดการได้ ซึ่งใน Solidity นั้นเราจะมี arrays อยู่2 ชนิด ได้แก่: **_fixed_** arrays และ **_dynamic_** arrays:

```
// fixed Array จำกัดความยาวให้มีแค่2 elements :
uint[2] fixedArray;
// หรือจะเป็น fixed Array ที่สามารถมีข้อมูลชนิด Strings ได้ 5 ตัวก็จะเขียนได้ว่า:
string[5] stringArray ;
// Dynamic Array – จะไม่จำกัดขนาดที่แน่นอน ซึ่งแปลว่า array ชนิดนี้สามารถมีขนาดเพิ่มได้เรื่อยๆ :
unit[] dynamicArray;
```

เราสามารถที่จะสร้าง array ของ **_structs_** โดยใช้ `Person`‘ struct ที่อยู่ในบทก่อนหน้าได้เลย

```
Person[]people; // แปลว่าเป็น dynamic Array ซึ่งเราสามารถเพิ่มค่าลงไปใน array ได้เรื่อยๆ
```

จำได้ไหมว่าตัวแปรที่บอกสถานะ จะต้องถูกบรรจุถาวรอยู่ใน blockchain ดังนั้นการสร้างdynamic array ของ structs ในรูปแบบนี้จะมีประโยชน์มากสำหรับการบรรจุข้อมูลต่างๆ ในสัญญา (contract) ของคุณ สามารถเทียบได้ว่าเป็นฐานข้อมูลอย่างหนึ่งก็ว่าได้

## Public Arrays

เราสามารถประกาศ array ให้มีค่าเป็น `public` และ Solidity ก็จะสร้าง **_getter_** method ขึ้นมาโดยอัตโนมัติสำหรับ array นี้ โดยหน้าตาของ syntax จะเป็นดังต่อไปนี้:

```
Person[]public people;
```

ทำให้ contract อื่นๆ จะสามารถอ่านค่าได้ (แต่ไม่สามารถเขียนได้) ลงใน array นี้ ดังนั้นpattern นี้จึงเหมาะสำหรับการบรรจุข้อมูลที่เป็นสาธารณะหรือว่า public ใน contract ของคุณ

# ลองมาทดสอบดู

ตอนนี้เรากำลังต้องการที่จะบรรจุค่าของกองกำลังซอมบี้ ลงในแอพพลิเคชั่นของเรา และต้องการที่จะให้จำนวนของซอมบี้ทั้งหมดนั้น ไปปรากฏอยู่ในแอพพลิเคชั่นอื่นๆ เช่นกัน ซึ่งนั่นก็แปลว่าเราต้องการให้กองกำลังของซอมบี้นั้นมีค่าเป็นสาธารณะ(public)

1. สร้าง public array ของ `Zombie` **_structs_** แล้วตั้งชื่อว่า `zombies`
94 changes: 94 additions & 0 deletions th/1/arraysstructs2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
title: ทำงานกับ Structs และ Arrays
actions: ['checkAnswer', 'hints']
material:
editor:
language: sol
startingCode: |
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function createZombie(string _name, uint _dna) {
// เริ่มที่ตรงนี้
}
}
คำตอบ: >
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function createZombie(string _name, uint _dna) {
zombies.push(Zombie(_name, _dna));
}
}
---
### การสร้าง Structs ใหม่
ังจำ struct ของเราที่ชื่อว่า `Person`
ในตัวอย่างก่อนหน้าได้มั้ย?

```
struct Person {
uint age;
string name;
}
Person[] public people;
```

ตอนนี้เราก็จะมาศึกษาว่าจะสามารถสร้าง `Person` ขึ้นมาใหม่ได้อย่างไร และจะเพิ่มลงไปใน array ที่ชื่อว่า `people` ได้อย่างไร

```
// สร้างPersonขึ้นมาใหม่:
Person satoshi = Person(172, "Satoshi");
// เพิ่ม element Person ที่เราสร้างขึ้นนั้นลงไปใน Array:
people.push(satoshi);
```

โดยเราสามาถนำมารวมกันให้เป็นคำสั่งภายในบรรทัดเดียว เพื่อความเรียบร้อยของโค้ดได้อีกด้วย:

```
people.push(Person(16, "Vitalik"));
```

สังเกตได้ว่า `array.push()` จะเป็นคำสั่งที่เพิ่มข้อมูลลงในส่วน **ท้าย** ของ array ดังนั้นก็จะทำให้ข้อมูลที่อยู่ใน array นั้นก็จะถูกเรียงตามลำดับที่เราเพิ่มเข้าไป ดูได้จากตัวอย่างดังต่อไปนี้

```
uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// ซึ่งจะทำให้ numbersในตอนนี้มีค่า [5, 10, 15]
```

# มาลองทดสอบ

เริ่มจากการให้ ฟังก์ชั่น createZombie ของเราทำอะไรบางอย่างดู!

1. เติม function ในส่วนของ body โดยทำให้มันสร้าง new `Zombie` ใหม่ขึ้นมา จากนั้นก็ให้เพิ่มลงไปยัง array ที่ชื่อว่า `zombies` โดย `name` และ `dna` ที่เป็นข้อมูลของ new ‘Zombie’ นั้นควรถูกนำมาจาก function arguments
2. ทำโค้ดให้อยู่ในบรรทัดเดียวเพื่อความเรียบร้อย
56 changes: 56 additions & 0 deletions th/1/contracts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
title: "Contracts"
actions: ['checkAnswer', 'hints']
material:
editor:
language: sol
startingCode: |
pragma solidity //1. ระบุเวอร์ชั่นของ Solidity ตรงนี้
//2. สร้างContract ตรงนี้
คำตอบ: >
pragma solidity ^0.4.19;
contract ZombieFactory {
}
---

เริ่มต้นด้วยขั้นตอนที่ง่ายๆ ก่อน:

โค้ดของ Solidity นั้นจะอยู่ในส่วนของ **contracts** โดย `contract` นั้นจะเรียกว่าเป็นบล็อคโครงสร้างพื้นฐานในแอพพลิเคชั่น Ethereum ซึ่งมีตัวแปรและฟังชั่นต่างๆ ขึ้นอยู่กับ contract ทั้งสิ้น สิ่งนี้จะเป็นจุดเริ่มต้นโปรเจคทั้งหมดทั้งมวลของคุณนั่นเอง

contract ว่างๆ ซึ่งเราใช้ชื่อว่า `HelloWorld` ก็จะมีหน้าตาดังนี้:

```
contract HelloWorld {
}
```

## Version Pragma

ในทุกๆ โค้ดต้นฉบับของ Solidity จะต้องเริ่มต้นด้วยคำว่า “version pragma” หมายถึงการประกาศเวอร์ชั่นคอมไพล์เลอร์หรือตัวแปลภาษาของ Solidity ที่โค้ดนี้ควรใช้ ทั้งนี้ก็เพื่อป้องกันปัญหาที่โค้ดของคุณจะถูกทำลายเมื่อคอมไพล์เลอร์ในอนาคตนั้นมีการปรับเปลี่ยนไป โดยหน้าตาของขั้นตอนดังกล่าวเป็นดังนี้ :

`pragma solidity ^0.4.19;` (สำหรับ Solidity เวอร์ชั่นล่าสุดขณะทำการเขียนโค้ดนี้ ซึ่งก็คือเวอร์ชั่น 0.4.19)

หากนำมาวางร่วมกันกับ contract เราก็จะได้โครงสร้างเริ่มต้นว่างๆ ที่คุณจะต้องเขียนเป็นสิ่งแรกในทุกๆครั้งเมื่อสร้างโปรเจคใหม่ขึ้น:

```
pragma solidity ^0.4.19;
contract HelloWorld {
}
```

# ทดสอบ

ในการที่จะสร้างกองทัพซอมบี้ เรามาลองสร้างฐานของ contract โดยใช้ชื่อว่า `ZombieFactory`

1. ในกล่องด้านขวาให้ระบุตามขั้นตอนที่ได้กล่าวมา เพื่อให้เวอร์ชั่นของ Solidity ที่เราจะใช้คือเวอร์ชั่น `0.40.19`

2. สร้าง contract เปล่าขึ้นมาแล้วใช้ชื่อว่า `ZombieFactory`

เมื่อทำสำเร็จแล้ว ให้คลิกที่ “check answer” ด้านล่าง หรือหากขัดข้องส่วนไหนให้คลิกคำสั่ง “hint”
50 changes: 50 additions & 0 deletions th/1/datatypes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
title: State Variables & Integers
actions: ['checkAnswer', 'hints']
material:
editor:
language: sol
startingCode: |
pragma solidity ^0.4.19;
contract ZombieFactory {
//start here
}
answer: >
pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;
}
---

ยอดเยี่ยม! ตอนนี้เราก็จะได้ส่วน shell ของ contractแล้ว ต่อจากนี้เราก็จะมาเรียนรู้กันว่า Solidity จะจัดการกับตัวแปรต่างๆ ได้อย่างไรบ้าง

**_State variables_** จะถูกจัดเก็บถาวรลงในส่วนจัดเก็บของ contract ซึ่งนั่นก็หมายความว่ามันก็จะถูกเขียนลงในบล็อคเชนของ Ethereum เช่นกัน

##### ตัวอย่าง:
```
contract Example {
// ในส่วนนี้จะถูกจัดเก็บถาวรลงในบล็อคเชน
uint myUnsignedInteger = 100;
}
```

ในตัวอย่างของ contract เราจะสร้าง `uint` โดยใช้ชื่อว่า `myUnsignedInteger` และตั้งให้มีค่าเท่ากับ 100

## Unsigned Integers: `uint`

ข้อมูลชนิด `uint` หรือ unsigned integer มีความหมายว่า**ค่าของมันจะต้องไม่ติดลบ** ซึ่งนอกจากนี้ก็ยังมีข้อมูลชนิด int สำหรับ signed integers เช่นกัน

> โน้ต: ใน Solidity นั้น `uint` จริงๆ แล้วก็คือนามแฝงสำหรับ `uint256` หรือ 256-bit unsigned integer นั่นเอง คุณสามารถประกาศข้อมูล uints เป็นจำนวนบิทที่น้อยกว่าได้ เช่น `uint8`, `uint16`, `uint32` เป็นต้น แต่โดยปกติแล้วก็จะใช้แค่ `uint` เท่านั้น เว้นเพียงแต่ในบางกรณีซึ่งเราจะกล่าวในบทต่อๆ ไป
# ทดสอบ

Zombie DNA ของเรานั้นจะถูกกำหนดโดยตัวเลขจำนวน 16 ตัว

ประกาศข้อมูลชนิด `uint` โดยใช้ชื่อว่า `dnaDigits` และตั้งให้มีค่าเท่ากับ `16`
Loading

0 comments on commit 0fa712c

Please sign in to comment.