<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TypeNaN</title>
    <description>The latest articles on DEV Community by TypeNaN (@typenan).</description>
    <link>https://dev.to/typenan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F859123%2Fae293bd6-130c-43f3-ae70-71c9f61b31dd.jpeg</url>
      <title>DEV Community: TypeNaN</title>
      <link>https://dev.to/typenan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/typenan"/>
    <language>en</language>
    <item>
      <title>01-Go Install</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Mon, 10 Oct 2022 14:09:21 +0000</pubDate>
      <link>https://dev.to/typenan/01-go-install-50bm</link>
      <guid>https://dev.to/typenan/01-go-install-50bm</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go download.&lt;br&gt;
ในที่นี้จะอ้างอิงการติดตั้ง Go ในเวอร์ชั่น 1.19.2 โดยทำการดาวน์โหลดไฟล์จากผู้พัฒนาตามลิงค์ต่อไปนี้&lt;br&gt;
&lt;a href="https://go.dev/dl/go1.19.2.linux-amd64.tar.gz"&gt;Go for Linux&lt;/a&gt;&lt;br&gt;
หากต้องการอ่านรายละเอียดเพิ่มเติมจากเว็บไซต์ผู้พัฒนาสามารถเข้าไปอ่านได้ที่นี่เลย &lt;a href="https://go.dev"&gt;https://go.dev&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go install.&lt;br&gt;
2.1 ลบ Go ที่ติดตั้งไว้ก่อนหน้าออก&lt;br&gt;
หากไม่แน่ใจว่าเคยติดตั้งมาก่อนแล้วไม่หรือสามารถตรวจสอบมี directory  "/usr/local/go" นี้อยู่หรือไม่เนื่องจากการติดตั้ง Go ทับของเดิมที่มีอยู่แล้วจะทำให้ Go พังและการติดตั้งไม่สำเร็จ เพื่อความมั่นใจว่าการติดตั้งจะสำเร็จควรลบ Go ที่ติดตั้งอยู่ออกไปก่อนโดยใช้คำสั่งดังนี้&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm -rf /usr/local/go &amp;amp;&amp;amp; sudo tar -C /usr/local -xzf go1.19.2.linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.2 กำหนด PATH ใน Go&lt;br&gt;
กำหนด PATH /usr/local/go/bin เข้าไปในตัวแปรระบบโดยการก็อปปี้ คำสั่งข้างล่างนี้ไปวางไว้ในไฟล์ $HOME/.bashrc หรือ $HOME/.profile หรือ /etc/profile เพียงที่ใดที่หนึ่งเท่านั้น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH=$PATH:/usr/local/go/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หากคุณนำไปวางไว้ในไฟล์ $HOME/.bashrc คุณสามารถใช้คำสั่ง source $HOME/.bashrc แล้วทดสอบ Go ได้ทันที หากยังไม่ได้อาจต้อง reboot หรือ login เข้าระบบใหม่อีกครั้งก่อนถึงจะใช้งาน Go ได้&lt;/p&gt;

&lt;p&gt;2.3 ยืนยันการติดตั้งสำเร็จ&lt;br&gt;
คุณสามารถตรวจสอบว่าสามารถใช้งาน Go ได้หรือยังด้วยการใช้คำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลลัพธ์จากการใช้คำสั่ง go version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go version go1.19 linux/amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Go to code.
&lt;/h2&gt;

&lt;p&gt;ได้เวลาเขียน Go กันแล้ว :)&lt;/p&gt;

</description>
      <category>go</category>
      <category>install</category>
    </item>
    <item>
      <title>00-Go สารบัญ</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Fri, 07 Oct 2022 14:27:26 +0000</pubDate>
      <link>https://dev.to/typenan/01-go-install-8n3</link>
      <guid>https://dev.to/typenan/01-go-install-8n3</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/typenan/01-go-install-50bm"&gt;01-Go install&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
    </item>
    <item>
      <title>User Registration and Login Template using Golang, MongoDB and JWT</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Fri, 12 Aug 2022 16:31:53 +0000</pubDate>
      <link>https://dev.to/typenan/user-registration-and-login-template-using-golang-mongodb-and-jwt-5d3p</link>
      <guid>https://dev.to/typenan/user-registration-and-login-template-using-golang-mongodb-and-jwt-5d3p</guid>
      <description>&lt;p&gt;การลงทะเบียนและเข้าสู่ระบบเป็นส่วนสำคัญของเว็บแอปพลิเคชัน ที่นี่ฉันได้สร้างรหัสเทมเพลตการลงทะเบียนและเข้าสู่ระบบใน Golang สำหรับการจัดเก็บข้อมูล ฉันใช้ฐานข้อมูล MongoDB NoSQL สำหรับการกำหนดเส้นทางใน Golang ฉันใช้เราเตอร์ gorilla mux และการเรียก API เพิ่มเติมหลังจากเข้าสู่ระบบจะปลอดภัยด้วย JWT&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type User struct{
    FirstName string `json:"firstname" bson:"firstname"` 
    LastName string `json:"lastname" bson:"lastname"` 
    Email string `json:"email" bson:"email"` 
    Password string `json:"password" bson:"password"`
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;นี่คือโครงสร้างผู้ใช้ที่เรียบง่ายซึ่งประกอบด้วยชื่อ นามสกุล อีเมล และรหัสผ่าน ทั้งหมดอยู่ในประเภทข้อมูลสตริง 'json' ใช้สำหรับการแยกวิเคราะห์ข้อมูลสำหรับเซิร์ฟเวอร์ถึงไคลเอนต์และในทางกลับกัน และ 'bson' ใช้สำหรับจัดเก็บข้อมูลใน MongoDB&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func userSignup(response http.ResponseWriter, request *http.Request{                       
    response.Header().Set("Content-Type","application/json")             
    var user User json.NewDecoder(request.Body).Decode(&amp;amp;user)  
    user.Password = getHash([]byte(user.Password)) 
    collection := client.Database("GODB").Collection("user") 
    ctx,_ := context.WithTimeout(context.Background(),      
             10*time.Second) 
    result,err := collection.InsertOne(ctx,user)
    if err!=nil{     
        response.WriteHeader(http.StatusInternalServerError)    
        response.Write([]byte(`{"message":"`+err.Error()+`"}`))    
        return
    }    
    json.NewEncoder(response).Encode(result)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ด้านบนฟังก์ชัน userSignup กำลังทำส่วนการลงทะเบียนผู้ใช้ ข้อมูล json ของเนื้อหาการตอบสนองที่มาจากเบราว์เซอร์ไคลเอ็นต์จะถูกถอดรหัสในโครงสร้างผู้ใช้ รหัสผ่านจะถูกแฮชก่อนจัดเก็บไว้ในฐานข้อมูลโดยมีข้อมูลโค้ดด้านล่าง สำหรับการมีรหัสผ่าน ฉันใช้ bcrypt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func getHash(pwd []byte) string {        
    hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)          
    if err != nil {
       log.Println(err)
    }
    return string(hash)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นข้อมูลจะถูกเก็บไว้ในฐานข้อมูล MongoDB ด้วยฟังก์ชัน InsertOne ข้อมูลถูกเก็บไว้ในฐานข้อมูล 'GODB' ในคอลเล็กชัน 'ผู้ใช้' ฐานข้อมูลและชื่อคอลเลกชันสามารถให้บริการได้จากไฟล์การกำหนดค่า จากนั้นผลลัพธ์ (Insert data Object Id) จะถูกเข้ารหัสลงใน json และเซิร์ฟเวอร์ตอบสนองเป็นสัญญาณของการลงทะเบียนที่สำเร็จ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func userLogin(response http.ResponseWriter, request *http.Request){   
    response.Header().Set("Content-Type","application/json")  
    var user User 
    var dbUser User  
    json.NewDecoder(request.Body).Decode(&amp;amp;user)  
    collection:= client.Database("GODB").Collection("user")  
    ctx,_ :=context.WithTimeout(context.Background(),10*time.Second)        err:=collection.FindOne(ctx,bson.M{"email":user.Email}).Decode(&amp;amp;dbUser)
    if err!=nil{      
       response.WriteHeader(http.StatusInternalServerError)     
       response.Write([]byte(`{"message":"`+err.Error()+`"}`))    
       return
    }
    userPass:= []byte(user.Password)
    dbPass:= []byte(dbUser.Password)
    passErr:= bcrypt.CompareHashAndPassword(dbPass, userPass)
    if passErr != nil{
       log.Println(passErr)    
       response.Write([]byte(`{"response":"Wrong Password!"}`))    
       return
    }
    jwtToken, err := GenerateJWT()
    if err != nil{   
    response.WriteHeader(http.StatusInternalServerError)  
    response.Write([]byte(`{"message":"`+err.Error()+`"}`))
    return
    }
    response.Write([]byte(`{"token":"`+jwtToken+`"}`))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในฟังก์ชัน userLogin ด้านบน ขั้นแรกฉันได้ถอดรหัสข้อมูลผู้ใช้ (อีเมลและรหัสผ่าน) ที่มาจากไคลเอนต์ไปยังโครงสร้างผู้ใช้ จากนั้นฉันได้ผ่านฐานข้อมูลเพื่อตัดสินใจว่าผู้ใช้ปัจจุบันมีอยู่ในฐานข้อมูลหรือไม่ทางอีเมล หากอีเมลตรงกับข้อมูลใด ๆ ฉันจะเปรียบเทียบผู้ใช้ที่ให้รหัสผ่านและรหัสผ่านที่จัดเก็บไว้ในฐานข้อมูล หากรหัสผ่านตรงกัน โทเค็น jwt จะถูกส่งตอบกลับเพื่อเป็นสัญญาณของการเข้าสู่ระบบที่สำเร็จ&lt;/p&gt;

&lt;p&gt;นี่คือรหัสเต็ม:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "context"
    "time"
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "encoding/json"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
    "golang.org/x/crypto/bcrypt"
    "github.com/dgrijalva/jwt-go"
)


var SECRET_KEY = []byte("gosecretkey")

type User struct{
    FirstName string `json:"firstname" bson:"firstname"`
    LastName string `json:"lastname" bson:"lastname"`
    Email string `json:"email" bson:"email"`
    Password string `json:"password" bson:"password"`
}

var client *mongo.Client

func getHash(pwd []byte) string {
    hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)
    if err != nil {
        log.Println(err)
    }
    return string(hash)
}

func GenerateJWT()(string,error){
    token:= jwt.New(jwt.SigningMethodHS256)
    tokenString, err :=  token.SignedString(SECRET_KEY)
    if err !=nil{
        log.Println("Error in JWT token generation")
        return "",err
    }
    return tokenString, nil
}

func userSignup(response http.ResponseWriter, request *http.Request){
    response.Header().Set("Content-Type","application/json")
    var user User
    json.NewDecoder(request.Body).Decode(&amp;amp;user)
    user.Password = getHash([]byte(user.Password))
    collection := client.Database("GODB").Collection("user")
    ctx,_ := context.WithTimeout(context.Background(), 10*time.Second)
    result,_ := collection.InsertOne(ctx,user)
    json.NewEncoder(response).Encode(result)
}


func userLogin(response http.ResponseWriter, request *http.Request){
  response.Header().Set("Content-Type","application/json")
  var user User
  var dbUser User
  json.NewDecoder(request.Body).Decode(&amp;amp;user)
  collection:= client.Database("GODB").Collection("user")
  ctx,_ := context.WithTimeout(context.Background(),10*time.Second)
  err:= collection.FindOne(ctx, bson.M{"email":user.Email}).Decode(&amp;amp;dbUser)

  if err!=nil{
      response.WriteHeader(http.StatusInternalServerError)
      response.Write([]byte(`{"message":"`+err.Error()+`"}`))
      return
  }
  userPass:= []byte(user.Password)
  dbPass:= []byte(dbUser.Password)

  passErr:= bcrypt.CompareHashAndPassword(dbPass, userPass)

  if passErr != nil{
      log.Println(passErr)
      response.Write([]byte(`{"response":"Wrong Password!"}`))
      return
  }
  jwtToken, err := GenerateJWT()
  if err != nil{
    response.WriteHeader(http.StatusInternalServerError)
    response.Write([]byte(`{"message":"`+err.Error()+`"}`))
    return
  }
  response.Write([]byte(`{"token":"`+jwtToken+`"}`))

}


func main(){
    log.Println("Starting the application")

    router:= mux.NewRouter()
    ctx,_ := context.WithTimeout(context.Background(), 10*time.Second)
    client,_= mongo.Connect(ctx,options.Client().ApplyURI("mongodb://localhost:27017"))

    router.HandleFunc("/api/user/login",userLogin).Methods("POST")
    router.HandleFunc("/api/user/signup",userSignup).Methods("POST")

    log.Fatal(http.ListenAndServe(":8080", router))

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;original post :&lt;br&gt;
&lt;a href="https://medium.com/@pkbhowmick007/user-registration-and-login-template-using-golang-mongodb-and-jwt-d85f09f1295e"&gt;https://medium.com/@pkbhowmick007/user-registration-and-login-template-using-golang-mongodb-and-jwt-d85f09f1295e&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>jwt</category>
      <category>mongodb</category>
    </item>
    <item>
      <title>Unlimited Bash History</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Mon, 01 Aug 2022 10:16:00 +0000</pubDate>
      <link>https://dev.to/typenan/unlimited-bash-history-4mdd</link>
      <guid>https://dev.to/typenan/unlimited-bash-history-4mdd</guid>
      <description>&lt;p&gt;edit file .bashrc&lt;br&gt;
Set HISTSIZE and HISTFILESIZE to an empty string:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
HISTSIZE=&lt;br&gt;
HISTFILESIZE=&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
In &lt;strong&gt;bash 4.3 and later&lt;/strong&gt; you can also use HISTSIZE=-1 HISTFILESIZE=-1:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;n.  Setting HISTSIZE to a value less than zero causes the history list to be&lt;br&gt;
    unlimited (setting it 0 zero disables the history list).&lt;br&gt;
o.  Setting HISTFILESIZE to a value less than zero causes the history file size&lt;br&gt;
    to be unlimited (setting it to 0 causes the history file to be truncated&lt;br&gt;
    to zero size).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;bash --version&lt;/strong&gt; to check your bash version.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change the file location because certain bash sessions truncate .bash_history file upon close.&lt;br&gt;
&lt;a href="http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login"&gt;http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login&lt;/a&gt;&lt;br&gt;
Force prompt to write history after every command.&lt;br&gt;
&lt;a href="http://superuser.com/questions/20900/bash-history-loss"&gt;http://superuser.com/questions/20900/bash-history-loss&lt;/a&gt;&lt;br&gt;
Use timestamp HISTTIMEFORMAT="[%F %T] "&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
HISTSIZE=-1&lt;br&gt;
HISTFILESIZE=-1:&lt;br&gt;
HISTFILE=~/.bash_eternal_history&lt;br&gt;
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
    </item>
    <item>
      <title>Code EP.2 : Duino coin monitor ทำไมไม่ได้ไปต่อ</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Fri, 29 Jul 2022 08:23:00 +0000</pubDate>
      <link>https://dev.to/typenan/code-ep2-duino-coin-monitor-thamaimaimaidaipt-3li3</link>
      <guid>https://dev.to/typenan/code-ep2-duino-coin-monitor-thamaimaimaidaipt-3li3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sFBck3PJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x1vsoyi07d0pk6mm560v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sFBck3PJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x1vsoyi07d0pk6mm560v.jpg" alt="Image description" width="880" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;หลังจากที่เราทำการ verify account แล้ว&lt;br&gt;
เราก็ได้ใส่ Feature เพิ่มเติมให้กับ Rig ของเราให้ดูดีขึ้น&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NLovv_xuYZk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;นอกจากนี้ยังหาสมาชิกเพิ่มเติมเข้ามาด้วย&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TiYnGxVpPVE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;หลังจากนั้น 3 วัน เราก็ได้รับข่าวที่ทำให้เราร้อง อิหยังวะ ข้อความในอีเมลแจ้งบอกว่าเราถูก Ban&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qdpfH1YY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nk6xlj54hfep1fa0ps0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qdpfH1YY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nk6xlj54hfep1fa0ps0.jpg" alt="Image description" width="516" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ด้วยเหตุนี้ Project นี้จึงล้มไปโดยปริยาย&lt;br&gt;
จนถึงตอนนี้ก็ยังไม่ทราบเหตุผลว่าอะไรเป็นสาเหตุให้เราถูกแบน&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/E1E4CK70J"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FKanlt08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ko-fi.com/img/githubbutton_sm.svg" width="223" height="30"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.buymeacoffee.com/TypeNaN"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Zp9Bwwu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.buymeacoffee.com/button-api/%3Ftext%3DBuy%2520me%2520a%2520coffee%26emoji%3D%26slug%3DTypeNaN%26button_colour%3DFFDD00%26font_colour%3D000000%26font_family%3DCookie%26outline_colour%3D000000%26coffee_colour%3Dffffff" width="235" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Code EP.1 : Duino coin monitor</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Sun, 08 May 2022 14:54:00 +0000</pubDate>
      <link>https://dev.to/typenan/code-ep1-duino-coin-monitor-cni</link>
      <guid>https://dev.to/typenan/code-ep1-duino-coin-monitor-cni</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;TH&lt;/td&gt;
&lt;td&gt;
เริ่มต้นโครงการเมื่อวานยังคงงุ่นง่านงุนงงอยู่กับการออกแบบโครงสร้างว่าจะเอายังไงดี ตอนนี้ลองเอาแบบทำเป็น module ดูซึ่งก็ยังไม่รู้ว่ามันจะดีมั๊ยนะ เป็นสัดส่วนแยกเอกเทศกันดีเหมือนจะง่ายในระยะยาว (รึเปล่า) แต่สำหรับตอนนี้สับสนหน้าดูเลย
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EN&lt;/td&gt;
&lt;td&gt;
The project started yesterday I'm still confused about how to design the structure. Now let's do it as a module. But I still don't know if it's good or not. It's a split ratio that seems easy in the long run (or not), but for now, it's confusing.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DVJsa3v4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9tn27d0gj84tgw3gv6jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DVJsa3v4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9tn27d0gj84tgw3gv6jp.png" alt="Code" width="880" height="923"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/E1E4CK70J"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FKanlt08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ko-fi.com/img/githubbutton_sm.svg" width="223" height="30"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.buymeacoffee.com/TypeNaN"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Zp9Bwwu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://img.buymeacoffee.com/button-api/%3Ftext%3DBuy%2520me%2520a%2520coffee%26emoji%3D%26slug%3DTypeNaN%26button_colour%3DFFDD00%26font_colour%3D000000%26font_family%3DCookie%26outline_colour%3D000000%26coffee_colour%3Dffffff" width="235" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Start a new project</title>
      <dc:creator>TypeNaN</dc:creator>
      <pubDate>Sat, 07 May 2022 15:31:18 +0000</pubDate>
      <link>https://dev.to/typenan/start-a-new-project-15pf</link>
      <guid>https://dev.to/typenan/start-a-new-project-15pf</guid>
      <description>&lt;p&gt;A new project for monitoring the Duino Coin mining account is underway.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
