글
zopfli, 구글에서 공개한 새로운 압축 알고리즘에 대한 오해와 진실
구글에서 몇 일 전에 zopfli (좁플라이)라는 새로운 압축 알고리즘을 공개했는데,
다들 오해하고 있는 부분이 있는듯 해서, 글 한번 남겨봅니다.
일단 중요한 부분, 실제 압축 효율이 다른 압축 알고리즘에 비해 좋은가?
==> 아닙니다. 실제 압축률은 rar 이라던가 7zip 이 더 좋습니다.
그럼 이게 무슨 의미가 있는가?
==> zlib 호환 압축 알고리즘이라는 것입니다.
즉, 기존에 zlib 기술을 사용하던 분야에서 압축 해제 프로그램의 업데이트 없이 적용이 가능하다는 것이지요.
위 블로그에 적힌 것 처럼 gzip, Zip, PNG, HTTP requests 등의 비트 스트림 압축부분에 적용한다면,
인터넷 트래픽을 획기적으로 줄일 수도 있을 것입니다.
100배나 느리다는데?
==> zopfli 프로젝트 홈에 표시되어 있기로는 ~100x slower 라고 표시되어 있습니다만,
블로그 글에 따르면 cpu 소요시간으로 따지면 zlib 최대 압축으로 했을 때 보다
2-3 배 정도 차이난다고 되어 있습니다.
사람들이 이것을 두고 누가 쓰겠냐? 라고 하는데...
구글이 그 정도 테스트도 안하고 오픈했을까 싶네요.
보통 압축은 한 번만 하면 되는 것이고 실제 트래픽의 5%만 줄일수 있다고 해도
그 비용은 상당히 클테니깐요.
특별히 클라이언트가 해야 할 것이 없으니 알게 모르게 어느 순간 우리에게 다가와 있을것 같네요.
보이지 않는 영역에 까지 세상을 바꾸려는 노력을 하고,
그 노력을 공개한 구글에게 박수를 보내며 이만~
'컴퓨터 사용' 카테고리의 다른 글
[Linux] Bash history 검색 팁. (1) | 2013.05.03 |
---|---|
구글 리더는 이대로 사라지는가? (0) | 2013.03.14 |
[Google] 북마크도 역시 구글! (0) | 2013.02.07 |
쓸만한 공개 유틸리티 정리 (0) | 2013.01.31 |
[Ubuntu] Proxy 환경에서 어도비 플래시 설치 (0) | 2013.01.29 |
글
[MSYS] *** Couldn't reserve space for cygwin's heap (0xXXXXXXXX <0xXXXXXXX>) in child, Win32 error 0
원래 Windows 환경에서 사용할 만한 컴파일러와 IDE 에 대한 이야기를 쓰려다가,
msys 에서 아래와 같은 에러가 발생하여, 여기에 대한 내용부터 기록에 남긴다.
*** Couldn't reserve space for cygwin's heap (0xXXXXXXXX <0xXXXXXXX>) in child, Win32 error 0
집에서는 잘 되는데, 회사에선 항상 저런 메시지를 내면서 msys 의 대부분의 실행 파일들이 동작하지 않는다.
간단하게 결론부터 말하면 child process 가 fork() 될 때,
dll 파일이 로드되는 메모리 주소가 서로 다르게 되어 fork() 가 실패하기 때문이다.
( 이게 무슨 말이냐 라고 묻는다면, 납득할 만하게 설명할 자신은 없다. -_-;;
좀 더 자세한 설명을 원한다면 아래 포스트를 읽어보라.
http://old.nabble.com/Re%3A-fork-problem-on-Windows-XP-64-bit-p31154393.html )
( 예전에는 cygwin 에서도 이러한 에러 메시지를 본 기억이 있는데,
최근에는 cygwin setup 시에 dll 파일들의 base address 를 재설정 한다고 하는 듯하다. )
이리저리 구글링 좀 해 본 결과, 아직까지 근본적인 해결방법은 없는듯 한데,
실제로 msys 의 릴리즈 노트를 봐도 저 문제를 해결하지는 못하고
다만 rebase 되는 상황을 최소화 하기 위해 msys-1.0.dll 파일의 base address 를 바꾸었다고 되어있다.
( 분명 Windows 는 dll 파일을 로드할 때, 주소 충돌이 생기면 base address 를 알아서 조정한다고 했던거 같은데,
왜 msys 에서는 안되는지 잘 모르겠다. dll 파일 자체에 해당 기능을 enable 하는 플래그가 있다고 본 거 같다.
하지만 더 구체적인 근거를 찾기엔 시간도 부족하고... 해서 패스 )
어쨌든 저러한 문제가 생기면 msys 에 포함된 dll 파일들의 base address 를 바꾸어 주어야 하는데,
이 때 사용하는 프로그램이 rebase 프로그램이다.
문제는 msys 에 포함된 rebase 를 실행하기 위해서는 msys-1.0.dll 이 필요하다는 거.
그래서 msys-1.0.dll 이 의존적이지 않는, Win32 native binary 가 필요한데,
직접 빌드하려 소스를 열어보니 익숙치 않은 autoconf, automake 조합으로 빌드되도록 되어있다.
하지만 나와 같은 (그리고 이런 문제를 만난 다른 많은 사람들과 같은) 생각을 가진 분이
이미 빌드해 놓은 파일이 있었다.
소스: http://repo.or.cz/w/msysgit.git/tree/322c42c780833a52bd7cd0358a562ab243ecfbce:/src/rebase
바이너리: http://repo.or.cz/w/msysgit.git/history/76920dc49da361257cbccb02ea63b3e5357fe353:/bin/rebase.exe
위 툴을 받아, msys 의 bin 디렉토리에 복사를 한다. (보통 C:\MinGW\msys\1.0\bin 일 것이다.)
그리고 해당 디렉토리에서 cmd 창을 열고 아래와 같이 입력한다.
C:\MinGW\msys\1.0\bin>rebase -b 0x30000000 msys-1.0.dll
새로운 Base 주소는 각자 적당히 찾아서 적으면 될듯 하다.
그리고 이제 다른 dll 파일들에 대하여 rebase 작업을 한다.
이제 MinGW Shell 을 열어도 에러가 뜨지 않으니, MinGW Shell 을 열고,
$ mingw-get install msys-rebase
를 실행한다. 위 명령을 성공적으로 실행되면, MinGW Shell 을 닫고,
탐색기에서 msys 의 bin 디렉토리로 이동하여 dash 를 실행한다.
그리고 아래와 같이 입력한다.
/bin/rebaseall
만약 에러 메시지가 출력된다면, (예를 들면 read-only 속성이 걸려 있다던가...)
에러 메시지를 보고 적절한 조치를 취해 준 뒤 다시 실행한다.
마지막으로
/bin/peflagsall
을 해주면,
(위에서 이야기 했던) dll 파일에 dynamicbase flag 를 set 한다고 되어 있다.
dash 에서는 현재 환경을 MinGW32 로 인식하고 있어서 별 다른 작업을 하지는 않는데,
실제 문제가 되는 건 msys 기 때문에 스크립트 파일의 Platform 환경변수를
강제로 바꾸어 주어야 되는지는 잘 모르겠다.
써 보다가 문제가 생긴다면 고려해 봐야할 듯.
P.S
아무래도 생각해도 이 에러가 발생한 건,
회사의 보안 프로그램이 해당 영역을 이미 차지하고 있기 때문이라는 생각이 든다.
'프로그래밍' 카테고리의 다른 글
Hues, Tints, Tones, Shades (0) | 2015.10.22 |
---|---|
[STL] vector 의 정렬 - object pointer 정렬 (1) | 2013.04.25 |
[Code::Blocks] Using redirection as arguments on windows version. (윈도 버전에서 표준입출력 리다이렉션 하기) (1) | 2013.02.23 |
fgets(buf, buf_size, stdin), gets(buf) 차이? (0) | 2013.02.20 |
Dynamic Programming - Edit Distance, Two-Person Traversal... (0) | 2012.08.09 |
글
[Code::Blocks] Using redirection as arguments on windows version. (윈도 버전에서 표준입출력 리다이렉션 하기)
In Code::Blocks can set programs arguments in IDE ("Project > Set programs' arguments...")
But in windows version, the redirection is not working.
How to make it enable?
The problem is the 'cb_console_runner.exe'.
That use CreateProcess() function to start the child process.
Unfortunately, CreateProcess() CAN'T handle redirections.
Why does 'cb_console_runner.exe' use this function?
It is written in source code.
//Windows's system() seems to not be able to handle parentheses in
//the path, so we have to launch the program a different way.
( See this svn log. )
So I complied the 'cb_console_runner.exe' using system() instead of CreateProcess().
In my windows7, It works well and it seems that there is no problem about parentheses.
( That was modified in 2006. Now does it fixed?. I don't know. )
Anyway I replaced the 'cb_console_runner.exe' with my own build.
If anyone having a redirection problem in windows version of Code::Blocks, try this one.
(Just copy to where Code::Blocks installs and replace original file with this)
Or you can build it easely with just a few modification. (That's why I didn't attach soruce code.)
I modified and built this in Code::Block. ;)
P.S
영어로 쓰고 나니 진에 빠져서, 한글로 내용을 다시 쓰는건 패스.
도대체 구글링 해도 시원하게 답해주는 사람이 없어서,
직접 원인을 찾아서 수정한 버전을 사용하기로 함.