Month: November 2018

  • Virtual data center with OpenNebula

    OpenNebula เป็นชื่อของ open source software สำหรับทำ virtual data center เวอร์ชั่นล่าสุดคือ 5.6.1 (https://opennebula.org)

    ผมได้ทดลองในห้องปฏิบัติการ และเขียนเป็นขั้นตอนการติดตั้งจนกระทั่งได้ VM ขึ้นมา แต่ยังไม่ลงรายละเอียดถึงขั้นใช้งาน storage network ได้ ซึ่งจะได้ทดลองกันต่อไป

    ในตอนนี้ จะเรียกว่า basic set up ก็ได้นะ ในการ set up ระบบจริงตามคำแนะนำ แต่ละเครื่องควรมี network card 2 cards เพื่อแยกระหว่าง network ที่ให้บริการ กับ Management network

    การ set up จะต้องมีเครื่องที่เป็น Front-end เพื่อทำหน้าที่เป็น database และเว็บเพจสำหรับทำ configuration และสั่งการ และจะต้องมีเครื่องที่เป็น Hypervisor อย่างน้อย 1 เครื่อง โดยเลือกได้ว่าจะใช้ KVM หรือ vcenter สเปคเครื่อง hypervisor นี้ต้องรองรับ Virtualization extensions (Intel VT-x or AMD-V)

    เตรียมการทดลองโดยใช้ เครื่องคอมพิวเตอร์ที่ผมนำมาใช้มี 3 เครื่อง อายุเครื่องก็พอสมควร (ตามกำลังทรัพย์ที่มีในห้องปฏิบัติการ) แต่ทั้ง 3 เครื่องนี้ มีเพียง 1 network card ครับ เครื่อง Front-end 1 เครื่อง สเปค Pentium(R) Dual-Core CPU E5200 @ 2.50GHz มี RAM 4 GB อันนี้เป็นเครื่องทั่วไปที่รัน apache2 web server และ mariadb database ได้ ใช้เครื่อง KVM จำนวน 2 เครื่อง เพื่อจะให้เห็นว่าสามารถสร้าง VM ไปที่ KVM node ที่ต้องการได้ เครื่อง KVM node01 เป็น AMD Phenom(tm) II X4 945 Processor มี RAM 8 GB และ KVM node02 เป็น Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz มี RAM 4 GB

    นอกจากเครื่องคอมฯ แล้ว ผมก็มี network switch (L2-managed) เพื่อกำหนด port ให้รองรับ 802.1Q VLAN ผมออกแบบให้มี 2 VLAN คือ VLAN ID 6 (untagged) และ VLAN ID 7 (tagged) ซึ่ง VLAN 6 ก็คือ ครึ่งแรกของ network class C 192.168.6.0 เขียนแบบ CIDR 192.168.6.0/25 มี gateway คือ 192.168.6.1 และ VLAN 7 ก็คือ ครึ่งหลังของ network 192.168.6.128/25 มี gateway คือ 192.168.6.129

    ผมเขียนขั้นตอนไว้ในเว็บไซต์ opensource.psu.ac.th จะสะดวกกว่านำมาใส่ไว้ในบล็อกนี้ทั้งหมด เข้าไปที่ https://opensource.cc.psu.ac.th/Ubuntu1804 ก็จะเห็น link ต่อไปนี้

    แล้วจะมานำเสนอเรืองราวถัดไปครับ

  • python #02 – ติดตั้ง Tensorflow และ Keras

    ต่อจาก python #01 – ติดตั้ง jupyter notebook บน Windows

    ต่อไปเราจะใช้ Machine Learning Library “Tensorflow” และใช้ “Keras” ซึ่งเป็น High-level Neuron Network API ซึ่งจะไปเรียกใช้ Backend คือ Tensorflow อีกชั้นหนึ่ง

    จาก jupyter notebook ทำตามขั้นตอนต่อไปนี

    1.  คำสั่งต่อไปนี้ เพื่อติดตั้ง Tensorflow

    ! pip install tensorflow

    2.  คำสั่งต่อไปนี้ เพื่อติดตั้ง Keras

    ! pip install keras

    จะได้ผลประมาณนี้

    สร้าง Neural Network ด้วย Keras

    เริ่มจาก import ส่วนต่าง ๆ ได้แก่ Models และ Layers

    import keras
    from keras.models import Sequential
    from keras.layers import Input, Dense

    สมมุติเราจะสร้าง Model แบบนี้

    model = Sequential([
        Dense(8, activation='relu', input_shape=(10,), name="Hidden_Layer_1"),
        Dense(5, activation='relu', name='Hidden_Layer_2'),
        Dense(3, activation='softmax' , name='Output_Layer')
    ])

    เสร็จแล้วก็ต้อง compile ตั้งค่า Hyperparameters ต่าง ๆ

    model.compile( loss='categorical_crossentropy',
        optimizer=keras.optimizers.adam(lr=0.001),
        metrics=['accuracy'])

    ดู Summary

    model.summary()

    ได้ผลประมาณนี้

  • python #01 – ติดตั้ง jupyter notebook บน Windows

    jupyter Notebook เป็น Open Source Web Application ให้เราสามารถเขียนภาษา python ได้ง่ายขึ้น สามารถ Share ได้ด้วย และยังสามารถใส่คำอธิบาย (Markdown) ได้ด้วย ติดตั้งลงในเครื่องส่วนตัวได้ ในบทความนี้ แสดงวิธีติดตั้งและใช้งานบน Microsoft Windows ดังนี้

    1. ขั้นแรก ต้องมี Python ก่อน (หมายเหตุ: ณ เวลานี้ 27/11/61 รุ่นล่าสุดคือ 3.7.1 แต่เนื่องจากจะแนะนำการใช้งาน Tensorflow, Keras จึงยังต้องเลือกใช้ Python 3.6.7)

    https://www.python.org/ftp/python/3.6.7/python-3.6.7.exe

    เมื่อติดตั้งแล้ว ควร Restart เครื่องสักหนึ่งครั้ง

    2. ติดตั้ง pip ซึ่งใช้ในการติดตั้งเครื่องมือต่าง ๆ
    เปิด Windows Console (กดปุ่ม Win + R) แล้วพิมพ์คำสั่ง cmd
    จากนั้น ใช้คำสั่งต่อไปนี้

    python -m pip install --upgrade pip setuptools wheel

    3. (Optional) ติดตั้ง virtualenv เพื่อให้สามารถจัดการ Virtual Environment ได้ง่ายขึ้น เพราะอาจจะต้องทำหลาย Project ซึ่งใช้รุ่นของ Package/Module ที่แตกต่างกันบนเครื่องเดียวกัน

    pip install virtualenv

    4. ติดตั้ง jupyter notebook

    pip install jupyter

    5. เมื่อติดตั้งเสร็จแล้ว ก็ใช้คำสั่งต่อไปนี้

    jupyter notebook

    ระบบจะเปิด Web Browser มายัง http://localhost:8888

    จากนั้น คลิกที่ปุ่ม New > Python3

    จากนั้น เราก็จะสามารถใช้คำสั่ง Python ทั่ว ๆ ไปได้

    นอกจากนี้ ยัง Save ได้ และสามารถส่งต่อให้ผู้อื่นใช้ได้ด้วย

  • Ubuntu server 18.04 config static IP with netplan

    เดิมก่อนหน้า Ubuntu server 18.04 LTS จะออกมาให้ใช้งานกันนั้น จะเป็น Ubuntu server 16.04 LTS เราตั้งค่า (config) static IP ให้กับ server ด้วยไฟล์นี้ /etc/network/interfaces ซึ่งก็คือ software package ชื่อ ifupdown และ DNS resolver ที่ใช้ก็คือ resolvconf

    แต่ใน Ubuntu server 18.04 นี้ เปลี่ยนไปใช้ package ชื่อ netplan แก้ไขที่ไฟล์ /etc/netplan/01-netcfg.yaml และใช้ DNS resolver คือ systemd-resolve ซึ่งจะ connect สอบถามชื่อ DNS จาก internal DNS ที่ IP 127.0.0.53 (ตรวจดูด้วยคำสั่ง cat /etc/resolv.conf)

    โดย default จะเป็นค่า network interface แบบ รับค่า IP มาจาก DHCP server

    ไฟล์ /etc/netplan/01-netcfg.yaml

    network:
    version: 2
    renderer: networkd
    ethernets:
    enp0s3:
    dhcp4: yes
    dhcp6: yes

    หากต้องการใช้เลข IP แบบ Static IP ก็ต้องตั้งค่าเองในแฟ้ม /etc/netplan/01-netcfg.yaml เป็นตัวอย่างประมาณว่า IP คือ 10.0.100.251 ใน class C (/24) มี gateway คือ 10.0.100.1 ทำหน้าที่ nameserver ด้วย และมี nameserver ที่สองคือ 192.100.77.10

     network:
    version: 2
    renderer: networkd
    ethernets:
    enp0s3:
    dhcp4: no
    addresses: [ 10.0.100.251/24 ]
    gateway4: 10.0.100.1
    nameservers:
    addresses:
    - 10.0.100.1
    - 192.100.77.10

    หลังจากแก้ไขค่าเสร็จแล้ว สั่งให้ network ทำงานใหม่ ใช้คำสั่ง sudo netplan apply

    ถ้าตอนนี้ใช้ netplan version 0.36.3 เราสามารถตั้งชื่อ network interface เป็นชื่อ vif1 แทน physical network interface เดิม

    ก่อนอื่น ให้ใช้คำสั่ง ifconfig เพื่อดูค่า MAC address ของ enp0s3 สมมติคือ 44:bb:33:85:91:08

    ตัวอย่างการแก้ไขข้อมูล

    network:
    version: 2
    renderer: networkd
    ethernets:
    vif1:
    match:
    macaddress: "44:bb:33:85:91:08"
    set-name: vif1
    dhcp4: no
    addresses: [ 10.0.100.251/24 ]
    gateway4: 10.0.100.1
    nameservers:
    addresses:
    - 10.0.100.1
    - 192.100.77.10

    หลังจากแก้ไขค่าเสร็จแล้ว ใช้คำสั่ง sudo reboot

    หลาย ๆ คน อาจจะอยากตั้งชื่อ network interface เป็นชื่อ eth0 แบบเดิมที่ชินตา ก็ทำได้ครับ ลองดูครับ และหมายเหตุไว้สักนิดว่า ไวยกรณ์ของไฟล์ *.yaml นี้ ต้องมีการเว้นวรรค เยื้องเข้า ให้ถูกต้องด้วยนะ เยื้องด้วยช่องว่างอย่างน้อย 2 spaces (เค้าว่ามา)

    ผมได้รวบรวมเป็น wiki เอาไว้สำหรับเรื่องคล้าย ๆ กันนี้

  • Stencil : JSX

    Stencil component ใช้ JSX template syntax ในการกำหนดรูปแบบการแสดงผลที่จะถูก render ของ component  ซึ่งแต่ละ component จะมี render function ที่จะทำหน้าที่ return โครงสร้างของ component ที่จะเปลี่ยนเป็น DOM ตอน runtime เพื่อแสดงผลบนหน้าจอ

    class MyComponent {
        render() {
           return (
              <div>
                <h1>Hello World</h1>
                <p>This is JSX!</p>
              </div>
           );
        }
    }
    

    จาก class Mycomponent ด้านบน render function จะ return div element ที่ภายในประกอบไปด้วย h1 และ p

    Data Binding

    เมื่อ component ต้องการที่จะ render ข้อมูลที่มีการเปลี่ยนแปลง dynamic data ทำได้โดยการ bindind ข้อมูลนั้นๆ โดยใช้ {variable}  (ซึ่งจะใกล้เคียงกับ ES6 template ที่ใช้ ${variable})

    render() {
         return (
            <div>Hello {this.name}</div>
         )
    }
    

    Conditionals

    เมื่อ component มีการแสดงผลที่ขึ้นอยู่กับเงื่อนไข สามารถใช้ JavaScript if/else statements ใน render function ดังเช่นตัวอย่างด้านล่างนี้ ถ้า this.name ไม่มีการกำหนดค่า จะแสดงผล “Hello, World”

    render() {
        if (this.name) {
            return ( <div>Hello {this.name}</div> )
        } else {
            return ( <div>Hello, World</div> )
        }
    }
    

    หรือ จะเขียนในรูปแบบ inline conditionals ก็ได้เช่นกัน

    render() { 
           return ( 
              <div> 
              {this.name 
                   ? <p>Hello {this.name}</p> 
                   : <p>Hello World</p> 
              } 
              </div> 
           ); 
    }
    

    Loops

    ใน JSX สามารถใช้ array operators : map ในการทำงานแบบ loop  จากตัวอย่างด้านล่าง มี lists ของ todo object ใน this.Objects ซึ่ง map function ทำหน้าที่ loop ในแต่ละ todo object ใน this.Objects แล้วสร้าง new JSX sub tree และ add เข้าไปใน array ที่จะ return ออกจาก map function ซึ่งจะเพิ่มเข้าไปใน JSX tree ด้านนอกนั่นคือ div element

    render() {
       return (
         <div>
           {this.todos.map((todo) =>
               <div>
                 <div>{todo.taskName}</div>
                 <div>{todo.isCompleted}</div>
               </div>
           )}
         </div>
      )
    }
    

    Handling User Input

    Stencil สามารถใช้ native DOM events ได้ดังตัวอย่างด้านล่าง

    export class MyComponent 
    { 
           handleClick(event: UIEvent) { 
                alert('Received the button click!'); 
           } 
           render() { 
               return ( 
                  <button onClick={ (event: UIEvent) => this.handleClick(event)}>Click Me!               
                  </button> 
               ); 
           } 
    }
    

    หรือจะเขียนในรูปแบบ  onClick={this.handleClick.bind(this)} ก็ได้เช่นกัน

      handleClick(event: UIEvent) {
        alert('Received the button click!');
      }
    
      render() {
        return (
          <button onClick={this.handleClick.bind(this)}>Click Me!</button>
        );
      }
    

     

    อ้างอิง : https://stenciljs.com/docs/templating-jsx

     

  • เตือนภัยอีเมลหลอกลวงว่าเป็นธนาคารกรุงไทย (Spam 2018-11-14)

    เช้านี้มีอีเมลหลอกลวงหลุดเข้ามา

    อ้างว่ามาจาก Krungthai Bank PCL ดังภาพ

    จะเห็นว่า From ก็หลอกว่ามาจาก info@ktb.co.th และในเนื้อหาก็มี Logo ของธนาคาร แถมมี Link  ที่วิ่งไป

    HTTPS://WWW.KTB.CO.TH/PERSONAL/DETAIL/VERIFY/172

    แต่ไม่ใช่ของจริง !!!

    เพราะ ถ้าท่านดูอีเมลฉบับนี้แบบ HTML จะเป็นการส่ง Link ไปที่ “เว็บไซต์หลอกลวง” หรือเรียกว่า Phishing Site 

    ไม่แนะนำให้คลิกตาม

    https://scrappse.tk/jssl/ktbnetbank/krungthai/index.html

    ซึ่งจะได้หน้าตาเหมือนกับของธนาคารจริง ๆ เพราะมันไปใช้ภาพจากเว็บไซต์จริง

    เว็บไซต์หลอกลวง !!!!

    และใช้ HTTPS และได้ “กุญแจ” ที่บอกว่า valid certificate อีกด้วย เพราะใช้ Let’s Encrypt

    ดังนั้นจึงแจ้งเตือนภัยมายังประชาคมให้รับทราบ ว่าปัจจุบันนี้

    • เห็น LINK ใน Email แล้วเป็น URL ชื่อของธนาคารจริง ก็ยังไม่พอ (กรณีนี้เป็นของ www.ktb.co.th)
    • คลิกไป เจอหน้าเว็บ หน้าตาน่าเชื่อถือ ก็ไม่พอ (ตามภาพ เลียนแบบเหมือนมาก)
    • ดูว่ามี “กุญแจ” ของ HTTPS ถูกต้องก็ไม่พอ (กรณีนี้ ได้กุญแจมาแล้ว แต่เป็นของเว็บไซต์หลอกลวง)
    • ดังนั้น ต้องดูด้วยว่า URL ที่ท่านเห็นด้านบน เป็นของธนาคารจริง ๆ หรือไม่ !!! (ในกรณีนี้ ไม่จริง เพราะเป็นของ https://scrappse.tk )

    ธนาคารกรุงไทย ได้แจ้งเตือนเรื่องนี้ไว้แล้วที่ 

    https://www.ktb.co.th/th/krungthai-update/announcement-detail/162

    ดังนั้น หากท่านได้รับ Email ในทำนองนี้ ให้ตรวจสอบกับธนาคาร หรือผู้เชี่ยวชาญก่อน เพราะคนร้ายจะหลอกให้ท่านกรอก Username/Password เพื่อเข้าสู่บัญชีธนาคารของท่านได้

  • วิธีติดตั้ง HTTPS ด้วย Certificate ของ Let’s Encrypt

    จาก มาใช้งาน let’s encrypt กันเถอะ ของอาจารย์ฉัตรชัย ผมขอขยายความต่อ เอาแบบว่า Copy-Paste กันเลย

    โดยในที่นี้ …

    • OS เป็น Ubuntu 18.04
    • Web Server เป็น Apache
    • ที่ Firewall เปิดให้เข้าถึง TCP 80 / 443 จาก Internet ได้ — มันจำเป็นสำหรับการ Verification ของ Certbot ครับ *** ในเบื้องต้นนะ 🙂 ***

    Let’s Encrypt คืออะไร อ่าน …
    https://letsencrypt.org/getting-started/

    เริ่มต้น ต้องติดตั้ง Certbot ก่อน อ่าน …
    https://certbot.eff.org/

    ดูต้นฉบับการติดตั้งของ Ubuntu 18.04 และใช้ Apache ได้จาก
    https://certbot.eff.org/lets-encrypt/ubuntubionic-apache

    ติดตั้ง Certbot ก่อน

    ใช้คำสั่งต่อไปนี้ จาก User ที่สามารถ sudo ได้

    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install python-certbot-apache 

    แบบ Auto

    จากนั้นใช้คำสั่งต่อไปนี้ เพื่อให้ certbot ทำการติดตั้ง Certificate และแก้ไขไฟล์ (ในที่นี้ใช้ Apache) Configuration ให้เลย

    sudo certbot --apache

    แบบแก้ไขเอง

    หรือถ้าจะทำเอง โดยต้องการเอาเฉพาะ Certificate มา แล้วทำการแก้ไขไฟล์ Apache Configuration เองก็ได้

    sudo certbot --apache certonly 

    ระบบจะถาม

    • ยอมรับเงื่อนไขไม๊ –> แน่นอน (A) Accept
    • email address ให้ใส่ไปตามจริง
    • ต้องการให้แสดง email address เปิดเผยหรือไม่ –> ผมตอบ No นะ
    • และ บอกว่า Domain Name ของเราคืออะไร ให้ใส่ FQDN ไป เช่น kx1.in.psu.ac.th เป็นต้น

    จากนั้น Certbot จะ Callback ไป ให้มีการ Verification จาก Internet ว่าสามารถเข้าถึงได้จริงหรือไม่ (ตรงนี้ ใน PSU ต้องแจ้งทาง Network Admin เพื่อเปิด Port ที่ Firewall ให้เข้าถึง TCP 80 และ 443 ให้สำเร็จก่อน)

    เมื่อ Verification สำเร็จ ก็จะได้ไฟล์ Certificate และ Private Key มา จะอยู่ที่ (path แต่ละเครื่องจะแตกต่างกันตรงที่ Domain Name ที่กำหนดข้างต้น) ตามลำดับ

    /etc/letsencrypt/live/kx1.in.psu.ac.th/fullchain.pem
    /etc/letsencrypt/live/kx1.in.psu.ac.th/privkey.pem

    แก้ไขไฟล์

    /etc/apache2/sites-available/default-ssl.conf

    ให้มีค่าต่อไปนี้

    SSLCertificateFile  
       /etc/letsencrypt/live/kx1.in.psu.ac.th/fullchain.pem
    SSLCertificateKeyFile 
        /etc/letsencrypt/live/kx1.in.psu.ac.th/privkey.pem

    จากนั้นใช้คำสั่งนี้ เพื่อเปิดใช้งาน https

    sudo a2enmod ssl

    ใช้คำสั่งนี้ เพื่อใช้งาน default-ssl

    sudo a2ensite default-ssl

    และทำการ Restart apache ด้วยคำสั่งนี้

    sudo systemctl reload apache2

    ทดสอบใช้งาน HTTPS

    ใช้งานได้

    NOTE

    • จริง ๆ แล้ว ในองค์กร สามารถทำเครื่อง ๆ หนึ่งขึ้นมา เพื่อติดตั้ง certbot แล้วขอ Certificate มา ของ Domain ต่าง ๆ แล้วค่อย “ย้าย” certificate และ key file ไปเครื่องที่จะใช้งานจริง แล้ว ชี้ Domain Name ใหม่ไปยังเครื่องนั้นก็ได้ แต่เมื่อครบ 90 วัน ต้อง Renew ใหม่ (ทดลองทำกับ Google Compute Engine โดยสร้าง Certificate โดยชี้ Domain ไปยัง IP จริง ของ Google พอเรียบร้อยแล้ว ก็แล้วย้ายไฟล์ ย้าย Domain Name มาที่ IP ภายใน ใช้งานได้ เหมือนกัน) — วิธีนี้ลักไก่เอาได้ แต่ก็จะยุ่งยากหน่อย และต้องระวัง 90 วันที่จะต้อง Renew
    • แต่จะให้ถูกต้อง ก็ควรใช้งานกับเครื่องที่เปิด Firewall ให้เข้าถึง TCP 80 / 443 ได้ เพื่อติดตั้ง certbot จะดีกว่า
    • สามารถขอ Wildcard ได้ เช่น จะขอ *.kx1.in.psu.ac.th ก็ได้ แต่ต้องมีความรู้ DNS กว่านี้หน่อย เดี๋ยวค่อยมาเล่าให้ฟังครับ
    • [UPDATE] กรณีเป็น Web Hosting กล่าวคือ ให้บริการหลาย ๆ Virtual Host เช่น เครื่องหลักใช้ชื่อว่า kx1.in.psu.ac.th ถ้าต้องการให้ www.something.psu.ac.th ชี้มาที่เครื่องนี้ด้วย ก็ทำ www CNAME kx1.in.psu.ac.th.  (ที่ zone something.psu.ac.th) มาก็ได้ แล้วค่อยใช้ certbot ที่เครื่อง kx1.in.psu.ac.th นี้ สร้าง Certificate ให้ก็ได้ครับ

    หวังว่าจะเป็นประโยชน์ครับ