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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Authentication

2012. 9. 6. 21:08 | Posted by 솔웅


반응형

Authentication


특정 모듈에 대해서 검증된 유저만 (authenticated users) 접근이 가능하도록 할 필요가 있습니다. 또는 해당 유저에 알맞는 내용을 제공하거나 feedback에 참여하도록 허용할 수 있겠죠.


Kurogo 프레임워크는 authenticationg users와 내용에 대한 authorizing access 를 위한 기능을 제공하고 있습니다. 이런 기능을 위해서 유저별로 또는 특정한 그룹에 있는 멤버에게만 접근이나 관리의 권한을 주거나 제한하는 서비스를 제공할 수 있습니다.


Kurogo는 기존에 존재하는 identity 시스템과 같이 사용하실 수도 있습니다. 예를 들어 Active Directory, MySQL databases, Twitter, Facebook and Google 등이 있습니다.





Setting up Authentication


Authentication은 유저의 identity를 설립하는 프로세스입니다. 이 identity의 설립은 유저가 username과 password를 제공하면서 가능합니다. 프레임워크는 그 유저이름과 패스워드를 받아서 central authority를 통해서 credential을 test 하게 됩니다. 만약 authority가 credential에 적합하면 유저는 로그인 되고 관련된 서비스나 개인 정보를 사용할 수 있게 됩니다.



쿠로고 프레임워크에 의한 Authentication는 한개 이상의 authentication authorities를 통해서 제공 됩니다. 각 authority는 기존의 authentication system에 connect 하기 위해 configure 돼 있습니다. 여러분 사이트의 필요에 따라 여러분은 거기에 맞는 private self-hosted authentication system (like an LDAP/Active Directory or database system) or a public system (Twitter, Facebook, Google) 들을 사용하실 수 있습니다. 또한 standard authentication services (Google Apps) 같이 외부에서 제공되는 서비스를 사용해서 hybrid로 접근할 수도 있습니다. 간단하게 deploy 하려면 external service 필요없이 flat-file based system을 사용할 수도 있습니다.


각 authority는 아래와 같이 다양한 서비스를 제공할 수 있습니다.


  • User authentication - either through a direct login/password form or through an external system based on OpenID or OAuth
  • User attributes - At minimum authorities should supply id, name and email information. Some authorities can provide this information to any user in their system, however others can only provide this information on the logged in user
  • Group information and membership - Some authorities will also contain information on groups which allow you to logically organize users. Some authorities are designed to only contain users from their own domains, while others have the ability to utilize users from other authorities in their membership


이 모든 서비스를 다 제공할 필요는 없을 겁니다. 하나의 authority는 authentication과 information을 제공하고 다른 것은 group information을 제공하고 이렇게 여러 방법으로 사용될 수도 있습니다. 만약 여러분이 여러분의 authorization schemes에 group을 지정하지 않았다면 group information은 필요 없게 되겠죠.


Enabling Authentication


authenticating users를 지원하려면  SITE_DIR/config/site.ini 안에 있는 AUTHENTICATION_ENABLED 를 1로 세팅해야 합니다. 디폴트는 0 입니다.


Configuring Authorities


Authorities들은 SITE_DIR/config folder에 있는 authentication.ini file 에 정위 됩니다. 각 authority는 각 section에서 설정됩니다. 이 section 이름은 authority index로 사용되는 것이 좋습니다. 프레임워크에 의해 사용되는 programmatic value 죠. 이 value는 여러분이 원하는 대로 하셔도 됩니다. 다만 이전에 사용됐던 section을 중복해서 사용하지 않도록 주의하셔야 됩니다. 만약 중복 되면 문제가 생깁니다.


각 authority는 여러 attribute들이 필요합니다. 그리고 authority type에 따라 더 필요할 수도 있습니다. configuration file에 대한 좀 더 자세한 정보를 원하시면 Configuration를 참조하세요.


아래 내용들은 모든 authorities들에 필요한 값들입니다.


  • TITLE - This value is used when referencing the framework to users. If there is more than one authority available to users to choose the title will direct them to the correct one.
  • CONTROLLER_CLASS - This value should map to a valid subclass of AuthenticationAuthority. This defines the core behavior of the authority.
  • USER_LOGIN - There are 3 possible values:
    • FORM - Use the login form
    • LINK - Use a login link. The authority should handle this using their login method
    • NONE - This authority does not provide authentication services (i.e. just group services)


Included Authorities


Kurogo 프레임워크가 폭 넓은 세팅을 할 수 있도록 하기 위해 프로젝트는 몇가지 클래스들을 가지고 있습니다. 이 클래스들은 다양한 타입의 authentication과 authorization service들에 연결할 수 있도록 합니다.  각각은 나름대로 셋업하고 사용하기 위한 방법들이 있습니다. 아래 문서들을 잘 읽어보시고 개발하고 deploy 하기 위한 중요한 요구사항들을 잘 살펴 보시기 바랍니다.



반응형

Flat File Authentication

2012. 9. 6. 08:59 | Posted by 솔웅


반응형

Flat File Authentication


PasswdAuthentication
class는 로컬에 있는 flat file의 authentication과 user/group 정보를 제공합니다. 가장 간단한 authentication 관리 방법입니다. 다른 서비스를 사용하지 않아도 되죠.


Configuration


PasswdAuthentication authority 는 standard에 2개의 value만이 추가 됩니다.

  • PASSWD_USER_FILE - a path to the user file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/users”

  • PASSWD_GROUP_FILE - a path to the group file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/groups”



Format of the user file


이 user file은 전형적인 유닉스의 passwd 파일과 그 구조가 비슷합니다.

각 라인은 single user를 말합니다. 빈 줄이나 #로 시작하는 줄은 무시될 겁니다. 각 라인에는 : 로 구분되는 field들이 있습니다. 필드의 순서는 아래와 같습니다.

  1. userID - a short name for the user
  2. password - an md5 hash of the user’s password (unix users can use md5 -s “password” to generate a hash)
  3. email - the email address of the user
  4. full name - the full name of the user


Format of the group file


그룹 파일도 유닉스의 그룹파일과 아주 비슷합니다.


각 라인은 single group을 나타냅니다. 빈 줄이나 #로 시작하는 줄은 무시됩니다. 각 라인에서 각 필드들은 : 로 구분 됩니다.

그 필드들의 순서는 아래와 같습니다.


  1. group - a short name for the group
  2. gid - a numerical id for the group
  3. members - a comma separated list of users. Each user is represented by their username/email. If the user is from another authority you should enter it as authority|userID


Usage


이 authority를 사용하는 것은 몇개의 account 만을 다룰 때 유용할 겁니다. 예를 들어 간단하게 username과 password를 가지고 몇개의 모듈만 protect 하기를 원하는 경우가 이것에 해당 될 겁니다.




반응형

Access Control and Authorization

2012. 9. 6. 03:53 | Posted by 솔웅


반응형

Access Control and Authorization


유저의 identity를 얻으면 그 identity 에 근거해서 제한된 모듈을 사용할 수 있도록 하는 authorize 가 가능해 집니다. Authorization은 access control lists에 의해서 이뤄 집니다. 개발자들은 아마 다른 contexts에 더 익숙하시겠죠? 예를 들어 파일 시스템 같은......


Access Control Lists


access control list 는 어떤 리소스에 접근이 가능한 이들을 정의해 놓은 rule들을 열거한 겁니다. (ALLOW rules) 물론 그 리소스에 어떤 이들의 접근을 막을지에 대해서도 정의해 놓을 수 있겠죠. (DENY rules). 룰들은 유저와 그룹별로 정의 될 수 있습니다. 여러분 사이트의 필요에 따라 혼합하거나 해서 사용하실 수 있습니다.


Access control lists SITE_DIR/config/acls.ini  (site authorization)나 SITE_DIR/config/MODULE/acls.ini (module authorization)에 정의 돼 있습니다. 


만약 그 site 에 access control list entry가 있다면 (in SITE_DIR/config/acls.ini), 이 조건은 모든 모듈에 적용이 될 겁니다. site가 아니라 module 이 access control list entry 를 가지고 있다면 (in SITE_DIR/config/MODULE/acls.ini), acl 룰에 맞는 유저만이 접근할 수 있게 됩니다.


아래와 같은 경우에 유저는 접근 권한을 가질 겁니다.


  • They match an ALLOW rule, AND
  • They do NOT match a DENY rule


만약 유저가 DENY 룰에 속하면 즉각 접근 제한이 됩니다.

이 Access control lists 는 Administration Console에서 수정될 수 있습니다.




Syntax of Access Control Lists


각각의 ACL은 acls.ini 파일에 있는 section입니다. 첫번째 ACL은 section 0 가 되고 두번째는 1 이 됩니다. 각 섹션은 key들을 가지고 있습니다.


  • type: Either U (for user access, i.e. who can use the module), or A (for admin access, who can administer the module).
  • action: Either A (allow) or D (deny). Deny rules always take precedence.
  • scope: Either U (user), G (group) or E (everyone, i.e. ALL users, including anonymous users),
  • authority: The index of the authority. For user scope this can be blank and would match a user from any authority.
  • value: The particular user/group to match. For user scope this can be “*” which would match all authenticated users.


이 신택스를 구현하는 방법을 이해하시려면 아래 예제를 보세요.

admin 모듈에 대해 만드려면 아래와 같이 될 겁니다.



[0]
type = "U"
action = "A"
scope = "G"
authority = "ldap"
value = "admin"

[1]
type = "U"
action = "A"
scope = "G"
authority = "ad"
value = "domainadmins"

[2]
type = "U"
action = "D"
scope = "U"
authority = "ad"
value = "Administrator"



이 의미는 ldap authority 의 admin 그룹의 멤버들과 ad authority 의 domainadmin 그룹들에게 접근이 허용 될 겁니다.  그리고 특별히 ad authority의 Administrator 그룹에는 접근이 허용되지 않습니다.


Using the Flat-file Authority to extend other authorities


flat file authority 인 PasswdAuthentication는 다른 시스템이 아닌 웹서버에 저장돼 있는 flat-file을 사용해서 유저나 그룹들에게 접근을 허용할 수 있습니다. 이 경우는 유저가 적어서 굳이 authority 시스템을 관리하느라 시간을 낭비하고 싶지 않은 경우에 유용하게 사용 될 수 있습니다.


그리고 데이터베이스 서버(혹은 SQLite)가 있고 여러분이 그것을 관리하고 있다면 이 데이터베이스에 저장된 값을 가지고 사용하는 DatabaseAuthentication authority 도 사용할 수 있습니다.



이러한 방법들에 대해 좀 더 알고 싶으시면 instruction을 참조하세요. 유저 login을 사용하고 싶지 않다면 USER_LOGIN을 NONE으로 세팅해 놓으세요.



반응형


반응형
Posted on

. Written by


적어도 50만개가 넘는 앱들이 앱스토어와 구글 플레이에 있습니다. 이러한 수많은 앱들 속에서 아주 좋은 앱일지라도 찾지 못하고 넘어가기가 아주 쉽습니다. 이 앱 시장에서는 마케팅할 수 있는 방법이 아주 제한되어 있고 시간에 제약도 있으니까요. 여러분은 앱을 어떻게 알리고 또 필요한 이용자가 다운로드 받을 수 있도록 할 수 있을까요?

화요일 저녁에 저는 샌프란 시스코의 App discovery event에 참가 했었습니다.  Free App A DayTapjoyAppsfire, 그리고 Iddiction 등에서 연사들이 왔었습니다. 거의 12페이지 가까이 열심히 적었는데요. best app 찾는 방법과 배포하는 방법에 대해 정리한 것을 아주 간략하게 정리해서 공유할께요. 이건 특별한 기준에 의한 정리가 아닌 빙산의 일각일 뿐 이겠죠. 여러분만의 앱 홍보나 마케팅 방법이 있으면 공유해 주세요. 저희는 여러분의 소중한 경험을 듣는 것을 듣고 싶습니다.





1.     Get your app localized. 중국어나 일본어, 독일어, 프랑스어 이탈리아어, 러시아어, 포프투갈어, 인도어 등의 현지어를 추가하는 것은 마케팅 전략상 아주 중요한 부분입니다.


2.     Word of mouth = the best form of marketing.  다른 개발자나 출판물, 혹은 개인 등을 통해서 입에서 입으로 광고 되는 것이 마케팅의 가장 좋은 방법입니다.


3.     Assemble a comprehensive press kit. review 싸이트나 Tech 블로그 같은 곳에서 다뤄지도록 하세요. 앱의 개요나 screenshot, 그리고 사용법을 설명하는 비디오나 promo codes 등을 같이 넣어 주세요. 글을 쓰는 사람들은 특종같은 뭔가 구별되는 것들이 있는 글을 선호합니다. 그러니까 앱이 출시 되기 전에 미리 한번 사용해 봐 달라고 (TestFlight) 하는것도 좋은 방법이겠죠.


4.     Skip paying for services if you get featured by Apple.  우선 jackpot을 터트린 것을 축하드립니다. 두번째로 마케팅이나 publishing services 등등 에 낭비하지 마세요.  일반적으로 애플 친화적이고 애플 앱스토어에 올리시면 더 많은 다운로드를 기록 하실 수 있습니다.


5.     Generate buzz by dropping price. 특정기간 앱 가격 할인 행사를 하는 것은 소문을 내고 다운로드를 늘리는 좋은 방법입니다.


6.     Get on Apple’s radar by uploading screenshots to TouchArcade’s forum.   애플 앱 reviewer들은 일반적으로 이 포럼(TouchArcade’s forum)을 체크합니다. 블로거들도 마찬가지구요. 그러니까 이 포럼에 screenshots들을 업로드 하세요.


7.     Build analytics into your app. 이건 여러분 유저에게 actionable intelligence를 얻도록 하는 아주 필수적인 사항입니다. 앱에 analytics를 넣으세요.


8.     Get creative and optimize for less popular keywords.  예를 들어 가장 자주 검색되는 단어들 중 하나는 "free" 입니다. 이 단어로 검색되는 그 수많은 앱들과 경쟁하기를 원하지는 않을 겁니다. 그러니까 창조적이고 앱에 딱 맞고 사용자들의 검색에 잘 걸릴 수 있는 여러분의 홍보 키워드를 만드세요.


9.     Most discovery and distribution happens in the “free” category.  많은 개발자들이 자신들이 만든 앱의 free 버전과 유료 버전 두가지를 만들죠. 보다 홍보가 많이 되도록요. 왜냐하면 free 카테고리에 있는 앱들은 유저들이 더 많이 찾아보거든요.


10.  Combine your marketing channels. Facebook, Twitter, Google+, blog posts 나 여러분의 앱을 홍보할 수 있는 다른 활자화된 홍보수단을 총 동원해서 활용하세요.





반응형


반응형
Posted on . Written by

New Release


오늘 new public release (2012.894) 를 다운로드 할 수 있다는 것을 알리게 되어서 아주 기쁩니다. 이번 release에서는 계속해서 Mac OS X 10.8 에서의 Gatekeeper  기능에 대한 작업을 할 수 있도록 하는 보다 완전한 기능이 있습니다. 이전에는 유저가 인터넷에서 받은 앱을 인스톨 하는 것을 막는 Gatekeeper 의 특정 디폴트 기능이 disable 해야만 했는데 이제는 그러한 제약이 없습니다.

그 외에도 수많은 새로운 기능과 버그 수정 등이 있습니다.

아래 그중 몇가지를 소개해 드리겠습니다.


* display.newSprite에 추가된 Multisprite 지원 기능
* display.captureBounds 를 통해서 스크린 일 부분만 capture 하는 기능
* media.save 를 통해 Photo library 지원하는 기능
* physics Box2D library를 v2.2.1로 업그레이드
* Physics Body에 gravityScale 프로퍼티 추가. joint type에 새로운 프로퍼티들 추가
* Mac Simulator workflow 개선 (zoom level 과 skinless windows 등등을 기억하는 기능)
* developer device build 때 Lua 디버그 정보 제공
* 안드로이드 WebViews


전체 수정되거나 추가된 사항들은 Corona release notes 를 통해서 보실 수 있습니다.


iOS 6 Beta


지난 주 애플과 구글이 OS를 업데이트 한 것과 관련 우리가 경험했던 여러 이슈들과 관련 미래의 OS 업데이트에 대비해 우리들이 어떻게 할 것인지에 대한 정책과 관련해 논의 했었습니다.


그것과 관련해서 한가지 어려운 점 중의 하나는 애플은 악명높으리 만치 비밀주의라는 것입니다. 애플은 모든것이 NDA 하에 있기를 원합니다. 예전에는 이 의미는 최신 iSO 베타 버전에서는 device build가 불가능하다는 것이었습니다.


이 불가능을 가능으로 만드는 방법을 찾은 것 같습니다.


다음주 쯤에 standard build와 iOS 6 Beta build 중에 선택할 수 있는 기능을 선보일 것 같습니다. 그러면 여러분은 iOS6 에 맞게 build 해서 테스트 할 수 있습니다. (아래 그림을 보세요.)



이것을 하려면 애플의 iOS Developer Program에 가입돼 있어야 합니다. 애플의 프로그램 멤버여야 하고 애플의 NDA 에 부합해야 여러분 아이폰이나 아이패드에 최신 iOS 베타 버전을 인스톨 할 수 있으니까요.

다음주 중에 이 기능을 여러분께 선 보이겠습니다.


iPhone 5

아이폰 5 에 대해 수많은 루머와 새어나온 사진들이라고 하는 것들이 떠 돌아 다닙니다. 저희들이 알기로는 iPhone 5 는 9월 중순경에 모습을 드러낼 것 같습니다. 그리고 9월 말에 출시될 것 같구요. 주로 애플은 새로운 아이폰을 만들어 낼 때마다 새로운 iOS 버전을 출시했습니다. 그래서 그 쫌에 iOS 6 도 launch 될 것으로 기대하고 있습니다.


시중에 떠돌아 다니는 루머에 의하면 iPhone 5 의  새로운 스크린 사이즈는 1136×640 이 될 겁니다. 그러면 아이폰 4s 의 960×640 와 비교할 때 width 는 같지만 height 가 더 크게 되는거네요. 그러면 홈 스크린에 더 많은 앱 아이콘을 넣을수도 있겠죠.


만약 사실이라면 우리는 새로운 simulator skin을 추가해야 되겠네요. 그리고 안드로이드 쪽도 마찬가지로 1200X800 같은 새로운 스크린 사이즈에 맞는 시뮬레이터 스킨을 제공해야 합니다. 그것 말고도 다른 스크린 사이즈가 있으면 저희에게 알려 주세요. 저희 리스트에 추가해서 곧 시뮬레이터 스킨을 제공할 수 있도록 할 께요.


여기까지가 이번주 소식이구요. 다음주에 Tom이 돌아오면 계속 해 오던 FAQ가 이어질 겁니다.

감사합니다.




반응형


반응형
Posted on . Written by


external modules 를 require 할 때 정확히 어떤 일이 일어나는지 헛갈릴 때가 있습니다. 더군다나 스토리보드 scene들이나 여러분의 custom module들과 같이 동작을 하는데 에상하지 못했던 결과가 나오면 더 혼동되죠.

오늘은 여러분과 같이 Lua 에서 module들은 정확히 어떻게 작동을 하는지에 대해 몇가지 실습을 해 보고 설명도 덧 붙이겠습니다. 이 글을 읽으시면 모듈 내의 코드가 실행되거나 built-in require() function 을 call 했을 때 어떤 코드가 run 하지 않는지 등에 대해 이해 하실 수 있을 겁니다.





Including External Modules


가장 간단한 형식은 external module이 테이블 같은 어떤 것을 return 하는 Lua 파일인 경우입니다. 외부 모듈이 하나의 function 인 셈이죠.

아래 정말 간단한 모듈이 있습니다. example1.lua 인데요. 터미널에 한 문장을 print 하고 빈 테이블을 return 하는 것입니다.


example1.lua


local t = {}

print( "example1.lua has been loaded." )

return t


이제 main.lua를 볼까요? 여기서 우선 example1.lua를 require 합니다.


main.lua


local ex1 = require "example1"

ex1.testvar = "Hello world"



예상한대로 ex1은 빈 테이블입니다. example1.lua에서 빈 테이블을 return 했으니까요. 그리고 “example1.lua has been loaded.” 라는 문장이 터미널에 쓰여질 겁니다. 그 다음에 위에 보면 ex1 테이블에 어떤 프로퍼티를 할당했습니다.

이 부분을 주목해 보세요. 여기 약간의 트릭이 있습니다. 다른 모듈에서 이 example1.lua를 require 해 봅시다. scene1.lua라는 모듈에서요. 이미 main.lua에서 example1.lua를 require 했었죠. 이제 어떤 일이 일어나는지 볼까요?


scene1.lua (previous main.lua still applies)


-- ...

local examp1 = require "example1"
print( examp1.testvar )

-- ...

scene1.lua에서 example1.lua를 require 하면 “example1.lua has been loaded” 이 터미널에 뿌려지지 않습니다. 그리고  ex1.testvar 값을 print 하면 터미널에 “Hello World” 가 뿌려집니다. (이 의미는 뭐냐하면 testvar 프로퍼티가 존재한다는 것이죠.


여기서 뭘 알 수 있나요?


첫번쨰로 “example1.lua has been loaded” 라는 문장에 터미널에 뿌려지지 않은 이유는 그 모듈이 이미 main.lua에서 로드 됐기 때문이죠. 모듈이 한번 로드 되면 그 안의 코드가 다 실행되게 되죠. 그리고 모듈의 return 값은 package.loaded라고 하는 글로벌 테이블에 저장됩니다.


여러분이 require를 call 하면 첫번째로 이전에 이 모듈이 이미 로드 된 것인지 아닌지 확인하기 위해 package.loaded table 을 살펴 봅니다. 만약에 있으면 외부 모듈을 새로 require 하는 대신 package.loaded 에 저장된 return value를 return 합니다. 이 return 된 value는 copy가 아니라 reference 입니다. 그러니까 여러분의 모듈이 테이블을 return 한다면 미래에 같은 모듈에 대해 require를 call 하면 같은 테이블을 get 하게 될 겁니다.


만약에 package.loaded 안에 그 모듈이 없으면 그 모듈이 로드 될 겁니다. (그 모듈안의 코드들이 실행 되겠죠.) 그리고 그 모듈의 return value가 package.loaded table안에 저장될 겁니다. (미래에 사용하기 위해 저장하는 거겠죠.) 그래서 두번째에서는 “example1.lua has been loaded.” 이 터미널에 뿌려지지 않은 겁니다. require() 가 call 됐을 떄 global package.loaded table 안에 이미 그 모듈이 존재하면 그 모듈을 re-load 하지 않으니까요.


모듈 안에 있는 코드를 두번 실행하도록 하는 방법에는 두가지가 있습니다.

  1. 코드를 모듈 내에서 함수 안에 넣고 그 함수를 부르는 경우
  2. package.loaded table 에서 그 모듈을 remove 한 다음에 다시 require 하는 경우


첫번째 시나리오에 대한 예제입니다.


example2.lua


local t = {}

print( "example2.lua has been loaded." )

t.hello = function()
    print( 'Hello world.' )
end

return t


main.lua


local ex2 = require "example2"
-- Terminal: example 2 has been loaded.

ex2.hello()
-- Terminal: Hello world.


scene1.lua


local examp2 = require "example2"

examp2.hello()
-- Terminal: Hello world.



예제에서 보듯이 example2.lua를 두개의 다른 모듈(main.lua and scene1.lua)에서 require 했습니다. 첫번째 print statement는 오직 한번 보여집니다. 첫번쨰로 그 모듈이 require 됐을 때죠.

두번째 print statement는 hello() 함수 안에 있습니다. 이것은 hello() 함수가 call 될 때마다 실행되겠죠. 그 코드가 한번 이상 실행되기를 원한다면 함수를 table에 attach 해서 모듈 마지막 부분에서 return 되게 하세요. (또는 단지 require 만 했을 떄 print 되지 않도록 할 때도 그렇게 하면 되겠죠.)


Removing from package.loaded


여러분이 모듈을 require 하려면 (예를 들어 example2.lua) require "example2" 라고 해야 되죠.

그러면 example2.lua의 return value 가 package.loaded table 에 저장 될 겁니다.

package.loaded["example2"]

만약 example2.lua에 있는 코드가 다시 execute 될 필요가 있다면 package.loaded table 에서 remove 한 다음에 다시 call 하시면 됩니다.


아래 그 예제가 있습니다.


main.lua


require "example2"
-- Terminal: example2.lua has been loaded.

package.loaded["example2"] = nil

require "example2"
-- Terminal: example2.lua has been loaded.

require "example2"
-- Terminal:


This is Universal

여러분이 만든 모듈이든 아니면 다운로드 된 모듈이든 혹은 built-in 모듈이든 이 모듈들을 다룰 때는 위에 설명드린 대로 외부 모듈들이 작동합니다.

스토리 보드의 scene들을 다룰 때 그 scene이 로드될 떄 스토리보드 리스너 함수안에 있는 코드들이 어떤 것은 실행되고 어떤 것은 실행되지 않는지에 대한것도 궁금하실 겁니다.

거기에 대한 것은 다음 기회에 다루도록 하겠습니다.

반응형


반응형
Posted on . Written by


수요일 FAQ 시간입니다. 이번주는 Mac Simulator와 native text objects들의 displaying fonts에 대한 다섯가지 질문을 다루겠습니다.


1. How can I keep the (Mac) Simulator window from resizing when I relaunch my app?


Daily Build 883에 새로 시작할 때 디바이스 윈도우를 resizing에 대해 Mac 시뮬레이터의 크기를 유지하는 옵션이 들어갔습니다.  Corona Simulator/Preferences… 로 가서  “Automatically scale simulator to fit screen.”의 선택을 해제 하세요.







2. Why does my app start up in a (Mac) Simulator with a window that is larger than my display?


작은 display들에 큰 디바이스 윈도우 (iPad나 iPad Retina 같은) 를 display 할 떄 맥 시뮬레이터는 relaunch 된 이후에 zoom을 하는 경우가 있습니다. 그래서 실제 스크린크기보다도 더 큰 device window가 나오기도 합니다. Zooming out(Cmd-) 는 display back을 합니다. 새로 zoom out된 것을 재 조정했다고 하더라도 다음번에 relaunch 하게 되면 똑 같은 현상이 일어납니다.


build 883 에서 이 부분에 대해 수정했습니다. 스크린에 맞게 조정할 뿐만 아니라 이전에 유저가 zoom 했던 세팅을 기억해서 다음에 relaunch 할 때 시뮬레이터의 위치와 zoom level을 유지하도록 합니다.


또한 Window 메뉴에 center 라는 옵션을 추가했습니다. 이 옵션을 추가하면 현재 display window의 중심에 위치 시키게 됩니다. 만약 여러분이 여러 디스플레이를 사용한다면 아주 유용할 겁니다. display를 바꾸게 되면 화면 밖으로 나가게 되는 경우도 있죠. 이 기능에 대한 hot key 는 Shift Cmd UpArrow 입니다.


맥 시뮬레이터에는 또 다른 기능이 추가 됐는데요. 디바이스의 테두리를 없앨 수 있습니다.

디바이스 창의 테두리를 없애면 더 여유로운 screen 공간을 사용할 수 있고 스크린에 딱 맞는 디바이스 창을 더 수월하게 해 줍니다. 이 기능은 특히 큰 태블릿 디바이스를 display 할 때 유용합니다.

Corona Simulator/Preferences…로 가셔서 “Display device border (takes effect on next simulator relaunch”를 체크하세요. 말씀드렸듯이 바뀐 기능을 적용하려면 시뮬레이터를 재시작(Cmd r) 하시면 됩니다.


3. Why does the Mac Simulator keep crashing on Mountain Lion (10.8) when I relaunch my app a few times?


맥 시뮬레이터에서 약간의 메모리 누수를 찾았는데요. 여러분이 앱을 relaunch 할 때마다 발생하더라구요. 여러분 시스템의 메모리 여유가 별로 없다면 그리고 앱의 relaunch를 자주 하다보면 시뮬레이터가 crash를 일으 킬 수 있습니다. simulator가 close 되면 누수된 메모리가 다시 해제 됩니다. 이 이슈는 Lion (10.7) 에서도 발생하는데요. 10.8 버전에서는 더 많은 메모리를 사용하는데요 그래서 이러한 일들이 10.8 시스템에서 더 많이 보고 됩니다.


좋은 소식은 daily build 883에서 이 에러를 수정했다는 겁니다. 이 버그는 애플의 Image Kit code 내의 internal bug 때문에 일어난다는 원인을 발견했고 이 문제를 해결하기 위해 애플의 기능이 아는 우리의 routine들을 사용하도록 고쳤습니다. (애플에 bug report 도 했습니다.)


조만간에 public release 에서도 이 수정된 사항이 적용되도록 하겠습니다.


4. Why don’t the fonts in native TextFields and TextBoxes scale correctly on different devices?


config.lua 에서 dynamic scaling을 enable 하면 코로나는 모든 vector, 이미지 그리고 native 객체들을 scale 해서 현재 display에 맞게 맞출 겁니다. 이때 scale 하지 않는 것들은 native.newTextFieldnative.newTextBox에서 사용하는 폰트들입니다. 폰트를 scaling 하게 되면 다른 display 객체들의 scaling이 제대로 작동 안할 때도 있습니다. 각 폰트들 마다 차지하는 공간들이 다르기 때문에 이런 일들이 발생하는데요. native 텍스트 필드에서 폰트를 scale 하려면 여러분이 사용하는 폰트가 있는 코드 부분에서 하셔야 합니다.


여러분이 네이티브 텍스트 필드에 14 포인트의 폰트를 지정했다면 그 텍스트는 scaling facor와 관계 없이 모든 디바이스에서 14 포인트로 display 될 겁니다.

이러한 현상은 오직 native text object에만 해당됩니다. display.newText를 사용한 폰트는 bit 이미지로 랜더링 되기 때문에 제대로 scaling 됩니다.


5. Why don’t the fonts in native TextFields and TextBox scale correctly in the Simulator?


시뮬레이터에서도 4번과 비슷한 현상이 발생하는데요. 시뮬레이터는 zoom in, zoom out을 할 수 있고 시뮬레이션 되는 디바이스를 바꿀 수 있습니다. 하지만 native text object의 폰트 사이즈는 언제나 같습니다. 그러니까 14포인트의 폰트는 zoom level 과 관계없이 항상 14 포인트로 보이게 되는 것이죠. 실제 디바이스에서 display.newText로 생성된 텍스트는 제대로 scale 될 겁니다.



여기까지가 오늘의 FAQ 입니다.

유익한 시간이셨기를 바랍니다.



반응형

PHP로 XML , JSON 다루기

2012. 8. 24. 21:14 | Posted by 솔웅


반응형

일하다가 동료가 처리할 데이터가 있는데 이 데이터를 어떻게 관리했으면 좋겠냐고 물어보더라구요.


XML 로 관리할지 JSON으로 관리 할지.....

저희 시스템은 PHP로 돼 있거든요.


그래서 일단은 JSON이 가장 가벼우니까 데이터를 파일로 관리하면 JSON으로 관리하는 법도 생각해 볼 수 있겠지만 데이터도 많지 않고 바뀌지도 않을 거고 그냥 a 가 1인 경우의 b 값을 화면에 출력만 하면 되니까 디비에 넣어서 관리하는게 제일 편하지 않을까 의견을 주었습니다.


다른 시스템간에 데이터를 인터페이스 할 것도 아니고....


하여간 그래도 그 얘기 듣고 PHP로 XML과 JSON을 처리하려면 어떻게 해야 하는지 그 구체적인 소스가 궁금해서 써핑 해 봤습니다.


* PHP 로 XML 다루기


<?xml version="1.0" encoding="utf-8"?>
<data>
    <total> 2 </total>
    <item>
        <name> Raj </name>
        <phone> 123456789 </phone>
        <age> 17 </age>
    </item>
    <item>
        <name> Akshay </name>
        <phone> 987654321 </phone>
        <age> 15 </age>
    </item>
</data>


이런 xml 데이터가 있을 때 php 코드는 아래와 같으면 됩니다.


<?php
 $xml_string = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/data.xml');
 $xml = simplexml_load_string($xml_string);
 echo $xml->total . "<p>"; //2
 echo $xml->item[0]->name . "<p>";       // Raj
 echo $xml->item[0]->phone . "<p>";        // 123456789
 echo $xml->item[0]->age . "<p>";        // 17
 echo $xml->item[1]->name . "<p>";        // Akshay
 echo $xml->item[1]->phone . "<p>";         // 987654321
 echo $xml->item[1]->age;        // 15
?>


먼저 file_get_contents 로 data.xml 파일에 있는 모든 내용을 긁어 옵니다.

그러면 $xml_string 변수에 배열로 그 내용들이 담길 겁니다.


그 다음에는 복잡하게 코딩할 필요 없이 그냥 simplexml_load_string() 메소드를 사용하시면 됩니다.


그 안의 내용을 처리하는 방법은 $xml-> 다음에 원하는 내용이 있는 태그를 사용하면 됩니다.

total 은 한번만 있으니까 곧바로 얻어오고 그 다음 item 은 계속 반복되는 태그이니까 배열불러오듯이 불러오면 됩니다.


아래 샘플 파일 올려놓겠습니다.


data.xml


xml.php





* PHP 로 JSON 다루기


아래 코드도 어디에선가 긁어 온 건데요.


for(){
  $str[] = array('code'=>$bbs_no,'table'=>$table_type);
}

----------------------
code[0]      table[0]
code[1]      table[1]
----------------------

이렇게 데이터들이 담길 겁니다.

$jsonStr = json_encode($str); // ******* Make Json from array ********
<input type="hidden" name="json_list" id="json_list" value=$jsonStr  /> // Send Form


유저로부터 데이터를 입력받아서 이것을 json으로 encode 한 겁니다.


그러면 이 json 값을 한꺼번에 form 테그에서 send 할 수가 있습니다.


그 다음 받는 파일에서는 아래와 같이 처리하면 됩니다.


$json_list = $_REQUEST['json_list']; //get Form
$json_list = str_replace('\\', '', $json_list);
json_list= json_decode($json_list, true); // Decode json
echo $json_list[0]['code'];
echo $json_list[1]['table'];


간단하네요.


나중에 유용하게 사용될 수 있을 것 같습니다.


반응형

.clone() 메소드 알아보기

2012. 8. 23. 21:25 | Posted by 솔웅


반응형

.clone()


.clone()은 말그대로 복제 해 놓는 겁니다.


<div class="container"> <div class="hello">Hello</div> <div class="goodbye">Goodbye</div> </div>

이 코드를 가지고 아래 처럼 표현하면

$('.hello').appendTo('.goodbye');

그 결과는

<div class="container"> <div class="goodbye"> Goodbye <div class="hello">Hello</div> </div> </div>

이렇게 나올 겁니다.

hello 클래스를 goodbye 클래서 다음에 appendTo 했으니까요.
그런데 Hello를 그대로 유지하면서 goodbye 클래스 다음에 hello 클래스를 다시 넣고 싶을

때 clone()을 쓰시면 됩니다.


$('.hello').clone().appendTo('.goodbye');

이렇게 하면 .hello 클래스의 복제를 만들어서 goodbye 클래스의 뒤에 appendTo를 할 겁니다.
그 결과는 아래와 같겠죠.

<div class="container">
  <div class="hello">Hello</div>
  <div class="goodbye">
    Goodbye
    <div class="hello">Hello</div>
  </div>
</div>

이벤트 핸들러까지 clone 하고 싶으면 withDataAndEvents parameter를 사용하면 됩니다.

var $elem = $('#elem').data( "arr": [ 1 ] ), // Original element with attached data $clone = $elem.clone( true ) .data( "arr", $.extend( [], $elem.data("arr") ) ); // Deep copy to prevent data sharing





예제파일을 보죠.

<!DOCTYPE html>
<html>
<head>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
 
<b>Hello</b><p>, how are you?</p>

<script>
  $
("b").clone().prependTo("p");
</script>

</body>
</html>


b 태그에 있는 내용을 복제해서 p 태그에 붙입니다.

그러면

Hello

Hello, how are you?

이렇게 나옵니다. Hello 가 앞에 나온건 appendTo가 아니라 prependTo를 했기 때문이죠.

<!DOCTYPE html>
<html>
<head>
 
<style>
 
#orig, #copy, #copy-correct {
   
float: left;
    width
: 20%;
 
}
</style>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<div id="orig">
   
<div class="elem"><a>1</a></div>
   
<div class="elem"><a>2</a></div>
   
<div class="elem"><a>3</a></div>
   
<div class="elem"><a>4</a></div>
   
<div class="elem"><a>5</a></div>
</div>
<div id="copy"></div>
<div id="copy-correct"></div>

<script>
// sort order is not guaranteed here and may vary with browser  
$
('#copy').append($('#orig .elem')
         
.clone()
         
.children('a')
         
.prepend('foo - ')
         
.parent()
         
.clone());
 
// correct way to approach where order is maintained
$
('#copy-correct')
         
.append($('#orig .elem')
         
.clone()
         
.children('a')
         
.prepend('bar - ')
         
.end());
</script>

</body>
</html>

두번째 예제의 스크립트 부분을 보면 id 가 copy 인 곳 (#copy)에 뭔가를 append 하네요.

바로 그 전에 있던 id 가 orig인 곳 내의 elem 클래스들인데요. 이것을 clone() 했습니다.

그리고 children()으로 그 안의 a 부분을 찾고 그 앞에 foo - 를 넣습니다.

그 다음 parent().clone()은 뭘까요. 그 parent 의 값을 받아서 clone을 하는 것 같습니다.

그러면 div 까지 clone 이 되서 줄 바꿈 효과까지 나오게 됩니다.

두번째는 id가 copy-correct 인 곳에 id가 orig인 것의 elem 클래스를 append 하는데요.

그것을 clone 하고 children 중에 a 를 찾은 다음에 앞에 bar - 를 붙이네요. 그리고 끝입니다.

.end()는 어떤 역할을 할까요. 위에 있었던 .parent().clone()이랑 같은 역할을 하는 것 같은데.

잠깐 봤더니 해당 부분에만 적용 된 효과를 전체 문서에 적용 되게끔 확장 해 주는 메소드인 것 같습니다. 나중에 따로 공부해 봐야 할 것 같습니다.


그 결과는 아래와 같습니다.




반응형

.find() 메소드 알아보기

2012. 8. 23. 19:38 | Posted by 솔웅


반응형

.find()



이 메소드는 DOM 안에 있는 엘리먼트를 찾는 메소드로서 .children() 메소드와 비슷합니다. 다른점은 .children() 메소드는 단지 single level down 만 한다고 하네요.

.find() 정리한 다음에 .children()도 정리해야 겠네요.

곧바로 예제부터 볼께요.


<!DOCTYPE html>
<html>
<head>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<p><span>Hello</span>, how are you?</p>
<p>Me? I'm <span>good</span>.</p>
<script>
  $
("p").find("span").css('color','red');
</script>

</body>
</html>


스크립트를 보면 p 태그에서 span을 찾아서 css를 적용해서 색을 빨강으로 바꾸네요.

그러면 첫번쨰 Hello와 두번째 good 이 빨간색으로 바뀔겁니다.




<!DOCTYPE html>
<html>
<head>
 
<style>
    span
{ color: blue; }
 
</style>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<p><span>Hello</span>, how are you?</p>
 
<p>Me? I'm <span>good</span>.</p>
 
<div>Did you <span>eat</span> yet?</div>
<script>
 
var $spans = $('span');
  $
("p").find( $spans ).css('color','red');
</script>

</body>
</html>


두번째 예제는 해당 엘리먼트를 변수에 담았네요. 그래서 p 태그내에 있는 span에 있는 내용이 빨간색으로 변합니다.

div 에 있는 span에는 적용이 안 될 겁니다.


<!DOCTYPE html>
<html>
<head>
 
<style>
  p
{ font-size:20px; width:200px; cursor:default;
      color
:blue; font-weight:bold; margin:0 10px; }
 
.hilite { background:yellow; }
 
</style>
 
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
 
<p>
  When the day is short
  find that which matters to you
  or stop believing
 
</p>
<script>
 
var newText = $("p").text().split(" ").join("</span> <span>");
  newText
= "<span>" + newText + "</span>";

  $
("p").html( newText )
   
.find('span')
   
.hover(function() {
      $
(this).addClass("hilite");
   
},
     
function() { $(this).removeClass("hilite");
   
})
 
.end()
   
.find(":contains('t')")
   
.css({"font-style":"italic", "font-weight":"bolder"});

</script>

</body>
</html>


세번째 예제는 좀 복잡하네요.

newText 변수에 어떤 내용을 담았는데요.

p 태그 안에있는 내용들을 한칸 띄어쓰기 된 부분을 기준으로 모두 나누고 각각 span 을 적용하는 겁니다. 그러면 각 단어별로 span 이 따로따로 적용이 되겠죠.


다음에는 p 태그 안에 html부분에 이 newText를 담은 다음에 span을 찾습니다.

거기에 마우스를 올리면 hilite 라는 클래스가 적용이 되도록 했네요. 마우스가 빠져나가면 그 클래스 적용이 해제되구요.


hilite 클래스는 jQuery에 미리 정해진 클래스 인가 봅니다. 배경을 노란색으로 hilite 해 주네요.

여기서 끝이 아니라 t 자가 들어가 있는 단어들을 찾아서 폰트 스타일을 이탤릭으로 바꾸고 또 볼드체로 바꿉니다.


좀 복잡하군요.


.find 가 다른 여러 메소드와 협동해서 이렇게 복잡한 일을 하네요.


반응형