- Git이란 ?
        : 프로젝트의 어떤 부분도 겹쳐 쓰지 않게 프로젝트의 변경을 관리하는 버전 관리 소프트웨어
         시간에 따라 파일의 변화를 기록하고 나중에 특정 시점의 버전을 다시 꺼내오게 한다.
         git은 local version control이 가능하다.
         

기본 용어
    - 저장소(repository)
    - 작업 디렉토리(Working directory)
    - add
    - commit
    - 인덱스(Index) = staging area
    - branch
    - merge
    - push
    - pull


1) 저장소 
    : 원하는 폴더(예제 : tutorial)에 접근한 후 'git init' 명령어를 통해 새로운 git 저장소 생성
        (추가 사항 : 'git config --global user.name' 과 'user.email'을 설정해준다.

명령어 '.git'
   
저장소에 필요한 설정 파일이 존재
        - description : GitWeb 프로그램에서 사용
        - config : 설정 옵션
        - info : 무시할 파일의 패턴 존재, git으로 관리
        - hooks : 클라이언트/서버 훅을 넣음
            %git hook : 어떤 이벤트가 생겼을 때 자동으로 특정 스크립트가 실행되는 것
        - objects : 모든 컨텐트를 저장하는 데이터베이스
        - refs : commit 개체의 포인터를 저장
        - head : 현재 checkout한 브랜치를 가리킴
        - index : staging area의 정보 저장


2) 작업 디렉토리 (Working directory)
        - 'git add'를 통해 hong.c 파일을 staging area로 이동을 시킨다.
        - 'git commit'을 통해 로컬 저장소로 commit을 시킨다.
            % '-m' 명렁어로 commit에 대한 comment를 작성할 수 있다.

#git log
    : 'git log'를 통해 commit 확인
    : log는 최신순부터 확인


3) add
       - 'git add'를 통해 hong.c 파일을 staging area로 이동을 시킨다.
       - 파일 상태
            # staging area : hong.c
            # working directory : news.c


4) 인덱스 (index) = staging area
        - staing area의 hong.c를 commit하면 local 저장소로 이동
        - commit은 staging area에 존재하는 파일만 commit
            % news.c는 commit 되지 않음


5) branch 생성 및 변경
        - git branch [branch 이름] 명령어를 이용해 새로운 브랜치를 작성한다.
        - git checkout 명령어를 이용해 사용할 브랜치로 전환한다.
                # git branch : 브랜치 목록 전체를 확인할 수 있다.
                # git checkout -b : branch를 만들면서 checkout까지 한 번에 할 수 있는 명령어


6) branch 삭제
        - 기존에 존재하는 branch를 'git branch -d' 명령어로 삭제


7) merge
        - 여러 개의 branch를 하나로 모을 때 사용한다.
        - 변경 내용의 이력이 모두 남아 있다.
                # git merge [병합할 branch 이름] 명령어를 사용
                # merge 전, HEAD가 가리키는 branch를 지정 -> git checkout 명령어로 branch 변경
                        # HEAD는 현재 사용 중인 branch를 가리킨다.

 

8) tag
        - 태그는 특정 commit에 대한 포인터
        - Lightweight
                # 단순 태그
                일반tag + tag목록보기.PNG

   - Annotated
          # 태그 만든 사람 이름, 이메일, 날짜, 메시지 등의 정보 저장
          주석태그.PNG

    태그 다.PNG

'etc.. > SCM(source code management' 카테고리의 다른 글

Subversion 정리  (0) 2016.05.18
Github 에 대해서  (0) 2016.05.17

CSV(comma seperated  values, 쉼표로 구분된 값들)파일을 읽어서 처리하는 코드를 작성하고보니 업로드 해야겠다는 생각이 들었다.

python 에서는 csv라는 모듈을 제공해준다. 그래서 import csv를 해서 사용하면 된다.

- csv 파일 읽기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import csv
 
def getCsv(self):
        csvList = []
    
        f = open('./exam.csv','r')    #현재 경로의 exam.csv를 연다.
        csvReader = csv.reader(f)    #reader로 파일을 읽는다.
        
        for i in csvReader:            #한 행씩 돌면서 i[2]값 (3번째 컬럼)을 가져와서 리스트에 저장한다.
            csvList.append(i[2])
        f.close()
    
        return csvList
        
def checker(self):
    csvList = self.getCsv()
    
    if 'ecycle' not in csvList:        #리스트에서 ecycle 문구 존재여부 체크
        print "X"
    else:
        print "O"    
 
if __name__ =='__main__':
    
    print sta.Checker()    
cs

- csv 파일 쓰기

1
2
3
4
5
6
7
8
def setCsv(self):
    
    f = open('./exma2.csv','w')
    csvWriter = csv.writer(f)
        
    csvWriter.writerow(['ecycle','1989','seoul','preprofession'])
    f.close()
        
cs


- 약한 참조 : 레퍼런스 카운트로 고려되지 않는 레퍼런스 객체

% Reference count(참조수)란?
        : 얼마나 많은 부분에서 객체를 참조하고 있는가를 나타내 주는 정수


sys모듈의 getrefcount는 요소의 레퍼런스카운트 갯수를 반환해줌

1. python을 구현한 내부코드에서 3이란 숫자를 29번 참조했다는 의미

2. 한 변수를 참조하는 다른 변수 또한 같은 메모리 공간을 가리키고 있음

3. 서로 같은 값(256이하)을 가지고 있는 다른 변수는 같은 메모리 공간을 가리킴

4. 257 이상 부터는 같은 값을 저장해도 다른 아이디 값은 가진다. 

%아마도 256까지는 singletone으로 구현되었을 것이다.


**python의 Garbage Collecter의 원리**
        : 레퍼런스 카운트가 0인 경우 사용하지 않는 메모리라고 판단하고 GC가 메모리를 반환한다. 


- weakref.ref()
        : 주어진 객체에 대한 약한 참조를 만들어 낸다. 원 객체를 얻을 때에는 약한 참조 자체를 함수처럼 호출.


- weakref.proxy()
        : 원본객체를 대신하는 프록시 객체로 약한 참조를 얻는다. (약한 참조를 객체로 접근 하는 방법)


- 사용 용도

1. 탱글링 방지(cycle reference : 순환 참조)
    : 서로 다른 객체들 사이에 참조 방식이 순환 형태로 연결되는 방식
    독립적으로 존재하지만 순환 참조되는 서로 다른 객체 그룹은 쓰레기 수집이 잘 안됨.
    주기적으로 수집 기능이 있지만 CPU자원 장비가 심함 > 빈도가 낮으면 메모리 불필요한 메로리 점유

2. caching에 사용하면 효과적
    : 대용량의 이미지 데이터들을 가지고 있을 때, 메모리 관리를 편하게 하기 위해 (local에 제한을 둠) 예제 참고 ExpensiveObject.py
        (불필요한 데이터를 끝까지 가지고 있을 필요 없음)

3. 용량이 큰 객체를 자주 사용하거나, 쉽게 만들 수 있을 때 


ExpensiveObject.py (WeakValueDictionary를 사용하여 약한 참조를 만든다. > 원 객체를 참조를 없애고 가비지 컬렉터를 돌려 약한 참조의 생명주기를 확인한다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import gc
from pprint import pprint
import weakref
 
gc.set_debug(gc.DEBUG_LEAK)
 
class ExpensiveObject(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return 'ExpensiveObject(%s)' % self.name
    def __del__(self):
        print '(Deleting %s)' % self
        
def demo(cache_factory):
    # hold objects so any weak references 
    # are not removed immediately
    all_refs = {}
    # the cache using the factory we're given
    print 'CACHE TYPE:', cache_factory
    cache = cache_factory()
    for name in [ 'one''two''three' ]:
        o = ExpensiveObject(name)
        cache[name] = o
        all_refs[name] = o
        del o # decref
 
    print 'all_refs =',
    pprint(all_refs)
    print 'Before, cache contains:', cache.keys()
    for name, value in cache.items():
        print '  %s = %s' % (name, value)
        del value # decref
        
    # Remove all references to our objects except the cache
    print 'Cleanup:'
    del all_refs
    gc.collect()
 
    print 'After, cache contains:', cache.keys()
    for name, value in cache.items():
        print '  %s = %s' % (name, value)
    print 'demo returning'
    return
 
demo(dict)
print
demo(weakref.WeakValueDictionary)
cs


- 반복자(iterator) 
    : 데이터 타입의 내부 구현을 노출하지 않고 포함하고 있는 요소들을 순회하는 방법

리스트 또는 어떤 컨테이너를 Iterator로 만들려면

def __iter__(self):
    return self

def next(self):
    self.data += 1
    if self.limit and self.limit <= self.data:
       
         raise StopIteration
    return self.data

을 선언해 주면 된다. > iterator가 되었으므로 for문을 돌면서 next 메소드를 호출시켜 준다.

StopIteration을 종료후 던져야 한다.

ex)    


- 발생자 (Generator)
    : return 대신 yield를 사용하는 것

-> 함수 호출된 후에 되돌아갈 때, 메모리가 해제되지 않고 그대로 남아있음
    그리고 다시 그 함수가 호출되면 이전에 수행이 종료되었던 지점 이후를 계속 진행함.

yield : Iterator를 구현할 수 있는 훨씬 간결한 문법을 제공한다.!!


   코드 설명

gen = generate_inits(3) #초기 스택 프레임 발생 / 실행 중단 상태
gen.next()                  #실행 재개
yield                         #실행 중단/ 값 return

- 일반 함수와의 차이점 : 일반 함수는 모든 일을 마친 결과를 넘김, But 정보를 생성하는 중간에 값을 넘길 수 있다.
    > 어떤 작업의 중간 결과를 다른 코드에서 참조해야 할 경우 유용하게 활용됨
    > 병행 프로세스나 멀티쓰레드 처리 업무에도 활용 가능
    > 메모리 효율성에 좋음

+ Recent posts