Grand Central Dispatch (GCD)

ระหว่างสาละวนกับเรื่อง Message Queue (MQ)  ซึ่งปัจจุบันใช้ ActiveMQ อยู่อย่างเป็นสุขเพราะในงานที่ใช้ยังไม่พบปัญหาอะไรมากมาย แต่ก็กำลังมองเรื่อง Availability กับ Performance ด้วย  ลองดูเรื่อง Throughput ของ ActiveMQ ก็ไปพบว่า ActiveMQ มี fork อีกตัวที่ชื่อ Apollo ซึ่งดูจาก Benchmark แล้วน่าเอามาใช้กับงานที่ต้องการ Throughput สูงๆ ใน payload ขนาด 256k ยังให้ Throughput 3,000 msg/s ในขณะที่ ActiveMQ เดิมๆให้ Throughput แค่ 400 msg/s

ที่จั่วหัวเอาไว้ว่า Grand Central Dispatch (GCD) เพราะ Apollo ใช้ HawtDispatch ในการ implement server ตัว HawtDispatch เป็น Java clone ของ libdispatch (หรือที่รู้จักกันในชื่อ Grand Central Dispatch) ที่สนใจเพราะคนที่คิดเรื่องนี้คือ Apple ใช้ใน Mac OSX 10.6 และ iOS 4 ขึ้นไป

ตอนนี้ยังไม่ได้ศึกษาอะไรมาก note ไว้ก่อนละกัน

Maven Dependency

เรื่องของเรื่องคือ อยากรู้ว่า project ที่ทำอยู่เนี่ย มี dependency อะไรบ้าง version อะไรบ้าง maven มี plug-in ที่ช่วยเรื่องนี้คือ maven-dependency-plugin วิธีใช้ก็แสนจะง่าย ใน pom ไฟล์ใส่ plug-in ลงไปแบบนี้

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.0</version>
      </plugin>
   </plugins>
</build>

เวลาใช้ก็สั่ง

mvn dependency:list -DoutputFile=C:\out\list.txt

อ่านเพิ่มเติม

การใช้ Dependency Plugin ของ Maven 2 ในการ copy Dependency file

วันนี้มีปัญหาเรื่อง build jar จาก maven project ได้แล้ว แต่จะเอา dependency jar ทั้งหมดของมันออกมาได้ยังไงหว่า เนื่องจากผมใช้ Eclipse ในการพัฒนา project ดังนั้นวิธีสุดเถื่อนคือ copy จาก Eclipse นั่นล่ะ แต่… มันทำไม่ได้แฮะ เลยต้องมานั่งหาวิธีใหม่ ไปค้นเจอพระเอกของเรื่องคือ Dependency Plugin ของ Maven วิธีการก็แสนง่าย เขียนตามนี้เลย

<plugins>
<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.0</version>
      <executions>
         <execution>
            <id>copy-dependencies</id>
<phase>package</phase>
            <goals>
               <goal>copy-dependencies</goal>
            </goals>
            <configuration>
               <!-- configure the plugin here -->
            </configuration>
        </execution>
     </executions>
   </plugin>
</plugins>

พอ run maven package เราก็จะได้ dependency jar ทั้งหมดมาอยู่ใน folder ชื่อ dependency

ชีวิตที่มีทางเลือก (มากเกินไป)

นึกไปถึงสมัยจับคอมพิวเตอร์ใหม่ๆ ตอนนั้น OS ยังเป็นดอสจอยังเป็น โมโนโครม สีเขียวๆ จำได้ว่าดอสมีสองค่ายคือ IBM ดอส และ Ms ดอส ส่วนตัวไม่ได้สนใจอะไรมาก เพราะมันมีอยู่แค่สองค่าย แถมไม่รู้ว่ามันต่างกันยังไง มีอะไรก็ใช้อันนั้นไป ผ่านยุคนั้นมาได้อย่างสุขสบาย มาถึงยุคที่ตัวเองต้องมาพัฒนาซอฟต์แวร์บ้าง สมัยเรียนก็มี Borland C กับ Turbo C อันนี้ก็ไม่ต้องเลือกอีก หาอันไหนได้ก็ใช้อันนั้น ให้ผลเหมือนกัน (หลังๆมามี Watcom C แต่ไม่ได้เล่น)

มายุคทองของ OS แต่ช่วงนั้นผมกลับไม่รู้สึกว่าลำบากใจในการเลือก ผมเลือกที่จะใช้ Linux มากกว่า Microsoft Windows แถมช่วงนั้นยังมี OS2 ให้ใช้อีกจากยุคทองของ OS ทำให้ผมโดนบังคับไปกลายๆว่าทุกอย่างที่ใช้ต้องอยู่บน Linux ได้ นั้นทำให้สนใจ PHP, Perl, Java ฯลฯ โดยเฉพาะเรื่องเกี่ยวกับ System ซึ่งช่วงนี้หาคนคุยด้วยยากมาก

ผมเลือก Java เป็นภาษาหลัก ถึงมันจะอ้วน แต่มันก็เป็นคนอ้วนที่มากด้วยประสบการณ์ในการดำเนินชีวิต ยังไม่นับว่าใน Java เองก็มี library/framework ให้เลือกมากเหลือเกิน ถึงในยุคนี้ Java เปรียบกับชายวัยกลางคนที่ ท้วมๆอวบๆไม่คล่องเท่าคนหนุ่มอย่าง RoR แต่มันก็มีทางออกอย่าง Grails

ช่วงนี้ เทคโนโลยีเว็บ ก้าวเข้าสู่ยุค 2.0 บรรดา Javascript library ต่างๆออกมามากมาย ตอนนี้กำลังตัดสินใจเลือกใช้ Prototype กับ JQuery ยังเลือกไม่ได้

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

ไม่รู้ว่าต้องเลือกอะไรอีก แต่คงมีอีกเยอะ ^^”

บ่น บ่น บ่น

Character Encoding กับ CommonsMultipartResolver ใน Spring

เรื่องก็มีอยู่ว่าช่วงนี้ได้มีโอกาสพัฒนางานที่อยู่ในโครงการ OpenCARE โดยได้ลองใช้ extjs ร่วมกับ Spring Framework

ใน application ที่กำลังพัฒนา จะต้องทำการ upload file ไปพร้อมกับการส่งข้อมูลในรูปแบบ text อื่นๆ ดังแสดงในรูปด้านล่าง

อ่านเพิ่มเติม

แก้ Bug thai locale ใน quartz

Quartz เป็น library ที่ทำให้เราสามารถตั้งเวลา run งานใน Java ได้ เหมือนกับที่ทำจาก cron ใน unix นั่นเอง เหตุผลที่เราเอาความสามารถในตั้งเวลา run งาน (schedule) มาทำในตัวโปรแกรมเนื่องจากสามารถบริหารจัดการได้ดีกว่าใน cron อีกทั้ง quartz ยังสามารถทำงานได้ละเอียดในระดับของวินาที

อาการของ bug ตัวนี้คือ ถ้าหากเราใช้ locale ภาษาไทยใน OS ตัว quartz จะไม่ทำงานแถมมี Exception เกิดขึ้นดังนี้

org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.

แต่ถ้าเปลี่ยน locale เป็นภาษาอังกฤษกลับไม่เป็นอะไร ใน Windows XP สามารถแก้ปัญหานี้ได้โดยการเปลี่ยนค่าใน Regional and Language Options ที่ Tab Regional Options ในส่วนของ Standards and formats ให้เป็น English (United States) แทนที่จะเป็น Thai ปัญหานี้ก็จะหมดไป แต่วิธีนี้ไม่ใช่วิธีที่ดีนัก ทางที่ดีเราควรเข้าไปจัดการกับต้นตอของปัญหามากกว่า

อ่านเพิ่มเติม

NJUG Volume2 Code Festival

NJUG Volume2 Code Festival สืบเนื่องมาจากงาน NJUG ครั้งที่แล้วมีเรื่องของ Acegi และ Tapestry ในแบบแห้งๆ ทางสมาชิกภาคี NJUG เล็งเห็นว่าจะได้ประโยชน์มากกว่าถ้าจัดเป็นงานแบบ Code Fest จึงได้จัดงานนี้ขึ้น โดยจะจัดทุกเดือนสลับกับ NJUG meeting ปกติ

คราวนี้มาในเรื่อง Tapestry แบบสดๆโดย พี่ป๊อก สมาชิกก็มากันบางตา อาจจะเพราะ narisa.com ล่มไปเพิ่งกลับมาก่อนงานไม่กี่วันคนเลยนึกว่าไม่จัดแล้ว แต่คนที่มาก็ได้ความรู้ไปเต็มๆ เพราะการสอนของพี่ป๊อกคุณภาพคับแก้วจริงๆ ตัวอย่างที่ยกมาก็พอเห็นภาพของ Tapestry ว่า component centric ที่พูดไว้คราวก่อนมันเป็นยังไง นอกจากนั้นยังมีเรื่องของการใช้ Tapestry กับ Ajax อีกด้วย

ความจริงผมตั้งใจว่าจะทำ broadcast กันสดๆเลยแต่เตรียมไม่ทัน และคิดว่าเราจัดงานแบบนี้บ่อยๆน่าจะมี video server ไว้เก็บข้อมูลพวกนี้ได้แล้ว เอาไว้งานหน้านะครับ :P

งานนี้มีเรื่องสนุกๆคือว่ามี notebook รุ่นเดียวกันถึงสามเครื่องจาก 7 เครื่อง คือรุ่นนี้ครับครองแชมป์ นอกจากนั้นมี iBook และ Mac Book Pro มาให้ยลโฉมเห็นแล้วอยากได้

OS พอๆกัน มี Ubuntu Linux Mac OSX และ Windows XP เจอกันคราวหน้าผมจะลง Linux ไปด้วย แต่ไม่รู้จะเลือก Distro. ไหนเหมือนกัน อาจเป็น Gentoo :P

อ่านเพิ่มเติม