ย้ายบล็อกไปที่ bact.cc แล้วนะครับ

พ.ร.บ.คอมพิวเตอร์
หยุด ร่างพ.ร.บ.คอมพิวเตอร์
พื้นที่เก็บข้อมูลออนไลน์ ฟรี 2GB จาก Dropbox (sync กับ Windows, Linux, Mac, iPhone, Android ฯลฯ ได้)
Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

2009-07-22

แปะ embed ง่าย ด้วย oEmbed

oEmbed is a format for allowing an embedded representation of a URL on third party sites. The simple API allows a website to display embedded content (such as photos or videos) when a user posts a link to that resource, without having to parse the resource directly.

ไอเดียแก่นของ social media หรือ สื่อทางสังคม ก็คือมัน(ต้อง) share หรือ แบ่งปัน ได้ง่าย การบอกต่อมันถึงจะไปได้ไกล

oEmbed เป็นข้อตกลงสำหรับรูปแบบการ แปะ สื่อ embed (เช่น วิดีโอ เสียง แฟลช) ที่ทำให้ผู้ใช้แปะเพียง url ไม่ต้องแปะโค้ด html ยาว ๆ ซึ่งนอกจากจะงงแล้ว ยังมีโอกาสผิดพลาดด้วย

เมื่อเว็บไซต์พบ url ที่ผู้ใช้ใส่เข้ามา ก็จะวิ่งไปถามตัวผู้ให้บริการสื่อชิ้นนั้น ว่าควรจะใช้โค้ด html แบบไหน แล้วจัดการที่เหลือให้อัตโนมัติ เช่น:

  1. ผู้ใช้แปะลิงก์รูป http://www.flickr.com/photos/bees/2341623661/ ในเว็บบอร์ด
  2. เว็บบอร์ดพบว่า ลิงก์ดังกล่าว เข้าแก๊ป URL scheme: http://*.flickr.com/photos/* ซึ่งแปลว่าเป็น embed representation ซึ่งเชื่อมอยู่กับ API endpoint: http://www.flickr.com/services/oembed/
  3. เว็บบอร์ดจึงถามข้อมูลของ embed ตัวนี้ ไปที่ API endpoint โดยใช้ request ดังนี้ http://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/bees/2341623661/
  4. ตัว API ส่งข้อมูลกลับมาให้เว็บบอร์ด เป็น XML หรือ JSON เช่น
    {
     "version": "1.0",
     "type": "photo",
     "width": 240,
     "height": 160,
     "title": "ZB8T0193",
     "url": "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg",
     "author_name": "Bees",
     "author_url": "http://www.flickr.com/photos/bees/",
     "provider_name": "Flickr",
     "provider_url": "http://www.flickr.com/"
    }
    
  5. ตัวเว็บบอร์ด ก็จะเอาข้อมูลตรงนี้ ไปสร้างโค้ด embed ให้เอง

ในมุมมองของผู้ใช้แล้ว แบบนี้ง่ายกว่าเยอะ

ในมุมมองของนักพัฒนาเว็บ แบบนี้ก็ปลอดภัยกว่าด้วย เนื่องจากการได้ข้อมูลของสื่อ embed ผ่าน oEmbed API ทำให้เราไม่ต้องเดาข้อมูลต่าง ๆ เอง หรือ parse ข้อมูลแบบ hack ๆ กันเอาเอง ซึ่งแม้จะใช้งานได้ แต่ถ้าเมื่อไหร่ url หรือ html ของหน้าสื่อนั้นเปลี่ยน ก็จะเกิด dead link ทันที

มีบริการรับฝากสื่อออนไลน์หลายแห่งใช้ oEmbed แล้ว เช่น Flickr สำหรับภาพ และ Vimeo สำหรับภาพเคลื่อนไหว

Providers (ตอบ request oEmbed ได้): Flickr, Viddler, Qik, Pownce, Revision3, Hulu, Vimeo, oohEmbed — ตัวหลังสุดนี้ มันเป็นประมาณ wrapper ของหลาย ๆ บริการอีกทีนึง เช่น Amazon (Ars Technica ใช้บริการจาก oohEmbed ตัวนี้)

Consumers (แสดงลิงก์ oEmbed ได้): Pownce, Buckybase , 280 Slides, Dumble

สำหรับ WordPress มีปลั๊กอินสำหรับ oEmbed แล้วหนึ่งตัว คือ NFB Video Plugin ใช้งานได้กับ NFB (National Film Board of Canada) และ Vimeo (เป็นวิดีโอทั้งคู่)

Drupal มีก็มีโมดูล oEmbed

ถ้าอยากจะเขียนเล่นเอง ก็มีไลบรารีอำนวยความสะดวกสำหรับหลายภาษา:

น่าเอาไปใช้กะโปรเจกต์ของโอเพ่นดรีมมั่ง

technorati tags: , ,

2009-02-06

XMLHttpRequest with "lese-majeste" in the url got blocked as well - Holy CS Loxinfo

อัปเดตต่อจากกรณี Mashable.com got blocked - ความมั่วของ CS Loxinfo กับการบล็อคเว็บ

จากการทดลองเพิ่มเติม พบว่า web api request (ซึ่งทำผ่าน url) ก็จะใช้ไม่ได้เช่นกัน

เช่น ผมลองใช้บริการย่อลิงก์ ของ bit.ly โดยใช้ url :

http://klongofconsciousness.wordpress.com/2009/01/23/dozing-german-arrested-for-lese-majeste/*

ปรากฎว่า bit.ly มันเงียบครับ ไม่แสดงผลลัพธ์อะไร (ตามปกติมันจะแสดงผลลัพธ์ลิงก์ที่ถูกย่อ ในช่อง “Shortened URL”)

เมื่อตรวจสอบดูก็พบว่า เมื่อกดปุ่ม “Shorten” ตัวหน้าเว็บ จะส่ง XMLHttpRequest ไปที่ http://bit.ly/api เรียกใช้บริการที่เซิร์ฟเวอร์ของ bit.ly เพื่อรับผลลัพธ์ (ตามลักษณะการเขียนโปรแกรมแบบ AJAX ซึ่งปัจจุบันนี้นิยมทั่วไป)

โดยในการส่ง request ที่ว่านี้ ก็จะทำในรูปของการเรียก url ปกติ ซึ่งกรณีนี้ ก็จะเป็นในรูปแบบนี้ :

http://bit.ly/api?method=shorten&long_url=http%3A%2F%2Fklongofconsciousness.wordpress.com%2F2009%2F01%2F23%2Fdozing-german-arrested-for-lese-majeste%2F&keyword=&history=1&t=1233903997567

method=shorten นั้นคือระบุว่า ใช้เรียกใช้เมธทอดที่ชื่อ shorten; long_url=... ก็ระบุว่าจะย่อลิงก์อะไร; ที่เหลือก็เป็นพารามิเตอร์ต่าง ๆ

จะเห็นว่าปัญหาอยู่ตรงที่ว่า long_url นั้นไม่ได้เข้ารหัส ดังนั้นถ้าใส่ลิงก์ที่มีคำว่า “lese-majeste” เข้าไปให้ bit.ly ย่อให้หน่อย คำเดียวกันนี้ก็จะปรากฏอยู่ในพารามิเตอร์ที่จะส่ง XMLHttpRequest ซึ่งก็จะไปปรากฏอยู่ใน url — แล้วก็จะถูกบล็อคทันที (อย่างน้อยที่ทราบโดยไอเอสพีหนึ่งแห่ง คือ CS Loxinfo)

ดังนั้นสิ่งที่ request ดัง url ข้างต้น (หรือ url ใด ๆ ที่มีคำว่า “lese-majeste” หรือ “lesemajeste”) จะได้รับ respond กลับมา ก็จะเป็นหน้า “404 หลอก” ซึ่งไม่ใช่รูปแบบข้อมูลอย่างที่โปรแกรมคาดหวังไว้ (เช่น XML หรือ JSON) โปรแกรมจึงทำงานต่อไม่ได้ ... ก็เลยเงียบ

เจ๋งไหม ?

(* เป็นข่าวเมื่อ 22 ม.ค. 2552 Klaus Brehmer ชายชาวเยอรมันคนหนึ่งนั่งในโรงหนังที่เวิลด์เทรด แล้วในขณะนั้นมีเพลงสรรเสริญบรรเลง คนในโรงหนังเลยโห่ ตะโกน และเอาน้ำราดหัวเขา จากนั้นตำรวจก็มาจับเขาไป - โอ้ อารยะประเทศ)


ใครที่เขียนโปรแกรมบนเว็บ/โปรแกรมที่ทำงานกับเว็บ แล้วมีผู้ใช้บริการหรือลูกค้า แจ้งมาว่าโปรแกรมทำงานผิดปกติ ลองเช็คเรื่องการบล็อคเว็บด้วย ถ้าคุณทำ request ใด ๆ ผ่านเว็บ ก็มีโอกาสจะโดนบล็อคได้เสมอ (หลายครั้งเกิดจากความมั่ว ๆ - Mashable.com ยังโดนได้เลย) ลองถามผู้ใช้บริการของคุณ ว่าใช้เน็ตยี่ห้อไหน ถ้าเป็นไปได้ ก็แนะนำให้เขาเปลี่ยนยี่ห้อไอเอสพีไปเลย ตัดปัญหา

ส่วนใครที่บล็อคเว็บแบบเหมารวม-มักง่ายแบบนี้ ไม่ว่าจะเป็นรัฐ หน่วยงานราชการ สถานศึกษา หรือไอเอสพี ก็ขอความกรุณาปรับปรุงการทำงานด้วย ถ้ามีคำสั่งศาลมาให้บล็อคก็บล็อคตาม url ที่ศาลสั่งมาไป ไม่ใช่ใช้ keyword filtering แบบนี้ มันกระทบกับคนอื่นเว็บอื่นที่ไม่ได้เกี่ยวข้องด้วย อย่ามักง่าย


อัปเดต : ผมดันไปตั้งชื่อหัวข้อของโพสต์นี้มีคำว่า “lese majeste”, ใน url ของโพสต์นี้ ก็เลยมีคำนั้นไปด้วย ใครใช้ CS Loxinfo ก็จะกดเข้ามาดูโพสต์นี้ตรง ๆ ไม่ได้นะครับ. ถ้าใช้โปรแกรมอ่าน feed ที่ทำงานที่ฝั่งไคลเอนต์ก็อาจจะไม่ได้ด้วย - เพราะใน feed ของโพสต์นี้ ซึ่งใช้ Feedburner มันก็มีชื่อหัวข้ออยู่ด้วย (http://feeds.feedburner.com/%7Er/bact/%7E3/533175999/xmlhttprequest-with-lese-majeste-in-url.html). อย่างไรก็ตาม ยังสามารถอ่านได้ในหน้ารวมของบล็อก หรืออ่านผ่าน feed reader ที่ทำงานฝั่งเซิร์ฟเวอร์ อย่าง Google Reader. ลุ่มลึกดีครับ อารยะประเทศ.

technorati tags: , , ,

2008-12-14

Robocode Thailand Contest 2009

Robocode Thailand Contest 2009 การแข่งขันการเขียนโปรแกรมจาวาเพื่อควบคุมหุ่นยนต์รถถัง

Robocode เป็นเกมที่แต่ละทีมจะพัฒนาโปรแกรมด้วยภาษาจาวา เพื่อควบคุมหุ่นยนต์รถถังให้ต่อสู้กันแบบอัตโนมัติ โดยแต่ละทีมไม่สามารถควบคุมหุ่นยนต์ของตัวระหว่างการแข่งขันได้ จึงเป็นเกมที่ฝึกทักษะการเขียนโปรแกรมและการนำอัลกอริทึม (algorithm) หรือวิธีการต่าง ๆ รวมถึง ปัญญาประดิษฐ์ (artificial intelligence - AI) มารวมกันเพื่อทำให้หุ่นยนต์มีประสิทธิภาพมากที่สุด เว็บไซต์วิชาการ.คอม เล็งเห็นประโยชน์ของเกม Robocode นี้ว่าจะช่วยฝึกทักษะต่าง ๆ ให้กับเยาวชนและผู้ที่สนใจ จึงร่วมกับศูนย์เทคโนโลยีอิเล็กทรอนิกส์และคอมพิวเตอร์แห่งชาติ (เนคเทค) และสถาบันเทคโนโลยีนานาชาติสิรินธร มหาวิทยาลัยธรรมศาสตร์ จัดการแข่งขัน Robocode Thailand Contest 2009 เพื่อค้นหาสุดยอดทีมกับสุดยอดหุ่นยนต์ประจำปีนี้ โดยการแข่งขันในรอบคัดเลือก จะดำเนินการผ่านเว็บไซต์วิชาการ.คอม ส่วนการแข่งขันในรอบสุดท้าย ซึ่งเป็นการชิงชนะเลิศระดับประเทศ จะจัดการแข่งขันในช่วงต้นปี 2009 ภายในงานมหกรรมการแข่งขันด้านไอซีที ซึ่งดำเนินการเป็นประจำทุกปีโดยเนคเทค

ผู้ที่สนใจสามารถดาวน์โหลดโปรแกรม Robocode ได้ที่ robocode.sf.net ศึกษาวิธีการพัฒนาหุ่นยนต์ได้จากบทความติว และส่งซอฟต์แวร์หุ่นยนต์ที่พัฒนาขึ้นเข้าแข่งขันได้ตั้งแต่วันนี้ โดยจะปิดรับสมัครและปิดให้อัปโหลดหุ่นยนต์ในวันที่ 20 มกราคม 2552

ที่มา : http://www.vcharkarn.com/robocode/

technorati tags: , , ,

2008-09-21

download attachments from Gmail using FTP/script

(เอ เรามี Python66 ป่าวหว่า ? แบบอันนี้เขียนลง Django66 ได้ป่ะ ?)
สรุปว่าเอาไปลง Pylons66 ครับ

ดาวน์โหลดแฟ้มจาก Gmail ด้วย FTP (หรือสคริปต์)

ง่าย ๆ ไม่ซับซ้อน แค่เรียกตัว ftp daemon (Gmail-FTP proxy) ให้ทำงาน, แล้วก็ใช้โปรแกรม FTP อะไรก็ได้ไปดึงแฟ้มมา. โดยแฟ้มที่จะดึงมาได้นั้น จะต้องเป็นแฟ้มแนบ (attachment) ที่อยู่ในจดหมายที่ติดป้ายว่า ‘ftp’.

ตัวโปรแกรม ftp daemon ที่ว่านี้ คือสคริปต์ไพธอน (Python) เล็ก ๆ ที่ชื่อว่า gmailftpd.py มันอยู่ในแพคเกจ libgmail-docs ของ libgmail.

ก่อนจะใช้งาน gmailftpd นี้ เราจำเป็นต้องมี libgmail กับ mechanize ลงอยู่ในเครื่องก่อน. ถ้าใช้ Ubuntu/Debian ก็สั่ง sudo apt-get install python-libgmail python-mechanize ได้เลย.

วิธีใช้งาน เราก็เรียก ftp daemon ขึ้นมาก่อน ให้มันทำหน้าที่เป็นเซิร์ฟเวอร์. เรียกใช้ gmailftpd.py โดยสั่ง python gmailftpd.py ได้เลย.

หลังเรียกให้ ftp daemon ทำงานแล้ว หน้าจอจะประมาณด้านล่าง - จะเห็นว่ามันจะไม่ทำอะไรต่อ จนกว่าจะมี client ติดต่อเข้ามา:

หน้าจอฝั่งแม่ข่าย (ftp daemon - gmailftpd)

bact@edin:~/libgmail$ python demos/gmailftpd.py
FTPServer started at Sun Sep 21 12:32:39 2008
        Local addr: ('127.0.0.1', 8021)

ทีนี้ถ้าเราอยากจะได้แฟ้มอะไรจาก Gmail ก็ใช้โปรแกรม FTP เรียกไปที่ไอพี 127.0.0.1 (localhost) พอร์ต 8021.

ในทีนี้จะใช้ wget เพราะสะดวกดี. วิธีใช้ wget คร่าว ๆ ก็คือ wget --user=ชื่อผู้ใช้ --password=รหัสผ่าน -c โปรโตคอล://ที่อยู่:พอร์ต/ชื่อแฟ้ม เจ้า -c นี่ใส่ไปให้มันโหลดต่อให้ กรณีหลุดกลางทาง จะได้ไม่ต้องเริ่มใหม่หมด.

หลังจากเรียก wget มันก็จะทำอะไรไปตามเรื่องตามราว ประมาณหน้าจอนี้:

หน้าจอฝั่งลูกข่าย (ftp client - wget)

bact@edin:~/test$ wget --user=uabc --password=pxyz -c ftp://127.0.0.1:8021/anthro.txt
--12:35:55--  ftp://127.0.0.1:8021/anthro.txt
           => `anthro.txt'
Connecting to 127.0.0.1:8021... connected.
Logging in as uabc ... Logged in!
==> SYST ... 
Server error, can't determine system type.
==> PWD ... done.
==> TYPE I ... done.  ==> CWD not needed.
==> PASV ... done.    ==> RETR anthro.txt ... done.

    [     <=>                             ] 375           94.27B/s             

12:36:03 (94.25 B/s) - `anthro.txt' saved [375]

bact@edin:~/test$ 

ลอง ls ดู ก็จะเห็นว่าได้แฟ้มมาตามที่ต้องการแล้ว:

bact@edin:~/test$ ls -la anthro.txt 
-rw-r--r-- 1 arthit arthit 375 2008-09-21 12:36 anthro.txt

ทีนี้ฝั่งเซิร์ฟเวอร์แม่ข่าย เขาทำอะไรกัน ลองไปดู:

หน้าจอฝั่งแม่ข่าย (ftp daemon - gmailftpd) ระหว่างที่ลูกข่าย (ftp client) ติดต่อเข้ามา

bact@edin:~/libgmail$ python demos/gmailftpd.py
FTPServer started at Sun Sep 21 12:32:39 2008
        Local addr: ('127.0.0.1', 8021)

Incoming connection from ('127.0.0.1', 57054)
Peer: ('127.0.0.1', 57054)
Data: 'USER uabc'
Data: 'PASS pxyz'
Data: 'SYST'
Data: 'PWD'
Data: 'TYPE I'
Data: 'PASV'
DataChannel started at Sun Sep 21 12:35:59 2008
        Local addr: ('127.0.0.1', 9021)

Data: 'RETR anthro.txt'
Reading `anthro.txt`.

จะเห็นว่าตัวแม่ข่ายหรือ gmailftpd มันได้รับชื่อผู้ใช้รหัสผ่านจากลูกข่ายหรือ wget, ซึ่ง gmailftpd มันจะเอาข้อมูลนี้ไปล็อกอิน — ตาม API คือใช้ ga.login() โดย ga เป็นออบเจกต์ของคลาส GmailAccount ที่สร้างโดย ga = libgmail.GmailAccount(username, password) ) — จากนั้นก็หาแฟ้มที่ร้องขอ, และส่งไปให้ลูกข่าย

อยากรู้ว่ามันหาแฟ้มได้ยังไง ก็ต้องไปดูในโค้ด gmailftpd.py ตรงเมธอด get_filelist().

    def get_filelist(self):
        r = self.ga.getMessagesByLabel('ftp')
        for th in r:
            for m in th:
                for a in m.attachments:
                    self.filenames[a.filename] = a

คือมันใช้เมธอด getMessagesByLabel() ของคลาส GmailAccount เพื่อหาเฉพาะอีเมลฉบับที่ติดป้ายว่า ‘ftp’, พอได้ผลลัพธ์มาแล้วก็วนลูป for ไปเพื่อเก็บชื่อแฟ้มทั้งหมด

ในโค้ด: r คือ ออบเจกต์ของ GmailSearchResult ซึ่งจะประกอบด้วยชุดของ threads, th คือ thread, m คือ message, a คือ attachment

ถ้าอยากให้มันไปดึงจากที่อื่นมาด้วย ก็แก้ตรงนี้ได้ เช่นเอาจากโฟลเดอร์ก็ใช้ getMessagesByFolder() แต่ระวังมันเยอะเกินละกัน.

เท่าที่ลองกับสองแฟ้ม พบว่า แฟ้มเล็ก ๆ น่าจะสบาย ๆ, แต่กับแฟ้มขนาดใหญ่ (6.4 MB) จะมีปัญหา โหลดไม่ได้ คือ gmailftpd มันจะฟ้อง exception ซะเฉย ๆ แล้วก็ไม่ทำอะไรต่อ — ไม่แน่ใจว่าเป็นเพราะตัวแฟ้มไม่ดีเองรึเปล่า error message มันฟ้องเกี่ยวกับ decode อะไรซักอย่าง อ่านไม่รู้เรื่อง :p

error: uncaptured python exception, closing channel <__main__.FTPChannel connected 127.0.0.1:43982 at 0xb7d102ec> (:'utf8' codec can't decode byte 0xac in position 11: unexpected code byte [/usr/lib/python2.5/asyncore.py|read|68] [/usr/lib/python2.5/asyncore.py|handle_read_event|390] [/usr/lib/python2.5/asynchat.py|handle_read|137] [demos/gmailftpd.py|found_terminator|106] [demos/gmailftpd.py|ftp_RETR|181] [demos/gmailftpd.py|handle_RETR|313] [/home/arthit/dev/libgmail/libgmail.py|_getContent|1507] [/home/arthit/dev/libgmail/libgmail.py|_retrievePage|358] [/usr/lib/python2.5/encodings/utf_8.py|decode|16])

การประยุกต์ใช้ ทำได้หลากหลายมาก แล้วแต่จินตนาการเลย เช่น อาจเขียนสคริปต์ให้มันดาวน์โหลดแฟ้มแนบใหม่ ๆ มาเก็บไว้ในเครื่องเราไว้ หรือให้ดาวน์โหลดแฟ้มแนบ .pdf จากอีเมลหรือหัวข้อที่กำหนด (เช่นโจทย์การบ้านจากอาจารย์) หรือเอาเฉพาะ .mp3

วิธีทำ อาจจะใช้เชลล์สคริปต์ไปเรียก ftp ผ่าน gmailftpd ก็ได้, หรือจะเขียนไพธอนไปเลยก็ได้ เท่าที่ดู API ของ libgmail มันก็น่าเล่นอยู่. ทั้งนี้ยังสามารถผสมกับการตั้งค่า filter ใน Gmail ได้ด้วย, คือถ้าคิดว่าแก้สคริปต์มันยุ่งเกิน ก็ไปตั้งค่า filter ใน Gmail ก็ได้ แล้วก็ให้มันติดป้ายอัตโนมัติ, จากนั้นก็ไปแก้เมธอด get_filelist() นิดหน่อย ให้มันดึงจากป้ายที่เราอยากได้.

และ libgmail นี่ทำได้มากกว่าดาวน์โหลดแฟ้มแนบนะ ลองเล่นดู มีอะไรน่าสนก็บอกกันมั่ง :)

(สุดท้ายก็ยังหาวิธีดาวน์โหลดเจ้าแฟ้ม 6.4 MB นั่นออกมาไม่ได้ ทำไงดีเนี่ย.... เน็ตก็ห๊วยห่วย - -")

technorati tags: , ,

2008-09-18

Developers' Quick References

สำหรับนักพัฒนา

search them all at: QuickRef.org (find as you type)

want handy ones on your wall ? try these quick reference cards/cheat sheets:

technorati tags: , ,

2008-08-08

Fund raise for APC 2008

APC 2008 (Associated Programming Contest 2008) เป็นการแข่งขันเขียนโปรแกรมคอมพิวเตอร์ ภาษา C/C++ ออนไลน์ ลักษณะประมาณ Google Code Jam หรือโจทย์คอมพิวเตอร์โอลิมปิก งานนี้น้อง ๆ ทีมงานเขาจัดกันเอง ไม่ได้มีสปอนเซอร์อะไร ทำไปเพราะใจรักล้วน ๆ ก็เลยไม่ได้มีของรางวัลอะไร

sugree, mk, kengggg และหลาย ๆ คนเลยคิดว่า น่าจะสนับสนุนน้อง ๆ เขาหน่อย เลยจะแจกเสื้อยืดสวย ๆ เป็นที่ระลึกความภูมิใจ ให้กับ 50 คนแรก (ดูประกาศที่ Blognone)

ทีนี้จะหาเงินจากไหนดี เราก็ลงขันกันละกัน คนละนิดละหน่อย

ใครอยากช่วย ก็ลงขันกันทาง Chipin ได้ครับ เท่าไหนก็ได้ (หรือจะช่วยบอกต่อก็ได้ โดยกดที่ปุ่ม ‘Copy’ ข้างล่างนี้ แล้วลอกโค้ดไปแปะที่บล็อก/เว็บบอร์ด)

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

technorati tags: , ,

2008-05-12

Processing.js - Processing in JavaScript

From the creator of jQuery, Processing.js brings Processing visualization language to JavaScript/DHTML platform.

And for jQuery developers, try this Visual jQuery, an easy access jQuery API documentation.

ลองเล่นดูนะครับ Processing บน JavaScript ตอนรันพวกเดโมต่าง ๆ นี่ ซีพียูอาจจะพุ่งกว่าปกติซะหน่อย แต่ก็เหมือนกับพวกเว็บ AJAX ทั่วไปครับ — ผมว่า JavaScript/DOM engine ของเว็บเบราว์เซอร์ในปัจจุบัน มันถูกใช้งานจนเกินขีดจำกัดของมันแล้ว คือตอนนั้นที่ออกแบบไม่ได้มีใครคิดว่ามันจะถูกนำมาใช้สำหรับงาน Rich Internet Application ที่มีภาพออบเจกต์ มีการโต้ตอบเยอะขนาดนี้ โครงการเว็บเบราว์เซอร์รุ่นใหม่ ๆ ก็เห็นจุดนี้และพยายามปรับปรุงประสิทธิภาพของ JavaScript engine และเพิ่มฟังก์ชันที่ถูกเรียกใช้บ่อย ๆ (เช่นการค้น/เลือก element ด้วย class) เข้าไปเป็น API มาตรฐาน (แบบเป็น native ไม่ต้องไปอิมพลีเมนต์เองด้วย JavaScript ซึ่งก็จะทำให้ประสิทธิภาพดีขึ้น)

และสำหรับคนที่สนใจ Processing แนะนำบล็อกนี้ครับ Pongpan Suriyapat มีเรื่อง Processing และ new media art / interaction design น่าสนใจอยู่เรื่อย ๆ

technorati tags: , ,

2008-04-08

generatedata.com - data generator

Generate test data instantly, just clicks.

GenerateData.com by Benjamin Keen

เอาไว้สร้างข้อมูลเยอะ ๆ สำหรับทดสอบ ใช้ง่ายมาก ๆ เลือกเอาท์พุตได้หลายรูปแบบ - ถ้าอยากเอาไปใช้ออฟไลน์ก็มีซอร์สโค้ดให้ด้วย

technorati tags: , ,

2008-04-04

WordPress authentication plugin for DokuWiki (updated)

dw-wordpress-auth is an authentication plugin for DokuWiki. It let DokuWiki uses WordPress authentication instead of its own. This brings more integration in your DW+WP site.

This 1.2.3 version (2008-04-04) works with DokuWiki rc2008-03-31 and Wordpress 2.5

Made for Creative Commons Thailand wiki.

dw-wordpress-auth เป็นปลั๊กอินระบบล็อกอินของ DokuWiki โดยมันจะทำให้ DokuWiki ใช้ระบบล็อกอินของ WordPress แทน ทำให้ระบบล็อกอินเป็นอันหนึ่งอันเดียวกันมากขึ้น สำหรับเว็บไซต์ที่ใช้ DokuWiki และ WordPress

รุ่น 1.2.3 (4 เม.ย. 2550) นี้ สำหรับใช้กับ DokuWiki rc2008-03-31 และ Wordpress 2.5

ทำสำหรับใช้กับ วิกิครีเอทีฟคอมมอนส์ไทย

Download/ดาวน์โหลด: dw-wordpress-auth-1.2.3.tgz

For other versions/รุ่นอื่น ๆ: http://arthit.googlepages.com/bazaar


Version History

1.2.3 (04/04/2008)
  • Fix magic quotes double-kill bug, by checking MAGIC_QUOTES_STRIPPED flag. Code by Jan Wessely http://jawe.net/files/dokuwiki_wordpress/wordpress.class.phps
  • Modify DW's html_login() in inc/html.php to make DW's login form send login data to WP's wp-login.php instead (modified html.php is included, copy it to inc/). If you want the original form back, just remove the code block between "START dw-wordpress-auth plugin" and "END dw-wordpress-auth plugin". Then uncommented the following original code block.
1.2.2 (03/04/2008)
  • Modified to make it works with WP 2.5 and DW rc2008-03-31.
  • Updated code to use WP's get_currentuserinfo(), instead of deprecated wp_get_cookie_login(), as suggested by Jan Wessely http://jawe.net/2008/04/01/wordpress-upgrade/
  • Modify DW's default template's main.php to make its login button points to WP's login screen instead (modified main.php is included, copy it to lib/tpl/default/). If you want the original login button back, just remove the code block between "START dw-wordpress-auth plugin" and "END dw-wordpress-auth plugin". Then uncommented the original code line: tpl_button('login')
1.2.1 (06/11/2007)
  • Modified to make it works with WP 2.3.0 and DW 2007-06-26b.
  • Update code to use WP's do_action_ref_array, instead of do_action.
  • Swap the order to of user logged in status checking. Check for WP's cookie first, then check for DW's login form. Also if the WP's cookie is ok, don't bother checking for DW's login.
  • Remove RoleID from 'addUser' query (don't know it was for, but it doesn't match the number of values to be inserted)
  • Disabled unrecommended queries related to add/updateUser, DW will handle this smartly by hidding related buttons from its web interface as well (cool).
1.2 (10/10/2006)

Any issue should be reported to art # siit.net. Thank you :)

updated 2008.04.04 19:20 ICT: correct typo “use WP's wp_get_cookie_login(), instead of get_currentuserinfo()” to “use WP's get_currentuserinfo(), instead of deprecated wp_get_cookie_login()”. Thanks Jan Wessely :)

technorati tags: , , ,

2008-03-11

codepad + pastebin

เจ๋งอ่ะ codepad

เวลาอยากจะแชร์โค้ดอะไรเล็ก ๆ กับเพื่อน แปะลง IM มันก็เละ ๆ ดูยาก จะเปิดเมลส่ง ก็ดูลำบาก

หรือ บางทีจะลองโค้ดอะไรนิด ๆ หน่อย ๆ เช็คว่ามันใช่อย่างที่คิดรึเปล่า แต่ไม่มีคอมไพเลอร์ใกล้มือ

codepad ช่วยได้!

ลองเล่นดู แปะโค้ดอะไรก็ได้ลงไป แล้วจะลองรันด้วยก็ได้ หรือจะแค่แปะเฉย ๆ ก็ได้
จากนั้นเราจะได้ url มาอันนึง (ทำนองเดียวกะพวก tinyurl) ไว้ส่งไปให้เพื่อนได้ ทีนี้เพื่อนก็สามารถเข้าไปที่ url ที่ว่า เพื่อดูโค้ดเมื่อไหร่ก็ได้ (พร้อม syntax highlight ด้วย)

ชอบ ๆ

วันก่อน คุณชาญวิทย์ Groovy/Grails แนะนำ pastebin ในอีเมลกลุ่ม ตอนนั้นคิดว่าเจ๋งแล้ว เจอ codepad เข้าไป เราว่าเจ๋งกว่าอ่ะ ในแง่โค้ดนะ แต่ pastebin ก็รองรับภาษาเยอะกว่ามาก พวกล็อกไฟล์ก็ได้ด้วย diff หรือ config ไฟล์ก็ได้อีก

ลองเลือกใช้ดูครับ

[ ผ่าน duocore | thai-grails-user ]

technorati tags: , ,

2008-02-24

MySQL Thai full-text parser plug-in idea

MySQL 5.1 allows us to use a customized full-text parser.

poakpong ถามเรื่อง fulltext ในฐานข้อมูล MySQL ว่าเอาไว้ทำอะไร

ก็คือมันเอาไว้ระบุไว้ที่ช่องข้อมูล (field) ประเภทข้อความ (char, varchar, text) เพื่อบอกให้ MySQL มันทำดัชนี (index) สำหรับการค้นหาแบบ full-text search น่ะ

ที่เคย ๆ เขียนกัน เวลาจะหาอะไรใน MySQL เราก็จะใช้ LIKE "%คำที่หา%"
โดย LIKE มันจะวิ่งไปเปรียบเทียบข้อความในแต่ละช่องข้อมูล ทำนอง regular expression

ส่วนกรณี full-text search ใน MySQL จะใช้คำสั่ง MATCH (ชื่อฟิลด์) AGAINST (คำที่หา)
ซึ่งมันจะค้นจากดัชนีคำที่ MySQL ทำไว้ล่วงหน้า ซึ่งการค้นหาที่ตัวดัชนีแทนที่จะไปหาในตัวข้อความทั้งหมดนี้ ก็จะทำให้การค้นหามีประสิทธิภาพดีกว่า

อย่างไรก็ตาม การใช้ full-text search นี้ ก็ยังมีปัญหาสำหรับภาษาไทย นั่นก็คือ ตัวทำดัชนีคำน่ะ มันยังไม่รองรับภาษาไทย-ภาษาที่ต้องตัดคำก่อน (มีรองรับภาษาจีน/ญี่ปุ่นนิดหน่อย)

full-text search จึงยังใช้ไม่ได้สำหรับภาษาไทย ต้องใช้ LIKE กันไปก่อน

ใน MySQL รุ่น 5.1 (ตอนนี้ยังเป็น Release Candidate อยู่) ปัญหานี้ดูเหมือนจะมีทางออกได้ (ถ้ามีคนลงแรง) เพราะ MySQL 5.1 เปิดช่องให้เขียน plug-in มาเสริมการทำงานได้ ซึ่งรวมถึง full-text parser plug-in ด้วย

full-text parser นี่ มีเอาไว้สร้างรายการคำเพื่อเอาไปใส่ในดัชนี

ถ้าเรามี full-text parser ที่สร้างรายการคำไทยได้ เราก็จะสามารถใช้ฟังก์ชั่น full-text search บน MySQL กับภาษาไทยได้ทันที ที่ระดับฐานข้อมูลเลย (แน่นอน เราต้องมีสิทธิลงปลั๊กอินที่ว่าลงในเซิร์ฟเวอร์ฐานข้อมูลด้วย ซึ่งในกรณีเราไปเช่าเว็บโฮสต์คนอื่นใช้ ก็คงลำบากหน่อย แต่ถ้าเป็นเครื่องเราเอง ก็ไม่มีปัญหา)

ไลบรารีตัดคำไทยที่ใช้งานได้นั้น เราก็มีแล้ว เช่นใน libthai หรือจะใช้ ICU/libicu ก็ได้ แม้ทั้งหมดนี้จะต้องมีการปรับแต่งเพื่อการสร้างดัชนีด้วย (ลักษณะของคำที่ตัดออกมาเพื่อจัดหน้ากระดาษ เพื่อทำดัชนี เพื่อการแปล เพื่องานที่ต่างกัน ก็มีลักษณะแตกต่างกัน) แต่คิดว่าน่าจะอยู่ในวิสัยที่จะทำได้

เป็นโครงงานจบการศึกษา - senior project - Google Summer of Code - ประกวด NSC ... ??

(ภาษาโปรแกรม C หรือ C++)

(อาจจะมีคนทำอยู่/เสร็จแล้วก็ได้ ... เหมือน อ.ธวัชชัย กับ พี่สัมพันธ์ เคยสนใจ (แต่ตอนนั้นโครงสร้างพื้นฐานยังไม่อำนวยให้แก้ไขได้ในลักษณะปลั๊กอินเช่นนี้) ... ใครรู้อะไรก็แจ้งข่าวหน่อยครับ ;) )

technorati tags: , , ,

2008-02-23

super("Robot Wars");

ตอนนี้ที่ภาคกำลังสนุกกับ Robocode น้อง ๆ ที่ลงเรียนแลบ AI (ปี 3) กับแลบ OOP (ปี 2) ต้องส่งโปรแกรมหุ่นยนต์ลงแข่ง จัดเป็นทัวร์นาเมนต์ (กติกา) เดินไปไหนมาไหน หรือขึ้นรถ ก็จะต้องได้ยินคนคุยกันเรื่องหุ่นเป็นไงมั่ง แข่งกับของคนนั้นคนนี้แล้วเป็นไง (ดูตัวอย่างที่ idiotao, d0m3z) — ปีที่แล้วก็มีแข่งเหมือนกัน (ผมไม่ได้แข่งกะเค้าหรอก แพ้น้องเปล่า ๆ :P)

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

Robocode battle

ตอนผมหัดเขียนโปรแกรมใหม่ ๆ ก็เคยเล่นเกมทำนองนี้ ชื่อ P-ROBOTS (download #1, download #2 - ไม่แน่ใจว่าอันไหนใหม่กว่า) ต่างกันตรงเป็นภาษาปาสคาล (ภาษายอดนิยมในสมัยนั้น สำหรับเริ่มเรียนเขียนโปรแกรม) และเป็นเท็กซ์โหมด ไม่ใช่กราฟิกโหมดอย่าง Robocode — แต่จำได้ว่า แค่นั้นก็สนุกแล้ว ดูตัว # วิ่งไปวิ่งมา

เว็บ RoboWiki รวบรวมเรื่องเกี่ยวกะ RoboCode พร้อมข้อมูลเกี่ยวกับหุ่นยนต์ตัวดัง ๆ ไว้ครบครัน (บางตัวมีซอร์สโค้ดให้ด้วย) โค้ดหุ่นหลายตัวเข้าขั้น |nw มาก ๆ มีเอาเทคนิคการวิเคราะห์เชิงสถิติ หรือพวก ข่ายงานประสาทเทียม ไปใช้ด้วย จริงจังมาก แบบว่าทำนายเส้นทางการเดินของคู่ต่อสู้ได้ เขามีจัดเป็นลีกแข่งด้วยนะ

ใครสนใจ เสาร์อาทิตย์อยากหาอะไรสนุก ๆ เล่น ก็ลองไปโหลดมาเล่นกันครับ :) เขามีตัวอย่างหุ่นมาให้จำนวนนึง เอาตรงนั้นมาแก้ ๆ ก็ได้ เพลิน ๆ

ข้างล่างนี่เป็นเอกสารที่อาจารย์ + น้องปี 4 เค้าทำให้น้องปี 2,3

technorati tags: , ,

2008-01-24

GWT on NetBeans

GWT4NB เขียน Google Web Toolkit ใน NetBeans (รุ่น 6)

ดูวิธีติดตั้งที่ Developing GWT Applications with NetBeans โดย Tom Stocky

technorati tags: , ,

2007-12-10

Groovy the 1.5

คุณชาญวิทย์ ครุกรูวี่ แจ้งมาในอีเมลกลุ่ม thai-grails-user:

Groovy 1.5 เลขรุ่นเดิมคือ 1.1 ออกแล้วครับ
เหตุผลในการปรับเลขรุ่นมาเป็น 1.5
ก็เพื่อสะท้อนให้เห็นความเปลี่ยนแปลงในการสนับสนุนโครงสร้างภาษาที่มากขึ้น
เช่น Annotation, Enum และ Generic เป็นต้นครับ

Groovy 1.5 เปลี่ยนแปลงระบบ method caching
ภายในทำให้ความเร็วโดยรวมเพิ่มขึ้นเช่นกัน

สำหรับรายละเอียดของ feature ใหม่ ๆ กิลโยม ลาฟอร์จ เขียนบนความบนไว้บน InfoQ

ผมชอบ safe navigation operator (?.) อ่ะ สะดวกดี

[ ลิงก์ InfoQ | ผ่าน ชาญวิทย์ แก้วกสิ ]

technorati tags:

2007-12-09

Ruby/Rails update

Creating a Ruby Weblog in 10 Minutes - ใช้ NetBeans 6.0 สร้างเว็บล็อกด้วย Ruby on Rails ใน 10 นาที

Rails 2.0 ออกแล้ว - RESTful, template engine ใหม่, API authentication over (HTTP) SSL, simple query cache, เร็วขึ้นประมาณ 50-100%, syntax ใหม่ของ migration ที่สั้นลงมาก, ฯลฯ

Rubinius - VM สำหรับภาษา Ruby, ใช้สถาปัตยกรรมแนว Smalltalk-80 เขียนด้วย C - ใช้กับ Rails ได้

แถม: Java SE 6 Update N Early Access - Java SE 6 ตัวใหม่ (หรือที่เคยรู้จักในชื่อ “Consumer JRE”) - ปรับปรุงการติดตั้งและอัพเดท, ลงเฉพาะเท่าที่ใช้ ลงเฉพาะ kernel ก่อน ที่เหลือค่อยโหลดตามมา, ใช้ hardware acceleration ได้, โหลดเร็วขึ้น, L&lF (สกิน) ตัวใหม่ชื่อ Nimbus

technorati tags: , ,

2007-12-08

looking for web automation tool

เว็บที่ดูแลอยู่ เช่าพื้นที่จาก Micfo.com ล่มเมื่อสองสามวันก่อน แล้วพอกลับมาอีกที ข้อมูลในฐานข้อมูลก็หายไปหมดเกลี้ยง

ฝ่ายซัพพอร์ตทำงานได้ห่วยมาก ตอบอีเมลแต่ละฉบับเหมือนขอไปที บอกมาได้ว่า “ไม่มี backup” โคตรโกรธ เมื่อก่อนไม่เป็นแบบนี้ พอล่มเมื่อไหร่ ยังไงก็ยังกลับมาได้เหมือนเดิม มี backup ให้ตลอด

ใครกำลังคิดจะใช้บริการ Micfo.com กรุณาคิดอีกที

พยายามจะกู้บล็อกคืนมาให้เพื่อน (ตัวเองก็เสียดายด้วย มีเรื่องน่าอ่านอยู่เยอะ) ทางหนึ่งที่พอไหวคือ ไล่ก๊อปปี้มาจาก Google cache แต่มันเยอะมาก น่าจะเกินพันได้ (ซึ่งเป็นเรื่องดี) ก๊อปไปได้แค่สามสิบอันก็เมื่อยแล้ว

มีใครพอจะแนะนำเครื่องมือ/ภาษาสคริปต์ที่ทำพวกนี้ง่าย ๆ บ้างครับ ผมไม่เคยเขียนอะไรทำนองนี้เลย พวก web scraping เนี่ย

ลักษณะของงานไม่มีอะไรมาก

  1. ไปที่หน้า Google cache ที่กำหนด
  2. ไล่ดาวน์โหลดลิงก์ที่อยู่ใต้ข้อความ “Cached” ให้หมด
  3. ไปหน้าถัดไป (เปลี่ยนค่า start ใน url)
  4. ถ้ายังมีหน้าถัดไปที่ว่าอยู่ ก็ทำ (2) อีกรอบ วนไปเรื่อย

cURL นี่ไหวมั๊ย หรือมีง่ายกว่านี้ ? เดี๋ยวคืนนี้จะลองดู

ป.ล.1 ส่วนเว็บบอร์ด น่าจะยากกว่า เฮ้อ

ป.ล.2 เบื่อ “สดศรี สัตยธรรม” และ “ผู้มีคุณธรรมสูง” ทั่วฟ้าเมืองไทย

technorati tags:

2007-12-05

Gant - Groovy Ant

“A Groovy-based build system that uses Ant tasks, but no XML.”

Gant เป็นเครื่องมือประกอบสร้างซอฟต์แวร์ (build system) ที่ใช้ Ant ทำงาน และใช้ภาษา Groovy กำหนดค่าต่าง ๆ (แทนที่จะใช้ภาษา XML)

ตัวอย่าง (จากเว็บไซต์ Gant):

includeTargets << gant.targets.Clean
cleanPattern << [ '**/*~' ,  '**/*.bak' ]
cleanDirectory << 'build'

target ( 'default' : 'The default target.' ) {
  println ( 'Default' )
  depends ( clean )
  Ant.echo ( message : 'A default message from Ant.' )
  otherStuff ( )
}

target ( otherStuff : 'Other stuff' ) {
  println ( 'OtherStuff' )
  Ant.echo ( message : 'Another message from Ant.' )
  clean ( )
}

แนวการพัฒนาของ Groovy/Grails อย่างหนึ่งที่ต่างจาก Ruby/Rails ที่พอสังเกตได้ก็คือ Groovy/Grails จะพยายามใช้/หรือทำงานร่วมกับเครื่องมือ/ไลบรารีที่มีอยู่แล้ว เช่น Jetty, Hibernate หรือกรณี Ant ในที่นี้ (ซึ่งแต่ละแนวก็มีข้อดีข้อด้อยต่างกัน)

technorati tags: , ,

2007-12-04

NetBeans 6.0 + Groovy plug-in

NetBeans 6.0 ออกแล้ว เย่
ความสามารถใหม่ที่ชอบมากของรุ่นนี้ก็คือตัว run profile ที่ Eclipse มีตั้งนานแล้ว แต่ NetBeans เพิ่งจะมี

มีหลายแพ็คเกจให้เลือก ถ้าจะเขียน Java SE ทั่ว ๆ ไป ก็ขนาดแค่ 21 MB เท่านั้น

แพ็คเกจอื่น ๆ ก็มี Web/Java EE, Mobility/Java ME, Ruby/Rails, C/C++ หรือโหลดแบบครบเซ็ตเลยก็ได้
แพ็คเกจต่าง ๆ สามารถโหลดเพิ่มเติม/ปรับรุ่นได้ภายหลัง ด้วยตัว update manager ของ NetBeans

และสำหรับคนที่เขียน Groovy/Grails ลองดู Groovy plug-in (อยู่ระหว่างการพัฒนา ถ้าอยากใช้ตอนนี้ต้อง svn มา build เอง)

technorati tags: , ,

2007-11-30

Learn Grails in 2 minutes!

หัด Grails ใน 2 นาที! (ภาษาไทย)
สร้างเว็บแอพพลิเคชั่น-อย่างเร็ว

เอกสารโดย กลุ่มผู้ใช้ Grails ในไทย

Grails นี่คือประมาณ Ruby Groovy on Rails แล้วก็ใช้ไลบรารี “มาตรฐาน” ทั้งหลายได้ เช่น Hibernate

technorati tags: ,

2007-11-07

prefuse new, new

prefuse, visualization library สำหรับจาวา, ออกรุ่น beta release 2007.10.21 แล้วนะครับ

และไล่ ๆ กัน ก็มีไลบรารีน้องใหม่ ชื่อ prefuse flare ออกมาด้วย เป็น visualization library เหมือนกัน แต่อันนี้สำหรับ Flash/ActionScript 3

ใครทำด้าน information visualization ก็ได้ลองดูได้

technorati tags: , ,