Tuesday, May 29, 2012

구글 안경

‘구글 안경’이 찍은 사진…“어, 양손없이도?"
ZDNet Korea 원문 기사전송 2012-05-28 18:21 최종수정 2012-05-28 18:21
구글이 준비 중인 안경형 헤드업 디스플레이(HUD, head-up displays), 일명 ‘구글 안경’으로 찍은 사진과 동영상이 대거 공개됐다. 구글은 안경형 디스플레이 관련 특허를 확보하는 등 제품 상용화에 박차를 가하고 있다... 현재까지 알려진 정보에 따르면 구글 안경은 안드로이드 운영체제(OS) 기반으로 연말께 출시될 예정이며 가격은 현재 출시된 스마트폰과 비슷한 선이 될 것으로 보인다.

Saturday, May 26, 2012

OS X Lion 에서 항상 스크롤바를 보이게 하는 방법

System Preferences > General > Show scroll bars 를 always 로 해줌
Always Show Scroll Bars in Mac OS X Lion

Thursday, May 24, 2012

Tip: Say Goodbye to Blurry Text for Good!

Tip: Say Goodbye to Blurry Text for Good!
Want a quick fix that will prevent text from being blurry on “retina” displays of any kind? Simply paste the following code at the top of your main.lua file (or put it in an external file and require-it in):

Wednesday, May 23, 2012

Corona에서 retina display 사용하는 법

config.lua 에 다음과 같이 넣는다.
 application = {  
      content = {  
           width = 320,  
           height = 480,   
           scale = "letterBox",  
           fps = 60,  
   
           imageSuffix = {  
       ["@1-5"] = 1.5, -- for Droid, Nexus One, etc.  
       ["@2x"] = 2,  -- for iPhone, iPod touch, iPad1, and iPad2  
       ["@3x"] = 3,  -- for various mid-size Android tablets  
       ["@4x"] = 4,  -- for iPad 3  
           }  
      }  
 }  
main.lua 에 다음과 같이 써준다.
 local red = display.newImageRect("red.png", 57, 63)  --> 57 x 63 은 이미지 사이즈
 red:setReferencePoint(display.TopLeftReferencePoint); --> pivot을 중앙이 아닌 좌상단으로(안해줘도 무관)
 red.x = 0  
 red.y = 0  
코드에는 image.png 를 로딩하는 걸로 했지만 시뮬레이터를 iPhone 4 로 돌리면 알아서 image@2x.png 가 로딩된다.
레퍼런스 :
Corona SDK: 03 Retina Images
Dynamic Image Resolution Made Easy
Content Scaling Made Easy
enabling retina display mode in corona sdk

Sprite Sheet의 경우
Sprite Sheet의 경우 위의 방식이 안되는데 다음과 같이 해결하는 방법이 있다.
Dynamic Retina SpriteSheets? Here's how!
I have to say I'm extremely pleased with the update if just because I can now finally add retina spritesheets to my game and thus having complete support for highres displays! Since I'm using even spaced SpriteSheets it was easy to do. If you're using custom sizes it should still be possible, but you're on your own.

Corona SDK: Creating a Scrolling Background

Corona SDK: Creating a Scrolling Background
Daniel Williams on Jul 7th 2011 with 4 comments
The Corona SDK makes it very easy to create dynamic effects with very few lines of code. Using the Corona SDK, we will create a scrolling 2D background with graphics that we create in Photoshop.

Tuesday, May 22, 2012

다른 module의 함수를 부르는 예

iTestUtil.lua
 module(..., package.seeall)   
   
 hello = function()  
      print("hello!!!!")  
 end  

main.lua
 local TestUtil = require("iTestUtil")   
 TestUtil.hello() -- 느린 방법   
   
 local hello = TestUtil.hello -- 함수를 cache해서 빠르게 함   
 hello() -- 이제부터는 부를 때마다 빠르게 호출할 수 있음   

Error: iTunes Cannot Connect to this iPhone

질문 : Error: iTunes Cannot Connect to this iPhone
답 : http://www.hackint0sh.org/iphone-3g-148/error-itunes-cannot-connect-iphone-77509.htm
보충 : USB cable 을 다른 곳에 끼워보면 해결되는 경우도 있음

Monday, May 21, 2012

Corona Debugger

Using the Corona Debugger
I do not write bug-free Lua code (I know, shocking). Much of the time, judicious use of print() statements will be enough to help me figure out just where things have gone off the rails. But every so often, that’s not enough...

Sunday, May 20, 2012

Lua에서 module 사용하는 법

main.lua
 local testlib = require("testlib")  
 testlib.myPrint() -- 느린 방법  
    
 local myPrint = testlib.myPrint -- 함수를 cache해서 빠르게 함  
 myPrint() -- 이제부터는 부를 때마다 빠르게 호출할 수 있음  

testlib.lua
 module(..., package.seeall)  
   
 function myPrint()  
      print("Hi!")  
 end  

레퍼런스 : Modules and Packages
주의 : testlib.lua 저장시 with BOM 으로 저장하면 안된다 (line 1에서 에러가 남)
키워드 : error, separate, multiple, 별도 파일, 소스

카카오톡 무료통화 "카운트다운"

카카오톡 무료통화 "카운트다운"
ZDNet Korea 2012-05-19 21:08
카카오톡이 글로벌 모바일인터넷전화(m-VoIP) 서비스를 위한 카운트다운에 들어갔다. 19일 업계에 따르면 모바일 메신저 카카오톡을 운영하는 카카오(대표 이제범, 이석우)는 무료 음성통화 서비스인 ‘보이스톡’ 서비스 채비를 완료하고 글로벌 출시시기를 조율중이다.

Saturday, May 19, 2012

table의 assignment

그냥 assign 될때는 value가 카피되고
함수에 argument로 pass 될때는 call by reference 로 넘겨진다.
함수에서 return 되는 것도 당연히 포인터가 리턴됨.
 function printTable(table)  
      print("------------")  
      if(table == nil) then   
           print("this table is nil!")  
      else  
           for k, v in pairs(table) do  
                print(k, v)  
           end  
      end  
 end  
   
 function getAnotherRefOfTable(table)  
      local anotherTableRef = table  
      anotherTableRef["job"] = "Magician"  
      return anotherTableRef  
 end  
   
 local a = {name="Kiki", job="Witch"}  
 local b = a   -- Values are copied  
 printTable(a)  
 a = nil  
 printTable(a)  
 printTable(b)  
 local c = getAnotherRefOfTable(b)   -- Called by reference  
 printTable(c)  

Friday, May 18, 2012

Corona의 Balloon Pop Sample 분석

init() 에서는 스프라이트를 만들고 타이머 이벤트를 등록한다.
 local function init()  
      ...  
      explosionSpriteSheet = sprite.newSpriteSheet("BigExplosion.png", 82, 117)  
      explosionSet = sprite.newSpriteSet(explosionSpriteSheet, 1, 18)  
      sprite.add(explosionSet, "default", 1, 18, 200, 1)  
   
      popSound = audio.loadStream("pop.wav")       
      Runtime:addEventListener("enterFrame", onTick) -- startBalloons()  
 end  

타이머 이벤트에서는 풍선을 생성시켜준다.
 function onTick()  
      if(balloonsPerLevel > 0) then  
           if(currentBalloonsShown < balloonsShownPerLevel) then  
                addBalloon()  
           end  
      end  
 end  

풍선에는 터치할 때 반응하기 위한 이벤트가 붙는다.
 function addBalloon()  
      currentBalloonsShown = currentBalloonsShown + 1  
      balloonsPerLevel = balloonsPerLevel - 1  
      local balloon = getNewBalloon()  
      balloon:addEventListener("touch", onTouch)  
      balloon.y = display.contentHeight + balloon.contentHeight  
      balloon.x = math.random(display.contentWidth)  
      local tween = transition.to(balloon, {time=5000, y=-100, onComplete=onBalloonEscaped})  
      currentBalloons[balloon] = {balloon=balloon, tween=tween}  
      return balloon  
 end  
   
 function onTouch(event)  
      local balloon = event.target  
      balloon.isVisible = false  
      local explosion = newExplosionSprite()  
      explosion.x = balloon.x  
      explosion.y = balloon.y  
      explosion:addEventListener("end", onBoomEnd)  
      explosion:play()  
      removeBalloon(balloon)  
      audio.play(popSound)  
 end  

풍선이 터치되었을 때 터지는 효과를 위한 스프라이트 생성
 function newExplosionSprite()  
      local explosion = sprite.newSprite(explosionSet)  
      explosion:prepare("default")  
      explosion.isHitTestable = false  
      return explosion  
 end  

오류
사실 샘플 코드에는 오류가 있는데 그것은 onBoomEnd()가 절대로 불리지 않는다는 점이다.
다음과 같이 고쳐주면 된다. (참고문헌 : spriteInstance:addEventListener())
 local function onBoomEnd(event)  
      if(event.phase == "end") then  
           print("onBoomEnd")  
           event.target:removeSelf()  
      end  
 end  
   
 function onTouch(event)  
      local balloon = event.target  
      balloon.isVisible = false  
      local explosion = newExplosionSprite()  
      explosion.x = balloon.x  
      explosion.y = balloon.y  
      print('explosion:addEventListener("~", onBoomEnd)')  
      explosion:addEventListener("sprite", onBoomEnd)  
      explosion:play()  
      removeBalloon(balloon)  
      audio.play(popSound)  
 end  
--------------------------------------------------------------------------
함수별

init()
sprite.newSpriteSheet()
sprite.newSpriteSet()
sprite.add()

startBalloons()
Runtime
Runtime:addEventListener()
The Corona Event Model explained

newExplosionSprite()
sprite.newSprite()
spriteInstance:prepare()

getNewBalloon()
display.newImage()

addBalloon()
object:addEventListener()

onTouch(event)
spriteInstance:addEventListener()

removeBalloon(balloon)
transition.cancel()
object:removeEventListener()

--------------------------------------------------------------------------
스프라이트 애니메이션
Advanced Animation Using Sprites

참고 : Corona의 event (중요!)

Thursday, May 17, 2012

파일 복사 도중 Error -8060 발생 원인 (OS X)

질문 : 파일 카피시 Error -8060 이 발생하는데 어떻게 해야 하나?
답 : 파일 전체 패스가 너무 긴 것은 없는지 체크해본다.
설명 : 오리지널 파일이 없는 Alias file 에 대해 생기는 에러라는 이야기가 많은데
그게 file copy가 중단될 정도의 심각한 오류라는 것은 좀 이상하다.
실제로 생긴 사례를 보면 파일 전체 패스가 너무 긴 경우에 생기는 것 같다.
예를 들어 컴 자체에서는 문제가 없더라도 외장하드로 옮기게 되면 전체 패스는 더 길어질 수 있으므로
카피 도중에 이 에러가 뜨게 된다.
레퍼런스 : what is error code -8060

Wednesday, May 16, 2012

String 예제

 y = 2012; m = 3; d = 1  
 s = string.format("%04d-%02d-%02d", y, m, d)  
 print(s)  
   
 s = string.format("%.4f", math.pi)  
 print(s)  
   
 s = "This is for you. I love you."  
 i = string.find(s, "you")  
 print(i)  
 i = string.find(s, "you", i+1)  
 print(i)  
   
 s = string.gsub(s, "you", "Jenny")  
 print(s)  
   
 s = "My girlfriend(Jenny) is lovely(cute(pretty))"  
 s = string.gsub(s, "%b()", "(---)")  
 print(s)  
레퍼런스 : Programming in Lua / Chapter 20. The String Library

table.insert(), table.remove()

    local a = {"Ariel", "Barbie", "Clara"}   
     
    table.insert(a, 3, "Zelda")   
    print("-----------------")   
       for k, v in pairs(a) do   
       print(k, v)   
    end   
       
    table.remove(a, 2)   
    print("-----------------")   
    for k, v in pairs(a) do   
       print(k, v)   
    end   
     
    table.remove(a, 1)   
    print("-----------------")   
    for k, v in pairs(a) do   
       print(k, v)   
    end   

__index, __newindex Metamethod

 MyArr = {}  
   
 MyArr.Meta = {}   
 MyArr.Meta.__tostring = function(a)  
      result = ""  
      for k, v in pairs(a.arr) do  
           result = result .. "[" .. k .. "]" .. " " .. v .. "\t"  
      end  
      return result  
 end  
 MyArr.Meta.__index = function(a, key)  
      return (a.arr[key])  
 end  
 MyArr.Meta.__newindex = function(a, key, value)  
      a.arr[key] = value  
 end  
 function MyArr.new(a)  
      local instance = {}  
      instance.arr = {}  
      for k, v in pairs(a) do  
           instance.arr[k] = v  
      end  
        
      function instance:printMe()   
           print("----------------------")  
           for k, v in pairs(self.arr) do  
                print(k, v)  
           end  
      end  
        
      setmetatable(instance, MyArr.Meta)  
      return instance  
 end  
   
 do  
      local a = MyArr.new{"Mimi", "Ki", "Jacky"}  
      a[5] = "Tom"  
      print(tostring(a))  
      a:printMe()  
 end  
Programming in Lua / Chapter 13. Metatables and Metamethods / 레퍼런스 : 13.4.1 – The __index Metamethod

맥 파인더에서 Open enclosing folder 핫키

Command + R

아이폰과 아이패드에서 블루투스 키보드 쓰기

Review: Apple Wireless Bluetooth Keyboard with iPad and iPhone
Posted by Alan. Last updated: December 15, 2011.
인용 : One of the benefits of using the iPad or iPhone for writing is that, because it’s more difficult to switch tasks, it increases your concentration and productivity when writing...

아이폰에서 bluetooth keyboard로 타이핑할 때 한글/영문 모드 전환 안하고 하는 법

한글 모드에서 Option 누르고 타이핑하면 영문이 찍힌다 (이건 Mac OS X에서도 동일하지만 아이폰에서 더 편한 feature)

아이폰에서 bluetooth keyboard 연결해서 쓸 때 아이폰 자체 키보드 나타나게 하는 방법

질문 : 아이폰에서 bluetooth keyboard 연결해서 쓰면 아이폰 자체 키보드는 안나타나게 되는데 아이폰 키보드를 나타나게 하는 방법?
답 : eject 버튼을 누르면 bluetooth keyboard 가 연결된 상태로 아이폰 자체 키보드를 show/hide 할 수 있다(toggle).
보충 : 이 방법을 알면, 폰을 키보드 없는 곳으로 가져갈 때 일일이 Settings > General > Bluetooth 로 들어가서 ON/OFF 를 해줄 필요가 없다.
인용 : Eject button: Show or hide onscreen keyboard
레퍼런스 :
Bluetooth Keyboard Shortcuts That Work with iPad/iPhone Devices
Use Keyboard Shortcuts with Bluetooth Keyboard
검색어 : iphone bluetooth keyboard shortcuts

array의 멤버에 nil이 assign되는 경우

array의 멤버에 nil이 assign되는 경우, 아무것도 안해주는 것과 동일하다. 예를 들어 다음과 같이 해주면
 local x = {[10] = "A", [20] = "B", [30] = nil, [40] = false}  
 for k, v in pairs(x) do  
      print(k, v)  
 end  
결과 :
 40     false  
 10     A  
 20     B  
[30]에는 아무것도 존재하지 않음을 알 수 있다.

Metatable 을 이용해 만든 집합연산

다음은 Chapter 13. Metatables and Metamethods / 13.1 – Arithmetic Metamethods 에 나온 Set 클래스를 다시 써 본 것.
 -- Metatable -------------------------------  
 SetMeta = {}  
   
 SetMeta.__tostring = function(a)  
      result = ""  
      for k in pairs(a) do  
           if(type(k) == "number") then -- 이것을 체크 안하면 함수까지 나열함  
                result = result .. k .. " "  
           end  
      end  
      return result  
 end  
   
 SetMeta.__add = function(a, b)   
      local result = Set.new{}  
      for k, v in pairs(a) do  
           if(v == true) then result[k] = true end  
      end  
      for k, v in pairs(b) do  
           if(v == true) then result[k] = true end  
      end  
      return result  
 end  
   
 SetMeta.__mul = function(a, b)   
      local result = Set.new{}  
   
      for k, v in pairs(a) do  
           if(type(k) == "number") then  
                if(v == true) then  
                     result[k] = b[k] -- nil 이 assign 되는 경우, 아무것도 안해주는 것과 동일.  
                end  
           end  
      end  
   
      return result  
 end  
   
 -- Set Class -------------------------------  
 Set = {}    
 function Set.new (a)  
      local instance = {}  
      for k, v in ipairs(a) do instance[v] = true end  
        
      function instance:printMe()  
           for k, v in pairs(self) do   
                if(type(k) == "number") then  
                     print(k, v)   
                end  
           end  
      end  
   
      setmetatable(instance, SetMeta)  
      return instance  
 end  
   
 -- Main -------------------------------  
 do  
      local a = Set.new{10, 20, 30}  
      local b = Set.new{20, 30, 40}  
      local c = a + b  
      local d = a * b  
      print("--------")  
      print(tostring(c))  
      print(tostring(d))  
      print("--------")  
      c:printMe()  
      print("--------")  
      d:printMe()  
 end  
키워드 : 집합 연산, union, intersection

Tuesday, May 15, 2012

Metatables and Metamethods

Metatable이란 Metamethod라는 함수들을 담고 있는 테이블을 말한다. Metatable이 table에 붙으면 그 테이블의 행동양식이 바뀐다. 예를 들어 보통의 테이블은 + 로 더하는 operation을 할 수 없지만, + 연산의 정의를 갖고 있는 메타테이블을 추가해줌으로써 + 연산을 가능하게 할 수 있다. 다음의 __add나 __tostring이 metamethod 인데 __add 라는 이름은 + operator 를 사용할 수 있는 특별한 키워드이고, __tostring 은 tostring(obj)의 형태로 쓸 수 있게 하는 특별한 키워드이다. 그러한 키워드들은 Metatable Events 에 정리되어 있다.
 CharacterMeta = {}  
 CharacterMeta.__add = function(a, b)  
      return Character.new(a.name .. " " .. b.name, a.HP + b.HP)  
 end  
 CharacterMeta.__tostring = function(a)  
      return (a.name .. "\t" .. a.HP)  
 end  
   
 Character = {}  
 Character.new = function(name, HP)  
      local instance = {}  
      instance.name = name  
      instance.HP = HP  
      setmetatable(instance, CharacterMeta)  
      return instance  
 end  
   
 do  
      local heroine = Character.new("Marilyn", 10)  
      local hero = Character.new("Manson", 20)  
      print(tostring(heroine))  
      print(tostring(hero))  
        
      local hybrid = heroine + hero  
      print(tostring(hybrid))  
 end  

Metatables and Metamethods in Lua

Metatables and Metamethods
Metamethods Tutorial ... __add 등
키워드 : getmetatable, setmetatable

아이북스發 1인 전자책 출판시대 열렸다

아이북스發 1인 전자책 출판시대 열렸다
아이패드 정식 출시안된 국내서도 ISBN·'세금ID' EIN 발급 받은뒤
美 아이튠즈 커넥터 활용하면 등재 가능

애플은 아이패드의 출시와 함께 전자책 스토어 '아이북스(iBooks)'를 운용하고 있다. 이를 활용하면 누구나 자유롭게 자신의 콘텐츠를 전자책으로 출간할 수 있다...

Monday, May 14, 2012

개별 instance에 특화된 member function 넣기

 Character = {}  
 Character.new = function(name, HP)  
      local instance = {}  
      instance.name = name  
      instance.HP = HP  
        
      function instance:decreaseHP(delta)  
           self.HP = self.HP - delta  
      end  
        
      function instance:printMe()  
           print(self.name, self.HP)  
      end  
             
      return instance  
 end  
   
 local hero = Character.new("Luke", 10)  
 local vader = Character.new("Vader", 20)  
 local soldier = Character.new("Soldier", 5)  
 hero:printMe()  
 vader:printMe()  
 soldier:printMe()  
   
 function vader:talk()  
      print("I am your father")  
 end  
   
 function soldier:printMe()  
      print(self.name, self.HP, "March!")  
 end  
   
 hero:decreaseHP(1)  
 vader:decreaseHP(2)  
 soldier:decreaseHP(4)  
 vader:talk()  
 hero:printMe()  
 vader:printMe()  
 soldier:printMe()  
Lua에서는 이처럼 특정 오브젝트만이 가지는 함수를 넣을 수도 있고,
같은 클래스라도 오브젝트 별로 다른 함수를 넣어줄 수도 있다.
(애초에 language 안에 클래스라는 개념이 없기 때문에 가능한 일)

Lua에서 클래스 정의하는 법 (3) Closure 방식

다음은 lua-users.org/wiki 의 Object Orientation Closure Approach 에 나오는 스타일을 따라한 것. (2) Table 방식과의 performance 비교도 되어 있음. 결론은, 성능상으로는 둘 다 비슷하므로 코딩 스타일에 따라 선택하는 게 좋다는 것.
 Hero = {}  
 Hero.new = function(name, HP)  
      local instance = {}  
      local maxHP = 100  
      local name_ = name or "anonymous"  
      local HP_ = HP or maxHP  
   
      instance.setHP = function(hp)  
           HP_ = hp  
      end  
        
      instance.printMe = function()  
           print("Hero : " .. name_ , "HP=" .. HP_)  
      end  
   
      return instance  
 end  
   
 hero1 = Hero.new(nil, nil)  
 hero2 = Hero.new("Mika", 80)  
 hero1.printMe()  
 hero2.printMe()  
   
 hero2.setHP(70)  
 hero1.printMe()  
 hero2.printMe()  
키워드 : OOP

Lua에서 클래스 정의하는 법 (2) Table 방식

다음은 lua-users.org/wiki 의 Object Orientation Closure Approach 에 나오는 스타일을 따라 정의한 것. 대체로 이 방법이 쓰임
 Hero = {}  
 Hero.new = function(name, HP)  
      local instance = {}  
      local maxHP = 100  
      instance.name = name or "anonymous"  
      instance.HP = HP or maxHP  
   
      instance.setHP = function(self, hp)  
           self.HP = hp  
      end  
   
      instance.printMe = function(self)  
           print("Hero : " .. self.name , "HP=" .. self.HP)  
      end  
   
      return instance  
 end  
   
 hero1 = Hero.new(nil, nil)  
 hero2 = Hero.new("Mika", 80)  
 hero1:printMe()  
 hero2:printMe()  
   
 hero2:setHP(70)  
 hero1:printMe()  
 hero2:printMe()  
   
 hero1:setHP(90)  
 hero1:printMe()  
 hero2:printMe()  
보충 :
사실 Hero = {} 하고 나서 Hero.new() 를 정의하는 것은 constructor 를 Hero.new 같은 형식으로 쓸 수 있게 하기 위한 것 뿐이다. 사실 Hero = {} 를 정의하지 않고 HeroNew() 라는 이름으로 function 정의를 해버려도 된다.

local instance = {} 로 안하고
instance = {} 로 해버리면
instance 가 global 이 되어 버려서 hero1 과 hero2 가 항상 똑같은 global object 를 가리키게 된다.
local 선언을 절대 잊어서는 안된다.

instance.setHP = function(self, hp) 는
function instance.setHP(self, hp) 또는
function instance:setHP(hp) 로 써줄 수 있다.
실전에서는 "보다 간결한 방식이 있을 때는 그 방식을 채택한다"는 원칙을 갖고 코딩하는 것이 좋을 것이다.

키워드 : OOP

Lua에서 클래스 정의하는 법 (1)

다음은 Programming in Lua 의 Chapter 16. Object-Oriented Programming 에 나오는 스타일을 따라 정의한 것. 설명을 위해 책에 등장하긴 했지만 실전에선 잘 안쓰이는 방식.
 Hero = {  
      name = "anonymous",  
      HP = 100,  
 }  
   
 Hero.init = function(self, name, hp)  
      self.name = name  
      self.HP = hp  
 end  
   
 Hero.printMe = function(self)  
      print("Hero : " .. self.name , "HP=" .. self.HP)  
 end  
   
 hero1 = {init = Hero.init, printMe = Hero.printMe}  
 hero1:init("Jack", 70)  
 hero1:printMe() -- Hero : Jack     HP=70  
   
 hero2 = {init = Hero.init, printMe = Hero.printMe}  
 hero2:init("Mimi", 50)  
 hero2:printMe() -- Hero : Mimi     HP=50  
   
 hero1:printMe() -- Hero : Jack     HP=70  
키워드 : OOP

애플 “전자책 구매는 앱 내부 결제만”

애플 “전자책 구매는 앱 내부 결제만”
bloter.net by 정보라 | 2011. 07. 26
애플은 잡지, 신문, 음악, 비디오 등 콘텐츠 기반의 발행인들이 iOS 앱에 결제 기능을 넣으려면 “애플의 앱 내부 결제 시스템은 반드시 도입해야 하며, 결제액의 30%는 애플이 가져가겠다”라고 했다.

앱 승인 거절되면 어쩌지…’웹앱’이 있잖아

앱 승인 거절되면 어쩌지…’웹앱’이 있잖아
bloter.net by 정보라 | 2011. 03. 10
앱 내부 결제 방식을 쓰지 않는다는 이유로 애플에서 앱 승인을 거절 당한 Arc90이 새로운 돌파구를 찾았다. 이 회사는 9일 자사의 웹사이트를 HTML5로 개선했다. 이른바 웹앱을 만든 셈이다...

OOP in Lua

가장 알기 쉬운 설명 링크 :
[1] Object Orientation Closure Approach
[2] Lua OOP (Litt's Lua Laboratory)
[3] Programming in Lua - Chapter 16. Object-Oriented Programming
[3]은 [1], [2]를 다 이해한 후에 보는 것이 알기 쉬움

보충 :
[2] 에서 좀 잘못된 부분이 있는데
 Point.new = function(x, y)       
      -- #PRIVATE VARIABLES  
      local self = {}    -- Object to return  
      x = x or 0      -- Default if nil  
      y = y or 0      -- Default if nil  
와 같은 코드가 있는데 이렇게 하면 x와 y는 global variable이 되어 버린다.
local x, local y 로 해주어야 함.

미러 :
Lua로 Object Oriented Programming 하기 - class 정의하기/Lua OOP.html
Lua로 Object Oriented Programming 하기 - class 정의하기/lua-users wiki - Object Orientation Closure Approach.html

참고자료 모음 :
Object Orientation Closure Approach
Object Orientation Tutorial - Representation of classes in Lua
Object Oriented Programming in Lua
Inheritance Tutorial
Metamethods Tutorial
Inspired Lua - Object Classes

인용 : Lua wasn't built with OOP in mind, it was built with atomic computer programming features such as closures, iterators, tables, metatables, tail recursion.
출처 : Discussion: Many Ways to Do OOP
키워드 : Object Oriented, class definition

Sunday, May 13, 2012

3D Engines for the iPhone

Unity 3D Engine
ShiVa3D
SIO2 Interactive, SIO2

링크 :
Review of 3D Engines for the iPhone (2009년 자료)

검색어 : 3D game engine cross platform iphone 2012

Unity3D

Create Games With Unity
Unity is a feature rich, fully integrated development engine for the creation of interactive 3D content. It provides complete, out-of-the-box functionality to assemble high-quality, high-performing content and publish to multiple platforms. Unity helps indie developers and designers, small and major studios, multinational corporations, students and hobbyists to drastically reduce the time, effort and cost of making games.
링크 : http://unity3d.com/
키워드 : iphone game 3D engine
참고 : Digital Tutors 에서도 Unity 강좌 코너가 있음

Nested function

 function printReverse(str)  
      function reverseString(s)  
           return string.reverse(s)  
      end  
      print(reverseString(str))  
 end  
   
 printReverse("ANONYMOUS")  

Variable Arguments

 function printAll(...)  
      for i=1, #arg do  
           print(i, arg[i])  
      end  
 end  
   
 printAll("Megadeth", "Metallica", "Slayer", "Anthrax")  

Looping

 local a = {Mustaine = "Megadeth", Hetfield = "Metallica", King = "Slayer", Yngwie = "Rising Force"}  
   
 print ("--next--------------------------------------")  
 do   
      local k, v  
      k, v = next(a, nil)  
      while k do  
           print(k, v)  
           k, v = next(a, k)  
      end  
 end  
 print ("--pairs--------------------------------------")  
 do  
      for i, v in pairs(a) do  
           print(i, v)  
      end  
 end  

Lua의 closure 이용해 array iterator 만든 예

 function array_iterator(a, startIndex, endIndex)  
      local i = startIndex - 1  
      return function()  
           i = i + 1  
           if (i > endIndex) then   
                return nil  
           else   
                if (i <= #a) then   
                     return i, a[i]  
                end  
           end  
      end  
 end  
 local a = {"Ariel", "Betty", "Clara"}  
 for i, v in array_iterator(a, 1, 3) do  
      print(i, v)  
 end  
   

Lua의 closure에서 두개 이상의 함수를 리턴하는 예

 function stateChanger()  
      local n = 9  
      function inc()  
           n = n + 1; return n  
      end  
      function dec()  
           n = n - 1; return n  
      end  
      return inc, dec  
 end  
   
 local add, sub = stateChanger()  
 print(add()) -- 10  
 print(add()) -- 11  
 print(add()) -- 12  
 print(sub()) -- 11  
 print(sub()) -- 10  
 print(add()) -- 11  
 print(add()) -- 12  
 print(sub()) -- 11  

Lua의 closure를 이용한 iterator 구현 예

 function integer_iterator(a, b)  
      local n = a - 1  
      return function()  
           n = n + 1  
           if (n > b) then return nil  
           else return n   
           end  
      end  
 end  
   
 for n in integer_iterator(10, 15) do  
      print(n)  
 end  

Lua의 closure를 이용한 코드

maker()는 일종의 factory. maker()가 는 iter()라는 함수를 리턴한다.
 function maker()  
      local n = 0  
      function iter()  
           n = n + 1  
           return n  
      end  
      return iter  
 end  
위와 아래의 코드는 동일하다. function에 이름을 붙였는지 안붙였는지의 차이.
 function maker()  
      local n = 0  
      return function()  
           n = n + 1  
           return n  
      end  
 end  
출처 : Litt's Lua Laboratory: Lua Closures and Iterators (With Snippets)

Lua 의 closure 란 무엇인가?

질문 : Lua 의 closure 란 무엇인가?
답 : In computer science, a closure (also lexical closure or function closure) is a function together with a referencing environment for the non-local variables of that function.
레퍼런스 : http://en.wikipedia.org/wiki/Closure_(computer_science)
인용 : Lua uses the concept of a closure - in Lua, variables that are local to a function are also available in functions that are defined within that function i.e. within nested definitions, or 'within the outer closure'.
레퍼런스 : What are closures in Lua?

17개월 된 아이에게 '뉴 아이패드' 줬더니…

17개월 된 아이에게 '뉴 아이패드' 줬더니…
[이과 출신 기자의 IT 다시 배우기]④뉴 아이패드 써보니
...일부에서 제기하는 발열 문제는 심각한 수준은 아니었다. 많은 LTE(롱텀에볼루션)폰은 이보다 더 많은 열을 내기 때문이다.
키워드 : iPad

Lua의 tail call

Tail call 이란 함수 내에서 다른 함수를 call 할때 기존의 방식처럼 stack 에 쌓이는 게 아니라
goto 방식으로 이동하는 방식. 따라서 아무리 많이 recursive call 을 하더라도 stack overflow 가
생기지 않는다. Lua에서는 return func(args) 의 형태만이 tail call 이다.

recursive function 예 (forward declaration 사용)

 local factorial  
 function factorial(n)  
      if (n == 1) then return 1  
      else  
           return factorial(n - 1) * n  
      end  
 end  
   
 print(factorial(5))  

function을 redefine하는 예

 do  
      local oldSin = math.sin  
      local degToRad = math.pi / 180  
      math.sin = function (x)  
           return oldSin(x * degToRad)  
      end  
 end  
   
 print("sin 30 = " .. math.sin(30))  

Saturday, May 12, 2012

table.sort 를 이용한 reverse sort

   
 nicknames = {  
      "Mike",   
      "John",  
      "Lenny",  
      "Ariel",  
      "Yngwie",  
 }  
   
 function sortByNameReverse(tableToSort)  
      table.sort(tableToSort, function(a, b) return a > b end)  
 end  
   
 sortByNameReverse(nicknames)  
 for i, v in pairs(nicknames) do  
      print(i, v)       
 end  
   

table.sort 간단 예제

   
 nicknames = {  
      "Mike",   
      "John",  
      "Lenny",  
      "Ariel",  
      "Yngwie",  
 }  
   
 function sortByName(tableToSort)  
      table.sort(tableToSort)  
 end  
   
 sortByName(nicknames)  
 for i, v in pairs(nicknames) do  
      print(i, v)       
 end  
table.sort 의 comparision 함수의 기본값은 a < b

Anonymous Function 을 이용한 table.sort

   
 nicknames = {  
      {name = "Mike", nick="Kokoa"},  
      {name = "John", nick="Berserker"},  
      {name = "Lenny", nick="Angelina"},  
      {name = "Ariel", nick="Zelda"},  
      {name = "Yngwie", nick="Rising Force"},  
 }  
   
 function sortByNameReverse(tableToSort)  
      table.sort(tableToSort, function (a,b) return (a.name > b.name) end)  
 end  
   
 sortByNameReverse(nicknames)  
 for i, v in pairs(nicknames) do  
      print(v.name, v.nick)       
 end  
table.sort 의 default 비교 함수는 < 이다.
참고링크 : Table Library Tutorial

Lua의 function 은 anonymous

Lua의 function 은 사실은 anonymous 하다.
우리가 function name 이라고 생각하는 것은 사실 그 function 을 가리키는 pointer 일 뿐이다.

Lua 에서 다음 코드는
function foo (x) return x + 100 end

다음 코드의 syntactic sugar에 불과하다
foo = function (x) return x + 100 end

Lua의 function는 pointer 값처럼 사용 가능

 function myAdd(x, y)  
      return x + y  
 end  
   
 function myMul(x, y)  
      return x * y  
 end  
   
 local x, y = 20, 10  
 func = myAdd; local a = func(x, y)  
 func = myMul; local b = func(x, y)  
 print("myAdd : " .. a)  
 print("myMul : " .. b)  
   
키워드 : anonymous function

애플 아이튠즈(iTunes)의 동기화 개념 깔끔 정리

기본 개념 : 아이튠즈를 실행하여 PC와 아이폰을 동기화 시키는 경우, 다음 세가지 경우가 있다.
  1. 아이폰 쪽에서만 변경되었을 때 : 아이폰 → 아이튠즈 
    (아이튠즈의 데이터를 아이폰의 데이터에 일치시켜준다)
  2. 아이튠즈 쪽에서만 변경되었을 때 : 아이폰 ← 아이튠즈 
    (아이폰의 데이터를 아이튠즈의 데이터와 같도록 일치시켜준다)
  3. 아이폰과 아이튠즈 둘 다 변경되었을 때 : 아이폰 ← 아이튠즈 (2와 동일)
    (아이폰의 변경사항은 무시되고 아이튠즈의 데이터로 덮어써진다)
실수로 데이터가 유실되는 것은 모두가 3의 경우이다. 이렇게 안되려면 다음과 같이만 사용하면 된다.
(A) 아이폰을 컴퓨터에 꽂을 때는 아무것도 건드리지 말고 그냥 동기화만 해준다
(B) 아이튠즈에서 뭔가 변경하고 싶다면 먼저 (A), 즉 아이폰과의 동기화를 하고 나서 한다
이렇게만 하면 데이터가 유실될 염려가 없다.

예외 :  사진 파일 등에는 이런 개념이 적용되지 않게 되어 있다. 예를 들어 아이튠즈에서
Sync photos from iPhoto 를 해주더라도 아이폰에서 찍은 사진이 없어지거나 하지 않고, 단지
아이튠즈의 사진 데이터가 아이폰으로 옮겨올 뿐이다 (아이폰에서 삭제하지도 못한다)
사진 파일은 아이폰과 PC에서 동시에 변경될 가능성이 높은 데이터이기 때문에 예외를 둔 것.

Friday, May 11, 2012

Calibre - txt to epub converter (free)

소개 : Calibre is an open source e-book management tool. Simply put, calibre allows you to organize your e-book collection, convert e-books to various formats, and interact with your e-book reader, all in an intuitive and friendly manner. It is compatible with Microsoft Windows – XP, Vista, and 7 – as well as Apple's OS X (and various flavors of Linux).

간단 사용법 :
1. 가운데의 빈 창으로 txt 파일을 끌어넣는다.
2. 책 커버로 하고 싶은 이미지를 우측의 책 모양 그림으로 끌어넣는다.
3. 위쪽의 Convert books 버튼을 누른다.
4. 변환 창이 뜨면 Output format이 EPUB로 된것을 확인한다.
    Title, Author 를 입력하고 OK 를 누르면 epub 로의 변환이 시작된다.
5. 변환이 완료되면 우측에 Formats : 에 EPUB 가 표시된다.
6. 아래쪽의 Path : Click to open 을 누르면 epub 파일이 생성된 폴더가 열린다.

epub 보는 법 :
아이폰에서 ebook viewer 로 stanza 를 사용하는 경우
1. iTunes의 응용프로그램 탭으로 가서
2. stanza의 도큐먼트에 epub 파일을 끌어넣으면 된다.

참고 :
참고로 다음과 같이 되어 있는 라인은 챕터명으로 인식되어 크게 표시된다. 단 [제목] 부분은 영문이어야 함.
Part 1 [제목], Part 2 [제목]...
Chapter 1 [제목], Chapter 2 [제목]...
#1 [제목], #2 [제목]...

다음과 같이 [제목] 부분이 아예 없어도 챕터명으로 크게 표시된다.
Part 1, Part 2...

------------- 는 긴 가로줄로 표시된다.

이런 기능의 세부적인 것은 옵션으로 직접 지정할 수도 있는 것으로 보이지만 그 방법이 너무 복잡하므로
그냥 디폴트 세팅으로 사용하는 것을 권장.

다운로드 : calibre-ebook.com
참고 : Convert any text to epub for Apples iBooks app!

Online epub converters (txt to epub)

http://ebook.online-convert.com/convert-to-epub
http://www.convertfiles.com/convert/document/TXT-to-EPUB.html
http://www.epub-converter.biz/how-to/convert-txt-to-epub.html
http://www.2epub.com/
키워드 : Online txt to epub converter, free

iphone 용 offline eBook reader 중 가장 쓸만한 것

질문 : iphone 용 offline eBook reader 중 가장 쓸만한 것
답 : Stanza
설명 : epub 파일을 읽을 수 있음. mobi file 은 안됨
주의점 : 사용하다가 화면이 어두워져서 당황하는 경우가 있는데
그것은 손가락으로 올리고 내리면 화면 밝기가 조절되는 stanza의 기능 때문에 그런 것임
(출처 : Stanza e-book app – how to fix the screen brightness)
(검색어 : stanza dark screen)
다운로드 : AppStore > Stanza
os x 용도 있음 http://stanza.en.softonic.com/mac
레퍼런스 : http://www.readwriteweb.com/archives/seven_must-have_offline_apps_for_iphone_and_ipod_touch.php
검색어 : google > iphone offline ebook reader

iPhone 용 txt viewer 중에서 가장 쓸만한 것

질문 : iPhone 용 txt viewer 중에서 가장 쓸만한 앱
답 : PowerReader
라이트 버전은 free 인데다가 광고도 없어서 좋다.
Description :
PowerReader is a simple but powerful reading tool.

Features: 

- It is available to view the files with various formats as below:
txt, pdf, png, jpg, tiff, gif, bmp, htm, html, doc, xls, ppt, docx, xlsx, pptx.
- It is also available to play mp3 & mp4 files.
- Supports Google docs downloading.
- Supports "Open-in" feature, you can open the supported data from mail, safari or some other APPs that supported open-in feature.
- Supports landscape view mode.
- Turning pages forward or backward quickly.
- Various types of font for txt reading.
- Diverse kinds of encoding for txt reading.
- Uploading files through iTunes.
- Automatic line breaks. 

- Full text search, you can easily search the entire text.
- Online Translation engine.
- Automatically save the last reading point.
- Text color and background color setting.
- Automatically separate the big txt file to accelerate the access speed
- Single/multi page display for PDF viewer.
- Bookmark feature.
참고 : 그림 파일을 볼 수도 있긴 하지만 인터페이스가 불편하게 되어 있음
검색어 : AppStore > txt viewer
키워드 : eBook

Thursday, May 10, 2012

PlainText 사용법

다음은 PlainText 깔면 생기는 간단 help

Hello.txt
Thanks for trying PlainText! My intention is to keep PlainText free and minimal. If you need more settings please take a look at WriteRoom 3.0 for iOS.
Thanks,
Hog Bay Software

Tips & Tricks.txt
  1. To delete a file or folder, swipe its name in the item list view and then tap the 'Delete' button.
  2. To count words in your document, tap its title and select 'Word Count.' You can also tap in the document text to show the Cut, Copy, Paste, and Word Count menu.
  3. To scroll through long documents & lists, tap and hold on the right side of the view where scroll indicator shows. Then drag to quickly scroll through your document.
  4. To email, print, rename or count the words in a document: Tap its name in the document title bar, and choose from the popup menu.
  5. To focus on your document (iPad only) tap the two-arrow icon in the lower right-hand of the screen. Exit by tapping it again.
  6. To move the cursor in full-screen mode (iPad only) tap the page margins to move left or right by 1 letter (1 finger tap) or 1 word (2 finger tap).
기타

최적화된 사용을 원하면 Settings > Dropbox 로 들어가서
Sync Automatically 를 OFF 로 해주고
변경 사항이 있을 때 Sync All Now 를 해주는 것이 좋음

퓨전 FNC FS-94KBT 블루투스 미니 키보드의 장단점

장점 :
1. 가격이 저렴함
2. 눈으로 보기에 디자인이 좋은 편
단점 :
1. 전체적으로 키가 너무 뻑뻑해서 타이핑하기가 대단히 어렵다
2. 좌측의 Shift 키가 너무 작고 그 자리를 Fn 키가 차지하고 있어 오타가 무척 많이 발생
3. 가로 세로 크기는 Apple Wireless Keyboard 와 거의 동일하나 두께가 너무 두껍고 무게가 무겁다
    광고 사진만 보면 그렇게 두껍다는 것을 알기가 어려운 것이 문제.
4. 생산공정에서 발생한 플라스틱 조각이 떨어져 나온 것들이 눈에 띄기도 한다 (마감이 안좋은 듯)

Wednesday, May 9, 2012

Dropbox-Powered iPhone Text Editors

질문 : 드롭박스를 지원하는 아이폰용 텍스트에디터 중 가장 쓸만한 것?
답 : 가장 심플하고 좋은 건 PlainText
참고 : free version 을 받으면 아래쪽에 광고 배너가 뜨며 광고 없는 버전을 사려면 in-app purchase 로밖에는 안됨 (1.99달러로 사면 됨)
키워드 : 드롭박스

Mac용 Excel에서 edit mode로 들어가는 shortcut?

질문 : 윈도우용 엑셀에서 F2로 에디트 모드로 들어가듯 Mac용 Excel에서 하는 hotkey?
답 : Ctrl + U (Toggle Edit / Navigation Mode)
키워드 : excel cell edit mode shortcut mac, Edit Mode Shortcut Like F2 in Excel, 핫키
미러 : Excel Shortcuts Mac.pdf

Shortcut for clear contents? (Microsoft Excel)

질문 : Shortcut for clear contents? (Microsoft Excel)
답 : Del 키 (Apple wireless keyboard 나 랩탑에서는 Fn + Delete)
또는 Ctrl + B
설명 : 그냥 Delete 키를 누르면 cell의 내용이 지워지고 edit mode 로 들어간다.
인용 : "forward delete" key (often marked "del") on extended keyboards
레퍼런스 : Re: Shortcut for clear contents?
키워드 : 핫키, hotkey
미러 : Excel Shortcuts Mac.pdf

Tuesday, May 8, 2012

애플의 가격 공개 정책

[이균성]아이폰에는 있지만 갤럭시에는 없는 것
애플, 투명한 가격정책 '감동'…삼성, 불투명한 가격구조에서 못벗어나
2012.05.08. 화 09:43 입력
애플은 제품을 발표할 때 대부분 가격을 공개한다. 아이폰과 아이패드 같은 전략 제품일 경우 거의 예외가 없다.

게임으로 돈 벌려면 iOS로…안드로이드의 5배

게임으로 돈 벌려면 iOS로…안드로이드의 5배
Bloter.net 2012. 05. 07
2012년 3월 기준으로 iOS 모바일게임 매출이 전체 모바일게임 매출의 84%를 차지하는 것으로 드러났다... 앱내부결제를 통한 수익이 나날이 증가하고 있다는 점도 이번 조사에서 눈길을 끄는 대목이다. iOS와 안드로이드용 모바일게임 모두 91%의 매출이 앱내부결제를 통해 발생하는 것으로 조사됐다.

Sunday, May 6, 2012

iCloud Setup Tutorial

iCloud Setup Tutorial and Demo
How to setup iCloud
검색어 : iCloud Tutorial apple
키워드 : 아이클라우드

Friday, May 4, 2012

teleport : 하나의 키보드/마우스로 여러 맥 사용하게 해주는 유틸

설명 : teleport lets you use a single mouse and keyboard to control several Macs. Simply reach an edge of your screen, and your mouse teleports to your nearby Mac, which also becomes controlled by your keyboard. The pasteboard can be synchronized, and you can even drag & drop files between your Macs.
다운로드 : teleport
키워드 : bluetooth

스마트폰 액세서리

스마트폰 액세서리 인기에 IT 업계 ‘초긴장’
스마트폰 + 키보드 = 노트북
스마트폰 + 액정필름 = 휴대용 게임기
스마트폰 + 렌즈 = DSLR
스마트폰 + 프로젝터 = 개인영화관

[뉴 트렌드] "스마트폰 액세서리, 2년 뒤엔 1兆 패션 시장"
조선경제 2010.10.22 03:03
스마트폰 액세서리 판매가 '돈이 된다'는 사실이 알려지자 대기업은 물론이고 중견기업·개인사업자까지 경쟁적으로 시장에 뛰어들고 있다.

삼성 : 삼성모바일샵 (전국 9곳에 매장을 운영 중)
팬텍 : IT제품·액세서리 매장 '라츠'
금강제화 : 프리스비

검색어 : 스마트폰 액세서리 시장규모

unpack 사용예

a, b = unpack{10, 20}

키워드 : array

math.random 사용예

   
 do  
           print(); print("***** RANDOM *****")  
             
           local a, b, c, d  
           a = math.random()  
           print("random() = " .. a)  
           a = math.random()  
           print("random() = " .. a)  
           a = math.random()  
           print("random() = " .. a)  
   
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
           b = math.random(10)  
           print("random(10) = " .. b)            
   
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
           c = math.random(10, 20)  
           print("random(10, 20) = " .. c)  
   
           math.randomseed(1234)  
           print("randomseed(1234)")  
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
   
           math.randomseed(1234)  
           print("randomseed(1234)")  
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
   
           math.randomseed(100)  
           print("randomseed(100)")  
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
             
           math.randomseed( os.time() )  
           print("randomseed(os.time())")  
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)            
           d = math.random(10)  
           print("random(10) = " .. d)  
 end  

Thursday, May 3, 2012

math library 사용예

   
 do  
      print(); print("***** MIN *****")  
   
      require("math")  
      local minVal = math.min(30, 20, 50, 40, 10)  
      print(minVal)  
   
      local maxVal = math.max(30, 20, 50, 40, 10)  
      print(maxVal)  
   
 end  
   
 do  
      print(); print("***** floor, ceil, sin, cos, pow *****")  
   
      local a = 10.8  
      local a_floor = math.floor(a)  
      local a_ceil = math.ceil(a)  
      local sin30 = math.sin(math.pi / 6)  
      local cos30 = math.cos(math.pi / 6)  
      print("floor 10.8 = " .. a_floor)  
      print("ceil 10.8 = " .. a_ceil)  
      print("sin 30 = " .. sin30)  
      print("cos 30 = " .. cos30)  
        
      local c = sin30^2 + cos30^2  
      print("sin30^2 + cos30^2 = " .. c)  
        
      local x = math.pow(2, 10)  
      print("2^10 = " .. x)  
 end  
        
 do  
      print(); print("***** modf, sqrt *****")  
   
      local x, y, z;  
        
      x, y = math.modf(3.14)  
      print("3.14 -> " .. x .. " & " .. y)  
        
      x, y = math.modf(-3.14)  
      print("3.14 -> " .. x .. " & " .. y)  
        
      x, y = math.modf(3)  
      print("3.14 -> " .. x .. " & " .. y)  
        
      z = math.sqrt(3)  
      print("sqrt(" .. 3 .. ") = " .. z)  
 end  
   
 do  
      print(); print("***** MATH.HUGE *****")  
      print("math.huge = " .. math.huge)  
      print("-math.huge = " .. -math.huge)  
      print("math.huge / 2 = " .. math.huge / 2)  
      print("math.huge / math.huge = " .. math.huge / math.huge)  
      print("math.huge * 0 = " .. math.huge * 0)  
      print("1 / 0 = " .. 1 / 0)  
      print(math.huge == math.huge)  
      print(1 / 0 == math.huge)  
 end  
   

Lua의 math library

 math.abs  math.acos math.asin math.atan math.atan2 math.ceil  
 math.cos  math.cosh math.deg  math.exp math.floor math.fmod  
 math.frexp math.huge math.ldexp math.log math.log10 math.max  
 math.min  math.modf math.pi  math.pow math.rad  math.random  
 math.randomseed    math.sin  math.sinh math.sqrt math.tanh  
 math.tan  
링크 : Math Library Tutorial

Multiple Assignment 를 이용한 간결한 구현 예

 function getMinAndMax(a)  
      local min_i, max_i = -1, -1  
      local min, max = math.huge, -math.huge  
      for i, v in pairs(a) do  
           if (v < min) then min, min_i = v, i end  
           if (v > max) then max, max_i = v, i end  
      end  
      return min_i, max_i, min, max  
 end  
   
 local a = {10, 60, 5, 3, 4, 30, 40, 20}  
 local min_i, max_i, min, max = getMinAndMax(a)  
 print("min = a[" .. min_i .. "] = " .. min)  
 print("max = a[" .. max_i .. "] = " .. max)  
   

Multiple assignment 에 local 쓰는 법

local a, b = 10, 20
와 같이 앞에 한번만 써주면 a, b 가 모두 local 로 정의됨

코드
 a = 666  
 b = 999  
   
 function foo_local()  
      local a, b = 10, 20  
 end  
   
 function foo_global()  
      a, b = 10, 20  
 end  
   
 foo_local()  
 print ("a = " .. a)  
 print ("b = " .. b)  
   
 foo_global()  
 print ("a = " .. a)  
 print ("b = " .. b)  
   

결과
a = 666
b = 999
a = 10
b = 20

Multiple results 를 return 하는 함수 구현

 function getMin(a)  
      local min_i = -1  
      local min_v = math.huge  
      for i, v in pairs(a) do  
           if min_v > v then  
                min_v = v  
                min_i = i  
           end  
      end  
      return min_i, min_v  
 end  
   
 local heights = {167, 195, 180, 153, 155}  
 local minHeight_i, minHeight = getMin(heights)  
 print("a[" .. minHeight_i .. "] = " .. minHeight)  
키워드 : function

Multiple results 를 return 하는 함수

 local s, e = string.find("My name is Roger", "name")  
 print(s, e) --> 4 7  

function에서 argument의 default value 사용예

코드
 function incCount (num, delta)  
      delta = delta or 1  
      num = num + delta  
      return num  
 end  
   
 local num = 10; print(num)  
 num = incCount(num); print(num)  
 num = incCount(num); print(num)  
 num = incCount(num); print(num)  
 num = incCount(num); print(num)  
 num = incCount(num, 6); print(num)  

결과
10
11
12
13
14
20

설명
delta = delta or 1
여기서 delta 값을 지정하면 그 값을 사용하되
delta 값이 주어지지 않으면 기본값으로 1을 사용함

function 사용 예

 function sum(a)  
      local sum = 0  
      for i, v in pairs(a) do  
           sum = sum + v  
      end  
      return sum  
 end  
   
 local a = {10, 20, 30, 40}  
 print(sum(a))  
키워드 : 함수

loop 내의 break 문

 local a = {"Red", "Green", "Blue", "Yellow", "Purple"}  
 for i, color in pairs(a) do  
      print(color)  
      if color == "Yellow" then break end  
 end  

아이폰용 도난방지 앱

진돗개 (Oh My Phone)
CCTV 기능까지 갖춘 ‘도난방지 앱’… “스마트폰 사용자라면 꼭!”
아이폰 분실 후 대처방법
키워드 : iPhone

pairs vs ipairs

질문 : pairs 와 ipairs 의 차이?

설명
pairs는 내부의 hash 를 iterate 하고
ipairs는 1부터 시작하는 integer key를 iterate 한다.
(ipairs는 key 가 integer가 아닌 경우는 iterate 하지 못함)
다음 코드를 돌려보면 명확해짐

 print("=================")  
 local a = {10, 20, 30}  
 for i,v in ipairs(a) do print(v) end   

 print("~~~~~~~~~~~~~~~~~~~~~~")  
 for i,v in pairs(a) do print(v) end  

 print("=================")  
 local b = {[0]=10, 20, 30}  
 for i,v in ipairs(b) do print(v) end   

 print("~~~~~~~~~~~~~~~~~~~~~~")  
 for i,v in pairs(b) do print(v) end  

 print("==================")   

결과
=================
10
20
30
~~~~~~~~~~~~~~~~~~~~~~
10
20
30
=================
20
30
~~~~~~~~~~~~~~~~~~~~~~
20
30
10
==================

코드
 numArray = {"One", "Two", "Three"}  
 revNumArray = {}  
 for k, v in pairs(numArray) do  
      revNumArray[v] = k  
 end  
 print("--pairs(numArray)----------------------------")  
 for k, v in pairs(numArray) do  
      print(k .. " : " .. v)  
 end  
 print("--pairs(revNumArray)----------------------------")  
 for k, v in pairs(revNumArray) do  
      print(k .. " : " .. v)  
 end  
 print("~~ipairs(numArray)~~~~~~~~~~~~~~~~~~~~~~~~~~")  
 for k, v in ipairs(numArray) do  
      print(k .. " : " .. v)  
 end  
 print("~~ipairs(revNumArray)~~~~~~~~~~~~~~~~~~~~~~~~~~")  
 for k, v in ipairs(revNumArray) do  
      print(k .. " : " .. v)  
 end  

결과
--pairs(numArray)----------------------------
1 : One
2 : Two
3 : Three
--pairs(revNumArray)----------------------------
One : 1
Three : 3
Two : 2
~~ipairs(numArray)~~~~~~~~~~~~~~~~~~~~~~~~~~
1 : One
2 : Two
3 : Three
~~ipairs(revNumArray)~~~~~~~~~~~~~~~~~~~~~~~~~~

기타 :
실제 benchmark 해본 결과 ipairs보다 pairs가 더 빨랐다는 실험결과도 있음
I'm surprised that (as my colleague pointed out to me), in plain Lua, pairs is faster than ipairs.
http://lua-users.org/lists/lua-l/2009-11/msg01018.html

while 문 써서 array 내용 프린트하기

 local a = {10, 20, 30, 40, 50}  
 local i = 1  
 while a[i] do  
      print(a[i])  
      i = i + 1  
 end  

Table Constructors

다음 두 줄은 동일.
a = {x=1, y=2}
a = {}; a.x=1; a.y=1

여러 줄의 String 정의 쉽게 하는 법

 local str = [[  
 My name is  
 Mimi  
 How are you?]]  
 print(str)  
키워드 : string definition

Lua의 Logical Operators

Lua에서는 false 와 nil 을 false 로 간주하고
그 외의 것은 모두 true 로 간주한다.

다음 두 코드는 동일
 x=x or v  
 if not x then x = v end  
or는 true의 조건에 걸리는 첫 argument 를 리턴
and는 true의 조건을 만드는 마지막 argument 를 리턴
 print(nil and 10) --> nil  
 print(3 and 4) --> 4  
 print(nil or 7) --> 7  
 print(6 or 7) --> 6  

Wednesday, May 2, 2012

ipairs

ipairs 는 basic Lua library 가 제공하는 iterator
 local a = {10, 20, 30, 40, 50, 60, 70, 80, 90}  
 -- print all values of array 'a'  
 for i,v in ipairs(a) do print(v) end  
자매품으로 pairs 가 있음 : pairs vs ipairs

Loop 사용시 주의점

You should never change the value of the control variable: the effect of such changes is unpredictable.
(Programming in Lua, Second Edition - 2006 - by Roberto Ierusalimschy, p32)

Loop example : find a value in a list

 local a = {10, 20, 30, 40, 50, 60, 70}  
 local found = nil  
 for i=1,#a do  
      if a[i] == 30 then  
           found = i  
           break  
      end  
 end  
 print(found)  

Tuesday, May 1, 2012

Loop

 local i = 1  
 while i < 10 do  
      print(i)  
      i = i + 1  
 end  
 local i = 1  
 repeat  
      print(i)  
      i = i + 1  
 until i >= 10  
 for i=1, 9, 1 do  
      print(i)  
 end  

global variable 과 local variable

global variable 과 local variable 은 각각 다음과 같이 정의한다.
 a = 10 -- global variable  
 local b = 20 -- local variable  
Lua 에 많이 쓰이는 syntax
 local foo = foo  
이 코드는 global variable 인 foo 의 값을 local variable 인 foo 에 넣는다.

do ... end 블록을 쓰면 local variable 의 범위를 직접 컨트롤 할 수 있음

Lua 의 Multiple assignment 를 이용한 swap

 local x = 10  
 local y = 20  
 x, y = y, x  
 print("x=" .. x)  
 print("y=" .. y)  

multiple assignment

 a, b, c = 1, 2  
 print(a, b, c) --> 1 2 nil  
   
 a, b = a+1, b+1, b+2 -- value of b+2 is ignored  
 print(a, b) --> 1 2  
   
 a, b, c = 100  
 print(a, b, c) --> 100 nil nil  

Record 정의하는 general 한 방법

사실 모든 record 는 다음 syntax 의 syntactic sugar에 불과하다
{[멤버명]=값, [멤버명]=값, ...}
 days = { [0]="Sunday", "Monday", "Tuesday", "Wednesday",  
                "Thursday", "Friday", "Saturday"}  
 print(days[0])  
 print(days[1])  
{x=0,y=0} 는 {["x"]=0,["y"]=0} 와 동일하다.
{"r","g","b"} 는 {[1]="r",[2]="g",[3]="b"} 와 동일하다.
키워드 : Constructor

Record 정의하는 좀더 general 한 format

 colors = {  
                     ["Red"] = "FF0000",   
                     ["Green"] = "00FF00",  
                     ["Blue"] = "0000FF"  
           }  
 print(colors.Red)  
키워드 : Constructor

complex data structure 만들기 예

 polyline = {color="blue", thickness=2, npoints=4,   
                                     {x=10, y=0},   
                                     {x=20, y=1},   
                                     {x=-30, y=2},   
                                     {x=-40, y=3}   
                  }   
                    
 print(polyline[2].x) --> 20  
 print(polyline[4].y) --> 3  
 print(polyline.color) --> blue  
키워드 : Constructor

string concatenation in Lua

a = "Hello"
print(a .. " World") --> Hello World

operand 가 수이면 자동으로 그것을 스트링으로 convert 한다.
print(3 .. 4) --> 34

# operator (length of a string 을 얻어냄)

 a = "hello"  
 print(#a) --> 5  
 print(#"good\0bye") --> 8  
키워드 : length operator

type()

 a = 10  
 print(type(a)) --> number  
 a = "a string!!"  
 print(type(a)) --> string  
출처 : Programming in Lua, Second Edition - 2006 - by Roberto Ierusalimschy

Assert 사용하기

 n = assert(io.read("*number"), "invalid input")  
 n = io.read()  
 assert(tonumber(n), "invalid input: " .. n .. " is not a number")  

나쁜 코드: 스트링 관련

   -- WARNING: bad code ahead!!  
   local buff = ""  
   for line in io.lines() do  
   buff = buff .. line .. "\n"  
   end  
Despite its innocent look, that code in Lua can cause a huge performance penalty for large files...

This problem is not peculiar to Lua: Other languages with true garbage collection, and where strings are immutable objects, present a similar behavior, Java being the most famous example. (Java offers the structure StringBuffer to ameliorate the problem.)

출처 : 11.6 – String Buffers

스트링 입력 받아 수로 바꾸기

 line = io.read() -- read a line  
 n = tonumber(line) -- try to convert it to a number  
 if n == nil then  
      error(line .. " is not a valid number")  
 else  
      print(n*2)  
 end     
키워드 : input, string, number, 숫자
출처 : Programming in Lua, Second Edition - 2006 - by Roberto Ierusalimschy

Factorial Sample : input 얻어내기, function 호출, recursion

  function fact (n)   
    if n == 0 then   
       return 1   
    else   
       return n * fact(n-1)   
    end   
  end   
     
  print("enter a number:")   
  a = io.read("*number")   
  print(fact(a))   
키워드 : 입력, 함수, 재귀, recursive call
출처 : Programming in Lua, Second Edition - 2006 - by Roberto Ierusalimschy