9 featureใหม่ใน Java 9

หลังจาก Java 8 release ได้ 3 ปี กำหนดการ release Java 9 คือ 21 กันยายน 2560 นอกเหนือจากระบบ module ที่เป็นของใหม่และมีการพูดถึงมากที่สุดแล้ว ก็ยังมีหัวข้ออื่นๆอีก รวมเป็น 9 ข้อด้วยกัน

Continue reading

Advertisements

ระบบ Log ใน Java แบบเปลี่ยน implementation ได้ภายหลังด้วย SLF4J

slf4j-logo

จริงๆแล้ว จาวาเองก็มีระบบ log ของตัวเองอยู่แล้ว แต่ถ้าจะใช้งานหนักๆอย่างเช่น การเปลี่ยนรูปแบบข้อความที่จะ log นั้น ต้องสร้างคลาสขึ้นมาเพื่อปรับรูปแบบ เท่าที่สังเกต ส่วนมากจึงเลือกใช้เฟรมเวิร์ก (logging framework) แทน เช่น log4j หรือ jakarta-logging

ปรากฏว่าในเวลาต่อมา log4j ที่ได้รับความนิยมสูงสุดเองก็หยุดพัฒนา โดยผู้เริ่มต้นพัฒนาเองเปลี่ยนไปทำ logback แทน แม้ว่าการใช้งานจะคล้ายๆเดิม แต่ก็มีรายละเอียดบางอย่างที่เปลี่ยนไป

SLF4J เป็นจาวาไลบรารี่ที่ทำหน้าที่เป็นหน้าด่าน (facade) ที่ทำให้นักพัฒนาใช้งานระบบ log ด้วยเอพีไอ (API) เดียวกัน แต่สามารถเปลี่ยน implementation ได้โดยไม่ต้องแก้ไขโปรแกรม เพียงแค่เปลี่ยนไลบรารี่ที่ใช้ พร้อมกับคอนฟิกของแต่ละค่ายเท่านั้น นอกจากนี้ยังสามารถเพิ่มเติมให้รองรับการทำงานมากขึ้นได้ เช่น เพิ่มระดับการ log ได้

จุดเด่นอีกอย่างของ SLF4J คือ parameterized message ซึ่งเป็นเอพีไอที่ช่วยเพิ่มประสิทธิภาพในการทำงาน เพราะไม่ต้องสร้างสตริงจากการต่อสตริงกับออบเจ็กต์ (object) ก่อน แม้ว่าจะไม่ต้อง log ก็ตาม

Continue reading

Test Java App Server ด้วย IntelliJ IDEA Community Edition + Tomcat

idea-tomcat

IntelliJ IDEA สนับสนุนการเทสต์กับแอพเซิร์ฟเวอร์เฉพาะบน Ultimate Edition เท่านั้น จึงทำให้ไม่สามารถใช้งานร่วมกับ Apache Tomcat บน Community Edition ได้

แต่สำหรับโปรเจคที่พัฒนาบนเมเว่น (Maven) มี 2 ทางเลือก เพื่อใช้งาน Tomcat บน Community Edition ได้ สามารถนำวิธีนี้ไปประยุกต์ใช้ทูลส์อื่นๆ เช่น Gradle ได้:

Continue reading

ปรับโครงสร้าง URL บน Java Web Server ให้กระชับด้วย UrlRewriteFilter

การทำเว็บไซต์แบบประมวลผลที่เซิร์ฟเวอร์ อาจมีการประมวลผลตามการร้องขอของผู้ใช้ (dynamic generated content) ซึ่งในสายจาวาใช้ JSP/Servlet ในการประมวลผล

โครงสร้างของ URL จะเป็นแบบ QueryString ซึ่งยาว ทำให้จำยาก ในสาย SEO แนะนำให้ URL มีโครงสร้างที่แน่นอน และคาดเดาได้ เพื่อเหมาะกับการที่เสิร์ชเอ็นจิน (Search Engine) อย่างกูเกิลในการเก็บข้อมูล (indexing)

มีผู้พัฒนาไลบรารี่เพื่ออำนวยความสะดวกในการนี้โดยเฉพาะคือ UrlRewriteFilter ซึ่งหลักการคล้ายๆกับ mod_rewrite ใน Apache web server คือจับรูปแบบของ URL ด้วยเรกกูลาร์เอ็กซ์เพรสชัน (regex: Regular Expression) แล้วเปลี่ยนให้อยู่ในรูปแบบที่เซิร์ฟเวอร์เข้าใจคือ QueryString เช่น จาก /category/mobile แปลงเป็น /index.jsp?category=mobile เป็นต้น

ในเว็บไซต์ของผู้พัฒนาได้สรุปขั้นตอนสั้นๆในลักษณะ Quick Start Guide ที่ทำตามได้อย่างง่ายดายอยู่แล้ว ในที่นี้จะใช้ Maven ซึ่งมีขั้นตอนดังนี้

Continue reading

เขียนโปรแกรมสร้างลายน้ำบนรูปใน Android App

Turn-Off-Safe-Mode-on-Android-Step-13-Version-3

การสร้างข้อความลายน้ำ (watermark) บนรูปภาพนั้น สามารถใช้เพื่อป้องกันการละเมิดลิขสิทธิ์ได้ หรือจะประยุกต์ใช้เพื่อแสดงข้อมูลที่เกี่ยวข้องกับรูปนั้นๆได้ แอพบนมือถือหลายๆค่ายก็ใช้งานกัน

ในแอนดรอยด์ สามารถเขียนโปรแกรมเพื่อสร้างลายน้ำโดยอาศัยพื้นฐานของบิตแมพ (bitmap) ร่วมกับแคนวาส (canvas) เทียบได้กับการวางรูปภาพแล้วเอาข้อความ หรือกราฟิกใดๆวางซ้อนกันบนผืนผ้านั่นเอง ในที่นี้ขอพูดถึงการวางข้อความเหนือรูปภาพ

Continue reading

ติดตั้ง IntelliJ IDEA ให้เขียนโปรแกรม Android ได้

intellijidea_android

กูเกิล (Google) ประกาศให้แอนดรอยด์สตูดิโอ (Android Studio) เป็นไอดีอี (IDE: Integrated Development Environment) หลักในการพัฒนาแอพสำหรับแอนดรอยด์ ซึ่งพื้นฐานมาจาก IntelliJ IDEA Community Edition นั่นเอง

เราจึงใช้ IntelliJ เขียนโปรแกรมแอนดรอยด์ได้ แต่ต้องติดตั้ง Android SDK และโปรแกรมเสริมผ่าน SDK Manager อยู่พอสมควร ประกอบไปด้วย

  1. Android SDK Tools
  2. Android SDK Platform-tools
  3. Android SDK Build-tools
  4. เลือก Android Platform อย่างน้อย 1 เวอร์ชัน เช่น Android M (API 23) โดยให้เลือกรายการย่อยดังนี้
    • SDK Platform
    • System Image อย่างน้อย 1 ตัว ควรเลือก Google APIs Intel x86 Atom เพื่อความเร็วในการทดสอบกับ AVD (Android Virtual Device) ซึ่งอิมเมจนี้จะมีเอพีไอ (API) ของกูเกิลติดมาด้วย Intel x86_64 นั้น อาจต้องใช้เครื่องที่แรงๆ ส่วน ARM ทางกูเกิลไม่แนะนำให้ใช้แล้ว เพราะทำงานช้ากว่า Intel x86 ประมาณ 10 เท่า
  5. Extras
    • Android Support Repository: ไลบรารี่จาวาในรูปแบบเมเว่นเรโพสิทอรี่ (Maven Repository) ซึ่งไม่มีอยู่ในทั้ง Maven Central และ Jcenter จำเป็นต้องติดตั้ง เพราะตัวช่วยสร้างโปรเจคของ IntelliJ ใช้ไลบรารี่เหล่านี้ ถ้าไม่มีจะคอมไพล์ไม่ผ่าน
    • Google USB Driver: ใช้เพื่อดีบัก (debug) กับโทรศัพท์มือถือโดยตรง
    • Intel x86 Emulator Accelerator (HAXM installer): ตัวติดตั้งไดรเวอร์เพื่อเร่งความเร็วในการทำงานของ AVD ใช้ร่วมกับอิมเมจ Intel x86 จากข้อ 4 ไม่ต้องติดตั้งถ้าใช้ ARM

HAXM ในข้อ 5 เป็นเพียงตัวติดตั้ง ต้องทำการติดตั้งเองโดยเข้าไปยังไดเรกทอรี่ที่ติดตั้ง Android SDK โดยปกติจะอยู่ที่ C:\Users\<ชื่อ user>\AppData\Local\Android\android-sdk จากนั้นเข้าไปที่ไดเรกทอรี่ย่อย extras\intel\Hardware_Accelerated_Execution_Manager ให้ติดตั้งผ่านโปรแกรม intelhaxm-android.exe ซึ่ง HAXM นั้นจะต้องมีแรม (RAM) เหลืออย่างน้อย 2GB โดยไม่รวมกับโปรแกรมอื่นๆที่เปิดอยู่ในขณะเดียวกัน

จากนั้นเปิด IntelliJ ให้เพิ่ม Android SDK ผ่าน settings ก่อน แล้วจึงสร้างโปรเจคแอนดรอยด์ได้ทันที การออกแบบหน้าจอแอพนั้น อาจตามแอนดรอยด์สตูดิโอไม่ทัน ให้ถอยเวอร์ชันของตัวเรนเดอร์ (rendering layout) ลง ขณะที่เขียนนี้เป็น Android N (API 24) ให้ถอยมา Android M (API 23) แทน

เมื่อถึงขั้นตอนการสั่งรัน ให้สร้าง AVD ผ่าน IntelliJ ได้เลย เพื่อความเร็วในการทำงาน โดยส่วนตัวจะเปิด AVD ทิ้งไว้ก่อน เพราะเคยเจอปัญหาว่า IntelliJ มองไม่เห็น AVD ที่ติดตั้งไว้และอาจจะเปิดไม่ขึ้น

ปัญหาเกี่ยวกับ Android Support Repository ที่เจอ แก้ได้โดยคำตอบที่ไม่ได้เป็น Accepted answer ของ Stackoverflow:

สแลช (Slash)

วิธีเขียนโปรแกรมหา Term ที่มากที่สุดใน Lucene index

mantle-lucene

ลูซีน (Lucene) คือโอเพ่นซอร์สไลบรารี่ (open source library) ที่ใช้ในการเก็บข้อมูลเพื่อใช้ในการค้นหาซึ่งอยู่เบื้องหลังซอฟต์แวร์ Search Engine เช่น Elasticsearch และ Solr ภาษาหลักที่ใช้คือจาวา (Java) แต่ก็มีการพอร์ต (port) ไปยังภาษาอื่นๆด้วย เช่น ไพธอน (Python) หรือ C++

เมื่อจัดเก็บข้อมูลในอินเด็กซ์ (index) บางครั้ง อาจจะต้องการวิเคราะห์ข้อมูลว่ามีคำค้นหา (search term) อยู่มากน้อยแค่ไหน เพื่อนำไปต่อยอดในการประมวลผลด้านอื่นๆต่อไป

วิธีการเขียนโปรแกรมเพื่อหาจำนวนครั้งที่ปรากฏสำหรับแต่ละคำค้นหา:

  1. เปิด index ด้วยคำสั่ง reader = DirectoryReader.open()
  2. เรียก Term ทั้งหมดขึ้นมา ด้วยคำสั่ง terms = MultiFields.getTerms(reader, <ชื่อฟีลด์ที่ต้องการ>)
  3. เรียกข้อมูลผ่าน TermsEnum enum = terms.iterator(null)
  4. วนลูป enum ผ่านคำสั่ง enum.next() โดยที่ในแต่ละครั้ง จะได้คำนั้นๆ ถ้าข้อมูลเป็นภาษาอื่นที่ไม่ใช่ภาษาอังกฤษและเก็บแบบ utf-8 ให้เรียกคำสั่ง .utf8ToString() เพื่อถอดรหัส (decode) ส่วนจำนวนครั้งที่ปรากฏใน index  ใช้คำสั่ง enum.docFreq()
  5. เรียงลำดับ docFreq ตามต้องการ

วิธีการข้างต้น มาจากซอร์สโค้ดของ ลูค (Luke) ซึ่งเป็นทูล (tool) ที่ใช้ในการวิเคราะห์ข้อมูลที่ใช้ลูซีน ทั้งการวิเคราะห์คำค้นหา ทดสอบการตัดคำ หรือประมวลผลคำสั่งสืบค้นข้อมูล (query parser) เนื่องจากลูคเป็นโปรเจคโอเพ่นซอร์ส จึงสามารถเข้าไปดูเพื่อเป็นแนวทางในการเขียนคำสั่งด้วยลูซีนได้ แต่ตัวทูลก็มีประสิทธิภาพเพียงพออยู่แล้ว ถ้าไม่ได้ต้องการนำผลการวิเคราะห์ไปใช้ต่อในโค้ดโดยตรง

Luke github: https://github.com/DmitryKey/luke

สแลช (SLASH)