แสดงบทความที่มีป้ายกำกับ development แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ development แสดงบทความทั้งหมด

วันจันทร์, สิงหาคม 22, 2559

OAuth คืออะไร?

เค้าออกเสียง OAuth กันว่า [โอ-อ๊อด] บางคนบอกว่ามันเป็น flow ของการ login เหมือนเวลา login app ด้วย Google account บ้างก็บอกว่าเป็นอะไรที่เกี่ยวกับเรื่องความปลอดภัย (security) แล้วก็บอกได้แค่นั้นแหละ

OAuth คือ

OAuth มันไม่ใช่ API ไม่ใช่ service แต่เป็นมาตราฐานแบบเปิดเกี่ยวกับการยืนยันสิทธิ์ (Authentication) การจัดการสิทธิ์การใช้ระบบ (Authorization) ซึ่งนักพัฒนาเอามาใช้งานจริงได้ เป็นมาตราฐานที่แอพพลิเคชั่นจะใช้ติดต่อกับเครื่อง client ในแบบการเข้าระบบผ่านตัวแทนที่ปลอดภัย (secure delegated access) ...ห๊ะ มันอะไรกัน secure delegated access ลองอ่านต่อไปก่อนนะครับแล้วน่าจะเข้าใจ

OAuth ทำงานผ่าน HTTP และอุปกรณ์ที่ได้รับอนุญาต หรือทำงานผ่าน APIs, เซิฟเวอร์, แอพ ที่ได้รับอนุญาต โดยใช้สิ่งที่เรียกว่า access token [แอคเซส โทคเค่น] แทนรหัสผ่าน/พาสเวิร์ด OAuth มี 2 เวอร์ชั่น มี 1.0a กับ 2 ซึ่งใช้ด้วยกันไม่ได้เลย เสปคไม่เหมือนกัน -__- อ่าว

OAuth ทำอะไรได้

ว่ากันง่ายๆ OAuth เป็น protocol ที่รองรับ flow หรือเส้นทางในการยืนยันสิทธิ์ ทำให้มั่นใจได้ว่า ผู้ใช้คนใดๆมีสิทธิ์ที่จะทำอะไรๆได้บ้าง OAuth มันทำแค่นี้จริงๆ ไม่เกี่ยวกับเรื่องการ login เลย มันไม่ได้เกี่ยวกับเรื่องการตรวจสอบการ login หรืออะไรทำนองนั้นนะ

อ่านมาถึงตรงนี้อาจจะสงสัยว่า protocol ที่ทับศัพท์เนี่ยมันแปลว่าอะไร ในที่นี้จะหมายความประมาณว่า พิธีการ/วิธีการ

ในโพสนี้จะพูดกันถึง OAuth version 2 ก่อน

วันศุกร์, มิถุนายน 24, 2559

[OSX] ติดตั้ง Oracle SQLPlus (Oracle instant client) ใน Mac





ดาวโหลดไฟล์ที่ใช้ได้จาก ลิ้ง นี้
ถ้าใช้ OSX OS X El Capitan, Yosemite and Mavericks โหลด 12.1.x.x นะ เก่ากว่านั้นอาจจะใช้งานไม่ได้
สมัครสมาชิก Oracle OTN ให้เรียบร้อย แล้ว กดเลือก Accept License
Accept License
เราจะใช้ sqlplus จำเป็นต้องโหลด 2 ตัวนี้
  • Instant Client Package - Basic Lite: Smaller version of the Basic, with only English error messages and Unicode, ASCII, and Western European character set support Instantclient-basiclite-macos.x64-12.1.0.2.0.zip
  • Instant Client Package - SQLPlus: Additional libraries and executable for running SQLPlus with Instant Client instantclient-sqlplus-macos.x64-12.1.0.2.0.zip
เปิด Terminal
สร้าง folder กันก่อน
$ mkdir ~/Oracle
แตก zip 2 ไฟล์นี้ที่ดาวโหลดมาได้
$ unzip instantclient-basiclite-macos.x64-12.1.0.2.0.zip -d ~/Oracle
$ unzip instantclient-sqlplus-macos.x64-12.1.0.2.0.zip -d ~/Oracle
เปลี่ยน folder ไปที่เราเพิ่งแตก zip
$ cd ~/Oracle/instantclient_12_1
เราจะสร้าง symbolic link ให้กับ library file ตามที่ Oracle กำหนดมา
$ ln -s libclntsh.dylib.12.1 libclntsh.dylib
จำเป็นต้องใช้ OCCI lib ด้วย พิมพ์ต่อ
$ ln -s libocci.dylib.12.1 libocci.dylib
ต่อไปจะต้องเพิ่ม path เพื่อให้เราสามารถเรียกคำสั่งใน folder นี้ได้
ตรวจสอบก่อนว่ามีอะไรอยู่ในตัวแปร PATH
$ echo $PATH
/usr/local/sbin:/opt/subversion/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
ต่อไป คือคำสั่งเพิ่ม path ที่จะเรียก program โดยเอา path ที่มีอยู่เดิมมาต่อท้าย path ใหม่
$ export PATH=/Users/{siritas_s}/Oracle/instantclient_12_1:$PATH
ทดสอบเรียก ... เห็นแบบข้างล่าง แสดงว่าใช้ได้แล้ว
$ sqlplus

SQL*Plus: Release 12.1.0.2.0 Production on Fri Jun 24 16:13:38 2016

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name:
วิธีทำจาก Oracle, เป็นภาษาอังกฤษ

วันศุกร์, มิถุนายน 10, 2559

รวมบทความเด่น จาวาสคริปต์โพรมิส และการรับมือกับ Error : Promises & Error handling Best Practices

ช่วง 2-3 เดือนนี้ได้เขียนจาวาสคริปต์จริงจังหน่อย (ทุกค่ำวันทำงานเลย) ลองเขียนแอพด้วย ionic framework 2 ซึ่งเป็น Angular 2 ด้วย พอใส่ความสามารถของแอพมากๆเข้า ก็ใช้ Promises เยอะขึ้นเรื่อยๆ เริ่มเกิด Promises hell คือโค้ดมันดูไม่ได้เลย -_-" ไม่รู้จะจัดการความยุ่งเหยิงนี้อย่างไร จึงไปค้นคว้าๆ

เหล่าเซียนจาวาสคริปต์ได้บันทึก Best practices, Promises Pattern เอาไว้พอสมควร รวบรวมไว้ดังนี้

วันศุกร์, พฤษภาคม 06, 2559

วิธีใช้ Meterial Design icon ในโปรเจค Ionic framework 2| Howto use Material Design icons in Ionic framework 2 project

poster

วิธีที่นำเสนอนี้เป็นแค่วิธีหนึ่ง จากหลายๆวิธี ที่จะทำให้แอพ ionic2 ของเราแสดงหรือใช้ icon ของ material design ได้

โดยเทคนิคแล้วคือการเลือกประกาศ CSS selector ให้ถูก,ให้โดนนั่นเอง

วันพุธ, มีนาคม 16, 2559

สรุปวิธี สร้างและเพิ่ม SSH key ไปใส่ใน git hosting Github, Gitlab, Bitbucket

ตอนนี้มี Git hosting มาให้เลือกใช้มากมาย ที่งานใช้งานบ่อยๆ ช่วงนี้ก็มี

2 ตัวหลังนี่ใช้บ่อยมาก เพราะให้เราสร้าง private project ได้ ไม่จำกัด (ไปจำกัดเรื่องอื่นแทน เช่น จำนวน user/repo, ขนาดของ repo)

สำหรับการใช้งาน git repository ทุกที่ข้างต้น เราจะต้องมี ssh key แลกกับ server เค้า บันทึกนี้จะเป็นขั้นตอนที่ผมทำเวลาสร้าง ssh key ซึ่งปกติเค้าก็จะทำกันครั้งเดียวแหละ เว้นเสียแต่ว่าเราจะทำ ssh key หาย ซึ่งจะทำให้เรา push source code ขึ้นไปไม่ได้

วันพุธ, มีนาคม 09, 2559

Android: ขั้นตอนการใช้ Google Drive API กับ Android app

มีเพื่อนมาขอคำแนะนำ เค้าเขียนแอพขึ้นมา มี feature หนึ่งจะเอาไฟล์ไปใส่ใน Drive ติดที่ว่าพอขึ้นหน้าจอเลือก account แล้วมันก็หมุนวนไปวนมาอยู่อย่างนั้น หลังจากทดลองทำสำเร็จแล้ว เลยมาบันทึกไว้หน่อย

วันศุกร์, กุมภาพันธ์ 12, 2559

ข้อแนะนำ การแปลง java project ไปใช้ maven (ทำ pom คลีนๆ)

poster

หลังจากผ่านสมรภูมิการแปลง java project ซึ่งเป็น library ที่ที่ทำงานใช้กันมากว่า 5 ปี ของเดิมใช้ ant script ตอนนี้อยากจะใช้มันแบบ maven ถึงจะช้าแต่ก็ดีกว่าไม่ทำนะ ;) เลยมาบันทึกเอาไว้หน่อยว่า สิ่งที่ทำบ่อยๆ ตอนนั้นมีอะไรบ้าง

วันศุกร์, กุมภาพันธ์ 05, 2559

Development: พื้นฐานความปลอดภัยของ web application ตอนที่ 1 (แปล)

poster

เว็บแอพสมัยใหม่มีความท้าทายหลายอย่าง เรื่องความปลอดภัย (security) ก็เป็นเรื่องนึง และมันก็มักไม่ค่อยได้รับความใส่ใจนัก หรือไม่ก็ประเมินความสำคัญเอาไว้ต่ำเกินไป การทำ threat analysis หรือการวิเคราะห์ภัยคุกคามเป็นที่รู้จักกันมากขึ้นเนื่องจากเป็นสิ่งจำเป็นหากจะพัฒนาแอพจริงๆจังๆ และก็ยังมีพื้นฐานบางอย่างที่ไม่ว่ายังไงก็ตามนักพัฒนาควรจะรู้และทำได้

การจะเป็นนักพัฒนาในยุคนี้คุณจะต้องเป็นเหมือนมีดพกทหารสวิส (swiss army knife) นอกจากจะเขียนโปรแกรมได้ตาม requirement แล้ว ต้องทำให้เสร็จไว, ซอร์สโค้ดก็ต้องแก้ไขได้ง่าย มี test, มีความยืดหยุ่นแก้ไขเพิ่มเติมได้สำหรับความต้องการในอนาคต, จะต้องใส่ user interface (UI) ได้เอง, ทำ optimize database, เซตอัพ หรือทำ workflow การ deploy โปรแกรม

ทั้งหมดที่กล่าวมา เมื่อไหร่ก็ตามที่โปรแกรมถูกเอามาใช้งานจริง ถูกใครสักคน hack หรือเจาะระบบเมื่อนั้นแหละเรื่อง security ของระบบก็จะได้รับความสนใจขึ้นมา จริงๆแล้วมันก็เป็นเรื่องที่แอบอยู่กับโปรแกรมของเราตั้งแต่เริ่มพัฒนาแล้ว เรื่อง security นี่แหละ เป็นเรื่องที่สำคัญที่สุด

เค้าเปรียบเทียบ requirement ในด้าน security กับ performance เอาไว้ทำนองที่ว่า security เหมือน performance ตรงที่ เจ้าของโปรแกรมรู้ว่าต้องมี security แต่ไม่แน่ใจว่าจะวัดปริมาณมันยังไง มันไม่เหมือนกันตรงที่ถึงจะเห็นว่าโปรแกรมมี security แล้วแต่ก็ไม่แน่ใจอยู่ดีว่ามีมากพอรึยัง

นักพัฒนาสมัยใหม่อย่างเราต้องอัพเดตความรู้เหล่านี้กันบ้าง โปรแกรมของเราต้องมีภูมิคุ้มกัน ถ้ามีเวลามากหน่อยก็ควรจะไปหาตำรามาศึกษาให้ลึกๆ เลย ส่วน บทความ series นี้จะนำเสนอดังนี้

  • ชี้ให้นักพัฒนารเห็นข้อผิดพลาดที่ผิดกันบ่อย ให้รู้ถึงความเสียงนั้นๆ
  • แนะนำว่าจะจัดการ หรือหลีกเลี่ยงความเสี่ยงดังกล่าวได้อย่างไรบ้าง

(บทความต้นฉบับเป็น Evolving Publication คือเขียนตอนต่อๆไปที่ URL เดิม ตอนใหม่มาก็เพิ่มลงไปด้านล่างเรื่อยๆ)

เรื่องความปลอดภัยของ web application มีเนื้อหากว้างมาก ถึงแม้ว่าเราจะกำหนดขอบเขตว่าเป็นการใช้งานผ่าน browser เท่านั้นแล้วก็ตาม บทความนี้เหมาะกับคำว่า "ที่สุด" มากกว่าที่จะมารวบรวมทุกอย่างที่คุณควรจะรู้ แต่เรื่องที่เป็นที่สุดนี้ก็หวังว่าจะทำให้นักพัฒนาที่สนใจเรื่อง security เหมือนได้ก้าวใหญ่ๆ เข้ามาในเรื่องนี้

ความเชื่อใจ

ความเชื่อใจจัดว่าเป็นรากฐานของเรื่องความปลอดภัยเลย ลองนึกตามดูว่าเราจะเชื่อใจข้อมูลจากสถานการณ์เหล่านี้ได้หรือไม่

  • เราเชื่อ request ที่ส่งมาจาก browser ของผู้ใช้ได้หรือไม่ (ตอบ ไม่ได้)
  • เราเชื่อว่า service ที่จัดการกับ database ให้เรา จะทำข้อมูลไม่เสียหายและไม่สกปรกเลยใช่มั้ย (ตอบ ไม่เชื่อ)
  • เชื่อใจได้มั้ยว่า connection ระหว่าง browser ของผู้ใช้มายังระบบของเราไม่โดนเจาะหรือแอบฟัง (ไม่)
  • เราเชื่อใจใน service และฐานข้อมูลที่เราใช้ในระบบได้หรือเปล่า (ควรจะ)

เรื่อง security มันไม่ตรงไปตรงมาเราจะต้องหาทางรับมือกับมัน ให้มีความเสี่ยงน้อยที่สุด web application ที่อยากจะให้ปลอดภัยเสี่ยงต่ำ ควรจะต้องใช้ Threat Risk modeling แต่จะเอาไว้ตอนหน้า เรื่องมันค่อนข้างซับซ้อน

ตอนนี้จะมาดูกันว่าความเสี่ยงฯต่อระบบเรามีอะไรบ้าง

ปฎิเสธการรับ input ที่ผิดจาก form

อย่าคิดว่าการที่เราเลือกใช้ form input type ต่างๆในหน้าจอจะทำให้เราได้รับข้อมูลแบบที่เราต้องการได้อย่างถูกต้อง ถึงแม้ว่าจะมี javascript มาตรวจสอบก่อน submit ก็เถอะ การปลอมแปลงข้อมูลที่ส่งออกจาก browser ทำได้ไม่ยาก

input ที่เชื่อไม่ได้

หากจะวัดระดับความน่าเชื่อถือของข้อมูลที่ถูกส่งผ่าน html form จาก browser มายัง server และถึงแม้ว่าจะตรวจสอบด้วย javascript ก่อนส่งอีกด้วย ระดับความน่าเชื่อถือเป็น 0 การตรวจสอบความถูกต้องของข้อมูลต้องทำที่ server

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

การตรวจสอบข้อมูลเข้า

ทำเพื่อให้แน่ใจว่าเราได้ข้อมูลที่เป็นปกติ เป็นไปตามที่ระบบต้องการ การตรวจสอบนี้จะเป็นปราการด่านแรก การ check null หรือค่าว่างไม่เพียงพอ

positive validation หรือ whitlisting จำกัดรับแต่ข้อมูลที่ยอมรับได้เท่านั้น ให้นึกถึงว่า input นี้รับค่าอะไรได้บ้าง ถ้าเป็นตัวเลขอยู่ช่วงมากน้อยแค่ไหน ค่าบวก ค่าลบได้หรือไม่ การใส่ของลงตะกร้า e-commerce ก็ไม่น่าจะเป็น 1000 ชิ้น เป็นต้น

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

เราอาจจะพยายามดักหรือหาข้อความที่เป็นอันตรายที่มากับข้อมูลที่รับเข้า แบบนี้เรียกกันว่า nagative validation หรือ blacklisting ปัญหาที่ตามมาหากใช้วิธีนี้ เราจะต้องเตรียมตรวจจับ bad input ให้ครบซึ่งมันจะเสียเวลาตรงนี้มาก เวลาผ่านไปอาจจะมีเทคนิคใหม่ๆ มาอีก

การพยายามกำจัดคำอันตรายออกจากข้อมูลนำเข้า เช่นหากเจอคำว่า <script> ในข้อมูล ก็จะลบออกก่อนจะนำไปประมวลผลต่อ วิธีแบบนี้เรียก "sanitization" คนโจมตีอาจจะหาวิธีเลี่ยงเทคนิค sanitization ของเราได้ เช่น ใส่ <scr<script>ipt> เมื่อลบคำว่า script ออกก็ยังมี tag script ติดมาอยู่ดี กลายเป็นว่าเราทำให้เกิดช่องโหว่ขึ้นจนได้

ถ้าต้องใช้เทคนิค blacklisting นี้ก็ต้องศึกษาให้ละเอียด เขียน test ดีๆ ศึกษาเอกสารนี้ให้เข้าใจ OWASP’s XSS Filter Evasion Cheat Sheet

web framework สมัยใหม่ส่วนใหญ่จะมี function ที่ทำหน้าที่ validation มาด้วยอยู่แล้ว หรือหากไม่มีเราก็สามารถไปหามาใช้ในรูปแบบ library เสริมก็ได้ การใช้ validation ที่มีให้เหล่านี้ทำให้เราเหมือนมีปราการป้องกัน ก่อนข้อมูลผิดปกติจะเข้าไปชั้นในระบบของเราได้

modern web framework's validation table

สรุป

  • เลือกทำ Whitelist ถ้าทำได้
  • ทำ Blacklist หากทำ Whitelist ไม่ได้
  • ใส่ข้อจำกัดใน form input ให้ได้เยอะที่สุด
  • เลี่ยงการตีข้อมูลใน input กลับมาให้ผู้ใช้เห็น
  • ปฎิเสธเนื้อหาจาก web ก่อนที่มันจะเข้าไปในส่วน logic ของระบบได้ โดยใช้ whitelist ที่มากับ web framework ที่เราใช้

    แม้ว่าเนื้อหาข้างต้นจะพูดถึงแต่การตรวจสอบข้อมูลที่มาจาก form input หากเป็นเนื้อหาในรูปแบบอื่นเช่น json, xml codes ในส่วนที่ใช้ตรวจสอบ form input ก็สามารถใช้ตรวจสอบข้อมูลในรูปแบบอื่นดังกล่าวได้เช่นกัน

จำไว้ว่า

if you don't control it, you can't trust it. If it violates the contract, reject it!

~ ถ้าคุณไม่ได้ควบคุมมัน คุณเชื่อมันไม่ได้ ถ้ามันผิดไปจากข้อกำหนด โยนมันทิ้งไป

เรียบเรียงจาก Martin Fowler's The Basics of Web Application Security

โปรดติดตาม ตอนหน้าจะเป็นเรื่อง Encode HTML Output

วันจันทร์, มกราคม 18, 2559

สร้าง https ใน localhost พร้อมกุญแจเขียว บน OS X

เรื่องมันเริ่มจากว่าเห็น post นี้ของ certsimple What web developers should know about SSL but probably don't และ กำลังจะเล่น features HTML5 ที่ต้องใช้ https อยู่พอดี ได้เรื่องมาเขียน blog ละ ฮ่าๆ

วิธีต่อไปนี้ทำสำเร็จใน OS X Yosimite ถ้าจะทำใน Linux เช่น ubuntu, centos หรีอ Window platform ไม่แน่ใจนะครับยังไม่ได้ลองหาวิธี ถ้าจะเอาไปใช้ได้ก็จะเป็นส่วนการสร้าง cert แบบ self signed

https-with-green-padlock-on-localhost-poster

วันศุกร์, มิถุนายน 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 แล้วไปให้มาลองเล่นกัน

วันพฤหัสบดี, มิถุนายน 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.

วันอังคาร, มิถุนายน 09, 2558

แก้ปัญหา SQLDeveloper ฟ้อง Low Memory Warning dialog

แก้ปัญหา sqldeveloper ฟ้อง Low Memory Warning

1.  เปิดไฟล์ {path ที่ติดตั้ง sqldeveloper}/sqldeveloper/bin/ide.conf

2.  มองหาข้อความเหล่านี้
...
# If you are getting the 'Low Memory Warning' Message Dialog while running
# JDeveloper, please increase the -Xmx value below from the default 800M to
# something greater, like 1024M or 1250M.  If after increasing the value,
# JDeveloper is no longer starting up because it fails to create a virtual
# machine, then please reduce the modified -Xmx value, or use a 64bit JDK
# which allows for very very large value for -Xmx.
#
AddVMOption  -Xmx800M
...

ลองแก้ไขจาก 800M เป็น 1024M (1 กิ๊ก)

AddVMOption  -Xmx1024M

3. Save แล้ว restart SQLDeveloper.

---
ปล. ใช้ SQLDeveloper บน Mac OSX สำหรับ window หรือ linux ก็น่าจะแก้ไขได้ด้วยเช่นกัน.

วันศุกร์, มกราคม 23, 2558

SOLVED: แก้ไข exception ComponentLookupException เวลา execute MojoTest

    ทำ maven plugin ขึ้นมาเพื่อให้ทีมฯใช้งาน เราก็จะเขียน test plugin ของเราด้วย

  link นี้ข้อมูลเก่า ไม่เห็นใครใน github เขียนแบบที่แนะนำเอาไว้เลย...ข้ามไป
https://cwiki.apache.org/confluence/display/MAVENOLD/Maven+Plugin+Harness

  link ที่ได้มาจากหน้าแรกของการ googling คือ Cookbook: How To Use Maven Plugin Testing Harness? ข้อมูลยังใหม่อยู่ จะเห็นว่าอัพเดตเมื่อปี 2014 นี่เอง ผมก็ทำตามที่เค้าแนะนำ คือ

1. ให้ใช้ plugin ตัวนี้ maven-plugin-testing-harness
<project>
  ...
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.plugin-testing</groupId>
      <artifactId>maven-plugin-testing-harness</artifactId>
      <scope>test</scope>
    </dependency>
    ...
  </dependencies>
  ...
</project>

2.  เขียน test class ขึ้นมา ซึ่งเราต้อง extends AbstractMojoTestCase และใน class ต้อง override setUp() ด้วย, มี method สำหรับ test class ของเรา ในเอกสารมันก็บอกแค่นี้

public class MyMojoTest
    extends AbstractMojoTestCase
{
...
protected void setUp()
        throws Exception
    {
        // required
        super.setUp();

        ...
    }
...
public void testSomething()
        throws Exception
    {
...
}
...
}

3. สร้าง pom สำหรับ test, แก้ไข pom ของ plugin project

4. ทดลองสั่ง

$mvn clean test

มึน!ครับ ได้ Exception แบบนี้
...
org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
      role: org.apache.maven.repository.RepositorySystem
  roleHint:
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:257)
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:245)
at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:239)
at org.codehaus.plexus.PlexusTestCase.lookup(PlexusTestCase.java:206)
at org.apache.maven.plugin.testing.AbstractMojoTestCase.setUp(AbstractMojoTestCase.java:126)
... 

คือตามที่ทำตัวหน้า แค่เรียกตัว method setup ก็พังแล้ว -_-" 

    นั่งงมอยู่นานครับ ทำไมๆๆ ไม่อยากให้เสียเวลาเหมือนกับผม จึงมาเขียนเอาไว้ครับ เราจะต้องเพิ่ม dependency อีกหนึ่งตัวสำหรับการ test นี้ maven-compat;ที่ทำตัวหนาไว้
...
<dependency>
    <groupId>org.apache.maven.plugin-testing</groupId>
   <artifactId>maven-plugin-testing-harness</artifactId>
   <version>3.1.0</version>
   <scope>test</scope>
 </dependency>
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-compat</artifactId>
    <version>3.1.1</version>
</dependency>
...

   ส่วน dependecy junit ผมเลือกใช้ version 4.10 มันมี warning บอกให้ใช้ version ที่ใหม่กว่านี้ ก็เลยเปลี่ยนซะ

เพิ่ม depency maven-compat แล้ว ก็ไปต่อได้แล้วครับ มันจะวิ่งเข้า test method เราแล้ว 



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

ใส่ build time ใน MANIFEST.MF ให้ jar file ที่ build ด้วย maven 3

    ทำ library package เป็น jar file ออกมาแล้วอยากให้มี build time อยู่ใน jar file ด้วย ข้อมูลแบบนี้เค้าจะใส่ไว้ใน MANIFEST ไฟล์กัน ไฟล์มันจะชื่อ MANIFEST.MF

ถ้าลองแกะออกมาดูจาก jar file จะเห็นcontent ประมาณนี้ 

Manifest-Version: 1.0
Built-By: siritas_s
Build-Jdk: 1.7.0_25
Created-By: Apache Maven 3.1.0
Archiver-Version: Plexus Archiver

    ค้นๆ ไปเจอ Cookbook: How To Add Build Time To A JAR Manifest? นี้ นั่งทดลองอยู่ตั้งนานทำไมมันไม่ได้ซักที(วะ) ผมสรุปเองว่ามันเป็นวิธีที่เก่าแล้ว สมัย maven 2 ล่ะมั้ง แถมต้องใส่โน่นนี่ยึบยั่บใน pom

   วิธีสำหรับ maven 3.x สั้นกระชับ ตามนี้เลย

ถ้าใน build ยังไม่มี plugin id maven-jar-plugin ตัวนี้ก็ใส่เข้าไปใต้ <build>

<build>
...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
    <archive>
        <manifestEntries>
            <Build-Time>${maven.build.timestamp}</Build-Time>
        </manifestEntries>
    </archive>
    </configuration>
    </plugin>
...
</build>

เพิ่ม config ใน pom แล้ว สั่ง mvn clean package ใหม่  ลองแกะออกมาดูจาก jar file จะเห็นcontent ประมาณนี้

Manifest-Version: 1.0
Build-Time: 20150122-1421
Built-By: siritas_s
Build-Jdk: 1.7.0_25
Created-By: Apache Maven 3.1.0
Archiver-Version: Plexus Archiver

ถ้าอยากเปลี่ยน date format ของ build time ก็เพิ่ม property ตามนี้เข้าไปใต้ <project>
<project>
...
<properties>
    <maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>

</properties>
...
</project>

Happy แล้ว กลับไปทำงานต่อละ

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

แก้ปัญหา: DocumentException: Table 'name' does not exist ...

แก้ปัญหา DocumentException: Table 'name' does not exist ...

    แอพพลิเคชั่นที่พัฒนาอยู่ ใช้ maven จัดการ มันมี function หนึ่งของแอพนี้ที่ต้องยุ่งกับการสร้างเอกสาร PDF
   เวลารัน test มันจะมาตายตอนจะทดสอบการสร้างเอกสาร PDF โดยสังเกตว่ามี exception แบบนี้ 

com.itextpdf.text.DocumentException: Table 'name' does not exist in file:/workspace/anApplication/target/classes/fonts/arial.ttf


   กูกลิ้งไปๆมาๆก็มาเจอว่าเจ้า maven นี่หวังดี ตอน compile source code มันก็มา copy resource ที่เป็นฟอนต์ของเราไปให้ที่โฟลเดอร์ target ด้วย แต่มันดันทำให้ property 'name' ในฟอนต์แต่ละตัวมันหายไป (มีคนเค้าเอาซอฟต์แวร์แก้ไขฟอนต์มาเปิดดู เลยรู้ว่ามันหายไปจริงๆ) และถ้าก้อปปี้ฟอนต์ไฟล์จากโฟลเดอร์ resource ไปทับภายใต้โฟลเดอร์ target เอง ฟอนต์นี้มันก็จะใช้ได้ไม่มีปัญหา,ไม่มี exception ข้างต้น

  เกิดจาก maven มันเห็นว่า ttf เป็นไฟล์ที่ต้องทำการ filtering ด้วย (การ filtering ถ้าเกิดกับ text ไฟล์ก็คือการเอาข้อความจริงไปแทนที่ variable ที่อยู่ในไฟล์ให้เลย) วิธีแก้ก็ต้องอย่าให้ maven มันมา filtering ไฟล์ฟอนต์ของเรา

แก้ไขที่ pom.xml 
* ใส่ plugin maven-resouces-plugin
* ถ้ามี plugin ตัวนี้อยู่แล้วก้อใส่ nonFilteredFileExtensions เพิ่มเข้าไป 

...
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
      <configuration>
        <nonFilteredFileExtensions>
          <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
      </configuration>
</plugin>
...

วันศุกร์, พฤศจิกายน 07, 2557

เครื่องมือต่างๆสำหรับนักพัฒนาซอฟต์แวร์ยุค 201x ควรรู้จักไว้

เครื่องมือต่างๆสำหรับนักพัฒนาซอฟต์แวร์ยุค 201x ควรรู้จักไว้

มาบันทึกเอาไว้มีทั้งฟรี ทดลองใช้ ไม่ฟรี 

Fabric.io "Mobile Development, Solved."
เครื่องมือต่างๆ สำหรับการพัฒนา mobile application 
  • Crashlytics, ตัวจัดการ runtime exception
  • Twitter Integration
  • Mopub,​ ตัวจัดการ Ads
  • SMS confirmation service.
Github for Edu "The best developer tools, free for students"
ถ้าเป็นนักศึกษาหรือคนในแวดวงก็จะใช้บริการได้ในราคาพิเศษ หรือฟรีเลย


อื่นๆ อีกมากมาย
จะทยอยมาอัพเดตเรื่อยๆ
 ---
ครั้งที่ 1 : 7/11/2014

วันอังคาร, มีนาคม 26, 2556

ปรับแต่ง Eclipse Indigo Optimize JVM settings


ตั้งใจบันทึกไว้ใช้ส่วนตัว (•‿•) 

     คุณ Mikko เค้าบอกเอาไว้ใน stackoverflow ว่า settings นี้  ตั้งใจให้ eclipse มันใช้ mem น้อยๆ และลดความหน่วงลงในทุกกรณี. ส่วนตัวเองก็ไม่แตกฉานเรื่อง JVM ก็เลย จดและจำนำมาใช้
    แต่ละ option, ดูเครื่องหมายลบ จะอยู่บรรทัดใครบรรทัดมัน อยู่บรรทัดเดียวกันไม่ได้นะครับ

แก้ไข eclipse.ini เป็นแบบนี้ ( ทดลองเอาไปใช้กับ eclipse ใน OSX 10.8 ก็ start มาใช้งานได้ไม่มีปัญหา, มันก็ใช้ Sun JDK เหมือนกันนี่นะ)

Eclipse Indigo 3.7.2 settings (64 bit linux)

Settings for Sun/Oracle java version "1.6.0_31" and Eclipse 3.7 running on x86-64 Linux:

-nosplash
-vmargs
-Xincgc
-Xss500k
-Dosgi.requiredJavaVersion=1.6
-Xms64m
-Xmx200m
-XX:MaxPermSize=150m
-XX:NewSize=8m
-XX:PermSize=80m
-XX:MaxPermSize=150m
-XX:MaxPermHeapExpansion=10m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseParNewGC
-XX:+CMSConcurrentMTEnabled
-XX:ConcGCThreads=2
-XX:ParallelGCThreads=2
-XX:+CMSIncrementalPacing
-XX:CMSIncrementalDutyCycleMin=0
-XX:CMSIncrementalDutyCycle=5
-XX:GCTimeRatio=49
-XX:MaxGCPauseMillis=20
-XX:GCPauseIntervalMillis=1000
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSClassUnloadingEnabled
-XX:+DoEscapeAnalysis
-XX:+UseCompressedOops
-XX:+AggressiveOpts
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

Note that this uses only 200 MB for the heap and 150 MB for the non-heap. If you're using huge plugins, you might want to increase both the "-Xmx200m" and "-XX:MaxPermSize=150m" limits.
The primary optimization target for these flags has been to minimize latency in all cases and as a secondary optimization target minimize the memory usage.

ผมจะ mix-up มันนิดนึงคือเปลี่ยน เป็นแบบนี้สำหรับ 2-3  บรรทัดนี้ (จาก sof: 7776565)


-XX:MaxPermSize=256m
-Xms128m
-Xmx512m


เอามาจาก (This is from):
http://stackoverflow.com/a/7822155
  และ
http://stackoverflow.com/a/7776565

วันอาทิตย์, มกราคม 22, 2555

Ubuntu: Install javaHL for Subclipse, Eclipse plugin

When starting eclipse after install subclipse plugin. Got an error like this
 
Failed to load JavaHL Library. These are the errors that were encountered: no libsvnjavahl-1 in java.library.path no svnjavahl-1 in java.library.path no svnjavahl in java.library.path

means that we did not install some library files for subversion plugin yet.
Execute this command:

sudo  apt-get install subversion libsvn1 libsvn-java

(re)Start the eclipse there's (should) no such an error occurred.