블로그 이미지
:infinity cout << "lv up!\n\r"; goto infinity; RosaGigantea

카테고리

Programming log (474)
IT 기기 (36)
리눅스 서버에 대해서 (90)
윈도우 서버에 대해서 (49)
DataBase (22)
프로그램 설계 (8)
알고리즘 (34)
boost (1)
C/C++언어 (89)
콘솔 게임 프로그래밍 (20)
임베이드 장비 (4)
모바일 프로그래밍 (3)
기타 언어 프로그래밍 (7)
Util 프로그램 (7)
대학생 졸업하기 전.. (104)
Total699,929
Today1,192
Yesterday695

이번에 타자기 컨셉의 키보드에 필이 꽃혀서 만든 키보드 입니다.

 

이런 키보드를 만들게 된 계기는 아래와 같이 qwerk writer 라는 제품을 보고 나서 입니다.

일종의 타자기 컨셉으로 만든 블루투스 키보드로 대략 아래와 같은 키보드 입니다.

 

 

 

상당히 깔끔한 스타일에 복고풍 느낌을 많이 살려 나름 괜찮은 아이템이라 생각합니다.

올해 8월쯤 나온다는거 같은데, 예약 주문하면 399$ -> 309$ 로 해준다고 하네요.

 

거의 해피해킹 type-s 급 가격인데...

가격이 깡패... 그런데 역시 땡깁니다.

 

허나, 굳이 저 돈을 꼭 다 줘야 하는걸까? 누군가 저런 컨셉의 키캡을 이미 팔고 있지 않을까?

그렇게 조사해 보니 매스드랍에서 키캡을 팔았다고 하네요, 단 지금은 구입하기 용이하지 않은거 같더군요.

 

그래서 혹시나 하고 taobao, ebay 등을 검색해 봤습니다.

역시나 대륙들은 뭔가 달라도 다릅니다.

 

우선 타오바오... 키보드 자체를 복고풍으로 만들어서 팔고 있습니다.

그런데.. 1540위안... x 180 정도 하니 27만원... 관세나 배송비 하면 32만원정도 나오겠군요. ㅠㅠ..

 

 

다음 ebay입니다.

키캡만 따로 팔고 있으며 126달러.. 배송비 뭐니 하면 대략 17만원정도 깨집니다.

 

 

그래서... ebay에서 키캡을 구입 하기로 했습니다.

문제는 기계식 키보드...
그동안 키보드 덕질을 하면서 사고 팔고를 반복해서 기계식 키보드가 없었습니다.
그래서 이왕 사는거 좀 브렌드가 있으면서, 싸고, 청축느낌이 나는 텐키레스를 찾아보았습니다.

 

그결과 아래와 같은 레이저 블랙위도우 토너먼트 라는 제품이 나왔고,

이걸 샤오미 체중계 + 키보드 + 배송료 = 10만원 <=> 국내 판매가 10만원과 동일하게 나오더군요. 

 

그래서 이왕 하는거, 샤오미 체중계도 득템하자란 느낌으로 타오바오 주문하고... 2주간의 시간이 흘렀습니다.
(체중계에 포함된 건전지때문에 배로 배송되었습니다.)

 

키보드가 오자마자 바로 키캡 해제 하고,  미국에서 태평양 건너 온 키캡을 끼어 보았습니다.

 

느낌은 녹축(청축의 개조판)의 차랴락 하는 소리... 타자기 같은 소리에, 키캡이 타자기니 운치가 나더군요.

다만 밑의 스위치가 보이는 부분 뭔가 나무 같은걸 구해서 데코레이션 하는편이 좀 더 좋을거 같네요. 

 

스페이스키를 못바꿨는데, 이 키캡이 3D printer로 뽑은거기도 하고... 뽑기운이 나뻐서인지
스페이스키가 약간 틀어지져 있더군요.

그래서 끼어놓으면 스페이스키가 잘 올라오지 않아 원래 키로 놓았습니다.... ㅠㅠ.

 

그 이외에는 키보드 자체는 만족중입니다. 다만 위의 qwerk writer와 같이 엔터, 쉬프트 키 같은건 원래 키로 끼는편이 좋을거 같더군요. 크기가 많이 작아져서 조금 불편합니다.

(하지만 해피해킹도 적은한 손이니.... 곧 적응되겠죠...)

 

나머지 키캡 (풀 배열 사이즈 키캡이라)인 텐키레스 쪽은

집에 있는 플린저 키보드에 끼어 보았습니다 (이게 채리축 호환입니다)

 

의외로 흰색에서 저런 느낌이라고 생각하시면 좋을거 같고요...

아.. 키보드를 흰색으로 살걸 그랬나란 생각도 잠깐 들었습니다.

 

문제의 스페이스 키입니다.

 

마지막으로 타건 영상을 올립니다.

어떤 느낌의 키보드인지 참고 바랍니다.

개인적으로는 녹축(청축)의 소리와 시각적인 느낌 모두 타자기 컨셉에 잘 어울린다고 생각합니다.

 

 

저작자 표시 비영리 변경 금지
신고
Posted by code쟁이 RosaGigantea

http://upaper.net/rosagigantea/1042923


국내 전자책 판매 및 yes24등 출판도 대행해주고 있는것 같더군요.

아직 ECN이 발급이 안되서 일반 인터넷 서점에서 구입이 안되지만, 조만간 될 것으로 보입니다.



저작자 표시 비영리 변경 금지
신고
Posted by code쟁이 RosaGigantea
TAG 서적

지금 만들어 놓은 책 원고는 A4로 작성 했지만, 막상 가제본 만들때 보니

A4는 좀 부담스러운 크기더군요.

 

그래서 그것보다 약간 작은 4x8 배판으로 설정 했습니다.

이미 원고 작성된 상태에서 4x8 (188x254) 사이즈를 만들기는 어려워서 pdf 축소 인쇄를 사용해서 등록했습니다.

기존 크기에서 90%로 인쇄되었는데, 보는데 문제는 없어서 다행이란 생각이 들었습니다.

 

<도착한 교보문고 퍼플 pod 책>

 

안의 내용, 인쇄 상태가 양호 합니다

소스 코드는 하이라이트를 했었지만, 책값 절감을 위해 흑백 인쇄를 하였습니다.

 

 

 

왼쪽이 교보문고 pod (4x8배판 인쇄)와 오른쪽 가제본으로 인쇄 업소에서 맡긴 A4판 입니다.

 

저작자 표시 비영리 변경 금지
신고
Posted by code쟁이 RosaGigantea

온라인 게임과 콘솔 / PC게임 이 두 가지 차이점은 무엇일까요?
당연한 이야기지만, 온라인 게임은 네트워크망을 사용해서 불특정 다수와 관계를 맺어가면서 즐기는 게임입니다.

그에 반해 콘솔 PC게임은 자신 홀로 게임 세계에 들어가 즐기는 게임이죠.


게임을 하다 보면, 이것저것 막힐 때가 있을 겁니다. PC 게임 같은 경우 데이터 파일을 헥사 파일로 열어서 특정 수치를 변조하여 초반부터 최고 레벨로 플레이를 하는 행위가 가능합니다.


하지만 온라인 게임의 경우는 조금 문제가 있습니다.
내 행동이 다른 이들에게 영향을 주는 게임이다 보니, 내가 게임이 지루하다고 내 캐릭터 레벨을 10에서 100으로 올려버리면, 다른 유저들이 힘들게 올린 100레벨은 무의미해지죠 박탈감이 심해져서 열심히 일한 개미(열정적인 유저들을) 떠나게 합니다.
그래서, 이런 치팅을 하지 못하도록 막아야 할 필요성이 생깁니다. 어떤 처리를 넣으면 좋을까요?

 

역사적으로 봤을 때, 인류는 이런 고민을 상당히 오래전부터 하였습니다.
오랜 예부터 특히 군대에서 적군이 눈치채지 않고 인접 아군에게 작전 지시를 내리는데,
전령이 적군에게 사로잡힐 경우를 대비해서 사용했던 암호화가 바로 그것입니다.

 

며칠 몇 시에 어느 곳으로 이동해서 어디를 공략해야 한다는 전술 명령을 산 건너 있는 부대장에게 전달해야 하는데,
이 작전 문서를 평문으로 보내면 어떻게 될까요?
전령병이 산을 넘다가 적에게 포로로 잡히면, 이 작전이 무산되거나, 혹은 명령서를 바꿔서 보내 작전이 원하는 대로 움직이지 않을 것이고 결국 전쟁에서 패배라고 말 것입니다.
그래서 옛날부터 이런 작전 문서의 문자를 암호화하여 난센스 문장을 써서 전달하는 시저 암호나 에니그마 같은 것이 나왔습니다.

 

서버 프로그램도 같습니다. 사실 클라이언트 프로그램이 유저에게 제공되는 순간, 이 클라이언트 프로그램은 소스까지 모두 제공한 거로 보셔야 합니다.

(자세한 건 리버싱 엔지니어링을 공부해 보세요) 그러므로 서버에 접속하는 프로그램이 반드시 제공한 클라이언트일 확신이 없으며, 이 클라이언트가 가짜라는 가정하여야 하고, 패킷은 난독화(Obfuscation)시켜서 송수신해야 합니다.

 

그러면, 키를 넣어 변조시킨 뒤, 다시 같은 키를 넣어 원래대로 데이터를 만드는 방법을 어떻게 하면 좋을까요?
일반적으로 자주 사용되는 방법은 XOR 연산입니다.

 

XOR는 배타적 연산으로 2개의 명제 중 하나만 참일 때 참을 출력하는 로직입니다.
이를 이용해서 3변수를 사용하지 않고 2변수 만으로도 swap 함수를 만들 수 있죠.
그럼 이제 특정 Key를 만들어서 패킷데이터에 XOR연산을 하면 사람이 알아보기 힘든 값이 나오겠군요.

해커들이 보고 한숨 쉴 수 있도록 작업해 봅시다.

추가: /ServerLibrary/ServerLibrary.h 

 

#include "./Net/Packet/PacketObfuscation.h"

 

패킷 난독화 소스를 서버 라이브러리에 추가하였습니다. 실제 구현 소스는 아래와 같습니다.

 

 추가: /ServerLibrary/Net/Packet/PacketObfuscation.h

 

#pragma once

#include "stdafx.h"

 

//--------------------------------------------------------//

// 난독화 최상위, 다른 난독화 알고리즘은 이 클래스를 상속 받을 것

class Obfuscation

{

public:

    virtual void encoding(Byte *packet, size_t len) = 0;

    virtual void decoding(Byte *packet, size_t len) = 0;

};

 

//--------------------------------------------------------//

class XorObfuscation : public Obfuscation

{

    Byte key_;

public:

    XorObfuscation();

private:

    void encoding(Byte *packet, size_t len);

    void decoding(Byte *packet, size_t len);

};

 

//--------------------------------------------------------//

// 패킷 난독화용

class PacketObfuscation : public Singleton < PacketObfuscation >

{

    Obfuscation     *obfuscation_;

public:

    PacketObfuscation();

    ~PacketObfuscation();

 

    void encoding(Byte *packet, size_t len);

    void decoding(Byte *packet, size_t len);

};

 

난독화 알고리즘은 여러 가지이지만, 소스에서 필요한 것은 인코딩/디코딩 정도이므로
이를 강제할 수 있게 최상위 순수 가상 클래스를 작성했습니다.
실제 사용하는 것은 PacketObfuscation 함수인데, 소스 내용은 아래와 같습니다.

 

 추가: /ServerLibrary/Net/Packet/PacketObfuscation.cpp

#pragma once

#include "stdafx.h"

#include "PacketObfuscation.h"

 

XorObfuscation::XorObfuscation()

{

    //암호 선택에 대해서는 조금 고민해 볼것.

    Key_ = 'T';

}

 

void XorObfuscation::encoding(Byte *packet, size_t len)

{

    for (int index = 0; index < len; ++index) {

        packet[index] ^= *key;

    }

}

void XorObfuscation::decoding(Byte *packet, size_t len)

{

    for (int index = 0; index < len; ++index) {

packet[index] ^= *key;

    }

}

 

//--------------------------------------------------------//

PacketObfuscation::PacketObfuscation()

{

    //Todo : xor 말고 다른 알고리즘도 만들어서 config xml에서 선택하게 하기

    obfuscation_ = new XorObfuscation();

}

 

PacketObfuscation::~PacketObfuscation()

{

    SAFE_DELETE(obfuscation_);

}

 

void PacketObfuscation::encoding(Byte *packet, size_t len)

{

    obfuscation_->encoding(packet, len);

}

 

void PacketObfuscation::decoding(Byte *packet, size_t len)

{

    obfuscation_->decoding(packet, len);

}

 

XOR 연산 킷값으로 ‘T’ 라는 단어를 주었습니다.
하지만 이 경우 해커가 key값을 0~255까지 XOR연산 테스트 하는 것만으로도 Key값이 확인 될 겁니다.

대부분 해커들은 채팅 메시지를 테스트 삼아 (‘aaaaa’입력 했을 때 패킷을 캡쳐 해서 분석) 이 XOR 키 값을 찾아갑니다.

 

그러므로 채팅 메시지는 별도로 암호화 처리 하는 것도 좋은 방법이라고 생각되지만,
여러 단어를 XOR값으로 테스트 하다 보면 쉽게 Key값을 알아 차리 겠군요.
좀 더 복잡하게 해서 해커를 혼란스럽게 만들어 봅시다.
...

 

위 내용은 제가 집필한 "게임 서버 프로그래밍 입문" 책의 내용중 일부 부분에 대한 내용입니다.

전체 소스 코드와 책 구입에 대해서는 http://rosagigantea.tistory.com/589 에 링크 시켰습니다.

 

 

저작자 표시 비영리 변경 금지
신고
Posted by code쟁이 RosaGigantea

지금까지 서버 프로그램을 만들고 서버끼리 데이터를 주고받는 것까지 테스트하였습니다.

하지만 실제 온라인 게임이라 하지는 못하죠.


온라인 게임을 만드는데 서버만으로는 만들 수 없습니다.

당연히 클라이언트 프로그램도 만들어야겠죠.

그래서 여기서는 간단한 더미 클라이언트를 만들어 보는 시간을 가지려 합니다.
여기서 더미(Dummy)는 가짜라는 말입니다.

일반적으로 온라인 게임에서는 더미 클라이언트랑 클라이언트를 따로 만들게 됩니다. 왜냐구요?


실제 서버 프로그래밍에서도 성능 개선 등을 할 때, 수백, 수천 대의 클라이언트를 접속할 방법이 없으므로, 로직이 같은 간단한 더미 클라이언트를 수백 개 띄어 서버에 접속시켜 테스트하는 방법을 주로 사용합니다.

 

물론 이를 완벽하게 신뢰하기에는 네트워크 특성상 불가능하니 여력이 되는 온라인 게임은 공개 테스트 서버 등에 먼저 업데이트를 해서 추가될 내용에 이상이 없는지 확인 작업을 진행합니다.

 

그런데 테스트를 위해서 클라이언트를 2개 만들어야 한다니, 클라이언트 프로그래머는 야근하라는 걸까요? 물론 그렇지 않습니다. 그래픽 출력 부분만 잘 만들어 위의 Log처럼 전략적으로 구동방식을 교체할 수 있도록 하면 좋은 구조겠죠.
보통 클라이언트 프로그램은 아래와 같은 큰 모듈들의 조합으로 이루어졌습니다.

 


그럼 이제부터 클라이언트를 만들도록 해봅시다.
테스트 용도로 만드니까 클라이언트는 C#으로 제작하려고 합니다.
MFC나 WinAPI를 사용해서 만드셔도 상관은 없지만, 제 생각으로는 이종(異種)언어들간의 패킷을 주고받게 하는 것을 만들어 보는 것도 나중에 모바일 게임 작성 등에 좀 더 공부가 될 거로 생각하기 때문에 C#을 선택했습니다.


소스를 참고하셔서 클라이언트를 C 이외의 언어, Java나 Objective-C, Swift로 만들어 보시는 것도 큰 공부가 될 것으로 생각합니다.

 

위 내용은 제가 집필한 "게임 서버 프로그래밍 입문" 책의 내용중 일부 부분에 대한 내용입니다.

전체 소스 코드와 책 구입에 대해서는 http://rosagigantea.tistory.com/589 에 링크 시켰습니다.

 

저작자 표시 비영리 변경 금지
신고
Posted by code쟁이 RosaGigantea

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바