2015年7月26日 星期日

2015年7月23日 星期四

測試程式區塊

#include

using namespace std;

int main(int argc,char *argv[])
{
  cout<<"ttt"<<"AAA";
  return 0;
}

2015年7月20日 星期一

Ubuntu下使用GDB給Eigen除錯

Eigen是個好用的c++數學庫,有很多矩陣、向量等工具可以使用

但對我而言稍微麻煩的就是它在預設狀況下無法使用GDB除錯

說是沒辦法有點不太對,就是顯示出來的資訊很混亂不清楚,基本上就是難以用人工去除錯

上網查詢後,找到了使用官方提供的pretty-print方法,但按照它上頭的解說仍無法順利使用,會出現以下錯誤

Python Exception <class 'TypeError'> 'map' object is not subscriptable:
原本以為是我什麼地方搞錯了,還跑去官網去查文件一篇一篇讀,根本....

最後根據這篇的解答,我確認了自己的python版本,確定問題是我這用apt-get 下載的gdb使用的是python3.4版本,而Eigen提供的版本是使用python2所撰寫的,也難怪沒辦法跑。

於是只好移除現有的gdb,重新從官方網站下載來編譯,關於參數我參考了別人的網誌,在編譯完成後總算是成功能 print 出矩陣的內容了。

雖然最後解決了,但這件事真的讓人挺煩躁的,沒事預設3.4版本做什麼啦,python2是過期了膩?明明還很多人在用阿......連gdb網站中的Extending gdb using Python條目都還在用python2耶......

2015年7月19日 星期日

c++ 存取 mysql 資料庫

Beginning Linux Programming》上頭寫的是C,比較不那麼好記憶,於是我上網搜尋了c++的相關用法。很幸運的,MySQL官方就有提供API可以給C++使用,它感覺使用了物件導向的概念,記憶上比較輕鬆,這篇筆記也是在參考它以後所寫的。(官方的文件也寫得很簡明易懂,建議可以看一下)

假設我想存取的資料庫在本機,有資料表children如下:












則我可以使用以下程式來讀寫

#include<iostream>
#include <stdlib.h>
#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main()
{
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;

        driver = get_driver_instance();
        con = driver->connect("localhost", "username", "password");
        con->setSchema("database");

        stmt = con->createStatement();
        stmt->execute("INSERT INTO children(no,fname,age) VALUE(8,'Amy',5)");
//      execute 是用於無回傳值的情況,executeQuery則是有回傳值的情況使用
res = stmt->executeQuery("SELECT * from children");

        while(res->next())
        {
                cout << "id = "<<res->getInt("no")<<"\t";
                cout << "fname = "<<res->getString("fname")<<"\t";
                cout << "age = " <<res->getString(3)<<"\t";
                cout <<endl;
        }
//      res.getInt和res.getString的參數也可以接收正整數,代表第幾個column
return 0; }

這小程式會新增一組資料,並回傳、顯示整個資料表

實際使用時記得得加上try,以投擲與接收錯誤資訊。

編譯時必須加上 -lmysqlcppconn

安裝時我是直接 sudo apt-get install libmysql*

2015年7月17日 星期五

MySQL筆記

參考書目:Beginning Linux Programming

在安裝完MySQL後,首先登入並設置密碼:

1
2
$ mysql -u root mysql
mysql> SET password=PASSWORD('2jennifer');

並新增一個帳號,給予權限

1
mysql> GRANT ALL ON *.*  TO [username] IDENTIFIED BY [password]
GRANT 主要用於修改權限,如果目標不存在則新增一個
*.*代表給予所有的權限

可使用指令查看是否新增成功

1
mysql> use myssql;
mysql> SELECT user,host,password FROM user;
成功的話在表單中可以查看到新增的帳號。
此處SELECT在日後會經常使用,謹記。

接著exit出去,用新造的用戶登入:


1
mysql> exit;
$ mysql -u [username] -p#這裡 -p代表需要輸入密碼

先新增資料庫,並切換過去:
1
mysql> CREATE DATABASE [資料庫名]
mysql> use [資料庫名]

看看有沒有成功
1
mysql> SHOW DATABASES;

之後可以新增資料表:

1
CREATE TABLE children(
        no INT AUTO_INCREMENT NOT NULL PRIMARY KEY /*此為鍵值*/
        , fname VARCHAR(30)
        , age INT
)
這裡是新增一個名為children的資料表,並增加三個欄位(column)
值得一提的是,這段可以存成一個檔案,並在mysql互動式界面中存取
假設我存成 AddTable.sql,存取方式如下

1
mysql> SOURCE AddTable.sql;
可以查看有沒有新增成功:

1
mysql> SHOW TABLES FROM [database name];

新增資料的方式如下:

1
mysql> INSERT INTO children(fname,age) VALUE("Nick",9);
mysql> INSERT INTO children(fname,age) VALUE("Jack",12);
由於欄位no我們設定成會自動增加的欄位,所以不指定也ok,會自動填入1

接著可以使用先前查看用戶名的方式來看我們的資料表:

1
mysql> SELECT * FROM children;
也可以指定顯示某幾個欄位

1
mysql> SELECT no,fname FROM children;
透過比對某欄位值來顯示:

1
mysql> SELECT * FROM children WHERE fname='Jack';
也可以用 LIKE

1
mysql> SELECT * FROM children WHERE fname LIKE 'N%';
更詳細的用法我會參考這裡:凍仁的筆記

2015年7月16日 星期四

awk 複習


awk '
BEGIN{
KE=0
dens=0
pm=0
N=0
}
NR==1{
print "filename :",FILENAME
}
NR>107{
N++
KE+=$2
dens+=$4
pm+=$6
}
END{
KE/=N
dens/=N
pm/=N
print "average KE =",KE
print "average dens =",dens
print "average pm =",pm
}
' $*
上面這是引入一個檔案,並在107行以後開始取平均 引入這類的檔案< awk的用法常忘記,通常要用到的時候又得重新查,故在此留個筆記