분류없음2016.02.03 22:34


요즘 주식투자하기 힘듭니다. 사건만 터지면 요동치는 주식시장.

그럼에도 많은 분들이 주식에 관심을 둡니다. 이만한 재태크가 없잖아요?

투자자문을 해주는 많은 사이트가 있습니다.


그중에 요즘 최수종씨가 모델인 청개구리투자클럽이라고 있습니다.



흔히들 찌라시 정보라고 하죠. 그런곳에서만 볼수 있는 최근 동향을 청개구리투자클럽에서는 엿볼수가 있습니다.


물론, 청개구리투자클럽에 들어간다고 해서 항상 이기는 주식투자를 할수 있는건 아닐겁니다. 당연한 이야기지만, 족보를 보여줘도 그걸 보고 열심히 하지 않으면 땡이니까요. 그래도, 족보가 있는것과 없는것의 차이는 시험을 한번이라도 쳐본사람이라면 잘 알겠죠.


 


상담은 공짭니다. 5일간 이벤트도 합니다. 해보고 별로면 안하면 그뿐. ㅋㅋ

5일단 증권자 1%에게만 떠도는 핵심정보를 구경해보세요. 이제껏 했던 주식투자가 왜 맨날 잃었는지 알게 됩니다.


부담없이 무료상담 이벤트를 신청하세요[ 클릭!! ] .



그럼 왜 청개구리투자클럽이어야 하는걸까요?


다른 투자클럽과 차원이 다르기 때문입니다. 평균수익율이 10%가 넘습니다. 고수투자자의 주관적인 안목에 의존하는게 아닙니다. 스마트웍시스템을 통한 정보력을 바탕으로 분석하고 추천합니다.


 


이미 많은 분들이 함께하고 있습니다. 6개월후에는 직접 투자할수 있습니다.

전문가들에게 배우고 올해는 대박나세요.


 

부담없이 무료상담 이벤트를 신청하세요[ 클릭!! ] .

 




Posted by 오늘마감
분류없음2013.08.15 10:43

아이피 우회 사이트 모음 입니다.

아이피를 변경해서, 접속할수 있습니다.

http://proxy.web2r.net

속도가 빠른 순서대로 정리가 잘되어 있네요.

cfile2.uf@2555CE3C520C32F30B0FF8.png

Posted by 오늘마감
분류없음2013.08.13 13:21

아이디어 발상법은 많다.

그 중에서 유명한것중에 하나가, 손정의식 아이디어 발상법이다.

단어 3개를 가지고, 새로운 아이디어를 유추해 내는 방법인데..

해보면 생각지도 못한 참신한 아이디어가 떠오르곤 한다.

http://ahaidea.web2r.net

위 사이트를 방문하면, 아이디어 발상법을 쉽게 할수 있다.

여러사람들이 임의로 입력한 단어들을 랜덤하게 보다보면, 멋진 아이디어가 떠오르지 않을까?

cfile29.uf@243585405209B48812CF90.png

Posted by 오늘마감
아이폰뉴스2012.01.26 11:05

http://news.mt.co.kr/mtview.php?no=2012011010242179083

스마트폰용 '아이사랑보육포털' 서비스 도입으로 스마트폰으로 언제 어디서든 쉽게 보육료를 결제할 수 있게 됐다.보건복지부는 우수 평가인증 어린이집 정보를 제공하는 '우리 동네 좋은 어린이집 찾기' 서비스를 확대 개편한 스마트폰용 '아이사랑보육포털' 서비스를 실시한다고 10일 밝혔다.'아이사랑보육포털' 어플(이하 앱) 서비스는 부모의 어린이집 선택 및 이용의 편의성을 강화하고, 어린이집과 부모와의 의사소통을 지원하기 위한 목적으로 개발됐다. 아이사랑보육포털 앱에서는 스마트폰을 통한 △보육료 결제 △부모 대상 육아상담 △아이가 다니는 어린이집의 가정통신문 및 공지사항 등을 확인하는 우리아이 어린이집 △육아정보 및 육아 관련 교육·행사 일정 안내 서비스를 제공한다.기존에는 아이사랑카드로 보육료를 결제하기 위해서는 어린이집을 방문해 결제하거나, 인터넷, ARS를 이용해야 했으나 앞으로는 스마트폰으로 언제 어디서나 보육료를 결제할 수 있다.또 각 어린이집별 보육료 및 기타경비 수납액, 교사 자격 급수별 현황, 연령별 아동 재원현황 등의 정보를 조회할 수 있다.'아이사랑보육포털' 앱은 안드로이드폰과 아이폰용 2종류가 제공되며, 앱스토어 및 안드로이드마켓, 아이사랑보육포털 링크를 통해 무료로 다운로드 받아 사용할 수 있다.복지부 관계자는 "아이사랑보육포털 앱을 통한 결제 서비스 제공으로 부모의 편의성을 보다 향상하고 영유아 보육 정보를 편리하게 이용할 수 있을 것으로 기대된다"고 밝혔다.복지부는 향후 아이사랑보육포털 앱에 부모가 궁금해 하는 어린이집 관련 정보 공개를 확대하고, 사용자(부모 및 보육교직원)의 커뮤니케이션 활성화를 위한 기능(알림서비스, 커버스토리 등)을 보강할 계획이다.

요즘 트위터 더보기
Posted by 오늘마감
http://www.cocos2d-iphone.org/forum/topic/8424
애드몹을 사용 하시기 위해서는 위의 사이트에서 등록 하여 고유 넘버 키를 받으셔야 사용이가능 합니다.
참고 사이트 입니다.


=============================================================================
AdViewController.h
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>
#import "AdMobDelegateProtocol.h"

@protocol AdViewControllerDelegate;

@interface AdViewController : UIViewController <ADBannerViewDelegate, AdMobDelegate>
{
 id <AdViewControllerDelegate> delegate;
 id adBannerView;

 AdMobView* adMobAd;
}

@property (nonatomic, assign) id <AdViewControllerDelegate> delegate;

- (id)initWithMasterView:(UIView*)masterView;
- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation;

@end

@protocol AdViewControllerDelegate

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;

@end

AdViewController.m

#import "AdViewController.h"
#import "cocos2d.h"

#import "AdMobView.h"

@implementation AdViewController

@synthesize delegate;

- (UIDeviceOrientation)currentOrientation
{
 return [[CCDirector sharedDirector] deviceOrientation];
}

- (id) initWithMasterView:(UIView*) masterView
{
 if( nil != (self = [super init]) )
 {
  [self setView:masterView];

  //Initialize the class manually to make it compatible with iOS < 4.0
  Class classAdBannerView = NSClassFromString(@"ADBannerView");
  if (classAdBannerView != nil)
  {
   adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
   [adBannerView setDelegate:self];
   [adBannerView setRequiredContentSizeIdentifiers: [NSSet setWithObjects:
                 ADBannerContentSizeIdentifier320x50,
                 ADBannerContentSizeIdentifier480x32, nil]];

   [self.view addSubview:adBannerView];

   [self rotateBannerView:[self currentOrientation]];

   [adBannerView setHidden:YES];

  }
  else
  {
   //Request an AdMob Ad
   adMobAd = [AdMobView requestAdOfSize:ADMOB_SIZE_320x48 withDelegate:self];
   [adMobAd retain];
  }
 }

 return self;
}

- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation
{
 if (adBannerView)
 {
  if (UIDeviceOrientationIsLandscape(toDeviceOrientation))
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier480x32];
  else
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];

  [(UIView*)adBannerView setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [(UIView*)adBannerView setCenter:CGPointMake(160, 455)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adBannerView setCenter:CGPointMake(160, 25)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adBannerView setCenter:CGPointMake(16, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adBannerView setCenter:CGPointMake(304, 240)];
   }
    break;
   default:
    break;
  }
 }

 if (adMobAd)
 {
  [adMobAd setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [adMobAd setCenter:CGPointMake(160, 456)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adMobAd setCenter:CGPointMake(160, 24)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adMobAd setCenter:CGPointMake(24, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adMobAd setCenter:CGPointMake(296, 240)];
   }
    break;
   default:
    break;
  }
 }
}

#pragma mark -
#pragma mark ADBannerViewDelegate

- (BOOL)allowActionToRun
{
 return YES;
}

- (void) stopActionsForAd
{
 //Pause background music here

 [adBannerView setHidden:YES];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] pause];
}

- (void) startActionsForAd
{
 //Resume background music here

 [self rotateBannerView:[self currentOrientation]];
 [[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)[self currentOrientation]];
 [adBannerView setHidden:NO];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] resume];
 [[CCDirector sharedDirector] startAnimation];
}

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
 BOOL shouldExecuteAction = [self allowActionToRun];
    if (!willLeave && shouldExecuteAction)
    {
  [self stopActionsForAd];
    }
    return shouldExecuteAction;
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
 [adBannerView setHidden:NO];
 [delegate adController:self didLoadiAd:banner];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
 [adBannerView setHidden:YES];
 [delegate adController:self didFailedToRecieveiAd:banner];
}

- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
 [self startActionsForAd];
}

#pragma mark -
#pragma mark AdMobDelegate methods

- (NSString *)publisherIdForAd:(AdMobView *)adView
{
 return @"your_admob_publisher_id";    //replace it with you publisher id
}

- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
 return self;
}

- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)primaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (NSArray *)testDevices
{
 return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, nil];
}

- (void)didReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did receive ad");

 [self rotateBannerView:[self currentOrientation]];
 [self.view addSubview:adMobAd];

 [delegate adController:self didLoadAdMobAd:adView];
}

// Sent when an ad request failed to load an ad
- (void)didFailToReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did fail to receive ad");
 [adMobAd removeFromSuperview];
 [adMobAd release];
 adMobAd = nil;

 [delegate adController:self didFailedToRecieveAdMobAd:adView];
}

#pragma mark -
#pragma mark Memory Management

- (void) dealloc
{
 if (adMobAd)
 {
  [adMobAd setDelegate:nil];
  [adMobAd removeFromSuperview];
  [adMobAd release];
  adMobAd = nil;
 }

 if (adBannerView)
 {
  [adBannerView setDelegate:nil];
  [adBannerView removeFromSuperview];
  [adBannerView release];
  adBannerView = nil;
 }

    [super dealloc];
}

@end

The usage is very simple, #importAdViewController.h in you Layer's .h and add the delegate protocol AdViewControllerDelegate

#import "AdViewController.h"

@interface Menu : CCLayer <AdViewControllerDelegate>
{
 AdViewController *adController;
}

And in your layer's .m add this

- (void)onEnter
{
 [super onEnter];

 adController = [[AdViewController alloc] initWithMasterView:[[CCDirector sharedDirector] openGLView]];
 [adController setDelegate:self];

}

- (void)onExit
{
 //Completely remove the controller
 [adController setDelegate:nil];
 [adController release];
 adController = nil;

 [super onExit];
}

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;
{
 //Do something when the ad fails to load, like moving objects.;
}

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad fails to load, like moving objects.
}
<script src="http://gods2000.tistory.com/plugin/CallBack_bootstrapper?&src=http://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=29&callbackId=gods2000tistorycom292340&destDocId=callbacknestgods2000tistorycom292340&host=http://gods2000.tistory.com&float=left&random=631"></script> 출처 :http://gods2000.tistory.com/29
Posted by 오늘마감
iOS에서 가장많이 사용하는 UI는 바로 테이블 뷰이다. 테이블 뷰는 리스트형태의 데이터를 보여주기위해 사용하기도 하지만, 설정화면을 TableView로 구성하기도 한다.
[TableView로 설정화면을 구성한 예]
이렇게 설정을 TableView로 만들었을때 해당 Cell들은 고정적이며 동적으로 처리해야 할일이 없다. 그런데도 이전버전의 방식으로 구현을 하려면 Custom Cell을 xib로 만들고 이것들을 배열로 만드는 불편한 작업을 할 뿐만 아니라, 테이블을 구현하기 위한 각종 delegate method까지 구현을 해줘야 한다.이렇게 불편한 점을 개선하고자 xCode4.2(iOS5)에서는 "static cell"이라는 일종의 TableView 타입을 제공해 줌으로서, Cell의 갯수가 변하지 않는 상황에서 쉽게 셀을 구성하도록 해주는 기능입니다. 해당기능은 xCode 4.2에서 제공하는 story board에서 사용할 수 있습니다.작성 방법1. 프로젝트 생성을 다음과 같이 진행합니다.
두번째 화면에서 Use Storyboard 에 체크를 한후 프로젝트를 생성합니다.
그럼 다음과 같은 구조의 프로젝트가 생성이 됩니다.
2. 첫번째로 ViewController.h가 상속받고 있는 Class를 UIViewController 에서 UITableViewController로 변경합니다.
3. MainStoryboard.storyboard파일을 선택합니다. 그후 오른쪽 아래쪽의 library창에서 TableViewController를 끌어다가 빈 화면으로 올려놓습니다.(기존에 있던 view위에 올리는 것이 아닙니다.)
빈공간으로 끌어올려 아래 그림처럼 두개를 나란히 배치시킵니다.
4. 맨 좌측의 화살표를 드래그 하여 TableView Controller에 붙입니다.
이렇게 화살표를 붙이면 TableViewController가 시작점이 되면서 앱을 실행 시키면 가장 먼저 이 Controller가 보여지게 됩니다.
5. 이제 이전의 View Controller(좌측에 있던)는 사용할 일이 없음으로 삭제 합니다.6. 이제 좌측 상단의 object 영역에서 TableView를 선택하고 속성창에서 content를 "static cells"로 변경합니다.
7. Storyboard에 있는 TableViewController의 File's Owner가 ViewController라고 지정해 줍니다.좌측의 "Table view Controller Scene"에서 Table View Controller를 선택하고 오른쪽 상단의 Identity Inspector창에서 Custom Class를 ViewController로 지정합니다.
이상으로 static cell을 사용하기 위한 기본설정은 모두 끝났습니다. 이제 TableView의 속성의 설정을 통해 static cell을 만들어 보겠습니다.왼쪽상단의 TableView를 선택하면 우측 inspector창에 다양한 TableView들의 속성이 나오게 되는데, 이것들을 통해 다양한 모양의 TableView를 구성할 수 있습니다.저는 섹션의 갯수와 table style만 변경하여 다음과 같은 모양을 만들었습니다.
[설정된 화면 모습]
이후 각셀 위로 library창에서 UI들을 끌어다가 셀에다 놓으면 바로 Custom cell을 만들어 낼 수 있습니다.그리고 각 셀을 선택을 하면 각셀의 세부설정(accessory타입 같은)을 할 수 있으니 필요한 데로 만들면 됩니다.
[실행결과 화면]
물론 IBOutlet 과 IBAction으로 연결하여 각 셀의 view들을 제어할 수 있습니다.
Posted by 오늘마감
XCODE2011.05.16 00:42

기본 문법 #1

[object message:parameter];

//C style

DrawMyGradient(myView, aquaGradient, 0.0, 1.0, YES);

//Objective - c

[myview drawMyGradient:aquaGradient formValue:0.0 toValue:1.0 opaque:YES];


-(void)drawMyGradient:((CGGradientRef)gradient fromValue:start toValue:end opaque:opaque  //메소드 선언


기본 문법#2

//C Style

SubStringFormTo(sourceStr, &destStr, 2, 5); //위에서 타입을 정하고 메모리 얼록하고 여기다가 넣어달라

//O

NSString *destStr = [sourceStr subStringFrom:2 to:5];

long hash = [[sourceStr subStringFrom:2 to:5] hash]; //hash라는 메소드를 또 던진다


-(NSString *)subStringFrom:(int)from to:(int)to


오브젝트의 생성과 소멸

리테인 카운트 관리    //생성시점과 소멸시점을 관리

//person 클래스의 me 오브젝트를 만들고 없애기

Person *me = [[Person alloc] init];초기화     //리테인 카운트 1 생명줄!

[me retain];                                             //리테인 카운트 2

[me release];                                          //리테인 카운트 1

[me release];                                         //리테인 카운트 0

alloc -> release 해줄 필요, retain 해주지않은건 release 해줄 필요가없음


클래스 선언

.h 확장자를 가지는 파일

//헤더의 시작 interface  Person 클래스이름 NSObject는 슈퍼클래스

@interface Person : NSObject <NSCopying> {    //person은 NSObject의 서브클래스

int age;                          //instance변수 IVAR

 NSString *name;

}


-(void)singAsong:(Song *)song; //메소드선언 리턴타입 보이드 매개변수로 Song을 받는다

@end


클래스의 구현

.m 확장자를 가지는 파일


@implementation Person


-(void)singAsong:(Song *)song

{                                                       //cocoa object

NSlog(@""&@ can sing a song", name);      //NSlog가 있고 C에있는 printf와 유사하다, 중간중간에 token을 사용할 수 있다. 

}

@end


코딩 규약 - 이름 짓기

첫 글자를 대문자로

TheSinger.proj   Person.h / Person.m


nameOfPerson

ageOfPerson

addressOfPerson

//매개변수이름도 첫글자 소문자로,


-(void)singASong:(Song *)song


아이폰은 singleWindow




출처 : http://blog.naver.com/PostView.nhn?blogId=naoh14&logNo=10100421043

'XCODE' 카테고리의 다른 글

아이폰 개발 Xcode 기본문법 #1,#2  (0) 2011.05.16
xcode에서 iphone app 이름 변경  (0) 2011.04.09
Xcode 삭제  (0) 2011.04.09
[Objective-C] Xcode프로젝트 창  (0) 2011.04.09
[펌] Xcode 에 Subversion 적용하기  (0) 2011.04.09
XCODE용 디버그 메크로  (0) 2011.04.09
Posted by 오늘마감

출처 :  http://mystria.egloos.com/4387235

 

 

kabook 추가 : 압축 및 작업은 Mac에서 해야함

 

간략하게 정리..

1. 구현한 프로젝트를 "Simulator|Debug"가 아니라 "Device|Release"로 변경. Build를 수행함.

2. Project폴더의 "build > Release-iphoneos"에 들어가면 "프로젝트명.app"파일이 있는데 확장자는 표시되지 않음. 실제 Device와 연결이 되지 않아서인지 수행 불가 표시가 붙어있음.

3. 임의의 폴더를 생성하고, 그 안에 Payload라는 폴더를 생성. "프로젝트명.app"파일을 Payload폴더에 넣는다. "iTunesArtwork"는 "512*512"크기의 일반 png파일인데 아이튠즈를 실행시켰을때 표시되는 아이콘 모양인것 같다. iPhone에 올렸을 때 보여지는 아이콘은 따로 프로젝트에서 설정되는듯 하며, 따라서 "프로젝트명.app"파일 안에 포함되게 된다. "iTunesMetadata.plist"는 아이튠즈에 올렸을 때 표시되는 카테고리라든지 제작자같은 정보이다. 없어도 무방하다.
이 3개 중에 Payload폴더와 app파일만 있으면 된다.

4. 위 3가지 파일을 압축하게 되면 "Archive.zip"이 생성되는데, 이를 "아무이름.ipa"로 바꾸면 ipa파일 생성완료이다.

5. 이것을 iPhone에 올리는 것은 탈옥한 폰이어야 가능하며, 아이튠즈에 드래그하여 추가 후 동기화 시키는 방법과, "iPhone > var > mobile > Library > Downloads"에 복사 후 "Installous"를 이용해 설치하는 방법등을 통해 설치가 가능하다.

6. 완성

 

 



출처 : http://blog.naver.com/PostView.nhn?blogId=kabook&logNo=80122590217
Posted by 오늘마감

아이폰 용 애플리케이션을 제대로 개발하려면 애플 개발자 센터에 개발자로 등록을 해야 한다.

 

솔직히 이 과정이 짜증이 나기도 하지만 무쟈게 복잡하다. 정리해 두지 않으면 휘발성 메모리에서 훌훌 날아가 버릴 것 같아 이 참에 문서화 해둔다.

 

개발자 등록을 하지 않는다고 SDK를 다운로드 받는 데 제약이 있는 건 아니다.

 

Xcode 등 개발 환경을 못 쓰는 것도 아니다.

  

애플리케이션 개발 자체에 제약을 받는 것도 아니다.

 

그럼 뭐 하러 그 짜증나고 복잡한 짓을 하냐고?

  

개발자로 정식 등록하지 않으면 하다 못해 자신의 기기라 하더라도 자신이 개발한 애플리케이션조차 설치를 못하기 때문이다.

  

개발 단계에서는 시뮬레이터를 통해 시험 및 디버깅을 할 수 있지만 기기 자체에 설치해보려면 어쩔 수 없이 개발자로 등록해야 한다는 거다.

  

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

  

  

여기 가서 Enroll Now 버튼을 누질러 주시는 걸로 개발자 등록 과정이 시작된다.

  

한 걸음씩 가보자.

  

1. 개발자 등록

   

  

  

이제 대망의 아이폰 개발자로 등록하는 거다. 컨티뉴~~~

  

  

기존 애플 ID를 사용하거나 새로 만들어야 한다. 세금 문제를 고려해 따로 만들기를 권하는데 난 걍 기존 ID 썼다.

  

개발자로 등록하려면 개인의 경우 연간 $99를 내야 한다. (기업은 더 비싸다.) 인증을 위해서라도 어쩔 수 없는 선택이니 투덜거릴 거면 개발 안 하면 된다.

  

  

하루 이틀쯤 지나면 메일로 활성화 코드(activation code)가 날라온다.

  

  

등록하고 나면 드디어 개발자 사이트가 열린다.

  

  • Xcode - 매킨토시 Objective-C 통합 개발환경 (아이폰 포함)
  • iPhone Simulator - 아이폰이 없어도 시뮬레이터를 통해 개발한 애플리케이션을 실험 및 디버깅 할 수 있다
  • Instruments - 디버거와 프로파일러가 포함돼 있다
  • InterfaceBuilder - GUI 디자인 환경으로 직접 코딩을 하지 않고도 손쉽게 뷰 디자인을 할 수 있다. 특이한 건 VisualStudio 등 여타 IDE내 디자이너처럼 코드를 자동 생성하는 게 아니라 아예 객체(objects)를 인스턴스화해서 냉동실에보관(freeze)하는 구조라는 거다. 애플의 소프트웨어 최적화 신화의 근간이 아닌가 싶다.
  • 나머지는 모두 레퍼런스 자료들이다. 배터지게 읽거나 보고도 남을 정도로 넘쳐난다. 물론, 다 영어다. (근까, 우린 영어 공부 안하면 뭘 해도 먹고 살기 힘들다. 특히, 영어 공부 안하고 한글화를 기다리는 호모 사피엔스는 늘 뒤쳐질 수 밖에 없는 현실이다.구실 찾지 말고 걍 영어 공부하는 게 상책이다.)

  

2. 개발 인증서 발급 받기

  

인증서는 개발자가 애플리케이션에 사인을 하는 것과 같다. 어떤 넘이 만든건지 전자 꼬리표가 따라다닌다는 거다. 금융 거래 할 때공인인증서를 통해 신분을 증명하는 절차와 다를 게 없다. 이 과정이 없다면 게나 고동이나 익명으로 애플리케이션을 개발하고 악성코드를 심어둘 수도 있으니 당연한 절차라 할 수 있다.

  

인증서는 개인 키(private key)와 공개 키(public key)로 구성된다. 개인 키는 개발자 혼자 꿍쳐 두는 열쇠고 공개 키는 개인 키로 암호화된 디지털 데이터를 풀기 위해 공개적으로 배포하는 열쇠다.

  

예컨대, 중요한 워드 문서 하나를 대두족장의 개인 키로 암호화해서 대두족장의 공개 키와 함께 배포하면 오로지 대두족장의 공개키로만 암호화를 풀 수 있다는 거다. 소두족장이란 넘이 이 문서에 장난질을 하고 대두족장의 문서인 것처럼 배포를 하면? 개인키로 암호화했던 데이터와 다르기 때문에 공개 키와 아귀가 맞지 않게 된다. 근까, 대두족장 본인이 사인하지 않은 장난질 문서를누군가 '대두족장이 서명한 문서'로 오인할 가능성이 없다는 말이다. 서명 위조도 하는데 뭐 그까짓 게 안 되겠냐고? 해 보시라.128비트 쯤 되는 키를 깰만한 알고리즘 짱구굴릴 수 있으면 (이 따위 짓이 가능하다고 생각한다면 24같은 드라마나Swordfish 같은 영화 넘 많이 본거다ㅡ.ㅡ) 워렌 버핏 부럽지 않은 부자… 아니 세계 정복 야심도 키울 수 있을 거다.(아마 빈 라덴한테 납치될 지도 모른다…쿨럭~)

  

데이터 보안을 위해 대두족장과 소두족장이 손잡고 일할 수도 있다. 대두족장의 개인 키 + 소두족장의 공개 키로 문서를 암호화 해대두족장이 소두족장에게 메일로 보낸 다음 소두족장의 개인 키 + 대두족장의 공개 키로 풀어 보면 전송 과정에서 데이터가왜곡되거나 변질되지 않았는지 확인이 가능하다는 거다. 예컨대, 0100…..0111 로 보냈으면 당근 도착 후 까봐도0100…0111 이어야 한다는 거다. 0111….1010 따위로 바뀌어져 있다면 껍데기는 그럴 듯 해 보여도 중간에 누군가장난질을 한 거라는 말이다. 보안은 유지하면서도 대두족장과 소두족장은 자신의 도장(개인 키)를 외부에 공개할 필요가 없다. 달랑공개 키만 주고 받으면 (개인 키와 맞물리는 열쇠) 되기 때문이다.

  

그럼 아이폰에서는 왜 쓰냐고?

  

개발자는 개인 키로 애플리케이션에 서명을 하고 공개 키와 함께 설치를 하면 아이폰에서 그 공개 키로 개발자의 신분을 확인한 다음애플리케이션을 실행한다. 분명 서명한 넘은 대두족장인데 사인이 어딘가 짝퉁스럽다면? 글타. 실행 안 된다.

  

아리까리하다면 걍 아이폰 사용자의 안전을 위한 장치라고 생각하면 그만이다.

  

근데 인증서를 지 혼자 만들어 지 혼자 쓰면 애플이 확인할 길이 없다. 그래서 인증서는 공신력 있는 기관에서 확인을 받아야 한다.동사무소 가서 인감도장 등록하는 과정이라 생각하면 된다. 이른바 CSR(certificate signaturerequest)이라는 걸 동사무소(이 경우는 애플)에 제출해야 하는데 이게 바로 개발자의 공개 키가 된다. (과거 사이트 운영할때 이 과정 지랄 맞게 복잡했는데 요즘은 손 안 대고 코 푸는 수준이다ㅠ.ㅠ)

  

개인 키 및 공개 키(CSR)는 맥의 키체인 유틸리티로 생성할 수 있다.

  

메뉴에서 '키체인 접근 -> 인증 지원 -> 인증 기관에서 인증서 요청'을 순서대로 클릭해 다음처럼 인증 정보를 입력하고 디스크에 저장한다.

  

  

디폴트로 키 크기가 2048비트, RSA 알고리즘의 키를 생성해 준다.

  

2048비트로 암호화된 데이터를 깨는 해커는 영화에도 등장할 가능성이 없다. 외계인 캐릭터가 아닌 이상 이 따위 헛소리를 지껄이면 욕먹기 딱이니깐ㅡ.ㅡ

  

CSR을 저장했다면 개발자 프로그램 사이트로 가서 신청을 한다.

  

http://developer.apple.com/iphone/manage/overview/index.action

  

 

왼쪽 메뉴에서 Certificate을 클릭하면 뜨는 화면이다. 난 이미 인증서를 받았기 때문에 저렇게 나오지만 아직 인증서 발급을받지 않은 상태라면 CSR을 선택해 업로드 할 수 있는 화면이 뜬다. 개발용은 Development 화면에서, 배포용은Distribution 탭에서 처리할 수 있다. 

  

근까, 개발용이든 배포용이든 기본적으로 다음과 같은 화면에서 CSR을 업로드하게 된다. (다음은 배포용의 경우다.)

  

  

CSR을 업로드하면 승인할지 묻는 화면이 뜨는데 오케바리를 눌러주면 그만이다.

  

  

그런 다음 Download 버튼을 클릭해서 발급 받은 인증서를 개발자 맥에 다운받으면 된다.

  

인증서를 더블클릭하면 키체인 유틸리티가 떠서 '추가하까?' 물어본다. 추가 안할거면 이 개고생 할 이유가 없다. 당근이라고 클릭해 준다.

  

요기까지 하면 이제 대두족장의 맥북은 대두족장 전용 아이폰 개발 머신이 된다. 다시 말해, 이 개발 머신에서만 대두족장 신분으로개발한 애플리케이션을 디지털 서명하고 실행할 수 있다는 거다. 돈이 좀 튀어서 개발 머신이 두 세대 쯤 된다면 함께 생성한 개인키를 해당 개발 머신에도 복사해 주면 된다.

  

  

키체인에서 개인 키 클릭하고 내보내기 해서 2차, 3차, 4차…n차(오우~ 돈이 좀 많이 튀나 보지?ㅡ.ㅡ) 머신에 심어 주면 되신다고 하는데 나도 안 해봤으니 돈을 주체하지 못해서 맥을 2대 이상 굴리는 분은 해 보시라. 

3. 개발 기기 등록

  

개발자의 아이폰도 등록해 줘야 한다.

  

역시 개발자 프로그램 사이트 오른쪽 메뉴에서 Devices를 클릭한다.

  

  

Add Device 버튼을 클릭해 기기 이름(자신이 식별하기 위한 거니까 아무거나 쓰면 된다)과 Device ID를 입력해 준다. Device ID는 아이폰 연결하고 아이튠즈에서 확인할 수 있다.

  

4. 애플리케이션 ID 생성

  

왼쪽 메뉴를 보면 App IDs라는 게 있다. 기기 뿐 아니라 애플리케이션도 ID를 등록한다.

  

  

1Z3K14B128.so.what

  

애플리케이션 ID는 두 부분으로 나뉘는데 앞의 암호 같은 부분이 번들 시드(bundle seed)라는 걸로 애플이 알아서 만들어주는 거고 나머지는 개발자가 입력한다. 애플리케이션마다 일일이 만들기 귀찮으면 와일드카드를 쓸 수도 있다.

  

  

와일드카드를 쓰면 개발할 때마다 일일이 신경 쓰지 않아서 편하겠지만, Push Notification 기능을 사용할 수 없다고경고한다. 푸시는 딱 꼬집어 그 넘과만 연동돼야 하기 때문에 구체적으로 애플리케이션 ID를 만들어줘야 한다는 거다.

  

5. 개발용 프로비전 생성

  

프로비전이란 앞에서 마련한 디지털 신원 확인 데이터(개발 인증서, 기기 ID, 애플리케이션 ID 등)를 한 데 묶은 패키지라 할수 있다. 이걸 개발용으로 쓰려는 아이폰에 깔아주면 그제서야 개발용 아이폰이 완성되는 거다. 개발자의 인증서로 디지털 서명이 돼있고, 프로비전에 포함된 기기 ID와 실제 아이폰 ID가 동일해야 하며, 애플리케이션 ID도 일치해야 애플리케이션이 실행된다.(배포할 때는 모든 기기에서 쓸 수 있어야 하기 때문에 애플리케이션 ID 정보는 빠진다.)

  

  

NewProfile 버튼을 클릭해 프로파일 이름을 입력하고 인증서를 선택한 다음 애플리케이션 ID 및 사용 기기를 골라 Submit해주면 Download할 수 있는 화면이 나오고 *.mobileprovision 이라는 파일을 다운로드 받게 된다. 이걸더블클릭하면 Xcode Organizer가 뜬다. 프로비전 파일을 my iPhone에 드래그해주면 개발자의 아이폰에 설치가된다.

  

  

5. 프로젝트 설정

  

아이폰에 프로비전을 설치했으면 프로젝트에서도 궁합을 맞춰줘야 한다. 다음 화면은 개인적으로 Stanford University의아이폰 애플리케이션 개발 강좌를 따라해보며 만든 Stalker란 프로젝트의 Info 화면이다. Xcode의 Project메뉴에서 Edit Project Settings를 클릭하고 Build 탭을 누르면 Code Signing Identity 항목을볼 수 있다. Any iPhone OS Device를 클릭하면 다음과 같은 화면이 뜬다.

 

*참고로 영어가 부담스럽지 않은 분이라면 아이튠즈에서 무료로 볼 수 있는 Stanford University의 iPhoneApplication Programming 강좌를 강추한다. 어떤 책 보다도 감 잡기 쉬울 거다. (특히, 질의응답을 형식이아닌 필수 요소로 생각하는 외넘들의 대학 강의 모습에 감동 받을 기회가 되기도 한다…쿨럭~)

  

  

여기서 원하는 프로비전을 선택해 주면 된다. (구체적으로 만든 애플리케이션 ID가 아니라 와일드카드를 써서 퉁친 애플리케이션ID라면 여러 프로젝트에서 공용으로 쓸 수 있다. 근까, 공부하는 중이라 프로젝트를 남발할 게 뻔하다면 와일드카드 애플리케이션ID를 만들어 둬야 생고생 안 한다.)

  

여기까지 마치고 아이폰 연결한 다음 프로젝트를 실행하면 (시뮬레이터가 아닌 Device를 타겟으로 설정해야 한다) 짜잔~ 아이폰에서 프로그램이 뜨는 걸 목도할 수 있다.



출처 : http://blog.naver.com/PostView.nhn?blogId=knifeven&logNo=130095318358
Posted by 오늘마감
개발한 어플에서 sqlite3 를 사용하기 위해서는 /usr/lib 에 위치한 libsqlite3.dylib라는 동적 라이브러리 파일을 링크 시켜야 한다.

1. Xcode 에서 Groups & Files 를 눌러 Frameworks 를 선택하고 Project 메뉴의 add to project 클릭

2. /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKS/iPhoneSimulatorX.Y.sdk/usr/lib 폴더의 libsqlite3.dylib 파일을 추가한다. 이 파일은 SQLite3 라이브러리의 가장 최신 버전 파일을 가리키는 링크 파일이다.

 

물론 디바이스로 테스트 할 경우에는 iPhoneSimulator.platform 대신 iPhoneOS.platform을 선택하면 된다.

메시지 창이 뜨면 Copy items into destination group's folder (if needed) 항목을 체크하고,Reference Type 을 Relative to Current SDK 로 변경하고 추가 버튼을 누른다.

% Reference Type은 상대 경로로 하는 것이 링크가 깨질 확률이 낮고 좋다.

위와 같이 설정하고 나서 실제 sqlite3를 사용할 코드에서 다음을 import 하면 된다.

//#import "/usr/include/sqlite3.h" //기존에는 이렇게 했으나, ios4에서는 아래와 같이 해야하는 듯함.
#import  < sqlite3.h >

 


출처 : http://blog.naver.com/PostView.nhn?blogId=yesusok&logNo=50100610955
Posted by 오늘마감

티스토리 툴바