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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

Posted on . Written by


6. Avoid “ipairs()”

테이블을 iterating 할 때 Lua ipaires() 함수를 너무 과도하게 사용하는 것은 올바른 방법이 아닙니다. 특히 같은 일을 Lua construct 를 사용해서 처리할 수 있을 때는 말이죠.


ipairs() — Discouraged


local t1 = {}
local t2 = {}
local t3 = {}
local t4 = {}
local a = { t1, t2, t3, t4 }

for i,v in ipairs( a ) do
   print( i,v )
end



Lua Construct — Recommended


local t1 = {}
local t2 = {}
local t3 = {}
local t4 = {}
local a = { t1, t2, t3, t4 }

for i = 1,#a do
   print( a[i] )
end


7. Math Performance Comparisons


다양한 수학 함수들이나 프로세스들은 다른 것들보다 빠릅니다. 그리고 되도록 그 방법을 사용하는 것이 좋습니다.



Avoid “math.fmod()” for Positive Numbers
(양수에는 “math.fmod()” 를 피하세요.)


--math.fmod method (discouraged)
local fmod = math.fmod
for i = 1,100 do
   if ( fmod( i,30 ) < 1 ) then
      local x = 1
   end
end

--modulus operator method (recommended)
for i = 1,100 do
   if ( ( i%30 ) < 1 ) then
      local x = 1
   end
end



Multiplication is Faster Than Division
(나누기보다 곱하기가 빠릅니다.)


x * 0.5 ; x * 0.125  --recommended
x/2 ; x/8            --discouraged



Multiplication is Faster Than Exponentiation
(곱하기가 승수계산보다 빠릅니다.)


x * x * x  --recommended
x^3        --discouraged


8. Conserve Texture Memory


Texture memory는 “critical mass”에 도달할 때까지 자주 무시됩니다. 그래서 art assets 들에 어떤 변화를 요구하도록 하는 작업은 어려우면서도 시간이 많이 소요되는 작업입니다.


Texture memory 에는 8비트나 24비트 PNG 이미지들이 있습니다. 이것들은 alpha channel 이 있는 32비트 이미지로 unpack 됩니다. 여기에는 각 이미지들 마다 픽셀들의 rectangular 배열이 있고 색에 대한 4 color 배열 (channels) 가 있습니다. (빨강, 녹색, 파랑 그리고 alpha(RGB+A).


OpenGL 에서 texture들은 (single 이미지이거나 image sheet들 모두 - Power of 2 (PoT) rule 을 따릅니다. 이 의미는 어떤 texture 이든지 next highest Power of 2 로 반올림 된다는 의미 입니다. (2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, …) 그러면 그 만큼 메모리를 차지한다는 의미 입니다. 그러므로 320x480 크기의 이미지와 260x400 크기의 이미지는 모두 512x512 만큼 texture memory를 차지합니다.

이게 딱 보면 뭐 별로 크게 와 닿지는 않을텐데요 실제 메모리 소비량을 한번 계산해 볼까요. 꼭 제곱근(PoT)만이 아니라 4 color channel들도 같이 생각해 봅시다. 이 의미는 texture 배열에 있는 각각의 픽셀은 4 byte 를 필요로 한다는 겁니다. 그리고 이것은 여러분이 생각하는 것보다 훨씬 더 빠르게 추가됩니다.

Image(sheet) sized 350×500:

512×512 (pixels) × 4 (bytes) = 1,048,576 bytes = 1 MB


Image(sheet) sized 514×1024:

1024×1024 (pixels) × 4 (bytes) = 4,194,304 bytes = 4 MB



이 다음 제곱근(PoT)는 어떻게 되죠? texture memory 가 4배가 될 겁니다. 이건 여러분이 일반적인 디바이스와 Retina/HD 디바이스용으로 개발할 때 더 많이 신경 쓰셔야 할 부분입니다. 이 두 디바이스 간의 이미지가 두배의 크기 차이가 있다면 (iPad 와 Retina iPad 같이) 여러분의 모든 이미지들은 두 기기에서 보두 깔끔하고 쌈박하게 유지하기 위해 원본 이미지와 이보다 두배 큰 이미지를 사용해야 합니다. 이 사이즈 크기가 두배라는 것은 texture 메모리가 더블 이상이 된다는 것을 의미하죠. (위의 경우에는 4배), 그리고 일반적으로 Retina/HD 디바이스들은 이전 버전과 비교해서 4배의 메모리가 있는 것이 아닙니다.

그렇다고 여러분 패닉에 빠지지 마시구요. texture memory 가 관리하는데 또 그렇게 생각보다 엄청난 노력이 필요한 것만은 아닙니다. 아래 팁들을 잘 기억해 두세요.

  1.  texture 가 필요하지 않을 때(display stage 에서 사라질 때)는 항상 unload 를 하세요.
  2. 526x600인(screen size) background texture 가 있다면 기 비율에 맞게 448x512 이미지로 만들어서 사용하세요. 512 PoT(제곱근)을 넘지 않도록요. 그리고 코드에서 그 이미지의 width와 height를 원하는 비율로 살짝 scaling 해 주세요. 유저 입장에서는 약간의 크기 변화가 있어도 그렇게 크게 지정을 주지는 않을 겁니다. 특히 작은 디바이스들에서는요.
  3.  가능하면 texture들을 재사용하세요. 그리고 setFillColor() API를 사용해서 tinting을 하세요. 만약에 빨간 사과와 녹색 사과가 있다면 grayscale image로 사과를 만든 다음에 red와 green tint 를 적용하셔서 사용하실 수 있습니다.
  4.  image sheets를 사용한다면 TexturePacker 같은 tool을 사용하세요. 그래서 가장 작은 PoT configuration으로 pack 하셔서 사용하시면 아주 도움이 될 겁니다.



반응형


반응형
Posted on . Written by



2. Avoid Functions as Arguments for Other Functions

루프나 time-critical code 에서 함수를 localize 하는 것은 아주 중요합니다. 그러면 다른 함수들에 파라미터로 사용됩니다. 아래 두 경우를 보세요:



Defined as an Argument of Another Function — Discouraged

local func1 = function(a,b,func) 
   return func(a+b) 
end

for i = 1,100 do
   local x = func1( 1, 2, function(a) return a*2 end )
   print( x )
end


Localized — Recommended

local func1 = function( a, b, func )
   return func( a+b )
end
local func2 = function( c )
   return c*2
end

for i = 1,100 do
   local x = func1( 1, 2, func2 )
   print( x )
end



3. Avoid “table.insert()”

아래 네 경우를 비교해 보죠. 4개 모두 결과는 같습니다. 테이블에 값을 insert 하는 일반적인 방법들입니다. 이 4가지 중 Lua 의 table.insert 함수를 사용하는것은 별로 좋지 않은 방법입니다.



table.insert() — Discouraged

local a = {}
local table_insert = table.insert

for i = 1,100 do
   table_insert( a, i )
end



Loop Index Method — Recommended

local a = {}

for i = 1,100 do
   a[i] = i
end



Table Size Method — Recommended

local a = {}

for i = 1,100 do
   a[#a+1] = i
end



Counter Method — Recommended

local a = {}
local index = 1

for i = 1,100 do
   a[index] = i
   index = index+1
end



4. Minimize use of “unpack()”


Lua unpack() function 도 퍼포먼스 측면에서 그렇게 좋은 하수가 아닙니다. 다행히 같은 결과를 내기 위해 간단하고 빠르게 loop 를 사용할 수 있습니다.



Lua “unpack()” method — Discouraged

local a = { 100, 200, 300, 400 }

for i = 1,100 do
   print( unpack(a) )
end



Loop Method — Recommended

local a = { 100, 200, 300, 400 }

for i = 1,100 do
   print( a[1],a[2],a[3],a[4] )
end




5. Cache Table Item Access

테이블 아이템들을 캐싱하는 것. 특히 루프 내에서. 이 방법을 사용하면 퍼포먼스를 향상시키고 time-critical code를 만들 수 있습니다.





Non-Cached — Acceptable

for i = 1,100 do
   for n = 1,100 do
      a[n].x = a[n].x + 1
      print( a[n].x )
   end
end



Cached — Recommended

for i = 1,100 do
   for n = 1,100 do
      local y = a[n]
      y.x = y.x + 1
      print( y.x )
   end
end




반응형


반응형

이번주 튜토리얼은 Performance Optimizations 에 관한 내용입니다.

개발 할 때 항상 중요하게 생각해야 할 내용들이죠.


Coronasdk 에서 제공하는 글에서 여러번 강조된 내용이기도 합니다.

계속 강조하는 이유는 그만큼 중요하기 때문이겠죠.


10가지의 팁을 제공하고 있는데요.

시간 나는대로 정리해서 올릴께요.


몇번에 나눠서 글이 정리될지 모르겠네요.

제가 참여하는 프로젝트가 이번달 말로 끝나거든요.

다른 position 을 찾아봐야 되서 그렇게 여유가 없네요.



Posted on . Written by




오늘의 튜토리얼은 퍼포먼스 최적화와 관련된 내용입니다. 모든 개발자들이 항상 신경써야 할 주제죠. 이 중 어떤 팁들은 뻔한 내용일 수 있습니다. 프로그래밍을 하면서 코드를 최적화 하는 작업은 소요되는 시간그로 인해 얻는 이익을 저울질 해서 처리해야 할 문제 입니다.

어떤 최적화가 구식 디바이스에서 2%의 퍼포먼스 개선을 불러올 수 있는데 그 일을 하려면 50시간을 투자해야 한다면 그 작업을 해야 될 필요가 없을 수도 있습니다. 그리고 어떤 최적화는 10시간 정도 소요되는데 아주 많은 디바이스들에서 큰 성능 개선이 일어날 수 있다면 그 최적화는 10시간을 들이더라도 반드시 해야 되겠죠.

새로운 프로젝트들을 시작할 때 퍼포먼스가 크게 개선되고 앱 코드와 동작이 깨끗해지고 그래서 모든 디바이스들에서 user experience 가 아주 개선 된다면 그런 결과를 유도할 수 있는 performance trick들은 많이 사용하면 사용할 수록 좋을 겁니다.



“Time-Critical” Routines


대부분의 performance trick 들은 주로 “time-critical” routines 들을 위한 방법들이 제공될 겁니다. 앱이 버벅거려서 유저들이 사용하는데 불편을 느끼거나 하면 안되니까요. 예를 들어 액션게임을 하는데 new scene 이 로딩되는 시간이 너무 길거나 하면 불편해서 유저들이 잘 사용하지 않을 겁니다.


1. Localize, Localize


이것은 몇번을 강조해도 부족하지 않은 내용입니다. 글로벌 변수나 글로벌 함수를 가급적 사용하지 않는 것이 성능 향상에 아주 도움이 됩니다. 로컬 변수와 로컬 함수에 접근하는 것이 훨씬 빠르니까요. 특히 time-critical routines 에서는요.



이 이미지는 이 글 내용과 거의 관계가 없네요. ;; 왜 이 이미지가눈에 띄었을까?


Non-Local — Discouraged

CCX = display.contentCenterX  --global variable
for i = 1,100 do
   local image = display.newImage( "myImage" )
   image.x = CCX
end


Local — Recommended

local CCX = display.contentCenterX  --local variable
for i = 1,100 do
   local image = display.newImage( "myImage" )
   image.x = CCX
end


또한 이것은 math library 같은 core Lua 라이브러리에 적용됩니다. time-critical routines 에서 여러분은 항상 라이브러리 함수들을 localize 해야 합니다.


Non-Local — Discouraged

local function foo( x )
   for i = 1,100 do
      x = x + math.sin(i)
   end
   return x
end


“External” Local — Recommended

local sin = math.sin  --local reference to math.sin
local function foo(x)
   for i = 1,100 do
      x = x + sin(i)
   end
   return x
end

마지막으로 함수들은 가능하면 항상 localize 되어야 한다는 것을 기억하고 계세요. 물론 scoping 을 제대로 해야 하겠죠. 만약 Lua 초보자이시라면 링크 Understanding Scope for Beginners 를 참조하세요.


Non-Local — Discouraged

function func1()
   func2( "myValue" )
end

function func2( y )
   print( y )
end

func1()


Local — Recommended

--"func2" properly scoped above "func1" 
local function func2( y )
   print( y )
end

local function func1()
   func2( "myValue" ) 
end

func1()


오늘은 시간 관계상 1번 팁만 소개해 드립니다.

다음 글에선 좀 더 많은 팁들을 올릴께요.

원문은 저 위의 제목을 클릭하면 보실 수 있으니까 관심 있는 분들은 저 위의 제목을 클릭해서 보세요.


반응형


반응형
loadSoundLibrary: a quick way of structuring and loading your sound effects



Posted by BeyondtheTech, Posted on March 8, 2013




여러분 코드가 여러분이 로드해야 할 사운드 효과들로 조금 어지러워져 있다면 보다 적은 코딩으로 훨씬 더 쉽게 사운드를 로드 할 수 있는 정보를 이 글에서 보실 수 있으실 겁니다.

개발을 하다 보면 이미지 파일이나 lua 파일들과 더불어 사운드 파일들도 시간이 지날수록 숫자가 많이지게 될 겁니다. 그리고 그러한 파일들을 구분하려면 긴 디렉토리 이름을 찾아가느라고 힘들게 되구요. 이 글에서 보여드리는 예제는 그러한 부분들도 고려 된 겁니다. 좀 더 쉬운 방법으로 각각의 하위폴더를 관리할 수 있도록 해 드릴 겁니다.

예를 들어 여러분 코드가 이렇게 돼 있을 때...


sound_fx[ "meow" ] = audio.loadSound( "meow.caf" )
sound_fx[ "bark" ] = audio.loadSound( "bark.caf" )
sound_fx[ "explosion" ] = audio.loadSound( "explosion.caf" )
sound_fx[ "laugh" ] = audio.loadSound( "laugh.caf" )
sound_fx[ "cry" ] = audio.loadSound( "cry.caf" )
sound_fx[ "fart" ] = audio.loadSound( "fart.caf" )
sound_fx[ "belch" ] = audio.loadSound( "belch.caf" )
sound_fx[ "kiss" ] = audio.loadSound( "kiss.caf" )
sound_fx[ "slap" ] = audio.loadSound( "slap.caf" )
sound_fx[ "punch" ] = audio.loadSound( "punch.caf" )
sound_fx[ "boing" ] = audio.loadSound( "boing.caf" )
...


보시면 아시겠지만 라인별로 많은 부분이 반복됩니다.





저의 loadSoundLibrary 를 사용하시면 프로그래밍 하기 훨씬 더 쉬워지실 겁니다.


local function loadSoundLibrary( ... )
        -- quick-load a bunch of audio files, by Raphael Salgado aka BeyondtheTech, 2013
        if #arg < 2 then
                print( "Invalid number of arguments for loadSoundLibrary" )
        else
                local loadList, t, soundName
                local t2 = 0
                for t = 2, #arg do
                        soundName = arg [ t ]
                        if sound_fx[ soundName ] ~= nil then
                                print( "Warning - Sound name element " .. soundName .. " already exists, skipping" )
                        else
                                sound_fx[ soundName ] = audio.loadSound( arg[ 1 ] .. "/" .. soundName .. ".caf" )
                                -- check, did it load successfully?
                                if sound_fx[ soundName ] ~= nil then t2 = t2 + 1 end
                        end
                end
                print( "Loaded " .. t2 .. " out of " .. #arg - 1 .. " " .. arg[ 1 ] .. " sounds" )
        end
end


이제 같은 오디오 파일 세트를 불러오기 위해서 아래 한줄만 추가하시면 됩니다.

loadSoundLibrary( "SFXstuff", "meow","bark","explosion","laugh","cry","fart","belch","kiss","slap","punch","boing" )


물론 SFXstuff라는 서브폴더를 생성해서 .caf 파일들을 그곳에 넣어야 겠죠.

이 함수의 첫번째 인수는 폴더 이름 입니다.  그 다음은 모두 테이블에 들어갈 sound element 들이구요. 즉 확장자가 없는 sound 파일들이죠.
일단 정확한 argument들의 숫자를 전달했는지 체크하구요. sound 이름을 잘 못 사용했다면 warning 도 해 줍니다.


이 정보가 여러분 코딩을 좀 더 쉽고 빠르게 하는데 도움이 되기를 바랍니다.


==> 이번 글은 BeyondtheTech 라는 곳에서 공유한 팁 입니다. 원문은 저 위의 제목을 클릭하면 보실 수 있습니다.

반응형


반응형

아침에 우연히 시내에서 St. Patrick's Day Parade를 한다는 기사를 읽게되서 한번 나가 봤어요.


뉴저지 살 때 맨하튼에서 하는 퍼레이드를 봤었는데 아주 인상적이었었는데.


모두들 녹색으로 치장을 하고 옛날 유럽스러운 복장들을 하고 행진하는 모습들이..


St. Patrick's Day 는 아일랜드의 큰 명절이라고 하는데요.


그 내용은 자세히 몰라도 퍼레이드는 볼만 하더라구요.


옛날에 아일랜드 사람들이 성격이 급하고 다혈질이고 뭐 그런게 유럽인 중에서는 그나마 성격 급한 한국인이랑 비슷하다는 소리를 들은거 같기도 하고...


영국 옆에 있어서 오랜 기간 영국의 식민지를 지내기도 했고 한국도 정말 큰 나라 중국옆에 있어서 괴롭힘을 많이 당하고 일본 식민지 였기도 하고 해서 웬지 우리나라랑 비슷한 역사가 있는 거 같아서 나 혼자서만 친근하다는 생각도 하고 그랬었어요.


지금 일하는 데도 아일랜드출신 애들도 있고 또 아일랜드 팀이랑 자주 미팅하고 연락하고 하는데요..


뭐 다혈질이고 성격 급하고 그런건 못 느꼈어요..


그냥 여느 백인들처럼 여유 있는거 같고.. 뭐... 그냥...



행렬중에 저렇게 '영국은 아일랜드에서 물러나라' 는 배너를 보면서 강대국 옆에 살면서 많은 설움을 받고 있나부다.. 라는 생각도 한번 더 하게 되고....



예전에 어렸을 때 TV에서 봤던 멋있는 백파이프 연주 악단도 보고...

남자들이 치마입고 백파이프 연주하는게 재밌었어요.

치마하고 백파이프는 스코틀랜드 전통으로만 알고 있었는데.. 아일랜드에서도 저랬었나 봐요.



이번에 찍었던 동영상중에 아주 맘에 드는 영상이예요.

요즘 군복과 옛날 군복 행렬도 볼 수 있고...


예전에 영국하고 전쟁할 때 여자들도 나라를 지키기 위해 참전했는지 여자 군악대도 보이고...



Rock 밴드 나오고 여자 Marching Band 도 나오고 또 괴물들도 나오는 이 동영상도 아주 맘에 드는거긴 한데..


찍다가 전화기 용량이 다 차서 중간에 그쳤어요.


아쉽긴 하지만... 재밌는 장면이 담겨서 좋아요.. ^^


반응형

런타임 에러 처리하기

2013. 3. 7. 22:29 | Posted by 솔웅


반응형
Posted on . Written by



안드로이드용으로 빌드하시는 분들은 에러를 report 하는 방법이 바뀐것을 공지해 드렸었습니다. 이 기능은 안드로이드쪽에 먼저 작업이 됐는데요 그 이유는 custom 안드로이드 퍼미션 기능을 implement 하는 부분을 수정하면서 런타임 에러를 처리하는 기능이 개선될 필요가 있었기 때문입니다.

이제 다른 플랫폼에도 이 기능이 지원돼야 겠죠. iOS 와 시뮬레이터 등에도 런타임에러를 캐치하고 처리하는 기능이 지원될 차례입니다. 에러를 trap 해서 런타임 에러 팝업을 보여줄지 안 보여줄 지 하는  기능도 지원되게 됩니다. 이 기능을 통해서 런타임 에러를 fix 하는 것은 아니지만 그 런타임 에러를 감출수는 있을 겁니다.

런타임 에러를 처리하는 예제입니다.

local function myUnhandledErrorListener( event )

    local iHandledTheError = true

    if iHandledTheError then
        print( "Handling the unhandled error", event.errorMessage )
    else
        print( "Not handling the unhandled error", event.errorMessage )
    end
    
    return iHandledTheError
end

Runtime:addEventListener("unhandledError", myUnhandledErrorListener)



이 리스너에 pass 된 이벤트 테이블은 errorMessagestackTrace 파라미터를 가지고 있습니다. 이 에러 메세지는 에러의 result 가 되겠죠 그리고 stack trace 는 에러의 마지막 부분이 될 겁니다. 리스너에서 true 가 리턴되면 팝업 alert 메세지가 뜨는 걸 방지하고 앱이 계속 진행하도록 합니다. false가 return 되면 팝업이 보여지고 앱이 멈추게 되겠죠. (이 경우는 unhandledError 리스너가 적용되지 않은 상황에서도 일어나는 현상입니다.)

다음 daily build 에서 여러분이 보게 될 가장 큰 변화 내용은 런타임 에러가 났을 때의 팝업 메세지 입니다. 런타임 에러를 trap 하고 팝업창이 뜨는 것을 막고 앱이 중지하는 것을 막으시려면 위에서 처럼  unhandledError 리스너를 추가하시면 됩니다.

위의 기능은 daily build 1044 이후부터 적용될 겁니다.


반응형


반응형
Posted on . Written by



build 2013.1043 버전부터 iOS, Android, Mac 그리고 윈도우즈에 모두 적용된 건데요. network api에 새로운 기능을 추가했습니다. 다운로드나 request 같은 네트워크 function들이 이 새로운 기능으로 좀 더 개선 됐습니다. 여기 daily API docs 의 networkRequest에 있는 network와 event 부분을 읽어 보세요. single call에서 텍스트 파일을 업로드하고 bytes transferred 를 보고 하는 것들을 어떻게 하는지 확인해 보세요.


또한 이전 버전과 호환이 되지 않은 새로운 기능 변화가 몇개가 있는데요. 아래 예제에서 보시듯이 event response들은 이제 fileName과 baseDirectory가 포함된 테이블이 됐습니다. 이제 event.response를 string 이 아니라 table로 취급해야 되는 것을 잊지 마세요.

아래에 새로운 event.response table 정보를 어떻게 사용하는지에 대한 예제가 있습니다.


local function networkListener( event )
        if ( event.isError ) then
                print( "Network error - download failed" )
        elseif ( event.phase == "ended" )
                print( "displaying response image file" )
                myImage = display.newImage( event.response.filename, event.response.baseDirectory, 60, 40 )
                myImage.alpha = 0
                transition.to( myImage, { alpha = 1.0 } )
        end
end
 
network.download(
        "http://developer.anscamobile.com/demo/hello.png",
        "GET",
        networkListener,
        "helloCopy.png",
        system.TemporaryDirectory
        )


그리고 코로나에서 지난주와 이번주에 새로운 위젯들을 선보였습니다.

관련 글들은 따로 번역해서 올리지는 않고 아래 링크로 대신 할 께요.

이 글들에 있는 샘플코드를 실행하시던가 새로운 Daily Build 에 예제들을 보시면 도움이 되실 겁니다.




반응형


반응형
Posted on . Written by




수요일의 FAQ 시간입니다. 오늘은 코로나 런타임 에러에 대한 질문들을 다뤄 보겠습니다.




1. My app was working fine and now I’m seeing a pop-up saying an error was found and my app quits. What changed?



안드로이드에서는 build 2013.1030 부터 적용된 건데요, run-time error 가 일어나면 경고창이 뜨고 그 에러에 대한 정보를 보여주게 됩니다. 이전에는 런타임에러가 adb logcat 화면에만 표시되던가 아니면 아무런 표시 없이 지나갔었거든요. 이 기능은 현재 iOS build 에서는 지원되지 않습니다.



2. I don’t remember getting these errors before. Are these real errors?



예 만약 런타임 에러가 났다면 exception이 일어났기 때문입니다. 그러면 그 프로그램은 그 에러 이후의 코드를 실행하지 않습니다. 여러 에러가 있어도 그 에러가 한번에 다 표시되는 게 아니거든요. 혹은 어떤 특정 디바이스에서만 에러가 일어날 수도 있구요.


일반적으로 이런 에러들은 API 에 의해 nil 값이 return 되서 일어나는 경우가 많습니다. 예를 들어 객체의 포인터가 nil일 때 Corona 객체를 remove 하는 경우를 들어보죠. 그리고 nil인 값을 return 한 것을 받아서 그 스트링을 연결하고 display 하는 경우도 예를 들 수 있습니다. 일반적으로 그 값을 사용하려는 함수의 out of scope 인 경우가 많습니다.



Here is one example:


local touchRect = display.newRoundedRect( 0, 50, 70, 30, 10 )
touchRect.x = display.contentCenterX

local count1 = 0
local count2 = 0
local count3 = 0
        
function touchRect:touch( event )
    if event.phase == "ended" then
        count1 = count1 + 1
        count2 = count2 + 1
        count3 = count3 + 1

        text1.text = "Count1 = " .. count1
        text2.text = "Count2 = " .. count2    -- << error here
        text3.text = "Count3 = " .. count3        
    end
    
    return true
end

text1 = display.newText( "Count1 = 0", 10, 100, native.systemFont, 20 )
local text2 = display.newText( "Count2 = 0", 10, 140, native.systemFont, 20 )
text3 = display.newText( "Count3 = 0", 10, 170, native.systemFont, 20 )

touchRect:addEventListener( "touch" )


하얀 사각형을 두드리면 한번에 3개의 count 가 증가하고 그 증가된 값이 display 됩니다. text2.text 가 세팅될 때 버그가 있는데요. 그 에러는 "attempt to index global 'text2' (a nil value)" 입니다. 이유는 text2가 로컬 변수로 정의 됐고 또 touch 함수 이후에 정의 됐기 때문이죠. 이 경우가 바로 함수의 out of scope (범위 밖) 에서 정의 된 것으로 그 값이 nil 이 되는 경우입니다.

시뮬레이터에서 위 코드를 실행하고 사각형을 두드리면 첫번째 counter 가 증가되는 것까지 보실 수 있을 겁니다. 왜냐하면 text2.text 부분에서 에러가 났기 때문이죠. 그 이후의 코드는 실행이 되지 않습니다. 그 사각형을 계속 두드릴 수 있습니다. 그러면 첫번째 counter 만 계속 증가할 겁니다. 사용자 입장에서는 프로그램에 에러없이 잘 실행된다고 느낄 수 있죠.


안드로이드 코드에 저희들이 준 변화는 이 경우 런타임 에러를 감지하고 팝업창에 에러가 난 파일 이름과 line number 를 display 하도록 했습니다. 그러면 그 라인 이후의 코드는 아직 실행이 안 됐다는 것을 알 수 있죠. 이 메세지를 보시려면 콘솔 윈도우를 열어 놓으셔야 합니다. (iOS 에서는 Xcode 가 될 테고 안드로이드 에서는 adb logcat 이 되겠죠.)

위 에러는 text2를 함수가 정의되기 이전에 정의해 버리면 쉽게 고칠 수 있습니다. 혹은 text2에서 local을 없애서 정의 해도 되죠.


text2 = display.newText( "Count2 = 0", 10, 140, native.systemFont, 20 )



3. How do I keep the pop-up from happening when I release my app to Google Play?



이 팝업을 피하는 방법은 두가지가 있습니다.


1) 모든 버그를 찾아서 고치기
2) 문제가 발생할 수 있는 코드 부근에 pcall 구문을 추가하기

앱에서 모든 버그를 찾아서 고치는건 불가능에 가깝습니다. 그래서 에러를 trap 하고 이 에러를 어떻게 할 것인지 선택할 수 있는 런타임 리스너를 추가할 계획을 가지고 있습니다. 앱 스토어용으로 앱을 빌드하고 유저가 에러가 있는 앱을 실행하면 로그가 기록되서 여러분 서버로 이것을 보낼지 아니면 그냥 넘어갈지를 선택해서 실행할 수 있게 됩니다. 이 기능은 현재는 지원되지 않구요 조만간 업데이트 될 Daily Build 에 적용 될 예정입니다.


4. Is there any way to trap the errors myself and not have it quit the app or display a pop-up to the user?



새로운 런타임 에러 리스너가 포함되게 될 Daily Build 를 기다리기 전에 여러분이 하실 수 있는 방법이 있습니다. Lua pcall 구문으로 여러분 코드 블럭을 감싸서 에러를 trap 할 수 있습니다. pcall (protected call) 은 execution status 를 return 하는 call 로 어떤 함수나 메소드든지 call 할 수 있습니다. call 이 제대로 실행 됐다면 true 를 반환할 것이고 런타임 에러 때문에 실패 했다면 false를 반환할 겁니다. 일단 런타임 에러를 trap 하면 pop-up을 띄우거나 app을 quit 하지 않을 겁니다. pcall을 사용하면 약간의 overhead 가 있을 수 있습니다. 그러니까 꼭 에러를 감지해서 어떤 일을 해야 할 경우에만 사용하시기 바랍니다.


The syntax of pcall is:

pcall( f [, ...] )



where f is the function to be called,
and ... is the arguments for the function.

이 구문을 연습해 보기 위해 함수 안의 text2 세팅 부분을 감싸봤습니다. 그리고 이것을 pcall 을 사용해서 call 했습니다. 이 call 의 결과는 status 에 저장이 되서 display 될 겁니다.


local touchRect = display.newRoundedRect( 0, 50, 70, 30, 10 )
touchRect.x = display.contentCenterX

local count1 = 0
local count2 = 0
local count3 = 0

local function setText2( value )
    text2.text = "Count2 = " .. value
end
        
function touchRect:touch( event )
    if event.phase == "ended" then
        count1 = count1 + 1
        count2 = count2 + 1
        count3 = count3 + 1

        text1.text = "Count1 = " .. count1
        
        local status = pcall( setText2, count2 )
        print( "pcall status is ", status )
        
        text3.text = "Count3 = " .. count3        
    end
    
    return true
end

text1 = display.newText( "Count1 = 0", 10, 100, native.systemFont, 20 )
local text2 = display.newText( "Count2 = 0", 10, 140, native.systemFont, 20 )
text3 = display.newText( "Count3 = 0", 10, 170, native.systemFont, 20 )

touchRect:addEventListener( "touch" )


위 코드를 실행시키면 pcall status 가 false가 될 겁니다. 즉 런타임 에러가 났다는 것이죠. counter 1하고 3은 증가할 겁니다. 즉 pcall 이 런타임 에러를 trap 하고 그 안에 런타임 에러가 있더라도 이후의 코드가 실행된다는 것을 알 수 있을 겁니다.

pcall 은 여러분 코드 중에 fail 일 것 같은 구문이 있고 그 부분을 테스트하거나 guard 하고 싶을 때 사용하실 수 있을 겁니다.



5. Why is the error pop-up only in Android builds?



일단 안드로이드쪽을 작업했습니다. 그 이유는 안드로이드 빌드와 관련해서 default permission들을 없애면서 이 에러들을 다뤄야 할 필요성을 느꼈었거든요. 개발자들에게 이 에러들을 감지하고 trap 하는 기능이 제공되면 아주 유용할 거라고 생각했습니다. 그리고 이 기능을 iOS에도 적용할 거고 Mac 과 윈도우즈 시뮬레이터에도 적용할 계획입니다.

현재 릴리즈 버전과 Daily build 에서는 여러분 앱의 버그를 찾을 수 있도록 하기 위해 런타임 에러 정보를 제공합니다. developer build 를 할 때 파일이름과 line number 그리고 에러의 type 을 콘솔을 통해 보실 수 있을 겁니다. Release build (앱 스토어용)에서는 에러 type 만 보실 수 있습니다.


추가적으로 말씀 드린다면 맥 시뮬레이터를 사용하신다면 Corona Simulator가 아니라  Corona Terminal을 start 하는 걸 잊지 마세요. Corona Terminal 은 console 창을 띄우고 나서 Corona Simulator를 실행할 겁니다. 이 콘솔창에는 print, warning 그리고 에러 메세지 등이 display 될 겁니다.


여기까지가 오늘의 FAQ입니다. 도움이 되셨기를 바랍니다.

반응형


반응형

요 며칠 박근혜의 성깔이 화제다.

'발끈해' 라는 별명이 이래서 붙은거 아닐까? 하는 생각이 든다.


심리적으로 나는 옳고 오류가 없고 나라를 위하는 착한 편이고 상대편은 국회는 야당은 항상 방해만 하는 나쁜 놈이다라는 인식에 기반한 거 같다.


완전 독재자의 논리이다.


하긴 지 아버지한테서 배운게 그거니 그게 옳은 걸로 믿나보다.

아니 믿음은 약한 표현이고 그런 자세가 몸에 배어 있는거 같다.


정치라는게 대화와 타협을 통해서 그리고 협상을 통해서 이뤄져 나가는 것이라는 개념 자체가 없다.


이번 한성질 담화문 이후 기자들과의 일문일답도 없이 획 돌아서 나가 버렸다며?


이게 어제 오늘 나온말은 아니다.


예전에 한나라당의 정몽준 의원이 자서전에서 박근혜가 정말 너무 화를 잘 내는 성격이라고 얘기한 적이 있다.


정몽준과 박근혜는 초등학교 동창사이다.

그리고 당시 대한민국 최고 권력자의 딸과 대한민국 최고 재벌의 아들로서 자라왔으니까 비교적 일반인 보다는 박근혜를 많이 접해 봤을 것이다. 그리고 더 자세히 알 수 있는 위치에 있었고.....


그런 정몽준이 자서전에서 밝힌 박근혜의 성격은 너무 화를 잘 낸다는 것이다.


박근혜, 정몽준과 통화에서 화내며 소리 지른 사연은


... 자서전 ’나의 도전 나의 열정‘을 통해 박 전 대표와 얼굴 붉혔던 ’비화‘를 소개했다.

특히 정 전 대표는 이 자서전에서 지난 2002년 남북한이 축구경기를 했던 당시와 2009년 10월 재보선 및 세종시 특위 등을 둘러싸고 의견 충돌이 생겼을 때 박 전 대표가 ’소리를 지르는’ 등 수차례 화를 냈다고 기술해 논란이 예상된다.

두 사람의 첫 충돌은 2002년 9월 남북한 축구경기 당시로 거슬러 올라간다. 박 전 대표는 2002년 5월 북한을 방문, 김정일 국방위원장을 만나 남북한 축구경기 개최에 합의했고, 당시 대한축구협회 회장이었던 정 전 대표에게 이를 요구했다.

정 전 대표는 그러나 “국가대표급 프로축구선수들의 연봉은 프로구단이 주는 것이고, 프로축구 경기 일정도 빡빡해 협회가 마음대로 선수들을 불러낼 수 있는 게 아니었다”며 “당시 조중연 협회 전무가 박 전 대표를 찾아가 복잡한 사정을 설명했는데 박 전 대표는 화를 펄펄 냈다고 한다”고 회고했다.

그는 축구경기장에서 “박 전 대표가 먼저 경기장에 와 있었는데, 나를 보더니 화난 얼굴로 왜 약속을 지키지 않느냐고 했다”며 “무슨 소리인가 했더니 관중들이 한반도기를 들기로 했는데 왜 태극기를 들었느냐는 것”이라고 회고했다


이어 “문제가 또 생겼다. 축구 경기 시작 전에 붉은 악마가 ’대한민국‘을 외쳤기 때문이다”며 “박 전 대표는 구호로 ’통일조국‘을 외치기로 했느데 왜 약속을 지키지 않느냐고 다시 내게 항의했다”고 밝혔다.

이 어 정 전 대표는 2009년 9월 당 대표 취임 직후 박 전 대표와의 회동과 관련한 비화도 공개했다. 그는 당시 “기자들이 10월 재보선에 박 전 대표가 도울 것인지를 물었고, 나는 ’박 전 대표도 마음속으로는 우리 후보들이 잘되기를 바라지 않겠는가‘라고 답했다”며 “몇 달 후 박 전 대표는 이 일에 대해 항의했다. 한나라당 후보가 잘되기를 바란다고 말한 적이 없다는 것”이라고 밝혔다.

그는 “왜 화를 내는지 도무지 이해할 수가 없었다. 화를 내는 박 전 대표의 전화 목소리가 하도 커서 같은 방에 있던 의원들이 걱정스러운 얼굴로 나를 바라보는 바람에 아주 민망했다”고 기술했다.

그 는 “이 통화에서 박 전 대표는 또 한가지를 문제 삼았다. 당시는 세종시특위를 구성하는 문제가 당내 현안이 됐을 때”라며 “그 며칠 전 특위 문제로 박 전 대표와 통화했는데, 이 대화 내용을 의원들과의 회의에서 간단히 소개했고 그때 박 전 대표는 나의 특위 취지 설명에 대해 ’알았다‘고 말했다”고 소개했다.

그 는 “이에 대한 보도가 나오자 박 전 대표는 전후 사정도 따져보지도 않고 대뜸 ’전화하기도 겁난다‘면서 나를 거짓말쟁이로 몰았다”고 주장했다. 그러면서 “박 전 대표와의 통화에서 특위 필요성을 설명하자 박 전 대표는 갑자기 화난 사람처럼 ’허태열 최고하고 상의하세요‘라고 높은 톤으로 소리를 질렀다”며 “’아랫사람들‘끼리 알아서 하라는 투로 들렸다”며 당시의 불편한 감정을 감추지 않았다.

헤럴드생생뉴스/onlinenews@heraldcorp.com


최고 권력 독재 가정에서 자란 박근혜는 자신은 존중받아야 되고 아랫 사람들은 자신의 말을 알아서 잘 따라야 되고 자신의 계획을 염화미소처럼 잘 파악해서 잘 수행해야 된다고 생각하는 거 같다. 뭔가 정신적으로 일반인과 다른 어떤 결핍이 있는건 아닐까?


얘기를 잘 들어주고 공감하고 상대의 기준에 맞게 일을 처리해 나가는 그런 민주주의적인 의식보다는 뭔가 이미지 조작하고 상징성을 보여주고 상대방들이 공포에 기반한 협력을 이끌어 내려는 독재적인 마인드로 꽉 차 있는 존재 같다.



지난 선거 때 안철수 후보 부인을 쨰려보던 저 표정이 그냥 어쩌다가 나온게 아닌거 같다.


나는 지난 선거때 박근혜를 찍지 않은 사람이다. 그리고 박근혜를 찍지 않은 많은 사람들이 그래도 일단 대통령이 됐으니까 잘 하시기를 빈다고 얘기할 때 나는 그런 얘기 안 했다.

왜냐하면 나는 박근혜가 대통령이 되면 잘 못할 거라고 생각했기 때문에 지지하지 않은 건데..

어떻게 잘 하기를 바란다고 얘기할 수 있나.

박근혜는 대통령으로서 일을 잘 할 수가 없다.

민주적인 정치 마인드 없이 독재자 밑에서 독재 수업을 받고 자란 정치인이 어떻게 민주적 정치를 잘 할 수 있겠는가..

박정희가 비리와 부패 구조를 만들어 놓고 그 비리와 부패 구조에서 혜택을 받고 있는 비리, 부패 세력들이 박근혜를 든든하게 받쳐주는 지원세력인데 어떻게 박근혜가 깨끗한 경제 민주화를 할 수 있겠는가..

이번 비서실과 내각 인선을 보더라도 예전 박정희 시대의 인물들이고 이명박정부 때 보다도 더 많은 비리 전력들이 얘기 되고 있지 않은가...


박근혜는 대통령으로서 일을 잘 할 수가 없다...


그나마 박근혜 5년이 줄 긍정적인 면은 박근혜가 박정희 독재의 정치적 한계를 실제 정치활동을 통해 보여 줌으로서 그동안 비리 부패 세력에 의해 조작 돼 왔던 박정희 신화를 산산조각 낼 좋은 기회가 왔다는 것이다.


친일, 독재, 비리, 부패 의 장본인인 박정희에 대한 평가가 리틀 박정희의 성깔 정치로 그 한계가 잘 들어나서 잘못된 우리나라 현대사에 대한 평가가 바로 잡혔으면 한다.


민족 정신이 투철해야할 자칭 보수라고 하는 작자들이 친일파나 두둔하고 자유 민주주의자라고 하는 작자들이 비리와 부패의 불공정 경쟁사회를 만든 독재자나 칭송하고 있으니...


우리나라에 진정한 보수는 있는가?


제대로 된 보수들이 힘을 받을 수 있도록 리틀 박정희인 우리 성깔 박근혜가 제대로 그 한계를 보여 줬으면 한다.





반응형


반응형
Posted on . Written by



오늘 업데이트 된 Corona Cloud 와 현재 분석 시스템을 이후 몇주간 어떻게 적용할 것인지에 대해 간단히 말씀 드리겠습니다.

우선 Corona Cloud 에 대해서인데요. 이제 거의 완료 됐습니다. 베타 버전에 대한 response 는 경이적이었습니다. 그래서 여러분에게 모바일 개발이 더 빠르고 더 쉽게 될 거라는 이 사실들을 공개하지 않을 수가 없습니다. 다음주에 더 개선된 베타 버전을 공개할 예정입니다. 그리고 launch date는 3월 초순이나 3월 중순이 될 겁니다. beta 버전을 사용하겠다고 신청하신 분들은 조금만 기다려 주시면 됩니다. 우리는 여러분들 특히 indie 개발 그룹들이 좋아할 만한 Corona twist 를 가지고 있습니다.

이제 분석과 관련해서 얘기해 보죠. Corona Cloud launch 의 일환으로 우리의 analytics infrastructure를 overhauling 하고 있습니다. 2월말까지 우리의 분석들을 마칠예정입니다. 그리고 새로운 analytics system 을 만들고 이를 3월 중순내로 빠르게 공개할 예정입니다. 시스템이 바뀌게 되면 초기에는 일정정도 불편한 점이 있으실 겁니다. 하지만 새로 제공되는 analytics 는 훨씬 좋고 유용할 겁니다.

월요일 올린 글에서 말씀 드렸듯이 현재 저희들은 아주 많은 일들을 준비하고 있습니다. 그리고 많은 것들이 조만간 여러분들에게 제공될 겁니다.
잠시만 기다려 주세요. :)


반응형