ข้ามไปที่เนื้อหาหลัก

บทความ

กำลังแสดงโพสต์จาก 2011

การอินเทอร์รัพท์ใน boost::thread

สืบเนื่องจากการใช้งาน std::thread ซึ่งผมคิดไปเองว่า gcc น่าจะรองรับมาตรฐาน C++11 ไปเรียบร้อยแล้ว แต่ปรากฎว่าไม่เป็นเช่นนั้นเนื่องจาก gcc ที่ใช้อยู่ในปัจจุบันเป็นรุ่นที่ 4.6 ยังไม่รองรับทั้งหมด (สถานะของมาตรฐาน c++ สำหรับ gcc 4.6 สามารถดูได้จาก Status of Experimental C++0x Support in GCC 4.6 ) และ std::thread ถึงแม้จะใช้งานได้บ้างแล้ว (สร้าง std::thread อ็อบเจกต์ได้ join ได้ แต่อินเทอร์รัพท์ไม่ได้) แต่ก็ยังต้องรอให้เธรดที่ถูกสร้างขึ้นจบการทำงานไปตามปรกติวิสัย ซึ่งในงานบางอย่างจำเป็นต้องใช้การอินเทอร์รัพท์เข้าช่วย ซึ่งในบทความนี้จะทดลองใช้งานไลบรารีเธรดจาก boost แทน เหตุผลนึ่งที่เลือกไลบรารีจาก boost เนื่องจาก boost::thread นั้นเหมือนกับมาตฐาน C++11 มากทีเดียว หาก gcc อิมพลีเมนท์ std::thread พร้อมที่จะให้ใช้งานแล้วการย้ายกลับไปใช้ std::thread จะทำได้ไม่ยากนัก เริ่มจากตัวอย่างง่ายๆ กันก่อน (ลอกตัวอย่างจาก เรื่องวุ่นๆ ของ std::thread ใน C++0x ) // boost_thread.cpp #include <iostream> #include <boost/thread.hpp> using namespace std; class DoWork { public: DoWork(){

ไฟล์และไดเรกทอรีด้วยชุดไลบรารี boost

ต่อจาก ชุดไลบรารี date_time ของ Boost  วันนี้เลยบันทึกเกี่ยวกับการจัดการไฟล์และไดเรกทอรีด้วยชุดไลบรารีของ  boost  สักนิด สำหรับชุดที่สนใจคือ filesystem  สำหรับ filesystem เองหากพิจารณาแล้วมี class ที่น่าสนใจคือ path directory_entry directory_iterator recursive_directory_iterator file_status ที่อาจจะต้องใช้งานแล้วแต่กรณี แต่ที่ใช้ประจำเห็นคงหนีไม่พ้น path เนื่องจากเป็น class ที่ใช้ระบุตำแหน่งไฟล์นั้นเอง ส่วนที่เหลือจะเป็น operational functions ที่ใช้ร่วมกับ class ที่กล่าวไปแล้ว แต่ส่วนใหญ่จะใช้งานออปเจคของ path นั้นเอง มาดูตัวอย่างแรกกันดีกว่า // directory.cpp #include <iostream> #include <string> #include <boost/filesystem.hpp> using namespace std; using namespace boost::filesystem; int main(){ string directory_path = "/tmp/test"; path p(directory_path); if (exists(p)) cout << p << " exists" << endl; else{ cout << p << " does not exist" << endl; if (create_directory(p))   cout &l

ชุดไลบรารี date_time ของ Boost

เนื่องจากตอนนี้กลับมาเขียน C++ เป็นหลัก จึงอยากเขียนหลายๆ อย่างให้อยู่ในรูปของอ็อบเจกต์ด้วย จึงหาไลบรารีมาใช้งาน ที่สนใจตอนนี้คือไลบรารีเรื่องของวันและเวลาจากชุดไลบรารีของ boost ซึ่งชุดไลบรารีของ boost เองหลายชุดได้กลายเป็นแม่แบบมารตฐาน C++11 ด้วย สำหรับตอนนี้สนใจเรื่องเกี่ยบกับเวลา เราอาจจะเลือกใช้ ctime ได้แต่อาจจะอยู่ในรูปปของฟังก์ชันและพอยน์เตอร์ หรือ tm struct แต่การใช้ tm struct เราอาจจะต้องมาจัดการเรืองของช่วงเวลาเอง อาจจะยุ่งยากเล็กน้อย ลองมาดูไลบรารี date_time ของ boost กันดีกว่า // date_time.cpp #include <iostream> #include <boost/date_time/posix_time/posix_time.hpp> using namespace::std; int main(){ boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time(); cout<<"time t1: " << boost::posix_time::to_simple_string(t1) <<endl; sleep(1); boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::local_time(); cout<<"time t2: " << boost::posix_time::to_simple_string(t2) <

JSON Spirit

พอเริ่มที่จะต้องแลกเปลี่ยนข้อมูลกันระหว่างโปรแกรม คำถามคือใช้อะไร แบบใหน โปรโตคอลอะไรดี สำหรับ Thesis ที่ทำขึ้นใหม่นี้ใช่เวลาไม่นานเพื่อหาคำตอบนี้ โดยความตั้งใจว่าจะใช้ JSON :D ปัญหาอยู่ที่ว่าไม่เคยเขียนโปรแกรมโดยใช้ JSON ด้วย C++ มาก่อน หลังจากหาข้อมูลอยู่พักใหญ่จึงไปตกลงใจที่ JSON Spirit ก่อนเริ่มเขียนโปรแกรมก็ควรติดตั้งไลบรารีกันก่อนนะครับ # aptitude install libjson-spirit-dev เสร็จสิ้นแล้วเริ่มเขียนโปรแกรมกันเลย ตัวอย่างแรก #include <iostream> #include <string> #include <vector> using namespace std; #include <json_spirit.h> int main (){ string json = "[1,2,3,4,5,6]"; cout << "The JSON string: " << json << endl; json_spirit::Value value; cout << "Read JSON string: " << json_spirit::read(json, value) << endl; std::vector< json_spirit::Value > array = value.get_array(); for( int i = 0; i < array.size(); i++) cout << "Get JSON value " << i <<

ประชุมเชียร์ เรื่องเก่าเล่าใหม่

ปีนี้เป็นปีหนึ่งที่มีเรื่องผ่านหูเกี่ยวกับการประชุมเชียร์มากที่สุดปีหนึ่ง หลายๆ ครั้งเราอาจจะได้ยินเรื่องการรับน้องนอกสถานที่ แต่คราวนี้เกิดขึ้นกับการประชุมเชียร์ซึ่งถือได้ว่ามีการอนุญาตให้สามารถทำกิจกรรมนี้ได้อย่างถูกต้องภายในมหาวิทยาลัยนั้นเอง การประชุมเชียร์นั้นแท้จริงคืออะไรเป็นคำถามที่ผมพยายามหาคำตอบเหมือนกัน เชียร์ หากเขียนเป็นภาษาอังกฤษก็น่าจะหมายถึง cheer ซึ่งหมายโดยรวมคือการให้กำลังใจหรือแสดงความยินดี แต่ผู้จัดกิจกรรมประชุมเชียร์ผมไม่ทราบว่าเขาเหล่านั้นได้เข้าใจถึงคำเหล่านี้บ้างหรือเปล่า หลายๆ คนที่อ่านบทความของผมอาจจะตั้งแง่ว่าผมคงไม่เคยผ่านการประชุมเชียร์หรือเข้าร่วมไม่ครบ แต่ผมอยากให้เข้าใจว่าผมเข้าครบ 7 เชียร์ครับ ไม่เคยขาดแม้แต่ครั้งเดียวและได้รับของที่ระลึกเป็นจี้เกียร์ซึ่งเป็นสัญลักษณ์ของคณะวิศวกรรมศาสตร์ด้วย บทความนี้ผมไม่ได้เขียนขึ้นเพื่อทำลายระบบประชุมเชียร์แต่กำลังเสนอความเห็นว่า ในปัจจุบันมันยังคงความหมายหรือว่าห่างไกลกับความหมายดั้งเดิม คงปฏิเสธไม่ได้ว่าการประชุมเชียร์นั้นเป็นกลไกลหนึ่งของระบบโซตัส (SOTUS) ลองอ่านความหมายที่นี้ประกอบนะครับ วิพากษ์ว้าก:บทวิพากษ์แห

For Seen, Hat Yai

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

@ icecream, Hat Yai

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

เรื่องวุ่นๆ ของ std::thread ใน C++0x

ถึงแม้ว่าผมเองจะเขียน C++ มาตั้งแต่ตอนเรียนปี 1 แต่หลายๆ ครั้งก็ยังสับสนเรื่องชนิดของตัวแปรอยู่ดี หลังจากปี 1 ก็เขียนมาหลายภาษา ไม่ว่าจะเป็น JAVA PHP Python ยิ่งส่งผลให้สับสนเรื่องลักษณะเด่นของแต่ละภาษา มาวันนี้เริ่มลองเขียน thread ใน C++0x ก็เจอดีอีกจนได้ เนื่องจาก object ใน C/C++ เป็น strong type ไม่เหมือนใน JAVA ที่เป็น reference พอเขียนให้เธรดทำงานจากนั้นไปเปลี่ยนแปลงสมาชิกข้อมูลของ class แต่ object ที่รันอยู่โดย std::thread กลับไม่เปลี่ยนแปลงอะไรเลย โจทย์คือทำอย่างไรให้ object มันใช้ข้อมูลร่วมกันได้ หาไปหามาปรากฎว่าเป็นเพราะไม่ยอมอ่าน doc นี่เอง !!_ _ Multi-threading in C++0x ได้แสดงตัวอย่างการใช้งานไว้ค่อนข้างละเอียดทีเดียว เลยลองมาเขียนเองเล่นๆ ดังตัวอย่างด้านล่าง #include <iostream> #include <thread> using namespace std; class DoWork { public: DoWork(){ cout << "this in constructor : " << this << endl; this->running = false; } bool running; void operator()(){ cout << "show running by operator : " << runnin

Thread บน C++0x

หลังจากนั่งเขียนโค้ดมาหลายวัน วันนี้จะต้องเขียนบางส่วนที่ทำงานโดยใช้เธรด (thread) จึงลองเขียนเล่นๆ นอกโปรเจคก่อน ผลออกมาน่าพอใจทีเดียว แต่ตอนคอมไพล์โปรแกรมต้องเพิ่มออพชันเข้าไปเพื่อให้ g++ รู้ว่ามีการใช้งานมาตรฐาน C++0x และเพิ่ม pthread เข้าไปด้วยมิฉะนั้นจะรันไม่ผ่าน ตัวอย่างโค้ดชื่อ thread.cpp #include <iostream> #include <thread> using namespace std; class DoWork { public: void operator()(int a, int b){ cout << "hello in thread a is " << a << " b is " << b << endl; } }; void hello_thread(){ cout << "hello from function" << endl; } int main(){ DoWork dw; thread a(dw, 10, 20); thread b(hello_thread); a.join(); b.join(); return 0; } หลังจากนั้นทดสอบคอมไพล์โปรแกรมแบบไม่เพิ่มไลบรารี pthread ดู จะแสดงข้อผิดพลาดดังด้านล่าง $ g++ --std=c++0x -o thread thread.cpp $ ./thread terminate called after throwing an instance of 'std::system_error' what(): Operation not permitte

ใบสั่งใบแรกในชีวิต

วันนี้ผมออกไปซื้อของให้คุณพ่อในเวลาใกล้เที่ยงและแวะซื้อของฝากที่ตลาดเพราะจะกลับบ้าน ในเวลาประมาณ 11.00 น. ผมขับรถจักรยานยนต์ออกมาทางถนนธรรมนูญวิถีจะมีไฟแดงอยู่ที่บริเวณวัดโคกนาวตัดถนนกาญจนวณิชย์ผมจึงเลี้ยวซ้ายไปทางโลตัสกะจะเข้ามหาวิทยาลัยทางประตูหน้า บริเวณหน้าวัดโคกนาวมีตำรวจสองนายโบกมือให้รถผมหยุดผมจึงหยุด เจ้าพนักงานบอกว่าไฟแดงนี้เลี้ยวซ้ายต้องรอสัญญาณไฟ แล้วก็ขอใบขับขี่ผมไปแล้วบอกให้ไปเสียค่าปรับที่ สภ. คอหงส์ ผมจึงถามว่าห้ามตั้งแต่เมื่อไหร่ เขาไม่ตอบผมนะ บอกแต่ว่าต้องรอสัญญาณไฟ ผมไม่เคยรู้มาก่อนเลยว่าต้องรอสัญญาณไฟเวลาเลี้ยวซ้ายที่แยกนี้ด้วย ตั้งแต่มีจักรยานยนต์แล้วขับที่หาดใหญ่ก็ปาเข้าไปจะ 7 ปีแล้วแต่ก็ว่าเถอะมันอาจจะเป็นความผิดผมที่ไม่ได้ดูป้ายเตือน แต่การตั้งด่านตรวจของเจ้าพนักงานสองคนนี้ถูกต้องตามกฏหมายหรือไม่ ผมก็ไม่ทราบเช่นกัน เนื่องจากไม่มีกรวย ไม่มีป้ายตรวจ และไม่มีนายตำรวจสัญญาบัตร แต่อย่างว่าแหละอาจจะบอกว่าเป็นความผิดซึ่งหน้าก็ได้ ก็เขาเป็นเจ้าพนักงานนี้นะ ตั้งแต่ สภ. คอหงส์ เปิดมา ก็วันนี้แหละที่ผมรู้ว่า สภ. นี้มีอยู่จริง สำหรับตัวใบสั่งนั้นเขาเขียนว่าผมฝ่าฝืนสัญญาณไฟจร

มอง Barcamp Songkhla II

หลังจากจบ Barcamp Songkhla II ก็ควรเขียน Blog ไว้เป็นที่ระลึกกันสักหน่อย สำหรับตัวงานผมในฐานะผู้ร่วมจัดถือว่าประสบความสำเร็จทีเดียวอย่างน้อยก็มีชาวต่างประเทศและชาวต่างจังหวัดมาร่วมงานและโดยมากเป็นนักศึกษาถือว่าเป็นแนวโน้วที่ดีทีเดียว พูดอะไรใน Barcamp Songkhla II ใน Barcamp Songkhla ครั้งนี้ผมได้เสนอหัวข้อ OpenStreetMap @ HY ซึ่งก็ได้รับเลือกให้พูดด้วย แต่ผมไม่ได้เตรียมสไลด์มาจึงขรุขระเล็กน้อย มีผู้สนใจฟังอยูหลายคนทีเดียว ผมได้แนะนำความสำคัญและแผนที่ของหาดใหญ่ก่อนที่ผมเริ่มวาดแผนที่ให้กับ OpenStreetMap และแผนที่ในปัจจุบัน หลังจากนั้นก็แนะนำ Editor ที่ใช้ในปัจจุบันนั้นก็คือ JOSM และแสดงการวาดแผนที่แบบง่ายๆ ให้ชม อาจจะพูดวนไปวนมาสักหน่อยแต่ก็จบด้วยดี :D หลังจากจบ Session แล้วมีอ.วรวุธ และ พี่ Manatspap เข้ามาพูดคุยแลกเปลี่ยนกันเล็กน้อยก่อนทานข้าว ซึ่งน่ายินดีที่ได้เสียงตอบรับที่ดีจากหลายๆ คน หวังว่าจะมีคนมาร่วมกันวาดแผนที่ในหาดใหญ่บน OpenStreetMap มากขึ้น บรรยากาศงานเป็นอย่างไร บรรยากาศงานผมคิดว่าอยู่ในระดับที่ดี เสียอยู่อย่างเดียวคือเรื่องเสียง ทางทีมงานคาดผิดไปหน่อยตรงที่เสียงผู้พูดตี