Biomolecular simulation:
https://msl.kmu.edu.tw/index.php
H++
http://biophysics.cs.vt.edu/index.php
Charmm-Gui
http://www.charmm-gui.org/
2017年12月4日 星期一
2017年11月21日 星期二
2017年11月4日 星期六
2017年11月2日 星期四
20171102 資結程設
hw3
DBTable::sort(constant struct)
::sort()(_table.begin(), _table.end(),s);function object
DBSort::operator() (const DBRow& r1, const DBRow& r2)
for (n=0; n=_sortOder.size(); n++) {
size_t c = _sortOder[I]
......
}
struct DBSort
{
}
2017年10月31日 星期二
20171031 GPU
1. Atomics
處理變數在每個thread進行read-modify-write的操作時會有dependency,例如x++。
利用shared memory處理atomicAdd可以減少對global memory重複讀取,增加效能。
2. Stream
cudaHostAlloc()和malloc()不一樣在於malloc()是page host memory,而cudaHostAlloc()是 page-locked (有時稱之為pinned memory)。在run time時,page-locked會讓buffer不會被swapped out到硬碟,會加速記憶體的讀取。最重要是如果今天有兩個stream。假設今天stream0進行kernel運算時,stream1利用cudaHostAlloc()可以讀取非現在kernel運算的陣列不會影響kernel的運算,否則用malloc()可能在kernel會無法使用原本的陣列來運算。
處理變數在每個thread進行read-modify-write的操作時會有dependency,例如x++。
利用shared memory處理atomicAdd可以減少對global memory重複讀取,增加效能。
2. Stream
cudaHostAlloc()和malloc()不一樣在於malloc()是page host memory,而cudaHostAlloc()是 page-locked (有時稱之為pinned memory)。在run time時,page-locked會讓buffer不會被swapped out到硬碟,會加速記憶體的讀取。最重要是如果今天有兩個stream。假設今天stream0進行kernel運算時,stream1利用cudaHostAlloc()可以讀取非現在kernel運算的陣列不會影響kernel的運算,否則用malloc()可能在kernel會無法使用原本的陣列來運算。
這種方式會造成copy engine跟kernel engine會有較大空閒時間。
這種方式雖然也會造成copy engine跟kernel engine有空閒時間,但kernel engine比上一種快一格進行,而且stream0和stream1的kernel之間也縮短兩格。
這種方式是最佳的。
所以結論是利用breath-first或round-robin的assignment工作方式到stream是最好的。
2017年10月29日 星期日
20171019
static在C++的種類有五種使用方式
1. Static variable in a file
2. Static variable in a function
3. Static function
4. Static data member of a class 5. Static member function of a class
static在三種scope下有不同功能
1. global
global variable宣告static會讓global scope變file scope,意思是說當兩份cpp檔如果都有相同變數名稱時,他們各自屬於他們file內的變數,彼此之間沒有關係。
2. function
在function裡,local variable宣告static時,不會因為function被回收讓變數也被回收。
3. class
static data member
(i)不管產生多少個相同class的物件,static的members只會複製一份,而且共享給每一個物件。
(ii)不必在class scope內初始化。利用::在class外部初始化,如果沒有,系統會自動初始化為0。
static member function
只能用::access,即使沒有產生物件。
只能access “static” data member,enum, or nested types。
不能access到this pointer
2017年10月26日 星期四
20171026 資結程設
begin是管理記憶體空間的開頭
end是管理記憶體空間的尾
new size_t的倍數
假設A是200 bits
P1=new A
P2=new A[5]
P3=new A[5]
delete []P2
MemMgr的_activeBlock
new一個P2假設產生208 bits
_ptr指向8個bits前面
P2指向200前面
recycle list(RL)
recycle會先找記憶體容量相同的
first要先用型態A的pointer P2強迫轉型成size_t 把前面8 bits減掉還要把值設成0
所以設(size_t *) A * P2 = 0
http://magicjackting.pixnet.net/blog/post/62423121
http://www.cplusplus.com/doc/oldtutorial/typecasting/
http://magicjackting.pixnet.net/blog/post/62423121
http://www.cplusplus.com/doc/oldtutorial/typecasting/
first指向8個bits後面的位置
delete []P2
delete []P3
前面8 bits用P2指
first=P3指向下一個後面要刪除的200 bits
假設delete []P5 (261 bits)
空間只有255 >end
再要一個_activeBlock
vector<MemTestObj*> _objList;
vector<MemTestObj*> _arrList;deleteObj
delete _objList[ix];
...
假設38 bits會把size變40 (8的倍數)
2017年10月25日 星期三
20171025 計結
EDA playground
https://www.edaplayground.com/
t_Full_Adder.v (testbench)放左邊
Full_Adder.v (module)放右邊
檔案用貼上別upload
Tools & Simulators
選Icarus Verilog
Full_Adder FA_1(.a(a), .b(b), .ci(ci), .sum(sum), .cout(cout));
input reg
output wire
$dumpfile("Full_Adder.vcd");
$dumpvars;
輸出file可以看waveform
initial #1000 $stop;
經過一千個單位時間會停下來
verilog-ex
// Code your design here
timescale 1 ns/ 1 ns
module alu (src_a, src_b, c, data_out);
input [7:0] src_a, src_b;
input [2:0] c;
output [7:0] data_out;
/* implement here */
reg [32:0] temp;
assign data_out = temp[32];
initial begin
if(c == 1) begin
temp = src_a + src_b;
end
else if(c == 2) begin
temp = src_a - src_b;
end
else if(c == 3) begin
temp = src_a & src_b;
end
else if(c == 4) begin
temp = src_a | src_b;
end
else if(c == 5) begin
temp = src_a ^ src_b;
end
end
endmodule
https://www.edaplayground.com/
t_Full_Adder.v (testbench)放左邊
Full_Adder.v (module)放右邊
檔案用貼上別upload
Tools & Simulators
選Icarus Verilog
Full_Adder FA_1(.a(a), .b(b), .ci(ci), .sum(sum), .cout(cout));
input reg
output wire
$dumpfile("Full_Adder.vcd");
$dumpvars;
輸出file可以看waveform
initial #1000 $stop;
經過一千個單位時間會停下來
verilog-ex
// Code your design here
timescale 1 ns/ 1 ns
module alu (src_a, src_b, c, data_out);
input [7:0] src_a, src_b;
input [2:0] c;
output [7:0] data_out;
/* implement here */
reg [32:0] temp;
assign data_out = temp[32];
initial begin
if(c == 1) begin
temp = src_a + src_b;
end
else if(c == 2) begin
temp = src_a - src_b;
end
else if(c == 3) begin
temp = src_a & src_b;
end
else if(c == 4) begin
temp = src_a | src_b;
end
else if(c == 5) begin
temp = src_a ^ src_b;
end
end
endmodule
資結程設hw2
1. using C++ implements the terminal state without echo input, like login when asking for the password
參考資料
https://www.svbug.com/documentation/comp.unix.programmer-FAQ/faq_4.html
1. CmdParser cmd
初始化_readBufPtr(_readBuf), _readBufEnd(_readBuf),_historyIdx(0), _tempCmdStored(false)
2. cmd.readCmd()
呼叫另一個成員函式readCmdInt(cin) {
(1) 呼叫另一個成員函式resetBufAndPrintPrompt() {
初始化_readBufPtr = _readBufEnd = _readBuf;*_readBufPtr = 0;
呼叫另一個成員函式printPrompt()印出cmd> (初始化和cout可以寫在.h)
}
(2) while (1) {
(a) ParseChar pch = getChar(istr)
(i) getChar(istream& istr)是一個global function回傳型態是enum
(ii) 呼叫mygetc(istr)是一個global function回傳型態是ch
() char mygetc(istream& istr)
(ii) enum回傳LINE_BEGIN_KEY等字串
(b) pch == INPUT_END_KEY 離開
(c) switch (pch)
}
}
參考資料
https://www.svbug.com/documentation/comp.unix.programmer-FAQ/faq_4.html
1. CmdParser cmd
初始化_readBufPtr(_readBuf), _readBufEnd(_readBuf),_historyIdx(0), _tempCmdStored(false)
2. cmd.readCmd()
呼叫另一個成員函式readCmdInt(cin) {
(1) 呼叫另一個成員函式resetBufAndPrintPrompt() {
初始化_readBufPtr = _readBufEnd = _readBuf;*_readBufPtr = 0;
呼叫另一個成員函式printPrompt()印出cmd> (初始化和cout可以寫在.h)
}
(2) while (1) {
(a) ParseChar pch = getChar(istr)
(i) getChar(istream& istr)是一個global function回傳型態是enum
(ii) 呼叫mygetc(istr)是一個global function回傳型態是ch
() char mygetc(istream& istr)
(ii) enum回傳LINE_BEGIN_KEY等字串
(b) pch == INPUT_END_KEY 離開
(c) switch (pch)
}
}
20171024 GPU
1. Texture memory
texture memory被cash on chip,比off-chip DRAM更可以減少使用記憶體需求,提供更有效bandwidth。在二維晶格,因為CPU處理周遭晶格時在記憶體無法連續情況下無法被cash together。因此,texture memory非常適合處理"between a cell and neighbors"這種需要讀取周圍記憶體位置的情況,也比前一張使用shared memory的方式來的好。
以課本例子因為有固定熱流點dev_constSrc,所以在anim_gpu function裡先把常數的部分先copy_const_kernel寫進dev_insrc,然後再呼叫blend_kernel把dev_inSrc覆寫後算出dev_outSrc。利用一維texture<float>或二維texture<float,2>的不同處理方式下,差別在二維會自動處理邊界問題,但兩者效能其實是差不多的。
2. Graphics interoperability
和之前章節差別在這邊使用多張顯卡讓CUDA結合OpenGL和GLUT calls,不必像前幾章利用CPU執行CPUBitmap,減少使用CPU系統。特別的是,把圖片長寬跟datablock寫到GPUAnimBitmap function引數,會透過initialize讓cudaCHooseDevice自動搜尋適合這張圖的顯卡。
texture memory被cash on chip,比off-chip DRAM更可以減少使用記憶體需求,提供更有效bandwidth。在二維晶格,因為CPU處理周遭晶格時在記憶體無法連續情況下無法被cash together。因此,texture memory非常適合處理"between a cell and neighbors"這種需要讀取周圍記憶體位置的情況,也比前一張使用shared memory的方式來的好。
2. Graphics interoperability
和之前章節差別在這邊使用多張顯卡讓CUDA結合OpenGL和GLUT calls,不必像前幾章利用CPU執行CPUBitmap,減少使用CPU系統。特別的是,把圖片長寬跟datablock寫到GPUAnimBitmap function引數,會透過initialize讓cudaCHooseDevice自動搜尋適合這張圖的顯卡。
2017年10月18日 星期三
20171002 GPU
查GPU型號
http://www.zpool.ca/bench?algo=groest&chip=1
non-stream: cudaMalloc();
stream : cudaMalloc(); -> cudaMemcpyAsync
http://www.zpool.ca/bench?algo=groest&chip=1
non-stream: cudaMalloc();
stream : cudaMalloc(); -> cudaMemcpyAsync
2017年10月12日 星期四
2017年10月10日 星期二
前置處理器 指示詞
Preprocessor directives
前置處理器 指示詞(Preprocessor directives)用#(hash sign)來表示。在編譯開始前,前置處理器會先檢視指示詞。因為前置處理器 指示詞沒有用;(semicolon)做結尾,所以前置處理器只能解析一行code為基準,若超過一行要在末行加上\(backslash)。
macro definitions (#define, #undef)
#define identifier replacement
當前置處理器看到這個指示詞,會將code裡任一個identifier用replacement取代,可以是expression, statement,block或者simply anything。
ex
function macro definitions兩種特別運算元#和##在replacement。#後面的參數名字會被字串字母的引數取代 (就像是被雙引號框住)。
前置處理器 指示詞(Preprocessor directives)用#(hash sign)來表示。在編譯開始前,前置處理器會先檢視指示詞。因為前置處理器 指示詞沒有用;(semicolon)做結尾,所以前置處理器只能解析一行code為基準,若超過一行要在末行加上\(backslash)。
macro definitions (#define, #undef)
#define identifier replacement
當前置處理器看到這個指示詞,會將code裡任一個identifier用replacement取代,可以是expression, statement,block或者simply anything。
ex
|
|
|
|
1
2
3
4
5
#define TABLE_SIZE 100
int table1[TABLE_SIZE];
#undef TABLE_SIZE
#define TABLE_SIZE 200
int table2[TABLE_SIZE];
function macro definitions兩種特別運算元#和##在replacement。#後面的參數名字會被字串字母的引數取代 (就像是被雙引號框住)。
|
|
##連接兩個引數使他們之間沒有空白
|
|
參考文獻
2017年10月9日 星期一
linux centos終端機顏色
修改ls顯示資料夾名稱顏色
cp /etc/DIR_COLORS ~/.dir_colors
vim ~/.dir_colors
第59行:DIR 01;34(01:粗體,34:藍色)
修改為:DIR 01;33(01:粗體,33:黃色)
cp /etc/DIR_COLORS ~/.dir_colors
vim ~/.dir_colors
第59行:DIR 01;34(01:粗體,34:藍色)
修改為:DIR 01;33(01:粗體,33:黃色)
參考資料
改txt亮顯、行號
vi ~/.vimrc
hi Comment ctermfg =blue
set nu
2017年10月6日 星期五
20171005資結程設
map是一種associated container。insert pair(key跟value)後可以利用find輸入key搜尋到相對應value。搜尋法為紅黑樹概念,complexity為log(n)。此外,也可以將key和value進行刪除或清空。
因為map的key不能重複,所以可以使用multimap來允許duplicate key的操作。
參考連結:
http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html
strtok()是將一連串string藉由設定delimiters來分割出個別字串
使用方法:
前置處理器指示詞(Preprocessor Directive)
因為map的key不能重複,所以可以使用multimap來允許duplicate key的操作。
參考連結:
http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html
strtok()是將一連串string藉由設定delimiters來分割出個別字串
example
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
使用方法:
在程式裡面會有兩次function call。第一次function call引數(argument)為string,為了擷取這些string,每個string的第一個character(不包含delimiter)被用來當作scan的起始位置。當scan到delimiter時,會分割string而且包含delimiter,然後scan到null character終結function。因為第一個function call有static pointer指向string,所以第二個function call當string被scan到delimiter時,會回傳NULL pointer。
前置處理器運算子(Preprocessor)
運算子 | 動作 |
---|---|
字串化運算子 (#) | 以雙引號將實際對應的引數括住 |
字元化運算子 (#@) | 以單引號造成對應的引數會將和視為字元 (Microsoft 專用) |
語彙基元帶入的運算子 (##) | 允許做為實際引數的語彙基元會串連形成其他語彙基元 |
DEFINED 運算子 | 簡化的語式是否正確文字在某些巨集的指示詞 |
2017年9月29日 星期五
MAC OSX vim設定
Mac OSX 的vimrc存放位置在
/usr/local/share/vim/.vimrc
/usr/local/share/vim/.vimrc
為全域設定 會影響每個使用者
但是我們無法直接在裡面進行設定
因此直接cd到家目錄創一個.vimrc
local設定只會影響目前的使用者
$ cd
$ vi .vimrc
以下是設定參數
1. set ruler
會顯示行列數
2. set hls
set nohls
set nohls
搜尋時會高涼反白/取消高亮反白
3. set incsearch
搜尋為完畢前就會開始搜尋
4. syntax on
開啟突顯
5. set tabstop=4
按tab會跳四個字元
6. set showmatch
括號配對
7. set nocompatible
vi不會影響vim功能
vi不會影響vim功能
8. set shiftwidth=4
自動縮進字元數 (先用V選取要縮進的行然後再按=)
自動縮進字元數 (先用V選取要縮進的行然後再按=)
9. set backspace=2
按BACKSPACE會縮進任何東西包含在行首時會刪除前一行行末
10. set number
左邊顯示行數
2017年9月25日 星期一
VS Code Mac設定
1. 開啟資料夾
2. 檢視 -> 擴充功能 -> C/C++
3. command+shift+P -> C/Cpp: Edit Configuration (標頭檔路徑產生在c_cpp_properties.json)
4. command+shift+P -> Tasks: Configure Task Runner -> Others (選編譯器跟寫編譯script)
4. command+shift+B (compile產生a.out)
5. command+shift+P -> Debug Open launch.json -> C++ (GDB/LLDB)
6. "program": "enter program name, for example ${workspaceRoot}/a.out",
修改成"program": "${workspaceRoot}/a.out",
7. Debug
參考資料:
https://code.visualstudio.com/docs/languages/cpp
ps.
如果在main function有char** argv
要在launch.json文件裡"args": []的中括號裡輸入值
2. 檢視 -> 擴充功能 -> C/C++
3. command+shift+P -> C/Cpp: Edit Configuration (標頭檔路徑產生在c_cpp_properties.json)
4. command+shift+P -> Tasks: Configure Task Runner -> Others (選編譯器跟寫編譯script)
5. command+shift+P -> Debug Open launch.json -> C++ (GDB/LLDB)
6. "program": "enter program name, for example ${workspaceRoot}/a.out",
修改成"program": "${workspaceRoot}/a.out",
7. Debug
參考資料:
https://code.visualstudio.com/docs/languages/cpp
ps.
如果在main function有char** argv
要在launch.json文件裡"args": []的中括號裡輸入值
2017年9月22日 星期五
2017年7月29日 星期六
重灌Mac
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 安裝iterm2
http://iterm2.com
設定
Preference -> Keys -> Show/hide iTerm2 with a system-wide hotkey
Preferences -> Profiles -> Window -> Top of Screen
設定
Preference -> Keys -> Show/hide iTerm2 with a system-wide hotkey
Preferences -> Profiles -> Window -> Top of Screen
3. 安裝oh-my-zsh (http://oomusou.io/osx/iterm2-setup/)
Mac已經有內建zsh (zsh --version 查版本)
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
設置主題powerLine
$ git clone git://github.com/jeremyFreeAgent/oh-my-zsh-powerline-theme ~/.ohmyzsh-powerline$ cd .ohmyzsh-powerline/
$ ./install_in_omz.sh
$ cd ~
$ vim .zshrc
將ZSH_THEME=”robbyrussell”修改成ZSH_THEME=”powerline”
安裝Powerline專屬字型
$ git clone git://github.com/powerline/fonts ~/.powerline_fonts
$ cd ~/.powerline_fonts
$ ./install.sh
設定iterm2字型(原始是Monaco)
iTerm -> Preferences -> Profile -> Text$ vim .zshrc
將ZSH_THEME=”robbyrussell”修改成ZSH_THEME=”powerline”
$ git clone git://github.com/powerline/fonts ~/.powerline_fonts
$ cd ~/.powerline_fonts
$ ./install.sh
設定iterm2字型(原始是Monaco)
Font -> Change Font
設定提示字元
Powerline主題預設會顯示username、hostname與日期,並且只顯示目前路徑。
若不想顯示這些資訊,且想顯示完整路徑的話,請依照以下方式設定。
取消hostname與日期
在第一行加上
POWERLINE_HIDE_HOST_NAME="true"
POWERLINE_DISABLE_RPOMPT="true"
POWERLINE_FULL_CURRENT_PATH="true"
取消username
$ vim ~/.ohmyzsh-powerline/powerline.zsh-theme
將此行改成
PROMPT="%k%f%F{white}%K{blue}"$POWERLINE_CURRENT_PATH"%F{blue}"$POWERLINE_GIT_INFO_LEFT" %k"$'\ue0b0'"%f "
將此行改成
PROMPT="%k%f%F{white}%K{blue}"$POWERLINE_CURRENT_PATH"%F{blue}"$POWERLINE_GIT_INFO_LEFT" %k"$'\ue0b0'"%f "
4. 安裝fira code font
download
到ttf資料夾選擇要安裝的形式
5. 安裝終端機自動命令提示
$ brew install zsh-autosuggestions確認是否有zsh-autosuggestions.zsh (路徑要確認是否為0.4.0版本)
$ cd /usr/local/Cellar/zsh-autosuggestions/0.4.0/share/zsh-autosuggestions
zsh-autosuggestions.zsh放入~/.zshrc文件中
$ source ~/.zshrc
6. 安裝OpenMP和MPI
Installing OpenMP
如果還沒安裝gcc
$ brew install gcc --without-multilib
如果已經安裝gcc
$ brew reinstall gcc --without-multilib
6. 安裝OpenMP和MPI
Installing OpenMP
如果還沒安裝gcc
$ brew install gcc --without-multilib
如果已經安裝gcc
$ brew reinstall gcc --without-multilib
compile指令
$ gcc-7 -fopenmp
$ gcc-7 -fopenmp
Installing MPI (https://shawnliu.me/post/configuring-openmp-and-mpi-on-mac/)
$ brew install openmpi --build-from-source --cc=gcc-7
compile指令
$ brew install openmpi --build-from-source --cc=gcc-7
compile指令
$ mpicc <your source code>
7. 安裝 Homebrew Cask
$ brew install brew-cask-completion
$ brew cask install google-chrome
8. 更新
$ brew update && brew upgrade brew-cask && brew cleanup
7. 安裝 Homebrew Cask
$ brew install brew-cask-completion
$ brew cask install google-chrome
8. 更新
$ brew update && brew upgrade brew-cask && brew cleanup
10.安裝FileZilla
$ brew cask install filezilla
11. 安裝The Unarchiver
https://itunes.apple.com/app/the-unarchiver/id425424353
12. Sublime Text 3
https://www.sublimetext.com/3
2017年7月17日 星期一
2017年6月18日 星期日
GPU on OSX
Q: zsh: command not found: nvcc
A:
export PATH=/Developer/NVIDIA/CUDA-8.0/bin${PATH:+:${PATH}}
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-8.0/lib\
${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
Q: nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
A:
nvcc -gencode arch=compute_30,code=sm_30 hello.cu -o hello
Q: nvcc fatal : The version ('80100') of the host compiler ('Apple clang') is not supported
A:
1. 下載Xcode 8.3.3 (https://developer.apple.com/download/more/)
2. Unzip "Xcode8.3.3.xip" and movie it to "Application folder" as /Applications/Xcode.app3. $ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
4. $ /usr/bin/cc --version
移除xcode
sudo rm -rf /Applications/Xcode.app
sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist rm -rf ~/Library/Caches/com.apple.dt.Xcode rm -rf ~/Library/Application\ Support/Xcode
rm -rf ~/Library/Developer/Xcode rm -rf ~/Library/Developer/CoreSimulator rm -rf ~/Library/Developer/XCPGDevices
A:
export PATH=/Developer/NVIDIA/CUDA-8.0/bin${PATH:+:${PATH}}
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-8.0/lib\
${DYLD_LIBRARY_PATH:+:${DYLD_LIBRARY_PATH}}
Q: nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
A:
nvcc -gencode arch=compute_30,code=sm_30 hello.cu -o hello
Q: nvcc fatal : The version ('80100') of the host compiler ('Apple clang') is not supported
A:
1. 下載Xcode 8.3.3 (https://developer.apple.com/download/more/)
2. Unzip "Xcode8.3.3.xip" and movie it to "Application folder" as /Applications/Xcode.app3. $ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
4. $ /usr/bin/cc --version
移除xcode
sudo rm -rf /Applications/Xcode.app
sudo rm -rf /Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist rm -rf ~/Library/Caches/com.apple.dt.Xcode rm -rf ~/Library/Application\ Support/Xcode
rm -rf ~/Library/Developer/Xcode rm -rf ~/Library/Developer/CoreSimulator rm -rf ~/Library/Developer/XCPGDevices
2017年2月26日 星期日
dim3
http://www2.kimicat.com/第二個cuda程式
NVIDIA GeForce GT 650M 1024 MB
http://www.geforce.com/hardware/notebook-gpus/geforce-gt-650m/specifications
http://www2.kimicat.com/第二個cuda程式
NVIDIA GeForce GT 650M 1024 MB
http://www.geforce.com/hardware/notebook-gpus/geforce-gt-650m/specifications
Pass Objects to Function & Pass and Return Object from the Function
Object Returning
Passing & returning large objects
Returning a Class Object
2017年2月25日 星期六
nvcc warning
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).
$ nvcc -arch=sm_60 -std=c++11 vectorAdd.cu
$ nvcc -arch=sm_60 -std=c++11 vectorAdd.cu
ps. SMS ?= 30 35 37 50 52 60都可以
2017年2月24日 星期五
C++ 冒號(:) 雙冒號(::) 的定義與應用
轉載於: http://www.itread01.com/articles/1478394912.html
1.冒號(:)用法
(1)表示機構內位域的定義(即該變量占幾個bit空間)
typedef struct _XXX{
unsigned char a:4;
unsigned char c;
} ; XXX
(2)構造函數後面的冒號起分割作用,是類給成員變量賦值的方法,初始化列表,更適用於成員變量的常量const型。
struct _XXX{
_XXX() : y(0xc0) {}
};
(3) public:和private:後面的冒號,表示後面定義的所有成員都是公有或私有的,直到下一個"public:”或"private:”出現為止。"private:"為默認處理。
(4)類名冒號後面的是用來定義類的繼承。
class 派生類名 : 繼承方式 基類名
{
派生類的成員
};
繼承方式:public、private和protected,默認處理是public。
2.雙冒號(::)用法
(1)表示“域操作符”
例:聲明了一個類A,類A裏聲明了一個成員函數void f(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,
就要寫成void A::f(),表示這個f()函數是類A的成員函數。
(2)直接用在全局函數前,表示是全局函數
例:在VC裏,你可以在調用API 函數裏,在API函數名前加::
(3)表示引用成員函數及變量,作用域成員運算符
例:system::Math::Sqrt() 相當於System.Math.Sqrt()
VC中如下
::是C++裏的“作用域分解運算符”。比如聲明了一個類A,類A裏聲明了一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。
:: 一般還有一種用法,就是直接用在全局函數前,表示是全局函數。當類的成員函數跟類外的一個全局函數同名時,考試,大提示在類內定義的時候,打此函數名默認調用的是本身的成員函數;如果要調用同名的全局函數時,就必須打上::以示區別。比如在VC裏,你可以在調用API函數時,在API函數名前加::。(編輯:)
1.冒號(:)用法
(1)表示機構內位域的定義(即該變量占幾個bit空間)
typedef struct _XXX{
unsigned char a:4;
unsigned char c;
} ; XXX
(2)構造函數後面的冒號起分割作用,是類給成員變量賦值的方法,初始化列表,更適用於成員變量的常量const型。
struct _XXX{
_XXX() : y(0xc0) {}
};
(3) public:和private:後面的冒號,表示後面定義的所有成員都是公有或私有的,直到下一個"public:”或"private:”出現為止。"private:"為默認處理。
(4)類名冒號後面的是用來定義類的繼承。
class 派生類名 : 繼承方式 基類名
{
派生類的成員
};
繼承方式:public、private和protected,默認處理是public。
2.雙冒號(::)用法
(1)表示“域操作符”
例:聲明了一個類A,類A裏聲明了一個成員函數void f(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,
就要寫成void A::f(),表示這個f()函數是類A的成員函數。
(2)直接用在全局函數前,表示是全局函數
例:在VC裏,你可以在調用API 函數裏,在API函數名前加::
(3)表示引用成員函數及變量,作用域成員運算符
例:system::Math::Sqrt() 相當於System.Math.Sqrt()
VC中如下
::是C++裏的“作用域分解運算符”。比如聲明了一個類A,類A裏聲明了一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。
:: 一般還有一種用法,就是直接用在全局函數前,表示是全局函數。當類的成員函數跟類外的一個全局函數同名時,考試,大提示在類內定義的時候,打此函數名默認調用的是本身的成員函數;如果要調用同名的全局函數時,就必須打上::以示區別。比如在VC裏,你可以在調用API函數時,在API函數名前加::。(編輯:)
這篇文章將總結C/C++中的冒號的用法。
1、位域定義
這個在前面關於位結構體的文章裏說得夠多的了,不再重復了。
2、類構造函數(Constructor)的初始化列表
先說下什麽叫構造函數吧(是不是啰嗦了?C++的人應該都知道了吧,還是以防萬一一下)。所謂構造函數,就是與類同名的函數,它與普通函數的區別在於,它沒有返回類型。
在構造函數後面緊跟著冒號加初始化列表,各初始化變量之間以逗號(,)隔開。下面舉個例子。
class myClass
{
public :
myClass();// 構造函數,無返回類型,可以有參數列表,這裏省去
~myClass();// 析構函數
int a;
const int b;
}
myClass::myClass():a(1),b(1)// 初始化列表
{
}
上面的例子展示了冒號的這個用法,下面對這個用法進行幾點說明:
1)初始化列表的作用相當於在構造函數內進行相應成員變量的賦值,但兩者是有差別的。
在初始化列表中是對變量進行初始化,而在構造函數內是進行賦值操作。兩都的差別在對於像const類型數據的操作上表現得尤為明顯。我們知道,const類型的變量必須在定義時進行初始化,而不能對const型的變量進行賦值,因此const類型的成員變量只能(而且必須)在初始化列表中進行初始化,即下面的代碼將會出錯:
myClass::myClass()
{
a = 1;// 沒錯,效果相當於在初始化列表中進行初始化
b = 1;// 出錯,const變量不能進行賦值操作;
}
2)初始化的順序與成員變量聲名的順序相同。
先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。這一點是相當重要的哦,一般在初始化列表中進行初始化時,初始化的順序應與聲明的順序保持一致,防止出現不必要的錯誤。
3)對於繼承的類來說,在初始化列表中也可以進行基類的初始化,初始化的順序是先基類初始化,然後再根據該類自己的變量的聲明順序進行初始化。
3、聲明基類。
假設我們重新定義一個類,繼承自myClass類。定義方式如下:
class derivedClass : public myClass
{
// 略去
}
這裏的冒號起到的就是聲名基類的作用,在基類類名前面可以加public/private/protected等標簽,用於標識繼承的類型,也可以省略,省略的話,用class定義的類默認為private,用struct定義的類默認為public,至於具體各個標簽有什麽區別這裏就不說了。
與初始化列表一樣的,這裏也可以聲名多個基類,各基類之間用逗號(,)隔開。
4、條件語句(? :)
與?構成條件語句,作用相當於if else,如下;
int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,則反a賦給c,否則把b賦給c
條件語句的結構為:
條件表達式?表達式1:表達式2
當條件表達式為true時,表達式的值為表達式1的值,否則為表達式2的值。
幾點說明:
1)?:可以嵌套,但不推薦使用(難懂),下面的表達式你能看懂啥意思不?
int max = i>j ? i>k ? i : k : j>k ? j : k;
腦袋大了吧,呵呵。
2)?:具有很低的優先級,這個要註意哦,下面的程序執行結果是啥呢?
int i = 3;
int j = 2;
cout << i>j?i:j;// 出錯,<<比>具有更高的優先級,執行順序為 ((cout<<i)>j)?i:j,相當於是比較cout<<i與j的大小,然後根據比較結果決定表達式值為i或j,這顯然要出錯的,cout<<i的值是cout,不能跟整型數j進行比較。
cout << (i>j)?i:j;//輸出1或0,相當於(cout<<(i>j))作為判決條件,來決定表達式的值為i或j,而cout<<(i>j),i>j則輸出1否則0,然後再將(cout<<(i>j))作為?:的條件,如果cout正確執行則為1(true),否則為0(false),以此決定表達式值為i或j
cout <<(i>j?i:j);//i>j則輸出i,否則輸出j,表達式值為true如果cout正確執行,否則為false
更多的關於優先級的問題就不說了。
5、語句標簽
通常跟goto配合使用,如:
step1: a = f1();
....
goto step1;
這種作法也不是很推薦,原因在於它破壞了語句的順序執行,這樣的代價大家應該清楚吧。不過存在即為合理嘛,既然它還存在,肯定還是有它的用處有它的好處的,比如說,多層嵌套的退出(會比break continue直觀一點吧),也可以避免重復代碼之類之類的
6、switch語句中case後。
7、匯編指令模板
參考:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html
1、 1、位域定義
這個在前面關於位結構體的文章裏說得夠多的了,不再重復了。
2、類構造函數(Constructor)的初始化列表
先說下什麽叫構造函數吧(是不是啰嗦了?C++的人應該都知道了吧,還是以防萬一一下)。所謂構造函數,就是與類同名的函數,它與普通函數的區別在於,它沒有返回類型。
在構造函數後面緊跟著冒號加初始化列表,各初始化變量之間以逗號(,)隔開。下面舉個例子。
class myClass
{
public :
myClass();// 構造函數,無返回類型,可以有參數列表,這裏省去
~myClass();// 析構函數
int a;
const int b;
}
myClass::myClass():a(1),b(1)// 初始化列表
{
}
上面的例子展示了冒號的這個用法,下面對這個用法進行幾點說明:
1)初始化列表的作用相當於在構造函數內進行相應成員變量的賦值,但兩者是有差別的。
在初始化列表中是對變量進行初始化,而在構造函數內是進行賦值操作。兩都的差別在對於像const類型數據的操作上表現得尤為明顯。我們知道,const類型的變量必須在定義時進行初始化,而不能對const型的變量進行賦值,因此const類型的成員變量只能(而且必須)在初始化列表中進行初始化,即下面的代碼將會出錯:
myClass::myClass()
{
a = 1;// 沒錯,效果相當於在初始化列表中進行初始化
b = 1;// 出錯,const變量不能進行賦值操作;
}
2)初始化的順序與成員變量聲名的順序相同。
先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。這一點是相當重要的哦,一般在初始化列表中進行初始化時,初始化的順序應與聲明的順序保持一致,防止出現不必要的錯誤。
3)對於繼承的類來說,在初始化列表中也可以進行基類的初始化,初始化的順序是先基類初始化,然後再根據該類自己的變量的聲明順序進行初始化。
3、聲明基類。
假設我們重新定義一個類,繼承自myClass類。定義方式如下:
class derivedClass : public myClass
{
// 略去
}
這裏的冒號起到的就是聲名基類的作用,在基類類名前面可以加public/private/protected等標簽,用於標識繼承的類型,也可以省略,省略的話,用class定義的類默認為private,用struct定義的類默認為public,至於具體各個標簽有什麽區別這裏就不說了。
與初始化列表一樣的,這裏也可以聲名多個基類,各基類之間用逗號(,)隔開。
4、條件語句(? :)
與?構成條件語句,作用相當於if else,如下;
int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,則反a賦給c,否則把b賦給c
條件語句的結構為:
條件表達式?表達式1:表達式2
當條件表達式為true時,表達式的值為表達式1的值,否則為表達式2的值。
幾點說明:
1)?:可以嵌套,但不推薦使用(難懂),下面的表達式你能看懂啥意思不?
int max = i>j ? i>k ? i : k : j>k ? j : k;
腦袋大了吧,呵呵。
2)?:具有很低的優先級,這個要註意哦,下面的程序執行結果是啥呢?
int i = 3;
int j = 2;
cout << i>j?i:j;// 出錯,<<比>具有更高的優先級,執行順序為 ((cout<<i)>j)?i:j,相當於是比較cout<<i與j的大小,然後根據比較結果決定表達式值為i或j,這顯然要出錯的,cout<<i的值是cout,不能跟整型數j進行比較。
cout << (i>j)?i:j;//輸出1或0,相當於(cout<<(i>j))作為判決條件,來決定表達式的值為i或j,而cout<<(i>j),i>j則輸出1否則0,然後再將(cout<<(i>j))作為?:的條件,如果cout正確執行則為1(true),否則為0(false),以此決定表達式值為i或j
cout <<(i>j?i:j);//i>j則輸出i,否則輸出j,表達式值為true如果cout正確執行,否則為false
更多的關於優先級的問題就不說了。
5、語句標簽
通常跟goto配合使用,如:
step1: a = f1();
....
goto step1;
這種作法也不是很推薦,原因在於它破壞了語句的順序執行,這樣的代價大家應該清楚吧。不過存在即為合理嘛,既然它還存在,肯定還是有它的用處有它的好處的,比如說,多層嵌套的退出(會比break continue直觀一點吧),也可以避免重復代碼之類之類的
6、switch語句中case後。
7、匯編指令模板
參考:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html
作用域符號::的前面一般是類名稱,後面一般是該類的成員名稱,C++為例避免不同的類有名稱相同的成員而采用作用域的方式進行區分
如:A,B表示兩個類,在A,B中都有成員member。那麽
A::member就表示類A中的成員member
B::member就表示類B中的成員member
2、
全局作用域符號:當全局變量在局部函數中與其中某個變量重名,那麽就可以用::來區分如:
char zhou; //全局變量
void sleep()
{
char zhou; //局部變量
char(局部變量) = char(局部變量) *char(局部變量) ;
::char(全局變量) =::char(全局變量) *char(局部變量);
}
3、
::是C++裏的“作用域分解運算符”。比如聲明了一個類A,類A裏聲明了一個成員函數voidf(),但沒有在類的聲明裏給出f的定義,那麽在類外定義f時,就要寫成voidA::f(),表示這個f()函數是類A的成員函數。例如
- 01 class CA {
- 02 public:
- 03 int ca_var;
- 04 int add(int a, int b);
- 05 int add(int a);
- 06 };
- 07
- 08 //那麽在實現這個函數時,必須這樣書寫:
- 09 int CA::add(int a, int b)
- 10 {
- 11 return a + b;
- 12 }
- 13
- 14 //另外,雙冒號也常常用於在類變量內部作為當前類實例的元素進行表示,比如:
- 15 int CA::add(int a)
- 16 {
- 17 return a + ::ca_var;
- 18 }
- 19
- 20 //表示當前類實例中的變量ca_var。
2017年1月29日 星期日
Makefile
Target:Prequeite
$@ Target的檔名
$% 程式庫成員中的檔名元素
$< 第一個prequeite的檔名
$? Timestamp 在Target之後的Prequeite
$^ 所有的Prequeite的檔名 但不包含重複部分
$+ 所有的Prequeite的檔名
$* Target的主檔名
$@ Target的檔名
$% 程式庫成員中的檔名元素
$< 第一個prequeite的檔名
$? Timestamp 在Target之後的Prequeite
$^ 所有的Prequeite的檔名 但不包含重複部分
$+ 所有的Prequeite的檔名
$* Target的主檔名
Makefile的賦值運算符(=, :=, +=, ?=)
1. ?=
這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值
如果已經有值了 就不進行任何變動
2. =
在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開
所以就可以先定義 後續再補數值
以下提供一個例子
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容
然後這樣子的特性可能會帶來兩個壞處
第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正
CFLAGS = $(CFLAGS) -O
CFLAGS要被使用時會造成無限迴圈
另外一個壞處是跟效能有關的:
因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次
所以效能就可能不太好
3. :=
在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開
所以一旦跑完:=後 就不再存在任何reference在變數中
4. +=
最後一個是+= 用來增加敘述在原有已經定義的變數中
如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.
如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable
1. =
make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:
x = hello
y = $(x) world!
x = hi
all:
@echo $(y)
在上例中,輸出結果將會是 hi world! ,而不是 hello world!
2. :=
變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。
x := hello
y := $(x) world!
x := hi
all:
@echo $(y)
輸出結果 ====> hello world!
這個是適用於想表達如果?=左邊的變數從未被設定過的話 就讓它設定成右邊的內容、數值
如果已經有值了 就不進行任何變動
2. =
在makefile官方文件中 使用=的時機是希望讓左邊的變數成為"recursively expanded variable" 也就是當變數真的被使用到的時候 在進行遞迴展開
所以就可以先定義 後續再補數值
以下提供一個例子
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
如果使用以上兩行的定義 當CFLAGS真的要被使用時就會展開成 -lfoo -lbar -O 所以可以後定義、補充include_dirs的內容
然後這樣子的特性可能會帶來兩個壞處
第一個是有可能造成無限遞迴 以下就是一個例子 不過這個makefile會提示bug 所以倒也還好修正
CFLAGS = $(CFLAGS) -O
CFLAGS要被使用時會造成無限迴圈
另外一個壞處是跟效能有關的:
因為遞迴展開也適用於函式 所以函式的展開執行也會發生在變數要被使用的時候 也就是說如果變數要被重複使用幾次 函式就會展開跑幾次
所以效能就可能不太好
3. :=
在markfile官方文件中 使用:=的時機是希望讓左邊的變數成為"Simply expanded variable" 也就是當這一行敘述被執行時 就馬上進行展開
所以一旦跑完:=後 就不再存在任何reference在變數中
4. +=
最後一個是+= 用來增加敘述在原有已經定義的變數中
如果+=左邊的變數還沒定義過 那+=執行的效果就會跟=一樣 也就是recursively-expanded variable.
如果變數曾經定義過 那+=跑起來的效果就會視前一次定義是用=或者:=來決定跑完後是recursively-expanded variable或者是simply expanded variable
ex
make會將整個makefile展開後,才決定變數的值。也就是说,變數的值會是整個Makefile中最後被指定的值。看例子:
x = hello
y = $(x) world!
x = hi
all:
@echo $(y)
在上例中,輸出結果將會是 hi world! ,而不是 hello world!
2. :=
變數的值在Makefile展開途中就會被給定,而不是整個Makefile展開後的最终值。
x := hello
y := $(x) world!
x := hi
all:
@echo $(y)
輸出結果 ====> hello world!
2017年1月23日 星期一
git 團隊
下載遠端數據庫
git pull #才能從別的相同clone資料夾或別的電腦看到github的commit
git pull = git fetch + git merge
練習完 pull 時,可以知道他就是將遠端的分支將你的本地分支進行合併 merge 的動作,
git pull #才能從別的相同clone資料夾或別的電腦看到github的commit
遠端衝突
A和B都pull remote repository commit
A修改後commit push
B修改後commit push會顯示衝突
B pull remote repository commit
此時pull的檔案會是merge A和B的檔案
存放網頁空間流程
Setting -> Github Pages -> Source -> 選分支後上方會出現網址
小型團隊分支協作
A在master先分支一個develop
B在develop用一個分支
B開發完後A在develop merge B的分支
最後A再回到master merge develop
然後push master和develop到remote repository
練習完 pull 時,可以知道他就是將遠端的分支將你的本地分支進行合併 merge 的動作,
但有時候你不希望 pull 下來導致自己的數據庫太亂又擔心有衝突時,可以先使用下面這個指令。
git fetch origin(遠端數據庫) branch1(遠端分支)
此時你的分支會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到你看過沒問題後,
再合併 FETCH_HEAD 也 ok。
git fetch origin(遠端數據庫) branch1(遠端分支)
此時你的分支會多一個 FETCH_HEAD 的分支,這個就是遠端數據庫的分支,可以等到你看過沒問題後,
再合併 FETCH_HEAD 也 ok。
push branch 到 remote repository
沒有要推送分支的話
$ git push
git remote rename 原名稱 修改名稱
git push origin branch名稱 #origin:clone預設遠端主機名稱
push local repository
git remote add origin https://github.com/chiustin/python.git
git push origin master/branch
push local repository
git remote add origin https://github.com/chiustin/python.git
git push origin master/branch
git暫存
儲存一個暫存檔
另外也可以將此暫存檔移到另一個分支
$ git stash #暫時儲存暫時目錄
$ git stash list #瀏覽git stash 列表
$ git stash pop #還原暫存
$ git stash drop #清除最新暫存
$ git stash clear #清除全部暫存
另外也可以將此暫存檔移到另一個分支
$ git stash #暫時儲存暫時目錄
$ git stash list #瀏覽git stash 列表
$ git stash pop #還原暫存
$ git stash drop #清除最新暫存
$ git stash clear #清除全部暫存
git 標籤
git tag #查詢標籤
git tag -n #查詢詳細標籤
git tag -d #刪除標籤
git tag 標籤名稱 #新增輕量標籤
git tag -am "備註名稱" 標籤名稱 #新增標示標籤
git checkout 標籤名稱 #切換到標籤的commit
git tag -n #查詢詳細標籤
git tag -d #刪除標籤
git tag 標籤名稱 #新增輕量標籤
git tag -am "備註名稱" 標籤名稱 #新增標示標籤
git checkout 標籤名稱 #切換到標籤的commit
分支
HEAD 是目前所在位置指標
git branch #瀏覽目前分支
git checkout commit識別碼 #將HEAD指向之前的committed
git checkout master #將HEAD指回原本committed
分支
git branch 名稱
git checkout 名稱
合併
case 1
開分支再將此分支commit
git merge 分支名稱 #在master位置
#分支還是保持一樣檔案內容
case 2 分支合併到修改過的master
開分支"插入"新的內容
再將此分支commit
接著將master也做修改commit
git merge 分支名稱
會將master跟分支修改的東西一起合併
case 3 衝突
開分支"修改"原本的內容
再將此分支commit
接著master也修改剛剛分支修改的內容再commit
git merge 分支名稱
會顯示HEAD跟分支的內容
手動修改
git branch #瀏覽目前分支
git checkout commit識別碼 #將HEAD指向之前的committed
git checkout master #將HEAD指回原本committed
分支
git branch 名稱
git checkout 名稱
合併
case 1
開分支再將此分支commit
git merge 分支名稱 #在master位置
#分支還是保持一樣檔案內容
case 2 分支合併到修改過的master
開分支"插入"新的內容
再將此分支commit
接著將master也做修改commit
git merge 分支名稱
會將master跟分支修改的東西一起合併
case 3 衝突
開分支"修改"原本的內容
再將此分支commit
接著master也修改剛剛分支修改的內容再commit
git merge 分支名稱
會顯示HEAD跟分支的內容
手動修改
2017年1月22日 星期日
2017年1月21日 星期六
Markdown
# 課堂中的範例
## 粗體或斜體
**This is bold**
---
*This is tilt*
## 機器學習演算法的清單
- 分類
- 決策樹
- 羅吉斯回歸
- ...etc
- 分群
-
-
-...etc
- 迴歸
-
-
-...etc
## 不想被執行的程式
這是一個 Inline code: `print(Hello World)`
這是一個 Code chunk:
```python
print("Penny Lane")
```
## 我最喜歡的樂團
|樂團名|主唱|
|-----|----|
|May |Sien|
|Come |GG |
## 參考連結
- [Penny Lane] - (https://backlogtool.com/git-guide/tw/reference/)
- [other] - (https://zlargon.gitbooks.io/git-tutorial/content/branch/commit_tree.html)
- 圖片:
![](https://www.qnap.com/QPKG/img/python_640x400.png)
---
> "This is Python"
## 粗體或斜體
**This is bold**
---
*This is tilt*
## 機器學習演算法的清單
- 分類
- 決策樹
- 羅吉斯回歸
- ...etc
- 分群
-
-
-...etc
- 迴歸
-
-
-...etc
## 不想被執行的程式
這是一個 Inline code: `print(Hello World)`
這是一個 Code chunk:
```python
print("Penny Lane")
```
## 我最喜歡的樂團
|樂團名|主唱|
|-----|----|
|May |Sien|
|Come |GG |
## 參考連結
- [Penny Lane] - (https://backlogtool.com/git-guide/tw/reference/)
- [other] - (https://zlargon.gitbooks.io/git-tutorial/content/branch/commit_tree.html)
- 圖片:
![](https://www.qnap.com/QPKG/img/python_640x400.png)
---
> "This is Python"
git檔案管理
檔案狀態可以分成三種
Changes to be committed #執行git add後
Changes to be committed #執行git add後
Changes not staged for commit #已經git add後再修改檔案
Untracked files #建立新的檔案
#一個檔案可以同時Changes to be committed和
#Changes not staged for commit
檢視檔案
$ git status #顯示修改檔案清單
$ git diff #查看修改檔案差異
$ git log #顯示commit紀錄
$ git show #查看commit的詳細記錄
註冊檔案或目錄到index
$ git add
刪除檔案
$ git rm
#會先把檔案移除index變成Changes not staged for commit
#等commit -m之後才會真正刪除檔案
還原和刪除檔案
已註冊到index的檔案做"修改"後
狀態也會從Changes to be committed變成
Changes not staged for commit
如果要把Changes not staged for commit檔案
"還原檔案"變成
"還原檔案"變成
$ git checkout -- file
#此時檔案狀態也會改回Changes to be committed
#不管是modified或deleted都可以還原檔案內容
把檔案狀態從Changes to be committed變成
Changes not staged for commit
也就是檔案"取消index"
$ git reset HEAD file
還原工作目錄和index
和最後commit一樣
先將Changes to be committed
和最後commit一樣
先將Changes to be committed
Changes not staged for commit
Untracked files
Untracked files
三種狀態index先變成Changes to be committed
$ git add. #先全部變成Changes to be committed
$ git add. #先全部變成Changes to be committed
$ git reset --hard #將Changes to be committed檔案刪除
訂閱:
文章 (Atom)