วันอังคาร, ธันวาคม 29, 2558

IDP การวางแผนพัฒนาตนเอง


Individual Development Plan หรือ IDP

    พี่น้องหลายคนหากทำงานบริษัทเอกชนแบบผม อาจจะเจอคำคำๆนี้ IDP สำหรับผมแล้วสมัยทำงานใหม่มันเป็นยาขมเลยล่ะ พอสิ้นปี พี่เค้าก็จะมาบอกว่า ส่ง IDP ด้วย
  


    แล้วไอ่ IDP มันเป็นยังไงนะ? สมัยนั้นก็ไม่มีใครบอกรูปแบบที่แน่ชัดได้ แต่พี่ของพี่ของพี่เค้าจะเอา พนง.ต้องทำส่ง (หื้ม..ม) แล้วด้วยความเป็นเด็กจบใหม่ สมัยนั้นน่ะนะครับ..ย้ำ ไม่เห็นความสำคัญของ IDP หรือการตั้งเป้าเลย เรียนจบก็ต้องหางานทำ หนังสือก็ไม่ได้ชอบอ่าน ประชุมบริษัทที่เจ้านายเค้าก็จะบอกว่า 
เอ็งอย่าเป็นขี้ลอยน้ำ

    และช่วงนี้ก็จะปีใหม่ ได้เวลามาวางแผนชีวิต แผนอาชีพกันอีกยกนึงแล้ว ตอนนี้ก็พอจะรู้อะไรมาบ้างแล้ว มาตั้งหน้าตั้งตาเขียน IDP กันซักหน่อยนะ

ใน IDP ของเราจะต้องมีสิ่งเหล่านี้ ถึงจะเรียกว่า IDP นี้ดี

  • เขียนประโยคเป้าหมายที่มีความชัดเจน ของแผนหรือเป้าหมายระยะสั้น (แผนภายใน 1-2 ปี)
  • เขียนประโยคเป้าหมายที่มีความชัดเจน ของแผนหรือเป้าหมายระยะยาว (แผนภายใน 3-5 ปี)
  • แผนดำเนินการ (Action plan) ที่เฉพาะเจาะจงสำหรับปีต่อไป ซึ่งต้องออกแบบมาเพื่อช่วยตัวเองขยับเข้าใกล้เป้าหมายนั้นมากขึ้น


การสร้างเป้าหมายที่ดีหรือแข็งแกร่ง

    อย่ากลัวที่จะตั้งเป้าหมายของตัวเองให้ยากซักหน่อย, แต่ยังเป็นจริงได้นะ (เปรียบเทียบแบบนี้ว่า คือต้องเอื้อมหน่อย อาจจะเอื้อมสุดแขน ไม่ใช่ยืดแขนออกไปก็ได้แล้ว )

    เป้าหมายที่ดีจะช่วยให้เรามีความชัดเจน และมีมุ่งมั่นที่จะลงแรงพัฒนาตัวเอง ให้ไปยังจุดที่เราอยากจะได้อยากเป็นในอาชีพของเรา การตั้งเป้าหมายจากแผนระยะยาวและแผนระยะสั้น เราจะมั่นใจได้ว่าการลงแรงของเราตอนนี้มันสนับสนุนหรือมันจะพาเราไปยังอนาคตที่เราอยากได้อยู่ ลองจับเอาเป้าหมายระยะยาวมาอย่างน้อย 1 เป้า และเป้าหมายระยะสั้น 3-6 เป้าใส่ใน IDP ของเรา.

เป้าหมายใน IDP ควรจะมีสิ่งเหล่านี้
  • เขียนด้วยวิธี SMART เจาะจง, วัดได้, ทำได้จริง (ต้องออกแรงพยายามบ้างไม่ใช่ทำได้ง่ายชิลๆ), มีความเกี่ยวข้อง, มีขอบเขตเวลา
  • ตาม mission, vision, goals ขององค์กร
  • มี competencies ที่เราอยากจะพัฒนา
  • มี กลยุทธที่จะใช้เพื่อให้ได้ตามเป้าหมายนั้น
  • มีระบุถึงทรัพยากรทั้งหลายที่จำเป็น
อธิบายด้วยว่าจะวัดความคืบหน้าของเราได้อย่างไร

ระบุวันสิ้นสุดที่จะต้องสำเร็จตามเป้าหมาย

แต่ละเป้าหมายที่ตั้ง กำหนดกิจกรรมที่จะใช้หรือทำเพื่อให้สำเร็จได้ตามเป้า 1-3 อย่าง

ถ้าคิดเป้าหมายไม่ออก ลองวิธีแบบนี้ดู

การคิดเพื่อหาเป้าหมาย
  • ตัวฉันเองเป็นอย่างไรบ้างในงานปัจจุบัน ? เราทำได้ดีในด้านใด ? เรื่องใด ? เรื่องไหนที่ทำได้ไม่ดีพอ และฉันจะปรับปรุงมันได้อย่างไร ? เรามี skill ทุกอย่างพอเพียงที่จะประสบความสำเร็จหรือยัง ?
  • อะไรคือแผนระยะสั้นในการทำงาน และต้องการการพัฒนาเรื่องอะไร ?
  • กิจกรรมการพัฒนาไหนในงานที่ทำในปัจจุบันอาจจะช่วยให้ฉันพัฒนาทักษะ และความรู้ที่ฉันจะต้องใช้เพื่อให้ได้งานที่ตั้งเป้าไว้
  • มีโปรเจคไหนหรือประสบการณ์ไหนที่ทำงานที่อาจจะเป็นประโยชน์ในการพัฒนาของฉันหรือไม่ ?
  • มีการเรียนการสอน (ห้องเรียน เรียน online งานสัมนา ฯ) ที่ฉันสามารถไปเข้าเรียนหรือไม่ ?
    ในขณะที่ตอบคำถามเหล่านี้ ให้จดบันทึกความคิด และโน๊ต เรื่องที่เราต้องการความช่วยเหลือ ให้เปิดใจ และซื่อสัตย์กับความจำเป็นในเรื่องที่ต้องการการพัฒนา ในท้ายที่สุด เขียน เป้าหมายของอาชีพที่เกิดขึ้นจากส่วนที่คิดได้นี้

คือข้างบนนี้ก็ไม่ได้คิดเอง แต่ค้นค้นค้น แล้วก็คิดว่ามันเข้าท่าแล้ว เหมือนที่พี่เค้าต้องการละ จึงสรุปกึ่งแปลมาจากที่นี่ครับ Tips to Createing your IDP

วันพุธ, ธันวาคม 23, 2558

Gradle : คอนฟิกให้ gradle ใช้ repository อื่น (Artifactory)



gradle using other/local repository


    ที่บริษัทตั้ง maven mirror server, Artifactory เจ้าตัวนี้ทำให้ทีมพัฒนาฯที่ใช้ maven ไม่ต้องใช้ internet bandwidth ออกไปเอา dependency ต่างๆ อย่างสิ้นเปลือง

    เมื่อ config mirror maven repository ในเครื่องตัวเองแล้ว ถ้าเครื่องแรกไปเอามาได้แล้ว jar หรือ dependency ตัวนั้นๆจะถูกเก็บเอาไว้ใน artifactory คนที่สอง และคนต่อๆไปเมื่อเรียก mvn มันจะวิ่งไปตรวจสอบและเอา dependency จาก artifactory; ถ้าตัว artifactory ยังไม่มี มันจะดาวโหลดมาเก็บเอาไว้ให้

     Artifactory พัฒนาโดยทีมที่ทำ maven repository ที่ชื่อ bintray.com เจ้า artifactory community version นี้ open source และแจกจ่ายให้เอาไปใช้งานกันได้ฟรีๆ features เต็มๆ ต้องเสียเงิน มันทำ mirror ได้สารพัด npm, docker, maven, gradle

    โอยๆ เกริ่นมากเกิน จะบอกว่า ตั้ง artifactory ไว้ใช้งานเองแล้ว ไม่ได้ใช้ได้แต่ maven นะครับ gradle, ant, ivy ก็ใช้ได้ด้วย วิธี config gradle command ให้วิ่งหา dependency ผ่าน artifactory เราจะใช้ไฟล์ init.gradle

สร้างไฟล์ init.gradle ที่ USER_HOME/.gradle/

เช่น ถ้าเป็น macbook จะอยู่ที่ /Users/siritas_s/.gradle/

เนื้อหาข้างในไฟล์ /Users/siritas_s/.gradle/init.gradle
allprojects {
    repositories {
        mavenLocal()
        maven {
          url "http://repossvr/artifactory/repo"
        }
    }
}

mavenLocal() ก็คือให้มันหาจาก .m2/repository ที่ maven โหลดมาไว้นั่นเอง
maven { url "..." } คือให้มันวิ่งไปหาจาก artifactory server

เท่านี้เอง ครับ ถ้ารัน ./gradlew มันก็จะวิ่งไป mirror repository ให้แล้ว

วันพฤหัสบดี, พฤศจิกายน 26, 2558

OS X: การเข้า Recovery Mode




    OS X ตั้งแต่รุ่นจ้าวสิงโต (Lion) เป็นต้นมา จะมีตัวช่วยแก้ไขหรือกู้คืน OS X; เค้าให้เอาไว้เป็นเครื่องมือสำหรับ ติดตั้ง OSใหม่ หรือซ่อมแซม หรือแม้กระทั้งกู้ข้อมูลจากตัวสำรองข้อมูล Time Machine backup

เราสามารถใช้ Recovery ในการทำสิ่งเหล่านี้ได้

  • กู้ Mac จากข้อมูลที่สำรองไว้ด้วย Time Machine backup
  • ตรวจสอบและแก้ไข disk (hard disk, solid state disk, ฯ) ที่ต้อกับ Mac ด้วย Disk Utility
  • เชื่อมกับ internet เพื่อขอความช่วยเหลือ online ผ่านทาง Safari ได้
  • ติดตั้งหรือติดตั้ง OS X ใหม่


การจะเข้า Recovery mode ทำแบบนี้

กด command, R สองปุ่มนี้ค้างเอาไว้ ตอนกดเปิดเครื่อง หรือตอน restart


ถ้าไม่แน่ใจ หรือกดตอน restart แล้วไม่สำเร็จก็ให้ปิดเครื่องแล้วเริ่มจากตรงนั้นครับ

กดค้างเอาไว้จนหน้าจอขึ้นเครื่องหมาย ลูกแอปเปิ้ล

เมื่อมันพร้อมให้เราทำงานต่อ จะเห็นหน้าจอคล้ายๆแบบนี้  มีทูลบาร์ด้านบน กับวินโดว์ Utilities กลางจอ




ถ้าตามมาอ่านจาก วิธีทำให้ OS X 10.11 El Capitan อ่าน/เขียน NTFS ได้ เราจะเลือก Terminal app เพื่อพิมพ์คำสั่งต่างๆได้ ตามภาพนี้เลยครับ


อ้างอิงจากข้อมูลของ About OS X Recovery
ภาพจาก Apple และ Hongkiat

วันศุกร์, พฤศจิกายน 06, 2558

OS X: แก้ไข เรียกใช้งาน XtraFinder ใน El Capitan ไม่ได้

    พออัพเกรด OS X เป็น El Capitan แล้ว เจอปัญหาอีกอย่าง (พ.ย.58) โปรแกรม XtraFinder ซึ่งเพิ่มความสามารถของ Finder กลับติดตั้งแล้วใช้งานไม่ได้


    XtraFinder ทำให้เราสามารถ cut แล้ว paste ไฟล์/โฟลเดอร์ได้ ถ้า Finder เดิมจะให้ copy แล้ว paste แค่นั้น อยากลบต้องทำเอง และอีกเรื่องที่ขาดไม่ได้ คือสามารถ เปิดปิดการแสดงผล hidden files ได้จาก Finder เลย ทำให้การใช้งานของผมสะดวกขึ้นมาก


** วิธีต่อไปนี้จะทำให้ Mac ของเราปลอดภัยน้อยลง ถ้าไม่จำเป็นต้องใช้คุณสมบัติที่บอกไว้ข้างต้นก็ไม่ควรทำต่อนะครับ 

วิธีแก้ไข(ชั่วคราว) เราจะต้องไปยุ่งกับ System Integrity Protection

1. ต้อง boot เข้า recovery mode (กด key ⌘+R ค้างไว้ก่อน สั่ง reboot หรือกดเปิดเครื่อง)
2. เปิด Terminal ขึ้นมา (อยู่ใน Utilities)
3. พิมพ์คำสั่ง
$ csrutil enable --without debug
4. กด Enter เพื่อให้มันทำงาน
5. reboot กลับมา ทำการติดตั้ง XtraFinder
6. ถ้าอยากคืนค่า System Integrity Protection ก็ให้ boot เข้า recovery แล้วใช้คำสั่งต่อไปนี้เพื่อคืนค่า แล้ว reboot กลับมาใช้งานได้ตามปกติ
$ csrutil clear

อ้างตามเวบไซด์ของคนพัฒนา Workaround For OS X 10.11

วันศุกร์, ตุลาคม 30, 2558

แก้ไข JRebel error JavaLaunchHelper

ลง OS X ใหม่ ทำให้ต้องติดตั้ง JDK ใหม่ด้วย ถ้าไป download จาก Oracle OTN website ตัวล่าสุดของ JDK 7 ที่เปิดให้โหลดคือ 7u79 เมื่อติดตั้งเรียบร้อย เอามารัน tomcat ที่ config jRebel เอาไว้ จะเจอ error ลักษณะนี้ใน console


objc[7324]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.


ใน forum ของ zeroturnaround (ทีมพัฒนา JRebel) บอกเอาไว้ว่ามันเป็น bug ของ Java เอง มีการเปิด issue เอาไว้แล้วด้วย ทางแก้เท่าที่ค้นคว้าดู ตอนนี้มีทางเดียวคือกลับไปใช้ version 7u25 ดาวโหลดได้จาก OTN website ตามลิ้งข้างต้นอีกเช่นเคย

เมื่อติดตั้งด้วย .dmg ก็จะไม่มีปัญหาอะไร แต่จะเรียกใช้มันยังไงล่ะ ไอ้เจ้า version เก่า ถ้าไปเปิด post เก่า "เปลี่ยน JDK version ง่าย ด้วยคำสั่งเดียว" จะรู้ว่าเราใช้คำสั่ง $/usr/libexec/java_home ได้

แต่ทีนี้ผมลง 7u79 ไป แล้วลง 7u25 เพิ่มเข้าไปอีก เวลาสั่ง $/usr/libexec/java_home -v 1.7 มันจะได้ version ที่สูงกว่าเสมอ ลองอ่าน help ของ command line อันนี้ดูถึงรู้ว่า เราสามารถระบุได้ละเอียดกว่าแค่ 1.7 เช่นอยากได้ JDK 7u25 แทนที่จะใส่ option -v 1.7 ให้ใส่ -v 1.7.0_25 เลย

ทีนี้ script ในการรัน tomcat+JRebel ก็สามารถใช้ JDK 7u25 ได้แล้ว หน้าตาจะเป็นแบบนี้

export JAVA_HOME=$(/usr/libexec/java_home -v 1.7.0_25)
...
export CATALINA_HOME=/Volumes/MacintoshHD2/Users/HDD/apps/apache-tomcat-6.0.41
...
$CATALINA_HOME/bin/startup.sh

วันพุธ, ตุลาคม 21, 2558

OS X: วิธีทำให้ OS X 10.11 El Capitan อ่าน/เขียน NTFS ได้


ได้ฤกษ์ลง El Capitan แล้วครับ เลยมาอัพเดตวิธี เพราะ วิธีเดิมที่ใช้กับ Yosemite (OS X 10.10) มันใช้ไม่ได้กับ OS X ตัวใหม่นี้

Solution

คำเตือน อ่านขั้นตอนให้ละเอียด สำคัญ ทุกขั้นตอนนะ

1 ซอฟต์แวร์ที่ใช้ติดตั้งในขั้นตอนด้านล่างทั้งหมดนี้ ผม pack ไว้ที่ dropbox ส่วนตัว ที่นี่

2 ติดตั้ง  OSXFUSE   2.8.1 (ถ้าไม่เอาไฟล์จากข้อ 1 โหลดได้จาก http://osxfuse.github.io/ )

3 ตอนติดตั้งให้เลือกติดตั้ง MacFUSE Compatibility Layer ด้วย

4  Reboot เข้า Recovery mode (ทำไง? ดูที่นี่)  เพื่อปิด คุณสมบัติ SIP (System Integrity Protection)
เปิด Terminal app เริ่มพิมพ์คำสั่งตามหลังเครื่องหมาย $ และไม่ต้องพิมพ์ เครื่องหมาย $ ลงไปใน Terminal)

$ csrutil disable (กด Enter)

แล้ว Reboot Mac

5  ติดตั้ง NTFS-3G for Mac OS X (ถ้าไม่เอาไฟล์จากข้อ 1 โหลดได้จาก http://goo.gl/5AIE4i) เป็นเวอร์ชั่นตั้งแต่ปี 2010 แต่ก็ยังเจ๋งอยู่

* สังเกตว่าตอนติดตั้ง ntfs-3g เราจะเลือกเป็น No caching
* มันอาจจะมีหน้าจอ Error บอกว่าติดตั้งไม่สำเร็จ ไม่ต้องตกใจไป ปิดโปรแกรมนี้ไปก่อน

6  ทดสอบ เสียบ external hard drive หรือ flash drive ที่ใช้ NTFS เข้าไปดู
* อาจจะมี pop-up ฟ้องคำเตือนบางอย่างเกี่ยวกับเรื่องเวลา ยังไม่ต้องสนใจ

7  เรียกติดตั้ง NTFS-3G อีกครั้ง คราวนี้น่าจะติดตั้งได้ไม่ฟ้องอะไรแล้ว
หน้าจอสุดท้ายจะมีปุ่มให้ restart


8 ตัวสุดท้าย ติดตั้ง fuse_wait version 1.1 (ถ้าไม่เอาไฟล์จากข้อ 1 โหลดได้จาก https://github.com/bfleischer/fuse_wait/downloads) ติดตั้งตัวนี้เพื่อขจัดปัญหา pop-up เตือนเวลาเราเสียบ NTFS drive เข้าไปใหม่

9  Reboot เข้า Recovery mode  เพื่อเปิด คุณสมบัติ SIP (System Integrity Protection) กลับมา
เปิด Terminal app พิมพ์

$ csrutil enable (กด Enter)
แล้ว Reboot Mac

วันศุกร์, ตุลาคม 02, 2558

วิธีย้ายภาพถ่าย ไฟล์วิดีโอ ใน Google Photos ไปอยู่พื้นที่ unlimit ให้หมด | How to move your photos & videos to Google Photo's unlimit space



Google Photos ประกาศให้ upload ภาพและวิดีโอฟรี ได้ไม่จำกัดพื้นที่ โดยเราจะต้องแก้ไขค่า Photo Size หรือ Upload Size ให้เป็น High quality ซะก่อน ไม่งั้นมันก็จะยังใช้พื้นที่ของ Google account ของเราอยู่

ถ้าคุณลงชื่อเข้าใช้ google account อยู่แล้วก็สามารถตรวจสอบพื้นที่ของตัวเองได้จาก
https://www.google.com/settings/storage
ตัวอย่างเช่น Drive ของผม
Screenshot 2015-10-02 13.11.02.png
แต่สังเกตว่า พื้นที่ที่ใช้เก็บภาพ (Google Photos) มันยังไม่ได้คืนมา ยังถูกใช้ไปตั้ง 6.2 GB เห้ย! ผมเปลี่ยนตัวเลือกให้เป็น High quality แล้วนะ ทั้งใน Macbook และในเครื่องมือถือ แสดงว่า Google ไม่ได้ย้ายไฟล์ภาพและวิดีโอก่อนหน้านี้ไปให้ด้วย

ภาพ Google Photos ใน Macbook
Screenshot 2015-10-02 13.12.53.png
ผมอยากได้พื้นที่ตรงนี้คืน ทำไงดี?

หลังจากถกปัญหาแบบนี้กับน้องที่ทำงานเข้าอยากได้ที่คืนเหมือนกัน เราทำแบบนี้ครับ

TL;DR

ถ้าไม่อยากอ่านยาวๆ สรุปวิธีดังนี้
  1. เอา copy Google Photos ลงมาในเครื่องเราให้หมดก่อน มี 2 วิธี
    • ใช้ Google Drive sync เอา Photos ลงมา
    • ใช้ Google Take out ออกมาเป็น compressed file.
  2. นำ copy ที่ได้มา ไปไว้ใน folder ใหม่/หรือแตก compressed file ออกมาใน folder หนึ่ง
  3. ใช้ Google Photos Backup app ในการเอาภาพกลับขึ้นไป โดยเลือก option เป็น High quality

ขั้นตอนที่ 1 Backup ภาพจาก Google Photos ออกมา

วิธีที่ 1 

ติดตั้ง software เหล่านี้ลงเครื่องซะก่อน เลือก OSX หรือ Window เอาให้เหมาะสมกับเครื่องของคุณนะ


Google Drive (website)

  • ใช้ Browser เข้าไปที่ Drive ก่อน (จิ้มที่ link ได้เลยนะ มันจะไปเปิด Drive ให้)
  • ไปที่ Drive settings, หา icon ฟันเฟือง กดมันขึ้นมา จะได้หน้าต่างดังภาพ 
  • หา Option Create a Google Photos folder ติ๊ก checkbox เปิดใช้งาน
Screenshot 2015-10-02 13.21.20.png
  • กดปุ่ม Done 
Google Drive (ที่ดาวโหลดมาติดตั้ง)

  • เมื่อติดตั้งแล้วจะมี icon drive อยู่บน menu bar (ถ้าเป็น window ก็น่าจะอยู่ที่ notification bar) 
  • ให้เปิด Preference มาแก้ไข โดยคลิกที่ icon แล้ว คลิกที่เมนู (3 จุด) แล้ว เลือก Prederences...
drive-preference.jpg
  • ตรวจสอบว่าเราให้ Drive ดึงภาพลงมาในเครื่องของเรา
Screenshot 2015-10-02 13.27.35.png
  • จากภาพข้างบน ถ้าเลือก Everything in My Drive อยู่แล้วก็ไม่ต้องทำอะไร 
  • ถ้าเลือกตัวล่างต้องดูให้มั่นใจว่าเราติ๊ก checkbox Google Photos แล้ว 
  • กดปุ่ม Apply 
  • รอสักครู่ ถ้ากด icon ดูอีกครั้ง ก็น่าจะเห็นว่ามันกำลัง download ของใน Google Photos ออกมาให้เรา
drive-download-photos.jpg
  • ทีนี้ก็รอครับ รอจนกว่ามันจะดูดลงมาอยู่ในเครื่องของเราจนหมด

เมื่อ Google Drive app มันดาวโหลดภาพจาก Google Photos ของเรามาจนหมดแล้ว, แน่ใจแล้วว่าได้ภาพ และวิดีโอครบ เราก็ทำการ backup folder Google Photos ที่อยู่ใน Google Drive ไปไว้ที่อื่นซะก่อน (ไม่ใช้ move ใช้วิธี copy ไปที่ folder อื่น)

แล้วอ่านต่อที่ ขั้นตอนที่ 2

วิธีที่ 2

อัพเดตเมื่อ 3/10/2015

    Google จะมีเครื่องมือให้เจ้าของ account สามารถเอาข้อมูลส่วนตัวของเราออกมาจากระบบเมื่อไหร่ก็ได้ ผ่านทาง Google Take out การ sync ภาพด้วยวิธีแรกจะใช้เวลานานมาก หากมีภาพเป็นจำนวนมาก อย่างของผม 26,953 ไฟล์ (ตัวเองยังงง ทำไมมันเยอะขนาดนี้) การที่เราดาวโหลดเป็นก้อนใหญ่ จะประหยัดเวลากว่าการดาวโหลดทีละภาพทีละอัลบั้มมาก

  เริ่มจากกดเข้าหน้าของ Google Takeout จะเห็นบริการทั้งหมดที่ Google ให้เราเลือกเพื่อ export ออกมาได้
Google takeout main page

ตอนนี้เราจะเอาแต่ภาพ ผมจึงเลือก Select none แล้ว scroll ลงไปสวิตซ์ on แต่ Google Photos 

เสร็จแล้วกดปุ่ม Next 
Google จะ compress ไฟล์ให้เราดาวโหลดไป เราจะต้องเลือกชนิดของไฟล์ก่อน มี zip, tgz, tbz 

และต้องเลือก Delivery method มีให้เลือกสองแบบ เมื่อระบบ compress เสร็จ
1. จะให้ส่งเข้า Google Drive ของเรา หรือ
2. กลับมาดาวโหลดจากระบบ Take out 

พอเลือกแล้วเดี๋ยว Google จะ compress ไฟล์ให้เรา จะใช้เวลามากน้อยขึ้นอยู่กับไฟล์มากไฟล์น้อย 
พอขึ้นหน้าเพจแบบข้างล่าง ก็สามารถปิด browser ไปทำอย่างอื่นก่อนได้ เมื่อเสร็จแล้วระบบจะ email ไปบอก 

เมื่อ(ได้ email แจ้ง)กลับเข้ามาหน้า Google takeout main page ให้กด Manage Archives
เราจะเห็นรายการ archives ที่เรากดสร้างเอาไว้ ประมาณนี้ 

เมื่อกดปุ่ม SHOW DOWNLOADS
อย่างภาพล่างนี้ ผมทดลองเลือกให้เอาไฟล์ Take out archives ที่ compress เสร็จแล้วไปวางที่ Google Drive ส่วนตัวเลย 
แต่พื้นที่ใน Google Drive ไม่พอ อย่างในภาพจะเห็นปุ่ม ทั้งให้เปิดจาก Drive และ Download จากระบบ Take out เอง


จากการทดลองใช้งาน
  • ถ้าไฟล์รวมของเรามีขนาดใหญ่ ระบบ Take out ก็จะแบ่งเป็นไฟล์ย่อยๆให้ 
  • ถ้าเลือกให้ compress เป็น
    • tgz จะได้ไฟล์ที่มีขนาดไม่เกิน 10Gb 
    • zip จะได้ไฟล์ที่มีขนาดไม่เกิน 2Gb ฉะนั้น option นี้อาจจะได้ไฟล์เยอะมาก
ดาวโหลดมาให้ครบทุกไฟล์ และวางไว้ใน folder เดียวกัน ใช้ command line หรือ software ที่สามารถแตกไฟล์ tgz, zip ได้ในการแตกไฟล์

เมื่อได้ไฟล์มาแล้ว
ถ้าใช้ OSX ก็ใช้ Archive utility ในการแตกไฟล์ จะได้ folder ชื่อ Takeout ข้างในก็จะมี Google Photos และภาพของเราอยู่ เป็น album หรือตาม วันเดือนปีที่อัพโหลดขึ้นไป 





ได้ copy ของ Google Photos ครบแล้วก็ต่อที่ขั้นตอนที่ 2

ข้อควรระวัง!
  • อย่าใช้พวก download manager แบ่งส่วนในการดาวโหลด ในแต่ละไฟล์ย่อย Google ยอมให้ดาวโหลด(ซ้ำ)ได้ 5 ครั้งเท่านั้น ถ้าเกินแล้วจะไม่ยอมให้ดาวโหลดแล้ว ต้องสร้าง archive ใหม่
  • ถ้าตั้งชื่อ อัลบั้มภาพเป็นภาษาไทย ให้เลือกใช้ compress file type เป็น zip หากเลือกใช้เป็น tgz หลังจากแตกไฟล์แล้วพบว่า ภาษาไทยเสียหมด และไฟล์ใน folder นั้นก็จะไม่ถูกแตกออกมาด้วย 

ขั้นตอนที่ 2 เอาภาพกลับขึ้น Google Photos แบบ High quality

หลังจากได้ตัว copy ของ Google Photos เรียบร้อยแล้ว ทีนี้เราจะไปลบไฟล์ใน Photos ออก จะทำผ่าน browser หรือ mobile app ก็ได้

ลองตรวจสอบพื้นที่ดูใหม่ พอเป็น 0 แล้ว เราก็จะใช้แอพ Google Photo Backup เอาภาพกลับขึ้นไปใหม่ ตอนเอากลับก็อย่าลืมตรวจสอบว่าเราเลือก option High quality เอาไว้แล้วด้วยนะ

วันพุธ, กันยายน 02, 2558

ปรับ volume ของ mp3 หลายๆไฟล์ให้ดังเท่ากัน ใน OSX | Normalize mp3(s) volume in OSX


    เนื่องจากผมมักจะเอา เพลงประกอบการ์ตูนจาก YouTube clip มาแกะเอาแต่เพลงออกมา ให้ลูกฟังในรถระหว่างเดินทางไปโรงเรียน เครื่องมือในการแกะเอาแต่เสียงจาก YouTube ผมก็เคยเขียนไว้ใน post นี้.

  ปัญหาคือแต่ละ clip มีเสียงดังไม่เท่ากัน ผมต้องทนเอื้อมมือไปบิดปรับเสียงให้ดังให้ค่อยแล้วแต่เพลงเอา ทนทำไปนานๆเข้าเลยคิดว่านี่มันไม่ productive เลย ต้องหาเครื่องมือซะแล้ว

 วันนี้ขอแนะนำ MP3Gain ชื่อเต็มๆเค้าสำหรับ OSX คือ MP3Gain Express for Mac OS X ซอฟต์แวร์ตัวนี้ทำหน้าที่ปรับเดซิเบล หรือความดังของ mp3 file ได้

  วิธีใช้งานมีสองวิธีใช้ brew ก็จะสั่งปรับ volume ด้วย command line ซึ่งผมไม่ได้ทำ command มันเยอะเกิ๊น หรือ จะโหลดเป็น GUI มาใช้งานก็ง่ายดี โหลดเอาได้จาก website ที่กล่าวถึงด้านบนเลยได้เลยครับ

ภาพนี้คือใช้งานแบบ GUI เราสามารถ drag file ลงไปได้เลย


กดปุ่ม Analyze Only เพื่อให้เค้าวิเคราะห์ว่าแต่ละไฟล์ที่ลากลงไปมันมี volume อยู่ระดับไหน ใน column Track gain ก็จะบอกเราว่า ไฟล์นั้นๆจะต้องเพิ่มหรือลดเสียงเพื่อให้ได้ตาม volumne ที่กำหนดไว้ ค่าเริ่มต้นคือ 89 เดซิเบล

กดปุ่ม Apply Gain มันจะทำการปรับ volume ลงไปในไฟล์เลย โดยหากกด analyze อีกครั้งก็จะเห็นว่าจะได้ volume ใกล้เคียงค่าที่กำหนดไว้มากที่สุด คือไม่ 89 พอดี ก็อาจจะเป็น 88.9 

เรียบร้อย พรุ่งนี้ไม่ต้องคอยปรับ volume ขึ้นๆลงๆแล้ว เย้!

วันพฤหัสบดี, สิงหาคม 27, 2558

5 สิ่งที่ควรทำหลังลง OSX ใหม่

Imgur

ถ้านับจริงๆมันก็เกินล่ะครับ :P ขอใช้เลข 5 ให้ title มันสวยๆก็แล้วกัน

โพสนี้เป็นเหมือน checklist ที่ผมจะทำหากต้องติดตั้งหรือลง OSX ใหม่ (คือไม่ได้ upgrade แต่เนื่องจาก format harddisk เปลี่ยน harddisk ฯ)

ซอฟต์แวร์ส่วนใหญ่ในนี้จะเป็นของโปรแกรมเมอร์ซะส่วนใหญ่ แต่ถ้า คนอ่านที่หลงเข้ามาไม่ใช่สาย IT ผมก็คิดว่าซอฟต์แวร์บางตัวก็มีประโยชน์กับอาชีพอื่นๆ นอกจากโปรแกรมเมอร์เช่นกัน
ขั้นตอนการติดตั้งซอฟต์แร์ต่างๆ จำเป็นต้องใช้ internet ฉะนั้นก่อนจะพิมพ์คำสั่ง แล้วกด Enter ให้แน่ใจว่าเชื่อมต่อ internet อยู่นะครับ

1 ซอฟต์แวร์พื้นฐาน


Trim Enabler
Trim Enabler ผมใช้ SSD solid state drive จึงต้องลงตัวนี้ก่อน เพื่อ enable TRIM
เจ้า TRIM คืออะไรเอาง่ายๆคือ มันจะทำให้ประสิทธิที่ภาพการเขียนลง SSD disk ดีอยู่เสมอ อาจจะเห็นว่ามันแสดง 10USD โหลดมาเถอะครับ สิ่งที่เราต้องการไม่ต้องเสียเงิน เค้าคิด 10$ หากต้องการใช้ full feature

เขียนอ่าน NTFS partition/drive ได้
ตัวนี้ วิธีทำให้ OSX 10.10 Yosemite อ่าน/เขียน NTFS ได้ ของผมยังคงใช้งานได้อยู่

ohmyzsh
ตัวนี้ผมเรียกว่าเป็น shell utility ทำให้การใช้งาน command line สะดวกสบายขึ้นเยอะ
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริมการติดตั้ง
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
ติดตั้งแล้วก็ config มันหน่อย แก้ไข ~/.zshrc
ZSH_THEME="gnzh”
...
plugins=(git sublime osx)
ZSH theme จะเกี่ยวกับเรื่อง สีสันใน terminal และตัว prompt ของเรา
plugin 3 ตัวนี้

git เวลาอยู่ใน directory ที่เป็น Git repository มันจะแสดง prompt ให้เราเห็นชัดเจนเลย ว่าตอนนี้อยู่ใน Git repo แล้วอยู่ branch ไหนก็บอกได้ด้วย

sublime ตัวนี้ลงไว้เพื่อ พิมพ์ subl ชื่อไฟล์ แล้วมันจะเปิด Sublime Text พร้อมไฟล์ที่เราใส่เข้าไปให้เลย

osx เวลาเรานึกหรือขี้เกียจพิมพ์ option ต่างๆ กด tab แล้วมันจะช่วยแสดงออกมาให้
และหากใช้ macbook ต่อกับ window keyboard แบบผม คุณจะใช้ numpad ใน terminal ไม่ได้ ถ้าไม่ได้ใส่ configuration แบบข้างล่างนี้เข้าไปใน ~/.zshrc ด้วย
# 20150102 zsh numpad binding
# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[On" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"
เวบไซด์อย่างเป็นทางการ ohmyz.sh

Command line tools
ตัวนี้จำเป็นสำหรับ ขั้นตอนต่อไป พิมพ์คำสั่งข้างล่างนี้ใน Terminal app
$ xcode-select --install

Homebrew
เค้าเรียกกันว่ามันคือ package manager ที่สาบสูญของ OS X
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริ่มการติดตั้ง
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew จะทำให้เราสามารถใช้คำสั่งเหมือนที่ใช้ใน linux อย่าง Ubuntu ได้ง่ายๆ คือเรียกเอามาติดตั้งได้ง่ายๆ ถ้าอยากจะลง package เช่น subversion, node, iojs พอลง brew เสร็จ มันก็จะลงเจ้าพวกที่ว่ามานี้ได้ง่ายมั่ก
เวบไซด์อย่างเป็นทางการ brew.sh

2 ซอฟต์แวร์สำหรับโปรแกรมเมอร์


Java (JDK)
ณ เวลาที่เขียนนี้ เพิ่งมารู้ว่า Oracle ไม่เปิดให้ download JDK 7 สำหรับบุคคลทั่วไปแล้ว จะต้องเสียเงินถึงจะเข้าไป download ได้ (อยู่ใน section Java SE Support)
ไปดาวโหลด JDK 8 ได้จาก ที่นี่ Java download ได้ dmg มาแล้วก้อ click ขวา open แล้วทำตามขั้นตอนไปตามที่เค้าแนะนำครับ
รวม FAQ https://www.java.com/en/download/faq/java_mac.xml หากอยากถอยไปใช้ Java 6 ก็มีลิ้งบอกวิธีอยู่

ถ้าพัฒนางานด้วย Java จะไม่ติดตั้ง 2 ตัวนี้คงไม่ได้

Java build tools: Ant, Maven
  • Dowload Ant เลือกตัวที่เป็น .tar.gz archive
  • Download Maven เลือกตัวที่เป็น Binary tar.gz archive
ผมชอบที่จะเอา software tools เหล่านี้เอาไว้ที่เดียวกัน ที่ apps folder /Users/dahoba/apps
เมื่อแตกไฟล์ distribution ของทั้ง 2 ตัวแล้วก็ต้องมาเซต PATH ให้มันด้วย ใน ~/.zshrc
...
export ANT_HOME=/Users/dahoba/apps/apache-ant-1.9.6
export M2_HOME=/Users/dahoba/apps/apache-maven-3.3.3
...
export PATH=$PATH:$ANT_HOME/bin:$M2_HOME/bin
...

อื่นๆ ที่ขาดไม่ได้
ถ้ายังไม่มีตัวติดตั้งก็กดที่ลิ้งเพื่อ download ได้เลย

3 ซอฟต์แวร์เพื่อ Productivity


Mozilla Thunderbird อีเมล client หนึ่งในดวงใจ มันเชื่อม Address book เข้ากับ Active directory/LDAP ที่ทำงานผมได้ด้วย

iTerm2
เป็น terminal app ที่ OS X ควรจะเป็น ผมชอบตรงที่มัน split ช่องได้ด้วย keyboard shortcut iTerm2 download

Slate
Utility ตัวนี้ก็ว่ากันว่าเป็น window manager ที่สาบสูญไปจาก OSX อีกเช่นกัน
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริ่มการติดตั้ง
$ cd /Applications && curl http://www.ninjamonkeysoftware.com/slate/versions/slate-latest.tar.gz | tar -xz

Slate นี่มันต้อง config เหนื่อยหน่อยนะครับ ของผมดูแนวทางจาก Tristan Hume blog นี้
ของผมเป็นแบบนี้

ถ้าใครอยากได้ที่มันง่ายๆกว่านี้ ก็ลองหาดู Divvy, Moom, ตัวนี้ฟรี Spectacle

ไฟล์ส่วนตัวใน Cloud

4 เครื่องมือสื่อสารกับทีม


เครื่องมือสื่อสารกับทีม
  • Skype,
  • LINE
  • Google Hangouts
สองตัวหลัง ไม่ต้องติดตั้ง ผมใช้งานใน Chrome เลย

5 Configuration


ปรับการใช้งาน touchpad
ใช้งาน 3 นิ้วพร้อมกันได้ Imgur
ไม่ใช้ natural scroll Imgur
ปรับเวลาเป็นแบบ 24 ชั่วโมง Imgur
ทำ lock icon บน menu bar เวลาจะลุกจากที่นั่งผมชอบที่จะต้อง lock computer เอาไว้ ทำ icon ไว้ตรงนี้จะทำให้สะดวกขึ้นมาก
Imgur
วิธี:
  • เปิด app “Keychain Access” จะใช้ spotlight ค้นหาหรือจะใช้ Finder ก็จะอยู่ใน /Applications/Utilities.
  • เลือก “Show Status in Menu Bar” จากเมนู View
  • ทีนี้เราจะได้ lock icon ที่ menu bar แล้ว ใช้ Lock the screen เพื่อ lock screen เมื่อกลับมา ลาก mouse หรือกด key อะไรๆก็ได้ มันจะถาม password ก่อนจะอนุญาตให้กลับเข้ามาใช้งานได้
ทำครบ checklist พร้อมกลับไปทำงานแล้วล่ะครับ :D

วันพฤหัสบดี, สิงหาคม 06, 2558

แก้ปัญหา maven dependency: spring-boot 1.2.5 กับ JSTL และ Jasper Reports

แก้ปัญหา maven dependency: spring-boot 1.2.5 กับ jstl 1.2.1 และ jasperreports 6.1

เนื่องจากมีน้องเดินมาให้ช่วยดูให้หน่อยว่าทำไมเค้าใส่ dependency ใน pom ของเค้าแล้วมันมีปัญหา เค้าอยากจะใส่ jstl กับ jasper report เข้าไปใน spring-boot project ของเค้า

บางส่วนของ pom ที่เรียกใช้งาน spring-boot 1.2.5

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
</parent>
...
<dependencies>
...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>   
...
</dependencies>
  • dependency ตัวนี้ org.springframework.boot.spring-boot-starter-web จะดึงเอา tomcat embeded version 7 มาให้อยู่แล้ว

JSTL dependency

เริ่มโดยน้องเค้าใส่

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency> 
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId> 
</dependency>
  • JSP 2.3 มากับ Tomcat 8 แต่ spring-boot 1.2.5 ใช้ embedded tomcat 7 classes มันน่าจะไม่ compatible กันละ
  • JSTL จาก group id javax.servlet เป็น version 2.0 ซึ่งหากดูใน web site เค้าก็บอกว่ามันย้าย group id ใหม่แล้ว javax.servlet.jsp.jstl
  • JSTL 2.0 มัน depend กับ jsp-api 2.0 ซึ่งมันก็ขัดกับ jsp-api ที่ระบุเอาไว้ก่อนหน้าอีก

ทีนี้ผมเลยพยายามจะใส่ JSTL 1.2.1 ใหม่ล่าสุดลงไป

ลบ dependency สองตัวข้างบนออกซะ แล้วใส่แบบนี้ลงไปใน pom

<dependencies>
...
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
...
</dependencies>
  • ใส่ org.apache.tomcat.embed.tomcat-embed-jasper เข้ามาด้วยเพราะว่าตัวนี้จะดึงเอา jsp-api ที่เหมาะสมมาให้เราด้วย, ถ้าจะใช่ jstl ต้องมี jsp-api (javax.servlet.jsp) ตัว spring-boot-starter-web เราได้มาแต่ servlet-api (javax.servlet)

พอทดสอบ $ mvn spring-boot:run กลับรันหน้า jsp ของเราไม่ได้ ลองมาเปิด jar ที่อยู่ .m2 ดู ปรากฎว่า jar ที่ได้จาก artifactId jstl มันเป็น jar เน่า มี classes ใน package name ด้วย :( ทำไง ... google ต่อ

คนนี้เค้าบอกวิธีที่ใช้ได้เอาไว้ที่ SO นี้ ขอบคุณครับ ;)

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <exclusions>
        <!-- jstl-api was adding selvlet-api 2.5 and jsp-api -->
        <exclusion>
            <artifactId>jstl-api</artifactId>
            <groupId>javax.servlet.jsp.jstl</groupId>
        </exclusion>
    </exclusions>
</dependency>

ต้องไปเอา jstl library จาก groupId ของ glassfish แทน

ต่อมาอยากได้

JasperReport 6.1

จะเอา jasper report ใส่ใน project maven ใส่แบบนี้

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.1.0</version>
</dependency>  

มีปัญหาว่าพอให้ maven update dependency มันหา olap4j library ไม่เจอ ใน ecilpse ฟ้องแบบนี้ Missing artifact org.olap4j:olap4j:jar:0.9.7.309-JS-3

ลองกดดูที่ maven central ตาม URL นี้ org.olap4j » olap4j ก็จะเจอ 404 file not found !! ห๊ะ

[404]

Not Found: /artifact/org.olap4j/olap4j/0.9.7.309-JS-3

งงอยู่ซักแพ๊บ google ต่อ มาเจอ คำตอบ ที่นี่เอง

ใน community ของ jaspersoft ว่าเราจะต้องเพิ่ม URL repository ตัวนี้เข้าไปใน maven's proxy ของเราด้วย http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/

เมื่อไปเพิ่ม URL ข้างต้นใน Artifactory virtual repository แล้วก็ update dependency ใหม่อีกครั้ง ที่นี้ก็ทำงานต่อได้แล้ว

เผอิญว่าที่ทำงาน ผมตั้ง Artifactory server เป็น maven proxy เอาไว้ ก็เลยเจอปัญหานี้ หาก maven ได้วิ่งออก internet ตรงๆ ก็คงไม่เป็นไร

วันพุธ, กรกฎาคม 29, 2558

ทำยังไง...ศึกษา Spring Boot ด้วยตัวเอง

โพสนี้มีจุดประสงค์เผื่อใครที่พอจะคุ้นเคยกับ spring framework อยู่แล้ว อยากจะศึกษา Spring Boot จะได้มีแนวทาง/แหล่งศึกษาด้วยตัวเอง

สืบเนื่องจากใน facebook group THJUG คุณ Kong Jirawong จะเปิดสอนเรื่อง Spring Boot กันฟรีๆ แต่ลงทะเบียนไม่ทัน ได้แต่ course outline มาว่าจะสอนอะไรมั่ง

fb2 fb1

เลยทดลองไปค้นๆดูว่าจะเรียนเรื่องเหล่านี้ได้จากที่ไหน

Course Outline โดย คุณ Kong Jirawong (คัดลอกมาเมื่อวันที่ 29/07/2015)
https://www.eventbrite.com/e/links-day-java-spring-boot-application-tickets-17926457517

ผมแทรก link สำหรับไปศึกษาหรือทำตาม ล้อหัวข้อใน course outline ดังนี้

Course Outline

รู้จักกับ Spring Boot

  • ทำไมต้อง Spring Boot?
  • เตรียมความพร้อมก่อนเริ่ม
  • สร้าง Spring Boot Project ด้วย Maven
  • โครงสร้างของ Maven Project
  • การ Build Spring Boot Project โดยใช้ Maven

การสร้าง project ด้วย maven จะมีอยู่ในตอนต้นของทุก tutorials ใน spring.io/guides แล้ว

Web Interface and Rest Interface

  • รู้จักกับ Controller ของ Spring
  • สร้าง Web Interface ด้วย template engine Thymeleaf
  • รู้จักกับ RestController ของ Spring
  • สร้าง Rest Interface ใน Spring Boot
  • การสร้างและใช้งาน Validate ใน Spring
  • รู้จักกับ Custom Validator และการประยุกต์ใช้

Bean validator

Unit Test and Integration Test

  • รู้จักกับ Test ใน Spring Boot
  • วิธีการเขียน Unit test และดูผลลัพธ์
  • วิธีการเขียน Integration Test และดูผลลัพธ์
  • การเขียนโดยใช้ Mock Framework ด้วย Mockito และ PowerMock

Spring's bookmarks tutorilas นี้มีสอนเรื่องการทำ unit test

Integration test example

Spring Data JPA

  • รู้จักกับวิธีการเชื่อมต่อและใช้งาน Database ผ่าน JPA บน Embedded database
  • รู้จักกับ Repository วิธีการสร้างและวิธีใช้งาน
  • เรียนรู้วิธีการใช้ Query Method ของ Spring Data JPA
  • วิธีการใช้งาน JPQl ร่วมกับ Spring Data JPA
  • รู้จักกับ Query Specification กับการแก้ปัญหา Query ที่ซับซ้อน
  • เรียนรู้วิธีการเชื่อมกับ MySql Database

เชื่อมกับ mysql ยังไง? แค่เพิ่ม dependency ใน pom, เปลี่ยน driver class name.

Spring Security

  • เรียนรู้วิธีการใช้ Spring Security ร่วมกับ Spring Boot
  • สร้างหน้า Login แบบง่ายโดยใช้ Inmemory Database
  • เรียนรู้วิธีการสร้างหน้า Form Login และการ Custom Form
  • รู้จักกับ UserDetails และ UserDetailsService ใน Spring Security
  • การ Login ด้วยข้อมูลจาก Database Mysql
  • ประยุกต์การใช้งาน Spring Boot สร้างเว็บแบบง่าย

ข้อเสียของการเรียนเอง กับการให้คนที่รู้แล้วสอน คือต้องใช้เวลามากหน่อย ไม่มีคนมาตอบคำถามให้ทันทีทันใด สงสัยตรงไหน หาคำตอบเองแล้วไม่เจอ ก็เอาไปคุยกันใน facebook's group THJUG ได้ มีผู้รู้คอยช่วยเหลือ

ตามที่คุณก้องกำหนดไว้ outline เหล่านี้จะจบใน 12 ชั่วโมง แต่ถ้าเรียนเองเล่นเอง ผมว่าคงต้องใช้เวลานานกว่านั้น

ถ้าอ่านมาจนถึงนี้ คงคิดเหมือนกันสิ่นะครับว่า น่าจะได้ไปเรียนสดๆกับผู้รู้เนอะ

วันพุธ, กรกฎาคม 22, 2558

Tools น่าใช้สำหรับ Android developer (LeakCanary, Fresco) และความเปลี่ยนแปลงของ String API ใน Android M

เมื่อเช้านี้อ่าน blog น่าสนใจ 3 เรื่อง

LeakCanary  เครื่องมือตรวจจับ memory leaked ใน android app ของเรา

Fresco facebook ทำ tools สำหรับการแสดงภาพในแอพ android ของเรา ไม่ต้องกังวลเรื่อง OOM 

Dude, Where's My char[]? เรื่องที่ว่า String API source code ใน Android M ไม่เหมือนกับแต่ก่อน ไม่มี char array แล้ว การ optimize นี้เป็นประโยชน์ ทำให้การทำงานกับ String เร็วขึ้น(แอพก็ใช้ String มากมายอยู่แล้ว)

แต่ตอนนี้ไม่ได้พัฒนา Android เลย คงยังไม่ได้ใช้ tools 2 ตัวนี้ -_-

วันจันทร์, กรกฎาคม 20, 2558

แก้ปัญหา ส่ง parameter ภาษาไทยด้วย RESTful GET กับ tomcat-maven-plugin

ปัญหามันเกิดจากค่า default uriEncoding ของ tomcat จะเป็น ISO-8859-1 (ตัวอักษรอังกฤษเท่านั้น) ถึงเราจะใช้ servlet filter เช่น org.springframework.web.filter.CharacterEncodingFilter กำหนดไว้ที่ web.xml แล้วก็ตาม เราจะต้องกำหนด uriEncoding ของ tomcat connector เป็น UTF-8 ด้วย

วิธีแก้ไข คือบอก tomcat ให้ใช้ uriEncoding เป็น UTF-8 ด้วย property นี้ maven.tomcat.uriEncoding

ซึ่งทำได้หลายวิธีดังนี้

วิธีที่ 1. ใส่ property เวลา execute mvn tomcat:run

 $ mvn tomcat:run -Dmaven.tomcat.uriEncoding=UTF-8  

วิธีที่ 1 มันเปลืองพลังงานการพิมพ์ นำมาสู่วิธีที่ 2

วิธีที่ 2. ใส่ไว้ที่ pom.xml ในส่วนที่เราประกาศใช้งาน tomcat-maven-plugin

<project>
  ...
  <build>
    ...
    <plugins>
      ...
    <plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
  <uriEncoding>UTF-8</uriEncoding>
</configuration>
   </plugin>
    ...
    </plugins>
    ...
  </build>
  ...
</project>

ข้อสังเกต หากทำแล้วก็ยังใช้งานไม่ได้อีก ให้สังเกตดูที่ console เวลา log มันวิ่งไป ว่า maven มันใช้งาน tomcat-maven-plugin ตัวไหนกันแน่

[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) @

ซึ่งหากเป็นแบบนี้ คือมันดันไปเอา tomcat plugin version 1.1 มาใช้ แทนที่จะเอา version 2.2 ตามที่เรา config เอาไว้ใน pom ข้างต้นแล้วล่ะก็ มันก็เท่ากับว่าเรา config ผิดตัวน่ะสิ่ -_-” แสดงว่ามันมี dependencies บางตัวที่ไปดึงเอา tomcat คนละตัวมา

ถ้าไม่อยากแก้ไข pom เรายังมีไม้สุดท้าย วิธีที่ 3

วิธีที่ 3. กำหนด properties เป็น global ไปเลย

<project>
  …
<properties>
…
<maven.tomcat.uriEncoding>UTF-8</maven.tomcat.uriEncoding>
…
</properties>
  ...
</project>

หากสังเกตดูจะพบว่าการที่เรากำหนด configuration ต่างๆใน properties tag เนี่ย จะเหมือนกับที่เราใส่ตอนที่ execute ใน command line แล้วใส่ -D เลย

ฉะนั้นหากจะต้องมาพิมพ์ใส่ -D หลายๆตัวใน command line มันก็ดูเยอะ เลอะเทอะ ย้ายเอามาใส่ใน properties tag นี้ ได้นะเออ

Happy Coding ^ ^

วันพฤหัสบดี, กรกฎาคม 16, 2558

ติดหนึบ vi มาใส่สีให้ vi กันเถอะ (Editing file with vi in colors)

ใช้งาน terminal บ่อยๆ เวลาเปิดแก้ไขไฟล์ด้วย vi หรือ vim แล้วมันเป็นสีเดียวกันหมด มันก็ดูลำบาก

ภาพเดิม

อ่อๆ คำสั่งและภาพเป็นการทำบน Ubuntu นะครับ OSX ก็ใช้ได้ น่าจะมีทั้ง vi, git มาแล้วซะด้วยไม่ต้อง download แล้ว

ไม่พูดมากแล้ว เรามาลงมือใส่สีให้ vim กันเลย

เราจะต้องใช้ git client ด้วย ถ้าไม่มีก็ติดตั้งก่อน

$ sudo apt-get install git -y

คนที่ใจดีทำแจกก็นายคนนี้ chriskempson opensource เอาไว้ที่ github

ตัวถาดสีของ vim จริงๆก็มีหลายเจ้าที่ทำเอาไว้ แต่ผมถูกใจของคนนี้ที่สุด ถ้าสนใจจะลองตัวอื่นก็ลอง google ดู vim colors ที่นิยมกันมากๆ ก็มี solarized

อ่าว ถ้าจะใช้ vi แต่ยังไม่มีก็ไม่ได้ใช่มั้ย ติดตั้งก่อน ถ้าเกิดยังไม่ได้ลง

$ sudo apt-get install vim -y

ต่อมาเตรียม directory .vim/colors

$ mkdir -p ~/.vim/colors

change dir เข้าไปเลย

$ cd ~/.vim/colors

ทำการ download ชุดสี base16

$ git clone git://github.com/chriskempson/base16-vim.git base16

ถ้าเอาเร็วก้อ copy มันทุกสีเลย

$ cp base16/colors/*.vim .

หรือ จะเลือกเฉพาะตัวที่ชอบก็ได้ (อย่างผมเอาแค่สองตัวนี้)

$ cp base16/colors/base16-tomorrow.vim .
$ cp base16/colors/base16-google.vim .

แก้ไข ~/.vimrc ถ้าไม่มีก็สร้างซะครับ จะใช้ text editor อะไรก็ได้ ผมใช้ vi นี่แหละ

$ vi ~/.vimrc 

เพิ่ม 2 บรรทัดนี้เข้าไป ข้างหลัง colorscheme ก็เลือกเอาตามชื่อไฟล์ที่อยู่ใน base16/colors/ แล้วตัด .vim ออก

set background=dark
colorscheme base16-tomorrow

ณ ตอนนี้มีให้เลือกตามนี้ หรือจะไปดูแบบ online ได้ที่นี่เลย

base16-3024.vim base16-brewer.vim base16-google.vim base16-ocean.vim base16-apathy.vim base16-bright.vim base16-grayscale.vim base16-paraiso.vim base16-ashes.vim base16-chalk.vim base16-greenscreen.vim base16-pop.vim base16-atelierdune.vim base16-codeschool.vim base16-harmonic16.vim base16-railscasts.vim base16-atelierforest.vim base16-colors.vim base16-isotope.vim base16-shapeshifter.vim base16-atelierheath.vim base16-default.vim base16-londontube.vim base16-solarized.vim base16-atelierlakeside.vim base16-eighties.vim base16-marrakesh.vim base16-summerfruit.vim base16-atelierseaside.vim base16-embers.vim base16-mocha.vim base16-tomorrow.vim base16-bespin.vim base16-flat.vim base16-monokai.vim base16-twilight.vim

กด :wq ออกมา ทดลองเรียกใช้งาน vi ใหม่

$ vi ~/.bashrc 

ทะด๊า..า

ภาพใหม่ หลากสีเลย

Happy Coding!

วันพุธ, กรกฎาคม 08, 2558

วิธีอัพ HTC One กลับเป็น ROM ศูนย์ 100% (ลบ tampered, relocked จาก hboot 1.54)

Imgur

เผยแพร่ครั้งแรก ที่ droidsans.com

เนื่องจากจะต้องเอาเครื่อง htc one ไปเคลมกล้อง ไอ่เราก็ไม่คิดว่าจะมีวันนี้
และสืบเนื่องจาก ศูนย์บริการ HTC Thailand เคยบอกผมว่า

ถ้าเครื่องคุณ bootloader ขึ้น TAMPERED, RELOCKED แบบนี้
จะถือว่า rooted และหมดประกัน (จะซ่อมแบบเปลี่ยน mainboard เท่านั้น)

เครื่องผมตอนนี้ hboot เป็น version 1.54 ซึ่งจะใช้ revone มาแก้ tempered, relocked ไม่ได้

วิธีทำสำหรับ HBOOT 1.44 คุณ rakyim เขียนไว้ ที่นี่
[updated] ท่านที่ทำ superCID ไปด้วย มีวิธีทำกลับให้เป็น HTC__044 ให้ดู โพสของคุณ rakyim (บรรทัดข้างบน)

ขอบันทึกขั้นตอนไว้ที่ droidsans แห่งนี้ เผื่อมีคนต้องการจะทำบ้าง แล้วไม่รู้จะไปทางไหนดี smile

คำเตือน! อ่านและศึกษาให้เข้าใจก่อนลงมือทำ การกระทำขั้นตอนตามโพสต์นี้จะทำให้ข้อมูลของคุณ ในเครื่องหายหมด (เหมือนใหม่แกะกล่อง จะมีก็แต่ของที่ htc ให้มา)

เครื่องมือที่ใช้

RUU เลือกตัวนี้
RUU Zip M7 U JB 50 HTC Asia WWE 1.29.707.4 R Radio 4A.14.3250.13 10.33.1150.01 Release 312087 Signed 2 4 Decrypted

File Size: 1005.8 MiB - Downloads: 4656
MD5: 9b1c26b17e5ebabff176e18caeb13190

TL;DR ขั้นตอนแบบคร่าวๆ

  • ทำ S-OFF
  • Reset bootloader เพื่อลบคำว่า TAMPERED, RELOCKED
  • Flash RUU (ROM ศูนย์)
  • ทำ S-ON

ขั้นตอนการทำ

  1. วิธีทำกลับ ROM ศูนย์ที่ง่ายที่สุดคือ flash RUU กลับ แต่ว่าถ้าเครื่องเราเป็น S-ON มันจะทำไม่ได้ แล้ว
    เครื่องเรา มี HBOOT version 1.54 จะทำ S-OFF ด้วยวิธีง่ายโดยใช้ revone ไม่ได้อีกเช่นกัน เราจะใช้ rumrunner
  2. โหลด rumrunner มาให้พร้อมครับ, ตอนที่ใช้นี้เป็น version universal 0.5
  3. การจะใช้ rumrunner ได้
    ต้องมี internet ที่ใช้งานได้
    เครื่องจะต้อง OEM unlock หรือ rooted ก่อน และ Window ของเราจะต้องใช้ คำสั่งพวก adb, fastboot ได้ด้วย
    เปิด USB debugging ที่เครื่อง HTC One
    Fast boot disabled ที่เครื่อง HTC One settings -> Power-> un-check "fast boot”
    วิธี rooted ไม่บอกแล้วนะครับ (สำหรับอ้างอิง: ผมใช้ TWRP 2.6.3.3 กับ SuperSU v1.65 ของ clockworkmod)
  4. ข้อสำคัญของการรัน rumrunner เครื่อง window ต้องปิด firewall และ ปิด antivirus ในระหว่างที่เรียกมันทำงาน
  5. Double click soju.exe เพื่อเป็นการเรียกทำงาน
  6. เมื่อทำ S-OFF ด้วย rumrunner สำเร็จ ต่อไปเราจะ reset bootloader กัน
  7. Flash Guru_Bootloader_Reset_1.0.zip ด้วย TWRP recovery *ดูหน้าจออย่างละเอียดได้จากเวบต้นทางนะครับ
  8. ตอนเลือก option ให้เลือก remove TAMPERED กับ LOCK Bootloader
    Imgur
    *ภาพจาก htc1guru
  9. เมื่อเสร็จแล้วลอง boot เข้า bootloader ตรวจสอบได้ TAMPERED จะหายไปและมีคำว่า LOCKED (ไม่ใช่ RELOCKED) แล้ว

ต่อไปเราจะ Flash RUU เพื่อกลับ ROM ศูนย์แล้ว

  • เตรียมไฟล์ RUU Zip M7 U JB 50 HTC Asia WWE 1.29.707.4 R Radio 4A.14.3250.13 10.33.1150.01 Release 312087 Signed 2 4 Decrypted.zip เอาไว้
    *เราอาจจะเปลี่ยนชื่อยาวๆนี้เป็น RUU.zip สั้นๆก็ได้

เรียกคำสั่ง

adb reboot-bootloader

พอเข้าหน้า fastboot แล้ว เราจะสั่ง

fastboot oem rebootRUU

ทีนี้เราจะเห็นหน้าจอพิ้นสีดำ ตัวหนังสือ htc สีเงิน

fastboot flash zip RUU.zip

จะเห็นคำว่า FAILED อย่าตกใจครับ เราจะต้องสั่งคำสั่งเดิมอีกครั้ง

fastboot flash zip RUU.zip

สังเกตที่ตัวเครื่อง ปรอทสีเขียวจะเพิ่มขึ้นเรื่อยๆ พอมันทำเสร็จ สังเกต prompt ใน cmd มันจะกลับมาให้พิมพ์ได้อีกครั้ง

เราจะสั่ง reboot ได้แล้ว

fastboot reboot

reboot กลับมา จะใช้เวลา boot นานหน่อยครับ อย่าตกใจ wink

เราจะได้ ROM ศูนย์ เหมือนตอนซื้อแกะกล่อง เหมือนเมื่อตอนมันออกวางตลาดเดือนแรกแล้วครับ (android 4.1.2)

สั่งคำสั่ง เข้า bootloader อีกครั้ง

adb reboot-bootloader

เราจะเห็นว่า HBOOT เรากลับมาเป็น version 1.44 แล้ว เยส..ส joy

ถ้าทำ super CID ไว้ด้วย หลังจากได้ HBOOT 1.44 มาแล้ว ก็น่าจะทำตามโพสคุณ rakyim เพื่อทำกลับมาเป็น cid ของบ้านเราได้ หลังจากทำ CID กลับมาแล้วค่อยทำขั้น 13 ต่อไป

  1. สั่งคำสั่งเพื่อเปลี่ยน S-OFF เป็น S-ON
    fastboot oem writesecureflag 3
  2. ทดลอง reboot เข้า bootloader อีกครั้ง เพื่อดูว่า S-OFF กลับเป็น S-ON แล้ว
    เรียบร้อยเสร็จพิธีครับ พาเครื่องไปใช้งาน หรือเข้าศูนย์เพื่อเคลมได้เลย
    เมื่อเรา boot เข้าใช้งานปกติ ก็มาเริ่ม update ROM ผ่านทาง OTA เพื่อ upgrade เป็น 4.2.2 ได้

ถ้าสงสัยตรงไหนหรืออยากปรึกษา ทิ้งข้อความไว้ หรือ hangout มาคุยกันได้ครับ
contact

วันพฤหัสบดี, กรกฎาคม 02, 2558

ประโยคที่ใช้อักษรภาษาไทยครบทุกตัว - Thai pangram




ประโยคที่ผมพาดหัวไว้มีชื่ออย่างเป็นทางการคือ pangram คำกรีกแปลว่า อักษรทุกตัว
ที่มา wikipedia
สำหรับประโยคภาษาอังกฤษ อาจจะคุ้นๆตากันอยู่ พวก software จัดการฟอนต์นำมาใช้กัน
The quick brown fox jumps over the lazy dog
ภาษาไทย มี 2 แบบ
แบบที่ 1 คำกลอน
เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน
จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร
ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย
ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋า น่าฟังเอยฯ
แบบที่ 2
นายสังฆภัณฑ์ เฮงพิทักษ์ฝั่ง ผู้เฒ่าซึ่งมีอาชีพเป็นฅนขายฃวด ถูกตำรวจปฏิบัติการจับฟ้องศาล ฐานลักนาฬิกาคุณหญิงฉัตรชฎา ฌานสมาธิ

วันศุกร์, มิถุนายน 26, 2558

บันทึก การ build และแก้ปัญหา เพื่อลง GitHub's friends บน Mac OSX

จะลองติดตั้ง GitHub friends, P2P chat powered

friends เป็น chat application ที่ใช้ technology ของ P2P (แบบเดียวกับ bittorrent)
GUI ใช้ electron หรือ atom-shell ที่ github ใช้สร้าง Atom editor และปล่อย open source ด้วย ไปอ่านความเจ๋งของมันได้ที่ site ของเค้าได้เลย ที่นี่

วันนี้มาทดลอง build เล่นดีกว่า เพราะหา binary release ไม่เจอ -_-

ก่อนจะเริ่ม build ต้องมีบัญชีกับ github ก่อน (เค้าบอกว่าในช่วงแรกใช้แบบนี้ไปก่อน)

ติดตั้ง module ที่ต้องใช้ในการตรวจสอบก่อน

$ npm i github-current-user -g

ทดสอบว่า github เชื่อมต่อกับ account เราได้หรือยัง

$ DEBUG=* github-current-user

  ghsign SSH_AUTH_SOCK +0ms /private/tmp/com.apple.launchd.G4BHMbX15X/Listeners
  github-current-user username from .gitconfig: dahoba +47ms
  github-current-user signing with "dahoba" +3ms
  ghsign ssh-agent public keys ...

ถ้ามีปํญหาที่ขั้นตอนนี้ให้ลองตรวจสอบว่า git config username ของเราตรงกับ github account ของเราหรือยัง

$ git config --global user.username
dahoba

อย่างตัวอย่างนี้ก็ต้องได้ account ผมใน github ออกมา ถ้ายังไม่ตรงต้องแก้ซะก่อน

เมื่อ clone ลงมาแล้ว ก่อนจะเริ่ม คำสั่งแรก ถ้ายังไม่มี leveldb ในเครื่องให้ลงก่อน วิธีติดตั้งที่สะดวกสำหรับผมคือใช้ Homebrew

$ brew install leveldb

พอจะสั่ง build step ที่ 2 npm run rebuild-leveldb เจอ error ก็เพราะว่า npm ในเครื่องเก่าไป เค้าต้องการ npm version ที่สูงกว่าหรือเท่ากับ 2.8.3

เราต้องติดตั้ง npm iojs node เป็น version อย่างน้อยตามที่เอกสารระบุ
io.js >= 1.8.1 และ npm >= 2.8.3 เมื่อเราติดตั้ง homebrew อยู่แล้วก็สั่งติดตั้งได้เลย

$ brew update
$ brew install node

เราจะได้ nodejs และ npm binary ติดตั้งในเครื่อง

ต่อไปติดตั้ง iojs สั่ง

$ brew install dahoba/iojs/iojs
$ brew link iojs

Formula homebrew-js ตัวข้างบนนี้ผม fork มาจากของ smockle/iojs/iojs เนื่องจากตอนทำครั้งแรก
ผมใช้ของ smockle แล้วพบว่าเป็น iojs v1.0.4 (เก่าไปอีก) เลยจัดการ fork เอา formula มาแก้ไขเป็น version ที่ต้องการ (เอา version ล่าสุดเลย v2.3.1)

ข้อสังเกต:
ถึงคุณจะไม่ใช้ formula พิเศษ ก็จะลง iojs ได้เหมือนกัน แต่มันจะมี message แบบว่า

This formula is keg-only.
iojs conflicts with node (which is currently more established)

ไม่ค่อยเข้าใจ แต่ googling ดูแล้วเห็นว่ามันต้องทำอะไรยุ่งยาก และได้ iojs version ที่เก่ากว่าที่ต้องการด้วย

เราต้องเลือกใช้ node หรือ iojs (ทำไมใช้ไปด้วยกันไม่ได้?)

  • เวลาจะใช้ node brew unlink iojs && brew link node
  • เวลาจะใช้ iojs brew unlink node && brew link --force iojs

หรือถ้าใช้บ่อยทำเป็น alias เลยก็ได้ จับใส่ใน ~/.bashrc หรือ ~/.zshrc

alias usenode="brew unlink iojs && brew link node && echo Updating NPM && npm install -g npm@latest && echo Using Node.js"
alias useio="brew unlink node && brew link --force iojs && echo Updating NPM && npm install -g npm@latest && echo Using io.js"

กราบส์ขอบคุณ gist อันนี้ :thumpup:

กลับมา rebuild-levelb กันต่อ ต้องกลับมาใช้ node ก่อน

$ usenode
$ npm run rebuild-leveldb

มันดูแปลกๆใช่มั้ย ที่เราไปเสียเวลาลง iojs แต่มาพิมพ์ usenode ก่อน compile แต่เหมือนว่าข้างใน script build มันมีการเรียกใช้ iojs นะ

คราวนี้ไม่มี error message อะไรแล้ว สั่ง npm start เพื่อเรียก friends ขึ้นมาเลย

friends on my machine

LOL จาก screenshot ไม่เจอใครเลย เพราะยังไม่มีใครมาเปิด friends ใน network เดียวกับผมน่ะสิ่ -_- เดี๋ยวรอเพื่อนโต๊ะทำงานๆใกล้ว่างก่อน จะส่ง friends แบบที่ build แล้วไปให้มาลองเล่นกัน

วันพุธ, มิถุนายน 24, 2558

สร้าง Technical Document แบบ minimal ด้วย markdown และ gulp.js

TL;DR

มี project java web application ตัวหนึ่ง ที่กำลังจะเอาออกไปใช้งาน มันยังขาดงานเอกสารอยู่ โดยเฉพาะ Technical document ซึ่งจะต้องให้ implementor
ใช้เวลาเค้าเอา software ไป build หรือไปติดตั้ง

ทีแรกก็เขียนเป็น README ธรรมดาๆ แต่หลังจากถูกเอาไป implement มาครั้งหนึ่งแล้ว
ก็พบว่าเอกสาร README มันไม่สมบูณณ์เอาซะเลย

โจทย์ของ Technical document ของตัวผมเองก็คือ

  1. ต้อง minimal ดูเรียบง่าย
  2. ไม่ต้องเสียเวลาทำมาก
  3. มีสารบัญด้วย (Table Of Contents)
  4. ถ้าได้ใช้ markdown ด้วยยิ่งดี

ลอง google ดูก็เจอ

  • mkDocs แต่มันใช้ python ซึ่งทำให้คนที่เอาไปใช้ต้องไปติดตั้ง python อีก ถ้าเป็น Window ก็งานงอก

project นี้ใช้ javascript อยู่แล้วเลยมองๆตัวที่ใช้ javascript ได้เลยมาเจอ

  • Hexojs เป็น static site generator ลองเอามาเล่นแล้ว ก็ติดขัดที่ว่า theme ที่มีมันไม่ถูกใจ และมันออกแบบมาให้ทำเป็น blogging framework มากกว่า
  • ยังมีตัวอื่นๆ ที่น่าสนใจอีกเยอะเลยพวก site generator เช่น

แต่ว่ามันขัดกับโจทย์ที่ตั้งเอาไว้ เสียเวลา วันนี้คงไม่จบ

มาลงตัวที่ solution นี้ project นี้ใช้ javascript อย่างที่บอก และมีการใช้ npm อยู่แล้ว อย่ากระนั้นเลย ลองหา node module มาช่วยแปลง markdown file ให้เป็น html ซึ่งจะเป็นเอกสารที่เปิดอ่านผ่าน browser ได้

ขั้นตอนที่ใช้/Solution

ผมสร้างไฟล์ README.md เอาไว้ที่ root folder ของ project (ก็เหมือน open sources ที่เห็นได้ตาม github นี่แหละ)

เปิด markdown reference ไปด้วย เพราะยังไม่คล่องเท่าไหร่
- ต้นตำรับ Darling fireball
- ยอดนิยม github flavored markdown (GFM)

ใช้ editor เป็น Sublime text ลง plugin 2 ตัวนี้
- Markdown Editing
- Markdown Preview

วิธีทำสารบัญ ก็คือใช้ anchor link เช่น

...  
### Table of contents

- [Overview](#overview)
- [Pre-requesite](#what-well-need)
- [How to Build](#how-to-build)  
...  
### Overview
...  

ตัว #overview จะทำให้ Overview กลายเป็น tag <a> ที่ link ไปหา anchor tag ที่อยู่ในเอกสารเดียวกัน ซึ่งก็คือ Overview ที่อยู่ด้านล่าง

header ทั้งหลายในเอกสารที่เรากำหนดเอาไว้ เมื่อ preview แปลง markdown เป็น html แล้วมันจะทำให้มี anchor tag ควบคู่ไปด้วยได้ เช่น จาก markdown ด้านบนเมื่อ generate แล้วจะได้แบบนี้

...  
<h3 id="table-of-contents">Table of contents</h3>
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#what-well-need">Pre-requesite</a></li>
<li><a href="#how-to-build">How to Build</a>
...  
<h3 id="overview">Overview</h3>
... 

ผมเขียนๆไป ก็ทดสอบโดยใช้ Markdown Preview ใน Sublime Text ดูว่า link แล้วไปถูกหัวข้อหรือเปล่า หรือว่า เมื่อ generate เป็น html แล้วจะได้ anchor ชื่ออะไร สังเกตได้ว่ามันจะเอา - มาแทน space symbol อื่นๆ หรือภาษาไทยตัดทิ้งหมด

เมื่อเขียน Technical Document ครบตามหัวข้อที่ตั้งใจแล้ว ก็มานึกต่อว่าจะ generate เป็น html อย่างไรดี จะให้มาเปิด Sublime Text หรือเปิด website ที่รับ convert markdown online ก็ยุ่งยาก เสียเวลา

เมื่อเราใช้ javascript อยู่แล้ว และก็ใช้ node กับ gulp.js ช่วยทำงาน automate หลายอย่างอยู่แล้ว จึงมาหาวิธีแปลง markdown text ให้เป็น html ด้วยซะเลย

นั่งไล่ลองอยู่นานมาถูกใจตัวนี้ markdown-it เค้ารองรับ commonmarkdown ด้วย ทันสมัยมาก แต่เมื่อเราจะเอามาใช้กับ gulp จึงต้องใช้ module gulp-markdown-it

เราใช้ตอน build เท่านั้น อย่าลืมใส่ --save-dev ด้วย

$ npm install --save-dev gulp-markdown-it

วิธีใช้ตาม github ก็คือ ใส่ code แบบนี้ลงใน gulpfile.js. ไฟล์ README.md ผมอยู่ข้างๆ gulpfile.js อยู่แล้วจึงใส่แบบนี้

var gulp = require('gulp');
var md = require('gulp-markdown-it');

gulp.task('gen-docs', function () {
    gulp.src('README.md')
        .pipe(md())
        .pipe(gulp.dest("."));
});

เค้าจะสร้างไฟล์ readme.html ออกมาให้เลย

แต่มันยังไม่ใช่ ไม่ถูกใจ! syntax มันไม่ highlight, code block ก็ดูไม่แตกต่างจากเนื้อหาเลย เอ๊ นี่เราทำอะไรผิด พอเปิด source code ถึงได้รู้ว่า เค้า generate html ที่ไม่ใช่ไฟล์สมบูรณ์ เนื้อหาได้ประมาณนี้

<h1>Technical Documentation</h1>
<p>If you're open the README.md you can execute <code>$ mvn generate-resource -N</code> to view this document in HTML (readme.htm).</p>
<h3>Table of contents</h3>
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#what-well-need">Pre-requesite</a></li>
<li><a href="#how-to-build">How to Build</a>
...  
<h3>Overview</h3>
...    

  • ไม่มี tag <html> <body>
  • ไม่มี stylesheet ที่ทำให้ดูสวยแบบใน github (ไม่เหมือนเวลา preview จาก Sublime เลย)
  • ไม่มี anchor tag
  • อ่าว.. :-(

งั้นเราจะต้องสร้าง html ส่วนที่เหลือเอง แล้วเอา content ส่วนนี้มาใส่เข้าไปสิ่นะ
อยากให้มี syntax highlight เพราะมีคำสั่ง และตัวอย่าง code ในเอกสารด้วย เราจะต้องใช้

เมื่อ download ไฟล์จาก link ข้างบนมาแล้ว extract zip ผมจับมันใส่ folder site จะมีหน้าตาแบบนี้ ส่วน github-markdown.css ที่โหลดมาได้ก็เอาไปไว้ใน styles ของ highlight ด้วย

+-- README.md
+-- gulpfile.js
|
+-- site 
    +-- readme.htm 
    +-- highlight
       +-- highlight.pack.js
       +-- styles
           +-- github-markdown.css
           +-- default.css 


ไฟล์ css อื่นๆ ใน styles ลบทิ้งหมด เหลือเอาไว้แต่ตัวที่ชอบ ซึ่งคือ default.css

มาลงเอยด้วย gulpfile.js แบบนี้

var gulp = require('gulp');
var mdit = require('gulp-markdown-it');
var inject = require('gulp-inject');

gulp.task('gen-docs', function() {
    var content = gulp.src('README.md')
        .pipe(mdit({
            preset: 'commonmark',
            options: {
                html: false,
                xhtmlOut: true,
                breaks: true,
                typographer: true,
                langPrefix: 'hljs-'
            },
            plugins: ['markdown-it-highlightjs', 'markdown-it-anchor']
        }));
    return gulp.src('site/readme.htm')
        .pipe(inject(content, {
            transform: function(filePath, file) {
                return file.contents.toString('utf8')
            }
        }))
        .pipe(gulp.dest('.'));
});

อธิบาย code ข้างบน

gulp-markdown-it ระบุ option ให้

  • generate html ตาม standard xhtml
  • ให้ใส่ tag <br/> เป็นตัวขึ้นบรรทัดแทน \n
  • หากมี markdown code block ที่ระบุภาษาให้ใส่ prefix hljs-

gulp-markdown-it ใช้ plugin markdown-it-highlightjs เพื่อให้มัน generate html ที่พร้อมให้ hilightjs เรียกใช้ ใส่ class ที่ tag code เพื่อพร้อมแสดงผลด้วย highlightjs

gulp-markdown-it ใช้ plugin markdown-it-anchor เพื่อให้มัน generate html พร้อม anchor ที่ tag <h?> ออกมาด้วย

gulp-inject เป็นตัวช่วยเอา content จากไฟล์หนึ่งไปใส่ยังไฟล์ที่เราทำเป็น template (site/readmd.htm) รอเอาไว้ได้ ในที่นี้คือเอา content ที่ markdown-it แปลงออกมาเป็น html เอาไปใส่ใน placeholder ที่ กำหนดไว้ด้วย inject:html

ตัวอย่างไฟล์ site/readme.htm

<html>
<head>
<link rel="stylesheet" href="site/highlight/styles/default.css">
<link rel="stylesheet" href="site/highlight/styles/github-markdown.css">
<style>
.markdown-body {min-width:200px;max-width:790px;
    margin:0 auto;padding: 30px;overflow: visible}
</style>
</head>
<body class="markdown-body">
<!-- inject:html -->
<!-- endinject -->
</body>
<script src="site/highlight/highlight.pack.js"></script>
<script>
  hljs.initHighlightingOnLoad();
</script>
</html>

style .markdown-body ผมแก้ไขไม่เหมือนกับที่บอกไว้ใน github ของคนทำนิดหน่อย คือผมใส่ overflow: visible เข้าไปด้วย

เมื่อรัน gulp gen-docs task แล้ว html ผลลัทธ์จะออกมาแบบนี้

<html>
<head>
<link rel="stylesheet" href="site/highlight/styles/default.css">
<link rel="stylesheet" href="site/highlight/styles/github-markdown.css">
<style>
.markdown-body {min-width:200px;max-width:790px;
    margin:0 auto;padding: 30px;overflow: visible}
</style>
</head>
<body class="markdown-body">
<!-- inject:html -->
<h1 id="technical-documentation">Technical Documentation</h1>
<p>If you're open the README.md you can execute <code>$ mvn generate-resource -N</code> to view this document in HTML (readme.htm).</p>
<h3 id="table-of-contents">Table of contents</h3>
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#what-well-need">Pre-requesite</a></li>
<li><a href="#how-to-build">How to Build</a>
...
<h3 id="what-well-need">What we'll need</h3>
<ul>
<li>JDK 1.7 หรือใหม่กว่านั้น</li>
<li>Maven 3.1 หรือใหม่กว่านั้น</li>
</ul>
<h3 id="how-to-build">How to build</h3>
... 

เมื่อเปิด readme.htm ที่ถูก generate ขึ้น มาดูใน browser ก็สวยงามถูกใจแล้ว ตอนแก้ปัญหาก็ใช้เวลานานหน่อย เกือบวันนึง ตอนนี้ก็มีสูตรสำเร็จแล้ว ครั้งต่อไปก็จะเร็วขึ้นมากแล้วล่ะครับ

Happy Coding ^^

วันพฤหัสบดี, มิถุนายน 11, 2558

ทำ Spring Boot ให้สร้าง PID file ตอนรัน executable jar/war (Another way to config ApplicationPidFileWriter in Spring Boot)

เมื่อเราทำ executable jar หรือ executable war เวลารันไฟล์เหล่านี้ มันก็จะไม่ได้เปิดหรือแสดง console การที่จะหยุดการทำงานมัน เราจะต้องรู้ process id ของมัน
วิธีหา process id ของ executable jar/war ก็มีหลายวิธี
  • ใช้ command line `ps -ef|grep {ชื่อ file ของเรา}
  • เปิด log file ดู (ถ้า config พวก log4j เอาไว้) เวลา SpringApplication เริ่มทำงานมันก็จะบอกว่า process id ที่มันได้คือเลขอะไร i.e.: ...Starting FooApplication v0.1.0 on dahoba-laptop with PID 15840 ...
  • ใช้ Spring Boot Actuator ให้มันสร้าง pid ไฟล์ให้เรา
อ้างอิงตาม Spring Boot 1.2.3.RELEASE หัวข้อ Process monitoring เค้าบอกว่า ApplicationPidFileWriter สามารถจะเขียน application.pid ซึ่งมีเลข PID (process id) ของ application ที่รันอยู่ให้เราได้
วิธีการทำ
  • ใส่ dependency Spring Boot Actuator ก่อน
    reference #39
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
Note: วิธี extend META-INF/spring.factories ยังทำให้ผมสับสน หรือใช้ SpringApplication.addListeners(…​) มันไม่ work แฮะ (ผมยังใช้ไม่เป็น :-( )
ผมทำแบบนี้ ใช้ได้เหมือนกัน
  • สร้างไฟล์ application.properties ขึ้นมาใน classpath i.e.: src/main/resources/application.properties
  • เพิ่ม line context.listener.classes นี้เข้าไป
  • ทางขวา value เป็น comma separate ใส่ class อื่นๆ ได้อีก
... 
context.listener.classes = org.springframework.boot.actuate.system.ApplicationPidFileWriter
... 
ที่นี้พอ execute jar/war ที่ package ใหม่หลังจาก ใส่ properties กับ dependency เข้าไปแล้ว มันก็จะสร้าง application.pid ให้เราแล้ว
มันจะถูกสร้างข้างๆไฟล์ jar/war ของเราเลย
$ cat applicaion.pid
19489%
ถ้าใช้ OS เป็น OSX หรือ linux ก็สามารถใช้คำสั่งแบบนี้เพื่อหยุด app ของเราได้เลย
$ kill `cat application.pid| awk '{print;}'`
หรือ
$ kill $(cat application.pid| awk '{print;}')

Happy Coding ^^
Written with StackEdit.