Search results for '공부도 하고/깊이있는 것'

SOA (Service Oriented Architecture)

2007/09/05 14:08
SOA 에 관한 자료들을 찾아봤다. 흥미로운 주제가 아닐 수 없다.
이전에는 CODE, OBJECT, COMPONENT 등을 재사용(reuse)하는데에 관심을 쏟았다면,
이제는 더 나아가 Sevice 를 재사용하겠다니...

1990년대 후반(주:1996년 4월 가트너에서 표준 인터페이스 방식으로 시작)에 태어났지만,
요즘 SOA에 대한 관심이 늘어나고 있는 이유 중 하나는,
Web2.0 이 타 기업의 서비스를 이용하여 자신의 서비스를 이뤄내는 방식(주:MashUp)이 성공할 수 있음을 증명했기 때문이 아닐까 한다.

이슈가 되었고, 기업에서도 많은 관심을 가지고 추진을 하기 시작했지만..
아직 제대로 되지 않는 이유는 뭘까..
어떤 문제점이 있길래.. 무엇이 해결되어야 할까...


What is SOA?
  • SOA is a design for linking business and computational resources (principally organizations, applications and data) on demand to achieve the desired results for service consumers (which can be end users or other services). - wikipedia
  • A paradigm for organizing and utilizing distributed capabilities that may be under the control of different ownership domains. It provides a uniform means to offer, discover, interact with and use capabilities to produce desired effects consistent with measurable preconditions and expectations. - OASIS(주: Organization for the Advancement of Structured Information Standards)

  • Criticisms of SOA
    Some criticisms of SOA are based on the assumption that SOA is just another term for Web Services. For example, some critics claim SOA results in the addition of XML layers introducing XML parsing and composition. In the absence of native or binary forms of Remote Procedure Call (RPC) applications could run slower and require more processing power, increasing costs. Most implementations do incur these overheads, but SOA can be implemented using technologies (for example, Java Business Integration (JBI)) which do not depend on remote procedure calls or translation through XML. However, there are emerging and open-source XML parsing technolgies, such as VTD-XML, and various XML-compatible binary formats (http://vtd-xml.sf.net/persistence.html) that promise to significantly improve the SOA performance.
    Stateful services require both the consumer and the provider to share the same consumer-specific context, which is either included in or referenced by messages exchanged between the provider and the consumer. The drawback of this constraint is that it could reduce the overall scalability of the service provider because it might need to remember the shared context for each consumer. It also increases the coupling between a service provider and a consumer and makes switching service providers more difficult.
    Another concern is that WS-* standards and products are still evolving (e.g., transaction, security), and SOA can thus introduce new risks unless properly managed and estimated with additional budget and contingency for additional Proof of Concept work.
    An informal survey by Network Computing placed SOA as the most despised buzzword (November 2006).
    Some critics feel SOA is merely an obvious evolution of currently well-deployed architectures (open interfaces, etc).
    A SOA being an architecture is the first stage of representing the system components that interconnect for the benefit of the business. At this level a SOA is just an evolution of an existing architecture and business functions. SOAs are normally associated with interconnecting back end transactional systems that are accessed via web services.
    The real issue with any IT "architecture" is how one defines the information management model and operations around it that deal with information privacy, reflect the business's products and services, enable services to be delivered to the customers, allow for self care, preferences and entitlements and at the same time embrace identity management and agility. On this last point, system modification (agility) is a critical issue which is normally omitted from IT system design. Many systems, including SOAs, hard code the operations, goods and services of the organisation thus restricting their online service and business agility in the global market place.
    Adopting SOAs is therefore just the first (diagrammatic) step in defining a real business system. The next step in the design process is the definition of a Service Delivery Platform (SDP) and its implementation. It is in the SDP design phase where one defines the business information models, identity management, products, content, devices, and the end user service characteristics, as well as how agile the system is so that it can deal with the evolution of the business and its customers.

    SOA and web service protocols
    * XML - a markup language for describing data in message payloads in a document format
    * HTTP (or HTTPS) - request/response protocol between clients and servers used to transfer or convey information
    * SOAP - a protocol for exchanging XML-based messages over a computer network, normally using HTTP
    * XACML - a markup language for expressing access control rules and policies.
    * Web Services Description Language (WSDL) - XML-based service description that describes the public interface, protocol bindings and message formats required to interact with a web service
    * Universal Description, Discovery, and Integration (UDDI) - An XML-based registry to publish service descriptions (WSDL) and allow their discovery

    Links



    '공부도 하고 > 깊이있는 것' 카테고리의 다른 글

    SOA (Service Oriented Architecture)  (0) 2007/09/05
    Transporting PicoKernel from IA32 to AVR(ATmega128)  (2) 2006/05/02
    DBTMA  (0) 2005/09/20
    지프의 법칙  (0) 2005/08/17

    총명님 공부도 하고/깊이있는 것 Service Oriented Architecture, SOA

    Transporting PicoKernel from IA32 to AVR(ATmega128)

    2006/05/02 14:24
    ※ 일반적인 트랜스 포팅의  접근법
    1. Prepare the ATmega128 MCU board
    2. Get picoKernel source code from http://rtlab.kangwon.ac.kr
    3. Understand the architecture of picoKernel
    4. Understand ATmega128 architecture and software development using the AVR Studio (WinAvr)
    5. Compile the picoKernel source code, which is written in ANSI C with avr-gcc
    6. Development of Demo Application
    7. Debugging and Porting to board

    ※ PicoKernel 포팅을 위해 해야할 일
    1. 개발 환경 구축
      - 개발보드 및 ISP 준비
      - 개발 소프트웨어 설치/셋팅
         ㆍ에디터, 컴파일러, 프로그래머

    2. 커널 소스 중 장치에 종속 적인 코드 수정
      - 메모리, I/O 입출력 등에 관한 부분

    3. 문맥 교환 구현
          ㆍcontextSet(), contextSwitch() 구현

    4. Timer 를 이용한 인터럽트를 이용한 스케쥴링

    간단하게 해야할 일을 알아보면 위와 같고,
    어플리케이션 동작을 확인하기 위해서 LCD를 제어하는 라이브러리를 작성하고,
    이를 이용한 사용자 프로그램(userMain())을 구현하여 이를 포팅한다.

    ※ 문맥 교환(context switching)의 원리
    typedef struct threadEntS {
      struct threadEntS *tNext; // point to next thread entry
      int tPrio; // thread priority
      int tState; // thread state
      int (*tStart)(int); // start function address
      int tArg; // argument of tStart()
      char *tStack; // stack bottom address
      unsigned long tReg[6]; // area to save registers
      // register order: EBX, ESI, EDI, EBP, ESP, EIP
    } threadEntT;

    PicoKernel의 스레드 테이블은 위와 같고 굵게 표시한 tStart, tStack, tReg가 문맥교환을 위해 사용된다. tStart는 스레드의 시작위치, tStack은 스레드의 스택포인터, tReg는 문맥을 위한 레지스터를 저장하기 위해 사용된다.

    그런데 문맥 교환이란 무엇일까?
    보통의 OS들은 멀티테스킹을 지원한다. 말은 멀티테스킹이지만 절대적인 시간으로 한 시점에서는 하나의 일을 수행하지만 인간이 보기엔 여러 프로그램(프로세스, 스레드 : PicoKernel은 스레드 기반이기 때문에 스레드로 사용)가 동시에 실행되는 것처럼 보이니까 멀티테스킹이라고 한다. 이를 위해 운영체제가 스레드들의 실행 권한을 바꿔주는 것이다. 요놈 실행시켰다 조놈 실행시켰다.. 이를 수행하기 위해서, 운영체제는 필요한 시점에 문맥 교환(Context Switching)이라는 것을 한다. 이전에 수행중인 스레드의 상태를 저장하고 새로운 스레드의 상태를 가져와서 정상적으로 동작할 수 있게 한다.

    여기서 '상태'를 저장한다고 했는데, PicoKernel의 IA32 버전에서는 위 스레드 엔트리 테이블을 보면 tReg 배열을 잡아 ebx, esi, edi, ebp, esp, eip의 6개 레지스터를 저장한다.

    그렇다면, AVR(ATmega128) 에서 문맥(Context)는 무엇일까??
    - 32개의 범용 레지스터 (R0~31)
    - 페이지 선택 레지스터 (RAMPZ : RAM Page Z Select Register)
    - 상태 레지스터 (SREG)
    - 프로그램 카운터
    - 스택 포인터 (SPH, SPL)

    문맥 교환시에 위에 언급한 내용들을 저장하고 복원하는 과정을 수행하면 된다.
    문맥 교환은 대충(?) 간단하게도 두 스레드간에 위의 내용들을 교환하면 된다.

    그렇다면 또 여기서..
    최초의 레지스터 값이나 스텍포인터, 함수의 시작위치는 어떻게 할 것인지...??
    아래 그림은 문맥 저장을 tReg 배열을 사용할 경우의 contextSet()을 간단히 나타낸 것이므로 설명과 곁들여서 보면 좋을 것 같다. PicoKernel의 kernel.c 소스를 보면 threadInit() 함수에서 정해진 갯수만큼 스레드 엔트리를 생성하고 스택영역을 할당해 주고(*tStack 이용), free list에 넣어 둔다. 그리고 스레드를 실제로 생성하는 threadCreat() 함수에서 스레드의 free list에서 엔트리를 하나 가져와서 threadStartup()함수를 이용해 스레드의 시작 위치를 저장한다. (*tStart 이용) contextSet()은 tReg, tStack, tStart를 인자로 받아서 현재의 문맥을 tReg에 저장하고, *tStart, 즉 스레드의 시작 위치를 tStack이 가리키는 스택에 Push 한다. 스레드의 스택에 시작 위치를 넣는 것은 call이 일어나 점프 하기 전에 복귀 주소를 스택에 넣고 함수나 인터럽트를 수행하고 리턴할 때 스택에서 Pop을 하여 복귀 주소를 가져와 해당 주소부터 실행하기 때문이다.


    다시 문맥 교환을 보면, tReg를 이용해 문맥 교환하는 것을 그림으로 나타내면 아래 그림과 같다. 보면 알겠지만 말 그대로 문맥만 교환하면 되는 간단한 일인데 어셈으로 짜다보면 그것이 잘 안된다 ㅡ,.ㅡ;

    ※ 문맥 교환(context switching) 방법
    위의 그림들과 설명은 문맥 교환에 대한 개략 적인 내용을 설명한 것이고,
    실제로 문맥 교환을 구현하기 위한 방법을 보면 3가지 방법 정도로 요약이 된다.
    1. tReg에 문맥을 저장하고 복원하는 방법 (위에서 설명된 내용)
      - 어셈언어로 구현할 때 배열, 스택 사용시 주의해서 사용해야 함
    2. 스레드 스택에 문맥을 저장 (Push, Pop 이용)
      - tReg 대신스택에 문맥과 복귀주소 저장
      - SP, FP 등의 혼돈 없이 사용할 수 있어 1번보다 수월하고 고려할 점이 적다
    3. setjmp(), longjmp() 를 이용
      - 표준 C 라이브러리에서 제공하는 함수로, 플렛폼에서 필요로하는 문맥을 저장하거나 복원하는 함수 (간단하게 C 레벨에서 구현 가능, 어셈코드보다 느림)
    #include <setjmp.h>
    // save stack context for non-local goto
    int setjmp(jmp_buf env);
    // non-local jump to a saved stack context
    void longjmp(jmp_buf env, int val);

    ※ 스케쥴링 추가
    현재 PicoKernel은 userMain()에 사용자가 어플리케이션을 작성하며 그 안에서 threadCreate()를 통해 스레드들을 만들 수 있다. 하지만 PicoKernel은 Non-preemptive 커널이기에 먼저 수행된 스레드가 끝까지 수행된다. 따라서 thread 에서 threadYield()를 호출하여 실행 권한을 양보하고 schedRunHighest()에서 문맥 교환이 일어난다.
    커널에 타이머 인터럽트를 추가하고 스레드에 Quantum 을 추가하여 PicoKernel을 Preemptive-Kernel로 바꿀 수 있다. 주의할 점은 타이머 인터럽트 처리 루틴에서 인터럽트 처리시에도 레지스터값이 바뀌게 되므로 문맥 교환 이 필요하다는 점이다. 타이머 인터럽트 처리 루틴에서 threadYield()를 호출하여 스케쥴링 할 수 있다.
    참고 : 타이머 인터럽트 만들기

    ※ 어셈블리 사용 도움말
    1. 메뉴얼을 참조 :  http://www.atmel.com/atmel/acrobat/doc2467.pdf
    2. 레지스터
      - 8bit 레지스터 32개 (R0~R31) : R26~R31은 특수 용도로 사용됨 (X, Y, Z 레지스터)
      - SREG, RAMPZ, SPH, SPL (Stack Pointer High/Low bytes)
      - X(R26:R27), Y(R28:R29), Z(R30:R31) : 8bit 레지스터 두개로 16bit 주소 어드레싱
      > X, Y, Z 레지스터는 LD(D), ST(D) 명령 사용시 메모리 영역을 가리키는 포인터 역할
       > 서브루틴 호출시 Y 레지스터는 프레임 포인터 역할

    3. 어셈블리 사용시 알아두면 좋을 것들
      - 컴파일러는 주로 R16~R31을 사용하고 모자를 경우 확장하여 R0부터 R15까지 사용
        > 임시 레지스터를 사용할 경우 R0~R15를 사용하는 것이 좋음
      - 함수 파라미터
        > Arg[1] : R25~24, Arg[2] : R23~22, Arg[3] : R21~20 ...
      - PUSH / POP : 주소가 낮은 쪽으로 커감
        > PUSH : 현재 SP가 가리키는 곳에 값을 넣고 SP를 1만큼 감소
        > POP : 현재 SP가 가리키는 곳의 값을 가져오고 SP를 1만큼 증가
        > 서브루틴 호출이나 인터럽트 발생시 복귀 주소 저장 위해 사용
      - C 에서 언셈블리 사용 방법
    ㆍ 독립된 어셈블리 함수 사용
          어셈블리로 독립된 함수를 만들어 어셈블 한후 오브젝트 파일을 링크시켜
          C에서 어셈블리 함수를 호출 -> 큰 코드 작성에 유리
    ㆍ 인라인 어셈블리 사용
          C 파일 안에 어셈블리를 포함시켜 작성
          인라인 어셈블을 매크로로 작성하여 호출
         http://wiki.kldp.org/wiki.php/DocbookSgml/GCC_Inline_Assembly-KLDP
          또는 메뉴얼 파일을 참고

    ㆍ 어셈블리에 관한 추가적인 링크
         http://wiki.kldp.org/wiki.php/DocbookSgml/Assembly-HOWTO
         http://wiki.kldp.org/wiki.php/LinuxdocSgml/Assembly-HOWTO


    대강 여기까지 정리...
    생각나면 더 추가하도록 하겠다..ㅡ,.ㅡ;;

    '공부도 하고 > 깊이있는 것' 카테고리의 다른 글

    SOA (Service Oriented Architecture)  (0) 2007/09/05
    Transporting PicoKernel from IA32 to AVR(ATmega128)  (2) 2006/05/02
    DBTMA  (0) 2005/09/20
    지프의 법칙  (0) 2005/08/17

    총명님 공부도 하고/깊이있는 것

    1. 오..드디어 올리셨군요..ㅎㅎ 감시히 읽겠습니다..

    2. 두서없이 써서.. 문맥이 맞는지
      틀린 내용은 알려주도록~

    DBTMA

    2005/09/20 03:50
    The Dual Busy Tone Multiple Access (DBTMA) scheme ]

    In the Dual Busy Tone Multiple Access (DBTMA) scheme [Haa02], in addition to the use of an RTS packet, two out-of-band busy tones are used to notify neighbor nodes of the channel status. When a node is ready to transmit, it sets up its Transmit Busy Tone and sends out an RTS packet to its intended receiver. On reception of the RTS packet, the receiver sets up a busy tone (the Receive Busy Tone) and waits for the incoming data packet. The Receive Busy Tone operates similarly to the busy tone of the RI-BTMA scheme. However, with the help of the second busy tone (the Transmit Busy Tone), the probability of RTS packets being collided is decreased and the performance is improved.
    The DBTMA scheme completely solved the hidden terminal problems and the exposed terminal problems. It forbids the hidden terminals to send any packet on the channel while the receiver is receiving the data packet. It allows the exposed terminals to initiate transmission by sending out the RTS packets. Furthermore, it allows the hidden terminals to reply RTS packets by setting up the Receive Busy Tone and initiate data packet reception.

    '공부도 하고 > 깊이있는 것' 카테고리의 다른 글

    SOA (Service Oriented Architecture)  (0) 2007/09/05
    Transporting PicoKernel from IA32 to AVR(ATmega128)  (2) 2006/05/02
    DBTMA  (0) 2005/09/20
    지프의 법칙  (0) 2005/08/17

    총명님 공부도 하고/깊이있는 것

    지프의 법칙

    2005/08/17 12:06
    지프의 법칙은 "많이 쓰이는 단어는 극단적으로 몇개 안된다" 입니다. 예를 들어, 영어에서 a, an, and, but, is, my, much, .. 등과 같은 단어들은 엄청나게 많이 쓰이지만 이 정도 빈도로 쓰이는 단어의 갯수는 불과 수십여개 밖에 안됩니다.

    무수한 잔챙이 vs 한두개의 대박
    인공적인 것, 자연 현상을 불문하고 나타나는 아주 흥미로운 현상이 한 가지 있습니다. 큰 건은 극단적으로 드물고, 조그마한 것들은 매우 많다는 것입니다. 이것은 여러가지 증명을 통해 거의 법칙 수준으로 받아들여 지고 있을 정도 입니다. 예를 들어보죠.

    엄청나게 큰 지진은 매우 드물게 일어나지만, 약한 지진은 자주 발생한다. 엄청나게 거대한 도시가 소수 나타나고, 그저 그런 조그마한 도시가 많이 나타난다. 비슷한 규모의 것이 골고루 나타나는 것이 아니라 소수의 거대한 것이 나타나고 그저 그런 크기인것들이 대다수를 차지하는 패턴이 분야를 가리지 않고 관찰된다는 것입니다. 이런 것을 일찌감치 느낀 사람이 몇 명 있었습니다. 이들은 각자 자신의 분야에서 어떤 주제를 연구하면서 이와 같은 패턴이 나타남을 느꼈던 것입니다. 대표적 예로, '20-80 법칙'을 발견한 파레토 라는 경제학자가 있습니다.생산량의 80%는 20%의 사람들이 만들어 낸다라는 겁니다. 또는, 은행돈의 80%는 20%의 고객으로 부터 온다는 겁니다. 요즘 소액예금에 대해서 이자를 안 주겠다는 얘기가 심심챦게 흘러 나오고 있죠? 사실상 은행을 먹여 살려주는 건, 무수한 보통 고객이 아니었기 때문입니다. 한 두명의 큰손이었기 때문입니다. 이러한 20-80 법칙은 여러 형태로 응용되기도 했습니다. 은행외의 대부분의 사업도 20%의 대박 손님이 80%의 수입을 가져다 주는 경우가 많다 라든지, 부의 80%는 20%의 소수계층이 차지한다는 얘기 등등..

    흥미롭지 않습니까?

    그런데, 이런 패턴이 어딜 들여다 봐도 나타나더라는 겁니다.

    지프의 법칙 , 파레토 , 그리고 . 수확체증의..

    언어학 쪽에서 이런것을 느낀 사람이 바로 지프(Zipf) 였습니다. 하버드 대학의 언어학 교수였던 지프는 사람들이 쓰는 단어들을 횟수별로 순위를 매겨 보았습니다. 그러자 놀랍게도, 단어 사용 빈도 역시 엄청나게 많이 쓰이는 소수의 단어와 제한된 횟수로만 사용되는 대부분의 단어로 구분이 되었다는 것입니다. and 나 but 같은 단어는 정말 정말 많이 쓰입니다. 그런데 많이 쓰이는 단어는 극소수에 불과합니다. 이것을 지프의 법칙이라고 합니다. 위에서 말한 파레토는 경제학에 수학적 분석을 본격 도입한 사람이었습니다. 이 뛰어난 학자는 사람들의 수입을 조사해서 이를 수학적으로 분석하기 시작했습니다. 조사 결과, 거의 대부분의 사회는, 시대를 불문하고 몇 몇 엄청난 거부와 그저 그런 수준의 대부분으로 나눠진다는 것을 발견하게 되었습니다. 그는 이를 사회학적 관점에서 응용하며, '후생경제학' 의 기초를 놓게 됩니다. 다 같이 잘 살려면 어떻게 경제정책을 펴야 하느냐는 걸 얘기한 겁니다. 어쨌든, 파레토는 수입의 대부분을 소수가 가져간다는 것을 일찌감치 얘기해줬습니다. 위의 두가지 법칙은 실증적으로 증명이 된 사실들 입니다. 그리고 실제 우리가 직감적으로 느끼고 사는 사실이기도 하죠. 흥미로운 점은 이런 패턴이 웹싸이트에 있어서도 나타난다는 것입니다. 전체 웹은 물론이거니와 특정 카테고리로 한정을 해보아도 엄청난 트래픽을 끌어들이는 아주 소수의 웹싸이트와 그저 그런 무수한 웹싸이트들이 있더라는 겁니다. 바꿔 얘기하면 승자가 모든것을 차지하는, 승자독식(Winner-take-all)적인 특징이 웹에서도 나타난다는 것이죠. 이것을 보다 더 미시적인 수준에서 분석한 내용은 수확체증과 새로운 비즈니스 세계에 있습니다. 그 논문을 읽어보면 소위 '신경제'에 해당하는 시장은 종래와 같은 수확체감에 바탕을 둔 분석이 전혀 들어 맞지 않는다는 것을 알 수 있습니다.

    수확체증은 다음과 같은 이유 때문에 나타나게 됩니다.

    네트웍 효과를 통해서 규모가 큰 플레이어는 더욱 많은 신규 고객들을 더욱 쉽게 끌어 들인다는 점, 엄청난 규모의 선행투자 비용이 있어서 후발주자가 쫓아오는 것이 훨씬 힘들어 진다는 점, 일단 first copy가 완성된 후 부터는 사실상 제로에 가까운 생산비로 대량생산 해낼 수 있는데다가, 이러한 작은 생산비 조차 미리 확보된 거대한 기존 사용자층에게 분산함으로써 더욱 더 강력한 원가 경쟁력을 갖게 된다는 점, 대부분 '학습'을 통해서 배워야 되는 지식상품들은 한번 코가 꿰이게 되면 계속해서 그 회사 제품을 쓰게 될 가능성이 커지게 된다는 고객 학습 효과 때문에, 일등은 더욱 강력한 일등이 되고, 나머지는 더욱 더 쇠퇴하게 만든다는 것을 알아보았었습니다. 그리하여 시장은 소수의 회사로 불안정하게 기울어 지게 되고, 이러한 경향은 더욱 증폭 강화 됩니다. 그런데, 이런 패턴이 보다 거시적인 수준에서 관찰할 때도 분야를 불문하고 나타나더라는 것입니다. 지식 제품을 만드는 산업이 아니더라도 말입니다. 심지어 자연현상조차 그렇더라는 겁니다. 이것을 수학적으로 보다 깊게 풀어 놓은 논문이 제록스 파크 연구소 웹싸이트에 있습니다. 거기 보시면, 'Power-law 분포' 라는 것을 통해 www 의 특성을 잘 설명해 두고 있습니다.


    간단하게 요약을 해보겠습니다.

    사용자 수가 증가하면 증가할수록 그런 싸이트의 갯수는 더욱 줄어들어 가고, 특히 사용자 수가어느 수준 이상인 싸이트의 갯수가 갑자기 극단적으로 줄어든다는 것을 알 수 있습니다. 대부분의 트래픽을 끌어가는 몇 몇 대형 사이트와 비슷비슷한 수준의 작은 사이트 대부분으로 나뉜다는 것이죠. 또한 이렇게 아주 많은 트래픽이 몰려있는 소수의 센터격인 사이트가 있기 때문에 완벽하게 모든 정보가 링크되지 않은 상태인 웹이 그 규모가 방대함에도 불구하고, 사실상 매우 '좁은 세계' 처럼 동작하기 때문에 몇 다리 건너지 않아 원하는 문서로 접근하게 된다는 사실도 위에서 살펴본 파워-로 분포와 연관이 있습니다. 실제, 검색엔진을 디자인 함에 있어서도 이러한 트래픽이 몰리는 노드를 어떻게 취급할 것인가가 매우 중요합니다.

    소수의 강력한 자와,
    대다수의 그저 그런 자.

    이것이 자연 법칙이라면. 참으로 무서운 의미를 갖는 것이라 하지 않을 수 없겠습니다.


    - 출처 : 야후 지식검색

    '공부도 하고 > 깊이있는 것' 카테고리의 다른 글

    SOA (Service Oriented Architecture)  (0) 2007/09/05
    Transporting PicoKernel from IA32 to AVR(ATmega128)  (2) 2006/05/02
    DBTMA  (0) 2005/09/20
    지프의 법칙  (0) 2005/08/17

    총명님 공부도 하고/깊이있는 것