1

กังฟู 6 ขั้นสำหรับวิศวกรของอ.พี

อ่าน: 427
ความเห็น: 0
กังฟู 6 ขั้นสำหรับวิศวกรของอ.พี

ผมนั่งเรียนวิชาเกี่ยวกับความมั่นคงของระบบคอมพิวเตอร์อยู่ ผศ.ดร.พีรวัฒน์ วัฒนพงศ์ที่สอนอยู่ในขณะนั้น ก็พูดถึงขั้นตอนการเรียน 6 ขั้น หรือว่ากังฟู 6 ขั้นของวิศวกรขึ้นมา. ปรากฎว่าตอนนั้นผมก็จดไม่ทัน เวลาผ่านไป 2-3 ปีได้ ผมก็พึ่งมาถามวันนี้เองว่ามีอะไรบ้าง :-P. อ.บอกว่า กังฟู 6 ขั้นนี้คล้ายๆ learning step ของ Blooms ที่อาจารย์พึ่งมาค้นเจอทีหลังมี 6 ข้อเหมือนกัน.

ถ้าใครชอบดูหนังจีนกำลังภายในก็จะพบว่า กว่าจะเข้ายุทธภพได้ก็ต้องฝึกฝนจากคนธรรมดาๆเป็นขั้นไป. ก็อาจจะคล้ายกับวิศวกรที่มีเริ่มฝึกกังฟูตั้งแต่ …

  • กังฟู ระดับที่ 0 “เคยได้ยิน” ยกตัวอย่างเช่น มีคนพูดถึง blog บ้าง หรือ KM ก็ต้องอ๋อเคยได้ยิน แต่ว่าไม่จำเป็นต้องรู้ว่าเป็นอะไร
  • กังฟู ระดับที่ 1 “แปลได้” ยกตัวอย่างเช่น พอพูดถึง blog ก็รู้ว่าคือเว็บที่เอาไว้ตีพิมพ์บันทึกที่เรียงจากวันที่ใหม่ไปหาเก่า
  • กังฟู ระดับที่ 2 “เข้าใจความ” ยกตัวอย่างเช่น พอพูดถึง blog ก็อธิบายได้รู้มากกว่านิยามสั้นๆ
  • กังฟู ระดับที่ 3 “ชี้ตัว” (identify) ยกตัวอย่างเช่น ใครก็รู้ว่า gotoknow และ exteen เป็นบริการ blog. วันดีคืนดีมี multiply มี hi5 โพล่มาก็ต้องบอกได้ว่า multiply หรือ hi5 เป็นอะไรใช่ blog หรือเปล่า โดยอ้างอิงตามคุณสมบัติของสิ่งนั้นๆ ตามนิยาม
  • กังฟู ระดับที่ 4 “เข้าใจข้อดีข้อเสีย” ยกตัวอย่างเช่น รู้ว่า blog ดีอย่างไร เสียอย่างไร webboard มีข้อดีข้อเสียอย่างไร อาจจะเอามาเทียบกันได้ด้วย
  • กังฟู ระดับที่ 5 “เลือกได้” ยกตัวอย่างเช่น ของบางอย่างดีกับสภาพแวดล้อม/ปัญหา/โจทย์บางอย่าง เช่น ถ้าต้องการเล่าประสบการณ์การทำงาน blog ก็อาจจะเหมาะว่า webboard แต่ถ้าต้องการถามปัญหาทางเทคนิค webboard ก็อาจจะเหมาะกว่า blog. ทีนี้พอเลือกได้แล้วก็จะออกแบบได้ ออกแบบได้ก็เป็นพื้นให้สร้างได้

ป.ล. ตัวอย่างนี่ผมดัดแปลงเอาเองจากที่ฟังมาอาจจะมั่วๆหน่อย

ป.ล. (2) อ.มะนาวบอกว่าน่าจะมีขั้น 6 คือ “innovate” ด้วย

ป.ล. (3) ผมเรียก “innovate” ว่า “สร้างสิ่งใหม่” แล้วกัน. การเลือกน่าจะอยู่ที่ขอบของ Analysis และ Synthesis ของ Blooms. ส่วน “สร้างสิ่งใหม่” ก็เป็น systhesis แบบเต็มๆ.

ป.ล. (4) มากไปกว่านั้น “สร้างสิ่งใหม่” น่าจะรวมเรื่อง design ไว้ด้วย. ในการ design น่าจะมีอะไรมากกว่า “เลือก”. ผมแอบคิดว่าน่าจะเป็นการ “เชื่อมต่อ” สิ่งที่เลือกๆมา มากไปกว่านั้นก็อาจจะ “ปรับเปลี่ยน” สิ่งที่เลือกมา. … แต่ก็คิดต่อไปมากกว่านั้นนิดนึงว่าการเชื่อมต่อ และการปรับเปลี่ยน จะมองว่าเป็นการเลือกชนิดหนึ่งได้หรือเปล่า? เลือกวิธีเชื่อมต่อ เลือกวิธีปรับเปลี่ยน?

0

Citar – ซอฟตแวร์เสรีสำหรับระบุชนิดของคำ

เดิมที่ใช้ acopost แต่ว่า acopost พอเอาไปใช้บนเครื่อง amd64 ทั้งหลายแล้วออกอาการรวนๆ ผลลัพธ์ไม่เหมือนบนเครื่อง i386 ก็เลยมองหาตัวใหม่

แต่ pos tagger ตัวอื่นก็มีตั้งเยอะ ทำไมต้อง citar ก็เพราะว่า citar ไม่ค่อยมี code ที่ผูกติดกับภาษาใดภาษาหนึ่ง หรือว่า tag ของ ค่ายใดค่ายหนึ่ง (code ที่ผูกติด เช่น เช่น if pos == “NNP” แบบนี้เริ่มไม่น่าใช้แล้ว) พอไม่ผูกติดก็เอามาใช้กับาภาษาไทยได้เลย

citar ใช้ C++ เขียนไม่พอยังต้องลง QT รุ่นเท่ากับหรือใหม่กว่า 4.5 ด้วย ไม่ได้ทำ gui อะไรแต่ว่าใช้พวก QStringList อะไรทำนองนี้เป็นต้น วิธีการใช้ก็คล้าย acopost

พอ build citar เสร็วแล้ว เราก็เรียกคำสั่ง train corpus.txt lex.dat ngram.dat

corpus.txt เราก็ใส่พวก ฉัน/noun กิน/verb ข้าว/noun อะไรแบบนี้ไว้เยอะ เวลาเอาไปใช้ก็เรียก

tag lex.dat ngram.dat แล้วพิมพ์ข้อความเข้าไป แบบเว้นวรรคด้วยมันก็จะใส่ part-of-speech มาให้

วิธี download มาใช้ก็สั่ง git clone git://gitorious.org/citar/citar.git มันก็มาแล้ว ถ้ามี QT อยู่ก็จะมี qmake ด้วยก็สั่ง qmake citar.pro พอได้ไฟล์ Makefile ก็สั่ง make

0

Citar: avoid tagging an empty string

It seem like current verion of citar (a part-of-speech tagger) tags even empty strings. Empty strings must not be tagged and must not be in token list. So I patch it as follow:

diff -Nur citar.orig/tag/tag.cpp citar/tag/tag.cpp
--- citar.orig/tag/tag.cpp	2010-03-08 08:55:32.000000000 +0000
+++ citar/tag/tag.cpp	2010-03-08 08:56:12.000000000 +0000
@@ -90,7 +90,7 @@
 		if (line.isNull())
 			break;
 
-		QStringList splittedLine = line.split(" ");
+		QStringList splittedLine = line.split(" ",  QString::SkipEmptyParts);
 
 		// Get the sequence of words, adding start/end markers.
 		QVector sentence(2, "");
16

ใช้ swath จาก python

swath เป็นโปรแกรมตัดคำที่ดีโปรแกรมหนึ่ง เอา text อะไรยัดเข้าไปก็มักจะไม่เจ๊ง ไม่ต้องเขียนอะไรครอบมาก แต่ว่าบอกทีก็อยากใช้จาก python วีธีหลักที่จะเรียกใช้ ก็อาจจะสร้าง module ด้วย c++ ขึ้นมาเชื่อม swath กับ python วิธีแรกนี้โปรแกรมทำงานได้รวดเร็ว แต่ว่ามันเหนื่อยนะกว่าจะเสร็จ

ผมก็เลยใช้วิธีที่โปรแกรมทำงานช้าๆ แต่เขียนเสร็จเร็วแทน โดยเรียกผ่าน subprocess

import subprocess

def wordbreak(utxt):
    if not isinstance(utxt, unicode):
        raise TypeError, "wordbreak needs unicode"
    tis_txt = utxt.encode("CP874", 'replace')
    p = subprocess.Popen("swath", stdin = subprocess.PIPE, \
            stdout = subprocess.PIPE, close_fds = True)
    p.stdin.write(tis_txt)
    p.stdin.close()
    raw_output = p.stdout.read().decode("CP874", "replace")
    words = raw_output.split("|")
    p.stdout.close()
    return words

# Copyright (c) 2010 Vee Satayamas
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.

เวลาเรียกใช้ก็สั่ง wordbreak(u”ทดลองตัดคำ”) อะไรแบบนี้ได้ แล้ว wordbreak ก็จะ return list ของคำออกมา ผมใช้ python 2.5.x นะครับ

2

nsCoreFoundationBreaker

After talking to @kengggg, we are agree to implement NS_GetComplexLineBreaks without using deprecated UCFindTextBreak. So I try to rewrite nsCarbonBreaker by using Core Foundation API. However I don’t have Mac since 2008 so I didn’t test. In fact, I don’t even try to compile the code.

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Theppitak Karoonboonyanan <thep@linux.thai.net>.
 * Portions created by the Initial Developer are Copyright (C) 2007
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * - Theppitak Karoonboonyanan <thep@linux.thai.net>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsComplexBreaker.h"
#include <CoreFoundation/CFStringTokenizer.h>
#include <CoreFoundation/CFBase.h>

// An imaginary nsCoreFoundationBreaker
// I don't have Mac since 2008 (Vee Satayamas)

void
NS_GetComplexLineBreaks(const PRUnichar* aText, PRUint32 aLength,
                        PRPackedBool* aBreakBefore)
{
  NS_ASSERTION(aText, "aText shouldn't be null");

  // I don't know whether CFStringCreateWithCharactersNoCopy will works.
  // Some conversions may be needed
  CFStringRef cfAText = CFStringCreateWithCharactersNoCopy(NULL, aText, aLength,
    kCFAllocatorNull);
  NS_ASSERTION(cfAText, "cfAText shouldn't be null");

  CFStringTokenizerRef tokenizer = tokenizerForString(cfAText);

  if(tokenizer)
  {
    CFStringTokenizerTokenType  tokenType; 
    // CFStringTokenizerGetCurrentTokenRange may have to be called before
    // CFStringTokenizerAdvanceToNextToken
    while(CFStringTokenizerAdvanceToNextToken(tokenizer) != 
      kCFStringTokenizerTokenNone) 
    {
      CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
      aBreakBefore[tokenRange.location + tokenRange.length] = PR_TRUE;
    }
  }

  // Foundation.h must be included for CFRelease?
  CFRelease(cfAText);
}
0

This is my speed test

$ curl http://mirrors.rit.edu/ubuntu-releases/karmic/ubun-9.10-desktop-i386.iso > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  2  689M    2 14.5M    0     0  89418      0  2:14:51  0:02:50  2:12:01   99k
1

มันคือปากกา

ไปกิน Jumbo Yaki Tei แล้วได้ของแถมมา

P1198798.JPG

P1198797.JPG

ถึงแม้จะรู้ว่ามันราคาไม่แพง แต่ก็รู้สึกดีที่ได้ของแถม :-P