반응형

예를 들어서 아래와 같은 코드

NSString *xmlUrl = [NSString stringWithFormat:@"http://192.168.0.16:8181/coupon.do?method=iPhoneShopSrch&needLog=no&code=0301&srchText=강남"] ;

로 파싱을 시도할 때,

파라미터에 한글이 포함되어서 마지막에 "강남" <-이 녀석이 사실 %88%EB%8C%80%EC 대략 이런식으로 표현된다..

그래서 url에서 전혀 xml을 받아오지 못하는데...

해결책!

NSString *xmlUrl = [NSString stringWithFormat:@"http://192.168.0.16:8181/coupon.do?method=iPhoneShopSrch&needLog=no&code=0301&srchText=강남"] ;
NSString *escapedUrl = [xmlUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

이렇게 해서 url을 escapedUrl 요놈으로 넘기면 해결!

Posted by npre
,
반응형
프로젝트 생성 후 프로젝트명을 더블클릭하면 다음과 같은 설정 화면을 볼 수 있다.


build 탭으로 이동 후 deployment Target을 iPhoneOS 3.0 으로 설정해 준다.

4.0으로 잡아버리면 3.0 os 사용자들은 사용할 수 없다.

특별한 경우가 아니면 3.0으로 빌드하도록하자.




VIEW 레이아웃잡을때

info-plist 에서 status bar 설정을 해 놓은 뒤 
아래와 같이 View Attributes에서 Status Bar 옵션을 동일하게 잡아놓으면



뷰 작업중에도 위에 Status bar 가 보이게 됨으로 뷰 레이아웃을 잡기가 편리해진다.


이 설정을 해두면 프레임의 size도 자동으로 위의 20을 뺀 460으로 height가 잡힌다.


단,  info-pList에서의 설정과 인터페이스 빌더에서의 설정이 다른 경우 info-pList의 설정값을 우선으로 따른다.

(navigation bar 역시 동일)
Posted by npre
,
반응형
info-plist

요놈은 애플리케이션마다 가지고 있는파일,
애플리케이션이 실행되는데 필요한 정보를 저장하는 프로퍼티 리스트!


Bundle display name  -> 이 녀석은 value값이 같으면 App store에 등록되지 않는다.그래서 주로 자바 프로젝트명처럼 
com.minzcorp.sample.navi_sample 이런식으로 만들어준다.(꼭 그래야하는건 아니고..)

icon file -> 이 녀석은 이 어플의 아이콘을 지정해주는데 주로 icon.png로 쓴다. 
                 (이거 역시 꼭 그래야하는건아니고,, 하지만 아이폰에서 이미지 파일은 png파일을 추천한다.)

Localization native development region -> 특별한 경우가 아니면 korea로 선택하도록 한다.

Bundle display name -> 이 어플리케이션의 아이콘 밑에 쓰이는 어플 이름.
(한글의 경우 약 6자정도 영어의 경우 스펠링에 따라다르게 들어가는데 그 이상 들어갈 시    장현......장현 이런식으로 중간에 ... 이 들어가게 된다.)


이 창의 오른쪽 끝부분에 마우스오버하면 + 버튼이 생기는데 그것을 이용하여 추가적인 설정을 더 할 수 도있다.



Launch image -> 어플 실행 시 처음에 잠시 떴다 사라지는 (로고..비슷한??) 이미지 설정.
주로  Default.png로 설정한다.

Icon already includes gloss effects -> 아이폰 아이콘을 등록하면 자동으로 반달모양?? 같은 그라데이션효과 같은게 들어가게 되는데  
아이콘을 직접 만든경우 이 효과가 필요없는 경우가 있다. 이때 이 요소를 체크해 주면 반달모양??효과는 없어진다.


Status bar is initially hidden ->  어플상 상단에 Status bar를 없애는경우가 있는데(주로 게임어플에서 많이본듯..?)이 요소를 체크하면
   히든설정이 된다.

Status bar style -> 말 그대로 Status bar style을 선택할 수 있다.
기본설정은 Gray로 잡혀있고 Black, 투명Black 이렇게 세가지 중 하나를 선택하면 된다.
투명에 대해서 짚고 넘어가야할부분은,, 
투명설정을해주면 말그대로 Status bar뒤로 view가 그대로 표현되는 것이고, 투명이냐 아니냐 등에따라 뷰 사이즈를 잘 생각해서 디자인해야한다.(Status bar가 투명이 아닌경우 뷰를 만들 때 프레임 상위 20px가 적다는것을 감안하고 작업해야 한다.

그리고 이 파일에서 설정하는 value가 최 우선시 되므로 후에 Interface Builder에서 다르게 설정한다 해도 이 설정값이 적용된다. 이는 Navigation bar 등에서도 동일하게 적용된다.


Posted by npre
,
반응형
#import <Foundation/Foundation.h>

/*	
	Calculator 클래스 선언
	클래스 정의 할 때는 부모클래스(NSObject)를 명시한다.
	메서드는 {}이거 밖에서 선언한다.
 */
@interface Calculator : NSObject
{
	double accumulator;
}

-(void) setAccumulator: (double) value;
-(void) clear;
-(double) accumulator;  //  <-이것이 사실 getter 애플에서는 주로 동일하게 사용한다고 한다.
-(void) add: (double) value;
-(void) subtract: (double) value;
-(void) multiply: (double) value;
-(void) divide: (double) value;
-(void) quotient: (double) value;

@end


// 메서드 구현
@implementation Calculator
-(void) setAccumulator: (double) value;
{
	accumulator = value;
}
-(void) clear
{
	accumulator = 0;
}
-(double) accumulator 
{
	return accumulator;
}
-(void) add:(double) value
{
	accumulator += value; 
}
-(void) subtract:(double) value;
{
	accumulator -= value;
}
-(void) multiply:(double) value;
{
	accumulator *= value;
}
-(void) divide:(double) value;
{
	if (value!=0) {
		accumulator/=value;
	}else{
		NSLog(@"Division by Zero");
		accumulator = 0;
	}
}
-(void) quotient: (double) value
{
	accumulator = accumulator*1000/value*1000;
	accumulator -= (int)accumulator;
}
	

@end


int main (int argc, const char * argv[]) {
	//메모리 풀을 할당, 초기화
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
	
	double value1, value2;
	char operator;
	
	/*
	 Calculator 클래스의 인스턴스화.. 메모리 할당과 초기화를 함께!
	 메서드 실행법은 [객체명 메서드명] 형식.
	 */
	Calculator *deskCalc = [[Calculator alloc]init];
	BOOL isLoop = true;
	
	while (isLoop) {
		NSLog(@"type in your expression.");
		scanf("%lf %c %lf", &value1, &operator, &value2);
		
		// 객체가 가진 setAccumulator메서드를 실행하면서 메서드로 value1을 넘긴다.
		[deskCalc setAccumulator: value1];
		switch (operator) {
			case '+':
				[deskCalc add: value2];break;
			case '-':
				[deskCalc subtract: value2]; break;
			case '*':
				[deskCalc multiply: value2];break;
			case '/':
				[deskCalc divide: value2];break;
		}
		if(operator == 'E')break;
		
		NSLog(@"%.2f", [deskCalc accumulator]);
	}
	
	//객체를 메모리에서 제거. 할당받은 메모리 해제하고 종료.
	[deskCalc release];
	[pool drain];
    return 0;
}

참고사이트 http://blog.naver.com/yeozoter?Redirect=Log&logNo=150081874777

Posted by npre
,
반응형
1. 이 글의 목적 

Objective-C : 맥과 아이폰 애플리케이션 프로그래밍이 Objective-C 본연의 내용에 충실하기 위해 개발 툴인 Xcode에 대해서는 의도적으로 설명이 배제되어 있습니다. 이에 Xcode를 사용해서 Objective-C의 예제를 개발하고 싶은 독자를 위해 간단히 Xcode를 설치하고 프로젝트를 만드는 과정과 소스 코드를 개발, 실행하는 과정을 HelloWorld라는 친숙한 예제로 예를 들었습니다. 

2. Xcode 설치 

개발 툴을 설치하기 위해 Mac OS X 10.5 패키지에 들어 있는 DVD 혹은 Mac을 구입했을 때 제공된된 DVD를 본체의 DVD 드라이브에 넣습니다. 이 책에서는 Mac 구입 시 제공된 DVD를 사용하였습니다. DVD의 내용을 Finder로 보면 'Optional Install'이라는 항목이 나오는데 이것을 열어봅니다. 

null 

그리고 'Xcode Tools'라는 폴더를 엽니다. 

null 

'Xcode Tools.mpkg'를 더블 클릭하면 설치 프로그램이 실행됩니다. 

null 

설치 프로그램이 실행되면 사용권 계약과 설치 확인 화면 등이 차례대로 나오는데 화면에 나오는 지시에 따라 설치를 계속하면 됩니다. 

null 

설치 프로그램이 종료되면 지정한 드라이브에 'Developer'라는 이름으로 폴더가 만들어집니다. 

null 

이 폴더 안에는 개발에 필요한 애플리케이션과 기술 자료, 샘플 코드들이 들어 있는데 이것들을 통틀어서 'Developer Tools'라고 부릅니다. 프로그램 개발을 위한 애플리케이션은 'Applications' 폴더에 들어 있으므로 이 폴더를 열어봅니다. 

null 

이 폴더 안에서 주로 사용하는 애플리케이션이 'Xcode'와 'Interface Builder'입니다. 

null 

3. Xcode 실행하기 

Developer 폴더 안에 있는 Applications 폴더에서 Xcode 아이콘을 찾아 더블 클릭하면 Xcode가 실행됩니다. 

null 

Xcode가 처음 실행되면 네비게이션 윈도우가 표시됩니다(설정에 따라 나오지 않을 수도 있습니다). 

null 

영문으로 표시되는 각 항목을 클릭하면 별도의 창이 뜨면서 해당 기술 자료가 표시 됩니다. 윈도우 왼쪽 아래에 있는 'Show at launch'를 끄면 다음 실행부터 네비게이션 윈도우가 표시되지 않습니다. 

4. 신규 프로젝트 만들기 

Xcode의 기본적인 사용 방법을 이해하기 위해 새로 프로젝트를 만들어봅니다. 파일 메뉴에서 'New Project'를 선택합니다. 

null 

신규 프로젝트의 템플릿을 선택하기 위한 다이얼로그 창이 뜹니다. 왼쪽 리스트에서 'Command Line Utility'를 선택한 후, 오른쪽 아이콘들 중 'Foundation Tool'을 선택합니다. 참고로 3장에서는 'Cocoa Application'을 선택했었는데 이번 예제는 윈도우나 버튼과 같은 유저 인터페이스가 없기 때문에 'Foundation Tool' 형태로 만듭니다. 여기까지 선택이 되었으면 우측 하단의 'Choose' 버튼을 클릭합니다. 

null 

프로젝트 폴더의 저장 위치를 결정하기 위한 시트 다이얼로그 창이 뜹니다. 이름을 'HelloWorld'라고 정하고 저장 위치를 'Desktop'으로 지정한 후, 'Save' 버튼을 클릭합니다. 

프로젝트 윈도우 창이 뜹니다. 

null 

5. 빌드하고 실행하기 

우측 상단의 파일 목록에서 HelloWorld.m 파일을 선택하면 우측 하단의 편집기에 파일 내용이 표시됩니다. 

null 

참고로 Xcode는 프로젝트명과 동일한 이름으로 main 함수를 가지는 구현 파일을 자동으로 생성합니다. 그리고 바로 실행이 가능하도록 NSLog에 "Hello, World!"를 출력하도록 되어 있습니다. 우선은 현재 이 상태에서 그래도 빌드하고 실행해 봅니다. 툴 바에 있는 'Build and Go' 버튼을 클릭합니다. 

null 

우측 상단 파일 목록에는 Code 항목에 빌드된 파일의 크기가 표시되고 우측 하단에는 빌드가 성공했음을 표시하는 'Succeeded'를 볼 수 있습니다. 이제 실행을 시켜 보겠습니다. 메뉴 바에서 'Run'을 선택한 후, 펼쳐지는 항목들에서 'Console'을 클릭합니다. 

null 

실행 결과는 아래와 같습니다. 

null 

소스 코드를 손을 대지 않은 상태에서 그냥 프로젝트를 만든 후, 기본 파일을 빌드하고 실행만 하더라도 간단한 "Hello, World!" 메시지를 출력하여 정상 동작하는 것을 확인하였습니다.다만 이는 C언어에서의 개발과 같이 객체지향적인 개념을 아직 사용하지 않았습니다. 

본격적으로 객체지향적은 개념을 도입하기 위해 "Hello, World!" 출력을 해주는 MyHelloWorld 객체를 만들어 보겠습니다. 

MyHelloWorld 클래스 만들기 

프로젝트 윈도우의 왼쪽에 있는 'Groups & Files' 목록에서 'Source' 항목을 선택합니다. 

null 

파일 메뉴에서 'New File'을 선택합니다. 

null 

신규 파일의 템플릿을 선택하기 위한 다이얼로그 창이 뜹니다. 

null 

왼쪽 리스트에서 'Cocoa'를 선택한 후, 오른쪽 아이콘 중에서 'Objective-C class'를 선택합니다. 'Next' 버튼을 누르면 저장 위치를 묻는 시트 다이얼로그 창이 뜹니다. 

null 

파일명을 'MyHelloWorld.m'으로 지정하고 저장 위치가 프로젝트 폴더 안에 있는 것을 확인한 후, 'Finish' 버튼을 클릭합니다. 'Groups & Files' 목록의 'Source'에 MyHelloWorld.m과 MyHelloWorld.h가 등록된 것을 알 수 있습니다. 

null 

MyHelloWorld 인터페이스 개발하기 

이미 만들어진 MyHelloWorld.h를 선택해서 편집기에 불러들이면 아래와 같이 기본 골격이 만들어져 있습니다. 

null 

여기에 "Hello, World!"를 출력하기 위한 sayHello 메소드를 추가합니다. 

null 

이제는 이 메소드를 구현할 차례입니다. 

6. MyHelloWorld 구현코드 개발하기 

이미 만들어진 MyHelloWorld.m을 선택해서 편집기에 불러들이면 아래와 같이 기본 골격이 만들어져 있습니다. 

null 

여기에 방금 추가한 sayHello 메소드를 구현합니다. 

null 

이제 MyHelloWorld에 대한 인터페이스와 구현이 완성되었으니 원래 있던 HelloWorld.m이 이것을 사용하도록 수정합니다. 참고로 자동으로 생성된 코드는 주석으로 막았습니다. 

null 

이제 앞서 해본 것과 같이 빌드와 실행을 해 봅니다. 

null 

앞서 HelloWorld.m에서 직접 "Hello, World!" 메시지를 찍었던 것을 MyHelloWorld 객체를 통해서 메시지를 찍도록 리팩토링되었습니다. 

7. 마무리 

이제까지 Xcode를 사용한 간단한 HelloWorld 예제를 만들어 보았습니다. Objective-C에 보다 집중하기 위해 저자는 Xcode의 사용 방법에 대해서는 의도적으로 배제해 두었습니다만, Vim이나 Emacs 편집기 사용이 불편한 개발자에게는 Xcode의 편집 기능이 유용할 것입니다.


출처
Posted by npre
,
반응형

전화번호 인풋창은 ㅁ-ㅁ-ㅁ 로 세갠데 디비에는 010-2285-1374 이런식으로 한 컬럼에 저장할때,

각 디비에 저장하는거야 각 인풋창 밸유 합쳐서

스크립트에

form.phoneNo.value = form.phoneNoFront.value+"-"+form.phoneNoMiddle.value+"-"+form.phoneNoEnd.value;

요런식으로 쏴주면 편한데

수정하기 화면에서 또 인풋창은 세갠데 디비에 데이터는 한줄로 입력되어있으니.........

이걸 어째 다시 쪼개어 화면에 뿌려줄까...

잊고있던 split함수!!!

 
var phoneNoEach = form.phoneNo.value.split("-");

form.phoneNoFront.value=phoneNoEach[0];

form.phoneNoMiddle.value=phoneNoEach[1];

form.phoneNoEnd.value=phoneNoEach[2];



요런식으로 "-"를 식별자로 문자열이 나뉘어져 있으니

-를 기준으로 쪼개면 phoneNoEach에 배열로 나눠져 들어간다!

Posted by npre
,
반응형

jsp 페이지에서 c:if test를 쓸 때 자주 하는 실수

<c:if test="${user.level==1||user.level==7}">

or나 and 를 이렇게 써야하는데

<c:if test="${user.level==1}" || "${user.level==7}">

이렇게 쓰는 실수를 많이 범함..

나만그런가-_-

Posted by npre
,
반응형

주로

	<select name="category">
	     	<option value="">==선택하세요==</option>
	     	<option value="0301">음식점</option>
		<option value="0302">카페&술집</option>
	        <option value="0303" selected="selected">오락&게임</option>
	      	<option value="0304">뷰티</option>
	      	<option value="0305">학원</option>
	  	<option value="0306">스포츠&여행</option>
	   	<option value="0307">공연&문화</option>
   		<option value="0308">쇼핑</option>
	   	<option value="0309">웨딩&포토</option>
	   	<option value="0310">이벤트</option>
	</select>

요런 식으로 지정할 옵션에다가 selected 설정을 걸어줘버리는데

저렇게 하면 서버에서 넘어 온 값에 맞게 selected를 설정 할 수는 없다

그래서!!!!!!!!!!!!!!

	<select name="category">
	     	<option value="">==선택하세요==</option>
	     	<option value="0301">음식점</option>
		<option value="0302">카페&술집</option>
	        <option value="0303">오락&게임</option>
	      	<option value="0304">뷰티</option>
	      	<option value="0305">학원</option>
	  	<option value="0306">스포츠&여행</option>
	   	<option value="0307">공연&문화</option>
   		<option value="0308">쇼핑</option>
	   	<option value="0309">웨딩&포토</option>
	   	<option value="0310">이벤트</option>
	</select>

셀렉트문 걍 쓰고

자바스크립트로다가

<script language="javascript">document.google.category.value=document.google.cate.value;</script>

이렇게 설정을 해준다!!
cate <=요 놈한테 서버에서 넘어 온 값 예를들면 0303 저장해 놓고,
셀렉트박스 value를 저놈한테 맞춰주면끝!

끝!

Posted by npre
,
반응형

andlerInterceptorAdapter 이 아이가 제공하는 preHandle요 메서드를 사용한다

preHandle저 아이는 Controller실행 요청 전에 개입

즉 Dispather에서 컨트롤러로 바로 가지 않고 무조건 컨트롤을 거치게 된다

andlerInterceptorAdapter 이건 저 아래 logonInterceptor.자바 코드에 익스텐드 된걸 볼 수 있다.

일단 가장먼저

xml셋팅!

<bean id="logonInterceptor" class="com.moku.comm.LogonInterceptor"/>

<bean id="secureHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="interceptors">

<list>

<ref bean="logonInterceptor"/>

</list>

</property>

<property name="urlMap">

<map>

<entry key="/member.do" value-ref="memberControl"/>

<entry key="/coupon.do" value-ref="couponControl"/>

</map>

</property>

</bean>

자.............이게 무슨말이냐면..................
SimpleUrlHandlerMapping 요놈을 이용해서 매핑을 해 주는데
인터셉터 프로퍼티에는 우리가 만들 자바파이 logonInterceptor를 레퍼런스로 이어주고
member.do, coupon.do 요 두놈으로 요청이 들어올때는 바로 인터셉트! 해서 검사를 해주고 보내겠다........란 거죠

아래는 LogonInterceptor쩜자바 코드

public class LogonInterceptor extends HandlerInterceptorAdapter {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
UserSession userSession = (UserSession) WebUtils.getSessionAttribute(request, "userSession");
String check = request.getParameter("session");
if(check\!=null && check.equals("no")){
return true;
}
if (userSession == null) {
String url = request.getServletPath();
String query = request.getQueryString();
// 패키지 경로 알아내기 : org.springframework.web.util.UrlPathHelper&nbsp;
UrlPathHelper urlPathHelper = new UrlPathHelper();&nbsp;
String originalURL = urlPathHelper.getOriginatingRequestUri(request);&nbsp;

ModelAndView modelAndView = new ModelAndView("/member/memLogin");
if (query \!= null) {
modelAndView.addObject("logonForwardAction", url + "?" + query);
} else {
modelAndView.addObject("logonForwardAction", url);
}
throw new ModelAndViewDefiningException(modelAndView);
} else {
return true;
}
}
}

아까말했듯이 HandlerInterceptorAdapter 를 익스텐드하는 자바파일이고,
로그인 확인이 필요치 않은 요청에 대해서는 하나하나 session이라는 파라미터에 no라는 값을 받아와서 검사과정을 패스~시켜주는거죠,
아. preHandle 이녀석은 불리언 값이라서,, 트루일때 담 컨트롤러로 넘어가는겁니다!

이프문을 보면
세션검사해서 세션값이없다...........즉 로그인을 하지 않았다!!!
그렇다면 url과 query값을 받아와서
logonForwardAction 이란놈에 담아둡니다~

왜 이짓을 하냐!! 
나중에 로그인을 했을때 마지막에 머물렀던 페이지로 바로 돌아가게 하려고 페이지 정보를 쭉쭉 저장시켜놓는거지요 계~~속
무튼 그렇게저렇게 세션체크하고 페이지 정보 저장하고,
모델앤드뷰에다가 로그인 페이지를 걸어두고
마지막에 throw new ModelAndViewDefiningException(modelAndView); 로 훅 던져줍니다.
ModelAndViewDefiningException 요놈이 조금 생소한 놈인데
그냥 프리핸들러에서 트루가 아닐때.즉 폴스?펄스?아........false 일때 이놈을 던져줘야만!!합니다
쟤 없으면 에러납니다

무튼 이렇게 모든 컨트롤을 타기전에 이놈을 거치게되니
여기서 할 수 있는 일들이 무궁무진하겠지요!!!

Posted by npre
,
반응형

페이지 로딩 시 바로 시작되는 함수를 정의 할 때 <body onload=""> 를 사용하지 않고 자바스크립트로 넣는다

window.onload = function(){ 시작시 실행될 내용 };

위 코드에서 마지막에 세미콜론 빼먹으면 안될때가 많음!
문제는 빼먹어도 거의 돌기때문에 실수를 많이함 _

window.onload와 <body onload="">는 동시에 사용 불가

<body onload="">가 실행이 되면 window.onload는 실행이 되지 않는 문제가 발생

function window::onload(){ 시작시 실행될 내용 }

이렇게 사용을 하면 <body onload="">가 먼저 실행되고, 이어서 window::onload()가 실행

Posted by npre
,