Serach

2013년 11월 11일 월요일

C++ [Windows] 실행 파일이 위치한 경로.. 얻는 방법..

가장 쉽게 이용하는 방법은
GetCurrentDirectory 함수를 사용하면 된다.
하지만 GetCurrentDirectory 의 경우
윈도우 서비스로 어플리케이션을 실행시...
C:\windows\system32\
폴더로 지정되게 된다..

다소 귀찮더라도
아래 코드처럼 하면 어디서 실행되더라도 모듈이 위치한 경로를 정확하게 
얻을 수 있다..

HMODULE hModule = GetModuleHandleW(NULL);
WCHAR path[MAX_PATH];
GetModuleFileNameW(hModule, path, MAX_PATH);
PathRemoveFileSpec(dest);

2013년 11월 8일 금요일

포트를 열고 있는 프로그램 찾기




Linux


$ lsof -i TCP:<portNumber>
netstat의 -p 옵션을 사용해도 되지만 -p 옵션을 지원하지 않는 경우도 많다








Windows


windows XP 이상에서 특정 포트 사용 프로세스 확인
 
사용 포트 PID 확인
C:\>netstat -ano | find "1234"

 TCP 0.0.0:1234 0.0.0.0:0 LISTENING 567
 
PID 프로세스명 확인
C:\>tasklist /FI "PID eq 567"
이미지 이름 PID 세션 이름 세션# 메모리 사용
process.exe 567 Console  0 4,700 K


2013년 11월 4일 월요일

Unicode ,UTF, Encoding의 개념

유니코드란

요약하면 컴퓨터에서 세계 각국의 언어를 통일된 방법으로 표현할 수 있게 제안된 국제적인 문자 코드 규약이다.


흔히 유니코드를 UTF-16LE로 착각하는데


유니코드는 컴퓨터에서 사용할 수 있게 표현된 것이 아니라 보다 추상적인 개념이다.


실제 이 유니코드를 컴퓨터에 사용하기 위해 변환 하는 것을 엔코딩(encoding)이라고 하며


이때 사용하는것이 우리가 흔히 말하는 UTF(Unicode Transformation Format)이다.


UTF는 8, 16, 32등 다양한 포멧이 존재하며 이 숫자는 각 포멧 내에서 


문자열을 표현하는 비트를 나타낸다.





하나씩 자세히 살펴보면



UTF-8

UTF-8은 하나의 문자를  위해 1, 2, 3, 4바이트로 인코딩을 수행하는 가변 길이 문자 인코딩 방식이다.

ASCII 문자(첫128문자)들은 1바이트만으로 표시된다. 

다음 1920문자(발음 구별 기호가 붙은 라틴,그리스,키릴,콥트 등의 문자 등)는 2바이트

나머지  문자들 중 BMP(Basic multilingual plane)안에 있는것은 3바이트, 아닌것은 4바이트로 표현된다.

4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다. 

UTF 8과16중 어느 인코딩이 더 적은 바이트를 사용하는지는 문자열에서 사용된 코드 포인트에 따라 달라진다.

이러한 방법은 영어에 있어 최상의 방법이다. 

UTF-8은 매우 일반적인 인코딩 방식이지만 BMP를 벗어나는 문자를 많이 사용할 경우 비효율적이다.




UTF-16

기본 다국어 평면 (Basic multilingual plane)에 속하는 문자들은 그대로 16비트 값으로 인코딩이 되고,

그 이상의 문자는 특별히 정해진 방식으로 32비트로 인코딩이된다.

ISO 표준은 UCS-2 인코딩도 정의하며 여기선 BMP의 16비트 표현만을 다룬다. 

기본 다국어 평면의 문자들은 곧바로 16비트 값으로 대응되어 인코딩되며, 

이 경우에는 인코딩된 바이트 스트링의 엔디언만 주의하면 된다.

UTF-16LE, BE는 각각 Little-endian, Big-endian을 나타낸다.

전세계의 대부분의 언어가 16비트로 표현이 가능하기 때문에 윈도우는 UTF-16LE을 사용한다.

또한 이러한 장점으로 인해 프로그램 내에서 사용하는 문자열을 보다 쉽게 다른 언어로 변경할 수 있다.

UTF-16은 공간 절약과 코딩의 편의성 사이의 적절한 절충안이라 할 수 있다. 





UTF-32

UTF-32는 모든 문자를 4바이트로 인코딩한다. 

이러한 인코딩 방식은 문자변환 알고리즘을 간단히 구성하려 할 때나 

가변 길이의 인코딩 방식을 사용하고 싶지 않은 경우에 유용하다. 

예를 들어 UTF-32를 사용하면 모든 문자가 4바이트이므로 다른 대안에 대해 고려할 필요가 없다. 

UTF-32는 메모리 사용에 있어 매우 비효율적인 인코딩 방식이기 때문에 

파일 저장 방식이나 네트워크를 통한 전송 방식으로는 거의 사용되지 않는다.

이러한 인코딩 방식은 프로그램 내부에서만 사용되는 것이 일반적이다.




[출처] UTF-8, UTF-16, UTF-32 문자 인코딩|작성자 욱쓰

2013년 11월 1일 금요일

Gerrit 세팅

설치

게릿을 사용하기 위해서는 jdk의 설치가 필요합니다.
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

다음은 DBMS가 필요합니다. H2, MySQL, PostgreSQL를 지원합니다. 

데이터 베이스 세팅은

PostgreSQL
createuser --username=postgres -RDIElPS gerrit2
createdb --username=postgres -E UTF-8 -O gerrit2 reviewdb
mysql
CREATE USER 'gerrit2'@'localhost' IDENTIFIED BY 'secret';
CREATE DATABASE reviewdb;
ALTER DATABASE reviewdb charset=latin1;
GRANT ALL ON reviewdb.* TO 'gerrit2'@'localhost';
FLUSH PRIVILEGES;

참고로 gerrit2 라고 되있는건. 게릿 2.0 버전 이상이 등장하면서
통상적으로 gerrit2 라고 부릅니다.


아래 링크에서  Gerrit을 다운받습니다.
http://gerrit-releases.storage.googleapis.com/index.html


Gerrit을 설치합니다.
java -jar gerrit.war init -d 설치경로

잘 설치되면 아래 같은 메시지가 나타납니다.
Initialized /home/gerrit

실행을 시켜봅니다.
/home/gerrit/bin/gerrit.sh start

설정 파일은 gerrit/etc/gerrit.config 에 설정있습니다.

다시 게릿을 종료하고

http 인증 방식을 설정합니다..

gerrit/etc/gerrit.config에

[gerrit]
    canonicalWebUrl = http://127.0.0.1:8081/
[auth]
    type = HTTP
[httpd]
    listenUrl = proxy-http://127.0.0.1:8081

위처럼 선그어진 설정을 제거합니다. 그리고 내용을 변경합니다.

다음으로는 http인증에 사용할 아이디,비밀번호를 관리하는 파일을 만듭니다.

# htpasswd -c [FileName] [ID]

이제 마지막으로 아파치에 다음 설정을 추가합니다

Listen 8080
NameVirtualHost *:8080

<VirtualHost *:8080>
        ServerName localhost

        ProxyRequests Off
        ProxyVia Off
        ProxyPreserveHost On

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>

        <Location />
                AuthType Basic
                AuthName "Gerrit Code Review"
                require valid-user
                AuthUserFile <firlePath>
        </Location>

        ProxyPass / http://127.0.0.1:8081/
</VirtualHost>


아파치와 게릿을 다시 시작합니다 !

끝 !









2013년 10월 25일 금요일

install Command Line Tools in OSX 10.9 Mavericks

open terminal
open terminal
2 : 다음과 같이 입력합니다.  xcode-select --install 
Screen Shot 2013-06-27 at 11.37.04 am
3: 새로운 팝업 창이 뜹니다.
Screen Shot 2013-06-27 at 11.38.59 am
4 : 인스톨 버튼 클릭
Installing Command Line Tools
Installing Command Line Tools


5 : 약 30분 정도 기다리면 설치 끝 !!
Done
Done


2013년 10월 11일 금요일

게임이 재미있는 4가지 이유

여러분, 혹시 호이징거의 이론을 아시나요?

네덜란드의 고전학자인 호이징거는 2차 세계대전 당시 독일군에 의해서 가택연금된 상태에서
세기의 명저를 남겼는데 그 중 게임 제작자들이 알고 있어야 하는「호모 루덴스」입니다.

「호모 루덴스」는 놀이를 하는 인간에 대한 놀라운 통찰력을 담고 있습니다.
인간은 본질적으로 유희(遊戱)를 추구하고, 인간 문명의 원동력은 바로 '놀이' 라는 것이 이것의 핵심 입니다.

뜬금없이 제가 이 「호모 루덴스」라는 것을 소개 했는지 이제 시작합니다.


호이징거의 이론은 프랑스의 학자인 <로제 카이와>에 의해서 확대 발전 되었다고 합니다.
로제 카이와는 호이징거의 비판론 으로 시작되었지만, 그의 생각을 발전시켜서 놀이에 대한 학문적 가치를 더욱 높였습니다.

호이징거가 인간의 본질을 연구하면서 '놀이'를 조명했고,
로제 카이와는 '놀이' 자체만을 연구 하여 20세기 최고의 놀이학자가 되었지요.

로제 카이와는 그의 저서인 「놀이와 인간」을 통해서
역할 놀이인 '미미크리(Mimicry)', 경쟁 놀이인 '아곤(Agon)', 확률 놀이인 '알레아(Alea)', 몰입 놀이인 '일링크스(Ilinx)'
위 4가지로 놀이를 분류 했습니다.


미미크리(Mimicry)

역할 놀이인 미미크리는 특정한 누군가를 흉내내거나 모방하는 놀이를 의미 합니다.

어린시절 소꿉놀이, 배역이 정해져 있는 연극과 영화 이들은  미미크리의 범주에 속해 있으며,

또한 애니메이션 혹은 게임의 주인공과 똑같은 옷을 입거나, 같은 행동을 하는 '코스튬 플레이' 역시 미미크리 놀이에 속한다.

이 놀이를 게임으로 보자.

게임상에서의 플레이어는 가장 먼저 무엇을 하는가?

플레이어는 가장 먼저 종족 혹은 캐릭터를 선택합니다.

사람들은 게임 안에서 캐릭터, 즉 역할을 가지고 시작합니다.

탱커가 되어 몬스터들로 부터의 공격을 막아주며 아군을 지켜주거나, 도시의 시장이 되어 도시를 건설하기도 하며,

사령관이 되어 전투를 지휘 하기도 한다.



아곤(Agon)

경쟁 놀이인 아곤은 일정한 규칙 안에서 참가자 모두가 경쟁관계를 형성하며 투쟁하는 놀이를 말한다.

참가자들에게 공정한 규칙이 주어지며, 명확한 승패가 결정되는 놀이가 된다.

인간은 똑같은 규칙과 삶 속에서 최고가 되고자 하는 욕구가 있기 때문에 서로 경쟁하게 됨으로 자연스레 아곤 놀이가 발동된다.

반면,

게임은 이 일정한 규칙과 속에서 서로 경쟁을 하는 재미를 주고있다.

게임 제작자들이 게임을 제작하면서 미미크리 다음으로 생각해야 하는것이 바로 경쟁 놀이인 아곤 이다.


알레아(Alea)

우연 놀이인 알레아는 라틴어로 '주사위 놀이' 라는 의미이다.

주사위는 정육면체 모양의 도구로 각 면 마다 1~6까지의 숫자가 있으며 중복은 없다.

주사위를 던졌을 때 어떠할까?

자신의 의지대로 숫자가 나오는 것이 아닌 확률, 즉 '운' 에 맡기는 놀이 이다.

일상생활의 알레아 놀이는 어디에 있을까? '운' 이라는 단어에서 가장 떠오르는 복권 이 역시도 알레아 놀이 이며,

화투, 마작, 포커, 슬롯머신 역시 알레아 놀이에 속한다.

주사위는 단순히 운으로 결정되는 놀이정도로 알고 있다.

하지만 정확히는 확률이며 통계이다.

컴퓨터 게임 전체에 확률과 통계가 있는데 이를 '밸런싱' 이라는 이름으로 곳곳에 있다.

이 '밸런싱' 은 플레이어와 NPC 그리고 오브젝트의 행동에 의해 결정 된다.

따라서 게임 제작자들은 유저가 재미를 느끼도록 밸런싱 조절에 신경을 써야 할 것이다.


일링크스(Ilinx)

몰입 놀이인 일링크스는 고도의 집중력이 필요한 놀이를 의미 한다.

서커스, 롤러코스터, 스키 처럼 일시적으로 무아지경의 상태를 일으키는 놀이 이지만

현기증이라기보다 난관 상태에서 경험하는 일종의 몰입 상태 라고 볼 수 있다.

컴퓨터 게임은 플레이어에게 끊임없이 도전 과제를 준다.

플레이어는 이 과제를 수행하기 위해서 한계에 도전하고, 극복해 가며, 그 자체에 몰입을 하게 된다.

일링크스 놀이는 앞에서 말했던 다른 분류의 놀이들 속에 녹아 들어 있다.

미미크리, 아곤, 알레아 이 세 가지의 놀이가 컴퓨터 게임 자체를 이루는 구성 요소 라면

일링크스는 게임을 즐기는 사람의 감정 상태를 말 한다.

즉. 세 가지의 놀이가 플레이어를 일링크스의 상태로 이끌어 가는 셈 이다.



여기 까지 로제 카이와의 「놀이와 인간」에서 분류한 네 가지의 놀이를 살펴 보았다.

게임이 살아남기 위해서는 위 네 가지의 놀이가 성립해야 하며 지속적인 순환이 되어야 한다.

아마도 위의 네 가지 단어를 처음 들어 보아서 혼란스러울 수도 있다.

하지만 게임 제작자 에게 있어서 중요하지만 간단한 내용 이므로 꼭 알아두자.


정리

ⓐ  인류학자인 호이징거는 인간은 놀이하는 동물이라고 말했다.
이와 같이 놀이는 인간 문명 창조의 원동력으로, 매우 위대한 행위이다.

ⓑ 놀이학자인 로제 카이와는 인간이 재미를 느끼는 놀이를
'미미크리', '아곤', '알레아', '일링크스' 라는 네 가지 유형으로 나누었다.

ⓒ 미미크리는 게임 속에서 플레이어가 맡는 혁할이다.

ⓓ 아곤은 게임의 진행을 총괄하는 규칙의 모음이다.

ⓔ 알레아는 플레이어가 게임을 진행하며 느끼는 공정함, 밸런싱을 의미한다.

ⓕ 일링크스는 플레이어가 게임에서 승리자가 되기 위해서 극복해야 할
도전 과제에 온 정신을 몰입하면서 느끼는 감정 상태를 의미한다.

ⓖ 게임이 재미있는 이유는 놀이의 네 가지 유형인
미미크리, 아곤, 알레아, 일링크스가 상호 복합적으로 게임에 녹아있기 때문이다.




TCP와 UDP의 차이점

1. Connection Oriented Protocol vs. Connectionless Protocol

TCP는 3-way handshaking을 통하여 Session을 수립 후에 통신을 하는 Connection Oriented (연결지향형) Protocol 입니다. 그에 반해 UDP는 상대방이 받던 받지 못하던 무작정 데이터를 전송하는 Connectionless (비연결형) Protocol 입니다. 그럼, 언제 UDP를 사용할까요? 

예를 들어 DNS 같은 경우 예로 보세요. 누군가 DNS 서비스를 요청할 때마다 TCP처럼 Session을 맺고 통신을 한다면 속도도 느리고, 서버 리소스도 엄청나게 소모될 겁니다. 그런가 하면 NMS(Network Management Server)가 5분에 한번씩 장비 상태를 점검하기 위해 정보를 읽어오는데 수백, 수천대의 장비와 Session을 맺어야 한다면 이것도 마찬가지로 문제가 있겠죠? 그래서, SNMP(Simple Network Management Protocol)는 UDP를 사용하는 Protocol입니다.

2. Reliable vs. Best Effort

TCP는 데이터 전송에 문제가 발생했을 경우, 재전송 요청 등을 통해서 데이터가 정확하게 전송되는 것을 보장하는 Protocol인 반면, UDP는 에러가 생기든 말든... 보내는 놈이나 받는 놈이나 신경을 쓰지 않는 Protocol입니다. 이런, 이따위 Protocol을 어디에 쓸까요?

재전송을 하면 안되는 서비스들이 있습니다. 대표적인 예가 바로 Real-Time Protocol입니다. 전화를 하고 있다고 가정해 보세요. '여''보''세''요'라는 4개의 데이터를 전송했는데, '세'를 못 받았다고 다시 보내달라고 하면 '여보요세'가 될겁니다. 그냥 '여보X요'로 전달하는게 더 낫겠죠?

그런가 하면 Multicast 서비스가 UDP를 사용합니다. 1:N으로 통신하는 방식에서 한놈이 데이터를 받지 못했다고 재전송 요청을 한다고 생각해보세요. 제대로 받은 놈들도 해당 데이터를 다시 받아서 처리해야 한다는 문제가 발생할 수 있습니다. 그래서 UDP를 사용하는거죠!

그리고, UDP는 상대방이 잘 받았는지 못 받았는지 신경을 쓰지 않으니 Ack가 별도로 필요없겠죠? ^^

3. Sequence Number vs. Non-Sequencing

TCP는 데이터 유실 등을 확인하기 위하여 데이터마다 Sequence Number라는 번호를 붙여서 전송을 합니다. 하지만, UDP는 데이터 유실에 관심이 없기 때문에 Sequence Number가 없는 Non-Sequencing Protocol 입니다. 그럼, 데이터를 전송할 때 상이한 경로로 전송되서 나중에 보낸 데이터가 먼저 도착하게 되면 어떻게 되나요? 예를 들어 '여''보''세''요'를 전송했는데 '여''세''보''요' 순으로 도착을 한겁니다.

이렇게 데이터 전송 순서를 알아야 하는 서비스는 RTP(Real-time Protocol)과 같은 Sequence Number 기능을 가지고 있는 기술과 함께 쓰이거나 어플리케이션 수준에서 Sequencing을 수행합니다.
 
4. Half-duplex vs. Full-duplex

Layer 2에서의 duplex가 아니구요, 한개의 Port를 이용하여 [upload/download]가 가능한가에 대한 부분입니다. 원칙적으로 UDP는 Half-duplex이고 TCP는 Full-duplex 입니다. 하지만, UDP도 어플리케이션 개발 방식에 따라 Full-duplex 방식으로도 설계가 가능합니다. 그래서,TCP를 Full-dulpex 방식이라고 이야기하지만, UDP를 Half-duplex 또느 Full-duplex 방식이라고 정의하지는 않습니다.

5. Control vs. Don't care

TCP는 Error-Contol, Flow-Control 등 이것저것 제어를 많이 합니다.
하지만, UDP는 그런건 그냥 짜증스럽고 귀잖을 뿐입니다. 

My-SQL 백업 및 복원

- 특정 데이타베이스 하나만을 백업
백업형식 : myslqdump -u DB계정명 -p 백업대상데이터베이스명 > 저장할파일명
복구형식 : mysql -u DB계정명 -p 복구할테이터베이스명 < 저장할파일명

# ./mysqldump -u root -p mysql > mysql.sql      //mysql 디비 백업 예
# ./mysql -u root -p mysql < ./mysql.sql           //mysql 디비 복구 예

위 백업결과물인 sql 파일은 디비를 생성하지는 않는다.. 다시말해 복구하려는 디비에 mysql이란 디비가 없다면 복구가 되지않는다.

복구하려는 mysql 디비에 테이블이 이미 존재한다면 복구 실패... sql 파일에서 해당 디비의 테이블을 생성하므로.. 따라서 특정 데이타베이스 하나만을 복구 할 시에는 데이타베이스의 이름만 생성한 다음에 위 방법의 복구하여야 함


- 특정 데이타베이스의 특정 테이블 하나만을 복구 백업
백업형식 : myslqdump -u DB계정명 -p 데이터베이스명 테이블명 > 저장할파일명
복구형식 : mysql -u DB계정명 -p 데이터베이스명 < 저장할파일명
#./mysqldump -u root -p mysql user > user.sql
#./mysql -u root -p mysql < user.sql

- 여러개의 데이터베이스 한번에 백업과 복구
백업형식 : mysqldump -u root -p --databases [옵션] DB1 [DB2 DB3] > 파일명
복구방법 : mysql -u root -p < 파일명
# ./mysqldump -u root -p --databases mysql test > dbs.sql   //mysql, test 디비를 백업
# ./mysql -u -root -p < dbs.sql                                            //백업된 두 디비를 복구

databases 옵션 시 일반 백업과 달리 "CREATE DATABASE ..."문과 "USE DB .." 문이 추가됨
//달리 애기하면 DB를 생성할 필요가 없이 바루 디비가 생성되고 생성된 디비로 전환되고 테이블을 생성하고 인서트로 데이타를 붓는다.. 데이타베이스를 지정하면 안됨


- Mysql 의 전체 데이타베이스 백업
백업형식 : ./mysqldump -u root -p --all-databases > 파일명.sql
복구형식 : mysql -u root -p < 파일명.sql

원본 데이타베이스명과 동일한 디비가 생성됨


- 기존 테이블 삭제후  백업된 파일로 복구를 위한 백업
 (mysqldump문으로 데이타베이스 백업 시 각각의 create table문 앞에 drop table문을 삽입한 형태가 된다)
백업형식 : ./mysqldump -u root -p --add-drop-table test > test.sql
test 데이타베이스를 기존 태이블 삭제문을 추가하여 백업한다
복구형식 : ./mysql -u root -p test < test.sql
기존 테이블을 삭제하고 복구한다는것에 유의


- 기타 옵션
   -A, --all-databases : 모든 DB 덤프
   -B, --databases : 특정 DB를 덤프 
   --opt : 버퍼링을 비확성화 하고, 많은 데이터를 덤프에 있는 소량의 SQL구문에 기록해 더효율적으로 동작하다록 한다.
   --allow-keywords, --quote-names : 예약어를 사용하는 테이블을 덤프하고 복원할 수 있게 한다.
   --lock-alltables : 전역적으로 일관된 백업을 만들도록 "FLUSH TABLES WITH READ LOCK"을 사용한다. 
   --tab : "SELECT INTO OUTFILE"로 파일을 덤프하여, 덤프 및 복원 속도가 매우 빠르다.
   -d, --no-data :  데이터는 제외하고 스키마만 덤프
   -t, --no-create-info : 스키마는 제외하고 




로그 복구 방법

delete나 truncate 같은 명령으로 데이터를 지웠을때 복구하는 방법입니다.
mysql의 모든 명령들은 로그를 남기기때문에 가능합니다.
일단 mysql의 DB가 쌓이는 디렉토리로 이동합니다. 
대게 /usr/local/mysql/data /usr/local/mysql/var 등으로 설정해 놓으셨을겁니다.
해당 디렉토리로 이동하면 xxx-bin.001 xxx-bin.002 같은 바이너리 파일들이 존재할겁니다.
이게 바로 DB를 첨 생성할때부터 지금까지 쌓여온 로그인데요 이 파일을 활용하시면 삭제된 데이터도 살릴수 있습니다.
바이너리 파일이기때문에 그냥 접근하시면 이상한 문자들이 보이구요
mysqlbinlog 명령을 이용하셔서 사용해야 합니다.
다음은 예제입니다.

일단 DB 디렉토리로 이동한다.
# cd /usr/local/mysql/data

바이너리 파일을 소스파일로 변환한다.
# ../mysqlbinlog leopit-bin.002 > rescue.sql

필요한 구문만 가져온다.
# grep "insert" rescue.sql > rescue1.sql

이렇게 하시면 rescue1.sql은 지금까지의 인서트구문이 다 들어옵니다.
여기서 필요없는 부분은 지우세요

이제 최종적으로 DB에 삽입만 하시면 됩니다.
# mysql -u 계정아이디 -p DB이름 < rescue1.sql