Archive

Author Archive

How the Atlassian Acquisition of Bitbucket Changes Things

September 29, 2010 1 comment

A while back I posted about selecting and implementing a source control system for Project Greenfield.  I outlined how I came to the decision to use Mercurial (Hg) and so far I have been very pleased with my decision.

One of the key factors in my decision was Bitbucket, an online repository service that I am using as a central source control server.  The original free service came with a single private repository, not exactly ideal for an ISV, so I purchased an account that gave me a handful of private repositories and more storage space.  At a few dollars a month the price was more than reasonable.

Yesterday, however, they announced that Bitbucket has been acquired by Atlassian, a development and tooling company.  Naturally, I was immediately concerned, but this turns out to be really good news.

What’s Changed

The most important change is this: small accounts like mine are now free.

Bitbucket’s pricing scheme was based on the number of private repositories and storage space, but under Atlassian the pricing is all about users.  An entry level account is for 5 users and includes unlimited public and private repositories with unlimited storage space.

According to the website, a user is defined as “Someone with read or write access to one of your private repositories.”  This means that most small development shops won’t have to pay anything.  I think that is just awesome.

What if I’m not so small?

Another great bit (pun intended) of news is that the price for pay accounts is very small. A 10 user account is only $10/month, 25 users is $20/month, 50 users is $40/month, and for $80/month you can have unlimited users.  Again, this includes unlimited private repositories and unlimited storage space.  In my mind those prices are great regardless of your team size.  They also have an introductory offer: if you sign up for a 10user account before Oct. 3rd your first year will be free.

How does this affect Open Source projects?

Since users are only counted for private repositories, you can have unlimited users on public repositories.  This means you should be able to manage any open source project on the standard free 5 users account.

What about Github?

This change got me thinking about Github.  When I was selecting a DVCS I almost chose Git because of Github even though everything else had me leaning towards Mercurial.  In my research it seemed people were more fanatical about Github than Git itself and I really wanted hosted repositories.  In the end it was finding Bitbucket that finalized my choice.

The only reason I even bring this up is I wonder if this will be a game changer for Github.  When I signed up, Bitbucket and Github prices were practically identical.  Will people researching DVCS begin choosing Hg over Git because Bitbucket is now free?  Github pricing is still based on the number of private repositories, will it change its pricing model? 

Github already has unlimited free public repositories and “collaborators”, so I don’t see this affecting the open source crowd.  And I certainly don’t think people will be switching from Git to Hg because of this: it’s the new adopters I’m curious about.  It just seems to me that Github will have to do something to respond to this: I’ll be curious to see how it plays out.

Categories: News, Source Control

A Centered and Resizable Text Header

September 27, 2010 4 comments

Tweeted by @Pete_Brown recently:

Attention WPF (and SL4) Devs: Get back to blogging. You’re getting lost in the amazing amount of #wp7dev content 🙂

Well, when Pete says “Jump!”… I’ve actually been meaning to post this for a few months, so thanks to Pete for giving me a push 🙂

The Problem

A friend of mine is learning Silverlight and in prototyping a simple app he wanted to just use a TextBlock for his header.  When the application has a fixed size, it works fine, but when the size is flexible he ran into one of the issues with TextBlock: it doesn’t resize or scale.  When you set the properties for a TextBlock, you set the size of the font and it never changes.

Here is the default layout we are discussing:

image1

And here it is expanded to full screen on a large resolution:

image2

The text stays centered, but the size stays static.  It makes the header seem small and out of proportion.  And similarly when the window is much smaller the text seems too large and out of proportion.  If you get extreme you can even see some weird results:

image3

Some Ideas

One way to solve this would be to listen to the UserControl’s SizeChanged event and do some math to calculate the new FontSize, but that just feels so WinForm. I’d much rather find a way to do this without code behind.

You could try to bind the FontSize of the TextBlock to a property in the ViewModel, but you still have to find a way to trigger the action.  If you bound the UserControl width and height to the ViewModel you could have its Set method raise the PropertyChanged event for the FontSize property.  And of course, you’d still have to write all the code to calculate it, which I’m sure would include measuring the text, calculating buffer zones and margins, etc.

These are just ideas, I haven’t tried either approach.  You may find a situation where you need to do one of these things or come up with something different, but honestly, these ideas just somehow feel wrong in a XAML world.  In this particular case, where the Text is static, I have a better solution.

Convert Text To A Path

The solution starts with taking advantage of the vector graphic nature of XAML. While Text may not expand and contract as desired, a Path certainly will, so the first step is to convert the Text to a Path.

In Blend, select the TextBlock item and right click, select Path –> Convert to Path (or go to Object –> Path –> Convert to Path).  This will convert the text into a Path object (outlined in Red in the screen shot below).  You’ll also notice the Horizontal and Vertical alignments have both been changed to Stretch and the Margins have been set (outlined in Yellow).

image4

If you reset the Margins to 0, you will see the Text take up the entire space.  If you change both the alignments to Center it will look OK in Blend, but when you execute the application you’ll see we actually get the same behavior as the Stretch.  This is because of Width and Height are set to Auto, which is what we want: if we set these to fixed sizes we are right back where we started.

The good news is that if you resize the window now, either bigger or smaller, you’ll see the header resize itself, so we must be on the right track!

image5

Margins and Proportions

At least in this case, we don’t want the text bumping up against the edges of its Border: it’s distracting and not very clean.  Instead, we’d like a little space surrounding it on all sides. 

You might be thinking “No big deal, I’ll just add a Margin” and you wouldn’t be totally wrong.  The problem is that hard coding the Margin, like hard coding the Text’s FontSize, means it can never change.  So a Margin that looks good when the window is small doesn’t necessarily look good when the window is large. 

What we want is the effect of a Margin, but we want that Margin to be proportional to the available space.  We really can’t solve this with the Margin property, at least not without a lot of work and calculation, which I’m just too lazy to figure out.  So the real solution is not Margins, or even in the Text (now Path) itself: the real solution is in Layout.

Solving the Problem Using Layout

One of the things I see developers new to XAML struggling with is the power of layout.  I’ve started labeling my approach “Container Driven Design” which really relies on the containers to manage the size and spacing of it’s child elements.  It frequently involves nested containers, which is what we are going to use to solve this problem.

What we really want is for our Margins to float and resize in proportion to their parent container.  Fortunately we have a container type built in that is perfect for this: the Grid.  With a Grid, we can specify percentage based sized rows and columns.  (NOTE: Yes, I know they are not *really* percentage based, but an explanation of the Star system is beyond the scope of this article.)

So to solve this problem using layout we are going to wrap our header in a 9-celled Grid: three rows and three columns, with the center cell holding our header.  Right click the Path and select Group Into –> Grid.  If you look at your Objects and Timelines panel you will see the Path is now the child of a Grid:

image6

With Grid selected, you can use the blue bars along the top and left to position the rows and columns:

image7

While I avoid editing XAML, there are a few times that it is simply faster and easier: editing Grid row and column sizes is one of those times.  In the screen shot below, you’ll see that I’ve effectively created floating margins by defining star sizes for the top and bottom rows and right and left columns.  The center row and center column have no size definition, so they will take up the remaining available space.

image8

Execute this and you’ll find that as you resize the window the margins will resize themselves proportionally, the text will remain nicely centered and will also resize itself proportionally.

image9

Wrapping it Up

So there are a couple of lessons I would want you to take away from this exercise.  First, the problem we were having was with static text, so we solved that by turning that text into something else.  We found a graphical solution to our graphical problem! 

Second, we had a problem with Margins, so we used grid rows and columns instead of the Margin property.  We solved that issue by relying on a Layout Container instead of a single property.

In both cases, we found simple and elegant solutions by thinking outside the box.  I’ll grant that this example is not overly complex, but it does illustrate the power of XAML to solve design problems.  And of course, a chance to play around in Blend is always welcome!

Categories: .NET

Project Greenfield: Learning SSIS

September 17, 2010 Comments off

While Expression Blend remains my favorite tool and Visual Studio my most productive tool (with a little R# love), Sql Server Integration Services (SSIS) has moved solidly into the #3 slot. 

I frequently have tasks that require me to move data from one location to another, perform conversions and transformations, create new tables with the resulting columns, etc.  In the past, this meant a lot of ADO.NET and a lot of coding.  These processes can be exceedingly slow and time consuming to produce and the performance is frequently less than desirable.  With what I’ve learned about SSIS, most of that work will be a thing of the past.  I can now do conversion work in a fraction of the time it took before and the resulting product, a Package in SSIS lingo, can execute in far less time.

It seems that SSIS is thought of as a DBA’s tool, but I believe that as Blend is not just for Designers, SSIS is not just for DBAs.  This post is not going to be a how to or any kind of definitive work: what I want to accomplish is to introduce my fellow developers to the glory of SSIS and highlight some of the reasons I think you should be learning this technology.

Project Greenfield and SSIS

For Project Greenfield, one of the primary tasks is to convert data from the legacy IBM *insert nom du jour here* midrange server database to the new Sql Server database. 

This is far more than pushing data from once place to another: the structure is completely different.  Relationships are defined now that previously were unenforced and large tables are broken into dozens of smaller, more normalized tables, often in different schemas.  Fields that were previously fixed length and Numeric types are now varchars and ints.  In some cases single fields have been broken into multiple fields, and in some cases multiple fields have been combined.  In all cases, data coming out is Unicode but is being stored as ANSI.

Obviously, this conversion represents a significant body of work in its own right.  One of my recent tasks was to provide enough of a conversion that I could start prototyping (fake data just wasn’t what we wanted.) The amount of work I was able to do in a week would have easily taken over a month to write using ADO.NET.  And best of all, now that I have a solid framework in place making changes is very easy.

Getting Started with SSIS

In order to start with SSIS, you will have to have it installed.  More accurately, you will need the SQL Server Business Intelligence Development Studio installed, also known as BIDS.  This is found as an option when installing SQL Server and I’m pretty sure it is not available below SQL Server Standard

The current version of BIDS runs in Visual Studio 2008.  If you already have VS2008 installed you will find a new Project Type category called Business Intelligence Projects added to your existing install.  If you do not have VS2008 BIDS will install a Visual Studio 2008 Shell, even if you have VS2010 installed.

To start a new project, select the Business Intelligence Projects category and Integration Services Project in the create new project dialog.  Once it is created, opening it and working with it is basically the same as any other solution.

Work Flow in SSIS

BIDS itself is the first application I’ve seen that serves as a compelling example of a Workflow driven application. The Package Designer workspace is organized in tabs, the only two of which I’ve needed so far are Control Flow and Data Flow.

All tasks are defined as compartmentalized units of work.  The visual blocks for those are all shown in the Control Flow tab.  These tasks may or may not be grouped into containers such as Sequence Container or Foreach Loop Container.  You may define as many containers as necessary to organize the Package.  So far I have preferred Sequence Containers as they allow me to organize tasks procedurally.  Except for the simplest Package, I would not define tasks outside of containers.

There are many different task types available, but I have only needed three so far: Data Flow Task, Execute SQL Task, and Script Task.  And now that I have better knowledge of what I am doing, I could get by without the Execute SQL Task.

Data Flow Task

At the heart of SSIS is the Data Flow Task.  The basic formula is this: read data from a data source, manipulate/transform that data, then write the transformed data to the target destination.  Data sources can be ADO.NET or OLE DB database connections but can also be Excel, Flat, or XML Files.  There are even more options for Target Destinations.

In between the source and the target are the Data Flow Transformations which really represent the power of SSIS.  Here is a brief list of the transformations I have so far found most useful.

Conditional Split – Evaluates the data in the current columns and creates logical subsets which can then be handled differently.  Each subset effectively becomes it’s own data source at that point.

Derived Column – In my mind, the most important transformation of the bunch: derived columns are the new (or replacement) columns built by converting or transforming the source data.  SSIS includes a highly evolved “Expression Language” that is used to convert the data at runtime.  String manipulation, type conversion, mathematical operations, and much more are all supported. 

Lookup – Second in importance only to Derived Column, this transformation allows you to perform lookup actions against other tables.  This is essential for preventing invalid foreign key insertion.  It also is great for performing Incremental Loads: basically, this means only inserting records into the database if they don’t already exist.  This becomes important for several reasons, the least of which not being that I want to be able to execute the Package as often as possible, especially during development.

Multicast – Multicast creates multiple copies of the current data set, so you can perform multiple writes to multiple destinations.

The Script Task

The Script task allows you to write code to do things.  Primarily I have used this to work with package variables, a whole topic in its own right, and for making OLE DB connections dynamic.  I see substantial potential in the Script Task though as it really opens up the entire .NET Framework to the process.

Final Thoughts

Obviously, this barely scratches the surface of SSIS.  BIDS is primarily a graphic tool, but there are distinct functions that developers could really leverage.  The other place where developers could shine in SSIS is in process flow: once I understood things like Sequence Container and Conditional Split I really felt like I could make SSIS sing.  This kind of flow is exactly what we code day in and day out, so I think developers can pick up SSIS quickly.

I may write some more about SSIS going forward, but if you are interested and looking for info now I recommend you check out Andy Leonard’s blog.

Book Review: .NET Compact Framework 3.5 Data-Driven Applications

August 18, 2010 Comments off

In 2005 and 2006 I did a significant amount of Compact Framework development for my company.  I wrote a very large, intensely data-driven application for field workers to confirm and collect real estate assessment data.  We used SqlServerCE on the device (and later tried SqlLite), and ultimately the data had to sync back to an existing database on the AS/400.  This was a real mother of a project and ate up almost a year of development time, largely because there was very little real help available.

I just got done perusing Edmund Tan’s book .NET Compact Framework 3.5 Data-driven Applications and let me say I *really* could have used this book back then!  This is an extremely thorough coverage of the current Compact Framework for Windows Mobile 6.0.  The book walks the reader through developing a series of real world applications, which seems to be PACKT’s preferred style.  Unlike many books about Microsoft technologies, this one is not limited to Sql Server: the author gives Oracle Lite equal coverage throughout.

As the title suggests, this title is very data centric.  Data topics include building the data tier, parameterized queries, full-text searching, data synchronization, and more.  I would have killed for the guidance provided in the Performance and Packaging & Deployment chapters.  There are several other topics, like SMS and Security that are just icing on the cake.  As I said before, I would have loved this book 5 years ago.

It’s obvious Mr. Tan knows his topic well, the material is very accessible and well written.  If you have any Windows Mobile 6.0 or Compact Framework projects then I’m pretty confident there is something here for you.  The publisher has made the chapter on “Building Integrated Services” available for free, so you can download it and check it out for yourself.

Categories: Book Reviews

Blend-O-Rama Update

August 18, 2010 Comments off

Hi Folks!  Hard to believe it has been almost a month since the first ever Blend-O-Rama event!  I’ve gotten lots of questions about the videos and the website, so I wanted to put this together to give everyone an update.

The BOR Videos

When I wrote about the LiveMeeting experience, I failed to discuss recording the sessions.  Kevin recorded the sessions, but the videos themselves are really small.  I’m sure this is partly because I had to set my resolution to 1024×768 for LiveMeeting to display well, and partly to limit storage size.  The actual WMV files came out as 704×528 – like I said, they are small.

They are so small that on my 1600 monitor they are almost unreadable. They view acceptably at 1024×768, so I hate to recommend it but you may want to resize your display in order to watch the videos.  They will be available for download on the BOR site when it goes live.

I hate to make people wait any longer, so the good news is you can download them now in an all-in-one Zip file.

The BOR Website

I’m in the process of moving service providers, so the BOR website has been on hold while I get that set up.  I’m also hampered a little bit by my lack of ASP.NET experience.  Fortunately, I have friends who know a little something about all this stuff! I can happily report that I am about 98% there, with the help of Kevin Griffin and the great team at OrcsWeb.

I have a handful of videos already out there but many more to produce.  Most of the content from the BOR sessions will be available in a series of shorter videos.  I’ll also take suggestions and requests, so for now if you have any put them in the comments here. 

At any rate, progress has been made, albeit not as swiftly as I would have liked.  Such is my never ending story.  Thanks as always to all the supporters out there, you guys make it all worthwhile!

Categories: .NET

Richmond Code Camp 2010.2

August 6, 2010 Comments off

Hey folks! I just wanted to take a quick moment to announce that Richmond Code Camp 2010.2 has been scheduled and is only 2 months away!  On Oct. 9th,  .Net, SQL Server, SharePoint and other IT Professionals will once again converge on the J. Sargeant Reynolds Community College Massey campus in Richmond, VA, for one of the best Code Camps going.  RCC consistently gets rave reviews and I am proud to be associated with this event.

Registration is open now and there may be limited space available this time so don’t hesitate.  You can also click on the banner in the right sidebar –>

Ever thought about Speaking?

The call for speakers is also open but will close on September 10th.  Have you ever presented?  If not, would you like to?  Code Camps are the perfect venue for getting your feet wet.  Don’t get hung up on not being “an expert” at something.  I’ll tell you a secret: most of us aren’t! We are, however, passionate about the technology we use and we have a sincere desire to share our passions and help our fellow developers.  If that sounds like you, then you should give it a try, it is a truly rewarding experience.

For you Blend fans out there, I have submitted a couple of new talks for the event: Advanced Topics in Expression Blend and Expression Blend and the Visual State Manager: A Deep Dive. I’ll be sure to announce it if they get selected.

I hope to see you there!

Blend-O-Rama Redux

July 26, 2010 Comments off

In case you missed it, July 19-23rd we held the first ever Blend-O-Rama Event.  Hosted by HRNUG, moderated by Kevin Griffin (MVP and HRNUG President), and presented by yours truly, the event was a week of Lunch and Learn webcasts all about Expression Blend and presented over Microsoft Live Meeting.  This was the first event I’ve done of this type and scope, so I wanted to post my review of the event.

Lessons Learned: Live Meeting

This is my first time presenting over Live Meeting (LM), so I’ve definitely learned a few things. The experience itself is a little strange, and I feel disembodied not being able to see the attendees.  As a speaker, I frequently take cues from the audience: I can usually tell whether or not I need to reiterate something, or I can see that they get it and we can move on.  You’d be surprised how much you can get out of a few nodding heads!  Over LM, it’s just me staring at my screen and talking at the microphone, and I really miss the feedback.

We did some testing over LM before the event and intentionally slowed the pace down, but on Day 1 it wasn’t enough.  Day 2 was better and by Day 3 I’d say we had the pace just right.  One side effect is that I can’t cover as much material as I might with a live audience.  I also had to adjust the content I would usually share because Live Meeting has serious issues with things like gradients and animation. 

The hardest thing for me to get comfortable with was Context Switching.  I’m an Alt-Tab fanatic, my left hand is practically deformed from sitting in the Alt-Tab position.  In this case, I couldn’t use it because I took some advice from a friend of mine and did not share my entire desktop over Live Meeting.  This meant that I had to actively select the shared application every time I wanted to switch from one to another.  BTW – if you are a seasoned LM presenter, I’d love to hear how you handle this problem: post them in the comments below.

This also takes time and in the videos you will see a lot of “gray space” while I’m fumbling through the Live Meeting controls.  I found that narrating it helps: letting the attendees know what I’m doing not only helps them understand what they are seeing, it also helps fill the silence which made me feel like I wasn’t just sitting there all alone.

I’m really glad we did a test run using Live Meeting the week before with some unbiased attendees.  We also got some help from David Makogon who gave us some great tips for dealing with Live Meeting and also stepped in a couple of times to moderate when Kevin had other responsibilities.  The biggest lesson here is the Boy Scout Motto: Be Prepared.

Lessons Learned: The Event Itself

I also learned that this sort of commitment is tough.  While the presentations were “only” an hour and a half per day, the event really consumed my entire week.  I’ll admit to underestimating this when we set the event up, mostly because I had given the first 4 presentations many many times: only the last day contained new material.  The pressure I felt to deliver a quality event, however, made me spend all my free time prepping for the next day.

And it really bothered me when something went wrong, as it did nearly every day.  I try to joke about it, but nothing is more frustrating than something not working when other people are watching.  It’s especially tough when it’s something you’ve done a thousand times and for the life of you can’t figure out what’s wrong.  Lesson learned: Expect the Unexpected.

I haven’t done near as much in Silverlight as I have in WPF.  Usually that isn’t an issue, and in Blend it rarely causes a problem, but a few of the issues had to do with my lack of familiarity with Silverlight.  More specifically, I’m accustomed to doing things one way in WPF that I may have to do differently (or can’t do at all) in Silverlight.  In this case the point I was trying to illustrate was that Blend is essentially the same in both platforms, and I do think we succeeded there.

I also learned that I didn’t know as much as I thought I did.  I’ve never been afraid to say “I don’t know” during a presentation: it’s honest and fair.  But I haven’t had to say it so often as I did this week.  Some of the questions really stumped me: in fact, I said several times it was “Stump the Presenter” week.  While I wish I knew all the answers, I also appreciate the tough questions: it means the attendees were really paying attention and thinking about Blend.  What presenter could ask for more?

Day 1 – An Introduction to Blend

I watched the playback and realized I needed to go even slower: there were too many times when the speaking got ahead of the presentation, or when I could have hovered over an item longer to let the Tooltip show through.  I also learned that Gradients are a no-go.  If you watch the video they just show up as huge blocks of color.

Day 2 – Data Binding

They say every presentation has a glitch, and this one was no exception.  I ran into a problem near the end trying to bind a Grid’s DataContext to the SelectedItem of a ListBox.  I can’t tell you how many times I’ve done this, hundreds at least.  It is simple and straightforward… until today.  It just didn’t work and I tried it several times in different ways.  I finally cleared all the DataContexts and Bindings out of the details within the Grid and rebound the DataContext and finally everything worked.  I’m still not sure what the cause was, but I’m starting to think there was something left over from when I tested the Solution earlier that day.

Day 3 – Styling and Templating

I really think on this day we finally nailed the speed and delivery.  The only glitch that stands out in my mind was trying to get Smooth Scrolling to work in Silverlight.  Turns out this is one of those areas that just isn’t the same as WPF. The downside for me is that I feel I spent too much time trying to get it to work.

BTW, the solution is to go to the ItemsPanel Style and add a FluidMoveBehavior to the VirtualizingStackPanel.  Nifty trick!

Attendees: 98

Day 4 – Animations

So understanding that Gradients and things like that don’t work well over LM, I really wasn’t expecting much out of this session.  That being said, it turned out very well.  The Live Meeting video has some odd happenings between minutes 40 and 48, but the WMV file is just fine, so be sure to watch that.

Day 5 – Advanced Topics

By and far this was my favorite day.  As I said in the presentation, this stuff is just plain fun!  I think overall I was happiest with this presentation.  I’m sure some of that has to do with my growing familiarity with Live Meeting, but naturally just as I’m getting comfortable with the format we finish!  Based on the feedback, this one was as much a hit with the audience as it was with me, so  you can expect to see me presenting this one out on the road.

Conclusions

Overall, this was a great event.  I’ll admit, I was drained by the end of it, but the steady stream of thanks and nice messages from attendees tells me we did something worthwhile here.  So much so, in fact, that I think I’d like to have one s
ession a month on different topics. 

What are your thoughts?  Your suggestions and comments will determine what shape this takes going forward, so comment below, email, or Twitter (tag #BlendORama) and let us know what you think.

Thanks again to everyone who took part, and watch out soon for the launch of www.blend-o-rama.com.

Categories: .NET