2018년 11월 1일 목요일

상위 디렉토리의 파이썬 패키지 임포트하기


아래와 같은 디렉토리 구조를 갖는 파이썬 프로젝트가 있다고 합시다.
sample/__init__.py
sample/foo.py
tests/context.py

context.py 코드에서 상위 디렉토리인 sample 패키지를 import 하기 위해 context.py 파일에 아래와 같은 코드를 작성할 수 있습니다.
import os
import sys
sys.path.insert(0, os.path.abspath('..'))

import sample

tests 디렉토리 밑에서 아래와 같이 context.py를 실행하면 이상 없이 작동합니다.
$ python context.py
하지만 tests 상위 디렉토리에서 아래와 같이 context.py를 실행하면 에러가 발생합니다.
$ python tests/context.py

context.py 코드를 아래와 같이 수정하면 어느 디렉토리에서 실행하든지 이상 없이 작동합니다.
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import sample

히치하이커를 위한 파이썬 가이드의 프로젝트 구성하기 부분을 보던 중 영문본과 한글본이 다른 부분을 발견하여 차이점에 대해 적어 보았습니다.



사실은 한글 번역본을 보고 따라 하다가 이상하게 에러가 나길래 몇 시간 삽질해서 깨우친 내용을 적어봅니다.

2018년 2월 6일 화요일

Python 2.7 설치하기

개요

CentOS 6 에는 Python 2.6 이 기본으로 설치되어 있는데, Python 2.7 환경이 필요하여 CentOS 6 에 일반 사용자 계정으로 Python 2.7 을 설치하게 되었다.

파이썬 설치

Python 2.7.14

$ wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz
$ tar zxvf Python-2.7.14.tgz
$ cd Python-2.7.14
$ ./configure --prefix=/home/liveegg/local/python2.7 --enable-shared
$ make
$ make install

환경설정

.bash_profile
PY27=/home/liveegg/local/python2.7
export PATH=${PY27}/bin:$PATH
export LD_LIBRARY_PATH=${PY27}/lib:$LD_LIBRARY_PATH

$ source ~/.bash_profile

파이썬 패키지 관리 도구 설치

setuptools 38.5.0

$ wget https://pypi.python.org/packages/1d/80/eb09090e89f658990ee8b92c41fd4f5b04b5a07ddac121b94874473c7171/setuptools-38.5.0.zip#md5=7cb6bbde7b8bcfd9ea834aef0de15289
$ unzip setuptools-38.5.0.zip
$ cd setuptools-38.5.0
$ python2.7 setup.py install

pip 9.0.1

$ wget https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9
$ tar zxvf pip-9.0.1.tar.gz
$ cd pip-9.0.1
$ python2.7 setup.py install

2015년 1월 22일 목요일

vim 코드 주석처리 팁

vim에서 비주얼 블록을 설정한 라인을 아래와 같은 커맨드로 쉽게 주석처리 할 수 있다.
:norm i#
블록으로 설정한 라인이 모두 '#'으로 주석처리 된다.

블록을 설정한 라인의 주석을 해제하려면?
:norm x

'//' 로 주석처리 하려면?
:norm i//

주석을 해제하려면?
:norm 2x

norm은 "normal mode" 커맨드의 의미이다.
i(insert), x(delete), A(append) 등의 명령어를 실행할 수 있다.

:%norm A;
이 커맨드를 실행하면 모든 라인 끝에 ';'이 추가된다.

2014년 7월 22일 화요일

ssh remote command

ssh user@host run.sh

Non-interactive shell 을 실행한다. 이 방법은 환경변수를 로드하지 않는다.

경우에 따라서 원격 서버의 환경변수를 읽어야 하는 경우가 있는데, 아래는 Interactive shell 을 실행하는 방법으로 환경변수가 함께 로드된다.

ssh user@host bash --login run.sh

또는

ssh user@host . /etc/profile; . ~/.profile; run.sh

단, 환경변수가 /etc/profile, ~/.bash_profile, ~/.bash_login 또는 ~/.profile 등의 파일에 정의되어 있어야 한다.

환경변수를 읽어서 운영 환경인지, 스테이징 환경인지, 개발 환경인지 구분하여 다른 처리를 하고자 할때 유용하다.


2014년 3월 5일 수요일

파일시스템별 블록사이즈 조회 명령어

ext4

sudo dumpe2fs /dev/sdb1 | grep "Block size"

Block size: 4096

xfs

sudo xfs_info /dev/sdb1

meta-data=/dev/sdb1              isize=256    agcount=4, agsize=18310483 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=73241931, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=35762, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


위의 예에서 블록사이즈가 4K 인것을 알 수 있는데, 특별히 설정하지 않는 이상 4K가 기본 사이즈인 것 같다.

2014년 2월 13일 목요일

Enable NTP on the Cluster

클러스터 노드(CentOS)간 시간을 동기화하기 위해 모든 노드에 NTP 클라이언트를 구성한다.

1. NTP 설치

sudo yum install ntp
의존관계가 있는 ntpdate도 함께 설치된다.

NTP 서버로 시간 정보를 단순 쿼리하는 방법
ntpdate -q time.bora.net



2. NTP 설정

sudo vi /etc/ntp.conf

기본 서버 설정을 주석 처리하고 적당한 NTP 서버를 추가한다.
/etc/ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server time.bora.net

3. 시스템 서비스 등록

sudo chkconfig ntpd on

시스템 서비스 runlevel 확인
chkconfig --list | grep ntpd
ntpd 0:해제 1:해제 2:활성 3:활성 4:활성 5:활성 6:해제

4. NTP 시작

sudo service ntpd start

프로세스 확인
ps -ef | grep ntpd


NTP 서버 상태 쿼리
ntpq -p

2013년 6월 27일 목요일

VirtualBox Ubuntu Server Network 설정

1. /etc/network/interfaces

eth0는 NAT, eth1은 호스트 전용 어댑터를 추가한 것이다.
eth0는 인터넷 연결을 위한 인터페이스이고, eth1은 다른 버추얼 머신 및 호스트 머신과의 통신을 위한 인터페이스이다.
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface (Internet)
auto eth0
iface eth0 inet dhcp

# The secondary network interface (LAN)
auto eth1
iface eth1 inet static
address 192.168.56.102
netmask 255.255.255.0
eth1의 gateway 설정을 하지 않도록 주의한다. gateway 설정을 하면 인터넷이 되지 않는다.

2. 설정 후 라우팅 테이블 확인

위와 같이 네트워크를 설정한 후 네트워킹 서비스를 재시작하면 라우팅 테이블이 아래와 같이 설정되어 있는 것을 확인할 수 있다.
인터넷도 잘 연결되고, 다른 버추얼 머신과의 통신이나 호스트 머신으로 부터의 연결도 이상 없이 잘 된다.
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 100 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
$ ip route show
default via 10.0.2.2 dev eth0 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.102

2013년 6월 19일 수요일

Ubuntu Server DNS lookup 지연문제 해결 방법 - dnsmasq

VirtualBox에 설치한 우분투 서버로 ssh 접속을 한다거나, 우분투 서버에서 wget으로 인터넷 리소스를 다운로드 할때 초기 접속이 느려서 답답했었다.

DNS lookup이 지연되는 문제 같아 해결 방법을 찾다 보니 dnsmasq란 녀석을 발견하게 되었다.
dnsmasq는 소규모 네트워크에 DNS, DHCP 서비스를 제공하는 경량 서버다.

VirtualBox 우분투 서버에 dnsmasq를 설치하니 DNS lookup 속도가 현저하게 빨라졌다.(우분투 데스크탑 버전에는 기본으로 설치되는것 같다.)

설치와 사용은 간단하다.(아래 Joinc 사이트의 관련글 참고) http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/System_management/Dnsmasq

설치하고 나면 /etc/resolv.conf 파일의 네임서버 설정이 로컬호스트(127.0.0.1)로 자동으로 변경된다.

2013년 4월 4일 목요일

Ubuntu Server에 Oracle Java 6 JDK 설치하기

자주 있는 일이 아니라 설치할 때마다 명령어가 생각이 안나서 찾게 된다.

설치환경


  • Ubuntu 12.04 Server 32 bit
  • Oracle Java SE 6 JDK


1. JDK 다운로드

오라클 웹사이트에서 Linux x86 버전의 JDK를 다운로드 한다.
jdk-6u43-linux-i586.bin

2. 설치


$ chmod u+x jdk-6u43-linux-i586.bin
$ ./jdk-6u43-linux-i586.bin
$ sudo mkdir -p /opt/java/32
$ sudo mv jdk1.6.0_43 /opt/java/32/
$ sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/32/jdk1.6.0_43/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/32/jdk1.6.0_43/bin/javac" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/java/32/jdk1.6.0_43/bin/javaws" 1

3. 디폴트 자바 선택

 $ sudo update-alternatives --config java
 $ sudo update-alternatives --config javac
 $ sudo update-alternatives --config javaws

참고

  1. https://help.ubuntu.com/community/Java





2013년 3월 20일 수요일

passphraseless ssh

암호 입력 없는 ssh 로긴 설정

아래는 ds1 호스트에서 DSA 키를 생성한 후 ds2 호스트에 공개키를 설치하여, ds1에서 ds2로 패스워드 입력 없이 로긴하는 예이다.

ds1: DSA 키 생성과 공개키 복사

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ scp ~/.ssh/id_dsa.pub ds2:

ds2: 공개키 설치

$ cat ~/id_dsa.pub >> ~/.ssh/authorized_keys2

ds1: ssh 접속 확인

$ ssh ds2

DSA 키 생성시 비밀번호 입력을 생략했는데(-P '' 옵션), 보안상 좋은 방법이 아니다. 비밀번호를 입력하고 안전하게 관리할 수 있는 방법을 더 알아봐야 한다.

password 로그인 login