SITE == DEPRECATED
This site is deprecated: in other words, I’m not posting here anymore, feel free to use what you find but I won’t be maintaining it or posting here any longer. I’m sorry if some of the downloads and samples aren’t available, you can read my post from December 2011 (not coincidentally the last time I posted here) which explains a bit of the ugly story.
You can read about why I made this change and I hope you’ll follow my new adventures at http://joelcochran.com (no WWW, which still directs to this site for the time being). As always, I thank you for reading.
Happy Anniversary: back from the dead edition
DevelopingFor.net started in December of 2006 as a way for me to archive code samples, bug fixes, and other items of interest. We created the site on an old machine that was literally just lying around. Using LAMP and WordPress it was quick and easy to deploy and before you knew it a blog was born.
Death of a server
Fast forward 5 years and the site was still self-hosted on the same equipment that was old when we started. I started noticing intermittent issues like dropped connections to the MySQL server, random reboots, web server crashes, you know little things like that. I realized I should move the site but I kept putting it off in favor of happier pursuits. After all, Linux never dies, right? Well, Linux may never die but hardware certainly does.
Does the term “catastrophic server failure” mean anything to you? It does to me, at least now. Both the CPU fan and the server fan quit working. No idea when these things happened but one or the other is most likely responsible for the weird issues. When both failed it was sayonara server. We tried replacing the fans but it was too late: either the CPU or the motherboard is fried and we have a DNR order on file. Goodbye server.
Surely you have a backup?
As a matter of fact, I do. Many of them. I’ve been faithfully using a backup utility in WordPress, running it after every blog post. A copy is stored on the server, on my laptop, on my portable hard drive, and in DropBox. I also have backups of all the images, code libraries, and the custom DevelopingFor theme I created. Verily verily, I say, I HAVE backups.
Knowing that I had all these backups made it easier to ignore the hardware because I knew I could recover if the worst ever happened. It wasn’t until that “if” became “did” that I realized I was still not properly prepared.
I have come to the decision over the years that self-hosting is a poor choice: I needed to find a hosted solution. I won’t enumerate all the moving parts in this decision, but the fastest way for me to get the blog up and running again was to host it on WordPress.com. I created the necessary account, set up the blog and went to import the backup. That’s when I learned that the backup utility was not what I should have been using.
When is a Backup not a Backup?
Somewhere along the way, WordPress created a custom import/export based on the RSS XML spec called WXR. Instead of the old backup utility, which backs up the MySQL database into a .sql file, I should have been using the built in Export tool. Had I done so, the site would have been back up in a matter of hours instead of days. I toyed with a few options, including writing a WordPress MySQL to BlogML converter so I could import to Orchard. I may continue down that path, but I ran into issues on my hosted account getting Orchard to work properly (a topic for another time).
Ultimately, I appealed to WordPress.com directly. They took pity on me and converted my .sql backup file to a WXR file. It took about a week overall but I was finally able to import the old posts into the site this morning. The good news is it’s back from the dead. The bad news is there are going to be some changes around here.
Moving forward
The resurrection has left some changes that will take me some time to work through and some that will probably never be fixed. The biggest issue at the moment is that any screen shots or images they have most likely will be showing the big red ‘X’. This is because I was previously FTP’ing the images directly to the site, so they have path references that no longer exist. As I find them I will try to correct them, but the law of diminishing returns inclines me to think it’s not worth the effort.
The second big deal is I can not import my custom theme since the site is now on WordPress.com. A new look is fine, but it means I’ll have to put in some time to recreate some of the navigation and shortcuts that were there before. All in all the important stuff should work but there may be issues with some of the links as I sort through this conversion.
Lessons learned
Every tragedy is a learning experience. In the immortal words of Dr. Frankenstein, “It is ALIVE!” There’s breath in the old girl yet. That being said this occurrence has forced me to come to grips with a couple of issues. First, I need to be more proactive: had I paid more attention I could have prevented this by transitioning before the failure. Second, I need to do some succession planning, so to speak. Third, I realize I’m not happy with my web presence overall: it’s time to make some changes. Finally, I need to gain more comfort and familiarity with hosting solutions and environments, at least until Azure has a free edition.
Oh, and when you make a backup, be sure it is really a backup.
Working with Wijmo expanders and jQuery
My current project has me back in the world of web development, something I haven’t done seriously in a few years. This has been great because I’m getting to refresh my skills and get caught up with all the latest ASP.NET MVC 3 + Razor goodness. Throw in the fact that we’re running the project on Azure, something else I hope to post about soon, and I am knee deep in learning new stuff!
I’ve been a fan of jQuery for sometime because, frankly, I really detest working in Javascript. As my buddy Kevin Griffin is fond of saying “jQuery makes Javascript not suck.” I’ve also been listening to him and Rich Dudley (both of ComponentOne) talk about Wijmo for a while now so I figured this would be a great opportunity to try it out.
What is Wijmo?
From the Wijmo website:
Wijmo is a complete kit of over 30 UI widgets with everything from interactive menus to rich charts. If you know jQuery, you know Wijmo.
Wijmo uses a combination of the jQuery UI widget factory and CSS to create some very nice UI widgets. Wijmo is open source and there are both free and commercial licensing options available. ComponentOne has done a great job putting together some great demos complete with source code samples, called the Wijmo widget explorer. If you are creating interactive web sites I would definitely recommend you check it out.
Creating a Wijmo expander
Using the Wijmo Expander is very simple. Inside a div element with an id, create an h3 that defines the header text and another div that holds the content.
<div id="myexpander"> <h3>Expander Title</h3> <div> Expander contents go here </div> </div>
We then add some jQuery that references the id and turns it into a Wijmo Expander:
$(function() { $("#myExpander").wijexpander({ expanded: false }); }
This will turn the rather vanilla HTML into a very nice expander UI element. Setting expanded to false will automatically collapse the expander, you could of course use true to automatically expand it. As you can see, Wijmo really makes the task very simple!
Working with the expander in jQuery
My page design included a dynamic series of expanders that are all collapsed by default. The application could easily produce many expanders, each holding large amounts of information, so I wanted to add “expand all” and “collapse all” options. I added a couple of anchor tags with ids for this purpose and some jQuery to process the click events:
$("#expandAll").click(function () { CODE GOES HERE }); $("#collapseAll").click(function () { CODE GOES HERE });
It was at this point that I realized I had no idea how to dynamically expand or collapse the expanders. Since Wijmo is open source, I opened up the JS file (~/wijmo-open/development-bundle/wijmo/jquery.wijmo.wijexpander.js)for the expander and learned that the widget exposes two public methods: “expand” and “collapse”. That was just what the doctor ordered to dynamically expand or collapse the widget:
// to expand $("#myExpander").wijexpander("expand"); // to collapse $("#myExpander").wijexpander("collapse");
Dynamic widget selection in jQuery
Since my application has an unknown list of expanders at design time I needed to be able to dynamically select all of the expanders. Back in the JS file is a “_create” function that uses jQuery to dynamically add several classes, the first of which is “.wijmo-wijexpander”. (I missed it the first time around, so thanks to Rich Dudley at C1 for helping me sort that one out.)
Heading back to our expandAll and collapseAll functions, we can now use jQuery to select all of the expanders and pipe them to “.each” to perform the action:
$("#expandAll").click(function () { $(".wijmo-wijexpander").each( function() { $(this).wijexpander("expand"); } ); }); $("#collapseAll").click(function () { $(".wijmo-wijexpander").each( function() { $(this).wijexpander("collapse"); } ); });
Sure enough, that did the trick! My unconfirmed guess is that this formula should work for all the widgets.
Lessons learned
First, I learned that I made a good choice with Wijmo: it is easy to use and produces great results. I also learned that, as I suspected, I can write plenty of my own jQuery to work with the widgets. Finally, I learned that the supplied code is pretty good documentation in its own right.
Have you used Wijmo for a project? If so, add a comment and let me know what you think.
Until next time, happy coding!
Joining the ComponentOne Speaker Bureau
I am pleased to announce that I have joined the ComponentOne Speaker Bureau. The other current members of the bureau include Dane Morgridge, John Baird, and Michael Eaton.
The bureau is one way that ComponentOne gives back to the community by helping to sponsor a few speakers in our community efforts. This makes it possible for us to travel a bit more and reach more people.
My thanks to ComponentOne for supporting the community and for putting their faith in me personally. When you see them out and about, be sure to thank them yourself!
Becoming a Windows Phone 7 Developer
I have a confession to make: I have never built a Windows Phone 7 application. As a Blend and WPF guy who dabbles more and more in Silverlight, this may shock you, but time and work (not enough of the former and too much of the latter) have thus far prevented me from doing more than Hello World. Of course it does not help that stinkin’ Verizon does not yet have WP7, but hopefully that issue will work itself out soon.
Since I’ve committed to writing an Appendix for Blend in Action that focuses on Blend for WP7, I figure it’s about time I got on the bandwagon and did some WP7 development.
Where I’m starting from
Since I already have Visual Studio and Expression Blend installed, all I needed to begin developing was to download and install the Windows Phone Developer Tools. This includes the Emulator and necessary WP7 project types. If you do not have Visual Studio or Blend on your machine, the free tools are part of this install.
Create an App Hub account
Since I plan to create and publish real applications I went ahead and created an AppHub account. There are a few things you should know before you get started. First, it costs $99 up front, so be prepared to pay it when you create your account. Second, you must have a Live ID. Third, you cannot create the account without a website URL. While this may seem trivial, it threw me off because I have not set up the website I intend to use for my Phone Apps yet. I went ahead and used this site with the expectation that I can change it later.
The next thing that I did not expect was the requirement for a Gamer tag. I am not a gamer, I do not own an XBox, and I’m not entirely sure what a Gamer tag is, so naturally I did not have one to supply. I got stuck on the required gamer tag screen for a little while until I found one I wanted that wasn’t taken (theblendguy).
The last thing that threw me for a loop was that as you are filling in the forms, all the copy is heavily XBox Live oriented. Once I got past the start screen, everything I read about the App Hub account was about XBox: there was no mention of Windows Phone 7. I thought about cancelling to make sure I had made the right selections but decided to stick to my guns, especially once I saw the price was correct. Sure enough, when all was said and done I had the proper account.
I received a confirmation email and completed the account. As I understand it, the next step is for Geotrust to contact me and verify I am who I say I am. I love the fact that Microsoft is putting so much effort into verifying accounts and applications: in the long run it should mean a stable of quality apps, which the platform needs if it is going to thrive.
The next step
The next thing will be application development. I have a couple in mind already. I plan to write about my experiences as I go along, so keep watching this space.
UPDATE, 13 Apr 2011:
The day after I created my account I received an email from Geotrust directing me to another site where I had to confirm my identity. Right off the bat, be prepared for some seemingly intrusive questions. I had to give them my social security number and optionally my driver’s license number as well as some lesser info such as birth date and address. Also, if you have been at your current address for less than two years you must supply the previous address.
This information is the first step. Once you pass this stage, a second page comes up with a set of specific financial questions that theoretically only you should be able to answer. I received questions about my mortgage and car payment, including a couple of trick questions. The answers are multiple choice, so you are not providing them any specifics, and it doesn’t matter because it seems they know it all already anyway.
Naturally, this was all done over HTTPS, so I wasn’t any more worried about security than I am when I use my credit card online. I was pretty amazed though at the BI that must be in place to develop the trick questions I mentioned. (And no, I’m not going to be any more specific). Overall the process was not onerous: I passed the verification and at this point I’m just waiting for my AppHub developer ID. I’ll keep you all posted.
UPDATE 2, 13 Apr 2011:
Well, that didn’t take too long: waiting in my inbox after lunch was the following email:
Now that I’m official I can start developing and submitting apps. Stay tuned!
Philly Code Camp 2011.1
As I come to work this morning I recognize all the signs that Spring is officially upon us: I did not wear a jacket to work this morning, The Masters is over, and this weekend was the first installment of Philly Code Camp 2011. While I sacrificed being able to watch The Masters live to attend Code Camp this weekend, I was able to see it all thanks to the magic of DVR.
As always, Philly Code Camp was fantastic: the Philly team is constantly setting the bar higher and higher and this time was no exception. I can only imagine the logistical nightmare of organizing and executing a code camp with almost 600 attendees, but these guys pull it off with flying colors!
Have you never been to a code camp? Are you wondering what all the fuss is about? Check out this video posted on YouTube asking folks why they attend. Then, get off your duff and find one close to you and sign up!
Practical MVVM
I had a full house for my session “Practical MVVM” and I truly appreciate the attendees: thanks for the nice notes and comments, if it helped you then it was all worthwhile. If you saw it, please post a review at SpeakerWiki. And remember you can download the Artifacts at http://practicalmvvm.com.
Chapter 4: Container Driven Design – understanding layout
The MEAP for Expression Blend in Action was updated yesterday to include Chapter 4, “Container Driven Design – understanding layout”. In the chapter I explain the methods I use to layout applications. There is a deep discussion on mastering the Grid container and heavy focus on making child elements greedy.
If you haven’t purchased the book yet, you can use discount code exblend40 to get 40% off, but don’t tell anyone! 🙂
For those of you who have written a book before I’m sure you understand the dearth of articles on the blog of late. It’s hard to imagine just how much work goes into a book length work. And no matter how many people tell you that ahead of time, you still aren’t prepared for it! The good news is that we are really in the thick of it now and things are going very well. My sincerest thanks to all the friends and supporters of the book, please enjoy the newest chapter with my compliments!
Expression Blend in Action MEAP begun
Hi folks! Last week while I was attending the MVP Summit, the MEAP for my upcoming Manning Publication title “Expression Blend in Action” was launched. If you aren’t familiar with MEAP, it is a great program that Manning does where you can purchase the book and receive the chapters as they are written. You can then provide feedback and participate in the book forum: YOU can influence the content and quality of the book! Plus you don’t have to wait for the whole thing to be printed – it’s a win win all around.
As a special offer, between now and April 1st, you can get 50% OFF by using the following discount code: exblend50. Feel free to spread this around, but remember it’s only good in March, so don’t miss it!
I’m obviously doing a lot of writing for the book, so my blog is suffering, but I will keep you posted here regarding updates. If you’ve already bought it I sincerely thank you for all your support! If you haven’t picked it up yet, what are you waiting for? 🙂
Vote for my presentations at MIX!
Hi friends!
Two of my sessions made the Open Call to present at MIX in April. MIX presenters are primarily Microsofties but they include 10 presentations from community folks like me. These are selected by public vote: the top 10 vote getters will have the chance to present at MIX. This is my dream event so I’m hoping I can get enough votes to go, and that’s where you come in!
Would you please consider voting for my presentations? It only takes a moment and I would really appreciate it. Voting pages for the two sessions are here:
http://live.visitmix.com/OpenCall/Vote/Session/31 – Expression Blend and the Visual State Manager: A Deep Dive
http://live.visitmix.com/OpenCall/Vote/Session/32 – Container Driven Design with Blend
Thank you so much for your help and I hope to see you at MIX!
Announcing BlendSIG
About BlendSIG
I am happy today to officially announce and launch BlendSIG, a Virtual Blend Special Interest Group. Inspired by LiDNUG (the LinkedIn .NET User Group) BlendSIG meetings are held online during working hours using LiveMeeting. We hope that this will allow people from all over the world to join in and learn more about Blend.
We will host monthly meetings on the 2nd Wednesday of each month at 2pm EST. These meetings will be LiveMeeting screen casts. Guests and presenters will be Blend professionals, such as members of the Microsoft Blend team, Blend MVPs, authors, and other knowledgeable parties.
Join the BlendSIG Group at http://blendsig.groups.live.com. Members of this group will receive notifications of events and interact with each other through the mailing list. We also would like to encourage members to suggest topics and speakers. Please join today!
You can also follow BlendSIG on Twitter: @blendsig.
The Inaugural Meeting
Our first meeting will be January 12, 2011, and I am happy to announce that Dante Gagne, Blend PM, will be our inaugural speaker. Dante will be presenting on Behaviors and I’m really looking forward to it!
Registration for the January meeting is now live and available at http://www.eventbrite.com/event/1114544633
Please share this information with your user groups, companies, and interested parties. I think together we could make this a rousing success!