토렌트와 그 이외의 인터넷 서비스를 동시에 쾌적하게 사용하는 것이 의외로 쉽지 않다. 토렌트 사용량이 늘어나면 전체적인 인터넷 대역폭에 영향을 미칠 수 밖에 없기 때문이다. 아래와 같은 과정으로 쾌적한 환경을 구축해봤다. 1. 인터넷 성능 확인 가장 우선적으로 할 일은 인터넷의 성능 자체를 확인하는 것이다. speedtest.net, myspeedtest.co.kr 등 많은 사이트에서 인터넷 속도를 확인할 수 있으며, 결과는 당연히 대동소이함. 2. 토렌트 설정 μTorrent®의 설정에서 연결과 대역폭을 조정한다. (다른 클라이언트도 대동소이함) 우선 연결 메뉴에서 아래와 같이 설정했다. 사용 포트는 한번 무작위로 지정한 뒤 변경하지 않으며, 지정한 값을 DD-WRT에 저장해야 하므로 별도로 메모해둔다..
1. 배경 ipTIME으로 대표되는 국산 유무선 공유기들은 보안성을 신뢰할 수 없다는 지적이 많았다.리눅스 및 오픈소스 기반이지만 한국식으로 라이센스 같은 거 모르겠고, 소스 비공개로 운영되는 건 덤이고. 게다가, 특히 ipTIME은 제품 자체 및 전원 어댑터의 내구성 문제가 수시로 지적되어왔다. 이번 기회에 좀 더 믿을 수 있는 녀석으로 바꿔보기로 했다. 2. 제품 선정 많이 팔리고, 성능도 만족스러우며, 가격도 합리적인 TP-LINK의 Archer C7을 선택했다.성능도 성능이지만, DD-WRT를 끼얹을 수 있다는 점이 더욱 중요했다. 3. 구동 Archer C7은 2.4GHz/5GHz 듀얼밴드를 지원하는 1Gbps 유무선 공유기이고, 2개의 USB 포트를 제공한다.이를 제대로 지원할 수 있는 충분한..
1. WoW64 환경인지 확인하는 법 대략 아래와 같은 코드를 사용하면 된다.상세한 설명은 MSDN: IsWow64Process function 참고. typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; bool isWow64() { #ifdef _WIN64 return true; #endif BOOL bIsWow64 = FALSE; //IsWow64Process()가 모든 윈도우에 구현된 건 아니기 때문에 //이런 방식을 사용해야 함 fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(TEXT("kernel..
윈도우 10에 포함된 MS Edge는 IE에 비해 많은 향상이 있는 브라우저다.속도나 웹표준 준수 등 여러모로 발전된 게 사실이다. 그런데, 여기저기에서 실전 적용이 어렵다는 판단을 하게 되는 점들이 발견된다.이번에 크게 눈에 띈 점 하나는 깃허브에 공개된 내용을 사용하기 너무 어렵다는 점. 파이어폭스나 크롬 등의 브라우저로 깃허브를 띄운 뒤 소스를 선택하면 아래와 같이 선택된다. 그런데, Edge로 선택하면 아래와 같이 선택된다. 물론, 소스를 직접 다운받고 활용하는 방법이 있기는 하지만, 굉장히 불편한 게 사실이다.MS Edge… 아직 갈 길이 멀다…
요즘 컴퓨터에서 관리되는 시간은 굉장히 정확하다. 메인보드에는 RTC 칩이 있어 전원을 꺼도 시간은 확인되고, 시간 정보는 수시로 타임 서버와 동기화한다. 코인 배터리로 RTC가 동작되기 때문에 배터리 누액으로 인해 메인보드가 망가질 일도 거의 없다. OS에서는 타임 서버/RTC의 시간을 시간대와 함께 계산해서 관리해준다. 그런데, 처음부터 시간이 이렇게 정확하게 관리됐던 게 아니다. 오히려, 정확하기는 커녕 시간 자체가 제대로 관리되지 않았다. 내가 처음으로 접했던, MSX와 연계된 RTC의 기억들은 아래와 같다. 1. MSX 내가 처음 가져본 컴퓨터는 금성전자에서 판매한 FC-30이었는데, 이건 시간 개념이 없던 제품이라 패스. 제대로 시간 개념이 있는 컴퓨터를 처음 가져본 것이 대우전자에서 판매한 ..
C/C++에서 memset()은 종종 최적화에 대한 얘기가 종종 나오는 테마이다.이론적으로는 내용들에 동감은 하는데, 과연 실제로 영향이 있는지 확인해봤다. 비교 대상은 memset(), 단순무식, 8바이트 정렬 고려한 최적화, 버클리 구현 소스 등. - memset() : 그냥 Visual C++에 내장된 함수- 단순무식 : 루프 돌리는, 일반상식에 기반한 코딩- 8바이트 단위 쓰기 : 루프를 8바이트 단위로 돌리면서 uint64_t 단위로 쓰기 (참조 사이트) - 8바이트 단위 정렬 최적화 : 메모리에 쓸 때 주소가 8바이트 단위면 CPU가 조금 더 최적화한다는 점을 고려한 쓰기- 버클리 구현 : 8바이트 단위 정렬 최적화의 버클리 버전 (참조 사이트) 이 코드를 디버그 모드에서 돌렸을 때의 결과는 ..
프로그램을 만들 때 아이콘은 대부분 자작하는 편이다.그러다 삽질한 내용을 까먹지 않기 위해 기록. 내가 아이콘을 만드는 과정은 대략 아래와 같았다. 1. 적절한 이미지 선택2. 프로그램을 써서 주변을 적당히 잘라냄3. paint.net의 아이콘 플러그인을 이용해서 저장 문제는 2, 3번에서 모두 발생했는데…2번: 잘라낸 뒤에 투명한 영역의 색을 (0, 0, 0)으로 변경 → 나름 파일의 크기를 조금 줄이겠다는 심산이었는데, 리사이징에 심각한 악영향3번: 플러그인의 리사이징 품질 자체가 좋지 않음 결국, 투명 영역의 색을 그대로 유지하고 직접 리사이징 한 뒤, ImageMagick을 사용해서 아이콘을 생성하는 것으로 변경. 오늘의 교훈: 불투명도가 0이라고 그 색이 무의미한 게 결코 아님. 특히 리사이징 ..
키보드를 GTune MBF100 PLUNGER로 바꾸고 보니 한영/한자 키의 위치가 일반 키보드와 다르다. 레이아웃이 한국식 106키가 아니라 US-International 103키와 거의 같기 때문에 한영/한자 키의 위치가 굉장히 낯설다. 그래서 오랜만에 예전에 쓰던 트릭을 꺼내들기로 했다. Shift/Ctrl + Space로 한영/한자 키를 대신하는 것. 이 트릭을 적용하려면 다음과 같이 하면 된다. 우선, 레지스트리 편집기로 아래 위치로 이동해보면 대략 아래 캡쳐화면과 같이 되어있다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters 여기서 표시된 두 부분의 값을 각각 다음과 같이 바꿔주고 재부팅하면 끝난다. 바뀐 부분..
난 키보드 덕질은 안 하지만, 은근 기계식 키보드에 대한 로망 같은 게 있었다. 고민 끝에, 멤브레인과 기계식의 중간쯤이라고 얘기되는 플런저 키보드를 하나 사기로 했다. 선택한 제품은 한성컴퓨터에서 나온 GTune MBF100 PLUNGER. 이 제품은 독특한 특징이 몇 있다. 1. 비용은 상당히 저렴함. 특히, 기계식과 비교하면 하늘과 땅 차이 2. 당연한 얘기지만, 누르는 감이 충분히 괜찮음. 살짝 사각거리는 소리도 은근 기계식 필이 느껴짐 3. LED가 적절히 은은하며, 색과 밝기를 쉽게 조절할 수 있음 4. 키보드 레이아웃은 완전히 US-인터내셔널 레이아웃임. 즉, 스페이스 바 왼쪽에 3개, 오른쪽에 4개의 키만 있음 5. Scroll Lock 램프가 없고, 그 자리엔 Game Mode 램프가 위..
처음으로 컴퓨터를 밤새며 돌렸던 작업이 뭐였나 생각해봤다.아마도, 처음으로 그렇게 돌렸던 작업은 80년대 중반 MSX에서 Mandelbrot 프랙탈을 그려본 것 같았다. 월간 마이크로 소프트웨어에 소개된 기사를 읽고서 (개념을 제대로 이해도 못하면서) MSX Basic으로 돌려본 것이었다.굉장히 낮은 해상도임에도 화면 하나를 채우려면 몇 시간 돌려야 했기 때문에 자기 전에 좌표를 지정하고 돌린 뒤에 아침에 결과를 확인했었다. 이후 CPU가 비약적으로 향상된 MSX Turbo R에서 조금 더 빠르게 동작하는 솔루션도 나왔지만, 그래봤자 아래와 같은 수준… 결국 HW와 SW 모두 장족의 발전을 하고, Mandelbrot 그래픽은 몇 초 내에 결과를 보여주는 세상이 왔다. 다음으로 밤을 새서 돌린 건 90년대..
그간 써오던 케이스를 새로운 케이스로 바꾸기로 했다.선택한 케이스는 독일 Nanoxia 사의 Deep Silence 2. 기존 케이스는 저렴한 가격이라 산 케이스인데, 무엇보다 얇은 철판으로 인해 진동을 잡기가 너무 어려웠다. 살짝 뜯어보니 먼지가 좀 많이(ㅡ.ㅡ;) 쌓여있다… 조심해서 분해해서 부품들을 다 꺼냈다.메인보드+CPU, 그래픽 어댑터, 하드 디스크 4개 그리고, ODD. 새로 산 케이스의 포장지를 제거했다.케이스는 일단 깔끔(단순?)하다. 혹자는 냉장고라고… 전면 상단에 USB 3.0 포트 2개, 2.0 1개가 있는데, 이 케이스를 선택한 이유 중 하나다. 케이스 내부는 외부와 동일하게 채색되어있다.케이스 뿐만 아니라 나사 하나하나도 마찬가지. 나사, 케이블 등등은 별도의 상자에 포장되어있다..
갑자기 브라우저를 띄우면 bing.com이 뜨는 문제가 생기기 시작했다. 악성코드가 원인인가도 생각했지만, 찾아보니 그건 아니고, 이미 알려진 윈도우8의 문제였다. 정확한 원인은 아직 얘기되는 게 없지만, 해결책은 나와있다. 레지스트리를 간단하게 수정하면 된다. - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet에서 - EnableActiveProbing(DWORD)의 값을 0으로 설정 간단하게, 아래의 내용을 레지스트리로 저장해서 실행해도 된다. Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\N..
Visual Studio 계열은 C++ 표준인 std::string 보다는 CString을 더 많이 사용한다. 그런데, VC6의 CString::Replace()는 뭔가 문제가 있었던 것 같다. VC6에서 Unicode 프로젝트를 돌리며 여러번 확인했었는데, Replace()는 문자열 치환을 한 번만 수행했다. 즉, CString cs = _T("Hello World !"); cs.Replace(_T(" "), _T(" dirty ")); MessageBox(cs); 를 실행하면 Hello dirty World ! 가 출력되었다. 도움말을 찾아보지도 않고 그러려니하고 써왔었는데, 우연한 기회에 VS2013에서 테스트해보니 정상적으로 동작했다. 속으로 '아… MS가 이런 변화를 별도로 공지하지 않았나…' ..
iTrans나 Any to MP3 등은 내부적으로 배치파일을 만들어 돌린 결과를 리다이렉트해서 화면에 출력하도록 만들었다.배치파일은 오로지 ANSI 포맷으로만 만들 수 있었기때문에 8.3 이름을 추출해서 배치파일을 생성한다. 그런데, 알고 보니 그 제약은 XP까지만 존재했고, 비스타 이후는 UTF-8 포맷의 배치파일도 인식하도록 수정되었다.무려 8년이나 지난 얘기를 이제야 알았다니… 그래서 두 프로그램 모두 이 내용을 반영해서 수정 중이다.이제 윈도우 비스타 이상에서는 어떠한 파일명의 미디어 파일라도 정상적으로 처리가 가능한 거시다!!
한 집안에 있는 카메라가 끽해야 두어대이던 시절이 있었다. 수학여행 간다고 아버지가 애지중지하시던 카메라를 빌려갔던 기억도 난다. 그런데, 요즘은 디지털카메라가 넘쳐난다. 우리 집만 해도 디카와 폰카를 다 합치니 여섯 대가 나온다. 난 사진을 날짜/시간순으로 정렬하고 폴더에 정리하는데, 디카가 여러대인데다 사진 장수도 많아 쉽지가 않다. 더군다나, 디카마다 시간이 미묘하게 다른데, 이게 가끔 신경이 쓰인다. 1. 동영상 변환 아이폰/아이패드 처럼 동영상을 mp4/H.264로 깔끔하게 떠주는 디카는 아직도 많지 않다. 여전히 AVI/mjpeg의 커다란 파일로 만들어주는 경우가 더 많다. 화질에 대비해 파일의 크기가 너무 크다… 그래서, iDevice용 동영상 변환기 iTrans v10.3a를 사용한다. 변..
VS2012에서 구버전 VS의 프로젝트를 사용할 때 가끔 다음과 같은 메시지를 만날 수 있다. warning C4005: '__useHeader' : macro redefinition warning C4005: '__on_failure' : macro redefinition 이 문제는 VC11의 헤더와 SDK 7.1a의 헤더가 달라서 발생하는 것이라고 한다. .rc 파일 맨 앞부분에 다음 내용을 추가하면 이 메시지를 볼 일이 없다. #define _USING_V110_SDK71_ 1 참고 사이트: stackoverflow
지난 3월 5일 모질라에서는 mozjpeg라는 프로젝트를 발표했다. 이것은 기존 JPEG의 규격을 그대로 유지하면서 JPEG 압축률을 대폭 향상시키는 프로젝트다. 즉, 구글 WebP의 커다란 걸림돌이 나타난 것이다. 이번에 발표된 1.0을 직접 컴파일해보니 VS에서는 약간의 오류 수정이 필요했다. 제대로 동작하게 하려면 두 개의 파일을 수정해야 한다. 1. CMakeLists.txt 488행은 다음과 같다. SOURCES libjpeg-turbo.nsi) 이것을 아래와 같이 수정해야 한다. SOURCES libmozjpeg.nsi) 2. jcparam.c 741행부터는 다음과 같다. GLOBAL(void) jpeg_simple_progression (j_compress_ptr cinfo) { if (ci..
Static duration means that the object or variable is allocated when the program starts and is deallocated when the program ends.- MSDN iTrans 버그 리포트 중에 아주 이상한 내용을 하나 들었다.같은 자막을 두 번 변환하면 가 추가된다는 것… 제보해주신 분들과 연락을 해보니 static으로 선언한 어떤 부분의 데이터가 깨지는 게 원인이었다. bool CSami2Srt::convISO88591(LPCTSTR lp, TCHAR &tc, int &len){ static LPCTSTR lpEntityNames[] = { _T("quot"), _T("apos"), _T("amp"), _T("lt"), _T..
어플이 실행되는 OS의 버전을 인식하게 하려면 GetVersionEx() 함수를 쓰면 되었다. 그런데, Windows 8.1에서는 여러가지 이유로 이 함수를 deprecate 시켰다. 대신 VersionHelpers라는 API를 통해 훨씬 간단하게 OS 버전을 확인하도록 만들었다. 그럼에도 불구하고, 굳이 GetVersionEx()로 버전을 정확히 인식하려면 매니페스트에 몇 줄을 추가하면 된다. 위와 같은 파일을 하나 만들어 적절한 위치에 저장한 뒤에 이를 추가 매니페스트로 지정하면 끝임. 덧. 원래 iTrans의 문제를 해결하려고 시작했지만, 정작 OS 정보는 레지스트리에서 직접 읽었다는 게 함정
Visual Studio 2010/2012에선 도구상자가 분실(?)되는 사건이 종종 발생한다. 이 문제를 해결하려면 다음 순서를 따르면 된다. 1. 도구 상자 다시 설정 - 도구 상자에서 오른쪽 클릭을 한 뒤 도구 상자 다시 설정(E)를 클릭한다. 2. Visual Studio 종료 3. 탐색기에서 다음 위치로 이동해 .TBD 파일들을 삭제 [사용자 폴더]\AppData\Local\Microsoft\VisualStudio\[VS버전] 4. 레지스트리 편집기에서 다음 키들의 내용을 삭제 HKCU\Software\Microsoft\VisualStudio\[VS버전]\ToolboxControlsInstaller_AssemblyFoldersExCacheHKCU\Software\Microsoft\VisualStu..
Visual C++에서 개발하다 보면 리소스 ID가 종종 꼬이는 문제가 생긴다.리소스 ID를 수작업으로 정리하며 이런 툴을 하나 만들어볼까 했는데… 아니나 다를까 이미 있었다. Riverblade에서는 Code Project에는 VC 5.0/6.0/.Net 용을 2001년에 공개했고…이후, 이를 ResOrg라는 이름으로 업그레이드해서 상용 버전으로 공개했다. 상용 버전은 플러그인 형태로 VS2012에도 적용할 수 있고, 공개 버전 역시 VS2012에서 사용 가능하다.
난 여전히 VC++ 6.0을 사용해왔다. 컴파일된 실행파일을 어떤 윈도우(물론 2K 이상)에서도 실행할 수 있다는 점이 가장 큰 이유다. 물론, 정적 라이브러리에서 MFC 사용으로 설정하면 되지만, 실행파일의 크기가 너무 커진다. 그런데, 이제 보니 컴파일러 설정 등을 조금만 손대면 VS2005 이상에서도 유사한 결과를 만들 수 있었다. 우선, targetver.h을 수정한다. XP에서 동작하는 프로그램을 원하면 이 정도면 된다. #pragma once #include #define _WIN32_WINNT _WIN32_WINNT_WINXP #include 그리고, 프로젝트 속성에서 다음 부분을 손대면 된다. - 일반 → MFC 사용: 표준 Windows 라이브러리 사용 - C/C++ → 코드 생성 → 런..
그동안 10년 넘게 생사고락을 함께한 Visual C++ 6.0을 버리기로 했다. 새로운 파트너는 Visual Studio 2010. 그런데, VS2010은 그냥 쓰기엔 뭔가 살짝 아쉬워서 몇 가지를 준비해야 했다. 1. 인텔리센스 끄기 뭔가를 많이 도와준다는데, 너무 느리다. 마치 허접한 컴퓨터의 보안을 도와주기 위해 설치한 nProtect와 키보드 보안 프로그램의 느낌. 인텔리센스를 끄려면 메뉴에서 Tools → Options → Text Editor → C++ → Advanced를 찾아가서… Disable Database와 Disable IntelliSense를 False로 설정한다. ※ 이렇게 인텔리센스를 끄면 리소스뷰와 클래스뷰가 제대로 나오지 않는 치명적 버그가 있음. ㄷㄷㄷ 2. 빌드 넘버 ..
우리집 네트워크 구성은 ipTIME이 주력이다. 얼마 전 가짜 안테나에 대한 얘기도 있긴 했지만, 어쨌거나 전체적으로 신뢰성 있는 건 사실이고. 중심에는 2.4GHz/5Ghz를 모두 지원하는 N904가 있고, 무선 랜 어댑터도 ipTime 제품들이다. 라즈베리 파이를 구성하는 과정에서 구매한 NCUBIC부터… 300Mbps를 지원하는 N600UA까지… 그런데… 이렇게 구성하고 쓰다보니, 어느 순간엔가 데이터가 계속 깨진다는 사실을 알게 됐다. 처음엔 잠깐 발생한 일시적 현상이라 생각했는데, 시간이 지나도 계속 반복적으로 벌어졌다. 문제의 원인을 찾기 위해 오류를 계속 확인할 수 있는 시나리오를 찾기로 했다. 몇 번의 시행착오를 거친 결과 한컴샵에서 이지포토3을 다운받는 게 제일 적절하다는 걸 확인했다. ..
2012/08/12 - [IT/잡담] - 이상한 한/글(한컴)의 데이터 구조 #12012/08/12 - [IT/잡담] - 이상한 한/글(한컴)의 데이터 구조 #2 9개월 전 쯤 아래아한글(이하 한/글)의 데이터 구조에 대한 불만을 포스팅했다.불만은 두 가지였는데, 압축을 이상하게 한다는 점과 굳이 BMP 이미지를 zlib으로 압축한다는 점이었다. 이후, 한컴에 문의한 결과 첫번째 불만에 대해서는 제대로 된 답변을 들었다. zlib로 압축을 풀 때(inflate 할 때) inflateInit()가 아니라, inflateInit2()로 초기화를 해야 된다는 것이다.이를 적용해보니 압축이 잘 풀렸다.덕분에 압축 푸는 부분이 복잡했는데, 단순하고 깔끔하게 정리할 수 있었다. 덧. 한컴에선 두 번째 질문을 아마도..
매년 구글은 만우절만 되면 쓸고퀄의 극치인 장난을 많이 친다.특히, 구글 맵스는 주 타겟이다. (2012년은 8비트 버전의 구글 맵스를 보여줬음) 보물 찾기 모드는 당연히 첫 화면부터 다르다. 보물만 찾으면 될 것 같다. ㄷㄷㄷ 서울로 가보면 아주 난리도 아니다.국회의사당에서는 태권 브이가 튀어나오고 강남에선 싸이가 말춤을 추고 있다. 창원시 진해구 모 장소를 찍어보니 아래와 같다.평범한 곳인데 뭔가 모험심 돋는다. 이제 해외로 눈을 돌려봤다.우선 벡스 맥주의 고향 브레멘. 화면 한 가운데가 벡스 본사다. 파리로 가보면 정말로 보물지도 돋는다.에펠탑, 루브르는 물론이고 샹젤리제 거리도 뭔가 달라보인다. 지난 포스팅에서도 다뤘던 [골든아이] 오프닝에서 007이 번지점프를 했던 스위스 베르차스카(Verzas..
하드 디스크 하나가 맛이 살짝 갔다.문제는 그게 C 드라이브였다는 것. 이거 다 포맷하고 윈도우 새로 깔고… 하려니 엄두가 안 나서 약간의 꼼수를 사용해서 복원했다.맛이 간 드라이브의 내용을 멀쩡한 드라이브로 옮긴 뒤 맛이 간 것을 제거하는 쪽으로. 작업 과정은 대략 아래와 같았다.(설치 OS는 Windows 7임) 1. 드라이브 복제 EaseUS Partition Master Home Edition은 개인 사용자에겐 무료다.이 툴을 이용해서 C 드라이브의 내용을 다른 드라이브에 복제한다.이 때 Logical Partition으로 설정하지 않도록만 유의하면 된다.Primary Partition에서만 부팅이 가능하다. 2. 새 부트 드라이브에 부트로더 설치 드라이브를 복제했지만, 그 드라이브로는 부팅을 할..
근 5년만에 그동안 써오던 Q6600+DDR2 6GB를 업그레이드 했다.Q6600은 당시 쿼드코어 출시시기 경쟁에서 밀린 인텔이 조급하게 만든 듀얼x2 구조의 CPU였다.비록 순수한 쿼드는 아니었으나, 엄청난 가성비를 자랑하며 근 5년 정도 잘 써왔다. 이제 쿼드코어 CPU를 적절한 가격에 쉽게 구할 수 있기도 하고, 메모리 역시 저렴해서 업그레이드하기로 했다. - CPU: AMD A8 3870K Black Edition (쿼드코어)- M/B: Gigabyte A75M-S2V- Mem: AMD DDR3 4GB PC3-12800 (2EA) 언제나 핵심은 CPU… 대략 이렇게 생겼다.오랜만에, 아마도 근 10년만에 써보는 AMD인 것 같다. 받은 3가지만 조립한 결과는 이렇다.AMD 메모리가 은근히 눈에 띈..
이전글에서 계속 2. 그런다고 압축을 제대로 하지도 않음 아래 보이는 그림을 보자. 한/글에서 추출한, 압축된 BMP의 압축을 풀었다 다시 압축한 결과이다. 압축된 원본의 크기는 96KB이고, 압축을 풀자 1,148KB의 BMP가 나왔다.이를 JPEG로 변환(Q=95)하자 88KB가 되었다.즉, JPEG로 변환하자 8% 정도 크기가 줄어든 것이다. 그런데, 웃긴 것은 1,148KB의 BMP를 zlib로 다시 압축하자 59KB가 되었다는 것이다.(level은 기본값인 Z_DEFAULT_COMPRESSION 적용) 대체 압축 라이브러리를 어떻게 적용한 것인지 모르겠다. 한/글의 이미지 처리는 커다란 개선의 여지가 있다.무엇보다 포함된 이미지가 BMP인 경우 PNG로 자동변환해주는 기능이 필요하다.옵션으로 (..