Change Screen Resolution in Windows using C++
主要使用 Windows API
ChangeDisplaySettings
及
EnumDisplaySettings
首先使用 EnumDisplaySettings 取得目前的螢幕設定值
然後修改解析度的寬高
最後使用 ChangeDisplaySettings 更新螢幕設定值
=== 程式範例
#include "windows.h"
#include <string>
#include <iostream>
int main(int argc, char* argv[])
{
if (argc == 3)
{
try
{
unsigned long width = std::stoul(argv[1]);
unsigned long height = std::stoul(argv[2]);
DEVMODE *dm = new DEVMODE();
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, dm);
dm->dmPelsWidth = width;
dm->dmPelsHeight = height;
ChangeDisplaySettings(dm, CDS_UPDATEREGISTRY);
}
catch (std::invalid_argument e)
{
std::cout << e.what() << std::endl;
}
}
return 0;
}
=== 資料來源
How to change screen resolution using QT, OpenGL, C++, and Linux?
http://stackoverflow.com/questions/11387724/how-to-change-screen-resolution-using-qt-opengl-c-and-linux
How to change screen resolution in Windows using Qt
http://eastfist.com/qt_tutorials/how-to-change-screen-resolution-in-windows-using-qt/
ChangeDisplaySettings function
https://msdn.microsoft.com/en-us/library/dd183411(VS.85).aspx
2015年10月10日 星期六
2015年10月4日 星期日
Qt 如何將 UTF-8 檔案轉存為 UTF-16
之前的文章介紹如何讀取 UTF-8 檔案。
Qt 如何從檔案讀取 UTF-8 的中文
這次介紹如何將 UTF-8 檔案轉存為 UTF-16。
使用 QFile 開啟檔案,
使用 QTextStream 處理編碼,
=== 完整範例
QFile fileIn("input.txt");
if (!fileIn.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "fileIn opne fail.";
return;
}
QFile fileOut("output.txt");
if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "fileOut opne fail.";
return;
}
QTextStream in(&fileIn);
in.setCodec("UTF-8");
QTextStream out(&fileOut);
out.setCodec("UTF-16");
while (!in.atEnd()) {
QString line = in.readLine();
out << changeText(line);
}
fileIn.close();
fileOut.close();
qDebug() << "done";
=== 資料來源
Qt Documentation - QTextStream Class
http://doc.qt.io/qt-5/qtextstream.html
Qt 如何從檔案讀取 UTF-8 的中文
這次介紹如何將 UTF-8 檔案轉存為 UTF-16。
使用 QFile 開啟檔案,
使用 QTextStream 處理編碼,
=== 完整範例
QFile fileIn("input.txt");
if (!fileIn.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "fileIn opne fail.";
return;
}
QFile fileOut("output.txt");
if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "fileOut opne fail.";
return;
}
QTextStream in(&fileIn);
in.setCodec("UTF-8");
QTextStream out(&fileOut);
out.setCodec("UTF-16");
while (!in.atEnd()) {
QString line = in.readLine();
out << changeText(line);
}
fileIn.close();
fileOut.close();
qDebug() << "done";
=== 資料來源
Qt Documentation - QTextStream Class
http://doc.qt.io/qt-5/qtextstream.html
2015年10月1日 星期四
Qt PostgreSQL 範例
Qt PostgreSQL 範例
=== 測試環境
OS: Windows 7
Qt Verstion: 5.5.0
Compiler: Visual Studio 2013
OS: Arch Linux 4.1.6
Qt Version: 5.5.0
Compiler: GCC 5.2.0
=== 程式範例
=== 錯誤訊息
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
在 Windows,確認下列檔案
MyAppDir\sqldrivers\qsqlpsql.dll
MyAppDir\libpq.dll
MyAppDir\libeay32.dll
MyAppDir\ssleay32.dll
在 linux,確認 qt project file 加上
INCLUDEPATH+=/usr/include/pgsql
LIBS+=-L/usr/lib -lpq
=== 資料來源
Qt Documentation - SQL Database Drivers
http://doc.qt.io/qt-5/sql-driver.html
Qt: SELECT-Query to PostgreSQL-Server always responses with NULL
http://stackoverflow.com/questions/13633055/qt-select-query-to-postgresql-server-always-responses-with-null
QT5: Failed to load psql driver in windows
http://stackoverflow.com/questions/20884010/qt5-failed-to-load-psql-driver-in-windows
=== 測試環境
OS: Windows 7
Qt Verstion: 5.5.0
Compiler: Visual Studio 2013
OS: Arch Linux 4.1.6
Qt Version: 5.5.0
Compiler: GCC 5.2.0
=== 程式範例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); | |
db.setHostName("127.0.0.1"); | |
db.setDatabaseName("FirstDB"); | |
db.setUserName("demo"); | |
db.setPassword("password"); | |
bool ok = db.open(); | |
if (ok) | |
{ | |
QSqlQuery query("SELECT \"SID\", \"Account\", \"CreateDate\", \"LoginTimes\" FROM \"Account\""); | |
while (query.next()) | |
{ | |
qWarning() << query.value(0).toString(); | |
qWarning() << query.value(1).toString(); | |
qWarning() << query.value(2).toString(); | |
qWarning() << query.value(3).toString(); | |
} | |
qDebug() << query.lastError().text(); | |
} |
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
在 Windows,確認下列檔案
MyAppDir\sqldrivers\qsqlpsql.dll
MyAppDir\libpq.dll
MyAppDir\libeay32.dll
MyAppDir\ssleay32.dll
在 linux,確認 qt project file 加上
INCLUDEPATH+=/usr/include/pgsql
LIBS+=-L/usr/lib -lpq
=== 資料來源
Qt Documentation - SQL Database Drivers
http://doc.qt.io/qt-5/sql-driver.html
Qt: SELECT-Query to PostgreSQL-Server always responses with NULL
http://stackoverflow.com/questions/13633055/qt-select-query-to-postgresql-server-always-responses-with-null
QT5: Failed to load psql driver in windows
http://stackoverflow.com/questions/20884010/qt5-failed-to-load-psql-driver-in-windows
2015年9月26日 星期六
Arch 安裝 PostgreSQL
第一步先安裝 PostgreSQL
sudo pacman -S postgresql
然後登入 postgres 帳號
sudo -i -u postgres
接著進行資料庫初始化
initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'
如果發生錯誤,表示目前的 locale 不是 en_US.UTF-8
initdb: invalid locale name "en_US.UTF-8"
初始化資料庫後就可以啟動 PostgreSQL
sudo systemctl start postgresql.service
sudo systemctl enable postgresql.service
建立使用者
createuser --interactive
接著用剛剛建立的使用者帳號建立資料庫
createdb myDatabaseName
使用 psql 進入資料庫
psql -d myDatabaseName
允許遠端連線
修改 /var/lib/postgres/data/postgresql.conf 的內容
listen_addresses = '*'
接著在 /var/lib/postgres/data/pg_hba.conf 將原本的 IPv4設定為
host all all my_remote_client_ip_address/32 md5
設定完之後,重新啟動 PostgreSQL
sudo systemctl restart postgresql
資料來源:
Archlinux Wiki - PostgreSQL
https://wiki.archlinux.org/index.php/PostgreSQL
sudo pacman -S postgresql
然後登入 postgres 帳號
sudo -i -u postgres
接著進行資料庫初始化
initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'
如果發生錯誤,表示目前的 locale 不是 en_US.UTF-8
initdb: invalid locale name "en_US.UTF-8"
初始化資料庫後就可以啟動 PostgreSQL
sudo systemctl start postgresql.service
sudo systemctl enable postgresql.service
建立使用者
createuser --interactive
接著用剛剛建立的使用者帳號建立資料庫
createdb myDatabaseName
使用 psql 進入資料庫
psql -d myDatabaseName
允許遠端連線
修改 /var/lib/postgres/data/postgresql.conf 的內容
listen_addresses = '*'
接著在 /var/lib/postgres/data/pg_hba.conf 將原本的 IPv4設定為
host all all my_remote_client_ip_address/32 md5
設定完之後,重新啟動 PostgreSQL
sudo systemctl restart postgresql
資料來源:
Archlinux Wiki - PostgreSQL
https://wiki.archlinux.org/index.php/PostgreSQL
2015年9月24日 星期四
Qt 如何從檔案讀取 UTF-8 的中文
首先開啟檔案,
然後使用 QTextStream,
記得使用 setCodec 設定編碼。
程式範例:
QFile file("utf8");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
in.setCodec("UTF-8");
while (!in.atEnd()) {
QString line = in.readLine();
QTextStream qtout(stdout);
qtout << line << "\n";
}
資料來源:
http://stackoverflow.com/questions/5630114/how-to-read-utf-8-text-from-file-using-qt
然後使用 QTextStream,
記得使用 setCodec 設定編碼。
程式範例:
QFile file("utf8");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);
in.setCodec("UTF-8");
while (!in.atEnd()) {
QString line = in.readLine();
QTextStream qtout(stdout);
qtout << line << "\n";
}
資料來源:
http://stackoverflow.com/questions/5630114/how-to-read-utf-8-text-from-file-using-qt
2015年9月23日 星期三
Qt - 使用 qrand() 產生亂數 rand
Qt - 使用 qrand() 產生亂數 rand
max 最大值
min 最小值
qrand() % ((max + 1) - min) + min;
產生出來的亂數包含 max 及 min 兩者。
如果連續執行多次程式,會發現每次產生的亂數都是一樣的,
因為電腦產生的亂數,其實是偽亂數,所以想要讓每次的亂數不同,
還需要執行 qsrand 來設定亂數種子。
備註:使用 QTime::currentTime().msec() 現在時間當作種子來設定
備註:使用 QElapsedTimer 取得小於 ms 的時間刻度
資料來源:
Qt Documentation - <QtGlobal> - Global Qt Declarations
http://doc.qt.io/qt-5/qtglobal.html#qrand
How to generate random number between two numbers? Qt
http://qt-project.org/forums/viewthread/24262
Use of qsrand, random method that is not random
http://stackoverflow.com/questions/2767383/use-of-qsrand-random-method-that-is-not-random
Qt: Fast way to measure time?
http://stackoverflow.com/questions/244646/qt-fast-way-to-measure-time
max 最大值
min 最小值
qrand() % ((max + 1) - min) + min;
產生出來的亂數包含 max 及 min 兩者。
如果連續執行多次程式,會發現每次產生的亂數都是一樣的,
因為電腦產生的亂數,其實是偽亂數,所以想要讓每次的亂數不同,
還需要執行 qsrand 來設定亂數種子。
備註:使用 QTime::currentTime().msec() 現在時間當作種子來設定
備註:使用 QElapsedTimer 取得小於 ms 的時間刻度
資料來源:
Qt Documentation - <QtGlobal> - Global Qt Declarations
http://doc.qt.io/qt-5/qtglobal.html#qrand
How to generate random number between two numbers? Qt
http://qt-project.org/forums/viewthread/24262
Use of qsrand, random method that is not random
http://stackoverflow.com/questions/2767383/use-of-qsrand-random-method-that-is-not-random
Qt: Fast way to measure time?
http://stackoverflow.com/questions/244646/qt-fast-way-to-measure-time
Qt - 建立一個 Console 應用程式
想要用 Qt 建立一個 Console 應用程式,
只要像下列的範例就可以建立。
#include <QtCore/QCoreApplication>
#include "Foo/Foo.h"
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
Foo foo;
return app.exec();
}
資料來源:
How do I create a simple Qt console application in C++?
http://stackoverflow.com/questions/4180394/how-do-i-create-a-simple-qt-console-application-in-c
只要像下列的範例就可以建立。
#include <QtCore/QCoreApplication>
#include "Foo/Foo.h"
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
Foo foo;
return app.exec();
}
資料來源:
How do I create a simple Qt console application in C++?
http://stackoverflow.com/questions/4180394/how-do-i-create-a-simple-qt-console-application-in-c
2015年9月21日 星期一
Arch Linux 安裝 ssh server
使用 Linux 常常會用到的功能 ssh
首先安裝 ssh server
pacman -S openssh
接著啟動服務
systemctl start sshd.service
可以設定開機自動啟動服務
systemctl enable sshd.service
如果是在 VM 底下操作的話,記得設定 port forwarding
首先安裝 ssh server
pacman -S openssh
接著啟動服務
systemctl start sshd.service
可以設定開機自動啟動服務
systemctl enable sshd.service
如果是在 VM 底下操作的話,記得設定 port forwarding
2015年9月20日 星期日
SQL 在 Unicode 欄位設定 Unicode 文字
在 Unicode 欄位設定 Unicode 文字
必需滿足兩個條件
一、該 sql 檔案編碼為 UTF-8
這是常被忽略的一點,曾經因為檔案編碼為 Big5 而花費幾個小時找問題,
使用 SSMS 前,預設存檔編碼為 Big5,記得自行轉檔。
二、該文字前加上 N 前置詞
一個字串如果沒有加上前置詞,該字串會被當作非 Unicode 解讀,
造成存在 Unicode 欄位時變成亂碼
範例:
UPDATE GameServer.dbo.Game SET Name = N'可愛巧虎島'
資料來源:
在 SQL Server 中處理 Unicode 字串常數時,必需為所有的 Unicode 字串加上前置詞 N
https://support.microsoft.com/zh-tw/kb/239530
必需滿足兩個條件
一、該 sql 檔案編碼為 UTF-8
這是常被忽略的一點,曾經因為檔案編碼為 Big5 而花費幾個小時找問題,
使用 SSMS 前,預設存檔編碼為 Big5,記得自行轉檔。
二、該文字前加上 N 前置詞
一個字串如果沒有加上前置詞,該字串會被當作非 Unicode 解讀,
造成存在 Unicode 欄位時變成亂碼
範例:
UPDATE GameServer.dbo.Game SET Name = N'可愛巧虎島'
資料來源:
在 SQL Server 中處理 Unicode 字串常數時,必需為所有的 Unicode 字串加上前置詞 N
https://support.microsoft.com/zh-tw/kb/239530
2015年8月4日 星期二
如何讓 Sublime Text 3 顯示目前編碼
上次提過將 Sublime Text 加入右鍵選單,
這次遇到如何顯示檔案編碼 (encoding) 的問題,
其實也是從 notepad++ 轉用 Sublime Text 的習慣。
預設的 Sublime Text 3 的介面是這樣
首先選擇 Preferences / Settings - User
接著會出現使用者自訂設定檔
接著在大括號中輸入下列字串後存檔
"show_encoding": true,
成功!,右下角馬上就出現目前的編碼是 UTF-8 了!
這次遇到如何顯示檔案編碼 (encoding) 的問題,
其實也是從 notepad++ 轉用 Sublime Text 的習慣。
預設的 Sublime Text 3 的介面是這樣
首先選擇 Preferences / Settings - User
接著會出現使用者自訂設定檔
接著在大括號中輸入下列字串後存檔
"show_encoding": true,
成功!,右下角馬上就出現目前的編碼是 UTF-8 了!
2015年7月22日 星期三
2015 Fukushima Game Jam
2015 Fukushima Game Jam 即將在 08/22(六)~08/23(日) 舉行,歡迎大家報名參加。
日本 Fukushima Game Jam 網站
台灣 Fukushima & Faust Game Jam 2015
跟去年一樣,本次台灣也有三個場地,分別在台北、台中、高雄,
報名網址如下:
台北會場
台中會場
高雄會場
幾個常見問題:
目標:在 30 小時內,完成指定主題的遊戲
條件:想作遊戲的心,不需要特定技能,現場會組隊,大家一起做出好玩的遊戲
費用:無,所以請自備筆電,餐飲自理,住宿自理
參考資料
東北ITコンセプト 福島GameJam 2015 | Fukushima Game Jam
http://fgj.igda.jp/
來自全世界的 Global Game Jam 創意作品介紹 台灣業界開發者分享參賽經驗談
http://gnn.gamer.com.tw/3/110333.html
四人兩天開發的《Dora》- MIT Game Jam 心得分享
http://tzengyuxio.me/blog/2012/05/01/mit-game-jam-dora/
2012 Fukushima Game Jam(台北會場)活動概要
https://igdshare.org/fgj2012-taipei
Fukushima Game Jam 2013 通關報告
http://alimencave.blogspot.tw/2013/08/fukushima-game-jam-2013.html
陳禮國 / 遊戲製作的精神時光屋-Game Jam 如何激發無限創意
http://www.tgdf.tw/en/archives/676
FUKUSHIMA & FAUST GAME JAM 2014:《BBQ SENTAI》(烤肉戰隊)
http://gamingsummit.tumblr.com/post/93876707119/fgj-2014-bbq-sentai
2015年7月16日 星期四
ASP.NET API 加入 JSONP 支援
使用 Nuget 安裝 WebApiContrib.Formatting.Jsonp 套件
在 Global.asax 的 Application_Start 函式中加入
GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));
在 App_Start/WebApiConfig.cs 的 Register 修改 Route 如下
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{format}",
defaults: new
{
id = RouteParameter.Optional,
format = RouteParameter.Optional
}
);
這樣就可以支援 Jsonp!
註:會自動判斷 Headers 的 Accept 參數,如果是 application/json 則會回傳 json 格式
資料來源:
WebApiContrib.Formatting.Jsonp
https://github.com/WebApiContrib/WebApiContrib.Formatting.Jsonp
在 Global.asax 的 Application_Start 函式中加入
GlobalConfiguration.Configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));
在 App_Start/WebApiConfig.cs 的 Register 修改 Route 如下
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{format}",
defaults: new
{
id = RouteParameter.Optional,
format = RouteParameter.Optional
}
);
這樣就可以支援 Jsonp!
註:會自動判斷 Headers 的 Accept 參數,如果是 application/json 則會回傳 json 格式
資料來源:
WebApiContrib.Formatting.Jsonp
https://github.com/WebApiContrib/WebApiContrib.Formatting.Jsonp
2015年7月15日 星期三
Qt WebSocket
宣告 WebSocketServer
new QWebSocketServer("Web Server", QWebSocketServer::NonSecureMode, this)
使用 listen() 開始接受 client 連線
同樣是使用 newConnection() 接受新的 client 事件
使用 nextPendingConnection() 取得 client 的 socket
QWebSocket 使用 disconnected 斷線事件
因為 WebSocket 規範中有兩種資料傳送方式,純文字模式及二進制模式,
所以資料接收事件也分為兩種,分別為
textMessageReceived,參數為 QString message
binaryMessageReceived,參數為 QByteArray message
傳送資料也分為兩個函式,分別為
sendTextMessage
sendBinaryMessage
簡單範例
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, [=]() {
qDebug() << "new client socket";
QWebSocket* socket = this->m_pWebSocketServer->nextPendingConnection();
connect(socket, &QWebSocket::disconnected, [=]() {
qDebug() << "client socket disconnected";
socket->deleteLater();
});
connect(socket, &QWebSocket::textMessageReceived, [=](QString message) {
qDebug() << "client textMessageReceived";
qDebug() << "Read: " << message;
qDebug() << "Send " << message;
socket->sendTextMessage(message);
socket->close();
});
connect(socket, &QWebSocket::binaryMessageReceived, [=](QByteArray message) {
qDebug() << "client processBinaryMessage";
qDebug() << "Read: " << message;
qDebug() << "Send " << message;
socket->sendBinaryMessage(message);
socket->close();
});
});
m_pWebSocketServer->listen(QHostAddress::Any, 8812);
資料來源
Echo Server Example
http://doc.qt.io/qt-5/qtwebsockets-echoserver-example.html
QWebSocketServer
http://doc.qt.io/qt-5/qwebsocketserver.html
new QWebSocketServer("Web Server", QWebSocketServer::NonSecureMode, this)
使用 listen() 開始接受 client 連線
同樣是使用 newConnection() 接受新的 client 事件
使用 nextPendingConnection() 取得 client 的 socket
QWebSocket 使用 disconnected 斷線事件
因為 WebSocket 規範中有兩種資料傳送方式,純文字模式及二進制模式,
所以資料接收事件也分為兩種,分別為
textMessageReceived,參數為 QString message
binaryMessageReceived,參數為 QByteArray message
傳送資料也分為兩個函式,分別為
sendTextMessage
sendBinaryMessage
簡單範例
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, [=]() {
qDebug() << "new client socket";
QWebSocket* socket = this->m_pWebSocketServer->nextPendingConnection();
connect(socket, &QWebSocket::disconnected, [=]() {
qDebug() << "client socket disconnected";
socket->deleteLater();
});
connect(socket, &QWebSocket::textMessageReceived, [=](QString message) {
qDebug() << "client textMessageReceived";
qDebug() << "Read: " << message;
qDebug() << "Send " << message;
socket->sendTextMessage(message);
socket->close();
});
connect(socket, &QWebSocket::binaryMessageReceived, [=](QByteArray message) {
qDebug() << "client processBinaryMessage";
qDebug() << "Read: " << message;
qDebug() << "Send " << message;
socket->sendBinaryMessage(message);
socket->close();
});
});
m_pWebSocketServer->listen(QHostAddress::Any, 8812);
資料來源
Echo Server Example
http://doc.qt.io/qt-5/qtwebsockets-echoserver-example.html
QWebSocketServer
http://doc.qt.io/qt-5/qwebsocketserver.html
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
呼叫 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/
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/
將下列內容存成 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 目錄的 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 documentationhttps://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年6月9日 星期二
Cocos2d-x 文章列表
Cocos2d-x 3.2 遊戲範例
Cocos2d-x 3.2 - Step by Step Cocos2dxSimpleGame SeriesChapter 1 - How to Create a New cocos2d-x project
Chapter 2 - How to Add a sprite
Chapter 3 - How to Move a sprite
Chapter 4 - How to Fire some Bullets
Chapter 5 - How to Detect the Collisions
Chapter 6 - How to Play Music and Sound Effect
Chapter 7 - Some Icing on the Cake
Cocos2d-x 3.0 遊戲範例
Cocos2d-x 3.0 - Step by Step Cocos2dxSimpleGame SeriesChapter 1 - How to Create a New cocos2d-x project
Chapter 2 - How to Add a sprite
Chapter 3 - How to Move a sprite
Chapter 4 - How to Fire some Bullets
Chapter 5 - How to Detect the Collisions
Chapter 6 - How to Play Music and Sound Effect
Chapter 7 - Some Icing on the Cake
從 2.x 版本升級為 3.x 版本
Cocos2d-x 2.x to 3.x2015年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
網站發現一行錯誤訊息:
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
最近遇到一個問題,要將特定的網址重導向,
例如將 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
2015年5月20日 星期三
Arch Linux 安裝 nginx
Arch Linux 安裝 nginx
安裝 nginx
# pacman -S nginx
預設設定為 localhost 80 port,
使用 systemd 來執行 nginx (一次性)
# systemctl start nginx.service
或者啟動此服務 (開機自動執行)
# systemctl enable nginx.service
這時候可以在 http://localhost 看到預設網頁了喔!
nginx 主要設定檔為 /etc/nginx/nginx.conf,可以使用 nano 編輯
# nano /etc/nginx/nginx.conf
預設網頁為 /usr/share/nginx/html/index.html,可以使用 cat 查詢
# cat /usr/share/nginx/html/index.html
相關文章:
nginx 使用正則表達式將特定網址重導向
資料來源:
Arch Wiki - nginx
https://wiki.archlinux.org/index.php/Nginx
Arch Wiki - systemd
https://wiki.archlinux.org/index.php/Systemd#Using_units
安裝 nginx
# pacman -S nginx
預設設定為 localhost 80 port,
使用 systemd 來執行 nginx (一次性)
# systemctl start nginx.service
或者啟動此服務 (開機自動執行)
# systemctl enable nginx.service
這時候可以在 http://localhost 看到預設網頁了喔!
nginx 主要設定檔為 /etc/nginx/nginx.conf,可以使用 nano 編輯
# nano /etc/nginx/nginx.conf
預設網頁為 /usr/share/nginx/html/index.html,可以使用 cat 查詢
# cat /usr/share/nginx/html/index.html
相關文章:
nginx 使用正則表達式將特定網址重導向
資料來源:
Arch Wiki - nginx
https://wiki.archlinux.org/index.php/Nginx
Arch Wiki - systemd
https://wiki.archlinux.org/index.php/Systemd#Using_units
2015年5月18日 星期一
Arch Linux C++ / Qt 開發
Arch Linux C++ / Qt 開發
要進行 C++ 開發,只要安裝基本開發套件
# pacman -S base-devel
使用 nano 新增 main.cpp 輸入下列文字:
#include <iosteam>
int main(int argc, char* argv[])
{
std::cout << "Hello World!" << std::endl;
return 0;
}
存檔後使用 g++ 編譯
# g++ main.cpp
編譯後會產生 a.out 檔案,執行
#./a.out
畫面上就會印出 Hello World! 文字
接著安裝 Qt 套件
# pacman -S qt
新增一個 qt 資料夾並進入
# mkdir qt
# cd qt
使用 nano 新增 main.cpp 輸入下列文字:
#include <QDebug>
int main(int argc, char* argv[])
{
qDebug() << "Hello World!";
return 0;
}
使用 qmake 產生專案檔
# qmake -project
使用 qmake 產生 Makefile
# qmake
使用 Makefile 編譯
# make
執行產生的 qt 檔案
# ./qt
畫面上會印出 Hello World! 的文字
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
要進行 C++ 開發,只要安裝基本開發套件
# pacman -S base-devel
使用 nano 新增 main.cpp 輸入下列文字:
#include <iosteam>
int main(int argc, char* argv[])
{
std::cout << "Hello World!" << std::endl;
return 0;
}
存檔後使用 g++ 編譯
# g++ main.cpp
編譯後會產生 a.out 檔案,執行
#./a.out
畫面上就會印出 Hello World! 文字
接著安裝 Qt 套件
# pacman -S qt
新增一個 qt 資料夾並進入
# mkdir qt
# cd qt
使用 nano 新增 main.cpp 輸入下列文字:
#include <QDebug>
int main(int argc, char* argv[])
{
qDebug() << "Hello World!";
return 0;
}
使用 qmake 產生專案檔
# qmake -project
使用 qmake 產生 Makefile
# qmake
使用 Makefile 編譯
# make
執行產生的 qt 檔案
# ./qt
畫面上會印出 Hello World! 的文字
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
2015年5月17日 星期日
Arch Linux 基本設定
Arch Linux 基本設定
本文接續前篇:
VirtualBox 安裝 Arch Linux
可以使用下列指令檢查網路是否正常
# ping -c 3 www.google.com
設定 root 密碼
# passwd
設定 hostname
echo arch > /etc/hostname
設定時區 (此範例將時區設定為台北時間)
ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime
註:如果出現下列錯誤訊息,加上 -f 參數即可強制執行
ln: failed to create symbolic link '/etc/locatime': File exists
=== 設定 UTF-8 語系
設定支援語系,編緝要產生的語系
# nano /etc/locale.gen
將下列解除註解 (刪除開頭的 # 符號)
en_US.UTF-8 UTF-8
開始產生語系
# locale-gen
設定系統的語系為 UTF-8
localectl set-locale LANG=en_US.UTF-8
新增使用者 (
# useradd -m {username}
註:沒有加上 -m 參數的話,
不會建立使用者家目錄 /home/{username} 及相關檔案 .bash_logout .bash_profile, .bashrc
設定使用者密碼
# passwd {username}
刪除使用者
# userdel {username}
範例:
#useradd demo
#useradd demo
安裝 sudo
#pacman -S sudo
設定 sudo 的使用者
警告:永遠只用 visudo 指令來修改,不要直接修改檔案,
因為 visudo 指令會在修改完畢後進行檢查。
你可以使用預設的 vi 編輯器
# visudo
或者使用 nano 當編輯器
# EDITOR=nano visudo
簡單的將某一使用者加入 sudo 的方法是在
root ALL=(ALL) ALL 下面加入一行
{username} ALL=(ALL) ALL
例如:
demo ALL=(ALL) ALL
登出後使用新的使用者帳密登入
# logout
===
20160512 Update:
設定 UTF-8 語系
20160106 Update:
移除啟動 dhcp 服務 (移到安裝時進行)
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
鳥哥的 Linux 私房菜
http://linux.vbird.org/linux_basic/
本文接續前篇:
VirtualBox 安裝 Arch Linux
可以使用下列指令檢查網路是否正常
# ping -c 3 www.google.com
設定 root 密碼
# passwd
設定 hostname
echo arch > /etc/hostname
設定時區 (此範例將時區設定為台北時間)
ln -s /usr/share/zoneinfo/Asia/Taipei /etc/localtime
註:如果出現下列錯誤訊息,加上 -f 參數即可強制執行
ln: failed to create symbolic link '/etc/locatime': File exists
=== 設定 UTF-8 語系
設定支援語系,編緝要產生的語系
# nano /etc/locale.gen
將下列解除註解 (刪除開頭的 # 符號)
en_US.UTF-8 UTF-8
開始產生語系
# locale-gen
設定系統的語系為 UTF-8
localectl set-locale LANG=en_US.UTF-8
新增使用者 (
# useradd -m {username}
註:沒有加上 -m 參數的話,
不會建立使用者家目錄 /home/{username} 及相關檔案 .bash_logout .bash_profile, .bashrc
設定使用者密碼
# passwd {username}
刪除使用者
# userdel {username}
範例:
#useradd demo
#useradd demo
安裝 sudo
#pacman -S sudo
設定 sudo 的使用者
警告:永遠只用 visudo 指令來修改,不要直接修改檔案,
因為 visudo 指令會在修改完畢後進行檢查。
你可以使用預設的 vi 編輯器
# visudo
或者使用 nano 當編輯器
# EDITOR=nano visudo
簡單的將某一使用者加入 sudo 的方法是在
root ALL=(ALL) ALL 下面加入一行
{username} ALL=(ALL) ALL
例如:
demo ALL=(ALL) ALL
登出後使用新的使用者帳密登入
# logout
===
20160512 Update:
設定 UTF-8 語系
20160106 Update:
移除啟動 dhcp 服務 (移到安裝時進行)
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
鳥哥的 Linux 私房菜
http://linux.vbird.org/linux_basic/
安裝 Arch Linux 發生錯誤 invalid of corrupted package (PGP signature)
安裝 Arch Linux 發生錯誤 invalid of corrupted package (PGP signature)
今天安裝時發生下列錯誤:
error: dhcpcd: signature from "Anatol Pomozov <anatol.pomozov@gmail.com>" is unknown trust
:: File /mnt/var/cache/pacman/pkg/dhcpcd-6.7.1-1-x86_64.pkg.tar.xz is corrupter (invalid of corrupted package (PGP signature)).
這時候就要更新 key
# pacman-key --populate archlinux
# pacman-key --refresh-keys
之後再執行一次安裝即可
# pacstrap -i /mnt base
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux - [Solved] New install - invalid of corrupted package (PGP signature)
https://bbs.archlinux.org/viewtopic.php?id=195139
今天安裝時發生下列錯誤:
error: dhcpcd: signature from "Anatol Pomozov <anatol.pomozov@gmail.com>" is unknown trust
:: File /mnt/var/cache/pacman/pkg/dhcpcd-6.7.1-1-x86_64.pkg.tar.xz is corrupter (invalid of corrupted package (PGP signature)).
這時候就要更新 key
# pacman-key --populate archlinux
# pacman-key --refresh-keys
之後再執行一次安裝即可
# pacstrap -i /mnt base
相關文章:
Arch Linux 文章列表
資料來源:
Arch Linux - [Solved] New install - invalid of corrupted package (PGP signature)
https://bbs.archlinux.org/viewtopic.php?id=195139
2015年5月10日 星期日
VirtualBox 安裝 Arch Linux
VirtualBox 安裝 Arch Linux
Release Info 顯示最新的版本資訊
BitTorrent Download (recommended) 是 BT 磁力連結及種子檔
HTTP Direct Downloads 開始是全球各地直接下載的連結
本文編輯時的版本:
Current Release: 2016.01.01
Included Kernel: 4.3.3
註:如果是現有的 arch linux,可以使用 pacman -Syu 指令直接升級
按下 Enter 選擇第一項 Boot Arch Linux (x86_64) 之後進入安裝介面
首先進行網路連線測試,確認網路功能正常
# ping -c 3 www.google.com
將著使用 cgdisk 建立 GPT 分割區,
預計分別建立 10G 在 / (根目錄),4G在 /home,2G 在 /swap (共 16G)
# cgdisk /dev/sda
警告頁面,按下任何鍵後繼續,
會看到目前總共有16G 的 free space
首先建立第一個空間,10G
New / Enter (預設) / 10G / Enter (預設 8300) / Enter (預設空白)
移到下面的 6G free space 的位置,同樣的動作建立 4G 空間
New / Enter (預設) / 4G / Enter (預設 8300) / Enter (預設空白)
移到最後的 2G free space 的位置
New / Enter (預設) / 2G / Enter (預設 8300) / Enter (預設空白)
確認正確後寫入(警告訊息為此動作會破壞硬碟上的資料)
Write / Enter
最後離開 cgdisk
Quit
建立檔案系統
# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2
別忘了 swap
# mkswap /dev/sda3
# swapon /dev/sda3
使用 lsblk 來確認目前的分割區狀態
# lsblk /dev/sda
掛載分割區
# mount /dev/sda1 /mnt
# mkdir /mnt/home
# mount /dev/sda2 /mnt/home
使用 pacstrap 安裝基本系統
# pacstrap -i /mnt base
產生 fstab 檔案
# genfstab -U -p /mnt >> /mnt/etc/fstab
使用 nano 文字編緝器查看產生的資訊
# nano /mnt/etc/fstab
(Ctrl + X 離開 nano)
使用 chroot 進入剛安裝好的系統
# arch-chroot /mnt /bin/bash
設定 BIOS 主機版開機載入程式
# pacman -S gptfdisk
# pacman -S syslinux
# syslinux-install_update -i -a -m
設定開機根目錄為 /dev/sda1 (預設為 /dev/sda3)
# nano /boot/syslinux/syslinux.cfg
設定網路,啟動 dhcp 服務
# systemctl enable dhcpcd.service
離開 chroot 並重啟系統
# exit
# umount -R /mnt
# poweroff
記得先退出 arch 安裝光碟
重開機後看到開機選項,5秒後自動進入 Arch Linux
接著登入 root 後就可以開始使用了
到此基本系統安裝完成,如果有興趣可以參考下一篇:
Arch Linux 基本設定
相關文章:
Arch Linux 文章列表
20150611 Update:
Arch 版本由 2015.05.01 改為 2015.06.01,硬碟空間由 8G 改為 16G
20160106 Update:
Arch 從 2015.06.01 更新為 2016.01.01
Kernel 從 4.0.4 更新為 4.3.3
新增啟動 dhcp 服務 (原本在基本設定時才進行)
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
一、取得安裝檔 (iso)
在Arch網站選擇一個站台下載 iso 檔案,建議使用 BT 下載Release Info 顯示最新的版本資訊
BitTorrent Download (recommended) 是 BT 磁力連結及種子檔
HTTP Direct Downloads 開始是全球各地直接下載的連結
本文編輯時的版本:
Current Release: 2016.01.01
Included Kernel: 4.3.3
註:如果是現有的 arch linux,可以使用 pacman -Syu 指令直接升級
二、設定 VirtualBox
建立一個新的虛擬機,設定記憶體 512 MB,硬碟 16 GB。三、開始安裝
啟動虛擬機後,掛載 iso 檔,會看到安裝畫面按下 Enter 選擇第一項 Boot Arch Linux (x86_64) 之後進入安裝介面
首先進行網路連線測試,確認網路功能正常
# ping -c 3 www.google.com
將著使用 cgdisk 建立 GPT 分割區,
預計分別建立 10G 在 / (根目錄),4G在 /home,2G 在 /swap (共 16G)
# cgdisk /dev/sda
警告頁面,按下任何鍵後繼續,
會看到目前總共有16G 的 free space
首先建立第一個空間,10G
New / Enter (預設) / 10G / Enter (預設 8300) / Enter (預設空白)
移到下面的 6G free space 的位置,同樣的動作建立 4G 空間
New / Enter (預設) / 4G / Enter (預設 8300) / Enter (預設空白)
移到最後的 2G free space 的位置
New / Enter (預設) / 2G / Enter (預設 8300) / Enter (預設空白)
確認正確後寫入(警告訊息為此動作會破壞硬碟上的資料)
Write / Enter
最後離開 cgdisk
Quit
# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2
別忘了 swap
# mkswap /dev/sda3
# swapon /dev/sda3
使用 lsblk 來確認目前的分割區狀態
# lsblk /dev/sda
掛載分割區
# mount /dev/sda1 /mnt
# mkdir /mnt/home
# mount /dev/sda2 /mnt/home
使用 pacstrap 安裝基本系統
# pacstrap -i /mnt base
產生 fstab 檔案
# genfstab -U -p /mnt >> /mnt/etc/fstab
使用 nano 文字編緝器查看產生的資訊
# nano /mnt/etc/fstab
(Ctrl + X 離開 nano)
使用 chroot 進入剛安裝好的系統
# arch-chroot /mnt /bin/bash
設定 BIOS 主機版開機載入程式
# pacman -S gptfdisk
# pacman -S syslinux
# syslinux-install_update -i -a -m
設定開機根目錄為 /dev/sda1 (預設為 /dev/sda3)
# nano /boot/syslinux/syslinux.cfg
設定網路,啟動 dhcp 服務
# systemctl enable dhcpcd.service
離開 chroot 並重啟系統
# exit
# umount -R /mnt
# poweroff
記得先退出 arch 安裝光碟
重開機後看到開機選項,5秒後自動進入 Arch Linux
接著登入 root 後就可以開始使用了
Arch Linux 基本設定
相關文章:
Arch Linux 文章列表
20150611 Update:
Arch 版本由 2015.05.01 改為 2015.06.01,硬碟空間由 8G 改為 16G
20160106 Update:
Arch 從 2015.06.01 更新為 2016.01.01
Kernel 從 4.0.4 更新為 4.3.3
新增啟動 dhcp 服務 (原本在基本設定時才進行)
資料來源:
Arch Linux
https://www.archlinux.org/
Arch Linux 臺灣社群
http://archlinux.tw/
2015年4月29日 星期三
Visual Studio Qt IntelliSense: 無法開啟來源檔案 "initializer_list"
Visual Studio Qt IntelliSense: 無法開啟來源檔案 "initializer_list"
完整的訊息如下:
IntelliSense: 無法開啟來源檔案 "initializer_list"
IntelliSense: 內嵌規範只能用於函式宣告
IntelliSense: namespace "std" 沒有成員 "initializer_list"
IntelliSense: 必須是 ')'
IntelliSense: 必須是 ';'
IntelliSense: class "QStringList" 沒有成員 "sort"
一開始因為有些專案會出現,有些不會,所以沒有發現原因,
後來發現原因是 Visual Studio 2013 指定平台工具組為 Visual Studio 2012,
也就是使用 VS 2013 為 IDE,但是 compiler toolchain 使用 VS 2012 進行編譯。
一些程式的寫法是用 Visual Studio 的版本來判斷是否支援某些寫法,像是 C++11 之類的,
這時候因為使用的 IDE 版本跟編譯器不一致,導致 VS 的 IntelliSense 誤判。
目前的解決方法是強制設定這些專案的 VS 版本為 2012,
在專案屬性宣告 _MSC_FULL_VER=170061030 即可。
完整的訊息如下:
IntelliSense: 無法開啟來源檔案 "initializer_list"
IntelliSense: 內嵌規範只能用於函式宣告
IntelliSense: namespace "std" 沒有成員 "initializer_list"
IntelliSense: 必須是 ')'
IntelliSense: 必須是 ';'
IntelliSense: class "QStringList" 沒有成員 "sort"
一開始因為有些專案會出現,有些不會,所以沒有發現原因,
後來發現原因是 Visual Studio 2013 指定平台工具組為 Visual Studio 2012,
也就是使用 VS 2013 為 IDE,但是 compiler toolchain 使用 VS 2012 進行編譯。
一些程式的寫法是用 Visual Studio 的版本來判斷是否支援某些寫法,像是 C++11 之類的,
這時候因為使用的 IDE 版本跟編譯器不一致,導致 VS 的 IntelliSense 誤判。
目前的解決方法是強制設定這些專案的 VS 版本為 2012,
在專案屬性宣告 _MSC_FULL_VER=170061030 即可。
2015年3月21日 星期六
googletest - Google C++ Testing Framework - Visual Studio 2013
本文介紹如何在 Visual Studio 2013 使用 Google C++ Testing Framework
首先取得 gtest,下載 gtest-1.7.0.zip。
解壓縮之後,在 msvc 資料夾下可以找到 gtest, gtest-md 兩個方案檔,
兩個方案差別在 gtest 編譯屬性為 MT (MTd),而 gtest-md 為 MD (MDd),
這裡要選擇跟待測專案同樣的設定,關於 MD, MT 詳細資訊請見 MSDN。
如果手邊沒有現有專案的話,先建立一個空專案在 C:\Project1,
因為 VS C++ 專案預設為 MD,所以接下來選擇 gtest-md 為範例。
直接點擊兩下gtest-md 方案,VS 會自動將 VS 2003 版本轉換為 VS2013 版本,
編譯之後,複製 msvc\gtest-md\Debug\gtestd.lib 及 C:\gtest-1.7.0\msvc\gtest-md\Release\gtest.lib
到 C:\Project1\Project1\gtest\lib
另外複製 C:\gtest-1.7.0\include 整個資料夾到 C:\Project1\Project1\gtest。

接著設定 Project1 的專案使用 googletest,分別是
其他 Include 目錄為 .\gtest\include
其他程式庫目錄為 .\gtest\lib
其他相依性為 gtest.lib
接著將 main.cpp 改為下列範例
編譯,執行成功!
恭喜可以開始進行 Unit Test 了!

註:如果使用 Visual Studio 2012 會遇到「error C2977: 'std::tuple' : 樣板 引數太多 」錯誤,
可以參考這篇:error C2977: 'std::tuple' : too many template arguments
參考資料:
googletest - Google C++ Testing Framework
https://code.google.com/p/googletest/
Primer - Getting started with Google C++ Testing Framework
https://code.google.com/p/googletest/wiki/Primer
Samples - Google C++ Testing Framework Samples
https://code.google.com/p/googletest/wiki/Samples
首先取得 gtest,下載 gtest-1.7.0.zip。
解壓縮之後,在 msvc 資料夾下可以找到 gtest, gtest-md 兩個方案檔,
兩個方案差別在 gtest 編譯屬性為 MT (MTd),而 gtest-md 為 MD (MDd),
這裡要選擇跟待測專案同樣的設定,關於 MD, MT 詳細資訊請見 MSDN。
如果手邊沒有現有專案的話,先建立一個空專案在 C:\Project1,
因為 VS C++ 專案預設為 MD,所以接下來選擇 gtest-md 為範例。
直接點擊兩下gtest-md 方案,VS 會自動將 VS 2003 版本轉換為 VS2013 版本,
編譯之後,複製 msvc\gtest-md\Debug\gtestd.lib 及 C:\gtest-1.7.0\msvc\gtest-md\Release\gtest.lib
到 C:\Project1\Project1\gtest\lib
另外複製 C:\gtest-1.7.0\include 整個資料夾到 C:\Project1\Project1\gtest。

接著設定 Project1 的專案使用 googletest,分別是
其他 Include 目錄為 .\gtest\include
其他程式庫目錄為 .\gtest\lib
其他相依性為 gtest.lib
接著將 main.cpp 改為下列範例
#include "gtest/gtest.h" int main(int argc, char* argv[]) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } int add(int a, int b) { return a + b; } TEST(AddTest, Test1) { EXPECT_EQ(3, add(1, 2)); }
編譯,執行成功!
恭喜可以開始進行 Unit Test 了!

註:如果使用 Visual Studio 2012 會遇到「error C2977: 'std::tuple' : 樣板 引數太多 」錯誤,
可以參考這篇:error C2977: 'std::tuple' : too many template arguments
參考資料:
googletest - Google C++ Testing Framework
https://code.google.com/p/googletest/
Primer - Getting started with Google C++ Testing Framework
https://code.google.com/p/googletest/wiki/Primer
Samples - Google C++ Testing Framework Samples
https://code.google.com/p/googletest/wiki/Samples
2015年3月20日 星期五
error C2977: 'std::tuple' : too many template arguments
最近遇到「error C2977: 'std::tuple' : 樣板 引數太多 」的問題,
上網查詢之後發現是 Visual Studio 2012 不支援 variadic templates,
解決方案是在前置處理器定義加上 _VARIADIC_MAX 10
註:Visual Studio 2013 已支援
參考資料:
C2977: 'std::tuple' : too many template arguments (MSVC11)
http://stackoverflow.com/questions/8274588/c2977-stdtuple-too-many-template-arguments-msvc11
上網查詢之後發現是 Visual Studio 2012 不支援 variadic templates,
解決方案是在前置處理器定義加上 _VARIADIC_MAX 10
註:Visual Studio 2013 已支援
參考資料:
C2977: 'std::tuple' : too many template arguments (MSVC11)
http://stackoverflow.com/questions/8274588/c2977-stdtuple-too-many-template-arguments-msvc11
訂閱:
文章 (Atom)