review Apple Keyboard ใหม่

ทั้งๆ ที่ผมเป็นคนใช้ laptop เป็นคอมพิวเตอร์ตัวเดียว ไม่มี desktop ใช้ แต่ว่าเวลาทำงานกับโต๊ะก็จะต่อจอนอก (ยังๆ ผมยังไม่มีงบไปซื้อ Cinema Display หรอกนะ ถึงจะอยากได้ก็เถอะ ตอนนี้ใช้ Acer AL2216W อยู่) ต่อ keyboard กับ mouse แล้วก็ยกเครื่อง laptop มาตั้งบนแท่นอะไรซักอย่างให้มันอยู่ระดับสายตา … และเมื่อสักพักแล้วล่ะ ผมก็ซื้อ Apple Keyboard ตัวใหม่ (แบบมีสาย ไม่ค่อยชอบแบบ Wireless ตัวใหม่เท่าไหร่)



หลังจากใช้งานมันทุกวันมาซักพัก (จนปุ่มน่าจะเลิกแข็งเพราะว่าเป็นของใหม่แล้ว) ก็มีข้อสรุปดังนี้

  • มันค่อนข้างที่จะแบนเกือบราบลงไปกับโต๊ะจริงๆ เรียกได้ว่าแทบไม่มีอะไรยกขึ้นมาเลย แต่ว่าเชื่อไหม ว่าองศาที่มันเอียงขึ้นมาค่อนข้างจะพอเหมาะกับการพิมพ์แบบพรมนิ้วบน keyboard นะ และผมถือว่านี่เป็นข้อดีในการออกแบบ (ส่วนตัว) เพราะว่าคนทำ keyboard ส่วนมากจะออกแบบให้มีขาตั้งเล็กๆ ที่จะต้องจับตั้งเอง ทำให้หลายคนไม่รู้ว่าจะต้องทำแบบนั้นถึงจะพิมพ์ถูกสุขลักษณะ(กว่า)
  • เนื่องจากความเล็กและบางของมัน มันก็เลย low profile มากๆ บนโต๊ะ จะ slide เก็บไว้ที่ไหน หรือว่ายกไปวางพิงไว้ที่ไหน ไม่ต้องห่วงเรื่องเกะกะ
  • Key เป็นปุ่มแบบหมากฝรั่ง (ที่อาจจะเริ่มฮิต วันก่อนไปเดิน PowerBuy เห็น Sony Vaio รุ่นใหม่ๆ เป็นปุ่มแบบนี้เพียบ) โดยส่วนตัวแล้วเทียบกับ Apple Keyboard ตัวเก่า (ที่ก็ยังอยู่ใน lab แต่ว่าไปต่อกับเครื่องอื่น) คิดว่าดีกว่าเยอะ เพราะว่ามันสะสมฝุ่นน้อยกว่า ตัวเก่านี่มีร่องให้ฝุ่นและสิ่งสกปรกต่างๆ เข้าไปได้เยอะมาก และดันทำใสอีก ก็เลยยิ่งเห็นชัด ถอดทำความสะอาดยาก อันนี้ให้สองดาวเลย
  • แต่ว่านะ ผมก็ยังชอบปุ่ม สี และสัมผัสแบบ PowerBook อยู่ดี เครื่อง PB17″ ที่ตอนนี้ให้ลูกศิษย์ใช้อยู่เนี่ย ชอบมากเลย Keyboard เครื่องนั้น สำหรับ MacBook Pro ที่ใช้อยู่ตอนนี้ รู้สึกว่าแข็งไปนิด
  • แม้ว่ามันจะเป็นแบบเดียวกับ Keyboard ของ MacBook แต่ว่าความรู้สึกส่วนตัวของผมคือ มันแข็งกว่าเยอะเหมือนกัน หรือว่าผมยังใช้มันไม่เยอะพอก็ไม่รู้ เลยยังไม่อ่อนเท่าไหร่ (แต่ว่าเราก็กดมันค่อนข้างจะเยอะแล้วนะ หรือว่าผมยังไม่รุนแรงกับมันพอให้มันอ่อนหว่า :-P)
  • ปุ่น plastic สีขาว บน aluminum สีเงิน นี่ไม่ค่อยจะเข้าเท่าไหร่เลยแฮะ แต่ว่ามันก็ยังทำให้ Mighty Mouse ดูแปลกปลอมน้อยลงนะ (อันนี้เป็น comment จากคุณวีร์ ที่ทำ dualGeek ด้วยกัน)
  • ไม่รู้จะเป็นกับทุกตัวหรือเปล่า แต่ว่าตัวที่ผมมีนี่ caps lock ค่อนข้างที่จะแข็งและบางทีกดลงยากกว่าปุ่มอื่น เรียกได้ว่าต้องตั้งใจกด ไม่ใช่ลากนิ้่วผ่านๆ หรือว่าสัมผัสเฉยๆ แล้วมันจะลงเหมือนกับ MacBook/MBP ซึ่งอาจจะดีถ้ามองว่ามันช่วยให้กดพลาดยากขึ้น เพราวะ่าปกติไม่น่าจะมีคนใช้อยู่แล้ว แต่วาผมใช้มันเป็นปุ่มเปลี่ยนภาษาแบบเร็วๆ เนี่ยสิ​ …. (สำหรับคนที่ไม่ทราบนะครับ ใน OS X เราสามารถเปลี่ยนภาษาแบบเร็วๆ ได้ โดยการเลือก input mode เป็นภาษาไทยไว้ แล้วเวลาอยากจะพิมพ์ภาษาอังกฤษแทรกๆ เข้าไปในข้อความภาษาไทยอย่างเร็วๆ โดยไม่อยากจะเปลี่ยนภาษา เพราะว่ามันต้องกด  cmd+space ล่ะก็ ให้กด caps lock ครับ)
  • แต่ว่าผมพิมพ์กับมันค่อนข้างที่จะเร็วกว่า Apple Keyboard ตัวเก่านะ ไม่รู้ว่าอุปทานหรือเปล่า ยังไงอาจจะต้องลองวัดกันดู
  • ตำแหน่งของ fn key มันแปลกๆ นะ ถ้าใช้คีย์บอร์ดของเครื่อง Apple laptop มาซักพักอาจจะงง ว่ามันอยู่ตรงไหน

สรุปว่าก็ชอบแหละครับ ถือว่าเป็น improvement จากตัวเก่าอย่างเห็นได้ค่อนข้างชัดในเรื่องของการออกแบบ ให้ใช้พื้นที่น้อยลงและเก็บออกไปจากพื้นที่ทำงานง่ายขึ้น รูปลักษณ์ก็สวยดีแล้วก็ low-profile มากขึ้น แต่ว่าก็มาเสียคะแนนนิดหน่อยในเรื่องความแข็งของปุ่มที่อาจจะมากไปนิด แต่ว่าก็ไม่ถึงกับมากจนน่าเกลียดอะไร ยังพอที่จะนั่งพิมพ์แบบพริ้วๆ เบาๆ ได้บ้าง แต่ว่าพอถึงเวลาจะเปลี่ยนภาษาเนี่ย อาจจะเหนื่อยนิดหน่อย เพราะว่าอาจจะต้องกดหลายทีนิดนึง อีกอย่างนึงนะ มันค่อนข้างที่จะแบนราบกับโต๊ะจริงๆ ดังนั้นมืออาจจะกดกับพื้นโต๊ะมากขึ้นนะ ถ้าใครชอบกดมือระวังจะไม่ค่อยดี อีกอย่างถ้าใครชอบเอาอะไรมารองที่ palm อาจจะลำบากนิดนะ เพราะว่ามันจะราบกว่า keyboard ตัวอื่นๆ อยู่เอาเรื่อง อาจจะต้องวางมันบนอะไรซักอย่างที่บางๆ พอ (วางบนกล่องของมันก็อาจจะสูงไปนิด) แต่ว่าถ้าใครพิมพ์แบบมือลอยๆ นิดหน่อยคงจะไม่มีปัญหาอะไร

Computer Stupidities

มี website อยู่ที่หนึ่งนะ ที่ผมเคยชอบเข้าไปดูเมื่อก่อน (ตอนนี้ก็ once in a while) เข้าไปหาเรื่องสนุกๆ อ่านเล่น

ไม่มีอะไรมากกว่าการเป็น web รวมเรื่องราวต่างๆ ที่มีคน submit กันเข้ามา ส่วนมากจะเป็นเรื่องตลกๆ เวลาที่มีใครไปเจอคนทำอะไรเปิ่นๆ เพราะว่าความเข้าใจผิดแบบไม่น่าเชื่อ มีแบ่งเรื่องราวไว้เยอะแยะ เช่น

  • Piecing it together (เอาเรื่องโน้นเรื่องนี้มาจับแพะชนแกะกันมั่ว)
  • Operating System (ความเข้าใจผิด เรื่องขำขัน เกี่ยวกับ OS)
  • Programming (ใครเรียน CS/IT/CE ต้องอ่าน!)
  • Mincing Words (เอาคำมายำกัน)
  • Paranoia (ความกลัวจากความเชื่อผิดๆ จนเข้าขั้นวิตกจริต)
  • Stupid Tech Support (อันนี้ขำมาก)
  • Stupid Salesman (อันนี้ด้วย)
  • ……. เยอะแยะ เข้าไปอ่านเองนะครับ

เมื่อก่อนอ่านก็ขำนะ แต่ว่าทำไมเดี๋ยวนี้มันต้องหัวเราะแห้งๆ ก็ไม่รู้ ขำไม่ออกมากขึ้นหลายๆ อย่าง แต่ว่าก็ยังเข้าไปอ่านอยู่ดี มีความรู้สึกว่าดีกว่าอ่านกระทู้ที่ web หลายๆ web หน่อยนึงมั้ง

อืมมม แต่ว่าจริงๆ คงต้องมองย้อนกลับไปที่ต้นตอของปัญหามากขึ้น ด้วยความรู้สึกส่วนตัวอย่างหนึ่งที่มีมานานแล้วนะ คือ computer แล้วก็ information technology มันกลายเป็น mainstream เร็วเกินไป เร็วเกินกว่าที่คนจะมี literacy กับมันมากพอ คือทุกวันนี้ computer กลายเป็นอุปกรณ์มาตรฐานอย่างหนึ่งในการใช้ชีวิต การทำงาน การเรียน การติดต่อ ฯลฯ แต่ว่ามันต่างจาก TV, วิทยุ, โทรศัพท์, projector, ฯลฯ มากมายมหาศาล เรียกว่ามันคนละ order of magnitude เลยก็ว่าได้

พูดง่ายๆ ว่าเราสามารถใช้ TV ได้โดยไม่ต้องคิดว่ามันจะตีกับวิทยุหรือเปล่า แต่ว่าถ้าเราเปิดโปรแกรมดูหนังพร้อมกันกับโปรแกรมฟังเพลง มันอาจจะตีกันทำให้ crash กันได้ไม่ยากเย็นเลย หรือว่าเราสามารถที่จะใช้เครื่องคิดเลข กับเครื่อง word processor ได้โดยไม่ต้องคิดว่าพวกมันแย่งทรัพยากรกันยังไง (นอกจากค่าไฟค่าแบตเตอรี่จากกระเป๋าเรา) หรือว่าเรื่องไวรัสที่ติดกับโปรแกรมตัวนึงอาจจะทำลายไฟล์ได้ทั้งเครื่อง ฯลฯ

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

ช่วยกันได้ก็ช่วยๆ กันไปนะครับ เรื่อง computer/information literacy กับคนใกล้ตัวเนี่ย สำคัญเชียวแหละ อ่าน web นั้น อ่านกระทู้ทั่วไปตาม webboard หรือว่าเจอคนใกล้ๆ ตัว ก็ช่วยกันสร้างความเข้าใจที่ดีขึ้นกับ computer เถอะครับ มันใกล้ตัวกว่าที่เราคิด

Pointless Programming : Java 7

จริงๆ เค้าเรียกว่า Point-Free Programming (HaskellWiki) หรือว่า Tacit Programming (Wikipedia) นะ :-P ผมเขียนชื่อล้อเลียนไปงั้นเอง เรื่องนิยามหรือว่าตัวอย่างลองไปดูใน Wiki link ด้านบนเอานะครับ แต่ว่าผลของมันเนี่ย มันมักจะทำให้โปรแกรมสั้นขึ้น ในขณะที่มันก็ยังอ่านง่ายขึ้นด้วยเออสิ แล้วมันเกี่ยวอะไรกับ Java 7 ล่ะเนี่ย? เพราะว่าใน spec ของ Java 7 มันจะมีเรื่อง Closures เข้ามาเกี่ยวข้องด้วย แล้วก็จะมีเรื่องอื่นๆ ที่เอา idea จาก Functional programming มายัดลงไปในภาษาที่มันค่อนข้างจะ bloat และ verbose ที่สุดภาษานึง ทำให้มันสั้นลง กระชับขึ้น น่าอ่านน่าเขียนขึ้นแบบไม่น่าเชื่อ ลองดูตาม Link ต่อไปนี้นะครับ

ส่วนนิยามของ Closures ในแบบ Computer Science และ Software Development จริงๆ ก็ตามนี้ครับ Closure (computer science) – Wikipediaขอปิดท้าย post นี้ด้วยเรื่องของ Point-Free Programming ใน Java 7 ครับ สวยดีเหมือนกัน ดูรายละเอียดเต็มๆ ที่นี่: Ricky’s technical blog: Point-free Programming in Java 7 – Beyond Closuresผมว่าโลกมันกำลังหมุนไปในทิศทางที่มันถูกต้องนะ ที่ในที่สุดก็เริ่มจะมีการเอา idea ของ Functional programming มาใช้ในภาษาโปรแกรมที่เป็น mainstream เสียที เพราะว่า programming model ของ Functional มัน elegance กว่า imperative เยอะมาก …สุดท้ายมันทำให้ผมนึกถึง paper ที่เป็น hall-mark สุดยอดอันนึงของ John Backus (ผมเคยเขียนถึงเรื่องเค้าทีนึงที่ Thai Mac Dev นะ) คือCan programming be liberated from the von Neumann style?: a functional style and its algebra of programs (Link ไปหา paper ที่ Stanford University)เมื่อ Java 7 ออกมาจริงๆ ผมคงจะต้องกลับมามองมันแบบ serious อีกที แต่ว่าเราก็ไม่รู้เหมือนกัน ว่าวันนั้นโลกมันจะหมุนไปถึงไหน และจะมี feature อะไรอีกบ้าง ใน niche programming languages ที่ทำให้ผมอ้าปากค้าง ตกหลุมรัก และมอง Java 7 “ในวันนั้น” ว่ามันไม่ elegance ….. อย่างว่าแหละครับ Programmers Don’t Like to Code ;-)

เปลี่ยนภาษาเขียนโปรแกรม

อะไรยากกว่ากัน ระหว่าง

  1. สอนคนที่เขียนโปรแกรมเป็นแล้ว ให้เปลี่ยนภาษา
  2. สอนคนที่เขียนโปรแกรมไม่เป็น ให้เขียนโปรแกรมเป็น

หลายคนจะตอบข้อ 2 โดยไม่ลังเลเท่าไหร่ เพราะว่าถ้าเป็นภาษาหนึ่งๆ แล้ว เรียนอีกภาษาหนึ่งคงไม่ยากเท่าไหร่ สาเหตุหนึ่งก็คงเพราะว่าภาษาส่วนมากมีรากที่คล้ายๆ กัน เช่น Pascal, C, C++, Java, C# ถ้าเป็นภาษาใดภาษาหนึ่งแล้ว การเรียนรู้ syntax ของอีกภาษาหนึ่งก็ไม่ใช่เรื่องยากเย็นเท่าไหร่แต่ว่าสอนคนที่เขียนโปรแกรมไม่เป็นให้เขียนโปรแกรมเป็นนี่สิ งานช้าง เพราะว่าอาจจะต้องสอนแนวคิด หลักการคิดแบบคอมพิวเตอร์ หลักการคิดแบบ von Neumann machine หลักการคิดแบบที่เราต้องใช้เวลาเขียนโปรแกรม ฯลฯ ซึ่งอาจจะยากหน่อย ไหนเลยจะต้องมานั่งเรียนรู้ syntax อีกแต่ว่าถ้าเปลี่ยนคำถามหน่อยนึงล่ะ เปลี่ยนข้อที่ 1 ให้เป็น

  1. สอนคนที่เขียนโปรแกรมเป็นแล้ว ให้เปลี่ยน paradigm ในการเขียนโปรแกรม

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

  • นึกถึงโปรแกรมที่ประกาศตัวแปรไม่ต้องประกาศ type แต่ว่าก็ยังเป็น strong typing ออกไหม
  • นึกถึงโปรแกรมที่ไม่ต้องประกาศ main function ออกไหม
  • นึกถึงภาษาโปรแกรมที่ไม่มี loop ออกไหม
  • นึกถึงภาษาโปรแกรมที่ฉลาดพอที่จะทำ list comprehension (เช่นบอกว่า จะเอา x จาก list L โดยที่ x มากกว่า 3 แล้วมันเข้าใจว่าจะต้องทำอะไรโดยที่เราไม่ต้องเขียน low-level instruction)

นอกจากเรื่องพวกนี้จะยาก เพราะว่าพอสมองเราถูก over-train ให้ชินกับอะไรบางอย่างมากๆ แล้ว มันจะเรียนรู้สิ่งใหม่ยากขึ้น มีอะไรที่ต้อง unlearn มากขึ้น อย่าว่าแต่ imperative vs. functional programming เลย แค่ procedural vs. object-oriented ก็แย่แล้ว การที่เราจะ unlearn เรื่องหนึ่งๆ แล้วปรับไปสู่เรื่องใหม่ เป็นเรื่องที่ค่อนข้างยากเอาการทีเดียวไม่ใช่แค่นั้น แต่ให้เขียน style เดิม แต่ว่าเปลี่ยนภาษาเขียนโปรแกรม ก็ยากแล้ว

  1. สอนคนที่เขียนโปรแกรมเป็นแล้ว ให้เปลี่ยนภาษา โดยต้องใช้เป็นภาษาหลักในกรณีทั่วไปแทนภาษาเดิม

ผมเห็นน้องหลายคนเขียน Ruby กันมาพักนึง (เพราะว่างานบางงานที่อาจจะต้องใช้ Rails) แต่ว่าพอลองตั้งโจทย์ที่มองไม่เห็นชัดว่าจะใช้ความสามารถของภาษาตรงไหน (ให้สร้าง permutation ของ list) น้องหลายคนก็ fall-back กลับไปเขียน C เหมือนเดิมไม่แปลกอะไร เพราะว่าจริงๆ แล้วผมเอง บางทีขนาดโปรแกรมง่ายๆ ก็ยังดื้อจะเขียน C++ กับ STL อยู่เลย ทั้งๆ ที่รู้อยู่แก่ใจว่า Ruby, Python, Haskell มันก็ทำได้ และจะง่ายกว่าด้วย แต่ว่าทำไมนะ ทำไมผมถึงยังจะดื้อที่จะ fall-back ไปเขียน C++ อยู่ดี?ความเคยชินบางอย่างมันแก้กันยาก อาจจะเป็นเพราะว่าผมใช้เวลาอยู่กับ C++ มานานกว่าภาษาอื่นๆ และทำงานจริงในภาษาตระกูล C มานานกว่าภาษาอื่นๆ หลายเท่าตัวก็ได้ (C, C++, Objective-C)เปล่าหรอกครับ ผมไม่ได้ถามเพื่อหาคำตอบใดๆ เพราะว่านี่คือธรรมชาติของมนุษย์ อะไรก็ตามที่เราทำจนเป็นนิสัย จนเป็น second nature แล้วมันอาจจะเปลี่ยนแปลงยากมาก หลายเรื่องเราเปลียนไม่ได้ เพราะว่าเรามีความรู้สึกว่า “เคยทำ” อะไรที่มันคล้ายๆ กันมาก่อนในลักษณะนั้นอยู่แล้ว (เช่นเวลาผมจะเขียนโปรแกรมง่ายๆ บางทีผมใช้ C++ โดยไม่มีเหตุผล ทั้งๆ ที่เขียน Ruby ง่ายกว่าเยอะ ส่วนหนึ่งเพราะว่าผม “เคยทำ” สิ่งนั้นมาแล้วใน C++ มั้ง)ผมเลยมีข้อสังเกตและข้อเสนอแนะให้น้องๆ ที่อยากจะเขียนโปรแกรมภาษาใหม่นะครับ ดังนี้

  1. เขียน code ภาษานั้นให้เยอะที่สุดและเร็วที่สุด โดยอย่าเอาแต่ลอก code จากหนังสือหรือว่า tutorial เพราะว่าคุณจะไม่ได้ใช้งานจริง และไม่ได้ force ให้ตัวเองคิดในลักษณะของภาษาใหม่ๆ เท่าไหร่
  2. เรียน standard library ของภาษานั้นๆ ให้มากที่สุดในเวลาที่น้อยที่สุด เพื่อให้รู้ว่ามันพอจะทำอะไรให้เราได้บ้าง โดยไม่ต้องลงอะไรเพิ่มเติม แล้วก็ลองดูว่ามันเอามาทำอะไรให้ชีวิตเราง่ายขึ้นได้บ้าง
  3. หักดิบ อย่าเล่นภาษาเดิมเท่าที่จะทำได้ ถ้าจำเป็นจริงๆ ก็ลองลบ compiler ภาษาเดิมทิ้งไปเลย
  4. อย่าเอาแต่เรียน syntax กับ library นะ เพราะว่าสิ่งที่สำคัญที่สุดสิ่งหนึ่งที่แทบทุกคนลืม ก็คือ การเรียน idiom ของภาษานั้นๆ ยิ่งหลายภาษา โดยเฉพาะพวกภาษาใหม่ๆ เป็นพวก expressionism ซะด้วยสิ แบบนี้ idiom ยิ่งสำคัญมากเข้าไปอีก
  5. ยิ่งถ้าเป็นการเรียนภาษาคนละ paradigm กับที่เคยเขียนนะ ยิ่งไปกันใหญ่ เพราะว่าลักษณะการเขียน วิธีคิด idioms ต่างๆ มันจะต่างกันมาก มากๆ ถึงมากที่สุด
  6. ยากนะ แต่ว่าหลายครั้งต้องคิดนอกกรอบเดิม ถ้าคิดตามกรอบเดิมล่ะก็ คุณก็จะไม่ได้เขียนภาษาใหม่หรอก แต่ว่าจะเขียนภาษาเดิมน่ะแหละ แต่ว่าอยู่ใน syntax ใหม่เท่านั้นเอง
  7. ทำงานจริง เพราะว่าทำงานจริงเท่านั้นที่จะบังคับให้เราต้องอยู่กับภาษาโปรแกรมภาษาใหม่และกระบวนการคิดของมัน ยิ่งทำงานจริงแบบมี deadline ด้วยแล้วล่ะก็ ยิ่งดี เพราะว่าเป็นการบังคับให้เรายิ่งต้องคิดและ figure out การทำงานต่างๆ และ idioms ของมันให้ได้เยอะที่สุด เพื่อประโยชน์สูงสุด และให้งานเสร็จเร็วที่สุด
  8. หา library เพื่อช่วยงานโน้นงานนี้เยอะๆ มีของเล่นเยอะๆ แล้วลองเล่นกับมัน เดี๋ยวก็ชินกับมันไปเองแหละ
  9. ดูภาษาอื่นๆ ใน paradigm เดียวกันบ้าง เพื่อหาข้อเปรียบเทียบหน่อยๆ ก็ดี
  10. ระลึกไว้ ว่าไม่ใช่ทุกภาษาเหมือนกัน สิ่งที่ผิดหลักการในภาษาหนึ่ง อาจจะเป็นสิ่งที่ถูกหลักการและควรทำในอีกภาษาหนึ่งก็เป็นได้ ดังนั้นอย่ายึดติดกับหลักการและข้อบังคับข้อกำหนดต่างๆ ของภาษาหนึ่งๆ มากไปนัก
  11. พยายามมองหาโอกาสใช้มันให้เยอะที่สุดเท่าที่จะทำได้ และอย่าเลี่ยงโอกาสในการใช้มันซะล่ะ

จริงๆ เรื่องนี้ยังเขียนได้อีกยาวมาก แต่ว่าวันนี้พอแค่นี้ก่อน ชักเหนื่อย แต่ขอปิดท้ายด้วย quote ดังจากคนดัง

Anyone could learn Lisp in one day, except that if they already knew Fortran, it would take three days.Marvin Minsky

Blog คือ?

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

คำว่า blog มันมีที่มาจากคำว่า web log หรือว่า log บน web ทีนี้ไอ้คำว่า log เนี่ย มันเหมือนกับพวก data logger คือบันทึกข้อมูล บันทึกข้อความ อะไรก็แล้วแต่ที่เราอยากจะบันทึก คล้ายๆ diary น่ะแหละ แต่ว่าแทนที่จะเขียนมันลงกระดาษ หรือว่าลงโปรแกรม word แล้วเก็บเป็นไฟล์ไว้ ก็เขียนมันลง web ซะ

ทีนี้เนื่องจากว่ามันเป็น personal log เนี่ย เราก็เลยเขียนอะไรก็ได้ที่มัน matter กับเรา อาจจะเป็นเรื่องราวในชีวิตประจำวันที่เราอยากจะให้เพื่อนอ่าน หรือว่าแชร์สารทุกข์สุกดิบ หรือว่าเป็นที่เขียนบทความสั้น เขียนความคิดความอ่าน ประสบการณ์ต่างๆ

ซึ่งไปๆ มาๆ มันก็เริ่มดึงดูดคนที่สนใจ ที่มีประสบการณ์เหมือนกัน มีความคิดคล้ายกัน สนใจเรื่องเดียวกัน ให้เข้ามาอ่านได้ ให้เข้ามาทำความรู้จักกันได้ เริ่มเชื่อมโยงกันไปเชื่อมโยงกันมา ก็เริ่มกลายไปเป็น social networking (เครืิอข่ายของสังคม) แบบง่ายๆ

เรื่องน่าสนุกอยู่ตรงนี้ ถ้าเราเอาคำว่า web log มาเขียนติดกัน จะได้คำว่า weblog แล้วตัดคำเสียใหม่ จะได้คำว่า we blog ซึ่ง we ในที่นี้แปลว่า “พวกเรา” และ blog ก็เหมือนจะกลายเป็นคำกริยา (เหมือนกับ we write, we walk, we talk, we do) โดยที่คำนี้จะมีความหมายสื่อถึงการกระทำที่ผมเพิ่งจะเขียนถึงไปเมื่อย่อหน้าสองย่อหน้าก่อนเนี่ยแหละ

ดังนั้น เวลาคนถามกันว่า “มี blog หรือเปล่า” ก็จะหมายถึงว่า เรามีพื้นที่สำหรับเขียนความคิด เขียนประสบการณ์ แบ่งปันความรู้ ความเข้าใจ ทั้งถูกและผิด อะไรก็ตามที่บ่งบอกถึงความเป็นตัวเราเอง อยู่ในโลก cyberspace หรือเปล่า และนอกจากนี้ เราเป็นส่วนหนึ่งของ social network ขนาดใหญ่ ที่ไม่มีขอบเขตพรมแดน ไม่มีแบ่งแยกประเทศ ไม่มีหมวก ไม่มีหน้ากาก หรือเปล่า

และเวลาที่เราบอกใครว่า “ผมมี blog” ก็จะหมายถึงว่า เรามีสิ่งเหล่านั้น นั่นเอง

ปล.จริงๆ เรื่องของ blog มีมากกว่านี้เยอะ ลองดู http://en.wikipedia.org/wiki/Blog นะครับ ส่วนเรื่องที่ตัดคำใหม่ ให้ได้คำว่า we blog น่ะ อันนี้ถึงผมจะคิดเอง มั่วเอาเอง แต่ว่าอาจจะมีอีกหลายคนคิดเหมือนกัน และชอบเหมือนกันก็ได้ .. โดยส่วนตัวผมคิดว่ามันเป็น definition ของพฤติกรรมสังคมในยุค social networking content ที่ดีนะ…

Adium กับ network ใน ม. ศิลปากร

เวลาเล่น MSN เนี่ย ผมไม่ได้ใช้ MSN Messenger for Mac หรอกนะ แต่ว่าผมใช้ Adium ที่เป็น multi-protocol messenger ที่ Open source ด้วย หน้าตาสะสวย feature ดี (แต่ว่าผมก็ใช้แค่ MSN ล่ะนะ ไม่ได้ใช้ protocol อื่นเลย)

แต่ว่าเร็วๆ นี้มันมีปัญหาอะไรก็ไม่รู้ มัน online จาก netไม่work ในมหาวิทยาลัยไม่ได้เลยแฮะ … แต่ว่า MSN Messenger ดันใช้ได้ซะงั้น (แต่ว่า 6.0.2 มีปัญหากับ Safari 3 นะ ถ้าใช้ Safari 3 ก็ upgrade เป็น 6.0.3 ซะ) ไม่รู้สาเหตุว่าทำไม ไป online จากที่อื่นได้หมดเลยนะ นอกจากใน ม. เอง จะบอกว่าเค้า block MSN ก็ไม่น่าใช่ เพราะว่าถ้างั้น MSN ก็ต้องใช้ไม่ได้ด้วยสิ

ก็เลยถึงบางอ้อเอาก็วันนี้แหละ … ว่าต้องใส่ DNS ใน Network setting ใน System preferences ด้วย (พบโดยบังเอิญว่าเราไม่ได้ set มัน เอาออกแต่เมื่อไหร่หว่า เมื่อก่อนใส่ตลอด)

สำหรับคนที่ใช้ Mac ใน ม. ศิลปากร (โดยเฉพาะที่ทับแก้ว) แล้วต้องการใช้ Adium แต่ว่า online ไม่ได้ ลองตั้งค่า DNS ดูนะครับ เอาเป็น 202.28.72.66 ก็ได้ครับ อันนี้ DNS ของภาควิชาคอมพิวเตอร์ครับ (แต่ว่า MSN Messenger มันใช้ได้โดยไม่ต้อง set DNS นะ)

[update 1]: ผู้ช่วยสองคน kiterminal confirmed ว่าใช้งานได้จริง แต่ว่า neokain บอกว่าก็ยังใช้ไม่ได้อยู่ดี

[update 2]: รู้สึกจะดีใจเร็วไปแฮะ … หลังจาก net หลุดไป กลับเข้ามาใหม่ ดัน online ไม่ได้ซะงั้น T_T

10 วิธีการฆ่าเมีย

เจอมาจาก กระทู้ชื่อเดียวกันใน thaimacclub.net คนที่ post บอกว่าได้จาก forward mail อีกที อาจจะเก่านะ แต่ว่าเจ๋งว่ะ

  1. มันอยากกินอะไรซื้อให้มันกิน จนมันคอเรสโตรอลสูง ไขมันอุดตันในเส้นเลือด เดี๋ยวไม่เกิน 50 ปีมันก็ตาย
  2. มันอยากได้เครื่องเพชรก็ซื้อให้มัน พอแสงเพชรมันสะท้อนเข้าตามันมากๆเข้า เดี๋ยวตามันก็จะบอด พอมันตาบอดแล้วเราก็เอามันไปทิ้งที่ไหนก็ได้ มันหาทางกลับบ้านไม่ถูกแล้ว
  3. มันชอบรถก็ซื้อให้มัน ยิ่งแพงๆยิ่งดี เครื่องมันแรงดี มันจะได้ขับเร็วๆ ความเสี่ยงสูง
  4. มันอยากไปเที่ยวไหนก็พามันไป ต้องมีซักที่แหล่ะที่มันพลาดเดินล้มหัวฟาดพื้นตายได้
  5. งานบ้านอย่าไปให้มันทำ เราต้องแย่งมันทำให้หมด ไม่เปิดโอกาสให้มันได้ออกกำลังกาย เดี๋ยวมันก็ไม่แข็งแรง แล้วมันก็ตายเอง
  6. ต้องพาเมียไปหาหมอบ่อยๆ ดูดิคนไม่ค่อยไปหาหมอไม่ค่อยเป็นไรหรอก คนที่ไปหาหมอบ่อย เดี๋ยวๆก็ตายแล้ว
  7. เงินเดือนออกมาเท่าไหร่ให้มันไปให้หมด ใครๆก็รู้ว่าเงินน่ะเป็นที่สะสมเชื้อโรคสารพัด เราแกล้งเอาเชื้อโรคให้มันเก็บไว้เดี๋ยวมันก็เป็นโรคตาย เราเองไม่ต้องเก็บเชื้อโรคไว้ สุขภาพแข็งแรง..เย้
  8. ปลูกบ้านหลังใหญ่ๆให้มันอยู่ กว้างๆยิ่งดี เวลาจะเดินจากห้องนั้นไปห้องนี้ทีมันจะได้เหนื่อย เผลอๆอาจหอบตายระหว่างทางได้
  9. เช้า-เย็นกราบมันทุกวัน มันจะได้อายุสั้น
  10. รักเมียให้มากๆ ไม่เคยได้ยินเหรอ ที่ใดมีรักที่นั่นมีทุกข์ พอมันทุกข์มากๆมันก็ตรอมใจตายเอง

ปฏิบัติตามกันตามสะดวกนะครับ พวกไม่รักภรรยาทั้งหลาย จะได้ตายไวๆ ;-P

ของเล่นใหม่: Mac mini (review)

อยากได้เครื่องซักเครื่องมาเป็น internal application server ใน lab มานานแล้ว เพราะว่าให้พวกผู้ช่วยพัฒนาโปรแกรมสำหรับใช้งานภายในขึ้นมาหลายตัว แต่ว่ามันกระจายๆ อยู่ตามเครื่องคนที่พัฒนา (ทั้งหมดเป็น laptop) ทำให้มีปัญหาในการเรียกใช้งานเยอะมาก เพราะว่าไหนเลยจะต้องบอกให้น้องเค้า start application server (ถ้าเป็น rails ก็พวก embedded server ในตัว application ทั้งหลาย) แล้วก็ถาม IP กันวุ่นวาย แล้วพวกข้อมูลก็เอามาใช้ด้วยกันลำบากอีกตะหาก เพราะว่า db มันเก็บคนละเครื่องคนละที่ ถ้าจะให้เปิด REST ให้ใช้ มันก็ขี่ช้างจับตั๊กแตนไปหน่อย

ว่าแล้ววันหนึ่ง เราก็เห็นว่า เออ มันไม่ค่อยจะเข้าท่าเท่าไหร่ถ้าจะทำแบบนี้ต่อไป ซื้อ dedicated internal server มาเลยตัวนึงดีกว่า ว่าแล้วเราก็บึ่งไปในกรุงเทพ หิ้ว Mac mini รุ่น 1.83 GHz กลับมาหนึ่งตัว

  • สิ่งแรกที่ทำก็คือ ลงเครื่องใหม่ จริงๆ อยากจะลง Mac OS X Server เพราะว่าจะได้ลองหัดเล่นจริงๆ จังๆ ซะที แต่ว่าก็ไม่อยากจะทำผิดลิขสิทธิ์อ่ะนะ อีกอย่างแค่ใช้เป็น internal application server นี่แค่ใช้ client edition ก็เหลือเฟือแล้ว ว่าแล้วก็ลง OS X 10.4.10 ไป
  • ตั้งชื่อเครื่องก่อน ..​ เอาชื่ออะไรดี ตอนนี้เครื่องของผม (PB17″ ที่ผู้ช่วยคนหนึ่งใช้ กับ MBP15″ ของผม) ชื่อ chaos กับ entropy ตามลำดับ ..​ อืมมม ตอนแรกคิดว่าจะตั้งชื่อ turing แต่ว่าไปๆ มาๆ เนื่องจากตัวมันเล็ก ก็เลยตั้งชื่อว่า quantum
  • แล้วลงก็ iWork กับ iLife …​ ซึ่งจริงๆ แล้วก็คงไม่ได้ใช้เครื่องนี้หรอก แต่ว่าก็เผื่อไว้ก่อนไม่เสียหลาย ถ้ามันไม่ได้ใช้จริงๆ แล้ว HDD มันจะเต็ม ก็ค่อยมาลบทิ้งเอาทีหลังได้
  • ลง Xcode จะได้ compile โปรแกรมที่จะต้องใช้งานได้
  • อืมมม อยากได้พวก lib ต่างๆ ทำไงดีหว่า จะ compile ลงใหม่ก็ขี้เกียจ ก็เลย copy /sw (ที่ๆ Fink มันลงโปรแกรม; ผมไม่ได้ใช้ MacPorts นะ เพราะว่ามันมีปัญหาอะไรไม่รู้กับ netไม่work ที่มหาวิทยาลัย)
  • จากนั้นก็ เลือก copy /usr/local ไปลงด้วย ตรงนี้ก็ประหยัดเวลาไปได้เยอะเหมือนกัน แทนที่จะต้องไป compile ใหม่หมด อีกอย่าง ปกติเวลา compile พวกนี้ผมไม่ได้ fine-tune พวก options ให้มัน optimized มากไปกับเครื่องใดเครื่องหนึ่ง (เครื่องที่ผมใช้น่ะแหละ) อยู่แล้ว ก็เลยใช้ได้ อ่อ แล้วก็เวลาที่ลงโปรแกรม ถ้ามันใหญ่หรือว่าเป็นโปรแกรม+lib (ไม่ใช่ lib อย่างเดียว) เช่น ImageMagick หรือว่า Graphviz เนี่ย ผมจะ configure ให้มี prefix ที่ /usr/local/[program_name] อยู่แล้ว ก็เลยเลือกง่ายหน่อย
  • เนื่องจากว่า application ส่วนมากที่จะไปลง จะเป็น Rails application ก็เลยทดสอบ ruby กับ rails ก่อน ปรากฏว่าใช้ได้ไม่มีปัญหาอะไร โดยที่ไม่ต้องลงอะไรเพิ่มเติม (ก็เล่น /usr/local มาแล้วนี่หว่า)
  • เนื่องจาก netไม่work ที่ ม. มันมักจะมีปัญหาอะไรก็ไม่รู้อยู่บ่อยๆ ก็เลยให้ตัว Mac mini นี้เปิด network ของตัวเอง เวลาที่คนจะใช้ application ตัวนี้ก็ connect เข้ามาใน network นี้เอา
  • แต่ว่าปัญหาก็คือ application บางตัวดันต้องใช้ web services ของ amazon ก็เลยไม่มีทางเลือก ต้องกลับเชื่อมกับ network ที่มันออกข้างนอกได้ (ขี้เกียจ setup)
  • ตอนนี้ก็เริ่ม deploy application หลายตัวลงไปใช้แล้ว ทำงานได้ดีนะ พวกบรรดาผู้ช่วยที่ทำงานก็ชอบกัน ได้มี dedicated server กับ internal application ตัวโน้นตัวนี้ที่ทำเล่นกันใน lab เสียที จะได้เป็นต้นแบบ/ตัวทดลองก่อนที่จะไป deploy ลง Xserve ที่เพิ่งจะได้มาใช้งานจริงซะที
  • นอกนั้นไม่ได้ทำอะไรมาก
  • อ่อ ลืมบอกไป ซื้อ keyboard ถูกๆ กับ mouse ถูกๆ มาอย่างละตัวเพื่อมาใช้งานกับตัวนี้ เพราะว่าคงไม่ได้ใช้งานมันตรงๆ มากมาย ส่วนมากก็ remote login เข้ามามากกว่า ส่วนจอ ก็แบ่งๆ จอ external ของผมไปใช้งานเป็นครั้งคราวถ้าจำเป็น (ผมมี Acer 22 นิ้วอยู่ตัวนึงน่ะ ต่อเป็น 2nd monitor ไว้)

สรุปว่า มันเป็น a cute little machine นะ ชอบๆ แต่ว่ามันก็ powerful enough สำหรับงานที่ผมเอามาใช้มันน่ะแหละ (ยิ่งคิดถึงว่า มีบางที่ บางคน บางองค์กร ซื้อ Mac Pro รุ่นใหม่มาเพื่อทำ data entry เท่านั้น ที่ก็ไม่ได้มีมากมายเท่าไหร่ …​ นี่ยิ่งรู้สึกว่า เราคงใช้งาน Mac mini ตัวนี้คุ้มกว่าล่ะนะ) จริงๆ น่าจะซื้อมานานแล้วจริงๆ (ก็ว่าจะ ว่าจะ ว่าจะอยู่หลายครั้งแล้ว บอกเด็กๆ ที่ทำงานไปหลายครั้งแล้ว แต่ว่าเราก็ไม่ได้ซื้อเสียที) น่ารักดีเวลาวางมันไปบนโต๊ะ ใครจะไปคิดว่ามันเป็น server ล่ะ

ไม่แปะรูปนะ ไว้แปะร่วมกับ entry เรื่องของเล่นชิ้นต่อไปเลยละกัน (ยังไม่บอกว่ามันคืออะไร) เพราะว่าถ่ายรูปคู่กันไว้อยู่

ชีวิตคนทำงาน

เห็นรูปนี้จาก MSN น้องโตโต้ (protocoltoto ใน blog นี้) มานานล่ะ วันนี้ไม่รู้นึกยังไงก็เลยเอามา share กันบ้าง ไม่รู้ว่า original creator เป็นใคร แต่ว่า creative มากมาย ชอบ


Syntax highlighting

คิดๆ อยากจะเขียน code snippet (ที่ไม่เกี่ยวกับ mac development) ลงในนี้บ้างเหมือนกัน แต่ว่ามันไม่มี highlighting เจ๋งๆ เลย ไอ้ตัวที่ใช้อยู่นานนมกาเลอย่าง code2html ก็ดันไม่ highlight Haskell อีก จะเขียนเพิ่มเข้าไปเองก็ขี้เกียจ (ทั้งๆ ที่จริงๆ ก็ทำได้อ่ะนะ แต่ว่า code มันเขียนแบบ Perl-ish มากกกกก แถมไม่ factored ไม่แยก module เท่าไหร่) … อืมมม มันต้องมีคนคิดเหมือนเราสิ ว่าแล้วก็เริ่มหา

สักพักก็ไปเจอหน้า Plugins/Syntax Highlighting ที่ WordPress เอง แต่ว่าเท่าที่อ่านๆ ดูไม่ค่อยจะมีตัวไหนเข้าท่าเลยแฮะ (มันไม่ highlight Haskell ซักกะตัว เท่าที่อ่านแบบผ่านๆ) นอกจาก Vim Color แต่ว่าไอ้ตัวนี้ก็ดันไป dependent กับ Text::VimColor ที่เป็น Perl module ต้องลงผ่าน CPAN อีก เออ ไม่เป็นไร ลงก็ได้ แต่ว่าก็ดัน build ไม่ผ่านซะงั้น (test ผ่านน้อยไปหน่อย) จะ force install ลงเลย ก็ดันไม่ work อีก เฮ้อ เบื่อจริง ก็เลยต้องหาต่อไป

และแล้วเราก็ไปเจอ GeSHi: Generic Syntax Highlighter ที่เขียนในภาษา PHP เราก็เลยเอามาเขียนทำเป็น command line application ง่ายๆ ที่อ่านไฟล์ตาม argument แล้วก็เดาภาษาจาก extension ของไฟล์ แล้วก็พ่น highlighted code ที่เป็น HTML ออกมาให้เรา code-paste ใส่ blog ได้ผลดังนี้ (Haskell)

import List
 
permute [] = [[]]
permute xs = [x:ys | x <- xs, ys <- permute (delete x xs)]
 

หรือว่าภาษา Ruby แบบนี้

class Array  
  def permute
    return [self] if size < 2
    perm = []
    each {|e| (self - [e]).permute.each {|p| perm << ([e] + p)}}
    perm
  end
end
 
[0,1,2,3].permute.each {|e| p e }

ก็ใช้ได้อ่ะนะ แต่ว่ามันอาจจะรก HTML code ไปหน่อยนึง

[update 1]: พอมี line number แล้วมันเละใน blog แฮะ เลยเอาออก ไว้จะแก้ CSS ทีหลัง ตอนนี้ขี้เกียจ (อีกล่ะ)

[update 2]: เพิ่งจะสังเกตจากหน้า web ว่า \\ ใน code haskell มันหายแฮะ เหลือแค่ตัวเดียว .. ไม่รู้เหมือนกันว่าทำไม code ฝั่งนี้ก็ยังอยู่นะ เลยไม่รู้จะว่าไงดี :-(

[update 3]: สุดท้ายก็เลยลงเอยด้วยการเขียน code ใหม่ไม่ให้มันมี \\ อืมมม อ่านเป็นภาษาคนกว่าเก่าแฮะ แต่ว่ามัน geek-ish น้อยลง :-P

[update 4]: อ๊ากกก GeSHi มันไม่มี Erlang highlighting! ว้า กำลังจะหัดเล่นอยู่เลย ว่าแต่ Erlang นี่ทำไมมันลูกเมียน้อยตอนนี้จังเลย emacs ก็ไม่มี (ผมใช้ Carbon Emacs distribution) TextMate ก็ไม่มี มีแต่ vim … สุดท้ายก็ตายรังสินะ แต่ว่า Emacs mode ของ Erlang ก็ไม่น่าหายากเท่าไหร่ [note — ณ ปัจจุบัน เจอแล้ว] ไม่เป็นไร มีเวลาและชินๆ กับ Erlang มากกว่านี้เมื่อไหร่ (พอจะชินกับ module/keywords) แล้วเดี๋ยวค่อยทำเพิ่มเข้าไปใน GeSHi เองก็ได้วะ