Tag

2017年7月3日 星期一

使用 git-svn 和 svn 遠端協同開發

最近因為跟人協作,共同開了一個版本控制資料夾。
對方使用的版本控制是 svn ,而我則是用 git,重新學 svn 實在太麻煩了,有沒有一個好的解決方案呢?經過強者我同學 AZ 大神跟 qcl 大神的推薦,決定使用 git-svn 來解決。

git-svn 是 git 提供的一個…橋接工具?可以在遠端保持 svn 的狀態,本地則用 git 的管理,享受 git 那些branch 開很大開不用錢,git stash之類,種種我們再熟悉不過的使用方式;另外用了 git 也不用每次都跟遠端目錄同步,可以在自己家裡亂搞,最後有網路時再一次同步。
畢竟在 git 出世前,svn 才是世界上版本控制的霸主,有不少早期知名的 project ,例如LLVM, apache software;用了 git svn ,不需重新熟習 svn 也能用 git 參與這些 project 的開發。

第一步,在拉下 svn repository 的時候,直接使用 git svn 的指令,所有跟 svn 相關的指令都是 git svn xxx:
git svn clone http://SERVER/svn/trunk/ TARGET_DIR
這樣就會把整個svn給抓下來,它同等於執行 git svn init 跟 git svn fetch。
要注意的是因為 git 設計的邏輯就是「所有的機器裡面都有完全一樣的內容」,所以 git svn clone 的時候,它會把遠端的內容逐個載下來,如果遠端 svn 很大的話,這個動作可能會花上非常久的時間。
抓下來的 repository會產生一個叫 git-svn 的 remote ,這個 remote 只有用 git svn 的時候會動到;要注意一點,因為 svn 只能維持一條線性的歷史,同時也沒辦法修改歷史,所以在使用 git-svn 的repository 裡面,不要和其他的 git 遠端同時使用,保持所有使用者都用一個 svn 遠端,git svn 設計上也假定你只有一個遠端。

再來我們就能做些修改,一樣就是git add, git commit,這時提交的內容只會在本地中,可以用:
git svn dcommit
把內容送到 svn 遠端去。
git 在推送到遠端 svn 的時候,會把一個一個 commit 取出,並提交到 svn,然後最重要的,它會依照svn 的提交結果,重新在 git repository 裡面 commit 這些結果,整個 dcommit 的結果,最終效果更像是 git rebase,這跟一般的 git push 完全不同。
commit aea3964417e62759dadf9e1769d927623e0f5a1b
Author: yodalee <garbage@mail.com>
Date:   Fri Jun 30 16:31:30 2017 +0800

    add debug message to every function call

commit 2531676d1d1b81f898e9965c0e46f28e92e02c82
Author: yoda <yoda@59464745-af19-4556-b8ec-ef3a2794439b>
Date:   Fri Jun 30 08:00:23 2017 +0000

    fix description in sensor function

    git-svn-id: http://SERVER/svn/trunk@2345 59464745-af19-4556-b8ec-ef3a2794439b
上面的 git log ,包含一個已經推到遠端的 commit 跟一個還未推送的 commit,推送到 svn 上的 commit 會出現 git-svn-id 的遠端資訊,同時它的作者資訊跟雜湊值也會變化,這也是為何不建議同一個 repository 中同時使用 git跟svn的遠端,git-svn 修改雜湊值會讓 git 遠端天下大亂。
就算要有 SVN 跟 git 兩個遠端也要先向svn dcommit ,得到最終雜湊值後,再推送到 git 遠端上。

svn 身為版本控制,也是允許其他人共同協作,只要有協作就會有衝突要解決,如果發生衝突,svn dcommit 會無法推送到遠端。
為了解決該問題,可以執行 git svn rebase ,它和 git pull 很像,首先它會用 git svn fetch ,把 svn 遠端上的內容拉下來,沿著 git-svn 往前長,之後再用 git rebase ,把現在 git HEAD 指向的目標,rebase 到 git-svn 上。
如果沒有更新的內容,在 git svn rebase 時會看到:
Current branch master is up to date.
此時就能放心進行 git svn dcommit

這裡會牽涉到一些 git 跟 svn 設計不同的地方,在 git 裡面,假設 remote/master 跟本地的 master 有所不同,在 push master 的時候即會發生衝突,git 會要求你解決衝突後才能 push。
svn 在這點上,只有檔案有所衝突的時候才會要求,所以當遠端修改 A 檔案,本地修改 B 檔案,在 dcommit 的時候是完全沒有問題--只是遠端專案會進到一個 A, B 檔案都修改過,而本地檔案卻沒看到 A 檔被修改的狀態。
直接引用 git 文件的話:「如果做出的修改無法相容但沒有產生衝突,則可能造成一些很難確診的難題。」所以,誠心建議還是在 dcommit 前都 svn rebase 一下,確保跟遠端保持隨時同步。

其實有了 dcommit 跟 rebase,大概也就差不多了,有關 svn branch 的部分我就不太想看了,畢竟 git branch 比較強大;唯一要注意的,大概就是要送到 svn 伺服器之前,儘量用 rebase ,把 git 的各 branch 收整成一條線性,再進行 dcommit 。另外有個小技巧是,git svn dcommit/rebase 在操作的時候不允許任何 uncommit 的內容,所以在 svn 操作的前後,可以利用 git stash push/pop ,把未commit 的內容塞進stash,svn 操作結束後再取出來。

參考資料:
Git 與 Subversion

2017年6月17日 星期六

Nand2Tetris 投影片與講解影片

故事是這樣子的,5 月的時候我把 Nand2Tetris 這門課給修完了。

剛好,我們同好們辦的 Code& Beer 需要題目,想說都修過了就來講(ㄔㄨㄢˊ)解(ㄐㄧㄠˋ)個 Nand2Tetris 吧,花了點時間整理了投影片,也要感謝在Yahoo 台灣大殺四方驚動萬教每月豪領100K的人生溫拿勝利組強者我同學 qcl 大神,幫我準備場地跟辦活動:

投影片slide share 連結:
https://www.slideshare.net/youtang5/introduction-to-nand2-tetris

錄影使用的是 Facebook 直播,為了把影片載下來花了點功夫,後來找到答案如下:
播放影片之後,按右鍵有一個「顯示影片網址」,將網址的 www 改成 m ,使用 mobile 模式看影片,這時就可以直接右鍵另存影片了:
http://www.green-umbrella.biz/2016/03/how-to-download-facebook-live-stream-videos-into-mp4-files/

當日後面接著 typescript 的活動,這是用 ffmpeg 剪輯過才上傳 Youtube 的:

講了一個半小時,很多地方還是講不清楚,畢竟本來的課程是兩門 coursera,各 6 週,每週的影片時間都是 2 小時以上,這已經是超濃縮版本了,如果大家有興趣還是可以自己修修看,會學到東西的。
不過我想投影片跟錄影完,也算是個總結,我跟 Nand2Tetris 的故事就到這裡了吧,畢竟這也是基礎課程,熟悉了就要往其他更困難的地方前進了。

2017年6月14日 星期三

國學常識大補帖

故事是這樣子的,大概在去年9月的時候,有一位非常喜歡批評人的教授批評大家都沒國際觀,還弄了一個<國際觀檢測網>,那時我把它們的題目都抓下來,寫了個國際觀大補帖,文章在此:
http://yodalee.blogspot.tw/2016/09/global.html

最近同一位非常喜歡生氣又總是對著那些沒有錯的人生氣的教授又生氣了,稍微瀏覽的一下相關的頁面之後,竟然發現除了<國際觀檢測網>之外,還有另外一個<國學常識檢測網>,網址在此:
http://doc.boyo.org.tw/sinology/

同樣進去有十題,看了看題目覺得哇塞這真是太狂阿!有文學有歷史有地理,把這些全部都學起來,競爭力肯定更加8.7 dB,這麼珍貴的題目不出個大補帖全部背下來怎麼可以!台灣年輕人都不學國學是國家重大危機呀!(雖然題目從簡答題變成2選1選擇題,難度大幅下降OAO)
受到傳說中在金門島上大殺四方的鍾誠教授的感召,我決定也來堅守<一個python政策>,也就是「世界上只有一個Python,Python 2 是Python 3 傳統不可分割的分枝,Python 3是目前 Python 唯一正統實作」。什麼你說 Python 3 比Python 2 晚發佈?哎呀晚成立都取代早成立的,這種事很正常啦。

從 python 2 轉換到 python 3不算太難,之前轉換時有個很大的障礙是,處理 html 的套件 lxml 還沒搬到 python 3上,這次發現 lxml 也轉換完成,剩下一些要調的就是 urllib,把 request 獨立就行了,同樣的 code 在 python 3 的實作大概像這樣:
import urllib.request

req = urllib.request.Request(TARGET)
req.add_header("Pragma", "no-cache")
response = urllib.request.build_opener().open(req)

另外就是一些 dict 介面上的變化,還有因為選擇題的關係,在取出的 tag 裡面還有 tag ,因此把 text 換成 text_content,小修一下就能動了。
同樣是開起來一直跑一直跑,出來的檔案有 1200 多行,560 題

原始碼:https://github.com/yodalee/globalizaion
大補帖:https://github.com/yodalee/globalizaion/blob/master/sinology

同樣的,我是不樂見有人真的把這個拿來背啦(同樣…應該不會有人這麼蠢吧…應該啦……)

發佈了這本國學常識大補帖之後,跟國際觀大補帖一樣,我同樣收到來自四面八方熱切的使用心得,以下僅節錄幾則:
* 去年學校的畢業典禮,禮堂不知道為什麼很熱,其他同學都忍不住出去乘涼,幸好我手邊有國學常識大補帖可以當扇子,於是只有我一個人聽到台上的演講,我現在覺得我超厲害足以打爆那些沒聽到的同學。
* 之前我的電腦中了 Wannacry,所有檔案都被加密,只有電腦裡的國學常識大補帖無法被加密,還自動幫我破解了RSA-2048,回復所有的檔案呢
* 自從讀了國學常識大補帖,我現在看到AES 256加密的一條明文跟一條密文,手指滑過就能直接把它的 key 寫出來,手指識字不算什麼什麼,靠著國學常識大補帖,我還練成了「手指識key」
* 之前我超級不喜歡吃香菜,自從讀了國學常識大補帖,就算是香菜蛋糕也能輕鬆下嚥,每位不喜歡吃香菜的人都該讀這本。
* 本來我迷上了<動物朋友>無法自拔,後來經過朋友轉介得知了國學常識大補帖,發現國學遠比動畫博大精深,終於戒了毒癮,たーのしー

算了我不嘴砲了,該工作了

2017年6月12日 星期一

Minecraft 計時器教學影片

最近突然想來錄影一下,很久之前蓋好的 Minecraft 時鐘的解說,來講解裡面核心元件計時器的設計。
那時是第一次在這裡發 minecraft 文:使用差動雙投擲計時器應用於時鐘製作之研製

首先在錄影程式上就遇到問題了,本來我用的是 Google Hangout 來錄影,錄了兩部 word 的教學影片;但在 Minecraft 或遊戲這樣高 frame rate 的應用上就不行了,lag 到天荒地老QQ,試了另外兩款 Kazam 跟 gtk-recordmydesktop ,同樣都無法解決錄影 lag 的問題。
最後選用的錄影程式是 obs-studio,最大的賣點是開源,無論 windows 或 Linux 下都能流暢使用,我是使用 Archlinux 包好的package obs-studio,當然要的話也可以從 source 自己編:
https://github.com/jp9000/obs-studio

另外不知道是不是 Minecraft 的問題,在Windows 下用”錄影視窗”錄 minecraft 的內容,都會錄不到影像,一定要用全螢幕去錄;Linux 上就沒這個問題。

成品如下:中、英文各錄一版,不過我好奇沒有宣傳的話,真的有人會看英文版嗎OwO

中文版解說:


英文版解說:

2017年5月27日 星期六

使用 doxygen 產生程式文件

這應該是個過時的題目,相關的文件已經滿天飛了,不過最近程式寫得肥了,又是和其他人的合作項目,總不能老是這樣打開 Office Word 寫文件(掩面),然後程式跟文件老是不同步,還是把註解改好用 doxygen 產生文件省事些,順帶得就寫個文章記錄一下。
doxygen 是一套文件產生程式,會自動 parse 原始碼、標頭檔等,搭配設定的模版,自動產生不同種類的文件,如 manpage, html , latex…。
要用 doxygen 第一步是先安裝 doxygen,這在 unix 下配上套件管理員應該跟喝水一樣簡單,略過不提。

doxygen -g <config-file>
產生設定檔,預設的名字會是 Doxyfile

下一步要編輯設定檔,我比較過預設設定,大概要改下面這些地方:

  • PROJECT_NAME:當然要改成自己的名字
  • OUTPUT_DIRECTORY:我設定在 doc 資料夾,並且把 doc 資料夾加到 .git 中
  • OUTPUT_LANGUAGE:設定語言
  • EXTRACT_ALL:設成 YES,這樣才會解析所有的檔案,否則必須要用 \file 或 @file 定義過的檔案才會被解析,否則它只會解析 .h 檔
  • INPUT:用空白分隔的輸入檔案或資料夾,我是 src 資料夾
  • FILE_PATTERNS:設定要分析的檔案,這裡我只保留 .c 跟 .h
  • EXCLUDE:把不需要的資料夾剔掉,因為我有一個測試的 test 資料夾,所以把它加上去
  • GENERATE_*:設定要輸出的格式,我只選擇輸出 html ,設定 GENERATE_HTML 是 YES

為了在程式中加上更多資訊,可以在程式碼裡面為函式寫註解,我是使用下列的型式:
/*!
 *
 */
另外搭配以下幾個註解命令:
\brief 可以提供一行描述,簡短敘述這個函式的功能
\see 關鍵字,可以產生連結跳轉去其他的內容
\param 參數描述,有符合原始碼內的參數名稱,在排版上會自動上色並縮排
\return 對回傳值的描述
在 \brief 之後空一行,其它的內容則會歸為長敘述中,如果沒空行的話這些內容都會被濃縮成一行歸在 brief 裡面,所以,一個完整的函式註解如下:
/*!
 *
 * \brief dest = src xor dest
 *
 * do xor on src buffer and dest buffer, store result in dest buffer
 * \param src, dest buffer to xor
 * \param len buffer size both buffer should have enough space for len
 * \return none
 *
 */
int32_t xor2(
  uint8_t *src,
  uint8_t *dest,
  uint32_t len)

接著就可以下
doxygen config_file
產生文件,文件會在 doc/html 中
話說新一代的程式語言好像都自帶文件產生器,如 golang 的 godoc,rust 也有 rustdoc,也許 doxygen 這樣的東西,未來也用不太到了?

Doxygen Manual:
http://www.stack.nl/~dimitri/doxygen/manual/index.html
Related Posts Plugin for WordPress, Blogger...