บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Kan Ouivirach
| Machine Learning
ใช้ Pickle เซฟและโหลด ML โมเดลใน Scikit-Learn ไปใช้งานต่อ
คำถาม? เวลาที่เราสอนโมเดลเสร็จแล้ว อยากเอาโมเดลนี้ไปใช้งานต่อที่อื่น หรือเอาไป deploy ใช้บน server เพื่อใช้งานจริงๆ ต้องทำอย่างไร?คำถามนี้เจอค่อนข้างบ่อย เมื่อก่อนอาจจะยังไม่ค่อยมีคำถามนี้เพราะว่า Machine Learning ยังอยู่ฝั่ง Academia ซะเป็นส่วนใหญ่ แต่ปัจจุบันนี้ออกมาทางฝั่ง Industry เยอะมากแล้ว และแน่นอนว่าจะต้องมีการใช้งานโมเดลจริงๆ จังๆ ไม่ใช่แค่สอนโมเดล ดูผลการทดลองแล้วก็จบเนอะ 😎แน่นอนว่าเราไม่ควรไปสอนโมเดลอีกรอบบน server เพราะน่าใช้เวลานานมาก ถ้าเป็นโมเดลเล็กๆ ก็อาจจะใช้เวลา 2–3 วินาที แต่ในชีวิตจริง เราน่าจะใช้เวลาในการเทรนประมาณ 2–3 ชม. หรือ อาจจะเป็นอาทิตย์ก็เป็นได้ 😱บทความนี้จะมาสอนให้เราสามารถสอนโมเดลใน Scikit-Learn ครั้งเดียว แล้วเซฟไปใช้งานที่ไหนต่อก็ได้ครับ เรามาสร้างโมเดล K-means แบบง่ายๆ กันimport pandas as pdfrom sklearn import clusterdata = { 'data': [2, 3, 4, 10, 12, 20, 30, 11, 25]}df = pd.DataFrame(data)kmeans = cluster.KMeans(n_clusters=2)kmeans.fit(df)พอเสร็จแล้วเราจะได้ Centroid มาcentroids = kmeans.cluster_centers_print(centroids)จุด Centroid ที่ได้จาก K-meansถ้าเราอยากนำโมเดล (ตัวแปร kmeans) ไปใช้งานต่อ เราจะใช้ตัวช่วยที่ชื่อว่า Pickle ครับ วิธีใช้ก็ตามนี้import picklef = open('kmeans.pkl', 'wb')pickle.dump(kmeans, f)f.close()เราจะเปิดไฟล์มาเขียนให้เป็น Binary mode และสั่ง pickle.dump ครับ เสร็จแล้วเราก็จะได้ไฟล์ kmeans.pkl เอาไปใช้ที่ไหนก็ได้!!วิธีเอาไปใช้ก็เอาไฟล์นั้นขึ้นไปวางบน server ครับ หรือที่เราเรียกกันว่า Model Deployment นั่นแหละ ทีนี้การโหลดโมเดลขึ้นมาใช้งาน เราก็จะใช้ Pickle เช่นกัน ตามนี้ครับimport picklef = open('kmeans.pkl', 'rb')stored_kmeans = pickle.load(f)f.close()ยืนยันสักหน่อยว่าเราได้โมเดลเดียวกันprint(stored_kmeans.cluster_centers_)จุด Centroid ที่ได้จาก K-means ที่เราโหลดขึ้นมาใหม่น่าจะพอเห็นภาพกันนะครับ 😉
โดย: Pii
| Blockchain
เกมกับบล็อคเชนในอนาคต
ช่วงนี้ตลาดเหรียญคริปโตมีการตื่นตัวมากเป็นพิเศษ จากการที่มีข่าวต่างๆของโปรเจคที่ทยอยเปิดตัวสร้างความมั่นใจให้ทั้งนักลงทุน นักพัฒนาและผู้บริโภคของวงการนี้ ปัจจุบันแนวคิดและคอนเซปต่างๆเกี่ยวกับการประยุกต์ใช้บล็อคเชนค่อยๆเริ่มเป็นรูปเป็นร่างมากขึ้นจากการที่มีนักพัฒนากระโดดร่วมลงมาศึกษาและพัฒนาแอพต่างๆบนบล็อคเชนมากขึ้นเรื่อยๆ อุตสาหกรรมเกมถือว่ามีข้อได้เปรียบในการรับเอาเทคโนโลยีใหม่ๆมาประยุคต์ใช้ได้เร็วกว่าอุตสาหกรรมอื่นๆมากไม่ใช่แต่เทคโนโลยีบล็อคเชน ปัจจุบันทั่วโลก(ปี 2561)อุตสาหกรรมเกมมีมูลค่ากว่า 4 พันล้านบาท ซึ่งตัวเลขนี้มีแนวโน้มสูงขึ้นได้อีกจากการที่มูลค่าของสิ่งของต่างๆที่ใช้หรือปรากฎในเกมจะกลายเป็นทรัพย์สินขึ้นมาจริงๆด้วยบล็อคเชนบล็อคเชนจะเปลี่ยนของที่มีในเกมให้กลายเป็นทรัพย์สินจริงๆ ซึ่งหมายความว่าสิ่งของอะไรก็ตามที่เรามีในเกม ของนั้นๆจะไม่สามารถถูกทำให้หายไปได้โดยคนอื่น(ขึ้นอยู่กับเงื่อนไขรายละเอียด) เช่น ผมมีดาบสีทองที่หายากมากๆในเกม ดาบของผมจะยังคงเป็นของผม แม้ว่าจะหยุดเล่นไป 10 ปี บล็อคเชนจะทำให้คุณสมบัติของดาบเล่มนั้นมีแค่เล่มเดียวในระบบ ก๊อปปี้คัดลอกไม่ได้ GM เสกมาใหม่ไม่ได้ ถ้ามีคนอื่นได้ดาบสีทองเหมือนกัน ระบบจะถือว่าเป็นดาบคนละเล่มกัน ของแต่ละชิ้นจะสามารถมีคุณสมบัติเป็นเอกลักษณ์มีชิ้นเดียวได้ สามารถซื้อขายส่งถ่ายให้คนอื่นได้เราอาจได้เห็นแนวคิดระบบเกมที่เปลี่ยนไป เช่น เกมการ์ดอย่าง Hearthstone สามารถซื้อขายระหว่างคนเล่นได้เหมือนกับการ์ดกระดาษจริงๆ โปเกมอนที่เราเลี้ยงหรือจับมาในเกมจะสามารถนำไปใช้เล่นต่อในภาคอื่นหรือเกมอื่นที่รองรับข้อมูลประเภทเดียวกันได้ โปเกมอนที่อยู่บนบล็อคเชนจะไม่หายไปกีต้าที่ใช้ในคอนเสิร์ตบนโลกออนไลน์จะสามารถนำไปประมูลขายได้(เพราะมีชิ้นเดียว)ไอเทมต่างๆในเกมแรกนาร็อคแม้ว่าปัจจุบันจะมีการซื้อขายด้วยเงินจริงอยู่แล้วหากใช้บล็อคเชนมาประกบ ไอเทมเหล่านั้นจะยิ่งมีมูลค่าสูงยิ่งขึ้น ด้วยการที่ไอเทมเหล่านั้นไม่สามารถถูกเสกหรือปั๊มออกมาได้ แม้จะเป็นเจ้าของเกมก็ตามสิ่งของต่างๆที่เคยเป็นเพียงข้อมูลที่ไม่มีมูลค่าเนื่องจากสามารถคัดลอกได้ไม่จำกัด จะถูกจำกัดและไม่สามารถคัดลอกได้ด้วยบล็อคเชน ทุกคนสามารถเชื่อถือเงื่อนไขของระบบได้ 100% บล็อคเชนจะค่อยๆผนวกควบรวมเอาโลกแห่งความจริงกับโลกดิจิตอลเข้าเป็นอันหนึ่งอันเดียวกัน ผ่านเงื่อนไขที่โปร่งใสที่เมื่อตั้งขึ้นแล้วไม่มีใครสามารถอยู่เหนือมันได้ ทุกคนที่อยู่ในระบบจะถูกบังคับให้อยู่บนเงื่อนไขเดียวกันอย่างแท้จริง
โดย: Kan Ouivirach
| Machine Learning
ปรับ Parameters ของโมเดล ML ด้วย GridSearchCV ใน Scikit-Learn
ปกติเวลาที่เราอยากจะปรับโมเดล หรือหา Parameters ที่ดีที่สุดของโมเดลที่เหมาะสมกับข้อมูลที่เรานำมาสอน เราจะใช้วิธี Cross Validation และกำหนดว่าเราจะ Vary ค่าต่างๆ ของ Parameters ของเราอย่างไร หน้าตาโค้ดของเราก็จะประมาณนี้from sklearn import datasetsfrom sklearn.model_selection import cross_val_scorefrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetknn = KNeighborsClassifier(n_neighbors=5)scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')print(scores)แล้วถ้าเราต้องการที่จะ Vary ค่าต่างๆ เราอาจจะใช้ Loop ได้ประมาณนี้from sklearn import datasetsfrom sklearn.model_selection import cross_val_scorefrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetn_neighbors = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]weights = ['uniform', 'distance']algorithms = ['auto', 'kd_tree']score_collection = []for n in n_neighbors: for w in weights: for a in algorithms: knn = KNeighborsClassifier(n_neighbors=n, weights=w, algorithm=a) scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') score_collection.append(scores) print(score_collection)แล้วถ้าเราอยากรู้ว่าค่า Parameters ชุดไหนที่ทำให้โมเดลเราได้ผลที่ดีที่สุด เราก็อาจจะต้องเก็บ Index ของแต่ละรอบไว้ และเขียนโค้ดเพื่อหาว่ารอบไหนที่ให้ผลที่ดีที่สุดให้ผลดีที่สุด แต่ถ้าเราใช้ GridSearchCV ก็จะได้ประมาณนี้from sklearn import datasetsfrom sklearn.model_selection import GridSearchCVfrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetparam_grid = dict( n_neighbors=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], weights=['uniform', 'distance'], algorithm=['auto', 'kd_tree'])knn = KNeighborsClassifier()clf = GridSearchCV(knn, param_grid=param_grid, cv=10)clf.fit(X, y)print(clf.best_params_)โค้ดเราดูเป็นระเบียบมากขึ้นเยอะ 😎 ถ้าเราอยากจะ Vary ค่า Parameter เพิ่ม เราก็แค่เพิ่มเข้าไปใน dict นั้นพอ ไม่ต้องไปเพิ่ม Loop แบบตัวอย่างด้านบนวิธี GridSearchCV ยังมีข้อดีอีกข้อคือ เราสามารถเอาผลลัพธ์ที่ได้ไปทำนายผลต่อได้ครับclf.predict([[3, 5, 4, 2],])ชีวิตสบายขึ้นไม่รู้กี่เท่า 😚ทีนี้ถ้าข้อมูลเราเยอะมากๆ การที่จะทำให้วิธีวนลูปวิธีแรกทำงานได้เร็วขึ้น หรือเอาไปแยก Process ทำงาน ก็อาจจะต้องเหนื่อยเขียนโค้ดปรับๆ กัน ทีนี้ทีม Databricks ได้พัฒนาต่อยอด GridSearchCV ให้สามารถมารันบน Apache Spark ได้databricks/spark-sklearnScikit-learn integration package for Apache Spark. Contribute to databricks/spark-sklearn development by creating an…github.comเราแค่แก้ตรง Import!! ไม่ต้องมาแก้โค้ดตรงส่วนที่เขียน GridSearchCV เลย เด็ดมาก! 🎉 ตามนี้เลยครับ โค้ดส่วนที่แก้ไขคือส่วนที่เป็นตัวหนาfrom sklearn import datasetsfrom spark_sklearn import GridSearchCVfrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetparam_grid = dict( n_neighbors=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], weights=['uniform', 'distance'], algorithm=['auto', 'kd_tree'])knn = KNeighborsClassifier()clf = GridSearchCV(knn, param_grid=param_grid, cv=10)clf.fit(X, y)print(clf.best_params_)Happy Tuning ครับ 🎉
โดย: Pii
| Blockchain
บล็อคเชนกับการกระจายฐานข้อมูล(distributed ledgers)
เทคโนโลยีบล็อคเชนในความหมายสั้นๆก็คือการกระจายฐานข้อมูลที่เหมือนกันออกมาหลายจุด ครอบครองโดยหลายองค์กร เพื่อความโปร่ง สามารถตรวจสอบได้ง่าย(เพราะมีหลายชุดให้เทียบกัน) และมีความยืดหยุ่นสูง การประยุกต์ใช้บล็อคเชนจะทำให้เราไม่ต้องพึ่งพาและเชื่อใจให้องค์กรใดองค์กรหนึ่งดูแลรักษาข้อมูลสำคัญของเราและข้อมูลที่เกิดจากเราเหมือนแต่ก่อน เราจะสามารถเข้าถึงและควบคุมจัดการดูแลข้อมูลเหล่านี้ด้วยเราเองได้มากกว่าแต่ก่อนบล็อคเชนนั้นจริงๆแล้วมีแนวคิดมาจากฐานข้อมูลประเภทบัญชี(ledgers)ที่เราต่างรู้จักกันเป็นอย่างดี เช่น บัญชีธนาคาร บัญชีบัตรเครดิต และบัญชีรายรับรายจ่ายภาครัฐ ฐานข้อมูลบัญชีที่ถูกเก็บดูแลโดยองค์กรใดองค์กรหนึ่งเหล่านี้มีคุณสมบัติข้อดีหลายอย่าง เช่น การควบคุมคนที่จะเขียนข้อมูลเพิ่มลงในฐานข้อมูล(จำกัดสิทธิ์) ประสิทธิภาพและความเร็วในการเขียนและอ่านข้อมูล(รู้ว่าฐานข้อมูลตั้งอยู่ที่ไหน) และความสามารถในการควบคุมแก้ไขเข้าถึงข้อมูลเหล่านั้น เราเรียกการแก้ไขข้อมูลบัญชี 1 รายการว่า 1 transaction ข้อมูลในแต่ละ transaction จะต้องเขียน(insert)ให้ครบถ้วนเพื่อให้ตัวเลขทั้งหมดถูกต้อง transaction แต่ละอันจะต้องไม่ถูกแก้ไขหลังจากเขียนเสร็จไปแล้ว หรือถ้าสามารถแก้ไขได้จะต้องมีขั้นตอนตรวจสอบที่มีมาตรฐานมากเพียงพอ ปัจจุบันการกระจายฐานข้อมูลประเภทบัญชี(distributed ledgers)มีแนวโน้มเป็นที่นิยมมากขึ้นเรื่อยๆ ซึ่งฐานกระจายเหล่านี้ไม่ต้องพึ่งองค์กรใดองค์กรหนึ่งในการดูแลข้อมูลทั้งหมด องค์กรที่มีส่วนในการร่วมถือครองฐานข้อมูลเหล่านี้จะต้องตกลงเงื่อนไขในการใช้งานร่วมกัน เช่น การใช้ public/private key ในการสั่งเขียนข้อมูลเพิ่มลงในระบบ ซึ่งระบบก็จะรู้ว่าใครเป็นคนสั่งให้เขียนและคนๆนั้นมีสิทธิ์ที่จะเขียนหรือไม่ ระบบฐานกระจายนี้จะช่วยให้องค์กรที่มีส่วนร่วมสามารถเข้าถึงข้อมูลได้สะดวกรวดเร็วและประหยัดขึ้น(เทียบกับการต้องร้องขอเอาจากองค์กรอื่น) มีความน่าเชื่อถือมากขึ้น(ไม่ใช่นึกจะแก้ตัวเลขอะไรก็แก้ได้เลย) และปลอดภัยมากขึ้น(คนแฮกต้องแฮกหลายที่) อย่างไรก็ตามการอ่านข้อมูลล่าสุดจากระบบฐานกระจายดังกล่าวจะช้ากว่าฐานเดี่ยวมาก เพราะต้องคอยตรวจสอบจากฐานอื่นว่าข้อมูลตรงกันหรือไม่ และรวมไปถึงการที่ฐานแต่ละฐานจะได้รับข้อมูลล่าสุดจริงๆไม่พร้อมกันในทันที นิยามของการเป็นฐานกระจาย(distributed ledgers)อย่างแท้จริงคือการมีฐานที่แชร์ข้อมูลกันกระจายตัวอยู่ในพื้นที่ต่างๆทั่วโลก มีระบบตรวจสอบสิทธิ์คนเขียนข้อมูลตามข้อตกลงร่วม มีระบบแชร์ข้อมูลระหว่างฐานที่มีประสิทธิภาพ และมีระบบตรวจสอบความถูกต้อง(การเทียบข้อมูลระหว่างฐาน)ทางคณิตศาสตร์(cryptographic infrastructure)ที่มีประสิทธิภาพบล็อคเชนคือ ฐานกระจาย(distributed ledgers)รูปแบบหนึ่ง ที่มีการเก็บข้อมูล(data structure)แบบเฉพาะในชื่อ blockchain และใช้ข้อตกลงในการเขียนข้อมูลแบบ Prove of Work
โดย: Kan Ouivirach
| Machine Learning
มาเล่น Sentiment Analysis โดยใช้ Python กัน
How is it going? Positive, Neutral, or Negative?เกริ่นก่อน Sentiment Analysis เนี่ย มันคือกระบวนการที่เราสามารถบอกและแยกแยะอารมณ์ที่แสดงออกมาในข้อความหนึ่งๆ ซึ่งในข้อความนั้นๆ อาจจะออกมาเป็นแง่บวก (positive) แง่ลบ (negative) หรือแบบเฉยๆ (neutral) ก็ได้ปัญหาของเราคือ ถ้าเรามีข้อมูลประมาณด้านล่างนี้ เราจะเอาไปสร้างโมเดล Sentiment Analysis อย่างไร?ข้อมูล Feedback จากระบบหนึ่งเอ๊ะ ที่เราเรียนมาข้อมูลมันจะออกแนวแบ่งเป็น Column ไม่ใช่เหรอ แต่ละ Column คือ 1 Feature ไม่ใช่เหรอ แล้วถ้าเป็นข้อความแบบนี้เราจะทำอย่างไรดีนะ 🤔มีวิธี Preprocessing อยู่หลายแบบครับ แบบที่ง่ายๆ ที่เราจะมาลองกันในบทความนี้เรียกว่า Bag-of-words model ครับผม ขอเอาตัวอย่างจากใน Wiki มาอธิบายนะครับ ถ้าข้อความเราคือJohn likes to watch movies. Mary likes movies too.เราจะแปลงให้อยู่ในรูปแบบของ JSON ได้แบบนี้bag_of_words_1 = {"John": 1, "likes": 2, "to": 1, "watch": 1, "movies": 2, "Mary":1, "too": 1}สังเกตไหมว่าจริงๆ แล้วมันคือการนับคำนั่นเอง!! 😎 แล้วแต่ละ Key คือคำที่อยู่ในข้อความ และ Value คือจำนวนคำๆ นั้นในข้อความนั่นเอง ถ้ายังไม่คุ้น ลองมาดูในรูปแบบที่เราคุ้นเคยกันดีกว่าBag of Words จากข้อความ “John likes to watch movies. Mary likes movies too.”Key ใน JSON เราสามารถมองเป็นหัว Column ได้เลย ถ้ายังมึนๆ อยู่ ลองดูรูปด้านล่างนี้ครับ น่าจะช่วยให้เข้าใจมากขึ้น 👍รูป Bag of Words จาก https://slideplayer.com/slide/7073400/ทีนี้ปัญหาของเราก็จะอยู่ที่ว่าเราจะเลือกคำอะไรบ้างเอามาสร้างโมเดล ซึ่งตรงจุดนี้เป็นจุดที่ยากที่สุดครับ.. วิธีการเลือกคำนี่สามารถเป็นอีกศาสตร์หนึ่งได้เลย ศาสตร์นั้นคือ Natural language processing ครับผม ลองไปศึกษาเพิ่มเติมกันดูเนอะกลับมาที่ข้อมูลเราบ้าง เราจะใช้ตัวช่วยนับ CountVectorizer จาก Scikit-Learn ครับ ง่ายมาก! ตามนี้เลยimport pandas as pdfrom sklearn.feature_extraction.text import CountVectorizertext = [ 'Promptly answer to my request.', 'great turnaround time!', 'Fast response and great service!', 'As usual you took the request and completed in as few steps as possible and well done!', 'Very quick turnaround time and great communication. Thank you!', 'Really quick turnaround. Thanks!!', 'reduce the turn around time and increase/upgrade the interaction ability between the client and the pronto team during the building of the website.', 'Better turn around time for changes and updates. Better copywriting talents for web content rewrite requests.', 'Get back to us faster', 'Be more careful when fixing our site to not break the other coding on other pages', 'All of the information for this listing is already on the website that Pronto built. It is disappointing that this has taken so many tries to get right.', 'slow communication regarding SEO questions, emailing SEO team direct has been slower that going through my account rep- vague and incomplete answers wasting time', 'The time difference and language barrier are my main complaints. Otherwise our website looks great.', 'Process is way too slow. Working with another country seems to really slow things down alot.',]label = [ 'positive', 'positive', 'positive', 'positive', 'positive', 'positive', 'neutral', 'neutral', 'neutral', 'neutral', 'negative', 'negative', 'negative', 'negative',]df = pd.DataFrame(data={ 'text': text, 'label': label})vectorizer = CountVectorizer(stop_words='english')X_train = df.texty_train = df.labelX_train_vectorized = vectorizer.fit_transform(X_train)เพียงเท่านี้เราจะได้ข้อมูลของเราอยู่ในรูปแบบที่เราต้องการแล้ววววข้อมูลข้อความหลังจากที่ทำ Bag of Wordsถ้าเราอยากดูว่า CounterVectorizer เลือกคำอะไรมาให้เราบ้าง เราจะสั่งฟังก์ชั่น get_feature_names ตามนี้กับตัว vectorizer ของเราครับคำที่ CountVectorizer เลือกมาเท่านี้เราก็สามารถนำเข้าโมเดลของเราได้แล้วครับ จัดกันเลย~ ลอง Naive Bayes ละกัน# importfrom sklearn import naive_bayes# instantiateclf = naive_bayes.MultinomialNB()# fitclf.fit(X_train_vectorized, y_train)แล้วถ้าเราอยากจะลองทดสอบกับข้อความใหม่ เพื่อดูว่าจะเป็น Positive, Neutral หรือ Negative สิ่งที่เราต้องทำก่อนคือ เราต้องแปลงข้อความใหม่นั้นให้อยู่ใน Bag of Words แบบเดียวกับที่เราเอาเข้าไปสอนโมเดลของเราก่อนครับ ซึ่งวิธีการแปลงเราจะ “ต้อง” เอาตัว vectorizer ที่เราสร้างไว้กับข้อมูลที่ใช้สอนมาใช้ตรงนี้ครับ จุดนี้สำคัญเลย“เราแปลงข้อมูลที่เราใช้สอนด้วยวิธีไหน เราต้องแปลงข้อมูลที่เราจะใช้ทดสอบด้วยวิธีเดียวกัน”ทำได้ตามนี้ (ข้อความแรกเป็น Positive ข้อความที่ 2 เป็น Neutral ส่วนข้อความที่ 3 เป็น Negative)# positive, neutral, negativeX_test = [ 'Fast service! Thank you', 'wish it could have been resolved sooner as it was simple', 'Cannot get my website where I want because repeated requests are misunderstood, requests are simply not honored.',]X_test_vectorized = vectorizer.transform(X_test)ตัวแปร X_test_vectorized จะเป็นตัวแปรที่แปลงข้อความ 3 ข้อความนั้นให้อยู่ในรูปแบบของ Bag of Words ให้เรา ต่อจากนี้เราก็เอาไปทดสอบกับโมเดลของเราได้เลยโค้ดส่วนการสร้างโมเดล Sentiment Analysisเราเพิ่งจะสร้างโมเดลทำ Sentiment Analysis ไปเรียบร้อยแล้ว 🎉ผลที่ได้ออกมาก็ดูพอไปวัดไปวาได้ครับ แต่อย่าเพิ่งเชื่อถือมากไปนะ 😂 เราควรปรับโมเดลของเราให้ดีขึ้นเรื่อยๆ ทำให้น่าเชื่อถือมากขึ้น ข้อมูลเพิ่ม เลือกคำให้ดีขึ้น ทำ Cross Validation ทำ ฯลฯขอให้สนุกกับการทำ Sentiment Analysis ครับผม 😙
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 6)
หลังจากที่ได้ทำความรู้จักกับอีกหนึ่ง Feature ใน MQTT — LWT หรือ Last Will Testment กันไปแล้วนะคะ จะเห็นว่า LWT สามารถเข้ามาช่วยเราจัดการกับการปัญหาการเชื่อมต่อขาดๆหายๆได้อย่างไร แล้วถ้าเอามาจับคู่กับ Retained Message ก็จะยิ่งช่วยเพิ่มประสิทธิภาพให้กับ MQTT ขึ้นมาอีกเยอะเลยค่ะ และในบทความที่แล้วเราก็ยังค้างกันอยู่ที่ Keep Alive ค่ะ ว่าคืออะไร เกี่ยวข้องกับ LWT Message ยังไง วันนี้มาทำความรู้จักกันค่ะMQTT Keep Alive เป็นอีก Feature นึง ของ MQTT ค่ะ ซึ่งมีบทบาทสำคัญเลยสำหรับ Mobile Network ค่ะอย่างที่ทราบนะคะว่า MQTT ใช้การเชื่อมแต่แบบ TCP/IP ซึ่งมีความน่าเชื่อถือสูง มีการการันตีว่าการส่งข้อมูลจะถึงมือผู้รับแน่นอน ไม่มีผิดเพี้ยนแต่…..ในระหว่างการเชื่อมต่อนี้(ระหว่าง Broker และ Client) อาจจะมีฝ่ายใดฝ่ายนึงเกิดหลุด sync กันไปค่ะ (out of synchronization) อย่างเช่น ถ้าเกิดฝ่ายใดฝ่ายนึงเกิด crash ขึ้นมา ไม่สามารถทำงานได้ตามปกติค่ะ โดยที่อีกฝ่ายไม่สามารถรับรู้ได้เลยว่า อีกฝั่งนึงนั้นได้ตายไปแล้ว ก็จะยังคงส่งข้อความไปให้เรื่อยๆ และรอรับ ACK Message ซึ่งสภาวะแบบนี้ใน TCP จะเรียกว่า half-open connection ค่ะ ซึ่งถือว่าเป็นปัญหาสำคัญเลยคะดังนั้น MQTT จึงได้นำ Keep Alive เข้ามาช่วยแก้ปัญหา half-open connection ตรงนี้ค่ะ หรืออย่างน้อยก็สามารถบอกได้ว่าเกิดภาวะ half-open connection ขึ้น Keep Alive จะช่วยเชคและการันตีว่าการเชื่อมต่อระหว่าง Broker และ Client นั้นยังเปิดอยู่Client จะเป็นคนกำหนด ค่า Keep Alive ซึ่งจะกำหนดไว้ในช่วงเริ่มแรกที่ทำการขอเชื่อมต่อกับ Broker ค่านี้มีหน่วยเป็นวินาทีค่ะ (สามารถตั้งค่าได้มากสุด 18 ชั่วโม 12 นาที 15 วินาที หรือ 65535 วินาที ค่ะ) ซึ่งการที่ Client เป็นคนกำหนด Keep Alive เองจะช่วยให้ Client สามารถปรับค่า Keep Alive ให้ตรงกับความแรงของสัญญาณเนทเวิคของตัวเองได้หลังจากทำการเชื่อมต่อ ในระหว่างนี้หาก Client ไม่ทำการส่ง Control Message ใดๆ เช่น PUBLISH, PINGREQ, หรือ DISCONNECT ให้กับ Broker ​ไม่เกินระยะเวลาที่กำหนดใน Keep Alive ตัว Broker จะยังไม่ถือว่า Client ได้ตัดขาดการเชื่อมต่อไป ยังถือว่าการเชื่อมต่อกับ Client นี้ยังเปิดอยู่ แต่ Client จะต้องส่ง PINGREQ ไปให้ Broker นะค่ะ (ไม่ใช่หายไปเลยนะ) ซึ่ง Client จะส่ง PINGREQ เมื่อไหร่ก็ได้ค่ะ ซึ่ง Broker เองก็ต้องตอบกลับด้วย PINGRESP นะคะ เพื่อที่จะให้ Client มั่นใจว่า ​Broker เองก็อยังอยู่ดีค่ะ ยังมีการเชื่อมต่อกับ Client อยู่แต่สำหรับ Broker หากว่าไม่มี Message หรือว่า PINGREQ จาก Client ส่งมาภายใน 1.5 * Keep Alive Period แล้วละก็ Broker จะทำการ Disconnect ไปเลยค่ะ และจะส่ง LWT Message ให้ค่ะ(ถ้า Client ได้กำหนด LWT ไว้นะคะ)โดยปกติแล้วใน MQTT ถ้า Broker เจอว่ามี half-open connection ค้างอยู่ Broker จะจัดการด้วยสิ่งที่เรียกว่า Client Take-over ค่ะ นั่นคือ Broker จะทำการ Disconnect การเชื่อมต่อก่อนหน้านี้กับ Cleint ตัวนี้ หลังจากนั้นก็จะทำการเชื่อมต่อให้ Client ตัวนี้ใหม่ค่ะ เพื่อให้มั่นใจว่าปัญหา half-open connection นี้จะไม่เป็นอุปสรรคต่อ Client ที่ถูก Disconnect ไป แล้วต้องการอยากจะกลับมา Connect ใหม่ค่ะอ้างอิงจาก MQTT Essentials Part 10: Keep Alive and Client Take-Over
โดย: Kan Ouivirach
| Machine Learning
Visualize โมเดล Tree ใน Scikit-Learn
เวลาที่เราสร้างโมเดลประเภท Tree อย่างเช่น Decision Tree จะมีข้อดีอย่างหนึ่งคือโมเดลพวกนี้สามารถนำมาวาดรูปให้คนอ่านรู้เรื่องได้ (จริงๆ โมเดลอื่นก็วาดรูปได้นะ แต่ไม่ user friendly เท่ากับโมเดลประเภท Tree) ถ้าเราใช้ Scikit-Learn แล้วเราอยากจะดูว่าโมเดลเราหน้าตาเป็นแบบไหน เราจะทำอย่างไร?เริ่มด้วยการสร้างโมเดลแบบ Tree สักโมเดลหนึ่งมาก่อน ขอเป็น Decision Tree ละกันเนอะ เขียนโค้ดได้ตามนี้เลยfrom sklearn import tree, datasetsfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_splitiris = datasets.load_iris()X, y = iris.data, iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)clf = tree.DecisionTreeClassifier()clf.fit(X_train, y_train)y_pred = clf.predict(X_test)print(accuracy_score(y_test, y_pred))ทีนี้ใน Module ที่ชื่อ tree ที่เรา import มาตอนแรกจะมีฟังก์ชั่นชื่อ export_graphviz ครับ เราจะใช้ฟังก์ชั่นนี้แหละสร้าง Graph ออกมา โดยฟังก์ชั่นนี้ใช้ Graphviz ครับ ซึ่งใช้ไฟล์ DOT language ในการอธิบายหน้าตาของ Graphให้เราเขียนโค้ดเพิ่มเพื่อเรียกใช้ export_graphviz ตามนี้tree.export_graphviz(clf,out_file=’tree.dot’,feature_names=iris.feature_names,class_names=iris.target_names,filled=True,rounded=True)เราจะใส่โมเดลที่เราสอน (clf) เข้าไป ตั้งชื่อ output file ว่า tree.dot ในไฟล์นั้นจะมีชื่อ feature (feature_names=iris.feature_names) มีชื่อ class (class_names=iris.target_names) แต่ละโหนดจะมีสี (filled=True) แล้วก็แต่ละโหนดจะเป็นสี่เหลี่ยมมนๆ (rounded=True)หลังจากรันโค้ดด้านบนเสร็จเราก็จะได้ไฟล์ tree.dot ออกมา หน้าตาเนื้อหาในไฟล์ก็จะประมาณนี้รูปแสดงข้อมูลในไฟล์ tree.dotอ่านไม่ค่อยรู้เรื่องเนอะ >_< เรามาทำให้เป็นรูปกันดีกว่า ให้เราติดตั้ง Graphviz ก่อนครับ ถ้าเป็นเครื่อง Mac ก็สั่งbrew install graphvizแต่ถ้าใช้เครื่องแบบอื่นลองตามไปดูวิธีที่หน้า Download ได้เลยครับผม พอติดตั้งเสร็จ เราสามารถแปลงเป็นไฟล์ PNG โดยใช้คำสั่งdot -Tpng tree.dot -o tree.pngเปิดรูปมาดูควรจะเห็นตามรูปด้านล่างนี้เลยครับรูปโมเดล Decision Tree กับข้อมูล Irisทีนี้ใครที่ทำโมเดลประเภทนี้ก็สามารถเอารูปนี้ไปช่วยเรื่อง communication ได้แล้ว~ เด็ด!ถ้าใครอยากเห็นโค้ดเต็มๆ สามารถดูได้ที่ intro-to-machine-learning/tree.ipynb ครับ ;)
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 5)
มาต่อกันกับอีก Feature นึง ของ MQTT ค่ะ ซึ่งก็คือ Last Will and Testament ค่ะเนื่องจาก MQTT มักจะถูกนิยมนำมาใช้ในเคสที่ Network ไม่มีความเสถียรสักเท่าไหร่ อย่างเช่น สัญญาณไม่แรงและแกว่งเป็นต้นค่ะ ในเคสที่สัญญาณไม่เสถียรแบบนี้ การเชื่อมต่อระหว่าง Broker และ Client ต้องมีปัญหาแน่นอนค่ะ บางครั้งการเชื่อมต่อก็อาจจะขาดหายไปดื้อๆแบบไม่ตั้งใจ ซึ่งอาจจะเกิดจากปัญหาที่ตัวสัญญาณเอง หรือ แบตเตอรีหมด และเป็นไปได้อีกหลายสาเหตุค่ะ การขาดหายของสัญญาณแบบนี้จะเรียกว่า Ungracefully Disconnect ค่ะ ไม่มีการแจ้งเตือนมาก่อนว่าจะ Disconnect ค่ะ เพราะปกติแล้ว ใน MQTT การจะ Disconnect (แบบมีมารยาท และ ตั้งใจที่จะตัดการเชื่อมต่อ) จะต้องมีการส่ง MQTT Disconnect Message ค่ะ เรียกอีกอย่างก็ Gracefully Disconnect ค่ะ ดังนั้น Broker จึงจำเป็นต้องทราบค่ะ ว่าการขาดหายของการเชื่อมต่อระหว่าง Broker และ Cleint นั้นเป็นการ Disconnect แบบไหน ตั้งใจ (Gracefully) หรือ ไม่ตั้งใจ (Ungracefully) เพื่อที่ Broker จะได้จัดการกับสถานการณ์ได้อย่างถูกต้องค่ะหากมีการเชื่อมต่อของ Client ตัวใดตัวนึงขาดหายไปแบบ Ungracefully ตัว Broker จะใช้ Last Will and Testament (LWT) แจ้งไปยัง Client อื่นๆที่เหลือ เพื่อบอกกล่าวว่า Client ตัวนี้ได้ Offline ไปแล้วค่ะClient แต่ละตัว สามารถฝาก Last Will Message ให้กับ Broker ได้ ในระหว่างที่เริ่มทำการ Connect กับ Broker ซึ่งตัว Last Will Message นี้ก็คือ MQTT Message ธรรมดาทั่วไปนี่แหละค่ะ ข้างในก็จะมี Topic, Retained Message Flag, QoS, และ Payload อย่างเช่นในรูป Fig 1 ข้างล่างค่ะFig 1. MQTT Connect MessageBroker จะรับฝาก Last Will Message ไว้จนกว่าจะมีการ Disconnect จาก Client นั้นๆค่ะ ซึ่งถ้าการ Disconnect เป็นแบบ Ungracefully ตัว Broker ก็จะทำการส่ง Last Will Message นี้ให้กับ Client ที่เหลือที่ได้ทำการ Subscribe ตรงกับ Topic ที่ระบุไว้ใน Last Will Message ค่ะ แล้วเคสไหนที่ Broker ถือว่าเปนการ Ungracefully Disconnect ลองมาดูกันค่ะ ว่ามีเคสไหนบ้างเมื่อ Broker เจอว่ามี Error เกิดขึ้นของ I/O หรือ Network เมื่อไม่มี Message ใดๆ จาก Client ส่งมาในช่วงเวลาที่กำหนด หรือ Keep Alive Period (Keep Alive คืออะไร? ในบทความถัดไป มาทำความรู้จักกันค่ะ….)เมื่อพบว่า Client ไม่มีการส่ง Disconnect Message มาให้ก่อนที่จะมีการปิดการเชื่อมต่อไปเมื่อ Broker เองเป็นคนตัดการปิดการเชื่อมต่อเนื่องจาก Error ของ MQTT Protocol เองแต่ถ้าหากมีการส่ง MQTT Disconnect Message — Gracefully Disconnect (Fig 2) ตัว Broker ก็จะลบ Last Will Message ที่เก็บไว้ให้ทิ้งค่ะFig 2. MQTT Disconnect Messageจะเห็นว่า LWT มีความบทบาทสำคัญในการแจ้งเตือน Client ตัวอื่นๆ โดยเฉพาะ Client ที่ได้ทำการ Subscribe ไว้กับ Client ตัวที่ได้ขาดการติดต่อไปแบบ Ungracefully DisconnectLWT มักจะถูกนำมาใช้คู่กับ Retained Message เพื่อทำการเก็บ State ล่าสุด(ของ Topic ใด Topic นึง) ของ Client ไว้ ถึงตรงนี้อาจจะยังนึกไม่ออกนะคะ ว่าจะเอา LWT และ Retained Message มาใช้เก็บ State ล่าสุดยังไง ลองมาดูตัวอย่างค่ะ…..Client1 เริ่มทำการเชื่อมต่อกับ Broker ด้วยการส่ง Connect Message ให้ Broker และ ใน Connect Message นี้ก็ระบุ payload ของ lastWillMessageไว้ว่า ‘Offline’ และ มีการเซท lastwillRetain ให้เป็น true และ มี lastWillTopic เป็น ‘client1/status’ (เลื่อนขึ้นไปดู ตัวอย่าง Connect Message ได้นะค่ะ — Fig 1)หลังจากทำการเชื่อมต่อเรียบร้อย Client ก็สามารถเริ่ม Publish ข้อความที่มี Payload ว่า ‘Online’ และ retaionFlag เซทเป็น true ไปที่ Topic ที่ตั้งไว้ตอนทำการเชื่อมต่อค่ะ (client1/status) ซึ่งในระหว่างนี้หากไม่มีการ Disconnect เกิดขึ้น Client ที่ได้ทำการเข้ามา Subscribe ใหม่ที่ Topic นี้ (client1/status) จะได้รับ Retained Message ที่มี Payload ว่า ‘Online’แต่หากว่าการเชื่อมต่อ ระหว่าง Client1 และ Broker มีการ Ungracefully Disconnect เกิดขึ้น Broker จะทำการ Publish LWT Message (ซึ่งมี Payload ว่า ‘Offline’) แทน Retained Message เดิม (ซึ่งมี Payload ว่า ‘Online’) นั่นหมายความว่าถ้ามี Client เข้ามา Subscribe หลังจากที่ Client1 ขาดการติดต่อไป จะได้รับ Message ที่มี Payload ว่า Offline ถึงตรงนี้แล้วพอจะนึกภาพออกแล้วใช่มั้ยคะ ว่าคู่บัดดี้ LWT Message และ Retained Message เข้ามาช่วยจัดการเกี่ยวกับ State ล่าสุดของ Topic ได้ยังไงในบทความถัดไป เราจะพูดถึงเรื่อง Keep Alive ค่ะ ซึ่งนี่ก็เป็น Feature เด่นอีกอย่างนึงของ MQTT ที่จะช่วยให้ Broker รู้ถึงสถานะของ Client ได้ค่ะ ว่า Online อยู่ หรือ Offline ไปแล้วอ้างอิงจาก MQTT Essentials Part 9: Last Will and Testament
โดย: Kan Ouivirach
| Machine Learning
มารู้จัก Mean Shift Clustering กัน
บทความก่อนหน้านี้เราพูดถึงวิธี Clustering กันไปแล้ววิธีหนึ่งคือ K-Means บทความนี้เรามารู้จักวิธี Clustering อีกวิธีหนึ่งที่ชื่อว่า Mean shift กันครับข้อแตกต่างระหว่าง Mean Shift กับ K-Meansที่เห็นได้ชัดๆ คือMean shift เป็น density-based clustering ส่วน k-means เป็น centroid-based clustering กล่าวคือ Mean shift จะใช้คอนเซปของ kernel density estimation (KDE) ในการหาตัวแทนกลุ่มของข้อมูล หรือ centroid ในขณะที่ k-means จะใช้ค่าเฉลี่ยระหว่างจุดกับ centroid ในการขยับ centroid ไปเรื่อยๆMean shift ไม่จำเป็นต้องรู้จำนวนกลุ่มของข้อมูลก่อน ส่วน k-means จำเป็นที่ต้องรู้ก่อน แต่ Mean shift ก็มีค่า parameter ที่เราต้องปรับเองตามการใช้งานครับ เค้าเรียกกันว่า kernel bandwidthหลักการทำงานของ Mean Shiftให้จุดทุกจุดเป็น cluster ของตัวมันเองก่อนเลย ถ้ามี 10 จุดข้อมูล ก็แปลว่าเรามี 10 clusters ก่อนเลยครับให้เราเลือก kernel ที่เหมาะสมกับข้อมูล ซึ่งโดยปกติแล้วจะเป็นฟังก์ชั่น Gaussian ครับ ตามสูตรของ Gaussian แล้ว เราจะได้ว่า kernel bandwidth ของเราคือ standard deviation นั่นเอง :Dคัดลอกจุดทุกจุดเก็บไว้ก่อนเป็น 2 ชุดข้อมูล แล้วนำจุดทุกจุดในชุดข้อมูลใดข้อมูลหนึ่ง ผมเรียกว่าเป็นข้อมูลชุดที่ 1 กับข้อมูลชุดที่ 2 ละกัน แล้วทำไมต้องแยกเป็น 2 ชุด? นี่เป็นเหตุผลทางด้านการเขียนโปรแกรมล้วนๆ ครับ :Pเสร็จแล้วเราจะมา estimate กับจุดทุกจุดในข้อมูลชุดที่ 2 โดยใช้ kernel ที่เราเลือกมากับจุดทุกจุดในข้อมูลชุดที่ 1 ครับ หรือพูดง่ายๆ ว่าเราใช้จุดทุกจุดในการอัพเดท cluster แต่ละ cluster ครับ ซึ่งจุดแต่ละจุดในข้อมูลชุดที่ 2 จะถูก estimate แล้วจะค่อยๆ เลื่อนเข้าสู่จุด convergence หรือจุดสูงสุดของ Gaussian (นึกภาพระฆังคว่ำ) แล้วเราอัพเดท cluster อย่างไรล่ะ? ขอยกไปอธิบายคร่าวๆ ต่อด้านล่างหลังจากที่ converge แล้ว ถ้าข้อมูลของเรามีการกระจายตัวหน้าตาแบบมี 3 ระฆังคว่ำ (หรือ 3 clusters) จุดข้อมูลของเราก็จะย้ายไปสู่จุดสูงสุดของ 3 ระฆังคว่ำนั้นโดยอัตโนมัติเองครับท้ายที่สุดคือการ assign จุดเหล่านั้นว่าควรจะอยู่ cluster ไหน ยังจำข้อมูลที่เราคัดลอกไว้ในข้อ 3 ได้ใช่ไหมครับ? เราก็เอาจุดเหล่านั้นมาทีละจุด เทียบระยะห่างระหว่างจุดสูงสุดของระฆังคว่ำที่เราได้มา จุดไหนใกล้ก็ assign จุดนั้นให้เข้าไปกับระฆังอันนั้นครับเป็นอันเสร็จสิ้น!สำหรับการ shift หรืออัพเดทค่า mean (เป็นเหตุผลที่เค้าเรียกว่า mean shift) ทำได้โดยใช้เทคนิค gradient ascent ครับ ซึ่งจริงๆ คือ gradient descent แต่แค่มีทิศตรงข้าม ลองดูสมการในรูป 1 ด้านล่างนี้ครับ เป็นรูปจากงานวิจัยของ Dorin Comaniciu กับ Peter Meerรูปพจน์ของ Mean Shiftสมการที่ 17 นี้เป็นพจน์ของ mean shift ครับ ซึ่งเราสามารถนำเอาส่วนที่ผมตีกรอบเส้นประสีแดงมาเป็นค่า mean ที่โดน shift แล้ว ส่วนฟังก์ชั่น g ในทีนี้ก็คือ kernel ของเรานั่นเอง ซึ่งในงานวิจัยนี้เค้าพิสูจน์ว่ามันเพียงพอสำหรับการ converge ลองตามไปอ่านกันดูนะครับ math เยอะสะใจดี >_<การเลือกค่า kernel bandwidth นั้นมีผลต่อจำนวน cluster ที่เราจะได้ ถ้าเราใช้ค่า bandwidth ที่ต่ำมากๆ เราอาจจะได้จำนวน cluster เท่ากับจำนวนจุดเลยก็ได้ แต่ถ้าเราเลือกค่าที่สูงเกินไป เราอาจจะได้แค่ 1 cluster ดังนั้นค่านี้ควรจะปรับให้เหมาะสมเองครับโดยการทดลองหรืออะไรก็แล้วแต่
โดย: Pii
| Blockchain
อนาคตอีเธอเรียมจากปากนายวิทาลิค
เมื่อไม่นานมานี้ผมมีโอกาสนั่งย่อยความเห็นเกี่ยวกับทิศทางและความเป็นไปได้ของอีเธอเรียมจากมุมมองของนายวิทาลิค บูเทอริน(Vitalik Buterin) ซึ่งเป็น 1 ในผู้ร่วมก่อตั้งบล็อคเชนอีเธอเรียมขึ้นมา สัมภาษณ์ในวันที่ 20 มีนาคม พ.ศ. 2562 ประเด็นต่างๆค่อนข้างน่าสนใจมากสำหรับคนที่ติดตามเทคโนโลยีและวงการบล็อคเชนอยู่ในขณะนี้ครับคำถาม: อีเธอเรียมกำลังถูกเหรียญสกุลอื่นๆไล่ตามขึ้นมาจริงหรือไม่?เขายอมรับตามตรงว่าปัจจุบันมีเหรียญหลายตัวที่น่าสนใจและดูมีศักยภาพ การพัฒนาอีเธอเรียมเองไม่สามารถจะเร่งรัดได้ตามต้องการทีเดียว โปรเจคต่างๆบนอีเธอเรียมยังมีไม่มากพอ การพัฒนาโปรเจคเหล่านี้จะดีขึ้นเรื่อยๆเมื่อมีตัวอย่างโปรเจคที่สำเร็จมากขึ้น เพื่อที่นักพัฒนาจะได้สามารถเรียนรู้วิธีการจากตัวอย่างเหล่านี้ ถ้าหากวันนึงอีเธอเรียมถูกแทนที่ด้วยบล็อคเชนอื่น เช่น Zcash หรือ Ethereum Classic วิทาลิคบอกว่าเป็นธรรมดาที่เทคโนโลยีจะต้องถูกเปลี่ยนไปตามความต้องการของผู้ใช้ แต่ว่าถ้าวันนั้นบล็อคเชนที่ขึ้นมาแทนอีเธอเรียมคือ Tron เขาคงจะหมดศรัทธาในวงการนี้เลยทีเดียวคำถาม: มีข่าวว่านักพัฒนาอีเธอเรียมได้ค่าแรงน้อยเกินไปจริงหรือไม่? เขาให้ความเห็นสั้นๆว่าองค์กรพัฒนาอีเธอเรียมยังควบคุมทุกอย่างได้อย่างไม่มีปัญหาอะไร และถ้าสมมุติว่าไม่มีใครบ่นเรื่องค่าจ้างเลยสักคนเดียว แสดงว่าองค์กรจ่ายค่าแรงให้มากเกินไปคำถาม: มูลค่าของเหรียญอีเธอเรียมมีผลกระทบใดต่อองค์กร หรือเหล่านักพัฒนาบ้างหรือไม่? เขาตอบตรงๆว่าในวงการนี้มีหลายโปรเจคที่ปั่นราคาขึ้นลงไปมามากมายในช่วงที่ผ่านมา ซึ่งสำหรับโปรเจคที่ตั้งใจพัฒนาเทคโนโลยีเพื่อตอบโจทย์คนใช้จริงๆ อย่างอีเธอเรียมนั้นไม่มีผลกระทบมากเท่าโปรเจคปั่น แต่สุดท้ายแล้วถ้ามูลค่ามันสูงโปรเจคต่างๆก็จะดำเนินไปได้ราบรื่นกว่าคำถาม: คิดยังไงกับพวกฟองสบู่โปรเจค ICO บนอีเธอเรียมทั้งหลายที่ผ่านมา? วิทาลิคบอกว่ายังไงโปรเจคพวกนี้ก็ต้องมีคนทำอยู่ดี ต่อให้ไม่ใช่บนอีเธอเรียม เขาเซ็งกับพวกประเภทที่มาขอถ่ายเซลฟี่กับเขา แล้วก็เอารูปเขาไปใช้ในฐานะ advisor ของโปรเจคเหล่านั้นมากกว่า คำถาม: การระดมทุนโปรเจคด้วยระบบอีเธอเรียมถือว่าผิดกฎหมายหรือไม่?เขาตอบว่าองค์กรอีเธอเรียมมีทีมนักกฎหมายพร้อมอยู่แล้ว ไม่จำเป็นต้องกังวนในเรื่องนี้คำถาม: มีความเห็นเรื่องการทำลายธุรกิจผูกขาดด้วยบล็อคเชนว่าอย่างไร? เขาเล่าสั้นๆว่าบล็อคเชนจะทำให้บริษัทขนาดเล็กหลายบริษัทสามารถทำงานร่วมกันเพื่อโค่นบริษัทที่ผูกขาดขนาดใหญ่ได้ โดยที่บริษัทขนาดเล็กเหล่านั้นก็ไม่ได้มีสถานะเป็นบริษัทผูกขาดแต่อย่างใดสุดท้ายวิทาลิคให้ความเห็นว่าอีเธอเรียมต่างจากบิทคอยน์ที่มีคนวางกฎ กำหนดทิศทางที่เทคโนโลยีควรจะเป็น ควรดำเนินเดินไป บิทคอยน์เป็นเหมือนทฤษฎีหรืองานวิจัยดิบที่เมื่อพิสูจน์ได้ว่าทำได้ก็ปล่อยมันออกมาทั้งแบบนั้นเลย ทำให้มีปัญหาในเรื่องมุมมองและความเห็นต่างของนักพัฒนา

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้