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 ข้างบนไปทดสอบนะครับ ดังนั้นก็น่าจะมีอะไรผิดพลาดอยู่เยอะเหมือนกัน

0

เริ่มต้นใช้ Lua ต่อกับภาษาซี

วันนี้อยากลองใช้ Lua ดูเพราะว่าขี้เกียจ bind อะไรๆ กับ Python เหนื่อย … ใช้ swig ก็งง (พยายามหาเหตุผลมาเล่น Lua) ก็เลย download Lua 5.1.4 มา แล้วก็ก็สั่ง make linux local สิ่งที่ได้จากการ build ก็อยู่ใน folder เดิมๆ หลังจากนั้นผมก็ copy พวก liblua.a, *.h ทั้งหลาย, และ lua จากใน bin ไปไว้ใน folder เดียวกันหมดเลย สร้าง lua_hrule.c ขึ้นมา ทำอะไรไม่เป็นก็เขียนแค่นี้

lua_hrule.c

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

int
luaopen_hrule(lua_State *L)
{
    return 1;
}

แล้วก็ Makefile

CC=gcc
all:  hrule.so
hrule.so: lua_hrule.c
	$(CC) -shared -o hrule.so lua_hrule.c liblua.a
clean:
	rm -f  hrule.so

จริงๆ แล้ว Makefile ยาวกว่านี้แต่ build อย่างอื่นที่ไม่เกี่ยว พอสั่ง

make

เสร็จแล้ว ผมก็ได้ hrule.so ออกมา ก็เรียก lua แบบนี้

./lua

แล้วก็สั่ง

require "hrule"

ก็ใช้งานได้นะ ไม่มีข้อความอะไรรายงานข้อผิดพลาดออกมา ... ตอนนี้ทำได้แค่นี้เอง เดี๋ยวเขียนต่อ :-P

0

เดินทางไกล และข้าวของที่หายไป

… เมื่อวานนี้ยังยังมีห้องสงบๆ อยู่ อย่างเท่ห์ๆ

p3240008.jpg

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

ออกมาจากห้องร้อนได้ก็มาใช้คอมพิวเตอร์ โปรแกรมก็พอใช้งานได้แม้จะงงๆ บ้าง ผมก็งง เด็กก็งง ระบบเครือข่ายก็พอใช้ได้ แต่บางทีมันก็ใช้ไม่ได้ เด็กทำมา 30 นาทีเห็นจะได้ กด “บันทึก” (save) เจ๊ง อยากจะร้องไห้. หลายครั้งผมเองเขียนโปรแกรมก็ไม่ได้นึกถึงเรื่องพวกนี้ คงต้องมีบันทึกร่างอะไรเอาไว้สำรองบ้างเหมือนกัน.

ทุกคนพยายามช่วยกันแก้ไขฝ่าฟันอุปสรรคนานา ผมก็รู้ว่าหลายอย่างก็ต้องทำไป แม้จะเหนื่อยยากก็ตามที

แต่ที่ร้ายที่สุดคือ monopod (ขาตั้งกล้องแบบเดี่ยวๆ) หายไป อันนี้เศร้าที่สุด อยากจะ upload รูปเล่น card reader ก็ไม่อยู่ แต่ก็ดีใจที่กลับมาได้และกล้องยังอยู่ ^_^. แต่ยังไม่หมด กลับมากินข้าวเย็น กินน้ำเปล่า บริกรก็รินเบียร์ให้ รินเสร็จก็ทำหน้ามึน เดี๋ยวนี้ไปต้องเชียร์กันแล้ว รินให้เลย ผมบอกว่าผมดื่มน้ำเปล่านะก็ทำหน้ามึน ไม่มีทีท่าว่าจะรับผิดชอบอะไร … ก็ปล่อยเหมือนเรื่องอื่นๆ suck it up กันต่อไป

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

0

ภาพแม่น้ำเจ้าพระยา จากกล้องของเล่น

แม่น้ำเจ้าพระยา

ได้กล้องของเล่นมา ฟิล์มที่เหลืออยู่ม้วนเดียวเป็น Lucky SDH 100 แน่นอน ขาวดำ ราคาประหยัด (แต่ตอนล้างเพิ่ม 30 บาทนะ) ก็เลยเอาไปเล่นซะ ระหว่างเดินข้ามสะพานสมเด็จพระเจ้าตากสิน (สะพานสาทร) ขาไปฝั่งธนฯ นั่งเรือไป นั่งรอมันออกเสียเมาคลื่น.

เอาฟืล์มไปล้าง 2 ม้วน สีม้วนขาวดำม้วน … คนรับไฟล้างก็งงๆ ว่าจะคิด 80 + 80 บาท หรือ 80 + 50 บาท … ยิ่งไม่มีตังอยู่ด้วยเลยอัดลงกระดาษมาดูแทน (แค่บางรูป) แล้วก็เอามา scan จากกระดาษอีกที … ภาพออกมาเพี้ยนๆ แต่ก็นะสนุกดี.