프로그래밍/FLEX2009. 10. 29. 13:41

트라이블 사이트에 저장된 사진을 앨범단위로 일괄 다운로드할 수 있는 어플리케이션을 개발했다.
서버사이드는 AMFPHP로, 클라이언트는 FLEX로 만든 AIR 어플리케이션이다.


트라이블 : http://www.tryvel.com/
다운로더 설치 : http://www.tryvel.com/downloader.html


* 로그인
 흥미로운점은 쿠키를 이용한 로그인유지가 가능하다는 점이다..
amfphp의 서비스클래스에서 쿠키를 기록하면 어플리케이션이 종료되기전까지 그 쿠키가 유지된다..
잘못했으면 SharedObject로 구현할뻔 했다.....;;
(SharedObject로 로그인을 구현하면 서버에 앨범과 사진목록을 요청할때마다 SharedObject객체의 멤버를 확인해서 보내고, 서버에서 체크하고.. 이런 노가다를 해야한다. 쿠키를 사용하면 서버에서는 쿠키에서 정보를 가져다쓰면 된다..)

* 자동업데이트
 웹어플리케이션과 달리 데스크탑어플리케이션의 가장 큰 문제가 업데이트이다.
타 플랫폼에서야 업데이트에 관한 많은 문서가 있지만, AIR어플리케이션의 업데이트에 관한 내용은 거의 찾을 수가 없다.
다행히 구글링중 다음의 포스트를 찾을 수 있었다.
http://www.weblind.com/101

 어플리케이션이 실행될때 서버의 업데이트를 자동으로 체크하고 업데이트버전이 있다면 설치를 묻는 다이얼로그가 나오는게 업데이트의 이상적인 과정이라고 생각하는데...
이렇게 구현하려면 어떤부분을 손대야할지 몰라 처음에는 다 포기하고 [업데이트 확인]버튼을 넣어 클릭시 checkNox()메소드를 호출하도록 했었다.

 그러다가 update-config.xml의 설정을 하나씩 체크해보니 방법을 알게되었다. (방법은 직접 찾으시길 ^^)
어플리케이션이 실행될때 업데이트를 체크하는 부분은 이벤트 핸들링으로 해결했다.

* Badge를 이용한 웹에서의 자동설치
 아직까지 AIR 어플리케이션이 많지 않은 상황이라 Adobe Air 런타임이 설치되지 않은 피씨가 많다.
Adobe Air가 없다면 어플리케이션을 배포해도 무용지물인데... 배포할때 가장 좋은 방법이 Badge를 사용하는것이다.
네이버의 FlexComponent카페에 다음글을 보면 바로 적용할 수 있다.
http://cafe.naver.com/flexcomponent.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=10892

* 아이콘 만들기
 바탕화면이나 어플리케이션창의 아이콘은 Clockmaker Icon Generator를 사용해서 만들었다.
이것 역시 Air Application이다..
http://file.naver.com/pc/view.html?fnum=204507&cat=30


그 외 목록이나 다운로드 등은 기본 기능이니 생략 ^^



로그인

로그인이 제대로 되었다면 로그인창이 닫히고 다운로더가 열린다.

앨범명을 선택하면 앨범에 속한 파일리스트가 뿌려진다.

다운로드버튼을 클릭하면 저장할 폴더를 물어본다.


새폴더를 하나 만들고

확인버튼을 누르면 다운로드 시작

현재다운로드중인 파일명과 미리보기이미지, 전체용량과 다운로드한 용량이 표시된다.

다운로드 완료

어플리케이션을 실행하고 서버에 새버전이 있다면 업데이트여부 확인창이 뜬다.

Download now 버튼을 누르면 다운로드 후 어플리케이션을 재설치한다. (uninstall 후 install 하는것으로 보여짐)
Posted by 열태
프로그래밍/Javascript2008. 1. 17. 11:22
The Write Less, Do More, Javascript Library

위의 문구는 jQuery 사이트의 타이틀입니다. 코딩은 적고 더욱 많은 걸 할 수 있다는.... jQuery에 대한 제대로 된 정의가 아닐까 싶습니다.

* 참고 : http://www.jquery.com/, http://visualjquery.com

 

- 제가 정의한 jQuery는 "DOM 접근과 컨트롤이 용이한 DIY 툴"입니다.

 

DOM 접근 방법

 - Example

<html>

<head>

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>

 

<script type="text/javascript">

 

$(document).ready(function() {

           $(".menu").css("cursor", "pointer");

           $(".menu").click(function () {

                     var index = $(".menu").index(this);

                     $(".menu").css("font-weight", "normal");

                     $(".menu:eq("+ index +")").css("font-weight", "bold");

                     alert("Menu" + (parseInt(index)+1) + " 클릭되었습니다.");

           });

           $("#header").hide("slow").fadeIn(1000,function () {

                     alert("Menu를 클릭하세요.");

           });

          

});

</script>

</head>

<body>

<div id="body">

           <ul id="header">

                     <li class="menu">Menu1</li>

                     <li class="menu">Menu2</li>

                     <li class="menu">Menu3</li>

           </ul>

</div>

</body>

</html>

 

* 코드 설명 

$(document).ready(function() {});

- 페이지 로딩이 완료되면(준비되면) function을 실행

$(".menu").css("cursor", "pointer");

- 클래스명이 menu인 모든 Element css cursor: pointer; 를 준다.

$(".menu").click(function () {}

- 클래스명이 menu인 모든 Element를 클릭했을 때 function을 실행

var index = $(".menu").index(ele);

- 클래스명이 menu인 모든 Element ele 객체에 해당하는 인덱스 번호를 index에 담는다.

$(".menu:eq(0)").css("font-weight", "bold");

- 클래스명이 menu인 모든 Element중 첫번째 객체의 css font-weight: bold; 를 준다.

$("#header").hide("slow").fadeIn(1000,function () {

});

- 아이디가 header Element를 천천히 사라지게 하고, 1초 후 나타남 -> 완전히 나타난 후 function이 실행

jQuery는 위의 예처럼, DOM에 접근하기 위한 다양한 Selector를 제공합니다.
자세한 내용은 위에 링크 걸려있는 jQuery공식사이트나 visualjquery.com에서 확인하세요.

Posted by 열태
프로그래밍2008. 1. 14. 11:37
구글맵 API에서 제공하는 맵타입에 Terrain이 추가되었습니다.
(작년부터 제공한것 같은데.. API에 들어있는걸 이제 알았다는.. ㅠㅠ)

구글맵 API를 이용해 지도를 그리면 기본으로 Terrain이라는 맵타입 버튼이 생성되지 않습니다.

버튼을 만들려면 다음처럼 맵타입을 추가해줘야 합니다.

var map = new GMap2(document.getElementById("map"); // 구글맵을 아이디가 map이란 영역에 그립니다.
map.setCenter(new GLatLng(48.858638763428, 2.2951800823212), 12); // 지도 중심 이동 (프랑스 파리입니다.)
map.addMapType(G_PHYSICAL_MAP); // 맵타입에 Terrain을 추가합니다.
map.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT)); // 버튼을 화면의 우상단에 추가합니다.

기본지도나, 위성지도만큼의 줌배율은 제공되지 않지만 상대적으로 깔끔하네요..

우리나라는...... 역시 "South Korea"라는 글자 외에는 아무것도 없네요.. ㅠㅠ
언제쯤 우리나라도 지원될까요....
아직까진 구글코리아에서 개발에 투자할만한 여력이 없는걸까.....
Posted by 열태
프로그래밍/PHP2007. 9. 7. 10:03
ASP, .NET, JAVA 등의 개발언어에서는 Application Scope Variable 설정이 가능합니다.
ASP등의 MS계열의 global.asa(global.asax 등)라는 파일에 포함된 변수들은 어플리케이션 전체에서 Superglobal(슈퍼전역변수)로 사용할 수 있습니다.

한데, PHP에는 global.asa와 같은 설정파일이 정해져 있지 않습니다.
때문에 어플리케이션 내의 모든 파일에서 공통적으로 사용할 변수들을 설정하기 위해서는 모든 파일에 해당 파일을 include하거나 코딩해 넣어야만 합니다.

그렇다면 PHP에 정말 Application Scope Variable을 지정할 수 없을까요?
검색사이트를 통해 여러가지 방법을 찾아봤지만 명확하게 설명되어 있는 곳이 없더군요..
다른 언어에서 지원되는게 PHP에 없을리가 없다라는 믿음으로 php.ini 파일을 열어봤습니다.

과연 PHP!!
다음과 같은 부분이 있습니다.

; Automatically add files before or after any PHP document.
auto_prepend_file =
auto_append_file =


간단한 영문이라 해석이 가능하죠?
말 그대로 PHP 문서의 앞 또는 뒤에 자동으로 추가할 파일들입니다.

일반적으로 모든 문서에서 공통으로 선언할 변수들은 문서의 앞에 들어오게 되니 auto_prepend_file 부분에 추가하면 됩니다.

/home/common/global.php

<?php
$GLOBAL[BLOG_URL] = "http://etyoul.tistory.com";
$GLOBAL[POST_ID] = 13;
?>


위와 같은 global.php파일을 모든 문서에 포함하고 싶으면 아래와 같이 수정하시면 됩니다.
auto_prepend_file = "/home/common/global.php"



다시 말하면 위의 변수를 사용하기 위해 문서내에 <? include("/home/common/global.php"); ?>를 작성할 필요가 없다는 것입니다.
문서가 많다거나 호스트가 여러개이거나 디렉토리가 복잡한 사이트에서 설정을 추가하거나 수정해야 할 상황에서 유용하지 않을까 생각됩니다.
Posted by 열태
프로그래밍/PHP2007. 6. 28. 14:44

닷넷에는 닷넷프레임웍에 캐시기능이 있어서 관리를 쉽게 할 수 있다는 얘길 듣고...
php쪽에도 있지 않을까 싶어 찾아봤다...

바로~ 설치중...

혹시나 해서 php.ini에서 찾아봤지만 없길래 봤더니.. 번들로 포함되지 않는다는.....
http://pecl.php.net/package/apc


아래의 방법은 예전 방법인 모양.....
INSTALL의 내용대로 하니 설치 성공

CVS Instructions
----------------
Building from CVS can be done like this:

  cvs -d :pserver:cvsread@cvs.php.net:/repository login
  Password: phpfi
  cvs -d :pserver:cvsread@cvs.php.net:/repository co pecl/apc
  cd pecl/apc
  phpize
  ./configure --enable-apc-mmap --with-apxs --with-php-config=/usr/local/php/bin/php-config
  make
  make install

  extension=apc.so
  apc.enabled=1
  apc.shm_segments=1
  apc.shm_size=128
  apc.ttl=7200
  apc.user_ttl=7200
  apc.num_files_hint=1024
  apc.mmap_file_mask=/tmp/apc.XXXXXX
  apc.enable_cli=1

Posted by 열태