Revsys "Office Hours" - November 5, 2010

This is a transcript of our "office hours" held November 5th, 2010. The transcript has been lightly edited to group conversations into a more structured Q&A.

Contents:

justinlilly
What sort of market do you think there is for training stuff w/r/t django?
fwiles tacks up a sign on the wall, "Now serving Customer #1"
justinlilly
Specifically something akin to peepcode, but with more of a systems/deployment/django/python flavor.
jacobkm
justinlilly: I think there's a market, certainly, but you'd have to be careful.
jacobkm
i.e. my classes generally do OK, but Django books on average tend not to sell well at all.
amjoconn
re: books, I guess the online docs are just too good/readable.
justinlilly
amjoconn, there are gaps.
jacobkm
I think Django's good documentation means that beginner-oriented material is hard to justify charging for. I know of at least one publisher who's decided not to print any more Django books because they decided they can't compete with the docs.
justinlilly
I'm thinking pragmatic, short format things. $X to learn what you need to know to get a reasonable django site deployed to AWS.
Alex_Gaynor_
justinlilly: Besides the deployment step, is there anything there that isn't in the docs?
jacobkm
justinlilly: yup, that's pretty much where I target my classes -- towards people who've already written Django sites and need to know what to do *next. Best practices, external stuff, deployment, etc.
justinlilly
Alex_Gaynor_, stuff circling third party libraries, more information on testing strategies, etc.
justinlilly
ie: how do I setup celery, how do I scale celery, what about celery will bite me in the ass?
justinlilly
celery solves problems X,Y,Z.. what other solutions exist to those 3 problems.
kennethlove
In the Django admin, how can we get a single inline fieldset?
kennethlove
If we set `extra=0` and `max_num=0`, we get a single inline formset but the save never goes through. This non-save behavior happens for any combination where `extra` or `max_num` is 0. If we specify `max_num=1` and leave off `extra`, the save goes through but we get two inline fieldsets.
ipmb
kennethlove: what version of Django are you using?
kennethlove
ipmb: 1.2.3
jacobkm
kennethlove: I think you just need extra=1, max_num=1.
fwiles
kennethlove: you just need to set extra=1 and leave max_num alone
kennethlove
jacobkm: had that and still got 2
fwiles
kennethlove: er rather unset
fwiles
kennethlove: I just tested it on 1.2.3 on an inline with extra=1 and it works as expected
kennethlove
fwiles: extra=1 with no max_num set gives 2 fieldsets still.
ipmb
kennethlove: any spare .pyc files lying around?
kennethlove
ipmb: let me check
kennethlove
ipmb: nope, no spare pycs.
fwiles
kennethlove: hmmm not sure what's going on there
fwiles
fwiles: lemmie play a bit in some test code
kennethlove
fwiles: me neither. hence the asking :)
ipmb
kennethlove: can you import it in a shell and get the expected values?
unbracketed
Have you guys seen any initial fallout from the changes in MySQL licensing? expecting any?
jacobkm
unbracketed: we've seen a few folks looking to transition from mysql to postgresql (right fwiles?) Also over the past few years it's gotten a *lot* easier to convince people to use postgres -- now most don't even need to be sold on it.
fwiles
unbracketed: While I hear grumblings from people all the time that with the Oracle purchase they are looking at PostgreSQL. But honestly most of the time it's due to needing advanced features (GeoDjango for example) or performance problems is the main reason they are switching
fwiles
unbracketed: that and I hard sell all of our clients on it :)
ipmb
There seems to be a huge hole in the middle-ground (too big for shared, too small for full-time sysadmin) Django hosting. Where do you send folks looking for a happy medium these days?
Alex_Gaynor_
ipmb: What do you mean by middleground? Something between web faction and a VPS?
ipmb
smaller
ipmb
Alex_Gaynor_: a VPS for people that aren't sysadmins
ipmb thinking EngineYard
jacobkm
ipmb: well, we send 'em to us :)
fwiles
ipmb: to us actually
fwiles thinks there will be a rumor that jacobkm and I share a brain
jacobkm
MediaTemple's offering is a fairly good deal for mid-range stuff.
jacobkm
ipmb: see http://mediatemple.net/webhosting/gs/features/containers.php#django
jacobkm
ipmb: give MT a whirl. There's also at least 4 startups I know of working on "Heroku for Django" type offerings; I expect to see those launching soon, I hope.
fwiles
ipmb: we don't usually see that size of client honestly, so I'm not sure where I would send them
fwiles
Heroku for Django is going to be big for the community
jacobkm
The only one I know of with any public presence so far is https://www.djangy.com/. Looks like still private beta.
jacobkm
If there are others I don't know of that have anything public someone jump in and let me know, eh?
Alex_Gaynor_
jacobkm: andrewgodwin has said he's working on something with bfirsh, not sure they have anything public though
andrewgodwin
no, we're not public yet
jacobkm
Alex_Gaynor_: well, those are some pretty good names to be associated. Not sure who's behind Djangy, but the fact that they have docs (https://www.djangy.com/docs) even before a public offering is a good sign. Shows that someone understands the community standards :)
jacobkm
andrewgodwin: hurry up, dang it :)
andrewgodwin
jacobkm: I keep telling bfirsh we need docs as a high priority :)
andrewgodwin
yeah, I'm working on it right now
andrewgodwin
it self-hosts its own site, which is nice.
justinlilly
ipmb, also, asenshi is/was working on something.
ipmb
What's up with hidden hires?
jacobkm
ipmb: it's still being born, sadly -- other work intruded.
nicoechaniz
How can we host 1.5 thousand Django sites?
nicoechaniz
At the NGO where I'm working we are developing the third version of the Cyclope CMS, this time in Python/Django, as opposed to PHP for previous versions.
nicoechaniz
We host over 1.5 thousand sites for other latin american NGO's most of them with very little traffic.
nicoechaniz
The big problem we have with Cyclope 3 is that if we move al 1.5K sites over, we'll need near 30Gb RAM, just to host sites that get almost no traffic at all.
nicoechaniz
Are there any guides for this kind of deployment scenario?
quantumsummers|a
I would like to note that initial testing of the Amazon AWS EC2 micro instance for small-ish django-based sites is very positive (evening using apache+mod_wsgi). At $0.02/hr (linux) its a rather inexpensive option.
jacobkm
nicoechaniz: wow, that's a big question -- going to be *really* hard to answer without a *lot* more details.
fwiles
nicoechaniz: I'm assuming mod_wsgi, look into gunicorn as you can likely run man smaller instances sanely thath way
nicoechaniz
Well, I can give all the details you ask for : )
jacobkm
nicoechaniz: in a nutshell, virtualization (as quantumsummers|a suggests) is one option; the other is multi-tenancy (where a single Django instance is capable of running multiple sites). Both are fairly domain-specific.
fwiles
nicoechaniz: also if you're not already doing so, using something like nginx or varnish in front would drastically reduce the number of django processes you need
ericholscher
nicoechaniz: we have a similar problem actually, tho we kind of punted on the resource usage because it pales in comparison to the dev time it would take to do it more complexly
nicoechaniz
we are actually trying to go for multi-tenancy
nicoechaniz
we cannot go for Clouds (like Amazon, etc.) because of political decissions, etc. in this kind of organizations
fwiles
nicoechaniz: is the 30GB number from a cold start or does it just grow to that over time?
ipmb
nicoechaniz: mod_wsgi supports an inactivity-timeout as well
nicoechaniz
jacobkm: we have been working hard on the multi-tenancy option
jacobkm
nicoechaniz: one hint is that although the documentation says that you shouldn't modify settings at runtime, in fact many of them *can* be changed at runtime without problems. Unfortunately there's a bit of a trial-and-error in figuring out which.
nicoechaniz
fwiles: cold start
jacobkm
nicoechaniz: I keep meaning to actually run through all of them and put together some documentation on which can and can't be modified at run time.
nicoechaniz
jacobkm: yeah, we have been banging our heads with that precise issue : )
nicoechaniz
jacobkm: that would really be great
jacobkm
nicoechaniz: yup, me too. It's tricky, and we've done a bad job internally being clear about which settings are which.
fwiles
nicoechaniz: how many apache children are you running then?
jacobkm
nicoechaniz: the big problem is that even if some settings *are* changeable at runtime, you're still going to need to worry about threading issues. So, yeah, it's a complicated problem. I think I'd need to see your code to have any more concrete suggestions.
nicoechaniz
jacobkm: we have created a Proxy model for runtime-settings
nicoechaniz
jacobkm: it stores it's values in threading.local
nicoechaniz
jacobkm: the branch we are working on atm is not public yet. But I can commit it if you would like to take a look at what we are trying to do
jacobkm
Yeah, that's pretty much how I'd start. Like I said, I think it'd be trial-and-error for me, too...
gargoyle-grin
jacobkm: I understand. Not a problem. ;)
jacobkm
nicoechaniz: sure, if you like -- I can't promise I'll have time but I'll try.
quantumsummers|a
nicoechaniz: you have an interesting situation there, what sort of hardware are you running this on, as it sounds like a single box?
nicoechaniz
jacobkm: great : ) is there a ticket regarding this documentation issue?
jacobkm
nicoechaniz: I *think* so - let me look...
nicoechaniz
it's a 8 core 8Gb box ATM
nicoechaniz
quantumsummers|a: can scale to 20Gb RAM I think
fwiles
nicoechaniz: database living on the same box?
nicoechaniz
fwiles: yep
fwiles
nicoechaniz: moving that off would be one of the first steps honestly
quantumsummers|a
nicoechaniz: I see. you may have some success with vserver "containers" and limiting the vhosts running per container. but regardless that is a huge number of site for a single machine
nicoechaniz
fwiles: we actually haven't moved the 1.5k sites yet. We won't till we can figure this out : )
ipmb
nicoechaniz: how often is the content changing? Something like https://github.com/luckythetourist/staticgenerator could relieve a lot of app server load
nicoechaniz
quantumsummers|a: well... most of them are just sitting there.. so it's not such a big deal. They are now hosted in Cyclope2/PHP on an athlon 2Gb machine : )
quantumsummers|a
nicoechaniz: for migrating all of this, you may consider a single "project" that uses the row-based perms hooks to keep things separated, and the sites framework to handle all the various sites. Just a thought
nicoechaniz
quantumsummers|a: yeah, that's another option we have been looking into. But jacobkm's multi-tenancy approach is more what we are after ATM.
nicoechaniz
jacobkm: I've been trying to find a ticket about this issue of settings that can and cannot be modified at runtime, but found none... Should I open one?
jacobkm
nicoechaniz: sure, go ahead.
nicoechaniz
jacobkm: I added http://code.djangoproject.com/ticket/14628, let me know if it's explained correctly; english isn't my mother languaje : )
jacobkm
nicoechaniz: that's good; I added a note there.
Alex_Gaynor_
nicoechaniz: your english is better than my spanish
nicoechaniz
: )
fwiles
nicoechaniz: your english is better than my.... everything else :)
nicoechaniz
jacobkm: do you think it would be useful to open a related ticket to discuss multi-tenancy, thread safety issues, etc. ?
maraujop
Should there be more incentives for new comers to Django?
maraujop
Since 6 or 7 months I have been using Django. I've sent some patches to Django-apps in Github, one patch for GeoDjango, I've released my own Django-app (django-rules). I have been looking on how Django deals development, but I honestly think there should be more incentives for new comers, more easy-pickings and maybe a less formal way to discuss new ideas or enhancements for Django. what do you think?
Alex_Gaynor_
maraujop: We definitely want to lower the barriers to contribution to Django itself, however we really have a limited number of time time spent marking tickets as easy-pickings is time lost from developing new patches. Anything new contributors can do on this front would be super valuable, and hopefully #django-dev here can be a slightly less formal enviroment thant the mailing list
maraujop
Alex_Gaynor_: Thanks Alex, you are probably right. However I have had this feeling in django-dev before, that nobody reads, that I'm talking to no one
gargoyle-grin
Is it true that the MySQL backend ignores db_index entirely?
gargoyle-grin
if so, what is the reason for it?
jacobkm
gargoyle-grin: I'd be surprised if that was true, but frankly I don't particularly care :)
jacobkm
(Gotta get the minute of MySQL hate in -- sorry :)
Alex_Gaynor_
gargoyle-grin: This is not true, however it is true that MySQL itself ignores indexes in all sorts of cases
fwiles
gargoyle-grin: And no it creates the indexes, I just checked on a MySQL system
Alex_Gaynor_
fwiles: Checking the source is much faster
fwiles
Alex_Gaynor_: I had a recently built mysql server laying around
gargoyle-grin
Alex_Gaynor_, fwiles: Hrmph. Ok. Thanks for the input. I'm now more confused than I was. XD Stil helpful, though.
gargoyle-grin
Alex_Gaynor_, fwiles: It occurrs to me that we might be speaking of two different things. I'm speaking of field=models.SomeGenericField(db_index=True). That doesn't seem to do anything whatsoever on MySQL.
gargoyle-grin
Alex_Gaynor_, fwiles: The MySQL backend *does* create indexes for primary keys, foriegn keys, unique fields, etc...
Alex_Gaynor_
gargoyle-grin: how are you viewing the sql? using manage.py sql won't show index creation, use manage.py sqlall
Alex_Gaynor_
gargoyle-grin: there's nothing special about how those fields become indexed, they just get db_inex=True internally
fwiles
gargoyle-grin: yup, just double checked (specifically for db_index on a field) and it gets created
gargoyle-grin
Alex_Gaynor_: I hadn't tried sqlall, but I did just now, and it still doesn't seem to do anything special with the field I added db_index to. It's a PositiveIntegerField.
gargoyle-grin
fwiles: Oy. Ok. I'm probably losing my mind somehow.
gargoyle-grin
Alex_Gaynor_, fwiles: Ah. Ok. I think I see what's up. Thanks so much for your input. :)
maraujop
What would you say is the best way to promote a new Django-app in the Django community not being a known developer in it?
Alex_Gaynor_
maraujop: Write a blog post on it (and have your blog be in the community aggregator), let us know at DjangoDose
maraujop
Alex_Gaynor_: Great! English right?
fwiles
maraujop: Blog post as Alex says, and then places like reddit.com/r/django
maraujop
fwiles: Thanks!
fwiles
maraujop: yeah it being in English would likely get the word out to more people
Alex_Gaynor_
maraujop: English will probably appeal to the most people, you could try your native language community as well
jacobkm
maraujop: also, be sure your app hits all the main requirements to be a "good citizen": have documentation, tests, a README, and be on PyPI (and be sure that pip/easy_install yourapp works).
maraujop
Alex_Gaynor_ : So I can do both? right?
Alex_Gaynor_
maraujop: sure
maraujop
Alex_Gaynor_, fwiles: Thanks for the answers
robhudson
How many more revsys-type companies do you think could exist based on your workload? Also, how do you see the Django job market looking these days in general?
quantumsummers|a
I like robhudson's question.
Alex_Gaynor_
robhudson: I'm not an expert in what exactly revsys does, but there are several other consultancy/whatevers that specialize in Django work.
jacobkm
robhudson: I don't know how to answer the first part of your question -- fwiles? -- but to answer the second one: the job market is *totally* a seeker's market right now. If you know Django, and you don't like your job, I can almost guarentee you'll at least get a couple-three interviews at better places.
ipmb
robhudson: I know of companies hiring guys off the street with no Django/Python experience due to the lack of skilled folks available right now
fwiles
robhudson: It's difficult to tell, but I would assume we could use at least 2 more revsys/lincoln loop/eldarion/caktus type companies at this point. Or for one of us to grow larger than we are
fwiles
robhudson: it really depends on the growth of Django. We'll all staff up based on that really.
quantumsummers|a
jacobkm: how's that for independent contractors, w.r.t. robhudson's question?
Alex_Gaynor_
quantumsummers|a: At Eldarion we've been hiring like mad recently, so there's plenty of work to be done
jacobkm
quantumsummers|a: ditto for contractors. Actually, if anyone here's a contractor and looking for work... erm, stay late and talk to use after class :)
jacobkm
talk to *us*.
quantumsummers|a
Hey hey, count us in
coderanger
How do I cleanly handle multi-server rollouts using Chef?
coderanger
(not having servers throwing errors because they see the wrong DB schema)
jacobkm
coderanger: hm, I'm not sure I follow -- why would chef be complaining about a DB schema?
jacobkm
coderanger: oh, are you using chef's deploy resource?
coderanger
jacobkm: No, I built my own resource setup, but theirs doesn't seem to handle it very well either
coderanger
jacobkm: The problem is there is no way to force two servers to upgrade in lockstep
coderanger
So at one point one or the other will be out of sync
jacobkm
coderanger: yeah, I came to that conclusion after an hour of trying to convince Chef that really no I'm not running Rails.
jacobkm
coderanger: ah yes.
jacobkm
Yeah, that's a common problem -- it's by no means Chef-specific.
coderanger
Notably web server vs. db server this causes tons of errors
jacobkm
coderanger: yup.
coderanger
jacobkm: Yeah, but with an imperitive system like fabric you can globally enable downtime mode first
jacobkm
coderanger: I unfortunately don't have a good answer: I've always just taken momentary downtime :(
coderanger
jacobkm: My best solution so far is to store both a downtime and version flag in the DB (in a table we assume will never change) and have the server block requests if either the downtime flag is set or the version doesn't match
coderanger
jacobkm: Thats a non-trivial DB load though
jacobkm
coderanger: so I've usually just thrown up a downtime page, done the migration, and taken it down. Any good load balancer should be able to do that pretty easily (I know how to do it with nginx and maybe Apache). But yeah, it's really far from ideal, and I'd love to figure out a better way.
coderanger
jacobkm: Just doing that outside of Chef you mean?
andrewgodwin
haproxy has good downtime-error-page handling support for those interested
fwiles
coderanger: if your data is mostly read heavy, one option I've seen people do is copy the database so you end up with say 'production_new' and 'production_old'. You get your databases set and as the code is upgraded you switch DBs.
fwiles
coderanger: you usually want to build in a 'turn the system into read only mode' type flag during that transition obviously
jacobkm
coderanger: I tend to use Fabric for deployment-type stuff (anything imperative basically), but I don't see why you couldn't use Chef.
unbracketed
These guys have a solution that is still early in development i think: http://chronicdb.com/why_live_database_updates
unbracketed
i've spoken with them a bit and they're eager to partner with people in the django community who could use solutions like this (ChronicDB)
coderanger
jacobkm: The problem with using Chef for it is that there is no global time sync, each client just wakes up and starts running the new config :-/
jacobkm
coderanger: ah, I also don't use chef server. Just chef-solo, kicked off by fabric.
coderanger
jacobkm: Ahh, that would help. You don't get databags though.
coderanger
andrewgodwin: Chef has its own bootstraping system as long as the server has ssh setup ;-) (re: twitter)
jacobkm
coderanger: really? is that documented anywhere?
andrewgodwin
coderanger: yes, but this is re:the heroku-alike
coderanger
andrewgodwin: Ahh
andrewgodwin
I can't just hg push to my server to have it deploy. yet.
fwiles
andrewgodwin: any plans to support git?
coderanger
jacobkm: http://wiki.opscode.com/display/chef/Knife+Bootstrap
andrewgodwin
fwiles: git support's actually the only proper working one
andrewgodwin
hg support is still slightly dodgy
fwiles
andrewgodwin: ah cool
jacobkm
coderanger: neat, thanks.
andrewgodwin
don't worry though, we'll be recommending svn
ipmb
:)
coderanger
jacobkm: I also have a debian preseed file that sets up new VMs against the chef server automatically, /me finds
coderanger
jacobkm: https://gist.github.com/664608
dartdog
earlier there was some discussion of how to migrate an app without taking it down...Think this covers a very good approach, while example is app-engine approach universal http://codebetter.com/blogs/kyle.baley/archive/2010/09/28/options-for-upgrading-an-app-engine-application.aspx
coderanger
dartdog: I'll take a look, thanky
nicoechaniz
Alex_Gaynor_: are there any plans to implement a couchdb backend based on your work on NoSQL ?
Alex_Gaynor_
nicoechaniz: I don't have any plans ATM, but I am working to get the core stuff merged in, and the MongoDB example as an external project, which hopefully could be a good example for folks interested in CouchDB
quantumsummers|a
Alex_Gaynor_: mongo ++1
nicoechaniz
Alex_Gaynor_: there was this guy: http://github.com/42/42-django-couchdb who made a couchdb backend, maybe it could be adapted to your work
silent1mezzo
What suggestions do you have for a django dev to start helping out with django core development.
silent1mezzo
IE, I've been working on django apps for the past year and I want to get into fixing bugs and stuff
jacobkm
silent1mezzo: yayhooray!
Alex_Gaynor_
silent1mezzo: a) We totally love more contributors! b) Take a look at our bug tracker, we've started to mark things with `easy-pickings` keywords, but in general find a component of Django you think you know well (e.g. I use forms a lot) then find bugs/features filed against it.
jacobkm
silent1mezzo: my best suggestion is to read the mailing list (django-dev), hang out in #django-dev here on IRC, and when something comes up you know a bit about try to pitch in. Just be bold and remember that if someone criticizes your code it's not because they don't like *you*, it's because they're trying to make sure that only awesome code goes into Django.
silent1mezzo
fair enough, ya I wanted to help out more when my first patch was accepted...
ericholscher
silent1mezzo: http://groups.google.com/group/django-developers/browse_thread/thread/97cbdee3954a8f8d/5bd6077c5a9d1149?lnk has some good answers
silent1mezzo
ericholscher: thanks
amjoconn
Beyond NFS are there any new and interesting ways to locally (ie not Amazon EC2) share media between app servers?
fwiles
amjoconn: rsync'ing often is the easy way to do it, but assumes you don't change media often
fwiles
amjoconn: another option would be to build your own file backend that ensured things were synced
jacobkm
adamend: http://www.danga.com/mogilefs/ is another option you should take a look at. Really, though, I strongly recommend S3: it's hard to beat.
amjoconn
fwiles: I am doing quite a bit up uploading, processing, and re-serving. It isn't just static media, and truly syncing with rsync sound error prone...
fwiles
amjoconn: it's not really error prone, but does introduce a lag between the systems
fwiles
amjoconn: something like mogilefs, a custom backend, a celery task on saves to replicate, or another clustered file system are your best non-CDN options
fwiles
amjoconn: but honestly I haven't had a ton of luck with clustered file systems in the past, but I haven't played with any of them in a couple of years
amjoconn
fwiles: Yeah I guess you could rsync to one central system and then back out to the app servers to prevent contention... there would still be contention actually over names.
quantumsummers|a
amjoconn: there is the mongo grid fs that looks very interesting
jacobkm
amjoconn: so why are you *not* wanting to use S3, if I may ask?
fwiles
amjoconn: well if it's your media you can solve the name issue by using UUIDs for the names instead of what the user provides
quantumsummers|a
we have been looking at it to replace bugzilla attachment storage in gentoo
amjoconn
fwiles: Yeah I am looking for some kind of S3 like backend I could host locally, even if it means writing a custom backend.
amjoconn
I will look into those options
quantumsummers|a
eucalyptus provides an aws s3 compatible storage layer
amjoconn
jacobkm: Good question. Canadian privacy laws? It is an application system, so there is a real private data we don't want to sound out to Amazon.
quantumsummers|a
then, of course, there is drbd
amjoconn
Have people had success with eucalyptus in practice?
fwiles
amjoconn: you can encrypt the data to keep it safe on S3
robhudson
I remember getting "bored" with building website with PHP. Do you ever get bored with building Django sites?
robhudson
If so, what things are you not bored with at the moment. If not, why do you think that is and how long until you might get bored?
Alex_Gaynor_
robhudson: I'm not jacobkm, but yeah, I get bored just building websites some times. Personally the fun stuff for me is under the covers, profiling and optimizing internals, fixing JOIN promotion bugs, etc. It's not Django's fault, other than it means I don't have to care about that stuff when I don't want to.
robhudson
Alex_Gaynor_: agreed, seems like there's lots of specialization to keep it interesting.
jacobkm
robhudson: I actually do surprisingly little website-building these days -- lots of training, consulting, bug-tracking-down, code reviewing, etc. I actually sorta miss just building a website :)
jacobkm
Oh deploying and ops. Lots and lots and lots of that.
jacobkm
Not board with *that* just yet -- it's kinda endlessly fascinating.
coderanger
What are your thoughts on the various Postgres ecosystem tools (pgpool, slony, etc)?
fwiles
coderanger: pgpool is ok, but pg_bouncer is the new hotness
jacobkm
coderanger: I've had some really annoying problems with pgppol and have switched to bouncer.
jacobkm
If pgpool loses the connection to the backend, even for a moment, it requires a hard-restart to reconnect. That's *terrible* in a cloud-ish environment where you don't have control over network routing. Rackspace, for example, occasionally drops a packet or two across the (fake) internal network, and that causes pgpool to freak out.
fwiles
coderanger: one tool everyone should get familiar with is pgfouine (http://pgfouine.projects.postgresql.org/)
coderanger googles
quantumsummers|a
http://wiki.postgresql.org/wiki/PgBouncer << looks nice
fwiles
coderanger: with Pg 9.0, you don't need the other replication schemes obviously
coderanger
fwiles: Has anyone packaged it for Ubuntu 10.04 yet? Trying to stick to LTS
fwiles
coderanger: I don't know of a 10.04 package, I've been playing with a source version on my laptop
coderanger
fwiles: Is it better enough to be worth the jump? Not that it would be that hard to be better than slony >_<
fwiles
coderanger: yeah replication is now as easy as MySQL's
fwiles
coderanger: http://www.piware.de/2010/09/postgresql-9-0-final-released/ also
coderanger
jacobkm: Yeah, small stuff I don't mind making my own packages, but something the scale of postgres seemed more ambitious to maintain
jacobkm
coderanger: https://launchpad.net/~pitti/+archive/postgresql -- pg9 PPA.
jacobkm
coderanger: looks like it'll go into lucid-backports, but that'll take some time to happen.
coderanger
Ooh, shiny :)
fwiles
coderanger: other than that, not a ton of features that would probably be on interest
ericholscher
What is the stack that you all are recommending/using these days? (wsgi/frontend/load balancing/data-mulleting)?
jacobkm
ericholscher: it depends a bit, so I'll answer twice:
jacobkm
ericholscher: the "safe" stack, which we usually recommend, is nginx, Apache, mod_wsgi, and PostgreSQL.
jacobkm
All of those are proven, battle-tested, and we're very happy with them and know how they'll perform and scale.
jacobkm
ericholscher: the "living on the edge" stack is nginx, gunicorn, and usually some combination of celery, rabbitmq, redis, and postgres. This stuff can be faster, but the downsides are still sorta unknown at the time.
maraujop
jacobkm: What about Cherokee?
jacobkm
maraujop: I'm just not familiar with it and I have a gut reaction against anything that does through-the-web configuration. I like my config files, thanks.
ipmb
you guys connect gunicorn/nginx via TCP or unix sockets?
jacobkm
ipmb: TCP: speaking HTTP is a feature.
fwiles
ipmb: unix sockets would be fastest, but I honestly don't know what we typically roll out there as Jacob's done the most with gunicorn
jacobkm
unix sockets don't work beyond one server, and even for the smallest deployments I like to have at least two.
maraujop
jacobkm: Ok, Cherokee web configuration is considered a killer feature. Benchmarks say it's fast and code is clean and good quality, it's getting more common here in Spain as a choice
coderanger
jacobkm: Have you guys played with the async workers in gunicorn at all?
prestontimmons
Do you guys have to mess with RHEL much?
prestontimmons
If so, do you keep the old system packages of Python and Postgres or custom compile newer versions?
fwiles
prestontimmons: Not a ton of RHEL anymore, most people are running Ubuntu these days. It depends on the client and app, but I *never* let a package manager or "long term support" aspects get in the way of getting the job done.
fwiles
prestontimmons: so if I need PostgreSQL 9.0 or python 2.6, I'll attempt to use packages if available or just roll muy own
fwiles
prestontimmons: especially for things so core to the system like Python and PostgreSQL. For example, don't really care what version of Apache it is as long as it's patched well
zain
Are y'all happy with rabbitmq? have you tried redis as an mq?
fwiles
zain: I actually push redis first and only do rabbit if necessary
coderanger
zain: Its been pretty good so far, the ghettoq backend still needs key prefix support though
prestontimmons
What are the main upsides to gunicorn vs mod_wsgi and Apache?
jacobkm
prestontimmons: gunicorn will consume less RAM overall, and probably handles higher concurrency better.
fwiles
prestontimmons: memory size really. If you're not using any of the features of Apache other than mod_wsgi, why eat up those resources?
jacobkm
maraujop, prestontimmons: The really awesome thing about Python right now is that pretty much everyone speaks WSGI perfectly now, so switching between different application servers is quite easy. It's entirely possible to give a few a try over the course of a day and see which one you like the best.
maraujop
jacobkm: Thanks Jacob, those are good news :)
prestontimmons
What are the typical memory savings you've seen?
jacobkm
prestontimmons: I'd guess in to 10-20% range, maybe?
brian[r]
With the nginx/gunicorn setup (something I've been using on my recent projects as well), do you use nginx proxy_cache as an upstream cache or memcached or something else?
jacobkm
brian[r]: I use nginx as a load balancer. If I need proper caching I'll bring in Varnish.
fwiles
brian[r]: I've done both, but Varnish is the "correct" answer there
ipmb
What are you guys watching gunicorn with, supervisord?
jacobkm
ipmb: on ubuntu I use upstart since it's built-in and there isn't anything else required.
ipmb
yep
jacobkm
ipmb: if I was on a different OS I'd probably use God or Monit.
ipmb
why those over supervisor?
jacobkm
But that's just because I've never learned supervisord -- I know ericholscher uses and likes it.
fwiles has been meaning to play with supervisor also, just haven't had a chance yet
jacobkm
I really do like upstart, though -- it's just so simple. Here's an example: http://paste.pocoo.org/show/286618/
ericholscher
the annoying thing about supervisord is that you still need upstart or something to watch it, so i've been going towards upstart because of the simplicity and built-in-ness
ipmb
yeah, upstart is nice
coderanger
What do you guys use for system monitoring (mmonit, munin, nagios?)
jacobkm
coderanger: nagios & munin.
coderanger
Any reason for both?
jacobkm
I HATE nagios with a passion, but I've tried everything else and keep coming back.
fwiles
coderanger: and occasionally ZenOSS
ipmb
jacobkm: thoughts on zabbix?
fwiles
but ZenOSS is overkill for most web apps
jacobkm
coderanger: I've never gotten munin's alerting to work as reliably as Nagios.
jacobkm
Oh, I should give a plug for http://www.pagerduty.com/ -- it's a really nice addition to your monitoring, whatever it is.
fwiles
yeah pagerduty rocks
dartdog
Anyone played with "cloudflare" yet?
dartdog
http://www.cloudflare.com/, Thoughts?
jacobkm
dartdog: it sounds like snake oil to me. I looked at it and still can't understand how the heck it's supposed to work.
fwiles
dartdog: or what it does... landing page fail
fwiles
dartdog: is it a front end cache like how certain CDNs will watch your media server?
dartdog
From what I see it appears to be a smart front-end with caching and trafic filtering (prvenets therats)
fwiles
dartdog: yeah that's what I gathered. so it's basically 'hosted varnish' it seems
dartdog
I was hoping one of the smarter folks had given it a spin :-)
dartdog
if you look at its help page it says some stuff...
robhudson
Is there anything from other frameworks you wish Django had?
Alex_Gaynor_
robhudson: I want a pony... seriously paste has one, why don't we?
fwiles
robhudson: I'd like to see Jacob on the cover of Fortune ;)
maraujop
hahaha
jacobkm
robhudson: off the top of my head... Rails migrations still rock harder than anything Django or the community has to offer (sorry andrewgodwin :)
jacobkm
And yeah, I'd love to have a $100k sports car.
fwiles
robhudson: I miss some of the testing ease from Perl, but that's really a Python ecosystem issue and not specifically Django
jacobkm
fwiles: Word. We need TAP something aweful.
fwiles
jacobkm: yeah TAP and automatic test running on installs, how everything is always just "make/build test" everywhere... always
quantumsummers|a
use portage?
quantumsummers|a
auto test-running on install
ericholscher wrote a pip test command, but ian said pip wasn't the correct place for it
fwiles
ericholscher: Then I disagree with Ian and will beat him up in January when I see him :)
jacobkm
What else? I like what Armin's doing with Flask extensions, though that's more of a workflow and community-management thing.
coderanger
djangopackages could use some more pimping, but it is a start
fwiles
It's not from "elsewhere" but I really like the GenericForeignKey ideas from Ericflo's talk at DjangoCon
jezdez
ericholscher: there will be one in distutils2, so you'll be able to run pysetup test whatever
ericholscher
jezdez: is pysetup going to be the "python command line interactive endpoint" kind of thing?
coderanger
Alternatively someone could just make a search engine for jezdez's watch list on github ;-)
jacobkm
I'm intrigued by the BFG/Pylons merge ("Pryamid") -- going to watch that closely.
ericholscher
seems like pip/fabric are the current ways of doing such things
jezdez
coderanger: :P
jacobkm
What Would Jezdez Use?
Alex_Gaynor_
coderanger: let's be honest, jezdez forks all code, shitty or good, just to add a setup.py
maraujop
hahaha
Alex_Gaynor_
(he also sometimes add a MANIFEST.in)
jezdez
ericholscher: yeah, pysetup (I hope I got the name right wrong that flamewar on python-dev) will be the caller for distutils.command.X
ericholscher pays $20 to whoever makes the "jezdez forked my project and all I got was this setup.py" shirt
jezdez
err, distutils2.command.X
fwiles
ericholscher: LMAO
Alex_Gaynor_
ericholscher: I'd take that in hoodie form
jezdez
Alex_Gaynor_: pssst, don't tell everyone
jacobkm
I think an achievement badge would be better - "Forked by Jezdez"
jezdez
heh
ericholscher
didn't danny add achievements to djangopackages?
ericholscher
or badges or somesuch
jezdez
for the record, I've been unfollowing people on github over the last couple of days
fwiles says, "Jezdez just checked in as the mayor of Github"
coderanger
Alex_Gaynor_: Exactly, as time tends toward infinity, the list includes every django app out there :-)
fwiles
ericholscher: if so, I want the 'has root' badge
jezdez
coderanger: trust me, there are more apps out there anyone could follow
nicoechaniz
Alex_Gaynor_: i've been bitten by jezdez forkin' ! I was looking for a Bulletin Board app, and lost a bunch of time trying to figure out why jezdez had chosen (forked) one in particular.... until I found out he had just touched one line :P
jezdez
nicoechaniz: you mean https://github.com/jezdez/Dinette?
nicoechaniz
jezdez: yeah I think so
jezdez
nicoechaniz: aye, just deleted it
ericholscher
Have you all done anything supporting websockets?
ericholscher
I've heard that nginx doesn't support websockets (as its only supports HTTP 1.0)
jacobkm
ericholscher: is that one of them thar new HTML5 things?
jacobkm
(No, I haven't)
Alex_Gaynor_
jacobkm: yup, it is
fwiles
yeah I haven't played with websockets
fwiles
(horrible name btw)
quantumsummers|a
re: websockets, nice site to keep up with things http://cometdaily.com/
ericholscher
quantumsummers|a: that site isn't webscale :)
quantumsummers|a
ericholscher: please explain?
ericholscher
quantumsummers|a: its timing out for me
quantumsummers|a missed a meme?
quantumsummers|a
really, bum deal
Alex_Gaynor_
quantumsummers|a: oh you definitely missed a meme, you need web scale!
quantumsummers|a
apparently I do
jmoiron
ericholscher: wfm
ericholscher
hrm, odd
jmoiron
quantumsummers|a: http://www.xtranormal.com/watch/6995033/
ipmb
You guys have anybody asking you to do stuff on AppEngine?
fwiles
ipmb: actually no, never, not once... which really has surprised me
fwiles
ipmb: jacob just corrected me
jacobkm
Actually, we've got one client with a piece of their stack on AppEngine, but it mostly Just Works.
ipmb curious how this SQL thing plays out there
jacobkm
ipmb: AFAIK it's just Google's fork of MySQL, with all the good and the bad that entails.
maraujop
What are you guys using for social logins and authentication without reinventing the wheel?
coderanger
maraujop: So far I haven't found anything that supports Everything (which for us include Live), but velruse is close
fwiles
maraujop: it really depends on the client. I've got a couple of small apps that use Twitter and Facebook logins, but honestly they haven't been used much so I'm not comfortable recommending a particular app for it
coderanger
maraujop: Janrain is also awesome if you can afford it
jacobkm
maraujop: ditto coderanger -- I've been happy with Janrain when I've used it.
jacobkm
django-socialregistration is the DIY system (https://github.com/flashingpumpkin/django-socialregistration). It's good, but it's not all that well documented and it has some dark cornerns.
jacobkm
corners.
maraujop
jacobkm: django-socialauth documentation gets me lost and I don't get it to work, is a total nightmare
maraujop
django-socialregistration is missing good pieces of documentation in my opinion
maraujop
as I'm far from being an expert in this field I don't rely on me to fill the gaps
jacobkm
maraujop: yes, it is, but if you're willing to read the source it's pretty easy to follow.
maraujop
coderanger: I will look at it, thanks
maraujop
thanks for your answers guys, you rock
maraujop
jacobkm: If you believe so, I will look at it, see if I can write some docs on it
jacobkm
maraujop: awesome. I'm going to be teaching a class on it (and other things) so I'll be releasing any docs I write as part of that, too.
maraujop
jacobkm: Where is that class going to be? any possibility of online mode?
jacobkm
maraujop: Boston and Los Angeles this time 'round (see http://revsys.eventbrite.com/). I'm a bit... suspicious of online classes, butI *might* give it a try at some point in the future.
maraujop
jacobkm: It's out of my budget, sorry, I wish I could go overseas to listen some good talks
coderanger
You should come do sessions in SF :-)
coderanger
Then there is at least a chance I could get Atari to pay for it (though they are still hemming and hawing about pycon)
fwiles
coderanger: oh he'll end up doing a class in SF eventually
jacobkm
Yeah, I want to do SF but I need more leadtime for venues and such.
silent1mezzo
and sessions in Toronto :P
fwiles
silent1mezzo: you know I don't think we've considered Toronto before, but it should probably be on our list
silent1mezzo
fwiles: I know of a bunhc of people that would come
amjoconn
I would come to something in Toronto as well
silent1mezzo
there'd be at least 5 from my office and I could think of 20 more that'd be there (personally), I'm sure you'd hit way more
fwiles
silent1mezzo: we'll definitely consider it in the spring probably
silent1mezzo
fwiles: sweet
amjoconn
awesome
fwiles
Jacob also just came up with a cool idea to do a kickstartr like class, "Ok going to do a class in March in one of these 5-7 cities. The first one with X signups wins!"
silent1mezzo
Good idea
coderanger
Do you guys have any experience in using Django in a PCI-compliant app?
fwiles
coderanger: yeah one of my projects storymarket.com is PCI compliant
fwiles
coderanger: however we're using a off site processor, so we don't "store" CC info, just pass it along the first time and get a unique ID associated to the card to use from there on
coderanger
fwiles: Anything in particular that was a problem? The hardest thing I've found so far is making encrypted fields not suck
fwiles
coderanger: you don't want to store credit card data... just don't... it's not worth it use something like Braintree to hold the info for you. You can literally spend $50k getting an app PCI compliant and then still run the risk if you make a small mistake of HUGE fines
coderanger
fwiles: Ahh, storing PANs invites so much burnination
fwiles
coderanger: buninnation as in vendor lock?
coderanger
fwiles: For doing cyclic billing (subscriptions) not storing CC data is even worse
coderanger
We are currently using Vindicia and LiveGamer
quantumsummers|a
coderanger: we are successfully using the payjunction trinity api within a django powered site-plex
fwiles
coderanger: you're not following me. We don't store the CC data, but we're given essentially a UUID we store and can then re-use to do subsequent transactions against the CC via the processor. Removes 90% of the PCI compliance issues
ipmb
fwiles: authorize.net?
fwiles
ipmb: no, I don't believe authorize.net has that feature
fwiles
ipmb: but I could be wrong, been a long time since I've used them
coderanger
fwiles: Yeah, that is what we do now, mgmt wants to switch to storing CC data ourselves to reduce the number of snufus in subscription billing
ipmb
fwiles: http://www.authorize.net/solutions/merchantsolutions/merchantservices/cim/
fwiles
coderanger: well my suggestion would be to do your "billing" via a system that isn't online
fwiles
coderanger: i.e. behind a firewall and have it just pull data off your web nodes to some place safer
quantumsummers|a
sox+pci makes for mucho expenses
quantumsummers|a
and liability
fwiles
ipmb: yeah that's the same idea there
coderanger
fwiles: Yeah, the current plan is to have the billing app only enabled on specific web servers that don't answer public reqs
fwiles
coderanger: I'd go farther than that and make that box inaccessible from the public internet entirely
coderanger
fwiles: Yeah, it would be an internal RPC-based server
jmoiron
jacobkm: Do you think there are any ways to reduce the friction there is in using 'pluggable' django apps?
jmoiron
maybe standard management command hooks for pastescript style config installation, media settings; or is this solved/not a problem/not django's problem
jacobkm
jmoiron: I'm not all that familiar with pastescript. But 1.3 will ship with django-staticfiles as django.contrib.staticfiles so with luck that'll help with the media issue.
jacobkm
jmoiron: (http://docs.djangoproject.com/en/dev/howto/static-files/)
jmoiron
jacobkm: ah, that's neat
ipmb
In your classes, what do you find people struggle with the most?
fwiles
ipmb: Jacob's so awesome the only issue they have is getting to the right city! :)
jacobkm
ha
jacobkm
ipmb: depends on the kind of class - beginners struggle a lot with packaging and PYTHONPATH, though these days pip/virtualenv *tends* to help make that easier.
jacobkm
ipmb: at the intermediate/advanced level the biggest problems tends to be that up until that point people have treated Django as a black box and don't have any idea how it works or what goes on internally.
jacobkm
ipmb: but at a certain point everyone needs to stop depending on Django as a monolothic and start replacing the bits that aren't working, and that usually means reading the code and poking at internally bits, and they find that hard.
ipmb
wrt pythonpath/packaging are they coming in with a background in other systems that work better?
jacobkm
ipmb: people coming from Ruby or Perl usually don't have issues, but people from the Java or MS worlds *really* do -- they're used to something like Eclipse basically hiding the filesystem from them.
jacobkm
I usually have a few students who want to use PyDev or something, and I force them into a text editor and a terminal.
coderanger
Which do you generally use of pip+venv or buildout these days?
fwiles
coderanger: mostly pip+virtualenv these days. Still have a few legacy projects using buildout
fwiles
coderanger: IMHO buildout is perfectly fine, but virtualenv-wrapper makes switching between projects (which I'm sure you can imagine we do often each day) much easier
jacobkm
I still *love* buildout, but the lack of documentation means I don't recommend other people use it.
coderanger
It seems like buildout has stagnated recently, probably would have to switch off of it though :-/
carljm
coderanger: it had a new release not that long ago?
jmoiron
judging by the number of "how to install X with virtualenv and blah" blogposts i'd say people are still a bit mystified by it
ipmb
I *really* like pip, but we get bitten by bugs in it still (mostly around editable checkouts)
jmoiron
ipmb: and 'import ez_zetup'
coderanger
carljm: It feels like all the recent releases were only to fix specific problems the Zope team had
carljm
ipmb: as someone who spends a lot of time with pip's codebase, I don't recommend editable checkouts for anything but local playing around. they are quite buggy; it's a hard problem, with all the differences between VCSes.
ipmb
yeah, carljm we got bitten by this recently http://bitbucket.org/ianb/pip/issue/32/installing-from-a-git-repo-using-e-doesnt-checkout-the-default-master
ipmb
works in pip 0.7.2 but not after
carljm
yes, the git backend specifically has been a nightmare.
unbracketed
carljm: i totally agree although in practice it is often convenient during build cycles to be able to point to branches and use that flexibility. as someone who has been burned by the bugginess i definitely advise having a plan B
jezdez
ipmb: been looking at unbracketed's comment, which patch is he refering to?
jezdez
oh, he's here :)
jezdez
hi unbracketed
unbracketed
hi
unbracketed
IIRC changing the incantation of the git-pull line was all that was needed to get it working
jezdez
unbracketed: ipmb: hugo and me wanted to sprint on the git backend this weekend
ipmb
jezdez: root problem, editable git checkout on a branch works the first time, fails when updated
jezdez
ipmb: yeah, had that, too. doing horrible things to work around it
jezdez
ipmb: turns out testing that git backend is nasty, since git behaves differently between versions
fwiles
jezdez: bah, everyone one runs the latest anyway right? ;)
jezdez
ipmb: plus, there is this whole "shoehorn version info in a url" thing
jezdez
fwiles: (or sets up a different repo just to put a branch in that repo, yuck)
ipmb
jezdez: yeah, I can imagine it sucks
jezdez
ipmb: if you want to do the python world a favor, reimplement pip on top of anyvcs, argparse and distutils2
unbracketed
jezdez: IIRC the patch on this ticket got it working (with whatever version of git they were running) http://bitbucket.org/ianb/pip/issue/161/cant-git-pull-from-some-repositories
ericholscher
jezdez: does anyvcs work well?
jmoiron
what's pip using for args, custom stuff?
jezdez
jmoiron: optparse and custom classes
jezdez
ericholscher: err, sorry, I meant anyvc
jezdez
yeah, seems neat, not complete yet
carljm
coderanger: fwiw, we have good success when we need to patch dependencies using an internal chishop, so it's just a matter of having our own git branch / mercurial queue with a suffixed version in setup.py (something like "1.2.mycompany.1") and then running "python setup.py sdist upload -r local"
jezdez
but ronny is pretty eager
ericholscher
jezdez: i've bitched about the lack of something like that existing publically a couple times, so i should probably help :)
coderanger
carljm: Thats what I have now, along with a patched djangorecipe to use it
jezdez
ericholscher: yeah, I hear yah, it's the big pain of version control. big props to empty for his gitpython efforts
carljm
coderanger: ah. i don't have to patch djangorecipe, pip reqs files support extra index urls natively :-)
jezdez
:D
coderanger
carljm: Buildout itself supports it, but for some reason djangorecipe doesn't use the normal buildout install mechanisms
dartdog
Is it reasonable/possible to use django trunk for production anymore, seems like not?
jacobkm
dartdog: yes.
jacobkm
dartdog: but it's not for the weak-at-heart or conservative :)
dartdog
gotch
jacobkm
dartdog: you have to read each commit and pay attention, and you need test coverage (of your app) but in general yes, I still deploy some sites off trunk at times.
fwiles
dartdog: I've done it also, but tend to pin myself to a specific point in time on trunk and only move forward when necessary
jacobkm
I make a point of deploying from trunk for small personal projects or for green-fields development. The former because I can, and the later because usually by the time I'm done the next release is about to drop anyway.
fwiles
dartdog: rather than blindly following it constantly
ipmb
How do you guys handle packages once a site is in production?
ipmb
Self-hosted PyPi?
jacobkm
ipmb: nah, niow that pypi's got mirrors downtime really isn't much of an issue.
fwiles
ipmb: or do you mean for the production app code itself?
jacobkm
ipmb: I on;ly do an internal pypi if there's firewall or IP governance issues to use.
ipmb
what about internal code?
fwiles
ipmb: naw, that's usually overkill. A SCM checkout/export is fine
ipmb
or stuff you might have pulled of github or something
fwiles
ipmb: stuff off github we pin to a checkout
fwiles
ipmb: er I mean commit
jacobkm
The one project I worked on with lots of packages that did need to be wrapped up, released, and managed interally I did use an internal pypi (djangopypi). But fwiles is right that it's overkill for most projects.
coderanger
How do you handle patching existing projects?
coderanger
(at various times we have had custom builds of things like celery, django, etc)
jacobkm
coderanger: I try really really really really really hard not to.
jacobkm
coderanger: then I monkeypatch if at all possible.
jacobkm
coderanger: then, if that fails, I use mercurial queues.
carljm
jacobkm: how do you actually deploy the patched code? make your own sdist and host it somewhere?
jacobkm
But I've only done that twice and regretted it each time.
coderanger
jacobkm: I mean for hosting/deployment
fwiles
coderanger: in a few cases, where the project doesn't move much or the only issue I have (or feature I need) is something small I have in the past just "forked" it and pulled it into my app repository directly
jacobkm
coderanger: yes, deploy the patched code, either from a repo or an sdist.
fwiles
coderanger: but I don't really recommend that
jacobkm
A monkeypatch (plus a pinned version of the dependecy) is almost always possible. It's not pretty, but it's usually preferable.
jacobkm
coderanger: for example, you can monkeypatch Django *really* early on by putting the monkeying in the .wsgi file (if you're using modwsgi). There's almost nothing you couldn't do there.
jacobkm
But even that's a bad idea usually -- I really resist any sort of patching, monkey or otherwise.
coderanger
jacobkm: The custom Django is for changes to the ORM :-/
coderanger
jacobkm: http://code.djangoproject.com/ticket/10154
jacobkm
coderanger: I obviously don't know exactly what you're doing, but I'd argue whatever it is just isn't worth it.
jmoiron
monkeypatching the orm can get pretty hairy
unbracketed
jezdez: sry the "patch" was maybe on another ticket
coderanger
jacobkm: That plus support for dateutil for F('ts')+relativedelta(months=1)
jacobkm
coderanger: http://django.me/raw
jacobkm
I'd write a thousand lines of SQL before I patched a dependency.
coderanger
jacobkm: The query has to be different for each backend
fwiles
coderanger: yeah I'm with jacobkm there, just drop to raw
jacobkm
coderanger: if connection.backend == ...
jacobkm
coderanger: I'm not trying to convince *you* to change, just explaining what *I* would do in that situation.
coderanger
jacobkm: Yeah, I think I'll go back and retry doing it via raws :-)
fwiles
coderanger: I see that like buying a new car because the cup holders don't fit your favorite mug. Personally, I'd just hold it between my legs :)
coderanger
jacobkm: And then poke Gaynor in the shoulder until he figures out a better way to fix the patch on the ticket
jacobkm
coderanger: sounds like a good plan :)
coderanger
jacobkm: The ORM has been the first part of the Django code that I have just not been able to navigate well
jacobkm
coderanger: yeah, the ORM's hairy. No argument there :)
fwiles
all ORMs are hairy
jacobkm
Storm's internals are, surprisingly, really nice.
jacobkm
But it also doesn't try to do very much -- it's deliberately a thin layer.
fwiles
jacobkm: not familiar with Storm
jacobkm
fwiles: https://storm.canonical.com/
ipmb
How many other people make up RevSys at any given time?
fwiles
ipmb: we've got a little pony in the window
ipmb
:) no outside contractors?
jacobkm
Nah, we have a whole army of child laborers.
jacobkm
Oops.
fwiles
jacobkm: dammit don't you remember the lawyers said not to mention that!
fwiles
ipmb: we do use several outside contractors, usually notable Django peoples
jacobkm
It seems like at any given time we have a couple-three subcontractors working on *something*.
fwiles
ipmb: for example we've had PyDanny, Malcolm, Daniel Lindsley, and Alex Krikitos do work for us in the past
fwiles
ipmb: and I'm probably forgetting a few
ipmb
How's your workload spread out these days?
ipmb
That is how much is deployment vs. consulting vs. dev vs. training?
jacobkm
ipmb: for me, I'd so 50% deployment, 25% consulting, 15% dev, 5% training.
jacobkm
I'd *say*. Grrr.
coderanger doesn't feel so bad spending so much time on deployment all of a sudden :)
ipmb
hands shaky from the chainsaw this morning? ;)
jacobkm
Depending on the time of year - winters are slow for work, so I'm doing more training.
jacobkm
ipmb: dude, seriously.
fwiles
ipmb: yeah roughly jacob's answer. I've been about 50-75% dev for the last few months on a large project, but that's an anomaly
ipmb
fwiles: still doing any perl work?
fwiles
ipmb: only when forced to :)
fwiles
ipmb: legacy projects I did for people, friends in a jam, that sort of thing, but in general no. I'm all 100% Python these days
fwiles
ipmb: well I take that back, I have perl "consulting/mentoring" work I do for a former employer here in Lawrence. But it's all consulting, no code really.
coderanger
Which cloud provider do you guys use the most these days?
fwiles
coderanger: Rackspace Cloud
jacobkm
Yeah, I'm enjoying Rackpace for the most part.
fwiles
They have a few blips, a bit more often than AWS, but I'm sure those will calm down over the coming months
jacobkm
AWS has closed the pricing gap, though, so some of the extra features might pull me back.
coderanger
Any plans to do more of these in the future?
jacobkm
Hell yeah. This was fun.
mmarano
fwiles: jacobkm: thanks for hosting a great conversation
unbracketed
thanks for all the insight and info guys
quantumsummers|a
thanks! nice session. I'd love to see another. Cheers
quantumsummers|a
fwiles, jacobkm ^^
unbracketed
have a great weekend everyone
amjoconn
thanks!
jacobkm
Thanks for all the great questions, folks!
coderanger
jacobkm: If/when I come up with a better way to handle chef-ized DB upgrades I'll be sure to let you know :-)
fwiles
yeah thanks everyone!
jacobkm
coderanger: seriously. We should sit down at PyCon and compare notes.
ipmb
thx guys, great idea!
coderanger
Thanks everyone :-)
skyl
okay, I'm all caught up now; where are we? oh .. done :-)
brian[r]
great chat everyone. thanks!
skyl
interesting read though, toodles!
quantumsummers|a
hope everyone has a pleasant weekend.
skyl
see y'all next time!