หนังไม่สมจริง

4. August 2010

ตอนเด็กๆ (ก็ไม่น่าจะเด็กมากประมาณ ม.3 ล่ะมั้ง) เวลาป๊าม๊าที่เป็นหมอนั่งดูละครชุดเรื่อง E.R. กันก็จะนั่งดูเหมือนจะบันเทิงแต่ก็จะจับผิดตลอดเวลาอย่างโน้นอย่างนี้ ไม่สมจริง ทำแบบนี้ไม่ได้ …. ตัวเองตอนนี้มาพอนั่งดูนั่งที่เกี่ยวกับคอมพิวเตอร์หลายๆเรื่องก็ไม่เห็นจะมีเรื่องไหนมันทำสมจริงๆมากๆเลยว่ะ (มีนะแต่น้อย) ส่วนใหญ่ GUI ของคอมพิวเตอร์ในหนังมันก็จะเว่อร์ๆอยู่แล้วเพื่อให้คนดูสนุก วันก่อนก็ได้คุยกับพี่ที่ทำงานอีกคนเค้าก็ติๆ Angel & Demon หน่อยว่าทำอะไรไม่อิงข้อมูลวิทยาศาสตร์ แล้วก็ชมเรื่อง Iron Man ให้ฟังว่าเรื่องนี้ทำอะไรปรึกษานักวิทยาศาสตร์ตลอด ไม่ได้ให้ข้อมูลผิดๆเหมือน Angel & Demon

พักหลังๆผมชอบไปอ่าน review หนัง หลายครั้งบทวิจารณ์หนังพวกนี้มันบอกว่าหนังเรื่องนึงไม่ดีด้วยเหตุผล “ไม่สมจริง” ยกตัวอย่างเช่นเรื่อง The Hurt Locker คนวิจารณ์เคยทำงานเกี่ยวกับทหารมาก่อน เค้าบอกว่าเค้าดูแล้วรู้สึกสะดุดมากตอนที่ตัวเอกตัดสินใจจัดกลุ่ม 3 คนไปกู้ระเบิด เค้าบอกว่าสถานการณ์จริงไม่มีทางมีเรื่องแบบนี้เกิดขึ้นเป็นอันขาด ทำให้เค้าเสียอารมณ์ = =’

มานั่งคิดๆดู สมมติว่าคนเขียนบทเค้าสามารถทำให้คนดู 95% ทั่วโลกบันเทิงไปกับหนังโดยไม่สะดุดเลยได้จนจบเรื่อง และไม่ต้องสนใจคน “วงใน” อีก 5% เลย ว่าจะคิดยังไง มันก็ดูคุ้มค่าที่จะทำนะ ไม่รู้จะเอาเงินไปจ้างที่ปรึกษาด้านวิทยาศาสตร์ การแพทย์ คณิตศาสตร์ โบราณคดี blah blah ไปทำให้คนอีก 5% พอใจไปทำไม

ผมมาจบที่ข้อสรุปว่า “ความไม่สมจริง” ไม่ใช่เหตุผลที่ทำให้หนังมันไม่ดีที่สามารถใช้เอามาบอกคนอื่นได้ (ยกเว้นชัวร์ว่าเป็น 5% ด้วยกัน) … หรือว่ายังไง ?

ถ้าจะให้ผมพูดในฐานะที่เป็นคนใน “5%” ของบางเรื่อง อย่างถ้าใครเคยดูเรื่อง Antitrust ไม่รู้จะมีคนสงสัยเหมือนผมรึเปล่าว่า บริษัทยักษ์ใหญ่จะแย่งตัวหนุ่มน้อยอัจฉริยะผู้เขียนโปรแกรมภาษา “Java” ได้ (ซึ่งมีคนเขียนเป็นอยู่ล้นตลาด) ไปทำงานทำไม =_=” อย่าลืมกดดูให้ถึงหน้าจอที่แสดงโค้ด Java สำหรับทำ Satellite Uplink .. หนังเรื่องนี้พยายาม feature ผลิตภัณฑ์ของ Sun ทั้งเรื่องเลย  …. ไม่อยาก spoil เพิ่มแต่ลองไปดูแล้วกันว่าคนพวกนี้พยายามกันขนาดไหนเพื่อจะ “ขโมย” โค้ด “Java” ของคนอื่น

แต่ก็ต้องยกให้ว่าเรื่องนี้ในด้าน GUI มันค่อนข้างจะสมจริงมาก จะมองมุมไหนคอมพิวเตอร์ก็น่าเกลียดเหมือนจริง +__+’

ถ้าหนังเรื่องไหนสามารถกำจัดความไม่สมจริงที่ถูกสั่งสมขึ้นมาโดยเรื่องอื่นๆได้นี่ ก็จะได้เป็น Hero ไปเลย :’) ยกตัวอย่าง Trinity ใช้ nmap ใน The Matrix (เคยลองๆใช้โปรแกรมนี้ตอนไปแข่ง Network Security Contest ด้วยนะ!) อันนี้ได้ใจคน 5% ไปชัวร์ๆ

หรือคุณว่ายังไง ??

Java, General , , ,

ตัดคำไทยด้วย C#

5. March 2010

WARNING: Highly technical blog ahead

กาลครั้งหนึ่งนานมาแล้ว … อาจารย์สมชายแห่ง CP เคยเอารัฐธรรมนูญฉบับเก่ากับฉบับใหม่มาเทียบความถี่ในการปรากฎของคำ ตอนนั้นผมอึ้งมากที่รู้ว่า Java มันตัดคำไทยได้ด้วย แบบ built-in มาไม่ต้องหา library อะไรมาเพิ่มเลย >_<  ถ้าผมเข้าใจไม่ผิด Java ใช้ ICU ของ IBM ที่เป็น open source แต่ตัวที่อยู่ใน class library ของ Java จะเป็นเวอร์ชันเก่ากว่าหน่อย

เจ้า ICU ที่ว่านี่นอกจากตัดคำได้ (Boundary Analysis) แล้วมันยังทำอย่างอื่นที่เกี่ยวกับกับ localization & internationalization ได้อีกมากมายก่ายกองครับ ลองเข้าไปดูกันเอง IBM ทำไว้สองชุดคือ ICU4C และ ICU4J สำหรับ C, C++ และ Java (ไม่มี .NET แป่วว) ถ้าใครทันสมัยใช้ Firefox ที่ยังตัดคำไทยไม่ค่อยจะคล่องอาจจะได้ยินชื่อนี้บ่อย เพราะมีคนไทยฮาร์ดคอร์มากมายเอาโค้ด Firefox มาแก้ใส่ ICU ให้ตัดคำแล้ว build ใหม่ … แค่ฟังก็อยากจะอ้วกออกมาเป็น pointer กับไฟล์ .h แล้วว =__=’

ด้วยความที่ 3 วันนี้ผมเมาจัดหรือยังไงไม่ทราบ เลยใช้เวลาว่างอันมีอยู่น้อยนิดไปพยายามทำ binding ให้เรียกใช้ ICU จาก C# (และ .NET) ได้ครับ! ก่อนทำก็หา best practice โดยการไปถามที่แหล่งประจำเล็กน้อย ได้คำตอบมาแค่อันเดียวน่าเศร้าใจ TvT

ผมเข้าใจว่าการทำ binding มันจะต่างจาก wrapper ตรงที่ เราต้องนำเสนอ interface เดียว (หรือคล้ายๆ) กับที่ underlying C++ classes มันใช้อยู่ให้กับผู้ใช้ ส่วนการทำ wrapper มันเหมือนกับว่าเราไปสร้างอะไรซักอย่างหุ้ม C++ classes เหล่านั้นไว้ และให้ผู้ใช้เรียกใช้งานผ่าน interface ของเรา (โดยไม่รู้ว่าข้างในมีอะไรอยู่บ้าง – Facade Pattern อ่านว่า “ฟา-ซ้าด”) ซึ่งการทำ wrapper นี่มันง่ายกว่าโขเลยน่ะ

หลังจากลองถูๆไถๆ ใช้พลังกับ C++/CLI เหมือนที่เคยใช้ในซีเนียร์โปรเจค ก็ออกมาเป็นรูปเป็นร่าง อยู่ที่ ICU4NET สามารถลองดาวน์โหลดไปใช้ได้ ถึงชื่อจะบอกว่า ICU4NET แต่จริงๆแล้วตอนนี้มันมี class ที่ใช้งานได้อยู่ class เดียวคือ BreakIterator =_=” ตั้งใจไว้ว่าจะจัดการกับ class ในกลุ่ม boundary analysis ให้หมด

เอาโค้ดตัวอย่างให้ดูเล็กน้อย อันแรกเป็นแบบดั้งเดิม ลักษณะเดียวกับที่เขียนใน ICU4J และ ICU4C

private List<string> WordBreak(string text)
{
var sb = new StringBuilder();
var col = new List<string>();

using (BreakIterator bi = BreakIterator.CreateWordInstance(Locale.GetUS()))
{
bi.SetText(text);
int start = bi.First(), end = bi.Next();
while (end != BreakIterator.DONE)
{
col.Add(text.Substring(start, end - start));
start = end; end = bi.Next();
}
}

return col;
}

ส่วนอันนี้ผมเขียน Extension Method เพิ่มให้มัน return เป็น IEnumerable ได้ พวกขา 3.5 จะได้เล่นซนแบบนี้ได้ :’)

using (BreakIterator bi = BreakIterator.CreateWordInstance(Locale.GetUS()))
{
bi.SetText(uxText.Text);

// requires ICU4NETExtension to use Enumerate extension method
MessageBox.Show(string.Join(Environment.NewLine, bi.Enumerate()
.GroupBy(w => w)
.OrderBy(x => x.Count())
.Reverse()
.Select(x => x.Key + " : " + x.Count())
.Take(10)
.ToArray()));
}

ตอนแรกตั้งใจว่า ส่วนที่น่าจะเอาไปเล่นได้หลักๆคงเป็นพวก ASP.NET Web App แหละ แต่นั่งคิดๆดูแล้วมันมีส่วนประกอบที่เป็น library native ของ ICU หลายอันอยู่ ถ้าเข้าใจไม่ผิดคงมีปัญหากับเรื่อง trust level ของ IIS พอสมควร …

ผลพลอยได้จากการผลาญเวลา (แบบไร้เหตุผล เอามันส์ล้วนๆ) ครั้งนี้คือ ได้ศึกษา C# เพิ่มอีกนิดหน่อย แล้วก็ลองใช้ C++/CLI อีกนิสสสนึง หลังๆมานี่อยู่ที่ทำงานได้ใช้แต่ C++ จนรู้สึกตัวเองตามโลก C# ไม่ทัน มาอ่านโค้ดของ @chakrit (ขา 3.5 ตัวพ่อ) ทีนี่นั่งงงอยู่หลายนาที –..-‘ เออออ … น้ำหลักลดด้วยนะ ^ ^

จากประสบการณ์ ด้วยหัวข้อยบลอกประมาณนี้ ผมเชื่อว่าคงมี นิสิต/นักศึกษา ที่กำลังปั่นงานของอาจารย์แล้ว search มาเจอ และอยากนำไปใช้ได้โดยเร็ว … ผมขอร้องว่าก่อนจะทิ้งคอมเม็นต์ไว้หรือเมล์มาถาม technical issue กับผม ช่วยศึกษาเรื่องพื้นฐาน C# กับเรื่องพวกวิธี reference รวมถึงอ่าน Readme ก่อน แล้วค่อยถามมานะครับ …

ผมตั้งเป้าไว้ว่าจะมีคนเอาไปใช้ประโยชน์ได้ 2 คนขึ้นไป ใครเอาไปใช้ทำอะไรบอกด้วยๆ :’)

ICU4NET – ICU Binding for .NET

WordBreak

OOAD, .NET, Java, Native , , , , , ,

Remote Debugging J2EE Application

20. September 2009

ตั้งชื่อบลอกไม่ถูก คำศัพท์ Java มันเยอะจัด (J2EE, Web Container, Servlet, ...)

ฐานโค้ดที่ผมดูอยู่ที่ทำงานมันค่อนข้างใหญ่มาก เป็นไฟล์ Text ขนาดรวมกันเกือบ 20 MB ซึ่งจริงๆแล้วส่วนที่เราจะเข้าไปมองจริงๆมันก็ไม่ได้เยอะอะไรหรอกครับ แต่ปัญหาก็คือว่า เราจะหาส่วนที่เราต้องการมาได้ยังไงจากข้อมูลที่เยอะขนาดนั้น ??? คำตอบหนึ่งคือใช้โปรแกรมพวก Cross Referencing เช่น OpenGrok จะช่วยให้ค้นหาส่วนของโค้ดที่ต้องการได้ง่ายขึ้นเยอะเลย นอกจากนี้ OpenGrok ยังสนับสนุนการทำ index บน repository ของพวก SCM Tools ต่างๆเช่น SVN, Git และ Mercurial อีกด้วย

เข้าเรื่อง … ปัญหาที่ผมเจอคือ OpenGrok มันดันไม่โชว์ History ให้ ซึ่งหลังจากถามไปใน mailing-list ก็พบว่ามันเกิดจากการหาโปรแกรม hg (Mercurial) ไม่เจอใน PATH ผมลองมา reproduce ที่บ้านบน environment ที่เป็น Windows ก็ยังเจอปัญหาเดียวกันอยู่ เลยต้องหาวิธี Debug OpenGrok ตอนนั้นคิดๆไว้หลายวิธี

  • Build เฉพาะ Class ที่ทำหน้าที่ส่วนนั้นขึ้นมาใหม่ แล้วใส่ให้มันโหลดขึ้นก่อนใน CLASSPATH  .. อันนี้สุดท้ายก็ทำไม่ได้เพราะผม build เป็นไฟล์ๆไม่ได้มันติดพวก dependency เลยไม่รู้ว่าสรุปแล้วใช้วิธีนี้ได้ป่าว
  • อ่านวิธี Build OpenGrok จากเว็บมันแล้วลองตั้ง breakpoint ตรงส่วนที่เป็นปัญหา อ่านแล้ววิธีนี้น่าจะง่าย แต่เนื่องจากว่าตัว Container ที่ใช้มันเป็น Tomcat แต่ปกติ Netbeans มันจะติดมากับ Glassfish เลยเกิดความขี้เกียด config ขึ้นมาในบัดดล
  • ทำ Remote Debugging คือ start Tomcat ใหม่ให้มันรันแบบ Debug และเปิด port 7001 รอไว้ แล้วเอา Debugger เข้าไป attach … อันนี้ได้ผลครับ และง่ายมากด้วย แต่ต้อง build OpenGrok ได้น่ะ หลังจากตั้ง breakpoint ไว้แล้วปรากฎว่ามัน break จริงๆด้วยว่ะ! Watch + Evaluate ได้แทบทุกอย่างเลย

จริงๆ ASP.NET ก็มีของแบบนี้เหมือนกัน มันเหมาะมากเวลาเกิดปัญหากับ Application ใหญ่ๆที่การ Setup ให้เกิดปัญหาเดียวกันมันยาก ใช้แล้วก็รู้สึกว่า Java ก็ไม่เลวครับ : )

Java Options สำหรับ Start Tomcat

-Xdebug
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7001

แล้วใช้ Netbeans attach เข้าไปที่ port 7001 ของ localhost

Java, Tools , , , , ,

บั๊กที่เกิดบ้างไม่เกิดบ้าง

19. May 2008

เป็นโปรเจคที่ทำอยู่ที่ฝึกงานครับ

แบ่งงานกับเพื่อนร่วมทีมเขียน เพื่อนร่วมทีมเขียน Data Access Layer ก็คือคลาสที่ห่อหุ้มการทำงานกับฐานข้อมูลทั้งหมดนั่นแหละ (ฐานข้อมูลที่ใช้คือ IBM DB2 ครับ ชื่อเก่า Cloudscape)  ส่วนผมเขียนส่วนที่เป็น Business Logic แล้วก็ทำ Presentation Layer (เป็น Web-based)

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

วิธีการที่ใช้ประกอบค่า DateTime ขึ้นมา คือเอา วัน เดือน ปี ชั่วโมง นาที วินาที มาต่อกัน เช่น 19-06-2008 15:43:12 เป็นต้น แต่ปรากฎว่าเพื่อนผมลืมไปว่า ถ้าเวลาตอนนั้นค่าของหลักวินาทีเป็นเลขหลักเดียว จะได้ String ผิดๆออกมา เช่น 19-06-2008 15:43:6 (จริงๆแล้วควรเป็น 19-06-2008 15:43:06) ตอนเอางานมารวมกันก็เลยมีปัญหาดังกล่าวเกิดขึ้นบ้างไม่เกิดขึ้นบ้าง เล่นเอางงอยู่นาน ถ้าประมาณคร่าวๆ โอกาสที่จะเกิดข้อผิดพลาดระหว่างการทำงานก็เป็น 1/6 ล่ะครับ

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

Internship, Java, OOAD , , , ,