HOSTEX SysAdminDay 2008
Kas kaltas?
Kas kaltas?
Sysadminai sako, kad ši programa yra kreiva, o programuotojai sako, kad kreivi patys adminai. Kas iš tiesų kaltas ir kaip išspręsti šią problemą?

Server version: Apache/2.2.3
mod_perl: 2.0

Serverio konfigūracija:

Alias /perl /var/www/perl
<Directory /var/www/perl>
 SetHandler perl-script
 PerlHandler ModPerl::PerlRun
 PerlOptions +ParseHeaders
 Options +ExecCGI
 allow from all
</Directory>

Programa:

#!/usr/bin/perl

use lib q(/var/www/lib);
use strict;
use CGI;
use Box;

my $q = CGI->new();

my $boxes = {};
my $items = {};

my $data = do { local( @ARGV, $/ ) = "/var/www/perl/data.txt" ; <> };

foreach my $it (split "\n", $data) {
my ($it_lb,$it_dt,$box_lb) = ($it =~ /^item:(.*), data:(.*), box:(.*)$/);
my $box = $boxes->{$box_lb};
$boxes->{$box_lb} = $box = Box->new($box_lb) unless defined $box;
my $item = $items->{$it_lb} = Box::item->new($it_lb,$it_dt);
$box->add_item($item);
}

my $it = $q->param('item');
print $q->header();
 if (exists $items->{$it} ) {
    print "item: '$it' in: '".$items->{$it}->in_box(), "' box\n";
 } else {
    print "there is no such item: '$_'\n";
 }
-------------------------------------------

Programerio biblioteka :) :
package Box;

sub new {
my ($proto,$label) = @_;
my $self = { label => $label, items => [] };
bless ($self,ref($proto) || $proto);
return $self;
}
sub add_item {
my ($self,$item) = @_;
push @{$self->{items}}, $item;
$item->{box} = $self;
}

package Box::item;
sub new {
my ($proto,$label,$data) = @_;
my $self = { box => undef, label => $label, data => $data };
bless ($self,ref($proto) || $proto);
return $self;
}
sub in_box {
my ($self) = @_;
return $self->{box}->{label};
}
1;

Taškai:
Teisingas atsakymas - 90 taškų.
Pirmasis teisingai atsakęs gauna papildomus 20 taškų.

Teisingas atsakymas:

Problemos esmė - nuoroda (reference) į programoje sukurtą objektą panaikinama bei atmintis atlaisvinama tik tada,
kai objektas yra nenaudojamas, t.y., nelieka jokių nuorodų į jį. Tuo tarpu, kai yra du objektai, kurie abu rodo vienas kitą, nuorodos nepanaikinamos.
Todėl Perl šiukšlių rinktuvas (garbage collector) neatlaisvina atminties. Kai programa veikia, naudojant fast-cgi (mod-perl), taip sunaudojama visa laisva serverio atmintis.

...Tačiau vienas dalyvis atsakė štai taip:
Atsakymas: Programuotojai

...ir štai taip pagrindė savo atsakymą:    
Vyrai, nesikankinsiu aš čia narpliodamas kažką. Manau, kad klaidą padarė programuotojai, nes šiandien/ryt švenčiam administratorių dieną ir būtų nelogiška kaltinti adminus per šventes, plius žinant kaip adminai nekenčia programerių, kurie pastoviai zirzia ir verkia.