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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

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로 됐을 때 내 앱은 어떻게 해야 할까? 다시 돌아올 때는 무엇을 할까? 를 한번 생각 해 보세요. 여러분 앱이 훨씬 수준있는 앱이 될 수 있을 겁니다.



반응형

Kurogo Tutorial 12 - Logging in Kurogo -

2012. 5. 21. 22:17 | Posted by 솔웅


반응형

Logging in Kurogo


Kurogo 에는 일반적인 logging과 예외적인 이벤트에 대한 logging이 있습니다. logging 시스템의 목적은 수정될 필요가 있는 중요한 상황에 대해 시스템 관리자에게 알리기 위한 점과 개발자에게 Kurogo code paths를 trace 하고 디버그 할 수 있도록 하기 위함입니다.

디폴트로 Kurogo event들은 SITE_DIR/logs/kurogo.log 에 log 됩니다. 각 entry들은 몇개의 부분들로 구성됩니다.


[date/time] area:priority method URI message


area는 이 메세지를 담당하고 있는 Kurogo component를 string으로 표현합니다. Kurogo는 몇개의 표준 area들을 정의하고 있습니다. 그 외에 개발자들은 필요에 따라 아무런 string을 사용하셔도 됩니다. priority는 이 메세지의 중요성(시급성) 등을 알리는 부분입니다. 이 priority map 들은 syslog function 의 priority들을 따릅니다. function/method는 이 메세지가 어디에서 나왔는지를 알 수 있도록 도와 줍니다. 이 URI는 유저가 본 페이지의 address 입니다.




Log Settings

Kurogo log의 behavior에 영향을 주는 몇가지 세팅이 있습니다. 이것들은 SITE_DIR/config/site.ini 에 위치해 있습니다.

  • KUROGO_LOG_FILE (default LOG_DIR/kurogo.log) - Kurogo log 파일의 위치입니다. 이 위치는 웹서버에 의해 write 가 가능해야 합니다. 여기에 모든 로그 메세지들이 저장되게 됩니다.
  • DEFAULT_LOGGING_LEVEL - logging level을 세팅합니다. 여기서 세팅된 레벨보다 높은 메세지만 log 됩니다. 레벨 이하의 로그는 무시됩니다.  
  • LOGGING_LEVEL[area] - 특별 area에 대한 logging 레벨을 세팅합니다. 이 기능은 개발자들이 특정 area에 대한 메세지만 보고 싶을 때 유용하기 사용하실 수 있습니다. 이 레벨은 이 area 에서 DEFAULT_LOGGING_LEVEL를 override 할 겁니다. 여러분은 원하는 만큼의 area를 override 할 수 있습니다. 

Priority Levels

Kurogo에 의해 사용되는 priority level constants가 있습니다. 대부분의 시스템에서는 이것을LOG_WARNING으로 세팅합니다. 이것을 LOG_INFO나 LOG_DEBUG로 세팅하면 여러분은 더 많은 메세지를 보실 수 있습니다. 일반적으로 디버깅을 위해서는 이것을 warning 보다 낮게 세팅하고 있습니다.

  • LOG_EMERG - system is unusable
  • LOG_ALERT - action must be taken immediately
  • LOG_CRIT -critical conditions
  • LOG_ERR - error conditions
  • LOG_WARNING - warning conditions
  • LOG_NOTICE -normal, but significant, condition
  • LOG_INFO -informational message
  • LOG_DEBUG - debug-level message

Standard areas in Kurogo

아래는 logging 메세지들을 구분하기 위한 Kurogo 내부 area들에 의해 사용되는 area들 입니다. 개발자들은 이 임의의 area를 만들어서 사용하실 수 있습니다.

  • admin - Admin console
  • auth - Authentication and authorization
  • config - Configuration
  • data - Used by libraries that retrieve external data.
  • db - Database
  • deviceDetection - Device Detection
  • exception - Exceptions
  • kurogo - Core functions including initialization
  • module - General module events
  • session - User session management
  • template - HTML templates

Logging in your module or library

Kurogo::log($priority, $message, $area) 메소드는 log에 메세지를 보냅니다. $priority 파라미터는 priority level constants 라야 합니다. message는 string 이어야 하고 area는 여러분이 log 하고 싶어하는 area로 string 이어야 합니다. 여러분은 여러분이 필요한 area에 대해 logging 세팅을 하기 위해 LOGGING_LEVEL[area]를 사용하실 수 있습니다.



반응형

Minority Report

2012. 5. 21. 10:16 | Posted by 솔웅


반응형




















반응형

수요일의 FAQ 5 번째 시간

2012. 5. 21. 06:58 | Posted by 솔웅


반응형

FAQ Wednesday #5


Question 1

Lua File System(LFS)를 추가하셨죠? /Documents directory 에서 파일 리스트를 얻으려면 어떻게 해야하죠?

Answer

Lua File System은 Corona build 2012.805 에서부터 추가됐습니다. 여기에서 튜토리얼을 읽어보실 수 있습니다.

LFS는 subdirectory도 만들고 지우고 접근할 수 있게 됐습니다. 구현은 디렉토리의 path를 담은 string을 만드는게 key 입니다. iOS와 Android에서는 3개의 main directory들이 있습니다. Resource, Temporary 그리고 Documents 가 그것입니다. 이것들은 Corona constant들을 사용해서 접근하게 됩니다. userdata constants들은 LFS에서 사용될 수  있으려면 string으로 변환 될 필요가 있습니다. system.pathForFile 는 userdata constant 로 변환 됩니다. (string 타입으로). 여러분은 base directory와 함께 파일이나 디렉토리명을 명시해주시면 됩니다. 그러면 그것은 전체 경로를 return 하게 됩니다.

local path = system.pathForFile( "data", system.DocumentsDirectory )

위 코드는 다음과 같은 string을 return 할 겁니다. “/var/mobile/Applications//Documents/data”



아래에 file들 리스트를 LFS로 어떻게 출력되게 하는지에 대한 코드가 있습니다.


local lfs = require "lfs"

-- Print the files in the path
--
local function printDir( path )
    print( "\nFiles in path: " .. tostring( path ) )
 
    local pathType = ""
 
    -- Check to see if path exists
    if path and lfs.attributes( path ) then
        pathType = lfs.attributes( path ).mode
    end
 
    if pathType == "directory" then
        for file in lfs.dir( path ) do
            local str

            -- Skip the current and up-one directories
            if "." ~= file and ".." ~= file then
                str = file

                local fileAtr = lfs.attributes( path .. "/" .. file )
                if fileAtr then
                    str = str .. " --> (" .. fileAtr.mode .. ")"
                else
                    str = str .. " --> (none)"
                end

                print( str )
            end
        end
    else
        str = "Path is not a directory!"
        print( str )
    end
end


그리고 아래는 /Documents directory와 /Documents/data subdirectory 를 어떻게 불러서 출력하는지를 보여 줍니다. (만약 존재한다면)

path = system.pathForFile( nil, system.DocumentsDirectory)
printDir( path )
path = system.pathForFile( data, system.DocumentsDirectory)
printDir( path )


위 코드는 파일 이름들을 출력하는 대신 table(배열)에 담아서 활용할 수도 있을 겁니다.


Question 2


Resource 디렉토리의 파일에 접근을 시도할 때 warning과 error를 하나씩 받았습니다. 이거 버그인가요?


Answer

system.pathForFile 를 사용하고 베이스 디렉토리가 system.ResourceDirectory 일때  코로나는 file이 존재하는지 살펴보고 그 path에 대해 nil 값이 받아지면 warning 메세지를 발생시킵니다. 그런데 이것은 filename 파라미터가 실제로 디렉토리 이름이면 작동하지 않습니다. 이것을 이용해서 다음과 같은 트릭을 쓰기도 합니다. 

local path = system.pathForFile( nil, system.ResourceDirectory )


이렇게 하면 warning 메세지를 발생하지 않습니다. 그리고 Resource directory를 가리키는 string을 return 하죠. 이 Resource directory 밑에 subdirectory 의 경로를 생성할 필요가 있으면 다음과 같이 이것을 append 하시면 됩니다.

path = system.pathForFile( nil, system.ResourceDirectory)
printDir( path )
path = system.pathForFile( nil, system.ResourceDirectory) .."/".."data"
printDir( path )

Note : system.ResourceDirectory는 안드로이드에서는 Resource directory가 실제 file system의 일부분이 아니기 때문에 작동하지 않습니다.

그리고 Resource directory는 read-only 디렉토리라서 write 할 수 없다는 것도 기억하세요.


Question 3

single touch app에 Multitouch 세팅하기

Answer

이건 질문은 아니지만 하나의 tip으로서 알려드립니다. 코로나에서 디폴트는 multitouch off 입니다. 이 말은 touch listener 가 있다면 한번에 하나의 touch 이벤트를 받는 다는 말입니다. 만약에 유저가 스크린을 터치하고 있는데 다른 손가락으로 버튼을 tap 한다거나 다른 객체를 move 하면 아무 일도 일어나지 않습니다. 왜냐하면 이미 다른 touch 가 active 돼 있기 때문이죠. 이것은 landscape 모드에서 유저가 손가락을 스크린에 대고 있느라고 자주 발생할 수 있는 현상이죠.

해결 방법은 여러분 코드에 아래와 같이 구현하는 겁니다.

system.activate( "multitouch" )

이렇게 하면 스크린에 손가락으로 하는 모든 touch에 touch event를 발생할 겁니다. touch 리스너를 걸어놓은 객체를 터치하지 않는 이상 아무일도 발생하지 않을 겁니다. 그리고 리스너가 있는 객체를 터치하면 동작이 일어나구요. 그렇게 되면 좀 더 user friendly 한 앱이 될 겁니다.


Question 4

iOS에서 앱 아이콘의 badge number를 어떻게 clear 하게 할 수 있을까요?


Answer


Local Notification은 해당 Notification이 일어나면 앱의 아이콘에 badge number를 세팅할 겁니다.(그것은 뭔가 pending 된게 있다는 것을 알리기 위함이죠.) 하지만 이것을 어떻게 clear 시킬 수 있을 까요? 해답은 native.setProperty API에 있습니다.

native.setProperty( "ApplicationBadgeIconNumber", 0 )

이렇게 하면 앱 아이콘에 있는 badge number를 없앨 수 있습니다.

아래 badge를 clears 시키는 Local Notification code 예제가 있습니다.

display.newText( "Setting Local Notification ...", 10, 30 )

-- Options for iOS
local options = {
   alert = "Wake up!",
   badge = 1,
   sound = "alarm.caf",
   custom = { foo = "bar" }
}

-- schedule using UTC (Coordinated Universal Time) time + 60 seconds
local utcTime = os.date( "!*t", os.time() + 60 )
local notification = system.scheduleNotification( utcTime, options )

-- Local Notification listener
local notificationListener = function( event )
   display.newText( "Notification Received " ..  event.badge, 10, 70 )
   native.setProperty( "applicationIconBadgeNumber", 0 )
end

Runtime:addEventListener( "notification", notificationListener )

Note: badge number 가 증가하거나 감소하는것에 대해서 badge 관련된 부분의 documentation에 설명 돼 있습니다. 이것은 애플의 documentation에서 인용한 겁니다. 그리고 그 의미는 여러분이 코드 내에서 그 badge number를 증가시키거나 감소시킬 수 있다는 것이죠. 코드 내에서 여러분이 명시한 badge number는 icon 에 display 되게 됩니다. 이 badge number 를 0으로 세팅하면 badge를 clear(remove) 하게 됩니다.

Local이나 Push Notification은 아직까지 iOS에서만 가능합니다.

Question 5

유저가 스크린을 터치하지 않고 있으면 device가 sleep 모드로 가는데 제가 만든 게임을 하는 동안에는 그 현상이 안 일어났으면 좋겠습니다. 가능한가요?


Answer

Yes, and the solution is one of the “system” APIs that works on both iOS and Android (but not in the simulators).

가능합니다. system API를 이용하시면 iOS와 Android 모두에서 가능합니다. (시뮬레이터에서는 안 됩니다.)

system.setIdleTimer( false )  -- disable device sleep mode

idle timer를 false로 해서 디바이스가 sleep 모드로 가지 않도록 합니다. true로 가면 sleep 모드로 가게 됩니다. 디폴트는 true 입니다. 이것을 false로 하면 디바이스의 배터리가 더 빨리 닳을 수가 있다는 것을 감안해서 사용하시기 바랍니다.

여기까지가 오늘의 Question들 입니다. 여러분에게 유용한 정보가 되었기를 바랍니다.

감사합니다.


반응형


반응형

스페인에서 Corona SDK 대사로 활동하고 있는 Tomas라는 친구가 전 세계적인 Corona 연맹 결성을 제안했습니다. 좀 황당하게 들렸지만 글을 읽어보니 열정이 느껴지네요. ^^



Spain’s Corona Ambassador and owner of Inkubica Labs, Tomas Martinez Buero, is calling on developers around the world to form a Corona Alliance. The Spanish chapter’s first Corona SDK Meetup will be taking place on May 31 in Madrid – don’t forget to register if you’re in the area!


스페인의 코로나 명예대사이자 Inkubica Labs의 owner인 Tomas Martinez Buero는 전세계적으로 코로나 연맹을 결성할 것을 제의했습니다. Spanish 쪽의 첫번째 Corona SDK Meetup이 5월 31일 마드리드에서 열릴겁니다. 근처에 사시는 분은 꼭 register하시는 것을 잊지 마세요.





Inkubica Labs is a software “gamification” company that is constantly improving its platform for edutainment apps, interactive books and serious games. The demand for these kind of apps is so big that we are looking for studios and independent Corona SDK developers worldwide to create a Corona Alliance!


Inkubica Labs은 edutainment apps, interactive books와 게임등을 꾸준히 개발하면서 성장해가는 software “gamification” company 입니다. 이런 종류의 앱들에 대한 수요는 아주 많습니다. 그래서 우리는 전세계적인 개별 코로나 SDK 개발자들이 참여하는 Corona 연맹을 만들기를 원합니다.


Inkubica Labs is the dream of two entrepreneurial Computer Sciences engineers, my partner Oscar Cuenca and I, who think that intelligent production of software can change the world. The name of Inkubica has two meanings: the broader one, that is related to the fact that we incubate business projects based on software, and the more specific one, associated with what we are doing now, “raising the INK into the third dimension.” (We help publishers produce interactive books and edutainment apps around the world.)


Inkubica Labs는 두 기업가 마인드를 가진 컴퓨터 공학들의 꿈입니다. 제 파트너인 Oscar Cuenca와 저는 intelligent 한 소프트웨어 제품이 세상을 변하게 할 수 있다고 생각합니다. Inkubica라는 이름은 두가지 의미가 있습니다. 하나는 더 넓게 라는 의미이고 이것은 소프트웨어분야를 바탕으로 비지니스 프로젝트를 incubate 하겠다는 것과 관련이 있구요. 두번째는 좀 더 specific 한 이란 뜻으로 지금 현재 저희가 하고 있는 “raising the INK into the third dimension.” (잉크를 3차원으로 끌어올리자... 라고 해석하면 될까요???;;)와 관련 돼 있습니다. (우리는 전 세계적으로 interactive book이나 edutainment app 들을 만들어내는 publisher들을 도와주고 있습니다.)


The Inkubica Labs team has very solid experience developing many kinds of software. In 1999, we programed our first mobile applications, starting with WAP when it wasn’t available for mobile! At that time, we were visionaries but we came too early. In 2001, we were expecting to see many mobile devices using 3G with WAP, and we were not the only ones to fail in these predictions. Now, we don’t need to be visionaries to know that this is a big time for mobile apps. And in regards to tablets, that’s a whole new world we didn´t predict 13 years ago!


Inkubica Labs 팀은 다양한 종류의 소프트웨어를 개발한 경험을 가지고 있습니다. 1999년에 우리는 첫번째 모바일 애플리케이션을 프로그래밍 했습니다. WAP을 사용한다는 개념이었는데요. 당시에는 이것이 모부일쪽에 사용되지 않을 때였습니다. 당시 우리는 공상가였을 뿐이지만 그것이 현실화 되는 것은 생각보다 빨리 왔습니다. 2001년 WAP과 함께 3G를 사용하는 많은 모바일 디바이스를 기대했었습니다. 지금은 여러분이 아시다시피 모바일앱이 더이상 공상이 아니라 실제로 큰 시장이 돼 버렸습니다. 그리고 태블릿쪽은 13년전에 우리가 상상하지도 못했던 분야입니다.


So here we are, in our second opportunity to be successful with mobile (and now with tablets too). The first thing we decided was to chose the right partners. After evaluating several tools, frameworks, platforms, etc. we fell in love with Corona SDK, not only because it enables us to code once and have the apps ready for iOS and Android, but also because we found very powerful APIs that help us do complex things very fast. And speed is the key of this market!


이제 우리는 모바일로 두번째 성공할 기회를 맞고 있습니다.(뿐만아니라 태블릿도 있죠.) 첫번째로 우리는 좋은 파트너를 골라야겠다고 결심했습니다. 여러 툴들과 프레임워크들과 플랫폼 등등에대한 검토 결과 Corona SDK 와 사랑에 빠지게 됐습니다. 한번 코딩해서 iOS와 안드로이드에 동시에 빌드할 수 있다는 이유만이 아닙니다. 아주 복잡한 것을 쉽고 빠르게 구현하게 해 주는 아주 powerful한 API도 중요한 이유입니다. 속도(빠른 대응)은 시장에서 가장 중요한 요소입니다.


We want to keep moving with the support and improvements of Ansca Mobile – developing apps with geolocalization, augmented reality, simulations, and QR codes and are very interested in forming a Corona Alliance. The main publishers of the Spanish and Portuguese speaking world have headquarters in Spain, with offices in Brazil, Mexico, Argentina, Chile, Colombia, Portugal, and Peru. Let’s join forces and go for them together! You don’t need to speak Spanish or Portuguese to work with us, but we do ask that you can communicate in English. :-)


우리는 Ansca Mobile의 지원과 꾸준한 성능향상과 함께 나갈겁니다. developing apps with geolocalization, augmented reality, simulations, and QR codes 들은 Corona 연맹의 주요 관심사항들 입니다. 스페인어와 포르투갈어를 사용하는 세계의 헤드쿼터는 스페인에 있습니다. 그리고 지부 사부실은 브라질과 멕시코, 아르헨티나, 칠레, 콜롬비아, 포르투갈 그리고 페루에 있습니다. 들어오셔서 같이 합시다. 우리와 같이 일하기 위해 꼭 스페인어와 포르투갈어를 사용하실 필요가 없습니다. 그런경우 영어로 소통할 수도 있습니다.


If you are interested, just send me an mail to tomas.martinez@inkubica.com.

On May 31, we will be hosting the first Corona SDK Meeting in Spain! Please join us and register here.


관심 있으시면  tomas.martinez@inkubica.com로 메일을 보내주세요. 5월 31일 우리는 첫번째 corona SDK Meeting을 스페인에서 가질 예정입니다. 함께 하시려면  here에 등록해 주세요.


Tomas Martinez Buero, Inkubica Labs


Madrid, Spain


반응형