[첫화면으로]Perl/AdventCalendar

마지막으로 [b]

Perl Advent Calendar

Seoul.pm 펄 크리스마스 달력
http://advent.perl.kr/

전에 봤던 기사를 다시 보려고 할 때마다 며칠 날짜에 어느 내용이 있었는지 잘 기억이 안 나서... 검색용으로 만든 페이지

목차보기-클릭

1. 2015년 크리스마스 달력

1.1. Day 1 - 첫째 날: CPAN을 내 품에 by keedi

펄 사용자에게 있어서 CPAN(Comprehensive Perl Archive Network)은 정말 거대한 보물 창고입니다. 홈페이지의 설명에 보다보면 심지어 "LWPs, POEs, and DBIs -- oh my!"와 같은 부제가 달려있기도 하죠.

 그림 1. CPAN: LWPs, POEs, and DBIs -- oh my! (원본)

CPAN은 1995년에 시작해서 현재까지 규모가 꾸준히 증가해서 기사를 쓰는 현 시점 기준으로 CPAN에는 157,981개의 펄 모듈과 32,708개의 배포판과 12,469명의 저자, 235개의 서버가 있습니다. 사실 CPAN은 한국에도 미러서버가 많은지라 대부분의 경우 불편함을 느끼지는 못합니다. 하지만 모듈을 개발한다던가, 다수의 장비에 다수의 모듈을 빈번하게 설치하고, 관리하고, 배포하는 경우 지역의 미러 서버를 이용한다하더라도 속도 측면에서 불편함이 있긴합니다. 이런 경우 단체 또는 사내, 심지어 개인 서버에 미러 서버를 구축하면 모듈 설치 및 업데이트 속도를 획기적으로 개선할 수 있습니다.

1.2. Day 2 - 둘째 날: 내 택배가 어디쯤 왔을까? by keedi

대부분의 직장인들에게 택배는 주문 및 결제를 완료한 순간부터 관심 그 자체입니다. '늦게 주문했는데 내일 올까? 아니 일괄 배송 시간이 지났으니 모레나 올거야.' 등 사실 우리가 택배가 어디있는지 관심을 보이든 보이지 않든 택배가 대문 앞에 도착하는 시간에는 하등 차이가 없음에도 관심을 놓을 수 없다는 것이 사실이긴 하지만요. :) 대부분의 택배사는 물류 및 배송 조회 서비스를 홈페이지에 제공하고 있으므로 이를 이용해도 되고, 각 쇼핑몰 홈페이지나, 택배 전용 모바일 전용 앱을 통해서도 배송현황을 조회할 수 있으니 세상 참 많이 편해졌죠? 하지만 역시 우리는 펄 해커! 해커에게 모든 것의 기본은 명령줄이죠? 꼭 해커여서가 아니더라도 명령줄에서 택배를 열람할 수 있다면 여러분이 상상해서 만들 수 있는 것이 더 많아질지도 모르겠네요.

1.3. Day 3 - 셋째 날: CPAN에서 만남을 추구하면 안되는 걸까 Vol. 1 by JEEN_LEE

열심히 일하다보면 뜻대로 쉽게 풀리지 않는 일들에 휘둘리기 마련입니다. 그렇지 않으면 어떻게 돌아가게는 해놓고 나중에 다시 보면 뭔가 찜찜한 느낌이 들기도 하죠. '아, 내가 왜 이런 걸 주업으로 삼아서 이러고 있나' 싶기도 합니다. 이런 후레시한 네거티브향이 풀풀 풍길 때에 우리는 쉬이 뜻하고 있던 '만남'을 추구합니다.

1.4. Day 4 - 넷째 날: 한글 문자열 자모 단위 일치 검사 by gypark

인터넷 검색 엔진이나 쇼핑몰 등의 검색 창을 보면, 타이핑을 시작하기 무섭게 검색어를 알아서 완성시켜 주기도 하고, 검색어의 일부만 입력해도 원하는 검색 결과를 보여주기도 합니다. 그림 1과 같이 말이죠.

 그림 1. 검색 엔진의 검색어 예측 (원본)

그림 1을 보면 정규표현식을 입력하는 과정에서 일시적으로 정귶이라는 문자열이 만들어졌습니다 (세벌식 자판을 사용한다면 이런 일이 없겠지만...). 단순한 정규식 일치나 index 함수를 써서 검사한다면, 정귶은 정규표현식에 일치되지 않는 것으로 판정되어 버립니다. 직관적으로 생각해보면, 이 문제를 해결하기 위해서는 문자열을 일단 음소 단위로 분리하면 될 것 같습니다. 그러면 이제 ㅈㅓㅇㄱㅠㅍㅛㅎㅕㄴㅅㅣㄱ 안에서 ㅈㅓㅇㄱㅠㅍ을 찾는 문제가 되고, 이 검사는 일치 판정을 받을 것입니다. 이렇게 음소 단위로 분리하는 작업을 펄 모듈을 이용하여 해 봅시다.

1.5. Day 5 - 다섯째 날: Gmail로 메일 보내기 by gypark

프로그램을 써서 자동으로 메일이 발송되게 하고 싶은데, 직접 메일 서버를 설치하자니 설치나 설정도 어렵고, 최근에는 스팸 때문에 인증되지 않은 서버에서 발송된 메일은 아예 배달이 거부되는 경우도 있습니다. 간편하게 내가 가입한 Gmail 계정을 사용하여 메일을 발송하는 법을 알아봅시다.

1.6. Day 6 - 여섯째 날: 터미널 제목 바꾸기 by keedi

여러분은 터미널용 유틸리티를 자주 만들곤 하나요? 유닉스의 철학 중 하나인 KISS답게 유틸리티를 만들다보면 대부분은 한 가지 일을 잘 수행하는 간결하고 짧은 프로그램을 작성하게 되지만 가끔씩은 많은 일을 아우를 수 있는 엄청난(?) 것을 만들게 되기도 합니다. 관리 도구라던가 사용자 명령을 기다리는 유틸리티들이 대표적인데요. 이런 프로그램들은 사용자가 종료하기 전까지는 계속 대기 상태로 있죠. 또는 간단한 프로그램이지만 처리 시간이 꽤 오래 걸리기 때문에 실행된 상태로 종료될 때까지 오랜 시간 대기 하는 경우도 있습니다. 이런 경우 현재 프로세스 상태를 터미널 제목에 표시한다면, 제법 유용할 것입니다. Perl을 이용해 터미널의 제목을 바꾸는 법을 알아보죠.

1.7. Day 7 - 일곱째 날: Mojolicious + Bootstrap + FontAwesome 삼종셋트 by keedi

현대의 웹 응용에 있어 디자인은 필수 불가결한 요소입니다. 제 아무리 뛰어난 기능을 가지고 있거나, 좋은 내용을 담고 있는 웹 페이지나 웹 응용이라 할지라도 속된 말로 때깔이 좋지 않으면 사용자들의 호감도는 급감합니다. 반대로 때깔이라도 좋으면 그래도 사용자들의 호감도는 증가합니다. 비록 이런 상황 자체가 바람직한 것은 아니나, 그럼에도 불구하고 최소 웹에서 금칠(?)이 중요하다는 사실에는 개발자나 사용자나 모두가 고개를 끄덕일 것입니다. 디자이너가 없는 개발자나 개발팀의 경우 아리따운 웹 화면을 구성하려면 많은 노력이 필요합니다. 하지만 오픈소스 커뮤니티의 노력으로 탄생한 Bootstrap과 FontAwesome 두 라이브러리만 있다면 최소한의 노력으로 미려한 웹 페이지를 만드는데 부족함이 없습니다. 펄(Perl)과 CPAN은 Mojolicious + Bootstrap + FontAwesome 이 삼종셋트를 손쉽게 사용할 수 있는 아주 획기적인 도구를 지원하고 있습니다. William Ghelfi씨의 Bootstrap in practice: a landing page 기사를 참고해 과연 얼마나 간단하게 이 삼종셋트를 이용해 웹을 꾸밀 수 있는지 알아보죠.

1.8. Day 8 - 여덟째 날: 돌리고~ 돌리고~ 작업 병렬 실행 by aer0

요즘은 물리적 CPU가 하나라도 내부 코어(core) 갯수가 한 개인 CPU는 찾아보기 어렵고 심지어 모바일 스마트폰의 CPU조차 여러 개의 코어를 지원하는 시대에 살고 있습니다. 따라서 어떤 작업을 할 때 멀티 코어의 장점을 살리려면 병렬 실행이 필수적입니다. 작업을 병렬로 실행하는 방법은 크게 스레드(thread)를 이용한 방법과 멀티 프로세스(multi-process)를 이용한 방법이 있습니다. Perl은 두 가지 방법 모두 지원합니다. Python, Ruby의 스레드가 GIL(Global Interpreter Lock)이란 구조 때문에 하나의 코어만 사용할 수 있는 반면, Perl 스레드는 여러 개의 코어를 동시에 활용 가능합니다. 하지만 네이티브 스레드와는 구조가 좀 다른 인터프리티드 스레드(interpreted thread)라는 구조를 택하고 있어서 요즘은 될 수 있으면 멀티 프로세스 구조를 사용하도록 추천합니다.

단순히 독립적인 작업을 단순히 처리하는 것이 목적인 병렬 작업은 그냥 동시에 돌려놓고 작업들이 끝나기를 기다리면 그만이기 때문에 스레드를 이용하든 포크(fork)를 이용한 멀티 프로세스 구조든 간단합니다. 하지만 어떤 공통되는 성공 실패 카운트를 세는 변수가 있거나, 각 작업의 결과를 모아서 처리를 해야 하고 자신의 CPU 코어 수에 맞게 시스템이 응답지연 및 hang상태에 빠지지 않도록 과도한 부하가 가지 않게 동시에 실행되는 작업의 갯수를 적절하게 조절해야 되는 요구가 생기면 슬슬 신경 써야 할 부분이 많아지죠. 스레드 같으면 여러 스레드가 변수값을 동시에 변경하지 못하도록 mutex같은 lock을 써서 동기화시켜 주어야 하고 멀티 프로세스에서는 부모, 자식 프로세스간 메모리 영역이 공유되지 않기 때문에 자식 프로세스가 넘기는 결과나 값을 받으려면 파이프, 소켓, 임시파일 등을 통한 부모, 자식 프로세스 간에 데이터 통신을 하기 위한 IPC(inter-process communication)장치도 만들어야 합니다. 그리고 현재 동시에 작업하고 있는 스레드나 프로세스의 갯수를 세고, 지정한 개수를 초과하지 않도록 조절해야 합니다. 이걸 다 직접 구현하려면 머리가 지끈지끈하겠죠? 하지만 걱정마세요! Perl CPAN에는 이런 요구사항을 한방에 만족시켜주는 Parallel::ForkManager라는 모듈이 있으니까요.

1.9. Day 9 - 아홉째 날: Bootstrap + Bootswatch + Mojolicious::Plugin::Bootstrap3 삼종셋트 by keedi

일곱 번째 기사와 더불어 이번에도 삼종셋트 시리즈입니다. :-) 웹 화면에서 미려하면서도 통일된 디자인은 무척 중요합니다. 이전 기사와 마찬가지로 오픈 소스로 공개된 많은 디자인 관련 라이브러리 중 펄(Perl)과 Mojolicious와 함께 간단히 사용하는 것 만으로 웹 화면의 품질을 월등히 높일 수 있답니다. Bootstrap은 현재 가장 유명한 반응형 HTML, CSS, JS 오픈소스 프레임워크이며, Bootswatch는 Bootsrap을 위한 무료 오픈소스 테마입니다. 더불어 CPAN의 Mojolicious::Plugin::Bootstrap3 모듈은 Mojolicious에서 Bootstrap과 Bootswatch를 손쉽게 사용할 수 있게 도와주는 플러그인입니다. 역시 이번에도 얼마나 간단히 이 삼종셋트를 이용할 수 있는지 궁금하지 않나요?

1.10. Day 10 - 열번째 날: time-ago 구하기 by keedi

요즘은 트위터나 페이스북 같은 유명한 SNS 덕분에(때문에) time-ago 식 표현이 널리 사용된지 몇 년 되었죠. 자바스크립트를 비롯해 대부분의 언어에는 이런 time-ago 형식으로 시간을 표시할 수 있는 모듈이나 플러그인이 많습니다. 그렇다면 펄에서는 어떻게 사용해야 할까요?

1.11. Day 11 - 열한번째 날: QR 코드 ♡ 터미널 by keedi

바코드(barcode)는 광학 기기가 판독할 수 있도록 고안된 굵기가 다른 흑백 막대로 조합시켜 만든 코드입니다. 전통적인 바코드는 서로 굵기가 다른 막대 모양의 이미지를 적절한 간격으로 배치해서 숫자나 문자를 표현합니다. 최근에는 QR 코드(QR code)처럼 단순한 막대 모양이 아닌 사각형의 배열의 점으로 자료를 표현하는 2차원 코드도 개발되어 많은 양의 정보를 담기도 합니다. QR 코드는 숫자나 영문자 뿐만 아니라 유니코드 문자를 담는데에 전혀 무리가 없기 때문에 활용도는 무궁무진합니다. 지금까지는 QR 코드를 이용하는 입장이었다면, 이번에는 반대로 전달하고 싶은 정보를 QR 코드로 제공한다면 어떨까요? 자신의 명령줄 프로그램에서 모바일 기기와 연동해서 정보를 전달해야 할 경우 해당 정보를 눈으로 보고 일일이 모바일 기기로 옮겨 적을 것이 아니라 QR 코드를 터미널에 짠!하고 뿌려준다면 손쉽게 정보를 보내줄 수 있겠죠?

1.12. Day 12 - 열두번째 날: 두 해시 합치기 by keedi

펄(Perl)에서 해시(hash)는 무척 유용한 자료구조입니다. 스크립트 언어의 가장 큰 특징이자 장점 중 하나는 배열이나 해시와 같은 복잡한 자료구조를 추가적인 라이브러리 적재없이 언어 내부에 구현해서 간단히 사용할 수 있다는 점입니다. 이러다보니 자연스럽게 계층적 자료인 경우 해시를 사용해서 저장하게 되는데 사용하다 보면 두 해시의 자료를 합쳐야 할 경우가 종종 있습니다. 단순한 해시라면 고민없이 해결하겠지만, 깊은 자료구조를 가진 해시라면 한참을 고민하거나 결국 합치는 루틴을 만들어야 하곤 합니다. 이런 류의 일은 꽤나 빈번하며, 역시 우리의 펄 선배들은 비슷한 생각을 하고 이미 바퀴를 발명해놓았지요.

1.13. Day 13 - 열세번째 날: 간단한 기본 통계 by keedi

수치 배열을 가지고 작업을 하다보면 꽤 많은 경우 누계나 평균은 물론이고, 최댓값, 최솟값 등의 빈번하게 계산하기 마련입니다. 이런 기본적인 통계값을 생각 날때마다 반복문을 돌리며 연산하는 것은 번거로운 일이죠. 게으른 펄(Perl) 프로그래머에게 꼭 필요한 간단한 통계 모듈을 알아보죠.

1.14. Day 14 - 열네번째 날: CPAN에서 만남을 추구하면 안되는 걸까 Vol.2 by JEEN_LEE

업무에서 가장 빈번하게 접하는 데이터는 바로 날짜입니다. 날짜라면 단순한 데이터라고 할 수 있을텐데 현실 세계는 조금 더 잔인한 법입니다. 이런저런 사람들이 쏟아내는 날짜 형식이라고 부르는 데이터들은 아래와 같습니다.

그렇다면 우리는 어떤 자세로 이런 데이터들을 대해야 할까요?

1.15. Day 15 - 열다섯번째 날: 디스크 정보 - 현재 작업 디렉토리 알기, cwd와 getcwd by gypark

어떤 프로그램을 실행할 때, 시스템의 디스크 드라이브에 대해 이런 저런 정보를 얻어야 할 때가 있습니다. 그 중의 하나는 이 프로그램이 연결된 "작업 디렉토리(working directory)"입니다. 프로그램 내에서 파일 관련 연산을 할 때 상대 경로로 지정된 경로명은 모두 이 작업 디렉토리를 기준으로 동작하게 됩니다. 펄 스크립트 내에서는 chdir 내장 함수를 사용하여 작업 디렉토리를 변경할 수 있지만, 현재 작업 디렉토리가 어디인지를 알아내는 내장 함수(유닉스의 pwd 같은)는 따로 없습니다. 그러나 이 기능을 제공하는 모듈이 있습니다.

1.16. Day 16 - 열여섯번째 날: 디스크 정보 - 디렉토리 사용량, 디스크 남은 용량 등을 확인하기 by gypark

어떤 디렉토리의 용량, 즉 그 디렉토리 안에 있는 파일들과 서브디렉토리들이 차지하는 용량의 총합이 얼마나 될까 궁금하면 어떡해야 할까요? File::Find 모듈을 사용해서 서브디렉토리를 재귀적으로 탐색하며 모든 파일들을 찾으면서, 각 파일들의 크기를 구해서 더하면 되겠죠! 아니면 qx()를 사용하여 유닉스/리눅스 명령어인 du를 실행한 후 출력으로 나온 문자열을 정규식을 써서 해석하면 되겠지요.

디스크 전체의 사용량과 남은 용량이 궁금하다면 어떡해야 할까요? 이번에도 리눅스 명령어인 df를 실행해 나온 출력을 갈무리한 후 정규식을 써서 원하는 부분을 추출하면 됩니다.

흠...

전부 맘에 들지 않는다는 까다로운 사람들을 위해, 다른 방법을 알아봅시다.

1.17. Day 17 - 열일곱번째 날: Perl과 보안: SQL Injection, Blind by vohrmana

우리는 펄(Perl)을 이용하여 문자열을 쾌적하게 다룰 수 있는 방법을 알고 있습니다. C만 했던 예전의 저에겐 몹시도 파격적이었죠. 시간 가는 줄 모르고 펄을 이용해 별 쓸모없는 코드들을 만들곤 했습니다. 그 중 웹 해킹 공부를 위해 만들었던 코드 하나를 소개합니다. 함께 SQL 삽입(SQL injection)중 블라인드(blind) 기법에 대해 알아보고 자동으로 블라인드 공격을 수행하는 툴을 간단하게 만들어 볼까 합니다. 무엇보다 SQL 삽입을 수행하기 위해 웹에 접근할 수 있는 수단이 필요합니다. CPAN의 WWW::Mechanize 모듈도 좋고, CPAN의 LWP 모듈도 좋습니다. 당연하지만 펄과 SQL에 대한 지식이 조금은 필요합니다. 원하는 정보를 빨리 찾아내기 위한 탐색 기법이나 스레드에 대한 기법이 필요할 수도 있지만 단순함을 위해 언급하지 않습니다.

1.18. Day 18 - 열여덟번째 날: Mojolicious - 폼 파라메터와 파일 업로드 처리 by gypark

Mojolicious를 사용하여 웹 애플리케이션을 만들어보고 싶은데, 웹 프로그래밍에 익숙하지 않은 상태에서 막상 시작하면 막막할 때가 많습니다. 브라우저에서 폼에 입력한 값을 서버에서 받으려면 어떻게 해야 하는지, 한 번에 여러 개의 파일을 업로드하고 싶으면 어떻게 해야 하는지 같은 것들이 발목을 잡습니다. 어떤 때는 잘 되는 것 같은데 조금 수정하고 나니 제대로 값을 받지 못하곤 합니다. 공식 문서는 첫 단락에서는 덧셈을 가르치더니 두 번째 단락부터는 갑자기 미적분을 소개하는 느낌입니다. 사실 제가 저런 문제들 때문에 애를 먹곤 했던 터라, 이 기회에 간단히 정리해보겠습니다.

1.19. Day 21 - 스물한번째 날: p5-hubot - 날씨봇 만들기 by newbcode

휴봇(HUBOT)이라고 들어보셨나요? 휴봇은 GitHub에서 만든 채팅 봇으로 처음에는 사내용으로 만들어졌지만, 많은 발전을 거듭하며 현재는 오픈 소스로 공개되어 있습니다. GitHub에서는 그룹 채팅시 휴봇에게 "github xx부서의 핵심 업무를 알려줘."라고 물어보면 휴봇이 그에 대해 상세한 답변을 하는 식입니다. 더 나아가 구글 번역이라던가, 지도와의 통합, 프로젝트의 배포등의 일까지도 휴봇에게 지시할 수 있습니다. 휴봇은 Node.js 기반에 CoffeeScript로 개발되었지만 @aaonaa님께서 Perl로 포팅하셨기 때문에 Perl로도 휴봇을 이리저리 만질 수 있답니다. p5-hubot의 자세한 설명은 2012년도 크리스마스 캘린더를 참고하세요.

1.20. Day 22 - 스물두번째 날: Mojolicious - 폼의 필드를 자동으로 채워넣기 by gypark

웹 페이지에서 폼을 띄워서 사용자에게 입력을 받을 때, 폼의 여러 입력 필드에 미리 어떤 값을 채워둔 상태로 두고 그 상태에서 사용자가 제출 버튼을 누르면 그 값이 전송되도록 하고 싶을 때가 있습니다. 일종의 디폴트 값인 셈입니다. 예를 들자면, 사용자의 정보 수정 폼에서는 기존 정보(전화번호나 주소)를 미리 채워넣고, 달라진 게 있는 항목만 사용자가 수정하도록 할 수 있을 겁니다. 또는, 사용자가 입력한 내용 중에 잘못된 값이 있어서 폼을 다시 작성하도록 해야 하는데, 제대로 넣은 값들까지도 전부 새로 넣으라면 사용자가 화를 낼 테니 미리 채워넣어 주는 게 좋을 것입니다. Mojolicious를 이용하여 만드는 웹 페이지에서 이렇게 폼의 필드를 채워넣는 작업을 자동으로 하는 방법에 대해 알아봅시다.

1.21. Day 23 - 스물세번째 날: 알록달록 터미널을 갈무리하기 by keedi

흑백 모니터를 사용하고, VT100을 사용하거나, ANSI 제어 문자를 제대로 쓰지도 못하던 먼 옛날과는 달리 알록달록한 칼라 모니터와 칼라 터미널은 너무도 당연한 시대입니다. Full-HD를 넘어 U-HD까지 지원하는 모니터가 나오는 시대에 칼라 터미널이라니 너무 시대에 동떨어진 이야기를 했나요? :-) 터미널에서 우리가 보는 알록달록한 색깔은 대부분의 경우 ANSI 제어 문자를 이용한 색상 표현 입니다. 터미널이란 것 자체에 워낙 기대를 하지 않고 보아서 그런지는 몰라도 이 터미널이란 화면 안에 알록달록하게 색상이 표시되면 그 아름다움(?)에 가끔 넋이 나가기도 합니다. (저만 그런가요? :) 이 터미널의 화면을 긁어서 누군가에게 보여주고 싶다는 생각을 해본적이 있나요? 하지만 긁어서 복사하는 순간 그것은 단지 단순한 텍스트가 될 뿐입니다. 터미널을 누군가에게 보여주어야 하는 순간이 온다면 결국 화면 갈무리를해서 그림 파일로 저장해야했죠. 이 알록달록한 화면을 갈무리하는 방법은 과연 없을까요?

1.22. Day 24 - 스물네번째 날: 구글 드라이브 API 이용하기 by gypark

Google에서 제공하는 클라우드 스토리지인 Google Drive에 펄을 이용하여 파일을 업로드하거나 다운로드하는 방법을 알아봅시다.

2. 2014년 크리스마스 달력

2.1. Day 1 - 첫째 날: Seoul.pm 펄 크리스마스 달력 by keedi

'크리스마스 달력'은 '대림절 달력'(Advent Calendar)을 서울 펄 몽거스식으로 바꾸어 부르는 일종의 브랜드(?)명입니다. 부르기 더 편하니까요. 아무튼 대림절 달력의 유래는 독일 19세기 초까지 올라갑니다. 루터교 사람들은 12월 1일부터 24일까지의 대림절 동안 하루에 하나씩 분필로 표기하여 재림일을 손꼽아 기다리곤 했답니다.

쩝... 나뭇가지에 개수만큼 흠집을 내는 것도 아니고 말이죠! 물론 석기 시대에나 볼 수 있을 듯한 이런 구리구리한 방법만 있던 것은 아닙니다. 멋진 구조물에 24개의 양초를 두기도 했고요. 건물의 창문에 번호를 매기기도 했습니다. 그것이 진짜 달력 형태로 만들어졌다가 마침내 인쇄물 형식의 대림절 달력이 탄생하게 된 것입니다! 짜잔!

이미지 출처: allthingsbeautiful-charity.blogspot.kr

현대 문화는 이 관습을 고스란히 물려받았습니다. 12월이 다가오면 너나 할 것 없이 온 가정에서 오손도손 모여 대림절 달력을 만듭니다. 상자 형태로 만들어 스물 네개의 문을 달고요. 하루에 하나씩 열면! 짜잔~ 깜짝 선물이 나오는 겁니다! 마지막 24일의 문은 초대형 문에 초대형 선물을 넣는 센스도 발휘합니다. 가족이 다함께 종이를 씹고 뜯고 붙이며 만드는 재미! 크리스마스까지 조마조마하게 기다리며 하루에 하나씩 문을 열어보는 재미! 올해도 크리스마스가 외로우신 분이나, 충성스러운 삶을 보내고 계시는 분까지, 다함께 글로벌하고 즐거운 (펄) 크리스마스 달력에 빠져보는 건 어떨까요?

자, 지금부터 여러분의 컴퓨터에 Seoul.pm 펄 크리스마스 달력을 소장하는 법을 여러분에게만 알려드리죠!

2.2. Day 2 - 둘째 날: use Expect; by luzlunz

원격지의 서버에서 루트권한을 얻어서 무언가 작업을 하려면 상당히 귀찮은 반복 노가다를 하게되곤 합니다. sudo가 세팅되어있는 서버라면 -S 옵션을 이용해 간단히 처리할 수 있겠지만, 보안 정책상 이마저도 허락되어있지 않았다면 곤란해지게 됩니다. 이런 경우 사용자의 입력을 그대로 대신해주는 Expect 모듈이 큰 빛을 발합니다.

2.3. Day 3 - 셋째 날: 도로명주소 우편번호 검색 API by aanoaa

Postcodify는 웹 페이지에서 도로명주소, 지번주소, 영문주소 등을 편리하게 검색할 수 있도록 해주는 오픈소스 라이브러리입니다. PHP 구현물이며, LGPL-3.0 라이센스이고, 현재 GitHub 저장소에서 개발이 이루어지고 있습니다. 공식 홈페이지의 설명에 따르면 다음과 같은 장점이 있다고합니다.도로명 주소 DB를 직접 구축하거나 관리할 필요가 없음검색 알고리듬을 개발할 필요가 없음jQuery 몇 줄로 검색창을 만들 수 있음

참, 좋아보이는데 Perl 사용자는 어떻해야 할까요?

2.4. Day 4 - 넷째 날: Excel 작업 자동화 by corpus007

본의 아니게 어떤(?) 시스템의 1년치 로그 파일을 받아 분석할 일이 있었습니다. 월 단위로 전체 로그를 나눈 다음, 관심가는 특정 데이터 값만 뽑아, 이를 그래프로 바꾸면 어떤 경향을 파악할 수 있으리라는 아이디어까지는 떠올랐죠. 경험상 이 작업을 수작업으로 하는 것은 사람이 할 짓은 아니라는 느낌도 있었기도 하고, 매 월별 데이터 셋과 이에 대한 차트 그래프를 워크 시트에 담은 Excel 파일을 만든다면, 리포트 자료까지 만들어지는 셈이라 결국 Perl을 이용한 Excel 처리를 하기로 합니다. 차후 Perl을 이용한 Excel 문서 작업을 시도해 보려는 분들의 첫걸음에 도움이 되길 바랍니다.

2.5. Day 5 - 다섯째 날: use Logfile::Tail; by luzlunz

실시간으로 로그를 분석하는 프로그램을 만들다보면 마지막으로 본 로그 위치에서부터 로그를 다시 분석하고 싶을 때가 많습니다. 요구사항은 간단한데 막상 해보려면 꽤 귀찮고 어려운 문제에 직면합니다. 이럴 때엔 CPAN의 Logfile::Tail 모듈을 사용하면 쉽게 처리할 수 있습니다.

2.6. Day 6 - 여섯째 날: 사진의 GPS 정보 활용하기 by keedi

스마트폰이 대중화 된 것도 벌써 6년이 다되가네요. 스마트폰이 많은 것을 바꾸었지만 무엇보다도 사람들의 사진 찍는 방식을 크게 바꾸었습니다. 예전에는 대부분이 디지털 카메라나 DSLR을 이용해서 사직을 찍었다면, 지금은 간편히 주머니의 휴대폰을 꺼내서 찍는 것으로도 충분해졌달까요? 그 전에는 디지털 카메라에 GPS를 내장해서 Exif에 넣니마니, 그런데 겨우 GPS 하나 넣었다고 카메라 가격이 말도 안되게 비싸지고, 한국에는 구하기도 어렵고, 그랬던 적이 있었지만 이미 GPS를 내장하고 있는 스마트폰이 나오고 난 뒤로는 이 모든 것이 그닥 의미가 없어져 버렸죠. 어쨌든 덕분에 요즘 스마트폰으로 찍는 사진들은 특별히 설정을 끄지 않으면 사진에 GPS 정보를 모두 저장하고 있어 이를 편리하게 이용할 수 있습니다. 하지만 여전히 스마트폰으로 찍으면서도 아쉬운 부분이 있기에 DSLR이나 미러리스 급의 카메라를 병행하면서 찍기도 하는데, 문제는 이렇게 병행해서 찍다보면 어떤 사진에는 GPS 정보가 있지만 어떤 사진에는 GPS 정보가 없죠. 그냥 없으면 없는대로 내버려두는 것도 나쁘지는 않지만, 사진을 정리할때 휴대폰으로 찍은 사진을 참고해서 DSLR이나 미러리스로 찍은 사진의 GPS 정보를 넣어주는 것은 나름 의미가 있을 것 같습니다. 심지어 이것이 간단하다면 어떨까요? :)

2.7. Day 7 - 일곱째 날: Twitter streaming API 사용하기 by gypark

트위터에서 제공하는 스트리밍 API를 사용해 타임라인을 감시하다가 어떤 조건에 맞는 트윗에 대해 원하는 작업을 수행하는 방법을 소개합니다.

2.8. Day 8 - 여덟째 날: Perl 내부 구조 #1 : 스칼라 변수 by luzluna

간단한 프로그램 작성 정도를 부담없이 하게 되고나면 프로그래머로써의 호기심은 그 내부를 항햐기 마련입니다. 그리하여 내부의 구조가 어떻게 되어있는지 어떻게 동작하는지를 이해하게 되다면 최적화를 더 잘하게 된다든지 그럴것같진 않고(T.T), 좀 더 안다는 자기만족 이외에 무엇을 얻을 수 있을진 모르지만 그냥 재미있습니다. OTL

2.9. Day 9 - 아홉째 날: Perl 내부 구조 #2 : 스칼라 변수 업그레이드 by luzluna

지난 기사에서 예고했던대로 문자열 "101"이 들어있는 변수에 정수형 101이 들어있는 변수를 더하면 어떤 일이 발생하는지 살펴보겠습니다.

2.10. Day 10 - 열번째 날: Ubic #1: 다양한 서비스 관리 by keedi

다양한 서비스를 관리해야 할 경우 여러분은 어떤 도구를 사용하나요? 보통 daemontools나 Supervisor를 떠올리겠죠? 아! restartd나 runit, s6도 빠뜨릴 순 없겠죠. 하지만 여러분은 펄 프로그래머! 조금이라도 더 몸에 밴, 익숙할 것 같은 느낌이 강하게 드는 도구가 필요하지 않나요? :)

Ubic은 다양한 서비스를 관리할 수 있도록 도와주는 경량의 도구입니다. Ubic을 이용하면 어떠한 프로그램도 서비스로 구동할 수 있으며, ubic이라는 명령줄 도구를 이용해서 이를 제어할 수 있습니다. 펄과 마찬가지로 매우 유연한 도구로 자신의 상황과 시스템의 상황에 맞게 유연하게 설정할 수 있으며, 필요하다면 플러그인을 제작하는 것도 무척 쉽습니다. 물론 특별히 무언가를 설정하거나 작성할 필요없이 기본으로 제공하는 모듈만으로도 대부분의 경우 충분합니다. 자, 지금부터 Ubic으로 다양한 서비스를 관리하는 방법을 살펴보죠!

2.11. Day 11 - 열한번째 날: 익스플로잇과 펄 by h00ray

2014년에 들어오면서 리눅스 환경에서의 굵직한 취약점이 발표되었습니다. Bash 쉘 쇼크라던가 OpenSSL Heartbleed 말이죠. 이번 기사에서 다룰 내용은 나열한 취약점과는 거리가 있지만, 리눅스 환경에서의 해킹을 조금이라도 맛 볼겸(?) 메모리 버그의 일종인 버퍼 오버플로우(BOF, Buffer Overflow)를 이용한 해킹 기법을 살펴보겠습니다.

2.12. Day 12 - 열두번째 날: Nginx + uWSGI 같이 사용하기 by JellyPooo

2012년 펄 워크샵 때 @yuni_kim님이 발표한 Perl을 위한 Web App 실행 환경 꾸미기를 Ubuntu 14.04에 직접 적용한 내용입니다.

2.13. Day 13 - 열세번째 날: 설치한 모듈 목록 확인하기 by keedi

펄을 사용하다보면 CPAN을 사용하는 것은 아주 자연스러운 일입니다. CPAN을 이용해서 다양한 모듈을 설치하고 사용하다보면 어느 순간 지금까지 설치한 모듈의 전체 목록이 필요할 때가 있습니다. 단순한 호기심 때문일 수도 있고, 펄을 새로 설치한 후 필요한 모듈이 없어서 일 수도 있으며, 펄로 만든 서비스를 다른 시스템에 옮기기 위해서 일 수도 있습니다. 지금까지 그렇지 않았다하더라도, 여러분은 현재 시스템에 설치한 모듈의 목록을 확인하는 방법이 머지않아 필요할 것입니다. :)

2.14. Day 14 - 열네번째 날: 명령줄 인자를 내 맘대로 사용하기 by keedi

간단한 단일 동작만을 실행고자 한다면 코드 내부에서 인자를 직접 선언해 사용해도 됩니다. 이 방법은 간편하지만 처리해야할 일이 많아지고 여러가지 자료를 유동적으로 받아들여야 한다면 코드 내부에서 수정하기란 매우 어렵고 자유롭지도 않기 때문에 시간이 지날 수록 힘들어집니다. MooX::Cmd::Role 모듈과 MooX::Options 모듈을 사용해 기능을 손쉽게 나누고 인자를 유동적으로 받아들여 유지 보수가 손쉬운 프로그램을 만드는 방법을 알아보겠습니다.

2.15. Day 15 - 열다섯번째 날: 로그에 색을 입혀보자 by aer0

시스템을 다루다 보면 각종 로그를 tail 등의 명령어로 볼 일이 많습니다. 이럴 때 특정 문자열이 포함되거나 패턴에 일치하는 줄은 더 눈에 잘 띄도록 색을 넣어준다면 확연히 구분이 되어 더욱 가독성이 높아지겠죠?

2.16. Day 16 - 열여섯번째 날: Boolean in Perl by JEEN_LEE

펄로 몇 가지 제품을 개발하는 중 다른 언어/환경과 데이터를 주고받고 하는 와중에 회사 동료로부터 다음과 같은 이야기를 들었습니다.펄은 Boolean 표기가 없냐? 왜 데이터가 전부 0 아니면 1이야? C냐?

펄은 Boolean 표기가 없냐? 왜 데이터가 전부 0 아니면 1이야? C냐?

그러고보니 그냥 익숙하게 true면 1, false면 0으로 사용하고 있었습니다. 아시다시피 펄의 기본 데이터 형에는 불리언(boolean)형이 없습니다. C도 마찬가지로 불리언이 없지요.

...
typedef enum {false, true} bool
...

하지만 앞의 예제처럼 C에서는 typedef와 enum을 사용해 불리언을 표현하기도 하죠. (아니, 그렇다면 펄에서도 CPAN의 enum 모듈을 쓰면 되는데!) 어찌되었든 이러한 연유로 JSON 같은 형식으로 데이터를 주고받을 때 is_*같은 불리언형의 필드에 0 또는 1을 전달하는 만행을 벌여왔었습니다.

{
  "people": [
    {
      "id": 0,
      "name": "Jeen Lee",
      "is_drunken": 0,
      "has_iphone6": 1
    },
    ...
  ]
}

늘 하듯이 펄에서 사용하던 식으로 데이터를 넘겨줬었죠. 하지만 그때마다 불리언형을 지원하는 쪽에서는 이런 데이터들의 형을 일일이 변환해줘야 하는 수고가 있었습니다. 미안하고 또 미안했습니다.

2.17. Day 19 - 열아홉번째 날: Perl 내부 구조 #3 : 배열 변수와 해시 변수 by luzluna

첫 번째 기사에서는 펄이 어떻게 스칼라 변수를 내부적으로 처리하는지를, 두 번째 기사에서는 펄의 기본타입인 스칼라변수가 어떻게 내부적으로 표현되는지 문맥에 따라 어떻게 변화되는지를 살펴보았습니다. 오늘은 펄의 또다른 기본 타입인 배열 변수와 해시 변수에 대해 살펴봅니다.

2.18. Day 20 - 스무번째 날: 언어 처리와 트라이 by corpus007

트라이(trie)는 트리와 유사한 자료 구조로 주로 문자열 등에 대한 동적 집합 혹은 연관 배열을 저장합니다. 키 값의 전체가 아닌 일부만 비교하는데 사용되므로 매우 빠르게 비교를 수행합니다. 이런 연유로 정보 검색(Information Retrieval)이나 언어 처리(NLP)에서 은근히 자주 다루는 자료 구조입니다. 트라이의 창시자는 Edward Fredkin 교수로 reTRIEval에 유용하다고 trie라 명명했다고 합니다. 펄에서 트라이를 손쉽게 사용할 수 있도록 도와주는 Tree::Trie라는 멋진 모듈을 살펴보죠. :)

2.19. Day 21 - 스물한번째 날: Mojolicious와 웹소켓 그리고 Redis by aanoaa

Mojolicious은 인기있는 펄의 경량 웹 프레임워크입니다. 경량의 MVC 프레임워크임에도 불구하고 HTTP 클라이언트 및 서버의 거의 풀 스택을 구현한 웹 프레임워크로 지원하지 못하는 기능을 찾기가 더 어려울 정도인 잘 만들어진 모듈입니다. 웹소켓 역시 대표적인 예로 Mojolicious는 이 웹소켓을 아주 잘 지원합니다. 실시간으로 상태를 갱신한다던가 등의 동작을 단순 HTTP만으로 구현하려면 자바스크립트 및 웹응용의 컨트롤러에서 처리해야 할 내용이 꽤 많죠. 이번 기사에서는 Mojolicious에서 손쉽게 웹소켓을 다루는 방법을 소개합니다.

2.20. Day 22 - 스물두번째 날: dcgrep: 갤러리를 넘나드는 패턴검색

grep은 유닉스의 명령줄 유틸리티로써 패턴으로 문자열 속의 일치하는 부분을 찾아내는 도구입니다. 기사에서는 문자열의 범위를 웹으로 넓혀, 여러 웹 페이지를 수집한 후 그 속에서 원하는 패턴을 찾아내는 방법에 대해 알아보겠습니다. 웹 페이지를 검색하려면 먼저 어떤 웹페이지를 검색할지 정해야 합니다. 디씨인사이드는 갤러리 별 게시판이 존재하며, 각 갤러리 별로 주제 구분이 명확하고, 올라오는 글들의 특성도 다르기 때문에 패턴 검색에 적절하다고 판단해 선택했습니다. 큰 의미는 없으니 편하게 읽어주세요. :)

2.21. Day 23 - 스물세번째 날: SMART 체크 - 디스크 검사

서버에 발생하는 문제 중에서 빈번하지는 않지만(서비스 종류에 따라 다릅니다) 디스크 문제가 생긴 경우는 매우 치명적입니다. 그러므로 평소에 모니터링을 통해 디스크 교체와 같은 조치를 미리 취하는 것은 중요합니다. 보통 smartmontools를 이용한 검사를 많이 쓰는데, 이번 기사에서는 smartmontools 패키지의 smartctl을 실행하고 결과를 간단히 분석한 후 판단한 결과를 알려주는 방법을 살펴봅니다. smartctl을 실행하고 결과를 분석하기 위해서 CPAN의 Capture::Tiny 모듈과 모니터링 시스템(Opsview)과 같이 사용하기 위해서 CPAN의 Nagios::Plugin 모듈도 사용합니다.

2.22. Day 24 - 스물네번째 날: use Complete::Bash;

펄을 접할 때 단연코 가장 흥미로운 것은 "게으름은 미학이다!"라는 철학입니다. 게으름(laziness) 그 자체를 어떻게 바라보는지는 크게 관심 없습니다만, 게을러지기 위한 노력들은 삶을 윤택(?)하게 만들어 주기 때문이 아닐까합니다. 이번에 다룰 주제를 통해서 다시 한번 게을러 보고자 합니다 :)

인기있는 유용한 유틸리티들은 항상 다양한 기능을 제공하기 위해 명령줄 옵션을 제공할 뿐만 아니라 때때로 부명령(subcommand)까지도 지원합니다. 하지만 이런 다양한 명령과 옵션을 오랫동안 기억하는 것은 쉬운 일이 아닙니다. 심지어 입력하다보면 오타가 발생하기도 하죠. --help 옵션을 이용해 도움말을 확인하면 될 일이지만, 번거롭긴 합니다.

자! 명령줄 자동 완성 기능을 이용해 좀 더 게을러져 보죠!!! :-)

3. 2013년 크리스마스 달력

3.1. Day 1 - 첫째 날: use Barcode; by keedi

바코드(barcode)는 광학 기기가 판독할 수 있도록 고안된 굵기가 다른 흑백 막대로 조합시켜 만든 코드입니다. 전통적인 바코드는 서로 굵기가 다른 막대 모양의 이미지를 적절한 간격으로 배치해서 숫자나 문자를 표현합니다. 최근에는 단순한 막대 모양이 아닌 사각형의 배열의 점으로 자료를 표현하는 2차원 코드도 개발되어 많은 양의 정보를 담기도 합니다. 바코드 단순하면서도 판독율이 좋기 때문에 다양한 개체를 전산화하기 위한 용도로 널리 사용됩니다. 더불어 바코드는 종이 뿐만 아니라 의류 등 인쇄할 수 있는 위치의 제약이 거의 없고, 표준화되어 있으며 출력 비용을 제외하면 생성 비용이 거의 없어서 오래된 기술임에도 불구하고 여전히 많은 곳에서 사용하고 있습니다.

지금부터 HTML::Barcode를 이용해 다양한 종류의 바코드를 만들어 보고 Mojolicious와 연동해서 웹 기반의 바코드 생성기를 제작합니다.

3.2. Day 2 - 둘째 날: 유니코드 인코딩/디코딩 by newbcode

위키백과를 따르면 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말한다고 합니다. 인코딩/디코딩은 다루는 자료의 종류에 따라 의미하는 바가 조금씩 다르지만 지금은 유니코드 인코딩/디코딩으로 한정합니다.
I/O 스트림
+--------+              +-------------+              +------+
|        |  표준 입력   |             |  표준 출력   |      |
| 키보드 +------------->| 펄 프로그램 |+------------>| 화면 |
|        |              |             |              |      |
+--------+              +-------------+              +------+

앞의 그림은 가장 일반적인 입출력 스트림(input/output stream)을 보여줍니다. 입출력 스트림은 바이트 스트림(byte stream)과 문자 스트림(character stream) 두 종류로 나눌 수 있습니다. 입력 스트림을 통해 전달되는 자료는 프로그램, 즉 펄 프로그램을 만나기 전까지는 바이트 스트림으로 존재합니다. 펄 프로그램에서 바이트 스트림을 어떻게 처리하느냐가 펄에서의 인코딩/디코딩의 핵심입니다. 실제 웹 상에 있는 HTML 문서를 이용해서 직접 인코딩/디코딩을 살펴봅니다.

3.3. Day 3 - 셋째 날: 좋은 모듈을 고르는 좋은 방법 by JEEN_LEE

CPAN Testers Statistics에서 확인할 수 있는 것처럼 현재 CPAN 에 등록된 모듈은 3만여개에 가깝습니다. 많은 모듈이 있다는 것은 좋은 것입니다. 하지만 모든 모듈이 다 좋은 것은 아닙니다. A라는 일을 하기위한 모듈이 수십여개인 경우 도대체 무엇을 골라야 할지 난감하기 마련입니다. 그럼 우리는 어떻게 좋은 모듈을 골라야 할까요?

3.4. Day 4 - 넷째 날: Emacs에서의 Perl 개발 환경 by aanoaa

Emacs에 펄 개발 환경을 설정하면 문서를 보기에도 좋고, 코딩하기에도 편리합니다. Emacs를 사용해서 펄로 개발할때 생산성을 높여주는 몇 가지 유용한 팁을 소개합니다.

3.5. Day 5 - 다섯째 날: pcap을 이용한 네트워크 패킷 캡쳐 by luzluna

네트워크상에서 작업을 하다보면 가끔씩은 정말 무엇이 어떻게 돌아가고 있는지 두 눈으로 확인하고 싶은 욕구가 (치?)밀어오를 때가 많곤합니다. 응용과 시스템 그리고 원격지 사이에서 그 누구도 잘못이 없어보일 때 범인을 찾으려면 역시 네트워크 패킷을 직접 확인하는 것보다 정확한 것은 없죠. tcpdump나 와이어샤크 같은 유명한 도구도 있지만 직접 펄 코드와 연동해서 디버깅하는 것이 훨씬 편리할 때가 많습니다. pcap 라이브러리는 tcpdump 팀이 제작한 라이브러리로 tcpdump와 와이어샤크등의 패킷 캡쳐 프로그램의 핵심이라고 할 수 있습니다. pcap을 사용하면 펄에서는 손쉽게 패킷 캡쳐를 펄 프로그램과 연동할 수 있습니다.

3.6. Day 6 - 여섯째 날: 알록달록 perldoc by keedi

대부분의 프로그래머는 자신만의 선호하는 편집기가 있기 마련입니다. 제각각의 이유를 가지고 편집기 또는 통합 개발 환경을 선택하겠지만 그 무수한 이유중 빠질 수 없는 것이 바로 문법 강조 기능입니다. 유닉스를 만들던 걸출한 해커들이야 분명히 검은 바탕에 흰 글씨로 엄청난 시스템을 만들었다고는 하지만 이러니저러니 해도 자신이 사용하는 소스 코드에 일관된 규칙으로 시각적으로 편안한 색깔이 덧대어진다면 가독성이 높아지는 것은 자명할 것입니다.

펄은 perldoc이라는 시스템을 통해 시스템에 제공되는 펄은 물론 관련 모듈까지 모두 문서를 제공하며 이 에코 시스템에 익숙해진 펄 개발자라면 누구나 자연스레 perldoc 문서를 읽고, 또 만들게 됩니다. Carp 모듈의 내용이 궁금하다면 언제든지 작업하던 터미널에서 perldoc Carp라고 입력하면 perldoc 문서를 읽을 수 있습니다. 이렇게 편리한 perldoc이지만 한 가지 아쉬운 점이 있다면 밋밋하게 단색으로 보여 현란한 웹에 익숙해진 현대인으로서는 읽기가 그리 편하지 않다는 점입니다.

지금부터 터미널을 좋아하는 텍스트 덕ㅎ.. 아니 여러분을 위해 perldoc 매뉴얼에 알록달록 색깔을 입혀보죠!

3.7. Day 7 - 일곱째 날: Seoul.pm 펄 크리스마스 달력 정리하기 by keedi

Seoul.pm 펄 크리스마스 달력이 시작된지도 벌써 4년째입니다. 매년 12월마다 크리스마스 바로 전 날까지 기사가 이어져 오며 펄은 물론 펄과 연관된 다양한 주제를 다루고 있습니다. 올해 역시 24개의 기사가 이어진다면 이제는 거의 100여개에 가까운 기사가 모이는 셈입니다. 매일 하나의 기사가 열리길 기다리며 클릭하는 즐거움은 크리스마스 달력의 취지에 맞기는 하나 첫 페이지에서 기사의 목록을 한 번에 훑어볼 수 있도록 시각적으로 제공하지는 않아 시간이 지난 후 특정 기사를 찾기는 여간 힘들지 않습니다. 편집진의 게으름 때문(!?)인지 올해까지도 여전히 전체 기사 목록은 제공되지 않고 있죠.

"배고픈 자가 우물을 판다"라는 말도 있는데 Seoul.pm 펄 크리스마스 달력을 구미에 맞게 정리해볼까요?

3.8. Day 8 - 여덟째 날: 동적 차트 그리기 by keedi

근래에 들어 HTML5와 CSS, 자바스크립트를 비롯 웹 관련 라이브러리들이 비약적으로 발전했습니다. 그래프만 해도 예전에는 서버의 자료를 서버의 자원 및 라이브러리를 이용해서 그래프를 이미지로 제작한 다음 이를 브라우저에서 보여주었다면 최근에는 미려하면서도 화려한 그래프 라이브러리를 사용해 클라이언트의 자원을 이용해 보여주곤 합니다. 유명한 대부분의 그래프 라이브러리는 Ajax 호출을 통해 자료를 얻어와 거의 실시간에 가깝게 그래프를 갱신해주는 기능을 포함하고 있죠. Flot 그래프 라이브러리와 Mojolicious 웹프레임워크를 조합해 CPU 사용률을 그래프로 표현하는 간단한 웹앱을 통해 실시간 그래프 그리기에 대해 감을 잡아 볼까요?

3.9. Day 9 - 아홉째 날: plenv vs perlbrew by aanoaa

perlbrew는 펄 커뮤니티 내에서 널리 사용되는 펄 설치 및 관리 도구입니다. Seoul.pm 크리스마스 달력에서 여러번 다뤄지기도 했죠.2011 - 열세번째 날: How to Use CPAN, Actually2011 - 열여섯번째 날: perlbrew, local::lib, smartcd 를 이용하여 Perl 환경 구축하기2013 - 셋째 날: 좋은 모듈을 고르는 좋은 방법

perlbrew 릴리스 이후 거의 4년 만에 강력한 라이벌인 plenv가 나타났습니다.

3.10. Day 10 - 열번째 날: dcmon: While You Were Sleeping by berise

소개해 드릴 내용은 지난 펄크리스마스 달력에도 여러 번 등장한 웹 이미지를 저장하는 스크립트입니다. 크리스마스 즈음이 되면 어김없이 찾아오는 스크립트입니다. 원래 신문 기사나 dcinside 등의 갤러리 글을 긁는 용도였지만, 지금은 모니터링으로 용도가 변경 되었죠. 그래서 이름이 dcmon입니다. 네! 여러분이 생각하는 그것! 일명 짤방 수집기가 맞습니다. 기존의 스크립트들과 비교해 최신 글을 모니터링하여 가져올 수 있다는 점이 약간의 차이겠군요. 우리가 잠을 자는 사이에 많은 글들이 생성되고 삭제되지요. :)

처음에 dcmon은 Python으로 시작하였으나 Python의 정규 표현식 및 urllib2의 처리 방식이 썩 마음에 들지 않아 Perl로 변경해서 구현하게 되었습니다. Python 버전을 포함한 전체 코드는 GitHub의 저장소에서 내려받을 수 있습니다.

3.11. Day 11 - 열한번째 날: 유니코드를 활용한 정규 표현식 by newbcode

유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 문자 집합입니다. 펄이라는 한국어 문자는 10진수 54148에 일대일 대응됩니다. 코드포인트(codepoint)라고 하는 이 숫자는 보통 앞에 U+를 덧붙인 16진수 형태로 표기합니다. 54148을 16진수로 표현하면 D384이며 유니코드 표현으로는 U+D384라고 씁니다.

정규 표현식을 사용하다보면 "한글과 영어를 분리하고 숫자와 문자등을 쉽게 파싱을 하는 방법은 없을까?"하는 고민을 자주하게 됩니다. 펄의 내부 유니코드 속성에 대해 조금 깊게 들여다 보고 유니코드의 속성을 활용해 조금 더 정확하고 효율적으로 정규 표현식을 활용하는 방법에 대해 알아봅니다.

3.12. Day 12 - 열두번째 날: 펄에서 외부명령어 실행 시키기 by John_Kang

펄에서 외부 명령어를 실행시키는 방법은 여러 가지가 있습니다. system 내장 함수, ...처럼 역따옴표, open 내장 함수로 파이프(pipe)를 생성하는 방법 등이 있습니다. 이러한 방법의 동작과 차이점을 살펴보고 Capture::Tiny 모듈을 이용해 외부 명령어를 손쉽게 실행시키는 방법에 대해 알아봅니다.

외부 명령어를 펄을 통해 실행시킬 때는 표준 출력/오류의 방향과 외부 명령어가 반환하는 종료값을 인지해야 할 경우가 많습니다. 간단하게 기본적으로 제공하는 방법을 이용하지 않고 복잡하게 모듈까지 설치해서 외부 명령어를 실행하는지에 대한 의문은 각각의 차이점을 먼저 비교해보고 설명하겠습니다.

3.13. Day 13 - 열세번째 날: 간단한 파일 공유 by keedi

작업을 하다보면 가끔씩은 급하게 또는 간단하게 작업하고 있는 디렉터리 하부의 파일을 동료나 친구들에게 보내주거나 아주 잠깐 공유하고 싶을 때가 많곤 합니다. 보통 파일의 용량이 작을 경우 압축해서 이메일로 보내기도 하고 여유가 있다면 드롭박스와 같은 클라우드 저장소를 이용해 공유 후 링크를 보내기도 합니다. 아주 잠깐만 파일과 디렉터리를 공유할 때는 어느 쪽이든 조금 번거롭긴 합니다. 간단한 명령어로 현재 디렉터리를 상대와 공유할 수 있다면 얼마나 편리할까요? 펄로 간단히 파일을 공유하는 방법을 알아봅니다.

3.14. Day 14 - 열네번째 날: 초심자를 위한 Mojolicious by rumidier

펄에는 수 많은 웹프레임워크가 있습니다. 그 중 근래에 가장 많이 사용하는 프레임워크는 Catalyst와 Dancer, Mojolicious 세 가지 입니다. 복잡한 엔터프라이즈 환경은 Catalyst를 많이 사용하고 비교적 규모가 작은 웹 사이트는 Dancer나 Mojolicious를 많이 사용한다고 합니다. Mojolicious는 공식 홈페이지에 문서화가 잘 되있고 다루기 쉽다고 하지만 정말 아무 것도 모른채로 시작한다면 막히는 곳이 한 두 군데가 아닙니다. 문서를 보고도 어떻게 시작해야 될지 헤매실 분들에게 이 글을 바칩니다.

3.15. Day 15 - 열다섯번째 날: 출력 가능한 바코드 by keedi

최근 후원하는 단체의 내부 물류를 전산화하는 시스템을 구축하는 부분을 맡아 작업하며 관련해 돕고 있다보니 자연스레 바코드(barcode)를 다룰 일이 많아졌습니다. 덕분에 올해 크리스마스 달력 첫째 날 기사에서는 바코드를 HTML로 표현하는 기법을 다루었는데, 이 HTML 형태로 바코드를 표현하면 웹브라우저를 사용할 수 있는 환경이라면 데스크탑은 물론 스마트폰까지도 문제없이 화면에 나타낼 수 있는 점이 장점입니다. 다만 이렇게 HTML 형태로 나타낼 경우 HTML 자체가 출력에 특화된 형식이 아니다보니 원하는 위치에 정확히 몇 가지의 바코드를 이렇게, 저렇게 출력하는 것은 여간 어렵지 않습니다. 이번 기사에서는 대량의 바코드를 프린터 출력에 적합한 형식으로 생성해내는 기법을 다룹니다.

3.16. Day 16 - 열여섯번째 날: Test::Mojo와 함께하는 보다 쉽고 편한 Web Application 테스트 by JEEN_LEE

업계에 들어오고, 엉망진창인 테스트 코드를 쓰면서도 계속되는 고민은 어떻게 하면 테스트 코드를 잘 쓸 수 있을까?였습니다. 그렇다면 잘 쓴 테스트 코드는 과연 어떤 것일까요? 물론 제가 그것을 알고 있다면 이런 기사를 쓰고 있지는 않겠죠. 좋은 테스트 도구를 만나면 이전과는 다른 보다 좋은 테스트를 쓸 수 있지 않을까와 같은 나름의 결론을 내려보았습니다. 바로 Test::Mojo를 사용하면서 말이죠. 따라서 이 기사에서 다룰 테스트 어플리케이션은 Mojolicious로 만들어졌다는 것을 전제로 합니다.

3.17. Day 17 - 열일곱번째 날: DBIx::Simple by luzluna

간단히 DB를 사용할 수 있는 모듈인 DBIx::Simple을 소개합니다.

3.18. Day 18 - 열여덟번째 날: Rex/Boxes로 개발 환경을 관리해보자 by corund

가상화를 이용하여 개발 환경을 실제 운영될 서버 환경과 비슷하게 관리하는 일이 많아졌습니다. 개발자들의 데스크탑이 서로 다른 환경이더라도 가상화를 이용하면 개발 환경을 쉽게 통일할 수 있습니다. Rex/Boxes를 이용해 이런 가상 환경을 쉽게 설정하고 공유할 수 있습니다. 같은 작업을 하는 도구로는 Vagrant가 유명합니다.

3.19. Day 19 - 열아홉번째 날: Qt 사용하기 by yukinpl

Linux에서의 GUI / Perl 에서의 GUI

Linux에서 GUI 툴킷하면 두 가지, GTK+와 Qt가 떠오르시나요? 그러나 펄에서는 Qt가 유독 힘을 쓰지 못하는 것 같습니다. GUI를 표현하기 위한 펄 라이브러리로는 wxPerl, Tk, Perl/Qt와 Perl/KDE, gtk2-perl 등이 있습니다. 그 중에서도 윈도우 사용자는 wxPerl을, Linux 사용자는 GTK+를 선호하는 것 같습니다. 대체 왜 그럴까요? 아무래도 Qt는 안정화 되어있다보니 모듈이 지속적으로 업데이트 되고 있지 않고 잘 알려진 모듈도 흔하지 않은 것이 가장 큰 이유인 것 같습니다. 더불어 라이센스 문제도 있겠지요(원인을 잘 아신다면 제게 알려주세요! :). 개인적으로는 Linux에서 C++ 프로그램 개발 시 GTK+보다 Qt로 더 많이 작업한 편이라 친근하기도 하고 펄에서 널리 사용되 못하는 것 같아 소개해보려 합니다.

3.20. Day 20 - 스무번째 날: Gearman 사용 사례 by gypark

최근에 다수의 압축 파일을 열고 내용을 확인하는 작업을 하게 되었습니다. 순차적으로 파일 하나하나를 처리하다보니 시간이 꽤 걸리길래, 혹시나 하는 생각에 Gearman을 사용해 보았고 생각 이상으로 효과가 좋다는 것을 알 수 있었습니다. 이 기사에서 그 예제 코드와 결과를 공유하고자 합니다.

3.21. Day 21 - 스물한번째 날: 번역 - "Modification of a read-only value attempted" 오류가 나는 흔한 경우 by gypark

언제나 매개 변수나 반환값이 복사되어 전달되거나 모든 변수가 불변성을 갖는 다른 언어들과 달리, 펄에서는 변수가 단지 다른 값 또는 변수의 별칭(alias)으로 동작하는 경우가 있고, 이런 상황에서 그 변수의 값을 수정하려 시도할 때 예상하지 못한 결과를 낼 수 있습니다. 오늘 기사는 PerlMonks의 좋은 글 하나(Common Causes for "Modification of a read-only value attempted" by imp, 2006.9.1)를 번역하고 더불어 관련해 제가 겪은 문제에 대해서도 소개합니다.

3.22. Day 22 - 스물두번째 날: use Hangout; by keedi

2013년을 기준으로 대한민국의 스마트폰 사용비율은 약 70%를 이미 넘었다고 합니다. 일반 피처폰 신제품을 구경하기 힘든 것을 감안하면 이 비율은 앞으로 더 증가할 것을 예측할 수 있죠. 더불어 정확하지는 않지만 스마트폰 사용자 중 약 80%는 안드로이드 폰을 사용한다고 하구요. 안드로이드 폰의 가장 큰 장점은 구글의 행아웃(구 GTalk)을 기본으로 사용할 수 있다는 점입니다. 안드로이드 폰에서 행아웃은 SMS 서비스와 거의 유사하게 동작하기 때문에 중요한 정보를 전달하기에는 메일보다 조금 더 유리합니다. 회사에서 발생하는 여러가지 이벤트를 기본적으로는 메일을 통해 전달하고는 있지만 중요도에 따라 이 행아웃을 통해 추가적으로 보내줄 수 있다면 편리하지 않을까요? 예를 들어 서버의 상태를 감시하다가 대부분의 경우는 메일로 보내지만 심각한 수준이라면 행아웃으로 보낸다던가, 데일리 빌드가 실패한 경우 행아웃으로 보낸다던가 말이죠. :-)

3.23. Day 23 - 스물세번째 날: 오타를 허용하는 문자열 일치 by skyloader

펄은 문자열을 다루는데 아주 효율적인 언어입니다. 제 경우 업무와 관련해 문자열을 다뤄야 할 일이 생기면 으레 use strict;으로 시작하는 펄 코드를 작성해서 간단히 해결하곤 합니다. 하지만 회사의 모든 사람이 펄이나 파이썬, 루비와 같은 프로그래밍 언어를 능수능란하게 다루며 스크립트를 작성해 문자열을 일관되게 다루는 것은 아닙니다. 회사에서도 대부분의 사람들은 이런저런 이유로 인해 직접 손으로 문자열을 다루는 것이 대부분입니다.

슬프게도 문제는 여기에서 비롯되죠. 문자열을 직접 사람의 손을 거쳐 다루게 되면 오타가 생기거나 원래 주어진 문자열을 주관을 가지고 해석해 다르게 사용하는 경우가 빈번합니다. 이렇게 재생산된 문자열을 다시 넘겨받아 원본 문자열과 비교해 사용한다고 하면 사소한 오타와 미묘한 단어의 재배치로 인해 간단한 정규표현식을 통한 문자열 일치로는 원본과 정확하게 일치시키지 못하는 경우가 태반입니다. 이런 경우 문제가 있는 부분을 사람이 눈으로 확인하면 쉽게 구분할 수 있지만 스크립트를 통한 자동화를 하기에는 애매하기 짝이없죠. 이번 기사에서는 이러한 상황을 극복하고 원하는 작업을 수행할 수 있도록 도와주는 알고리즘과 펄 모듈을 소개합니다.

3.24. Day 24 - 스물네번째 날: DAG 기반의 태스크 스케줄러 by saillinux

지금까지 우리는 자동화를 할때면 스크립트를 작성하거나 모듈을 작성해 여러 군데에 적용해 일을 처리하곤 하죠. 허나 더욱 고난이도의 일을 처리하다보면 태스크 의존성을 고려해야 하는 경우가 많습니다. 이를 스크립트를 작성해서 처리하다보면 다른 곳에서도 같은 코드를 작성하게 되고 이런 패턴을 일일히 모듈화 해서 새로운 스크립트에 적용하여 작성하는 것도 번거롭습니다. 펄의 Graph 모듈과 DAG 알고리즘을 조합해 태스크의 의존성을 해결할 수 있는 스케줄러를 만들어보면 어떨까요?

4. 2012년 크리스마스 달력

4.1. Day 1 - 첫째 날: 윈도우7 로그온 이미지 자동 변경 프로그램 by perlstudy

아래 그림은 어떤 그림일까요? 윈도우 사용자라면 누구나 바로 알 수 있을 겁니다. :)

 그림 1. 윈도우7 로그온 그림 (원본)

이 그림은 컴퓨터를 부팅한 뒤 Windows 7에 로그온할 때 나타나는 기본 로그온 그림입니다. 업체가 따로 설정하지 않으면 대부분 위의 그림으로 설정되어 있습니다. 이렇게 진부한 화면을 계속 보는 지루함은 도저히 견딜 수 없습니다! 지금부터 로그인 할 때마다 로그온 그림이 바뀌는 프로그램을 제작해 봅시다.

4.2. Day 2 - 둘째 날: Perl Hubot by aanoaa

p5-hubot은 쉽게 확장 가능한 IRC 봇입니다. 하지만 IRC에 국한되지 않고 다양한 프로토콜 환경에서 동작할 수 있습니다. p5-hubot을 소개하고 이를 사용하고 확장하는 방법에 대해 이야기합니다.

4.3. Day 3 - 셋째 날: 내겐 너무 가벼운 잡큐 by keedi

대부분의 사람은 동기적이기 때문에 많은 일을 하거나 많은 일을 맡길 때에도 동기적이려고 하며 동기적이길 기대합니다. 비동기적으로 일하기 위해서는 본능에 역행하는 노력이 필요합니다. 그러다보니 여러가지 IT 작업을 처리하다보면 자연스럽게 많은 일들을 동기적으로 처리하게 됩니다. 이것은 명확하며, 간결하고 이해하기 쉽죠. 하지만 때로는, 정말 때로는 어쩔수 없이 비동기적으로 처리해야 하는 일들도 있습니다. 요청에 대한 응답시간은 정해져 있는데 처음에 예상했던 것과 다르게 처리해야 할 것이 너무 많은 경우가 대표적인 경우입니다. 이 경우 최소한의 응답시간을 확보하기 위해 비동기로 일을 처리해야 하는데, 이 때 사용할 수 있는 가장 간결하고 손쉬운 방법이 바로 잡큐를 사용하는 것입니다. ...

4.4. Day 4 - 넷째 날: 초심자를 위해 남긴 초보의 비망록 - Dancer, DBI, DBD::MySQL by JellyPooo

데이터베이스에 저장된 정보를 가공해 웹 페이지에서 보여줍니다. 아래 네 줄로 요약된 과정을 위한 배경 지식과 설정 방법을 기술했습니다.
$ cpanm Dancer DBI DBD::mysql  # 관련 모듈 설치
$ dancer -a Myapp              # 뼈대 만들기
$ cd Myapp; vim lib/Myapp.pm   # Myapp.pm에 경로별 서브루틴 작성
$ ./bin/app.pl                 # 웹앱 실행, 브라우저로 접속

4.5. Day 5 - 다섯째 날: 펄은 파싱할 수 없다: 형식적인 증명

아담 케네디는 PPI 문서에서 펄의 구문 분석(파싱)은 불가능하다고 추측했습니다. 그리고 이것을 어떻게 증명하는지 보였습니다. 아래에 이 엄격한 형식의 증명을 첨부하였습니다. 여기서 동적 구문 분석과 유사한 이슈는 제외하는 것으로 가정합시다.

4.6. Day 6 - 여섯째 날: Using C from Perl by hazzling

자연어처리의 기반 모듈은 C로 작성된 경우가 많습니다. 대표적인 것은 형태소 분석기인데, 최근들어 형태소 분석기를 Java, Python, Perl 등의 다른 언어에서 사용하고자 하는 요청이 늘어나고 있습니다.

특히, Perl의 경우 강력한 문자열 처리가 가능해서 일단 형태소 분석기의 Perl wrapper를 만들어둔다면 개발 속도 등 여러 측면에서 시너지가 날 것으로 예상됩니다.

이와 같은 배경에서, 이 글에서는 Perl의 XS(eXternal Subroutine)를 이용해 C 라이브러리를 Perl에서 사용하는 방법에 대해 기술합니다. 더불어 FCGI와 연동해서 WEB API를 작성하는 방법에 대해서도 살펴보고자 합니다.

4.7. Day 7 - 일곱째 날: M3U Copier for Win32 (부제: 유니코드 파일명과의 전쟁) by owl0908

여러분의 하드 디스크에는 몇 곡의 MP3 파일이 저장되어 있나요? 컴퓨터나 휴대기기를 통해 음악을 들으시는 분들이라면 아마도 적지 않은 수의 MP3 파일이 저장되어 있을 겁니다. 저만 하더라도 거의 1만개가 넘는 수의 MP3 파일이 저장되어 있네요. 이렇게 관리하기도 힘든 숫자의 MP3 파일이 쌓여 있지만, 사실 우리가 실제로 컴퓨터나 휴대기기에 걸어 놓고 듣는 곡은 생각보다 그리 많지 않을 겁니다. 제 경우, 하드 디스크에 저장되어 있는 MP3 파일 중에 최근 1년 안에 한 번이라도 재생해 본 파일은 채 2천개가 안 되는 것 같네요.

그런데 자주 듣는 곡, 좋아하는 곡 위주로 음악을 듣다 보면, 디스크 어딘가에 자주 듣는 MP3 파일들만 모아놓는 폴더가 생기는 것이 보통입니다. 자연스러운 일인데 생각해 보면 이것이 비극의 시작입니다. 같은 곡이 여기저기 새끼를 치게 되는 시발점이 되거든요. 게다가, 처음에는 깔끔하게 정리된 MP3 저장 폴더 따로, 재생용 앨범 폴더 따로 잘 관리를 하겠지만, 나중엔 새로 다운로드 받은 MP3 파일이 재생용 폴더에만 휙 던져져 있다던가, 정리하다 만 파일들이 MP3 저장 폴더 내에 각종 새 이름(...)을 달고 너저분하게 어질러져 있다던가 하는 사태가 벌어지게 마련입니다. 결국 디스크 용량은 용량대로 낭비되고, 정작 원하는 파일을 찾기도 어려운 이중고에 빠집니다1. 네, 다 제가 겪은 일들입니다. orz

4.8. Day 8 - 여덟째 날: STF or "Stepover Toehold Facelock" or "STorage Farm" by luzluna

벌써 여덟번째 날이 되었습니다. 오늘 소개하려는것은 STF입니다. STF는 원래 프로레스링의 기술 이름입니다. "Stepover Toehold Facelock"의 약자인데 번역하면 '발을 걸고난 뒤 얼굴을 건다'라는 의미입니다. 주로 마지막 기술로 쓰이는 관절기로써 넘어뜨린 상대의 다리를 다리로 잡은 뒤 돌아와서 머리를 잡아서 항복을 받아내거나 상대의 스테미너를 깍아내는 기술입니다. 원래 처음에는 STFU(Shut the Fxxx Up)라는 이름으로 불렸다는데 좀 순화해서 STF로 이름을 바꿨다는군요. 존 시나의 주요 끝내기 기술이라고 합니다.

4.9. Day 9 - 아홉째 날: 더 나은 Perl 개발환경을 위하여 for Vim by JellyPooo

손에 맞는 개발환경은 보다 나은 효율을 약속합니다(꼭 그렇지만은 않습니다. 본말이 전도되어 개발환경을 위한 개발을 하게 되는 e___s 같은 에디터도 있습니다. (전.. emacs에 적응하지 못한 패배자입니다 T_T). 편집과 실행용 창을 각각 띄우고, 문서 참고를 위해 브라우저 실행해 구글 검색하고 하다보면 원래의 목적을 잊고 인터넷 서핑을 하고 있는 자신을 발견합니다. 개발에 집중하기 위한 환경, 그중에서도 vim을 사용할 때 쓸 수 있는 플러그인을 소개합니다.

4.10. Day 10 - 열번째 날: LWP 모듈로 웹 데이터를 긁어오자 by laen0k

여러분들 중에도 웹상에 떠도는 데이타를 내 수중에 넣고 요리해 보고 싶은 분들이 계실 것입니다. 제 경우, 최근 심취해 있는 대항해시대의 각 함선에 대한 레벨별 정보를 뽑아 그리드 형식으로 출력하는 프로그램을 한 번 만들어보았습니다. 이러한 작업은 CPAN에 있는 다양하고 유용한 여러 모듈들을 지니고 있는 Perl과 함께라면 아주 간단합니다. 저같은 초보도 잘 사용하기만 하면 뚝딱 만들어 낼수 있을 정도니까요~ 그럼 시작해 볼까요?

4.11. Day 11 - 열한번째 날: 내겐 너무 어려운 슬라이드 by rumidier

파워포인트, 키노트, 프레지... 세상에는 정말 훌륭한 슬라이드 저작 도구가 많습니다. 한 해, 한 해 거듭할 수록 이런 도구들이 지원하는 효과는 화려해지고 미려해집니다. 하지만 그에 비해 익혀야 할 기능은 많고, 메뉴 목록을 보면 숨이 '턱'하니 막힐 것 같습니다. 간단한 발표자료를 만들기 위해 발표자료 저작 도구를 공부해야 한다니... 무릇 당연한 일 같지만, 또 한편으로는 무언가 비효율적인 것 같습니다. Perl 해커 중 한 명인 Ingy dot Net가 만든 Vroom은 그야말로 저와 같은 사람을 위한 슬라이드 저작 도구입니다! 자, 출발해볼까요? 부릉부릉~~ :)

4.12. Day 12 - 열두번째 날: MySQLNoSQL로 사용하기

대부분의 대규모 웹 응용프로그램들은 MySQL과 memcached를 사용합니다. 그 중 대부분은 TokyoCabinet/Tyrant 같은 NoSQL도 사용하고 있습니다. 몇몇 경우, 사람들은 MySQL을 배제하고, NoSQL과 구분해두었습니다. NoSQL이 MySQL보다 primary key 검색과 같은 단순 접근 패턴에서 훨씬 뛰어나다는 이유로 말입니다. 웹 응용프로그램들로부터 받는 대부분의 쿼리는 단순하기 때문에 이러한 결정이 합리적인 판단으로 보입니다.

다른 대규모 웹 사이트들처럼 DeNA도 몇 년 동안 동일한 문제를 갖고 있었습니다. 그러나 우리는 다른 결과에 도달하였습니다. 지금도 우리는 MySQL만 사용하고 있습니다. 물론 프론트엔드 캐쉬(예를 들어 전처리된 HTML, 조회/미리보기 정보 등)에서는 아직 memcached를 사용하고 있습니다. 그러나 여러 행을 캐쉬하는데에는 사용하지 않습니다. 또한 NoSQL도 사용하고 있지 않습니다. 왜냐고요? 그건 우리가 MySQL에서 다른 NoSQL 제품들보다 더 나은 성능을 얻어낼 수 있었기 때문입니다. 우리는 벤치마크에서 통상 MySQL/InnoDB 5.1 서버와 원격 웹 클라이언트로부터 초당 75만 쿼리를 얻을 수 있었습니다. 제품 환경에서도 놀라운 성능을 얻을 수 있었습니다.

여러분은 저 숫자가 믿기지 않으시겠지만, 이것은 실제 이야기 입니다. 이 긴 블로그 글을 통해 이 경험을 같이 나누길 바랍니다.

4.13. Day 13 - 열세번째 날: 도구를 만들고 배포하자 by am0c

양타 군은 외딴 초원사막 마을의 시스템 관리자입니다. 양타 군은 시스템 관리 프로세스가 복잡해지면서, 반복되는 작업을 자동화하고 싶었습니다. 시중에 있는 잘 알려진 도구가 좋은 선택이기는 했지만 자사의 환경에 맞지 않는 부분이 있었습니다. 어떤 것은 너무 컸고, 어떤 것은 너무 느립니다. 일부는 그대로 쓰되 일부는 직접 구현하여 사용하기로 했습니다. 유지보수 관리자에게 일을 넘기고 싶지는 않습니다. 문서는 간결하면 좋겠습니다. 다른 머신에 도구를 쉽게 배포할 수 있어야 합니다. 다른 사람이 그 도구를 받아도 쉽게 사용할 수 있으면 좋겠습니다. 양타 군은 이 모든 것을 해결하고 싶었습니다.

하지만 양타 군은 시간이 부족합니다. 수많은 관리 작업의 일부인 이것을 위해 정교한 도구를 만들며 시간을 버려서는 안됩니다. 대충 만들면 나중에 보틀넥이 될 것 같습니다. 우리의 마법사, 펄을 써야겠습니다! 편집기를 열고, 곧장 명령행 옵션 상세를 정하고, 로직을 작성합니다. 자원의 보고라 불리는 CPAN 해저를 탐색하고 수확한 라이브러리를 이리저리 붙입니다. 양타는 그렇게 순식간에 원하는 도구를 만들었습니다. 어떻게 만들었을까요?

4.14. Day 14 - 열네번째 날: 동아시아 언어의 로마자 변환에 도전해보자! by studioego

오늘은 동아시아의 각 나라에서 쓰이는 언어들에 대해 로마자 표기에 대해 소개하겠습니다. 동아시아 각 나라의 문자 입력 방식은 아래와 같습니다.표 1. 각 나라의 문자 입력 방식 (출처: CJKV Information Processing , 1st Edition)Locale (로케일)Writing Systems (입력 시스템)중국(China)Latin, 한자[汉字, hanzi(simplified chinese) 简体中文]대만(Taiwan)Latin, 주음부호[zhuyin,注音符號]and 한자[漢字, hanzi(traditional chinese),繁體中文]일본(Japan)Latin, "히라가나[hiragana,ひらがな]","카타카나[Katakana,カタカナ]", and "한자[kanji 漢字,かんじ]"한국(Korea)Latin, 한글[hangul], 한자[漢字, hanja]

각 나라별로 입력 방식 참 많죠? 영어를 쓰는 나라나 알파벳을 사용하는 나라에서는 입력 방식이 알파벳이면 되지만, 한자(漢字/汉字/Chinese Character)를 사용하는 국가에서는 한자와 자국어를 입력하기 위해 여러가지 입력방식을 사용한다는 것을 알 수 있습니다.

위의 문자들을 입력할때 한국어의 경우는 한글로 편하게 입력할수 있지만(로마자로도 입력 가능합니다), 중국어의 경우는 중국어를 입력하기 위해서 로마자로 표기를 한 후에 한자로 변환해서 입력을 해야하는 불편함이 있습니다. 일본어의 경우는 히라가나로 입력을 해도 한자로 변환해서 입력해야하는 부분이 있기 때문에 불편합니다. (로마자로 입력을 해도 한자로 변환하는 등의 불편함이 있습니다.) 이렇게 쓰고 보니 한글을 만든 세종대왕님이 존경스럽군요!

4.15. Day 15 - 열다섯번째 날: 자랑스러운 우리 회사의 숨은 일꾼 만들기 by y0ngbin

첫눈이 내리고, 어김없이 캐럴이 울려퍼지면, 거리에는 삼삼오오 소중한 사람들과 함께 즐거운 시간을 보내는 사람들로 북적거리는 연말이 찾아온 것을 느낄 수 있습니다. 하지만 모두가 즐거운 시간을 보내는 이 순간에도 원활한 서비스를 위해 누군가는 어딘가에서 묵묵히 일을 해야만 합니다. 크리스마스이브에 야근을 해야 하는 그 누군가가 여러분이 되지 않기 위해서는 그 일을 맡길 다른 사람을 얼른 찾아야 합니다.

Gearman은 이런 우리의 고민을 해결해 줄 수 있는 근사한 해결책 중에 하나입니다. Gearman은 여러분이 작성한 일꾼을 밤낮으로 감시하며 언제든 원하는 일을 처리할 수 있는 환경을 제공해 줍니다. 일꾼은 항상 시킨 일을 묵묵히 할 뿐만 아니라 필요하면 언제든지 일꾼의 수를 늘리거나 줄일 수 있습니다. '일꾼1'과 '일꾼2'가 잡 큐 작업장에서 만나 비밀 사내 연애 끝에 결혼을 해 '일꾼3'을 출산하게 되어 육아휴직을 주어야 할 일도 없고, 임금인상이나 퇴직금을 요구하지도 않으며, 노조를 결성해서 파업할 걱정도 없으므로 회사를 경영하는 처지에서는 더할 나위 없이 좋은 대안입니다.

그리고 Gearman과 같은 잡 큐 방식의 구조를 빌릴 경우, 시간이 오래 걸리는 작업에 대해 병목이 되는 지점에 추가적인 작업을 더 할당해서 그 일을 병렬로 처리해 작업의 처리 효율을 높힐 수도 있고, 때로는 '서비스1'과 '서비스2'에서 반복적으로 사용하는 공통 기능 X를 각각의 서비스마다 중복해 구현하지 않고 외부에 두어 구조를 개선할 수도 있습니다.

4.16. Day 16 - 열여섯번째 날: Perl and Gearman by sng2c

용빈님의 gearman 기초 덕에 요점만 쓸 수 있게 되어 기쁩니다^^ 용빈님++.

기어맨을 본격적으로 도입하셨나요? 손쉽고 깔끔하게 RPC와 맵리듀스를 구현한 뒤에 찾아오는 워커 관리 지옥을 겪어보셨나요? 저는 그 지옥을 보았습니다. 그래서 그 지옥에서 탈출하는 방법을 만들었고 공유드리고자 합니다. 기어맨 워커 운영시 겪게 되는 문제들은 이렇습니다.

4.17. Day 17 - 열일곱번째 날: RUDY Slowloris by newbcode

R-U-DEAD-YET(RUDY). 아직 죽지 않았니? 마치 관리자를 조롱하는 듯한 공격 이름입니다. RUDY를 시작하기전에 대략 DOS의 역사를 집어보면 2000년초 아마존, E-Bay를 시작으로 DDOS는 세상에 알려지게 됩니다. 이때만 해도 네트워크 인프라가 없었기 때문에 대량의 좀비봇과 원격서버로 공격을 감행했습니다. 그리고 또 하나의 특징으로는 실력 행사용 공격 양상을 보였지만 2005년도를 넘어 오면서 일정한 타겟을 두고 금품 갈취를 목적으로 DDOS 공격이 시행됐습니다. 주로 타겟은 불법게임사이트, 전자상거래 사이트 등이 타겟이 되었습니다. 그리고 2009년 7.7대란이 일어나게 되고 이제부터는 국가간 사이버전쟁 시대를 암시하듯 국가 기간망과 포털, 정부 등을 노리게 됩니다. 즉 실제로 Fire Sale이 진행되는 양상을 보입니다. Fire Sale은 국가 전체 구조에 대한 체계화된 3단계 공격입니다.1단계는 모든 교통체계를 무너트리고 모든 재정과 주요 통신망을 마비 혹은 장악합니다 .2단계는 이후, 가스, 수도, 전기, 원자력 등 모든 공공시설물에대한 통제 권한을 뺏는 것입니다.3단계는 그 나라를 무력으로 초토화하는 것입니다.

1단계가 바로 2009년 7.7대란과 흡사합니다. 이처럼 DDOS 공격은 대담해지고 고도화되고 있는 시점에서 RUDY 공격은 중요한 전환점이 됩니다. 기존의 DDOS 공격은 좀비 PC를 이용해 세션 L7에서 대량 트랙픽을 유발하는 방식의 공격이었습니다. 그래서 어플리케이션 방화벽으로 패턴을 잡아내서 방어를 하였습니다. 하지만 RUDY는 패턴이 없기 때문에 사실상 막거나 눈치채기 어렵습니다. 가장 큰 차이점은 트래픽이 비정상으로 많아지는 것이 아니라 서서히 세션을 늘려감으로써 서버의 리소스를 서서히 좀 먹는 것입니다. 결국 세션이 넘치게 되면 서버는 die 상태가 됩니다.

서론이 너무 길었습니다. 이제 RUDY 공격 중 Perl로 짜여진 Slowloris 공격 소스를 보고 관리자의 시점이 아니라 순수한? 마음으로 분석을 진행해보겠습니다. 본론으로 들어가기전 Slowloris의 특징을 보겠습니다.HTTP GET 기반 Flooding입니다.공격 PC는 달랑 1대면 됩니다.아주 정상적인 세션을 가집니다.공격이 끝나기 전까지는 로그를 남기지 않습니다.공격 대상은 서서히 말라 죽습니다.타겟이 아파치 서버의 아키텍쳐 자체에 있습니다. 그러므로 방어가 까다롭습니다.

위에 내용을 기억하시면서 보시면 더 재밌을 것 같습니다.

4.18. Day 18 - 열여덟번째 날: Urlader로 Perl 스크립트를 단일실행파일로 만들기 (node.js,Python,Ruby도 가능) by aer0

Perl로 유용한 프로그램을 만들어서 누군가와 공유해서 쓰고 싶다면 어떻게 배포할지 고민하게 됩니다. 사용자가 Perl을 잘 아는 사람이면 "Perl을 설치하고 이 스크립트를 실행하라"고 쉽게 떠넘길 수 있지만 대다수 사용자들은 그냥 보통 실행 파일처럼 .exe 파일을 마우스로 클릭하면 모든게 알아서 실행되길 바랍니다. Perl을 단일 실행 파일로 만드는 방법은 PAR를 이용한 방법 등 다음과 같은 기존의 방법이 여럿 존재합니다.2011년 24일 펄 달력 기사의 마지막 "단일파일 배포 및 패키징" 섹션윈도우에서 Perl어플리케이션을 배포하는 방법에 대한 블로그 포스트

위에서 언급한 PAR 등의 패키징 툴을 이용하는 방법의 문제는 필요하지 않은 많은 파일들이 같이 패키징되어 용량이 너무 커지고 초기 실행 시 임시로 내부 파일을 압축 해제하게 되는데 그 시간이 다소 오래 걸린다는 단점이 있습니다. 또, 후자의 방법같이 launcher만 만들어 하는 방식은 실행 속도는 빠르나 내부 파일들이 그대로 노출되고 나열되어 좀 너저분해 보인다는 단점이 있습니다. 그러면 꼭 필요한 파일들만 추려서 단일 실행 파일 하나로 패키징하는 방법은 없을까요?

4.19. Day 19 - 열아홉번째 날: HTTP 다운로드에 날개를

관리하는 서버가 미국에 있는 관계로 간혹 대용량 컨텐츠를 다운받는 시간이 업무의 많은 시간을 차지하는 경우가 있습니다. 그래서 때로는 screen 세션에 다운로드를 걸어두고 퇴근을 하거나, lftp의 mirror 옵션을 이용하여 병렬 전송을 이용하여 여러 개의 컨텐츠를 동시에 내려받곤 합니다. 그런데 간혹 단일 대용량 파일은 약간의 꼼수를 이용하기도 합니다. 즉, 대용량 파일을 64개로 분리하여 lftp 옵션을 이용하여 병렬 다운로드한 후 다시 합치는 것입니다. (lftp의 병렬 옵션 최댓값이 64입니다.)

서론은 걷어 버리고.. HTTP 컨텐츠를 빠르게 받을 수 있는 방법에 대해 소개해 보겠습니다.

4.20. Day 20 - 스무번째 날: Plack으로 웹 서버 없이 CGI 스크립트 실행하기 by gypark

예전에 리눅스 서버에서 만든 CGI를 윈도우에서 써 보고 싶은데, 짧은 CGI 스크립트를 하나 쓰자고 Apache 웹 서버를 설치하는 건 과하다 싶었습니다. 그렇다고 요즘 많이 쓴다는 Dancer나 Mojolicious 같은 웹 프레임워크를 따로 배워서 새로 스크립트를 작성하자니 이것도 배보다 배꼽이 더 큰 느낌이었죠. 그런데 Plack을 사용하여 기존 CGI 스크립트를 그대로 실행할 수 있었습니다. 이 글에서는 간단한 예를 통해 그 과정을 설명합니다.

4.21. Day 21 - 스물한번째 날: IRC 떡밥 아카이브 만들기

초심자로서 Perl을 사용해 어떤 재미난 것을 할 수 있을까 생각해 봤습니다. 평소 IRC를 즐겨 하면서 고수들의 유익한 URL 링크가 공부에 많은 도움이 되고 있습니다. 여러 사정으로 인해 채널에 올라온 정보를 놓치는 경우가 많은데 POE::Component:IRC 모듈과 WWW::Mechanize::Firefox 모듈을 사용해서 평소 애용하는 Firefox로 보관해둘 수 있을 거란 생각이 들더군요. URL 링크는 언제든지 사라질 수도 있어 해당 페이지의 주요 정보를 Firefox로 고스란히 다시 읽어 볼 수 있게 해 보겠습니다.

4.22. Day 22 - 스물두번째 날: 보면서 작성하는 마크다운 편집기

90년대 통신 에뮬레이터를 열어 쀠익--지지징-삑삑 소리를 들으며 PC통신을 하던 시절에서 10년도 채 지나기도 전에 인터넷 세상으로 바뀌었죠. 인터넷 중에서도 웹이 가장 활성화 되면서 1인 1홈페이지 시대가 열렸고, 웹의 표현 언어인 HTML을 자연스럽게 접할 수 있게 되었습니다. 지금 보고 계신 2012년 Seoul.pm 크리스마스 달력 역시 HTML로 만들어졌기 때문에, 컴퓨터 또는 모바일 환경의 브라우저를 이용해 볼 수 있는 것이죠.

하지만 사실 github의 저장소를 살펴보신 분이라면 눈치채셨겠지만, 크리스마스 달력의 모든 기사는 마크다운으로 작성되어 있습니다. 마크다운은 HTML을 표현하기 위한 한 형식이지만 쉽고 간결한 덕에, 전 세계적으로 널리 사용하고 있는 인기 있는 파일 형식입니다. 다만, 위지위그 방식이 아니기 때문에 바로바로 확인하기가 어려운 것이 단점입니다. 이러한 단점도 극복하고, 올해 크리스마스 달력 기사 작성할겸 누구나 쉽게 이용할 수 있는 마크다운 편집기 웹앱을 만들어보겠습니다. :)

4.23. Day 23 - 스물세번째 날: 흔한 개발 이야기 by keedi

펄로 개발하는 일은 무척 신선한 경험입니다. 전형적인 컴파일 언어로 개발하다가 펄을 만나게 되었을 때의 그 짜릿함이란! (잘 모르는) 많은 사람들의 우려와 달리 펄은 모듈화하기가 매우 쉬우며, 큰 규모의 프로그램을 작성하기에 적합한 구조를 가지고 있습니다. 하지만 많은 분들은 여전히 펄을 원라이너나 짧은 스크립트 정도로만 쓰고 있거나, 또는 그것이 펄의 전부라고 믿곤 합니다. 오늘은 짧지만 전형적인 개발 절차를 밟는 과정을 살짝 보여드릴까합니다. 그야말로 흔한 개발 이야기죠. :)

이것 저것 너무 깊진 않아도 여러 분야를 아우르지만, 구색도 갖추려면 무엇이 적당할까요? 역시 모듈화도 해야할테고, 객체지향으로 작성하는 편이 낫겠죠? 모듈로 만들었으니 패키징도 해야할테고, 모듈을 사용하는 명령줄 스크립트는 보너스로 넣고, 자료를 다룬다면 데이터베이스를 사용해야겠죠. 또 이것을 웹과 연동하면서 모바일 환경에서도 사용하는 정도면 어떨까요? 기왕이면 모듈에 문제가 있어서 그대로 사용하기에는 애로사항이 있으면 더할나위 없겠군요. 자, 지금부터 간단한 일정 관리 도구를 만들어 봅시다.

4.24. Day 24 - 스물네번째 날: 요즘은 ZooKeeper로 커피숍을 차리더라 by saillinux

주키퍼는 분산 코디네이터 서비스를 제공하는 아파치 오픈소스 프로젝트입니다. 분산 환경에는 락, 네이밍 서비스, 클러스터 멤버십 등을 쉽게 구현할 수 있는 기능이 제공되어야 합니다.

분산 환경에서는 다양한 운영 상황이나 예상치 못한 장애가 발생하는 것 등의 원인으로 복잡한 문제가 발생하게 되는데, 분산된 애플리케이션 서버 사이의 자원 경합, 락 잠금/해제 등이 있습니다. 주키퍼는 이러한 문제들을 쉽게 해결해주는 역할을 합니다. 대표적인 이용 사례는 다음과 같습니다.네임 서비스, 환경 설정, 그룹 멤버쉽이중 배리어우선 순위 큐공유 락 제어두 단계 커밋리더 선출

주키퍼가 실제로 이런 기능을 제공한다기 보다는 기능을 쉽게 구현할 수 있는 메커니즘을 제공한다고 할 수 있습니다. 이런 고급 기능을 분산 환경 서비스를 구축하는 것에만 쓰기에는 너무 쓸쓸하지 않나 싶습니다. 그래서 주키퍼로 커피숍을 차려보도록 하겠습니다.

5. 2012년 석가탄신일 기념 달력

5.1. Day 1 - 첫째날 : 펄을 이용한 그림 파일 긁어오기. by unsorted_imgs

이 글에서 다루는 기술적 수준은 eeyees 님의 2010년 12월 6일 기사 '나만의 E-Book으로 따뜻한 크리스마스를!'(이하 나만의 이북) 에서 다룬 내용입니다. 개별 사이트에 적용하면서 제 필요에 맞게 개선했습니다.

이 기사에선 '나만의 이북'에서 그림 파일 긁어오기 기능을 좀 더 개선 및 다양한 사이트에 적용한 결과를 공개합니다.

그림 파일 긁어오기는 재미도 있을 뿐만 아니라, 여러 쓸모가 있습니다. 다만 그림파일이 있는 사이트 관리자는 싫어하겠죠. 그림을 긁어오는 행위 자체와 긁어온 그림을 공개하는 것이 법적으로(저작권, 청소년 보호법) 등에 위배되지 않는지는 꼭 미리 확인해보세요. 여기 공개 된 내용으로 뭔가 하더라도 이 기사의 글쓴이와 펄 커뮤니티에서 책임을 지지 않습니다.;

또한, 특정 사이트에 맞춰 작성된 코드이기에 범용성이 매우 떨어지고, 매번 사이트에 맞춰 코드 수정이 필요합니다.

글쓴이 JellyPo가 펄에 입문한지 5개월(시간 날 때 가끔 들여다보는 수준)임을 감안하고 봐 주세요. :D

5.2. Day 2 - 둘째날 : Template Toolkit -> Xslate by JEEN_LEE

습관적으로 Catalyst 를 쓰고, 습관적으로 View 는 Template Toolkit 을 사용해왔습니다. Text::Xslate 은 잔잔한 일에서 사용해왔습니다만, 이번 기회에 Catalyst View 단을 Xslate 로 사용해보고 TT2 에서 부딪혀왔던 부분들을 어떻게 Xslate 에서 사용하고 있는지, 또 Xslate 를 사용하면서 어떻게 바뀌었는지에 대해서 이야기를 해보고자 합니다.

5.3. Day 3 - 셋째날 : 인터넷 사전을 쉘에서 사용하고 싶다 by rumidier

뛰어난 개발자를 꿈꾸며 원서를 읽어 보지만 모르는 단어가 너무 많습니다. 시도 때도 없이 단어 검색을 하느라 문서 보랴 단어 검색 하랴 코딩 해보랴 키보드 칠 시간에 마우스질 하느라 더 바쁩니다. 더불어 검색중 흥미 있는 기사거리를 보면 헬게이트가 열리게 되죠..... 그래서 마우스를 건들지 않기 위해 초보 펄게이가 간단한 사전을 만들어 보았습니다. 초보 펄게이는 만들수 있는게 한정 되있기 때문에 거대한 사전을 만들수 없으니 N이놈 에서 읽어 오는 방식을 택하였습니다. 초보 펄게이와 함께 열반에 들어 봅시다.

5.4. Day 4 - 넷째날 : 나의 Catalyst 답사기 II by JEEN_LEE

2010 년 크리스마스 달력 기사 - 나의 Catalyst 답사기 II 에서 Catalyst 를 사용할 때 저는 이렇게 한다라고 끄적여 놓았던 적이 있습니다.

오늘은 그 연장선상에서 얘기를 진행해볼까 합니다. 어디까지나 제가 사용할 때 주로 하는 일들에 대해서 입니다.

5.5. Day 5 - 다섯째날 : Inline모듈을 사용하여 Perl의 성능 극복하기 - 몬테카를로 시뮬레이션 by aer0

Perl같은 스크립트언어들은 빠른 개발속도와 뛰어난 표현력으로 해야 할 일을 재빨리 해치울 수 있지만 반면에 그 trade-off로 성능에 있어서는 C나 C++등의 native 바이너리로 컴파일되는 언어들에 비해서 뒤떨어질 수밖에 없습니다. 특히나 많은 루프를 돌며 많은 계산을 해야 하는 작업 같은 경우 그 차이가 더 벌어지게 되죠.

그렇다면 생산성과 성능의 양쪽을 취하고자 한다면 전체적인 구조를 잡고 콘트롤하는 영역은 Perl로 짜고 성능에 있어 Perl로는 병목이 생기는 부분은 native 바이너리로 컴파일된 코드의 성능을 취하면 될 것입니다.

따라서 여기서는 그러한 상황을 모사하기 위해 몬테카를로 시뮬레이션이라는 무작위 숫자의 무수한 반복에 의해 통계적인 방법으로 근사적인 해를 구하는 방법을 사용하여 의도적으로 Perl구현에 있어 병목지점을 만들고 그 병목지점을 Inline모듈을 통해 C코드를 인라인으로 Perl코드에 포함시킴으로써 실제 얼마만큼 성능향상을 꾀할 수 있는지를 보려고 합니다.

5.6. Day 6 - 여섯째날 : RPC 서버가 별건가요? by keedi

전산학과에서는 보통 학부 3, 4학년 사이에 RPC와 관련해 한 번씩은 스쳐 지나갑니다. 혹자는 운영체제를 공부하면서 알게 되기도 하고, 또는 분산시스템을 공부하면서 알게 되기도 하고, 때로는 기억은 나지 않지만 과제를 하다가 알게 되기도 합니다. RPC는 원격 프로시저 호출(Remote Procedure Call)로써 쉽게 말하면 이기종간의 플랫폼 사이에서 함수를 호출해서 서버의 자원을 사용해 연산한 후 그 결과를 전달 받는 것으로 전통적이며 대표적인 명세로는 CORBA나 SOAP, XML-RPC 등이 있습니다. 일반적인 전산학과의 학부 수업 과제라면 원격 프로시저 호출을 이용해서 계산기 RPC 서버와 클라이언트를 구현하곤 합니다. Perl을 사용하면 이런 RPC 서버를 작성하는 것이 얼마나 간단한 일인지 살펴보겠습니다.

5.7. Day 7 - 일곱째날 : Perl Again in 2012 by sng2c

오래전 우리나라에서는 잊혀지고만 펄을 재조명해봅니다.

5.8. Day 8 - 여덟째 날 : perl 환경구축 최단코스 by pung96

root 권한없이 모듈을 자유롭게 설치하고 싶다거나 여러 환경의 펄 버젼이나 모듈을 관리하고 싶다면 당신은 당신이 찾던 바로 그 글을 보고 있는 것이다. 이 주제는 여러번 되풀이 되었고 매우 훌륭하고 자세한 글들이 있지만, 여기서는 글쓴이의 방법을 이용해 가능한 빠르고 적은 타이핑으로 개인 환경을 구축해보도록 하자. 이 글은 두 부분으로 나뉜다cpanm + local::lib : 시스템에 설치된 펄을 이용하여 자신의 모듈을 설치한다.perlbrew : 자신만의 perl을 설치(컴파일) 하고 다양한 라이브러리 모음 환경을 설정한다.

5.9. Day 9 - 아홉째날 : 일자리의 독과점을 방지하는 선택지 Job Queue by JEEN_LEE

보통 우리는 컴퓨터를 사용하여 어떤 처리를 통해서 결과를 얻게 됩니다. 하지만 그 결과는 지금봐도 되고, 나중에 봐도 되죠. 지금 당장 모든 결과를 보겠다고 꾸역꾸역 이것저것 처리를 한꺼번에 하게 된다면 그만큼 대기 시간은 길어지게 됩니다.

그러니 당장 필요한 최소한의 결과만을 먼저 얻어내고, 그 이외의 것들은 따로 처리하여 별도로 결과를 축적/확인할 수 있다면 그 대기시간은 짧아지겠죠.

이런 방법들을 위해서 실제 동작하고 있는 서비스의 코드를 예로 설명하고자 합니다.

5.10. Day 10 - 열째날 : bootstrap.pl - Easily jump into a project and start contributing by aanoaa

프로젝트에 쉽게 참여하고 참여시키기 위해 사용하는 방법입니다.

    README.md 강화
    모듈의존성은 Carton으로 해결
    script/bootstrap.pl의 사용

5.11. Day 11 - 열한째날: 사용자 locale에 맞춰 자동으로 인코딩 디코딩용 캐릭터셋 지정하기 by gypark

Console에서 수행되는 Perl 프로그램을 만들 때, 입출력 데이타에 한글 또는 다른 ASCII범위를 벗어나는 글자가 있다면, 이를 적절하게 인코딩, 디코딩해야 할 것입니다. 문제는 캐릭터셋으로 UTF-8을 쓰는 리눅스 쉘과, cp949를 쓰는 윈도우 명령 프롬프트 창에서 같이 쓸 수 있는 코드를 작성하려면 현재 사용 중인 캐릭터셋이 무엇인지를 먼저 알아내고 그에 맞춰서 encode()와 decode()의 인자를 조절해주어야 한다는 것입니다. 이 글에서는 별도의 수고 없이, 현재 프로그램이 실행되고 있는 시스템 환경에 따라서 적절하게 인코딩과 디코딩을 할 수 있는 방법을 설명합니다.

5.12. Day 12 - 열둘째날 : 펄로 알아보는 성인들의 자비지수 by JEEN_LEE

각 문화권별로 대표적인 성인이 있습니다. 한국에서는 대표적으로 부처님, 예수님이 있겠죠. 마침 부처님 오신날의 위치선정이 뛰어나 중생들을 자비로 다스려주시니... 월요일은 쉬는날입니다.

그래서 오늘은 펄로 부처님과 예수님의 위치선정능력을 확인해보고자 합니다.

6. 2011년

6.1. Day 1 - 첫째 날: 네모 반듯한 표 그리고 한글 by keedi

화려한 UI를 가진 응용 프로그램과 웹페이지가 가득한 21세기라 하더라도 터미널에서 작업을 하는 사람은 여전히 많습니다. 비단 프로그래머 뿐만 아니라 서버 관리자는 물론, 대용량 자료 처리를 위해 *nix 머신에 접속해서 여러가지 프로세스를 돌려 결과 뽑아내야하는 생명정보학 연구원 역시 21세기인 지금까지도 터미널을 즐겨 쓰는 사람들입니다.

터미널의 특성상 표현할 수 있는 문자가 제한된 만큼 화려한 효과를 보여줄 수는 없지만 하지만 이 와중에도 ASCII 아트처럼 제한된 문자를 이용해서 터미널에서의 표현력을 높이려는 시도는 항상 있었습니다.

THERE'S MORE THAN ONE WAY TO DO ME
           _                      
       .--' |                     
      /___^ |     .--.            
          ) |    /    \
         /  |  /`      '.         
        |   '-'    /     \
        \         |      |\
         \    /   \      /\|      
          \  /'----`\   /         
          |||       \\ |          
          ((|        ((|          
          |||        |||          
   jgs   //_(       //_(          

아마도 검은색 화면에 흰색(또는 녹색!)의 글자가 만들어내는 정갈한 화면에 매료된 적이 있다면 아마도 당신은 해커일 확률이 높겠지요. :-)

예술(?)은 잠시 접어두고 일 이야기를 해볼까요? 터미널을 즐겨 쓰는 사람들은 자신이 작업하고 있는 결과물 역시 터미널에서 확인해야 할 경우가 많습니다. 또 그것이 간편해서 선호하기도 하구요. 엄청나게 많은 내용이라 사람이 보기 위한 자료가 아닐 수도 있지만 때로는 한 두 페이지 내외의 눈으로 확인해야 할 자료도 있습니다. 지금부터 살펴볼 내용은 바로 여러분이 눈으로 확인하려는 자료입니다.

6.2. Day 2 - 둘째 날: Perl 원라이너(one-liner)로 Octopress 따라잡기 by pung96

한 줄의 Perl 코드로 필요한 알고리즘을 작성하는 Perl 원라이너(one-liner)는 매우 유용합니다. 간단한 코드를 작성할 때라던가, 쉘과 결합해서 사용해야 할 때라면 더더욱 그러하지요. 이미 세상에는 훌륭한 원라이너 문서가 많은데 이를 반복한다면 무척 지루한 일이겠죠. 대신 Ruby로 만든 GitHub 블로그 툴인 Octropress를 Perl 원라이너로 살짝 흉내어 Perl 원라이너를 어떻게 쓸 수 있는지 살펴보겠습니다.

6.3. Day 3 - 셋째 날: 소스코드 감쪽같이 숨기기 by aanoaa

Perl 코드를 실행할 수 있다는 것은 소스 코드도 읽을 수 있다는 것을 뜻합니다. 하지만 단 몇 줄의 Perl 코드로 여러분의 코드를 감쪽같이 숨길 수도 있습니다.

6.4. Day 4 - 넷째 날: Thrift 이리저리 둘러보기 by dalinaum

많은 애플리케이션은 프레젠테이션 레이어와 핵심 로직의 언어를 분리하고 있습니다. 트위터의 경우에는 핵심 로직을 스칼라로 처리하며 프레젠테이션 부분을 루비 언어로 처리합니다. 안드로이드 플랫폼은 프레젠테이션 레이어를 자바와 XML 파일로 구성하며 성능이 중요한 부분은 C와 C++ 언어를 사용하고 있습니다. 앞으로 소프트웨어 개발에 더 다양한 언어의 조합이 등장할 것을 어렵지 않게 예상할 수 있습니다. 펄 언어 만으로 되어 있는 단일한 환경에서는 모듈과 함수 호출로 대부분의 일을 해결할 수 있습니다. 하지만 기존의 방법으로 다양한 언어를 사용한 다채로운 개발 환경을 구성하는 것은 쉽지 않습니다.

Thrift는 페이스북이 개발한 규모 가변적인(scalable) 이종 언어 서비스 개발을 위한 소프트웨어 프레임워크입니다. 이 프레임워크는 2007년에 페이스북에 의해 개발되기 시작하여 2008년 이후 아파치 재단이 유지 보수를 맡고 있습니다. Thrift는 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Javascript, Node.js, Smalltalk, OCalm 언어 등 다양한 환경을 지원하고 있습니다. 우리가 사용하는 Perl 언어를 비롯해 학계나 산업계가 주목하는 언어들의 대부분을 지원하고 있는 셈입니다. 이렇게 Thrift를 이용하면 다양한 환경의 소프트웨어를 쉽게 결합할 수 있습니다.

6.5. Day 5 - 다섯째 날: NCBI PubMed와 Perl by ascendox

NCBI는 National Center for Biotechnology Information의 약자로 생명 과학 및 의학 관련 학술 포탈 사이트(그림 1)입니다. NCBI는 미국 보건성 산하의 국립 의학 도서관의 운영 분야중 하나로, 생명정보학 전담부서로 컴퓨터를 이용하여 DB를 구축하고 분석도구를 개발하는 것이 주요 임무입니다. 흔히 BLAST로 알려져 있는 이 사이트는 의학 생명 과학 논문 인덱스 데이터 베이스와 유전체 서열 데이터베이스 등 각종 생명 공학 정보들을 담고 있으며 이와 관련있는 분석도구를 보유하고 있습니다.

 그림 1. NCBI 홈페이지 (원본)

또한 생물학적으로 중요한 분자의 구조와 기능을 분석하기 위한 컴퓨터 정보 처리 기술 연구와 수학적, 전산학적 방법을 사용한 생물학 및 의학적 문제의 분자 수준에서의 연구, 분자생물학, 생화학, 유전학에 대한 지식을 저장, 분석하기 위한 자동화 시스템 개발, DB와 S/W 개발, 생명공학 기술 정보 수집, 연구소, 학회, 산업체, 정부 기관 등과의 협력, 과학적 정보교환 강화, 전산생물학의 기초 및 응용 연구 훈련 지원, 다양한 데이터베이스와 소프트웨어의 사용 지원, 데이터베이스 데이터 축적 및 교환, 생물학적 명명법의 표준 개발 등의 활동을 수행하고 있습니다. 나열한 이 모든 정보는 Entrez라는 포탈 검색 엔진을 이용해 검색할 수 있습니다.

6.6. Day 6 - 여섯째 날: 초소형 프레임워크와 함께 춤을 by am0c

웹사이트 개발 패러다임도 계속 변하고 있습니다.

CGI가 쌘 놈이었던 때도 있었다고 합니다. 물론 CGI는 이미 흘러간 물입니다. 몇 년 전에는 철도 위에 놓인 루비가 붐이었죠. 지금은 웹 클라우딩뇨인지 클라우드인지 하는 플랫폼 서비스 사업이 일어나고 있습니다.

저는 웹 개발자도 아니고 HTML5를 어서 만져보고 싶어하는 덕후도 아니기 때문에 이런 패러다임에 대해 시시각각 논하지는 못합니다만, 취미로 만든 서비스가 완성되면 보기 좋기 운영하거나 외부에 공개허거나 인터페이스를 제공하고 싶게 되고, 그러다보면 어쨌든 웹 서비스 개발에 직면하게 됩니다.

6.7. Day 7 - 일곱째 날: 윈도우 환경에서 화면 캡쳐 후 자동 저장 기능의 구현 by owl0908

이것저것 스크린샷이 포함된 글을 쓰실 때, 대개 어떻게 하시나요? Shift + PrtSc 키를 이용하면 현재 화면을 쉽게 클립보드에 저장할 수 있습니다. 이렇게 클립보드로 저장된 이미지는 어디서든 Ctrl-V 로 붙여넣기를 할 수 있죠. 그러나, 스크린샷이 파일 형태로 필요하다면 어떨까요? 이미지 편집 프로그램을 실행시킨 다음, 붙여넣기를 한 후, 저장을 해야 합니다. 서너장이 아니라 수십 수백장의 화면을 갈무리해야 한다면 일일이 이렇게 저장하는 것은 너무 힘든 일입니다. 스크린샷을 찍으면 자동으로 알아서 파일로 저장까지 해주면 딱 좋을 것 같지 않나요? 자, 시작해보죠. :-)

6.8. Day 8 - 여덟째 날: FormNa게 Form 생성하기 by mintegrals

부제 : 가변데이터에 대해 문서 자동으로 생성하기

생활하다보면 특정한 문서 틀이 필요할 때가 있습니다. 그럴 때 우리는 '서식 파일', '보고서 양식'을 검색하곤 합니다. 그리고 적당한 틀이있는 파일(주로 DOC 또는 HWP)을 다운받은 후 특정 위치에 원하는 내용을 내용을 채워넣습니다. 이렇게 양식 파일을 다운 받는 것은, 일정한 틀은 유지하면서 데이터만 변경해서 문서를 만들어야 할 때가 많기 때문입니다. 일상 생활의 예를 들면 마트에서 주는 영수증부터, 회사의 거래내역서, 이력서, 주소록, 월급 명세서 등 다양합니다. 이러한 보고서 서식(form)을 제공하는 사이트로 국내에는 비즈폼이나 예스폼 등이 있습니다. 하지만 이런 사이트에서 제공하는 파일을 이용하면 한계가 있습니다. 한 두장 정도는 어떻게든 만들 수 있겠지만 주기적, 정기적으로 바뀌는 내용을 갱신해야 한다거나, 많은 양의 자료를 바꿔가며 뽑아내야 한다면 현실적으로 무리가 있습니다. 바로 이때 Perl과 ODF를 사용하면, 이러한 Form들을 FormNa게 찍어낼 수 있습니다.

6.9. Day 9 - 아홉째 날: Youtube에서 원하는 동영상 내려받기 by eeyees

우리는 일상에서 많은 문제에 직면하게 됩니다. 이런 문제들을 빠르게 해결할 수 있는 스크립트 언어를 한가지쯤 알고 있다면 그것은 굉장한 행운일 것입니다. 저는 Perl을 통해 자잘한 문제들을 해결하고 있습니다. 지금부터 최근에 제가 겪은 문제를 Perl과 CPAN을 이용해서 어떻게 빠르고 쉽게 해결하는지 보여 드리도록 하겠습니다.

6.10. Day 10 - 열번째 날: GuiTest를 활용한 네이트온 원격제어 자동 수락기 by perlstudy

저는 자동화 도구에 관심이 많습니다. 자동화 도구는 직접 해야하는 작업이나 단순한 반복 작업을 자동으로 처리할 수 있게 도와줍니다. 작년에는 Advent Calendar 기사에서 WWW::Mechanize 모듈을 통한 웹 자동화 방법에 대해 소개했습니다. 오늘은 Windows에서 유용하게 사용할 수 있는 테스트 자동화 모듈을 소개해 볼까합니다.

자동화 기술로써 가장 먼저 떠오르는 것 중 하나는 후킹(hooking)일 것입니다. 후킹이란 메시지나 이벤트를 중간에 가로채거나 가로챈 이벤트를 임의로 바꾸는 기술입니다. 후킹을 통해 컴퓨터에서 일어나는 일을 마음대로 조정할 수 있습니다. 이 기술을 완벽하게 사용하기 위해서는 많은 노력이 필요합니다. Win32 API부터 Windows의 내부 동작 원리까지 상세하게 공부해야 합니다. 이런 덕목들은 Windows 프로그래머에게는 기본 소양으로 여겨지겠지만 단지 활용하고 싶은 사람들에게는 하늘에 별 따기일 수 있습니다.

2005년 Perl 진영에 Windows에서 다양한 GUI 테스트를 쉽게 할 수 있는 Win32::GuiTest - Perl GUI Test Utilities 모듈이 나왔습니다. 문서나 소스로만 공개되어 실제로는 사용하기 까다로운 자동화 기술이 모듈로 제공되어 많은 이들이 쉽게 자동화할 수 있도록 도왔습니다. 이 모듈을 처음 발견 했을 당시 깜짝 놀랐습니다. 이렇게 쉽고 간단하게 자동화를 할 수 있다니! 그 후로 이 모듈은 저의 최고의 장난감이 되어 크고 작은 자동화 부분을 획기적으로 처리하는 일등공신이 되었습니다. 그럼 지금부터 Win32::GuiTest를 사용해봅시다!

6.11. Day 11 - 열한번째 날: 리눅스와 Gnome, 노틸러스, GE.TT, Perl by keedi

리눅스가 무엇인지 더이상 설명하지 않아도 되는 세상이 되었습니다. 불과 십 몇년 전까지만 해도 리눅스가 무엇인지, 왜 리눅스를 써야하는지 구구절절 설명하기 바빴는데 말이죠. 오랜 시간동안 리눅스는 서버 뿐만 아니라, 데스크탑 영역에서도 괄목할 만한 성장을 이루었습니다. Gnome과 KDE 두 진영은 놀랍게도 리눅스 태초부터 지금까지 대단한 뚝심으로 프로젝트를 개선시켜나가며 이어오고 있습니다. 그 중에서도 Gnome 데스크탑의 파일 관리자인 노틸러스는 Gnome 데스크탑의 기본 뼈대가 되는 부분이라고 해도 과언이 아닙니다. 노틸러스는 단순히 파일을 관리한다는 차원을 넘어 파일과 관련해 눈에 보이는 모든 것(그것이 로컬 자원이든, 원격 자원이든)을 제어합니다. 심지어 바탕화면과 바탕화면에서 보이는 파일조차도 말이죠. 따라서 노틸러스에 원하는 기능을 연동할 수 있다면 그 편의성은 상상 그 이상이라고 할 수 있습니다.

 그림 1. GE.TT (원본)

GE.TT는 Dropbox와 유사한 서비스로 파일을 저장하고 공유할 수 있는 클라우드 서비스입니다. 이미 Dropbox를 사용해보신 분이라면 알겠지만 특정 디렉터리에 파일을 저장하면 자동으로 원격의 저장소와 동기화가 됩니다. 이런 작업도 사실 노틸러스와의 연동으로 구현한 것이죠. Gnome 데스크탑 환경에서 GE.TT 서비스를 연동해 마우스 클릭 두 번으로 파일을 업로드하고 공유하는 것이 얼마나 쉬운지 궁금하지 않나요? 그리고 이 모든 작업의 가운데는 Perl이 있다는 사실에 곧 놀라게 될 것입니다. :)

6.12. Day 12 - 열두번째 날: 웹툰을 한 눈에 내 만화 프로젝트 Manaba by rumidier

바쁜 일상 속에 웹툰은 한줄기 빛과 같습니다. 하지만 즐겨 보는 웹툰을 어디까지 봤는지 일일이 기억하기는 어려운 일이죠. 일일이 웹툰 홈페이지에서 가서 열람하면 되는 일이긴 하지만, 그렇게 대놓고 화면을 띄우고 보기에는 사장님 눈치가 보입니다. 최신 웹툰이 나왔는지 오매불망 뒤적거리다보면 돌아오는 것은 사나운 눈초리... 누구보다 빠르게 남들과는 다르게 웹툰을 보고 싶다는 마음(네, 사실은 귀찮아서 입니다)을 가지고 만화를 보려면 어떻하면 좋을까요?

6.13. Day 13 - 열세번째 날: How to Use CPAN, Actually by y0ngbin

어떤 사람들을 Perl을 좋아합니다. 어떤 사람들은 Perl을 그다지 좋아하지 않습니다. 하지만 여러분이 어느쪽이든 상관없이 어떤 작업을 해야하는 상황이라면 여러분이 필요한 무언가는 CPAN에 이미 존재할 확률이 매우 높습니다. CPAN은 단일 언어 공개 라이브러리 저장소 중에서 가장 큰 규모와 긴 역사, 튼튼한 커뮤니티를 가지고 있고, 지금 이 순간에도 그들만의 방식으로 계속 발전해 나가고 있기 때문입니다.

심지어 어떤 사람들은 Perl을 CPAN을 사용하기 위한 도구라고 지칭할 정도로 Perl과 CPAN은 밀접한 관계를 맺고 있습니다. 하지만 실제로 CPAN을 충분히 활용하려면 책에서 다루는 내용을 익히는 것만으로는 조금 부족할 수 있습니다. 오늘은 우리가 실제로 CPAN을 사용하고자 할 때 알아야 할 내용을 실용적인 관점에서 소개하겠습니다.

이 글에서 대문자 CPAN은 Perl의 CPAN 저장소를 지칭하고 소문자 cpan은 CPAN을 사용하기 위한 CPAN 공식 프로그램을 지칭합니다.

6.14. Day 14 - 열네번째 날: 크리스마스 애인 만들기 by nving

크리스마스가 다가오는 12월입니다. 커플 당원들은 크리스마스다 뭐다 신나고 설레이겠지만 만년 솔로인 필자는 춥고 배고플 뿐입니다. (하지만 25일이 일요일인 점은 덜 외롭습니다. 조금은 신납니다.)

매년 크리스마스마다 혼자 집에 처박혀 은둔 생활을 오래 하다보니 이제 어머니께서 상대도 안해주십니다. 네, 그렇습니다. 이제는 혼자서도 잘 노는 아이가 되어야 합니다! 이런 우리(?)를 위해 이쪽 분야의 선진국 일본에서는 일찍부터 솔로들이 방황하지 않고 컴퓨터와 함께 놀 수 있는 물건을 개발해왔습니다.

바로, 나니카입니다!

 그림 1. 귀엽고 사랑스러운 우리의 나니카

6.15. Day 15 - 열다섯번째 날: 한 이미지 안에 들어있는 사진들 추출하기 - Prima 모듈 by gypark

오래 전 있었던 일입니다. 우연히 다음 그림과 같은 사진 파일을 보게 되었습니다.

 그림 1. 여러 사진이 포함된 하나의 이미지

하나의 JPEG 사진 파일 안에 사진 세 장이 합쳐져 있는데 이게 모니터에 다 들어오지 않아 보기에 불편하더랍니다. 그래서 저 안에 있는 사진 세 장을 각각 별도의 파일로 저장하고 싶어졌습니다.

위와 같이 사진이 세 장 뿐이면 그림판에서 영역 지정해 저장하면 됩니다. 하지만 파일 하나에 사진이 수십 장 들어있다면, 그리고 그런 파일이 또 수십 개나 있다면 정말 골치아픈 일이 될 것입니다. 이것을 자동으로 할 수 없을까 궁리해 보았습니다.

6.16. Day 16 - 열여섯번째 날: perlbrew, local::lib, smartcd 를 이용하여 Perl 환경 구축하기 by corund

Perl은 하위 호환성이 좋고 cpan이라는 막강한 툴이 있기 때문에 특별히 버전이나 모듈들을 관리할 필요가 많진 않습니다. 하지만 일반에게 서비스할 웹 서비스를 개발하거나 따로 배포할 프로그램을 개발한다면 특별히 버전과 모듈들을 관리할 필요가 있습니다. 또한 아직 사용중인 운영체제 배포판에서 공식 지원하기 전의 최신 Perl을 실험해 보고 싶은 경우도 있습니다. Linux나 OSX을 쓴다면 이럴 때 perlbrew(CPAN의 App::perlbrew 모듈)와 local::lib를 이용해 버전과 모듈들을 따로 관리할 수 있습니다. 덧붙여 smartcd와 같은 bash 유틸리티를 이용하면 이를 더욱 편리하게 이용할 수 있습니다.

6.17. Day 17 - 열일곱번째 날: DBIx::Class 의 지속적인 Schema 관리를 위해서 by JEEN_LEE

저는 회사 업무에서 펄의 대표적인 프레임워크인 Catalyst를 사용하고 있습니다. 그 중에서 여느 튜토리얼 문서에서의 기본 구성이라고도 할 수 있는 Catalyst + Template Toolkit + DBIx::Class 구성으로 사용합니다. 언제나 개발의 시작은 어떤 데이터를 '어떤 구조로 유지'하며 '어떻게 사용하게끔 하느냐'하는 틀을 만드는 것이려나요? 제 생각에는 그렇지 않을까 합니다.

하지만 처음에 생각해서 마련한 틀은 시간이 흐름에 따라, 개발자 본인의 욕심에 따라, 갑이나 경영진의 변덕스러운 요구사항에 따라 바뀌기 마련일 겁니다. 이런 과정에 있어서 DBIx::Class의 이용에 몇가지 룰을 정하고 그걸 유지하면 스트레스 덜 받는 행복한 스키마 관리가 이뤄지지 않을까 생각합니다.

6.18. Day 18 - 열여덟번째 날: 펄과 아두이노(Arduino) 가지고 놀기 by ja3ck

저는 어려서부터 레고나 과학상자류를 가지고 노는 것을 좋아했습니다. 다 자란 지금도 무언가 만드는 것을 좋아합니다. (하지만 현실은 행거도 제대로 설치 못해서 30분 동안 낑낑)

소프트웨어를 전공하게 된 당시에도 하드웨어를 제어하는 일에 흥미를 가지고 있었습니다. 그러다보니 임베디드를 다루는 회사를 다니며 다양한 경험을 쌓게 되었고, 아두이노를 접하게 되었죠. 하지만 그동안 여가를 즐기기에는 너무나 더럽게 바쁜 SI에 매달려 있었습니다. 구입해 놓고 오랫동안 잠재웠던 아두이노가 불쌍해보여 다시 한 번 꺼내들어 봅니다.

6.19. Day 19 - 열아홉번째 날: Perl Tatsumaki로 비동기 웹 서비스 구축하기 by luzluna

비동기 웹서버의 유행들을 따라 펄에도 비동기 웹서비스를 제공할만한 좋은 방법들이 몇 가지 생겼습니다. 그 중 Tatsumaki는 Tatsuhiko Miyagawa씨께서 Tornado를 펄 버전으로 새로 구현한 프레임워크입니다.

비동기 웹서버에 대해 부정적으로 생각하지만(Larry Wall의 표현을 빌어 표현하자면 "Not For Human"), 웹 상에서 채팅이나 메신저같은 Long Polling 서비스를 구현하려면 마땅한 다른 방법도 없으니... 필요하면 배워야겠죠. ㅜ.ㅠ

6.20. Day 20 - 스무번째 날: Mojolicious, HTML5, WebSocket을 이용한 비동기 채팅 by eeyees

우리는 지난 기사에서 카탈리스트, 댄서와 같은 웹 프레임워크를 볼 수 있었습니다. 제가 소개시켜 드릴 것은 Mojolicious라는 웹 프레임워크입니다.

Mojolicious는 실시간 웹 프레임워크를 표방하고 있습니다. 그 외에도 멋진 특징들이 많이 있습니다. 공식 사이트에서는 아래와 같이 소개하고 있습니다.

오늘은 가볍게 Mojolicious를 이용해 Websocket으로 비동기 채팅하는 소스 코드를 살펴봅시다.

6.21. Day 21 - 스물한번째 날: Perl로 시스템 트레이딩하기 by saillinux

오늘은 Perl을 이용해 아주 간단한 시스템 트레이딩을 해볼까 합니다. 조금 생소한가요? :) 소개하는 내용을 기반으로 자신만의 트레이딩 시스템 구축을 위한 프레임워크를 구현하는 것이 이번 기사의 목적입니다. 하지만 지금부터 다룰 내용은 목적은 실제 수익이 아니라 시스템 트레이딩 입문을 위한 설명인만큼, 혹시라도 생길 수 있는 불이익에 대한 책임은 지지 않는다는 것 꼭 기억해두세요! ;-)

6.22. Day 22 - 스물두번째 날: Perl, 오늘 급식은 뭐야? by cheese_rulez

학교 생활을 하다보면 신경 쓰이는게 많습니다. 예를 들면, 옆자리의 예쁜 여자아이, 2학년의 예쁜 선배, 동아리의 마음씨 곱고 짱 예쁘신 3학년 선배님이 있습니다. 음, 그렇습니다. 사실 현실의 학교에서 그럴 일은 없습니다. 이렇게 신경쓰고 싶은 것도 얼마 없는 지루한 학교 생활에 유일하게 활기를 불어넣어주는 건 당연 급식입니다. 4교시를 마치는 종소리가 울리면 당번들은 발에 부스터라도 달린 듯 급식차를 가지러 뛰어나가고, 우리는 가슴을 조아립니다. 그 두근거림을 두 배로 UP 해주는 것은 바로 급식 안내장! 하지만 저희 학교는 그런걸 나누어주지 않습니다. 슬픕니다. 다행히도 학교 홈페이지에 영양사 선생님께서 꾸준히 급식 정보를 올려주지요! 하지만 문제가 있었으니... 메뉴가 플래시입니다.

그림 1. 안녕, 나는 플래시. (원본)

친구가 던져준 아이팟으로는 확인도 못한단 말이에요. 하지만 방법이 있습니다. 우리에겐 Perl이 있으니까요!

6.23. Day 23 - 스물세번째 날: Perl로 타자연습을! by 1985xmas

대학원 입학 후 Perl을 처음 접하고 Perl에 완전히 반해 블로그에 Perl 강좌를 올리기 시작했습니다. 아직 부족한 점이 많은 제 블로그에 감사하게도 @am0c님께서 방문해주셨고, Perl 크리스마스 달력 기사 제의를 해 주셨습니다. 다른 분들에 비해 실력면에서나 경험면에서나 부족한 제가 과연 제대로 된 기사를 쓸 수 있을까 하는 걱정이 들었지만 용기를 내어 이렇게 기사를 쓰게 되었습니다.

오늘 함께 만들어볼 프로그램은 타자 연습 프로그램입니다. 화면에 타자 연습 문장을 띄워주고 사용자가 그 문장을 따라 입력하면 타자 속도와 정확도, 연습 시간을 계산해 보여주며 어느 위치에서 오타가 났는지도 알려줍니다. 연습하고 싶은 문장 파일은 사용자가 직접 선택할 수 있습니다. 프로그램을 종료하게 되면 평균 속도와 평균 정확도, 총 연습 시간을 출력해줍니다.

영문 타자를 연습하도록 프로그램을 만든 상태지만 멀티바이트 문자 지원을 추가하면 수 많은 언어로 타자연습을 할 수 있을 것입니다. 그러면 이제 본격적인 설명에 들어가도록 하겠습니다!

6.24. Day 24 - 스물네번째 날: Perl 생태계 가이드 by aer0

23일 동안 열혈 서울 펄 몽거스를 위시한 많은 펄 몽거들이 푸짐한 선물 보따리를 풀어놓았습니다. 관심을 가지고 지켜보신 분들이라면 Perl의 새로운 모습을 느꼈으리라고 생각합니다. Perl은 과거 웹 프로그래밍이라면 CGI로 인식되던 시대에 잘나가던 시절이 있었습니다. 하지만 PHP의 등장으로 CGI로 웹을 만들던 사람들이 PHP로 넘어가게 되었고 그 후 Python, Ruby 같은 언어들이 인지도를 높혀가면서 Perl은 상대적으로 시야에서 멀어진 언어로 인식되어 왔던게 사실입니다. 그와 함께 훈련되지 않은 프로그래머들이 양산해놓은 많은 스파게티 CGI 코드들로 인해 유지보수가 힘들다는 근거 없는 루머에 시달리기도 했죠. 하지만 Perl은 유행과 시류에 휘둘리지 않고 조용히 안정성을 추구하며 함께 새로운 기술들을 받아들이면서 꾸준히 발전해 왔으며 2009년경 부터 이른바 Modern Perl이라는 움직임이 일어나 다시금 중흥기를 맞고 있습니다. 이 글은 그 동안 Perl이 변화한 모습을 설명할 것입니다. 또, Perl을 새롭게 접하고자 하거나 다른 언어 사용자의 입장에서 Perl을 접하고자 할 때 어떤 과정을 통해 Perl에 익숙해질 수 있는지 설명할 것입니다. 마지막으로, 원하는 바를 구현하려고 할 때 어떤 기술을 사용할 수 있는지 Perl 생태계에 대한 총체적인 가이드라인을 제시할 것입니다.

7. 2010년

7.1. Day 1 - 첫째 날: MS Windows에서 Perl 활용하기 by aer0

Perl이라면 유닉스/리눅스를 떠올리는 분들이 많겠지만 Perl은 프로그래밍 언어들 중에서도 아주 많은 플랫폼에 포팅되어 있는 언어 중 하나입니다. 오늘은 보통 데스크탑으로 많이 쓰는 윈도우즈에서 Perl활용 예를 보여 드릴까 합니다.

윈도우즈용 Perl은 과거부터 Activestate에서 만들어서 배포하는 Activestate Perl과 오픈소스 프로젝트로 진행되고 있는 Strawberry Perl이 대표적입니다. 여기서는 make와 gcc 컴파일러등을 내장해 cpan 유틸리티를 그대로 활용할 수 있고 개인적으로도 선호하는 딸기 펄(Strawberry Perl)을 사용합니다.

7.2. Day 2 - 둘째 날: Net::Google::Calendar 를 이용한 무료 SMS알림이 만들기 by ainvyu

컴퓨터를 하는 사람이라면 긴 시간이 걸리는 작업을 걸어놓고 딴짓을 하거나 컴을 켜놓고 잠드는 경험을 한번쯤을 해봤을 것이다. 이때 작업이 끝날때를 맞춰 알람이 울리거나 Growl 같은 것을 이용해 notify 를 날리게 만들면 언제까지고 끝나기를 기다리는 일은 없을 것이다. 이런 것을 요즘 같은 때는 시대의 첨단을 달리는 MUST HAVE 아이템! 스마트폰을 가지고 있는 유저라면 이메일이나 트위터를 이용해서 쉽게 알림을 받을 수 있다.

하지만 스마트폰이 없다면?

지금부터 스마트폰이라는 문명의 이기를 거부한(?) 피쳐폰 사용자용 무료 SMS알림이를 만들어보자. 시중에는 SMS를 이용한 알림 서비스가 존재하지만 개인 서비스에 비용을 지불하고 쓰긴 아깝다. 건당 내야되는 돈이 은근히 부담된다. 그러나! 구글 캘린더 SMS 알림 서비스를 이용하면 비스무리한 서비스를 무료로 간단히 이용할 수 있다.

7.3. Day 3 - 셋째 날: File::Map을 이용한 메모리맵 파일 접근 by keedi

Perl로 텍스트 파일을 처리하는 것은 일상적인 일입니다. 하지만 대용량 파일을 다뤄야 할 때는 어떻하시나요? 물론 Perl은 내재된 한계 따윈 없는 멋진 녀석이긴 하지만 우리의 시스템은 메모리라는 한계를 가지고 있습니다. 대용량 파일을 그것도 순차적이 아니라 임의의 위치에 접근해야 한다면, 그리고 심지어 값을 변경하기까지 해야한다면 조금은 다른 방법으로 스크립트를 작성해야 할 것입니다.

7.4. Day 4 - 넷째 날: 선물 세 가지 :-D by gypark

이 글에서는 범위연산자(range operator) ..와 ...가 스칼라 문맥에서 사용될 때의 동작, 현재 개발 중인 Perl 5.14 버전에서 정규표현식에 새롭게 추가되는 플래그, 트위터 계정에 글을 올리는 스크립트를 만드는 데 쓸 수 있는 모듈 하나를 소개해 드리고자 합니다. 도움이 되었으면 좋겠습니다.

7.5. Day 5 - 다섯째 날: 윈도우즈 환경에서 Perl은 어디에 써먹을 수 있을까? by crowdy

Perl이 좋다고는 하지만, 여러분이 다음과 같은 상황이라면 Perl이 그다지 매력이 없을지도 모릅니다. 윈도우즈를 사용하며 명령줄(cmd)에서 명령하기를 그다지 즐기지 않는다면... 윈도우즈를 사용하는데 입력을 매개변수로 전달하거나 파일로 한다면... 윈도우즈를 사용하는데 출력까지도 콘솔이나 파일에 한다면...

여기에 "윈도우즈라면 Perl을 이렇게 사용할 수도 있다!"에 대한 내용으로, 다음과 같이 3가지 질문에 대한 나름대로의 답변 형식으로 정리해 보았습니다.

7.6. Day 6 - 여섯째 날: 나만의 E-Book으로 따뜻한 크리스마스를! by eeyees

추운 겨울은 이제 싫어! 언제나 내곁에 있는 레이싱걸들과 함께 따뜻한 크리스마스를!

Perl의 다양한 모듈을 이용하여 임의의 DCINSIDE 갤러리에서 원하는 사진을 추출 그리고 EPUB으로의 변환을 통해 E-book으로 만드는 과정을 소개 할까 합니다. 스크립트는 이미지 추출 스크립트와 EPUB 생성 스크립트로 따로 나누며 레이싱걸 갤러리를 이용합니다.

7.7. Day 7 - 일곱째 날: 매일매일 네이버 카페 출석 체크하기! by perlstudy

현재 저는 운영하고 있는 네이버 Perl 카페외에도 인터넷상의 많은 카페에 가입해서 활동을 하고 있습니다. 꼭 프로그래밍에 관련된 카페 뿐만 아니라 자격증, 게임, 한예슬 팬클럽 등등 다양한 분야의 카페에 가입해서 원하는 정보를 얻고있으며, 사람들과 교류하는 것을 즐깁니다.

하지만 자신있는 분야가 아닌 경우, 괜시리 소심해져 글하나 못쓰고 눈팅만 하게 되는데 그래도 카페 사람들과 친해지기 위해서는 적극적인 활동을 해야합니다. 이 때 가장 만만한 활동이 바로 출석 체크인데 매일 꾸준하게 출석체크를 하는 것만으로 커뮤니티 사람들에게 인정을 받을 수 있으며 카페에 인지도 있는 사람으로 거듭나기도 합니다.

하지만 사람은 컴퓨터가 아니기 때문에 가입한 수많은 카페에 하루하루 출석 체크에 신경쓴다는 것은 굉장히 소모적일 뿐만 아니라 심하면 스트레스까지 유발됩니다. 하지만 게으른 우리에겐 Perl이 있죠! 몇 줄 되지 않는 간단한 Perl 코드를 이용하면 가입한 수많은 네이버 카페에 출석하는 것 쯤은 간단하게 처리할 수 있답니다. :)

7.8. Day 8 - 여덟째 날: 산간오지 청년의 '작은 CPAN' 이야기 by JEEN_LEE

이번 주 금요일을 기해 도쿄에서 잠깐 동안 떠나 집으로 가게 되었습니다. 당연히 집에서는 "아이고 우리 막내 왔나~" 하면서 반겨주겠지만, 저는 일거리를 싸매고 집으로 가야할 형편이네요. 집에 가서 소 매니큐어 발라주고, 저녁에는 맥북을 열어 일거리를 해치워야 하는 현실, 인터넷 연결이 원활하지 못하다는 전제를 깔아두고, 오프라인 환경에서의 개발환경 준비를 서두르기로 했습니다.

7.9. Day 9 - 아홉째 날: 두렵기만 한 정규표현식은 가라!! by luzluna

정규표현식! Perl을 처음 배우기 시작할때 가장 넘어서기 어려운 벽중 하나가 정규표현식입니다. 다른 언어에선 문자열 제공하는 문자열 함수의 대부분은 Perl에서 정규표현식으로 충분히 처리할 수 있기 때문에 Perl의 강력한 문자열 처리능력을 발휘하려면 정규표현식을 익혀야만 합니다. 또한 정규식을 한번 잘 익혀두면 꼭 Perl이 아니라 하더라도 PCRE(Perl Compatible Regular Expressions)와 같은 라이브러리에서도 정규표현식을 쓸 수 있으므로 편리합니다.

하지만! 역시 정규표현식은 어렵죠...

올해 Perl 크리스마스 달력를 여는 첫 번째 글에서는 정규표현식을 쉽게 배울 수 있도록 도와주는 멋진 도구가 소개하고 있습니다. 간단하게 이 기사를 번역해서 소개하는 수준으로 기고하려 했지만 너무 날로먹는 것 같아 양심의 가책을 느껴 평소 사용하는 팁 몇 가지를 같이 소개하겠습니다.

7.10. Day 10 - 열번째 날: Everything is better with perl by aer0

7.11. Day 11 - 열한번째 날: Fey, Fey, Fey by y0ngbin

12월 커플들이 즐비한 시내 한복판을 헤쳐나가는 것 만큼이나 짜증나는 일이 한가지 있다면 그것은 SQL을 다루는 일입니다. 태초부터 인간과 함께하고 있는 바퀴벌레처럼 아주 오래전부터 SQL과 함께 지내고 있지만 대부분의 개발자들에게 SQL은 바퀴벌레만큼이나 별로 환영받지 못하는 것 같습니다.

사실 저는 SQL을 아주 좋아합니다. 물론 SQL에는 제가 마음에 들지 않는 면도 많이 있고, 어떤 이는 SQL이 잘못 설계된 언어라는 의견을 피력하기도 하지만 SQL은 이미 그 자체로서 충분한 표현력을 가지고 있기 때문에 자신의 의사를 시스템에 전달하는데 크게 부족함이 없다고 생각합니다.

그런데도 사람들이 SQL을 싫어하는 것은 SQL 그 자체가 싫다기 보다 SQL을 사용하는 프로그램을 작성할 때 프로그램과 어울리지 못하는 거대한 SQL 문자열 덩어리 때문이 아닐까 조심스레 추측해봅니다.

7.12. Day 12 - 열두번째 날: 나의 Catalyst 답사기 by JEEN_LEE

회사에서 주로 사용하는 웹 어플리케이션 프레임워크는 Catalyst(CPAN의 Catalyst 모듈)입니다. 회사에서 커스터마이즈를 거치고 거친 기존 프레임워크가 있었지만, 3-4년 이상 방치되어 지속적 관리의 어려움도 있는 바, 작년부터 시범적으로 사내서비스 위주로 Catalyst를 사용하기 시작했고 올해부터는 대부분의 웹서비스 개발을 Catalyst 기반으로 진행하고 있습니다.

하지만 회사에서 저 혼자 Catalyst를 사용한 웹 개발을 하는 것이 아니기에, 각각 다른 이가 프로젝트를 진행함에 있어서 공통적으로 지켰으면 하는 규칙이 있었으면 했습니다. 그래서 오늘은 이 규칙에 대해 다뤄보고자 합니다.

7.13. Day 13 - 열세번째 날: use me2day by dalinaum

이번 글의 목표는 펄을 사용해서 미투데이를 사용하는 겁니다. 다 아실 것 같지만 미투데이를 모르는 분도 있을테니 설명이 필요할 것 같네요. 미투데이는 일상 생활에 소소한 기록을 한줄로 남기는 서비스에요. 여러 친구와 일상을 공유하고 공감을 하면 미투 버튼을 눌러 공감의 표현을 하는 서비스입니다.

이제 미투데이는 다 아셨으니깐 미투데이 사용으로 넘어가야죠. 사용에는 여러가지 의미가 있는데 지금은 글을 쓰는 것만으로 한정지을거에요. 미투데이의 모든 기능을 다 만드는 것은 지금 당장 필요하지도 않고 가능하지도 않다고 봐요. (API로 공개되지 않은 기능도 있으니까요.) 쓰기가 있으니깐 읽기도 있으면 좋겠죠? 아쉽지만 읽기 기능은 과제로 둘께요.

7.14. Day 14 - 열네번째 날: Perl로 하는 함수형 프로그래밍 by corund

물론 Perl은 함수형 언어는 아닙니다. 함수형 프로그래밍에서 중시하는 부수효과(side effect)가 없는 함수를 사용하도록 강제할 수도 없습니다. 하지만 함수형 언어에서 사용하는 여러 개념들이 구현되어 있어서 함수형 프로그래밍 방식을 사용할 수 있습니다. 여기서는 그 중 몇가지를 보여보겠습니다.

7.15. Day 15 - 열다섯번째 날: XML-RPC 프록시 서버 by aanoaa

HTTP 메세지는 크게 header와 entity-body부로 나뉩니다. entity-body가 XML로 되어 있는 POST 요청이 있을때 적절한 XML로 응답하면 이를 XML-RPC 스타일 아키텍처를 사용하는 웹서비스라고 합니다.

안드로이드 같은 모바일기기에서 XML-RPC와 같은 서비스를 이용하면 요청과 응답에 대한 생짜 XML 문자열을 눈으로 확인하는 것은 어려운 일입니다. 다음 명령을 이용하면 어느정도 필터링이 가능은 합니다.

$ adb logcat <filter>

이렇게 실행할 경우 출력은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?><methodCall><methodName>method_name_here</methodName><params><param><value><string>yours susan</string></value></param></params></methodCall>

하지만 XML 데이터를 들여쓰기하지 않기 때문에 직접 눈으로 읽기에는 여전히 어려움이 있습니다. 다음처럼 들여쓰기한 XML 결과물을 볼 수 있다면 디버깅하기 더 수월하지 않을까요?

<?xml version="1.0" encoding="utf-8"?>
<methodCall>
    <methodName>method_name_here</methodName>
    <params>
        <param>
            <value>
                <string>yours susan</string>
            </value>
        </param>
    </params>
</methodCall>

7.16. Day 16 - 열여섯번째 날: use Android; by elixir_

요즘 길거리를 돌아다니다 보면, 많은 분들이 스마트폰을 들고 계시더군요. 스마트폰 해커로써 더 많은 사람들의 정보를 캐낼 수 있다는 것이 즐겁지만(?), 다함께 손에 손잡고 경찰서에 가긴 저도 싫고 여러분도 싫으실테니... 오늘은 (건전하게) 자신만의 Android 앱을 Perl로 쉽게 만드는 방법을 익혀봅시다!

7.17. Day 17 - 열일곱번째 날: HTTP 패킷을 까보자 by luzluna

XML이나 JSON을 사용하는 프로그램을 작성하다보면 클라이언트에서 어떻게 보냈을 때 서버가 어떤 값을 보내주는지 눈으로 봐가면서 프로그램을 작성하면 좀더 쉬울 때가 있습니다. 이런 경우 브라우저에 Firebug 같은 브라우져 플러그인을 설치해서 확인하거나 좀 더 과격한 방법인 tcpdump나 Wireshark같은 툴을 사용해서 저수준에서 패킷을 캡쳐하는 방법을 많이 사용하곤 합니다. 하지만 Perl을 이용하면 콘솔에서 간편하게 패킷을 찍어보고 테스트할 수 있습니다.

7.18. Day 18 - 열여덟번째 날: Perl과 생명정보학 by ascendox

Perl은 문자열 처리 기능이 강력하기 때문에 문자열 구문 분석을 쉽게 할 수 있어 생명정보학에 종사하는 많은 사람들에게 인기가 높은 언어입니다. 특히 Perl이 가진 강력한 정규표현식 엔진 덕에 문자로 이루어진 서열(sequence; DNA:deoxyribonucleic acid, RNA: Ribonucleic acid, Protein) 분석에 중요한 역할을 하고 있습니다. 생물전공자가 이용할 만한 간단한 스크립트를 보면서 Perl이 생명정보학에서 어떻게 중요한 위치를 차지할 수 있게 되었는지를 생각해보는 문서가 되었으면 합니다.

7.19. Day 19 - 열아홉번째 날: Perl과 해킹 그리고 MS07-017 by vohrmana

해킹이라는 것은 넓은 의미에서는 프로그램을 작성하거나, 코드를 분석하고 개선점을 찾아 고치거나 또는 더 나은 기능을 구현하는 것을 의미하기도 하지만 좁은 의미에서는 목적 시스템의 취약점을 찾아내 루트 권한을 획득하는 것을 의미하기도 합니다. 오늘은 조금은 좁은 의미에서의 해킹에 대해 이야기해볼까 합니다. 원론적으로 취향에 따라 어떤 프로그래밍 언어를 사용해도 상관없겠지만, 역시 해커라면 Perl을 사용하지 않을까요? 아! 물론 저는 당연히 Perl을 사용합니다. ;-)

7.20. Day 20 - 스무번째 날: Moose로 OOP하기 by aer0

Perl은 1987년에 버전 1이 나오고 1994년도에 첫 5.대 버전이 나왔으며 현재 안정버전은 5.12.2에 이르렀습니다(Perl 6와는 별도). 비교적 후발주자 스크립트 언어인 Python, Ruby등이 나오면서 OOP를 잘 지원한다는 것을 내세우며 Perl과 비교하지만 그것이 결코 OOP에 있어 Perl보다 강력하다는 것을 뜻하는 것은 아닙니다.

Programming is Hard, Let's Go Scripting...에서 Perl의 창시자 Larry Wall은 이렇게 말했습니다.

I don't really know much about Python.

I only stole its object system for Perl 5.

I have since repented.

Larry Wall의 말처럼 Perl은 5.x 버전부터 Python의 객체 구현의 아이디어를 빌려 와서 OOP를 자체적으로 지원하기 시작했습니다. Perl의 기본적인 OOP구현 방법은 Python이나 Ruby와 비교하면 약간은 말이 많고 번거로워 보이는 건 사실입니다.

하지만 이것은 펄 크리스마스 달력 14일자에 게재된 Perl로 하는 함수형 프로그래밍이란 기사에서 볼 수 있다시피 다중 패러다임을 지향하는 Perl의 특성상 관련 키워드를 간략화시켜 언어에 내장함으로써 외형상으로 특정 패러다임에 적합해 보이고자 하기보다는 그것을 최소한의 부분 집합으로 넣고 유연하게 확장할 수 있는 구조를 택했기 때문이라고 볼 수 있습니다.

그렇다고 Perl의 기본 OOP가 이해하기 어려운 것은 아닙니다. OOP가 실제 어떻게 내부적으로 구현되고 동작하는지를 이해하려면 Perl의 OOP가 더 도움될 것입니다. 그래서 일본의 유명한 Perl 해커인 Dan Kogai씨는 Perl as a Second Language라는 발표에서 다음과 같은 말을 했습니다.

That's why you should learn perl if you want to learn OO!

You can learn how to make an object system, not just how to use it.

7.21. Day 21 - 스물한번째 날: Plack on SL4A by aanoaa

Perl은 대부분의 운영체제에 이식되어 기본으로 내장되어 있는 범용적인 언어입니다. 비록 기본 내장은 아니지만 안드로이드 플랫폼에도 이식되었습니다. 바로 SL4A가 그 주인공인데요. 자세한 내용은 SL4A 공식 홈페이지를 확인하세요. 아! 물론 이번 크리스마스 달력 16일자 기사도 놓치지마세요! ;-) SL4A가 설치되었다면 여러분의 안드로이드 기기는 웹서비스 머신으로 탈바꿈할 모든 준비가 된 것입니다.

7.22. Day 22 - 스물두번째 날: 북마크 사이트를 소장용 EPUB으로 만들기 by white_catz

항상 모든 일은 계획대로 되지만은 않습니다.

그래 이것으로 하자! 왠지 재미 있을 것 같아!

의욕 넘치게 선정했던 첫 주제는 "Dropbox로 어쩌구 저쩌구..." 였습니다. 하지만 Dropbox의 여신은 처음부터 제게 거칠기만 했습니다. 샘플 코드 작성 중에 OAuth 인증 문제가 발생했고 일단은 WWW::Mechanize를 사용해서 해결했지만, 이젠 다시 접근 토큰(access token)의 권한 문제로 지지부진한 상태에 이르렀죠. (마감 시간은 다가오는데!)

7.23. Day 23 - 스물세번째 날: 중복된 MP3 파일 찾아서 정리하기 by yuni_kim

프로젝트 마감일이 코 앞으로 다가왔습니다. 슬슬 집중해서 일을 해야하는데 오늘따라 하드디스크 한쪽에 아무렇게나 저장해 놓은 MP3 파일들이 자꾸 눈에 거슬립니다. 디렉토리를 이리저리 돌아다녀보니, 같은 파일일것 같은데 이름이 조금씩 다르거나, 이름까지 같은 파일인데 디렉토리만 다르게 해서 저장되어 있는 MP3가 많습니다. 일일이 다 들어볼 수도 없고, 정리하다 만 복잡한 디렉토리들을 다 따라다니면서 어딘가에 있을 것만 같은 중복된 파일들을 찾아보려니 무척 귀찮습니다. 그래서 중복된 MP3를 찾아주는 똘똘한 프로그램을 짜보기로 합니다.

7.24. Day 24 - 스물네번째 날: Gtk2 programming with DSL by am0c

Perl은 매우 유연하고 견고한 언어면서, 게다가 빠르기까지 합니다. 하지만 Perl의 진짜 매력은 프로그래밍의 언어 구조를 더욱 잘 이해할 수 있게 도와주는 점이 아닐까 합니다. Perl을 공부하다보면, 프로그래밍 언어를 효율적으로 다룰 수 있게되고, 명료하고 아름다운 코드를 작성할 수 있게 되는 것 같습니다. GUI 프로그래밍의 경우 기본적으로 키보드로 입력해야 양이 많기 때문에 DSL(Domain Specific Language) 기법을 도입하면 꽤나 많은 양의 코드를 줄일 수 있습니다. 문서에서는 Perl에서 DSL 기법을 도입하기 위해 필요한 기본 지식을 간단하게 소개하고 이를 이용해서 어떻게 Gtk2와 연동을 하는지 설명합니다.

8. 기타 & Comments

목차를 code태그로 묶으니 제목보다 더 눈에 들어오고... 다른 치장을 안 하고 그냥 적으면 너무 눈에 안 들어오고... 애매합니다잉

-- Raymundo 2011-12-17 12:49 am

옹 감사합니다.

-- 조프 2011-12-19 10:30 pm

그러고보니 불탄일 기념달력은 9일 이후 10, 11, 12일 기사가 목록에 없네요?

-- JellyPo 2012-11-2 12:12 am

어라, 그렇군요ㅎㅎ 깜박한채로 지나쳤나봐요. 추가하도록 하겠습니다.
-- Raymundo 2012-11-2 12:19 am

역시 올해도 벌써... Raymundo++ ;-)

-- keedi 2012-12-12 4:16 pm

:-)
-- Raymundo 2012-12-13 11:03 pm



컴퓨터분류
찾아보기:
Acme::Bleach   331Acme::SaBalTongMun   427Acme::Turing   210Alien::SmokeQt   168
Alien::wxWidgets   219Alzabo   431AnyEvent   300AnyEvent::MPRPC   296
AnyEvent::Twitter::Stream   56App::Cmd   225App::Cpan   373App::cpanminus   3, 62, 102, 378, 388, 424, 488
App::cpanoutdated   425App::FatPacker   227App::HTTPThis   44App::perlbrew   106, 384
App::Term2HTML   42Archive::Zip   172Attribute::Curried   467boolean   67
Capture::Tiny   86, 187Carp   119Carton   153Carton.pod   316
Catalyst   304, 351, 386, 443, 501Catalyst::Engine::PSGI   447Catalyst::Helper::Model::DBIC::Schema   391Catalyst::Log::Log4perl   445
Catalyst::Manual   354, 458Catalyst::Model::DBIC   457Catalyst::Model::DBIC::Schema   390Catalyst::Plugin::Static::Simple   293
Catalyst::Plugin::Unicode::Encoding   453Catalyst::View::TT   454cet   65CGI::Emulate::PSGI   248
Client.pm   234Complete::Bash   88Complete::Util   89Config::Any   393
Config::Tiny   360Const::Fast   361CPAN   61, 383cpan-outdated   379
CPAN::Mini   422CPAN::Mini::Webserver   423cpanm   311Cwd   166
Dancer   306, 502Dancer::Deployment   205Dancer::Plugin::Redis   332Dancer::Template::Simple   336
Data::Dump   156Data::Dumper   223, 330, 489Data::Lazy   472Data::MessagePack   68, 299
Data::Printer   97Data::Thunk   471Data::Util   466Date::Korean   318
DateTime   31, 107, 342, 406, 433DateTimeX::Easy   329DateTimeX::Format::Ago   23DBD::mysql   145, 261, 456
DBD::Pg   154, 262DBD::SQLite   263DBI   103, 146, 162, 286DBIx::Abstract   429
DBIx::Class   101, 161, 389, 441, 444, 484DBIx::Class::Schema::Loader   392DBIx::Class::Schema::Loader::Base   394DBIx::Lite   264
DBIx::ObjectMapper   442DBIx::Simple   155, 439DBIx::Skinny   440DBIx::XTML_Table   159
Devel::NYTProf   416, 450Devel::Peek   58Devel::Trace::More   239Device::SerialPort   396
Digest::MD5   459, 500Digest::Perl::MD5   182Directory::Queue   200Dist::Zilla   265
Dist::Zilla::Plugin::AutoPrereqs   266Dist::Zilla::Plugin::FakeRelease   267Dist::Zilla::Plugin::InstallGuide   268Dist::Zilla::Plugin::MetaResources   269
Dist::Zilla::Plugin::PkgVersion   270Dist::Zilla::Plugin::PodCoverageTests   271Dist::Zilla::Plugin::PodSyntaxTests   272Dist::Zilla::Plugin::PodWeaver   273
Dist::Zilla::Plugin::Prereqs   274Dist::Zilla::Plugin::ReadmeMarkdownFromPod   275Dist::Zilla::PluginBundle::Basic   276Dist::Zilla::PluginBundle::Filter   277
distribution/App-cpanminus/bin/cpanm   52distribution/File-Rsync-Mirror-Recent/bin/rrr-client   2distribution/Mojolicious/script/hypnotoad   77distribution/Mojolicious/script/morbo   76
EBook::EPUB   490Email::Send::SMTP::Gmail   14Encode   95, 133, 138, 282, 405Encode::Locale   317
enum   66EV   310Excel::Writer::XLSX   53Expect   50
ExtUtils::Install   60ExtUtils::MakeMaker   283Facebook   307FAQ.pod   206
Fey   432Fey::Loader   437Fey::ORM   434Fey::ORM::Manual::Intro   435
Fey::Test   436File::Basename   491File::Copy   190File::Find   498
File::HomeDir   281, 362File::Map   374, 415File::Path   367File::Rsync::Mirror::Recent   1
File::Slurp   157, 173, 343, 368, 477File::Spec   284, 363FileOp.pm   214Filesys::DfPortable   33
Filesys::DiskUsage   32Furl   112GD   344GD::Thumbnail   335
Gearman::Client   174Gearman::Server   175Gearman::SlotManager   177, 235Gearman::SlotWorker   236
Gearman::Worker   176Getopt::Long   245Getopt::Long::Descriptive   226, 298Graph   186
Gtk2   503h2xs.PL   211Hash::Merge   26HTML::Barcode   90
HTML::Barcode::Code128   92HTML::Barcode::Code93   91HTML::Barcode::QRCode   93HTML::Element   292
HTML::Escape   45HTML::FillInForm::Lite   41HTML::TreeBuilder   218, 291HTTP::Async   242
HTTP::Range   243HTTP::Request   461HTTP::Server::Simple::PSGI   479HTTP::Tiny   96, 111, 126, 139
Hubot   37Hubot::Adapter::Campfire   196Hubot::Adapter::Irc   195Hubot::Adapter::Shell   194
Hubot::Scripts::tell   197Image::ExifTool   54Image::Info   492Image::Magick   345
Imager   346Info.pm   213InlineX::C2XS   295integer   487
IO::Socket::INET   237IO::Socket::SSL   238IO::Stty   51IPC::Run   364
JSON   128, 188, 201JSON::MaybeXS   69JSON::XS   70libev   412
Lingua::JA::Romanize::Japanese   229Lingua::KO::Hangul::JamoCompatMapping   13Lingua::KO::Hangul::Util   12Lingua::KO::Romanize::Hangul   231
Lingua::ZH::Romanize::Pinyin   230List::MoreUtils   129, 169List::Util   192local::lib   312, 376, 385
LWP   35LWP::Simple   114, 134LWP::UserAgent   38, 110, 217, 244, 290, 369, 404, 460Marpa::PP   208
minicpan   377Minilla   179MLEHMANN/Urlader-1.01/bin/urlader-util   241Module::Build   506
Module::Starter   505Mojo::Collection   85Mojo::DOM   46, 82, 127Mojo::Message::Response   84
Mojo::Redis2   75Mojo::Transaction::HTTP   83Mojo::UserAgent   80, 113, 124Mojolicious   17, 22, 36, 39, 74, 81, 94, 98, 125, 130, 147, 158, 203, 253, 279, 305, 401
Mojolicious::Plugin::Bootstrap3   19, 21Mojolicious::Plugin::FillInFormLite   40Mojolicious::Plugin::FontAwesome4   18Mojolicious::Plugin::HamlRenderer   280
Moo   105, 257Moose   99, 297, 302, 446, 482Moose::Manual::MethodModifiers   483MooseX::App::Cmd   452
MooX::Cmd::Role   63MooX::Options   64, 258MooX::Types::MooseLike::Base   259MP3::Info   499
Nagios::Plugin   87namespace::clean   260Net::API::Gett   365Net::Google::Calendar   413
Net::Google::Drive::Simple   43Net::Libdnet   117Net::Pcap   118Net::SSH2   164
Net::Twitter   308Net::Twitter::Lite   403, 417, 481Net::Twitter::Lite::WithAPIv1 1   55Net::XMPP   183
Net::ZooKeeper   287NetPacket   116Number::Format   289OpenDocument::Template   350
overload   71PAR   419Par::Packer   347Parallel::ForkManager   20
Parcel::Track   4Parcel::Track::KR::CJKorea   5Parcel::Track::KR::Dongbu   6Parcel::Track::KR::Hanjin   7
Parcel::Track::KR::KGB   8Parcel::Track::KR::PostOffice   9Parcel::Track::KR::Yellowcap   10parent   486
Path::Tiny   131, 184PDF::Reuse   148PDF::Reuse::Barcode   149perl   100
perl5141delta   375Perl6::Currying   468Perl::Critic   209perlbrew   313
Plack   104, 140, 247, 448, 476Plack::App::CGIBin   249Plack::App::Directory   143, 485Plack::App::Directory::Apaxy   141
Plack::Builder   250Plack::Middleware::Debug   449Plack::Middleware::Debug::Profiler::NYTProf   451Plack::Middleware::Static   294
plackup   399Pod::Text::Color   121Pod::Text::Color::Delight   120Pod::Weaver::PluginBundle::KEEDI   278
POE::Component::IRC   251POSIX   407PPI   207Prima   381
Prima::Image   382Project::Libs   115PSGI   142, 246, 303, 478Qt   170
Qt4   171Qudo   199, 315Readonly   414Rex   165
Rose::DB   430RPC::XML   480Scalar::Defer   470Scalar::Lazy   469
Server.pm   232Sort::Naturally   11Spec.pm   216Spreadsheet::ParseExcel   181
Spreadsheet::XLSX   180SQL::Abstract   428SQL::Maker   438Starlet   79, 144
Starman   78Statistics::Basic   28Statistics::Descriptive   30Statistics::Lite   29
Statistics::Swoop   27Storable   204String::Trigram   185Sub::Call::Tail   463
Sub::Curried   465Sub::Curry   464Syntax::Highlight::Perl::Improved   123Sys::Info   132
Task::BeLike::RJBS   108Task::BeLike::TOKUHIROM   109Task::Dancer   337Task::Plack   475
Tatsumaki   398Template   352, 455Template::Reverse   301Term::ANSIColor   122
Term::ExtendedColor   325Term::QRCode   24Term::ReadKey   411Term::Title   15
Test::Ika   151Test::Mojo   150Test::More   152Text::ASCIITable   319
Text::CharWidth   320Text::Markdown   328Text::MultiMarkdown   47, 254Text::QRCode   25
Text::Table   160Text::UnicodeTable::Simple   323Text::Wrap   322Text::WrapI18N   321
Text::Xslate   288, 327TheSchwartz   198, 314threads   137Time::HiRes   178, 410
Time::Piece   285Tk   167Tree::Trie   73Try::Tiny   57, 202, 366
Twiggy   400Types::Serialiser   72Ubic   59Unicode.pm   212
Unicode::EastAsianWidth   324Unicode::Unihan   228URI   370, 493URI::Escape   48, 255, 462, 494
UUID::Tiny   256Vroom   224Web::Query   334, 380, 409Web::Scraper   136, 193, 333, 371, 408, 420, 497, 504
WebService::GData::YouTube   355Win32.pm   215Win32::API   349Win32::Clipboard   341
Win32::Console   16, 348Win32::EventLog   191Win32::GUI   240, 338Win32::GuiTest   339, 358, 397
Win32::GuiTest::Examples   359Win32::HideConsole   340Win32::OLE   402Win32::SerialPort   395
Win32::TieRegistry   189Worker.pm   233WWW::AdventCalendar   49WWW::Instapaper::Client   495
WWW::LinkedIn   309WWW::Mechanize   34, 135, 222, 357, 421, 496WWW::Mechanize::Firefox   252WWW::Shorten   418
WWW::YouTube::Download   356Wx   220, 387wxPerl::Styles   221XML::LibXML   474
XML::Simple   163XML::Tidy   353XML::Twig   473YAML   326
YAML::Tiny   372YAPE::Regex::Explain   426  

마지막 편집일: 2015-12-25 1:53 pm (변경사항 [d])
5793 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기