2011/10/22

기록의 의미로 다시 정리해보는 CodeGolf 용 Perl one-liner

Code Golf는 어떤 주어진 문제를 코드의 우아함, 가독성 등등따위는 제껴두고 수단과 방법을 가리지 않고 되도록이면 짧게 프로그래밍 할수록 높은 점수를 얻는 게임이다.

예전에 풀어본 문제를 기록을 남기는 의미에서 다시 정리해봄

문제)
http://kldp.org/node/112089

예를 들어, A.csv는

1   2   3
4   5   6

B.csv는
2   3   4
5   6   7
라면 같은 위치의 요소끼리 사칙연산 하려면?
답)
같은요소끼리 더하기
$ paste A.csv B.csv | perl -alpe '$_="@{[map$F[$_]+$F[$_+@F/2],0..$#F/2]}"'
3 5 7
9 11 13
문제)
http://codegolf.stackexchange.com/questions/3095/paint-that-fence
Paint the fence.
 
각 라인은 S L C 의 형태로 되어있다. S는 시작위치 L을 길이 C는 색깔을 뜻한다.
(시작위치는 0부터시작)
다음과 같은 라인에 대해서 규칙을 적용해서 펜스를 칠해나가면 펜스의 색은
오른쪽과 같을 것 이다.

0 3 1                      111...........
2 4 2                      112222........
1 2 3                      133222........
0 4 1                      111122........
7 3 5                      111122.555....

다 칠하고 난 다음 어떤색의 펜스가 얼만큼 있는지 다음과 같이

1 4
2 2
5 3

출력하는 코드를 작성하라.
답)
$ cat input.txt
0 3 1
2 4 2
1 2 3
0 4 1
7 3 5

$ cat input.txt  | perl -anE '@a[$F[0]..$F[0]+$F[1]]=($F[2])x$F[1];END{$i[$_]++for@a;$i[$_]&&say"$_ $i[$_]"for 1..$#i}'
1 4
2 1
5 3


아마 Perl 아니면 이보다 짧게 만들 수 있는 언어는 없을듯...
(요즘 보니 J란 언어가 다크호스 같긴 하지만서도..)

2011/07/30

배트맨 공식 그래프 그리기

요즘 SNS에서 다음과 같은 배트맨 공식이라는게 회자되고 있어서
























저 공식이 진짜 맞는건지 검증해보는 차원에서 Gnuplot으로 한 번 그려봄






















Gnuplot의 한계로 외곽선만으로만 뽑아내는건 힘들었음(더 찾아보면 가능할 수 도)

플로팅 소스는 http://plotshare.com/index.ws/plot/538486810

2011/07/29

서울 100년만의? 폭우기념 Visualization(가시화)그래프

서울에 100년만의 큰비로 난리났다는 뉴스에 100년만이 맞는 말이냐 아니면 구라냐 말이 많다.
어떤 분은 기상청 싸이트에서 과거 서울 강우량 기록을 긁는 스크립트까지 만드셔서
자료를 긁어 놓으셨길래 숫자만의 나열로는 느낌이 와닿지 않아 약간의 데이터 가공을
거쳐 Gnuplot을 써서 heatmap형태의 그래프로 그려보았다.

서울강우량 스크랩프로그램 및 데이터: https://github.com/yy/koweather

Gnuplot 그래프를 온라인상에서 공유하게 해주는 Plotshare에 올린 그래프

http://plotshare.com/index.ws/plot/116537618

아래는 위 싸이트에서는 이미지 싸이즈를 지정해도 일정한 크기로만 생성해서 좀 더
보기 쉽게 크게 그린 그래프 이미지.(클릭하면 크게 보임)


그래프에서 y축은 년도 x축은 1년 365일중에 몇번째 날인지, 그리고 검은색~노란색점은 강우량(mm)정도를 나타낸다. 나머지 해석은 알아서 각자...

2011/07/25

MacOS X 풀어쓰기 한글 -> 모아쓰기 한글 변환 스크립트

개인적으로 맥을 별로 좋아하지 않는다.

그 이유중 몇개를 들자면 Unix like한 OS라고 하면서 파일시스템에서 대소문자를 구분하지 않는다는 것이고.. ( 예를들면 Perl에서 AnyEvent란 모듈을 사용하겠다고 use AnyEvent;가 아니라 use ANYEVENT; 라고 해도 에러가 없이 실행된다. 만약 이런걸 맥에서 개발해서 Linux서비스 서버에 올렸다고 생각해보라.. 어떤일이 벌어질지는 안봐도 비디오다. )

그리고  맥에서는 한글이 일명 풀어쓰기 포멧(NFD)으로 저장된다. 여기에 대해서는 http://namoda.springnote.com/pages/4922363 를 보면 자세하게 나와있다.

하지만 주변에는 많은 맥빠들이 존재하고 그들과 자료를 주고 받으려고 하면 문제들이 한둘씩 발생하게 된다는 것이다. 맥에서 한글파일명으로 저장한 파일들을 리눅스에서 받으면 경우에 따라 사용 터미널이 NFD에 대한 자모 조합을 지원해서 제대로 보이거나 보이기는 하나 이상하게 조합되서 보이거나 아예 쭉 풀어져 버리는등 결과를 종잡을 수 없다. 그래서 NFD형식으로 된 한글 파일명을 NFC형식으로 바꾸는 Perl 스크립트를 만들어 봤다.

아는 사람끼리 위 같은 맥의 특성을 풍자하여 "맥부기"라고 부르는데 착안하여 이름은 demacboogi.pl (de맥부기)로 하였다.



위에서 쓰인 모듈들은 Perl에서 기본적으로 포함되는 core모듈이라 별도로 모듈을 설치할 필요는 없음

2011/05/16

Perl 5.14 출시

2011년 5월 14일 Perl 5.14가 출시되었다.
5.14 버젼이기 때문에 5월 14일에 맞춰 출시했다는 소문이~

Perl 5.14 는 Unicode 6.0, IPv6 지원, 더 낮은 CPU,Memory사용, "package Name { ... }" 문법, non-destructive 정규식 지원등 많은 기능이 추가되었다.

공식릴리즈 포스팅:
http://news.perlfoundation.org/2011/05/perl-514.html

바뀐점 정리:
http://search.cpan.org/~jesse/perl-5.14.0/pod/perldelta.pod

여러 뉴스싸이트의 반응:
http://slashdot.org/story/11/05/14/2253215/Perl-514-Released
https://lwn.net/Articles/442938/
http://news.ycombinator.com/item?id=2549077
http://www.reddit.com/r/programming/comments/hbg40/perl_514_is_out/

2011/04/05

Any::Moose, Mouse, Moose

Perl 5에는 Moose라는 Python, Ruby도 울고갈 OOP프레임웍이 있다.

Moose는 많은 기능이 있는 반면 상대적으로 메모리를 많이 소비하고 속도가 약간 떨어지는 경향이 있다. 그래서 Moose의 모든 기능이 필요없을 경우 Mouse라는 Moose의 subset을 사용한다. 하지만 미래에 Moose의 기능을 확장 적용해야 할 경우를 고려하여 Any::Moose라는 모듈을 사용하면 사용자가 신경쓸 필요없이 알아서 최대한 빠른 것으로 적용해주므로 편리하다.

Moose와 Mouse(Any::Moose가 자동으로 최적화 했을때) 의 속도를 비교해 보았다.

Object Creation
322580.65/s  Any::Moose = Mouse
322580.65/s  Any::Moose Immutable = Mouse Immutable
 11655.01/s  Moose
212765.96/s  Moose Immutable

Accessor
6250000.00/s Any::Moose = Mouse
6250000.00/s Any::Moose Immutable = Mouse Immutable
2127659.57/s Moose
2127659.57/s Moose immutable

결론

__PACKAGE__->meta->make_immutable;
은 접근자의 속도에는 영향을 미치지 않으며
Moose의 객체생성속도에만 영향을 미친다.
Any::Moose를 쓰더라도 미래에 Moose 확장을 고려하여
기본 클래스 정의는


http://search.cpan.org/perldoc?Moose::Manual::BestPractices 의

package Person;

use Moose;  # 또는 use Any::Moose;
use namespace::autoclean;

# extends, roles, attributes, etc.

# methods

__PACKAGE__->meta->make_immutable;

1;

을 따르도록 하자.

2011/03/03

대규모 서비스를 지탱하는 기술





오늘 구입한 책..

자세한 정보는 http://jpub.tistory.com/122

이 책은 일본의 구글이라고 불리우는 Hatena의 엔지니어가 저술한 책의 번역판이다.
Hatena의 CTO이자 주 저자인 나오야 이토씨는 현재 Hatena를 떠나 GREE라는 회사로 이직했다. (GREE는 DeNA라는 회사와 함께 일본의 모바일 서비스 시장의 잘나가는 쌍두마차중 하나임)

이 책은 현대적인 대용량 서비스 인프라에 대한 개발/이론/관리 및 운영등에 관한 폭넓은 정보를 다루고 있어 IT인프라 교양서라고 불릴만하다.

일본은 이 책이 나온 Hatena와 함께 Mixi, DeNA, livedoor등의 주요 인터넷 서비스회사들이 Perl기반으로 구축된 경우가 많기 때문에 책에 나오는 예제 코드는 거의가 다 Perl이며 과거 CGI시절 PHP처럼 써 갈기던 조잡한 Perl코드가 아니라 숙련되고 잘 훈련된 프로그래머가 작성한 이른바 Modern Perl코드이기 때문에 현대적 방식의 Perl공부에도 도움이 된다.