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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

내일 (2/8) 일 금요일부터 토요일까지 이곳에 눈이 많이 내린다고 합니다.

회사 출근했더니 관련해서 메일이 하나 와 있네요.

오늘은 이 메일가지고 영어 공부를 합니다.




THE NATIONAL WEATHER SERVICE IN TAUNTON HAS ISSUED A BLIZZARD

WATCH,IN EFFECT FROM FRIDAY MORNING THROUGH SATURDAY AFTERNOON.

 

LOCATION: MASSACHUSETTS, RHODE ISLAND, NEW HAMPSHIRE

 HAZARD TYPES: HEAVY SNOW WITH BLIZZARD CONDITIONS.

 ACCUMULATIONS: 12 TO 24 INCHES.

 

LIGHT SNOW DEVELOPS BY FRIDAY MORNING. SNOW WILL INCREASE INTENSITY DURING FRIDAY AFTERNOON. THE HEAVIEST SNOW WILL OCCUR FRIDAY NIGHT INTO SATURDAY MORNING.

 

HEAVY SNOW AND STRONG WINDS WILL BRING THE POTENTIAL FOR BLIZZARD

CONDITIONS. THE WORST OF THE STORM WILL BE FRIDAY NIGHT INTO SATURDAY

MORNING. SNOWFALL RATES OF 2 TO 3 INCHES PER HOUR POSSIBLE. TRAVEL MAY

BECOME NEARLY IMPOSSIBLE WITH BLOWING AND DRIFTING SNOW.

WHITE OUT CONDITIONS WILL BE POSSIBLE, MAKING TRAVEL VERY DANGEROUS. 

 

PLEASE PLAN ACCORDINGLY AND DON’T FORGET TO TAKE YOUR LAPTOP HOME.

 

-------------------

Thank you,



Taunton 에 있는 National Weather Service 에서 금요일 오전부터 토요일 오후까지 폭설 주의보를 발표했습니다.


위치 : 매사추세츠, 로드 아일랜드, 뉴 햄프셔

주의보 종류 : 강풍을 동반한 폭설

적설량 : 12 ~ 24 인치 (30~ 60 센티미터)


금요일 오전부터 눈발이 날리기 시작해 금요일 오후를 거치면서 점차 눈이 많이 내리겠습니다. 가장 눈이 많이 내릴 시기는 금요일 밤부터 토요일 오전까지 입니다.


많은 눈과 강한 바람은 blizzard 상황이 될 수 있습니다. 가장 폭풍이 심할 때는 금요일 밤부터 토요일 오전까지 입니다. 시간당 2~3인치 적설량을 보일것으로 예상됩니다. 강한 바람을 동반한 많은 눈으로 이동이 불가능할 것으로 예상됩니다.  시야 확보가 어려운 (white out) 상황이 될 것으로 예상되며 이동을 하는 것은 매우 위험할 것입니다.


이를 참조해서 일정을 세우시고 집에 랩탑을 가져가는 것을 잊지 말아 주세요.



감사합니다.






눈이 엄청 내릴것 같습니다. 50~60 센티미터 적설량을 보일거라는데...

제가 눈이 많이 내리는 강원도 출신이지만 이렇게 많이 쌓이는 눈은 처음 볼 것 같습니다.
(강원 산간에 사셨던 분들은 보셨을 테지만요.)

일단 Blizzard 가 적절하게 번역할 단어 찾기가 어려웠습니다. 단순히 눈보라라고 하면 너무 느낌이 약하구요...

Blizzard :

1 a long severe snowstorm
2 an intensely strong cold wind filled with fine snow
3 an overwhelming rush or deluge <a blizzard of mail around the holidays>

그리고 Intensity 라는 단어가 눈에 띄었구요.

Intensity :
1 the quality or state of being intense; especially : extreme degree of strength, force, energy, or feeling
2 the magnitude of a quantity (as force or energy) per unit (as of area, charge, mass, or time)

그리고 Black out 은 알고 있었는데 여기서는 White out 이라는 단어가 사용됐군요.
Black out 은 정전이 되서 깜깜한 경우 혹은 기억이 깜깜하게 안 나는 경우 사용하죠. 술먹고 완전 기억 안 날 때도...

White out
: a surface weather condition in a snow-covered area (as a polar region) in which no object casts a shadow, the horizon cannot be seen, and only dark objects are discernible; also : a blizzard that severely reduces visibility

완전 눈으로 덮여서 모두 하얗게 보여 거리감을 못느끼는 상황을 말하네요. 그림자도 없고 지평선도없고 온통 하얘서 아무것도 구분이 되지 않는 상황을 말하는 거네요.





반응형


반응형
Posted on . Written by



This could be the year for RIM’s rebirth. The previously struggling company made a splash with Tuesday’s announcements: they’re rebranding the company name to “BlackBerry,” hiring Alicia Keys as the new Global Creative Director, unveiling the BlackBerry 10 operating system, and announcing two new phones: the BlackBerry Z10, a touchscreen smartphone, and the Q10, a smartphone with a physical keyboard.

올해는 RIM 이 다시 태어나는 해가 될 겁니다. 지난 화요일 발표로 여러 얘기가 설왕설래 했었죠. RIM 이 회사 이름을 "BlackBerry" 로 아예 바꿔버린다고 발표를 했었습니다. 그리고 Global Creative Director 로 Alicia Keys 를 영입했고 BlackBerry 10 운영체제를 발표했습니다. 그리고 두개의 새로운 전화기도 발표했구요. BlackBerry Z10으로 터치 스크린 방식의 스마트폰이고 Q10 이라는 physical keyboard 형식의 스마트폰 두 기종을 발표했습니다.




BlackBerry’s bold attempt to compete in the smartphone market could make consumers and competitors take a second look. The BlackBerry Z10 features a 4.2 inch screen, unique predictive text capabilities that adapt to writing patterns, app essentials (including video, messaging, Facebook, Twitter and more), innovative software design, and a time shift camera that allows users to capture their “best” face. On the performance front, the dual-core processor with 2GB memory makes this the fastest BlackBerry to date.

Considering BlackBerry’s reinvention, how do you think the company will fare against the competition in 2013?


스마트폰 시장에서 소비자들과 경쟁자들에게 다시 어필하기 위한 블랙베리의 시도인데요. BlackBerry Z10 은 4.2인치 스크린에 writing pattern들을 장착한 unique 한 예상문자 작성 기능이 있고 주요 앱들이 제공되고 있습니다. (비디오, 메세징, 페이스북, 트위터 같은 앱들이요.) 소프트웨어 디자인의 혁신이 있고 사용자가 "best" face 를 찍을 수 있도록 해 주는 time shift camera 가 장착돼 있습니다. 퍼포먼스쪽으로 보면 듀털코어 프로세서가 장착돼 있고 2GB 의 메모리가 있어 아주 빠른 속도를 보여주고 있습니다. 이런 블랙베리의 재혁신을 보시면서 어떤 생각이 드시나요? 블랙베리가 2013년에는 경쟁사들과의 경쟁에서 좋은 결과를 볼 것 같나요?



오늘은 처음으로 Coronasdk  홈페이지의 blog 에 올라오는 글 중 Friday Night Forum 글을 읽고 블로그에 옮겨 봤습니다.

블랙베리와 관련해서 올라왔는데요.


회사에서 직원들에게 회사 폰으로 블랙베리를 제공하고 있어서 제가 개발하는 모바일 웹들은 모두 블랙베리를 주 타겟으로 하고 있습니다.

회사 폰이 블랙베리가 아닌 다른 기종으로 쉽게 바뀔것 같지도 않구요.


그래서 블랙베리에 대해 관심이 있는데요.


이번에 새로운 운영체제가 발표 됐네요.


회사에서 회사 폰을 교체할 때 이 새 운영체제의 블랙베리를 선택할지 아니면 아이폰이나 안드로이드를 선택할지는 모르겠습니다.


블랙베리가 일반 소비자 시장에서는 인기가 전혀 없지만 아직 Enterprise 시장에서는 다른 폰 보다 우월한 면이 있기는 한 것 같습니다.


Corona SDK 에서는 블랙베리를 지원하지 않는 것으로 알고 있는데 Corona SDK 블로그에 관련 글이 올라와서 읽어 봤습니다.


코로나에서 블랙베리도 지원하려고 하는 걸까요?

아니면 블랙베리에서 안드로이드 앱을 사용할 수 있도록 지원할 수도 있겠네요.


원래 블랙베리 10에서 안드로이드 앱을 지원할 거라는 뉴스가 있기는 했는데 이번 발표내용을 보도한 기사에서는 그런 얘기를 볼 수가 없네요.




반응형


반응형
by Corona Labs on Wednesday, January 30, 2013 at 7:32pm ·



When leaving a storyboard scene, you are required to clean up:

 

Runtime listeners    

Timers    

Transition's that have an onComplete    

Audio that has an onComplete    

Network requests that have not completed yet and will call back to a listener.

 

Also, if you load sounds in your storyboard scene in either createScene, willEnterScene or enterScene, it's your responsibility to dispose of them in exitScene() or destroyScene().



스토리보드 장면을 떠날때는 깨끗하게 정리하고 가셔야 합니다.


런타임 리스너

타이머

onComplete 된 Transition

onComplete 된 오디오

아직 complete 되지 않았고 리스너로 call back 될 네트워크 요청


그리고 createScene, willEnterScene or enterScene 안에서 스토리보드에 사운드를 로드했다면 exitScene() or destroyScene() 에서 그것들을 dispose 시켜주셔야 합니다.



댓글에는 이미지나 위젯들도 clean up 해 줘야 된다고 써있네요.

그리고 transition이나 network request 는 어떻게 cancel 해야 하냐는 질문도 있구요.

아직 답글은 안 달렸고.....

그거 보니까 작년 12월에 보낸 제 질문 메일이 생각납니다.

이 블로그에 올라온 질문들 정리해서 메일로 보냈었는데... 한달째 감감무소식....

이젠 메일로 보내지 말고 포럼에 올려봐야겠어요.

반응형

Pinch Zoom Rotate 구현하기 - 4/11 -

2013. 2. 1. 05:59 | Posted by 솔웅


반응형
Posted on . Written by



Faking Multitouch Input


파란 사각형 객체는 multiple touch input들의 recipient(받는사람) 이 될 겁니다. 이렇게 하기 위해서 우선 그 touch listener 함수를 수정해야 합니다. 우선 moved와 eneded 그리고 cancelled phases에 대해 print() 구문을 몇개 넣을 겁니다. 아래 코드는 작은 파란 사각형의 :touch() listener function을 수정한 결과 입니다.


sample4.lua

function rect:touch(e)
 
local target = e.target -- get the object which received the touch event
-- handle began phase of the touch event life cycle...
if (e.phase == "began") then
 
print( e.phase, e.x, e.y ) -- create a tracking dot
local dot = newTrackDot(e) -- we handled the began phase
return true
 
elseif (e.parent == rect) then
 
if (e.phase == "moved") then
print( e.phase, e.x, e.y )
else -- ‘ended’ and ‘cancelled’ phases
print( e.phase, e.x, e.y )
end
return true
 
end
return false -- if target is not responsible for this touch event return false
end






가장 많이 바뀐 부분은 moved,ended, cancelled phases 에 추가 된 건데요. 여기서 tracking dot들이 파란 사각형의 :touch() function을 call 하도록 하는 겁니다. event parameter 로 pass 하고 하얀 원의 touch 함수에의해 receive 되게 되죠.

elseif 구문도 중요한데요. tracking dot들이 사각형에 event parameter를 pass 한다면 e.target은 사각형이 아니라 그 dot에 대한 reference 가 될 겁니다. 이 reference 를 .parent 프로퍼티안의 사각형으로 저장할 겁니다. 이렇게 함으로서 rect:touch() function은 해당 터치 이벤트가 맞는지 안 맞는지 체크할 수 있게 됩니다. 물론 아직 원의 touch 함수가 사각형의 :touch()를 call 하도록 바꾸지는 않았습니다. 이 작업을 하기 전에 각 원이 사각형 객체에 대한 reference를 가지고 있어서 rect:touch() function를 call 하고 evnet parameter를 pass 할 수 있는지 여부를 확인해야 합니다.

아래 newTrackDot() function의 시작부분 입니다. 이 함수는 이벤트 파라미터의 원래 .target 프로퍼티에 대한 local copy 를 만들어야 합니다.


-- creates an object to be moved
function newTrackDot(e)
 
local circle = display.newCircle( e.x, e.y, 50 ) -- create a user interface object
circle.alpha = 0.5 -- make it less imposing
local rect = e.target -- keep reference to the rectangle
function circle:touch(e) -- standard multi-touch event listener
-- ...


원래의 began event phase를 receive 한 객체를 계속 reference 하는 것은 tracking dot을 multitouch event에서 해당 reference로 영향을 줄 수 있도록 합니다. 이제 began phase event parameter를 "rect"로 보내기 위한 tracking dot이 필요 없게 됐습니다. 왜냐하면 이미 이벤트를 receive 했기 때문이죠. 이제 우리가 해야할 작업은 tracking dot의 :touch() function 안의 rect:touch(e)를 call 하는 겁니다. 그렇게 하면 다른 phase들이 그 rect 객체로 보내질 수 있게 되는 것이죠.

main.lua

sample4.lua

-- standard multi-touch event listener
function circle:touch(e)
 
local target = circle -- get the object which received the touch event
circle.alpha = 0.5 -- make it less imposing
e.parent = rect -- store the parent object in the event
-- handle each phase of the touch event life cycle...
if (e.phase == "began") then
display.getCurrentStage():setFocus(target, e.id) -- set touch focus on this object
target.hasFocus = true -- remember that this object has the focus
return true -- indicate the event was handled
elseif (target.hasFocus) then -- this object is handling touches
if (e.phase == "moved") then -- move the display object with the touch
target.x, target.y = e.x, e.y
else -- "ended" and "cancelled" phases
display.getCurrentStage():setFocus(target, nil) -- remove touch focus
target.hasFocus = false -- this object no longer has the focus
end
 
rect:touch(e) -- send the event parameter to the rect object
return true -- indicate that we handled the touch and not to propagate it
end
 
return false -- if target is not responsible for this touch event return false
end


아주 간단하죠. 이제 우리는 사각형을 만들었습니다. 그 사각형은 touch 가 될 때마다 tracking dot을 생성하게 됩니다. 각 dot들은 또한 그들의 touch 정보를 그 사각형에 보내게 됩니다. 이 때 그 dot들의 original touch handler 함수를 사용하게 되는 거죠. 이 사각형은 그것이 맞는  target인지 알고 있습니다.

이 trick 을 사용함으로서 얼티터치 정보를 사용할 수 있게 됐습니다.





반응형


반응형


Posted on . Written by



수요일의 FAQ 시간입니다. 이번주는 정확하게 FAQ라고는 할 수 없는데요. Daily Builds 에 최근 적용된 맥 시뮬레이터와 관련된 업데이트들을 다루겠습니다.


1. Loading the last project on simulator startup


Daily Build #996에서 새로 Preferences menu에 새로운 preference 가 추가됐습니다. “Automatically open last project” "바로 전 project 자동적으로 open 하기" 입니다. 이 기능은 이전에 작업했던 프로젝트를 계속 작업해야 될 때 아주 유용하겠죠.




2. Reloading the last project


맥과 윈도우 시뮬레이터에서 Cmd R (Ctrl R on Windows) 를 사용해서 지난번 프로젝트를 Relaunch 할 수 있었습니다. 그런데 맥 시뮬레이터에서는 이 시뮬레이터가 처음 시작했을 경우는 이 기능을 사용할 수 없었는데요. build #1017 에서 이 기능이 가능하게 됐습니다. 그리고 위 1번에서 소개했던 relaunch 를 항상 실행되게 할 수도 있습니다.



3. Simulator now continues to run after a build


맥 시뮬레이터로 프로젝트를 빌드했다면 빌드가 진행될 때 디바이스 skin 윗부분에 giant “iOS spinner”가 나오는 것을 보셨을 겁니다. 이게 빌드가 다 끝나고 난 다음에도 계속 나타났었죠. 그리고 시뮬레이터가 suspend 됐었습니다. 이제는 suspend 되지 않고 시뮬레이터가 계속 실행됩니다. 여러분 스스로 시뮬레이터를 suspend 시키시려면 Hardware menu에서 Suspend 를 선택하거나 Cmd downarrow를 누르시면 됩니다.

4. Unicode characters in asset file names


build #1017에서 맥 시뮬레이터는 asset file들의 이름에서 unicode를 지원합니다. 이렇게 함으로서 이미지나 사운드 파일과 하위 디렉토리까지 사용할 수 있게 됐습니다. 윈도우에서는 아직 파일이름에 유니코드를 사용하는데 약간의 이슈가 있습니다.



5. Supporting iOS 6.1 builds


1월 28일 애플이 공식적으로 iOS 6.1을 release 했습니다. 저희 build server에는 최신버전으로 인스톨할 계획입니다. 그리고 며칠 후에 여러분들이 그 최신 버전을 사용하실 수 있을 겁니다. (check the Daily Build summary page) 이후에 나올 몇개의 Daily Builds 에서는 현재 버전인 iOS 6.0 SDK와 새 버전인 6.1 SDK를 모두 지원하게 될 겁니다. build window에서 pull-down menu 를 선택해서 원하시는 iOS SDK 버전을 선택하시면 됩니다.

시뮬레이터를 좀 더 개선하거나 추가했으면 하는 기능이 있으면 Corona Feedback page 에 올려 주세요.


오늘은 여기까지 입니다. 여러분에게 도움이 되었기를 바랍니다.






반응형


반응형

Study says Rhode Island is one of 10 states with highest taxes on poor


January 30, 2013 12:01 am
By Katherine Gregg



PROVIDENCE, R.I. -- As the tax debate begins anew at the State House, a new study has identified Rhode Island as one of ten states with the highest taxes on the poor.

The poorest Rhode Islanders paid 12.1 percent of their income in state and local income, sales and property taxes in 2010. The top 1 percent paid 6.4 percent, according to a newly-released study by the non-partisan, liberal Institute on Taxation & Economic Policy.

"Fairness is, of course, in the eye of the beholder,'' the study's authors acknowledged. "Yet almost anyone would agree that the best-off families should pay at a tax rate at least equal to what low- and middle-income families pay.''

Kate Brewster, executive director of The Economic Progress Institute in Rhode Island, viewed the report as ammunition for the campaign by labor and others to convince state lawmakers to ask the wealthy to "pay a little more.'' Advocates are drafting a bill that would raise the top rate from 5.99 percent to 7.9 percent on those whose household income tops $250,000.


PROVIDENCE, R.I. -- 주의회에서 세금관련 논쟁이 다시 불거졌다. 새로운 연구 보고서가 로드 아일랜드가 저소득층에게 높은 세금을 부과하는 상위 10개 주 중 하나라는 것을 발표했기 때문이다.

이 연구 보고서에 따르면 로드 아일랜드의 가장 저소득층들은 2010년 그들의 수입에서 중앙정부와 주정부 소득세와 부과세 그리고 재산세 등으로 12.1%를 세금으로 냈다. 상위 1%는 6.4%를 냈다. 

"어느 것이 올바른 것이냐는 판단은 보는 분들이 결정할 일이다" 라고 이 연구보고서의 저자는 언급하면서 "대부분의 사람들은 고소득자들이 적어도 저소득자와 중산층이 내는 세금과 같은 비율을 내야한다는 것에 동의한다." 라고 말했다.

로드 아일랜드의 경제발전연구소에서 executive director로 있는 Kate Brewer는 이 보고서가 노동자들과 부자증세를 요구하는 의원들에게 유리하게 활용할 수 있는 자료가 될 것이라고 보았다. 이 부자증세를 공개적으로 지지하는 이들은 연소득 25만불(연봉 2억 7천만원) 이상인  층에는 세금을 현행 5.99%에서 7.9%로 인상해야 한다는 법안을 상정한 상태다.





오늘 이 기사를 통해서 좋은 공부를 하게 됐습니다.

국가에서 세금을 소득순위에 따라 부과하는 방법에는 세가지가 있는데요.

a progressive tax (누진세) : 소득이 높을 수록 세금 비율이 높음

a regressive tax (역진세) : 소득이 높을 수록 세금 비율이 낮음

a proportional tax (비례세) : 소득수준에 관계없이 세금 비율이 일정함


2차대전 이후 대부분 소득세에 대해서는 progressive tax를 적용하는 것으로 알고 있습니다.

그리고 생필품등에 대한 간접세는 일정한 금액이 세금으로 부과되기 때문에 결과적으로 regressive tax 적인 성격이 있는 것으로 알고 있구요.


이번에 발표된 이 연구 보고서는 소득세와 부과세 그리고 재산세를 모두 합해서 소득에 비해 세금을 얼마나 내는지에 대해 연구 보고한 내용인 것 같습니다.


결과는




이렇습니다.


미국 50개주 평균을 낸 것인데요.


하위 20%에 해당하는 저소득층은 11.1%의 세금을 낸 반면 상위 1%는 5.6%의 세금 밖에 안 냈습니다.


결과적으로 소득세만이 아니라 부가세 재산세 등을 모두 합쳤을 경우 미국은 regressive tax 적인 결과가 나왔습니다.

즉 소득이 낮은 사람들은 세금 비율이 더 많고 소득이 높은 사람들은 세금 비율이 훨씬 더 적게 나타난거죠.




가장 regressive state tax system을 가진 주는 미국 서북부에 있는 워싱턴주네요.

스타벅스의 고향인 시애틀이 있는 곳. (미국 수도인 워싱턴 D.C. 하고는 다릅니다.)




가구 소득별로 본 각종 세금 비율 입니다.

하위 20% 저소득층들은 부가세와 특별소비세 등 물건을 살 때 부과되는 세금의 비율이 월등히 높네요. 소득세는 누진세가 적용되기 때문에 아주 낮구요. 그리고 재산세의 비율이 높습니다.

반면에 상위 1% 소득 가구는 소득세의 비율이 아주 높지만 반면에 부가세/특별소비세나 재산세의 비중은 타 소득계층보다 월등히 낮습니다.


그러니까 이렇게 regressive tax 현상이 나타난 이유는 저소득층들은 없는돈에 먹고 살려고 사는 물건들에 붙는 세금이 소득과 비교할 때 부담이 되는 거죠. 없는 재산에 내는 재산세도 소득이 적으니까 부담이 될 수 밖에 없구요.


실질적으로 가난한사람이 세금을 내는 비율이 훨씬 더 많은 현상을 개선하려면 어떻게 해야 될까요?

물건 살 때 일일이 소득 확인하고 세금을 붙일 수도 없고...



미국 50개 주 들중에 가난한 사람들에게 실제 세금 비율을 가장 높게 적용하는 상위 10개 주 입니다.

이 중에 로드 아일랜드가 들어갔네요. 그래서 이게 지역신문에 기사화 된 거구요.


미국은 이렇다네요.


한국은 부자들의 세금 비율이 얼마나 될까요? 


이 연구 보고서 자료는 여기에 가면 보실 수 있습니다.






반응형

Pinch Zoom Rotate 구현하기 - 3/11 -

2013. 1. 29. 21:58 | Posted by 솔웅


반응형
Posted on . Written by



The Multitouch Problem


위 코드의 장점은 multiple touche들을 쉽게 구분할 수 있다는 겁니다. 그래서 각 object들은 자신들에 할당된 touch를 잃지 않고 계속 영향을 받을 수 있는거죠. 아주 큰 장점이지만 작은 문제점도 있습니다.

"
아주 큰 장점은 setFocus 로 유저가 어떤 object를 touch 헀으면 그 object 내에서 해당 touch는 계속 유효하게 되는 겁니다. 그 object 밖으로 나가버리면 더이상 유효하지 않게 되는거죠.

작은 문제점은 다른 touch 이벤트를 receive 하게 되면 이 setFocus 는 이 display object를 stop 시킨다는 겁니다.


만약 아직 setFocus를 call 하지 않았다면 hasFocus 를 사용하는 것이 해당 object 가 그 object에서 시작하지 않은 이벤트들을 무시하도록 하는 편리한 방법입니다. 이 방법은 자주 필요한데요. 왜냐하면 유저들은 그 객체가 아니라 배경화면이나 그 객체 밖에서 시작하는 swiping 이벤트를 자주 발생시키거든요. 그 swiping 이벤트는 이 객체를 지나가게 되죠. 그래서 이 객체에서 시작되지 않은 이벤트를 무시하도록 하려고 하는 겁니다. 그리고 그 다음 드는 의문은 코로나가 어떻게 여러 객체들이 multiple touch들을 받아서 작동하도록 만드는가 입니다. 그 방법은 바로 began phase안에 tracking object를 생성하는 것입니다.


The Concept

이전에 다뤘던 코드에 약간의 변화를 주겠습니다. 우리는 began phase안에서 여러 객체들을 생성하는 하나의 object를 생성할 겁니다. 이 객체들은 각각의 touch들을 track 할 겁니다. 그리고 그 touch 가 끝나면 해당 객체를 없애도록 코딩할 겁니다. 이를 구현하기 위해 touch event의 began phse를 listen 하는 함수를 하나 만들겁니다. 그리고 moved 를 listen 하는 함수도 하나 만들거구요. 이 두개의 함수들은 target listening object와 tracking dot object들에 add 될 겁니다.


Spawning Tracking Dots




첫번째로 처음에 began phase를 handle 하게 될 객체를 생성해야 합니다. began phase에서 이 객체는 tracking dot을 생성하기 위해 function을 call 할 겁니다.



sample3.lua


system.activate("multitouch") -- turn on multitouch

 
-- create object to listen for new touches
local rect = display.newRect( 200, 200, 200, 100 )
rect:setFillColor( 0, 0, 255 )
 
-- standard multi-touch event listener
function rect:touch(e)
 
local target = e.target -- get the object which received the touch event
-- handle began phase of the touch event life cycle...
if (e.phase == "began") then
 
local dot = newTrackDot(e) -- create a tracking dot
return true -- we handled the began phase
end
 
return false -- if target is not responsible for this touch event return false
end
 
rect:addEventListener("touch") -- listen for touches starting on the touch object

간단해서 딱 보면 코드를 이해하실 수 있을 겁니다. 어떤 touch 이벤트가 일어나던지 그 began phase를 listen 할 display 객체를 생성합니다. 이 객체가 touch 이벤트의 began phase를 receive하면 새로운 display object를 생성할 함수를 call 하게 됩니다. 이 새 object는 그 객체를 생성시킨 touch를 track 하게 될 겁니다. 그 작업은 setFocus 를 call 함으로서 가능해 지죠. hasFocus 값을 세팅하지 않은 점을 잘 보세요. 왜냐하면 이 multitouch 객체들은 began phase에서만 처리되고 있거든요.



다음으로 tracking dot을 생성해야 합니다. 이 코드는 이전의 multitouch function과 거의 유사합니다.


-- creates an object to be moved
local function newTrackDot(e)
 
local circle = display.newCircle( e.x, e.y, 50 ) -- create a user interface object
circle.alpha = 0.5 -- make it less imposing
-- standard multi-touch event listener
function circle:touch(e)
 
local target = circle -- get the object which received the touch event
-- handle each phase of the touch event life cycle...
if (e.phase == "began") then
 
display.getCurrentStage():setFocus(target, e.id) -- set touch focus on this object
target.hasFocus = true -- remember that this object has the focus
return true -- indicate the event was handled
 
elseif (target.hasFocus) then -- this object is handling touches
if (e.phase == "moved") then -- move the display object with the touch
target.x, target.y = e.x, e.y
else -- "ended" and "cancelled" phases
display.getCurrentStage():setFocus(target, nil) -- remove touch focus
target.hasFocus = false -- this object no longer has the focus
end
return true -- indicate that we handled the touch and not to propagate it
end
return false -- if target is not responsible for this touch event return false
end
circle:addEventListener("touch") -- listen for touches starting on the touch layer
circle:touch(e) -- pass the began phase to the tracking dot
return circle -- return the object for use
end




이 함수에서는 단 두가지 변화만 주었습니다.

  • circle:touch(e)를 call 했습니다. 왜냐하면 이 circle 이 바로 그 생성된 객체이기 때문이죠. 그리고 touch 이벤트의 began phase를 실제로recieve 하지 않은 객체이구요. 이렇게 call 함으로서 이 circle 객체가 그 touch 이벤트의 control 을 받도록 합니다.
  • :touch() function의 시작부분에 그 circletarget 으로 사용하기 위해 수정했습니다. 왜냐하면 그 e.target property는 실제 touch began이 시작한 그 "rect" 객체이기 때문입니다.


이 코드가 실행되면 작은 파란 사각형을 볼 수 있습니다. 이 사각형은 여러개의 하얀 원들을 생성해 낼 수 있습니다. 각각의 원은 가각의 touch 에 의해 움직입니다. 이 매커니즘은 모든 touch 정보를 파란 사각형에 직접 사용하면서 실제로는 multitouch input 이 일어나는 것처럼 구현할 수 있는 방법입니다.





반응형


반응형

MB가 또 속을 뒤집어 놓는 군요.

비리 측근들 사면시키고 훈장주고......


나라를 너무 우습게 만드는거 아닌지.....


그래 비리 측근 풀어준 대신 니가 들어가라...

과연 박근혜가 그렇게 공정하게 일을 처리할 위인일까?




엉망진창으로 나라를 운영한 지난 이명박근혜 5년.

한명은 대통령이었고 한명은 여당 실세였으니...


이명박근혜 둘이 공동 책임이 있음이 분명한데요.

자신은 그 일에 책임이 없는것처럼 사기치고 대선에서 승리한 박근혜가..


이번에도 저렇게 쇼하면서 자신은 쏙 빠져 나갈 것 같습니다.

한학수 <문화방송> 피디가 트위터(@mbcpdhan)에 "가지가지 한다마는 해도 너무한다. MB시대를 어떻게 정리할 것인가?" 라고 적었다고 하는데...


정말 MB를 감방에 집어넣고 그 더러운 시대를 깔끔하게 세탁하고 싶은 마음은 나도 있지만..


그게 MB의 시대가 아니라 이명박근혜의 시대였기에 최소한 5년은 더 가야 한다는게 가슴 아픈 일입니다.


쥐새끼같은 MB야 뱀같은 박정희를 흉내내는 수준이었지만 박근혜는 그 흉내내는 수준이 아닐테니 ... 암울한 유신보다 더 암울한 미래가 보이니 답답할 뿐이죠.


YTN 해직기자 노종면(@nodolbal)  트위터.

"비정규직 일자리 하나 없어 목숨을 끊는데 저들은 해먹고 훈장 파티하고 걸려도 검찰이 덮고 잡혀도 특사로 풀고"라고 탄식.


"그들에게 양심이란 존재하는가"(@ccsh****), "임기말 이멍박의 자신감은 어디서 나왔을까? 성공한 쿠데타의 수장처럼 측근들 무더기 훈장 수여"(@donotbea****), "이런 경우 뭐라 표현하나요? 국정농단? 사법질서파괴? 분탕질?"(@icis****).


이제 이 암흑의 이명박근혜 10년의 중간밖에 안 와 있다니.....완전 최악이네요.





반응형

Pinch Zoom Rotate 구현하기 - 2/11 -

2013. 1. 29. 06:12 | Posted by 솔웅


반응형

Multiple Touches


이 함수를 multiple display object들에 의해 사용되도록 하는 방법은 그렇게 어렵지 않습니다. setFocus 로 catch 해서 각 display object별로 한개의 touch 에 대해 listen 하도록 할 수 있습니다. 즉 하나의 touch 가 하나의 object 에 할당 되면 다른 touch 들은 그 object 에서는 무시되는 거죠. 이렇게 각 object 별로 각 touch 들을 할당해 놓으면 멀티터치 기능이 구현 가능합니다.



multitouch 를 구현하기 위해 이전 글에서 만들었던 코드를 수정할 겁니다.


sample2.lua



system.activate("multitouch") -- turn on multitouch

 

-- creates an object to be moved

local function newDragObj( x, y )

local circle = display.newCircle( x, y, 50 ) -- create a user interface object

circle.alpha = 0.5 -- make it less imposing

-- standard multitouch event listener

function circle:touch(e)

local target = e.target -- get the object which received the touch event

-- handle each phase of the touch event life cycle...

if (e.phase == "began") then

display.getCurrentStage():setFocus(target, e.id) -- set touch focus on this object

target.hasFocus = true -- remember that this object has the focus

return true -- indicate the event was handled

elseif (target.hasFocus) then -- this object is handling touches

if (e.phase == "moved") then

target.x, target.y = e.x, e.y -- move the display object with the touch

else -- "ended" and "cancelled" phases

display.getCurrentStage():setFocus(target, nil) -- remove touch focus

target.hasFocus = false -- this object no longer has the focus

end

return true -- indicate that we handled the touch and not to propagate it

end

return false -- if target is not responsible for this touch event return false

end

circle:addEventListener("touch") -- listen for touches starting on the touch layer

return circle -- return the object for use

end

 

local group = display.newGroup() -- create layer for the draggable objects

 

-- create 5 draggable objects

for i=1, 5 do

local circle = newDragObj( 100, i*100 )

group:insert( circle ) -- add it to the control layer

end




이 코드가 이전 코드와 다른점들을 살펴 보죠.

- multitouch 를 activate 했습니다.
- display object 생성을 wrap 했습니다. 그래서 display object 가 반복적으로 call 될 수 있게 됐습니다.
- setFocus 가 특정 touch ID 를 받아서 유저가 화면에 하는 여러 touch 들을 구분할 수 있도록 했습니다.
- When ending the touch, setFocus accepts nil to release the object’s touch input.
- touch가 끝나면 setFocus 는 nil 을 받아서 해당 object가 그 touch input 받는 일을 release 시켜 줍니다.


위 의 코드를 실행하면 5개의 큰 원을 생성하게 됩니다. 그 각 원들은 따로따로 움직일수가 있죠. setFocus 가 display object에 특정 Touch ID를 연결시켜주기 때문에 그 object는 다른 touch 들은 무시하게 됩니다. 이 로직으로 각 원들은 각각 다른 touch들이 할당 되서 multitouch로 따로따로 움직일 수 있게 되는 거죠.




반응형

Pinch Zoom Rotate 구현하기 - 1/11 -

2013. 1. 26. 06:47 | Posted by 솔웅


반응형

이번주의 Corona Tutorial은 무척 깁니다.

한번에 다 포스팅 하기는 어렵구요... 그렇게 하다가 작성해 놓은 글 날렸어요... ;;


예제가 총 11개 나오던데 이 예제별로 포스팅을 하려고 합니다.

이번에는 직접 실습도 해 가면서 저 나름대로 덧 붙일게 있으면 덧 붙여서 정리하려구요.



Posted on . Written by



오늘의 guest tutorial 은 Matt Webster, a.k.a. “HoraceBury.”  가 무료로 정보를 공유합니다. Matt 은 central London 에서 Development Manager 로 일하고 있습니다. 그는 닷넷과 자바 웹 개발분야에 15년의 경력을 가지고 있습니다. 그리고 게임이나 physics-based app 을 개발하는데는 Corona 를 사용하고 있습니다. 그는 Corona Labs Ambassador이기도 한데요 London meet-ups 를 두번이나 개최했습니다. 그리고 2013년도에는 더 많은meet-up을 가질 계획입니다. Matt 의 첫번째 Corona game 은  Tiltopolis 이었습니다. 고전인 Columns 와 Tetris를 합친 게임이죠.



Preface

우선 project files을 다운 받으세요.그러면 아래 예제들을 쉽게 테스트해 보실 수 있습니다. 각각의 samplex 모듈들은 기능을 갖고 있는 mini-project 입니다. 그리고 main.lua 에서 한번에 하나씩 실행시켜 보실 수 있습니다. 필요한 구문만 코멘트를 지워서 사용하세요. 마지막 모듈은 sample11.lua 는 전체 pinch-zoom-rotate module 입니다. 이 모듈은 여러분이 앱을 개발하실 때 실제 활용하시면 아주 유용할 겁니다.



Introduction



대부분의 어플리케이션에서는 하나의 터치 포인트일 경우 이를 제대로 표현할 수 있습니다. 아주 다양한 앱들이 저마다 아주 많은 기능들을 가지고 있지만 한번에 한개의 input 만 사용할 수 있죠. 한번에 한개의 버튼을 누를 수 있고 한번에 한개의 swipe 이벤트를 다룰 수 있고 등등이요.



앵그리버드를 예로 들어보죠. 이 앱에서는 각각의 tap, drag 그리고 swipe 들이 단지 한 손가락으로 이루어 지도록 돼 있습니다. 메뉴를 살펴보는 것, settings 를 여는 것, 새를 날려버리는 것 모두 한개의 손가락으로 처리하죠. 한 손가락으로만 하게 되면 일단 간단하죠. 그리고 직관적이고 또 집중할 수 있도록 도와 줍니다. 그런데 pinch zoom 같이 두 손가락 이상으로 해야 되는 경우도 있습니다.




이 경우 규칙을 어떻게 적용해야 할까요? 한손가락을 사용할 때는 터치된 object 에 action 을 구현하고 두 손가락이 사용됐을 때는 parent display group 의 top-level 에 어떤 action을 구현해야 겠죠.


이 튜토리얼의 목적은 이 multitouch 와 관련해서 최대한 간단하게 하려면 어떻게 처리해야 되는지에 대해 여러분에게 알려드리려는 겁니다. 그리고 pinch zoom 에 대해서도 좀 더 자세하게 다룰 겁니다.




Touch Basics




이 튜토리얼을 보시는 분들은 대부분 Corona touch model 을 사용해 본 경험이 있으 실 겁니다. 그러니 그와 관련해서는 핵심적인 내용 몇가지만 언급하겠습니다.



    addEventListener() 는 특정 display 객체에 대해 사용자의 터치가 일어나는 지를 listen 하기 위해 사용됩니다.
    터치 이벤트에는 두 종류가 있습니다 : touch and tap.
    터치 이벤트에는 다음과 같은 phases 가 있습니다 : began, moved and ended..
    display object 에 터치와 tap 이벤트가 동시에 일어날 경우 tap event 보다 touch event phases 가 먼저 fire 됩니다.
    Returning true from an event function stops Corona from passing that event to any display objects beneath the object.
    multitouch를 위해 system.activate(“multitouch”) 를 사용함니다.
    터치 이벤트가 일단 시작되면 다른 touch phases들은display.getCurrentStage():setFocus().를 call 함으로서 같은 listener 에 연결 되게 됩니다.
    setFocus 는 한 object와 한 evnet 별로 call 될 수 있습니다.
    display object에 dispatchEvent()를 call 하면 별도의 원하는 event들을 만들어 낼 수 있습니다.
    dispatchEvent로 fire 된 이벤트들은 다른 display hierarchy 에 전파되지 않습니다.




The Tap Problem



위에 언급한대로 터치 이벤트에는 여러 phases들이 있습니다. 각각 디바이스에 대한 유저의 interaction 상황을 나타냅니다. 화면에 손가락을 대고, 움직이고 그리고 떼고 하는 상황들을요.


일반적인 tap 이벤트는 주어진 시간안에 — iOS employs about 350 milliseconds — 위에 언급한 이벤트 phases들을 fire 합니다. 그리고 시작과 끝 지점은 10 픽셀이하의 거리이구요.
이 시간과 거리별로 계속 해당 phases가 발생 되는 겁니다.


즉 터치이벤트와 tap 이벤트를 동시에 listening 한다면 터치 리스너 함수 내에서 이미 곧 tap 리스너 함수가 call 될 거라는 것을 알 수 있을 겁니다. 그리고 이미 tap 이벤트를 감지했다면 더는 tap 리스너를 attach 할 필요가 없습니다. 이 튜토리얼에서는 tap 이벤트는 코드를 복잡하게 만들 뿐이라서 코딩해 넣지 않을 겁니다.



Single Touch


To demonstrate the typical touch event, let’s create a display object with a standard touch listener and use it to move the display object around.
일반적인 터치 이벤트를 구현하기 위해 standard touch listener 와 display object를 생성하겠습니다. 그리고 이 display object를 움직일 수 있도록 만들겠습니다.


sample1.lua



local circle = display.newCircle( 0, 0, 50 )  -- create a user interface object
circle.alpha = 0.5  -- make it less imposing

-- standard single-touch event listener
function circle:touch(e)

   local target = e.target  -- get the object which received the touch event
  
   -- handle each phase of the touch event life cycle...
   if (e.phase == "began") then
      
      display.getCurrentStage():setFocus(target)  -- set touch focus on this object
      target.hasFocus = true  -- remember that this object has the focus
      return true  -- indicate the event was handled
     
   elseif (target.hasFocus) then  -- this object is handling touches

      if (e.phase == "moved") then  -- move the display object with the touch
         target.x, target.y = e.x, e.y
      else  -- "ended" and "cancelled" phases
         display.getCurrentStage():setFocus(nil)  -- remove touch focus
         target.hasFocus = false  -- this object no longer has the focus
      end
      return true  -- indicate that we handled the touch and not to propagate it
   end
  
   return false  -- if target is not responsible for this touch event, return false
end

circle:addEventListener("touch")  -- listen for touches starting on the touch layer





위 함수에서는 multitouch 가 아닌 일반적인 touch event를 처리합니다.
이 예제로는 아래와 같은 일을 할 겁니다.



    객체에 터치가 시작됨
    터치 후 움직임으로서 객체도 움직이게 됨
    touch 가 off 가 되면 객체는 영향을 받지 않음
    해당 터치가 한 객체를 움직이는 동안은 다른 객체는 터치의 영향을 받지 않는다.
    display object는 자신의 :touch(e) function을 갖는다. (global function이 아니라)



해당 객체에서 터치가 일어났을 때에만 영향을 받고 터치가 객체 바깥에서 일어나면 터치의 영향을 받지 않습니다. 이 기능은 hasFocus 를 세팅해서 인데요. 해당 객체는 began이 일어난 이후에 touch phase들을 accept 하게 됩니다. 또한 한번 터치가 일어나면 그 터치는 끝날때까지 해당 객체에 영향을 미치게 됩니다. 바로 setFocus 가 코로나에게 이후의 터치 진행 상황을 해당 객체에 적용하라고 일러 주는 것이거든요.


반응형