Code Metaphor

Programming, Writing, Reading, Thoughts…

이 블로그는 더이상 운영되고 있지 않습니다. 단지 예전 URL을 유지하는 용도로만 남아 있습니다. 새 블로그의 주소는 blog.dahlia.kr입니다.

Archive for January, 2009

KT 메가패스의 인증 자동화 ⑵

Wednesday, January 28th, 2009

전에 KT 메가패스의 인증을 자동화하는 스크립트를 만들었는데, 결국 그것을 iMac이 잠자기에서 깼을 때 실행되게 만들지는 못했다. 그래서 고민을 더 하다가, 아예 HTTP 프록시로 구현해볼 수도 있지 않을까 싶었다. 그래서 전에 만들었던 Perl 스크립트를 좀더 확장하여 HTTP 프록시 데몬을 구현했다. 내가 사용한 모듈은 원본 스크립트에서도 썼던 WWW::Mechanize와 HTTP 프록시를 정말 쉽게 구현하게 해주는 HTTP::Proxy, 몇줄의 코드로 데몬을 만들 수 있게 해주는 Daemon::Generic, 이렇게 셋이다. 당연히 CPAN으로 쉽게 설치할 수 있다.

내 기본적인 아이디어는, 어떠한 HTTP 요청이 일어났을 때 그 요청이 직접 원격지로 전달되는 대신 프록시로 전달되게 하고, 프록시에서 그 요청을 원격지로 했을 때 “Please wait while you are redirected” 어쩌고 하며 KT 메가패스 인증 페이지로 리다이렉션시키는 응답이 오면 프록시가 자동으로 인증을 하고—이 부분은 기존 스크립트를 그대로 썼다—하려던 요청을 다시 하는 것이다. 당연히 한번 인증이 된 이후로는 KT 메가패스 인증을 가지고 뭐라하지 않기 때문에 프록시는 투명하게 동작하게 된다.

HTTP::Proxy에는 필터를 크게 HTTP::Proxy::HeaderFilterHTTP::Proxy::BodyFilter 두 종류 지원하는데, 나는 헤더를 가지고 할 작업은 없으므로 후자를 구현했다. 사실 실제로 어떤 여과를 하지 않고 투명한 결과를 내는 필터지만, 중간에 아무말 없이 인증을 시도하게 된다. 그러니까 HTTP::Proxy 저자가 모듈을 디자인할 때 의도한대로 사용하는 것이 아니라, 부수 효과(side effect)를 이용하는 셈이다.

아래 코드는 KTAuthFilter.pm 파일의 내용이다.

package KTAuthFilter;
use base qw( HTTP::Proxy::BodyFilter );

use warnings;
use strict;
use WWW::Mechanize;
require LWP::UserAgent;

sub filter {
    my ($self, $dataref, $message, $protocol, $buffer) = @_;
    return unless $message->isa('HTTP::Response');
    return unless 1024 > length $$dataref;
    return unless $$dataref =~ /Please wait while you are redirected/i;

    my $mech = new WWW::Mechanize;
    $$dataref =~ /d+;s*url=(https?://[^"]+)/i;
    $mech->get($1);

    $mech->submit_form(
        form_number => 2,
        fields => {
            userID => '<YOUR ID GOES HERE>',
            userPW => '<YOUR PASSWORD GOES HERE>'
        }
    );

    my $ua = LWP::UserAgent->new;
    my $response = $ua->request($message->request);
    $message->headers->clear();

    foreach my $field ($response->headers->header_field_names) {
        $message->headers->header(
            $field => $response->headers->header($field)
        );
    }

    $$dataref = $response->content;
}   

1;

이렇게 필터를 구현했으니 이제 가져다 쓰기만 하면 된다. Daemon::Generic은 gc_preconfiggc_run만 정의하면 아주 잘 돌아간다. 아래 코드는 ktauth-htproxyd 파일이다. 나는 이 파일에 실행 권한을 주었다.

#!/usr/bin/env perl
use warnings;
use strict;
use HTTP::Proxy;
use KTAuthFilter;
use Daemon::Generic;

newdaemon(
    progname => "ktauth-htproxyd",
    pidfile  => "/var/run/ktauth-htproxyd.pid"
);

sub gd_preconfig {
    return ();
}

sub gd_run {
    my $proxy = HTTP::Proxy->new(port => 8888);
    $proxy->push_filter(response => KTAuthFilter->new());
    $proxy->start;
}

이리하고 직접 데몬을 시동시켜봤다.

$ sudo ./ktauth-htproxyd start
Starting ktauth-htproxyd server

잘 된다. 하핳. 그 이후에는 Mac OS X의 System Preferences에 가서 Network, Advanced…, Proxies의 “Web Proxy (HTTP)” 항목을 켜고 localhost:8888을 프록시로 연결시키면 된다.

System Preferences에서 HTTP Proxy 설정하기

초중고 컴퓨터 교육

Friday, January 9th, 2009

일단 난 ‘컴퓨터’라는 과목 자체가 사라지고, 다른 과목들 사이에 흡수되어야 한다고 본다. 나는 컴퓨터 교육을 학교에서 받아본 거의 첫 세대이고, 다녔던 선린인터넷고등학교 같은 경우 일반 교실보다 컴퓨터 실습실이 더 많은 학교였다.1 그런데 컴퓨터 과목이라고 따로 해봤자 애들 게임밖에 안 하더라.2 아무튼 컴퓨터 과목이 따로 있을 필요가 있을까 하는 생각이 예전부터 들었다.

타자법은 거의 펜으로 글 쓰는 법과 비슷하다. 요즘에는 연필 잡고 글 쓰는 것을 언제 배우게 되어있는지 잘 모르겠지만, 연필 쓰는 법을 알려준 다음에 바로 타자법도 같이 가르쳐야 한다고 본다. 나 같은 경우에는 타자법이든 연필 잡는 것이든 제대로 배우질 못해서 아직도 엉망인데, 나 같은 사람이 줄어야겠다. 컴퓨터 학원3이랍시고 가서 타자 배우고 워드프로세서 배우고… 이런 건 좋지 않다.

중고등학교 컴퓨터 과목에서 홈페이지 만들기라던가, 그런 주제로 HTML이나 나모 웹에디터를 가르치곤 하는데, 그걸 그렇게 따로 알려줄 필요가 없다. 어차피 제대로 배우지도 못하고, 오히려 안 좋은 방법을 많이 배운다. 그럴 것이 아니라, HTML은 중학교 국어 시간에 가르쳐야 한다. HTML 알려주기 전에 일단 문단(paragraph) 개념부터 탑재해줘야 한다. 요즘 사람들 보면 어째 연령불문하고 남녀노소 교양 없게 문단을 지키질 못한다. 책 많이 읽어도 문단 못 지키는 사람은 종종 있다. 그 다음에 인용과 출처에 대해 알려줘야 한다. 이런걸 배우질 못하니 사람들이 이것저것 분별없이 주워듣고 쉽게 믿는 것이 아니겠는가. 출처랍시고 “스펀지에서 나온 거야” 같은 소리하는 사람이 내 주변에 적지가 않다. 안타까울 따름이다. 그 다음에 하이퍼텍스트에 대해서 알려줘야 한다. 하이퍼텍스트가 뭔지도 모르는데 인터넷이니 웹이니 떠들고 가르쳐봐야 하나 소용 없다. 인용과 출처에 대해 알려주고 나서 하이퍼텍스트를 가르치는 것은 꽤 괜찮은 순서라고 생각한다. “본래 텍스트에서는 인용을 하고 출처를 표기하거나, 각주, 미주 따위를 이렇게 달아야 한다”라고 최근에 배운 상태에서, “그런데 하이퍼텍스트에서는 그것을 하이퍼링크라는 방식으로 한다”라고 알려주면 얼마나 이해하기 쉽겠나.

알려줄 때 한번 발행한 문서의 URL은 되도록이면 유지하는 것이 좋다는 것을 윤리적인(?) 차원에서 일러두는 것도 필요하지 않을까. 그리고 그러한 문서를 파기할 때는 어떻게 하는 것이 좋은지도 알려줘야 한다.

물론 HTML에 대해서는 그 때 바로 알려줄 필요는 없다. 하지만 구두법이나 맞춤법, 원고지 쓰는 법을 배우는 것과 같은 수준에서 HTML을 가르칠 필요는 있다. 원고지 갖다주면 대부분은 꼭 제대로 지키는 것은 아니라도, 지키려고 노력을 한다. 그런데 웹에서 글을 쓰는데는 다들 그런거 신경쓰지 않는다. 이건 그냥 배우지 않아서 그러는 거라고 생각한다. 원고지 쓰는 법 배우고 나서 HTML도 같이 가르쳐야 한다. 제목 짓는 방법(<title>, <h1>, <h2>…), 저자 이름 표시하는 방법(<meta>), 문단 구분하는 법(<p>), 하이퍼링크 거는 방법(<a>), 강조법(<em>, <strong>), 인용하고 출처 표시하는 방법(<q>, <blockquote>, <cite>), 열거법(<ul>, <ol>, <li>), 마지막으로, 운문을 쓸 경우에 <br> 태그를 쓰면 된다는 것도 알려줘야 한다. 문단을 <br>로 구분하면 안 되는데, 사람들이 이걸 싫어서 안 지키는 것이 아니라 몰라서 그냥 쓰는 것일 뿐이다. 알려주면 문단을 구분하는데 <p> 태그를 쓰지 <br><br>이라고 쓰진 않을 것이다.

꼭 HTML 태그를 직접 쓰게 할 필요는 없을지도 모르겠다. WYSIWYG 에디터를 사용하게 해도 괜찮을 것이다. 그러나 역시 나모 웹에디터 같은 특정 기업에서 만든 제품을 쓰게 하면 안 된다.4 반대로 홈페이지 만들어보는 수업은 없어도 괜찮다고 생각한다. 웹 문서를 작성하는 것이 일상적인 글쓰기에 해당한다면, 홈페이지 만드는 것은 편집이나 편집 디자인 및 인쇄에 해당하는 일이다. 단지 체험 학습 같은 느낌으로 하면 괜찮을지도 모르겠다.

스프레드시트도 마찬가지로 수학 시간에 배워야 한다. 통계와 함께 배우면 좋겠다. 역시 Microsoft Excel이라는 특정 제품을 쓰게 하는 것은 좋지 않다. 차라리 OpenOffice.org Calc로 가르치면 몰라도. 프레젠테이션 발표 자료 만드는 것도 국어 시간에 배워야 한다. 나 같은 경우 중학교 3학년 때 앞에 나가서 발표하는 법에 대해서 국어 시간에 배운 기억이 난다. 그런 수업을 할 때는 말을 하는 방법 뿐만 아니라, 프레젠테이션 같은 발표 자료를 만드는 것이나, 칠판에 적는 법도 가르칠 필요가 있을 것 같다.

간혹 어떤 학교에서는 컴퓨터 시간에 프로그래밍을 배운다. 사실 이런 부분이야 말로 컴퓨터라는 과목 이름에 가장 적당한 내용이 아닌가 싶다. 하지만 Visual Basic을 알려주는 것은 앞서 누누히 언급한 것과 같은 맥락에서, 나쁘다. 내 생각에는 Haskell이나 Scheme 같은 언어를 수학 시간에 함수를 배우면서 덤으로 배우는 것도 괜찮지 않을까 싶다. 프로그래밍 언어가 컴퓨터를 돌리기 위해 만들어진 것이 아니라, 컴퓨터가 프로그램을 돌리기 위해 만들어진 것이라고도 일러주고. 이메일을 읽고 쓰는 것도 국어 시간에 편지 쓰는 법과 함께 배워야할 것 같다.

그래픽 편집기를 미술 시간에 알려주고, 음각, 양각 배우듯 벡터와 비트맵이 뭔지도 알려줄 수 있을 것이다. OS 재설치하는 방법도 가정 시간(?)에 배우고… 내가 말하고자하는 내용이나 맥락을 알 수 있을 것이다. 결국 사람이 컴퓨터를 통해 실제로 하고자 하는 일이 더 중요한데, 컴퓨터 과목이라는 것을 들어보면 단지 도구일 뿐인 컴퓨터 자체에 방점을 찍는다는 느낌이 강하다. 내가 컴퓨터 과목을 따로 만들지 말고, 다른 과목 사이에 흡수시켜야 한다는 것은 그런 의미에서의 주장이라고 보면 된다. 우리가 책상 위에서 할 수 있는 일이 많다고 해서 책상 과목을 배워야 할까? 펜으로 할 수 있는 일이 많으니 펜이라는 과목을 만들어야 할까? 어찌보면 컴퓨터 과목이 따로 있는 것도 그런 우스운 발상의 일종이 아닌가 싶다.


  1. 정확하지는 않지만, 1학년 때는 컴퓨터 실습실에 가서 공부하는 과목이 더 많았던 것으로 기억한다. 3학년이 가까워지면서 학교에서도 애들 대학 보내기 위해 실습 과목의 비중을 훨씬 줄었지만, 여전히 다른 인문계 고등학교에 비해서는 엄청나게 많았다. 

  2. 난 법적으로 교육을 위한 컴퓨터 시스템에 상용 OS를 설치하지 못하게 하고, 가르칠 때도 특정 기업 제품에 종속적인 것은 제외하는 방향으로 가야한다고 본다. 아마 리눅스에서는 게임은 커녕 웹 서핑도 하지 못하는 아이들이 대부분이니 수업에 집중 못하고 딴짓하는 것은 꽤나 막을 수 있지 않을까 한다. 

  3. 컴퓨터 학원이라니—‘컴퓨터’라고 하면 얼마나 범위가 넓은데! 

  4. 국가에서 교육용 WYSWYM 에디터를 오픈소스로 하나 개발해서 배포해도 괜찮을 것 같다. 

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.