By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,874 Members | 1,027 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,874 IT Pros & Developers. It's quick & easy.

Python 2.5 incompatible with Fedora Core 6 - packaging problems again

P: n/a
I've been installing Python and its supporting packages on
a dedicated server with Fedora Core 6 for about a day now.
This is a standard dedicated rackmount server in a colocation
facility, controlled via Plesk control panel, and turned over
to me with Fedora Core 6 in an empty state. This is the
standard way you get a server in a colo today.

Bringing Python up in this completely clean environment is
a huge hassle, and it doesn't really work.

Fedora Core 6 ships with Python 2.4, which appears to be a
good decision on someone's part. Of course, there's no
standard RPM for a Python 2.5 install on Linux. Packaging is
someone else's problem, according to the Python developers.
So it's necessary to build from source. And the "python.org"
FTP server is down, so even getting the source onto a remote
server is a pain. So I have to download it on another machine
and bring it over with FTP.

Trying to install Python 2.5 yields at least the following problems:

Fedora Core 6 comes with GCC 4.1.1, but the README file
with Python 2.5 says this:

GCC 4.1,
GCC 4.2: There is a known incompatibility between Python and GCC,
where GCC 4.1 and later uses an interpretation of C
different to earlier GCC releases in an area where the C
specification has undefined behaviour (namely, integer arithmetic
involving -sys.maxint-1).

As a consequence, compiling Python with GCC 4.1/4.2 is not
recommended. It is likely that this problem will be resolved
in future Python releases. As a work-around, it seems that
adding -fwrapv to the compiler options restores the earlier
GCC behaviour.

OK, given that, presumably "./configure" takes care of that problem,
right? Anybody know for sure?

"make" runs fine after "./configure".

But "make install" does some compiles, something "install" probably
shouldn't be doing. Some of these compiles fail, with error messages
like
"/var/www/vhosts/sitetruth.com/private/downloads/python/Python-2.5/Modules/_curses_panel.c:271:
error: "PyCursesPanelObject" has no member named "pan"

But the install script plunges blindly on, presumably installing a broken
Python 2.5. Apparently Fedora Core 6 doesn't come with "curses" preinstalled,
but the Python installer assumes it is there. What's inexcusable is
just plowing on after failed compiles, resulting in a broken install.

It's probably necessary to install something before building Python,
but the README file is silent on this.

OK. Plunging onward, and not really needing the "curses" library,
we try to install MySQLdb. We get that with FTP,
unpack it, go to the approprate directory, and run "python setup.py".
This fails because the MySQL headers aren't installed:

"_mysql.c:35:23: error: my_config.h: No such file or directory"

OK, looks like we need to install "mysql-devel", so we do that,
using "yum". This forces an update of OpenSSL, Kerberos, and
"e2fsprogs-dev". Which means we should reboot at some point.

But now we can build MySQLdb. So we build and install it.

So then we try "import MySQLdb" in Python 2.5. And we get this:
/usr/local/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.py:3: UserWarning: Module _mysql was already imported from /usr/local/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.pyc, but /var/www/vhosts/sitetruth.com/private/downloads/MySQLdb/MySQL-python-1.2.2 is being added to sys.path
import sys, pkg_resources, imp
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "MySQLdb/__init__.py", line 19, in <module>
import _mysql
File "build/bdist.linux-i686/egg/_mysql.py", line 7, in <module>
File "build/bdist.linux-i686/egg/_mysql.py", line 4, in __bootstrap__
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 800, in resource_filename
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 1228, in get_resource_filename
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 1250, in _extract_resource
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 880, in get_cache_path
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 846, in extraction_error
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/var/www/vhosts/sitetruth.com/.python-eggs'

The Python egg cache directory is currently set to:

/var/www/vhosts/sitetruth.com/.python-eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
So what's going on? We've run into a conflict between an assumption of Python
and of the Plesk control panel. Plesk doesn't let the user create files
in their own home directory. This installer assumes it can. Oops.
(Plesk sets up a very locked down environment, which is a good thing on
a web server.)

So, becoming the super-user, we create .python-eggs and change its ownership.
Now we can import MySQLdb into Python.

Now it turns out that we have Python 2.4 in /usr/bin, and Python 2.5
in /usr/local/bin. That's where the installer put it. So the CGI
scripts are invoking the wrong version of Python. The scripts had to
be changed.

At last, MySQLdb is connecting to MySQL properly. However, the SSL module
seems to be broken. Tomorrow I'll deal with that, and try to get
M2Crypto installed, always a tough job.

This kind of nonsense is why hosting companies don't want to support Python.
Perl and PHP may be dumb, but they just work. Java has a company behind it.
Python just isn't ready. Which is embarassing, ten years on.

If the Python crowd wants market share, attention, and a career path,
this has to be fixed.

John Nagle
Mar 4 '07 #1
Share this Question
Share on Google+
15 Replies


P: n/a
[snip]
So what's going on? We've run into a conflict between an assumption of Python
and of the Plesk control panel. Plesk doesn't let the user create files
in their own home directory. This installer assumes it can. Oops.
(Plesk sets up a very locked down environment, which is a good thing on
a web server.)
The "installer" used the options you gave it, or its defaults in their absence.
Now it turns out that we have Python 2.4 in /usr/bin, and Python 2.5
in /usr/local/bin. That's where the installer put it. So the CGI
scripts are invoking the wrong version of Python. The scripts had to
be changed.
You could have fixed this with "./configure --prefix=/usr/local"
This kind of nonsense is why hosting companies don't want to support Python.
Perl and PHP may be dumb, but they just work. Java has a company behind it.
Python just isn't ready. Which is embarassing, ten years on.
Let's see...

You're trying to install a package without using the package
management tools provided by your system, you haven't read the docs
(or at least all of them), you show a general lack of understanding of
the different responsibilities in the free/open source software space
(development vs. packaging)... and after all that, then you come here
and complain?

Look, I'm sure lots of folks here would be glad to help you, but your
post comes across as whiny and confrontational. I'm sure you've had a
frustrating experience, but please, don't blame "python" or "the
python developers", because that blame would be misplaced.
Mar 4 '07 #2

P: n/a
"Troy Melhase" <tr**********@gmail.comwrites:
You're trying to install a package without using the package
management tools provided by your system, you haven't read the docs
(or at least all of them), you show a general lack of understanding of
the different responsibilities in the free/open source software space
(development vs. packaging)... and after all that, then you come here
and complain?
Just to throw more on the fire: there are distributions that come with Python
2.5 packaged and working. ;-)
Look, I'm sure lots of folks here would be glad to help you, but your
post comes across as whiny and confrontational. I'm sure you've had a
frustrating experience, but please, don't blame "python" or "the
python developers", because that blame would be misplaced.
Anyway, if following the install after an error is true then some developer
should take a look at it.
--
Jorge Godoy <jg****@gmail.com>
Mar 4 '07 #4

P: n/a
Patrick Useldinger wrote:
http://www.serpentine.com/blog/2006/...fedora-core-6/
I've read that. It's very funny. "Now you’ll need to go into the SOURCES
directory and frob a single file..."

It does have something very useful in it - Python's
2.5's dependency list:

sudo yum install autoconf bzip2-devel db4-devel \
expat-devel findutils gcc-c++ gdbm-devel glibc-devel gmp-devel \
libGL-devel libX11-devel libtermcap-devel ncurses-devel \
openssl-devel pkgconfig readline-devel sqlite-devel tar \
tix-devel tk-devel zlib-devel

If a Python build needs all that, something in ./configure
should be checking for each of those. After all, that's what
../configure is supposed to be for. It looks like a Python
install will plow ahead without ncurses-devel, and install a
dud version.

(Why is "make install" doing compiles, anyway? It should
just be copying. "make" is supposed to do all the
compiles.)

This, though, illustrates exactly what I was talking about
- there is no off the shelf way to install Python 2.5 on
Fedora Core 6. Others have worked through this and documented
their pain and how to do it manually, but that's not the same
as fixing the packaging problem.

Debian tries to deal with this problem. See

http://www.debian.org/doc/packaging-...icy/index.html

But Fedora Core does not.

Perl, PHP, C, C++, and Java don't have this particular
problem. Python stands alone, out in the cold.

John Nagle
Mar 4 '07 #5

P: n/a

JohnIf a Python build needs all that, something in ./configure should
Johnbe checking for each of those. After all, that's what ./configure
Johnis supposed to be for. It looks like a Python install will plow
Johnahead without ncurses-devel, and install a dud version.

As another person pointed out, you're conflating Python proper with a
specific Linux distribution's packaging techniques. I run on a Mac and use
MacPorts. There is no ncurses-devel package there, just ncurses and
ncursesw. Building a Python interpreter doesn't require ncurses. It's an
add-on module which happens to be distributed with Python. The distutils
setup.py script checks for ncurses bits and indeed "plows ahead" if it's not
found. Not all systems (Windows, in particular) have ncurses.

Skip
Mar 4 '07 #6

P: n/a
sk**@pobox.com wrote:
The distutils setup.py script checks for ncurses bits
No, it just plows on after compiler errors.
As another person pointed out, you're conflating Python proper with a
specific Linux distribution's packaging techniques.
Exactly. As I've pointed out before, Python doesn't play well with
others. The Python developers pass the buck to the Linux packager, the
Linux packager passes the buck to the Python developers, and thus
the user experience sucks.

Debian seems to have struggled through this problem, but Red Hat
apparently just decided to give up keeping up with Python versions.

John Nagle
Mar 4 '07 #7

P: n/a
On Mar 4, 12:03 pm, John Nagle <n...@animats.comwrote:
Exactly. As I've pointed out before, Python doesn't play well with
others. The Python developers pass the buck to the Linux packager, the
Linux packager passes the buck to the Python developers, and thus
the user experience sucks.
The configure script checks for libraries and headers that are
required for a base build, and (according to the options passed to
configure, or using the defaults) optional components. There is NO WAY
for it to know which PACKAGES, on any of the 500 linux distributions,
provide those libs and headers. That is the job of the PACKAGER, or
(gasp) the end user if you use a distro without a package system or
trying to build from raw source. There is no passing the buck. If a
package is broken, the packager must fix it. If the source is broken,
the developer must fix it.
Debian seems to have struggled through this problem, but Red Hat
apparently just decided to give up keeping up with Python versions.
Anybody can make packages, not just the distro maintainers. Why not
search for them?

http://rpmseek.com/rpm-pl/python.htm...tr=1&qDnStr=82

Mar 4 '07 #8

P: n/a
John Nagle wrote:
I've been installing Python and its supporting packages on
a dedicated server with Fedora Core 6 for about a day now.
This is a standard dedicated rackmount server in a colocation
facility, controlled via Plesk control panel, and turned over
to me with Fedora Core 6 in an empty state. This is the
standard way you get a server in a colo today.
You have my commiserations, and I don't mean that to be a flippant
remark.
Bringing Python up in this completely clean environment is
a huge hassle, and it doesn't really work.
Once upon a time, I used to manage an entire Python environment with
lots of modules, additional libraries, and so on. I don't have the
patience for that any more.
Fedora Core 6 ships with Python 2.4, which appears to be a
good decision on someone's part. Of course, there's no
standard RPM for a Python 2.5 install on Linux. Packaging is
someone else's problem, according to the Python developers.
I managed to find a site which gives some kind of searchable index of
packages:

http://www.fedoratracker.org/

It's a bit like the Debian and Ubuntu package sites but seemingly
unofficial and a lot slower. Once upon a time there were some
contributed RPMs available from python.org, but I don't know what
happened to them.

[FTP server, GCC, configuration]
But "make install" does some compiles, something "install" probably
shouldn't be doing.
If the original build process didn't manage to compile everything,
make will revisit that part of the process. What should really happen
is that make should halt and not try and do anything else.

An aside on the subject of installing - something you may be aware of,
but worth repeating for others who have read this far. I guess that
"make altinstall" isn't necessary if you *don't* do something like
this when configuring:

../configure --prefix=/usr

The issue here is that if Fedora (or other distributions) has things
relying on /usr/bin/python, you have to make sure that you don't
overwrite it when installing. If you've been thinking that the new
version of Python should live alongside the others, you have to use
"make altinstall" to preserve the existing python program (the
python2.4 will survive, anyway) whilst installing python2.5 alongside
it.

Typically, the configure script behaves as if this were typed:

../configure --prefix=/usr/local

Thus, a "make install" will create /usr/local/bin/python and /usr/
local/bin/python2.5, hopefully not overwriting other things.
Some of these compiles fail, with error messages
like
"/var/www/vhosts/sitetruth.com/private/downloads/python/Python-2.5/Modules/_curses_panel.c:271:
error: "PyCursesPanelObject" has no member named "pan"
This should stop the process, but as you note...
But the install script plunges blindly on, presumably installing a broken
Python 2.5. Apparently Fedora Core 6 doesn't come with "curses" preinstalled,
but the Python installer assumes it is there. What's inexcusable is
just plowing on after failed compiles, resulting in a broken install.
This might require a bug report.
It's probably necessary to install something before building Python,
but the README file is silent on this.

OK. Plunging onward, and not really needing the "curses" library,
we try to install MySQLdb. We get that with FTP,
unpack it, go to the approprate directory, and run "python setup.py".
This fails because the MySQL headers aren't installed:

"_mysql.c:35:23: error: my_config.h: No such file or directory"

OK, looks like we need to install "mysql-devel", so we do that,
using "yum". This forces an update of OpenSSL, Kerberos, and
"e2fsprogs-dev". Which means we should reboot at some point.
Perhaps the system wasn't up-to-date anyway.
But now we can build MySQLdb. So we build and install it.

So then we try "import MySQLdb" in Python 2.5. And we get this:
/usr/local/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.py:3: UserWarning: Module _mysql was already imported from /usr/local/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.pyc, but /var/www/vhosts/sitetruth.com/private/downloads/MySQLdb/MySQL-python-1.2.2 is being added to sys.path
import sys, pkg_resources, imp
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "MySQLdb/__init__.py", line 19, in <module>
import _mysql
File "build/bdist.linux-i686/egg/_mysql.py", line 7, in <module>
File "build/bdist.linux-i686/egg/_mysql.py", line 4, in __bootstrap__
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 800, in resource_filename
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 1228, in get_resource_filename
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 1250, in _extract_resource
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 880, in get_cache_path
File "/usr/local/lib/python2.5/site-packages/setuptools-0.6c5-py2.5.egg/pkg_resources.py", line 846, in extraction_error
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/var/www/vhosts/sitetruth.com/.python-eggs'

The Python egg cache directory is currently set to:

/var/www/vhosts/sitetruth.com/.python-eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

So what's going on? We've run into a conflict between an assumption of Python
and of the Plesk control panel. Plesk doesn't let the user create files
in their own home directory. This installer assumes it can. Oops.
(Plesk sets up a very locked down environment, which is a good thing on
a web server.)
This is probably a setuptools/easy_install FAQ. I only know this from
lurking on various mailing lists because I don't use setuptools/
easy_install.
So, becoming the super-user, we create .python-eggs and change its ownership.
Now we can import MySQLdb into Python.

Now it turns out that we have Python 2.4 in /usr/bin, and Python 2.5
in /usr/local/bin. That's where the installer put it. So the CGI
scripts are invoking the wrong version of Python. The scripts had to
be changed.
That's possibly an environment issue, depending on what the first line
of the scripts are.
At last, MySQLdb is connecting to MySQL properly. However, the SSL module
seems to be broken. Tomorrow I'll deal with that, and try to get
M2Crypto installed, always a tough job.

This kind of nonsense is why hosting companies don't want to support Python.
Perl and PHP may be dumb, but they just work. Java has a company behind it.
Python just isn't ready. Which is embarassing, ten years on.
Do hosting companies support multiple versions of Perl or PHP in the
same environment? This isn't a provocative question, but I'd be
interested to know what they do.
If the Python crowd wants market share, attention, and a career path,
this has to be fixed.
Generally, if I were installing into a hosting environment - something
I may consider doing in the relatively near future - I'd firstly
choose a distribution I like working with (Debian-based, not Fedora)
and use the system packaging tools to their maximum extent. I'd even
create my own packages and repositories if necessary; I've done this
already for my own system. Managing dependencies, especially when you
get into dealing with lots of libraries from outside the Python
ecosystem, is a demanding task which can be sufficiently lightened if
you can make use of other people's packaging work.

Really, the "Python crowd" needs to involve the distribution makers
more, rather than (from time to time) calling them names, since most
installed versions of Python on non-Windows platforms are distributed
by those people to users, not obtained by users from python.org. One
exception may involve early adopters and the very latest Python
versions, however.

Paul

Mar 4 '07 #9

P: n/a
MonkeeSage wrote:
>
The configure script checks for libraries and headers that are
required for a base build, and (according to the options passed to
configure, or using the defaults) optional components. There is NO WAY
for it to know which PACKAGES, on any of the 500 linux distributions,
provide those libs and headers.
True, but it would be nice to be able to do a configure --with-some-
library[=path] and have it give an error if that library isn't found.
A lot of tests for specific libraries and headers exist in the
autoconf universe, and it's also possible to write custom tests. Of
course, this may be academic since distutils has apparently taken over
a lot of the work concerning optional modules.
That is the job of the PACKAGER, or
(gasp) the end user if you use a distro without a package system or
trying to build from raw source. There is no passing the buck. If a
package is broken, the packager must fix it. If the source is broken,
the developer must fix it.
I guess if you're building from source, you're the packager, yes.
These days when I can't find up-to-date packages for my aging
distribution, I actually seek out such packages for newer
distributions and backport them, mostly because the dependencies have
been worked out by someone else. In such circumstances, I'm the
packager but I'm using a package infrastructure, as opposed to having
to do a lot of the hard work myself.

Paul

Mar 4 '07 #10

P: n/a
John Nagle <na***@animats.comwrites:
sk**@pobox.com wrote:
The distutils setup.py script checks for ncurses bits

No, it just plows on after compiler errors.
As another person pointed out, you're conflating Python proper with a
specific Linux distribution's packaging techniques.

Exactly. As I've pointed out before, Python doesn't play well with
others. The Python developers pass the buck to the Linux packager, the
Linux packager passes the buck to the Python developers, and thus
the user experience sucks.
I must say in my personal experience this is rather common with, well,
software ;-)

Traditionally, in the open source world, one does something about it,
or shuts up after having made one's point, say, ten or twenty times
<wink>

Debian seems to have struggled through this problem, but Red Hat
apparently just decided to give up keeping up with Python versions.
Red Hat has traditionally been painful with Python. People say this
is because of their own use of Python scripts, though I don't really
understand why that's caused all the problems they seem to have had.
From what you say I take it that's still the case... I always used to
just build my own Python and found the pain reduced in my particular
case (still do that, on Ubuntu). But I typically find that true with
anything "serious" -- compiling my own has often ended up less painful
in the long run, though apparently other people's MMV.

Also there's the traditional open source problem (this one by no means
restricted to Python, or even to open-source OSes -- I suffered this
on Solaris recently) of distros splitting software up and generally
"knowing better" than the maintainer. I can understand there are
sometimes good security and integration reasons for this, but they
seem to get overzealous. Recently, there's been some Python-specific
trouble of the "knowing better" kind with setuptools (popular
distutils extension) on various Linux systems, but that seems to have
quietened down now...

And there's always some degree of pain from distutils, which is
unmaintained and not terribly flexible (though still very useful).
John
Mar 11 '07 #11

P: n/a
John Nagle <na***@animats.comwrites:
[...]
Perl, PHP, C, C++, and Java don't have this particular
problem. Python stands alone, out in the cold.
[...]

I guess different people's experiences differ. I remember trying to
install Java on a FreeBSD server a few years back. I recall no single
software installation that has caused me anywhere near such pain as
that one :-)

Of course, FreeBSD is a minority thing compared with RedHat.
John
Mar 11 '07 #12

P: n/a
John Nagle <na***@animats.comwrites:
[...]
This kind of nonsense is why hosting companies don't want to support Python.
<snigger There seems a more obvious reason...

Perl and PHP may be dumb, but they just work. Java has a company behind it.
Python just isn't ready. Which is embarassing, ten years on.
[...]

I recall similar pain with Perl. The one Perl list I still frequent
has regular postings about these kinds of problems (which are rarely
answered -- perhaps the maintainers have moved on).

My occasional Java experiences have been *far*, *far* worse in this
respect that what I've seen with either Perl or Python.

Does that tell you much? Not really, and neither do your experiences.
John
Mar 11 '07 #13

P: n/a
John J. Lee wrote:
John Nagle <na***@animats.comwrites:

>>sk**@pobox.com wrote:
The distutils setup.py script checks for ncurses bits

No, it just plows on after compiler errors.
Red Hat has traditionally been painful with Python.
....
Also there's the traditional open source problem (this one by no means
restricted to Python, or even to open-source OSes -- I suffered this
on Solaris recently) of distros splitting software up and generally
"knowing better" than the maintainer.
Hit that with OpenSSL. Red Hat took elliptical curve cryptography
out of Fedora 6 for patent reasons. With that missing, M2Crypto won't
build. It ought to; the implementor of M2Crypto thought of that, because
it's an optional feature. But M2Crypto uses SWIG. SWIG doesn't normally
process nested include files. OpenSSL had changed their configuration
approach to use nested include files. So SWIG didn't see the #define that
said to turn off elliptical curve crypto support. This resulted in
compile errors in the 24,000 lines of code that come out of SWIG.

Three days of work to figure that out.

John Nagle
Mar 11 '07 #14

P: n/a
John J. Lee wrote:
John Nagle <na***@animats.comwrites:

>>sk**@pobox.com wrote:
Traditionally, in the open source world, one does something about it,
or shuts up after having made one's point, say, ten or twenty times
In retail, there's an assumption that for every customer who complains
about a real problem, about a hundred customers noticed it and didn't complain,
and about twenty of them will never come back.

There's a great little book, "A Complaint is a Gift", about this.

John Nagle
Mar 11 '07 #15

P: n/a
John Nagle <na***@animats.comwrites:
John J. Lee wrote:
John Nagle <na***@animats.comwrites:
>sk**@pobox.com wrote:
Traditionally, in the open source world, one does something about it,
or shuts up after having made one's point, say, ten or twenty times

In retail, there's an assumption that for every customer who complains
about a real problem, about a hundred customers noticed it and didn't complain,
and about twenty of them will never come back.
....and, in the gift economy of open source, it's for the giver to
recognise that, and the receiver to stop whingeing about it.
John
Mar 11 '07 #16

This discussion thread is closed

Replies have been disabled for this discussion.