1월 29, 2016

ch15. Input/Output using stream classes

0. Overview

  • C++11부터 string stream과 file stream이 rvalue와 move semantic을 지원.
순서



1. Background of I/O streams

  1. stream objects
  2. output : stream으로 흘러들어오는 데이터
    input : stream에서 흘러나가는 데이터

  3. stream classes
  4. class istream : 데이터를 읽는데 사용되는 input stream
    class ostream : 데이터를 쓰는데 사용되는 output stream

  5. global stream objects
    • cin
    • cout
    • cerr
    • clog
  6. stream operators
  7. manipulators
  8. stream을 조작하기 위해 사용되는 특수한 object. input을 읽어들이는 방식이나 output이 출력되는 방식을 바꾸는 유일한 방법임.

  9. a simple example


2. Fundamental stream classes and objects

  1. Classes and class hierarchy
  2. //rev header file including structure
    IOStream library는 철저히 각자의 책임을 분리하는 방향으로 설계됨. basic_ios를 상속받는 클래스들은 오직 formatting data만을 처리함. characters의 읽기와 쓰기는 basic_ios의 subobjects인 stream buffers에 의해 수행됨.

  3. Global stream objects
    • cin - istream
    • cout - ostream
    • cerr - ostream
    • clog - ostream
  4. Header files
  5. application programmer는 <iosfwd>를 include하는 것으로 충분하며, input, output functions을 사용하기 위해 필요에 따락 각각 <istream>과 <ostream>을 include한다.
    일반적으로 헤더 파일에는 꼭 필요한 파일만 include 한다. 특히 헤더파일에는 <iosfwd>만 include하고, 이에 대응되는 implementation 파일에 헤더 파일을 include해서 완전한 정의를 하도록 한다.

3. Standard Stream Operators << and >>

bit shift 연산자인 <<와 >>를 overloading 하여 입출력 연산자로 사용. void와 nullptr_t을 제외한 거의 모든 data type에 대해 overloading 되어있음.

  1. Output Operator <<
  2. C++11에서 같은 stream object를 concurrent output에 사용하는 것이 가능하지만 이 경우 출력이 서로 섞일 수 있음.

  3. Input Overator >>
  4. 두번째 param.는 non const value여야 함.
    C++11에서 같은 stream object를 concurrent input에 사용하는 것이 가능하지만 이 경우 입력이 서로 섞일 수 있음.

  5. Input/Output Of Special Types
    • Numeric type
    • input 읽을 때 적어도 한자리 숫자로 시작해야함. 그렇지 않으면 value는 0이 되고 failbit이 set 됨.

    • Type bool
    • false는 0으로, true는 1로 converting.

    • Types char and wchar_t
    • leading whitespace is skipped by default. whitespace까지 읽고 싶을 때는 flag _skipws_를 clear하거나 member function get()을 사용.

    • Type char *
    • 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 단위로 입력이 가능.

    • Type void *
    • void * 를 사용 시 pointer 출력(memory address 출력)도 가능.
      char * cstring = "hello"; std::cout << static_cast<void *>(cstring) << std::endl; // cstring의 주소가 출력됨
    • Stream Buffers
    • C++ I/O/ streams를 이용해서 파일을 복사하는 가장 빠른 방법. 15.14.3 참조.

    • User-Defined Types
    • Monetary and Time Values

4. State of Streams

Stream에는 I/O가 성공했는지 실패했는지, (실패한 경우) 실패한 이유 등이 기록된 state가 있음.

  1. Constants for the State of Streams
    • goodbit
    • eofbit
    • failbit
    • badbit

    flags는 class basic_ios 에 포함되어있기 때문에 class basic_istream 또는 class basic_ostream 의 모든 객체에 존재한다. 그러나 stream buffer는 아무런 state flag를 가지지 않는데, 이는 하나의 stream buffer 가 여러개의 stream 객체에서 사용될 수 있기 때문.

  2. Member Functions Accessing the State of Streams
  3. error bits는 언제나 명시적으로 clear 해줘야 함.

  4. Stream State and Boolean Conditions
  5. operator >> 의 default 설정은 leading whitespace를 skip함. 이런 whitespace skip을 막고 싶다면 stream member function의 put()과 get() 을 사용할 수 있으며, 이보다 나은 방법으로 istreambuf_iterator를 이용해 I/O 필터를 구현할 수도 있음.

    if ( !(std::cin >> x)) { // !뒤의 괄호 위치에 주의
    // the read failed
    ...
    }

  6. Stream State and Exceptions
  7. backward compatibility를 위해 stream는 exception을 던지지 않는 것이 default로 설정되있지만, 모든 flag에 대해 flag가 set 되었을 때 exception을 던지게 설정할 수 있음.
    exception은 보다 더 unexpectied situation에서 사용되어야 함. input/output 과정에서의 format error와 같은 error는 정상으로 간주되며, exception 처리 보다는 state flag를 통한 처리 방법이 더 좋은 방법임.

5. Standard Input/Output Functions

formatted operator unformatted operator
<< / >> get(..), getline(..), read(..)
put(..), write(..)
skips whitespaces never skips leading whitespaces
  1. Member functions for input
    • get(c, num)
    • get(c, num, t)
    • getline(str, num)
    • getline(str, num, t)
    • read(str, num)
    • readwome(str, num)
    • etc..

    그러나 C-strings를 읽을 때는 위의 함수들보다 operator >>를 사용하는 것이 더 안전함.
    character나 string을 읽을 때 istream member function을 사용하는 것보다 stream buffer를 통해 바로 접근하는 것이 더 유리할 때가 많은데, 이는 stream buffer member function은 input 과정에서 (istream class와 달리) sentry object를 생성하지 않아 construction overhead가 없기 때문.

  2. Example Uses
  3. sentry objects
  4. 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를 먼저 생성해줘야 함.

Manipuators

Manipulator for streams는 standard I/O operators에 적용되어 stream의 특성을 바꿔주는 object를 말함. arguments를 가지는 standard manipulators는 헤더파일 <iomanip>에 정의되어 있으며, 이를 사용하기 위해선 이 헤더 파일을 include해야함.

  1. Overview of All Manipulators
    • endl
    • ends
    • flush
    • skipws
    • noskipws
    • setw
    • setfill
    • boolalpha
    • showpos
    • dec
    • hex
    • ...
  2. How Manipulators Work
  3. manipulator가 어떻게 작동할지는 구현하기에 따라서 달라지며, 구현 과정에 있어서 표준적인 방법은 존재하지 않음.

  4. User-Defined Manipulatrs

Formatting

  1. Format Flags
  2. Input/Output Format of Boolean Values
  3. Field width, Fill Character, and Adjustment
  4. Positive Sign and Uppercase Letters
  5. Numeric Base
  6. Foating-Point Notation
  7. General Formatting Definitions


출처

the c++ standard library a tutorial and reference by Nicolai M. Josuttis

1월 28, 2016

HTML anchor - 웹페이지 내 원하는 부분으로 이동하는 링크 만들기

HTML anchor란?

같은 webpage 내에서 특정 문단 등으로 이동할 수 있게 해주는 일종의 링크.

예시> 사용 방법, 참고


사용 방법

<a> 태그와 name attribute를 사용. name attribute는 HTML5 에서 deprecated.

  1. destination 지정: <a name="anchor_name"> destination_string</a>를 지정
  2. departure link 만들기 : <a>태그 사용한 링크 다는 방식과 동일하게 링크 삽입. 단, url 주소 맨 마지막에 (url)#anchor_name 덧붙임
  3. 만약 같은 웹페이지 내에서의 이동이라면 url 주소를 생략한채 #anchor_name만 입력도 가능.

<a> 태그와 id attribute를 사용.
  1. destination 지정 :
    <a name="anchor_name"> destination_string</a>를 지정
  2. departure link 만들기 : <a>태그 사용한 링크 다는 방식과 동일하게 링크 삽입. 단, url 주소 맨 마지막에 (url)#anchor_name 덧붙임
  3. 만약 같은 웹페이지 내에서의 이동이라면 url 주소를 생략한채 #anchor_name만 입력도 가능.


참고

How to Link to a Specific Line or Paragraph on a Web Page Using HTML
by Christopher Heng, thesitewizard.com

webpage에 이미지 올리는 방법

blogger에 이미지 삽입하는 방법

바로 업로드하는 방법

  1. html 작성 창에서 그림 선택
  2. 메뉴에서 '업로드' 선택

google photo (picasa)를 거쳐 업로드하는 방법

  1. 기타기기(아이패드, 스마트폰 등)인 경우, Google photo로 이미지 파일 내보내기
  2. google photo에서 업로드하고자 하는 이미지를 선택하여 cloud에 저장
  3. google photo에 저장된 이미지파일은 자동으로 picasa에도 등록됨

  4. html 작성 창에서 그림 선택
  5. 메뉴에서 '피카사' 선택
  6. 정렬 조건, 크기 등 선택



git wiki에 이미지 삽입하는 법

  1. repos.에 이미지를 저장한 후 commit하여 remote repos.에 이미지 업로드
  2. 이미지를 저장한 ropos.에 들어가 이미지를 클릭->오른쪽 위에서 RAW 선택
  3. 새로운 창에 이미지가 나타나면 https://raw...로 시작하는 주소를 복사
  4. 복사한 주소로 이미지를 로드

1월 12, 2016

Blogger에서 code 삽입하는 법: Gist, 기타..

Gist 사용

  1. GitHubGist 접속 후 오른쪽 상단의 New gist 선택
  2. 소스코드를 입력한 후 Create private 혹은 Create public을 선택. private은 검색 엔진에 잡히지 않아 내가 url을 공유한 사람만이 접근 가능.

  3. 상단의 Embed에 나온 script 태그를 복사해 html 문 내의 원하는 위치에 삽입
  4. 이렇게 삽입한 코드는 Gist에서 수정 시 블로그에도 자동으로 반영이 된다고 함.

기타

1월 04, 2016

git branch 조작법

Local branch

  • local branch 이름 수정
  • git branch -m old_branch new_branch

  • remote branch를 local branch로 가져온 후 track
  • git checkout -b new_local_branch remote_branch_path

  • 모든 local branch들을 한번에 remote repository에 업로드
  • 주의! remote repository가 지저분해질 수 있음
    git push --all  git push --tags
    git push 로는 branch만 올라갈 뿐 tag는 올라가지 않음. 따라서 tag는 따로 올려줘야 함.

  • git checkout -t remote_branch_path
  • remote_branch_path를 tracking 하는 local branch를 만들고 checkout. 이 방법으로 새 local branch를 만들 시 branch의 이름은 remote branch의 이름과 동일하게 만들어짐.

Remote 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에서 실행 git remote rm remote_branch 랑 차이점..? 이건 remote branch가 삭제됐다고 자동으로 알려주는건가?

1월 03, 2016

네트워크 게임 튜토리얼 season1


  1. winsock의 개념
  2. 네트워크 게임 튜터리얼 1 - 워밍업

    1. winsock의 역사
    2. winsock의 종류
      • Window message select(WSAAsyncSelect)
      • Kernel event select(WSAEventSelect)
      • Overlapped I/O(Overlapped)
      • Overlapped I/O + IOCP (IOCP)

    3. Non blocking 개념
    4. Todo
      • Unix network programming, W. Richard Stevens
      • MFC
      • 소스 분석

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  3. Network game architecture
  4. 네트워크 게임 튜터리얼 2 - 아키텍트 돋는 첫걸음

    1. Network architecture
      • C/S
      • P2P
      • Player 수 증가에 따른 복잡도 증가(O(n*n)), NAT, session migration 등 어려운 문제가 존재.

      • C/S vs P2P

    2. Network architecture case analysis
      • packet analysis tools
        • netstat
        • TCPView
        • WireShark
      • C/S example: poker game
      • 여러대의 서버가 sign in process, game lobby, in-game 등 역할을 나눠 각 process를 담당. 이외에

        • 서버간 통신을 담당하는 서버
        • 어떤 서버로 연결할지 알려주는 서버
        등이 필요.

      • P2P example: Battle.net
        • 세션 마이그레이션: P2P 연결에서 host가 나갔을 때, host를 옮기는 과정.
        • 유저 간 정보 교환은 UDP로.

    3. Hole punching
    4. NAT(Network Address Translator=공유기) 뒤에 있는 peer의 IP는 실제 IP가 아니기 때문에 server가 될 수 없음. 이를 해결하기 위해 hole punching 기법 사용.

    5. To do
    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  5. DB와 server 연결하기
  6. 네트워크 게임 튜터리얼 3 - 데이터베이스 그리고 C/S DB에 들어가는 내용

    • 유저 관련 정보: 가입, 탈퇴, 로그인, 친구, 기타등등..
    • 게임 컨텐츠: 레벨, 경험치, 아이템, 공격력...
    • 인벤토리: 아이템, 수량, 돈...
    • 몬스터 정보: 경험치, 레벨, 공격력..
    • 사용자 패턴 정보
    • 그 외 '정보'라 할만한 모든 것
    DB
    웹서버 -------- 게임서버    DB가 웹서버와 게임 서버를 연결하는 역할
                
    1. DBMS 기초
    2. Winsock 과 ADO를 사용한 채팅 시스템
      1. DB 설계
      2. DB를 프로그램에 연결
      3. packet 설계
      4. 패킷 검출용 CGeneric class를 만들고 다른 패킷들은 이 클래스를 상속. DWORD head를 통해 패킷의 종류를 판별. 실제로 패킷을 전송 시엔 CDataMessage라는 버퍼용 클래스로 패킷을 감싸고 패킷의 크기는 버퍼클래스의 앞부분 4비트를 통해 표시.

    3. To do
      • 소스코드 분석
      • MySQL 문법 확인
    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  7. 로비 서버 만들기 -들어가기에 앞서: 객체의 생명주기, serialization, packet generator 등
  8. 네트워크 게임 튜터리얼 4 - 로비, 그리고 할말이 많다

    1. C/S의 생명주기
    2. 출처: http://www.gamedevforever.com/ 게임 서버는 Patch server, load balance server, lobby server, game server 등 분산 서버 구조를 이루고 있는데, 필요한 객체 생성 및 초기화 등은 이를 담당하는 서버에서 처리를 해야하고 lobby server는 lobby, game server는 game 등 자신이 담당한 역할에 집중할 수 있게 설계해야함.

    3. Lobby server 제작
      • Serialization
        • XML
        • 텍스트 기반으로 이뤄진 자료구조. 사람이 읽기 쉽지만 너무 커서 게임 서버에서는 잘 쓰지 않음. 멀티플랫폼 사용 가능

        • Protocol Buffer
        • 구글에서 만든 serialization protocol. 몇몇 기본 자료형과 string 만 보낼 수 있는 등 제약이 있음

        • JSON
        • Java script 용으로 나온 경량 데이터 교환 포맷. 가벼움. 멀티 플랫폼 가능.

        • boost::serialization
        • 강력한 기능: STL collection을 그대로 serialization. C++ 단일 플랫폼에 대해 사용 가능.

      • Packet generator 패킷 생성기
      • IDL 컴파일러: filename.idl 파일을 만들고 정해진 형식에 따라 필요한 함수를 작성해놓으면 이를 바탕으로 자동으로 소스 코드를 만들어주는 외부 컴파일러. 프라우드넷 IDL 컴파일러 등

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  9. Serialization
  10. 네트워크 게임 튜터리얼 5 - 드디어 직렬화

    1. 패킷 정의
    2. 모든 패킷의 base class 패킷을 만들고 이를 상속하여 실제로 사용할 각 패킷을 작성. polymorphism과 overiding 기법을 사용.
    3. 각 유저를 구분하는 키는 string보다 int(혹은 long) 형이 성능 측면에서 유리함
    4. Boost.Acchive
      • Boost.Archive 클래스
      • 파일 스트림을 통해 파일에 읽고 쓸 수 있게 해주는 클래스. serialization을 담당하는 Boost.Serialize는 Boost.Archive 라는 유틸리티 클래스에 기반을 두고 있음. Archive는 serialize를 담당하는 text_oarchive 클래스와 deserialize를 담당하는 text_iarchive 클래스로 구분됨. 클래스 내부에 boost::archive::text_oarchive와 boost::archive::text_iarchive 형 객체를 선언하고 이를 통해 입출력 수행.

      • Boost.Serialize 클래스
      • 클래스 내부에 serialize 함수를 선언

    5. Asio.Serialization
      1. 패킷 클래스에 serialize 함수 추가
      2. serialization

    6. 더 해야할 것
      • 빌드 시 패킷 클래스에 자동으로 serialization 함수를 넣어주는 방법?
      • (위에 이어) 각 패킷 클래스별 수신 함수를 자동으로 만들어주는 방법?

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  11. 참고
  12. Chapter 64. Boost.Serialization