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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

이클립스에 폰갭 설치하기

2012. 6. 22. 23:58 | Posted by 솔웅


반응형

phonegap-android-eclipse-quickstart


Requirements

 

이 글은 이미 안드로이드 SDK를 인스톨 했고 제대로 작동 되는 상황에서 직접 해 보실 수가 있습니다. 아직 안됐으면 먼저 Android SDK를 설치 하시고 진행하세요. 여기에서 다운로드 받으시면 됩니다. 그리고 최소한 한개 이상의 Android virtual device(AVD)를 생성해 놓으셔야 합니다. 안드로에드 에뮬레이터에서 여러분이 만든 프로젝트를 돌릴려면 AVD가 필요합니다.

 

You also need to: 또한 폰갭도 필요하겠죠.

 

이클립스에 이미 Android SDK 가 세팅 돼 있어야 겠죠. Window > Preferences > Android 를 여시고 아래와 같이 됐는지 확인해 보세요.




이제 여러분은 샘플 프로젝트를 빌드하시거나 새로운 프로젝트를 만드실 수 있습니다.

 

Building The Sample Project

 

File > New > Android Project

 

  • Create new project from existing source 를 선택하세요.
  •  Browse를 클릭하시고 다운로드 하신 폰갭에서 제공된 샘플 앱이 있는 곳을 찾아가세요.



오래된 안드로이드 버전을 사용하셔도 됩니다. 최신 버전의 SDK도 사용가능합니다. 어느것을 선택하시던 폰갭이 알아서 처리할 겁니다. 다만 이글을 쓰는 시점에 다운받은 폰갭 0.9.4 는 안드로이드 3.0과 문제가 있을 수 있으니 2.2나 2.3을 먼저 사용해 보세요.

 

(이 부분에서 이클립스가 phonegap.jar를 찾지 못하면 에러를 보실 수도 있습니다. 이런 경우 /libs 폴더에서 오른쪽 마우스를 누르시고 Build Paths/ > Configure Build Paths로 가 주세요. 그리고 나서 Libraries tab에서 phonegap.jar를 Project에 add 하세요. 이클립스가 제대로 표시하지 못한다면 여기서 refresh(F5)를 하시면 제대로 표시 할 겁니다.)

 

이제 여러분은 여러분의 프로젝트를 안드로이드 어플리케이션으로 돌릴 수 있습니다. 프로젝트에서 오른쪽 마우스를 누르시고 Run As 로 가셔서 Android Application 을 클릭하세요. 이클립스가 AVD를 선택하라고 할 수도 있습니다. 만약에 없으면 이때 create 하셔도 됩니다. 미리 생성해 놓으셨다면 선택하시고 진행하시면 됩니다.





Creating A New Project

 

File > New > Android Project




And give it some sensible defaults.




오래된 안드로이드 버전을 사용하셔도 됩니다. 최신 버전의 SDK도 사용가능합니다. 어느것을 선택하시던 폰갭이 알아서 처리할 겁니다.

 

여러분이 다운로드 받으신 폰갭에서 우리는 아래 두개의 파일이 필요합니다.

  1. Android/phonegap-1.0.0.jar
  2. Android/phonegap-1.0.0.js

 

이클립스에서 생성하신 프로젝트의 root 디렉토리에 아래 두개의 디렉토리를 생성하세요.

  1. /libs
  2. /assets /www

 

위 두 파일을 복사해 넣으세요.

  1. Android/phonegap-1.0.0.jar to /libs 
  2. Android/phonegap-1.0.0.js  to /assets/www

 

이클립스에서 Package Explorer에서 해당 프로젝트를 선택하신 후 refresh(F5)를 해 주세요. 복사해 넣은 두개의 파일이 보이실 거예요.

 

Now, create index.html in your www folder and add some code like so:

이제 www 폴더에 index.html을 생성하세요. 그리고 아래 코드를 복사해 넣으세요.


<!DOCTYPE HTML>
<html>

  <head>
    <title>PhoneGap</title>

  <script type="text/javascript" charset="utf-8" src="phonegap-1.0.0.js"></script>      

  <script type="text/javascript" charset="utf-8">

     function onLoad(){

          document.addEventListener("deviceready", onDeviceReady, true);

     }

     function onDeviceReady(){

          navigator.notification.alert("PhoneGap is working");

     }

  </script>

  </head>

  <body onload="onLoad();">
       <h1>Welcome to PhoneGap</h1>

       <h2>Edit assets/www/index.html</h2>

  </body>

</html>

 




이클립스의 src 폴더에 있는 main 자바 파일을 약간 수정해 주세요.

  1. 클래스의 extend를 Activity에서 DroidGap으로 바꿔주세요.
  2. Replace the setContentView() line 을 super.loadUrl("file:///android_asset/www/index.html"); 로 바꿔주세요.
  3. Add import com.phonegap.*;




(이 부분에서 이클립스가  phonegap-1.0.0.jar를 찾지 못하면 에러를 보실 수도 있습니다. 이런 경우 /libs 폴더에서 오른쪽 마우스를 누르시고 Build Paths/ > Configure Build Paths로 가 주세요. 그리고 나서 Libraries tab에서 phonegap-1.0.0.jar를 Project에 add 하세요. 이클립스가 제대로 표시하지 못한다면 여기서 refresh(F5)를 하시면 제대로 표시 할 겁니다.)

 

마지막으로 폰갭이 제대로 동작할 수 있도록 AndroidManifest.xml 파일에 몇개의 퍼미션을 추가하겠습니다.

여러분이 사용하시는 에디터로 매니페스트 파일을 열어 주세요. 그리고 versionName과 application 태그 사이에 아래 내용을 복사해서 넣어 주세요.


<supports-screens
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:resizeable="true"
        android:anyDensity="true"
        />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
        <uses-permission android:name="android.permission.READ_CONTACTS" />
        <uses-permission android:name="android.permission.WRITE_CONTACTS" />   
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 




AndroidManifest.xml에서 activity 태그에 아래 attribute 가 있어야 합니다.

 

    android:configChanges="orientation|keyboardHidden"

 

이건 뭘 말하냐 하면요. 안드로이드는 이런 이벤트들이 일어날 때 index.html을 reload 하지 않을거란 겁니다. phonegap이 이 이벤트들에 대해서 핸들링 할 겁니다.

 

마지막으로 다운로드 받으신 폰갭의 xml 폴더를 카피하셔서 여러분 프로젝트의 res 폴더에 넣으세요.

 

이제 여러분은 여러분의 프로젝트를 Android Application으로 실행하실 수 있습니다. 프로젝트에서 오른쪽 마우스를 클릭하신다음에 Run As -> Android Application을 선택하세요. 이클립스가 AVD를 선택하라고 물어볼 겁니다. AVD를 생성하지 않으셨으면 새로 생성하시고 이전에 생성하셨으면 그걸 선택해서 계속 진행합니다.

 

AVD가 적용되서 에뮬레이터가 뜨는데는 시간이 걸릴겁니다. 그리고 에뮬레이터가 뜬 후에도 조금 기다리시면 여러분이 만든 프로젝트가 화면에 실행 되는 걸 보실 수 있습니다.




 

 

Have fun!


반응형

Corona SDK: New public release

2012. 6. 22. 09:12 | Posted by 솔웅


반응형
Posted on . Written by


이번에 public release로 2012.840 이 릴리즈 됐습니다.

새로운 버전에는 아주 많은 기능들이 추가 됐고 버그들도 많이 수정됐습니다. 유료사용자분들은 이미 알고 계시겠지면 새로운 분들을 위해서 아래 주요한 내용들을 정리해 드리겠습니다.


  • In-app purchase on (Google Play/Android Marketplace)
  • Remote push notifications (iOS)
  • Game Center (iOS)
  • Facebook Single-sign on
  • Lua File System for creating, removing, getting contents of directories
  • Native video and web display objects (iOS)
  • And much more — you can read them all in the release notes.


저희는 지금 여러 기능들을 추가하고 고품질의 daily build를 제공하기 위해 새로운 지점에 와 있습니다.


다음주에 시작해서 최근에 말씀드린 첫번째 feature cycle을 시작할 겁니다. 바로 2-on-2 development의 일부분입니다. push 기능과 버그 수정입니다. 이 사이클이 끝날 즈음에는 여러분들이 이 기능을 앱 스토어 -iOS App Store, 구글 플레이, Nook Store, Amazon App Store- 에 출판할 수 있게 될 겁니다.


여러분들이 많이 원하시는 기능들에 대한 개선도 있습니다. 어느 정도 개발 이 완ㄹ 되면 daily build를 통해 여러분께 선보일 겁니다. 그리고 진짜 cool 한 SDK feature와 관련되서도 작업을 하고 있습니다. 여러분들께 말씀 드릴 수 있는 것은 저희 내부 적으로 부르는 이름인데요. Aloha 와 Flatland 입니다. 이게 공식적인 이름이 될지는 아직 모릅니다. 다만 daily build release에 이 기능이 추가 되서 언급이 되면 여러분들이 생소하지 않으시라고 이름을 알려 드립니다.




Posted on . Written by


Corona Labs Celebration Sweepstakes에 이미 참가하시고 새로운 페이스북 페이지에 support 해주신 많은 분들께 감사드립니다. 콘테스트가 아직 반도 안 왔습니다. 아직 여러분께 알려드릴 많은 상품들이 있습니다. 단지 여러분이 하실 일은 한번  enter 하세요 그리고 저희의 새로운 Corona Labs Facebook page 에 Like 를 남겨 주세요. 아주 쉽죠? 일찍 enter 하실 수록 상품을 탈 가능성이 점점 커집니다. 주저하지 마세요.


콘테스트를 실시한 이후로 3명의 당첨자가 나왔습니다. 깔끔한 Corona Swag Pack 을 받으신 Justin Giles 그리고 100불 상당의 아이튠즈 상품권을 받으신 Nick Anderson씨에게 축하드립니다. 그리고 조만간 Corona Book Collection 당첨자가 나올 겁니다.



What are the prizes and when will winners be announced?


이번 콘테스트에서 대상은 3천불 상당의 Corona Enterprise license입니다. 저희들은 매일 정오에 다른 상들에 대해 추첨을 할 겁니다. 그 스케줄은 아래와 같습니다.


Friday, June 22: 1 seat to a year-long Corona Levels subscription (currently in Beta)
Monday, June 25: 6 month Corona Pro subscription
Tuesday, June 26: 1 hour of Premium Support
Wednesday, June 27: 1 seat to a year-long Corona Enterprise license (worth $3,000!)



How can I enter the contest?


아주 간단합니다. form을 작성해 주시고 Facebook 의 Corona Labs에 Like를 남겨 주세요. 일찍 enter 할 수록 당첨될 확률이 더 높습니다. 마감은 6월 28일 정오까지 입니다. (미국 Pacific Time)


Thanks for entering and good luck!



Posted on . Written by




Roberto Ierusalimschy 씨가 Corona Labs의 가족이 되서 technical advisor and mentor 로 도움을 주시게 된 것을 진심으로 진심으로 환영합니다.  많은 분들이 아시듯이 Roberto는 Lua 의 핵심 architect 입니다. 코로나 앱이 이 언어를 사용하고 있고 gaming 부분에서는 표준으로 통하고 있죠.

저는 2010년에 Game Developer’s Conference (GDC SF)에서 Roberto를 처음 만났습니다. 그는 참 겸손했습니다. 올해 초 그는 스탠포드 대학교의 visiting professor로 초청됐습니다. 몇달 전 저녁식사 자리에서 스탠퍼드에서 연구한 결과에 대해서 아주 강조했던 것을 기억합니다. 그러면서도 자신의 공은 별로 없는 듯이 얘기 하더군요. 그래서 제가 농담 겸 해서 그와 그의 동료들이 있었기 때문에 GDC 가 존재할 수 있었다는 것을 다시 상기 시켜 줬습니다.  Roberto를 부끄러워하게 만들 수 있는 한가지 방법은 그를 과도하게 칭찬하는 겁니다.


Roberto와 그의 동료인 Luiz Henrique de Figueiredo 그리고 Waldemar Celes 의 업적에 의해 얼마나 많은 삶들이 영향을 받았는지 모릅니다. Lua는 embedded device에서 스마트폰 그리고 데스크탑 컴퓨터까지 애플리케이션을 만드는데 아주 광범위하게 사용되고 있습니다. 얼마나 많은 사람들이 Rovio의 앵그리 버드를 사용하는지를 한번 생각해 보세요. 얼마나 많은 사람들이 얼마나 오랫동안 World of Warcraft를 즐기는지를 생각해 보세요. 얼마나 많은 사람들이 Adobe Photoshop Lightroom으로 사진을 편집하나요.


Roberto는 분명히 이 우주에 그의 족적을 뚜렷이 남겼습니다. 우리의 목표를 향해 나아가는데 이 보다 더 좋은 멘토는 없을 겁니다.




반응형


반응형

Guided Tour of Corona’s API Reference

Posted on . Written by



이번주의 튜토리얼은 약간 다른겁니다. 코로나의 다른 기능들에 대해 다루기 보다는 어느 특정 기능보다도 더 중요하다고 할 수 있는 전체 코로나 개발에 대한 측면에서 바라볼 겁니다. 여러분이 오늘 배우실 것은 여러분이 코로나 프로젝트를 진행하면 반드시 사용하셔야 하는 분야 입니다. 바로 Corona SDK API Reference 이죠


Corona API Reference는 코로나의 특정 기능을 어떻게 사용하느냐에 대해서 배울 수 있는 문서 입니다. 특정 이벤트나 객체 타입에 대한 정보도 얻을 수 있고 항상 사용하셔야 할 자원입니다. 그러므로 이에 대한 튜토리얼을 소개하는 것은 당연하게 필요한 것이겠죠.


만약 여러분이 아직까지 API Reference를 충분히 활용하지 못하고 계신다면 처음에는 너무 많은 정보와 배울것들이 있다고 느낄겁니다. 오늘 제가 전반적인 내용을 훑어서 알려드리겠습니다. 그리고 이 Corona API reference가 더 좋아질 수 있도록 여러분이 도움을 주실 수 있는 방법도 알려드리겠습니다.


Interface Overview


코로나로 앱을 개발하기 위해 API를 많이 참조하시는 분은 지난주 이 API reference 웹 페이지가 새로 개편된 것을 보셨을 겁니다. 예전 페이지를 많이 참조하셨던 분들은 이번에 인터페이스가 완전히 바뀌어서 약간 불편해 하시는 분도 계실 수 있습니다. 하지만 조금 더 써보시면 훨씬 좋아졌다는 것을 느끼실 겁니다. 새 창이나 새 탭에 Corona API Reference를 띄우시고 아래 내용을 쭉 따라가 보세요.


Navigation and Sidebar


위쪽 sidebar에 있는 navigation bar는 보시면 아실 겁니다. 코로나의 전체 documentation을 크게 3부분으로 나눠서 각 section으로 갈 수 있도록 만들었습니다.

왼쪽은 각 세부 섹션들에 직접 갈 수 있는 링크들이 있습니다.  Jump to... 드롭 다운 메뉴도 이 좌측 링크들과 비슷한 역할을 합니다. 하지만 좌측 메뉴는 그 세부 섹션 페이지로 가는데 반해 이 드롭다운 메뉴는 현재 페이지 내에서 해당 항목으로 가는 겁니다. (페이지가 바뀌지는 않습니다.)





이 API Reference page는 코로나의 모든 함수, 이벤트, 프로퍼티, object methods 그리고 data type 들에 대한 리스트가 있는 index 입니다. 여러분이 무엇을 찾는지 확실하게 아신다면 ctrl+F 를 누르셔서 검색하는 게 가장 빠른 방법입니다. 또 다른 유용한 기능은 아래쪽에 있는 바로 breadcrumbs 라고 합니다. 이 하단의 바는 항상 있는데요. 여러분이 지금 어디에 있는지 알려주는 역할을 합니다.






API Reference Columns


API Reference index (home) page에 보면 3가지 주제로 나뉘어져 있는 걸 보실 겁니다. -Libraries, Events, Types -




Libraries  컬럼은 Corona에 내장된 함수의 리스트 입니다. (display.newImageRect()나  storyboard.gotoScene() 같은). Events 리스트는 다양한 이벤트의 종류를 열거했습니다. 그리고 각 이벤트들에 대한 연관된 프로퍼티들도 있구요.Types 는 코로나의 여러 데이터 타입들을 포함하고 있습니다. 그리고 Library 함수들에 의해 생성된 객체들하구요 그와 관련된 프로퍼티와 메소드들(특정 객체 타입에 attached 된 함수들)이 있습니다.


Reference Pages


각각의 API reference 페이지들은 특정 함수와 프로퍼티 등에 대해 여러분들이 알아야할 모든 정보가 있습니다. 만약 여러분이 이 library 함수에 대한 아무 페이지나 보시게 되면 -예를 들어 display.captureScreen() 같은 - 아래 이미지와 같은 내용을 보실 겁니다. 보시면 아시겠지만 이전의 API reference 보다 더 많은 정보들이 있습니다.


딱 보면 어떤 종류의 객체(혹은 데이터 타입)를 이 함수가 return 하는지 Revision (Build)이 뭔지, parent library 는 뭔지 그리고 관련된 키워드는 무엇이 있는지 그리고 연관된 링크(다른 API나 튜토리얼, 외부 웹페이지 등) 등을 보실 수 있습니다. 다른 타입의 API 페이지는 윗 부분에 다른 내용들이 있을 겁니다. 그건 그 타입에 걸맞는 내용들입니다.




좀 더 아래쪽에는 overview가 있습니다. 여기에는 일반적으로 조심해야 될 부분이나 헛갈리는 부분에 대한 설명이나 syntax structure, 관련된 함수 파라미터들 그리고 예제들이 있습니다.


Searching the Documentation


만약 여러분이 특정 API 페이지를 찾으셔야 한다면 home/index 페이지로 가세요. 그리고 브라우저에서 page search 를 하시던가 좌측 메뉴 링크를 이용하시던가 Jump To 드롭다운 메뉴를 이용하세요. 그런데 그 API의 정확한 이름을 모르신다면 전체 Corona Docs에서 키워드를 사용해 검색을 하실 수 있습니다. (구글에서 검색하시는 것처럼요). 검색 필드는 오른쪽 위에 있습니다. (아래 이미지를 참조하세요.)





검색 결과는 구글이 코로나 내의 블러그나 API reference page 들에서 검색한 내용입니다. images를 타입하시고 엔터키를 쳐 보세요. 그 정확도에 놀라실 겁니다.


Help Improve the API Reference


새로운 API reference는 이전 API reference 보다 많이 개선 되었습니다. 하지만 완벽한것은 아니라는 것을 저희들은 압니다. 우리가 중요한 것을 간과하거나 잊어버리고 만들었을 수도 있습니다.  (그것이 이전 API reference에 있었을 수도 있고 없었을 수도 있구요.)  어딘가 오탈자가 있을 수도있구요. 예제가 있어야 되는데 빠져 있을 수도 있구요.


코로나 API Reference 웹사이트는 계속 보완을 해 나갈 겁니다. 그리고 저희 스스로도 계속 보완할 내용을 찾는 작업을 할테고 여러분의 feedback 도 계속 받겠습니다. 특정 API 페이지에서 어떤 잘못 된 것을 발견하시거나 빠진것을 발견하시면 저희에게 알려 주세요. 그 방법은 아주 간단합니다. 각 API Reference Page의 아래쪽에 3개의 링크를 보실 수 있을 겁니다. 관련된 링크를 누르고 그 내용을 넣어 주시면 됩니다.




그러니까 API 에 관련해서 잘못 된 부분을 알려주시려면 이 블로그 글의 댓글을 달기 보다는 해당 API 페이지에 가셔서 밑에 있는 링크를 누르고 알려 주시면 감사하겠습니다. 그 링크를 누르시면 몇개의 checkbox들이 있을 겁니다. 그리고 comment 필드도 있구요. 관련 사항에 체크하시고 가급적이면 자세하게 코멘트를 달아 주세요.


여러분들 중에 이미 많은 분들이 이 feedback form을 사용해 보셨을 겁니다. 이 웹사이트를 지난주에 오픈했는데도 이미 많은 글들이 올라왔거든요. 저희들의 실수를 지적해 주신 모든 분들께 감사드립니다. 그리고 의견을 올려 주신분들도 감사드리구요. 여러분들 중에 몇분은 아주 잔인할 정도로 정직하시더라구요. 그게 바로 저희들이 원하는 겁니다. 계속 와 주세요. 지금 코로나의 함수들, 이벤트들 그리고 객체 프로퍼티와 메소드들에 대해 정통한 정보를 찾아서 사용 하세요.


Still confused?


만약 API Reference 페이지가 아직 헛갈리시면 그리고 어디서부터 시작해야 할 지 모르시면 우선 보실 필요가 있는 곳이 Guides 섹션 입니다. 여기에는 초보자 분들을 위한 Corona SDK Quick-Start 가 있습니다.



반응형


반응형

Applying Basic Animation with Transitions

Posted on . Written by


하지만 그 외에도 display objects에 대해 기본적인 애니메이션 효과를 제공하도록 하는 기능들도 유용하게 사용 하실 수 있습니다. 객체를 계속 회전시킨다던지 투명도를 주었다 뺐다 하던지 한 곳에서 다른 곳으로 이동을 시킨다던가 아니면 위 세가지를 모두 합쳐서 어떤 효과를 낸다던가 하는 일을 코로나의 transition library 를 통해서 구현하실 수 있습니다.


이 글은 주로 이 transition.to()함수에 대해 다룰 겁니다. 코로나의 transition library를 사용할 때 가장 많이 사용해야 할 함수죠. 대략적으로 정리하자면 transition.to() 는 두개의 파라미터를 사용합니다. 애니메이션 효과를 줄 객체와 그리고 회전, 투명도 x,y 값의 combination으로 구성되는 ending property 들의 조합인 table로 구성돼 있습니다. 그리고 이 transition에 걸릴 시간과 옵션으로 이 transition이 끝났을 때 호출될 함수도 넣을 수 있습니다. 이 transition이 시작되면 이 객체의 현재 value들은 여러분이 정해준 값으로 "tweened" 됩니다.


여러분이 코로나를 이용해 게임등의 앱을 개발하면서 충분한 시간을 투자할 수 없는 상황이라면 아마도 이 함수를 사용하실 겁니다. 이 함수는 아주 많이 유용하거든요. 여러분도 아시게 되겠지만 이 함수는 사용하기에 아주 많이 쉽기도 하거든요.




Fading an Object


아주 기초적인것 부터 시작하겠습니다. 우리는 객체를 생성할 거고 이 객체가 점차 투명해져서 사라지도록 만들 겁니다. 여러분들도 이미 아시겠지만 display object의 alpha 프로퍼티가 그 객체의 opacity를 담당하고 있습니다. 그래서 그 프로퍼티를 transition.to() 함수에 pass 해서 1.0에서 0 이 되도록 만들 겁니다. (1.0은 투명도가 전혀 없는 상태고 0은 완전 투명해서 안 보이는 상태입니다.)

아래 예제를 보세요. 우리는 이렇게 객체가 사라지는 시간을 3초로 정할겁니다. (3000 milliseconds)


local obj = display.newImage( "image.png" )

-- center the object

obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent

transition.to( obj, { time=3000, alpha=0 } )


위 코드는 객체를 생성하고 "tweens" 해서 그 alpha 프로퍼티를 1.0에서 0으로 3초동안에 변화 시키도록 하는 겁니다. 아주 간단합니다. 이제 저 객체가 완전히 투명해져서 안 보이게 되면 그 객체를 완전히 remove 해 버리죠. 이 transition이 끝났을 때 실행 될 함수를 call 할 수 있습니다. 그걸 하려면 onComplete 파라미터를 사용하시면 됩니다.


local obj = display.newImage( "image.png" )

-- center the object

obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

local function removeObject( object )

    object:removeSelf()
    obj = nil   -- nil out original reference (upvalue)
end

-- fade object to completely transparent

transition.to( obj, { time=3000, alpha=0, onComplete=removeObject } )


NOTE: 저 객체의 transition이 첫번째 argument에서 onComplete 리스너 함수까지 어떻게 진행되는지 그리고 구현하는것이 얼마나 쉬운지 보세요. 이것을 활용해서 여러 transition들에 대해 이 한가지의 listener를 만들어서 사용하실 수 있습니다. 또는 저 객체가 out of scope 일 때도 그 리스너를 사용하셔도 됩니다.


Moving Objects


transition.to() 함수의 아주 유용한 부분중의 하나는 한번에 tweening 하는데 한가지만의 프로퍼티만 사용하라는 법이 없다는 겁니다. 우리 첫번째 예제를 조금 바꿔서 그 객체를 좌상단에서 우 하단으로 움직이면서 투명해지도록 해 보죠.


local obj = display.newImage( "image.png" )

-- set starting position (top-left of screen)
obj.x, obj.y = 0, 0

local function removeObject( object )
    object:removeSelf()
    obj = nil   -- nil out original reference (upvalue)
end

-- some variables to be used in the transition
local end_x = display.contentWidth
local end_y = display.contentHeight

-- fade object to completely transparent and move the object as well
transition.to( obj, { time=3000, alpha=0, x=end_x, y=end_y, onComplete=removeObject } )


Easing Library


코로나의 Easing Library 는 transition.to() 함수와 함께 쓰여서 transition 프로퍼티를 통해 transition의 behavior 를 하는데 다루는 데 사용되어 질 수 있습니다. 디폴트로 이 transition 프로퍼티는 easing.linear로 세팅돼 있습니다. 이것은 transition이 처음부터 끝까지 같은 공간에서 꾸준히 tween 되는 상태를 말합니다.

각 transition 프로퍼티 behaves를 설명하는 것은 약간 어렵습니다. 백문이 불여일견이라고 샘플 앱에서 Transition1과 Transition2 예제를 보실것을 권장합니다. 이 샘플은 아래 경로에 있습니다.

  • /SampleCode/Graphics/Transition1
  • /SampleCode/Graphics/Transition2


이 샘플 예제를 보시고 다른 transition type들을 적용하면서 실행해 보세요. 이렇게 하는게 가장 쉽고 확실하게 배우는 길입니다. 그리고 여러분이 배운 Corona의 transition library에 대한 모든 것을 확실히 다져 주세요.


Canceling Transitions


In the event you need to stop a transition mid-way through, you can do so by using the transition.cancel() function. However, this function requires that you store a reference to an id of the specific transition you need to cancel.

여러분이 transition이 일어나는 중간에 이를 stop 시킬 필요가 있다면 여러분은 그렇게 하실 수 있습니다. transition.cancel() 함수를 사용하시면 됩니다. 이걸 이용하시려면 해당 transition의 id를 사용하셔야 합니다.

그러니까 이 transition을 cancel 하기 이전에 그 transition의 id를 variable에 store 할 필요가 있습니다. 아래 첫번째 예제를 약간 바꾼 샘플이 있습니다. 해당 transition 아이디를 transition_id 라는 변수에 대입을 했습니다.


local obj = display.newImage( "image.png" )


-- center the object
obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent
local transition_id = transition.to( obj, { time=3000, alpha=0 } )

Now, we can cancel the transition at any time by passing that stored id as the first parameter to transition.cancel(). In the following example, we’ll cancel the transition after 1.5 seconds.

local obj = display.newImage( "image.png" )

-- center the object
obj.x = display.contentWidth*0.5
obj.y = display.contentHeight*0.5

-- fade object to completely transparent
local transition_id = transition.to( obj, { time=3000, alpha=0 } )

timer.performWithDelay( 1500, function()
    if transition_id then
        transition.cancel( transition_id )
        transition_id = nil
    end
end, 1 )


위에서도 언급했는데요. 우선 transition을 cancel 하기 이전에 그 transition이 존재해 있어야 합니다. 여러분이 실전에서 코딩을 하실 때는 반드시 해당 transition이 선언돼 있는지 확인하시기 바랍니다.

그리고 여러분이 transition.cancel()을 call 할 때는 그 transition id를 저장하기 위해 사용한 변수를 nil-out 시키시기 바랍니다. 그렇게 하지 않으면 skeleton table이 남겨져 있게 됩니다. (마찬가지로 object:removeSelf() 한 이후에도 반드시 그 변수를 nil-out 시켜 주세요.)


WARNING: Do not remove currently transitioning objects!


만약 현재 tweened 되고 있는 객체가 remove 된다면 여러분의 앱은 crash를 일으킬 겁니다. 이것은 scene change 할 때 종종 일어나는 현상인데요. scene change를 하기 전에 transition.cancel()을 현재 active 상태에 있을 법한 변수에 적용하는 것이 에러가 일어날 가능성을 미리 방지하는 방법일 겁니다. 이 부분은 exitScene 이벤트 리스너에서 수행하는것이 가장 이상적입니다. 좀 더 자세한 사항은 Storyboard Scene Events Explained를 확인하세요.

Corona의 transition library에 대한 좀 더 많은 정보는 Transitions API reference 페이지를 참조하세요. 좀 더 많은 정보들이 있습니다.

반응형


반응형

Posted on . Written by


6 월은 코로나에게 아주 바쁜 달이었습니다. 오늘에야 새 회사 이름을 announced 했네요. Corona Labs Inc. 를요 그리고 멋진 새 웹사이트도 선보였구요 (www.coronalabs.com) 트위터 주소도 바뀌었습니다. (@CoronaLabs) 페이스북 페이지도요. (facebook.com/CoronaLabs). 


We’re ready to celebrate!

오늘부터 우리는 ‘Corona Labs Celebration Sweepstakes’ 를 시작합니다. 그리고 여러 상품도 준비했습니다. (대략 $3800 어치 선물). 이제 숫가락을 드시고 그 상품을 어떻게 먹을 수있는지 아래를 잘 살펴 보세요.


What prizes are we looking at?

Grand Prize: $3000 상당의 1년간 Corona Enterprise license 입니다. 아래 내용들을 잘 살펴 보세요.



More great prizes:

  • 1 hour of Premium Support (worth $225)
  • 6 month Corona Pro subscription
  • 1 year Corona Levels subscription (currently in beta)
  • $100 iTunes gift card
  • 1 Corona Book Collection: “Corona SDK Mobile Game Development: Beginner’s Guide” by Michelle Fernandez and Mobile App Development with Corona” by Brian Burton
  • 1 Corona Swag Package: mug, t-shirt, stickers and more!


How can you win these awesome prizes?

아주 간단합니다. 여러분이 해야 될 일은 6월 28일 정오까지 (Pacific Time)  Corona Labs Celebration Sweepstakes 에 enter 해 주세요. 그리고 페이스북에 저희에 대해 Like 해 주세요. 그냥 이렇게만 해 주시면 위 상품을 탈 수 있는 기회를 가질 수 있습니다.


How and when will we select the winners?

저희는 아래 날짜들 정오쯤에 랜덤하게 entrants 하는 분 들 중에 당첨자들을 뽑을 겁니다.

  • June 15: Corona Swag Package
  • June 18: Corona Book Collection
  • June 20: $100 iTunes gift card
  • June 22: 1 year Corona Levels subscription
  • June 25: 6 month Corona Pro subscription
  • June 26: 1 hour of Premium Support
  • June 27: 1 seat to a year-long Corona Enterprise license


그러니까 좀 더 일찍 enter 하시면 당첨될 확률이 훨씬 더 커지는 거죠.

여러분들이 행운의 당선자가 되면 저희가 축하 이메일을 보내드릴거구요 Corona Labs Facebook wall 에도 글을 올리겠습니다. 한 사람당 1개의 상품만 탈 수 있습니다.

망설일게 뭐 있겠어요. 오늘 당장 페이스북하고 트위터에 글 올려주시고 contest에 참여해 주세요.


Good luck team Corona!


반응형


반응형

코로나가 새출발 하는 기분으로 이름을 Corona labs로 바꾸었습니다.

지난주에 Ambassador 들에게는 미리 메일이 왔었는데요.

며칠 지나지 않아서 공식 발표하고 새로운 싸이트도 선 보였네요.


이번에 Corona Labs로 회사 이름이 바뀌면서 CEO 월터가 올린 글을 소개합니다.


Introducing Corona Labs!
Posted on . Written by

Team Corona,

오늘부터 우리는 우리를  Corona Labs라고 부르기로 했습니다. 여러분들 중에 미리 알고 계신분들도 계시겠지만 모르시는 분들을 위해서 몇가지 질문들에 대한 답변을 드리겠습니다.

왜 Corona Labs죠?

글쎄요. Corona는 당연하겠죠? 그런데 왜 Labs 가 들어갈까?

작년 12월에 말했듯이 코로나는 그냥 단순한 목적에서 만들어지지 않았습니다. 실제 사람들의 삶을 바꾸기 위해 만들어 졌습니다. 그 기준으로 우리가 목표로 삼을 수 있는 곳이 어딜까요? 벨 연구소 입니다.


벨 연구소
벨연구소는 1925년 설립된 세계 최고 수준의 민간 연구개발 기관이다. 설립 이래 3만 3000개가 넘는 특허와 13명의 노벨과학상 수상자를 배출했다. 20세기에는 정보통신 네트워크 시대를 이끌었고 21세기 들어서는 커뮤니케이션 혁신에 집중하고 있다. 원래 벨 시스템 사의 연구개발 연구소로 설립됐다. 1925년 당시 AT&T 사장이던 월터 기포드가 독립적인 성격의 기관으로 벨연구소를 설립했다. 연구소 명칭은 세계 최초 전화기 발명가인 알렉산더 그레이엄 벨의 이름을 땄다. 2006년에는 AT&T에서 프랑스의 알카텔-루슨트로 주인이 바뀌었다.

벨연구소가 개발한 제품으로 대표적인 것에는 전화교환기에서부터 전화선 피복, 트랜지스터 등이 꼽힌다. 1947년에 트랜지스터를 발명한 존 바딘, 윌리엄 쇼클리, 월터 브래튼은 1956년 노벨 물리학상을 수상했다. 디지털 카메라 기술도 벨연구소에서 나왔다. 1970년 윌라드 보일과 조지 스미스가 디지털 카메라 핵심 기술을 발명해 발표했고 두 사람은 2009년 노벨 물리학상을 받았다. 이 밖에 광케이블, 통신 위성기술 등도 벨연구소의 작품이다. 2005년 외부 출신으로는 처음 벨연구소 사장으로 한국인 김종훈 씨가 영입되기도 했다. 미국 뉴저지 주에 있다.



유닉스와 C 가 어디에서 나왔을까요. 태양광 모듈을 어디에서 나왔을까요? 디지털 카메라에 있는 CCD는 어디서 나왔을 까요. 이것 말고도 더 많이 있습니다. 이 기술들에 대한 핵심 기술과 기반 혁신은 벨 연구소에서 나왔습니다.

그들은 말 그대로 현대의 컴퓨터 세계를 만들어 냈습니다. 우리는 과학계에 그런 근본적이고 결정적인 영향을 주고 싶습니다. 그래서 "Corona Labs" 입니다.

이제 coronalabs.com 으로 접속하셔도 됩니다.





왜 이름을 바꿀 생각을 했을까요?

우리는 Corona 가 앱 개발자들에게 그냥 가족처럼 친숙한 이름이 됐으면 합니다. 지금까지 우리는 회사이름으로 Ansca 그리고 제품 이름으로 Corona를 사용했었는데요. 이게 내외적으로 좀 혼란스러웠거든요.

지난 몇년간 우리는 대부분의 사람들이 우리를 Corona를 만든 사람들로 생각하는 것을 관찰해 왔습니다. 그들은 Ansca라는 존재에 대해서도 몰랐습니다. 그 예로 고객들이 그들의 신용카드 영수증에 Ansca라는 이름이 찍혀있는걸 보고 이게 Corona 제품을 산 것에 대한 영수증이라는 것을 많은 사람들이 알아차리지 못했거든요.

사람으로 치면 회사가 진짜 이름하고 별명 두개를 갖고 있었던 거죠. 모두들 우리의 별명을 부르고 있었고 별명으로 기억하고 있었습니다. 그리고 모든 사람들이 그 별명을 좋아했습니다. 그래서 우리는 공식적으로 우리의 별명을 이름으로 사용하자고 결정했죠.

바뀐 이름에 어떤 큰 의미가 있을까요?

큰 의미가 있다면 Corona Labs는 평범한 lab이 아니라는 겁니다. 예전에는 labs (연구소)는 일종의 동굴 같았습니다. 외따로 떨어져있었고 밀폐된 환경이었습니다.

우리가 생각하는 Corona Labs는 근본적으로 다릅니다. 우리는 가장 개방적인 연구소로 만들 생각입니다. 다른 연구소들이 비밀을 간직할 때 우리는 좀 더 투명해 지려고 노력할 겁니다. 그 일환으로 여러분들은 지금까지의 site에서 우리늬 bug들을 보실 수 있었던 겁니다. 그리고 왜 우리들은 우리들의 roadmap에 대해 여러분들의 feedback을 받을까요. 바로 더 투명해 지려는 노력중 하나입니다.

그리고 마지막으로 코로나 팀들의 노고가 거기에 있었습니다. 여기 Corona Labs의 인간들은 정말 비범하게 헌신적입니다. 그러나 팀이란 그 인간들만을 말하는 것은 아닙니다. 그 팀에는 여러분 모두도 해당됩니다. 우리의 정말 대단한 Corona community 가 우리 한 팀입니다.

여러분들이 우리에게 영감을 주었고 우리의 삶을 바꾸어 놓았습니다. 우리는 Corona Labs가 다음세대에도 계속 왕성하게 활동함으로서 그에 대한 화답을 하기를 바랍니다.

추신: 페이스북 주소 facebook.com/coronalabs 를 기억해 주시고 @coronalabs 로 트위터도 follow 해 주세요. 그리고 우리들의 celebration promotion에 대해 주목해 주세요.

반응형

FAQ Wednesday #7

2012. 6. 14. 09:55 | Posted by 솔웅


반응형

FAQ Wednesday #7

Posted by

수요일이 왔습니다. 다시 FAQ 시간이 됐네요. 아래 5개의 FAQ 가 있습니다.

Question 1

왜 시뮬레이터하고 디바이스하고 텍스트 spacing/positioning이 약간 다른가요?

Answer


시뮬레이터와 디바이스는 서로 폰트들이 다릅니다. native.systemFont는 OS에 따라 다르게 됩니다. 맥에서는 LucidaGrande 24 pt이고 iOS에서는 Helvetica 입니다. 그리고 윈도우즈는 또 다릅니다. 다른 폰트는 사이즈가 같더라도 약간 다른 공간을 차지합니다. 그래서 alignment에 다른점들이 있게 됩니다.

같은 폰트라도 OS가 랜드링을 하면서 다를 수가 있습니다.  맥OS와 iOS는 비슷한 code paths를 사용하지만 기본 text drawing은 약간 다릅니다. 같은 폰트라도 약간 다르게 glyph를 랜더링 할 수가 있습니다. 그것은 저희쪽에서 어떻게 할 수 있는 문제가 아닙니다.

이렇게 서로 다르게 나타나는 것을 방지하려면 bitmap fonts를 사용하는 수밖에 없습니다.





Question 2


display.newText로 text를 aligning 하는데 문제가 있습니다. 제대로 잘 하려면 어떻게 해야죠?

Answer

display.newText는 x,y 파라미터를 top, left를 위치시키는데 사용하게 됩니다. 여러분이 객체를 생성하고 난 후  x,y를 세팅하면 디폴트로 text의 중앙을 세팅하게 됩니다. object가 생성될 때와 같은 alignment를 사용하려면 bject:setReferencePoint( display.TopLeftReferencePoint )를 사용하실 수 있습니다. (좀 헛갈리죠? 그래서 이런 factory methods로 x,y 파라미터의 alignment를 컨트롤 할 수 있도록 준비하고 있으니 조만간 나오는 Daily Build 에서 반영 될 겁니다.)

그리고 display.newText가 call 되는 방법에 따라 width(w)와 height(h)를 어떻게 계산하는지도 이해하는게 헛갈리기도 합니다.

    w,h 가 제공되지 않으면 display.newText는 한줄짜리 객체를 생성하고 제공된 string에 맞게 대략적으로 사이즈도 생성됩니다. 이 w,h에 따라 x,y 포지션이 결정됩니다.
    w,h 가 정해져 있으면 display.newText는 제공된 width/height 를 사용해 포지션을 계산합니다. 그렇게 해서 x,y가 top left 가 됩니다. (만약 h가 0dlaus height는 해당 string에 따라 달라집니다.)

그러니까 생성하고 난 후 x,y를 세팅할 때 (예. txt.x = xAlign) 여러분은 디폴트로 object의 center를 세팅하게 됩니다. 그래서 두개의 text 객체가 같은 string 이지만 다른 width를 가질 수 있습니다. 그렇게 되니까 center로 세팅하면 좌측 정열이 되지 않는겁니다.

Question 3

여러 API를 사용해 baseDirectory를 봤는데요. 왜 이건 subdirectory를 지원하지 않죠?

Answer

display.newImage와 다른 API들이 사용하는 baseDirectory 파리미터는 시뮬레이터나 디바이스에서 사전에 지정된 시스템 디렉토리를 명시하기 위한 optional parameter 입니다. 이 파일 시스템은 sandboxed 입니다. 그래서 baseDirectory는 다음과 같은 것들 중 하나 입니다.:system.ResourceDirectory, system.TemporaryDirectory, system.DocumentsDirectory. 만약 아무런 baseDirectory가 명시돼 있지 않으면 디폴트로 system.ResourceDirectory가 됩니다.

만약 subdirectory를 참조할 필요가 있으면 그 디렉토리는 file name에 추가 되야 합니다. baseDirectory 파라미터에 추가 되지 않습니다. 아래에 Resource directory와 Document directory안에 myImages 라는 서브디렉토리의 이미지에 접근하기 위한 몇개의 샘플코드가 있습니다.

local image1 = display.newImage(  "myImages/redBall.png", 10, 200 )

-- This next line is the same as the previous
local image2 = display.newImage( "myImages/redBall.png", system.ResourceDirectory, 10, 200 )

local image3 = display.newImage( "myImages/redBall.png", system.DocumentsDirectory, 10, 200 )


Note: Documents directory는 이미지나 파일들을 저장하는데 사용될 수 있습니다. 이 때 어플리케이션은 반드시 먼저 그 디렉토리에 파일을 create/copy 해야 합니다.

여러분은 system.pathForFile인 디렉토리를 명시하거나 subdirectory의 path를 명시하는데 사용될거라고 생각할 수 있습니다. 하지만 baseDirectory가 필요한 곳에서는 제대로 작동하지 않을 겁니다.

Question 4

. 와 / 를 사용해서 subdirectory들에 접근하는게 잘 혼동되요.

Answer


간단하게 답변을 드리면 . 는 require API로 로드된 서브 디렉토리안의 모듈에 접근하는데 사용되고 / 는 다른 모든 API들에 사용됩니다. (이전 질문 답에서 보여드렸던 display.newImage 같은 겁니다.) storyboard.gotoScene도 require를 사용하므로 . 가 서브디렉토리의 scene 모듈에 접근하는데 사용되는 겁니다.

만약 movieclip.lua 모듈과 Image가 assetes 서브디렉토리에 있다면 어떻게 접근해야 하는지 아래에 예제가 있습니다.

local movieclip = require( "assets.movieclip" )
local image1 = display.newImage( "assets/redBall.png", 10, 200 )


Question 5

File I/O API에서 baseDirectory를 찾아 볼 수가 없어요. 어떻게 이 디렉토리를 명시하죠?

Answer


io.open API는 파일을 읽고 쓰기 위해 open을 사용합니다. 여기서 디렉토리와 파일 이름이 포함된 스트링인 path를 명시하죠. 이 스트링은 system.pathForFile로 생성됩니다. 아래에 File I/O를 사용해서 어떻게 디렉토리를 명시하는지 보여드립니다.

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

-- Open a file path
local fh, reason = io.open( path, "r" )

if fh then
    -- Read all the contents of the file into a string
    local contents = fh:read( "*a" )
    print( "Contents of " .. path .. "\n" .. contents )
else
    print( "Reason open failed: " .. reason )
end


만약 서브디렉토리 안의 파일에 접근하실 필요가 있다면 파일 이름에 서브디렉토리를 append 하시면 됩니다. 아래 예제는 Resource directory에서 서브디렉토리로 접근하기 위해 path를 사용하는 방법을 보여 드립니다.

local path = system.pathForFile( "myFiles/data.txt", system.ResourceDirectory )


오늘은 여기까지 입니다. 즐거우셨기를 바라구요. 새로운거 몇가지를 배울 수 있는 기회가 됐다면 좋겠네요.

반응형

Responsive WEB (반응형 웹) 맛보기

2012. 6. 13. 21:09 | Posted by 솔웅


반응형

요즘 브라우저 크기를 줄이면 화면 레이아웃이 갑자기 바뀌는 웹사이트를 가끔 봅니다.

Responsive WEB 개념을 이용해서 만든건데요.


요즘 웹페이지를 표시하는 디바이스들이 많이 늘어나다 보니까 하나의 웹페이지를 데스크 탑, 모바일 폰, 타블렛 PC 등 다른 해상도의 디바이스들에 맞는 레이아웃을 각각 만들 필요가 있어 졌습니다.


이 Responsive WEB은 HTML5이 Media Queries 를 이용하여 하나의 소스로 제작된 컨텐츠로 여러 해상도의 화면을 제공할 수 있도록 만드는 개념입니다.


대표적으로 Boston Globe 가 있는데요.






1. A flexible, grid-based layout : 그리드를 상대적(% 단위 등)으로 지정하여 브라우저 크기에 따라 유동적으로 변환
2. Flexible width media: images, video : 너비가 변경되어도 웹페이지 안의 미디어가 넘치지 않게 하는 기법
3. Media queries : 다양한 브라우저에서 표현양식을 제어할 수 있게 고안된 기능


Responsive WEB에는 이 세가지 개념이 기본적으로 깔려 있습니다.


그런데 이 반응형 웹은 IE8 미만에서는 사용할 수 없다고 합니다.


오늘 제 immediate manager 인 Rajesh 가 Boston Globe를 보여주면서 이거 어떻게 하는지 아냐고 물어보더라구요.


예전에 이 Responsive WEB 소스코드로 한번 연습한 적이 있어서 대충 알려 줬는데요.

많이 까먹어서 제대로 알려주지 못한 것 같네요.


생각난 김에 다시 소스로 정리를 해 두려고 합니다.

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="user-scalable=no, width=device-width" />
<title></title>
<link href="mobile.css" rel="stylesheet" type="text/css" media="screen and (max-width:799px)" >
<link href="desktop_pc.css" rel="stylesheet" type="text/css" media="screen and (min-width:800px)" >
</head>

<body>
    <h1>Simple one</h1>
    <div id="pc_view">
        <h2>Desk Top PC </h2>
        <p>Make this browser narrow then 800 px.  브라우저의 너비를 800 px보다 작게 줄여보세요. </p>
        <p>You can see Black background and White text. 배경이 검정색에 글자가 흰색으로 바뀔 겁니다. </p>
    </div>
    <div id="mobile_view">
        <h2>Mobile</h2>
        <p>Make it wider then 800px. 브라우저의 너비를 800 px이상으로 크게 늘여보세요. </p>
        <p>White BG and Black Text. 배경이 흰색에 글자가 검정색으로 바뀔 겁니다. </p>
    </div>   
</body>
</html>


이게 제일 간단한 소스인데요.

우선 보시면 HTML5를 지정했구요. Charset 을 utf-8으로 하는 메타태그가 하나 있습니다.

그리고 뷰포트 메타태그가 있습니다. width=device-width 로 해서 화면을 사용자 디바이스 width 에 맞춰서 display 되도록 한 겁니다.

이 viewport 관련해서도 별도의 글에서 정리해 둬야겠네요.

그리고 그 다음이 css 파일인데요.

799픽셀 이하짜리와 800픽셀 이상짜리 두개를 따로 마련했습니다.

그리고 태그 안에 media query 가 있습니다. 이 부분에서 해상도에 맞게 css 파일을 불러 오는 겁니다.


그 다음에는 두개의 div 가 있는데 하나는 id가 pc_view 이고 다른 하나는 mobile_view 입니다.

이 id를 가지고 css에서는 어떻게 사용하는지 보죠.


우선 desktop_pc.css 파일 입니다.


@charset "utf-8";
body {
    background-color: #fff; /* 배경 색상을 흰색 */
}
#mobile_view {
    display : none; /* mobile_view선택자 영역은&nbsp;화면에서 생략 */
}



보시면 여기서는 mobile_view 의 display 를 none으로 했죠?

그러면 pc_view 만 나오게 됩니다.


그럼 mobile.css를 보실까요?

@charset "utf-8";
body {
    color: #FFF; /* 글자 색상을 흰색 */
    background-color: #000; /* 배경 색상을 검정 */
}
#pc_view {
    display : none; /* pc_view 영역은 화면에서 생략 */
}



역시 pc_view 의 display를 none으로 했습니다.


개념만 이해하기 위해 아주 간단한 예제를 살펴 봤습니다.



반응형

Kurogo Tutorial 20 - Module Interaction -

2012. 6. 13. 10:08 | Posted by 솔웅


반응형

Module Interaction


많은 경우 데이터를 share 하고 모듈간에 링크를 걸고 하는 것은 아주 유용하게 사용됩니다. 인터페이스의 일관성을 유지하기 위해 convention 들이 만들어 졌습니다. 이 convention들은 아래와 같은 일들을 합니다.

  • 다른 모듈의 데이터 값을 근거로 특정 모듈로 링크를 걸거나 값을 formatting 함 (예. people 디렉토리의 값에서 맵 모듈로 링크 걸기 등)
  • 모듈의 모델 객체에 근거한 링크 생성과 value 포맷팅 (예. calendar event의 포매팅과 retrieval)
  • criteria에 근거한 다른 모듈의 data retrieval (used in the federated search feature)


만약 새 모듈을 만들거나 다양한 data source로부터 데이터를 포맷하기를 원한다면 오늘 다룰 내용을 자세히 읽어 보셔야 합니다.




Formatting Data from Existing Modules

다른 데이터(map locations, people)를 참조하는 하나의 데이터 소스(LDAP directory, calendaring system)에 있는 데이터를 가지고 있는 예는 아주 많습니다. 불행히도 이 두개의 시스템사이를 연결하는 strong link 는 없을 겁니다. 그 둘을 link 하려면 bridge를 사용해야 합니다.

다른 모듈의 데이터로 링크를 걸고 다른 모듈의 데이터를 보여주는 쿠로고의 built in 모듈은 2가지가 있습니다.(People, Calendar module) detail configuration의 module=xxx 파라미터는 다른 모듈로의 링크를 생성합니다. default로는 간단하게 디렉토리의 같은 value를 사용합니다. 그리고 filter 파라미터의 value를 사용해서 target 모듈의 search 페이지로 링크를 겁니다. 그러니까 맵 모듈로 링크를 건다면 아래와 같을 겁니다.

  • map/search?filter=value

이것은 많은 경우에 사용됩니다. 하지만 때때로 좀 더 특정 링크를 제공해야 할 때도 있습니다. 이를 구현하기 위한 과정은 아래와 같습니다.

  • target 모듈의 subclass를 생성한다. (i.e. map)

    • Create a file named SiteMapWebModule.php in SITE_DIR/app/modules/map안에 SiteMapWebModule.php파일을 생성한다. enclosing folder들을 사용해야 할 겁니다. 
    • 이 파일은 MapWebModule의 subclass이어야 함. 이것이 그냥 맵 모듈의 extension 이라면 다른 추가적인 프로퍼티를 포함할 필요는 없음
  • Implement a linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) method in your subclass. This method will receive:

    • a value from the other system
    • a reference to the calling module (이것으로 여러분은 어떤 모듈이 call을 할 것인지 정할 수 있습니다. )
    • 옵션으로 모듈에 의해 underlying object가 제공됩니다. 그렇기 때문에 여러분은 response를 generate 할 때의 모든 value들을 고려해야 합니다.

이 메소드는 list item에 대한 해당 배열을 return 해야 합니다. 여기서 최소한 title 값을 include 해야합니다. 일반적으로 link를 include 하고 싶지 않다면 url 값을 include 해야합니다.


<?php

class SiteMapWebModule extends MapWebModule
{
  public function linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) {

      switch ($callingModule->getID())
      {
          case 'people':
            //look at the location field to see which office they are from.
            //This assumes the relevant location is in the "location" field.
            $person = $otherValue;

            switch ($person->getField('location'))
            {
                case 'New York':
                    // New York office is first entry
                    return array(
                        'title'=>'New York Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:0'
                            ))
                    );
                    break;

                case 'Boston':
                    // Boston office is the 2nd entry
                    return array(
                        'title'=>'Boston Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:1'
                            ))
                    );
                    break;
                default:
                    // don't include link
                    return array(
                        'title'=>$value
                    );
            }
            break;
          default:
            //return the default implementation for other modules
            return parent::linkForValue($value, $callingModule, $otherValue);
      }
  }
}

Enabling interaction from new modules

새 모듈을 만드려면 full interaction을 가능하도록 하기 위해 몇개의 메소드들이 필요합니다.

  • searchItems($searchTerms, $limit=null, $options=null) - 이 메소드는 필터로서 searchTerms를 사용해서 KurogoObject  인터페이스를 confirm 하는 객체의 배열을 return 해야 합니다. 여러분의 implementation은 criteria를 사용해서 간단하게 검색하기 위해 필요한 메소드들을 call 해야 합니다. 여러분은 좀 더 structured queries를 사용하기 위해 옵션 배열들을 활용할 수 있습니다. federated search method의 디폴트 impementation을 활용한다면 ederatedSearch=>true를 포함해야 할 겁니다.
  • linkForItem(KurogoObject $object, $options=null) - This method should return an array suitable for a list item based on the object included. This would typically be an object that is returned from the searchItems method. An options array is included to permit further customization of the link. For examples, see the People, News, Calendar and Video modules. 이 메소드는 include 된 객체를 근거로 list item에 대한 해당 배열을 return 해야 합니다. 이것은 특히 searchItems 으로부터 return 된 객체가 됩니다. options array는 링크를 좀 더 customize 할 수 있도록 하기 위해 include  됩니다. 그 예로는 People, News, Calendar 그리고  Video module 들이 있습니다..


반응형

'WEB_APP > Kurogo' 카테고리의 다른 글

Database Authentication  (0) 2012.09.12
Authentication  (0) 2012.09.06
Flat File Authentication  (0) 2012.09.06
Access Control and Authorization  (0) 2012.09.06
Kurogo Tutorial 21 - Emergency Module -  (0) 2012.07.12
Kurogo Tutorial 19 - The Kurogo Object -  (0) 2012.06.12
Kurogo Tutorial 18 - Video Module -  (0) 2012.06.07
Kurogo Tutorial 17 - Calendar Module -  (0) 2012.06.01
Kurogo Tutorial 16 - Database Access -  (0) 2012.05.30
Kurogo Tutorial 14 - Handling Requests -  (0) 2012.05.23

User Agent Switcher 소개

2012. 6. 12. 10:19 | Posted by 솔웅


반응형

모바일 웹을 개발하다 보면 각 디바이스 별로 기능을 다르게 주는 경우가 있습니다.

아이폰 인경우는 어떤 기능을 실행하고 또 안드로이드인 경우는 다른 기능을 실행하고 등등이요.


그런데 전화기를 다 가지고 있지 못하면 이 기능을 제대로 테스트하지 못하기도 합니다.


이럴 경우 user agent 를 바꿔서 데스크탑이나 랩탑에서도 모바일 디바이스에서 해야만 하는 테스트를 할 수가 있습니다.


각 브라우저에 맞는 User Agent Switcher 플러그인을 설치하시면 되는데요.


우선 크롬부터 알아 보겠습니다.


1. 크롬 user agent switer

https://chrome.google.com/webstore/detail/djflhoibgkdhkhhcedjiklpkjnoahfmg


 우선 크롬 브라우저를 실행시킨 후에 위 링크로 접속을 합니다.

다음에 오른쪽 위에 있는 Added to chrome 버튼을 클릭하시면 됩니다.

간단하죠?

그러면 오른쪽 위에 저런 아이콘이 생기는데요. 이 아이콘을 누르고 원하는 디바이스를 선택하시면 됩니다.


그럼 위와 같이 제 랩탑에 있는 크롬 브라우저인데 Platform 이 iphone으로 잡히고 User Agent에도 iPhone으로 잡힙니다.


2. 파이어폭스 user agent switer

http://chrispederick.com/work/user-agent-switcher/



파이어폭스에서도 마찬가지로 이 링크로 가셔서 설치하시면 됩니다.

그리고 메뉴에서 tools - Default User Agent를 선택하셔서 사용하세요.


그러면 아까와 마찬가지로 랩탑에 있는 파이어폭스 브라우저인데도 아이폰으로 인식합니다.


그리고 또 다른 파이어폭스용 User Agent Switcher 인것 같은데요.

https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/


여기로 가셔서 받으셔도 됩니다.
저는 저 위에걸로 깔아서 쓰고 있습니다.


모바일 웹 개발하시는데 도움이 되시길 바랍니다.


반응형