3월, 2012의 게시물 표시

Django 마이그레이션 1.3.1 -> 1.4

이번에 Django 기반으로 서비스하는 시스템을 1.3.1 에서 1.4 로 마이그레이션하였다. settings.py 에서 다음 2가지를 변경해주니, 잘 동작되는 것 같다. 사실, 이 외에도 몇가지 있으나, Django 가 불평은 하지 않았다. 그래도 미래를 위해서 미리 바꾸어주는 것이 좋을 것이다. https://docs.djangoproject.com/en/dev/releases/1.4/ 를 참고해서 시도해보자. DATABASE # 변경전 DATABASE_ENGINE = 'postgresql_psycopg2' DATABASE_NAME = '디비이름' DATABASE_USER = '사용자' DATABASE_PASSWORD = '비밀번호' DATABASE_HOST = '호스트' DATABASE_PORT = '포트' # 변경후 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': '디비이름', 'USER': '사용자', 'PASSWORD': '비밀번호', 'HOST': '호스트', 'PORT': '포트', } } TEMPLATE_LOADERS # 변경전 TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', 'django.template.loaders.app_directories.load_template_source', # 'django.tem

Debian/Ubuntu : 시간 지역설정/동기화

어려운 내용은 아니지만, 서버를 구축하면서 반드시 해야 할 작업중의 하나가 시간을 제대로 맞추는 것이다. Debian/Ubuntu 에는 ntp 데몬을 쉽게 설치할 수 있으며, 이것이 주기적으로 인터넷에 있는 시간서버와 주시적으로 시간을 맞추도록 되어 있다. 그리고, 해당 지역의 로컬 시간을 설정하기 위해서는 /etc/localtime 을 원하는 지역의 것으로 바꾸어주면 된다. 방법은 직접 수동으로 하는 것과, dpkg-reconfigure 라는 툴을 이용하는 2가지 방법을 이용할 수 있다. 간단하니 아래와 같이 직접 설정해보자. 사실 지금도 내 개발서버의 시간이 맞지 않아서, 백업이 엉뚱한 시간이 이루어지고 있었다. ^^; 수동 설정 $ cd /etc $ sudo rm localtime $ sudo cp /usr/share/zoneinfo/Asia/Seoul localtime $ sudo apt-get install ntp $ date Mon Mar 12 10:05:40 KST 2012 툴을 이용한 설정 $ sudo dpkg-reconfigure tzdata --> Asia, Seould 선택 $ sudo apt-get install ntp $ date Mon Mar 12 10:05:40 KST 2012

Groovy : 수정된지 N일이 넘는 파일들 삭제하기

특정 디렉토리 밑에 있는 파일 중에서 일정시간이 지난 파일을 삭제하고자 할 때 필요한 스크립트이다. 파일 서버를 관리하다보면, 주기적으로 필요 없는 파일들을 삭제해야 하는데, Unix(Linux) 환경에서는 find, rm 등을 조합하여 사용할 수도 있다. 그런 것이 여의치 않고, 굳이 Groovy 를 이용하려고 할 때, 활용하면 좋겠다. final DAY_LIMIT = 2 // N일 final TARGET_DIR = "./" println("[Deleted Files]\n") new File(TARGET_DIR).eachFileRecurse { file -> if( file.file ) { def lastModified = new Date(file.lastModified()) def diffDay = new Date() - lastModified if(diffDay > DAY_LIMIT) { println(lastModified.format("YYYY-mm-dd") + " : $file") file.delete() } } }

Groovy : 클로져(반복자)에서 빠져나오기

보통의 반복문에서 중간에 빠져나오려면 break 를 사용하지만, 클로져(반복자)에서 break를 사용하면 에러가 발생한다. 다음 코드를 작성하여 실행해보면, 에러를 확인할 수 있을 것이다. 10.times { item -> println item if(item == 6) break } 이에 대한 대안으로는 Exception 을 사용하면 된다. 이제 다시 Exception 을 이용해서 클로져를 빠져나오는 코드를 보자. 좀 번거롭기는 하지만, 확실하게 break 와 같은 효과를 볼 수 있다. try { 10.times { item -> println item if(item == 6) throw new Exception("break") } } catch (e) {}

Groovy : 100MB 이상의 파일중에서 중복된 파일 찾기

Groovy 에서도 100MB 넘는 파일 중에서 중복된 파일을 찾는 프로그램을 만들어보았다. 모든 언어를 공부하면서 만들어보는 것인데, MD5 Checksum 이 같으면 중복된 파일로 인식하고, 카운트하여 정렬하고 출력하도록 하였다. 파일에 대한 MD5 Checksum 기능이 없어서 직접 구현되었고, 이 부분을 제외하면 Ruby 와 거의 비슷하다. // ----------------------------------------------------------------------------- // 100MB 이상의 파일중에서 중복된 파일 찾기 // ----------------------------------------------------------------------------- import java.security.MessageDigest final TARGET_DIR = "C:\\" final LIMIT_SIZE = 100000000 def md5sum(final file) { MessageDigest digest = MessageDigest.getInstance("MD5") file.withInputStream() { is -> byte[] buffer = new byte[8192] int read = 0 while( (read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } } byte[] md5 = digest.digest() BigInteger bigInt = new BigInteger(1, md5) return bigInt.toString(16).padLeft(32, '0')

Groovy : 파일 md5sum 구하기

Groovy에서 md5sum 을 구하려면, Java 의 MessageDigest 모듈을 이용해야 한다. 안타깝게도 file 에 대한 md5 checksum 을 구하는 부분은 구현되어 있지 않기 때문에 별도로 구현해야 한다. 다른 언어에서의 방법과 유사하므로 그리 어렵지는 않다. Java 의 모듈을 그대로 이용해야하기 때문에, 구현은 Java 의 그것과 거의 같다. import java.security.MessageDigest def md5sum(final file) { MessageDigest digest = MessageDigest.getInstance("MD5") file.withInputStream() { is -> byte[] buffer = new byte[8192] int read = 0 while( (read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } } byte[] md5 = digest.digest() BigInteger bigInt = new BigInteger(1, md5) return bigInt.toString(16).padLeft(32, '0') } println md5sum(new File("md5sum.groovy"))

Groovy : 하위 디렉토리의 모든 파일 출력하기

Groovy에서 하위 디렉토리의 모든 파일을 출력하는 방법을 알아보자. 인터넷에서 검색하면 금방 나오는 내용이지만, 일단 적어둔다. new File("C:\\").eachFileRecurse { filename -> println "Filename: $filename" }