요약


JDK에 포함된 jarsigner를 이용해 jar파일 또는 안드로이드 apk파일에 서명하는 경우 발생하는 타임 스탬프관련 경고 메시지를 없애는 방법



  증상 및 원인


jarsigner를 이용해 리패키징한 안드로이드 apk파일에 서명하던 도중 아래와 같은 경고 메시지를 발견했다. 서명은 정상적으로 되었기 때문에 무시해도 상관없으나 왠지 찜찜하여 원인과 해결 방법을 알아보았다.


Warning:

No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date <yyyy-mm-dd> or after future revocation date.


< 발생한 경고 메시지 >




서명 인증서가 만료되면 배포 된 파일을 다시 서명해야 하기 때문에 이런한 문제를 해결하기 위해 재서명이 필요없는 URL 기반 인증 방식인 타임 스탬프를 이용한 서명을 권장하는 것으로 확인된다. 관련 Oracle 문서에는 J2SE 5.0부터 추가 된 기능이라고 나와있으나 기존에 사용하던 JDK 버전(1.7021)에서는 경고 없이 서명이 되었던걸로 보아 이후 버전에서 발생하는 것으로 보인다.



  해결 방법


서명 시, -tsa 옵션과 함께 인증 기관 URL을 입력해주면 경고 메시지 없이 서명이 가능하다.


-tsa http://timestamp.digicert.com


< Timestamp를 이용한 서명 결과 >



  관련 포스팅




 

 

  요약

 

다수의 스레드를 사용한 C/C++ 프로그램에서 clock() 함수를 이용했을 때 발생하는 문제점과 clock_gettime() 함수를 이용하여 수행 시간을 정확하게 측정할 수 있는 방법을 설명한다.

 

 

  clock() 함수를 이용한 시간 측정 방법과 그 문제점

 

일반적으로 C/C++ 프로그래밍 시, <time.h>에 포함된 clock() 함수를 이용하여 아래와 같은 방식으로 수행 시간을 측정한다.

 

clock_t begin, end;

 

begin = clock(); 

 

/ *

 

수행 시간 측정을 원하는 작업

 

* /

 

end = clock();

 

cout << ((end - begin) / CLOCKS_PER_SEC) << endl;

 

이 방법은 싱글스레드 프로그램에서는 정상적으로 동작하나 멀티스레드 프로그램에서 사용할 경우, 시간 측정이 올바르게 되지 않는 것을 확인할 수 있다. 이는 clock() 함수가 단순히 프로세스에 의해 사용 된 클럭 수를 리턴해주기 때문에 하나의 스레드에서 위의 코드를 이용해 시간을 측정하는 동안 다른 스레드의 동작에 의해 클럭 값이 증가하게 되기 때문이다.


 


 

  clock_gettime() 함수를 이용한 올바른 시간 측정 방법

 

정확한 수행 시간을 측정하기 위해서는 <time.h>에 포함된 clock_gettime() 함수를 이용해야 한다. clock_gettime() 함수는 시간을 측정할 시계의 타입을 정의하는 clockid_ttimespec이라는 구조체를 인자로 갖는다.

  • clockid_t : 시계의 타입을 나타내는 인자로써, POSIX에서는 기본적으로 2가지 타입을 제공한다.

  • CLOCK_REALTIME

    시스템 전역에서 사용되는 실제 시간 (Epoch 기준)

    CLOCK_MONOTONIC

    특정 시점 이후로 흐른 시간 (ex. 부팅 후 시간)

  • timespec : 초와 나노초를 멤버로 갖는 구조체. <time.h>에 정의되어 있음.
struct timespec {
        time_t   tv_sec;        /* seconds */
        long     tv_nsec;       /* nanoseconds */
};

 

clock_gettime() 함수는 clockid_t에 입력한 시계를 이용하여 시간을 측정하므로 프로세스에서 사용한 클럭 수를 세는 clock() 함수보다 정확한 수행 시간 측정이 가능하다. 사용 방법은 다음과 같다. clockid_t의 인자로 CLOCK_MONOTONIC 대신 CLOCK_REALTIME을 사용해도 되지만 CLOCK_REALTIME 사용 시, 시간 측정 중에 시스템 시간이 변경될 경우 측정값이 변한다는 문제점이 있다.

 

struct timespec begin, end ;

 

clock_gettime(CLOCK_MONOTONIC, &begin);

 

/ *

 

수행 시간 측정을 원하는 작업

 

* /

 

clock_gettime(CLOCK_MONOTONIC, &end);

 

cout << (end.tv_sec - begin.tv_sec) + (end.tv_nsec - begin.tv_nsec) / 1000000000.0 << endl;

 

 

 

 

 

  요약

 

리눅스에서 홈 디렉토리 아래에 위치하는 8개의 사용자 폴더(Desktop, Documents, Downloads, Music, Pictures, Public, Templates, Videos)의 기본 경로를 변경하는 방법에 대해 설명한다.

 

 

  변경 방법

 

디렉토리의 경로는 user-dirs.dirs 라는 파일에 저장되어 있다. nano, gedit 등의 에디터를 통해 아래의 파일을 열어준다.

 

~/.config/user-dirs.dirs

 

파일을 열어보면 기본 설정은 아래와 같다. 여기서 빨간색으로 밑줄 친 부분을 원하는 경로로 바꿔준 뒤 재부팅 또는 재로그인을 해주면 경로가 변경된 것을 확인할 수 있다.

 

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures" 
XDG_VIDEOS_DIR="$HOME/Videos"


 


 

  예시

 

user-dirs.dirs 파일을 열어 문서 디렉토리를 '~/Desktop/문서'로 변경한 결과이다.

 

 

기본 문서 폴더의 경로가 '~/Documents'에서 '~/Desktop/문서'로 변경된 것을 확인할 수 있다.

 

 

 

+ Recent posts