global attribute id
id attribute는 html의 global attribute로 동일한 html 문서 내에서 html element에 고유한 id를 부여해줌. id attrib.은 style sheet의 고유한 style을 가르키거나 javascript가 조작하려는 특정 html element를 가르키게 하는데 많이 쓰인다. 또한 HTML4 이후로 html anchor로도 사용된다.
id attribute는 html의 global attribute로 동일한 html 문서 내에서 html element에 고유한 id를 부여해줌. id attrib.은 style sheet의 고유한 style을 가르키거나 javascript가 조작하려는 특정 html element를 가르키게 하는데 많이 쓰인다. 또한 HTML4 이후로 html anchor로도 사용된다.
output : stream으로 흘러들어오는 데이터
input : stream에서 흘러나가는 데이터
class istream : 데이터를 읽는데 사용되는 input stream
class ostream : 데이터를 쓰는데 사용되는 output stream
stream을 조작하기 위해 사용되는 특수한 object. input을 읽어들이는 방식이나 output이 출력되는 방식을 바꾸는 유일한 방법임.
//rev header file including structure
IOStream library는 철저히 각자의 책임을 분리하는 방향으로 설계됨. basic_ios를
상속받는 클래스들은 오직 formatting data만을 처리함. characters의 읽기와 쓰기는
basic_ios의 subobjects인 stream buffers에 의해 수행됨.
application programmer는 <iosfwd>를 include하는 것으로 충분하며,
input, output functions을 사용하기 위해 필요에 따락 각각
<istream>과 <ostream>을 include한다.
일반적으로 헤더 파일에는 꼭 필요한 파일만 include 한다. 특히 헤더파일에는 <iosfwd>만
include하고, 이에 대응되는 implementation 파일에 헤더 파일을 include해서 완전한 정의를
하도록 한다.
bit shift 연산자인 <<와 >>를 overloading 하여 입출력 연산자로 사용. void와 nullptr_t을 제외한 거의 모든 data type에 대해 overloading 되어있음.
C++11에서 같은 stream object를 concurrent output에 사용하는 것이 가능하지만 이 경우 출력이 서로 섞일 수 있음.
두번째 param.는 non const value여야 함.
C++11에서 같은 stream object를 concurrent input에 사용하는 것이 가능하지만 이 경우 입력이 서로 섞일 수 있음.
input 읽을 때 적어도 한자리 숫자로 시작해야함. 그렇지 않으면 value는 0이 되고 failbit이 set 됨.
false는 0으로, true는 1로 converting.
leading whitespace is skipped by default. whitespace까지 읽고 싶을 때는 flag _skipws_를 clear하거나 member function get()을 사용.
read wordwisely. leading whitespace is skipped by default. 다음 whitespace 나 end-of-file을 만날 때까지 읽음. flag _skipws_를 통해 leading whitespace를 skip할지 정할 수 있음. 만약 읽을 문자의 숫자를 지정하고 싶다면 setw(..) 를 사용.
char buffer[81]; std::cin >> std::setw(81) >> buffer;char * 를 사용하기보다 std::string 을 사용할 것을 권장. 이 경우 getline()을 통해 line 단위로 입력이 가능.
char * cstring = "hello"; std::cout << static_cast<void *>(cstring) << std::endl; // cstring의 주소가 출력됨
C++ I/O/ streams를 이용해서 파일을 복사하는 가장 빠른 방법. 15.14.3 참조.
Stream에는 I/O가 성공했는지 실패했는지, (실패한 경우) 실패한 이유 등이 기록된 state가 있음.
flags는 class basic_ios 에 포함되어있기 때문에 class basic_istream 또는 class basic_ostream 의 모든 객체에 존재한다. 그러나 stream buffer는 아무런 state flag를 가지지 않는데, 이는 하나의 stream buffer 가 여러개의 stream 객체에서 사용될 수 있기 때문.
error bits는 언제나 명시적으로 clear 해줘야 함.
operator >> 의 default 설정은 leading whitespace를 skip함. 이런 whitespace skip을 막고 싶다면 stream member function의 put()과 get() 을 사용할 수 있으며, 이보다 나은 방법으로 istreambuf_iterator를 이용해 I/O 필터를 구현할 수도 있음.
if ( !(std::cin >> x)) { // !뒤의 괄호 위치에 주의
// the read failed
...
}
backward compatibility를 위해 stream는 exception을 던지지 않는 것이 default로 설정되있지만, 모든 flag에 대해 flag가 set 되었을 때 exception을 던지게 설정할 수 있음.
exception은 보다 더 unexpectied situation에서 사용되어야 함. input/output 과정에서의 format error와 같은 error는 정상으로 간주되며, exception 처리 보다는 state flag를 통한 처리 방법이 더 좋은 방법임.
| formatted operator | unformatted operator |
|---|---|
| << / >> | get(..), getline(..), read(..) put(..), write(..) |
| skips whitespaces | never skips leading whitespaces |
그러나 C-strings를 읽을 때는 위의 함수들보다 operator >>를 사용하는 것이 더 안전함.
character나 string을 읽을 때 istream member function을 사용하는 것보다 stream buffer를 통해 바로 접근하는 것이 더 유리할 때가 많은데, 이는 stream buffer member function은 input 과정에서 (istream class와 달리) sentry object를 생성하지 않아 construction overhead가 없기 때문.
I/O stream operators 와 functions에서 I/O는 I/O preprocessing, 실제 I/O 작업, I/O postprocessing의 3단계에 걸쳐 수행됨. sentry class는 이를 위한 보조 클래스의 일종으로, stream과 관련된 여러 state에 관한 정보를 담고 있음. 만약 I/O operator를 stream buffer에 바로 적용하기 위해선 sentry object를 먼저 생성해줘야 함.
Manipulator for streams는 standard I/O operators에 적용되어 stream의 특성을 바꿔주는 object를 말함. arguments를 가지는 standard manipulators는 헤더파일 <iomanip>에 정의되어 있으며, 이를 사용하기 위해선 이 헤더 파일을 include해야함.
manipulator가 어떻게 작동할지는 구현하기에 따라서 달라지며, 구현 과정에 있어서 표준적인 방법은 존재하지 않음.
같은 webpage 내에서 특정 문단 등으로 이동할 수 있게 해주는 일종의 링크.
예시> 사용 방법, 참고
<a> 태그와 name attribute를 사용. name attribute는 HTML5 에서 deprecated.
만약 같은 웹페이지 내에서의 이동이라면 url 주소를 생략한채 #anchor_name만 입력도 가능.
만약 같은 웹페이지 내에서의 이동이라면 url 주소를 생략한채 #anchor_name만 입력도 가능.
google photo에 저장된 이미지파일은 자동으로 picasa에도 등록됨
소스코드를 입력한 후 Create private 혹은 Create public을 선택. private은 검색 엔진에 잡히지 않아 내가 url을 공유한 사람만이 접근 가능.
이렇게 삽입한 코드는 Gist에서 수정 시 블로그에도 자동으로 반영이 된다고 함.
git branch -m old_branch new_branch
git checkout -b new_local_branch remote_branch_path
주의! remote repository가 지저분해질 수 있음
git push --all  git push --tags
git push 로는 branch만 올라갈 뿐 tag는 올라가지 않음. 따라서 tag는 따로 올려줘야 함.
remote_branch_path를 tracking 하는 local branch를 만들고 checkout. 이 방법으로 새 local branch를 만들 시 branch의 이름은 remote branch의 이름과 동일하게 만들어짐.
git push origin :old_branch or git push origin --delete romote_branch // remote
branch 삭제 git fetch --all --prune // 각 local machine에서 실행. to get rid of obsolete tracking branch 제거 remote branch를
삭제해도 다른 local machine들에서는 여전히 삭제된 remote branch를 tracking 하고 있는 상태. obsolete tracking을 막기 위해 다른 local machine에서
실행
Player 수 증가에 따른 복잡도 증가(O(n*n)), NAT, session migration 등 어려운 문제가 존재.
여러대의 서버가 sign in process, game lobby, in-game 등 역할을 나눠 각 process를 담당. 이외에
NAT(Network Address Translator=공유기) 뒤에 있는 peer의 IP는 실제 IP가 아니기 때문에 server가 될 수 없음. 이를 해결하기 위해 hole punching 기법 사용.
참고: 실전에서 알아보는 홀펀칭 방법
네트워크 게임 튜터리얼 3 - 데이터베이스 그리고 C/S DB에 들어가는 내용
DB
웹서버 -------- 게임서버 DB가 웹서버와 게임 서버를 연결하는 역할
패킷 검출용 CGeneric class를 만들고 다른 패킷들은 이 클래스를 상속. DWORD head를 통해 패킷의 종류를 판별. 실제로 패킷을 전송 시엔 CDataMessage라는 버퍼용 클래스로 패킷을 감싸고 패킷의 크기는 버퍼클래스의 앞부분 4비트를 통해 표시.
네트워크 게임 튜터리얼 4 - 로비, 그리고 할말이 많다
출처: http://www.gamedevforever.com/ 게임 서버는 Patch server, load balance server, lobby server, game server 등 분산 서버 구조를 이루고 있는데, 필요한 객체 생성 및 초기화 등은 이를 담당하는 서버에서 처리를 해야하고 lobby server는 lobby, game server는 game 등 자신이 담당한 역할에 집중할 수 있게 설계해야함.
텍스트 기반으로 이뤄진 자료구조. 사람이 읽기 쉽지만 너무 커서 게임 서버에서는 잘 쓰지 않음. 멀티플랫폼 사용 가능
구글에서 만든 serialization protocol. 몇몇 기본 자료형과 string 만 보낼 수 있는 등 제약이 있음
Java script 용으로 나온 경량 데이터 교환 포맷. 가벼움. 멀티 플랫폼 가능.
강력한 기능: STL collection을 그대로 serialization. C++ 단일 플랫폼에 대해 사용 가능.
IDL 컴파일러: filename.idl 파일을 만들고 정해진 형식에 따라 필요한 함수를 작성해놓으면 이를 바탕으로 자동으로 소스 코드를 만들어주는 외부 컴파일러. 프라우드넷 IDL 컴파일러 등
파일 스트림을 통해 파일에 읽고 쓸 수 있게 해주는 클래스. serialization을 담당하는 Boost.Serialize는 Boost.Archive 라는 유틸리티 클래스에 기반을 두고 있음. Archive는 serialize를 담당하는 text_oarchive 클래스와 deserialize를 담당하는 text_iarchive 클래스로 구분됨. 클래스 내부에 boost::archive::text_oarchive와 boost::archive::text_iarchive 형 객체를 선언하고 이를 통해 입출력 수행.
클래스 내부에 serialize 함수를 선언