Friday, February 23, 2007

HylaFax

Fax ที่ทำงานเสีย
ก็เลยได้ฤกษ์หา fax server มาใช้แทน
จัดการหาเครื่อง pc เก่าๆ กับ model เก่าๆมาตัว
ลง ubuntu server
สั่งติดตั้ง hylafax-server
เรียก faxsetup แล้วก็ yes ไปเรื่อยๆ
แว๊บเดียวก็เรียบร้อย

ส่วนที่ยาก กลับกลายเป็นว่า
fax-client ไม่สามารถ download fax file ได้
เกิด error
550 : Operation not permitted.

นั่งหา, มั่ว อยู่นาน
ผ่านไป 2 ชั่วโมง
ได้ข้อสรุปว่า
permission ของ file มันเป็น 600 อยู่
ทำให้ ftp มัน load ไม่ได้
ก็เลยไปแก้ config file ของ hyla
กำหนด default สิทธิ file ให้เป็น 666 แทน
ส่วนของเก่าที่รับมาแล้ว ก็ใช้ command-line สั่งแก้ไป

เฮ้อ config พวกนี้
มันมีเรื่องเล็กเรื่องน้อยแบบนี้ซ่อนอยู่เสมอ

Related link from Roti

Wednesday, February 21, 2007

ขี่จักรยานยามมืด

เห็นเจ้า Rerng@IT ออกไปปั่นจักรยานมาหลายคืนแล้ว
ชักอิจฉา
เมื่อคืนเลยออกไปบ้าง
เส้นทางจากรัชโยธินเลือกวิ่งไปทางอนุสาวรีย์หลักสี่
แล้ววกกลับมาทางวิภาวดี



ขี่ตอนกลางคืน ก็สบายๆดีแฮะ
(ปกติจะซาดิสต์ ชอบขี่ตอนแดดร้อนๆ)

พวก Rerng@IT + น้องโบ้ เขาขี่แบบกระโดด + โลดโผน
ผมใช้เสือหมอบ และขี่กระโดดไม่เป็น
ก็เลยขับตรงๆบนถนน ไม่ซอกแซก
สังเกตเส้นทางใน map สิ ตรงแหน๊ว
(เส้นทางขี่ก็บ่งบอกบุคลิกผู้ขี่ได้เหมือนกัน)

ระหว่างทางมี Amazing อยู่อย่าง
ก็คือเจอน้ำตก ต้องขี่ข้าม
จริงๆ น้ำตก ไหลโกร๊กเลย
ขนาดเท้าอยู่บนบันไดจักรยาน
น้ำมันยังพัดมาโดนเปียกได้เลย
คิดดูว่าน้ำสูงขนาดไหน

เฉลย น้ำตกนั้นคงเป็นท่อประปาแตก
แต่ต้องเป็นท่อใหญ่มากเลย
จึงจะทำให้น้ำไหลได้ขนาดนั้น

กลับมาถึงบ้าน
ปรากฎว่า ล้อเสือหมอบคดเลย
เซ็งเลย โชคดีมีล้ออะไหล่เปลี่ยน
วันนี้เลยขี่มาทำงานได้

ปล. ฝากถาม doc หรือผู้รู้หน่อย
ล้อคดนี่เขาซ่อมกันหรือเปล่า
หรือเปลี่ยนใหม่อย่างเดียว

Related link from Roti

Monday, February 19, 2007

Any bug here?

Ridiculous fish เขียน post ดีๆอีกแล้ว
คราวนี้เขาแสดงให้ดูว่า
code ข้างล่างนี้มี bug ได้อย่างไร
(เพื่อความสนุกในการอ่าน, ให้พยายามไล่ดู code ก่อน
ว่ามันจะมี bug v2 > v1 ได้อย่างไร)
unsigned variable1 = 0;
unsigned variable2 = 0;

#define ITERATIONS 50000000

void *writer(void *unused) {
for (;;) {
variable1 = variable1 + 1;
variable2 = variable2 + 1;
}
}

void *reader(void *unused) {
struct timeval start, end;
gettimeofday(&start, NULL);
unsigned i, failureCount = 0;
for (i=0; i < ITERATIONS; i++) {
unsigned v2 = variable2;
unsigned v1 = variable1;
if (v2 > v1) failureCount++;
}
gettimeofday(&end, NULL);
double seconds = end.tv_sec + end.tv_usec / 1000000. - start.tv_sec - start.tv_usec / 1000000.;
printf(”%u failure%s (%2.1f percent of the time) in %2.1f seconds\n”,
failureCount, failureCount == 1 ? “” : “s”,
(100. * failureCount) / ITERATIONS, seconds);
exit(0);
return NULL;
}

int main(void) {
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, writer, NULL);
pthread_create(&thread2, NULL, reader, NULL);
for (;;) sleep(1000000);
return 0;
}

Related link from Roti