Gladiabots - 싸움밖에 모르는 AI 배틀로봇



Gladiabots 는 로봇 배틀 + AI 프로그래밍을 소재로 한 게임이다. 우리가 알던 배틀로봇이 하드웨어 + 조종술의 대결이라면 Gladiabots는 로봇을 직접 조종하는 것이 아니라 로봇이 어떻게 움직일지를 미리 프로그래밍해야 한다. 같은 로봇을 쓰더라도 얼마나 똑똑하게 움직이느냐가 승패의 관건이다.

로봇은 4종류가 주어지며 각각 속도와 사거리, 파워, 내구성 측면에서 특징이 있다. 이들 로봇을 잘 조합하여 상대와의 대결에 승리해야 한다. 단순한 전멸전도 있지만 특정 영역을 사수한다든지, 깃발 뺏기라든지 다양한 게임 룰이 있다.

싸움은 어떻게 일어날까? 기본은 바로 어그로와 포커스이다. 체력이 떨어진 로봇은 후퇴해서 쉴드를 채우고 상대방을 공격할 때는 하나씩 집중 공격하는 것이 유리하다. 또한 가령 깃발 뺏기의 경우 자연스럽게 수송 병력과 호위 병력으로 나뉘어지며 어느 쪽을 먼저 공격할 것인지, 전략을 잘 세워야 한다.



AI 프로그래밍은 모두 그래픽 기반으로 이루어지며 약간의 연습이 필요하다. 그래서 상당한 양의 튜토리얼을 제공하고 있다.

문제는 너무 순수하게 로봇, 배틀, 프로그래밍에 치중했다는 것이다. 네러티브와 스토리가 없고, 차가운 바닥에 로봇밖에 없다.  포탈을 보라. 자칫 평범한 퍼즐게임이 될 수 있는 것에 환상적인 스토리와 연출이 더해지자 역사에 길이 남을 대작이 되지 않았는가. 자칫 지루하고 까다로울 수 있는 프로그래밍이 어떻게 하면 유저들에게 쉽게 다가갈 수 있는지에 대한 고민이 전혀 없다는 것은 좀 문제가 있다.


AI가 하는 일이란 것도 미로 찾기도 아니고 그저 사거리 계산해서 왔다갔다 하면서 쉴드 채우고 점사하고 이 정도 뿐이라 체감상 불륨이 작다. 파고들기로 얼마나 파고들 수 있는지 모르겠지만 그것만이 게임 컨텐츠의 전부인 것이다.

좋은 그래픽과 스크립트 편집기를 가지고 다양한 컨텐츠를 보여주지 못하는 것이 참 아쉬운 게임이다. 섬멸전, 깃발뺏기, 점령전 외 다른 룰이 있다든지, 로봇의 하드웨어를 고치고 그에 맞는 AI를 설계한다든지 더 다양한 요소가 추가된다면 좋겠다.
 


Read More

프로스트 펑크 - 최상의 연출과 시나리오


 11bit studio는 This War Of Mine 으로 화제가 되어 그 동안 다양한 게임들을 내놓았다. 대형 게임은 아닐지라도 특유의 레트로 감성과 충실한 시나리오로 매나이를 형성하고 있다.

프로스트 펑크는 그 동안의 게임 중 This War Of Mine과 가장 닮은 게임이라고 할 수 있다. 똑같이 혹한의 설정, 그리고 서바이벌 상황에서 무너지는 인간의 존엄성을 주제로 하고 있다.



게임의 주된 컨텐츠는 경영과 심시티이다. 주변의 자원을 채취하고, 건물을 건설하고, 테크트리를 개발하는 등 게임 구조는 매우 평범하다. 다만 혹한에 싸우는 작은 인간 사회라는 설정 속에서 생존을 위해 인간의 존엄성과 양심을 버리도록 선택을 강요한다. 여기에 충분한 연출로 몰입감을 더해서 단순한 매니악한 스크립트 위주의 게임성을 벗어나 대중적인 입맛도 만족시키고 있다.

중요한 건 난이도이다. 난이도가 너무 쉬우면 특유의 긴장감을 느끼기 어렵지만 난이도가 너무 높으면 게임의 분위기를 느끼기보다 시스템을 분석하고 파고들기에 열중하여 그 역시 몰입을 방해한다. 또한 게임에서 다 이기려고 하면 안 된다. 사상자 한 명도 없이 게임을 끝내려고 하는 노력은 안 하는 것이 좋다. 좀 고생도 하고 이래저래 난관이 와도 어떻게든 게임을 붙잡고 진행을 해보는 것이 게임을 제대로 즐기는 방법이다. 공포영화를 보는데 아무도 안 죽는 건 말이 안 된다. 사람이 죽는 긴장감과 스트레스가 싫으면 애초에 공포영화를 선택해서는 안 된다. 이 게임은 사람들이 죽어나가는 상황에서 어떻게든 발버둥쳐야 하는 스트레스와 긴장을 동반하고 있다. 그리고 그 긴장을 즐기는 것이 이 게임의 목적이다.

또 재미난 건 일반적인 심시티와는 달리 직교좌표가 아닌 극좌표계를 채용하여 가운데를 중심으로 동그랗게 건물을 쌓아나가야 한다. 극좌표계 그 자체로도 나름의 재미가 있다.

경영 시뮬레이션 + 심시티 + 생존게임에 적절한 연출이 합쳐진 수작임에 틀림없다.


Read More

강철비2 정상회담 - 좌파출신 국뽕 영화

스포 없음. 아마도. 이 정도면?

코로나 국면에 간만에 영화가 나와서 상당한 기대를 하고 보았으나 초반 5분만에 그냥 안 보고 버릴까 하는 갈등이 생길 만큼 초반 앞 부분은 드럽게 재미가 없다. 대통령과 영부인의 티격태격, 각종 장관들과의 장황한 상황 설명, 그리고 전혀 왜 나오는지 모르겠는 한미일 훈련... 하.. 앞 부분은 정말 볼 게 없다. 전혀 극 전개에 상관없기에 왜 보고 있어야 되는지 모르겠는 이상한 컷들 잔뜩 들어 있다. 할 이야기가 너무 많아서 고르고 고른 장면들이 아니라 시간을 때우려고 작정한 듯한 내용들로 느껴진다.

무엇보다 시작장면. 한반도 위성 사진이 나오면서 자막이 깔리는데, 와 시작부터 진짜 재미없는 영화겠다 그런 느낌.

정상회담 들어가고 나면 그 때부터 시작이다. 트럼프랑 김정은이랑 말싸움 하는 데부터 흥미진진해지기 시작하고, 문재인까지 합세해서 세 사람의 캐릭터극이 시작된다.

그리고 전개되는 것은 일본과의 해전. 핵을 쏘냐 마냐 다투는 중에 잠수함 내부의 권력 다툼과 정치가 펼쳐진다.

그리고 클래식이라고 해야 하냐, 유치한 유머들 덕지덕지 발라져있다. 트럼프가 방귀 뀌고 김정은이 통역하고 막 말도 안 되는 상활들이 펼쳐진다. 트럼프를 완전 개그맨으로 그려놨다.

작중에 계속 나오는 북한 사투리는 북한 사람이 들으면 어떨지 몰라도 내가 듣기에는 충분히 자연스럽고 맛깔나서 나중에는 즐기게 된다. 그 동안 이북 억양은 개그 소재로나 쓰이고 말았지 이렇게 진지한 장면에 그대로 쓰이게 된 것은 근래의 일이다. 이제는 전혀 위화감이 없고 마치 외국어 중 하나를 듣는 기분이다. 잠수함 운전하는 군인들 얼굴도 나중에는 정 들더라.

곽도원은 아주 또라이로 되어 있다. 그 모든 불합리한 부분들을 다 무시하고 그냥 일본에 핵 날리고 말거라고, 생각 없는 자살 공격을 하고 있다. 전혀 공감이 되지 않는 비이성이다. 글쎄, 곽도원의 악역은 이제 좀 질린다. 변호인에서 실컷 했으면 됐지 뭘 자꾸 이런 걸 또 해, 좀 넣어두지.

반면에 김일성은 연기가 아주 좋다. 트럼프한테 북한 사투리로 따질 때 아주 사람 속을 통쾌하게 만드는 그의 분노 연기에 칭찬 1점.



반면 일본군 비행기 조종사의 오바연기는 이게 무슨 건담인가 싶었다. 이쿠죠! 긴박한 상황을 그런 오바연기로밖에 전달할 수 없는 영화의 부실함.

그리고 최악 중의 최악은 음악. 그저 시끄럽다. 시작도 시끄럽고 마지막 잠수함에서 나오면서 깔리는 스트링도 매우 시끄럽다.

그런데도 맨 마지막 평화협정 장면을 보면서 눈물이 왈칵 났다. 현실에서 이뤄진다면 얼마나 좋을까 싶어서. 영화적 완성도는 떨어지는데 순전히 애국심으로 사서 끝까지 봤다. 이게 국뽕 영화랑 다를 게 뭐냐.


---

구글 플레이 무비.. 이거 캡쳐가 안 된다. 그냥 공유 사이트에서 똑같은 돈 주고 다운받으면 마음대로 물고 뜯고 즐기고 맛보는 건데. 플레이어도 매우 불편해서 넘겨보기도 안 되고. 화질도 못 바꾸고. 곰플레이어로 틀면 밝기랑 채도랑 다 조절할 수 있는데. 이래가지고 다음 번에는 절대 안 쓴다. 화질도 최대 720p까지 지원. 아니 720p 까지 밖에 안 지원.

그래도 굳이 보려면 구글 플레이 사이트 들어가지 말고 구글에서 보면 좀 낫다.


Read More

Unity VideoPlayer로 한 프레임씩 동영상 불러오기

Unity에서 동영상을 불러오려면 보통 VideoPlayer를 쓰거나 OpenCV의 VideoCapture를 많이 쓰게 된다. 여기서는 https://forum.unity.com/threads/how-to-extract-frames-from-a-video.853687/ 여기 링크를 참고하여 VideoPlayer를 사용하는 방법을 설명한다.


VideoPlayer는 unity 컴포넌트라서 new VideoPlayer() 식으로 할당하면 안 되고 씬에서 생성한 다음에 넣어줘야 하는데 스크립트에서만 동작시키고 싶으면 Start()와 같은 곳에서 다음과 같이 쓰면 된다.


VideoPlayer videoPlayer = gameObject.AddComponent(typeof(VideoPlayer)) as VideoPlayer;
videoPlayer.Stop();
videoPlayer.renderMode = VideoRenderMode.APIOnly;
videoPlayer.prepareCompleted += Prepared;
videoPlayer.sendFrameReadyEvents = true;
videoPlayer.frameReady += FrameReady;


gameObject가 필요하니까 MonoBehavior 클래스를 상속받아야 한다. 어차피 유니티 모듈이니까 아예 유니티와 상관없이 동작은 안 되는 것이다. 위의 코드는 그냥 예제라서 로컬로 선언했지만 멤버로 선언하는게 맞으르 것이다.

받아오자마자 Stop()부터 하고 APIOnly 모드로 설정한다. 이는 화면에 직접 플레이하는 일은 안 하고 내부적으로만 동작하겠다는 것이다.

preparedCompleted 는 동영상의 헤더를 다 읽어와서 준비가 되면 호출된다. frameReady는 프레임 한 장을 grab 하는 일이 완료되면 불러와진다. 매 프레임마다 불러와지는 것이다.


이제 아래와 같이 주소값을 넣어주고 Prepare를 호출한다.


videoPlayer.url = path;
videoPlayer.Prepare();


여기서 path를 잘 넣어줘야 한다. 아래와 같은 구문을 참고해보자.


string outputPath = System.IO.Path.Combine(Application.streamingAssetsPath, "result.avi");


준비가 완료되었을 때 호출될 함수는 다음과 같다.


void Prepared(VideoPlayer vp)
{        
    vp.Pause();
}


이렇게 포즈를 걸면 0번째 프레임을 불러온다.


void FrameReady(VideoPlayer vp, long frameIndex)
{
    var textureToCopy = vp.texture;

    //initialize
    if (frameIndex == 0)
    {
        images = new List<Mat>();
        texture = new Texture2D((int)vp.width, (int)vp.height, TextureFormat.RGB24, false);
        Debug.Log(vp.width + "" + vp.height);
        Debug.Log(textureToCopy.width + "" + textureToCopy.height);
    }

    if (saveImage)
    {
        Mat mat = new Mat((int)vp.height, (int)vp.width, OpenCVForUnity.CoreModule.CvType.CV_8UC3);
        OpenCVForUnity.UnityUtils.Utils.textureToTexture2D(textureToCopy, texture);
        OpenCVForUnity.UnityUtils.Utils.texture2DToMat(texture, mat);
        images.Add(mat);
    }        

    processRate = frameIndex / (double)videoPlayer.frameCount;
    ProcessRateChanged.Invoke();
    if (frameIndex + 1 == (long)vp.frameCount)
    {
        Debug.Log("INVOKE!!");
        ReadCompleted.Invoke();
    }

    if (frameIndex < frameLimit || (ulong)frameIndex < vp.frameCount - 1 )
    {
        vp.frame = frameIndex + 1;
    }
    else
    {
        ReadCompleted.Invoke();
    }
}


중간에 frameIndex == 0 블럭이랑 saveImage 블럭은 내가 OpenCVForUnity를 활용하기 위해 작성한 것이니 신경쓰지 말자. 하여튼 중요한 것은 textureToCopy가 들어왔다는 것이고, 이것을 이용하여 본인 원하는 작업을 하면 된다.

맨 마지막에 frameLimit는 내가 직접 선언한 것이니 신경쓰지 말고, 중요한 것은 vp.frame에 그 다음으로 읽고 싶은 프레임 번호를 넣는 것이다. vp.frame은 단순한 멤버 변수가 아니고 property이기 때문에 값을 집어넣는 순간 다음 프레임을 읽어오는 동작을 수행한다.

ReadComplete도 내가 직접 만든 것이다. 하여튼 여기에서 다 읽어왔을 때의 동작을 수행하면 된다.


이 방법의 문제점은 Prepare에 실패했을 때 아무런 피드백이 없다는 것이다. Prepare()를 호출하고 얼마간 지났는데도 Prepared 이벤트 함수로 들어오지 않는다면 뭔가 조치를 취할 수 있도록 해야 한다. 우선 아래와 같은 무식한 방법이 있긴 하다.


int count = 0;
while (!videoPlayer.isPrepared && count++ < 100)
{
    Debug.Log("Preparing Video");
    yield return null;
}
Debug.Log("Done Preparing Video");


100 frame이니까 약 3초 정도 기다려보는 것이다. while을 빠져나오고 나면 isPrepared를 다시 검사해서 준비가 되서 빠져나온 건지 아니면 count가 다 되서 빠져나온 건지 확인해보면 된다.

또한 일부 Unity 플러그인에서 레코딩한 파일은 몇 프레임 읽다가 실패한다. 상당수의 비디오 레코더들이 표준 포맷을 지키지 않고 파일을 쓴다. 여타 다른 비디오 플레이어들은 어떻게든 잘못된 포맷 형태를 무시하고 동영상을 플레이해주는데, VideoPlayer는 그들만큼 정성스럽지가 못하다.

유니티에서 공식적으로 지원한다고 밝힌 확장자는 아래와 같다.

https://docs.unity3d.com/Manual/VideoSources-FileCompatibility.html

그런데 여기에 함정이 있다. mp4의 경우, h.264는 잘 불러와지는데 h.265는 따로 코덱을 깔아야 한다. 나는 대충 깔아서 해봤는데 잘 안 되고 신통치 않다;; 같은 avi, mp4 확장자라도 코덱은 천차만별이라 신경 쓰이는 게 한두가지가 아니다. 게다가 윈도우가 아닌 안드로이드로 넘어가면 골치아픔은 두 배가 된다.


Read More

음정

 중3 때 처음 음정을 배울 때 음정에 대해서 이렇게 배웠다.

  *숫자를 세릴 때는 자기 자신부터 세린다.

  *계이름 사이에 반음(미파, 시도)이 한 없으면 장, 있으면 단, 2개면 감

  *감 - 단 - 장 - 증 순이며 조표가 붙어서 간격이 넓어지면 오른쪽으로, 좁아지면 왼쪽으로


뭐든지 이해를 못 할 때는 외우는 게 좋고 외우나 이해하나 결과적으로는 같게 되는 경우가 많다지만 그냥 이해하면 쉬운 걸 굳이 어렵게 외울 때가 있는데, 바로 이런 경우라 하겠다.

음정이란 음 사이의 간격을 나타내는 말이다. 우리가 거리를 잴 때, 25cm, 3m 등으로 말하듯이 음악에서 음과 음 사이의 거리를 말할 때 쓰는 용어가 음정이다.

음악에서 모든 음은 반음 간격으로 이루어져 있으며 1옥타브 내에 12개의 음이 존재한다. 그러므로 그냥 음과 음 사이의 거리를 반음의 개수로 3반음 5반음 이런 식으로 나타내면 그냥 편하지 않느냐고, 공학적인 입장에서는 설명할 수 있지만, 실제로 음악은 그렇지 않다. 음악의 음은 음계 위에서 이루어지며 음 과의 거리도 음계 위에서 설명해야 한다. 예를 들어 자연 장음계에서 미와 솔 사이에는 파, 파# 이렇게 두 개의 음이 있으므로 미부터 솔까지 가려면 3칸 움직어야 하니까 미 솔은 3칸 이라고 하고 솔과 시 사이에는 솔#, 라, 라# 이렇게 3개의 음이 있으므로 솔부터 시까지 가려면 4칸 움직여야 하니까 4칸! 이래버리면 편할 것 같지만... 이렇게 해봐야 원래 음정을 얘기하는 취지가 무색해지고 음악적이지가 않다. 장음계 위해서는 자기 자신과의 거리가 1도이고 미와 솔은 미 파 솔 순으로 진행되므로 3도, 솔과 시 는 솔 라 시 순으로 진행되므로 역시 3도이다. 그런데 같은 3도라고 해도 완전히 똑같은 3도는 아니기 때문에 별명을 붙여서 미솔은 단3도, 솔시는 장3도라고 부르게 된 것이다.

어쨌든 처음 음계의 개념을 이해할 때는 음악적으로 접근하기보다 그냥 공학적으로 접근해버리는 것이 더 이해가 빠를 수도 있다.

다음과 같이 외워보자.

자기 자신과의 거리 = 완전1도

반음 1칸 거리 = 단2도 = 증1도 (미파, 시도)

반음 2칸 거리 = 장2도 = 감3도 (도레, 레미, 파솔, 솔라, 라시)

반음 3칸 거리 = 단3도 = 증2도 (레파, 미솔, 라도, 시레)

반음 4칸 거리 = 장3도 = 감4도 (도미, 파라, 솔시)

반음 5칸 거리 = 완전4도 = 증3도  (도파, 레솔, 미라, 솔도, 라레, 시미)

반음 6칸 거리 = 증4도 = 감5도 (파시)

반음 7칸 거리 = 완전 5도 = 감6도 (도솔, 레라, 미시, 파도, 솔레, 라미)


이런 식이다. 음 사이의 거리에 대해 각각의 별칭이 붙었다고 생각하면 편하다.


그럼 왜 단, 장, 완전 이런 용어들을 붙였을까? 그건 그냥 그 음 간격이 주는 음악적 느낌으로부터 왔다고 해야 될 것이다.

같은 3도 화음이라도 도미, 솔시와 같은 장3도는 밝은 느낌을 주는데 반해 미솔, 라도 등 단3도는 어두운 느낌을 준다. 한 가지 힌트로서 장음정이나 완전음정은 도부터 시작하는 음이 존재한다. 예를 들어 도레 : 장2도, 도미 : 장3도, 도파 : 완전4도, 도솔 : 완전5도, 도라 : 장6도, 도시 : 장7도 이다. 만약에 도부터 출발해서 단3도를 만들려면 도레#이 되어야 하는데 반음이 섞여 있으므로 어두운 느낌이 난다. 음정을 최초에 어떤 놈이 만들었는지 알 수는 없지만 분명 내가 생각한대로 도를 기준으로 나열하여 장음과 완전음정을 정하고, 나머지를 단음정이라고 했을 것으로 강력히 추측된다. 완전 내 뇌피셜 ㅋㅋㅋ 가끔 보면 뇌피셜을 진짜 어디서 확인한 사실인 양 우선 얘기하고 보는 사람들 있는데 나도 그 축에 낀다 헤헤헤 내가 맞다고 생각한 거니까 맞는 거다, 그게 나 같은 인간의 사고 체계.

완전4도, 완전 5도 완전 8도는 배음과 관련이 있다. 주파수를 2배로 올렸을 때 한 옥타브 높은 음이 나며 1.5배 올렸을 때 완전 5도 높은 음이 생긴다. 1.5배음과 2배음 사이의 음정은 완전 4도이다. 예로부터 이들 사이의 화음이 가장 아름답다 하였고, 심지어는 complete하다고 여겼다. 겨우 음악의 음정 따위에 완전이라는 거룩한 명칭을 붙인 서양인들의 세계관이 간접적으로 느껴지는 부분이다.

다른 자료가 없으면 내가 엄청 열심히 설명할테지만 널리고 널린 게 음정 자료니까 요까지만.

Read More

C언어 증감연산자 파고들기

우연한 계기로 구르미 코딩 테스트를 해보다가 이런 문제를 만났다.




난 당연히 정답이 8, 3, 5일 줄 알았는데 9, 3, 5라고?

왜일까?
이것을 풀기 위해 연산자 우선순위를 생각해봐야 한다.


증감 연산자는 전위연산과 후위연산으로 나뉜다. 전위연산(++a)은 값을 증가시킨 후 증가된 값을 리턴하고, 후위연산(a++)은 현재 값을 리턴한 뒤 나중에 값을 증가시킨다.

그런데 이렇게까지만 생각하고 있으면 문제가 안 풀린다. 뒤에 있는 ++b가 앞에 있는 ++a + b--에 영향을 주는 기이한 현산이 발생하기 때문이다. 또한 앞에 있는 b--도 뒤에 있는 ++b에 영향을 줘서 5가 나온다. 도대체 순서가 어떻게 되는 걸까?

전위 연산자인 ++a는 연산은 그 어떤 연산보다 가장 먼저 실행하되, 그 expression(리턴값)은 확인하는 시점의 a값으로 결정된다. 반대로 후위 연산자는 리턴값 확인 시점 그 당시의 a 값을 expression으로 보낸 뒤 즉시 증감을 수행한다.

위의 문제에서 연산자 우선 순위는 ++a, ++b, +, b--, printf 순이다. 우선 ++a와 ++b가 먼저 진행되면서 a == 3, b == 6이 된다. 이 상태에서 + 연산이 진행되면 그 피연산자인 ++a와 --b의 값을 확인한다. --b는 이 확인 시점에서 6을 리턴하면서 실제값은 다시 5가 된다. +연산의 결과는 9가 되고 이제 printf를 진행한다. printf에서 맨 마지막 ++b 값을 확인할 때는 그 시점의 b값을 리턴하게 되는데 이것은 5이다.


다음 예제를 보자.

int a = 2, b = 5;
int c = --a + b * a++;
printf("%d, %d, %d\n", a, b, c);

정답은 2, 5, 7이다.

우선 전위 연산자인 --a가 수행되어 a == 1 이 된다. 그 다음 곱셈 연산이 수행되는데, 그 순간 곱셈의 피연산자가 되는 b, a++의 값을 확인한다. a++의 값을 확인하면 a는 현재 값인 1을 리턴하고, 동시에 a를 2로 만든다. 곱셈연산의 결과는 5 * 1 => 5가 되고 이제 덧셈 연산을 수행한다. 덧셈 연산의 왼쪽 피연산자 --a의 값을 확인해보면 확인하는 시점의 a 값 2를 리턴한다. 그래서 c는 7이다.


int a = 2, b = 5;
printf("%d, %d, %d, %d\n", b--, b--, b, ++b);


정답은 5, 6, 4, 4 이다. 연산자 순서는 ++, --, --, printf이다. 먼저 ++b가 수행되면서 우선 b == 6이 된다. b-- 가 수행되면 수행당시 값인 6을 리턴하고 5로 만든다. 또 한 번 실행되면 5를 리턴하고 4로 만든다. 마지막으로 printf가 수행될 때 b, ++b의 값을 확인해보면 4이다.

int a = 2, b = 5;
printf("%d, %d, %d, %d\n", b--, b--, b, a + ++b);

여기에서 정답은 5, 6, 4, 8 이다. ++b가 수행되면서 6이 되고 그 다음 우선순위인 덧셈 연산이 수행된다. 이 때 ++b의 값을 확인해보면 6이므로 덧셈 결과는 8이다. 나머지는 위와 같다.


이렇듯 증감연산자는 그 자체로 핵지랄이기 때문에 왠만하면 한 줄에 중복해서 안 쓰는 것이 권장되고, 아니 그냥 안 쓰는 것이 강력히 권장되고, C에 긴밀이 오리엔트된 파이썬에서조차 사라진 이유이기도 하다.



C는 배워도 배워도 끝이 없네 ㅋㅋㅋ
Read More

핸즈온 비지도 학습 - 이것은 책이 아니다

 



비지도학습과 관련해서 좀 공부하고 싶은 마음에 책을 검색하다가 그냥 가장 최근에 나온 아무 거나 골라서 보게 된 책?이다.

텐서플로우, 케라스 막 이런 걸 제목에 달고 있지만 저것은 말 그대로 제목 장사이다. 대부분의 내용은 PCA와 군집화를 다루고 있다.

석사 수준의 다양한 방법들을 나열하고 있기는 한데, 제목만 나열하고 설명은 한 페이지 정도인데, 그 설명조차 매우 빈약하다. 처음엔 번역을 못 해서 그런가 하고 생각했는데 가만히 다시 보니까 그냥 애초에 내용이 부실하다.

다양한 코드 예제가 있지만 코드에 대한 설명은 전혀 없다. 그냥 독학해야 된다.

다양하고 쓸데없는 실험 결과를 나열하고 있는데 전혀 해설이 없다. 자고로 가장 좋은 실험이란 결과를 이미 예측한 상태에서 검증을 해보는 것이다. 그 다음으로 좋은 실험은 결과는 모르지만 실험으로 밝히고자 하는 바가 분명한 것이다. 최악의 실험은 왜 하는지도 모르고 당연히 결과도 모르는 실험이다. 더 최악은 결과에 대해 아무 해설도 할 수 없는 실험이다. 이 책의 실험은 어디에 해당할까 하니 가장 최악이거나 그 다음 악이거나 그렇다.

특히 내가 아는 내용일수록 설명과 실험과 테스트가 너무 엉터리라는 것이 드러난다. 그러고 나니 모르는 내용은 감히 쳐다볼 엄두가 나지 않는다.

가장 백미라고 할 수 있는 부분은 28x28 MNIST 이미지를 플랫한 다음에 앞에서부터 n개를 꺼내서 그 특징으로 군집화를 돌려보는 부분이다. PCA는 10개로 추려도 잘 되는데 그냥 n개 꺼내면 결과가 좋지 않으니 PCA가 얼마나 우수한가! 이러고 앉았다.


야.. 진짜 사기당했다 이거는 ㅋㅋㅋㅋ 이것은 책이 아니다. 진짜 책도 아니다.

Read More

파닥파닥 - 스며드는 것 미만 잡

 




2013년인가 나왔던 국산 애니메이션인데, 스팀에서 3300원에 구매할 수 있다.

https://store.steampowered.com/app/468060/PADAK/


횟집에 잡혀들어온 고등어가 어항을 탈출해서 바다로 간다는 이야기인데, 매우 현실적인 묘사가 특징이다. 벌써 이렇게 한 줄만 봐도 내용을 다 설명하고 남은 느낌이다.

회라는 요리, 생으로 살을 썰어 먹는다는 그로테스크함, 생선이란 동물이 가지고 있는 기괴함이랄까, 그리고 약육강식의 현실이 주는 잔혹함, 그런 것들을 적극적으로 차용해서 단순한 탈출 동화를 매우 극적으로 느껴지게 만든다. 





주인공인 우리 파닥이는 매우 단순한 캐릭터에 멍청함까지 가지고 있다. 어항에 들어오자마자 나갈꺼야! 만 외치며 하루 종일 유리벽에 머리를 들이받는다. 실제 고등어야 그럴 수 있지만 영화 속 주인공이 저래도 되나 싶다. 게다가 바다라는 야생에서 컸음에도 불구하고 양식장에서 자란 물고기들보다 야성이 없고 순한 것도 공감할 수 없게 만드는 부분이다.

이야기의 핵심이 되는 것은 오히려 고등어가 아니라 넙치. 유일하게 입체적인 캐릭터를 가졌고, 나름 스토리가 있는 인생을 살았다. 그리고 그게 이 영화의 유일한 스토리라고 할 수 있을 것이다.


더빙은 모두 전문 성우들이 맡았다. 인간의 경우는 자연스러운 일상톤으로 연기했고 물고기들은 약간의 극화톤이 느껴진다. 전체적으로 훌륭한 편이다. 성우의 연기를 항상 애니메이션이나 게임으로만 접하다보니 뭔가 말투가 과장되어 있고 억지로 목을 눌러 목소리를 변형시킨 티가 나서 영 거북했는데, 그나마 여기서는 자연스럽다.





본격적인 뮤지컬 형식은 아니지만 몇 곡의 노래가 들어있고 이 때는 2D 애니메이션이 나온다. 나름 볼만한 요소, 들을만한 요소이다. 성우들이 직접 노래를 불렀다.



"밥 먹는 데 울고 지랄이야, 밥맛 떨어지게" - 같은 수족관 물고기의 꼬리를 뜯어먹으면서 하는 말

선도 악도 없는 잔인한 약육강식의 세계, 그 속에서 최상위포식자인 우리는 인간이다. 그래서 평소에 물고기의 입장으로 생각하지 않았는데, 과연 물고기들은 어떨까? 잔인한 묘사를 통해 그 모습을 있는 그대로 보여주면서 약간의 위트를 섞어서 너무 거부감이 들지 않도록 배려했다. 그 잔인하고 (물고기 입장에서)현실적인 묘사라는 것은 나름 충격적으로 다가오는 면이 있으나, 그것은 그저 작품의 분위기만 전달할 뿐, 전체적인 영화구조나 스토리에 큰 영향이 없으며 충격, 그걸로 그냥 끝이라는 게 문제다. 먹고 먹히는 현실에 충분히 몰입하는 경험은 좋지만 어항과 바다를 대비시켜 그 의미를 부여하는 것에는 미흡하다. 대사는 전체적으로 임팩트가 부족하고, 특히 고등어가 바다로 가는 희망을 얘기할 때는 좀 루즈하다. 무엇보다 역시 내용이 좀 없다.

횟감이 되는 물고기의 입장에서 횟집에서 벌어지는 일을 물고기 입장에서 잔인한 톤으로 그려본다는 것, 벌써부터 뻔하지 않나.


영화를 보면서 떠오른 건 안도현의 '스며드는 것'. 영화보다 한 편의 시가 더 나은 것 같다.


'저녁이야, 불 끄고 잘 시간이야'


Read More

FLOPS 뜻, 그리고 FLOPs와의 차이

 내가 예전에 헷갈려서 Stack Overflow에 문의한 글이 있다.


https://stackoverflow.com/questions/58498651/what-is-flops-in-field-of-deep-learning/62028935#62028935


내용인 즉, FLOPS는 FLoating points OPeration per Second 의 약자인데 이는 컴퓨팅 파워를 나타내는 말이다. 1초에 얼마나 많은 연산을 수행할 수 있는 컴퓨터인가, 그런 뜻이다. 그런데 이 용어가 학습을 마친 어떤 Frozen Network가 얼마나 많은 연산을 요구하는가를 나타내는 용도로 쓰이는 것에 의문을 품고 문의한 것이다. 이런 경우에는 FLO라고 해야 되는 거 아니냐? 그런 뜻인데..

결론적으로 FLOPS랑 FLOPs는 다르단다. 나참 ㅋㅋ

  • FLOPS = Floating point operations per second - 시간당 연산량(GPU 성능 측정)

  • FLOPs = Floating point operations - 총 연산량 (모델의 크기 측정)

그런 거였구만. 무슨 용어를 이렇게 헷갈리게 쓰냐.



Read More

에스콰이어 - 성의없고 뒤떨어진 최신 패션

 



  어느 날 갑자기 패션에 좀 신경써볼까 하는 엉뚱한 생각이 들어서 에스콰이어 1년 정기구독을 충동구매했다. 하지만 첫 배송을 받자 마자 세상에 이런 잡지가 있나 하는 분노가 치밀어 편집장에게 장문의 항의 메일을 보냈다. 내용인 즉,

1. 인터뷰에 주제가 없다.
2. 겉멋이 들어간 필체와 신변잡기가 거슬린다.
3. 패션이 멋이 없다.


우선 패션이 멋이 없어보이는 거야 내 눈이 문제일 수 있으니 그냥 넘어갈 수도 있다. 패션 잡지가 무슨 쇼핑몰도 아니고 난방에 가디건만 입고 나올 수는 없으니깐.

하지만 내용이 허술한 것은 정말 문제다. 모든 글은 시작부터 끝까지 별 다른 내용이 없다. 온갖 신변잡기와 지극히 주관적이고 개인적인, 무의미한, 전혀 관심이 가지 않는, 허술하기 짝이 없는 글자수 채우기일 뿐이다. 쓸 말이 없는데 뭐라도 써야 하는 초등학교 일기장의 느낌이랄까.

특히나 불편한 것은 인터뷰다. 왜 그 사람을 인터뷰하는지, 무슨 말이 듣고 싶은지 전혀 방향이 없다. 아무 방향도 없이 요즘 머하세요, 머하고 지냈나용 하하하 끝. 이게 뭐야. ㅜㅜ


편지를 보냈건만 답장도 없고 몇 달 치 모아봐도 별로 달라진 것도 없어서 나중에는 그냥 넘기지도 않고 쌓아두다가 당근마켓에 과월호 공짜로 나눠준다고 올린답시고 찍은 것이 바로 위의 사진이다.


요즘 누가 잡지책을 사다 보는가. 나름 레트로 감성으로 구독을 끊었건만. 안 팔린다고 플랫폼 탓 하지 마시길.

Read More

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

우분투에서 C++ 개발하기 (1) : https://ladofa.blogspot.com/2018/07/c-1.html


 1탄을 만들어 놓고 몇 년이 흘렀는가 모르겠다. 2탄을 만들게 될 줄도 몰랐다.

하여튼 이어서 makefile에 대해서 알아본다.

C나 C++을 사용하다 보면 수도 없이 컴파일 하고 빌드하고 이런 일이 반복되는데 매번 라이브러리 경로와 관련된 라이브러리 파일과 기타 등등등을 입력하는 것도 번거롭고 새로 수정한 파일이 무엇인지 따라다니면서 컴파일하는 것도 힘들다. 그래서 리눅스에서는 Makefile이란 툴을 쓴다. 윈도우에서 Visual Studio로 개발하면 이런 거 필요없는데.

Makefile은 빌드에 필요한 스크립트를 텍스트 형식으로 저장한 파일이다. 이 파일은 반드시 이름이 Makefile 이어야 한다. 확장자 없이 이름만 Makefile 이면 된다. 무슨 파일 이름이 Makefile이냐. ...

Makefile 속에 있는 스크립트를 해석해서 실행하는 프로그램은 make이다. 프로그램 이름이 make 다. make를 실행하면 실행한 현재 경로에서 Makefile을 찾아내고 요걸 해석해서 빌드를 수행한다.


우선 다음과 같은 예제를 생각해보자.

<my.h>

int my_func(int x);


<my.cpp>

#include "my.h"

int my_func(int x)

{

    return x * x;

}


<main.cpp>

#include <iostream>

#include "my.h"

int main(void)

{

    printf("%d^2 == %d\n", 3, my_func(3));

}


뭐 이렇게 간단히 구성되어 있다고 하자. 요걸 컴파일 하려면 1탄에서 배운 대로 다음과 같이 입력해야 할 것이다.

$ g++ -c my.cpp

$ g++ -c main.cpp

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


매번 이렇게 하기 귀찮으니까 이제 Makefile을 이용할 차례이다. Makefile 은 타깃의 집합이다. 타깃은 다음과 같이 서술해야 한다.

[타깃이름]: [타깃에 필요한 파일들]

      [타깃 실행 코드]

여기서 타깃 이름은 그냥 아무 이름이 될 수도 있고, 파일명이 될 수도 있다. 실행 코드를 통해 결과 파일 하나가 확실히 나오는 경우에는 타깃 이름을 파일명으로 한다. 예를 들어

<Makefile>

my.o: my.h my.cpp

    g++ -c my.cpp

이와 같이 Makefile을 작성할 수 있다. 달랑 두 줄이다. 여기서 중요한 것은 두 번째 줄 앞에 있는 공간이 탭 하나이다. 지금 블로그를 작성할 때는 어쩔 수 없이 스페이스를 때려 넣었지만 실제로는 반드시 1탭이어야 한다.

이제 아래와 같이 실행한다.

$ make my.o

그 결과로 my.o 파일이 생성된다. 만약 이미 생성되었다면 up to date. 메시지가 뜰 것이다.


하나의 타깃은 다음 타깃의 재료가 될 수 있다. my.o 그리고 main.o 는 링커에서 실행 파일을 만드는 재료가 된다. 혹은 재료가 필요 없는 명령도 있다. 다음 예를 보자.

<Makefile>

my.o: my.h my.cpp

    g++ -c my.cpp


main.o: my.h main.cpp

    g++ -c main.cpp


test: my.o main.o

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


all: test


clear:

    rm -f my.o main.o test


여기서 my.o 와 main.o 는 test의 재료가 된다. 만약 make test를 했는데 my.o가 존재하지 않는다면 해당 타깃부터 만들고 난 뒤에 test를 만들게 된다. 한 번 더 make test를 실행하면 기존에 모든 것이 이미 있으므로 더 이상 작업을 진행하지 않는다. 파일을 수정하고 나면 수정된 파일을 재료로 하는 타깃만 새로 빌드될 것이다.

all 타깃은 재미있게도 실행 명령이 없고 타깃만 명시되어 있다. make all 을 실행하게 되면 그 재료가 되는 test를 만들 것이다. 만들고 나서 특별히 할 일은 없다.

clear는 반대로 타깃 파일이 없다. 보통은 타깃 파일이 존재해야 그 다음으로 명령문을 수행하게 될테지만 요구사항이 되는 타깃이 없으므로 그냥 무조건 명령을 수행하게 된다.

all, clear, install 이 세 가지 타깃은 모든 Makefile에서 관용적으로 쓰이는 것들이다. 모르는 설치파일이라도 우선 make install 부터 실행해보면 된다.


여기까지 이해했으면 이제 위키피디아에서 제공하는 샘플 Makefile을 살펴보자.

맨 윗줄에 있는 것들은 환경변수이다. 환경 변수의 이름 역시 암묵적으로 정해져 있다. 왤케 암묵적인게 많냐... $(OBJ)을 보면 타깃 여러 개를 한 번에 지정하고 있다. 그리고 이상한 기호들이 보이는데 $@는 타깃 이름, $^는 재료 이름, $<는 재료 중 맨 첫번째 항목을 의미한다. 

대충 이 정도면 원리는 이해한 셈이고, 그 밖에 엄청난 규칙들이 많다. 심지어는 요즘도 버전업이 되고 있다. 나머지는  http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-4.html 이런 곳에서 자세히 살펴보길 바란다.


요즘은 CMake나 다른 툴을 이용하고 Makefile은 거의 안 쓰기는 하지만 그래도 기본 원리 정도는 어렵지 않으므로 알고 있는 것이 좋다. 임베디드나 기타 작은 소프트웨어에서는 여전히 직접 작성해서 쓰기도 한다.


다음으로는 CMake를 사용한 컴파일 과정을 간단히 살펴볼 것이다.


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

곰플레이어 동영상 광고 없는 깔끔한 글로벌 버전 설치

언제적 곰플레이어인지 모르겠다. 추가 코덱 없이도 모든 동영상을 다 볼 수 있다고 해서 깔았던 게 2006년이던가... 15년이 지난 지금도 온갖 자막 다 지원해주고 표준포맷 안 지키는 이상한 동영상들도 알아서 잘 플레이해주고 있어서 아직도 그냥 곰 쓴다.

곰플레이어는 한국 버전을 받게 되면 엉뚱한 동영상 추천을 광고와 함께 실어주기 때문에 매우 거슬린다. 이를 없애려면 그냥 간단하게 글로벌 버전을 설치하면 된다.

글로벌 버전은 영어로 접속해하면 되는데 홈페이지 우상단에서 English를 고른다.


한글일 경우 NEW_GOMPLAYERSETUP.exe, 영문 페이지일 경우,  GOMPLAYERGLOBALSETUP_CHROME.exe를 다운받는다.



글로벌 버전의 경우 아무 것도 플레이하지 않을 때 위와 같이 곰발바닥 광고가 뜨게 되며 마우스 오버를 하면 프로 버전을 다운받으라고 안내해준다.

내가 형편이 피면 반드시 프로 버전을 구입해서 그 동안 수많은 동영상을 플레이하는데 혁혁한 도움이 되었던 당신들께 꼭 보은하리라 하면서도.. 그렇게 하면서 일단은 무료 버전을 잘 쓰고 있다. 무료로 쓰는 데 요 정도 광고까지는 봐주자.


Read More

알아두면 좋은 Visual Studio Code 단축키 (윈도우 기준)

그냥 내가 정리하는 차원에서 하나씩 적어본다.

시시때때로 수정할 예정.

상당수는 Visual Studio 와 겹치는 듯.


터미널(디버그) 창 닫고 편집창으로 바로 커서 이동

    CTRL + ` (1 왼쪽에 있는 키)


스플릿 간 커서 이동

    CTRL + 숫자키


스플릿 내부 탭 파일 간 이동

    ALT + 숫자키

    이건 리눅스 터미널 띄워놓고 이동할 때도 같은 단축키

    CTRL + TAB 도 당연히 된다


같은 파일을 동시에 다른 스플릿에서 보기

    CTRL + 파일 탭(파일명 적힌 윗부분) 드래그


현재 커서의 함수구현/변수선언으로 이동

    F12


이전 커서 위치로 돌아가기

    ALT + 왼쪽 화살표

    F12 눌렀다가 되돌아갈 때 유용함


세로로 멀티 커서 만들기

    CTRL + ALT + 위아래 화살표

    이게 리눅스에서는 ALT + SHIFT 던가..


여러 라인 선택

    ALT + 마우스 클릭


현재 라인 잘라내기 (클립보드로 복사됨)

    SHIFT + DEL

    이건 왠만한 에디터 공통


인덴테이션 등 포맷 자동 맞추기

    CTRL + K, F


현재 라인, 혹은 블럭 씌운 라인 주석

    CTRL + K, C


주석

    CTRL + K, C (생성)

    CTRL + K, U (해제)

    CTRL + / (토글)


왼쪽 Explorer 칼럼에서 현재 위치 탐색기 띄우기

    ALT + SHIFT + R


왼쪽 Explorer 칼럼에서 파일명 고치기

    F2

    이건 데비안 리눅스 공통인 듯


Read More

SSH를 윈도우 탐색기 드라이브로 매핑하기

 ssh를 이용하면 쉘 스크립트를 실행할 수 있을 뿐 아니라 파일도 주고받을 수 있다. 윈도우 사용자들은 대부분의 파일 작업을 탐색기로 하지 뭐 명령어 치고 파일 주소 타이핑하고 그런 거 없다.


일단 기본적으로 SSH 연결이 잘 되는지부터 확인해본다.

cmd 창에서

ssh my_id@ip_address

와 같이 타이핑해서 접속되는지 확인해보자. 비밀번호 방식이든 sshkey 방식이든 상관없는데, 보통은 편리성을 위해 key 방식을 활용한다. 하여튼 접속이 잘 된다고 가정하고 다음 단계로 넘어간다.


여기서 조금 번거롭지만 세 개의 프로그램을 설치해야 한다.

https://github.com/billziss-gh/winfsp

https://github.com/billziss-gh/sshfs-win

여기까지가 sshfs를 윈도우에서 작동시키도독 해주는 프로그램이다.

sshfs 드라이브 목록을 더 쉽게 관리하기 위한 툴까지 설치한다. 요걸 맨 마지막에 설치해야 경로 잡고 어쩌고 하는 귀찮은 일이 없다.

https://www.electronjs.org/apps/sshfs-win-manager



실행해보면 2020년 8월 현재 버전으로 요렇게 생겼다.



Add Connection을 클릭하면 이런 창이 뜬다.



순서대로 어쩌구 저쩌구 입력 다 하고 연결 버튼을 누르면 나처럼 초록색으로 바뀐다.

이제 탐색기로 들어가면 드라이브가 생겨 있다.




Read More

2020년 LG 울트라기어 노트북 17인치 리뷰

내가 구매한 노트북은 17UD70N-PX76K이다. 왜 구매했는지, 구매하고 나서 어떤지 써보려고 한다.

LG 노트북을 본격적으로 살펴보기 전에 일단 가성비라는 말부터 따져보려고 한다. 가성비란 말 그대로 가격 대 성능비, 같은 가격이면 좋은 성능의 제품을 사고 싶고 호구가 되긴 싫다는 당연한 소비심리가 반영된 단어이다. 그런데 여기서 말하는 성능이 무엇인가에 대해서 사람마다 생각이 다르다.

누군가는 그저  CPU, GPU와 같은 연산 유닛의 퍼포먼스, 그리고 메모리, 스토리지 등 용량만을 성능으로 취급하기도 한다. 그런데 이런 것만 따진다면 데스크탑을 고르는 것과 차이가 없다. 기본적으로 노트북은 컴퓨터 이외에 모니터와 키보드, 터치패드를 같이 구입하는 것이므로 당연히 모니터의 성능과 키보드, 터치패드의 성능이 포함되어야 한다. 그리고 용도에 따라 차이는 있겠지만 빈번히 들고다니므로 무게와 발열, 배터리용량, 디자인까지 성능에 포함되어야 한다. 만약에 이것들이 포함되지 않는 가성비라면 언급할 가치도 없는 기준이다.

만약에 단순히 연산 유닛의 성능으로만 친다면 가성비가 가장 떨어지는 제품은 바로 스마트폰이다.  카메라, 디스플레이, 무게, 배터리 이런 부분들 모두 스마트폰에 중요한 요소인데 누가 가성비만 놓고 스마트폰을 고른단 말인가.

가성비는 그저 노트북을 고르는 기준 중 하나일 뿐이다. 보통 가성비 노트북이라고 하면 연산 유닛이 좋아서 게임이 쌩쌩 잘 돌아가는 대신 모니터의 색감과 바디 재질과 배터리용량과 내구성과 소음과 진동, 디자인과 크기 등 여러 부분을 포기한 것을 말한다. 반대로 가성비가 나쁘다는 노트북은 같은 가격에 비해 연산 속도는 떨어지지만 기타 다른 부분이 좋은 노트북이다. 취향의 문제일 수는 있으나 '나쁘다'는 말처럼 나쁘고 좋은 가치 판단은 할 수 없는 문제인 것이다. 그러나 마치 뭔가 쓸데없이 비싸다는 뉘앙스로 이 용어를 붙이니 한심할 노릇이다. 노트북 평가하면서 가성비를 언급하는 사람은 과연 노트북을 제대로 써보기나 한 것일까.

싼 제품은 싼 이유가 있다. 배터리 용량이 적거나 모니터 질이 나쁘거나 키보드가 안 좋거나 소음이 심하거나 무겁거나 두껍고 크거나 튼튼하지 못하거나 볼품없이 생겼거나 소프트웨어가 부실하거나 다 이유가 있다. 단순히 기업 브랜드 이미지나 AS 정도 때문에 가격 차이가 나는 것이 아니다.

그래서 LG 노트북이 가성비가 나쁘냐? 나쁘다고 하면 나쁘다. 반대로 얘기해서 LG는 가성비 좋은 라인업을 만들지 않는다. 대기업 입장에서는 굳이 마감이나 기타 다른 부분을 희생해서 가격을 낮출 필요가 없다. 가격이 비싸고 마감이 좋은 프리미엄 노트북만 만드는 것이 이미지 관리에도 좋고 AS에도 부담이 없다. 명품백의 비싼 가격이 마냥 단점이 아닌 것처럼 대기업의 노트북도 비싼 것이 단점이 되지 않는다. 합리적으로 비싼 이유를 댈 수만 있다면 어느 정도 비싸도 상관이 없다.

울트라기어는 여러 가지 기준을 놓고 볼 때 어느 부분도 뒤지지 않는 올라운더이다. 특히 17인치 2560x1600 디스플레이에 이 정도 가벼움과 성능을 가지고 있는 제품은 울트라기어말고 없다. 특히 데스크탑을 포기하고 PC 대용으로 쓰려면 디스플레이 성능이 무조건 받쳐줘야 한다. 잦은 이동이 있다면 최대 무게는 2kg을 넘어서서는 안 된다. 사무도 하고 가끔 게임도 돌리고 3D작업도 하고 나같이 간단히 딥러닝도 돌리고 하려면 외장 그래픽이 필수이다. 다시 말하지만 특히 디스플레이, 17인치 2560x1600 이 스펙이 정말 탐났다. 나는 특히 깨알같이 작은 폰트와 창모드로 동선을 최소화하고 화면을 넓게 쓰는 편이라서 dpi - 픽셀크기를 정말 많이 따진다. dpi가 낮으면 글자가 깨져서 알아보기가 힘들고 눈이 아프다.

구매 중에 다나와에 등록된 전자 상가에서 현찰로 구매하려 하니 재고가 없단다. 한참 기다리다 결국은 미개봉 중고를 샀다. 업그레이드 직접 하기가 귀찮아서 될 수 있으면 업그레이드 해주는 업자들에게 사려고 했었는데 막상 직접 업그레이드 해보니 별로 어렵지 않다. 뒷판 뜯을 때 모니터 붙어있는 힌지 부분부터 당겨서 뜯으면 된다. 나머지 부분은 무작정 당기지 말고 뒷판이 살짝 휘어지도록 안쪽으로 눌러주면 쉽게 빠진다.

윈도우 미설치 버전의 경우 윈도우 깔고 업데이트 하고, LG DnA 깔면 된다. LG DnA는 각종 드라이버 모음인데 LG 전자 서비스 다운로드 자료실에서 모델명 검색해서 받으면 된다.

웃기는 점은 윈도우 설치에 포함된 드라이버로는 무선랜이 안 잡힌다는 것이다. 일단 유선으로 연결을 해서 드라이버 업데이트를 하든지, 아니면 USB로 미리 무선랜 드라이버를 준비해놓아야 한다.

모니터는 구체적인 스펙이 명시된 곳이 없다. 그냥 IPS LED란다. LG에서 만든 IPS 패널이면 다 똑같은 건데 이 업계를 내가 잘 몰라서 그럴 수도 있다. 하여튼 맨날 보던 LG 모니터 그 색감 그대로인데 일반 모니터처럼 세부 조정이 안 되다 보니 감마나 색감을 맞추기가 쉽지 않다. LG DnA 전부 다 깔고 난 뒤, FN + F1을 눌러 컨트롤 센터를 띄워보면 화이트 밸런스는 조정할 수 있게 되어 있다. 그 다음에 윈도우 10에서 제공하는 컬러 캘리브레이션을 사용해서 감마를 약간 올려주는 게 내가 할 수 있는 모든 조정이다.

모니터의 색감 조절할 때 내가 특히 신경쓰는 부분이 선명도이다. 일반적인 선명도 조절이란 전부다 소프트웨어로 구현된 하이패스 필터라서 과하게 들어가면 눈에 거슬린다. 이거는 캡쳐해서 확대한다고 보이는 게 아니기 때문에 뚫어져라 직접 눈으로 확인하는 수 밖에 없다. 자세히 눈을 갖다대고 보면 미세하게 필터가 적용된 걸 확인할 수 있다. LG에 문의한 결과 사용자가 조정할 수 있는 방법은 없다고 한다. DPI가 높으니까 거의 티는 안 나지만 아쉬운 부분이다.

키감은 영 엉망이다. 가장 마음에 안 드는 점이다. 얇으니까 스트로크 두께가 낮은 것은 어쩔 수 없는데 문제는 너무 딱딱하다는 것이다. 마치 고무가 경화된 건지 너무 딱딱하다. 제조일로부터 세 달 밖에 안 지난 제품이니까 원래부터 이렇게 딱딱한가보다. 스트로크가 얇은데, 그걸 극복한답시고 걸림 압력을 너무 크게 해놨다. 챡챡 가볍게 들어갈 수는 없는 걸까. 팬터그래프인지 의심이 갈 정도로 키가 흔들리는 것도 문제다. 하여튼 저가형 노트북의 키보드와 비교해서 하나도 좋은 점이 없다.

터치패드는 특별히 크지도 작지도 않다. 화면 이 끝에서 저 끝까지 한 번에 갈 수 있다. 시맨택이 아니라 중국 다른 회사 거를 썼다고 한다.

디자인은 영 별로다. 우선 게이밍 노트북 티 안나고 깔끔한 것은 좋으나, 뭔가 다지안을 했다고 느껴지는 부분이 없다.

상판이 휘어지긴 하는데 여닫으면서 뭔가 거슬릴만큼 휘어지는 건 아니고 일부러 휘면 휜다는 뜻이다. 큰 크기에 비해서 안정감은 있다.

모니터 표면이 별로다. 매우 내구성이 취약해서 침 튄 거 닦는 데도 노심초사. 무슨 표면에 점도가 있어서 뽀드득거린다. 이것도 어째 싸구려보다 못하냐. 하여튼 조심해서 쓰면 문제는 없겠지 뭐..

진동 없다. 소음 관리도 괜찮은 편. 게임 할 때는 욍욍 돌아가서 시끄럽긴 한데, 문서작업이나 할 때는 들리지 않을 정도로 아주 살살 돌아간다. 발열은 테스트 결과 스로틀링 일단 안 걸리는데, 흰지 부분은 손 데일 만큼 뜨겁긴 하다. 타건하는 키보드 주변으로의 발열은 심하지 않아서 불쾌감을 느낀 적은 없다.

하여튼 결론적으로 다 좋은데 키감이 개판이다. 걸리는 구분감이 상당하기 때문에 세게 눌러야 되고 세게 누르다 보니 손끝이 아프다. 키캡 표면은 매우 미끌미끌해서 마침표 찍는데 손이 계속 미끄러진다. 그냥 러버돔 위에 키캡만 씌운 건지 키캡이 덜렁거리는데 이거 팬터그래프 맞나 모르겠다. 

Read More
Powered by Blogger.