01 Dec 2017
|
리눅스 설정
Ubuntu
한글 키보드 설치
Ubuntu 14.04 LTS 버전 기준으로 한글 키보드를 설치하는 방법입니다.
System Settings
실행
Language Support
아이콘 실행
- 언어팩을 설치하라는 팝업창이 뜨면 ‘설치’ 선택
- 시스템 재부팅
- 터미널에서
sudo ibus-setup
실행
Input Method
탭 선택하고, Customize active input methods
체크 박스 활성화
- 아래의
Select an input method
리스트 박스에서 Korean
> Hangul
선택한 후 Add
버튼 클릭
- 다시
System Setting
에서 Text Entry
선택
+
버튼을 눌러 Korean (Hangul)
항목 선택
이제 기본적으로 Ctrl + Space를 눌러서 한/영 전환을 할 수 있습니다.
오른쪽 한/영키(Alt 키)를 이용한 한/영 전환
Unbuntu에서는 기본적으로 오른쪽 Alt 키가 커맨드 실행 기능으로 맵핑이 되어 있습니다. 한/영 전환 키로 활용하고 싶으면 다음과 같이 세팅하시면 됩니다.
System Settings
에서 Keyboard
실행
Shortcuts
탭 선택한 후 Typing
항목 선택
Compose Key
항목을 Right Alt
로 변경
Switch to next source
를 선택한 다음 오른쪽 Alt 키를 누르면 Multikey
라는 항목으로 값이 설정됨
21 Nov 2017
|
라즈베리파이
리눅스
파이썬
라즈베리파이에 Python 3.x 버전 설치하기
라즈베리파이에는 기본적으로 Python 2.x 버전(2.7.9)이 설치되어 있습니다. 3.x 버전을 설치하기 위해서는 터미널에서 다음과 같은 명령어를 입력해주면 됩니다.
sudo apt-get update
sudo apt-get install python3
이렇게 하면 가장 최신 버전의 Python은 아니지만(현재 3.7) 3.4.2 버전의 Python이 설치됩니다. 터미널에서 python3
라고 입력하면 3.x 버전이 실행됩니다. pip
의 경우에도 pip3
명령어로 실행해야 합니다.
21 Nov 2017
|
Python
Python에서의 변수의 범위
다른 언어들을 사용하다가 Python을 다루게 되면 변수에 대해서 헷갈리는 경우가 생기기 쉽습니다. 전역 변수, 로컬 변수 등의 개념이 Python에서는 어떻게 표현되고 있는지 살펴보겠습니다.
a = [1, 2, 3]
print(a)
def func():
a = [4, 5, 6]
print(a)
if __name__ == '__main__':
func()
print(a)
위 코드의 실행 결과는
[1, 2, 3]
[4, 5, 6]
[1, 2, 3]
입니다. a
라는 이름의 전역 변수가 정의되었고, func()
함수 안에서 a
라는 이름의 지역 변수가 정의되었습니다. 함수 내부에 있는 코드가 배열 a
에 새로운 값을 대입하라는 의미가 아니라 지역 변수를 선언하는 코드입니다.
만약 함수 func()
내에서 전역 변수 a
를 사용하고 싶은 경우에는 다음과 같이 작성해야 합니다.
def func():
global a
a = [4, 5, 6]
print(a)
19 Nov 2017
|
디자인패턴
Single Thread Execution 패턴
Single Thread Execution 패턴은 공통의 오브젝트에 대해 다수의 Thread가 작업을 할 때, 동시에 작업을 하는 것이 아니라 한 번에 하나의 Thread가 대상 오브젝트를 사용할 수 있도록 하는 패턴입니다.
하나의 Thread만 처리가능한 영역을 Critical Section 또는 Critical Region이라고 부릅니다.
Java에서는 synchronized
키워드를 이용해서 쉽게 Critical Section을 만들 수 있습니다.
예제
public class CommonObject {
private int id = 0;
private String name = "name";
private String address = "address";
public synchronized void setAttribute(int id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public synchronized String toString() {
return "(id: " + id + ", name: " + name + ", address: " + address + ")";
}
}
위와 같은 CommonObject
클래스의 인스턴스는 동시에 여러 개의 Thread가 접근하더라도 각 함수에 대해 오직 하나의 Thread만 접근을 허용합니다.
synchronized와 Lock
만약 특정 Thread가 synchronized
메소드를 실행하게 되면 해당 Thread는 Lock을 획득(Aquire)하게 됩니다. 그리고 해당 메소드를 빠져나가게 되면 Lock을 해제(Release)합니다.
Lock는 각 인스턴스마다 존재합니다. 만약 여러 개의 인스턴스를 생성했을 경우 Lock은 각각의 인스턴스마다 존재하게 됩니다.
주의점
Single Thread Execution 패턴은 다음과 같은 주의점이 있습니다.
- 복수의 Thread간 데드락(Dead Lock)이 발생할 가능성이 높습니다.
- 해당 클래스를 상속할 경우 서브 클래스에 의해 안정성이 무너질 가능성이 존재합니다.
- Lock은 Cost가 많이 드는 작업입니다. 여러 Thread에 의해 충돌이 날 문제가 없는 경우는 Lock을 사용하지 않는 것이 더 좋습니다.
- Thread간 충돌이 발생해서 성능 저하가 됩니다. 하나의 Thread가 Lock을 점유해서 다른 Thread들이 작업을 대기하고 있는 것을 충돌(Conflict)라고 합니다. Lock을 너무 많이 사용하게 될 경우 Multi-Thread 환경의 장점이 사라지고 단일 Thread를 사용한 것보다도 더 안 좋은 성능을 낼 수도 있습니다.
19 Nov 2017
|
용어
네트워크
TCP/IP 프로토콜에 대한 이해
TCP/IP 프로토콜 개념은 1973년 LAN 영역과 WAN 영역이 등장하면서 나왔습니다. 그 이후 인터넷 공간의 확장, 대역폭의 확대 및 기술의 발전으로 다양한 기능들이 추가되었습니다.
TCP/IP 방식의 계층적 구조
현재 TCP/IP 프로토콜은 4계층으로 이루어진 구조로 되어 있지만, 일반적으로 설명할 때는 아래의 5계층 구조로 설명하고 있습니다.
계층 구분 |
프로토콜 종류 |
응용 |
FTP, SSH, Telnet, SMTP, DNS, DHCP, HTTP, POP3, SNMP, SSL 등 |
전송 |
TCP, UDP |
네트워크 |
IP, ICMP, IGMP, ARP, RARP |
데이터 링크 |
이더넷, PPP 등 |
물리 |
|
TCP와 UDP
버퍼링(Buffering)과 단편화(Fragment) 유무에 따라 TCP/IP 프로토콜의 전송 방식을 TCP와 UDP 방식으로 나누고 있습니다. 버퍼링과 단편화가 있을 경우 TCP 방식이라고 하며, 없는 경우는 UDP 방식이라고 합니다.
버퍼링은 데이터를 전송하는 동안 일시적으로 해당 데이터를 메모리에 보관하는 것을 말하며, 단편화는 전송 데이터를 분할한다는 뜻입니다. 즉, TCP 방식에서는 해당 데이터를 여러 개의 조각으로 나누어서 전송합니다.
UDP 방식은 버퍼링이 없기 때문에 데이터 송신자와 수신자 사이에 상호 제어 절차가 존재하지 않습니다. 즉, 데이터가 발생하는 즉시 전송이 되며, 따라서 UDP 통신을 비연결형 전송이라고 부르고 있습니다.
TCP 방식의 경우 버퍼링과 단편화가 있기 때문에 송신자와 수신자간 상호 제어 절차가 필요합니다. 수신자의 데이터 수신 가능 여부를 묻기도 하며, 데이터의 전송 여부를 확인해서 오류가 발생한 경우 데이터 재전송도 해줍니다.
포트 번호(Port Number)
포트 번호는 TCP/IP 응용 계층의 수많은 프로토콜 및 서비스에 대한 고유 식별 번호입니다. 16비트로 이루어져 있기 때문에 0번부터 65,535번까지 존재합니다. 0번부터 1,023번까지는 ‘Well-Known Port Number’라고 부르며 주로 서버측에서 사용합니다. 1,024번 이후의 포트 번호는 주로 클라이언트 측에서 사용합니다.
구분 |
명칭 |
비고 |
0 ~ 1,023 |
Well-Known Port Number |
주로 서버에서 사용 |
1,024 ~ 49,151 |
등록 포트 번호 |
주로 클라이언트에서 사용 |
49,152 ~ 65,535 |
사설 또는 동적 포트 번호 |
주로 클라이언트에서 사용 |