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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

수요일의 FAQ 5 번째 시간

2012. 5. 21. 06:58 | Posted by 솔웅


반응형

FAQ Wednesday #5


Question 1

Lua File System(LFS)를 추가하셨죠? /Documents directory 에서 파일 리스트를 얻으려면 어떻게 해야하죠?

Answer

Lua File System은 Corona build 2012.805 에서부터 추가됐습니다. 여기에서 튜토리얼을 읽어보실 수 있습니다.

LFS는 subdirectory도 만들고 지우고 접근할 수 있게 됐습니다. 구현은 디렉토리의 path를 담은 string을 만드는게 key 입니다. iOS와 Android에서는 3개의 main directory들이 있습니다. Resource, Temporary 그리고 Documents 가 그것입니다. 이것들은 Corona constant들을 사용해서 접근하게 됩니다. userdata constants들은 LFS에서 사용될 수  있으려면 string으로 변환 될 필요가 있습니다. system.pathForFile 는 userdata constant 로 변환 됩니다. (string 타입으로). 여러분은 base directory와 함께 파일이나 디렉토리명을 명시해주시면 됩니다. 그러면 그것은 전체 경로를 return 하게 됩니다.

local path = system.pathForFile( "data", system.DocumentsDirectory )

위 코드는 다음과 같은 string을 return 할 겁니다. “/var/mobile/Applications//Documents/data”



아래에 file들 리스트를 LFS로 어떻게 출력되게 하는지에 대한 코드가 있습니다.


local lfs = require "lfs"

-- Print the files in the path
--
local function printDir( path )
    print( "\nFiles in path: " .. tostring( path ) )
 
    local pathType = ""
 
    -- Check to see if path exists
    if path and lfs.attributes( path ) then
        pathType = lfs.attributes( path ).mode
    end
 
    if pathType == "directory" then
        for file in lfs.dir( path ) do
            local str

            -- Skip the current and up-one directories
            if "." ~= file and ".." ~= file then
                str = file

                local fileAtr = lfs.attributes( path .. "/" .. file )
                if fileAtr then
                    str = str .. " --> (" .. fileAtr.mode .. ")"
                else
                    str = str .. " --> (none)"
                end

                print( str )
            end
        end
    else
        str = "Path is not a directory!"
        print( str )
    end
end


그리고 아래는 /Documents directory와 /Documents/data subdirectory 를 어떻게 불러서 출력하는지를 보여 줍니다. (만약 존재한다면)

path = system.pathForFile( nil, system.DocumentsDirectory)
printDir( path )
path = system.pathForFile( data, system.DocumentsDirectory)
printDir( path )


위 코드는 파일 이름들을 출력하는 대신 table(배열)에 담아서 활용할 수도 있을 겁니다.


Question 2


Resource 디렉토리의 파일에 접근을 시도할 때 warning과 error를 하나씩 받았습니다. 이거 버그인가요?


Answer

system.pathForFile 를 사용하고 베이스 디렉토리가 system.ResourceDirectory 일때  코로나는 file이 존재하는지 살펴보고 그 path에 대해 nil 값이 받아지면 warning 메세지를 발생시킵니다. 그런데 이것은 filename 파라미터가 실제로 디렉토리 이름이면 작동하지 않습니다. 이것을 이용해서 다음과 같은 트릭을 쓰기도 합니다. 

local path = system.pathForFile( nil, system.ResourceDirectory )


이렇게 하면 warning 메세지를 발생하지 않습니다. 그리고 Resource directory를 가리키는 string을 return 하죠. 이 Resource directory 밑에 subdirectory 의 경로를 생성할 필요가 있으면 다음과 같이 이것을 append 하시면 됩니다.

path = system.pathForFile( nil, system.ResourceDirectory)
printDir( path )
path = system.pathForFile( nil, system.ResourceDirectory) .."/".."data"
printDir( path )

Note : system.ResourceDirectory는 안드로이드에서는 Resource directory가 실제 file system의 일부분이 아니기 때문에 작동하지 않습니다.

그리고 Resource directory는 read-only 디렉토리라서 write 할 수 없다는 것도 기억하세요.


Question 3

single touch app에 Multitouch 세팅하기

Answer

이건 질문은 아니지만 하나의 tip으로서 알려드립니다. 코로나에서 디폴트는 multitouch off 입니다. 이 말은 touch listener 가 있다면 한번에 하나의 touch 이벤트를 받는 다는 말입니다. 만약에 유저가 스크린을 터치하고 있는데 다른 손가락으로 버튼을 tap 한다거나 다른 객체를 move 하면 아무 일도 일어나지 않습니다. 왜냐하면 이미 다른 touch 가 active 돼 있기 때문이죠. 이것은 landscape 모드에서 유저가 손가락을 스크린에 대고 있느라고 자주 발생할 수 있는 현상이죠.

해결 방법은 여러분 코드에 아래와 같이 구현하는 겁니다.

system.activate( "multitouch" )

이렇게 하면 스크린에 손가락으로 하는 모든 touch에 touch event를 발생할 겁니다. touch 리스너를 걸어놓은 객체를 터치하지 않는 이상 아무일도 발생하지 않을 겁니다. 그리고 리스너가 있는 객체를 터치하면 동작이 일어나구요. 그렇게 되면 좀 더 user friendly 한 앱이 될 겁니다.


Question 4

iOS에서 앱 아이콘의 badge number를 어떻게 clear 하게 할 수 있을까요?


Answer


Local Notification은 해당 Notification이 일어나면 앱의 아이콘에 badge number를 세팅할 겁니다.(그것은 뭔가 pending 된게 있다는 것을 알리기 위함이죠.) 하지만 이것을 어떻게 clear 시킬 수 있을 까요? 해답은 native.setProperty API에 있습니다.

native.setProperty( "ApplicationBadgeIconNumber", 0 )

이렇게 하면 앱 아이콘에 있는 badge number를 없앨 수 있습니다.

아래 badge를 clears 시키는 Local Notification code 예제가 있습니다.

display.newText( "Setting Local Notification ...", 10, 30 )

-- Options for iOS
local options = {
   alert = "Wake up!",
   badge = 1,
   sound = "alarm.caf",
   custom = { foo = "bar" }
}

-- schedule using UTC (Coordinated Universal Time) time + 60 seconds
local utcTime = os.date( "!*t", os.time() + 60 )
local notification = system.scheduleNotification( utcTime, options )

-- Local Notification listener
local notificationListener = function( event )
   display.newText( "Notification Received " ..  event.badge, 10, 70 )
   native.setProperty( "applicationIconBadgeNumber", 0 )
end

Runtime:addEventListener( "notification", notificationListener )

Note: badge number 가 증가하거나 감소하는것에 대해서 badge 관련된 부분의 documentation에 설명 돼 있습니다. 이것은 애플의 documentation에서 인용한 겁니다. 그리고 그 의미는 여러분이 코드 내에서 그 badge number를 증가시키거나 감소시킬 수 있다는 것이죠. 코드 내에서 여러분이 명시한 badge number는 icon 에 display 되게 됩니다. 이 badge number 를 0으로 세팅하면 badge를 clear(remove) 하게 됩니다.

Local이나 Push Notification은 아직까지 iOS에서만 가능합니다.

Question 5

유저가 스크린을 터치하지 않고 있으면 device가 sleep 모드로 가는데 제가 만든 게임을 하는 동안에는 그 현상이 안 일어났으면 좋겠습니다. 가능한가요?


Answer

Yes, and the solution is one of the “system” APIs that works on both iOS and Android (but not in the simulators).

가능합니다. system API를 이용하시면 iOS와 Android 모두에서 가능합니다. (시뮬레이터에서는 안 됩니다.)

system.setIdleTimer( false )  -- disable device sleep mode

idle timer를 false로 해서 디바이스가 sleep 모드로 가지 않도록 합니다. true로 가면 sleep 모드로 가게 됩니다. 디폴트는 true 입니다. 이것을 false로 하면 디바이스의 배터리가 더 빨리 닳을 수가 있다는 것을 감안해서 사용하시기 바랍니다.

여기까지가 오늘의 Question들 입니다. 여러분에게 유용한 정보가 되었기를 바랍니다.

감사합니다.


반응형


반응형

스페인에서 Corona SDK 대사로 활동하고 있는 Tomas라는 친구가 전 세계적인 Corona 연맹 결성을 제안했습니다. 좀 황당하게 들렸지만 글을 읽어보니 열정이 느껴지네요. ^^



Spain’s Corona Ambassador and owner of Inkubica Labs, Tomas Martinez Buero, is calling on developers around the world to form a Corona Alliance. The Spanish chapter’s first Corona SDK Meetup will be taking place on May 31 in Madrid – don’t forget to register if you’re in the area!


스페인의 코로나 명예대사이자 Inkubica Labs의 owner인 Tomas Martinez Buero는 전세계적으로 코로나 연맹을 결성할 것을 제의했습니다. Spanish 쪽의 첫번째 Corona SDK Meetup이 5월 31일 마드리드에서 열릴겁니다. 근처에 사시는 분은 꼭 register하시는 것을 잊지 마세요.





Inkubica Labs is a software “gamification” company that is constantly improving its platform for edutainment apps, interactive books and serious games. The demand for these kind of apps is so big that we are looking for studios and independent Corona SDK developers worldwide to create a Corona Alliance!


Inkubica Labs은 edutainment apps, interactive books와 게임등을 꾸준히 개발하면서 성장해가는 software “gamification” company 입니다. 이런 종류의 앱들에 대한 수요는 아주 많습니다. 그래서 우리는 전세계적인 개별 코로나 SDK 개발자들이 참여하는 Corona 연맹을 만들기를 원합니다.


Inkubica Labs is the dream of two entrepreneurial Computer Sciences engineers, my partner Oscar Cuenca and I, who think that intelligent production of software can change the world. The name of Inkubica has two meanings: the broader one, that is related to the fact that we incubate business projects based on software, and the more specific one, associated with what we are doing now, “raising the INK into the third dimension.” (We help publishers produce interactive books and edutainment apps around the world.)


Inkubica Labs는 두 기업가 마인드를 가진 컴퓨터 공학들의 꿈입니다. 제 파트너인 Oscar Cuenca와 저는 intelligent 한 소프트웨어 제품이 세상을 변하게 할 수 있다고 생각합니다. Inkubica라는 이름은 두가지 의미가 있습니다. 하나는 더 넓게 라는 의미이고 이것은 소프트웨어분야를 바탕으로 비지니스 프로젝트를 incubate 하겠다는 것과 관련이 있구요. 두번째는 좀 더 specific 한 이란 뜻으로 지금 현재 저희가 하고 있는 “raising the INK into the third dimension.” (잉크를 3차원으로 끌어올리자... 라고 해석하면 될까요???;;)와 관련 돼 있습니다. (우리는 전 세계적으로 interactive book이나 edutainment app 들을 만들어내는 publisher들을 도와주고 있습니다.)


The Inkubica Labs team has very solid experience developing many kinds of software. In 1999, we programed our first mobile applications, starting with WAP when it wasn’t available for mobile! At that time, we were visionaries but we came too early. In 2001, we were expecting to see many mobile devices using 3G with WAP, and we were not the only ones to fail in these predictions. Now, we don’t need to be visionaries to know that this is a big time for mobile apps. And in regards to tablets, that’s a whole new world we didn´t predict 13 years ago!


Inkubica Labs 팀은 다양한 종류의 소프트웨어를 개발한 경험을 가지고 있습니다. 1999년에 우리는 첫번째 모바일 애플리케이션을 프로그래밍 했습니다. WAP을 사용한다는 개념이었는데요. 당시에는 이것이 모부일쪽에 사용되지 않을 때였습니다. 당시 우리는 공상가였을 뿐이지만 그것이 현실화 되는 것은 생각보다 빨리 왔습니다. 2001년 WAP과 함께 3G를 사용하는 많은 모바일 디바이스를 기대했었습니다. 지금은 여러분이 아시다시피 모바일앱이 더이상 공상이 아니라 실제로 큰 시장이 돼 버렸습니다. 그리고 태블릿쪽은 13년전에 우리가 상상하지도 못했던 분야입니다.


So here we are, in our second opportunity to be successful with mobile (and now with tablets too). The first thing we decided was to chose the right partners. After evaluating several tools, frameworks, platforms, etc. we fell in love with Corona SDK, not only because it enables us to code once and have the apps ready for iOS and Android, but also because we found very powerful APIs that help us do complex things very fast. And speed is the key of this market!


이제 우리는 모바일로 두번째 성공할 기회를 맞고 있습니다.(뿐만아니라 태블릿도 있죠.) 첫번째로 우리는 좋은 파트너를 골라야겠다고 결심했습니다. 여러 툴들과 프레임워크들과 플랫폼 등등에대한 검토 결과 Corona SDK 와 사랑에 빠지게 됐습니다. 한번 코딩해서 iOS와 안드로이드에 동시에 빌드할 수 있다는 이유만이 아닙니다. 아주 복잡한 것을 쉽고 빠르게 구현하게 해 주는 아주 powerful한 API도 중요한 이유입니다. 속도(빠른 대응)은 시장에서 가장 중요한 요소입니다.


We want to keep moving with the support and improvements of Ansca Mobile – developing apps with geolocalization, augmented reality, simulations, and QR codes and are very interested in forming a Corona Alliance. The main publishers of the Spanish and Portuguese speaking world have headquarters in Spain, with offices in Brazil, Mexico, Argentina, Chile, Colombia, Portugal, and Peru. Let’s join forces and go for them together! You don’t need to speak Spanish or Portuguese to work with us, but we do ask that you can communicate in English. :-)


우리는 Ansca Mobile의 지원과 꾸준한 성능향상과 함께 나갈겁니다. developing apps with geolocalization, augmented reality, simulations, and QR codes 들은 Corona 연맹의 주요 관심사항들 입니다. 스페인어와 포르투갈어를 사용하는 세계의 헤드쿼터는 스페인에 있습니다. 그리고 지부 사부실은 브라질과 멕시코, 아르헨티나, 칠레, 콜롬비아, 포르투갈 그리고 페루에 있습니다. 들어오셔서 같이 합시다. 우리와 같이 일하기 위해 꼭 스페인어와 포르투갈어를 사용하실 필요가 없습니다. 그런경우 영어로 소통할 수도 있습니다.


If you are interested, just send me an mail to tomas.martinez@inkubica.com.

On May 31, we will be hosting the first Corona SDK Meeting in Spain! Please join us and register here.


관심 있으시면  tomas.martinez@inkubica.com로 메일을 보내주세요. 5월 31일 우리는 첫번째 corona SDK Meeting을 스페인에서 가질 예정입니다. 함께 하시려면  here에 등록해 주세요.


Tomas Martinez Buero, Inkubica Labs


Madrid, Spain


반응형


반응형

피델리티 인베스트먼트에서 후원을 한 MOFILM 2012 텍사스 비디오 콘테스트 당선작입니다.

요즘 이 회사 관련된 프로젝트를 하고 있어서 모바일 웹 만들다가 Content로 들어와서 보게 된 건데요.


재밌어서 공유합니다.


주제가 일상에서 불편한 점들에 뭔가 더 좋은 방법을 생각해 보자라는 것 같습니다.

한국팀도 Best 5 안에 하나 든 것 같네요.



1. A Better Way to Connect



Director: JR Strickland
Producer: Villian, JR Strickland
Cast: Derek Cox, Cecilee Von Rhea



2. A Better Way to Cut Onions



Director: MChristie



3. A Better Way to Fold



Creative/Producer/Editors: Lawrence Chen and Hagan Wong
Director: Lawrence Chen
Actors: Jesse Hsu and Alex Ellinport



4. A Better Way All Day



Director: Shin Seung Hwan
Producer: Jude Chun
Actor: Jo Dong Hyun



5. A Better Way To Start A Day



Director: MChristie
Actor: Ryan Powers



반응형

Kurogo Tutorial 11 - News Module -

2012. 5. 17. 00:07 | Posted by 솔웅


반응형

이번에는 Kurogo의 News Module 을 살펴봐야겠네요. 관련된 일을 받았거든요.


News Module

뉴스 모듈은 RSS feed 로부터 받은 stories/articles 리스트를 보여 줍니다. 그 feed 가 full textual content를 제공한다면 그 article은 모바일에 맞는 포맷으로 유저에게 보여질 겁니다. 만약 그 feed가 full text를 담고 있지 않다면 그 article로 지정된 URL로부터 content를 fetch 하도록 configure 될 수 있습니다. (아래 FETCH_CONTENT 를 보세요.)

General Options

SITE_DIR/config/news/module.ini  안에 뉴스 모듈의 기본 작동에 관해 configure 할 수 있는 몇개의 옵션이 있습니다.

  • MAX_RESULTS (10) - 뉴스 리스트에 보여질 아이템의 갯수 
  • SHARING_ENABLED (1) - news entries에 sharing link를 걸 수 있는지 없는지 지정. 0으로 하면 지정할 수 없도록 함

Configuring News Feeds

news 모듈을 사용하기 위해 우선 여러분의 data로 연결하는 connection을 setup 해야 합니다. 이를 위해서는 2가지를 반드시 세팅해야 합니다.  이 작업을 하기 위해 Administration Module 를 이용하거나 SITE_DIR/config/news/feeds.ini file 에서 곧바로 값을 수정하시면 됩니다.

이 모듈은 multiple feeds를 지원합니다. 각 feed 는 configuration file안의 section에 의해 지정됩니다. 그 section의 이름은 0-indexed number 이어야 합니다 (i.e. 첫번째 feed는 0 이고 두번째 feed 는 1 ...). 아래의 값들이 필요합니다.

  • TITLE 값은 여러분 feed 의 이름을 가르킵니다. 이 이름은 feed를 선택하기 위해 drop down list 했을 때 보여지게 됩니다.
  • BASE_URL은 여러분의 News feed의 url을 세팅하면 됩니다. static file이 될 수도 있고 Web service 가 될 수도 있습니다.




Optional values

  • RETRIEVER_CLASS - data를 get 하기 위해 alternate data retriever  를 세팅할 수 있도록 합니다. 디폴트는 URLDataRetriever 입니다.
  • PARSER_CLASS - DataParser의 subclass로 세팅합니다. 여러분의 데이터 소스가 RSS/Atom 이나 RDF가 아닌 포맷으로 return 될 때에만 바꾸시면 됩니다. 디폴트는 RSSDataParser 입니다.
  • SHOW_IMAGES - feed의 thumbnail 이미지를 보여줍니다. 이미지가 없으면 placeholder image 가 보일 겁니다. 만약에 모든 feed가 이미지를 가지고 있지 않으면 SHOW_IMAGES=0 으로 세팅하실 수 있습니다.
  • SHOW_PUBDATE - 뉴스 리스트에 publish date를 보여 줌. (published date는 detail page에서는 항상 보여 짐)
  • SHOW_AUTHOR - 뉴스리스트에 저자를 보여 줌 (detail page에서는 항상 저자를 보여 줌) 
  • SHOW_LINK - full article에 대한 link를 보여 줌. feed에 introductory paragraph 만을 포함하고 있을 때 유용함. 

Additional Configuration for RSS Feeds

특정 RSS feeds에 대한 옵션들이 있습니다. RSSDataParser 가 디폴트 parser 이면 이것은 대부분의 feed들에 적용이 될 겁니다.

  • CHANNEL_CLASS   RSS channel 에 대해 다른 클래스 이름을 세팅할 수 있도록 해 줌. 여러분은 custom subclass를 생성해서 unique하게 RSS 아이템을 핸들링 할 수 있습니다. 흔히 사용되지는 않습니다.
  • ITEM_CLASS  feed 안에서 각 아이템에 대해 다른 클래스 이름을 세팅할 수 있도록 함. custom matter 안에 custom fields 나 parse fields를 가지고 있는 feed 를 핸들링 할 수 있도록 해 줍니다.
  • ENCLOSURE_CLASS enclosures에 다른 클래스 이름을 세팅할 수 있도록 해 줍니다. enclosures에 대해 custom behavior를 핸들링 할 수 있도록 해 줍니다. 
  • IMAGE_ENCLOSURE_CLASS  image enclosures에 대해 다른 클래스 이름을 세팅할 수 있도록 해 줍니다. 이미지에 대해 custom behavior를 핸들링 할 수 있도록 해 줍니다.
  • REMOVE_DUPLICATES - feed에서 duplicate entry 들을 remove 합니다. (i.e. 같은 GUID를 가지고 있는 아이템).
  • HTML_ESCAPED_CDATA - 1로 세팅하면 content와 description field 에 있는 HTML을 decode 할 겁니다. CDATA block에 wrapping 하기 위해 HTML data를 encode 하면서 feed가 HTML data를 encode 하는데 문제가 생길 경우 on으로 설정할 필요가 있습니다.
  • USE_DESCRIPTION_FOR_CONTENT - 1로 세팅 돼 있으면 description field는 full content로서 사용될 겁니다.
  • FETCH_CONTENT - 1로 세팅되면 Kurogo는 아이템에서 명시된 URL에서 content를 fetch 하는 것을 시도할 겁니다. 그리고 그 content를 extract 할 겁니다.



반응형


반응형

회사에서 해야할 Kurogo 관련 일을 이제 거의 끝마쳤습니다.

JQuery Mobile 쪽을 너무 오래 다루지 않은 것 같아서 지난번 글에 이어서 계속 Tutorial을 정리하겠습니다.


Prefetching pages

여러분 앱의 페이지들을 하나의 큰 템플릿에 보관하는 것 보다 조그만 여러개의 페이지 템플릿(single-page templates)으로 나눠서 보관하는게 더 좋은 생각입니다. 그렇게 하면 페이지의 DOM size를 줄일 수 있습니다.

single-page templates를 사용할 때 DOM에 대해 prefetch pages를 사용하실 수 있습니다. 그러면 유저기 그 페이지를 방문할 때 즉시 서비스를 할 수 있습니다. 페이지를 prefetch 하기 위해서는 link에 data-prefetch 속성을 추가하면 됩니다. JQuery Mobile은 그러면 primary page가 로드된 다음에  target 페이지를 background에서 로드합니다. 그리고 pagecreate event가 trigger 됩니다. 아래 예제가 있습니다.

<a href="prefetchThisPage.html" data-prefetch> ... </a>

여러분이 원하시면 원하시는 대로 linked page에 prefetch를 설정할 수 있습니다. 단지 링크에 data-prefetch 만 추가하시면 됩니다.


또한 $.mobile.loadPage():를 사용해서 프로그램적으로 페이지를 prefetch 하실 수 있습니다.

$.mobile.loadPage( pageUrl, { showLoadMsg: false } );

페이지를 prefetching 하는데에는 또다른 잇점이 있습니다. 유저가 이 prefetch된 페이지를 방문할 때는 Ajax 로딩 메세지를 안 보게 될 겁니다 Ajax 로딩 메세지는 prefetching이 끝나지 않았을 때만 나타날 겁니다.

Prefetching 페이지는 자연스럽게  추가적인 HTTP request를 생성하고 bandwidth를 사용합니다. 그러니까 페이지를 prefetching 하는 것은 자주 방문되는 페이지에 한해 사용하시는 것이 좋습니다. 일반적으로 previous, next 가 많이 사용되는 Photo Gallery 같은데 사용해서 유저가 사진을 보는데 좀 더 빠르게 화면에 표시하도록 만들 필요가 있을 때 사용할 수 있을 겁니다.





DOM size management

animated 된 화면전환을 위해서 화면전환이 일어나는 두 페이지가 모두 DOM 안에 있을 필요가 있습니다. 어쨌든 DOM 에 있는 이전 페이지를 계속 가지고 있으면 브라우저의 메모리를 차지하게 될 것이고 어떤 모바일 브라우저에서는 속도가 저하되거나 crash가 일어날 수도 있을 겁니다.

jQuery Mobile은 DOM에 작게 보관할 수 있는 간단한 메카니즘을 가지고 있습니다. Ajax를 통해서 페이지를 load 할 때마다 jQuery Mobile는 그 페이지를 flag 하고 나중에 그 페이지를 떠 날 때 DOM에서 remove 할 수 있도록 합니다. (기술적으로 말하자면 pagehide event 시 이 일이 일어 납니다.) 만약 유저가 remove 된 페이지를 다시 방문하면 캐쉬에서 그 페이지의 HTML 파일을 retrieve 할 겁니다. 만약 그렇지 않으면 서버에서 refetch 하겠죠. (nested list views 인 경우에는 jQuery Mobile은 필요에 따라 더 이상 관련 없는 nested page를 remove 하게 됩니다.)

multi-page template 안에 있는 페이지들은 이 기능에 영향을 받지 않습니다. - jQuery Mobile은 Ajax 를 통해 로드된 페이지들만 remove 합니다.


Caching pages in the DOM

If you prefer, you can tell jQuery Mobile to keep previously-visited pages in the DOM instead of removing them. This lets you cache pages so that they're available instantly if the user returns to them.


원하시면 이전에 방문했던 페이지를 remove 하지 않고 DOM 에 보관하라고 jQuery Mobile에 지시할 수 있습니다. 그러면 유저가 다시 그 페이지를 방문할 때 빨리 보여줄 수 있겠죠.

To keep all previously-visited pages in the DOM, set the domCache option on the page plugin to true, like this:


방문했던 모든 페이지를 DOM에 보관하려면 domChache 옵션을 true로 세팅하면 됩니다.


$.mobile.page.prototype.options.domCache = true;

특정 페이지만 cache 하시려면 그 페이지의 콘테이너에 data-dom-cache="true" 속성을 추가하시면 됩니다.


<div data-role="page" id="cacheMe" data-dom-cache="true">

programmatically 페이지를 cache 할 수도 있습니다.

pageContainerElement.page({ domCache: true });

DOM caching의 drawback하면 DOM이 아주 크게 될 수 있습니다. 그러면 속도가 느려지거나 어떤 디바이스에서는 저장용량 문제가 발생할 수 있습니다. DOM caching 을 할 때는 이런 부분을 잘 관리하셔야 합니다. 그리고 여러 디바이스에서 충분히 테스트 해 보셔야 합니다.


반응형


반응형


예전에 한겨레신문에서 올렸던 MB 주변 인물 비리를 올린적 있었죠?

제목이 좀 오그라들던데.. 여기 가시면 보실 수 있습니다. 


이번에는 경향신문에서 올렸네요.

MB 측근 비리를 한 눈에 볼 수 있는 인포그래픽이예요.

오른쪽에 약간 짤리는 거 같은데... 전체를 보시려면 여기로 가세요.


요즘 통합진보당이 너무 실망스러운 모습을 보이네요.

그쪽 지지를 접을까 합니다.


그렇다고 가카의 업적을 기리고 거기에 상응하는 포상을 받게끔 해 드리는 일은 멈출수가 없겠죠?





반응형

Kurogo Tutorial 10 - Module 만들기 -

2012. 5. 13. 05:27 | Posted by 솔웅


반응형

이번주 제가 회사에서 할당받은 일이 Kurogo의 Map 과 관련된 것 하고 새 모듈을 하나 만드는 겁니다.

지금 Kurogo Tutorial 을 번역하고 있는데요.

급하게 제가 처리해야 할 일이 생겨서 그 부분 부터 번역을 하고 있는데요.

지난번에 MAP 부분을 정리했고 이번에는 Module 만들기를 정리합니다.


=====================


Writing Modules

쿠로고 프레임워크는 모듈을 기본으로 만들어 졌습니다. 각 모듈들은 유저에게 보여지는 그들만의 데이타 세트와 서비스들을 제공합니다.


The Module Object


각 모듈은 Module object의 subclass 입니다. 대부분의 core logic이 이 클래스에 위치해 있습니다.


  • configuration과 런타임 파라미터들을 수집하는것
  • internal URL들의 생성
  • Authorization


웹에서 유저에게 제공되는 모듈을 만들기 위해서는 (홈 스크린에 나타나던지 그렇지 않던지 간에) 그 모듈은 반드시 WebModule 객체의 subclass 이어야 합니다. 웹서비스로서 native(iOS같은) 앱이나 앱의 AJAX functionality 들이 그 데이터를 사용하도록 만드려면 그 모듈은 반드시 APIModule 객체의 subclass 이어야 합니다.


대부분의 모듈들은 WebModule과 APIModule 모두의 subclass 입니다. 모듈이 이 중 하나의 subclass 이고 다른 하나의 subclass가 아닌 경우도 있을 수 있습니다. 예를 들어 에러 모듈의 경우에는 유저에게 에러를 알려주기 위한 웹 인터페이스인데 API counterpart를 가지고 있지 않습니다.각 모듈들의 WebModule과 APIModule subclass 는 대부분 비슷합니다. WebModule과 APIModule에 관한 자세한 사항들은 아래 링크로 가서 확인하세요.



    The WebModule Object
    The APIModule Object




Module life cycle

request가 한번 만들어지면 loading system은 factory method를 사용해서 어떤 모듈이 load 되어야 결정하고 모듈을 생성합니다. URL은 어떤 모듈이 로드 되고 어떤 페이지가 할당되고 includ 돈 파라미터들을 설정합니다.

url의 첫번째 path component 는 모듈의 아이디 입니다. 이것은 어떤 모듈을 로드할 지를 정할 수 있도록 해 줍니다. factory method는 SITE_DIR/config/ID/ 에서 config 폴더를 찾아봅니다. 그리고 module.ini 파일을 로드하죠. 그 파일 안에서 id 값을 찾고 해당 ID의 module을 로드합니다. 만약 ID property가 없다면 config folder 를 id로 module을 load 할 겁니다.

그 URL에 대한 config folder가 없다면 site.ini에 있는 CREATE_DEFAULT_CONFIG 의 값을 찾아보게 됩니다.

    만약 true 이면 그 ID를 근거로 모듈을 로드하려고 할 겁니다. 그리고나서 모듈이 발견되면 자동적으로 config folder를 생성합니다.
    만약 false면 (디폴트임) 또는 그 ID로 모듈을 찾을 수가 없으면 fail이 일어날 겁니다.

두번째 path component는 (WebModule에 대한) page 입니다. 이것으로 로드할 code path와 template file 을 설정합니다. 만약 가리키는 page가 없으면 그 페이지는 index로 세팅 될 겁니다.

APIModule에 대해서는 이것은 command 입니다. 이 command는 항상 존재해야 합니다. 필요한 id/command URL format의 single exception(예외상황)은 CoreAPIModule을 request 하는 것입니다. CoreAPIModule은 single command (hello) 이고 모듈 아이디가 없습니다.

After instantiating the object, the init method is called. This does several things:
객체를 초기화(instantiating) 하고 나서 init method 가 call 됩니다. 여기에 몇가지가 있습니다.

    - page, args, pagetype, platform 을 포함한 필요한 프로퍼티들을 할당한다.
    - data structure들을 셋업하기 위해 사용되는 initialize() 메소드를 call 합니다. 이 data structure는 inside a page와 outside(예를 들어 federated search 안의 instance에 대한 경우)를 사용합니다.
    - WebModules안에서 initializeForPage() 메소드가 call 됩니다. 이 메소드는 그 모듈 로직에 대한 primary entry point를 보여 줍니다. 특히 그 모듈이 그 페이지 프로퍼티으 ㅣ값에 근거한 다룬 로직을 처리하게 됩니다.
    - APIModules 안에서는 initializeForCommand() 메소드가 call 됩니다. 특히 이 모듈은 command property의 값에 근거한 다른 로직을 처리하게 됩니다.


마지막으로 output은 다음과 같은 것을 generate 됩니다. WebModule은 templatePage 프로퍼티의 값에 근거해 display 할 template을 선택합니다. 초기에는 page property로 셋하지만 좀 더 다이나믹한 template display 를 위해 필요하다면 overridden 할 수 있습니다. APIModule은 모듈 id, API version, command requested, response payload 를 포함한 JSON response를 생성합니다.

Methods to use

모듈 객체에는 많은 메소드가 있습니다. 대부분은 내부적으로 사용됩니다. 그러므로 얘기 나눌 부분은 별로 없습니다. 새로운 모듈을 만들 때 주의해야할 몇개의 메소드가 있습니다. WebModuleAPIModule을 위한 메소드들도 보셔야 합니다.

Accessors

    getArg($key, $default) - Retrieves an argument sent via GET/POST, if the $key is not present, then it will return the value specified in $default

Configuration

configuration data를 로드하기 위한 여러 메소드들이 있습니다. Configuratin은 server locations, urls 그리고 소스코드 밖의 다른 값들 같은 특정 detail 값들을 keep 할 수 있도록 해 줍니다. 각 모듈은 configuration file들의 폴더가 있습니다. primary configuration data 는 module.ini 파일안에 있습니다. pages.ini 모듈 안에 있는 Page data는 필요로 하는 configuration structure를 사용할 수 있습니다. 많은 경우 complex data structure는 다른 파일에 있을 필요가 있을 겁니다.

여러분은 key나 전체 section을 이용해서 값을 retrieve 할 수 있습니다. (배열로서 값을 받을 겁니다.) Module 객체에는 아래 메소드들이 있습니다.

    getModuleVar($key, $section=null, $config=’module’) - Gets a required module variable $key. If you specify $section it will only look in that section. Will throw an exception if the value is not present
    getOptionalModuleVar($key, $default=’‘, $section=null, $config=’module’) - Gets an optional module variable $key. If you specify $section it will only look in that section. If it is not present, $default will be used (empty string by default)
    getModuleSection($section, $config=’module’) returns an array of values in a module section. Will throw an exception if the section is not present
    getOptionalModuleSection($section, $config=’module’) returns an array of values in a module section. Will return an empty array if the section is not present
    getModuleSections($config) - Returns a complete dictionary of sections=>vars=>values for a particular config file. Very handy when you basically want the array structure of an entire file
    getOptionalModuleSections($config) - Like getModuleSections(), but if the config file does not exist it will return false


site configuration (site.ini)에서도 값을 retrieve 할 수 있습니다. 이것들은 모든 모듈에 의해 사용되는 값들입니다. Kurogo 객체의 static methods가 있습니다.

    Kurogo::getSiteVar($key, $section=null) - similar to getModuleVar
    Kurogo::getOptionalSiteVar($key, $default=’‘, $section=null) - similar to getOptionalModule Var
    Kurogo::getSiteSection($section) - similar to getModuleSection
    Kurogo::getOptionalSiteSection($section) similar to getOptionalModuleSection


site string(strings.ini)을 get 하기 위한 또 다른 2개의 다른 메소드들이 있습니다.

    Kurogo::getSiteString($key) - returns a site string. Will throw an exception if not present
    Kurogo::getOptionalSiteString($key, $default=’‘) - returns a site string. Will return $default if not present


User Sessions


    isLoggedIn() returns whether a user is logged in or not (see Authentication)
    getUser() returns a User object of the current user (or AnonymousUser if the user is not logged in)
    getSession() returns the Session object of hte current session.




반응형


반응형

새로 아파트에 들어왔습니다.
그동안 Holiday Inn 에서 출퇴근하다 10일에 이사를 했어요.

새로 인터넷을 신청했는데 17일에나 설치를 해 준다네요.

인터넷 쓸 일이 있어서 집 근처 스타벅스에 와서 인터넷 사용하고 있습니다.


==========================

My Favorite Corona App - Twitter Contest

by ANSCA Inc on Tuesday, May 8, 2012 at 2:15pm ·


We couldn't get enough of all the Twitter love from last week's contest, and this week we're going to up the ante!


지난주 열화와 같은 참여와 성원에 감사드립니다. 이번주도 금주의 콘테스트로 여러분을 찾아 뵙습니다.

 

Tweet us your FAVORITE Corona-built app for a chance to win a 3-month subscription to (or extension of) a Corona Pro license. We'll select two (2) lucky winners at random. If you need some inspiration for great Corona-made apps, check out our showcase: http://developer.anscamobile.com/showcase/Browse_All


Corona로 만든 앱 중에 여러분이 가장 좋아하는 앱을 저희에게 트윗해 주세요. 당첨되신 분께는 코로나 SDK 3개월 무료 이용 권한을 드립니다. (기존 회원은 3개월 연장 시켜 드릴거구요.) 랜덤하게 두분을 추첨할 겁니다. 코로나로 만든 앱이 어떤 것이 있는지 알고 싶으신 분들은 저의 홈페이지의 showcase를 들러 주세요.

http://developer.anscamobile.com/showcase/Browse_All

 





The rules are simple:


규칙은 간단합니다.

  1. Follow @ansca on Twitter.  트위터에서 @ansca를 팔로우하세요.
  2. Like us on Facebook: www.facebook.com/ansca . Facebook에서도 등록해 주세요.
  3. Tweet us your very favorite Corona-made app . 여러분이 좋아하는 코로나로 만든 앱을 트윗해 주세요.

Last day to enter the contest is Sunday, May 13 at 11:59pm PT.


마감일은 미국 태평양 시간(PT)으로 5월 13일 11:59PM 까지 입니다.


Happy tweeting and good luck!


===============================================


여러분들도 많이 참여하시고 행운도 얻으세요...




반응형

Kurogo Tutorial 09 - MAP Module -

2012. 5. 12. 04:06 | Posted by 솔웅


반응형

Kurogo Documentation 을 순서대로 진행을 했는데요. 오늘은 좀 건너 뛰어서 해야겠습니다.

회사에서 갑자기 MAP 과 관련되서 일이 주어져서요.

아직 제대로 파악도 못했는데... 빨리 공부해서 빨리 해결해야 겠습니다.

맵 말고도 한두가지 더 일을 맡았는데 그 중 하나는 Drupal 로 하는 일이예요.

Drupal 도 배워야겠네요...


Map Module TutorialIncluded Modules 안의 Map Module 부분에 있습니다.


===============================


Map Module

이 맵 모듈은 맵에서 여러분들이 찾고 싶은 곳을 찾고 볼 수 있도록 해 줍니다. 장소들은 feed groups, category, subcategory 등에 의해 group 화 될 수 있습니다.




Basic Configuration

Feed Groups

각 feed group 은 center location과 appearance에 의해 base map, characterized 와 연관 돼 있습니다. 여러개의 캠버스들과 feed group들로 구성된 조직을 캠퍼스가 맵을 지역적으로 분리합니다.

Group은 SITE_DIR/config/map/feedgroups.ini file 안에서 configured 돼 있습니다. 거기에는 아래와 같이 적어도 한개의 entry 가 있어야 합니다.

[groupID]
title                = "Title of my map"
subtitle             = "Subtitle of my map"
center               = "42.3584308,-71.0597732"
DEFAULT_ZOOM_LEVEL   = 10


[groupID] 는 짧게 알파벳으로 그룹의 이름을 지어주면 됩니다. 예) “boston”, “newyork”, “daytime”, etc.
title (required) - 이 그룹에 대한 짧은 설명 e.g. “Boston Campus”
subtitle (optional) - title로 부족할 경우 좀 더 길게 설명을 추가할 수 있음
center (required) - latitude, longitude point (위도, 경도). 이 그룹의 center를 나타냄. 쉼표 전 후로 빈공간이 들어가면 안 됨.
DEFAULT_ZOOM_LEVEL (recommended) - 맵을 표시할 초기 zoom 레벨. 대개 0~21 사이의 값을 넣으면 됨. 각 숫자는 아래의 크기를 보여 줍니다.

0: earth
1: hemisphere (반구)
2: multiple continents
3: one continent
4: large country
5: medium-sized country
6: small country or large state
7: small state
8: tiny state
9: metropolitan area + vicinity
10: metropolitan area
11: large city
12: small city
13: town
14: several neighborhoods
15: a few neighborhood
16: neighborhood
17: several blocks
18: a few blocks
19: several buildings
20: a few buildings
21: a building

compliant/tablet 디바이스에서는 디폴트로 구글 맵을 사용합니다. 그리고 basic/touch 디바이스에서는 Google Static Map을 사용합니다. 쿠로고는 또한 compliant/tablet 디바이스에서 ArcGIS JavaScript를 지원합니다. 그리고 basic 디바이스에서 ArcGIS static map 을 지원합니다. 좀 더 자세한 사항은 Advanced Configuration section을 참조하세요.

Data Feeds

각 data feed는 홈스크린이나 캠퍼스에서 유저가 browse 하는 category로서 표현됩니다.

현재 아무 mapping infrastructure를 가지고 있지 않은 사람들을 위해 우리는 Google Earth를 사용해서 feeds를 생성하라고 권장합니다. Google Earth는 맵에 pin을 사용할 수 있도록 하고 결과값을 KML 파일로 export 할 수 있도록 합니다.

feed group에 feed를 add 하기 위해 SITE_DIR/config/map/feeds-GROUP.ini 파일 안에 entry를 생성합니다. (Group은 feedgroups.ini로부터 가져온 그 그룹의 id 입니다.). 각각의 entry들은 다음과 같이 만들어 집니다.

[index]
TITLE            = "Fun Places in Washington"
SUBTITLE         = "These are places I like to check out on vacation"
BASE_URL         = DATA_DIR"/washington.kml"
SEARCHABLE       = 1

index 는 숫자입니다. (0서부터 시작) 이 인덱스는 이 feed의 sort order(정렬순서)를 나타냅니다.
TITLE 은 카테고리 리스트에 보이는 카테고리의 desctiptive name 입니다.
SUBTITLE (optional) 은 title 옆에 붙는 간략한 description 입니다.
BASE_URL (required) 은 데이터 소스의 URL이나 파일의 위치입니다.
SEARCHABLE - 그냥 1로 세팅하세요.
Note: .kml 포맷이 아니라 .kmz 을 사용한다면 엔트리 안에 다음의 것들을 지정하셔야 합니다.

RETRIEVER_CLASS       = "KMZDataRetriever"

쿠로고는 또한 ArcGIS RES API와 ESRI Shapefile 포맷으로 데이터를 지원합니다. 만약 이 포맷을 사용한다면 혹은 data feeds와 base maps를 다른 것으로 바꾸기를 원한다면 Advanced Configuration section을 참조하세요.

User Interface Options

The following options appear by default in SITE_DIR/config/map/module.ini:
아래 옵션들은 SITE_DIR/config/map/module.ini 에서 디폴트로 설정돼 있는 값들입니다.

BOOKMARKS_ENABLED          = 1
MAP_SHOWS_USER_LOCATION    = 1
SHOW_DISTANCES             = 1
DISTANCE_MEASUREMENT_UNITS = "Imperial"
SHOW_LISTVIEW_BY_DEFAULT   = 0

BOOKMARKS_ENABLED - 유저가 위치를 즐겨찾기 하게할 지 말지를 정함
MAP_SHOWS_USER_LOCATION - 유저가 지도에 location marker를 display 하게 할지 말지를 정함. This does not turn off geolocation in general.
SHOW_DISTANCES - 검색된 위치로부터의 거리를 표시할 지 여부를 정함.
DISTANCE_MEASUREMENT_UNITS - either “Metric” or “Imperial”. Metric 이나 Imperial 중에 하나를 선택하면 됨
SHOW_LISTVIEW_BY_DEFAULT - 만약에 단 하나의 캠퍼스만 있다면 map module의 index page는 compliant devices에서 지도를 full screen으로 보여 줄겁니다. 만약 이 값이 1로 세팅돼 있다면 맵 모듈의 index page 는 list view를 보여줄 겁니다. 또한 멀티 캠퍼스라면 파라미터에 상관없이 index page는 list view를 보여 줄 겁니다.   multip

Advanced Configuration

Feed Groups

title, subtitle, center 이외에 각 그룹은 다음과 같은 것들을 지정해 줍니다.

- JS_MAP_CLASS (optional) - JavaScript map을 지원하는 디바이스를 사용하기 위한 base map의 type . Base Maps를 보세요.
- DYNAMIC_MAP_BASE_URL (required if JS_MAP_CLASS is ArcGISJSMap) - base map JavaScript API 가 host 돼 있는 base URL
- STATIC_MAP_CLASS (optional) - JavaScript map을 지원하지 않는 디바이스를 사용하기 위한 base map의 type . Base Maps를 보세요.
- STATIC_MAP_BASE_URL (required if STATIC_MAP_CLASS is ArcGISStaticMap or WMSStaticMap) - static base map service가 호스트 돼 있는 base URL
- NEARBY_THRESHOLD (optional, defaults to 1000) -인근 위치를 검색할 때 사용하는 meter로 된 거리
- NEARBY_ITEMS (optional, defaults to 0) - 인근 검색할 떄 return 되는 item들의 maximum number.값이 0이면 제한이 없음.

Example configuration:

[honolulu]
title                = "Honolulu Campus"
subtitle             = "Our new satellite office that nobody knows about"
center               = "21.3069444,-157.8583333"
JS_MAP_CLASS         = "ArcGISJSMap"
DYNAMIC_MAP_BASE_URL = "http://myhost/MapServer"
STATIC_MAP_CLASS     = ArcGISStaticMap
STATIC_MAP_BASE_URL  = "http://myhost/MapServer"
NEARBY_THRESHOLD     = 1609
NEARBY_ITEMS         = 12



Data Feeds

TITLE, SUBTITLE, BASE_URL 이외에 각 feed 는 아래와 같은 값들을 정해 줍니다.

- MODEL_CLASS - 데이터 소스 타입과 관련된 데이타 모델 클래스. 디폴트는 MapDataModel 임.
- RETRIEVER_CLASS - feed를 위해 사용되는 data retriever class (디폴트가 아니라면). 디폴트는 MODEL_CLASS에 따라 다름. 만약 custom model class를 사용하지 않는다면 이것은 KMZ 파일에만 필요할 것임 (which need KMZDataRetriever).
- SEARCHABLE - 이 데이타 소스가 internal search result에 포함되어야 하는지의 여부를 나타내는 boolean 값. 이 값은 external search engine을 사용한다면 관계가 없음. 디폴트는 false임.
- HIDDEN (optional) - true이면 이 feed는 browsable category의 리스트에 나타나지 않음. 이 기능은 site가 user가 browse 할 수 있는 search results에 표시될 서로 다른 placemarks의 세트를 갖기를 원할 경우 사용될 수 있을 겁니다. 그 placemark의 set는 user가 browse 할 수 있는 search results에 표시될 겁니다.

개별적인 feed 들에 대한 어떤 config 값들의 세트는 서로 연관된 feed group 에서 그 값을 override 할 수 있습니다. 예를 들어 'honlulu' feed group은 검색할 때 인근 1000미터 반경을 찾아 볼 겁니다. 하지만 밀집한 feed 가 있어서 반경 200미터에서만 검색하기를 원합니다. 이럴 경우 NEARBY_THRESHOLD 를 개별적인 feed로 세팅할 수 있습니다. override 할 수 있는 config 파라미터들은 DEFAULT_ZOOM_LEVEL, JS_MAP_CLASS, DYNAMIC_MAP_BASE_URL, STATIC_MAP_CLASS, STATIC_MAP_BASE_URL, NEARBY_THRESHOLD, NEARBY_ITEMS 가 있습니다.


KML/KMZ

KML은 맵 모듈의 디폴트 feed type 입니다. 다른말로 feed config 가 MODEL_CLASS 나 RETRIEVER_CLASS 로 정해주지 않았다면 코로고는 이 feed를 KML 포맷으로 처리할 겁니다.

쿠로고는 KML tags의 subset 만 지원합니다. 쿠로고는 <MultiGeometry>, <Model>, <gx:Track>, <gx:Multitrack>를 제외한 모든 지원하지 않는 tags를 무시할 겁니다. 이럴 경우 Kurogo는 exception을 throw 합니다. 또한 몇개의 태그들은 parse 되지만 UI에서는 보이지 않습니다.

아래 tags 들은 parse 되고 UI에도 나타납니다.

<Folder>
    <name>
    <description>
<StyleMap>
    <Pair>
        <key>
        <styleURL>
<Style>
    <iconStyle>
        <href>
        <w>
        <h>
    <balloonStyle>
        <bgColor>
        <textColor>
    <lineStyle>
        <color>
        <weight>
    <polyStyle>
        <fill>
        <color>
<Placemark>
    <address>
    <name>
    <description>
    <Snippet>
    <Point>
        <coordinates>
    <Polygon>
        <outerBoundaryIs>
        <innerBoundaryIs>
    <LineString>
        <coordinates>
    <LinearRing>


   
아래 tags 들은 parse 되지만 UI에 영향을 주지는 않습니다.   

<Document>
    <name>
    <description>

    <scale> (under iconStyle)


   
좀 더 자세한 사항은 구글의 KML documentation을 참조하세요.

ArcGIS Server

ArcGIS 서버를 사용하려면 feeds-<group>.ini 안의 아래 사항들을 설정하셔야 합니다.

MODEL_CLASS = "ArcGISDataModel"

만약에 service 가 여러 layer를 가지고 있다면 Kurogo는 한번에 한 layer 만 사용합니다. 여러분은 feed 별로 다른 layer 를 할당하셔야 됩니다.

ARCGIS_LAYER_ID = <number>


<number> 는 layer를 나타내는 숫자로 된 ID 입니다. 이 ID를 할당함으로서 feed 별 layer를 지정합니다. sublayer는 현재 지원되지 않습니다.

좀 더 자세한 사항을 보시려면 Esri의 ArcGIS server documentation을 보세요.

Shapefile

To use shapefiles, specify the following in feeds-<group>.ini:
shapefile을 이용하려면 feeds-<group>.ini 안에 있는 아래 내용을 사용하세요.

MODEL_CLASS = "ShapefileDataModel"

network 상에 위치한 Shapefile들은 directory들을 포함하고 있지 않은 sip 폴더에 있어야 합니다. (예: contents 들은 모두 .shp, .dbf, .shx, and .prj 파일들입니다). zipped 된 shapefile들을 사용하려면 ZipArchive 확장자가 PHP에서 사용 가능해야 합니다.

큰 shapefile들은 unzip 되 있고 DATA_DIR의 subdirectory에 locally 저장돼 있을 겁니다. 이런 경우에 BASE_URL은 반드시 확장자 없이 지정되어야 합니다. 예) DATA_DIR”/myshapefile.shp” 와 DATA_DIR”/myshapefile.dbf” 로 구성된 shapefile은 반드시 다음과 같이 지정돼야 합니다.

BASE_URL = DATA_DIR"/myshapefile"

좀 더 자세한 사항을 아시려면 Wikipedia의 Shapefile specification 부분을 보세요.

Configuring Display Options

SHOW_DISTANCES - (optional, defaults to true) item 까지의 거리를 보여줄지 여부
DISTANCE_MEASUREMENT_UNITS - (optional, defaults to ‘Metric’) Imperial (인치, 야드, 마일 등) 이나 Metric (미터 단위) 로 거리를 보여줄 지 여부.
MAP_SHOWS_USER_LOCATION - (optional, defaults to false) 지도에 user의 위치를 보여줄 지 여부.
BOOKMARKS_ENABLED - (optional, defaults to true) true로 세팅돼 있으면, bookmarked 된 entry로의 link 가 나타남. 만약 아무 entry 도 bookmark 돼 있지 않다면 entry 가 bookmark 될 때까지 이 링크는 나타나지 않을 겁니다.

Base Maps

Kurogo의 base 맵은 아래의 configuration과 default rules 를 따릅니다. :

JS_MAP_CLASS 와 STATIC_MAP_CLASS 가 따로 명시돼 있지 않다면 Kurogo는 디폴트로 basic/touch device에 대해서는 Goggle Static Maps를 그리고 compliant/tablet device에 대해서는 Google Maps를 사용할 겁니다.

만약 TATIC_MAP_CLASS 만이 명시돼 있다면 compliant/tablet 와 basic/touch devices 모두 STATIC_MAP_CLASS 가 명시되서 base map 을 사용할 겁니다. JS_MAP_CLASS 만 명시됐다면 basic/touch devices 에도 Google Static Maps 가 적용될 겁니다.

JavaScript base maps (compliant and tablet only)

JS_MAP_CLASS 에 적용 가능한 옵션은 아래와 같습니다. .

Google Maps

Google Map을 (디폴트를 그냥 사용하지 않고) 명시적으로 사용하려면 아래 configuration을 참조하세요.

JS_MAP_CLASS = "GoogleJSMap"



좀 더 자세한 사항은 Google’s Maps documentation을 참조하세요.

ArcGIS Tiled Service Maps

ArcGIS tile server 로부터 tiles 를 얻어서 사용하려면 아래 configuration을 참조하세요.

JS_MAP_CLASS = "ArcGISJSMap"
DYNAMIC_MAP_BASE_URL = "http://..."



ArcGIS Dynamic Service Map으로부터 얻어 사용할 수 있는 추가적인 dynamic layer는 DYNAMIC_MAP_BASE_URL에 배열로 명시해서 base map 의 윗부분에 추가할 수 있습니다.

DYNAMIC_MAP_BASE_URL[] = "http://my.tiled.service/MapServer" DYNAMIC_MAP_BASE_URL[] = "http://my.dynamic.service/MapServer"


DYNAMIC_MAP_BASE_URL의 첫번째 element 는 반드시 tiled service 라야 합니다. 1개만 지정되고 단 1개만 tiled service 라야 합니다.

좀 더 자세한 사항은 Esri’s ArcGIS JavaScript documentation 을 참조하세요.

Static image base maps

STATIC_MAP_CLASS에 사용될 수 있는 옵션은 아래와 같습니다.

Google Static Maps

디폴트를 그냥 사용하지 않고 Google Static Maps를 명시적으로 사용하려면 아래 configuration을 사용하세요.

STATIC_MAP_CLASS = "GoogleStaticMap"



Google Static Maps는 현재 polygon overlay를 지원하지 않습니다.

좀 더 자세한 사항은 Google’s Static Maps documentation을 보세요.

Web Map Service (WMS)

WMS service 에서 images를 사용하시려면 아래 configuration을 이용하세요.

STATIC_MAP_CLASS = "WMSStaticMap"
STATIC_MAP_BASE_URL = "http://..."



overlays를 WMS map에 추가하는 것은 가능하지 않습니다.

좀 더 자세한 사항은 Open Geospatial Consortium’s WMS documentation 을 참조하세요.

ArcGIS exported images

ArcGIS로부터 export된 이미지를 사용하려면 아래 configuration을 이용하시면 됩니다.

STATIC_MAP_CLASS = "ArcGISStaticMap"
STATIC_MAP_BASE_URL = "http://..."



export된 image에 overlay를 추가하는 것은 가능하지 않습니다.

좀 더 자세한 사항은 Esri’s export API documentation 을 참조 하세요.

Map Search

Map search 는 module.ini에서 설정합니다. 만약 이게 설정돼 있지 않으면 Kurogo는 디폴트로 MapSearch 클래스를 사용합니다. 이 클래스는 선택된 feed group 전체를 보게 될 겁니다.

옵션으로 아래 파라미터들이 설정될 수 있습니다.

MAP_SEARCH_CLASS          = "MyMapSearchSubclass"
MAP_EXTERNAL_SEARCH_CLASS = "GoogleMapSearch"



MAP_SEARCH_CLASS 를 사용해서 map module 안에 Searches 를 initiate 할 수 있습니다. MAP_SEARCH_CLASS의 디폴트는 MapSearch 입니다. Search는 modules에 의해 initiate 됩니다. 만약 optional config parameter MAP_EXTERNAL_SEARCH_CLASS 가 다른 클래스로 configure 됐다면 map module은 다른 search class를 사용할 겁니다.

기본적으로 제공되는 GoogleMapSearch 클래스는 Google Places 나 the Google Geocoding service를 사용합니다. Geocoding가 디폴트 입니다. Places를 사용하려면 (구글로부터 API key 를 받았다는 것을 가정하고..) SITE_DIR/config/maps.ini 파일에 아래 configuration을 하세요.

[maps]
USE_GOOGLE_PLACES     = 1
GOOGLE_PLACES_API_KEY = AbCDeFGH123789zzzzzzzzzzzzzzzzzzzxwycbA



Terms of Use for External Providers

Google Maps 유저나 그과 관계된 제품(Kurogo installation에 주요하게 포함돼 있는 제품)을 사용하는 유저들은 이 모든 제품들에 대한 usage 제한에 대해 염두에 두셔야 합니다.

Google Maps/Earth API terms 는 여기에 있습니다.

사용량이 많은 site의 경우 embedded Google Maps 의 최근 변경된 usage limit에 대해 주의하실 필요가 있습니다.


반응형

Kurogo Tutorial 08 - Configuration-

2012. 5. 11. 01:08 | Posted by 솔웅


반응형

Configuration

Kurogo 프레임워크는 조금만 셋업해도 동작할 수 있도록 만들어 졌습니다. 어쨌든 파일위치, 디버깅 정보 그리고 모듈의 기능에 영향을 미치는 모듈 옵션들이나 다른 기능들에 익숙해 지셔야 프레임워크를 잘 활용하실 수 있습니다.

모든 confituration은 .ini 파일들에서 이루어 집니다. 직접 이 파일을 수정하셔도 되고 어드민 모듈에서 수정하셔도 됩니다.

Structure of .ini Files

대부분의 개발자들이나 administrator들은 .ini 파일 구조에 익숙해지셔야 합니다. ini 파일들에 대한 깊은 정보는 PHP 매뉴얼의 parse_ini_file() 함수 부분을 보시면 도움이 되실 겁니다.


Properties

ini 파일에 있는 기본적인 요소는 property 입니다 모든 프로퍼티는 name과 value를 가지고 있습니다. 그리고 그 관계는 = 으로 설정합니다. name은 = 기호 왼쪽에 위치합니다. String 은 큰 따옴표 "" 로 감싸져야 합니다. Constants(상수) 들은 큰 따옴표 바깥쪽에 있을 수 있습니다. Kurogo에서 사용하는 별도의 방법은 {} 를 key name에 사용할 수 있게 한 겁니다.

key1="value"
key2=CONSTANT
key3=ANOTHER_CONSTANT "value"
key4="Using value {key3}"


Sections

Properties may be grouped into arbitrarily named sections. The section name appears on a line by itself, in square brackets ([ and ]). All properties after the section declaration are associated with that section. There is no explicit “end of section” delimiter; sections end at the next section declaration, or the end of the file. Sections may not be nested.

프로퍼티는 임의로 명명된 섹션들의 group 화 될 수 있습니다. 섹션 이름은 해당 라인에 [] (square brackets) 안에 있게 됩니다. 섹션 정의 이후의 모든 프로퍼티들은 해당 세션과 연관이 있는 것들입니다. 그 섹션의 끝을 나타내는 특별한 기호(구분자)는 없습니다. 해당 섹션은 그 다음 섹션 정의 부분 에서 끝납니다. 섹션은 nested 되지 않습니다.

[section]


Comments

세미콜른은 주석의 시작을 의미합니다. 주석은 그 줄의 끝까지 해당 됩니다. 세미콜른이 있는 라인의 내용은 엔진이 무시하고 넘어 갑니다.

; comment text


Configuration files


모듈이 작동할 때 아래 config 파일들이 자동으로 로딩 됩니다.;

- config/kurogo.ini : framework config file. 주요 기능은 active site와 configuration mode를 알려줌
- SITE_DIR/config/site.ini : site configuration file. 모든 모듈이 공유하는 프로퍼티가 있고 기본 환경을 세팅해 줌
- SITE_DIR/config/strings.ini : Strings table. 사이트에서 사용하는 다양한 string들을 포함
- SITE_DIR/config/MODULEID/module.ini : 현재 모듈에 대한 Basic configuration file. disabled status, protected, secure and authorization 을 포함한 모듈과 관련된 프로퍼티들이 있음. 또한 다른 unique 한 다른 module configurable parameters 들도 있음
- SITE_DIR/config/MODULEID/pages.ini : 현재 모듈에 대한 Title/navigation configuration

다른 모듈들은 external data configuration 과 모듈 output 과 formatting을 위한 특정 configuration을 위해 SITE_DIR/config/MODULEID 폴도로부터 파일들을 로드할 겁니다.

Local Files

쿠로고 프레임워크는 로컬 서버 customization을 위해 configuration 파일을 overrid 할 수 있도록 지원합니다. config/kurogo.ini 안에 있는 CONFIG_IGNORE_LOCAL 이 1로 설정되지 않는 한 프레임워크는 각 configuration file이 로드될 때 파일이름이 -local로 된 파일도 같이 로드합니다. 예를 들어 SITE_DIR/config/site.ini 은 SITE_DIR/config/site-local.ini 로 override 될 수 있습니다. ITE_DIR/config/home/module.ini는 SITE_DIR/config/home/module-local.ini로 오버라이드 될 수 있구요. 전체 파일읠 duplicate 할 필요는 없습니다. 오직 -local에서 다르게 작동해야만 하는 부분이 있으면 그 부분만 넣어 주시면 됩니다. 그리고 기본 config에 없는 내용을 -local 에 추가할 수도 있습니다.

These files are ignored by the git version control system and are an excellent place to put sensitive file paths or credentials that should not be part of a public source code repository. It can also aid in deployment since your development machine may use different settings than a production server.

If CONFIG_IGNORE_LOCAL is set to 1, then -local files will be ignored. This is useful if you do not use them and may slightly improve performance.
Configuration Mode

In addition to -local files. There is also an option to include configuration override files by specifying a mode string. This string is like -local but can be set to any value. This will allow you to create multiple versions of configuration files, with slightly different versions of certain values and instantly switch between them. This option is set in the CONFIG_MODE value of config/kurogo.ini These files are not ignored by git.

One use of this would be to create development and production versions of some of your configuration files. You can have SITE_DIR/site-development.ini and SITE_DIR/site-production.ini with differing values for debugging. Then you can set CONFIG_MODE to development or production. If CONFIG_MODE is empty (the default), than no files will be searched. Another example would be to include authorization values for certain modules in a production environment.

Keep in mind that this setting is independent of -local files. -local files will override any option presuming CONFIG_IGNORE_LOCAL is not enabled.

Kurogo has included a series of example -production.ini files to indicate recommended values for production servers
Retrieving Configuration Values

There are a variety of methods that are used to retrieve values from the configuration files. Please see Module Configuration for more information on how to retrieve these values in your module.
Site Configuration

The SITE_DIR/config/site.ini file configures the basic site configuration. It is broken up into several sections
Error handling and debugging

The properties in this section are used during development. Most of them are boolean values (0 is off, 1 is on)

    DEFAULT_LOGGING_LEVEL - See Logging in Kurogo for more information.
    LOGGING_LEVEL[area] - See Logging in Kurogo for more information.
    DISPLAY_ERRORS - Display PHP errors. This can make discovering bugs more easy. You should turn this off on a production site.
    DEVICE_DEBUG - When the framework is running in device debugging mode, you can prepend any framework url with device/[PAGETYPE]-[PLATFORM]/ or device/[PAGETYPE]/ to see that version of the page in your browser. So for example “/device/basic/about/” will show the basic version of the About module’s index page.
    MODULE_DEBUG - Enables debugging information provided by each module. The type of information will vary by module. An example of this is showing the LDAP server used by the People module
    MINIFY_DEBUG - When Minify debugging is turned on, Minify adds comments to help with locating the actual file associated with a given line.
    DATA_DEBUG - Data debugging enables logging and certain output to debug data connections. When turned on, it will log url requests in the error log.
    DEVICE_DETECTION_DEBUG - Show the device detection info in the footer
    PRODUCTION_ERROR_HANDLER_ENABLED - The production error handler will email exceptions to the DEVELOPER_EMAIL address. You should treat exceptions as extraordinary situations that should normally not occur in production environments.
    DEVELOPER_EMAIL - an email address to send exception notices. At this time, it uses the php mail() function so it may not be compatible with all environments.

You should turn the _DEBUG options to off in a production environment and enable the Production Error Handler with an appropriate developer email address.
Site settings

    SITE_DISABLED - When set to 1 this site is disabled. Useful for MultiSite
    SECURE_REQUIRED - When set to 1 then the site will require a secure (https) connection
    SECURE_HOST - Alternate hostname to use for secure (https) connections. If not included it will use the same host name.
    SECURE_PORT - Alternate port to use for secure connections. Typically you should leave it at the default of 443
    LOCALE - Locales are used for date/time formatting. If you wish to use a locale other than the server default, then you should set this. Note that valid values are dependent on the operating system of the server.
    LANGUAGES[] - A list of language priorities. See Localization for more info.
    LOCAL_TIMEZONE - Set this to your environment’s time zone. See http://php.net/manual/en/timezones.php for a list of valid time zones
    LOCAL_AREA_CODE - Set this to your environment’s primary area code
    AUTODETECT_PHONE_NUMBERS - Turn this off to prevent the auto detection of telephone numbers in content. This is primarily only supported in iOS devices at this time.

Modules

    DYNAMIC_MODULE_NAV_DATA - This value determines whether modules can present dynamic data on the navigation home screen. This could include dynamic titles, images or other information. If you are not providing dynamic data, then you should turn off this option. It is off by default. See Dynamic Home Screen Information for more information
    CREATE_DEFAULT_CONFIG - This value determines whether config folders will be automatically created if they don’t exist. This can be convienient for development when you want to populate a config folder with the default values, but should be turned off for production to ensure modules that you don’t use don’t create configuration folders.

Cache

    MINIFY_CACHE_TIMEOUT - The timeout for saving the minify cache. This determines how often to look for new templates or css/js files. It should be set high for production sites.

Analytics

    GOOGLE_ANALYTICS_ID - set this to your google analytics id and the framework will utilize the google analytics server
    GOOGLE_ANALYTICS_DOMAIN - If you use subdomains in your google analytics reporting, set this to the appropriate domain
    PERCENT_MOBILE_ID - set this to your percent mobile analytics id and the framework will utilize the percent mobile analytics server
    STATS_ENABLED - if set to 0 then the internal statistics engine will be disabled
    KUROGO_STATS_TABLE (kurogo_stats_v1) - The name of the table to use for internal statistics gathering
    KUROGO_VISIT_LIFESPAN (1800) - The timeout (in seconds) for tracking visits

Temp Directory

    TMP_DIR - This should be set to your a writable temporary directory. If this entry is blank, it will use the system default temporary directory.

Themes

    ACTIVE_THEME - This is set to the active theme. It should be a valid folder inside the SITE_DIR/themes directory.
    TABLET_ENABLED - If set to 0 then the tablet devices will receive the compliant page type templates.

URL Rewriting and the default page

In the [urls] section you can put a series of values that allow you to map a url to another. Typically this would be if you want to map a module’s url to several possible values, perhaps to maintain historical bookmarks. The entered url will be redirected to the value you specify. For example:

    directory = people would map the url /directory to /people (i.e. the people module)

Take care that you do not create infinite redirect loops.

There is a special case for the DEFAULT url. This is the module that is loaded when users enter your site without a module name (i.e. the root of your site). You can configure this to show a different module depending on the type of device/platform. In the initial setting, users browsing your site from a computer will be presented with the info module and users browsing your site from a mobile device will be shown the home module.

The default option will look for the most specific value when determining which default page to show. You can create entries like such (in uppercase)

        DEFAULT-PAGETYPE-PLATFORM - matches the specific pagetype/platform combination. like DEFAULT-COMPLIANT-COMPUTER or DEFAULT-TOUCH-BLACKBERRY.
        DEFAULT-PAGETYPE - matches all the devices from a particular pagetype. Like DEFAULT-COMPLIANT or DEFAULT-BASIC
        DEFAULT will match any device if a more specific entry is not found

This allows you to customize the front door experience for your users.
Device Detection

See Device Detection for more information on configuration values.
Cookies

    MODULE_ORDER_COOKIE_LIFESPAN - How long (in seconds) to remember the module order customization. In production sites this should be set to a long time, like 15552000 (180 days)
    LAYOUT_COOKIE_LIFESPAN - How long to remember the device detection results for pagetype and platform. In production sites this should be set to a long time, like 1209600 (14 days)
    BOOKMARK_COOKIE_LIFESPAN - How long to remember the saved bookmarks for a user. In production sites this should be set to a long time, like 15552000 (180 days)

Database

The main database connection can be used by a variety of modules for storing and retrieving values. See the database section for specific information on configuration values.
Authentication

    AUTHENTICATION_ENABLED - Set to 1 to enable authentication
    AUTHENTICATION_IDLE_TIMEOUT - Idle Timeout in seconds before users are logged off Use 0 to disable
    AUTHENTICATION_USE_SESSION_DB - If 1 then session data will be saved to the site database
    AUTHENTICATION_REMAIN_LOGGED_IN_TIME - Time in seconds where users can choose to remain logged in even if closing their browser. If this is set to 0 then user’s cannot remain logged in. Typical times are 604800 (7 days) or 1209600 (14 days).

Log Files

    KUROGO_LOG_FILE - The location of the Kurogo log file. This is where all Kurogo log statements will be placed depending on the value of DEFAULT_LOG_LEVEL
    LOG_DATE_FORMAT - Date format for log files
    LOG_DATE_PATTERN - regex pattern of log dates, should match output from LOG_DATE_FORMAT

Module Visibility and protection

Each module contains an configuration file in SITE_DIR/config/moduleID/module.ini. This file contains values common to all modules, as well as module specific values.

    id - The module id to use. By default this will be the same name as the moduleID. You can change this to create a copied module or to use another module’s code at this url.
    title - The module title. Used in the title bar and other locations
    disabled - Whether or not the module is disabled. A disabled module cannot be used by anyone. Use this value for temporarily disabling modules.
    search - Whether or not the module provides search in the federated search feature.
    secure - Whether or not the module requires a secure (https) connection. Configuring secure sites is beyond the scope of this document.

Permanently disabling modules

When CREATE_DEFAULT_CONFIG is set to 0, if you remove a module’s config folder it will be permanently disabled and will not be accessible.
Optional Common Module Settings

    SHOW_LOGIN - By default the login link only appears on the home module. If you wish for it to show up on other modules, you can set this value to 1 on any module you wish to see it. You could also set this to 0 on the home module to suppress its showing.

Home Screen

See Home Module for information on configuring the look and layout of the home screen.
Strings

There are a number of strings that are used throughout the framework to identify the site name the organization it is a part of. These include:

    SITE_NAME - The name of the site. Used in the footer and other places.
    COPYRIGHT_LINK - Link to copyright notice (optional)
    COPYRIGHT_NOTICE - Copyright notice
    FEEDBACK_EMAIL - email address where users can send feedback.

Administration Module

In addition to editing these files, you can use the administration module to manage the configuration. The admin module is located at /admin and does not have an icon on the home screen.

반응형