Sunday, May 9, 2010

iPad stand for $3



My iPad arrived on Friday. I didn't order any accessories since I really didn't know what I would need or want. In the past, I have been a little purchase-crazy when buying a new laptop, PC or gadget. I purposed that this time would be different.

On Saturday I took a little road trip and, of course, took my iPad with me. Right away it was clear I needed a case. A quick stop by the Mac Store and I had a Hard Candy Hard Sleeve case. Since I already have a bluetooth keyboard that works perfectly with the iPad, I needed a stand. While at the Mac store, I looked at Apple's $30 dock and can only say, “What were they thinking?” With its tiny 2.5in. wide base it appears unstable and the inch high back seems like it could stress the dock connector. I decided that I could do better, at least for my needs. A short quest led me to a small plate holder at Office Depot for $2.99. The dock cable can stay connected in both landscape and portrait positions. The only thing that could make it better is if it were hinged and folded flat so it could be easily carried.

Thursday, December 24, 2009

Podcasts Worth Listening To

I was recently asked what podcasts I listen to. I like to know what others listen to. So I thought I'd blog about my favorites.



Blog – Stack Overflow: For a weekly dose of ASP .Net information, check out this podcast by Joel Spolsky (Joel on Software) and Jeff Atwood (Coding Horror). It covers a wide variety of topics of interest to developers and designers. As of this post, the podcast was last updated on 12/23/2009.

Boagworld Web Design Advice: If you are a designer, developer or a web site owner, you probably already know about this podcast. However for the one or two that may not, I highly recommend this weekly show by Paul Boag and Marcus Lillington, both of the UK based web design and development company Headscape. Paul and Marcus provide tons of useful information in an entertaining way. As of this post, the podcast was last updated on 12/11/2009.

CFConversations: Brian Meloche hosts a ColdFusion podcast. He tons of interviews and round-table discussions. As of this post, the podcast was last updated on 11/19/09.

The Flex Show: Flex developers will find plenty of topics of interest in Jeff Houser and John Wilker's bi-weekly audio podcast and their screencasts. As of this post, the podcast was last updated on 12/23/2009.

Hanselminutes: Author, blogger and Microsoft employee Scott Hanselman provides a lot of good content in his weekly podcast. Although mostly about ASP .Net, Scott also covers topics that will be of interest to developers in general. As of this post, the podcast was last updated on 12/11/2009.

Mars Hill Church: Speaking and preaching pastor Mark Driscoll is always thought-provoking. Mars Hill Church takes the Great Commission serious and gives feet to their faith. As of this post, the podcast was last updated on 12/23/2009.

.Net Rocks: This is one of the longest running podcasts I'm aware of. Focused on the .Net framework, Carl Franklin and Richard Campbell are always entertaining and informative in their weekly podcast. As of this post, the podcast was last updated on 12/23/2009.

Polymorphic Podcast: Author, developer and Microsoft ASP .Net MVP Craig Shoemaker provides a good variety of information on OO development and software architecture in his podcast. Although there doesn't seem to be a regular schedule, it is worth a listen. As of this post, the podcast was last updated on 12/1/2009.

Pragmatic Podcast: As a part of the Pragmatic Bookshelf it compliments the book series nicely. It's publishing scheduler is sporadic, but there is a large selection of podcasts already online online. As of this post, the podcast was last updated on 7/1/09.

SitePoint Podcast: SitePoint introduced the podcast to their list of developer and designer resources on November 10, 2008. Starting out with a bi-weekly schedule, it is now published weekly. Host Kevin Yank, a long term SitePoint author, offers a wide range of topics. As of this post, the podcast was last updated on 12/20/2009.

Software Engineering Radio: Covering a wide range of software topic, this podcast is clearly for the developer. Their topics are covered with a focus of being a resource instead of a current events type show. As of this post, the podcast was last updated on 12/14/2009.

WebDev Radio: Entrepreneur, developer, writer and teacher Michael Kimsal covers a range of topics that will interest developers using a variety of languages. As of this post, the podcast was last updated on 12/17/2009.

Saturday, December 12, 2009

Working From Home: 7 weeks in


It has been seven weeks that I have been working from home. I have been able to focus on my project which has caused a big jump in productivity. But, the last few weeks have not been without a few surprises.

I was concerned that the inevitable distractions of home would be a problem. I was surprised that they simply do not exist. This has been a pleasant surprise. I think the bottom line is that I really love what I do and, if given a choice, would not do anything else.

I sort of miss having co-workers. I have always felt that I could move to the middle of nowhere and, so long as I had broadband, I would be fine. I miss the cheerleaders, those co-workers that are always upbeat and you feel better after talking to them.

Overall, it has been a very positive experience and I would recommend it to anyone that has the opportunity. Make sure to pay attention to Dan Wilson's advice though, "Make sure to invest in having a proper environment. You'll need a comfortable and useful desk, positioned in the best, most distraction free part of the house."

Wednesday, October 21, 2009

New working environment

The company I have been with for the last 17 years formed a new software company this year and I was asked to help lead the development side of things. The organizational structure is such that we don’t require central offices. Those of us involved in the day-to-day operations each have offices in our homes. Working at home is nothing new for me since I, as many of us do, take the occasional side job. Starting next week however, I will be using my home as my primary workplace. So I started wondering what others feel about working from home.

Do you work from home? What do you like or dislike about working from home? What challenges have you faced and how did you overcome them? Is the lack of contact with coworkers a problem?

Tuesday, June 16, 2009

iPhone Tweetdeck

If, like I did, you find the Tweetdeck site grinding to a halt and unable to find it by searching on iTunes, you can click the link below and it will take you directly to it at the iTunes store.

iPhone Tweetdeck

Tuesday, June 2, 2009

Design Patterns - Strategy Pattern

So for the last couple weeks, I have been learning about design patterns. I am admittedly not an expert or even sure I know what I'm doing so I'm hoping that if anything is incorrect, or could be improved, that a comment will be left.

The first pattern that I have read about is the Strategy pattern. Below is the UML diagram for a sample application I'm writing.



The point to the strategy pattern is to create a class with the attributes and methods that do not change together, but make provisions to easily add methods that implement a common interface but can yield different behavior. The Vehicle class is an abstract that is never instantiated. Instead, the classes GoCart and ModelCar will be subclasses of Vehicle and can contain methods specific for them. A go-cart can drive and turn but most plastic model cars usually don't. Each class can have a Year, Make and Model but there is some difference in how the implementation for drive and turn needs to happen. As you will see we can even change these behaviors at run-time.

Enough jabbering, here's some code. I'm using Flex and AS3 but it should be fairly easy to code it in any language.

This is my abstract class from which the concrete classes will extend.


Vehicle.as

package Strategy
{
public class Vehicle
{
import Strategy.DriveBehavior;

public function Vehicle()
{
}

private var _year:int = 0;
private var _make:String = '';
private var _model:String = '';
private var _driveBehavior:DriveBehavior;
private var _turnBehavior:TurnBehavior;

/* Accessors */
public function setYear(year:int):void {
_year = year;
}

public function getYear():int {
return _year;
}

/* Other Getters and Setters Here */

public function setDriveBehavior(behavior:DriveBehavior):void {
_driveBehavior = behavior;
}

public function setTurnBehavior(behavior:TurnBehavior):void {
_turnBehavior = behavior;
}

/* Functions */
public function performDrive(){
return _driveBehavior.Drive();
}

public function performTurn(){
return _turnBehavior.Turn();
}
}
}




These are the concrete classes, an extension of the Vehicle class. It is in these classes that I set the default behavior for Turn and Drive.


GoCart.as

package Strategy
{
public class GoCart extends Vehicle
{
public function GoCart()
{
super.setDriveBehavior(new RearDrive());
super.setTurnBehavior(new TurnFront());
}

}
}




ModelCar.as

package Strategy
{
public class ModelCar extends Vehicle
{
public function ModelCar()
{
super.setDriveBehavior(new NoDrive());
super.setTurnBehavior(new NoTurn());
}

}
}




Here are my two interfaces for the behaviors used to define the required functions that any of the behavior classes must implement.


DriveBehavior.as

package Strategy
{
public interface DriveBehavior
{
function Drive():String;
}
}




TurnBehavior.as

package Strategy
{
public interface TurnBehavior
{
function Turn():String;
}
}




For the behaviors, I'll post one for each of the interfaces. They simply return a string indicating that the behavior is active.


RearDrive.as

package Strategy
{
public class RearDrive implements DriveBehavior
{
public function RearDrive()
{
}

public function Drive():String {
return "Driving using the back wheels.";
}

}
}




TurnFront.as

package Strategy
{
public class TurnFront implements TurnBehavior
{
public function TurnFront()
{
}

public function Turn():String {
return "Turning from the front."
}
}
}




Now for the code that pulls it all together.


DesignPatters.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
import Strategy.GoCart;
import Strategy.RearDrive;
import Strategy.FrontDrive;
import Strategy.NoTurn;
import Strategy.TurnFront;

private var myGoCart:GoCart = new GoCart();

private function init():void {
AutoYear.text = myGoCart.getYear().toString();
AutoMake.text = myGoCart.getMake();
AutoModel.text = myGoCart.getModel();
AutoDrive.text = "---";
AutoTurn.text = "---";
myGoCart.setDriveBehavior(new RearDrive());
myGoCart.setTurnBehavior(new TurnFront());
}

private function setValues():void {
myGoCart.setYear(2002);
myGoCart.setMake("Home-Built");
myGoCart.setModel("Racer");
AutoYear.text = myGoCart.getYear().toString();
AutoMake.text = myGoCart.getMake();
AutoModel.text = myGoCart.getModel();
AutoDrive.text = myGoCart.performDrive();
AutoTurn.text = myGoCart.performTurn();
}

private function changeBehavior():void {
myGoCart.setDriveBehavior(new FrontDrive());
myGoCart.setTurnBehavior(new NoTurn());
}

]]>
</mx:Script>

<mx:Panel width="200" height="300">
<mx:Label text="Go Cart"/>
<mx:Label id="AutoYear"/>
<mx:Label id="AutoMake"/>
<mx:Label id="AutoModel"/>
<mx:Label id="AutoDrive"/>
<mx:Label id="AutoTurn"/>
<mx:Button label="Show Values" click="setValues()" />
<mx:Button label="Change Behavior" click="changeBehavior()" />
</mx:Panel>
</mx:Application>


This just imports the appropriate classes, initializes an instance of the GoCart class and shows a default display in a panel. Click the Show Values button and the labels are populated with the Year, Make, Model and the two default behaviors. Clicking the Change Behavior button calls a function that modifies that default behavior. Again click the Show Values button to see the changes.



Not too exciting but it was an interesting exercise. Again, I'm doing this as a learning exercise so I appreciate any comments you may have and if I have it completely wrong, please feel free to set me straight. :)

If you are interested, you can download the files.

Sunday, May 17, 2009

New Logo Survey

My graphic artists asked that I run a second logo survey. Please vote for your favorite logo over on the right.