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

  1. 2011.11.15 [iphone] IOS 5.0.1 TextFiled Error Bug
  2. 2011.11.11 [wp7] WCF Rest 에서 Cookie값 받아오기(WCF Login Server Session) 1
  3. 2011.11.08 [iphone] IPAddress 얻어오기
  4. 2011.11.08 [wp7] EUC-KR을 윈폰7에서 사용하기 5
  5. 2011.10.24 [Portfolio] 아이폰 앱 "나도 작가다 App"
  6. 2011.10.19 [Portfolio] Window Phone 7 Cross Marketing + Nofication
  7. 2011.10.19 [PortFolio] Surface 로봇캅 폴리 (Hugeflow,2011.05,Tag 이용)
  8. 2011.10.19 [Portfolio] Window Phone 7 App "Fortune Coins" (Hugeflow, 2011.01 ~ 2011.05)
  9. 2011.10.19 [Portfolio] Window Phone 7 App "Look n Type" (Hugeflow, 2010.09 ~2010.12)
  10. 2011.10.19 [Portfolio] Windows Phone7 App "ToolBox" (Silverlight,C#,wp7,휴즈플로우) 2010.9 ~ 2010.12
  11. 2011.10.19 [Portfolio] 이노티브에서 했던 일들(2008.12 ~ 2009.10)
  12. 2011.10.19 [Portfolio] MBC 문화센터 프로그램, 쇼핑몰 홈페이지,EKP 그룹웨어 메신저,알리미 (2007년,넷블루,VB,C#,ASP,MSSQL)
  13. 2011.10.19 [Portfolio] JAVA 서버, 클라이언트 멀티 쓰레드 채팅 프로그램
  14. 2011.10.18 [Portfolio] ASP + 플래시 보안 관리 프로그램, 보안 진지 프로그램
  15. 2011.10.18 [Portfolio] 군대에서 요긴하게 써먹었던 VBS+Shell Script 2
  16. 2011.10.18 [Portfolio] 플래시 동아리 홈페이지
  17. 2011.10.18 [Portfolio] SKY IRC (최초 대중적인 채팅 프로그램) 1
  18. 2011.10.17 [iphone] xcode4에서 앱을 마켓에 등록 하기...삽질 일기 2
  19. 2011.10.14 [iphone] application executable is missing a required architecture armv6 에러 해결법 2
  20. 2011.10.07 [iphone] XMLParser, XMLManager에서 메모리 누수 문제 해결!!!
  21. 2011.10.06 [iphone] 이미지 캐시 라이브러리
  22. 2011.10.06 [iphone] 메모리 관리를 위한 간단한 코딩 습관
  23. 2011.10.05 [iphone] UITableView Scroll Top으로 올리기
  24. 2011.09.30 [iphone] UILabel의 SizeToFit을 여러번 호출할때
  25. 2011.09.27 [iphone] 디버깅상태에서 retain count를 보고 싶을때...
  26. 2011.09.23 [iphone] viewDidAppear 한번만 호출하기
  27. 2011.09.23 [iphone] viewDidAppear 호출이 안될때...
  28. 2011.09.23 [iphone] TableView Custom Cell에 버튼 이벤트 받기 3
  29. 2011.09.22 [iphone] 아이폰에서 ipaddress 얻어오기
  30. 2011.09.21 [iphone] 발전(업그레이드)된 XML Parser 사용하기
iPhone App2011. 11. 15. 17:02
이거때문에 반나절을 삽질 했다.

일단 사건의 발단은 이렇다.

나도 작가다 앱 테스트까지 마쳤는데 

IOS 5.0 까지 모두 잘 되었는데 5.0.1(배터리 문제만 해결했다는 버전)으로 업글 한사람들은

글을 쓰기 위해서 Focus를 TextField로 가는순간 앱이 죽어 버렸다.

코레일로 바쁘지만 크리티컬한 에러이고 책임감에 불싸여서 쉽게 해결 할줄 알았고 인터넷에도 같은 문제로

많은 어려움을 겪고 있을꺼라 생각하고 검색했더니?

아니 이게 머야? 아무리 모든 검색어를 동원해도 나오질 않았다.!!! 사람들은 모르는건가? 버그인것을?

아니면 내앱에서만 나오는건가? 코딩이 문제인것인가? 

일단 쉽게 해결되지 않을꺼라는 것을 깨닫고 코레일 일정에 맞추어 작업을 하고 싶었지만 도저히 버그를 앞에 두고

딴 작업이 쉽게 될리가 없었다. 일단 에러가 났는데

int main(int argc, char *argv[]) {

    

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;

}


자꾸 이부분에 걸려서 NSZombie를 사용하는데도 불구하고 잡히지를 않았다 stack도 봤지만.. 기계어뿐...

콘솔에서 에러가 나나 싶어서 살펴 보았더니
 
wait_fences: failed to receive reply: 10004003

이런 에러가 하나 나왔다. 흠..

검색해서 보니 또 alert랑 textfiled resignFirstResponder 에러라길래 다 삭제도 해보고 별짓을 다 해봐도 에러가 났다.

결국 삽질해서 해결한건 바로

UITextFiled의  Keyboard를 기존 Default에서 E-mail Address로 변경했더니

잘되었다. 헐... 

인터넷에 세계 최초로 올리니 나처럼 삽질하는사람에게 도움이 되기를.. 아마 5.0.2 에서 패치 될꺼 같지만~
Posted by 동동(이재동)
Windows Phone 72011. 11. 11. 15:27

아… 대단하다 이것 때문에 하루종일 샤워 할때도.. 꿈꿀때도 아침에 일어날때도 계속 이것을 어떻게 해결해야하나 싶었다.

현재 윈폰용 코레일 앱을 만드는데 EUC-KR에 이어 난항을 겪었다.

사건의 발단은 이렇다.

코레일에서 Rest Sevice를 이용해서 XML등을 읽어와서 파싱하는데

예약 현황 같은것은 로그인을 해야만 가능한것이였다.

웹에서를 예로 들면

로그인 인증 페이지 URL을 접속 해야만 예약 현황을 볼수 있는 페이지를 볼수 있었다.

만약 로그인 인증 페이지 URL을 먼저 접속하지 않으면 예약 현황 페이지에서는 로그인을 해야만 볼수 있다라고 뜬다.

그래서 내가 한방법은 Webclient를 이용해서 로그인 인증 페이지를 먼저 접속 후 예약 현황 페이지를 다시 호출한것이였다.

하지만 그 방법 역시 작동을 안했다. 구글링을 해서 좀더 로우레벨로 해보기로 하여 HttpWebRequest로도 해보고 아이폰쪽 소스도 보고 별짓을 다 했다.

결국 해결한것은 바로 쿠키였다 철도청 관계자는 서버 세션 유지라고 해서 난 쿠키랑 아무런 관계가 없을줄 알았다. 여기서 시간을 엄청 소비했다.

태규형님에게 도움을 요청했고 비슷한 사례를 하나 찾아주셧다.

http://bytes.com/topic/net/answers/426631-web-service-session-winform-client

결국난 CookieContainer 를 설정해야 한다는것을 깨닫고

Webclient를 override해서 가능하다는것을 깨달았다.

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/149d545f-b605-4fce-b29a-2bfb1c51fbbe

하지만 그것은 WinForm에서는 작동했지만 윈폰에서는 약간의 보안문제로 다시 수정,보완을 하였다.

결국 성공.. 이틀동안의 삽질에 대한 눈물이 났다. ㅠㅠ

다음은 이틀 동안 고생해서 내가 만든 윈폰7용 소스이다. 이건 진짜 인터넷에 하나도 없다 ㅠㅠ

public class CookieAwareWebClient : WebClient
    {
        private CookieContainer m_container = new CookieContainer();

        [SecuritySafeCritical]
        public CookieAwareWebClient()
        {
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).CookieContainer = m_container;
            }
            return request;
        }
    }

사용은 그냥

 _webClient.OpenReadAsync(new Uri(url));  _webClient.OpenReadCompleted 
 
를 사용하였다.             
Posted by 동동(이재동)
iPhone App2011. 11. 8. 16:26
참조 : http://mastership.kr/entry/iPhone-iPod의-네트워크-주소-알아내기

사용법



Posted by 동동(이재동)
Windows Phone 72011. 11. 8. 11:46

이번에 코레일 프로젝트를 맞게 되었다.

하지만 코레일은 EUC-KR로 된 XML이였고 윈폰과 실버라이트는 지원하지 않았다.

하지만 어떤 고마우신분이 라이브러리를 제공해 주셧다 프로젝트 시작하기 3일전에… 타이밍!!!

일단 외부에서 EUC-KR로 된 xml파일을 윈폰에서 사용하는 방법

 

public void GetXmlData(Action<Dictionary<string, string>, Exception> callback, string url)
{
    WebClient webClient = new WebClient();
    webClient.OpenReadAsync(new Uri(url));
    webClient.OpenReadCompleted += (s, e) =>
        {
            Stream readStream = e.Result;
            Byte[] euckrXML = new Byte[readStream.Length];

            readStream.Read(euckrXML, 0, euckrXML.Length);
            readStream.Close();

            var temp = EUCKR_Unicode_Converter.GetUnicodeString(euckrXML);
            XmlReader reader = XmlReader.Create(new StringReader(temp));
            XElement xe = XElement.Load(reader);

            //상위 element data
            Dictionary<string, string> dict = new Dictionary<string, string>();
            foreach (var item in xe.Elements())
            {
                dict.Add(item.Name.LocalName, item.Value);
            }

            //다수의 하위 elements data
            var query = from item in xe.Descendants("trn_infos").Descendants("trn_info")
                        select item;

            List<Dictionary<string, string>> trnsInfos = new List<Dictionary<string, string>>();
            foreach (XElement item in query)
            {
                Dictionary<string, string> trnInfo = new Dictionary<string, string>();
                foreach (XElement subItem in item.Elements())
                {
                    trnInfo.Add(subItem.Name.LocalName, subItem.Value);
                }
                trnsInfos.Add(trnInfo);
            }

            //출력
            foreach (var item in trnsInfos)
            {
                foreach (var subItem in item)
                {
                    Debug.WriteLine("{0}:{1}", subItem.Key, subItem.Value);
                }
            }

            callback(dict, null);
        };
}

 

위의 XElement 까지만 참고하면 될꺼 같다.

나머지 소스는 그냥 xml을 dictionary로 바꾸기 위한 소스코드이다.

자 이제 euc-kr은 문제 없이 웹으로 부터 받아서 파싱 가능한 상태이다.

그렇다면 보낼때는 어떻게 해야할까?

내가 원하는 결과 값 : 서울 -> "%BC%AD%BF%EF"

이다. 원래 같았으면

string encodingResult = HttpUtility.UrlEncode(url);

이런식으로 urlencode를 이용하겠지만  이렇게

해서 해결하였다.

Byte[] temp = EUCKR_Unicode_Converter.GetEucKRString("서울");
StringBuilder sb = new StringBuilder();
foreach (byte b in temp)
{
    sb.AppendFormat("%{0:x}", b);
}

sb.tostring();

카일로님이 만드신 소스 정말 유용한거 같다.^^

원본 소스다.

Posted by 동동(이재동)
포트폴리오2011. 10. 24. 11:33


이앱을 만들기 위해서 그전에 칼로리 계산기라던지 hugeboard라는 앱등을 만들어 보았지만 정식 App Store에 올리는 첫 앱입니다.

http://www.1004story.com

사이트를 App으로 만든것인데 서버는 WCF Rest 서비스를 이용하였고 서버에서 XML형식으로 데이터를 보내주면 아이폰에서 파싱해서 사용자들에게 보여주는 앱입니다.

이앱을 만들기 위해서 XmlManager, XmlParser를 직접 만들었으며 현재 인기를 끌고 있는 Facebook, Twitter 앱을 모티브로 해서 만들었습니다. 

구현한 기술
-Refresh to Scroll (위로 올렸다가 내리면 리로딩)
-페이징 (한번에 모든 페이지를 보여주는게 아니라 스크롤이 내리면 10개씩 데이터를 로드)
-Xml Paring (XML 파싱 라이브 러리를 사용한게 아니라 NSParser를 직접 개조해서 제작)
-Twitter,Facebook 연동
-이미지 캐시(Tableview 속도 UP)
-커스텀 테이블 뷰 구현
-달력 컨트롤 사용

등등 입니다.


앱 다운받는곳

http://itunes.apple.com/kr/app/id470488910?ls=1&mt=8



 이외에도 디자인 적용이라든지 로그인 구현이라든지 자잘한게 있지만 스크린샷으로 대체 하겠습니다.














아래는 우리 수석 디자이너 이기백씨가 수정한 이미지 입니다.




 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 17:32


현재 모든 휴즈플로우 앱에 장착했던 Cross 마켓팅 페이지

나는 주로 About 페이지로 불렀는데 이미지와 글을 서버로부터 받아와서 클릭시  마켓으로 자동 연결해주며

서버와 연동이 되기때문에 앱이 새로이 추가가되면 앱소개와 이미지가 자동으로 추가 된다.

그래서 자동으로 마켓팅이 되는 페이지 이다.

그리고 Notifiations을 지원하여 앱이 추가 되거나 변경될시 푸시 알림, 아이콘 변경 알림등 여러가지 방법으로 알려준다. 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:56

태그를 이용해서 surface에 책을 올려놓고 페이지를 넘길때마다 화면이 바뀌는 프로그램

동영상, 사진 등 멀티미디어적인 요소를 보여준다.

http://hackss.tistory.com/entry/surface-surface-런칭쇼에-내가-만든-프로그램-공개

이전에 올린 포스팅 참고

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:21

휴플에서 만든 최초의 소셜 게임입니다.

-Camera, Compass, Accerometer AP 사용
-WCF 웹서비스 연동

여러가지 기능이 있지만 설명은 일단 생략




아래는 디자이너 기백씨가 수정한 이미지



자세한 정보는 여기에

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:17
걸으면서 타이핑을 할수 있는 앱입니다.

-자주쓰는 텍스트 저장기능
-SNS 연동기능(Twitter,Facebook)
-Camera 사용
-폰트 및 색 변경 기능




자세한 설명은 여기에

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:13

휴즈플로우에 처음 입사후 맡은 프로젝트 입니다.

윈도우폰7이 실버라이트 기반이라서 머 여러가지 역경이 있었지만 무사히 마친 프로젝트 입니다.

구글링을 하면 더 자세한 설명과 동영상이 나옵니다.

자세한 설명은 여기에




 

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:01
Control Server Manager 개발 및 유지보수(WPF/WCF/Blend) 2008.12 ~ 2009. 10
 -WCF Service와 Ado.net 을 이용하여 DB 업데이트
 -DataGrid에 직접 Binding을 걸어 엑셀과 같은 CRUD 구현
 -WCF Service를 이용하여 매니저에서 파일전송 기능 구현
 -DB Management 대신 손쉽게 DB 정보를 수정하여 편리성 향상 기여
 -모든 WPFControl 디자인 직접 수정 (템플릿 포함) 
 -DataGrid(ToolKit) 디자인 수정 중급 강좌 등록(훈스닷넷)
 -그외 ComboBox Tab Control 등 블랜드로 직접 템플릿 수정


 Innotive Console Basic Prototype 개발(WPF/Blend)
 -혼자서 진행한 프로젝트
 -WPF에서 지원하지 않는 MDI 형식 자체 개발
 -드래그엔 드랍 기능 개발 
 -무제한 모자이크 뷰 개발
 -MDI 창 정렬,크기조정,숨기기 지원
 -Treemenu에서 Drag and Drop 지원

 Smooth Streamming Server / Client 개발 (C#/Silverlight)
 -Smooth Streaming Server 제어 프로그램 개발(IIS 직접제어)
 -Smooth Streaming Player 모자이크뷰 성능테스트 클라이언트 개발(Silverlight)

 Innotive Server 자동설치 스크립트 개발(PowerShell)
 -IIS, MSSQL 2008 Server 무인설치 스크립트
 -각종 서비스 등록 및 Server 테스트 스크립트 제작

 OCP Inno Search 프로그램 제작 (PHP/Silverlight/C#)
 -책안의 내용물까지 검색하여 뷰어로 표시
 -내용물을 DB에 입력하는거 대신 Window Search 4.0 을 이용하여 검색시간 대폭 단축
 -결과물을 Ajax Browser/Silverlight Browser/Flash Browser 등 다양하게 표출 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 15:49
대학교 3학년 마쳤을때 난 실무 프로그래밍이 어떤지 궁금했었습니다.

내가 지금까지 개발한거와 많은 차이가 있을까? 팀 단위 개발은 어떻게 할까? 소스관리는 또 어떻게 할까?

라는 끊음없는 의문점이 들기도하고 걱정도 들었습니다.. 그 당시 학교에서 배운거는 그냥 간단한 홈페이지나 DB사용이 다여서 좀더 욕심이 났던거 같습니다.

하지만 4학년을 올라가기전에 찬스가 왔습니다.. 바로 회사를 인턴으로 이수를 하면 한학기 학점을 준다는 솔깃한 제의였습니다.

이렇게 함으로써  저는 넷블루라는 대구에 있는 회사에 근무하게 됩니다. 당시 전 영대 근처에서 자취를 했었기 때문에 1시간이면 대구에 있는 회사를 갈수가 있었죠 물론 버스 한번 갈아타고 지하철 한번타고 또 다시 버스를 타야 하는 불편함이 있었지만 첫직장이라는 기대반 설레임반으로 정말 시간가는줄 몰랐습니다.

그쪽의 형들(?)도 친절했고 시간마다 담배 피러 가는 재미도 솔솔했습니다. 저는 유일하게 그쪽에서 담배를 피지 않았기 때문에 그냥 물한잔 들고 쫄랑 쫄랑 따라가서 프로그래머라는 직업에 대한 궁금적인것을 묻고 세상사는법을 조금이라나마 배울려고 항상 귀찮게 했죠. 그당시 제가 맡은 것은 응용프로그램 파트였는데 모든 사람들이 JSP 웹쪽이라 혼차서 모든것을 해야만 했었습니다.

저는 주로 ASP나 VB를 다루었었는데 VB로는 대구 MBC  회원 관리 프로그램을 짰었고 ASP로는 쇼핑몰 홈페이지를 관리 하였습니다. 

처음부터 제가 만든것은 아니고 이미 만들어져 있던  VB 회원 관리 프로그램에 마일리지 기능을 추가 하는것이였는데
마일리지 기능을 추가할려니 모든 기능을 알아야 하고 프린트부터 DB까지 모두다 알아야만 가능했기때문에
처음 일주일은 업무 분석에 들어갔습니다. 

그당시 기본 쿼리만 할줄알던 제가 서브쿼리부터 시작해서 엄청나게 분석했었죠 하나 하나 나누어서도 실행해보고 ㅋ
하지만 그때 VB를 처음으로 제대로 해서 좋은 경험이 되었다고 생각합니다.  그리고 좋은 툴임에도 불구하죠
그냥 간단하게 짤때 그당시에는 생산력이 엄청 좋았거든요 하지만 당시 Visual Studio 6.0 툴을 써서 좀 불편하던 기억이 납니다.

현재 Visual Studio 2010을 쓰는데 그때는 참 어떻게 썻나 싶군요~

ASP는 주로 쇼핑몰을 유지 보수하는데 사용했었습니다. 넷블루 쇼핑몰은 죄다 ASP로 되어있더라구요
소스를 보면서 좀 어의 없는 코드가 많이 있었지만.. 예를들면 for문 쓰면 될것을 하드코딩으로 한다던가... 헐.~~!!!

머 자잘하게 코드를 대량 수정하는도중 쇼핑몰 관리자에게 전화가 왔었습니다.(그때는 전화도 제가 받았다는 ㅠㅠ)

쇼핑몰에 이미지 업로드가 안된다는 이야기였습니다.  그리고 얼마전까지는 됬다구요.. 그말을 듣는순간 여러가지 생각을 했습니다. 예전까지는 잘되었다면 소스문제 보다는 iis문제인가? 라는 의문점이 들더군요 하지만 iis가 문제라면 홈페이지도 안되야 되지 않나라는 생각도 들어서 테스트를 해보았더니 응답이 없을정도로  서버 cpu 사용량과 iis 메모리 사용량이 늘길레 실제 업로드 되는 폴더를 보니 과관이었습니다. 이미지가 10000개 정도 있는데 모두 한폴더에 업로드가 되어있더라구요...한 폴더에 엄청난 양의미지가 있다보니 시간이 오래걸릴수밖에요...
년도별 월별로 폴더를 나누고 이전 이미지도 호완되도록 수정은 했던 기억이 납니다.

역시 ASP로 NUC C/S 프로그램 수정 및 유지보수(templet방식의 ASP,MSSQL) 했었고

EKP 그룹웨어 알리미(JSP,MYSQL,VB) 제작
EKP 연동 메신저(C#,MYSQL)제작

했던기억이 납니다 형들이 JSP로 주로 그룹웨어를 만들곤 했었는데 
결제가 오거나 메세지가 오면 알려주는 알리미도 만들고 그당시에 C# 공부겸 자바로 했던 네트워크 경험을 살려서
연동 메신저도 만들었습니다. 

스크린샷은 여기에 포스팅 

http://hackss.tistory.com/entry/c-메신저-PreView

현재 위에는 초기버전 메신저를 만들었었는데 그뒤로 UI나 기능을 바꾼 완성본은 아쉽게도 스크린샷이 없네요

현재 넷블루 회사는 없어졌다고 들었습니다.  ㅠㅠ

요약
NUC C/S 프로그램 수정 및 유지보수(templet방식의 ASP,MSSQL)
 MBC 문화센터 프로그램(VB,MSSQL) 유지보수 및 수정 새로운기능 제작
 EKP 그룹웨어 알리미(JSP,MYSQL,VB) 제작
 EKP 연동 메신저(C#,MYSQL)제작

 
Posted by 동동(이재동)
카테고리 없음2011. 10. 19. 13:14
예전에 SKYIRC로 흉내만 냈더라면 이번에는 JAVA를 이용하여서 멀티 쓰레드 채팅프로그램을 만들었습니다.

이것도 역시 군대에서 사비버팀에 있으면서 일정보다 일찍 개발을 끝내고 틈틈히 공부해서 만들었던 프로그램입니다.

군대에서 인터넷을 할수 없었던 터라 외박 나왔을때 산 책과 몰래 가져온 Java API문서를 이용해서 만들었습니다.

역시나 웹만 주구장창 하던 시절 이번에는 누군가에게 보여주기 위해서가 아닌 나자신을 위해서 그리고 네트워크 프로그래밍을 접해보고자 만든 프로그램입니다.

자바로 서버를 만들기에는 정말 적합했지만 클라이언트면에서는 조금 부족했기때문에 그당시에 제가 만들때 AWT 와 Swing이 있었는데 저는 화려한 UI를 위해 역시 Swing을 택하여 클라이언트 프로그램을 만들었습니다.

멀티 쓰레드 프로그램이라는게 그당시 저에게는  약간 어려운 개념이였고 난 넷마블같은 오목 세이클럽 같은 채팅프로그램
을 생각하면서 열심히 만들었습니다. 그 당시 이클립스 툴로 짰었는데 이건 머 메모장이나 해봐야 드림위버나 쓰던제개 충격적인 프로그램이었죠..  디버깅도 예전에는 print로 보았고 만약 쓰레드나 배열 안에 있는 내용을 보기 위해서 toString()같은 것을 써서 하나하나 확인해야했었으면 끔찍했었을것입니다. ㅠㅠ 

그렇게 해서 멀티 쓰레딩을 이용한 채팅방을 만들었습니다.
그때 기능이라곤 방만들기, 방접속, 방안에 채팅, 방안에 사람 보기,쪽지 보내기 정도 였죠.. 하지만 처음으로 서버/ 클라이언트 프로그래밍을 했었고 나름 그당시에 군대에 인트라넷 안에서도 프로그래밍 동호회 같은게 있어서 JUnit으로 나름 유닛  테스트도 했었죠

사실 지금도 바쁜 개발 환경속에 유닛 테스트는 잘못하지만 그냥 그 당시에는 제개 많은 것을 깨우치게 해준 시절인거 같습니다.
 
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 15:13
이것도 역시 군대에서 만들었던 프로그램입니다.

전산실 상병 꺽이고 사단장이 사이버 팀이라는것을 만들고 제가 팀장으로 임명되었습니다.

그리고 각 연대에서 3명이 와서 총 4명으로 사이버 팀이 결성이 되었죠

근데 팀원들 3명이 다 px병,보병 ㅠㅠ 거기다가 모두 이등병... 어쩔수 없이 혼자서 만들었습니다.

첨에 임무가 html로만 이루어진 보안진지 프로그램이였고

이건 큰프로젝트 였었습니다. 사단의 모든 연대의 작전병들(약 30명정도?)를 데리고 진지의 위치 및 

진지 설명을 하는 웹페이지 였습니다.

저혼자만 할수 있는 프로젝트가 아니라 작전병들에게 제가 어떻게 하는지 가르쳐주고 해야 하는 작업들이라

팀워크가 중요했고 저는 그렇게 모인 자료를 짜집기 하고 통합하는 작업을 하였습니다.

그리고 모든게 완성 되었을때 사단장 ,군단장까지 가서 발표하고 정신이 없었습니다.

그리고 그뒤에도 몇개의 프로젝트가 있긴 했는데 그중 생각나는게 ASP와 플래시로 만든 보안 관리 프로그램입니다.

플래시와 ASP를 연동해서 역동적이게 보이면서 프로그램적인 기능도 모두 들어가서 보여주기식의 군대 시스템에 

적합했습니다. 단.. 기획, 디자인, 개발을 제가 다해서 힘든 작업이었죠...

역시 군대 프로그램이라 스크린샷이 없습니다. 군대에서 찍어올걸 아쉽군요... 다시 군대 갈수도없고(헉!!!)

 
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 14:43

때는 바햐흐로 제가 35사단에서 근무했던 군대로 돌아갑니다.

 저는 원래 통신병 이였습니다. VHF 병이 였죠... 하지만 당시에 전산병 인가가 모잘랐고

저도 통신병보다는 전산병을 원했기 때문에 들어오자마자 전산병을 하였습니다.

전산병은 생각보다 힘든 직업이라는걸 아무도 모를것입니다. 하지만 나름 편한점도 많았죠.

근무시간은 제가 있었을시절에는  밤 10~12시사이에 근무가 꼭있는데 전산실에서 사수 부사수가 2명이서 전산실을 지키는 일입니다. 그때 저는 막내라 항상 부사수 위치에 있었기때문에 일지를 써야했었죠

일지 쓰는일은 생각보다 시간이 오래걸리고 귀찮은 일이였습니다.
처음에는 아무것도 모르기때문에 거의 2시간동안 이리저리 뛰어다니면서 했었습니다. 하지만 한달이 지나고 두달이 지나니깐

이거 원 반복적인 작업을 계속 하고 있고 패턴이 보였습니다.

일단 엑셀작업같은것은 매크로+VBS로 해결함으로써 버튼 하나로 해결하였고
복사 작업 같은것도 VBS로 해결하니 엄청 편하였습니다.

기존에 BAT 파일 즉 배치 파일이죠.. 초딩부터 사용해오던 autoexec.bat 를 수많이 수작업을 많이 해오던 터라
배치파일이 편하였지만 VBS의 깔끔함과 BAT파일의 한계를 넘더라구요

이렇게 스크립트에 눈을 뜬 나는 정말 모든것 하나까지 자동화 하기위해서 유닉스 의 shell script를 제작하기로 했습니다.
그때 고참들은 일일이 유닉스에 명령어를 치더라구요 헐... 저는 반복적인 작업을 싫어하기때문에 모조리 스크립트로
만들었습니다.  

만드는 시간은 일지를 쓰는 시간보다 10배는 오래 걸렸지만 완성된후에 2시간동안 쓸 일지를 10분도 안돼서 쓰고
남은 시간에 놀았죠 ㅋㅋ  
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 14:20

대학교에 입학 하던 시절

저는 '스파이더' 라는 홈페이지 제작 동아리에 반 강제적으로 들어갔습니다. (당시 학과 선배의 권유?)

사실 저는 컴퓨터 동아리가 아닌 그냥 일반 학생들이 많은 동아리에 들어가고 싶었습니다. ㅠ.ㅠ

홈페이지 동아리라 홈페이지가 있는줄 알았는데... 홈페이지가 없더군요 헉!!!

그리고 홈페이지 동아리에서 평생 한번 강의를 해주셧는데..선배님들이...

기대하고 들었는데..  기본 HTML 만 알려주더라구요 충격!!! br, a href 등 중1때부터 지겹도록 써온것들만...

그래서 그냥 비공식적으로 비밀리에 제가 혼자 동아리 홈페이지를 만들기로 결심하였습니다.

당시에는 HTML5나 실버라이트가 없던 시절이라 플래시가 최강이였죠 일단 홈페이지 동아리에 걸맞게

HTML로만 만드는것을 배제하였습니다. 그리고 그때 당시에 유행했었던 제로보드,화이트 보드 등 게시판으로 도배하는

초보적인 짓도 하지 않기로 하였습니다. 

저는 그래서 당시에 플래시와 액션스크립트를 통해서 풀 홈페이지를 만들고 플래시안에 제로보드 등 외부 게시판을 연동하기가

좀그랬기때문에 제가 직접 만들었습니다.  mysql를 이용해서 데이터를 저장하고  플래시 게시판을 만들었었죠...

모방은 창조의 어머니라고 해서 그당시에 며칠동안 풀 플래시 홈페이지+게시판 을 많이 참고 하였었습니다.

하지만 너무 오래전이라 스크린샷이 없는게 아쉽네요.. 당시에 정말 화려하게 만든다고 만들었었는데 ㅠㅠ 

 
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 14:06
중학교 시절 (1996) 에 홈페이지만 만들다가 최초로 만든 응용 프로그램 입니다.

기억이 가물가물하지만 중학교3학년때까지 주로 cgi, php,java script 로만 된 홈페이지로 도배만 하다가 응용프로그램 개발에 흥미를 느껴서 만든 프로그램입니다.

SKY IRC라고 이름을 지은 이유는 제가 고등학교 1학년 시절 카운터 스트라이커라는 게임이 있었고 학교 내부에 제 친구와 제가 SKY Clan이라는 게임 클랜을 창설한뒤 팀원과의 커뮤니티를 활성화 시키고 IP로만 접속가능했던 멀티 게임을 좀더 쉽게 사용하고자 만들었습니다.

그당시에는 메신저라는 편리한게 없었기 때문에 IRC가 상당히 활용되고 있었던 시절이였습니다.

하지만 그당시에 주로 사용했었던 mIRC는 외국 프로그램이였기 때문에 영어라는 장벽과 국내에서 사용하기에는 힘든 인터페이스여서 제친구들을 비롯한 주위사람들이 편하게 사용하게끔 하기 위해서 개발을 시작하였습니다.
 
고등학교 컴퓨터 활용시절에 저는 주로 외국 IRC Script 사이트에서 공부를 하였습니다.
처음에는 그냥 친구들과의 친목을 위해서 만들었었지만 인터넷을 통해서 점점 많은 사용자가 제 프로그램을 이용하였고
저는 더욱더 업그레이드 하여 TV,음악방송,사용자 편의성을 더욱더 고려하여서 업그레이드 하였습니다.

최종적으로 저는 국내 최초로 공지사항 전광판을 기능을 넣어서 언제 어디서나 새로운 소식 및 뉴스를 소켓을 이용해서 irc사용자에게 전달하는 기능을 넣었었습니다.

고등학교 2학년때까지 개발을 계속하다가 플래시에 흥미를 느끼고 대학 입시가 있었기때문에 개발은 중단 되었지만 그뒤로 네이버 자동 완성에 등록, skyirc 팬들의 카페 개설 등으로 많은 인기를 누렸었습니다.






 

 당시에 제가 폰트 디자인에 관심이 많아서 배경화면 보면

SKYIRC by Jaedong

이라는 것을 볼수가 있었것입니다 ㅎㅎ

당시 포토샵으로 배경화면 및 로고 , Bar 디자인, 아이콘 까지 직접 제작하였습니다 


 
Posted by 동동(이재동)
iPhone App2011. 10. 17. 14:18

거의 2틀동안 삽질을 했다.

 팀장님 컴퓨터(xocde3)에서는 등록이 잘되지만 내컴퓨터(xcod4)에는 등록할때 엄청난 고난과 역경이 있었다.

그건 바로 인증서 문제였었는데

일단  인증서를 다운받기 위해서는 

http://developer.apple.com/

이 사이트 에서 받을수 있다.

중요한건 폰에 직접 deploy 하는 인증서가 있고 마켓에 올리는 인증서가 따로 있다는것이였다.

그렇다면 어떻게 해야 하는지 차근차근 보자.

일단  직접 폰에 depoly하는 인증서는 위 사이트의  ios provisioning potal에서 받을수 있으며

provisitioning ->development에 가면 다운받을수 있다. 만약 폰에 안들어간다면 profile을 edit해서 해당 device가 check되어 있는지 살펴보자.

이제 마켓에 넣는 인증서를 다운받자. 아까 devlopment 옆에 보면 distibution이라는 항목이 있다 클릭 하자

그쪽에서도  해당 인증서를 생성 및 다운 하자

자 이제 마켓에 올려 보자...(폰에 직접 depoly는 쉬우니까 스킵)

project build setting에 code Signing Identity를 아까 받은 인증서로 바꾼다. 이렇게... 



그다음 xcode 메뉴에서 Product-Archive를 한다.(만약 비활성화라면 기계를 안꼽아서 그런것이다 폰이 있어야 한다.)

그뒤에 Orgaizer- Archives가 나오면 validate하고 submit하면 끝~

아참 중요한건 이때

https://itunesconnect.apple.com/

아이튠즈 connect에 상태가 ready for upload 상태여야 validate와 submit이 가능하다.




 

 
Posted by 동동(이재동)
iPhone App2011. 10. 14. 17:34
으아 1시간 이상을 삽질한거 같다..

iOS5로 업데이트 하면서 배포할려던 나의 앱이 ios5에 맞추어서 다시 수정되었다. ㅠㅠ

그러면서 archvie 하고 vlidation검사를 하는데

application executable is missing a required architecture armv6

이런 에러가 나와서 해결법을 봤더니



이런식으로 distribute와 relase에

모두 다 삭제하고 armv6, armv7을 add하였더니 에러가 안났다... 휴.. 이제 남은 2개 에러를 잡자 ㅠㅠ 
Posted by 동동(이재동)
iPhone App2011. 10. 7. 11:16
으악~

진짜 이거 때문에 얼마나 고생했던지...

나도 작가다 앱에서 xmlParsing하는 부분이 많은데 instruments로 체크 해보니 엄청나게 누수가 일어났었다.

근데 누수에서 xmlParser,xmlManager class쪽에서 누수가 나길레 나는 내가 잘못짰나 싶어서 그부분만 엄청나게 봤었다.

하지만 문제는 그쪽이 아니였다.

NSTableView쪽에서 data를 얻어올때

commentDataArray = [[xmlManager GetXmlArrayDataByData:xmlData elementFile:@"CommentElements.plist"] retain];   

이렇게 retain 해서 저장을 하는데

문제는 delloc이나 viewdidUnload를 거치지 않는것이였다.

내가 만든 view가 화면이 없어지는게 아니라서 호출이 안되나보다... 그러니 계속 retain되니 쌓일수 밖에 그리고 refresh,reload할때도 release가 안되었으니 메모리에 계속 저장하니까 문제가 생길수밖에 없었다.

그래서 날짜를 불러오는부분 즉 reload 할때

-(void) reload

{

    //다른 탭들도 리로딩 하도록 요청한다.     

    [[ReloadManager sharedSingletonClass] SetAllTabReload];

    

    //현재탭은 리로딩 안되도록 한다

    [[ReloadManager sharedSingletonClass] setIsRecentPostReload:NO];

    

    //reload 할때 commentDataArray retain임으로 release한다.

    [commentDataArray release];

    commentDataArray = nil;

    [self prepareReload];

    [self performSelector:@selector(getData) withObject:nil afterDelay:0.5];  

}

저렇게 commmentDataArray를 release하고 nil로 하였다.
 

 

 #pragma mark Data Source Loading / Reloading Methods


- (void)reloadTableViewDataSource{

//  should be calling your tableviews data source model to reload

//  put here just for demo  

    [commentDataArray release];

    commentDataArray = nil;

    [self getData];

_reloading = YES;

}

그리고 tableview를 리로드 하는부분(EGoRefreshTable) delegate에도 테이블을 다시 읽을때마다 release하게 했다.

마지막으로 첨에 읽어오는부분에도 처리 했는데 첨에 읽어오는부분에는 첨에는 commentDataArray가 없기때문에 retainCount로 계산해서 넣었다.

-(void) viewDidAppear:(BOOL)animated

{   

    if([[ReloadManager sharedSingletonClass] isRecentPostReload])

    {

        [[ReloadManager sharedSingletonClass] setIsRecentPostReload:NO];

        [self prepareReload];


        //처음 실행이 아닐경우 이전 날짜로 부터 받아오는경우에는  commentDataArray release되지 않음으로 release해준다.

        if([commentDataArray retainCount] !=0)

        {

            [commentDataArray release];

            commentDataArray = nil;

        }

        [self performSelector:@selector(getData) withObject:nil afterDelay:0.5];  

    }

self.view.frame = self.view.superview.bounds;

}

이런식으로.. 

Posted by 동동(이재동)
iPhone App2011. 10. 6. 15:52
이곳에서 받은 라이브러리인데 잘되는거 같아 포스트 한다.

http://blog.jidolstar.com/723

더 자세한 내용은 나중에 직접 개발해서 올려야지 
Posted by 동동(이재동)
iPhone App2011. 10. 6. 15:41
아이폰 개발은 메모리가 한정되어 있어서 메모리를 항상 관리 하지 않으면 안된다.

아 ~ 그리운 C# ㅠ.ㅠ 가비지 컬렉터 ㅠㅠ

간단한 습관 정리 하자면

1. dealloc는 항상 @synthesize 아래에 놓자.
   @synthesize commentDataArray,commentTableView,loadingFooterIndicator,emptyCommentLabel;


- (void)dealloc { 

    [commentDataArray release];

    [indicator release];

    [commentTableView release];

    [loadingFooterIndicator release];

    

    [_refreshHeaderView release];

    [myAlert release];

    [emptyCommentLabel release];

    [super dealloc];

}

이렇게 놓는다면 비교하기도 쉽고 해제 안한것도 발견하기 쉽다.

2. viewdidload와 viewdidunload는 항상 같이 붙어서 쓸자

-(void) viewDidLoad

[super viewDidLoad];

    

[[ReloadManager sharedSingletonClass] setIsRecentPostReload:YES];


    [self.view addSubview:indicator];

    

    self.loadingFooterIndicator = [[[LoadingFooterIndicator alloc] init] autorelease];

    

    //pull to refresh

    if (_refreshHeaderView == nil) {

        _refreshHeaderView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - commentTableView.bounds.size.height, commentTableView.frame.size.width, commentTableView.bounds.size.height)];

_refreshHeaderView.delegate = self;

[commentTableView addSubview:_refreshHeaderView];

}    

}


- (void)viewDidUnload {        

[super viewDidUnload]; 

    self.commentDataArray = nil;    

    self.loadingFooterIndicator = nil;    

    self.commentTableView = nil;    

    [_refreshHeaderView release];

    _refreshHeaderView = nil;    

    [indicator release];

    indicator = nil;

    self.emptyCommentLabel = nil;

}


위처럼 붙여서 쓴다면 didload에서 사용한 프로퍼티나 변수를 보기 쉽고 릴리즈를 할수 있다.

  
3 viewdidload에서 사용한것은 항상 did unload에서 relase와 nil로 정해줄것
   위에 보면 알겠지만 프로퍼티로 정의해둔것은 viewDidUnload할때  nil처리하면 알아서 relase되지만
   프로퍼티가 아닌 그냥 전역 변수는
       
[indicator release];

    indicator = nil;

  이렇게 한번 release해주고 nil처리 해줘야 한다.
 


4. IBOulet는 프로퍼티로도 만들자.
   xcode4에서는 워닝이 안나지만 xcode3는 워닝이 난다.


 

 

 

 




 
Posted by 동동(이재동)
iPhone App2011. 10. 5. 10:52


머 윈폰도 같지만 그냥 까먹까바 올린다.
   
[
commentTableView setContentOffset:CGPointMake(0, 0) animated:NO]; //table 스크롤을 상단에 올린다.

Posted by 동동(이재동)
iPhone App2011. 9. 30. 18:38

멀티라인이나 싱글라인에서

UIlabel SizeToFit을 하게되면 그글자에 맞추어서 크기가 변경된다.

근데 한번 길이를 줄여서 label이 짧아졌는데 다시 그 label에 긴글을 들어 왔을때에는 크기를 다시 초기화를 해줘야 한다.

그래서 데이터가 다이나믹 한 Label을 쓸경우

  subjectDetailLabel.frame = CGRectMake(46, 68, 271, 60);

[subjectDetailLabel sizeToFit];


이렇게 초기 frame값을 얻어와서 sizetofit을 호출하기전에 초기화를 해버리자.
Posted by 동동(이재동)
iPhone App2011. 9. 27. 15:54
XCode의 디버거에서는 변수의 retain count를 볼 수가 없어서 불편한데요, 디버깅 중에 볼 수 있는 방법이 없지는 않습니다. gdb의 디버깅 콘솔을 띄워서 다음과 같이 입력하면 theObj의 retain count 가 출력됩니다.

print (unsigned int)[theObj retainCount]
Posted by 동동(이재동)
iPhone App2011. 9. 23. 15:26
기본적으로 view를 로드 할때마다 부르는데

용도를 view가 모두 로드된뒤에 어떤작업을 수행하기 위한 용도로 쓴다면 한번만 호출했으면 한다.

예를들면 tableview같은곳~

인터넷 찾아보니..아주 간단하다.. ㅋㅋ
BOOL firstTime;

in the .m file:
-(void)viewDidLoad {
   NSLog(@"viewDidLoad actually fired");
   //...
   firstTime = YES;
}
-(void)viewDidAppear {
   //...
   if(firstTime){
      //show it
      firstTime = NO;
   }
}
 
참고 : http://stackoverflow.com/questions/2259977/how-can-i-call-the-viewdidappear-only-one-time 
Posted by 동동(이재동)
iPhone App2011. 9. 23. 15:07
viewDidappear는 navigation Conroller일때 호출이 된다.

viewdidload를 할경우에는 프로그램이 실행할때 호출되어서 로딩이 길어진다.

그래서 view가 여러개 있고 클릭했을때  어떤작업?(data를 불러오는작업) 이 일어나게 해서 퍼포먼스를 향상 시키기로 했다.

-(IBAction) menuSelected:(id)sender

{

UIButton* menu = (UIButton*)sender;

if(menu.selected == YES)

return;

    self.giftButton.selected = NO;

    self.recentButton.selected = NO;

    self.myButton.selected = NO;

    self.popularButton.selected = NO;

    

menu.selected = YES;

UIViewController* vc = nil;

if(sender == recentButton)

{

vc = [menuViewControllers objectAtIndex:kRecentPostsIndex];

}

else if(sender == popularButton)

{

vc = [menuViewControllers objectAtIndex:kMostPopularPostsIndex];

}

else if(sender == myButton)

{

vc = [menuViewControllers objectAtIndex:kMyPostingsIndex];

}

else if(sender == giftButton)

{

vc = [menuViewControllers objectAtIndex:kTodayGiftIndex];

}

for(UIView* sv in contentView.subviews)

{

[sv removeFromSuperview];

}


[contentView addSubview:vc.view];

    [vc viewDidAppear:FALSE];

    

}
이것은 메뉴를 선택했을시 해당 하는 뷰를 add하는 메소드이다.

[vc viewDidAppear:FALSE];

이것을 해주지 않았다면 viewDidappear는 호출되지 않는다. 

view를 add한후 viewdidappear를 사용하고 싶을때 사용하자
 
  

참고 : http://stackoverflow.com/questions/2335722/problem-with-iphone-shakes-viewdidappear-isnt-called-when-loading-viewcontrolle 
Posted by 동동(이재동)
iPhone App2011. 9. 23. 10:42
여러가지 방법을 해보았다.

물론 Custom Cell Class에서 Action을 걸어서 하는 방법이 있지만 나는 TableView가 있는 클래스의 Data Array를 사용해야만 했기때문에

TableView가 있는 Class에서 Action을 받고 싶었다. (이것도 여러가지 방법으로 해봄)

일단 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{   

    BoardCustomCell *cell = (BoardCustomCell *)[tableView dequeueReusableCellWithIdentifier:BoardCustomCellIdentifier];

    

    // NSUInteger row = indexPath.row;

    

if(cell == nil)

{

        cell = [BoardCustomCell cellWithNib];

}        

    

    NSMutableDictionary* commentData = (NSMutableDictionary*)[commentDataArray objectAtIndex:indexPath.row];    

    cell.contentLabel.text = [commentData objectForKey:@"CmtContent"];

    cell.memberNameLabel.text = [commentData objectForKey:@"MemberName"];    

    cell.dateLabel.text = [commentData objectForKey:@"CreateDate"];

    cell.memberLevelLabel.text = [commentData objectForKey:@"PntSumLv"];

    cell.memberPointLabel.text = [commentData objectForKey:@"ReCmdCount"];


    

    UIImage *image = [UIImage   imageNamed:@"delbtn.png"];    

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);

    button.frame = frame;

    [button setBackgroundImage:image forState:UIControlStateNormal];    

    [button addTarget:self action:@selector(checkButtonTapped:event:)  forControlEvents:UIControlEventTouchUpInside];    

    cell.accessoryView = button;


아래처럼 cell.accesooryView에 버튼 생성해서 넣었다.  

액션 셀렉터에서

- (void)checkButtonTapped:(id)sender event:(id)event

{

    NSSet *touches = [event allTouches];

    UITouch *touch = [touches anyObject];

    CGPoint currentTouchPosition = [touch locationInView:commentTableView];

    NSIndexPath *indexPath = [commentTableView indexPathForRowAtPoint: currentTouchPosition];

    NSMutableDictionary* commentData = (NSMutableDictionary*)[commentDataArray objectAtIndex:indexPath.row];   

    

    NSString* cmtIdx= [commentData objectForKey:@"CmtIdx"];


    [self performSelector:@selector(sendSympathy:) withObject:cmtIdx afterDelay:0.5];

}


이렇게 구현을 했다.
 

참고 :http://www.edumobile.org/iphone/iphone-programming-tutorials/impliment-a-custom-accessory-view-for-your-uitableview-in-iphone/
 
Posted by 동동(이재동)
iPhone App2011. 9. 22. 16:25

http://blog.zachwaugh.com/post/309927273/programmatically-retrieving-ip-address-of-iphone

근데 에뮬레이터에서는 받아오지 못한다.

Posted by 동동(이재동)
iPhone App2011. 9. 21. 19:33

일단 이전에 만든 XML은 진짜 기본적인 Parser인거 같다... 내가 실제로 XML Parser를 사용함으로써 수많게 유용하고 유연하게

바꾸었다. 어떤 XML이 들어와도 읽을수 있게(이건 오버인가?..)

일단 발전된 상황이라면 모든 XML을 Dictionary로 관리하기 때문에 유연하게 바뀌었다.

XML Parser에서 initWithContentsOfURL을 이용하면 네트워크가 안될시나 URL이 잘못되면 어떠한 예외를 던지지 못하고 멈추는 현상이 있어서

일단 나는 파싱하기전에 그 URL이 XML을 정상적으로 리턴하는지 검증하는것이 필요 하였다.

원리는 이렇다.

일단 XML받는부분을 Background에서 실행한다.

[self performSelector:@selector(getTime) withObject:nil];


그리고 아래 예제처럼하였다.


- (void) getTime

{

NSString *serverIP = [[NSUserDefaults standardUserDefaults] objectForKey:@"ServerIP"];

NSURL* url =[NSURL URLWithString:[[NSString stringWithFormat:TimeElementsURL,serverIP]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

  

XmlManager* xmlManager= [[XmlManager alloc] init];

  

NSData* xmlData = [xmlManager GetXmlData:url isPostData:NO];

  

if(xmlData != nil) {

NSMutableDictionary *xmlDict= [xmlManager GetXmlDictDataByData:xmlData elementFile:@"TimeElements.plist"];

NSUserDefaults *timeData = [NSUserDefaults standardUserDefaults];

[timeData setObject:xmlDict forKey:@"TimeData"];

[timeData synchronize];

  

//시간 설정

currentTime = [[xmlDict objectForKey:@"TimeSec"] intValue];

int secs = currentTime % 60;

int mins = (currentTime % 3600) / 60;

int hours = currentTime / 3600;

timeRemainLabel.text = [NSString stringWithFormat:@"%.2d:%.2d:%.2d",hours, mins, secs];

  

}

else {

NSLog(@"time data 얻기 실패");

}

  

  

[xmlManager release];

}

소스는 거창하지만 실제로 보면

NSData* xmlData = [xmlManager GetXmlData:url isPostData:NO];  


이부분을 보면 된다. 내가 구현한 xmlManager는 파일첨부 할것이다.

저렇게 일단 XML을 파싱하기전에 파싱데이터를 가져온다.

만약 저기서 data를 못받으면(data == nil) 실패했다고 말해준다.

이것이 바로 검증인것이다.
실패했는지 성공했는지 결과를 알수 있다는것이다.

성공하면 이렇게 파싱한다.
NSMutableDictionary *xmlDict= [xmlManager GetXmlDictDataByData:xmlData elementFile:@"TimeElements.plist"];
 
그리고 elementFile은 plist를 만들어서



 
이렇게 만든다. 

NSManager에 GetXmlData 소스는 이렇다.
-(NSData*)GetXmlData:(NSURL*) url isPostData:(BOOL) isPost

{

    NSMutableURLRequest* feedRequest = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    if(isPost == YES)

    {

        [feedRequest setHTTPMethod:@"POST"];

    }

    NSError* theError = nil;

NSData* xmlData = [NSURLConnection sendSynchronousRequest:feedRequest returningResponse:nil error:&theError];     

//    NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];     //확인용    


    if(theError != nil || xmlData ==nil)

    {        

        //네트워크가 잘못됬거나 data 가져 오지 못했을 경우 nil return

        return nil

    }

    else

    {

        return xmlData;

    }


2011년 10월 12일  추가

NSXmlparser버그로 인해서 첫글자가 숫자일경우 짤려서 foundCharacters 두번 호출되는 버그가 있었다.

Xml에 들어온글중에 원래 xml의 element안에 있는글이

"
1004 story 들어오기. 나도 글을 쓰고 싶을 뿐이다 ㅠㅠ"

라는 글이였는데 
 

"에 들어오기. 나도 글을 쓰고 싶을 뿐이다 ㅠㅠ"

만 나오는것이였다 보니까 1004 story라는 글이 짤려 있었다.

그래서 보니 첫글자가 숫자가 들어가니 아래 로그 처럼 나뉘어서 두번에 걸쳐서 foundCharacters delegate가 호출 되었다.

 

2011-10-12 11:09:01.447 나도 작가다[1151:207] CmtContent

2011-10-12 11:09:01.447 나도 작가다[1151:207] 1004 story  , CmtContent

2011-10-12 11:09:01.448 나도 작가다[1151:207] count = 2, index= 0 

2011-10-12 11:09:01.448 나도 작가다[1151:207] 들어오기. 나도 글을 쓰고 싶을 뿐이다 ㅠㅠ , CmtContent

그래서 아래처럼 수정하였다.

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

    //trim 쓰자면 이걸 쓰고 안하면 그냥 string 값을 넣어도 된다.

    NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];

    NSString *trimmedValue = [string stringByTrimmingCharactersInSet:characterSet];

    

     if([trimmedValue length] == 0)

    {

        return;    

    }

    

    id element = [elementStack lastObject];    

    

    if([element isKindOfClass:[NSString class]])

    {

        NSUInteger count = [elementStack count];

        NSUInteger index = count -2;

        id parentElement = [elementStack objectAtIndex:index];                               

        

        NSMutableDictionary *dataInfoDict = (NSMutableDictionary*)parentElement;        

        

        //NSXmlparser버그로 인해서 첫글자가 숫자일경우 짤려서 foundCharacters 두번 호출된다.

        if([element isEqualToString:@"CmtContent"])

        {

            if([[dataInfoDict allKeys] containsObject:element])

            {                

                NSString* previousString = (NSString*)[dataInfoDict objectForKey:element];

                trimmedValue =[previousString stringByAppendingString:trimmedValue]; 

            }

        }

        

        [dataInfoDict setObject:trimmedValue forKey:element]; 

    }    

}


요약하자면 이전에 dictionary를 검색해서 이미 값이 있으면 이전 값과 현재 값을 합쳐서
저장한다.

만약 이전값이 없으면 무시되니깐 정상적으로 작동한다.
 
 
최신 xmlParser는 올려놓겠다

 

Posted by 동동(이재동)