[28597] in Perl-Users-Digest
Perl-Users Digest, Issue: 9961 Volume: 10
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Mon Nov 13 11:10:16 2006
Date: Mon, 13 Nov 2006 08:10:08 -0800 (PST)
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)
Perl-Users Digest Mon, 13 Nov 2006 Volume: 10 Number: 9961
Today's topics:
Problems with Net::MySQL... chriswaltham@gmail.com
Re: Problems with Net::MySQL... <micmath@gmail.com>
Re: Problems with Net::MySQL... chriswaltham@gmail.com
Re: Problems with Net::MySQL... <micmath@gmail.com>
Re: Problems with Net::MySQL... chriswaltham@gmail.com
Re: Problems with Net::MySQL... <micmath@gmail.com>
Re: Problems with Net::MySQL... chriswaltham@gmail.com
Re: rewrite a printed line shay.rozen@gmail.com
Re: rewrite a printed line <bik.mido@tiscalinet.it>
Re: String Manipulation anno4000@radom.zrz.tu-berlin.de
Re: Threads and sockets <zentara@highstream.net>
Re: Threads and sockets xhoster@gmail.com
Re: Threads and sockets xhoster@gmail.com
Re: Unix Scripting Education Survey octomancer@blueyonder.co.uk
Digest Administrivia (Last modified: 6 Apr 01) (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: 13 Nov 2006 06:22:22 -0800
From: chriswaltham@gmail.com
Subject: Problems with Net::MySQL...
Message-Id: <1163427741.812971.207130@h54g2000cwb.googlegroups.com>
I'm trying to port a web-based application from a Solaris 2.6 box to
Mac OS X Server 10.4.8. The Solaris box was running perl 5.6.1 and
MySQL 4.0.18, the OS X box is running perl 5.6.2 and MySQL 4.0.18. Both
are running Net::MySQL 0.009. The trouble is, the Solaris box will
connect successfully to the MySQL DB but the OS X box will not.
FYI, I installed perl-5.6.2 on OS X in /usr/local/perl in order to
preserve the install that comes with the OS itself.
This is the code:
#!/usr/bin/perl -w
use Net::MySQL;
my $mysql = Net::MySQL->new(
database => 'mysql',
user => 'root',
password => 'secret'
);
# SLECT example
$mysql->query(q{SELECT * FROM user});
my $record_set = $mysql->create_record_iterator;
while (my $record = $record_set->each) {
printf "First column: %s Next column: %s\n",
$record->[0], $record->[1];
}
$mysql->close;
And this is the error it yields:
[root@csc-web2 admin]# perl test.pl
Access denied for user: '@localhost' to database '!' at test.pl line 5
I am pretty new to perl, so I'm not quite sure how to debug this. The
username and password are definitely correct, but the most troubling
thing is that the error message says that the perl file is trying to
connect to the database named '!', not the database named 'mysql'.
Anyone have any ideas on how I can debug this?
Thanks,
Chris
------------------------------
Date: 13 Nov 2006 06:41:21 -0800
From: "Michael" <micmath@gmail.com>
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163428880.953856.305080@f16g2000cwb.googlegroups.com>
On Nov 13, 2:22 pm, chriswalt...@gmail.com wrote:
> I'm trying to port a web-based application from a Solaris 2.6 box to
> Mac OS X Server 10.4.8. The Solaris box was running perl 5.6.1 and
> MySQL 4.0.18, the OS X box is running perl 5.6.2 and MySQL 4.0.18. Both
> are running Net::MySQL 0.009. The trouble is, the Solaris box will
> connect successfully to the MySQL DB but the OS X box will not.
>
> FYI, I installed perl-5.6.2 on OS X in /usr/local/perl in order to
> preserve the install that comes with the OS itself.
>
> This is the code:
>
> #!/usr/bin/perl -w
> use Net::MySQL;
>
> my $mysql = Net::MySQL->new(
> database => 'mysql',
> user => 'root',
> password => 'secret'
> );
>
> # SLECT example
> $mysql->query(q{SELECT * FROM user});
> my $record_set = $mysql->create_record_iterator;
> while (my $record = $record_set->each) {
> printf "First column: %s Next column: %s\n",
> $record->[0], $record->[1];
>
> }$mysql->close;
>
> And this is the error it yields:
>
> [root@csc-web2 admin]# perl test.pl
> Access denied for user: '@localhost' to database '!' at test.pl line 5
>
> I am pretty new to perl, so I'm not quite sure how to debug this. The
> username and password are definitely correct, but the most troubling
> thing is that the error message says that the perl file is trying to
> connect to the database named '!', not the database named 'mysql'.
> Anyone have any ideas on how I can debug this?
Are you certain that the database server is up and running and can be
accessed, independently of your script?
You should be able to type the following in a terminal window and get
access to your database:
mysql -u root -p
Does the mysql user "root" have permission to read the tables? I always
try to do what I need on the command line first and then translate that
into Perl -- the error messages from the command line are slightly less
cryptic :-)
Regards,
Michael
http://www.perlcircus.org/
------------------------------
Date: 13 Nov 2006 06:49:15 -0800
From: chriswaltham@gmail.com
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163429355.425217.133550@m7g2000cwm.googlegroups.com>
Michael wrote:
> Are you certain that the database server is up and running and can be
> accessed, independently of your script?
>
> You should be able to type the following in a terminal window and get
> access to your database:
> mysql -u root -p
>
> Does the mysql user "root" have permission to read the tables? I always
> try to do what I need on the command line first and then translate that
> into Perl -- the error messages from the command line are slightly less
> cryptic :-)
Yep, I can successfully execute the command from the MySQL console with
the same credentials, just not using the Net::MySQL script :-(
Chris
>
> Regards,
> Michael
> http://www.perlcircus.org/
------------------------------
Date: 13 Nov 2006 07:01:55 -0800
From: "Michael" <micmath@gmail.com>
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163430114.997268.297060@i42g2000cwa.googlegroups.com>
On Nov 13, 2:49 pm, chriswalt...@gmail.com wrote:
> Michael wrote:
> > Are you certain that the database server is up and running and can be
> > accessed, independently of your script?
>
> > You should be able to type the following in a terminal window and get
> > access to your database:
> > mysql -u root -p
>
> > Does the mysql user "root" have permission to read the tables? I always
> > try to do what I need on the command line first and then translate that
> > into Perl -- the error messages from the command line are slightly less
> > cryptic :-)
> Yep, I can successfully execute the command from the MySQL console with
> the same credentials, just not using the Net::MySQL script :-(
hmmmm, okay, but that error message is weird. Why is it saying your
username is '' and your database is '!' right? You say you're using a
perl installed under local but you shebang is "/usr/bin/perl". Are you
sure you're using the perl you think you are?
Try this (in a terminal) and see if it makes any difference:
# /usr/local/perl test.pl
Regards,
Michael
------------------------------
Date: 13 Nov 2006 07:27:22 -0800
From: chriswaltham@gmail.com
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163431642.536741.145710@e3g2000cwe.googlegroups.com>
Michael wrote:
> hmmmm, okay, but that error message is weird. Why is it saying your
> username is '' and your database is '!' right? You say you're using a
> perl installed under local but you shebang is "/usr/bin/perl". Are you
> sure you're using the perl you think you are?
But that's the thing -- in my test.pl I define the username as root,
the password as secret and the database as mysql. Yet when I run the
script, it gets confused and doesn't know what database it's supposed
to use... :-\
> Try this (in a terminal) and see if it makes any difference:
> # /usr/local/perl test.pl
Sorry, the shebang is really /usr/local/perl/bin/perl (which is 5.6.2).
The OS ships with 5.8.6 which is installed in /usr (thus it's shebang
is /usr/bin/perl). I have tried installing Net::MySQL in both, with no
success.
Chris
------------------------------
Date: 13 Nov 2006 07:38:47 -0800
From: "Michael" <micmath@gmail.com>
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163432327.811066.228600@h54g2000cwb.googlegroups.com>
On Nov 13, 3:27 pm, chriswalt...@gmail.com wrote:
> Michael wrote:
> > hmmmm, okay, but that error message is weird. Why is it saying your
> > username is '' and your database is '!' right? You say you're using a
> > perl installed under local but you shebang is "/usr/bin/perl". Are you
> > sure you're using the perl you think you are?But that's the thing -- in my test.pl I define the username as root,
> the password as secret and the database as mysql. Yet when I run the
(Another stab in the dark here :-) From the Net::MySQL docs:
unixsocket - Path of the UNIX socket where MySQL daemon. default is
/tmp/mysql.sock.
Supposing hostname is omitted, it will connect by UNIX Socket.
Since you are not specifying a hostname, it appears that Net::MySQL is
trying to access /tmp/mysql.sock? Does that file exist? You could
eliminate this possibility by specifying a hostname:
my $mysql = Net::MySQL->new(
hostname => '127.0.0.1',
database => 'mysql',
user => 'root',
password => 'secret'
);
But I'm no expert in Net::MySQL. I've always used DBD::MySQL via the
DBI interface. That looks like this:
use DBI;
$dbname = "mysql";
$dbhostname = "localhost";
$dbport = 3306;
$dsn = "DBI:mysql:$dbname:$dbhostname:$dbport";
$dbuser = "root";
$dbpassword = "secret";
$dbh = DBI->connect($dsn, $dbuser, $dbpassword);
Maybe your problems will go away with a different module? The DBD
modules are very stable and I've never had any problem with them on my
Mac. At least you might get a better error message if it still isn't
working! Just a suggestion.
Regards,
Michael
------------------------------
Date: 13 Nov 2006 07:57:07 -0800
From: chriswaltham@gmail.com
Subject: Re: Problems with Net::MySQL...
Message-Id: <1163433427.521880.312620@h54g2000cwb.googlegroups.com>
Michael wrote:
> (Another stab in the dark here :-) From the Net::MySQL docs:
>
> unixsocket - Path of the UNIX socket where MySQL daemon. default is
> /tmp/mysql.sock.
> Supposing hostname is omitted, it will connect by UNIX Socket.
Yep, /tmp/mysql.sock definitely exists:
srwxrwxrwx 1 mysql wheel 0 Nov 13 10:51 /tmp/mysql.sock=
> Since you are not specifying a hostname, it appears that Net::MySQL is
> trying to access /tmp/mysql.sock? Does that file exist? You could
> eliminate this possibility by specifying a hostname:
>
> my $mysql = Net::MySQL->new(
> hostname => '127.0.0.1',
> database => 'mysql',
> user => 'root',
> password => 'secret'
> );
I've tried using the IP address of the box, using 127.0.0.1, using
localhost, and just using the socket. They all fail :-(
> But I'm no expert in Net::MySQL. I've always used DBD::MySQL via the
> DBI interface. That looks like this:
>
> use DBI;
>
> $dbname = "mysql";
> $dbhostname = "localhost";
> $dbport = 3306;
>
> $dsn = "DBI:mysql:$dbname:$dbhostname:$dbport";
>
> $dbuser = "root";
> $dbpassword = "secret";
>
> $dbh = DBI->connect($dsn, $dbuser, $dbpassword);
>
> Maybe your problems will go away with a different module? The DBD
> modules are very stable and I've never had any problem with them on my
> Mac. At least you might get a better error message if it still isn't
> working! Just a suggestion.
I wouldn't mind using DBD, but unfortunately this module is pretty
large & I don't think I know enough perl to go through it & rewrite all
the calls from Net::MySQL to DBD::mysql...
Chris
>
> Regards,
> Michael
------------------------------
Date: 13 Nov 2006 04:49:40 -0800
From: shay.rozen@gmail.com
Subject: Re: rewrite a printed line
Message-Id: <1163422180.231928.215150@b28g2000cwb.googlegroups.com>
Joe Smith wrote:
> shay.rozen@gmail.com wrote:
>
> > My question is can i go up my output on the screen, like print a line,
> > and then go with the "curser" back to this line and rewrite it by
> > another print.
>
> I use this statement in the middle of a loop:
>
> print "Estimated $total in $count files\r" if ++$count % 1000 == 0;
>
> -Joe
I've tried \r. It doesn't work on windows. I tried Term::Screen:Win32
and perl.exe got stuck when trying to run the module. Funny, but this
is the first time i'm scripting perl for windows and so much troubles.
Anyway thank you all for the fast reply. I believe your solutions are
great, but bill think the other way around.
------------------------------
Date: Mon, 13 Nov 2006 15:39:35 +0100
From: Michele Dondi <bik.mido@tiscalinet.it>
Subject: Re: rewrite a printed line
Message-Id: <0q0hl2do8s9fmhpgdt2amghmiorebepg6e@4ax.com>
On 13 Nov 2006 04:49:40 -0800, shay.rozen@gmail.com wrote:
>I've tried \r. It doesn't work on windows. I tried Term::Screen:Win32
Strange, it works for me:
C:\temp>perl -le "$\=qq|\r|; print for '000001'..'999999'"
999999
>and perl.exe got stuck when trying to run the module. Funny, but this
(Possibly) stupid question: is it installed on your system? Or else
how do you define "got stuck"?
Michele
--
{$_=pack'B8'x25,unpack'A8'x32,$a^=sub{pop^pop}->(map substr
(($a||=join'',map--$|x$_,(unpack'w',unpack'u','G^<R<Y]*YB='
.'KYU;*EVH[.FHF2W+#"\Z*5TI/ER<Z`S(G.DZZ9OX0Z')=~/./g)x2,$_,
256),7,249);s/[^\w,]/ /g;$ \=/^J/?$/:"\r";print,redo}#JAPH,
------------------------------
Date: 13 Nov 2006 14:56:06 GMT
From: anno4000@radom.zrz.tu-berlin.de
Subject: Re: String Manipulation
Message-Id: <4rrfc6Fs3slaU1@mid.dfncis.de>
<dao@snakebrook.com> wrote in comp.lang.perl.misc:
>
>
> Hi, I am kina a perl-newbie and have both the learning perl book an the
> programming perl book, but can't find the information I'm looking for
> in either of them. What I need to do is as follows:
>
> I have a string: AaaSmmmRiiiW
>
> And I need to recognize te capital letters and turn the string into the
> following: Aaa Smmm Riii W
>
> Basically, every Capital needs to be preceeded by a space. I can't
> figure out how to do it in perl.
>
> I lloked at the FAQ at perl.org and came up empty there as well. I know
> it can be done, I just can't figure it out.
>
> Any help appreciated.
>
>
> Thanks, Jack
...or split the string before each capital, then join it together with
blanks:
join ' ', split /(?=[[:upper:]])/;
Anno
------------------------------
Date: Mon, 13 Nov 2006 13:36:28 GMT
From: zentara <zentara@highstream.net>
Subject: Re: Threads and sockets
Message-Id: <d6sgl2tcaagt3jvio6ilun8hc6jblpenos@4ax.com>
On 12 Nov 2006 23:38:29 GMT, xhoster@gmail.com wrote:
>Martijn Lievaart <m@remove.this.part.rtij.nl> wrote:
>> Or should the socket be marked shared?
>
>I get an error message "Cannot share globs yet" when I try.
>
>> Or will this not work
>> at all? Or depending on the OS (I'm using Linux).
A couple of quick ideas( I may be missing your problem entirely) :-)
You can share filehandles between threads on linux,
thru the fileno
See:
http://perlmonks.org?node_id=395513
http://perlmonks.org?node_id=493754
You can also pass back the fileno to the main thread thru
a shared scalar, when you want to create the socket in the thread.
As shown in this simple Tk threaded script.
#!/usr/bin/perl
use warnings;
use strict;
use threads;
use threads::shared;
my %shash;
#share(%shash); #will work only for first level keys
my %hash;
share ($shash{'go'});
share ($shash{'fileno'});
share ($shash{'pid'});
share ($shash{'die'});
$shash{'go'} = 0;
$shash{'fileno'} = -1;
$shash{'pid'} = -1;
$shash{'die'} = 0;
$hash{'thread'} = threads->new(\&work);
$shash{'go'} = 1;
sleep 1; # cheap hack to allow thread to setup
my $fileno = $shash{'fileno'};
open (my $fh, "<&=$fileno") or warn "$!\n";
while ( <$fh> ){ print "In main-> $_"; }
#wait for keypress to keep main thread alive
<>;
# control-c to exit
##################################################################
sub work{
$|++;
while(1){
if($shash{'die'} == 1){ return };
if ( $shash{'go'} == 1 ){
my $pid = open(FH, "top -b |" ) or warn "$!\n";
my $fileno = fileno(FH);
print "fileno->$fileno\n";
$shash{'fileno'} = $fileno;
$shash{'go'} = 0; #turn off self before returning
}else
{ sleep 1 }
}
}
#####################################################################
__END__
Also look at this idea. You make the socket in the main thread,
and pass it to the new thread.
#!/usr/bin/perl
use warnings;
use strict;
use threads;
use IO::Socket;
my $socket = IO::Socket::INET->new(); # pass your parameters
threads->create(\&do_stuff, $socket);
sleep(0xffffffff); # ;-)
sub do_stuff {
my ($socket) = @_;
while(1){
my $buf;
$socket->read($buf,1) }
# play happily ever after with $socket in your new thread
}
__END__
--
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html
------------------------------
Date: 13 Nov 2006 15:06:59 GMT
From: xhoster@gmail.com
Subject: Re: Threads and sockets
Message-Id: <20061113100926.075$0K@newsreader.com>
Martijn Lievaart <m@remove.this.part.rtij.nl> wrote:
>
> >> I want to make the server concurrent by using ithreads,
> >> creating n threads and distributing the requests over the threads
> >> using Threads::Queue. The thread itself should send back the result to
> >> the client.
> >
> > Why not just use another Thread::Queue to put the answer in, and have
> > the main thread send all the responses?
>
> Because I don't see how I can both select() and dequeue() in the main
> thread. Or do you see another solution?
You could open a pipe from socket to itself. Have the slaves print one byte
to it when they have just enqueued something. Then use select on both the
accept handle and on the semaphor handle--when you get the semaphor thread
you know you should check the queue.
>
> I thought of another solution. I could use fork instead of threads and
> communicate over sockets or pipes. That way I can simply use select in
> the main thread to get both new requests and answers.
Yes, or that. For some reason I like using the pipe just as a semaphor.
I guess because with Thread::Queue your messages are self-delimited, so
you don't have to screw around with that.
> This has another advantage. It makes signal handling much simpler. I
> think signals and threads cannot be used (simple) together so this is
> probably a better solution overall.
>
> The problem here is that I also want some kind of caching, that is why I
> looked at threads in the first place. Oh well, I can use an on disk cache
> as well.
Checking the cache should be fast, right? With the forking method, you
could only fork if the thing wasn't in the cache, and then use a pipe so
the child can tell the parent how to update it's cache. Of course, if your
cache is going to be (or likely become in the forseeable future) bigger
than memory, then there is no reason to go to lengths to avoid a disk
cache.
> >> Now I understand the basics of :shared. I just cannot wrap this around
> >> to sockets.
> >>
> >> For TCP: Can I just enqueue a socket and use it in the thread that
> >> dequeues it?
> >
> > I don't think so. You can't enqueue objects. You could enqueue some
> > kind
>
> I could not find that in the docs, do you have a pointer?
Mostly I just got it from the error messages. Actually, you can enqueue
objects, as long as they are "shared" before you try to enqueue them. But
sharing objects isn't necessarily well supported, especially file handles,
it seems
>
> > of index or key that could be used to point to the socket residing in
> > some other variable.
>
> Yes. Of course. Slaps forehead.
Actually, I'm not sure how this would work, either. See below.
> >> Or will this not work
> >> at all? Or depending on the OS (I'm using Linux).
> >
> > In my experience on linux, file handles (including sockets) don't need
> > to be shared. When you create a new thread, a new Perl variable is
> > created for the handle, but it points to the same underlying C/OS
> > structure as the old one, so the socket is implicitly shared by all
> > threads which are "downstream" from the thread that initiated the
> > socket. You may need to create a shared (and hence lockable) sentinel
> > variable to control access to the real socket, if such serialized
> > control is necessary.
However, this is all irrelevant to you. Since you are using pre-created
threads, the relevant sockets will not exist at the time of thread
creation, and so won't be shared through this automatic method. Maybe you
can use something like File::FDpasser (I've never used it) to do it, or
just get the file descriptor number using fileno and enqueue that, then
reconstruct it at the end (I've never done that, either.)
> Slaps forehead again. Of course. I should not have searched the perl docs
> but the Linux docs.
I don't this is documented there, either, as it is a result of the an
interaction between how linux implements files and how Perl implements
threads. My ideas in this area are mostly based on experience and
experiments, not on the docs.
Xho
--
-------------------- http://NewsReader.Com/ --------------------
Usenet Newsgroup Service $9.95/Month 30GB
------------------------------
Date: 13 Nov 2006 16:01:13 GMT
From: xhoster@gmail.com
Subject: Re: Threads and sockets
Message-Id: <20061113110340.052$3W@newsreader.com>
xhoster@gmail.com wrote:
> Martijn Lievaart <m@remove.this.part.rtij.nl> wrote:
> >
> > >> I want to make the server concurrent by using ithreads,
> > >> creating n threads and distributing the requests over the threads
> > >> using Threads::Queue. The thread itself should send back the result
> > >> to the client.
> > >
> > > Why not just use another Thread::Queue to put the answer in, and have
> > > the main thread send all the responses?
> >
> > Because I don't see how I can both select() and dequeue() in the main
> > thread. Or do you see another solution?
>
> You could open a pipe from socket to itself. Have the slaves print one
> byte to it when they have just enqueued something.
Obviously you could open a pipe from the *process* to itself. I don't
how "socket" got in there. You could either have one pipe per slave,
or one pipe total that all the saves share. In the latter case, it may
get corrupted, but I don't think that will matter, as it only used
as a semaphore. But I think it would still work, as long as each time you
wake up, you would have to read from Thread::Queue till it is is empty
(i.e. until it would block) just in case concurrent "posts" to the pipe got
corrupted and so don't look like they are more than one.
> Then use select on
> both the accept handle and on the semaphor handle--when you get the
> semaphor thread you know you should check the queue.
Xho
--
-------------------- http://NewsReader.Com/ --------------------
Usenet Newsgroup Service $9.95/Month 30GB
------------------------------
Date: 13 Nov 2006 04:55:04 -0800
From: octomancer@blueyonder.co.uk
Subject: Re: Unix Scripting Education Survey
Message-Id: <1163422504.234888.118920@k70g2000cwa.googlegroups.com>
Justin C wrote:
> In article <1163289401.939625.199500@m7g2000cwm.googlegroups.com>,
> "AndrewS" <pillyponka@gmail.com> wrote:
> > Survey: http://www.surveymonkey.com/s.asp?u=743662789831
> *and* you expect me to visit "surveymonkey"?
It seems (from the quotes around the name) that you have decided that
surveymonkey.com is not worth visiting based on the domain. In fact,
Surveymonkey is a perfectly respectable site which has been offering a
do-it-yourself survey toolkit for years, in the same vein as Zoomerang,
SurveyShack, ConfirmIt and many others.
> Do we *look* like idiots here?
More often than is necessary, unfortunately.
------------------------------
Date: 6 Apr 2001 21:33:47 GMT (Last modified)
From: Perl-Users-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin)
Subject: Digest Administrivia (Last modified: 6 Apr 01)
Message-Id: <null>
Administrivia:
#The Perl-Users Digest is a retransmission of the USENET newsgroup
#comp.lang.perl.misc. For subscription or unsubscription requests, send
#the single line:
#
# subscribe perl-users
#or:
# unsubscribe perl-users
#
#to almanac@ruby.oce.orst.edu.
NOTE: due to the current flood of worm email banging on ruby, the smtp
server on ruby has been shut off until further notice.
To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.
#To request back copies (available for a week or so), send your request
#to almanac@ruby.oce.orst.edu with the command "send perl-users x.y",
#where x is the volume number and y is the issue number.
#For other requests pertaining to the digest, send mail to
#perl-users-request@ruby.oce.orst.edu. Do not waste your time or mine
#sending perl questions to the -request address, I don't have time to
#answer them even if I did know the answer.
------------------------------
End of Perl-Users Digest V10 Issue 9961
***************************************