블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2009.04.25 14:49

[ Perl ] Shibuya.pm TechTalk #11 에 다녀와서...


  예전에 #9 의 XS Nite 에서의 추억을 다시금 불러일으키는 하루...

  도쿄역 그랜드 도쿄 빌딩의 '리쿠르트' 세미나실.. (여기는 200명이상 입장가능) 에서 Shibuya.pm techtalk #11 가 있었습니다. 회사에서 5시 40분쯤 나가서 도쿄역에서 방황하다가 겨우 도착했습니다. 지도를 봐도 길을 모르는 길치라서 꽤 두근두근했네요.
  빌딩안의 보안차원에서 패스포트를 받고 직원의 안내를 받아서 세미나실로 들어갔습니다.
  주로 Perl Internal 이나 XS 관련 얘기가 나와서 아찔했지만...
  중간중간에 Native client hacks 나, Kindle2 hacking 에 관한 이야기...
  그리고 Devel::NYTProf 에 대한 LT ...
  거의 뭐 이정도 이외에는 별 흥미를 느끼지 못했습니다 (= 알아듣지 못했습니다).

  최근 야후코리아에서 PHP founder 인 Rasmus 가 강의를 하고, sail* 님으로 부터 kcachegrind 에 관한 얘기도 듣고는 했는데... 대만의 OSDC.tw 에도 Rasmus 가 가서 똑같은 얘기를 했던 것 같네요.  LT 에서 Devel::NYTProf 를 얘기하던 Clkao 도 Rasmus 와 만나서 kcachegrind 에 관한 얘기를 들었다고 하데요.

  아무튼 이런 techtalk 같은 데를 참여하다보면, 정말로 나에게 부족한 것이 무엇이다 라는 것을 생각하게끔 해주는 뭔가가 있습니다. ... 매번 생각만하고 보완할 생각을 안하는 것이 문제이기는 하지만요.
  천리길도 한걸음부터... 휴... 다리가 길었으면 좋겠네요.

신고
IT/Perl 2009.04.25 14:33

[ Perl ] JPA Seminar #1 을 다녀와서 ( 4/ 21)


* http://wiki.perlassociation.org/seminar/2009-04-21

  지난 화요일(4/21)에 아키하바라 UDX 컨퍼런스장에서 JPA Seminar #1 이 있었습니다.
  강사는 Jay Shirley, EPO(Enlightened Perl Organisation) 의 코어멤버이며, National Auto Sport 의 IT Director 라고 하네요.
  주요 세션은 2가지입니다. Better Perl Practices, Catalyst Enhanced 입니다.
  이 두 세션의 슬라이드는 위의 링크에서 일본어/영어판으로 구할 수 있으니 참고하세요.

  감상을 말하면... local::lib 에 대한 감동? 을 느낄 수 있었습니다.
  local::lib 에 대해서는 최근에 aero 님의 블로그를 참고하시면 쉽게 아실 수 있으실 겁니다. 

  * local::lib 모듈로 CPAN 모듈을 일반계정에 설치하기
 
  설계 - 테스트 - 리팩토링.
  아쉽게도 대충 짜고 움직이면 땡이라는 인식에서는 차후에 발생할 수 있는 여러가지 부작용에 대해서 미리 대처하기 힘듭니다. 코드는 갈수록 꼬여가고.. 이쪽을 고치면 저쪽이 말썽이고. 그래서 강사는 이것을 습관하하는 것을 권합니다.
  Test 모듈로는 Ovid 와 chromatic 이 만든 Test::Class 를 추천하더군요. 아직 안써봤지만 기회가 된다면 한번 만져봐야 되겠습니다. 그리고 Test::FITesque 라는 것두요.
  Email 에 관한 테스트로 Email::Send::Test, 그리고 Web App 작동여부를 확인하기 위한 테스트 모듈로 Test::WWW::Mechanize 를 제시합니다. 그리고 통합 테스트를 위한 스모크 서버도 갖추는 것이 어떠냐는 얘기도 있었던 것 같습니다.   요근래 Smolder 라는 계속적 테스트 서버가 주목을 받고 있는 것 같던데요. 이것도 역시 좀 건드려봐야 되겠네요.
  그리고 작년부터 불기시작한 신개념 Perl OOP 인 Moose 에 대한 감탄사를 연발하면서 소개하고.. 첫번째 세션이 끝났습니다.

  두번째 세션은 Catalyst 에 대해서 입니다. 어떻게 하면 Catalyst 를 제대로 쓰느냐 하는 얘기였습니다.
  플러그인을 많이 쓰지 마라는 것과 ... ActionClass 에서 지원하는 ?dump_info=1 을 통한 디버그.
  그리고 Chained와 Accessor. 그리고 배포방법에 대해서도 간단한 설명이 있었습니다.
  FastCGI 의 Static/External 방식의 차이.. 그리고 local::lib 을 사용하면 root 가 아니더라도 web app 를 다시 재기동할 수 있다는 것두요.
  그리고 로깅과 5.8 부터 Moose 기반으로 바뀐 Catalyst 에 대한 소소한 이야기.
  그리고 Catalyst 에 대한 참여에 관한 이야기였습니다.
  물론 문서화나, 블로그나, 직접 App 를 만들고 공개된 리포지트리에 올리거나 하는 이야기입니다.
  사실 전 Catalyst like 한 것만 써서.. Catalyst 에 대한 경험이 미천했지만... 이번기회에 Catalyst 를 좀 더 반겨볼까 하는 생각도 하고 있습니다.

  아무튼 이 두세션으로 JPA Seminar #1 는 끝이 났습니다.
  준비가 미진했다고 주최자가 말했지만... 이런 자그만한 techtalk 에도(하지만 200명이 참석할 수 있는 공간) 동시통역을 지원하거나, 슬라이드 자료를 미리 인쇄해서 나눠주거나 하는 등의 정성이 엿보였습니다. 거기에 JPA Seminar #1 얘기는 두달전부터 미리 "하겠다" 라는 공지를 내놓고 한 것이기 때문에... 최근 급하게 구성된 YASPS 에서는 좀 더 여러모로 계획할 필요가 있지 않나 하는 생각도 듭니다.

  아무튼 느낀 점 많고, 배울 점 많은 JPA Seminar #1 이었습니다.
신고
IT/Perl 2009.04.16 17:44

[ Perl / GraphViz ] 오덕분포도(?) 만들기

 
  aero 님께서 소개하신 "UML::Class::Simple 모듈로 그려보는 클래스 상속도" 가 대표적인 GraphViz 구현입니다. UML:Class::Simple 은 Graphviz 의 레이아웃을 Template 으로 출력을 하는 구조였었죠. 마침 개인적으로 쓸일도 있고 해서 잠깐 찾아보니까 Leon Brocard의 GraphViz 모듈이 있더군요.

 - http://search.cpan.org/perldoc?GraphViz

 물론 이 Graphviz를 사용하기 위해서는 Graphviz 를 설치해야합니다. ;;
$ sudo aptitude install graphviz

  Mac 에서는 port 를 사용해서 설치할 수 있지만... 이상하게 Mac 에서는 GraphViz 모듈이 잘 동작하지 않았습니다.

dyld: lazy symbol binding failed: Symbol not found: _pixman_image_create_bits
  Referenced from: /usr/local/lib/graphviz/libgvplugin_pango.5.dylib
  Expected in: flat namespace

dyld: Symbol not found: _pixman_image_create_bits
  Referenced from: /usr/local/lib/graphviz/libgvplugin_pango.5.dylib
  Expected in: flat namespace

대략 이런 에러를 뿌리면서 png 를 생성하지 못하더군요. 그래서 그냥 Ubuntu 에서만 하기로 했습니다.
Mac 에서 위와 같은 에러가 발생할 시에는 GraphViz 를 최신버젼으로 다시 깔아줍니다.

- http://graphviz.org/pub/graphviz/stable/macos/leopard/graphviz-2.22.2.pkg

그리고 예제는 적절하게 검색하니까 등장했습니다.
 
 - http://d.hatena.ne.jp/ksmemo/20071012/p1
 
 이 예제의 텍스트만 살짝 바꾼 게 위의 <오덕분포도>입니다. ;; 

 이 Graphviz 를 이용해서

* Unix Family Tree

 이런 것도 만들 수 있습니다. 좀 많이 복잡하지만...
 아무튼 텍스트의 무미건조함을 GraphViz 로 덜어보는 것은 어떨런지요. 

** 위 그림의 닉은 모두 가상의 인물입니다.

신고
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 2009.03.23 18:06

[ Perl ] 재미로 만들어본 YASPS PT

YASPS OPENNING
View more presentations from JEEN.
 그냥 장난삼아서 만들어 본 YASPS PT. 지난 일요일(3.22) Daum 사내 회의실에서 열린 초 간이 Perl Seminar YASPS 가 열렸었습니다. 전 지리적인 이유로 참가가 불가능했지만, 아무튼 주최의 pung96 님 및 장소마련해주신 sng2nara 님과 적극적으로 나서서 발표를 하신 스피커분들과 참가자 분들 수고하셨습니다.
신고
perl, YASPS
IT/Perl 2009.03.03 19:53

[ HTML5 & Perl ] HTML5 Drag And Drop API 를 건드려보기


  작년쯤부터 HTML5 에 대한 구현 이야기가 슬슬 나돌다가, HTML5 에서는 Drag And Drop API 를 사용할 수 있다는 얘기를 접했습니다. 웹 페이지에서의 드래그 앤 드롭이라면 대개 div 태그에 어쩌구 저쩌구해서 HTML 적인 요소를 움직이는 드래그 앤 드롭을 생각하기 쉽지만, HTML5 에서는 외부 오브젝트를 그대로 긁어와서 해당 이벤트를 처리할 수 있게되는 것입니다.
  보통 플래쉬같은 것을 이용한 드래그 앤 드롭(예를들어, 티스토리의 사진 업로드 기능) 처럼, HTML5 API 를 사용해서 그런 일을 할 수 있게 되었다는 것이죠.

  일단 타겟을 정했다면 뭔가를 만들어 보는 것이 좋겠다는 생각에... 이제껏 주문은 한번도 한 적이 없지만, "왜 알라딘은 일본에서 접속이 안되나" 라고 따진 포스트를 쓴 적이 있었던 알라딘을 이용해서 간단한 기능을 만들어 보기로 했습니다.

  그 간단한 기능이란, 알라딘은 TTB, Thanks to Bloggers 라는 서비스가 있어서... 블로그에 TTB 링크를 달면, 해당 블로거에게도 일정 수입을 지급하며, 물론 TTB 링크를 타고 들어온 유저에게도 약간의 적립금을 주는 그런 서비스 입니다.

  그래서 이 TTB 를 이용하려면

  - (1) 알라딘 사이트에 간다.
  - (2) 서적 링크를 클릭한다.
  - (3) 서적 링크안에 포함된 블로그 링크를 클릭해서 리뷰가 쓰여진 블로그로 이동한다.
  - (4) 해당 블로그에서 TTB 링크를 클릭해서 서적 페이지로 돌아간다.
  - (5) 카트에 담으면 TTB 가 유효화 되며, 일정 적립금을 받을 수 있다.

 라는 절차를 거쳐야 합니다.

  그럼 이런 절차를 HTML5의 Drag And Drop API 를 이용해서 어떻게 간소화 시키느냐.

  - (1) 알라딘 사이트에 간다.
  - (2) 서적 링크를 드래그하면 자동으로 TTB 체크가 된 링크를 발행한다.
  - (3) 해당 링크를 클릭하면 자동으로 TTB 유효가 되며 적립금을 받을 수 있다.

  이런 식으로 간소화시킬 수 있습니다.
 

  뭐 디자인이고 뭐고 생각할 여유도 없고, 생각해봤자 이쁜 디자인을 만들어 낼리 만무하기 때문에... 디자인은 형편없습니다. iframe 하나랑, div 두개가 달랑(드롭존, TTB 유효화된 링크)이네요.

  어떤 처리를 하고 있느냐,
 
 - (1) 상품 링크를 긁어와서 드롭존에 떨구면, 이벤트 데이터를 뽑아냅니다. 여기에서는 text/html 의 데이터로는 기본으로 <a href="link">제목</a> 이 됩니다.
 - (2) 위의 text/html 데이터에서 링크만을 뽑아서 TTB 링크를 뽑아냅니다.
 --- (1) 서적 페이지에서 블로그의 리뷰가 있는 지 확인하고,
 --- (2) 리뷰가 있으면 해당 포스트에서 TTB 링크를 추출합니다.  (네이버 블로그는 제외합니다)
 --- (3) 추출한 링크를 JSON 으로 반환합니다.
 - (3) JSON 값이 있으면 TTB 링크를 생성합니다.

  ... 이와 같습니다. (2) 번의 처리는 주력언어인 Perl 로 구현하였으며, 코드는 아래와 같습니다.
 


  맘같아서는 디자인 좀 깔끔하게 해서, 이것저것 기능을 붙여보고 싶었지만.. 역시 귀차니즘이 문제네요.
  아, 그리고 가장 중요한 것은 Drag And Drop API 를 구현한 Safari 3(버젼을 모르겠네요;) 이상과 Firefox 3.1(지금은 베타2) 이상에서 동작을 확인했습니다.
  아무튼 HTML5 지원은 아직도 계속되고... 어지간한 브라우저에서 HTML5 를 지원하게 될 일은 언제일지는 모르겠지만.. 그때가 오면 좀 더 다양한 웹 서비스들이 탄생하지 않을까 생각되네요. 물론 RIA 어쩌고 하는 FLEX나 실버라이트 같은 쪽이 더 앞선 발전을 해나가고, 다양한 시도를 하겠지만요.
 
  # 추기
 : 아, URL 은 일부러 공개안했는데, 어떤 식으로 동작하는 지 역시 확인이 필요할 것 같아서... 공개합니다. 차후 혹시나 문제가 있다면 비공개로 전환하겠습니다.


 (계정은 쓰여있는 대로 입니다.) 드래그는 ~wproducts.aspx~ 같은 서적 링크만 취급합니다. 
신고
IT/Perl 2009.02.25 13:49

[ Perl ] MojoMojo(Perl 기반의 Wiki) 한글화


  Perl 기반의 Wiki 인 MojoMojo 를 한글화했습니다. 물론 전체적인 부분에는 아직 미진하지만.. 60% 정도의 공정(?)을 거쳤다고 할까요. MojoMojo 는 Perl 의 웹 프레임워크인 Catalyst 를 기반으로 만들어진 DB 기반의 Wiki입니다. 기본적으로 SQLite 를 채용하고 있으며.. MySQL, PostGRE 등을 지원한다고 하네요. 거기에 KinoSearch 라는 Perl 로 만들어진 인덱스 생성기도 채용되어 있어서, Wiki 컨텐츠의 검색에 많은 도움이 된다고 합니다.

  그럼 MojoMojo 를 시작해봅니다.
  MojoMojo 를 실행하려면 먼저 Catalyst 를 설치할 필요가 있습니다.
  위의 번역된 MojoMojo 는...


  위의 github 에서 clone 할 수 있습니다. MojoMojo 프로젝트에서 fork 해왔는데... 이게 어떻게 mojomojo 프로젝트로 반영되는 지... 아직 git 에 대한 공부가 부족해서 잘 모르겠군요. 그냥 remote 등록하고 push 해버리면 되는 건지. 아니면 그쪽 프로젝트 마스터가 알아서 해주는지...

   git clone git://github.com/JEEN/mojomojo.git

  clone 하고 난 다음에는 우선 mojomojo.conf 의 default_lang 을 ja 에서 ko 로 바꿔줍니다. 그리고는 DB 를 생성합니다.

  ./script/mojomojo_spawn_db.pl

  그러면 mojomojo.db 라는 SQLite 가 생성되며,

 ./script/mojomojo_server.pl

  로 자체서버를 기동할 수 있으며 http://[domain]:3000/ 을 접속할 수 있습니다.
  자체서버를 사용하지 않고 Apache + FastCGI 를 사용할 수도 있습니다. 아래의 wiki 페이지를 참고해주세요.


  MojoMojo 의 국제화 관련처리는 Locale::Maketext::Simple 모듈에 의존하고 있고, 각 언어처리는 [언어].po 파일을 만들어 두는 것으로 시작힙니다. 그리고 po 파일안의 내용은 이렇게 구성되어 있습니다.

#. (page.path)
#: root/base/page/list.tt:1
msgid "All Pages in x"
msgstr "「%1」아래의 모든 페이지"

#. (page.name)
#: root/base/page/list.tt:17
msgid "All pages in x listed alphabetically"
msgstr "「%1」아래의 모든 페이지(알파벳순)"

  그래서 한글화라고 해도 간단하게 ko.po 파일을 만들고 해당 부분을 한글로 끄적거리는 것 밖에 없었죠. 
  그리고 템플릿 파일에서 아래처럼 넣어주면 한글화는 끝입니다.


  이상입니다. 
신고
IT/Perl 2009.02.10 00:31

[ Perl ] CPAN 모듈에 의존한 프로젝트에서의 주의점



 누군가에게 있어 Perl 은 CPAN 을 사용하는 툴이라고 불릴 정도로 Perl 에서의 CPAN 의존은 빼놓을 수 없습니다. 하지만 어떤 프로젝트라도 그냥 대놓고 superuser 로 CPAN 모듈 깔고 그대로 사용하는 경우는 위험합니다. 어떤 하나의 CPAN 모듈이라도 다른 CPAN 모듈에 의존하고 있기 때문에, 의존성 있는 모듈이 해당 메소드 이름을 바꿔버렸거나 하는 경우가 발생하곤 합니다.

  저 같은 경우에는 예전에 CPAN 모듈을 업그레이드 하고, 오늘 FastCGI 를 재기동했을 때, 기존에 잘 돌아가던 웹사이트가 갑자기 500 Internal Error 를 뱉어내기 시작하거나 하는 일이 있었습니다. JSON::Converter 모듈이 JSON 모듈의 업데이트에 따라가지 못하고 관련 메소드가 없다고 에러가 난 것이었죠. 결국은 라이브러리 폴더에서 직접 JSON::Converter 모듈을 수정하는 방법 밖에는 없었습니다. --  뭐 두 모듈 다 CPAN 에서 이전 버젼의 모듈을 받으면 된다는 것도 있겠지만...

  사실은 회사의 중규모이상의 프로젝트에서는 프로젝트에서 사용되는 CPAN 모듈은 별도의 library 폴더로 지정해줍니다. CPAN 의 설정을 바꿔서 별도의 라이브러리 폴더로 바꿔주는 것이죠. 거기다가 버젼관리도 해줍니다.
기존에 잘 움직이고 있는 라이브러리는 특별한 버그나 큰 퍼포먼스 향상이 기대되지 않는다면 업데이트도 잘 하지 않습니다. 최신경향에 맞춰서 바꿔나갈 경우도 있겠지만, 그렇게 우선도는 높지 않습니다.
  물론 Perl 의 대표적인 Product 인 MovableType 같은 경우에는 CPAN 모듈을 그대로 사용하지 않고 전부 MovableType 용으로 따로 최적화시켜두기도 합니다. 딱 필요한 기능만을 빼낸 것이죠.

  이전에 소개한 경량웹프레임워크인 MENTA 에서는 extlib 디렉토리 아래에 필요하고, 저자 나름대로 추천하고 자주쓰이는 모듈들을 모아놓기도 했죠. 거기에 MENTA 에는 MENTA 로 만드는 프로젝트에 새로 추가되는 CPAN 모듈을 간단하게 extlib 에 추가할 수 있는 스크립트도 제공하고 있습니다.

더보기



  위에서 밝힌 그런 버젼차이에 따른 문제뿐만 아니라 MENTA 같은 경량 웹프레임워크가 지향하는 배포의 용이성을 위해서도 중요한 팁이기도 합니다. 사실 php 같은 경우도 PEAR 모듈같은 것들도 프로젝트 디렉토리에 따로 담아두기도 하니... 굳이 언어와 상관없이 중요하다고 말할 수 있겠네요.

신고
IT/Perl 2009.02.03 20:18

[ JavaScript ] jGrowl Notification 을 IRC 로그 뷰어에 갖다 붙여봤습니다.

  요근래 remedie 의 UI 부분 업데이트에서 도입된 jGrowl 을 IRC 로그 뷰어에 갖다붙여보자는 생각을 예전부터 쭈욱 해왔습니다. jGrowl 이란, Mac 의 Growl 이라는 Notifier 비슷하게 JavaScript 로 브라우져 내의 이벤트를 생성할 수 있게 한 것입니다. Growl 은 Mac App 에서 발생하는 각종 동작 정보를 알 수 있습니다. IRC 에서 누가 불렀을 때나, 새로운 RSS Feed 가 있을 때나, Mail 이 왔을 때 등등...

Growl 아이콘


Mac 에서의 Growl Notification 동작


  이 jGrowl 같은 것이 한국에서 쓰인 가장 일반적인 예제로는 미투데이가 있겠네요.

미투데이에서 사용하고 있는 Growl 틱한 Notifier

    jGrowl 은 jQuery 플러그인으로도 만들어져 있기도 하지만, 그외 무툴즈 버젼 이외에 여러 버젼이 존재하고 있습니다. 전 자바스크립트에 그렇게 능숙하지 못해서 그냥 웹사이트 뒤지고 song 님에게 도움받으면서 작업하게 되었습니다.

  - jGrowl : http://www.stanlemon.net/projects/jgrowl.html

IRC 상에서 코멘트 입력


웹상의 IRC 로그뷰어에서 jGrowl 동작


  위처럼 IRC 에서의 대화는 웹상에서 일정시간(여기서는 20초설정)에 갱신되며, 이 갱신된 내용은 브라우저 안에서의 jGrowl 이벤트로 알려주게 됩니다.
  jGrowl 과 jQuery 의 높은 완성도에는 정말 탄성이 나올 정도입니다.
  기존에 만들어 둔 로그뷰어에 그대로 jGrowl 만 덧붙이는 간단한 작업이었습니다. jQuery 도 처음으로 써볼 겸 해서 간단하게 코드를 넣었습니다. $.getJSON 한방에 XHR 이 끝나는 게 너무 감동이네요. ㅜ_ㅜ (뭐 여타 JS 프레임웍이 그렇겠지만;;)
   Interval 을 20초 정도로 주고 웹사이트에서 매번 로그 뷰어 서버와 주고받고 합니다. 이러다보니 여러 유저가 붙었을 경우에는 빈번하게 리퀘스트가 오갈텐데... 이 부분에 대해서는 특별한 고민은 일단 하지 않았습니다. 뭐 어차피 쓰는 사람도 적을 테니... 라는 생각으로 있는데요. 이 같은 경우에서 뭔가 브로드캐스트 방식으로 통신할 수 없을까 하는 고민등등.. 여러가지 떠오르는 군요.
  서버쪽의 부하를 덜어줄 수 있는 여러가지 아이디어를 가지고 계신 분들께 지도편달 부탁드리겠습니다.
신고
IT/Perl 2009.01.30 15:53

[ Perl ] 경량프레임워크로 달리는 Perl 웹개발 #2 - MENTA 를 더 만져보기...


  회사업무중에서 MENTA Lib 를 직접 고친 부분와 이유에 대해서 간단하게 읊어보도록 하겠습니다.

   lib/MENTA/Dispatch.pm - Line 16 - 35
  1. -        my $controller = "${cdir}/${path}.pl";
  2. -        my $controller_mt = "${cdir}/${path}.mt";
  3. -        if (-f $controller) {    
  4. -    ~~~ // &#51473;&#47029; //~~~
  5. -            MENTA::finalize($out);
  6. -        } else {
  7. -            die "어쩌구 저쩌구 @{[ MENTA::base_dir() ]} 어쩌구 저쩌구;";
  8. -        }
  대략 컨트롤러와 템플릿 파일이 있었을 경우의 구현 부분을 따로 서브루틴으로 빼내고(run_controller, run_controller_mt) 해당 부분을 지워버렸습니다.
  1. +   my $orig_path = $path;
  2. +
  3. +   while(1) {
  4. +       $path = 'index' unless $path;
  5. +       my $controller = "${cdir}/${path}.pl";
  6. +       my $controller_mt = "${cdir}/${path}.mt";
  7. +       if (-f $controller) {
  8. +              MENTA->context->prepare_path($path, $orig_path);
  9. +       return run_controller($controller, $path, $orig_path);
  10. +       } elsif (-f $controller_mt) {
  11. +       return run_controller_mt($controller_mt, $path, $orig_path);
  12. +       } else {
  13. +       my @tmp_ = split "/", $path;
  14. +       pop @tmp_;
  15. +       $path = join "/", @tmp_;
  16. +       }
  17. +   }

  대충 이와 같습니다. 저렴하게 적어놔서 별거 없습니다만...
  MENTA 의 경우는 /blah/blah/blah 로 접속했을 때.. /app/controller/blah/blah/blah.pl 이나 .mt 파일이 항상 존재해야합니다. 그렇지 않으면 에러페이지가 나오죠. 위의 부가된 처리는 /blah/blah/blah에서 파일이 없다면 /blah/blah 의 파일을 읽어오게 하고... 그게 아니면 계속 상위 페이지의 파일유무를 체크하고 그 파일이 있다면 그것을 읽어오게 합니다.
  그리고 컨트롤러가 존재한다면 prepare_path로 그 경로 정보를 설정하게 합니다. /blah.pl 이 있고, /blah/blah/blah 로 접속했을 때, blah/blah 는 HTTP 쿼리 파라메터가 아닌 별도의 파라메터로 읽어들여집니다. 그 내용은 아래와 같습니다.

  1. diff --git a/lib/MENTA/Context.pm b/lib/MENTA/Context.pm
  2. index e70e729..1122a8a 100644
  3. --- a/lib/MENTA/Context.pm
  4. +++ b/lib/MENTA/Context.pm
  5. @@ -1,7 +1,7 @@
  6.  package MENTA::Context;
  7.  use strict;
  8.  use warnings;
  9. Class::Accessor::Lite->mk_accessors(qw/config plugin_stash request/);
  10. Class::Accessor::Lite->mk_accessors(qw/config plugin_stash request path_args/);
  11.  
  12.  sub new {
  13.      my ($pkg, %args) = @_;
  14. @@ -19,4 +19,13 @@ sub mobile_agent {
  15.      };
  16.  }
  17.  
  18. +sub prepare_path {
  19. +    my ($self, $controller, $path) = @_;
  20. +    
  21. +    return $self->path_args([]) unless $path;
  22. +
  23. +    $path =~ s/^$controller\///g;
  24. +    my @args = split /\//, $path;
  25. +    $self->path_args([ @args ]);
  26. +}
  27.  1;

 뭐없죠? 그리고는 blah.pl에서는 
  1. use MENTA::Controller;
  2.  
  3. sub run {
  4.   my $c = MENTA->context;
  5.  
  6.   warn $c->path_args->[0]; # blah
  7.   warn $c->path_args->[1]; # blah
  8.  
  9.   # blahblah code
  10. }
  이런식으로 그 경로 인수들을 뽑아냅니다.  
  그리고 다른 수정개소는 아래와 같습니다.
  1. diff --git a/lib/MENTA/Controller.pm b/lib/MENTA/Controller.pm
  2. index 6aee162..d9e1166 100644
  3. --- a/lib/MENTA/Controller.pm
  4. +++ b/lib/MENTA/Controller.pm
  5. @@ -21,7 +21,7 @@ sub import {
  6.          my $pkg = do {
  7.              local $_ = (caller(0))[1];
  8.              s{^$controller_dir/*|\.pl$}{}g;
  9. -            s{/}{::};
  10. +            s{/}{::}g;
  11.              "MENTA::Controller::$_";
  12.          };
  13.  
  14.  

  사실 이것을 수정하지 않으면 /blah/blah/blah 의 접속시 /app/controller/blah/blah/blah.pl 이 있는 경우에는  항상 아래와 같은 에러로 끝나게 됩니다.
syntax error at /home/blah/blah/app/controller/blah/blah/blah.pl line x, near ";"MENTA::Controller::blah::blah/blah" 
(Might be a runaway multi-line // string starting on line 3
  힌트는 항상 에러메시지에 담겨 있습니다. 
  일반적으로 /blah 로 접속했을 시의 해당 컨트롤러는 MENTA::Controller::blah 라는 namespace 를 가지게 됩니다. 그런데  /blah/blah/blah 로 접속했을 경우의 에러메시지는 마지막의 namespace 구분자가 / 로 되어 있는 것을 볼 수 있습니다. 원인은 이것이었습니다. 그러므로 위의 코드의 10번째 줄과 같이 g modifier 를 추가해주어 문제를 해결할 수 있었습니다.
  
  사실 위의 문제들은 그리 어려운 문제들은 아닙니다. 코드를 읽으면서 어떻게 돌아가는 지만 살펴보면 금방 알 수 있죠(저같은 경우에는 파일마다 디버그 로그 찍어내면서 파악했습니다 - 필요한 부분만...). 뭐 조금씩 조금씩 알아나가다가 결국에는 제대로 된 거(?) 하나 만들지 않을까요?
신고
TOTAL 462,282 TODAY 32

티스토리 툴바