'Sync'에 해당되는 글 2건

  1. 2009.07.01 WinMerge 파일과 폴더 비교 및 동기화
  2. 2009.06.04 패키지 관리 속도 향상법 (emerge sync)
2009.07.01 11:50

WinMerge 파일과 폴더 비교 및 동기화

제작사/제작자 : http://winmerge.org/
운영체제 : 윈도우 98/Me/NT/2000/XP/2003
언인스톨 지원여부 : 지원
라이센스 정보 : GPL(프리웨어)
 


WinMerge는 서로 다른 2 개의 파일과 폴더(디렉토리)의 내용을 비교하게 동일하게 만들 수 있는 동기화 프로그램입니다.
 
WinMerge 특징
  • 파일 및 폴더의 내용 비교 /동기화
  • 서로 다른 부분을 강조색으로 구분해주어 편리하게 찾을 수 있음
  • 빠른 찾아가기와 다른 부분 동기화 기능
  • 한글 메뉴를 지원하여 사용하기 용이
  • 유니코드 지원
  • 조작법 난이도 : 쉬움
  • 한글 메뉴 : 지원
 
WinMerge를 용용할 수 있는 작업 분야는 많습니다. 간략한 예를 든다면,
  • 프로그래밍 작업 중 원본 소스와 수정한 소스에서 수정된 부분을 쉽게 알아내고자 할 때
  • 로컬라이제이션 작업 중 이전 원본 언어 파일과 버전업된 언어 파일의 다른 부분만 찾아내어 번역하고자 할 때
  • 2 개의 텍스트 파일을 구조를 해치지 않고 하나의 파일로 합치고자 할 때
 
위에서 언급한 작업은 WinMerge와 같은 툴을 사용하지 않는다면 작업 중 누락되거나 잘못된 확률이 높은 지루한 작업입니다. 그러나 작업 자체가 서로 다른 부분을 찾아 이를 바로 잡아주거나 다른 파일에 적용을 해야 하므로 WinMerge와 같은 툴을 사용하지 않는다면 많은 시간을 들여도 작업이 더디게 진행됩니다.
 
하지만 WinMerge를 사용하면 간단한 조작으로 서로 다른 부분을 찾아내어 다른 부분을 찾아 쉽게 적용할 수 있으므로 시간도 절약되고, 작업 중 오류를 최소화해주어 유용한 도구입니다.
 
단순히 파일의 내용만 비교하여 동기화를 해주는 것이 아니라 2 개의 서로 다른 폴더(디렉토리)를 비교하여 동기화 기능도 제공을 하여 편리합니다. 단, WinMerge의 주 용도가 파일의 텍스트 비교에 있는 만큼 폴더 비교/동기화에 특화된 프로그램이 비해 불편한 면이 있습니다.
 
WinMerge는 파일 비교 및 동기화의 용도로 사용을 하고 폴더(디렉토리) 비교 및 동기화는 Allway Sync와 같은 프로그램을 이용하는 것이 편리합니다.
 
WinMerge는 프로그래머나 잦은 번역 작업을 요하는 번역가 등에게 유용한 프로그램입니다.
 
주의사항
  • 이 프로그램은 GPL 라이센스를 따르는 프리웨어입니다.
 

설치법
1. 다운로드한 파일을 실행해 설치를 진행합니다. 삭제는 제어판의 프로그램 추가/제거를 이용합니다.

2. 설치 유형을 선택합니다. 일반적으로 typical Installation 을 선택하고 설치를 하면 무난하게 사용할 수 있습니다.

3. 추가로 적용할 사항을 선택합니다. 탐색기의 쉘 컨텍스트 메뉴에 WinMerge 메뉴를 추가하고 기타 단축아이콘을 선택할 수 있습니다. [다음] 버튼을 누릅니다.

4. [설치] 버튼을 눌러 설치를 마무리합니다.


사용법
1. 파일 비교
WinMerge를 실행하고 툴바에서 폴더 모양의 아이콘을 누릅니다. 디렉토리/파일 선택 창에서 비교할 파일을 선택합니다. 왼쪽과 오른쪽 창 두 군데에 비교할 파일을 선택하고 [확인] 버튼을 누릅니다.
사용자 삽입 이미지

2. WinMerge 파일 비교
Step 1. WinMerge 파일 비교
비교 대상 파일이 열리면 서로 동일한 부분은 흰색으로 나타납니다. 다른 부분이 있으면 이미지에서와 같이 색깔로 표시가 된 비교 창이 있고 우측에는 두 개의 파일을 비교할 수 있는 비교창이 나타나서 쉽게 구분할 수 있습니다. 마우스로 좌측의 위치창에 있는 스크롤을 움직이면 우측의 비교창이 같이 스크롤이 움직여 편리합니다.
사용자 삽입 이미지

Step 2. WinMerge 파일 비교 - 위치창을 이용한 다른 부분으도 이동
비교하는 파일의 서로 다른 부분을 빠르게 이동하려면 좌측의 위치창에서 서로 다른 부분으로 표시된 부분(노란색)을 클릭하면 해당 부분으로 빠르게 이동합니다.
사용자 삽입 이미지

Step 3. WinMerge 파일 비교 - 툴바 버튼을 이용한 다른 부분으로 이동
또다른 방법으로는 WinMerge의 툴바에서 버튼을 누르면 서로 다른 부분을 차례대로 이동하여 보여줍니다. 이동된 부분은 붉은색으로 강조가되며 하단의 팬에 좌측과 우측의 파일(또는 디렉토리)에서 서로 다른 부분을 표시해주어 편리합니다.
사용자 삽입 이미지

3. 서로 다른 부분 개별 복사
Step 1. 서로 다른 부분 개별 복사
툴바에서는 왼쪽의 선택한 내용을 오른쪽에 적용하거나 반대로 적용할 수 있는 버튼이 있습니다. 이미지와 같이 서로 다른 부분이 강조된 상태에서 툴바의 붉은색 테두리 안의 버튼을 눌러 좌우측으로 서로 다른 부분을 복사해 넣을 수 있습니다.
화살표의 방향에 따라 좌측에서 우측, 또는 우측에서 좌측으로 내용을 복사합니다.
사용자 삽입 이미지

Step 2. 서로 다른 부분 개별 복사 완료
이미지와 같이 왼쪽의 내용이 오른쪽에 적용이 된 것을 확인할 수 있습니다.
사용자 삽입 이미지

4. 서로 다른 부분 일괄 복사
Step 1. 서로 다른 부분 일괄 복사
서로 다른 부분 개별 복사 방법은 다른 부분이 적을 경우에는 유용합니다. 그러나 서로 다른 부분이 많고 일괄 복사가 필요한 경우에는 일괄 복사 기능을 이용하는 것이 편리합니다.
이미지와 같이 서로 다른 부분이 강조된 상태에서 툴바의 붉은색 테두리 안의 버튼을 눌러 좌우측으로 서로 다른 부분을 복사해 넣을 수 있습니다.
화살표의 방향에 따라 좌측에서 우측, 또는 우측에서 좌측으로 내용을 복사합니다.
사용자 삽입 이미지

Step 2. 서로 다른 부분 일괄 복사 완료
이미지와 같이 일괄적으로 내용이 복사되어 두 비교 파일의 완전히 일치함을 보여줍니다.
사용자 삽입 이미지

5. WinMerge 메뉴바의 Merge 기능
이러한 적용 버튼은 툴바의 버튼을 이용하거나 메뉴바에서 Merge 하위 메뉴를 이용하여, 다른 부분을 찾아거거나, 다른 내용을 동일하게 복사할 수 있습니다.
사용자 삽입 이미지

6. 디렉토리 비교
WinMerge를 실행하고 툴바에서 폴더 모양의 아이콘을 누릅니다. 디렉토리/파일 선택 창에서 비교할 디렉토리를 선택합니다. 왼쪽과 오른쪽 창 두 군데에 비교할  디렉토리를 선택하고 [확인] 버튼을 누릅니다.
사용자 삽입 이미지

7. 디렉토리 비교 결과
비교할 디렉토리 분석이 완료되면 두 디렉토리의 비교 내용을 볼 수 있습니다. 파일 비교와 마찬가지 작업이 가능하나, WinMerge는 파일 비교 및 통합 시 유용합니다.
사용자 삽입 이미지

8. WinMerge 설정
WinMerge 툴바에서 공구 모양의 버튼을 누르면 WinMerge의 설정을 변경할 수 있는 창이 나타납니다.
사용자 삽입 이미지

Trackback 0 Comment 0
2009.06.04 15:23

패키지 관리 속도 향상법 (emerge sync)

Speeding up portage with cdb -- UPDATE

When it comes to speed the database backend of portage is rather slow because it's implemented as a raw abstraction in the filesystem. It is possible to replace this with a mysql backend which is not ideal, if you don't want to start a full-blown RDBMS. My solution is rather tiny, if you compare the code and the packages you need for that:

  1. You'll need the python interface python-cdb for DJB's cdb
    Code:
    emerge python-cdb

  2. Create /usr/lib/portage/pym/portage_db_cdb.py and put this in it:
    Code:
    # Copyright 2004, 2005 Tobias Bell <tobias.bell@web.de>
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    import portage_db_template
    import os
    import os.path
    import cPickle
    import cdb


    class _data(object):

        def __init__(self, path, category, uid, gid):
            self.path = path
            self.category = category
            self.uid = uid
            self.gid = gid
            self.addList = {}
            self.delList = []
            self.modified = False
            self.cdbName = os.path.normpath(os.path.join(
                self.path, self.category) + ".cdb")
            self.cdbObject = None

        def __del__(self):
            if self.modified:
                self.realSync()

            self.closeCDB()

        def realSync(self):
            if self.modified:
                self.modified = False
                newDB = cdb.cdbmake(self.cdbName, self.cdbName + ".tmp")
               
                for key, value in iter(self.cdbObject.each, None):
                    if key in self.delList:
                        if key in self.addList:
                            newDB.add(key, cPickle.dumps(self.addList[key], cPickle.HIGHEST_PROTOCOL))
                            del self.addList[key]
                    elif key in self.addList:                   
                        newDB.add(key, cPickle.dumps(self.addList[key], cPickle.HIGHEST_PROTOCOL))
                        del self.addList[key]
                    else:
                        newDB.add(key, value)
                   

                self.closeCDB()

                for key, value in self.addList.iteritems():
                    newDB.add(key, cPickle.dumps(value, cPickle.HIGHEST_PROTOCOL))
               
                newDB.finish()
                del newDB
               
                self.addList = {}
                self.delList = []

                self.openCDB()

        def openCDB(self):
            prevmask = os.umask(0)
           
            if not os.path.exists(self.path):
                os.makedirs(self.path, 02775)
                os.chown(self.path, self.uid, self.gid)
               
            if not os.path.isfile(self.cdbName):
                maker = cdb.cdbmake(self.cdbName, self.cdbName + ".tmp")
                maker.finish()
                del maker
                os.chown(self.cdbName, self.uid, self.gid)
                os.chmod(self.cdbName, 0664)

            os.umask(prevmask)
               
            self.cdbObject = cdb.init(self.cdbName)

        def closeCDB(self):
            if self.cdbObject:
                self.cdbObject = None


    class _dummyData:
        cdbName = ""

        def realSync():
            pass
        realSync = staticmethod(realSync)


    _cacheSize = 4
    _cache = [_dummyData()] * _cacheSize


    class database(portage_db_template.database):   

        def module_init(self):
            self.data = _data(self.path, self.category, self.uid, self.gid)

            for other in _cache:
                if other.cdbName == self.data.cdbName:
                    self.data = other
                    break
            else:
                self.data.openCDB()
                _cache.insert(0, self.data)           
                _cache.pop().realSync()
               
        def has_key(self, key):
            self.check_key(key)
            retVal = 0

            if self.data.cdbObject.get(key) is not None:
                retVal = 1

            if self.data.modified:
                if key in self.data.delList:
                    retVal = 0
                if key in self.data.addList:
                    retVal = 1
               
            return retVal

        def keys(self):
            myKeys = self.data.cdbObject.keys()

            if self.data.modified:
                for k in self.data.delList:
                    myKeys.remove(k)
                for k in self.data.addList.iterkeys():
                    if k not in myKeys:
                        myKeys.append(k)
                       
            return myKeys

        def get_values(self, key):
            values = None
           
            if self.has_key(key):
                if key in self.data.addList:
                    values = self.data.addList[key]
                else:
                    values = cPickle.loads(self.data.cdbObject.get(key))

            return values
       
        def set_values(self, key, val):
            self.check_key(key)
            self.data.modified = True
            self.data.addList[key] = val

        def del_key(self, key):
            retVal = 0
           
            if self.has_key(key):
                self.data.modified = True
                retVal = 1
                if key in self.data.addList:
                    del self.data.addList[key]
                else:
                    self.data.delList.append(key)

            return retVal
                       
        def sync(self):
            pass
       
        def close(self):
            pass


    if __name__ == "__main__":
        import portage
        uid = os.getuid()
        gid = os.getgid()
        portage_db_template.test_database(database,"/tmp", "sys-apps", portage.auxdbkeys, uid, gid)


  3. Create /etc/portage/modules and fill in
    Code:
    portdbapi.auxdbmodule = portage_db_cdb.database
    eclass_cache.dbmodule = portage_db_cdb.database


  4. Now you'll have to regenerate the portage cache with
    Code:
    emerge metadata

Now try some searches with emerge especially with --searchdesc :wink:
Code:
emerge --searchdesc python
should be much faster than before. You can compare the performance by switching back to the normal
db module. Just make a
Code:
mv /etc/portage/modules /etc/portage/__modules
I hope you enjoy your accelerated portage.



Default portage
Code:
cd /var/cache/edb/dep/usr
rm * -Rf
time emerge metadata
real    0m40.575s
user    0m26.260s
sys     0m9.592s

time emerge -S mozilla
real    1m46.003s
user    1m36.215s
sys     0m8.721s

time emerge -upDv world
real    0m14.678s
user    0m13.289s
sys     0m1.130s


python-cdb powered portage
Code:
cd /var/cache/edb/dep/usr
rm * -Rf
time emerge metadata
real    2m18.022s
user    0m26.538s
sys     0m31.505s

time emerge -S mozilla
real    1m39.624s
user    1m32.628s
sys     0m5.418s

time emerge -upDv world
real    0m13.856s
user    0m12.986s
sys     0m0.727s



## emerge 명령어 사용법 ##


emerge 옵션 테이블

Option1 Option2 기능
-s search 프로그램 찾기 및 각 프로그램에 대한 설명 참조 가능
-p pretend 프로그램 설치 이전, 설치를 가정하고 어떤 일이 벌어지는지 확인 가능
-v -- pretend 옵션과 더불어 쓰이며, 설정 혹은 비설정 use 옵션 확인 가능
unmerge 설치된 패키지 삭제 옵션,(>,<,=)기호 사용시 특정 버젼선택 삭제가능
help 자세한 설명 필요할때
rsync 포테이지 트리 업데이트 옵션
fetchonly 필요한 압축파일을 다운로드(컴파일안함)
emptytree 포테이지가 패키지및 의존성을 만족하는 패키지들이 모두 설치되지 않은것으로 인식
nodeps 의존성을 무시하고 패키지 설치(컴파일 실패 가능성..있음)
onlydeps 패키지의 의존성을 만족시키기 위한 것들만 설치(지정 패키지 설치안됨)
noreplace 이미 설치되어 있다면 패키지 설치를 생략
usepkg 컴파일이 아닌 이미 컴파일된 바이너리로 설치시도(PKGDIR 환경변수값 이용)
debug ebuild에 기초한 bash스크립트 문법적 에러를 추적할때 사용
autoclean emerge가 패키지의 빌드를 시작하기전에 임시 빌드 디렉토리 강제 청소
verbose emerge가 더 많은 정보를 표시
update 패키지 업데이트시 사용
prune 가장 마지막으로 설치된 버전을 제외하고 모든 패키지의 모든 버전들을 제거


사용법 emerging

사용법 1. emerge package_name
 # emerge mozilla
사용법 2. emerge dir/package_name rsync처럼 패키지명이 emerge의 특정 옵션으로 사용될 경우에 사용
# emerge net-misc/rsync
사용법 3. emerge emergefile 특정 버전을 설치할 때 사용
# emerge mozilla-1.3-r1.ebuild


portage tree 동기화

# emerge sync
or
# emerge rsync

/usr/portage의 개인 설정이 있다면 전부 삭제됨
sync와 rsync는 완전히 동일하게 작동합니다. /lefthander
메뉴얼에서는 rsync가 sync보다 서버의 부하를 덜 주어서 될수 있으면 rsync를 이용해 달라는 당부의 글이 있습니다.
아마도 sync는 모든 파일을 갱신하고 rsync는 없는 파일만 갱신하는것이 아닌가 싶습니다.

# emerge-webrsyncsync

보다 속도가 더 빠름. 스냅샷 압축파일을 받아와서 동기화


portage tree 갱신

# emerge -up system
# emerge -up world 
업데이트할 수 있는 system, world 패키지 확인

# emerge system
시스템 패키지 업데이트

# emerge world
world 패키지 업데이트

system과 world를 업데이트할 때 -u (--update) 옵션을 사용하면 의존성 있는 패키지도 함께 갱신한다.
이 의존성에 걸리는 패키지는 다운그레이드될 수 있다.


패키지 인스톨 전 확인

# emerge --pretend [package name]
or
# emerge -p pornview
# emerge -pv [package_name | ebuildfile]
설치할 패키지가 이미 설치되어 있는지, 의존관계 등의 정보를 확인


패키지 인스톨

#emerge [package name]


변경점 확인

#emerge --changelog [package name] or emerge -pl [package name]
이미 설치된 패키지와 portage상의 최신 패키지와의 차이 표시


패키지 갱신

#emerge [package name]



## 패키지 관리 명령어 비교 (yum / emerge / apt-get) ##


1. 패키지 목록 업데이트

====Fedora====
root@Fedora # yum check-update 
====Gentoo====
root@Gentoo # emerge --sync
====Debian====
root@Debian # apt-get update

2. 최신 패키지로 업데이트
====Fedora====
root@Fedora # yum update
====Gentoo====
root@Gentoo # emerge -DNu world
====Debian====
root@Debian # apt-get upgrade

3. 패키지 설치
====Fedora====
root@Fedora # yum install <packagename>
====Gentoo====
root@Gentoo # emerge <packagename>
====Debian====
root@Debian # apt-get install <packagename>

4. 패키지 재설치
====Fedora====
root@Fedora # yum update <packagename>
====Gentoo====
root@Gentoo # emerge --oneshot <packagename>
====Debian====
root@Debian # apt-get install --reinstall <packagename>

5. 패키지 검색
====Fedora====
root@Fedora # yum search <packagename>
====Gentoo====
root@Gentoo # emerge --searchdesc <packagename>
====Debian====
root@Debian # apt-cache search <packagename>

6. 패키지 삭제
====Fedora====
root@Fedora # yum remove <packagename>
====Gentoo====
root@Gentoo # emerge --unmerge <packagename>
====Debian====
root@Debian # apt-get remove <packagename>
 
참고 : http://wiki.kldp.org/wiki.php/PackageMgmt

Trackback 1 Comment 0