반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Kurogo Tutorial 17 - Calendar Module -

2012. 6. 1. 23:47 | Posted by 솔웅


반응형

Calendar Module

Calendar 모듈은 날짜와 관련된 정보를 모바일에 맞게 제공합니다. 날짜별 카테고리별 그리고 리스트별로 일정들을 볼 수 있고 그 일정의 세부 일정도 보게 할 수 있습니다. 쿠로고에 자체 내장돼 있는 Calendar 모듈은 iCalendar(ICS) 포맷에 따라 정보를 parsing 하고 보여 줍니다.


Configuring the Calendar Feed


Calendar 모듈을 사용하시려면 먼저 여러분의 데이터와의 connection을 셋업해야 합니다. 반드시 세팅해야 할 2개의 값이 있고 몇개의 옵션값이 더 있습니다.  Administration Module 을 사용하거나  SITE_DIR/config/calendar/feeds.ini 파일을 직접 edit 해서 세팅할 수 있습니다.


Calendar 모듈은 여러 종류의 칼렌더를 제공합니다. 각각의 칼렌더는 configuration 파일의 각각의 섹션에 의해 지정 됩니다. 섹션의 이름은 type이 되고 어떤 칼렌더를 사용할 것인지는 URL들을 이용해서 정해줍니다. type 파라미터가 url을 지정돼 있지 않으면 첫번째 calendar 가 사용될 겁니다.

  • TITLE 값은 calendar feed의 이름에 사용되는 label 입니다. 이 값은 해당 이벤트가 보여질 때 상단의 제목으로 사용될 겁니다.
  • BASE_URL은 ICS feed 의 url로 세팅 됩니다. static file일 수도 있고 web service 일 수도 있습니다.

Optional values

  • RETRIEVER_CLASSData Retriever 에 대한 다른 클래스 이름을 세팅할 수 있도록 해 줍니다. 만약 여러분의 service가 dinamic URL을 사용한다면 custom retriever를 사용하셔야 합니다.
  • PARSER_CLASS (default ICSDataParser) DataParser 의 서브클래스로 세팅해 줍니다. iCalendar(ICS) 포맷이 아닌 포맷으로 데이터를 return 할 때 해당 포맷에 맞게 이 값을 바꿔주셔야 합니다.
  • EVENT_CLASS (default ICalEvent)  검색시 return 된 이벤트 객체들에 대해 다른 클래스 이름으로 세팅할 수 있도록 해 줍니다. feed의 custom field를 처리할 수 있도록 custom behavior를 지정할 수 있도록 해 줍니다.



Configuring the Detail Fields


feed setting이 다 끝났으면 세부정보를 보여주는 화면이 어떻게 display 될지 그리고 어떤 값들을 사용할지를 configure 하셔야 합니다. 각각의 field는 section에서 configure 됩니다. 그 section 이름은 event field와 매핑됩니다. 이 section의 순서는 detail view의 순서가 됩니다. 각각의 섹션안에는 어떻게 이 field가 display 될지를 정해주는 여러 값들이 있습니다. 모두 optional 입니다.

  • label - field에 대한 text label
  • type - value를 포맷하거나 링크를 생성하기 위한 옵션 값. 아래의 값들이 올 수 있습니다.

    • datetime - date/time 값으로 format
    • email - 이메일 주소같은 값에 mailto 링크를 생성함
    • phone - 전화번호 같은 값에 telephone link를 생성함
    • url - url 링크를 생성함
  • class - field에 CSS 클래스를 추가. space를 두고 여러 클래스들을 열거해 사용할 수 있음
  • module - 다른 모듈에 링크를 걸음. 그리고 결과값을 format 하기 위해 그 모듈의 linkForValue 모듈을 사용함. 좀 더 자세한 사항은  Module Interaction를 보세요.

Configuring the Initial Screen

index page는 여러분의 configure 한 calendar들의 리스트를 보여주도록 configure 될 수 있습니다. SITE_DIR/config/calendar/page-index.ini 를 수정해서 이 리스트의 content들을 update 할 수 있습니다. 각각의 entry는 section 입니다. 각각의 section은  listItem 탬플릿에 의해 사용되는 값에 대한 매핑 값들을 가지고 있습니다.

  • title - 사용자에게 보여질 entry 이름
  • subtitle - title 밑에 보여 줄 subtitle
  • url - 목적지 링크. 외부 url에 링크 걸 수도 있고 모듈 안의 한 페이지에 링크를 걸 수도 있슴. 칼렌더 view page들은 어떤 calendar가 보여질지를 지정하기 위해 type 파라미터를 전달해줘야 합니다.

    • day - 해당 일자의 이벤트를 보여 줌
    • year - 12달 동안의 모든 이벤트를 보여 줌. month 파라미터를 전달해서 시작하는 month를 지정할 수 있슴
    • list - 현재일 바로 다음의 이벤트들을 보여 줌. 디폴트 limit은 20 events 임
    • categories - 카테고리의 리스트를 보여 줌. 현재로서는 이 카테고리 리스트를 get 하기 위해서는 특별한 support가 요구됩니다.
  • class - item의 CSS class. 예) phone, email

Configuring User Calendars and Resources

유저 칼렌더와 resources (rooms/equipment 등) 을 보기 위한 기능이 있습니다. 지금까지 support 되는 칼렌더 시스템은 Business 나 Education을 위한 Google Apps 만이 지원 됩니다.


User Calendars 가능하도록 하려면:

  • Setup the authority for your Google Apps Domain.
  • Ensure that you have entered the required OAuth consumer key and secret
  • Ensure that the “http://www.google.com/calendar/feeds” scope is available in your authority.
  • Edit config/calendar/module.ini and add a user_calendars section.
  • Set RETRIEVER_CLASS to GoogleAppsCalendarListRetriever
  • Set AUTHORITY to the section name of your Google Apps Authority. If this value is not set it will use the first defined GoogleAppsAuthority class


아래는 config/calendar/module.ini file 의 예제 입니다.

[user_calendars]
RETRIEVER_CLASS="GoogleAppsCalendarListRetriever"
AUTHORITY="googleapps"

Resource들을 사용하시려면:

  • Setup the authority for your Google Apps Domain.
  • Ensure that you have entered the required OAuth consumer key and secret
  • Ensure that the “https://apps-apis.google.com/a/feeds/calendar/resource/” scope is available in your authority.
  • Edit config/calendar/module.ini and add a resources section.
  • Set RETRIEVER_CLASS to GoogleAppsCalendarListRetriever
  • Set AUTHORITY to the section name of your Google Apps Authority

아래는 config/calendar/module.ini file 예제입니다.

[resources]
RETRIEVER_CLASS="GoogleAppsCalendarListRetriever"
AUTHORITY="googleapps"



반응형


반응형

jQuery Mobile이 아니고 jQuery UI 에서 Touch 이벤트를 지원한다고 합니다. 


jQuery UI Touch Punch


Touch Event Support for jQuery UI


아이패드 (iPad), 아이폰 (iPhone), 안드로이드 (Android) 와 기타 touch-enabled 모바일 디바이스에서 테스트 됐음


jQuery UI Touch Punch는 jQuery UI 유저 인터페이스 라이브러리를 사용하는 site에서 touch event를 사용할 수 있도록 한 하찮은것입니다.


Visit the official Touch Punch website.


현재 jQuery UI 유저 인터페이스 라이브러리는 touch event를 사용하는 것을 지원하지 않고 있습니다. 그 의미는 데스크탑에서 그럴듯하게 잘 만들어서 테스트 된 것도 touch-enabled 모바일 디바이스에서는 별로 유용하지 않다는 것을 말합니다. 왜냐하면 jQuery UI 는 마우스 이벤트 (mouseover, mousemove and mouseout)를 listen 하고 있지 touch event(touchstart, touchmove and touchend)를 Listen 하고 있지 않기 때문입니다.


그래서 jQuery UI Touch Punch가 나온 겁니다.Touch Punch는 simulated events를 사용해서 mouse event를 touch event로 매핑합니다. 간단히 페이지에 script를 include 시키면 touch 이벤트가 각각의 상응하는 mouse 이벤트로 변환될 겁니다.


제가 말했듯이 Touch Punch는 하찮은 것입니다. 그냥 jQuery UI의 몇개의 core 기능을 touch event로 매핑하는  duck punches 일 뿐입니다. Touch Punch는 jQuery UI의 interaction과 widget 을 implement 해서 사용합니다. 그래도 사용하시려고 하면 잘 작동을 안하고 오류가 나고 할 겁니다. 이러한 이슈들을 어떻게 알아내고 어떻게 고칠지에 대해 아래 글을 통해서 미리 익혀 두세요.


이 코드는 MIT나 GPL 버전 두개의 licenced 돼 있습니다. 그렇기 때문에 Free 입니다. 수정하시고 배포하셔도 됩니다. 다만 이 Touch Punch를 패키지나 플러그인으로 사용하시면 Original software에서 밝혀 주시고 또  Touch Punch website에 링크도 걸어 주세요.



Using Touch Punch is as easy as 1, 2…


아래대로 하시면 jQuery UI 앱에서 touch 이벤트를 사용하실 수 있습니다.:

  1. Include jQuery and jQuery UI on your page.

    <script src="http://code.jquery.com/jquery.min.js"></script>
    <script src="http://code.jquery.com/ui/1.8.17/jquery-ui.min.js"></script>
    
  2. Include Touch Punch after jQuery UI and before its first use.

    Please note that if you are using jQuery UI's components, Touch Punch must be included after jquery.ui.mouse.js, as Touch Punch modifies its behavior.

    <script src="jquery.ui.touch-punch.min.js"></script>
    
  3. There is no 3. Just use jQuery UI as expected and watch it work at the touch of a finger.

    <script>$('#widget').draggable();</script>
    

Tested on iPad, iPhone, Android and other touch-enabled mobile devices.


Download the Code

jQuery UI Touch Punch plugin 은 아래 두개의 버전이 있습니다. 다운받아서 사용하세요.



반응형

Kurogo Tutorial 16 - Database Access -

2012. 5. 30. 10:43 | Posted by 솔웅


반응형

Database Access

데이터베이스가 필요한 경우는 여럿 있습니다. Kurogo는 PDO pho library를 사용하는 표준 데이타베이스 access abstraction system을 만들었습니다. 이 section에서는 데이터베이스 connection에 대한 configuration 뿐만 아니라 모듈이나 library를 만들 때 어떻게 데이터베이스를 활용하는지에 대한 설명도 있습니다.

Supported Database Backends

Kurogo는 다음과 같은 부분을 지원합니다. 이 시스템을 사용하시려면 PHP extention 이 요구된다는 것을 기억해 두세요. 데이터베이스 서버를 설치하고 configuring 하는것은 이 문서에서는 따로 다루지 않겠습니다.



An important note about SQL statements

Kurogo 데이터베이스 라이브러리는 단지 abstraction library 에 접속하는 일만 합니다. 이것은 SQL abstract library 가 아니기 때문에 서로 다른 backend 시스템이 하나의 SQL language를 지원하지 않구요 거기에 맞는 statement를 사용해야 하는 겁니다. SQL 구문이 반드시 다르게 되는 back ends 들에 대한 정보는 Using the database access library 를 보세요.

Kurogo Features that use Database connections

  •  internal device detection system은 브라우저에 데이터를 저장하기 위해 내장된 SQLite 데이터베이스를 사용합니다.
  • Statistics Modules 은 access log들을 index 하고 report를 준비하기 위해 데이터베이스를 사용합니다. 여러분 환경이 load balance 된 환경이라면 centralized 데이터베이스를 사용하시는게 좋을 겁니다.
  • 옵션으로 세션데이터를 저장하려면 SessionDB 클래스를 사용해서 서버에 파일로 저장할 게 아니라 데이터베이에 저장하는 것이 좋습니다.
  • DatabasePeopleController는 디렉토리 정보를 얻기 위해 데이터베이스를 사용합니다. (LDAP 서버를 사용하지 않고 데이터베이스를 사용하는 겁니다.)
  • DatabaseAuthentication authority 는 authentication을 위해 데이터베이스를 사용합니다.

이 기능들을 사용하시려면 데이터베이스만 있으면 됩니다. 데이터베이스를 사용하지 않아도 Kurogo를 사용할 수는 있습니다.

Configuring Database Connections

site.ini 파일의  database 섹션에는 데이터베이스 connection setting의 primary set 이 있습니다. 모든 데이터베이스 커넥션들은 디폴트로 series of setting을 사용할 겁니다. 여러분들은 특정 서비스의 configuration마다 적당한 값들을 사용함으로서 이러한 세팅들을 override 하실 수 있습니다.

  • DB_DEBUG - on 이면 쿼리들은 log 되고 에러들은 브라우져에 보여집니다. production site에서는 off로 해 두셔야 합니다. 그렇지 않으면 데이터베이스 에러가 있을 때 SQL 쿼리가 노출 될 수 있습니다.
  • DB_TYPE - 데이터베이스 시스템의 종류. 아래와 같은 것들이 있습니다.
    • mysql
    • sqlite
    • pgsql
    • mssql

아래 값들은 host based 시스템들에 적합합니다. (mysql, pgsql and mssql)

  • DB_HOST - The hostname/ip address of the database server.
  • DB_USER - The username needed to connect to the server
  • DB_PASS - The password needed to connect to the server
  • DB_DBNAME - The database where the tables are located
  • DB_PORT - The port used to connect to the server. If empty it will use the default (mysql and pgsql only)

The following values are valid for file based systems (sqlite)

아래 값은 file based systems 에 적용됩니다. (sqlite)

  • DB_FILE - 데이터베이스 파일의 위치. Use the DATA_DIR constant to save the file in the site data dir. This folder is well suited for these files.

Using the database access library

데이터베이스 접근이 요구되는 모듈을 만든다면 여러분 코드를 간단하게 하고 같은 데이터베이스 접근을 쉽게 하기 위해 데이터베이스 클래스를 활용하실 수 있습니다.

  • Include the db package: Kurogo::includePackage(‘db’);
  • Instantiate a db object with arguments, the arguments should be an associative array that contains the appropriate configuration parameters. If the argument is blank then it will use the default settings found in the database section of site.ini
  • Use the query($sql, $arguments) method to execute a query. The arguments array is sent as prepared statement bound parameters. In order to prevent SQL injection attacks you should utilize bound parameters rather than including values in the SQL statement itself
  • The query method will return a PDOStatement object. You can use the fetch method to return row data.
  • The lastInsertID method of the db object will return the ID of the last inserted row.
<?php

Kurogo::includePackage('db');

class MyClass
{
    function myMethod() {

        $db = new db();

        $sql = "SELECT * FROM sometable where somefield=? and someotherfield=?";
        $result = $db->query($sql, array('value1','value2'));
        while ($row = $result->fetch()) {
            // do something
        }
    }
}



반응형

Phonegap Keyword Index

2012. 5. 26. 23:36 | Posted by 솔웅


반응형

지금 제가 참여하는 프로젝트는 Kurogo Middle ware 를 주로 사용하고 있습니다.

그래서 Kurogo에 대해 열심히 배우고 있죠.

그리고 Kurogo는 오픈소스에다가 PHP 로 만들어진 거라서 계속 PHP 소스를 들여다 보면서 수정을 하고 있구요.

모바일 웹 이기 때문에 자바스크립트아 HTML5, CSS 도 사용하고 있습니다.


지금 개발 환경도 여러가지 새로 배울것들이 많은데 PM이 다음 프로젝트는 PhoneGap을 사용할 거라고 미리 좀 공부해 두라고 하네요.


그래서 늘 하듯이 새로 Phonegap 디렉토리를 만들고 앞으로 Phonegap 공식 사이트에서 제공하는 튜토리얼을 번역하는 일을 할 예정입니다.


예전에 시간이 있을 때는 그 튜토리얼을 근거로 이런 저런 예제도 만들고 하면서 글을 썼었는데 요즘은 계속 일하면서 글을 올리는 거라서 튜토리얼을 번역하기 바쁩니다.


그래도 그냥 눈으로 읽는 것보다는 이렇게 번역하고 정리하고 블로그에 포스팅 하는게 훨씬 더 많이 이해도 되고 다음에 또 찾아볼 때 많이 도움이 되더라구요.


오늘은 시작하는 의미에서 Phonegap 홈페이지에 있는 튜토리얼 중 Phonegap Keyword Index를 복사해 놓겠습니다.


A

B

C

D

E

F

G

L

M

N

O

P

R

S

V


다음엔 각 OS별 설치 요령들을 번역할 생각입니다.

반응형

Corona Roadmap

2012. 5. 26. 22:46 | Posted by 솔웅


반응형

Corona Roadmap

Posted by Walter

제가 좋아하는 말이 있습니다. Dwight D. Eisenhower  대통령의 말인데요. "계획은 아무런 소용이 없다. 하지만 계획을 세우것은 반드시 필요하다."

다른 말로 계획을 세우는 과정이 중요하다는 겁니다. 그리고 상황이 변하면 여러분의 계획도 변할 수 있어야 되는 것이죠.

그 마음가짐으로 여러분과 우리의 로드맵을 나누고 싶습니다. 우리의 계획중의 하나라는 것을 알아 주세요. 아직  외부로 밝힐 수 없는 top secret 들도 있습니다.

우리는 high level 로드맵과 core feature 로드맵으로 로드맵을 두 분야로 나누었습니다.



High-level Roadmap

첫번째로 high-level 로드맵에 대해 얘기하겠습니다:

    Q2
        SDK (next public release)
        Enterprise
        Level Editor
    Q3
        Mac Apps


여러분이 보시듯이 우리는 많은 해야할 일들을 가지고 있습니다. 아주 바쁜 스케줄의 연속입니다. 우리는 새로운 무료 공개버전 작업은 거의 다 마무리 했습니다. Enterprise와 Level Editor는 그 뒤를 이어서 곧바로 진행할 겁니다.

여기까지의 작업을 마치면 Mac Apps에 대한 작업들을 끝낼 수 있습니다. 물론 이 것이 좀 더 일찍 release 될거라고 저희들이 약속했던 것을 기억합니다. 하지만 그동안 많은 infrastructure 들이 바뀌었습니다. 64비트가 그 중에 한 개 인데요. 그 작업들을 하는데 고려해야할 그러한 새로운 변화들이 많이 있었습니다.


여러분들 중에 Enterprise가 뭔지 궁금해 하시는 분들도 계실 겁니다. 그건 아주 흥미로운 새로운 상품입니다. 여기에 대해서 앞으로 다른 글을 통해 좀 더 자세하게 얘기하겠습니다. 그리고 이것이 SDK 개발자들에게 어떤 이로운 점들을 제공할지에 대해서도 말씀 드리겠습니다.



Core Feature Roadmap

이제 본격적인 얘기 입니다. 어떤 기능들이 추가 core로 선보이게 될까요?

우리는 이것을 2-on-2 cycles 로 분류를 했습니다. 간단히 풀면 Cycle 1은 6월과 7월이고 Cycle 2 는 7월과 8월입니다.

첫번째 기간에는 안드로이드도 아이폰이랑 동등하게 지원하고 Documentation을 완료하려고 합니다. 하지만 Push Notification은 Cycle 1에 포함되지 않았습니다. 왜냐하면 안드로이드에서 이것을 구현하는것은 iOS보다 훨씬 복잡하거든요. Cycle 1에는 낮게 열린 과일을 따는 걸로 포커스를 잡았습니다. 그래서 Push 는 Cycle 2로 옮겼습니다.

우리가 한번 리듬을 잡으면 각 cycle마다 얼마나 낳은 기능들을 넣을지에 대해 좀 더 잘 감을 잡을 겁니다. 그 때까지 아래처럼 각 cycle 안에 stretch goals 를 두어서 추가 기능을 확장할 여지를 두었습니다.

[Cycle 1]

    Android
        WebView
        VideoView
        Intent filtering
        MapView
    Documentation for each daily-build
    Stretch Goals
        LPEG
        Page Transition Effects
        Physics Improvements, fixes and update to Box2D 2.2.1
        Widget Improvements

[Cycle2]

    Android
        Push Notification
    iOS
        Maps (breadcrumbs, directions, multiple pins)
        Add image to photo library
    Stretch Goals
        TBD


추가적으로 우리의 할일 목록에 아주 많은 일들을 가지고 있습니다. 그리고 그것들을 완료하고 싶습니다. 여기 포럼에 확정된 리스트를 올렸습니다. 여러분들이 추가 됐으면 좋을 기능들이 있으면 포럼에 올려 주세요. 여기에 댓글을 달아 주셔도 됩니다.

지난주에 말했듯이 조금 더 일이 진행 된 다음에 이 확정된 리스트에 대해서 얘기 할 기회가 있을겁니다. 여러분의 top 3 기능을 투표를 통해 받을 계획입니다. 그리고 여러분이 만들고자 하는 case, 기능, 앱에 대해서 많이 알려주시고 물어봐 주세요. 그러면 우리들이 기능들을 추가하는데 많은 도움이 될 수 있을 것 같습니다.

* * *

아주 많은 일들이 진행됩니다.

여느 계획과 마찬가지로 이것은 현재 우리가 생각하고 있는 것들의 snapshot 입니다. Eisenhower 을 말 처럼 우리는 그 계획들을 계속 바꾸고 있습니다. 우리는 계획을 세우는데 많은 시간을 보내고 있습니다. 그렇게 함으로서 그것들을 적정한 시점에 수용해서 선보일 수 있습니다.


반응형


반응형

Guest Post: 18 Years to Our First App

Steve Bullock은 Adveractive Inc.의 창립자이다. 그리고 퍼즐이나 단어게임으로 좋아하는 NOOK 앱인 Word Winder를 공동 개발하기도 있다. Word Winder는 월요일 App of the Week에 선정되기도 했다. 단지 release 된지 2주 만이다. 이 게임은 NOOK Apps의 board와 game 카테고리에서 1위를 기록하고 있다. Steve와 그의 훌륭한 팀의 성공에 축하를 드린다.

Eighteen Years to Our First App

어떤 사람들은 여기 North Carolina에서 우리를 조금 느리다고 생각합니다. 1994년도에 창립된 (1995년에 첫 게임) 우리의 작은 회사는 지난주 첫번째 앱을 release 했습니다. 게임 이름은 Word Winder 입니다. 솔직히 우리는 진짜로 느리지는 않습니다. 우리는 그냥 남부지방 기질대로 느릿느릿 여유있게 갈 뿐입니다. 





The Path We’ve Taken

저는 1994년도에 Adveractive 를 설립했고 당시 1명의 직원을 두었습니다. Rich Stewart 죠. 저는 초창기 멀티미디어에 푹 빠졌었습니다. (Myst, Passage to Vietnam, 7th Guest 같은) 그리고 interactive advertising 과 관련 된 crazy idea를 갖게 됐습니다. 그래서 회사 이름이 약간 독특합니다. 그리고나서 1995년도에 다음과 같은 일들이 일어납니다. 인터넷이 저를 완전히 뻑 가게 했고 (9600 baud modem 사용), 간단한 게임을 만드는 법을 배우게 됐고 shockwave라고 하는 funky 한 브라우저 플러그인의 beta tester 로 초대 됐습니다. 그리고 게임 개발자가 될 수 밖에 없는 운명은 잠시 봉인 됐었습니다. 그로부터 몇년동안 Adveractive는 거의 사라질뻔하기도 하고 굶어 죽을 뻔하기도 했습니다. 그러면서도 재밌었습니다. 많은 친구들을 만나게 됐고 온라인 상에서 세계적으로 활동을 했고 casual game들을 다운로드 받았습니다. -아직까지 앱은 없었죠.

The Loves We Have Had

우리는 3년동안 3개의 개발 환경과 결혼했었습니다. 결혼이라는 표현을 썼는데요. 한번 특정 SDK에 여러분과 여러분 그룹을 던져 넣으면 서로 많이 의존하게 되고 아주 사랑에 빠지게 되고 excite 하게 되면서 감탄과 존경도 하게 됩니다. 그러다가 실망하게 되는 순간이 오고 또 어려움이 오고 문제점이 생겨서 때로는 혼자서 또 때로는 같이 그 문제들을 풀어야 되는 상황이 오죠.

First Love

첫번째 사랑은 (virtual 적으로) Macromedia Director  였습니다. Shockwave라는 알을 낳는 애였죠. 우리는 Macromedia Director 를 개척하는 개척자였습니다. 아마 지금 코로나를 사랑했던 것 만큼 그 때 디렉터를 사랑했었습니다. Director/Shockwave는 2000년대까지 저와 저의 회사를 도왔고 저도 그녀를 도왔습니다. 우리는 아주 열심히 일하는 부부였죠.

Second Love

Flash 가 나오면서 첫사랑은 멀어져갔죠. 플래시는 아주 이뻤습니다. 하지만 1990년대에는 그렇지는 않았습니다. 그녀는 자랐습니다. 저는 플래시와 그렇게 깊이 사랑에 빠지지는 않았습니다. 하지만 그녀는 디렉터를 옆으로 밀어제치고 2001년부터 지금까지 저희 집에와서 밥을 차려주고 있어요. 저는 프로그램을 존경하고 또 좋은 제품을 만들 수 있도록 개발 환경을 제공하는 사람들을 아주 존경합니다. 그들은 프로페셔널 입니다. 하지만 저는 디렉터나 코로나에 대한 열정처럼 자주 흥분하는 스타일은 아닙니다.

New Love

지금 저는 다시 사랑에 빠졌습니다. 수년간 저희는 앱은 만들고 싶어했지만 그 길을 찾기 위해 온라인상에서 많은 수고를 해야만 했습니다. 지난 여름 우리는 드디어 모바일과 태블릿 앱의 세계로 느릿느릿 진입하기 시작했습니다. 한가지 의문을 가지고요. "이제 누구랑 결혼하지? 혹은 우리의 second partner랑 이 일을 해야 할까?" 새로운 파트너가 될 수 있는 상대방들과 몇번의 충분한 데이트를 하고 난 후 우리는 Corona를 선택했습니다. 그리고 후회는 없습니다. 지금 현재 다른 온라인 작업을 하느라고 우리는 아직 Flash를 사용하고 있지만 Corona는 우리의 미래입니다.

이 새 결혼 후 9개월이 지나서 새로운 파트너가 perfect 하지는 않다는 것을 깨달았습니다. 하지만 우리가 코로나와 사랑에 빠질 수 있었던 이유들은 이렇습니다.

    - 우리는 Jonathan, Peach, Tom, Carlos (지금 실종상태입니다), Walter, Joshua 그리고 (웹 게임이 아주 어렸을 때 알게 됐던) 여러 친구들의 헌신과 열정을 보면서 아주 excite 해 졌습니다. 그리고 이 좋은 친구들이 그들의 제품을 사랑하고 있다는 것이 보였습니다.

    - 코로나는 아주 강력합니다. 보기에는 아주 간단해 보이면서도 Word Winder 의 경우 제대로 작동하게 하기 위해 수천, 수만의 소스 코드 line 들이 있습니다. 이 앱 안에는 서로 다른 로직과 서로 다른 레이아웃 그리고 각각의 플레이 메카니즘을 갖고 있는 6개의 별개의 게임이 있습니다. 게다가 auto-save, 광범위한 help 제공, 특정한 부분에서의 first-time tip들 같은 세세한 많은 부분들까지 신경을 썼습니다. 유저들이 처음 접하고 사용하기 편하게 도와드리기 위해서죠. 그러한 작업을 하기 위해 수 많은 코딩이 필요했고 강력하면서도 flexible 한 development platform이 있어야 했습니다.

   - Word Winder's 개발을 Ansca로 하기로 결정하고 나서 3~4가지 기술적인 이슈들이 있었습니다. 이 이슈들에 대해서 Corona 엔진에서 어떻게 그러한 작업들이 진행되는지 빠르고 정확하고 자세한 설명을 받을 수 있었습니다. 몇가지 이슈는 아직은 우리가 구현할 수 없는 것입니다. 하지만 그럼에도 불구하고 정말 좋은 개발 툴이라는 것이 충분히 설명됐고 충분히 이해했습니다.

   - 우리는 이 게임을 마케팅 전략적인 이유로 NOOK에 먼저 발표했습니다. 하지만 사실 우리는 이 앱을 NOOK 이전에 iPad 에 맞게 개발했었습니다. 지금 우리는 iOS, Kindle Fire 그리고 안드로이드 버전의 Word Winder를 개발하고 있고 이번 여름에 발표할 예정입니다. 코로나는 이런 cross-plagform 작업을 정말로 우아하게 처리할 수 있도록 해 줍니다.




The First New Child (and maybe the best ever?)

Word Winder는 best game 이 될 겁니다. 지금까지 보지 못한 intellectual 한 부분이 있습니다. 지난주 몇몇 store (Barnes & Noble 등 등)에 physical board game version으로 launch 됐습니다. 그리고 올 여름 광범위한 시장에서 사용이 가능하도록 만들 겁니다. 그러기 위해서 우리는 다음달에 NOOK 이외에도 여러 곳에 porting 할 계획입니다.

Word Winder 는 USA Today와 다른 많은 daily online 게임과 puzzle books에 소개 된적이 있는 Jumble™ games (Newspaper sydication 과 온라인상에 있는) 의 저자인 David L. Hoyt 의 작품(두뇌의 소산)입니다.  Adveractive는 David와 2006년 같이 Pat Sajak 게임을 작업을 한 이래로 파트너로 일하고 있습니다. 우리는 Divid의 모든 온라인 게임을 작업했습니다. 지난 여름 Word Winder에 대한 핵심 게임 play에 대해 의논하기 위해 천재적인 game inventor Graeme Thomson, David와 같이 모여서 작업을 했었습니다. 이 게임은 아주 simple 합니다. 단 한줄로도 설명 될 수 있죠.

Win the game by being the first player to connect opposite sides of the game board with words that form a continuous winding line of letters.
계속해서 구불구불한 줄을 만드는 글자과 함께 game 화면의 반대편까지 도달하면 이기는 겁니다.


이 게임을 만든 우리 세사람 (David, Graeme 그리고 I)는 얼마나 많은 word game player들로부터 "내가 사용해본 게임중에 최고다"라는 말을 들었는지 다 말씀 드릴 수도 없습니다. 이 말을 들었을 때 우리는 smile 하고 고개를 끄떡였죠. '당근하지' 라고 생각하면서요 ^^ 그리고 들으면서 아주 기분이 좋았습니다.

코로나에게 이렇게 Word Winder 에 대해 횡설수설하게 설명할 수 있는 기회를 주셔서 감사의 말씀을 드립니다. 우리는 3번째 사랑의 관계에 빠졌습니다. 그리고 우리의 word game 작업에 아주 열심히 임하고 있습니다.

-Steve Bullock, Adveractive Inc.

반응형

FAQ Wednesday #6

2012. 5. 25. 10:23 | Posted by 솔웅


반응형
FAQ Wednesday #6

Posted by

또 다른 FAQ를 다룰 수요일 입니다. 아래 5개의 질문과 답변이 있습니다.

Question 1

어떻게 Corona window를 데스크탑으로 다시 가지고 올 수 있죠?

Answer

윈도우 시스템을 사용할 때 발생할 수 있는 일입니다. 만약 external display 를 사용하고 있는데 프로그램이 display 없이 restart 했을 경우에 일어나죠. 프로그램이 hang 된 것이 아닙니다. 그냥 존재하지 않는 display에 표시하려고 하는 겁니다. Corona Windows Simulator에서 일어날 수 있습니다. (맥에서는 발생하지 않습니다.) 아래 윈도우로 다시 되돌릴 수 있는 방법이 있습니다.

- task bar에 있는 Corona Simulator tab에서 오른쪽 마우스를 누릅니다.
- move 를 클릭합니다.
- 화살펴 키를 누르세요.
- 없어진 window 가 display 에 보일 때까지 옮겨 주세요.
- move를 stop 하려면 Left click을 하세요.


이렇게 하시면 됩니다. 나중에는 윈도우에서 이런 상황이 발생하지 않도록 만들어지기를 바랍니다.

Question 2

Game Center에 제 최고 점수를 세팅했는데 없어졌어요. 왜죠?

Answer

최고점수를 세팅하거나 Achievement를 unlocking 하는 것을 Game Center 서버를 통해 전파하는데는 시간이 좀 걸립니다. 이 의미는 set 된 다음에 곧바로 새 점수나 achievement가 보이지 않는다는 얘기죠. gameNetwork.show API를 사용해서 새로운 정보를 return 받는데는 24시간 정도 걸릴 수 있다는 것을 예전에도 알려드린 바 있습니다. 최고 점수나 achievement unlock 을 하고 gameNetwork.request를 사용해서 loadScore 나 loadAchievement를 하는 것은 몇시간이 걸리지는 않습니다. 그냥 몇초 정도 걸릴겁니다. 단지 그것이 세팅되고 난 후 곧바로 그 정보가 count 되지는 않습니다. 곧바로 display 되어야 한다면 그 정보는 local에 저장되는것이 맞습니다.


Question 3

제 앱은 GameCenter에 대해 gameNetwork.init API를 사용합니다. Game center 로그인창을 띄우기 위해서죠. 유저가 로그인을 하지 않고 Cancel을 누를경우 제 앱에서는 이 후에 유저에게 다시는 sign in 하라는 메세지를 띄우지 않습니다. 이 Sign-in dialog 창(로그인 창)을 어떻게 하면 다시 띄울 수 있죠?

Answer

만약 유저가 게임센터 로그인창에서 Cancel을 누른다면 게임센터 initCallBall 은 event.data = false 라는 값을 return 할 겁니다. 로그인이 실패했다는 것을 알리는 것이죠. 유저기 앱에서 force quit 을 하지 않는 이상 혹은 native iOS Game Center 앱을 사용해서 다시 로그인을 하지 않는 이상 이 로그인 창을 다시 불러오는 방법은 없습니다. Note: false status를 받은 이후에 gameNetwork.init을 부르면 로그인 창이 다시 뜨지 않습니다.

성공적으로 로그인 하거나 앱이 resume 되고 유저가 계속 Game Center에 로그인 된 상태에서 initCallback은 event.data = true를 return 합니다. 이 true status를 받은 이후에 여러분의 앱은 다른 gameNetwork API를 call 해야 합니다.

이 behavior는 Corona에만 해당 되는 것은 아닙니다. Game Center의 흐름이 그렇습니다. 그리고 로그인 창이 다시 뜨지 않는것이 맞다고 생각합니다. 유저가 cancel을 했다는 것은 그 앱에서 Game Center를 사용하고 싶어하지 않는 다는 의미이기 때문입니다.

Question 4

왜 나는 안드로이드 디바이스에서 어떤 파일들은 access 할 수 없죠?

Answer

Corona에서 File access는 OS 에 근거해서 작동합니다. platform에 의존하는 것이죠. iOS 디바이스에서는 여러분은 Resource directory(main.lua 가 있는 곳)에서 file들을 access 할 수 있습니다. 그리고 Documents와 Temporary directory에서도 접근할 수 있습니다. 안드로이드에서는 Resource directory 접근에 제한이 있습니다. 왜냐하면 그건 실제 디렉토리가 아니기 때문이죠. 파일들은 zip 파일로 enclose 됩니다. 코로나는 audio와 image API를 사용해서 이미지와 오디오를 직접 로딩할 수 있도록 합니다. 하지만 file I/O API를 이용해서 Resource 파일에 접근하는데는 제한이 있습니다. 이 때문에 안드로이드에서는 Resource directory 나 그 subdirectory에 있는 파일에 접근하기 위해 Lua File System(LFS)를 사용할 수 없습니다. 안드로이드에서 Document와 Temporary directory에있는 파일과 서브디렉토리 접근은 가능합니다.

디렉토리를 생성하고 없애기 위해 LFS를 사용할 때 유념해야 할 부분들이 있습니다. 첫번째로 파일이다 디렉토리에 접근할 때 full path string을 사용하셔야 합니다. (system.pathForFile을 이용해서) 그리고 lfs.chdir이나 lfs.currentDir API를 사용하시면 안됩니다. 현재의 디렉토리 개념은 platform 별로 다릅니다.

Resource Directory는 platform 에 의존하는 것이죠. 이 디렉토리 안에 파일이나 서브디렉토리를 만들거나 작성할 수 없습니다.

Corona 파일 접근은 플랫폼의 파일 시스템 sandbox에 따라 제한을 받습니다. sandbox 는 OS와 다른 앱의 파일들로부터 독립적인 그 앱의 공간을 위한 제한을 둡니다.

서브디렉토리를 add 하는 것은 여러분 app 개발 하는데 필요할 겁니다. 하지만 거기에는 제한사항들이 있다는 것 (위에서 언급한 안드로이드 제한 등) 그리고 어떤 기능은 미래의 플랫폼에서는 implement 되지 않을 수도 있다는 것을 염두에 두셔야 합니다. 거기에 대한 대비책은 여러분의 파일이나 디렉토리를 최대한 simple하게 유지하셔서 미래의 변화에도 영향이 없도록 하는 방법이 있을 겁니다.

LFS는 Daily Build #2012.805 부터 implement 됐습니다. 좀 더 많은 정보는 여기를 보세요.

Question 5

어떻게 audoi stream 파일을 처음부터 restart 할 수 있죠?

Answer

Audio stream (audio.loadStream으로 audio를 로드 한 것)은 항상 남은 부분부터 play 합니다. 만약 다시 streaming 할 필요가 있으시면 audio.rewind나 audio.seek(0) 을 이용해서 오디오를 처음부터 다시 시작하도록 하실 수 있습니다.

여기까지가 오늘의 questions 입니다. 즐겁고 유익한 시간이 되셨기를 바랍니다.

반응형

Kurogo Tutorial 14 - Handling Requests -

2012. 5. 23. 00:52 | Posted by 솔웅


반응형

Handling Requests

이 섹션은 HTTP request들을 어떻게 Furogo 프레임워크가 처리하는지에 대한 개요에 대한 글입니다. 간략하게 아래와 같이 outline을 말할 수 있습니다.

1. mod_rewrite가 그 path 가 존재하는지 여부를 살펴 봄
  : DocumentRoot 안에는 2개의 파일과 1개의 폴더가 있습니다 : index.php, robots.txt and min
  : min 폴더는 css와 javascript assets의 version들을 consolidate 하기 위한 간략한 라이브러리를 포함하고 있습니다.
2. file이 없으면 그 사실이 index.php로 보내집니다.
3. file시스템에 있는 file로 경로가 매핑되고 이것을 return 하거나 404 코드가 return 됩니다.
4. SITE_DIR/config/site.ini를 업데이트해서 URLs을 다른 URLs로 매핑할 수 있습니다.
5. 첫번째 경로 component를 기반으로 한 config 폴더는 모듈이 로드 됐는지 확인합니다.





Path patterns

index.php 는 몇가지 패턴에 따라 경로를 analyze 할 겁니다.

- CURRENT_THEME/common/images 폴더에 favicon.ico 가 있으면 client한테 보내집니다.
- ga.php 가 lib 폴더로부터 보내 질 겁니다.
- css, javascript, 이미지들의 subpath 와 함께 모듈의 경로 (혹은 일반적인 경로) 를 포함한 request들은 Pagetype 과 Platform 파일들에 따른 규칙을 사용해서 작동합니다. 다음과 같은 예들이 있습니다. /modules/home/images/x.png, /common/css/compliant.css, /modules/admin/javascript/admin.js
- /media 경로가 있는 request는 현재 site 폴더의 subfolder 안에서 검색 될 겁니다. i.e. /media/file will map to SITE_DIR/media/file

어떤 패턴도 없으면 이 script는 SITE_DIR/config/site.ini 의 [urls] section 에 url이 있는 지 살펴 볼 겁니다. 만약 있으면 그 url로 rediret 될 겁니다.

다른 모든 request들은 그 request 의 첫번째 path component (/module) 를 근거로 site config 폴더에 있는 폴더를 찾으려고 할 겁니다. 첫번째 / 전에 있는 content들은 그 모듈의 id를 가리킬 겁니다. module.ini 파일의 id 프로퍼티를 추가함으로서 이것을 override 하실 수 있습니다.(좀 더 자세한 사항은 Copying a Module을 보세요). 슬래시 다음의 content들은 로드할 page 가 될 겁니다. 명시된 페이지가 없다면 index 페이지가 로드 될 겁니다. 이 script는 (index.php) WebModule::factory method 를 사용해 상응하는 id 를 갖고 module을 instantiate 하려고 시도할 겁니다. 이 때 파라미터로서 $_GET 과 $_POST 변수의 내용도 포함이 됩니다. (어떻게 module file들이 위치되는지에 대한 정보는 Writing Modules를 보세요). Note: the trailing .php for page names is optional.

Examples:


* /home - index 페이지와 함께 home 모듈이 로드 될 겁니다.
* /about/about_site - about_site와 함께 about 모듈이 로드 될 겁니다.
* /calendars/day?type=events 는 day 페이지와 함께 calendars 모듈이 로드되고 여기에 events라는 값을 가지는 Get 변수 name인 type을 포함할 겁니다.
* /news/?section=1 는 index 페이지와 함께 news 모듈을 로드하고 section이라는 name을 가지고 1이라는 값을 가지는 GET 변수를 포함할 겁니다.

Pages 에 대해서는 Writing Module setion에서 좀 더 자세하게 다뤄질 겁니다.

Pagetype & Platform Files

다양한 디바이스에 맞게 request를 만들다 보면 아주 다양한 상황에 놓이게 됩니다. device detection service에는 두가지 중요한 프로퍼티가 있습니다. 이 프로퍼티들은 어떤 content가 로드될 것인가에 영향을 미칩니다.

- pagetype - The basic type of device, is basic, touch, compliant or tablet.
- platform - The specific device type. Examples include: android, bbplus, blackberry, computer, featurephone, iphone, palmos, spider, symbian, webos, winmo


탬플릿 파일이나 css file 그리고 javascript 파일에 대해서는 서로 다른 디바이스 타입과 플랫폼들에 맞게 해당 버전을 로드할 수 있습니다. 프레임워크는 가장 알맞는 file을 로드할 겁니다 예를 들어 디바이스가 안드로이드 디바이스이면 다음 순서대로 index.tpl 파일을 찾아볼 겁니다.

- index-compliant-android.tpl
- index-compliant.tpl
- index.tpl


그리고 feature phone 일 경우는 아래 순서대로 살펴 보겠죠.

- index-basic-featurephone.tpl
- index-basic.tpl
- index.tpl


이렇게 함으로서 여러분은 서로 다른 HTML markup, CSS, javascript를 해당 디바이스에 맞게 제공할 수 있습니다.  탬플릿 안에서 CSS @import 와 {block} 함수를 사용함으로서 일반적인 layer utilize 구조나 스타일을 해당 디바이스에 맞게 제공 되도록 구현할 수 있습니다.


반응형

Kurogo Tutorial 13 - Localization -

2012. 5. 22. 23:11 | Posted by 솔웅


반응형

오늘은 Kurogo의 Localization을 살펴 봅니다.

이 미들웨어의 이름은 일본어 이지만 한국인들이 중심이 되어 만들어서 그런지 예제를 들 때 한국어를 많이 사용했네요.


===============================


Localization

Kurogo에는 서로 다른 언어와 지역에 대해 지원하는 기능이 있습니다. 여기에는 고정된 화면 출력 값과 에러 메세지 그리고 다른 text string들이 포함 됩니다. 현재 쿠로고는 US English translation만 지원됩니다. 그렇지만 여러분들은 여러분들 만의 translation을 생성할 수 있습니다. 여러분 사이트에 추가할 수도 있고 다음 Kurogo 버전에 반영되도록 submit 하실 수도 있습니다.

Configuration of Languages

site는 여러 언어들을 사용할 수 있도록 configure 되게 할 수 있습니다. 우선순위가 높은 언어를 사용하도록 하려면 Kurogo는 string table을 순서대로 search 하고 첫번째 것을 return 하기 때문에 그에 맞도록 string table을 세팅하시면 됩니다.

언어의 순서는 SITE_DIR/config/site.ini의 [site settings] section에 세팅하시면 됩니다. 간단하게 LANGUAGES[] 값들은 우선순위대로 생성하세요. Kurogo는 ISO 국가 지역코드를 사용합니다. Kurogo에서 지원되는 언어코드들을 보시려면 여기로 가세요.


Code Language Name Native Name
af_ZA Afrikaans Afrikaans
am_ET Amheric አማርኛ
be_BY Belarusian Беларуская
bg_BG Bulgarian български език
ca_ES Catalan Català
cs_CZ Czech čeština
da_DK Danie Dansk
de_AT German (Austria) Deutsch (Österreich)
de_CH German (Swiss) Deutsch (Schweiz)
de_DE German Deutsch (Deutschland)
el_GR Greek Ελληνικά
en_AU English (Australia) English (Australia)
en_CA English (Canada) English (Canada)
en_GB English (United Kingdom) English (United Kingdom)
en_IE English (Ireland) English (Ireland)
en_NZ English (New Zealand) English (New Zealand)
en_US English (United States) English (United States)
es_ES Spanish Español
et_EE Estonian Eesti
eu_ES Basque Euskara
fi_FI Finnish Suomi
fr_BE French (Belgium) Français (Belgique)
fr_CA French (Canada) Français (Canada)
fr_CH Frensh (Swiss) Français (Suisse)
fr_FR French Français (France)
he_IL Hebrew עברית
hr_HR Croatian Hrvatski
hu_HU Hungarian Magyar
hy_AM Armenian Հայերեն
is_IS Icelandic Íslenska
it_CH Italian (Swiss) Italiano (Svizzera)
it_IT Italian Italiano (Italia)
ja_JP Japanese 日本語
kk_KZ Kazakh Қазақ тілі
ko_KR Korean 한국어
lt_LT Lithuanian Lietuvių
nl_BE Dutch (Belgium) Vlaams
nl_NL Dutch (Netherlands) Nederlands
no_NO Norwegian Norsk
pl_PL Polish Polski
pt_BR Portuguese (Brazil) Português (Brasil)
pt_PT Portuguese Português
ro_RO Romanian Română
ru_RU Russian Pусский
sk_SK Slovak Slovenčina
sl_SI Slovene Slovenščina
sr_YU Serbian Cрпски
sv_SE Swedish Svenska
tr_TR Turkish Türkçe
uk_UA Ukrainian Yкраїнська
zh_CN Chinese (Simplified) 简体中文
zh_TW Chinese (Traditional) 繁體中文



예제)

LANGUAGES[] = "es_ES"
LANGUAGES[] = "ko_KR"
LANGUAGES[] = "en_US"


스페인어 다음에 한국어 그리고 영어가 세팅돼 있습니다. US English 는 이렇게 표기하지 않아도 자동으로 맨 마지막에 포함되도록 돼 있습니다. 이렇게 표기해도 되구요. 언어의 순서는 서버에 알려주는 겁니다. 그러니까 여러분이 두개의 서버를 가지고 있고 그 서버는 각각 다른 언어를 주요 언어로 사용한다면 Kurogo에서도 MultiSite를 사용해서 서버별로 다르게 language 세팅을 하실 수 있습니다. 그러면 유저에게는 선호하는 언어를 사용하는 서버로 가도록 링크를 걸어서 서비스를 제공할 수도 있겠죠.

Note : 만약에 admin 콘솔을 사용하신다면 오직 primary language만 세팅하실 수 있습니다. 어드민 콘솔은 multiple language를 지원하지 않습니다.

Using String Tables

Kurogo core와 각 모듈들에 모두 string table들이 있습니다 . 각 파일은 strings 폴더에 위치해 있고 language/locality 를 사용한 이름이 주어집니다. Kurogo는 string 테이블에 이 리스트를 merge 해서 프로젝트 내에서 언제든지 override 할 수 있도록 합니다.

Locations include (examples given for US English String tables)

app/common/strings/en_US.ini
app/modules/home/strings/en_US.ini
app/modules/news/stirngs/en_US.ini
SITE_DIR/app/common/strings/en_US.ini (if you want to override Kurogo string values)
SITE_DIR/app/modules/home/strings/en_US.ini (if you want to override the home module string values)
SITE_DIR/app/modules/news/strings/en_US.ini (if you want to override the news module string values)

다른 모든 Kurogo customization 들 처럼 여러분의 site 폴더 안에 파일을 생성하고 수정하실 것을 권장드립니다. 그래야지 나중에 Kurogo 상위버전 업데이트시 수월하게 하실 수 있습니다.

만약에 스페인어 버전을 사용하시고 싶으시면 아래와 같이 파일을 만드시면 됩니다.

SITE_DIR/app/common/strings/es_ES.ini
SITE_DIR/app/modules/home/strings/es_ES.ini
SITE_DIR/app/modules/news/strings/es_ES.ini

Values

각 string 테이블은 key와 values 쌍으로 .ini 파일 안에 들어가 있습니다. 이 string 을 업데이트하시려면 간단히 이 value를 수정하시면 됩니다. 여러분 파일에 모든 key 가 포함돼 있을 필요는 없습니다. 필요한 만큼의 key 만 작성하시면 됩니다.

key들의 이름은 어디에서 사용되는지 찾기 쉽도록 naming 돼 있습니다.

Format Specifiers

어떤 value들은 변수 값을 사용해서 구성 되도록 되어 있습니다. 왜냐하면 각 언어들의 문법이 다르기 때문입니다. 이런 경우 미리 사용할 placeholder가 정의 돼 있을 필요가 있습니다.  아래 예제가 있습니다.

SEARCH_MODULE="Search %s" ; english
SEARCH_MODULE="%s 검색" ; korean


%s 는 module name으로 replace 될 겁니다.

Site Values

여러분 site에서 사용되는 많은 value들은 standard configuration value들 입니다. 또한 여러분 site의 일 부분이기도 하죠. 이것은 다음과 같은 것을 포함하고 있습니다.

* Site name and organization
* Names of modules and page titles
* Home screen icons
* About text
* Feeds (you may wish to choose feeds that contain content in the appropriate language)

좀 더 자세한 사항은 해당 모듈이나 configuration documentation을 보시기 바랍니다.

Summary



1. String key in template or module
2. Kurogo chooses the appropriate string table
3. If there is a value, it replaces any %s
4. Display string


반응형

Handling Corona System Events

2012. 5. 22. 11:06 | Posted by 솔웅


반응형

Handling Corona System Events

어플리케이션을 개발 할 때 유저가 다양하게 여러분의 앱을 다루게 되는데 그에 대해 어떤 동작을 할 수 있도록 기능을 구현하는것은 아주 중요합니다. 또한 유저가 의도했던 안했던 다양한 system 에 대해 반응하는 것도 아주 중요합니다.


예를 들어 만약에 여러분의 앱을 사용하고 있는 중간에 유저에게 전화가 걸려온다던가 혹은 유저가 home 버튼을 누를 수도 있겠죠, 이 경우엔 여러분의 앱은 background에서 작동하고 있을겁니다. suspended나 paused 상태가 되서 말이죠.). 이렇게 suspended 된 상황에서 유저가 다시 앱으로 돌아왔을 때나 앱을 완전히 exit 했을 때도 발생할 수 있습니다.


코로나에서는 이러한 모든 것들을 system 이벤트에서 처리합니다. 오늘은 이 system 이벤트에 대해서 다룰겁니다.





Event Listener

여러분의 코로나 앱에서 system event 모니터링을 시작하기에 앞서 listener 함수를 set up 해야 합니다. 그리고 system 이벤트 리스너 를 add 하셔야 합니다. 만약 여러분이 코로나의 events 와 친하지 않으시다면 The Corona Event Model Explained document 를 먼저 보시고 다음 진도를 나가시라고 권해드립니다.

아래 코드는 event listener를 어떻게 set up 하는지를 보여드립니다. 그리고 글로벌 Runtime object를 add 합니다.  (이 object는 유일하게 system 이벤트를 listen 할 수 있는 object 입니다.)

local function onSystemEvent( event )

    -- Test for different event types here

end
Runtime:addEventListener( "system", onSystemEvent )

applicationStart


local function onSystemEvent( event )
    if event.type == "applicationStart" then

        do_something()

    end
end


위의 샘플코드는 여러분의 system event listener에서 applicationStart 이벤트를 어떻게 테스트 하는지 보여드립니다.

main.lua 가 가동되고 앱이 시작될 때 이 applicationStart 이벤트를 받습니다.

applicationExit

local function onSystemEvent( event )
    if event.type == "applicationExit" then

        do_something()

    end
end


applicationexit 시스템 이벤트는 앱이 끝나기 바로 직전에 dispatch됩니다. (suspending 이 아니라 완전히 끝날 때 입니다.) 이것은 유저가 끝낼 수도 있고 어떤 이유에서인가 시스템이 끝낼수도 있습니다. (메모리 부족 등)

이 이벤트는 앱이 끝나기 직전에 데이터를 저장하고 디비 연결을 끊는 일을 해야 할 때 많이 사용됩니다.

applicationSuspend

local function onSystemEvent( event )
    if event.type == "applicationSuspend" then

        do_something()

    end
end


앱이 실행중에 전화가 온다던가 아니면 유저가 switch out 시킨다던가 또는 유저가 power 버튼을 눌러서 디바이스를 sleep 상태로 돌릴때 여러분의 앱은 suspend 상태로 됩니다. (끝나지는 않은 상태입니다.)

suspended state로 가기 직전에 applicationSuspend 이벤트가 dispatch 됩니다. 이 이벤트를 이용해서 게임을 pause 시키는 일 등을 하실 수 있습니다. (그러면 다시 앱으로 돌아올 때 유저는 이 pause 화면을 볼 수 있을 있겠죠.) 그리고 필요하면 시간을 mark 할 수도 있고 timer나 transision 들을 pause나 stop 시킬 수도 있습니다.

applicationResume

local function onSystemEvent( event )
    if event.type == "applicationResume" then

        do_something()

    end
end


suspended 되기 전에 무엇인가를 할 수 있듯이 앱이 다시 돌아올 때도 무엇인가를 할 수 있습니다. 이렇게 앱이 다시 돌아오자마자 applicationResume 이벤트가 dispatch 됩니다.

Putting it all together

local function onSystemEvent( event )
    if event.type == "applicationStart" then

        -- this block executed when application launches (after main.lua)

    elseif event.type == "applicationExit" then

        -- this block executed just prior to the app quitting
        -- OS closes least recently used app, user explicitly quits, etc.

    elseif event.type == "applicationSuspend" then

        -- this block executed when app goes into "suspend" state
        -- e.g. user receives phone call, presses home button, etc.

    elseif event.type == "applicationResume" then

        -- this block executed when app resumes from "suspend" state
        -- e.g. user goes back into app (while it is still running in bg)

    end
end
Runtime:addEventListener( "system", onSystemEvent )


위 예제는 system event listener 의 기본 골간입니다. 이 예제를 탬플릿으로 사용하셔서 이용하시면 편하실 겁니다. 저 안에 어떤 동작을 넣을 지는 여러분 필요에 따라 구현하셔야겠죠.

이 기능들이 모든 앱에서 반드시 사용되어야 하는 것은 아니지만 많은 경우에 이 기능을 이용하면 아주 훌륭한 앱이 되도록 구현할 수 있을 겁니다.

여러분의 앱을 release 하시기 전에 내 앱이 suspended mode로 됐을 때 내 앱은 어떻게 해야 할까? 다시 돌아올 때는 무엇을 할까? 를 한번 생각 해 보세요. 여러분 앱이 훨씬 수준있는 앱이 될 수 있을 겁니다.



반응형