Re: Reddit open sources their site pylons implementation

2008-06-19 Thread Jonathan Vanasco
This is really great! We've been working on OpenSourcing a bunch of our stuff, and its nice to see some overlap on some things... and find inspiration on others. Dalius- Do you know the python OpenID libraries well? Prerhaps I could convince you to help us with an openid plugin for our project

Re: jsonp support

2008-06-19 Thread Jonathan Vanasco
this thread had me thinking... it would be really neat if there were a way to cancel out the jsonify decorator in a function ie: @jsonify def index(self): rVal= { 'status': 'error' } self.jsonify_cancel() return rVal i can't remember why i wanted to do this, but i had a good reason

Re: jsonp support

2008-06-19 Thread Jonathan Vanasco
this thread had me thinking... it would be really neat if there were a way to cancel out the jsonify decorator in a function ie: @jsonify def index(self): rVal= { 'status': 'error' } self.jsonify_cancel() return rVal i can't remember why i wanted to do this, but i had a good reason

Re: '+' in URL not getting stripped away like '%20'

2008-06-19 Thread Jonathan Vanasco
I came upon a similar issue a while back. I don't have an answer for you, BUT I did want to post some info in case anyone ends up making a patch based on this... basically, the world of 'url safe chars' is a little confusing, as there are multiple standards and most people still use and

Re: custom domain mapping to a controller/id path?

2008-06-17 Thread Jonathan Vanasco
create your own url_for function in helpers, and just wrap url_for with it. ie: lib/helpers def custom_url_for( name ): domain = getDomain if domain == 'a': return '%s/%s' % ( url_for(name) , 'a' ) elif domain == 'b': return '%s/%s' % ( url_for(name) , 'b' )

Re: best practices for static resources

2008-06-16 Thread Jonathan Vanasco
i do this: server { listen 80; server_name myapp.com www.myapp.com ; access_log /var/log/nginx/myapp/myapp.com-access.log main; error_log /var/log/nginx/myapp/myapp.com-error.log ; location ~ ^/(_img|_css|_js) { include

javascript deprecation questions

2008-06-13 Thread Jonathan Vanasco
Mike has been talking about the impending deprecations, so I read though everything on the wiki... and then this posting from january http://groups.google.com/group/pylons-discuss/browse_thread/thread/256bbefedc07d218/64c3a274e7b03122 I'm a little less-than-enthusiastic to see some of this

Re: Mako migration strategies

2008-06-12 Thread Jonathan Vanasco
On Jun 11, 10:09 pm, Mike Orr [EMAIL PROTECTED] wrote: Dispatch to another function via a keyword argument?  I'm not sure what that means.   That means...  The render function takes an engine name or uses the default engine, and invokes the corresponding plugin. which is where my confusion

Re: Bulk inserts

2008-06-12 Thread Jonathan Vanasco
one of the things i HATE about mysql, is the 5.0 branch , nothing failed. they specifically wanted everything to go though, and valued that behavior over integrity. in terms of what happens when something does fail now? I'm pretty sure the mysql and postgres docs have workarounds/solutions for

Re: Application keeps 'stalling'

2008-06-12 Thread Jonathan Vanasco
On Jun 12, 6:22 pm, ionel [EMAIL PROTECTED] wrote: this is an ab bug actually, see:https://issues.apache.org/bugzilla/show_bug.cgi?id=21495 you might want to update ab or use httperf for benchmarking I thought that ab might be at fault, but the website was unreachable by other means too.

Re: Mako migration strategies

2008-06-11 Thread Jonathan Vanasco
interesting decision on the change. In a Perl framework I once built, we approached this a little differently 1. a var was set on app startup to set the render function's default behavior 2. the render() function took a keyword argument to dispatch to another function that worked really well

Where / How are the c and g variables instantiated and reset ?

2008-06-02 Thread Jonathan Vanasco
I'm prepping some software for release as a 'platform', and realized that it might seem to better suit our purposes if we re-implmented a c and g as our own vars, instead of creating a new namespace within each. I'd like to explore/test this approach. According to pylons/__init__.py , they're

Re: Where / How are the c and g variables instantiated and reset ?

2008-06-02 Thread Jonathan Vanasco
Your words are gold. Thank you! --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group, send email to pylons-discuss@googlegroups.com To unsubscribe from this group, send email

Re: advice with configuration/scaling a live Pylons app.

2008-05-30 Thread Jonathan Vanasco
On May 29, 10:56 pm, Mike Orr [EMAIL PROTECTED] wrote: That's akin to the user pressing the Stop button in the browser.  I get a connection reset line for that in my Quixote apps but not in my Pylons app.  I assumed Pylons just ignored the exceptions because it's not really an error if the

Re: advice with configuration/scaling a live Pylons app.

2008-05-30 Thread Jonathan Vanasco
going off topic for a bit... i just realized that a bottleneck on one of systems was from a typo -- I was setting a DB rollback on the wrong database handle ( read instead of config ). that caused an series of 'In Transaction' database blocks that would not seem to cause any issue... until i

Re: advice with configuration/scaling a live Pylons app.

2008-05-30 Thread Jonathan Vanasco
On May 30, 2:19 pm, Shannon -jj Behrens [EMAIL PROTECTED] wrote: * ab is a bit simple minded to begin with.  I've told it to use 100 concurrent requests (which I saw that you didn't do), and it saw all sorts of failed connections.  Of course, getting 100 *concurrent* requests isn't all that

Re: How did you begin your fun with Pylons?

2008-05-29 Thread Jonathan Vanasco
On May 29, 8:07 am, Alberto Valverde [EMAIL PROTECTED] wrote: Perhaps a trip to archives [1] to refresh your memory on the tone of some of your posts can shed a light on the reason you felt treated in this way by TG's dev. community. Perhaps my tone got increasingly negative as a response to

Re: How did you begin your fun with Pylons?

2008-05-28 Thread Jonathan Vanasco
On May 22, 6:07 pm, Shannon -jj Behrens [EMAIL PROTECTED] wrote: Ben Bangert and I decided to meet for dinner in Berkeley.  I got very lost and ended up in Oakland.  I finally got to the restaurant an hour late.  Ben had already eaten.  We had a good talk about Web development.  He told me

Re: Pylons Security Advisory - Pylons 0.9.6.2 released

2008-05-28 Thread Jonathan Vanasco
Thanks! --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group, send email to pylons-discuss@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For

Re: advice with configuration/scaling a live Pylons app.

2008-05-28 Thread Jonathan Vanasco
have you been profiling your db at all? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group, send email to pylons-discuss@googlegroups.com To unsubscribe from this group, send

Re: advice with configuration/scaling a live Pylons app.

2008-05-28 Thread Jonathan Vanasco
On May 28, 5:24 pm, SamDonaldson [EMAIL PROTECTED] wrote: Yes, we've profiled the db.  Are you asking because of the concern over failed requests in the ab benchmark test? 1- The first bottleneck anyone hits is the usually the DB 2- You can get some idea of how connection pooling is working

Re: advice with configuration/scaling a live Pylons app.

2008-05-28 Thread Jonathan Vanasco
On May 28, 6:12 pm, SamDonaldson [EMAIL PROTECTED] wrote: Should I make the switch to nginx as it seems like everybody has something good to say about nginx, and it's a good load balancer. I'm biased against lighttpd from experience 2 years ago, so won't comment. I will say that it would be

Re: Cross-Project code sharing...modules/plugins what does Pylons use?

2008-05-24 Thread Jonathan Vanasco
I *really* like how the modular approach can compartmentalize the necessary templates and controllers. I intensely dislike how the modular approach compartmentalizes the routing and model. If something is affecting the routing model, IMHO, it's not a plugin - its a standalone app. At

Re: Deployment Question

2008-05-24 Thread Jonathan Vanasco
On May 24, 5:10 am, Shannon -jj Behrens [EMAIL PROTECTED] wrote: Bob Ippolito was telling me once that he took a server in Twisted and rewrote it in stackless.  He got some performance gains, but then he rewrote it in Erlang.  It dropped from 40% CPU utilization to almost nothing, and it was

Re: Deployment Question

2008-05-23 Thread Jonathan Vanasco
On May 23, 3:48 pm, Mike Orr [EMAIL PROTECTED] wrote: This is quite interesting.  I've been looking for a way to build a site scraper (something analogous to an aggregator but more site-specific) that could eventually become asynchronous, and this looks a lot easier than Twisted.  

Re: Deployment Question

2008-05-22 Thread Jonathan Vanasco
On May 22, 4:20 am, Alberto Valverde [EMAIL PROTECTED] wrote: The reason I use it over paster+supervisord is because I find it *much* easier to set up and maintain and more powerful (mod_wsgi can be configured to spawn wsgi applications into separate processes under their own user/group,

Re: Deployment Question

2008-05-22 Thread Jonathan Vanasco
On May 22, 3:43 am, Cliff Wells [EMAIL PROTECTED] wrote: Again, I think this contrast is artificial.  You are setting up vertical scaling and horizontal scaling as mutually exclusive when they are anything but, and unless you have endlessly deep pockets, you should prefer to control the

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 20, 9:13 pm, Graham Dumpleton [EMAIL PROTECTED] wrote: Also see my comments in other post, but when you say 'proxy' I hope you don't really mean 'proxy'. I wrote 'proyxing' when I meant 'pushing' Let me rephrase... In my standard setups, nginx on port 80 maps static content

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 20, 4:33 pm, Mike Orr [EMAIL PROTECTED] wrote: each, 100,000 requests/day is not that many.  That's 4166/hour or 70/minute.  Any non-anemic server can do that in its sleep.  Our server has two sites each doing more than that several times a day, plus three smaller sites. when you

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 21, 4:09 am, Mike Orr [EMAIL PROTECTED] wrote: On Tue, May 20, 2008 at 11:54 PM, Jonathan Vanasco Well, for a Pylons site with Postgres that wants to be scalable up front, a three-server setup makes sense.  One for the Pylons app, one for the static content, and one for the database

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 20, 8:48 pm, Graham Dumpleton [EMAIL PROTECTED] wrote: Using mod_perl as an indicator is actually a bad idea. This is because it tends to be the worst of the bunch when it comes to bloating out Apache. Thus saying that all solutions which embed an interpreter in Apache are bad based

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 21, 12:49 pm, Mike Orr [EMAIL PROTECTED] wrote: He did say scalable and video, which I took to mean ultra-heavy use of very large files, and overkill didn't matter. The disk space alone is one reason why static content might want to be on a separate box, so it can be plugged into a

Re: Deployment Question

2008-05-21 Thread Jonathan Vanasco
On May 21, 6:06 pm, Mike Orr [EMAIL PROTECTED] wrote: The only noise was about whether Apache is too bloated for its own good, and whether Nginx is better than everything else.  But knowing what other Pylons sysadmins think of the merits of each is still worthwhile, even though we don't want

Re: Deployment Question

2008-05-20 Thread Jonathan Vanasco
On May 20, 1:33 am, Mike Orr [EMAIL PROTECTED] wrote: People say it also has a better knowledge of the quirky useragents out there and can correct misformed requests better than just exposing PasteHTTPServer or CherryPy directly, though I don't know how true it is. That's pretty much true.

Re: More WebHelpers 0.6-dev changes

2008-05-19 Thread Jonathan Vanasco
select() now handles int values and implicitly converts them to strings for HTML.  This allows you to link a select pulldown to an int database value, and to use ints in your options lists.  Thanks to Christoph Haas for this patch, which helps my applications too. neat! is there a

Re: Deployment Question

2008-05-19 Thread Jonathan Vanasco
so is Apache considered to be a good thing (through mod_wsgi , mod_python , or other ?) i've been doing mod_perl dev for years, and have had some experience with mod_python -- generally speaking, my experience is that if you can avoid apache you're better off. i guess that's what is throwing me

Re: parameterized controllers

2008-05-18 Thread Jonathan Vanasco
i'm not sure if this is the same... i often do stuff like this: class coreObjectController: def do_stuff(): Session.query( self.model_object ).blach def do_more(): pass class aCrontroller( coreObjectController ): self. model_object = class_a class bCrontroller( coreObjectController ):

Deployment Question

2008-05-16 Thread Jonathan Vanasco
I'm a little unclear on the better ways to deploy a Pylons app. My production servers run nginx -- is it better to use some fastcgi support (if so, how?) or just do a paster serve and proxy to that port? I've read a handful of ways on how-to-deploy apps, and all seem different. I've yet to see

autocomplete

2008-05-14 Thread Jonathan Vanasco
is anyone working on building this into pylons? i haven't see it talked about on the list for almost 1 full year --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group, send

Re: autocomplete

2008-05-14 Thread Jonathan Vanasco
http://demo.script.aculo.us/ajax/autocompleter_customized --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group, send email to pylons-discuss@googlegroups.com To unsubscribe from

Re: autocomplete

2008-05-14 Thread Jonathan Vanasco
Thanks for all the links. I will check out those attempts. I figured it would be 'built in' at some point, because i hear they do it in other frameworks. On a semi-related note does anyone have a resource for a good way to do one of those ajax checks to see if a username is already in use as

Re: sys.path

2008-05-14 Thread Jonathan Vanasco
i do something similar to get the recaptcha client to work (the installer is broken) along with some other modules my solution is this: 1_ I have an 'externals' dir in lib /myapp/lib/externals/recaptcha 2_ at the top config/environment.py i have import sys appdir= sys.path[0] appexternals=

Re: tg_flash equivalent in pylons?

2008-05-02 Thread Jonathan Vanasco
as for the improvement I have to disagree TG1 gives you more than pylons in fact pylons is like a barebone TG. To many of us, that IS the huge improvement ;) --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups

Re: is there a good way to stash a global var, that doesn't use g/app_globals

2008-04-29 Thread Jonathan Vanasco
because i won't know the name of appconfig.py i'm creating a subclassable framework for distribution DerivedApp/ DerivedApp/model BaseApp/ BaseApp/lib/helpers I'm trying to get the BaseApp/lib/helpers to access Globals, so that it can access objects in DerivedApp/model (which might have

Re: None option for options_for_select_* helpers

2008-04-29 Thread Jonathan Vanasco
actually, i like the notion of options_for_select supporting a none option i'd like to see that supported at some time. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post to this group,

Re: is there a good way to stash a global var, that doesn't use g/app_globals

2008-04-29 Thread Jonathan Vanasco
my DerivedApp/model is a subclass of BaseApp/model , etc etc i've got helpers working as you suggested too the issue i was hitting, is that in the BaseApp/helpers i'm trying to create a function that interacts with DerivedApp/Model i got around it by just passing in model, this will work for

Re: Crash after coockie expired

2008-04-28 Thread Jonathan Vanasco
On Apr 28, 1:59 am, Ben Bangert [EMAIL PROTECTED] wrote: What's the other exception that is occurring? type 'exceptions.AttributeError': 'module' object has no attribute 'userInfo' happens if you have a pickled object (in my case, a simple object called userInfo ) in your session, but change

Re: url_for() constrcut URL with MultiDict parameters?

2008-04-28 Thread Jonathan Vanasco
On Apr 29, 12:38 am, Mike Orr [EMAIL PROTECTED] wrote: On Mon, Apr 28, 2008 at 6:19 PM, jerry [EMAIL PROTECTED] wrote:  Is there a way to construct URLs like /controller/action/id?  q=1q=2 with url_for()? I don't think so.  If there's demand for this we can turn a list of values into

Re: pydecforms - yet another form builder

2008-04-25 Thread Jonathan Vanasco
I don't see why you need to integrate with sqlalchemy at all though Something that I would like to see is to see good support defaults In my mind, defaults come from 2 places: a- validated get/post data that is redisplayed b- application generated info ( db pull? ) right now, its a major PITA

Re: Protect CSS,Image and JavaScript

2008-04-23 Thread Jonathan Vanasco
The second question is, why do you want to protect them?  If you're trying to prevent unauthorized users from accessing them, protection makes sense.  But if you want to force authorized users to view them only embedded in an HTML page rather than directly -- you can't.  If the browser can

Architecture advice for Open Source app, please...

2008-04-23 Thread Jonathan Vanasco
for their digital efforts. Best, // Jonathan Vanasco w. http://findmeon.com/user/jvanasco e. [EMAIL PROTECTED] | Founder/CEO - FindMeOn, Inc. | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | FindMeOn.com - The cure for Multiple Web

Re: CSRF Question

2008-04-20 Thread Jonathan Vanasco
ben- the secure_form validator sounds perfect. thanks for the heads up. i think i'm going to play with some post-processing to enable secure_form though post-processing. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google

CSRF Question

2008-04-18 Thread Jonathan Vanasco
Django has a neat middleware component http://www.djangoproject.com/documentation/csrf/ has anyone thought of porting this to pylons? --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups pylons-discuss group. To post

Re: @validate split - code!

2008-04-17 Thread Jonathan Vanasco
Cookbooked: http://wiki.pylonshq.com/display/pylonscookbook/Hacking+validate+into+a+split+functionality I did some 'namespace' caching to add rudimentary support for multiple forms, and defaulting to the 'last form'. i'm not sure if its necessary, but i like things to be extensible. if

Re: @validate split - code!

2008-04-16 Thread Jonathan Vanasco
I'm a little unclear on your goals, so the answer is yes and not really. ;) This refactoring will let the form validate as a decorator, and then allow you to cause an error within your pylons function @validate( blah ) def stuff( self ): # yay, form is valid if not

Re: @validate split - code!

2008-04-16 Thread Jonathan Vanasco
That solves another problem we have: how to trigger a form error in the action after the validator has passed. exactly. that's been my motivation. Normally you don't want to decorators in non-decorator situations, so you'd need another function for this. yeah... i might take a stab at

Re: @validate split - code!

2008-04-16 Thread Jonathan Vanasco
Mike- Any comments on this: http://pylonshq.com/pasties/775 sorry i killed the docstrings on that ;) now you can call validate_form( self, @validate args ) which returns true/false on form validation the main thing i don't like about my refactoring: it's using some caching to preserve

addressing app 'name'

2008-04-14 Thread Jonathan Vanasco
i'm working on a building a framework of common social networking features for several pylons apps to subclass/inherit from an issue that I'm running into, is that I need to access/import some things not from pylons, but from the app itself instead of doing from ..lib import helpers as

showing defaults / submitting form info

2008-04-06 Thread Jonathan Vanasco
i'm trying, without any luck, to fill a form with default values in my application we have --- class Form: basic form validation pass class Controller: def index(self): print form @validator def submit(self): some advanced validation that is not appropriate

Re: testing if a url is valid ?

2008-03-24 Thread Jonathan Vanasco
On Mar 23, 11:31 pm, Mike Orr [EMAIL PROTECTED] wrote: Why? It seems intuitive to me.  The  first request doesn't know what the URL is but it knows the user shouldn't be going out of the preview section. The first request should be able to decide if it will redirect to an error, or a

Re: splitting validate in two

2008-03-23 Thread Jonathan Vanasco
On Mar 23, 4:57 pm, Wichert Akkerman [EMAIL PROTECTED] wrote: At the moment you get all four in one decorator. If you want a subset of them you have to code the whole thing yourself. I'm not sure what the best way to make that more modular - we don't want to make the common case more

testing if a url is valid ?

2008-03-23 Thread Jonathan Vanasco
is there a way to test if a url is valid , or where it maps to? i can't find that within the pylons code use case: i'm locking a project down to 'preview', and want to redirect uncookied users to '/preview/%(original_request)' if that is a valid url, and /preview otherwise.

Re: splitting validate in two

2008-03-23 Thread Jonathan Vanasco
On Mar 23, 10:32 pm, Ian Bicking [EMAIL PROTECTED] wrote: These can't be that hard, can they?  If they are hard, then we could push a little something back into FormEncode, I suppose.  If these are easy, then not using @validate should be easy, as it's the second two items that I think

Re: testing if a url is valid ?

2008-03-23 Thread Jonathan Vanasco
On Mar 23, 8:56 pm, Mike Orr [EMAIL PROTECTED] wrote: You can check if there's a valid route by getting the routemapper out of the environ and trying to match it, but that won't tell you whether the controller and action exist.  You'd have to duplicate Pylons' dispatching code to do that.  

how do i show form errors on a template ?

2008-03-09 Thread Jonathan Vanasco
I made a FormValidator subclass called DatefieldsValidator (below) , which validates a day/month/year field how should I push errors from there into the template ? can helpers be used? --- class DatefieldsValidator(formencode.validators.FormValidator): Checks if a date is valid

formencode troubles with utf8

2008-03-08 Thread Jonathan Vanasco
My formencode validators keep tossing back: - Value must be one of: 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12 (not u'1') How do i get formencode to handle utf8, or convert utf8 to ascii. i don't care which right now, i just want to move forward a bit

Re: xss attack defense options

2008-03-08 Thread Jonathan Vanasco
I quickly ported my Perl system for this, a little messy/unstructured - but if someone wants to take from there, sweet. in app_globals you define a regex series for valid referers in controllers you just add require_local_referer= True which pulls the __before__ method, or call

Re: formencode troubles with utf8

2008-03-08 Thread Jonathan Vanasco
To elaborate, I figured out this is because of a string/int comparison: my valid info is: days= range(1,31) formencode doesn't like that. it works if i do: days= [%s%i for i in range(1,31) ] does anyone have a method of allowing string/int type comparisons using formencode? or do i need

form generation questions

2008-03-08 Thread Jonathan Vanasco
there are a few more things i can't figure out. assuming I have in my controller: class Form_Register(formencode.Schema): us_state= formencode.validators.OneOf(g.us_states.keys(),hideList=True) and in my template: ${h.select('us_state',

two questions regarding actions in routes

2008-03-04 Thread Jonathan Vanasco
this is straightforward: i- if i call /:controller/:action and :action is undefined, i get type 'exceptions.NotImplementedError': Action u'abcdefg' is not implemented How do i push things like that to a 404 instead? I can't find that in the docs. ii- semi related -- shouldn't

Re: two questions regarding actions in routes

2008-03-04 Thread Jonathan Vanasco
On Mar 4, 5:12 pm, mat [EMAIL PROTECTED] wrote: Your don't, your getting this because your in debug mode. Setting debug = false will stop the ErrorHandler middleware helping you and return 404. oh great! thanks! I'm not sure i get your self.view here. I'm not aware controllers have view

Re: two questions regarding actions in routes

2008-03-04 Thread Jonathan Vanasco
If your real question is, How do I configure routing for the home page?, you define a route with path ''. If you're wondering how to structure your application, give us a bit more information about  your planned URLs and pages, and we can help with the routing and actions. I was just

database questions

2008-03-03 Thread Jonathan Vanasco
the app that I'm working on has some constraints that are implemented under mod_perl , php python. i'm trying to figure out how to do this in pylons/sa -- hoping some people can point me in the right direction basically, I use 5 database connections -- each with different permissions / roles

Re: database questions

2008-03-03 Thread Jonathan Vanasco
Mike- Thanks for the feedback , and the great tutorial -- i had actually used it as a reference when playing around with reflection. I have a few questions left... You can define all tables in a single metadata unless you're doing something really wacky. ha. ok. 1) Don't bind any

Re: 'Importing' existing databases

2008-03-02 Thread Jonathan Vanasco
thanks- i'll check out elixer i was playing with sqlautocode but it had too many issues with my db i'm offloading some stuff for a mod_perl + php + raw python app into pylons. postgres has 273 tables. i think i need about 50 min in pylons -- and I want to automate as much of the

<    8   9   10   11   12   13