Posts Tagged ‘ pickle

4WOC: Week 2

Four Weeks Of Creativity, WEEK 2!

This post will follow my ‘next 7 days of creativity’.  Back to Week 1. Forward to Week 3.

Day 14 : Sunday, Nov 25th, 2013

Kivy : Python app development

I’ve talked about Kivy in the past, but this coming week I’m going to try programming in it in ernest.  From their site, Kivy is an “Open source Python library for rapid development of applications that make use of innovative user interfaces, such as multi-touch apps.”.  They integrate many other Python libraries (like PyGame) into one cohesive whole.  Today I got the latest version installed, and loaded up some of their examples.   The biggest hurdle so far is to get it to launch in debug mode from Wing IDE (my Python development environment of choice):  I can’t seem to track down the custom Python app (I’m on a mac) that Kivy uses (on the PC this would be trivial), so currently no debugging.  I hope to get this worked out in the coming week.

Day 13 : Saturday, Nov  24, 2013

Threat Detection Sensor Mk1!

I picked up a Parallax PIR sensor a few years back at the Bay Area Maker Faire.  Always wanted to see how hard it would be to make a simple motion detector / threat detection system.  Turns out, if you have the right components, it’s really easy.

Here is the prototype in action:  Having detected me, the bright blue threat LED is on, and if you were present, you’d hear the threat audio “shave and a haircut, two bits” playing:

Components:

  • Arduino Uno (I’m sure any Arduino will work)
  • Parallax PIR sensor
  • 8ohm speaker
  • LED of your choice plus resistor (100-200 ohm)
  • Breadboard & connectors
You can download the code I made here:  It’s a mashup of these two example sketches:
Total time:  Little over an hour.
If I had the time and components to take this project further I would:
  • Allow it to be plugged into a wall, on a battery backup (in case the baddies cut the power).
  • Send me a text whenever a threat is detected.
  • Attach a simple camera to snap a picture of the threat for later retrieval.
  • Have it know what time it is when the threat happened.

Day 12 : Friday, Nov 22, 2013

Creative fail.  Completely exhausted after work, feel like I’m coming down with something.  No creativity :(

Day 11 : Thursday, Nov 21, 2013

More 3d printing : My wife has her own business selling the knitted and crocheted items she makes.  I’ve designed and printed out small round ‘chits’ with her initials that she can sew into the items .  Check out her stuff over on Etsy.

Printing in process!

Day 10 : Wednesday, Nov 20th, 2013

I modeled my house in Minecraft.  ’nuff said.  (this actually took more than one day, I just finally finished it)

Day 9 : Tuesday, Nov 19th, 2013

3D Printed ShapeShifter Vase

I ran across a site called http://shapeshifter.io that makes it really easy to create 3d printable items like vases, bowls, etc.  10 minutes later and I had the below vase done.  17h and 15 min later the print finished on my  Makerbot Replicator.

Find out more info and download the model over on Thingiverse.

   

Day 8 : Monday, Nov 18th, 2013

Pickled Peppers!

I picked up 20 jalapeños  at the farmer’s market on Sunday.  Didn’t know what I should do with them.  After searching the web for recipes, I found this one:  Easy Homemade Pickled Jalapeños.   I happened to have all the ingredients and hadn’t ever pickled anything before… ever… so why not?  As you can see from the recipe, it’s quite easy, and it worked for me without a hitch.  That being said, they are hot.  The farmer I bought them from had a smirk when he told me “they’re hot”.  Heck, I like hot things, I can chug Tabasco.  But these are step up, for sure.  I can eat one… then drink a lot of water… then try another… maybe.  I put the end result in a old moonshine mason jar, seemed a fitting end for that glass :)  Whole process took only about an hour.

 

In order:  The ingredients, soaking in the brine, and bottling.

 

Pickling Python data to Maya attributes

Recently I made the connection that A:  It’s really easy to serialize (pickle) data in Python, and B: You can make string attributes on nodes in Maya.  It’s not that I was unaware of these topics, it’s just that they’d never occurred in the same mental conversation simultaneously before.  But when they did, it was sort of an ‘eureka moment’, and I wrote two functions to make use of this new-found power.

Making use of the cPickle module, I pickle the Python data to a string object and store to a string attr on a Maya node.  To retrieve the data, I unpickle the string attributes value back to Python data.
http://docs.python.org/library/pickle.html
http://docs.python.org/library/pickle.html#module-cPickle

import cPickle
import maya.cmds as mc

def pyToAttr(objAttr, data):
    """
    Write (pickle) Python data to the given Maya obj.attr.  This data can
    later be read back (unpickled) via attrToPy().

    Arguments:
    objAttr : string : a valid object.attribute name in the scene.  If the
        object exists, but the attribute doesn't, the attribute will be added.
        The if the attribute already exists, it must be of type 'string', so
        the Python data can be written to it.
    data : some Python data :  Data that will be pickled to the attribute
        in question.
    """
    obj, attr = objAttr.split('.')
    # Add the attr if it doesn't exist:
    if not mc.objExists(objAttr):
        mc.addAttr(obj, longName=attr, dataType='string')
    # Make sure it is the correct type before modifing:
    if mc.getAttr(objAttr, type=True) != 'string':
        raise Exception("Object '%s' already has an attribute called '%s', but it isn't type 'string'"%(obj,attr))

    # Pickle the data and return the coresponding string value:
    stringData = cPickle.dumps(data)
    # Make sure attr is unlocked before edit:
    mc.setAttr(objAttr, edit=True, lock=False)
    # Set attr to string value:
    mc.setAttr(objAttr, stringData, type='string')
    # And lock it for safety:
    mc.setAttr(objAttr, edit=True, lock=True)

def attrToPy(objAttr):
    """
    Take previously stored (pickled) data on a Maya attribute (put there via
    pyToAttr() ) and read it back (unpickle) to valid Python values.

    Arguments:
    objAttr : string : A valid object.attribute name in the scene.  And of course,
        it must have already had valid Python data pickled to it.

    Return : some Python data :  The reconstituted, unpickled Python data.
    """
    # Get the string representation of the pickled data.  Maya attrs return
    # unicode vals, and cPickle wants string, so we convert:
    stringAttrData = str(mc.getAttr(objAttr))
    # Un-pickle the string data:
    loadedData = cPickle.loads(stringAttrData)

    return loadedData

And here is some sample usage:

# Make some really special Python data you want to store to a Maya node:
specialData = {'red':52, 'green':63.3, 'blue':"ASDF"}
print "Python data to store to Maya obj.attr:"
print specialData
#Python data to store to Maya obj.attr:
#{'blue': 'ASDF', 'green': 63.299999999999997, 'red': 52}

# Define our node and attr name based on the selected object:
node = mc.ls(selection=True)[0]
objAttr = '%s.pyPickle'%node

# Store data to our node:
pyToAttr(objAttr, specialData)

# Later, get data back:
storedData = attrToPy(objAttr)
print "Restored Python Data:"
print storedData
#Restored Python Data:
#{'blue': 'ASDF', 'green': 63.299999999999997, 'red': 52}