Re: [web2py] Re: web2py and gae : Delete everything in the datastore

2011-01-30 Thread Nathan VanHoudnos
It worked. :)

On Sat, Jan 29, 2011 at 6:03 PM, devGS vitali@geniestills.com wrote:

 Great than. From my experience with that future, it takes time to
 delete in bulk and the process is is splitted into hours in order to
 save your CPU time. You can track the process through your datastore
 panels, task queue, etc. That's all I can comment about. Hopping to
 hear about your experience.

 On Jan 29, 7:16 pm, Nathan VanHoudnos nathan...@gmail.com wrote:
  Yes, I am doing something wrong. I needed to navigate to 'Datastore
 Admin'
  instead of 'Datastore Viewer'. The admin pages allows you to delete
  everything quickly. The viewer page only allows you to delete in chunks
 of
  20.
 
  From:
 http://code.google.com/appengine/docs/python/datastore/entities.html
 
  Deleting Entities in Bulk via the Admin Console
  You can use the Datastore Admin tab of the Admin Console to delete all
  entities of a kind, or all entities of all kinds, in the default
 namespace.
  To enable this feature, simply include the datastore_admin builtin
 handler
  in app.yaml:
 
  builtins:
  - datastore_admin: on
 
  Adding this builtin enables the Datastore Admin screen in the Data
 section
  of the Admin Console. From this screen, you can select the entity kind(s)
 to
  delete individually or in bulk, and delete them using the Delete Entities
  button.
 
  Warning! Deleting entities in bulk happens within your application, and
 thus
  counts against your quota.
 
  This feature is currently experimental. We believe this feature is
 currently
  the fastest way to bulk-delete data, but it is not yet stable and you may
  encounter occasional bugs.
 
  Thanks for the help guys!
 
  Cheers,
 
  Nathan
 
  On Sat, Jan 29, 2011 at 9:23 AM, Nathan VanHoudnos nathan...@gmail.com
 wrote:
 
 
 
 
 
 
 
 
 
   I tried that again this morning, but it only lets me delete 20 at a
 time.
   Am I doing something wrong?
 
   (I have hundreds of entries to delete.)
 
   Cheers,
 
   Nathan
 
   On Fri, Jan 28, 2011 at 5:35 PM, howesc how...@umich.edu wrote:
 
   if i remember correctly the bulk delete was google's christmas present
 to
   us - in the decemeber release, so it's a new feature, but quite handy!
 
   --
   Nathan VanHoudnos
   |- Statistics  Public Policy PhD student
   |- Program for Interdisciplinary Education Research (PIER) Fellowship
   |- Carnegie Mellon University
   |-http://www.andrew.cmu.edu/user/nmv
 
   Neglect of mathematics works injury to all knowledge,
since he who is ignorant of it cannot know the other
sciences or the things of this world. -- Roger Bacon
 
  --
  Nathan VanHoudnos
  |- Statistics  Public Policy PhD student
  |- Program for Interdisciplinary Education Research (PIER) Fellowship
  |- Carnegie Mellon University
  |-http://www.andrew.cmu.edu/user/nmv
 
  Neglect of mathematics works injury to all knowledge,
   since he who is ignorant of it cannot know the other
   sciences or the things of this world. -- Roger Bacon




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


Re: [web2py] Re: web2py and gae : Delete everything in the datastore

2011-01-29 Thread Nathan VanHoudnos
I tried that again this morning, but it only lets me delete 20 at a time. Am
I doing something wrong?

(I have hundreds of entries to delete.)

Cheers,

Nathan

On Fri, Jan 28, 2011 at 5:35 PM, howesc how...@umich.edu wrote:

 if i remember correctly the bulk delete was google's christmas present to
 us - in the decemeber release, so it's a new feature, but quite handy!




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


Re: [web2py] Re: web2py and gae : Delete everything in the datastore

2011-01-29 Thread Nathan VanHoudnos
Yes, I am doing something wrong. I needed to navigate to 'Datastore Admin'
instead of 'Datastore Viewer'. The admin pages allows you to delete
everything quickly. The viewer page only allows you to delete in chunks of
20.

From: http://code.google.com/appengine/docs/python/datastore/entities.html

Deleting Entities in Bulk via the Admin Console
You can use the Datastore Admin tab of the Admin Console to delete all
entities of a kind, or all entities of all kinds, in the default namespace.
To enable this feature, simply include the datastore_admin builtin handler
in app.yaml:

builtins:
- datastore_admin: on

Adding this builtin enables the Datastore Admin screen in the Data section
of the Admin Console. From this screen, you can select the entity kind(s) to
delete individually or in bulk, and delete them using the Delete Entities
button.

Warning! Deleting entities in bulk happens within your application, and thus
counts against your quota.

This feature is currently experimental. We believe this feature is currently
the fastest way to bulk-delete data, but it is not yet stable and you may
encounter occasional bugs.


Thanks for the help guys!

Cheers,

Nathan

On Sat, Jan 29, 2011 at 9:23 AM, Nathan VanHoudnos nathan...@gmail.comwrote:

 I tried that again this morning, but it only lets me delete 20 at a time.
 Am I doing something wrong?

 (I have hundreds of entries to delete.)

 Cheers,

 Nathan


 On Fri, Jan 28, 2011 at 5:35 PM, howesc how...@umich.edu wrote:

 if i remember correctly the bulk delete was google's christmas present to
 us - in the decemeber release, so it's a new feature, but quite handy!




 --
 Nathan VanHoudnos
 |- Statistics  Public Policy PhD student
 |- Program for Interdisciplinary Education Research (PIER) Fellowship
 |- Carnegie Mellon University
 |- http://www.andrew.cmu.edu/user/nmv

 Neglect of mathematics works injury to all knowledge,
  since he who is ignorant of it cannot know the other
  sciences or the things of this world. -- Roger Bacon




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


[web2py] web2py and gae : Delete everything in the datastore

2011-01-28 Thread Nathan VanHoudnos
Hi,

I'm running web2py 1.91.6 on google app engine. I'd like to delete
everything in the datastore and start over.

If you have a quick solution for this, stop reading now and just tell me the
web2py way. :)

There is a StackOverflow thread that I found:

http://stackoverflow.com/questions/1062540/how-to-delete-all-datastore-in-google-app-engine


which assumes that you setup everything in Models.py which uses syntax very
different from the DAL and I can't make heads or tails of it.

I tried using the remote_api to do the deletion:

vanhoudn@gauze:~/workspace/creatia-rubrics/src$ python2.5
~/google_appengine/remote_api_shell.py creatia-rubrics
App Engine remote_api shell
Python 2.5.5 (r255:77872, Sep 14 2010, 17:16:34)
[GCC 4.4.3]
The db, users, urlfetch, and memcache modules are imported.
creatia-rubrics from google.appengine.ext.db import GqlQuery
creatia-rubrics query = GqlQuery(SELECT * FROM allRatings)
Traceback (most recent call last):
  File console, line 1, in module
  File
/home/vanhoudn/google_appengine.1.4.1/google/appengine/ext/db/__init__.py,
line 2296, in __init__
model_class = class_for_kind(self._proto_query._entity)
  File
/home/vanhoudn/google_appengine.1.4.1/google/appengine/ext/db/__init__.py,
line 266, in class_for_kind
raise KindError('No implementation for kind \'%s\'' % kind)
KindError: No implementation for kind 'allRatings'


But it gives me this weird KindError. Before i can get to the

db.delete(query)


step. So how do you access the kinds that you create in models/db.py? I
copied the GQL statement straight from the datastore viewer on
appspot.comso it shouldn't be a syntax error.

The relevant section of my models/db.py is:

db.define_table('allRatings',
Field('timeend','datetime',requires= IS_NOT_EMPTY() ),
Field('timestart','datetime',requires= IS_NOT_EMPTY() ),
Field('assignmentId',requires= IS_NOT_EMPTY() ),
Field('experimentId',requires= IS_NOT_EMPTY() ),
Field('workerId',requires= IS_NOT_EMPTY() ),
Field('studentIds',requires= IS_NOT_EMPTY() ),
Field('rubricCode',requires= IS_NOT_EMPTY() ),
Field('ipaddress' ,default=request.client),
Field('comment',requires= IS_NOT_EMPTY() ),
Field('rawAnswers',requires= IS_NOT_EMPTY() ),
Field('subscores',requires= IS_NOT_EMPTY() )
)


Any help would be appreciated!

Cheers,
-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


Re: [web2py] Re: web2py and gae : Delete everything in the datastore

2011-01-28 Thread Nathan VanHoudnos
Thanks for the reply.

To clarify, I want to wipe everything in the production datastore on
Google's servers. If it were only as easy as clearing the development
datastore!

Cheers,

Nathan

On Fri, Jan 28, 2011 at 3:10 PM, devGS vitali@geniestills.com wrote:

 Run your web2py app with a command from your GAE library and the flag -
 c.
 i.e: dev_appserver.py -c C:\web2py

 On Jan 28, 9:31 pm, Nathan VanHoudnos nathan...@gmail.com wrote:
  Hi,
 
  I'm running web2py 1.91.6 on google app engine. I'd like to delete
  everything in the datastore and start over.
 
  If you have a quick solution for this, stop reading now and just tell me
 the
  web2py way. :)
 
  There is a StackOverflow thread that I found:
 
  http://stackoverflow.com/questions/1062540/how-to-delete-all-datastor...
 
  which assumes that you setup everything in Models.py which uses syntax
 very
  different from the DAL and I can't make heads or tails of it.
 
  I tried using the remote_api to do the deletion:
 
  vanhoudn@gauze:~/workspace/creatia-rubrics/src$ python2.5
  ~/google_appengine/remote_api_shell.py creatia-rubrics
  App Engine remote_api shell
  Python 2.5.5 (r255:77872, Sep 14 2010, 17:16:34)
  [GCC 4.4.3]
  The db, users, urlfetch, and memcache modules are imported.
  creatia-rubrics from google.appengine.ext.db import GqlQuery
  creatia-rubrics query = GqlQuery(SELECT * FROM allRatings)
  Traceback (most recent call last):
File console, line 1, in module
File
 
 /home/vanhoudn/google_appengine.1.4.1/google/appengine/ext/db/__init__.py
 ,
  line 2296, in __init__
  model_class = class_for_kind(self._proto_query._entity)
File
 
 /home/vanhoudn/google_appengine.1.4.1/google/appengine/ext/db/__init__.py
 ,
  line 266, in class_for_kind
  raise KindError('No implementation for kind \'%s\'' % kind)
  KindError: No implementation for kind 'allRatings'
 
  But it gives me this weird KindError. Before i can get to the
 
  db.delete(query)
 
  step. So how do you access the kinds that you create in models/db.py? I
  copied the GQL statement straight from the datastore viewer on
  appspot.comso it shouldn't be a syntax error.
 
  The relevant section of my models/db.py is:
 
  db.define_table('allRatings',
  Field('timeend','datetime',requires= IS_NOT_EMPTY() ),
  Field('timestart','datetime',requires= IS_NOT_EMPTY() ),
  Field('assignmentId',requires= IS_NOT_EMPTY() ),
  Field('experimentId',requires= IS_NOT_EMPTY() ),
  Field('workerId',requires= IS_NOT_EMPTY() ),
  Field('studentIds',requires= IS_NOT_EMPTY() ),
  Field('rubricCode',requires= IS_NOT_EMPTY() ),
  Field('ipaddress' ,default=request.client),
  Field('comment',requires= IS_NOT_EMPTY() ),
  Field('rawAnswers',requires= IS_NOT_EMPTY() ),
  Field('subscores',requires= IS_NOT_EMPTY() )
  )
 
  Any help would be appreciated!
 
  Cheers,
  --
  Nathan VanHoudnos
  |- Statistics  Public Policy PhD student
  |- Program for Interdisciplinary Education Research (PIER) Fellowship
  |- Carnegie Mellon University
  |-http://www.andrew.cmu.edu/user/nmv
 
  Neglect of mathematics works injury to all knowledge,
   since he who is ignorant of it cannot know the other
   sciences or the things of this world. -- Roger Bacon




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


Re: [web2py] Re: Bug? SQLFORM.factory and SQLFORM differ in handling of hidden form fields

2011-01-20 Thread Nathan VanHoudnos
Done: http://code.google.com/p/web2py/issues/detail?id=162

http://code.google.com/p/web2py/issues/detail?id=162Thanks!

On Tue, Jan 18, 2011 at 4:29 PM, Massimo Di Pierro 
massimo.dipie...@gmail.com wrote:

 This is a bug. Would you please post your bug report email on
 googlecode? I will fix it asap.

 On Jan 18, 12:23 pm, Nathan VanHoudnos nathan...@gmail.com wrote:
  Hi,
 
  A minimal example:
  likertRightAnswer = ['Yes', 'No', 'Impossible to tell']
 
  form = SQLFORM.factory(
  Field('rightAnswer',
widget=horizontal_radios,
requires=IS_IN_SET(likertRightAnswer,
   error_message=T('Please choose a
  response.'))),
  hidden={'timestart':request.now.strftime('%Y-%m-%d %H:%M:%S')}
  )
 
  In this case, BEAUTIFY(request.post_vars) will include, timestart and
  rightAnswer, but BEAUTIFY(form.vars) will only include rightAnswer.
 
  If we instead setup the appropriate db as db.ratings, and then do:
  likertRightAnswer = ['Yes', 'No', 'Impossible to tell']
 
  form = SQLFORM(db.ratings,
  hidden={'timestart':request.now.strftime('%Y-%m-%d %H:%M:%S')}
  )
 
  In this case, both BEAUTIFY(request.post_vars) and BEAUTIFY(form.vars)
 will
  both include timestart and rightAnswer.
 
  The second behavior is more expected at least to me.
 
  Right now, I'm using request.post_vars.timestart to access the value
 after
  the form.accepts call, but this feels like I'm hacking something
 together.
 
  And it essentially circumvents the security feature discussed in this
  thread:
 
  http://groups.google.com/group/web2py/browse_thread/thread/ab21d9d216...
 
  So is this a bug? Or should I be doing something different? (My
 application
  creates a bunch of little temporary forms and I don't want to bloat
  the data-store with them.)
 
  Cheers,
  --
  Nathan VanHoudnos
  |- Statistics  Public Policy PhD student
  |- Program for Interdisciplinary Education Research (PIER) Fellowship
  |- Carnegie Mellon University
  |-http://www.andrew.cmu.edu/user/nmv
 
  Neglect of mathematics works injury to all knowledge,
   since he who is ignorant of it cannot know the other
   sciences or the things of this world. -- Roger Bacon




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


[web2py] Bug? SQLFORM.factory and SQLFORM differ in handling of hidden form fields

2011-01-18 Thread Nathan VanHoudnos
Hi,

A minimal example:
likertRightAnswer = ['Yes', 'No', 'Impossible to tell']

form = SQLFORM.factory(
Field('rightAnswer',
  widget=horizontal_radios,
  requires=IS_IN_SET(likertRightAnswer,
 error_message=T('Please choose a
response.'))),
hidden={'timestart':request.now.strftime('%Y-%m-%d %H:%M:%S')}
)

In this case, BEAUTIFY(request.post_vars) will include, timestart and
rightAnswer, but BEAUTIFY(form.vars) will only include rightAnswer.

If we instead setup the appropriate db as db.ratings, and then do:
likertRightAnswer = ['Yes', 'No', 'Impossible to tell']

form = SQLFORM(db.ratings,
hidden={'timestart':request.now.strftime('%Y-%m-%d %H:%M:%S')}
)

In this case, both BEAUTIFY(request.post_vars) and BEAUTIFY(form.vars) will
both include timestart and rightAnswer.

The second behavior is more expected at least to me.

Right now, I'm using request.post_vars.timestart to access the value after
the form.accepts call, but this feels like I'm hacking something together.

And it essentially circumvents the security feature discussed in this
thread:

http://groups.google.com/group/web2py/browse_thread/thread/ab21d9d21693ee2e/1f6781206e956405?lnk=gstq=hidden+form+fields+not+accepted#1f6781206e956405

So is this a bug? Or should I be doing something different? (My application
creates a bunch of little temporary forms and I don't want to bloat
the data-store with them.)

Cheers,
-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program for Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


[web2py] Can't install gae remote_api using web2py

2010-10-18 Thread Nathan VanHoudnos
Hi,

Attempting to follow the directions here:

http://code.google.com/appengine/docs/python/tools/uploadingdata.html


So I added to my app.yaml:

builtins:
- remote_api: on


And then I try to to run appcfg.py update:

vanho...@gauze:~/google_appengine$ python2.5 appcfg.py update
../workspace/nathanvan-creatia/src/
Error parsing yaml file:
Unexpected attribute 'builtins' for object of type class
'google.appengine.api.appinfo.AppInfoExternal'.
  in ../workspace/nathanvan-creatia/src/app.yaml, line 58, column 1

The whole app.yaml file follows. (It is just the standard web2py file.):

application: nathanvan-creatia
version: 1
api_version: 1
runtime: python

derived_file_type:
- python_precompiled

handlers:

- url: /_ah/stats.*
  script: $PYTHON_LIB/google/appengine/ext/appstats/ui.py
  login: admin

- url: /(?Pa.+?)/static/(?Pb.+)
  static_files: applications/\1/static/\2
  upload: applications/(.+?)/static/(.+)
  secure: optional
  expiration: 90d

- url: /_ah/admin/.*
  script: $PYTHON_LIB/google/appengine/ext/admin
  login: admin

- url: /_ah/queue/default
  script: gaehandler.py
  login: admin

- url: .*
  script: gaehandler.py
  secure: optional

admin_console:
  pages:
  - name: Appstats
url: /_ah/stats

skip_files: |
 ^(.*/)?(
 (app\.yaml)|
 (app\.yml)|
 (index\.yaml)|
 (index\.yml)|
 (#.*#)|
 (.*~)|
 (.*\.py[co])|
 (.*/RCS/.*)|
 (\..*)|
 ((admin|examples|welcome)\.tar)|
 (applications/(admin|examples)/.*)|
 (applications/.*?/databases/.*) |
 (applications/.*?/errors/.*)|
 (applications/.*?/cache/.*)|
 (applications/.*?/sessions/.*)|
 )$

builtins:
- remote_api: on


I must be missing something obvious. Do I need to manually add some files to
the web2py instance for this to work?

Cheers,
-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program in Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon


Re: [web2py] Re: Can't install gae remote_api using web2py

2010-10-18 Thread Nathan VanHoudnos
I do have the most recent version of the App Engine SDK loaded and I've
double checked I'm calling the correct version.

I'll ask my question on the GAE forum as Richard suggested. (I had thought
at first that this was a web2py issue. I'm new to both, so I'm often unsure
if my question should be an App Engine or web2py question.)

Thanks for the response though!

Cheers,

Nathan

On Mon, Oct 18, 2010 at 8:24 PM, howesc how...@umich.edu wrote:

 perhaps silly question...but did you upgrade the google SDK to the
 latest version?  being that it's a new feature you want to make sure
 you are using the latest SDK to do the upload.  (perhaps you have an
 old version of appcfg.py on your path?)

 cfh

 On Oct 18, 11:21 am, Nathan VanHoudnos nathan...@gmail.com wrote:
  Hi,
 
  Attempting to follow the directions here:
 
  http://code.google.com/appengine/docs/python/tools/uploadingdata.html
 
  So I added to my app.yaml:
 
  builtins:
  - remote_api: on
 
  And then I try to to run appcfg.py update:
 
  vanho...@gauze:~/google_appengine$ python2.5 appcfg.py update
  ../workspace/nathanvan-creatia/src/
  Error parsing yaml file:
  Unexpected attribute 'builtins' for object of type class
  'google.appengine.api.appinfo.AppInfoExternal'.
in ../workspace/nathanvan-creatia/src/app.yaml, line 58, column 1
 
  The whole app.yaml file follows. (It is just the standard web2py
 file.):
 
  application: nathanvan-creatia
  version: 1
  api_version: 1
  runtime: python
 
  derived_file_type:
  - python_precompiled
 
  handlers:
 
  - url: /_ah/stats.*
script: $PYTHON_LIB/google/appengine/ext/appstats/ui.py
login: admin
 
  - url: /(?Pa.+?)/static/(?Pb.+)
static_files: applications/\1/static/\2
upload: applications/(.+?)/static/(.+)
secure: optional
expiration: 90d
 
  - url: /_ah/admin/.*
script: $PYTHON_LIB/google/appengine/ext/admin
login: admin
 
  - url: /_ah/queue/default
script: gaehandler.py
login: admin
 
  - url: .*
script: gaehandler.py
secure: optional
 
  admin_console:
pages:
- name: Appstats
  url: /_ah/stats
 
  skip_files: |
   ^(.*/)?(
   (app\.yaml)|
   (app\.yml)|
   (index\.yaml)|
   (index\.yml)|
   (#.*#)|
   (.*~)|
   (.*\.py[co])|
   (.*/RCS/.*)|
   (\..*)|
   ((admin|examples|welcome)\.tar)|
   (applications/(admin|examples)/.*)|
   (applications/.*?/databases/.*) |
   (applications/.*?/errors/.*)|
   (applications/.*?/cache/.*)|
   (applications/.*?/sessions/.*)|
   )$
 
  builtins:
  - remote_api: on
 
  I must be missing something obvious. Do I need to manually add some files
 to
  the web2py instance for this to work?
 
  Cheers,
  --
  Nathan VanHoudnos
  |- Statistics  Public Policy PhD student
  |- Program in Interdisciplinary Education Research (PIER) Fellowship
  |- Carnegie Mellon University
  |-http://www.andrew.cmu.edu/user/nmv
 
  Neglect of mathematics works injury to all knowledge,
   since he who is ignorant of it cannot know the other
   sciences or the things of this world. -- Roger Bacon




-- 
Nathan VanHoudnos
|- Statistics  Public Policy PhD student
|- Program in Interdisciplinary Education Research (PIER) Fellowship
|- Carnegie Mellon University
|- http://www.andrew.cmu.edu/user/nmv

Neglect of mathematics works injury to all knowledge,
 since he who is ignorant of it cannot know the other
 sciences or the things of this world. -- Roger Bacon