2011.10.31 11:34

아이폰 앱에 진동 기능 넣는건 2줄이네요;



#import <AudioToolbox/AudioToolbox.h>


...


+(void)vibrate

{

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}



시뮬레이터나 아이패드는 진동 기능이 없으므로 반응 없습니다~

출처 : http://suigui.com/3030504
신고
Posted by 우엉 여왕님!! ghostkyow
2011.10.31 11:32

아이폰 개발 팁 - cocos2d 로딩화면 쓰레드 로딩하기

쓰레드를 이용해서 자연스러운 로딩화면을 보여주면서

백그라운드로 로딩하는데는 여러가지 방법이 있겠지만,

cocos2d 에서 이용할 수 있는 간단한 방법 중엔 이런게 있네요.

원문 링크 중의 어느 댓글을 참고해서 테스트를 해보면..



- (void) applicationDidFinishLaunching:(UIApplication*)application

{

.....


// app뜨면 바로 로딩씬을 불러와서 실행~

loadingScene = [[LoadingScene alloc] init];

[[CCDirector sharedDirector] runWithScene: loadingScene];


// 쓰레드 생성해서 로딩하기~

NSThread* thread = [[[NSThread alloc] initWithTarget:self selector:@selector(loadingProc) object:nil] autorelease];

[thread start];

}


- (void)loadingSceneProc {

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


// 이게 핵심 코드 없으면 텍스쳐 다 깨지고 난리납니다;

// 뭐하자는 얘기인지 감만 올 뿐이죠 =_=;;

EAGLContext *k_context = [[[EAGLContext alloc]

initWithAPI :kEAGLRenderingAPIOpenGLES1

sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]] autorelease];

[EAGLContext setCurrentContext:k_context];

// 여기서 필요한 것들을 백그라운드로 로딩!

// 실제로 사용할 MainScene에 로딩할게 잔뜩있다고 치고.. 생성해서 로딩~

mainScene = [[MainScene alloc] init];


// 이게 혹시(!) thread-safe하지 않으면 다른 방식으로 notification 처리 필요~

[[CCDirector sharedDirector] replaceScene:mainScene];

[pool release];

}




- 출처 : http://suigui.com/3053267 -

신고
Posted by 우엉 여왕님!! ghostkyow
2011.06.07 02:46
요즘에 신문기사를 보면 스마트폰들이 개인정보를 빼돌리고 있다는 기사를 심심치 않게 볼 수 있습니다. 실제로 그런 어플들이 꽤 있는거 같군요. 그렇다면 아이폰 혹은 아이팟터치에서는 어떤 개인정보를 빼갈 수 있을지 한번 시도해 보겠습니다.


위와 같은 코드를 실행해 보겠습니다. 위의 코드에 대한 설명은 다음과 같습니다.

phoneName : 디바이스의 iTunes에 연결시에 정한 이름 eg) My Iphone
systemName : OS의 이름 eg) iPhone OS
systemVersion : OS의 버젼 4.1
phoneNum : 아이폰의 경우 디바이스에 할당된 전화번호
phoneUniqueIdentifier : UUID라고 불리는 아이폰/아이팟터치의 고유 시리얼


제가 언급을 깜빡하고 코드에 입력하지 못했는데요. 다음과 같은 방법으로 모델명을 알아올수도 있습니다. eg) iPhone, iPod Touch

NSString *phoneModel = [[UIDevice currentDevice] model];

일단 실행결과는 위와 같습니다. 여기서 알 수 있는 점은 휴대폰 번호를 알아오지 못한다는 것입니다. null값이 나올 뿐이죠. 예전에는 이와 같은 방법으로 휴대폰 번호를 알아올 수 있었습니다. 하지만 4.x 버젼대의 OS 업그레이드와 함께 방법이 막혀버린것 같습니다.

중이 제 머리 못깎는다고 전화번호부에 있는 사람들의 정보는 가져올수 있지만 자기 자신의 정보를 가져오지는 못하는군요. 아쉽지만 휴대폰 번호를 얻어내기 위해서는 어플리케이션 상에서 사용자에게 직접 물어보는 방법을 취해야 할것 같습니다. 시나리오가 중요하겠네요.
크리에이티브 커먼즈 라이센스
Creative Commons License

출처 - http://theeye.pe.kr/414 -

신고
Posted by 우엉 여왕님!! ghostkyow
2011.05.31 15:12




[MySQL] MySQL 명령어 _완전기초 (데이터베이스는 삽입,검색,수정,삭제만 알아도 반은 안거란 말이 있죠~ )

USE database_name;        ← 사용할 데이터 베이스 선택 :

 

① 검색

   SELECT * FROM table_name WHERE abc_column='a' ;

② 수정

   UPDATE  tabel_name  SET  a_column='a'  WHERE b_column='b' ;

③ 삽입

   INSERT INTO  table_name (a_column, b_column) VALUES ('a', 'b') ;

④ 삭제

   DELETE FROM  table_name  WHERE d_column='del' ;

   ※ TRUNCATE table_name;   ← 전체 레코드 삭제 ( DELETE FROM table_name 보다 빠름 )

 

 


자~ 여기부터는 MySQL 명령어 기초를 살짝쿵 넘어가 봅시다

 

① SELECT * FROM table_name WHERE abc_column='a' ORDER BY a_column DESC  LIMIT 100;

     └ order by a_column은 정열,  oder by a_column desc는 역순정열,  limit 100 은 100개까지

 

   SELECT * FROM table_name WHERE a_column like '%aaa%';

     └ a_column 에서 aaa 를 포함하는 모든 레코드를 가져옴

 

   SELECT * FROM table_name WHERE a_column BETWEEN 10 AND 100;

     └ a_column 에서 10 ~ 100 사이의 값을 가진 레코드를 가져옴

 

   SELECT a_column FROM table_name GROUP BY a_column;

     └ a_column 의 같은 값끼리 그룹을 묶음.

 

   SELECT count(*) FROM table_name;

      └ 테이블의 전체 레코드 갯수를 가져옴

 

 

② UPDATE table_a SET table_a . a_column = table_b . a_column FROM table_a, table_b

    WHERE table_a.a_column = table_b.a_column  ;

       └ 두개의 테이블에서 조건을 비교하여 업데이트

 

③ 문자관련 함수

    SELECT LEFT(a_column, 2) FROM table_name;     ← a_컬럼 에서 왼쪽부터 2자리 잘라서 가져온다.

    SELECT MID(a_column, 2, 4) FROM table_name;   ← a_컬럼 2자리부터 오른쪽으로 4자리 만큼 가져온다.

    SELECT RIGHT(a_column, 3) FROM table_name;   ← a_컬럼 에서 오른쪽부터 3자리 잘라서 가져온다.

    SELECT * FROM table_name WHERE LENGTH(a_column)=10;  ← a_컬럼에서 길이가 10인 레코드만

    UPDATE table_name SET a_column=REPLACE(a_column,'변경전글자','변경후글자');

       └ a_컬럼의 '변경전글자' 라는 문자열을 '변경후글자'로 바꾸어 a_컬럼 수정

    UPDATE table_name SET a_column=TRIM(a_column);

       └ a_컬럼의 왼쪽 오른쪽 공백을 모두 제거

     SELECT AVG(a_column),MIN(a_column),MAX(a_column),SUM(a_column) FROM table_name;   

       └ AVG : 평균값, MIN : 최소값, MAX : 최대값, SUM : 합계

     SELECT version(),user(),database();

        └ MySQL 버젼 , 유저 , 데이터베이스명 보기

 

④ 날자관련 함수

    SELECT NOW();

 

⑤ JOIN : a_테이블 과 b_테이블 에서 a_컬럼의 값이 같은 레코드만 가져옴

    SELECT a_table.a_column, b_talbe.a_column

    FROM a_talbe, b_table

    WHERE a_table.a_column = b_table.a_column;

 

⑥ UNION : a_테이블 과 b_테이블 에서 a_컬럼,b_컬럼 모든 값을 한꺼번에 가져옴

    SELECT a_column FROM a_table

    UNION

    SELECT b_column FROM b_table;

 

자자~ 여기 부터는 조금더 기초를 넘어 MySQL 명령어 기본기 다지기 정도? 잠시 쉬어갑시다~

 

 

 

 

MySQL 은 공개형 데이터베이스로 누구든 라이센스 제한 없이 사용할 수 있습니다.

(공짜라고 절대 무시못할 엄청난 데이터베이스 입니다)

다운로드는 http://www.mysql.com/donwnloads 에서 하실수 있으며, 현재 버전 5.x 까지 나와있습니다~

 

 

쿼리분석기는 MySQLFRONT 를 사용하는데 그냥 저냥 아주 잘 쓰고 있답니다.

http://www.mysqlfront.de/wp/

 


 

신고
Posted by 우엉 여왕님!! ghostkyow
2011.05.31 10:45
//sqlite3 오픈및 생성
if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
    sqlite3_close(database);
    NSAssert(0, @"Failed to open database");
}
 
else {
    char *errorMsg;
    NSString *createSQL1 = @"CREATE TABLE IF NOT EXISTS LOGS (ID INTEGER PRIMARY KEY
               AUTOINCREMENT, PHONENUMBER_DATA TEXT, NOW_DATE DATE, CALL_TIME TEXT);";
    if (sqlite3_exec (database, [createSQL1 UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSLog(@"Error creating table: %s", errorMsg);
    }
    NSString *createSQL2 = @"CREATE TABLE IF NOT EXISTS ADDRESS (ID INTEGER PRIMARY KEY
               AUTOINCREMENT, NAME_DATA TEXT, PHONENUMBER_DATA TEXT, MEMO_DATA TEXT);";
    if (sqlite3_exec (database, [createSQL2 UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSLog(@"Error creating table: %s", errorMsg);
    }
}
/* 여기서 생략된 -(NSString *)dataFilePath는 sqlite3파일이 있는 주소값을 리턴해주는 함수 입니다.
   지금 이 소스는 제가 실제로 썼던 소스라 두개의 테이블을 만들게 되어 있어요.
   ID integer primary key autoincrement는 자동으로 생성 되며 키값이 되구요, 그외 나머지는 Text,
   Date, Integer 등등 타입을 설정 할수 있어요 */
 
// 값을 받아 오기.
NSMutableArray *mutableLogData = [NSMutableArray array];
NSString *query = @"SELECT ID ,PHONENUMBER_DATA, NOW_DATE, CALL_TIME FROM LOGS ORDER
                    BY ID DESC";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
    while (sqlite3_step(statement) == SQLITE_ROW) {
        int idData = sqlite3_column_int(statement, 0);
        char *numberData = (char *)sqlite3_column_text(statement, 1);
        double dateData = sqlite3_column_double(statement, 2);
        char *callData = (char *)sqlite3_column_text(statement, 3);
        if (numberData != nil && dateData != 0 && idData != 0){
            NSNumber *idValue = [NSNumber numberWithInt:idData];
            NSString *numberValue = [[NSString alloc] initWithUTF8String:numberData];
            NSDate *dateValue = [NSDate dateWithTimeIntervalSince1970:dateData];
            NSString *callTimeValue = [[NSString alloc] initWithUTF8String:callData];
            NSArray *dataArray = [NSArray arrayWithObjects:idValue,
                                                           numberValue,
                                                           dateValue,
                                                           callTimeValue, nil];
            [mutableLogData addObject:dataArray];
            [numberValue release];
            [callTimeValue release];
        }
    }
}
sqlite3_finalize(statement);
/* logs라는 테이블의 id, phonenumber_data, now_date, call_time을 id의 역순으로 가져 오는
    부분 입니다.
    아주아주 쉬운 코드니 바로 아실듯 해요 ㅠ_ㅠ
    여기서는 제가 모든줄을 받아 오기 때문에 while문을 돌려 Array에 넣어주고 있어요 */
 
// 특정 줄의 삭제
 
char *errorMsg;
char *delete = "DELETE FROM ADDRESS WHERE ID = ?";
sqlite3_stmt *stmt;
if( sqlite3_prepare_v2(database, delete, -1, &stmt, nil) == SQLITE_OK) {
    sqlite3_bind_int(stmt, 1, [idData intValue]);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
    NSLog(@"Error deleting table: %s", errorMsg);
}
sqlite3_finalize(stmt);
 
/* id값을 받아 그것과 일치하는 address테이블의 줄을 삭제 해주는 코드 입니다.
    id는 당연 integer값이니 int형으로 넣구요. */
 
 
// 테이블에 값 입력하기
char *errorMsg;
char *update = "INSERT INTO LOGS (PHONENUMBER_DATA, NOW_DATE, CALL_TIME) VALUES (?,?,?);";
if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
    sqlite3_close(database);
    NSAssert(0, @"Failed to open database");
}
sqlite3_stmt *stmt;
if( sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, [callNum UTF8String], -1, NULL);
    sqlite3_bind_double(stmt, 2, [nowDate timeIntervalSince1970]);
    sqlite3_bind_text(stmt, 3, [callTime UTF8String], -1, NULL);
};
if( sqlite3_step(stmt) != SQLITE_DONE)
    NSLog(@"Error updating table: %s", errorMsg);
sqlite3_finalize(stmt);
 
/* logs 테이블에 값을 넣는 코드 입니다.
    넣으려고 하는 값은 ?를 이용하여 따로 넣어 줄수 있어요.
    조금 아래를 보시면 bind를 이용해 값을 넣는 부분이 있어요 */
 
// 원래 있던 값 수정하기
char *errorMsg;
char *update = <br>
     "UPDATE ADDRESS SET NAME_DATA=? , PHONENUMBER_DATA=? , MEMO_DATA=? WHERE ID=?;";
sqlite3_stmt *stmt;
if( sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);
    sqlite3_bind_text(stmt, 2, [phoneNum UTF8String], -1, NULL);
    sqlite3_bind_text(stmt, 3, [memo UTF8String], -1, NULL);
    sqlite3_bind_int(stmt, 4, idNum);
}
if( sqlite3_step(stmt) != SQLITE_DONE)
NSLog(@"Error updating table: %s", errorMsg);
sqlite3_finalize(stmt);
 
/* address테이블의 id를 같은 값을 찾아 <br>
   그 줄의 name_data, phonenumber_data, memo_data를 바꾸는 코드입니다.
   위랑 같이 ?를 이용해 따로 넣으실수 있어요 */

//저번에 깜장색으로 썼더니 보기 편하다길래 깜장색으로 해요 ~_~.

// 출처 -  http://cafe.naver.com/mcbugi/122995
신고
Posted by 우엉 여왕님!! ghostkyow
2011.05.31 09:56
1. alloc/copy/new/retain 메소드로 생성 또는 지정한 객체는 개발자 스스로 release 해야한다.

alloc 한만큼 release 해야한다.

2. 위 메소드 이외의 메소드로 생성한 객체는 대부분 autorelease 상태이다.

autorelease 상태의 객체는 그 블럭에서만 유효하고 그 이후에는 언제 사라질지 알수가 없다.
얻어진 객체를 계속 사용하려면 retain 시켜줘야 한다.
위 규칙은 컴파일러에서 보장되는 원칙이 아니다.
따라서 autorelease 상태가 아닐 수 있다.

3. 개발자가 생성한 메소드가 객체를 반환할때는 위 2번 규칙에 따라 만드는 것이 좋다.

나도 헤깔리지 않고, 소스를 넘겨받은 사람도 헤깔리지 않는다.

4. 집합체(NSArray 등) 객체에 객체를 넣을때는 집합체가 자동으로 retain 시킨다.

집합체가 알아서 retain 하고 release 하므로 별다르게 신경쓸게 없다.

5. 개발자가 별도로 집합체를 생성한다면 4번 원칙에 따르는 것이 좋다.

출처 - http://cafe.naver.com/mcbugi/135871 -  
신고
Posted by 우엉 여왕님!! ghostkyow
2011.05.31 09:53
지역정보를 가져오는법.
1
2
NSLocale *locale =[NSLocale currentLocale];
NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];

언어정보 가져오는법.
1
2
3
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];


신고
Posted by 우엉 여왕님!! ghostkyow
2011.05.23 10:17

iPhone (아이폰개발시 DB를 위한 Sqlite3 다루기 (2)

 

개발환경 : Mac OS X 10.6.3, Simulator - 3.1.3

 

전편에서 작성한 sqlite3 파일을 어떻게 프로젝트에 넣고 사용하는지에 대한

설명을 했었다이번에는 여기에 테이블을 만들고 데이터를 집어 넣은후

그 내용을 가져와서 테이블 형태로 보여주는 프로그램을 구현해볼 것이다.

 

퀴즈 관련 테이블을 만든다.

CREATE TABLE "quiz" ("no" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL ,

"title" VARCHAR, "question" VARCHAR, "answer" VARCHAR, "level" VARCHAR)

 

이 테이블의 용도는 퀴즈 문제를 DB 에 넣어두고 문제풀이를 위한 어플을 만드는데

쓰일것이다아무것도 없으므로 샘플데이타를 집어넣어 준다.

[샘플 insert 쿼리문]

insert into quiz (title, question, answer, level) values ('title', '질문이다', '대답이다', '1')

insert into quiz (title, question, answer, level) values ('title2', '질문이다2', '대답이다2', '2')

insert into quiz (title, question, answer, level) values ('title3', '질문이다3', '대답이다3', '3')

 

데이터베이스 테이블에 매칭되는 모델클래스를 하나만든다. Subclass  NSObject 

된다.

테이블을 표시할 UIViewController 의 첫 로딩함수에 데이터베이스 생성과 데이터를

불러올 함수를 집어넣는다.

dbName 은 sqlite3 파일명을 말하며, dbPath 는 파일이 있는 위치를 저장한다.

quizs 는 quiz 모델객체가 저장될 클래스 이다그리고 함수가 2개 있는데

checkAndCreateDatabase 는 지정한 DB 파일명이 있는지 체크하고 있으면

그냥넘어가지만 없으면 에러를 출력하게 되어있다두번째 readFromDatabase

현재 quiz 테이블에 저장된 데이터를 모두 가져와 quizs 에 저장하는

임무를 맡고 있다.

 

MainXib.h

01 @interface MainXib : UIViewController {
02     NSString *path;
03     NSString *dbName;
04     NSString *dbPath;
05      
06     NSMutableArray *quizs;
07 }
08  
09 @property(nonatomic, retain)NSMutableArray *quizs;
10  
11 - (void)checkAndCreateDatabase;
12 - (void)readFromDatabase;
13  
14 @end

UIViewController 을 상속받아 만든 클래스이므로 화면이 로딩되면 처음으로

실행되는 함수가 viewDidLoad 이다여기에 데이터베이스를 체크하고

내용을 가져오는 내용이 들어가 있다.

MainXib.m

01 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
02 - (void)viewDidLoad {
03     dbName = @"success.sqlite";
04