블로그 이미지
JEEN

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

Rss feed Tistory
IT/Perl 2009.10.02 19:11

[ShipIt] Software Release Tool - ShipIt with CPAN/Git/SVN Commit/Tag/Upload

   WWW::Shorten::Durl 을 업로드하면서 ShipIt 을 사용해봤습니다. ShipIt 은 LiveJournal 등을 만든 Brad Fitzpatrick 씨가 만든 소프트웨어 릴리즈 툴입니다. SVN/SVK/Git 에 자동으로 커밋, 푸시, 배포판을 만들어 태그도 생성해주고, CPAN 도 자동으로 업로드 해줍니다.
  꼭 Perl 에서만 쓸 수 있다는 제약은 없습니다. 하지만 제가 Perl 을 쓰니까 Perl 을 기준으로 설명드리겠습니다.

  우선 제가 WWW::Shorten::Durl 을 다 만들었다고 하고.. 이제 배포판을 만들어서 github 나 SVN 섭, 그리고 PAUSE 로 올리려고 합니다. ShipIt 을 쓰기 이전에는 대략 이런 플로우를 거칩니다.

  1. 배포판 버젼 지정/설정
  2. 신버젼 ChangeLog 기재
  3. 배포판 생성 테스트
  4. 커밋
  5. 태그
  6. 배포판 생성
  7. CPAN 업로드

  자... 그럼 대략 몇 번의 키보드 타이핑과 마우스를 몇번이나 클릭해야할까요? 아무튼 시간과 체력적인 면에서 많은 비용이 드는 것은 당연하겠죠.

  그럼 ShipIt 을 사용한다고 해봅니다. 그 전에 일단 ShipIt 을 실행할 준비를 해야겠죠.

  ShipIt 과 cpan-upload-http 를 설치합니다.

  ShipIt 은 평범하게 CPAN 을 통해서 설치할 수 있지만 cpan-upload-http 는 CPAN 인덱서에 걸리지 않는 듯 하니 직접 페이지에서 다운로드해서 설치합니다.
$ wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/cpan-upload-http-2.4.tar.gz
$ tar zxvf cpan-upload-http-2.4.tar.gz
$ cd cpan-upload-http-2.4
$ perl Makefile.PL
$ make & (sudo) make install   # use local::lib!!
  ShipIt 모듈 페이지에 자세한 설명이 나와있지만 여기서 다시 설명하면... 프로젝트의 루트 디렉토리에서

  1. 설정파일을 만듭니다. (프로젝트 루트 디렉토리에 .shipit 파일이 생성됩니다)
$ shipit --write-config
  2. 설정파일을 자신이 원하는 스텝/액션에 맞게 설정합니다.
# .shipit file
steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
git.push_to = origin
  3. shipit 커맨드를 실행합니다.
$ shipit
Running step ShipIt::Step::FindVersion=HASH(0x10099c228)
Current version is: 0.04
Next/release version? [0.04]                                                                                                                                                      
Running step ShipIt::Step::ChangeVersion=HASH(0x10099c1f8)
Running step ShipIt::Step::CheckChangeLog=HASH(0x10099c0d8)
No mention of version '0.04' in changelog file 'Changes'
Edit file? [Y/n] y                                                                                                                                                                
Running step ShipIt::Step::DistTest=HASH(0x10099c2e8)
include /Users/jeen/Work/dev/WWW-Shorten-Durl/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/AuthorTests.pm
include inc/Module/Install/TestBase.pm
include inc/Module/Install/Include.pm
include inc/Test/Base.pm
include inc/Test/Base/Filter.pm
include inc/Spiffy.pm
include inc/Test/More.pm
include inc/Test/Builder.pm
include inc/Test/Builder/Module.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Writing Makefile for WWW::Shorten::Durl
Writing META.yml
rm -rf WWW-Shorten-Durl-0.04
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=manicopy,maniread" \
        -e "manicopy(maniread(),'WWW-Shorten-Durl-0.04', 'best');"
mkdir WWW-Shorten-Durl-0.04
mkdir WWW-Shorten-Durl-0.04/inc
mkdir WWW-Shorten-Durl-0.04/inc/Test
mkdir WWW-Shorten-Durl-0.04/inc/Test/Base
mkdir WWW-Shorten-Durl-0.04/inc/Module
mkdir WWW-Shorten-Durl-0.04/inc/Module/Install
mkdir WWW-Shorten-Durl-0.04/xt
mkdir WWW-Shorten-Durl-0.04/inc/Test/Builder
mkdir WWW-Shorten-Durl-0.04/lib
mkdir WWW-Shorten-Durl-0.04/lib/WWW
mkdir WWW-Shorten-Durl-0.04/lib/WWW/Shorten
mkdir WWW-Shorten-Durl-0.04/t
cd WWW-Shorten-Durl-0.04 && /opt/local/bin/perl "-Iinc" Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for WWW::Shorten::Durl
cd WWW-Shorten-Durl-0.04 && make LIBPERL_A="libperl.a" LINKTYPE="dynamic" PREFIX="/Users/jeen/local" INSTALL_BASE="/Users/jeen/local"
cp lib/WWW/Shorten/Durl.pm blib/lib/WWW/Shorten/Durl.pm
Manifying blib/man3/WWW::Shorten::Durl.3pm
cd WWW-Shorten-Durl-0.04 && make test LIBPERL_A="libperl.a" LINKTYPE="dynamic" PREFIX="/Users/jeen/local" INSTALL_BASE="/Users/jeen/local"
PERL_DL_NONLAZY=1 /opt/local/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/durl.t .. ok  
All tests successful.
Files=1, Tests=4,  1 wallclock secs ( 0.03 usr  0.01 sys +  0.16 cusr  0.03 csys =  0.23 CPU)
Result: PASS
rm -f \
      *.a core \
      core.[0-9] blib/arch/auto/WWW/Shorten/Durl/extralibs.all \
      core.[0-9][0-9] Durl.bso \
      pm_to_blib.ts core.[0-9][0-9][0-9][0-9] \
      Durl.x  \
      perl tmon.out \
      *.o pm_to_blib \
      blib/arch/auto/WWW/Shorten/Durl/extralibs.ld blibdirs.ts \
      core.[0-9][0-9][0-9][0-9][0-9] *perl.core \
      core.*perl.*.? Makefile.aperl \
      perl Durl.def \
      core.[0-9][0-9][0-9] mon.out \
      libDurl.def perlmain.c \
      perl.exe so_locations \
      Durl.exp
rm -rf \
      blib
mv Makefile Makefile.old > /dev/null 2>&1
rm -f \
      Makefile.old Makefile
rm -rf \
      MYMETA.yml WWW-Shorten-Durl-0.04
rm -f WWW-Shorten-Durl-0.04.tar.gz
rm -f MANIFEST.bak _build
/opt/local/bin/perl "-Iinc" "-Ilib" "-MModule::Install::Admin" -e "remove_meta()"
rm -rf inc
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=fullcheck" -e fullcheck
Running step ShipIt::Step::Commit=HASH(0x10099d628)
[master 8a222dc] Checking in changes prior to tagging of version 0.04.  Changelog diff is:
 2 files changed, 6 insertions(+), 2 deletions(-)
Running step ShipIt::Step::Tag=HASH(0x10099f520)
pushing to origin at /Users/jeen/local/lib/perl5/ShipIt/VC/Git.pm line 92.
Counting objects: 14, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 953 bytes, done.
Total 8 (delta 3), reused 0 (delta 0)
To git@github.com:JEEN/WWW-Shorten-Durl.git
 * [new tag]         0.04 -> 0.04
Running step ShipIt::Step::MakeDist=HASH(0x10099f628)
include /Users/jeen/Work/dev/WWW-Shorten-Durl/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/AuthorTests.pm
include inc/Module/Install/TestBase.pm
include inc/Module/Install/Include.pm
include inc/Test/Base.pm
include inc/Test/Base/Filter.pm
include inc/Spiffy.pm
include inc/Test/More.pm
include inc/Test/Builder.pm
include inc/Test/Builder/Module.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Checking if your kit is complete...
Warning: the following files are missing in your kit:
    META.yml
Please inform the author.
Writing Makefile for WWW::Shorten::Durl
Writing META.yml
rm -rf WWW-Shorten-Durl-0.04
/opt/local/bin/perl "-Iinc" "-MExtUtils::Manifest=manicopy,maniread" \
        -e "manicopy(maniread(),'WWW-Shorten-Durl-0.04', 'best');"
mkdir WWW-Shorten-Durl-0.04
mkdir WWW-Shorten-Durl-0.04/inc
mkdir WWW-Shorten-Durl-0.04/inc/Test
mkdir WWW-Shorten-Durl-0.04/inc/Test/Base
mkdir WWW-Shorten-Durl-0.04/inc/Module
mkdir WWW-Shorten-Durl-0.04/inc/Module/Install
mkdir WWW-Shorten-Durl-0.04/xt
mkdir WWW-Shorten-Durl-0.04/inc/Test/Builder
mkdir WWW-Shorten-Durl-0.04/lib
mkdir WWW-Shorten-Durl-0.04/lib/WWW
mkdir WWW-Shorten-Durl-0.04/lib/WWW/Shorten
mkdir WWW-Shorten-Durl-0.04/t
/opt/local/bin/perl "-Iinc" -I. "-MModule::Install::Admin" -e "dist_preop(q(WWW-Shorten-Durl-0.04))"
COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar cvf WWW-Shorten-Durl-0.04.tar WWW-Shorten-Durl-0.04
a WWW-Shorten-Durl-0.04
a WWW-Shorten-Durl-0.04/.gitignore
a WWW-Shorten-Durl-0.04/Changes
a WWW-Shorten-Durl-0.04/inc
a WWW-Shorten-Durl-0.04/lib
a WWW-Shorten-Durl-0.04/Makefile.PL
a WWW-Shorten-Durl-0.04/MANIFEST
a WWW-Shorten-Durl-0.04/META.yml
a WWW-Shorten-Durl-0.04/README
a WWW-Shorten-Durl-0.04/t
a WWW-Shorten-Durl-0.04/xt
a WWW-Shorten-Durl-0.04/xt/01_podspell.t
a WWW-Shorten-Durl-0.04/xt/02_perlcritic.t
a WWW-Shorten-Durl-0.04/xt/03_pod.t
a WWW-Shorten-Durl-0.04/xt/perlcriticrc
a WWW-Shorten-Durl-0.04/t/durl.t
a WWW-Shorten-Durl-0.04/lib/WWW
a WWW-Shorten-Durl-0.04/lib/WWW/Shorten
a WWW-Shorten-Durl-0.04/lib/WWW/Shorten/Durl.pm
a WWW-Shorten-Durl-0.04/inc/Module
a WWW-Shorten-Durl-0.04/inc/Spiffy.pm
a WWW-Shorten-Durl-0.04/inc/Test
a WWW-Shorten-Durl-0.04/inc/Test/Base
a WWW-Shorten-Durl-0.04/inc/Test/Base.pm
a WWW-Shorten-Durl-0.04/inc/Test/Builder
a WWW-Shorten-Durl-0.04/inc/Test/Builder.pm
a WWW-Shorten-Durl-0.04/inc/Test/More.pm
a WWW-Shorten-Durl-0.04/inc/Test/Builder/Module.pm
a WWW-Shorten-Durl-0.04/inc/Test/Base/Filter.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install
a WWW-Shorten-Durl-0.04/inc/Module/Install.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/AuthorTests.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Base.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Can.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Fetch.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Include.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Makefile.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Metadata.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/TestBase.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/Win32.pm
a WWW-Shorten-Durl-0.04/inc/Module/Install/WriteAll.pm
rm -rf WWW-Shorten-Durl-0.04
gzip --best WWW-Shorten-Durl-0.04.tar
Distfile now at /Users/jeen/shipit-dist/WWW-Shorten-Durl-0.04.tar.gz
Running step ShipIt::Step::UploadCPAN=HASH(0x10099f580)
Upload to CPAN? [Y/n] Y                                                                                                                                                           
$
 이걸로 끝입니다.

 아, 여기에서의 Step 중에 마지막에 UploadCPAN 이 있는데, 이 경우에는 홈 디렉토리에 .pause 파일을 필요로 합니다.
 물론 PAUSE 계정이 있어야 되겠죠.
# .pause in your home directory
user JEEN
password ********
mailto [YOUR EMAIL]
 .pause 파일을 생성했으면 chmod 600 으로 설정해서 다른 사람이 읽지 못하도록 합니다 (이것도 ShipIt 에서 체크되며, 다른 사람이 읽을 수 있다면 자동으로 처리를 중단시켜버립니다).

 .shipit 에서 자신이 원하는 스텝을 추가해주기만 하면 됩니다. 이것도 확장성을 고려해서 설계되어 있기 때문에... ShipIt::Step::* 의 네임스페이스를 통해서 자신만의 스텝을 만들어 나갈 수 있습니다.
  현재 다른 CPAN 모듈 제작자들이 Twitter  에 릴리즈 정보를 트윗한다든가 하는 스텝 모듈이 있기는 합니다. 그걸 참고하면 쉽게 만들 수 있을 겁니다. (저도 뭐 생각나면 만들어 볼까 생각하고 있습니다)

  그외 자세한 내용은 ShipIt 모듈 페이지를 참고하면 도움이 될 겁니다.

   http://search.cpan.org/perldoc?ShipIt

  혹시 모르시는 것이 있다면 저도 같이 노력해서 궁리해보고자 합니다. :-)
  ShipIt 으로 이제 마구마구 만들고 배포를 해보도록 합시다!
신고
IT/Perl 2009.10.02 18:05

[CPAN] 거저 먹는 CPAN 모듈 만들기 - WWW::Shorten::Durl

  Daum 에서 만든 Durl 이라는 서비스가 있습니다. Twitter 하시는 분이라면 누구나 알고 있는 흔하디 흔한 짧은 URL 로 바꿔주는 서비스입니다. Durl 의 경우는 여기에 지정한 url 을 캡쳐뜨는 기능을 덧붙여서 다른 서비스들과 차별화를 뒀는데요.
  최근에 커뮤니티 부흥을 위한 웹 서비스 개발을 위해서 TinyURL 을 써야되는데... 캡쳐도 된다고 하니.. 이번기회에 Durl 을 써보기로 했습니다(왠지 캡쳐된 이미지를 따로 보여줄 수 있다면 좀 짱일 것 같다는 생각때문에)..

  Durl 의 OpenAPI 문서는 아주 요점만 간단하게 설명되어 있습니다.

  http://durl.me/doc/OpenAPI.html

  XML이 뭔지 JSON이 뭔지 알고 있으며, API 를 어떻게 쓰는 지 알고, 간단한 프로그래밍 언어만 알면 누구나 구현할 수 있는 모듈을 CPAN 에 올렸습니다.

  이름하야 WWW::Shorten::Durl.

  http://search.cpan.org/perldoc?WWW::Shorten::Durl

  대개의 URL 을 줄여주는 서비스들의 네임스페이스가 WWW::Shorten 을 기반으로 하고 있기 때문에 저도 이것을 사용했습니다. WWW::Shorten 자체가 확장성을 고려된 형태였었지요.  Durl 뿐만 아니라 십수가지 서비스들의 모듈이 저 네임스페이스(WWW::Shorten::*) 을 쓰고 있습니다.

  사용법도 간단합니다.

  makealongerlink(URL), makeashorterlink(URL)

  이걸로 끝이죠.
  이런 간단한 기능에 객체지향이니 뭐니 하기도 그렇고...

  아, github 를 레포지트리로 놔두고 작업했습니다. 사실 펄 커뮤니티용 git repository 가 있기는 한데... 뭐 외부에서는 접근하기는 힘들기도 하고, 공개하기 쉬운 방향으로 가기 위해서!

  http://github.com/JEEN/WWW-Shorten-Durl

  이상으로 아무튼 쉽게쉽게 물타기 해서 만들 수 있는 CPAN 모듈의 얘기였습니다.

  이번 CPAN 모듈 작성에 있어서 도움이 된 ShipIt 등에 대한 이야기는 별도로 포스팅하도록 하겠습니다.
신고
IT/Perl 2009.08.25 12:53

[ Perl/Inotify/Flickr ] 특정 디렉토리에 그림파일을 넣으면 자동으로 Flickr 업로드

  2009/08/24 - [IT/Perl] - [ SVN/Perl/Inotify ] 고객 후렌들리하게 SVN 운용법 - 자동커밋/업데이트

 이전에 썼던 Inotify 떡밥을 또 계속 물고 늘어져 보겠습니다.
 SVN 을 가지고 노는 그닥 아름답지 못한 방법이 있었지만, 이번에는 특정 디렉토리에 파일이 생성되면 그것을 자동으로 flickr 로 업로드 시켜주는 녀석을 만들어 보겠습니다.

 사실 이 아이디어는 최근에 일본에서 주목을 받고 있는 fic*** 라는 회사의 툴에서 본 것입니다. 특정 디렉토리를 지정해서 거기에 그림 파일을 올리면 자동으로 업로드해서 웹 서비스에서 그림을 관리할 수 있게 해놓은 것이죠. 뭐 물론 이러저래 많은 기능이 있지만, 유저가 그림을 업로드하기 편리한 뭐 그런 것이죠.

  뭐 Dropbox 라든가, SugarSync 라든가.. 생각해보면 이런 Inotify 를 사용했을 것 같다라는 서비스는 찾아보면 좀 많이 있을 것 같기도 합니다.

  아무튼 작동환경은 Linux (Ubuntu 9.04) 이며, 위의 링크의 지난 포스팅과 같은 환경입니다.
  사용모듈은 Flickr::Upload , File::ChangeNotify 입니다.
 
  우선 flickr API 키와 암호를 받습니다.

- http://www.flickr.com/services/api/keys/

  이 화면에서 키와 암호를 얻기까지의 인증을 수행합니다.
jeen@haak:~$ flickr_upload --auth --key [your key] --secret [your secret]
1. Enter the following URL into your browser

http://....

2. Follow the instructions on the web page
3. Hit <Enter> When finished.

  그리고 Flickr::Upload 를 설치하면 사용할 수 있는 flickr_upload 커맨드로 위의 명령을 수행합니다.
  이것을 AuthToken 을 수령하기 위함입니다. 해당 API 를 사용한 어플리케이션이 유저의 Filckr 계정에 접근할 수 있는 토큰을 부여받기 위함입니다. 
  위에 제시되는 URL 로 접속해서 모든 확인을 끝내고 콘솔로 돌아와서 엔터를 누르면, AuthToken 을 받을 수 있습니다.

  그럼 특정 디렉토리에 그림을 업로드할 디렉토리를 하나 만들어 둡니다.

# flickr-auto-upload.pl
use strict;
use warnings;
use File::ChangeNotify;
use Flickr::Upload;

my $ua = Flickr::Upload->new({ 'key' => 'your flickr key',  'secret' => 'your flickr secret' });

my $dir = '/home/jeen/image/';
my $watcher = File::ChangeNotify->instantiate_watcher(
  directories => [ $dir ],
);

while(my @events = $watcher->wait_for_events()) {
  foreach my $event (@events) {
     my $path = $event->path;
     next unless $event->type eq 'create';
     $ua->upload(
      'photo' => $path,
      'auth_token' => 'your auth token',
      'tags' => 'auto',
      'is_public' => 1,
      'is_friend' => 1,
      'is_family' => 1
     ) or do { warn "something wrong"; next };
     unlink($path);

     print $path. " is uploaded\n";
  }
}

  key, secret, auth_token 에는 앞에서 발행받은 것들을 그대로 집어넣습니다. 그외 Flickr Upload 시의 파라메터에 대해서는 Flickr::Upload 모듈페이지를 참고해주세요.
  파일은 업로드 이후에 자동으로 삭제해버리게 해버렸습니다.
  뭐 그외 필터도 필요하겠죠. gif/jpg/png 가 아니라면 업로드 안되게 한다든가, 파일사이즈가 얼마라든가...

  굳이 Flickr 가 아니더라도, Picasa 라든가, TwitPic 이라든가.. 이런 부류의 서비스는 많고... 이런 서비스들의 API 를 구현한 CPAN 모듈도 찾아보면 금방 나올겁니다. (없으면 만들어서 올려주시구요)

   Mac 에서는 FSEvents 를 사용해서 해당 디렉토리의 변경에 대한 통보만을 받을 수 있습니다. 파일은 어케 안되는 것 같더라구요. 변경통보시에 매번 파일리스트에서 최신 변경일자를 조사해서 파일을 건져낸다든가 여러가지 방법은 있겠지만요. 혹은 뭐 여러가지 다른 방법도 많을 것 같습니다. 어차피 파일의 변경이력을 못건진다면 Mac 에서는 그냥 launchd 같은 것을 쓰는 편이 더 낫지 않을까 하는 생각도 해봅니다.
신고
IT/Perl 2009.08.24 18:54

[ SVN/Perl/Inotify ] 고객 후렌들리하게 SVN 운용법 - 자동커밋/업데이트

  A 라는 회사는 B 사의 웹서비스를 운영하면서 밥벌이를 하고 있다. 그러니 B 회사는 A 회사에게 "너흰 우리때문에 밥먹고 사는 거잖아" 라며 거만해 한다. A 회사는 꾸벅꾸벅 말도 잘 듣고 있다.

  A 회사의 J 군은 최근에 B 회사의 일을 중간에 떠맡았다.
  B 회사의 서비스는 흔히말하는 MVC 구조로 이래저래 잘도 관리되고 있는 형국이다.
  거기에 소스코드 관리도 SVN 을 쓰면서... 코드또한 별시리 문제가 없이 관리되고 있었다.

  어느날 B 사의 디자이너에게 전화가 와서, SSSS 라는 페이지가 이상하다는 얘기를 듣고 원인 파악에 나섰다. SSSS 페이지에 표시되어야 할 배너가 표시되지 않고 있다는 뭐 그런 얘기였다. "단순한 화면 표시 어쩌고 저쩌고 라면 그냥 니가 하면되잖아" 라고 소리치고 싶은 J군은 템플릿 파일을 훑어봤지만 그딴 거 없었다.
 하지만 B 사의 디자이너는 <이제껏 나왔었다. 갑자기 안나온다! 시스템 문제가 있는 거 아니냐?> -- 대략 이런 러쉬를 걸어오기 시작했다.

  이쯤에서 J군은 B 사의 웹서비스의 치명적인 맹점을 알게되었다.

  1. B 사의 디자이너는 PHP 코드따위 만질 일 없다.
  2. 템플릿이라면 때에따라서 유연하게 바뀌어야 하니, 템플릿 파일은 FTP 로 올린다.
  3. FTP 로 올라온 템플릿 파일은 이전 파일이 뭐든 간에 일단 덮어씌우고 본다.
  4. B 사의 디자이너는 가끔 템플릿 파일에 {php} {/php} 라는 것도 해놓았다.
  5. B 사의 디자이너는 SVN 을 모른다.
  6. B 사의 디자이너는 백업이라는 행위의 중요성을 실감하지 못했다.

  즉, 이제껏 B 사의 디자이너가 작업한 것들은 백업/소스코드 관리 가 이뤄지지 않은 상태였다.
  그러니 로고가 어찌되었는지에 대한 상황파악은 어려운 상태!
  SVN 좀 쓰면 안되겠니? 라고 해도... 그런 거 배울 시간이 없다는 적절한 핑계로 넘어가 주신다.

  그래서 서버에서 디자이너가 FTP 로 파일을 올리면, 그대로 커밋 => Product 업데이트 를 자동으로 수행해야 한다.

 ________________________

 미션은 대략 위의 상황과 같습니다.
 FTP 로 올라오는 파일의 변경 이력을 실시간으로 파악해서, 그것을 바로 커밋하고, Product 환경에서 자동으로 업데이트 해주는 것입니다.
  서버의 환경은 Linux(CentOS) 이며, 커널 버젼은 2.6 이상입니다.
  리눅스 커널 2.6 부터는 Inotify 라는 것이 생겼습니다. 시스템 상의 특정 파일/디렉토리의 생성/변경을 파악할 수 있는 기능이죠. :-)

  Perl 구현으로는 Linux::Inotify 가 있습니다. 그리고 이것을 래핑한 File::ChangeNotify 라는 모듈을 사용하기로 했습니다. (Mooose++)

# svn-auto-commit-update.pl
use strict;
use warnings;
use File::ChangeNotify;

my $watcher = File::ChangeNotify->instantiate_watcher(
    directories => [ @ARGV ],
);

while ( my @events = $watcher->wait_for_events() ) {
    my @files;
    for my $event ( @events ) {
        my $path = $event->path;

        # filter 한다면 filter 처리 (.swp 등의 파일은 커밋필요없음. 혹은 디자이너의 파일 백업 스타일(index.html => index.html.090822)를 고려) 
       
        # $event->type 에는 (create/modify/delete/unknown) 이 있으니, 각자 맞는 걸 쓰면 되겠죠?
        if ($event->type eq 'create') {
            system("svn","add", $path);
        }
        # ... delete 라든가의 경우도 삭샥샥
        push @files, $path;
    }
    system("svn","commit",@files,"-m YYMMDD,, fucking designer's templates");
    system("svn", "update", "/path/path2/product/template/");
}

  실행은
perl svn-auto-commit-update.pl [해당 디렉토리]
  로 실행하면 됩니다.

  물론 아직 제대로 안써봤습니다. 그냥 이러면 안될까 해서 그냥 써봤을 뿐입니다;;
  제 맘대로 서비스 정책과 운용룰을 여차저차 할 수 없으니ㅜㅜ
  뭐 권한이 어쩌니, 디렉토리 구성이 어쩌니, 파일 경로가 어쩌니 자질구레한 건 생략합니다.

  Linux Inotify 에 대한 얘기는 좀 오래된 얘기고... 실제로 이것을 어떻게 사용하느냐 하는 건 잘 모르겠지만, 아마 이런 곳에도 사용될 수 있지 않을까 합니다.

  최근 일본의 Fi*** 라는 사진공유 서비스는 디렉토리를 지정해서 거기에 파일을 올리면 자동으로 업로드되는 툴을 만들어 놨습니다. 뭐 위의 코드와는 달리 리눅스 이외의 여러 OS 도 고려한 툴이겠지만요. (Mac 에서 밖에 테스트 안해봤습니다)
   (이것도 Inotify 를 통해서 Flickr 나 Picasa 에 자동으로 올라가도록 해보고 나중에 블로깅을 해볼 수 있다면 해보지요 :-) )

    그리고 rsync 대신에 이렇게 미러링하는 것은 어떠냐? 라는 얘기로 최근에 본 위키페이지도 있습니다.

 - http://trac.mizzy.org/public/wiki/InotifyAndMakuosan

    참고가 되었으면 합니다.
신고
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.07.19 23:03

[ Twitter/Perl/iPhone ] Twitter Stream + Prowl 에 대해서...


  최근에 Twitter Streaming API 가 공개되었습니다. 현재 Alpha Test 중인데요.
  Streaming API 는 말그대로입니다. 특정 메소드에 따른 결과를 거의 실시간에 가깝게 받아올 수 있습니다.

  지난번에

2009/07/09 - [IT/Perl] - [ iPhone & Perl ] Prowl 로 개발자 후렌들리 Notification 서비스를!

  이라는 주제로 Prowl 에 대해서 얘기를 했는데, Prowl 로 가장 먼저 구현해 보고 싶은 것이 바로 Twitter의 Mention 을 Prowl 을 통해서 iPhone 으로 알려주는 것이었죠.
  Twitter Streaming API 의 경우는 여러가지 API 를 제공해주며, 그 중에 track 이라는 메소드를 통해서 특정 키워드를 추적할 수 있습니다.

http://apiwiki.twitter.com/Streaming-API-Documentation

  Streaming API 문서는 위의 링크를 참고해주세요.
  Twitter Streaming API 의 구현은 최근에 AnyEvent::Twitter::Stream 이나 Net::Twitter::Stream 같은 모듈이 등장했었죠. 그리고 요근래 Perl 에서 AnyEvent 모듈의 붐이 일고 있는 마당이라서... AnyEvent::Twitter::Stream 모듈로 시작해봤습니다. 우선 그 모듈의 Author 도 miyagawa 씨였으니까요 :-)

http://search.cpan.org/perldoc?AnyEvent::Twitter::Stream

  동작 스크립트도 AnyEvent::Twitter::Stream 모듈안에 포함되어 있으니 사용하기 쉬울 겁니다.

perl track.pl [Twitter ID] [Twitter Password] track @JEEN_LEE,perl

  이러면.. @JEEN_LEE 와 perl 이라는 키워드가 Twitter 에 업데이트 되었다면, 거의 실시간에 가깝게 알려줍니다. 그러니 여기에 Prowl 처리를 갖다붙이면 되는 것 뿐이었습니다.

  Twitter Stream + Prowl 로 iPhone 으로 통보된 메시지들입니다.
  음... 원래는 lifehack 적인 묘미를 살려서.. RTM 처럼 Todo + Reminder 같은 녀석을 Google App Engine 으로 만들어 보려고 했는데... ;; Java/Python 은 역시 좀..ㅜㅜ (뭐 때되면 다 하겠지만요...)
신고
IT/Perl 2009.07.09 13:13

[ iPhone & Perl ] Prowl 로 개발자 후렌들리 Notification 서비스를!

  * http://prowl.weks.net/

 요근래 TUAW 에서 Prowl 이라는 iPhone App 에 대한 소개가 올라왔었습니다. Mac 유저에게는 Growl 이라는 알림용 어플을 아실겁니다. 이걸 iPhone 용으로 만든 것인데요. OS 3.0 이후로 Push Notification 이 지원되니... :-) SMS 날릴 필요없이 그냥 Prowl API를 통해서 쏴주면 그냥 메시지가 iPhone 으로 뜨게됩니다.

  이렇게 말이죠. Push Notification 이야.. 백그라운드에서 들어오는 것이니 그때그때의 상황을 알 수 있게 되는 것이죠.

  최근에 Remember the Milk 가 PN 을 지원해주면서 Todo 관리에 상당히 편리해졌다는 얘기를 들었습니다.
  뭐 할 시간되면 자동으로 뿅 하고 알려주니까요.

  이제 RTM 을 부러워할 필요는 없게 되었습니다. 스스로 필요한 기능이 있다면 만들어버리면 되겠거니 하고 있죠.
  (하지만 아직은 능력 부족...)

  주로 IRC 에서 빌붙어사는 날들이 많으니... IRC나 메신저 등에서 필요할 때 "어서 들어와!" 라는 기능으로 집어넣는 다든지. RSS 를 어케저케 하든가... 누구에게 필요한 메일이 왔을 때 이렇게 저렇게 한다든가..
  으음.. 뭔가 많이 편해지겠는데~ 하고 생각은 하지만... 처음부터 만들어야 되는 현실은 아쉽기도 합니다.

  iPhone 의 Push Notification 지원만으로 350엔을 받아먹는 Prowl 이지만... 앞으로 여러가지 연계서비스들도 기대해 볼 수 있겠군요. Plagger 에 붙인다든가 Twitter 라등가.. 뭐 여러가지 있겠지만요(아마 Twitter App 에서 자체적으로 지원해줄 지도...)
  
  Prowl 은 서버에 30일간의 메시지를 저장해준다고 합니다. 거기에 Growl Plugin 으로도 나와 있으니까.. Prowl 로 알려줘야할 것을 해당 어플리케이션에서 Prowl 플러그인을 지정해주면 됩니다. 자세한 내용은 아래의 링크를 참고하세요.

  * http://prowl.weks.net/installation.php

  Perl,Ruby,Python 등의 API 구현은 많이 있더군요. 저는 Perl 위주로 사니까... 어떤 일본분이 만든 API 구현인 WebService::Prowl 을 써봤습니다.

  * http://github.com/sekimura/WebService-Prowl/blob/master/lib/WebService/Prowl.pm

use WebService::Prowl;

my $prowl = WebService::Prowl->new( apikey => 'your api key' );
$prowl->verify || die $prowl->error();

$prowl->add(application => "Fav", event => "f1", description => "한글이 안되면 안된다능!");
신고
IT/Perl 2009.06.09 17:42

[ Perl ] remedie (iTunes 가 부럽지 않은 Podcast(?) Web(?) App(?))

  Plagger 로 유명한 Tatsuhiko Miyagawa 씨가 작년 shibuya.pm tech talks에서 선보인 적이 있는 remedie 는... 지금 말하기는 솔직히 떡밥이 상했다고 봐도 됩니다. Plagger 에서도 그랬듯이, 자신이 원하는 설정과 방식으로 Web Page 를 긁어와서, 그것을 어떤 방식으로 처리할 것인가를 아주 유연하게 처리할 수 있었습니다.
 remedie 에서도 마찬가지... 굳이 PodCast Feed 뿐만이 아니라, 특정 Web page 에서의 미디어 정보를 그대로 긁어와서 등록시킬 수 있습니다. 이것이 다른 Podcast 어플과는 다른 점이지요.
 그리고 remedie 는 Local Web Service 입니다! 즉, 자신의  서버/PC/Mac 에 스탠드얼론으로 띄우면 지정된 port 로 Web 에서 접근할 수 있지요. 

* remedie 의 설치 

 우선 설치에는 git 이 필요합니다. git 이 설치되지 않았다면 우선은 git 을 설치해주세요.
 Mac 을 기준으로 설명하면...
 
 sudo port install git-core

 그리고 git 설치가 완료되면 
 
git clone git://github.com/miyagawa/remedie.git

 을 실행하면 실행된 디렉토리 아래에 remedie 라는 디렉토리가 생성됩니다.

 그리고 README.mkdn 에 자세한 내용이 실려있으니... 여기까지!

 의존 모듈을 설치하는 부분은 "문서를 읽어주세요!"

* remedie 조작 

  위의 의존 모듈 설치를 모두 끝내고 perl bin/remedie-server.pl 로 remedie 를 띄운다면 http://localhost:10010 으로 접근할 수 있습니다.

  그러면 대략 아래와 같은 화면이 나옵니다.

   
* remedie 의 특징 

  Mac/Linux 에서 remedie 는 실행계정의 홈디렉토리 아래에 .remedie 라는 디렉토리를 생성합니다. 
  여기에 Feed 관련 정보를 모아두는 DB (SQLite) 나, access/error 로그 등이 존재합니다. 
  (Windows 는 안써봐서 모르겠습니다...)
  
  직접적인 DB 조작은 권하지 않지만... 혹시나 해서...

* Fluid + remedie for Mac

  Mac 에서는  Fluid 라는 App 이 있습니다. 웹서비스를 로컬 App 로 작동하게 하는 것인데요.
  remedie 의 경우 이렇게 설정해주면 아주 편합니다.
  물론 jGrowl 이라는 자체적인 웹에서의 통보처리도 있지만, 
  Fluid 를 통해서 remedie App 을 만든 경우에는 
  새로운 피드 갯수 가 뱃지로 달려버리죠. 
  그리고 jGrowl 이 아니라 Growl 로 통보를 해줍니다.
  완전한 Mac App 로 바뀌어 버리는 것이죠.


* Fluid + remedie + U70


* 등록해놓은 Feed List (OPML)


  이 URL 을 다운로드 해서, New -> Import OPML 로 집어넣으면.. 제가 구독하고 있는 Feed 들과 똑같은 것을 구독하실 수 있습니다.
  
  ** 추천해주실 만한 곳이 있다면 메일로 접수받습니다. jeen |_at_| perl.kr

* References

 ** remedie 의 저자인 miyagawa 씨가 타이완의 오픈소스 컨퍼런스에서 발표한 영상과 슬라이드가 있으니 참고하세요. (라기보다 이 영상과 슬라이드를 보는 게 훨씬 이해가 빠를 거라고 생각합니다 ;ㅁ;)
신고
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 이었습니다.
신고
TOTAL 486,642 TODAY 9

티스토리 툴바