Cpp
2009.06.16 17:38

unix_timestamp 구현 in C ?

조회 수 50905 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

C로 1970년 1월 1일이후 흐른 시간을 초로 변환해보자.

그리고, unix timestamp를 일시로 변환해보자.

중간에 summer time(daylight-saving) 제가 1987, 1988년에 한번씩 있었다.

앞으로 서머타임이 발생하면 is_daylight_saving을 수정해 줘야한다.

time 라이브러리를 이용하면 쉽게 구할 수 있지만 라이브러리가 없으면 직접 구현해야지머~

#include <stdio.h>
#include <stdlib.h>

#define SECONDS_PER_1NORMALYEAR 31536000ul
#define SECONDS_PER_1DAY    86400UL
// prototypes
unsigned char gl_get_last_day(unsigned int, unsigned char);
unsigned int gl_get_days(unsigned int, char, char);
unsigned char gl_is_leapyear(int);
long GetTimestamp(unsigned int year, char month, char day, char hour, char min, char sec, char offset);
long GetDatetime(long timestamp, char offset, unsigned int *pyear, char *pmonth, char *pday, char *phour, char *pmin, char *psec);

/*--------------------------------------------------------
@function: gl_get_last_day
@description
    인자로 넘겨받은 년도(uiYear)와 월(ucMonth)를 이용하여
    달의 마지막 일수를 구하는 함수이다.
@arguments:
    - uiYear: 년도 [1, N)
    - ucMonth: 월  [1, 12]
@return value: 마지막 일수
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-06-25, 최초 생성
--------------------------------------------------------*/
unsigned char gl_get_last_day(unsigned int uiYear, unsigned char ucMonth)
{
    switch(ucMonth) {
        case 2: // 2월
            if( (uiYear % 4) == 0 ) {        // 4로 나누어 떨어지는 해는 윤년임.
                if(uiYear % 100 == 0) {    // 그중에서 100으로 나누어 떨어지는 해는 평년임
                    if(uiYear % 400 == 0) return 29; // 그중에서 400으로 나누어 떨어지는 해는 윤년임.
                    return 28; // 평년
                }
                return 29;    // 윤년
            }
            return 28;    // else 평년
        case 4: case 6: case 9: case 11: // 4, 6, 9, 11월
            return 30; // 30일
    }

    return 31; // 그외 31일
}

/*--------------------------------------------------------
@function: gl_get_days
@description
    년, 월, 일을 입력으로 그 해의 1월 1일 부터
    그 해의 월,일까지의 일수를 구하는 함수 이다.
@arguments:
@return value: 마지막 일수
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-06-25, 최초 생성
--------------------------------------------------------*/
unsigned int gl_get_days(unsigned int year, char month, char day)
{
    unsigned int days;
    int i;
    days = 0;
    for(i=1; i<month; i++) {
        days += gl_get_last_day(year, i);
    }
    days += day;
    return days;
}

/*--------------------------------------------------------
@function: gl_is_leapyear
@description
    인자의 년도가 윤년인지 판단하는 함수이다.
@arguments:
@return value:
    1: 윤년임
    0: 평년임
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-06-26, 최초 생성
--------------------------------------------------------*/
unsigned char gl_is_leapyear(int year)
{
        // 년도가 4로 나누어 지고 100으로 나누어 지지 않거나,
        // 400으로 나누어 지면 윤년임.
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

/*--------------------------------------------------------
@function: get_seconds
@description
    - year, month, day, hour, min, sec를 인자로함.
    - 1년 1월 1일부터 year년 month월 day일 hour시 min분 sec초까지
      흐른 시간을 초단위로 구한다.
@arguments:
    year: 년도[1,65535], month: 월[1, 12], day: 일[1, 31]
    hour: 시[0, 23], min: 분[0, 59], sec: 초[0, 59]
@return value: 
    초단위로 환산한 값
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-06-25, 최초 생성
--------------------------------------------------------*/
static unsigned long get_seconds(unsigned int year, char month, char day, char hour, char min, char sec)
{
    unsigned int leap_year_count;
    unsigned long seconds;

    // 윤년의 개수를 구한다.
    leap_year_count = (year-1) / 4; // 윤년 개수
    leap_year_count -= ((year-1) / 100); // 100으로 나누어 지지 않는 것
    leap_year_count += ((year-1) / 400); // 400으로 나누어 지는것

    // 년도에서 윤년의 개수를 빼어 초로 환산한다.
    seconds = (year - 1 - leap_year_count)*365*SECONDS_PER_1DAY;

    // 윤년만 초로 환산하여 위에서 계산한 초를 더해준다.
    seconds += (leap_year_count)*366*SECONDS_PER_1DAY;

    // year년의 month월, day일까지 일수를 구하여 초로 환산하여 이전값에 더해준다.
    seconds += (gl_get_days(year, month, day)-1)*SECONDS_PER_1DAY;

    // hour시 min분 sec초를 초로 환산하여 더해준다.
    seconds += hour*3600 + min*60 + sec;
    return seconds;
}

/*--------------------------------------------------------
@function: is_daylight_saving
@description
    * 1987-05-10 00:00:00 ~ 1988-10-10 22:59:59
    * 1988-05-08 00:00:00 ~ 1988-10-08 22:59:59
@arguments:
@return value: 
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    * 2009-07-01 최초 생성
--------------------------------------------------------*/
static unsigned char is_daylight_saving(long timestamp)
{
  // 1987-05-10 00:00:00 ~ 1988-10-10 22:55:59
  if(timestamp >= 547570800l && timestamp < 560872800l) {
    return 1;
  }
  // 1988-05-08 00:00:00 ~ 1988-10-08 22:59:59
  if(timestamp >= 579020400l && timestamp < 592322400l) {
    return 1;
  }

  return 0;
}

/*--------------------------------------------------------
@function: GetTimestamp
@description
    1970년 1월 1일 0시 0분 0초 부터 흐른 시간을 초로 환산한 값을 구한다.
@arguments:
    year: 년도[1,65535], month: 월[1, 12], day: 일[1, 31]
    hour: 시[0, 23], min: 분[0, 59], sec: 초[0, 59]
    offset: UTC 시간과 차이 (한국은 +9 임)
@return value: 
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-06-25, 최초 생성
--------------------------------------------------------*/
long GetTimestamp(unsigned int year, char month, char day, char hour, char min, char sec, char offset)
{
    return get_seconds(year, month, day, hour, min, sec) - get_seconds(1970, 1, 1, 0, 0, 0) - offset*3600;
}

/*--------------------------------------------------------
@function: GetDateTime
@description
    unix timestamp를 넘겨받아 년,월,일,시,분,초를 구한다.
@arguments:
    timestamp: 지정 타임스템프
    offset: UTC 시간과 차이 (한국은 +9 임)
    pyear: 년도를 저장할 포인터
    pmonth: 월을 저정할 포인터
    pday: 일을 저장할 포인터
    phour: 시각을 저장할 포인터
    pmin: 분을 저정할 포인터
    psec: 초를 저장할 포인터
@return value: 
@written by Jeong-soo, Kim (wittgens@gmail.com)
@history
    - 2009-07-01, 최초 생성
--------------------------------------------------------*/
long GetDatetime(long timestamp, char offset, unsigned int *pyear, char *pmonth, char *pday, char *phour, char *pmin, char *psec)
{
    int i;
    int year;
    long days;
    long secs;
    char month, day, hour, min, sec;
    int leap_year_count;

    if(is_daylight_saving(timestamp)) {
        timestamp += 3600;
    }


    timestamp += offset*3600L; // UTC 시간 + offset hour

    // 현재 년도를 구한다. (1년을 365일이라고 간주하여)
    year = 1970 + timestamp / SECONDS_PER_1NORMALYEAR;

    // 현재년도의 윤년의 개수를 구한다.
    leap_year_count = year / 4;
    leap_year_count -= year / 100;
    leap_year_count += year / 400;

    // 1970년의 윤년의 개수를 구하여 빼준다.
    leap_year_count -= (1970 / 4) - (1970/100) + (1970/400);

    // 현재년도 1월 1일 부터 현재까지의 일수를 구한다.
    days = (timestamp % SECONDS_PER_1NORMALYEAR) / SECONDS_PER_1DAY + 1; // 1일부터 시작

    days -= leap_year_count;
    if(gl_is_leapyear(year)) days ++;
    if(days <= 0) {
        year--;
        i=12;
    }
    else {
        for(i=1; i<=12; i++) {
            days -= gl_get_last_day(year, i);
            if(days <= 0) break;
        }
    }
    month = i; // 1월 부터 시작
    day = gl_get_last_day(year, i) + days;

    secs = (timestamp % SECONDS_PER_1NORMALYEAR) % SECONDS_PER_1DAY;
    hour = secs / 3600;
    min = (secs % 3600) / 60;
    sec = (secs % 3600) % 60;

    *pyear = year;
    *pmonth = month;
    *pday = day;
    *phour = hour;
    *pmin = min;
    *psec = sec;
}

int main(int argc, char** argv)
{
  if(argc < 3) {
    printf("Usage 1: %s 0 year month day hour minute seconds\n", argv[0]);
    printf("Usage 2: %s 1 timestamp\n", argv[0]);
    exit(-1);
  }
  if(atoi(argv[1]) == 0) {
    if(argc != 8) exit(-2);
    printf("%ld\n", GetTimestamp(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), atoi(argv[7]), 9));
  }
  else {
    unsigned int year;
    char month, day, hour, min, sec;
    if(argc != 3) exit(-3);
    GetDatetime(atol(argv[2]), 9, &year, &month, &day, &hour, &min, &sec);
    printf("%04d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, min, sec);
  }
  return 0;
}


크리에이티브 커먼즈 코리아 저작자표시 Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락/3.0에 따라 이용하실 수 있습니다


TAG •

조회 수 12768 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

6월 18일경 아침까지 잘돌아가던 내 하드가

저녁에 퇴근해서 켜보니 부팅되지 않았다.

머가 잘못된 건지 BIOS setup에 들어가서 확인해보았더니, DVD도 인식이 되지 않았다.

둘다 고장났나~ 아님 메인보드가 나갔을까...

일단 전원을 내리고 하드디스크 SATA2 케이블을 뽑고 다시 전원을 켜고 BIOS 설정에 들어가서 확인해보았다.

다행이 DVD는 잡히네~

이런~ 그럼 하드디스크가 나갔나보네~ 이런이런 구입한지 5개월도 안되었는데 벌써 나가버리다니..

제조사는 시xxx 였는데, A/S도 그렇고 앞으론 국내제품을 구입해서 써야겠다라고 맘먹었다.

A/S 하는데 시간이 좀 걸릴 것 같아서 1 테라바이트 용량의 하드를 구입했다.

어제 하드가 도착했으며, 기존하드는 친구한테 A/S 부탁하고~

움트트~

이건 얼마나 갈까나~  emoticon


Cpp
2009.06.29 09:21

PuTTY

조회 수 21939 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form

 애용하고 있는 A Free Telnet/SSH Client 6.0 프로그램

폰트 선택시 FIXED_SYS 제거

파일: WINCTRLS.C

아래 코드를

 cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST |
        CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;

아래와 같이 변경

 cf.Flags = CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;


메뉴에 EUC-KR, UTF-8 추가함.

파일: WINDOWS.C

#define IDM_RECONF 0x0050 아래에 정의 추가

#define IDM_TRANS_UTF8        0x2010
#define IDM_TRANS_EUC_KR    0x2020

AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings..."); 아래 코드 추가

AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings...");
AppendMenu(m, MF_ENABLED, IDM_TRANS_UTF8, "To &UTF-8");

case IDM_COPYALL: 위에 아래 코드 추가

      case IDM_TRANS_UTF8:
          strcpy(cfg.line_codepage, "UTF-8");
          term_reconfig(term, &cfg);
          reset_window(2);
          break;
      case IDM_TRANS_EUC_KR:  
          strcpy(cfg.line_codepage, "Use font encoding");
          term_reconfig(term, &cfg);
          reset_window(2);
          break; 




사이트: http://www.chiark.greenend.org.uk/~sgtatham/putty/

Ruby
2009.07.01 23:36

Rails - Getting started

조회 수 21120 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

 

Rails 가 뭐지? 

Rails 는 루비(Ruby) 언어로 작성된 웹(web) 개발 프레임워크이다.
타 언어와 프레임워크에 비해서 적은 코드로 많은 것을 할 수 있다.
루비의 철학은 아래와 같다.
 * DRY - "Don't Repeat Yourself" : 같은 코드를 반복하여 작성하지 마라
 * Convention Over Configuration : 뭘하기를 원하며 어떻게 할 것인지 대해 가정한다. 수많은 설정보다는 관습을 중요시한다는 의미인듯.
 * REST is best pattern for web application : 웹응용을 위한 최선의 패턴이다. 자원과 표준 HTTP를 통해서 응용을 체계화하는 것은 가장 빠른 길이다.

 

MVC 구조

Rails는 Model, View, Controller를 통해서 체계화된다. 이를 MVC 라한다.
* UI와 비지니스 로직(business logic)의 분리
* 코드 유지가 용이하다.
* 유지보수가 용이하다.
  - Model: 데이터를 나타냄
  - View: UI
  - Controller: Model과 View를 연결함. 웹 브라우져의 요청을 처리한다.

 

Rails 구성요소

* Action Controller: 컨트롤러들을 관리함, 레일스 응용에 요청이 오면 처리함. 세션관리, 템플릿 렌더링, 리다이렉션
* Action View: 뷰. HTML, XML 출력 둘다 생성가능. nested, partial 템플릿, 내장 AJAX
* Active Record: 모델의 기본이됨. DB 독립성. 기본 CRUD. 향상된 찾기 기능. 연관모델.
* Action Mailer: e-mail 서비스
* Active Resource: 비지니스 객체와 REST한 웹서비스간에 연결관리. 웹기반 자원과 로컬 객체를 매핑함.
* Railties: 타 rails 응용들과 연결이 용이
* Active Support: 유용한 레일스 라이브러리.

 

새로운 Rails 프로젝트 만들기

Rails 설치하기

$ gem install rails 

 

블로그(Blog) 응용 만들기

아래는 DB를 mysql을 사용함을 나타낸다. -d 옵션으로 사용할 DB를 지정해주면된다.

$ rails blog -d mysql

 실행하고 나면 blog 라는 디렉토리가 생성된다.

$ cd blog 

 디렉토리별로 간단히 설명하면,

파일/디렉토리

목적

README

응용에 대한 간단한 조작 매뉴얼임. 응용이 무엇을 하는지, 셋업은 어떻게 하는지 적어라.

Rakefile

일괄처리되는 작업들을 포함되어 있다.

app/

컨트롤러, 모델, 뷰

config/

어플리케이션의 실행시 규칙, 경로(routes), 데이터베이스 등

db/

현재 DB 구조. DB 마이그레이션.

doc/

문서들

lib/

어플리케이션의 확장모듈들

log/

어플리케이션 로그 파일들

public/

이미지, 자바스크립트, 스타일시트, 기타 정적 파일들

script/

반복적인 작업을 하는 스크립트들. 벤치마킹, 플러그인 설치, 콘솔, 웹서버...

test/

단위 테스트, 설치물, 기타 테스트 툴.

tmp/

임시파일들

vendor/

third-party 코드

 

TAG •

Links
2009.10.08 14:58

Javascripts

조회 수 11137 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

Board Pagination Prev 1 ... 19 20 21 22 23 24 25 26 27 28 ... 39 Next
/ 39