'분류 전체보기'에 해당되는 글 256건

  1. 2008.01.10 XML-RPC의 이해 01 1
  2. 2008.01.10 Daum openAPI개발에 필요한 JAR파일
  3. 2008.01.10 다음 openAPI 시작하기 3
  4. 2008.01.10 openAPI를 시작하면서
  5. 2008.01.10 생각을 바꾸는 패턴 2
  6. 2008.01.05
  7. 2008.01.05 [javascript sample] innerHTML 반대!~
  8. 2008.01.04 Array에 관한 집합
  9. 2008.01.03 [javascript sample] Array?
  10. 2008.01.03 [javascript sampel] undefined? 1

XML-RPC의 이해 01

openAPI 2008. 1. 10. 21:33

XML-RPC를 이해해야만이 보다 수월하게
본 openAPI를 이용할 수 있습니다.
그래서 먼저  XML-RPC에 대해 선수학습을 수행하도록 하겠습니다.


XML-RPC란 무엇인가?
 > HTTP를 통한 간단하고 이식성 높은 원격 프로시져 호출 방법입니다.
XML-RPC는 Perl, Java, Python, C, C++, PHP 와 그 외 다른 많은 언어로 사용할 수 있으며 Unix, Windows, 그리고 Macintosh에서 실행할 수 있습니다.


XML-RPC는 어떻게 작동하는가?
 > 아래그림에서 보듯 XML-RPC는 외부로부터 우입받은 데이터를 XML로 제가공을 합니다.
내부적으로 가공한 XML은 리모트 HTTP서버에 자신이 생성한 XML정보를 전송합니다.
물론 수신측에서도 이에 상응하는 받을 준비를 해야겠죠.
이때 우리는 보내는 쪽을 client라고 설명을 하고 있고 받는쪽을 server라고 총칭합니다.

사용자 삽입 이미지
바로 위 시접에서 우리는 왼쪽에 있는 데이터를 전송하는 작업을 진행하면 되고 openAPI를 제공
하는 서버측에서는 이에상응하는 method 만들어 놓고 넘어올 데이터 맞이할 준비를 하고 있습니다.

우리가 만들어야 하는 모듈은 client모듈을 만들어야 하는 미션이 수행해야하는 과제인데요.
일반적으로 client모듈을 생성할때 XmlRpcClient 를 사용하게 됩니다.


아래는 KLDPwiki 에서 제공한 소스코드입니다.
http://wiki.kldp.org/wiki.php/DocbookSgml/XML-RPC-HOWTO#XMLRPC-HOWTO-INTRO


import java.util.Vector;
import java.util.Hashtable;
//import helma.xmlrpc.*;
import org.apache.xmlrpc.*;  // helma.xmlrpc.* -> org.apache.xmlrpc.* 로 변경, 2004.1.26, thkim86@하나포스.com

public class JavaClient {

    // The location of our server.
    // 아래의 서버프로그램을 로컬호스트에서 기동하는 경우에 테스트하기 위해서 url 변경
    // 변경자 : thkim86@하나포스.com, 2004.1.26
    private final static String server_url =
        "http://localhost:8080";
        //"http://xmlrpc-c.sourceforge.net/api/sample.php";


    public static void main (String [] args) {
        try {

            // Create an object to represent our server.
            XmlRpcClient server = new XmlRpcClient(server_url);

            // Build our parameter list.
            Vector params = new Vector();
            params.addElement(new Integer(5));
            params.addElement(new Integer(3));

            // Call the server, and get our result.
            Hashtable result =
                (Hashtable) server.execute("sample.sumAndDifference", params);
            int sum = ((Integer) result.get("sum")).intValue();
            int difference = ((Integer) result.get("difference")).intValue();

            // Print out our result.
            System.out.println("Sum: " + Integer.toString(sum) +
                               ", Difference: " +
                               Integer.toString(difference));

        } catch (XmlRpcException exception) {
            System.err.println("JavaClient: XML-RPC Fault #" +
                               Integer.toString(exception.code) + ": " +
                               exception.toString());
        } catch (Exception exception) {
            System.err.println("JavaClient: " + exception.toString());
        }
    }
}




 

- xmlrpc-2.0-plp.jar  (XML RPC 통신에 필요한 API)
- junit.jar (모든개발 프로젝트에 꼭 들어가는 유닛 테스터)
- log4j-1.2.8.jar (모든개발 프로젝트에 꼭 들어가는 로그 기록)
- commons-httpclient-2.0.jar  (Apache에서 제공한 httpclient)
- commons-logging-1.1.jar  (Apache에서 제공한 logger)
- commons-codec.jar (Apache에서 제공한 codec)

다음 dna를 통해 openAPI를 시작해 보도록 합시다
우선 다음에서 제공하는 몇개의 key를 선물로 받아야 됩니다.

dna.daum.net 에 접속하시면 화면 왼쪽 아래에 아래와 같은 이미지 버튼이 보입니다.
이곳에서 openAPI 사용에 필요한 키를 제공 받도록 합니다.

사용자 삽입 이미지

키를 발급받게 되면 아래와 같이 "나의 인증키 발급 목록" 이라는 메뉴에
아래와 같이 인증받은 Key들이 나옵니다.
사용자 삽입 이미지

이중에서 일반적인 검색의 경우에는 url + apikey 조합으로도 유용이 가능하지만
블로그의 경우에는 "서명키" 라는것이 눈에 보입니다.
서명키는 글을 쓰기위한 비밀번호와 같은것으로 발급을 반드시 받아야 하고
XML-RPC를 이용한 작업을 하실적에는 꼭 필요한 key 입니다.


화면에서 보이는 "보기" 버튼을 클릭하면 서명키를 제공받는 부분이 나옵니다.
이렇게 말이죠 ^^

간단하게 조회용으로 사용하실때에는 이용하실 필요가 없지만
글을 넣거나 댓글을 달거나 할때는 서명키는 꼭 필요하니 주의하시기 바랍니다.

사용자 삽입 이미지

이상과 같이 DAUM oepnAPI KEY를 제공받는게 모두 마쳐졌습니다.
이제 발급받은 키를 가지고 몇가지 작업을 해보도록 하겠습니다.

다음편! 개봉박두!!

openAPI를 시작하면서

openAPI 2008. 1. 10. 20:32
무한 공유!
바로 이것이 openAPI의 매력이다.

 
2007년 한해를 마무리 하면서 무슨책을 볼까  하면서 손에 잡힌책이 "생각을 바꾸는 패턴"이다.
영어에서 문법을 알면 영어가 고급스러워지는것 처럼 패턴 역시 그러한 현격한 영향을 가져다 주기에
2007년을 패턴으로 마무리 지어보려 읽어보게 되었다.

책은 무척이나 가벼우면서도 깊이 파고들면 한없이 무거움이 느껴지는 책이다.
그도 그럴만한것이 책은 GoF의 에릭감마가 이야기한 23개의 패턴을 지지하는 내용이 샘플 소스코드와
함께 소개되어있기 때문일 것이다.
책을 찬찬히 보게 되면 알겠지만 매 단락마다 GoF의 인용을 뺴놓지 않고 하고 있다.

처음 책을 봤을때 생각을 바꾸는 패턴이라는책은 내 생각을 180도 다른 패턴에 임하는 그런 책은 아니다.
(역시 이번에도 제목만 보고 안티페턴처럼 선입견을 가지고 열여봐버렸답니다.)
책은 일반적인 현상이나 생활속에서 발생하는 우리의 생각을 Program적으로 어떻게 진화시킬 수
있는지를 GoF의 패턴을 이용하여 진화시켜주는 책이다.

개인적으로 책에서 가장 맘에 드는 한부분을 인용해보면 다음과 같다.
버거가게를 만드는 패턴!!
이해가 되는가? 햄버거를 만드는데 별다른 패턴이 필요하지 않을것 같은데 버거가게에서도 패턴이
도입이 되는게 바로 이책안에서 생각을 바꿔주는 일에 해당한다.

버거를 만드는데는 양파, 치즈, 살사소스, 토핑 등이 필요하고 이것들이 조합되어 맛있는 햄버거를 만들어진다.
자 그럼 어떻게 이런 조합들을 프로그램 적으로 어떻게 설명할 수 있을까? 그리고 어떻게 하면
가장 유지보수 하기 편하게 만들수 있을까? (아주 아주 깜찍한 발상이죠. ^^)

내용은 SandWich라는 라는 basic Class를 생성하고 SendWichDecorator 라는 Class가 SandWich를
상속받고 getPrice()가 내용물을 감싸는 샌드위치의 getPrice()를 호출하게 된다.
getPrice()는 ChooseDecorator 라는 Class에 선언되어있는데 ChooseDecorator 는 다양한 토핑정보를
가지고 있게 되는것이다.

나의 설명이 다소 어렵게 느껴질 수도 있다.
하지만 책에서는 UML로 이해하기 쉽게 잘 설명되어있으니 궁금하면 한번 찾아보는것도 좋을것 같다. (95Page)
이렇게 언급한 버거가게 패턴은 GoF의 "Decorator패턴"을 이해하기 쉽도록 설명해 놓고 있다.

그밖에도 책안에는 제품구성, 패턴시스템 개발 등과 같은 다양한 실습예제가 들어가 있고 또 책 초반에는
UML대해 짧은 소개도 들어가 있다(책이 UML로 소개되어있어 그런것 같습니다.)
얼마나 패턴이 쉽게 다가올지는 소비자의 이해도에 따라 다르겠지만
우리가 알고있는 에릭감마의 GoF의 딱딱한 하드커버가 쉽게 감동이 되지 않는다면 한번 이책을 보고
다시 GoF로 이동하는것도 좋은 방법이라 생각한다.

끝으로 이책을 총평하자면 생각을 바꾸는게 아니라 생각을 진화시켜 패턴에 도달케하는 책이라고 말하고 싶다.



최근 트렌트가 되어온 서적들은 CEO, 리더, 경영서적 위주의 편재가 중심이 되었다.
하지만 팽은 위에 언급한 서적류와는 다르게 아래에서 위를 향해 바라보는 서적이 중심 키 포인트라는데
팽이 가진 장점을 들 수가 있다.

성공하는 CEO는 언론에 많은 극찬과 많은 서적으로 우리는 오랜동안 봐 왔다.
그럼 세상은 꼭 성공하는 CEO만 조명되어야 하는가?
적어도 팽 에서는 CEO는 조연에 불과 하다. 팽에서의 주연은 직원이 주인공이다.

팽의 접근방법을 살펴보도록 하자.
우선 제 1장에서 사람에 대하여 분리하는 놀라운 기술을 가지고있다.
베이붐 세대, X 세대, 넥스트 세대 등과 같이 연령을 중심으로 각 세대가 가지고 있는 보편화된 가치관을 언급하고 있다.
사실 개인적인 사람을 분류하는데 있어 나이를 가지고 세대를 구분하는것은 정말 위험한 발상이라고 생각한다.
하지만 팽은 그 분류법이 바이블이나 되는것 처럼 책 가장 앞장에 위치시켜 놓고 있다.
일정 부분은 다소 공감이 가는영역도 있지만 또 어느 부분은 공감이 가지 않는부분도 있다.
예를 든다면 1980년대생들을 베이붐으로 편입시켜놓고 "과시적 소비의 시대"라고 부르고 있다.
과연그럴까?
과연 그들이 과시적 소비의 세대라면 한국이 2차대전 식민지 국가중 지금같은 경제국가가 되었을까?
과연 그들이 낙관주의적 사상의 세대라면 중동의 전란틈안에서도 포크레인을 운전했을까?
다소 격한부분이 있긴 하지만  팽은 저자가 살고있는 나라 미국에 대한 이야기가 아닐까 싶다.

여하튼 다시 팽으로 촛점을 모아보자.
팽에서 언급하고 주요촛점은 우선 자기발전이다.
우리나라의 토사구팽(兎死狗烹)에서는 버려지는 강아지 취급이지만 책은 결코 버려지는 팽의 이야기만
하지는 않고 있다.
서평자가 다시 책 제목을 만들어 낸다면 "회사가 필요한 인재가 되는법" 이라고 봐야 더 정확한 서적인것 같다.

자 그럼 팽의 내용을 보도록 해보자.
팽은 다양한 장르의 리더계층에서 요구하는 종업원의 모습을 이야기 나열하고 있다.
그 수많은 사례를 수집하는것도 일이였을 만큼 우리에게 익숙한 기업들이 책에 거론이 되며
이상적인 회사 구성원의 모습과, 자아성찰의 과정을 이야기 하고 있다.

사실 책의 가장 중요한 점은 목차에 다 나와있다고 볼 수 있다.

1. 왜 회사가 당신 없이 살 수 없게 해야 할까?
2. 상사의 특징을 파악해서 그가 당신에게 원하는 게 무엇인지 알아내라
3. 관리하기 까다롭지 않은 직원이 되도록 하라
4. 상사가 지시하기 전에 해야 할 일을 먼저 찾아 처리하라
5. 받고 있는 월급과 창출해 내고 있는 가치의 대차대조표를 그려보라
6. 꼭 필요한 직원이 되고 싶다면 회사의 주인처럼 행동하라
7. 잠시 머물 직장이라 하더라도 평생직장처럼 일하라
8. 회사에서 가장 믿을 만한 직원이 되도록 노력하라
9. 실수를 피하지 말고 제대로 실수하는 법을 배워라
10. 자신이 영향력을 미칠 수 있는 영역을 넓혀라
11. 현실에 안주하지 말고 자신의 한계에 도전하라
12. 어디에서 무엇을 하든 그 위치에서 전문가가 되어라
13. 자만심을 버리고 자신이 하는 일에 감사하는 마음을 가져라
14. 성공은 스스로 만드는 것, 자신의 운명을 책임지라
15. 학벌이 당신의 가치를 보장해 준다고 생각지 말라
16. 학습된 무력감의 포로가 되지 말고 기회가 오면 붙잡아라
17. 적극적으로 문제를 해결하는 직원이 되도록 하라
18. 가치 있는 직원이라면 절대 해서는 안 되는 행동

이상이다.
이상 18가지 행동에 사실 책의 모든 내용이 담겨져 있다.
여기에 추가로 사족을 하나 더 달게 된다면 가장 맘에드는 챕터는 16번이다.
"인생이란, 원래 공평치 못한것이다, 극복하라"  (231 page)

<span id="neouser">Good</span>

document.getElementById("itemCount_rssGrp1").innerHTML ="neouser";
 > 값을 넣어줍니다.

document.getElementById("itemCount_rssGrp1").outerHTML
 > return 값 : <span id="neouser">Good</span>

document.getElementById("itemCount_rssGrp1").outerText
 > return 값 : Good


innerHTML 의 반대되는 개념은 뭐가 있을까?
값을 잘 끄집어 내오는것을 난 찾았다.

그러다 발견한 outerHTML ... 하지만 이것을 쓸데없는 테그까지 가져온다.
그렇다면 outerText 는 어떠할까?
결과는 만족스럽다.

이구~ 이런것을 찾으려 들면 항상 없어요.

Java 의 Vector 클래스는 내부적으로 배열을 사용하고 있다. 따라서 Vector 의 자바스크립트 버전을 만들기 위해서는 Array 객체에 대한 빵빵한 지식이 필요하다 (없어도 된다. 그러나 있으면 매우 좋다). 자! 배열의 기초와 유용한 메쏘드들을 살펴보자.

배열의 생성

1. 생성자를 이용한 생성

  - new Array(arrayLength)

    ex) friends = new Array(3); // 크기가 3 인 배열 생성

  - new Array(element0, element1, ... , elementN)

    ex) friends = new Array("개똥이", "소똥이", "말똥이"); // 크기 3인 배열 생성(값이 채워짐)

2. 직접 생성

  friends = ["개똥이", "소똥이", "말똥이"];


간접적인 배열 길이의 증가

배열의 길이는 현재 배열의 길이보다 큰 인덱스를 사용하면 자동으로 증가한다. 아래는 배열의 길이가 0 인 객체 생성 후 99번째 요소에 값을 할당하여 배열의 길이가 100 으로 증가한 예이다.

friends = new Array();

friends[99] = "새똥이";


메쏘드 종류

concat : 두개의 배열을 합쳐 새로운 배열을 리턴한다. 원본 배열은 변하지 않는다.

문법

  arrayName.concat(arrayName2, arrayName3, ... , arrayNameN)

인자

  arrayName2, ... , arrayNameN - 합쳐질 인자들

예제

  두 배열을 합치는 예

  alpha = new Array("a", "b", "c");

  numeric = new Array(1, 2, 3);

  alphaNumeric = alpha.concat(numeric); // ["a", "b", "c", 1, 2, 3] 배열 생성


join : 모든 요소가 구분자로 이어진 문자열을 리턴한다. 디폴트 구분자는 comma(,) 이다.

문법

  arrayName.join(separator)

인자

  separator 요소와 요소 사이에 사용될 구분자 문자열

예제

  friends = new Array("소똥이", "개똥이", "말똥이");

  strFriends1 = friends.join(); // 소똥이,개똥이,말똥이

  strFriends2 = friends.join(", "); // 소똥이, 개똥이, 말똥이

  strFriends3 = friends.join(" + "); // 소똥이 + 개똥이 + 말똥이


pop : 배열의 마지막 요소를 삭제한 후 그 값을 리턴하고 배열의 크기를 줄인다.

문법

  arrayName.pop()

인자

  없음

예제

  // 말똥이가 pop 되고 배열에는 "개똥이", "소똥이"만 남는다.

  // 배열크기도 2로 줄어든다.

  friends = ["개똥이", "소똥이", "말똥이"];

  popped = friends.pop(); // popped 에 말똥이가 할당된다.


push : 배열에 하나 또는 여러개의 값을 넣고 새로운 배열의 길이를 리턴한다.(배열길이 증가)

문법

  arrayName.push(element1, element2, ... , elementN)

인자

  element1, element2, ... , elementN - 추가될 요소들

예제

  friends = ["개똥이", "소똥이"];
  pushed = friends.push("말똥이", "새똥이"); // ["개똥이", "소똥이", "말똥이", "새똥이"]

  alert(pushed); // 4


reverse : 배열 요소를 역순으로 재배치한다(첫번째 요소는 마지막으로, 마지막 요소는 처음으로).

문법

  arrayName.reverse()

인자

  없음

예제

  myArray = new Array("1", "2", "3");

  myArray.reverse(); // ["3", "2", "1"]


shift : 첫번째 요소를 삭제하고 배열의 길이를 하나 줄인 후, 삭제된 요소를 리턴한다.

문법

  arrayName.shift()

인자

  없음

예제

  friends = ["개똥이", "소똥이", "말똥이"];

  shifted = friends.shift(); // ["소똥이", "말똥이"]

  alert("삭제된 요소는 " + shifted + " 입니다."); // 개똥이


slice : 얇게 썬 슬라이스 치즈가 생각난다(^^). 배열의 일부를 잘라내어 새로운 배열을 리턴한다.

문법

  arrayName.slice(begin[,end]) : [] 은 선택사항임

인자

  begin - 0보다 큰 시작 인덱스 (필수)

  end - 0보다 큰 끝 인덱스 (선택). 지정되지 않으면 배열의 끝까지 복사된다.

예제

  numbers = ["0", "1", "2", "3", "4"];

  sliced1 = numbers.slice(2, 3); // ["2"]

  sliced2 = numbers.slice(2); // ["2", "3", "4"]


sort : 배열의 요소를 정렬한다.

문법

  arrayName.sort([compareFunction])

인자

  compareFunction - 정렬방법을 지정한 함수.

     생략시에는 요소들의 toString() 값을 사전순서(Dictionary order) 대로 정렬한다.

     compareFunction(a, b) 에서

        1) a > b : 0 보다 큰 값 리턴

        2) a = b : 0 리턴

        3) a < b : 0 보다 작은 값 리턴

예제

  // 역행 정렬

  function descComparator(a, b) {

      return b - a;

  }


  // 순행 정렬

  function ascComparator(a, b) {

      return a - b;

  }


  numbers = ["0", "1", "2", "3", "4"];

  numbers.sort(); // ["1", "2", "3", "4", "5"]

  numbers.sort(ascComparator); // ["1", "2", "3", "4", "5"]

  numbers.sort(descComparator); // ["4", "3", "2", "1", "0"]


splice : 이전 배열요소를 삭제하고 새로운 내용물을 추가하는 형태로 배열 내용을 변경한다. 삭제된 요소들은 리턴된다. Vector 와 유사한 기능을 하므로 숙지하자.

문법

  arrayName.splice(index, howMany, [element1][, ..., elementN])

인자

  index - 변경하고자 하는 요소의 시작 인덱스

  howMany - 삭제하고자 하는 이전 배열요소 갯수.

  element,...,elementN - 추가하고자 하는 배열 요소들

예제

  // numbers[2]부터 2개("2", "3")를 삭제하고 그 자리에 "5"와 "6" 을 삽입한다.

  numbers = ["0", "1", "2", "3", "4"];

  spliced = numbers.splice(2, 2, "5", "6"); // ["0", "1", "5", "6", "4"]

  alert(spliced); // "2", "3"


unshift : 하나 또는 여러개의 요소를 배열의 왼쪽에 추가한다. 배열길이는 증가한다.

문법

  arrayName.unshift(element1,..., elementN)

인자

  element1,...,elementN - 배열의 앞쪽에 들어갈 요소들

예제

  numbers = ["0", "1", "2"];

  numbers.unshi

function getChannel(blogid) {
 var channelList = new Array();
 #foreach($channel in $runChannel)
  channelList.push ("$channel.chid");
 #end
  for (run = 0; run < channelList.length; run++ ) {
   var getchid = channelList[run];
    ****
  }
}

스크립트에서 의도하는 바는 programming 되어넘어오는 각각의 값들을
위와같이 Array롤 받아서 하나 하나 pup 해서 사용하려는 의도입니다.
Array에는 보다 다양한 기능들이 있답니다.
var readItem = new Array();
 function updateItemCount() {  
  var inchid = document.neouserForm.chid.value;
  if (readItem.length == 0 && itemCountChannel[inchid] !=undefined) {
   document.getElementById("itemCount_channel_"+inchid).innerHTML = itemCountChannel[inchid];
  } else {
     ****
   }
  }     
 }



본 스크립트에서 의도하는 바는 undefined에 대해서입니다.
undefined은 문자열이 아니랍니다. 그래서 'undefined' 나 "undefined" 로 비교하게 되면
위에 조건절로 본다면 true를 return 하게 됩니다.
꼭! undefined 은 아무런 코멘트 없이 사용하시기 바랍니다.
1 ··· 11 12 13 14 15 16 17 ··· 26 

글 보관함

카운터

Total : / Today : / Yesterday :
get rsstistory!