Monthly Archives: July 2009

Linux Chrome Builds Get Plug-In Support [Downloads]

Linux: If a lack of third-party plug-in support (i.e. Flash) kept you from trying out Chrome on your Linux system, then avoid no longer. The “early developer version” now supports many plug-ins, and they seem to work pretty well.

You’ll need to add --enable-plugins to your Chrome shortcut’s command line operation to get the “buggy” plug-in support, but it seems worth the hassle, as YouTube and Hulu videos are playing relatively stable and smooth. Google’s updated their alpha-level Chrome builds to include the newest start page tweaks as well, and it’s generally a browser worth checking out, even if a few standard settings and convenience items are still missing.

Grab an Ubuntu-ready package from the link below, or build the latest Chromium on any Linux system.

Early Access Release Channels [Chromium Developer Documentation via Absolutely!]





Jim’s End Tables – Viewer Project

This Viewer Project was sent in by Jim. He writes:

End Table view 1This is my most ambitious furniture project to date and one I am verrry happy to be finished with. Needless to say, my wife is happy also. She wanted two new end tables to replace the nice, but 30 year old ones we had in our living room. I began working on design ideas over a year ago passing ideas by the “customer” and after getting approval of preliminary design concepts, began some serious layout and prototyping. I constructed a full-scale prototype of the base with a piece of plywood for the top, for the purpose of determining suitable scale, proportions and some style ideas, like the coves on the aprons. The basic lines of the frame are very close to a couple of hall tables I built for my wife and for my daughter-in-law. Jane wanted it to be dark but not too reddish, and I wanted to see nice grain pattern so I chose walnut.

End Table view 2 But rapid completion was not to be. Other high priority projects took precedent and extended the completion to the point of ridiculousness. And working intermittently kinda hurts my head trying to get back into it. Ever have that feeling? Then there are the cold winters in Virginia that make it tough to work in the garage. A few shop/tool improvements over the last 6 months of ‘08 helped make things go much better. Specifically, I bought a used Grizzly 6? jointer, a new Steel City table saw, a new Triton router with above table height adjustments, built a router table and fence, and a band saw fence.

End Table view 3Pictures 1 through 3 are different perspectives of one of the tables showing the tapered legs, and the coves. Everything but the shelf platforms are solid walnut. The shelf was an “oh, yeah, we need a shelf” idea which wasn’t part of the original design plan. Since I had already built the bases, the shelves turned out to be quite a challenge to come up with a way to mount them. The shelf fits in a dado in the shelf support aprons. I mounted the aprons, both for the tops and for the shelves, with pocket screws.

End Table view 4My wife found the baskets at Michael’s on sale for $10 each. I made a simple walnut plywood lid with finger holes that sit snugly in the top of the basket to hide the junk. The final touch, shown in picture 4, is the ebony inlay. I thought it would add a lot to the top but had never done anything like it before. With much trepidation, but bolstered by Marc’s advice on more than one occasion, it actually worked out pretty decent.

The finish was as follows:

* Wiped on TransTint Dark Walnut in distilled water, applied twice, then very lightly knocked down the grain with 400 grit.
* Wiped on SealCoat (dewaxed shellac) to seal the water-based dye.
* Brushed on 3 coats of General Finishes Water-Based Polyacrylic Semi-Gloss.
* Sprayed on 2 coats GF WB Poly Satin.

The WB Poly was something else I had never tried before but once again Marc’s advice got me going. I owe a big thanks to Marc for his advice, and my wife for her patience and design ideas.

DIY Cardboard Wallet Looks Way Better than You Would Think [DIY]

We’ve featured DIY wallets of all kinds, made from moleskines, simple paper, cassette tapes, duct tape, a dollar bill, and an old keyboard, but this “hand-stitched” cardboard wallet looks impressively, well, leather.

Instructables user Creativeman details the process, from getting together your supplies (it’s really mostly cardboard, glue, and some varnish) to creating faux stitches with some paint (they look real!).

The results, as you can see, are pretty solid—especially among its competition in the DIY wallet realm.





Making Silverlight 3 Application Code More Compatible with Blend

Expression Blend 3 is a great tool for creating Silverlight or WPF user interfaces using design time tools and controls.  If you haven’t tried version 3 you’re really missing out since it adds a ton of new time-saving features.

While I really enjoy working in Blend, one of the things I’ve struggled with in the past is making code work better in Blend.  If you’ve ever had an error like the following you know what I mean:

image

What’s up with the error?  In short, I’m declaratively assigning my ViewModel object (my object that contains the data being bound to the Silverlight View if you’re new to the whole MVVM terminology) in the View’s resources area as shown next:

<navigation:Page.Resources>
    <viewModel:PayrollSummaryViewModel x:Key="ViewModel" />
</navigation:Page.Resources>

There’s nothing wrong with that except that when the ViewModel object’s constructor is called an error is occurring due to a null reference exception.  Note: Some people like the declarative way of defining ViewModels and some people don't.  A few months ago I was against that approach until I started working on my current project and realized that the pros outweighed the cons (at least for my scenario).  Plus, the declarative approach is used when working with test data in Blend 3.  Ultimately each application has different requirements so I'll leave it as an "exercise for the reader" to decide what works best for you.

Here’s the code in the constructor which is calling out to a WCF service to retrieve some data:

public PayrollSummaryViewModel(IServiceProxy proxy)
{
    _Proxy = (proxy != null) ? proxy : new ServiceProxy();
    GetPayrollSummary();
}

You obviously can’t call out to a WCF service when you don’t have access to an HTTP stack.  Fortunately, fixing the problem and making the code more “Blendable” is easy.  Silverlight has a class named DesignerProperties that can be used to check if the code is being run in a designer such as Blend or if the code is being run live.  Here’s an example of using the DesignerProperties class and wrapping it in a property named IsDesignTime:

public bool IsDesignTime
{
    get
    {
        return DesignerProperties.GetIsInDesignMode(Application.Current.RootVisual);
    }
}

To avoid trying to call the WCF service in the ViewModel object’s constructor when the code is run in Blend I can wrap the code with the call to IsDesignTime as shown next and Blend is happy with everything. 

public PayrollSummaryViewModel(IServiceProxy proxy)
{
    if (!this.IsDesignTime)
    {
        _Proxy = (proxy != null) ? proxy : new ServiceProxy();
        GetPayrollSummary();
    }
}

You can see that creating more “Blendable” code is pretty easy once you know this simple trick.  More info on the DesignerProperties class can be found here if you’re interested.  There are apparently some issues using it with the Visual Studio designer used for Silverlight 2, but since Silverlight 3 doesn’t have a Visual Studio designer that’s kind of a moot point.

Copy Music to Your Android Phone Over USB [Android]

Android: The Simple Help tech blog walks through the process of adding music to your Android-based phone using a USB cable and some simple file copy action.

The guide covers how to connect the phone to your Windows or Mac system by enabling the USB connection, adding the music to the Music folder (creating if it doesn't exist), and then turning the USB storage off again. It's really quite easy, but the Simple Help guide walks through the process in detail—so even the less tech-savvy can have music on their Android phone.

Hit the links for the full walk-through for your operating system, or check out how TuneWiki puts lyrics, radio, and social features into mobile music for your Android phone.





From the Tips Box: Carabiner Cable Management, Hulu Commercial Skipping, and Google Voice Visual Speed Dial [From The Tips Box]

Dive in for some cool carabiner-based cable management, Hulu commercial skipping, and Google Voice Visual Speed Dialing on your iPhone.

Don’t like the gallery format? See all the tips on one page here.

Traveling With Your Electronic Gear

Richard needed a way to organize his electronic gear for traveling. Here’s what he came up with:

After searching far and wide for an easy-to-use organizer for my laptop bag and not finding one, I made my own. It is the same size as my MacBook, so it fit easily into my laptop bag.

I bought a Booq zipper laptop sleeve and added some elastic bands and cord and a little velcro to fit what I need on most trips. I added a $2 zipper pencil case from Target for the little stuff and it works like sin.

I stitched the elastic bands, velcro, and elastic cord using a leather sewing tool which works great. If I had an electric sewing machine that could handle the thickness of the Booq case, that would have been even better.

Skipping Hulu Commercials

Kathryn wrote in with a tip on how to effortlessly “block” commercials during Hulu video playback:

The Firefox extension Adblock Plus version 1.02 enabled and subscribed to “Easylist USA” causes all commercials except the 7 second intro commercial to be skipped. The screen goes dark for a few seconds at each commercial – then the show resumes.

Carabiner Cable Management

Zachariah shared his way of clearing cable clutter:

I’m a rock climber. I was looking at some carabiners and thought that if these were hung under the desk surface, they would be great to keep the cables together and easy to add and remove cables from. I’ve got a bunch of carabiners lying around but they are easy to find at most outdoor stores, or even a hardware store. The climbing ones are a bit of an overkill as they are rated for around 5500lbs. The hardware store variety are more than adequate. To mount the carabiners to the bottom of the work surface, I made some brackets out of some AllRound Steel Strapping. Each bracket uses a short length (5 holes), bent in the middle to form a rounded gap and screwed to the work surface (remember to put perpendicular to the back edge of the work surface). You can also use some pre-made hangers if you want. That is about all there is to it.

Adding Google Voice Visual Speed Dial to the iPhone

Eric found a way to add Google Voice Visual Speed Dial to his iPhone:

1. Add the GV gadget to your iGoogle page.

2. Click on contacts. Find the unique URL for the contact you want to create a speed dial icon for. Let’s use “mom.” URL will be something like www.google.com/voice/m/contact/62875768456345.

3. Find a picture of mom. Resize it to 57 x 57, and save as PNG.

4. Go to iPhone Webclip Icons. Upload the image of your mom. Name it “mom” and paste the URL from your GV Contacts. Put in your email address, and you probably DONT want to make it public.

5. Create shortcut.

Voila — you'll be emailed a link that includes your mom's picture as a fav icon. Add it to your home screen. Now whenever you want to call home, just click on her picture. It'll launch her GV contact info, and then you can select which number to call.

Hide Those Facebook App Messages, Again.

Jeff wrote in to tell us that the previously mentioned Facebook Purity Greasemonkey script started blocking all of his feeds, then offers this tip that fixes the script (for those willing to dive into the user script):

I noticed fbpurity was blocking all feeds. I looked into the script and determined that changing two instances of

footernodes[i].parentNode.parentNode.therestoftheline

to just

footernodes[i].parentNode.therestoftheline

fixes the script.





BestParking Helps You Find Cheap Parking in Major Cities and Airports [Parking]

You need to park your car and you’re crunched for time. You’re not in a position to comparison shop parking rates. Thankfully BestParking has already crunched the numbers for you and can help you find the best rate.

How much can you save by comparison shopping? In our tests there was a surprising disparity between the highest priced and lowest priced parking area. In the screenshot above, for example, we searched for parking around Detroit Metro. Among the airport parking garages there was an almost 100% difference between the highest price and the lowest price for parking.

That kind of price gap isn’t a big deal if you’re only parking for a single day and are willing to pay a little surcharge for convenience but if you’re plunking your car in long term parking for a week you could save yourself some serious cash by picking the right lot.

If you didn’t plot out which parking garage to use ahead of time, fire up the browser on your mobile phone and head to the mobile version of BestParking to get a last minute rate check. Have a trick or two for scoring cheap parking while traveling? Share them in the comments.





Bad Apple: An Argument Against Buying an iPhone [Rants]

Apple just rejected the Google Voice iPhone application from App Store distribution, the most recent in a long line of questionable moves, and the message is clear: If you want a device that won’t lock you out of innovation, skip the iPhone.

Photo by rore.

Lest We Forget

There’s no question that this brilliant little piece of hardware has sparked a revolution in the world of mobile computing and cellphones, and, likewise, there’s no question that consumers have benefited from that. I’ve been a believer in the iPhone from the start (hell, I even co-wrote a book on the stupid thing), but despite all the missteps Apple has made along the way, it always at least seemed plausible that they were holding out on apps or making unpopular decisions with some sort of good reason. (That was probably always willful ignorance, and Apple’s culture of secrecy just makes it that much easier to assume there’s some Very Special Reason for their bad decisions.) Still, I’ve never regretted buying an iPhone until now.

Refusing Competition

Over the course of the day, most people have speculated that Google Voice was rejected from the App Store at AT&T's behest. The reason? Apple's official line is that Google Voice duplicates features already on the iPhone—namely the Phone and Messages app. Of course, none of that holds water, considering the App Store is already full of alternate SMS apps and apps like Skype that sport a telephone dialer.

So what separates Google Voice from the other, already-approved tools that offer similar features to the iPhone's default apps? As far as we can tell, the main issue is competition. AT&T doesn't see Joe Schmoe's SMS Big Keyboard Deluxe (it's a real app) as much of a threat to the colossal ripoff that is text messaging, for example, but people may actually want to use Google Voice.

From another angle, Apple only seems concerned with duplication of features if an application competes with an app that they already made. If you're competing with another non-default third-party application, you can go and duplicate all you want (hence the oft-cited Fart apps). Still, if a Google Voice app actually does duplicate the functions of the telephone/SMS applications that ship with the iPhone, I want to know how I can use my iPhone to check my Google Voice inbox, send messages via Google Voice, or get my voicemails transcribed with what Apple and AT&T are offering. And do not send me to a crappy iPhone 1.0 webapp.

The real problem, then, is that Google Voice, and all it offers, is actually much better than what AT&T offers.

Forget About Innovation

It's unfortunate, of course, because Google Voice doesn't actually stop anyone from using AT&T. It's not a VoIP app (yet), so you still need AT&T for it to work at all. Again, it simply improves on what the iPhone already has. It would actually make AT&T—and the iPhone—better. From my perspective as a consumer, that in turn makes the iPhone a much more attractive device. Since it's been rejected on the iPhone but approved for Android phones and BlackBerrys, that in turn makes both of those devices that much more attractive.

Sure you can switch carriers if you're not happy—as long as you're willing to empty your pockets to drop out of your contract. That's always been the case. But Apple/AT&T have never sent such a clear message in the past about just how restrictive they'll get if they feel threatened by an application. Those of us who were once excited at the seemingly limitless potential of the App Store now know where we stand.

Apple would like you to believe that the goals of the App Store approval process are lofty ones—that they're only approving innovative apps and that the only reason they don't approve apps is to protect you from bad software or, horror of horrors, confusion. Because god knows it’d be confusing as hell to use a better phone application than what came with the phone. Meanwhile, thank god we can pass our time with iWet T-Shirts (borderline NSFW).

It’s All About the Software

As far as I’m concerned, there’s two things that set the iPhone apart from its competition: 1) It’s got great hardware, and 2) It’s got the most third-party applications.

The first issue is a hurdle for other phone providers/phone manufacturers to figure out; some already have matched the iPhone’s hardware (as far as its guts go, the iPhone and the Palm Pre aren’t all that different) and others will eventually.

The second is where Apple is really asking for it. The more alienated developers feel—especially good developers who're trying to build something new and innovative (as opposed to those looking to join the Fart app gravy train)—the less time they're going to spend playing iPhone App Store roulette. Which means that if you want a phone where you can expect some real innovation, you should probably skip the iPhone.

Isn’t This a Bit Familiar?

The iPhone is a full-on computer in your pocket, and in many ways is more capable than your regular old PC. Imagine, if you can, that Microsoft tried dictating what browser you had to use on Windows. Oh right, that happened. Except they didn’t refuse to allow you to use any other browser just because it duplicated the features of their default browser. And as Wired points out, Apple is inviting all kinds of regulation with this kind of mindset. And it hasn’t just been about Google Voice:

Apple and AT&T are living dangerously though. Apple has also forced video services like Slingbox to cripple their applications because of purported concerns over data usage, while approving ones from paying partners (e.g. Major League Baseball) that would put more strain on a network than Slingbox's would.

If the iPhone's default applications were better than those submitted by Google or by some other third-party developer, then people would use them. If not, then that's a sign that they need to make them better—not a red flag that they should start pulling apps left and right from the App Store because of "duplication."

Why You Should Care

At the end of the day, this isn't simply a Google Voice/iPhone problem—it's a concern for everyone, iPhone owner or not, with an interest in the latest and greatest crop of smartphones. Google's Android OS may be open source, but that doesn’t mean they’re above pulling apps when pressured by carriers. Right now the non-iPhone manufacturers and carriers are much more willing to allow anything on their platform because, frankly, they’re desperate to get some of the attention the iPhone already has. That doesn’t mean that’ll always be the case.

Every now and then, we like to go on grumpy, long-winded, opinionated rants. We’re far from the definitive voice, and your feelings may differ, so feel free to air your thoughts in the comments.





Getting Images From The iPhone Photo Library Or Camera Using UIImagePickerController

This will be a simple tutorial showing you how to access the iPhone’s photo library as well as the camera. Since the 3.0 update, the methods for picking photos have been deprecated. So this will be a 3.0 and above tutorial.

We will be creating an applicaiton that will allow you to pick a photo from the library or camera and display it on the screen. Here is a screenshot of what the app will look like:

photo 2

Let’s go ahead and get started…

1. Create A New View Based Application

I called mine photoApp (I will be using this name as reference)

2. Create The IBOutlets and IBAction

Open photoAppViewController.h and add the following code

#import 
 
@interface PhotoAppViewController : UIViewController | UIImagePickerControllerDelegate, UINavigationControllerDelegate | {
	UIImageView * imageView;
	UIButton * choosePhotoBtn;
	UIButton * takePhotoBtn;
}
 
@property (nonatomic, retain) IBOutlet UIImageView * imageView;
@property (nonatomic, retain) IBOutlet UIButton * choosePhotoBtn;
@property (nonatomic, retain) IBOutlet UIButton * takePhotoBtn;
 
-(IBAction) getPhoto:(id) sender;
 
@end

Important: Replace the | in the interface declaration with < and >.  I just used the vertical pipe bc wordpress was replacing it with html encoding.

Notice that we implement the UIImagePickerControlDelegate and the UINavigationControllerDelegate. These are both needed to properly interface with the image picker. The rest of this stuff should be pretty strait forward if you have been reading our tutorials. We set up some outlets to the buttons we are using (this will be to determine which button was pressed). There is also and IBAction that will get called when the user presses either of the buttons. This method (getPhoto) will show the ImagePicker.

3. Create The Interface

Open up photoAppViewController.xib in Interface builder and follow these steps:

  1. Drag a UIImageView on to the main view
  2. Set the Mode of the UIImageView to Aspect Fit in the Attribute inspector
  3. Drag a UIButton on to the view and title it Choose Photo
  4. Drag another UIButton on to the view and title it Take Photo

The interface should look something like this:

screenshot_01

4. Connect The IBoutlets and IBAction

  1. Connect choosePhotoBtn to the UIButton titled Choose Photo
  2. Connect takePhotoBtn to the UIButton titled Take Photo
  3. Connect the imageView to the UIImageView
  4. Connect the Touch Up Inside callback on each of the buttons to the getPhoto method

When you click on File’s Owner the connection inspector should look like this:

screenshot_01

Close Interface Builder

5. Implement The getPhoto Method

Open PhotoAppViewController.m and add the following code:

@synthesize imageView,choosePhotoBtn, takePhotoBtn;
 
-(IBAction) getPhoto:(id) sender {
	UIImagePickerController * picker = [[UIImagePickerController alloc] init];
	picker.delegate = self;
 
	if((UIButton *) sender == choosePhotoBtn) {
		picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
	} else {
		picker.sourceType = UIImagePickerControllerSourceTypeCamera;
	}
 
	[self presentModalViewController:picker animated:YES];
}

Make sure you synthesize your view properties.  Here is what is going on in this method.

We first create a new UIImagePickerController object.  This is a view controller and can be displayed any way you would normally display a view controller (pop on to a navigation view stack, load in a tab view, present as modalviewcontroller).  Next, we set the delegate of the picker to our viewController.  This just means the picker will call a method inside of this class when the user picks a photo.

Next, we determine which button was pressed.  Since both buttons were connected to this method, we can see which one called it by using ==.  Now, here is where Apple has done a great job.  The difference between displaying the camera and photo library comes from setting a single property in the picker.  Looking at the code, it should be pretty obvious which is which.

Finally, we call presentModalViewController with our picker.  This will animate the picker into view from the bottom of the screen to the top.  Depending on the button you press, you should see one of the views below:

photo 3photo

6. Displaying The Selected Image

Once a photo is selected or taken, the ImagePicker will callback to a method in our class called didFinishPickingMediaWithInfo.  Add the following code to your PhotoAppViewController.m file.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
	[picker dismissModalViewControllerAnimated:YES];
	imageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}

The first line just hides the picker.  The next sets to image property of our image view to an image returned from the picker.  The picker actually returns an NSDictionary.  That is because the other key UIImagePickerControllerMediaType; will return whether this is a video or an image.

And there you have it.  A way to get photos from the iPhone’s image library or camera.  If you have any comments or questions, feel free to write them in the comments section of this post or write them to me on twitter.  You can download the source below. Happy iCoding!

iPhone Tutorial – PhotoApp.zip

Use Gmail Drafts to Sync Text on Your Phone [IPhone Tip]

You need to sync text between your iPhone and computer, but you’re not willing to shell out $99 for a MobileMe subscription and you’re not really keen on something like Evernote? No worries: email drafts will do the trick in a pinch.

The AppleBlog’s Mark Crump came up with a simple method for syncing and editing text between his computers and his iPhone using Gmail. The trick: Type up your text as a draft on either the iPhone or in the web interface and ta da! Gmail does the rest by keeping the two synced allowing for fully editable text.

This could be handy for quick on-the-go drafts or to-do lists and could be particularly handy if combined with a Gmail GTD system.

What’s your preferred method of text syncing between your iPhone (or other smartphone) and your computers? How well does it work? Let’s hear about it in the comments.





WP Like Button Plugin by Free WordPress Templates