980 rows, 10 columns of data,
38 sec.
MySQL server is on the same server, Apache server is not local, but the
delay is allways 38-39 seconds.
Kenneth
No idea. How much data.
What db? is it local? Probably something is wrong anyway.
On Dec 24, 5:55 pm, Kenneth
Hello,
usually when you get an error report you read it and fix the problem,
but occasionally you get a error report that you want to send to the
mailing list, either because you think it´s a bug in the system or you
want to ask for advice. At that time I think it would be nice to have
Is this reproducible?
This happens all the time, if I do it ten times in a row every time it takes
38-39 seconds. Even with lynx on the server itself it takes about 40 seconds.
If I use:
t0=time.time()
orders = db(db.orders.id 0).select()
logging.info('time to fetch %s' %
I have never seen this before I upgraded to a version with the new DAL
and it show any very occasionally. Today I got it a lot, so I upgraded
to 1.91.4 and so far havn´t got it.
Kenneth
I cannot tell. The traceback is in pymysql so I would post there too.
Can you tell us more?
On Dec 25,
Merry christmas to the whole list.
I think this has been suggested earlier but thought I´d bring it up again.
I have two instances of web2py via wsgi and Apache running on my server.
One reason is the possibility to upgrade my development side everytime I
log in to admin, that way getting all
+1 for a changelog view.
The idea behind a two button upgrade is just as Branco explained, on my
production instance I´d only upgrade to stable but on my development I´d
upgrade to newest release just for helping out with testing.
This way maybe not everyone upgrades their production server
I finally had time to find out a little about loggin.conf.
In my logs/web2py.log I get this line:
2010-12-25 01:42:30,097 - root - INFO - time to fetch 1.81220602989
So it takes under 2 seconds to fetch the data and the rest 37 to show
it? How come?
Kenneth
Were is this logged, I could
Hello,
a small design question.
I´m planing a intranet which contains a members database. Their postal
address and some other info.
Would you use the auth_user table to store all members or make a
different table for it.
- If I use auth_user what to do with members not intresered in
Have you tried to upgrade to 1.90.2 that uses the new DAL interface?
Kenneth
https://groups.google.com/forum/#!topic/pymysql-users/vrnKcoE6ZD0
Try to move the web2py.pid file and try again.
Kenneth
Thanks for the tip! Removed --quiet from the two lines. The service
still doesn't appear to start on startup (after reboot). When I
manually start with /etc/init.d/web2py (root user) I get this: No
process in pidfile
return dict(records=db().select(db.tablename.ALL))
You can´t use the word tablename if you don´t have a table named
tablename. If you wan´t to have everything from a table named customers use
return dict(records=db().select(db.customers.ALL))
Kenneth
it throws below error
Traceback (most
One way of doing this is to export all data while connected to Postgres
and then import to MySQL. And doing the import and export via web2py.
Kenneth
Hi, i wanto to know if there is a way to change from Postgres to MySQL
and keep all the information in the db. How can i do that?
Thanks a
http://web2py.com/book/default/chapter/06?search=csv#Exporting-and-Importing-Data
Kenneth
Thaks Kenneth, do you know where can i find some examples or
documentation about this?
On Dec 10, 4:16 am, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
One way of doing this is to export all
Just curious but are you sure that column 3 on rows 1-15 and 32 onward
are empty. When just tested to make a CSV file with Excel 2010 and if
column 3 is empty Excel doesn´t put any closing characters on column 2.
Kenneth
Weird, looks like an Excel'97 bug. It stopped putting the closing
This just a crazy idea but would it be better to move the XML() into the
view so return would look like:
return dict(results=urllib2.urlopen(req).read())
and view:
div class=entryp{{=XML(results)}}/p
Kenneth
I am trying to display some XML that has been screen scraped I want to
display it
Hello,
have you read the web2py book, specifically chapter 11,
http://web2py.com/book/default/chapter/11 it should tell the most.
If you still have questions will try to answer them.
Kenneth
Now I do understand that I am probably asking a very rudimentary
question but in the end I need a
Hi Ryan,
you can find a fcgihandler.py file in the root web2py folder. I havn't
used fcgi but the fcgihandler seems to have an example on how webserver
should be configured.
Kenneth
Thanks for the responses guys. I read all of chapter 11 and I must say
this is why I feel like really am
Were is this logged, I could not find anything in any logs?
Kenneth
try
import time, logging
def testing():
t0=time.time()
orders = db(db.orders.id 0).select()
logging.info('time to fetch %s' % (time.time()-t0))
return orders
so you can isolate the problem and see if
Hello list,
need some help finding out why my server is so slow.
The server is with a Intel Celeron 2.66 GHz CPU, 4 GB of memory
CentOS 5.5 64-bit, Apache 2.2.3, MySQL 5.0.77, mod_wsgi, Web2py 1.89.5
The server is dedicated to web2py, there is three instances of web2py
running.
I have
Of course I forgot something,
python 2.6.5
Kenneth
Hello list,
need some help finding out why my server is so slow.
The server is with a Intel Celeron 2.66 GHz CPU, 4 GB of memory
CentOS 5.5 64-bit, Apache 2.2.3, MySQL 5.0.77, mod_wsgi, Web2py 1.89.5
The server is dedicated to web2py,
Please tell us more about the setup. Are the three instances behind
running on the same server?
Yes.
why three? What do they do?
One is production, one is testing and last one is development. I had two
instances running on a virtual server before and it worked fine.
This is not normal
When you test is that the only active connection to the db?
I tested it on an application running on the test instance. There could
have been lite activity one production site.
But when I tested loading the same function five times in about 10
minutes I allways 39 seconds to load the data.
Hello Mirek,
thank you for your example. In my case it didn´t help. If I look at the
file in Notepad åäö are shown correctly by when opening the file by
dubble clicking it opens Excel but åäö aren´t shown correctly, for some
reason Excel uses wrong charset, if I import the file to Excel with
If there is nothing else on the market and it costs enough (it has to be
good).
Kenneth
Learning Scorm what a crappy protocol:
1) it is a method for zipping lectures and metadata
2) lectures are in html and are vulnerable to XSS
3) mixes content and presentation
4) can contain quizzes
I have no problem using åäö when reading and writing these characters
from database, also no problem displaying them on screen.
But when sending them to a CSV file and opening it in Excel åäö are not
shown correctly.
Has anybody succeeded in this?
Kenneth
If you have access to the file system you can find the error ticket in
the folder /applications/admin/errors
Kenneth
I tried the last version in trunk, and the admin application generates
a ticket... and looking at the ticket generates another ticket! (which
is the reason why I cannot
Please send it, it´s the only way to find out what the problem is.
Kenneth
Thank you Kenneth!
I must admit the file is difficult to analyze manually -- I'm happy to
send it as an attachement if useful.
On 26 nov, 09:21, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
If you have
Are the group and ownership of the files in /applicatios/admin correct.
Could you send a copy of the error file as I can´t access it from
outside without a password and not when admin is no working.
Kenneth
Open this file with an editor
/home/www-data/web2py/applications/admin/errors/
I´d say that warning messing in your log is not your problem. It should
work even if you get those warnings. At least for me it does.
Your are receiving that warning because your certifcate is for domain
pypy.domain.com but in your configuration your are talking about an
ip-address.
What
found the problem, I had no deposit folder in my web2py root folder. I
don´t know when it should have been created but I created it now by hand
and not it works.
Kenneth
2010/11/22 Kenneth Lundström kenneth.t.lundst...@gmail.com:
Can you clarify what does this mean?
When I select a layout
Hello list,
I´m trying to make a TOP10 list but don´t know how :=(
First I select the partners:
partners = db(db.partners.id 0).select()
for partner in partners:
sales = db(db.sales.partner == partner).select()
make some calculations and get a value for the customer.
Calculation is a lot more complicated then just a sum. I have to select
data from 3-4 tables and then do the calculations.
Maybe your second suggestion is the solution. How would you maintain
the list so ten biggest rows is on the list and the list stays in
correct order?
Kenneth
It's the standard You don't have permission to access
/admin/default/ index on this server. I know it's silly, and I've went
through most of the files available on how to supposedly fix this, but I
can't seem to get it to work.
You seem to have two different problems. I tried to access
Problem with change admin password is gone
but problem with layout not being applied is still active. Now I have
tried 3-4 different layouts, none is applied.
This is a relative fresh installation of web2py, maybe 1.88 something
this is my test installation. Then I have my main application
Can you clarify what does this mean?
When I select a layout when using the wizard to create a new application
the layout is not applied. It shows the application without the layout I
have selected.
Kenneth
This is a relative fresh installation of web2py, maybe 1.88 something
this is my
I have tried 2 or 3 different layouts, non of them worked. Which files
are updated?
Is it possible from the Admin to change the layout later on?
Kenneth
Is this for one particular layout?
On Nov 20, 8:53 am, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
because edit is more
I´m getting the exact same error, on 1.89.4 and python 2.6.5
Apache, linux, mod_wsgi, mysql
Kenneth
Can't change admin password in new version. See traceback below..
--
VERSION web2py™ Version 1.88.2 (2010-10-29 23:04:43)
Python Python 2.5.2: /usr/bin/python
TRACEBACK
Traceback
I tried to create a new application with the wizard and when I pressed
generate I got this error. When looking in the applictions folder all
subfolders that should be under applications/appliction_name are in the
applications folder. I created the folder and moved all subfolders into
it, now
Admin first page, why is the edit button black when all the others are
grey? It looks like the edit button is allready pressed.
On page /admin/wizard/step5/0:
Use the markmin syntax syntax to add text to your pages.
maybe one syntax is enough.
Am I doing something wrong when I´m create a new
because edit is more important. Is it really confusing?
Me first impression when I looked at admin was that Edit is active, but
I pressed Edit anyhow when I couldn't find any other way to edit it and
voilá I found the place. Not an big deal.
Any comments about the layout not showing?
{{for company in companies:}}
tr
td{{=uuid}}/td
td{{=address}}/td
/tr
{{pass}}
Shouldn´t this be like
td{{=company.uuid}}/td
td{{=company.address}}/td
or maybe
td{{=companies[company].uuid}}/td
td{{=campanies[company].address}}/td
Kenneth
Apache, mod_wsgi, linux, MySQL, web2py 1.89.4, source
I tried to change the admin password and got this error ticket.
Error ticket for admin
Ticket ID
Version
web2py™ Version 1.89.4 (2010-11-19 02:50:05)
Python Python 2.6.5: /usr/bin/python
Traceback
Traceback (most recent call last):
File
I created a new application with the wizard in admin. When my
application was created I got to a page (admin/wizard/generated) where
the first link says 'Open new app in new window' but for me it doesn´t
open it a new windows, Windows 7 and Firefox 3.6.12.
In admin there is a help button, it
What can I do to fix this? What kind of path issue is this?
Kenneth
hmmm. I can make the error go away but this is a path issue
On Nov 17, 3:31 pm, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
I tried to upgrade version 1.89.1 to 1.89.3. I got the following error.
I m running
The Upgrade problem I can´t test of course but now I manually upgraded
to 1.89.3 and still have the problem with creating a new application.
Kenneth
I do not have enough information to debug this. I suggest get 1.89.3
and see if you still have the problem, then I will suggest a test.
Apache, mod_wsgi, Linux, MySQL, source
Kenneth
what is you configuration (source/binary, apache/rocket)?
On Nov 18, 6:35 am, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
The Upgrade problem I can t test of course but now I manually upgraded
to 1.89.3 and still have the problem with
- unpacked the source package
- did a chown apache:web2py on all files
- login in to admin
- write the name of the new application and press create
- get the unable to create application test
Upgrade problem, the same, but
- select upgrade
- press YES
- get the error ticket
I don´t know what
OK, I have no idea if they are related, it was just a thought on my part.
Kenneth
Thanks Kenneth,
the traceback you posted applies to the second problem and I
understand that. I am scratching my head on why that traceback would
also apply to the first problem.
Massimo
On Nov 18, 7:09 am,
I´m too happily employed but doing some web2py development on my spare
time. You never know when a big,perfect job comes looking for you. If
your not on the list it might go to somebody else.
Kenneth
A bit off topic question -
I am currently happily employed and developing web2py based open
Correct, you edit the db.py file and reload a page and the database is
updated.
Kenneth
They are not set to false.
I'm coming from a slight rails perspective (some experience with it). In rails,
migrations are sequential. If you want to add a field to a table, you create a
new migration
for this beginners mistake.
But the problem with creating a new application stays.
Kenneth
On Nov 18, 2010, at 7:03 AM, Kenneth Lundström wrote:
OK, I have no idea if they are related, it was just a thought on my part.
Kenneth, in gluon/admin.py you'll find this code:
full_url = url
Now I finally found the problem. It looks like welcome.w2p is missing
from the source package.
When I copied a welcome.w2p to my web2py root directory I can create
applications.
Kenneth
On Nov 18, 2010, at 7:03 AM, Kenneth Lundström wrote:
OK, I have no idea if they are related
I tried to upgrade version 1.89.1 to 1.89.3. I got the following error.
I´m running Linux, Apache and mod_wsgi. Is this too an file permission
problem. I still can´t create a new application with admin. Don´t know
where to start looking for the problem.
Kenneth
Version
web2py™ Version
- Alkuperäinen viesti -
It is a file permission issue.
On Nov 13, 12:33 am, Kenneth Lundström kenneth.t.lundst...@gmail.com
wrote:
Centos 5.5, Apache 2 and mod_wsgi.
I tried using the New simple application. I gave it a name och
pressed create. I get unable to create
I have a Centos server running web2py with mod_wsgi, apache, MySQL,
MySQL-Python, python 2.6
As Centos uses python 2.4 I have installed 2.6 parallell with 2.4.
Then I have a new server where I´m trying to get everything to work but
no luck sofar. First I thought everything was OK until I
Doesn´t SQLFORM do this automatically?
One other way to do this would be like this.
In controller:
rows = db(db.data_table.id 0).select()
return dict(rows=rows)
In view:
form
table
{{for row in rows:}}
trtdrow.id/tdtdrow.data/td/tr
{{pass}}
/table
/form
Kenneth
Hi! I want to create a FORM
Where can I start to look for the problem. Is the problem written in
some log?
Kenneth
It is a file permission issue.
On Nov 13, 12:33 am, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
Centos 5.5, Apache 2 and mod_wsgi.
I tried using the New simple application. I gave it a name
I´ve read many posts about domains linked to different apps but still I
don´t know how to do it with Apaches virtual hosts.
I have looked at the web2py slices number 14.
Does anybody have two virtual hosts files or entries that you could send
that I could look at?
Kenneth
+1
I was thinking the same when I was using the wizard first time. Maybe so
that you still could do like you do now, write evertything or then you
could select everything from a dropdown box and checkboxes.
Kenneth
In the table creation step, how about having some columns with all the
Very nice site, the disappearing lightbulb is nice. One bad thing with
the disappearing lightbulb is if you reload the frontpage and scroll
down immediately, after a couple of seconds the page shakes like an
earthquake.
the Experts page looks a little bit odd, you have the texts Filter by
One more thing,
I went through all experts but one experts Internal error
http://experts4solutions.com/e4s/default/expert/7
Internal error
Ticket issued:
e4s/81.17.193.228.2010-11-12.13-29-46.5651ebc2-31b8-43df-94f0-44b48c2d4647
Just installed the newest version of web2py (1.89.1) and tested the
wizard to create a new appl.
I came to step 6 when I got a error.
Version
web2py™ Version 1.89.1 (2010-11-12 15:14:36)
Python
Traceback
Traceback (most recent call last):
File /data/domains/web2py/gluon/restricted.py, line
Can you check if this folder was created?
/data/domains/web2py/applications/Boatintra
No it was not created.
if not it is a file permission issue. What os? was it a binary
distribution of web2py?
Linux, source. All files permissions apache:web2py. I tried to change
file permissions of
Centos 5.5, Apache 2 and mod_wsgi.
I tried using the New simple application. I gave it a name och pressed
create. I get unable to create application 'testing'.
Kenneth
What is your setup? apache?mod_wsgi?
On Nov 12, 5:48 pm, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
Can
This is a educated guess but I think you can only have one requires,
when you write two the second is used. So if you put IS_NOT_EMPTY last
web2py only uses that one, and that alone is not enough for web2py to
build a dropdown.
IS_IN_DB takes out the need for IS_NOT_EMPTY as the value has to
I have a controller for different levels, org, customer, appointment and so on.
When i want to for example edit a customer the address looks like
/hostname/customer/edit/5/2 where 5 is the org and 2 is the customer.
Appointment would look like /hostname/appointment/5/2/10 where 10 is the id of
Isn´t there a special character code for space to, like for åäö?
Kenneth
This gets me pretty close!
I can't put spaces in the field... is there a way to do that?
In the end I will be parsing by space for a search feature I am trying
to implement.
Best Regards,
Jason Brower
On Thu,
Definitely A
Kenneth
P.S. Anyway... everybody should say their opinion now:
A)
http://www.web2py.com/examples/static/img/logo_lb.png
B)
http://www.solieworks.com/images/solie_web2py.png (first)
C)
http://www.solieworks.com/images/solie_web2py.png (second)
a coherent overwhelming response
http://web2py.com
Looking very nice.
New demo_admin:
http://web2py.com/demo_admin
Whats new in the new admin? Could not see anything new with a fast look.
Kenneth
first question:
what is this?? */30 * * * *
That */30 * * * * is ordinary linux crontab syntax, look at
http://adminschoice.com/crontab-quick-reference and the fist picture
when you scroll down. It should tell you what those * are.
Basically you define when the cron is runned,
first *
I installed Firebug and restarted firefox. Voila yellow color is
visible. Was it the installation of Firebug, restarting firefox or
reloading the page that made the color appear again.
Kenneth
It should still work but the color be orange instead of red. Can you
check the source with
I´m just updating my CSV import which generates password so I found
this line of code:
password =
base64.b64encode(sha.sha(str(random.random())).hexdigest())[:8]
Kenneth
hi all,
how i can generate a random string of 8 numbers/letters?
i need for generate an automatic
Hi Johann,
I might be completly wrong but I think that you can´t have
example.com/phpsite and example.com/web2py at the same time. You can
have http://phpsite.example.com and http://web2py.example.com
The reason is that the part after http:// (hostname) decides where to
go. If you have
import sha, random, base64
I have theese imports.
Kenneth
i have an error
NameError: global name 'base64' is not defined
On 14 Set, 10:10, Kenneth Lundströmkenneth.t.lundst...@gmail.com
wrote:
I m just updating my CSV import which generates password so I found
this line of
Would it be possible to look into the fact that when storing 24:00:00
and read out it will be converted into a value of 1 day instead of 24:00:00.
Kenneth
I will look. If this is a web2py issue it will be fixed.
On Sep 14, 4:14 pm, Fredfre...@gmail.com wrote:
I've got an application that
I´m trying to change the length of a string from 35 to 50 but I get
errors.
db.define_table('district',
db.Field('name', 'string', length=35, requires=IS_NOT_EMPTY()),
I´m trying to change it to:
db.define_table('district',
db.Field('name', 'string', length=50,
I upgraded to 1.84.1 and I think I found a bug.
I use the language edit function and before when orginal and translation
was the same the orginal was in red. Not anymore. Much more harder to
find texts to translate.
A suggestion about upgrade procedur. To upgrade to newest version is no
One way of solving this would be like this:
table
{{counter = 1}}
{{for row in rows:}}
{{if counter == 1:}}
trtd{{=row.facility}}/td
{{counter = 2}}
{{else:}}
td{{=row.facility}}/td/tr
{{counter = 1}}
{{pass}}
{{pass}}
/table
Kenneth
I have the following
Thank you Massimo again for a very fast reply.
Kenneth
TH(INPUT(_type=checkbox, _name=check_all, _onclick=return
popup(this,'notes')))
On Sep 4, 8:25 am, Kennethkenneth.t.lundst...@gmail.com wrote:
Hello,
how do I use HTML Helper to get make a th and checkbox tag.
THINPUT type=checkbox
Hello Rahul,
Currently we succeeded in running it on test server. When service
provider tries to deploy it on existing RedHat server, he encounters
port conflicts.
1) How to deploy it on Redhat/other linux without disturbing other
deployed sites, say on a different server port etc.
No
Hello Paul,
I´d be happy helping putting up a Linux box for web2py. I use CentOS as
my distribution, but if needed it should not be a big problem setting it
up on Ubuntu either.
Kenneth
Hi all,
Sounds like there's a little momentum in this :-)
Here's what I can contribute to the party:
The problem is the double closing parenthesis before label, it
should be:
requires=IS_IN_SET(['kalle','ville']), label=T('New seller')), **args)
otherwise the label is not part of the Field definition.
OK, no I see the problem. Thank you very many.
Kenneth
form['_formname'] =
My view looks like:
{{extend 'layout.html'}}
br
{{=T('Sellers in this campaign')}}br
table{{for person in person_data:}}
trtd
{{=A(str(person.name + + person.surname),
_href=URL(r=request, f='edit_seller', args=[troop.id, person.id,
person.troop_group]))}}
Of course, thats a very much easier way of doing. But it doesn´t work
either. It doesn´t get translated.
Kenneth
Hi Kenneth,
if you don't need the custom form then you can just use the label
parameter on the Field,
Field('new_seller', ..., label=T('Add seller'))
Denes.
On Aug 19, 12:28
Intresting, it doesn´t work.
If I use just label=T('Add seller') it doesn´t even translate (doesn´t
appear in my language file)
when I tried with label=str(T('Add seller')) the string is translate but
not shown.
Kenneth
Try label=str(T('Add seller'))
On Aug 19, 6:33 am, Kenneth
Hello David,
When I try and enter a URL like
http://mycommunity.127.0.0.1:8000/mm_beta_1/default/index; where mycommunity
is actually a parameter specifying which community
The problem is that the browser does not understand a address like
subdomain.127.0.0.1, you have to fool the
Now I´m getting:
Traceback(most recent call last):
Filegluon/restricted.py,line178,inrestricted
execccodeinenvironment
File/data/domains/exp-kal.nudata.fi/applications/init/controllers/troop.py
https://exp-kal.nudata.fi/admin/default/edit/init/controllers/troop.py,line2195,inmodule
I have a clean install of CentOS 5.5, so I´ll try to write down every
step of installing web2oy and make a slice of it.
Kenneth
That might be why I had so much difficulty with CentOS.
--
Thadeus
On Mon, Aug 9, 2010 at 12:14 PM, mdipierromdipie...@cs.depaul.edu wrote:
no
On Aug 9,
I finally found what the problem is.
I have defined the table as
db.Field('starts', 'time', requires=IS_TIME()),
db.Field('ends', 'time', requires=IS_TIME()))
and when a user fills the form I have as defaults starts = 0:00:00 and ends =
24:00:00
the ends value is the problem.
The
Hello,
is the US thing absolut?
Kenneth
Are you in US?
Have you contributed to web2py or developed something I can look at?
Looking for a paid project to work on?
Please contact me confidentially.
DO NOT REPLY to this thread.
Hello Neveen,
could you show us how you use xlwt? I´d be very interested.
Kenneth
Thanks a lot mdipierro i found the module xlwt and it is very useful.
Thanks
On Aug 5, 4:33 pm, mdipierromdipie...@cs.depaul.edu wrote:
rows.export_to_csv_filed(stream)
you can write more stuff to the
Waauu, many thanks Massimo, that was exactly what I was looking for. I
installed it and it works nicely but after modifying to fit my database
model I can´t the +1 and -1 buttons to work. Or they work but quantity
and balance is not updated. If I reload the page numbers are updated and
show
Traceback (most recent call last):
File gluon/restricted.py, line 173, in restricted
exec ccode in environment
File
/data/domains/live-kal.nudata.fi/applications/init/views/district/campaign.html,
line 187, in module
{{=A(XML('+ '), T('Add new personal reward'), XML(' raquo;'),
Thank You Yarko,
but in the tools.py file I couldn't find the text string Change password
that is show on the second row in the Change password page.
auth.messages.submit_button = T('Submit')
I didn´t find any auth.messages in the tools.py file. When I tried to but
auth.messages.submit_button
Those settings are correct, I can send mail from my application, but when I
try to go to page /init/default/user/retrieve_password I get the flash
message Function disabled.
Kenneth
On Wed, Sep 30, 2009 at 4:35 PM, mdipierro mdipie...@cs.depaul.edu wrote:
you have to configure your email
301 - 395 of 395 matches
Mail list logo