วันพุธที่ 24 พฤศจิกายน พ.ศ. 2564

ใช้งาน DigiSpark Attiny85 บน Linux Mint

ไปค้นอุปกรณ์ก็ไปเจอ Attiny 85 ของ DigiSpark เข้าซื้อมาก็ยังไม่ได้ลองใช้งาน เลยเอามาลองต่อกับ Linux Mint สักหน่อย เห็นมี USB แบบ Micro ก็ลองเชื่อมกับ Arduino IDE แล้วเพิ่มบอร์ด โดยเพิ่มที่ File > Preferences > Additional Boards Managers URLs: โดยเพิ่ม

http://digistump.com/package_digistump_index.json 

ลงในช่องแล้วเข้าไปที่ Tools > Bord > Board Managers เลือก Digistump AVR Boards แล้วคลิก Install

หลังจากติดตั้งแล้วก็จะมีบอร์ดเพิ่มขึ้น แต่อย่างไรก็ตามเวลาอัพโหลดกลับมีปัญหา Error 


Running Digispark Uploader...

Plug in device now... (will timeout in 60 seconds)

/home/yothinin/.arduino15/packages/digistump/tools/micronucleus/2.0a4/micronucleus: error while loading shared libraries: libusb-0.1.so.4: cannot open shared object file: No such file or directory


พยายามหาวิธีแก้ไขจากเน็ตไม่ว่าจะลงไลบรารีหรือสร้างไฟล์ rules ก็ไม่สามารถอัพโหลดได้ สุดท้ายเข้าไปดาวน์โหลดไฟล์ที่

https://github.com/micronucleus/micronucleus

เมื่อแตกไฟล์ zip ที่ดาวน์โหลดมาแล้วก็เข้าไปที่ commandline แล้วสร้างไฟล์ และ install ใหม่ผ่านคำสั่ง

make
sudo make install 

จากนั้นก็จะมีไฟล์ micronucleus เพื่ออัพโหลด แต่วิธีอัพโหลดก็ต้องเอาไฟล์คอมไพล์ออกจาก Arduino IDE มาไว้ที่โฟลเดอร์ใหม่ก่อน คือ

แก้ไขไฟล์ ~/.arduino15/preferences.txt ซึ่งโฟลเดอร์นี้จะซ่อนอยู่ใน home ของผู้ใช้งาน โดยเพิ่มการกำหนดค่าพาธเก็บไฟล์โปรแกรมดังนี้

build.path=/home/yothinin/Arduino/OUTPUT

หลังจากนั้นคอมไพล์ที่ Arduino IDE แล้วไปที่พาธเก็บไฟล์แล้วอัพโหลดดังนี้

1. ถอดอุปกรณ์ออกก่อน
2. รันคำสั่ง micronucleus --run ชื่อไฟล์.hex 
3. ที่หน้าจอจะบอกให้เสียบอุปกรณ์ เมื่อเสียบแล้วระบบจะอัพโหลดเมื่อสำเร็จจะได้หน้าจอแจ้งแบบนี้

yothinin@yothinin-h8-1230l:~/Arduino/OUTPUT$ micronucleus --run led0.ino.ino.hex 
> Please plug in the device ... 

... ให้เสียบอุปกรณ์ ...

> Device is found!
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94  page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 66% complete
>> Eep! Connection to device lost during erase! Not to worry
>> This happens on some computers - reconnecting...
erasing: 66% complete
> Starting to upload ...
writing: 83% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!

วิธีการนี้ก็ง่ายดีเหมือนกัน แต่ก็ยังไม่สามารถอัพโหลดผ่าน Arduino IDE ได้...



วันอังคารที่ 16 พฤศจิกายน พ.ศ. 2564

Stk500 MkII + PL2303 อัพโหลดไม่ได้

หลังจากที่ใช้ Stk500 MkII ไม่ผ่านการแปลงเป็น serial port ก็สามารถอัพโหลดผ่านคำสั่ง

avrdude -p m16 -c stk500v2 -U flash:w:led.hex:i -F -P usb_device -vvv

แต่คิดได้ว่ามี Stk500 อยู่อีกอันหนึ่งที่เคยซื้อมาแล้วใช้ไม่ได้ ตอนนั้นก็ยังไม่มีความรู้เชิงลึก ก็เลยต้องสั่งอันใหม่มา คิดว่าอันเดิมเสีย แต่กว่าจะอัพโหลดได้ก็ต้องอ่านเอกสารอีกหลายชุด

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

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/home/yothinin/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb_device
         Using Programmer              : stk500v2
avrdude: usbdev_open(): did not find any USB device "usb_device" (0x03eb:0x2104)

avrdude done.  Thank you.

จากข้อความข้างบนอุปกรณ์ใช้ Port เป็น usb_device จึงเปลี่ยนเป็น /dev/ttyUSB0 ดังนี้

avrdude -p m16 -c stk500v2 -U flash:w:led.hex:i -F -P /dev/ttyUSB0 -e

เมื่อเปลี่ยน -P จาก usb เป็น /dev/ttyUSB0 ก็สามารถอัพโหลดได้



อ่านเพิ่มเติม วิธีการใช้ Stk500 Clone

UsbAsp โปรแกรมบอร์ดไม่ได้

 หลังจากที่อัพเกรดเฟิร์มแวร์ให้กับ UsbAsp แล้วก็มีปัญหาอัพโหลดได้ครั้งเดียว หลังจากนั้นก็ไม่สามารถอัพโหลดได้ ต้องถอดออกแล้วเสียบเข้าไปใหม่ถึงจะอัพโหลดได้

ลองหาข้อมูลก็ไปพบเว็บหนึ่งที่อธิบายการอัพเกรดเฟิร์มแวร์แล้วให้เซ็ต jumper สำหรับ Very Low Frequency เพื่ออัพโหลดบอร์ดบางบอร์ทที่ตอบสนองไม่ทัน แต่ถ้าไม่เซ็ต jumper ก็ใช้ออปชัน -B โดยกำหนด -B 1024 ก็ลองกำหนดตาม ก็สามารถอัพโหลดได้ตามปกติ และลองกำหนดค่าที่เหมาะสมได้ -B 10 เป็นต้นไป ถ้าต่ำกว่านี้ก็อัพโหลดไม่ได้

$ avr-gcc -Wall -g -Os -mmcu=atmega16 -o led.bin led.c
$ avr-objcopy -j .text -j .data -O ihex led.bin led.hex
$ avrdude -p m16 -c usbasp -U flash:w:led.hex:i -F -P usb

avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1859e0
avrdude: Expected signature for ATmega16 is 1E 94 03
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude done.  Thank you.


ตัวอย่างโปรแกรม

led.c

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

int main(void){
  DDRD  = 0x00;
  PORTD = 0x00;
  DDRB  = 0xff;      //PB0-7 as output.
  PORTB = 0xff;

  while (1){
    if((PIND&(1<<PIN7)) == (1<<PIN7)){
      PORTB = (PORTB == 0xff)?(PORTB <<1):(PORTB<<1)|1;
      _delay_ms(50);
    }else{
      PORTB = 0xff;
    }
  }
  return 0;
}


คอมไพล์และสร้างไฟล์ .hex

avr-gcc -Wall -g -Os -mmcu=atmega16 -o led.bin led.c
avr-objcopy -j .text -j .data -O ihex led.bin led.hex

อัพโหลดโปรแกรม

avrdude -p m16 -c usbasp -U flash:w:led.hex:i -F -P usb_device -B 100


ลองใช้ Stk500 MkII

Stk500 MkII เป็น avrisp สำหรับ AVR Board ใช้ได้หลากหลายโดยเราจะโปรแกรมผ่านพอร์ต isp แต่เมื่อลองใช้ครั้งแรกบน ARM ของ OrangePi One ก็มีปัญหา error ดังนี้ 

yothinin@orangepione:~/avr_c/avr-gcc/ex$ avrdude -p m328p -c avrispmkii  -U flash:w:blink13.hex:i -F -P usb_device

avrdude: stk500v2_command(): command failed
avrdude: stk500v2_program_enable(): bad AVRISPmkII connection status: Target not detected
avrdude: initialization failed, rc=-1
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x3088d6
avrdude: Expected signature for ATmega328P is 1E 95 0F
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.

avrdude done.  Thank you.

พยายามค้นหาข้อมูลในเน็ตอยู่นานก็ยังไม่ได้คำตอบ เลยเข้าไปดูรายละเอียดของอุปกรณ์ที่เว็บของ AVRISP ก็มีสถานะดังนี้


Red    อุปกรณ์ปลายทางไม่มีไฟเลี้ยง

สาเหตุก็คือ ตัวบอร์ด Uno ไม่มีไฟเลี้ยงนั่นเอง เพราะเคยชินกับ UsbAsp กับบอร์ดทดลอง ที่ไฟเลี้ยงมาจาก UsbAsp ก็สามารถอัพโหลดโปรแกรมได้ แต่สำหรับ Stk500 MkII นั้นจ่ายไฟเลี้ยงไปไม่เพียงพอ

เมื่อหาอะแดปเตอร์มาเสียบให้กับ Uno ก็สามารถอัพโหลดโปรแกรมได้

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรมให้ไฟ LED กระพริบ โดยเลือกใช้ Buil in LED ที่อยู่ในบอร์ด Uno โดยจะเรียกว่า pin13 หรือ PB5 หรือ 0b000100000 หรือเขียนสั้นลงเป็น 0b100000

blink13.c

#include <avr/io.h>

#define F_CPU 16000000
#define BLINK_DELAY_MS 250

#include <util/delay.h>

int main (void)
{
  // Arduino digital pin 13 (pin 5 of PORTB) for output
  DDRB |= 0B100000; // PORTB5

  while(1) {
    // turn LED on
    PORTB |= 0B100000; // PORTB5
    _delay_ms(BLINK_DELAY_MS);

    // turn LED off
    PORTB &= ~ 0B100000; // PORTB5
    _delay_ms(BLINK_DELAY_MS);
  }
}

คอมไพล์

avr-gcc -Wall -g -Os -mmcu=atmega328p -o blink13.bin blink13.c


เปลี่ยนไฟล์ให้เป็น hex

avr-objcopy -j .text -j .data -O ihex blink13.bin blink13.hex

อัพโหลดโปรแกรม

avrdude -p m328p -c stk500v2 -U flash:w:blink13.hex:i -F -P usb_device -B100 -v

พารามิเตอร์ -B 100 กำหนดให้อัพโหลดแบบ Very Low Frequency เพื่อให้อัพโหลดช้าลง (ใช้สำหรับบอร์ดบางรุ่นที่รับโค้ดไม่ทัน) และ -v แสดงรายละเอียดการอัพโหลด สามารถใส่ -vvv ได้


วันเสาร์ที่ 30 ตุลาคม พ.ศ. 2564

mariadb can't lock aria control file.

หลังจากติดตั้ง mariadb แล้วก็เจอ error ว่า Can't lock aria control file '/srv/dbs/mariadb/aria_log_control' for exclusive use, error: 11. Will retry for 30 seconds พยายามค้นหาก็เจอวิธีการให้ลบไฟล์ aria_log.00000001 aria_log_control เมื่อลบแล้วก็เข้า mariadb ไม่ได้ ค้นหาในอินเตอร์เน็ตให้ลบไฟล์ ib_logfile0 เมื่อลบแล้วก็ลองสตาร์ mariadb ด้วยคำสั่ง service mariadb start ก็ผ่านไปด้วยดี

ดึงข้อมูลออกจาก mysql_query.log

mysql จะมีออปชันสำหรับบันทึกเหตุการณ์หรือ log สำหรับการใช้คำสั่งของ sql โดยแบ่งออกเป็น 2 ส่วน คือ general และ slow queries สำหรับ general เป็นไฟล์เก็บข้อมูลคำสั่งทั้งหมดของ sql ที่รัน โดยไฟล์นี้จะใหญ่มาก ก็ต้องมีการจัดการให้ดี

ส่วน slow queries เป็นไฟล์เก็บคำสั่ง sql ที่สั่งรันแล้วใช้เวลานาน อาจจะตั้งไว้เช่น 1 วินาท 2 วินาที หรือตามที่เรากำหนด

ตัวอย่างไฟล์ mysql.log

 

ในกรณีนี้ผู้เขียนมีความต้องการดึงเอาเฉพาะคำสั่งที่เป็น SELECT ทั้งหมดออกจากไฟล์ เพื่อเอาไปรันในการจำลองการทำงาน และการดึงข้อมูลหนักๆ เพื่อวิเคราะห์ประสิทธิภาพของ mysql จากรูปแบบไฟล์แล้วจะต้องกำหนดขอบเขตดังนี้

  1. เลือกเฉพาะบรรทัดที่มีคำสั่ง SELECT
  2. ตัดเอาข้อความตั้งแต่ SELECT ไปจนหมดบรรทัด
  3. เพิ่มเครื่องหมาย ; ต่อท้ายในแต่ละบรรทัด
สุดท้ายให้เก็บไว้เป็นไฟล์ sql เพื่อให้โปรแกรมจำลองเปิดอ่านและสั่งรันคำสั่งเหล่านั้นภายหลัง หรือสั่งรันจากคำสั่งด้วย mysql client

1. เลือกเฉพาะบรรทัดที่มีคำสั่ง SELECT

คำสั่งที่ใช้
cat mysql.log | grep "SELECT " > mysql.txt

2. ตัดเฉพาะข้อความตั้งแต่ SELECT เป็นต้นไป

คำสั่งที่ใช้
grep -o "SELECT.*" mysql.txt > mysql_select.txt

3. เพิ่มเครื่องหมาย ; ต่อท้ายในแต่ละบรรทัด

คำสั่งที่ใช้
sed 's/$/ ;/' mysql_select.txt > mysql_select.sql

สุดท้ายก็จะได้ไฟล์ mysql_select.sql ที่เป็นคำสั่ง sql และมีเครื่องหมาย ; ปิดท้าย ทำให้เราสามารถใช้คำสั่ง mysql < mysql_select.sql ได้โดยไม่ต้องใช้โปรแกรมอื่นมาอ่านไฟล์แล้วส่งต่อไปยัง mysql


วันศุกร์ที่ 29 ตุลาคม พ.ศ. 2564

mysqldump และบีบอัดไฟล์

 หลังจากที่สำรองข้อมูลใน mysql แล้วปัญหาใหญ่ที่เจอ คือ ไฟล์ขนาดใหญ่ทำให้ดาวน์โหลดช้ามาก วิธีแก้ไขอีกวิธีหนึ่ง คือ บีบอัดให้เล็กลงก่อนที่จะส่งไฟล์ผ่านระบบเน็ตเวิร์กหรืออินเตอร์เน็ต

  • การสำรองฐานข้อมูลพร้อมทั้งบีบอัดไฟล์ที่ได้
$ mysqldump -u [uname] -p[pass] [dbname] | gzip -9 > [backupfile.sql.gz]

กรณี Restore ข้อมูล .gz

gunzip < [path-to-file-sql.gz] | mysql -u [uname] -p[pass] [db_name]


การบีบอัดไฟล์ทำให้ขนาดลดลงเป็นอย่างมาก จากข้อมูลประมาณ 8 ล้านรายการ หาก dump แบบไม่บีบอัดจะได้ขนาด 2.7 GB แต่ถ้าบีบอัดแล้วจะได้ประมาณ 300 MB เช่น

root@db1:/home/yothinin# ls -l
total 3062592
-rw-r--r-- 1 root root 2,794,506,060 Oct 29 11:55 db-20211027.sql
-rw-r--r-- 1 root root   341,575,683 Oct 30 01:57 db-20211030.sql.gz

root@db1:/home/yothinin# time gunzip < db-20211030.sql.gz | mysql sbt_db

real 26m43.499s
user 0m52.715s
sys 0m5.410s

จากข้อมูลข้างบนหลังจากที่นำเข้าข้อมูลจากไฟล์ที่บีบอัดใช้เวลา 26 นาที 43 วินาที ก็ถือว่าไม่นาน เพราะไฟล์ที่ไม่บีบอัดก็จะอยู่ที่ 24-28 นาทีสำหรับไฟล์ที่มีรายการประมาณ 8 ล้านรายการ

สรุปการสำรองข้อมูลจะใช้เวลาน้อยกว่าการคืนค่าข้อมูล เพราะการคืนค่าหรือการ restore นั้นระบบจะเพิ่มคำสั่งทีละคำสั่งเหมือนการทำงานของ mysql ตั้งแต่เริ่มตั้นนั่นแหละ ซึ่งจะช้าหรือเร็วก็ขึ้นอยู่กับความเร็วในการเขียนข้อมูลในเซิร์ฟเวอร์นั้นๆ

Debian: mariadb server

จู่ๆ ก็ไม่สามารถสตาร์ท mariadb ได้ และเมื่อใช้ journalctl -xe ก็เห็น error ดังนี้ 

Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=1517212349,1517212349
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] InnoDB: Missing FILE_CHECKPOINT at 1517212349 between the checkpoint 1517212349 and the end 1517212361.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] InnoDB: Starting shutdown...
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Plugin 'InnoDB' init function returned error.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [Note] Plugin 'FEEDBACK' is disabled.
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Unknown/unsupported storage engine: InnoDB
Oct 29 23:21:16 db1 mariadbd[651]: 2021-10-29 23:21:16 0 [ERROR] Aborting
Oct 29 23:21:16 db1 systemd[1]: mariadb.service: Main process exited, code=exited, status=1/FAILURE

ค้นหาในเน็ตก็ไม่รู้สาเหตุแต่มีวิธีแก้ไข คือ ลบไฟล์ /var/lib/mysql/ib_logfile* ออกก็ใช้ได้เลย เดี๋ยวจะหาสาเหตุอีกที

วันพุธที่ 27 ตุลาคม พ.ศ. 2564

ปัญหาเมื่อเพิ่ม /dev/sdb ใน Debian 11

หลังจากที่เพิ่ม Storage ให้กับ Debian 11 แล้วก็เจอปัญหาหลายอย่างก็แก้ไขไปทีละเปาะ จนถึงปัญหาพบข้อความตอนบูทว่า  

#dmesg | grep sdb

[    2.956200] sd 3:0:0:0: [sdb] 16777216 512-byte logical blocks: (8.59 GB/8.00 GiB)
[    2.956305] sd 3:0:0:0: [sdb] Write Protect is off
[    2.956310] sd 3:0:0:0: [sdb] Mode Sense: 04 00 10 00
[    2.956537] sd 3:0:0:0: [sdb] Incomplete mode parameter data
[    2.956594] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[    2.989959]  sdb: sdb1
[    3.012033] sd 3:0:0:0: [sdb] Attached SCSI disk
[   11.313582] EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: (null)


ปัญหาคงอยู่ที่การเม้าท์ /dev/sdb นี่แหละ คงต้องตรวจสอบและแก้ไขกันต่อไป

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...