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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

selection list 관련 예제들

2012. 11. 18. 03:43 | Posted by 솔웅


반응형

Examples of manipulation of selection lists



Communicate the value of a selection list on the server by Ajax


이번에 만들 selection list 는 먼저 아파트 type 을 정하고 이것을 서버로 보내서 그에 대한 response 를 받는 로직입니다. 우리는 그 response 를 window 에 display 할 겁니다.


Transmit the type of apartment by Ajax


<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <optgroup label=Basic>

        <option value=1> 1 bedroom </option>

        <option value=2> 2 bedrooms </option>

        <option value=3> 3 bedrooms </option>

      </optgroup>

      <optgroup label=Premium>

        <option value=4> 4 bedrooms </option>

        <option value=5> 5 bedrooms </option>

      </optgroup>

    </select>

  </div>

</div>


</body>

</html>


<script>


$("select").bind ("change", function (event)

{

  var type = $(this).val ();

  

  $.ajax (

  

    url : "action.php", 

    data : { type : type },

    complete : function (xhr, result)

    {

      if (result != "success") return;

      var response = xhr.responseText;

      $("#home div:jqmData(role=content)").append (response);

    }

  });   

});


</script>


서버에 아파트 type 을 보내기 위해 change event 를 사용합니다. 그러니까 selection list 에 어떤 change 가 일어날 때만 정보가 전달 될 겁니다. 서버로부터 받은 response 는 append (response) 사용해서 window에 삽입됩니다.


action.php file


<?
$type = $_REQUEST["type"];
echo utf8_encode ("<p> The type of apartment is $type </p>");
?>



action11.php


tistory476_01.html


몇번 아이템을 선택하고 나면 아래와 같은 화면이 될 겁니다.




Use a submit button to transmit information


서버의 response를 display 하기 위해서 Ajax 메카니즘을 사용하는 대신에 form 을 validate 하고 서버에서 return 된 선택된 리스트 아이템의 값을 가지고 있는 값을을 새 window 에 display 할 수도 있을 겁니다.


Pass the value of the selected item when clicking the OK button


<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <form action=action.php>

      <span> Choose an apartment type: </span>

      <select data-native-menu=false name=type>

        <optgroup label=Basic>

          <option value=1> 1 bedroom </option>

          <option value=2> 2 bedrooms </option>

          <option value=3> 3 bedrooms </option>

        </optgroup>

        <optgroup label=Premium>

          <option value=4> 4 bedrooms </option>

          <option value=5> 5 bedrooms </option>

        </optgroup>

      </select>

      <input type=submit value=OK>

    </form>

  </div>

</div>


</body>

</html>


<script>


</script>





name attribute 를 <select> element 에 추가했습니다. 그래서 selected value 는 form validation으로 해서 전송 됩니다.


action.php file

<?
$type = $_REQUEST["type"];
?>

<!DOCTYPE html> 
<html> 
<head> 
  <meta http-equiv=Content-Type content=text/html;charset=iso-8859-1 />
</head> 

<body>
<div data-role=page id=win2 data-add-back-btn=true>
  <div data-role=header>
    <h1>Window 2</h1>
  </div>
  
  <div data-role=content>
    <p> Selected apartment : <?= $type ?> </p>
  </div>
</div>
</body>

</html>


action12.php

tistory477_01.html



Add a list item after a click of a button


이제 dynamically 삽입된 new element를 display 하겠습니다. 새 element 는 id 가 add인 버튼을 클릭하면 되도록 만들겠습니다.


Add an item to the selection list after clicking a button


<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <option value=1> 1 bedroom </option>

      <option value=2> 2 bedrooms </option>

      <option value=3> 3 bedrooms </option>

      <option value=4> 4 bedrooms </option>

      <option value=5> 5 bedrooms </option>

    </select>

    <a href=# data-role=button id=add>

        Add "6 bedrooms" to the list </a>

  </div>

</div>


</body>

</html>


<script>


$("#add").bind ("click", function (event)

{

  $("select").append ("<option value=6> 6 bedrooms </option>");

  $("select").selectmenu ("refresh");

});


</script>

tistory476_03.html

Make a treatment when clicking on any element of the selection list


change event는 selection list 의 어떤 값들이 바뀔 경우에만 적용이 됩니다. 유저가 이미 선택한 아이템을 선택한다면 이 change event 는 발생하지 않을 겁니다.


만약에 아이템을 click 했을 때를 기준으로 뭔가를 할 수 있다면 좋겠죠? 아래 예제에서는 클릭했을 때 그 리스트 아이템을 보여 줄겁니다. 이 경우에는 그 아이템이 현재 선택 된 아이템이라도 이벤트가 발생할 겁니다.


Display the content of the item clicked


<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <optgroup label=Basic>

        <option value=1> 1 bedroom </option>

        <option value=2> 2 bedrooms </option>

        <option value=3> 3 bedrooms </option>

      </optgroup>

      <optgroup label=Premium>

        <option value=4> 4 bedrooms </option>

        <option value=5> 5 bedrooms </option>

      </optgroup>

    </select>

  </div>

</div>


</body>

</html>


<script>


$("select").bind ("selectmenucreate", function ()

{

  $(".ui-li:not(.ui-li-divider)").live ("vclick", function (event)

  {

    alert ($(this).find ("a").text ());

    event.stopPropagation ();

  });

});


</script>

tistory476_04.html


자바스크립트가 몇 줄 안되지만 좀 설명할 부분이 있습니다. 일단 리스트가 생성될 때까지 기다려야 합니다. (selectmenucreate event). 그렇지 않으면 HTML 코드는 jQuery Mobile 에 의해 전환되기 전이 됩니다. 그리고 jQuery Mobile 에 의해 생성된 <li> elements 들이 아직 DOM tree 에 있는 상태가 아니게 되는 거죠.


selector  "ui-li:not (.ui-li-divider)"는 리스트 아이템입니다. (separator 가 아니죠). bind () method 대신 live () method 를 사용하는 것은 jQuery Mobile 이 아이템이 select 됐을 때 온전하게 다시 display 하도록 하기 위해서 입니다. 만약 bind () click 이벤트는 오직 첫번째 selection 에서만 적용이 될 겁니다.


마지막 단계에서는 jQuery Mobile 에 의해 만들어진 <a> item 을 retrieving 함으로서 선택된 아이템의 내용을 display 하게 됩니다.
event.stopPropagation () instruction 은 click 이 여러번 인식되는 것을 방지합니다.


이제 우리가 4 bedrooms을 선택하면 alert 화면에 4 bedrooms라는 메세지가 display 됩니다.


(제 경우에 저 위의 예제는 잘 안되네요. 어떨 때 될 때도 있는데... 혹시 이 예제가 왜 잘 안되는지 아시는 분은 댓글로 좀 알려 주세요.)



선택된 아이템 내용을 retrieve 하는 것보다 그 value 를 다룰 수도 있습니다. 해당 <option> element 에 있는 value attribute 를 표시할 수도 있습니다.


Retrieve the value of the selected item (only if the list is closed)


alert ($("select").val ()); // Displays "4"



반응형

selectiion list customize 하기

2012. 11. 17. 22:15 | Posted by 솔웅


반응형
Customize selection lists


Firebug를 이용해서 jQuery Mobile에 의해 만들어진 selection list 내부의 HTML element들에 대해 assign 된 CSS 클래스들을 볼 수 있습니다. 여기서는 data-native-menu attribute가 "false"로 된 부분만 살펴보기로 하겠습니다. (native 가 아닌)

아래 샘플 코드가 있습니다. 이 코드는 엘리먼트의 그룹들을 구분해서 리스트를 display 합니다.



A selection list with groups of elements



<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <optgroup label=Basic>

        <option value=1> 1 bedroom </option>

        <option value=2> 2 bedrooms </option>

        <option value=3> 3 bedrooms </option>

      </optgroup>

      <optgroup label=Premium>

        <option value=4> 4 bedrooms </option>

        <option value=5> 5 bedrooms </option>

      </optgroup>

    </select>

  </div>

</div>


</body>

</html>


tistory475_01.html


이 selection list 는 아래와 같이 display 될 겁니다.





Firebug에서 보시면 jQuery Mobile 에 의해 생성된 HTML code 를 보실 수 있습니다.





ui-selectmenu CSS class 가 있는 <div> element 안에는 ui-selectmenu-list class 가 있는 <ul> element 가 있습니다. 그 안에는 display 된 리스트 아이템들에 해당하는 <li> elements 들이 있구요. 각
<li> elements 들에는 ui-li and ui-btn classes 들이 있습니다. 그리고 그 리스트 안에 selected 아이템에는 ui-btn-active class 가 있구요.


<optgroup> element를 사용해서 jQuery MObile에 의해 삽입된 separator element 에는 ui-li, ui-li-divider, ui-btn and ui-bar-b classe 들이 있습니다.


이 CSS class들을 이용해서 selection list 를 새롭게 꾸며보겠습니다.


Styling elements of the selection list



<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

  

  <style type=text/css>

     .ui-selectmenu {

       padding : 15px;

     }

     .ui-li-divider.ui-bar-b {

       color : red;

       background : black;

     }

     .ui-li:not(.ui-li-divider) {

       font-style : italic;

     }

     .ui-li.ui-btn-active {

       color : white;

       background : grey;

     }

  </style>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <optgroup label=Basic>

        <option value=1> 1 bedroom </option>

        <option value=2> 2 bedrooms </option>

        <option value=3> 3 bedrooms </option>

      </optgroup>

      <optgroup label=Premium>

        <option value=4> 4 bedrooms </option>

        <option value=5> 5 bedrooms </option>

      </optgroup>

    </select>

  </div>

</div>


</body>

</html>


tistory475_02.html





반응형


반응형
Manage events on selection lists




change event 는 리스트의 selected value 가 바뀌었을 때를 알려 줍니다. 이 이벤트는 jQuery의 bind () method 를 사용해서 구현하시면 됩니다.


Using the change event in the selection list


<!DOCTYPE html>


<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <option value=1> 1 bedroom </option>

      <option value=2> 2 bedrooms </option>

      <option value=3> 3 bedrooms </option>

      <option value=4> 4 bedrooms </option>

      <option value=5> 5 bedrooms </option>

    </select>

  </div>

</div>


</body>

</html>


<script>


$("select").bind ("change", function (event)

{

  alert ($(this).val ());

});


</script>




tistory474_01.html


반응형


반응형
Tracking Multiple Domains



이 문서는 single profile에 multiple domain에 대한 visits를 수집하는 여러 방법들에 대해 설명하고 있습니다. (그 multiple domain 들이 두 개의 별도 site 에 있지 않고 한개의 site 에 있다고 가정할 때) 그리고 웹사이트의 portion들을 어떻게 track 하는지에 대해서도 다루고 있습니다. 예를 들어 sub-directory 와 iFramed content 같은 경우들을 말하죠. 만약 여러분이 cross-domain tracking 에 대해 잘 모르신다면 저희 Help Center 에 있는 Domains and Directories를 참조하세요.


Introduction


Google Analytics 의 디폴트 setup 은 Single Domain 에 대한 content 와 visitor data를 track 하도록 디자인 돼 있습니다. (예. www.example.com)

그렇지만 만약 여러분이 좀 더 복잡한 상황에서 Analytics를 사용하기를 원하신다면, 예를 들어 


  • Subdomainsdogs.example.com 와 www.example.com 에 방문하는 모든 방문기록. 두 도메인에 대한 정보가 같이 report 되기 원할 때
  • Subdirectories—  오직 www.example.com/dogs 의 subdirectory에 대한 방문만 별도로 report 하기를 원할 때. 만약 한 사이트(single site) 에 있는 경우
  • 3rd-party shopping carts—  온라인 쇼핑몰과 소핑카트 가 서로 다른 도메인에 host 돼 있을 때
  • Top-level domains—  당신이 가지고 있는 두개의 도메인에 대한 모든 visitor들의 정보가 같은 report profile 에 보여지기를 원할 때. 예를 들어www.example-petstore.comwww.my-example-blog.com,
  • IFramed Content— 다른 도메인에 있는 내용이 당신의 웹페이지에서 iFrame 으로 표시될 때. 거기에 대한 visitor와 pageview 데이터를 얻고 싶은 경우



위의 경우에 해당되면 여러분은 정확히 visitor 를 track 하기 위해 tracking code 에 약간의 customization 을 해야 합니다. 이 작업을 하기 전에 디폴트 Analytics installation 에서 Domains and Directories들이 어떻게 다뤄지는지를 먼저 이해하시면 훨씬 도움이 되실 겁니다.



Tracking Scenarios


이 section은 다양한 tracking scenario들에 대해 다룹니다. 가장 많이 사용되는 경우부터 정리했습니다.


Tracking Across Multiple Domains and Sub-domains


이 시나리오는 두개의 unique 한 도메인들과 하나의 sub-domain 을 track 해야 하는 상황입니다. 예를 들어 당신은 온라인 쇼핑몰을 가지고 있고 또한 당신의 블로그에 방문하는 사람도 track 하기를 원합니다.





아래내용은 3개의 example URL 들에 대한 key tracking code customization을 보여줍니다.

  • Online Store Domain: www.example-petstore.com


    당신이 customize 해야하는 유일한 링크나 form data는 www.my-example-blogsite.com 를 point 하는 겁니다. _setDomainName() function이 정의 되었기 때문에 이 사이트의 sub-domain 에 대한 링크는 요구되지 않습니다.
    .example-petstore.com 는 도메인으로서 어떤 subdomain들도 cookie access 가 가능합니다.

  • Online Store Subdomain: dogs.example-petstore.com


    primary domain 으로 link back 하는 부분을 configuration 할 필요는 없습니다 .왜냐하면 sub-domain 이 primary domain 과 같은 cookie 들을 share 하기 때문입니다.

  • Blog Domain: www.my-example-blogsite.com


    이 configuration은 도메인 name을 blog site 에 대한 top-level domain name으로 set 합니다. 이렇게 해서 나중에 당신이 이 블로그 사이트에 어떤 sub-domain들을 추가하게 되면 그 sub-domain 은 그 parent 와 cookie를 share 할 수 있게 됩니다. 당신은 특별히 다른 linked call 을 set up 할 필요가 없는 것이죠. 어쨌든 당신은 www.example-petstore.com에 대한 어떠한 form 이나 link에 대해서 _link()_linkByPost() methods를 사용하셔야 됩니다.


Tracking Across a Domain and Its Subdomains


위에 언급했듯이 Google Analytics의 디폴트 셋업은 single domain 에 대한 content와 visitor 데이터를 track 하기 위해 디자인 됐습니다. (예를 들어 www.example.com 같은 도메인이죠.)  이 의미는 여러분이 그 도메인과 sub-domain 을 관리한다고 면 두개의 도메인에 걸친 visitor data 를 share 하기 위해서는 tracking code를 수정해야 한다는 겁니다.


예를 들어 다음 세개의 도메인들을 .

  • www.example-petstore.com
  • dogs.example-petstore.com
  • cats.example-petstore.com


이를 위해서는 이 세개의 domain 들의 tracking code에 대해 아래와 같은 customization을 해야 합니다.




이 3개의 site들에 대해 링크나 form 에 대해 어떤 adjustment 도 하실 필요가 없습니다. 당신이 도메인 이름을 top-level domain (e.g., example-petstore.com) 으로 세팅했기 때문에 이 3개의 도메인은 모두 같은 쿠키를 공유합니다.


Tracking Between a Domain and a Sub-Directory on Another Domain


흔히 발생할 수 있는 다른 하나의 일반적인 시나리오로는... 서로 다른 도메인에 있는 single domain 과 sub-directory 입니다. 아마 여러분의 웹사이트와 블로그 서비스의 sub-directory로 있는 여러분의 온라인 블로그에 대한 traffic 을 track 하고 싶은 경우 이 시나리오에 해당됩니다. 아래 샘플은 이 두 페이지들에 대한 tracking code를 어떻게 customization 해야 되는지를 보여 줍니다.



Main Website Domain: www.example.com

Blog URL: www.blog-hosting-service.com/myBlog


www.example-petstore.com 에서 shopping cart 웹사이트로 가는 form submission에 대해서는 _linkByPost() method 를 사용해서 shopping cart site 로 가는 HTTP POST 를 거쳐 방문자의 쿠키 데이터와 traffic을 받습니다. _setAllowLinker() method 는 target site를 가리키는데요, 일반적인 유저 세션 정보가 아닌 POST 데이터로 부터 쿠키 정보를 읽는데 사용됩니다. 이런식으로 하나의 도메인에서 다른 도메인으로 쿠키 데이터를 pass 할 수 있습니다. 그러면 여러분의 온라인 쇼핑몰에서 쇼핑카트로 가는 방문자의 세션을 그대로 유지할 수 있습니다.

이와 비슷하게 온라인 쇼핑몰에서 쇼핑카트로 가는 어떤 links 들에 대해서 visitor data를 transfer 하려면 _link() function을 사용하시면 됩니다.



Tracking Across iFrames


도메인들가의 transfer 가 있는 SIte 안에서 domain들이 새 윈도우에서 열리거나 iFrame으로 content 를 보여줄 수 있습니다. 이럴 경우 한 도메인에서 다른 도메인으로방문자와 campaign 쿠키를 transfer 하기 위해 _getLinkerUrl() method 를 사용할 수 있습니다. 예를 들어 여러분 페이지에 iFrame 이 있는데 여기에 www.my-example-iframecontent 에 호스트된 content 가 display 된다고 합시다. www.example-parent.com 에 있는 iFrame 의 parent page 로부터 방문자 정보를 transfer 하기 위해 iFrame 을 로드하는 Javascript 를 사용하고 쿠키안에 있는 정보를 _getLinkerURL() method 를 사용해서 pass 합니다.


다음 예제는 linking function 에 대해서만 다루는데요  cross-domain tracking이 두 도메인에 대해 tracking 정보 일부를 다루도록 configure 된 경우입니다.



Configuring iFrame Tracking for Internet Explorer

parent page 바깥의 다른 도메인에 있는 iFrame content 는 third-party content로 취급됩니다. Internet Explorer 6 이상의 버전에서의 디폴트는 first-party site에 third-party 웹사이트에 대해 first-party site에 쿠키를 저장하지 못하도록 합니다. 

이렇게 되면 iFrame된 페이지에 대해 Analytics tracking 을 하려면 Internet Explorer 에 대해서 별도로 특별한 configuration 을 해야 합니다. iFrame 에 있는 웹페이지에 대해 여러분은 privacy preferences configuration 을 해야 합니다. 아래 방법들 중 한가지를 사용해서 hosted page들에 대해 privacy preferences 를 셋업실 수 있습니다.

  • 포함된 site의 페이지에 대해 특별히 "Platform for Privacy Preferences" (P3P) HTTP header를 include 한다.
  • 포함된 site의 페이지에 대해 P3P XML manifest 를 제공한다.


좀 더 자세한 정보를 원하시면 아래 자료들을 참조하세요.


Tracking a Single Subdirectory


큰 도메인의 single sub-directory 에 대해 Analytics tracking 을 제한해야하는 경우도 있습니다. 두 가지 일반적인 상황을 예로 들어 보면요.

  • 오직 sub-directory 로만 access 합니다. 예를 들어 ecommerce hosting service 를 사용하는 경우가 되겠습니다.
  • sub-directory에 대해 제한적으로 tracking 하기를 원합니다. 예를 들어  Analytics tracking을 사용하는 회사 웹사이트에 project 를 launch 했을 경우죠.


블로그 서비스를 제공하는 큰 website host 의 일부분에 여러분의 블록가 있고 여기서 방문자 정보를 track 하는 Analytics account 에 대한 profile 이 있다고 가정합니다. 여러분의 사이트는 www.example.com/myBlog/ 같은 주소를 갖습니다. 다른 블로그들은 여러분의 블로그와 별도의 싸이트 입니다. 이 경우 그 블로그페이지와 그 sub-directory 에만 해당 정보를 필요로 하겠죠. 여러분 블로그에 대한 정보만 tracking 하도록 셋업하려면 여러분의 tracking code에 _setCookiePath() function 을 사용해야 합니다.


이렇게 한번 셋업 되면 오직 sub-directory 에 대한 visitor와 campaign 데이터만 display 될 것입니다. 그 이유는 쿠키 경로 때문인데요. 이 쿠키경로가 www.example.com 의 root directory 가 아닌 sub-directory로 세팅 됐기 때문이죠. 이렇게 되면 당신의 프로파일은 당신 쇼핑몰에 대해서만 유니크하게 쿠키를 셋업 할 것입니다.


이 시나리오에서는  _setCookiePath() function을 사용하는 것이 가장 좋은 방법인것 같습니다. 이렇게 하지 않으면 여러분 레포트에는 다음의 두가지 영향이 끼칠 겁니다.


  • Other Analytics account cookies set on www.example.com can be shared by your account.


    new 와 returning 같은 visitor statistics 들의 방문 시각과 방문 횟수가 다르게 나올 겁니다. 그리고 여러분의 방문자 세션 쿠키들도 www.example.com 의 다른 쇼핑몰에 영향을 줄 수 있습니다.

  • Your reports might reflect campaign details from another part of the site.


    예를 들어 방문자가 같은 도메인의 다른 사이트(www.example.com/theirBlog) 로 가는 email campaign 을 클릭했다고 합시다. 이 경우 방문자 쿠키의 referral 정보는 Latest News on Blogging이라는 이름의 campaign 으로 세팅 될 겁니다. 나중에 같은 방문자가 구글에서 검색을 해서 여러분 사이트를 구글에서 클릭을 하고 여러분 블로그의 어떤 물건을 구매했습니다. 검색 결과에 ad 와 email campaign 정보가 계속 붙게 될 겁니다. 이럴 경우 그 구매한 상품에 대해서는  Latest News on Blogging campaign 이 그 구매를 이끌었다고 기록 될 겁니다. 왜냐하면 여러분 온라인 쇼핑몰의 _utmz cookie 가 여러분 쇼핑몰 경로로 unique 하게 관리되지 않기 때문입니다.

여러분 쇼핑몰의 경로에만 방문자 쿠키를 제한하면 www.example.com 의 다른 곳에 있는 다른 쇼핑몰에 대한 캠페인과 세션은 여러분의 report 에 포함되지 않을 겁니다.

(웹브라우저와 쿠키에 대해 좀 더 알고 싶으시면 Cookies 를 참조하세요.)


Other Subdirectory Tips

  • 만약 여러분이 sub-directory 에 대한 visitor와 referral traffic 을 tracking 한다면 오직 그 sub-directory 에 대한 content 에 대해서만 적용 되도록 그 sub-directory 를 Include filter 에 셋업 하시고 싶을 겁니다. 좀 더 자세한 사항에 대해서는  pre-defined filter article 을 참조하세요.

  • 만약 여러분의 도메인에 sub-directory tracking 을 셋업하려면 Analytics tracking 이 root path (e.g. /)와 이 아래의 페이지들  에 대해 disabled 돼 있어야 합니다.  예를 들어 www.example.com/index.html 은 Analytics tracking 이 적용되지 않아야 합니다. (여러분이 subdirectory들을 별도로 track 하기를 원하는 경우). 만약 root path 에 대한 tracking 이 disable 되지 않았다면 한 페이지에 대해 두 종류의 쿠키가 세팅 될 겁니다. 하나는 subdirectory 이고 또 다른 하나는 top-level 도메인이 되겠죠.

Tracking Across Two Sub-directories on the Same Domain


한 도메인에 있는 여러개의 subdirectory 들을 track 하고 싶을 때도 있을 겁니다. 그리고 그 상위에 있는 (larger domain)에는 접근할 수 없는 경우입니다. 예를 들어 두개의 온라인 쇼핑몰과 쇼핑카트를 아래와 같이 가지고 있을 수 있습니다.

  • www.example-commerce-host.com/myStore/
  • www.example-commerce-host.com/myCart/




쇼핑몰에서 쇼핑카트로 가는 유저 세션과 campaign data를 track 하고 싶다면 이를 위해서는 두가지 방법을 사용해야 합니다.



아래 예제에서 쇼핑몰에서 쇼핑카트로 가는 유저 세션과 캠페인 데이터에 대한 track 을 할 수 있는 방법을 보여 줄 겁니다.


이 경우 유니크한 쿠키가 해당 도메인에 대해 세팅 될 겁니다. 제공된 첫번째 디렉토리에 대한 접근시 쿠키가 만들어 질 것이고 같은 쿠키 데이터가 두번째 디렉토리로 copy 될 겁니다. 왜냐하면 두개의 사이트 모두 같은 도메인에 있기 때문이죠. 이 두개의 디렉토리 간에 어떤 링크나 form data 와 관련해서 작업하실 필요가 없습니다.


Key Components to Cross-Domain Tracking


This section will help you troubleshoot your cross-domain tracking setup by providing detailed information on the key components and how best to use them.
이 섹션에서는 여러분의 cross-domain tracking setup 에 대하 troubleshoot 하는 것을 도와 줄 겁니다. 

Profiles

cross-domain tracking을 셋업 할 때 여러분의 프로파일에 아래 사항들을 제대로 수행했는지 한번 더 확인하세요.

  • Set up a master profile for your primary domain without filters.

    cross-domain tracking 을 하기 위해 우선 primary domain 에 대해 master profile 을 셋업할 것을 권고 합니다. 이 프로파일은 filter 없이 생성하세요. 이렇게 하면 primary domain에 대한 기본적인 historical data를 확보할 수 있습니다. 그래야지 여러분이 cross-tracking profile을 셋업하고 나서 에러가 있는지 없는지 확인할 수 있겠죠.


  • Create a profile especially for cross-domain tracking and re-use your tracking code.

    프로파일을 셋업하고 primary domain 에 대한 트래킹 코드를 retrieve 하고  난 후  다른 모든 웹 프로퍼티들에 대해 같은 트래킹 코드를 사용하세요. 이렇게 하면 configuration에 제대로 셋업 될 겁니다. 그리고 그렇게 하면 모든 웹 프로퍼티들에 대한 historical data 도 가질 수 있게 됩니다. master profile 에 대해 위에서 권고한 셋업을 했다면 마스터 프로파일에 있는 같은 트래킹코드를 사용해서 promary domain 에 대한 프로파일을 추가하는 것은 간단한 일입니다. 여러분이 lint 하기를 원하는 다른 모든 웹 프로퍼티들도 모두 같은 트래킹코드를 가지고 있어야 합니다.


  • Modify your cross-domain profile with a filter to show the full domain in your content reports.


    domain linking established 가 되고 나면 content reports 에 오직 URI request 만 보게 될 겁니다. 그리고 top-level 이나 sub-domain에 대한 request 는 안 보이죠. 예를 들어 다음 페이지들에 대한 visits 에 대해 알아보죠.

    http://www.example.com/index.php and another page on
    http://sub.example.com/more.php

    이 경우 report 는 아래와 같이 보여질 겁니다.

    — index.php
    — more.php


    어떤 페이지가 어떤 도메인에 속해 있는지 구분할 수 가 없죠. 페이지 report 에 domain 을 보이도록 하기 위해서는 page URL의 모든 components를 포함하는 filter를 세팅해 주세요.

    1. In the Profile Settings page, click the Add Filter link.
    2. Choose Add New Filter and provide the filter a name.
    3. Choose Custom Filter and select Advanced on the Filter type settings.
    4. Under Advanced settings:
      1. FieldA should be set to Hostname
      2. FieldB should be set to Request URI
    5. Set the values for both Field A and Field B to (.*), which is an expression that captures all characters.
    6. Set the Output To --> Constructor option to Request URI and provide $A1$B1 as the value for that choice.

    Your reports will now show:

    www.example.com/index.php
    sub.example.com/more.php

Cookies: Necessary to Transferring Visitor Data



두개의 도메인이 같은 visitor data(세션과 visitor type)를 공유하기 위해서는 같은 쿠키 정보를 copy 하거나 share 할 수 있어야 합니다. 그리고 아래 내용을 기억해 두세요.



A session from one domain can only be transferred to another domain via a properly configured click or form submission, or via _getLinkerURL.



이 3개의 methods를 통해 하는 쿠키 데이터 pass 는 single session 하의 두개의 페이지 뷰를 연결합니다. 즐겨찾기같은 것을 이용해서 만약에 유저가 두개의 사이트를 별도로 visit 한다면 (같은 프로파일을 tracking 하는 경우),  이 visits는 separate session으로 간주 될 겁니다. 이 시나리오에서는 linking methods 가 invoke 되지 않습니다. 그러므로 해당 유저에 대해 initiating session 을 할 방법이 없습니다.


cross-domain tracking을 제대로 이해하려면 쿠키가 여러 필드들에 의해 identified 되고 디폴트로 도메인들간에 share 하지 않는 다는 것을 잘 이해하면 도움이 될 겁니다.

디폴트로 cookie sharing 은 Analytics에서 자동으로 turn off 됩니다. 왜냐하면 많은 경우 도메인들강에 같은 쿠키를 sharing 하는 것은 바람직하지 않기 때문이죠. 

Cookie Reference에 있는 Significance of Cookie Identification and Expiration를 보세요. 또한 Analytics는 디폴트로 쿠키에 대한 integrity check를 추가합니다.


_setDomainName('yourDomainName')

What it does.
This method sets the domain field of the cookie to the string provided in the parameter. With this method, you can control the domain name used by the cookie. You will ONLY have to set up linking between top-level domains because sub-domains will share the same cookies with their parents.
When to use it.
Use this when you want to treat top- and sub-domains as one entity and track in the same profile. Also use this when you want to track across multiple top-level domains AND their sub-domains. In this case, you will need to using linking between the top-level domains, but not between the top-level domains and their sub-domains.
When not to use it.
If you are tracking a single domain, you do not need to explicitly set the domain name.



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


저의 경우에는 

www.example.com/except1

www.example.com/except2

www.example.com/except3

www.example.com/except4


이 중에 except1 만 별도로 관리하고 나머지는 다 같이 관리해야 하는데...


여기에 맞는 시나리오는 못 찾겠네요.


다시 한번 자세히 보고 방법을 찾아봐야겠네요....

반응형


반응형

나는 좀 아침을 일찍 시작하는 편이야.

5:30 분 쯤에 일어나거든. 그리고 법먹고 씻고 매일 한가지씩 공부 한개 하고 그리고 출근하면...

회사 오면 7시에서 7시 30분 쯤 돼.

퇴근은 5시 칼 퇴근이고.


한국에 있을 때도 8시까지 출근이면 대개 7시까지는 회사에 갔었던 것 같아.

남들 별로 없는 이른 아침 사무실에서 그날 하루 할 일을 정리 하는 시간이 제일 편하거든.


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


오늘은 아침 먹으면서 본 인터넷 기사중에 한겨례에 실린 글이 눈에 들어오더라구.

외신기자가 본 박근혜.




네덜란드 기자라지 아마?


Everybody needs to remain seated until her majesty has left ...

모두 폐하가 떠나시기 전까지 제자리를 지키고 있어야 한다...


Park Geun-hye is an absolute athlete in using words without saying anything. Trust & happiness, fuck yeah! Upgrade to a New Korea, fuck yeah!

박근혜는 별 말도 안하면서 그럴듯한 단어들만 구사하는데는 완전 선수다. 신뢰 & 행복, X까라 그래 씨X. 새로운 한국으로의 도약, X까라 그러라고 씨X.


Park Geun-hye on chaebols: she wants a fuller bath but get less wet... (expand pro's eliminate con's)

박근혜는 재벌 편이다: 목욕은 하고 싶은데 젖고 싶지는 않은... (달면 삼키고 쓰면 뱉는... 장점은 과장하고 단점은 감추고)


Lot of words used for describing she wants to fix stuff, but no single word on concrete policies. My bullshit alarm is overheating...

자신이 하겠다고 하면서 수많은 단어들을 나열하지만... 단 한 단어도 제대로 정책에 근거해서 나오지 않는다... 나 완전 머리 돌아 버리시겠다...


Listening to a long speech without any substantion in english by Park Geun-hye..

박근혜의 알맹이도 없는 긴 연설을 듣고 있다.


기사를 보면 또 이 기자는

김정은과 박근혜가 독재자의 자녀라는 것은 기본적 사실이다. 한국의 국제 이미지를 손상시킨다.

라고 아주 바른 말을 했군.


그리고 “박근혜는 일방통행로다” “적어도 문의 모습은 철의 여인 박보다 편안해 보였다” 고 평가.


Financial Times 의 Simon Mundy 기자도 “문재인의 기자간담회에서 방금 돌아왔다 - 그는 질문을 받기 위해 1시간 정도 머물렀다. 지난주 박근혜는 5개만(아마도 미리 선정된 것으로 보이는) 받았다” 고 언급.


이게 일반 상식을 가진 사람들의 지극히 당연한 평가 아냐?

뭐 사람에 따라 일부 박근혜를 지지할 수도 있지만 한국은 그런 사람들이 너무 많아.

정말 상식적이지 못한 사람들이 너무 많다는 얘기 아니냐구..


그게 한국의 수준이라고 밖에 얘기할 수 없는 현실이 너무 안타깝다.


이명박을 뽑고 또 박근혜를 지지하는 국민들이 아주 많은 나라.


한국 땅을 우리 한민족의 미래를 독재자의 아들 딸인 김정은, 박근혜에게 맡겨야 하나?


나도 여기서 외국인 친구들한테 한국에서 가장 장기집권을 한 독재자의 딸이 여당의 대선후보이고 현재 지지도도 제일 높다고 얘기하는 거 너무 쪽팔려...


있지 걔네들은 박정희를 세계 3대 독재자 중 한명으로 배우면서 큰 애들이거든......

박정희가 유신헌법을 강행하고 인혁당 재건위사건이라는 조작사건을 만들어 많은 사람을 재판 다음날 속전속결로 사형시켜버리고 할 때는 세계 최악의 독재자 중 한명으로 세계인들에게 각인 됐거든.



독재자 리스트 (영국자료)



우리 정신차리고, 남북한 모두를 독재자 일가의 통치하에 들어가게 하는 일을 막아보자고 제발

..


반응형


반응형
Insert and delete items in a selection list



리스트에서 아이템을 추가하거나 지우는 것은 jQuery 의 메소드를 사용해서 처리합니다. 예를 들어 append ()는 리스트의 끝에  아이템을 추가하고 remove () 는 그 메소드가 붙은 아이템을 제거합니다.


Adding and deleting items from the selection list


<!DOCTYPE html>

<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <option value=1> 1 bedroom </option>

      <option value=2> 2 bedrooms </option>

      <option value=3> 3 bedrooms </option>

      <option value=4> 4 bedrooms </option>

      <option value=5> 5 bedrooms </option>

    </select>

  </div>

</div>


</body>

</html>


<script>


$("select").append ("<option value=6> 6 bedrooms </option>");

$("option[value=1]").remove ();


</script>

tistory471_01.html








리스트의 첫번째 아이템은 지워졌습니다.  그리고 6 bedrooms는 추가 됐죠.

어쨌든 이 작업은 항상 완벽하게 동작하지 않을 수도 있습니다. 왜냐하면 elements 가 추가되거나 삭제될 때 jQuery Mobile 에 리스트가 아직 생성되지 않았기 때문이죠. 그러니까 이것이 HTML code 로 전환될 때 리스트에 우리가 추가하고 삭제한 것이 적용되서 만들어지게 되는 것이죠. 만약 리스트가 create 되고 난 다음에 이 추가나 삭제를 했다면 여러분은 여기에 추가적으로 selectmenu ("refresh", true) method 를 사용해야 합니다. 여기서 true value 는 파라미터처럼 전달이 되는데요 리스트를 rebuild 하도록 하는 겁니다.


Insert or remove items after the list creation


<!DOCTYPE html>

<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false>

      <option value=1> 1 bedroom </option>

      <option value=2> 2 bedrooms </option>

      <option value=3> 3 bedrooms </option>

      <option value=4> 4 bedrooms </option>

      <option value=5> 5 bedrooms </option>

    </select>

  </div>

</div>


</body>

</html>


<script>


$("select").bind ("selectmenucreate", function ()

{

  $("select").append ("<option value=6> 6 pièces </option>");

  $("option[value=1]").remove ();

  $("select").selectmenu ("refresh", true);    // true = forceRebuild

});


</script>

tistory471_02.html





반응형


반응형
Assign and retrieve the selected items in a selection list



Selection list already present in the HTML


selection list에서 select 된 값을 retrieve 하기 위해 <select> element에 jQuery 의 val () method 를 사용합니다. 그리고 새로운 selection 을 indicate 하기 위해 val (value)를 사용합니다. multiple-selection list 의 경우에는 value 는 값들의 배열입니다. (아무것도 select 되지 않으면 empty 입니다.)


Retrieve the values associated with selected items


<!DOCTYPE html>

<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

    <select data-native-menu=false multiple=multiple>

      <option value=1> 1 bedroom </option>

      <option value=2 selected=selected> 2 bedrooms </option>

      <option value=3 selected=selected> 3 bedrooms </option>

      <option value=4> 4 bedrooms </option>

      <option value=5> 5 bedrooms </option>

    </select>

  </div>

</div>


</body>

</html>


<script>


alert ($("select").val ());   // displays an array [2, 3]

$("select").val ([1, 2]);

alert ($("select").val ());   // displays an array [1, 2]


</script>


tistory470_01.html







Selection list dynamically created


val () and val (value) methods 는 selection list의 값을 retrieve 하거나 assign 하기 위해 사용됩니다. 그런데 아마 selection list 의 refresh 가 일어나지 않는 경우가 있을 겁니다. 이럴 때는 selectmenu ("refresh") method 를 사용할 필요가 있습니다.

jQuery 에서 리스트를 다이나믹하게 생성되는 것을 생각해 보세요. selectmenucreate event 와 selection list 에 새로운 값을 assign 하는 것을 보겠습니다.


Assign a value to a selection list dynamically created


<!DOCTYPE html>

<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

  </div>

</div>


</body>

</html>


<script>


var html = "";

html += "<select data-native-menu=false>";

html +=   "<option value=1> 1 bedroom </option>";

html +=   "<option value=2> 2 bedrooms </option>";

html +=   "<option value=3> 3 bedrooms </option>";

html +=   "<option value=4> 4 bedrooms </option>";

html +=   "<option value=5> 5 bedrooms </option>";

html += "</select>";


$("#home div:jqmData(role=content)").append (html);


$("select").bind ("selectmenucreate", function ()

{

  $("select").val (4);

  $("select").selectmenu ("refresh");

});


</script>


tistory470_02.html






만약 selectmenu ("refresh") instruction을 생략하면 이 리스트는 refresh 되지 않을 겁니다. 그러면 selected value 는 display 되지 않을 겁니다. (이럴 경우 리스트의 첫번째 값이 디폴트로 select 될 겁니다.)


다음 프로그램은 selectmenu ("refresh") instruction을 사용하지 않고 구현한 프로그램입니다.


Assign a value to a selection list without using selectmenu ("refresh")


<!DOCTYPE html>

<html> 

<head> 

  <meta name=viewport content="user-scalable=no,width=device-width" />

  <link rel=stylesheet href=jquery.mobile/jquery.mobile.css />

  <script src=jquery.js></script>

  <script src=jquery.mobile/jquery.mobile.js></script>

</head> 


<body> 


<div data-role=page id=home>

  <div data-role=header>

    <h1>Home</h1>

  </div>


  <div data-role=content>

    <span> Choose an apartment type: </span>

  </div>

</div>


</body>

</html>


<script>


var html = "";

html += "<select data-native-menu=false>";

html +=   "<option value=1> 1 bedroom </option>";

html +=   "<option value=2> 2 bedrooms </option>";

html +=   "<option value=3> 3 bedrooms </option>";

html +=   "<option value=4> 4 bedrooms </option>";

html +=   "<option value=5> 5 bedrooms </option>";

html += "</select>";


$("#home div:jqmData(role=content)").append (html);

$("select").val (4);


</script>


tistory470_03.html



이 경우에는 selectmenucreate event 를 사용하지 않습니다. 그래도 작동을 합니다. selection list 에 값이 assign 될 떄 리스트는 아직 생성되지 않았습니다. 그래서 최종 display 되기 전에 수정될 수 있는 겁니다. selectmenucreate event 에서 동작할 때는 리스트가 생성된 이후였습니다. 그래서 어떤 변화가 있으면 refresh 가 필요한 겁니다.



반응형


반응형
Posted on . Written by


오늘의 guest tutorial 은 Omid Ahoural 의 두번째 글 입니다. ArdentKid 라는 별명으로 불리는 inDie Game Developer 입니다. 지난 2년간 Omid는 코로나를 접해 왔습니다. 그리고 그가 참여한 첫번째 앱인 "Balloon Bazooka" 의 출시를 앞두고 있습니다. 그는 또한 Corona 강좌를 제공하고 있기도 하구요. 그의 블로그 www.ardentkid.com에 가시면 보실 수 있습니다.



Optimizing Transitions


이제 곧 나올 저의 게임 퍼포먼스를 올리기 위해서 game sprite들에 좀 더 효율적인 transition을 사용하기로 했습니다. TimeSpaceMagic 같은 library들을 찾을 수 있었는데요. pause 와 time-warping 관련한 겁니다. 이 라이브러리들은 모두 transition property들인 at Runtime을 calculate 하는데요 작업하는데 꽤 힘든 일 입니다. transition이 항상 같다면 이런 작업은 필요 없겠죠.


그래서 저는 AK-Tween 을 만들었습니다. predetermining transitions 과 그것들을 at Runtime 에 manually 적용하는 겁니다. 다른 것들을 벤치마크해서 다른 Runtime transition 접근법보다 (제가 찾은 가장 efficient 한 방법보다도) 20% 정도 빠르게 동작하도록 만들었습니다. 이 라리브러리의 alpha 버전은 AS3의 GTween을 바탕으로 해서 쉽게 만들 수 있었습니다.  그러니까 이 라이브러리는 그 결과가 코로나의 transition easing 과 비교해도 비슷할 만큼 쉽게 만들었습니다. (아래 iPhone4 테스트 결과를 보세요.)


The Core Idea


“AK-Tween”  의 계산(calculates) 는 table이나 배열에 저장된 값들에 의해 load time (Runtime이 아닌)에 일어납니다. 그리고 그 값들이 필요하면 custom Runtime function을 사용해서 iterate 합니다. 아래에 배열값을 return 하는 tween calculation code 의 일 부분이 있습니다. 한 눈에 보시고 이해하실 수 있도록 간략하게 만들었습니다.


--AKtween.lua
local function tweenCalc( config, anim )

  local time = config.time or 1000
  local ease = config.ease
  local totFrames = 0.06 * time --frames at 60FPS

  local step = 1/totFrames

  if ( ease == "outQuad" ) then

    for i=1,totFrames do
      pos = pos + step
      local index = i +startArr
      local ratio = -pos * (pos-2) arr[index] = from + (ratio * delta)
    end

  elseif ( tween == "inQuad" ) then
    ...

  end

  return arr
end



아래는 이 tween 을 실제로 set up 하는 부분입니다. (예제로 공이 튕기는 것을 구현하겠습니다.)


--CREATE TWEEN FOR BALL BOUNCE
local AKtween = require( "AKtween" )

local ball = display.newImage( "ball.png" )

local bounceTween = AKtween:newTween( {time=400, y=-120, ease="outQuad"} )
--bounceTween.yArr = [-4.79, -4.58, -4.37, -4.16, -3.95 ...
-0.83, -0.625, -0.416, -0.20, 0]
--#bounceTween.yArr = 24

bounceTween:append( {time=400, y=0, "inQuad"} )
--bounceTween.yArr = [-4.79, -4.58, -4.37, ...
-0.416, -0.20, 0, 0.20, 0.416 ... 4.37, 4.58, 4.79]
--#bounceTween.yArr = 48

ball.yBounceArr = bounceTween.yArr --JUST GET THE Y-VALUES,
--bounceTween:apply( ball, "bounce" )
--OR ALLOW AKTWEEN TO HANDLE THE WHOLE ANIMATION
 

이렇게 하면 y=0 to y=-120 까지 볼이 튀어 올라가고 다시 내려올 겁니다. 그 움직임은 quadratic ease를 사용해서 자연스러울 거구요.  시간은 400ms 가 걸릴겁니다. (24 frames at 60 fps). 우리가 한 일은 마지막 줄에 :apply() function을 call 한 것입니다. 그리고 이 tween을 AKtween 에 의해 제대로 컨트롤 되게 하기 위해 ball:playTween(“bounce”)를 사용했습니다. 이것과 똑 같은 일을 할건데요. 라이브러리에서 생성된 y-value array만 사용해 보겠습니다.

그러니까 ball.yBounceArrpredetermined y-values가 저장돼 있는 거죠. Runtime ball:bounce() script를 set up 하기만 하면 됩니다.


function ball:bounce()
local yVals = self.yBounceArr
  local totFrames = #yVals
  local curFrame = 1

  --RUNTIME SCRIPT, OCCURS ON EVERY FRAME
  local function frameCount()
    if ( curFrame <= totFrames ) then
      self:translate( 0, yVals[curFrame] )
      curFrame = curFrame+1
    else
      curFrame = 1
    end
  end

  --SAVE REFERENCE TO RUNTIME FUNCTION, AND BEGIN
  self.bounceFC = frameCount
  Runtime:addEventListener( "enterFrame", frameCount )

end


 


불이 튕기기를 원하면 언제든지 ball:bounce()를 call 합니다. 그러면 frameCount라고
하는 local Runtime script 를 setup 합니다. 이는 frameCount는 각 프레임마다 공에
새로운 y의 위치값을 세팅할 겁니다.

이 reference는 또한 ball.bounceFC에도 저장돼 있습니다. 이 ball.bounceFC
튕기는 것을 pause, resume, or stop할 수 있게 합니다.


function ball:pause()

  if ( self.bounceFC ) then
    Runtime:removeEventListener( "enterFrame", self.bounceFC )
  end
end

function ball:resume()
  if ( self.bounceFC ) then
    Runtime:addEventListener( "enterFrame", self.bounceFC )
  end
end

function ball:stop()
  if ( self.bounceFC ) then
    Runtime:removeEventListener( "enterFrame", self.bounceFC )
    self.bounceFC = nil
  end
end

manual way 는 regular transition 보다 implement 하는데 더 어렵습니다. 하지만
자신만의 animation property들을 사용해서 원하는 결과를 정확히 만들어 낼 수
있는 장점이 있죠.

performance 측면에서도 아주 효율적입니다. 또한 pause-enabled 하구요.
저의 dynamic sprites implementation과 같이 사용하면 게임이 아주 자연스럽게 움직일
겁니다.


Benchmark Results



아래가 이 메소드를 사용한 후의 benchmark result 입니다.
두 매뉴얼과 AKtween play function 들은 아래와 같이 주목할 만한 결과를 보여 줍니다.


요약하자면 우리는 우리의 object들을 transitioning 하기 위해
underlying alternate method를 정의했습니다.
이러한 benchmark는 이 메소드가 아주 효율적이라는 것을 증명했구요.
우리는 그냥 단순히 배열에서 값을 읽어서 이것을 해당 object property 에 적용하는
일만 합니다.

이러한 작업은 AKtween juggler에 object를 pass 함으로서 그 기능을 사용하게 됩니다.
혹은 local runtime script를 추가하거나 제거함으로서 애니메이션을 전체적으로 control
할 수 있습니다.

두 방법 모두 AKtween을 사용하시면 됩니다. 이것이 여러분 앱 개발에 도움이 될 수
있는지 잘 확인해 보세요.




반응형


반응형
Posted on . Written by


Team Corona,


오늘 아침 more funding을 발표 했습니다. 3년전 우리들의 original funding 이 얼마였는지를 생각하면 내년도에는 우리가 무엇을 하고 있을까에 대해 extremely excited 해 집니다.


그 마음으로 Corona가 가는 방향에 대해 여러분과 간략하게 공유하고 싶은 것들이 있습니다.

첫번째로 리더와 follower가 있습니다. 그리고 나중에는 많은 경쟁자들로부터의 많은 attention이 있습니다. 여러분 모두에게 감사드립니다. 코로나는 이제 market leader 입니다. 지금 world 는 지금 우리가 하고 있는 것들을 imitate 하고 있는 동안 우리는 world 가 어디로 가야할 지에 focus를 맞추고 있습니다.


초기에 우리는 여러분들이 앱을 만들 수 있어야 된다고 믿었습니다. 그리고 여러분들은 코로나와 함께 next hit app을 만들 수 있다고 믿었습니다. 그리고 몇년 후인 지금 우리는 indies 부터 studios 까지 그리고 10대들 부터 80대(octogenarians) 까지 모든 개발자들이 사용할 수 있는 유일한 모바일 플랫폼이 됐습니다.



게다가 우리는 끊임없이 개선하고 발전해 나가고 있습니다. platform을 만드는 것은 정말로 어려운 일입니다. 왜냐하면 만드는 것 자체로 끝나는 게 아니거든요. 이것을 재빠르게 adapt 해야 합니다. 예를 들어 iOS 6 가 나왔을 때 GameCenter orientation 같은 애플 버그(Apple bugs)에 저희들은 재빠르게 대처해 나갔습니다. 그리고 iPhone 5 가 나왔을 때 여러분들이 이 새로운 기기에 맞게 어떻게 앱을 만들어야 하는지 대처방법을 제공한 유일한 platform 이었습니다.


저는 한달이 지난 지금에야 우리의 경쟁자들이 이러한 작업을 하기 시작하는 것을 보게 됩니다. 그 동안 industry 는 계속 변해가고 있습니다. 그리고 우리가 유일하게 그것을 따라가고 있습니다. iOS 6.1 Beta 1 이 나왔을 때 저희들이 유일하게 이를 위한 device build 를 가능하도록 했습니다. 애플이 그것을 release 한 바로 다음날에요.


앞으로를 보죠. 저희들은 여러분들에게 선 보일 여러 기능들이 pipeline에 가지고 있습니다. 아래 내용들이 그중 일부분 입니다.

  • New graphics engine: shaders + image filters + augmented reality + full blending modes + more
  • Add-ons: lots more 3rd party services and monetization options
  • Going beyond gaming: from next-generation widgets to web-based technologies


이것 외에도 여러가지 것들이 곧 발표를 기다리고 있습니다. 우리는 higher standard를 지향하고 있습니다. 여러분들께 약속 드립니다. 설익은 빵을 여러분들에게 제공하지 않겠습니다. 온전한 기능들을 그리고 higher standard를 제공해 드리겠습니다. 저희들은 항상 higher 를 aiming 하고 있습니다.


매일 저녁 저는 집으로 가는 길에 Computer History Museum 을 지나갑니다. 그리고 10여년 후에 사람들이 하는 얘기들을 상상합니다. 그 말 중에는 지금 우리들이 하는 일들도 있을 겁니다. 우리 팀과 여러분들이 만들어 나가는 이 일들도 있을 겁니다. 우리는 같이 software 의 pantheon을 만듭니다.


우리는 같이 역사를 만들고 있습니다.


Walter



==== 개인적으로 Corona SDK 를 접한지도 2년이 됩니다. Corona SDK 는 태어난지 3년이 됩니다. Corona SDK 자체로도 편리하고 아주 유용하지만 그것을 만들고 운영해 나가는 조직이 활기차고 젊고 열정적입니다. Walter는 지금 Corona SDK의 CEO 입니다. 그와 그 팀들 그리고 저를 비롯한 수많은 Corona SDK 가 진짜 역사를 만들것을 믿습니다. 저는 지금 회사에서 다른 Web App 프로젝트에 참여를 하고 있어서 Corona SDK 작업은 하고 있지 않지만. 계속 새로 나오는 소식, 새로 나오는 기술들을 제 블로그에 정리하면서 때를 기다리고 있습니다.

그리고 이 정리하고 있는 글들이 관심있는 한국분들에게 조금이라도 도움이 되면 좋겠습니다. ===




반응형


반응형
Posted on . Written by


코로나에서의 안드로이드 notification 에 대해 새로운 소식을 전해 드리기로 했죠. 그리고 안드로이드와 iOS 의 notification 은 완전히 다른 거라서 cross-platform development가 얼마나 어려운 건지를 이 기능이 잘 보여준다고 말씀 드렸구요.



만약 우리가 iOS 플랫폼을 위해서만 개발을 했다면 이런 기능들을 아주 빨리 추가하고 다른 일들도 빨리빨리 진행 해 나갔을 겁니다. 하지만 우리는 Android 도 지원을 하고 있습니다. 그 외에도 desktop app 이나 Corona Simulator 에서 동작할 수 있도록하는 작업도 해야 되구요. 그리고 사실 Mac 과 윈도우에서도 동작하도록 하는 작업도 하고 있습니다.


The ‘I’ in API


이 4개의 OS들 중 안드로이드 부분이 일 진행이 가장 더딥니다. 내부적으로 우리끼리 통하는 룰이 있습니다. 안드로이드 관련 작업은 최소한 5~10배는 더 다른것들보다 소요 된다구요. 거기에는 두가지 원인이 있습니다.


첫번째로 안드로이드에는 mulriple (forked) flavor들이 있습니다. 게다가 standard Android (Google Play) 이외에도 Kindle 과 NOOK 이 있구요 여기에도 각각 자신들의 앱 스토어가 있습니다. 이런 이유 때문에 같은 버전이라도 모든 안드로이드 디바이스들에 맞게 다르게 작업을 해야 하는 부분들이 있습니다. 일례로 OpenGL device driver 가 각 디바이스별로 다른 performance 를 보여주기 때문에 별도로 작업을 해야 했습니다. 여기에 여러 다른 서비스들이 있죠. 예를 들어 maps, in-app purchase, notification 등등이요. 이런 서비스들도 서로 완전히 다릅니다. 이런 서비스들에 어떤 변화가 오면 서로 다른 OS들은 물론 같은 OS라도 서로 다른 device 별로 개발과 테스트를 따로 해야 됩니다.



두번째로는 Android API는 그렇게 충실하지 못합니다. 어떤 경우에는 API 자체에 잘못된 부분도 있지요. 하지만 그것보다도 저는 API design 자체가 충실하지 못합니다. 제 생각에 API 의 I 는 interface 대신 interaction 으로 해야 더 맞다고 생각합니다. 그 이유는 개발자가 이 것들과 interact 해야만 하니까요. iOS API 는 NextStep에서 온 오리지널 MacOS API 가 개선된 걸 겁니다. 그러니까 이 API는 10 수년간 다듬어 진 것이지요. 그리고 오랜 기간동안 다듬어진 것처럼 보이기도 합니다. naming 과 API 의 semantic이 일관성있게 만들어 져 있습니다.



반면에 안드로이드는 새로 만든 API 입니다. 그리고 아주 좋은 API라고 할 수는 없습니다. 우리는 안드로이드 API 중에 awkward한 API를 아주 많이 봤습니다. 그리고 85% 정도만 설명이 돼 있고 15% 부족한 부분도 많이 봤습니다.


예를 들어서 안드로이드에서 multitouch 를 implement 할 때 많은 장애물들을 뛰어 넘고 나서야 각각의 touch들을 identify 할 수 있었습니다. 화면에 손가락이 touch 됐을 때 그 터치 이벤트가 터치되고 move 되고 화면에서 떼어질 때까지 같은 id를 갖고 있어야 합니다. multitouch 에서는 이 부분이 아주 중요하죠. 여러 터치 이벤트 들을 서로 구분해야 하니까요. 하지만 안드로이드의 MotionEvent 에서 이 id 들은 unique 하지가 않습니다. 그래서 저희들은 저희들의 방법을 따로 만들어야 했습니다.




Android notification infrastructure (or lack thereof)


안드로이드를 상대로 일을 할 때 우리만의 방법을 만들어 내야만 하는 경우는 이제 저희들에게는 일반적인 것으로 받아들여 집니다. 그리고 안드로이드의 notification을 만들 때도 마찬가지로 저희 팀은 저희들만의 방법을 만들어서 부족한 부분을 메꾸어 넣어야 했습니다. 우리가 iOS 에서 한 것과 비슷하게 안드로이드에서도 기능하도록 하기 위해서 저희들은 여러 scaffolding 을 만들어야 했습니다.


예를 들어 Corona API 에서는 notification을 schedule 하는 기능이 있습니다. iOS notion 에서는 단 한줄로 이 기능을 사용할 수 있었습니다. 그런데 안드로이드에서는요... 그렇게 쉽지는 않았습니다. 거기에는 schedule notification 기능이 없었습니다. 그래서 저희들이 그 기능을 만들어 넣어야 했지요.


이 부분은 그렇게 큰 문제는 아니었습니다. 정말로 큰 문제는 안드로이드가 자신의 notification을 관리하기 위해 app에 요구하는 것들이었습니다. 즉 앱은 notification work을 만들기 위해 여러 가지로 관리되어야만 합니다. 특히 앱이 background로 돌아갈 때나 강제로 앱이 exit 됐을 때 혹은 phone 이 reboot 될 때 등입니다. None of these come out of the box.


여러분의 앱이 background로 돌아갈 때 (예를 들어 back button을 눌렀을 떄) scheduled notification은 시간이 되면 나타나야 합니다. 여러분이 앱을 강제로 종료했을 때 schedule 된 notification은 나타나지 않을 겁니다. 이게 안드로이드의 limitation 입니다. OS 가 제공해야 되는 기능인데 제공하지 못하고 있는 거죠.


다른 경우는, 여러분이 앱을 강제로 종료했거나 phone을 reboot 했다면 notification은 status bar 가 사라지면서 그 자리에 나타날 겁니다. 왜냐하면 notification은 앱과 연결돼 있고 OS 에서 globally reside 되지 않기 때문이죠. 그래서 우리가 무엇을 했는가 하면 이 notification을 persist 하도록 한 겁니다. 그래서 앱을 relaunch 하면 이 notification들은 status bar 안에 다시 나타나게 됩니다. 메일 앱에서의 기능이랑 비슷한 거죠.


무슨 의미냐 하면 notification이 scheduled 되면 이 notification들은 오직 앱이 foreground 이거나 background 일 경우에만 나타납니다. 그리고 만약 그 앱이 강제 종료 됐거나 phone 이 reboot 됐다면 그 notification은 나타나지 않는 겁니다.


status bar 에 나타나는 notification이 흥미로운 부분입니다. 왜냐하면 애플리케이션은 status bar에 나타나는 자신의 notification을 manage 해야하거든요. 왜냐하면 메일 앱이 하는 것처럼 우리가 그 notification을 persist 했으니까요. 유저가 tap 하게 되면 status bar에 있는 notification을 clear 혹은 remove 시켜야 합니다. 그래야지 persistence data가 제대로 sync'd 되니까요.


그 위에 저희들은 안드로이드에 unique 한 것들을 몇개 추가했습니다. 코로나의 디폴트 notification icon 대신에 여러분의 custom icon을 넣을 수 있도록요. 그리고 iOS notification에 익숙한 분들을 위한 몇가지 기능들도요. 그리고 custom notification sound 같은 것들도...



이런 것들은 모두 나름대로의 trick 을 사용한 겁니다. 하지만 제대로 동작을 하죠. 저희들은 standard Android, Kindle, NOOK 에서 돌아가는 notification system 을 만든 겁니다.


이런 작업들이 안드로이드에 remote push notification 기능을 코로나에서 지원하도록 하기 위해 한 작업들 입니다. Google Play's service (Google Cloud Messaging)들은 standard Android device에서만 제공된다는 것을 유의하세요. 


==== 원문은 저 위의 제목에 달린 링크를 따라 가시면 나옵니다. 이해가 안되게 번역이 됐거나 잘 못 번역이 된 것은 다 제 실력이 모자라기 때문입니다. 필요하시면 저 링크를 클릭해서 원문을 참조하세요. ===

반응형