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()
  }
}

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

Wednesday, August 6th, 2008

เล่าเรื่องงานอีกหละ ฮะๆๆ วันนี้มีสิ่งที่ต้องทำอยู่หนึ่งอย่าง(หลังจากอัดทำไปในสองวันแรก วันหลังๆ เลยรู้สึกน้อยเลย -_-”) คือหาทางกรองข้อมูล คราวนี้ข้อมูลที่มามันเป็นอย่างนี้

xxxhello55xxxx garbage garbage xxxx
xworld6xxx garbage garbage xxxx
xxxxxxbaa7777xxxx garbage garbage xxxx

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

73
74
75
76
77
for (String data:datas) {
 Matcher m = Pattern.compile("[a-z]+\\d+").matcher(data);
 m.find();
 System.out.println(m.group());
}

เห้ย อะไรมันจะยุ่งยากงี้ฟะ ทำไมมันต้องทำหลายขั้นตอนงี้ด้วย ต้องการแค่หารูปแบบที่ต้องการใน String เท่านั้นเอง ทำไมมันไม่มีอะไรง่ายๆ แบบบรรทัดเดียวจบบ้างฟะเช่น

String[] outputs = datas.find("[a-z]+\\d+");

เห้อ ลองส่งไปใน Twitter ก็ได้คำแนะนำจาก @sugree มาว่าใช้ python เถอะ รู้สึกเห็นด้วยเลย T T” แต่ว่าส่วนนี้เป็นงานที่ทำและแก้ไขกันมาอย่างยาวนานแล้ว ถ้าจะให้เปลี่ยนเป็น python อาจจะกระอักเลือดได้ เพราะงั้นใช้ต่อไป แล้วงานส่วนตัวใช้ภาษาอื่นที่ไม่ใช่จาวาดีกว่า ท่าทางจะประหยัดแรงเป็นที่สุด
ปอลอ. หลายคนอาจจะสงสัยว่าทำไม expression ที่ใช้ไม่ทำเป็น \\w+ ไปเลย เหตุผลจริงๆ แล้วมาจากข้อมูลที่รูปแบบของ expression จริงๆ มันเป็น [a-z]{2,3}\\w+ หนะ คือเป็นตัวอักษรด้านหน้า 2-3 ตัวแล้วค่อยตามด้วยตัวเลข ไม่ไช่ เป็นตัวอักษรและตัวเลขสลับกันเหมือน \\w+ เลย
ปอลอสอง. เอาของ python มาเทียบ

re.search('[a-z]{2,3}\d+', data)
Wednesday, July 23rd, 2008

มีงานแบบอย่างด่วนวิ่งเข้าหาแบบไม่ทันรับมือตั้งแต่เมื่อวาน ตอนแรกนึกว่าจะเสร็จแล้ววันนี้ต้องแก้ใหม่ด้วย NFS ไม่สามารถใช้ได้อีก วันนี้เลยต้องหาทางส่งข้อมูลขนาดใหญ่ด้วยวิธีอื่นแทน แล้วก็มีมติมาว่าใช้ FTP ก็เลยต้องไปหาวิธีใช้ในจาวามาซะนี่
ลองหาในอากู๋ดูก็เจออยู่หลายเว็บแต่ว่าที่ใช้มีอยู่เว็บเดียวคือ Javaworld: Java FTP Library Review เพราะอยากได้อะไรคร่าวๆ ไม่ต้องละเอียดมาก ไม่ต้องหาอะไรมาลงเพิ่ม แล้วก็ทำให้รู้อย่างนึงว่า มันมีอยู่แล้วแต่มีข้อเสียคือ มันต้องปิดเปิดบ่อยๆ ดังนั้นส่งไฟล์เล็กๆ หลายๆ ไฟล์ท่าทางจะไม่ดีแต่ไม่เป็นไร ยังไงไฟล์ที่ส่งก็ใหญ่อยู่และ (ได้ยินมาว่ามากกว่า 5GB ต่อไฟล์ -_-”) ขี้เกียจบ่นมากและ ดูโค้ดเลยละกัน เพราะอันนี้กะว่าเขียนเก็บเท่านั้นแล

        String ftpTarget = String.format("ftp://%s:%s@%s/%s%s;type=i", user,
            pass, target, prefix, filename);
        URL url = new URL(ftpTarget);
        URLConnection connection = url.openConnection();
        OutputStream out = connection.getOutputStream();
        FileInputStream in = new FileInputStream(filename);
 
        byte[] data = new byte[16384];
        while (true) {
          int count = in.read(data);
          if (count <= 0)
            break;
          out.write(data, 0, count);
        }
        out.close();
        in.close();

แค่นี้แหละ ไว้ส่งไฟล์อย่างเดียว จบ ;p