code-prettify

2015年7月14日 星期二

Qt TcpSocket

Server 的部份使用 QTcpServer

呼叫 listen 函式開始接受 Client 連線,參數為 QHostAddress::Any, 8811

在 newConnection signal 接受 socket

QTcpSocket* socket = server->nextPendingConnection();

在 readyRead() signal 接收資料

QBtyeArray data = socket->readyAll()

使用 write() 傳送資料

簡單的範例:

  m_server = new QTcpServer();
connect(m_server, &QTcpServer::newConnection, [=]() { qDebug() << "new client socket"; QTcpSocket* socket = this->m_server->nextPendingConnection(); connect(socket, &QTcpSocket::disconnected, [=]() { qDebug() << "client socket disconnected"; socket->deleteLater(); }); connect(socket, &QTcpSocket::readyRead, [=]() { qDebug() << "client readyRead"; QString string = socket->readAll(); qDebug() << "Read: " << string; string = string.toUpper(); qDebug() << "Send " << string; socket->write(string.toLatin1()); socket->close(); }); }); m_server->listen(QHostAddress::Any, 8811); qDebug() << "server listen";


Client 直接使用 QTcpSocket

呼叮 connectToHost 與 server 連線
連上了會觸發 connected 訊號,斷線則是 disconnected
接收資料一樣是 readyRead

簡單的範例:

m_client = new QTcpSocket();

connect(m_client, &QTcpSocket::connected, [=]() {
qDebug() << "socket connected";

QString string = "Hi";
m_client->write(string.toLatin1());
qDebug() << "Send: " << string;
});

connect(m_client, &QTcpSocket::disconnected, [=]() {
qDebug() << "socket disconnected";
});

connect(m_client, &QTcpSocket::readyRead, [=]() {
qDebug() << "client readyRead";

QString string = m_client->readAll();
qDebug() << "Read: " << string;

m_client->close();
});

m_client->connectToHost("127.0.0.1", 8811);


資料來源:
Network Programming with Qt
http://doc.qt.io/qt-5/qtnetwork-programming.html

Sockets - Server & Client using QT
http://www.bogotobogo.com/cplusplus/sockets_server_client_QT.php

QTcpSocket Class
http://doc.qt.io/qt-5/qtcpsocket.html

2015年6月24日 星期三

複製所有檔案及資料夾指令

Windwos

xcopy source [Destination] /i /e /k /h

Linux

cp -R source dest

資料來源

Xcopy
https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx

xcopy functionality with linux?
http://www.linuxquestions.org/questions/linux-general-1/xcopy-functionality-with-linux-386643/

2015年6月17日 星期三

如何將 Sublime Text 3 加入右鍵選單中

從 Notepad++ 改用 Sublime Text 之後,最不習慣的地方就是在右鍵選單內,
將下列內容存成 run.bat 後,以管理員的權限執行,就會將 Sublime Text 加入右鍵選單

 @echo off
  SET st2Path=C:\Program Files\Sublime Text 3\sublime_text.exe

  rem add it for all file types
  @reg add "HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text 3"         /t REG_SZ /v "" /d "Open with Sublime Text 3"   /f
  @reg add "HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text 3"         /t REG_EXPAND_SZ /v "Icon" /d "%st2Path%,0" /f
  @reg add "HKEY_CLASSES_ROOT\*\shell\Open with Sublime Text 3\command" /t REG_SZ /v "" /d "%st2Path% "%%1"" /f

  rem add it for folders
  @reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Sublime Text 3"         /t REG_SZ /v "" /d "Open with Sublime Text 3"   /f
  @reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Sublime Text 3"         /t REG_EXPAND_SZ /v "Icon" /d "%st2Path%,0" /f
  @reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Sublime Text 3\command" /t REG_SZ /v "" /d "%st2Path% "%%1"" /f
  pause

資料來源
Add “Open with Sublime Text 3″ to Windows Explorer Context Menu
http://wordpress-corner.com/add-open-sublime-text-3-windows-explorer-context-menu/

2015年6月15日 星期一

Sevabot - Skype bot - Windows Install

一、從 git 取得 Sevabot

git clone git://github.com/opensourcehacker/sevabot.git


二、安裝設定

在 cmd 輸入下列指令

cd sevabot
powershell -NoProfile -ExecutionPolicy unrestricted -Command "add-content -path virtualenv.py -value(new-object net.webclient).DownloadString('https://raw.github.com/pypa/virtualenv/master/virtualenv.py')"
python virtualenv.py venv --no-setuptools

set-executionpolicy unrestricted
    . .\venv\Scripts\activate.ps1
這段意思似乎是將 activate.ps1 設定為「可執行」的樣子
具體行為不知道是什麼?所以我什麼也沒做

python setup.py develop

執行後在 python 目錄的 Scripts 資料夾 (C:\Python27\Scripts) 找到 sevabot.exe 及 sevabot-script.py,複製到 sevabot 目錄下。

接著從範本複製一份設定出來。
cp settings.py.example settings.py

最後執行 sevabot

sevabot.exe

這時候 skype 會出現第三方元件存取的詢問訊息,記得按允許,
同時會啟動 web service,預設在 localhost:5000

三、使用 sevabot 傳送訊息

啟動 browser 開啟 localhost:5000 會看到網頁



其中 Shared Secret 就在 settings.py 中的 SHARED_SECRET 設定 (圖中為 koskela)
之後使用 web api 傳送訊息的時候都要使用這組密碼


使用 POST 時,需要參數 shared_secret 及 message
使用 Postman 範例


使用 cURL 範例

curl -F "shared_secret=koskela" -F "message=Hi, This is test." http://localhost:5000/message/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/

資料來源

Sevabot - Skype bot 1.0 documentation
https://sevabot-skype-bot.readthedocs.org/en/latest/

Github - opensourcehacker/sevabot
https://github.com/opensourcehacker/sevabot

Installation fails on Windows: Pip and setuptools fail to install #94
https://github.com/opensourcehacker/sevabot/issues/94

2015年5月27日 星期三

bootstrap glyphicons-halflings-regular.woff 404 not found IIS

bootstrap glyphicons-halflings-regular.woff 404 not found IIS

網站發現一行錯誤訊息:
glyphicons-halflings-regular.woff 404 not found

檢查後發現,檔案確實存在,剩下的可能性就是 woff 副檔名 IIS 不認識,
要讓 IIS 認識相關檔案的話,可以在 web.config 加入下列設定

  <system.webServer>
    <staticContent>
      <remove fileExtension=".eot" />
      <remove fileExtension=".ttf" />
      <remove fileExtension=".otf"/>
      <remove fileExtension=".woff"/>
      <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
      <mimeMap fileExtension=".ttf" mimeType="font/ttf" />
      <mimeMap fileExtension=".otf" mimeType="font/otf" />
      <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
    </staticContent>
  </system.webServer>

資料來源:
Twitter bootstrap glyphicons do not appear in release mode 404
http://stackoverflow.com/questions/21269884/twitter-bootstrap-glyphicons-do-not-appear-in-release-mode-404

IIS - RESOURCE INTERPRETED AS FONT BUT TRANSFERRED WITH MIME TYPE APPLICATION/X-FONT-WOFF
http://deanhume.com/home/blogpost/iis---resource-interpreted-as-font-but-transferred-with-mime-type-application-x-font-woff/4101

2015年5月21日 星期四

nginx 使用正則表達式將特定網址重導向

nginx 使用正則表達式將特定網址重導向

最近遇到一個問題,要將特定的網址重導向,
例如將 http://domain/data/1234/ 重導向為 http://domain/data/1234/data.json。

本來想說還要靠後端服務來處理,
後來想到 nginx 應該有支援重導向的功能,
可以使用 301 Redirect 設定:

location /data/1234/ {
    return 301 /data/1234/data.json
}

但是上面範例中的 1234 只是其中一個可能性,實際上是不定長度的數字,
所以接下來要使用正則表達式 (Regular Expression) 來解析想要的網址。

解析條件如下:
http://domain/data/{number}/

其中 http://domain 是根目錄,後面的 /data/ 是固定的,接著 {number} 是不定長度的數字,
最後結尾有個 / 是不一定要有的(考慮到有人可能不想打這個字),所以加上 ? 表示可有可無。

上述條件的 regex 表示如下:
^\/data/[0-9]+\/?

因為要將數字的部份當成變數,所以要加上 () 括號,
在 nginx 的設定檔 /etc/nginx/nginx.conf 加上

location ~ '^\/data/([0-9]+)\/?' {
    return 301 /data/$1/data.json
}

上面這樣就可以成功轉址,但是執行後卻發生錯誤了!

「此網站包含重新導向迴圈」

原來我們重導向後的網址 http://domain/data/1234/data.json 還是符合 regex 裡面的絛件啊!
於是要在條件的最後加上一個 $ 代表結尾,這樣就不會一直在迴圈中跑不出來嘍。

location ~^\/data\/([0-9]+)\/?$ {
    return 301 /data/$1/data.json
}

相關文章:
Arch Linux nginx 安裝

資料來源:
How to redirect single url in nginx?
http://stackoverflow.com/questions/18037716/how-to-redirect-single-url-in-nginx

Basic Nginx Configuration
https://www.linode.com/docs/websites/nginx/basic-nginx-configuration