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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형
Posted on . Written by


애플이 iOS 5.0 을 발표했을 때 나왔던 편리한 기능은 native 트위터 지원이었습니다. 이전에는 그 기능은 유저를 인증하고 tweet 을 post 하기 위해 REST API 를 call 하고 하는 것들은 앱이 처리할 일이었었습니다. 코로나의 트위터 샘플 앱이 하듯이 말이죠.


iOS 5.0 에서는 device setting 에 아예 트위터 credential을 입력할 수 있게 됐습니다. 그러면 Email, SMS, Print 등과 함께 트위터가 Sharing screen 에 나타나게 되죠. 이렇게 함으로서 Twitter 를 관리하기 아주 쉽게 되었습니다. 지난해 12월 말에 저희는 이 native 트위터 기능에 접근할 수 있는 기능을 제공했었습니다.





Using “Native” Twitter


코로나는 native.showPopup() API 를 call 함으로서 iOS 의 built-in Twitter 기능에 접근할 수 있도록 합니다. 이 API call 은 native 인터페이스를 통해 이메일과 SMS 메세지를 보낼때 사용하는 것과 같은 겁니다. 또한 native device의 store 와 rating service들에 접근할 때 사용하는 그 API 이기도 하구요.

코딩은 아주 간단합니다.

native.showPopup( "twitter", options )


여기서 options 는 Lua table로 tweet 을 위해 필요한 정보들 입니다. 사용되는 파라미터들은 아래와 같습니다.

  • image — post 하길 원하는 이미지에 대한 form { baseDir=, filename= }
  • message — a string that prepopulates the message.
  • listener — popup 이벤트를 지원하는 리스너
  • url — post 하고 싶은 URL. URL string들이 올 수도 있음.


message option을 사용하는 가장 기본적인 코딩

local options = {
   message = "Hello Twitter world!"
}
native.showPopup( "twitter", options )


트윗들은 140 글자로 글자 수가 제한돼 있죠. 언제 tweet 이 제한 글자수를 다 채우는지 그리고 유저가 그 트윗을 commit 하거나 cancell 했는지를 알고 싶으면 이 유저의 action을 체크하기 위해 call back handler 를 정의하실 수 있습니다.

local function tweetCallback( event )
   if ( event.action == "cancelled" ) then
      print( "User cancelled" )
   else
      print( "Thanks for the tweet!" )
   end
end

local options = {
   message = "Hello Twitter world!",
   listener = tweetCallback
}
native.showPopup( "twitter", options )

업로드하길 원하는 이미지를 포함 시킬 수도 있습니다.


local function tweetCallback( event )
   if ( event.action == "cancelled" ) then
      print( "User cancelled" )
   else
      print( "Thanks for the tweet!" )
   end
end

local options = {
   message = "Hello Twitter world!",
   listener = tweetCallback,
   image = {
      baseDir = system.DocumentsDirectory,
      filename = "mypic.jpg"
      }
}
native.showPopup( "twitter", options )


마지막으로 그 트위터에 넣을 하나 이상의 URL 들을 포함 시킬 수도 있습니다. 이 링크들은 popup screen에 나타나지는 않을 겁니다. 트윗이 post 될 때 나타나게 되죠.


local function tweetCallback( event )
   if ( event.action == "cancelled" ) then
      print( "User cancelled" )
   else
      print( "Thanks for the tweet!" )
   end
end

local options = {
   message = "Hello Twitter world!",
   listener = tweetCallback,
   url = { "http://coronalabs.com", "http://apple.com" }
}
native.showPopup( "twitter", options )


이제 여러분 앱은 전달될 트윗을 popup screen 을 통해 보여줄 겁니다. 여기서 유저는 send 하거나 cancel 할 수 있습니다. iOS 가 이메일이나 SMS 메세지를 처리하는 것과 비슷한 과정입니다.


이 native 기능은 iOS 5.0 이상의 버전에서만 작동하는 것을 잊지 마세요. 코로나에서는 Daily Build 990 부터 가능합니다. 이 기능은 아직 안드로이드에서는 지원되지 않습니다.


반응형


반응형

지난 일요일 부터였던거 같애요.

여긴 월요일에 President's Day 라서 여유롭게 3일간의 연휴를 즐기고 있었죠.


그리고 뒹굴뒹굴하다가 인터넷으로 블로그 들어와 보니 조회수가 장난이 아닌거예요.

어제는 급기야 만명 가까이 방문자가 있었네요.


유입로그를 보니 갑자기 박근혜 와 최태민으로 검색해서 들어온 방문자가 급중한거예요.




제 블로그는 Cross Platform Mobile 프로그래밍과 관련해서 글을  올리는 곳인데..

가끈 이런 저런 개인적으로 관심 있는 글도 올리고...


헌데 한달 전에 올렸던 최태민과 박근혜 의 글에 대한 조횟수가 갑자기 늘고 추천수도 마구 올라가는 거예요.


그 글은 단지 박근혜의 이미지가 너무 밀실, 비밀, 음모, 어둠, 검은 과거 뭐 이렇게 어두운거 일색이라서.

그리고 장관이나 비서실 임명 과정을 보더라도 마찬가지로 뭔가 비밀스럽고 어둡게 진행이 되서 거기에 대해서 비판적인 생각을 가지고 있었거든요.

공개된 그리고 여러사람의 노력과 경험이 축적된 공개되고 공식적인 조직이나 프로세스를 활용하지 못하는 박근혜를 봤을 때 그런 식으로 국정을 운영하면 안된다고 판단을 했구요.


그래서 이전부터 비밀리에 비공개적으로 관계된 측근들 보다는 검증되고 공개된 공식적인 조직이나 프로세스를 활용하라는 의미에서 과거 박근혜와 정치, 사회 활동을 같이 해 왔던 최태민과 그 사위와 관련된 기사들을 이용해서 글을 올렸던 겁니다.


한달 전에...



그런데 지난 며칠간 엄청나게 많은 분들이 박근혜 와 최태민이라는 검색어로 제 블로그에 들어오시더라구요.

왜 그런지 찾아 보니까 조웅 목사라는 분의 인터뷰가 유튜브에 올라왔고 그 내용이 박근혜 에 대한 그리고 박정희에 대한 여러 비판적인 주장이고 많은 분들이 그 인터뷰 내용을 보고 계시더라구요. 유튜브 조회수가 쭉 쭉 올라가는 거예요.


급기야는 주요 포털에서 검색어도 1등을 달리고 있고..


엄청난 관심이네요. 첫번째 인터뷰는 3~4일만에 벌써 20만명 이상이 봤구요.

저도 두번의 인터뷰 동영상 모두 봤습니다. (3일 연휴였거든요. ^^)


그 내용을 보고 조금 걱정되는게 있어서 두번째 인터뷰에 제 느낌을 댓글로 올렸습니다.

댓글을 달다 보니까 좀 길어져서 3번에 걸쳐서 올렸는데요. 댓글이다 보니까 글이 세번째 올린거부터 사람들이 보게 되서 내용 전달이 잘 안 될거 같네요.

그리고 유튜브 댓글에는 링크도 못 올리고...


그래서 제 블로그에 다시 정리를 해 보고 싶어서 아래 그 글을 복사해 넣겠습니다.




이 기사도 참조.

"조웅 목사 주장, 지난해 허위사실 판결 받았다" - 오마이뉴스


말씀하시는 내용이 일단 모두 주장이네요. 고소한 내용도 그 주장의 내용을 정리한거구요.

5.16 세력들이 대학생들을 이용해 쿠테타과정에서 활용해려 했다는 것은 조갑제의 글에도 있더군요. (쿠데타 일으키기 위해 학생들을 선동 - 조갑제) 그 이름중에 건국대 정치과 조병규 가 있는 걸로 봐서 이 분이 그 조병규가 맞다면 쿠테타 세력과 주요 정보계통 사람들과의 인맥이있을수 있다는 것은 납득이 갑니다.

하지만 내용들을 보면 fact 보다는 들은 내용들 뿐입니다. 다른 사람들의 말을 들을 때 사람들은 쉽게 자기 나름대로 해석하고 적용하고 또 시간의 흐름속에서 가공되고 과장되는 경우가 많이 있습니다. 즉 의도적으로 거짓을 얘기하지 않더라도 사실과 다를 가능성이 아주 많지요.


취재하시는 분이 이분에게 근거를 대라고 추궁할 필요는 없지만 객관성을 띤 것인지 아니면 개인적인 주장인지는 짚어 줄 필요가 있는 것 같습니다.

저는 박정희,전두환,노태우 등 군사정권 기간동안 초중고를 다녔었습니다. 그 때 철썩 같이 믿었던 우리나라는 민주주의고 정의로운 곳이라는 것에 대한 배신감은 이후 정치적으로 그 세력들을 반대하는 데 아주 큰 영향을 미쳤고 지금도 우리나라의 가장 큰 해결 과제는 부패 세력 청산 새누리당 해체 라고 생각합니다.

얼마전 경향신문에서 [10대, ‘애국’을 말하다] “난 촛불좀비였다” 현장스케치 라는 기사를 봤습니다. 거기서 지금의 청소년이 보수적인 정치 의식을 갖게 된 이유로 "소위 ‘촛불좀비’였어요. 하지만 다른 매체들을 통해 광우병은 공기·물을 통해 전파되지 않는다는 등 진실을 알게 되니 소위 좌파에 대해 극도의 반감이 들었어요" 라고 얘기하드라구요. 사람은 누가 좋아서 지지하기 보다는 누가 싫어서 지지하지 않는 경향이 있는 것 같습니다. 특히 자기가 믿었던 것에 대해서 배신감을 느꼈을 때 그 배신감은 평생의 정치 의식에 영향을 미칠 수 도 있습니다.


이 분의 말은 의도적이든 의도적이지 않던 과장된 부분이 상당히 있을 수 있고 그것을 받아 들이는 일부 사람들은 그 내용을 더 과장되게 해석해서 그것을 사실로 믿어 버릴 수 있습니다. 하지만 나중에 그것이 사실이 아니라는 것을 알게 됐을 때 그 책임을 그것을 주장하고 공유했던 세력에게 전가하고 반감을 가지게 되죠.

저는 친일과 부패의 원흉 박정희를 비판적으로 받아들이는 사람들이 더 많아졌으면 하는 마음입니다. 허구와 과장은 그 반대 상황을 만들어 낼 위험이 더 많습니다.

지금 이 내용으로 인해 국정원의 선거개입 정치 개입이 묻히는게 안타깝습니다. 국가 정보원이 능력이 있다면 이런 사건 터뜨려서 반대세력들의 주장을 한번에 근거없는 무책임한 비방으로 반전시켜서 자신들에게 유리한 환경을 만들어 내는 정보전을 펴지는 않을까요? 이것도 그 공작중의 하나이고 취재하시는 분이나 취재원이나 모두 그 공작에 말려들어가고 있는 건 아닌지 하는 걱정이 듭니다. :)



박근혜 인수위 기간동안 조중동이 아주 비판적인 논조를 보였었죠?

검찰이 노현정, 박상아 등 재벌과 권력층 며느리들을 자녀 부정입학 관련해서 소환한다고 그러구요.

새로운 권력의 출발을 앞두고 기존의 권력들은 기반다지기를 하고 있는 것 같습니다.


국정원은 무엇을 하고 있을 까요? 그리고 미국은... 그리고 북한은...


모두들 무엇인가를 공개적으로든 비밀리에든 진행을 할 겁니다.


이 조웅 목사의 인터뷰 건은 그 내용이 사실이든 아니든... 사실로 믿고 싶든 믿고 싶지 않든...

증명될 수 없는 아니면 증명되기 아주 힘든 내용들로 개인의 주장일 뿐입니다.


이런 내용들에 휘둘려서 초반에 박근혜에 대한 비판 세력들이 무책임한 비난을 남발하는 세력으로 낙인 찍히고 또 이에 동조하던 청소년들이나 젊은 사람들이 나중에 배신감을 느끼고 돌아서지 않을까...

박근혜에 비판적인 세력들이 '양치기 소년'이 돼서 나중에는 진실을 얘기해도 아무도 안 믿어주는 그런 존재가 되지 않을까 걱정되네요.


저는 일단 시작하는 박근혜 정권이 국가 기관의 정치개입 및 정치적인 활동을 못하도록 하고 각 국가 기관들이 본연의 업무에 충실하게 임할 수 있도록 정책을 펴나가게 비판하고 협조할 필요가 있다고 생각합니다. 그리고 박근혜의 공약이었던 경제부문의 민주화에 좀 더 힘을 쏟을 수 있도록 하는게 지금 박근혜를 지지하지 않았던 사람들이 해야 되는 일이라고 생각합니다.


선거에서 지지하지 않는 후보가 됐다고 국민의 한 사람으로서 정치적으로 소망하는 모든 것을 5년동안 포기하고 살 필요는 없지 않을까요?


이번 국정원의 선거개입 부분을 더 확실하게 파헤쳐서 최소한 재발방지의 약속이라도 받아내던가... 다시 고개 드는 검찰의 정치적인 포석을 막고 정치검찰들을 인적청산하도록 하고 하는게 우리나라의 틀을 바로 잡아서 차 후에 다시 후진적인 정치가 반복되지 않도록 하는것 아닐까요?


그러니까 현재로서는 증명하기 힘든 어느 개인의 주장에 에너지를 쏟기 보다는 국정원의 선거개입을 파헤치고 정치검찰을 개혁하는데 에너지를 쏟는게 더 좋지 않을까요?



반응형


반응형
Posted on . Written by



오늘의 guest tutorial 은 Ingemar Bergmark이 제공합니다. 그는 Corona Enterprise 개발자 입니다. 유닉스 세계에서 Informix와 Oracle을 사용한 DBA/Systems Analyst 경력을 갖고 있고 25년간 프로그래밍을 해 오고 있습니다. 그는 그의 첫번째 컴퓨터인 Sinclair ZX-80 와 더불어 프로그래밍의 세계에 흥미를 갖기 시작했습니다. 10대 초반에 게임 개발에 관심을 갖기 시작했었고 Hercules Graphics Card 가 나오고 부터는 그의 친구들을 위해  graphics SDKs 들을 만드는데 재미를 붙였었습니다.  최근에 그는 게임 개발 세계에 그의 venture 기업을 만듦으로서 발을 본격적으로 발을 들여 놨습니다. 그는 한국 시흥의 독립 스튜디오인 Swipeware의 owner 입니다. 그의 웹 사이트인 www.swipeware.com에 가시면 좀 더 자세한 내용을 보실 수 있습니다.

여러분 앱에서 직접 여러분의 custom extension을 가지고 이메일의 첨부를 열어 보고 싶지 않으세요? 오늘의 튜토리얼은 어떻게 iOS build settings 을 하고 여러분 앱의 documents 디렉토리에 파일을 보내고 그 파일의 path를 구하기 위해 launchArgs URL을 사용하는 방법을 코로나로 어떻게 하는지에 대해 설명 드리겠습니다.





1. Register the Extension in build.settings



첫번째로 여러분의 extension을 build.settings 의 plist section 에 register 시켜야 합니다. 그 안에 두개의 table들이 있게 될 텐데요. 그 테이블 안에는 여러 파라미터들이 들어가게 될 겁니다.

    CFBundleDocumentTypes 은 여러분의  custom extension 을 정의합니다.
    UTExportedTypeDeclarations tells iOS about your custom extension so that other apps (like Mail) will present the option to open the file in your app.
    UTExportedTypeDeclarations는 iOS 에게 여러분의 custom extension에 대해 알려 줍니다. so that other apps (like Mail) will present the option to open the file in your app.

아래 예제에서는 “wxyz“ 라는 custom file extension을 register 합니다. build.settings modifications를 보세요.


settings =
{
orientation =
{
default = "portrait",
supported = { "portrait" }
},
iphone =
{
plist =
{
UIStatusBarHidden = false,
UIPrerenderedIcon = true,
UIApplicationExitsOnSuspend = false,
CFBundleDocumentTypes =
{
{
CFBundleTypeIconFiles =
{
"doctype-hires.png",
"doctype.png"
},
CFBundleTypeName = "wxyz File",
CFBundleTypeRole = "Viewer",
LSHandlerRank = "Owner",
LSItemContentTypes =
{ "com.mycompany.myapp.wxyz" }
}
},
UTExportedTypeDeclarations =
{
{
UTTypeConformsTo =
{
"public.plain-text",
"public.text"
},
UTTypeDescription = "wxyz File",
UTTypeIdentifier = "com.mycompany.myapp.wxyz",
UTTypeTagSpecification =
{
["public.filename-extension"] = "wxyz",
["public.mime-type"] = "myapp/wxyz"
}
}
}
}
}
}



CFBundleDocumentTypes table과 그 안의 파라미터들을 한번 살펴 보죠.

    CFBundleTypeIconFiles — document icon으로 사용 될 이미지 파일의 이름을 담고 있는 string의 배열. 이 이미지들의 사이즈와 specification에 대해 좀 더 자세히 알고 싶으시면 여기에서 Apple의 가이드라인을 확인하세요.
    CFBundleTypeName — document type 에 대한 "abstract" 이름, type을 표현함. key 가 있어야 함. 예를 들어 위 예제에서는 “wxyz File“ 을 사용하고 있음
    CFBundleTypeRole — 그 type에 대한 앱의 role 을 설정함. 이 값은 Editor, Viewer, Shell 이 되거나 아무것도 안 올 수 있음. 이 key 는 필요하고 우리는 이것을 Viewer 로 설정할 것임.
    LSHandlerRank — 이 타입을 사용하는 파일들이 어떤 성격의 것들인지 알리기 위해 사용합니다. 사용할 수 있는 값으로는 Owner, Alternate, None 등이 있습니다.  예제에서는 Owner 를 사용합니다. 이 앱이 이 타입의 파일을 생성하는 앱이라는 것을 나타내기 위해서요.

    LSItemContentTypes — an array of strings; each one must contain a UTI (Uniform Type Identifier) defining a supported file type. For a detailed description of UTI concepts, please refer to Apple’s guidelines here. In this case, we specify the app’s bundle identifier plus our desired file extension of .wxyz.
    LSItemContentTypes - string 으로 구성된 배열. 각각은 지원되는 파일 타입을 정의하는 UTI (Uniform Type Identifier) 를 반드시 가지고 있어야 함. UTI 에 대한 좀 더 자세한 내용은 애플의 가이드라인을 참조하세요. 우리는 앱의 bundle identifier 와 우리가 사용할 팡리 확장자(.wxyz)를 지정했습니다.



이제 UTExportedTypeDeclarations table과 파라미터들을 살펴 보겠습니다.(complete reference can be found here):


    UTTypeConformsTo - string 들로 구성된 배열. 각 string 은 해당 타입을 confirm 하는 UTI 를 정의하고 있습니다. 이 것들은 custom 파일 포맷이 속한 parent 카테고리들을 표현합니다. 예를 들어 JPEG 파일은 public.image 와 public.data 타입임을 confirm 합니다. 좀 더 자세한 내용은 애플의 문서를 참조하세요.
    UTTypeDescription — An “abstract” user-readable description of this type. 유저가 읽을 수 있는 이 타입의 description. (abstract)
    UTTypeIdentifier — 이 타입과 관련된 UTI. 여기서는 앱의 번들 identifier 와 우리가 사용할 파일 확장자를 가리킴
    UTTypeTagSpecification — 한개 이상의 equivalent type idenrifier 를 정의한 dictionary. key-value 한쌍의 형식으로 이뤄졌음. 이 타입의 파일 이름 확장자, MIME 타입, OSType 코드 그리고 pasteboard type 등이 있음.

   


2. Build Handler Functions

다음으로 여러분 앱에 handler 기능을 build 해야 합니다. 아래 코드들을 잘 살펴 보세요.


-----------------------------------------------------------------------------------------
-- main.lua
-----------------------------------------------------------------------------------------
local launchArgs = ...
local launchFile = "";
local fileName;
 
 
local getDocPath = function(fName)
local f = fName;
local docStart, docEnd = f:find("Documents");
f = f:sub(docEnd+1);
return f;
end
 
 
if (launchArgs and launchArgs.url) then
launchFile = launchArgs.url;
if (string.sub(launchFile, 1, 7) == "file://") then -- handle custom extension
launchFile = getDocPath(launchFile);
else
-- handle URL Scheme / do something
end
end
 
 
-- text for testing
display.newText("File passed to system.DocumentsDirectory:", 10, 50, native.systemFont, 12);
fileName = display.newText(launchFile, 10, 65, native.systemFont, 12);
 
 
local onSystemEvent = function(event)
local eventType = event.type;
local eventURL = event.url;
if (eventType == "applicationOpen") then -- app resumes from background
if (eventURL) then
launchFile = getDocPath(eventURL);
fileName.text = launchFile;
end
end
end
Runtime:addEventListener("system", onSystemEvent);


위 예제는 아주 쌈박한 예제는 아닙니다. 단지 Documents 디렉토리안의 imported file 에 대한 path만 display 합니다. 좀 자세히 살펴 볼까요?

    First, we use … which is Lua syntax that returns a table with arguments passed to your app by the system.
    Following that is a utility function that extracts and returns the path to your file in the Documents directory.
    Next, we check for launch arguments. If the .url passed to the app begins with “file://“, we know that we’re trying to handle a custom extension. The .url part can also be used to handle URL schemes, but that’s explained in a different tutorial here.
    Two display objects are then created for the purpose of showing the path to the file that was imported into the app.
    Since our app can suspend to the background, we need a way to detect when the app resumes with an attachment. This is done by adding an event listener for the system event. The event type we look for is applicationOpen.


위의 코드들을 implement 한 후 모든 setting들을 꼼꼼히 검토해 보세요. 그리고 나서 wxyz 확장자를 갖는 첨부파일을 넣고 여러분에게 이메일을 보내 보세요.


이제 여러분의 device 에서 Mail app 을 여시고 방금 보낸 그 메일을 선택하세요. 그리고 첨부파일을 “tap-and-hold” 하세요. 이제 “Open in” dialog pop-up에서 여러분의 앱 이름을 보실 수 있을 겁니다. 그 리스트에서 여러분 앱을 선택하시면 여러분 앱이 Document directory 안의 파일과 함께 다음 프로세스를 진행하기 위해 열릴겁니다.



What’s Next?


그 다음 작업으로 저는 다른 사람들로부터 받은 데이터(첨부)를 import 할 수 있도록 하고 그 데이터를 parse 한 다음에 SQLite 데이터 베이스에 저장하는 기능을 구현하고 있습니다. 그 기능이 완성되면 사람들이 첨부로 보낸 데이터를 쉽게 여러분 앱에 import 할 수 있도록 하는 기능을 제공하게 될 겁니다. 그 기능이 완료 될 때까지 이 튜토리얼이 코로나에서 이메일 첨부파일에 접근하고 그것을 share 하는 개념을 이해하는데 도움이 되기를 바랍니다.


반응형