종속변수에서 독립변수로 – 거대한 체스판

근 20년만에 다시 얼굴 본 대학교 후배가, 자기가 시작하는 독서 클럽 가입하고 활동 좀 해달라 하여 팔자에 없는 독서 클럽 정모를 두 번 나갔습니다. 트레바리 같은 거 창업하려고 그러나? 아무튼 책을 읽어야 하겠기에 동네 도서관에서 빌려 읽고 있는 중입니다. 예전부터 읽고 싶은 책이었으나 20년이 지나서야 겨우 읽고 있습니다.

원서는 1997년에 쓴, 번역서는 2000년에 나온, 옛날 책입니다. 책 나올 때 중국은 미국에게 WTO 껴달라 애원하던 때였지만 지금은 미국 패권 위협. 국제 뉴스에 중국 WTO 가입 관련 뉴스가 참 많았더랬죠. 목차에 잠재 위협으로 중국을 언급하긴 합니다만 그만큼 옛날 책입니다.

1991년 소련 붕괴 직후 프랜시스 후쿠야마는 자본주의, 민주주의 승리라며 ‘역사의 종말’ 운운하며 건방 떨다 2008년 서브프라임모기지 뚜드려맞고 아닥했지만, 이 냥반은 어떻게 하면 미국한테 기어오르는 놈들은 아작낼지 젊은 미국인들에게 알려주는 이 책을 썼습니다.

the_grand_chessboard

이 책을, 이제서야 보네요. 도서관 사서가 지하 창고에서 꺼내오더군요.

초장부터 서늘합니다. 소련 붕괴 원인으로 문화에 대한 동경을 꼽네요. 아, 문화는 역시 패권이기도 한 건가. 요새 한국도 문화적 패권국이 되는 건가.

까놓고 이야기하면, 우린 한동안 미국 정부 내 책략가들이 두는 체스의 말이었어요. 냉전은 말할 것도 없고 구한말 러일전쟁 시 일본 서포터가 영/미었고, 가쓰라/테프트 밀약도 아시죠?

중국도 미국 제끼고 글로벌 패권국 되는 걸 지향할 텐데, 중국인이 이런 책 쓰면 ‘거대한 장기판’, ‘거대한 바둑판’인 건가요 ㅎㅎ.

QGIS3에서 한국 좌표계 보정하기

(2020.05.18 업데이트)

Proj 6.0 을 쓰는 Qgis 3.10.3 부터는 이런 작업이 불필요하단다. 현재 Qgis LTS 버전이 3.10이다. 만쉐이!

어제에 이어, 오늘도 QGIS 해킹 글이다. 이 작업도 손형* 님의 빅픽쳐에 빠져(?) 다른 몇 분과 올 5 ~ 6월에 한 작업이다.

GIS 세계에는 수많은 좌표계를 가지고 있는데 (위도/경도만 알면 되지 뭔 좌표계가 많이 필요한지는 글 주제를 한참 벗어나므로 생략) QGIS도 이 좌표계들을 기본 탑재하고 있다. 문제는 QGIS에 들어있는 한국 관련 좌표계가 넘 오래 된 국가 지적 자료를 기반으로 하다 보니 오차가 있어 보정이 필요하다. 그간 QGIS 2를 쓰던 많은 한국인들은 나름대로 보정하여 쓰고 있었는데 ( http://osgeo.kr/146 참조), 문제는 이 방법이 QGIS 3에서는 안 통한다는 점이다.

올 6월 말에 QGIS 3에서 통하는 좌표계 보정 결과를 공개하였다 ( http://www.osgeo.kr/252 ) . 다만 그 공개글에서는 무엇을 어떻게 고쳤는지에 대한 내용이 없어, 여기서 다루고자 한다.

QGIS 3 좌표계 정보는 $QGIS_HOME/apps/qgis/resources/srs.db 파일에 있는데, 이 파일이 SQLite 데이터베이스 파일이다 (SQLite 만든 사람은 복 받을 거여~). 좌표 정보가 테이블로 되어 있고, SQL로 조회 / 수정 / 추가할 수 있다는 뜻. 그러면 이 srs.db 안의 데이터베이스에 어떻게 SQL을 날릴까?

연장은 중요하다. 연장이 편하면 일도 잘 된다. DB Browser for SQLite를 못 만났으면 엄청나게 삽질했을 것이다. 해당 프로그램을 실행시키고 Ctrl + O 를 누른 후 $QGIS_HOME/apps/qgis/resources/srs.db 를 읽으면 아래 그림과 같이 데이터페이스 구조가 주루룩 나온다. (테이블은 물론, 인덱스에 뷰까지 있다!)

위 그림을 보면 ‘SQL실행’이라는 탭이 보이는데, 이 탭에서 SQL을 날릴 수 있다. 한국 관련 좌표계는  다음 SQL로 실행하면 조회할 수 있다.

select * from tbl_srs
where description like '%Korea%'
  and auth_name = 'EPSG'
  and ellipsoid_acronym = 'bessel'

즉 srs.db 데이터베이스에서 좌표계 정보는 tbl_srs란 테이블에 있다. 이 테이블의 PK 컬럼명은 srs_id 컬럼이다.  elipsoid, bessel, EPSG가 무엇을 뜻하는지는 GIS 세계에 대한 한 발 더 나아가는 이해를 필요로 하므로 본 글에서는 생략.  주요하게 update해야 할 컬럼은 parameters 컬럼이다.

모든 설명이 끝났다. 보정은 이 tbl_srs 테이블의 parameters 컬럼을 수정하는 update SQL를 날리면 된다.

QGIS 3 Plugin 개발 환경 잡기

도입

GiS 쪽과는 전혀 상관 없이 밥 벌어 먹고 살고 있는데, 어쩌다 손형* 라는 분의 빅 픽쳐에 퐁당 빠져(?) 올 초부터 Python으로 짠 QGIS 2 버전용 plugin을  QGIS 3 버전용으로 컨버전하는 것을 몇몇 분들과 하고 있다.

참고로 Python은 차근차근 배운 적 없이 막 덤비면서 엉성하게 아는 수준이고(그래서 python 생기초 스터딜 하고 있음), QGIS는 플러그인 개발은 커녕 사용도 할 줄 모르는, 기지도 못하면서 날려고 하는 개삽질이다.

QGIS 3, 변화의 쓰나미

QGIS도 메이저 버전이 2에서 3으로 올라가면서 엄청난 변화가 일어나 QGIS 사용자들에게 멘붕을 불러일으켰으며, 플러그인 만드는 입장에서도 쓰나미 맞는 느낌의 세 가지 멘붕급 변화가 있었다.

  1. QGIS가 내장한 python version이 2에서 3으로 올라감 (아시는 분은 아시지만 파이썬 세계에서 3 버전의 변화는 가히 충격적이었다)
  2. GUI를 담당하는 라이브러리인 QT도 4에서 5로 올라감. 그에 따라 PyQT도 4에서 5로 올라감. 이것도 변화 폭이 상당하다.
  3. 당근 qgis python API도 일부 메소드가 deprecate 되는 등, 변화가 생겼다.

Pycharm 기동 배치 파일

Python IDE로 Pycharm community edition을 즐겨 쓰는데 open source 라이선스 (Apache License 2.0)라 회사 컴에서 써도 저작권 문제 없고 (단 Professional은 사서 써야 함), 궁금한 클래스, 함수에서 Ctrl + Q를 누르면 나오는 도움말이나 컨텍스트 메뉴가 예술이라 참 편하다.

인터넷 검색을 엄청 했고, 결국 Windows Batch 파일을 만들었다.

@echo off
setlocal
rem PYCHARM_HOME, PRJ_ROOT, QGIS_HOME은 자신 PC 환경에 맞게 수정 필요 
set PYCHARM_HOME=D:\Tools\PyCharm Community Edition 2018.3
set PRJ_ROOT=D:\works\qgis-tmsforkorea-plugin
set QGIS_HOME=D:\tools\QGIS 3.4 
call "%QGIS_HOME%\bin\o4w_env.bat" 
call qt5_env.bat 
call py3_env.bat 
path %OSGEO4W_ROOT%\apps\qgis\bin;%PATH% 
set QGIS_PREFIX_PATH=%OSGEO4W_ROOT%\apps\qgis 
set GDAL_FILENAME_IS_UTF8=YES 
rem Set VSI cache to be used as buffer, see #6448 
set VSI_CACHE=TRUE 
set VSI_CACHE_SIZE=1000000 
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis\qtplugins;%OSGEO4W_ROOT%\apps\qt5\plugins 
set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python 
"%PYCHARM_HOME%\bin\pycharm64.exe" %PRJ_ROOT% 
endlocal

QGIS 3를 설치하면 QGIS가 쓰는 Python interpreter가 있는데, 당연한 이야기지만 plugin 개발할 땐 이 QGIS의 Python interpreter 를 쓰는 게 좋다. 그렇기 때문에 PYTHONHOME 환경변수를 잡았다.

QGIS 3에 들어 있는 Python Interpreter가 기본적으로 끌고 오는 라이브러리 말고도, QGIS 3 API나 PyQT5 등이 필요한데 아래와 같은 이유로 PYTHONPATH로 잡았다.

  • PyQT5는 그래도 pip로 설치할 수 있지만, QGIS API 같은 것은 PyPI에 없고 wheel 파일 찾기도 어려움
  • 플러그인 개발은 역시 기반 제품이 탑재한 라이브리러리로 하는 게 안전함

Pycharm에서 interpreter 설정

PYTHONHOME 환경변수를 잡고 Pycharm을 기동하긴 했지만, Pycharm 프로젝트에서 쓸 interpreter를 프로젝트 설정으로 잡아주어야 한다. Ctrl + Alt + S를 누르면 대화상자가 뜨는데 그 대화상자에서 project interpreter를 찾아 (아래 그림 참조) 톱니바퀴 아이콘을 누르면 컨텍스트 메뉴가 뜨는데

그 컨텍스트 메뉴에서 ‘Add…’를 고르면 나오는 추가 대화 상자에서 ‘System Interpreter’를 고른 다음 PYTHONHOME 환경 변수로 잡은 Python Interpreter 설치 디렉토리의 python.exe를 선택하면 된다. (아래 그림 참조)

개발 환경 설정 성공 여부 확인

Pycharm의 interpreter에서 QGIS API를 잘 import하면 설정에 성공한 것이다. 확인하는 방법은 Pycharm의 Python Interpreter를 실행시켜  Python version을 확인한 다음, ‘import qgis’를 치면 잘 수행이 되는지를 확인하면 된다 (아래 그림 참조)

이제 Pycharm의 Ctrl + Q 를 써서 편하게 QGIS 3 플러그인을 만들어 보자.

최적화된 윈도우용 텐서플로우를 얻는 초간단 방법

다음 깃허브 리포지토리를 소개한다.

https://github.com/fo40225/tensorflow-windows-wheel

  • 당신이 윈도우에서 텐서플로우를 돌리고
  • 요새 AVX 인스트럭션 셋 없는 CPU를 누가 쓴다고 “Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2” 란 메시지를 텐서플로우가 내는 게 꼴보기 싫다면
  • 파이썬은 3.7이 나왔는데 왜 tensorflow 때문에 3.6을 깔아야 하는지 불만일 때
  • CUDA도 10이 있는데 9 깔아야 하는 게 불만일 때

이러한 게 불만이면 텐서플로우 소스를 직접 컴파일하면 되나, 이 소스 컴팔이 또 다른 지옥문을 열 가능성이 높다.

위 깃허브 리포지토리 주인장께서 은혜를 베푸시어 자신이 수고로이 컴팔한 텐서플로우 whl 파일을 공개하였으니, 감사한 마음으로 원하는 것을 받아 pip 명령으로 설치하면 간단하게 끝난다.

엔비디아 GPU가 없는 놋북에서 텐서플로우 1.11.0을 python 3.7에서 돌리니 잘 돈다. 보기 싫은 AVX2 명령셋 안쓰는 바이너리란 메시지도 안 보일 뿐 아니라, AVX2 명령만 써도 안 쓴 것보다 눈에 띄게 빠르다.

은총을 받았다면 git 리포지토리에 ‘star’는 눌러주자.

끝!

(추신)
맥/리눅스 최적화된 텐서플로우 배포 URL 아시는 분은 댓글로 알려주심 감사!

비운의 낭만 컴퓨터 – NeXTCube

필자 주) 이 글은 예전 블로그에 2004년 3월 9일에 쓴 글을 옮겨 온 것입니다.

정육면체의 검은색 몸체를 가진, 80년대 후반 ~ 90년대 초반의 꿈의 컴퓨터, NeXTCube입니다. 멋지지 않나요? 본체와 모니터 뿐 아니라 시리즈로 팔리는 레이저 프린터(요새는 레이저 프린터가 개인도 쓸 정도로 대중화된 프린터이지만 당시만 해도 개인들은 지금은 보기도 힘든 9핀 도트 매트릭스 프린터라도 있으면 정말 호화로운 장비의 소유자였답니다. 그러니 레이저 프린터는 가공할만한 꿈의 프린터였죠)까지도 검은 색으로 통일한, 디자인 측면에서 보아도 보석 같이 빛났던 컴퓨터입니다(실제 가격도 당시 달러로 1만 달러가 넘었다 함).

이것을 만든 회사는 지금은 존재하지 않는 NeXT라는 회사입니다. 그리고 이 회사의 설립자는 현재 애플컴퓨터의 CEO인 스티브 잡스(Steve Jobs)입니다. 1980년도에 애플은 존 스컬리(X파일의 스컬리와 무관함. 이사람은 남자입니다 ^^)라는 경영 전문가를 영입합니다. 그런데 이 존 스컬리는 애플의 실적 부진을 이유 삼아 ‘합법적으로’ 애플에서 스티브 잡스를 쫓아냅니다(마치 국회가 ‘합법적으로’ 대통령을 탄핵한 것이 생각나네요). 돈만 아는 경영 전문가와 당시 ‘꿈의 기계’를 만들 생각만 하는 낭만적인 기술장이 출신인 스티브 잡스가 사사건건 부딪히다, 결국 정치에서 스티브 잡스가 진 거죠, 뭐. 여담입니다만, 이 존 스컬리도 ‘뉴튼(Newton)’이라는 PDA(이 뉴튼이 바로 PDA라는 개념을 만든 물건입니다. 이것이 있어서 팜파일럿도 나오고 포켓PC도 나올 수 있었습니다. 이 뉴튼 디자인도 정말 죽입니다. 역시 애플의 디자인 감각은 크~)에 올인했다가 뉴튼의 판매 실적 부진을 이유로 쫓겨납니다(선각자의 비애라고나 할까요). 그리고 그 다음 마이클 스핀들러, 길버트 아멜리오라는 차례대로 CEO로 왔다가 쫓겨나고 다시 스티브 잡스를 임시 CEO(Interim CEO)로 부릅니다. 이 이야기는 좀 있다가 다시 하죠. 아무튼 스티브 잡스는 그래도 배운 것이 도둑질이라고, 애플에서 잘린 다음 NeXT사를 설립하고 꿈의 기계를 만들겠다고 작심합니다.

아까도 말했듯 당시의 스티브 잡스는 꿈의 기계를 만들 꿈을 가지고 있었고, 그래서 값 생각은 안하고 그야말로 초호화판 기계를 만듭니다(당시 레이저 프린터가 무지막지하게 비싼 물건이라는 것은 말씀드렸죠? 이런 레이저 프린터를 기본 프린터로 턱하고 채용할 정도였으니 가격 생각은 정말 눈꼽만큼도 안했다고 볼 수 밖에 없습니다). 그것이 바로 이 NeXTCube입니다. 저는 이것을 1988년도 ‘월간 과학’이라는 과학 잡지에서 사진으로 봤는데(당시 중학교 2학년), 보자마자 뻑이 갔죠. 디자인도 디자인이려니와 당시 개인용 컴퓨터로는 엄청난 성능~ 크~.

그러나 이 컴퓨터의 진가는 하드웨어의 성능에만 있는 것은 아니었습니다. 이 NeXTCube를 쓰도록 사람들을 유혹하는 진짜 이유는 바로, 이 NeXTCube의 운영체제 NEXTSTEP이었습니다(NEXTSTEP을 쓰기 위하여 NeXTCube를 쓴다는 말이 정말로 있었습니다). BSD UNIX를 기반으로 하여 NeXT사가 손을 본 NeXTCube 전용 운영체제였는데, 지금 봐도 그 시절에 이런 것을 구현해 냈다는 것에 경탄할 정도로 진보적인 기술들이 녹아 있는 운영체제였습니다. 그 중 대표적인 것이 DO(Distributed Object)라는 것인데, 이것은 한 때 컴퓨터 업계를 뒤흔들었던 분산 객체 기술입니다. CORBA, EJB, DCOM 같은 분산 객체 기술이 2000년대 초에 들어 본격적으로 활성화되었다는 점을 고려해 볼 때 이미 10여 년 전에 나온 운영체제에서 분산 객체 기술을 구현했다는 것에는 정말 감탄사를 연발할 수 밖에 없습니다(이 운영체제가 나올 당시 PC용 운영 환경으로 MS가 내놓은 것이 윈도우 3.0 이전 버전이었을 겁니다. 그것을 대비시킨다면 정말 경악할만한 기술력이죠). GUI도 정말 놀라운 수준이었는데 화면 자체를 포스트스크립트(Postscript)를 쓴 디스플레이 포스트스크립트(Display Postscript)를 써서, 완벽한 WYSIWYG을 구현했으며 그 당시 PC들이 256 컬러 가지고 경악한 시절에 요즈음의 트루 컬러에 가까운 색을 내는 엄청난 물건있었습니다. 그리고 이 NEXTSTEP의 UI는 다른 운영체제의 전범이 될 정도로 직관적이고 훌륭했습니다.

그러나 기술적으로 우수한 것이 상업적으로도 성공한다는 보장은 없는 법. 시장에서는 실패했는데 그 이유는 당시 가격으로 1만 달러가 넘는 높은 가격입니다. 스티브 잡스는 이 컴퓨터를 만들면서 교육용 시장을 겨냥했으나 교육용 시장은 애플의 매킨토시 벽을 넘는데 실패했고(미국 이야기입니다), 엔지니어링 워크스테이션으로 팔기에는 프로세싱 파워가 썬이나 아폴로(HP에 흡수된 지 꽤 되었죠)의 엔지니어링 워크스테이션에 비해 딸린 편이면서도(모토롤라 MC68000 계열의 CPU를 썼는데 썬이나 아폴로의 엔지니어링 워크스테이션의 RISC CPU보다는 프로세싱 파워가 딸리긴 했습니다) 값은 비쌌죠. 즉 값은 비싼데 성능이 약간 어정쩡해서 연구소 같은 곳에 조금 파는 정도로 끝나버리고 맙니다.

결국 NeXT사는 일본 캐논의 지분 참여로 근근히 버티다, 결국 하드웨어 사업은 일본 캐논에 팔아버리고, NEXTSTEP 판매에만 주력하기로 합니다. 즉, MS 같은 운영체제 전문 회사로 돌아선 것이죠. 그리고 NEXTSTEP을 인텔 CPU에도 포팅합니다. 제가 대학 2학년 때였나요, 당시 한국에서도 신명시스템즈(지금도 있는지 모르겠지만)라는 회사가 이 인텔 CPU용 NEXTSTEP을 팔았었습니다. 컴퓨터 전문지도 상당히 비중있게 이 사실을 다루었었고요. 제가 다니던 학교에도 신명시스템즈 사람들이 와서 세미나 하고 홍보하고 그랬었고, 그 덕에 저도 당시 꿈의 PC였던 펜티엄(펜티엄 2도 아니고 펜티엄 3도 아닌 펜티엄)에서 돌아가는 아름다운 NEXTSTEP을 침 질질 흘리며 구경했던 기억이 나는군요. 당시 신명시스템즈는 NEXTSTEP의 완벽한 화면 출력 기능을 무기로 하여 DTP 시장을 파고들려 했던 것으로 기억합니다. 매킨토시가 해당 분야를 꽉 잡고 있긴 했지만 NEXTSTEP은 PC에서 도는 운영체제라는 것을 강점으로 생각한 것이겠죠. 그리고 당시 그 비싼 펜티엄 PC를 사서 NEXTSTEP을 돌린 동기 녀석이 있었는데, 친구들의 부러움을 상당히 받았더랬습니다.

그러나 시대를 너무 앞선 탓에 당시 일반적 PC 사양보다 더한 사양을 요구한 NEXTSTEP은 시장에서 실패했고 이에 스티브 잡스는 다시 한 번 재주를 넘습니다. 바로 OPENSTEP이죠. 옆의 OPENSTEP 로고를 잘 살펴보시죠. OPENSTEP 및에 ‘FOR WINDOWS’라는 문구가 보이시나요? 네, OPENSTEP은 당시 시장을 장악하고 있던 Windows NT나 Solaris 같은 운영체제 위에서 해당 운영체제에서 NEXTSTEP의 진보적인 데스크탑 환경을 구현하는 것으로 전략을 바꾼 것입니다. 당시 많은 이들이 NEXTSTEP의 진보적 데스크탑 환경에 너무도 매료되었기 때문에 이 전략은 일견 타당성이 있는 결정이라 할 수 있죠. GNUSTEP이나 AFTERSTEP이라는 말을 들어보셨습니까? NEXTSTEP의 진보적 데스크탑 환경에 매료된 오픈소스 개발자들이 리눅스 환경에서 돌아가는 OPENSTEP을 만들어 보자고 나서서 시작한 프로젝트죠. 그만큼 NEXTSTEP은 많은 전산장이들을 매료시켰습니다.

아울러 옆길로 새는 이야기이지만, 이 OPENSTEP을 발표하면서 NeXT사는 또 하나의 혁신적 제품을 출시하는데 바로 ‘WebObject’라는 제품입니다. 그당시에는 이 제품이 무슨 용도인지를 알지 못했으나 지금 생각해 보니 이것은 바로 요새 말 많은 Web Application Server(이하 WAS)였더군요. 요사의 WAS의 표준처럼 되어 있는 J2EE 기반은 아니지만, OPENSTEP의 객체 기술을 이용하여 90년대 중, 후반에 이미 NeXT사는 WAS를 내놓은 것입니다. 정말 대단한 선견지명이라 아니할 수 없습니다. WebObject는 바로 NeXT사가 OPENSTEP을 기업용 시장에도 진출시키겠다는 전략의 표현인 셈이죠. 그리고 이 WebObject는 현재 애플이 계속 출시하여 애플이 노리는 기업용 시장 진출 중 소프트웨어 분야의 첨병 노릇을 하고 있습니다(현재 기업용 시장 진출의 하드웨어쪽 첨병은 XServe라는 제품).

그러다 애플이 NeXT사를 인수하고 스티브 잡스가 애플의 임시 CEO(Interim CEO) 역할을 맡게 되는 사건이 벌어집니다. 당시 애플은 시대에 뒤떨어진 MacOS를 대체할 새로운 매킨토시 운영체제를 개발 중이었는데 IBM과 합작으로 코드명 ‘Pink’라는 프로젝트도 하고 ‘Taligent’라는 코드명의 운영체제 개발 프로젝트도 수행했지만 모두 실패합니다. 새 운영체제를 개발해야 하는데 시간이 모자란 애플은 당시에 출시된 운영체제를 인수하기로 하고 바로 NeXT사의 NEXTSTEP과, 애플 출신 프랑스계 미국인 ‘장 루이 가제’가 세운 ‘Be’사의 ‘BeBox’라는 하드웨어용 운영체제 ‘BeOS’를 놓고 저울질을 합니다. 그러다 결국 완성도가 더 높은 NEXTSTEP을 사기로 하죠. 이 일은 애플이 NEXTSTEP이라는 대단한 운영체제의 소유권을 가지게 된다는 것과, 자신이 설립한 애플에서 쫓겨난 스티브 잡스가 임시기는 하지만 다시 애플의 CEO가 된다는(현재는 정식 CEO임) 드라마틱한 요소까지 곁들여져 컴퓨터 업계의 대단한 이슈 거리가 됩니다. 그리고 애플은 MacOS와 NEXTSTEP을 결합하는 프로젝트를 출범시킵니다(그 당시 컴퓨터 잡지 좀 보신 분들은 ‘Copland’, ‘Rhapsody’라는 이름을 꽤 보셨을 듯 싶습니다. 모두 이들 프로젝트에 관한 코드명이었죠). 그리고 태어난 것이 바로 MacOS X입니다. MacOS X의 API 중 Cocoa라는 것이 있는데 이 Cocoa는 Objective-C라는 언어를 기반으로 하는데, 바로 이 Cocoa가 NEXTSTEP의 영향을 받은 부분이라고 합니다. 아울러 MacOS X에는 옛날 MacOS 버전에는 있지도 않은 UNIX 터미널이 있는데 이는 NEXTSTEP이 BSD UNIX를 기초로 하는 것의 영향을 받은 것이죠. 사실 MacOS X은 기존 MacOS의 후계자라기보다는 오히려 NEXTSTEP의 후계자라 보는 것이 더 타당할 듯 싶습니다.

1999년에 NeXT 기계를 우연히 본 적이 있습니다(IBM PC에서 NeXTSTEP이 돌아가는 것이 아닌 진짜 NeXT 기계). NeXTCube는 아니고 NeXTStation이었는데(왼쪽 사진) 대학 4학년 때 교양으로 수학을 들었었거든요? 그 교양 수학 가르치는 교수님 연구실에 들를 일이 있었는데 그 연구실에서 NeXTStation을 보았죠. 1999년 말이었는데 아직도 그 NeXT 기계에서 각종 수학 관련 프로그램을 돌리시더군요. 하드웨어 생산이 중단되어도 한참 전에 중단된, 20세기 컴퓨팅 기술 진보의 상징이었던 기계를 21세기를 코 앞에 둔 세기말에 보니 감회가 정말 새로왔습니다(그 교수님 아직도 그 기계 쓸라나 몰라). ‘오우, 교수님, NeXT 쓰시네요?’ 하면서 이유없이 반가와했더랬죠. ‘네가 NeXT를 알아? 이거 나올 때 넌 중고등학생이었 터인데?’ 하시던 말씀이 생각납니다.

엮인 글은 WWW의 창시자 팀 버너스 리에 대한 글인데, 읽어보면 아시겠지만 WWW이 최초로 구현된 컴퓨터가 바로 NeXTCube였습니다. 만약 당시에 팀 버너스 리가 NeXTCube를 쓸 수 없었다면 아마 WWW은 한참 뒤에나 발명되었을 것입니다. 당시 GUI도 희귀한 시절에, 팀 버너스 리가 명령행 프롬프트나 깜빡거리는 컴퓨터를 썼다거나 후져빠진 윈도우 3.0도 아니던 시절의 윈도우, 혹은 프로그래밍하기 엄청 어려운 X Window(당시엔 GTK+나 QT 같은 것이 아닌 Xlib을 가지고 직접 X Window용 프로그램을 짰던 것을 기억하세요)를 접했다면 제 생각엔 절대 WWW을 발명하지 못했을 것 같습니다.

써 놓고 보니 NeXTCube 이야기보다는 NEXTSTEP 이야기를 더 한 것 같네요. 어찌 되었던 비록 시장에서는 실패한 하드웨어였지만, 이렇게 우연히 NeXTCube는 자신의 진보적인 기능 덕택에 WWW의 자궁 역할을 제대로 하게 되었습니다. 세상은 그래서 참 재미있습니다. 하핫!

cf) NeXT에 대한 자세한 사항은 http://en.wikipedia.org/wiki/NeXT을 참고하세요. 영어입니다.

PostgreSQL JDBC Driver가 createClob() is not yet implemented 라고 드러누울 때

spring_pgsql.png
다니는 회사의 주요 고객사가, 업무 중요도가 낮은 시스템에는 PostgreSQL을 사용하는 관계로,  일에서 MySQL은 써 본 적 없지만 PostgreSQL은 썼다. 더불어 실제로도 PostgreSQL(이하 pgsql)이 괜찮은 DBMS라 PC에 깔아 놓고 코딩할 때 사용하고 있다.

증상

Spring Boot도 안 익숙하고, 하는 김에 곧 나올 2.0으로 배우려는 목적으로, ‘스프링부트로 웹서비스 구축하기‘라는 글을 Spring Boot 2.0 기반으로 바꿔 돌려 보고 있다. Hibernate를 구현체로 쓰는 Spring  Boot Starter JPA + H2 Database(in-memory db) 기반의 코드를 작성 및 테스트 통과하고 이 코드를 MariaDB에서 돌렸더니 한 방에 테스트를 통과했다. ‘역시 DB 독립적인 코딩을 하려면 ORM이여~’ 어쩌구 하면서 이 코드를 pgsql에서 돌리는 순간, 난생 처음 보는 Exception이 나면서 테스트 통과하는데 실패했다. 정말 해 보기 전엔 모른다.

Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.
    at org.postgresql.Driver.notImplemented(Driver.java:683) ~[postgresql-42.2.1.jar:42.2.1]
    at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1252) ~[postgresql-42.2.1.jar:42.2.1]
    ... 91 common frames omitted

멘붕이었다.

‘헐~. 정말 createClob() 메소드를 구현 안하고 JDBC 드라이버를 낸 거야?’

원인

믿을 수가 없어 pgsql의 JDBC Driver(이후 pgJDBC) 소스를 봤다. (버전은 42.2.1)

@Override
public Clob createClob() throws SQLException {
  checkClosed();
  throw org.postgresql.Driver.notImplemented(this.getClass(), "createClob()");
}

‘어처구니가 없구먼?’

해결책

9.3-1104-jdbc41 버전의 pgJDBC를 쓰면 된다. 그런데 pgJDBC 버전만 내리고 Hibernate Dialect를 “명시”하지 않을 경우 Hibernate Dialect를 못 찾겠다는 Exception이 터지면서 테스트를 실패한다.

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
 at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100)
 at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54)

즉 spring boot 애플리케이션 설정 파일 (yml 형식을 썼다)에 다음과 같이 Hibernate Dialect를 명시하는 것도 필요하다.

spring: 
    jpa:
        database-platform: org.hibernate.dialect.PostgesSQL95Dialect

H2, MariaDB는 Hibernate Dialect를 명시하지 않아도 문제 없다. 사실 Spring Boot의 디자인 철학이 CoC(Convention Over Configuration)이기도 하고.

PostgreSQL Korea 관리자이신 김상기 님 도움으로 취소선 그은 것보다 더 우아한 해결책을 찾아 수정한다. spring boot 애플리케이션 설정에

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

property를 추가하면, 최신 pgJDBC Driver 사용도 가능하고, hibernate dialect 명시적 선언도 불필요하다. yml 형태의 sping boot 애플리케이션 설정은 아래와 같다.

spring:
  jpa:
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false

hibernate.temp.use_jdbc_metadata_defaults 프로퍼티 설명 및 디폴트 값은 Hibernate 5.2
User Guide의 Configuration 장(章)
을 참고하시라. (한 줄 써 있어서 도움 될 지 모르겠지만…)

 

유의 사항

Spring Boot 버전 번호 보면 알겠지만 이 버전은 RC1이므로 향후 이 문제가 안 생길 수도 있다. 이후에 이 글 내용이 쓸모 없어질 수 있다. 그런 의미에서 본 글 작성과 관련된 기반 소프트웨어 버전을 명시함으로써 혼란을 방지하고자 한다. & 이 글 쓴 날짜도 꼭 유념해 주셨으면 한다.

  • OS: Windows 7
  • JDK : 1.8.0_162
  • Gradle : 4.5
  • Spring Boot : 2.0.0.RC1
  • IDE: IntelliJ IDEA Community Edition : 2017.3.4
  • pgJDBC: 9.3-1104-jdbc41 (최신 버전은 42.2.1)
  • pgJDBC: 42.2.1
  • PostgreSQL DBMS: 10.1.3

다만 이 해결책은 옛날 pgJDBC를 쓰는 것이라 찜찜하긴 하다.  더불어 왜 pgJDBC 제작자는 최신 버전 구현 시 당당하게 해당 메소드를 구현 안했다고 해 놨을 지도 매우 궁금하다. 최신 pgJDBC 적용하면서 위 문제를 피할 수 있는 방법을 아시는 분의 고견, 언제나 환영한다.

개인적 생각이나, Spring Boot 2.0 정식 버전이 나와도 pgJDBC를 쓰려면 상기 property 추가가 필수적일 듯 하다. 더불어 우아한 방법을 알려주신 김상기님께도 다시 한 번 감사 인사를 드린다.

Happy  Coding!

속도, 가속도, 힘, 일, 일률, 그리고 마력

hands-purple-child-holding.jpg

이 글은 제가 예전에 썼던 네이버 블로그에, 2004년 9월 19일에 쓴 글을 여기로 옮겨 온 글입니다.


이 글의 목적은 마력이라는 것을 이해하기 위한 것!

이를 위해 속도(velocity) -> 가속도(acceleration) -> 힘(Force) -> 일(Work) -> 일률(Power)의 순서대로 각각의 개념을 짚어보겠습니다. 이 들 중 일, 일률은 스칼라량, 나머지는 벡터량이나 스칼라(Scalar)와 벡터(Vector)에 대한 설명은 생략하겠어요. 따라서 여기서 다루는 운동의 방향은 모두 곧은 직선이고, 가속도, 힘은 두 벡터량이 쓰이는데 두 벡터의 방향이 일치한다고 가정합니다(모르면 그러려니 하시고 ㅋㅋ).

중/고교 물리 시간만 잘 들으셨으면 다 생각날 겁니다. 저도 그 이상은 배운 적이…. 즉 저도 먼지 털기 하는 거죠.

시작할까요?

속도(Velocity)

속도의 정의는 얼마만큼의 시간 동안 얼마 동안 위치가 변했느냐로 정의합니다. 즉 ‘달팽이가 10초 동안 3cm를 움직였다’, 이런 식으로 표현하는 양이죠. 즉 이동 거리와 그 이동 시 걸린 시간을 반드시 언급해야 하는 양이죠. 수식으로 쓰면

v=\frac{s}{t}

이고요, 위 달팽이의 속도는 0.03m / 10 sec = 0.03m/sec, 즉 1초에 0.003m를 이동하는 속도 되겠습니다.

얼래? 무의식적으로 속도의 단위를 말해버렸네요, 네, 속도의 단위는 m/sec를 씁니다. 1m/sec는 1초에 1m를 움직이는 속도란 뜻이죠. 차는 km/h라는 단위를 많이 쓰죠? 1시간에 몇 km를 가느냐죠. 결국 시간 대비 이동 거리라는 개념은 똑같습니다.

가속도(Acceleration)

가속도의 정의는 얼마만큼의 시간 동안 얼마만큼 속도가 변했냐로 정의합니다. 즉 ‘이 차는 0km/h에서 100km/h가 되는데 4초 걸리는 차다'(우와, 이 정도면 가속도 하나만큼은 수퍼카 급이로군요)라는 이야기를 하면 이 이야기는 바로 가속도를 말하는 것입니다. 수식은

a=\frac{v}{t}

이고요, 위 차는 속도가 4초 사이에 0m/sec에서 27.78m/sec(100km/h가 초 대비 m로 바꾸면 27.78m/sec입니다. 소수 세째 자리에서 반올림하긴 했지만요)로 변했으므로, (27.78m/sec – 0m/sec) / 4sec = 6.945 m/sec^2입니다. 어쿠야, 또 단위를 미리 말해버렸네요, 가속도의 단위는 m/sec^2을 씁니다. 1라는 가속도는 1초 사이에 속도의 변화가 1m/sec 일어난 것이랍니다.

여담입니다만, 속도, 가속도의 단위를 보시면, 그 값을 구하는 수식의 형태에서 그 단위가 유추되었음을 알 수 있습니다. 나머지 개념의 단위들도 마찬가지랍니다.

힘(Force)

다시 아까 차 이야기로 돌아가서, 도데체 그런 무시무시한 가속도는 무엇 때문에 생길 수 있을까요? 엔진의 힘이죠? 네, 맞습니다. 힘이란 바로 가속도를 발생시키는 원천입니다. 여기서는 먼저 수식을 보도록 할까요? 웬간한 사람들은 다 아는, 뉴튼 역학을 대표하는 정말 유명한 등식인데요,

F=m{\cdot}a

역학에서 이야기하는 힘이란 어떤 질량(무게라는 표현과는 약간 차이가)을 가진 물체의 속도를 변화시키는 양입니다. 정지되어 있는 1kg의 물체를 1초 뒤 1m/sec의 속도로 움직이게 하려면 힘을 가해야 합니다. 2kg의 물체면 직관적으로 생각해도 힘이 더 들겠죠? 어쨌든 1kg의 물체를 1초 뒤 1m/sec로 움직이게 하는 힘을 1 kg{\cdot}m/sec^2라는 단위를 씁니다….. 만 너무 길어서, 위 식을 발견한 아이작 뉴튼(Isaac Newton)의 이름을 딴 Newton이라는 단위를 쓰고 1N이라고 씁니다. 1N는 1kg의 물체를 1 m/sec^2로 가속시키는 힘입니다.

일(Work)

역학에서 정의하는 일은, 힘을 들여서 물체를 이동시키는 것을 이름입니다. 철수는 1kg의 물체에 1N의 힘을 가해 1m 이동시키고, 철영이는 1kg의 물체를 1N의 힘을 가해 2m 이동시켰으면 철영이가 일을 더 많이 한 거죠? 수식은

W=F{\cdot}s

입니다. 가운데 큰 점은 ‘내적’이라 하는 벡터 연산을 뜻하는데, 여기서는 벡터에 대한 생각은 접어두기로 한 만큼 그냥 곱셈이라고 하죠 ^^. 단위는 J(Joules)을 쓰는데요, 1J은 바로 1N의 힘으로 물체를 1m 옮긴 일의 양을 뜻합니다.

일률(Power)

일률이란 시간 당 한 일의 양입니다. 일을 얼마나 빡시게 했느냐를 따지는 양이랄까요? 철수는 1초에 1J의 일을 하고(즉 물체에 1N의 힘을 가해 1m를 움직이는데 1초가 든 것) 철영이는 10초에 1J의 일을 했다면(물체에 1N의 힘을 가해 1m를 움직이는데 10초가 든 것) 누가 더 빡시게 일을 했는지 비교하자는 개념이죠. 수식은

P=\frac{W}{t}

단위는 W(Watt)를 쓰는데요, 1W는 1초에 1J의 일을 한 양이랍니다. W는 전기에 쓰는 것 아니냐고요? 맞아요. 그 W도 바로 이 W입니다. 웬 전기에 역학에서 쓰는 단위냐고요? ㅎㅎ. 이야기가 잠깐 옆으로 세는데요, 전기도 역학적인 힘을 발생시켜요. 바로 모터죠. 거꾸로 역학적인 힘은 전기도 발생시키잖아요. 바로 발전기! 즉 전자기학과 역학은 서로 호환된답니다~. 그래서 전기 기구가 하는 일률 또한 이 W로 표현 가능하다~ 이 말입죠. 원래는 역학의 단위인 이 W가 전기 분야에서 더 많이 쓰이는 통에, 자동차 같은 것에다 이 W를 쓰면 영~ 어색하게 되어버렸지만요~ ㅋㅋ.

다시 일률 이야기로 돌아와서, 철수는 1초에 1J의 일을 했으니 1W의 일률을 보였고, 철영이는 10초에 1J의 일을 했으니 0.1W의 일률을 보였네요. 보수를 주려면 철수가 더 많이 받아야 할 듯.

마력(馬力, Horse Power)

자, 드디어 마력입니다. 음… 한자나 영어나 죄다 말의 힘이지만, 기실 이 마력은 힘의 단위가 아니라 일률의 단위입니다. 즉 일률의 단위에는 W 말고 이 마력도 있다, 이 말씀입죠.

근디 이 놈의 마력이 영국 마력, 프랑스 마력이 있고 난리가 아니네요. 네이버 백과 사전에 따르면 우리나라에서 1마력 = 735.5W로 친답니다. 즉 1마력이란 735.5kg의 물체를 1 m/sec^2 가속시키는 힘으로 1m를 움직이는데 1초가 든 정도의 일률이죠. 좀 복잡? ㅋㅋ

(뱀발)

마력이라는 것을 제대로 알기 위해서는 일률의 개념을 제대로 알아야 하고 일률을 제대로 알기 위해 일, 힘, 가속도, 속도라는 개념이 굴비 엮이듯 엮여 있는 통에 다 언급을 했습니다.자동차에서 마력이라는 단위를 많이 만나는데, 대부분 인터넷에는 피상적인 정의만 올라온 듯 하여, 확 정리 좀 할 겸 해서 써 보았습니다.

그런데 아직도 토크(torque)라는 물리량은 잘 모르겠어요! 끄아악!!!!! 회전에 관한 역학은 어렵더라 T.T

인터넷 안 되는 윈도우 PC에 텐서플로우 설치

배경

  • 사내에서 텐서플로우로 뭘 하려면 역시 업무 PC에 텐서플로우를 설치해야 함.
  • 그에 비해 텐서플로우 공홈 설치 문서는 인터넷 연결을 전제함에 비해, 보안이라는 미명 하에 외부 인터넷 차단하는, *&*%^$ 같은 조직이 생각 외로 많음.
  • 이런 서버 사이드는 리눅스(Linux)가 짱짱맨이다 보니 리눅스 가정하는 정보가 많음. 다만 상당히 많은 회사가 여전히 업무 PC OS로 윈도우 씀 (개발 1도 모르는 사장님도 오피스는 써야 한다. 그런데 엑셀은 정말 훌륭하다).

간단 요약

  1. 준비물: Anaconda, Protocol Buffer conda 패키지, Tensorflow conda 패키지
  2. 준비물을 수단과 방법을 가리지 말고 설치하고자 하는 PC의 디스크에 저장한다. (그 구체적인 방법까지 이 글에 쓸 순 없다. 읽는 분 사정이 모두 다를 거라.)
  3. 아나콘다 ( Anaconda ) 설치 – 너무 간단해서 따로 설명 안 함.
  4. 프로토콜 버퍼 ( Protocol Buffer ) 설치
    D:\tools\Anaconda3\pkgs> conda install protobuf-3.5.1-py36_vc14_3.tar.bz2
  5. 텐서플로우 ( Tensorflow ) 설치
    D:\tools\Anaconda3\pkgs> conda install tensorflow-1.4.0-py36_0.tar.bz2

상기 순서를 준수해야 함.

주요 Q&A

  • 왜 아나콘다를? 생짜 파이썬 배포판 대비 통계/분석 등의 파이썬 라이브러리를 선탑재하고 있어서 편하다. 파이썬 하려는 이유가 통계/분석/수치 처리/빅데이터/인공지능 같은 것 때문에 하려는 것이라면 정말 아나콘다 사용 권장.
  • conda는 뭐임? 아나콘다에서 쓰고 있는 CLI 패키지 관리자. 생짜 파이썬에 기본적으로 들어 있는 것은 pip.
  • 프로토콜 버퍼는 왜 설치하나? 텐서플로우가 프로토콜 버퍼를 필요로 한다(전문가스러운 말로는 ‘의존성이 있다’고 한다). 이거 없이 텐서플로우 쓴 파이썬 코드 돌리면 아래와 비슷한 에러가 날 것이다.
    D:\Documents\PycharmProjects\tensorflow>python hello.py
    Traceback (most recent call last):
      File "D:/Documents/PycharmProjects/tensorflow/hello.py", line 1, in 
        import tensorflow as tf
      File "D:\Tools\Anaconda3\lib\site-packages\tensorflow\__init__.py", line 24, in 
        from tensorflow.python import *
      File "D:\Tools\Anaconda3\lib\site-packages\tensorflow\python\__init__.py", line 52, in 
        from tensorflow.core.framework.graph_pb2 import *
      File "D:\Tools\Anaconda3\lib\site-packages\tensorflow\core\framework\graph_pb2.py", line 6, in 
        from google.protobuf import descriptor as _descriptor
    ModuleNotFoundError: No module named 'google'
    
    Process finished with exit code 1
    
    D:\Documents\PycharmProjects\tensorflow>
  • 프로토콜 버퍼 말고 다른 패키지에 대한 의존성은 없나? 당연히 있지만 아나콘다에 선탑재된 거라 설치 작업을 따로 할 필요 없다.
  • 왜 pip 기준으로 안 쓰고 conda 기준으로 글을 썼나? 맨 첨엔 pip로 설치 시도했다. 그런데 pip용 protocol buffer 패키지에서 win64 용 패키지를 못 찾아 ‘포기하려 했다’. 그런데 conda 패키지론 win64용 프로토콜 버퍼 conda 패키지가 있었다. 에다가 pip는 설치할 때 옵션도 줘야 하지만 conda는 그딴 거 필요 없더라.
  • 버전은 어떻게 되나? 아나콘다는 Anaconda 3 5.0.1(파이선 3.6이 들어 있음), 텐서플로우는 1.4, 프로토콜 버퍼는 3.5.1
  • 텐서플로우 버전은 1.4로 고른 이유는? 글 쓰는 시점 기준 텐서플로우 공홈 의 API 문서가 1.4 버전이라 그렇다.

인터넷 안되는 환경에서 고군분투하시는 분들에게 도움이 되길!

샤오미 A1 한 달 사용기

예전에 쓰던 전화기가 넥서스 5였는데, 배터리가 반나절도 못 버티는 상태가 되던 차, 16일짜리 유럽 여행에서 그런 조루 배터리 전화기론 힘들겠다 싶어 샤오미 A1을 사서,  오늘로 약 30일이  되었다. 이제 요모조모 다 본 듯 하여 후기를 남겨본다.

살만 한가?

그렇다. 특히 부가세  포함 천 원 빠지는 30만원이란 가격을 고려하면 더욱 더.

왜 샤오미 A1을 샀나?

다음 세 가지 이유다.

  • 한국 정발(네비 회사인 아이나비가 공식 판매 및 AS. 스마트폰 땜에 내비가 예전 같지 않지.)
  • 기계값 싸고(정말 중국 제조사의 가격 경쟁력은 엄청나다. 싸다고 샀던 넥서스 5도 한국 정발 가격이 50만원대였는데.)
  • OS 업데이트를 구글이 직접 챙겨 빨리 된다.

사실 넥서스 5를 썼던 이유기도 하다. 아이폰 X / 8과 갤럭시 노트 8도 생각해 보았으나, 그 비싼 단말기 값이 ㅎㄷㄷ했다. 특히 아이폰 X는 무려 160만원! 가뜩이나 LTE 요금제도 3G 요금제보다 비싼 판에. 더불어 갤럭시 노트 8, 펜이 탐 나 매장 가서 들어봤는데, 은근 무겁더라.

안드로이드원?

구글은 넥서스 시리즈를 끝내고 픽셀 시리즈를 내놨다. 그런데 픽셀 시리즈는 넥서스의 후속으로는 보기 어려운 것이, 넥서스가 ‘안드로이드 전화기는 이렇게 만들어야 함요’  하고 시범 보이는 목적이 강하다면, 픽셀은 애플이  차지한 ‘고가로 팔리는 명품스런 전화기 시장’에 안드로이드를 침투시키는 것이 목적이다. & 삼성전자가 구글 맘 같지 않아서 직접 나선 것이고. 그래서 픽셀 은 넥서스와 달리 가격도 비싸고, 심지어 아이폰처럼 이어폰 구멍도 빼버리고 AirPod처럼 Pixel Buds를 출시할 정도로 열심히 애플을 따라 하고 있다.

저가 시장을 위해 구글은  안드로이드원이라는 규격을 휴대폰 제조사에게 제시했는데, 이게 하드웨어는 전화기 제조사들이 알아서 하지만 안드로이드 업뎃은 구글이 직접 챙기는, 매우 넥서스스러운 체계로 움직인다.

장점은?

싼 가격, 빠른 OS 업데이트를 제외해도

  • 글씨가 또렷하게 잘 보이는 디스플레이. 동영상보다 웹 사이트 글을 많이  읽는 사용 행태를 보이는 내 입장에서는  글씨 또렷하게 보이는 것이 중요하다. 뻥 좀 보태서 애플  레티나  디스플레이 수준? (저 아이패드 / 맥북 프로 사용자기도 합니다. 믿어주세요~)
  • 빠릿빠릿한 반응성. 최근까지 넥서스 5란 오래 된 전화기를 써서 나에겐 더  도드라져 보일 수도 있다.
  • HD 보이스. 음질이란 것도 사람마다 틀리긴 하나(황금귀란 말이 있는 쪽 아닌가) 확실히 상대방 말이 산뜻하게 들렸다. KT로 개통 시
    • 요금제는 LTE 요금제로 하고(3G 요금제로 하면 HD 보이스 안된다는 말 들었다)
    • 개통 시 기종을 OPENMODEL2 대신 PTA-VOLTE로 등록 (아이나비는  샤오미 A1을 자급제  전화기로만 팔 예정이라 이통사 개통 전산엔 샤오미 A1이라고 딱 지정된 것이 없다).

    하면 HD 보이스 활성화됐다는 문자와 함께, HD 마크가 팍 뜬다.

  • Dual USIM. 외국 나갈 때 해외 USIM 많이 쓰는데, 걍 한국 쓰던 USIM 옆에 해외 USIM 끼우면 되므로 한국 USIM 보관에 신경 덜 쓸 수 있다. 또는 LTE로 데이터 통신 전용 USIM을 하나 더  끼울 수도 있다. 다만 두 번째 USIM 끼우는 자리에는 마이크로 SD카드를 끼울 수  있는데, 이러면, 당연하지만, USIM은 하나 밖에 못 쓴다. 즉 USIM 2개 또는 USIM 하나 + SD카드 조합만 가능.
  • 듀얼 카메라. 사람은 눈이 두 개가 있어 입체감을 느끼고,  AR(augmented reality)을  적용한 앱 / 서비스 만들려면 카메라 두 개인 게 좋다. 이번 아이폰 8/X 발표 때 애플이 AR 엄청 힘 줘서 말했는데, 애플 따라쟁이가 전략인 샤오미도 AR을 좌시하지 않겠단 의지를 보인 셈.
  • 지문 인식. 지문 인식 첨 써보는데 정말 편하다. 인식률도 만족스럽다.
  • 하루 반 나절은 버티는 배터리. 다만 이것도 오래된 넥서스 5 써서 더 도드라져 보일 수는 있다. 유럽 여행 시 사진 찍고 SNS에 사진 올리고 글 쓰고 인터넷 하는데 숙소 들어오기 전에 배터리 떨어져 곤란한 적이 없었고, 돌아다닐 때 보조 배터리 안 들고 다녔다.

를 꼽을 수 있다. 부가세 포함 정발 가격 29만 9천원 받고 파는 전화기로 이런 기능을 어찌 다 넣을 수 있나 싶다.

단점은 없나?

그럴리가.

  • 사진 품질. 특히 야경 찍지 마라. 맘 아프다.
  • 음량 조절 / 전원 버튼의 지*맞은 위치. 익숙해지긴 한다만 음량 줄이려다 전원 버튼을 눌러버려 화면이 꺼지는  실수를 자주 하게 된다. 특히 음량 감소 + 전원 버튼을 동시에 눌러야 하는 캡쳐를 하노라면 짜증이 솟구친다.

동영상은 안 찍어 봐서 모르겠다만 화질은 기대할 수 없겠지.

끝으로

저가 시장에서 도무지 밀리지 말라‘던 크리스텐슨 교수 말이 떠올랐다. 팬택이 사라지고 독설가들은 ‘LG전자 이러다 스마트폰에서 철수한다’는 말까지 하는 마당에 이런 고품질, 저가격의 중국 전화기를 보니 소비자로서는 반갑기도 하고 중국의 실력이 무섭기도 하다.

어쨌거나 이 전화기 덕에 복마전 같은 한국 단말기 유통의 호갱이 되는 건 피한 듯 싶다.

끝!

Putty용 개인 키를 Notepad++ SFTP에서 쓰려면

최근 프로젝트를 하면서 ssh / SFTP 접속을 위해 패스워드 대신 확장자가 PPK인 개인 키(private key) 파일을 받게 되었다. 이 PPK 파일은 윈도우에서의 대표적 ssh client 프로그램인 Putty에서
쓰는 개인 키 파일 형식으로, Putty는 물론 Filezilla에서도 이 파일은 잘 쓸 수 있다.

서버에서 쉘 등을 짜게 되면 ssh로 들어가 vi로 편집해도 되지만 아무래도 개발 PC의 편집기에서 SFTP로 서버 상의 파일 불러오기 / 저장하기 기능을 선호하게 된다. 저작권 문제도 있고 해서 Notepad++을 상당히 애용하는 편인데, Notepad++의 SFTP 플러그인(NppFTP)은 불행하게도 PPK 형식의 개인 키는 이해하지 못하고 OpenSSH 형식의 개인 키만 인지한다.

즉 개인 키의 포맷을 PPK에서 OpenSSH로 바꿔야 한다는 뜻인데, 이 때 윈도우에서 쓸 수 있는 것이 PuttyGen이라는, Putty의 사촌격인 프로그램이다.

  • puttygen.exe 파일을 구한 후 실행시킨 다음
  • File -> Load Private Key 메뉴를 골라 PPK 파일을 읽어 들인 후
  • Conversions -> Export OpenSSH Key 메뉴를 고르면
  • OpenSSH 형식의 개인 키를 저장할 파일명을 고르는 대화상자가 뜬다.
  • 파일명을 지정하고 ‘저장’ 버튼을 누르면 완료!

이렇게 생성한 파일을 NppFTP에서 쓰면 SFTP 접속이 깔끔하게 된다.

(참고 문헌)

  1. Notepad++ NppFTP plugin fails to connect via SFTP – 내가 겪었던 바로 그 문제에 대한 해답. 역시 StackOverflow. 다만 영어.
  2. PuTTY를 사용하여 Windows에서 Linux 인스턴스에 연결 – 한글. 다만 이 글은 반대의 경우인,
    OpenSSH 형식의 개인 키를 PPK 형태로 변환하는 요령을 설명한다.