SVG Essentials | ||
use warnings; use strict; use File::Find; my @file_sizes; # array of file sizes my $total_files; # number of files in directory # and its subdirectories my $max_file_size; # maximum file size그리고 나서 분석할 디렉토리 이름이 올바르게 주어졌는지 검사합니다.
if (scalar @ARGV != 1) { print "Create SVG diagram showing file size ", " distribution for a directory\n"; print "Usage: $0 directory\n"; exit(0); }다음으로 프로그램은 카운터 변수를 초기화하고 디렉토리를 검색합니다.
$total_files = 0; $max_file_size = 0; find(\&accumulate, $ARGV[0]);아래에는 데이터를 수집하는 accumulate라는 함수가 있습니다. 이 함수는 파일의 총 개수와 가장 큰 파일의 크기를 기록하고, 모든 파일 크기는 file_size라는 배열에 저장합니다.
sub accumulate { my @info; if (-f $_) { @info = stat($_); push @file_sizes, $info[7]; if ($info[7] > $max_file_size) { $max_file_size = $info[7]; } $total_files++; } }그래픽 만들기
히스토그램 그래프
print <<"SVG_HEAD";그리고 나서 그림의 치수를 결정합니다. 작업을 편하게 하기 위해 ViewBox를 설정하였는데, 이는 SVG 좌표계의 한 단위가 컴퓨터의 한 픽셀과 동일하게 해주는 역할을 합니다. preserveAspectRatio 속성은 그래프가 항상 보이는 영역(viewing area)의 왼쪽 윗부분에 나타나게 하기 위해 설정되었습니다.
주요한 항목(root element)은 제목(title)과 설명(description) 다음에 나옵니다.
이제 우리는 나중에 분할할 빈 막대를 정의할 것입니다. 그리고 파일 크기 영역의 매 10퍼센트마다 회색 구분선을 표시하기 위해 회색 바를 정의할 것입니다. 작업을 편하게 하기 위해 바의 길이는 600 유닛으로 높이는 20유닛으로 하겠습니다. 빈 막대는 600 * 200 영역에서 0.5 유닛의 outset을 가지고 있으며, 이는 한 유닛으로 선을 그을 때(stroke) 그 외곽선이 데이터를 표시하는 영역과 겹치지 않게 하기 위해서입니다. 마찬가지로 회색 구분 선도 선긋기 폭을 0.5 유닛으로 설정합니다.File sizes for $ARGV[0] Distribution of file sizes of $ARGV[0] and its subdirectories
이제는 데이터에 종속적인 그래픽 부분을 그릴 준비가 되었습니다. 이를 위해 아래와 같은 몇 가지 변수가 필요합니다.SVG_HEAD
my $size; # 각 파일의 크기 my $i; # 여러군대의 반복문에서 쓰이는 카운터 my $x; # 크기 영역의 x 오프셋 my $pct_count; # 영역에 있는 파일의 % my $hue; # 영역의 파란색 정도(파일 퍼센트) # 100과 동일 my @slots; # 각 영역에 있는 파일의 개수첫번째로 해야할 일은 모든 파일 크기를 조사한 뒤에 파일 영역의 1 퍼센트 영역에 그것들을 분배하는 일입니다. 여기서 100% 영역에 있는 값을 99%영역으로 집어 넣었는데, 이는 0부터 100까지 101개의 영역이 있기 때문입니다.
foreach $size (@file_sizes) { $pct_count = int(100 * $size/$max_file_size); if ($pct_count == 100) { $pct_count = 99; } $slots[$pct_count]++; }그리고 나서 원점에서 그래프를 옮길 것입니다. 이는 다음과 같은 펄 문장으로 할 수 있습니다.
print qq!다음 과정은 디렉토리 이름과 그 디렉토리에 있는 전체 파일의 개수를 표시하는 것입니다. 아래에 이를 표현하는 SVG 코드가 있습니다.\n!;
위와 같은 SVG 코드를 생성하기 위해서는 다음과 같은 펄 소스코드가 필요합니다.directory ($total_files files)
print qq!이제 모든 슬롯을 돌면서 해당 슬롯에 파일이 있다면 적당한 파란 사각형으로 색을 입힐 것입니다. 이를 위해 우리는 파란색을 100퍼센트로 설정하고 파일의 수에 반비례하여 채도를 떨어뜨릴 것입니다. 빨간색과 녹색의 수치를 결정할 때 100이 아닌 95에서부터 빼서 계산했는데 이는 작은 수의 파일이 있는 영역의 색이 아무 파일도 없는 흰색과 구분될 수 있도록 하기 위해서입니다.\n!; print qq!\t \n!; print qq!\t\t$ARGV[0] ($total_files files)\n!; print qq!\t \n!;
아래에 모든 영역의 사각형을 생성하기 위한 펄 코드가 있습니다.
for ($i=0; $i < 100; $i++) { next if (!$slots[$i]); $hue = 95 - int(100 * $slots[$i]/$total_files); if ($hue < 0 ) { $hue = 0; } $x = $i * 6; # display the rectangle print qq!\t이제 우리는 영역을 둘러싸고 있는 막대와 구분자를 그릴 것입니다.\n!; }
print qq!\t\n!; print qq!\t\n!;마지막으로 우리는 킬로바이트에서 파일 크기와 함께 바에 레이블을 달아야 합니다. 우리는 오른쪽, 가운데, 맨 끝만 레이블을 달 것입니다.
print qq!\t다음 펄 코드는 SVG 요소를 닫습니다.\n!; print qq!\t\t \n!;!; print "0"; print qq! \n!; print qq!\t\t!; print int($max_file_size/2048), "k"; print qq! \n!; print qq!\t\t!; print int($max_file_size/1024), "k"; print qq! \n!; print qq!\t
print qq!\n!; print qq!\n!;아래의 그래프는 이 프로그램을 /usr/include 디렉토리에 적용시켰을 때의 결과입니다.
히스토그램 그래프
이러한 SVG 코드를 만들기 위한 펄 코드는 다음과 같습니다. 이는 for 루프에 들어갈 것이고 결과 그래프는 다음과 같습니다.437 5
if ($slots[$i] < 10) { print qq!\t$slots[$i] \n\n!; } else { print qq!\t$slots[$i] \n\n!; }
각 섹션에 파일의 개수가 있는 히스토그램
PNG와 JPG에서 확대했을 때의 모습
SVG에서 확대했을 때의 모습
이전 글 : Castor를 이용한 XML 데이터 바인딩
다음 글 : 솔라리스 8, 과연 얼마나 안전한가?
최신 콘텐츠