2014년 5월 29일 목요일

TypeScript 특징

HTML5 Game Engine을 조사하던 차에 Turbulenz라는 곳에서
TypeScript를 사용해서 엔진을 개발했다고 해서 한번 찾아보게 되었음.
TypeScript는 Microsoft에서 개발 되어 공개되었고 type checking이 추가된 JavaScript의 superset이라 기존 JavaScript에 익숙하면 전이하기는 쉽고 TypeScript를 컴파일?한 결과물은 Javascript이므로 기존 Browser가 변경될 필요가 없다는게 특징이다.
OOP 개념을 가진 JavaScript 초보들에게는 좋을 수도....

다만 JavaScript의 subset이어서 기본 JavaScript library들을 사용하고자 할 경우 별도의 definition이 필요하다..

아래는 MS에서 공개한 TypeScript의 resource들이며
그 중 Tutorial을 먼저 보되 Simple Guide를 함께 보는게 편하겠음.
Specification은 120페이지라 필요할 때 보면 되고....


TypeScript
 : http://www.typescriptlang.org/
 : http://typescript.codeplex.com/

Simple Guide : http://www.typescriptlang.org/Handbook
Tutorial : http://www.typescriptlang.org/Tutorial
Language specification : http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

: TypeScript sample code

class Student {
    fullname : string;
    constructor(public firstname, public middleinitial, public lastname) {
        this.fullname = firstname + " " + middleinitial + " " + lastname;
    }
}

interface Person {
    firstname: string;
    lastname: string;
}

function greeter(person : Person) {
    return "Hello, " + person.firstname + " " + person.lastname;
}

var user = new Student("Jane", "M.", "User");

document.body.innerHTML = greeter(user);

[Type Script 특징]

보다보니 Simple Guide 중에서 아래와 같은 문구가 있음.

One of TypeScript's core principles is that type-checking focuses on the 'shape' that values have. This is sometimes called "duck typing" or "structural subtyping". In TypeScript, interfaces fill the role of naming these types, and are a powerful way of defining contracts within your code as well as contracts with code outside of your project. 

TypeScript의 기본 원칙들 중 하나가 변수가 가진 값의 형태에 따라 type-checking을 하는 것이고 이를 duck typing, structural subtyping이라고 한다. 라고 하고 있어 근본적으로 JavaScript와 다른 점을 알 수 있음.


[TypeScript: First Impressions]
: http://tirania.org/blog/archive/2012/Oct-01.html

위에서 Miguel de Icaza께서 TypeScript에 대해서 정리한 글임. pros, cons를 통해서 특징을 살펴 볼 수 있음.
간단히 보면 쉽게 배울 수 있고 type checking으로 통한 장점을 수용할 수 있고 컴파일 결과물은 JavaScript 코드 이므로 기존 browser나 runtime을 변경할 필요가 없음. 다만 개발환경이 VisualStudio에 국한된 것은 단점 임.

 - Pros
  : Javascript의 superset으로 기존 쉽게 전이할 수 있음.
  : Apache License로 Open Source
  : Code deploy전 type assist와 error 확인이 가능
  : Extensive type inference을 통해 type checking의 장점과 함께 JavaScript의 dynamism의 지킬 수 있음.
  : Classes, interfaces의 사용과 visibility 향상
  : explicit construct의 사용의 장점 (장점을 Nice syntactic sugar reduces boilerplate code 라 표현함)
  : TypeScript는 Node.JS pacakage로서 배포되므로 Linux, MacOS에서도 설치 가능
  : TypeScript는 compile time이나 server side에 적용되므로 code 실행을 위해 기존 browser나 runtime이 수정될 필요는 없음.

 - Cons
  : 사실상 Web은 Unix 기반이다.
  : 대부분 개발자들은 MacOS, Linux 상에서 code를 작성하고 Linux server로 deploy한다.
    그러므로 위에서 말한 type checking의 장점 주는 적절한 tool은 현재 Visual Studio Professional만 존재하므로 Windows외 환경에서는 이점을 누릴 수 없음.


그외 Google Dart team member가 작성한 자세한 정리글이 있는데 reddit은 너무 보기 지겹다.. ㅜㅜ
http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/

그리고 TypeScript introduction video의 답글을 보면 꽤나 부정적임.. ㅎㅎㅎ
http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript


[TypeScript개발을 위해 필요한 것들]

[Compiler]

Visual Studio 2012용 설치 파일이 있어 설치하면 editor, compiler가 설치된다.
그외에는 Node.js package maanger를 통해서 설치할 수 있다고 하는데 안해봤음.

그리고 Visual Studio 2013 Update 2가 설치되어 있다면 기본으로 깔려 있으나
재미있는건 Visual Studio 2013 Update 2가 아니라면
아래 링크의 TypeScript 1.0 Tools를 설치해도 VS2013에서는 메뉴가 나타나지 않는다.

TypeScript 1.0 Tools for Visual Studio 2012
: http://visualstudiogallery.msdn.microsoft.com/fa041d2d-5d77-494b-b0ba-8b4550792b4d
: http://www.microsoft.com/en-us/download/details.aspx?id=34790

[Editors]
- Visual Studio 2012, 2013
- Vi, Emacs
 : http://msopentech.com/blog/2012/10/01/sublime-text-vi-emacs-typescript-enabled/

2014년 5월 28일 수요일

HTML5, JavaScript based Game Engines, Platforms

솔직히 모두 다 사용하지 않았고 game 관련 일을 하지 않으니 뭐가 대중성이 있고 사용성, feature가 좋은지 모르겠어서 아래 간략 정리표에서 눈에 띄는 것만 서치해서 적어봄.
그렇게 정리하다보니 대부분 game engine에 대한 documentation이 제대로 되어 있지 않아 주로 CocoonJS, Turbulenz에 대해서만 자세히 씀.

특이한것은 Turbulenz는 나름대로 자신들의 HTML5 게임 publishing을 제공하고 있다는 것과CocoonJS는 PhoneGap과 같지만 HTML5 게임에 특화되어 여러 모바일에서 HTML5 게임 실행을 가능하게 해준다는 것이다. (어떻게 보면 CocoonJS는 Game Engine 보다는 launcher의 개념이 맞을 듯)

CocoonJS 기반 앱에서 HTML5 game을 돌리는 건 생각보다 Quality가 좋았음. 아무래도 HTML5 feature들이 optimization이 잘 되어 있는 듯 하다. 다만 Apacha codova 기반으로 돌리다보니 여러 platform으로의 배포는 좋겠지만 앱 자체가 무거워질 수 밖에 없는 것은 단점일 듯.

Turbulenz의 게임들은 desktop Chrome에서는 동작이 되지만 FireFox, IE11에서는 동작이 안되는 앱들이 꽤 있었다. Game Engine을 설치해도 동작에 큰 도움이 되진 않는 것으로 보였다.
Mobile browser중 Chrome, Safari는 WebGL이 지원이 안되 실행이 불가능했고 그나마 FireFox 가 가장 동작이 되었고 기본 Android Browser도 일부 실행은 되었지만 touch가 먹지 않았음. (Developer Client를 설치해도 마찬가지...)


[HTML5, Javascript 기반 Game Engine들]
http://designzum.com/2014/03/29/best-html5-and-javascript-gamen-engine-libraries/

HTML5 Game Engine들 간략 정리표
http://html5gameengine.com/



HTML5 game 개발 관련 링크들 정리(Indie HTML5 game development)
: https://devcharm.com/pages/78-indie-html5-game-development

HTML5 Game App 개발 및 이슈, by 이창환(yich@dongguk.edu)
Game Engine에 대해서는  간략히 정리되어 있는 듯.
: http://www.slideshare.net/yich/html5-game-app-r2

Mobile browser의 HTML5 WebGL 3D graphics 지원 비교
: http://html5test.com/compare/browser/android-4.4/chromemobile-33/firefoxmobile-27/ios-7.0.html

근데 재미있는 것은 아래 Chrome 33(mobile)이 WebGL을 지원한다고 나와 있지만 실제 Galaxy S4로 측정해보면 안나오고 hidden flag를 켜야 함. (http://blog.laptopmag.com/how-to-enable-webgl-support-on-chrome-for-android)




[Construct2]



: http://en.wikipedia.org/wiki/Construct_(game_engine)
: cross platform 이며  IDE와 tool들을 제공하여
  초보자들도 쉽게 익히고 게임을 만들 수 있음.
  drap-and-drop 방식과 visual editor, behaviour-based logic system을 제공



- 홈피에서 제시하고 있는 features를 설명하는 문구들, 자세한건 읽어봐야 겠지만 문구들로 대략 감만 잡아보자... ㅜㅜ
 : Quick and Easy, Powerful Event System, Flexible Behaviors, Instant Preview, Stunning Visual Effects, Multiplatform Export, Easy Extensibility
- HTML5를 지원하는 browser를 대부분 지원하며 일반적인 major mobile browser들도 지원함.


[CocoonJS]

: https://www.ludei.com/cocoonjs/
: HTML5 app들이나 game들을 mobile기기들에서 test, accelerate, deploy, monetize할 수 있도록 하는 platform

- 사실 상 HTML5 게임에 특화되어 mobile 기기(iOS, Andorid, Windows mobile 등)에서 실행할 수 있도록 도와주는 역할. HTML5, Javascript game engine들로 구현된 game들을 CocoonJS를 사용하여 배포 가능함.
- iOS(5.0), Android(2.3+)에서 최적의 Canvas 2D, WebGL feature를 제공하고 HTML5 feature에 특화된 customized된 webview를 제공함.

[Architecture Overview]



  • Canvas+ : HTML5 API들의 subset을 포함하고 있음.
  • Webview+ : HTML5 app 개발을 위해 특화된 web view (단 Android 4.0 이상)
  • Apache Cordova : 다양한 OS(iOS, Android, Windows Phone 등)상에서의 deploy를 위해 사용하고 사용되는 Cordova는 Webview+를 기본 webview로 사용함.
  • System's Webview : 개발자가 원한다면 system webview를 사용가능
  • Extensions : In App purchases, Ads, Notification, Social extension, Google Play Games, Gamepad와 같은 Javascript extension들이 제공.
    • In App purchases: to add monetization support to your app game. Show me more
      • IAP는 publish될 platform의 IAP에 대한 interface임.
    • Ads extension: you can monetize with ads using this extension. Show me more
    • Notification: to add either push notifications or local notifications. Show me more
    • Social extension: to add facebook and social integration to your app/game. Show me more
    • Gamecenter: add gamecenter functionalities to your app.
    • Google Play Games: add google play games functionalities to your app either in iOS or Android.
    • Gamepad: Empower your games with gamepad support.

[devlopment, publish process]
https://www.ludei.com/cocoonjs/how-to-use/



1. HTML5 게임을 개발
2. Android, iOS에서 CocoonJS launcher app을 설치하여 테스트
3. HTML5 code를 cloud-based platform에 업로드 하면 결과물 생성

- 결과물은 zip 형태로 압축되어 제공됨
- 계정 등급에 따라서 컴파일 시간 제약이 있음.

[CocoonJS Launcher]



http://support.ludei.com/hc/en-us/articles/201048463-How-to-use
- Demo app들과 개발중인 HTML5 게임을 실제 device(iOS, Android)에서 실행해 볼 수 있고 디버깅도 가능함.

* ludei showcase 페이지에서 cocoonJS로 만들어진 게임들을 볼 수 있음.
* 생각보다 Demo game들의 Quality가 좋음.. 역시나 HTML5 featrure에 최적화가 잘 되어 있는 듯.


[Turbulenz]

: http://biz.turbulenz.com/home
: High quality HTML5 games를 대상으로 하며 개발사/개발자를 대상으로 hub를 제공하여 remote site에서 테스트를 하여 게임을 publish할 수 있도록 지원함. 아직 mobile 지원은 beta testing 중
- 2010년 $5M funding을 받아 2011년 출시됨. (https://angel.co/turbulenz)
- 2013년 Game Engine을 Open source 화 함.

[Platform Overview]



Turbulenz Platform은 개발자, 개발사가 게임을 publishing, monetizing을 가능하게 하는 server side infrastructure 형태의 구조
개발자, 개발사는 Turbulenz local server를 통해 게임을 개발.
Turbulenz Hub로 게임을 'Deploy'하여 remote environment에서 테스트 함.
Main Turbulenz game site로 'Publish'하여 clients(gamer)들이 game을 사용할 수 있게 함.


[Turbulenz products]

- Turbulenz Local Server
 : Turbulenz SDK의 일부, web server와 packaged API들을 제공함. 개별 컴터에서 실행 가능

- Turbulenz game site
 : Turbulenz website, 사용자들이 로그인, 게임 플레이, 다른 사용자들과 interaction이 가능

- Turbulenz Hub (https://hub.turbulenz.com)
 : 개발자/개발사에서 게임을 publish하기 전 테스트할 수 있는 환경

A visual guide to the Hub


[게임 개발 process]

- 개발자와 Artist들은 Turbulenz SDK의 tool을 사용하여 게임을 만든다.
- 개발사는 Turbulenz local server(SDK에 포함)를 통해 게임을 개발하고 테스트하여 외부에 delploy할 수준까지 만듬.
- 게임을 테스트를 위한 다양한 stage들(pre-alpha, alpha, beta) 마다 Turbulenz local server에서 Turbulenz Hub로 각 버전들을 'Deploy'한다.
- 성공적으로 version이 Deploy되면 개발사는 게임을 internal/external team들과 live environment(게임방 같은)에서 테스트 한다.
- 적당한 release candidate이 만들어진 경우 해당 버전을 Turbulenz Hub에서 main turbulenz game site로 'Publish'함.

http://docs.turbulenz.com/hub/user_guide.html


[Turbulenz Hub를 통해 개발자는...]

Testing Game with access control in a Staging server
- 자신의 게임을 Hub(remote 환경)에서 deploy하여 test 할 수 있음.
- Pre-Released game을 Trusted parties에게 사용할 수 있도록 할 수 있음.
- Self-Publishing을 위한 방법을 제공하여 publishing 전에 개발자 자신이 content를 생성하고 실행할 수 있음.
- Limited Access Preview Version publishing을 지원함.

Get online game execution's Metrics
- game을 실제 deploy된 환경과 같은 online에서 테스트 하여 performance, latency, distribution channel 등의 측정 정보(metric)를 획득할 수 있음.
- published된 game과 진행되는 test에 대한 측정 정보(metrics)들을 볼 수 있음.


[Hub에서 확인 가능한 Metrics]
  • Total Play Count
  • Average Play Duration (secs)
  • Total Play Duration (secs)
  • Total Sessions Completed
  • Daily Active Users (DAU)
  • Weekly Active Users (WAU)
  • Monthly Active Users (MAU)
  • Engagement Ratio (Weekly)
  • Engagement Ratio (Monthly)
  • Daily User Retention
  • Weekly User Retention
  • Monthly User Retention
  • Lifetime Total Users
  • Cumulative Daily Retention
  • Cumulative Weekly Retention
  • Cumulative Monthly Retention
  • Feed Add Count
  • Feed Reply Count
  • Followed Count
  • Unfollowed Count
  • Completed transactions
  • Daily Revenue (USD)
  • X Completed transactions
  • X Daily Revenue (USD)
  • Offering “X” Revenue (USD): 

[Game Engine's supporting Platforms and Browsers]
  • Windows (both 32 & 64-bit) XP / Vista / 7 / 8
    • IE 8, 9, 10
    • Firefox 3.6 and above
    • Chrome
  • Mac OS X 10.7 and above
    • Safari 6 and above
    • Firefox
    • Chrome
  • Linux (with WebGL support only)
    • Firefox
    • Chrome
  • Android
    • Chrome Beta
    • Firefox Beta
* 위에서 지원한다는 브라우저는 많지만 게임에서 사용하는 HTML5 feature에 따라 실행안되는 것도 많음.
* Android Browser, Android FireFox에서는 일부 demo 게임들이 돌아감. 하지만 Android Chrome이 WebGL을 지원하지 않아 게임 실행 불가
* iOS Safari가 WebGL을 지원하지 않아 게임 실행 불가


[Game Engine]

Runtime API들과 Offline tools로 구성됨.

Runtime API
- Low-level API
 : libraries(ex OpenAL, WebGL)의 interface, low leve hardware access(ex input mechanism, vector math operation)의 interface들로 구성되어 있음.
 : 하위 module(Device)
  . GraphicsDevice, MathDevice, PhysicsDevice, SoundDevice, NetworkDevice, InputDevice

- HIgh-level API : JavaScript libraries의 모음. Scene Graph, Material System, Forward, Deferred Renderers 등과 같은 feature들.
 : Features
  . Scene Graph, Amination, Resource Manager, Server Requests, Deferred Renderer, Forward Renderer, Default Renderer, Simple Renderer, 2D Rendering, Utilities



[Code skeleton]

Javascript, TypeScript(http://www.typescriptlang.org/)를 지원함.

<html>
<head>
    <title>Turbulenz - Getting Started Guide - API Example</title>
    <!-- Script includes go here -->
    <script src="jslib/debug.js"></script>
    <script src="jslib/webgl/turbulenzengine.js"></script>
    <script src="jslib/webgl/graphicsdevice.js"></script>
</head>
<body>
    <canvas id="canvas" width="640px" height="480px"/>
    <script>
        /* Game code goes here */

        TurbulenzEngine = WebGLTurbulenzEngine.create({
            canvas: document.getElementById("canvas")
        });

        var graphicsDevice = TurbulenzEngine.createGraphicsDevice({});

        var r = 1.0, g = 1.0, b = 0.0, a = 1.0;
        var bgColor = [r, g, b, a];

        function update() {
            /* Update code goes here */

            if (graphicsDevice.beginFrame())
            {
                graphicsDevice.clear(bgColor, 1.0);
                /* Rendering code goes here */

                graphicsDevice.endFrame();
            }
        }

        TurbulenzEngine.setInterval(update, 1000 / 60);
    </script>
</body>
</html>

3개의 javascript들을 include하고 'canvas' id를 가진 <canvas>에 game engine이 drawing을 함. 화면 rendering은 update() function내에서 처리 되어야 한다.


[Turbulenz Developer Client]

- Mobile 환경에서  Turbulenz HTML5 engine의 low-level component들을 사용하기 위해 필요한 native implementation.
- 개발된 게임을 mobile환경에서 다양한 app stores, platform services(payment, user notification 등) feature들 사용할 수 있게도 한다.
- Local server와 연동되어 게임을 테스트 해볼 수 있으나 실제 Android market으로 deploy하는 방법에 대해서는 나와 있지 않음.


[기타]

- Game Engine License : MIT license
 : https://github.com/turbulenz/turbulenz_engine/blob/master/LICENSE

- In app purchase를 위한 StoreManager Object를 제공함.
 : Game에서 item을 생성하고 User가 해당 item들을 basket에 등록하고 계산하는 flow.
 : Turbulenz에서 basket에 담기거나 구입된 item들을 관리하므로 내부적으로 store를 따로 구현할 필요 없고 StoreManager Object를 이용하면 됨.
 : 관련된것인지는 모르겠지만 Android Developer client의 경우 permission들 중 billing을 추가해야 함.




[Pixi.js]

pixi.js logo

http://www.pixijs.com/
https://github.com/GoodBoyDigital/pixi.js
: lightweight 2D library, WebGL을 지원해 hardware acceleration 가능 (지원 browser한)

Features
 - WebGL renderer (with automatic smart batching allowing for REALLY fast performance)
 - Canvas renderer (Fastest in town!)
 - Full scene graph
 - Super easy to use API (similar to the flash display list API)
 - Support for texture atlases
 - Asset loader / sprite sheet loader
 - Auto-detect which renderer should be used
 - Full Mouse and Multi-touch Interaction
 - Text
 - BitmapFont text
 - Multiline Text
 - Render Texture
 - Spine support
 - Primitive Drawing
 - Masking
 - Filters


[ImpactJS]



http://impactjs.com/
: web, mobile에서 동작하는 high performance 2D game들을 만들기 위한 JavaScript game framework.

- Impact Game Engine + Weltmeister Level Editor + Ejecta Framework for IPhone App Store
- GameEngine에서는 iPhone, modile device, desktop browser 로 client를 구분함.

[기타]
- License : Impact Commercial Software License Agreement
 : http://impactjs.com/impact-commercial-software-license-agreement

2014년 5월 22일 목요일

Tizen keypad에 ExpandableEditArea가 가려지지 않게 하는 방법

아래 내용은 Tizen 2.2 기반이라 상위 버전에서는 별 의미 없는 내용입니다.
---------------------------------------------------------------------------
Android 같은 경우 manifest에서 activity에 대해서 adjustPan, adjustResize 같은 option이 있어 자동으로 해결해 주지만 tizen의 form에서는 그렇지 않은것 같다. (아직 자동으로 form을 re-size 하게 하는 방법을 찾지 못함.)

keyboard의 event를 받아서 edit control를 수동으로 옮겨주는 방법을 사용해야 함.

: https://developer.tizen.org/dev-guide/2.2.1/org.tizen.native.appprogramming/html/tutorials/ui_tutorial/using_overlay_keypad_without_scroll.htm

Figure: Partially obscured edit field

위 방법으로는 화면상에서 virtual keypad가 표시되면 keypad의 height를 알아내서 입력하는 control(Edit control들)의 위치를 변경하는 방법이다.
즉 form 자체가 re-size되는게 아니라 keypad가 표시되면 keypad에 edit control이 가려지지 않도록 위치를 조정하는 방법임.

하다보니 좀 이상한게 있었는데
채팅창 처럼 입력 후 button을 클릭해야 한다면 해당 button도 keypad에 가려지지 않도록 위치도 조정을 해야 했었다. 하지만 직접 해보니 keypad생성 시 edit control과 함께 위치를 조정했지만 button이 클릭되지 않는 현상이 발생 ㅜㅜ 그래서 그냥 edit control만 keypad에 가려지지 않도록 하고 입력 후 back key를 눌러 keypad를 사라지게 한뒤 button 클릭 하게 하였음.


[ExpandableEditArea]

Expandable edit area

EditArea를 입력창으로 썼었는데 입력 시 전체화면에서 입력 하도록 전환이 되어 찾은 control임. 전체화면 입력을 사용하지 않고 입력창의 line같은 세부 설정이 가능함.

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/ui/implementing_exp_editarea.htm

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Ui_1_1Controls_1_1ExpandableEditArea.html

2014년 5월 14일 수요일

Tizen native app 개발 시 nine patched png 처리 이슈

아래 내용은 Tizen 2.2 기반이라 상위 버전에서는 별 의미 없는 내용입니다.
--------------------------------------------------------------------------- nine patch 적용된 png 파일을 사용하다보니
bitmap을 읽어오는 API에 따라서 nine patch image로 인식이 되지 않을 수 있어서 정리함.
(내가 방법을 모를지도..)

아래는 tizen 내부 저장소에서 그림을 읽어오는 sample code

result
MainForm::OnDraw(void)
{

// App resource(res/screen-density-xhigh)에서 나인패치 이미지 가져오는 예
// 하지만 이렇게 가져온 bitmap은 nine patch 로 인식 안됨 .
// false == pBitmap->IsNinePatchedBitmap()
// canvas->DrawNinePatchedBitmap() 시 에러메세지 발생

Bitmap* pBitmap = pAppResource->GetBitmapN(L"ninepatch.9.png");

// 아래는 App 영역내 data 폴더에 저장된 나인패치 이미지를 가져오는 예
// 이때는 정상적으로 인식됨.

Image image;
Bitmap* pBitmap = null;

image.Construct();
String filePath = App::GetInstance()->GetAppRootPath() + L"data/ninepatch.9.png";
pBitmap = image.DecodeN(filePath, BITMAP_PIXEL_FORMAT_ARGB8888, 100, 100);


Canvas* canvas = this->GetCanvasN(rect);
if (canvas != null)
{

r = canvas->DrawNinePatchedBitmap(Rectangle(0,0,100,100), *pBitmap);
AppLog("%d", r);

delete canvas;
}

Form::OnDraw();
}

2014년 5월 12일 월요일

Agile software development, 애자일 개발 방법 대충 정리

애자일의 애자도 모르면서 scrum 방법론 같은 것만 형식적으로 사용하다 보니
애자일에 대해서 많이 궁금했던 터라 개념, 철학을 한번 찾아 봄.

[Agile 정의]

먼저 사전적 정의는 다음과 같다..

http://dictionary.reference.com/browse/agile?s=t
ag·ile  [aj-uhl, -ahyl] adjective
1. quick and well-coordinated in movement; lithe: an agile leap.
2. active; lively: an agile person.
3. marked by an ability to think quickly; mentally acute or aware: She's 95 and still very agile.

http://endic.naver.com/enkrEntry.nhn?sLn=kr&entryId=6021a018893e48b6bbb505245a8f96f8&query=agile
형용사
1. 날렵한, 민첩한
2. (생각이) 재빠른, 기민한
  an agile mind/brain예문 발음듣기
  재빠른 생각[회전이 빠른 두뇌]


날렵한, 민첩한, 기민한...
뭔가 감이 오는가? 사실 스크럼 할때도 이런 단어들을 들었지만 별 감흥이 없었음.
좀 더 자세한 설명을 찾아보자

What is Agility? by Jim Highsmith
http://jimhighsmith.com/what-is-agility/


  • Agility is the ability to both create and respond to change in order to profit in a turbulent business environment.
  • Agility is the ability to balance flexibility and stability.


In an uncertain and turbulent world, success belongs to companies that have the capacity to create change, and maybe even chaos, for their competitors. Creating change disrupts competitors; responding to change guards against competitive thrusts. Creating change requires innovation: developing new products, creating new sales channels, reducing product development time, customizing products for increasingly smaller market segments.

위 article을 보면 급변하는 기업 비지니스 환경에서 변화를 이뤄내는 역량을 가지고 변화에 민첩하게 대응 하는 기업들은 경쟁에서 성공하며 이런 변화에는 여러 혁신들이 필요하다라는 설명을 하고 있음. 즉 Agility/Agile 하다라고 말하는 것은 비지니스 요구사항에 민첩하게  반응한다는 의미로 보임.

한글판 Wikipedia에서는 애자일 개발 방법론을 다음과 같이 표현하고 있다.

http://ko.wikipedia.org/wiki/%EC%95%A0%EC%9E%90%EC%9D%BC_%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EA%B0%9C%EB%B0%9C

애자일 개발 프로세스란 어느 특정 개발 방법론을 가리키는 말은 아니고 "애자일(Agile=기민한, 좋은것을 빠르고 낭비없게 만드는 것) 개발을 가능하게 해 주는 다양한 방법론 전체를 일컫는 말이다. 예전에는 애자일 개발 프로세스는 "경량(Lightweight)" 프로세스로 불렸다. 익스트림 프로그래밍 (XP:eXtreme Programming)이 애자일 개발 프로세스의 대표적인 방법이라 볼 수 있다


좀 더 나아가서 Agile software 개발 선언을 보자


[Manifesto for Agile Software Development]

http://agilemanifesto.org/iso/en/
http://agilemanifesto.org/iso/ko/

Manifesto for Agile Software Development

We are uncovering better ways of developing
software by doing it and helping others do it.
Through this work we have come to value:

Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan

공정과 도구보다 개인과 상호작용
포괄적인 문서보다 작동하는 소프트웨어
계약 협상보다 고객과의 협력

계획을 따르기보다 변화에 대응하기를

That is, while there is value in the items on
the right, we value the items on the left more.

Kent Beck, Mike BeedleArie van BennekumAlistair CockburnWard CunninghamMartin FowlerJames GrenningJim HighsmithAndrew HuntRon Jeffries
Jon KernBrian MarickRobert C. MartinSteve MellorKen SchwaberJeff SutherlandDave Thomas

© 2001, the above authors
this declaration may be freely copied in any form, 
but only in its entirety through this notice. 

선언문에서 오른쪽 굵은 글씨로 표시된 "개인과 상호작용", "작동하는 소프트웨어", "고객과의 협력", "변화에 대응" 하는것에 가치를 두고 있음.

[Principles behind the Agile Manifesto]
http://agilemanifesto.org/iso/en/principles.html
http://agilemanifesto.org/iso/ko/principles.html

애자일 선언 이면의 원칙들인데 너무 많아서 옮기는 것은 쉽지 않고 몇개만 옮겨 보면 다음과 같다. 모든 원칙들이 인상이 깊지만 아래 굵은 글씨의 것들이 참 인상적이다.

가치있는 소프트웨어를 전달하여 고객을 만족 시키는 것을 목적을 가지고
요구사항 변경에 수용할 수 있는 탄력적이고 반복적인 프로젝트 진행과
motivated individuals들로 구성된 self-organizing team을 구성하여 신뢰하고
불필요한 프로세스를 줄이고 합리적인 방법으로 프로젝트를 진행하는 원칙을 지키는 것 이게 핵심이 아닐까 생각 함.

우리의 최우선 순위는, 가치 있는 소프트웨어를 일찍 그리고 지속적으로 전달해서 고객을 만족시키는 것이다.
(Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.)

비록 개발의 후반부일지라도 요구사항 변경을 환영하라. 애자일 프로세스들은 변화를 활용해 고객의 경쟁력에 도움이 되게 한다.
(Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.)

동기가 부여된 개인들 중심으로 프로젝트를 구성하라. 그들이 필요로 하는 환경과 지원을 주고 그들이 일을 끝내리라고 신뢰하라.
(Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.)

작동하는 소프트웨어가 진척의 주된 척도이다.
(Working software is the primary measure of progress.)

단순성이 -- 안 하는 일의 양을 최대화하는 기술이 -- 필수적이다.
(Simplicity--the art of maximizing the amount of work not done--is essential.)

최고의 아키텍처, 요구사항, 설계는 자기 조직적인 팀에서 창발한다.
(The best architectures, requirements, and designs emerge from self-organizing teams.)



[Agile 철학]
http://en.wikipedia.org/wiki/Agile_software_development#Philosophy

사실 Agile 개발 방법론들이나 간단한 정의는 들어 봤으나 기반 철학에 대해서 궁금했었음. 영문 Wikipedia를 보면 다음과 같은 것들이 있음.


  • Adaptive vs. Predictive
  • Iterative vs. Waterfall
  • Code vs. Documentation


[Adaptive vs, Predictive]

해석은 제대로 못하겠으나 개발 방법론은 Predictive한 것 부터 Adaptive한것들이 존재하며 Agile 방법들은 Adaptive한 축에 속한다. 일정 수립에 있어서도 Rolling Wave 접근법으로 유연한 일정을 수립하여 변경을 수용할 수 있게 한다.
앞서 말한 predictive한 기존 SE 방법론들은 예상치 못한 risk들을 방지하고자 Risk management들을 수행하지만 plan 단계에서 이를 잘못할 경우 project 전개가 산으로 갈 수도 있음.
아래는 개발 방법론들을 비교한 도표..
Home grounds of different development methods
Agile methodsPlan-driven methodsFormal methods
Low criticalityHigh criticalityExtreme criticality
Senior developersJunior developers(?)Senior developers
Requirements change oftenRequirements do not change oftenLimited requirements, limited features see Wirth's law
Small number of developersLarge number of developersRequirements that can be modeled
Culture that responds to changeCulture that demands orderExtreme quality

[Iterative vs. Waterfall]
Waterfall의 단점은 많이 들어서.. Agile 방법론들은 iterative하며 대표적인 예는 Exterme Programming.

[Code vs. Documentation]

Scott Ambler states that documentation should be "Just Barely Good Enough" (JBGE),[21] that too much or comprehensive documentation would usually cause waste, and developers rarely trust detailed documentation because it's usually out of sync with codes,[20] while too little documentation may also cause problems for maintenance, communication, learning and knowledge sharing. 

위에서 말한듯이 documentation은 딱 필요한 만큼만 하는게 맞는 것 같다. 많은면 쓰레기와 다름없고 코드와 sync가 맞지 않은 경우가 다반사고 너무 적은 documentation은 나중에 유지보수나 코드와 관련된 대화, 이해가 어렵기 때문이다.

결과물로는 적당한? documentation과 동작하는 코드가 맞는것 같지만.. 적당함.. 어렵기는 하겠다.


그리고 Agile에서는 Self motivated team에 기반하고 있다는 것도 기본으로 알아야 할 사항이 아닐까 생각한다. 사실상 방법론들이나 회고 자체가 개선을 기반하여 있고 개선의 의지가 있는 팀이어야지만 가능할 것이니..



[Agile methods]

: http://en.wikipedia.org/wiki/Agile_software_development#Agile_methods

[Agile practices]

애자일 회고 : 최고의 팀을 만드는 애자일 기법

애자일 회고 : 최고의 팀을 만드는 애자일 기법
에스더 더비,다이애나 라센 공저/김경수 역 | 인사이트(insight) | 원제 : Agile Retrospectives :Making Good Teams Great
: http://www.yes24.com/24/goods/2813260?scode=032&OzSrank=1


애자일의 '애'자도 모르는 상태에서 이것저것 방법만 하다보니 회고에 대해서 많이 궁금했었음.
단지 스프린트 회고나 릴리즈, 프로젝트 회고에서는 그냥 별 느낌없이 시간만 보낸 듯 했고 관련 참고 글도 없었기에 도서관에서 인사이트의 애자일시리즈를 보자마자 골라서 보게 되었다.

김창준 님의 글(http://agile.egloos.com/4122099)에서도 나와 있듯이 회고의 다양한 방법에 대해서 소개하고 있고 개인적으로도 회고의 목적, 절차 방법들이 잘 정리되어 있어 좋았다.

개인적으로 소장하며 두고 보면 좋을 것 같은 정도로 괜찮은 방법들이 많았음.
아래는 책 보면서 동감하거나 느낀 점에 대해서 대충 적음.

- 다나가 진행한 회고의 구조는 다음과 같다.
1. 사전 준비를 한다.
2. 자료를 모은다.
3. 통찰을 이끌어 낸다.
4. 무엇을 할 지 결정한다.
5. 회고를 마무리한다.


... 그러니 절대로 사전 준비 단계를 건너뀌거나 시간을 줄이지 않기 바란다.

=> 사전 준비를 소흘히 했던것 같다. 단지 현황 정도만 있었고 Feeling, Finding에 대해서는 거의 생각하지 않았던 것 같다..


- 두 시간짜리 회고를 어떤 식을 진행하는지 알아보자.

. 사전 준비를 한다. 5%  6분
. 자료를 모은다. 30-50% 40분
. 통찰을 이끌어낸다. 20-30% 25분
. 무엇을 할지 결정한다. 15-20% 20분
. 회고를 끝낸다. 10% 12분
. 여유 시간 10-15% 17분

=> 일반적으로 한나절을 할 때가 많았던것 같다. 회고에서 다음 스프린트 백로그 도출까지 했으니..

- 활동은 다음과 같은 장점이 있다.
. 동등한 참여를 독려한다.
. 대화에 집중한다.
. 새로운 괌점을 장려한다.
 > 회고에서 유용하게 사용하는 활동으로는 브레인스토밍(Brainstorming), 점 투표(Voting with Dots), 체크인(Check-Ins), 짝 인터뷰(Pair Interviews)등이 있다.
=> 점 투표와 짝 인터뷰.. 팀원이 적당하면 재미있을 것 같다.

- 회고 진행자인 여러분이 가장 큰 책임을 느껴야 할 부분은 내용이 아니라 프로세스다. 프로세스라고 해서 뭔가 어려운 방법론을 이야기하는 것은 아니다. 여기서 말하는 프로세스는 수행할 활동을 꾸리고 집단역학(group dynamics)과 시간을 관리하는 것을 의미한다.
=> 아하! 집단역학 공부해야지..

(TODO) 집단역학 찾아보기..

- 그후 나도 회고를 진행할 때 체크인 활동을 수행했는데 크게 두가지 이점이 있었다. 분위기가 부드러워지는 것과 현재 사람들이 느끼는 감정을 알게 되어 회고를 어떻게 진행해야 할지 감을 잡을 수 있다는 점이다.
=> 나같은 진지남에게는.. 회의 진행 시 꼭 필요할 듯. 1. 질문 제시, 각자 대답, 2. 평가 덧붙이지 않기

- 브레인 스토밍 지침
. 많은 양을 얻으려 노력하라. 최고의 아이디어가 처음부터 나오는 경우는 거의 없다.
. 바보 같은지 아닌지 재단하지 말고 모든 아이디어를 내라.
. 터무니없고, 웃기고, 거칠고, 창의적이 되어라.
. 다른 사람들의 아이디어에 살을 붙여라.
. 판단하거나, 평가하거나, 비판하지 않는다. 거르는 것은 나중에 한다.
. 아이디어를 눈에 보이도록 기록하자.
=> 다아는 것 같으면서도 항상 잊어버리는...

나머지 괜찮은 방법들은 꽤 많아서.. 책 사서 두고 두고 볼것임...

2014년 5월 8일 목요일

Tizen app control

아래 내용은 Tizen 2.2 기반이라 상위 버전에서는 별 의미 없는 내용입니다.
--------------------------------------------------------------------------- Android intent와 유사하게 Tizen에서 다른 app을 실행하거나
처리결과를 받을 수 있도록 한 방법

app id나 app에 등록된 operation을 지정해서 실행 할 수 있음.
실행되는 app에서는 실행되고 있지 않을 경우 실행되면서 event를 받거나
실행중이면 바로 받게 된다.

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/app/app_controls.htm



AppControl class

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1App_1_1AppControl.html


[App 등록]
타 app이 사용할 실행을위한 operation을 등록하는 방법

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/app/exporting_appcontrol_functionality.htm

Application manifest에서
<Apps> -> <UiApp>  -> <AppControls> -> <AppControl> -> <Operation> 을 등록
<AppControls>
   <AppControl>
      <Operation>http://tizen.org/appcontrol/operation/view</Operation>
      <Uri>custom</Uri>
   </AppControl>
   <AppControl>
      <Operation>http://tizen.org/appcontrol/operation/view</Operation>
      <MimeType>image/jpeg</MimeType>
   </AppControl>
</AppControls>

event listener 등록

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/app/handling_appcontrol_request.htm



Tizen::App::IAppControlProviderEventListener  구현 후 OnAppInitializing()에서 등록

https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1App_1_1IAppControlProviderEventListener.html

* app이 실행될 때 마다 OnAppControlRequestReceived()가 계속 호출 된다. 호출 시 전달되는 argument들의 null check로 처리 해야 함.
* 위 그림에서 나와 있듯이 OnAppControlRequestReceived는 실행 시 app이 initialize되는 중에 실행 중에 호출 될 수 있음.
 . 시작 시 UiApp을 상속받은 class에서 event가 발생한다면 data를 저장해 두었다가 나중에 Form에서 처리하게 하던가 아니면 실행중이라면 바로 listener에서 처리하게 해야 할듯 하다.



[app 호출]

app ID로 launch 하는 방법
: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1App_1_1AppManager.html#ab0bb90797d2d13d718929acbb794eb26


* AppManager::FindAppControlN으로 하려고 했는데 appid로 application을 찾지 못하는 현상이 발생한다.. 뭐가 잘못이지?


operation id로 find and start 하는 방법

: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1App_1_1AppControl.html

    using namespace Tizen::App;

    void
    MyAppClass::AppControlDialSample(void)
    {

        String telUri = L"tel:12345678900";

        AppControl* pAc = AppManager::FindAppControlN(L"tizen.phone", L"http://tizen.org/appcontrol/operation/dial");
        if(pAc) 
        {
            pAc->Start(&telUri, null, null, null);
            delete pAc;
        }
    }


: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/app/delivering_launch_arguments.htm

FindAndStart (const Tizen::Base::String &operationId, const Tizen::Base::String *pUriPattern, const Tizen::Base::String *pDataType, const Tizen::Base::String*pCategory, const Tizen::Base::Collection::IMap *pExtraData, IAppControlResponseListener *pListener)



// Sharing single content
String fileUri = L"file:///opt/usr/media/Images/share.jpg";
AppControl::FindAndStart(L"http://tizen.org/appcontrol/operation/share", &fileUri, null, null, null, null);

AppControl status나 호출된 app으로 부터 response를 받고 싶다면 IAppControlResponseListener 를 상속하여 마지막 인자로 전달.


OnAppControlStartResponseReceived 는 AppControl이 시도되었을 시점, result 인자로 제대로 실행되었는지 아닌지 확인이 필요하다.
OnAppControlCompleteResponseReceived 는 AppControl로 실행된 app이 종료되고 난 뒤 시점에 호출된다. 시점을 자세히 말하면 GUI상으로 다시 app이 보여지고 좀 있다가 호출되어 이 함수가 호출되고 호출한 app이 실행된다고 보면 안될것 같고 호출한 app은 그냥 동작하고 result에 따른 처리는 asynchrnous하게 실행하도록 해야 할 것 같다.



2014년 5월 2일 금요일

Tizen Collections 중 ArrayList, LinkedList (native)

Tizen API를 사용하다보면
STL container 대신 tizen collection들을 사용해야 할 경우가 있어 정리함.

: https://developer.tizen.org/dev-guide/2.2.1/org.tizen.native.apireference/namespaceTizen_1_1Base_1_1Collection.html

https://developer.tizen.org/dev-guide/2.2.1/org.tizen.native.appprogramming/html/guide/base/collection_namespace.htm

 

일반적인 std::array, std::list를 대체할 Tizen의 자료구조이며 아래 나오는 제약사항을 숙지하고 구현해야 함. stl을 사용하다 tizen api들을 사용할 경우 다소 생소한 부분들이 있음.

ArrayList and LinkedList

https://developer.tizen.org/dev-guide/2.2.1/org.tizen.native.appprogramming/html/guide/base/arraylist_linkedlist.htm

제약사항

  • They override the IList methods to implement their own adding, removing, inserting, and writing mechanisms.
  • Indexes in them are zero-based.
  • They can be traversed using a Tizen::Base::Collection::IEnumerator interface.
  • They allow duplication of values, but do not accept null references.
  • They do not copy the values, but just keep the pointers to the values.
  • The RemoveAll() method is called internally by a destructor. Depending on the element deleter, the RemoveAll() method destroys all elements. You do not have to call the RemoveAll() method to deallocate all elements at the end.

위 제약사항에서 유의해야 하는 것은
IEnumerator interface를 사용해서 탐색하며
value가 아닌 pointer를 저장해야 하며
destructor에서 저장된 primitive value들을 알아서 deallocate함.

자세한 사용 방법은 위 링크에 포함된 예제를 보면 OK..

 #include <FBase.h>

    using namespace Tizen::Base;
    using namespace Tizen::Base::Collection;

    void
    MyClass::ArrayListTSample(void)
    {
        ArrayListT< int > list;

        list.Construct();

        int int1 = 1;
        int int2 = 2;
        int int3 = 3;
        int int4 = 4;

        list.Add(int1);     // 1
        list.Add(int2);     // 1,2
        list.Add(int3);     // 1,2,3

        int temp;
        for (int i = 0; i < list.GetCount(); i++)
        {
            list.GetAt(i, temp);
        }

        list.InsertAt(int4, 1);     // 1,4,2,3

        ComparerT< int >* pIntComparer = new ComparerT<int>();
        list.Sort(*pIntComparer);   // 1,2,3,4

        delete pIntComparer;

        list.Remove(int3);          // 1,2,4

        list.RemoveAt(0);           // 2,4

        // Uses an enumerator to access elements in the list
        IEnumeratorT< int >* pEnum = list.GetEnumeratorN();
        while (pEnum->MoveNext() == E_SUCCESS)
        {
            pEnum->GetCurrent(temp);
        }

        delete pEnum;
    }

위는 일반적인 primitive 자료형을 위한 자료구조라고 보면 될 듯하며 user-defined object를 처리하기 위해서는 다음 template base data structure를 사용 해야한다.

 Tizen::Base::Collection::ArrayListT<Type>
: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Base_1_1Collection_1_1ArrayListT.html


Tizen::Base::Collection::LinkedListT<Type>
https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Base_1_1Collection_1_1LinkedListT.html


위 페이지의 후반에서 설명하고 있다 시피 아래 Template based List들을 사용하려면 저장되는 object들은 대입, sort를 위한 비교 등에 필요한 operator들( =, ==, !=, <, >)을 구현해야 한다.

The Tizen::Base::Collection::ArrayListT<Type> and Tizen::Base::Collection::LinkedListT<Type> classes represent a template-based collection of objects that can be individually accessed by index, and behave similarly as the object-based class versions. These classes allow duplicate elements. Several methods in these classes need operators of the type assignment (=), equivalent (==), and not equivalent (!=). Furthermore, to use the Sort() method, relational operators (<>) or a comparer must be provided.


* HashMapT 의 key를 String으로 할 경우 컴파일 에러가 발생한다. 예제대로 int를 key값으로 사용하라.

2014년 5월 1일 목요일

Regarding Tizen native REST client app development (HTTP, JSON parser, Event-driven thread)

아래 내용은 Tizen 2.2 기반이라 상위 버전에서는 별 의미 없는 내용입니다.
--------------------------------------------------------------------------- Tizen native app으로 REST client app을 개발하고자
관련된 tutorial 링크 및 참고 사항들을 대충 정리 함...

- HTTP request/response 처리
- JSON parsing
- HTTP response 처리를 위한 Event-driven thread 사용

[HTTP transaction concept]

https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/net/http_transaction.htm

REST client app을 만드니... 기본적인 HTTP transaction에 대해서는 이해가 필요하겠지..

 . HTTP transaction 에 대한 내용들
http://www.pearsonhighered.com/assets/hip/us/hip_us_pearsonhighered/samplechapter/0672324547.pdf



http://www.w3.org/2002/Talks/www2002-p3p/all.htm

 . Chunked transfer
  : 간단히 말하면 일반적인 http streaming transfer는 content를 response로 한번에 보내지만 chunked transfer는 content를 임의의 크기로 쪼개서 보냄. 이런 경우는 server측의 performance의 제약이나 전달되는 content가 실시간 생산되는 content의 경우(크기를 예측할 수 없음) 이런 방법을 사용.
  : Tizen HTTP transfer default mode는 Non chunked transfer mode 이지만 일반적인 server에서는 chunked transfer 지원.
  : http://en.wikipedia.org/wiki/Chunked_transfer_encoding

[HTTP request/response]


[HttpClient Sample Overview]
: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/sample_descriptions/httpclient.htm



HTTP request를 전송하고 response의 body bytes 수를 표시하는 sample app.
tizen.org 를 대상으로 HTTPS request를 실행하므로 외부 network으로 연결에 문제가 없는 지 확인 필요. (proxy 같은)

[HTTP Client]
https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/tutorials/net_tutorial/task_httpclient.htm

* HTTP request 시 http transaction을 asynchronous 하게 처리하기 위해 아래 IHttpTransactionEventListener 등록이 필요

Tizen::Net::Http::IHttpTransactionEventListener
: https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Net_1_1Http_1_1IHttpTransactionEventListener.html

  • OnTransactionAborted
  • OnTransactionCertVerificationRequestedN
  • OnTransactionCertVerificationRequiredN
  • OnTransactionCompleted
  • OnTransactionHeaderCompleted
  • OnTransactionReadyToRead
  • OnTransactionReadyToWrite


HTTP-GET 시나리오에서
no chunked transfer에서는 response header 전달 이후 전체 body가 전송되므로 다음과 같은 이벤트가 발생할 것이고

Client   event                                                                         Server
                                                 GET request >
 HeaderCompleted event        < response header
 Completed event                   < response body

chunked transfer에서는 response header 전달 이후 body가 나눠서 오므로 다음과 같은 이벤트가 발생할 것이다.

Client    event                                                                        Server
                                                 GET request >
 HeaderCompleted event        < response header
 ReadyToRead event               < response body
 ReadyToRead event               < response body
 ReadyToRead event               < response body
 Completed event                   < response body

HTTP-POST 시나리오는 아마도 이렇지 않을까? (해보지는 않음.)

Client     event                                                                       Server
                                          POST request header >
ReadyToWrite event                  request data >
ReadyToWrite event                  request data >
ReadyToWrite event                  request data >
ReadyToWrite event                  request data >
 Completed event                   < response body


[주의 및 참고]

* HTTP transfer를 app에서 사용 하려면 http privilege가 필요
  . manifest.xml > privileges > http://tizen.org/privilege/http

* HttpSession의 copy constructor가 private 인 관계로 reference를 사용할 수 없음

* 일반적인 얘기겠지만 HttpSession의 instance를 http transaction 중 유지하지 않으면 listener 호출 중 crash 발생됨.

* Http request 시 특정 사용자 정보를 response callback에서 확인하려면 HttpTransaction의 SetUserObject()를 사용하라 HttpTransaction instance는 request, response시 모두 접근할 수 있음.
 : https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Net_1_1Http_1_1HttpTransaction.html#a8eff3be989218969838e76310cf99706


[HTTP programming guide]

나머지 항목들은 한번 보시라.

The most common uses of HTTP connectivity are the following:
https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/net/http_connectivity.htm


[JSON]


Introduction to JSON on Tizen
https://developer.tizen.org/documentation/articles/introduction-json-on-tizen

JSON Parser App
https://developer.tizen.org/dev-guide/2.2.0/?topic=%2Forg.tizen.native.appprogramming%2Fhtml%2Ftutorials%2Fweb_tutorial%2Ftask_jsonparserapp.htm

이 예제에서는 JSON data를 parsing해서 key, value list를 제공해 주는 예제다.
단지 JSON data인 string을 parsing해서 탐색 가능한 data structure로 제공해 준다는 의미만 있을 뿐.. 그 이상의 편의는 제공하지 않는다.
사용자가 json response를 직접 parsing 해서 원하는 value를 가져오거나 utility 함수를 만들어서 key에 맞는 value를 가져오도록 해야 할듯.

   // Call JSON parser
   IJsonValue* pJson = JsonParser::ParseN(buf);

   __pJsonKeyList->RemoveAll(true);
   __pValueList->RemoveAll(true);
   TraverseFunction(pJson);


void
JsonForm::TraverseFunction(IJsonValue* pValue)
{   
   switch (pValue->GetType())
   {
      case JSON_TYPE_OBJECT:
      {
         JsonObject* pObject = reinterpret_cast< JsonObject* >(pValue);
         IMapEnumeratorT<const String*, IJsonValue*>* pMapEnum = pObject->GetMapEnumeratorN();

         while (pMapEnum->MoveNext() == E_SUCCESS)
         {

...
 case JSON_TYPE_STRING:
      {
         JsonString* pVal = reinterpret_cast< JsonString* >(pValue);
...
 case JSON_TYPE_ARRAY:
      {
         JsonArray* pJsonArray = static_cast< JsonArray* >(pValue);
         pJsonArray->GetCount();
         IEnumeratorT<IJsonValue*>* pEnum = pJsonArray->GetEnumeratorN();
         while (pEnum->MoveNext() == E_SUCCESS)
...
...

[Alternatives JSON parsers]

JsonCpp
: boost library 기반, library 생성을 위한 컴파일 필요
: http://jsoncpp.sourceforge.net/

cJSON
: simple, MIT license, 2013년이 최신 업데이트
: http://sourceforge.net/projects/cjson/

jsmn
: simple, MIT license, 아직 개발중으로 보임 2014년 최근까지 수정 내역 있음.
: https://bitbucket.org/zserge/jsmn/overview


다른 대안을 찾아 보니 위의 것들이 있었고 http://www.json.org/ 중간에 보면 각 언어에 맞는 json parser library들이 존재하니 알아서 취사 선택하면 될듯함.

간단하게 사용하고자 cJSON을 사용하였고 사실 Tizen에서 제공하는 JSON parser와 기능은 거의 동일하지만 c style로 api 사용 및 array 처리가 간단하다.
JsonCpp도 많이 사용하고 편리한 사용성의 api들을 제공하지만 boost library를 사용하므로 boost library의 cross compile이 필요하고 소스의 양도 좀 되서 그냥 패스함.


cJSON을 통해 parsing하면 cJSON* 이 리턴되고 이를 사용해서 key에 맞는 value들을 뽑아 내면 됨.

typedef struct cJSON {
struct cJSON *next,*prev;     /* next/prev allow you to walk array/object chains.
                                                      Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */

struct cJSON *child;             /* An array or object item will have a child pointer pointing to
                                                        a chain of the items in the array/object. */


int type; /* The type of the item, as above. */

char *valuestring; /* The item's string, if type==cJSON_String */
int valueint; /* The item's number, if type==cJSON_Number */
double valuedouble; /* The item's number, if type==cJSON_Number */

char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;


일반적이 primitive value들은 list traversal 방법으로 확인하면 되며 array나 object들은 아래 함수를 사용해서 뽑아내면 된다.

/* Get Array size/item / object item. */
int          cJSON_GetArraySize(cJSON *array)
cJSON *cJSON_GetArrayItem(cJSON *array,int item)
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)


cJSON* element = null;
element = cJSON_GetObjectItem(item, "peoples");
if(null != element)
{
int size = cJSON_GetArraySize(element);
for(int i = 0 ; i < size ; i++)
{
cJSON* child_element = cJSON_GetArrayItem(element, i);
AppLog("peoples (%d) = %s - %s", i, child_element->string, child_element->valuestring);
...
}
element = null;
}

[Thread]

https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.appprogramming/html/guide/base/thread.htm

Tizen에서는 아래와 같은 두가지(Main thread 제외)의 thread model들이 사용할 수 있고 각각의 특색은 다음과 같음.

[Event-driven Thread]
https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Base_1_1Runtime_1_1EventDrivenThread.html
: Event-driven threads run based on events and they execute in a loop until they receive an event notification to terminate. Event-driven threads allow using asynchronous calls.

[Worker Thread]
https://developer.tizen.org/dev-guide/2.2.0/org.tizen.native.apireference/classTizen_1_1Base_1_1Runtime_1_1Thread.html
: Worker threads run linearly; they only execute the main body of the thread and exit. Asynchronous calls cannot be used, since the thread does not run an event-loop.




주기적인 HTTP request/response를 처리하고자 할 경우 Event-driven thread를 사용해야 함. 단순 http request/reponse를 처리할 때는 상관없으나 loop을 사용할 경우 worker thread에서는 바로 error가 발생하는 것으로 보인다. 실제 tizen platform에서 처리하는 방법은 알 수 없으나 주기적으로 반복해야 하는 상황에서는 event driven thread를 사용하는게 필요 함.

사용상의 별 특이점은 없음. 예제대로 만들면 잘 돌아감.. ㅎ