우분투(Ubuntu) 14.04 한글 키보드 설치

|

한글 키보드 설치

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라는 항목으로 값이 설정됨

라즈베리파이에 Python 설치

|

라즈베리파이에 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 명령어로 실행해야 합니다.

Scoping Rule

|

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)

Single Thread Execution 패턴

|

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를 사용한 것보다도 더 안 좋은 성능을 낼 수도 있습니다.

TCP/IP 프로토콜에 대한 이해

|

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 사설 또는 동적 포트 번호 주로 클라이언트에서 사용