Monthly Archives: November 2008

sawfish 윈도우 메니저

유닉스의 X 윈도우는 윈도우 테두리와 동작등을 담당하는 부분이 빠져있는데, 이 부분을 윈도우 메니저가 처리합니다. 수십 개 이상의 윈도우 메니저가 존재하며, 각각 기능이 천차만별이라 같은 X 윈도우를 사용한다고 해도 모양이나 사용방법은 전혀 틀려집니다. 같은 윈도우 메니저라 해도 설정이 자유로운것이 많아서 모양이나 동작등도 사용자들이 커스터마이징을 많이해서 사용합니다.

예전에 GNOME 데스크탑의 디폴트 윈도우 메니저였던 sawfish가 안타깝게 metacity에게 자리를 내어주었지만… 제 개인적인 생각으론 metacity는 기능이 좀 부족하더군요. 커스터마이징 면에서 낮은 점수를 받을수 밖에 없습니다. “일반 사용자들을 위한 디폴트 윈도우 메니저”로 선택되었으니 커스터마이징은 중요한 요소가 아니였나봅니다.

예전엔 이름이 sawmill이였는데… 다른 소프트웨어가 그 이름을 사용중이라고 sawfish로 바꿨습니다. sawfish는 LISP 와 유사한 언어(rep)로 커스터마이징이 가능합니다 :) 물론 LISP을 알면 더 자유로워질수 있지만(^^), 몰라도 sawfish-ui 로 커스터마이징이 가능합니다.

X 윈도우의 윈도우 메니저들은 대부분 가상 데스크탑을 지원하는데.. MS윈도우즈에 있는 가상 데스크탑 프로그램들은 많이 구해서 사용해봤는데 많이 부족하더군요. 기능이 부족하기 보다, 기본적인 기능이 제대로 동작하는걸 찾지 못했습니다. 데스크탑 이동할때 포커스를 제대로 잡아주는 프로그램을 아직 접하지 못했네요. litestep이 그나마 사용할만하지만 이건 쉡을 바꾸는거라 불편이 따르더군요. 하여간 제가 윈도우즈용 프로그램도 개발하지만, 데스크탑에 리눅스를 깐건 이 가상 데스크탑 기능이 정말 그리워서였죠. 옆에 윈도우즈 노트북이 있으니 윈도우 프로그래밍 작업은 원격으로 연결해서 작업하거나 vmware에서 작업합니다.  2000년, 2001년에 있던 회사에서는 유닉스 프로그램만 개발해서 리눅스를 데스크탑으로 썼었습니다. 이때 썼던 윈도우 메니저가 sawfish 였고요.

뭐 X 윈도우와 윈도우 메니저를 접한건 94년 정도로 올라가는데 (학교 워크스테이션실), 그때 있던게 mwm(motif)과 openlook(olwm?)과 fvwm이였죠. fvwm이 오픈소스라 fvwm을 사용했었습니다. fvwm의 추억의 색(붉은색+하늘색)은 아직도 기억에 남네요. 그후 리눅스를 PC에 깔면서 꽤 많은 윈도우 메니저를 사용해봤습니다. 대부분 쓸만하지만 저는 화려한거보다는 가볍고 빠르고 커스터마이징이 자유로운걸 사용하게 되더군요. fvwm2, icewm 등을 많이 썼었고, 결국 sawfish로 정착했습니다.

꽤 오랜만에 회사의 메인 PC에 리눅스(우분투)를 깔았습니다. 윈도우즈 개발은 원격으로 옆의 노트북이나 집 PC에 연결해서 개발합니다. 노트북의 화면을 활용하기 위해서 synergy를 사용하기도 했었는데 저는 가상 데스크탑이 더 편하더군요. 오래전에 듀얼 모니터(20인치 CRT)도 사용해봤지만 고개 왔다갔다 하는거보다 키보드로 가상화면 이동하는게 더 편하더군요.

sawfish에서 제가 좋아하는 기능이 pack window와 창채우기(maximize-fill-window) 기능입니다. 단축키 잘 할당해 놓으면 창위치 잡기 위해서 마우스로 손이 갈 필요가 거의 없습니다. 그리고 마우스로 위치와 크기 조정하는거보다 더 빠르고 잘 배치를 할수 있죠.

아래는 제가 사용중인 설정입니다.

(custom-set-keymap
(quote global-keymap)
(quote (keymap
    (cycle-windows . “M-TAB”)
    (show-desktop . “H-d”)
    ((run-shell-command “nautilus”) . “H-e”)
    ((run-shell-command “vmware”) . “H-v”)
    ((run-shell-command “evolution –component=mail”) . “H-m”)
    ((run-shell-command “gnome-terminal”) . “H-t”)
    ((run-shell-command “firefox”) . “H-f”)
    ((activate-workspace 1) . “H-1″)
    ((activate-workspace 2) . “H-2″)
    ((activate-workspace 3) . “H-3″)
    ((activate-workspace 4) . “H-4″)
    ((activate-workspace 5) . “H-5″)
    ((activate-workspace 6) . “H-6″)
    (next-workspace . “M-C-Right”)
    (pack-window-left . “C-S-Left”)
    (pack-window-right . “C-S-Right”)
    (pack-window-up . “C-S-Up”)
    (pack-window-down . “C-S-Down”)
    (maximize-fill-window-toggle . “C-F”)
    (maximize-window-vertically-toggle . “C-V”)
    (maximize-fill-window-horizontally-toggle . “C-H”)
    (pack-window-up . “C-I”)
    (pack-window-down . “C-K”)
    (pack-window-left . “C-J”)
    (pack-window-right . “C-L”)
    (previous-workspace . “M-C-Left”))))
(custom-set-keymap
(quote window-keymap)
(quote (keymap
    (raise-and-pass-through-click . “Button1-Click”)
    (size-window-subtract-column . “H-Left”)
    (size-window-add-column . “H-Right”)
    (size-window-subtract-row . “H-Up”)
    (size-window-add-row . “H-Down”)
    (send-to-next-workspace . “M-C-S-Right”)
    (send-to-previous-workspace . “M-C-S-Left”)
    (move-window-interactively . “W-Button1-Move”)
    (popup-window-menu . “W-Button2-Click”)
    (delete-window-instance . “M-F4″)
    (resize-window-interactively . “W-Button3-Move”)
    (lower-window . “M-C-Down”)
    (raise-window . “M-C-Up”))))

가상화면 전환은 Ctrl-Alt-Left, Ctrl-Alt-Right, Win-1 ~ Win-6 까지 이용합니다. 창을 다른 가상화면으로 옮길때는 Ctrl-Alt-Shift-Left, Ctrl-Alt-Shift-Right을 이용합니다. 창이동은 Ctrl-Shift-화살표를 이용합니다. 창이동하는 함수가 pack-window-up … 등의 함수인데.. 픽셀 단위로 움직이는게 아니라 다른 창에 붙도록 이동합니다. 익숙해지면 편합니다. 원하는 곳에 잘 붙지 않을때가 있는데… 사용해보면 익숙해집니다. 원하는 위치를 잡으면… Ctrl-Shift-f 로 빈곳을 채울수 있습니다. 다른 창 영역은 침범하지 않으니 다른 창들과 함께 창을 나눠서 쓸때 딱입니다. Ctrl-Shift-v와 Ctrl-Shift-h로 세로/가로 따로 창을 채울수도 있습니다.

저는 주로 가상화면에 한꺼번에 띄울 창들을 실행하고, 창들을 Ctrl-Shift-화살표로 원하는 곳으로 이동하고, 크게 보고 싶은 창부터 창채우기합니다. 창크기 조절을 세밀하게 하고 싶으면 Win-커서키를 눌러서 조절하던가, 마우스로 창크기를 조절하고 창채우기하면 됩니다. 창크기 조절할때 마우스로 끝 잡기가 귀찮아서 Ctrl-오른쪽 마우스(resize-window-interactively) 누르면 창크기가 바로 조절되게 세팅했습니다.

Win-e, f, m, t, v키에는 자주 사용하는 어플들을 등록했습니다. 탐색기(nautilus), Firefox, Mail, Terminal, VmWare.

스크린샷을 찍어봤지만.. 뭐 특별한건 없습니다. 일반 그놈 패널에… 가상화면마다 창들이 많이 붙어있죠. 오른쪽 메신저(Pidgin)은 MSN+nateon 같이 사용하니 편하더군요. 친구리스트는 gimp로 블라인딩처리~

원격접속(rdesktop)을 이용할때는 키보드는 모두 rdesktop으로 가게 했습니다. 가상화면 이동할수 있으면 좋겠지만… 윈도우메니저에서 먼저 키보드 처리하면, 윈도우즈 사용시 여러가지로 불편하더군요. 대신 가상화면창에서 마우스 휠을 움직입니다. 마우스 휠로 가상화면 이동이 가능합니다. 그리고 원격접속이나 vmware는 가상화면을 4,5,6번으로 고정시켰습니다. 4번은 옆의 노트북 rdesktop, 5번은 vmware, 6번은 집 rdesktop. 메일은 2번, 기타 작업 공간은 1, 3번을 쓰고 있습니다. 1번은 메신저와 가벼운 웹브라우징, 3번은 노트북(4번)과 같이 작업할때 쓰는 공간입니다. 그리고 혹시를 위해서 가상화면 7, 8번은 여유 공간입니다.

rdesktop은 아래처럼 띄웁니다.

rdesktop.sh -u 아이디 -p 패스워드 -k ko -g workarea -r disk:root=/ -r sound:local -T “rdesktop – notebook” 아이피주소

rdesktop.sh은 rdesktop을 호출하기 전에 사운드 장치를 공유할수 있도록 했습니다.

% cat /usr/bin/rdesktop.sh
#!/bin/sh
LD_PRELOAD=libaoss.so exec /usr/bin/rdesktop “$@”

-k ko는 한영키를 위해서 필요하고, -g workarea 옵션을 주어 전체 공간을 사용하도록 합니다. 원격에서 리눅스 폴더 전체 보이게하고, 소리는 리눅스로 보내도록 했고, 창이름을 지정했습니다. 창 이름을 지정하여 sawfish에서 몇가지 작업을 해줍니다.

(custom-set-typed-variable
(quote match-window-profile)
(quote
    (((WM_NAME . “^rdesktop – notebook$”))
     (workspace . 4)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_NAME . “^rdesktop – home$”))
     (workspace . 6)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_CLASS . “^Vmware/vmware$”))
     (workspace . 5)
     (maximized . all)
     (frame-type . none))))

가상화면을 4번으로 고정시키고, 창크기를 최대화하고, 창테두리를 안그리게 했습니다. 그놈패널을 제외한 모든 영역이 윈도우즈가 차지하도록 했습니다 :)


요즘 제가 사용하고 있는 환경인데… 역시 불편한점은 있습니다. 먼저 메신저로 받은 파일을 네트워크에 공유해서 받아야하는 불편함이 있습니다. 대부분 파일들은 리눅스(오픈오피스)에서도 잘 열리지만.. (docx 포함) 편집은 아직 불편한 점이 많더군요. 왠만하면 리눅스에서 처리하고, 꼭 필요하다면 윈도우즈 쪽으로 옮겨서 작업하고 있습니다.

11월11일 추가내용: 우분투에서 설정 방법

우분투의 패키지 메니저인 synaptic에서 sawfish로 검색해서 설치했습니다. 아래처럼 설치되어있습니다.


그리고 Gnome 세션을 사용하고 홈디렉토리에 .gnomerc를 아래처럼 만들어주고 다시 로그인하면 윈도우 메니저가 sawfish로 변경됩니다.

% cat ~/.gnomerc
export WINDOW_MANAGER=/usr/bin/sawfish

Flash Develop의 유용한 기능들

원래 2008년 4월달에 썼던 글인데 이제야 공개하네요 –;

Flash에서 제공되는 ActionScript 편집기가 안습이죠..
가장 불편한거는 인텔리센스가 내부 클래스 외에는 거의 안된다는 점이죠.

Flex에서 as를 편집하고 Flash에서 Ctrl-Enter로 실행하는 방법도 있지만,
아직 연동이 원활히 안된다고 하네요.

Flash Develop에서는 좀더 편하게 작업할수 있게 되어있습니다.

Flash Develop은 아래에서 다운 받을수 있습니다.
   http://www.flashdevelop.org/community/viewforum.php?f=11

.NET Framework 2.0 이상이 필요합니다.
   .NET Framework 3.5 다운로드

Flash Develop은 AS2, AS3, Haxe 언어를 지원합니다. mtasc라는 오픈소스 AS2 컴파일러가 있는데 OCaml 언어로 제작되었고, 컴파일 속도도 15배 이상 빠르다는 테스트 결과도 있습니다. AS2 언어 자체에 약간 문제가 있어서 몇가지 고쳐서 Haxe라는 언어가 개발되었습니다. Haxe는 클라이언트 단에서만 쓰는게 아니라 서버에서도 사용할수 있는 라이브러리도 제공됩니다. Motion Twin이라는 회사에서 이 작업을 하는데… 불행히도 AS3 컴파일러는 제작되지 않고 있다고 하네요..

ActionScript는 Javascript와 마찬가지로 ECMAscript라는 유럽 표준안을 따라서 구현되었는데… 위원회를 통해서 언어가 확장되기 때문에 AS3에서는 표준이 아직되지 않은 여러가지 기능들이 먼저 구현되었다고 합니다.

Flash Develop 사용방법 및 장점

  • AS3 Flash IDE 프로젝트를 만들고 Classpath를 설정해야합니다.
  • Ctrl-Enter또는 F5로 실행할수 있습니다.

           (먼저 fla 파일을 열어야하고, 마지막 연 fla가 실행됩니다)

  • Flash 내부 편집기보다 편집기가 훨씬 쓸만합니다.
    • 인텔리센스가 모든 클래스에서 동작합니다.
    • code snippet 기능이 있습니다. ( if<tab> 또는 Ctrl-b 눌러보세요)
    • 북마크기능 Ctrl-F2 정의, F2 이동
  • Outline 뷰를 제공합니다.
  • F4로 정의로 바로 이동할수 있습니다. (shift-F4로 이전 위치로 이동)
  • F4로 Flash 라이브러리 대부분 소스로 이동해서 볼수 있습니다.
  • F7로 현재 파일의 문법오류를 빠르게 점검할수 있습니다. – (Flash IDE로 이동안함)
  • F8로 빌드만 할수 있습니다. (실행은 안함)
  • Ctrl-Shift-1 : 정말 유용한 기능입니다. 꼭 기억해두세요 ㅎㅎ 여러가지 기능을 제공하므로 아래에서 설명할께요.

Ctrl-Shift-1: 어디서 키를 누르느냐에 따라서 여러가지 동작을 합니다. 제가 알고있는거 기능에 대해서 설명합니다.

1. 정의되지 않은 이벤트 핸들러에서 누르면 function이 생성됩니다.

imgBox.addEventListener(MouseEvent.CLICK, onImgClick);

onImgClick에 커서를 올리고 Ctrl-Shift-1을 누르고 메뉴 첫번째 선택하면~

      private function onImgClick(e:MouseEvent):void
       {
          
       }

위에처럼 함수가 생성됩니다.

2. 로컬 변수를 멤버 변수로 뺄수 있습니다.

함수내에서 정의된 변수 선언 위에서 Ctrl-Shift-1 누르면 “promote to class member” 메뉴가 뜹니다. 선택하면 멤버 변수로 빼줍니다.

3. 인터페이스 구현할때 인터페이스에 맞춰 함수 정의를 만들어줍니다.

public class MyImplementation implements IInterface {

위에서 IInterface위에서 Ctrl-Shift-1 누르면 자동으로 함수들이 쭈루룩 만들어집니다.

4. 멤버 변수의 getter/setter를 정의할수 있습니다.

       private var myVar:int = 0;

변수 위에서 Ctrl-Shift-1을 누르면 세가지 메뉴가 뜹니다. “getter and setter”, “getter”, “setter”. 맨앞의 메뉴 선택하면 함수 두개가 생성되고, 변수명은 밑줄로 시작하도록 바뀝니다.

       private var _myVar:int = 0;

       public function get myVar():int { return _myVar; }
      
       public function set myVar(value:int):void
       {
           _myVar = value;
       }

지금 찾아보니 FlashDevelop 위키에 설명되어 있네요.

CentOS 5.2에서 lighttpd 설치

전에 CentOS 4에서 lighttpd 설치하는 방법에 대한 글을 썼었는데 5에서는 설치가 많이 편해졌네요 :)

저는 CentOS 5.2 x86_64 버전에서 설치하였습니다.

lighttpd는 http://dag.wieers.com/rpm/packages/lighttpd/ 에서 바이너리를 구해서 설치했습니다. 32 비트 버전에서는 i386.rpm을 받아서 설치하세요~

# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-1.4.18-1.el5.rf.x86_64.rpm
# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm
# rpm -i lighttpd-1.4.18-1.el5.rf.x86_64.rpm lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm

php는 따로 컴파일하지 않고 php-cli 패키지에 포함된 /usr/bin/php-cgi 를 이용하면 되더군요. xcache는 소스를 받아서 설치했습니다.

lighttpd와 php(php-cli) 설치하시고 /etc/lighttpd/lighttpd.conf를 편집합니다. php fastcgi설정과 sys epoll 사용하도록 설정하는건 필수죠~

fastcgi.server              = ( “.php” =>
                               ( “localhost” =>
                                 (
                                  “socket” => “/tmp/php-fastcgi.socket”,
                                  “bin-path” => “/usr/bin/php-cgi”,
                                  “min-procs” => 1,
                                  “max-procs” => 2,
                                  “max-load-per-proc” => 4,
                                  “idle-timeout” => 10,
                                  “bin-environment” => ( “PHP_FCGI_CHILDREN” => “16”,
                                                         “PHP_FCGI_MAX_REQUESTS” => “2000” )
                                 )
                              )
                             )

server.event-handler = “linux-sysepoll”

xcache는 http://www.howtoforge.com/xcache-php5-apache2-fedora8-centos5.1 를 참고해서 설치했습니다. 과정이 다 필요한지는 모르겠지만 그냥 그대로 따라했습니다.

# yum install php-devel
# yum groupinstall ‘Development Tools’
# yum groupinstall ‘Development Libraries’
# wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
# tar xzvf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# phpize
# ./configure –enable-xcache
# make
# make install
# cp xcache.ini /etc/php.d
# vi /etc/php.d/xcache.ini

마지막 ini 파일 편집시 zend_extension은 모두 주석처리하고 extension = xcache.so만 주석을 풀었습니다.

마지막으로 시스템 시작할때 lighttpd 실행할수 있도록, 아파치 대신 lighttpd를 실행되도록 했습니다.

# /usr/sbin/apachectl stop
# /sbin/chkconfig httpd off
# /sbin/chkconfig –add lighttpd
# /sbin/chkconfig lighttpd on
# /etc/init.d/lighttpd start

방화벽(iptables)은 설치할때 22와 80번 포트는 풀어줬었습니다. 혹시 방화벽이 안 풀려있다면… /etc/sysconfig/iptables 파일을 편집해서 다음 라인을 적당한 곳(REJECT 이전)에 넣고…

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

iptables를 다시 시작하고 설정을 저장~ (저장 안하면 리부팅하면 설정 날라가요)

# /etc/init.d/iptables restart
# /etc/init.d/iptables save

그리고 selinux 기능을 사용중이고 일반 사용자 계정에서 웹페이지가 서비스 되게 하려면…

# su – webuser
$ chmod og+x ~
$ chcon -R -t httpd_user_content_t public_html