So you have a Django application and you want to inspect the data in your production Google App Engine (GAE) datastore. What are your options? You could use the developers console - it has a query tool - but it's pretty limited, and it doesn't currently provide a way of exporting elements. You could write and deploy a script that collects and prints the data, but who wants to do a deployment every time you want to tweak the script? So what can you do?
Fortunately GAE offers a Remote API for Python for interacting with remote data elements from the comfort of your very own CLI.
For this example, I'll be using a project with the id blhaastest. If you're unsure of your project id, you can find it in your developer console:
First thing to do is verify your Google App Engine symlinks resolves correctly:
> echo $GAE
Next, start the Remote API Shell (Google login required; may require an App Password if 2-factor-authentication is enabled):
Today I Learned: python instantiates default values for method parameters only once — at method definition time. This can cause big problems if your method modifies values in these entities, because these modifications will be propagated to subsequent calls to the same method.
I spent the greater part of day yesterday hunting down some weird behavior in a python app, and I thought I'd share. Here is a simplified version* of what I found...
def test_method(self, http=httplib2.Http()):
# Remember the original request method
request_orig = http.request
# Define a closure that executes the original request method
resp, content = request_orig()
# Replace the request method with our own closure.
http.request = new_request
We're assigning the new_request closure to the http.request method, and never resetting it. A subsequent method call sees this closure as the original method, and everything breaks down.
The fix is to remove the default http value, and always pass in a throwaway http object.
*Note: the real (more complicated version) is in the authorize() method (line 439) here.
Use MacPorts to install python (I'm using Python version 2.7 for this demo): $ sudo port install python27
If successful, MacPorts should give you this informational message: "To make python 2.7 the default (i.e. the version you get when you run 'python'), please run: sudo port select --set python python27" So let's do that: $ sudo port select --set python python27
If you want to make sure that installation worked, and you have the correct version, check like this: $ which python /opt/local/bin/python $ python --version Python 2.7.8
Using your MySQL server command line, create a MySQL database. I'm using the name 'djangodemo' for this example: > CREATE DATABASE djangodemo
If successful, MacPorts should give you this informational message: "To make the Python 2.7 version of pip the one that is run when you execute the commands without a version suffix, e.g. 'pip', run: port select --set pip pip27" Let's do that: $ sudo port select --set pip pip27
Now we can install Django: $ sudo pip install Django
Verify that Django is installed: $ python -c "import django; print(django.get_version())" 1.6.6
Add the Python bin directory to your path. Add this line to your .bash_profile: export PATH="$PATH:/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin"
If you're using MySQL, install the Python/MySQL connector: sudo port install py-mysql
Now you can start building your project. The official Django tutorial is a great place to start.
Every other month or so I've had the need to provision a clean Mac with a node.js development environment. I've summarized my steps here for quick reference (mostly for myself, but perhaps other people will find this useful).
[This post originally appeared on my company blog here. I am re-posting it here for posterity.]
Hi, I'm Benjamin Haas, and I'm a software engineer and manager at Control Group. I am also a developer advocate, which means that in addition to helping build great products and experiences, I try to ensure that developers have a voice in all company-wide initiatives, projects, and processes. Furthermore, I am involved with our developer community outreach initiative, as we recognize that we are part of a larger group of companies and individuals that are actively working toward the technological transformation of New York City.
One aspect of developer advocacy and outreach that is important for me is being an active part of our Women in Technology program. Gender diversity in the workplace is a goal that I am happy to say I am working toward, and I am joined by a pleasingly well-rounded crew of co-workers.
My friend Jackie from Only Make Believe recently asked me to speak at the Emerging Leaders of New York Arts (ELNYA) event at the Talking Transition tent in New York. Talking Transition is an initiative to give New Yorkers the chance to take part in a conversation with the incoming DeBlasio mayoral administration. At the ELNYA event, I represented the city's tech needs, as they intersect with needs of the arts and arts administrators community. Here is the gist of what I said.
Let's say you're busy working on your project, creating feature branches right and left to build out your super sweet app. Then your dev team decides to change their feature branch naming convention. How do you proceed without having an aneurysm? Can you easily accomodate your team's plan and not end up wanting to punch people in the face? Yep! As a matter of fact it's super simple to rename your branches. Here's how.
When Marci and I went to New Orleans last year, we solicited the advice of our friends (Joshua M. Bernstein!Scott Gold! Molly Dorfman!) regarding where to eat and drink. I compiled their recommendations, along with some spots from eater.com, and made this Google map. Since then I've shared this so many times that I figured I should just publish it here. Enjoy, and let me know if anything is out of date.
It has been a year since I originally wrote the "Installing Yii Users and Rights in 5 Steps" tutorial, and both the Yii framework and the modules themselves have had some updates since then. I made some slight tweaks to the tutorial and updated the git repository to match the current builds.