Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

The Monastery Gates

( #131=superdoc: print w/replies, xml ) Need Help??

Donations gladly accepted

If you're new here please read PerlMonks FAQ
and Create a new user.

New Questions
DBI with SQLite vs DBIX::Class search failing
No replies — Read more | Post response
by ghenry
on Oct 23, 2019 at 09:01

    Hi all,

    I'm bashing my head around why this isn't working. Here are some tests:

    #!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use Test::More tests => 2; use_ok 'API::Schema'; my $dsn = "dbi:SQLite:api.db"; my $apidb = API::Schema->connect($dsn); my $ddi_available = $apidb->resultset('CompleteNumberE164View')->find( { ddi => 441224900999, is_used => 0 } ); note 'DDI found: ' . $ddi_available->ddi; ok( $ddi_available->ddi eq '441224900999', 'Found available DDI.' );

    Running it gives:

    DBIC_TRACE=1 prove -l t/47-find_unused_number.t t/47-find_unused_number.t .. 1/2 SELECT me.ddi, me.area_code, me.local +_number, me.number_quality, me.is_used FROM complete_number_e164 me W +HERE ( ( me.ddi = ? AND me.is_used = ? ) ): '441224900999', '0' Can't call method "ddi" on an undefined value at t/47-find_unused_numb +er.t line 18, <DATA> line 1. # Looks like your test exited with 2 just after 1. t/47-find_unused_number.t .. Dubious, test returned 2 (wstat 512, 0x20 +0) Failed 1/2 subtests Test Summary Report ------------------- t/47-find_unused_number.t (Wstat: 512 Tests: 1 Failed: 0) Non-zero exit status: 2 Parse errors: Bad plan. You planned 2 tests but ran 1. Files=1, Tests=1, 1 wallclock secs ( 0.02 usr 0.01 sys + 0.62 cusr + 0.03 csys = 0.68 CPU) Result: FAIL

    with DBI_TRACE=1

    DBI_TRACE=1 prove -l t/47-find_unused_number.t t/47-find_unused_number.t .. 1/2 DBI 1.630-ithread default trace l +evel set to 0x0/1 (pid 6958 pi eda010) at DBI.pm line 288 via DBI.pm +line 1516 -> DBI->connect(dbi:SQLite:api.db, , ****, HASH(0x2e04be0)) -> DBI->install_driver(SQLite) for linux perl=5.014002 pid=6958 ru +id=500 euid=500 install_driver: DBD::SQLite version 1.46 loaded from /usr/local +/lib/perl/5.14.2/DBD/SQLite.pm <- install_driver= DBI::dr=HASH(0x3158860) <- default_user(undef, undef, ...)= ( undef undef ) [2 items] at D +BI.pm line 659 <- connect('api.db', undef, ...)= ( DBI::db=HASH(0x31590b8) ) [1 i +tems] at DBI.pm line 671 <- STORE('RaiseError', 1)= ( 1 ) [1 items] at DBI.pm line 723 <- STORE('PrintError', 0)= ( 1 ) [1 items] at DBI.pm line 723 <- STORE('AutoCommit', 1)= ( 1 ) [1 items] at DBI.pm line 723 <- STORE('ShowErrorStatement', 1)= ( 1 ) [1 items] at DBI.pm line +726 <- STORE('Username', undef)= ( 1 ) [1 items] at DBI.pm line 726 <- connected('dbi:SQLite:api.db', undef, ...)= ( undef ) [1 items] + at DBI.pm line 733 <- connect= DBI::db=HASH(0x31590b8) <- STORE('dbi_connect_closure', CODE(0x31586c8))= ( 1 ) [1 items] +at DBI.pm line 742 <- FETCH('Active')= ( 1 ) [1 items] at DBI.pm line 1522 <- FETCH('HandleError')= ( undef ) [1 items] at DBI.pm line 1533 <- FETCH('RaiseError')= ( 1 ) [1 items] at DBI.pm line 1540 <- STORE('HandleError', __DBIC__DBH__ERROR__HANDLER__=CODE(0x31b80 +c0))= ( 1 ) [1 items] at DBI.pm line 1508 <- FETCH('AutoCommit')= ( 1 ) [1 items] at DBI.pm line 1561 <- prepare_cached('SELECT me.ddi, me.area_code, me.local_number, m +e.number_quality, me.is_used FROM complete_number_e164 me WHERE ( ( m +e.ddi = ? AND me.is_used = ? ) )', HASH(0x31c5130), ...)= ( DBI::st=H +ASH(0x31c8ee8) ) [1 items] at DBI.pm line 1850 <- bind_param(1, 441224900999, ...)= ( 1 ) [1 items] at DBI.pm lin +e 1891 <- bind_param(2, 0, ...)= ( 1 ) [1 items] at DBI.pm line 1891 <- execute= ( '0E0' ) [1 items] at DBI.pm line 1836 <- fetchrow_array= ( ) [0 items] row-1 at DBI.pm line 2587 <- finish= ( 1 ) [1 items] at DBI.pm line 2593 Can't call method "ddi" on an undefined value at t/47-find_unused_numb +er.t line 18, <DATA> line 1. sqlite trace: Finalizing statement: 31d0ef8 at dbdimp.c line 1175 sqlite trace: Removing statement from list: 31d0ef8 at dbdimp.c line 1 +188 <- DESTROY(DBI::st=HASH(0x31c5238))= ( undef ) [1 items] at DBI.pm + line 261 sqlite trace: Closing DB at dbdimp.c line 510 sqlite trace: rc = 0 at dbdimp.c line 512 <- DESTROY(DBI::db=HASH(0x3159010))= ( undef ) [1 items] at DBI.pm + line 261 <- disconnect_all= ( '' ) [1 items] at DBI.pm line 750 # Looks like your test exited with 2 just after 1. ! <- DESTROY(DBI::dr=HASH(0x3158860))= ( undef ) [1 items] during gl +obal destruction t/47-find_unused_number.t .. Dubious, test returned 2 (wstat 512, 0x20 +0)

    If I run that search by hand, it is found:

    sqlite3 api.db sqlite> SELECT me.ddi, me.area_code, me.local_number, me.number_qualit +y, me.is_used FROM complete_number_e164 me WHERE ( ( me.ddi = '441224 +900999' AND me.is_used = '0' ) ); 441224900999|1224|900999|gold|0

    I've written another test without DBIx::Class, which passes no problem, but I can't see any difference with trace on:

    #t!/usr/bin/env perl use strict; use warnings; use Test::More tests => 1; use DBI; my $dsn = "dbi:SQLite:api.db"; my $dbh = DBI->connect($dsn); my $sth = $dbh->prepare( 'SELECT me.ddi, me.area_code, me.local_number, me.number_quality, me.i +s_used FROM complete_number_e164 me WHERE ( ( me.ddi = ? AND me.is_used = ? ) )' ); $sth->bind_param(1, 441224900999); $sth->bind_param(2, 0); $sth->execute(); my $ddi_available; while ( my @row = $sth->fetchrow_array ) { $ddi_available = $row[0]; } note 'DDI found: ' . $ddi_available; ok( $ddi_available eq '441224900999', 'Found available DDI.' ); $dbh->disconnect;

    With the trace on, I can't see any difference with the bind params. Why does this not fail?

    DBI_TRACE=1 prove -l t/48-dbi_find_unused_number.t t/48-dbi_find_unused_number.t .. DBI 1.630-ithread default trace l +evel set to 0x0/1 (pid 7128 pi 1d56010) at DBI.pm line 288 via 48-dbi +_find_unused_number.t line 6 -> DBI->connect(dbi:SQLite:api.db, , ****) -> DBI->install_driver(SQLite) for linux perl=5.014002 pid=7128 ru +id=500 euid=500 install_driver: DBD::SQLite version 1.46 loaded from /usr/local +/lib/perl/5.14.2/DBD/SQLite.pm <- install_driver= DBI::dr=HASH(0x248ac28) <- default_user(undef, undef, ...)= ( undef undef ) [2 items] at D +BI.pm line 659 <- connect('api.db', undef, ...)= ( DBI::db=HASH(0x248b480) ) [1 i +tems] at DBI.pm line 671 <- STORE('PrintError', 1)= ( 1 ) [1 items] at DBI.pm line 723 <- STORE('AutoCommit', 1)= ( 1 ) [1 items] at DBI.pm line 723 <- STORE('Username', undef)= ( 1 ) [1 items] at DBI.pm line 726 <- connected('dbi:SQLite:api.db')= ( undef ) [1 items] at DBI.pm l +ine 733 <- connect= DBI::db=HASH(0x248b480) <- STORE('dbi_connect_closure', CODE(0x248aa90))= ( 1 ) [1 items] +at DBI.pm line 742 <- prepare('SELECT me.ddi, me.area_code, me.local_number, me.numbe +r_quality, me.is_used FROM complete_number_e164 me WHERE ( ( me.ddi = ? AND me.is_used = ? ) )')= ( DBI::st=HASH(0x248b7e +0) ) [1 items] at 48-dbi_find_unused_number.t line 12 <- bind_param(1, 441224900999)= ( 1 ) [1 items] at 48-dbi_find_unu +sed_number.t line 16 <- bind_param(2, 0)= ( 1 ) [1 items] at 48-dbi_find_unused_number. +t line 17 <- execute= ( '0E0' ) [1 items] at 48-dbi_find_unused_number.t lin +e 18 <- fetchrow_array= ( '441224900999' 1224 900999 'gold' 0 ) [5 item +s] row1 at 48-dbi_find_unused_number.t line 21 <- fetchrow_array= ( ) [0 items] row1 at 48-dbi_find_unused_number +.t line 21 t/48-dbi_find_unused_number.t .. 1/1 sqlite trace: Closing DB at dbdim +p.c line 510 sqlite trace: rc = 5 at dbdimp.c line 512 sqlite trace: Finalizing statement (24f07a8) at dbdimp.c line 516 sqlite trace: Trying to close DB again at dbdimp.c line 522 <- disconnect= ( 1 ) [1 items] at 48-dbi_find_unused_number.t line + 27 <- DESTROY(DBI::st=HASH(0x248b5a0))= ( undef ) [1 items] <- DESTROY(DBI::db=HASH(0x248b3d8))= ( undef ) [1 items] <- disconnect_all= ( '' ) [1 items] at DBI.pm line 750 ! <- DESTROY(DBI::dr=HASH(0x248ac28))= ( undef ) [1 items] during gl +obal destruction t/48-dbi_find_unused_number.t .. ok All tests successful. Files=1, Tests=1, 1 wallclock secs ( 0.03 usr 0.00 sys + 0.07 cusr + 0.02 csys = 0.12 CPU) Result: PASS

    The DBIx::Class schema is like so:

    package API::Schema::Result::CompleteNumberE164View; use utf8; use strict; use warnings; use base qw/DBIx::Class::Core/; __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); __PACKAGE__->table('complete_number_e164'); __PACKAGE__->result_source_instance->view_definition( "SELECT '44' || area_code || local_number AS ddi, area_code, local_num +ber, number_quality, is_used FROM assigned_number;" ); __PACKAGE__->add_columns( ddi => { data_type => 'INTEGER', default_value => undef, is_nullable => 0, }, area_code => { data_type => 'INTEGER', default_value => undef, is_nullable => 0, }, local_number => { data_type => 'INTEGER', default_value => undef, is_nullable => 0, }, number_quality => { data_type => 'TEXT', default_value => undef, is_nullable => 0, size => 255, }, is_used => { data_type => 'BOOLEAN', default_value => 'false', is_nullable => 0, }, ); __PACKAGE__->belongs_to( 'area_code_assigned_number', 'API::Schema::Result::Area', { 'foreign.area_code' => 'self.area_code' } ); __PACKAGE__->belongs_to( 'number_quality_assigned_number', 'API::Schema::Result::NumberQuality', { 'foreign.number_quality' => 'self.number_quality' } ); 1;

    Thanks.

String differs from printing to STDOUT and printing to file
5 direct replies — Read more / Contribute
by cboesch
on Oct 23, 2019 at 06:18
    Hi,

    When I print a variable to STDOUT:
    printf "%s.\n", $var;
    I get:
    QeTEv2804.

    When I print the same varible to a file:
    open DEBUG, ">>debug.txt" or confess "Couldn't open file";
    printf DEBUG "%s.\n", $var;
    close DEBUG;
    I get:
    QeTEv2804^@^@^@.

    What could be the reason for that?
    Thanks,
    Christian
bit array comparison
4 direct replies — Read more / Contribute
by Amendil
on Oct 22, 2019 at 08:27

    Hello Perl Monks,

    I'm working on a tsv, one of its columns is a csv list of keywords (28 unique values). I'd like to compute the Jaccard Index (Intersection / Union) of this list of keywords. To do so efficiently I'd like to use a bit array to represent the list of keywords.

    I tried to read few articles on Perlmonks and stackoverflow, but so far I feel I'm missing something completely obvious.

    Here is what I wrote:

    use common::sense; my $a = ''; my $b = ''; $a += 1 << 0; $a += 1 << 1; $b += 1 << 1; $b += 1 << 2; my $i = $a & $b; my $u = $a | $b; my $i_cnt = unpack '%32b*', $i; my $u_cnt = unpack '%32b*', $u; printf "a is %#032b %d\n", $a, $a; printf "b is %#032b %d\n", $b, $b; printf "intersection is %#032b %d\n", $i, $i; printf "union is %#032b %d\n", $u, $u; say "set bit count in intersection: $i_cnt"; say "set bit count in union: $u_cnt";

    Actual result:

    a is 0b000000000000000000000000000011 3 b is 0b000000000000000000000000000110 6 intersection is 0b000000000000000000000000000010 2 union is 0b000000000000000000000000000111 7 set bit count in intersection: 3 set bit count in union: 5

    Expected result:

    a is 0b000000000000000000000000000011 3 b is 0b000000000000000000000000000110 6 intersection is 0b000000000000000000000000000010 2 union is 0b000000000000000000000000000111 7 set bit count in intersection: 1 set bit count in union: 3
how to export a method
2 direct replies — Read more / Contribute
by toothedsword
on Oct 21, 2019 at 22:18

    I have written a CV.pm(perl5/5.30.0/lib/site_perl/5.30.0/x86_64-linux/PDL/CV.pm) as below:

    package PDL::CV; use strict; our @EXPORT=qw(rp); sub rp { my ( $self, $input ) = @_; $self .= $input->reshape($self->dims); return $self; } sub new { my $class = shift; my $self = { _input => shift, }; bless $self, $class; return $self; } 1;
    Then I wrote a test.pl as below:
    use v5.10; use PDL; use PDL::NiceSlice; use PDL::CV; $d = sequence(4,5); $t = pdl sequence(100,5,5); $d(0,1:4)->rp($t(0,0,1:4));

    When I ran this scripts, I get this message: Can't locate object method "rp" via package "PDL" at test_pdl6.pl line 28. If I do not want using $d(0,1:4)->PDL::CV::rp($t(0,0,1:4)); just using $d(0,1:4)->rp($t(0,0,1:4)); How should I do?

Dynamic exports with Exporter::Easy
2 direct replies — Read more / Contribute
by wanna_code_perl
on Oct 21, 2019 at 22:06

    I'm working on a non-OO module that has a number of subs that are dynamically created and added to the symbol table. Their names are known at compile time, so I could certainly hard-code them in, but I'm a fan of DRY and would rather just specify them once.

    When the module is loaded I have several subs that are string-eval'd into existence. In reality the body of the subs is more complex than a simple tr//, but this demonstrates the problem well enough. Everything works fine, but I'm stuck on the simple task of convincing Exporter::Easy to export the subs. I can make it work with Exporter just fine:

    package Foo; use strict; use warnings; use Carp; my %subs = ( subA => _gen_tr('abc' => 'xyz'), subB => _gen_tr('ijk' => 'qrs'), ); $subs{reverse($_)} = $subs{$_} for keys %subs; # Stand-in example for +aliases no strict 'refs'; *$_ = $subs{$_} for keys %subs; require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = keys %subs; sub _gen_tr { /^\w+$/ or confess "Non-word characters in argument: <$_>" for @_; eval "sub { shift =~ tr/$_[0]/$_[1]/r }" } 1;

    The above works fine; all subs and their aliases are exported as expected (passes test code at the end of this post).

    But when I replace the require Exporter; our @ISA ...; our @EXPORT_OK ...; lines with a similar Exporter::Easy incantation:

    use Exporter::Easy ( OK => [ keys %subs ], TAGS => [ all => [ keys %subs ], ], );

    Code using Foo sees "subA" is not exported by the Foo module, whether I use Foo ':all' or specify subA directly. I've even tried wrapping the exports and actual %subs initialization in a BEGIN block, but that did not make a difference. Hardcoding the sub names directly in the OK => [ ... ] or all => [ ... ] lines does of course work, but that's exactly what I'm trying to avoid doing.

    Why Exporter::Easy? One reason is, I like it. The "real" reason is, my full code has more tags and more complex exports. I can do what I want with Exporter, but it's ugly. I'm willing to consider other Exporter::* modules if Exporter::Easy can't handle it. Or, I suppose, to suck it up and use Exporter if there's no other way.

    So how would you do it? $cake->have->eat;

    Test code:

    use strict; use warnings; use Test::More; # Pick one: #use Foo qw/subA subB Abus Bbus/; use Foo ':all'; is subA('abra-cadabra'), 'xyrx-zxdxyrx'; is subB('i like stuff'), 'q lqse stuff'; is Abus('abra-cadabra'), 'xyrx-zxdxyrx'; is Bbus('i like stuff'), 'q lqse stuff'; done_testing;
TIMTOWTDI but how do you use Perl to create CLI scripts?
4 direct replies — Read more / Contribute
by nysus
on Oct 21, 2019 at 21:53

    I didn't know much about scripting with Perl until pretty recently. I knew how to throw a Perl script into ~/bin to create commands and that was about the extent of my knowledge.

    Over the past year or so, I have become much more familiar with creating, installing and running command-line scripts with Perl. But I still don't have much experience to know which method I should settle on. When is it appropriate to just throw something in ~/bin? When should I prefer a modulino? When should I create a module for my command? Do I ever need to create a module if I'm just going to use the command myself? If I do create a module, which approach should I use? App:Cmd? How about MooseX::App::Cmd? What other cool approaches are there to create new command line initiated scripts? And generally speaking, what are the best, most efficient practices for creating a cool library of perl commands to help you get work done faster? I'd be very interested in hearing what others are doing in this area. Thanks!

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks

Issue while reading decimal number from a Spreadsheet using perl
5 direct replies — Read more / Contribute
by KishKishore
on Oct 21, 2019 at 01:31

    Hi Guys, I'm very new to perl. I was just doing some read/write operations in excel sheet using perl. My issue is: When i write a decimal number (fraction number. Ex : 2.5), and read it back, the output is some long number with extra decimals. I dont know why this is happening. Please help me

    use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::SaveParser; ## Write to an existing excel sheet $parser = Spreadsheet::ParseExcel::SaveParser->new(); my $workbook = $parser->Parse('myxls.xls'); # Get the first worksheet. my $worksheet = $workbook->worksheet("myxls"); my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); $worksheet->AddCell( $row_max+1, 0, '10.1' ); $worksheet->AddCell( $row_max+1, 1, '10.2' ); $worksheet->AddCell( $row_max+1, 2, '10.3' ); $worksheet->AddCell( $row_max+1, 3, '10.4' ); $worksheet->AddCell( $row_max+1, 4, '10.5' ); $worksheet->AddCell( $row_max+1, 5, '10.6' ); $worksheet->AddCell( $row_max+1, 6, '10.7' ); $worksheet->AddCell( $row_max+1, 7, '10.8' ); $worksheet->AddCell( $row_max+1, 8, '10.9' ); $workbook->SaveAs('myxls.xls'); ## Excel Read $parser = Spreadsheet::ParseExcel::SaveParser->new(); my $workbook = $parser->Parse('myxls.xls'); # Get the first worksheet. my $worksheet = $workbook->worksheet("myxls"); my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for($r=$row_min; $r<=$row_max; $r++){ for($c=$col_min; $c<=$col_max; $c++){ $d = $worksheet->get_cell( $r, $c); if(defined $d) { $d= $d +->unformatted(); print "-$d-\t";} } print "\n"; }

    Result : -10.0999999999999996- -10.1999999999999993- -10.3000000000000007- -10.4000000000000004- -10.5- -10.5999999999999996- -10.6999999999999993- -10.8000000000000007- -10.9000000000000004- I don't understand why this extra decimal numbers. When i open excel and check, this extra decimals are not there. Please help me

How to deliver a perl application to a client?
5 direct replies — Read more / Contribute
by xcodejoy
on Oct 20, 2019 at 12:55

    Hi there.

    Can someone explain, how to deliver some perl application to a client? For example, my client has own VPS. Should I write instruction about installing "perlbrew", "cpanm", etc...? How to create equal testing area on dev machine and on client's machine? Is there the best way to deliver an application to production?

why package definition order affect the available of package variable
2 direct replies — Read more / Contribute
by fanasy
on Oct 20, 2019 at 06:06

    I can get the $testBegin::global but I cannot get the $testEnd::global
    my question is that
    it seems the test package definition location is the key for this issue.
    how perl consider the different order ? why perl can call testEnd::show_me() in main but can't see the $testEnd::global in main ?
    there is the code :

    #!/usr/bin/perl use feature qw/say/; use Data::Dumper; package testBegin { $global = "I'm in the testBegin package global version"; sub show_me { print "$tag: testBegin package $global\n"; } } testBegin::show_me(); print "-"x60; print "\n"; testEnd::show_me(); package testEnd { $global = "I'm in the testEnd package global version"; sub show_me { print "$tag: testEnd package $global\n"; } }

    output:
    : testBegin package I'm in the testBegin package global version
    ------------------------------------------------------------
    : testEnd package

Force Getopt::Long to Require ONLY Equals Sign Between Option Name and Value
3 direct replies — Read more / Contribute
by roho
on Oct 18, 2019 at 16:36
    Here is what I am trying to do. I have a command line option that is defined in Getopt::Long as having an optional string value as follows:

    use Getopt::Long; GetOptions( "ot:s" => \$ot ) or die("Error in command line arguments\n +");

    The problem occurs when -ot (without a value) is followed by either another option or a program argument. The -ot option will take the next word as its value.

    I know I can signal the end of options by using -- on the command line, but for backward compatibility before this program used Getopt::Long (the program previously used "/usr/bin/perl -s" to process command line options), I would like to tell Getopt::Long to always require an equals sign before a value so that -ot (without a value) can be followed by a program argument without the invervening -- in the command line.

    Here is what I am aiming for:

    Scenario #1:

    myprog.pl -ot=123 arg1 arg2 ...

    This works fine. Variable $ot='123'

    Scenario #2:

    myprog.pl -ot arg1 arg2 ...

    I need $ot to be set to the empty string '' instead of 'arg1', without the need of an intervening -- on the command line (hence the need to force Getopt::Long to require an equals sign between the option name and its value).

    Again, my goal is backward compatibility with the way this program was called before adding Getopt::Long, because this program is very central to the system and is literally called in thousands of places. TIA for any suggestions.

    "It's not how hard you work, it's how much you get done."

weird bug with IO::Prompter, prompt spells out the word 'prompt'
2 direct replies — Read more / Contribute
by daxim
on Oct 17, 2019 at 11:01
    This works:

    › perl -MIO::Prompt=prompt -e'prompt -menu => [6..9]'

    This does not (type letters and/or Enter key when prompted):

    › perl -MIO::Prompter=prompt -e'prompt -menu => [6..9]'

    Can you repro?

Can a regular expression include an arbitrary string variable?
5 direct replies — Read more / Contribute
by anautismobserver
on Oct 16, 2019 at 21:39

    I want to search an array for an arbitrary sting variable. All the examples I've found use regular expressions. Is there a way to devise a regular expression that includes an arbitrary string variable (unknown in advance)?

    For example:

    my #string_to_find = 'hidden'; my @array_to_search = ('Foo', 'whathiddenever', 'Bar', '12hidden456');
Log In?
Username:
Password:

What's my password?
Create A New User
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (7)
As of 2019-10-23 15:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?