튜링 완전(Turing Completeness)

|

튜링 완전(Turing Completeness)라는 단어가 있습니다. 형용사적인 표현으로 Turing Complete라는 표현을 쓰기도 하는데, 어떤 뜻이 있는지 포스팅해보도록 하겠습니다.


튜링 머신

1936년 수학자 앨런 튜링(Alan Mathison Turing)이라는 사람이 제시한 개념입니다. 계산하는 기계라는 설명하기 위한 단어로, 원래는 Automatic에서 따온 a-machine이라고 명칭했지만, 앨런 튜링 사망 이후 창시자의 이름을 따서 ‘튜링 머신’이라고 부르기 시작했습니다.

튜링머신은 다음과 같은 구성 요소로 이루어져 있습니다.

  • 테이프(Tape) : 일정한 크기의 셀(Cell)로 이루어져 있으며, 길이는 무한
  • 헤드(Head) : 테이프를 읽어들이는 헤드, 테이프의 위치간 이동이 가능
  • 상태 기록기(State register) : 현재 튜링 머신의 상태를 기록하는 장치
  • 행동표(Action Table) : Instruction Table이라고도 하며, 특정 조건에서 수행해야 할 행동을 기록함


대략적인 예시를 들면 다음과 같습니다.

  • 현재 상태가 'A'인데 테이프에서 '1'이라는 값을 읽으면 상태를 'C'로 하고 테이프 한 칸 전진
  • 현재 상태가 'B'인데 '100'이라는 값을 읽으면 상태를 그대로 하고, 테이프 한 칸 전진


현재의 컴퓨터는 Turing Complete

현재의 컴퓨터들은 대부분 Turing Complete하다고 할 수 있습니다. 하지만, 엄밀히 따지면 보통 메모리의 한계 등이 있기 때문에 Turing Completeness에 가깝다고 하는 것이 더 정확할 것 같습니다. 과거에는 Turing Complete하지 않은 컴퓨터도 있었다고 합니다.


프로그래밍 언어

Turing Completeness는 오히여 프로그래밍 언어에서 더 많이 사용됩니다. 하지만, 우리가 자주 사용하는 대표적인 언어들인 C, Java, Python 등은 Turing Complete한 언어입니다. 보통 대표적으로 다음 기능을 갖고 있으면 Turing Complete하다고 합니다.

  • Conditional Branch : 조건 분기문을 가질 수 있어야 합니다. IF 문 또는 FOR, WHILE 등의 반복문 또한 여기에 해당합니다.
  • 메모리의 임의 위치의 값을 변경할 수 있어야 한다.

이 두가지 기능을 갖고 있으면, 우리가 사용하는 거의 모든 기능들을 위 기능의 조합으로 만들어낼 수 있다고 합니다.

대부분의 언어들은 Turing Complete한 성격을 갖고 있습니다. 그럼 Turing Complete하지 않은 언어들은 무엇이 있을까요? 특수한 목적을 갖고 있는 스크립트(Script)언어들이 여기에 해당합니다. HTML이나 SQL, XML 등의 언어를 예로 들 수 있습니다.

퍼블릭 블록체인 vs 프라이빗 블록체인

|

블록체인의 종류는 그 성격에 따라 크게 3가지 형태로 나눌 수 있습니다.

  • 퍼블릭 블록체인(Public Blockchain)
  • 프라이빗 블록체인(Private Blockchain)
  • 컨소시움 블록체인(Consortium Blockchain)


퍼블릭 블록체인(Public Blockchain)은 이름 그대로 누구나 쉽게 네트워크에 참여할 수 있는 블록체인으로 대표적으로 비트코인(Bitcoin)이나 이더리움(Ethereum)을 예로 들 수 있습니다.

프라이빗 블록체인(Private Blockchain)은 하나의 기관에서 독자적으로 블록체인을 운영하는 것이고, 컨소시움 블록체인(Consortium Blockchain)은 여러 기관들이 컨소시움을 이루어서 블록체인을 같이 운영하는 것을 말합니다. 프라이빗과 컨소시움은 그 성격에서 상당 부분 비슷하기 때문에 일반적인 경우에서 둘을 엄격하게 나눌 필요는 없을 것 같습니다.


퍼블릭 블록체인

퍼블릭 블록체인은 누구나 참여할 수 있고, 또 누구나 운영할 수 있습니다. 즉, 운영 주체가 광범위하기도 하면서 또 불분명하기 때문에 법적 구속력에 상대적으로 자유롭습니다. 그리고 누구나 데이터를 읽을 수 있기 때문에 투명성 또한 더 크게 보장이 되는 장점도 있습니다.

하지만, 모든 노드들이 참여를 하기 때문에 각 트랜잭션의 내용은 모두에게 공개되며, 검증 또한 모든 노드들이 참여하기 때문에 성능이 저하될 수 있다는 단점이 있습니다. 또한 악의적인 의도를 가진 해커들도 손쉽게 참여할 수 있기 때문에 이러한 상황을 방지하기 위한 연산 또한 추가적으로 수행해야 하기 때문에 성능적인 저하는 더더욱 발생할 수 밖에 없는 구조로 되어 있습니다. 참고로, 비트코인의 경우 10분마다 1개의 블럭이 생성되며, 이더리움의 경우 12초마다 1개의 블럭이 생성되고 있습니다.

또한 블록체인의 엔진 수정이 어렵습니다. 참여하고 있는 많은 사람들의 동의를 얻어서 겨우겨우 수정을 할 수는 있지만, 그 과정이 오래걸리거나 복잡할 수 있습니다. 또한 심각한 경우 하드포킹(Hard-fork)등의 문제가 발생해서 해당 네트워크가 분기되는 상황이 발생할 수도 있습니다.

또한 퍼블릭 블록체인에서는 흔히 코인(Coin)이라고 불리우고 있는 내부 화폐가 필요합니다. 분산합의 후 블럭을 생성하기 위해 신뢰할 수 있는 노드를 선택하고 검증하는 단계가 필요한데, 이러한 작업을 위해서는 수고에 대한 댓가가 필요하기 때문입니다. 여기 쓰이는 화폐는 마이닝(Mining)이라고 불리우는 채굴 과정을 통해서 획득할 수 있습니다.


프라이빗 블록체인

프라이빗 블록체인은 퍼블릭 블록체인과 정반대의 장단점을 가지고 있습니다. 운영주체가 명확하기 때문에 법적인 규제를 준수해야 합니다.

하지만 노드간 권한을 다르게 설정할 수 있고, 허가받은 대상들만 노드로 참여할 수 있기 때문에 퍼블릭 블록체인에 비해 상대적으로 적은 노드수를 운영하게 되며 이는 성능 향상으로 이어지게 할 수 있습니다.

또한 블록체인 엔진을 수정하는데 드는 비용도 상대적으로 저렴하고, 블록체인에 참여한 각 노드들의 권한들도 다르게 설정할 수 있기 때문에 운영상의 자유도도 보장이 되는 등 여러 가지 장점들이 있습니다.


퍼블릭 블록체인 vs 프라이빗 블록체인

다음은 퍼블릭 블록체인과 프라이빗 블록체인을 비교한 표입니다.

image -fullwidth

image -fullwidth

Windows 10 - 어플 실행 단축키 추가

|

어플 실행 단축키 추가

Windows 10에서 단축키를 등록하는 방법입니다. 저는 화면 캡쳐 기능을 상당히 많이 사용하는 편인데 마음에 윈도우 기본 캡쳐 기능은 아쉬운 부분이 많습니다. 그래서 저는 무료 프로그램인 반디카메라를 애용하고 있었는데, 최근에 Picpick로 변경했습니다. 하지만, 아래 예제는 예전에 작성했던 글이기 때문에 반디카메라의 단축키를 설정하는 이미지로 대신하도록 하겠습니다.

먼저, 반디카메라 프로그램을 시작메뉴에서 찾습니다.

image

그리고, 반디카메라 실행 아이콘을 마우스 오른 버튼을 눌러 ‘속성’ 항목을 눌러줍니다.

image

속성창에서 ‘바로 가기 키’를 등록할 수 있습니다.

Windows 10 - 터치패드의 3손가락 제스처 변경

|

터치패드의 3손가락 제스처 변경

맥북 트랙패드를 쓰면서 가장 편리했던 것 중 하나가 3 손가락을 이용해서 데스크탑을 전환하는 기능이었습니다. Windows 10에서 거의 비슷하게 설정할 수 있습니다. 물론 멀티 터치가 지원되는 터치 패드만 가능합니다. MS 서피스나 삼성 갤럭시 북 등은 적용할 수 있습니다.

먼저

image

‘마우스 및 터치 패드 설정’ 창을 엽니다.

그리고, 설정 창 안에서

image

3 손가락과 4 손가락 제스처의 설정값을 서로 바꾸면 됩니다.

이제 3 손가락 제스처로 가상 데스크탑 전환을 할 수 있습니다. 개인적으로 가상 데스크탑 자체는 맥북보다 Windows가 더 편리하게 제공하는 것 같습니다.

Python 2.7.x vs Python 3.x

|

Python 2.7.x 버전과 Python 3.x 버전의 차이점을 간단하게 적어봅니다. 생각보다 많은 것들이 바뀌어서 혼란을 가져올 수 있는 부분들이 꽤 있습니다. ‘두 버전 중에 어느 버전이 더 좋은건가’라고 하면 아무래도 좀 더 많은 부분이 개선된 3.x 버전을 사용하는 것이 더 좋습니다. 하지만, 2.7.x 버전도 많이 사용하고 있고 시중에 나와 있는 많은 교재들도 2.7.x 버전 위주로 설명하고 있는 부분이 많아서 버전별 차이점은 조금 알고 있어야 할 것 같습니다.

Python Wiki에 따르면 다음과 같은 경우에는 2.7.x 버전을 사용하는 것이 더 좋다고 설명하고 있습니다.

  • 개발한 내용을 어딘가에 배포할 때, 그 환경을 제어할 수 없는 경우(예를 들어 2.7.x 버전만 사용가능한 환경인 경우)
  • 특정 라이브러리나 유틸리티 등을 사용할 때, 해당 라이브러리가 3.x 버전을 지원하지 않는 경우

즉, 대부분은 그냥 3.x 버전을 사용하는 편이 더 나을 것 같습니다.

자, 그럼 Python 2.7.x 버전과 Python 3.x 버전의 차이점을 살펴보도록 하겠습니다. 더 많은 정보는 여기를 참조하시길 바랍니다.


Python 2.7.x과 Python 3.x의 차이점

print

Python 3.x 버전은 print 문에 대해 괄호를 필요로 합니다.

예를 들어, 2.7.x 버전에서는 다음과 같은 코드를 사용할 수 있었습니다.

print 'Hello, Python!'
print('Hello, Python!')
print "Hello",;
print 'snowdeer'

하지만, 3.x 버전에는 무조건 괄호가 있어야 하며, 다음과 같이 작성해야 합니다.

print('Hello, Python!')
print("Hello ", end="")
print 'snowdeer'


자동 형 변환

Python 2.7.x 버전에서는 자동으로 형 변환을 하지 않지만, 3.x 버전에서는 자동 형 변환을 지원합니다.

예를 들어, 다음 코드의 실행 결과는

print ('3 / 2 =', 3 / 2)

2.7.x 버전에서는 ‘1’ 이 출력되지만, 3.x 버전에서는 ‘1.5’가 출력됩니다.


인코딩

Python 3.x 버전 부터는 소스 코드의 인코딩이 기본적으로 ‘utf-8’이기 때문에 소스 코드 첫 줄에 다음과 같은 라인이 생략되어져도 됩니다.

# -*- coding: utf-8 -*-


input

Python 2.7.x에서 사용자 입력은 다음과 같은 함수를 사용했었습니다.

name = raw_input("input name:")

하지만 3.x 버전에서는 다음 함수를 사용하면 됩니다.

name = input("input name:")


Exception Handling

Python 2.7.x 버전에서는 예외 처리 코드를 다음과 같이 사용했다면,

print 'Exception Handling'
try:
    let_us_cause_a_NameError
except NameError, err:
    print err, '--> our error message'

 

3.x 버전에는 다음과 같은 코드로 사용해야 합니다.

print 'Exception Handling'
try:
    let_us_cause_a_NameError
except NameError as err:
    print(err, '--> our error message')