NOTICE 




  


MSXML6를 이용해서 XML을 파싱하는 MFC 애플리케이션을 만들어 보았다.


먼저 Visual Studio에서 다이얼로그 기반 MFC애플리케이션을 만든 후 MSXML를 사용하기 위해서 MSXML6 DLL를 임포트하였다. 물론 헤더파일을 include할 수 있지만 이 방법이 가장 손이 덜 간다.


<stdafx.h>


...


#import <msxml6.dll>

unsing namespace MSXML2;


...




그런다음 애플리케이션 클래스의 InitInstance()의 처음과 끝에 각각 COM라이브러리를 초기화하는 코드와, COM라이브러리를 해제하는 코드를 넣는다(실제로는 사용하기 직전에 초기화해도 문제 없다). MSXML은 COM 컴포넌트로 구현되어 있기 때문에 사용하기 위해서는 반드시 이 작업이 필요하다.

COM라이브러리를 초기화할 때 필요에 따라  ::CoInitialize()나 ::CoInitializeEx()중에서 선택해서 사용하면 된다. 자세한 내용은 MSDN을 참고할 것.


<MyApp.cpp>



BOOL CMyApp::InitInstance()

{

    //::CoInitializeEx(NULL, COINIT_MULTITHREADED);

    ::CoInitialize(NULL);


    ...


    기존 처리


    ...


    ::CoUninitialize();

}



이제 MSXML을 사용할 준비는 되었으니 실제로 사용하는 코드를 작성해 보자.

이 예에서는 다이얼로그에 버튼을 하나 추가하고, 그 버튼의 클릭 핸들러에 작성하여, 그 안에 MSXML을 사용하는 코드를 작성하였다.


<MyDlg.cpp>


void CMyClg::OnBnClickedButton1()

{

     LPCWSTR xml = 

        L"<?xml version='1.0' encoding='utf-8'?>"

        L"<itemlist><item>꽃</item><item>책</item></itemlist>";


    MSXML2::IXMLDOMDocument2Ptr pDoc = NULL;

    MSXML2::IXMLDOMNamedNodeMapPtr pNodeMap = NULL;

    MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;

    pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));

    if( !pDoc ) {

        return; // DOMDocument인스턴스 생성 실패

    }


    if( !pDoc->loadXML(xml) ) {

        return; // XML파싱 실패

    }


    pNodeList = pDoc->selectNodes(L"//itemlist");

    if( pNodeList ) {

        MSXML2::IXMLDOMNodePtr pNode = pNodeList->Getitem(0);

        MSXML2::IXMLDOMNodeListPtr pNodeList = pNode->GetchildNodes();

        if( pNodeList ) {

            MSXML2::IXMLDOMNodePtr pNode2 = NULL;

            while( (pNode2 = pNodeList->nextNode()) ) {

                CString nodeName = pNode2->GetnodeName();

                if( !nodeName.Compare(L"item") ) {

                    CString str = (LPCWSTR)pNode2->Gettext();

                    MessageBox(str);

                }

            }

        }

    }

}


좀 장황한 코드이지만 알고보면 무척 간단하다.


테스트를 위해 "책"과 "꽃" 아이템을 가진 아이템리스트를 정의한 간단한 XML를 만들었다.


위 코드에서 하는 일이란 XML을 파싱하기 위해 DOMDocument인스턴스 포인터를 얻어온 후, loadXML()메서드를 호출하여 XML을 파싱한 후에, 그 나머지 코드에선 그냥 값을 빼서 쓰고 있다. 값을 빼서 쓰기 위해서는 대개의 경우 노드를 찾고 그 노드의 하위를 열거하면서 읽어오는 방식을 쓴다. 트리 구조라고 생각하면 된다. 값을 빼오기 위해 위 예제에서는 IXMLDOMNode와 IXMLDOMNodeList를 사용하였다.



빌드해서 실행한 후, 버튼을 클릭하면 텍스트가 "꽃"인 메시지박스와 "책"인 메시지박스가 순서대로 표시된다.


정말 간단하지 않은가?



  
트랙백   |  댓글   |




  

리눅스에서 서버 프로세스를 개발하고 테스트하다 보면 서버 프로세스는 정상적으로 기동되어 있는데 다른 컴퓨터에서 접속이 안되는 경우가 있다.  여러 가지 이유가 있겠지만 포트가 열려 있지 않아서 그런 경우도 있다. 이 글은 그런 상황에서 포트가 열려 있는지를 확인하고 닫혀 있었다면 포트를 열어주는 방법에 대한 글이다.


리눅스에서 현재 열려 있는 포트를 확인하는 방법


열려 있는 모든 포트를 표시하기

netstat -nap

n:host명으로 표시 안함
a:모든소켓 표시
p:프로세스ID와 프로그램명 표시


LISTEN중인 포트를 표시하기

netstat -nap | grep LISTEN)



상대방 포트가 열려 있는지를 확인하는 방법

상대방 머신에 접속이 되지 않을 때 혹시 포트가 막혀 있는지를 확인해 보자.
netcat(nc) 네트워크 유틸리티를 이용하면 된다. 


특정 호스트의 특정 포트가 열려 있는지를 확인하기

nc -z 호스트주소 포트

ex) nc -z www.google.com 80

<결과예>

Connection to www.google.com 80 port [tcp/http] succeeded!

z: 포트 검색


특정 머신의 포트 범위를 지정하여 열린 포트를 확인하기

nc 호스트주소 -z 시작포트-끝포트

ex) nc 10.20.30.40 -z 19-21

<결과 예>
Connection to 10.20.30.40 21 port [tcp/ftp] succeeded!
Connection to 10.20.30.40 22 port [tcp/ssh] succeeded!
Connection to 10.20.30.40 23 port [tcp/telnet] succeeded!



포트를 열기

위의 방법으로 호스트의 포트가 LISTEN중임을 확인하였는데 상대방 호스트에서 포트가 열려있지 않다고 나온다면, 호스트의 포트가 막혀 있을 가능성이 있다.

포트를 열려면 iptables를 사용하면 된다. iptables는 리눅스 방화벽을 설정하는 명령어이다.

특정 포트를 외부에서 접속할 수 있도록 열기

iptables -I INPUT 1 -p tcp --dport 12345 -j ACCEPT 

I: 새로운 규칙을 추가한다.
p: 패킷의 프로토콜을 명시한다.
j: 규칙에 해당되는 패킷을 어떻게 처리할지를 정한다.

이 명령은 외부에서 들어오는(INBOUND) TCP포트 12345의 연결을 받아들인다는 규칙을 방화벽 1번 방화벽 규칙으로 추가한다는 의미이다.

이렇게 추가한 규칙은 조회나 삭제가 가능하다.


추가한 설정 조회하기

조회하기

iptables -L -v

L: 규칙을 출력
v: 자세히


추가한 설정 삭제하기

규칙을 삭제하려면 추가한 규칙의 번호로 삭제하는 방법과 추가했을 때의 명령어에서 "-I"를 "-D"로 바꾸어 주는 방법이 있다.

규칙번호로 삭제하기
iptables -D INPUT 1

추가한 규칙으로 삭제하기
iptables -D INPUT -p tcp --dport 12345 -j ACCEPT 

D: 규칙을 삭제


  
트랙백   |  댓글   |




  

Android NDK로 작성하는 라이브러리는 기본적으로 ARM CPU용으로 빌드된다. 다른 CPU용으로 빌드하고자 한다면 아래의 방법으로 할 수 있다.


1) 프로젝트의 jni폴더 아래에 Application.mk파일을 추가한다.

2) Application.mk파일에 APP_ABI를 추가하여 어떤 CPU용 라이브러리를 빌드할지를 지정한다.

만약 ARM CPU용과 Intel CPU용을 컴파일하고 싶다면 아래와 같이 Application.mk 파일을  추가하면 된다.



지정할 수 있는 CPU는 아래와 같다.

 armeabi

 ARM CPU(FPU를 갖고 있지 않음)

 armeabi-v7a

 ARM CPU(FPU를 갖고 있음) 

 x86

 Intel CPU 

 mips

 MIPS CPU

 all

 모든 CPU


어떤 CPU용의 라이브러리를 빌드할지 APP_ABI에 공백을 구분으로 쭉 열거해주면 된다.

만약 모든 CPU용의 바이너리를 빌드하려면 아래와 같이 그냥 all을 써주면 된다.

APP_ABI := all


NDK가 지원하는 CPU는 NDK docs폴더의 CPU-ARCH-ABIS.html를 보면 확인할 수 있다.


  
트랙백   |  댓글   |




  

안드로이드 NDK 개발환경을 구축하고 빌드를 하니 아래 에러가 발생했다.

ndk/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function: ''.  Stop.

인터넷을 검색해 보니 많은 사이트에서AndroidManifest.xml파일의 minSdkVersion을 낮추라는 해결책이 많았다.


하지만 minSdfVersion을 낮추어도 해결이 되지 않았다.

그래서 더 인터넷을 검색해 본 결과 그 해결책을 찾을 수 있었다.

윈도우에서 작성한 파일을 맥으로 갖고 온 경우 개행문자로 CRLF가 그대로 남아 있게 된다.


AndroidManifest.xml파일을 열어보니 위와 같이 각 라인의 끝에 CR문자가 남아 있었다.

이 문자를 제거하고 빌드를 하니 빌드가 되었다.


이 귀중한 해결책을 찾을 수 있었던 곳은 바로

Tech Racho(http://techracho.bpsinc.jp/baba/2013_02_19/6520)

이다. baba님 정말 감사합니다.


역시 안드로이드는 넘 오묘해~~~


VI에디터에서 ^M문자 제거하는 방법

명령모드에서 

:%s/^M$//g

를 입력한다.

이때 주의할 점은 ^M은 반드시 Ctrl+V, Ctrl+M으로 입력해야 한다는 것이다.


  
트랙백   |  댓글   |




  

내 13인치 맥북에어에서 안드로이드 개발환경을 구축하고 있었다.

안드로이드 에뮬레이터(안드로이드 버추얼 디바이스)의 속도가 느려서 HAXM(Intel x86 Emulator Accelerator(HAXM)를 설치하고 안드로이드 애뮬레이터를 시작시키니 시스템이 다운되어버렸다. 우연인가 싶어 맥을 재시작해봤는데도 같은 현상이 계속되었다.

내 맥북의 사양
1.8GHz Intel Core i5
메모리 8G 1600MHz DDR3
Intel HD Graphics 4000 512MB
OS X 10.8.2


해결하기 위해서 인터넷을 검색해 보니 인텔 사이트에 이 문제에 대한 패치를 찾을 수 있었다. 패치는 윈도우용과 맥용 그리고 리눅스용이 있었다.

인텔의 HAXM패치 페이지(Nov 14, 2012)

http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager

이 패치를 설치하고 나니 시스템이 재시작되는 현상이 없어졌다.


  
트랙백   |  댓글   |




  

여기서 담배 피워도 되나요(서울특별시편)

처음으로 만든 아이폰 앱입니다.
부족한 점이 많은 앱입니다. 앞으로 개선해 나가도록 하겠습니다. 감사합니다.

 

[앱소개]


 
 
흡연자들에게는 점점 더 괴로운? 시대에 접어들고 있습니다.
바로 금연구역이 점점 늘고 있기 때문이죠. 거기에다 금연지역에서 흡연할 경우에는 5-10만원의 과태료를
낼 수 있습니다. 과태료도 과태료이지만 함께 사는 세상인 만큼, 금연구역에서는 흡연을 하지 않는 것이 멋진 흡연자의 에티켓이겠죠?

그래서 만든 앱이 "여기서 담배 피워도 되나요(서울특별시편)"입니다.
이 앱은 사용자의 현재위치가 서울특별시가 지정한 금연구역으로 지정되어 있는지를 확인할 수 있는 기능과
상시 금연 지역에 대한 정보를 제공합니다. 금연구역이나 근처에 금연구역이 있을 경우에는
금연구역정보에 대한 정보와 과태료 정보를 함께 제공합니다.
 


메인화면엔 달랑 [금연구역확인]과 [금연정보]의 단 2개의 버튼이 있습니다.

[금연구역확인]버튼을 누르면 현재 위치가 금연구역에 있는지를 알려줍니다.

만약 금연구역에 있다면 위와 같이 [흡연 위험 구역입니다!!!]라고 맵 위에 표시됩니다.


지정된 금연구역이 없다면 아래와 같이[등록된 금연구역이 없습니다.]라고 맵 위에 표시됩니다.

화면하단에는 인접한 금연구역에 대한 정보를 보여줍니다.



또한 이 앱에서는 상시 금연 구역에 대한 정보도 함께 제공합니다.

감사합니다.



  
트랙백   |  댓글   |




  

1.Cygwin과 gcc컴파일러 설치하기

Cygwin은 윈도우를 위한 Linux-like환경이다.
Objective-C는 gcc컴파일러(2.8.0이상)로 컴파일이 가능하므로 윈도우즈에서 gcc컴파일러를 사용하기 위해 Cygwin을 설치한다.
설치본은 Cygwin웹사이트(http://www.cygwin.com/)에서 다운로드할 수 있다.
(물론 맥의 Cocoa플랫폼은 공개되어 있지 않기 때문에 사용할 수 없다.
하지만 Cocoa와 유사한 환경을 제공하는 Cocotron이라는 오픈소스 프로젝트도 있다)

설치할 때 다음의 패키지를 추가한다.

gcc-core:C compiler
gcc-g++:C++ compiler(C++도 함께 사용하는 경우에)
gcc-objc:ObjC compiler

필요하다면 vi나 emacs같은 텍스트에디터도 함께 선택한다.


2. 테스트해보기

에디터로 다음의 hello.h와 hello.m을 작성한다.

// hello.h
#import <objc/Object.h>

@interface Hello : Object
-(void)print;
@end

// hello.m
#import <stdio.h>
#import "hello.h"

@implementation Hello
-(void)print
{
  printf("Hello world\n");
}
@end

int main()
{
  id obj = [Hello alloc];
  [obj print];
  return 0;
}

자~ 이제 컴파일을 해보자~

gcc -v -o hello hello.m -lobjc
(옵션 -v는 컴파일 과정 출력  -o는 출력파일명지정 -lobjc는 Objective-C라이브러리 사용)

컴파일이 성공한 후, 생성된 실행파일을 실행하면 아래와 같이 "Hello world"가 콘솔에 출력된다.

사용자 삽입 이미지

그럼 본격적으로 Objective-C를 공부해볼까~

  
트랙백   |  댓글   |




  


iPhone용 어플리케이션을 개발하기 위해선...


다음과 같은 환경이 필요하다.

Hardware
Intel계열 CPU를 가진 맥 머신

Software
Mac OS X 10.5.3 이상
iTunes 7.7
iPhone SDK
(위의 사양은 2008년9월2일 기준)

*iPhone SDK는 애플 사이트에서 무료로 다운로드 받을 수 있다. (https://developer.apple.com/iphone/index.action)
개발에 사용하는 툴은 Xcode라고 하는데 iPhone SDK에 포함되어 있다.

*iPhone의 개발은 Objective-C라는 언어를 사용한다.
Objective-C는 C언어 기반에 Smalltalk의 객체지향 기능을 도입한 프로그래밍 언어이다.

iPhone용 어플리케이션의 테스트와 배포를 하기 위해선...


위에 기술한 환경에서 iPhone용 어플리케이션을 개발할 수 있고, iPhone 시뮬레이터를 이용하여 테스트도 할 수 있다. 하지만 개발한 어플리케이션을 실제 iPhone에서 실행해 보거나, 어플리케이션을 배포하는 것은 불가능하다. 개발한 어플리케이션을 실제 iPhone에서 디버깅을 시도하면 다음과 같은 에러를 만날 것이다.

Your mobile device has encountered an unexpected error (0xE8000001) during the install phase: Verifying application

이 에러는 작성한 어플리케이션에 코드사인이 되어있지 않기 때문에 발생한 것이다.
코드사인을 하려면 먼저 iPhone Developer Program에 가입해야 한다. iPhone Developer Program은 Stadard Program과 Enterprise Program이 있는데, 각각 99달러, 299달러의 비용을 지불해야만 가입할 수 있다.

사용자 삽입 이미지

http://developer.apple.com/iphone/program/


iPhone Developer Program에 가입하고 나서
 코드를 사인할 인증서(iPhone Development Certificate)를 만들고,
 어플리케이션 ID(App ID)를 만들고,
 Provisioning Profile을 만드는 과정을 거쳐야 한다.
 그리고 최종적으로 자신의 프로젝트 정보 설정에 만들어진 Provisioning Profile을 세팅해 주고 나면 실제 iPhone에서 자신이 만든 어플리케이션을 실행시킬 수 있다.

주의점
* iPhone Developer Program에 지원하고, 비용을 지불하고 나면 Activation Code 메일이 도착하는데, Activation이 되지 않는 문제를 겪을 수 있다. 그 원인은 등록할 때 입력한 정보가 잘못된 경우엔데, 이러한 문제를 방지하기 위해서 왠만하면 모두 영어로 적도록 하자.
만약 Activation되지 않는 문제가 발생하였다면, 수신된 메일 본문중에 있는 연락처로 메일을 보내면 도움을 받을 수 있다.(이것 때문에 안되는 영어로 메일 쓰느라 고생했다. 그런데 답변은 일본어로 왔다는... 그냥 일본어로 쓸껄... OTL)

*현재 시점에서 iPhone Developer Program의 Program Portal 사이트에 나와있는 도움말이 현재 버전과 맞지 않는 점이 존재한다. 앞으로 개선되리라 생각한다.

*Provision Profile을 프로젝트 정보에 세팅해 줄 때 iPhone Developer를 설정하는 부분이 있는데 다음과 같이

              iPhone Developer: KWANGSU SHIN

콜론(:)과 이름 사이에 스페이스를 넣어주어야 한다. 그렇지 않으면 인식을 하지 못하는 어처구니없는 상황을 경험하게 될 것이다. (하도 안되길래 소주 나발불고 울뻔 했다 ㅎㅎㅎ)

맥 어플리케이션을 개발해 본 경험이 없는 개발자가 처음 세팅부터 시작해, iPhone에서 어플리케이션을 실행하는 데까지 결코 적지 않은 시간이 걸릴 것이다.

앞으로도 얼마나 많은 삽질을 해야할런지...まぁ~やるしかないかな!

앞으로 열씨~미 Objective-C를 공부해야 겠다.
  
트랙백   |  댓글   |
 이전  123   다음 

최근댓글
최근트랙백
fotowall :: ncloud RSS Feeds today :    yesterday :
total :