讓 C++ 程式碼說話:有些事,讓編譯器替你把關

前言

通常來說,撰寫程式碼往往不會是自己一個人的事情,你需要和別人合作。你會用到別人的程式碼,而別人也會使用到你的程式碼,這個時候如何讓 資訊 被正確傳遞就顯得相當重要了。

我應該繼承 XXX 類別來特殊化他嗎?
我能夠複寫 OOO 類別內的方法嗎?
這個函式會丟出例外嗎?
...

理論上,這些東西都能藉由 文件 來傳遞,但現實是,沒有體制,沒有自制力的情況下,文件要不壓根不存在,要不就是過期,不齊全,更枉論... 呃... 實驗室的專案。

在 C++ 中,除了用文字形式的文件來記錄這些事項外,其實語言本身也提供了些關鍵字讓開發者將這些事情 寫到 程式碼內,某些關鍵字也能在編譯時替你把關,阻擋那些不正確的使用。

Read on →

C++ 11 perfect forwarding 到底是在 forward 什麼?

前言

Perfect forwarding 是 C++ 11 出現後,頗常出現的一個字彙,但是說到底,perfect
forwarding 到底是在 forward 什麼?

Read on →

使用 C/C++ macro 達成遞迴效果

前言

最近因爲再專案內導入了 json,自然而然地也出現了非常常見的問題:從 json 內提取一推內容。 如果說只拿一個東西出來,這真的不成什麼問題,難處就在於常常一次就要拉四五個變數出來,同時還要應付物件不存在或是型別不對的例外處理,事情就變得有趣起來了。

Read on →

Task warrior,記錄 todo 的好幫手

前言

從之前實習到現在的菸酒生生活,每每在寫程式我都遇上了這樣的困擾:每次說要改的程式碼到最後都忘記改。

說真的,有多少人能記下這麼多東西,此時此刻,人類偉大的價值便體現了出來,人類是會使用工具的生物啊!

Read on →

我爲什麼 Rust ?

Rust icon

Read on →

ドドド 如何 JOJO 風,電腦待機畫面 ゴゴゴ

to be continued

今晚要來點廢文嗎?

Read on →

簡言之,研究所考試,效果不賴

結果是中了中壢的那間國立大學。

這樣的結果我有兩種可能的解釋,我是天才,或是這一切考試實在太荒謬。

我不覺得我是天才啦。

Read on →

writeup - pwnable.kr - cmd2

link

Read on →

writeup - pwnable.kr - dragon

link

Read on →

writeup - pwnable.kr - echo1

link: http://pwnable.kr/play.php

Read on →

筆電推薦:Dell XPS 13 (2015 年初版)

結論:XPS 13 讚透了

Read on →

別用 git pull,之類的

實習這半年遇到一個過去少見的問題,那就是 source code upstream 可能有三個以上。簡單算算,我的一個,mentor 一個,原作者一個。這時候 git pull 就顯得相當不方便,通常我只是需要更新或是查看上游的新進度,而不希望做 branch 的移動。

這樣的使用情境下,git remote update 或是 git fetch 就顯得合理多了。不論是單純需要更新還是有 rebase 的需求,操作彈性都顯得比 git pull 高。

題外話

最近也在思考 local repo 的 branch name 該不該和 upstream 同名的問題。一個困擾就是 upstream 可能有三個以上,這時候這樣的 branch 名稱 (即使是 master) 其表現出來的意義相當渾濁。是哪個 upstream 的 master 呢?還是說是 local new feature 所在的 branch?

目前我參與 aseprite 的做法是這樣,需要開發某個功能或是修理問題時,先 checkout 到官方的 master,然後依照功能或是 bug 敘述新增一個分支。這樣不論在管理分支還是最後發 PR 邏輯上都比較清楚合理。

就現有需求來說,其實只要能維持清晰乾淨的樹,我想都是好的使用方法。

Emacs 一週體驗

This is emacs!

Emacs 真的不錯用!
Emacs 根本就是聖人嘛!

Read on →

YCM-Generator, YouCompleteYouCompleteMe

對於一個以 Vim 作爲主要編輯工具的人,一定聽過 YouCompleteMe (以下簡稱 YCM) 這個 Vim 插件,說它是 Vim 語法補齊的最終形態也不爲過。但是這其中有一個致命的問題:

YCM 的 flag 要自己寫!!

YCM 確實很強,甚至連前處理都能夠判斷,但是要自己填入 flag 這件事就不是那麼容易了。於是,YCM-Generator 誕生了!

Read on →

校外選課,開闊眼界

歡迎,這是我延畢後的第一個學期!
大學三學分我雖沒修好,但依舊精彩,我退掉廢課跟愚蠢的通識課程,混入別人系所修課,認識知己,經營發展自由軟體理念的社團,然後認識更多人,彼此互相交流討論。爲了等同等學力報考研究所,我成了大五生,加上實習時認識的好友推薦,於是這學期就來玩 “校外選課”。

接着我來介紹申請程序,以及我推薦大學生要選選看的原因。

Read on →

Mecurial patch queue 亂糟糟怎麼辦

最近實習用到的 vcs 是 Mecurial,個人算是有些微程度的瞭解,也知道 mecurial patch queue (mq) 怎麼操作。但是,習慣在 Git 的工作流程,再回到 mq 的結果就是 patch 一團亂。

我先承認, Mecurial 我真的還理解地不夠透徹,才會導致這一連串狀況。

Read on →

Write test cases for abstract factory using C++

前言

由於 C++ 語言特性,要作出抽象工廠的其一手段就是創建衍生類別的實體後,將其位址轉型爲共同界面的指標再回傳給呼叫者。這在使用上相當直覺,在測試時則需要使用一些小手段來驗證抽象工廠回傳的實體是否是客戶端所要求的。

Read on →

在 Git 中做到 Mercurial queue 的行爲

queue
Credit: Vegpuff/Wikipedia cc

前言

接觸 Mozilla 的專案一陣子,自然也學了 Mercurial,一套分散式的版本控制系統。由於設計哲學的不同,Mercurial 擁有許多額外的官方插件可以使用,其中 Mercurial Queue 是這篇的主題,就來談談在 Git 中如何做到類似的行爲。

Mercurial Queue

操作細節不多談。概論來說,你必須先建立一個裝 patch 的 queue,然後找一個 commit 在上面新增一個空白的 patch,接着開始對 Mercuail 管理的程式碼開始做修改,修改就會進到 queue 最上方的 patch。queue 裏面裝的 patch 其實就是你修改後的 diff 檔案,一個 patch 就是一份 diff,位於 queue 最下面的 patch 會先被套用 (FIFO),你可以在 .hg/YOUR_PATCH_Q_NAME/YOUR_PATCH_NAME 找到他們。這樣的好處 (我認爲的) 就是,即使在你修改的同時這個專案進行了更新,開發者可以直接把 queue 裏面的 patch 全部先卸下,移動到最新的 commit 後再套用上去。

Git

Git 要做到類似的事情我有兩個想法:

  • git rebase (但是不可逆,精確的說是很麻煩)
  • git diff (比較彈性)

先假設我們有下面的樹

  G-dev
  |
  F
  |
  E
  |
A-B-C-D-master

現在我們要做的,是將 dev 分支中所做的改變應用到 master 分支上 (可能是爲了測試,可能是爲何合併)。

git rebase

$ git checkout dev
$ git rebase master #May need to fix conflict

這個做法很直覺,但是很難撤銷。雖然做到 mq 套用功能,卻沒辦法把 patch 套用到其他 commit 上。

git diff

$ git checkout master
$ git diff ...dev > patch_name
$ git apply patch_name #Apply won't store change into staged

$ git add -u
$ git commit

白話來說,就是先找出你想要套用的 commit 和 dev 分支的共同祖先,接着 diff dev 和該祖先得到 dev 分支所做的修改並導入 patch 檔案,再套用到你選擇的 commit 上。這裏產生出來的 patch 本質上就是 mq 裏面的 patch,只差在 mq 裏面多了一些資訊 (commit 本文等),以及這個方法產生的 patch 是一坨而非像 mq 有多個 patch 疊在一起。要取出更細的 patch 就自行 git diff ...dev~

結語

不是做不到,而是很難做。

使用 Git 分支來模擬 mq 的麻煩就在於儲存的內容不同,Git 存的是快照,mq 存的是 diff,雖然互相模擬是可行的,但是既然開發者選了某一個工具來用,就依照該工具的哲學來使用/管理自己的專案吧!

話說,好像真的有工具可以讓 Git 擁有 mq 的功能,我猜本質上就是把上面的東西包裝成易用的界面,或許。

補充 2015/04/28

git format-patch 可以作出 per commit 的 patches。

為什麼我開始寫測試?因為我被雷到了!

Google test
cc by-sa 4.0

前言

說個故事吧...
我以前也像別人一樣是個驍勇善戰不寫測試的開發者,直到我的膝蓋被 bug 射了一箭

Read on →

Git pull with rebase: 維持樹的整潔

git rebase 示意圖
photo credit: Git-Branching-Rebasing cc

git pull --rebase,解決多人專案的無謂 merging 和醜惡的樹

Read on →
git