Friday, October 24th, 2008

อาทิตย์นี้นั่งเขียน Cache ให้ Flex โดยการเอาโค้ดที่อยู่ในฝั่งจาวามาดัดแปลงนิดหน่อย(ฝั่งจาวาก็เขียนเอง ฝั่ง Flex ก็เขียนเอง - -”) แต่ว่าด้วยความเคยชินในรูปแบบของจาวาทำให้อยากเขียนให้ Flex มันมี Abstract class ด้วยก็เลยนั่งขุดๆ หาว่าจะทำยังไงได้บ้าง สุดท้ายเลยไปดูว่า Abstract class มันมีคุณสมบัติยังไงบ้างแทน ท่าทางจะง่ายกว่า ^^!

Abstract class ในฝั่งจาวาจริงๆ แล้วมันก็มีคุณสมบัติง่ายๆ คือสร้างตรงๆ ไม่ได้ด้วยคีย์เวิร์ด new ต้องเอาไปสืบทอดต่อ แล้วสร้างลูกขึ้นมาแทน ไว้สำหรับนิยามพฤติกรรมพื้นฐานที่ลูกน่าจะมีเหมือนกันเอาไว้ และก็สามารถกำหนดพฤติกรรมบางอย่างได้ด้วย โดยให้ลูกเอาไปทำต่อเองว่าลูกแต่ละตัวพฤติกรรมเดียวกันนี้ จะมีลักษณะท่าทางยังไง อย่างอื่นก็เหมือนคลาสโดยทั่วไป

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

class AbstractClass {
  function AbstractClass():void { throw new Error("Must inherit this class") }
  function firstBehavior():void { throw new Error("Must implement this function") }
 
  function secondBehavior():void {
    Alert("Hello, world")
    firstBehavior()
  }
}

ง่ายกว่าที่คิดเยอะเลย ^^!

Tuesday, October 7th, 2008

บันทึกเก็บอีกแล้วคราวนี้มีปัญหาเกี่ยวกับเอา ant มาคอมไพล์ Flex เพราะคอมไพล์แล้วปรากฏว่าภาษาไทยใช้ไม่ได้ เลยนั่งหาวิธีแก้เสียเวลาไปค่อนวันเอามาแปะไว้ที่นี่หน่อย

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 <project name="sample" default="build" basedir=".">
  <taskdef resource="flexTasks.tasks" classpath="lib/flexTasks.jar" />
  <property name="FLEX_HOME" value="/path/to/flex/sdk" />
  <target name="build">
   <mxmlc debug="true" optimize="true" warn-duplicate-variable-def="false" warn-no-type-decl="false" warn-missing-namespace-decl="false" show-binding-warnings="false" fork="true">
    <jvmarg value="-Xmx1048M" />
    <jvmarg value="-Xms256M" />
 
    <locale>en_US</locale>
    <locale>th_TH</locale>
 
    <compiler.library-path dir="libs" append="true">
     <include name="*.swc" />
    </compiler.library-path>
 
    <source-path>src</source-path>
    <source-path>resources/{locale}</source-path>
    <source-path path-element="external/components/path" />
   </mxmlc>
  </target>
 </project>

อธิบายทีละบรรทัด เริ่มจาก
บรรทัดที่ 2 ใส่ task library เพิ่มเข้าไปเพื่อให้ ant รู้จัก tag ของ Flex
บรรทัดที่ 5 เป็นส่วนที่กำหนดค่าพื้นฐานต่างๆ ให้กับ mxmlc ที่สำคัญๆ ก็จะมี optimize ที่ทำให้ .swf ขนาดเล็กลงหน่อย แล้วก็ fork ในกรณีที่เจอปัญหาที่มันโวยวายว่า memory ไม่พอ
บรรทัดที่ 6 - 7 เป็นการเพิ่มพื้นที่ให้ ant ใช้ในการคอมไพล์
บรรทัดที่ 9 - 10 กำหนดภาษาที่จะแนบไปใน swf นี้ด้วย
บรรทัดที่ 12 - 14 กำหนดว่าให้เอาไฟล์ swc ไหนบ้างมาใช้ในการคอมไพล์ด้วย
บรรทัดที่ 16 - 18 บอกตำแหน่งที่เก็บโค้ดของโครงการที่จะคอมไพล์

เหมือนจะดองเรื่อง JMeter ไว้อยู่ ดองไว้อีกนิดละกัน ^^!

Thursday, August 21st, 2008

ตอนแรกกะว่าจะเขียนวันเดียวกับเรื่อง Tree แต่ด้วยความขี้เกียจบวกกับเมื่อวานกะทำงานหลายๆ อย่างให้เสร็จเลยไม่ได้เขียน ยกยอดมาเขียนวันนี้แทน เรื่องนี้เป็นเรื่องที่สองที่ได้จากการทำ FeedReader แล้วทำให้รู้ว่า Flex มันไม่สามารถหาวิธีทำได้จากคู่มือที่มีให้ในเว็บ Adobe ต้องใช้ความสามารถในการใส่ keyword ให้ google เข้าช่วยอย่างมาก

เรื่อง ของเรื่องก็คือ xml ที่ Google ส่งมาใน Google Reader มีการใช้ namespace อยู่สามตัวในการแบ่ง tag ต่างๆคราวนี้พอได้รับข้อมูลมาแล้วจะเอามาอ่านใส่ตัวแปรโดยไม่มีการกำหนด namespace ให้มันปรากฏว่า Flex มันก็จะอ่านข้อมูลตัวนั้นออกมาเป็นตัวแปรแบบปกติไม่ได้เช่น

<?xml version="1.0"?>
<feed xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom">
<generator uri="http://www.google.com/reader">Google Reader</generator>
<id>tag:google.com,2005:reader/user/10757961596074723521/state/com.google/reading-list</id>
<title>แนท's reading list in Google Reader</title>
<gr:continuation>CLv69f7_nZUC</gr:continuation>
<link rel="self" href="http://www.google.com/reader/atom/"/>
  <author>
    <name>แนท</name>
  </author>
<updated>2008-08-21T08:07:03Z</updated>
<entry gr:crawl-timestamp-msec="1219306023740">
  <id gr:original-id="http://gizmodo.com/5039814/logitech-speed-force-wireless-is-first-racing-wheel-for-wii">tag:google.com,2005:reader/item/8c96bd9a8e5c1cb5</id>
  <category term="user/10757961596074723521/label/english" scheme="http://www.google.com/reader/" label="english"/>
  ....
  </id>
</entry>
</feed>

ขี้เกียจเอามาหมดยาว จะเห็นว่าแท๊กพิเศษอยู่เช่น gr:…. แต่อย่างไรก็ตามด้านบนมันก็ได้กำหนดไว้แล้วว่าอะไรคือ namespace default (xmlns ที่ไม่มี : บอกว่าใช้ namespace อะไรนำหน้านั่นแหละ) แต่ Flex มันดั้นไม่ฉลาดพอที่จะเลือกมาให้เอง สุดท้ายก็เลยต้องกำหนดให้มันหน่อยเป็น

default xml namespace = new Namespace('http://www.w3.org/2005/Atom')
//...flex code...
default xml namespace = null

โดยก่อนออกฟังก์ชั่นต้องเปลี่ยนกลับให้มันเป็น null ด้วยไม่งั้นอาจเจอ Error ที่คาดไม่ถึงได้ (จำไม่ได้แล้วว่า Error ไรขี้เกียจทำให้มันขึ้นมาซะด้วยสิ)
อืมหลังจากทำ FeedReader มาถึงตรงนี้ก็เริ่มคิดว่า ทำต่อไปเรื่อยๆ จะเจออะไรพิศดารอีกไหม(ซึ่งคาดว่าต้องเจออีกแน่นอน) อย่าง namespace ก็ไม่เคยคิดว่าจะต้องตั้งให้มันอย่างนี้ ตอนแรกนึกว่าจะใส่ให้กับตัวแปรที่เป็นตัวเก็บข้อมูล xml ธรรมดาๆ ซะอีก ไม่เป็นไร เดี๊ยวลองเล่นกับ sqlite ก็ได้รู้กัน