Santa Crossing

by PopCultureSoft December 2012

 

Every year, around Christmas time, when I see a deer crossing sign, I think "that needs more deer and a sleigh!"

This year, I did it. Outside where I work there is a deer crossing sign. I made a modified version of the sign to include an entire sleigh and teem of deer. Not technically reign deer, but it gets the idea across.

Unfortunately, I didn't think of taking pictures of the process I went through to make the sign. I took a yellow vinyl table cloth, mounted it to a wall, and projected artwork I created onto it. Then I printed up the deer and santa on a laser printer and used spray adhesive to mount them to the vinyl. I drew in the border and reigns with a marker. I mounted the entire thing to some cardboard from a couple of shipping boxes, and trimmed it to the shape I wanted. This was screwed into a 1 x 2 x 8 furring strip for support. I clipped this to the existing sign, and used another furring strip as a second sign post to support the right side of the sign.

I could have printed this up on our HP5500 large format ink jet printer, but that's a LOT of ink for a joke sign. Plus, everyone at work would have seen the sign while it was printing. My method allowed me to do it more covertly.

If you would like to make your own sign, you can download the pdf of my artowrk. This is scaled to fit a 2' square deer crossing sign. If the sign you want to modify is larger or smaller, you would have to scale it accordingly.

Send me a picture if you make one yourself.

santa_crossing.pdf (694KB)

 

 

Tags:

Quick Voice Prompts

by PopCultureSoft March 2012

There are a couple of iOS apps that I've developed that use voice prompts. One of these apps is a reading trainer for dolch words. Dolch words are a few hundred words that readers should be able to read by sight. I wrote the app for my son. It displays a word, which he attempts to read. When he's done, he presses a button to hear the word, and then presses a thumbs up or thumbs down button to score himself. Simple little app.

But I didn't really want to record a few hundred words to individual files, especially with my other children running around making noise in the background. So, I had my mac do it for me automatically. You probably know that the Mac has speaking capabilities. Using those capabilities and AppleScript, the Mac can record synthesized voice to an audio file. The advantages of this are very fast audio file production, no background noise, and cost effectiveness. So, it is very good for development purposes.

Launch AppleScript Editor from your Utilities menu. Type in the following command

say "hello"

Then click the Run button. The mac will literally say "hello". Very simple. Now we have it save that to a file. Replace "username" with your local username.

say "hello" saving to "/users/username/desktop/hello.aif"

This will create an audio file on your desktop that is a recording of the mac os synthesized voice saying "hello".

Now, to create hundreds of these files, I made a spreadsheet. I use OpenOffice, but you could do it in Excel, or Numbers. In your A column, type the words or phrases you want. I was doing single words.

always
around
because
been
before
...

In the second column, I typed a formula to generate the AppleScript command:

="say """&A1&""" saving to ""/users/username/desktop/"&A1&".aif"""

Then I copied this down to the rest of the words. The "fill down" command (ctrl-d in excel) makes quick work of this. Voila, 220 lines of applescript code!

say "always" saving to "/users/username/desktop/always.aif"
say "around" saving to "/users/username/desktop/around.aif"
say "because" saving to "/users/username/desktop/because.aif"
say "been" saving to "/users/username/desktop/been.aif"
say "before" saving to "/users/username/desktop/before.aif"
...

Run that and multiple files will appear on your desktop, or wherever you told it to in the path. Then you can convert them to caf files for the iOS using afconvert.

for f in *; do if [ "$f" != "converttocaf.sh" ] then /usr/bin/afconvert -f caff -d LEI16 $f echo "$f converted" fi done

Tags:

Coding

USPS Under New Management

by PopCultureSoft March 2012

Amid challenging economic conditions, a changing business environment, and declining mail volumes, the U.S. Postal Service finds itself without sufficient revenues to cover its expenses and financial obligations. Since 2006, mail volume declined about 20 percent, from 213 billion pieces to 171 billion pieces, and USPS expects it to drop to about 150 billion pieces by 2020. As this trend indicates, USPS can no longer rely, as it once did, on growth in mail volume to help cover costs. Actions taken by USPS to improve its financial condition have been limited in part by statutory and regulatory requirements, such as those related to closing unneeded facilities.

In response to these conditions, the USPS has announced that Patrick R. Donahoe will be stepping down as Postmaster General. Levi S. Yoder has been named the 74th Postmaster General of the United States of America.

Prior to being named Postmaster General, Yoder ran a small dairy farm in Holmes county, Ohio, which he will continue to do. One of his first actions as Postmaster General has been to move the USPS headquarters from L'Enfant Plaza in Washington, D.C. to downtown Millersburg, OH. This move will consolidate over 75% of USPS mail processing to a space on the second floor above The Antique Emporium on Jackson St.

"Anymore, most of the mail delivery happens in this county. Either that or Lancaster, PA. So, we will be having a hub there as well, headed up by Brother Zeke," said Yoder at a press conference. "Due to budget constraints, we will have to close most local post offices. The remaining ones will be in Elkhart Indiana, Kalona Iowa, and Harmony Minnesota."

Services will also be some severe cuts to services. "Priority mail will have to be the first to go. It's one thing to guarantee quick mail delivery in the local zip code. It's another thing between hubs. We won't be getting mail from Ohio to Pennsylvania in two or three days. You just can't push the horses that hard. And we will be shuttering the website, of course, and turning off the phones."

For more information, please visit Mr. Yoder at his home in Kidron, OH.

Tags:

Humor - sort of

Celebrate a Back Home Thanksgiving with a Buckchuckel

by PopCultureSoft November 2011

A Traditional BuckchuckelThanksgiving is approaching and I am hankerin' for some old time vittles, i.e. comfort food. Growing up we would often have turkey, and on rare occasions we may be blessed with meatballs and red gravy or tuna special. But if we were having an exceptionally good year, hunting-wise, mom would whip up one of those rare delicacies: a buckchuckel.

A buckchuckel is a dish consisting of a squirrel stuffed into a woodchuck, which itself is stuffed into a deer. It is a favorite of mountain game hunters. The word buckchuckel is a portmanteau of buck (a male deer), woodchuck, and squirrel. In some regions, the term deerhogel is used, being a portmanteau of deer, ground hog, and squirrel. Six-a-one, half dozen of th'other.

If you really wanted to do it proper-like, you would need multiple squirrels and woodchucks to stuff a whole deer. But the result would feed half the neighborhood for a week, unless Billy Ray was home on parole. For a smaller crowd, you can take the fillet (backstrap) of a deer and stuff it with one woodchuck and one squirrel.

Some areas produce better venison than others. For example, mid-west deer tend to have more tender, tastier, marbled meat. This is due to the fact that they are basically corn fed. Much debate is given over which type of squirrel produces the best buckchuckel, but there isn't too much variation amongst woodchucks.

In leaner times, some have resorted to Muscatel. (Muskrat, Cat, and Squirrel).

People who have not acquired a taste for wild game have conjured up an all poultry version of this dish consisting of a turkey, a duck, and a chicken. They call it a turducken. I'm serious, I didn't make that up. What crazed mind came up with that idea?

My family recipe

Prep time:  1 -2 days (depending on if you count cleaning the game)
Cook time: 4 hours
Total time: 12 hours
Yield: 30 - 40, unless Billy Ray stops by, then 10 - 15

Ingredients

• 2 cups prepared cornbread stuffing
• 1/4 cups chopped apples
• 1 cans jellied cranberry sauce
• 2 large venison loins
• 1 medium sized woodchuck (7 lbs)
• 1 average size sized squirrel (1 1/2 lbs)
• 3 cloves garlic, cut in quarters
• 6 fresh sage leaves
• 1 teaspoon fresh sage, chopped fine
• 1 Tablespoon browning sauce (such as Gravy Master® or Kitchen Bouquet®)
• 1 Tablespoon olive oil
• Kosher salt and freshly ground black pepper
• Bacon (optional)

Trim any silverskin off of the venison loin. Butterfly the loin and season it lightly with salt and pepper on both sides.

Clean and bone woodchuck; remove glands. Soak overnight in a solution of equal parts of water and vinegar with the addition of one sliced onion and a little salt. Drain, wash, and wipe. Parboil 20 minutes.

Squirrels have scent glands in the small of the back and under the forelegs and the thighs. These should be removed without cutting into them. Wash and dry squirrel.  If the squirrel is old and tough, it may need parboiling beforehand.

Chop onions and fry gently in 2 oz of the butter. Peel apples and chop; add to onions and fry until soft. Mix onions, apple and butter with all other stuffing ingredients, and brown quickly in remaining butter.

Stuff cavity of squirrel.

Stuff squirrel into cavity of woodchuck.

Lay out the two venison loins so that they slightly overlap. Place woodchuck onto one of the venison loins. Roll the meats together and tie it with butchers string. Optionally, you can wrap this entire roll in bacon, especially if you want to grill or smoke the buckchuckel. (Soak the string in water before tying the loin to prevent it from burning.)

Cooking methods:

You could grill, roast, or smoke this. For grilling, place the buckchuckel over charcoal, at a medium temperature for twenty to thirty minutes. Turn one time after fifteen minutes. Coat the outside of the loin with olive oil before it goes onto the grill, and baste with oil once more when it's turned. When the internal temperature reaches 145F (medium rare), remove, slice into sections and serve. Remove at 160F if you prefer your game medium well.

Tags: , , , , , , , , ,

Humor - sort of

Taming the UIButton

by PopCultureSoft November 2011

I keep wanting to do things with UIButton that it just can't do. I don't know how many times I've wanted to do something as simple as changing the color of the button, or the highlight color. At least in iOS 5 you can now change the highlight color, which is cool, but I want it to do more.

The number one work around with UIButton is to make graphics for each state of the button: Default, selected, highlighted, etc. The main problem I have with that is that the graphics are set sizes. I have to create new graphics for each button size. This is very annoying, especially if I want to theme all my buttons in an app a particular color. Sometimes, I just want the button to be red, to give the user a visual queue that this button will do something important, or nasty, like deleting an entry. iOS uses a red button when deleting a line in a UITableView, so why can't I?

Another way that you can change the look of the button is to make changes to the layer of the button. I placed a button in interface builder and wired it up. Then I modified it this way:

[[basicButton layer] setCornerRadius:18.0f];
[basicButton setBackgroundColor:[UIColor whiteColor]];
[[basicButton layer] setBorderWidth:0.25f];
[[basicButton layer] setBorderColor:[[UIColor greenColor] CGColor]];

This works, somewhat. You will get a button of a different color. But it won't change color when you tap it. It also shows an anomaly in the corners when it's drawn. The outside of the border is not clean, for some reason

Also, if you set the border thickness very thin, some of the border is removed by the clipping mask of the layer. This may be the reason the above image isn't clean. Setting the buttons "clipsToBounds" property to NO does not fix this problem. That setting has to do with subviews, and this isn't a subview, but the layer. I tried setting the layers masksToBounds property to NO with no success.

 

 

To have total control of the button, you have to subclass it. So I bit the bullet, sub-classed UIButton, and forced it to do my will (insert evil scientist laugh here). It took me some time, but now I have it whenever I need to use it. At first I called it MyUIButton, but then changed it to ColorUIButton. I know you're asking yourself, "how does he come up with these creative names?" Since I have taken my share of help from other programming bloggers, It's my turn to give back. This isn't a very complicated subclass, and I'm certainly not the greatest coder in the world. So, please feel free to rip it apart, improve it.

In creating ColorUIButton, I wanted to be able to control certain characteristics of the button. This list grew as I found out that I could control many things. All of these items became properties of ColorUIButton:

• Button Color
• Button Highlight Color
• Border Color
• Border Thickness
• Border Highlight Color
• Corner Radius
• Gradient

The key to controlling all these features was overriding the drawRect method of UIButton. In doing so, I could use Core Graphics (Quartz 2D) to programatically draw a button based on those properties. The problem with the Layer

I've been doing electronic prepress work for 20 years. I used to be an Adobe Illustrator guru. I taught myself PostScript. So, I'm not sure if this is as easily understood by most coders or not. A good starting point is the Drawing and Printing Guide for iOS in the iOS Developer Library.

The drawRect method is an instance method of the UIView class. UIButton inherits from that class. You can draw anything you have a fancy to draw by overriding this method.

-(void)drawRect:(CGRect)rect {
     // insert drawing code here
}

The first item of business is to establish a CGContextRef:

CGContextRef myContext = UIGraphicsGetCurrentContext();

This sets up a Quartz 2D environment in which to draw, based on the current context, which UIView establishes. (If you're not in a UIView, you need to push your own context, but that's another story.)

Next we need to create a CGPath. You could just draw straight to the context, but I need a path that I can reuse. If I draw straight to the context, the path will be flushed when I "paint" it. If it weren't for the rounded corners, I could create a rectangle with one funciton: CGPathAddRect. But, alas, we need to actually move around and draw a precise shape. A normal rectangle has 4 points, and you just need to connect those points with lines. A round corner rectangle has 8 points, 2 for each corner. The 2 corner points are connected by an arc. the distance from the bounding rectangle to each point is equal to the radius of the arc.

1) Create a new path

CGMutablePathRef myPath = CGPathCreateMutable();

2) Move to the first point. In a normal rectangle, this would be (0,0). In a rounded rectangle, this is (radius,0)

CGPathMoveToPoint(myPath, NULL, radius, 0);

3) Add a line to the next point (width - radius, 0);

CGPathAddLineToPoint(myPath, NULL, width - radius, 0);

4) Add an arc to the next point. The arc function requires the center point of the arc (width - radius , radius), the radius, the start and end angles, and a boolean indicating the direction is clockwise. We are moving counter clockwise, so this is 0.

CGPathAddArc(myPath, NULL, width - radius, radius, radius, radians(-90), 0, 0);

5) Now we just keep going around the path doing the same thing.

CGPathAddLineToPoint(myPath, NULL, width, height - radius);
CGPathAddArc(myPath, NULL, width - radius, height - radius, radius, radians(0), radians(90), 0);
CGPathAddLineToPoint(myPath, NULL, radius, height);    
CGPathAddArc(myPath, NULL, radius, height - radius, radius, radians(90), radians(180), 0);
CGPathAddLineToPoint(myPath, NULL, 0, radius);
CGPathAddArc(myPath, NULL, radius, radius, radius, radians(180), radians(270), 0);

6) Then we add this path to the context and fill it

CGContextAddPath(myContext, myPath);
CGContextSetFillColor(myContext, cgFillColor);
CGContextDrawPath(myContext, kCGPathFill);

Now we can add it again to stroke it

CGContextAddPath(myContext, myPath);    
CGContextSetStrokeColor(myContext, cgStrokeColor);    
CGContextSetLineWidth(myContext, self.lineWidth);
CGContextDrawPath(myContext, kCGPathStroke);

You could do both fill and stroke at the same time, but I needed to add a gradient to it in between. The gradient is there to add a highlight to the button over the fill, but not over the stroke. Gradients in Core Graphics will fill the entire area of the UIView, and so need a clipping path to constrain them.

CGContextAddPath(myContext, myPath);        
CGContextClip(myContext);
CGPoint myStartPoint, myEndPoint;
myStartPoint.x = x;
myStartPoint.y = height - y;
myEndPoint.x = x;
myEndPoint.y = y;
CGContextDrawLinearGradient (myContext, myGradient, myStartPoint, myEndPoint, 0);
CGGradientRelease(myGradient);
CGColorSpaceRelease(myColorspace);

You can download the source code to see the entire drawRect method. I also set the colors based on a BOOL variable called "tap". If the user is tapping on the button, the colors change accordingly. To do this I had to override other methods in the code:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    tap = YES;
    [self setNeedsDisplay];
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    tap = NO;
    [self setNeedsDisplay];
    [super touchesEnded:touches withEvent:event];
}

The "[self setNeedsDisplay]" tells the view that it needs to draw itself. Otherwise, nothing will change. It isn't an animation, so you have to explicitly tell it when to draw itself. We have to pass on the touch event to the superclass so that the object actually behaves as a UIButton.

Then I also had to override another class to handle the behaviour of UIButton when people tap, then drag their finger outside the view

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    float distance = 70.0;
    CGPoint touchPoint = [[touches anyObject] locationInView:self];
    CGRect testRect = CGRectMake(-distance, -distance, self.frame.size.width + distance * 2, self.frame.size.height + distance * 2);
    if (CGRectContainsPoint(testRect, touchPoint)) {
        tap = YES;
        [self setNeedsDisplay];
    }
    else {
        tap = NO;
        [self setNeedsDisplay];
    }
    [super touchesMoved:touches withEvent:event];
}

The distance of 70 was purely trial and error. When a user taps and drags their finger outside of a UIButton, it will stay active until the touch event is greater than 70 points away from the button edge. So, I made a CGRect that was 70 points away from the bounds of the button, and the CGRectContainsPoint function tells me if it is still in that rect.

Here is the end effect. You can add UIButtons to your nib file, but change the class of them to ColorUIButton. Wire them up in the view controller and set the parameters you need.

 Now, as I said before, iOS 5 did give us the ability to change the highlight color. Perhaps in the future they will also let us change the button color, corner radius, etc. But until then, I have this custom class that I can use.There are other settings that are explained in the source code. For example, I had to inset the button based on the width of the border, or the border would extend beyond the boundries of the button, which we don't want.Here is the source code: button tests.zip (93.40 kb)

 In my source code the nib file looks like this:

When it runs, it looks like this:

Tags: , ,

Coding

Baby, You Should Drive This Car!

by PopCultureSoft October 2011

Pop Culture Software, LLC, has announced the release of their new RC vCar app, available on the iPhone, iPod Touch, and iPad 2.  RC vCar is a virtual radio controlled car.

"We were brainstorming about our next iPhone app," said John Barnhart, software developer for PCS.  "I asked my son what he thought it should be, and he said 'Daddy, can't you see? I want a remote control car!' It really broke my heart. So he was my test driver, and that was the start. We think this app will make us famous, a star of the platform. But in between, you should drive this car. And we'll love you for it."

RC vCar uses Augmented Reality technology to put a virtual rc car on the floor, or on a desk. The user controls the car by using speed and steering sliders on the screen, just like a regular R/C car.

Augmented Reality is technology that enhances a user's perception of their environment. By looking through the iPhone camera, a user can see an enhanced version of the world around them.

"I think our prospects are good with this app. Understand, RC vCar will run on any Apple device with a gyroscope and a forward facing camera, which includes the latest iPhone, iPod Touch, and iPad. We've been working for peanuts until now, and that's all very fine, but this app will show us better times."

RC vCar features working headlights, engine sounds, a horn, and includes 5 cars:
    • Soft top coupe
    • Large wheeled pickup truck
    • Pink convertible
    • Police car (with working light bar)
    • School bus (with working stop lights)

"I think the most fun part is the horn. It's like, beep beep, beep beep. Yeah!"

RC vCar is available on the App Store, or visit www.popculturesoft.com/vcar.html

 

 

Tags:

News

Teen banned from prom. There's an app for that.

by PopCultureSoft May 2011
Prom-sign
A Connecticut teenager who posted a sign on the front of his high school asking a girl to go to prom with him has been barred from attending.

Shelton High School senior James Tate and two friends posted 12-inch tall cardboard letters outside the school's main entrance, where everyone would see them going in last Friday morning. The problem is, this has been labeled as trespassing and vandalism. Too bad he hadn't heard about Glyphics.

Glyphics is an "augmented reality" app for the iPhone 4 and iPad 2 that allows users to hang virtual messages in physical locations. Tate could have used Glyphics to put up the same message, during school hours, without the school board even noticing. Then anyone using Glyphics on thier iPhone could go in front of the school and see it.

"Teens are obviously looking for inventive ways to ask a girl to the prom," said John Barnhart, developer for PopCultureSoft.com. "Tate wanted to impress this girl, and it worked. She said yes. Unfortunately, he was banned from the prom. If he had used Glyphics, that wouldn't have happened."

Unlike texting, where users send a message to their friend, users go to the message left with Glyphics. "It's sort of like virtual graffiti," says Barnhart, "except it's legal."

Glyphics is available on the App Store or visit PopCultureSoft.com.

Tags:

News

Small-Town Rabbi Upsets Undefeated Death

by PopCultureSoft April 2011

Death, the all time undefeated heavyweight champion of the world got his first taste of defeat early this morning in an unexpected upset by small town welterweight rabbi Jesus of Nazareth. 

Although experts had predicted the win by the thirty-something holy man, Death and his trainers were completely blind sided. "I thought we had this guy in the first round. He didn't even put up a fight," said the Grim Reaper in a press conference late this morning.

While this still leaves Death's overall record at an incredible 1.06 * 10^11 - 1, the surprise defeat has important ramifications. Even though he has remained otherwise undefeated since then, Death says that winning has lost that special something. "You know I used to get this real sense of satisfaction with each win. Now it's sort of lost that 'sting'. It all feels a little futile now."

Enthusiasts haven't heard much from Jesus, whose fans have started calling 'The Anointed', since his victory. "I don't think we've heard the last from this Jesus character," said Death's trainer Apollyon. "I know it sounds silly, but I'm a little nervous about Death loosing his title."

When asked if he would really win the title, Jesus replied "Thou hast said it. Nevertheless I say to you, hereafter you shall see the Son of Man sitting on the right hand of the power of God, and coming in the clouds of heaven." One may write that statement off as typical sports illeism, but this reporter thinks this Jesus is a man to follow.

Tags:

Humor - sort of

Alien Spacecraft Attack United States - Targeting McDonald's

by PopCultureSoft April 2011

A masked armada of alien spacecraft has been seen across the United States this week. They are randomly abducting citizens, and appear to have a preference for McDonald's customers.

"My husband and I just just ordered lunch. He got the Angus Chipotle BBQ Bacon, and I had the Premium Southwest Salad with Crispy Chicken, " said Mary Applegate of Peekskill, NY. "When all of a sudden these aliens show up. They're like, you know, chanting 'bacon, bacon, bacon, bacon', and grab my husband. Then a spaceship appears out of nowhere and beams up my Billie," she said as she wiped away her tears. "As soon as I finished my salad, I called the police. At least they didn't take his fries."

Due to the aliens' advanced cloaking technology, it is difficult to ascertain the alien presence. Witnesses say that they didn't actually see anything either, possibly due to memory erasing neuralizer technology.

Pop Culture Software, of Cortlandt Manor, NY has developed an iPhone app, called Glyphics,  capable of penetrating this alien cloaking technology. When questioned, however, they flatly denied any alien invasion.

"Uh, we just wrote this app called Glyphics that allows people to leave hidden messages for each other." said John Barnhart, lead developer at PopCultureSoft.com. "You can type a message, place a photo, create a drawing, or do all three. You look through the camera part of the phone and can see these drawings people left, called Glyphs. We made this picture of aliens abducting people and virtually-placed it outside of every McDonald's in the country. Really, it's just a promotional gimmick. "

However, investigators have yet to determine the truth of that statement. According to Phil Spencer, of the CIA, who wished to remain anonymous: "It is possible that PopCultureSoft is part of a vast right wing conspiracy attempting to cover up this alien invasion, and thereby undermining the efforts of President Obama. Either that, or they just punked us."

Glyphics is available on the iPhone App Store. Check out your local McDonalds to see if is being invaded. It has also been reported that there is suspicious activities going on at your local WalMart , as well as Apple's retail stores.

McDonald's headquarters did not immediately return a call for comment.

Tags:

Humor - sort of

Flying Spaghetti Monster Destroyed During Passover Cleaning

by PopCultureSoft April 2011

Jerusalem - 04/18/2011

The Flying Spaghetti Monster was annihilated yesterday afternoon by the Lord God Jehovah during his preparations for passover, which starts tonight. 

"Everyone knows that pasta is chametz, and not allowed on passover." Said the Ancient of Days at a press conference last night. "Well, I was doing bedikat chametz [search for the leven] of the universe, and realized that it had been years since I last checked Ursa Major's navel! All sorts of stuff gets caught in there, as you can imagine. Sure enough, there was a few metric tons of lint, an old box of cheez-its, and the FSM."

Chametz refers to leavened products that are forbidden to be consumed on the Jewish holiday of Passover. These items must be consumed, sold, or burned before the holiday.

The Church of the Flying Spaghetti Monster reportedly does not keep the "blasphemous" holiday of passover, as it would exclude the FSM as well as beer, a sacred drink in the CotFSM.

When asked what became of the FMS, the Almighty replied "I had him for dinner in a light bolognese sauce of my own creation… I mean, well, everything is of my own creation… You know what I mean."

The announcement went mostly unnoticed among members of the CotFSM, also known as Pastafarians. Bobby Henderson, prophet of FSM and part time hobo, refused to comment, mumbling something about a beer and a hammock.

Tags:

Humor - sort of

Keep up-to-date - Join @PopCultureSoft on Twitter or Facebook for the latest news...

Pop Culture Software is an iOS development company located in Cortlandt Manor, NY.