วิธีการติดตั้ง Replicate ของ MySQL หลักการแล้วจะทำเพื่อทำเซิร์ฟเวอร์สำรอง กรณีเซิร์ฟเวอร์หลักเสียหรือขัดข้องจนไม่สามารถใช้การได้ จะยังมีเซิร์ฟเวอร์สำรองอีกหนึ่งเครื่องเพื่อเปิดใช้งานแทน โดยข้อมูลใน MySQL นั้นจะมีเหมือนเดิมทุกประการ (ความเสียหายที่เกิดจะต้องไม่เสียหายจากการกระทำโดยตรงกับข้อมูล MySQL เพราะจะทำให้การเปลี่ยนแปลงใน Master ส่งผลไปยัง Slave ด้วย)
การที่จะทำให้ระบบสามารถใช้งานได้เป็นอย่างดีนั้น ระบบใน Slave ต้องเหมือนกันทุกอย่างกับ Master ยกเว้นข้อมูลเกี่ยวกับชื่อและ IP ของเซิร์ฟเวอร์ และการตั้งค่าใน MySQL
วิธีการง่ายที่สุดคือทำให้ Master ทำงานได้สมบูรณ์แบบและไม่มีการเปลี่ยนแปลงใดๆ แล้วก็ใช้วิธีการ Cloning หรือเขียนเป็น Image ไว้แล้วนำติดตั้งในเครื่อง Slave แล้วเข้าไปแก้ไข Network, และข้อมูลเกี่ยวกับ Server และคอนฟิกของ MySQL ดังนี้
1. เปลี่ยน IP ในไฟล์ /etc/networking/interfaces กรณีที่ใช้ DHCP และติดตั้ง mDNS ก็ไม่ต้องแก้ไขในส่วนนี้
2. เปลี่ยนชื่อใน /etc/hosts
3. แก้ไข /etc/mysql/mysql.conf.d/mysqld.conf ให้เป็นข้อมูลของ Slave
4. ลบไฟล์ /var/lib/mysql/auto.conf ในเครื่อง Slave แล้วรีสตาร์ท MySQL เพื่อให้สร้าง UUIDs ใหม่ ไม่อย่างนั้นจะไม่สามารถเปิดใช้งาน Replicate ได้
จากนั้นก็ดำเนินการติดตั้ง Replicate ได้เลย... (มีอัพเดทข้อมูลภายหลัง)
วันพุธที่ 15 พฤศจิกายน พ.ศ. 2560
วันอาทิตย์ที่ 12 พฤศจิกายน พ.ศ. 2560
Ubuntu 16.04 เปลี่ยนแหล่งเก็บ config ของ mysql
ปกติเราจะเข้าไปแก้ไขไฟล์ config ของ mysql ได้ที่ /etc/my.cnf หรือ /etc/mysql/my.cnf แต่สำหรับ Ubuntu เวอร์ชัน 16.04 แล้วจะเปลี่ยนแปลงการจัดเก็บคอนฟิกสำหรับ mysql ใหม่เป็น /etc/mysql/mysql.conf.d/ แทน โดยภายในไดเรคทอรีใหม่นี้จะมีไฟล์แยกเป็น mysqld.conf และ mysqld_safe_syslog.cnf ซึ่งเป็นการแยกส่วนให้ง่ายต่อการปรับแต่งระบบ และรูปแบบใหม่นี้จะแยกไฟล์คอนฟิกสำหรับ mysqldump ไปไว้ใน /etc/mysql/conf.d ซึ่งก็สะดวกดีเช่นกัน
ในไฟล์ my.cnf ได้เพิ่มการอ้างถึงไดเรคทอรีสำหรับจัดการระบบของ mysql |
วันศุกร์ที่ 27 ตุลาคม พ.ศ. 2560
แก้ไข InnoDB แสดงค่าโดยประมาณ
So how can we make phpMyAdmin show exact number of records for InnoDB tables?
Simple. Just open the config.inc.php in your phpMyAdmin installation directory and add this line:
$cfg['MaxExactCount'] = 2000000;
This configuration parameter sets the threshold that phpMyAdmin executes COUNT(*) against the table.
In this case, if the total number of recrods in this InnoDB table is larger than 2,000,000, the Rows count will be estimated, starting with a wave sign, ~; on the other hand, if the total number of records in this InnoDB table is smaller than 2,000,000, phpMyAdmin will run COUNT(*) against the table so an exact Rows count is displayed.
PHP 7.0 ไม่ทำงาน
apt-get install apache2 php7.0 libapache2-mod-php7.0
a2query -m php7.0
a2enmod php7.0
service apache2 restart
NanoPi NEO
Hardware Spec
- CPU: Allwinner H3, Quad-core Cortex-A7 Up to 1.2GHz
- DDR3 RAM: 256MB/512MB
- Connectivity: 10/100M Ethernet
- USB Host: Type-A x 1, 2.54 mm pin x 2
- MicroSD Slot x 1
- MicroUSB: OTG, for power input
- Debug Serial Port: 4Pin, 2.54 mm pitch pin header
- Audio input/output Port: 5Pin, 2.0mm pitch pin header
- GPIO: 2.54mm pitch 36pin. It includes UART, SPI, I2C, IO etc
- Power Supply: DC 5V/2A
- PCB Dimension: 40 x 40 mm
- Working Temperature: -40℃ to 80℃
- Weight: 14g(WITHOUT Pin-headers)
- OS/Software: u-boot, UbuntuCore and Android
NanoPi M1
Hardware Spec
- CPU: Allwinner H3, Quad-core Cortex-A7@1.2GHz
- GPU: Mali400MP2@600MHz,Supports OpenGL ES2.0
- DDR3 RAM: 512MB/1GB
- Connectivity: 10/100M Ethernet
- Audio: 3.5mm audio jack/Via HDMI
- Microphone: Onboard microphone
- IR Receiver: Onboard IR receiver
- USB Host:Type A, USB 2.0 x 3
- MicroSD Slot x 1
- MicroUSB: for data transmission and power input, OTG
- Video Output: HDMI 1.4 1080P, CVBS
- DVP Camera Interface: 24pin, 0.5mm pitch FPC seat
- Debug Serial Port: 4Pin, 2.54mm pitch pin header
- GPIO: 2.54mm spacing 40pin, compatible with Raspberry Pi's GPIO. It includes UART, SPI, I2C, IO etc
- User Key: Power LED x 1, Reset x 1
- PC Size: 64 x 56mm
- Power Supply: DC 5V/2A
- Working Temperature: -30℃ to 70℃
- OS/Software: u-boot,Ubuntu MATE,Debian
วันพฤหัสบดีที่ 26 ตุลาคม พ.ศ. 2560
ผังสลับขา เกือบพังไหมล่ะ
นานๆ ต่อสาย UART กับ NanoPi NEO สักที รอบนี้เกือบทำให้พังเพราะต่อขาผิด เคราะห์ดีแค่ UART สายไฟที่ต่อผิดก็ไม่ร้ายแรงอะไร
สาเหตุเพราะไปดูผังเวอร์ชันใหม่ แต่เครื่องที่ใช้เป็นเวอร์ชันเก่ากว่า เฮ้อ... ต้องบันทึกเก็บไว้ก่อนว่าของเราเป็นเวอร์ชัน 1.2 จำไว้ๆๆๆๆ จะได้ไม่เผอเรออีก...
สาเหตุเพราะไปดูผังเวอร์ชันใหม่ แต่เครื่องที่ใช้เป็นเวอร์ชันเก่ากว่า เฮ้อ... ต้องบันทึกเก็บไว้ก่อนว่าของเราเป็นเวอร์ชัน 1.2 จำไว้ๆๆๆๆ จะได้ไม่เผอเรออีก...
NanoPi NEO v1.31 ขาเสียงและ Debug สลับที่กันกับ Version 1.2 ขา GND จะอยู่ติดขอบ |
V1.2 ขา Debug จะติดกับ USB และขา GND จะอยู่ในสุด |
ผังแสดงขาบนบอร์ด Nanopi Neo แต่เวลาต่อสายให้สลับ tx กับ rx ด้วย |
ในรูปตัวข้างบนขา Debug กับ สาย USB จะสลับขา Rx Tx ดังนี้
Gnd -> Gnd
5v -> 5v
Tx -> Rx
Rx -> Tx
จากนั้นก็ใช้โปรแกรม Screen หรือ Putty สำหรับเชื่อมต่อกับบอร์ดอีกที...
วันศุกร์ที่ 16 มิถุนายน พ.ศ. 2560
วันอังคารที่ 9 พฤษภาคม พ.ศ. 2560
เปรียบเทียบสตริงใน C
ยอมรับสารภาพเลยว่าเลิกเขียนโปรแกรมภาษา C ในอดีตเมื่อหลายปีก่อนก็เพราะการเปรียบเทียบสตริงนี่แหละ ทำไม่ได้หาในหนังสือไม่มีวิธีแก้ไข สมัยนั้นยังไม่มี google และหนังสือก็มีน้อย เงินซื้อหนังสือก็น้อยด้วย
วันศุกร์ที่ 21 เมษายน พ.ศ. 2560
Arduino IDE บน Ubuntu 16.04 อัพโหลดไม่ได้
ขณะอัพโหลดโปรแกรมไปยัง Arduino ใน Ubuntu 16.04 พบว่ามี error
avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
วิธีการแก้ไขปัญหาให้พิมพ์
avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
วิธีการแก้ไขปัญหาให้พิมพ์
$ sudo usermod -a -G dialout <username>
$ sudo chmod a+rw /dev/ttyACM0
วันพุธที่ 12 เมษายน พ.ศ. 2560
วิธีการดาวน์โหลดโปรแกรม Qt จาก qt.io
โปรแกรม Qt เป็น IDE ที่ดีมากๆ สำหรับพัฒนาโปรแกรมในหลากหลายแพลตฟอร์ม ถึงแม้ว่าการทำงานจริงอาจจะช้ากว่า C++ อื่นๆ บ้าง ในบางครั้งแต่ก็ทำงานได้ดีโดยเฉพาะในส่วนที่ควบคุมฮาร์ดแวร์บน Raspberry Pi
วันจันทร์ที่ 3 เมษายน พ.ศ. 2560
Qt จาก Command Line
1. สร้างโฟลเดอร์ HelloQt
2. สร้างไฟล์ hello.cpp
nano hello.cpp
3. พิมพ์โค้ด
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]){
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
button->show();
return app.exec();
}
วันอังคารที่ 28 มีนาคม พ.ศ. 2560
ประวัติ Qt
ในเมื่อจะเรียนรู้การเขียนโปรแกรมด้วย Qt อยู่แล้วก็ควรที่จะเรียนรู้ประวัติความเป็นมาสักหน่อย เพื่อให้เข้าใจพื้นฐานมากยิ่งขึ้น
วันจันทร์ที่ 20 มีนาคม พ.ศ. 2560
เขียนโปรแกรมด้วย Qt: ตอนที่ 4 จัดการฟอร์ม
การเริ่มต้นเขียนโปรแกรมสิ่งที่สำคัญ คือ พื้นฐานและความเข้าใจอย่างถ่องแท้ทั้งเรื่องระบบงานที่จะเขียนโปรแกรม และเข้าใจเครื่องมือที่ใช้ในการพัฒนาโปรแกรม หลายครั้งที่มีคนถามว่าจะเริ่มต้นเรียนอะไรก่อน คำตอบมักจะได้รับจากผู้เขียน คือ "เริ่มที่แนวคิดและการทำงานพื้นฐาน"
ภาษา C ก็เช่นกัน สิ่งที่ควรเรียนรู้หลักๆ ก็ประกอบด้วย โครงสร้างการเขียนโปรแกรม การวนลูป การทำงานตามเงื่อนไข และการแปลงข้อมูล การเรียกใช้ฟังค์ชันที่เกี่ยวข้องต่างๆ ในเบื้องต้น
การเขียนโปรแกรมด้วย Qt ก็เช่นกัน พื้นฐานเป็นสิ่งสำคัญ นอกจากจะต้องรู้วิธีการเขียนโปรแกรมด้วยภาษา C++ แล้วยังต้องเข้าใจวิธีการของ Qt ตลอดถึงการใช้เครื่องมือในการพัฒนาโปรแกรม นั่นคือ ต้องเข้าใจเกี่ยวกับ IDE ให้มาที่สุด
แต่อย่างไรก็ตามเราคงไม่สามารถเรียนรูู้และเข้าใจโครงสร้างทั้งหมดได้ในระยะเวลาอันสั้น แต่สิ่งที่พึงตระหนักเป็นอย่างยิ่ง คือ วิธีการเขียนโปรแกรม และเทคนิคในการเขียนโปรแกรม ที่สำคัญที่สุด คือ หลักการ และสิ่งที่ควรเป็น การเขียนโปรแกรมก็ คือ ศิลปะชนิดหนึ่งที่ต้องอาศัยการออกแบบเพื่อให้ลงตัวทั้งผู้ใช้และโปรแกรม
ใน Qt จะมีส่วนที่เป็น Qt Creator ซึ่งเป็นส่วนการพัฒนาและออกแบบโปรแกรม ดังนั้นส่วนใหญ่จะต้องผ่านการออกแบบหน้าจอแบบ GUI อยู่มาก จึงจำเป็นต้องเข้าใจหลักการในการใช้งานก่อน
เมื่อกำหนดฟอร์มขึ้นมาสักหนึ่งฟอร์ม สิ่งที่ผู้เขียนโปรแกรมพึงคิดให้ตลอดว่าฟอร์มนั้นจะเป็นแบบไหน เวลาเรียกใช้งานจะแสดงแบบเต็มจอหรือไม่ แสดงกรอบไหม ใช้สีสันแบบใด กำหนดขนาดฟอร์ม ย่อได้ ขยายได้ไหม
สิ่งเหล่านี้ใน Qt สามารถจัดการได้หมด ในบทความนี้จะอธิบายในส่วนที่จำเป็นดังนี้
ภาษา C ก็เช่นกัน สิ่งที่ควรเรียนรู้หลักๆ ก็ประกอบด้วย โครงสร้างการเขียนโปรแกรม การวนลูป การทำงานตามเงื่อนไข และการแปลงข้อมูล การเรียกใช้ฟังค์ชันที่เกี่ยวข้องต่างๆ ในเบื้องต้น
การเขียนโปรแกรมด้วย Qt ก็เช่นกัน พื้นฐานเป็นสิ่งสำคัญ นอกจากจะต้องรู้วิธีการเขียนโปรแกรมด้วยภาษา C++ แล้วยังต้องเข้าใจวิธีการของ Qt ตลอดถึงการใช้เครื่องมือในการพัฒนาโปรแกรม นั่นคือ ต้องเข้าใจเกี่ยวกับ IDE ให้มาที่สุด
แต่อย่างไรก็ตามเราคงไม่สามารถเรียนรูู้และเข้าใจโครงสร้างทั้งหมดได้ในระยะเวลาอันสั้น แต่สิ่งที่พึงตระหนักเป็นอย่างยิ่ง คือ วิธีการเขียนโปรแกรม และเทคนิคในการเขียนโปรแกรม ที่สำคัญที่สุด คือ หลักการ และสิ่งที่ควรเป็น การเขียนโปรแกรมก็ คือ ศิลปะชนิดหนึ่งที่ต้องอาศัยการออกแบบเพื่อให้ลงตัวทั้งผู้ใช้และโปรแกรม
ใน Qt จะมีส่วนที่เป็น Qt Creator ซึ่งเป็นส่วนการพัฒนาและออกแบบโปรแกรม ดังนั้นส่วนใหญ่จะต้องผ่านการออกแบบหน้าจอแบบ GUI อยู่มาก จึงจำเป็นต้องเข้าใจหลักการในการใช้งานก่อน
การกำหนดขนาดและค่าต่างๆ ของฟอร์ม
ฟอร์มที่สร้างขึ้นใน Qt ก็ไม่ต่างจากฟอร์มใน Visual Studio มากนัก เพียงแต่วิธีการและการเรียกในส่วนต่างๆ ไม่เหมือนกันเมื่อกำหนดฟอร์มขึ้นมาสักหนึ่งฟอร์ม สิ่งที่ผู้เขียนโปรแกรมพึงคิดให้ตลอดว่าฟอร์มนั้นจะเป็นแบบไหน เวลาเรียกใช้งานจะแสดงแบบเต็มจอหรือไม่ แสดงกรอบไหม ใช้สีสันแบบใด กำหนดขนาดฟอร์ม ย่อได้ ขยายได้ไหม
สิ่งเหล่านี้ใน Qt สามารถจัดการได้หมด ในบทความนี้จะอธิบายในส่วนที่จำเป็นดังนี้
หน้าจอกำหนดขนาดของฟอร์ม |
เขียนโปรแกรมด้วย Qt: ตอนที่ 3 Layouts
widget ใน Qt จะหมายถึงออบเจกต์ต่างๆ ที่มีไว้เพื่อควบคุมการทำงาน หรือเป็นส่วนที่ติดต่อกับผู้ใช้งาน ซึ่งจะเหมือนกับ control ในโปรแกรมที่เขียนผ่านระบบปฏิบัติการ Windows
การเพิ่ม widget ต่างๆ นั้นทำได้ง่ายๆ คือ ลากวางลงบนฟอร์ม แต่สิ่งที่ดูเหมือนจะไม่ง่าย คือ การจัดเรียงชิ้นส่วนต่างๆ ให้สวยงาม แต่ถ้าเข้าใจหลักการแล้วก็ไม่ยาก
บน Windows การวางคอนโทรลส่วนใหญ่จะง่ายในการกำหนดตำแหน่ง เพราะสามารถกำหนดตำแหน่งหรือ Position ได้โดยตรง คือ มีการกำหนดผ่าน Properties ของออบเจ็กต์ แต่สำหรับ Qt ก็มี Properties เหมือนกัน แต่กว่าจะกำหนดได้ บางครั้งก็วุ่นวาย ยากเย็นแสนเข็ญ
แต่กลับกัน การทำงานแบบ Responsive หรือ การเปลี่ยนแปลงตามหน้าจออุปกรณ์ที่ใช้งานในโลกของ Qt กลับทำได้ง่ายกว่า และง่ายมากด้วย (ถ้าเข้าใจหลักการ)
สิ่งที่ทำให้การจัดเรียง widgets บนฟอร์มทำได้ง่ายๆ นั้นเพราะมี Layouts และ Spacer มาช่วยจัดการ โดย Layout จะมี อยู่ 4 แบบ คือ
การเพิ่ม widget ต่างๆ นั้นทำได้ง่ายๆ คือ ลากวางลงบนฟอร์ม แต่สิ่งที่ดูเหมือนจะไม่ง่าย คือ การจัดเรียงชิ้นส่วนต่างๆ ให้สวยงาม แต่ถ้าเข้าใจหลักการแล้วก็ไม่ยาก
บน Windows การวางคอนโทรลส่วนใหญ่จะง่ายในการกำหนดตำแหน่ง เพราะสามารถกำหนดตำแหน่งหรือ Position ได้โดยตรง คือ มีการกำหนดผ่าน Properties ของออบเจ็กต์ แต่สำหรับ Qt ก็มี Properties เหมือนกัน แต่กว่าจะกำหนดได้ บางครั้งก็วุ่นวาย ยากเย็นแสนเข็ญ
แต่กลับกัน การทำงานแบบ Responsive หรือ การเปลี่ยนแปลงตามหน้าจออุปกรณ์ที่ใช้งานในโลกของ Qt กลับทำได้ง่ายกว่า และง่ายมากด้วย (ถ้าเข้าใจหลักการ)
สิ่งที่ทำให้การจัดเรียง widgets บนฟอร์มทำได้ง่ายๆ นั้นเพราะมี Layouts และ Spacer มาช่วยจัดการ โดย Layout จะมี อยู่ 4 แบบ คือ
- Vertical Layout เป็นการจัดเรียงแนวตั้ง
- Horizontal Layout เป็นการจัดเรียงแนวนอน
- Grid Layout เป็นการจัดเรียงแบบกริด คือ จะแบ่งหน้าจอเท่ากันแล้วเรียงจากซ้ายไปขวา และบนลงล่าง เป็นตารางช่องเท่าๆ กัน ก็เหมือนการวาง icon บนหน้าจอโทรศัพท์ หรือ คอมพิวเตอร์นั่นแหละ
- Form Layout เป็นการวางแบบ Form คือ มีข้อความด้านซ้าย และ widget อยู่ขวามือ
เขียนโปรแกรมด้วย Qt: ตอนที่ 2 เล่นกับฟอร์ม
สำหรับ ตอนที่ 1 ก็พาไปรู้จักกับ IDE ของ Qt แล้วตอนนี้ เป็นตอนที่ 2: เล่นกับฟอร์ม, คิดชื่อบทความไม่ค่อยออก และจุดมุ่งหมายก็ยังไม่ชัดเจน แต่จะเป็นการเล่นอะไรหลายๆ อย่างบนฟอร์มที่เราสร้างขึ้น (มีอะไรก็ใส่ๆ ไปครับ) 😅
ก่อนที่จะเข้าไปยำใหญ่เกี่ยวกับฟอร์มก็ขอ ขยายความ เกี่ยวกับศัพท์ที่พบเจอกันบ่อยๆ ใน Qt และจะงงกัน (ผู้เขียนก็ยังงงๆ อยู่เหมือนกัน)
Window, Widget, Dialog สามคำนี้จะวนเวียนอยู่ในโลกแห่งการเขียนโปรแกรมมากพอสมควร โดยแต่ละส่วนก็จะมีความหมายพอจะอธิบายได้ว่า (ความหมายในโลกของ Qt)
Window คือ ส่วนที่อยู่ Top-level หรือบนสุด หรือจะเรียกว่าอยู่ล่างสุดเป็นฉากหลัง เป็นแหล่งกำหนดหรือที่ตั้งอยู่ของสิ่งต่างๆ นั่นแหละ แต่ที่เรียกว่า Top-Level นั้นเพราะมองจากลำดับของ Object
Widget คือ ส่วนประกอบต่างๆ หรือ Object ต่างๆ ที่อยู่บน Window ในโลกของ Unix เรียกว่า Widget ส่วนโลกของ Windows เรียก Controls นั่นก็ คือ objects ทั้งหลายนั่นแล (จะต่างจาก Widget ในโลกมือถือหรือโปรแกรมอื่นๆ นิดหน่อยตรงที่ Widget ในโลกอื่นที่ไม่ใช่ Qt หมายถึงส่วนควบคุมหรือส่วนเล็กๆ ที่สามารถทำงานได้ คล้ายๆ กับ Gadget; อ้าว ยิ่งงงไปกันใหญ่) 😁
Dialog คือ Window ชนิดหนึ่งและเป็นหน้าต่างที่ปรากฏขึ้นเป็นครั้งคราว ไม่ได้แสดงแบบถาวร เช่น สร้างหน้าจอเพื่อแสดงข้อความแจ้งให้ทราบ หรือข้อความถามแล้วให้เลือกต่อ Yes No Ok และ Cancel แต่หลักการแล้วก็เหมือน window ทุกประการเพียงแต่ต่างกันตรงวัตถุประสงค์การใช้งาน
ใครที่เขียนเว็บมาบ้างแล้วย่อมรู้จักอานิสงส์ของ Style Sheet เป็นอย่างดี เพราะมันสามารถทำให้หน้าเว็บไซต์ไม่จืดชืด ลูกเล่นแพรวพราว และเมื่อ Qt ได้นำเอาคุณสมบัตินั้นมาใช้กับการเขียนโปรแกรมแล้วจะดีมากแค่ไหน และเขียนด้วย C++ แล้วมี Style Sheet โอ้ววว มันช่างอัศจรรย์เสียจริงๆ (IDE อื่นๆ ก็คงทำได้เหมือนกัน ใครทราบแนะนำด้วย)
ก่อนที่จะเข้าไปยำใหญ่เกี่ยวกับฟอร์มก็ขอ ขยายความ เกี่ยวกับศัพท์ที่พบเจอกันบ่อยๆ ใน Qt และจะงงกัน (ผู้เขียนก็ยังงงๆ อยู่เหมือนกัน)
Window, Widget, Dialog สามคำนี้จะวนเวียนอยู่ในโลกแห่งการเขียนโปรแกรมมากพอสมควร โดยแต่ละส่วนก็จะมีความหมายพอจะอธิบายได้ว่า (ความหมายในโลกของ Qt)
Window คือ ส่วนที่อยู่ Top-level หรือบนสุด หรือจะเรียกว่าอยู่ล่างสุดเป็นฉากหลัง เป็นแหล่งกำหนดหรือที่ตั้งอยู่ของสิ่งต่างๆ นั่นแหละ แต่ที่เรียกว่า Top-Level นั้นเพราะมองจากลำดับของ Object
Widget คือ ส่วนประกอบต่างๆ หรือ Object ต่างๆ ที่อยู่บน Window ในโลกของ Unix เรียกว่า Widget ส่วนโลกของ Windows เรียก Controls นั่นก็ คือ objects ทั้งหลายนั่นแล (จะต่างจาก Widget ในโลกมือถือหรือโปรแกรมอื่นๆ นิดหน่อยตรงที่ Widget ในโลกอื่นที่ไม่ใช่ Qt หมายถึงส่วนควบคุมหรือส่วนเล็กๆ ที่สามารถทำงานได้ คล้ายๆ กับ Gadget; อ้าว ยิ่งงงไปกันใหญ่) 😁
Dialog คือ Window ชนิดหนึ่งและเป็นหน้าต่างที่ปรากฏขึ้นเป็นครั้งคราว ไม่ได้แสดงแบบถาวร เช่น สร้างหน้าจอเพื่อแสดงข้อความแจ้งให้ทราบ หรือข้อความถามแล้วให้เลือกต่อ Yes No Ok และ Cancel แต่หลักการแล้วก็เหมือน window ทุกประการเพียงแต่ต่างกันตรงวัตถุประสงค์การใช้งาน
Form Style Sheet
สิ่งแรกที่จะพาไปเล่นกับฟอร์ม คือ การเปลี่ยนแปลงสีของฟอร์มผ่าน Style Sheet และนี่แหละที่เป็นจุดเด่นของ Qt และเด่นมากจนหลังๆ จะกลายเป็น Java Scripts ไปทุกทีแล้วใครที่เขียนเว็บมาบ้างแล้วย่อมรู้จักอานิสงส์ของ Style Sheet เป็นอย่างดี เพราะมันสามารถทำให้หน้าเว็บไซต์ไม่จืดชืด ลูกเล่นแพรวพราว และเมื่อ Qt ได้นำเอาคุณสมบัตินั้นมาใช้กับการเขียนโปรแกรมแล้วจะดีมากแค่ไหน และเขียนด้วย C++ แล้วมี Style Sheet โอ้ววว มันช่างอัศจรรย์เสียจริงๆ (IDE อื่นๆ ก็คงทำได้เหมือนกัน ใครทราบแนะนำด้วย)
Change styleSheet |
วันอาทิตย์ที่ 19 มีนาคม พ.ศ. 2560
เขียนโปรแกรมด้วย Qt: ตอนที่ 1 รู้จักส่วนประกอบของหน้าจอ IDE
วันอาทิตย์ที่ 12 มีนาคม พ.ศ. 2560
Qt Quick Application
การสร้างโปรแกรม GUI ด้วยภาษา C ในอดีตถือว่าเป็นเรื่องยาก กว่าจะสร้างได้ต้องเขียนคำสั่งกันยาวเหยียด ถึงแม้ว่า Visual C++ ของไมโครซอฟท์จะมีหน้าจอสร้างโปรแกรมแบบ GUI แต่ก็ต้องเขียนคำสั่งอีกมาก แต่พอ Visual Studio ปล่อย C# เฟรมเวิร์คออกมาทำให้เกิดการเปลี่ยนแปลงอย่างมาก การเขียนโปรแกรมง่ายขึ้น มีหน้าจอ GUI ช่วยให้ผู้เขียนสามารถสร้างฟอร์ม สร้างโปรแกรมได้ง่ายขึ้น เน้นลากวางกำหนด Properties และเขียนโค้ดควบคุมไม่มากเท่ากับ C++
ส่วนใน Linux การเขียนโปรแกรมก็ยัง อยู่ในรูปแบบเขียนคำสั่งเพื่อเรียกใช้คอนโทรลต่างๆ ของ GUI มีหลากหลาย เช่น GTK, wxWidgets และ Qt
สำหรับ Qt ก็สามารถเลอกเขียนโปรแกรมแบบเขียนคำสั่งอย่างเดียวก็ได้ หรือจะใช้ GUI ในการสร้าง Interface ก็ได้และทำได้ดีผ่านโปรแกรม QtCreator ซึ่งพัฒนาความสามารถมากขึ้นทุกวัน
ส่วนใน Linux การเขียนโปรแกรมก็ยัง อยู่ในรูปแบบเขียนคำสั่งเพื่อเรียกใช้คอนโทรลต่างๆ ของ GUI มีหลากหลาย เช่น GTK, wxWidgets และ Qt
สำหรับ Qt ก็สามารถเลอกเขียนโปรแกรมแบบเขียนคำสั่งอย่างเดียวก็ได้ หรือจะใช้ GUI ในการสร้าง Interface ก็ได้และทำได้ดีผ่านโปรแกรม QtCreator ซึ่งพัฒนาความสามารถมากขึ้นทุกวัน
วันศุกร์ที่ 3 มีนาคม พ.ศ. 2560
qtcreator เก็บ signal และ slot ไว้ตรงไหน
การเขียนโปรแกรมบน Qt จะมีส่วนหนึ่งที่แตกต่างจาก Framework อื่นคือ Signal และ Slot โดยหลักการที่จริงแล้วก็เหมือนกันเพียงแต่ Qt เขาพัฒนาแนวคิดมาอีกแบบหนึ่ง
เวลาเราดำเนินการอะไรจากออบเจ็กต์หนึ่งแล้วย่อมต้องการผลจากการกระทำนั้นไปปรากฏยังออบเจ็กต์หนึ่ง (ไม่งั้นจะทำไปทำไม ใช่ไหมครับ) เช่น เราคลิกปุ่มที่กำหนดเป็นปุ่ม Close เราย่อมต้องการให้ปิดหน้าต่างการแสดงผล
ใน Qt มีหลักการว่า เวลาที่เราคลิกนั้นฝั่งผู้ส่ง (Sender) จะเกิด Signal ขึ้นโดยสัญญานที่เกิดขึ้นนั้นจะส่งต่อไปยังผู้รับ (receive) ผ่านฟังค์ชันหนึ่งเราจะเรียกฟังค์ชันนั้นว่า Slot
ที่สำคัญหนึ่ง Signal สามารถส่งไปให้กับหลายออบเจกต์ หรือออบเจ็กต์เดียวหลาย Slot ก็นับว่าสะดวกดี
เวลาเราดำเนินการอะไรจากออบเจ็กต์หนึ่งแล้วย่อมต้องการผลจากการกระทำนั้นไปปรากฏยังออบเจ็กต์หนึ่ง (ไม่งั้นจะทำไปทำไม ใช่ไหมครับ) เช่น เราคลิกปุ่มที่กำหนดเป็นปุ่ม Close เราย่อมต้องการให้ปิดหน้าต่างการแสดงผล
ใน Qt มีหลักการว่า เวลาที่เราคลิกนั้นฝั่งผู้ส่ง (Sender) จะเกิด Signal ขึ้นโดยสัญญานที่เกิดขึ้นนั้นจะส่งต่อไปยังผู้รับ (receive) ผ่านฟังค์ชันหนึ่งเราจะเรียกฟังค์ชันนั้นว่า Slot
ที่สำคัญหนึ่ง Signal สามารถส่งไปให้กับหลายออบเจกต์ หรือออบเจ็กต์เดียวหลาย Slot ก็นับว่าสะดวกดี
ตัวอย่างในภาพนี้ LineEdit จะส่ง Signal ชื่อ textChanged ไปยัง Slot ชื่อ setText ของ Label และ LineEdit ที่อยู่ด้านล่าง |
วันพฤหัสบดีที่ 2 มีนาคม พ.ศ. 2560
โปรแกรมแรกจาก Qt และรายละเอียดในไฟล์ต่างๆ
การเขียนโปรแกรมครั้งแรกในภาษาต่างๆ มักจะนิยมเขียนคำว่า Hello World จนกลายเป็นเรื่องปกติไปแล้ว ในบทความนี้ก็เช่นกัน ขอเริ่มต้นง่ายๆ ด้วยการสร้างโปรแกรมง่ายๆ จาก Qt ก่อนเพื่อทดสอบว่าระบบใช้งานได้ตามปกติหรือไม่
วันจันทร์ที่ 27 กุมภาพันธ์ พ.ศ. 2560
ติดตั้ง Qt5, Qt Creator และ library mysql client.
การเชื่อมต่อ MySql ด้วย Qt ก็เป็นสิ่งจำเป็นเพราะการเขียนโปรแกรมย่อมต้องมีบันทึกข้อมูลหรือเก็บข้อมูลต่างๆ โดยปกติแล้วการเชื่อมต่อโปรแกรมกับฐานข้อมูลต่างๆ ย่อมต้องอาศัยตัวกลางในการเชื่อมต่อข้อมูลตามโปรแกรมนั้นๆ สำหรับ MySql ก็เช่นกัน
sudo apt-get install qt5-default
sudo apt-get install build-dep
sudo apt-get install libqt5sql5-mysql libmysqlclient-dev libmysql++-dev build-essential cmake mysql-client mysql-server
sudo apt-get install qtcreator
sudo apt-get install qt5-default
sudo apt-get install build-dep
sudo apt-get install libqt5sql5-mysql libmysqlclient-dev libmysql++-dev build-essential cmake mysql-client mysql-server
sudo apt-get install qtcreator
วันพุธที่ 22 กุมภาพันธ์ พ.ศ. 2560
วิธีการติดตั้ง Qt
Qt (ออกเสียง คิวท์ เหมือนคำว่า cute) เป็นระบบโปรแกรมที่ดีตัวหนึ่งในเวลานี้ ทำให้การเขียนโปรแกรมภาษาซีไม่ยุ่งยาก หรือยุ่งยากน้อยกว่าอดีต ถึงแม้ว่าทาง Microsoft จะออก C# ที่ทำให้ระบบการเขียนโปรแกรมง่ายกว่า C++ ในอดีตมาก แต่อย่างไรก็ตาม C# ก็เป็นเฟรมเวิร์คตัวหนึ่งของภาษา C แต่จะสามารถใช้งานบนระบบพื้นฐานของ Windows เท่านั้น
Qt ก็เป็นเฟรมเวิร์คเหมือนกับ C# แต่ข้อดีของ Qt คือ สามารถทำงานบน Linux, Mac, PC และเครื่องแบบ Arm จำพวก Raspberry Pi หรือ Arm Controller อื่นๆ
หน้าจอ Qt Creator ที่ทำให้ผู้เขียนโปรแกรมสามารถพัฒนา GUI ได้ง่ายขึ้น |
Qt ก็เป็นเฟรมเวิร์คเหมือนกับ C# แต่ข้อดีของ Qt คือ สามารถทำงานบน Linux, Mac, PC และเครื่องแบบ Arm จำพวก Raspberry Pi หรือ Arm Controller อื่นๆ
วันเสาร์ที่ 4 กุมภาพันธ์ พ.ศ. 2560
Qt: โหลด mysql แล้ว Error
กำลังพัฒนาระบบโดยใช้ MySQL เป็นฐานข้อมูล และใช้ Qt C++ เป็นตัวพัฒนาระบบ การทำงานแบบ GUI อื่นๆ ก็ใช้ได้ผลดี ง่ายต่อการใช้งานและเรียนรู้ แต่ประเด็นปัญหากับเกิดขึ้นเมื่อใช้ MySQL หรือ MariaDB โดยมีข้อความขณะรันโปรแกรมว่า
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
ดูจากข้อความที่ได้แล้วจะเห็นว่า Plugin เกี่ยวกับ SQL Database มีทั้งหมด 7 รายการรวมถึง MySQL ด้วย แต่ทำไมถึงบอกว่าไดร์เวอร์ไม่ได้โหลดใช้งาน
เข้าไปค้นใน google แล้วก็พบว่าปัญหาเกี่ยวกับ libmysql.dll ซึ่งเป็นตัวเชื่อมต่อไปยังฐานข้อมูล ให้คัดลอกไปไว้ในโฟลเดอร์ที่โปรแกรมทำงานด้วย ก็เข้าไปใน MariaDB คัดลอกไฟล์ไปแล้วก็ใช้ไม่ได้ เข้าไปโหลดทั้ง MaridDB Connector และ MySQL Connector ก็ยังใช้ไม่ได้
สุดท้ายเห็นเว็บบอร์ดแห่งหนึ่งบอกว่าให้โหลด MySQL Server แล้วขยายไฟล์และคัดลอกไฟล์ libmysql.dll ไปใช้งาน
เอ้า ลองดูสิ
ว้าว! มันใช้งานได้ ก็อดแปลกใจนิดๆ ว่าทำไม MySQL Connector ทำไมใช้ไม่ได้ ก็งงๆ ไปก่อนเดี๋ยวค่อยหาข้อมูลต่อว่าทำไมถึงเป็นเช่นนั้น
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
ดูจากข้อความที่ได้แล้วจะเห็นว่า Plugin เกี่ยวกับ SQL Database มีทั้งหมด 7 รายการรวมถึง MySQL ด้วย แต่ทำไมถึงบอกว่าไดร์เวอร์ไม่ได้โหลดใช้งาน
เข้าไปค้นใน google แล้วก็พบว่าปัญหาเกี่ยวกับ libmysql.dll ซึ่งเป็นตัวเชื่อมต่อไปยังฐานข้อมูล ให้คัดลอกไปไว้ในโฟลเดอร์ที่โปรแกรมทำงานด้วย ก็เข้าไปใน MariaDB คัดลอกไฟล์ไปแล้วก็ใช้ไม่ได้ เข้าไปโหลดทั้ง MaridDB Connector และ MySQL Connector ก็ยังใช้ไม่ได้
สุดท้ายเห็นเว็บบอร์ดแห่งหนึ่งบอกว่าให้โหลด MySQL Server แล้วขยายไฟล์และคัดลอกไฟล์ libmysql.dll ไปใช้งาน
เอ้า ลองดูสิ
ว้าว! มันใช้งานได้ ก็อดแปลกใจนิดๆ ว่าทำไม MySQL Connector ทำไมใช้ไม่ได้ ก็งงๆ ไปก่อนเดี๋ยวค่อยหาข้อมูลต่อว่าทำไมถึงเป็นเช่นนั้น
สมัครสมาชิก:
บทความ (Atom)
Gtk4 ตอนที่ 6 Defining a Child object
Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...
-
นักอิเลกโทรนิกส์ทั้งหลายคงจะเข้าใจวิธีวัดค่าของไดโอดเปล่งแสง หรือ LED เป็นอย่างดี แต่สำหรับมือใหม่ ย่อมต้องเรียนรู้ หาประสบการณ์ต่อไปเรื่อยๆ...
-
Ubuntu เป็น OS ที่นิยมนำมาใช้เป็นเซิร์ฟเวอร์อย่างแพร่หลาย ด้วยการติดตั้งง่าย การแก้ไขปัญหาก็ทำได้ดีเพราะมีเอกสาร คนใช้งานอยู่มาก และโดยปกติ ...
-
ยอมรับสารภาพเลยว่าเลิกเขียนโปรแกรมภาษา C ในอดีตเมื่อหลายปีก่อนก็เพราะการเปรียบเทียบสตริงนี่แหละ ทำไม่ได้หาในหนังสือไม่มีวิธีแก้ไข สมัยนั้นยั...