블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.06.07 14:27

[ Perl ] Perl 로 OOP 하지 않겠나(요)? - Moose #3 - 형태에 관한 이야기

사용자 삽입 이미지

 지난번에는 Moose 의 상속에 대한 이야기를 해봤습니다. 사실 이것저것 빼먹고 가는 것이 많기 때문에, 개인적으로 좀 더 알아봐주셨으면 하는 심정이 있고, 좀 더 알아보자 라고 했을 때 좀 지루할 것 같아서... 일단 원리를 알고 쓰기보다는 쓰면서 원리를 알아가는 게 더 쉬운 방법인 것 같기도 합니다.

2008/06/02 - [IT/Perl] - [ Perl ] Perl 로 OOP 하지 않겠나(요)? - Moose #1-2

여기에서 isa 에 들어가는 형태에 대한 언급이 있었고, Int 에서 문자열 쓰면 에러난다는 등의 해서는 안될 짓에 대한 이야기를 한 적이 있습니다. 이번에는 형태에 대한 좀 더 자세한 이야기입니다.
 
package Me2day::Request;
use Moose;
use Moose::Util::TypeConstraints;

subtype 'URI' # 자기가 정의하고픈 형태의 이름
  => as 'Object'  # 계승한 형태
  => where { $_->isa('URI') }; # 형태의 Validation 체크 

has 'uri' => (is => 'rw', isa => 'URI');

1;

  일단 가장 간단한 예제를 주워와봤습니다. 이런 'URI' 같은 자신이 직접 형태를 정해줄 경우에는
use Moose::Util::TypeConstraints;
이 필수입니다.

 그런 다음에는 자기 나름대로 URI 이라는 형태를 지정해 줍니다.
subtype 'URI'
  => as 'Object'
  => where { $_->isa('URI') };
 이제 uri 접근자는 URI가 아니면 받아들일 수 없게 되어버립니다. 이 말인 즉슨...

 my $blah = Me2day::Request->new( 'uri' => 'http://jeen.tistory.com' );

 일 때, uri 의 값을 문자열인 http://jeen.tistory.com 으로 지정했습니다. 이러면 자신이 정의한 URI 의 타입에 맞지 않게 됩니다. URI 는 Object 이기를 기대하며, URI 모듈을 사용하기를 원하고 있죠. 그럼 이 입맛에 맞춰주면 됩니다.
 my $blah = Me2day::Request->new( 'uri' => URI->new('http://jeen.tistory.com') );

 그러면 이제 화를 내지 않는 우리의 Moooooose ~
 Moose 특유의 뿔 처럼 엄격함만을 강조하는 것이냐면, 그럴 수도 있습니다만, 여기서 더욱 유연하게 처리해줄 수 도 있습니다.
 coerce 'URI'
   => from 'Str'
   => via { URI->new($_) }
   => from 'Int'
   => via { blahblah... }
 coerce 를 사용하는 것입니다. 이러면 URI 속성을 사용하는 접근자에 문자열('Str') 이 올때에는 URI 모듈을 사용해서 부르게 됩니다. 이때는 여러 상속형태에 대해서 강제변경을 지정할 수 있습니다.

 여기서 중요한 것은 coerce 를 사용해서 강제로 형태변경할 경우에는 접근자에 옵션을 하나 더 추가해줘야 합니다.
has 'uri' => (is => 'rw', isa => 'URI', coerce => 1);
 이렇게 말이죠.

 전체코드입니다.

package Me2day::Request;
use Moose;
use Moose::Util::TypeConstraints; # 아래와 같은 일을 하려면 반드시!
use URI;

subtype 'URI' # 자기가 정의하고픈 형태의 이름
  => as 'Object'  # 계승한 형태
    => where { $_->isa('URI') }; # 형태의 Validation 체크

coerce 'URI' # 강제 형태변경
  => from 'Str' # 이런 타입이 오면
  => via { URI->new($_) };  # 이렇게 해줘야지.

has 'uri' => (is => 'rw', isa => 'URI', coerce => 1);

1;

my $blah = Me2day::Request->new ( uri => 'http://jeen.tistory.com' );
print $blah->uri."\n";  # http://jeen.tistory.com
print $blah->uri->scheme;  # http
 
  물론 uri 의 값은 URI->new('http://jeen.tistory.com') 를 써도 됩니다. 이건  subtype 에서 기본적으로 바라고 있는 값의 형태이기 때문입니다.

 이쯤에서 다른 예제를 불러오도록 하죠.
package Me2day::Request;
use Moose;
use Moose::Util::TypeConstraints;
use Digest::MD5;

subtype 'Encrypt'
    => as 'Str';

coerce 'Encrypt'
    => from 'Str'
    => via {
        my $nonce = sprintf "%08x", rand(16 ** 8);
        $nonce.Digest::MD5->new->add($nonce.$_)->hexdigest;
    };

has 'username' => (is => 'ro', isa => 'Str', required => 1);
has 'password' => (is => 'ro', isa => 'Encrypt', required => 1, coerce => 1);

1;

my $blah = Me2day->new ( username => 'jeen', password => '22830' );
print $blah->password; # 65dfb0a73f23368b4701a2435d8a64cabd26762b

 어떤 별 다른 차이점도 없습니다. Me2day의  인증키 생성을 위한 처리를 coerce 'Encrypt' 에 담아서,
password 값이 들어오면 자동으로 인증키를 만들고 그 값이 password 의 값으로 강제변경되는 것입니다. 위에서 언급을 빼먹었는데. coerce 를 사용하기 위해서는 subtype 이 지정되어 있어야 합니다.

 이상으로 Moose 의 형태변경에 대한 이야기를 마치겠습니다.
신고
Project 2008.03.31 19:34

[PERL] 급조 #4 Me2day API를 써서 Growl 로 통보받자! (미완성)

사용자 삽입 이미지

Me2day Growl을 이용한 통지


잠깐 숙고한 끝에 삽질한 결과가 대충 나온 듯 합니다.

생각해보면 me2day 도 RSS 를 제공하고 있는데... 내용을 보면 시간대가 GMT라서 그런지...

제대로 갱신될려면 12시간 시간 차가 있어서 이건 쓸 수 없나 생각을 하게 된다. 뭔가 방법이 있지 않나

싶은데 그런 거 생각하느니.. 그냥 Me2day API로 긁어오겠다고 생각하게 되었죠.

일단은 이전에 올렸던 2008/03/28 - [Project] - [PERL] 급조 #3 Me2Day Perl API 만들기 v2 - 셸에서 미투데이 글쓰기 에서 처럼 똑같은 인증절차를 거치게 됩니다.

 인증후에는 Me2day 친구 정보를 얻어오구요. 이 때 $ENV{HOME} ."/.me2day/"안에 관련 파일을 만들게 해놨습니다.

 이미지라든가, 닉이라든가, 업데이트 날짜 등의 정보는 YAML 로 보관하게 해놓구요.

 일단 Mac::Growl 로 삽질한 보람이 없기 때문에(인코딩 문제가...) growlnotify 로 돌리기로 했습니다.

 좀 징그러운 코드지만 ...  system("growlnotify blahblah") 이런 식으로요...

 나오는 것은  친구 이미지, 아이디, 내용 등이고...

 아직 안해놨지만 커멘트 등록 여부에 대해서도 통보하게 해놔야죠...

 매번 업데이트 될때마다 YAML 에 담긴 정보들을 갱신시켜 주고 말이죠.

 하다보니까 나중에 어떻게 고치지...;; 이런 생각을 해봤는데... 일단은 움직이는 것만 확인하고

올리는 성급한 포스팅입니다. 아마 이번주 중으로 나머지는 어케될 듯 하네요....

 일단 Mac 유저들은 Growl 로 통지 받으면 되는 거지만...

 Windows 유저들은 Snarl 이라는 것이 있다는 데 써보지 않아서 모르겠습니다.

  Snarl도 CPAN 모듈로 제공되고 있기때문에... 나중에 시간이 난다면 해보고 싶... 지는 않습니다.

 perldoc 번역도 쪼큼씩 해야되고, 이것도 조금 해야되고, 일도 좀 해야되고...

 읽고 싶은 책도 많고... 쿨럭.. 우힝...

사용자 삽입 이미지

그나저나 이미지 바꿔봤습니다.


신고
API, growl, mac, me2day, perl
Project 2008.03.28 21:01

[PERL] 급조 #3 Me2Day Perl API 만들기 v2 - 셸에서 미투데이 글쓰기


 어제 Shell에서 Me2Day 움직여 볼까 하던 것을 오늘 실행에 옮겼습니다.

 http://code.google.com/p/me2day-perl-api/


여기가 프로젝트 페이지이고,

svn checkout http://me2day-perl-api.googlecode.com/svn/trunk/ me2day-perl-api-read-only

이걸로 checkout 하시면 되겠습니다.

뭐 이딴식으로 만들어 놨어.. 하시면... 플젝 같이 해주세요 :-)

사용자 삽입 이미지

먼저 인증샷... 인증을 합니다.


Me2day ID는 현재 자신의 ID를 입력하시구요.
사용자키는 http://me2day.net/[미투데이아이디]/settings/basic 에 가셔서 밑에 보시면
사용자키가 보이실 겁니다. 이걸 넣으시면 됩니다. 실패하면 당연히 튕기구요...

사용자 삽입 이미지

인증이 끝나면 이런 사용 예가 나타납니다.


인증은 한번이면 됩니다. 인증에 성공하면 ID와 사용자키는 $ENV{HOME}의 ".me2day_info"라는
파일에 들어가게 되고... 매번 실행시에 자동으로 인증을 하게 됩니다.

사용자 삽입 이미지

좀 잦은 삽질 후.. 드디어 셸에서 작동


 일단 이렇게 테스트한다고 뻘짓한 흔적입니다.
 사용법은 위에서도 말하고 있었지만 다시 한번 더...
 me2p.pl 본문  @:태그 태그 태그 태그
입니다.
 여기서 주의하실 점은 "링크"를 쌔우는데..

 me2p.pl "사이트":URL @:태그 태그 태그 태그
하시면 아니됩니다... 셸의 특성상 쌍따옴표는 특별취급하기 때문이죠.

 me2p.pl ¥"사이트¥":URL  @:태그 태그 태그 태그
번거로우시겠지만.. 이와같은 방법으로 일단은 해주시면 되겠습니다. 내키지 않는다면 피드백을 주세요.
혹은... 직접 바꿔주시면 되겠습니다.

그외에는 뭐.. 제가 미투데이를 그닥 자주 사용하지 않아서 잘 모르겠네요. 제가 아는 기능에 대해서는 일단

작동합니다. 일단은 "글쓰기"만 되는 것이라서요 :-) 나중에 읽기 라든가 만들어볼까 하지만...

이미지가 떠오르지 않는군요.

태그의 경우는 @: 다음에 오면 무조건 태그로 인식합니다. 스페이스로 태그를 나눌 수 있습니다.

잦은 이용부탁드리겠습니다 :-)
신고
Project 2008.03.27 20:16

[PERL] 급조 #2 Me2Day Perl API 만들기...

오늘의 떡밥은 pung96님께서 me2day 친구 신청하신 것으로 시작되었습니다.

떡밥 전문



쿨럭.. 그리고 Twitter는  TwitterPOD같은 멋들어진 어플이 있는데 me2day는 없을까? 라는 질문에...

그딴 거 없다는 이야기를 듣고 실망하며... "그래서 제가 Twitter만 한다니까요" 라는 혼잣말을 덧붙인 뒤에...

aero 님께서 "그럼 만들어라"라고 하심에... pung96님께서 지원사격하고, 하얀_고양이님께서 관망하던 차에..

원래는 하얀_고양이님께 외주 주겠다라고 했었는데... 그냥 삘 받은 김에 만들어보기로 했습니다.

사용자 삽입 이미지

http://codian.springnote.com/pages/425517


(aero님께서 perl API만 없다고....)

일단 기본 토대는 aero 님의 Springnote API 모듈이 있었으니까... 쉽고 쉬운 작업이었습니다.

다만 코드가 좀 아름답지 못할 뿐이었지만...

BEAUTIFUL CODE 상세보기
찰스 페졸드 지음 | 한빛미디어 펴냄
내 생애 가장 아름다운 코드! 38인의 코디 명장이 말하는 『BEAUTIFUL CODE』. 전세계의 유명한 프로그래머 38인으로부터 받은 글을 엄선하여 총33가지의 챕터로 구성했다. 프로그래머들이 소프트웨어 프로젝트 아키텍처를 구축하면서 쌓게 된 프로그래밍 노하우가 고스란히 녹아 있다. 이 책은 탁월한 소프트웨어 설계자로 살아가는 프로그래머들의 눈을 통해 세상을 바라볼 수 있도록 도와준다. 느리지만 우아하며 감동적인

전혀 아름답지 못한 코드가 되어버렸다.

일단은 기본적으로 Me2Day API Spec은 http://codian.springnote.com/pages 에 정의되어 있으니

간단한 작업으로 끝냈다(라는 것은 어차피 Me2Day 사용한 적이 없고, 자세히 모르니까 하는 뻘소리)

사용자 삽입 이미지

이런 식으로 커멘트와 포스트 각각 쓰기가 가능하게 되었다는 것...

일단 Source Repository는 http://code.google.com/p/me2day-perl-api/  에 등록해놨지만...

http://code.google.com/p/me2day-api/
에 자바랑 루비 버젼이 있는 걸 봐서...

이쪽에도 신청해놓을 까 합니다. reject 되면 ㅜ_ㅜ

일단 대충 정돈되고 나면... Shell에서도 가지고 놀 수 있게 되면 왠지 재미있을 지도~ 라고 생각합니다.

Web::Scraper가 셸 명령어를 지원하는 것 처럼...

:^) 그리고 때가 되면... CPAN에도 올려보고 싶...

하악... 아무튼 오늘도 떡밥에 물려서 이렇게 하루를 보내는 군요.


신고
TOTAL 473,925 TODAY 6

티스토리 툴바