文章

目前顯示的是 2016的文章

Line bot 主動回報及通知系統

圖片
標題不知道要怎麼下,意思是說除了下指令給 bot,bot 會回覆相關資訊之外,還可以主動發訊息給指定的 Line 用戶 (當然,前提是這個 Line 用戶需要加入 bot 為好友)。
Line Messenger API 除了提供 reply_message 的方法之外,還有提供 push_message 的方法。

    reply_message 顧名思義是當用戶發出訊息給 bot,bot 針對這一個訊息所作的回覆,經測試發現一個 reply token 只能回覆一次,無法針對同樣一個 reply token 一直傳訊息,意思是一個 reply token,只能用一次 reply_message,不過一次 reply_message 可以傳入多個訊息就是了。

    另外一個測試發現 reply token 有它的生命週期,bot 在處理用戶訊息如果過久未回覆,reply token 也會失效;那如果真的需要長時間處理的動作該怎麼辦呢?這邊建議可以使用 push_message 的方式,在用戶發出訊息時,可以取得用戶 ID,在處理完畢後,針對這個用戶 ID 傳送訊息,就會很像 bot 針對訊息回覆的情境。

    離題了,這次主動通知系統用了 push_message 做了什麼呢?

    其實就是 server 排程作業結果回報通知,排程作業各位可以想看看能做什麼,我是用來做小米商店商品開賣通知,因為小米商店常常缺貨,但是又很想要這商品,又不想從大陸買進來(擔心保固、電壓、插座、運送等問題)。在 web server 上實做了傳訊息給 Line 用戶的 push line api,排程作業透過 curl 呼叫 push line api。

示意圖如下

2016年終回顧

來到了2016年的年底,想年終盤點一下自己的技能樹狀態,自從換了工作這兩年自己碰了些什麼?

    習慣騎車上班的路上替自己設定今日工作目標,說是工作目標,廣義上不如說是今日目標,除了工作任務外,另外加上想了解的軟體發展、最近熱門的軟體架構、時下最夯的程式語言、github 大神們分享的專案、軟體佈署的議題,甚至寫些能方便自己生活的程式。

    有些人會認為這樣的作息對得起公司嗎?對我來說,上班除了工作任務之外,其他的時間用來自我學習成長,對於公司跟個人都是雙贏的作法;在不耽誤工作的情形下,其餘時間用來加強自己的本職學能,不是很正常的嗎?難道大家一整天都會全力在工作上嗎?至少我選擇了對公司跟個人都好的"休閒",無愧於心。

    兩年前換了新工作後,一開始也是躍躍欲試,一頭栽進現有系統的架構了解、這邊的程式撰寫模式,不過總是事與願違呀,企業文化、部門文化不是一個小螺絲釘可以輕易改變的,更何況身處傳統產業,思維跟企業軟體發展完全無法因應時代的變化,今年是2016但是開發環境還在 vs2008 vb.net,連 nuget 套件管理工具都還沒有起步的IDE,不過就算有也沒用,因為畢竟是自己企業內部的系統,系統的穩定更勝於一切,只能用MS自己出的元件,做出最陽春的功能,軟體開發人員在這能學到多少,會有這種期待的我,我想我也是醉了。與其坐以待斃,不如利用時間加強自己的能力,也許哪天會用的上呢!

     回到正題,列表(工程師風格)

Softward develop
1. Android app develop
     1.1 三維測量儀 (blog|google play store)
    1.2 台北市安心地圖 (blog|google play store|youtube)
     1.3 協尋毛小孩 (blog|google play store|youtube)
    1.4 陽光空氣水 (blog|google play store|youtube)
    1.5 譯圖文 (blog|google play store|youtube)
     1.6 吹哨找手機 (blog|google play store|youtube)

    最喜歡的應用是"三維測量儀",喜歡手機做些與現實生活體驗相關…

[開源] autoSceneName2Pics

好吧!最近又在整理照片,一直在想要怎麼整理一堆照片,光是分類就花費不少時間。

上次的 ezOrganizePic 是用 jhead 取得 EXIF 資訊,依拍照日期將照片歸到各自的資料夾。

參考以往的分類習慣,除了日期就是景點分類,格式像是 "20161111_華山1914文化創意產業園區",可是沒看照片怎麼知道在哪裡拍的?就算看了照片也不見得有拍到景點(因為是拍人像),沒看到景點還是想不起來。

看一下 EXIF 提供的資料,現在都用手機拍照,而且都會放入 gps 位址資訊,其實是知道在哪裡拍的,只是 gps 代表的位址在哪裡呢?

這時只能對 google 大神拜拜了,google 提供了 place api,在大家標注景點的時候,是可以透過這個 api 取得的。

好!這個 shell 的目標主要是
1. 掃圖檔
2. 取得 EXIF gps 資訊
3. 轉換 gps 時分秒成 google 要求的 gps 格式
4. 透過 google place api 取得指定 gps 最近的景點
5. 將照片的檔名重新以景點命名
6. 看檔名就知道在哪裡

敗筆是一堆亂七八糟的景點怎麼過濾呢!跑出一堆公司行號的景點或是私人景點(家)無法被正確標記。
如果這可以處理,相信會有些市場的,加油加油。

github: autoSceneName2Pics

[小聲公告] 寫好玩的Line Bot 帳號公告

圖片
如題,有興趣試用的可加入或加入再封鎖。

ps. 個人電腦充當Server,效能不彰、隨時無回應,如果能接受就加吧!


[心得]機器人"聊天"這檔事

繼上上次 FB Messagenger bot  及上次的 Line bot 學習製作的過程,
對於聊天機器人"聊天"這檔事有了一些體悟,所以寫下來供作參考。

先回顧一下 FB Messenger bot 開發經過,首先 FB 在今年年初推出了 Message Platform,自己興致勃勃的找了些教程,用 node.js 開發並佈署在 heroku.com。
FB 提供了一個大~平~台(王大陸~原諒我很想寫這個爛梗),讓大家可以透過 Messenger,從後台接收訊息及發送訊息到客戶端。

說穿了,這些聊天平台將自己的服務跟各個企業的商業服務做個管道出來,對於聊天平台跟其他運用這服務的企業算是雙贏的局面,一方面替自己衝使用量,佔據社群軟體的榜首,一方面替企業精簡人力、擴大銷售。
聊天平台原本的社群服務加上企業原有服務,透過 "聊天機器人" 這個溝通管道,更加強了雙方的連結。

軟體架構其實是相對的單純,撇除聊天平台原本的溝通界面服務、、各大企業原本也有相應的網路服務,透過 sdk 交換雙方的訊息也不難。
終端消費者在聊天平台提供的界面上打打字,透過 sdk 交換訊息到企業網路服務,企業網路服務接收訊息後回應終端使用者,最終達成終端使用者的目的。

目前看似一切都在既有的服務上作業,sdk 使用上也簡單,那問題在哪裡?

問題就在 "聊天" 這檔事,如果消費者打了某段訊息,例如"我要買電視",企業接收訊息後判斷有"電視"兩個字,就推出自家電視產品廣告;那這跟透過指令界面一個口令一個動作有什麼不同?
萬一消費者打的訊息內容是 "我要買可以當電視的平板電腦",結果推薦的是電視,那會有多囧,我要是消費者馬上就跳開這個平台,不好玩又亂推薦。

關於 "聊天" 這檔事,雖然日常生活無時無刻都在聊天,認真分析起來,聊天機器人真是呆板的可以,但是還是要努力不要讓他/她變成"它",我們還是期待機器人是個人呀!
ok google、siri 這樣聰明的個人管家跟聊天機器人的目的性不同,聊天機器人的聊天支線、主題比較可以聚焦。

關於聊天機器人 "聊天" 這檔事,列下四點:
1. 單一時間點的討論只會圍繞單一個主題,當然整個聊天過程會有很多個討論…

[Solved] sqlplus on ubuntu support big5 and support arrow key

command like below

> export NLS_LANG=AMERICAN_AMERICA.ZHT16MSWIN950
> luit -encoding big5 rlwrap sqlplus

說明:

1. NLS_LANG環境變數設定
2. luit 讓後面的指令轉為 big5 編碼
3. rlwrap 讓後面的指令支援方向鍵

Build in line bot webhooker web server on docker

請參考我的 github

WebServLineBotDocker

Messenger bot framework 之我見

圖片
上次在不清不楚的情況下,實做了 facebook messenger bot,做是作起來了,當下也了解到平台實做不是最大的問題,問題在客戶(使用者)在表達什麼意思,如果是文字對話,就是自然語言的辨識,也就是 AI 的問題,網路上有許多 bot ai 製作工具,我沒用過,倒是這幾天有看到微軟出的 bot framework,似乎也是個方法。

這兩天再接觸了 Line Messenger API,對照之前使用 facebook bot api 的經驗,可以發現各家對於 messenger api 作法都很相近,似乎對於這樣的架構頗有共識。

不多說,從使用 bot api 的經驗去想像整體架構,用一張圖來表達

add localhost ssl certificate to nginx

1. key

openssl genrsa -des3 -out localssl.key 1024

2. csr

openssl req -new -key localssl.key -out localssl.csr

3. remove passphrase

cp localssl.key localssl.key.org
openssl rsa -in localssl.key.org -out localssl.key

4. crt

openssl x509 -req -days 365 -in localssl.csr -signkey localssl.key -out localssl.crt

5. add to ssl certificate

sudo cp localssl.crt /etc/ssl/certs/
sudo cp localssl.key /etc/ssl/private/

6. modify /etc/nginx/sites-enabled/flask.conf (flask.conf to be replace to your configure name)

server {
    listen      80;
    server_name admin.domain.com;
    charset     utf-8;
    client_max_body_size 75M;


    location / {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/app/uwsgi.sock;
    }

    location /static {
    root /var/www/app/;
    }
}

server {
    listen                443;
    ssl                   on;
    ssl_certificate       /etc/ssl/certs/localssl.crt;
    ssl_certificate_key   /etc/ssl/private/localssl.key;
    keepalive_timeout     70;
    server_name           admin.domain.c…

flask + nginx + uwsgi

套件簡略說明

flask: python micro web framework
nginx: web socket service
uwsgi: protocol between python and nginx
--------------------------------------------------
環境介紹

os: ubuntu 64bit
web server: nginx + uwsgi + uwsgi-plugin-python
web framework: python 2.7 + flask

other packages: pip, virtualenv
--------------------------------------------------
套件安裝

1. virtualenv: sudo apt-get install virtualenv
2. nginx: sudo apt-get install nginx uwsgi  uwsgi-plugin-python
3. flask: pip install flask (在虛擬環境下)

ps. 系統不要裝 pip,以免虛擬環境安裝套件時安裝到系統上
--------------------------------------------------
環境建置

1. virtualenv

root> virtualenv /var/www/app/venv
root> source /var/www/app/venv/bin/activate  #進入虛擬環境
(venv) root> #前綴字表示虛擬環境

2. environment configure
  (1) nginx

#nginx configuration: /etc/nginx/sites-enables/flask.conf

root> rm /etc/nginx/sites-enables/default
root> cat /etc/nginx/sites-enables/flask.conf
server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    clie…

[Solved] install pip in synology nas

Step 1: wget https://bootstrap.pypa.io/get-pip.py
Step 2: 切換身份到 root

sudo -i

synology 密碼是 administor 的密碼

Step 3: python get-pip.py

reference: Synology – Installing Python PIP package installer

-----------------------------------------------
remove pip package

python -m pip install -U pip

[Solved] Can't run sikuli IDE

我的系統環境是 ubuntu 16.10 64bit,這兩天裝 sikuli 時出現以往沒遇過的問題,記錄下來以免下次又遇到。
安裝方式大致說一下

1. 安裝 jdk
2. 安裝 sikuli: java -jar sikulixsetup-1.1.0.jar
3. 執行 runsikulix 時出現下列錯誤 (libopencv_core.so not found 或是 libtesseract.so not found)

[info] runcmd: lsb_release -i -r -s
[info] HotkeyManager: add Capture Hotkey: CTRL+SHIFT 2 (50, 3)
[info] HotkeyManager: add Abort Hotkey: ALT+SHIFT C (67, 9)
[error] RunTimeIDE: loadLib: libVisionProxy.so not usable:
java.lang.UnsatisfiedLinkError: /home/nick/.Sikulix/SikulixLibs_201510051707/libVisionProxy.so: libopencv_core.so.2.4: 無法開啟共用目的檔: 沒有此一檔案或目錄
[error] RunTimeIDE: loadLib: libVisionProxy.so not usable:
java.lang.UnsatisfiedLinkError: /home/nick/.Sikulix/SikulixLibs_201510051707/libVisionProxy.so: libopencv_core.so.2.4: 無法開啟共用目的檔: 沒有此一檔案或目錄
[info] runcmd: ldconfig -p
[info] runcmd: wmctrl -m
[error] RunTimeIDE: fatal error: java.io.IOException: Cannot run program "wmctrl": error=2, 沒有此一檔案或目錄
[error] LinuxSupport: checking: wmctrl not available or not working
[info]…

[Solved] 遠端桌面到 ubuntu x window

工作的電腦 windows 7 裝了一個 ubuntu vm,平常都在 ubuntu 上面作業, 有時候在外面想連回去 ubuntu 桌面環境,不是透過 vnc,就是透過遠端桌面到 windows 7, 再操作 vm,遠端桌面 refresh vm 畫面會 lag 想翻桌,何不直接連到 ubuntu x window 呢?
所以這邊簡介一下要安裝的套件
1. sudo apt-get install xrdp xfce4 2. echo xfce4-session > /home/USERNAME/.xsession
參考:Blank desktop when logging in via xrdp

[Solved] mount windows share folder failed

[Solved] mount windows share folder failed

起因是要備份 ubuntu 上面的資料,寫了一個 shell 掛上 crontab,
先將 windows share folder mount 起來,再將欲備份的檔案壓縮存放到 share folder。

mount 指令如下

>mount -t cifs //xxx.xxx.xxx.xxx/backupFiles/ /mnt/hostBackup/ -o username="USERNAME",password="PASSWORD"

納悶的是 crontab 可以正常備份,可是直接執行 mount 指令,會出現下列錯誤訊息。

"mount 遠端輸入錯誤"

解決方案:

1. apt-get install cifs-utils

2. 重新執行 mount 加上 -v
>mount -v -t cifs //xxx.xxx.xxx.xxx/backupFiles/ /mnt/hostBackup/ -o username="USERNAME",password="PASSWORD"
會看到下列錯誤訊息
ip address xxx.xxx.xxx.xxx override specified
mount.cifs kernel mount options: ip=xxx.xxx.xxx.xxx,unc=\\xxx.xxx.xxx.xxx\backupFiles,user=USERNAME,pass=********
mount error(121): Remote I/O error
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

3. man mount.cifs,看一下 man page,其中一段寫著
       vers=
           SMB protocol version. Allowed values are:

           ·   1.0 - The classic CIFS/SMBv1 protocol. This is the default.

           ·   2.0 - The …

winetricks - install IE8 on ubuntu

圖片
winetricks - install IE8 on ubuntu

為了將 IE 裝在 ubuntu 上面,裝了 IEs4Linux,卻只能裝到 IE6。
在找 solution 的路途上,找到了 winetricks 這個套件,這才發現原來我早已安裝。

sudo apt-get install wine winetricks

先檢查 winetricks 版本
> winetricks -V
20140817 - sha1sum: b6ad9287523453a33e443ef2f4bd77f2f7f49e21

我的版本怎麼那麼舊,明明透過 apt-get 更新到最新版本了。
好吧,還好 winetricks 作者有在 github 更新。
那...手動更新一下 winetricks,記得一定要更新,不然後面在安裝的時候,
會出現類似下列的訊息
"sha1sum mismatch! /home/USERNAME/.cache/winetricks/.... Rename and try again"

透過 command 執行 winetricks -v crypt32 (舉例要安裝 crypt32)
log 會出現 404 Not Found 的訊息

------- 更新 winetricks --------
1. 確認 winetricks 安裝位置,下載最新的 winetricks
>type winetricks
winetricks is hashed (/usr/bin/winetricks)
>cd /usr/bin/
>sudo mv winetricks winetricks.bk
>sudo wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
>sudo chmod +x winetricks

------- 執行 winetricks --------
1. winetricks 安裝 IE8
>winetricks -v  ie8

接著 winetricks 會自動下載這些檔案並執行 windows 安裝程序

參考: winetricks github (htt…

Install Internet Explorer 6 on ubuntu

Install Internet Explorer 6  on ubuntu

雖然很想離 MS 遠一點,可是還是有很多網站是 IE Only,
所以去問 google 如何在 ubuntu 裝上 IE 環境,
chrome 跟 firefox 的外掛 IETab 用的是 windows ie kernel,
所以需要在 windows 平台上才能安裝,
google 後的解法是透過 wine 執行 IEs4Linux,所以下面說明如何安裝。

(雖然 google 就有答案,但是不寫下來,下次還要再 goo 一次,讓我多貢獻一點 google 搜尋節點吧)

---------- 正文分隔線 ----------

1. 安裝 wine: sudo apt-get install wine

2. 安裝 cabextract: sudo apt-get install cabextract

3. 下載 IEs4Linux:
        wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
        tar zxvf ies4linux-latest.tar.gz
        cd ies4linux-*

4. 我這邊裝的是 2.99.0.1 版,一樣遇到參考文章中的問題,所以修改 ./lib/messages.txt:
    將第 19 行
    #tw . zhTW TW
    #改成下行
    zh tw zhTW TW

5. 修改 ./lib/functions.sh:
    將第 98 行
    #pid=$(wget -q -b -t 1 -T 5 -U "$useragent" -o /dev/null $URL $WGETFLAGS -O "$file" | sed -e 's/[^0-9]//g')
    #改成下行
    pid=$(LANG=C wget -q -b -t 1 -T 5 -U "$useragent" -o /dev/null $URL $WGETFLAGS -O "$file" | sed -e 's/[^…

shrink vmware virtual disk files

隨著使用 vmware 的時間越來越長,vmdx 的檔案也越來越大。

網路上找到的 shrink 方法,都要安裝 vmware workstation 的版本,

使用 vmware tools 達到目的。

但是我怎麼可能會有 workstation license,我只有 vmplayer 而已呀!

 直接進入正題

環境
host os: windows 7
vm guest os: ubuntu

1. 用 0 塞滿 vm 的空間
在 ubuntu 執行下面指令,用 zero 塞滿檔案系統,最後刪除該檔案
cat /dev/zero > zerofile;sync;rm -f zerofile

2. 將 guest os 關機

3. virtual machine settings -> hard disk (SCSI) -> Utilies -> degragment 作磁碟重組

4. virtual machine settings -> hard disk (SCSI) -> Utilies -> compact 壓縮

如果 compact 壓縮過後沒有釋放出空間,請重作 1~4 步驟,我作了兩次。

第一次釋出 2G,第二次釋出 16G,我想是因為磁碟比想像中破碎的緣故,所以作第二次才有大幅的釋出。

各位可以試試

參考 壓縮 vmdk 檔案

one line command to send email

use curl to send email by your gmail account

github: ezSendGmail

PttTracer open source now!!!

Remove old ubuntu linux kernel

為了節省 SSD 的硬碟空間,撙節措施是有必要的。
所以把舊的 kernel 清出來,也是可以省下不少空間的。

步驟如下
1. 列出現在有的 kernel: dpkg --list|grep linux-image
2. 然後排除現在在使用的 kernel: grep --invert $(uname -r)
3. 參考網路上的資料,說也不能把 linux-image-generic 給刪掉: grep --invert 'linux-image-generic'  (ps. 筆者不小心刪掉了,但是還是可以開機,不過為了安全還是寧可信其有。)
4. 總結上面的指令,取出 kernel 的名稱: awk -F ' ' '{print $2}'
5. 依上面的名單,逐個 purge 或是 remove: sudo apt-get purge linux-image-4.4.0-36-generic
6. 再乾淨一點,多執行 auto remove: sudo apt-get autoremove
7. 更新開機選單: sudo update-grub2

總結如下

linux useful command

useful command:
    help, info , man: help document
    touch: create file
    updatedb: 更新系統資料庫
    vimdiff: vim difference
    which,type,whereis,locate,find: command related
    who,whoami:
    uptime:
    nl: 逐行編號
    grep: 找出特定文字
    sort: 逐行排序
    uniq: 排除相同資料
    tr: 取代或刪除特定字元
    col: 將 tab 跟 空白 互相轉換
    join: 兩個文件依鍵值 concate
    paste: 雷同 join. 但是不比對數據,單純將多個文件合併
    df: disk free
    du:
    dd: dd if=/dev/zero of=virtual.img bs=1024 count=1024
        cat fileA | dd conv=ucase > fileB ←將 fileA 內小寫改大寫存入 fileB
        dd if=/dev/sr0 of=CD1.iso bs=2048←將光碟轉 iso 映像檔(光碟內要放光碟片才可轉換)
        http://wanggen.myweb.hinet.net/ech3/ech3.html#dd
    losetup: sudo losetup /dev/loop0 virtual.img (映射文件到虛擬設備上)
    fdisk: fdisk -l virtual.img
    kpartx: 針對單一檔案各個分區做 mapper (/dev/mapper/loop2p1)
    mkfs: make file system
    service: service cron status
    mkdir -p /media/virtual_{1..3}
    history: 之前用過的指令
    tar: 打包 (-czf   c:create z:gzip壓縮 f:輸出檔名)
    file: 查詢 file 屬性
    dos2unix, …

Use PTT to track your friends' sleeping habits

00:02:08 不在站上 最近無新信件 23:18:21 123.195.xx.xx 08:26:11 閱讀文章 最近無新信件 08:22:36 111.70.xx.xx 09:00:14 閱讀文章 最近無新信件 08:54:48 111.70.xx.xx 10:36:14 不在站上 最近無新信件 08:54:48 111.70.xx.xx 14:04:11 閱讀文章 最近無新信件 13:58:08 140.136.xx.xx 14:47:15 閱讀文章 最近無新信件 14:44:02 140.136.xx.xx 15:31:08 不在站上 最近無新信件 14:44:02 140.136.xx.xx(隱藏部份資訊)
上面的資訊是之前用 expect 為主體完成的練習題,自動登入 ptt、查詢某位網友的動態、上線時間、ip等資料,再進行資料整理的結果。

利用這些資料,進一步想知道這 ip 的來源,ip 是誰發放的,如果是學術網路的話,又是那一所學校呢?

要完成上述的事項,需要幾個功能。
1. 查詢 ip 發放單位
2. 學術網路各學校的ip分配

指令如下
catptt 1|awk -F ' ' '{print $5}'|sort|uniq|while read x; do  echo $x; whois $x; done
 whois 是自己寫的一個功能,可以查到發放單位及是學術網路的哪個學校的ip
catptt 也是自己寫的,用來顯示每天所收集的資料, 後面參數 1 指的是昨天的資料

以下是 linux 指令
awk: 用來切字串的工具 (好用、推)
(awk -F ' ' '{print $5}' 意思是用空白當切割符號,並印出第五個元素)

sort: 排序資料行

uniq:利用排序過的資料,將重複的資料去除

while read x; do echo $x;whois $x; done
針對每一資料行,顯示 ip 並做 whois 查詢

結果如下
111.70.xx.xx
中華電信股份有限公司

1.168.xx.xx
中華電信股份有限公司

123.195.xx.xx
凱擘股份有限公司

140.136.xx.xx
教育部 - 天主教輔仁大學

42.77.xx.xx
中華電信股份有限公司
reference: 學…

sqlplus 中文亂碼解決方案

原因就不多說了, 總之是資料庫編碼與console viewer編碼不一致, 導致看到的中文變亂碼.
資料庫環境是 ZHT16MSWIN950, 所以設定 NLS_LANG=AMERICAN_AMERICA.ZHT16MSWIN950

----------------------------------------------------

 首先

查詢資料庫 NLS 參數
SQL> select * from v$nls_parameters where parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');

PARAMETER                      VALUE
-----------------------------------------------------
NLS_LANGUAGE                  AMERICAN
NLS_TERRITORY                 AMERICA
NLS_CHARACTERSET        ZHT16MSWIN950

 回到 linux

export NLS_LANG=AMERICAN_AMERICA.ZHT16MSWIN950

終端機->設定字元編碼->BIG5


install oracle client and sqlplus on ubuntu

1. 下載 oracle client、sqlplus

2. 安裝 alien

sudo apt-get install alien

 3. 用 alien 安裝剛下載的兩個檔案 (oracle client、sqlplus)
這邊我下載的是basic lite

ubuntu 32bit:
sudo alien -i oracle-instantclient12.1-basiclite-12.1.0.2.0-1.i386.rpm
sudo alien -i oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.i386.rpm

ubuntu 64bit:
sudo alien -i oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm
sudo alien -i oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm

ubuntu 32bit: 
執行完畢後,安裝路徑在 /usr/lib/oracle/12.1/client  (本次安裝版本是12.1)

ubuntu 64bit:
執行完畢後,安裝路徑在 /usr/lib/oracle/12.1/client64  (本次安裝版本是12.1)

4.  設定 oracle.conf,將 library path 加進去
sudo vim /etc/ld.so.conf.d/oracle.conf
ubuntu 32bit:
 /usr/lib/oracle/12.1/client/lib

ubuntu 64bit:
/usr/lib/oracle/12.1/client64/lib

5. 執行 ldconfig
sudo ldconfig
6. 安裝 libaio1

sudo apt-get install libaio1
7. 手動加入 PATH

ubuntu 32bit:
/usr/lib/oracle/12.1/client/bin

ubuntu 64bit:
/usr/lib/oracle/12.1/client64/bin

8. export LD_LIBRARY_PATH

ubuntu 32bit:
export LD_LIBRARY_PATH…

非同步、交互式程式編寫工具 (sikuli、expect)

非同步、交互式程式編寫工具 (sikuli、expect)

先前發布的相見恨晚自動化測試工具 sikuli,可以用圖案去編寫程式流程,適用於自動化測試、一鍵執行程式及指令。
用 sikuli 編寫程式是很特別的體驗,概念上來說在程式流程裡,因為無法預期下一個作業或圖案的出現時間,常會有 wait 的情形,
這樣非同步的訊息傳遞、接收、執行,在這工具上變得很自然。

這次在 unix 系統上透過 expect 自動連上 bbs,透過 expect 自動收集想要的資料,並經由 log file 取回資料,再做進一步的資料整理。

expect 讓我有一種既視感,啊~就是 sikuli 呀!
寫程式流程時的體驗相近,sikuli 流程控制時,當發現某個圖形就去點擊另一個圖形。
expect 流程控制時,當發現某段文字就輸入你要的文字。
wait then action,又是個不可多得的好工具。

expect 是用 Tcl 語法 (筆者也是第一次看到 Tcl),expect 相關資料很少,不過還是有找到比較完整的語法書。
Welcome to the Tclers Wiki!  





這次以 expect 為主體完成的練習題,自動登入 ptt、查詢某位網友的動態、上線時間、ip等資料,再進行資料整理。
條列中間遇到的一些問題
1. 編碼問題: ptt 是 BIG5 編碼,ubuntu shell 預設是 UTF-8 編碼,所以會出現有亂碼的問題。
解決方法是透過 iconv -f UTF-8 -t BIG5 file_name -o output_file_name  (將 UTF-8 轉成 BIG5)
如果遇到錯誤訊息, iconv: 位置 xxxx 有不合法的輸入序列,可能是語系的問題,locale LANG 設成 BIG5 就可以了。

範例:
[osboxes@osboxes log]$ locale
LANG=zh_TW.UTF-8
LANGUAGE=zh_TW:en_GB:en
LC_CTYPE="zh_TW.UTF-8"
LC_NUMERIC=zh_TW.UTF-8
LC_TIME=zh_TW.UTF-8
LC_COLLATE="zh_TW.UTF-8"
LC_MONETARY=zh_TW.UTF-8
LC_MESSAGES=…

舊有 oracle 管理文章連結

以前在 點部落 的一些 oracle 管理文章. 在這裡做個關聯.

格主的興趣廣泛.

從 oracle 管理到現在 android, python, javascript 開發工作.  到 unix like (ubuntu) 學習.

不管是前台、後台、open source, 什麼都有興趣. IT 人什麼都要學.

格主也樂在其中. 大家就見怪不怪.

舊有 oracle 管理文章連結:  學如逆水行舟

'apt-get dist-upgrade' get error message 'Job for docker.service failed because the control process exited with error code.' after upgrade ubuntu kernel

referenece: [graphdriver] prior storage driver "aufs" failed: invalid argument

精簡版
1. aufs is no longer supported on Ubuntu kernel 4.*
2. trick is 'rm -rf /var/lib/docker/aufs'
3. sudo service docker start

完整操作過程

adb not responding/unable to detect adb version Syntax error - Android Studio on ubuntu

圖片
當你運行 Android studio debug app 出現下面的錯誤

相見恨晚的自動化測試開發工具 Sikuli

圖片
2010年由一位在 MIT 就讀的台灣人發表的 graphic script language,

有別於一般的開發工具,利用一些截圖加上一些簡單的語法就可以操作電腦滑鼠、鍵盤。

開發這工具最難的,我覺得是圖形辨識跟操作行為的判斷。

這工具提供的語法滿完整的,不同的情境都可以簡單的使用,

搭配 Python 語法可以更靈活的操作。

我用了兩個小時的時間,就可以完成安裝並輕易完成一個自動化訂票的 script。

坦白說,效果讓我感到非常的驚豔,可能是本身是開發人員,能夠了解這軟體的困難。

只是覺得自己怎麼可以這麼 lag,六年前的玩意現在才知道。

-- 安裝步驟 --

先到 Sikuli 官網 下載 SikuliX 目前版本是1.1.0

檔案是 .jar,也就是 java 程式,所以請先安裝 jre 環境。

依教學是說只要檔案下載下來,直接點兩下執行,就會自動下載需要的檔案,

還有一個執行 Sikuli IDE 的批次檔。

安裝過程遇到 "Could not find the main class. Program will exit!"


直接在 console 下指令 " java -jar sikulixsetup-1.1.0.jar"

就會自動下載並安裝起來了。




語法的部份我是參考這個範例   Sikuli的入門使用

-- 遭遇問題 --

寫範例的過程遇到兩個問題,一個是中文的輸入問題、一個是按鍵的問題。

一、中文輸入的問題,網路上查到的解法是 type(u"中文") 或是 paste("中文"),

實際使用出現的都是亂碼。

最後解法是 paste(unicode("中文", "utf8"))

二、按鍵問題是一些特殊鍵的輸入,例如 windows 鍵 + 字母的特殊組合鍵、Enter 鍵。

這邊統一解答,windows 鍵+字母的特殊鍵組合是 type("d",KEY_META) ,

以這範例表示的是 windows 鍵 + d (一定要小寫唷!)

Enter 鍵是 type(Key.ENTER)   (Key 一定要首字大寫,ENTER是全大寫)

-- 最後完成的結果 --

我最後實作的程式是露營地的訂票程式,搭配 win…

Semaphore

多執行緒下控制可使用資源的執行緒上限數
比喻作夜店的安管人員再洽當不過,安管人員可控制夜店入場人數,
例如今天只開放100人入場,超過此人數則不得再進場,除非有人離開才可以放行,
控制人數在上限 100。
在多執行緒的情形下,資源的掌握更顯得重要,如資料庫資源。

But, what's the difference between semaphore and singleton?
singleton 是用來作 lock,可以想成是一次只開放一個人進場的安管,這樣就很好理解了。
在查到的資料上顯示,若在上限為一個物件存取的情形下,
效能上 singleton 比 semaphore 好多了。
reference: Android Semaphore

[實作] Facebook messenger bot

圖片
如果各位是跟我一樣,對新平台、技術有高度興趣,這次看到了 Facebook F8 開發者大會,對 Facebook messenger bot 有興趣,
想實作自己的機器人,卻沒有相關背景、Know how 的人,來這就對了,我花了一兩天的時間,確確實實的把這服務建置起來。

網路上絕大部份都是以 node.js 為範例,當然還有其它的像是python django,對於這些名詞(node js. python. django)僅止於知道的我來說,
等到學會上手都不知道幾年後了,我還是習慣作中學,雖然過程坎坷,但是中間產生的問題,會擴大自身對各技術的初步了解;
扯遠了,重點是平台的選擇,對我來說還是選最多資源的教程,也就是 node.js。

ps. 好歹要知道這些技術名詞在作什麼,才有辦法繼續往下作吧。

對這議題我的背景程度大概是
ndoe.js: server side javascript. (全知全能的 javascript)
python: script language. (有在網路上學過 tutorial)
django: python's web framework. (有裝過這個 framework)

一開始對這個 facebook messenger bot 的架構不清楚,不知道應該具備什麼技術或是平台或是套件才能建起來。
作完之後,再回頭看才比較清楚整個架構,也知道在這些點上,需要的資源是什麼。
就讓我大略把架構畫出來,有經驗的人一看就知道在那些點會需要那些服務跟資源。



到這裡,各位已經比我當時不清不楚、傻傻就決定要花時間作一個自己的機器人還站在更有利的位置了。

所以需要的東西有什麼呢?
1. 提供網頁服務的主機 (我一開始傻傻的以為只需要將代碼寫在 facebook 的開發者平台上就好了)
2. 接收/回應 facebook 送過來訊息的代碼

就這麼簡單,可是 facebook 的官方教程對我這樣非網頁開發背景的人來說,實在很難理解,跟著教程走還是會有問題。
所幸找到一個更完整的教程,雖然我已經花半天的時間了。
分享給大家 messenger-bot-tutorial
這篇太讚了,非常完整的教程。

這樣還要寫正文嗎? 大家直接看 github 就好了...XD

那... 讓我寫些所需材料吧!
1. 要先有個提供網頁服務的主機,我當然沒有…

網誌整合

之前有三個網誌,想就各程式語言或是程式開發人員作分類,後來發現文章量沒那麼多,實在沒必要這樣區分。 所以將網誌的標題改成 Sporting coding note。 ps. 我不是運動狂熱者 Sporting 只是中文名字的對翻罷了。