Recent Posts
Recent Comments
11-26 00:05
관리 메뉴

동글동글 라이프

irc 로그 분석 본문

개발자 이야기/Perl

irc 로그 분석

동글동글라이프 2009. 1. 8. 18:17
발단은 ... 웹 페이지에 아파치 기본인증이 걸려 있을 때,

코드상으로 어떻게 접근할 것인가? 에 대해서 이야기가 시작되었다.



내가 생각한 방법은 HTTP::Request 모듈을 사용하여

header에 베이직 인증을 포함시키는 방법이었다.

 
 my $request=HTTP::Request->new(GET=>'http://irc.perlog.org');
 my $ua=LWP::UserAgent->new;

 $request->header(
         'Authorization'=>'Basic id::pw',
 );


그리 나쁘지는 않은 방법이었지만

뭔가 찝찝한 기분이 들어 커뮤니티에 던져 보았더니 역시 keedi님의 코드...

 
 
#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $url   = 'irc.perlog.org';
my $port  = 80;
my $realm = 'Password!!';
my $id    = '';
my $pw    = '';

my $agent = LWP::UserAgent->new;
$agent->agent('HelloJEEN/0.01');
$agent->credentials(
    "${url}:${port}",
    $realm,
    $id => $pw,
);

my $response = $agent->get( "http://$url" );
die "Error getting from [$url]: ", $response->status_line, "\n"
    if $response->is_error;

print $response->content;

와우.. 깔끔한 코드..

그리고 기본인증을 해주는 credentials 라는 함수가 존재하고 있었다는.... 것을 배웠다.

이제 이것을 가지고... 뚝딱뚝딱 샤샤샥 해서...



2008년 결산 irc 로그 순위 구하기 프로그램 완성!

use strict;
use warnings;
use LWP::UserAgent;
use Encode qw/encode decode/;
sub _e{ encode('cp-949',decode('utf-8',shift)) };

my $url   = 'irc.perlog.org';
my $port  = 80;
my $realm = 'Password!!';
my $id    = '';
my $pw    = '';

my $agent = LWP::UserAgent->new;
$agent->agent('HelloJEEN/0.01');
$agent->credentials(
    "${url}:${port}",
    $realm,
    $id => $pw,
);

my %hash;
my @day = ("01".."31");
my @month = ("04".."12");

foreach my $x(@month){
	foreach my $y (@day){
		print "$x월 $y일 로그 분석중... \n";
		my $response = $agent->get( "http://$url/perl-kr/2008-$x-$y" );
		#	print "http://$url/2008-04-01/";
		my $page =  _e($response->content);
		my @pages = $page =~ m!\d\] <(.+?)>!g;
		foreach(@pages){
			s/_*$//gs; #닉네임 뒤의 _를 없앤다.
			$hash{$_}++;
		}
	}
}

my $file = "result.txt";
open my $fh, '>', $file or die "cannot open [$file] file: $!";

 
foreach(sort { $hash{$b} <=> $hash{$a} } keys %hash){
	print $fh "$_ : $hash{$_} \n";
	print"$_ : $hash{$_} \n";
}

원본 코드 : http://codepad.org/IMcef41i

시간은 좀 걸렸지만... 2008년동안 누가 가장 많이 글을 남겼는지 알 수 있었다.




1
2
3
4
5
6
7
8
9
10
JEEN : 76092 
cate^^ : 21145 
saillinux : 21115 
a3r0 : 20245 
하얀_고양이 : 13230 
keedi : 12390 
song : 11263 
h0ney : 9535 
pung96 : 8474 
yuni : 7768 


1위에서 10위까지만 출력해 보았다.

원본 확인 -> http://codepad.org/c1DNtZlb


1위는 압도한 차이로 JEEN님.. 어떻게 저런 횟수가 나올 수 있는지 -_-;;

2위는 cate^^ 님 역시~ irc를 꾸준히 지켜주시는 누님!

3위는 saillinux님 .. 오오옷!! 멋지신...

원래는 a3r0님이 3위인데.. 그 이유는 a3r0_X300 닉네임으로 2518번정도 로깅하셨기 때문!




통계를 냈더니 irc방에서 의견이 분분하게 나왔다.




[18:01:47] <keedi1> h0ney: 고생하셨습니다~ 한해 결산하니까 진짜 2008년이 다 간것 같네요~

[18:02:10] <keedi1> h0ney: 말회수보다 말 길이로 하면 더 신빙성이 있을수도 있겠죵~ :-)

[18:02:46] <keedi1> 비슷한 부류의 아이디는 정규표현식으로 하나로 묶어주고요
                                          아마 4글자만 같은것 정도면 충분할 것 같아요.

[18:03:01] <keedi1> 아니다 세글자여야겠네요. JEEN ZEEN 이런 경우도 있으니까.


keedi님이 의견을 제시하셨.... 여기까지 흠.. 한번 해봐야겠... 다고 생각하였으나;;

[18:03:23] <keedi1> except workd 에 office home 류는 빼버리고~

[18:03:30] <a3r0> h0ney: 컬럼도 좀 맞춰주세요

[18:03:33] <keedi1> h0ney: 생각보다 코드가 길어지겠는데요?

[18:03:39] <a3r0> : 의 위치를

[18:03:59] <keedi1> h0ney: 컬럼 맞추는 것은 템플릿 툴킷이나..
                                          printf 로.. 젤 닉이긴 사람 기준으로 하면 될듯...

[18:04:01] <cate^^> XML::LibXM 대하여 심도있게 공부를 좀

[18:04:18] <keedi1> 날짜별 시간대별로 그래프는 GD모듈로 0_0

[18:04:32] <keedi1> h0ney님 화이팅!

[18:05:04] <JEEN_> h0ney++

[18:05:30] <JEEN_> h0ney: 거기에 그날의 화제가 무엇인가 하는 것도 좀 알고 싶은 데요..

[18:05:35] <JEEN_> h0ney: 그것도 좀...



그날의 화제까지;;  그러면 통계가 아니게 되어버린다는..;;



[18:06:50] <a3r0> 아이디A: 아이디B 님 이렇게 누가 누구를 부른것도 그래프로 그려줬으면

[18:06:52] <keedi1> 음...

[18:06:55] <keedi1> a3r0: 오...

[18:06:58] <JEEN_> 저도 잠깐 갑의 입장이 되어보고 싶..

[18:07:00] <a3r0> 많이 불렀을 수록 화살표가 굵게

[18:07:02] <keedi1> a3r0: 좋은데요?

[18:07:08] <JEEN_> 서로서로 부르고 불렀을 대...

[18:07:16] <JEEN_> 사랑의 리퀘스트?

[18:07:18] <JEEN_> ;;

[18:07:20] <JEEN_> 아닌가..;;

[18:07:22] <keedi1> 흠!

[18:07:24] <a3r0> ㅎㅎ

[18:07:26] <cate^^> ㅡㅡ

[18:07:28] <a3r0> 서로간의 관심도

[18:07:31] <keedi1> 한글로 진님이라고 부르면 못 잡아주겠군요.



사랑의 리퀘스트까지 등장;;

다들 갑의 입장이 되고 싶었는지.. 한을 쏟아내시는듯;;



어쩌다 irc 로그 분석 프로젝트 회원 모집한다는...;;


'개발자 이야기 > Perl' 카테고리의 다른 글

Perl로 짠 IRC Bot  (1) 2009.01.13
역 해시 (Reverse Hash)  (4) 2009.01.11
정규 표현식에 대하여...  (6) 2008.12.29
플래시 게임을 즐기자.  (6) 2008.12.11
Goo::Canvas  (1) 2008.12.11
Comments