람다 피클

파이썬에서 lambda함수는 pickle이 안된다. pickle이 뭔지는 나도 모른다.(!)

아무튼 lambda를 포함한 클래스를 multiprocessing을 하려고 시도했더니 pickle이 안된다면서 오류를 내뿜길래 다음과 같이 조치하였다.

원래: lambda y: SomeExpressionOfY(y)

참고로 이건 f=lambda y: SomeExpressionOfY(y) 처럼 이름을 붙여줘도 오류가 난다. 다음과 같이 명시적으로 정의해야 한다.

조치후:

def f(y):

return lambda y: SomeExpressionOfY(y)

왜 이렇게 하였는가?

사실 저 lambda 자리에 들어가야 할 것이 eval(“lambda y: …”)인 구문이기 때문이다. 물론 eval을 쓸 경우 해킹에 취약해진다는 문제가 발생하지만, 지금 구현중인 코드에서는 eval을 쓰지 않으면 매스매티카 급의 수식 파서를 만들어야 하는 문제가 생겨서 써야만 했다. 어차피 나 혼자 쓰거나, 배포하더라도 그걸 해킹해서 뭐하게 수준의 프로그램이라 별 문제는 없을 것으로 보인다.

수치해석 커리큘럼

수치해석 커리큘럼

  1. 수치해석의 소개
  2. 수의 표현
    1. 리틀 엔디안, 빅 엔디안
    2. 8비트, 16비트, 32비트, 64비트 표현형
    3. 정수형: 부호, 비트 수
    4. 실수형: 부호, 비트 수, 유효숫자
    5. 0과 무한대
    6. 타입 캐스팅: 암묵적, 명시적
    7. 포맷 스트링
  3. 오차
    1. 오차의 표현
    2. 오차의 전개
  4. 알고리즘
    1. 알고리즘의 조건
    2. 좋은 알고리즘의 조건
    3. 복잡도 표기법
    4. 시간복잡도, 공간복잡도
    5. 수렴성
    6. 알고리즘을 만드는 방법
  5. 수의 사칙연산
  6. 근찾기
  7. 선형대수학
  8. 상미분방정식
  9. 편미분방정식
    1. 타원꼴
    2. 포물선꼴
    3. 쌍곡선꼴
  10. 푸리에 변환, 빠른 푸리에 변환

파이썬 커리큘럼

파이썬을 배울 때 뭘 어떻게 찾아봐야 하는가?

  1. 파이썬의 (간략한) 역사
    1. 다른 언어와 비교할 때 파이썬의 특징
  2. 파이썬 설치하는 방법.
    1. 파이썬2? 파이썬3?
    2. 공식 리포지토리
    3. 인텔 파이썬
    4. pip
    5. numpy, scipy 등 추가 패키지 찾기, 설치하기
    6. (옵션) 리눅스, 맥에서는?
  3. 커맨드라인 파이썬 실행방법
  4. 파이썬 개발용 IDE 선택하기 및 설정하기
    1. geany
    2. IDLE
    3. 그 외
  5. 기초 문법
    1. Hello, world!
    2. 파이썬에서 들여쓰기에 관하여
    3. 주석 달기
    4. 한글 사용
    5. 변수, 함수, 클래스에 이름을 지어주는 방법
    6. 변수
      1. 변수의 선언
      2. 변수의 사용법
      3. 변수에 값 집어넣기와 값 복사하기
      4. 변수의 종류(type)
        1. 타입 지정, 타입 변환
      5. 리스트, 딕셔너리, 튜플
        1. 리스트의 사용법
          1. 시작은 0부터
          2. 가운데만 골라내기
          3. -1번째 요소
          4. 리스트에 사용할 수 있는 연산자 +, *
          5. 리스트의 메소드
          6. range
        2. 딕셔너리의 사용법
          1. 딕셔너리의 메소드
        3. 튜플의 사용법
          1. a, b = c, d
          2. 튜플의 메소드
        4. in
      6. 문자열 사용법
        1. escape 문자열
        2. 제어문자
        3. 문자열의 메소드
      7. 숫자
        1. 실수와 정수의 차이 – 점(.)을 찍는가 찍지 않는가
        2. 복소수 사용법
        3. 사칙연산 +, -, *, –
        4. 지수연산 **
        5. 나머지연산 %
        6. 크기 비교
        7. +=, -=, *=, /=
        8. 타입이 다른 숫자들 사이의 연산
        9. 연산자 우선순위
    7. 조건문
      1. True, False
      2. if, else, elif
      3. 연산자 “==”
      4. not, and, or
    8. 반복문
      1. for
      2. while
      3. break
      4. continue
    9. 예외처리
      1. try
      2. except
      3. error객체
      4. finally
      5. pass
    10. 함수
      1. 함수의 선언
      2. 함수의 사용법
        1. 변수의 전달 arg, kwds
      3. return을 쓰자
    11. 파일 다루는 방법
      1. 파일 만들기, 열기, 닫기
      2. 읽기, 쓰기, 추가하기
      3. 텍스트 파일, 바이너리 파일
      4. 파일이름과 경로명 다루기
    12. eval
    13. lambda
    14. map
    15. reduce
    16. filter
    17. 클래스
      1. 클래스와 객체와 인스턴스
      2. 클래스의 선언
      3. 클래스의 사용법
        1. 초기화
        2. 멤버변수(프로퍼티)
        3. 멤버함수(메소드)
        4. 클래스의 상속
          1. 다중상속
          2. self, parent
        5. 다형성
        6. 멤버 은폐하기(encapsulation)
    18. 라이브러리 불러오기 “import”
      1. 일부만 불러오기 “from”
      2. 이름 바꾸기 “as”
    19. 연산자 오버로드
  6. GUI 프로그래밍 – wx
    1. GUI 디자인 툴
    2. 창 만들기
    3. 텍스트 칸
    4. 버튼
    5. 메뉴바
    6. 아이콘
    7. 이벤트 사용
    8. 마우스 클릭
  7. 정규표현식
  8. 멀티스레딩, 멀티프로세싱
    1. 스레드와 프로세스
    2. 해보기
    3. 메시지 큐
    4. 변수 전달
    5. 전역 잠금
    6. 동기화
    7. 멀티프로세싱에서 lambda
  9. numpy, scipy 사용법
  10. C언어 가져오기
    1. ctypes
    2. SWIG
  11. 하드웨어 제어하기
  12. 디버깅
  13. 파이썬 코드 최적화 기법
  14. 남에게 배포하기 “py2exe”

자유란

너무 급진적인 생각인지도 모르지만 단상을 하나 적어둔다.

사람은 다른 사람에게 자신의 사상을 강요할 권리는 일반적으로 없지만, 자신의 사상을 강요할 자유는 있다. 물론, 그렇게 강요받는 당사자 역시 자신의 사상을 바꾸지 않을 자유가 있고, 관철시킬 자유가 있으며, 자신에게 사상을 강요하는 자에게 거꾸로 본인의 사상을 강요할 자유 역시 갖고 있다. 인간은 평등하니까. 하지만 많은 사람들이 자기가 갖고 있는 자유는 생각하면서 남들이 갖고 있는 자유는 생각하지 못하는 것 같다.
이 상태를 생각하고나면 떠오르는게, 사람들이 만나서 서로 자기의 사상을 강요하면 서로 괴로우니까 자기 생각을 적당히 숨기고, 적당히 다듬어서, 서로 괴롭지 않은 상태를 유지하기 위한 사회적 규칙이 생각난다. 도덕, 예절, 윤리, 그런 것들이다.
이것들을 자신의 마음, 생각, 욕망, 사상에 솔직하지 않은 것이라 생각한다면, 그렇게 생각하는 것 또한 그 개인의 자유이다. 그리고 다시한번 말하지만, 그 생각을 그렇다고 다른 사람들에게 말하고 다니는 것도 전달하는 것도 강요하는 것도 그 개인의 자유이다. 하지만, 그러니까 다시 한번 말하지만, 보다못한 다른 사람이 그에게 닥치라고 말할 수 있다는 것 역시 자유에 포함된다는 걸 알고는 있었으면 좋겠다. 그런게 기분나쁘더라도 화내지 말라는 것은 아닌데, 최소한 자신의 자유와 모든 사람이 평등하다는 것을 알기라도 했으면 좋겠다.

의견을 관철하기

  • 잡설

자신의 의견을 관철시키는 것은 인생에 있어서, 어쩌면, 가장 중요한 일이라고 할 수 있다. 인생은 자기 자신의 선택과, 자기 자신에게 주어진 환경이라는 두가지 원인을 바탕으로 미래가 결정된다. 선택은 필연이고 환경은 우연이다. 자신의 선택과, 그를 바탕으로 한 노력은 큰 이득을 볼 수 없지만 꾸준히 결과를 쌓아갈 것이고, 우연히 주어진 환경과 운 좋게 다가온 기회는 큰 이득을 주겠지만 결과를 기대할 수 없다. 운이 없다면 살면서 단 한번도 기회가 오지 않을 수도 있기 때문이다. 노력하지 않으면 성공할 수 없겠지만, 성공하지 못했다고 노력하지 않은 것은 아니다.

자신의 의견을 관철시키는 것은 성공하기 위해 해야 하는 가장 적극적인 방법 중 하나일 것이다. 나는 자연현상을 연구하면서 내가 생각하는 가설이 세상을 설명한다고 주장하며, 그 주장을 관철시키기 위해 증거를 찾아내야 한다. 그 증거를 찾아내기 위해 다양한 방법을 사용해야 하고, 그걸 왜 사용해야 하는지 역시 다른 사람들에게 관철시켜야 한다.

사람들은 자신의 의견을 관철시키기 위해 투쟁한다. 온갖 방법을 써서 외친다. 그것이 다른 사람의 맘에 들지 않을 수도 있고, 그것을 관철시키는 것을 방해하는 것이 다른 사람의 의견일 수도 있다. 어떤 사람들은 유사과학을 외칠 수도 있고, 누군가는 사기를 칠 수도 있다. 소수자 인권을 외칠 수도 있고, 돈이 최고라고 주장할 수도 있다.

그런 수많은 투쟁들 속에서 살아가다가, 어떤 사람은 힘이 없고, 어떤 사람은 소심하고, 어떤 사람은 자신이 없어서 패배할 수 있다. 아마 대부분의 시도와 노력은 실패로 돌아갈 것이다. 자신이 할 수 있는 선택이 포기하느냐 마느냐밖에 없는 상황에 처할 것이다. 포기할수도 없고 포기하지 않을수도 없는 절대적인 상황에 처할 것이다.

모든 것을 혼자 해야 할 것 같다는 생각이 들 것이다. 세상에 내던져진 입장에서 이 모든 인생을 나 혼자 해내야 하고, 아무도 나를 도와주지 않을 것이다. 도와달라고 말해도 아무도 도와주지 않을 수도 있다. 하지만 도와달라고 말하는 것 또한 시도이고 도전이다. 혼자서 해낼 수 없는 일이라는 생각이 들면 도와달라고 하고, 다른 사람이 도와달라는 말에 도와주는 사람도 있게 마련이다. 물론 도와주는 사람이 아무도 없을 수도 있다. 도와주겠다는 사람을 만나지 못할 수도 있다. 아무리 많은 사람들이 도와줘도 해내지 못할 수도 있다. 하지만 그래도 말해야 한다.

다른 사람한테 도와달라고 말해도 된다는 사실을 아무도 가르쳐주지 않을 수도 있다. 그런 사실을 알고 있더라도 사람들은 스스로 해내기를 좋아하고 자신이 해냈다는 걸 자랑하고 싶어한다. 하지만 꼭 하고 싶은 일이 있고, 반드시 해내야 하는 일이 있을 때, 누군가의 도움으로 해결할 수 있는 일이라면 도와달라고 부탁해야 한다.

반론이 있을 수 있다. 인맥을 이용해 청탁을 한다거나, 뇌물을 주면서 행정적인 처리를 부탁한다거나, 그런 부탁도 하라는 말이냐? 내 주장에서는 그런 것 역시 포함될 것이다. 수단과 방법을 가리지 않고 자신의 성공을 위해 그렇게 해야 할 수도 있다. 하지만, 불법적인 일에는 누군가 피해자가 있을 것이고, 그 피해자 역시 자신의 피해 구제를 위해서 적극적으로 노력할 것이다. 그런 피해자를 도와주는 사람 역시 있을 것이다.

싸우자. 해야 할 일이 있고, 해내야 할 일이 있으면 끝까지 싸우자. 이기지 못해도 싸워야 할 것이다. 사람들은 그렇게 도와달라고 말하고, 도와주고, 서로 도움을 주면서 살 것이다.

인공지능과 자아복제의 문제

간단한 생각이다. 앞으로 인공지능 기술이 발전하여, 어떤 개인의 행동패턴, 언어습관, 지식 등을 학습시키면 그 사람처럼 행동하는 어떤 프로그램을 만들 수 있을 것이다. 여기까지는 시간의 문제일 뿐 기술적 문제는 아니라고 생각한다. 그런데 문제는 그렇게 되었을 때 그 개인의 자아는 그렇게 인격이 복사된 프로그램을 자아로 인식할 수 있을 것인가. 일단은 불가능해 보이는데, 만약 뇌-기계 인터페이스가 보다 진보된 형태로 나타난다면 가능할 수도 있다.

이 문제에 대해서 공각기동대에서는 ‘고스트’라는 개념을 도입해서 해결하고 있지만, 과연 현실에서도 고스트라는 것이 실존할 수 있을지는 의문이다.

이렇게 해서 어떤 인격이 자동화된 프로그램으로 나타날 수 있게 되면, 본인이 죽더라도 그 주변의 사람들은 본인이 살아있을 때와 마찬가지로 그와 상호작용하면서 마치 그가 살아있는 것 처럼 느끼고 생각할 수 있을 것이다. 그렇다면 이 프로그램에는 인격을 부여해야 하는가 말아야 하는가.

만약 기술과 사회가 고도로 발달하여 위와 같은 인격적인 프로그램들만 다수로 남게 된 세상에서 인간은 어떤 형태로 남아있을 것인가.

블록체인의 미래

암호화폐가 화폐로써의 실질적 기능이 가능한가 아닌가는 블록체인에 분산저장되어 있는 거래내역을 정부 또는 법원이 믿는가 믿지 않는가에 달려 있다. 시스템으로써는, 그리고 알고리즘으로써는 블록체인의 무결성과 신뢰성이 확실하지만, 어쩄든 그걸 믿느냐 마느냐는 법원의 판단이니까. (그런점에서 미래의 법관과 공무원 꿈나무들 중에 코인판에 돈 좀 부어본 친구들이 많을 수록 블록체인과 암호화폐의 미래는 “어쨌든” 밝다. 그때까지 버틸 수 있느냐는 다른 문제지만.)

블록체인, 암호화폐, 플랫폼의 미래

(*이 글에서 주장하는 부분들은 기억에 근거하고 있으며, 누군가 근거를 제시하라고 하면 검색해서 찾아볼 수는 있습니다. 이 글이 학술논문은 아닌고로, 혹시 주장의 근거가 필요하신 분은 댓글로 요청하시면 찾아다 드리겠습니다.)

최근 비트코인을 비롯한 수많은 종류의 암호화폐가 등장하고 있고, 많은 사람들이 여기에 대량의 돈을 퍼부으면서 투자(또는 투기)를 하고 있다. 암호화폐는 그 기술적 배경으로 블록체인이라는 것을 두고 있다. 블록체인이란 간단히 말해서 거래 과정이 거래에 참여한 모든 참가자들에게 분산저장되는 구조이다. 기술적으로는 암호화 기술과 작업증명이라는 용어를 써서 설명하고 있지만, 쉽게 말해서 암호화폐를 갖고 있는 모든 참가자 각각이 거래 장부의 사본을 갖고 있는 것을 컴퓨터 기술을 이용해 구현했다고 보면 된다.

결론을 먼저 말하자면, 나는 여기에 컴퓨터와 인터넷이라는 것의 개념을 바꿀만한 혁신적인 요소가 담겨있다고 생각하며, 인터넷은 이제 개인의 정보교류를 위한 플랫폼을 넘어서서 거의 공기나 물과 같은 수준으로 인간에게 필수적인 요소가 될 것으로 본다.

암호화폐를 사용할 때의 금전적 보상, 이득, 그리고 그에 대한 가치 평가와는 별개로, 거래에 참여한 사람들에게 보상이 저절로 돌아가면서 중앙집중식 처리 체계가 가지는 단점을 극복할 수 있는 블록체인 기반 분산처리 기술이 미래에 등장할 여러 플랫폼 중에서 지배적 위치를 차지할 것은 분명해 보인다. 어떻게 그렇게 되는 것인가? 중앙집중식 처리 체계는 중앙의 메인 서버에서 이용자가 요구하는 모든 상호작용의 모든 세부 과정을 관리한다. 이 체계는 메인 서버를 관리하는 관리 주체를 얼마나 믿을 수 있느냐에 따라 그 신뢰성이 정해진다. 가령, 국가라든가 은행이 그 과정을 통제하는 업무는 국가나 은행이 망하지 않는 한 그 상호작용과 자료에 관한 기록을 믿을 수 있다. 그리고 이 체계는 법적인 구조 위에 얹어져 있는 상태이므로, 이 체계를 관리하는 관리자나 소속 직원들이 고의나 과실에 의해 손해를 끼치게 되더라도 그들이 처벌을 받고 피해에 대해 보상 받을 것이 법에 의해서 보장된다. (물론 딱 법에 의한 만큼만 보장된다.) 문제는 이보다 작은 규모의 주체가 관리하는 서버에 대해서는 그만큼 안정성과 신뢰성이 줄어든다는 점이다. 가령, 이제는 없어진 이메일 서비스들에 저장되어 있던 이메일은 미리 백업을 받아두지 않았다면 더이상 복구할 수 없다. 또는, 우리나라의 전자책 업체에서 구입한 책들은 DRM이 붙어서 특정한 프로그램에서만 볼 수 있도록 되어 있는데, 만약 해당 전자책 업체가 없어지거나, 서비스를 못하겠다고 한다면 우리는 더이상 그 전자책을 볼 수 없고, 아마 환불도 받을 수 없을 것이다. 이렇게 없어지는 경우가 아니라 하더라도, 해당 서버에 서비스 거부 공격(Denial of Service attack, DoS)이 들어가게 된다면 우리는 그 서비스를 사용할 수 없다. 그리고 어떤 경우, 믿을 수 있다고 생각한 정부 기관의 서버나 은행의 서버가 해킹될 수도 있고 우리는 이미 농협 사태에서 그런 상황을 마주한 적이 있다. 물론, 메인 서버에 저장되어 있는 정보가 어딘가에 백업되어 있다면 우리는 해킹을 당하더라도 백업본을 사용하여 서비스를 복구할 수 있다. 대부분의 경우 중앙 집중식 처리 체계의 백업본은 역시 메인 서버의 관리자가 적절한 방법을 사용하여 생성하여 잘 보관하고 있겠지만, 이 경우에도 관리자가 서버를 복구하고 서비스를 재개할 때 까지는 해당 자료나 서비스의 사용이 불가능해진다. 만약 이 백업본을 모든 사람이 갖고 있다면 어떻게 될까? 해커는 특정 서버 하나의 취약점을 공략하는 것 뿐만 아니라 해당 백업본을 가진 모든 사람을 동시에 공격해야 한다. 그리고 그렇게 하는 것이 하나만 공격하는 것 보다 훨씬 어렵다는 것은 당연한 일이다. 심지어 농협 해킹 사태때는 백업본까지 사라졌었다. 이런 상황에 대해, 블록체인 기술을 도입한 암호화폐는 괜찮은 해결책을 내놓는다. 모든 거래 참여자가 장부를 갖고 있고, 거래를 시도할 때 그 장부의 변조 여부를 네트워크 전체에 물어보는 것으로써 확인한다. 모든 거래 참여자가 각자 자신이 가진 장부를 똑같은 방식으로 변조할 이유는 전혀 없고, 누군가 자신의 이득을 위해 장부를 변조한다면 누군가는 반드시 손해를 보게 되므로 손해를 보기 싫어하는 대다수는 변조된 장부의 내용을 확인해 달라고 했을 때 협조할 이유가 없게 된다. 그리고 여기에 송금과 같은 화폐 거래를 하는 등의 기록 추가를 요청하면, 해당 내용이 네트워크 전체에 전달되어 거래가 성립한다. 즉, 모든 사람이 모든 사람의 거래를 투명하게 지켜보고 있음을 기술적으로 가능하게 만든 것이다. 이런 방식의 분산 처리는 이전에도 있어왔다. 예를 들어, 위키백과와 같은 참여형 백과사전의 경우 참여자가 자신의 지식을 표제어의 내용에 추가하고 보충하여 완성되고 있는데, 여기에는 일부 악의적인 이용자가 있다 하더라도 대다수의 참여자가 내용을 확인하고 다시 원래대로 고칠 것이므로 내용의 진실성과 신뢰성은 꽤 높게 유지될 것이라는 가정이 있다. 하지만 실제로는 인기가 없는 항목의 경우 악의적 이용자가 고친 내용이 틀린 내용으로 오랫동안 남아있는 등 단점이 드러나기도 하였다. 블록체인은 모든 참여자가 내용을 공유하므로 개인이 임의로 내용을 고칠 수 없어서 내용의 진실성과 신뢰성이 매우 높게 유지된다. 가령, 화물 운송의 경우에 운송이 필요한 물류와 운송에 필요한 수단을 모두 블록체인으로 유일하게 코드화하여 네트워크에 올리고 다닌다면, 운송되었다는 거래도 증명되고, 운송 과정에 필요한 기름값도 블록체인 기반의 암호화폐로 처리하여 적절히 정산되고, 과적이 되었는지 어쨌는지 체크할 수도 있다. (구체적인 기술이 어떻게 될지는 모르겠으나, 원론적으로 이런것들은 반드시 구현 가능하다.)

여기서 암호화폐 자체보다 블록체인 기술에 관심을 둬야 하는 이유는 그 가능성 때문이다. 예를 들어, 암호화폐이자 플랫폼인 이더리움의 경우 튜링 완전인 코드를 올릴 수 있는 플랫폼이다. 이것은 우리가 지금까지 컴퓨터로 하는 모든 작업을 인터넷에서 돌릴 수 있다는 뜻이다. 즉, 인터넷 자체가 하나의 거대한 컴퓨터로써 기능할 수 있음을 뜻한다! 이게 얼마나 굉장한 것이냐 하면, 예를 들어 코드를 적절히 짠다면, 제약회사에서 신약후보군을 찾기 위해서 돌리는 슈퍼컴퓨터 계산 코드를 인터넷으로 올릴 수가 있다. 그리고 여기에 작업당 단가를 산정해서 올리면, 컴퓨터가 놀고 있는 사람들은 이 단가를 받아서 계산을 대신 수행 시켜줄 수 있다는 뜻이다. 그리고 이 과정 전체를 자동화시켜서, 자기 컴퓨터가 놀고 있을 때만 그렇게 수행하고, 자기가 컴퓨터를 쓰고 있을 때는 그렇게 하지 않도록 만들 수도 있다. 이게 왜 굉장한 일이냐면, 지금 전세계에서 인터넷에 연결된 컴퓨터들 중 대부분은 아무일도 하지 않고 전기만 낭비하는 열원이다. 이걸 다 돈으로 바꿀 수 있다는 뜻이다. 그것도, 앞서 예를 들었듯이 예를 들어 신약개발이라는 새로운 실체의 제작에 도움을 주면서 말이다. 비트코인의 경우, 컴퓨터는 열심히 계산을 돌리고 사람들은 그 계산 결과를 공유하면서 돈을 거래하지만 실제로 나타난 실체는 아무것도 없고 계산 결과 그 자체에 돈으로 바꿀 수 있는 수표조각이라는 것 이상의 의미를 부여하는 것은 불가능하다. 즉, 비트코인은 본질적으로 천원짜리를 이천원에 사느냐 오백원에 사느냐의 문제를 다루는 것에 불과하다는 뜻이다. 하지만 이것이 플랫폼이 되어서 인터넷에서 코드와 자료를 다룰 수 있게 되면 혁신적인 일들이 가능해진다. 전세계의 노는 컴퓨터를 갖고 있는 사람들은 놀게 두느니 뭐라도 계산을 시켜서 푼돈이라도(=전기요금이라도) 버는 것이 나을 것이고, 계산이 필요한 수요자들은 자신의 고민거리를 인터넷에 올려서 적절한 가격으로 결과를 뽑아낼 수 있다. 쉽게 말해서, 인터넷 전체를 아마존 웹 서비스(AWS)처럼 쓸 수 있게 된다는 뜻이다.

물론 현재도 인터넷 기반의 분산처리는 가능하다. 패러랠 컴퓨팅, 클라우드 컴퓨팅, 그리드 컴퓨팅과 같은 다양한 기술을 통해서 대량의 자료와 연산을 다수의 컴퓨터에 나눠서 처리할 수 있다. 하지만 그렇게 하기 위해서 별도의 프로그램이 필요하고, 만약 상호작용에 인증 보안이 요구된다면 그걸 담보하는 인증 코드와 루틴이 추가적으로 필요하다. 필요한 메모리와 네트워크 대역폭같은게 있으면 그에 따른 최적화도 해야 한다. 하지만 이더리움과 같은 플랫폼에서 제공하는 블록체인 위의 코드와 자료를 거래하는 시스템이라면 필요한 자료의 제공과 연산에 필요한 코드의 구현에만 집중하고 그 외의 부수적인 부분을 크게 신경쓰지 않아도 된다. 전세계의 컴퓨터가 여기에 연동되어서 동참한다면, 가령 비싼 현상금이 걸린 연산이 있으면 슈퍼컴퓨터는 같은 시간동안 더 빠르게 처리하여 더 많은 수익을 얻을 수 있고, 여기에 느린 컴퓨터라고 해도 일부 참여하여 수익을 나눠가질 수 있다. 수요와 공급이 저절로 촘촘하게 채워진다. 이 상황이 빠른 시일에 도래하지는 않겠지만, 기술이 극한까지 발달할 경우 모든 사람들에게 공기와 같은 수준으로 제공될 수도 있다.

인터넷 전체가 코드와 자료를 처리할 수 있다는 것이 어째서 그렇게 의미심장한가? 공각기동대(다른 선례가 있을지도 모르지만 내가 아는게 이것뿐이라)에 보면 “인형사”라는 프로그램이 등장한다. 이 프로그램은 인공지능인데, 누군가 개발해서 생성된 것이 아니라 정보의 바다속에서 저절로 생성되었다고 스스로 그렇게 주장하고 있다. 공각기동대 내부에서 인형사가 뭔짓을 했는지는 작품을 직접 감상하도록 하고, 그렇게 될 수 있는 인터넷 전체에 뿌려진 코드와 자료는 인형사라는 존재의 출현 가능성이 열린 것이라는 생각이 든다. 그 시작은 어쩌면 자발적이지 않을 수도 있겠지만, 만약 스스로 진화하는 코드를 인터넷에 누군가 흘려보낸다면, 이 코드는 진화에 진화를 거듭해서 “언젠가는” 강한 인공지능에 해당하는 성능을 갖게 될 수도 있다. 이 시나리오가 전혀 그럴듯해보이지 않을수도 있겠지만, 강한 인공지능이 인간에 준하는 급의 지능수준을 갖는 어떤 대화형 프로그램 체계라고 한다면, 지난 45억년동안 자연이 온갖 삽질을 반복한 끝에 적어도 하나의 그러한 사례인 인간이 만들어졌다. 그것도 이 지구에 수십억 개체씩이나 생성되어있다. 인터넷 전체의 처리용량은, 처리하는 코드와 자료들이 무질서해서 그렇지 계산하는 양을 놓고 보면 인간의 두뇌에서 시냅스들이 정보를 교환하는 양에 필적할 수도 있다. 지금 그렇지 않다 하더라도 미래의 언젠가는 반드시 그렇게 될 것이다. 인간은 계속해서 더 좋은 컴퓨터를 더 많이 사려고 할 테니까. 그렇다면 스스로 진화하는 코드가 등장해서 강한 인공지능을 보여주지 말란 법도 없다. (튜링 넘버링에 의하면 어떤 하나의 수는 하나의 프로그램인데, 충분히 큰 어떤 수는 그런 인공지능에 해당하는 프로그램이 될 수도 있다. 물론 이건 내 개인적인 추측이며 수학적으로 증명가능한지는 모른다.)

 

 

ctypes 요약

살다보면 파이썬에서 C언어로 만들어진 DLL파일을 써야 할 일이 있을 수도 있다. 적어도 난 그랬다. 그래서 그걸 하기 위해 많은 해법들을 찾아보았지만, SWIG라든가, 그런것들은 나에게 도움이 되지 않았다. 그래서 ctypes를 공부했다.

일단 사용하기 위해서는 import ctypes로 불러와야 한다. 그러면 ctypes가 메모리에 적재된다.

다음 순서는 내가 사용할 DLL파일을 알려주는 것이다.

myDLL = ctypes.WinDLL(‘myDLLfile’)

위와 같이 쓰면 된다. 이 때, 이걸 사용하고 있는 파이썬 프로그램 파일(.py)의 경로에는 myDLLfile.dll 파일이 존재해야 한다. 이렇게 하면 이제 파이썬은 내가 무슨 라이브러리를 가져다 쓰고싶은건지 알게 되었다.

그 다음, DLL파일이랑 같이 주어진 헤더 파일(.h)을 살펴보고서, DLL파일에 있는 여러 함수 중 뭘 가져다 쓸 것인지 정해야 한다.

사실 헤더파일의 내용을 파이썬의 내용으로 번역하는 것과 별다른게 없는데, C언어 헤더파일에 정의된 내용은 함수의 이름, 함수가 받을 변수의 수와 형, 함수가 되돌려줄 변수의 형이 있다.

mypythonfunc= myDLL[‘MY_C_FUNC’]

위와 같은 한 줄을 적어 줘서, DLL파일의 라이브러리 중 어떤 함수를 쓰고 싶은지 적어주고, 그 함수를 내가 어떤 이름으로 쓸건지 알려주면 된다. 하지만 이것만으로는 저 함수의 모든 것을 알려준 것이 아니다.
mypythonfunc.argtypes = (ctypes.c_int,ctypes.c_double)

위와 같이 argtypes를 지정해 주는데, 이것은 이 함수가 변수로써 어떤 형식을 받을 건지 알려주는 변수이다. 근데 내가잘못 사용한건지는 모르겠지만, 변수의 수가 1개일 때는 에러가 나서 지정해주지 않았다. 지정해주지 않더라도 헤더 파일에 정의된 형으로 잘 넘어가기만 한다면 에러는 나지 않는다.

imct_initialize.restype = ctypes.c_int

restype은 함수가 되돌려주는 값의 형, 즉 반환형이다.

이렇게 하고 나면, 이제 mypythonfunc(a, b)를 가져다 쓰기만 하면 된다.

하지만, 문제가 있다. C언어에는 포인터라는 녀석이 있는데, 함수가 포인터를 통해서 자료를 주고받는 경우에는 restype을 아무리 써봐야 어쩔 수 없다. 포인터를 선언해줘야 한다.

이런 경우 argtypes에는 ctypes.c_void_p를 쓰거나, ctypes.POINTER(ctypes.c_int)를쓴다. ctypes.POINTER의 안쪽에 들어가는 변수는 실제 포인터 선언에 사용한 변수의 형을 써주면 된다.

이렇게 하고서, 만약 다음과 같이 써져 있다고 해 보자.

mypythonfunc.argtypes = (ctypes.POINTER(ctypes.c_int),ctypes.c_double)

그럼 mypythonfunc(a, b)처럼 사용할 때 a에는 포인터 변수를 넣어줘야 한다. 하지만 파이썬에는 포인터라는 개념이 없다. 그래서 만들어 줘야 한다.

일단 포인터 형이 ctypes.c_int니까 x=ctypes.c_int(0) 처럼 선언한다. 0은 초기값이다. 그런 다음 mypythonfunc(ctypes.byref(a), b) 처럼 사용하면된다. byref는 ctypes에서 “참조형 변수”로 값을 전달하는 함수이다. 이렇게 한 후 함수를 실행시키면 a의 값이 함수의 실행 결과에 따라 바뀌어 있음을 알 수 있다.

예를 들어 ctypes.c_int(4)를 4와 비교하고 싶다고 해 보자. 이걸 ctypes.c_int(4) == 4 이렇게 비교를 하자고 하면 False가 뜰 것이다. ctypes.c_int(4).value 로 그 내부의 값을 불러와야 한다. 만약 m = ctypes.c_int(4)로 선언되어 있었다면 m.value를 써줘야 파이썬에서 사용하는 값이 빠져나온다.

배열을 통째로 넘길 때는 어떻게 해야 할까?

mypythonfunc.argtypes = (ctypes.c_void_p, ctypes.c_double)

배열은 argtypes에 들어가는 경우 ctypes.c_void_p로 형을 지정해 주면 된다. 그리고 파이썬의 배열을 넣어주면 되는데, 파이썬의 배열이 C의 배열과 같을리가 없다. 그래서 이렇게 해줘야 한다

myarray = ctypes.c_int * 8

이렇게 하면 myarray는 int를 8개 가지는 type이 된다. 여기서 중요한건 myarray는 변수가 아니라 types이라는 것이다. 그 다음 함수에 값을 넣을 때는

mya = myarray(0,1,2,3,4,5,6,7) 처럼 변수를 하나 새로 만들어서

mypythonfunc(mya, b) 처럼 함수를 불러와야 한다. 이 경우에는 byref를 쓰지 않아도 참조형으로 변수가 넘어가기 때문에 mya는 함수의 실행 결과에 따라 바뀌게 된다. 만약 그 결과로 나온 mya를 다시 파이썬에서 사용하는 배열로 고치고 싶다면 list(mya)를 써서 파이썬의 배열로 바꿔줄 수 있다.

https://docs.python.org/3.6/library/ctypes.html

https://docs.python.org/2/library/ctypes.html

위의 참고문헌을 잘 읽어보고 사용하도록하자.

The final countdown

노래: Europe
We’re leaving together,
But still it’s farewell
And maybe we’ll come back
To earth, who can tell?
I guess there is no one to blame
We’re leaving ground (leaving ground)
Will things ever be the same again?
It’s the final countdown
The final countdown
Oh
We’re heading for Venus (Venus)
And still we stand tall
‘Cause maybe they’ve seen us (seen us)
And welcome us all, yeah
With so many light years to go
And things to be found (to be found)
I’m sure that we’ll all miss her so
It’s the final countdown
The final countdown
The final countdown
The final countdown
Oh
The final countdown, oh
It’s the final count down
The final countdown
The final countdown
The final countdown
Oh
It’s the final count down
We’re leaving together
The final count down
We’ll all miss her so
It’s the final countdown
It’s the final countdown
Oh
It’s the final countdown, yeah