블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2011.08.31 23:37

[ Perl ] 최신 Perl 관련 정보는 어디에서 긁어모을까요?

  사실 Perl 관련 정보는 ... 네, 한글은 죄송하지만 그렇게 많이 없죠.
  하지만 영어 쪽 사이트를 보면 전혀 다릅니다.

  매주 그때 그때의 Perl 관련 이슈를 모은 Perlbuzz 가 대표적이겠구요.

* http://www.perlbuzz.com/

 
  세계의 활동적인 Perl Hacker 들의 블로그등을 모아놓은 PLANET 사이트인 Perl Iron Man 도 있습니다.
 
 * http://ironman.enlightenedperl.org/


 
  최근에는 Perl IDE 인 Padre 의 메인개발자인 Gabor Szabo(@szabgab) 씨가 매주 Perl Weekly 를 발행하고 있습니다.

http://perlweekly.com/


  최신 Perl 관련 여러 이슈는 위의 세군데만이라면 아마 쉽게 얻을 수 있으시겠구요.
  한국의 Perl 관련 뉴스나 이슈에 대해서는...

  * http://webchat.freenode.net/ 의 IRC #perl-kr 채널에서 확인하실 수 있습니다. 
신고
IT/Perl 2010.05.21 13:24

[ Perl/Catalyst ] 새로 태어난(?) 아얄씨 로그뷰어


   이것저것 갖다붙여서 새롭게 만들어버렸습니다.
  우선 변경사항 정리 

1. 소속감 고취를 위한 프로필 이미지 표시

#perl-kr 소속감 고취를 위한 프로필 이미지 박아넣기 90% 완료. // 한명만 트위터 아이디 몰라서 실패 =3==3 '필마나'Thu May 20 14:05:53 via Echofon

  위의 캡쳐화면을 보시면 알 수 있듯이 지난 일주일간의 로그를 뒤져서 각 유저별 메타정보(지금은 이미지 밖에) 뽑아냈고.. 이걸 Template 에서 매치시켜서 표시하고 있습니다. 이걸로 소속감 90% 향상 =3==3

2. Pusher 를 이용한 WebSockets 적용 

 HTML5 설레발을 추가했습니다. 구성은 아주 심플합니다.
 단지 Pusher 의 API 를 사용해서 그곳으로 리퀘스트를 날려주면 Pusher 에서 브라우저랑 통신하는 것 뿐입니다. 
 이걸 IRC 의 대화내용을 거의 리얼타임(이런저런 latency를 생각하면 1초 정도 늦지만)으로 웹 브라우저에서 모 채널의 대화내용을 그대로 볼 수 있다는 것입니다.

3. 시간대별 대화목록 전환 등등등 
 예전에 만든 IRC 로그 뷰어에서는 있었는데... 지난번에 서버 옮기면서 지워버리고 새로 만들면 되지 뭐... 하면서 그냥 방치했었는데.. 이번에 버튼 이미지를 추가해서 맹글었습니다. 그냥 뭐 jQuery 로 시간대별 클래스 추가하고 그걸 이래저래 전환해주는 것 뿐.. =3=3
 버튼 이미지는 그냥 이걸로 만들어 봤습니다. (순수 CSS)


4. 이런저런 js 라이브러리 사용 
 - jQuery
 - Pusher
 - pretty.js

  뭐 대부분 jQuery 로 그냥 샥샥 하면 되는 수준이라서.. 특별한 의미는 없습니다. 리얼타임으로 푸쉬되는 대화내용들의 표시에.. 이게 몇분전 대화내용인가 하는 표시형식을 취하기 위해서 pretty.js 를 사용했습니다. 
  그리고 대화내용중의 url 이나 이메일에 대해서는 자동으로 링크를 설정하거나...
  그리고 @Anywhere 를 붙이거나, CPAN 모듈이름만으로 자동으로 링크를 설정해주거나... 하는 걸 생각하고 있습니다.


// 이상... 사실 뭐 없는 비공개 서비스의 변경내용입니다. :-D 
 Pusher 에 대해서는 다음기회에 한번 다뤄보도록 하겠습니다.
신고
IT/Perl 2010.01.04 14:30

[ Perl ] Twitter Steam + IRC = Twit2IRC

  새해를 기념하며 @aer0 님께서 날림으로 쓴 펄 스크립트 하나가 있었는데 바로

#Hi2010 태그가 달린 메시지를 IRC로 뿌려주는 IRC채널입니다. 웹으로 접속 http://webchat.freenode.net/?randomnick=1&channels=Hi2010
 이었습니다. 
 새해 첫날에 #Hi2010 해쉬태그를 통해서 많은 사람들이 트윗을 날렸는데... 그것을 실시간으로 IRC 에서 볼 수 있게 만들었습니다.
 동기는 #Hi2010 을 모아서 보여주는 웹페이지를 누가 만든 것을 보고 10분만에 만드셨다고 하는군요.  :-) 
  메인이 되는 모듈은 예전에 제 블로그에서도 몇번인가 소개한 적이 있었던 AnyEvent::Twitter::Stream 과 요즘 대세인 AnyEvent 로 만든 IRC 클라이언트 AnyEvent::IRC::Client 입니다. 

  
  이런 걸 보면 역시.. 개발은 타이밍입니다. 
  소스코드는 아래와 같습니다. 

신고

'IT > Perl' 카테고리의 다른 글

[ Perl -> 펄 ->뻘짓 ] SVN 커밋 전후처리 with ShipIt  (2) 2010.01.14
[ Perl ] Twitter Steam + IRC = Twit2IRC  (2) 2010.01.04
[ Perl ] Catalyst + Plack + Apache  (0) 2010.01.04
[ Perl ] Cafe Crawler  (0) 2010.01.03
IT/Perl 2009.11.26 18:31

[ Perl ] IRC + AnyEvent + Moose -> Morris

2008/05/20 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #1
2008/05/21 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #2
2008/05/23 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #3
2008/05/27 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #4
2008/05/27 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #5
2008/05/29 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #6
2008/06/18 - [IT/Perl] - [ Perl ] IRC BOT을 만들어봅시다 :-) #번외편


그러고보니 1년이 지났군요. PoCo::IRC 로 IRC 봇 설레발을 작년에 7개넘게 포스팅한 걸로 압니다. 다시 뒤져보면 결국은 문서에 있는 코드 그대로 붙여쓰기 한 것 밖에 지나지 않는 군요.

  올해는 이벤트처리, 비동기처리 등에 관한 이슈가 빈번하게 들려오고 있습니다. AnyEvent 붐이라고 할 정도로 많은 새로운 모듈이 AnyEvent 의 네임스페이스를 차지하면서 올라가고 있습니다. 저도 공부의 필요성을 느끼고 문서를 읽어보고자 했으나, 대략 멍~ 한 상태는 어찌할 수 없었습니다.
  결론은 직접 써보고, 만들어보는 수 밖에 없었습니다.
 
  Perl 을 나름 제대로 쓰고자 했던 출발점이 IRC 봇 만들면서 그랬듯, AnyEvent 도 그렇게 시작하려고 했었습니다.
  그런데!! 일본의 Perl 해커 Maki 씨가  Morris 라는 봇을 만든 것을 봤습니다. Morris 는 AnyEvent + Moose 를 뼈대로 만들어졌으며, 매우 현대적인 펄 프로그래밍 스타일을 엿볼 수 있었습니다.
 
  특징으로는, 설정파일 기반으로 여러개의 IRC 서버에 접근할 수 있으며, 각 네트워크별로 Plugin 을 할당해줄 수 있고, 쉽게 Plugin 을 확장할 수 있습니다.

  http://github.com/lestrrat/Morris

  그래서 기존에 쓰고 있던 PoCo::IRC 로 깨작거렸던 것도 Morris 로 바꿨습니다. 뭐 추가로 이래저래 작업해야할 것들도 많겠지만... 일단은 너무 만족스럽습니다. :-)

  지난번 PoCo::IRC 프로세스 두개 띄워서 서로 IKC 로 묶어줬던 부분은 AnyEvent::MP 를 이용해서 같은 기능을 구현할 수 있습니다. AEMP는 Erlang Style 의 Multi-Processing/Message-Passing Framework 입니다. 기존의 PoCo::IKC 를 사용했던 경우는 두개의 프로세스에 각자 IKC 서버/클라이언트를 띄웠지만, Morris 가 사용하는 AEMP 의 경우는 Seed 역할을 하는 Process 가 필요합니다. 그 Seed 프로세스가 중간에서 중계역할을 해주는 것이죠.
 
  http://search.cpan.org/perldoc?AnyEvent::MP
 
  Intro 문서를 참고로 하시면 도움이 되실 겁니다. (아니 그보다 Intro 를 이해하지 않으면 뭐가 뭔지 알 수 없었습니다) 아무튼 AnyEvent::MP 모듈을 설치하면 aemp 라는 커맨드파일이 생성됩니다.

  $ aemp gensecret
  $ aemp profile seed binds "*:4040"
  $ aemp seeds "*:4040" nodeid anon/
  $ aemp run profile seed
 
 그 aemp 커맨드를 이용해서 위의 명령을 실행합니다. (Intro 에서 순서대로 따라하면 자연스레 입력하게 됩니다) 뭐 통신시 필요한 비밀키를 생성하고 시드를 4040포트로 붙여서 띄운다 라는 그런 내용입니다.

  IKC 대신에 AEMP를 사용하기로 했으니... 기본 플러그인인  Morris::Plugin::MP 를 사용하는 전제에서 아래의 Relay 플러그인을 그냥 냅다 써봤습니다.



  뭐 사실 hanirc <-> freenode 간에는 인코딩 타입등의 설정도 필요하겠지만... 그건 필요하신 분의 숙제로 남겨두도록 하겠습니다. :-)

  현재 irc.freenode.org #perl-kr <-> irc.hanirc.org #perl 은 이렇게 각 채널간의 메시지를 서로 릴레이하고 있습니다.

  그외 Plagger 같은 것들을 사용해서 RSS 를 긁어준다느니 등등도... AEMP 를 사용하는 플러그인 하나만 추가해주면 간단할 겁니다. 그냥 편히 쓰던 거 마저 써도 되지만... 그게 관리상에 이런저런 문제가 좀 있어서요.
  모두 AnyEvent!
신고
IT/Mac 2009.01.28 21:03

[ Mac ] Colloquy (Mac IRC Client App) Plugin 만들기


 Colloquy 는 Mac 의 대표적인 IRC 클라이언트 App 입니다. 전 Mac 을 쓸 때에 이 Colloquy 를 가장 많이 사용합니다. 그만큼 IRC 에서 떠드는 일이 많아지고 IRC 는 하나의 생활이 되어버렸네요.
 Perl 로 재미있는 거 만들 수 없을까? 했을 때도 가장 먼저 떠오른 것이 IRC BOT 이었구요... 이번에는 IRC BOT 에서 할 수 없는.. 뭔가 클라이언트 환경에 맞는 일을 해보고 싶었습니다.
 구글 선생님에게 "Colloquy Plugin" 을 치니까 떡하니 나오더군요.

Plug-In Love - Unlimited extensability through Plug-Ins.

  
 - Colloquy :: Write Plug-Ins :  http://colloquy.info/project/wiki/Development/PlugIns

 이 페이지에서는 Plugin 을 쓸 때 지원하는 언어를 나열해놨습니다. Objective-C,  AppleScript, Ruby, Python, JavaScript .... 불행히도 Perl 은 없군요. CamelBones 가 저렇게 방치된 이상 더는 어떻게 못하나 봅니다. 이건 Mac 을 쓰는 Perl Guru 들이 어케 안해줄런지요.
  아무튼 제가 제대로 할 줄 아는 건 JavaScript 밖에 없으니 ... 일단 JavaScript 도 플러그인을 만들어 보기로 했습니다. 아주 친절하게도 플러그인을 만들기위한 기본 Template 이 갖추어져 있습니다. 


  IRC 프로토콜 상의 대부분의 이벤트에 대해서 정의가 가능하며, Mac 스럽게도 Growl 과 연동도 시킬 수 있습니다. 입력시킬 내용을 자동으로 필터링해서 보거나, 보여지는 내용에 대해서도 입맛에 맞게 바꿔서 볼 수 있습니다. 이런 것들로 "하이라이트 단어 설정"(이건 Colloquy 설정화면에도 있습니다), "이모티콘 설정"(이것도 물론...) 등을 할 수 있겠죠.

  제가 IRC 에서 주로 활동하는 곳은 #perl(irc.hanirc.org), #perl-kr(irc.freenode.org) 입니다. 
  채널의 성격에 맞게 새로운 CPAN 모듈이나.. 어느 모듈의 사용등에 관한 얘기가 자주 등장하기도 하죠. 생소한 CPAN 모듈이 나오면 Module 이름을 직접 URL 창에 쳐서 검색을 하거나 하기도 합니다만... 이 부분에서 CPAN 모듈을 정규표현으로 긁어서 CPAN 모듈 페이지에 링크를 걸어주도록 했습니다.
  그 내용은 아래와 같습니다.

  1. function processIncomingMessage( message, view ) {
  2.     var html = message.bodyAsHTML();
  3.     var finalHTML = html;
  4.     var linkRegex = new RegExp( '<a href="([^"]+)">([^<]+)<\/a>', 'gim' );
  5.     var result;
  6.     while( ( result = linkRegex.exec( html ) ) ) {
  7.         var name = result[1];
  8.         var schemeRegex = new RegExp( 'https?:\/\/' );
  9.         if( schemeRegex.test(name) )
  10.             continue;
  11.        
  12.         if( name ) finalHTML = finalHTML.replace( result[0], '<a href="http://search.cpan.org/perldoc?' + name + '" title="' + name + '">' + name + '</a>' );
  13.     }
  14.  
  15.     message.setBodyAsHTML( finalHTML );
  16. }
  17.  

  이 파일을 적당한 파일이름('CPAN.js') 로 저장해서 ~/Library/Application Support/Colloquy/Plugins/ 아래에 놓아둡니다. 그리고 IRC 상에서 /reload plugin 을 쳐서.. 플러그인을 불러옵니다. 


  위처럼 CPAN Module을 때렸을 때는 저렇게 Link 로 표시되며, 해당 링크를 누르면 브라우저에서 저 모듈 페이지가 열리게 되는 것입니다. 물론 제 Client 에서만 저런 HTML 형식으로 표시되기때문에 상대방은 제가 뭔 일을 하는 지 모르는 반응을 보이게 되는 것이죠.
  아, 다행스럽게도 Colloquy 는 ::이 들어간 것을 HTTP URL 링크로 처리하도록 정규표현을 걸어두었기 때문에 위의 JavaScript 소스와 같이 간단하게 모듈이름을 뽑아 올 수 있었습니다. 
  Windows 의 IRC 클라이언트 중에도 전용 스크립트를 사용해서 저렇게 플러그인을 쓸 수 있는 것이 있는 걸로 알고 있습니다. 많은 분들이 클라이언트 프로그램에서 플러그인을 사용하는 것을 봐왔고, 때로는 악질적인 행동으로 방 분위기를 더럽히기도 하죠.
  차후에 시간이 나면  여러가지 편리한 플러그인을 만들어서 공개해보고 싶네요. 
  Mac 을 쓰시며 IRC 를 애용하는 분이 계시면 꼭 한번 해보라고 권해드리고 싶습니다.
신고
IT/Perl 2008.08.21 13:53

[ Perl ] Perl 로 메일보내기 ... SSMTP 와 MIME::Lite 를 사용해서!


  Perl 로 메일을 보내려면 어떻게 해야할까요?

  저도 몰라서 근처 사는 최선생님께 물어봤습니다.

사용자 삽입 이미지

"메일, 그거 삶아먹으면 되는 거 아닙니까?"


.
.
.
라는 것은 훼이크고...

 Net::SMTP 라든가... CPAN 을 찾아보면 Mail 에 관련된 모듈은 널리고 널렸습니다.

 전 MIME::Lite 를 사용하기 때문에... 이쪽으로만 다루겠습니다. :-)

 사실 Korean Perl Workshop 참가신청을 만들 때, 메일 송신 스크립트 때문에 좀 고단했던 적이 있었습니다.
 메일서버도 없고, 사용할만한 건 Gmail 인데... CPAN 에서 Gmail 에 관련된 메일 송신 모듈이 제대로 동작하지 않는 것도 문제였죠. KPW 자체적인 메일 서버도 가지고 있지 않았구요. 시간은 촉박했고...
  설령 메일서버가 있다고 해도... 메이저 포털로 메일을 보낼 때 잘 안된다고 하는 그런 이슈도 있었구요.

 그때 한줄기 빛이 내려왔는데,, 그것이 SSMTP 라는 것입니다.
 
 SSMTP 가 무엇이냐는 자세한 설명은 여기에서 하지 않겠습니다. 구글해주세요.

 우분투에서 간단하게 SSMTP 패키지를 설치할때는...

sudo apt-get install ssmtp

 로 설치가 가능합니다.

  그리고는 /etc/ssmtp/ssmtp.conf 에 아래의 설정을 넣습니다.

root=your.email@gmail.com
mailhub=smtp.gmail.com:587
useSTARTTLS=YES
AuthUser=your.email@gmail.com
AuthPass=your.password
rewriteDomain=gmail.com
FromLineOverride=YES
hostname=blah

 그래서 메일계정은 gmail 을 사용하기로 하고 위와같이 설정했습니다. Gmail 을 사용하면 어디든지 메일을 보낼 수 있기 때문이었죠. Gmail 을 스팸처리하는 곳은 없을 테니...
  MIME::Lite 모듈이 없으면 설치해주세요.
 
use strict;
use warnings;
use MIME::Lite;

my $msg = MIME::Lite->new(
    'Return-Path' => 'sender.email@gmail.comr',
    'From'        => 'sender.email@gmail.com',
    'To'          => 'receive@email.com',
    'Subject'     => 'saillinux 산 버터, 어떻게 생각하시나요?',
    'Charset'     => 'utf-8',
    'Encoding'    => '8bit',
    'Data'        => '사실 그거 삶아먹으면 괜찮은거 아닙니까?'
    );
$msg->send;

 이렇게 스크립트 하나 만들어서 실행시키면...

사용자 삽입 이미지

 이렇게 메일이 오게됩니다. +_+

 뭐, 파라메터 넘겨서 From ,To 바꾸거나, 제목 바꾸거나... DB 에서 긁어와서 집어넣거나... 혹은 Template 를 사용해서 메일 내용을 꾸미거나... 하는 방법도 있겠죠.

 여러가지 다양한 부수적인 내용은 직접 해보시면 됩니다.
 현재 KPW 사이트에서는 KPW::Mail 이라는 Wrapper 모듈을 만들어 두고 사용하고 있습니다. Template 도 만들어서 Mail 내용등은 완전히 분리시켜두고 말이죠.

  Daum이나 Yahoo 에서는 Subject 가 깨지는 현상도 있다고 하는데요. keedi 님께서 이에 대한 처치방법을 알려주셨네요.
  use MIME::QuotedPrint qw(encode_qp);
  use Encode qw(encode);

 필요한 모듈을 use 해서... Subject 를

...
Subject => '=?UTF8?Q?' . encode_qp(encode('utf-8', "블라블라"), '') .'?=',
...
 
 이런식으로 감싸면 된다는 군요. keedi++

 (SSMTP 는 jachin 님으로부터 줏어들어서 saillinux 님께서 설정해주셨습니다. jachin++, saillinux++)


  :: 이상 IRC #perl-kr 에서 h0ney 님께서 "메일 어케날려요?" 라는 떡밥을 날리셔서 썼습니다.
  :: (떡밥주도 블로그 포스팅 전략!!)

:: 2011/12/29 추기
  최근 코드관련 얘기를 하는 블로그를 따로 만들어서, 위의 내용을 좀 더 보완했습니다.
  http://jeen.github.com/blog/2011/12/29/perl-email-send/ 
신고
IT/Perl 2008.06.18 13:11

[ Perl ] IRC BOT을 만들어봅시다 :-) #번외편

 지난달 IKC에 대한 간단한 소개 이후로 IRC봇 만들기에 관련된 여러 리퍼러를 확인했습니다. 거기에 요근래 봇관련 글에 댓글도 달리는 영광을 누리기도 했었습니다.(아아~ 관심 x2)
 봇 만들기글을 올리고 한 달동안의 경과에 대해서 말해보고자 합니다.

 1. 프로젝트 멤버

 - 오늘까지 6분이 프로젝트 멤버가 되셨습니다.(안습;;)
 - (물론 제가 억지로 집어넣으신 분도 계십니다;)
 - 요즈음 봇에 신경을 너무 많이 써주시는 분(yu**)도 계시고...
 - 달랑 한번 커밋 해주시고는 나몰라라하시는 분(Whi*****)도 계십니다 :-)
 - 나머지 분들은 바쁘신 와중에 관심(만) 보여주시고 계십니다. ;;

 2. 이슈
사용자 삽입 이미지
  - 대충 이런 이미지와 같이 스크립트의 버그나 미약한 기능들에 대해서는 이슈를 등록해놓습니다.
  - 어떤 사소한 것이라도 말이죠 :-)

 3. 리비젼
사용자 삽입 이미지
- 현재 리비젼은 34번까지 올라와 있습니다.
- 버그가 있던 없든, 일단 커밋하고 보자는 생각으로 마구잡이 커밋을 감행하고 있습니다.
- 아, 코드리뷰 할 때도 있습니다. 아래의 예제 처럼요.
   ex> 우왕.. 너무 좋아요. 수고하셨어요.
  (근데 코드얘기는 없...)
- 차후에 전체적인 코드리뷰만으로 포스팅할 생각을 하고 있습니다. :-)

4. 접속자
 * 국제
사용자 삽입 이미지
사용자 삽입 이미지

- Google Code 는 Google Analystic 을 지원하고 있습니다.
- 6개국에서 열혈한 관심을 보이고 있습니다. +_+ (물론 방문자 수는 캐안습입니다)

 * 국내
사용자 삽입 이미지
사용자 삽입 이미지

  - 이렇게 지역적으로 고른 분포를 보이고 있습니다. (물론 방문자수는 안습입니다)

5. 그 외 하고 싶은 이야기

  - 사실 언어를 공부할 때 가장 좋은 방법은, 남의 코드 베끼는  것이나 플젝에 참여하는 게 아닐까 생각합니다.
  - 그리고 이런 저런 새로운 모듈을 갖다 붙이든가, 자신이 하고 싶은 방향으로 뜯어고치든가, 여러가지 새로운 경향을 실험해볼 수 있는 장소가 되기도 하죠(yu** 님께서 Moose 실전용으로 커밋한 경우).
  - 뭐, 결국 하고 싶은 이야기는.. 와서 "왜 이렇게 코드가 개똥 같은 거야!"라고 말해줄 수 있는 사람이 필요합니다. 그리고 그 사람에게 배우고 싶다는 것이죠.
  - 한국형 CodeRepos 같은 것은 어떨까 막 생각하고 있습니다.
  - Perl 에 한정짓지 않고 마구잡이 커밋용 서버가 필요해질지도 모르겠어요
  - 결론은 perl-irc-bot 많은 참여를 부탁드립니다. :-)



신고
IT/Perl 2008.05.29 11:48

[ Perl ] IRC BOT을 만들어봅시다 :-) #6


IRC BOT을 만들어봅시다 :-) #6

 - #5 에서는

  - Encode 모듈을 사용한 한글 취급에 대해서 알아보았습니다.
  - 실제 사용중인 Bot Command 를 예로 하여, 봇 커맨드 추가/사용 법을 알아보았습니다.

 - #6 에서는

  - IKC를 이용해서 외부 이벤트를 IRC에 알리는 방법에 대해서 알아보겠습니다.


 - IKC

  IKC - Inter-Kernel Communication
  자세한 내용은 PoCo::IKC 페이지를 참조해주세요.
 사실 PoCo::IRC 도 그렇지만, PoCo::IKC 도 제대로는 알지 못합니다. 단지 어디서 이런 것을 써서 구현하고 있다는 것만 보고 단순히 따라하기 수준에만 그친 형편이라서요. CPAN 에는 *::Notify::IRC 모듈이 있는데, 그 중에 Plagger::Plugin::Notify::IRC 와 Kwiki::Notify::IRC 를 참조해서 만들었습니다. Plagger 의 경우에는 Plagger 봇 스크립트를  제공해주고 있으니.. 그것을 대충 수정하면 쓸만하게 됩니다. :-)


 - Tutorial

  우선 적절한 사용예제를 Google 에서 찾고는 긁어와 봤습니다.

use warnings;
use strict;
use POE qw(Session);
use POE::Component::IKC::Server;
use POE::Component::IKC::Specifier;

POE::Component::IKC::Server->spawn(
    port => 31338,               # 포트
    name => 'AppServer',      # 서버이름
);

POE::Session->create(
    inline_states => {
        _start        => \&service_start,     # 초기화 작업 정의
        calc_sum      => \&service_calc_sum, # 작업내용 구현
        did_something => \&service_response, # 작업내용을 클라이언트에 전달
      }
);

POE::Kernel->run();
exit 0;

sub service_start {
    my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];

    my $service_name = "application";
    $kernel->alias_set($service_name); #서비스 이름을 정의해 줍니다.
    $kernel->call( IKC => publish => $service_name, ["calc_sum"] );
     # 해당 서비스이름과 작업을 공표합니다.
     # 이로써 client 에서는 해당 서비스 이름을 통해서 공표된 작업에만 접근할 수 있습니다.
     # calc_sum 이라고 공표된 작업은 위의 POE::Session안에서 inline_states 안에 기술합니다.
     # 고로 calc_sum 이라는 작업이 클라이언트에서 넘어왔을 때, service_calc_sum 을 호출하게 됩니다.
}

sub service_calc_sum {
    my ( $kernel, $heap, $request ) = @_[ KERNEL, HEAP, ARG0 ];
    my ( $data, $rsvp ) = @$request;

    my $sum = 0;
    if ( ref($data) eq "ARRAY" ) {
        $sum += $_ foreach @$data;
    }

    $kernel->delay_set( did_something => 1, $rsvp, $sum );
}

sub service_response {
    my ( $kernel, $heap, $rsvp, $sum ) = @_[ KERNEL, HEAP, ARG0, ARG1 ];
    $kernel->call( IKC => post => $rsvp, $sum );
    # 작업 결과를 넘겨받아 client 로 넘겨줍니다.
}

 이것은 IKC 서버의 구현입니다. 이것을 적당한 이름( ikc-server.pl )으로 저장합니다.
 다음은 클라이언트의 구현입니다.
 
use warnings;
use strict;

use POE::Component::IKC::ClientLite;

my $remote = create_ikc_client(
    port    => 31338,
    name    => "blahblah",
    timeout => 1,
);
die $POE::Component::IKC::ClientLite::error unless $remote;


my $return_value = $remote->post_respond( 'application/calc_sum', [1,2,3,4,5] );
 # 서버에서 지정한 서비스 이름과, 작업을 여기에서 호출됩니다.
die $POE::Component::IKC::ClientLite::error unless defined $return_value;

print "The sum is: $return_value\n";
exit 0;

 이것 역시나 적당한 이름 ( ikc-client.pl ) 로 저장합니다.
 우선 ikc-server.pl 을 실행한 다음에... 다른 터미널을 열어서 ikc-client.pl 를 실행합니다.
 그러면 해당 ikc-client.pl 을 실행한 터미널에서는
 
The sum is: 15

이라는 결과가 뜨게됩니다.

 Client 에서 1,2,3,4,5 라는 배열값(배열의 리퍼런스)을 서버에서 지정한 서비스 이름과 작업에 보내고, Server에서는 그것들을 전부 더해서 그 값을 클라이언트로 보내주는 겁니다.

 이를 응용하면 어떤 것이 가능할까요?

사용자 삽입 이미지
현재 #perl-kr@irc.freenode.org 에서는 CPAN 에 새로 등록된 모듈,
 perlmania 의 새로운 글들, perldoc-kr 에서의 새로운 커밋에 대해서 통보를 받고 있으며,
 #perl@irc.hanIRC.org  <=> #perl-kr@irc.freenode.org 간의 메시지 전달도 가능하게 되었습니다.
 
사용자 삽입 이미지
사용자 삽입 이미지

 [freenode] 라고 붙은 건 freenode 의 대화를 hanIRC에서 받은 것이고,
 [hanIRC] 라고 붙은 건 hanIRC 에서 freenode 의 대화를 받은 것입니다.

 그외에도 CodePad를 도입하고 있습니다. 특정 언어 코드를 웹페이지에 갖다 붙이면,
 그것을 적절하게 컴파일/인터프리트 해서 그 결과를 웹페이지에 보여주게 됩니다.
 모듈 의존성이 있는 코드들에 대한 결과를 자세하게 보지는 못하지만, 그래도 깨끗하게 코드를 볼 수 있습니다.
 
사용자 삽입 이미지

 (1) codepad 에 코드를 넣어서
 (2) 그 결과가 담긴 URL 을 복사해서
 (3) IRC에 붙여넣는다.

 라는 과정을

  (1) codepad 에 코드만 넣으면 끝

으로 축약했습니다.

  CodePad 의 구성을 그대로 빌려와서, WWW::Mechanize 를 통해서 해당 폼 값을 CodePad 로 날려서
그 결과가 되는 URL 을 받아, 그 결과값을 IKC를 통해서 IRC에 자동으로 통보해주는 것입니다.
(이는 saillinux님과 pung96님께서 수고해주셨습니다.)

 위에서 언급한 이런 것들은 모두 perl-irc-bot 에서 구현되어 있습니다. 정리되지 않은 코드라 더럽기도 하지만, "이따위 코드 눈뜨고 봐줄 수 없어! 내가 수정해주겠어!" 라면서 수정펀치 날려주실 분들과 커미터 분들을 모집하고 있습니다. 물론 사용하실 분들은 그냥 사용하셔도 됩니다. :-)

 - THE &

 이상으로 장장 6편에 걸친 그다지 도움되지 않는 IRC BOT 만들기를 마치겠습니다. :-)
 6편 모두는 IRCBOT만들기 라는 태그로 묶어놨습니다.

 제 자신도 공부가 부족한 편이라 깊숙한 계층에서 어떤 일들이 벌어지는 가 자세히 모르기 때문에, 공부하는 입장에서 이렇게 적어봤습니다. 보다 나은 코드와 보다 나은 기능, 보다 편리한 방법, 그리고 보다 깊은 계층에서의 움직임에 대한 격렬한 논의는 아래에 언급된 IRC나 email 로 부탁드리겠습니다. :-)

- PR

※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl, irc.freenode.org, #perl-kr)에서 JEEN에게 연락하시면 됩니다.


신고
IT/Perl 2008.05.27 16:12

[ Perl ] IRC BOT을 만들어봅시다 :-) #5


 흡, 휴가라서 그런지 시간이 남네요. 그러면 시작해 보겠습니다.


IRC BOT을 만들어봅시다 :-) #5

- #4 에서는...

  - 간단하게 CPAN 상에 올려진 PoCo::IRC::Plugin::(.+) 에 대해서 알아봤습니다.
  - Plugin 추가/사용에 대해서 간단하게 알아봤습니다.

 - #5 에서는

  - Encode 모듈을 사용한 한글 취급에 대해서 알아보겠습니다.
  - 실제 사용중인 Bot Command 에 대한 사용예제를 보여드리겠습니다.
 
 - IRC에서의 한글 사용

 현재 hanIRC는 cp949 라는 문자인코딩을 사용하고 있습니다. freenode 같은 경우는 utf-8 이죠. 최근에 한국 펄 커뮤니티(이러면 뭔가 거창해 보임..) 쪽에서 freenode 와 hanIRC 병행체제로 가게 되어서, BOT도 이에 맞춰서 기존의 인코딩 방식을 바꿔줘야 했습니다.
 그리고 Perl 에서의 이런 Encode 관련된 모듈은 이름 그대로 Encode 입니다. 일본의 Dan Kogai 씨가 이 Encode 모듈의 저자입니다.
사용자 삽입 이미지

 흠.. 사실은 지난 YAPC 에서 사인 받았더랬습니다.

 Encode::KR 페이지에서도 간단하게 사용예제를 볼 수 있습니다. 말 그대로 간단합니다! :-)

   use Encode qw/encode decode/; 
$cp949 = encode("cp949", $utf8); # loads Encode::KR implicitly
$utf8 = decode("cp949", $cp949); # ditto

 Encode::KR 페이지의 SYNOPSIS 부분을 그대로 따왔습니다.

 위의 예제 그대로, 일단은 use Encode; 해주시고...
  cp949 문자열을 utf-8으로 바꾸기 위해서는 cp949 문자열을 cp949 로 decode 해주시면 됩니다. 거꾸로 utf8을 cp949 문자열로 바꾸기 위해서는 utf-8 문자열을 cp949로 encode 해주시면 끝입니다.

 어때요? 참 쉽죠? 간단하죠?
 
 - Tutorial

 그러면 간단한 사용예제를 참고해보겠습니다. #4 플러그인 예제를 축약한 것은 여기서 사용하기 위해서 였습니다. :-)

 # URL Find : Title Notify                                                                                                                                  
sub irc_urifind_uri {
    my ($who, $channel, $url, $obj, $msg) = @_[ARG0 .. ARG4];
   
        my $html = scraper {
            process 'title', title => 'TEXT';
        };
        my $data = $html->scrape(URI->new($url));
        return 0 unless $data->{title};
        my $title = $data->{title}; # Web::Scraper 에서 나온 결과물은 UTF-8으로 반환
        $title = encode('cp949', $title); # UTF-8 인 title 내용을 cp949 로 변경
        $irc->yield( privmsg => $channel => $title ); # 해당 채널에 title을 알려줍니다.
   
}

 대화중에서 URL 이 포함되었을 경우에는 그 URL의 title을 얻어내는 코드입니다. 여기에는 Web::Scraper 라는 모듈을 사용해서 간단하게 title을 뽑아낼 수 있습니다. (물론 use Web::Scraper; 해주세요) LWP::Simple 등을 이용해서 간단히 정규표현 써서  얻는 방법도 있지만... 그거야 쓰시는 분 맘대로 이기 때문에... :-)
 아무튼 Web::Scraper 에서 긁힌 결과는 UTF-8 문자열로 반환됩니다.
 이것을 cp949 로 인코딩하구요. 그리고 그 값을 채널에다가 뿌려줍니다.

사용자 삽입 이미지

그럼 이렇게 나오겠죠?



  그럼 다른 예제를 보여드리겠습니다. 물론 perl-irc-bot 에서 사용하고 있는 예제중에서 긁어오겠습니다.

 최근에 perl-irc-bot 프로젝트에 처음으로 커밋해주신 하얀_고양이 님의 네이버 지도 예제입니다.

  !map [지역] 을 입력하면.. 해당 지역의 지도를 나타내는 그런 기능입니다.
 
사용자 삽입 이미지

이같이 사용합니다.


 그러면...

사용자 삽입 이미지

 이렇게 울릉군의 중심을 나타내게 됩니다. :-)
 코드는 아래와 같습니다.

use URI::Escpae;
my $naver_map_url = 'http://map.naver.com/?query=';

sub irc_public {
    my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
    my $nick = ( split /!/, $who )[0];
    my $channel = $where->[0];

   if ($what =~ /^!([a-z0-9]+)\s?(.*?)?$/) {
        my ($command, $desc) = ($1, $2);
 
        if ($command eq 'map') {
                my $address = $naver_map_url . URI::Escape::uri_escape($desc);
                $irc->yield(privmsg=>$channel=>$address);
        }
   }
}

 여기서는 URI::Escape 모듈을 use 합니다. 2바이트 문자가 URL 에 그대로 들어가면, 어떤 브라우저에서는 자동으로 바꿔서 보내주기도 하지만, 어떤 브라우저는 그것을 인식하지 못하고 글자가 깨지는 경우가 발생합니다.
사용자 삽입 이미지

 보시다 시피 "서울시"라고 2바이트 문자가 query 의 값으로 직접 넣었을 경우의 결과입니다. 뭐 서울 주변이기는 하지만, 제대로 된 값이 아닐경우의 기본 표시가 이곳인 듯 합니다. :-) 검색창의 서울시라는 글씨도 막 깨져있죠?

 그래서 URI::Escape 모듈로 해당 문자열을 uri_escape 해줍니다.

 그외 여러가지 아이디어가 있으시다면, Plugin 모듈을 직접 만들어서 많은 사람들이 사용할 수 있게 만들어도 좋을 것이고... 아니면 자신만 필요한 기능이 있다면 직접 이렇게 Bot Command 를 만들어 주고 쓰셔도 됩니다.
 
  - Summary

   - Encode 모듈을 사용해서 UTF-8 => cp949 의 경우에는 encode("cp949", $utf8),
     cp949 => UTF-8 의 경우에는 decode("cp949", $cp949) 를 하면 됩니다.
   - Web::Scraper 를 통해 간단하게 HTML의 내용중의 일부를 긁어올 수 있습니다.
   - 2바이트 문자의 경우는 URI::Escape 모듈을 이용해서 URL을 Escape 시켜줘야 해당 결과를 제대로 파악할 수 있습니다.

 
 - #6 에서는

  - IKC를 통해서 외부 이벤트를 IRC에 넘겨주는 방법에 대해서 이야기 해보겠습니다.

- PR
※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl)에서 JEEN에게 연락하시면 됩니다.

신고
IT/Perl 2008.05.27 12:57

[ Perl ] IRC BOT을 만들어봅시다 :-) #4

 웃하, 주말 합쳐서 나흘간의 휴가를 받았었는데, 그동안 좀 나태한 모습도 있었고, 그동안 perl-irc-bot 플젝에도 여러개의 새로운 리비젼이 올라오게 되었습니다. [미투데이라든가, 트위터라든가...] 그러는 중에 처음으로 하얀_고양이 님께서도 커밋을 해주시면서 점점 불타오르기 시작했습니다.

IRC BOT을 만들어봅시다 :-) #4

  - #3에서는...

  - IRC 의 이벤트 처리에는 여러가지가 있고, 대부분을 처리할 수 있었습니다.
  - IRC 커맨드에는 여러종류가 있고, 상황에 맞춰서 사용할 수 있었습니다.

  - #4에서는...

   - PoCo::IRC에 Plugin 을 붙여보도록 해보겠습니다. :-)


  - PoCo::Plugin::(.*)

 현재 PoCo::Plugin 모듈은 수십개가 CPAN에 올라와 있습니다. 하지만 그 중에서 쓸만한 것은 별로 없는 편입니다. 현재 제가 사용하는 PoCo::Plugin 모듈은 PoCo::Plugin::URI::FindPoCo::Plugin::Google::Calculator 인데요. 근데 실제로 Google::Calculator 는 별로 사용하지 않는 편입니다. 있는 지도 모르시는 분들이 많고..;; 제가 도움말도 안적어 놔서 그렇습니다.

  - Tutorial

 여기서는 URI::Find 플러그인 모듈을 사용해서 그 URL의 타이틀을 얻어내서 찍어주는 간단한 예를 보이려고 합니다.

use POE qw(Component::IRC      Component::IRC::Plugin::URI::Find                                                                                                               
Component::IRC::Plugin::Google::Calculator                                                                                                      
);

  우선은 사용할 플러그인 모듈들을 use 해줍니다.
  여기서는 *::URI::Find, *::Google::Calculator 모듈을 사용해 보도록 하겠습니다.

POE::Session->create(
    package_states => [
        main => [ qw(_default _start irc_001 irc_public irc_urifind_uri) ],
    ],
    heap => { irc => $irc },
);

 URI::Find 의 경우에는 package_states 에 "irc_urifind_uri" 를 넣어줍니다. irc_public에서 URL을 판별하면 그것을 irc_urifind_uri 로 넘겨주게 됩니다.

sub _start {
    my $heap = $_[HEAP];
   
    my $irc = $heap->{irc};

    $irc->yield( register => 'all' );
    $irc->plugin_add(   'UriFind' =>     POE::Component::IRC::Plugin::URI::Find->new         );
    $irc->plugin_add(   'GoogleCalc' =>  POE::Component::IRC::Plugin::Google::Calculator->new );
    $irc->yield( connect => { } );
    return;
}

 _start 에서 plugin_add 를 통해서 해당 플러그인을 등록해 줍니다.

 Google::Calculator 의 경우에는 여기까지 해주시면 끝입니다.  URI::Find의 경우에는 URL을 판별했을 때 그것을 어떻게 사용할 지를 irc_urifind_uri 에 적어줍니다.
                                                                                                                                  
sub irc_urifind_uri {
    my ($who, $channel, $url, $obj, $msg) = @_[ARG0 .. ARG4];
   
    # (LWP::UserAgent|LWP::Simple) 로 여차저차 해서 <title>(.*)</title> 의 내용 뽑아서
    $title 에 담아서... 이렇게..
 
        $irc->yield( notice => $channel => $title );
    }
}

  URL을 판별했을 때의 irc_urifind_uri 에서 받는 인수는 ARG0 - 누가, ARG1 - 어떤 채널에서, ARG2 - 판별한 URL, ARG3 - URI::URL 의 객체, ARG4 - 무슨 말을 했는지 입니다.

 자, 그럼 그 URL을 받아서 타이틀을 뽑아내서, 넘겨주면 됩니다.
 LWP::Simple, LWP::UserAgent ... 뭐 여러가지가 있습니다. LWP 관련해서 한번 찾아보시면 줄줄줄 엮여져 나옵니다. There's More Than One Way To Do It 이라고 하잖아요.
 이 부분의 구현은 직접 하시면 됩니다. 물론 perl-irc-bot 에는 직접 구현되어 있으니, 참조하셔도 됩니다.

 대부분의 Plugin::(.*) 페이지에 가시면, 간단한 사용 예제를 함께 볼 수 있습니다.

사용자 삽입 이미지

 이렇게 http://www.daum.net/ 이라고 치면 Perl_^^ 이라는 봇은 daum의 타이틀을 따오는 것이죠. 뭐, 어떻게 받아들이느냐에 따라서 별로 쓸데없는 기능이기도 합니다만...

사용자 삽입 이미지

  그리고 아까 위에서 말하다가 그만둔 Google::Calculator 의 사용법입니다.
  봇을 호충하고 calc [ 적당한 식 ] 을 써주시면 됩니다. 여러가지 사용법에 대해서는
PoCo::IRC::Plugin::Google::Calculator 페이지를 참조하시면 됩니다.

 - Summary

  - 간단하게 CPAN 상에 올려진 PoCo::IRC::Plugin::(.+) 에 대해서 알아봤습니다.
  - Plugin 추가/사용에 대해서 간단하게 알아봤습니다.

 - #5 에서는

  - Encode 모듈을 사용한 한글 취급에 대해서 알아보겠습니다.
  - 실제 사용중인 Bot Command 에 대한 사용예제를 보여드리겠습니다.

 - PR
※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl)에서 JEEN에게 연락하시면 됩니다.
신고
TOTAL 457,923 TODAY 5

티스토리 툴바