Archive for November, 2007
The happy developer
Tagged as GeneralI thought I’d take a moment to share some details about the Mindscape working environment – I enjoy sharing the details in the hope that comments will be left with new and interesting ideas about how other developers are aided in working efficiently and effectively in their workplaces. We are big on continuous improvement and think discussion about this topic helps everyone.
The Kit
First and foremost, Mindscape staff get to pick their machines. We believe the bond between a geek and their machine is a sacred one and shouldn’t be decided for them arbitrarily. For example, recently Ivan Towlson joined the Mindscape team and requested a beefy laptop with 4GB of RAM so that he could travel around and still run big virtual machines when he needed to. No problem – a happy developer is an effective developer – we ordered him a MacBook Pro with 4GB of memory.
Further to this, all members of the team also get large 22″ wide screen monitors as it’s well known that two monitors + large display areas help developers work more efficiently.

The kit however does extend beyond just the machine you use and includes things like your chair. We extend the same courtesy of allowing developers to pick a chair that they like and we order it for them. A comfortable developer is an effective developer. Now, we don’t go overboard – nobody has a $900 dollar chair from the .com bubble days, but it is our way of showing that we appreciate everyone and want to foster the best environment we can.
The Telmann
When we founded Mindscape we decided we needed a drinks fridge. This is somewhat common amongst tech companies and we went online hunting for something small yet effective. What we found was “The Telmann”, the fridge to end all fridges and an absolute asset to the company on a hot day. Telmann is the brand of fridge and hence the name :)
As a side note, when we first acquired the The Telmann we decided we should turn the temperature down just a little so our drinks would cool faster. That’s when we learnt that the Telmann had teath as it promptly ate one of our cans of Coke Zero:

Keep in mind that this is a fridge, not a freezer :)
We endeavor to provide whatever drinks are required by staff to keep everyone happy – we have everything from coke to grapefruit juice, to protein shakes.
That’s two things we do to try and create a happy working environment. What are two things from your work environment that make it a happy place to be?
John-Daniel
What’s coming in LightSpeed 1.2
Tagged as LightSpeedWith LightSpeed 1.1 freshly baked we have been working away hard on the next release for your coding pleasure. Previously we have been rather tight lipped about the upcoming additions and changes however as we move to tighter release cycles we believe it’s important to keep people up to date on our changes.
Lazy Loaded Values
Previous versions of LightSpeed supported both eager and lazy loaded associations (lazy by default) however in LightSpeed 1.2 you’ll also be able to mark up a simple field or _ValueObject_ as being lazy by default.
Lazy loaded simple field:
[EagerLoad(AggregateName = "Detail")] private byte[] _data;
Lazy loaded value object example:
[ValueObject] [EagerLoad(AggregateName = "Detail")] private Resolution _resolution;
We integrated this new functionality into our _Named Aggregate_ system which is why the aggregate names are specified. The fields above are now lazy-loaded unless we explicitly request the “Detail” aggregate.
Tidier properties
We’ve made some progress on reducing the code footprint of properties by removing the need to specify the name of the property in your entity classes. This resolves the issue of renaming the property and forgetting to update the string name of the property being passed to the Set() method, not to mention reducing the amount of code you need to maintain which is always a good thing!
LightSpeed 1.1 property example:
public DateTime AddedOn { get { return _addedOn; } set { Set(ref _addedOn, value, "AddedOn"); } }
LightSpeed 1.2 property example:
public DateTime AddedOn { get { return _addedOn; } set { Set(ref _addedOn, value); } }
Big thanks goes to John Rusk who provided some of the thinking around how this change could be implemented.
Projections
We now provide some simple support for projections like so:
Query query = new Query(typeof(Contribution)); query.Order = Order.By("Title"); query.Page = Page.At(3, 5); query.Projection.Add("Id"); query.Projection.Add("Description"); using (IDataReader reader = Repository.Project(query)) { // work with Id and Description }
Auto-increment identities for PostgreSQL, MySQL & SQLite
Previously LightSpeed only supported auto-incrementing identities for SQL Server however we’ve extended this functionality to PostgreSQL, MySQL and SQLite for developers working with those databases. We still suggest that developers should use other identity generation methods as highlighted in this earlier post about how LightSpeed handles identity generation.
Try it now?
Most of these additions are already available in the nightly builds of LightSpeed. If you’re interested in trying a nightly build I suggest that you read our previous post about the availability of nightly builds.
Feedback?
LightSpeed is upgraded and changed based on the feedback that we get from our users. If there is something you think would make LightSpeed better or you would simply like some more information then drop a comment as feedback on this post.
John-Daniel
Nightly builds now available
Last week we quietly added the ability to download nightly builds of LightSpeed to the website for everyone to access. We have done this for two reasons:
- We’re geeks too, we know people like to play with cool new cutting edge stuff
- Occasionally you might find a bug that we have fixed in a nightly build
Not yet a customer?
The Express Edition of LightSpeed is always available for free to users.
Click here to go to the LightSpeed Express nightly builds
Existing customers
We always try to keep adding value to product offering for our customers who have purchased licenses and this announcement is no different. If you have purchases a Standard, Professional or Enterprise license you can log into the store and see the nightly builds of your specific license. This means that customers do not need to be restricted by the Express nightly build.
Click here to go to the store to see your nightly builds
Note: Nightly builds are useful for testing and exploring new features. It is advised that you use the major release versions for production systems. Support for nightly builds is provided online via the online forums however we do not provide the same commercial support arrangements to nightly builds. Use them at your own risk!
John-Daniel Trask
LightSpeed Enterprise Edition, including source code!
I’m pleased to announce that we have added additional benefits for customers who want to purchase LightSpeed Professional + Priority support. First off, we’ve changed the name to the “Enterprise Edition” to fit with the current naming standard. Second, customers who purchase this license will receive the source code to LightSpeed with their install.
What license is the source code under?
The source code falls under the license that ships with LightSpeed. The license is somewhat restrictive as LightSpeed is not an open source project and, in simple terms:
- Allows you to view the source code
- Allows you to modify the source code for your project
- If the source code is modified then Mindscape will not provide support for the custom LightSpeed implementation
- You cannot distribute, sub-license, lease, rent, loan or otherwise transfer the source.
- Note that this list does not express the exact terms and is not legally binding, check the license for more details!
We have made the source code available so that customers can reference the source code and have extra assurance that if they really need to alter something then they can.
Existing customers
All customers who had previously purchased LightSpeed Professional + Priority Support have been upgraded to the Enterprise Edition and can download it from their account in the online store.
Initial feedback to this addition has been great with one customer commenting that this was a “PHENOMENAL. Good stuff guys!”.
Your feedback matters
This change came about based on feedback from existing customers. We strive to ensure that we deliver a product that makes software development more enjoyable and to do that we need your feedback so keep it coming! :)
John-Daniel Trask
Data binding in WPF TreeListViews
Tagged as GeneralTreeViews with multiple columns are one of those things that come up again and again, and I’ve been looking at this as part of some work we’re doing with Windows Presentation Foundation. The classic proof of concept was posted by the Avalon team back when WPF was still called Avalon, but it doesn’t play nicely with WPF data binding. In the demo, the authors explicitly construct a bunch of TreeListViewItems in their XAML, which works fine; but if you try to databind the sample via the ItemsSource property, it all grinds to a halt. The top-level items come up fine, but they’re not expandable.
To see why, let’s back up a little. A WPF TreeView contains a collection of TreeViewItems. TreeViewItems are visual objects. So what actually happens when we databind a graph of “normal” objects to a TreeView’s ItemsSource property? Behind the scenes, the TreeView creates a TreeViewItem for each bound object, and uses the TreeView’s ItemTemplate to create content for that TreeViewItem. The ItemTemplate is of type HierarchicalDataTemplate, which has an ItemsSource property of its own. The TreeViewItem in turn creates child TreeViewItems from the ItemsSource.
But in the TreeListView demo, presentation is handled by a GridViewRowPresenter via the TreeListViewItem control template: there’s no need for an item-level data template. And without an item-level data template, there’s no ItemsSource property to tell the TreeListViewItem what to create on the “next level down.” How do we address this?
It turns out that, although it’s not needed and not used in presentation, we can still specify an ItemTemplate for the TreeView. This is a bit confusing, because the content of this template is completely ignored: the presentation is still handled entirely by the GridViewRowPresenter. In fact, the template can be completely empty. The only thing that matters is that the template exists, that it’s a HierarchicalDataTemplate and that its ItemsSource property is set. All it’s doing is giving the WPF data binding infrastructure somewhere to find the directions to the next level down.
Once you do this, you can databind to the sample TreeListView control just as to any TreeView.
UPDATE: Mindscape WPF Elements includes a TreeListView control (mysteriously renamed the MulticolumnTreeView) which provides full support for databinding as well as a simpler, more encapulated API. Check it out or download the trial.
Categories
BrainDump (1)
Community Code (4)
Events (15)
F# (11)
General (50)
Lab Samples (2)
LightSpeed (249)
MegaPack (7)
News (68)
NHibernate Designer (18)
Nightly news (40)
Phone Elements (22)
Products (87)
Projects (5)
Screencast (6)
SharePoint (3)
Silverlight (14)
Silverlight Elements (59)
SimpleDB Management Tools (20)
Visual Studio (9)
VS File Explorer (7)
Web Workbench (20)
WPF (43)
WPF Diagrams (53)
WPF Elements (91)
WPF Property Grid (32)



Posted by John-Daniel Trask on 29 November 2007


