เนื่องจากเว็บไซต์สถาบันการศึกษา ตกเป็นเป้าหมายในการโจมตี ตามรายงาน สกมช. ที่
https://www.ncsa.or.th/service-statistics.html
โดยเว็บไชต์จำนวนหนึ่งในมหาวิทยาลัยได้เคยถูกโจมตีแล้ว และกำลังจะถูกโจมตีได้อีกมากด้วยยังคงมีช่องโหว่ที่ยังไม่ได้รับการแก้ไข
ผู้บริหารเทคโนโลยีสารสนเทศระดับสูง ประจำมหาวิทยาลัยสงขลานครินทร์ จึงได้ออกหนังสือเวียนแจ้งทุกส่วนงานในมหาวิทยาลัย
[มอ 011/67-ว011]แนวปฏิบัติในการจัดทำเว็บไซต์มหาวิทยาลัยสงขลานครินทร์ (23 เม.ย. 67)
https://docs.psu.ac.th/view/2b962109-f1d8-451e-a361-ca7ee053c9a2/
เอกสารแนบ แนวปฏิบัติในการจัดทำเว็บไซต์มหาวิทยาลัยสงขลานครินทร์
https://net.psu.ac.th/local/internet/Guidelines_for_PSU_Website_2024_v1.pdf
เพื่อให้ได้ใช้แนวทางการตรวจสอบช่องโหว่เว็บไซต์ได้ด้วยตนเอง และผู้ดูแลเว็บไซต์ได้เร่งปรับปรุงให้ได้มาตรฐานและมีความปลอดภัย
เว็บไชต์ในมหาวิทยาลัยที่ได้ถูกโจมตีมักจะเป็นการวางหน้าโฆษณาและมีลิงก์ไปสู่เว็บไชต์พนันออนไลน์
ด้วยพฤติกรรมของแฮคเกอร์เมื่อโจมตีเว็บไซต์สำเร็จ ต้องการให้หน้าเว็บไซต์ของส่วนงานในมหาวิทยาลัยที่มีลิงก์พนันออนไลน์ โฆษณาไปให้ถึงผู้ใช้เว็บไซต์ได้จำนวนมากๆ
โดยใช้เครื่องมือของ Google Search
ทีมงาน PSU CIRT ได้รับการแจ้งเตือน เมื่อเว็บไซต์ภายใต้ชื่อโดเมนของมหาวิทยาลัย .psu.ac.th จากการใช้เครื่องมื่อ Google Search Console ที่
https://search.google.com/search-console
เพื่อให้ ผู้ดูแลเว็บไซต์ส่วนงาน ได้รับการแจ้งเตือนโดยตรง เพื่อแก้ไขได้อย่างรวดเร็ว
ขอให้ผู้ดูแลเว็บไซต์ส่วนงานที่มี ชื่อโดเมนย่อยต่างๆ ของส่วนงาน หรือซับโดเมนพีเอสยู (Subdomain under psu.ac.th) ให้เลือกแบบ Domain
และระบุชื่อโดเมนย่อยของส่วนงานที่ท่านรับผิดชอบ
หรือหากเป็นชื่อเว็บไซต์ ที่มีชื่อระดับเดียวแล้วต่อด้วย .psu.ac.th ให้เลือกแบบ URL prefix
และระบุชื่อเว็บไซต์เป็น URL ของส่วนงานที่ท่านรับผิดชอบ
ต่อมาในขั้นตอน Verify URL ก็ให้เลือกวิธีการพิสูจน์ว่าท่านเป็นเจ้าของเว็บไซต์นั้นๆ ตามวิธ๊การที่ท่านสามารถทำได้
คำแนะนำอ่านเพิ่มเติมได้จาก
https://contentshifu.com/blog/google-search-console-introduction
หากมีข้อสงสัยในการ Verify ส่งข้อความสอบถามมาใน Teams Chat PSU Admin วิทยาเขตต่างๆ ที่ท่านสังกัดอยู่ได้เลยครับ เพื่อจะได้ทราบคำแนะนำเพิ่มเติมไปพร้อมๆ กัน
เมื่อแฮคเกอร์ลงโฆษณาลิงก์พนันออนไลน์ ผู้ดูแลเว็บไซต์ส่วนงานก็จะได้รับอีเมลเตือนทันที จาก Google Search Console Team ด้วยเรื่อง
New owner for https://ชื่อเว็บไซต์ส่วนงาน.psu.ac.th/ตำแหน่งไฟล์หน้าโฆษณาลิงก์พนันออนไลน์
To owner of ชื่อเว็บไซต์ส่วนงาน psu.ac.th,
Google has identified that ***บัญชีอีเมลที่แฮคเกอร์ใช้ลงโฆษณา***@gmail.com has been added as an owner of
https://ชื่อเว็บไซต์ส่วนงาน.psu.ac.th/ตำแหน่งไฟล์หน้าโฆษณาลิงก์พนันออนไลน์/เช่น/js/xamp/angkasa168/.
Property owners can change critical settings that affect how Google Search interacts with your site. Ensure that only appropriate people have owner status, and that this role is revoked when it is no longer needed.
ขอขอบคุณในความร่วมมือจากทุกๆ ท่านในการจัดทำเว็บไซต์ให้ได้มาตรฐาน และเพิ่มความปลอดภัยไซเบอร์ให้กับเว็บไซต์ภายใต้ชื่อโดเมน psu.ac.th ของ ม.อ.
Tag: Google
-
Google Search Console Alert New owner for
-
How to InPrivate/Incognito Edge and Chrome by default
- เหมาะสำหรับเครื่องในห้องปฎิบัติการ จะได้ไม่ต้องลบค่าบางอย่าง เช่น MS Teams ล็อคอินค้าง, อีเมลล็อคอินค้างไว้
- เริ่ม
- คลิกขวา properties ที่ shortcut ของ edge หรือ chrome
- คลิกที่แท็บ shortcut ในช่อง target สำหรับ Microsoft Edge เพิ่ม -inprivate ต่อท้ายสุด แล้วคลิก Ok ดังภาพ
- สำหรับ Google Chrome เพิ่ม -incognito ต่อท้ายสุด ดังภาพ
- ทดสอบเปิด
- สำหรับ Firefox จะสร้าง shortcut สำหรับเข้า Private browsing ไว้อยู่แล้วไม่ต้องดัดแปลงอะไร
- ต้องแก้ shortcut ทุกที่หากอยากให้เป็นเหมือนกันทุก shortcut
- จบขอให้สนุก
-
มาลองสร้าง Website ด้วย Google Site แบบง่ายๆกันดีกว่า
ใครจะไปคิดว่าการสร้าง Website จาก Google Site จะง่ายขนาดนี้ ถ้าอยากรู้ว่าต้องเริ่มยังไงมาดูกันเลย
ขั้นตอนที่ 1. เริ่มจากไปที่ https://sites.google.com จะมี Template ให้เลือกใช้หรือ จะสร้างหน้า Website ขึ้นมาเองก็ได้นะ มาลองดูกันเลย
ในตัวอย่างนี้ ได้เลือกใช้ Template ที่ชื่อว่า “โครงการ” มาสร้าง Website ขั้นตอนที่ 2. หลังจากที่เราได้โครงสร้างของ Website ของเรามาแล้ว เราต้องทำการตั้งชื่อ Website ของเราก่อน โดยสามารถเปลี่ยนชื่อได้จากรูปเอกสารมุมซ้ายบน
นอกจากการเปลี่ยนชื่อ Website แล้วนั้น เรายังสามารถเปลี่ยนโลโก้ได้อีกด้วย
แต่ข้อสำคัญของการจะเผยแพร่ / publish Website ของคุณนั้น ต้องมีหน้า Website 2 หน้าขึ้นไป
ขั้นตอนที่ 3. หลังจากที่เราแก้ไขชื่อ และโลโก้ แล้วเรายังสามารถปรับแก้ไขเนื้อหาที่เราต้องการจะมานำเสนอ หรือเพิ่มลงบน Website ได้เองอีกด้วย โดยใช้เครื่องมือทางด้านขวามือที่ Google Site ได้มีไว้ให้
ลากสิ่งที่ต้องการใช้มาวางในพื้นที่ที่ต้องการได้เลย
ตัวอย่างการนำ “บล็อกเนื้อหา” มาวางบน Website ขั้นตอนที่ 4. หลังจากที่เราสร้างหน้า และใส่เนื้อหาที่ต้องการจะแสดงบน Website แล้ว เรายังสามารถสร้างหน้าเพิ่มเติมได้จากการเลือกเมนู “หน้าเว็บ” ทางด้านขวามือ
แถบเมนูจะแสดงหน้า Website ทั้งหมดที่เรามีในตัว Website นี้ โดยการสร้างหน้าเว็บเพิ่มสามารถกดได้จาก ปุ่ม + ที่มุมด้านล่าง
ความพิเศษของ Google Site คือ ตัวช่วยเหล่านี้ เราสามารถสร้างหน้าใหม่ได้ถ้าเกิดต้องการจะวางโครงหน้า เนื้อหน้าให้เหมือนหน้าอื่น โดยกดที่ “ทำซ้ำหน้าเว็บ” จากหน้าที่เราต้องการจะให้เป็นต้นแบบ ขั้นตอนที่ 5. การกำหนดแถบเมนู ต้องการจะให้แสดงด้านบน หรือต้องการให้แสดงด้านข้างสามารถจัดได้โดยการที่ กดที่รูปฟันเฟือง หรือการตั้งค่าดังรูป
สามารถตั้งค่าได้ที่คำสั่ง “โหมด” ว่าต้องการจะให้อยู่ด้านบน หรือด้านข้าง นอกจากนั้นยังสามารถกำหนดสีแถบเมนูได้อีกด้วยนะ
และในที่สุด เราก็มาถึงขั้นตอนสุดท้ายที่สำคัญที่สุดคือการเผยแพร่ Website เพียงแค่คุณ กด เผยแพร่/Publish หากคุณมี Domain เป็นของตัวเองสามารถนำมาใช้ได้เลย
ถ้าหากชื่อที่คุณต้องการตั้งซ้ำกับคนอื่น จะมีขึ้นแจ้งเตือนให้คุณเปลี่ยน หากเสร็จสิ้นแล้วกดเผยแพร่ได้เลย จบกันแล้วการสร้าง Website ไม่ได้อยากเหมือนที่คิดใช่ไหม ขอบคุณทุกคนที่เข้ามาอ่านนะคะ
-
แนวทางการพัฒนา Web Application ด้วย django จาก local docker สู่ Google Cloud Run
ในการพัฒนาแอพพลิเคชั่น เราก็จะเจอปัญหานึงเสมอ ๆ คือ เวอร์ชั่น (Version) ของเครื่องมือที่ใช้ในการพัฒนานั้น แต่ละโปรเจคมีความแตกต่างกัน เช่น ในกรณีของ การพัฒนา Web Application ด้วย django web framework เราอาจจะอยากใช้ python รุ่นล่าสุด คือ 3.8 แต่ในขณะเดียวกัน เมื่อหลังบ้านต้องการไปติดต่อ Tensorflow 2.0 ซึ่งยังต้องใช้งานกับ Python 3.6 เป็นต้น วิธีแก้ไขปัญหาทั่วไปคือ ติดตั้ง package ‘virtualenv’ เพื่อให้การพัฒนาแต่ละโปรเจค มี Environment แตกต่างกันได้
แต่จากการใช้งานจริง พบว่า สุดท้าย ตอนเอาไป Production บนเครื่อง Server ก็ต้องตามไปติดตั้งเครื่องมือ และรุ่นที่ถูกต้อง แม้ใน Python จะมีคำสั่ง pip install -r requirements.txt ก็ตาม แต่ก็ยังไปติดปัญหาว่า OS ของเครื่องที่จะ Production นั้น รองรับรุ่นของเครื่องมืออีกหรือไม่ด้วย
แนวทางการใช้ Container ด้วย Docker จึงเป็นที่นิยม เพราะ เมื่อเราพัฒนาเสร็จแล้ว สามารถ Pack เข้าไปใน Container แล้วเอาไป Deploy ได้ โดย (แทบจะ) ไม่ต้องกังวลกับ Environment ปลายทาง อีกทั้ง ยังสามารถทดสอบ Environment ใหม่ ๆ ก่อนจะ Deploy ได้ด้วย เช่นการเปลี่ยนรุ่นของ Python เป็นต้น
ในบทความนี้ จะนำเสนอ แนวทางการสร้าง docker container เพื่อใช้เป็นฐานในการพัฒนา django และ สามารถต่อยอด ติดตั้ง package อื่น ๆ ตามต้องการ ตั้งแต่ Development ไปจนถึง Deployment สู่ Serverless Environment อย่าง Google Cloud Run
สร้าง Development Container
เริ่มจาก สร้างโฟลเดอร์ใหม่ขึ้นมา ในนั้นมี 2 ไฟล์ คือ Dockerfile และ requirements.txt กับ โฟลเดอร์ ชื่อ code
Dockerfile
- ใช้ image ของ python เป็นรุ่น 3.7-slim ซึ่งตัดส่วนที่ไม่จำเป็นออกแล้ว (ไม่ใช้ alpine เนื่องจาก พบรายงานว่า แม้จะมีขนาดเล็กกว่า แต่ถูกจำกัดทรัพยากรบางอย่าง ทำให้ทำงานได้ช้ากว่า)
- สร้าง /code แล้วเข้าไปใช้พื้นที่นี้ (เหมือนคำสั่ง mkdir /code ; cd /code อะไรประมาณนั้น)
- สั่งให้ copy ไฟล์ requirements.txt ไปใช้ที่ root ( / )
- จากนั้น Upgrade คำสั่ง pip เป็นรุ่นล่าสุด แล้ว ติดตั้ง package ตามที่กำหนดใน requirements.txt
- เปิด Port 8080 ไว้ เพื่อใช้ในการทดสอบ และเป็นไปในแนวทางเดียวกับการใช้บน Google Cloud Run ต่อไป
FROM python:3.7-slim WORKDIR /code/ COPY requirements.txt / RUN pip install -U pip \ && pip install -r /requirements.txt EXPOSE 8080
requirements.txt
ในการพัฒนา django เมื่อทำการติดตั้ง package ใดเพิ่มเติมด้วยคำสั่ง pip install ก็จะบันทึกรายการ พร้อมรุ่นของ package มาในไฟล์นี้ ในที่นี้ ใช้ django, guincorn และ whitenoise เป็นหลัก (จะมีรายการ dependency ติดเข้ามาด้วย)
Django==2.2.6 gunicorn==19.9.0 pytz==2019.3 sqlparse==0.3.0 whitenoise==4.1.4
จากนั้นใช้คำสั่งต่อไปนี้ สร้าง (build) docker image จากไฟล์ Dockerfile ข้างต้น โดยมี option ที่เกี่ยวข้องดังนี้
docker build --rm -f "Dockerfile" -t mydjango:dev .
- –rm เมื่อ build แล้ว ก็ลบ container ชั่วคราวทิ้ง
- -f กำหนดว่าจะเรียกจากไฟล์ใด วิธีนี้ มีประโยชน์ เวลาที่จะต้องมี Dockerfile ทั้ง Development และ Production ในโฟลเดอร์เดียวกัน ซึ่งจำเป็นต้องใช้ชื่อไฟล์ที่แตกต่างกัน
- -t เป็นตั้งชื่อ docker image และ ชื่อ tag
- . คือ ให้ build จากตำแหน่งปัจจุบัน
ขั้นตอนนี้จะได้ docker image ชื่อ mydjango และมี tag เป็น dev แล้ว้
(ในที่นี้ พัฒนาบนเครื่องคอมพิวเตอร์ที่เป็น Windows 10 ซึ่ง %CD% จะให้ค่า Current Directory แบบ Absolute path ออกมา เช่นเดียวกับบน Linux ที่ใช้ $(pwd) )
ต่อไป สั่ง run ด้วยคำสั่ง และ options ดังต่อไปนี้
docker run --rm -it -p 8080:8080 -v %CD%\code:/code mydjango:dev bash
- –rm เมื่อจบการทำงาน ก็ลบ container ชั่วคราวทิ้ง
- -it คือ interactive และเปิด TTY
- -p เพื่อเชื่อม port 8080 จากภายนอก เข้าไปยัง port 8080 ภายใน container
- -v เพื่อเชื่อม Volume หรือโฟลเดอร์ของเครื่อง host กับ /code ภายใน container ขั้นตอนนี้สำคัญ
- bash ข้างท้าย เพื่อส่งคำสั่ง เรียก bash shell ขึ้นมา ซึ่งจะสัมพันธ์กับ -it ข้างต้น ทำให้สามารถใช้งาน shell ภายใน container ได้เลย
ผลที่ได้คือ bash shell และ อยู่ที่ /code ภายใน container
root@757bcbb07c7f:/code#
ตอนนี้ เราก็สามารถสร้าง django ได้ตามปรกติแล้ว (คลิกดูตัวอย่างเบื้องต้น) แต่ในตัวอย่างนี้ จะเริ่มจากการสร้าง project ชื่อ main เพื่อใช้ในขั้นตอนต่อไป ด้วยคำสั่งต่อไปนี้
django-admin startproject main cd main
ในระหว่างการพัฒนา สามารถใช้คำสั่ง runserver โดยเปิด Port 8080 ใน container เพื่อทดสอบได้ดังนี้ (สอดคล้องตามที่อธิบายข้างต้น)
python manage.py runserver 0.0.0.0:8080
สร้าง Production Docker Image
คำสั่งข้างต้น สามารถใช้ได้เฉพาะขั้นตอนการพัฒนา แต่เมื่อพัฒนาเสร็จแล้ว ควรใช้ Application Server แทน ในที่นี้จำใช้ gunicorn แต่ก่อนอื่น จะต้องปรับ Configuration ของ django ให้พร้อมในการ Deployment ก่อน
main/settings.py
# แก้ไข DEBUG = False ALLOWED_HOSTS = ['localhost','SERVICE-ID.run.app'] # เพิ่ม MIDDLEWARE = [ ... # Whitenoise 'whitenoise.middleware.WhiteNoiseMiddleware', ... ] # เพิ่ม STATIC_ROOT = os.path.join(BASE_DIR, 'static')
มีเพิ่มเติมคือ whitenoise ซึ่งเป็น package สำหรับจัดการเกี่ยวกับการให้บริการ static file ในตัว มิเช่นนั้นจะต้องไปตั้งค่าใน Web Server ให้จัดการแทน
เมื่อเราตั้งค่า DEBUG = False จะต้องกำหนด ALLOWED_HOSTS เสมอ ในที่นี้กำหนดให้เป็น localhost และ Production URL (SERVICE-ID.run.app) ที่จะเกิดขึ้นเมื่อสร้าง Service บน Google Cloud Run ครั้งแรกไปแล้ว (ค่อยกลับมาแก้ไขแล้ว Revision อีกครั้ง)
ใช้คำสั่งต่อไปนี้เพื่อรวบรวม static files ต่าง ๆ มาไว้ในที่เดียวกัน ในที่นี้ คือที่ โฟลเดอร์ static
python manage.py collectstatic
ทดสอบ Production ด้วย gunicorn ด้วยคำสั่งต่อไปนี้
gunicorn --bind 0.0.0.0:8080 main.wsgi
ทดสอบเรียก Local Admin Console ( http://localhost:8080/admin ) ดู ถ้าเรียก static file เช่นกลุ่ม css ได้ ก็พร้อมสำหรับจะนำขึ้น Google Cloud Run ต่อไป
สุดท้าย สร้าง Production Dockerfile และ สรุป requirements.txt ดังนี้
Dockerfile.production
FROM python:3.7-slim WORKDIR /code COPY ./code/* ./ RUN pip install -U pip \ && pip install -r requirements.txt EXPOSE 8080 CMD [ "gunicorn","--bind","0.0.0.0:8080", "main.wsgi"]
requirements.txt
pip freeze > requirements.txt
จากนั้น ใช้คำสั่งต่อไปนี้ เพื่อสร้าง Production Docker Image (ออกมาจาก Development Container shell ก่อน) โดยจะใช้ tag เป็น latest
docker build -t mydjango:latest -f "Dockerfile.production" .
ส่ง Production Docker Image ขึ้น Google Container Registry
Google Cloud Run จะเรียกใช้ docker image ที่อยู่บน Google Container Registry เท่านั้น
- เปิด Google Console
- สร้าง Project ใหม่ และ ตั้งค่า Billing
- เปิดใช้งาน Google Cloud Run และ Google Container Registry
- ติดตั้อง Google Cloud SDK เพื่อให้สามารถ push ขึ้นได้ และ ยืนยันตัวตนด้วย Google Account
แล้วใช้คำสั่งต่อไปนี้ เพื่อ tag
docker tag mydjango:latest gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME
- YOUR-GCP-PROJECT-ID เป็น Project ID ที่สร้างขึ้น
- SERVICE-NAME ชื่อ service ที่จะสร้าง
แล้วก็ push ขึ้น Google Container Registry
docker push gcr.io/YOUR-GCP-PROJECT-ID/SERVICE-NAME
สร้าง Google Cloud Run Service
สร้าง Service โดยเลือก Image ที่ต้องการ
เมื่อเสร็จแล้วจะได้ URL อย่าลืมเอาไปแก้ไขใน main/settings.py ในส่วนของ ALLOWED_HOSTS แทน SERVICE-ID.run.app
จากนั้น build, tag และ push ขึ้น Google Cloud Registry อีกครั้ง แล้ว Deploy New Revision เป็นอันเรียบร้อย
อันนี้เป็นการ Proof of Concept ในบทความต่อไป จะนำเสนอตัวอย่างการใช้งานจริงครับ
-
วิธีสร้างสมุดโทรศัพท์ของหน่วยงานด้วย Google Contact
เคยเป็นไม๊ จะโทรศัพท์หาเพื่อนร่วมงาน แต่ไม่รู้ว่า เบอร์มือถือ เบอร์ที่โต๊ะ หรือ Email อะไร วิธีการที่บางหน่วยงานทำ คือ ทำแผ่นพับเป็นสมุดโทรศัพท์เก็บใส่กระเป๋าตังค์บ้าง เป็นกระดาษแปะบ้าง บางทีก็หาย บางทีก็ไม่ได้พกบ้าง หรือ บางทีทำเป็นเว็บให้ค้นหาบ้าง … บางแห่งถึงกับต้องลงแรงเรียน Mobile App ก็มี (อิอิ)
จะดีกว่าไม๊ ถ้าแค่ฝ่ายบุคคล แค่รวบรวม ชื่อ นามสกุล ชื่อเล่น เบอร์มือถือ เบอร์โต๊ะ และ Email ใส่ Excel แล้วจากนั้น ใครใคร่จะ Import ใส่ Google Contact ของตนเองได้เลย แล้วหลังจากนั้น จะโทร จะค้นหา ก็สามารถทำในมือถือของตนเองได้เลย !!! ไม่ต้องพก ไม่ต้องติดตั้ง App เพิ่ม ใช้ได้ทั้ง iOS, Android และบน Computer ก็ยังได้
มาดูกัน
สร้าง Excel เก็บข้อมูล
การนำเข้า (Import) ข้อมูลเข้า Google Contact มีทริคนิดเดียว คือ บรรทัดแรกของไฟล์ จะต้องเป็น Header ที่กำหนดชื่อตามรูปแบบมาตราฐาน กล่าวคือ ตั้งหัวข้อว่า “ชื่อ”, “นามสกุล”, “ชื่อเล่น”, “มือถือ”, “เบอร์โต๊ะ” อะไรอย่างนี้ +++ไม่ได้+++
ต้องตั้งเป็น
"Given Name","Family Name", "Name Suffix","Phone 1 - Type","Phone 1 - Value","Phone 2 - Type","Phone 2 - Value","Group Membership"
Given Name = ชื่อ
Familay Name = นามสกุล
Name Suffix = ใช้เป็นชื่อเล่นก็ได้
Phone 1 – Type = ประเภทโทรศัพท์อันที่ 1 (เช่น Mobile)
Phone 1 – Value = หมายเลขโทรศัพท์อันที่ 1 (เช่น เบอร์มือถือ)
Phone 2 – Type = ประเภทโทรศัพท์อันที่ 2 (เช่น Work)
Phone 2 – Value = หมายเลขโทรศัพท์อันที่ 2 (เช่น เบอร์โต๊ะ)
Group Membership = จะให้ Label ว่าอย่างไรดังตัวอย่างนี้
จากนั้น Save เป็นแบบ CSV File สมมุติชื่อว่า contact.csv
นำเข้า Google Contact
เปิด Gmail/Google Mail แล้วคลิกที่ App > Contacts ใน Google Contact คลิกที่ More > Import เลือกไฟล์ เสร็จแล้ว ก็จะได้ใน Google Contact มี Label ตามภาพ (1 contact มีหลาย ๆ label ได้)
ในภาพ จะเห็นว่า Contact ที่เพิ่งนำเข้าไป จะปรากฏใน Label cc2019, myContact และ Imported on 5/7 ซึ่งเป็น Defaultวิธีการนี้ มีข้อดีคือ แม้จะมี contact ที่ซ้ำกัน ก็ไม่เป็นไร เราสามารถ Merge ทีหลังได้ หรือ เลือกลบที่เป็น Label ของปีก่อน ๆ ได้ ถ้าต้องการ
พร้อมใช้งานทันที
เมื่อ Import เสร็จแล้ว ในมือถือที่ Sync กับ Google Account ที่เราเอา Contact ใส่เข้าไปก็จะสามารถค้นหาได้ทันที
หาตามเบอร์โทรศัพท์ก็ได้
เย ๆ
-
วิธีการจองทรัพยากร (ห้องประชุม/รถ/Projector/etc…) ใน Calendar ของ G Suite for Education
ข้อแตกต่างระหว่าง Calendar ของ G Suite for Education กับ Free Gmail
สร้าง Event เพิ่มผู้เข้าร่วมประชุม และ จองทรัพยากร
คลิกในช่อง วันบนปฏิทิน ที่เราต้องการนัดประชุม
กรอกหัวข้อการประชุม แล้ว
ใส่รายชื่อ ผู้เข้าร่วมประชุม
และเลือกห้องประชุมคลิกที่ See guest availability เพื่อดูว่า ว่างพร้อมกันหรือไม่ ทั้งผู้เข้าร่วมประชุม และ ห้อง
หากบางคนไม่ว่างในเวลาที่กำหนด สามารถคลิก Suggested times เพื่อให้ Google Calendar หาเวลาที่ว่างพร้อมกันหมดได้
ใส่คำอธิบาย หัวข้อการประชุมก็ได้
เมื่อกดปุ่ม Save ระบบจะแจ้งว่า ให้ส่ง Email ไปแจ้งผู้เข้าร่วมประชุมหรือไม่ แนะนำว่าควรคลิก Send
เพิ่มเติม เมื่อคลิกเข้ามาดูรายละเอียดการนัดประชุม
- ใน G Suite for Education มีบริการ Hangouts Meet ให้ในตัว (นัดหมายด้วย Free Gmail จะสร้างห้องเองไม่ได้ ทำได้แต่ Join เข้ามา) ซึ่งทำได้ทั้ง Video Call หรือ จะ Phone In ก็ได้ (อันนี้ไม่เคยลอง)
- ดูได้ว่า ใครตอบรับ/ปฏิเสธ/ยังไม่ตอบ (เค้าเรียกว่า RSVP – Répondez s’il vous plaît – Please respond)
- มีแจ้งเตือนก่อนการประชุมจะเริ่ม ตั้งค่าได้ว่าต้องการก่อนเวลานานขนาดไหน (ในตัวอย่างตั้งไว้ 10 นาที)
Free Gmail ทำได้แค่นี้
ต่อไป เป็นตัวอย่างนัดกับผู้ที่มีตารางนัดหมายแน่น ๆ
และแสดงการจอง ห้องประชุม และ Projectorเลือก จำนวนชั่วโมง (ในที่นี้ 1 ชั่วโมง) แล้วเลื่อนหาช่องที่ว่างตรงกันได้
การทำรายงานการใช้ทรัพยาการ (ยกตัวอย่างห้องประชุม)
คลิกที่ รูปแว่นขยาย เลือก ปฏิทินของทรัพยากร (ในที่ คือห้องประชุม) ที่ต้องการดู
แล้วเลือก ช่วงเวลาที่จะทำรายงาน (ในที่นี้ เป็นตัวอย่างการทำรายงานการใช้ ห้องประชุม ตั้งแต่ 1 พฤษภาคม – 31 พฤษภาคม) แล้ว คลิก ปุ่ม Search
ก็จะได้รายงานอย่างนี้
หวังว่าจะเป็นประโยขน์ครับ
-
Google Colab – เมื่องานด้าน Data Science ต้องทำงานร่วมกัน
ก่อนหน้านี้ ได้กล่าวถึง Kaggle
- Introduction to Kaggle – เรียนรู้การงานด้าน Data Science
- Kaggle – วิธีการใช้ Logistic Regression บนข้อมูล Iris
- From LAB to Production – จาก Machine Learning Model สู่ Flask RESTful
ในบทความนี้ จะกล่าวถึง Google Colab หรือ ชื่อเต็มคือ Colaboratory ของ Google ซึ่งก็เป็น Jupyter Notebook บน Cloud เช่นกัน แต่มีจุดเด่นเรื่อง การทำงานร่วมกัน ในสไตล์ Google Drive
- เริ่มต้นใช้งานได้ที่ https://colab.research.google.com/
- อันดับแรกคือ ถ้าอยากเรียนรู้เรื่อง Machine Learning และอยากได้ตัวอย่างเจ๋ง ๆ ไปดูจาก Seedbank (https://tools.google.com/seedbank/)
มี tensorflow พร้อมใช้งาน ใช้งานร่วมกับ GitHub และ มี Visualization ด้วย matplotlib (แปลกตรงไหน ?)
- จุดเด่นคือ สามารถสร้าง Form ได้ !!!
- ที่เด่นสุดคือ สามารถใช้ไฟล์จาก Google Drive ได้ !!! เป็นประโยชน์มาก โดยเฉพาะกับมหาวิทยาลัยที่ได้ใช้บริการ G Suite for Education อย่าง ม.สงขลานครินทร์ เพราะ เราจะสามารถใช้พื้นที่ได้ Unlimited !
แต่!!!
สุดท้ายก็มาติดตรงที่ Google Colab นี้ เป็น VM อยู่ใน Google Compute Engine นั่นแหล่ะ แต่เค้าไม่คิดค่าบริการกับเรา ซึ่งของฟรี ก็มีข้อจำกัดอยู่คือ
พื้นที่
Google Colab ให้ประมาณ 400 GB
แต่อย่างน้อย ก็สามารถเชื่อมต่อเอาข้อมูลจาก Google Drive มาได้ง่าย ก็ดีแล้ว แถม Jupyter Notebook ที่สร้างก็สามารถ Save เก็บไว้ใน Google Drive ได้เลย การส่งผลลัพท์ออกไป Google Drive ก็ง่ายในขณะที่ Kaggle มี Quota การสร้าง Dataset ของตนเองได้ไม่เกิน 20 GB
- จะมีข้อจำกัดหน่อย ๆ
CPU
ให้แค่ 2 Core
ตรงนี้ Kaggle ดูดีกว่า เพราะให้ถึง 32 Core
- การทำงานร่วมกัน แน่นอน Google ก็คือ Google แชร์แบบที่ใช้บน Google Drive ได้เลย ในขณะที่ Kaggle ก็ทำได้ แต่ดูทำงานแยก ๆ กันอยู่
- Google Colab ใช้งานร่วมกับ Google BigQuery ได้
ตรงนี้แหล่ะ ข้อแตกต่าง ถ้าจะทำงานใหญ่ มีข้อมูลเป็น TB ถ้าไม่สร้าง Hadoop ไม่ว่าจะ On-Primes หรือ บน Google Dataproc ก็จะต้องบริหารจัดการในระดับหนึ่ง แต่นี่เรียกตรงจาก Google BigQuery ได้เลย นับว่าดีมาก - มี Widget ทำให้ Jupyter Notebook กลายเป็น Interactive BI ย่อย ๆ ได้
- และ ใช้ GPU ได้ ฟรี !!! แต่ต่อเนื่อง 12 ชั่วโมง ถ้าจะใช้นานกว่านั้น ต้องไปใช้ Google Datalab แทน
- จากที่ลองใช้มา ก็สะดวกดี
ลองกันต่อไป
-
วิธีการทำ 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 ไปเป็นสมาชิก และตั้งค่าแบบนี้เช่นกัน -
วิธีใช้ Google Sheets เป็นฐานข้อมูล เพื่อการเฝ้าระวังระบบ โดยการใช้งานผ่าน Google API Client Library for Python
ต่อจาก
- วิธีการใช้ Google Sheets เป็นฐานข้อมูล
- การใช้งาน Google Drive API ด้วย Google Client Library for Python
- วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python
คราวนี้ ใครมีข้อมูลที่เกิดขึ้นในเซิร์ฟเวอร์ภายในองค์กร แล้วต้องการส่งไปเขียนเก็บไว้ใน Google Sheets แบบต่อท้าย (Append)
เช่น ในตัวอย่างนี้ วัดระยะเวลาการโอนย้ายข้อมูล เปรียบเทียบระหว่าง rsync เพื่อสำรองข้อมูลไปไว้ในเครื่องเซิร์ฟเวอร์สำรองที่ต่างวิทยาเขต กับ การนำไปเก็บไว้ใน Google Drive ตามวิธีการที่กล่าวไว้ใน วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python
ผมได้เขียนโค๊ดเอาไว้ที่ https://github.com/nagarindkx/google.git
สามารถโคลนไปใช้งานได้ (ช่วย Reference กันด้วยนะครับ)ขั้นตอนการใช้งานมีดังนี้
- ใช้คำสั่ง
git clone https://github.com/nagarindkx/google.git cd google
- ติดตั้ง python, pip, google-api-python-client ตามที่เขียนไว้ใน การใช้งาน Google Drive API ด้วย Google Client Library for Python และสร้างโปรเจคใน Google Developer Console เปิดใช้งาน Google Sheets API, สร้าง Credentials > OAuth Client ID แล้ว download JSON มาไว้ในชื่อว่า client_secret.json
- รูปแบบคำสั่งคือ
$ python append2gsheet.py --help usage: append2gsheet.py [-h] [--auth_host_name AUTH_HOST_NAME] [--noauth_local_webserver] [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]] [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}] --data DATA --sheetid SHEETID [--range RANGE] [--value-input-option VALUEINPUTOPTION] optional arguments: -h, --help show this help message and exit --auth_host_name AUTH_HOST_NAME Hostname when running a local web server. --noauth_local_webserver Do not run a local web server. --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]] Port web server should listen on. --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL} Set the logging level of detail. --data DATA CSV format --sheetid SHEETID Google Sheets ID --range RANGE Simply Sheet Name like 'Sheet1!A1' --value-input-option VALUEINPUTOPTION Optional: [RAW,USER_ENTERED]
- สิ่งที่ต้องมี คือ Google Sheets ที่สร้างไว้แล้ว ให้สังเกตที่ URL
ตัวข้อความที่อยู่หลัง https://docs.google.com/spreadsheets/d/ จะเป็น “Sheet ID” ซึ่งจะใช้ในตัวแปร “sheetid” ในขั้นต่อไป
- ในแต่ละ Google Sheets จะประกอบด้วย หลาย Sheet ในที่นี้ จะเขียนลง Sheet ที่ชื่อว่า “Data” ซึ่งจะใช้ในตัวแปร “range” ในขั้นต่อไป
- ตัวอย่างการใช้งาน เมื่อระบบทำการสำรองข้อมูล จับเวลา ก็จะทำการส่งข้อมูลไปเก็บในลักษณะ CSV อย่างนี้ส่งไป เช่น
20180129-12,37.0188,27.5338,943.7682,902.7372
ซึ่งประกอบด้วย 5 ฟิลด์ คือ วันเวลาที่วัด และ ข้อมูล เป็นจำนวนวินาที อีก 4 ฟิลด์
วิธีการส่งคำสั่งในการใช้งาน ครั้งแรก ต้องใส่ –noauth_local_webserver ด้วยpython append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver
จะได้ผลดังนี้
ให้เอา URL ไปเปิดบนเว็บ Browser ที่สามารถยืนยันตัวตนกับ Google ได้ ผลดังนี้
แล้วก็ให้การอนุมัติ
ก็จะได้ Verification Code อย่างนี้
เอาไปใส่
- แต่จะเห็นว่า ข้อมูล ตัวเลขที่ใส่เข้ามา จะถูกแปลงเป็นข้อความ ซึ่ง สามารถแก้ไขได้ด้วยการใส่ –value-input-option USER_ENTERED
python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver --value-input-option USER_ENTERED
- เมื่อเก็บผลเรียบร้อยแล้ว สามารถดูเป็น Chart แบบ Realtime ได้
เผื่อเป็นประโยชนครับ