------

[ AD ] Port Monitor ( Try to use a Best WebSite Monitoring Tool )

------

제공: 한빛 네트워크
저자: 최흥배
이전기사:

함수 템플릿

두 값을 비교하는 함수를 만들어야 됩니다.

HP를 비교하는 두 개의 int 타입을 비교하는 Max라는 이름의 함수를 하나 만들었습니다.
int Max( int a, int b );

일을 다 끝낸 후 다음 기획서를 보니 캐릭터와 NPC가 전투를 하는 것을 구현해야 되는데
여기에는 경험치 비교하는 기능이 필요합니다.
구현해야 되는 것은 위에서 만든 Max 함수와 같습니다. 그래서 그것을 사용하였습니다.

< List 1 >

#include 
using namespace std;

int Max( int a, int b )
{
  return a > b ? a : b;
}

void main()
{
  int Char1_HP = 300;
  int Char2_HP = 400;
  int MaxCharHP = Max( Char1_HP, Char2_HP );
  cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl;
  
  float Char1_Exp = 250.0f;
  float Char2_Exp = 250.57f;
  float MaxCharExp = Max( Char1_Exp, Char2_Exp );
  cout << "경험치 중 가장 큰 값은" << MaxCharExp << "입니다." << endl << endl;
}
앗, 체력(HP)을 저장하는 변수의 타입은 int인데, 경험치 저장하는 변수의 타입은 int가 아닌 float 타입니다. 

 

당연하게 경험치를 비교하는 부분은 버그가 있습니다.
앞에 만들었던 Max와는 다르게 비교하는 변수의 타입이 float인 것이 필요하여 새로 만들었습니다.

< List 2 >
float Max( float a, float b )
{
  return a > b ? a : b;
}
함수 오버로딩에 의해 경험치를 비교할 때는 int 타입의 Max가 아닌 의 float 타입을 비교하는 Max가 호출되어 버그가 사라지게 되었습니다.

이제 경험치 비교는 끝나서 다음 기획서에 있는 것을 구현해야 합니다.

이번에는 을 비교하는 것이 있습니다. 그런데 돈을 저장하는 변수의 타입은 __int64입니다.
__int64는 비주얼 C++에서만 사용할 수 있는 64비트 정수 타입입니다.
__int64 타입을 비교하는 것은 앞에서 만든 int 타입의 Max나 float 타입의 Max로 할 수 없습니다.
함수에서 사용하는 변수의 타입만 다를 뿐 똑같은 것을 또 만들어야 됩니다.
__int64 Max(__int64 a, __int64 b )
{
  return a > b ? a : b;
}
현재까지만 하더라도 이미 똑같은 로직으로 구현된 함수를 3개나 만들었는데, 게임에서 사용하는 캐릭터의 정보는 HP, 경험치, 돈 이외에도 더 많습니다. 저는 앞으로 Max 함수를 몇 개 더 만들어야 할지 모릅니다.

Max 함수의 구현을 고쳐야 한다면 모든 Max 함수를 찾아야 합니다. 함수 오버로딩은 문제를 해결하지만, 코드가 커지고 유지보수는 어렵게 만듭니다.

프로그래밍에서 유지보수는 아주 중요합니다. 왜냐하면, 프로그래밍은 언제나 변경이 가해지기 때문입니다. 유지보수를 편하게 하는 가장 간단한 방법은 유지보수 할 것을 줄이는 것입니다.

Max 함수를 하나로 만들고 싶습니다. 어떻게 해야 될까요?

앗, 혹시 모른다고요? 제가 이 앞에 템플릿에 대해 설명을 할 때 이런 말을 하지 않았나요?
'템플릿을 사용하면 타입에 제약을 받지 않는 로직을 기술 할 수 있습니다'
네, 템플릿을 사용하면 됩니다.

함수 템플릿 Max를 만들자

아래의 코드는 템플릿을 사용하여 Max 함수를 구현 한 것입니다.

< List 3 >
#include 
using namespace std;

// 템플릿으로 만든 값을 비교하는 Max 함수
template 
T Max(T a, T b )
{
  return a > b ? a : b;
}


void main()
{
  int Char1_HP = 300;
  int Char2_HP = 400;
  int MaxCharHP = Max( Char1_HP, Char2_HP );
  cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl;
  
  float Char1_Exp = 250.0f;
  float Char2_Exp = 250.57f;
  float MaxCharExp = Max( Char1_Exp, Char2_Exp );
  cout << "경험치 중 가장 큰 값은" << MaxCharExp << "입니다." << endl << endl;
}
실행한 결과는 다음과 같습니다. 

 

네 이번에는 경험치 비교가 정확하게 이루어졌습니다.
템플릿을 사용하게 되어 이제는 불필요한 Max 함수를 만들지 않아도 됩니다..

<List 3> 코드에서 template으로 만든 함수를 '함수 템플릿'이라고 합니다.



함수 템플릿을 정의하는 방법은 아래와 같습니다. 

 

...

함수 템플릿과 컴파일

하나의 Max 함수 템플릿을 만들었는데 어떻게 int 타입의 Max와 float 타입의 Max를 사용할 수 있을까요? 비밀은 컴파일하는 과정에 있습니다. 컴파일할 때 템플릿으로 만든 것은 템플릿으로 만든 함수를 호출하는 부분에서 평가합니다. 가상 함수처럼 실행시간에 평가하는 것이 아닙니다.

컴파일을 할 때(compile time) 함수 템플릿을 평가하므로 프로그램의 성능에 해가 되는 것은 없습니다.

...




  • About STL : C++ STL 프로그래밍(2-2)
  • About STL : C++ STL 프로그래밍(3)
  • About STL : C++ STL 프로그래밍(4)
  • About STL : C++ STL 프로그래밍(5-1)
  • About STL : C++ STL 프로그래밍(5-2)
  • About STL : C++ STL 프로그래밍(6)
  • About STL : C++ STL 프로그래밍(7)
  • About STL : C++ STL 프로그래밍(8)
  • About STL : C++ STL 프로그래밍(9)
  • About STL : C++ STL 프로그래밍(10)
  • #include 
    using namespace std;
    
    /*
    int Max( int a, int b )
    {
      return a > b ? a : b;
    }
    float Max( float a, float b )
    {
      return a > b ? a : b;
    }
    
    __int64 Max(__int64 a, __int64 b )
    {
      return a > b ? a : b;
    }
    */
    template  T Max( T a, T b)
    {
    	return a>b ? a : b;
    }
    
    void main()
    {
      int Char1_HP = 300;
      int Char2_HP = 400;
      int MaxCharHP = Max( Char1_HP, Char2_HP );
      cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl;
      
      float Char1_Exp = 250.0f;
      float Char2_Exp = 250.57f;
      float MaxCharExp = Max( Char1_Exp, Char2_Exp );
      cout << "경험치 중 가장 큰 값은" << MaxCharExp << "입니다." << endl << endl;
    }
    

    Max 함수 템플릿에 개선점이 없을까요?

    힌트를 드린다면 Max의 두 인자 값은 함수 내부에서 변경되지 않습니다. 그리고 인자의 타입은 C++의
    기본형뿐만이 아닌 크기가 큰 타입을 사용할 수도 있습니다.
    생각나셨나요? C++ 기초 공부를 차근차근 쌓아 올린 분이라면 알아차렸으리라 생각합니다.
    정답은 Max 함수 템플릿을 만들 때 템플릿의 인자에 const와 참조를 사용하는 것입니다. Max 함수는 함수의 내부에서 함수의 인자를 변경하지 않습니다. 그러니 함수에 const를 사용하여
    내부에서 변경하는 것을 명시적으로 막고 Max 함수를 사용하는 사람에게 알리는 역할을 합니다.
    C++에서 함수 인자의 전달을 빠르게 하는 방법은 참조로 전달하는 것입니다.
    위의 Max 함수는 int나 float 같은 크기가 작은 타입을 사용하였기 때문에 참조로 전달하는 것이
    큰 의미는 없지만, 만약 구조체나 클래스로 만들어진 크기가 큰 변수를 사용할 때는 참조로 전달하는 것이
    훨씬 빠릅니다. 앞에 만든 Max 함수 템플릿을 const와 참조를 사용하는 것으로 바꾸어 보았습니다.
    template <typename T> const T& Max(const T& a, const T& b ) { return a > b ? a : b; }

    함수 템플릿의 전문화 라는 것이 있습니다.

    Max(int, double)을 사용하면 Max 함수 템플릿이 아닌 이것에 맞는, 특별하게 만든 함수를 사용하도록 합니다. 함수 템플릿의 전문화(Specialization)라는 특별한 상황에 맞는 함수를 만들면 함수 오버로드와 같이 컴파일러가 상황에 맞는 함수를 선택하도록 합니다.

    < List 8 >
    #include 
    using namespace std;
    
    // 템플릿으로만든값을비교하는Max 함수
    template <typename T1, typename T2> 
    const T1& Max(const T1& a, const T2& b )
    {
      cout << "Max(const T& a, const T& b) 템플릿 버전 사용" << endl;
      return a > b ? a : b;
    }
    
    // 전문화시킨Max 함수
    template <> 
    const double& Max(const double& a, const double& b)
    {
      cout << "Max(const double& a, const double& b) 전문화 버전 사용" << endl;
      return a > b ? a : b;
    }
    
    void main()
    {
      double Char1_MP = 300;
      double Char1_SP = 400.25;
      double MaxValue1 = Max( Char1_MP, Char1_SP );
      cout << "MP와 SP 중 가장 큰 값은" << MaxValue1 << "입니다." << endl << endl;
      
      int Char2_MP = 300;
      double Char2_SP = 400.25; 
      double MaxValue2 = Max( Char2_MP, Char2_SP );
      cout << "MP와 SP 중 가장 큰 값은" << MaxValue2 << "입니다." << endl << endl;
    }
    위 코드를 실행한 결과는 아래와 같습니다. 

    '온라인게임 > stl' 카테고리의 다른 글

    Standard Template Library (STL), 1 of n  (0) 2010.10.07
    클래스 템플릿 2-2  (0) 2010.10.01
    STL이 무엇인지 알고 계십니까? 1  (0) 2010.10.01

    제공: 한빛 네트워크
    저자: 최흥배

    http://www.hanb.co.kr/network/view.html?bi_id=1563

    STL이 무엇인지 알고 계십니까?

    STL은 C++ 언어의 '표준 템플릿 라이브러리 (Standard Template Library) '의 약자입니다.

    STL을 자료구조와 알고리즘 모음 라이브러리

    STL은  1993년 말 무렵에 Alex Stepanov가 C++ 언어의 창시자인 Bjarne Stroustrup에게 보여준 후
    준비 기간을 걸쳐서 1994년에 표준 위원회에 초안이 통과됩니다.

    참고로 C++ 표준은 1989년에 시작되어 1998년 9월에 마무리되었습니다.

    STL은 어떻게 만들었을까요?

    템플릿(Template)으로 만들어 진 것입니다.

    STL을 이해하려면 STL을 만들 수 있게 해준 C++의 템플릿에 대한 이해는 필수입니다.
    또, 템플릿은 C++를 더욱 강력하게 사용하는 데 꼭 필요합니다.

    C++ 언어를 공부한 사람은 템플릿에 대해 잘 알고 있을까요?


    1994년까지는 템플릿을 지원하는 C++ 컴파일러가 없었고, MS의 C++ 툴로 유명한 Visual C++도 버전 6에서는 템플릿을 완벽하게 지원하지 못했으면 Visual Studio .NET 2000 에서부터 제대로 지원을 하게 되었습니다(아직도 템플릿 기능을 100% 완벽하게 지원하지는 못합니다.).

    개인적으로 C 언어를 생각하면 포인터가 떠오르고, C++ 언어를 생각하면 클래스와 템플릿이 떠올라집니다.

    포인터는 처음 배울 때 문법적인 사용 방법이 잘 이해가 안 돼서 어려웠지만,
    클래스나 템플릿은 프로그램 설계와 관계된 것들이라 사상 부분을 이해하기 어려웠습니다.

    객체 지향 프로그래밍(OOP) C++

    C++ 언어를 소개할 때 가장 먼저 이야기하는 것이 객체지향이라는 것입니다.

    보통 C 언어를 배운 후 바로 이어서 C++를 배울 때는 객체 지향 프로그래밍(Object-Oriented Programming)에 대한 이해가 부족합니다. 그래서 C 언어로 프로그래밍할 때와 같은 절차 지향 프로그래밍을 하여 이른바 'C++를 가장한 C 프로그래밍'을 한다는 소리를 듣기도 합니다.

    C++ 언어로 객체 지향 프로그래밍을 할 수 있는 것은 C 언어에는 없는 클래스가 있기 때문입니다.

    [질문] C++로 할 수 있는 프로그래밍 스타일은 절차적 프로그래밍, 객체 지향 프로그래밍만 있을까요?
    [답] 아니오. Generic Programming 도 가능합니다.

    Generic Programming 이라는 것을 들어 보셨나요?

    책에서는 언제나 OOP 단어는 무수히 많이 보았지만, Generic Programming이라는 단어를 그 당시에 본 기억이 없습니다. 제가 Generic Programming이라는 단어를 알게 된 것은 2001년 무렵입니다. C++ 언어를 공부한 지 거의 6년이 되어서야 알게 되었습니다.

    아마 지금 공부하시는 분들도 Generic Programming이라는 단어는 좀 생소할 것입니다.

    Generic Programming은 한국에서는 보통 '일반적 프로그래밍'이라고 이야기 합니다. 저도 처음에는 그렇게 들었습니다.

    그러나 이것은 잘못된 표현이지 않을까 생각합니다. 영어 사전을 보면 Generic 이라는 것은 '총칭(總稱)적인' 이라는 뜻도 있는데 이것이 '일반적'이라는 단어보다 더 확실하며 제가 2004년에 일본에서 구입한 "C++ 설계와 진화(Bjarne Stroustrup 저)"라는 일본 번역서에도 Generic은 총칭으로 표기하고 있습니다.

    그럼 Generic Programming은 무엇일까요?

    네이버 사전에서 Generic 이라는 단어를 검색하면,

    3【문법】 총칭적인
    the generic singular 총칭 단수 《보기:The cow is an animal.》

    라는 부분이 있습니다. 보기의 영문을 저의 짧은 영어 실력으로 번역을 하면 '암소는 동물이다' 입니다. 소는 분명히 고양이나 개와는 다른 동물이지만 '동물'이라는 것으로 총칭할 수 있습니다.

    대체 C++언어에서 무엇을 '총칭'화 할까요?

    제가 만드는 프로그램은 Windows 플랫폼에서 실행되는 '온라인 게임 서버' 프로그램입니다.

    온라인 게임 서버를 만들 때는 어떤 기능이 있어야 되는가를 정한 후 클래스를 만듭니다.

    클래스는 아시는 바와 같이 멤버 변수와 멤버 함수로 이루어져 있습니다.
    그리고 멤버 함수도 그 내용은 저의 생각에 의해 변수들이 조작으로 되어 있습니다.

    '암소는 동물이다'라는 식으로 C++ 언어에서 총칭을 하는 것은 변수의 타입(type)을 총칭화 하는 것입니다.
    • 템플릿을 이용하면 총칭화된 타입을 사용하는 클래스와 함수를 만들 수 있습니다.
    • 템플릿을 사용하면 타입에 제약을 받지 않는 로직을 기술 할 수 있습니다.
    • Generic Programming을 하기 위해서는 템플릿이 꼭 필요합니다.
    STL이 무엇으로 만들어졌나요? 네 템플릿으로 만들어졌습니다.
    STL은 Generic Programming으로 만들어진 가장 대표적인 예입니다.

    긴 설명은 그만하고 코드를 볼까요?

    제 나름대로 템플릿을 이해하는 데 도움이 되었으면 해서 이런저런 이야기를 했는데 과연 도움이 되었는지 모르겠네요. 아마 설명만 듣고서는 템플릿에 대해 명확하게 이해를 하지 못하리라 생각합니다. 우리 프로그래머들은 정확하게 이해하려면 코드를 봐야겠죠? 템플릿은 크게 함수 템플릿과 클래스 템플릿으로 나눌 수 있습니다.

    다음 시간에는 함수 템플릿에 대해서 이야기하겠습니다.


  • About STL : C++ STL 프로그래밍(2-1)
  • About STL : C++ STL 프로그래밍(2-2)
  • About STL : C++ STL 프로그래밍(3)
  • About STL : C++ STL 프로그래밍(4)
  • About STL : C++ STL 프로그래밍(5-1)
  • About STL : C++ STL 프로그래밍(5-2)
  • About STL : C++ STL 프로그래밍(6)
  • About STL : C++ STL 프로그래밍(7)
  • About STL : C++ STL 프로그래밍(8)
  • About STL : C++ STL 프로그래밍(9)
  • About STL : C++ STL 프로그래밍(10)
  • '온라인게임 > stl' 카테고리의 다른 글

    Standard Template Library (STL), 1 of n  (0) 2010.10.07
    클래스 템플릿 2-2  (0) 2010.10.01
    함수 템플릿 Template 2-1  (0) 2010.10.01
    가족이나 친구의 도움을 받으라
    매일 하던일을 계속하라
    운동을 충분히 하라
    카페인이나 알코올의 과다섭치를 피하라
    충분한 휴식을 취하라

    205




    사용 법

    Photofiltre로 광각 왜곡사진 보정하기

    http://goo.gl/l9P9

    HTML
    Touch button
    

    CSS :
    .btn {
       text-indent: -9999px;
       display: block;
       width: 200px; /* 버튼 넓이 */
       height: 50px; /* 버튼 높이 */
       background: transparent url(img/button.png) no-repeat;
    }
    .btn:active {
       background: transparent url(img/button_press.png) no-repeat;
    }
    
    

    jQuery(JS)
    .btn { /* 위와동일 */
       text-indent: -9999px;
       display: block;
       width: 200px;
       height: 50px;
       background: transparent url(img/button.png) no-repeat;
    }
    .btn.active { /* :active를 .active로 수정 */
       background: transparent url(img/button_press.png) no-repeat;
    }
    
    

    http://goo.gl/86fR  WebDevMobile 웹 개발 모바일
    안드로이드 샘플 예제인 Snake가 키보드로만 제어가 된다?

    스마트폰에서는 어떻게 하지? 헐~~~

    디자이어에서 할려고 하니...
      1) 버튼을 달까  
      2) 아침 터치 좌표값을 받아서 현재 위치랑 비교해서 변환해서 할까?

    흠...

    Snake 터치 버튼 추가

    수정하기...

    흠..


    레이아웃
    
    	
    	
    		
    		 
    			
    						
    			
    			
    				
    	
    	
    		
    		
    	
    
    
    메인 Activity
    implements OnClickListener  {
    
    
    
            // 방향키
            ImageView up = (ImageView)findViewById(R.id.buttonU);
            up.setOnClickListener(this);
            ImageView dn = (ImageView)findViewById(R.id.buttonD);
            dn.setOnClickListener(this);
            ImageView left = (ImageView)findViewById(R.id.buttonL);
            left.setOnClickListener(this);
            ImageView right = (ImageView)findViewById(R.id.buttonR);
            right.setOnClickListener(this);
    
    
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		if ( mSnakeView.getMode() !=SnakeView.RUNNING ) return;
    		switch( v.getId() )
    		{
    		case R.id.buttonL:
    			Log.d(ICICLE_KEY,"onClick : R.id.buttonL"  );
    			
                if (mSnakeView.getDirection()!= SnakeView.EAST) {
                	mSnakeView.setmNextDirection( SnakeView.WEST );
                }
                
    			break;
    		case R.id.buttonR:
    			Log.d(ICICLE_KEY,"onClick : R.id.buttonR"  );
    			
                if (mSnakeView.getDirection()!= SnakeView.WEST) {
                	mSnakeView.setmNextDirection( SnakeView.EAST );
                }
                
    			break;
    
    		case R.id.buttonU:
    			Log.d(ICICLE_KEY,"onClick : R.id.buttonU"  );
    			
                if (mSnakeView.getDirection()!= SnakeView.SOUTH) {
                	mSnakeView.setmNextDirection( SnakeView.NORTH );
                }
      
    			break;
    		case R.id.buttonD:
    			Log.d(ICICLE_KEY,"onClick : R.id.buttonD"  );
                if (mSnakeView.getDirection()!= SnakeView.NORTH) {
                	mSnakeView.setmNextDirection( SnakeView.SOUTH );
                }
    
    			break;
    		}
    	}
    
    

    뷰 수정하기
    
    	public int getMode() {
    		return mMode;
    	}
    
    	public int getDirection() {
    		return mDirection;
    	}
    
    	public void setDirection(int Direction) {
    		this.mDirection = Direction;
    	}
    
    	public int getNextDirection() {
    		return mNextDirection;
    	}
    
    	public void setmNextDirection(int NextDirection) {
    		this.mNextDirection = NextDirection;
    	}
    
    


     Hi all.

    I develop an android application for Galaxy S that use UrlConnection for incomming stream connection.

    Here is my my code:
    public static InputStream getInputStream(String path) throws Exception {
                URL aURL = new URL(path);
                URLConnection conn = aURL.openConnection();            
                conn.connect();
                InputStream is = conn.getInputStream();
                return is;
    }

    That code worked properly during application session, but sometimes it generates exception
    java.net.UnknownHostException: Host is unresolved: www.myserver.com:80
            at java.net.Socket.connect(Socket.java:1037)
            at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
            at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool.getHttpConnection(HttpConnectionManager.java:145)
            at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager.getConnection(HttpConnectionManager.java:67)
            at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getHTTPConnection(HttpURLConnection.java:821)
            at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:807)
            at DownloadService.getInputStream(DownloadService.java:496)

    I can repeat this bug on device and on emulator. 


    PS
    Here is another code that also throws those exception
    public static InputStream getInputStream(String path) throws Exception {
                InputStream is = new URI(path).toURL().openStream();
                return is;
    }
    HTML 5 규격 과 특징 ( 샘플 코드 ) in BADA / Webkit

    HTML5는 

    그것의 특징들은 HTML, CSS, DOM과 JavaScript을 기반을 두고 있고
    외부 플러그인을 위한 필요한것들을 감소 시키며 ,
    더 나은 에러 처리, 스크립을 감소 시켜주는 더 많은 마크업,
    장치에 비의존적 ,
    개발 과정이 눈으로 확인하며 공개
     

    How HTML5 makes easy?

    HTML5 makes easy because its features are based on HTML, CSS, DOM, and JavaScript, reduces the need for external plug-ins (like Flash), better error handling, more markup to replace scripting , device independent, the development process should be visible to the public


    새로운 특징

    - 그리는 것을 위한 캔버스 요소
    - 미디어 실행을 위한 비디오 와 오디오 요소
    - 지연 비연결 저장소를 위한 더 나은 지원
    - 새로운 컨텐츠 특정 요소, 기사와 같이, 꼬리말, 머리말, nav, section
    - 새로운 폼 컨트롤, 달력과 같은 , 일자, 시간, 이메일, URL, 검색

    New Features
    •The canvas element for drawing
    •The video and audio elements for media playback
    •Better support for local offline storage
    •New content specific elements, like article, footer, header, nav, section
    •New form controls, like calendar, date, time, email, URL, search


    New Markup Elements

    Tag
    Description

    <article>
    For external content, like text from a news-article, blog, forum, or any other content from an external source
    <aside>
    For content aside from the content it is placed in. The aside content should be related to the surrounding content
    <command>
    A button, or a radio button, or a checkbox
    <details>
    For describing details about a document, or parts of a document
    <summary>
    A caption, or summary, inside the details element
    <figure>
    For grouping a section of stand-alone content, could be a video
    <figcaption>
    The caption of the figure section
    <footer>
    For a footer of a document or section, could include the name of the author, the date of the document, contact information, or copyright information
    <header>
    For an introduction of a document or section, could include navigation
    <hgroup>
    For a section of headings, using <h1> to <h6>, where the largest is the main heading of the section, and the others are sub-headings
    <mark>
    For text that should be highlighted
    <meter>
    For a measurement, used only if the maximum and minimum values are known
    <nav>
    For a section of navigation
    <progress>
    The state of a work in progress
    <ruby>
    For ruby annotation (Chinese notes or characters)
    <rt>
    For explanation of the ruby annotation
    <rp>
    What to show browsers that do not support the ruby element
    <section>
    For a section in a document. Such as chapters, headers, footers, or any other sections of the document
    <time>
    For defining a time or a date, or both
    <input type=’file’>
    file browsing


    New Media Elements 미디어 요소 / 오디오, 비디오

    Tag
    Description
    <audio>
    For multimedia content, sounds, music or other audio streams
    <video>
    For video content, such as a movie clip or other video streams
    <source>
    For media resources for media elements, defined inside video or audio elements
    <embed>
    For embedded content, such as a plug-in


    <VIDEO width="640" height="360" preload="none" controls>

    <SOURCE type="video/mp4" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" />
    <SOURCE type="video/webm" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.webm" />
    <SOURCE type="video/ogg" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.ogv" />

    <object width="640" height="384" type="application/x-shockwave-flash" data="/code/video_for_everybody/player.swf">

    <param name="movie" value="/code/video_for_everybody/player.swf" />
    <param name="flashvars"
    value="image=/code/video_for_everybody/poster.jpg&amp;file=http://clips.vorwaerts-mbh.de/big_buck_bunny.mp4" />
    <img src="/code/video_for_everybody/poster.jpg" width="640" height="360" alt="Big Buck Bunny"
    title="No video playback capabilities, please download the video below" />

    </object>

    The Canvas Elements / 캔버스

    Tag
    Description

    <canvas>
    For making graphics with a script

    <canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
    Your browser does not support the canvas element.
    </canvas>

    <input type="button" value="Create Graphics" onclick="draw();"/>
    <script type="text/javascript">
     function draw(){
        var canvas=document.getElementById("myCanvas");
        if(!canvas.getContext){return;}

        var ctx=canvas.getContext("2d");

        ctx.beginPath();
        ctx.arc(75,75,50,0,Math.PI*2,true); // Face 얼굴
        ctx.moveTo(110,75);

        ctx.arc(75,75,35,0,Math.PI,false); // Mouth
        ctx.moveTo(65,65);

        ctx.arc(60,65,5,0,Math.PI*2,true); // Left eye
        ctx.moveTo(95,65);

        ctx.arc(90,65,5,0,Math.PI*2,true); // Right eye
        ctx.stroke();}
    </script>


    New Form Elements

    Tag
    Description

    <datalist>
    A list of options for input values
    <keygen>
    Generate keys to authenticate users
    <output>
    For different types of output, such as output written by a script

    New Input Type Attribute values
    Tag

    Description
    tel
    The input value is of type telephone number
    search
    The input field is a search field
    url
    The input value is a URL
    email
    The input value is one or more email addresses
    datetime
    The input value is a date and/or time
    date
    The input value is a date
    month
    The input value is a month
    week
    The input value is a week
    time
    The input value is of type time
    datetime-local
    The input value is a local date/time
    number
    The input value is a number
    range
    The input value is a number in a given range
    color
    The input value is a hexadecimal color, like #FF8800

    <script type="text/javascript">
        function write_sum(){
          x=5;
          y=3;
          document.forms["sumform"]["sum"].value=x+y
        }
    </script>

    </head>

    <body bgcolor="#DEB887">
    <div style="overflow:scroll;height:400px;width:350px;">

    <article>
        <a href="http://blog.netscape.com/2007/12/28/end-of-support-for-netscape-web-browsers">
        Netscape is dead</a>
        <br />
         AOL has a long history on the internet, being one of
         the first companies to really get people online.....
    </article>

    <aside>
        <h4>Epcot Center</h4>
               The Epcot Center is a theme park in Disney World, Florida.
    </aside>

    <menu>
         <command type="command">Click Me!</command>
    </menu>

    <details>
           <summary>HTML 5</summary>
            This document teaches you everything you have to learn about HTML 5.
    </details>

    <figure>
        <h1>WWF</h1>
        <p>The World Wildlife Foundation was born in 1961...</p>
    </figure>

    <figure>
         <figcaption>WWF</figcaption>
         <p>The World Wildlife Foundation was born in 1961...</p>
    </figure>

    <footer>This document was written in 2009</footer>

    <header>
         <h1>Welcome to my homepage</h1>
         <p>My name is Donald Duck</p>
    </header>

    <hgroup>
         <h1>Welcome to my WWF</h1>
         <h2>For a living planet</h2>
    </hgroup>

    <p>Do not forget to buy <mark>milk</mark> today.</p>
         <meter min="0" max="10">2</meter><br />
          <meter>2 out of 10</meter><br />
         <meter>20%</meter>

    <nav>
         <a href="default.asp">Home</a>
         <a href="tag_meter.asp">Previous</a>
         <a href="tag_noscript.asp">Next</a>
    </nav>

    The object's downloading progress:
    <progress>
         <span id="objprogress">76</span>%
    </progress>

    <section>
         <h1>WWF</h1>
         <p>The World Wildlife Foundation was born in 1961...</p>
    </section>

    <p>We open at <time>10:00</time> every morning.</p>

    <p>I have a date on <time datetime="2008-02-14">Valentine’s day</time></p>

    <input list="cars" />
        <datalist id="cars">
            <option value="BMW">
            <option value="Ford">
            <option value="Volvo">
         </datalist>

    <form action="form_action.asp" method="get" name="sumform">
         <output name="sum"></output>
    </form>

    <keygen type="rsa"></keygen>
    </div>

    <body>
    </html>


    Geo-location using HTML5


    function showMap(position) {
         alert(position.coords.latitude, position.coords.longitude);
        document.getElementById('latitude').innerHTML = position.coords.latitude;
        document.getElementById('longitude').innerHTML = position.coords.longitude;
    }

    // One-shot position request.

    navigator.geolocation.getCurrentPosition(showMap);

    Web Storage
    •Local Storage - Stores data with no time limit
    •Session Storage - Stores data for one session

    Local Storage Method:
    Local Storage sets fields on the domain. Even when you close the browser, reopen it, and go back to the site. The values are stored in the local storage.

    Session Storage Method:
    The Session Storage sets fields on the window. When the window is closed, the session fields are lost, even if the site remains open in another window.

    Local Storage
    localStorage.lastname="Smith";
    document.write(localStorage.lastname);

    Session Storage
    sessionStorage.lastname="Smith";
    document.write(sessionStorage.lastname);




    Drag and Drop


    var eat = ['yum!', 'gulp', 'burp!', 'nom'];

    var yum = document.createElement('p');
    var msie = /*@cc_on!@*/0;
    yum.style.opacity = 1;
    var links = document.querySelectorAll('li > a'), el = null;

    for (var i = 0; i < links.length; i++) {
        el = links[i];
        el.setAttribute('draggable', 'true');
        addEvent(el, 'dragstart', function (e) {
        e.dataTransfer.effectAllowed = 'copy'; // only dropEffect='copy' will be dropable
        e.dataTransfer.setData('Text', this.id); // required otherwise doesn't work
    });
    }
    var bin = document.querySelector('#bin');

    addEvent(bin, 'dragover', function (e) {
        if (e.preventDefault) e.preventDefault(); // allows us to drop
        this.className = 'over';
        e.dataTransfer.dropEffect = 'copy';
        return false;
    });

    // to get IE to work
    addEvent(bin, 'dragenter', function (e) {
        this.className = 'over';
        return false;
    });

    addEvent(bin, 'dragleave', function () {
        this.className = '';
    });

    addEvent(bin, 'drop', function (e) {
        if (e.stopPropagation) e.stopPropagation(); // stops the browser from redirecting...why???
        var el = document.getElementById(e.dataTransfer.getData('Text'));
        el.parentNode.removeChild(el);
        // stupid nom text + fade effect
        bin.className = '';
        yum.innerHTML = eat[parseInt(Math.random() * eat.length)];


    var y = yum.cloneNode(true);
    bin.appendChild(y);

    setTimeout(function () {
        var t = setInterval(function () {
         if (y.style.opacity <= 0) {
            if (msie) { // don't bother with the animation
                y.style.display = 'none';
            }
            clearInterval(t);
          } else {
            y.style.opacity -= 0.1;
          }
         }, 50);
       }, 250);
       return false;
    });




    28910

    소셜 게임 세계에서 가장 흔히 들리는 말 중 하나는 작은 회사들이 많은 어려움에 처할 것이라는 것이다.

    Zynga와 Electronic Arts와 같이 큰 회사들과 싸우기에는 그들이 너무나 힘도 없고 자본도 없다는 이유에서다.

    이러한 논리를 뒷받침하기 위해서 흔히 사용되는 논리는 소셜 게임 회사들이 이미 내리막길을 가고 있다는 것이다. 2009년 연말에 성장폭이 가장 컸고, 2010년 봄에 정점을 지난 이후에 내리막길을 가고 있다고 한다.

    트래픽이 줄어들었다는 것은 기존의 회사들이 보다 많은 경쟁을 하기 시작했다는 것이고, 게임을 바이럴하게 판매하기 위해서 보다 적절한 전략이 필요하다는 것을 의미한다. 10억달러 이상을 증자하였고, 엄청난 일일 매출을 기록하고 있는 Zynga와 같은 회사들은 페이스북과 이미 좋은 관계를 가지고 있고, 작은 회사들이 경쟁하기에는 너무나도 버거운 상대이다.

    올초에 우리는 정말로 이러한 통설이 얼마나 정확한지 측정해보고자했다. 이러한 걱정이 있는 이유는 명확했다. 바로 Zynga의 트래픽 자체가 측정대로 사용되었기 때문이었다.

    8천 4백만명의 월 사용자(MAU), 3천 2백만명의 일 사용자(DAU)로부터
    6천 2백만명의 월 사용자, 그리고 1천 6백만명의 일 사용자로 줄어들었던 것이다.


    그리고, Zynga의 Roller Coaster Kingdom과 같은 작은 게임들은 폐쇄되기에 이르렀다.

    Farmville이 피크에서 내려온 것보다 더 안 좋은 소식은 Farmville에 견줄만한 성공을 거둔 회사가 없다는 사실이다. 2009년에 출시된 거대 타이틀들은 3천만명의 월사용자를 쉽게 돌파하였다. 2010년에 Zynga가 출시한 두 개의 타이틀인 FrontierVille과 Treasure Isle은 2천만명 이상의 월 사용자를 기록했지만, 어떠한 회사도 이와 비슷하게 커지지 않았고, Treasure Isle의 사용자 수는 빠르게 줄어들었다.

    Zynga를 제외한 다른 회사에서 가장 많은 사용자를 기록한 게임은 Playdom의 Social City였고,
    1천2백6십만명의 월 사용자, 그리고 3백십만명의 일 가입자였다.
    이제 그 게임은 월 6백만명 이하의 월 사용자를 기록하고 있고, 일 663,823명의 일 사용자를 가지고 있다.

    이러한 데이터들은 소셜 게임에 대한 걱정을 끼치게 하였다. Zynga, Electronic Arts, CrowdStar과 Playdom은 모두 수익을 내고 있고, 자신들이 가지고 있는 사용자 기반을 자기들의 새로운 게임으로 쉽게 유입하고 있으며, 성장 없이도 그들은 지속적으로 살아남을 것이다. 하지만, 다른 회사들은 새로운 ‘성장’이 반드시 필요하다.



    성장에 대한 재고민

    소셜 게임 시장의 성장은 보다 거시적인 관점에서 바라볼 필요가 있다. 지난 달에 AppData Pro의 서비스를 개시하면, 우리는 보다 거시적인 시장의 흐름을 볼 수 있는 툴들을 개발해왔다. 우리의 새로운 툴 중 하나는 어떤 과거의 특정일의 상위 게임들을 볼 수 있는 기능이었고, 이는 2008년의 AppData까지 뒤져볼 수 있게끔 하였다. 새로운 툴을 이용하여, 우리는 소셜 게임이 정체되어 있는 상황이라는 말이 틀렸다는 것을 쉽게 찾을 수 있었다.

    이는 쉽게 찾을 수 있는 것은 아니었다. 우리는 지난 9월 10일부터 일년간 매월 같은 날의 상위 250개 게임들을 보기 시작했다. 우리는 월 사용자가 아니라 일 사용자를 들여다보았다. 이는 월 사용자의 수치가 더 가치 있다는 것에 기반하였다.

    아래 그래프는 상위 250개 모든 게임의 성장을 보여준다. (우리는 의도적으로 세로축의 값을 제거했다.):

    위의 표에 의하면 실제로 소셜 게임 트래픽이 줄어들고 있다는 것이 맞다는 것이 입증된다. 2월달에 정점을 지나 7개월만에 1억1천3백만명의 일사용자로 18%가량 하락했다 – 성장해야할 시장에 썩 좋은 신호는 아니다.

    하지만, 성장은 다른 곳에서 발견이 된다. 다른 관점으로 보기 위해서 가입자가 가장 많은 5개 회사들의 게임을 제거했다 – 해당 5개 회사는 Zynga, Electronic Arts, CrowdStar, Playdom과 RockYou이다. 이를 제거하자 175개 게임으로 줄어들었다. 그러자 다음 그래프에서 Digital Chocolate과 Wooga와 같은 중소회사들의 성장을 목격할 수 있었다.

    위 표에서 보이듯이, 12월달에 정점을 지난 이후에 5월달에 빠진 후에, 다시 회복세를 보이고 있다. 상위 5개 회사를 제외하고 다른 회사들에게 9월달은 최고의 달이 될 것이다.

    여기에서 주목해야할 점은 십여명의 개발사들이 만든 175개의 게임들이 Zynga를 포함한 다섯 개 회사들의 DAU의 63%를 차지한다는 것이다. 하지만, 대부분의 이러한 작은 게임들은 자체적으로 생존할 수 있을 것이다. 9월달에 우리가 측정한 게임 중에서 가장 작은 일사용자를 기록한 게임은 3만 8천명이었고, 평균은 이에 비해 약 3배 가량 높았다.

    이러한 성장은 시기가 적합하고 실행에 잘 옮겨진 등 복합적인 이유에서 이루어지고 있다. 몇 개의 큰 타이틀은 자체적으로 백만명 이상의 일사용자를 끌어들인다. Kingdoms of Camelot, Family Feud, Baking Life, Millionaire City와 Mall World가 좋은 일례이다.

    이러한 반면 오래되어 가입자가 지속적으로 줄어드는 FarmVille의 모체인 FarmTown과 같은 게임도 있다. 하지만, 현 상황에서 줄어들고 있는 게임보다는 늘어나고 있는 게임들이 더 많다.

    마지막으로 우리가 스스로 질문한 것은 Baking Life라던지 Millionaire City와 같은 큰 히트들을 제거하면 그래프가 어떻게 보일 것인가였다. 주목을 받고 있지 않은 인디게임 개발사들은 잘 하고 있는 것인가?

    아래 표에서 보듯이 작은 개발사들이 만든 작은 게임들이 가장 잘 되고 있다. 위의 175개 게임에서 상위 50개 게임을 제거하자, 125개 게임이 되었는데, 이들은 모두 20만명의 일 사용자 이상을 가지고 있지는 않았다.

    위에서 보듯이 이러한 작은 게임들이 페이스북의 새로운 트랜드라 할 수 있다. 첫 달인 2009년 10월달의 샘플은 훨씬 작았을 뿐만 아니라, 대부분의 게임들은 다른 성공한 게임을 베낀 것일 뿐이었다.

    이제는 보다 다양한 소셜 게임들이 존재한다.

    궁금하다면,  Lucky Train, Ameba Pico나 Chocolatier와 같은 게임을 한 번 해보기 바란다.


    결론

    페이스북은 성공하기 쉬운 플랫폼은 분명 아니다 – 하지만 일부는 성공을 거두고 있다.

    2009년 연말부터 2010년 봄 사이에 우리는 페이스북이 폭발적으로 늘어나는 것을 보았고, 이는
    통제되지 않은 바이럴한 채널과 다소 의심스러운 마케팅 전술로 인한 것이었다.

    정상적으로 성장하고 있는 게임들이 묻히기도 했고, 소규모의 젊은 창업자들은 이전에 찾아볼 수 없는
    속도로 커지기도 했다.

    전례를 찾아보기 힘든 이러한 성장은 이제 어느 정도 사라졌다.

    하지만 봄이 지나 지속적으로 성장한 결과들을 우리는 위에서 찾아볼 수 있다.

    많은 작은 개발사들은 페이스북이 notification기능을 끈 이후에 오히려 더 잘 되고 있다는 얘기를 우리에게 해주었는 한편, 큰 회사들은 대부분 줄어들었거나 성장이 정체되었다고 말했다.

    이러한 작은 회사들이 현재 새로운 게임을 만드는데에 자신감이 충만해있다.

    하지만, 플랫폼 자체에 대한 두려움은 없어지지 않을 것이다. 가장 최근의 예는 새로운 피드로의 전환이다. 이는 작은 회사들이 정상적으로 크는 것을 막고 있고, 자본력이 있는 큰회사들이 광고에 돈을 쏟아부으면 유리하도록 바꾸었다.

    우리는 현재 보다 많은 회사들이 니치 시장을 공략하는 것을 볼 수 있다.

    대표적인 예로 Nightclub City라던지 Monster World를 들 수 있다.

    큰 회사들은 여전히 자기들이 중요하다고 생각하는 분야만 공략하고 있어,
    작은 창의적인 회사들이 살아남을 공간을 남겨두고 있다.

    앞으로 몇 주간 우리는 이러한 트렌드를 제속적으로 볼 것이다.

    우리의 Inside Virtual Goods 리포트 또한 한 번 보기 바란다.



    http://goo.gl/OaaP




    이제는 보다 다양한 소셜 게임들이 존재한다.

    궁금하다면,  Lucky Train, Ameba Pico나 Chocolatier와 같은 게임을 한 번 해보기 바란다.

    + Recent posts