It's fascinating how these concepts seem to be converging, I get the feeling I'm on the edge of being able to put it all together nicely, but I've not quite got there.
I've been trying to put together a set of patterns for building our GUI applications data models using immutable data types with functional updates and structural sharing, as a way of getting Undo capabilities for 'free'. (Treat the data structure as a tree, and just keep hold of a stack of pointers to the root node, so 'Undo' is just switching back to the previous states root node)
This seems much more straight forward than using a command pattern and having to implement both the 'forward' and 'reverse' versions of each state change, or using a memento pattern and capturing/replacing the state within a set of mutable model objects. It also makes it straight forward to manage updates to a number of entity objects as a single 'user action', (do whatever updates to the data structure are required, but don't replace the root node until the end of the 'transaction').
Of course with that in place it makes updating a value 3 levels down in the tree more complex than before since you must rebuild all the nodes above the updated node back up to the root node. The solution to this would appear to be using some composable 'lenses' to encapsulate the path down to the node to be modified, so that the rebuilding steps are automatically the reverse.
The next stage is to work out how to translate the UI actions (clicks,drags,keypresses) into logical User Actions and hence model updates. This is where Rx would come in, if the output an Rx pipeline could be a delegate that could be invoked on the old root node to return the transformed tree.
I'm finding that I could do with something like Scala case classes in C#, I only want to have to define the properties for a tree node, and have some code-gen or framework turn that into a properly implemented immutable ADT type with ToString(), GetHashCode(), Equals() etc, and possibly construct the update lens types to go along with it. The case class 'copy' concept seems quite hard to replicate in C#, perhaps solvable by creating a constructor with an optional parameter for each property, (except optional parameter defaults must be constants!). This may require breaking out a T4 template or similar.
There are so many other interesting ideas floating around at the moment, like EventSourcing/CQRS and data models like Datomic that include the temporal dimension cleanly, it seems like a way to combine those approaches would provide a very powerful alternative to what seems like the current messy state of RDBMs->ORM->Repository->UnitOfWork->Model->ViewModel->View etc.
Rich Hickey and Erik Meijer are my hereos at the moment. I seem to be stuck in a world of 'it doesn't matter if it's a terrible mess, just make it work', and it's great to see people actually taking the time to think about the actual core issues and come up with plausible alternative approaches.
The more videos I watch on this the more it seems like its just like WinFS for the Web, implemented over HTTP rather than SQL Server.
All the things WinFS was to bring, like syncronisation, notification events, relationships etc have been layed over the basic feed processing infrastructure in a way thats cross-platform and can be implemented on mobile devices of different sizes.
They have avoided falling into the trap of trying to define the schemas for common types like Contacts and Calenders to satisfy all possible requirements, at least in this initial version. Instead any custom data type is just a just a blob of data that is represented
with some consistent meta-data and replicated as-is.
Now I just wonder how long it will take for other applications on Windows to get on board with this model. Things like Windows photo gallery and media player need to be Mesh enabled so that all the meta-data in the app specific databases can sync across machines
as well as the file contents.
I love the idea of installing applications into your Mesh, that then just show up on all your machines, or that can access certain parts of your data from an online service.
You could then have a Mesh enabled photo frame that displays images from a particular folder that are inserted directly from a camera, from drag-and-drop on a desktop, or from subscribing to a feed from a photo sharing service, or all three methods at once.
It seems like the PC Backup feature is rather separate from the shared folders feature.
User --------- Client PC -------------- WHS ---------------- Remote Access
Peter <-----------------------------> Shared Folders -------------> Peter
Paul <-----------------------------> (Previous Versions)
(User Access Controls)
Peter's Machine ----->PC Backup
Paul's Machine ----->(Single Instance Storage)
<-----(Complete PC Restore)
1. Only files stored in shared folders can be accessed remotely.
2. Only files stored in shared folders will provide previous versions.
3. Paul cannot access a file backed up from Peters machine that is not in a shared folder.
4. Only the most recent backup can be restored?
5. Users can restore individual files that have been backed up from their PCs?
I seem to remember that on the Windows98 disc, or some other disc that came with my PC of that era there was a demo movie for the
Microsoft EasyBall mouse.
It was designed for small children and the physically impared to use and I'm pretty sure the demo showed how a parent and child could both have mice attached a PC at once and play little games together one one screen. The parent would use a traditional mouse
while the child used the EasyBall. Perhaps it only worked in a few specific programs that came with that hardware device.
If this new Multipoint stuff works with Touch-Screens as well it might be cool to create virtual mixing desks / DJ interfaces.
How did you manage to add that reference, I cant find anyway of clicking on that directory and no way of actually typing in that reference. I can see its there but cant figure out how to add a reference to it
Little help please...
I browsed to the assembly through the command line to find out the path, then copied and pasted that into the filename field of the add reference dialog.
this the best way to do it at the moment is to manually edit the csproj file to include it.
I couldn't add the control to the toolbox this way, I had to add it to the form manually by editing the designer.cs file.
(It might be best not to display the control at design time, just add a panel to describe its intended position on the form, then add code to instanciate the control, add it to the form, and dock it inside the panel outside of the InitializeComponent method
so it only executes at run time. This will stop VS2005 going to 100% CPU)
My screenshot actually shows the Microsoft.MapPoint.MapControl3D.MapControl control, rather than its base class Microsoft.MapPoint.Rendering3D.GlobeControl.
The GlobeControl itself class doesn't have the compass Controller UI or VirtualEarth markings.
What will the delivery vehicle/ licenseing of the managed control be?
I imagine use of the VirtualEarth tile service will require a MapPoint.Net contract, but if you plan to use your own datasource will the control itself be free or will you need a MapPoint desktop license to install it on a client machine for a commercial application?
Any hint on when a supported SDK for the managed control will be available?