우분투에서 C++ 개발하기 (1) - 컴파일 과정 및 gcc

이 글은 윈도우에서 Visual Studio만 쓰다가 Ubuntu를 생소하게 생각하는, 나와 같은 사람을 위해 쓴다.

글쓰기에 들어가기 전에 Visual Studio와 같은 통합 환경에 비해 리눅스에서 C++과 같은 언어를 개발한다는 것이 얼마나 복잡한 일인가부터 상기시켜야겠다. C++ 자체가 원래 언어차원에서부터 빌드가 영 까다로운 부분이 있다. 리눅스 사용자는 그 문제를 그대로 정면으로 맞이해야 한다.  그나마 편리하게끔 만든 것이 3편에서 나오는 CMake 정도인데, 이것마저도 복잡한 스크립트를 직접 입력해야 한다.

자유롭고 오픈될 수록 불편하고 복잡하다. 자유도가 높다는 것은 그 자유를 누릴 수 있을 수준으로 공부와 노력을 들여야 겨우 좀 사용할만하다는 뜻이 된다. 


하여튼 글 쓰기의 계획은 이렇다.

1. 맨 땅에 삽질하는 심정으로 g++컴파일러를 직접 이용해본다.
2. makefile을 이용해본다.
3. CMake를 이용해본다.
4. vscode를 활용하여 개발환경을 구축해본다.

그 첫번째, 맨 땅에 삽질하기.


1. C++의 컴파일 과정


VS만 쓰다보면 컴파일러 개념이 희박해지는데, 이는 당연한 것이다. VS라는 훌륭한 툴이 있기 때문에 우리는 아무 것도 신경 안 써도 된다. 원래 정치 선진국일수록 국민들이 정치에 무지하다. 그러나 리눅스를 제대로 이용하려면 컴파일에 대해서 좀 자세히 알아야 한다.

컴파일 과정을 모르는 사람을 위해 최대한 자세히 설명해본다.
컴파일 과정은 다음과 같다.

[소스코드] -> [바이너리] -> [실행파일]

소스코드는 사람이 읽을 수 있는 텍스트 파일이다. 이것을 컴퓨터 명령코드(기계어)로 번역하게 되는데, 이렇게 번역된 결과물을 보통 '오브젝트 파일', 혹은 '바이너리 파일'로 부른다. 두 명칭 모두 약간 애매모호한 점이 있어서 설명해본다.

우선 '오브젝트 파일'이란 말은 컴파일의 목적이 된다는 뜻에서 나왔다. 또 다른 말로 '타겟 파일' 혹은 '오브젝트 코드', '타겟 코드' 이런 말들로 불리는데 다 같은 말이다. 소스의 반댓말이 타겟 아니겠는가.

'바이너리 파일'란 말은 본래 '텍스트 파일'의 반댓말로서, 아스키 코드로 작성되어 텍스트로 읽을 수 있는 파일이 아닌 것들의 집합이다. 즉, 사람이 읽을 수 없는 파일이란 뜻이다. 소스코드는 사람이 읽을 수 있는 텍스트 파일의 일종이다. 반대로 기계어로 번역된-컴파일된 파일은 사람이 읽을 수 있는 텍스트 파일이 아니다. 이런 의미에서 컴파일된 결과물을 바이너리라고 부르는 것이다.

파일은 두 가지로 나뉜다. 프로그램과 프로그램이 아닌 것. 프로그램은 실행이 가능한 명령어로 구성된 것이고, 그렇지 않은 문서파일, MP3등은 프로그램이 아니다. 여기서 바이너리는 큰 의미에서 프로그램으로 봐야 한다. 얘기하다 보니 점점 산으로 간다.

하여튼 우리가 작성한 C++코드는 바이너리(프로그램)으로 번역된다. 바이너리는 여러 개일 수 있다. 그런데 이들은 바로 실행할 수 없다. 이들을 묶어서 OS가 실행할 수 있는 실행파일로 만들어주는 작업이 링크이다. 바이너리는 다시 말해서 프로시져(함수)들의 묶음이다. 이 함수들 중에 main이란 놈이 있다면, 이것을 시작점(엔트리 포인트)으로 해서 프로그램을 실행한다. 그래서 main 함수는 무조건 하나 있어야 하며, 한 개만 있어야 한다.

main이 없으면 바로 실행할 수는 없지만 라이브러리는 될 수 있다. 정적 라이브러리, 동적 라이브러리, 이런 친구들이 될 수 있다는 것이다. 이런 라이브러리들은 main이 없다.

결론적으로 컴파일 작업을 수행하는 컴파일러와 링크 작업을 수행하는 링커는 엄연히 다른 존재다. 그러나 보통 컴파일러라고 하면 링커의 기능도 들어있다.


2. 컴파일러 잡설, gcc


컴파일러는 소스코드를 기계어로 번역하는 작업을 한다고 했다. 그런데 우리는 한 가지 기계(컴퓨터, CPU)만 가지고 있는 것이 아니다.

재미삼아 미약한 지식을 동원하여 컴퓨터의 역사를 살펴보면 옛날에는 컴퓨터란 놈이 표준이 없고 우후죽순으로 각자 자기만의 컴퓨터를 개발해서 쓰곤 했다. 완전히 다른 컴퓨터들이었기 때문에 서로 명령어와 구조가 달랐고, 그래서 각자 컴파일러를 따로 가지고 있었고, 프로그램 호환도 전혀 안 됐다. 그러다 IBM에서 자신들의 CPU 아키텍쳐를 오픈하면서 시장을 거의 점령했고, 이 IBM 구조의 CPU 시장을 점령한 회사가 인텔, 그리고 AMD이다(약 80년대 후반부터). 이 IBM호환 기종에서도 약간 변종이 있는데, 80386 CPU 시절 개발된 x86(32bit) 구조, 그리고 AMD에서 개발한 x86-64(64bit) 구조가 있다. 현재는 이 두 가지 정도 쓰이고 있는데 점점 64bit로 점령되는 추세이다. x86시리즈는 대부분 윈도우 운영체제가 탑재되며 리눅스도 많이 쓰인다. MacOS도 x86으로 갈아탔다.

여기까지는 일반적인 데스크톱 컴퓨터의 얘기인데, 임베디드 - 소형화된 컴퓨터에서는 사정이 좀 다르다. 아직도 다양한 경쟁사들이 저마다의 CPU 아키택쳐로 경쟁하고 있는 형국이며, 그 중에서도 단연 1위는 ARM이다. 스마트폰에 들어가는 CPU가 대부분(내가 알고 있는 전부는) ARM으로 되어 있고 라즈베리파이도 ARM이다. 운영체제는 전부 리눅스(안드로이드)이다. ARM은 버전 6부터 시작해서 현재 8까지 나와있다. 

컴파일러는 CPU구조, 그리고 운영체제에 따라서 달라진다. 그 말인 즉슨, 프로그램을 하나 만들었을 때, 이 프로그램이 실행될 수 있는 CPU, 그리고 운영체제가 정해져 있다는 것이다. 

여러분들이 CPU를 하나 만들었다고 하자. 그러면 그 CPU를 동작시킬 수 있는 예제 코드가 필요할 것이다. 그리고 그 코드는 보통(100%) C언어가 된다. C언어로 Hello World를 만든 뒤, 이것을 내가 만든 CPU 명령어로 번역할 수 있는 컴파일러가 필요하다. 그래서 CPU를 만들면 반드시 컴파일러도 같이 만들어줘야 한다. 이 컴파일러 프로그램을 따로 만들어서 사람들에게 나눠줄 수도 있지만, 그냥 다들 컴파일에는 gcc를 쓰고 있으니, 내 CPU에 대한 컴파일 기능을 gcc에 추가한다.

gcc는 모든 리눅스에서 공통으로 쓰는 컴파일러 모음을 뜻한다. 더 멀리는 원래 GNU프로젝트를 시작하기 위해 만들었다는데, 알게 뭐냐. 하여튼 컴파일러 = gcc이다. gcc는 리눅스 운영체제위에서 실행된다는 가정아래 x86, x86-64, armv6, v7, v8 모두를 커버할 수 있다. 그 외에도 듣도 보도 못한 CPU까지 커버한다. 앞서 설명했듯이 모든 CPU 제조사가 gcc에 자기 CPU를 추가하기 때문이다. 아래 링크를 참고하자. 


그래서 결론 : 컴파일러에는 gcc만 있는 것은 아니지만 그런데 gcc면 왠만큼 다 해결이 된다는 것이다.

크로스 컴파일이란 빌드 머신과 타깃 머신이 다른 경우를 말한다. 빌드 머신이란 현재 컴파일이 수행되고 있는 컴퓨터이다. 타깃 머신이란 컴파일 결과물이 실행될 컴퓨터이다. 안드로이드의 경우가 가장 대표적이다. 안드로이드 폰에서 돌아가는 프로그램을 안드로이드에서 개발하는 경우는 거의 없다. 휴대폰에서 엄지손가락으로 코딩하고 그걸 빌드하는 사람이 있겠는가? 보통은 리눅스나 윈도우에서 개발을 해서 apk까지 빌드하고, 이 파일을 안드로이드에 보낸다. apk가 실행되는 타깃머신은 안드로이드인데, apk를 만들어낸 개발 머신은 윈도우이다. 이런 경우를 가리켜 크로스 컴파일이라고 한다. 라즈베리 파이나 그보다 작은 소형 임베디드 보드는 거기서 직접 컴파일 하고 디버깅하고 어쩌구 하기가 매우 불편하니까 대개 크로스컴파일을 하게 된다.

그럼 자바, C#, 파이썬은 어떻게 동작하는가? 이들 언어는 동작하는 방식이 C와 꽤 다르다. 너무 산으로 가면 안 되니 생략.

g++은 gcc의 일부분으로서 C++언어의 컴파일러이다. 요즘 나오는 우분투에는 기본으로 깔려 있다. 여기서 재미있는 사실은 gcc는 C언어의 컴파일러인데 이건 C++로 만들었다. 마인크래프트에 보면 손으로 나무 깎아서 나무 곡괭이 만들고 그걸로 돌캐서 돌곡괭이 만들고 그걸로 철 캐서 철도끼 만들고 철도끼로 나무 캐고 그렇게 하듯이 컴퓨터 언어의 세계도 비슷하다. 포트란으로 C컴파일러 만들고 C컴파일러로 C++컴파일러 만들고 그걸로 다시 C컴파일러 만들고 그걸로 파이썬 만들고 파이썬으로 파이썬 컴파일러 만들고 ...

만약 gcc가 안 깔려있으면 깔아줘야 한다. 우분투에서는 C 언어 프로그래밍 개발에 필요한 것들을 패키지로 묶어서 배포한다.


$sudo apt install build-essential

요렇게 입력하면 gcc랑 make랑 cmake 등등 필요한 것들이 설치될 것이다.

3. 간단한 빌드

드디어 잡설을 끝내고!

본격적으로 개발에 들어가보자.

대충 폴더 하나를 만들고, 그 속에 main.cpp 파일을 작성한다.

<main.cpp>
#include <iostream>
int main()
{
    std::cout << "U**** F***** UBUNTU!\n";
    return 0;
}

다음과 같이 실행해본다.


g++ -c main.cpp #main.o 파일 생성

이렇게 하면 main.o 파일이 자동으로 생성된다. main.o는 앞서 말한 오브젝트 파일 : 바이너리다. 바이너리 파일은 바로 실행할 수 없다. 메인 함수가 물론 포함되어 있지만 그래도 곧바로 실행할 수는 없고, 리눅스가 실행할 수 있는 형식의 파일로 만들어야 한다.


g++ -o test main.o #main 파일 생성
./test #실행

main.o 파일이 바이너리 파일이고, 확장자가 없는 test 파일이 실행파일이다.

하나의 c/cpp 파일은 하나의 바이너리를 생성한다. 그런데 만약 파일이 여러개라면 어떻게 될까? 아래와 같이 파일을 만들어보자.

<my.h>
int myfunc(int val);

<my.cpp>
#include "my.h"
int myfunc(int val)
{
    return val + 1;
}

<main.cpp>
#include <iostream>
#include "my.h"
int main()
{
    std::cout << "calling up myfunc : " << myfunc(3) << std::endl;
    return 0;
}

이제 다음과 같이 명령어를 입력한다.


g++ -c main.cpp

컴파일러는 main.cpp파일을 들여다보고 my.h 파일을 현재 디렉토리에서 찾아낸다. my.h에는 myfunc에 대한 정의가 있으므로 컴파일에는 문제가 없다. main.o 파일이 생성된다.


g++ -c my.cpp

myfunc의 구현이 컴파일되어 my.o 에 담긴다. 이제 main.o와 my.o를 묶어서 test라는 실행 프로그램을 만들면 된다.


g++ -o test main.o my.o

이 실행의 결과로 test파일이 생성된다. 오브젝트 파일이 더 많을 경우에는 줄줄이 다 갖다 붙이면 된다.

여러 개의 바이너리 파일 중 main함수는 단 한개만 있어야 한다. 두 개 있거나 없으면 실행파일이 안 만들어진다.


이 쯤 되서 헤더파일이 무엇인지, 컴파일과 링크가 무엇인지 다시 한 번 생각해보자. 헤더 파일은 함수의 스펙을 적어놓는 것이다. myfunc 함수를 이용해야겠는데, 그 함수가 입력값이 어떤지 출력은 어떤 타입인지 알 수가 없다. 그래서 이 함수는 이렇소이다~ 하고 소개해놓은 것이 헤더파일이다. main.c에서는 헤더 파일의 정보만 보고 프로그램이 잘 돌아갈 지 생각해본다. 헤더에 의하면 입력은 int 한 개이고 출력도 int이다. 문법적으로 문제가 없으면 일단 OK, main은 컴파일이 가능하다.

컴퓨터 조립을 할 때, 부품을 하나의 공장에서 생산하지 않는다. CPU는 인텔에서 만들고 메인보드는 MSI에서 만들 때, 서로 통일된 스펙과 인터페이스만 맞춰놓고 각자 만든다. 나중에 컴퓨터 조립을 할 때, 각자 만든 부품을 연결해서 완성시킨다. 컴파일 과정도 마찬가지인데, 두 개의 바이너리가 각자 빌드된다(컴파일). 서로의 인터페이스에 대한 정보는 헤더파일을 참고한다. 나중에 링커를 통해서 그 둘을 연결(링크)하면 비로서 하나의 프로그램이 된다.


4. 라이브러리 참조


우리가 앞서서 #include <iostream> 이라고 작성했을 때, 무슨 일이 일어났는지 다시 생각해보자. iostream은 헤더 파일 이름이다. (확장자가 아예 없다.) 이 파일은 내 시스템 어딘가에 위치해 있는데, 보통은 /usr/include/c++/4.xxx/ 디렉토리에 들어있다. 본래 어떤 헤더 파일이든지 include 하려면 그 헤더파일이 들어있는 경로를 컴파일러에 알려줘야 한다. 하지만 왠만한 프로그램에서 다 쓰는 이런 스탠다드 라이브러리는 미리 디폴드 경로가 등록되어있다. 이것을 확인하고 싶으면 다음과 같이 명령어를 입력해본다.


g++ -v

혹은


export CPLUS_INCLUDE_PATH

이제 iostram파일을 포함하여 컴파일 하는 데는 문제가 없다. 하지만 링크 과정에서 iostream에 있는 함수와 클래스들이 어디에 어떤 파일로 로 구현되어있는지를 알려줘야 한다. 이것도 디폴트로 등록되어 있다.
우선 라이브러리 파일(바이너리)의 이름은 libstdc++.so.6 이고 파일의 위치는 대체로 /usr/lib 이다. 이 디렉토리는 환경변수 $LD_LIBRARY_PATH에 등록되어 있다.

지금까지 봐왔던 .o 파일이 아니라 .so 인 이유는 동적 라이브러리이기 때문이다. 동적 라이브러리는 윈도우로 치면 dll파일이다. 정적 라이브러리는 링크할 때 직접 그 내용이 실행 파일 안에 복사된다. 그래서 바이너리 파일 크기만큼 실행 파일의 크기가 늘어난다. 반면에 동적 라이브러리는 프로그램에 포함되지 않는다. 대신 프로그램 실행할 때 위치만 알려주면 된다. 그래서 실행파일의 크기가 늘어나지는 않지만, 실행파일 단독으로 프로그램 실행이 안 되고, 꼭 동적 라이브러리를 옆에 붙여줘야 한다. 여러 프로그램에서 동시에 쓰는 바이너리 파일이 있다면 동적 라이브러리가 되는게 유리하다.

만약에 다른 라이브러리를 추가하고 싶으면 다음 세 가지를 컴파일러에 알려줘야 한다.

*관련 헤더파일의 검색 경로
*관련 라이브러리 검색 경로
*관련 라이브러리 파일 이름

헤더파일의 경로에는 -I(대문자 아이) 옵션,  라이브러리 검색 경로에는 -L옵션, 라이브러리 파일 이름에는 -l(소문자 엘) 옵션을 준다. 누구야 첨에 이거 만든 사람 왤케 헷갈리게 I랑 l이랑 섞어놨어..

myfunc을 라이브러리화 해서 추가한다면 다음과 같이 명령어를 입력한다.

#my를 컴파일하여 my.o를 생성한다.
g++ -c my.cpp


#my.o를 묶어서 static library로 만든다. (libmy.a 생성)
ar rcs libmy.a my.o

여기서 ar은 오브젝트 파일을 정적 라이브러리로 만들어주는 툴이다. 오브젝트 파일과 정적 라이브러리는 사실상 차이가 없으며 형식상 약간 다를 뿐이다. 정적 라이브러리란 오브젝트 파일들의 집합이라고 표현할 수도 있으므로 zip으로 묶어주는 것과 비슷한 개념으로 생각해도 좋다.
또한 여기서 라이브러리 이름에 lib라고 붙인 것은 gcc에서 관습적으로 쓰는 표현인데 꼭 지켜야 한다. 해당 파일이 라이브러리임을 나타낸다. 확장자가 a라는 것만 봐도 라이브러리임이 명확한데 굳이 파일 이름에 prefix까지 붙이는 건지 나로서는 이해할 수가 없다.

이제 다음과 같이 입력한다.

#실행파일 'test' 생성
g++ -o test main.cpp -lmy -L./

여기서 -l, -L옵션과 뒤에 나오는 인자 사이에 공백을 두지 않음에 유의한다. libmy.a 파일에서 앞의 lib와 확장자 .a는 빼야 한다. 기호 "./"는 현재 경로라는 뜻으로서 libmy.a 파일이 들어있는 경로를 밝혀줘야 한다. l은 숫자 1이 아니라 소문자 알파벳 k다음에 나오는 l 이다.

동적라이브러리 만드는 과정은 더 쉽다. 그건 알아서 찾아보자.. ㅎㅎ

라이브러리 한 두개 정도는 이런 식으로 추가가 가능하지만 일반적인 프로젝트는 수십개의 오브젝트파일과 수십개의 라이브러리를 묶어서 컴파일하기 마련이다. 이러한 컴파일 옵션을 간소화하기 위해 makefile이 생겨났고, makefile도 작성하기 힘들어서 CMake와 같은 빌드 툴이 개발됐다. 다음 화에서 차차 살펴볼 것이다.


우분투에서 C++ 개발하기 (2) - Make

우분투에서 C++ 개발하기 (3) - CMake
Read More

로지텍 G102 : 가성비 최고의 게이밍 마우스



예전에 노트북 리뷰에서도 밝혔지만 가성비가 좋다는 말은 결코 칭찬이 아니다. 가격대 성능비 라는 말에서 성능이란 센서의 감도나 기능을 뜻한다고 볼 수 있는데, 그런 것들을 제외하고 정숙성, 내구성, 클릭감, 기타 재료 마감 등에서 분명히 아쉬운 부분이 있기 때문이다. 어쨌든 모든 사람이 고급을 쓸 필요는 없다. 중요한 것은 자신이 원하는 마우스를 원하는 가격대에 사는 것이다.




6버튼 마우스이다. 좌 / 우 / 휠버튼 / DPI 조정 버튼 / 오른쪽 엄지부분에 앞, 뒤 네비게이션 으로 구성되어 있다. 모든 버튼은 커스터마이징이 가능하다. 하드웨어 매크로도 지원해준다.

DPI는 400부터 8000까지 폭넓게 지원하며 50단위로 조정 가능하다. 최대 5개까지 미리 저장해놓은 뒤, 버튼을 눌러서 원하는 DPI를 선택할 수 있다.




마우스 엉덩이의 불빛도 조절할 수 있다. 아예 끄거나, 밝기를 어둡게 하거나, 일정 시간이 움직임이 없으면 꺼지도록 설정할 수 있다. 컴퓨터 키고 잘 때나 어두운 곳에서 영화볼 때, 불빛을 약하게 해두면 좋을 것이다.



동영상으로 찍으면 소리가 다소 과장되긴 하지만 그 누가 들어도 마우스 클릭 소리가 큰 편이다. 오른쪽 엄지 버튼도 클릭감이 영 싸구려같다. 마우스 선도 그저 그런 재질이다.

가장 큰 특징은 마우스 전체 재질이 가벼운 ABS 플라스틱이며, 기타 다른 마감은 아무 것도 없다. 손에 닿는 것은 순수하게 플라스틱이다. 고급스럽지는 못하겠으나 내구성이 좋고 청소가 편하다. 고무로 덧씌워져 있는 것들은 1년만 지나면 죄다 벗겨지기 마련이다. 손톱이 닿지 않아도 1년만 지나면 금방 닳아서 벗겨지고, 그 다음부터는 계속 벗겨진 부분이 거슬려서 못 쓴다. 사람마다 다르겠으나 나에게는 플러스 점수.

휠만 고무로 되어 있는데, 물렁하거나 미끄럽지 않아서 좋고 청소하기 편한 구조로 되어 있다.

그냥 까만 색상에 아담한 크기의 양손 마우스라서 사무실에서 쓰기에도 부담이 없다. 징그러운 디자인 보다는 이렇게 수수한게 좋더라.

크기가 작아서 손바닥 전체를 감싸지 못한다. 대신 클로그립이나 핑거그립에는 안성맞춤. 손바닥이 뜨거운 나같은 사람들은 이렇게 작은게 좋다.

성능은 어떠하냐. 우선 DPI는 8000까지 확보되어서 만족.




위의 그림에서 위쪽은 폴링 레이트 125Hz, 아래쪽은 1000Hz이다. 레이트가 낮으면 빠른 원 그리기에서 계단 현상이 나타난다. 하지만 직선으로 천천히 움직일 때는 부드럽게 그려진다.
반대로 레이트가 높으면 마우스가 빠르게 움직일 때도 계단 현상 없이 움직임을 잘 잡아준다. 반대로 서서히 직선을 그으면 삐쭉삐쭉 튀는 모습이 보인다. 저렇게 튀는 것이 마우스 센서의 정직한 정확도이다.
왜 125Hz에서 직선이 부드러운가? 1000Hz라면 8번 나누어서 센싱할 것을 평균 내기 때문이다. 평균을 내니 노이즈가 제거된다.

5년 전인가 비싼 돈 주고 산 스틸시리즈의 센세이와 비교해보면 거의 비슷한 느낌이다. 하드웨어 매크로 기능같은 것도 옛날에는 7만원 이상의 고가 마우스에만 탑재됐었는데 지금은 2만원대에서 그런 기능을 다 맛볼 수 있게 됐다.

http://support.logitech.com/en_in/product/g102-prodigy-gaming-mouse/downloads
설정 프로그램은 윈도우만 지원한다. 보드에 메모리가 있어서 한 번만 설정해두면 프로그램 없이도 설정한 대로 잘 동작한다. 물론 설정은 한 가지만 지원하며 DPI만 여러 개 돌려쓰기 가능.



설정 프로그램 설치하면 끼워팔기가 있다....

결론적으로..
너무 싸지도, 너무 비싸지도 않은 적절한 가격과 성능에 각종 편의 기능이 잘 조립된 마우스라고 할 수 있다. 게임용으로도 사무용으로도 적당하고 아이손 어른손 가리지 않는 적절한 크기라서 매우 범용성이 높다.
적절한 가격/성능에 청소가 편리한 점까지 합쳐서 PC방에서 쓰기 딱 좋다.

소음에 민감한 사람은 한 번 더 생각해보라.



----------------------------



현재 로지텍에서 지원하는 드라이버가 두 가지 버전으로 나뉘어져 있는 형국이다. 하나는 Logitech G HUB이고 다른 하나는 Logitech Gaming Software이다. 2020년 8월 현재는 모든 커뮤니티에서 구버전에 해당하는 LGS를 추천하고 있다. G HUB는 온디바이스 프로파이을 제대로 지원하지 않는다.

https://support.logi.com/

여기 들어가서 다운로드 페이지를 보면 된다.

참고로 그냥 꽂아서 잘 되고 셋팅에 불만이 없으면 드라이버 필요없다. 온디바이스 설정 한 번 잘 해놓은 사람도 재차 드라이버를 설치할 필요 없다.


Read More

레오폴드 FC750R 실버(은축) 리뷰

레오폴드에서 드디어 은축(스피드축) 모델이 나왔다. 나름 깔끔한 마감으로 소문이 난 레오폴드라서 스피드축 입문에는 아주 좋을 듯 하다.


1. 스피드축에 대해서

스피드축은 스트로크 깊이가 짧아짐과 동시에 키 입력을 감지하는 입력 깊이가 매우 짧아져서 아주 살짝만 눌러도 바로 인식이 된다. 이 점에 대해 기존 적축/리니어 유저라도 적응하지 못하는 사람이 꽤 있는 듯.

키보드를 타이핑하는 습관은 손목의 움직임과 손가락 움직임이 합쳐져 있다. 손목을 많이 쓰면 타이핑하는 힘이 좋지만 정교함은 다소 떨어진다. 반면에 손가락을 오물오물 움직이면 키를 누르는 힘은 떨어지지만 더욱 정교한 움직임이 가능하고 키보드에 따라서는 더 빠른 타이핑이 가능하다. 거의 손목으로 치는 사람들은 대체로 흑축이나 청축의 반발력을 좋아하기 마련이고, 스피드축을 활용하면 오히려 오타가 많이 날 수 있다. 예를 들어 손목을 크게 움직여서 ㅌ 키를 눌렀을 경우 손 모양에 따라 ㅎ이나 다른 키가 살짝 같이 눌릴 수 있기 때문이다. 스피드축은 될 수 있으면 손목의 움직임은 제한하면서 손가락을 열심히 놀려서 타이핑하는 것이 좋다. 그리고 이렇게 했을 때, 에너지를 덜 쓰면서 편안한 타이핑이 가능하고, 소음이 상당히 줄어든다. 다만 팬터그래프를 쓸 때 처럼 아예 손가락만을 이용해서 타이핑하기에는 스트로크 깊이가 애매하게 깊다. 하여튼 치다 보면 키보드에 맞는 움직임으로 적응하게 된다.

글을 쓰는 본인이 가장 마지막에 사용한 키보드가 청축이다. 청축을 쓰다가 스피드축을 써보니 그 심심함과 가벼움이 확 와닿아서 당혹스러웠다. 기존에 파워풀한 흑축/청축을 쓰던 유저들은 입문하는데 상당한 인내가 필요하다.

한 가지 덧붙여서, 적축은 윤활을 안 하면 서걱임이 상당한데, 스피드축은 서걱임이 별로 없다. 윤활 잘 된 변흑 쓰던 추억이 떠오를 정도.

2. 레오폴드에 대해서


키캡은 레오폴드에서 자체개발한 PBT 이중사출. 기존의 이중사출은 대부분 ABS인 것에 비하면 10배는 고급이다. 이중사출은 애초에 두 가지 색의 플라스틱을 이용해서 만들기 때문에 각인이 지워질 수가 없다. 기존의 레이저 각인 PBT가 까슬까슬한 감촉이었다면 이번 레오폴드 이중사출 키캡은 오돌토돌한 감촉에 아기자기한 느낌이 난다. 안 그래도 가벼운 스피드축이 더 가벼운 느낌으로 다가오게 만든다. 차라리 표면이 맨질맨질하면 더 키감이 좋겠다는 생각이 든다. 그리고 조금 더 무거웠으면 좋겠다.



그래서 체리 POM 무각을 끼워봤다. 체리 정품 POM은 더 두껍고 맨질맨질하다. 그래 이 맛이야 ㅜㅜ 훨씬 더 정숙해지고 단정하고 단단한 느낌이다. 역시 리니어 스위치에는 무조건 무겁고 단단한 키캡이 최고.


1, 2, 3, 4 자리에 POM 키캡을 끼워봤다. 소리가 다르지? 키감도 달라 ㅜㅜ


\

같은 모델 청축과 비교했을 때.


레오폴드의 마감은 현재 기성품중에서는 최고 수준이다. 스테빌라이저(SHIFT, ENTER에 쓰임)도 아주 경쾌해서 이질감이 없다. 심심한 디자인은 취향에 따라 다를 것이다. 키보드가 뒤틀릴 경우 힘을 주어서 바로 잡으면 된다는데, 애초에 뒤틀리는게 잘못 아닌가. 레오폴드는 뒤틀림 그런 거 없다. 레오폴드가 통울림이 크다는 사람은 최소 마제 안 써본 사람.

후면의 딥스위치를 조절하면 컨트롤과 캡스락의 위치를 바꿀 수 있다. 더불어 키캡도 따로 제공해준다. 그리고 나머지 딥 스위치도 이런 저런 키배열 수정이 가능한데, 다 쓸모없는 것 같다. 제일 필요한 건 'ESC'와 '~'를 바꿔주는 것인데, 이런 거 왜 안 나오는지 모르겠네.




3. 결론


기계식 키보드 대신 멤브레인을 선호하는 사람들이 내 주변에도 가끔 있는데, 그들이 공통적으로 말하는 기계식 키보드의 단점은 첫째로 시끄러운 소리, 둘째로 너무 깊은 스트로크, 그리고 세 번째로 험악한 디자인이다. 이런 단점을 모두 커버할 수 있는 키보드라고 할 수 있으므로 기계식 입문으로 자신있게 추천한다.
Read More

Visual Studio 2017 + 파이썬 + Tensor Flow 셋팅

Windows에서 파이썬이 돌아간다는 사실은 모두가 알면서도 막상 딥러닝 프레임워크를 돌릴 때는 리눅스를 사용하게 된다. 프레임워크를 사용한 수많은 예제들이 모두 리눅스 기반으로 돌아가기도 하거니와 왠지 윈도우 파이썬은 뭔가 호환이 안 될것 같은 기분 탓이다. 요즘은 파이참(PyCharm)이라는 좋은 개발 환경도 있고, Visual Studio에서도 파이썬을 기본으로 서포트해주기 때문에, 윈도우에서도 특별한 고생 없이, 어쩌면 리눅스보다 더 편하게 파이썬을 사용할 수 있다.

그러나 시작은 언제나 두려운 법. 파이썬 초보들도 쉽게 Tensor Flow를 셋팅할 수 있도록 튜토리얼을 작성해본다.

우선 Visual Studio를 깔아야한다. 2017버전을 설치할 때, Python 개발 환경을 체크해야 한다. 혹시 설치할 때, 체크하는 것을 놓쳤다면 나중에라도 Visual Studio Installer를 실행해서 추가 설치가 가능하다.


여기서 파이썬을 선택한 뒤 수정 버튼을 누른다.

설치를 진행하면 VS의 파이썬 코딩 툴 뿐 아니라 파이썬 자체가 새로 설치된다. 이미 기존에 파이썬이 설치되어 있더라도 마찬가지이다. 여기서 의문이 드는 점은 여러 개의 파이썬을 설치할 경우 어떻게 되느냐 이다. 파이썬은 다양한 버전이 존재하고, 사람마다, 소스마다 써야 하는 버전이 다르기 때문에 자연스럽게 여러 가지 버전을 모두 설치하게 된다. Visual Studio 역시 이러한 파이썬의 사정을 잘 알고 있기 때문에, 설치된 파이썬 버전을 직접 관리할 수 있도록 기능이 제공된다.

개별 파이썬 버전은 폴더 단위로 관리된다. 설치 폴더 밑에 python.exe가 있고, 하위 폴더로 Scripts, Lib 등이 있다.


여러 개의 파이썬이 설치될 때는 위와 같은 폴더가 여러 개 생성된다.

이제 VS에서 파이썬 프로젝트를 만들어보자.

파이썬 프로젝트를 선택하면 된다.




솔루션 탐색기에서 Python 환경을 보면 Python 3.6 (64-bit) 라고 되어 있고 바로 뒤에 (전역 기본값) 이라고 되어 있다. 새 프로젝트를 만들고 나서 특별히 환경을 지정하지 않았으므로 기본값이 지정된 것이다. 특별히 다른 파이썬 버전으로 현재 프로젝트를 구동하고 싶다면 환경에서 오른쪽을 눌러서 고를 수 있다.

이쯤에서 소개할 것은 아나콘다이다. 아나콘다는 파이썬 배포판 중 하나라고 할 수 있다. 예를 들어 리눅스가 래드햇, 페도라 등 다양한 배포판을 가지고 있는 것과 같다. 리눅스 배포판이 핵심 커널 뿐 아니라 다양한 유틸리티를 포함하고 있는 것처럼 아나콘다도 자주 쓰는 라이브러리를 미리 탑재하고 있다.

파이썬 환경에서 중요한 포인트 중 하나는 각각의 파이썬 환경마다 다른 라이브러리를 설치할 수 있다는 것이다. 파이썬에서 설치한 라이브러리는 Lib 폴더에 저장된다.

파이썬에서는 라이프러리를 패키지 단위로 관리한다. 패키지란 라이브러리 묶음으로 생각하면 될 것이다. 예를 들어 우리가 OpenCV를 설치할 때, 각각의 lib파일을 개별적으로 다운받는 것이 아니라 OpenCV라는 묶음으로 설치한다. 이렇듯 패키지란 개념은 이미 일상에서 자연스럽게 사용하고 있다. 파이썬에서는 패키지 다운로드를 위한 툴을 기본적으로 탑재하고 있는데, 그것이 바로 pip이다. pip로 다운받은 패키지는 파이썬 폴더/Lib/site-packages 폴더에 저장된다.

Visual Studio를 사용하면 pip를 좀 더 쉽게 사용할 수 있다. 메뉴에서 [도구]->[Python]->[Python 환경]으로 들어가면 조그만한 도킹 창이 뜬다. 맨 위에서 원하는 환경을 선택한다. 아나콘다를 설치했거나, 기타 다른 버전의 파이썬을 설치했다면 해당 환경을 고를 수 있다. 만약 설치한 환경이 보이지 않는다면 수동으로 추가해야 한다.

 가운데 콤보박스에서 패키지(PyPI)를 고른다.



설치된 패키지가 나타나는데, 특별히 다른 것을 설치하지 않았다면 달랑 pip, setuptools 정도 보일 것이다. X표를 누르면 패키지를 지울 수 있고 화살표를 누르면 최신 버전으로 업데이트한다.

패키지 검색 창에 tensorflow라고 입력해보자. 엄청나게 많은 항목이 뜨는데 대부분의 것들은 텐서플로우를 보조하는 툴이거나 실험 버전 등이고 중요한 것은 그냥 'tensorflow', 그리고 'tensorflow-gpu' 이다. 'tensorflow-gpu'는 말 그대로 GPU 버전이고 그냥 tensorflow는 CPU only 버전이다. 둘 다 설치하면 어떻게 될까? 조금 꼬이긴 하는데 마지막에 설치된 버전이 적용된다. Keras를 사용하면 내부적으로 tensorflow를 참조하는데, 여기서도 마지막에 설치된 버전을 참조한다.





일단 CPU 버전인 'tensorflow'를 설치해보자. 클릭 한 번이면 설치가 시작되고, 설치 과정은 [출력] 창에 표시되는데, 이게 아무래도 좀 불친절하다. 프로그래스 바, 혹은 진행중 표시가 없으니 설치가 되는 건지 됐다는 건지 안 됐다는 건지 알 수가 없다. 하여튼 설치됨 메시지가 뜨면 완료된 것이다.


설치 과정을 잘 읽어보면 알겠지만 필요한 라이브러리들은 자동으로 설치된다. 만약 설치가 안 된다면 pip 버전을 업데이트 한 후 다시 설치해보자.



설치가 끝났으면 이제 헬로 텐서플로우를 외쳐볼 시간이다. 솔루션에서 .py 파일을 하나 선택한 뒤 다음과 같이 입력한다.

import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

참고로 솔루션에서 진하게 표시된 파일이 F5를 누를 때 처음 시작될 파일이다. 파이썬은 Matlab과 마찬가지로 메인함수가 없고 아무 파일이나 골라서 먼저 실행할 수 있다.

2018-04-27 08:34:58.484009: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
b'Hello, TensorFlow!'
Press any key to continue . . .

위와 같이 메시지가 뜨면 성공이다. 맨 윗 줄에 Your CPU supports 어쩌구 하는 경고 메시지는 무시해도 된다. 원래 Tensorflow를 최적화하려면 CPU에 맞게 다시 빌드해야 하는데, 현재는 범용으로 컴파일된 라이브러리를 쓰고 있기 때문에 나타나는 메시지이다.

여기까지 진행되면 CPU 버전 텐서플로우 설치가 완료된 것이다. 이제 tensorflow-gpu를 설치해보자. GPU버전은 사용하려면 CUDA를 지원하는 NVidia 그래픽 카드가 있어야 하고, CUDA, cudnn 설치도 해야 하서 좀 복잡하고 귀찮지만 CPU버전에 비해 거의 20배 빠르기 때문에 충분히 해볼만한 가치가 있다. 사실 GPU가 아니면 딥러닝은 시작되지도 못했다.

Tensorflow 버전에 따라서 요구하는 CUDA, cudnn 버전이 다르다. 확실히 하려면 Tensorflow 홈페이지를 방문해서 확인해보면 된다. 영 귀찮으면 그냥 최신 버전을 설치하면 그냥 저냥 잘 될테지?? 라고 생각하면 오산이다. 텐서플로우 버전에 정확히 맞는 것을 찾아서 설치해야 한다. 현재 tensorflow 1.7 버전은 CUDA 9.0, cudnn 7.1.x 에서 동작한다.


우선 CUDA를 설치해야 하는데, 구글에서 cuda를 검색하면 자연스럽게 다운로드 페이지로 이동한다. 자신의 OS를 잘 선택하고 windows버전을 골라서 다운로드한다. 설치 과정은.. 그냥 next만 누르면 알아서 잘 설치된다. 설치 도중에 화면이 깜빡거릴 수 있으며 단순히 다음을 눌러서 간편 설치를 할 경우 그래픽 드라이버도 새로 설치된다.

다음은 cudnn을 설치해야 하는데, 우선 다운로드 하려면 NVidia ID로 로그인을 해야 한다. ID가 없으면 새로 만들고 로그인한다.



로그인 후 버전을 선택한다. 자신의 CUDA 버전에 맞는 것으로 잘 골라서 다운로드 하면 된다.

CUDA는 설치 프로그램이 알아서 설치를 했지만 cndnn은 받아보면 그냥 압축 파일이다. 아무곳이나 편리한 곳에 풀어놓은 뒤, 설치경로/cuda/bin 폴더를 PATH로 잡아줘야 한다.

혹시 PATH 잡는 법을 모르는 사람들을 위해 안내까지 만들었다~ 시작메뉴에서 제어판을 검색해서 실행한 뒤 아래처럼 폴더 경로를 넣는다. 캡쳐하기 귀찮아서 한꺼번에 모아서 캡쳐 ㅎㅎ




변경된 환경변수를 적용하기 위해서는 재로그인/혹은 재부팅을 해야 한다.

이제 Python pip에서 tensorflow-gpu를 다운로드하고 실행해보면 된다. 다운로드하는데 20분이 걸릴 수도 있으니 천천히 기다려보자.


2018-04-27 23:38:33.037407: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2018-04-27 23:38:33.783060: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1344] Found device 0 with properties:
name: GeForce GTX 965M major: 5 minor: 2 memoryClockRate(GHz): 1.15
pciBusID: 0000:01:00.0
totalMemory: 2.00GiB freeMemory: 1.64GiB
2018-04-27 23:38:33.789763: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1423] Adding visible gpu devices: 0
2018-04-27 23:38:34.209099: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:911] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-04-27 23:38:34.213833: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:917]      0
2018-04-27 23:38:34.216125: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:930] 0:   N
2018-04-27 23:38:34.218824: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1041] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1405 MB memory) -> physical GPU (device: 0, name: GeForce GTX 965M, pci bus id: 0000:01:00.0, compute capability: 5.2)
b'Hello, TensorFlow!'
Press any key to continue . . .

위와 같이 나오면 성공 ^^

Read More

개발하다 빡칠 때


//코드에 무엇이 들어있는지 너희는 모른다.
//하고 싶었던 것들은 애초에 사라지고
//때리고 침 뱉고 온갖 모욕이 뒤섞여
//내 자존심은 티 한 스푼만큼 들어있을까.
//당신 탓인가 아니 내 실렷 탓인가 그냥 우주의 신 때문일까
//생각과 부등호와 담배 꽁초와 알 수 없는 이름들
//산으로 가든 바다로 가든 무슨 상관이냐
//시간이 끝나고 금방 다 잊혀지면
//나도 다 까먹고 말텐데

-------------

잔소리 한 번 들었다고
갑자기 감성이 모락모락 피어올라 쓰는 시 ㅎㅎ
Read More

SyncToy - 쉽고 간단한 로컬 백업-클론 프로그램



한 때 압축 프로그램 시장을 석권했던 알집. Windows XP와 너무나 어울리는 바로 그 알집! 이미 많이들 알고있겠지만 그 성공 요인을 내 나름대로 정리하면 다음과 같다.

1. 쉬운 인터페이스

2. 쉬워보이는 인터페이스

쉬운 것도 중요하고, 쉬워 보이는 것도 중요하다. 우리에게 쉬운 기능만큼 중요한 것은, 뭘 잘못 눌러서 큰일날 것 같은 그 불안감을 진정시킬, 아름다운 그림들이다. 이야말로 진정한 힐링이 아닐까. 전 세계적으로 UX가 유행하기 전에 이미 대한민국에서는 그 패러다임을 완벽하게 선보였던 것이다.

압축 속도는? 해제 속도는? 모른다. 어때, 쫌 기다리지 뭐.

이 특징은 알약에서 극대화된다.





필요한 기능을 전면에! 괜히 어려운 것은 다 빼고, 필요한 것만, 원하는 것만. 나머지는? 아 몰랑.

지금이야 스마트폰 시대를 맞아 심플하고 플랫한 디자인에 익숙하지만 과거에는 이렇게 아기자기한 이미지가 유행이었다. '잘못 눌러도 괜찮으니 어서 날 눌러줘!'


하여튼 이게 주제가 아니고 하드디스크 백업, 클론과 관련해서 엄청나게 많은 프로그램이 있는데 이들 중 알약과 같은 위치를 차지하는 프로그램을 소개하고자 한다.

그 이름은 SyncToy. 마이크로소프트에서 만들었다. 대충 만들어놓고 만족하는지 최근의 업데이트는 이뤄지지 않고 있다.

다운로드 :

동작 원리는 너무나 이해하기 쉽다. 두 폴더를 쌍으로 엮어서 서로 싱크를 맞추면 땡.

그나마 복잡한 건 싱크 방법인데, 양방향으로 싱크를 맞추던지 한방향으로 싱크를 맞추던지 하는 정도이다.

실행을 눌러주면 바로 싱크 작업에 들어가고, 여러 개의 쌍을 동시에 맞출 수도 있다.

자, 그렇다면 싱크를 맞추는 도중 파일을 옮기면 어떻게 되는가? 아 몰랑. ㅎㅎ 딱히 그 부분에 대해 알려주는 것도 없고 설정하는 것도 없고. 알아서 어떻게 되겠지 뭐.

속도는? 그냥 파일 카피하는 속도랑 비슷하다. 특별한 최적화는 없다. 기타 부가 기능은? 모른다. 없다.

땡땡땡. 끝.
Read More

엑스박스 원 S 게임 패드 - 불량이면 교환하자, 블루투스 업데이트하자



정식 명칭 Xbox Wireless Controller. 엑스박스 원 S 로 불리는 패드를 샀다.

1. 교환기


살 때 다음과 같은, 무시무시한 협박이 있었다.



  요인 즉슨, 버튼 감도나 반응속도, 소음과 같은 기타 불만족스런 내용으로는 교환이 안 되고, 확실하기 뭔가 고장난 것만 교환이 가능하다는 것이었다. 다시, 이 말인 즉, 버튼 감도나 미세유격과 같은 미세한 차이가 제품마다 있으며, 이러한 불만 사항이 많이 접수가 된다는 뜻이다.

  나 같은 경우에는 트리거 버튼의 바닥치는 느낌이 오른쪽은 고무 패드를 치는 것 같은데 왼쪽은 플라스틱을 치는 것 같아서 교환을 요청했다. MS에 상담전화를 했더니 감도 같은 주관적 견해는 교환이 안 된다는 답변을 들었는데, 객관적으로 아무리 봐도 이상하다고 내가 우겨서 교환을 넣었다. 결국 교환된 패드는 이전의 것과 너무나 달랐다. 이전 것은 십자 패드가 너무 뻑뻑해서 누르기 망설여질 정도였고, ABXY버튼도 부드럽지가 못했는데 교환된 패드는 너무 부드럽고 잘 눌린다. 오른쪽 스틱의 경우에도, 이전의 것은 가만히 놔두어도 왼쪽으로 쏠리는 현상이 있었는데 이번 것은 정확히 정 중앙을 지키고 있다.

  분명 패드마다 감도에 있어서 만족스럽지 못한 불량이 많은데, 이런 것들을 모두 정상품으로 취급하는 모양이다. 문제가 심각하다고 생각되면 주저말고 교환을 요청하는 것이 좋다.

2. 블루투스 연결


  블루투스를 지원하긴 하지만 PC 하나당 한 대만 지원한다. 게다가 블루투스로는 헤드셋 포트를 사용할 수 없다. 게다가 최신 버전의 블루투스 4.0부터만 지원하기 때문에 윈도우의 경우에는 레드스톤 2까지 업데이트를 해야 한다. 내가 가진 스카이 아임백 폰에서도 연결이 안 된다.

  연결하려면 흰색 엑박 버튼을 길게 눌러서 전원을 켠 뒤, 전면의 연결 버튼을 꾹 눌러서 깜빡이는 속도를 빨라지게 만든다. 그 상태에서 원하는 기기와 페어링을 진행하면 된다.
  만약 PIN 번호를 요구하면 연결이 안 되는 것이다. 잘 되면 PIN 번호 따위 없이 그냥 연결이 된다.

  만약에 윈도우 업데이트를 했는데도 연결이 잘 안 된다면 디바이스 업데이트를 따로 해보자. 시작 메뉴의 윈도우 마크에서 오른쪽 클릭 -> 장치 관리자 -> 블루투스 목록 내에서 자신의 블루투스 장치를 찾는다. 오른쪽 클릭 후 [드라이버 업데이트] 항목을 선택, 자동 업데이트를 진행하면 예전의 디바이스 드라이버가 최선으로 업데이트 된다.


Read More

회장님의 글쓰기 - 사내정치로 이루는 유토피아



강원국이란 사람이 지었다. 대우에서 꽤 오랜 시간 일했었고, 무엇보다 김대중, 노무현 대통령의 연설비서관으로 일했다. 대통령의 글쓰기란 책이 너무나 유명하고 잘 팔렸다. 잘 팔리는 김에 속편을 낸 것이다.

  강원국 스스로 말했다, 대통령의 글쓰기가 잘 팔리는 이유에 대해서, 사람들이 대통령을 그리워하기 때문이 아닌가 한다고. 원래는 책을 사볼 생각이었는데, 이 말을 듣자 왠지 책을 다 읽은 기분이 들었다. 노무현에 대해서야 뭐 워낙 잘 알기 때문이고, 또한 질리도록 잘 알기 때문이다. 대신 이 책을 골랐다. 글쓰기와 관련된 책인 줄 알고. 이 책에 대한 지은이의 서평도 약간 들어봤으면 좋을 뻔했다. 아니, 겉표지만이라도 제대로 봤으면 이런 실수는 안 할 뻔했다. 써 있잖아, '상사의 마음을 사로잡는 90가지 계책'. 글쓰기 책이 아니다.

  책속에는 한 번도 나오지 않는 단어, 그러나 이 책의 핵심 주제, 그것은 바로 '사내 정치'이다. 정치란 아랫사람들이 살아남기 위해서 벌이는 행위기도 하지만, 윗사람이 잘 다스리기 위해 벌이는 행위이기도 하다. 이 책은 이런 저런 입장에서 회장부터 말단까지 회사의 각 사람들이 해야 할 올바른 정치의 길을 제시했다. 여기서 올바름의 기준은, '유토피아'다, 즉 모두가 행복한 세상을 만들어내는데 얼마나 부합하는가. 이 '유토피아'란 단어는 대단히 오글거리니까, 좀 다른 말로 대체하자면 우리 모두의 정신 건강 정도 되겠다. 회장님에게 잘 보이는 방법과 같은 처세술이 어떻게 내 정신 건강을 이롭게 하는지는 의문이지만.

  '사내 정치'. 이 단어가 당신에게 어떤 느낌을 주는가? 그 느낌이 바로 내가 이 책을 읽으면서 느꼈던 기분이다. 정말 어땠냐고? 그냥 시시콜콜하다. 억지로 따라간 2차 회식자리에서 교수님이 술에 취해 늘어놓는 일장 연설이랄까. 아니면 온갖 억지 비유 + 10번 넘게 들어본 농담을 끌어다 당연한 얘기를 멋있게 하는 목사님의 설교랄까. 누군가는 교수님 맞는 말 하신다며 끄떡끄떡 하겠지만, 또 누군가는 아멘 할렐루야를 외칠 지도 모르겠지만, 나는 조용히 딴 생각이나 하다가 내일 출근할란다.

  아, 글쓰기? 부록으로 딸려 나오는데, 별 내용은 없다. 진짜 부록이다, 앞서 말했지만 겉표지만 봐도 글쓰기 책이 아니다. 이 사람 말이 얼마나 엉터리냐면, 개요를 작성하지 말고 바로 글을 쓰란다. 왜냐, 언제든지 쓰다보면 무너지는게 개요이기 때문이란다. 언제든 무너지는 개요는 개요가 아니다. 글의 머리부터 발끝까지 짱! 하고 보여야 개요다. 이 사람은 한 번도 개요를 작성한 적이 없는 것이다. '화룡점정', 혹은 '했읍니다'같이 맞춤법 틀리는 일은 제발 없었으면 좋겠다는 매우 신선하고 고마운 충고를, 지금 만원이나 넘게 주고 파는 책에, 좋은 글 쓰는 방법이라며, 당당하게 적어놨다! 맙소사.

또, 예를 들면 다음과 같다.

  나그네가 어두운 밤길을 더듬고 있었다. 그때 먼 곳에서 등불이 반짝였다. 등불을 향해 반갑게 나아갔다.
  "아니, 이럴 수가!"
  등을 든 사람은 앞을 못 보는 장님이었다.
  "당신은 장님이 아닙니까? 그런데 어찌 등불을 ..."
  "예, 이 등불은 나를 위한 것이 아니라 앞이 보이는 사람들을 위한 것입니다. 하지만 등불 덕에 사람들이 나와 부딪히지 않으니 결국은 나를 위한 것이기도 하지요."

  글쓰기는 독자를 따뜻한 눈으로 보는 것에서부터 출발해야 한다. 독자는 빨간 펜 선생님이 아니다. 내 글을 재단하는 검열관이 아니다. 독자는 나와 한편이고 내 글쓰기의 참여자다. 같이 호흡하고 함께 공감하는 친구다. 일기를 쓸때 귀찮기는 해도 두려움을 느끼지는 않는다. 독자가 자신밖에 없기 때문이다. 독자를 과도하게 의식하면 두려움이 생긴다. 잘 보이고 싶은 욕심이 과하면 두려움이 된다. 두려움은 글쓰기에 아무런 도움이 안 된다.
  내가 먼저 솔직해야 한다. 무장을 해제해야 한다. 있는 그대로 보여주겠다는 자세가 중요하다. 웃통뿐만 아니라 '빤스'까지 벗어라. 그래야 허위와 관념에서 벗어날 수 있다. 글이 생생하고 자연스럽다. 글에 꾸밈이 없다. 글에서 인간미를 느낄 수 있다. 독자들이 찾아들게 하기 위해서는 그래야 한다. 자기소개서는 예외다. 솔직해선 안 된다. 그래서는 완하는 회사나 대학에 들어갈 수 없다. 있는 그대로 보여줘서 보기 좋은 사람은 흔치 않다. 읽는 사람이 원하는 방향으로 연출해서 보여줘야 하는 게 자기소개서다.
  독자를 잊는 순간이 있어야 한다. 나의 글쓰기는 3단계다. 첫 번째, 준비 단계에서 철저히 독자를 염두에 둔다. 그들을 파악하고 연구한다. 두 번째, 쓰는 단계에서는 잠시 잊는다. 온전히 나에게 몰두해 쓴다. 이때는 독자를 잊고 자기 내면에 잠겨 잇는 것을 끌어올리는 시간이 필요하다. 셉 너째, 고쳐쓰는 단계에서는 나 스스로 독자가 된다. 내가 독자가 돼서 내 글을 본다. 독자는 이렇게 나의 글쓰기와 함께 하는 존재다.
  독자를 배려하자. 배려는 자기를 중심에 두지 않는 것이다. 거창한 것을 써서 멋있게 보이고 싶은 것은 자기를 중심에 둔 것이다. 그래서 욕심이라고 한다. 그러지 말고 욕망하자. 욕심의 노예가 아니라 욕망의 주인이 되자. 글쓰기에서 욕망은 독자에게 전달할 좋은 내용을 찾고 싶은 마음이다. 또 그것을 좀 더 알기 쉽게 전하고자 하는 노력이다. 나아가 독자의 가슴에 꽂히게 하려고 고민하는 열정이다. 이 모두가 자기가 아닌 독자를 중심에 둔 것이다. 책임감은 반응과 능력의 합성어다. 그러니까 타인에 대해 반응할 줄 아는 능력, 즉 독자에 대한 배려가 글 쓰는 사람의 책임감이다.

  글 앞에서 어찌할 바를 몰라 쩔쩔매는 모습을 보이는 것은 독자에 대한 배려가 아니다. 그런 글은 독자를 불안하게 한다. 자신 있게 써서 부담감을 주지 않는 게 독자에 대한 배려다. 자기가 많이 안다는 것을 글에 드러내면서 우쭐해하는 것도 배려가 아니다. 알기 쉽게 써서 그것을 단번에 이해한 독자가 우쭐할 수 있도록 해야 한다. 장황하게 써서 독자들의 시간을 빼앗는 것 역시 배려가 아니다. 군더더기 없이 간결하게 써서 독자들이 상상할 수 있는 공간을 마련해주는 것이 배려다. 온갖 수식어와 수사법을 동원해서 독자에게 감동을 주려는 시도는 배려가 아니다. 느끼함으로 고문하는 일이다. 담담하고 소박하되 전하려는 메시지가 분명하고 글쓴이가 감춰놓은 의도를 알아채는 기쁨을 주는 것이 독자를 배려하는 것이다.
  잘 쓴 글은 내가 잘 쓴다고 되는 게 아니다. 좋은 글은 독자의 마음에서 나온다. 좋은 글을 쓰고 싶거든 독자를 향해 '장님의 등불'을 먼저 들어야 한다.

 - '회장님의 글쓰기', 강원국 저, 382p~385p에서.

  음... 이 글에는 독자를 배려해야 하는 당위성, 그리고 독자를 배려하는 구체적인 방법을 얘기하고 있다. 신뢰감이 들도록 쓰고, 담백하고 진솔하게, 친절하게 쓰란 거다. 당연한 내용을 너무 길게 적어논 거 아닌가. 그리고 20번은 들어본 것 같은데, 저 등불 얘기.
  완전히 똑같은 내용은 아니지만, 나라면 관련 내용을 이런 식으로 말하겠다.

  회사에서 글쓰기는 예술과 기술의 중간쯤에 있다. 예술은 사람을 감동시키지만, 동시에 작가 자신을 만족시키는 방법이다. 예술적 글쓰기에 너무 빠지면 독자를 만족시키기 전에 자기를 만족시키는 글이 된다. 반면 기술적 글쓰기에 치우치면 내용을 효율적으로 전달하기에는 좋지만, 사람의 마음을 감동시키기 어렵다. 무엇보다 쓰는 사람 스스로도 재미가 없어서 지치기 쉽다.
  회사에서의 글쓰기를 연마하려면 우선 기술적 글쓰기에 완벽해지려고 노력하라. 예술은 아무나 하는 것이 아니지만 기술은 누구나 연마할 수 있다. 흠 없는 문장들만 잘 연결해도 최소한 나쁜 글은 안 된다. 그리고 여기에 당신의 예술성을 충분히 담으면 좋은 글이 된다. 다만 당신만을 위한 작품을 만들지는 마라. 무거운 오페라는 하지 말고 너무 가벼운 뽕짝도 하지 말고, 누구나 즐길 수 있는 발라드를 불러라.

  유시민의 글쓰기 특강을 읽으면서 혼자 마음속으로 정리했던 한 꼭지를 풀어낸 것이다. 이 정도만 써도 충분한 것 같은데. 당연한 얘기를 길게 쓸 필요가 있나.

  굳이 글쓰기의 비결을 이 책에서 찾고 싶걸랑, 뒷부분 말고 오히려 앞 부분에서 비결을 찾아야 한다. 글쓰기 책이랍시고 앞쪽에 사내 정치를 줄줄이 늘어놓은 이유가 있다. 이것이 이 사람이 글쟁이로 살아남은 방법이요, 다른 글쟁이보다 뛰어난 강점이기 때문이다. 강원국은 유시민이 아니다. 그가 이 글에서 직접 말한다, 글 잘 쓰는 '불효자' 말고 글 못 쓰는 '효자'가 되자고. 관계와 소통이 잘 되면 글솜씨도 필요없다는 것이 이 책의 문장을 그대로 옮겨 온, 글쓴이의 생생한 주장이다. 이것이 바로 김대중을 모시고 노무현을 모신 비결이다. 잘난 유시민은 절대로 못 하고 못난 강원국이는 잘 하는 거.

  부조리와 불합리한 생각, 전근대적인 권위의식과 일방적인 의사소통에 대해 유시민은 저항하고 싸우지만 강원국은 받아들이고 그 속에서 나름의 평화와 행복을 추구한다. 그래서 유시민은 완벽한 글쓰기가 필요하지만 강원국은 뭐.. 그렇게까지는 필요없다. 강원국은 그게 더 좋단다. 상사의 부당한 지시와 비이성적인 언행에 잘 맞추어야 서로 행복할 수 있단다.

  내가 신앙 서적을 안 읽는 이유가 있다. 성경에 몇 줄로 요약된 걸 책 한권에 풀어써놔서 지루하기 짝이 없기 때문이다. 사람들은 이해했다는 결과를 얻고 싶음과 동시에 이해되는 과정을 즐긴다. 신앙서적은 책을 읽는 몇 시간 동안, 그 이해되는 과정, 그 유희를 선물한다. 돈 주고서라도 이런 류의 유희를 한가하게 즐기고 싶다면 이 책을 추천한다.

사업은 실력이기 전에 사람이다 라고 생각한다면 이 책을 꼭 보라. 당신에게는 큰 도움이 될 거다.

온갖 정치 행위에 피곤하다면, 당신은 이딴 거 안 봐도 돼 ㅎㅎ 자기 할 일만 똑바로 하면 되지 뭘.


  구글북스에서 11,200원. 쟁반짜장 홍콩반점에서 13,000원.


Read More

gogs 윈도우 설치 따라하기

  모든 개발자가 만능은 아니다. 나는 영상 처리는 잘 하지만 안드로이드 앱은 못 만들고, 리눅스는 sudo랑 ls밖에 모른다. 맥도 써 본 적이 없다. 프로그래머라고 해서 한글 단축키를 다 외우고 다니는 것도 아니고 컴퓨터 맞출라면 얼마 드는지 줄줄 꿰고 있는 것도 아니다. 심지어 카톡에서 동영상을 보내면 그게 와이파이로 나가는지 KT 전화요금이 나가는지 모르는 사람도 있는데 그 분은 컴공과 교수님이었다. 그리고 내가 경고하는데, 알집 쓴다고 무시하지 마라!

  개발자는 항상 새로운 것을 익혀야 하는 직업인데, 그걸 좋아하는 사람은 또 많지 않다. 대체로는 제발 하던 대로 했으면 좋겠다는 주의다. 모든 개발자는 귀찮은 것을 싫어한다.

  그래서 gogs가 나온 것이다! git lab을 이용하여 git 서버를 설치하는 것이 워낙 귀찮은 일이거니와 윈도우가 아닌 리눅스에 설치해야 한다. 이런 거 다 필요없고 윈도우에 간단하게 설치할 수 있는 git 서버, gogs다. gogs는 GoLang이 돌어가는 모든 환경에 설치가 가능하다. 리눅스에서도 git lab보다 훨씬 쉽게 설치할 수 있다.

  gogs를 보면서 생각난 것이 trac다. trac는 'SVN + 이슈 트래커 + 위키'를 단 한 번의 실행으로 설치해준다. 웹서버와 디비까지 몽땅 한꺼번에 말이다. 그것도 윈도우에! gogs는 trac에 비하면 다소 불편하다, 아직도 많이 불편하다. DB도 직접 깔아야 하고, 이런 저런 설정도 필요하다. 아 이것마저 찾아보고 고민하기 귀찮다 하는 분들을 위해, 그래서 내가 이 글을 쓰는 것이다.

  열심히 설명했음에도 불구하고 컴맹에게는 다소 어려운 부분이 있다. gogs가 그렇게 생겨먹었으니 어쩔 수 없다, 용서하시라.

  일단 gogs를 다운받는다. 아래 주소이다. LOCAL : ZIP 이라고 써 있는 부분에서 ZIP을 클릭한다.

https://gogs.io/docs/installation/install_from_binary

글을 쓰는 2016년 10월 현재 최신 버전은 0.9.97이다. 64bit기준으로 간다.



  압축을 풀어보면 gogs라는 파일이 있다. 그렇다, 포터블인 것이다. 아무 곳에나, 아니 아무 곳 말고 D:\gogs 라든지 편리한 곳에 카피한다. 포맷하고 다시 설치하기 귀찮으니 c에는 깔지 말자.

  gogs.exe를 실행해보면 뭔 창이 획 지나간다. 바로 다음과 같은 화면이 지나간 것이다.



  그렇다, 실행하려면 뒤에 파라미터를 넣어야 한다. 다른 것은 잘 모르겠고, git과 연동되는 웹서버를 띄우려면 'gogs web'을 실행한다. 그런데 매번 gogs web이라고 타이핑하기 귀찮으니까 bat 파일을 만든다.

  bat파일을 만드는 방법은? 우선 gogs.txt 파일을 만든 뒤, 내용에 단지 'gogs web'이라고 써놓자. 메뉴에서 파일 확장자 보기를 체크하면 .txt라고 보인다. 여기서 txt를 bat로 바꿔서 gogs.bat파일을 만든다.





  하 괜히 모든 개발자는 만능이 아니고 어쩌구 썰을 풀어논 바람에 이런 것까지 그림 설명을 하고 앉았다 ㅜㅜ

  생성한 bat파일을 실행해보면 아래처럼 뜬다. listen 어쩌구 나오면 성공.



  웹 서버가 열렸으니 접속을 해보자. 인터넷 창을 켜서 주소에 127.0.0.1:3000이라고 쓴다. 감격스런 첫 화면이 열린다.



  딱 보면, 생각나는 게 있다. 제로보드. 지금은 ex엔진이던가? 하여튼 거기서처럼 최초 실행 시에 DB 설정을 해줘야 한다.

  DB를 깔아보자, MySQL. 커뮤니티 버전이 무료이다.

https://dev.mysql.com/downloads/installer/




  위의 주소로 들어가서 아무거나 받으면 된다. 혹시 설치하다가 중간에 꺼지고 아무 것도 안 뜰 수 있다. 당연하다, 우린 인스톨러만 설치했지, 본격적인 인스톨은 아직 안 한 거거든. 시작 메뉴를 살펴보자. MySql Installer를 실행하면 된다.




그런데...



이건 MySQL 자동 업데이트를 하겠냐는 거다. 묻지마 쫌! 에 체크하고 NO.



  우리는 개발자니까, 개발자 디폴트!



  gogs를 그냥 자기 메인 컴퓨터에 까는 사람은  Development Machine을 고르고, 서버 컴퓨터에 까는 거면 Server Machine을 고른다. Dedicated Machine는 DB전용 컴퓨터에서만 선택한다.



  여기서 입력하는 패스워드는 절대 까먹지 말고 어디 적어놓길.



  윈도우 서비스로 등록할거냐 묻는 거고, 시작할 때마다 실행할 거냐고 묻는 거다. 위에서 Development Machine을 선택했으면 부담없이 Next를 눌러도 좋다. Server Machine을 선택했으면 서버니까 당연히 그냥 Next.



  이건 모르니까 Next.



  다왔다. 그냥 Execute. Next! Finish! Execute! 어서 넘어가라.

  자동으로 워크벤치가 뜬다. 디비 설정 쉽게 하는 UI 프로그램이다.


여기서 첫 번째 Local instance를 선택한다.



  난 왜 8.0 버전을 설치한 거지?? 하여튼 Continue Anyway 하여튼.



여기서 일단 눈여겨봐야 할 점은 디비가 저장되는 곳이다. C:\.. 에 저장되어 있는데 나중에 포맷해서 날릴 걱정이 되면 장소를 옮겨야 한다.

http://blog.opid.kr/361

여기 블로그에 잘 설명이 되어 있으니 따라해보시길.



  이제 gogs를 위한 스키마를 만든다. 스키마가 DB고 DB가 스키마다. 아래 그림처럼 빈 공간에 오른쪽 버튼을 눌러서 만든다. 이름은 gogs로 하고 Apply, Finish, Next! Execute!




   이제 MySQL은 끝이다.

  원점으로 돌아와서, 127.0.0.1:3000으로 다시 접속해보자. 신경써야 할 곳은 두 군데다.


  DB 패스워드는 Workbench에서 쓰던 그거다. Repository Root Path는 C 말고 다른 곳으로 정하는 것이 좋겠다.
  나머지 항목들은, 위에서 시키는대로 해왔으면 건드릴 필요가 없다.  감격의 Install Gogs 버튼을 누르면 한참 설치가 된다. DB를 생성하느라고 오래 걸린다.

  근데 문제는.. 내가 설치가 안 되는 것이다. 설치 후 gogs가 재시작되는데, gogs 자체가 실행이 안 된다. 왠지 MySQL문제 같아서 8.0을 지우고 5.7을 다시 까는 삽질을 한 끝에 다시 진행하니 되네. 8.0 버전을 내가 어디서 구해서 깔았는지 기억이 안 난다. 괜히 삽질.


어쨌든 이 상태가 되면 설치는 끝난 것이다. 첫 등록하는 아이디는 자동으로 관리자가 된다. Sign up now!



이 다음부터는 알아서 건드려보기 바란다! ㅎㅎ

근데, gogs가 계속 실행상태여야만 한다. 창을 계속 띄워놔야 함은 물론이고, 귀중한 테스크바 공간을 차지하고 있어야 한다.



  요걸 MySQL처럼 서비스로 만드는 방법이 있다.

https://gogs.io/docs/installation/run_as_windows_service

  위의 링크를 참고한다. 특급으로 설명이 잘 되어 있다 - 영어로. 설명이 구 버전 중심으로 되어 있지만 대충 따라해도 잘 된다.
Read More
Powered by Blogger.