linux 2013.10.16 02:03

Taking a web page's screenshot on CLI only environment

 모종(=알바)의 이유로, 백엔드 단에서 특정 URL을 받으면, 그 URL에 해당하는 웹 페이지의 스크린 샷을 찍어서 돌려줘야 하는 작업을 하게 되었다. 처음엔 불가능할 줄 알았는데(+그냥 보라고! 왜 이걸 서버를 시켜!), 언제나 방법은 있더라. 

 wkhtmltoimage가 바로 그것이다. 이 프로그램은 CLI 환경에서 특정 URL을 jpg나 png로 저장할 수 있도록 해준다(자매품으로 wkhtmltopdf 같은 것도 있다). X Server를 통해 웹 페이지를 Graphically Rendering한 다음, 이에 대한 스크린샷을 만드는 것이다(라고 삽질 결과 예상해본다). 그러나 순수한 CLI 환경에선 X Server 같은걸 키우질 않는다. 이걸 어찌해야 할까? 오늘 이 포스트에서 정리할 내용은 이에 대한 해답을 찾는 삽질 과정이다.

 갑님이 제공해주신 서버가 CentOS인 관계로 오늘 설명은 CentOS 6.2 기준으로 한다. 난 우분투가 좋은데......

Part 1. Install wkhtmltoimage

먼저 wkhtmltoimage를 설치한다. yum은 아니고, wget으로 tarball을 받는다.

[root@xx html]# wget http://wkhtmltopdf.googlecode.com/files/wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

[root@xx html]# tar xvf wkhtmltoimage-0.11.0_rc1-static-i386.tar.bz2

의외로, 압축을 푼 결과는 컴파일해야하는 소스가 아닌 바이너리이다. 편하네(물론 제대로 실행이 안 되면 안 편하겠지만). 그 다음 wkhtmltoimage를 /usr/bin으로 옮겨준다(취향). 권한 설정도 잊지말고 하자.

[root@xx wkhtmltoimage-0.11.0_rc1-static-i386]# mv wkhtmltoimage-i386 /usr/bin/wkhtmltoimage

[root@xx bin]# chmod a+x /usr/bin/wkhtmltoimage

그리고 사용법 대로 한번 써본다.

[root@xx html]# wkhtmltoimage www.google.co.kr google.jpg

Loading page (1/2)

Rendering (2/2)                                                    

QPixmap: Cannot create a QPixmap when no GUI is being used   ] 25%

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

QPixmap: Cannot create a QPixmap when no GUI is being used

Segmentation fault

 wow... segfault... 물론, 이래서 되면 삽질이라고 안 했겠지. wkhtmltoimage는 X 환경을 필요로 하는 것이었다. 정말 CLI만 되는 환경에서 그래픽 렌더링이 될줄 믿고있던 내가 바보지.

Part 2. Install Xvfb

 그런데, Only CLI 환경에서 X Window를 깔아서 풀 그래픽을 보는 건 영 미덥지 않다. 그리고 역시 나 말고도 이런 생각을 한 사람은 있었다. 그래서 우린 X Window 대신 CLI 환경에서 X Window Desktop을 가상으로 만들어주는 Xvfb라는 것을 설치하기로 한다.

[root@xx html]# yum -y install Xvfb (대소문자 구분 주의!)

그리고 역시 구글링을 통해 Xvfb의 사용법을 알아내서 한번 가상의 X Window를 만들어 본다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24

대충 '1번 (가상)Display에 1024x768, 24bit짜리 가상 스크린을 만든다' 라는 뜻이다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24

Could not init font path element unix/:7100, removing from list!

역시 공짜는 없지. font path를 보아 하니 X Font Server 관련 문제임을 유추할 수 있다. X Window 환경에 대해 자세히 파본 적은 없지만 언뜻 어깨너머 본 바로는 X Window의 구성요소 중엔 폰트 렌더링을 담당하는 Font Server가 있단 소릴 들은 적이 있어서.

Part 3. Install & Run xfs

 문답무용

[root@xx html]# yum -y install xfs

xfs가 설치되었다. xfs 구동

[root@xx html]# xfs&

[1] 12116

[root@xx html]# xfs notice: ignoring font path element /usr/share/X11/fonts/100dpi:unscaled (unreadable)

xfs notice: ignoring font path element /usr/share/X11/fonts/Type1 (unreadable)

xfs notice: ignoring font path element /usr/share/fonts/default/Type1 (unreadable)

뭐라 잡설이 많지만, 어쨌든 구동 된다. 정말? 하는 생각이 들면 ps aux | grep xfs

Part 4. Ace!

 이제 웬만한 건 대충 해결 본 것 같으니, 다시 Xvfb를 구동한다.

[root@xx html]# Xvfb :1 -screen 0 1024x768x24&

[2] 12118

잡설 없이 돌아간다. 그리고 그동안 삽질하며 알아낸 wkhtmltoimage 옵션을 지정해서 다시 써본다.

[root@xx html]# wkhtmltoimage --use-xserver www.google.com google.jpg

wkhtmltoimage: cannot connect to X server

???? X server 켰잖아. 스크린 만들었잖아. 근데 왜?? 하면서 삽질하는건 내 몫이고, 이거 보는 사람들은 내 삽질의 결과를 이용하겠지

[root@xx html]# export DISPLAY=:1

--use-xserver를 할 때, 환경 변수의 DISPLAY 변수를 보는 것 같다. 추가해주자.

[root@xx html]# wkhtmltoimage --use-xserver www.google.com google.jpg

Loading page (1/2)

Rendering (2/2)                                                    

Done

넵. 끝

Part 5. Result, Future Research

한글 폰트가 깨져있는 구글 스크린샷 보내드렸습니다...

 xfs에 한글폰트를 어떻게 조지면 해결될 것 같지만, 그건 귀찮으니 알아서 방법을 찾아보시길.. 사실 필자도 아직 방법을 안 찾아봤다. 귀찮아서.. 어쨌든 되는걸 확인한 다음이면 그날은 흥미가 확 떨어진다. php등에서 응용하려면 exec()를 써주면서 귀찮은 권한문제에 대해 생각해보자. 여기까지.

Part 6. 소감

재밌었다. 신기했다.

Appendix. 한글 폰트 설치

 해결 방법은 의외로 간단했다.

[root@xx html]# yum -y install fonts-korean

[root@xx html]# fc-cache

[root@xx html]# yum groupinstall -y korean-support -x xorg-x11-server-Xorg

다시 스크린샷을 찍어보면 한글이 잘 표시될 것이다.

신고

'linux' 카테고리의 다른 글

Linux VFS kernel(1)  (0) 2014.12.08
Ports below 1024 can be opened only by root.  (0) 2014.03.24
Taking a web page's screenshot on CLI only environment  (0) 2013.10.16
[Ubuntu] vsftpd umask  (0) 2013.07.26
Tunneling SSH over HTTP(S)  (0) 2012.12.10
Setting Ubuntu Server 12.04 on VMWare  (0) 2012.12.07
Tip/programming 2013.08.20 15:55

[Sublime Text] SublimeLinter 1.7.2 Exception

다음과 같은 에러가 나타난다.

An exception occured when running pep8 checker: 'int' object has no attribute 'lineno'

해결법

1. SublimeLinter가 설치된 경로로 들어간 다음

2. /loc/to/sublimelinter/modules/libs/pyflakes/messgae.py 의 12번째 줄을

3. self.lineno = loc

로 수정한다.

https://github.com/SublimeLinter/SublimeLinter/pull/520/files

신고

'Tip > programming' 카테고리의 다른 글

Flask Tutorial  (0) 2013.11.23
[Sublime Text] SublimeLinter 1.7.2 Exception  (0) 2013.08.20
git cheat sheet  (0) 2013.06.08
IDE에서 C++11 Standard를 지원하는지 확인하는 방법  (0) 2013.05.31
Visual Studio 작업물을 메일로 보낼 때 주의사항  (0) 2013.05.31
tree.hh  (0) 2013.05.17
Tip/mac os x 2013.07.31 18:42

[VMWare Fusion] Port Forwading

 Windows용 VMWare엔 포트포워딩을 포함한 네트워크설정이 아주 친절하게 GUI로 접근하도록 되어있지만, OSX에선 아니다. 그렇다고 못할건 없지만... 여기선 VMWare에서 돌아가는 VM의 네트워크가 NAT로 설정되어 있음을 가정한다.

-1. 필자의 네트워크 환경

 하나의 공유기 내에 맥북과 다른 랩탑이 한대 붙어있고 맥북 내부에선 VMWare의 NAT환경으로 VM들이 붙어있는 상황. 목적은 다른 랩탑에서 맥북 내부에서 돌아가는 VM에 접속해 작업을 이어서 하는 것. 공유기 자체에서의 포트포워딩에 대한 내용은 각자 잘 찾아보시길

0. 일단 모든 VM을 끄고 VMWare를 종료한다.

1. 다음과 같은 명령어로 VMWare Fusion의 가상 NAT 어댑터(내부에선 vmnet8인가보다) 설정파일을 연다. 스크린샷이 잘려서 보인다면, 그 설정파일은 /Library/Preferences/VMWare\ Fusion/vmnet8/nat.conf 이다.

2. 내리다보면 [incomingtcp]라는 부분이 있는데, 이 부분에 다음과 같은 양식으로 포워딩해준다

[외부 포트] = [VM의 IP]:[VM 내부 포트]


스크린샷은 예시로, Django 개발을 위해 Sublime FTPSync를 이용할 FTP 포트, VM의 SSH 포트, VM의 HTTP포트를 열어놓았다.

3. VMWare를 실행하고 VM을 다시 켠다.

4. 외부에서 접속되는지 테스트 해본다.

신고

'Tip > mac os x' 카테고리의 다른 글

[VMWare Fusion] Port Forwading  (0) 2013.07.31
VMWare Fusion에서 background로 VM 돌리기  (0) 2012.09.05
1 2 3 4 5 6 ... 14


티스토리 툴바