6

เกิดอะไรขึ้นกับ fgets ถ้า buffer เล็กกว่าความยาวบรรทัด

เวลาเขียนภาษา C เราใช้ fgets ต้องระบุด้วยว่า buffer ขนาดเท่าไหร ประมาณนี้

char buf[80];
fgets(buf, 80, fp);  

จากตัวอย่างข้างบนถ้าบรรทัดยาวกว่า 79 byte (ต้องเหลือที่ไว้ใส่ ” ด้วย) จะเกิดอะไรขึ้น เท่าที่ลองดู fgets มันก็อ่านได้อยู่ดี อ่านได้แค่ไหนก็เอามาแค่นั้น ไม่มีอะไร return ออกมาพิเศษ

แต่ทำอย่างไรจะตรวจสอบได้ว่าอ่านมาไม่หมด เท่าที่คิดได้ตอนนี้คือดูว่าตัวสุดท้ายใน buf เป็น newline หรือเปล่า ถ้าไม่ใช่ก็อาจจะอ่านมาไม่หมด แต่นี้ลองใน Ubuntu 8.04 นะครับ อาจจะมีระบบอื่นๆ กรณีอื่นๆ ที่ต่างออกไป

3

ฟุตบอลไทยลีค กับ สถานีโทรทัศน์

วันเสาร์และอาทิตย์ 28 – 29 มีนาคม พ.ศ. 2552 ที่ผ่านมาผมดูโทรทัศน์บ้างโดยเฉพาะข่าวกีฬา ผมไม่ค่อยเห็นข่าวเกี่ยวกับ ฟุตบอลไทยลีคเท่าไหร่ โดยเฉพาะดิวิชัน 2 ที่แข่งกันในวันอาทิตย์ที่ผ่านมา ทั้งๆ ที่มีข่าวการแข่งขันกีฬาทั่วโลก. เรื่องนี้ก็ยังค้างคาใจมากระทั่ววันนี้ ว่าเพราะเหตุอะไร ผมจึงไม่ได้รับข่าวฟุตบอลดิวิชัน 2 จากโทรทัศน์ ผมก็พยายามคิดถึงเหตุผลต่างๆ ที่แจกแจงมาดังนี้

  1. มีข่าวฟุตบอลดิวิชัน 2 แต่ว่าผมไปเข้าห้องน้ำ หรือกำลังชงกาแฟพอดีเลยไม่ได้ดู
  2. ผมดูผิดช่อง ผิดเวลา
  3. ข่าวฟุตบอลดิวิชัน 2 เป็นเรื่องเฉพาะท้องถิ่น ควรดูจากโทรทัศน์ท้องถิ่น
  4. ข่าวฟุตบอลดิวิชัน 2 ทำให้ขายโฆษณาระหว่างข่าวได้น้อย
  5. ถ้าลงข่าวฟุตบอลมากๆ คนก็จะออกไปดูฟุตบอลที่สนาม ดังนั้นจะมีคนดูทีวีน้อยลง แต่ถ้ามีคนดูเยอะขนาดนั้นก็อาจจะเปลี่ยนมาถ่ายทอดฟุตบอลแทนได้อยู่ อาจจะเป็นไปได้หรือเปล่าว่ากีฬาต่างประเทศได้เปรียบที่อย่างไรก็ต้องดูถ่ายทอดจากโทรทัศน์ เดินทางไปชมที่สนามยาก
  6. หาแหล่งข่าวยาก รอยเตอร์อาจจะไม่รายงาน (แต่ว่าดูจากเว็บ http://www.fac.or.th/ ก็ได้)
  7. ข่าวกีฬามีเวลาน้อย เพราะต้องเอาเวลาไปนำเสนอเสื้อเหลืองเสื้อแดง

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

5

ขึ้นรถตู้จากสนามบินสุวรรณภูมิ

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

p3290004.jpg

ล่าสุดนี้ต้องไปขึ้นที่รถตู้ ไม่มีรถเมล์แล้วที่สถานีที่อยู่ไกลเหมือนกัน แล้วก็ต้องไปรอรถเวียน … ทีรอรถเวียนนี้หายากอยู่เหมือนกัน

p3290001.jpg

ในอาคารผู้โดยสาร ผมเห็นป้ายบขส. แต่ว่าในป้ายเดียวกันไม่มี ขสมก. เห็นป้ายขสมก. จากที่อื่นเหมือนกันแต่ก็งงๆ

p3290009.jpg

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

ในที่สุดก็ไปขึ้นรถตู้ 30 บาท มั้ง … ก็นั่งไปถึงเดอะมอลล์ บางกะปิแล้ว แบบนี้ล่ะนะ ของดีราคาถูกก็หายากหน่อย :-P

3

ทางเดินใหม่ของรถไฟฟ้าสถานีเอกมัย

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

คราวหน้าก็คงไม่ไปแล้ว เดินไปซื้อน้ำ (น่าม) ดื่มร้านบ้านไร่ น่าจะใกล้กว่า ห้องน้ำก็ดูเหมือนจะใช้ได้ด้วย แต่คงกินอาหารไม่ได้ เพราะมีเงินไม่พอ …

p3280315

p3280301

p3280310

p3280314

p3280305

p3280304

0

ศูนย์ศิลปาชีพเกาะเกิด พระนครศรีอยุธยา

ผมได้ card reader กลับมาแล้ว ก็เลยเอารูปลงได้ … เมื่อวันก่อนไปศูนย์ศิลปาชีพเกาะเกิดมา ยังสร้างไม่เสร็จ แต่ว่าหลายอย่างก็สวยงาม ทั้งสิ่งปลูกสร้างและต้นไม้

ศูนย์ศิลปาชีพเกาะเกิด

ศูนย์ศิลปาชีพเกาะเกิด

ศูนย์ศิลปาชีพเกาะเกิด

ศูนย์ศิลปาชีพเกาะเกิด

p3250201.jpg

ที่ศูนย์ศิลปาชีพมีหลายอย่างเลยแต่ที่ผมดูมาและจำได้ก็มี บ่อเลี้ยงกบ เห็นกบตัวเป็นๆ เต็มไปหมดตัวใหญ่มากด้วย เข้าไปดูได้ที่ http://www.flickr.com/photos/vscript/sets/72157615879160065/ (ไม่เอาลง blog เผื่อบางคนกลัวกบ)

มีผักปลูกในน้ำด้วย เห็นแล้วก็อยากจะปลูกไว้กินเองบ้าง แต่ว่าแบบปลูกในน้ำต้องใช้ปุ๋ยเคมีใส่น้ำด้วย ต้องมีรางด้วย เอาไว้มีงบก่อน ว่าจะลองทำดูบ้าง

p3250158.jpg

ไปดูโรงสีข้าวมาด้วย เขาก็ลองสีให้ดู แต่พบคนพูดก็ฟังไม่ค่อยรู้เรื่องดอก ได้ยินแต่เสียงเครื่องจักร มีคนบอกว่าเครื่องสีข้าว ราคาประมาณ 5 ล้านบาทได้ ไม่รู้จริงหรือเปล่า ถ้าผมปลูกข้าวได้เอง แล้วอยากจะกิน สงสัยจะต้องตำเอา แบบตำข้าวสารกรอกหม้อ สุขเอาเผากิน (เกี่ยวมะ?)

ศูนย์ศิลปาชีพเกาะเกิด รูปนี้เป็นนาข้างโรงสี

ในนั้นศูนย์มีสมาชิกโครงการอยู่ด้วย แต่ละคนมีที่ 2 ไร่ปลูกหลายอย่าง เขาบอกว่าราคาขายคงที่ตลอด แล้วจะปลูกอะไรก็ขึ้นอยู่กับการสำรวจตลาดด้วย แต่ก็ไม่รู้ว่าใครสำรวจ และสำรวจอย่างไร ก็ต้องรีบลาคุณเกษตรกรมา เพราะว่าหมดเวลา

p3250187.jpg

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

0

Lua: เพิ่ม method จาก C API

ปกติแล้วเพิ่ม function เข้าไปใน library ก็ใช้คำสั่ง luaL_register ประมาณข้างล่าง

 #include "lua.h"
#include "lauxlib.h"

static int
luamylib_func1(lua_State *L)
{
...
...
...
}

static const
struct luaL_reg
mylib_functions[] = {
    {"func1", "luamylib_func1"},
    {NULL, NULL}
};

int
luaopen_mylib(lua_State *L)
{
    luaL_register(L, "mylib", mylib_functions);
    return 1;
} 

ทำแบบข้างบนเราก็จะไปใช้ func1 ใน Lua ประมาณนี้

require "mylib"
mylib.func1()

อีกอย่างคือ table (น่าจะใกล้เดียงกับ object ใน javascript) ตามที่ไปดู code ของชาวบ้าน (lua-gd กับ lua-curl) มาก็ใช้ luaL_newmetatable สร้าง table กัน ก็จะได้ code ประมาณด้านล่าง

 #include "lua.h"
#include "lauxlib.h"

int
luaopen_mylib(lua_State *L)
{
    luaL_newmetatable(L, "mytab");
    return 1;
} 

แต่ปัญหาของผมมีอยู่ว่าปกติใช้ luaL_register นี้ function มันก็แยกไปต่างหาก ไม่ได้มาเชื่อมกับ object หรือ table ถ้าอยากทำอะไรกับ object หรือ table ก็ต้องมาสั่งประมาณ

require "mylib"
local myobj = ....
mylib.func1(myobj)

แต่ผมอยากได้ประมาณ

require "mylib"
local myobj = ....
myobj:my_mythod()

จะทำอย่างไร

คำตอบที่ดูจากคนอื่นมา แต่พึ่งอ่าน code เข้าใจคือ ใส่ NULL ไปแทน libname ของ luaL_register แล้ว function จะกลายเป็น method ของ table/object ที่อยู่บนสุดของ stack เอง

 ...
...
...
luaopen_mylib(lua_State *L)
{
    luaL_newmetatable(L, "mytab");
    luaL_register(L, NULL, mylib_functions); /* ใส่ NULL แทน */
    return 1;
} 

แต่เราก็ต้องดูด้วยว่า บนสุดของ stack เป็น table และใช่ table ที่เราอยากจะเพิ่ม method เข้าไปหรือเปล่า

อ่านส่วนหนึ่งมาจาก http://docs.taoframework.com/Tao.Lua/Tao.Lua.Lua.luaL_register.html

ป.ล. ผมเขียนไปเรื่อยไม่ได้ลองเอา code ข้างบนไปทดสอบนะครับ ดังนั้นก็น่าจะมีอะไรผิดพลาดอยู่เยอะเหมือนกัน