Hoffman Framework ใกล้ความจริงแล้ว

หลังจากพลัดผ่อนมานานมาก ๆ เพราะเปลี่ยนงาน และไล่งานที่ตัวเองทำอยู่หลายตัว ตอนนี้กำลังปล่อยตัว pre-alpha (alpha version) ออกมา ตอนนี้ผมใส่ tag เป็น 0.1.3a แล้วครับ เอา source ขึ้น sourceforge.net/projects/hmf/ แล้ว บนเครื่องผม revision ซัดไป 140 กว่า ๆ แล้ว และ tag อีก 4 ตัว แต่บน sourceforge นี่เป็นตัวที่ทดสอบว่า ok แล้วคือ 0.1.3a นั้นเองครับ แต่ต้องมีการปรับปรุงอีกหลายส่วนครับ และยังไม่ได้ทำ documents มากนักครับ ตอนนี้คงได้แต่เอาไป review code มากกว่า ไม่ได้เอาไปใช้งานจริง ๆ แล้วเดี่ยวจะมีตัว demo ที่คาดว่าจะเอามาให้ดูเป็นตัวเอย่างพร้อม ๆ กับ documents ครับ ในตัว code นั้นบางส่วนไม่ได้เขียน docs comment และบางตัวยังไม่ได้ทำ test ครอบคลุมทุกด้านครับ

โดยผมจะทำ docs API ให้ด้วยครับ รออีกสักพักนึงนะครับ ไม่น่าเกิน 1-2 อาทิตย์นี้ หรือหลังสงกรานต์นี้แหละครับ คงได้ออก alpha ตัวเต็ม ๆ พร้อม docs API ที่ดีขึ้นกว่านี้เยอะครับ

สรุปคือตอนนี้มาบอกเฉย ๆ แหละครับว่าเอาขึ้น public แล้ว แหะ ๆ ๆ ;P

ร่วมด้วยช่วยกัน Say No To IE 6! สำหรับเว็บที่ใช้ jQuery (และพวก Prototype JavaScript ตัวอื่น ๆ ด้วย)

จาก entry หมดเวลา Internet Explorer 6 แล้ว เลิกใช้มันได้แล้ว !!! และจาก Campaign “Say No To IE 6!” จากเว็บ SaveTheDevelopers.org นั้นเค้าให้เอา code ด้านล่างนี้ไปใส่

<script src="http://www.savethedevelopers.org/say.no.to.ie.6.js"></script>

แต่ถ้าเว็บใครใช้ jQuery นี่อาจจะไม่ได้ แบบ Theme K2 ของผม วิธีอีกแบบที่สามารถทำได้ และทำงานร่วมกับ jQuery ได้ก็คือใช้ CSS – Conditional comments นั้นเอง โดยกำหนดไว้ว่าถ้า IE ที่ version น้อยกว่า 7 ให้โชว์ตัว popDown นี้ขึ้นมาครับผม

<!--[if lt IE 7]>
<script type="text/javascript" src="path/to/savethedevelopers.js"></script>
< ![endif]-->

เสร็จแล้วในไฟล์ savethedevelopers.js ก็ปรับแก้เป็นแบบนี้ครับ

jQuery(document).ready(function(){
var now = new Date();
var time = now.getTime();
var div = document.createElement('a');
var id = 'saynotoie6_div_' + time;
div.setAttribute('id',id);
div.setAttribute('href','http://www.savethedevelopers.org/');
div.setAttribute('target','_blank');
div.style.display = 'block';
div.style.color = '#1d1d1d';
div.style.textAlign = 'left';
div.style.fontFamily = 'Arial';
div.style.fontSize = '11px';
div.style.background = 'url(http://webhost.domain/path/to/savethedevelopers/PopDown.gif)';
div.style.padding = '0';
div.style.position = 'absolute';
div.style.top = '0';
div.style.right = '40px';
div.style.zIndex = '999999';
div.style.width = '330px';
div.style.height = '63px';
div.style.marginTop = '-80px';
div.style.filter = 'alpha(opacity=95)';
document.body.appendChild(div);

var animate = function(){
var myDiv = document.getElementById(id);
var value = parseInt(myDiv.style.marginTop)
myDiv.style.marginTop = value + 1 + 'px';
if(parseInt(myDiv.style.marginTop) < -1){
            var timer = setTimeout(animate,30 * 80/Math.abs(value) * .27);
        }else{
            var timer = setTimeout(hide,25000);
        }
    }

    var hide = function(){
        var myDiv = document.getElementById(id);
        var value = parseInt(myDiv.style.marginTop)
        myDiv.style.marginTop = value - 1 + 'px';
        if(parseInt(myDiv.style.marginTop) > -80){
var timer = setTimeout(hide,1.4 * 80/Math.abs(value) * 3.70);
}
}

setTimeout(animate,1000);
});

ลองเทียบกับของเก่าเค้าก็ได้นะครับ อันนี้ผมปรับให้โชว์ไว้สัก 25 วินาทีครับผม ส่วนถ้าเอาไปใช้กับ mootools หรือตัวอื่น ๆ ก็เปลี่ยนการ windows.onload เป็นแบบอื่น แทนการใช้ jQuery(document).ready(); ครับ

เรามาร่วมด้วยช่วยกันประกาศครับผม เอาพวกไม่ได้มาตรฐานออกไปจากสังคมสักทีนึงครับผม

หมดเวลา Internet Explorer 6 แล้ว เลิกใช้มันได้แล้ว !!!

พอดีว่าวันนี้ทำ Theme ‘K2’ ให้ support กับ IE 6 ให้มากที่สุด เล่นซะหมดแรงเลย ซึ่ง จริง ๆ K2 มันก็สนับสนุนอยู่แล้ว แต่ว่าบางส่วน และไม่ทั้งหมด ไป ๆ มา ๆ เลยยอมแพ้ ช่างมัน ใครใช้ Internet Explorer 6 เข้ามาก็เจออะไรเหว่ง ๆ หน่อยก็อย่าไปคิดมากแล้วกัน และแนะนำให้ไปใช้ Internet Explorer 7, Firefox 2 หรือ Opera แทนแล้วกันนะ เพราะว่าตัว Internet Explorer 6 นี่มันทำให้คนทำเว็บสูญเสียพลังงานในการทำให้เว็บต้องไปสนับสนุนมันมาก ยิ่งในประเทศไทย ที่ร้อยละ 70 ของเครื่องคอมพิวเตอร์ใช้ Windows เถื่อนนี่ยิ่งเแล้วใหญ่ ส่วนใหญ่มักไม่กล้า upgrade software ต่าง ๆ เนื่องจากกลัวโดย block ไม่ให้ใช้งาน ทำให้พลาดความสามารถใหม่ ๆ ของโลกเทคโนโลยีรุ่นใหม่ ๆ ไปเยอะ ซึ่งเป็นเรื่องที่น่าเสียดายมาก ๆ T_T

แต่อีกอย่างคือเว็บของกระทรวงต่าง ๆ ในไทย รวมถึงพวกเว็บของหน่วยงานราชการต่าง ๆ ยังคงทำเว็บแบบไม่สนใจ web standard เลย ซึ่งเป็นการเลือกปฎิบัติอย่างมาก ยิ่งเว็บ rd.go.th นี่ตอนลงทะเบียน หรือกรอกข้อมูลภาษีนี่ให้ใช้แต่ Internet Explorer 6 เท่านั้น ซึ่งผมก็เซงอย่างรุนแรง ผมว่าคนทำระบบมันไม่มีความสามารถให้รองรับได้หลากหลาย Browser มากกว่า หรือว่ามันขี้เกียจก็ไ่ม่รู้ หรือไม่แน่นะ ความสามาถอาจจะไม่ถึงก็ได้ แต่ดันโดนให้มาทำระบบนี้พอดี -_-‘ อืมมม น่าคิดนะ

Current Campaign

Say No To IE 6!
Our current campaign focuses on assisting users in upgrading their Internet Explorer 6 web browser. This campaign will result in former IE 6 users having a more enjoyable experience on the web while (hopefully) creating a less stressful and complicated environment for web developers by hastening the retirement of an outdated browser.

SaveTheDevelopers.org :: Making The Web A Better Place, One Campaign At A Time…

Updated to WordPress 2.5 ;)

เพิ่งเปลี่ยนมาเป็น WordPress 2.5 ได้สัก 3 ชั่วโมงแล้ว คือเริ่ม upgrade ตั้งแต่เที่ยง ๆ ของวันนี้ (จริง ๆ อยากทำตอนกลางคืน แต่ว่าช่วงนี้พลังงานร่างกายใช้ไปเยอะ เลยทำตอนที่สะดวกดีกว่า) มีการ upgrade ตัว plug-in และ theme หลายส่วนมาก ๆ ถ้าเพื่อน ๆ พี่ ๆ น้อง ๆ ท่านใดพบความผิดปกติ และข้อผิดพลาดให้ comment ไว้ใน entry นี้ก็ได้ หรืออีเมลมาก็ได้ครับ (หาได้จากหน้า About Me ครับ)

อีกเรื่องคือตอนนี้ผมไล่ลบ user บางส่วนที่ใช้ email ที่ไม่มีอยู่จริง ออกจาก userlist แล้วนะครับ

ต่อมาก็เรื่อง feature ใหม่ก็คือ notify via email และ gravatar ครับ ส่วน print page ตอนนี้แก้ bug ที่เข้ากันไม่ได้กับ wordpress 2.5 ไปได้แล้วครับผม ;)

Hoffman Framework เอา Smarty ออกจาก Components หลักแล้ว

ช่วงนี้ไม่ได้บอกถึงความเปลี่ยนแปลงของ Framework ตัวนี้เลยเกือบ ๆ เดือน เพราะว่าผมเปลี่ยนงานใหม่ครับ เลยต้องนั่งเคลียร์งานที่ค้างกับบริษัทเก่า เลยแทบไม่ได้จับเลย แต่ก็หาเวลาว่ามานั่งไล่ดูระบบภาพรวมโดยทั้งหมด สิ่งที่ผมเปลี่ยนแปลงตัวระบบ runtime มากที่สุดครั้งหนึ่งในการทำ Framework ตัวนี้คือเอา Smarty ออกไป (แต่ถ้าอยากเอากลับมาก็ทำได้ไม่ยาก เดี่ยวจะเขียนวิธีการอีกทีนึงสำหรับคนที่อยากเอา Smarty หรือ Template-engine ตัวอื่น ๆ มาใส่) ซึ่งตัวโครงสร้าง RenderView นี่ไม่ได้เปลี่ยนแปลงอะไรมาก นอกจากเอา Smarty ออกไป และสร้าง method ที่ render ของตัวเองมาอีก 2-3 ตัวเท่านั้นเอง เลยเอากลับมาใส่ได้ไม่ยากครับ

เหตุผลที่เอาออกไปเนื่องจากมันไปหยุดวิธีการทำงานของแนวคิด php เดิม ๆ ไปไว้ฝั่ง designer และทำให้ learning curve ของทั้งฝั่ง developer และ designer เพิ่มมากขึ้น เพราะ Smarty มี syntax เป็นของตัวเอง และสิ่งที่ทำให้ผมรู้สึกว่าต้องเอาออกจริง ๆ นั้นคือการสร้าง Helpers ของ RenderView ที่ยากกว่าปกติมาก ๆ -_-‘ การ register function/class/object/class->method เข้าไปเป็น function/modifier ต่าง ๆ พวกนี้ทำได้ยาก และงงสุด ๆ ซึ่งจริง ๆ มันก็ไม่ยากหรอกครับ แต่ว่ามันเสียเวลามากกว่าปกติเวลาต้องคิดพวก Helpers เพราะมี guide-line ของมันเอง ซึ่งทำให้มึน ๆ งง ๆ ได้ง่าย ๆ เลย จริง ๆ 9Aum ก็บอกแบบนี้เหมือนกัน ผมก็ว่าจริง ;P

โดยที่ผมเอาออกไป ก็ไปนั่งแกะเจ้า Smarty และ Template-engine ของค่ายอื่น ๆ บ้าง รวมถึง CodeIgniter ด้วย เพื่อเขียนเองซะเลย พบว่าใช้ output-buffer แทนแล้วกัน แต่คาดว่าผมต้อง manage ตัว buffer นี้ด้วย ไม่งั้นมีปัญหาแน่ ๆ ซึ่งจริง ๆ Template-engine ทุกตัวก็ใช้แนวคิดไม่ต่างกันอยู่แล้วครับ คือทำ runtime ให้เสร็จแล้วเอาผลของการทำงานออกมาทีเดียวเลยเพื่อแยกระหว่าง process กับ presentation ออกจากกันอย่างชัดเจน โดยแนวคิดหลัก ๆ เอามาจาก PHPTemplate ของ Drupal ครับ

ต่อมาก็ทำ Acl เสร็จแล้วรวมถึง Authen ด้วย (เพราะทั้งส่วนนี้ต้องทำคู่กันครับไม่งั้น ไม่มีประโยชน์แน่นอน) กำลังปรับแต่งให้ config ง่ายที่สุด และรองรับทั้ง file-base และ db-base ครับ

ส่วน Error Handle และ Logs นั้นเพิ่มและใช้ได้ดี ในระหว่างทำ demo-app และ production-app ครับ (ตอนนี้ผมทำ production-app อยู่ 2-3 ตัวครับผม) โดย Logs จะช่วยได้เยอะมาก ๆ ในเรื่องการ track-error ครับ และ Error Handle มี 2 mode คือ production และ developer ครับ ถ้า environment เป็น production พวก error ต่าง ๆ จะไม่โชว์ออกมาเลย แต่จะ redirect ไปหน้าหลักอย่างเดียว (หรือ control ไปหน้าอื่น ๆ ก็ได้ แต่อันนี้เดี่ยวใส่เพิ่มอีกที)  แต่พวก error พวกนี้จะบันทุกอยู่ใน logs ตลอดครับ ทั้ง 2 mode เลย ทำให้ถ้ามี error ใน production mode จะไม่โดน hack จากการเกิด error ได้ง่ายครับ

ส่วนของ Third Party Components นี่กำลังใส่ทำ Baseclass-Components  อยู่ครับ จะได้สะดวก ๆ หน่อยน่ะครับ ;)

เดี่ยวจะมาเล่าพวกการ config อีกทีครับว่ามีส่วนไหนบ้างครับผม ;)

image