Python matplotlib Invalid DISPLAY variable

Monday, December 11, 2017 11:36 PM 0 Comments

Fixed by

matplotlib.pyplot as plt
plt.switch_backend('agg') 
Ref:
https://github.com/matplotlib/matplotlib/issues/3466/#issuecomment-195899517

0 comments:

[Google Colab] ติดตั้ง Python Package เพิ่มแบบแฮกหน่อยๆ

Tuesday, November 7, 2017 10:42 PM 0 Comments , ,

หลังจากที่ได้ทดลองใช้งาน Google Colab (Jupyter Notebook ฟรีจาก Google) ตั้งแต่วันที่ 27 ตุลาคม เป็นต้นมา ก็ได้พบวิธีที่จะติดตั้ง Python Package เพิ่มแบบแฮกหน่อยๆ

หลักการ
1. Reverse Shell
2. pip install PACKAGE

สิ่งที่ต้องการ
1. Public Server ของเราเองเอาไว้ reverse shell

วิธีการ
1. Remote ไปยัง Public Server ของเรา
2. รันคำสั่ง netcat

nc -lv 13337
3. สร้าง Google Colab ใหม่มา 1 อัน นำคำสั่ง reverse shell ไปรัน (อย่าลืมแก้ IP Address กับ Port ให้ตรงกับ Server เรา และที่ netcat กำลัง listen อยู่)


4. เมื่อได้ Shell ก็สั่งติดตั้ง Package ที่ต้องการ

pip install PACKAGE

Proof of concept

1. ทดลอง import keras แต่ว่าไม่พบ module


2. เมื่อรันคำสั่ง Reverse Shell เพื่อที่ให้ Google Colab connect กลับมายัง Server ของเราที่ตั้ง netcat รอไว้ก็จะได้ Shell



3. สั่งติดตั้ง package keras ผ่าน pip เมื่อลองรันคำสั่ง import keras ใน  Colab อีกครั้งก็จะสามารถ import ได้


4. ทดลองใช้งาน keras package โดยการ Train MNIST CNN


Video



ตัว Google Colab นั้นจะสร้าง Docker container ขึ้นมาเพื่อให้แต่ละคนใช้งานโดยจะได้สเปคคือ RAM 12 GB และ CPU Xeon 2.2 GHz 2 core เมื่อเราไม่ได้ใช้งานตัว Container ก็จะถูกทำลายทิ้ง พอเรากลับมาใช้งานใหม่อีกครั้งก็จะสร้าง Container ใหม่ขึ้นมา

ปล. เราสามารถติดตั้งโปรแกรมอื่นๆใน Container ได้ด้วยนะ อิอิ
ปล2. ไม่ใช่ Google Security Bug

Follow me on Github: https://github.com/kittinan

0 comments:

Circle CI กับ Python

Sunday, October 15, 2017 11:39 AM 0 Comments

วันนี้จะเป็นบันทึกการทดลองเล่น Circle CI โดยจะให้เจ้า Circle CI นั้นเชื่อมต่อกับ Gtihub ในการรัน Test ซึ่ง Circle CI ก็จะมี Plan ต่างๆดังนี้ https://circleci.com/pricing/ ในที่นี้เราก็จะใช้ Free Plan

สิ่งที่ต้องการ
- Github Public Repo ที่มี Test อยู่แล้ว (ถ้าไม่มีก็เริ่มเขียน Test ซะตั้งแต่วันนี้)
- Circle CI (แค่ Login ด้วย Github User)

ทำการ Setup Project กับ Circle CI

- ทำการเพิ่ม Project ในเวป Circle CI จากเมนู Add Project ทางด้านซ้าย



- เลือก Operating System และ Platform ในที่นี้จะใช้เป็น Linux และ Platform version 2.0  (version 2.0 เราสามารถใช้ Docker image ในการรันได้)



- เลือก ภาษา ที่ใช้ ในที่นี้ผมลองใช้ Python ในการรัน

- เมื่อเลื่อนลงมาด้านล่างจะมีคำแนะนำให้สร้าง Folder .circleci และ ไฟล์ config.yml โดยจะมี Config เบื้องต้นให้เรานำไปใส่ในไฟล์ config.yml ได้เลย

- โดยผมมีการปรับแก้เล็กน้อยตรงคำสั่งในการรัน Test โดยผมแก้เป็น


python -m unittest discover ./tests/

ตัวอย่างไฟล์ .circleci/config.yaml

- ทำการ commit และ Push

- กดปุ่ม Start Building ใน Circle CI



- ระบบ  Circle CI ก็จะทำการ Setup Envoriment และตั้งค่าต่างๆตาม config.yaml ของเรา เมื่อมาดู Result ในการ run test ก็จะเห็นว่าสำเร็จเรียบร้อยดี





- เมื่อเรามีการแก้ไข code ของเราและ Push code เข้าไปใน github ระบบก็จะทำ Build และ Test ให้อัตโนมัติ พร้อมมี Email แจ้งเตือนอย่างสวยงาม



เป็นอันเสร็จสิ้นการทดลองเล่น Circle CI ในเบื้องต้น 

เราสามารถนำ Badge การ Build & Test มาแปะในหน้าเวปของเราได้โดยเข้าไปที่ Setting ของ Project ใน Circle CI และเลือก Status Badges



สรุป
จากความรู้สึกในการเล่น Circle CI ครั้งแรก มีความรู้สึกว่าระบบของ Circle CI build ได้รวดเร็วกว่าของทาง Travis CI สามารถดู Code ตัวอย่างได้ที่ https://github.com/kittinan/my-learn-circleci

Ref:

0 comments:

Train Model บน Cloud ด้วย Google Cloud Machine Learning Engine

Sunday, August 13, 2017 12:06 PM 1 Comments , ,

สวัสดีครับผมจะมาเล่าประสบการณ์ การทดลองใช้งาน Google Cloud Machine Learning Engine หรือเรียกสั้นๆ Cloud ML Engine โดยความสามารถของมันก็คือ การนำ Model Machine Learning ที่เราสร้างขึ้นมาโดย Tensorflow หรือ Keras (Tensorflow Backend) ไป Train บน Cloud ของ Google นั่นเอง ซึ่งการใช้งาน Cloud ML Engine นั้นมีค่าใช้จ่ายคร่าวๆดังนี้




วิธีการคำนวนราคาโดยละเอียดจะคิดเป็น ML training unit ซึ่งสามารถตรวจสอบได้ที่ https://cloud.google.com/ml-engine/pricing

สำหรับ Account Google Cloud ใหม่ Google จะให้ Credit 300 USD ใช้ได้ 12 เดือน ดูรายละเอียดได้ที่ https://cloud.google.com/free/ (ผมก็ใช้ไอตัว Free Credit เนี่ยแหละมาลองเล่น)

สิ่งที่ต้องการ

- Account Google Cloud ที่ผูกบัตรเครดิตเรียบร้อย
- เครื่องที่ติดตั้ง  Google Cloud SDK เสร็จเรียบร้อย (วิธีการติดตั้งดูที่ https://cloud.google.com/sdk/downloads)
- Code Model ที่ต้องการ Train (ในที่นี้ผมจะ Train โดยใช้ Keras ที่มี Tensorflow เป็น Backend โดยใช้โปรเจค thai-handwriting-number)

สร้างโปรเจค

- ทำการสร้างโปรเจคใหม่หรือจะใช้โปรเจคเดิมที่มีอยู่แล้วก็ได้

สร้างโปรจคใหม่โดยใช้ชื่อ test-cloud-ml

- รันคำสั่งในเครื่องเราเอง

gcloud projects list

ก็จะขึ้นโปรเจคใหม่ที่เราสร้างขึ้นมาดังภาพ



ตั้งให้โปรเจค test-cloud-ml เป็นโปรเจคหลัก (ใช้ PROJECT_ID)

gcloud config set project test-cloud-ml-176413

เปิดการใช้งาน Google Cloud Machine Learning Engine ให้กับโปรเจคของเรา โดยเข้าไปที่ APIs & services > Library

เลือก Machine Learning Engine API

กด Enable

สิ่งที่ควรรู้ก่อนการปรับปรุง Code เพื่อนำไป Train บน Cloud

-  Cloud ML Runtime นั้นใช้ Python 2.7 สามารถตรวจสอบ Package ต่างๆและ Version ของ Cloud ML Runtime ได้ที่ https://cloud.google.com/ml-engine/docs/concepts/runtime-version-list

- ข้อมูลที่เรา Read / Write ทั้งหมดนั้นต้องผ่าน Google Cloud Storage  (เราควรจัดการ Dataset ที่จะใช้ Train ให้สะดวกในการใช้งาน ในที่นี้จะจัดการ Dataset ให้อยู่ใน format ของ pickle ซึ่งต้องใช้ protocol version 2)

ปรับปรุง Code สำหรับ Train บน Cloud

1. จัดการอัพโหลด Dataset ที่ใช้ในการ Train อัพโหลดขึ้น Google Cloud Stroage เสียก่อน ในที่นี้ผม Serialize ข้อมูลด้วย pickle แล้วเซฟเป็นไฟล์ไว้ โดยต้องใช้ protolcol version 2

pickle.dump(DATASET_VARIABLE, open("dataset.pkl", "wb"), protocol = 2)

1.1 จัดการสร้าง bucket ของ Google Cloud Storage โดยในที่นี้จะตั้งชื่อ bucket ว่า kittinan (bucket เปรียบเสมือนตู้คอนเทนเนอร์อันนึงที่เอาไว้จัดเก็บข้อมูลของเรา https://cloud.google.com/storage/docs/key-terms#buckets)  โดยสร้าง bucket ด้วยคำสั่ง

 gsutil mb gs://kittinan/
หรือเราสามารถสร้างในหน้าเวปก็ได้



1.2 อัพโหลดไฟล์ Dataset เข้า Google Cloud Storage ด้วยคำสั่ง

gsutil cp SOURCE gs:://BUCKET_NAME/
ตัวอย่าง
gsutil cp src/thainumber_28.pkl gs://kittinan/
ภาพเมื่ออัพโหลดไฟล์เสร็จ

ลองเข้าไปดูในหน้าเวป Google Cloud Storage ก็จะเจอไฟล์ที่เราเพิ่งอัพโหลดเพิ่มขึ้นมา


2. สร้าง Folder ชื่ออะไรก็ได้ (ในที่นี้จะใช้ชื่อ Folder ว่า cloud-ml-engine) โดยมีโครงสร้างไฟล์ดังนี้



setup.py
ระบุข้อมูลต่างๆ และ require package ต่างๆ
https://cloud.google.com/ml-engine/docs/how-tos/packaging-trainer#recommended_project_structure


config.yml
ระบุค่า parameter ต่างๆของการ Train ครั้งนี้ ในที่นี้ระบุว่าให้ใช้ scaleTiear ที่เป็น BASIC_GPU
https://cloud.google.com/ml-engine/reference/rest/v1/projects.jobs#traininginput


trainer > __init__.py
ไฟล์เปล่าๆ ใช้สำหรับ setuptools ที่อยู่ในไฟล์ setup.py 

trainer > model.py
- ใช้ argparse module ในการ parse argument ต่างๆ โดยใน code นี้จะทำการ parse argument ของ training data และ job directory (Google Cloud Storage Path)

- Read / Write File ต่างๆ ด้วย tensorflow.python.lib.io.file_io แทน


ทดสอบรันบนเครื่องตัวเองก่อนด้วยคำสั่ง

gcloud ml-engine local train \
  --job-dir ./ \
  --module-name trainer.model \
  --package-path ./trainer \
  -- \
  --train-file ../thainumber_28.pkl
--job-dir : directory หรือ Google Cloud Storage ที่ใช้ในการ Package ไฟล์ (ML Engine จะส่ง argument job-dir ไปยัง script โปรแกรมเราด้วย)
--module-name : module ที่เราต้องการรัน
--package-path : path ของ module ที่เราจะรัน
option ที่อยู่หลัง -- \ : คือ argument สำหรับ script โปรแกรมเรา

ภาพการรันบนเครื่องตัวเอง

รันบน Cloud ML Engine
ผมสร้าง Shell Script ขึ้นมาชื่อไฟล์ start_train.sh เพื่อความสะดวกในการแก้ไขค่าต่างๆและการรัน โดยมีคำสั่งดังนี้


export environment variables ต่างๆดังนี้
BUCKET_NAME - ชื่อ Bucket Google Cloud Storage ที่เราใช้
JOB_NAME - ชื่อ job ของเรา
JOB_DIR - Path Bucket Google Cloud Storage
REGION - จะใช้ region ไหนในการรัน (ในที่นี้ใช้ US เพราะถูกกว่า)

Option ต่างๆของ command gcloud ก็จะคล้ายๆกับการรันแบบ Local โดยที่มีเพิ่มเติมขึ้นมาดังนี้

--runtime-version : จะใช้ runtime version ไหน (https://cloud.google.com/ml-engine/docs/concepts/runtime-version-list)
--region : จะใช้ region ไหน
--config : config yaml ไฟล์ ที่ระบุ training input ต่างๆ
--train-file : Argument ของ script ที่ระบุ Path Training Data ที่อยู่บน  Google Cloud Storage

ลองรัน ./start_train.sh กันเลย



เมื่อเรารันสำเร็จ gcloud command จะแนะนำคำสั่งในการ stream log ให้เรา เมื่อลองรันดูก็จะเห็น log ในการรันบน cloud ต่างๆดังภาพ


เราสามารถเข้าไปดู Log ในเวปได้ด้วยนะ

https://console.cloud.google.com/mlengine/jobs




หลังจากรันเสร็จลองเข้าไปดูใน  Bucket ของเราก็จะพบกับ folder ที่มีชื่อ job name ของเรา


เมื่อเข้าไปใน folder ก็จะพบ model_weight.h5 ที่เราสั่งเซฟไว้ใน Code ของเราหลัง Train เสร็จ

เป็นอันเสร็จสิ้นการทดลองเล่น Google Cloud Machine Learning Engine ครับผม

เพิ่มเติม

ทดลอง Download weight model มาลองรัน predict ดู


สามารถดู Code ทั้งหมดได้ที่
https://github.com/kittinan/thai-handwriting-number
https://github.com/kittinan/thai-handwriting-number/tree/master/src/cloud-ml-engine

อ้างอิง
https://cloud.google.com/ml-engine
https://github.com/clintonreece/keras-cloud-ml-engine

1 comments:

Ubuntu VLC 3.0 Fix subtitle not display

Monday, July 24, 2017 9:04 PM 0 Comments ,

Solution

Tools > Preferences > Video > change the output field from Default to x11 video output (XCB).




Reference:
https://askubuntu.com/a/907164

0 comments:

Ubuntu 14.04 Connect Android Using MTP

Saturday, July 22, 2017 8:54 AM 0 Comments , ,


STEP 1
Firstly we're going to need to install some of the common MTP apps that will be needed. Open up a terminal and type the following two lines one after the other.


sudo apt-get install libmtp-common mtp-tools libmtp-dev libmtp-runtime libmtp9

sudo apt-get dist-upgrade

STEP 2
Then we're going to amend the fuse.conf file. FUSE is an application that aims to provide a secure method for non privileged users to create and mount their own file system implementations. This option overrides the security measure restricting file access to the user mounting the file system. So all users (including root) can access the files. This option is by default only allowed to root, but this restriction can be removed with a change to the aforementioned fuse.conf file as follows:

At the terminal type


sudo nano /etc/fuse.conf

We want to remove the # from the below line of code for user_allow_other, like so...


#/etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE)

#Set the maximum number of FUSE mounts allowed to non-root users.
#The default is 1000.
#mount_max = 1000

# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other


Now save the file by pressing Ctrl+x, press Y and then Enter.

STEP 3

We now need to set up some rules for our device that we plan on connecting, but before we do that we need to find out both the vendor and product id

Connect your device via an available usb port and from terminal enter


lsusb
This should bring up an output similar to the following


Bus 002 Device 003: ID 0fce:01b1 Sony Ericsson Mobile Communications AB
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 006: ID 0461:4d65 Primax Electronics, Ltd
Bus 001 Device 005: ID 0846:9020 NetGear, Inc. WNA3100(v1) Wireless-N 300


You need to look for your device, in this instance my Sony Tablet is at the top of the list, the vendor id is 0fce and product id is 01b1

STEP 4
We're then going to amend the mtp udev rules as follows, from a terminal type


sudo nano /lib/udev/rules.d/69-mtp.rules

Then add the below line of code


# Sony Xperia Z2 Tablet
ATTR{idVendor}=="0fce", ATTR{idProduct}=="01b1", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"

Remember what you're changing here is the device name next to the #, this can be whatever you want, the # comments out the code, but for clarity and reference later I would choose the name of your tablet/phone and also the vendor id and product id, they should match what was seen when you issued the lsusb command earlier.

Once done, save the file.

STEP 5
The next step would also be to add a line of code to the 51 android rules file, again from a terminal type


sudo nano /etc/udev/rules.d/51-android.rules

Then add the following line of code


ATTR{idVendor}=="0fce", ATTR{idProduct}=="01b1", MODE=”0666"

Remember what I have highlighted in red needs to be changed to your device product id and vendor id.

Once that is done and the file is saved, remove any usb device currently connected and issue the following commands

[B]STEP 6


sudo service udev restart

Then save any other remaining work you may have open and reboot the system.

STEP 7

sudo reboot


Source: https://ubuntuforums.org/archive/index.php/t-2226702.html

0 comments:

Linux 11 log file should know

Tuesday, June 20, 2017 9:21 AM 0 Comments ,

/var/log/messages : General message and system related stuff
/var/log/boot.log : Services success/failures at boot
/var/log/secure or /var/log/auth.log : Authentication log
/var/log/utmp or /var/log/wtmp : Login records
/var/log/btmp  : Failed login records
/var/log/cron : Scheduler log file
/var/log/maillog : Mail logs
/var/log/xferlog : File transfer logs
/var/log/lastlog : Last login details
dmesg : Device driver messages
/var/crash logs : System crash dump


0 comments:

Linux record audio command for Google Cloud Speech API

Sunday, March 26, 2017 8:15 PM 0 Comments

Command:

arecord -f S16_LE -V mono -r 8000 record.wav

API Request:

{
  "config": {
    "sampleRate": 8000,
    "encoding": "LINEAR16",
    "languageCode": "th"
  },
  "audio": {
    "content": "CONTENT_BASE64"
  }
}


https://cloud.google.com/speech/docs/sync-recognize#speech-sync-recognize-protocol

0 comments:

Ubuntu 14.04 Yubikey 4 U2F not work

Thursday, February 2, 2017 9:29 PM 0 Comments

I got Yubikey 4 today but U2F Feature not work on my Chrome.

Fix by

cd /etc/udev/rules.d
sudo wget https://raw.githubusercontent.com/Yubico/yubikey-personalization/master/69-yubikey.rules
sudo wget https://raw.githubusercontent.com/Yubico/yubikey-personalization/master/70-yubikey.rules

Unplug and insert Yubikey again

U2F will work


0 comments:

ส่ง Notification ผ่าน Line Notify ด้วย PHP

Monday, January 16, 2017 12:25 AM 32 Comments , ,

วันนี้จะมาแนะนำการส่ง Notification ผ่าน Line Notify ด้วยภาษา PHP กันครับ

โดย Line Notify นั้นมีความสามารถดังนี้
- ส่ง Notification มายังตัวเราเอง
- ส่ง Notification ไปยัง Line Group ที่เราอยู่ (เราต้องเพิ่ม Line Notify เข้ามาใน Line Group นั้นด้วย)
- ส่ง ข้อความ Text, รูปภาพ และ Sticker ได้

Add Line Notify เป็นเพื่อนเราก่อน

ก่อนอื่นเราต้องแอด Line Notify มาเป็นเพื่อนเราก่อน โดยค้นหาคำว่า Line Notify แล้วแอดเป็นเพื่อนดังภาพ



สร้าง Token สำหรับการ Notify

- ให้เรา Login เข้าในเวป https://notify-bot.line.me

- เมื่อ Login เสร็จเรียบร้อย ให้เข้า https://notify-bot.line.me/my/

- เลื่อนลงมาด้านล่างคลิกที่ Generate Token

คลิก Generate token

- ให้เราตั้งชื่อ Notify  (ชื่อนี้จะไปแสดงตอนส่งข้อความ)

เลือกตัวเราเองหรือ Line Group ที่ต้องการ

1-on-1 chat with LINE Notify คือจะส่งข้อความมาหาตัวเราเอง

นอกนั้นจะเป็น List ของ Line Group ที่เราอยู่ หากต้องการให้ส่งเข้า Line Group เราต้อง Invite Line Notify เข้าไปใน Line Group นั้นด้วย

- คลิก Generate token เราก็จะได้ Token เอาไว้ในการส่ง Notify ให้เราเซฟไว้ให้ดี เพราะเราจะเห็น Token อันนี้เพียงครั้งเดียว

Token จะแสดงใน Popup นี้เพียงครั้งเดียวเท่านั้น

ส่ง Notification ด้วย PHP

ในที่นี้เราจะใช้ PHP ในการส่ง Notification กันนะครับ หากต้องการส่งด้วยภาษาอื่นสามารถดู API ได้ที่เอกสารนี้ https://notify-bot.line.me/doc/en/

โดยผมได้สร้าง PHP Library ง่ายๆ สำหรับที่ใช้ในการส่ง Line Notify ไว้ที่ https://github.com/kittinan/php-line-notify โดยมี Requirement ดังนี้

 - PHP 5.5+

เริ่มกันเลย

- โหลด Library ผ่าน composer

composer require kittinan/php-line-notify
- ทดสอบส่ง Text Message ตาม Code ด้านล่าง


- ข้อความก็จะถูกส่งไปยังตัวเราหรือ Line Group ที่เรา Generate Token มา



- ทดลองส่งรูปภาพ ตาม Code ด้านล่าง


- รูปภาพก็จะถูกส่งไปยังตัวเราหรือ Line Group ที่เรา Generate Token มา


จบแล้วค้าบบ

ปล. ไว้มีเวลาจะอัพเดท Library ให้สามารถส่ง Sticker ได้นะครับ
ปล. API Line Notify มี Rate Limit อยู่นะครับ โดย Rate Limit จะอยู่ที่ 1,000 ต่อชั่วโมง

32 comments: