Month: February 2018

  • GET STRING FROM ENUM

    เพื่อนๆนักพัฒนาหลายคนก็คงจะรู้จัก enum กันพอสมควรแล้วนะคะ วันนี้เรามาทำความรู้จักเจ้า Enum กันให้มากขึ้นกว่าเดิมกันดีกว่านะคะ ว่านอกจากเราจะดึงค่า Integer ที่เก็บค่าในตัวแปร หรือ Tostring() เป็นค่าstring ตามชื่อของตัวแปร Enum แล้ว เรายังสามารถ ดึงค่า  String  เป็นประโยคยาวๆได้โดยที่ไม่จำเป็นต้องเหมือนกับชื่อตัวแปรแล้วนะคะ เอาล่ะค่ะ เรามาเริ่มจากการทำความรู้จักเจ้าตัว Enum กันตั้งแต่เริ่มต้นเพื่อระลึกความจำกันก่อนละกันนะคะ ^^

    Enumeration จะมีชนิดเป็น integer type ซึ่ง เราสามารถกำหนดกลุ่มของข้อมูลได้ (User-defined)

    ในการสร้าง enumeration เราจะใช้ keyword คำว่า  enum  ดังนี้

    public enum Colors
    {
      White,
      Black,
      Red,
      Green,
      Blue
    }

    ในตัวอย่างนี้สร้าง enum ที่ชื่อว่า Colors โดยมีสมาชิกอยู่ 5 สมาชิกคือ White,Black,Red,Green,Blue

    โดยสมาชิกต่างๆของ enum ถ้าเราไม่ได้กำหนดค่าเริ่มต้นจะมีค่าเริ่มต้นจาก 0 ดังนี้

    white = 0

    Black =1

    Red =2

    Green=3

    Blue=4

    ในการเรียกใช้งาน enum

    Colors  c = Colors.Green; //สร้างตัวแปร c ขึ้นมาเพื่อเรียกใช้สมาชิกที่ชื่อ Green

    ตัวอย่าง enum

     

    using System;
    public enum Colors
    {
        White,
        Black,
        Red,
        Green,
        Blue
    }
    public class TestEnum
    {
        public static void Main()
        {
            Colors c = Colors.Blue;
            Console.WriteLine(c);
            Console.ReadLine();
        }
    }

    ผลลัพธ์จะแสดง Blue

    จากตัวอย่างนี้ถ้าต้องการให้แสดงเป็น integer type   เราก็เขียนได้ดังนี้

    Console.WriteLine((int)c);

    ผลลัพธ์จะได้ 4

    เราสามารถกำหนดค่าให้กับสมาชิกของ  enum ได้ดังนี้

     

    public enum Colors
    {
      Red = 10,
      Green =20,
      Blue=30
    }

    ตัวอย่าง

     

    using System;
    public enum Colors
    {
      Red = 10,
      Green =20,
      Blue=30
    }
    public class TestEnum
    {
        public static void Main()
        {
            Colors c = Colors.Green;
            Console.WriteLine((int)c);
            Console.ReadLine();
        }
    }

    ผลลัพธ์จะได้ 20
    นอกจากนี้สามารถเขียนรับค่า value มาจาก enum ได้อีกแบบคือ
    Colors c = (Colors)Enum.Parse(typeof(Colors), “Blue”, false);
    ตัวอย่าง

    using System;
    public enum Colors
    {
      Red = 10,
      Green =20,
      Blue=30
    }
    public class TestEnum
    {
        public static void Main()
        {
            Colors c = (Colors)Enum.Parse(typeof(Colors), “Blue”, false);
            Console.WriteLine((int)c);
            Console.ReadLine();
        }
    }

    ผลลัพธ์จะได้ 30

    กรณีที่เราจะใช้ tostring เข้ามาใช้ก็สามารถทำได้
    ตัวอย่าง

     

    using System;

    public enum Colors
    {
      Red = 10,
      Green =20,
      Blue=30
    }
    public class TestEnum
    {
        public static void Main()
        {
            string  c = Colors.Green.tostring();
            Console.WriteLine(c);
            Console.ReadLine();
        }
    }

    ผลลัพธ์จะได้ Green
    นอกจากเราจะสามารถ tostring ให้ได้ค่า string เหมือนกับชื่อ enum แล้วนั้น ผู้พัฒนาทราบหรือไม่คะ ว่า enum เราสามารถกำหนดคำอธิบายได้เป็นประโยค และสามารถดึงค่านั้นมาใช้ได้ หรือพูดง่ายๆว่าเราสามารถดึงค่า enum มาใช้ในรูปแบบประโยคได้ง่ายๆ ดังตัวอย่างค่ะ

    public enum Colors
    {[Description(“This is Red”)]  //เราต้องกำหนด Description attributes ว่าเราต้องการจะให้แสดงข้อความอย่างไร
      Red = 10,   Green =20,
      Blue=30
    }

    ส่วนนี้จะเป็น code ส่วนที่จะดึงข้อมูล Description ตามที่กำหนด ที enum

    public static string GetEnumDescription(Enum value)

    {   

    FieldInfo fi = value.GetType().GetField(value.ToString());    

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(        typeof(DescriptionAttribute),        false);    

    if (attributes != null &&        attributes.Length > 0)       

    return attributes[0].Description;   

    else        return value.ToString();

    }

    ตัวอย่างการเรียกใช้

    var myEnumDescriptions = Colors.Red.GetDescription();

    ผลลัพธ์จะได้ This is Red

    ผู้เขียนหวังว่านี่คงจะเป็นอีกทางเลือกนึงของผู้พัฒนา ในการนำไปพัฒนาโปรแกรมต่อไปนะคะ ^_^

    แหล่งอ้างอิง
    https://stackoverflow.com/questions/2650080/how-to-get-c-sharp-enum-description-from-value
    http://yaritc.blogspot.com/2012/01/enum-struct-by-paedotnet.html

  • Configuration of TCP/IP with SSL and TLS for Database Connections

    สิ่งที่ต้องเตรียม

    1. Oracle Database Server ในตัวอย่างนี้ใช้ Oracle database บน Oracle Enterprise Linux 7
    2. Oracle Database Client  ในตัวอย่างใช้ Windows Server 2008 R2

    เริ่ม

    • ฝั่ง Server
    • เข้าระบบด้วยบัญชีผู้ใช้ oracle หรือบัญชีที่เป็นเจ้าของ Oracle Database
    • เปิด terminal สร้าง Oracle Wallet ด้วยคำสั่ง
      • mkdir -p /u01/app/oracle/wallet

    • ต่อด้วย
      • orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

      • โดย -pwd WalletPasswd123 ตัว WalletPasswd123 คือรหัสผ่านที่ใช้ป้องกันการเข้าถึงข้อมูลต่างๆ ใน wallet กฎการตั้งมีอยู่คือ ยาวอย่างน้อย 8 ตัวอักษร ไม่จำกัดความยาว จำเป็นต้องตั้งให้ตัวเลขผสมตัวอักษร
    • สร้าง Certificate และใส่เข้าไปใน wallet ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Client ด้วยคำสั่ง
      • orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -cert /tmp/server-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • cat /tmp/server-certificate.crt

    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----
        MIIBoTCCAQoCAQAwDQYJKoZIhvcNAQEEBQAwGTEXMBUGA1UEAxMOcmVpcy5wc3UuYWMudGgwHhcN
        MTgwMTA5MDcyNTA2WhcNMjgwMTA3MDcyNTA2WjAZMRcwFQYDVQQDEw5yZWlzLnBzdS5hYy50aDCB
        nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAj4x2/NviDaTlXuEJt0kZARY5fHiT2SiVX+a18hai
        I0stoUhKKefjOCgB85iuqjIk0rvcGXI0KXkbenTy2t40A+qGxB04mBhCLKaKeIe67BZKR6Zyw1dd
        oaesoaWChC01b+IW1X5WWtC53UxpIZQ4Zktj41sLGUnarIr9+9HFwncCAwEAATANBgkqhkiG9w0B
        AQQFAAOBgQAqSCF2Y8uyM4rSQHUC8MKEl3Ia3NJKnigMOUzDc2fP7grSaoeuQ4NvIntTD+s+IT5Y
        EpLVND4kSHFTwGRq0Py/ig8ybXZCXfHtvNZh7ZGziL/sYt5/8xYi/tOBKwVanBTUaseKIMovtmd7
        UyoOKrX8YBoFsB3UPRLudmFsksXRXw==
        -----END CERTIFICATE-----

    • ฝั่ง Client
    • เข้าระบบด้วยบัญชีผู้ใช้ administrator
    • เปิด cmd แล้วสร้าง wallet ด้วยคำสั่ง
      • mkdir c:\app\oracle\wallet

    สร้าง Certificate ด้วยคำสั่ง

      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650

      • โดย WalletPasswd123 คือพาสเวิร์ดที่ใช้ล็อค wallet ไม่จำเป็นต้องเหมือนกับของ Server
    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=ENERAZAN

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Database Server ด้วยคำสั่ง
      • orapki wallet export -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert c:\client-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • more c:\client-certificate.crt
    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----MIIBmTCCAQICAQAwDQYJKoZIhvcNAQEEBQAwEzERMA8GA1UEAxMIRU5FUkFaQU4wIhgPMDE1NTAxMDkwNzMzNDlaGA8wMTQ1MDEwNzA3MzM0OVowEzERMA8GA1UEAxMIRU5FUkFaQU4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJHEEnB4kiI82QVyt0/GlrILF9dwd/jVRlgCQkLmLrpF6RKrIUntzvygyVhtTybeaShH751gYvtl1NFxDUWkBnfS5u2DN6ATP2WpNQgGM/skPWZOxoewy6OeeFsDPNUJTsI8+F5DIwtNhZcdQtBexZ/D3ALkSboR87t2Vy8OJpD7AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAV7xLLslRn2srS4A4Ks1KiuUWI/ackyNK7UiWgWD/by5Vx4Zw+0x3hdLzQllDR2O5Nef9it5WyYWrDQ47RadqMEVVfTGuAqQn47n/t+v24ljwm2yZ36Tj2lDVaFbE/ZtRyzPKgIwUy6RIt9XVX39vXFJVaENCHzZ0R3hs2bx1K3o=-----END CERTIFICATE-----

    • ทำการส่งไฟล์ certificate แลกกันระหว่าง Server กับ Client โดยใช้วิธีการที่ชื่นชอบของแต่คน เมื่อแลกไฟล์กันเสร็จแล้ว
    • ฝั่ง Server import certificate ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \ -trusted_cert -cert /tmp/client-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=ENERAZAN
        Subject: CN=reis.psu.ac.th

    • ฝั่ง Client import certificatae ด้วยคำสั่ง
      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert c:\server-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123
    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th
        Subject: CN=ENERAZAN

    • ฝั่ง Server แก้ไขแฟ้ม $ORACLE_HOME/network/admin/sqlnet.ora ด้วย editor ที่ชื่นชอบ
      • เพิ่มคำสั่งต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    แก้ไขแฟ้ม $ORACLE_HOME/network/admin/listener.ora

      • เพิ่มข้อความส่วนที่เป็นตัวหนาตามตำแหน่งต่อไปนี้
      • LISTENER =
        (DESCRIPTION_LIST =
        (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = reis.psu.ac.th)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        )

        SSL_CLIENT_AUTHENTICATION = FALSE

        WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

    • restart listener ด้วยคำสั่ง
      • lsnrctl stop
      • lsnrctl start
    • ฝั่ง Client แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\sqlnet.ora โดยเพิ่มข้อความต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = c:\app\oracle\wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    • แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\tnsnames.ora เพิ่มข้อความต่อไปนี้
      • REIS_SSL =
        (DESCRIPTION =
        (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        (CONNECT_DATA =
        (SERVICE_NAME = reis.psu.ac.th)
        )
        )

    • ทดสอบใช้งาน
    • ที่ Client พิมพ์คำสั่ง
      • sqlplus scott/tiger@reis_ssl
    • ได้ผลลัพธ์ประมาณว่า
      • SQL*Plus: Release 12.2.0.1.0 Production on Wed Feb 7 16:54:05 2018
        Copyright (c) 1982, 2016, Oracle. All rights reserved.

        Last Successful login time: Wed Feb 07 2018 16:52:50 +07:00

        Connected to:
        Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
        With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
        ions

        SQL>

    • หรือต่อด้วย SQL Developer ต้องตั้งค่าการเชื่อมต่อเป็นดังภาพ
    • จากภาพเลือก Connection Type เป็น Advanced และใช้ช่อง Custom JDBC URL ใส่เป็น jdbc:oracle:oci:/@reis_ssl
    • เนื่องจากไม่สามารถเชื่อมต่อผ่าน tns ได้ ดังภาพ
    • วิธีเซ็ตค่าแบบนี้ใช้ได้กับ Oracle Database 10G R2 เป็นต้นมา
    • จบขอให้สนุก

    ที่มา:
    https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections

  • Raspberry Pi 3 [LCD Text Display with Python]

    จากตอนที่แล้ว เราทำการเชื่อมต่อจอ LCD 16×2 และเขียน Basic Python ให้สามารถแสดงข้อความง่ายๆ ได้แล้ว

    ตอนนี้เราจะลองนำค่าที่อยู่ในตัว Raspberry Pi 3 มาแสดง เช่น

    Date & Time
    Network Adapter IP Address
    CPU Percentage Usage
    CPU Temperature
    Memory Total
    Memory Usage
    Memory Free
    Disk Total
    Disk Usage
    Disk Free

    เป็นต้น

     

    ** ส่วนตัวผมจะถนัดใช้ nano เป็น text editor นะครับ ส่วนท่านอื่นที่ไม่คล่อง จะใช้ผ่าน vi หรือ text editor บน gui ก็ไม่ว่ากันครับ **

    ** ไฟล์ทั้งหมดผม mkdir LCD เอาไว้บน home directory ของ user: pi ครับ **
    ซึ่งดาวน์โหลดตัวอย่าง ได้ที่นี่ จากนั้นนำไฟล์ RPi_LCD_Driver.py (จากตอนที่แล้ว) วางไว้ที่ directory เดียวกัน

     

    การแสดงวัน/เวลาบนหน้าจอ

    ใช้คำสั่งเพื่อสร้างไฟล์ sudo nano show_dt.py จากนั้นเขียนโค้ดตามด้านล่างนี้ครับ

     

    import RPi_I2C_Driver
    from datetime import datetime
    mylcd = RPi_I2C_Driver.lcd()

    while True:
        mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%d/%m/%Y”), 1)
        mylcd.lcd_display_string(“%s” %datetime.now().strftime(“%H:%M:%S.%f”), 2)

     

    while True เนื่องจากต้องการให้รันแบบ infinite loop แสดงวันเวลาโดยที่

    %d แสดงวันที่
    %m แสดงเดือน
    %Y แสดงปี ค.ศ.

    %H แสดงหลักชั่วโมง
    %M แสดงหลักนาที
    %S แสดงหลักวินาที
    %f แสดง milli-seconds

     

    เมื่อทดลองรันด้วยคำสั่ง sudo python show_dt.py หน้าจอ LCD จะแสดงดังตัวอย่างข้างล่างนี้


    หลัก milli-seconds จะวิ่งเร็วมากจนหน้าจอแสดงไม่ทัน

    จากนั้นท่านจะเห็นว่าไม่สามารถพิมพ์คำสั่งอื่นๆ ที่ terminal ได้อีก เนื่องจากโปรแกรมรันอยู่นั่นเอง ให้ท่าน Ctrl+C ออกมา

     

    การแสดงค่า IP Address

    ใช้โค้ดด้านล่างนี้ พร้อมกับเซฟไว้ในชื่อ myip.py

     

    import RPi_I2C_Driver
    import socket

    mylcd = RPi_I2C_Driver.lcd()

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect((‘psu.ac.th’, 80))
    ip = s.getsockname()[0]
    s.close()

    mylcd.lcd_display_string(“IP Address:”, 1)
    mylcd.lcd_display_string(ip, 2)

     

    หน้าจอ LCD ก็จะแสดงข้อความดังนี้

    ** มีวิธีการเขียนแสดง ip address อีกหลายวิธี แต่ใช้วิธีนี้เนื่องจากเป็นวิธีที่จะได้ ip address ที่ใช้งานจริง เพราะในบางกรณีจะได้ loopback ip 127.0.0.1 แทน และในบางแบบ ก็สามารถระบุ interface เช่น eth0 หรือ wlan0 ได้ด้วย **

     

    ต่อจากนี้ไปจะเป็นการเขียนเพื่อแสดงค่า Environment ของเครื่อง (เช่นเดียวกับ Performance ใน Task Manager ของ Windows) และเนื่องจากหน้าจอ LCD มีขนาดจำกัด จึงได้เขียนให้มีการวนแสดงค่าต่างๆ ออกมาตามเวลาที่กำหนด

     

    ซึ่งเราจะต้องทำการอาศัย library ชื่อ python package ชื่อ psutil มาใช้เป็น library เพื่อดู process และเพื่อทำ system monitoring ครับ

     

    ทำการติดตั้ง psutil ด้วยคำสั่งต่อไปนี้

    sudo apt-get install build-essential python-dev python-pip

     

    จากนั้นทำการติดตั้ง psutil ด้วย PIP คำสั่ง

    sudo pip install psutil

     

    จากนั้นทำการทดสอบการติดตั้ง จะต้องไม่แสดง error ให้เห็น (ไม่แสดงอะไรเลยนั่นเอง)

    sudo python -c “import psutil”

     

    ตามตัวอย่างต่อไปนี้

     

    เมื่อเรียบร้อยแล้ว ให้ท่านลองเขียนโค้ดตามด้านล่างนี้ จากนั้นเซฟไว้ในไฟล์ชื่อ resource_mon.py

     

    import os
    import time
    import socket
    import psutil
    import RPi_I2C_Driver

    mylcd = RPi_I2C_Driver.lcd()

    # Return CPU temperature as string
    def getCPUtemperature():
        res = os.popen(‘vcgencmd measure_temp’).readline()
        return(res.replace(“temp=”,””).replace(“‘C\n”,””))

    # Return RAM info (in kb)
    # [0]: total RAM
    # [1]: RAM in used
    # [2]: free RAM
    def getRAMinfo():
        p = os.popen(‘free’)
        i = 0
        while 1:
            i = i + 1
            line = p.readline()
            if i==2:
                return(line.split()[1:4])

    # Return disk info (with unit)
    # [0]: disk space total
    # [1]: disk space in used
    # [2]: disk space remaining
    # [3]: percentage of used space
    def getDiskInfo():
        p = os.popen(“df -h /”)
        i = 0
        while 1:
            i = i +1
            line = p.readline()
            if i==2:
                return(line.split()[1:5])

    #CPU Usage
    CPU_usage = str(psutil.cpu_percent(interval=1))

    # CPU Temp
    CPU_temp = getCPUtemperature()

    # RAM info (converted to MB)
    RAM_info = getRAMinfo()
    RAM_total = round(int(RAM_info[0]) / 1000,1)
    RAM_used = round(int(RAM_info[1]) / 1000,1)
    RAM_free = round(int(RAM_info[2]) / 1000,1)

    #Disk info
    DISK_info = getDiskInfo()
    DISK_total = DISK_info[0]
    DISK_free = DISK_info[2]
    DISK_perc = DISK_info[3]

    while True:
     mylcd.lcd_display_string(“CPU Temperature:”, 1)
     mylcd.lcd_display_string(CPU_temp + ” DegCelcius”, 2)
     time.sleep(5)
     mylcd.lcd_clear()
     mylcd.lcd_display_string(“CPU Usage:”, 1)
     mylcd.lcd_display_string (CPU_usage + “%”, 2)
     time.sleep(5)
     mylcd.lcd_clear()
     mylcd.lcd_display_string(“RAM Total/Used”, 1)
     mylcd.lcd_display_string(str(RAM_total) + ” / ” + str(RAM_used) + “MB”, 2)
     time.sleep(5)
     mylcd.lcd_clear()
     mylcd.lcd_display_string(“DISK Total/%Used”, 1)
     mylcd.lcd_display_string(str(DISK_total) + ” / ” + str(DISK_perc), 2)
     time.sleep(5)
     mylcd.lcd_clear()

     

    โดยในโค้ดนี้จะมีการเขียนแยก method และเขียนคำอธิบายเอาไว้ใน comment ของโค้ดให้แล้ว
    สามารถนำปรับการแสดงผลได้ตามที่ท่านต้องการครับ และเมื่อรันด้วยคำสั่ง sudo python resource_mon.py
    ก็จะพบกับหน้าจอวนไปเรื่อยๆ ดังนี้

               

    บนซ้าย แสดงอุณหภูมิ CPU
    บนขวา แสดง CPU Usage %
    ล่างซ้าย แสดงการใช้ RAM ทั้งหมด/ที่ใช้ไป
    ล่างขวา แสดงการใช้ DISK ทั้งหมด/%ที่ใช้ไป

               

     

    ท่านสามารถปรับค่าที่ต้องการให้แสดงได้ตามที่ต้องการ
    โดยค่าที่สามารถดึงมาใช้ได้ จะ comment เอาไว้ในโค้ดของ method ที่ทำการ assign ค่าให้กับตัวแปรมาแสดง

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

     

    สำหรับตอนหน้า จะเป็นการเชื่อมกับเซนเซอร์ภายนอก

    จะเป็นเซนเซอร์อะไรนั้น ติดตามต่อตอนหน้า ในอีกระยะเวลาหนึ่ง

     

    สวัสดีครับ

  • วิธีขยาย Disk ใน VM/Virtualbox แล้วให้ Ubuntu

    ในกรณีใช้ VMWare/VirtualBox  บางครั้งเราต้องการขยาย Disk ให้ Ubuntu มีพื้นที่มากขึ้น

    1. เดิมมี Disk 100 GB
    2. แก้ไขให้เป็น 300 GB
    3. Login เข้าไป ดูข้อมูล ด้วยคำสั่ง df -h จะเห็น 100 GB อยู่

      แล้ว sudo reboot
    4. ลอง Login ใหม่ แล้วใช้คำสั่ง
      sudo su
      fdisk -l

      ก็จะ ขนาดเพิ่มเป็น 300 GB
      จากนั้นใช้คำสั่ง

      growpart /dev/sda 1
      resize2fs /dev/sda1

      แล้วลอง

      df -h


      ก็จะพบว่า ได้ขนาดมาเป็น 300 GB แล้ว

  • Raspberry Pi 3 [Writing Text to 16×2 LCD]

    จากตอนที่แล้วเราได้ทำการเชื่อมต่อ hardware ซึ่งได้แก่ จอ LCD ขนาด 16×2 ผ่าน I2C Module ไปเรียบร้อยแล้วนั้น

    เราจะเริ่มทำการ Config I2C และเขียน Python เพื่อแสดงข้อความตัวอักษรอย่างง่าย

     

    Enable I2C Module

    เริ่มด้วยการ login เข้าสู่ Raspberry Pi และใช้คำสั่ง sudo raspi-config บนหน้าจอ Terminal

    จากนั้นเลือก 5 Interfacing Option และเลือก P5 I2C (Enable/Disable automatic loading…)

    ทำการคอนเฟิร์ม ด้วยการตอบ YES จากนั้น Reboot

     

    จากนั้นทำการอัพเดทไฟล์ /boot/config.txt ด้วยคำสั่ง sudo nano /boot/config.txt

    ใส่ข้อความ (หรือ uncomment) ต่อไปนี้

    dtparam=i2c1=on

    dtparam=i2c_arm=on

    จากนั้นทำการ reboot ครับ

     

    ลองใช้คำสั่ง sudo i2cdetect -y 1 เพื่อดูว่าเจอ I2C Module หรือไม่ ซึ่งผลที่ได้คือ address ของอุปกรณ์ (อาจแตกต่างกันไปในแต่ละเครื่อง ซึ่งในที่นี้คือ address 0x3f นั่นเอง)

     

    จากนั้นทำการตรวจสอบว่ามีการติดตั้ง Python ไว้หรือยัง ด้วยการทดลองเรียกใช้ซะเลย ด้วยคำสั่ง

    python3 จะพบกับหน้าจอดังนี้ (ใช้คำสั่ง exit() เพื่อออกกลับไปยัง prompt เดิม)

    แต่ถ้าหากยังไม่เคยติดตั้ง ให้ติดตั้งด้วยคำสั่ง sudo apt-get install python ครับ

     

    เริ่มเขียน Python เพื่อแสดงตัวอักษรบน LCD กันเลย

    เนื่องจากเราไม่ใช่คนแรกในโลกที่ใช้งานส่วนนี้ เพื่อเป็นการประหยัดเวลา เราจะทำการดาวน์โหลด library มาใช้งาน

    ซึ่ง ดาวน์โหลดได้ที่นี่ (ต้อง Extract Zip จะเจอไฟล์  RPi_I2C_Driver.py) โดยจะต้องทำการแก้ไข บันทัดที่ 54 ADDRESS = 0x3f ให้เป็น Address ของเราเอง (ต้นฉบับจากที่นี่ https://gist.github.com/DenisFromHR/cc863375a6e19dce359d)

     

    จากนั้นลองทำการเขียนกันดูครับ

    import RPi_I2C_Driver
    from time import *

    mylcd = RPi_I2C_Driver.lcd()
    mylcd.lcd_display_string(“Hello PSU !”, 1)

    เซฟไฟล์ชื่อ hello.py จากนั้นสั่งรันด้วยคำสั่ง python hello.py จะพบว่า LCD สามารถแสดงข้อความได้แล้ว

     

    คำสั่งพื้นฐานอื่นๆ ที่อาจต้องใช้ได้แก่

    mylcd.lcd_display_string(“Hello PSU !”, 2, 3) แสดงข้อความที่ row 2, column 3

    mylcd.lcd_clear() เพื่อเคลียร์หน้าจอ

    เป็นต้นครับ

     

    สำหรับตอนหน้า จะเป็นเรื่องของการแสดงข้อความอื่นๆ ในระบบ เช่น วัน/เวลา, IP Address, CPU/Memory/Disk Usage ครับ

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

     

     

     

     

  • เทคนิคการใช้ Word ในการทำบรรณานุกรม

    ในการทำเอกสารงานวิชาการ/งานวิจัย เมื่อเราอ่านเอกสารจากบทความหรือหนังสือต่าง ๆ แล้วมาเขียนในงานของเราจะต้องมีการอ้างอิงที่มาของเนื้อหาดังกล่าว โดยไปที่ References คลิก Insert Citation  คลิก Add New Source จะแสดง Dialog ดังรูป

    • Type of Source ให้เลือกประเภทของแหล่งข้อมูลเนื้อหาตามต้องการ ไม่ว่าจะเป็นหนังสือ, เอกสารวิชาการ, Conference Proceeding, รายงาน, เอกสารอิเล็กทรอนิกส์, จาก Website ต่าง ๆ ก็สามารถทำอ้างอิงได้ ในที่นี้ขอเลือก Book
    • Author ระบุชื่อผู้แต่ง
    • Title ระบุชื่อหนังสือ
    • Year ระบุปีที่พิมพ์
    • City ระบุชื่อเมืองที่พิมพ์
    • Publisher ระบุสำนักพิมพ์
      จากนั้นคลิก OK ก็จะได้อ้างอิง ดังรูป

      พอเราทำเอกสารเสร็จทั้งหมดไปถึงหน้าสุดท้ายแล้ว ถึงเวลาที่เราต้องทำบรรณานุกรมแล้ว ไปที่ References ที่ Style เราสามารถเลือกได้ว่าจะใช้มาตรฐานการอ้างอิงแบบไหน ส่วนใหญ่ก็จะเป็น APA จากนั้นคลิกที่ Bibliography คลิกเลือก Bibliography ก็จะได้บรรณานุกรม ดังรูปโดยที่เราสามารถปรับแต่งขนาดตัวอักษร จัดรูปแบบ และยังสามารถอัพเดตอ้างอิงและบรรณานุกรมได้ด้วยค่ะ อาจจะเป็นเทคนิคเล็ก ๆ น้อย ๆ แต่คิดว่าคงมีประโยชน์กับผู้ที่ทำเอกสารงานวิชาการ/งานวิจัยนะคะ 

     

  • Raspberry Pi 3 [Drive 16×2 LCD with I2C Interface]

    หลังจากตอนที่แล้วเราได้ทำการ setup โปรแกรมที่เราต้องการ

    ในตอนนี้ขอพูดถึงอุปกรณ์ต่อพ่วงกันบ้าง เพื่อให้ดูเหมือนเข้าสู่ยุค IoT (Internet Of Things) มากขึ้น นั่นคือจอ LCD ระดับเบื้องต้น ขนาด 16×2 ดังรูปนี้

    ซึ่งอุปกรณ์ตัวนี้ สามารถแสดงผลได้ 2 แถว แถวละ 16 ตัวอักษร ซึ่งเพียงพอในระดับเบื้องต้นสำหรับการเรียนรู้การเขียนโปรแกรมครับ

    โดยในตลาดจะมีขายหลายรุ่น เช่น 16×2, 20×4 ไปจนถึง 128×64 อีกทั้งยังมี จอสีประเภท TFT 2.4 นิ้ว, 3 นิ้ว, 3.2 นิ้ว, 4 นิ้ว เป็นต้น และมีแบบหน้าจอสัมผัสให้เลือกใช้งานอีก มากมาย

     

    การเชื่อมต่อจอ 16×2 กับบอร์ด Raspberry Pi 3

    โดยทั่วไปแล้ว จะต้องทำการเชื่อมต่อดังรูปด้านล่างนี้

     

             

    การเชื่อมต่อแบบ 4 bits (ซ้าย) – การเชื่อมต่อแบบ 8 bits (ขวา)

    จะเห็นว่าเป็นการเชื่อมต่อที่ยุ่งยาก ใช้สายหลายเส้น และยากต่อการปรับเปลี่ยนการใช้งาน ดังนั้นจึงมึโมดูลที่เข้ามาช่วยตรงนี้คือ I2C

     

    I2C คืออะไร

    I2C คือบัสการเชื่อมต่ออนุกรมแบบ Synchronous ด้วยสายสัญญาณเพียง 2 เส้น (แต่จริงๆ ต่อ 4 เส้น ได้แก่ SDA, SLC, +5V และ GND) โดยจะมีสายสัญญาณข้อมูล คือ SDA (Serial Data Line) และสายสัญญาณนาฬิกา คือ SLC (Serial Clock Line) โดยแบ่งการทำงานออกเป็น 4 โหมดตามความเร็วดังนี้

    1. Normal Mode ความเร็ว 100Kbps
    2. Fast Mode ความเร็ว 400Kbps
    3. Fast Mode Plus ความเร็ว 1Mbps
    4. High Speed ควาามเร็ว 3.4Mbps

     

    ซึ่งเมื่อเป็นการเชื่อมต่อแบบอนุกรม ทำให้เราสามารถใช้งาน I2C ได้มากกว่าหนึ่งอุปกรณ์บนสายเพียง 2 เส้น โดยจะเลือกติดต่อกับอุปกรณ์ใดได้ด้วยการกำหนดที่อยู่ (Address) ของ Hardware ให้กับอุปกรณ์

     

    และเนื่องด้วยความง่ายของการใช้งานของ I2C ทำให้อุปกรณ์จอ LCD ส่วนใหญ่จะทำการติดตั้งมาพร้อมกับจอแล้ว ดังรูป

              

    I2C Module คือโมดูลสีเข้มในรูป
    บอร์ดสีเขียวคือ ด้านหลังของจอ LCD 16×2 ซึ่งได้ทำการเชื่อมต่อเรียบร้อยแล้ว

     

    เริ่มทำการเชื่อมต่อกับ Raspberry Pi

    โดย I2C จะต้องทำการเชื่อมต่อ 4 เส้น คือ +5V, GND, SDA, SLC กับ Pinout ของ Raspberry Pi 3

    ดูจากข้อมูล Alternate Function เราจะต้องทำการต่อสาย SDA ที่ Pin 3, SCL ที่ Pin 5
    และ +5V ที่ Pin 2 หรือ ส่วน GND นั้นมี Pin 6, 9, 25, 39, 14, 20, 30 หรือ 34 ให้เลือก

     

         

    จากนั้นทำการ Power On Raspberry PI 3 ขึ้นมาครับ จะพบว่าหน้าจอ LCD ติดพร้อมไฟ Backlight (แต่ไม่มีตัวอักษรอะไรแสดง เพราะเรายังไม่ได้โปรแกรมครับ)

     

    หน้าจอสามารถปรับ Contrast (ความเข้มของตัวอักษร) และสามารถ เปิด/ปิด ไฟ backlight ได้ด้วย Jumper บนโมดูล I2C ครับ

     

    ตอนต่อไป จะเป็นการเริ่มเขียน Python เพื่อแสดงผลตัวอักษร

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ