에이다 러브레이스의 최초의 프로그램을 파이썬으로 구현하기

주요 메이저 프로그래밍 언어 중에서 오직 파이썬만이 상승세를 타고있다는 이코노미스트지의 기사[1]를 봤는데, 파이썬이 진짜 인기가 높긴 높은 것 같다. 뭘 했다하면 다 파이썬이다. ㅋ

에이다 러브레이스는 최초의 프로그래머로서 널리 알려져 있는 사람인데, 그녀에 대한 소소한 트리비아는 Sydney Padua[2]에 잘 나와있으니 참고 바란다. ㅎ Wolfram 선생이 와이어드지에 기고한 기사[3]에 전반적인 설명이 잘 돼 있다. 근데 글이 넘 길어서 영어 울렁증이 있으니 힘들다-_- 그녀가 기여한 업적이 과장되어 있다는 논란도 좀 있는 듯.

저번달에 그녀가 작성한 알고리즘이 담긴 책이 Moore Allen & Innocent 옥션하우스에서 95000파운드에 낙찰됐다[4]고 하는데, 아마 이 숫자는 해머 프라이스인듯 하고, 실제 지불가격은 114,000 파운드라고 한다.[5] 일반적으로 옥션에서 물건이 거래되면 해머 프라이스에서 바이어 프리미엄으로 10~30%를 더 지불한다. 초 비싸네 ㅋㅋ

그런데 그녀가 작성한 그 최초의 ‘프로그램’은 무엇을 하는 계산인가? 계산 절차를 작성한 노트가 여러 장이 있는 모양인데, 그 중에 note G에 있는 베르누이 수를 계산하는 절차가 최초의 프로그램으로 인정되는 것 같다. 근데 어떤 절차로 베르누이 수를 계산하는 건지 원본 노트를 암만 봐도 이해가 전혀 안 되던데, 이 절차를 파이썬으로 구현한 사람이 알고리즘을 설명한 글[6]을 봤다. 역시나 또 파이썬인가. ㅋ

다음 점화식을 활용해서 순차적으로 구하는 것 같다.

\displaystyle B_n = \frac{1}{n+1}\sum_{k=0}^{n-1}\binom{n+1}{k}B_k

참고로 Note G에 네 번째 계산 절차에서 v5 / v4는 오타라고 한다. 정확히는 v4 / v5가 되어야 하는데, 이걸 두고 해커뉴스[7] 사람들 중에는 최초의 버그라고 말하는 이도 있는 듯. ㅋ 최초의 ‘버그’는 패널 F의 70번 릴레이[8] 아닌가? ㅋ

.


[1] 이코노미스트 Python has brought computer programming to a vast new audience Jul 19th 2018
[2] 내 백과사전 [서평] 에이다, 당신이군요. 최초의 프로그래머 – 컴퓨터 탄생을 둘러싼 기이하고 놀라운 이야기 2018년 1월 15일
[3] 와이어드 UNTANGLING THE TALE OF ADA LOVELACE 12.22.1512:00 AM
[4] 엔가젯 Ada Lovelace manuscript and algorithm fetch $125,000 at auction 07.25.18
[5] Rare book by world’s first computer programmer sells for £95,000 (mailchi.mp)
[6] Running the first program (Enigmatic Code)
[7] What Did Ada Lovelace’s Program Actually Do? (hacker news)
[8] 내 백과사전 1947년 9월 9일, 최초의 버그가 발견되다 2013년 9월 10일

그래프 이론으로 외환시장에서 수익 내기?

해커 뉴스[1]에서 흥미로운 글[2]을 봤는데, 분량은 꽤 길지만 대단히 재미있으니 일독을 권한다. 이 블로거 뭐하는 사람인지 궁금하네. ㅋㅋ

원래 글[2]은 그래프 이론을 응용하여 문제를 해결하는 세 가지 이야기를 하고 있는데, 첫 번째 이야기가 외환시장에서 아비트리지 수익을 내는 법이고, 두 번째 이야기가 강화 학습에 관한 내용이고, 마지막이 컴퓨터 그래픽스에서 path tracingray tracing을 구현하는 법이다. 근데, 관련 지식이 없어서 첫 번째 이야기만 빼고 무슨 말인지 잘 모르겠음-_-

여하간 첫 번째 이야기 만으로도 충분히 재미있으니 볼만하다. ㅎㅎㅎ

전산 수학의 중요한 부분 중 하나인 그래프 이론은 개론 정도만 배운 적이 있는데, 어렸을 때, ramsey problem에서 R(4, 6)의 값을 구해보려고 나름 용을 쓰던게 생각나는 구만 ㅋㅋㅋㅋ 일전에 R(5, 5) 이야기[3]를 한 적이 있다.

weighted graph에서 최단거리를 찾는 방법 중에 Bellman–Ford algorithm이 있는 모양인데, 이 알고리즘은 Dijkstra’s algorithm보다 속도는 좀 느리지만, edge weight가 음수인 경우도 처리할 수 있는 장점이 있다. Dijkstra 꺼는 음수가 처리 안되는 듯 하다. 사실 pseudo-code를 봐도 Bellman–Ford 알고리즘이 잘 이해가 안 되던데-_- 어느 친절한 블로거의 설명[4]을 보니 이해가 된다. 이 자리를 빌어 감사함. ㅎㅎ

외환시장은 세계에서 가장 큰 시장이라고 하는데, 블로그의 글[2]에 따르면 일일 거래금액이 5 trillion USD나 된다고 한다. 거래 규모가 방대하므로 미미한 비율의 수익률도 매우 큰 돈이 될 수 있다.

각 통화 (USD, JPY, BTC 등등)을 그래프의 노드라고 보았을 때, 각 통화의 교환비율(즉 환율)의 로그값을 weight로 갖는 그래프를 생각해볼 수 있다. 즉, 두 통화 A, B에 대해 log B/A를 directed weight로 갖는다. 이 경우 그래프를 순환하여 weight의 합이 0이 넘거나 모자라는 path를 찾는 경우가 바로 arbitrage trade의 기회가 될 수 있는 것이다. 왜냐하면 weight의 합산은

\displaystyle \log \frac{B}{A} + \log \frac{C}{B} + \cdots + \log \frac{A}{Z} = \log \frac{A}{A}

이 되고, 이 값이 0이 되어야 완전히 효율적인 시장이 된다. 이 값이 0이 아니라면 그 경로를 따라 외환을 환전하면 (음수면 역방향) 최총적으로 본래의 통화로 돌아왔을 때, 돈이 벌리는 것이다. ㅋㅋㅋ 원래 알고리즘이 합산을 하는 거라 로그를 썼지만, 실제로 구현할 때는 그냥 곱셈으로 1과 비교하는 게 편리할 듯 하다.

근데 모든 노드에 대해 거의 실시간으로 Bellman–Ford algorithm으로 계산하여 루트를 찾아야 하는데, 얼마나 효과적일지는 모르겠다. 뭐, 매우 미미한 비율이라도 시장이 원체 크고 환전 이후에는 제자리로 돌아오기 때문에, 짧은 기간동안 레버리지를 크게 하면 버는 돈이 상당히 될 듯 하기도 하다. LTCM의 초창기 높은 수익도 미미한 아비트리지 수익률을 큰 레버리지로 올렸기 때문에 가능했으니. ㅋ

아니면 거래 속도를 더 중시한다면 외환시장대신 cryptocurrency 사이의 교환비율에 Bellman–Ford algorithm을 적용해도 가능할 듯 하다. 다양한 종류의 cryptocurrency를 취급하는 거래소 내에서 충분히 연산속도가 빠른 머신을 이용하면 아비트리지 수익이 나올 듯 하다. 다만 거래수수료가 문제일 듯. 이쪽은 한국인들이 워낙 호구[5]라서 시장이 불균형일 때가 더 많으니, 적용이 더 수월할 듯 하다. ㅎㅎ

.


[1] Dijkstra’s in Disguise (hacker news)
[2] Dijkstra’s in Disguise (blog.evjang.com)
[3] 내 백과사전 R(5,5)의 upper bound가 하나 줄어들다 2017년 3월 30일
[4] 벨만-포드 알고리즘 (ratsgo.github.io)
[5] 내 백과사전 비트코인 국내가격과 국제가격의 엄청난 차이 2017년 5월 27일

메이커스 매거진 부록 AI Maker Kit​

‘메이커스: 어른의 과학’ 이라는 잡지[1]의 부록으로 DIY 스마트 스피커가 딸려 있다고 해서 재미로 사 봤다. ㅋㅋ 라즈베리 파이까지 합친 버전이 있고 라즈베리 파이가 빠진 버전이 있다. 재생시간 4분 10초.

KT의 스마트 스피커인 ‘기가지니’의 백엔드 서버를 사용하는 것 같다. 조립한 이후에 작동을 위해서는 KT 개발자 홈페이지[2]에 등록을 해야하고, 개인사용자는 하루 500건의 쿼리가 무료로 제공된다. KT가 웬일로 이런 공익적 서비스를 제공하다니 ㅎㅎ 휴대폰 통신사를 KT로 쓰는 보람이 있구만. ㅋㅋㅋ

아무래도 구글의 DIY smart speaker kit[3,4]을 모방한 듯 한데, 어쨌든 사용자가 직접 커스터마이즈 할 수 있다는 매력이 있다. 게다가 한국어로 작동가능하다!!!!! 이게 진짜 엄청난 장점이다. ㅋㅋㅋ

‘메이커스’에 있는 그대로 따라하면 된다. 주의깊게 읽으면 컴맹도 일단은 조립해서 작동은 가능하도록 설명이 친절하게 돼 있다. 드라이버와 예제파일이 모두 포함된 라즈비안 이미지 파일은 KT의 기가지니 개발자 홈페이지[2]에서 받을 수 있다. 참고로 기가지니 개발자 포럼에서 pi3 B+에서는 작동을 안한다고 하는 사람이 있던데, 안전한 pi3 B를 사용하는 것이 좋을 듯 하다.

근데 문제는 라즈비안의 apt-get upgrade를 하는 순간에 내장 스피커가 먹통이 된다-_- 아무래도 버전문제 같은데, 여러모로 용을 써 봤지만 본인의 능력으로는 도저히 수정할 수가 없어서 apt upgrade를 못하고 있다. 드라이버만 별도로 제공[5]하긴 하는데, 이것도 역시 버전문제로 작동이 안 된다. 젠장.. 이것만 되면 메이커스에서 제공하는 킷 없이, 그냥 usb 마이크와 스피커를 연결해서 구현가능할 듯도 하다.

작동 코드는 node js를 쓰던데, 본인이 node js에 대한 지식이 전무해서 코드를 봐도 수정이 안 된다-_- 일단 stt로 입력받은 텍스트를 내가 우선 가공해서, KT 기가지니 DSS 서비스로 넣고 싶은데, 이 간단한 작업을 못 하겠다-_- 좌절이다-_-

KT에서 제공하는 stt의 성능은 그럭저럭인데 tts의 성능은 준수한 듯 하다. 예제파일을 몇 개 실행해 봤는데, 쓸데없이 재미있다. ㅋㅋㅋ

메이커스 킷에 들어있는 보드에는 gpio를 그대로 쓸 수 있도록 옆으로 빼 놓았는데, 여기에 예전에 라즈베리 파이 용으로 사둔 5인치 LCD 모니터[6]를 꼽아 쓸 수 았다. 이 모니터는 라즈베리 파이의 gpio에서 전류를 끌어 쓰기 때문에 별도의 전원 없이도 동작한다. 아주 짧은 hdmi선으로 연결하니 손바닥만한 훌륭한 컴퓨터가 되었다. ㅋㅋㅋㅋ 근데 이 모니터의 터치 기능을 쓰려면 apt upgrade를 해야해서[7] 못 쓰고 있다-_- 이걸 활용해서 한국어 사용이 가능한 아마존의 echo show처럼 멋있는 인공지능 스피커로 만들고 싶은데, node js를 몰라서 좌절 중이다ㅠㅠ

.


2018.8.12
JSON.stringify 라는 함수가 뭔지 이해했다!!!! 음하하하 뭔가 할 수 있을 것 같다. ㅋㅋㅋ

.


2018.8.13
node js가 너무 어렵다. 코드 실행 순서도 모르겠구만-_-

.


2018.8.20
지디넷 “중고생도 2시간이면 AI스피커 개발 가능” 2018.08.19.09:00

.


[1] http://makersmagazine.net/
[2] https://gigagenie.ai/
[3] https://aiyprojects.withgoogle.com/
[4] cnet Google includes a Raspberry Pi in a DIY smart speaker kit APRIL 16, 2018 2:36 PM PDT
[5] ai-makers-kit/driver/ (github.com)
[6] 라즈베리파이 5인치 800×480 HDMI LCD 터치스크린 모니터 [CN0024] (devicemart.co.kr)
[7] 5inch HDMI LCD (waveshare.com)

엽록체 안의 양자컴퓨터

생명, 경계에 서다 – 양자생물학의 시대가 온다
짐 알칼릴리, 존조 맥패든 (지은이), 김정은 (옮긴이) | 글항아리사이언스 | 2017-11-24 | 원제 Life On The Edge (2014년)

p167-173


지구상에서 두 번째로(DNA 다음으로) 중요한 분자라고 할 수 있는 엽록소는 더 자세히 들여다볼 가치가 있다(그림 4.5). 엽록소는 주로 탄소(회색 구)와 질소(N) 원자로 이루어진 오각형이 중심에 있는 마그네슘 원자(M)를 둘러싸고 있으며, 탄소, 산소(O), 수소(흰색) 원자로 이루어진 꼬리가 달려 있는 2차원 구조다. 마그네슘 원자에서는 최외각 전자가 원자의 나머지 부분과 느슨하게 연결되어 있다. 그래서 태양에너지의 광자를 흡수하면 전자가 마그네슘을 둘러싸고 있는 탄소로 빠져나올 수 있고, 마그네슘 원자에는 양전하를 띠는 구멍이 생긴다. 정공hole 또는 양공이라 불리는 이 구멍은 매우 추상적인 방식으로 생각될 수 있는데, 양전하로 하전된 구멍 자체를 하나의 ‘물체thing’로 보는 것이다. 이 개념에서는 마그네슘 원자의 나머지 부분은 중성으로 남겨두고, 광자의 흡수를 통해서 탈출한 전자와 그 자리에 남아 있는 양전하를 띠는 구멍으로 구성되는 계를 창조한다. 엑시톤(그림 4.6을 보라)이라 불리는 이 이중계는 음극과 양극으로 이루어진 작은 전지라고 생각할 수 있으며, 이 전지에는 나중에 사용할 에너지를 저장할 수 있다.

엑시톤은 불안정하다. 전자와 정공은 정전기적 인력을 느끼고 서로 끌어당긴다. 전자와 정공이 다시 결합하면, 원래 광자에 있던 태양에너지는 열로 손실된다. 따라서 식물이 포획한 태양에너지를 이용하고자 한다면, 엑시톤을 반응 중심이라고 알려진 분자 제조 시설로 잽싸게 옮겨야 한다. 반응 중심에서는 전하 분리라는 과정이 일어난다. 간단히 말해서, 고에너지 상태의 전자를 원자에서 완전히 분리해 이웃한 분자에 전달하는 과정인 전하 분리는 앞 장에서 관찰했던 효소의 작용과 무척 비슷하다. 이 과정을 통해서 엑시톤보다 더 안정된 (NADPH라고 불리는) 화학 전지가 만들어지고, 이 전지는 광합성의 모든 주요 화학반응을 일으키는 데 이용된다.

그러나 반응 중심은 분자 규모에서 볼 때 들뜬 엽록소 분자와 꽤 멀리(나노미터 거리) 떨어져 있다. 따라서 에너지가 반응 중심에 닿기 위해서는 엽록소의 숲에 있는 한 안테나 분자에서 다른 안테나 분자로 전달되어야만 한다. 이런 작용은 엽록소가 빽빽하게 들어차 있는 덕분에 일어날 수 있다. 광자를 흡수한 분자와 이웃한 분자는 맨 처음 들뜬 전자의 에너지를 효과적으로 이어받아 들뜬 상태가 될 수 있고, 이 에너지를 다시 자신의 마그네슘 원자의 전자에 전달한다.

문제는 어떤 경로를 통해서 에너지를 전달해야 하느냐에 관한 것이다. 만약 잘못된 방향으로 향하면, 엽록소의 숲을 아무렇게나 돌아다니다가 결국에는 반응 중심에 에너지를 전달하지 못하고 그냥 잃게 될 것이다. 어떤 방향을 향해야 할까? 엑시톤이 소멸되기 전에 길을 찾으려면 시간이 별로 없다.

최근까지도 한 엽록소 분자에서 다른 엽록소 분자로의 에너지 도약은 무계획적으로 일어나는 현상이라고 여겨졌다. 본질적으로, 무작위 걸음이라고 알려진 탐색 전략을 최후의 수단으로 적용했다는 것이다. 무작위 걸음은 때로 ‘주정뱅이 걸음drunken walk’이라고도 불리는데, 술에 취한 사람은 술집을 나와서 이리저리 헤매다가 결국에는 집을 찾아오기 때문이다. 그러나 무작위 걸음은 어딘가를 가는 수단으로는 별로 효과적이지 않다. 만약 집이 아주 멀다면, 그 취객은 마을 반대편에 있는 덤불숲에서 아침을 맞게 될지도 모른다. 무작위 걸음을 하는 대상이 시작점으로부터 이동하는 거리는 걸린 시간의 제곱근에 비례하는 경향이 있다. 술에 취한 사람이 1분 동안 1미터를 전진한다면, 4분 뒤에는 2미터, 9분 뒤에는 3미터를 나아간다는 것이다. 진행 속도가 이렇게 더디므로, 동물과 미생물이 먹이나 사냥감을 찾을 때 무작위 걸음을 하는 일은 당연히 드물다. 무작위 걸음은 다른 선택권이 없을 때 최후의 수단으로 사용하는 전략일 뿐이다. 개미 한 마리를 낯선 곳에 내려놓으면, 개미는 냄새를 맡자마자 무작위로 돌아다니지 않고 냄새를 따라갈 것이다.

후각도 없고 다른 길 찾기 능력도 없는 엑시톤 에너지는 주정뱅이의 전략을 따라 엽록체의 숲을 나아갈 것이라고 여겨졌다. 그러나 이런 추측은 잘 납득되지 않았는데, 광합성의 첫 단계인 이 과정은 대단히 효율적이라고 알려져 있었기 때문이다. 사실 엽록소의 안테나 분자에서 포획한 광자 에너지가 반응 중심으로 전달되는 과정은 알려진 모든 자연적 반응과 인위적 반응에서 가장 높은 효율성을 자랑한다. 효율성이 무려 100퍼센트에 근접한다. 최적의 조건 하에서는 엽록소 분자가 흡수한 에너지가 거의 다 반응 중심에 도달한다는 것이다. 만약 정처 없이 헤매는 경로를 따라 이동한다면, 거의 모든 에너지가 중간에 사라져야 마땅하다. 어떻게 광합성 에너지는 주정뱅이나 개미나 가장 효율적인 에너지 기술보다도 목적지를 훨씬 잘 찾아갈 수 있을까? 이 문제는 생물학에서 가장 난해한 수수께끼 중 하나였다.

양자 맥놀이

MIT 모임의 회원들이 웃어넘긴 기사의 도화선이 된 연구 논문3의 책임 저자는 귀화 미국인인 그레이엄 플레밍이었다. 1949년에 잉글랜드 북부의 배로에서 태어난 플레밍은 현재 캘리포니아 버클리 대학에서 한 연구팀을 이끌고 있다. 양자역학 분야에서 세계 최고의 연구팀 중 하나로 인정받고 있는 그의 팀은 “2차원 푸리에 변환 전자 분광학two-dimensional Fourier transform electronic spectroscopy”(2D—FTES)이라는 인상적인 이름의 막강한 기술을 활용한다. 2D-FTES는 가장 미세한 분자계에 지속 시간이 짧은 레이저 펄스를 집중시킴으로써 그 분자계의 내부 구조와 역학을 조사할 수 있다. 이들은 식물이 아니라 주로 페나-매슈스-올슨(FMO) 단백질이라는 광합성 복합체를 이용해서 연구를 했다. 이 단백질은 녹색황세균이라는 광합성 미생물에서 만들어지는데, 이 세균은 흑해와 같은 황화물이 풍부한 깊은 바다에서 발견된다. 연구자들은 광합성 복합체에 세 개의 레이저 펄스를 연속적으로 쏘는 방식으로 엽록소 시료를 조사했다. 레이저 펄스가 매우 빠르고 정확한 시간 동안 지속되는 에너지를 방출하면, 시료에서는 이 에너지를 감지한 감지기가 빛 신호를 만든다.

이 논문의 주저자인 그레그 엥겔은 밤을 꼬박 새워서 50〜600펨토초 길이의 신호가 만들어내는 자료들을 이어 붙이고 그 결과를 그래프로 만들었다. 그가 발견한 것은 최소 600펨토초 동안 진동하면서 오르내리는 신호였다(그림 4.7). 이 진동은 이중 슬릿 실험 에서 밝은 부분과 어두운 부분이 번갈아 나타나는 간섭무늬를 닮았다. 또는 악기를 조율할 때 들을 수 있는 소리의 맥놀이와도 비슷했다. 이런 ‘양자 맥놀이’는 엑시톤이 엽록소라는 미로에서 하나의 길을 따라서만 나아가는 것이 아니라 여러 개의 경로를 동시에 나아간다는 것을 보여준다(그림4.8). 이와 같은 여러 갈래의 길은 거의 조율된 기타에서 나는 진동음과 조금 비슷한 작용을 한다. 길이가 거의 같으면 맥놀이를 만드는 것이다.


그런데 이런 양자 결맞음은 대단히 섬세해서 유지시키기가 극히 어렵다는 점을 기억하자. 결어긋남을 막기 위해 영웅적인 노력을 기울이고 있는 유수의 MIT 양자컴퓨터 연구자들보다 미생물과 식물이 더 뛰어나다는 것이 가당키나 한 일인가? 플레밍의 논문에서 내놓은 주장은 참으로 대담했다. 세스 로이드의 말처럼, 이 “수상한 양자 속임수”는 이 MIT 학자 모임의 화를 돋웠다. 버클리 연구진은 FMO 복합체가 반응 중심에 이르는 가장 빠른 경로를 찾는 양자컴퓨터처럼 작용한다고 제안하고 있었다. 이런 최적화 문제는 다수의 목적지를 경유하는 여행 경로와 연관된 유명한 수학 문제인 외판원 순회 문제에 해당되며, 대단히 강력한 컴퓨터로만 해결이 가능하다.

 


3 G. S. Engel, T. R. Calhoun, E. L. Read, T-K. Ahn, T. Mančal, Y-C. Cheng, R. E. Blankenship and G. R. Fleming, ‘Evidence for wavelike energy transfer through quantum coherence in photosynthetic systems’, Nature, vol. 446 (2007), pp. 782-6 doi: https://doi.org/10.1038/nature05678

아니 이게 무슨 소리요?? 물리학자, 생물학자 양반들???? 혼란하다 혼란해-_-

점화식을 통한 수열의 계산에서 COBOL의 장점

해커뉴스[1]에서 COBOL의 장점에 대해 논하는 글[2]을 봤다.

프로그래밍계의 고대 언어라 할 수 있는 COBOL이 아직도 은행권에서 쓰이는 모양인데, 글쓴이의 주장[2]에 따르면, 미국 GDP의 7% 규모(!)에 해당하는 지불이 COBOL에 의존하고 있다고 한다. 근데 출처가 없어서 어디서 도출된 숫자인지는 잘 모르겠네-_-

여하간 여전히 COBOL이 퇴출되지 않는 이유로, 글[2]에서 든 사례가 점화식을 통한 수열을 계산하는 부분이다. 다음 점화식을 생각해보자.

x_0 = 4, x_1 = 4.25, \displaystyle x_i = 108-\frac{815-1500/x_{i-2}}{x_{i-1}}

십진법 소수점으로 이루어진 실수값을 컴퓨터로 연산할 경우, 이진법을 사용하기 때문에 우리가 일반적으로 쓰는 십진법과 정확히 값이 일치하지 않고, 자연적으로 오차를 포함하게 된다. 유명한 사례가 0.1+0.2인데, 심지어 각종 프로그래밍 언어별로 이 결과를 비교하는 사이트[3]도 있고, SMBC에서도 이를 이용한 개그[4]도 선보이고 있다. ㅋㅋㅋ

floating point 연산은 소수점의 위치에 따라 오차의 크기가 가변적이 되므로, 위 점화식을 C나 Java같은 일반적인 언어로 구현하면 재귀적으로 누적된 오차가 극적으로 커지는 상황이 올 수도 있다. 위 수열은 수학적으로 5에 수렴해야하는데, (일반항이 5-\frac{2}{1+(5/3)^n}이다.) 몇 항 지나지 않아 100으로 값이 튀게 된다. 방정식 x^3 - 108 x^2 + 815 x - 1500 = (x - 3)(x - 5)(x - 100) =0의 근이 attraction point이므로 100으로 빨려간다.

이 점화식은 Muller’s Recurrence라는 이름으로 부르는 것 같다. Jean-Michel Muller라는 사람이 1980년경에 만든 것이라고 하는데,[5;p14] 이 Muller’s Recurrence는 floating point 연산이 실패하는 극적인 사례로 나름 유명한 듯 하다.[6] ㅎㅎ

위키피디아의 Loss of significance 항목에서 이차방정식의 근의 공식을 이용한 floating point 연산의 오차가 커지는 사례가 나와 있는데, 일전에 본 블로그에서 설명한 내용[7]과 일치한다. ㅋㅋ

그러나 COBOL은 fixed point 연산을 사용하여, 오차의 크기가 항상 일정하기 때문에 그런 일이 일어나지 않는다고 한다. 이런 특성 때문에 COBOL이 더 강점이긴하지만, 일전의 floating point를 이용한 제곱근 역수 트릭[8]은 쓸 수 없을 듯. ㅎㅎ

근데 정말로 은행권에서 재귀적 수열계산이나 방정식의 근의 계산과 같은 작업이 필요하단 말인가??? 정말 이런 수학적 이유로 인해 은행이 COBOL에서 다른 언어로 갈아타는 것이 어렵단 말인가??? 해커뉴스[1]의 몇몇 사람들도 이 글[2]이 misleading이라는 이야기를 하던데, 실제 사례를 보기 전까지는 개인적으로 좀 믿기 힘든 주장 같다.

.


[1] Is Cobol holding you hostage with Math? (hacker news)
[2] Is COBOL holding you hostage with Math? (medium.com/@bellmar)
[3] http://0.30000000000000004.com/
[4] http://www.smbc-comics.com/?id=2999
[5] How Futile are Mindless Assessments of Roundoff in Floating-Point Computation? (376kb pdf) (people.eecs.berkeley.edu/~wkahan)
[6] Muller’s Recurrence – roundoff gone wrong (latkin.org)
[7] 내 백과사전 저전력을 위한 이차방정식의 근의 공식을 개선하기 2018년 4월 29일
[8] 내 백과사전 제곱근 역수와 마법의 수 0x5f3759df 2014년 10월 29일

유니코드에 출몰하는 유령 : 유령한자

해커뉴스[1]에서 흥미로운 이야기[2]를 들었다. ㅋㅋ

1978년 일본의 경제산업성에서 일본어 문자코드인 JIS X 0208을 제정할 당시, 일부 출처도 알 수 없고 실제로 거의 쓰이지도 않는 한자 수십 개가 포함되었는데, 이를 ‘유령문자‘라고 부르고 있는 듯 하다. 나무위키[3]에도 항목이 있다.

이 한자들은 주요문서에 나와 있지 않는 한자이므로, 의미가 불명하고 읽는 방법도 아는 사람이 없었다고 한다. 문제는 이 한자들이 그대로 유니코드에 등록되어 현재 유니코드 목록에도 남아있다는 점이다.

꽤 오랜 기간동안 이 한자들은 설명되지 않고 잊혀진 채로 남아있었는데, 1997년 대대적인 조사를 착수하여 상당수는 출처를 찾아내는 데 성공한 모양이다. 다만 최후로 남은 12개의 한자는 그 어느 문헌에서도 찾지 못한 한자라서 발음과 의미가 불명인 상황이라고 한다. 일본 위키피디아 유령문자 항목에 12개의 목록이 나열되어 있다.

재미있는 한자는 ‘妛’ 인데, 카탈로그를 제작한 사람과 인터뷰를 하여 조사한 결과, 본래 존재하는 한자인 𡚴자를 전산화하는 과정에서, 山자와 女자가 각각 인쇄된 종이로 잘라 붙여 복사할 때, 가로선이 삽입되어 탄생한 한자라고 한다. 덕분에 진짜 올바른 한자 ‘𡚴’자는 한참후에 유니코드에 등록될 수 있었다고 한다.

12한자 중 11자는 어떤 이유로 실수했는지 대략적인 추정이 되고 있으나, 최후의 마지막 한자인 ‘‘는 어떤 문헌에서도 나타나고 있지 않기 때문에, 의미도 발음도 불명확한 가장 미스테리한 한자가 돼 버렸다고 한다. 나무위키에 별도의 항목[4]이 있다. 일본어 위키피디아의 설명대로, 좁은 의미로는 유령한자는 이 한자 뿐이라고 말할 수도 있을 것이다.

.


[1] A Spectre is Haunting Unicode (hacker news)
[2] A Spectre is Haunting Unicode (dampfkraft.com)
[3] 유령 문자 (나무위키)
[4] (나무위키)

저전력을 위한 이차방정식의 근의 공식을 개선하기

John D. Cook 선생의 블로그는 한동안 안 보고 있었는데, 해커뉴스[1]에서 John D. Cook 선생의 흥미로운 블로그 글[2]이 화제가 되고 있어 포스팅함. ㅋ

중학생들에게 ‘암기’라는 심리적 장벽-_-을 가져오기에 충분한 이차방정식 ax^2 + bx+c=0의 근의 공식은 잘 알려진 대로 다음과 같다.

\displaystyle x = \frac{-b \pm \sqrt{b^2 -4ac}}{2a} …… (1)

근데 실제 프로그래밍에서 플로팅 포인트 오차 때문에 이 공식을 그대로 쓰면 b가 매우 큰 경우에는 오차가 꽤 커진다고 한다. John D. Cook 선생은 파이썬으로 예시를 보여주고 있지만, 본인은 한국 수학 교사들의 영원한 동반자-_-라 할 수 있는 아래 한/글에 내장된 한글 스크립트로 구현해 보았다. ㅋㅋ

function OnScriptMacro_test12()
{
	var temp = quadratic(1, Math.pow(10,8), 1);

	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
	HParameterSet.HInsertText.Text = "Answer : " + temp[0] + ", " + temp[1];
	HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);
}

function quadratic(a, b, c)
{
	var r = Math.sqrt(b*b - 4*a*c);
	return [(-b+r)/(2*a), (-b-r)/(2*a)];
}

function quadratic2(a, b, c)
{
	var r = Math.sqrt(b*b - 4*a*c);
	return [2*c/(-b-r), 2*c/(-b+r)];
}

실행해보면 Answer : -7.450580596923828e-9, -100000000 가 나오는데, 두 번째 근은 얼추 정확하지만, 첫 번째 근은 실제 근에 비해 무려 25%나 오차가 발생한다. b의 값이 매우 크기 때문에 \sqrt{b^2 -4ac}는 거의 b와 가깝게 되고, 이 두 값을 빼는 순간, 상대적으로 작은 차이의 값이 매우 크게 부각된다.

이 부분을 방지하기 위해, 원래 근의 공식의 분모와 분자에 -b \mp \sqrt{b^2 -4ac}를 곱하여, 분자를 유리화한 다음과 같은 근의 공식을 생각한다.

\displaystyle x = \frac{2c}{-b \mp \sqrt{b^2 -4ac}} …… (2)

위 한글 스크립트 코드의 3번 라인에 함수를 두 번째 걸로 바꾸면 된다. 실행해보면 Answer : -1e-8, -134217728 가 나오는데, 이번에는 첫 번째 근이 얼추 맞지만 두 번째 근이 같은 이유로 34%나 오차가 발생한다. 따라서 결론은 두 방법들 중 정확한 것들만 취하면 된다!!

왜 이런 방법이 필요한가에 대해 John D. Cook 선생은 저전력의 장점에 대해 설명하고 있다. floating point 계산에 드는 전력은 64피코줄, 레지스터에 데이터를 저장하는데 드는 전력은 6피코줄 정도의 에너지를 소모하지만, DRAM의 데이터를 읽는데 드는 전력은 무려 4200피코줄의 에너지를 소모한다고 한다. 따라서 식 (1)만으로 이차방정식을 풀려면 더 많은 전력소모를 하게 된다. 즉, 모바일이나 IoT에서 더 적은 전력소모로 프로그램을 구현하기 위한 방법이라 할 수 있다. (댓글을 참조 바람)

근데 본인은 프로그래머가 아니라서, 프로그래밍을 할 때 정말로 이차방정식을 풀 필요가 있나?? 싶은 의문이 좀 들던데, 해커뉴스[1] 사람들의 이야기를 보니 몇몇 경우에 따라서는 floating point error를 심각하게 생각하는 경우가 있는 모양이다. 이거이거 중학교 수학 샘들은 식 (2)와 같은 근의 공식도 암기하도록 교육하시길 바란다. ㅋㅋㅋㅋㅋㅋㅋㅋ

이걸 보니 일전에 제곱근 역수를 계산하는 트릭[3]이 생각나는데, 수학에 기반하여 연산속도를 높이거나 전력소모를 줄이는 프로그래밍 트릭이 앞으로도 쓸모가 없지는 않을 듯 하다. ㅎㅎㅎ

 


[1] The quadratic formula and low-precision arithmetic (hacker news)
[2] The quadratic formula and low-precision arithmetic (John D. Cook)
[3] 내 백과사전 제곱근 역수와 마법의 수 0x5f3759df 2014년 10월 29일

아마존의 맹인 프로그래머

해커뉴스[1]를 보니 아마존에서 프로그래머로 일하고 있다는 맹인(!!!)에 대한 이야기[2]가 링크되어 있다. 유튜브 영상[3,4]도 있다. 재생시간 1분 22초, 38초

대충보니 tts의 소리를 듣고 타이핑을 하는 모양인데, 아무리 그래도 그렇지 코딩이 어떻게 가능한지 신박할 따름이다. 헐…-_-

그러고보니 일전에 한 음성코딩 이야기[5]가 생각나는데, 이건 어찌 되고 있는지 모르겠구만-_- 요새는 키보드로 뭘 치는게 귀찮아서 검색할 때는 무조건 마이크로 음성검색을 함. ㅋㅋㅋ

 


[1] Blind since birth, writing code at Amazon since 2013 (hacker news)
[2] Blind since birth, writing code at Amazon since 2013 (blog.aboutamazon.com)
[3] Coding without seeing the screen (youtube 1분 22초)
[4] How Forzano writes code (youtube 38초)
[5] 내 백과사전 키보드 코딩 보다 빠른 음성 코딩? 2013년 8월 13일

마이크로봇 푸시 사용 소감

‘마이크로봇 푸시’라는 물건을 펀샵[1]에서 사 봤다. 물리적으로 버튼을 눌러주는 소형 머신인데, 블루투스로 작동가능하므로 원격으로 제어가 가능하다.

사실 이런 건 휴대폰을 찾아서 앱을 켜기가 더 귀찮기 때문에-_- 그냥 누르고 말지, 전혀 편리해 보이지 않는다. ㅋㅋㅋ 다만, 여름에 극강의 더위 아래서 진짜 꼼~짝도 하기 귀찮은 순간이나, 감기 몸살에 너무 아파서 몸을 움직이기 힘들 때 좀 편리하더라-_- 블루투스로 전력을 통제하는 와트드림[2]을 써 보니 편리한 점은 타이머 내장을 활용할 때인 듯 하다.

뭐 여하간 이런 걸 기대하고 산게 아니라 목적은 따로 있다. 제조사 홈페이지의 설명[3]을 보니 이 제품은 IFTTT를 지원하는데, 이걸로 아마존 에코와 연동할 수 있다고 돼 있다. 그럼 혹시 말로 제어가 가능한게 아닌가?!?! 선풍기 켜!!! 하면 선풍기가 돌아간다면, 왠지 이거 좀 신세계 같다. ㅋㅋㅋㅋㅋ

여하간, 내 아마존 에코가 배송대행 덕분에 지금 통관중이라서 조금 구미가 당기길래, 마이크로봇 푸시를 5개 샀다. ㅎㅎㅎ 선풍기 제어를 시험해 봤다.

그냥 해도 충분히 잘 작동한다. 그러나 푸시의 수명을 늘리고 좀 더 쉽게 작동될까 싶어서, 선풍기 바닥부분을 분해해서 바람 강도 조절 버튼에 있는 스프링을 니퍼로 좀 잘라내서 스프링을 약하게 개조했다. (위 영상은 개조 전임) 이건 그냥 재미로 해봤음. ㅋㅋㅋ

휴대폰에 직접 블루투스로 링크하여 제어하려면, 폰이 저전력 블루투스(BLE)를 지원해야 하고, 이유는 모르겠지만 위치서비스가 켜져 있어야 한다. 와트드림[2]도 위치서비스가 켜져야 작동가능한 걸 보면 BLE의 어떤 특징이 아닌가 싶기도 하고, 잘 모르겠음.

머신의 위쪽에 터치 버튼이 있어서 버튼을 터치하면 그냥 작동된다. 누르는 깊이도 앱[4] 설정에서 제어 가능하다. 한 번 페어링을 한 후에, 다른 기기랑 페어링하고 싶으면 푸시 기기를 초기화 해야 한다. 초기화 하는 법 영상[5]을 참고하시라.

근데 에코와 연동하려면 ‘프로타’라는 중계기가 있어야 했다.[3] 프로타를 사려니, 다 매진이라 영 구하기 어려운 듯 해 보이던데, 다행히도 제조사에서 라즈베리 파이가 프로타 기능을 할 수 있는 라즈베리 파이용 프로타 OS를 배포[6]하고 있었다. 이게 웬 떡인가? ㅋㅋㅋ

무선 wifi와 블루투스 모듈이 없는 구형 파이는 동글을 달아야 하는데, 파이3부터는 내장 블루투스 모듈이 있으므로 그것도 필요없다. 파이3 Model B와 sd카드를 슥샥 구입해서 프로타 OS를 설치해 봤다. 설치법은 라즈비안과 같이 sd카드에 이미지를 밀어 넣으면 된다. 퀵 가이드[7]를 참고하시라. 고대로 따라하면 됨.

OS 제어를 어떻게 하는가 궁금했는데, 모니터에 연결할 필요도 없다. 모든 제어는 휴대폰에 설치된 프로타 제어 앱[8]으로 한다. 처음 부팅할 때 아무 반응도 없이 5~10분정도 좀 시간이 걸리는데, 화면도 안 나와서 고장난 줄 알고 좀 당황함 ㅋㅋㅋ 프로타와 푸시를 연결하면 휴대폰에는 블루투스가 필요없다. 휴대폰에서 명령을 보내면 프로타를 거쳐 푸시가 제어된다.

그리고 최초 이메일 등록이 한 번 필요하다. 뭐 홍보 목적이 아닐까 싶다. 앱에서도 푸시를 제어 가능하지만, 앱의 홈스크린 화면 우측 상단에 클립 모양을 누르면, 파이3을 제어할 수 있는 url을 등록된 이메일로 전송해준다. 이 url을 이용하여 웹 인터페이스로 프로타를 제어할 수 있다. 잘 만들었군. ㅎㅎ 컴퓨터 앞에서 선풍기 켜고 끌 때 편하겠구만. ㅋㅋ

프로타는 독자 OS라서 푸시를 제어하는 것 말고도 몇 가지 기능이 더 있는 것 같다. 파이 전용 카메라[9]를 꼽아서 웹캠 앱을 설치하니, 모션을 자동 감지해서 스냅샷을 남겨주는 기능도 달 수 있다. 근데 스냅샷을 지우는 방법을 모르겠네-_-

IFTTT를 이용해서 여러가지 트리거를 만들 수 있다고 한다. 누가 벨을 누르면 텔레그램으로 벨을 누른 사람의 사진을 보내고, open이라고 메세지를 전송하면 문이 열리는 식이다.[10]

여하간 과연 아마존 에코와 연동해서 말로 선풍기를 제어할 수 있을 것인가???? 제발 잘 돼야 될텐데-_-

 


[1] https://www.funshop.co.kr/goods/detail/50286
[2] 내 백과사전 와트드림을 구입하다 2015년 6월 26일
[3] 아마존 에코(Amazon Echo)와 연동 (support.thenaran.com)
[4] 마이크로봇 푸시 (google playstore)
[5] 마이크로봇 푸쉬 리셋 하기 (youtube 1분 39초)
[6] 프로타 Bernard 다운로드 (prota.info)
[7] http://docs.prota.info/101-prota-pi/
[8] Prota Space(베타) (google playstore)
[9] 라즈베리파이 카메라모듈 V2 8Megapixel (icbanq.com)
[10] 4000円でスマート・ドアベルを自作してみよう (qiita.com/NARAN/)