WP-Plugin SyntaxHighlighter Evolved และ htmlspecialchars

สืบเนื่องจากผมไปเจอปลั๊กอินเวิร์ดเพลสตัวนึงครับ มันมีชื่อว่า SyntaxHighlighter Evolved เลยทำให้ผมอยากกลับมาเขียนบล๊อคนี้ต่อ หลังจากทิ้งไปนานมากๆ

ซึ่งมันรองรับภาษามากมายครับ สามารถดูทั้งหมดได้จากที่นี่เลย
http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes

แต่ประเด็นจริงๆ ที่ทำให้ผมเขียน post เป็นเพราะว่า ผมมีปัญหากับ htmlspecialchars ครับ เหมือนว่ามันทำซับซ้อนกับ Wordress
Continue reading “WP-Plugin SyntaxHighlighter Evolved และ htmlspecialchars”

เปิด My Computer แล้วโหลดช้า, ค้าง, รอนาน

ตอนแรกผมนึกว่าโดนไวรัสซะแล้วครับ  เพราะว่ามันเป็น 2 เครื่องพร้อมกัน

แต่จริงๆ ผมไม่ได้โดนไวรัสครับ  แต่เครื่องมันกำลังไปแสกนหาเครื่อง Printer อยู่

วิธีแก้ไขก็ง่ายนิดเดียวครับ
Continue reading “เปิด My Computer แล้วโหลดช้า, ค้าง, รอนาน”

Program: BlankScreen

เผอิญว่าช่วงนี้ค่อนข้างค้นหาข้อมูลซะส่วนมาก  จึงไม่ได้ใช้จอที่ 2   แต่ไม่ค่อยชอบใจที่ต้องปิดๆ เปิดๆ จอ  ก็เลยอยากได้โปรแกรมที่จะทำให้จอที่เราไม่ใช้งานมืดไปซะ คล้ายๆ เป็น Screen Saver อะไรประมาณนั้น  แต่ Search เท่าไหร่ ก็ไม่เจอ เพราะบางทีโปรแกรมมันอาจจะ Simple เกินไป…  ผมก็เลยต้องพัฒนาขึ้นมาเอง แบบพอถูพอไถ…  ก็เผื่อใครเจอกรณีเดียวกับผม จะได้เอาไปใช้ได้ครับ.. จริงๆ ผมมีไอเดียพัฒนาต่อให้มันเจ๋งขึ้นอีกนิดๆ หน่อยๆ  แต่ไม่ดีกว่า  มันไม่จำเป็นขนาดนั้นน่ะครับ 🙂

สำหรับการใช้งาน  ให้คลิกที่ Icon Tray ที่เป็นสี่เหลี่ยมสีดำครับ  ลองเล่นๆ ดูครับ ไม่ยุ่งยากเท่าไหร่

Download: http://blog.kentreez.com/?attachment_id=89

C# HttpRequester Class (HTTP Request Upload File with POST DATA )

คือผมพยายามลอง Search หา Class ลักษณะนี้แล้วครับ แต่ก็หาไม่ได้สักที เจอแต่อัพโหลดไฟล์ได้อย่างเดียว หรือไม่ก็ POST DATA ได้อย่างเดียว สุดท้ายเลยต้องพยายามเขียนคลาสนี้ขึ้นมาใช้เองครับ

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

อยากทำอะไรได้มากกว่านี้ ก็นำไปพัฒนาต่อได้เลยนะครับ ถ้าไงส่งตัวพัฒนามาให้ผมก็ดีนะครับ ผมจะได้ใช้ด้วย 🙂

Continue reading “C# HttpRequester Class (HTTP Request Upload File with POST DATA )”

How to enable using the $_GET variable in CodeIgniter

คงจะทราบดีว่า ถ้าเราตั้ง $config[‘enable_query_strings’] = FALSE ตัว CodeIgniter มันจะ unset ตัวแปร $_GET ของเราซะงั้น  ครั้งแรกที่ผมแก้ ผมเข้าไปแก้ที่ core ของ CodeIgniter เลยครับ  แต่วันนี้ผมคิดเทคนิคดีๆ ได้แล้ว เลยอยากบอกต่อครับ

ให้เข้าไปตั้งค่าในไฟล์ config.php ดังนี้ครับ

Continue reading “How to enable using the $_GET variable in CodeIgniter”

Photoshop CS3 open/new file slowly!

ถ้าเกิดคุณใช้ Photoshop CS3 แล้วเจอปัญหาว่าเวลา New… หรือ Open งานขึ้นมา แล้วมันโหลดช้ามาก มากๆ  อันนี้เป็นเพราะมันไปหาเครื่อง printer อยู่ครับ

วิธีแก้ก็ง่ายๆ ให้เราลบ Offiline Printer ที่อยู่ในเครื่องเราออกซะ! ก็เรียบร้อยครับ

 

( ตอนแรกผมไป uninstall / install ใหม่  เสียเวลาฟรีๆ ไปชม. กว่าครับ  หวังว่า entry นี้จะช่วยท่านได้ )

RegAsm : Warning RA0000

ผมพยายามจะเขียน Class Library (C#) ใน Visual Studio 2003 เพื่อเอาไปใช้เป็น ActiveX ใน Web-based Application. ปรากฎว่าตอนที่ผมสั่ง regasm myClass.dll /codebase มันขึ้น error ดังนี้ครับ

RegAsm : Warning RA0000

วิธีแก้ (Solution)
ไปที่ Solution Explorer > Properties > AssemblyInfo.cs
เข้าไปแก้จาก
[assembly: ComVisible(false)]
เป็น

[assembly: ComVisible(true)]

เรียบร้อยแล้วครับ : ) 

 

——————————————————–

เรื่อง ActiveX นี่มีตัวอย่างให้ศึกษาน้อยเหลือเกินครับ แค่ผมจะ Hello World ด้วย ActiveX ก็ทำเอาเสียเวลาไปมากครับ. ตอนนี้ผมเริ่มพอทำอะไรได้มากขึ้นแล้วครับ ถ้าศึกษาสำเร็จเมื่อไหร่ จะมาเขียนบทความในนี้ให้ครับ ผู้ที่เริ่มต้นศึกษาใหม่เหมือนผม จะได้ไม่ต้องเจออุปสรรคแบบเดียวกับผม ทำเอาเกือบเลิกศึกษา ActiveX ไปเลยครับ

หมายเหตุ: ผมพัฒนาด้วยภาษา C# นะครับ

Wick 0.8 just another bug

สำหรับปัญหาล่าสุดที่เจอ จะอยู่ในส่วนของ Router ครับ ซึ่งมีตัวแปรหลายตัวที่ไม่ถูก Reset ค่าทำให้เกิดข้อผิดพลาดมากมายในการ Load Controller ตัวถัดมาครับ.  ตรงนี้ผมแก้โดยใช้เก็บค่าก่อน Load Controller ลง Stack ไว้ก่อนครับ. แล้วก็ดึงคืนเวลาโหลดเสร็จครับ.

Wick0.8 ยังไม่เหมาะที่จะนำมาใช้งานจริงอย่างยิ่งครับ  หลังจากที่ค่อยๆ ปรับแก้ ไปเรื่อยๆ ก็จะมีปัญหาใหม่ๆ เกิดขึ้นเรื่อยๆ เช่นกัน.  สำหรับนักพัฒนาท่านใดที่คิดจะใช้เจ้าตัวนี้ ขอให้ลองคิดหาทางเลือกอื่นก่อนจะดีกว่านะครับ  ไม่งั้นท่านต้องเสียเวลาในการปรับปรุงเฟรมเวิคเยอะครับ  ดีไม่ดีเยอะกว่าเวลาที่ใช้ทำงานหลักจริงๆ เสียอีกนะครับ.   สำหรับผมถอยไม่ได้แล้วครับ  ยังไงก็จะลุยต่อครับ.

Reset value of _fail_gracefully (avoid recursively call controller)

Wick Ref: http://codeigniter.com/wiki/Wick/

ผมเจอปัญหาว่าเวลามีการเรียก  $this->load->uri ( … ); ที่ไม่มีอยู่จริง ปรกติแล้วควรจะขึ้น Error ว่าไม่พบ Controller หรืออะไรประมาณนั้น แต่ปัญหาคือเมื่อเรียก controller ที่ไม่มีอยู่จริงแล้ว จะทำให้มันพยายาม load controller ตัวเดิมไปเรื่อยๆ แบบ Recusive.  คิดว่าน่าจะเกิดเฉพาะกรณีที่ คุณเข้าถึง controller หลักโดยไม่ได้ระบุ controller  (หมายถึง มันเข้า default controller) เพราะจะไปมีผลกับตัวแปร  _fail_gracefully ครับ ซึ่งจะกลายเป็น true เมื่อมีการดึง config ตรง default controller มาใช้. วิธีแก้ก็ไม่ยากครับ ตามข้างล่างเลย!

/system/application/libraries/Wick.php
[php] $router = &load_class(‘Router’);
$uricla = &load_class(‘URI’);
$router->_fail_gracefully = false; // <-- Insert this Line $router->_set_request($uri);[/php]

Wick 0.8 Bug with Model & non-core Library

Wick Ref: http://codeigniter.com/wiki/Wick/

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

ปัญหา

เมื่อมีการเรียก $this->load->uri( …. ); จะทำให้พวก Model และ Non-core Library หายไปครับ (อาจรวมไปถึง plugin ด้วย). บางคนอาจจะเข้าใจว่ามันไม่ถูกโหลดเข้าไปใน Controller ตัวที่ถูกเรียกเท่านั้น, แต่จริงๆ แล้วนอกจากจะไม่ถูกโหลดเข้าไปแล้ว ยังทำให้สิ่งเหล่านี้ที่อยู่ที่ Controller หลักหายไปด้วยครับ. ทำให้ไม่สามารถใช้งาน Model, Non-core Library และ Plugin ได้ตามปรกติ ถ้ามีการใช้งาน Load URI ของ Wick

การหาสาเหตุ

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

ตอนแรกผมพยายามไล่ดูใน Wick ครับ เพราะเข้าใจว่า Wick คงโหลดบางอย่างไม่ครบ แต่ก็ไม่เจออะไรครับ เพราะพอหลังจากอ่านโค๊ดอยู่สักพัก ก็เข้าใจว่า Wick เป็นเพียง Library ที่มาเสริมโดยเพิ่ม method uri ใน Loader เฉยๆ ครับ. อย่างที่บอกครับว่าผมพบว่า Model และ Non-core Library มันหายไปจาก Controller หลักด้วย, เคสนี้เป็นเคสที่สำคัญเลยครับ เพราะใน Wick ไม่มีโค๊ดส่วนไหนที่ไปกระทบกับตัว Controller หลักที่อยู่ข้างนอกเลยครับ  (จริงๆ แล้วมันกระทบครับ กระทบครั้งเดียวตอนโหลดครั้งแรก ซึ่งไม่มีผลอยู่แล้ว)

หลังจากนั้นผมก็ลองเช็คไปเรื่อยๆ ก็ไม่เจออะไรที่น่าสนใจเลยครับ จนเกือบจะถอดใจแล้ว..  แต่เปลี่ยนใจลองกลับไปไล่อ่าน Wick ใหม่.. คราวนี้ผมมาหยุดตรงบรรทัดที่มีการสร้าง controller ครับ ประมาณ $controller = new $class(); อะไรประมาณนี้. และก็อย่างที่คาดการครับ บรรทัดนี้คือตัวปัญหาจริงๆ  ก็เลยต้องไล่ต่อเข้าไปข้างในครับ ว่าทำอะไรบ้าง และสุดท้ายก็เจอจนได้ครับ

สาเหตุ

เนื่องจาก CodeIgniter ถูกออกแบบมาสำหรับการใช้งานเพียง 1 Controller ต่อการเรียกครั้งนึงครับ. โดยเอาทุกอย่างมาเชื่อมเข้ากับ Controller ตามหลักของ Singleton ครับ ประเด็นคือใน code ของ Base4 และ Base5 จะทำการนำเอา Controller ที่สืบทอดมาจากมันทับเข้าไปที่ตัว Object กลางเลยครับ ซึ่งตรงนี้เลยเกิดปัญหาครับ เพราะว่า Controller ที่ถูกเรียกจาก Wick จะมีเพียง Core Library ที่เกิดจากขั้นตอนการ initialize เท่านั้นครับ  แล้วก็ถูกจับไปวางทับ Object กลางซึ่งมีการโหลด Model หรือ Non-core Library เอาไว้. Model กับ Non-core Library เลยหายไปครับ

วิธีแก้ไข

ผมใช้แนวคิดเดียวกับของ Wick ครับ  นั้นก็คือการ merge! ครับ  ผมเข้าไปแก้ไขใน Base4 และ Base5 โดยให้ทำการ merge Controller เข้ากับ Object กลางครับ แทนที่จะไปวางทับเอาดื้อๆ. การ merge ตรงนี้ผมไม่แน่ใจว่าจะส่งผลกระทบอย่างไร ต่อการทำงานในระบบใหญ่บ้าง เพราะไม่แน่ใจว่า จะมีกรณีที่บาง Module ใช้ชื่อ Properties เดียวกันหรือไม่ และอาจทำให้เกิดปัญหาได้ แต่จาการคาดคะเนโอกาสที่จะเกิดปัญหานั้นมันก็น้อยครับ. แต่ถึงอย่างนั้นก็ตาม ถ้าหลีกเลี่ยงเรื่องการใช้ชื่อซ้ำซ้อนก็จะดีครับ.

/system/codeigniter/Base4.php

if (class_exists( config_item('subclass_prefix')."Loader" ))
{
    eval('
    class CI_Base extends '.config_item('subclass_prefix')."Loader".' {
        function CI_Base()
        {
            $CI =& get_instance();
            if (is_object($CI)) {
                foreach (array_keys(get_object_vars($CI)) as $attribute) {
                    $this->$attribute = &$CI->$attribute;
                }
            }

            // This allows syntax like $this->load->foo() to work
            parent::'.config_item('subclass_prefix')."Loader".'();
            $this->load =& $this;

            // This allows resources used within controller constructors to work
            global $OBJ;
            $OBJ = $this->load; // Do NOT use a reference.
        }
    }
    ');
}
else
{
    class CI_Base extends CI_Loader {
        function CI_Base()
        {
            $CI =& get_instance();
            if (is_object($CI)) {
                foreach (array_keys(get_object_vars($CI)) as $attribute) {
                    $this->$attribute = &$CI->$attribute;
                }
            }

            // This allows syntax like $this->load->foo() to work
            parent::CI_Loader();
            $this->load =& $this;

            // This allows resources used within controller constructors to work
            global $OBJ;
            $OBJ = $this->load; // Do NOT use a reference.
        }
    }
}

/system/codeigniter/Base5.php

class CI_Base {

    private static $instance;

    public function CI_Base()
    {
        if (isset(self::$instance)) {
            foreach (array_keys(get_object_vars(self::$instance)) as $attribute) {
                $this->$attribute = &self::$instance->$attribute;
            }
        }
        self::$instance =& $this;
    }

    public static function &get_instance()
    {
        return self::$instance;
    }
}

หมายเหตุ: ไฟล์ Base4.php ผมใส่สีเฉพาะความแตกต่างจากการแก้ไขเดิมนะครับ ตามลิงค์นี้ (http://blog.kentreez.com/2008/07/22/codeigniter-my_loader-in-php4/)

พอแก้ไขบั๊กจุดนี้ได้แล้ว Framework Bug Free ก็ใกล้ความจริงเข้ามาแล้วครับ