저자
시작하며
준비물
미러링
미러 사용
정리하며
펄 사용자에게 있어서 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은 한국에도 미러서버가 많은지라 대부분의 경우 불편함을 느끼지는 못합니다. 하지만 모듈을 개발한다던가, 다수의 장비에 다수의 모듈을 빈번하게 설치하고, 관리하고, 배포하는 경우 지역의 미러 서버를 이용한다하더라도 속도 측면에서 불편함이 있긴합니다. 이런 경우 단체 또는 사내, 심지어 개인 서버에 미러 서버를 구축하면 모듈 설치 및 업데이트 속도를 획기적으로 개선할 수 있습니다.
Parcel::Track
배송 조회
대부분의 직장인들에게 택배는 주문 및 결제를 완료한 순간부터 관심 그 자체입니다. '늦게 주문했는데 내일 올까? 아니 일괄 배송 시간이 지났으니 모레나 올거야.' 등 사실 우리가 택배가 어디있는지 관심을 보이든 보이지 않든 택배가 대문 앞에 도착하는 시간에는 하등 차이가 없음에도 관심을 놓을 수 없다는 것이 사실이긴 하지만요. :) 대부분의 택배사는 물류 및 배송 조회 서비스를 홈페이지에 제공하고 있으므로 이를 이용해도 되고, 각 쇼핑몰 홈페이지나, 택배 전용 모바일 전용 앱을 통해서도 배송현황을 조회할 수 있으니 세상 참 많이 편해졌죠? 하지만 역시 우리는 펄 해커! 해커에게 모든 것의 기본은 명령줄이죠? 꼭 해커여서가 아니더라도 명령줄에서 택배를 열람할 수 있다면 여러분이 상상해서 만들 수 있는 것이 더 많아질지도 모르겠네요.
그러면 문제는 뭔가?
내츄럴리?
열심히 일하다보면 뜻대로 쉽게 풀리지 않는 일들에 휘둘리기 마련입니다. 그렇지 않으면 어떻게 돌아가게는 해놓고 나중에 다시 보면 뭔가 찜찜한 느낌이 들기도 하죠. '아, 내가 왜 이런 걸 주업으로 삼아서 이러고 있나' 싶기도 합니다. 이런 후레시한 네거티브향이 풀풀 풍길 때에 우리는 쉬이 뜻하고 있던 '만남'을 추구합니다.
시작
음소 단위로 분리
한글 호환 자모로 변환
참고
인터넷 검색 엔진이나 쇼핑몰 등의 검색 창을 보면, 타이핑을 시작하기 무섭게 검색어를 알아서 완성시켜 주기도 하고, 검색어의 일부만 입력해도 원하는 검색 결과를 보여주기도 합니다. 그림 1과 같이 말이죠. 그림 1. 검색 엔진의 검색어 예측 (원본) 그림 1을 보면 정규표현식을 입력하는 과정에서 일시적으로 정귶이라는 문자열이 만들어졌습니다 (세벌식 자판을 사용한다면 이런 일이 없겠지만...). 단순한 정규식 일치나 index 함수를 써서 검사한다면, 정귶은 정규표현식에 일치되지 않는 것으로 판정되어 버립니다. 직관적으로 생각해보면, 이 문제를 해결하기 위해서는 문자열을 일단 음소 단위로 분리하면 될 것 같습니다. 그러면 이제 ㅈㅓㅇㄱㅠㅍㅛㅎㅕㄴㅅㅣㄱ 안에서 ㅈㅓㅇㄱㅠㅍ을 찾는 문제가 되고, 이 검사는 일치 판정을 받을 것입니다. 이렇게 음소 단위로 분리하는 작업을 펄 모듈을 이용하여 해 봅시다.
SMTP 세션 만들기
메일 보내기
프로그램을 써서 자동으로 메일이 발송되게 하고 싶은데, 직접 메일 서버를 설치하자니 설치나 설정도 어렵고, 최근에는 스팸 때문에 인증되지 않은 서버에서 발송된 메일은 아예 배달이 거부되는 경우도 있습니다. 간편하게 내가 가입한 Gmail 계정을 사용하여 메일을 발송하는 법을 알아봅시다.
제목 바꾸기
바퀴의 재활용
여러분은 터미널용 유틸리티를 자주 만들곤 하나요? 유닉스의 철학 중 하나인 KISS답게 유틸리티를 만들다보면 대부분은 한 가지 일을 잘 수행하는 간결하고 짧은 프로그램을 작성하게 되지만 가끔씩은 많은 일을 아우를 수 있는 엄청난(?) 것을 만들게 되기도 합니다. 관리 도구라던가 사용자 명령을 기다리는 유틸리티들이 대표적인데요. 이런 프로그램들은 사용자가 종료하기 전까지는 계속 대기 상태로 있죠. 또는 간단한 프로그램이지만 처리 시간이 꽤 오래 걸리기 때문에 실행된 상태로 종료될 때까지 오랜 시간 대기 하는 경우도 있습니다. 이런 경우 현재 프로세스 상태를 터미널 제목에 표시한다면, 제법 유용할 것입니다. Perl을 이용해 터미널의 제목을 바꾸는 법을 알아보죠.
Mojolicious
Bootstrap
FontAwesome
기타 등등
전체 코드
현대의 웹 응용에 있어 디자인은 필수 불가결한 요소입니다. 제 아무리 뛰어난 기능을 가지고 있거나, 좋은 내용을 담고 있는 웹 페이지나 웹 응용이라 할지라도 속된 말로 때깔이 좋지 않으면 사용자들의 호감도는 급감합니다. 반대로 때깔이라도 좋으면 그래도 사용자들의 호감도는 증가합니다. 비록 이런 상황 자체가 바람직한 것은 아니나, 그럼에도 불구하고 최소 웹에서 금칠(?)이 중요하다는 사실에는 개발자나 사용자나 모두가 고개를 끄덕일 것입니다. 디자이너가 없는 개발자나 개발팀의 경우 아리따운 웹 화면을 구성하려면 많은 노력이 필요합니다. 하지만 오픈소스 커뮤니티의 노력으로 탄생한 Bootstrap과 FontAwesome 두 라이브러리만 있다면 최소한의 노력으로 미려한 웹 페이지를 만드는데 부족함이 없습니다. 펄(Perl)과 CPAN은 Mojolicious + Bootstrap + FontAwesome 이 삼종셋트를 손쉽게 사용할 수 있는 아주 획기적인 도구를 지원하고 있습니다. William Ghelfi씨의 Bootstrap in practice: a landing page 기사를 참고해 과연 얼마나 간단하게 이 삼종셋트를 이용해 웹을 꾸밀 수 있는지 알아보죠.
Parallel::ForkManager
요즘은 물리적 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라는 모듈이 있으니까요.
Bootstrap + Mojolicious::Plugin::Bootstrap3
Bootswatch + Mojolicious::Plugin::Bootstrap3
일곱 번째 기사와 더불어 이번에도 삼종셋트 시리즈입니다. :-) 웹 화면에서 미려하면서도 통일된 디자인은 무척 중요합니다. 이전 기사와 마찬가지로 오픈 소스로 공개된 많은 디자인 관련 라이브러리 중 펄(Perl)과 Mojolicious와 함께 간단히 사용하는 것 만으로 웹 화면의 품질을 월등히 높일 수 있답니다. Bootstrap은 현재 가장 유명한 반응형 HTML, CSS, JS 오픈소스 프레임워크이며, Bootswatch는 Bootsrap을 위한 무료 오픈소스 테마입니다. 더불어 CPAN의 Mojolicious::Plugin::Bootstrap3 모듈은 Mojolicious에서 Bootstrap과 Bootswatch를 손쉽게 사용할 수 있게 도와주는 플러그인입니다. 역시 이번에도 얼마나 간단히 이 삼종셋트를 이용할 수 있는지 궁금하지 않나요?
Time-Ago?
다국어 지원
요즘은 트위터나 페이스북 같은 유명한 SNS 덕분에(때문에) time-ago 식 표현이 널리 사용된지 몇 년 되었죠. 자바스크립트를 비롯해 대부분의 언어에는 이런 time-ago 형식으로 시간을 표시할 수 있는 모듈이나 플러그인이 많습니다. 그렇다면 펄에서는 어떻게 사용해야 할까요?
터미널에 QR 코드라고?
출력 색상 조정
바코드(barcode)는 광학 기기가 판독할 수 있도록 고안된 굵기가 다른 흑백 막대로 조합시켜 만든 코드입니다. 전통적인 바코드는 서로 굵기가 다른 막대 모양의 이미지를 적절한 간격으로 배치해서 숫자나 문자를 표현합니다. 최근에는 QR 코드(QR code)처럼 단순한 막대 모양이 아닌 사각형의 배열의 점으로 자료를 표현하는 2차원 코드도 개발되어 많은 양의 정보를 담기도 합니다. QR 코드는 숫자나 영문자 뿐만 아니라 유니코드 문자를 담는데에 전혀 무리가 없기 때문에 활용도는 무궁무진합니다. 지금까지는 QR 코드를 이용하는 입장이었다면, 이번에는 반대로 전달하고 싶은 정보를 QR 코드로 제공한다면 어떨까요? 자신의 명령줄 프로그램에서 모바일 기기와 연동해서 정보를 전달해야 할 경우 해당 정보를 눈으로 보고 일일이 모바일 기기로 옮겨 적을 것이 아니라 QR 코드를 터미널에 짠!하고 뿌려준다면 손쉽게 정보를 보내줄 수 있겠죠?
사용법
펄(Perl)에서 해시(hash)는 무척 유용한 자료구조입니다. 스크립트 언어의 가장 큰 특징이자 장점 중 하나는 배열이나 해시와 같은 복잡한 자료구조를 추가적인 라이브러리 적재없이 언어 내부에 구현해서 간단히 사용할 수 있다는 점입니다. 이러다보니 자연스럽게 계층적 자료인 경우 해시를 사용해서 저장하게 되는데 사용하다 보면 두 해시의 자료를 합쳐야 할 경우가 종종 있습니다. 단순한 해시라면 고민없이 해결하겠지만, 깊은 자료구조를 가진 해시라면 한참을 고민하거나 결국 합치는 루틴을 만들어야 하곤 합니다. 이런 류의 일은 꽤나 빈번하며, 역시 우리의 펄 선배들은 비슷한 생각을 하고 이미 바퀴를 발명해놓았지요.
참고자료
수치 배열을 가지고 작업을 하다보면 꽤 많은 경우 누계나 평균은 물론이고, 최댓값, 최솟값 등의 빈번하게 계산하기 마련입니다. 이런 기본적인 통계값을 생각 날때마다 반복문을 돌리며 연산하는 것은 번거로운 일이죠. 게으른 펄(Perl) 프로그래머에게 꼭 필요한 간단한 통계 모듈을 알아보죠.
1. 정규표현식
2. 날짜 형식에 맞는 파싱 모듈을 사용
3. 포맷 빌더를 사용해서 자체적인 포맷팅 모듈 만들기
정리하...
이제부터 진면목
업무에서 가장 빈번하게 접하는 데이터는 바로 날짜입니다. 날짜라면 단순한 데이터라고 할 수 있을텐데 현실 세계는 조금 더 잔인한 법입니다. 이런저런 사람들이 쏟아내는 날짜 형식이라고 부르는 데이터들은 아래와 같습니다. 그렇다면 우리는 어떤 자세로 이런 데이터들을 대해야 할까요?
cwd와 getcwd의 차이?
절대 경로 알기
어떤 프로그램을 실행할 때, 시스템의 디스크 드라이브에 대해 이런 저런 정보를 얻어야 할 때가 있습니다. 그 중의 하나는 이 프로그램이 연결된 "작업 디렉토리(working directory)"입니다. 프로그램 내에서 파일 관련 연산을 할 때 상대 경로로 지정된 경로명은 모두 이 작업 디렉토리를 기준으로 동작하게 됩니다. 펄 스크립트 내에서는 chdir 내장 함수를 사용하여 작업 디렉토리를 변경할 수 있지만, 현재 작업 디렉토리가 어디인지를 알아내는 내장 함수(유닉스의 pwd 같은)는 따로 없습니다. 그러나 이 기능을 제공하는 모듈이 있습니다.
파일 또는 디렉토리 사용량 알아내기
디스크의 남은 용량 확인하기
어떤 디렉토리의 용량, 즉 그 디렉토리 안에 있는 파일들과 서브디렉토리들이 차지하는 용량의 총합이 얼마나 될까 궁금하면 어떡해야 할까요? File::Find 모듈을 사용해서 서브디렉토리를 재귀적으로 탐색하며 모든 파일들을 찾으면서, 각 파일들의 크기를 구해서 더하면 되겠죠! 아니면 qx()를 사용하여 유닉스/리눅스 명령어인 du를 실행한 후 출력으로 나온 문자열을 정규식을 써서 해석하면 되겠지요. 디스크 전체의 사용량과 남은 용량이 궁금하다면 어떡해야 할까요? 이번에도 리눅스 명령어인 df를 실행해 나온 출력을 갈무리한 후 정규식을 써서 원하는 부분을 추출하면 됩니다. 흠... 전부 맘에 들지 않는다는 까다로운 사람들을 위해, 다른 방법을 알아봅시다.
SQL Injection: Blind
여기 취약한 페이지가 있습니다!
데이터베이스 이름 찾기
테이블 이름 찾기
컬럼 이름 찾기
우리는 펄(Perl)을 이용하여 문자열을 쾌적하게 다룰 수 있는 방법을 알고 있습니다. C만 했던 예전의 저에겐 몹시도 파격적이었죠. 시간 가는 줄 모르고 펄을 이용해 별 쓸모없는 코드들을 만들곤 했습니다. 그 중 웹 해킹 공부를 위해 만들었던 코드 하나를 소개합니다. 함께 SQL 삽입(SQL injection)중 블라인드(blind) 기법에 대해 알아보고 자동으로 블라인드 공격을 수행하는 툴을 간단하게 만들어 볼까 합니다. 무엇보다 SQL 삽입을 수행하기 위해 웹에 접근할 수 있는 수단이 필요합니다. CPAN의 WWW::Mechanize 모듈도 좋고, CPAN의 LWP 모듈도 좋습니다. 당연하지만 펄과 SQL에 대한 지식이 조금은 필요합니다. 원하는 정보를 빨리 찾아내기 위한 탐색 기법이나 스레드에 대한 기법이 필요할 수도 있지만 단순함을 위해 언급하지 않습니다.
간단한 폼 만들기
간단한 텍스트 필드
같은 이름의 필드가 여러 개일 때
체크박스
파일 업로드
모든 입력값을 한꺼번에 보기
모든 파일 업로드 필드의 내용을 한꺼번에 보기
Mojolicious::Controller의 param() 메소드
Mojolicious를 사용하여 웹 애플리케이션을 만들어보고 싶은데, 웹 프로그래밍에 익숙하지 않은 상태에서 막상 시작하면 막막할 때가 많습니다. 브라우저에서 폼에 입력한 값을 서버에서 받으려면 어떻게 해야 하는지, 한 번에 여러 개의 파일을 업로드하고 싶으면 어떻게 해야 하는지 같은 것들이 발목을 잡습니다. 어떤 때는 잘 되는 것 같은데 조금 수정하고 나니 제대로 값을 받지 못하곤 합니다. 공식 문서는 첫 단락에서는 덧셈을 가르치더니 두 번째 단락부터는 갑자기 미적분을 소개하는 느낌입니다. 사실 제가 저런 문제들 때문에 애를 먹곤 했던 터라, 이 기회에 간단히 정리해보겠습니다.
날씨 알림 봇
사람들의 이야기를 듣기
주간 예보
WOEID 값 얻기
당일 예보
실행!
크리스마스 숙제
휴봇(HUBOT)이라고 들어보셨나요? 휴봇은 GitHub에서 만든 채팅 봇으로 처음에는 사내용으로 만들어졌지만, 많은 발전을 거듭하며 현재는 오픈 소스로 공개되어 있습니다. GitHub에서는 그룹 채팅시 휴봇에게 "github xx부서의 핵심 업무를 알려줘."라고 물어보면 휴봇이 그에 대해 상세한 답변을 하는 식입니다. 더 나아가 구글 번역이라던가, 지도와의 통합, 프로젝트의 배포등의 일까지도 휴봇에게 지시할 수 있습니다. 휴봇은 Node.js 기반에 CoffeeScript로 개발되었지만 @aaonaa님께서 Perl로 포팅하셨기 때문에 Perl로도 휴봇을 이리저리 만질 수 있답니다. p5-hubot의 자세한 설명은 2012년도 크리스마스 캘린더를 참고하세요.
폼에 값을 채워넣기(1) - 수작업
폼에 값을 채워넣기(2) - 자동으로
웹 페이지에서 폼을 띄워서 사용자에게 입력을 받을 때, 폼의 여러 입력 필드에 미리 어떤 값을 채워둔 상태로 두고 그 상태에서 사용자가 제출 버튼을 누르면 그 값이 전송되도록 하고 싶을 때가 있습니다. 일종의 디폴트 값인 셈입니다. 예를 들자면, 사용자의 정보 수정 폼에서는 기존 정보(전화번호나 주소)를 미리 채워넣고, 달라진 게 있는 항목만 사용자가 수정하도록 할 수 있을 겁니다. 또는, 사용자가 입력한 내용 중에 잘못된 값이 있어서 폼을 다시 작성하도록 해야 하는데, 제대로 넣은 값들까지도 전부 새로 넣으라면 사용자가 화를 낼 테니 미리 채워넣어 주는 게 좋을 것입니다. Mojolicious를 이용하여 만드는 웹 페이지에서 이렇게 폼의 필드를 채워넣는 작업을 자동으로 하는 방법에 대해 알아봅시다.
term2html
크리스마스 선물 #1: 한글
크리스마스 선물 #2: 터미널 배경과 전경
흑백 모니터를 사용하고, VT100을 사용하거나, ANSI 제어 문자를 제대로 쓰지도 못하던 먼 옛날과는 달리 알록달록한 칼라 모니터와 칼라 터미널은 너무도 당연한 시대입니다. Full-HD를 넘어 U-HD까지 지원하는 모니터가 나오는 시대에 칼라 터미널이라니 너무 시대에 동떨어진 이야기를 했나요? :-) 터미널에서 우리가 보는 알록달록한 색깔은 대부분의 경우 ANSI 제어 문자를 이용한 색상 표현 입니다. 터미널이란 것 자체에 워낙 기대를 하지 않고 보아서 그런지는 몰라도 이 터미널이란 화면 안에 알록달록하게 색상이 표시되면 그 아름다움(?)에 가끔 넋이 나가기도 합니다. (저만 그런가요? :) 이 터미널의 화면을 긁어서 누군가에게 보여주고 싶다는 생각을 해본적이 있나요? 하지만 긁어서 복사하는 순간 그것은 단지 단순한 텍스트가 될 뿐입니다. 터미널을 누군가에게 보여주어야 하는 순간이 온다면 결국 화면 갈무리를해서 그림 파일로 저장해야했죠. 이 알록달록한 화면을 갈무리하는 방법은 과연 없을까요?
모듈 사용 준비하기
모듈 사용 예
Google에서 제공하는 클라우드 스토리지인 Google Drive에 펄을 이용하여 파일을 업로드하거나 다운로드하는 방법을 알아봅시다.
Seoul.pm 크리스마스 달력 저장소 내려받기
달력 만들기
달력 보기
달력 열어보기
'크리스마스 달력'은 '대림절 달력'(Advent Calendar)을 서울 펄 몽거스식으로 바꾸어 부르는 일종의 브랜드(?)명입니다. 부르기 더 편하니까요. 아무튼 대림절 달력의 유래는 독일 19세기 초까지 올라갑니다. 루터교 사람들은 12월 1일부터 24일까지의 대림절 동안 하루에 하나씩 분필로 표기하여 재림일을 손꼽아 기다리곤 했답니다. 쩝... 나뭇가지에 개수만큼 흠집을 내는 것도 아니고 말이죠! 물론 석기 시대에나 볼 수 있을 듯한 이런 구리구리한 방법만 있던 것은 아닙니다. 멋진 구조물에 24개의 양초를 두기도 했고요. 건물의 창문에 번호를 매기기도 했습니다. 그것이 진짜 달력 형태로 만들어졌다가 마침내 인쇄물 형식의 대림절 달력이 탄생하게 된 것입니다! 짜잔! 이미지 출처: allthingsbeautiful-charity.blogspot.kr 현대 문화는 이 관습을 고스란히 물려받았습니다. 12월이 다가오면 너나 할 것 없이 온 가정에서 오손도손 모여 대림절 달력을 만듭니다. 상자 형태로 만들어 스물 네개의 문을 달고요. 하루에 하나씩 열면! 짜잔~ 깜짝 선물이 나오는 겁니다! 마지막 24일의 문은 초대형 문에 초대형 선물을 넣는 센스도 발휘합니다. 가족이 다함께 종이를 씹고 뜯고 붙이며 만드는 재미! 크리스마스까지 조마조마하게 기다리며 하루에 하나씩 문을 열어보는 재미! 올해도 크리스마스가 외로우신 분이나, 충성스러운 삶을 보내고 계시는 분까지, 다함께 글로벌하고 즐거운 (펄) 크리스마스 달력에 빠져보는 건 어떨까요? 자, 지금부터 여러분의 컴퓨터에 Seoul.pm 펄 크리스마스 달력을 소장하는 법을 여러분에게만 알려드리죠!
사용 방법
IO::Stty 설치
원격 호스트 접속해보기
더 해보기
원격지의 서버에서 루트권한을 얻어서 무언가 작업을 하려면 상당히 귀찮은 반복 노가다를 하게되곤 합니다. sudo가 세팅되어있는 서버라면 -S 옵션을 이용해 간단히 처리할 수 있겠지만, 보안 정책상 이마저도 허락되어있지 않았다면 곤란해지게 됩니다. 이런 경우 사용자의 입력을 그대로 대신해주는 Expect 모듈이 큰 빛을 발합니다.
p5-postcodify
전국 주소 데이터베이스 파일
의존 모듈 설치
실행
Postcodify는 웹 페이지에서 도로명주소, 지번주소, 영문주소 등을 편리하게 검색할 수 있도록 해주는 오픈소스 라이브러리입니다. PHP 구현물이며, LGPL-3.0 라이센스이고, 현재 GitHub 저장소에서 개발이 이루어지고 있습니다. 공식 홈페이지의 설명에 따르면 다음과 같은 장점이 있다고합니다.도로명 주소 DB를 직접 구축하거나 관리할 필요가 없음검색 알고리듬을 개발할 필요가 없음jQuery 몇 줄로 검색창을 만들 수 있음 참, 좋아보이는데 Perl 사용자는 어떻해야 할까요?
가볍게 시작하기
Excel 파일 만들기
워크시트에 데이터 집어넣기
몇 가지 소소한 팁
차트 추가하기
본의 아니게 어떤(?) 시스템의 1년치 로그 파일을 받아 분석할 일이 있었습니다. 월 단위로 전체 로그를 나눈 다음, 관심가는 특정 데이터 값만 뽑아, 이를 그래프로 바꾸면 어떤 경향을 파악할 수 있으리라는 아이디어까지는 떠올랐죠. 경험상 이 작업을 수작업으로 하는 것은 사람이 할 짓은 아니라는 느낌도 있었기도 하고, 매 월별 데이터 셋과 이에 대한 차트 그래프를 워크 시트에 담은 Excel 파일을 만든다면, 리포트 자료까지 만들어지는 셈이라 결국 Perl을 이용한 Excel 처리를 하기로 합니다. 차후 Perl을 이용한 Excel 문서 작업을 시도해 보려는 분들의 첫걸음에 도움이 되길 바랍니다.
실시간으로 로그를 분석하는 프로그램을 만들다보면 마지막으로 본 로그 위치에서부터 로그를 다시 분석하고 싶을 때가 많습니다. 요구사항은 간단한데 막상 해보려면 꽤 귀찮고 어려운 문제에 직면합니다. 이럴 때엔 CPAN의 Logfile::Tail 모듈을 사용하면 쉽게 처리할 수 있습니다.
스마트폰으로 찍은 사진의 GPS 정보를 추출하자!
디지털 카메라로 찍은 사진에 GPS 정보를 주입하자!
스마트폰이 대중화 된 것도 벌써 6년이 다되가네요. 스마트폰이 많은 것을 바꾸었지만 무엇보다도 사람들의 사진 찍는 방식을 크게 바꾸었습니다. 예전에는 대부분이 디지털 카메라나 DSLR을 이용해서 사직을 찍었다면, 지금은 간편히 주머니의 휴대폰을 꺼내서 찍는 것으로도 충분해졌달까요? 그 전에는 디지털 카메라에 GPS를 내장해서 Exif에 넣니마니, 그런데 겨우 GPS 하나 넣었다고 카메라 가격이 말도 안되게 비싸지고, 한국에는 구하기도 어렵고, 그랬던 적이 있었지만 이미 GPS를 내장하고 있는 스마트폰이 나오고 난 뒤로는 이 모든 것이 그닥 의미가 없어져 버렸죠. 어쨌든 덕분에 요즘 스마트폰으로 찍는 사진들은 특별히 설정을 끄지 않으면 사진에 GPS 정보를 모두 저장하고 있어 이를 편리하게 이용할 수 있습니다. 하지만 여전히 스마트폰으로 찍으면서도 아쉬운 부분이 있기에 DSLR이나 미러리스 급의 카메라를 병행하면서 찍기도 하는데, 문제는 이렇게 병행해서 찍다보면 어떤 사진에는 GPS 정보가 있지만 어떤 사진에는 GPS 정보가 없죠. 그냥 없으면 없는대로 내버려두는 것도 나쁘지는 않지만, 사진을 정리할때 휴대폰으로 찍은 사진을 참고해서 DSLR이나 미러리스로 찍은 사진의 GPS 정보를 넣어주는 것은 나름 의미가 있을 것 같습니다. 심지어 이것이 간단하다면 어떨까요? :)
배경
트위터 OAuth
트위터에서 제공하는 스트리밍 API를 사용해 타임라인을 감시하다가 어떤 조건에 맞는 트윗에 대해 원하는 작업을 수행하는 방법을 소개합니다.
스칼라 정수형 숫자 변수
정수형 상수
스칼라 부동소숫점 숫자 변수
스칼라 문자열 변수
스칼라 NULL 변수
명시적 변수 선언
다음회 예고
간단한 프로그램 작성 정도를 부담없이 하게 되고나면 프로그래머로써의 호기심은 그 내부를 항햐기 마련입니다. 그리하여 내부의 구조가 어떻게 되어있는지 어떻게 동작하는지를 이해하게 되다면 최적화를 더 잘하게 된다든지 그럴것같진 않고(T.T), 좀 더 안다는 자기만족 이외에 무엇을 얻을 수 있을진 모르지만 그냥 재미있습니다. OTL
"101" + 101
다시 문자열로
문자열을 실수로 바꾸면?
변수를 초기화하면?
중간 정리
변환이 발생하는 경우
참고문헌
지난 기사에서 예고했던대로 문자열 "101"이 들어있는 변수에 정수형 101이 들어있는 변수를 더하면 어떤 일이 발생하는지 살펴보겠습니다.
특징 및 장점
기본 설정
디렉터리 구조
서비스 상태 관리
크론
서비스 등록
서비스 관리
다양한 서비스를 관리해야 할 경우 여러분은 어떤 도구를 사용하나요? 보통 daemontools나 Supervisor를 떠올리겠죠? 아! restartd나 runit, s6도 빠뜨릴 순 없겠죠. 하지만 여러분은 펄 프로그래머! 조금이라도 더 몸에 밴, 익숙할 것 같은 느낌이 강하게 드는 도구가 필요하지 않나요? :) Ubic은 다양한 서비스를 관리할 수 있도록 도와주는 경량의 도구입니다. Ubic을 이용하면 어떠한 프로그램도 서비스로 구동할 수 있으며, ubic이라는 명령줄 도구를 이용해서 이를 제어할 수 있습니다. 펄과 마찬가지로 매우 유연한 도구로 자신의 상황과 시스템의 상황에 맞게 유연하게 설정할 수 있으며, 필요하다면 플러그인을 제작하는 것도 무척 쉽습니다. 물론 특별히 무언가를 설정하거나 작성할 필요없이 기본으로 제공하는 모듈만으로도 대부분의 경우 충분합니다. 자, 지금부터 Ubic으로 다양한 서비스를 관리하는 방법을 살펴보죠!
배경 지식
공격!!
2014년에 들어오면서 리눅스 환경에서의 굵직한 취약점이 발표되었습니다. Bash 쉘 쇼크라던가 OpenSSL Heartbleed 말이죠. 이번 기사에서 다룰 내용은 나열한 취약점과는 거리가 있지만, 리눅스 환경에서의 해킹을 조금이라도 맛 볼겸(?) 메모리 버그의 일종인 버퍼 오버플로우(BOF, Buffer Overflow)를 이용한 해킹 기법을 살펴보겠습니다.
HTTP 서버랑 웹 앱 서버랑 왜 분리하죠?
펄 설치
uWSGI 설치
uWSGI 실행
Nginx 설정
웹 앱에서 경로 설정은 어떻게 하나?
2012년 펄 워크샵 때 @yuni_kim님이 발표한 Perl을 위한 Web App 실행 환경 꾸미기를 Ubuntu 14.04에 직접 적용한 내용입니다.
원리
펄을 사용하다보면 CPAN을 사용하는 것은 아주 자연스러운 일입니다. CPAN을 이용해서 다양한 모듈을 설치하고 사용하다보면 어느 순간 지금까지 설치한 모듈의 전체 목록이 필요할 때가 있습니다. 단순한 호기심 때문일 수도 있고, 펄을 새로 설치한 후 필요한 모듈이 없어서 일 수도 있으며, 펄로 만든 서비스를 다른 시스템에 옮기기 위해서 일 수도 있습니다. 지금까지 그렇지 않았다하더라도, 여러분은 현재 시스템에 설치한 모듈의 목록을 확인하는 방법이 머지않아 필요할 것입니다. :)
실행 파일 만들기
기능 추가 방법
option 사용 방법
간단한 단일 동작만을 실행고자 한다면 코드 내부에서 인자를 직접 선언해 사용해도 됩니다. 이 방법은 간편하지만 처리해야할 일이 많아지고 여러가지 자료를 유동적으로 받아들여야 한다면 코드 내부에서 수정하기란 매우 어렵고 자유롭지도 않기 때문에 시간이 지날 수록 힘들어집니다. MooX::Cmd::Role 모듈과 MooX::Options 모듈을 사용해 기능을 손쉽게 나누고 인자를 유동적으로 받아들여 유지 보수가 손쉬운 프로그램을 만드는 방법을 알아보겠습니다.
간단한 방법
한계
cet
시스템을 다루다 보면 각종 로그를 tail 등의 명령어로 볼 일이 많습니다. 이럴 때 특정 문자열이 포함되거나 패턴에 일치하는 줄은 더 눈에 잘 띄도록 색을 넣어준다면 확연히 구분이 되어 더욱 가독성이 높아지겠죠?
그러면 어떻게?
use boolean
use Types::Serialiser
펄로 몇 가지 제품을 개발하는 중 다른 언어/환경과 데이터를 주고받고 하는 와중에 회사 동료로부터 다음과 같은 이야기를 들었습니다.펄은 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 }, ... ] } }}} 늘 하듯이 펄에서 사용하던 식으로 데이터를 넘겨줬었죠. 하지만 그때마다 불리언형을 지원하는 쪽에서는 이런 데이터들의 형을 일일이 변환해줘야 하는 수고가 있었습니다. 미안하고 또 미안했습니다.
배열 변수
해시 변수
익명 함수
첫 번째 기사에서는 펄이 어떻게 스칼라 변수를 내부적으로 처리하는지를, 두 번째 기사에서는 펄의 기본타입인 스칼라변수가 어떻게 내부적으로 표현되는지 문맥에 따라 어떻게 변화되는지를 살펴보았습니다. 오늘은 펄의 또다른 기본 타입인 배열 변수와 해시 변수에 대해 살펴봅니다.
트라이 맛보기
트라이(trie)는 트리와 유사한 자료 구조로 주로 문자열 등에 대한 동적 집합 혹은 연관 배열을 저장합니다. 키 값의 전체가 아닌 일부만 비교하는데 사용되므로 매우 빠르게 비교를 수행합니다. 이런 연유로 정보 검색(Information Retrieval)이나 언어 처리(NLP)에서 은근히 자주 다루는 자료 구조입니다. 트라이의 창시자는 Edward Fredkin 교수로 reTRIEval에 유용하다고 trie라 명명했다고 합니다. 펄에서 트라이를 손쉽게 사용할 수 있도록 도와주는 Tree::Trie라는 멋진 모듈을 살펴보죠. :)
웹소켓 채팅 서버
자원의 공유
Mojolicious은 인기있는 펄의 경량 웹 프레임워크입니다. 경량의 MVC 프레임워크임에도 불구하고 HTTP 클라이언트 및 서버의 거의 풀 스택을 구현한 웹 프레임워크로 지원하지 못하는 기능을 찾기가 더 어려울 정도인 잘 만들어진 모듈입니다. 웹소켓 역시 대표적인 예로 Mojolicious는 이 웹소켓을 아주 잘 지원합니다. 실시간으로 상태를 갱신한다던가 등의 동작을 단순 HTTP만으로 구현하려면 자바스크립트 및 웹응용의 컨트롤러에서 처리해야 할 내용이 꽤 많죠. 이번 기사에서는 Mojolicious에서 손쉽게 웹소켓을 다루는 방법을 소개합니다.
얼개
Mojo::UserAgent
Mojo::DOM
정보 추출
grep은 유닉스의 명령줄 유틸리티로써 패턴으로 문자열 속의 일치하는 부분을 찾아내는 도구입니다. 기사에서는 문자열의 범위를 웹으로 넓혀, 여러 웹 페이지를 수집한 후 그 속에서 원하는 패턴을 찾아내는 방법에 대해 알아보겠습니다. 웹 페이지를 검색하려면 먼저 어떤 웹페이지를 검색할지 정해야 합니다. 디씨인사이드는 갤러리 별 게시판이 존재하며, 각 갤러리 별로 주제 구분이 명확하고, 올라오는 글들의 특성도 다르기 때문에 패턴 검색에 적절하다고 판단해 선택했습니다. 큰 의미는 없으니 편하게 읽어주세요. :)
smartctl 옵션
명령 만들기
main 함수와 결과 분석, 모니터링(Opsview) 알림
전체코드
테스트
서버에 발생하는 문제 중에서 빈번하지는 않지만(서비스 종류에 따라 다릅니다) 디스크 문제가 생긴 경우는 매우 치명적입니다. 그러므로 평소에 모니터링을 통해 디스크 교체와 같은 조치를 미리 취하는 것은 중요합니다. 보통 smartmontools를 이용한 검사를 많이 쓰는데, 이번 기사에서는 smartmontools 패키지의 smartctl을 실행하고 결과를 간단히 분석한 후 판단한 결과를 알려주는 방법을 살펴봅니다. smartctl을 실행하고 결과를 분석하기 위해서 CPAN의 Capture::Tiny 모듈과 모니터링 시스템(Opsview)과 같이 사용하기 위해서 CPAN의 Nagios::Plugin 모듈도 사용합니다.
쉘 자동 완성
Bash 자동 완성
Complete::Bash
적용하기
펄을 접할 때 단연코 가장 흥미로운 것은 "게으름은 미학이다!"라는 철학입니다. 게으름(laziness) 그 자체를 어떻게 바라보는지는 크게 관심 없습니다만, 게을러지기 위한 노력들은 삶을 윤택(?)하게 만들어 주기 때문이 아닐까합니다. 이번에 다룰 주제를 통해서 다시 한번 게을러 보고자 합니다 :) 인기있는 유용한 유틸리티들은 항상 다양한 기능을 제공하기 위해 명령줄 옵션을 제공할 뿐만 아니라 때때로 부명령(subcommand)까지도 지원합니다. 하지만 이런 다양한 명령과 옵션을 오랫동안 기억하는 것은 쉬운 일이 아닙니다. 심지어 입력하다보면 오타가 발생하기도 하죠. --help 옵션을 이용해 도움말을 확인하면 될 일이지만, 번거롭긴 합니다. 자! 명령줄 자동 완성 기능을 이용해 좀 더 게을러져 보죠!!! :-)
QRCode 모듈 설치
웹 기반 바코드 생성기
나머지 코드
바코드(barcode)는 광학 기기가 판독할 수 있도록 고안된 굵기가 다른 흑백 막대로 조합시켜 만든 코드입니다. 전통적인 바코드는 서로 굵기가 다른 막대 모양의 이미지를 적절한 간격으로 배치해서 숫자나 문자를 표현합니다. 최근에는 단순한 막대 모양이 아닌 사각형의 배열의 점으로 자료를 표현하는 2차원 코드도 개발되어 많은 양의 정보를 담기도 합니다. 바코드 단순하면서도 판독율이 좋기 때문에 다양한 개체를 전산화하기 위한 용도로 널리 사용됩니다. 더불어 바코드는 종이 뿐만 아니라 의류 등 인쇄할 수 있는 위치의 제약이 거의 없고, 표준화되어 있으며 출력 비용을 제외하면 생성 비용이 거의 없어서 오래된 기술임에도 불구하고 여전히 많은 곳에서 사용하고 있습니다. 지금부터 HTML::Barcode를 이용해 다양한 종류의 바코드를 만들어 보고 Mojolicious와 연동해서 웹 기반의 바코드 생성기를 제작합니다.
오늘의 날씨
한글이 깨져요!
Wide character in print at.
참고문서
위키백과를 따르면 인코딩(encoding)은 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 말한다고 합니다. 인코딩/디코딩은 다루는 자료의 종류에 따라 의미하는 바가 조금씩 다르지만 지금은 유니코드 인코딩/디코딩으로 한정합니다. {{{ I/O 스트림 +--------+ +-------------+ +------+ | | 표준 입력 | | 표준 출력 | | | 키보드 +------------->| 펄 프로그램 |+------------>| 화면 | | | | | | | +--------+ +-------------+ +------+ }}} 앞의 그림은 가장 일반적인 입출력 스트림(input/output stream)을 보여줍니다. 입출력 스트림은 바이트 스트림(byte stream)과 문자 스트림(character stream) 두 종류로 나눌 수 있습니다. 입력 스트림을 통해 전달되는 자료는 프로그램, 즉 펄 프로그램을 만나기 전까지는 바이트 스트림으로 존재합니다. 펄 프로그램에서 바이트 스트림을 어떻게 처리하느냐가 펄에서의 인코딩/디코딩의 핵심입니다. 실제 웹 상에 있는 HTML 문서를 이용해서 직접 인코딩/디코딩을 살펴봅니다.
좋은 모듈이란?
1. Top 100 ++ Leaderboard @ MetaCPAN
2. MetaCPAN
3. CPAN 의존성
4. Task::BeLike::.+
5. Module::Advisor
6. 다른 사람에게 물어보기
CPAN Testers Statistics에서 확인할 수 있는 것처럼 현재 CPAN 에 등록된 모듈은 3만여개에 가깝습니다. 많은 모듈이 있다는 것은 좋은 것입니다. 하지만 모든 모듈이 다 좋은 것은 아닙니다. A라는 일을 하기위한 모듈이 수십여개인 경우 도대체 무엇을 골라야 할지 난감하기 마련입니다. 그럼 우리는 어떻게 좋은 모듈을 골라야 할까요?
perlbrew / plenv
PERL5LIB 환경 변수
cperl-mode
flymake 문법 검사
Emacs에 펄 개발 환경을 설정하면 문서를 보기에도 좋고, 코딩하기에도 편리합니다. Emacs를 사용해서 펄로 개발할때 생산성을 높여주는 몇 가지 유용한 팁을 소개합니다.
NetPacket 모듈 설치
pcap과 관리자 권한
펄 경로와 관리자 권한
실제 패킷 캡쳐해보기
필터 기능
패킷 분석
네트워크상에서 작업을 하다보면 가끔씩은 정말 무엇이 어떻게 돌아가고 있는지 두 눈으로 확인하고 싶은 욕구가 (치?)밀어오를 때가 많곤합니다. 응용과 시스템 그리고 원격지 사이에서 그 누구도 잘못이 없어보일 때 범인을 찾으려면 역시 네트워크 패킷을 직접 확인하는 것보다 정확한 것은 없죠. tcpdump나 와이어샤크 같은 유명한 도구도 있지만 직접 펄 코드와 연동해서 디버깅하는 것이 훨씬 편리할 때가 많습니다. pcap 라이브러리는 tcpdump 팀이 제작한 라이브러리로 tcpdump와 와이어샤크등의 패킷 캡쳐 프로그램의 핵심이라고 할 수 있습니다. pcap을 사용하면 펄에서는 손쉽게 패킷 캡쳐를 펄 프로그램과 연동할 수 있습니다.
정리하며...
사용자 정의를 위한 지침서
크리스마스 선물 #1: 설정파일
크리스마스 선물 #2: 패치
대부분의 프로그래머는 자신만의 선호하는 편집기가 있기 마련입니다. 제각각의 이유를 가지고 편집기 또는 통합 개발 환경을 선택하겠지만 그 무수한 이유중 빠질 수 없는 것이 바로 문법 강조 기능입니다. 유닉스를 만들던 걸출한 해커들이야 분명히 검은 바탕에 흰 글씨로 엄청난 시스템을 만들었다고는 하지만 이러니저러니 해도 자신이 사용하는 소스 코드에 일관된 규칙으로 시각적으로 편안한 색깔이 덧대어진다면 가독성이 높아지는 것은 자명할 것입니다. 펄은 perldoc이라는 시스템을 통해 시스템에 제공되는 펄은 물론 관련 모듈까지 모두 문서를 제공하며 이 에코 시스템에 익숙해진 펄 개발자라면 누구나 자연스레 perldoc 문서를 읽고, 또 만들게 됩니다. Carp 모듈의 내용이 궁금하다면 언제든지 작업하던 터미널에서 perldoc Carp라고 입력하면 perldoc 문서를 읽을 수 있습니다. 이렇게 편리한 perldoc이지만 한 가지 아쉬운 점이 있다면 밋밋하게 단색으로 보여 현란한 웹에 익숙해진 현대인으로서는 읽기가 그리 편하지 않다는 점입니다. 지금부터 터미널을 좋아하는 텍스트 덕ㅎ.. 아니 여러분을 위해 perldoc 매뉴얼에 알록달록 색깔을 입혀보죠!
추출!
Seoul.pm 펄 크리스마스 달력이 시작된지도 벌써 4년째입니다. 매년 12월마다 크리스마스 바로 전 날까지 기사가 이어져 오며 펄은 물론 펄과 연관된 다양한 주제를 다루고 있습니다. 올해 역시 24개의 기사가 이어진다면 이제는 거의 100여개에 가까운 기사가 모이는 셈입니다. 매일 하나의 기사가 열리길 기다리며 클릭하는 즐거움은 크리스마스 달력의 취지에 맞기는 하나 첫 페이지에서 기사의 목록을 한 번에 훑어볼 수 있도록 시각적으로 제공하지는 않아 시간이 지난 후 특정 기사를 찾기는 여간 힘들지 않습니다. 편집진의 게으름 때문(!?)인지 올해까지도 여전히 전체 기사 목록은 제공되지 않고 있죠. "배고픈 자가 우물을 판다"라는 말도 있는데 Seoul.pm 펄 크리스마스 달력을 구미에 맞게 정리해볼까요?
Flot 다운로드
Flot 그래프 생성
CPU 사용률 확인
Mojolicious::Lite 웹앱 준비
1초 단위 갱신!
근래에 들어 HTML5와 CSS, 자바스크립트를 비롯 웹 관련 라이브러리들이 비약적으로 발전했습니다. 그래프만 해도 예전에는 서버의 자료를 서버의 자원 및 라이브러리를 이용해서 그래프를 이미지로 제작한 다음 이를 브라우저에서 보여주었다면 최근에는 미려하면서도 화려한 그래프 라이브러리를 사용해 클라이언트의 자원을 이용해 보여주곤 합니다. 유명한 대부분의 그래프 라이브러리는 Ajax 호출을 통해 자료를 얻어와 거의 실시간에 가깝게 그래프를 갱신해주는 기능을 포함하고 있죠. Flot 그래프 라이브러리와 Mojolicious 웹프레임워크를 조합해 CPU 사용률을 그래프로 표현하는 간단한 웹앱을 통해 실시간 그래프 그리기에 대해 감을 잡아 볼까요?
plenv vs perlbrew
perlbrew는 펄 커뮤니티 내에서 널리 사용되는 펄 설치 및 관리 도구입니다. Seoul.pm 크리스마스 달력에서 여러번 다뤄지기도 했죠.2011 - 열세번째 날: How to Use CPAN, Actually2011 - 열여섯번째 날: perlbrew, local::lib, smartcd 를 이용하여 Perl 환경 구축하기2013 - 셋째 날: 좋은 모듈을 고르는 좋은 방법 perlbrew 릴리스 이후 거의 4년 만에 강력한 라이벌인 plenv가 나타났습니다.
전체 흐름
첨부 파일 다운로드
실행 그리고 한계
소개해 드릴 내용은 지난 펄크리스마스 달력에도 여러 번 등장한 웹 이미지를 저장하는 스크립트입니다. 크리스마스 즈음이 되면 어김없이 찾아오는 스크립트입니다. 원래 신문 기사나 dcinside 등의 갤러리 글을 긁는 용도였지만, 지금은 모니터링으로 용도가 변경 되었죠. 그래서 이름이 dcmon입니다. 네! 여러분이 생각하는 그것! 일명 짤방 수집기가 맞습니다. 기존의 스크립트들과 비교해 최신 글을 모니터링하여 가져올 수 있다는 점이 약간의 차이겠군요. 우리가 잠을 자는 사이에 많은 글들이 생성되고 삭제되지요. :) 처음에 dcmon은 Python으로 시작하였으나 Python의 정규 표현식 및 urllib2의 처리 방식이 썩 마음에 들지 않아 Perl로 변경해서 구현하게 되었습니다. Python 버전을 포함한 전체 코드는 GitHub의 저장소에서 내려받을 수 있습니다.
유니코드와 length 내장 함수
유니코드와 \w 정규 표현식
유니코드 속성
유니코드의 스크립트
크리스마스 선물 #1: 사전에서의 언어구분
크리스마스 선물 #2: 본문 중간의 특수 문자 변경
유니코드(Unicode)는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 문자 집합입니다. 펄이라는 한국어 문자는 10진수 54148에 일대일 대응됩니다. 코드포인트(codepoint)라고 하는 이 숫자는 보통 앞에 U+를 덧붙인 16진수 형태로 표기합니다. 54148을 16진수로 표현하면 D384이며 유니코드 표현으로는 U+D384라고 씁니다. 정규 표현식을 사용하다보면 "한글과 영어를 분리하고 숫자와 문자등을 쉽게 파싱을 하는 방법은 없을까?"하는 고민을 자주하게 됩니다. 펄의 내부 유니코드 속성에 대해 조금 깊게 들여다 보고 유니코드의 속성을 활용해 조금 더 정확하고 효율적으로 정규 표현식을 활용하는 방법에 대해 알아봅니다.
system 내장 함수
역따옴표(`)
open 함수로 파이프 열기
Capture::Tiny
그 밖의 주의 사항
펄에서 외부 명령어를 실행시키는 방법은 여러 가지가 있습니다. system 내장 함수, ...처럼 역따옴표, open 내장 함수로 파이프(pipe)를 생성하는 방법 등이 있습니다. 이러한 방법의 동작과 차이점을 살펴보고 Capture::Tiny 모듈을 이용해 외부 명령어를 손쉽게 실행시키는 방법에 대해 알아봅니다. 외부 명령어를 펄을 통해 실행시킬 때는 표준 출력/오류의 방향과 외부 명령어가 반환하는 종료값을 인지해야 할 경우가 많습니다. 간단하게 기본적으로 제공하는 방법을 이용하지 않고 복잡하게 모듈까지 설치해서 외부 명령어를 실행하는지에 대한 의문은 각각의 차이점을 먼저 비교해보고 설명하겠습니다.
Plack::App::Directory
크리스마스 선물 #1: 미려한 디자인
크리스마스 선물 #2: 처리량
크리스마스 선물 #3: 간단한 실행
작업을 하다보면 가끔씩은 급하게 또는 간단하게 작업하고 있는 디렉터리 하부의 파일을 동료나 친구들에게 보내주거나 아주 잠깐 공유하고 싶을 때가 많곤 합니다. 보통 파일의 용량이 작을 경우 압축해서 이메일로 보내기도 하고 여유가 있다면 드롭박스와 같은 클라우드 저장소를 이용해 공유 후 링크를 보내기도 합니다. 아주 잠깐만 파일과 디렉터리를 공유할 때는 어느 쪽이든 조금 번거롭긴 합니다. 간단한 명령어로 현재 디렉터리를 상대와 공유할 수 있다면 얼마나 편리할까요? 펄로 간단히 파일을 공유하는 방법을 알아봅니다.
뼈대 코드 작성
데이터베이스 생성 및 연결
쓰기
읽기
수정
삭제
Helper 사용하기
펄에는 수 많은 웹프레임워크가 있습니다. 그 중 근래에 가장 많이 사용하는 프레임워크는 Catalyst와 Dancer, Mojolicious 세 가지 입니다. 복잡한 엔터프라이즈 환경은 Catalyst를 많이 사용하고 비교적 규모가 작은 웹 사이트는 Dancer나 Mojolicious를 많이 사용한다고 합니다. Mojolicious는 공식 홈페이지에 문서화가 잘 되있고 다루기 쉽다고 하지만 정말 아무 것도 모른채로 시작한다면 막히는 곳이 한 두 군데가 아닙니다. 문서를 보고도 어떻게 시작해야 될지 헤매실 분들에게 이 글을 바칩니다.
요구 조건
PDF::Reuse::Barcode
대량의 바코드
낭비되는 여백!
글꼴 지정 패치
최근 후원하는 단체의 내부 물류를 전산화하는 시스템을 구축하는 부분을 맡아 작업하며 관련해 돕고 있다보니 자연스레 바코드(barcode)를 다룰 일이 많아졌습니다. 덕분에 올해 크리스마스 달력 첫째 날 기사에서는 바코드를 HTML로 표현하는 기법을 다루었는데, 이 HTML 형태로 바코드를 표현하면 웹브라우저를 사용할 수 있는 환경이라면 데스크탑은 물론 스마트폰까지도 문제없이 화면에 나타낼 수 있는 점이 장점입니다. 다만 이렇게 HTML 형태로 나타낼 경우 HTML 자체가 출력에 특화된 형식이 아니다보니 원하는 위치에 정확히 몇 가지의 바코드를 이렇게, 저렇게 출력하는 것은 여간 어렵지 않습니다. 이번 기사에서는 대량의 바코드를 프린터 출력에 적합한 형식으로 생성해내는 기법을 다룹니다.
예전의 테스트 코드
그렇다면 어떻게 바뀌었나?
업계에 들어오고, 엉망진창인 테스트 코드를 쓰면서도 계속되는 고민은 어떻게 하면 테스트 코드를 잘 쓸 수 있을까?였습니다. 그렇다면 잘 쓴 테스트 코드는 과연 어떤 것일까요? 물론 제가 그것을 알고 있다면 이런 기사를 쓰고 있지는 않겠죠. 좋은 테스트 도구를 만나면 이전과는 다른 보다 좋은 테스트를 쓸 수 있지 않을까와 같은 나름의 결론을 내려보았습니다. 바로 Test::Mojo를 사용하면서 말이죠. 따라서 이 기사에서 다룰 테스트 어플리케이션은 Mojolicious로 만들어졌다는 것을 전제로 합니다.
데이터베이스 접속 준비
테이블 생성
웹 응용을 위한 설정 파일 생성
Mojolicious::Lite 어플리케이션
CREATE 핸들러 추가
명령줄에서 사용하기
간단히 DB를 사용할 수 있는 모듈인 DBIx::Simple을 소개합니다.
처음 실행해보기
Rexfile
VirtualBox 이미지 만들기
가상 머신 설정
가상 머신을 시작/중지하는 태스크 추가
공유 폴더 마운트
git으로 관리하기
가상화를 이용하여 개발 환경을 실제 운영될 서버 환경과 비슷하게 관리하는 일이 많아졌습니다. 개발자들의 데스크탑이 서로 다른 환경이더라도 가상화를 이용하면 개발 환경을 쉽게 통일할 수 있습니다. Rex/Boxes를 이용해 이런 가상 환경을 쉽게 설정하고 공유할 수 있습니다. 같은 작업을 하는 도구로는 Vagrant가 유명합니다.
문제 해결
사용해보자!
SIGNAL과 SLOT
화면 구성 #1
화면 구성 #2
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로 더 많이 작업한 편이라 친근하기도 하고 펄에서 널리 사용되 못하는 것 같아 소개해보려 합니다.
Gearman에 대하여
작업 내용
일반적인 순차 처리
Gearman으로 옮기기
소요 시간
최근에 다수의 압축 파일을 열고 내용을 확인하는 작업을 하게 되었습니다. 순차적으로 파일 하나하나를 처리하다보니 시간이 꽤 걸리길래, 혹시나 하는 생각에 Gearman을 사용해 보았고 생각 이상으로 효과가 좋다는 것을 알 수 있었습니다. 이 기사에서 그 예제 코드와 결과를 공유하고자 합니다.
"Modification of a read-only value attempted" 오류가 나는 흔한 경우
실제 사례
언제나 매개 변수나 반환값이 복사되어 전달되거나 모든 변수가 불변성을 갖는 다른 언어들과 달리, 펄에서는 변수가 단지 다른 값 또는 변수의 별칭(alias)으로 동작하는 경우가 있고, 이런 상황에서 그 변수의 값을 수정하려 시도할 때 예상하지 못한 결과를 낼 수 있습니다. 오늘 기사는 PerlMonks의 좋은 글 하나(Common Causes for "Modification of a read-only value attempted" by imp, 2006.9.1)를 번역하고 더불어 관련해 제가 겪은 문제에 대해서도 소개합니다.
실행 결과
2013년을 기준으로 대한민국의 스마트폰 사용비율은 약 70%를 이미 넘었다고 합니다. 일반 피처폰 신제품을 구경하기 힘든 것을 감안하면 이 비율은 앞으로 더 증가할 것을 예측할 수 있죠. 더불어 정확하지는 않지만 스마트폰 사용자 중 약 80%는 안드로이드 폰을 사용한다고 하구요. 안드로이드 폰의 가장 큰 장점은 구글의 행아웃(구 GTalk)을 기본으로 사용할 수 있다는 점입니다. 안드로이드 폰에서 행아웃은 SMS 서비스와 거의 유사하게 동작하기 때문에 중요한 정보를 전달하기에는 메일보다 조금 더 유리합니다. 회사에서 발생하는 여러가지 이벤트를 기본적으로는 메일을 통해 전달하고는 있지만 중요도에 따라 이 행아웃을 통해 추가적으로 보내줄 수 있다면 편리하지 않을까요? 예를 들어 서버의 상태를 감시하다가 대부분의 경우는 메일로 보내지만 심각한 수준이라면 행아웃으로 보낸다던가, 데일리 빌드가 실패한 경우 행아웃으로 보낸다던가 말이죠. :-)
당면한 문제
n-gram 알고리즘
String::Trigram 모듈
펄은 문자열을 다루는데 아주 효율적인 언어입니다. 제 경우 업무와 관련해 문자열을 다뤄야 할 일이 생기면 으레 use strict;으로 시작하는 펄 코드를 작성해서 간단히 해결하곤 합니다. 하지만 회사의 모든 사람이 펄이나 파이썬, 루비와 같은 프로그래밍 언어를 능수능란하게 다루며 스크립트를 작성해 문자열을 일관되게 다루는 것은 아닙니다. 회사에서도 대부분의 사람들은 이런저런 이유로 인해 직접 손으로 문자열을 다루는 것이 대부분입니다. 슬프게도 문제는 여기에서 비롯되죠. 문자열을 직접 사람의 손을 거쳐 다루게 되면 오타가 생기거나 원래 주어진 문자열을 주관을 가지고 해석해 다르게 사용하는 경우가 빈번합니다. 이렇게 재생산된 문자열을 다시 넘겨받아 원본 문자열과 비교해 사용한다고 하면 사소한 오타와 미묘한 단어의 재배치로 인해 간단한 정규표현식을 통한 문자열 일치로는 원본과 정확하게 일치시키지 못하는 경우가 태반입니다. 이런 경우 문제가 있는 부분을 사람이 눈으로 확인하면 쉽게 구분할 수 있지만 스크립트를 통한 자동화를 하기에는 애매하기 짝이없죠. 이번 기사에서는 이러한 상황을 극복하고 원하는 작업을 수행할 수 있도록 도와주는 알고리즘과 펄 모듈을 소개합니다.
전략
컴포넌트 준비
자료구조
그래프 유효성 점검
스케줄러 구현
지금까지 우리는 자동화를 할때면 스크립트를 작성하거나 모듈을 작성해 여러 군데에 적용해 일을 처리하곤 하죠. 허나 더욱 고난이도의 일을 처리하다보면 태스크 의존성을 고려해야 하는 경우가 많습니다. 이를 스크립트를 작성해서 처리하다보면 다른 곳에서도 같은 코드를 작성하게 되고 이런 패턴을 일일히 모듈화 해서 새로운 스크립트에 적용하여 작성하는 것도 번거롭습니다. 펄의 Graph 모듈과 DAG 알고리즘을 조합해 태스크의 의존성을 해결할 수 있는 스케줄러를 만들어보면 어떨까요?
레지스트리 변경
Logon 이미지 변경
로그온 화면 체크
만들어 봅시다
후기
아래 그림은 어떤 그림일까요? 윈도우 사용자라면 누구나 바로 알 수 있을 겁니다. :) 그림 1. 윈도우7 로그온 그림 (원본) 이 그림은 컴퓨터를 부팅한 뒤 Windows 7에 로그온할 때 나타나는 기본 로그온 그림입니다. 업체가 따로 설정하지 않으면 대부분 위의 그림으로 설정되어 있습니다. 이렇게 진부한 화면을 계속 보는 지루함은 도저히 견딜 수 없습니다! 지금부터 로그인 할 때마다 로그온 그림이 바뀌는 프로그램을 제작해 봅시다.
p5?
hubot?
p5-hubot?
p5-hubot은 쉽게 확장 가능한 IRC 봇입니다. 하지만 IRC에 국한되지 않고 다양한 프로토콜 환경에서 동작할 수 있습니다. p5-hubot을 소개하고 이를 사용하고 확장하는 방법에 대해 이야기합니다.
JSON 마샬링/언마샬링
실전!!
대부분의 사람은 동기적이기 때문에 많은 일을 하거나 많은 일을 맡길 때에도 동기적이려고 하며 동기적이길 기대합니다. 비동기적으로 일하기 위해서는 본능에 역행하는 노력이 필요합니다. 그러다보니 여러가지 IT 작업을 처리하다보면 자연스럽게 많은 일들을 동기적으로 처리하게 됩니다. 이것은 명확하며, 간결하고 이해하기 쉽죠. 하지만 때로는, 정말 때로는 어쩔수 없이 비동기적으로 처리해야 하는 일들도 있습니다. 요청에 대한 응답시간은 정해져 있는데 처음에 예상했던 것과 다르게 처리해야 할 것이 너무 많은 경우가 대표적인 경우입니다. 이 경우 최소한의 응답시간을 확보하기 위해 비동기로 일을 처리해야 하는데, 이 때 사용할 수 있는 가장 간결하고 손쉬운 방법이 바로 잡큐를 사용하는 것입니다. ...
목표
개요
개발 환경 및 전제조건
Dancer가 뭐야?
Dancer 실행 방법
잠깐!! PSGI/Plack 은 뭔가요?
관련 모듈 설치
이제 만들어 봅시다.
Dancer 살펴보기
Dancer config.yml 설정하기
설계
DB 테이블 모양
Perl DBI 사용하기
이미지 파일 위치
이제 달려볼까?
맺음말
데이터베이스에 저장된 정보를 가공해 웹 페이지에서 보여줍니다. 아래 네 줄로 요약된 과정을 위한 배경 지식과 설정 방법을 기술했습니다. {{{ $ cpanm Dancer DBI DBD::mysql # 관련 모듈 설치 $ dancer -a Myapp # 뼈대 만들기 $ cd Myapp; vim lib/Myapp.pm # Myapp.pm에 경로별 서브루틴 작성 $ ./bin/app.pl # 웹앱 실행, 브라우저로 접속 }}}
펄은 파싱할 수 없다: 형식적인 증명
정리: 펄 5 구문 분석은 결정 불가능하다
옮기며
아담 케네디는 PPI 문서에서 펄의 구문 분석(파싱)은 불가능하다고 추측했습니다. 그리고 이것을 어떻게 증명하는지 보였습니다. 아래에 이 엄격한 형식의 증명을 첨부하였습니다. 여기서 동적 구문 분석과 유사한 이슈는 제외하는 것으로 가정합시다.
Extension 만들기
Makefile.PL
Moran.xs
Moran.pm
test_moran.pl
FCGI with Perl
자연어처리의 기반 모듈은 C로 작성된 경우가 많습니다. 대표적인 것은 형태소 분석기인데, 최근들어 형태소 분석기를 Java, Python, Perl 등의 다른 언어에서 사용하고자 하는 요청이 늘어나고 있습니다. 특히, Perl의 경우 강력한 문자열 처리가 가능해서 일단 형태소 분석기의 Perl wrapper를 만들어둔다면 개발 속도 등 여러 측면에서 시너지가 날 것으로 예상됩니다. 이와 같은 배경에서, 이 글에서는 Perl의 XS(eXternal Subroutine)를 이용해 C 라이브러리를 Perl에서 사용하는 방법에 대해 기술합니다. 더불어 FCGI와 연동해서 WEB API를 작성하는 방법에 대해서도 살펴보고자 합니다.
M3U
그렇다면
시작과 동시에 만난 장벽: 아, 유니코드!
한 줄기 희망, Win32::Unicode
MP3 파일의 비트레이트 확인하기
또 하나의 산을 넘는 도구, Win32::GetANSIPathName
이제 진짜로 MP3 인코딩을...
보너스: 옵션 주기가 불편해! - GUI 인터페이스로 변경하기
완성!
참고 자료
주석
여러분의 하드 디스크에는 몇 곡의 MP3 파일이 저장되어 있나요? 컴퓨터나 휴대기기를 통해 음악을 들으시는 분들이라면 아마도 적지 않은 수의 MP3 파일이 저장되어 있을 겁니다. 저만 하더라도 거의 1만개가 넘는 수의 MP3 파일이 저장되어 있네요. 이렇게 관리하기도 힘든 숫자의 MP3 파일이 쌓여 있지만, 사실 우리가 실제로 컴퓨터나 휴대기기에 걸어 놓고 듣는 곡은 생각보다 그리 많지 않을 겁니다. 제 경우, 하드 디스크에 저장되어 있는 MP3 파일 중에 최근 1년 안에 한 번이라도 재생해 본 파일은 채 2천개가 안 되는 것 같네요. 그런데 자주 듣는 곡, 좋아하는 곡 위주로 음악을 듣다 보면, 디스크 어딘가에 자주 듣는 MP3 파일들만 모아놓는 폴더가 생기는 것이 보통입니다. 자연스러운 일인데 생각해 보면 이것이 비극의 시작입니다. 같은 곡이 여기저기 새끼를 치게 되는 시발점이 되거든요. 게다가, 처음에는 깔끔하게 정리된 MP3 저장 폴더 따로, 재생용 앨범 폴더 따로 잘 관리를 하겠지만, 나중엔 새로 다운로드 받은 MP3 파일이 재생용 폴더에만 휙 던져져 있다던가, 정리하다 만 파일들이 MP3 저장 폴더 내에 각종 새 이름(...)을 달고 너저분하게 어질러져 있다던가 하는 사태가 벌어지게 마련입니다. 결국 디스크 용량은 용량대로 낭비되고, 정작 원하는 파일을 찾기도 어려운 이중고에 빠집니다1. 네, 다 제가 겪은 일들입니다. orz
정신좀 차리고
MogileFS랑은 뭐가 다르지?
잡소리 그만하고 이제 시작해보죠
STF를 운영하는데 필요한 패키지들 설치
의존성있는 CPAN 패키지 설치
백그룹 잡을 위한 큐 준비
실행을 위한 환경설정
워커 프로세스 실행
관리자 UI 실행
스토리지 추가
UI에서 스토리지 구성
Dispatcher 실행
ReProxy 설정
관리자 UI에서 테스트
도전과제
벌써 여덟번째 날이 되었습니다. 오늘 소개하려는것은 STF입니다. STF는 원래 프로레스링의 기술 이름입니다. "Stepover Toehold Facelock"의 약자인데 번역하면 '발을 걸고난 뒤 얼굴을 건다'라는 의미입니다. 주로 마지막 기술로 쓰이는 관절기로써 넘어뜨린 상대의 다리를 다리로 잡은 뒤 돌아와서 머리를 잡아서 항복을 받아내거나 상대의 스테미너를 깍아내는 기술입니다. 원래 처음에는 STFU(Shut the Fxxx Up)라는 이름으로 불렸다는데 좀 순화해서 STF로 이름을 바꿨다는군요. 존 시나의 주요 끝내기 기술이라고 합니다.
perl-support.vim
뱀발 vim 플러그인 스크립트를 관리하는 방법 두 가지
그 외 팁
손에 맞는 개발환경은 보다 나은 효율을 약속합니다(꼭 그렇지만은 않습니다. 본말이 전도되어 개발환경을 위한 개발을 하게 되는 e___s 같은 에디터도 있습니다. (전.. emacs에 적응하지 못한 패배자입니다 T_T). 편집과 실행용 창을 각각 띄우고, 문서 참고를 위해 브라우저 실행해 구글 검색하고 하다보면 원래의 목적을 잊고 인터넷 서핑을 하고 있는 자신을 발견합니다. 개발에 집중하기 위한 환경, 그중에서도 vim을 사용할 때 쓸 수 있는 플러그인을 소개합니다.
작성할 파일
Ship.pm - 함선 정보를 담당하는 모듈 작성
wxGrid.pm - GUI폼에 그리드를 그려주기 위한 모듈 작성
main.pl - 프로그램을 실행하다!
여러분들 중에도 웹상에 떠도는 데이타를 내 수중에 넣고 요리해 보고 싶은 분들이 계실 것입니다. 제 경우, 최근 심취해 있는 대항해시대의 각 함선에 대한 레벨별 정보를 뽑아 그리드 형식으로 출력하는 프로그램을 한 번 만들어보았습니다. 이러한 작업은 CPAN에 있는 다양하고 유용한 여러 모듈들을 지니고 있는 Perl과 함께라면 아주 간단합니다. 저같은 초보도 잘 사용하기만 하면 뚝딱 만들어 낼수 있을 정도니까요~ 그럼 시작해 볼까요?
사용방법
Vroom 기능 알아보기
슬라이드 제작
Vroom -> PDF
PDF 변환 하기
마치며
파워포인트, 키노트, 프레지... 세상에는 정말 훌륭한 슬라이드 저작 도구가 많습니다. 한 해, 한 해 거듭할 수록 이런 도구들이 지원하는 효과는 화려해지고 미려해집니다. 하지만 그에 비해 익혀야 할 기능은 많고, 메뉴 목록을 보면 숨이 '턱'하니 막힐 것 같습니다. 간단한 발표자료를 만들기 위해 발표자료 저작 도구를 공부해야 한다니... 무릇 당연한 일 같지만, 또 한편으로는 무언가 비효율적인 것 같습니다. Perl 해커 중 한 명인 Ingy dot Net가 만든 Vroom은 그야말로 저와 같은 사람을 위한 슬라이드 저작 도구입니다! 자, 출발해볼까요? 부릉부릉~~ :)
시작하며 - 일반 서버로 초당 750000 쿼리를 초과한 이야기
SQL은 PK(Primary Key) 검색에 정말 좋을까요?
메모리 기반 작업에서 CPU 효율성은 중요합니다.
NDBAPI에 관하여 들어보셨습니까?
"HandlerSocket 플러그인" 개발하기 - NoSQL 프로토콜로 말하는 MySQL 플러그인
HandlerSocket 사용하기
HandlerSocket 설치하기
HandlerSocket 클라이언트 코드 작성하기
벤치마킹
HandlerSocket의 구성요소와 이점
주의점과 한계점
DeNA는 제품에서 HandlerSocket을 사용하는 중입니다.
대부분의 대규모 웹 응용프로그램들은 MySQL과 memcached를 사용합니다. 그 중 대부분은 TokyoCabinet/Tyrant 같은 NoSQL도 사용하고 있습니다. 몇몇 경우, 사람들은 MySQL을 배제하고, NoSQL과 구분해두었습니다. NoSQL이 MySQL보다 primary key 검색과 같은 단순 접근 패턴에서 훨씬 뛰어나다는 이유로 말입니다. 웹 응용프로그램들로부터 받는 대부분의 쿼리는 단순하기 때문에 이러한 결정이 합리적인 판단으로 보입니다. 다른 대규모 웹 사이트들처럼 DeNA도 몇 년 동안 동일한 문제를 갖고 있었습니다. 그러나 우리는 다른 결과에 도달하였습니다. 지금도 우리는 MySQL만 사용하고 있습니다. 물론 프론트엔드 캐쉬(예를 들어 전처리된 HTML, 조회/미리보기 정보 등)에서는 아직 memcached를 사용하고 있습니다. 그러나 여러 행을 캐쉬하는데에는 사용하지 않습니다. 또한 NoSQL도 사용하고 있지 않습니다. 왜냐고요? 그건 우리가 MySQL에서 다른 NoSQL 제품들보다 더 나은 성능을 얻어낼 수 있었기 때문입니다. 우리는 벤치마크에서 통상 MySQL/InnoDB 5.1 서버와 원격 웹 클라이언트로부터 초당 75만 쿼리를 얻을 수 있었습니다. 제품 환경에서도 놀라운 성능을 얻을 수 있었습니다. 여러분은 저 숫자가 믿기지 않으시겠지만, 이것은 실제 이야기 입니다. 이 긴 블로그 글을 통해 이 경험을 같이 나누길 바랍니다.
양타 군의 포스트잇
양타 군의 설치
양타 군의 라이브러리
양타 군의 문서
직접 만들어봅시다
프론트앤드를 만들자
모듈을 만들자
배포 가능한 모듈을 만들자
단일 실행 파일로 패킹하고 배포하기
단일 실행 파일이 자기 자신을 설치하기
패킹 작업을 자동화하기
양타 군은 외딴 초원사막 마을의 시스템 관리자입니다. 양타 군은 시스템 관리 프로세스가 복잡해지면서, 반복되는 작업을 자동화하고 싶었습니다. 시중에 있는 잘 알려진 도구가 좋은 선택이기는 했지만 자사의 환경에 맞지 않는 부분이 있었습니다. 어떤 것은 너무 컸고, 어떤 것은 너무 느립니다. 일부는 그대로 쓰되 일부는 직접 구현하여 사용하기로 했습니다. 유지보수 관리자에게 일을 넘기고 싶지는 않습니다. 문서는 간결하면 좋겠습니다. 다른 머신에 도구를 쉽게 배포할 수 있어야 합니다. 다른 사람이 그 도구를 받아도 쉽게 사용할 수 있으면 좋겠습니다. 양타 군은 이 모든 것을 해결하고 싶었습니다. 하지만 양타 군은 시간이 부족합니다. 수많은 관리 작업의 일부인 이것을 위해 정교한 도구를 만들며 시간을 버려서는 안됩니다. 대충 만들면 나중에 보틀넥이 될 것 같습니다. 우리의 마법사, 펄을 써야겠습니다! 편집기를 열고, 곧장 명령행 옵션 상세를 정하고, 로직을 작성합니다. 자원의 보고라 불리는 CPAN 해저를 탐색하고 수확한 라이브러리를 이리저리 붙입니다. 양타는 그렇게 순식간에 원하는 도구를 만들었습니다. 어떻게 만들었을까요?
시작하기 전에
준비 시작!
이 한자는 중국어, 광동어, 한국어, 일본어 훈독, 음독으로 어떻게 읽지?
이 일본어 문자는 어떻게 읽을까?
한국어를 어떻게 로마자로 변경할까?
중국어로 된 내용을 로마자로 된 한어병음(漢語拼音/汉语拼音)으로 바꾸는가?
오늘은 동아시아의 각 나라에서 쓰이는 언어들에 대해 로마자 표기에 대해 소개하겠습니다. 동아시아 각 나라의 문자 입력 방식은 아래와 같습니다.표 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)를 사용하는 국가에서는 한자와 자국어를 입력하기 위해 여러가지 입력방식을 사용한다는 것을 알 수 있습니다. 위의 문자들을 입력할때 한국어의 경우는 한글로 편하게 입력할수 있지만(로마자로도 입력 가능합니다), 중국어의 경우는 중국어를 입력하기 위해서 로마자로 표기를 한 후에 한자로 변환해서 입력을 해야하는 불편함이 있습니다. 일본어의 경우는 히라가나로 입력을 해도 한자로 변환해서 입력해야하는 부분이 있기 때문에 불편합니다. (로마자로 입력을 해도 한자로 변환하는 등의 불편함이 있습니다.) 이렇게 쓰고 보니 한글을 만든 세종대왕님이 존경스럽군요!
Gearman 소개
Gearman 구성요소
Gearman 서버 및 환경 구성하기
Gearman 실전
첫눈이 내리고, 어김없이 캐럴이 울려퍼지면, 거리에는 삼삼오오 소중한 사람들과 함께 즐거운 시간을 보내는 사람들로 북적거리는 연말이 찾아온 것을 느낄 수 있습니다. 하지만 모두가 즐거운 시간을 보내는 이 순간에도 원활한 서비스를 위해 누군가는 어딘가에서 묵묵히 일을 해야만 합니다. 크리스마스이브에 야근을 해야 하는 그 누군가가 여러분이 되지 않기 위해서는 그 일을 맡길 다른 사람을 얼른 찾아야 합니다. Gearman은 이런 우리의 고민을 해결해 줄 수 있는 근사한 해결책 중에 하나입니다. Gearman은 여러분이 작성한 일꾼을 밤낮으로 감시하며 언제든 원하는 일을 처리할 수 있는 환경을 제공해 줍니다. 일꾼은 항상 시킨 일을 묵묵히 할 뿐만 아니라 필요하면 언제든지 일꾼의 수를 늘리거나 줄일 수 있습니다. '일꾼1'과 '일꾼2'가 잡 큐 작업장에서 만나 비밀 사내 연애 끝에 결혼을 해 '일꾼3'을 출산하게 되어 육아휴직을 주어야 할 일도 없고, 임금인상이나 퇴직금을 요구하지도 않으며, 노조를 결성해서 파업할 걱정도 없으므로 회사를 경영하는 처지에서는 더할 나위 없이 좋은 대안입니다. 그리고 Gearman과 같은 잡 큐 방식의 구조를 빌릴 경우, 시간이 오래 걸리는 작업에 대해 병목이 되는 지점에 추가적인 작업을 더 할당해서 그 일을 병렬로 처리해 작업의 처리 효율을 높힐 수도 있고, 때로는 '서비스1'과 '서비스2'에서 반복적으로 사용하는 공통 기능 X를 각각의 서비스마다 중복해 구현하지 않고 외부에 두어 구조를 개선할 수도 있습니다.
Gearman::SlotManager
모듈 설치
워커 작성
gearmand 기동
SlotManager 작성 및 기동
SlotWorker에서의 AnyEvent
용빈님의 gearman 기초 덕에 요점만 쓸 수 있게 되어 기쁩니다^^ 용빈님++. 기어맨을 본격적으로 도입하셨나요? 손쉽고 깔끔하게 RPC와 맵리듀스를 구현한 뒤에 찾아오는 워커 관리 지옥을 겪어보셨나요? 저는 그 지옥을 보았습니다. 그래서 그 지옥에서 탈출하는 방법을 만들었고 공유드리고자 합니다. 기어맨 워커 운영시 겪게 되는 문제들은 이렇습니다. * 너무 많은 워커 * 너무 적은 워커 * 중복되는 코드 * 메모리릭 * 워커 프로세스의 종료
실험 환경
본격적으로
로그가 정말 남지 않을까?
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대면 됩니다.아주 정상적인 세션을 가집니다.공격이 끝나기 전까지는 로그를 남기지 않습니다.공격 대상은 서서히 말라 죽습니다.타겟이 아파치 서버의 아키텍쳐 자체에 있습니다. 그러므로 방어가 까다롭습니다. 위에 내용을 기억하시면서 보시면 더 재밌을 것 같습니다.
Urlader!
따라해봅시다
추출 및 패킹하기
실행해봅시다
Perl로 유용한 프로그램을 만들어서 누군가와 공유해서 쓰고 싶다면 어떻게 배포할지 고민하게 됩니다. 사용자가 Perl을 잘 아는 사람이면 "Perl을 설치하고 이 스크립트를 실행하라"고 쉽게 떠넘길 수 있지만 대다수 사용자들은 그냥 보통 실행 파일처럼 .exe 파일을 마우스로 클릭하면 모든게 알아서 실행되길 바랍니다. Perl을 단일 실행 파일로 만드는 방법은 PAR를 이용한 방법 등 다음과 같은 기존의 방법이 여럿 존재합니다.2011년 24일 펄 달력 기사의 마지막 "단일파일 배포 및 패키징" 섹션윈도우에서 Perl어플리케이션을 배포하는 방법에 대한 블로그 포스트 위에서 언급한 PAR 등의 패키징 툴을 이용하는 방법의 문제는 필요하지 않은 많은 파일들이 같이 패키징되어 용량이 너무 커지고 초기 실행 시 임시로 내부 파일을 압축 해제하게 되는데 그 시간이 다소 오래 걸린다는 단점이 있습니다. 또, 후자의 방법같이 launcher만 만들어 하는 방식은 실행 속도는 빠르나 내부 파일들이 그대로 노출되고 나열되어 좀 너저분해 보인다는 단점이 있습니다. 그러면 꼭 필요한 파일들만 추려서 단일 실행 파일 하나로 패키징하는 방법은 없을까요?
HTTP 부분 요청
컨셉
만들어봅시다
주의사항
하나 더
관리하는 서버가 미국에 있는 관계로 간혹 대용량 컨텐츠를 다운받는 시간이 업무의 많은 시간을 차지하는 경우가 있습니다. 그래서 때로는 screen 세션에 다운로드를 걸어두고 퇴근을 하거나, lftp의 mirror 옵션을 이용하여 병렬 전송을 이용하여 여러 개의 컨텐츠를 동시에 내려받곤 합니다. 그런데 간혹 단일 대용량 파일은 약간의 꼼수를 이용하기도 합니다. 즉, 대용량 파일을 64개로 분리하여 lftp 옵션을 이용하여 병렬 다운로드한 후 다시 합치는 것입니다. (lftp의 병렬 옵션 최댓값이 64입니다.) 서론은 걷어 버리고.. HTTP 컨텐츠를 빠르게 받을 수 있는 방법에 대해 소개해 보겠습니다.
들어가며
PSGI와 Plack은 무엇인가
설치
간단한 스크립트 예제
plack을 써서 구동하기
둘 이상의 스크립트를 사용해야 할 때
기타 사항
예전에 리눅스 서버에서 만든 CGI를 윈도우에서 써 보고 싶은데, 짧은 CGI 스크립트를 하나 쓰자고 Apache 웹 서버를 설치하는 건 과하다 싶었습니다. 그렇다고 요즘 많이 쓴다는 Dancer나 Mojolicious 같은 웹 프레임워크를 따로 배워서 새로 스크립트를 작성하자니 이것도 배보다 배꼽이 더 큰 느낌이었죠. 그런데 Plack을 사용하여 기존 CGI 스크립트를 그대로 실행할 수 있었습니다. 이 글에서는 간단한 예를 통해 그 과정을 설명합니다.
준비하기
실행코드
URL Link 체크하기
페이지 내려받기
초심자로서 Perl을 사용해 어떤 재미난 것을 할 수 있을까 생각해 봤습니다. 평소 IRC를 즐겨 하면서 고수들의 유익한 URL 링크가 공부에 많은 도움이 되고 있습니다. 여러 사정으로 인해 채널에 올라온 정보를 놓치는 경우가 많은데 POE::Component:IRC 모듈과 WWW::Mechanize::Firefox 모듈을 사용해서 평소 애용하는 Firefox로 보관해둘 수 있을 거란 생각이 들더군요. URL 링크는 언제든지 사라질 수도 있어 해당 페이지의 주요 정보를 Firefox로 고스란히 다시 읽어 볼 수 있게 해 보겠습니다.
시작하면서
마크다운
작업환경 구성하기
UI 화면 구성하기
본격적인 기능 구현하기
정리하기