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

최근에 받은 트랙백

글 보관함

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    


AppQ


What is AppQ?


AppQ는 Kurogo Mobile Framework 의 하나의 component 입니다. 이것은 모바일 웹 모듈을 iOS 와 Android native application으로 빠르게 porting 해 주는 기능을 하죠. AppQ는 hybrid 앱 시스템입니다. 네이티브 엡 안에 웹뷰로 embedded 된 Kurogo Mobile Web Module들이 있게 되는 것이죠.


AppQ Features


AppQ uses a native navigation stack


  • iOS (and to a lesser extent Android 4.0+) page transitions 들은 아주 독특합니다. 그리고 웹 기술로는 구현하기가 아주 어렵죠.  AppQ 모듈들은 좀 더 나은 user experience를 드리기 위해 다른 hybrid 솔루션들보다 더 native 에 가깝게 느끼도록 설계돼 있습니다.
  • page transition들이 natively 처리 되기 때문에 AppQ 모듈들은 jQuery Mobile이나 Sencha Touch 같은 라이브러리들을 필요로 하지 않습니다. 이러한 large 자바스크립트 라이브러리들은 페이지 load time을 증가시키고 hybrid 앱들의 퍼포먼스를 아주 낮추는 영향을 주게 됩니다.


AppQ modules can co-exist with native Kurogo-iOS and Kurogo Android modules


  • native와 AppQ 모듈들을 쉽게 mixing 하고 matching 하도록 함으로서 여러분들은 기능적인 면에 좀 더 집중할 수 있게 됩니다. 쿠로고 모듈들이 native 에 fully implementation 되도록 AppQ 가 도와드립니다.


AppQ modules use templates customized for each native platform


  • AppQ leverages the Kurogo Mobile Web’s template inheritance system to allow you to customize your UI elements for each native platform.
  • Stock Kurogo Mobile Web templates are already customized for the native platforms.


AppQ modules store CSS, Javascript and images inside the native app
(AppQ 모듈은 native 앱 안에 CSS, Javascript, 이미지등을 저장합니다.)


  • 이렇게 함으로서 페이지 로딩 시간과 네트워크 bandwidth use를 절감시킬 수 있습니다.
  • 여러분의 native app 에 이런 파일들을 포함시킴으로서 이 앱을 시작할 때 일반적인 모바일 웹 보다 좀 더 빠르게 로딩할 수 있도록 해 줍니다.
  • 여러분의 모바일 웹 UI를 업데이트 할 때 native 앱들은 모듈 파일들의 new version들을 다운로드 할 겁니다.


AppQ 1.0 Technical Capabilities and Limitations


어떤 Kurogo Mobile Web module 이라도 AppQ 모듈이 될 수 있습니다. 여러분이 웹 모듈로 만들 수 있다면 AppQ 모듈로도 만들 수 있습니다. 웹 모듈과 마찬가지로 AppQ 모듈들은 Kurogo Mobile Web server 로부터 live content 를 display 합니다. AppQ 는 아직까지 여러분의 native 앱이 offline viewing 을 위한 저장이나 cache 작업을 충분히 지원하지는 못합니다.


1.0 버전에서는 아래와 같은 기능과 제한이 있습니다.


What AppQ 1.0 can do:


  • Anything a Kurogo Mobile Web module can do, including:
    • Module development with HTML, CSS and Javascript technologies
    • Kurogo Mobile Web theming support

  • Ability to update module look and feel without releasing new versions of the native apps

  • Use custom “native look and feel” assets for common UI elements and built-in Kurogo mobile web templates

  • Access to native UI elements:
    • Navigation bar: can set title, back button title and add a refresh content button
    • Alert dialogs
    • Action dialogs (cancel, optional destructive button, and up to 10 other optional buttons)
    • Share dialog (automatically via Smarty share.tpl template)
    • Native mail composition dialog when user taps on a mailto: link

  • Basic GPS location as provided by HTML5 web engine (navigator.geolocation)

What AppQ 1.0 can’t do:

  • Offline storage
    • Providing AppQ offline storage similar to what is available on fully native apps is a difficult technical and architectural problem
    • HTML5 offline storage is too small for many use cases
    • Access to native storage mechanisms is a difficult technical and architectural problem on Android
      • On Android the APIs necessary for this (web view cache) were introduced in Ice Cream Sandwich (ICS)
        • Currently most devices are on Gingerbread so we cannot require ICS
      • All supported iOS versions can provide this functionality via NSURLCache and CoreData

  • Camera access

  • NFC access

  • Other direct sensor access


Preparing a Web Module for AppQ

대부분의 모듈들은 약간의 작업만 하면 AppQ를 적용할 수 있습니다. 약간의 modification은 필요하죠. 특히 많은 javascript 나 conditional UI display 가 있는 complex 모듈의 경우는 좀 더 작업이 필요할 겁니다.

Telling AppQ about your module pages


AppQ 가 알아야할 여러분의 모듈에 대한 것들 중 하나는 어떤 페이지들이 지원될 것이냐는 겁니다. AppQ는 이 정보를 모듈의 pages.ini configuration 파일에서 가져 옵니다. AppQ가 제대로 작동할 수 있도록 여러분 모듈의 각 페이지들이 pages.ini 에 리스트 되야 합니다.


pages.ini

[index] [detail] pageTitle = "Detail" [search] pageTitle = "Search Results" breadcrumbTitle = "Search"


Locating images and other static assets

AppQ는 웹 모듈에서 사용되는 자바스크립트, css , 이미지 등의 asset을 zip 파일로 빌드합니다.  이런 파일들이 검색되면 모든 템플릿 variable들과 함께 이 파일들은 template에 로드되게 됩니다. 만약 여러분 웹 모듈이 템플릿 variable이 set 됐을 떄 특정 UI element들만 보여준다면 AppQ는 그러한 element들을 찾지 못할 겁니다. 이것을 하기 위해 각 모듈을 initializeForPage() 의 custom version 을 정의할 수 있는데요. 이것은 AppQ에 의해 사용되는 initializeForNativeTemplatePage() 라고 불립니다. 이 기능을 정의할 때 탬플릿 variable들을 세팅하셔야 합니다. 그러면 이미지나 CSS, 자바스크립트 파일까지 포함한 모든 UI element 들이 visible 하게 됩니다.


예를 들어 여기 index와  search 페이지에 에 ellipsizer javascript module을 사용하는 모듈이 있습니다. 그리고 detail page에 share button 을 가지고 있구요.


MyWebModule.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 <?php
 protected function initializeForNativeTemplatePage() {
     // Native template support
     // specify anything that goes into the header or footer here
     // and force the appearance of assets so they get loaded into the template
     switch ($this->page) {
         case 'index':
             // force appearance of section select button
             $this->assign('sections', array(1, 2));
         case 'search':
             $this->addInternalJavascript('/common/javascript/lib/ellipsizer.js');
             break;

         case 'story':
             $this->assign('shareTitle', $this->getLocalizedString('SHARE_THIS_STORY'));
             $this->assign('shareEmailURL', 'dummy');
             $this->assign('shareRemark',   'dummy');
             $this->assign('storyURL',      'dummy');
     }
 }


두번째 옵션은 array 에 있는 파일들을 정해주기 위한 겁니다. 이 옵션은 어떤 asset을 display 하기 위해 많은 code 가 요구 될 때 간단하게 작업할 수 있는 옵션입니다.


MyWebModule.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 <?php
 protected function nativeWebTemplateAssets() {
     return array(
         '/min/g=file:/common/javascript/lib/ellipsizer.js',
         '/common/images/share.png',
         '/common/images/button-email.png',
         '/common/images/button-facebook.png',
         '/common/images/button-twitter.png'
     );
 }


세번째 옵션은 module.ini 파일에 필요한 내용들 입니다. 이 옵션은 여러분의 custom module theme 에 이미지를 add 하고 subclass에서는 add 하고 싶지 않을 때 아주 유용하죠.


module.ini

[module]
title = "AppQ Test"
disabled = 0
protected = 0
search = 1
secure = 0
MAX_RESULTS = 10
SHARING_ENABLED = 1

[native_template]
additional_assets[] = "/min/g=file:/common/javascript/lib/ellipsizer.js"
additional_assets[] = "/common/images/share.png"
additional_assets[] = "/common/images/button-email.png"
additional_assets[] = "/common/images/button-facebook.png"
additional_assets[] = "/common/images/button-twitter.png"

[strings]
help[] = "The news home screen features most recent news across all categories. Click on an individual news item to read the full story. Note that clicking a link within the story will launch your browser. You can share each article using email, Facebook, or Twitter by clicking on the gray arrow button top right."


Javascript global variables


가끔 웹 모듈들은 글로벌 namespace로 variable들을 세팅합니다. 그러면 로딩된 자바스크립트 파일들에서 계속 참조되겠죠.


AppQ-incompatible global variable use


아래 예제를 보시죠. 이 site 는 custom header.tpl을 정의했습니다. 이 탬플릿에는 글로벌 자바스크립트 변수인 myGlobals 가 템플릿 변수의 배열로 정의돼 있구요.


header.tpl

{extends file="findExtends:common/templates/header.tpl"}
{block name="javascript"}
  <script type="text/javascript">
    var myGlobals = {json_encode($globalsArray)};
  </script>
  {$smarty.block.parent}
{/block}


그리고 이 site의 common.js 에서 myGlobals 변수가 참조 됩니다. (파일의 top level 에서)


common.js


var firstGlobal = myGlobals[0];



이런 테크닉은 AppQ 와 같이 사용할 수 없습니다. 왜냐하면 <head> tag 는 비어있고 자바스크립트 파일은 전에 generate 되고 페이지당 content 는 AJAX를 통해서 로드되기 때문이죠. 위와 같은 경우에는 myGlobals 값이 항상 null 일겁니다. 왜냐하면 globalsArray 가 html wrapper 가 generate 될 때 세팅되지 않을 것이기 때문입니다.


AppQ-compatible global variable use


AppQ 는 글로벌 변수의 사용을 모두 막지는 않습니다. key 는 built-in 모듈 함수인 WebModule::addInlineJavascript() WebModule::addInlineJavascriptFooter()를사용해 페이지마다 글로벌 자바스크립트 변수들을 정의하고 WebModule::addOnLoad() 사용해서 common.js 안의 function 을 trigger 해서 그것들을 reference 하도록 하는 겁니다. AppQ는 AJAX call 이 이루어진 이후에 이 자바스크립트 블럭을 있어야 할 위치에 자동으로 옮겨 놓습니다. 그리고 글로벌 namespace 에 선언하게 되죠.


예를 들어 위의 myGlobals variable 를 implementing 하는 AppQ-safe 방법은 header.tpl 를 오버라이딩하는 대신입니다. 우리는 extra 자바스크립트를 모듈의 php 파일에 옮깁니다.


MyWebModule.php


<?php
protected function initializeForPage() {
    parent::initializeForPage();
    $this->addInlineJavascript('var myGlobals = '.json_encode($this->globalsArray).';');
    $this->addOnLoad('myOnLoad();');
}



그리고나서 common.js 의 load 함수 내에 firstGlobal 을 initialize 하죠.


common.js


var firstGlobal = null;
function myOnLoad() {
    firstGlobal = myGlobals[0];
}



Using Native Callbacks


AppQ 는 간단한 작업으로 native 기능을 가능하도록 합니다.


Page Load


페이지 로드시 AppQ는 page title을 set 하고 그 페이지의  navigation stack 에 보여지게 될 back button 의 title을 세팅하게 됩니다. 디폴트로 AppQ는 모바일 웹에서 사용하는 page title과 breadcrumb title을 사용합니다. AppQ에서 다른 이름을 사용하고 싶으면 모듈의 pages.ini  의 nativePageTitlenativeBreadcrumbTitle 를 수정하시면 됩니다.



추가로 AppQ는 navigation bar에 reload button을 추가할 수 있도록 해 줍니다. 이 reload 버튼은 페이지의 content를 reload 할 수 있도록 해 주죠. 이것도 pages.ini  의 nativePageRefresh or programmatically 를 수정해 주시면 됩니다. 그리고 WebModule::setWebBridgePageRefresh() 함수도 사용하시구요.


Dialogs


hybrid 앱에서 유저에게 메세지를 안내하는 방법중이 하나가 dialogs 입니다. 이 dialog 는 top 에 URL을 가지고 있는 자바스크립트 팝업이던지 floating div 이고 native dialog 처럼 보이는 것이 될 겁니다. AppQ 모듈을 좀 더 native 처럼 만들도록 하기 위해 AppQ는 native dialog를 만들수 있는 자바스크립트 함수를 제공합니다.


Alert Dialogs


Alert dialog는 유저에게 기대하지 않은 상황이 초래 됐을 때 무엇인가를 알리기 위해 사용됩니다. 그리고 유저에게 cancel 이라던지 어떤 action을 할것인지를 물어보는 기능이 있을 겁니다.


kgoBridge.alertDialog(title, message, cancelButtonTitle, mainButtonTitle, alternateButtonTitle, statusCallback, buttonCallback)

  • title - (required) A short human readable title (shown in bold on the dialog)
  • message - (optional) A human-readable message (show in regular text below the title)
  • cancelButtonTitle - (required) Title of the button which dismisses the alert and cancels any actions the alert refers to
  • mainButtonTitle - (optional) Title of the primary button
  • alternateButtonTitle - (optional) Title of an alternate button
  • statusCallback - (optional) A callback function which will return an error if the dialog fails to display. The callback should have the following signature:
    • function statusCallback(error, params)
      • error - If there is no error, this will be null. If there is an error, the error object will contain the following properties:
        • code - a numeric code indicating what error occurred
        • title - a short string categorizing the error
        • message - a string describing the error
      • params - (ignored) always null
  • buttonCallback - (optional) A callback function which is called when one of the buttons is clicked. The callback should have the following signature:
    • function buttonCallback(error, params)
      • error - If there is no error, this will be null. If there is an error, the error object will contain the following properties:
      • code - a numeric code indicating what error occurred
      • title - a short string categorizing the error
      • message - a string describing the error
    • params - If there is no error, the params object will contain the following property:
      • button - with a string value indicating which button was tapped. This string may be one of:
        • cancel
        • main
        • alternate



일반적인 상황들을 간략화 하기 위해 아래 두가지 함수를 사용하실 수 있습니다.


kgoBridge.alert(message, responseCallback)


  • message - (required) A human-readable message
  • responseCallback - (optional) A callback function which will be called when the dialog is dismissed. The callback should have the following signature:
    • function responseCallback()


kgoBridge.confirm(question, responseCallback)


  • question - (required) A human-readable message
  • responseCallback - (optional) A callback function which will be called when the dialog is dismissed. The callback should have the following signature:
    • function responseCallback(confirmed)
      • confirmed - true if the user clicked “OK” and false if they clicked “Cancel”.


Action Dialogs


kgoBridge.actionDialog(title, cancelButtonTitle, destructiveButtonTitle, alternateButtonTitles, statusCallback, buttonCallback)


  • title - (required) A short human readable title
  • cancelButtonTitle - (required) Title of the button which dismisses the dialog and cancels the action the alert refers to
  • destructiveButtonTitle - (optional) Title of a destructive action if there is one (e.g. delete data). Button is emphasized or shown in red to warn user.
  • alternateButtonTitles - (required) An array of titles of additional buttons to display. Each button should correspond to a possible non-destructive action the user can take.
  • statusCallback - (optional) A callback function which will return an error if the dialog fails to display. The callback should have the following signature:
    • function statusCallback(error, params)
      • error - If there is no error, this will be null. If there is an error, the error object will contain the following properties:
        • code - a numeric code indicating what error occurred
        • title - a short string categorizing the error
        • message - a string describing the error
      • params - (ignored) always null
  • buttonCallback - (optional) A callback function which is called when one of the buttons is clicked. The callback should have the following signature:
    • function buttonClickedCallback(error, params)
      • error - If there is no error, this will be null. If there is an error, the error object will contain the following properties:
        • code - a numeric code indicating what error occurred
        • title - a short string categorizing the error
        • message - a string describing the error
      • params - If there is no error, the params object will contain the following property:
        • button - with a string value indicating which button was tapped. This string may be one of:
          • cancel
          • destructive
          • alternateN - where N is a number between 0 and the number of alternate buttons minus 1


일반적인 상황들을 간략화 하기 위해 아래 두가지 함수를 사용하실 수 있습니다.


kgoBridge.shareDialog(buttonConfig)


  • buttonConfig - (required) An object with the following properties
    • mail - (optional) a string containing a URL to share something via email (mailto:user@example.com)
    • facebook - (optional) a string containing a URL to share something on Facebook
    • twitter - (optional) a string containing a URL to share something on Twitter


일반적으로 kgobridge.shareDialog() function를 call 할 필요는 없습니다. 그냥 share.tpl 템플릿을 include 하시면 이 함수가 자동으로 call 할 겁니다.


Debug Logging


iOS 에서는 UIWebView 밖의 곳에서 logging message를 표시하는 console을 사용하기 어렵습니다. 이것을 하기 위해 AppQ는 logging function을 제공합니다. 이 함수는  native 앱이 디버그 모드에서 run 할 경우 NSLog()를 통해 Xcode console 로 메세지를 보낼 겁니다.  이 함수는 안드로이드에서도 사용할 수 있습니다.


kgoBridge.log(message)

  • message - (required) A human-readable message to log to the native console


Theming a Module for AppQ


Kurogo Mobile 웹은 stock 템플릿을 위해 native app images 와 styles를 활용합니다. 만약 여러분이 custom UI를 사용한다면 아마 AppQ 에 맞는 어떤 UI theme 을 사용하기를 우ㅝㄴ할 겁니다. 여러분은 모든 native platform에 적용하거나 아니면 특정 platform 에만 적용되는 AppQ 용 theme을 사용하실 수 있습니다. 이것은 모바일 웹에서 phone 브라우저의 서로 다른 type들을 구분하기 위해 사용한 pagetype/platform mechanism을 이용해서 구현할 수 있습니다.



Targeting AppQ devices


특별히 target native app을 하도록 도와주기 위해 AppQ는 세번째 classification type은 "browser" 를 제공합니다. 이것을 이용하면 각 pagetype과 platform 별로 그에 해당하는 브라우저도 구분할 수 있습니다.



예를 들어 아래 여러 CSS 가 있고 그 영향을 받을 device 들이 있습니다.


pagetype - platform - browser   Devices Impacted
common         .css all devices
compliant         .css all phones
tablet         .css all phones
common - android     .css all Android Devices
compliant - android     .css all Android phones
compliant - iphone     .css all iPhones
common - common - native .css AppQ on all devices
compliant - common - native .css AppQ on all phones
tablet - common - native .css AppQ on all tablets
common - android - native .css AppQ on Android devices
common - iphone - native .css AppQ on iOS devices
compliant - android - native .css AppQ on Android phones
compliant - iphone - native .css AppQ on iOS phones
tablet - android - native .css AppQ on Android tablets
tablet - iphone - native .css AppQ on iPad



자바스크립트 파일과 템플릿 그리고 이미지 directory들도 비슷한  naming scheme을 따릅니다.


Debugging AppQ theme problems


AppQ theming에서의 디버깅 문제는 full featured DOM inspector의 제한 때문에 device 에서 하기엔 어려운 점이 있습니다. 다행히도 AppQ 모듈을 디버깅하기 위해 Kurogo Mobile Web server 의 device debugging feature 를 사용할 수 있습니다.



우선 site.ini 파일에서 DEVICE_DEBUG=1이 되어 있어야 합니다. 그 다음 http://localhost/device/compliant-iphone-native/mymodule/로 가셔서 여러분 모듈의 AppQ iPhone module version을 보세요. 그리고 http://localhost/device/tablet-android-native/mymodule/은 모듈의 AppQ 안드로이드 태블릿 버전을 보여줄 겁니다. 이 때 native 앱의 브라우저와 유사한 웹 브라우저를 사용하셔야 될 겁니다. 예를 들어 iOS 와 안드로이드는 Webkit 브라우저를 사용하니까 Safari 나 Chrome 을 사용해서 디버깅 하셔야 됩니다.


AppQ는 native navigation stack 을 제공하기 때문에 AppQ device debugging mode 는 breadcrumb bar를 display 하지 않을 겁니다. 대신에 뒤로 가기 위해 browser navigation arrow를 사용하셔야 됩니다.


이 디버깅 모두는 AppQ에 의해 사용되는 AJAX 페이지 로딩을 simulate 합니다. 왜냐하면 지금 웹 브라우저에서 running 하고 있기 때문에 일반적으로 AppQ에서 가능한 native hooks 들을 implement 할 수 없기 때문이죠. 이들 중 하나를 trigger 하기위해 시도한다면 그 trigger URL을 console.log()  하려고 할 겁니다. 그러니까 어떤 파라미터드이 전달됐는지를 보려면 Web Inspector를 사용하시면 됩니다.


The AppQ Native Asset Zip File


일단 여러분의 모듈이 AppQ를 지원하도록 modify 되면 여러분의 첫번째 asset zip 파일을 빌드하실 수 있습니다. 이 archive 에는 모든 이미지와 CSS 그리고 자바스크립트가 포함 됩니다. 이것들은 퍼포먼스를 개선할 수 있도록 native 내에서 locally cache 되게 됩니다.



Building the Asset Zip File


asset zip 파일을 빌드하려면 Admin panel로 가셔서 왼쪽 메뉴의 Module Configuration을 선택하세요. 그러면 오른쪽에 모듈 이름 다음에 3개의 탭을 보실 수 있을 겁니다. 여기서 AppQ 탭을 선택하세요. iPhone 과 Android 템플릿으로 빌드하기 위한 버튼들을 보실 수 있을 겁니다. 빌드하고 싶은 것을 골라서 클릭하세요. AppQ asset zip 파일이 generate 될 겁니다. 파일 크기에 따라 시간이 좀 걸릴 수 있습니다. 


asset zip files이 모드 빌드 되면 각 버튼 밑에 이미지를 다운 로드 할 수 있는 링크를 보시게 될 겁니다. 이 링크는 다음과 같을 겁니다. http://www.example.com/media/web_bridge/iphone/mymodule.zip. 만약 이 사이트에 tablet theme을 enable 하도록 했다면 AppQ는 같은 asset zip file에 tablet version 도 같이 빌드 할 겁니다. http://www.example.com/media/web_bridge/iphone/mymodule-tablet.zip.


asset zip 파일들을 새롭게 빌드 할 때마다 Kurogo Mobile Web server는 새로운 파일을 다운로드 받으라고 알려 줄 겁니다. 아마 production server에 올릴 수 있도록 용량을 줄이기 위해 여러번 빌드 할 수 있을 겁니다. 그 때 마다 새로운 파일을 다운로드 받으셔야 합니다.


Preloading the Asset Zip File


AppQ asset zip 파일은 여러분의 site의 media 폴더 내의 Kurogo Mobile Web server 에 있습니다. Kurogo Mobile Web server는 native 앱에게 어떤 모듈이 AppQ를 지원하는지 얘기해 줍니다. 그리고 그 앱은 media 폴더에서 그 asset 파일들을 다운로드 받을 겁니다. 이 작업은 매번 asset zip file들이 change 될 때마다 반복될 겁니다. 이 asset zip 파일에 현재 버전을 넣는 다면 유저가 처음 앱을 시작할 때 훨씬 빨리 보여줄 수 있겠죠.


Admin panel은 이 asset zip file들의 copy를 얻을 수 있도록 다운로드 할 수 있는 link 를 제공합니다. 만약 여러분이 tablet 버전을 가지고 있다면 거기에 대한 링크도 있을 겁니다.


iOS (iPhone and iPad)


AppQ asset file은 iOS 에는 프로젝트의 resource 폴더에 있습니다. 아래에 iOS app “MyApp” 과 AppQ 모듈인 “mymodule” 에 대한 asset zip file path example 이 있습니다.

  • Kurogo-iOS/Projects/MyApp/Resources/modules/mymodule/mymodule.zip
  • Kurogo-iOS/Projects/MyApp/Resources/modules/mymodule/mymodule-tablet.zip


이 파일들은 Xcode 폴더 references를 통해서 여러분 프로젝트에 자동적으로 추가 될 겁니다.


Android


아래에 안드로이드 앱 “MyApp” 과  AppQ module “mymodule” 가 있는 경로 예제가 있습니다.

  • Kurogo-Android/site/MyApp/config/modules/mymodule/assets/web_bridge.zip
  • Kurogo-Android/site/MyApp/config/modules/mymodule/assets/web_bridge-tablet.zip


이 위치에 asset zip 파일들이 copy 되면 여러분 프로젝트를 clean 하시고 rebuild 하세요. 그러면 asset들이 여러분 앱에 built 될 겁니다.


Updating an AppQ Module


여러분의 모듈을 업데이트하고 그것을 Kurogo Mobile Web server 에 deploy 할 때마다 여러분은 이 새로운 asset zip file을 빌드할 필요가 있습니다. 그래야 그 zip 파일이 모바일 웹 버전과 일치할 수 있습니다. 현재 존재하는 native app은 new zip file을 다운로드 할 겁니다. 그러니까 여러분은 이미 이전 버전을 사용하고 있는 유저에 대해서는 걱정하실 필요가 없습니다. 일단 Kurogo Mobile Web server를 deploy 하고 난 후에 여러분은 새로운 zip 파일과 함께 여러분의 native 앱의 새 버전을 release 하고 싶어질 겁니다. 그래야 "first launch" experience 에서 새로운 버전의 asset zip file을 다운로드 받는 일이 없을 테니까요. 여러분의 모듈에 이미지가 아주 많이 있지 않다면 zip 파일은 그리 크지 않을 겁니다. 하지만 네트워크 속도가 느리다면 다운로드 시간이 noticeable 하게 될 겁니다.



저작자 표시 비영리 동일 조건 변경 허락
신고

Kurogo Tutorial 24 - People Module -

2012.10.10 21:23 | Posted by 솔웅


People Module



people 모듈은 directory 로 어떤 mobile access 기능을 제공하는 겁니다. 간단한 configuration으로 모바일 device 에서 유저에 대한 searching 과 detail 한 정보 보기 등을 가능하도록 할 수 있습니다. LDAP base directory와 database backed directories 모두 지원합니다.


Configuring the Server Connection



이 모듈의 configuration은 Administration Module 이나 SITE_DIR/config/people/feeds.ini file을 edit 하셔야 합니다. 여러분의 directory 시스템에 connect 하기 위해서는 여러 방법들이 사용될 수 있습니다.


  • RETRIEVER_CLASS allows you to determine the mechanism for retrieving the data. Current options include:
    • LDAPPeopleRetriever - uses a standard LDAP server. You can configure the various fields if your values differ from defaults
    • ADPeopleRetriever - a subclass of the LDAP retriever that has preconfigured mappings for Active Directory
    • DatabasePeopleRetriever - connects to an external database server. This controller assumes that people are mapped to a single row and that the various fields are stored in single (definable) columns
  • PERSON_CLASS allows you to set a different class name for the returned user objects when searching. This class must be a subclass of the Person class. This allows you to write custom behavior to handle the data in your directory service.


Options for LDAPPeopleRetriever and ADPeopleRetriever


  • HOST - should match the address of your server. Keep in mind that this server must be accessible from the web server the framework is hosted on. Managing network and firewall settings is the responsibility of your network administrator.
  • SEARCH_BASE - should manage the LDAP search base of your directory. You can get this value from the administrator of your LDAP directory. Examples would include “dc=example,dc=com”
  • PORT - Optional (Default 389) The port to connect. Use 636 for SSL connections (recommended if available)
  • ADMIN_DN - Some servers do not permit anonymous queries. If necessary you will need to provide a full distinguished name for an account that has access to the directory. For security this account should only have read access and be limited to the search bases to which it needs to access.
  • ADMIN_PASSWORD - The password for the ADMIN_DN account.





다음 값들은 controller에게 searching 할 때 어떤 attributes들을 사용할 것인지를 알려 줍니다. 이 값들은 디폴트값고 다를 경우 사용할 필요가 있을 겁니다.


  • LDAP_USERID_FIELD (uid, samaccountname for AD)- Stores the unique user name for this user. Do not choose an attribute that is sensitive as they are easily viewed by users
  • LDAP_EMAIL_FIELD (mail) - The attribute of the user’s email address
  • LDAP_FIRSTNAME_FIELD (givenname) - The attribute of the user’s first name
  • LDAP_LASTNAME_FIELD (sn) - The attribute of the user’s last name
  • LDAP_FULLNAME_FIELD (blank) - If you wish to use a single field for name (like cn), include this here.
  • LDAP_PHONE_FIELD (telephonenumber) - The attribute of the user’s phone number

Options for DatabasePeopleRetriever


DatabasePeopleRetriever 에는 사용할 수 있는 여러 configuration value들이 있습니다. 모두 optional 이죠. 데이터베이스 connection에 대한 configuration에 대해 자세히 알고 싶으시면 Database Access를 보세요.

만약 이중에 어떤 value 라도 생략되면은 디폴트를 세팅할 겁니다. (Configuring Database Connections)

아래 value는 데이터가 있는 테이블의 위치를 controller에게 알려 줍니다.


  • DB_USER_TABLE - (users) The name of the table that stores the user records. This table should at least have fields for userID, name and email. Each row should contain a single user entry.


아래 값들은 controller 에게 주요 field 에 대한 정보를 줍니다. 이 값들은 디폴트값과 그 값이 다를 경우에 적용되게 됩니다.


  • DB_USERID_FIELD (userID)- stores the userID in the user table. You can use any unique column for the userID field. Do not use sensitive values as they are easily viewed by users.
  • DB_EMAIL_FIELD (email) - stores the email in the user table
  • DB_FIRSTNAME_FIELD (firstname) - stores the first name of user.
  • DB_LASTNAME_FIELD (firstname) - stores the last name of user.
  • DB_PHONE_FIELD (no default) - stores the user’s phone number. If empty then the search will not use the phone number


다른 필드들은 아래 configuring the detail fields 에서 설명됩니다.


Configuring the Detail Fields


서버 세팅이 끝났으면 여러분 서버와 detail view 와의 field mapping을 해야 합니다. 디폴트로는 LDAP으로 세팅 돼 있습니다. 만약에 nonstandard directory를 사용하신다면 혹은 자체 필드들을 가지고 있는 데이터베이스와 연결하신다면 이것들이 어떻게 display 될지에 대해 customize 하셔야 합니다.

이 필드들은 SITE_DIR/config/people/page-detail.ini file 에 configured 됩니다. 각 필드는 섹션별로 configured 됩니다. (섹션 이름은 unique 해야 합니다.) 섹션의 순서는 detail view의 순서와 같습니다. 각 섹션안에는 어떻게 display 될지에 대해 설정할 수 있는 여러 value들을 넣을 수 있습니다.


  • label - (required) A text label for the field. Can include HTML tags.
  • attributes - (required) Array of fields to put in the contents (should map the the field names in your backend system)
  • format - (optional) A string for vsprintf to format the attributes. Only needed if more than one attribute is provided.
  • type - (optional) One of “email” or “phone”. Used to format and generate links.
  • module - (optional) Creates a link to a another module and uses that module’s linkForValue method to format the result. See the section on Module Interaction for more details.
  • section - (optional) If this field belongs to a section, the name of that section
  • parse - (optional) A function which will be run on the value before display. Generated with create_function. Gets the argument “$value” and returns the formatted output.


Configuring Display Options


아래 있는 옵션들은 people 모듈을 appearence 하는데 관련된 것들입니다.

  • BOOKMARKS_ENABLED - (optional) If set to true, a link to bookmarked entries will appear. Note that if you have not bookmarked any entries, this link will not appear until an entry is bookmarked. Defaults to true.
  • CONTACTS_SUBTITLE_NEWLINE - (optional) Set to true to display contacts subtitles on a new line. Defaults to false.
  • SEARCH_TIP - (optional) A string to be shown near the search bar providing a tip about searching. By default this string is empty, and not shown.


Configuring the Fixed Entries


이 모듈은 모듈 인덱스 페이지에서 directory entry들의 리스트를 보이게 할 수 있습니다. 그리고 SITE_DIR/config/people/contacts.ini를 수정함으로서 이 리스트의 content를 update 하실 수 있습니다. 각 entry는 섹션의 0-indexed 형식으로 숫자화 되서 다뤄집니다. 각 섹션은 4개의 value들이 있습니다. 이것들은 listItem template 과 매핑돼 있죠. 이것들은 URL 리스트를 표시하기 때문에 phone number 를 가지지 못합니다. 다만 어떤 URL 이라도 올 수 있습니다.


  • title - The Name of the entry as it’s shown to the user
  • subtitle - The subtitle, typically the phone number for phone entries.
  • url - The link it should point to, use tel:XXXXXXXX links for phone numbers
  • class - The CSS class of the item, such as phone, map, email


Creating groups of contacts

  • NOTE - Creation of contact groups is not supported in the admin console at this time.


만약에 여러 contacts 를 카테고리로 묶어야 한다면 여러분들은 그것을 group으로 묶어야 합니다. contact group들을 만드시려면 아래와 같이 하시면 됩니다.


  1. If it does not exist, create a file named SITE_DIR/config/people/contacts-groups.ini
  2. Add a section to contacts-groups.ini with a short name of your group. This should be a lowercase alpha numeric value without spaces or special characters
  3. This section should contain a “title” option that represents the title of the group. Optionally you can include a description value that will show at the top of the contacts list for the group
  4. Create a file named SITE_DIR/config/people/contacts-groupname.ini where groupname is the short name of the group you created in contacts-groups.ini. This file should be formatted like contacts.ini with each entry being a numerically indexed section
  5. To use this group, assign it to a entry in contacts.ini. Do not include a url, but rather add a value group with a value of the short name of the group. You can optionally add a title that will be used instead of the group title indicated in contacts-groups.ini


아래는 SITE_DIR/config/people/contacts-groups.ini의 예제입니다. 각 그룹은 섹션으로 표현되는데 그 안에는 title 이 있고 옵션으로 description 이 있습니다. 여러분이 원하는 만큼의 그룹을 만드실 수 있습니다.


[admissions]
title = "Admissions"


SITE_DIR/config/people/contacts-admissions.ini. 아래는 admissions group의 예제입니다. contacts.ini file과 같은 형식입니다.


[0]
title    = "Admissions Main Number"
subtitle = "(617-555-0001)"
url      = "tel:6175550001"
class    = "phone"

[1]
title    = "Admissions Hotline"
subtitle = "(617-555-0002)"
url      = "tel:6175550002"
class    = "phone"


SITE_DIR/config/people/contacts.ini. 그룹을 보이기 위해 group value가 있습니다. url value는 없습니다.


[0]
title    = "Static Entry 1"
subtitle = "(617-555-0001)"
url      = "tel:6175550001"
class    = "phone"

[1]
title    = "Admissions"
group    = "admissions"


저작자 표시 비영리 동일 조건 변경 허락
신고

Kurogo Tutorial 23 - Links Module -

2012.10.10 03:43 | Posted by 솔웅




========= o ============ o ========== o ========== o ================


이 부분은 Tutorial 이 잘 못 되었네요.


Links 모듈 설명하다가 갑자기 People 모듈로 건너 뛰었습니다.

저 위에 이미지 다음 부터는 people 모듈 관련 내용입니다.


Kurogo 쪽에 얘기해야겠어요... ^^;

저작자 표시 비영리 동일 조건 변경 허락
신고

Kurogo Tutorial 22 - Content Module -

2012.10.10 01:44 | Posted by 솔웅


Content Module


content module은 다른 소스로부터 자유롭게 content를 모으고 display 할 목적으로 만들어 졌습니다. Content Module은 다른 HTML site 나 RSS feed 로부터 display 된 곳으로부터 content를 모아서 display 할 수 있습니다. 또한 configuration file이나 administration module을 사용해서 static content configured 를 display 하도록 할 수 있습니다.

디폴트로 content 모듈은 리스트에 그 feed 를 display 합니다. 그리고 나서 유저가 feed를 선택하면 그 feed 의 content가 보여지게 되는 겁니다. 만약에 feed 가 1개만 있다면 리스트 대신 그 feed 가 보여집니다. 옵션으로 group화 할 수 있습니다.


Configuring Content Feeds


SITE_DIR/config/MODULE/feeds.ini file에 원하는 만큼의 feed 를 정의 하세요. 각 feed 는 section에 의해 표현됩니다. 그 섹션의 이름은 모듈의 page를 의미합니다. 이곳에는 configure 할 몇가지 property들이 있습니다.


  • TITLE - The title of the feed. This is shown in the list and in the navigation bar
  • CONTENT_TYPE - the type of content. Values include:
    • html - Static html text that is included in the CONTENT_HTML property
    • html_url - Fetch HTML content from the BASE_URL property.
    • rss - Fetch RSS content from the BASE_URL property. Will retrieve the content from the first item in the feed. Good for CMS’s that expose their content via RSS. Ensure that this feed contains the full content and not just a link



Creating Groups of Content


  • NOTE - Creation of content groups is not supported in the admin console at this time.

You can create groups of content in order to organize similar content into categories. Creating content groups involves the following steps:

유사한 콘텐트를 하나의 카테고리에 묶기 위해 콘텐트의 group을 만들 수 있습니다. 아래와 같이 group을 생성하시면 됩니다.

  1. SITE_DIR/config/MODULE/feedgroups.ini 파일을 생성한다.
  2. 그룹 이름을 feedgroups.ini 의 section 안에 넣는다. 스페이스나 특수문자가 없는 alpha numeric 소문자이어야 한다.
  3. 섹션에는 TITLE option이 있어야 한다. 이것은 그룹의 title을 나타낸다. 옵션으로 DESCRIPTION value를 넣을 수 있다. 이것은 그룹의 리스트 top에 보여질 내용이다.
  4.  SITE_DIR/config/MODULE/feeds-groupname.ini  파일을 만든다. groupname is the short name of the group you created in feedgroups.ini. This file should be formatted like feeds.ini with each entry being a uniquely indexed section.
  5. 이 그룹을 사용하기 위해 eeds.ini. 안에 entry를 할당한다. 그룹의 short name 값으로 GROUP 값을 넣는다. 옵션으로 TITLE을 넣을 수 있다. 이것은 eedgroups.ini 안에서 group title 대신에 쓰이게 된다.

feeds.ini file에는 groups와 content entry 들이 있을 겁니다. 이것들은 section의 순서대로 display 될 겁니다. 만약 1개의 그룹만이 있다면 그 그룹이 display 될 겁니다.

아래는 SITE_DIR/config/MODULE/feedgroups.ini 예제입니다. 각 그룹은 TITLE이 있는 section 입니다. 여러분이 원하는 만큼의 그룹을 만들 수 있습니다.


[applying]
TITLE = "Applying to Universitas"
DESCRIPTION = ""

[visiting]
TITLE = "Visiting"
DESCRIPTION = ""


SITE_DIR/config/MODULE/feeds-applying.ini.  아래는 applying group 예제입니다. feeds.ini file처럼 format 됐습니다.


[admissions]
TITLE = "Admissions"
SUBTITLE = ""
SHOW_TITLE = 0
CONTENT_TYPE = "html_url"
BASE_URL = "http://universitas.modolabs.com/admissions"
HTML_ID = "node-2"


SITE_DIR/config/MODULE/feeds.ini


[applying]
TITLE = "Applying to Universitas"
GROUP = "applying"

[visiting]
TITLE = "Visiting"
GROUP = "visiting"

[othercontent]
TITLE = "Other Content"
SUBTITLE = ""
SHOW_TITLE = 0
CONTENT_TYPE = "html_url"
BASE_URL = "http://www.example.com/othercontent"
HTML_ID = "html-id"


Options for HTML Content


HTML document에서 data를 추출하기 위해서는 몇가지 옵션이 추가로 있습니다. 대부분의 경우 HTML, HEAD 태그 같은 것들은 건너뛰고 header와 footer 들도 remove 할 겁니다. 그리고 그 HTML 문서의 일부분만 사용하길 원하겠죠. 어떤 content 를 포함 시킬것인지 결정하는 방법에는 두가지가 있습니다.

  • HTML_ID - Use this option to include only a single element (and its child elements) based on its HTML id attribute. This is the simplest, and most recommended option if it is available. The value for this option is case sensitive.
  • HTML_TAG - Use this to include all elements of a certain tag. For instance set it to “table” to include all table elements or “p” to include all paragraph elements. Do not include the surrounding brackets (<, >)


만약 이 옵션을 사용하지 않으면 body tag 전체가 추출될 겁니다.


저작자 표시 비영리 동일 조건 변경 허락
신고

Database Authentication

2012.09.12 21:01 | Posted by 솔웅


Database Authentication


DatabaseAuthentication 클래스는 열결된 데이터베이스에 있는 authentication과 user/group 정보를 제공합니다. 데이터베이스는 main configuration file에 셋업된 디폴트 데이터베이스를 사용할 수도 있고 그 자체의 credential과 세팅을 가지고 있는 별도의 시스템을 사용할 수도 있습니다. 여러분은 이 authentication data를 찾는데 사용되는 테이블을 customize 할 수 있습니다. 그리고 비밀전호 hash를 위한 알고리즘을 지정할 수도 있습니다. authority도 최소한의 configuration으로 새로운 series of table들을 쉽게 셋업할 수 있도록 디폴트 세팅 세트를 제공합니다.


Note : 현재 이 authority에서는 유저나 그룹을 생성하거나 관리하는 기능을 제공하지는 않습니다. 이 글은 여러분이 이미 만들어진 시스템에 연결하는 상황 그리고 여러분이 유저와 그룹을 관리하는 상황을 가정하고 작성되었습니다.




Configuration


DatabaseAuthentication authority는 여러 configuration value들을 가지고 있습니다. 모두 optional 입니다. 아래 value들이 데이터베이스에 연결하는데 영향을 미치는 것들입니다.

  • DB_TYPE - database system은 PDO를 통해 mysql과 sqlite를 지원합니다. 
  • DB_HOST - used by db systems that are hosted on a server
  • DB_USER - used by db systems that require a user to authenticate
  • DB_PASS - used by db systems that require a password
  • DB_DBNAME - used by db systems that require a database
  • DB_FILE - used by db systems the use a file (i.e. sqlite).


위 값들 중 빠진 값들은 SITE_DIR/config/site.ini에서 connectivity settings 을 가져와서 디폴트로 사용할 겁니다. 데이터베이스에 query를 어떻게 할지에 대한 여러 옵션들이 있습니다. 이 때 유저와 그룹 모두를 사용할 필요는 없습니다. 한가지만 필요하면 그걸 사용하시면 됩니다.


아래 값들은 데이터가 위치한 데이터베이스 테이블의 authority를 나타냅니다 :


  • DB_USER_TABLE - (users) The name of the table that stores the user records. This table should at least have fields for userID, password and email. It can also have fields for first/last name or full name. Each row should contain a single user entry
  • DB_GROUP_TABLE (groups) The name of the table that stores group information. It should have fields for shortname and group id. Each row should contain a single group entry.
  • DB_GROUPMEMBERS_TABLE - (groupmembers) The name of the table that stores the members of each group, it should have a field for the group name/id and the userID of the user. Each row should contain an entry that contains the group name and userID. The system will search for members that match the group name.


아래 값들은 어떤 필드들을 사용할지에 대해 authority에 알려 줍니다. :


  • DB_USER_USERID_FIELD (userID)- stores the userID in the user table. For systems that use the email address as the key, you should include the email field
  • DB_USER_PASSWORD_FIELD (password) -stores a hashed value of the user’s password. See DB_USER_PASSWORD_HASH for possible hashing algorithms (Default is md5)
  • DB_USER_EMAIL_FIELD (email) - stores the email in the user table
  • DB_USER_FIRSTNAME_FIELD (empty) - stores the first name of user. Won’t be used unless it is specified
  • DB_USER_LASTNAME_FIELD (empty) - stores the last name of user. Won’t be used unless it is specified
  • DB_USER_FULLNAME_FIELD (empty) - stores the full name of user. Won’t be used unless it is specified
  • DB_GROUP_GROUPNAME_FIELD (group) - stores the short name of the group in the group table
  • DB_GROUP_GID_FIELD - (gid) - stores the group id of the group in the group table. Should be numerical
  • DB_GROUPMEMBER_GROUP_FIELD (gid) - which field to use when looking up groups in the group member table. This is typically the same value as the group name or gid field
  • DB_GROUPMEMBER_USER_FIELD (userID) - which field to use when looking up user in the group member table. This is typically either the userID or the email
  • DB_GROUPMEMBER_AUTHORITY_FIELD - If present you can store the authority index in this field. This allows the system to map group members to other authorities.


다른 값들은 어떻게 그룹 멤버쉽이 키가 되는지를 알려줍니다.


  • DB_GROUP_GROUPMEMBER_PROPERTY - (gid) - This is not stored in the database, but refers to which field will be used to look up group information in the group member table. Valid values are gid or group (i.e. the shortname) gid is the default.


암호 해싱 방법과 관련한 값들도 있습니다.


  • DB_USER_PASSWORD_HASH (md5) - This is a string that represents a valid hashing function. It indicates what

    hashing algorithm is used to store the password. See hash_algos() for a list of valid hashing algorithms. Keep in mind that available algorithms may differ by PHP version and platform. You can also use the hmac_ prefix to use the hmac signing method (i.e. hmac_sha1). This requires setting the DB_USER_PASSWORD_KEY value.

  • DB_USER_PASSWORD_KEY (empty) - Necessary if you use the more secure hmac variant hashing algorithms. This uses a shared key to sign the value using hash_hmac

  • DB_USER_PASSWORD_SALT_BEFORE (empty) - If present this string will be prepended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_AFTER (empty) - If present this string will be appended to any string as a salt value before hashing. This is useful if you are using fixed salts.

  • DB_USER_PASSWORD_SALT_FIELD_BEFORE (empty) - If present the value of this field for the user will be prepended to any string as a salt value before hashing. This is useful if you are using variable salts.

  • DB_USER_PASSWORD_SALT_FIELD_AFTER (empty) - If present the value of this field for the user will be appended to any string as a salt value before hashing. This is useful if you are using variable salts.


How it Works


User Authentication


USER_LOGIN을 FORM으로 해서 user authentication 을 지원한다면 authority는 USER_TABLE을 볼겁니다. 그리고 타입된 값과 맞는 DB_USER_USERID_FIELDDB_USER_EMAIL_FIELD 의 레코드 값을 찾을 겁니다. 해당 record를 찾으면 DB_USER_USERID_FIELD에 있는 값이 type 된 패스워드의 hashed 값과 매치 되는 지를 볼 거구요. (이때 DB_USER_PASSWORD_HASH algorithm을 사용합니다.) 데이터베이스에서 사용한 해쉬 알고리즘과 configuration에서 지정한 해쉬 알고리즘이 동일해야 합니다.


User Lookup


Users는 DB_USER_TABLE를 살피고 요청된 값과 DB_USER_USERID_FIELD or DB_USER_EMAIL_FIELD의 record 가 맞는지  봅니다. 만약에 맞는것을 찾으면 user object는 생성됩니다. 생성되는 것들은 값이 있는 경우 다음의 내용이 포함됩니다. B_USER_USERID_FIELD, DB_USER_EMAIL_FIELD and DB_USER_FIRSTNAME_FIELD,*DB_USER_LASTNAME_FIELD* and DB_USER_FULLNAME_FIELD


Group Lookup


Groups은 을 살피고 요청된 값과 DB_GROUP_GROUPNAME_FIELD or DB_GROUP_GID_FIELD의 record가 맞는지 봅니다. 만약에 맞는 것을 찾으면 group object가 생성됩니다. 생성되는 것들은 DB_GROUP_GROUPNAME_FIELD and DB_GROUP_GID_FIELD 값입니다.


Group Membership Lookup


Group membership은 DB_GROUPMEMBERS_TABLE안에서 query 됩니다. getMembers() 메소드는 DB_GROUPMEMBER_USER_FIELD를 사용해서 유저 객체 배열을 만듭니다.  DB_GROUPMEMBER_GROUP_FIELD 와 매치되는 모든 users는 return 됩니다. (DB_GROUP_GROUPMEMBER_PROPERTY,를 사용해서 리턴됩니다. 예:gid,short name) 그 user 객체들은 DB_GROUPMEMBER_AUTHORITY_FIELD에 의해 authority reference 되서 생성됩니다. 만약에 authority field 가 없으면 그룹과 같은 authority를 사용합니다. (예: DB_USER_TABLE를 사용할 겁니다.) 테이블의 다른 authority를 참조할 수 있습니다. (예: ldap users, google users 등)


Using Default Values


여러분의 reference database를 include 하고 싶으시면 아래와 같이 정의된 테이블의 모든 디폴트 값을 사용할 수 있습니다.



CREATE TABLE users (userID varchar(64), password varchar(32), email varchar(64),

firstname varchar(50), lastname varchar(50)); CREATE TABLE groups (`group` varchar(16), gid int); CREATE TABLE groupmembers (gid int, authority varchar(32), userID varchar(64));


이것은 디폴트 값들과 호환되는 테이블 구조입니다.


저작자 표시 비영리 동일 조건 변경 허락
신고

Authentication

2012.09.06 21:08 | Posted by 솔웅


Authentication


특정 모듈에 대해서 검증된 유저만 (authenticated users) 접근이 가능하도록 할 필요가 있습니다. 또는 해당 유저에 알맞는 내용을 제공하거나 feedback에 참여하도록 허용할 수 있겠죠.


Kurogo 프레임워크는 authenticationg users와 내용에 대한 authorizing access 를 위한 기능을 제공하고 있습니다. 이런 기능을 위해서 유저별로 또는 특정한 그룹에 있는 멤버에게만 접근이나 관리의 권한을 주거나 제한하는 서비스를 제공할 수 있습니다.


Kurogo는 기존에 존재하는 identity 시스템과 같이 사용하실 수도 있습니다. 예를 들어 Active Directory, MySQL databases, Twitter, Facebook and Google 등이 있습니다.





Setting up Authentication


Authentication은 유저의 identity를 설립하는 프로세스입니다. 이 identity의 설립은 유저가 username과 password를 제공하면서 가능합니다. 프레임워크는 그 유저이름과 패스워드를 받아서 central authority를 통해서 credential을 test 하게 됩니다. 만약 authority가 credential에 적합하면 유저는 로그인 되고 관련된 서비스나 개인 정보를 사용할 수 있게 됩니다.



쿠로고 프레임워크에 의한 Authentication는 한개 이상의 authentication authorities를 통해서 제공 됩니다. 각 authority는 기존의 authentication system에 connect 하기 위해 configure 돼 있습니다. 여러분 사이트의 필요에 따라 여러분은 거기에 맞는 private self-hosted authentication system (like an LDAP/Active Directory or database system) or a public system (Twitter, Facebook, Google) 들을 사용하실 수 있습니다. 또한 standard authentication services (Google Apps) 같이 외부에서 제공되는 서비스를 사용해서 hybrid로 접근할 수도 있습니다. 간단하게 deploy 하려면 external service 필요없이 flat-file based system을 사용할 수도 있습니다.


각 authority는 아래와 같이 다양한 서비스를 제공할 수 있습니다.


  • User authentication - either through a direct login/password form or through an external system based on OpenID or OAuth
  • User attributes - At minimum authorities should supply id, name and email information. Some authorities can provide this information to any user in their system, however others can only provide this information on the logged in user
  • Group information and membership - Some authorities will also contain information on groups which allow you to logically organize users. Some authorities are designed to only contain users from their own domains, while others have the ability to utilize users from other authorities in their membership


이 모든 서비스를 다 제공할 필요는 없을 겁니다. 하나의 authority는 authentication과 information을 제공하고 다른 것은 group information을 제공하고 이렇게 여러 방법으로 사용될 수도 있습니다. 만약 여러분이 여러분의 authorization schemes에 group을 지정하지 않았다면 group information은 필요 없게 되겠죠.


Enabling Authentication


authenticating users를 지원하려면  SITE_DIR/config/site.ini 안에 있는 AUTHENTICATION_ENABLED 를 1로 세팅해야 합니다. 디폴트는 0 입니다.


Configuring Authorities


Authorities들은 SITE_DIR/config folder에 있는 authentication.ini file 에 정위 됩니다. 각 authority는 각 section에서 설정됩니다. 이 section 이름은 authority index로 사용되는 것이 좋습니다. 프레임워크에 의해 사용되는 programmatic value 죠. 이 value는 여러분이 원하는 대로 하셔도 됩니다. 다만 이전에 사용됐던 section을 중복해서 사용하지 않도록 주의하셔야 됩니다. 만약 중복 되면 문제가 생깁니다.


각 authority는 여러 attribute들이 필요합니다. 그리고 authority type에 따라 더 필요할 수도 있습니다. configuration file에 대한 좀 더 자세한 정보를 원하시면 Configuration를 참조하세요.


아래 내용들은 모든 authorities들에 필요한 값들입니다.


  • TITLE - This value is used when referencing the framework to users. If there is more than one authority available to users to choose the title will direct them to the correct one.
  • CONTROLLER_CLASS - This value should map to a valid subclass of AuthenticationAuthority. This defines the core behavior of the authority.
  • USER_LOGIN - There are 3 possible values:
    • FORM - Use the login form
    • LINK - Use a login link. The authority should handle this using their login method
    • NONE - This authority does not provide authentication services (i.e. just group services)


Included Authorities


Kurogo 프레임워크가 폭 넓은 세팅을 할 수 있도록 하기 위해 프로젝트는 몇가지 클래스들을 가지고 있습니다. 이 클래스들은 다양한 타입의 authentication과 authorization service들에 연결할 수 있도록 합니다.  각각은 나름대로 셋업하고 사용하기 위한 방법들이 있습니다. 아래 문서들을 잘 읽어보시고 개발하고 deploy 하기 위한 중요한 요구사항들을 잘 살펴 보시기 바랍니다.



저작자 표시 비영리 동일 조건 변경 허락
신고

Flat File Authentication

2012.09.06 08:59 | Posted by 솔웅


Flat File Authentication


PasswdAuthentication
class는 로컬에 있는 flat file의 authentication과 user/group 정보를 제공합니다. 가장 간단한 authentication 관리 방법입니다. 다른 서비스를 사용하지 않아도 되죠.


Configuration


PasswdAuthentication authority 는 standard에 2개의 value만이 추가 됩니다.

  • PASSWD_USER_FILE - a path to the user file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/users”

  • PASSWD_GROUP_FILE - a path to the group file. This file can be placed anywhere, but it is recommended to place it in the DATA_DIR folder which is mapped to SITE_DIR/data. i.e. If you use the DATA_DIR constant it should not be in quotes: DATA_DIR”/groups”



Format of the user file


이 user file은 전형적인 유닉스의 passwd 파일과 그 구조가 비슷합니다.

각 라인은 single user를 말합니다. 빈 줄이나 #로 시작하는 줄은 무시될 겁니다. 각 라인에는 : 로 구분되는 field들이 있습니다. 필드의 순서는 아래와 같습니다.

  1. userID - a short name for the user
  2. password - an md5 hash of the user’s password (unix users can use md5 -s “password” to generate a hash)
  3. email - the email address of the user
  4. full name - the full name of the user


Format of the group file


그룹 파일도 유닉스의 그룹파일과 아주 비슷합니다.


각 라인은 single group을 나타냅니다. 빈 줄이나 #로 시작하는 줄은 무시됩니다. 각 라인에서 각 필드들은 : 로 구분 됩니다.

그 필드들의 순서는 아래와 같습니다.


  1. group - a short name for the group
  2. gid - a numerical id for the group
  3. members - a comma separated list of users. Each user is represented by their username/email. If the user is from another authority you should enter it as authority|userID


Usage


이 authority를 사용하는 것은 몇개의 account 만을 다룰 때 유용할 겁니다. 예를 들어 간단하게 username과 password를 가지고 몇개의 모듈만 protect 하기를 원하는 경우가 이것에 해당 될 겁니다.




저작자 표시 비영리 동일 조건 변경 허락
신고

Access Control and Authorization

2012.09.06 03:53 | Posted by 솔웅


Access Control and Authorization


유저의 identity를 얻으면 그 identity 에 근거해서 제한된 모듈을 사용할 수 있도록 하는 authorize 가 가능해 집니다. Authorization은 access control lists에 의해서 이뤄 집니다. 개발자들은 아마 다른 contexts에 더 익숙하시겠죠? 예를 들어 파일 시스템 같은......


Access Control Lists


access control list 는 어떤 리소스에 접근이 가능한 이들을 정의해 놓은 rule들을 열거한 겁니다. (ALLOW rules) 물론 그 리소스에 어떤 이들의 접근을 막을지에 대해서도 정의해 놓을 수 있겠죠. (DENY rules). 룰들은 유저와 그룹별로 정의 될 수 있습니다. 여러분 사이트의 필요에 따라 혼합하거나 해서 사용하실 수 있습니다.


Access control lists SITE_DIR/config/acls.ini  (site authorization)나 SITE_DIR/config/MODULE/acls.ini (module authorization)에 정의 돼 있습니다. 


만약 그 site 에 access control list entry가 있다면 (in SITE_DIR/config/acls.ini), 이 조건은 모든 모듈에 적용이 될 겁니다. site가 아니라 module 이 access control list entry 를 가지고 있다면 (in SITE_DIR/config/MODULE/acls.ini), acl 룰에 맞는 유저만이 접근할 수 있게 됩니다.


아래와 같은 경우에 유저는 접근 권한을 가질 겁니다.


  • They match an ALLOW rule, AND
  • They do NOT match a DENY rule


만약 유저가 DENY 룰에 속하면 즉각 접근 제한이 됩니다.

이 Access control lists 는 Administration Console에서 수정될 수 있습니다.




Syntax of Access Control Lists


각각의 ACL은 acls.ini 파일에 있는 section입니다. 첫번째 ACL은 section 0 가 되고 두번째는 1 이 됩니다. 각 섹션은 key들을 가지고 있습니다.


  • type: Either U (for user access, i.e. who can use the module), or A (for admin access, who can administer the module).
  • action: Either A (allow) or D (deny). Deny rules always take precedence.
  • scope: Either U (user), G (group) or E (everyone, i.e. ALL users, including anonymous users),
  • authority: The index of the authority. For user scope this can be blank and would match a user from any authority.
  • value: The particular user/group to match. For user scope this can be “*” which would match all authenticated users.


이 신택스를 구현하는 방법을 이해하시려면 아래 예제를 보세요.

admin 모듈에 대해 만드려면 아래와 같이 될 겁니다.



[0]
type = "U"
action = "A"
scope = "G"
authority = "ldap"
value = "admin"

[1]
type = "U"
action = "A"
scope = "G"
authority = "ad"
value = "domainadmins"

[2]
type = "U"
action = "D"
scope = "U"
authority = "ad"
value = "Administrator"



이 의미는 ldap authority 의 admin 그룹의 멤버들과 ad authority 의 domainadmin 그룹들에게 접근이 허용 될 겁니다.  그리고 특별히 ad authority의 Administrator 그룹에는 접근이 허용되지 않습니다.


Using the Flat-file Authority to extend other authorities


flat file authority 인 PasswdAuthentication는 다른 시스템이 아닌 웹서버에 저장돼 있는 flat-file을 사용해서 유저나 그룹들에게 접근을 허용할 수 있습니다. 이 경우는 유저가 적어서 굳이 authority 시스템을 관리하느라 시간을 낭비하고 싶지 않은 경우에 유용하게 사용 될 수 있습니다.


그리고 데이터베이스 서버(혹은 SQLite)가 있고 여러분이 그것을 관리하고 있다면 이 데이터베이스에 저장된 값을 가지고 사용하는 DatabaseAuthentication authority 도 사용할 수 있습니다.



이러한 방법들에 대해 좀 더 알고 싶으시면 instruction을 참조하세요. 유저 login을 사용하고 싶지 않다면 USER_LOGIN을 NONE으로 세팅해 놓으세요.



저작자 표시 비영리 동일 조건 변경 허락
신고

Kurogo Tutorial 21 - Emergency Module -

2012.07.12 22:35 | Posted by 솔웅


Emergency Module


Emergency 모듈은 site의 emergency 정보에 대한 모바일 인터페이스를 제공합니다. 이 모듈은 가장 최근의 emergency 정보와 emergency contacts를 display 할 수 있습니다. 모듈에 대한 데이터 소스는 drupal server에서 올 수가 있습니다. 이 emergency drupal 모듈은 add-ones 안의 add-ons/drupal-modules/emergency 에서 찾아 보실 수 있습니다. (현재까지는 Drupal 6까지만 지원합니다.) 동시에 standard RSS feed 도 emergency notice에서 사용될 수 있습니다. 그리고 contacts list는 ini file에서 작성하실 수 있습니다.


Configure Emergency Notice


emergency notice를 display 하고 싶으면 config/emergency/feeds.ini[notice]  섹션을 추가하시면 됩니다.




Other Options


  • NOTICE_EXPIRATION -  Notice 가 active 상태이어야 할 시간 (초단위). notice 가 해당 feed에서 remove 되지 않는 경우 유용합니다. 디폴트는 1주간 입니다. (604800초).
  • NOTICE_MAX_COUNT - feed로 부터 보여야 할 notice들의 maximum number 값


Configure Contacts List


만약 emergency contact phone number들을 추가하기를 원한다면 config/emergency/feeds.ini 안에 contacts 섹션을 넣으셔야 합니다.

연결 된 Drupal emergency module의 contacts list를 configure 하세요.



아니면 ini 파일에 직접 contact list를 넣으실 수도 있습니다.


  • CONTROLLER_CLASS = “INIFileContactsListRetriever”
  • BASE_URL (해당 ini 파일을 가리켜야 합니다.)


ini 파일에는 primary contacts를 위해 primary 섹션이 있어야 하고 secondary contacts를 위해 secondary 섹션이 있어야 합니다. 각 contact는 아래와 같이 포매팅 되면 됩니다.


title[] = "Police"
subtitle[] = ""
phone[] = "6173332893"


secondary contacts 섹션이 있는 경우 모듈 변수 MORE_CONTACTS를 수정해서 secondary contacts 링크의 title을 수정하실 수 있습니다. 디폴트로 이 값은 “More Emergency Contacts”로 돼 있습니다.


Using Drupal Emergency Module


Installation


이 add on 모듈은 Drupal 6가 있어야 합니다. Drupal 7은 아직 지원되지 않습니다. 두루팔 모듈을 인스톨하는 표준 절차를 따라주세요.


  • 이 모듈을 인스톨 하려면 우선 drupal CCK (Content Creation Kit) 모듈과 drupal Views 모듈을 인스톨 해야 합니다.
  • add-ons/drupal-modules/emergencysites/all/modules/ 디렉토리로 복사하세요.
  • drupal administration panel 에서 modules 로 가세요. 그리고 "Emergency Info" 모듈을 선택하세요. 다음에 save configuration을 하시면 됩니다.


Usage


emergency notification을 input 하시려면 content type "Emergency Notification"의 node를 만드세요. RSS feed는 가장 최근에 업데이트 된 Emergency Notification 만 보여 줄 겁니다. 

emergency contacts를 input 하시려면 Emergency Contacts 타입의 노드를 생성하세요. 그리고 primary와 secondary emergency contacts를 채워 넣으시면 됩니다. 만약에 이 타입에 1개 이상의 노드를 생성하시면 RSS feed는 가장 최근에 업데이트된 것을 보여줄 겁니다.


http://YOUR_DRUPAL_SERVER_DOMAIN/emergency-contacts-v1 에 생성된 RSS feed 는 여러분이 입력한 contact 정보는 빠져 있을 겁니다.  /admin/user/permissions로 가셔서 field_primary_contactsfield_secondary_contacts를 anonymous user 가 볼 수 있도록 enable 해 주셔야 합니다.




저작자 표시 비영리 동일 조건 변경 허락
신고

Kurogo Tutorial 20 - Module Interaction -

2012.06.13 10:08 | Posted by 솔웅


Module Interaction


많은 경우 데이터를 share 하고 모듈간에 링크를 걸고 하는 것은 아주 유용하게 사용됩니다. 인터페이스의 일관성을 유지하기 위해 convention 들이 만들어 졌습니다. 이 convention들은 아래와 같은 일들을 합니다.

  • 다른 모듈의 데이터 값을 근거로 특정 모듈로 링크를 걸거나 값을 formatting 함 (예. people 디렉토리의 값에서 맵 모듈로 링크 걸기 등)
  • 모듈의 모델 객체에 근거한 링크 생성과 value 포맷팅 (예. calendar event의 포매팅과 retrieval)
  • criteria에 근거한 다른 모듈의 data retrieval (used in the federated search feature)


만약 새 모듈을 만들거나 다양한 data source로부터 데이터를 포맷하기를 원한다면 오늘 다룰 내용을 자세히 읽어 보셔야 합니다.




Formatting Data from Existing Modules

다른 데이터(map locations, people)를 참조하는 하나의 데이터 소스(LDAP directory, calendaring system)에 있는 데이터를 가지고 있는 예는 아주 많습니다. 불행히도 이 두개의 시스템사이를 연결하는 strong link 는 없을 겁니다. 그 둘을 link 하려면 bridge를 사용해야 합니다.

다른 모듈의 데이터로 링크를 걸고 다른 모듈의 데이터를 보여주는 쿠로고의 built in 모듈은 2가지가 있습니다.(People, Calendar module) detail configuration의 module=xxx 파라미터는 다른 모듈로의 링크를 생성합니다. default로는 간단하게 디렉토리의 같은 value를 사용합니다. 그리고 filter 파라미터의 value를 사용해서 target 모듈의 search 페이지로 링크를 겁니다. 그러니까 맵 모듈로 링크를 건다면 아래와 같을 겁니다.

  • map/search?filter=value

이것은 많은 경우에 사용됩니다. 하지만 때때로 좀 더 특정 링크를 제공해야 할 때도 있습니다. 이를 구현하기 위한 과정은 아래와 같습니다.

  • target 모듈의 subclass를 생성한다. (i.e. map)

    • Create a file named SiteMapWebModule.php in SITE_DIR/app/modules/map안에 SiteMapWebModule.php파일을 생성한다. enclosing folder들을 사용해야 할 겁니다. 
    • 이 파일은 MapWebModule의 subclass이어야 함. 이것이 그냥 맵 모듈의 extension 이라면 다른 추가적인 프로퍼티를 포함할 필요는 없음
  • Implement a linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) method in your subclass. This method will receive:

    • a value from the other system
    • a reference to the calling module (이것으로 여러분은 어떤 모듈이 call을 할 것인지 정할 수 있습니다. )
    • 옵션으로 모듈에 의해 underlying object가 제공됩니다. 그렇기 때문에 여러분은 response를 generate 할 때의 모든 value들을 고려해야 합니다.

이 메소드는 list item에 대한 해당 배열을 return 해야 합니다. 여기서 최소한 title 값을 include 해야합니다. 일반적으로 link를 include 하고 싶지 않다면 url 값을 include 해야합니다.


<?php

class SiteMapWebModule extends MapWebModule
{
  public function linkForValue($value, Module $callingModule, KurogoObject $otherValue=null) {

      switch ($callingModule->getID())
      {
          case 'people':
            //look at the location field to see which office they are from.
            //This assumes the relevant location is in the "location" field.
            $person = $otherValue;

            switch ($person->getField('location'))
            {
                case 'New York':
                    // New York office is first entry
                    return array(
                        'title'=>'New York Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:0'
                            ))
                    );
                    break;

                case 'Boston':
                    // Boston office is the 2nd entry
                    return array(
                        'title'=>'Boston Office',
                        'url'=>buildURLForModule($this->id, 'detail', array(
                                'featureindex'=>0,
                                'category'=>'group:1'
                            ))
                    );
                    break;
                default:
                    // don't include link
                    return array(
                        'title'=>$value
                    );
            }
            break;
          default:
            //return the default implementation for other modules
            return parent::linkForValue($value, $callingModule, $otherValue);
      }
  }
}

Enabling interaction from new modules

새 모듈을 만드려면 full interaction을 가능하도록 하기 위해 몇개의 메소드들이 필요합니다.

  • searchItems($searchTerms, $limit=null, $options=null) - 이 메소드는 필터로서 searchTerms를 사용해서 KurogoObject  인터페이스를 confirm 하는 객체의 배열을 return 해야 합니다. 여러분의 implementation은 criteria를 사용해서 간단하게 검색하기 위해 필요한 메소드들을 call 해야 합니다. 여러분은 좀 더 structured queries를 사용하기 위해 옵션 배열들을 활용할 수 있습니다. federated search method의 디폴트 impementation을 활용한다면 ederatedSearch=>true를 포함해야 할 겁니다.
  • linkForItem(KurogoObject $object, $options=null) - This method should return an array suitable for a list item based on the object included. This would typically be an object that is returned from the searchItems method. An options array is included to permit further customization of the link. For examples, see the People, News, Calendar and Video modules. 이 메소드는 include 된 객체를 근거로 list item에 대한 해당 배열을 return 해야 합니다. 이것은 특히 searchItems 으로부터 return 된 객체가 됩니다. options array는 링크를 좀 더 customize 할 수 있도록 하기 위해 include  됩니다. 그 예로는 People, News, Calendar 그리고  Video module 들이 있습니다..


저작자 표시 비영리 동일 조건 변경 허락
신고
이전 1 2 3 4 다음

티스토리 툴바