2015年3月2日 星期一

DOUBLE 第十天

嗯......

希望不會變成雙日刊

雖然說吸收狀況已經沒問題了但是想玩的東西還是多到爆

目前已經把時間調回10點左右躺下可以睡得很好的狀態

接下來只要繼續保持基本上就可以把事情穩穩的做好了


另外今天應該也不會有時間寫自我觀察計畫的東西

就寫寫這兩天玩graphiz和關於gcc的事情


之前都是在windows系統下試著用graphiz寫東西

結果發現原來graphedit不能正常存取中文
(應該沒拼錯,就是視窗化的editor)

改在linux下執行就沒問題,只要存成UTF-8(預設)就可以了

甚至連自行都不用特別設定就能在圖上正確的畫出來(graphedit要設定)

另外,subgraph的命名需要用特別的關鍵字才能正常的畫出來
ex:cluster_xxx{}

命名規則(或者說選項)我還沒去翻document,畢竟暫時不需要

要找也是先找排版相關的XD


關於gcc的話則是了解到中間會有一個中介語言

叫做 RTL (Register Transfer Language)

目前看起來跟LLVM的 IR (Intermediate Representation)

兩個同樣都是一種 IF (Intermediate Form)

就wikipedia上的說法LLVM可以使用gcc編譯出來的IF(RTL)

另外clang目前也把gcc當作底下的預設compiler

如果要gcc把中間的檔案列出來的話需要加上"-fdump-rtl-all"(RTL)或者"-fdump-tree-all"(TREE)

另外stack overflow上的人提到說如果要研究這方面東西最好不要用gcc當作目標

因為很多東西都跟manual不太一樣,也沒有完全實作理論上的東西

有興趣的話可以找LLVM或者某php的compiler(忘記名子惹~)來看看











2015年2月28日 星期六

DOUBLE 第八天

恩....難怪覺得這兩天怪怪的

原來是沒睡飽

今天下午又加躺了4個小時才恢復過來

當作周休二日吧XDDD

2015年2月26日 星期四

第六天

嗯.....資料查詢的一天

進展依然不大(雖然說之前再做GUI進展也沒多了不起

單純就是把diary用的file type訂定出來了

file_object:
  file_title                       ->檔案名稱
  object_member_num   ->這個file有多少個object
  file_time_range            ->數字,以月為單位
  object                           ->diary物件(以天為單位)


file_object的主要思考是在於要把object組織成一個檔案

所以object會做成linked list的模式

object:
  object_size    ->作為搜尋下一個物件的shift
  objecttype_id    ->作為以後擴充的檔案格式標記
  object_id    ->不同檔案之間識別的標記(流水號)
  source
  text
  next_object

而source(chapcher)和text(section)則是兩種資料的格式

目前想法是以後會把這兩種資料分別拆開放在統計和測驗用

所以各自都會有各自的時間、標題

    source:
      source_file_size ->作為shift用
      sourcetype_id    ->作為以後擴充的檔案格式標記
      source_id        ->不同檔案之間識別的標記(流水號)
      titles           ->標題
      date             ->時間
      info_size        ->資源資訊長度
      info             ->資源內容
   
    text:
      text_file_size ->作為shift用
      texttype_id    ->作為以後擴充的檔案格式標記
      file_id        ->不同檔案之間識別的標記(流水號)
      titles         ->標題
      date           ->時間
      text_size      ->文字長度
      text_cont      ->文字內容

至於memberfunction則還沒決定

但目前想法是在這層面利用file_object和object來進行操作

而source和text都沒有member function,純粹當作資料使用


而各種file type則一起放在同一個.h檔中以方便操作









2015年2月25日 星期三

第五天

今天根本沒做什麼事結果就過了一天.....

在準備做內容的時候才發現當時竟然忘記要想貯存的檔案結構了

section_file目前想法是用binary file存,並且當作一個小object包在diary_file裡面:
filetype_id
    作為以後擴充的檔案格式標記
file_id
    不同檔案之間識別的標記(流水號)
titles
    標題
date
    時間
text_size
    文字長度
text
    文字內容


詳細的部份打算參考一下bmp的header file到底定義了什麼以確定沒有其他漏掉的

到時候還會把resource(chapcher_file)的資料也包在一起

並且要定義一下code內部的命名規則

2015年2月23日 星期一

第四天

今天的時間有點早(遠望

今天不過是把diarywidget做出來而已

做出了一個超級陽春的介面.....

接下來要開始做實際的member function了

感覺會非常刺激阿!!!

在寫的時候很多東西都是沒有完全整理好,整個就是粗製濫造的coding style

這些東西也要趁著這時候慢慢整理起來

不然之後在玩的時候一定會長出很多不知名的bug

目前來說完全沒有規劃,都是長相先出來再說

光是這樣視窗就已經多的開開關關超麻煩....
(依然不想用QtCreator的只有vim自幹才是王道的無聊堅持

然後接下來要去救一下我的顯卡&主機板!!

沒有高階CPU的日子雖然也不無聊但是很麻煩阿!


最後的最後讓醜不啦機介面出曬曬太陽



有人能猜到他最後會長成什麼樣子嗎XDDD



第三天

發生了一個奇妙的error messiage

搞了一個小時之後才發現被繼承的class要在header file裡面就宣告(include)

其實前面就有做過正確的作法

但一直以為那是亂來,正確作法應該要把全部的實作都放在.cpp裡

結果就是GG


只是我好奇的是 header file 的 include 宣告難道不會因為重複宣告就出問題嗎?

例如:(實際寫法當然不會這樣,只是懶惰所以把function body寫在.h裡面)



解決方法就是把每個檔案都各自跑出object file再用linker連在一起


另外就是如果一個Widget class要掛東西的話不要打成parent,要打this

雖然很明顯但是因為這個打所以又花了半個小時在debug


接下來會再把diary widget做出來,但是感覺還有很多沒解決跟沒想完整的事情

還有要把研究用的視窗介面做出來還有上課時可能會用到的程式......

感覺還有好常的一段路要走


2015年2月22日 星期日

使用gcc編譯出assembly code

用gcc -S[1]指令就可以在編譯出assembly code時停下並輸出

不會直接輸出binary file

但輸出的檔案是AT&A的syntex格式[2]

要加入-masm=intel才會變成Intel的格式


下一步打算查查看gcc和gnu assembler的設定



GNU Assembler[3]
How to use assembly language to write an OS[4]

ISA extensions and compiler/assembler/linker flow from source code to an executable[5]
有一個非常詳細的程式compile流程圖

[1]http://ccckmit.wikidot.com/cp:callasasm
[2]http://stackoverflow.com/questions/4070922/assembly-instruction-set-for-my-processor
[3]https://linux.web.cern.ch/linux/scientific4/docs/rhel-as-en-4/index.html
[4]http://mikeos.sourceforge.net/write-your-own-os.html
[5]http://www.gordoni.com/cygnus/evaluate.html

第二天

嗯.....

玩得不亦樂乎然後啥都沒做到一個下午就過去了.....

QBoxLayout 和 QGroupBox 傻傻弄不清楚

睡眠不足影響真的太大了


還有遇到了利用default argument來定義兩個overloading function的問題

第一個是正確用法

下面那個是傻子在用的來著XDD




另外需要好好的把整個程式的架構分析一下

今天在介面的部份玩太久了~


額外:
Qt的connect呼叫法在object裡和外面有點不太一樣
object裡面:connect(.....)
object外面:QObject::connect(...)
沒有在object裡面呼叫的話就需要在前面加上"QObject::"
(:: is scope resolution operator)



2015年2月21日 星期六

程式人常用的部落格平台以及編輯工具

Github page or Torchpad or 點部落

logdown

^---但聽說免費功能很爛

hexo



編輯工具:
用來嵌入程式碼:github gist

一個開始

一直都有打算開發一些玩具來玩

想法其實很多,但總覺的不夠成熟

需要的工具不少,但老是學到一半

到底在哪個平台開發、用哪種語言來開發等等之類的


現在,2015年

雖然還沒想清楚最後想要做出甚麽

雖然工具還不夠熟

雖然平台每個都很想玩

雖然打在網誌上還是感覺很害羞

但不管怎樣,我想做

感覺這會是個十分有趣的經驗

如果有誰路過有有趣的想法的也請多多指教



這是個用Qt 5.2.1版開發的軟體

製作目的是想把自己曾經經歷過的東西用一個簡單的介面除存下來並分析

目前規劃主功能有:紀錄、統計、測驗、發展圖

紀錄原則上是每天,可以有多個不同紀錄,每個紀錄裡面有一個資源分配紀錄器

統計就是拿來分析資源的,預計做成一整塊的綜合比較視覺介面

測驗可以用來修正統計結果

例如:每天記5個單字,但是卻會有忘記的情況。這時候就用測驗來計算到底有多少達成率

發展圖是用來規劃進度以及下一個目標的工具






2015年2月11日 星期三

Qt&c++學習資源

[1]大陸網站,各種講解  http://www.devbean.net/2012/08/qt-study-road-2-catelog/
[2]QT的推廣部(QT大使)  http://quitcoding.com/?page=home [3]亂找的c++網站http://www.tutorialspoint.com/cplusplus/cpp_variable_scope.htm

2015年2月9日 星期一

C與C++混合程式(如何交互CALL的方法)

#ifndef H_SOMECODE
#define H_SOMECODE

#ifdef __cplusplus
extern "C" {
#endif

void foo(void);

#ifdef __cplusplus
}
#endif

#endif /* H_SOMECODE */
 
 
[1] 用法
[2]深入講解Compiler做的事,還有更新和有趣的文章
 
[1] https://isocpp.org/wiki/faq/mixing-c-and-cpp
[2]http://mqjing.blogspot.tw/2008/10/c-c-c-function.html

2015年2月7日 星期六

c++學習指南

基礎篇

認識 C++ 語言
如何編譯與執行
基本內建型態與物件
指標與參考
變數命名規則
運算式與陳述
選擇
迴圈
函數
類別
物件導向與封裝
建構函數
設計專屬的標頭檔

軟體開發篇

Encrypt 類別
實作 set_code_array()
繼續測試
修正後的數學公式
編碼
解碼
型態轉換問題
前置處理
認識標準程式庫
認識第三方程式庫

GUI 篇

Qt Creator 使用簡介
專案的檔案組成
記憶體管理
設計介面
跳到信號槽
QString 的問題
整合 Encrypt
存檔與載入
完成版的 encrypt_gui
下一步

附錄

在 Qt Creator 中建立新專案
利用 Qt Designer 設計 GUI



http://pydoing.blogspot.tw/2014/06/cpp-guide.html

例外處理

http://pydoing.blogspot.tw/2013/02/cpp-try-throw-catch.html

關於RAII的探討(資源獲取與洩漏)

需要注意資源獲取(宣告)後是否在該區段內就free掉

    The RAII Idiom[1]

作者: gocpp (cpp) 看板: C_and_CPP
標題: [心得] The RAII Idiom
時間: Sun Aug 14 13:43:46 2005


RAII 是什麼,或許 C++ 用了很久的人也沒聽過。不過即使沒聽過,
在程式中也應該早已大量應用 RAII 的手法了。

常有人問 C++ 與 C 有何不同,這個問題。簡單地說,C 語言支援的
是單純的程序導向(procedural based) 編程,而 C++ 除此之外還
支援

1.object-based
2.object-oriented
3.generic

這三種編程的觀念。學習 C++ 的時候,不要只侷限在這個 keyword 是
什麼意思,那個標準容器怎麼用(當然,這些還是要懂的),種種微末
細節。更重要的是,必須了解 C++ 所支援與 C 不同的設計概念,在接
觸一個新的語言機制或用法時,最好先了解它之所以「存在的目的」,
為什麼要用到這些手法,和舊的方法相比,「有什麼好處」,又「有什
麼限制」…等等,才是提高整體編程水平的捷徑。

本篇的主題 RAII,其實就是 C++ 所支援,而是 C 所缺乏的第一個主要
的概念: object-based(以物件為基礎的)編程。當然,object based
的範疇遠比 RAII 大的多,RAII 只是其中一部份,但卻是非常重要的一
部份。

RAII 指的是「Resource Acquisition Is Initialisation」,直接的意
思是:「資源獲得即初始化」。意即:一旦在程式中有「資源配置」的
行為,也就是一旦有「配置、釋放」的動作,就讓「配置」成為一個初
始化的動作,如此,釋放動作就變成自動的了(依物件的 scope 決定)。

簡單地說,RAII 就是善用 C++ class 的解構式(destroctor),來達成
資源自動管理的目的。簡單應用如下:

void f() // 一、使用 auto_ptr 避免手動 delete
{
  // 假設由於某種原因,TMemoryStream 必須以 new 的方式建立
  std::auto_ptr<TMemoryStream> p(new TMemoryStream);
  ...
  if (...) { throw 1; }
  ...
} // OK, 沒問題,一旦碰到右大括號,即使發生異常,p 也會正確被釋放。


void g() // 二、使用 vector 取代手動配置 array
{
  int N;
  std::cin >> N;
  std::vector<int> v(N);
  ...
  if (...) { throw 1; }
  ...
} // OK, 沒問題,即使發生異常,也不必操心 v 內部的記憶體管理


std::string g2() // 三、以回傳物件的方式,取代回傳函式內部 new 的物件的指標
{
  std::string s;
  ...
  return s;
} // OK, 外部模組不必擔心忘記釋放記憶體的問題。


以上三個例子都很簡單,看起來沒什麼,但這就是 RAII 的基本精神,

再舉個多緒程式的例子,普通是像這樣寫:

void f() // 未考慮「異常安全」的版本
{
  ...
  ThreadLock(...);
  ... // 在此區域內,不允許兩個執行緒同時進入。
  ThreadUnlock(...);
  ...
};

以上的程式看起來沒問題,但要是在 Lock 和 Unlock 之間,程式發生
異常(而且被上層處理掉了),Unlock 就沒被執行到,就出大事了。因
此,最保險的方法是應用 RAII 的精神,把「鎖定」和「解除」的功能
封裝起來:

struct Lock
{
  Lock(...) { ThreadLock(...); }
 ~Lock() { ThreadUnlock(...); }
  ...
};

如此,以上的 f 函式就可以改寫如下:

void f2() // RAII 版本
{
  ...
  {
    Lock lock(...);
    ...
  } // OK, 不管是否發生異常,lock 物件一旦至此就會被解構。
  ...
}

著名的 Loki 函式庫[2][3]中的處理多緒程式的幾個 class,就是用這種
方式設計的。

有些 C++ 編譯器支援類似 Java 或 C# 的 try __finally 的功能,
就是為了解決在複雜程式迴路下,資源配置和釋放的問題。但其實
對 C++ 來說是不需要的,只要善用 RAII 就可以了。只要僅記「資
源配置即初始化」,這個基本原則,解構式就是最自然最方便的自
動化資源管理機制。



對於RAII的解說[4]

Reference:
[1]https://www.ptt.cc/man/C_and_CPP/D8D2/DA94/DDBB/M.1127480790.A.3B6.html
[2]http://darkranger.no-ip.org/content/loki-software-1998-2001
[3]http://blog.monkeypotion.net/gameprog/advanced/profiling-in-pooled-allocation-techniques
[4]http://www.cppblog.com/jinq0123/archive/2008/05/20/50522.aspx


2015年2月6日 星期五

關於資料庫(SQL)(mariaDB為MySQL被買走後的新替代品)

資料庫管理系統[1]:
    即MySQL等等的資料庫軟體,簡稱資料庫,常用的規範是


在程式中使用資料庫:
    需要使用ODBC(Open Database Connectivity)[2],是一個API



資料來源:
[1]http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F

[2]http://zh.wikipedia.org/wiki/ODBC