2011년 자바 개발자 컨퍼런스 등록!!

기타 2011. 5. 23. 10:58



늘 마이크로소프트웨어 잡지를 통해서만 봐왔던 "자바 개발자 컨퍼런스"에

드디어 참여할 수 있는 기회가 생겼다! 활동중인 종합예술전산쟁이 커뮤니티에서 함께

6월 19일 참석하기로 결정!  어떤 모습일지 벌써부터 기대된다~ ^^

  제 11회 2011 한국자바개발자 컨퍼런스

'기타' 카테고리의 다른 글

[연말정산] 월세공제 확정일자에 대한 잘못된 진실  (2) 2013.01.31
지갑  (0) 2011.05.26
2011년 자바 개발자 컨퍼런스 등록!!  (1) 2011.05.23
Base64 Encoding  (0) 2011.02.18
muju  (33) 2011.02.14
정규표현식(Regular Expression)  (0) 2010.12.10

문자열 조작함수 직접 구현하기

언어로그/C/C++ 2011. 4. 29. 14:41



API를 이해하기 위한 가장 좋은 방법 중 하나는  직접 구현해보는 것이다 
 string.h  에서 지원하는  문자열 조작 함수들을 직접 구현해보았다.  이 함수들은 이름에 'str' 이라는 접두어를
가지고 있는데 직접 구현한 버전에는 "my_" 라는 접두어를 붙혔다. 




1. 문자열 함수들의 프로토 선언과 기능
 
  1. // 문자열 s의 길이를 반환하는 함수
  2. int strlen(char *s);      


    // s에 문자열 t를 복사하는 함수

  3. void strcpy(char *s, char *t);

  4. // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
  5. int strcmp(char *s, char *t);

  6. // 문자열 dest의 끝에 src 문자열을 연결하는 함수

  7. char *strcat(char *dest, const char *src)

  8. // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
  9. char *strchr(const char *string, int c);

  10. // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
  11. char *strrchr(const char *string, int c);

  12. // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
  13. char *strstr(const char *string, const char *strSearch);

  14. // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
  15. char *strpbrk(const char *string, const char *strCharSet);

  16. //  문자열 str에서  delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
  17. //  NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
  18. char *strtok(char *str, const char *delims);




2. 문자열 조작 함수의 구현

my_string.c

#include <stdio.h>
#include <string.h>

int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);


char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);

char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);


char *my_strtok(char *str, const char *delims);

int main (int argc, char const* argv[])
{
    char dest[1024] = "nice to meet you!";
    char *test = "my name is kimsungbae! what's up?";
    char *token;
    

    printf("strchr   : %s \n", strchr(test, '!'));
    printf("my_strchr: %s \n", my_strchr(test, '!'));
    printf("\n");
    
    printf("strrchr   : %s \n", strrchr(test, '\''));
    printf("my_strrchr: %s \n", my_strchr(test, '
\''));
    printf("\n");
    
    printf("strstr   : %s \n", strstr(test, "is"));
    printf("my_strstr: %s \n", my_strstr(test, "is"));
    printf("\n");
    
    printf("my_strcat : %s \n", my_strcat(dest, test));
    printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
    printf("\n");
    
    printf("strpbrk    : %s \n", strpbrk(test, "?!\'"));
    printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));

    token = my_strtok(dest, " ");
    printf("%s \n", token);
    
    while ((token = my_strtok(NULL" ")) != NULL) {
        printf("%s \n", token);
    }
    return 0;
}

int my_strlen(char *s) {
    char *= s;
    while (*p++ != '\0');
     
    return p - s;
}


void my_strcpy(char *s, char *t) {
    while (*s++ = *t++) ;
}

int my_strcmp(char *s, char *t) {
    for (; *== *t; s++, t++) {
        if (*== '\0') {
            return 0;
        }
    }
    return *- *t;
}

char *my_strcat(char *dest, const char *src) {
    char *p_dest = dest;
    
    while (*p_dest != '\0') {
        p_dest++;
    }
    
    while (*src != '\0') {
        *p_dest++ = *src++;
    }
    *p_dest = '\0';
    
    return dest;
}

char *my_strncat(char *dest, const char *src,size_t count) {
    char *p_dest = dest;
    
    while (*p_dest != '\0') {
        p_dest++;
    }
    
    while (*src != '\0' && count > 0) {
        *p_dest++ = *src++;
        count--;
    }
    *p_dest = '\0';
    
    return dest;
}

char *my_strchr(const char *str, int c) {
    while (*str != '\0') {
        if (*str == c) {
            return str;
        }
        str++;
    }
    return NULL;
}

char *my_strrchr(const char *str, int c) {
    char *p_str = str + strlen(str) - 1;
    
    while (p_str > str) {
        if (*p_str == c) {
            return p_str;
        }
        p_str--;
    }
    return NULL;
}

char *my_strstr(const char *str, const char *search) {
    char *start = NULL;
    
    while (*str != '\0') {
        if (start != NULL && *search == '\0') {
            break;
        }
        if (start != NULL && *str != *search) {
            start = NULL;
        }
        if (start == NULL && *str == *search) {
            start = str;
        }
        if (start != NULL && *str == *search) {
            search++;
        }
        str++;
    }
    return (start != NULL) ? start : NULL;
}


char *my_strpbrk(const char *str, const char *charset) {
    char *p_char;
    
    while (*str != '\0') {
        p_char = charset;
        while (*p_char != '\0') {
            if (*str == *p_char++) {
                return str;
            }
        }
        str++;
    }
    return NULL;
}


char *my_strtok(char *str, const char *delims) {
    static char *tmp, *pstart;
    char *p_delims;
    
    if (str != NULL) {
        tmp = str;
    }
    if (*tmp == '\0') {
        return NULL;
    }
    pstart = tmp;
    
    while (*tmp != '\0') {
        p_delims = delims;
        while (*p_delims != '\0') {
            if (*tmp == *p_delims++) {
                *tmp++ = '\0';
                return pstart;
            }
        }
        tmp++;
    }
    return pstart;
}

 


'언어로그 > C/C++' 카테고리의 다른 글

과제 #1 입출력,연산자  (0) 2011.06.13
음수의 표현  (0) 2011.06.13
문자열 조작함수 직접 구현하기  (2) 2011.04.29
라인 입출력 함수  (0) 2011.03.27
배열의 이해  (0) 2011.03.27
기억부류(Storage Class) / 변수  (0) 2011.03.27
  • 근혜 2016.11.21 03:52 ADDR 수정/삭제 답글

    strstr함수 문제가있는거같아요~ 확인해보세요

    • 로그 @로그 2016.12.07 11:08 신고 수정/삭제

      전체 문자열이 일치하는 경우 예외사항이 발생하고 있네요. ^^ 해당 케이스 수정했습니다. 감사합니다.

Objective-C 문자열 조작 메서드

Objective-C 2011. 4. 29. 12:22



Objective-C 문자열 조작 메서드 중 몇가지에 대해서 알아보자. 

문자열 비교시 결과값을 위해 다음과 같은 enum 상수가 선언되어 있다. 

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

NSOrderedAscening은 좌측의 피연산자가 우측의 피연자보다 작다는 것을  
NSOrderedDescending은 좌측의 피연자가 우측의 피연자보다 크다는 것을
NSOrderedSame은 좌우측의 피연산자가 같다는 것을 나타낸다. 


다음은 문자열에 포함된 특정 문자열이나  NSArray 안에 특정 Object와 같이 범위를 지정하기 위해 사용되는 구조체이다. 
typedef struct _NSRange {
      NSUInteger location;   // start index
      NSUInteger length;     // location 위치부터의 길이 
} NSRange;




다음은 초 단위로 시간간격을 지정하기 위한 타입정의이다. 
typedef double NSTimeInterval;



이름만을 보고도 충분히 그 의미를 알수 있기 때문에 메서드에 대한 설명은 생략하겠다. (-_-;;)



문자열 비교 
- (NSComparisonResult)compare:(NSString *)aString

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

- (BOOL)isEqualToString:(NSString *)aString
 
- (BOOL)hasPrefix:(NSString *)aString




문자열 접합 
- (NSString *)stringByAppendingString:(NSString *)aString

- (NSString *)stringByAppendingFormat:(NSString *)format ...





문자열 분할 
- (NSString *)substringToIndex:(NSUInteger)anIndex

- (NSString *)substringFromIndex:(NSUInteger)anIndex

- (NSString *)substringWithRange:(NSRange)aRange





문자열 검색
- (NSRange)rangeOfString:(NSString *)aString

- (NSRange)lineRangeForRange:(NSRange)aRange





문자열 치환 
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement






문자열 변환 
- (NSString *)capitalizedString

- (NSString *)lowercaseString

- (NSString *)uppercaseString

- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding





문자열 토큰 분리 
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

- (NSArray *)componentsSeparatedByString:(NSString *)separator




'Objective-C' 카테고리의 다른 글

Objective-C 문자열 조작 메서드  (0) 2011.04.29
다중인자를 갖는 PerformSelector 메시지  (0) 2011.03.23
Protocol 과 Category  (0) 2011.03.22
Objective-C 훑어보기  (2) 2011.03.20
[Cocoa] Cocoa Design Pattern  (0) 2011.03.20
HMAC-SHA1 구현  (0) 2011.03.03

NSNotification

아이폰 2011. 4. 29. 11:54




Cocoa 와  Cocoa Touch 프레임웍의 이벤트 통지 메커니즘인 NSNotification 에 대해서 간략하게 알아보자. 

1. NSNotification 이란? 

다수의 객체들 사이에서 이벤트가 발생했음을 알리는 방식으로, 한 객체와 다른객체 간에 의존관계를 중계하는 클래스에
집중화시켜서 서로 간에 결합도를  느슨하게 할 수 있다.  NSNotificationCenter,  NSNotification, Observer 로 구성된다.
NSNotificationCenter는 객체들 사이에 이벤트 전달을 중계하는 역할을 하며,  Observer는 이벤트가 발생하기를 기다리는 대상을
나타낸다. Observer 가 기다리는 이벤트에 대한 정보와 부가적인 데이터를 전달하기 위한 객체가 Notification 이다. 
Observer 는 객체의 역할을 지칭하는 용어이며, NSObject를 상속하는 모든 클래스가 Observer 가 될수 있다. 



Notification  사용예 
푸시 메시지가 도착했을 때, 현재 화면에 상관없이 특정화면으로 전환하기 위해 사용하였다. 
화면은 항상 (화면1 > 화면2 > 화면3) 순서로 네비게이션 이동이 이루어진다고 해보자.  푸시 이벤트는 UIApplicationDelegate 프로토콜을 구현하는 클래스에서 수신하면,  이곳에서 NSNotification 이벤트를 발생시킨다.  실행되고 있는 App이  현재 어떤 화면을 보여주고
있던지 이벤트를 수신하는 클래스에서는  연쇄적으로 Notification을 다음화면으로 전달하여 (화면1 > 화면2 > 화면3) 의 순서를 유지하며 화면 전환을 할 수 있다. (화면1  > 화면3으로 바로 전환해버리면 네비게이션 순서가 틀어져버림)

 



이외에도 비동기 방식으로 동작하는 NSURLConnection에서 데이터 수신이 완료되면, 수신한 데이터를  전달할 때 NSNotification을
사용하면  클래스간에 참조를 가지고 있지 않아도 데이터를 쉽게 전달할 수 있다.  




2. NSNotification 을 사용하기 위한 절차 
① NSNotificationCenter에 Observer 와  Notification 등록 
② Notification 포스팅 
③ 처리
④ NSNotificationCenter 에서 Observer 와 Notification 제거 

 
   
  

 
2.1 Notification 등록
NSNotificationCenter 의 클래스 메소드 defaultCenter를 사용하여 로컬 NotificatonCenter의 싱글턴 객체를 얻을 수 있다.
이 클래스에서 지원하는 메서드를 사용하여  Notification을 등록 할 수 있다.  인자 Observer는  이벤트 발생시 수신할 객체, 
selector는 이벤트 수신시 수행할 메시지 selector,  name은 이벤트의 이름,  object는 이벤트를 발생시킬 객체이며,  nil을 주면
이벤트를 발생시킬 객체의 종류에는 상관없이 이벤트를 수신한다
 
NSNotificationCenter *notifCenter = [NSNotificationCenterdefaultCenter];

[notifCenter addObserver:self
                         selector:@selector(viewTrasitionToMyLostArticleList:) 
                            name:@"moveToPushList" object:nil];

위 문장은 다음과 같이 해석된다.  
“ 어떤 object가 어떤 이름의 이벤트를 보내면, observer의 selector를 호출해줘” 




2.2 Notification 메시지의 형태
Observer의 수신 메시지의 형태는 반드시 NSNotification* 타입의 인자 하나를 받아야 한다. 그렇지 않으면 unrecognized selector sent
에러가 발생한다.
(void)viewTrasitionToMyLostArticleList:(NSNotification*)notif {
   NSString *pushSeq = [[notif userInfo] objectForKey:@"pushSeq"];
   // 의심분실물 목록뷰로 전환 
}




2.3 이벤트 발생시키기 
NSNotificationCenter의 다음과 같은 메소드를 사용하여 Notification을 발생시킬 수 있다.

  * Notification을 직접 생성하여 전달 - 데이터 전달이 필요없을 경우  
(void)postNotification:(NSNotification*)notification;


* 부가적으로 전달해야할 데이터가 있을 경우 사용
(void)postNotification:(NSString*)notificationName 
                object:(id)anObject 
              userInfo:(NSDictionary*)userInfo




2.4 등록된 observer와 Notification 제거
NSNotificationCenter 등록되어 있는 observer와 notification은 사용후 메모리 절약을 위해 제거해주는 것이 좋다.
 
// notificationObserver와 동일한 참조의 모든 observer를 제거 
(void)removeObserver:(id)notificationObserver

// 송신자가 notificationSender로 등록된 notificationName으로 등록된 모든 observer 제거 
(void)removeObserver:(id)notificationObserver
                name:(NSString *)notificationName
              object:(id)notificationSender



'아이폰' 카테고리의 다른 글

[번역] 사용자 인터페이스 설계의 원리  (0) 2012.06.24
수동으로 UI 컨트롤에 이벤트 전달  (0) 2011.11.13
NSNotification  (1) 2011.04.29
푸시 메시지 포맷  (0) 2011.04.07
애플 푸시 서비스  (0) 2011.04.07
Sprite Sheet 제작툴 Zwoptex  (0) 2011.03.16
  • 사공석준 2011.07.12 17:33 ADDR 수정/삭제 답글

    좋은정보 감사합니다 퍼가요 ^^

노력해서 공부하고 계신가요?

생각로그 2011. 4. 26. 15:53


대학교 때 인상깊게 읽었던 글인데, 예전 블로그를 정리하며 다시 읽어보니 더 깊은 의미로 다가온다  
요 몇달 동안 고민하느라 노력하는 것을 게을리 했다.  물론 생각을 많이 할 수 있는 시간들었기에 아쉽지는 않다.
이제 구체적인 목표를 잡고 다시 공부에 매진할 때인 듯하다
마지막 부분  "상대방에 대한 5분의 생각" 구문이 특히 마음에 든다 ㅎ


http://cafe.naver.com/javachobostudy/26157 블로그에서 퍼온 "고승덕 변호사"께서 작성한 글이다. 


고승덕 변호사

나는 외모에 컴플렉스가 있다. 
아시겠지만, 대학교 때 고시 3개를 합격했다. 
사법고시 합격, 외부고시 2등, 행정 고시 1등. 
그리고 서울대 법대를 수석 졸업했다. 

학교 졸업 후 부모님께 큰 절을 했었다. 똑똑한 머리를 물려줘서가 아니라, 사실은 변변찮은 외모덕에 그저 고시에만 전념할 수 있게 해줬기 때문에 감사하다는 의미로.


내 직업은 
1. 변호사이면서
2. 방송도 하고
3. 책을 쓰고 있다. 평생 소원이 1년에 1권씩 평생 책을 내는 것이다.
4. 글도 쓴다. 모 신문사에 경제기사를 1주일에 2개정도 쓴다.
5. 또 오늘과 같은 특강도 한다. 평균 1주일에 2회 정도
6. 증권분야에서도 활동하고 있다. 운영하고 있는 사이트가 있는데 회원수만도 3만5천명 정도 된다. 
나름대로 홈페이지 관련 사업을 하나 구상 중인 것도 있다.
7. 마지막으로 대학에서 겸임교수로 활동하고 있다.

이처럼 내가 하고 있는 일이 무척 많은 것 같고, 
어떻게 이걸 다 할까 생각이 들겠지만 다 가능하다.

이 중에서 한가지만 하더라도 힘들다고 하는 사람이 많다. 
그러나 가능하다고 생각하면 다 가능하다.

무엇이든지 목표가 중요하며, 
그 목표 달성을 위해 가장 중요한 것은 확신이다. 
사람들은 어려운 일일수록 확신을 갖지 못한다.

인생에 있어 2가지 자세가 있다. 
보통 사람들은 남보다 적게 노력하고 결과는 남들과 같은 똑같이 나오게 하려고 한다. 사실은 이것이 경제학 법칙에 맞는 것이다. 투입을 적게하고 효과를 많이 내는 것.

반대로, 다른 사람들 만큼의 결과를 얻기 위해서는 더 많은 노력을 해야 한다고 생각할 수 도 있다. 나의 경험상으로 보면 후자가 훨씬 좋은 결과를 낳는다.

남보다 노력을 더 많이 해서 비슷한 결과를 가져 오는 것이 비효율적인 것 같지만, 실제로 이것은 어느 시점이 지나면 훨씬 더 좋은 결과를 가져온다.이것이 내가 인생을 살면서 내 스스로 내린 결론이다.


그럼 노력이란 무엇이냐? 
나는 "노력이란 성공의 확률을 높이는 것이다."라고 정의 내린다. 
하지만 물론 결과를 반드시 보장하지는 않는다. 

노력에도 함수 관계가 성립한다.
* 노력 = f(시간 X 집중)

내가 실제 노력을 했는가 안했는가를 판단하려면 
시간을 많이 투입했거나 집중을 잘했거나 살펴보면 된다.

똑같은 일을 하더라도 3시간만에 끝내는 사람이 있는가 하면 5시간만에 끝내는 사람도 있다. 그러나 3시간만에 끝내는 사람이 실제 일을 더 잘하는 것 같지만 나머지 2시간을 어떻게 보내느냐가 중요하다. 
더 많이 알기 위해 그 2시간을 투자하지 않았다면 노력하지 않은 것이다.

짧은 시간을 비교해 보면 노력을 적게하고, 많이 하는 것이 결과만 보면 거의 미미하다고 할 수 있다. 그러나 그 순간을 이겨내면 주식처럼, 가속도가 붙기 시작하면서 그 차이는 엄청나다.

집중에 대해서 얘기해 보면, 고시 공부할 때 예를 들어 보겠다. 
나는 고시 공부를 1년간 해서 합격했다. 어떻게 가능 했느냐?
첫째는 된다고 생각하는 확신 있었기 때문이고, 
둘째는 남보다 더 많은 노력을 했기 때문이다.

보통 고시에 합격하려면, 봐야 할 책이 50권, 권당 페이지는 500p. 
그 책을 5번을 봐야 합격한다는 얘기가 있다. 
그러나 나는 7번을 봤다. 이를 계산해보면,
50 X 500 X 7 = 175,000 페이지를 읽어야 한다는 얘기다. 
이것을 1년을 360일로 계산해보면 1일 목표량이 나온다. 
즉, 1일 500페이지 정도의 분량을 봐야 한다는 것이다.

이처럼, 목표를 세울때는 구체적으로 세워야 한다. 
막연한 목표는 달성하기 힘들다.

이 결론을 보면 "인간이 할 짓이 아니다"라고 생각할 것이다. 
누구나 그렇게 생각한다. 
그렇게 생각하면 사람들은 포기하게 된다. 
설사 하게 되더라도 하다가 흐지부지 된다. 

이렇게 목표에 대해 확신이 없고, 
목표를 의심하는 사람은 집중을 할 수 없다. 
무엇보다도 자신의 목표에 확신을 가져라.

된다는 사람만 되고 안된다고 생각하는 사람은 안된다. 
일단 안 된다고 생각하는 대부분의 85%의 사람들은 이미 나의 경쟁상대가 아닌 것이다. 된다고 생각하는 일부만 나의 경쟁이 된다. 그럼 경쟁대상이 줄어드니 훨씬 마음도 한결 가벼워진다.

세상도 절대적으로 잘하는 사람은 원하지도 않고 필요하지도 않다. 남 보다만 잘하면 된다. 그럼, 다른 사람보다 잘하고 있는지를 어덯게 판단하느냐? 그것은 나 자신을 판단 기준으로 삼으면 된다.

인간은 거의 비슷하다. 내가 하고 싶은 선에서 멈추면 남들도 그 선에서 멈춘다. 남들보다 약간의 괴로움이 추가되었을 때라야 비로소 노력이란 것을 했다고 할 수 있다.

고시 공부할 때 7시간 잤다. 장기간 공부를 해야할 경우라면 일단 잠은 충분히 자야한다. 하루 24시간 중 나머지 17시간이 중요하다. 고시생의 평균 1일 공부시간은 10시간 정도다. 

그러나 정말 열심히하는 사람은 잠자는 시간빼고 17시간을 하는 사람이 있을 것이다라는 생각을 했다.

그러면 정말, 밥먹는 시간도 아까웠다. 남들과 똑같이 먹어서는 안된다고 생각한 것이다. 반찬 떠 먹는 시간도 아까웠다.씹는 시간도 아까웠다. 그래서 모든 반찬을 밥알 크기로 으깨어 밥과 비벼 최대한의 씹는 시간도 아꼈다. 숟가락을 놓는 그 순간부터 공부는 항상 계속 되어야했다. 나의 경쟁자가 설마 이렇게까지 하겠냐하고 생각들면 노력했다고 할 수 있는 것이다.

미국에서 생활할 때 보면 소위 미국의 전문가라고 하는 사람들은 간단한 샌드위치로 끼니를 때운다. 점심시간 1시간 다 쓰고, 이래저래 20~30분 또 그냥 보내는 우리나라 사람들은 그들에 비하면 일 하는게 아니다.

집중을 잘 하는 것은 벼락치기 하는 것이다. 벼락치기 할 때가 더 기억에 오래 남는다고 한다. 우등생은 평소에 벼락치기 하는 마음으로 공부를 한다. 

이렇게 할 수 있는 이유는 목표가 분명하기 때문이다. 
막연한 목표를 가지면 이렇게 긴장이 안되지만 분명하면 항상 긴장되고 집중을 잘 할 수 있다.

방송하면서 인생이 많이 바뀌었다. 
처음 주변 사람들은 말렸지만 결과적으로 보면 좋은 결과를 가져왔다.

나는 세상을 살면서 이런 생각을 해본다. 
사람은 해야 할 일과 하지 말아야 할 일이 있다. 사람이 해야할 일이란 남에게 해을 끼치는 일이 아니면 해도 되는 일이다 라고 생각한다. 그렇게 생각하면 세상에 해야 할 일이 참 많다.

인생에서 내가 할 수 있는 일들을 쌓아 가면 된다. 하다가 안되면 포기하더라도 아예 안하는 것보다는 낫다. 아예 하지 않으면 할 수 있는 일은 아무 것도 없다.

나의 징크스는 시험에 합격하려면 10번을 봐야 하는 것이다 .그래야 합격의 확신을 갖는다. 3~4번만 보면 불안하다. 그래서 그냥 뭐든지 기본적으로 10번을 본다. 몇 번 3~4번 책을 보고 시험을 본 적 있다. 역시 떨어졌다.


앞으로는 이렇게 해보자. 
첫째는 남보다 많이 노력하는 것이다. 
둘째는 어려운 목표일수록 확신을 가져보자. 
그러면 정말 되는 일이 훨씬 많다. 
셋째는 남보다 최소 3배는 해야한다고 생각하자.

직장에서 윗사람이 일을 시킬 때 남보다 더 많은 일을 시키고, 나한테만 어려운 일을 시키더라도 신나는 표정을 지어보자. 대부분의 사람, 아니 나의 경쟁자는 이럴 때 얼굴을 찌푸릴 것이다. 
그러나 내가 이기려면 그들 보다는 다른 모습이어야 한다. 

힘들더라도 괴로움을 추가해 보자.

남들에 비해 노력한 만큼의 결과가 나오지 않더라도 노력을 계속해야 한다. 3배의 노력만 한다면 4번째부터는 분명 가속도가 붙어 급속도로 차이가 날 것이다.

마지막으로 대인관계에 대해 강조하고 싶다. 세상을 살다보면 대인관계를 유지하는 것도 노력이다. 성공을 위해서는 나 혼자의 노력 외에 대인관계가 차지하는 비중이 높은 경우가 있다. 
어떤 상대를 만나든 최소 5분은 상대방을 위해 생각하는 시간으로 할애해 보자.

남과 똑같이 해서는 절대 노력했다고 할 수 없다.

 

프로그래밍 문제 접근법

알고리즘.데이터구조 2011. 4. 26. 13:32



인터뷰에서 가장 주된 부분을 차지하는 것은 기술면접, 코딩 => 어려운 문제 => 능력을 보여줄 수 있는 기회
답이 보이지 않는 상황에서 문제를 어떤 식으로 해결하는지를  살펴보기 위한 문제들도 있으니 긴장은 하지말자!


1. 절차


1.1 시나리오
코딩문제는 인터뷰어와 일대일로 진행하는 것이 일반적.  
종이와 펜을 코드를 작성하라고 한다거나, 전에 문제를 설명해보라고 할 수 있다.


1.2 문제
짧은 시간안에 설명까지 할수 있어야 하기 때문에, 변별력 있는 적당히 어려운 문제가 출제된다.
(실전에 직접 적용할 수 있는 코드를 만드는 문제가 나올 가능성은 희박함)
문제의 난이도는 대체로 점점 어려워지는 순서로 배치된다 


1.3 어떤 언어를 선택할 것인가?
일반 프로그래밍 또는 개발업무를 지원했다면  C#, Java, C++,  C 같은 주류 언어를 제대로 쓸수있는 정도면 됨
인터뷰를 하러 가기 전에 자신이 사용할 모든 언어의 사용법 및 문법을 제대로 숙지해야함
(C++ 프로그래밍을 마지막으로 건드려본지 몇년 지났다면 적당한  C++ 레퍼런스 가이드를 펼쳐 중요한 내용 체크!)


1.4 의사소통의 중요성 
자신이 사용할 언어를 가다듬고 가능하면 가장 좋은 코드를 만들자.
인터뷰어가 정말로 원하는 것은 지원자가 문제를 푸는 각 단계들을 어떻게 진행하는지 보는 것임
지속적으로 무슨일을 하고 있는지 설명하도록 하자



2. 문제해결
인터뷰 문제를 해결하는 조직적인 방법을 알아보면,

1) 문제를 확실히 이해한다
   - 문제를 이해하지 못했을 경우 주저하지 말고 인터뷰어에게 문제에 대한 질문을 해야함 
2) 일단 문제를 이해하고 나면 몇 가지 예를 들어본다 
  - 예를 시도하다보면 문제를 어떻게 풀어야 할지 감을 잘을 수도 있다.
3) 문제 풀이에 사용할 알고리즘에 초점을 맞춘다 
  - 보통 이 과정은 시간이 오래 걸리는 단계임. 부담을 가지지 말고, 인터뷰어와 대화를 통해 무엇을 하고 있는지를 보여줘야함 
4) 알고리즘과 구현 방법을 알아내고 나면 인터뷰어에게 풀이를 설명한다.
5) 코딩을 할 때도 뭘 하고 있는지 설명한다. 
   - 조용히 코드만 적는 방법은 그리 좋지 않다. 
6) 필요하다면 질문을 한다
7) 코드를 완성하고 나면 바로 몇 가지 예를 시도해 보고 맞는지 확인한다 
8) 모든 오류 및 특별 케이스, 특히 경계 조건을 확인한다 

=> 코드가 제대로 만들어졌다는 판단이 들면 인터뷰어가 코드에 대한 질문을 몇 가지 던질 것이다.
보통 이런 추가 질문에는 실행시간이나 또 다른 구현 방법, 복잡도 등에 초점을 맞춘다 


2.1 문제를 풀다가 막히는 경우
인터뷰어는 문제에 대한 답을 바로 알아낼 수 없는 경우에 지원자가 어떤 식으로 반응하는지를 살펴보고 싶어하기 마련.
문제를 풀다가 갑자기 막히게 됐을 때 포기하거나 좌절하는 것은 최악의 대응책이다. 
계속해서 흥미를 보이고 풀려고 시도하는 모습을 보이자

* 예를 다시 따져본다
 - 특정 예에서 일반적인 경우로 확장을 해보고 그로부터 풀이를 도출해보자.
* 다른 자료 구조를 사용해 시도해 본다.
* 언어에서 그리 많이 쓰이지 않는 기능 또는 고급 기능을 고려해 보자. 
 - 다른 자료구조, 언어ㄱ의 고급 기능이 문제 풀이의 핵심이 되는 경우도 있다. 


3. 풀이 분석

3.1 빅 오 분석법(big-O analysis) 
입력 값의 개수에 따라 알고리즘이 수행되는데 걸리는 시간을 바탕으로 알고리즘의 효율성을 평가하는 실행 시간 분석법
(입력의 개수 n이 매우 큰 경우의 실행시간인 점근적인 실행시간을 따지기 때문에 상수항은 무시함                                                    
(n이 매우 커질 때 가장 큰 항만 남기고 다른 항은 무시함)


3.2 빅 오 분석법을 적용하는 방법
1) 입력 값이 무엇인지 확인하고 어떤 것을  n으로 놓아야 할지 결정한다.
2) 알고리즘에서 수행해야 할 연산 횟수를 n의 식으로 표현한다 
3) 차수가 제일 높은 항만 남긴다
4) 모든 상수 인수를 없앤다 


때론 최선 케이스,  평균 케이스, 최악 케이스의 실행 시간을 따져봐야 하는 문제도 생김. 








 


'알고리즘.데이터구조' 카테고리의 다른 글

[알고리즘] 알고리즘 글 목록  (0) 2013.07.08
프로그래밍 문제 접근법  (0) 2011.04.26
원 위에 나열된 수 제거하기  (0) 2011.03.23
합병정렬(Merge Sort)  (0) 2011.03.23
HMAC-SHA1  (0) 2011.03.11
문제5 그래픽편집기  (0) 2011.02.18

BlackBerry Architecture

앱개발로그 2011. 4. 26. 01:54



아래 그림에서 보는 바와 같이 BlackBerry Device 상에는 BlackBerry Java, MDS Runtime, Browser 이렇게 3가지 타입의 Application이 존재하며, 이 애플리케이션들은 MDS Device 소프트웨어 위에서 구동된다.  BlackBerry JVM 위에서 실행되는 자바 애플리케이션을 개발하거나, MDS Runtime 기반의 애플리케이션을 개발할 수 있다. 
이외에도 MDS (Mobile Data System) Device 소프트웨어는 무선 네트웍을 통해 BlackBerry Enterprise Server 의 MDS
서비스와 통신하는 역할을 담당한다.





1. BlackBerry MDS(Mobile Data System) 란?
 MDS는 애플리케이션 개발을 위한 프레임웍으로, 기업용 애플리케이션들을 추가하고 관리하는데 사용된다.
BlackBerry Enterprise Server 컴포넌트 중 하나로, 보안과 무선연결, 관리 옵션들을 제공한다.
무선통신 애플리케이션을 좀더 쉽게 개발하고, 블랙베리 디바이스에 배포할 수 있는 방법을 제공한다.
기본 애플리케이션 및 시스템과 무선통신 애플리케이션 통합의 단순화를 위해 MDS는 표준에 근거한
프로토콜과 방법을 사용한다.

MDS의 구성요소들을 간략히 알아보자.

1.1 BlackBerry MDS Services
디바이스에 무선애플리케이션을 배포하고, 유지 및 관리하는데 사용된다. 아래와 같은 2가지 요소로 구성된다.

① BlackBerry MDS Integration Service

   MDS 애플리케이션과 웹서비스나 DB 연결을 사용하는 종단시스템 간의  통신에 사용된다.
   BlackBerry Enterprise Server 설치시 설치된다

② BlackBerry MDS Connection Service
   BlackBerry Browser와 Java 애플리케이션으로 부터의 웹컨텐츠 요청을 처리한다.


1.2 BlackBerry MDS 개발도구 : www.blackberry.com/developers 를 참고하자.


1.3 BlackBerry MDS device software
  BlackBerry Application 실행을 위한 MDS Device Software 들로 다음과 같은 것들이 있다.

① MDS Runtime 애플리케이션을 실행하기 위한  BlackBerry MDS Runtime.
② Java Application 을 실행하기 위한  BlackBerry APIs 와 Java ME 개발킷.
③ Browser Application을 실행하기 위한 BlackBerry Browser




2. 개발 가능한 BlackBerry Application 의 종류
위에서 언급한 각각의 BlackBerry Application에 대해 좀더 자세히 알아보자.
자바 애플리케이션은 BlackBerry Administration Service를 사용해서 Device에 설치되며,  MDS Runtime 애플리케이션과 Browser 애플리케이션은 BlackBerry MDS Application Console 통해 설치된다


2.1 BlackBerry Java Applications
블랙베리 자바 애플리케이션은  게임과 같은 단순한 것에서부터, 진보된 UI와 데이터 관리, 저장, 네트웍 통신을 위한 옵션을 가진 복잡한 애플리케이션까지 다양하다.  블랙베리 자바 애플리케이션은 Client-only 아키텍처 모델을 사용한다
(일반적으로 클라이언트가 애플리케이션 서버에 데이터를 요청하고 받는 것과 같이)
개발자들은 블랙베리 자바 애플리케이션을 이클립스상에서 JDE 플러그인 또는  third-party 툴을 사용하여 개발 할 수 있다. (www.blackberry.com/developers. 참고하자.)


2.2 BlackBerry MDS Runtime Applications
 MDS Runtime Applcation은 Visual Studio 또는 MDS Studio를 사용해서 생성한 경량, rich client 애플리케이션이다.
BES의 컴포넌트인 BlackBerry Integration Service를 통해, 기업시스템과 통신할 수 있으며, 웹서비스와 데이터베이스에
액세스 하는데 사용될 수 있는 폼 기반 애플리케이션이다.  웹서비스와 데이터베이스는 MDS Runtime Application에서
사용할 수 있는 데이터와 오퍼레이션을 포함하며, MDS Runtime Application으로부터 수신한 데이터를 처리한다


2.3 BlackBerry Browser Applications
Browser 애플리케이션은 BlackBerry Browser 상에 웹 컨텐츠를 보여줄 수 있는 웹기반의 단순한 애플리케이션이다.
개발자는 BlackBerry 템플릿과 표준 웹개발도구를 사용해서 Browser Application을 작성할 수 있다. MDS Integration
Service는 특정 웹주소에서 변경사항과 업데이트를 검사할 수 있는 Push Engine을 포함하고 있어, 개발자가 명시한 시간
간격으로 블랙베리 디바이스에 웹컨텐츠를 push 할 수 있다.


'앱개발로그' 카테고리의 다른 글

[Android] 안드로이드앱 개발 도전기  (2) 2013.03.31
2011년 스마트폰 사용자 통계  (0) 2012.11.12
BlackBerry Architecture  (0) 2011.04.26

[Ubuntu] DNS 설정

운영체제로그/Linux 2011. 4. 25. 15:35




Ubuntu/Debian 에서 DNS 주소를 설정하는 방법을 알아보자. 
/etc/resolv.conf 파일을 편집하여 DNS 서버의 아이피 주소를 변경할 수 있으며, 최대 3개의 DNS 주소를 설정할 수 있다.
파일에 명시한 순서대로 IP 주소를  알아내기 위해 해당 서버에 요청하는 것에 주의하자. 


1.  아래 명령으로 DNS 서버의 주소를 추가하자.
sudo vi /etc/resolv.conf

nameserver 208.67.222.222
nameserver 208.67.220.220
nameserver 202.51.5.52


2.   DNS가 올바로 응답을 하는지 확인하자!
$ host yahoo.com
$ nslookup google.com
$ ping nixcraft.in












'운영체제로그 > Linux' 카테고리의 다른 글

[Ubuntu] DNS 설정  (0) 2011.04.25
Wget  (0) 2011.04.25
리눅스 자격증  (0) 2011.04.09
리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard)  (0) 2011.03.09
su, sudo : 특정 사용자 권한으로 쉘/명령 실행  (0) 2011.03.08
cURL  (0) 2011.02.18

경제학의 10가지 기본원칙

학습로그/경제/경영 2011. 4. 25. 15:11



경제분야에 대해서는 영 문외한이라 조금씩 공부해보려고 "맨큐의 경제학" 이라는 책을 교재로 한 동영상 강의를 보았다. 
 경제학에서 기본이 되는  10가지 기본원칙이라 하는데 간단하게 정리해 보았다~ 자세한 설명은 생략한다. ;;
 
먼저  경제학이란?
경제적이라는 말이 뜻하는 것처럼 "주어진 자원"하에서 가장 효율적인 문제의 해결책을 과학적인 방법을 사용하여 연구하는 
학문이 경제학이라고 한다.

 "Economics is what Economists do" 란 말로 경제학을 정의하기도 한단다. 

No free lunch : 공짜 점심은 없다...


경제학의 기본이 되는 10 가지 기본원칙은 알아보자. 
  
1. 모든 선택에는 대가가 있다. 

대포와 버터의 선택
일정량의 자원 => 국방력 증가 vs 일반인의 소비수준 증가
대포를 만들 경우 무엇을 대가 지불해야하는가?
버터를 사람들에게 지급한다면, 대포를 포기해야함 
=> 모든 선택에 대가 없는 선택이란 없다. 

환경과 공장문제 
깨끗한 환경과 값싼 공산물들의 선택문제 
어느 하나를 선택함으로 다른 하나를 포기하게 되는 대가… => 선택의 대가가 있다.

효율성(Ef) 와 공평성(Equity) 의 문제
효율성: 더이상 개선의 여지가 보이지 않는 상황 => 효율적이라 표현. 
pareto 효율성 : 사회구성원중 적어도 한명을 불행하게 만들지 않고는 다른사람이 
 행복해질 수 없는 상태 

공평성: 돈을 벌수 있는 기회가 균등한 경우 (기회적인 측면)

뉴욕과 빈민가
뉴욕 : 좋은 환경에서 성공가능성이 크다.
빈민: 기회가 더 적다.                           
=> 불공평함 

공평성을 추구하되, 효율성 저해를 최소한으로…




2. 대가를 어떻게 측정할 것인가?
선택한 대한 대가 => 다른 선택안을 택했을 경우에 가치,비용 

기회비용 (Opportunity Cost) :  무엇을 위해 포기된 다른 대안 

대학진학 선택시…대가는?
대학등록금 교재 식비 차비  => 명시적으로 들어나는 비용도 중요하지만….
더 중요한 비용은…벤처기업 창업함으로써 얻을 수 있는 이익 

미국 농구선수…코비 브라이언트 …왜 대학 가지 않았나?
대학보다  NBA 선택시 이익이 훨씬 컸다…=> 경제적으로 아주 합리적임…



3. 합리적인 판단은 어떻게 이루어지는가? 한계적으로 이루어진다…한계적…?
MB(Marginal Benefit) : 편익, 추가적인 만족도 (텔레비전 시청)  <- 소비자
MC(Marginal Cost) : 한계비용. 포기해야하는 가치(기말고사 점수)  <- 생산자 

선택에 대한 손익을 비교…



4. 사람들은 경제적인 유인에 민감하게 반응한다. 
지하철 요금,,, 안전벨트…
안전벨트 법제화시 , 사고가 줄어드는가?
운전자 P = P(a, b) : 대형사고 가능 => a, (대형)죽을 가능성 줄어든다. 
                                                           => b, 죽을 가능성이 줄어서, 좀더 빨리다니자..가속의 가능성이 커짐 
                                                           => 교통사고 감소에 영향을 주지 않음 

보행자들의 위험성은 커졌음….
안전벨트 법제화가 되야 하는가??? 

------------------------------------------------------------------------------------------
1~4 미시경제학:개인, 기업, 정부가 합리적 선택과정에서 필요한 경제
------------------------------------------------------------------------------------------



5. 자유거래는 모든 사람을 이롭게 한다. 
물물 교환…사회적으로는 바뀐게 없다…한명은 이익…한명은 손해…
자유거래 => 둘다 만족이 되야 거래가 발생한다. 

한쪽 이익보면 다른쪽은 손해 : Zero-sum 게임  = > 고전파 경제학, 마르크스 경제학, 중상주의 경제학  
거래당사자 둘다 이익본다. : Non Zero-sum 게임 => 쓰미드와 리카르도 이후..요게 경제학의 기본원리
요즘에는 win-win 게임이라고 함. 




6. 일반적으로는 시장이 경제활동을 조직하는 좋은 수단이다.  
=> 용어 선택 조심스럽게 했음...
시장실패(Market failure)가 존재함…독점, 외부효과, 공공재 분야에 있어서…. 
수요-공급 곡선 




7. 경우에 따라 정부가 시장성과를 개선할 수 있다. 
시장실패가 발생하면 정부가 개입하는게 정당한게 아닌가?
그렇지 않다….왜냐면 정부실패가 존재하기 때문에…경우에 따라서…
정부실패가 없거나 크기가 적을 때만, 정부개입이 정당함…

----------------------------------------------------------------------------------------------
5, 6, 7 시장의 조직과 시장조직에 대한 평가 (시장의 조직과 정부의 역할)
----------------------------------------------------------------------------------------------



 
8. 한나라의 생활수준은 그 나라의 생산능력에 달려 있다 (거시 경제학)
output 수준…보통 GDP => 한나라의 후생 평가기준 
GDP 가 경제의 실업수준을 결정하기 때문…           => 자본의 생산성
노동자들의 생산성(Productivity)으로 측정하기도 함.  => 노동의 생산성 => 국민후생에 미치는 영향이 큼 

미국경제 호황 => 낮은 실업률, 낮은 물가  => 신성장 모형 
미국의 장기성장은 노동자의 생산성 증가에서 비롯…



9. 통화량이 지나치게 늘어나면 물가는 상승한다.
=> 통화주의자, 고전파의 기본원리
지나치게 늘어나지 않으면 상승하지 않을 수도 있다. 
통화량과 물가는 장기적으로는 1:1상관관계가 있다고 함



10. 단기적으로 실업과 물가상승은 상충관계(음의 상관관계)에 있다. 
필립스 곡선: 필립스가 실증적으로 관계도출 
실업과 물가상승은 인과관계가 존재하는가 아니면 단순히 상관관계만 존재한는가? 아직도 논의중...



-----------------------------------------
8, 9, 10 거시 경제학의 기초원리 
-----------------------------------------

* 미시경제학에서 합리적인 선택
* 시장의 조직과 정부의 개입
* 거시경제학에서 합리적인 정책 결정







 

'학습로그 > 경제/경영' 카테고리의 다른 글

경제학의 10가지 기본원칙  (0) 2011.04.25

Wget

운영체제로그/Linux 2011. 4. 25. 14:29



윈도우에서 사용할 수 있는 curl과 Wget 같은 파일다운로드 유틸리티를 검색하다가  윈도우용 Wget 을 찾았다.
wget.exe 파일을 다운 받아서 PATH 를 잡아주거나,  이미 PATH가 설정된 폴더(예를 들면 c:\Windows\Sytstem32)에
복사해놓으면 터미널 창에서 유닉스와 동일한 명령으로 사용할 수 있다



1. Wget  소개  
 GNU 공식 사이트 Wget 페이지에서는 wget을 다음과 같이 소개하고 있다. 

Wget은 가장 널리 사용되는 프로토콜들인 HTTP, HTTPS, FTP 을 사용해서 파일을 내려받는 free 소프트웨어로,
GUI 없이도,   터미널에서 스크립트나 cron 과 함께 쉽게 되어질 수 있다. 

* REST와 RANGE를 사용해서 취소된 다운로드를 재개할 수 있다. 
* 파일이름에 와일드카드를 사용할 수 있고, 재귀적으로 파일을 다운할 수 있다.
* 옵션을 주면, 문서의 상대경로를 절대경로로 변경해주어  다운로드한  문서는 로컬상에서 서로 간에 링크가 된다.
* Windows 뿐만 아니라 대다수 Unix 유사 계열의 운영체제에서 실행된다.
* HTTP 프록시와 HTTP 쿠키를 지원한다. 
* persistent HTTP 커넥션을 지원한다. 
* 비동기적, 백그라운드 연산을 지원한다. 
* 미러링시에 도큐먼트를 다시 다운받을 필요가 있는지 결정하기 위해 로컬 파일 타임스탬프를 사용한다. 
* GNU Wget 은 GNU General Public License 하에 배포된다. 




2. Windows 용 Wget 설치 
유닉스와 리눅스에서는 거의 대부분 wget 유틸리티가 설치되어 있으며, 패키지 관리툴을 통해 쉽게 설치할 수 있다.
여기서는 윈도우에 설치하는 방법만 소개한다.

1) Wget for Windows <= 요기에서 윈도우용 wget 바이너리를 다운받는다. 

2) Path 환경변수에 wget.exe 파일을 저장한 폴더 경로를 지정한다.

 
 


  아니면 이미 path 경로로 설정되어 있는 c:\windows\system32 폴더에 wget.exe 파일을 복사한다.


 


3) 이제 터미널 창을 열고 wget 명령을 사용하자~~








3. Wget 사용법 
 명령의 형태는 다음과 같다. 
wget <웹페이지 주소> [-p] [-k] [-r]
단일 페이지 또는 파일만을 다운받으려면 어떤 옵션도 주지 않고 주소만을 인자로 전달한다. 

-p  옵션은 저장되는 html 에 필요한 이미지를 모두 내려받게 한다. 
-k  옵션은 링크를 저장되는 파일 위치로 변환한다.
-r   옵션은 연결된 링크를 모두 다운로드 한다.

사이트 전체를 내려받을 수도 있으며,  백그라운드에서 다운받기(-b), 디버깅 메시지(-d),  헤더 저장하기(--save-headers) 등
다양한 옵션들이 제공된다. wget --help 명령을 사용하여 필요한 옵션들을 살펴보고  사용하자. 





'운영체제로그 > Linux' 카테고리의 다른 글

[Ubuntu] DNS 설정  (0) 2011.04.25
Wget  (0) 2011.04.25
리눅스 자격증  (0) 2011.04.09
리눅스 파일시스템 계층 표준(Filesystem Hierarchy Standard)  (0) 2011.03.09
su, sudo : 특정 사용자 권한으로 쉘/명령 실행  (0) 2011.03.08
cURL  (0) 2011.02.18