วันพฤหัสบดีที่ 10 กรกฎาคม พ.ศ. 2557

[เขียนเมื่อ] วันเกิด MS Internet Explorer [ครบ 15 ปี]

พบว่าตัวเองเคยเขียนเล่าเรื่องราวต่างๆ ของ Internet Explorer เมื่อปี 2010 (4 ปีที่แล้ว) ใน facebook ซึ่งเป็นเรื่องราวที่ผมมีส่วนเกี่ยวข้อง มุมมองส่วนตัว เลยเอา copy มาไว้ใน Blog เผื่อเพื่อนๆ อยากอ่าน (สนุกๆ)

  ผมจำได้ว่า เขียนบทความเป็นเรื่องเป็นราวลงแมกกาซีนรายเดือน ครั้งล่าสุดประมาณปี 2002 ได้ เป็นหนังสือ Windows Magazine ในเครือ AR เป็นบทความที่เกี่ยวกับ Mobile devices ที่ห่างหายและเลิกไปก้เพราะ บก. บริหารที่ติดต่อให้ผมไปเขียนบทความย้ายค่าย ไปอยู่ค่ายอื่น เลยไม่ได้ติดต่อกัน อีกอย่างตอนเขียนบทความนั้นเป็นช่วงที่กำลังพัฒนา ปลาดาวออฟฟิศ ด้วยเวลามีไม่มากนัก ทำให้เวลาจะส่งบทความ จะเขียนบนกระดาษสีน้ำตาลใหม้ (เผากันเลยทีเดียว) เช่นส่งวันจันทร์ คืนวันอาทิตย์เที่ยงคืนก็จะเริ่มเขียน แหะๆ  

พอดีวันนี้เปิดเวป blognone.com เจอข่าวครบรอบวันเกิด 15 ปี ของ Internet Explorer ทำให้รำลึกถึงวันวานกับ IE ที่ไม่ได้เป็นเพียงแค่ผู้ใช้ แต่ได้มีโอกาสเป็นส่วนหนึ่งของทีมพัฒนาด้วย โดยได้มีโอกาสพัฒนาในส่วนการแสดงผลภาษาไทย ทำให้อยากเล่าอยากเขียนอะไรเกี่ยวกับ IE ทิ้งไว้เผื่อใครจะสนใจ หรือเก็บเอาไว้อ่านส่วนตัวต่อไป ก็ไม่เลวนัก และคิดว่าคงไม่เขียนเป็นบทความแบบสมัยเขียนลง Windows Magazine เพราะนั่นน่ะ เขาให้หน้าละ 300 บาท เดือนนึงต้องลากสักสามสี่หน้า จะได้เงินกินขนมสักพันบาท  

ตอนที่ได้รับมอบหมายให้ทำ Internet Explorer เป็นภาษาไทยนั้น เป็นช่วงที่ Microsoft ของ Windows 95 Thai Edition SR1 (Service Released 1) ถ้าจำชื่อไม่ผิด รายละเอียด SR1 ทุกอย่างเหมือนของ US Edition แต่เพิ่มเติมในส่วนที่เกี่ยวข้องกับภาษาไทยเข้าไป เท่าที่จำได้มีดังต่อไปนี้   ปัญหา Fonts ทั้งหลายของไทย ตอน Windows 3.x ออกนั้น เรามี Fonts UPC ใช้ แต่พอ Windows 95 Thai Edition ออกมานั้น Fonts UPC ชุดเดิมยังมีอยู่ แต่ปัญหาก็คือ ชื่อดันเปลี่ยนจาก UPC ไปเป็น New ทำให้เอกสารไม่ compatible ก็แก้ปัญหา font substitute ให้กับ SR1  

ส่วนอื่นๆ ก็เป็นการ enable features ที่แนบมากับ SR1 ซึ่งก็คือ Internet Explorer 2.0 จริงๆ การมี IE ในตอนนั้น BillG (Bill Gates : aka billg@microsoft.com NOTE: ตอนอยู่ Microsoft Bill เคยส่งอีเมล์มาหา 2 ครั้ง (ตื่นเต้นๆ) "แต่" เป็นอีเมล์ที่ส่งมาขอบริจากเงินทำบุญ แล้วก็ส่งให้กับทุกคนใน Campus -_-' ) ไม่เคยเห็นด้วยเลย โดย Bill ให้เหตุผลว่า "Internet น่ะไม่มีทางประสบความสำเร็จหรอก แล้วที่มีนักวิเคราะห์ออกมาบอกว่า ในอนาคตโฆษณาตามหน้าแมกกาซีนจะมี Web Site URL ติดที่ทุกๆ หน้าโฆษณาน่ะเหลวไหล อนาคตมันต้อง MSN สิ" (ตอนนั้น Microsoft เปิดบริการ Online ของตัวเองชื่อ Microsoft Network เป็น Private Network โดยหมุน Modem เข้า service ของ Mcirosoft เอง เหมือนๆ กับ บริการ Compuserve ที่มี server อยู่ที่ Ohio) เราคงไม่ต้องบอกว่า Bill เป็นนักพยากรณ์ที่มีความสามารถขนาดไหน (เนอะ)  

พอ SR1 ออก ความจำเป็นของ IE ต่อการเป็นอยู่ของ Windows OS เริ่มมีมากขึ้น แน่นอนว่าตอนนั้น การแสดงผลภาษาไทยบน Web Browser ยังทำไม่ได้สมบูรณ์เลยนักตัวเดียว (ตอนนั้นใช้ Mozilla บน Windows 95)   มีนักพัฒนาไทยบางคนพยายามที่จะ hack ให้ Web Browser สามารถตัดคำภาษาไทย ด้วยวิธีการ Hook API ของ Windows Socket โดย API ใหม่ที่เขียนขึ้นจะเข้าไป replace API หลัก เท่าที่จำได้คือ function recv (TPC) แล้ว Monitor data stream ตัดคำแล้วแทรก <WBR> ระหว่างคำไทย ให้   ก็ว่ากันไป ในระดับหนึ่ง แต่ในเวลานั้น วิธีการนี้ถือว่า Advances ที่สุดแล้ว แต่ก็เป็นการ Work around ปัญหาเท่านั้น ให้ดียังไง ก็สู้การพัฒนาที่ตัวโปรแกรมตรงๆ ไม่ได้

IE 2.0 ไทย จำได้ว่า code name ของ IE 2.0 คือ "Ohare"  
Ohare เป็นชื่อสนามบินนานาชาติที่ Chicago และถ้ายังจำกันได้ Chicago เป็น code name ของ Windows 95 นอกจากนั้น ยังมี code name ของ project ย่อยๆ อีกหลาย projects ที่ใช้ code name ล้อกับ Chicago เช่น Rich Edit ซึ่งเป็น Windows extended native control ก็มี code name ว่า Caponeซึ่งเป็นชื่อของเจ้าพ่อ ขาใหญ่ Al Capone แห่ง Chicago นั่นเอง

   ตัว source code จำไม่ได้ ก็กว่าสิบปีแล้วที่ทำ ตอนนั้นทำกับ นนท์ (Weerapan Wilairat) ตอนนี้นนท์อยู่ทีม Windows Mobile น่าจะเป็นคนทำ UI Phone 7 กับทำ Kin (มั๊ง... ไม่ยอมบอกเล๊ย)ส่วนตัว IE มีอะไรบ้าง เดี๋ยวเล่าให้ฟัง เอาที่จำได้นะครับ พอดีเหมือสามสี่ปีที่แล้วเก็บบ้าน เจอ source code เก่าๆ (Hard copy print out) เก็บๆ ไว้บ้าง แต่ใช้อะไรไม่ได้แล้ว เพราะเป็นแค่บางส่วน เท่านั้น (น่าจะ 1 ใน 100 ของทั้งหมด)

ส่วน comment บนหัว source code นั้นส่วนมากจะ comment ตามนี้

/*Enhanced NCSA Mosaic from Spyglass
   "Guitar"

   Copyright 1994 Spyglass, Inc.All Rights Reserved

   Author(s):
   ชื่อนักพัฒนาที่รับผิดชอบ source file นั้นๆ โดยมี address (at)spyglass . com กันทุกคน
*/

   ใช่แล้ว Microsoft ซื้อ source code มาจกา Spyglass ไม่แน่ใจว่า Take Over Spyglass มาเลยรึเปล่า ช่วงนั้น MS นิยม Take Over มากเพราะมันสามารถพัมนาผลิตภัณฑ์แบบก้าวกระโดดได้ เช่น FrontPage Microsoft ก็ซื้อมา รู้สึกจะซื้อมาทั้งบริษัท แต่ปัญหาของ FontPage ช่วงแรกๆ คือ เวลา Edit HTML file แล้วชอบเพิ่มสิ่งที่พึงปรารถนาเช่น Tag แปลกๆ และที่สำคัญที่สุดคือเมื่อ save แล้ว HTML pattern เก่าที่ถูกเขียนไว้จะถูก FrontPage แก้มั่วไปหมด คนทำเวปจะหงุดหงิดกับ FrontPage มาก ถ้า HTML ไฟล์นั้นถูกพัฒนาด้วยมือมาก่อน แล้วนำมาแก้ด้วย FontPage  

   ช่วงนั้น HTML Editor ที่เป็นแบบ Visual ที่ได้รับความนิยมที่สุดคือ DreamWeaver ของ MacroMedia (ตอนนั้น ตอนนี้กลายเป็น Adobe ไปแล้ว) ด้วยเหตุผลง่ายๆ คือทำสิ่งตรงกันข้ามกับ FrontPage ที่กล่าวไว้ข้างต้น นั่นเอง   

   ตอนทำ IE 2.0 Thai Edition ใช้เวลาในการพัฒนาทั้งสิ้น 1 เดือน ทดสอบอีกกว่า 2 เดือน ทีมทดสอบคือทีมการตลาด และ PSS ของ Microsoft Thailand

สุดท้ายHappy Birthday MS-IE

Banner ยอดนิยม ใช้ promote IE ในช่วงแรกๆ

Flying windows ใน source เดี๋ยวนี้พัฒนาไปเยอะมาก ตอน 3.0 ทำเป็น e หมุนเป็นรูปโลก สวยมากๆ

หน้าตา Mosaic โดย Spyglass


วันอังคารที่ 8 กรกฎาคม พ.ศ. 2557

Upgrade LUA skill ด้วยการเขียน C module

มา upgrade LUA skill กัน ด้วยการเขียน LUA ไปเรียก module ที่เขียนด้วย C



ส่วนจะควรจะเรียกใช้ หรือเขียนอะไรด้วย LUA เขียนอะลัวด้วยไร ค่อยไปหาคำตอบกันเอง เช่น มีเพื่อนผมกลุ่มนึง เขียน Socket library เป็น Core module แล้ว Binding เขากับ LUA จากนั้นก็ใช้ LUA เขียน Server ทั้งตัว ก็มี

จาก Document พบว่า LUA ใช้ lua_State ในการส่งผ่าน parameters จาก LUA script ไปยัง C module ("Shared Object", file.so)  โดยมีรูปแบบมาตรฐานเริ่มต้นดังนี้

#include <lua.h> 
#include <lauxlib.h>

#include <lualib.h> 

int luaopen_cprime(lua_State *L){
   return 0;
}

ผมตั้งชื่อ library ตัวนี้ว่า cprime โดยวางแผนว่า ในนั้นจะมี function ง่ายๆ ในการตรวจสอบว่า ตัวเลขที่ส่งเข้ามาเป็น Prime Number หรือไม่ 

จากนั้นก็เพิ่ม function isprime สำหรับการตรวจสอบ Prime Number เข้าไป

static int isprime(lua_State *L) {
   int number = lua_tointeger(L, -1);
   for (int i = 2; i < number; i++) {
      if (number % i == 0 && i != number) {
         lua_pushnumber(L, 0);
         return 1;
      }
  }
  lua_pushnumber(L, 1);
  return 1;
}

อย่างที่ได้บอกไปแล้วว่า LUA ใช้ lua_State เป็น structure ในการส่งผ่าน parameters ระหว่าง LUA และ external module รวมถึงภายใน external module เอง 

ถ้าดูจาก function isprime ด้านบน lua_State จะเป็นทำหน้าที่ส่งผ่าน parameters ของ function isprime ทั้งหมด กรณีนี้ ผมส่ง integer เข้ามาตัวเดียว ซึ่งเราจะทำการดึง integer ที่ส่งผ่านเข้ามาใน isprime ด้วย lua_tointeger(L, -1);

lua_Integer lua_tointeger (lua_State *L, int index);

จากนั้นก็ตรวจสอบดูว่า ค่าที่ส่งเข้ามานั้นเป็น Prime Number หรือไม่ ถ้าใช่ เราก็ทำการ push 1 เข้าไปใน lua_State ด้วย lua_pushnumber(L, 0);

void lua_pushnumber (lua_State *L, lua_Number n);

ถ้าไม่ใช่ก็ push 0 เข้าไปแทน

แต่ก่อนจะใช้ isprime ได้ต้องทำการ register method isprime ให้ LUA รู้จักก่อนโดยการเรียก  (เราอาจเปลี่ยนชื่อ isprime เป็นอย่างอื่นก็ได้ ด้วยการแก้ที่ paraemters ที่สอง เช่น "fprime" เป็นต้น)

lua_register(L,"isprime",isprime); 

ใน luaopen_cprime(...); ซึ่งหน้าตาของ cprime.c จะเป็นแบบนี้

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

static int isprime(lua_State *L) {
  int number = lua_tointeger(L, -1);
  for (int i = 2; i < number; i++) {
    if (number % i == 0 && i != number) {
      lua_pushnumber(L, 0);
      return 1;
    }
  }
  lua_pushnumber(L, 1);
  return 1;
}

int luaopen_cprime(lua_State *L){
  lua_register(L,"isprime", isprime);
  return 0;
}

จากนั้น compile 

$ gcc -Wall -shared -fPIC -o cprime.so -I/usr/include/lua5.1 -llua5.1 cprime.c

(อย่าลืมติดตั้ง Lua5.1 ก่อนนะจ๊ะ)

แล้วเราก็มาสร้าง prime.lua file เพื่อเรียกใช้ isprime ของเรา หน้าตาจะเป็นแบบนี้ครับ

#!/usr/bin/lua

require("cprime")
print(isprime(13))
print(isprime(12))

แล้วเรียก

$ lua prime.lua
1
0

ประมาณนี้...ครับ :-)



วันพุธที่ 2 กรกฎาคม พ.ศ. 2557

foreach ใน C++

เพื่อนๆ ผมมักบอกว่า C++ โบราณแล้ว... ภาษามันเก่าแล้วพี่... C# เหอะพี่ (แหม่ อันหลังนี่...)



ถามกลับไปว่า เพราะอะไร ตัวอย่างที่มักจะยกกันขึ้นมา ก็คือ C++ มันไม่มี foreach นะพี่ (ผม) เฮ๊ย... มีนะ

ตอน C++11 ยังไม่ประกาศมาตรฐาน Qt ก็เคยทำ foreach มาให้ใช้

  QList<int> list;
 
  list << 1 << 2 << 3 << 4 << 5;
 
  foreach (int i, list)
  {
    qDebug() << i;
  }


พอ C++11 ประกาศใช้เราก็สามารถทำแบบนี้ได้

int arrayint[] = {1, 2, 3, 4, 5};
for (int i : arrayint) {
   ...
}

ทำแบบกำหนด boundary ของ container (cont) แบบนี้ก็ได้

for (auto it = cont.begin(); it != cont.end(); ++it)

หรือ จะแบบ reverse order ก็แบบนี้

for (auto it = cont.rbegin(); it != cont.end(); ++it)

เห็นแมะ C++11 โบราณตรงไหน :-)