juniac.net

Develop

Categories

vsftp does not work on AMD CPU (include VM) Ubuntu 13.04

05/23/2013

I installed ubuntu 13.04 64bit on AMD CPU 64bit machine.  then installed vsftpd too.

but always returns 530 error code when I connect to server.

so I googled about this problem.

There is another vsftpd package that works on AMD 64bit CPU sombody patched.

before I use patched vsftpd, I couldn’t find a log at /var/log/vsftp.log

but patched package prints a log but I can’t connect to server.

 

There are so many ISP runs AMD 64bit CPU for their Virtual Machines.

 

 

iPhone SDK 3.0 XML Parsing with NSXMLParser

08/26/2009

iphone sdk 3.0으로 XML데이터를 파싱하다가 몇가지 사실을 알게됬다

 

iphone sdk 2.x 대로 개발된 XMLParser Class가 있어서 그것을 사용하여 빌드를 해 보려는데

에러발생으로 빌드가 되지 않았다.

 

코드는

파싱 함수코드는

 

 

였는데

NSXMLDocument undeclared … 에러 발생…

SDK API를 찾아보아도 NSXMLDocument Class는 찾을 수 가 없었다.

그런데 빌드를 2.0으로 하면 에러없이 잘 됬다.

 

어쨌든 SDK 3.0으로 개발을 해야되니 일단 에러발생을 없애기 위해서

이런 함수로 파싱을 시작

 

그러나 파싱실패. 이유는 XML데이터가 온전하지 않는 데이터

태그 안에 특수문자가 있어 CDATA로 감싸야 되는 상황

급한대로

 

 

 

이런식으로 잘못된 데이터를 교정하는 함수를 만들어 얻어온 XMLString을 교정하도록 하였다.

NSData 에 dataUsingEncoding이라는 함수로. NSString 형식을 NSData로 변환 할수 있다 (물론 Charset에 맞게)

NSString 의 stringWithContentsOfURL 은 PHP의 file_get_contents와 같은 놈.

쓰레드로 잡고있는듯 하다. 실행완료후 다음코드 진행, 무엇인가 메시지를 발생시키거나 Delegate 를 지정하여 Delegate Method를 실행시키는 등의 복잡한 방법이 필요없이 편하게 잘된다. (Cocoa의 API인데..)

 

다음은 교정하는 함수

 

 

 

이는 <link></link>안을 CDATA로 감싸는 메쏘드인데

NSString 의 strignByReplacingOccurencesOfString 메쏘드로 replace해버린다

첫번째 파라메터가 target, 두번째 withString이 replace될 String

프로시져 형식의 메쏘드가 아니라 새 String을 리턴한다. NSString을 인스턴스화 해서 해보진 않았다. API상에 그냥 return new … 이렇게 써있어서.

 

 

어찌되었든 이런 특별한 경우가 아닌 경우 – 정확히 작성된 XML을 가져올 경우- 에는 XML파싱을 위해 XML의 구조를 “먼저” 알고 있어야 한다. URL일 경우에는 브라우져로, 파일인 경우에는 읽어서 판단.

왜냐면 NSXMLParser에서 중요한 4개의 메쏘드가 parsing작업을 담당하는데,

이는 트리구조를 직접 만들어 주지 않는다. AS 3.0이나 뭐 여타 라이브러리들의

TREE구조 혹은 Hash Object형식으로 만들어 주지 않는다. 어떻게 해주는지는 밑에 설명

 

NSXMLParser  delegate  메쏘드들 중에 가장 중요한 4가지

 

 

 

 

이렇게 네가지

첫번째 parseErrorOccured 는 파싱중 에러발생시에,

두번째 didStartElement는 <>로 감싼 태그를 만날 때

세번째 didEndElement는 </>로 감싼 태그를 만날 때

네번째 foundCharacters 는 didStartElement 와 didEndElement “후” 에 String을 반환한다.

 

중요한 것은 네번째 foundCharacters인데

이것은 didStartElement 이후, didEndElement 이후에 delegate된다

이것이 무엇이냐

didStartElement 이후 delegate되는 경우에는 파라메터로 엘리먼트안의 데이터가 넘어온다

그러나

didEndElement 이후 delegate되는 경우에는 파라메터로 무언가 (== nil 혹은 == @”” 가 아님.) 넘어오는데

여튼 쓸수 없는 값이다 (\n인가)

 

그래서 delegate method를 작성할때 많은 예제들에서 사용하는 방식이

xmlValue를 전역 변수 선언해 놓고

didStartElement안에서 xmlValue를 빈 값으로 리셋

xmlValue = @””; 이런식

 

그리고 foundCharacters 에서

xmlValue = string 으로 할당

didEndElement에서 xmlValue를 알맞은 곳에 사용

 

하는 형식으로 작성해야 한다. foundCharacters안에 string을 직접 알맞은 곳에 사용하다간 didEndParsing 이후 delegate되는 foundCharacters의 이상한 string값이 잘못 사용되어 지기 때문이다.

이것은 SDK 2.x대의 NSXMLDocument를 사용한 구조에서는 발생하지 않는다고 한다. 2.x에서 NSXMLDocument를 사용한 경우에는 foundCharacters 가 한번만 호출.

뭐 XML데이터가 잘못되어 SDK3.0에서도 한번만 호출되더라도 이런 경우가 발생 할 수 있기 때문에

전역 xmlValue를 update하는 방식으로 XML data를 관리하는것이 낫겟다는 생각이다.

 

 

그리고

Tree구조가 아니기 때문에

didStartElement에서 elementName으로 얻어오는 tag name을 가지고 판단하여

알맞은 NSMutableDictionary나 array나 뭐 구조체처럼 쓰이는 Class등에 데이터를 migration할수 있겟다.

 

NSMutableDictionary 구조가

people – title

– name

– friend – best

– worst

뭐 이런식이라면

 

XML데이터가 트리구조로 되어있던 뭔구조로 되어있던간에

tag name이 title이면 didEndParsing 에서 dictionary의 title key값에다가 직접 set을 해줘야된다.

best든 worst 키값이던간에 평면적으로 넘어오는 데이터를 트리구조로 변환해야되는 것.

 

 

 

 

Older Posts