─━ IT ━─

모듈을 사용하지 않는 간단한 액세스 카운터

DKel 2021. 8. 16. 01:07
반응형
먼저 안녕하세요 유우키 히로시 입니다.Perl하고 심플한 액세스 카운터를 만들었으므로 소개합니다.액세스 카운터는 GIF 의 화상으로서 출력합니다만, GD 등의 외부 모듈이나, GIF 파일은 사용하지 않습니다.그렇기 때문에 설치가 매우 간단합니다.대상 독자 이 기사는 Perl로 만든 CGI를 설치할 수 있는 독자를 대상으로 하고 있습니다.필요한 환경 Perl 5.6 이후를 사용해 CGI 가 동작하는 Web 서버가 필요합니다.Perl 표준 모듈 이외에는 모듈이 필요 없습니다.설치 방법 이번에 만든 액세스 카운터 counter.cgi 동작을 설명하기 전에 설치 방법을 설명하겠습니다.먼저 counter.cgi 중 아래 사항을 독자 환경에 맞게 수정하겠습니다.첫 번째 줄 Perl 처리계열 경로를 수정합니다.「#!」에 이어서, 독자의 Web 서버에 인스톨 되어 있는 Perl 처리계의 패스를 기술합니다.이하는 [/usr/bin/perl]에 설치되어 있는 경우입니다. #!/usr/bin/perl16행, 카운터파일의 경로를 수정합니다. 변수 $counter_file에 액세스수를 저장할 카운터파일의 경로명을 기술합니다.풀패스로 기술하는 것이 문제가 적을 겁니다.이 카운터 파일은 미리 만들어 놓을게요.내용물은 비워도 괜찮습니다.이하는 /usr/local/htdocs/mydir/counter.dat으로 파일을 만든 경우입니다.my $counter_file =′/usr/local/htdocs/mydir/counter.dat′;counter.cgi에 접근하기 위한 HTML 파일을 준비합니다.샘플로서 「sample.html」를 준비했습니다.이하의 img태그 안에 있는 src 속성에, counter.cgi 에 액세스하기 위한 URL을 기술합니다.다음은, 「http://example.com/counter.cgi 」로 액세스 하는 경우의 기술 예입니다.′(accesssrc=′http://example.com/counter.cgi′ />만약 블로그에서 사용될 경우, 보여주는 위치에 위와 같은 img태그를 넣어주세요.counter.cgi는 텍스트 모드로 웹 서버로 전송하고, 실행은 0755(rwxr-xr-x)로 하겠습니다.Web 서버의 설정에 따라서는 「0705(rwx--r-x)」가 아니면 움직이지 않는 경우도 있습니다.웹 서버 관리자에게 문의하세요.카운터 파일은, 텍스트 모드로 Web 서버에 송신해, 퍼미션은 「0666(rw-rw-rw-)」으로 합니다.HTML 파일은, 텍스트 모드로 Web 서버에 송신해, 퍼미션은 「0644(rw-r--r--r--)」로 합니다.이상으로 설치는 완료입니다.img 태그를 포함한 HTML 파일에 웹 브라우저로 접속하세요.Fig1과 같이 표시되면 완성됩니다 (이 그림은 6번 실행한 모습입니다).웹 브라우저 새로고침 버튼을 사용하여 개수가 계속 증가하고 있는지 확인하십시오.Fig2와 같이 표시된 경우에는 counter.cgi가 올바르게 동작하고 있지 않습니다.Perl의 패스나 퍼미션등을 확인해 주세요.Fig3 와 같이 「99」가 항상 표시되는 것은, 카운터 파일의 오픈에 실패했을 경우입니다.카운터 파일의 패스나 퍼미션을 확인해 주세요.액세스 카운터의 동작 액세스 카운터 counter.cgi의 동작을 간단하게 설명합니다.counter.cgi는 Perl로 쓴 150줄 안되는 스크립트로 웹 서버에서 CGI로 동작합니다.즉, 웹 클라이언트의 요청에 대해서 표준 출력에 콘텐츠를 출력하는 프로그램입니다.게시판이나 앙케이트, 회의실 등 「Web 페이지」로서 동작하는 CGI는, 출력의 Content-type가 「text/html」입니다만, counter.cgi 는 출력이 화상이기 때문에, Content-type 는 「image/gif」가 됩니다.counter.cgi에는 액세스 수를 카운트하고 있는 카운터 파일이 있습니다.그렇다고 해도, 그 내용은 지금까지의 액세스수가 텍스트로 기록되어 있을 뿐입니다.counter.cgi는 실행할 때마다 조회수를 파일에서 판독하고 거기에 적혀 있는 조회수를 이미지로 변환해 표준출력으로 내보냅니다.그리고, 액세스수를 1 증가시켜 카운터 파일에 써 되돌립니다.액세스 카운터의 기본적 처리는 counter.cgi안의 get_access_counter 함수로 하고 있습니다.sub get _ access _ counter {
my ( $ fname ) = @_;

if ( ! - e ( $ fname )) {
open ( FILE , ′ > $ fname ′ ) ;
close ( FILE ) ;
}

if ( open ( FILE , ′ + < $ fname ′ )) {
flock ( FILE , 2 ) ; # 2 = LOCK _ EX
seek ( FILE , 0 , 0 ) ;
my $ count = < FILE > + 1 ;
seek ( FILE , 0 , 0 ) ;
print FILE ′ $ count n ′ ;
flock ( FILE , 8 ) ; # 8 = LOCK _ UN
close ( FILE ) ;
return $ count ;
} else {
# File open error .
return 99 ;
}
}}이미지 출력 부분 이미지로 표시하는 액세스 카운터는 드물지 않지만, 많은 경우 Perl의 GD 모듈을 사용합니다.GD 모듈이 설치되어 있어야 합니다.이번에 만든 counter.cgi는 GD 모듈을 사용하지 않고, 자체 폰트 데이터를 스크립트 중에 해시% image로 가지고 동적으로 GIF를 합성하여 출력하고 있습니다.이 글꼴 데이터는 필자가 페인트 도구로 8x24 크기의 글자를 그리고 그 내용을 16진 덤프를 해서 만들었습니다.my % image = (
′ [ ′ = > ′ x08 x00 x18 x00 x00 x02 x17 x8C x8F xA9 x0A xDD x07
x56 x64 xB2 xD2 x9B x66 xB6 x1B x23 xFD x71 x9F x03 x2E
xE6 x89 x14 x00 ′ ,
′ 0 ′ = > ′ x08 x00 x18 x00 x00 x02 x1A x8C x8F xA9 x07 xED xBD
xA2 x9C x0E x01 x86 xCD xD5 x39 x6C xDF x7D x1E x34 x95
xE6 xF8 x90 xE7 x7A x14 x00 ′ ,
′ 1 ′ = > ′ x08 x00 x18 x00 x00 x02 x17 x8C x8F xA9 x07 xED xBD
xA2 x9C x01 x24 xB7 xAC xD2 x37 xDF x47 x85 xD4 x03 x8A
x26 x52 x00 x00 ′ ,
# 중략
′ 9 ′ = > ′ x08 x00 x18 x00 x00 x02 x1A x8C x8F xA9 x07 xED xBD
xA2 x9C x0E x01 x86 xCD x65 x55 xED xF0 x7D x20 x34 x95
xE6 xF8 x90 xE7 x7A x14 x00 ′ ,
′ ] ′ = > ′ x08 x00 x18 x00 x00 x02 x17 x8C x8F xA9 x07 x0D xFB
x54 x4C x13 x55 x06 xB3 xD4 x94 x5B x8F x6D x8C xB3 x94
xE6 x69 x14 x00 ′ ,
);문자열을 이미지로 변환하여 조립하는 것은 concat_gif함수입니다.여기서 부르고 있는 make_header 함수와 make_footer 함수는 각각 GIF의 헤더와 훅터를 만드는 것입니다.자세한 것은 GIF 의 사양과 스크립트를 참조해 주세요.sub concat _ gif {
my ( $ string ) = @_;
my $ result = ′′ ;
$ result . = & make _ header ( 8 * length ( $ string ) , 24 ) ;
$ result . = & make _ image ( $ string ) ;
$ result . = & make _ footer ;
return $ result ;
} make_image 함수에서는 주어진 문자열을 한 글자마다 split로 분해합니다.그리고 한 글자만큼의 이미지 데이터를 만들어 내는 make_subimage함수를 반복해서 호출합니다.# Create images .
sub make _ image {
my ( $ string ) = @_;
my $ step = 8;
my $ result = ′′ ;
my $ top = 0;
my $ left = 0 ;
foreach ( split ( // , $ string )) {
$ result . = & make _ control ( ) ;
$ result . = & make _ subimage ( $ left , $ top , $ _ ) ;
$ left + = $ step ;
}
return $ result ;
}make_subimage함수는 위치정보와 %image글꼴정보를 연결해서 반환만 하면 됩니다.# Create a GIF subimage .
sub make _ subimage {
my ( $ left , $ top , $ name ) = @ _ ;

# introducer
my $ result = ′ x2C ′ ;

# image left position , top position
$ result . = & pack _ xy ( $ left , $ top ) ;
$ result . = $ image { $ name } ;
return $ result ;
}}맞춤conter.cgi에서는 글꼴데이터를 내부에 안고 있으므로 자체를 변경할 수 없습니다.액세스 카운터로서 표시하는 숫자의 자리수는, 디폴트로 6 자리수가 되어 있습니다.이것은 main함수의 ′%06′ 부분을 바꾸면 변경할 수 있습니다. my $string = sprintf (′[%06d]′, $counter); counter.cgi가 읽고 쓰는 카운터파일을 바꾸면 여러 개의 액세스 카운터를 설치할 수도 있습니다.이는 변수 $counter_file에 줄 파일명을 외부에서 부여함으로써 가능해요.예를 들어, 액세스 카운터의 URL 뒤에 [? 카운터명]을 기술하는 것으로 하겠습니다.카운터명으로서 ′sports′를 부여한 예를 이하에 나타냅니다.′src=′http://example.com/counter.cgi?sports′ /> 아래에 counter.cgi의 수정 예를 보여줍니다. my $counter_name= $ENV{QUERY_STRING};
if ( $ counter _ name ! ~ / ^ [ a - z ] + $ / ) {
$ counter _ name = ′ counter ′ ;
}
my $counter_file=′/usr/local/htdocs/mydir/$counter_name.dat′; 위의 예에서는 카운터명으로 ′영소문자 열′만 허용하시고, 나머지는 ′counter′로 하셨습니다.이 처리는 보안상 중요합니다.외부로부터 주어진 카운터명을 그대로 파일명으로 해 버리면, 이쪽이 예기치 않은 파일을 마음대로 외부에서 만들어 버릴 우려가 있기 때문입니다.정리하여 Perl로 심플한 액세스 카운터를 만들었습니다.글꼴데이터를 스크립트 안에 가지고 있고 GIF를 자체적으로 합성하기 때문에 특별한 외부 모듈이 필요하지 않습니다.스크립트 그 자체는, Perl의 라이센스에 따라서 공개합니다.글꼴 데이터 자체도 필자가 만들었기 때문에 자유롭게 사용하셔도 되고요.Enjoy! 참고 링크 GIF (Graphics Interchange Format) 사양
GD모듈(cpan.org)
GIF 화상 연결 라이브러리(gifcat.pl) 「GIF 화상 연결 라이브러리」는, 외부 파일로서 준비된 GIF 화상을 연결하는 라이브러리입니다.이번 counter.cgi에서는 이 라이브러리를 사용하지 않았지만, 그 생각은 참고했습니다.감사합니다.
반응형