December 2008 Archives

Perl 6로 코딩해보기

| | Comments (0) | TrackBacks (0)
Parrot,Perl 6 프로젝트의 메인 개발자로 활약하고 있는 Patrick R. Michaud가 그 모양이 어느 정도 잡혀가자 Perl 6 Scripting Games라는 것을 제안했다. 그게 무엇이냐면 이제 머지않은 미래에 등장하게 될 Perl 6를 배워보기 위해 예전에 여기서도 소개한 적이 있는 MS Scripting Games의 문제를 Perl 6로 풀어보는 게 좋을 것 같다는 것이다.

일단 문제를 풀어 보려면 Parrot,Perl 6를 설치해야하는데 http://search.cpan.org/dist/parrot/ 에서 받아서 설치할 수 있다.

tar zxvf parrot-0.8.2.tar.gz
cd parrot-0.8.2
perl Makefile.PL
make
하면 기본 컴파일 과정은 끝나며
perl 6파일의 실행은
http://svn.perl.org/parrot/trunk/languages/perl6/README 을 참고하면 된다.

그리고 기본적인 Perl 6문법은 Perl 6가 꿈속에 있는 언어가 아니라 현 상태에서도 실제 동작하는 어플리케이션을 만들 수 있다는 것을 보여주려고 Perl 6로 만든 위키 소스인 http://github.com/viklund/november/tree/master/p6whttp://perlgeek.de/blog-en/perl-5-to-6/ 그리고 http://www.slideshare.net/brian_d_foy/learning-perl6-v05/ 를 보면 어느 정도 파악 가능하다.

일단 Perl 6문법을 위 링크들을 참고해서 대강 익히고 MS Scripting Games의 Advanced Division 1번, 2번 문제를 Perl 6로 풀어봤다.

기존에 Perl 5로 문제를 푼 코드와 Perl 6로 다시 푼 코드를 비교해보자.



<문제1> - http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/aevent1.mspx

[Perl 5]

#!/usr/bin/perl
use strict;
use warnings;

my $phone_number=<>;

my %button = ( A=>2, B=>2, C=>2,
               D=>3, E=>3, F=>3,
               G=>4, H=>4, I=>4,
               J=>5, K=>5, L=>5,
               M=>6, N=>6, O=>6,
               P=>7, R=>7, S=>7,
               T=>8, U=>8, V=>8,
               W=>9, X=>9, Y=>9,
             );

chomp $phone_number;

open my $fh, '<', 'C:\Scripts\wordlist.txt';
while ( my $line = <$fh>) {
    chomp $line;
    if ( length($line) != 7 or $line =~ m/ / ) { next; }
    my $num = join '', map { exists $button{uc $_} ? $button{uc $_} : () } split //, $line;
    if ( $phone_number eq $num ) {
        print uc($line)."\n";
        exit 0;
    }
}


[Perl 6]


use v6;

my $phone_number = $*IN.readline;

my %button = A=>2, B=>2, C=>2,
D=>3, E=>3, F=>3,
G=>4, H=>4, I=>4,
J=>5, K=>5, L=>5,
M=>6, N=>6, O=>6,
P=>7, R=>7, S=>7,
T=>8, U=>8, V=>8,
W=>9, X=>9, Y=>9,;

my $fh = open 'wordlist.txt', :r;
for =$fh->$line {
next if $line.chars != 7 || $line ~~ /\s/;
my $num = $line.split('').map( { %button.exists($_.uc) ?? %button{$_.uc} !! list() } ).jo
in('');
if $phone_number eq $num {
$line.uc.say;
exit 0;
}
}





<문제2> - http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/aevent2.mspx

[Perl 5]


use 5.010;
use strict;
use warnings;
use List::Util qw(sum);

my %score;
open(my $fh, "<", "C:/Scripts/skaters.txt") or die;
while (<$fh>) {
chomp;
my($skater, @scores) = split /,/;
@scores = (sort {$a <=> $b} @scores)[1..5];
$score{$skater} = sum(@scores) / 5;
}

my @ranking = sort {$score{$a} <=> $score{$b}} keys %score;
foreach my $metal (qw(Gold Silver Bronze)) {
my $skater = pop @ranking;
say "$metal medal: $skater, $score{$skater}";
}


[Perl 6]

use v6;

my %score;
my $fh = open 'skaters.txt', :r;
for =$fh->$line {
my $skater,my @scores = $line.split(',');
@scores = @scores.sort[1..5];
%score{$skater} = ([+] @scores) / 5;
}

my @ranking = %score.keys.sort( { %score{$^a} <=> %score{$^b} } );

for <Gold Silver Bronze> -> $metal {
my $skater = @ranking.pop;
"$metal medal: $skater, { %score{$skater} }".say;
}


위의 두 Perl 6코드는 실제로 현재버젼의 Parrot,Perl 6에서 동작하는 코드들이며
Perl 5를 잘 아는 사람이라면 Perl 5의 문법이 Perl 6에서 어떻게 변해서 적용되는지를
보면 매우 흥미로운 부분이 많을 것이다.

Perl 6는 이제 현실이다!





XKCD에 언급된 Perl

| | Comments (0) | TrackBacks (0)
XKCD는 미국에서 가장 인기있는 웹만화들 중 하나로 이공계열과 관련된 주제를 가지고 농담을 주로 하는데 가끔 오픈소스 쪽과 관련 있는 주제들을 다루기도 한다. 여기에 Perl도 주제로 몇 번 다뤄졌는데 최근에 또 Perl이 주제로 등장했다.



이것은 "11학년 활동에 있어 직업 성공을 위해 쓸모있는 것"을 나타내는 그래프인데, 11학년이라고 함은 미국 교육제도에서 대학입학준비를 위해 마지막으로 힘을 쓰는 단계로 어떤 다음 진로를 위한 마지막 단계를 뜻한다고 볼 수 있다.

이 만화를 그린 만화가(Randall Munroe)는 900시간의 수업, 400시간의 숙제보다 한 주말 동안 Perl과 부대끼는 것이 훨씬 쓸모가 있다는 것을 그래프로 보여준다.

그 외  Perl이 언급된 XKCD 몇 개를 들자면

<Regular Expression>


http://xkcd.com/208/


<Lisp>



http://xkcd.com/224/

이 있다.

마눌님 노트북 메모리가 512MB 밖에 안 돼서 512MB 추가해서 1GB를 만들어주려고 용산에 메모리를 사러 나갔다가 메모리 값이 X값이란 걸 알고 당장 메모리가 모자라지는 않지만 2GB 메모리가 꽂혀 있는 내 Thinkpad X300노트북에 2GB 모듈을 하나 더 추가하여 Dual Channel을 구성해보고자 메모리를 하나 더 질렀다.

Dual Channel은 디스크 RAID구성시 개개의 디스크 성능은 디스크와 연결되는 I/O bus의 속도를 따라가지 못하기 때문에 striping을 통해 여러 개의 디스크에 병렬로 I/O를 분산시켜서 I/O성능을 높이는 원리를(bus속도의 물리적 한계가 있기 때문에 striping 디스크 개수를 늘인다고 I/O성능이 무작정 늘어나는 것은 아님) 유사하게 CPU bus와 메모리 간에 적용한 것으로 보면된다.

더 자세히 알고 싶으면 http://www.kingston.com/newtech/MKF_520DDRWhitepaper.pdf 참고

뭐 자료를 찾다 보니 Dual Channel의 이론상 성능은 2배이나 실제 성능을 벤치마크해보면 그 향상 효과가 미미하다는 말을 들었지만 궁금한 건 일단 직접 테스트해봐야 적성이 풀리는 지라 직접 한 번 Dual Channel을 구성했을때와 그냥 메모리 하나만 썼을 때를 비교해봤다.

사용한 메모리는 삼성의 DDR2-667 PC-5300 2GB 모듈 2개이고 이 메모리의 스팩상 최대 대역폭은 5333MB/s 이다.

메모리 성능 테스트에 사용한 벤치마크 프로그램은 Memspd2k이며 그 결과는 다음과 같다.


mem_bench.jpg
역시나 소문대로 눈에 띄는 성능차이는 보이지 않았으며 전체적 평균은 single:dual_channel = 3251.957:3441.216 로 dual channel이 약 5.8%의 성능 향상이 있었고 64kb사이즈의 메모리 테스트에서 single:dual_channel =3520.222:4065.667 로 가장 높은 15.49%의 성능 차이가 발생했다.

여기서 얻을 수 있는 교훈!
PC든 서버든 주변장비든 업체가 제공하는 스팩상 성능은 코에 걸면 코걸이 귀에 걸면 귀걸이이므로 직접 확인해보기 전엔 곧이 곧대로 믿지 말자.

Wanna Kill Perl?

| | Comments (2) | TrackBacks (0)
얼마 전 영국 BBC 방송국에서 근무하는 Ovid(Curtis Poe)라는 Perl 해커가 use Perl싸이트에 Perl5 is dying 이라는 약간의 투정 섞인 글을 올려서 이슈가 되었다. TIOBE라는 프로그래밍 언어 사용순위를 매기는 싸이트에서 Perl이 순위가 Python에게도 밀리며 떨어졌고 계속 하락 중이라며 뭔가 변화가 있어야 한다는 말인데... ( 뭐 Perl 뿐만아니라 Python,Ruby도 같이 떨어졌고 Delphi가 치고 올라오는 것 보면 신뢰성이야 안 봐도 뻔하지만, 이제 이런 걸 가지고 무슨 무슨 다른 싸이트들의 근거자료를 들어가며 일일이 반박할 가치도 없다고 본다.)

이글이 리눅스관련 뉴스를 다루는 LWN에 인용되어 실렸고 코멘트가 90개 이상 달리면서 Perl빠, Python빠, Ruby빠 등등이 우글거리며 서로 까고 까이는 스크립트 언어 종교전쟁이 일어났다. 주제가 Perl이다 보니 Perl이 전생에 무슨 죄를 지었기에 타 언어빠들의 협공을 받으며 제일 많이 까이고 있고 ( 프로그래밍 언어 종교전쟁이야 답도 끝도 없는 소모전이지만 이런 걸 보고 있으면 재미있는 건 사실이다. )

기사 URL:  http://lwn.net/Articles/309375/

코멘트들을 보다 보니 요즘 fedora, ubuntu 등의 배포본에 포함된 프로그램/유틸리티들이 python으로 되어 있는게 제일 많다느니 배포본에 포함된 각 스크립트 언어들의 모듈/파일 수를 카운트해보니 어떤 언어가 제일 많다느니 뭐가 최고다 이러면서 싸우는데 여기에 가장 공정해 보이는 방법을 제시한 코멘트가 있어서 그 방법을 주변의 각종 리눅스 배포본에서 돌려 보았다.

위에서 말한 가장 공정한 방법이란 다음과 같다.


#!/usr/bin/perl
use strict;

my %languages;
for( grep !m{^/home}, split /:/, $ENV{PATH} ) {
  for( <$_/*> ) {
    $_ = do { <F> if open F, '<', $_ };
    unless (/^#!/) {
        $languages{bin}++;
        next;
    }
    $languages{$1}++ if /\b(perl|php|python|ruby|sh|bash)\d*\b/;
  }
}
printf "%-20.20s  %6d\n", $_, $languages{$_} for sort keys %languages;


이 Perl 코드는 시스템에 PATH로 잡힌 디렉토리들의 실행파일 명령들에서 첫 줄이 #!로 시작하는 shebang line 이면 그 해석기가 어떤 스크립트인지를 카운트해서 프린트해주는 것이다. 원래 코드에는 bin(순수바이너리),sh,bash가 없는데 본인이 추가했다.

그럼 결과를 한 번 보자.

<Ubuntu 7.10 서버>
bash                      44
bin                     1883
perl                     396
python                    38
sh                       207

<Ubuntu 8.04 데스크탑>
bash                      83
bin                     3454
perl                     542
php                        2
python                   229
ruby                      14
sh                       654

<Ubuntu 8.04 서버>
bash                      54
bin                     1870
perl                     319
python                    52
ruby                      46
sh                       281

<Ubuntu 8.10 서버>
bash                      28
bin                      852
perl                     152
python                    30
sh                       145

<Redhat Enterprise 4>
bash                      44
bin                     1883
perl                     396
python                    38
sh                       207

이건 뭐
No pain, No gain 이 아니라 No Perl, No Linux 라고 해야 할 듯.

Microsoft와 윈도우용 비상업적 Perl배포본으로 개발되고 있는 Strawberry Perl이 CPAN의 호환성을 높이고자 손을 잡기로 했다고 한다.

Strawberry Perl은 ActiveState사의 Perl배포본이 상업적 배포본이고 자체적인 ppm이라는 바이너리 패키지를 쓰는 것과는 달리 CPAN을 통해서 직접 모듈을 설치해주는 기능을 가지고 있는데 LINUX나 FreeBSD같은 UNIX류가 아닌 Windows같은 운영체제에서는 호환성 문제 때문에 모듈이 제대로 설치되지 않는 경우가 가끔 있다. 이런 문제점을 해결하려면 CPAN모듈 제작자가 실제 해당 운영체제 환경하에서 직접 테스트하고 고치는 것이 가장 빠른 방법이나 다양한 운영체제환경을 개인적으로 구성하고 테스트한다는 것은 힘든 일이다.

Strawberr Perl의 제작자인 호주의 Adam KennedyYAPC::NA 2008에서 MS opensource lab에 근무하는 직원을 소개받았는데 그가 Strawberry Perl을 도와줄 방법에 흥미를 가지고 있다는 것을 알았고 2주후 OSCON 2008에서 MS의 OpenSource정책을 총괄하는 Sam Ramji를 만나 이러한 문제들을 얘기하고 도움을 요청했는데 MS에서 그것을 받아들여서 현존하는 모든 버젼의 Windows 운영체제를 포함하는 가상머신 환경을 모아서 만들고 CPAN 모듈 제작자들에게 자유로운 접근을 허용할 것이라고 한다.

이런 Microsoft의 공식적인 지원에 의해 Perl이 그 강점이자 밑바탕이 되는 거대한 모듈저장소인 CPAN의 호환성을 더욱 높임으로써 앞으로 Windows 환경에서 Perl사용이 더욱 쾌적해지리라 기대된다.

자세한 내용은

http://use.perl.org/~Alias/journal/38036

http://tech.slashdot.org/tech/08/12/06/227246.shtml

About this Archive

This page is an archive of entries from December 2008 listed from newest to oldest.

November 2008 is the previous archive.

January 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Creative Commons License
This weblog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en