블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2009.08.08 12:28

[ YAPC::Asia 2009 Tokyo ] 티켓구입 성공했습니다.

 어제(7일) 10시부터 YAPC::Asia 2009 Tokyo 티켓 판매가 시작되었습니다. paypal 로 결제해야하는데, 인증방법이 귀찮고, 신용카드 한도초과 상태에 있어서 조마조마한 시간을 보내던 결과 한 의인(@y0ngbin)의 도움으로 무사히 티켓을 구입하게 되었습니다. 티켓 가격은 5000엔!

 그런데 YAPC 가 뭔데 그러냐... 라고 하신다면..
 YAPC 는 Yet Another Perl Conference 는, 말 그대로 Perl 관련 기술을 중심으로 한 국제적인 컨퍼런스입니다. 미대륙의 YAPC::NA, 유럽의 YAPC::EU 와 함께 세계에서 가장 큰 규모의 Perl 컨퍼런스죠. YAPC::Asia 는 2006년부터 시작되었으며, Shibuya.pm 이라는 펄 커뮤니티 중심으로 2006-2008년 3년간의 컨퍼런스가 주최되었습니다. 하지만 이번에는 JPA (Japan Perl Association) 라는 펄 일본 법인에서 주최를 하게 되었죠.

 올해는 The Perl Foundation 의 이사장인 Richard Dice, Perl의 대표적인 웹 어플리케이션 프레임워크인 "Catalyst" 와 모던 OOP "Moose" 개발등을 하고 있는 Jonathan Rockaway, 이게 펄인지 아닌지 헷갈리게 만든 "Devel::Declare" 를 만든 Florian Ragwitz 가 초청인사로 참여합니다.

  래리영감님은 아마 올해는 안 오는 걸로 알고 있습니다.

  뿐만아니라 일본 유수의 펄 해커들도 당연히만날 수 있습니다.
 저에게는 이번이 3번째 YAPC 군요. 이제 슬슬 해외의 YAPC 도 가보고 싶지만 말이죠... ;ㅁ;

  http://yapc.asia/

* 올해의 RubyKaigi 는 1시간만에 예매가 끝나버렸다고 합니다. 그런데 RubyKaigi 에서 참가신청 이전에... 어떤 스케쥴로 진행되는 가는 정해지지 않았다는 얘기가 있습니다;; 뭘 하는 지 모르겠지만 일단 참석한다 라는 것에 의의를 두고 있는 것 아니냐 라는 얘기가 우스개 소리도 있었죠. :-)
 그에 반해서 YAPC::Asia 는 느긋합니다. 하루 지나도 아직도 다 팔렸다는 얘기는 없네요. 물론 YAPC 스케쥴은 위의 링크에서 참고해주세요.
신고
IT/Perl 2009.04.09 16:11

[ 오픈캐스트 ] JEEN 의 Perl 이야기 오픈캐스트를 발행합니다.


* http://opencast.naver.com/JJ660

  마침 오픈캐스트가 정식 서비스를 시작했다고 하길래, 냉큼 개설하려고 서둘렀습니다.
  일단은 개설하는 데, 5명의 네이버 회원의 추천이 있어야 가능하더군요. 이곳저곳 아는 사람들과, 게시판에 구걸하면서 목표수의 추천을 채우고 겨우겨우 발행할 수 있었습니다.

  처음에 오픈캐스트라길래... 블로그에 있는 글을 자동으로 퍼다와서 선별해서 발행하는 가 보다 했는데... 그게 그냥 링크 몇개 적어서 발행하는 것이더군요. 쩝... 그러면 딜리셔스나 네이버 북마크 같은 것과 어케 연동시켜서 고를 수 있게 하거나 하는 것도 좋은 방법이라고 생각했는데. 일일이 손으로 링크 골라서 같다붙이는 건... 인터페이스가 아무리 좋다고 해도 좀 귀찮았습니다(아니면 제가 lifehack 을 못찾아서 일지도...)

  아무튼 Perl 관련해서 요근래의 재미있는 뉴스들을(심지어는 작년 하반기까지 거슬러 올라갔습니다) 캐내서 일단은 9개 정도로 채워서 올렸습니다. 제가 번거로움증이 있는지... 매우 번거롭습니다. 공통되는 Perl 관심사라면 그분들과 함께 팀으로 해서 만드는 것도 좋겠다고 생각했는데 말이죠. 이러면 오픈캐스트의 원래취지와는 다른 게 되는지 모르겠지만...

  어찌하였든 'Perl 이야기'라는 오픈캐스트는 앞으로도 계속 발행할 예정입니다(당연히...).
  많은 관심과 구독부탁드리겠습니다. Perl 관련 정보라면 일단 IRC(#perl-kr@irc.freenode.org) 로 오세요 :-)
신고
IT/Perl 2008.09.01 11:31

[ Perl ] App::CLI 로 시작하는 커맨드라인 어플리케이션

  YAPC::Asia 2007, 2008 에서 여러차례 언급되었고, 현재 저희 회사에서도 Web Framework + CLI 로 사용하고 있는 App::CLI에 대해서 간단하게 적어보고자 합니다. 정말로 매뉴얼을 찾기 힘든 모듈이지만, 사용하기에는 너무 편리한 CLI Framework 인데요.

  보통 Perl 스크립트에서는 맛볼 수 없는 구성으로 쉽게 유지보수가 가능한 코드를 써나갈 수 있습니다. POD 를 이용해서 문서를 써나갈 수도 있구요. GetOption 모듈을 안에 담고 있어서, 여러가지 옵션을 스크립트에 간단하게 줄 수 있습니다.

  현재 저희 회사에서는 Webframework + CLI 라는 형태로... webframework 에서 가지는 설정값을 CLI 에서 그대로 사용가능하게 되어있어서, 별도의 DB 스키마 구성을 설정할 필요없이 커맨드라인 명령어를 통해서 정기적인 작업을 수행하도록 하고 있습니다.

  그럼 간단하게 App::CLI 에 대해서 얘기해보겠습니다.

  App::CLI 는 SVK 로 유명한 clkao 에 의해서 만들어진 모듈이며, 위에서 설명했다시피 CLI framework 라고도 불리는 모듈입니다. 그의 대표적인 SVK 가 이 App::CLI 를 기반으로 만들어졌다고 합니다.
  그리고 Best Practical 의 Jifty 에도 사용되고 있다고 하는군요. CPAN 모듈 페이지에서도 자세한 문서가 없기때문에 소스를 보는 게 가장 도움이 된다고 하는군요.

  그래서 소스를 보겠습니다.

 MyApp.pm
 package MyApp;
 use base 'App::CLI';
 1;


 MyApp/Hello.pm
 package MyApp::Hello;
 use base 'App::CLI::Command';

 sub options {
  ( 'name=s' => 'name' )
 }
 
 sub run {
  my ($self, @args) = @_;

  print "Hello, Are you ".($self->{name} || 'BlahBlah') ."?¥n";
 }
 1;

 app.pl
 use MyApp;
 MyApp->dispatch;

  가장 기본적인 구성입니다.
  MyApp.pm 이 이 커맨드라인 어플리케이션의 Root 가 되는 것이구요. MyApp::Hello 는 hello 라는 CLI 어플리케이션이 되는 것이죠. 그리고 그 hello 를 실행시키기 위해서 app.pl 이 있는 것입니다.

  그렇다면, 어떻게 실행시키느냐..

  perl app.pl

은 훼이크 입니다. 실행시킬 커맨드를 지정해줘야죠.

  perl app.pl hello

그렇다면 결과는?

  Hello, Are you BlahBlah?

가 됩니다. sub run{} 에서 지정한 액션이 실행되는 것입니다.
 그렇다면 이건 어떨까요?

  perl app.pl hello --name=Saillinux

이렇게 Option 을 던져줬습니다. 그러면 sub options {} 에서 name 옵션을 지정해놓았다면, 그 name 옵션을 sub run{} 에서 사용할 수 있습니다.
 
  $self->{name}

 이렇게 말이죠. 물론 ( 'name=s' => 'name' ) 이라는 것이 무엇을 의미하는 지 좀 더 자세히 알고 싶으시다면, GetOpt::Long 같은 모듈을 살펴보시길 권합니다.

 - Getopt::Long - Extended processing of command line options - search.cpan.org

  그럼 hello 말고 다른 커맨드를 추가하고 싶다면?
  생각하시는대로 MyApp::YourCommand 를 추가하시면 됩니다.
  그리고 MyApp::Hello 와 같은 구조로  만들어나가시면 되겠죠?

  그러면 hello 가 무엇을 하는 놈인지 알아야하지 않을까요? 간단하게 도움말을 써넣어보겠습니다.

  MyApp/Help.pm
package MyApp::Help;
use base 'App::CLI::Help'
1;

=head1 ACTION
perl app.pl help help

=head1 BLAH
blahblah
=head1 PLEASE
blahblah
=cut

 이런식으로 MyApp::Help 아래에 간단하게 POD 를 추가했습니다.

perl app.pl help help

 그리고 이런식으로 실행하면.. MyApp::Help 에 기재된 POD 를 해석해서 표시합니다.
 혹은 MyApp::Hello 에도 마찬가지로 적당한 설명을 POD 로 써넣어..

 perl app.pl help hello

 와 같은 명령으로 hello 의 도움말을 간단하게 불러올 수 있겠죠?
 이같이 스크립트안의 POD 를 불러와서 해석할때는 POD::Usage 같은 모듈을 참조하시면 됩니다.
- Pod::Usage, pod2usage() - print a usage message from embedded pod documentation - search.cpan.org
  제가 App::CLI 에 대해서 아는 부분은 여기까지네요.
실제 이것을 사용해서, 관리하는 사이트의 RSS Feed 를 작성하거나, 정기적인 일괄작업을 수행한다거나 하고 있습니다.
언젠가 기회가 되신다면 한번쯤 써보시는 것도 좋을 듯 합니다. +_+
신고
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.08.11 12:10

[ Perl ] Korean Perl Workshop 2008 : Rising Perl

사용자 삽입 이미지

 2주후, 8월 23일에 드디어 Korean Perl Workshop 이 개최됩니다(물론 전 못가지만...).

 세션은 오후 1시부터 저녁 9시까지의 세션이니  8시간입니다. 일반적으로 대충 3-4시간하고 끝나는 중소규모의 컨퍼런스나 Tech Talk 와는 달리 8시간이면.. 꽤나 하드코어한 것이죠.  하드코어한만큼 좋은 내용들이 즐비합니다.

 생물학, 언어학같은 생소한 부분을 비롯해서... Perl 을 이용한 보안/해킹, GUI 개발, 웹 개발...
 상당히 넓은 장르를 한꺼번에 소화할 수 있는 기회가 될 것 같습니다.

 거기에 한국에서는 아마도 처음으로 열리는 Perl 만을 위한 워크샵이니 많은 기대를 하고 있습니다. KPW2008 의 주제에 맞게 다시금 Perl 이 떠올라서 CGI 로만 결부되는 인식을 무참하게 깨뜨렸으면 하네요.

 자세한 정보는 KPW2008 홈페이지 를 참조하세요.

(사실 예전에 있었던 2008/06/18 - [IT/Perl] - * 제 1회 Korean Perl Workshop : Rising Perl 개최 * , 이것이 연기된 것입니다.)
신고
IT/Perl 2008.08.06 19:42

[ Perl ] Perl 에서의 ORM , DBIx::Class에 대해서... #4 - Relation


 자, 그럼 Relation 에 대한 이야기입니다.

 Relation 은 말그대로 관계입니다. 뭐에 대한 관계냐면, Schema Class 간의 관계이죠.
 
 User, Company, Deathnote 에서 Deathnote 는 User 의 user_id 와 Company 의 company_id 를 가지고 있습니다.
 그럼 어떻게 Deathnote 에서 User 의 name 을 알 수 있을까요?
 ( SQL 스럽게 하면 애들장난같은 얘기라서 접어두겠습니다만 )

  아, 그전에 일단 테스트 용으로 데이터를 집어넣겠습니다.

my $deathnote = $schema->resultset('Deathnote');

while(<DATA>) {
    chomp;
    my @data = split/,/, $_;
    $deathnote->create({
        user_id => $data[0],
        company_id => $data[1],
    });
}

__DATA__
1,1
2,2
3,3
4,4
5,5
6,6
7,7

  자.. 어떻게 할 것인가... 가장 간편하게 이런 방법이 있습니다.
my $deathnote = $schema->resultset('Deathnote')->search({});

while(my $row = $deathnote->next) {

    my $user = $schema->resultset('User')->find($row->user_id);
    print $user->name if $user;
}
 흠? 근데 이건 좀 너무하다 싶지 않나요?

 이렇게 생각하면 Relation 이 나올 때입니다.
 MyTest/Deathnote.pm 을 보겠습니다. 아, 다른 건 다 집어치우고... 그냥 추가된 것만 보죠.

__PACKAGE__->has_one( user => 'MyTest::User', { 'foreign.user_id' => 'self.user_id' } );
__PACKAGE__->has_one( company => 'MyTest::Company', { 'foreign.company_id' => 'self.user_id'
} );

 이렇게 추가했습니다.
  Deathnote 에서 User 로 연결하기 위해서 user 라는 키를 사용하고,
User 와 Deathnote 는  user_id 로 연결된다는 내용입니다. (has_one 이라는 것은 말 그대로 1:1의 관계입니다)
  그리고 Company 역시나 마찬가지입니다.
  이렇게 Relation 을 지정해두면 어떻게 되려나요?

 my $deathnote = $schema->resultset('Deathnote')->search({});

while(my $row = $deathnote->next) {
  print $row->user->name."¥n";
}

  이런 형식으로 간단하게 user의 name 을 얻어올 수 있습니다.
.
.
.
  정말로 그럴까요? 두번째 장에서 하얀_고양이라는 User 를 삭제했기 때문에 세번째 Deathnote 에서는 에러가 발생합니다.

  can't call method "name" on an undefined value at ..

 그러면 이렇게 해주면 됩니다. user 가 있으면 찍어라 라고...

   print $row->user->name if $row->user;

  간단하죠;;;

 근데 User 가 어떤 Company 인지를 알고 싶습니다. 근데 이 정보는 Deathnote 에만 있어요.
 User->Deathnote->Company 식으로 넘어가야되는데요...

  우선은 MyTest/User.pm 을 열어서 한 줄 추가합니다.

__PACKAGE__->belongs_to( note => 'MyTest::Deathnote', { 'foreign.user_id' => 'self.user_id' });

  belongs_to 라는 것은 말 그대로입니다. :-) Deathnote 에 User 가 has_one 으로 Relation 관계를 성립하고 있습니다. belongs_to 로 Deathnote 에 속하게 됩니다. (근데 has_one 으로도 Relation 관계가 성립되더군요;;; 뭔가 일방적인 관계일지도..)

  그러면 User 에서 Company 의 name  을 읽어 볼까요?

my $user = $schema->resultset('User')->search({});

while(my $row = $user->next) {
   
    print $row->name .'=>'.$row->note->company->name."\n" if $row->note && $row->note->company;

}

  이렇게 하면 되겠죠?

  근데 여기서 잠깐... "언제까지 전체 레코드를 읽어올 것인가요. 제대로 SQL 조건도 좀 주고.. 이러고 싶은데.." 라고 saillinux 님께서 사장님 마인드로 또 말씀하십니다.

  그러면서 던져주신 조건이란게 << user_id 가 3 을 넘고, company_id 가 2 를 넘는 것 >> 이라고 하네요.
 근데 User Schema Class 를 사용하라고 합니다. 어라... 분명 User Schema Class 에는 company_id 가 없는 데 말이죠. 역시 사장님 마인드입니다.

  "거기다가 company_id 순으로 정렬하고, 그 중에 딱 2개만 보고 싶어요" 라고 하시는 군요...
  오늘 제대로 뽕을 뽑으시는 군요.

   요건 정의를 다시 해보겠습니다.

    "user_id" 가 3 을 넘고,
    "company_id"  가 2 를 넘고,
    "User" Schema Class 를 사용하고,
    "company_id" 순으로 정렬하고
    "2개" 만 출력한다 입니다.
.
.
.
.
  답은 이렇습니다.  

my $user = $schema->resultset('User')->search({
    'me.user_id' => { '>' => 3 },
    'company.company_id' => { '>' => 2 },
},{
    prefetch => [ { 'note' => 'company' } ], 
    order_by => 'company.company_id asc',
    rows => 2,
});

while(my $row = $user->next) {
    print $row->name. '=>' .$row->note->company->name."\n";
}

  User Schema Class 에서 Company 와는 어떤 관계도 아닙니다. 그럴려면 Deathnote 를 통해서 Company 에 접근할 수 있습니다.
 
   prefetch => [ { 'note' => 'company' } ]

  MyTest::User 에서 note 로 Deathnote 에 갈 수 있고, Deathnote 는 company 로 Company에 접근할 수 있습니다.  Relation 관계는 이미 Schema Class 에서 정의해줬기 때문에 이렇게 간단하게 접근할 수 있습니다.

    order_by => 'company.company_id asc',

  company_id 순이라면 위의 prefetch 에서 이미 길을 텄기때문에 "company.company_id"  로 접근할 수 있습니다.(SQL::Abstract 를 참조하세요)
 
      rows => 2

  단 두줄만 뺀다는 겁니다. MySQL 의 LIMIT 2 같은 사용법이죠.

  물론 Relation은 might_have, has_many 같은 것들도 있습니다. 자세한 내용은 문서를 참조하세요. :-)

  이런저런 빼고 넘어가는 부분들이 많은지라... 조금만 문서를 보시면 금방 아실만한 내용들이 대부분일 겁니다. 모르시면 같이 한번 궁리해보죠 :-)

  흡.. 빠진 부분들(제가 아는 한도에서)은 다음에 DBIC 를 정리하는 차원에서 가볍게 짚고 가도록 하겠습니다.


신고
IT/Perl 2008.08.05 20:15

[ Perl ] Perl 에서의 ORM , DBIx::Class에 대해서... #2 - DBIC 의 간단한 사용


  그럼, DBIC::Schema::Loader 로 만든 Schema Class 는 어떻게 사용하는 것일까요?

use strict;
use warnings;
use MyTest;  # 앞서 정의한 Schema Class
use DateTime;

my $schema = MyTest->connect(
    'dbi:mysql:mytest',
    'root',
    'PASSWORD');  # DBI 의 connect_info 랑 같습니다.

my $user = $schema->resultset('User');

while(<DATA>) {
    chomp;
    my @data = split /,/, $_;
    $user->create({
        'user_id' => $data[0],
        'name'    => $data[1],
        'created_on' => $dt->ymd. ' '. $dt->hms,
    });  # INSERT INTO..
}

__DATA__
1,JEEN
2,saillinux
3,하얀_고양이
4,a3r0
5,yuni
6,keedi
7,pung96
8,song
9,ssie
10,amorette

  이 스크립트를 MyTest.pm 과 같은 장소에 놓으시고... 적당한 이름으로 저장해서 실행해봅니다.
  아무것도 안나올겁니다. 그렇다면... DB 를 확인해볼까요?
사용자 삽입 이미지
이렇게 제대로 들어가 있네요 :-)
그러면 이렇게 입력된 데이터를 가지고 놀아 볼까요?

use strict;
use warnings;
use MyTest;
use DateTime;

my $schema = MyTest->connect(
    'dbi:mysql:mytest',
    'root',
    'PASSWORD');

my $user = $schema->resultset('User')->search({
    'user_id' => { '<' => 5 },
});  # SELECT * FROM user WHERE user_id < 5;

while(my $row = $user->next) {
 print $row->name."\n";
}
 위의 주석처럼 user_id 가 5보다 작은 사람들을 불러모읍니다. :-)
 JEEN
 saillinux
 하얀_고양이
 a3r0
 결과는 이처럼 나오겠죠?
 
  ->search 로 데이터를 줏어올 때는 기본적으로 복수로 가정합니다. 그러니 $user->next 같은 것으로 루프를 돌려주는 것입니다. $user->all 같은 것을 사용하면 말 그대로 전체 데이터를 ARRAY 로 받습니다.

 여기에서 생각난 예제:
 근데 전 하얀_고양이 님을 별로 좋아하지 않습니다. 그래서 지워버리고 싶어요.

use utf8;

my $user = $schema->resultset('User')->find({
    'name' => '하얀_고양이',
});    # find 를 사용할 경우 하나의 레코드만을 얻어옵니다.

print $user->name;
$user->delete;
 
  혹은
use utf8;
my $user = $schema->resultset('User')->search({});

while(my $row = $user->next) {
  $row->delete if $row->name eq '하얀_고양이';  # 이렇게도 삭제할 수 있죠 :-)
}

  이렇게 해서 하얀_고양이님을 지웠습니다.
  그러니 IRC #perl 에 계신 분들이 모두 기뻐하셔서 빵글이를 붙이고 싶다는 데요. :-)
  그럼 어떻게 할까요?
my $user = $schema->resultset('User')->search({});

while(my $row = $user->next) {
    $row->name($row->name . '_^^');
    $row->update;
}
 
사용자 삽입 이미지

 과연.. 모두들 기뻐하시는 군요 :-)

 이런식으로 직감적으로 DB의 데이터를 조작할 수 있는 것이 바로 DBIC 의 강점입니다.
 이에관한 예제는 DBIx::Class 페이지에서 쉽게 찾아볼 수 있고, 보다 다양한 예제를 제공해줍니다.
  그리고 보다 자세한 SELECT 구문에 대한 예제는 앞으로도 계속 적어나가도록 하겠습니다.

  다음번에는 Component 에 대해서 간단하게 알아보겠습니다. 

신고
IT/Perl 2008.07.10 12:29

[ Perl ] Perl 의 Template Engine - Template Toolkit 을 알아보자(구요)!

사용자 삽입 이미지

 PHP 에는 Smarty 라는 것을 써봤는데, 요즘은 Template_ 라는 게 인기라더군요(s.*_cheeru님 曰)
 Perl 에는 Template Toolkit 이라는 녀석이 있습니다. Perl 의 대표적인 템플릿 엔진인데요.
 
 대부분 이런 템플릿 엔진을 사용하는 이유는, 역시 코드와 HTML 을 분리하기 위함이겠죠?
 아무래도 Perl 코드에 지저분하게 HTML 을 옹기종기 박아놓는 것은 저 역시도 맘에 들지 않습니다.

 요 근래의 업무중에 Feed를 만드는 일이  있었는데.. 여기에 Feed 의 Content 로 HTML 이 들어가는 경우가 있어서, Template Toolkit 을 가볍게 사용해보았습니다.

 (물론 Catalyst 같은 Perl 의 프레임워크의 기본적인 템플릿 엔진은 Template Toolkit 입니다. 여기서는 단지 프레임워크와는 동떨어져서 Template Toolkit 을 어떻게 하면 간편하게 이용하느냐에 초점을 맞추겠습니다.)

 일단 RSS Feed 를 만들기 위해 XML::Feed 라는 모듈을 사용합니다. 아, 물론 Template Toolkit 도 깔려 있어야되겠죠.

  - XML::Feed
  - Template

 위의 두 모듈을 CPAN 인스톨 합니다.
 물론 관련된 의존 모듈이 여러가지 깔리게 되므로... 다른 것은 언급하지 않겠습니다. :-) (XML::Atom 이라든가...)

 feed_gen.pl
use strict;
use warnings;
use DateTime;
use XML::Feed;
use Template;

my $feed = XML::Feed->new('Atom');

$feed->title("이빨까기 인형");
$feed->link("http://jeen.tistory.com/");
$feed->description("사이비 개발자의 이빨까기");
$feed->author("JEEN");
$feed->modified(DateTime::W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul' ). '+09:00'));

# blahblah 어쩌고 저쩌고 해서 Feed 에 넣을 데이터 모집 :: 여기서는 그냥 파일로 왔다고 하겠습니다.

while(<>) {
  chomp;
  my @data = split /¥t/, $_;
  my $entry = XML::Feed::Entry->new('Atom');
  $entry->title($data[0]);
  $entry->link($data[1]);
  $entry->summary($data[2]);
  $entry->modified(DateTime->W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul'). '+09:00'));
 $entry->issued(DateTime->W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul'). '+09:00'));
  $entry->id($data[3]);
  my $content = XML::Feed::Content->new({ body => _make_content() });
  $entry->content($content);
  $feed->add_entry($entry);
}

open my $fh, ">", "test.xml";
print $fh $feed->as_xml;
close $fh;

sub _make_content {
  my $tt = Template->new;
  my $html;
  $tt->process('file.html', { action => 'attack', target => [qw/ saillinux whitecat /], }, ¥$html);
  $html;
}

 file.html (Template)
[% FOREACH d = target %]
[% d %] 를 [% action %] 하겠습니다.<br/>
[% END %]
 -- Perl방 평화유지위원회 JEEN --

 물론 코드의 테스트는 안해봤습니다. 즉석에서 그냥 이래저래 읊어봐서요. 문제가 있고, 수정을 해야된다면 그건 숙제로 남기겠습니다. :-)

 그러면 결과로는 test.xml 이 생성되고, 그 xml 은 위에서 언급한 포맷으로 구성이 되며, 적절한 RSS 리더로 읽어들이면 보일겁니다.

 일단 메인은 Template 에 대한 이야기니까... 이것에 대한 상세한 코드를 볼까요?
  my $tt = Template->new;
    # Template 의 인스턴스를 생성합니다.

  my $html;  # 템플릿 결과물을 담을 그릇이 됩니다.

  $tt->process('file.html', { action => 'attack', target => [qw/ saillinux whitecat /], }, ¥$html);
     # process 의 첫번째 인수는 템플릿 파일, 두번째 인수는 템플릿 변수(?) 입니다. 여기에서 템플릿에서 처리할 데이터들을 보내주면 되겠죠?, 세번째는 그 담길 그릇에 대한 레퍼런스가 필요합니다.

  print $html;  # 이 시점에서는 템플릿 결과가 나오게 됩니다.
  # saillinux 를 attack 하겠습니다.
  # whitecat 를 attack 하겠습니다.
  # -- Perl 방 평화유지위원회 JEEN --

 TT2 의 너무 간단한 사용법에 대한 이야기는 여기까지입니다.
 사실 TT2 하나 만으로도 이미 책 한권이 나와버렸거든요. 그만큼 문서화가 잘되어 있기 때문에 문제없이 사용하실 수 있으실 겁니다.
 
 이상입니다. 너무나도 허접한 코드와 대충대충 설명 죄송합니다. ;; 뭘해도 역시 문서를 읽는 수 밖에 없겠죠 ;-)

 충고나 질문등은 IRC 와 댓글을 이용해주시면 감사하겠습니다.

신고
IT/Perl 2008.06.18 18:52

* 제 1회 Korean Perl Workshop : Rising Perl 개최 *

안녕하세요

perl 언어 관련 컨퍼런스인 "1회 Korean perl workshop" 을 준비중입니다.
최근 perlmania.or.kr과 서울 지역 펄 스터디 모임을 중심으로 펄 커뮤니티가

활성화 되면서 첫번째 perl 워크샵을 7월중에 열기로 의견을 모았습니다.


1. 워크샵 명칭 : "Korean Perl Workshop : Rising Perl"
2. 날짜 : 7월 19일(혹은 26일)
3. 장소 : 서울 모처
4. 대상 : perl에 관심이 있는 누구나.


이번 워크샵의 취지는 다음과 같습니다.

국제적으로 perl은 매우 많이 쓰이는 언어이고 해외 펄 커뮤니티 역시 갈수록

성장하고 뜨거워지고 있는 반면 한국의 펄과 펄 커뮤니티는 매우 저평가 되어있는 것이 사실입니다.
최근에 일본에서 열린 YAPC::Asia라는 펄 컨퍼런스만 보더라도 단일 언어를 주제로 500명에 달하는 국내외 참석자가 모였다고 합니다.
국내에서도 IT분야 뿐 아니라 생물공학이나, 언어학 등 여러 분야에서 perl이 쓰이고 있을 것입니다.
하지만 이렇게 perl을 사용하시는 분들이 모이고 의사소통할 수 있는 기회가 매우 적었던 것 같습니다.
그런 취지에서 이번 워크샵은 한국에서 perl에 관심을 가지신 분들이 모이셔서 서로 기술적인 교류도 하시고 한국 펄 커뮤니티를 한단계 올릴수 있는 기회를 갖고자 합니다.

이번 워크샵의 규모등이 아직 완전히 정해지지 않았기 때문에 몇가지 사전조사와 도움을 요청 하려합니다.
연락은 kpw2008@googlegroups.com 로 메일을 보내주시면 됩니다.

1. 참가를 희망하시는 분들은 미리 연락을 주셔서 참가 인원을 가늠할 수 있도록 도와주세요

2. 발표자 분들을 모집합니다. 주제는 perl관련 자유 주제이고 30분 가량의 일반 발표와 10분 정도의 라이트닝 토크가 있습니다.

3. 주변에 이번 워크샵에 관심이 있으실 분들에게 소식을 알려주세요

4. 워크샵 개최준비에 직접 참여 하기를 원하시거나 도움이나 조언을 주실 분들도 부담없이 연락주세요

5. 그 밖에 어떤 의견이나 아이디어, 혹은 격려의 글도 환영합니다.

감사합니다. 많은 참여 바라겠습니다.

=== 연락처 ===

현재 2개의 메일링 리스트가 운영중입니다.

1. 자유로운 의견개진이나 문의를 위해서 kpw2008@googlegroups.com로 메일을 보내시거나 http://groups.google.com/group/kpw2008를 방문하시면 됩니다.

2. 공개를 원치않는 문의사항이나 의견이 있으시면 perl-kr-conf-2008@googlegroups.com 로 메일을 보내시면됩니다.

3. 컨퍼런스 개최에 도움을 주실 분들은 http://groups.google.com/group/perl-kr-conf-2008에 가입해주세요.

그밖에 IRC에서도 도움을 얻으실 수 있습니다.( freenode.org t서버의 #perl-kr 채널과 hanirc.org 서버의 #perl)
http://doc.perl.kr/twiki/bin/view/Wiki/WebIRC 을 방문하시면 웹을 통해서 접속하실 수 있습니다.



----
 라고 합니다. 펄에 관심있으시면 한번 참여해 보는 것은 어떨까요?
신고
IT/Perl 2008.06.17 06:30

[ Perl ] Catalyst 를 이용한 웹 서비스 개발 #2

사용자 삽입 이미지
 
 그러면 이제 자신이 원하는 페이지를 만들어 보도록 하겠습니다.

사용자 삽입 이미지

  ./script/oops_create.pl Controller Hello 로 Hello 라는 새로운 컨트롤러를 새로 생성하였습니다. 그리고 서버를 다시 시동하셔서(./script/oops_server.pl) 웹페이지를 확인해 봅니다.

사용자 삽입 이미지

  http://localhost:3000/hello 으로 접속해보면.. 'Matched Oops::Controller::Hello in Hello.' 라고 나옵니다. 이 말 그대로 Oops::Controller::Hello(프로젝트::컨트롤러::컨트롤) 에 매치했다는 것이겠죠. 그러면이렇게 해서 간단하게 페이지 생성을 할 수 있습니다. 이렇게 마치기 전에 Oops::Controller::Hello 가 어떻게 구성되는 지 알아볼까요? lib/Oops/Controller/Hello.pm 의 내용을 살펴봅니다.
package Oops::Controller::Hello;

use strict;
use warnings;
use base 'Catalyst::Controller';
                                                                                                                                                           
=head1 NAME                                                                                                                                                
                                                                                                                                                           
Oops::Controller::Hello - Catalyst Controller                                                                                                              
                                                                                                                                                           
=head1 DESCRIPTION                                                                                                                                         
                                                                                                                                                           
Catalyst Controller.                                                                                                                                       
                                                                                                                                                           
=head1 METHODS                                                                                                                                             
                                                                                                                                                           
=cut                                                                                                                                                       

                                                                                                                                                           
=head2 index                                                                                                                                               
                                                                                                                                                           
=cut                                                                                                                                                       

sub index : Private {
    my ( $self, $c ) = @_;

    $c->response->body('Matched Oops::Controller::Hello in Hello.');
}

 그러면 이와 같은 소스코드를 확인할 수 있으시겠으며.. 'Matched Oops...' 하는 부분은 바로 $c->reponse->body() 안의 문자열로 들어간 것임을 알 수 있습니다.  그렇다면 이 부분을 HTML로 적으면 된다는 것을 대충 짐작하셨을 겁니다.
 하지만 코드와 HTML을 섞어서 같이 쓰신다면... 처음에 허둥지둥 급하게 일을 할 때는 빨리 끝낼 수 있을 지 모르겠지만.. 장기적인 안목으로 봤을 때는 여간 불편한 게 아닙니다. 그리고 보기도 좋지 않죠. 그외 여러가지 제약이 될 수 있는 여러가지들이 있는 데... 이 것이 바로 템플릿의 등장이유가 됩니다.
 PHP의 대표적인 템플릿은 Smarty 라든가 Template_ 같은 것들처럼, Perl에는 Template Toolkit 이라는 강력한 템플릿이 존재합니다.
사용자 삽입 이미지
  이런 템플릿을 위한 View 를 생성하기 위해 './script/oops_create.pl view TT TT' 라고 입력합니다. TT 란 바로 Template Toolkit 을 뜻합니다. (처음의 TT는 View/TT.pm 이라는 것을 뜻하고, 두번째 TT는 Catalyst::View::TT 라는 모듈을 기반으로 한다는 것을 의미합니다)

 그리고는 ./root/hello.tt 라고 템플릿을 만듭니다. 예제로 이런 것을 만들어 보았습니다.
 Template Toolkit 은 기본적으로 [% ~ %] 을 템플릿 영역으로 사용합니다.
<html>
<head>
<title>[% title %]</title>
</head>
<body>
[% name1 %] ♥ [% name2 %]<br/>
그들은 왜 신림동으로 갔나?<br/>
</body>
</html>

 위에서 title, template, name1, name2 같은 것을 미리 정해놓았습니다.
 그럼 Controller 에서 해당 템플릿 변수에 값을 넣어주기만 하면 되는 것이죠.
 ./lib/Oops/Controller/Hello.pm 을 열어줍니다.
sub index : Private {
    my ( $self, $c ) = @_;

    $c->stash->{title} = 'PD수첩';
    $c->stash->{name1} = 'yuni';
    $c->stash->{name2} = 'saillinux';
  
    $c->stash->{template} = 'hello.tt';
}

 그리고 이와 $self->stash 로 하나하나 템플릿 변수를 지정해 줍니다. 여기서 $self->stash->{template} 는 해당 템플릿 파일과 매치를 하기때문에 위의 템플릿 변수를 넣어줄 템플릿을 지정해야 합니다. 위에서 'hello.tt'라는 템플릿을 만들었으니 'hello.tt'라고 넣어줘야 겠죠?
  $self->stash가 하는 일은 말씀 안해줘도 아시겠죠?
 아, 물론 Template 을 사용하게 되었으니.. $c->response->body()로 내용 넣어주던 짓은 이제 그만해도 됩니다. :-)
사용자 삽입 이미지
어떤가요? title 에는 PD수첩이.. name1에는 yuni 가 name2 에는 saillinux가 들어갔습니다.
 이런식으로 간단하게 Web Page 를 하나씩 추가해 나가시면 되겠죠?

 Template Toolkit 의 사용법은 이후에도 계속해서 알아가겠지만, 급하시면 아래를 참고하시면 되겠습니다.

 * 참고사이트
  - Template Toolkit
  - Catalyst

 다음에는 SQLite 를 이용한 간단히 Model 쪽을 살펴보겠습니다. :-)
신고
TOTAL 488,060 TODAY 38

티스토리 툴바