วันพุธที่ 27 พฤษภาคม พ.ศ. 2563


Error:

yothinin@yothinin-Y400:~/projects/gtk$ gcc -Wall -c  -o hello hello.c `pkg-config --libs --cflags gtk+-2.0`
In file included from /usr/include/gtk-2.0/gtk/gtkobject.h:37,
                 from /usr/include/gtk-2.0/gtk/gtkwidget.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkcontainer.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkbin.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkwindow.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkdialog.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkaboutdialog.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:33,
                 from hello.c:1:
/usr/include/gtk-2.0/gtk/gtktypeutils.h:236:1: warning: ‘GTypeDebugFlags’ is deprecated [-Wdeprecated-declarations]
  236 | void            gtk_type_init   (GTypeDebugFlags    debug_flags);
      | ^~~~
In file included from /usr/include/glib-2.0/gobject/gobject.h:24,
                 from /usr/include/glib-2.0/gobject/gbinding.h:29,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from hello.c:1:
/usr/include/glib-2.0/gobject/gtype.h:679:1: note: declared here
  679 | {
      | ^
In file included from /usr/include/gtk-2.0/gtk/gtktoolitem.h:31,
                 from /usr/include/gtk-2.0/gtk/gtktoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtkmenutoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtk.h:126,
                 from hello.c:1:
/usr/include/gtk-2.0/gtk/gtktooltips.h:73:3: warning: ‘GTimeVal’ is deprecated: Use 'GDateTime' instead [-Wdeprecated-declarations]
   73 |   GTimeVal last_popdown;
      |   ^~~~~~~~
In file included from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /usr/include/glib-2.0/gobject/gbinding.h:28,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from hello.c:1:
/usr/include/glib-2.0/glib/gtypes.h:547:8: note: declared here
  547 | struct _GTimeVal
      |        ^~~~~~~~~
hello.c: In function ‘main’:
hello.c:8:19: error: ‘win’ undeclared (first use in this function)
    8 |   gtk_widget_show(win);
      |                   ^~~
hello.c:8:19: note: each undeclared identifier is reported only once for each function it appears in
hello.c:4:14: warning: variable ‘window’ set but not used [-Wunused-but-set-variable]
    4 |   GtkWidget *window;
      |              ^~~~~~

แก้ไข:
เพิ่มดังนี้

CFLAGS = -Wall -Wunused                 \
        -DG_DISABLE_DEPRECATED          \
        -DGDK_DISABLE_DEPRECATED        \
        -DGDK_PIXBUF_DISABLE_DEPRECATED \
        -DGTK_DISABLE_DEPRECATED

วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2563

ทำไมถึงเขียน ภาษา C และ Gtk+ 2.0

หลังจากที่เริ่มเขียนโปรแกรมภาษา C และ Gtk+ 2.0 มาได้ประมาณ 2 สัปดาห์ ก็มีหยุดบ้างทำบ้าง มีหายไปประมาณ 3-4 วัน และบางทีก็ทำสลับกับงานอื่นๆ ไป แต่บางครั้งก็นั่งหน้าจอมากกว่า 12 ชั่วโมง เพื่อค้นหาข้อมูล คิดหาวิธีการเขียนโปรแกรม บางทีเมื่อคิดไม่ออกก็เปลี่ยนไปนั่งทำอย่างอื่นบ้าง ไปหาข้อมูลเกี่ยวกับ Micro-controller หรือไม่ก็ไปไสไม้ทำกล่อง ทำชั้นเรื่อยเปื่อย

เดิมทีจะเขียนระบบ Digital Designage

ถึงตอนนี้การเขียนภาษา C โดยใช้ Gtk+ ก็ถือว่าก้าวหน้าไประดับหนึ่ง สามารถเขียนได้เป็นเรื่องเป็นราว แต่ก็ยังติดขัดปัญหาอยู่บ้าง บางทีก็ติดเรื่องหาตัวอย่างและข้อมูลไม่ได้ทันที กว่าจะเจอก็ใช้เวลานานพอควร

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

ใน Gtk+ ก็มีสิ่งเหล่านี้รองรับหมดแล้ว และเหนือกว่าบางโปรแกรมด้วยซ้ำไป แต่ปัญหา คือ ตัวอย่างและเอกสารต่างๆ บางทีก็ยากที่จะเรียนรู้ หากเมื่อเทียบกับการเรียนรู้ FoxPro ในอดีต สิ่งหนึ่งที่ผู้เขียนชอบมาก คือ กดปุ่ม F1 เพื่ออ่าน Help ของโปรแกรม และแต่ละส่วนก็จะมีตัวอย่างให้เราพิมพ์ตาม จนแทบไม่ต้องหาจากหนังสือเลย (สมัยนั้นไม่มีแหล่งเรียนรู้ใน www ต้องหาจากหนังสือหรือ Help นี่แหละ และสมัยนั้นลงทุนซื้อหนังสือต่างประเทศราคา 2-3 พันบาทก็มี)

วันศุกร์ที่ 17 เมษายน พ.ศ. 2563

connect wifi in ubuntu terminal

If you have nmcli installed, I think this is the simplest solution.
For a new connection:
nmcli dev wifi connect <mySSID> password <myPassword>
Or if a connection was already set up:
nmcli con up <mySSID>
(or if that does not work, try nmcli con up id <mySSID>)

วันเสาร์ที่ 11 เมษายน พ.ศ. 2563

เริ่มต้นใช้ gtk ด้วยภาษา C ตอนที่ 1

พูดถึงภาษา C เชื่อว่าหลายคนในบ้านเราร้องยี้กันมาก เพราะคิดว่ามันยาก เอาเข้าจริง ภาษา C ไม่ได้ยากแต่การเอาภาษา C มาใช้งานเพื่อให้เป็นระบบนั่นแหละยาก กล่าวอย่างนี้ไม่ใช่การเล่นคำอะไรทั้งสิ้น หากแต่เทียบง่ายๆ ภาษา C ก็เหมือนภาษาอังกฤษ ที่มีหลักการมีไวยากรณ์ที่เป็นพื้นฐาน เราสามารถเลือกเรียนรู้ได้ตามที่ต้องการ แต่เมื่อต้องการนำไปใช้งานในระดับกว้างแล้วภาษา C กลับถูกเลือกใช้น้อยกว่าภาษาอื่นๆ อย่างเช่น C# เป็นต้น

แม้กระทั่งการเขียนโปรแกรมสำหรับ Arduino ก็นิยมใช้ C++ เช่นกัน แต่สำหรับบนลีนุกซ์แล้วภาษาที่ผู้คิดค้นเขาเลือกใช้ ภาษา C จึงเป็นเรื่องที่น่าสนใจเป็นอย่างยิ่งในการเรียนรู้ ดังนั้นผู้เขียนจึงได้พยายามค้นหาข้อมูลเพื่อเรียนรู้ว่าจะเขียนโปรแกรมบน Linux ได้อย่างไร แต่เดิมก็เรียบๆ เคียงๆ กับ C++ และ Python ก็มองผ่านภาษา C ไปอีก

จนกระทั่งล่าสุดช่วงที่หยุดอยู่กับบ้านเพราะภัยไวรัสโควิด-19 ก็มีเวลาว่างมากเสียจนไม่รู้จะทำอะไรก่อนหลังดี เพราะไม่มีสมาธิ และรู้สึกสับสนว้าวุ่นเป็นอย่างมาก สุดท้ายก็กลับมาที่ภาษาซี โดยคิดว่าจะเขียนโปรแกรมเล่นๆ แก้เซ็งสักหน่อย พลันก็คิดขึ้นได้ว่า ทำไมเราไม่ลองเขียน GUI ด้วยภาษา C ซะเลยล่ะ


เหตุผลสำคัญหลังจากที่ติดตั้ง Raspberry Pi เรียบร้อยแล้วก็พยายามจะลง Qt แต่ก็ติดปัญหาเรื่องความเร็ว และ Qt กลับทำงานอืดอาดมาก พอเปลี่ยนไปหยิบเอา NanoPi M1 มาลงเพื่อใช้งานดูก็พบว่าทรัพยากรมันจำกัดจำเขี่ยมาก บังเอิญเหลือบตาไปเห็นโปรแกรม Geany เลยลองเปิดดูพบว่าเป็น Editor สำหรับภาษา C ได้เป็นอย่างดีก็เลยลองเขียนเพื่อติดต่อกับ gtk เวอร์ชัน 2.0 ดูก็ใช้งานได้ดีเลยตั้งใจว่าช่วงหยุดงานนี้น่าจะเรียนรู้ภาษา C และ GUI ด้วย gtk ได้ให้จนได้

วันจันทร์ที่ 2 ธันวาคม พ.ศ. 2562

วันจันทร์ที่ 19 พฤศจิกายน พ.ศ. 2561

Sync เวลาจาก Server อีกเครื่องหนึ่ง

วิธีการ sync เวลากับเซิร์ฟเวอร์ตัวอื่น

Option 1
Found a way to synchronize date and time with a server over ssh which can quickly solve the problem:
# date --set="$(ssh user@server date)"

Or you can do it the other way around:

# ssh user@host "date --set \"$(date)\""
Option 2

‘ntpdate 10.200.117.37’
or
‘/usr/sbin/sntp -P no -r 10.200.117.37’
Of course you need to set up a ntp or sntp server first.

ที่มา
http://blogs.perl.org/users/michael_li/2014/07/how-to-sync-time-between-two-linux-servers.html

วันพุธที่ 5 กันยายน พ.ศ. 2561

ทำไมใน main() ต้อง return 0;

ทำไมต้อง return 0 ใน main( )

คำถามยอดฮิตแต่คำตอบมีนิดเดียว หายากเหมือนกันครับ แต่เอาง่ายๆ เลย คือ

"เป็นกฏที่เพิ่มเข้ามาในมาตรฐานภาษา C ในปี 1999 หรือ C99"

โดยกำหนดให้มีการคืนค่าเป็นตัวเลขเสมอ จะไม่สามารถคืนค่าอื่นได้

ในสมัยก่อนการเขียนโปรแกรมภาษา C จะเขียนฟังค์ชัน main( ) ดังนี้

void main(){

}

บางคนบอกว่าไม่ส่งค่าอะไรกลับ จริงๆ แล้วก็ ส่งค่า void นั่นแหละครับ ต่อมาจึงมีกำหนดมาตรฐานใหม่ให้ส่งค่า int กลับคืน ดังนั้น ก่อนจบฟังค์ชัน main() จึงต้องส่งค่า 0 กลับไป หมายถึง โปรแกรมทำงานเสร็จสิ้นโดยสมบูรณ์แล้ว ไม่มี error

การทำงานลักษณะนี้คนที่คุ้นเคยกับ Linux ที่เขียนสคริปส์บ่อยๆ จะไม่ค่อยแปลกใจสักเท่าใดนั

สำหรับคนที่สอนเขียนภาษา C ส่วนหนึ่งจะเพิ่ม int main( ) และ return 0; เสมอ เพราะกลัวว่าบางคนใช้ ide บางรุ่นแล้วจะคอมไพล์ไม่ผ่าน แต่ปัจจุบันหลายโปรแกรมไม่มีปัญหาแบบนี้แล้ว อย่างไรก็ตามใส่ไว้ก็ไม่เสียหายครับ


 

มาตรฐานที่ออกปี 1990 ยังไม่มีข้อกำหนดให้ return 0 หากไม่ได้ส่งค่าอะไรกลับ โปรแกรมจะส่งค่า undefined กลับไป
 
 

มาตรฐานที่ออกปี 1999 กำหนดไว้ในข้อ 5.1.2.2.3 ให้ส่งค่า return 0 กลับไปด้วย
 
 

เอกสารอ้างอิง gnc-c Manual
http://studenti.fisica.unifi.it/~carla/manuali/gnu-c-manual.pdf

Error: yothinin@yothinin-Y400:~/projects/gtk$ gcc -Wall -c  -o hello hello.c `pkg-config --libs --cflags gtk+-2.0` In file included from ...