'개발'에 해당되는 글 73건

  1. 2024.01.02 libJpeg 에도 버전이 있나?
  2. 2017.09.12 [FFMPEG] Command 사용법 및 예제 10
  3. 2017.05.17 Google AAD - 구글에서 인증한 안드로이드 개발 자격증
  4. 2013.06.19 [graphic] RGB565와 RGBA8888에 대해서 1
  5. 2013.06.14 libjpeg-turbo 에 대해서 알아 보자
  6. 2013.06.03 오픈소스 이용시 코드 공개 여부
  7. 2013.05.10 [crontab] 특정 시간마다 실행하기
  8. 2013.05.06 [eclipse] working set 을 이용한 다수의 project 관리
  9. 2013.03.08 [Android] Eclipse Juno에서 xml 파일 전환시 느릴때 & ini 튜닝정보
  10. 2012.09.14 [linux] vi편집기에 붙일때 앞에 tab이 붙는경우

libJpeg 에도 버전이 있나?

개발 2024. 1. 2. 21:04

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

우리가 흔하게 쓰고 있는 libjpeg 라이브러리가 있습니다. 이미지를 jpeg 형식으로 인코딩하거나 디코딩 해주는 라이브러리 입니다. 

요기의 홈페이지 주소는 http://ijg.org/ 입니다. 

방문해보면 아래처럼 정말 단순한 화면만 표시되는데요.. ( 아직도 요런 페이지가 있다니 ㅋㅋ ) 

Independent JPEG Group

흠.. 여기서 도대체 버전별 정보를 어디서 찾으라는 거냐? ㅋ 

원하는 정보를 쉽게 찾을수 없어서 wikipia를 방문해보면 아래처럼 잘 정리되어 있습니다.  ( https://en.wikipedia.org/wiki/Libjpeg

VersionReleasedNew featuresITU T.81 JPEG CompatibleProprietary non-compatible extensions

1 1991
  • First release
  • Baseline or optimized JPEG
  • GIF or PPM output
2 1991
  • Internal improvements
  • More input/output formats
3 1992 Internal and image quality improvements
4 1992 Internal and speed improvements
4a 1993-02-18  
5 1994-09-24 Internal improvements and revised API
5a 1994-12-07  
5b 1995-03-15  
6 1995-08-02
  • Progressive JPEG
  • jpegtran (convert between baseline and progressive)
6a 1996-02-07  
6b 1998-03-27
  • jpegtran extended to lossless rotate
(used by libjpeg-turbo and mozjpeg)
7 2009-06-27
  • jpegtran extended to lossless crop
  • T.851 Arithmetic Coding[19]
  • Scaled DCT[20]
8 2010-01-10
  • SmartScale extension (ITU rejected)[21][22]
  • jpegtran extended to use SmartScale
  • Internal fixes
8a 2010-02-28 RGBA
8b 2010-05-16 Memory corruption & build fixes
8c 2011-01-16 Option for selecting DCT block size (SmartScale)
8d 2012-01-15 RGB JPEG (no color transform to YCbCr)
9 2013-01-13
  • YCoCg color
  • Lossless compression (1x1 DCT)[23]
9a 2014-01-19
  • "JFIFv2" scRGB Wide color gamut (standard unknown)
  • 8-12 bit color (standardJPEG)
9b 2016-01-17 Computation improvements
9c 2018-01-14 jpegtran -wipe
9d 2020-01-12
  • Code cleanup
  • Huffman optimization
  • x64 support (MSVC)
  • jpegtran -drop
9e 2022-01-16 ARM and ARM64 support (MSVC)

Legend:

Old version, not maintained Older version, still maintained Current stable version

여기서 주의깊게 봐야할 버전이 바로바로 6b ( v.6.2 ) 버전 이다. 

1998년에 나온 버전으로 아주 오래되었지만, 아직도 유지가 되는 버전인데.. 

그 이유는 libjpeg-turbo 라는 프로젝트와 mozjpeg 라는 프로젝트에서 해당 버전의 libjpeg를 기반으로 개발되었기 때문이다. 

그리고 6b 버전이후 거의 10년만에 업데이트된 버던7에서는 무손실 jpegtran 기능과 무슨 arithmetic coding 적용과 scaled DCT 으로 성능개선이 된것이 전부이다. 

이후 버전 8 부터 버그랑 몇가지 기능들이 추가되기는 했지만, 하위버전 호환성을 유지하면서 jpeg에 새롭고 혁신적인 것이 추가되기는 어려운 상황으로 보인다. web 환경에 특화되어 있는 google에서 발표한 webP 형식처럼 새로운 술은 새부대가 아니고서는 혁신을 담아내기는 어려울듯 싶다. 

이후 버전9 에서는 YCoCg 칼라스페이스 추가와 광색역(wide color gamut) 그리고 계산성능향상 ( computation improvements ) 등등의 변화가 추가되었다. 

최신버전인 9e 버전에서는 msvc 빌드환경에서 arm / arm64 빌드가 지원된다고 한다. 

추가로 6b 에서 파생되었다는 2가지 프로젝트에 대해서 간단하게 알고만 넘어가보자. 

libjpeg-turbo

  • libjpeg-turbo는 SIMD 지침을 사용하여 기본 JPEG 인코딩 및 디코딩을 가속화하는 libjpeg의 포크입니다.
  • 일반적으로 libjpeg 보다 2~4배정도 인코딩 속도가 빠릅니다. ( 디코딩 속도는 대략 1.5배정도 ) 
  • 현재 널리 사용되는 Linux 배포판(Fedora, Debian, Mageia, openSUSE 등), Mozilla 및 Chrome을 포함하여 많은 프로젝트에서 libjpeg 대신 libjpeg-turbo를 사용하고 있습니다.
  • libjpeg-turbo는 SmartScale을 지원하지 않기로 결정했습니다. 
  • 왜냐하면 SmartScale은 ITU-T 표준이 아니고 자체 연구에서 이 기능(및 DCT 스케일링)이 비효율적이라고 판단했기 때문libjpeg v7, v8 및 v9는 이전 릴리스와의 ABI 호환성을 중단했습니다.

mozjpeg

  • mozjpeg는 Josh Aas와 Mozilla Research의 다른 사람들이 수행한 libjpeg-turbo의 포크입니다. 
  • 이미지 품질을 유지하면서 코딩 효율성 향상을 통해 파일 크기(약 10%)를 줄여서 저장할수 있게 합니다. 
  • 저장된 파일 크기가 작다는 것은 web 환경에서 전송 시간을 줄일수 있어서  웹페이지 로딩 시간을 단축할 수 있습니다.
  • 이를 위해 JPEG 표준과의 완전한 호환성을 유지하고, 인코딩에 많은 시간이 소요되는 방식입니다. 

 

 

 

 

 



:

[FFMPEG] Command 사용법 및 예제

개발 2017. 9. 12. 14:35

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ffmpeg는 오픈소스이면서, 비디오/오디오 관련한 많은 기능을 제공하고 있으며, 성능또한 상당히 좋은 편이다. 

ffmpeg는 크게 4가지로 분류하면 다음과 같다. 


1. ffmpeg : command line 도구 ( 동영상 크기및 코덱을 변경하경 할수 있다. ) 

2. ffserver : 동영상 streaming을 위한 서버 

3. ffplay : SDL 이라는 오픈소스 기반으로 player를 해주는 컴포넌트 

4. ffprobe : 간단한 멀티미디어(동영상) 분석도구 


이중에서 가장 기본이되고 방대한것이 바로 ffmpeg command line 인데, 

이걸로 무엇을 할 수 있는지 알아 보자. 


[사전준비] 

각 OS별로 컴파일된 binary를 사용해서 command를 연습해 볼 수 있다. 

https://ffmpeg.org/download.html 에서 OS별로 선택해서 다운받으면 된다. source code를 다운받지 말고 빌드된 binary를 받으면 된다. 현재 최신버전은 3.3.3 입니다. 



[기본 cmd 구조] 

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...


 * global_options 

  - 입력, 출력 파일에 모두 적용 되는 옵션 

  -y, -n 처럼 강제로 output을 덥어 쓸지 정하는 옵션이 있는데, 몇가지 없음. 


 * input_file_options & input_url  

  - input에 사용되는 옵션으로 -i 앞에 위치한다. 

  - input이 여러개가 사용될 경우, 각 옵션들은 각각 input에 적용된다. 


 * output_file_options & output_url 

  - output 파일이름과 옵션들. 

  - 출력을 많이 변경하므로 여기에 옵션이 많이 사용된다. 


 * 참고 : 기본문서 

  - https://ffmpeg.org/ffmpeg.html : 간단문서 

  - https://ffmpeg.org/ffmpeg-all.html : 자세한 문서 

  - https://trac.ffmpeg.org/wiki : ffmpeg 위키문서 (버그, 가이드, 기타등등 ) 



case study


 * mp4 파일에서 비디오 제거하기 ( = audio 추출하기 ) 

ffmpeg -i input.mp4 -vn output.mp4 

 - 입력파일로 input.mp4 파일을 지정 

 -an : disable audio recording

 이렇게 하면 input파일에서 오디오 track을  decode 하고, 다시 encode 하는 과정을 거치게 된다. 그래서 인지 audio bitrate가 127KBit/s 에서 71KBit/s으로 변경되었다. 오디오 트랙을 그대로 보존하고 싶으면 아래처럼 옵션을 추가하면 된다. 추가로 encode/decode 과정이 없어서 속도가 더 빠르게 된다. 

ffmpeg -i input.mp4 -acodec copy -vn output.mp4

- acodec copy : audio를 디코딩/인코딩 하지 않고 그냥 copy 하라는 의미 

ffmpeg 명령어중에 같은 의미이지만 alias로 여러가지 방식으로 표현이 가능한데, -acodec copy은 다음과 같이 여러가지 방식으로 표한할수 있다. 

-c copy : 코덱을 그냥 카피하라는 의미, 오디오 비디오 모두에 해당한다. 

-acode copy : 오디오코덱을 카피하라는 의미 ( -vcode 은 비디오라는 뜻 ) 

-c:a copy : 코덱인데 오디오라는 의미 ( -c:v 이면 비디오라는 뜻 ) 


동영상에서 음악을 mp3 형식으로 뽑아내고 싶으면 아래와 같이 할 수있다. 

ffmpeg -i input.mp4 -vn output.mp3

 output 파일의 형식을 mp3로 하면 내부에서 자동으로 디코딩을 한후에 mp3 코덱으로 인코딩을 수행한다. 아래의 명령과 같은 의미가 된다. 

ffmpeg -i input.mp4 -acodec mp3 output.mp3

위와 똑같고 명시적으로 encoding할 codec을 알려주었다. 


* mp4 파일에서 특정 구간만 짤라서 뽑아 보자. 

ffmpeg -i input_20s.mp4 -vn -ss 5 -to 10 -c copy ouput_5_10.mp4

 -ss 5 : 시작 위치를 지정한다. (즉, 5초부터 시작한다. )

 -to 10 : Stop writing the output at position ( 즉, 10초까지만 사용한다. )

20초짜리 동영상파일에서 비디오를 제거하고(-vn) 5초부터 10초까지의 audio 파일만 crop 하는 명령이다. 


* 끝부분을 부드럽게 crop 하기 위해서 fade out 효과를 주면서. 

ffmpeg -i input_60s.mp4 -to 30 -filter_complex "afade=t=out:st=28:d=2" output_fadeout.mp3

-to 30 : 처음부터 30초까지 짜르라는 의미

-filter_complex : 복합필터를 적용하라는 뜻 

"afade=t=out" : fade효과인데 타입(t)은 서서히 줄어드는 효과(out) 

st=28 : (startTime) 28초부터 시작해서 

d=2 : (duration) 2초동안

명령이 조금씩 길어지는데, 위의 설명을 천천히 보면 알 수 있다. 위에서는 처음부터 30초까지 짤르면서 fade-out 효과를 주었는데, 10초부터 30초까지 중간을 짜르면서 앞에 fade-in 효과를 추가하고 싶으면 어떻게 할까? 

ffmpeg -i input.mp4 -ss 10 -to 30 -filter_complex "afade=t=in:st=10:d=1,afade=t=out:st=29:d=1" output.mp3

점점 복잡해진다. ^^; 


* 오디오 파일을 반복해서 붙여 볼까? 

ffmpeg -stream_loop 1 -i input.mp3 -c copy output_loop.mp3

-stream_loop n : n번 반복하라는뜻, 0은 반복 없음. -1은 무한 반복

위에있는 stream_loop는 입력파일 앞에 추가한 input_file에 대한 옵션이다. ffmpeg는 입력을 받아서 출력으로 쓰는 형식인데, 입력은 반복해주면 출력결과가 반복(loop)이 되는 것이다. 


* 오디오파일1, 오디오파일2를 붙이고 싶으면? 

ffmepg -i "concat:input_1.mp3|input_2.mp3" output.mp3

-i 다음에 입력파일이 오는 위치인데, 이부분에 따옴표가 붙으면서 subcommand가 왔다. 

concat:file1|file2|file3...    형식으로 붙이고 싶은 많큼 파일을 붙일 수 있다. 


* 오디오파일과 비디오파일을 합쳐볼까? 

ffmpeg -i audio_only.mp3 -i video_only.mp4 -c copy ouput_mux.mp4

오디오만 있는 파일과 비디오만 있는파일 2개를 사용해서 하나의 동영상 파일로 만든다. 

2개의 입력파일 시간이 다를경우, 최종 output 길이는 긴 것으로 된다. 만약 비디오파일이 30초길이고 음악이 20초길이면 결과물 output을 play 해보면 20초까지는 동영상과 음악이 같이 나오다가 21초부터는 영상만 나오게 된다. 





:

Google AAD - 구글에서 인증한 안드로이드 개발 자격증

개발 2017. 5. 17. 00:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2016년 google I/O에서 발표했다고 하는데요, 구글에서도 과거 MCSE 같은 인증 자격증 제도를 운영하고 있습니다. 

과거 Java의  SCJP 를 취득한다고 취업에 크게 도움이 되지 않았고, Microsoft의 MCSE 도 비슷했다. 우리나라의 정보처리기사 정도의 가치가 있을런지.. 


2017년 3월 14일 기준으로 61개국에서 322명이 취득했다고 하니, 그렇게 인기가 많은건 아닌거 같다. 개발 해보면 알듯이 개발 능력을 어떤 시험으로 책정하기가 어렵기에, 이런류의 자격증은 base-line을 검증하는, 즉 최소 이정도는 알고 있다는 의미정도를 부여할수 있다. 


구글에서는 AAD를 소개하는 동영상도 만들었다. 정확한 명칭은 AAD (Associate Android Developer) 인증프로그램이라고 한다. 


구글의 기술블로그에도 소개가 되어 있다. 

https://developers-kr.googleblog.com/2017/03/introducing-associate-android-developer.html


응시료가 149달라라고 하니 대략 15만원. 비싸구나. 그리고 시험에 응시하면 48시간동안 문제를 풀어서 제출해야 한다고 한다. 물어 보는 내용은 다음과 같다. 


테스트 및 디버깅

    로컬 JVM 유닛 테스트 작성 및 실행

    장치 UI 테스트 작성 및 실행

    문제 설명이 주어지면 실패를 복제하십시오.

    디버그 정보를 출력하려면 시스템 로그를 사용하십시오.

    애플리케이션 크래시 디버깅 및 수정 (포착되지 않는 예외)

    활동주기 문제를 디버그하고 수정합니다.

    뷰에 문제 바인딩 데이터 디버그 및 수정


응용 프로그램 사용자 인터페이스 (UI) 및 사용자 경험 (UX)

    응용 프로그램의 기본 화면과 탐색 흐름 모의

    UI, 백그라운드 작업 및 데이터 지속성 간의 상호 작용을 설명하십시오.

    XML 또는 Java 코드를 사용하여 레이아웃 만들기

    사용자 정의보기 클래스 만들기 및 레이아웃에 추가

    사용자 정의 응용 프로그램 테마 구현

    공통 위젯 그룹에 맞춤 스타일 적용

    RecyclerView 항목 목록 정의

    로컬 데이터를 RecyclerView 목록에 바인딩

    메뉴 기반 또는 서랍 탐색 구현

    응용 프로그램의 UI 텍스트를 다른 언어로 현지화하십시오.

    접근성을 위해보기에 내용 설명 적용

    사용자 정의보기에 접근성 후크 추가


기본 응용 프로그램 구성 요소

    응용 프로그램의 주요 기능 및 비 기능 요구 사항 설명

    레이아웃 리소스를 표시하는 활동 만들기

    백그라운드 스레드에서 로더를 사용하여 디스크에서 로컬 데이터 가져 오기

    로더를 통해 데이터 변경 사항을 UI로 전파

    알람을 사용하여 시간에 민감한 작업 예약

    JobScheduler를 사용하여 백그라운드 작업 예약

    서비스 내부 백그라운드 작업 실행

    비표준 작업 스택 탐색 (딥 링크) 구현

    외부 지원 라이브러리의 코드 통합


영구 데이터 저장소

    데이터베이스 스키마를 정의하십시오. 표, 필드 및 색인 포함

    응용 프로그램 전용 데이터베이스 파일 만들기

    단일 결과를 반환하는 데이터베이스 쿼리 작성

    여러 결과를 반환하는 데이터베이스 쿼리 작성

    데이터베이스에 새 항목 삽입

    데이터베이스의 기존 항목 업데이트 또는 삭제

    콘텐츠 공급자를 통해 다른 응용 프로그램에 데이터베이스 노출

    원시 리소스 또는 자산 파일 읽기 및 구문 분석

    사용자 입력에서 영구적 인 환경 설정 데이터 생성

    환경 설정 값을 기반으로 응용 프로그램 로직 토글


기술면접 자료로 사용해도 될것 같다. 

자세한 자료는 다음을 참고 

https://developers.google.com/training/certification/





:

[graphic] RGB565와 RGBA8888에 대해서

개발 2013. 6. 19. 02:00

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

android에서 bitmap을 다루다보면 Bitmapconfig bitmap의 픽셀포멧을 표시하는 부분 있다.

ALPHA_8, RGB_565, ARGB_4444, ARGB_8888 이렇게 4가지가 있는데 주로 사용되는 RGB_565 ARGB_8888에 대해서 알아보자.

 

1. RGB_565

/**

         * Each pixel is stored on 2 bytes and only the RGB channels are

         * encoded: red is stored with 5 bits of precision (32 possible

         * values), green is stored with 6 bits of precision (64 possible

         * values) and blue is stored with 5 bits of precision.

         *  

         * This configuration may be useful when using opaque bitmaps

         * that do not require high color fidelity.

         */

        RGB_565     (4),

 

처음 이름을 보면 뭔가 했는데, 설명들 보고나니 이름이 그럴 듯하다. 2byte1pixel을 표현하는 방식이고 16bit ( 2byte ) 를 쪼개서 R(5bit), G(6bit), B(5bit) 로 표현하는 방식이다. 2 5승은 32이므로 RedBlue 32가지의 구분정밀도를 갖게되어 색 표현력은 적은 단점이 있으면서, 용량이 작아지는 장점이 있다.

 

2. ARGB_8888

/**

         * Each pixel is stored on 4 bytes. Each channel (RGB and alpha

         * for translucency) is stored with 8 bits of precision (256

         * possible values.)

         *

         * This configuration is very flexible and offers the best

         * quality. It should be used whenever possible.

         */

        ARGB_8888

pixel 4byte를 이용해서 우수한 색 표현을 하게 된다. ( 256*256*256=16,777,216 색 표현가능) 각 색별로 1byte씩 사용하고 있어서 개발시에도 다루기 편하다.

 

 

 

3. RGB_565ARGB_8888으로 변환

16bit RGB 565 형식으로 표현하면 아래처럼 된다.

RRRR RGGG GGGB BBBB

앞의 5bit를 취해서 R 값을 가져오려면 5bit를 가져오기 위해서 0xf8 ( 1111 1000 ) 와 비트연산(&)을 하고 이것을 오른쪽으로 11bit만큼 shift 하면 된다. 나머지 RB도 같은 방식으로 처리하면 된다.

최종코드

int RGB565_to_ARGB8(short rgb565)

{

    int a = 0xff;

    int r = (rgb565 & 0xf800) >> 11;

    int g = (rgb565 & 0x07e0) >> 5;

    int b = (rgb565 & 0x001f);

  

    r  = r << 3;

    g  = g << 2;

    b  = b << 3;

  

    return (a << 24) | (r << 16) | (g << 8) | (b);

}

 

4. ARGB_8888RGB_565으로 변환

위와 비슷하게 비트연산을 해주면된다.

short ARGB8_to_RGB565(int argb)

{

    int a = (argb & 0xFF000000) >> 24;

    int r = (argb & 0x00FF0000) >> 16;

    int g = (argb & 0x0000FF00) >> 8;

    int b = (argb & 0x000000FF);

  

    r  = r >> 3;

    g  = g >> 2;

    b  = b >> 3;

  

    return (short) (b | (g << 5) | (r << (5 + 6)));

}

 

5. 기타

다른 형식으로 RGBA_4444가 있는데, 4bit씩 해서 16bit으로 색을 표현하는 방식인데, deprecated 되어서 사용되지 않는다. Alpha 비트를 빼면 4096 색을 표현할 수 있다. ( 16*16*16 )

나머지 형식인 ALPHA_8은 한 pixcel에 투명정보(8bit)만 있는 형식인데, 투명 mask 같은곳에 사용된다.

 

 



:

libjpeg-turbo 에 대해서 알아 보자

개발 2013. 6. 14. 11:57

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

1. jpeg[1]란 무엇인가?

간단히 누구나 알고 있듯이 이미지 압축 형식중 하나인 것이다. 그런데 약자의 뜻도 모르고 있어서 한번 찾아 봤다.

Jpeg = joint photographic coding experts group

JPEG는 컬러 순간 동작(steal) 이미지를 위한 국제적인 압축표준으로 CCITT(Consultatve Committee International Telegraphand Telehpone) ISO에서 정의하고있다. JPEG는 이미지를 작은 블록으로 나누어 많은 양의 이미지 정보를 줄이는 DCT(Discrete Cosine Transformer) 알고리즘에 기초를 두고 있다. 압축률을 늘이기 위해서는 보다 많은 양의 이미지 정보를 지우고, 이에 따라 세세한 부분의 이미지가 줄어들기 때문에 이미지의 질은 낮아진다. 또한 이미지의 질이 낮아진 것을 느끼지 못할 정도까지만 압축시켰을 때 약 25:1의 압축률을 얻는다. 25MB의 이미지를 1MB로 줄일 수 있는 것이다. 비디오를 압축시키는데 사용되기도 한다. 각각의 프레임을 분리된 이미지로서 인트라프레임코딩(Intraframe Coding)이라 불리는 과정을 통해 각 프레임을 따로따로 압축시킨다. 이것은 다시 말해, 사용자가 비디오가 압축된 채로 독립적인 각 프레임을 랜덤 액세스할 수 있음을 나타낸다.

한글로는 정지영상 압축 포맷정도로 부를수 있다.

 

2. libjpeg-turbo[2]는 무엇인가?

Libjpeg-turbo  SIMD 명령( MMX, SSE2, NEON)을 사용해서 빠르게 인코딩/디코딩하는 JPEG 이미지 코덱이다.  SIMD Single Instruction, Multiple Data 로 하나의 명령으로 여러 개의 데이터를 처리하는 명령어 집합이다. 즉 하나의 명령어를 실행하는 동안 같은 오퍼레이션이 병렬로 데이터를 처리하여 속도가 빠른 것이다. 참고로 SSE2[3]2001년 인텔의 펜티엄 4에 처음 포함되었다. 그리고 NEON[4]ARM 프로세서에서 사용하는 SIMD 명령 지원체라고 보면 된다.

, libjpeg-turbo  intel 프로세서와 arm 프로세서에서 모두 동작가능한 빠른 jpeg 코덱인 것이다. 안드로이드에서 주로 사용하는 프로세서가 arm 아키텍쳐 기반이므로 흥미를 가질만 하다. 또한 최근 intel 에서도 모바일 프로세서를 삼성전자에 납품하여 갤럭시 탭 10인치에 시범적으로 사용된다고 하니, 앞으로 intelarm이 양분하는 모바일 프로세서 환경에서 딱 어울리는 녀석이다.

 

3. “libjpeg-turbo” != “TurboJPEG”

이름이 비슷해서 두개를 햇갈려 할 수 있는데 각각 어떻게 탄생하게 되었는지 알아보자

libjpeg-turbo은 기원은 libjpeg에서 속도를빠르게 하기 위한 libjpeg/SIMD 프로젝트서 시작되었다. ( libjpeg v6b, 2009) 현재는 독립된 프로젝트로 진행되면서 산업 표준으로 인정 받고 있다.

TurboJPEG“VirtualGL and TurboVNC” 그룹이 사용하려고 만든 API 이다.

 

4. 속도는 jpeg에 비해서 얼마나 빠를까?

다른 모든 조건이 같은 환경에서 테스트를 했을때, 평균적으로 2~4배 빠르다고 한다.

아래는 libjpeg-turbo 프로젝트 그룹에서 비교한 성능테스트 결과이다. [5]

 

libjpeg-turbo Speedup Relative to Other Codecs, Non-Grayscale Compression/Decompression (1.0 = equal performance)

 

libjpeg-turbo x86-64

libjpeg-turbo x86

 

Compression

Decompression

Compression

Decompression

libjpeg v6b

3.68 - 5.29

2.12 - 3.32

3.40 - 4.75

2.43 - 4.24

libjpeg v8d

3.66 - 5.79

1.95 - 3.85

3.19 - 5.22

2.29 - 4.96

Intel® IPP v7.1

0.922 - 1.21

0.811 - 1.18

0.710 - 1.10

0.650 - 1.26

 

Libjpeg 최신판인 v8d와 비교결과를 보면 평균적으로 2~5배 빠르게 나왔다 인텔의 IPP 와 비교했을때는 비슷하거나 오히려 조금 느리기도 하다. 돈있으면 인텔의 IPP를 사서 쓰는 것도 나쁘지 않을 것 같다. 다만 IPP는 인텔 프로세서에서만 실행된다는 점 !!

 

 

참고

[1] libjpeg : http://www.ijg.org/

[2] libjpeg-turbo : http://libjpeg-turbo.virtualgl.org/

[3] SSE2 : http://ko.wikipedia.org/wiki/SSE2

[4] Introducing NEON : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/index.html

[5] libjpeg-turbo 성능 : http://www.libjpeg-turbo.org/About/Performance

 

 



:

오픈소스 이용시 코드 공개 여부

개발 2013. 6. 3. 11:55

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

"한국저작권위원회" 라는것 이 있더군요.

여기서는 아래와 같이 개발할때 한번씩 체크해보면 좋을 유용한정보를 제공하고 있습니다.

각 라이선스 비교표 : http://www.olis.or.kr/ossw/license/compareGuide.do

1. APACHE, MIT, BDS 계열의 오픈소스를 이용할때는 코드 공개 의무가 없다고 하네요.

2. GNU 계열( GPLv2, GPLv3, LGPLv3 등) 은 배포시 소스코드를 제공해야 한다고 합니다.

 

또한 각 라이선스의 영문을 간략하게 요약하여 한글로 설명하고 있는 내용도 있습니다.

http://www.olis.or.kr/ossw/license/license/list.do?mapcode=010001

 

그외에도 오픈소스와 지적재산권및 라이선스에 관련하여 유용한 자료들이 있다.

http://www.olis.or.kr/ossw/license/licenseGuide.do

 

여기의 내용들을 읽어 봤는데도 잘 모르겠으면.. 직접 상담을 받을 수도 있다. ( 세금으로 운영되는 곳 같으니 적극적으로 이용하자~ ^^; )

http://www.olis.or.kr/ossw/consulting/consultingRequest/publicRequest.do

 

 



:

[crontab] 특정 시간마다 실행하기

개발 2013. 5. 10. 21:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

CI 서버를 설치하여 자동 실행 시간을 설정하는 중에 오래만에 설정하니 실수하게된다.

 

svn에 commit 한것을 5분 이내에 감지하여 자동 실행되게 하려고 아래처럼 하였다.

05 * * * *

그랬더니 매시 5분에 실행 되는 것이다. 아 이런 실수를 하다니..

아래처럼 해야 된다.

*/5 * * * *

 

참고로 매일 아침 8시 5분에 실행되게 하려면

05 08 * * *

 

5개의 숫자는 각각 "분 / 시간 / 날짜 / 달  / 년 " 의 의미를 같는다.

 



:

[eclipse] working set 을 이용한 다수의 project 관리

개발 2013. 5. 6. 14:32

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Eclipse를 몇 년간 써오다가 늦게 알게된 기능 이지만 예전부터 잠재적으로 원했던 기능인 것 같다. 바로 project를 논리적으로 관리할 수 있는 working set 이다. 기존에는 2depth 로 관리를 했었다.

workspace --- projectA

              --- ProjectB

              --- ProjectC

 

여기에 working set을 추가하면 아래처럼 3depth로 관리가 가능하다.

workspace --- working setA --- projectA

              --- ProjectB

              --- ProjectC

               --- working setB --- ProjectD

                                    --- ProjectE

                                    --- ProjectF

 

Project가 많아지면서 복잡해지던 package explorer working set으로 묶으니 간결해졌다.

예전의 Visual Studio solution 같은 개념으로 생각하면 좋을 듯 하다.

 

추가하는 방법은 package explorer에서 top menu 버튼을 눌러서 "configure working set.. " 을 선택해서 working set을 추가할수 있고, 또는 "New -> java -> java working set" 을 선택해서도 할 수 있다.  working set을 구성한 뒤에는 "Top Level Element"를 클릭해서 project 에서 working set으로 변경해야 package explorer에서 working set이 표시가된다. 이것을 않해줘서 왜 안되나 했었다. ^^;.

working set을 추가한 뒤에는 해당 project를 drag&drop으로 working set에 넣으면 된다.

package explorer에서 working set을 만들고 project explorer에서 확인하니 보이지가 않는다. 음.. 각각 만들어아 되는 건가?

 

검색할 때도 (Ctrl + H) scope working set으로 하면 관련된 프로젝트에서만 검색할 수 있다.

 

 



:

[Android] Eclipse Juno에서 xml 파일 전환시 느릴때 & ini 튜닝정보

개발 2013. 3. 8. 11:29

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 2013-03-07

작성자 : hanburn

 

Eclipse Juno 버전으로 android를 개발하는데, android 리소스 파일인 xml 파일을 열면 시간이 세월아..

좀 짜증이 나던차에 google에서 ADT를 새롭게 배포하고 있더라.

받아서 써보니 뭔가 android 개발에 최적화를 시켜 놓은것 같다. 그러나 Juno base로 개발된것이라서 동일한 문제가 발생하고 있다.

 

1. Juno SR1 patches

1) Help -> Install New Software

2) Select this repository: http://download.eclipse.org/eclipse/updates/4.2

3) Expand Juno SR1 Patches and install Eclipse UI Juno SR1 Optimizations

 

2. ini 파일 튜닝

정리가 잘된 곳이 있어서 링크로 대체

http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177633#Eclipse성능개선최적화-eclipseini설정

 

 

 



:

[linux] vi편집기에 붙일때 앞에 tab이 붙는경우

개발 2012. 9. 14. 10:59

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

가끔 vi에서 설정 파일을 열어서 웹에서 복사한 내용을 붙여넣기 할 때,
앞에 탭이 마음대로 추가되는 경우가 있다. 

이 경우 붙여넣기 전에 다음의 작업을 수행해 주면 된다고 한다. 

:set paste

이렇게 해놓고 편집모드에서 붙여 넣으면 깔끔하게 내용이 추가된다.
원상 복구하려면  

:set nopaste

명령을 실행하면 된다. 


이런 작업을 하고 싶지 않으면, 명령모드에서 

gg=G

라고 치면 자동으로 indent정렬을 해준다. 이클립스에서 Ctrl+Shift+F 누른거 처럼...



: