'COMPUTING/Programming'에 해당되는 글 9건

  1. 2009/06/15 귀천 Simple
  2. 2009/02/09 귀천 유니코드 urldecode php
  3. 2009/01/22 귀천 웹 인코딩 문제와 삽질들
  4. 2009/01/15 귀천 gnome 바탕화면 나사 이미지로 갱신하기
  5. 2008/12/14 귀천 네이트온 봇 활용
  6. 2008/12/04 귀천 Programming Language (3)
  7. 2008/11/23 귀천 은유법(Metaphor)과 상속(inheritance). (4)
  8. 2008/11/17 귀천 파이썬 네이트온 봇.
  9. 2008/11/13 귀천 스팸에 대한 고찰

Simple

COMPUTING/Programming 2009/06/15 05:16 귀천

Number n ::= d | nd       (d in Digit)

Symbol s ::= c | sc | sd   (c in Char)

Atom   a ::= n | s

Expr   e ::= a | (e … e)

2009/06/15 05:16 2009/06/15 05:16
TAG
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/45

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/45

뭐 다들 아시겠지만. IE 의 경우 한글 같은 데이터를(no ascii)
서버측으로 날릴때(form에서 get 이나 post)
겁나 깨져서 날라 갑니다.
불여우에서는 잘 인코딩 되서 가지요.. 그래서 보통 submit 하기 전에
onsubmit 등의 이벤트를 걸어서 자바스크립에서 encodeURI 등으로

인코딩을 해주고 날립니다. 그리고 서버측에서 decode 해서 쓰지요.

Java 에서 decodeURI 의 역할을
하는 메소드가 있어서 잘 하면 되고,
 PHP 에서는 urldecode 라는 함수가 있습니다. 그런데, PHP 에서 받아가지고
저 urldecode 로 했드만 잘 안되더군요. 알고보니 utf-8 이라서 !!

즉, 유니코드를 encodeURI 해서 받은것을, php 의 urldecode 녀석은
제대로 decode 하지 못 합니다.


그래서 찾아봤더니, 유니코드용으로 누가 작성을 해 놨네요.. 링크 참고 하시길

unicode_urldecode

2009/02/09 15:33 2009/02/09 15:33
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/30

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/30

보통 웹 어플리케이션을 개발할때 누구나 겪는 encoding 문제 및 삽질.
그중에 제가 겪은 몇가지를 추려 봤습니다.

1. 클라이언트에서 서버측으로 쿼리를 날릴때
아스키 코드는 문제가 없이 잘 갑니다.
하지만, 아스키 코드가 아닌 한글이나 다른 나라의 언어들은 웹 브라우져가
퍼센트 인코딩(% 와 아스키 등으로 이루어진) 을 해서 서버측으로 전송을 합니다.

그런데 IE 6.0~ IE7.0 beta 2 까지는 저 퍼센트 인코딩이 제대로 안되는 버그가 있습니다.
물론 Firefox 등에서는 문제가 없이 전송이 되지요.

따라서 해결책은 데이터를 전송하기 전에 encodeURIComponent 라는 javascript 함수로
 자체적으로 미리 퍼센트 인코딩을 해서 서버측에 넘겨주어야 합니다.
서버 측에서는 decodeURIComponent 등의 디코드 함수를 통해 디코딩을 해서 이용하면 됩니다.

 2. ajax 로 개발을 하던중에, get 방식으로 계속 데이터를 전송해서 DB에 까지 갱신을 했는데
이상하게 웹 브라우저에서는 갱신이 안됩니다.  알고보니 GET 방식의 데이터 전송의 경우
가능한 어떤방식으로든(웹 브라우저 혹은 웹서버 측에서도..) 캐쉬된 데이터를 가져오게 되어 있습니다.
그래서 방법은, POST 방식을 쓰면 되는데 어쩔수 없이 GET 방식을 써야 한다면 쿼리를 날릴때
쿼리에 변형을 주면 됩니다. 어떤 데이터를 요청 하는데 계속 같은 URL 로 요청을 한다면
서버측에서 갱신된 데이터를 주지 않고 cache 된 데이터를 줄 것 입니다.

따라서 URL 을 변형해 줍니다. 그래서 의미없는 값을 뒤에다가 같이 보내주곤 합니다.
그래서 보통 javascript 의 Date().getTime() 함수로 시간을 얻어서 이 값을 url 과 함께 보내주면
갱신된 결과를 가지고 올 수 있습니다.

3. 종종 디자이너가 작업한 Flash 결과물과, javascript 을 연동해야 할 일이 생깁니다.
플래시 이벤트 발생시 페이지를 변경 한다던가 하는 등의 일이 필요하죠. 그런데 이전까지 사용해 오던
getURL("javascript:function()"); 방식으로는 더이상 javascript call 을 할 수 없게 됐습니다.
이 문제로 기존에 있던 수많은 flash 들이 문제를 일으켜서 Adobe 가 욕을 좀 먹었죠..

이는 Flash 의 보안 관련 변경사항 때문입니다.
그래서 이제는 저런 방식으로는 javascript call 이 안되고 external 모듈을 이용해야 합니다.
사용법은 다음과 같습니다.

import flash.external.*; // 모듈을 import 하고
ExternalInterface.call("javascript_function_name" , parameters ... ); // 여기서 call

인자는 자바스크립 함수가 필요한 만큼 가변적으로 그냥 넘기면 됩니다.
그리고 이 flash 파일을 html 페이지에 embed 할때는 다음과 같은 markup 이 있어야 합니다.

<param value="always" name="allowScriptAccess"/>
<embed src = ~~~ 여기에 속성 allowscriptaccess="always" >

이렇게 추가 해주거나 기존의 것을 수정해주면 됩니다.



2009/01/22 14:45 2009/01/22 14:45
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/25

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/25

나사에서 주기적으로, Image of the day 를 올리는걸 보고
종종 이미지가 맘에 들길래 스크립을 짜 봤습니다. cron 으로 돌려주면, 새로운 이미지가 있는지 확인하고 있으면 다운로드 해서 배경화면을 변경 합니다.
gnome 에서 동작하고, gconftool 을 이용해서 배경화면을 변경 합니다.

#!/bin/bash

#### Check the "Image of the Day Gallery" of NASA
#### If there's a new gallery in it download it and change the background
### working on tmp directory ###
cd /tmp

### Global variables
LOCAL_FILE_PATH="/home/maya/Desktop/DATA/media/Pictures/" # Image download path

BASE_URL="http://www.nasa.gov/"
RETURN_VAL=       # For big return values

### uncomment one image size
## image size suffix
# SIZE=600 # 800x600
# SIZE=768 # 1024x768
#SIZE=1200 # 1600x1200
SIZE=full # full high resolution

function get_latest_image_number () {
    local temp_file=`tempfile`
    local temp_file2=`tempfile`
    local gallery_url="http://www.nasa.gov/multimedia/imagegallery/" # nasa image gallery page
    wget -o $temp_file $gallery_url -O $temp_file2 # try downlaod and logging

    ## Find latest image number
    img_number=`grep -o "multimedia/imagegallery/image.*.html" $temp_file2 | \
    awk -F"[_ .]" 'BEGIN {max=0} {if($3>max) max=$3} END{print max}'`

    ## remove temporary file
    rm $temp_file
    rm $temp_file2
    RETURN_VAL=$img_number
}

## check if user gconf has "nasa_image_key"
function has_nasa_image_key () {
    local has_key=`gconftool -a /desktop/gnome/background | grep nasa_image_key`
    if [[ $has_key != "" ]];
    then
	RETURN_VAL=1
    else
	RETURN_VAL=0
    fi
}

## set nasa_image_key to image number
## args : $1 => image number
function set_nasa_image_key () {
    if [[ $1 = "" ]];
    then
	echo "Invalied argument"
    else
	gconftool --set --type integer /desktop/gnome/background/nasa_image_key $1
    fi
}

function get_nasa_image_key () {
    RETURN_VAL=`gconftool --get /desktop/gnome/background/nasa_image_key`
}

function set_background () {
    if [[ $1 == "" ]];
    then
	echo "Invalied argument"
    else
	local html_file_url="${BASE_URL}multimedia/imagegallery/image_feature_"${1}".html"
	local temp_file=`tempfile`
	local temp_file2=`tempfile`
	local url_prefix="images/content/"

	wget -o $temp_file $html_file_url -O $temp_file2 # try downlaod and logging

	local file_name=`grep -o "[^\/]*${SIZE}.jpg" $temp_file2` # full image download url
	local img_url=${BASE_URL}${url_prefix}${file_name}

	echo $img_url
	echo $file_name
	wget -o $temp_file ${img_url}

	mv $file_name $LOCAL_FILE_PATH
	gconftool --set --type string /desktop/gnome/background/picture_filename ${LOCAL_FILE_PATH}${file_name}

        ## remove temporary files
	rm $temp_file
	rm $temp_file2
    fi
}

function update () {
    has_nasa_image_key
    local has_key=$RETURN_VAL

    if [[ $has_key = 1 ]];
    then
	get_nasa_image_key
	local my_key=$RETURN_VAL

	get_latest_image_number
	local latest_key=$RETURN_VAL

	if [[ $my_key < $latest_key ]];
	then
	    set_background $latest_key
	    set_nasa_image_key $latest_key
	else
	    exit 0
	fi
    else
	get_latest_image_number
	local latest_key=$RETURN_VAL
	set_nasa_image_key $latest_key
	set_background $latest_key
    fi
}

update ## try update



2009/01/15 23:04 2009/01/15 23:04
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/26

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/26

 파이썬 네이트온 봇 디버깅에 기능 추가까지 완료.
이전에 딜레이 걸리던것 처리 됐고, 몇가지 자잘한 버그를 더 잡았다.
뭐, 또 다른 버그가 있을 수 있겠지만 일단 잘 돌아가는 것 같다.

지금 쓰는 기능들은 게시판 모니터링, 서버 모니터링(시스템 사용율, cpu 온도 등등, 서버 접속자 보기)
구글api를 이용한 날씨 보기. 수업 시간표 출력  등등... 아주 간단한 것들이다.

그리고 모듈 한가지, irc 채팅이다. 지하철에서 이동하다가 심심하면 irc 채팅을 할 수 있다 .
지하철 이동할때 참... 심심한데, irc 채팅방에 접속해서 눈팅만 하더라도 꽤나 재미있다.

몽땅 text 라서 조금 제한적이고 재미가 덜하다.
하지만, 이 네이트온 메신져는 서버측 사용자가 작성한 프로그램의 text user interface 로 사용할 수 있기때문에
텍스트 기반으로 어떠한 정보를 받아보고 싶다면, 유용할 수도 있겠다.

이번에 네이트온 봇을 작성하면서 파이썬의 파워를 다시금 느낄 수 있었다.
그리고 socket 을 가지고 놀고 프로토콜도 분석 했으니, 네트워크 공부가 조금 된 것 같다.

네이트온 프로토콜은 공개되지 않고 인증이 필요해서 이것 저것 복잡했는데
IRC 프로토콜은 너무나도 간단했다. 그냥 접속해서 명령 몇개 던지니까 바로 접속이 되더라.
그래서 만약에 누군가 봇을 만들어 보고 싶다면, irc 봇을 만들어 보는 것도 좋을 것 같다.


아래는 이전 네이트온 봇 링크, 다운로드 링크 수정했음
네이트온봇

2008/12/14 10:37 2008/12/14 10:37
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/22

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/22

  어떤 사람들은 프로그래밍 언어가 단지 도구일 뿐 결국 다 똑같다고 이야기 한다.
프로그래밍 언어가 문제 해결을 위한 도구라는 점에서 어떤 언어가 Turing complete 하다면
이 언어로 어떤 문제든지 풀 수 있기 때문에 이 말은 어느정도 일리가 있다.


나도 처음에는 언어는 다 비슷하다고 생각 했었다. 물론 당시에는 지금보다 더 초보적 이었으니까...
그러다가 다양한 언어들을 접하게 되면서 생각이 많이 바뀌었다.
언어는 프로그래머의 사고에 큰 영향을 미친다.  따라서 새로운 패러다임의 언어는
프로그래머에게 새로운 사고를 하도록 한다는 점에서 그 가치가 있으며
실용적인 의미에서는 주어진 문제에 적합한 언어를 선택할 경우 그 생산성이 매우 뛰어날 수 있기 때문에
또한 그 가치가 있다.


C Language
 처음접한 프로그래밍은 사실 Visual Basic 6.0 이었는데 이는 프로그래밍을 처음 시작하는
나에게 사촌형이 눈에 보이는 결과로서 재미를 느껴보라며 추천해준 언어였다.
그러다가 여기 저기 찾아보던중 자연스레 C를 해야겠다고 마음을 먹었고, C를 본격적으로
시작했다. Teach yourself C in 21days 유명한 시리즈중의 한권 이었고, 이 책은 초보인
나에게 line by line 으로 조목조목 모두 설명을 해 주었고, 처음에는 도움이 많이 되었다.

그 후반부는 너무 지루해서 거의 보지 않고, C로 배우는 알고리즘 이라는 책으로
자료구조를 익히면서 처음으로 예제 수준의 콘솔 응용프로그램을 작성하게 되었다.

C는 여러의미에서 중요하다. 그러나 처음 접하는 언어로는 사실 좀 부적합한 언어인듯 하다.


Python
 대학에 와서 처음 python 을 접했다. C로 장난감 수준의 코드를 짜본 나였지만
이 언어는 너무나도 쉽고 강력해 보였다. 그래서 뚝딱뚝딱 무언가 만들어 낼 수 있었고,
덕분에 프로그래밍이 너무나도 재미 있었다.

파이썬은 간결하며 읽기쉽고 다양한 패러다임을 지원한다. 또한 작은 프로그램부터
큰 프로그램에 이르기 까지 여기저기 어디든 적합하게 쓰일수 있는 언어이다.

지금 파이썬 사용자는 무지 많으며 끝내주는 라이브러리가 정말 많다.
특히 구글에서 많이 쓰고 있는것으로 유명하다. 파이썬 창시자인 귀도 반 로섬이 구글에서
일하고 있다니 구글에서 파이썬이 갖는 의미는 크다고 할 수 있다.


Lisp
 이 언어는 역사적인 의미로 본다면 엄청나게 중요한 언어이다. 자세한것은 나중으로 미루고...
Lisp 은 일단 지금까지 쓰이는 언어중에 Fortran 을 제외하고 가장 오래 되었다.
그리고 Lisp 은 처음으로 재귀를 지원하는 언어였고, if-then-else 구문 또한 Lisp 을 개발하던중
만들어 지게 되었다. 그 외에도  GC(Garbage collection) 이라던가, 함수가 first-class 라는점,
코드가 데이터이며, 데이터가 바로 코드인 점은 특히 눈에 띄이는 특징이다.

Lisp 은 매우 오래 되었으면서도 매우 진보한 언어라고 할 수 있다.

사실 처음에 emacs 를 만지던중에, emacs lisp 이란걸 알았고, 그것을 가지고 놀다가
자연스럽게 Common lisp 을 보게 되었다. 더불어 scheme 도 조금씩 살펴보게 되고....
덕분에 이 Lisp 계열을 좋아하게 되었다.

지금까지 배운 언어중에 가장 쓰기 쉽고 코딩보다 생각을 더 하게되는 언어인 것 같다.
어떠한 알고리즘이 생각이 났다면 그것이 바로 코드가 된다고나 할까...

역시 지금은 초보적인 수준이지만, 개인적으로 앞으로도 계속 가지고 갈 언어이다.


Perl
지금은 펄 을 대체할 만한 언어들이 많이 나왔지만, 펄이 처음 나왔을때 펄은 무지 강력했다
파이썬과 주로 비교되는 펄은, 그 언어의 생김새나 개념들이 처음 접하는 이들에게 어려워 보일 수 있다.

펄은 웹사이트 개발이나, 시스템 관리 등에 많이 쓰이고 특히 문자열 처리(정규식 등) 에
강력하다고 알려져 있다. 물론 이뿐아니라 많은 훌륭한 프로그램들이 펄로 작성되었다.

Python 등장이후 많은 사람들이 Perl 보다는 Python 으로 가고 있지만, 현재 Perl 은
Perl 6 를 준비중이며, 여전히 그 가치는 인정받고 있다.
특히 CPAN 에서 제공되는 수많은 모듈들은
그 이름에 걸맞게(Comprehensive) 쓰기 쉽도록 매우 친절한 예제와 함께 제공되는데,
정말로 훌륭한 모듈들이 무지 많고, 없는게 없을 정도이다.
처음에 여기를 접했을때 어안이 벙벙해졌는데, Perl 을 배우고 싶은 충동을 느끼게 됐다.


Java, C++
  이 두가지는 굳이 말할 필요가 없겠다.
객체지향을 잘 지원하는 언어로, 특히 대규모 프로젝트에 적합하다.

Java 의 경우 기본적으로 제공되는 잘 설계된 무수히 많은 클래스들... 이게 매력이 아닌가 싶다.
기본내장하고 있는 GUI Component 인 awt, swing 은 GUI 기반 어플리케이션 개발을 손쉽게 할 수 있게 해준다.
또한 한번 작성되면 어디서든 돌아갈수 있기 때문에 cross-platform 으로 작성되어야 하는
소프트웨어의 경우 보통 java 로 많이 작성되어 왔다. 
servlet , beans, jsp 등, 대규모 웹 프로젝트에 많이 쓰이고 있으며, jvm 위에서 돌아가고
Garbage collecting 이 지원되는 언어로 많은 대학에서 Computer science 교육으로 많이 쓰이기도 한다.

C++ 은 다양한 패러다임을 지원하며, C 수준의 low level 제어로 퍼포먼스 까지 훌륭하다.
거의 산업표준으로 여겨지는 이 언어는 요즘 프로그래머에게 필요한 기본 스펙으로 여겨진다.
C++ 골수 유저들의 말에 의하면, C++의 Boost 라이브러리는 언어의 한계마저 뛰어 넘으며
별의별 기능들을 제공한다고 하는데............ 잘은 모르지만 엄청나다고 한다.


Javascript
 javascript 은 잘 모를적, 웹을 위한 장난감 언어 정도로 생각했다(헉!)
그러나 지금 javascript 은 웹에서 없으면 당연히 안되는 언어이며, 무지 강력한 언어이다.
프로토타입 기반의 객체지향을 지원하고, 수많은 언어적 기능들을 제공한다.

무엇보다도 javascript 을가지고 DOM 객체들을 다루는 일은 이제는 일상이다.
당연지사 Ajax 의 심장이기도 하다.

바닥부터 javascript 을 이용하는 일은 많이 고된일이 될 수 있는데 javascript 을 조금써봤고
개발을 해야한다면, 당연히 javascript framework 써야 할 것 이다. (그래야 좌절을 피할 수 있다.)
   YUI
javascript 을 가지고 UI 를 손쉽게 구성할 수 있는 Framework인데.....처음엔 놀라움에 경악을 금치 못했다!
   jquery
Javascript framework 인데 사용하기 무지 편하다. Ajax 를 개발한다면 필수가 아닐까 싶다.
무수히 많은 프레임웍이 있지만 이 두가지만 살펴봐도 javascript이 무엇인가에 대한 새로운 생각을 하게 될 것이다.
나는 개인적으로 Java+ YUI + Ajax 로 작은 프로젝트를 한 경험이 있었는데... 이 프레임웍들에 감사할 뿐이다.


PHP
 이 언어를 처음 봤을때는, “어? C랑 똑같네?”
그리고 좀더 봤을때는  C 랑 shell script 랑 perl 이랑 섞어놓은 느낌 이랄까...........
php 를 코딩할때는, 항상 어디에선가 본것 같은 코드를 작성하는 기분이다 :)
최근에는 객체지향적 특징을 계속 추가하고 완성해가고 있다.
웹에서 php 는 무지 인기있는 언어이다. 문서도 무지 많고, 각종 모듈이나 프레임웍도 많다.
특히 중소규모 프로젝트에 적합하다. 개발 기본 셋팅이 매우 간단하고, 쉽게 결과를 볼 수 있다.


bash, awk, ...
이 작은 언어들은 시스템을 관리할때 매우 편리하다.
python 이나 perl 로도 시스템을 관리할 수 있지만, 만약 bash 를 기본 쉘로 이용한다면
shell script 을 통해서 간편하게 시스템 관리를 할 수 있다.

awk 는 text 를 처리하는 언어인데, 각종 text 파일들을 처리할때 매우 유용하다.

bash, awk, grep, xargs, sed 등을 함께 잘 조합한다면...... 놀라운 작업들을 많이 할 수 있다.
아직 잘 못쓰지만, 앞으로 계속 조금씩 쓰면서 배울 생각이다.

Ocaml
 이 언어는 최근에 접한 언어인데, ML 계열의 언어라는 것만 알았다.
그것을 알아갈 수록, 묘한 느낌을 받았는데, functioanl 이면서 imperative 도 지원하고
match … with 와 같은 pattern 처리도 생소하지만 무지 강력한것 같고....

처음엔 엄격한 type 때문에 무지 고생했고, 짜증도 많이 났지만.........
그것을 받아들이고 익숙해 지니까 무언가 굉장히 강력한 느낌을 받았다.

언어의 표현력이 매우 뛰어나다고 할까. 코드를 작성하고 나면 한편의 시를 보는 듯 했다.
프랑스에서 개발된 언어라 괜히 그렇게 느끼는지 몰라도 이 언어는 미적으로도 훌륭하다!

짜증을 느낄때와는 다르게, 지금은 이 언어를 계속 공부하며 쓰기로 마음먹었다 :)



언어를 두고 욕하거나, 단점을 논하기 전에 그 언어의 특징을 충분히 이해하고 활용 해볼 필요가 있다.
예를들어 언어의 어떤 특징은 코드를 더럽게 하고 모호하게 할지 몰라도 그 언어를 잘 쓸경우
훌륭할 수 있다는것. 결국은 하기 나름이라는 세상의 진리에 봉착하게 된다.
물론 어떤 언어는 엄격한 타입이나 룰을 적용해서 프로그래머에게 바른 코드를 작성하도록
종용하기도 하는데, 어찌보면 이런 언어가 더 좋다고 할 수 도 있겠다.
그러나 역시 어떤 프로그래머들은 프로그래머에게 자유를 잔뜩주는 언어를 선호하기도 하니까
역시 또다시 하기 나름이라는 진리에 봉착.

마지막으로 peter norvig 의 Teach yourself programming in ten years 라는 글의 링크를
남긴다. 좀 오래된 글 이지만 프로그래머에게 좋은 길잡이가 될 것 이다.

Teach yourself programming in ten years

2008/12/04 15:30 2008/12/04 15:30
받은 트랙백이 없고, 댓글 3개가 달렸습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/21

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/21

소프트웨어 공학 기법중에 객체지향 이라는 패러다임이 있습니다.
누군가에게 물어보면 “모든것은 객체다” 라고 대답을 해 주더군요. 참내 뭔 소린지...

보통 프로그램을 짤때 어떤 멍청한 데이터가 오면 그녀석을 어떻게 처리하고
또  그 결과물을 어떻게 처리해서 어떤 결과를 내지요. 우리의 멍청한 데이터는
여기 저기 날아다니면서 목표에 가깝게 변신해 갑니다.

그런데 객체지향 에서는 멍청한 데이터가 똑똑해 집니다.
이 데이터는 더이상 멍청한 바이트 덩어리가 아니라, 엄연한 하나의 객체가 됩니다.

똑똑한 데이터, 우리의 객체는 이제는 전과 같지 않아요.
자기 자신이 누군지 그리고 자신은 뭘 할 수 있는지도 잘 알고 있지요.

우리는 이 객체와 대화를 할 수 있습니다.
대화를 통해서 이 객체에게 명령을 내리면 그 명령을 알아듣고 맞는 행동을 하죠.

그리고 객체지향에는 상속 이라는 개념이 있습니다.
어떠한 객체를 상속받은 녀석은, 상속해준 그 부모 객체와 아주 똑 닮아가지고
부모가 알아듣는 명령은 이 녀석도 알아 듣지요.

근데 그냥 닮는게 아니라, 부모보다 “더” 똑똑해 집니다. 더 많은 명령을 알아듣고
능력도 더 향상될 수 있지요.

더 똑똑해졌고 “마치” 부모와 같아요. 우리는 이 녀석이 그 부모의 자식이라는 걸 알고
이녀석이 무엇을 할 줄 아는지 예측이 가능하죠.

여기에서 재미있게도 은유법(혹은 메타포) 이라는 개념을 이야기 할 수 있습니다.
우리가 누군가에게 무엇인가에 대해 설명을 할때, “그건 말이야 마치 * * * 과 같아서......”
“그건 * * *의 *** 와 비슷해” 

“여자의 마음은 흔들리는 갈대와 같아서 젠장할 도무지 알 수가 없다니까”          풉;;

종종 우리는 어떠한 어려운 개념에 대해서 공부를 하거나 설명을 들을때,
자신이 알고있는 범주내의 무엇과 비교해보고 공통점을 찾을때, 이해가 급 잘됨을 느낍니다.

용어는 제멋대로 다 다르고, 뭔가 화려해 보이다가도 내가 아는 무엇의 그것과 다를바 없다고
결론이 나면, 금방 이해가 되지요. 완전 바닥부터 배울때 보다 훨씬 금방 배우게 됐군요.

객체지향의 상속도 이와 비슷합니다. 우리는 객체지향적 설계를 할때 프로그램 하고자하는
대상에 대해서 일반적인 공통점을 찾아내려고 노력을 하지요.

우리의 프로그램은 이 공통이라는것을 가지고 시작을 하고, 상속을 받으면서 계속
똑똑해져 갑니다. 마치 우리가 미리 알았던것과 비슷한 무엇을 배우는 것 처럼요.

완전 바닥에서 배우는것 보다, 아는 범주내의 것과 연관지어 배우는것이 쉬운것과 마찬가지로
프로그램을 짤때에도, 이미 작성해둔 범주의 기능에 대해서 연관지어 기능을 추가하고
조금의 수정을 하게되면 프로그램을 짜는것이 수월해 집니다.

우리가 누군가에게 무언가를 가르칠때 “이것은 * * * 의 그것과 같다고 보면 되.. “ 라고 하듯
프로그램을 짤때(컴퓨터를 가르칠때) 이 기능은 ~ 객체의 ~ 과 같다고 보면되... 라고 하면서
바닥부터 가르쳐야할 눈물나는 상황을 피할수가 있는겁니다.


이럴때 보면 소프트웨어는 공학이라기 보다 예술에 더 가까운 것 같아요 :)

2008/11/23 15:00 2008/11/23 15:00
받은 트랙백이 없고, 댓글 4개가 달렸습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/15

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/15

모바일 네이트온은 KTF, LGT의 경우 월 3000원 SKT 는 월 3500 원의 금액만 내면
핸드폰에서 네이트온을 무제한 이용할 수가 있습니다.

그리고 nate.com 메일에 대해서는 메일을 주고 받을수도 있지요.
저는 gmail 을 이쪽으로 forwarding 해두고 씁니다. 핸드폰에서 가볍게
메일을 읽고 쓸 수가 있어요. 나름 괜찮죠........

핸드폰으로 인터넷에 연결 하는것은 데이터 통화료가 나가기 때문에...
모바일 데이터 요금이 풀리기 전엔(조만간 풀릴듯) 돈이 좀 나가죠.

후배가 모바일 네이트온을 쓰고 있길래 이녀석을 활용할 방법을 고민해 봤죠.
뭐, 그래서 결국 네이트온 봇을 만들어 봤습니다. 결국 텍스트만 주고 받을수 있어서
조금은 제한적인 환경이지만, 게시판 글 모니터링 이라던가,
각종 텍스트로 된 정보 (예를들면 신문기사 같은 것들) 를 쓴다면 월 3000원에
나름 괜찮은 효과를 보는게 아닌가 싶네요.

파이썬으로 짜 놨고, 기능 추가할수 있도록 해 놨으니까, 파이썬을 이용하면
쉽게 기능들을 추가 할 수 있습니다.

사용하기 전에 # @ 로 주석처리 해둔 부분에 각종 계정정보 및 패스워드 봇 이름 등을
셋팅해 주시고 원하는 기능 추가는
소스 아래 User defined processor 부분에 원하는 함수를 작성하고
register(“명령어”, 함수이름) 해주시면, 동작 합니다.

예를들어 네이트온 봇한테
>> *인사 귀천
이렇게 하면 *인사 라는것은 명령어가 되고 귀천 은 인자로 가게 됩니다.


# @ USER defined processor! ####
# ex) 봇한테 *인사 하나 둘 셋
# 이라고 한다면 "*인사" 는 명령어 이고 하나 둘 셋 이 인자로 함수에 전달 됩니다.
def say_hello(param) :
    return "안녕하세요 - Nateon bot 입니다. 인자는 " + param + " 가 넘어 왔군요"

register("*인사", say_hello)
#################################



약간의 버그가 있고, 더 있을 수 있습니다.
일단 처음 대화가 시작될때 조금 딜레이가 걸리네요. 좀더 분석해 봐야 합니다
어떻게 더 활용할 수 있을지 아이디어가 있다면 알려 주세요!

P.S. 참고로 cyworld 가입할때 다른 e-mail 을 기입하면 nate.com 아이디와
cyworld 측에 등록된 아이디로 2개의 nateon 아이디를 가질 수 있습니다.

## MODIFIED ##
2008 12월14일 버그수정됨.
NateonBot(수정버전)

2008/11/17 01:30 2008/11/17 01:30
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/11

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/11

우리 학회 홈페이지에 인증 없이 글을 쓸 수 있는 게시판이 있는데,

여기에 스팸글이 엄청나게 올라온 일이 있었다.


spam
출처 : www.spamdeputy.com 개 놀랬다... 열받는다고 개를 쏠 수는 없는일...

그 글들은 spam bot 이 올리는 경우가 대부분이고
한번에 같은글이 3~4개씩 올라 오곤 했다. (이런 나쁜시키들...... -_-)

기존 우리 홈페이지에서 스팸 필터링 하는 방법은, 관리자가 스팸글에 대해
스팸 등록을 하면, 그 글을 등록한 IP 주소의 접근을 차단하는 방식 이었다.

그런데 ... 역시나 우리의 스팸봇은 IP 주소를 신나게 바꾸면서 달려 들었다.

게으른 서버 관리자 귀천 은... 스팸이 올라오면 확인하면서 스팸 처리하는게
더 귀찮아 지자 조금 생각을 해 보았다.

그런데..........................

코드 몇줄이면 스팸 처리를 무난하게 할 수 있다는걸 깨달았다.

=> 대부분의 스팸들은 공통적인 keyword 를 가지고 있기 때문에 그 keyword 가
들어오면 글 올리는것을 방지 하는 것 이다. 게다가 본문도 아니고, 그냥 제목에 대해서만
스캐닝 한다고 할지라도 스팸 차단률은 생각보다 매우 뛰어나다.

지금 스팸 키워드는 약 100개쯤 등록해 뒀는데,
정말 가끔 스팸이 올라오면, 확인해 보고 스팸 키워드 몇개 등록하면 된다. 후훗...

그래서 quick & dirty 코드를 몇줄 작성했다.

// MAYA : Spam filtering code.
# 스팸 차단용 키워드 파일 "," 로 구분해서 저장해 둔다.
define(X_WORD_FILE, "/home/path/xwords");

function fget_xword_list($file_name) {
  $words_file = fopen($file_name, "r");
  $xwords = "";
  while( !feof($words_file) ) {
      $buf = fgetc($words_file);
      if ( ctype_space($buf) ) # skip whitespace
            continue;
      $xwords .= $buf;
    }
  return explode(",", $xwords);
}

function __is_valid_title($title, $word_list) {
    foreach($word_list as $word) {
    # mb_stripos : multibyte case insensitive function
    # return "boolean" if doens't contains, but "integer" if contains
        if ( gettype(mb_stripos($title, $word)) == "integer" )
        return false;
    }
    return true;
}

function is_valid_title($title) {
    return __is_valid_title($title, fget_xword_list(X_WORD_FILE));
}





뭐 이래서 is_valid_title(“여기에 스캐닝 할 문자열들, 제목이던 본문이던 알아서...”) 해서

boolean 값 가지고 스팸 인지 아닌지 판단하면 된다.

좀 이상한건 gettype(mb_stripos($title, $word)) == “integer” 인데 mb_stripos 함수는 리턴값이
참.......... 제멋대로라 저런 식으로 코드를 썼다. $word 가 $title 에 존재하지 않으면 false 를
존재하면 그 존재하는 위치의 offset 값을 integer 로 리턴한다.

뭐 암튼..... 결론적으로 매우 경제적이고(?) 쓸만하다.

2008/11/13 21:25 2008/11/13 21:25
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/8

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/8