0

Laemya – A lightweight web framework

ช่วงนี้ผมเขียน PHP ปกติใช้ CakePHP แต่คราวนี้อยากได้อะไรที่บางกว่า CakePHP สักหน่อย แต่ว่าก็ยังติดใช้ CakePHP อยู่ทำไปทำมาก็เลยก็โปรแกรมอะไรบางอย่างออกมา ไม่รู้ว่าเรียกว่า web framework ได้เปล่า แต่ก็แยกมันออกมาและตั้งชื่อว่า “แหลมหญ้า” (laemya) ตามเขาแหลมหญ้าอุทยานแห่งชาติที่ผมไปเที่ยวบ่อยที่สุด

พยายามจะเขียนเป็นแบบ MVC แต่ก็คงไม่ค่อยเหมือนเท่าไหร่ ไม่ได้อาศัพพวก mod_rewrite หลักๆ แล้วก็ยังใช้การไปเรียกไฟล์ตรงๆ เหมือนใช้ PHP ปกติ แต่ว่า มี code บนหัวไฟล์นิดหน่อยที่จะไปโหลดพวก controller และ model มาให้ แบบนี้ เช่นผมจะสร้างเว็บที่ http://localhost/user/laemya.php ผมก็ไปสร้างไฟล์ user/laemya.php ขึ้นมาแบบนี้

<?php
    require_once "../laemya.php";
    laemya_init(__FILE__);
?>
<?php function title() { return "Laemya test page"; } ?>
<?php laemya_header() ?>
<div>
<?php
    print_r($data);
?>
</div>
<?php laemya_footer() ?>

โปรแกรม 2 บรรทัดข้างบนจะไปสร้าง controller และสร้าง model ยัดใส่ controller ไว้ ส่วน $data ที่ไม่รู้มาจากไหนก็คือผลลัพธ์ที่คืนมาจาก controller

ก็เลยต้องไปสร้าง model รอไว้ก่อน ใน model/user.php

<?php
    class User extends AppModel {
        var $table = 'users';

        function __construct() {
            parent::__construct();
        }
}
?>

model นี้ก็ไม่ได้ถึงกับเป็น orm หรอก ก็แค่ไปเรียกใช้ mdb2 อีกที แต่ก็มีตัวช่วยบ้าง ตามที่ผมจะอยากใช้

ตาราง users หน้าตาประมาณนี้

mysql> desc users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment | 
| username | varchar(255) | NO   | UNI | NULL    |                | 
| realname | text         | NO   |     | NULL    |                | 
| email    | varchar(255) | NO   | UNI | NULL    |                | 
| password | varchar(255) | NO   |     | NULL    |                | 
| group_id | int(11)      | NO   |     | NULL    |                | 
+----------+--------------+------+-----+---------+----------------+
6 rows in set (0.05 sec)

ทีนี้ก็ลองดู controller ชื่อ controller/user_controller.php

<?php
    class UserController extends Controller {
        function laemya() {
            return $this->User->findAll();          
        }
    }
?>

user/laemya.php มันก็จะมาเรียก method ชื่อ laemya ใน UserController เอง แล้ว UserController ก็ไป query database มาแบบง่ายๆ แล้วคืนผลไป

นอกจากข้างบนแล้ว laemya ก็ยังมี feature พวกนี้ (ที่ปกติ framework ก็มักจะมีกันหมด)

  • authentication – พอใส่ var $auth = true; ลงใน controller มันก็จะถูกเรียกใช้งาน ถ้าอยากให้ controller ถูก protect ก็สร้าง method ชื่อ before ใน controller แล้วเรียก $this->checkUser() ใน before
  • column แบบ json ใน model ใส่ var $jsonColumns = array(“ชื่อ column”) แล้ว model ก็จะแปลง json กับ php ให้เวลาสั่ง findAll กับ save
  • มี validator ด้วย โดยสร้าง method ชื่อ validate ใน model แล้ว return array ที่ประมาณ array(‘user’ => ‘is required’) ออกมา
  • กำหนดได้ว่าจะให้ใส่ model ไหนใน controller บ้างใช้ var $uses = array(‘ชื่อ model’, ‘ชื่อ model’ …);
  • พวก $this->redirect และ $this->flash อะไรแบบนี้ก็ใช้ได้ด้วย

อีกนิดหนึ่งคือ laemya ไม่ได้อ่าน scheme ของ database เวลาจะใช้ save ใน model ต้องบอกมันด้วยว่ามี column อะไร type อะไร แบบนี้

<?php
    class MyModel extends AppModel {
        var $table = 'mytable';
        var $jsonColumns = array('tree');
        var $columns = array('owner_id', 'tree');
        var $types = array('integer', 'text');

        function __construct() {
            parent::__construct();
        }
    }
?>

ถ้าอยาก query ซับซ้อนขึ้นหน่อยก็ต้องเขียน SQL

<?php
    class User extends AppModel {
        var $table = 'users';

        function __construct() {
            parent::__construct();
        }
        
        function auth($email, $password) {
            $types = array('text', 'text');
            $password = md5($password);
            $sth = $this->db->prepare("select id from " . 
                $this->table . 
                " where email=? and password=?", $types);
            $data = array($email, $password);
            $result = $sth->execute($data);
            if (PEAR::isError($result)) 
                die($result->getMessage());
            $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC);
            return $row;
        }
    }
?>

หลักแล้วก็ใช้ mdb2 แต่ว่าต่อไปก็อาจจะมีตัวช่วยเพิ่มขึ้น database ต่อที่ไหน ต้องไปแก้ใน cfg/config.php และพร้อม base url …

ถ้าทราบว่ามีโครงการไหนทำแนวๆ นี้อยู่แล้วช่วยบอกผมด้วยนะครับ เผื่อจะเลิกทำเอง

ลืมบอกว่า project อยู่ที่ http://laemya.sourceforge.net/ ตอนนี้ยังไม่มี package ครับ แต่ว่าสามารถโหลดได้โดย

hg clone http://laemya.hg.sourceforge.net:8000/hgroot/laemya/laemya 
0

Dynamic class instantiation ใน PHP

ไม่ทราบว่าใช้คำถูกต้องหรือเปล่านะครับ ประมาณว่าถ้าผมครับ คืออยากจะสร้าง class ตาม string ที่ให้มาเวลารัน แทนที่จะต้องบอกว่า class ชื่ออะไร วิธีก็คือใช้ reflection class อ่านมาจาก stackoverflow

<?php
    class Toto {
        function printToto() {
            print "This is Toto.\n";
        }
    }
    $className = "Toto";
    $reflectionClass = new ReflectionClass($className);
    $toto = $reflectionClass->newInstance();
    $toto->printToto();
?>

เวลาจะเปลี่ยนชื่อ class ที่จะเอามาสร้าง object ก็เปลี่ยนที่ $className ได้เลย กะว่าจะเอามาใช้กับ controller และ model

0

จิ้งจกเมืองกรุง

นั่งรอกินอาหารเย็น จริงๆ แล้วมันควรจะเป็นอาหารกลางวัน แต่ออกจากบ้านช้าก็เลยเป็นอาหารกลางวันไป ช่วงนี้ฝนก็ตก ไม่รู้จะถ่ายรูปอะไร เห็นจิ้งจกลายสวยดีก็เลยคว้ากล้องมาถ่าย
(คลิกดูรูปใหญ่ได้นะครับ)

A gecko in Bangkok

gecko1.jpg

ไม่รู้เพราะมันอยู่ใกล้ต้นมะม่วงหรือเปล่าลายเลยเป็นแบบนี้ ปกติเห็นที่บ้านมันไม่ค่อยมีลาย … แถมเหมือนจะเลิกหาแมลงแต่ไปคุ้ยถังขยะแทน

0

ดอกชงโค (หน้าหอชงโค)

เดินไปในเกษตรฯ เพราะว่าลงรถที่ประตูวิภาวดี เดินไกลเหมือนกัน ผ่านไปเจอต้นอะไรก็ไม่รู้ อีกแล้ว ดอกแปลกดี สำหรับหลายคนอาจจะไม่แปลก แต่ผมไม่รู้จัก …

ดอกสวยดี PA220024.JPG

ต้นเกือบๆ จะใหญ่ PA220025.JPG

ป.ล. พี่ดาบอกว่าดอกชงโค

0

ไปฟังเรื่อง Statistical machine translation ของ CAS-ICT

ตามที่ได้เมล์มาจาก http://groups.google.com/group/thlta/browse_thread/thread/633acafdd560b738 มีบรรยายเรื่อง SMT ที่ CAS-ICT โดย Prof. Dr. LIU Qun วันนี้ก็ได้ไปฟังมาแล้ว ได้ความรู้มากกว่าที่คาดไว้อีก เรื่องแปลโดยใช้ Forest ผมโหลดไฟล์มาแล้ว แต่ยังไม่ได้อ่าน พอไปฟังแล้วก็จับประเด็นได้เลย ^_^

จัด 10 โมงเช้าเวลากำลังดีครับ แต่ก็อย่าที่ทราบกันว่า อุทยานวิทยาศาสตร์ ออกจะไกลสักหน่อย ผมก็เลยตื่นมาตั้งแต่ 6 โมงครึ่ง แล้วก็ไม่รู้ทำอะไรอยู่กว่าจะได้ออกจากบ้างก็ 8 โมง แต่ก็ไปทัน

PA227457.JPG

ให้ดูว่าผมไปทันด้วย :-P

ไม่นานนัก ดร.เทพชัย ก็เปิดงาน

PA220003.JPG

เริ่มบรรยายแล้ว

Prof. Dr. Lui Qun

ภาพของบนใช้โทรศัพท์มือถือถ่าย แต่ว่าสิ่งที่สนใจคือ มี Vauquois triangle บน slide ด้วย แต่ว่าเขียนมาเพื่อใช้อธิบาย SMT เวลานี้

PA227461.JPG

Prof. Dr. LIU Qun แบ่งระดับการวิเคราะห์ที่ใช้ในการแปลเป็น 2 ระดับ คร่าวๆ คือ Phrase-based SMT และ Syntax-based SMT

Syntax-based SMT ยังแบ่งได้เป็น 2 ระดับย่อยๆ อีกคือ แบบที่ใช้ linguistic syntax กับ formal syntax แบบ linguistic syntax คือใช้ต้นไม้ที่อ้างอิงความรู้ทางภาษาศาสตร์ ส่วน formal syntax ก็ออกมาเป็น tree เหมือนกัน แต่ tree ที่สร้างไม่จำเป็นต้องเป็น tree ที่ถูกต้องตามหลักภาษาศาสตร์

SMT ที่แปลง tree แบบ linguistic syntax ไปเป็น อีกข้อความอีกภาษาเรียกว่า Tree-to-String SMT

ถ้าผมเข้าใจผิดก็ช่วยทักท้วงด้วยนะครับ

PA227463.JPG

ตามธรรมเนียมก็มอบของที่ระลึกกันไป ขอโทษที่ไม่ชัดนะครับ

Sunlong bus

เสร็จงานแล้วผมก็นั่งรถเมล์ ปอ. 29 กลับมาจากธรรมศาสตร์ ศูนย์รังสิต ครับ 20 บาท ถ้วน ถูกกว่า 510 ขาไป 4 บาท ขากลับรถเมล์ก็มาจากจีนครับยี่ห้อ Sunlong

นอกจากเรื่องวิชาการแล้วแนวการทำงานวิจัย CAS-ICT ก็ดูเน้นทางวิทยาการคอมพิวเตอร์มากกว่าภาษาศาสตร์ ถ้าผมจำไม่ผิดที่นั่นมีนักศึกษาปริญญาเอก ประมาณ 10 คน ปริญญาโทอีกประมาณ 10 คน software engineer อีก 3 คน ไม่มีนักภาษาศาสตร์เลย แม้แต่คนเดียว ผมคิดว่าที่ทำแบบนี้ได้น่าจะเป็นเพราะภาษาจีนมีทรัพยากรณ์ทางภาษาเช่น คลังต้นไม้ (Treebank) และ คลังข้อความขนาน (Parallel corpus) มากพอ งานที่นักภาษาศาสตร์ก็อยู่ในคลังต้นไม้อยู่แล้ว

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

c1 c2 c3 $X c4 $Y c5 c6
e1 $Y e2 $X e3 e4

โดยที่ e1, e2, e3 … เป็นคำภาษาอังกฤษ และ c1, c2, c3 … เป็นคำภาษาจีน ส่วน $X และ $Y ก็เป็นตัวแปรที่จะเปลี่ยนไปได้เรื่อยๆ (ผมเขียนแบบนี้เพราะจำตัวอย่างชัดๆ ไม่ได้)

ทุกภาพในบันทึกนี้สามารถคลิกดูภาพใหญ่ได้ครับ ทุกภาพใช้สัญญาอนุญาตแบบ Attribution-Noncommercial-No Derivative Works 2.0 Generic (คร่าวแล้วก็คือเอาไปใช้ได้นั่นเองครับ ส่วนรายละเอียดสามารถตามลิงค์ไปอ่านได้)

1

ดอกปักษาสวรรค์ – ภาพถ่าย

ดอกปักษาสวรรค์ เป็นสิ่งหนึ่งที่ผมเห็นไม่ได้ต้องควักกล้องออกมาถ่าย แต่ส่วนมาภาพออกมาก็ดูแย่ๆ ภาพนี้ก็อาจจะดูแย่อยู่ดี แต่ว่าตั้งแต่ถามถ่ายรูปดอกไม้ชนิดนี้มา 2 ปีเห็นจะได้ รูปนี้อาจจะเป็นรูปที่ดีที่สุดของผมแล้วก็ได้

ดอกปักษาสวรรค์

ใช้กล้อง Olympus FE-20 ถ่าย ใช้ Gimp ทำหลายอย่าง ทั้ง crop ทั้งปรับ curve แล้วก็ทำ unsharp mark แล้วก็ใส่ lomo filter ให้มันเบลอะซะงั้น

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

bird of paradise

อยากจะไปถ่ายซ่อมจริงๆ แต่ช่วงนี้เจอฝนเข้าไป …

7

ไปฟังเรื่องเครื่องแปลภาษาแบบใช้สถิติ (statistical machine translation) กันไหม

บรรยายโดย Prof. Dr. LIU Qun จาก Institute of Computing Technology, Chinese Academy of Sciences หัวข้อ “Statistical Machine Translation Research in CAS-ICT” จัดโดย หน่วยปฏิบัติการวิจัยวิทยาการมนุษยภาษา (HLT) ศูนย์อิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ (เนคเทค) ดูรายละเอียดเพิ่มเติมได้ที่ http://groups.google.com/group/thlta/browse_thread/thread/633acafdd560b738