Case Study: ระบบประเมินผลออนไลน์ด้วย Google Sheets แบบแก้ไขได้เฉพาะส่วนของตนเอง แต่มองเห็นของคนอื่นได้ด้วย

โจทย์มีอยู่ว่า ต้องการระบบประเมินผล Online ให้อาจารย์จากหลาย ๆ มหาวิทยาลัย จำนวน 5 ท่าน ประเมินผลการทำงาน ในมุมมองต่าง ๆ แยกตาม Sheet และ ในแต่ละมุมมอง อาจารย์แต่ละท่าน สามารถเลือกตัวเลือกจาก Dropdown ในคอลัมน์ของตนเองในแต่ละหัวข้อย่อย แต่ในขณะเดียวกัน สามารถมองเห็นได้ด้วยว่า อาจารย์ท่านอื่นให้คะแนนหัวข้อย่อยนั้นว่าอย่างไร แต่จะไม่สามารถแก้ไขของท่านอื่น หรือ แก้ไขส่วนอื่น ๆ ได้ มีระบบสรุปคะแนนอัตโนมัติ เริ่มกันเลย ลองคลิกไปดูตัวอย่างได้ที่นี่ สร้าง Google Sheets โดยมีทั้งหมด 5 Sheets แต่ละ Sheet มีคอลัมน์แรก เป็นรายการที่จะประเมิน คอลัมน์ B – F เป็นส่วนที่ผู้ประเมินแต่ละท่านใช้ในการประเมิน ชีตที่ 1 -3 เป็น มุมมองในการประเมิน ชีตที่ 4 เป็น Rubric Score หรือ ค่าที่จะใช้ทำ Dropdown ด้วย V Lookup ชีตที่ 5 เป็น Summary เอาไว้แสดงภาพรวมการประเมิน (ใช้ในภายหลัง) สร้าง Dropdown ไปที่ ชีต “มุมมองที่ 1” ที่เซล B7 (หัวข้อประเมินแรก ของผู้ประเมินคนแรก) แล้ว “คลิกขวา” เลือก Data Validation … จากนั้น ในบรรทัด On invalid data เลือก Reject inputในบรรทัด Criteria คลิกที่ช่องด้านหลัง แล้วไปคลิก ชีต “RubricScore” และเลือกส่วนที่จะมาแสดงใน Dropdown นั่นคือ “Not Met”, “Partially Met” และ “Met” แล้วคลิกปุ่ม OK จากนั้น กลับมาคลิกปุ่ม Save จากนั้น ก็ Copy เซล B7 ไปยังทุก ๆ ส่วนที่จะทำการประเมิน เพิ่มผู้ประเมินเป็น Editor คลิกปุ่ม Share แล้วกรอก Email Address ซึ่งเป็น Google Account ของผู้ประเมินทั้ง 5 คนลงไป ให้เป็น Editor จากนั้นคลิกปุ่ม Send ในขั้นตอนนี้ ทุกคนที่เป็น Editor สามารถเข้ามาแก้ไข ทุกส่วน ของ Google Sheets นี้ได้ ซึ่งไม่ใช่สิ่งที่ต้องการ ต่อไป จะเป็นการกำหนด ส่วนที่ แต่ละคนจะสามารถแก้ไขได้ กำหนดส่วนที่ผู้ประเมินแก้ไขได้ คิดเหมือนกับ การเจาะช่อง ให้เฉพาะส่วนที่กำหนดนี้ ให้มีการแก้ไขได้ คลิกเมนู Tools > Protect sheetแล้วคลิก Except certain cellsในที่นี้คือ B:F แล้วเลือก Editor ทุกคน ให้สามารถ แก้ไขได้จากนั้นคลิกปุ่ม Done ตอนนี้ ทั้ง 5 คนจะสามารถแก้ไขสิ่งที่อยู่ในคอลัมน์ B-F ได้ แต่ยังมีปัญหาคือ อ.สมชาย สามารถแก้ไขข้อมูลในคอลัมน์ของ อ.สมหญิง ได้อยู่ กำหนดให้ผู้ประเมินแก้ไขได้เฉพาะคอลัมน์ของตนเอง ต่อไป กำหนดให้ อ.สมศรี แก้ไขได้เฉพาะคอลัมน์ C ซึ่งเป็นของตนเองเท่านั้นเลือก คอลัมน์ Cคลิกเมนู Data > Protected sheets and ranges …คลิกปุ่ม Set Permissions จากนั้น

Read More »

django – as a Dialogflow Webhook #03

บทความนี้ จะกล่าวถึง การใช้ django ทำหน้าที่เป็น Webhook จาก Dialogflow ผ่าน Fulfillment ทาง HTTP Post Request ด้วย JSON object และ ทำการประมวลผล แล้วตอบกลับไปเป็น JSON Object เช่นกัน เพื่อให้ Dialogflow ตอบสนองต่อผู้ใช้ได้ตามต้องการ เช่น อาจจะให้ไปค้นข้อมูลจากฐานข้อมูลในองค์กรมาตอบ เป็นต้น ในมุมของ django django (ดี)จังโก้ ดีอย่างไร #01 ได้กล่าวถึงการสร้าง Web Application จาก Model โดยกำหนด Fields ต่าง ๆ จากนั้น django ก็จะสร้าง Web Form ต่าง ๆ ให้อัตโนมัติ และยังสามารถสร้าง Users ของระบบ พร้อมทั้ง กำหนดสิทธิ์การเข้าถึงของแต่ละคนได้อีกด้วย แล้วนำไปผูกกับส่วน Admin เพื่อให้ผู้ใช้ทำการ Authentication ก่อนเข้าจัดการกับข้อมูลต่างได้ และในบทความ django – Deploy to Production #02 ได้แนะนำวิธีการ Deploy ระบบที่สร้างขึ้นสู่ Production ตามลำดับ ในบทความนี้ จะใช้ “view” ซึ่งเป็นอีกส่วนของ django ตามขั้นตอนต่อไปนี้ ใน myproject สร้าง App ใหม่ ชื่อ fulfillment เพิ่ม ‘fulfillment’ app ลงใน myproject/settings.py ที่ INSTALLED_APPS( ในตัวอย่างก่อนหน้า เราเพิ่ม worklog app ไว้แล้ว)  INSTALLED_APPS = [ ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘django.contrib.staticfiles’, ‘worklog’, ‘fulfillment’ ] จากนั้น แก้ไขไฟล์ myproject/fulfillment/views.py ตามนี้ from django.http import HttpRequest, HttpResponse from django.views.decorators.csrf import csrf_exempt import json # Create your views here. @csrf_exempt def sayHi(request): j = json.loads(request.body) x = { “fulfillmentText”: “This is a text response” } return HttpResponse(json.dumps(x)) ในส่วนนี้ จะ import packages ต่อไปนี้ HttpRequest เพื่อรับ Input ผ่าน HTTP HttpResponse เพื่อตอบ Output ผ่าน HTTP csrf_exempt เพื่อบอกว่า ยอมให้ทำงานผ่าน HTTP POST โดยไม่ต้องมี CSRF Token (ถ้าไม่ใส่ อยู่ ๆ จะส่ง POST เข้ามาไม่ได้ ) json เพื่อจัดการ JSON object จากนั้น สร้าง Function ชื่อ “sayHi” มี function ที่เรียกใช้งานดังนี้ json.loads(request.body) ทำหน้าที่แปลง JSON Object จาก HTTP Request เข้ามาอยู่ในรูป Python Object ในที่นี้ จะนำข้อมูลจาก Dialogflow

Read More »

วิธีการทำ Group ซ้อน Group ให้สามารถส่งผ่านได้ไปถึงสมาชิกระดับล่างสุด ใน Google Groups

มีคำถามมาว่า ใช้ Google Groups เช่น all-staffs ซึ่ง มี สมาชิกในนี้เป็น Google Groups ด้วย ชื่อ faculty01, faculty02, faculty03 แล้ว ภายใต้ faculty01 มี department01, department02 ซึ่ง department01 นั้น จะประกอบด้วย email ของสมาชิก โดยทุก Group ตั้งค่าไว้ว่า ให้เฉพาะ Owner และ Manager เท่านั้นที่มีสิทธิ์ส่ง แล้ว … จะทำอย่างไร ให้เมื่อมีคน (ที่ได้รับอนุญาตให้ส่ง) สมมุติชื่อ somchai.jaidee@gmail.com ส่งเข้า all-staffs@groups.google.com แล้ว ผู้รับ ซึ่งอยู่ใน department01 สามารถรับ email ได้ ??? วิธีการคือ ให้เพิ่ม email address ของ Group ที่เป็น Parent ลงไปใน Child Group เช่น ในที่นี้ เพิ่ม all-staffs@groups.google.com ลงไปเป็นสมาชิกของ faculty01 Group แล้วตั้งค่าให้ Email Delivery เป็น No email และ Posting Permission เป็น Override : member is allowed to post และ ทำเช่นนี้กับ faculty02, faculty03 … ส่วน department01, department02 ก็ให้เอา faculty02@groups.google.com ไปเป็นสมาชิก และตั้งค่าแบบนี้เช่นกัน  

Read More »

From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful

จาก Kaggle – วิธีการใช้ Logistic Regression บนข้อมูล Iris เราได้ Model มาแล้ว แต่ จะนำสู่ Production ได้อย่างไร ? ใน Python มี Object Serialization ทำให้สามารถเก็บ Object ที่สร้างขึ้น ไปไว้ในไฟล์ ซึ่ง มีให้ใช้หลายตัว ได้แก่ pickle cpickle joblib มีคนทำการทดสอบความเร็ว พบว่า cpickle เร็วสุด (https://stackoverflow.com/questions/12615525/what-are-the-different-use-cases-of-joblib-versus-pickle) แต่ในที่นี้ จะใช้ joblib เพราะน่าจะเหมาะกับงานที่ต้องมีการ Load Data ขนาดใหญ่ ใช้งานร่วมกันหลาย Process (เท่าที่เข้าใจครับ) การสร้างไฟล์ .pkl บน kaggle ดังนี้ เพิ่มคำสั่งต่อไปนี้ แล้ว กดปุ่ม commit and run ด้านบนขวา from sklearn.externals import joblib joblib.dump(model, ‘myiris.pkl’) กดปุ่ม รูป << ด้าน ซ้ายบน เพื่อกลับไป หน้า Kernel ของเรา คลิกที่ Output จะเห็นไฟล์ ที่เพิ่งสร้าง ให้คลิก Download ไปเก็บไว้ใน Folder ที่จะใช้งาน Productioin ต่อไป จะเป็นขั้นตอนการติดตั้ง และการใช้ Flask ซึ่งเป็น Python Microframework  และ ใช้ Flask RESTful เพื่อสร้าง REST API ใช้คำสั่งต่อไปนี้ ติดตั้ง flask และ flask-resetful pip install flask flask-restful จากนั้น เข้าไปใน folder ที่เราวางไฟล์ myiris.pkl ไว้ แล้ว สร้างไฟล์ iris.py มี Code ดังนี้ from flask import Flask, request from flask_restful import Resource, Api, reqparse from sklearn.externals import joblib import pandas as pd #from sklearn.linear_model import LogisticRegression app = Flask(__name__) api = Api(app) # Model model = joblib.load(‘myiris.pkl’) class Iris(Resource): def get(self): return { “greeting”:”Hello From IRIS Dataset”} def post(self): parser = reqparse.RequestParser() parser.add_argument(‘sl’) parser.add_argument(‘sw’) parser.add_argument(‘pl’) parser.add_argument(‘pw’) args = parser.parse_args() x = pd.DataFrame([[ args[‘sl’],args[‘sw’], args[‘pl’],args[‘pw’] ]] ,\ columns=[‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’]) result = model.predict(x) return {“result”: result[0]}, 201 api.add_resource(Iris, “/iris”) app.run(debug=True) จากนั้น ไปที่ Command Prompt พิมพ์คำสั่งต่อไปนี้ เพื่อเรียก Flask

Read More »

สร้าง Hadoop และ Spark Cluster เพื่องานด้าน Data Science ด้วย Google Cloud Dataproc + Datalab

จาก Ambari #01: ติดตั้ง Ambari Server , Ambari #02 ติดตั้ง Ambari Agent , Ambari #04 การสร้าง Hadoop ด้วย Ambari บน AWS และ GCP #01 วิธีการสร้าง Virtual Machine บน Google Cloud Platform จะเห็นได้ว่า ก็ยังมีความยุ่งยากอยู่ อีกทั้ง หากต้องการใช้ PySpark ก็ต้องตามติดตั้ง Python Packages ต้องปรับค่ามากมาย และหากต้องการขยายระบบ ก็มีงานต้องทำอีกเยอะ ในบทความนี้ จะแนะนำอีกวิธีหนึ่ง คือ การใช้งาน Google Cloud Dataproc ซึ่งจะทำให้เราได้ใช้ Hadoop + Spark Cluster ซึ่งได้รับการทดสอบเป็นอย่างดี อีกทั้งยังสามารถเลือกใช้ Spark รุ่นต่างๆได้อย่างง่ายได้ ทำให้สามารถโฟกัสไปยัง Data และ กระบวนทำ Machine Learning ได้เต็มที่ ไปที่ Google Cloud Console เพื่อเลือก Project ที่จะทำงานด้วย และเปิดช้งาน Cloud Dataproc และ Compute Engine APIs และ ในที่นี้ จะมี project-id คือ kx-dataproc-01 (สามารถสร้างในชื่อที่ต้องการเองได้) https://console.cloud.google.com/ เปิดใช้งาน Google Cloud Dataproc https://console.cloud.google.com/dataproc/ เปิด GCLOUD COMMAND ในที่นี้ จะสร้าง Cluster ชื่อ mycluster ใน project-id ชื่อ kx-dataproc-01 แล้วให้ copy คำสั่งต่อไปนี้ลงไปใน gcloud command แล้วกดปุ่ม Enter gcloud dataproc clusters create mycluster –project kx-dataproc-01 –initialization-actions gs://dataproc-initialization-actions/datalab/datalab.sh ใช้เวลาประมาณ 5 นาที ก็จะได้ Hadoop + Spark Cluster ที่มี 1 Master และ 2 Workers ซึ่ง Master จะชื่อว่า mycluster-m และ Workers จะชื่อ mycluster-w-0 และ mycluster-w-1 ต่อไป ทำ SSH Tunnel จาก Master คือ mycluster-m Port 8080 ออกมา โดยพิมพ์คำสั่งต่อไปนี้ gcloud compute ssh mycluster-m –project kx-dataproc-01 –zone=asia-southeast1-a — -4 -N -L 8080:mycluster-m:8080 โดย –project ไว้สำหรับระบุชื่อ project-id –zone ไว้ระบุ Zone ที่ Cluster อยู่ — ไว้เป็นตัวคั่น (separator) ว่าหลังจากนี้เป็นคำสั่งของ ssh -4 บอกว่า ติดต่อด้วย IPv4 -N บอกว่า ไม่ต้องเปิด Shell ของเครื่อง Master -L บอกว่า จะ Forward Port 8080 ไปยังเครื่อง mycluster-m ที่ port 8080 จากนั้น เปิด Web Preview

Read More »