Here is Google (search engine):
Here is Bing (decision engine):
Decision made! :-)
"Lasciate ogne speranza, voi ch'intrate" (Abandon all hope, ye who enter here)At this point it is generally decided that change is requiredd and so the business will create a vision to explain where we need to head and how everybody will feel when we get there. They then "sell" this new vision to the people and this helps to create the feeling of optimism and hope that are required in order to bring about action to enact the change.
There's also a good video of Mike Harsh going through Developing for Windows Phone 7 with Silverlight and his Slides and demos from his MIX10 Session.
I've been thinking about CMS for a while and recently decided to get back in to using Graffiti CMS as my CMS tool of choice. I've used Graffiti before and I believe that, for a .NET developer, it is probably one of the best CMS tools around.
Late last week I downloaded it and used it to bang out this simple little hockey club website - http://web9ecf9dd.titan.studiocoast.com.au/. Over the next few days I’m going to add several articles which explain how to get up and running using Graffiti and you will see the topics of these articles from the text in square brackets in the bullet pointed list below.
The things that I like about Graffiti CMS are that:
Further Reading
My Move to Graffiti - nice comparison of different tools
Remember that although I've jabbered on a lot about tools here, often its the practices and workflows that make a bigger difference. Tools can certainly make it much easier to use a good set of practices, but in the end it's up to the people to use an effective way of working for their environment. I like to see approaches that allow many small changes that are rapidly integrated using Continuous Integration. I'd rather use a poor tool with CI than a good tool without.
public abstract class Command<T> { protected T _result = default(T); public T Result { get { return this._result ; } } public abstract void Execute(); }
public abstract class SQLCommand<T> : Command<T> { protected string connectionString = ""; protected string commandText = ""; public SQLCommand(string connectionString, string commandText) { if (string.IsNullOrEmpty(connectionString)) {
throw new ArgumentNullException("connectionString");}
if (string.IsNullOrEmpty(commandText)) { throw new ArgumentNullException("commandText");}
this.connectionString = connectionString; this.commandText = commandText;} public override void Execute() { } }
public class GetWeatherCommand : SQLCommand<WeatherInformation> { const string _commandText = "spGetDailyWeather"; public GetWeatherCommand(string connectionString) : base(connectionString, _commandText) { }
public override void Execute() { WeatherInformation weather = null;
using (var cnn = new SqlConnection(connectionString)) {cnn.Open();
var cmd = new SqlCommand(commandText, cnn); using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { weather = new WeatherInformation() { Temperature = int.Parse(reader[0].ToString())};
}
}
}
this._result = weather;}
}
{
private WeatherInformation weather = null;
public DailyWeatherViewModel(WeatherInformation weather) {
this.weather = weather;} public int Temperature { get {
return this.weather.Temperature;}
}
public TemperatureRange TemperatureRange {
get { if (this.Temperature < 0) return TemperatureRange.VeryCold; else if (this.Temperature < 15) return TemperatureRange.Cool; else if (this.Temperature < 25) return TemperatureRange.Mild; else if (this.Temperature < 35) return TemperatureRange.Hot; else return TemperatureRange.VeryHot;}
} } public enum TemperatureRange : short { VeryHot, Hot, Mild, Cool, VeryCold, }
<div id="BirthdayText"> The temperature is: <%= this.Model.TemperatureRange %> <img src="/_layouts/<%= this.Model.TemperatureRange.ToString() %>" alt="<%= this.Model.TemperatureRange.ToString() %>" />
</div>
public partial class DailyWeatherControl : UserControl { public DailyWeatherControl() { } DailyWeatherViewModel model; public DailyWeatherViewModel Model { get {
return this.model;}
set { this.model = value;}
} }
protected override void OnLoad(EventArgs e) { base.OnLoad(e);
this.EnsureChildControls();} protected override void CreateChildControls() { base.CreateChildControls();
var connectionString = ConfigurationManager.ConnectionStrings["AppSqlConn"].ConnectionString; var weatherCommand = new GetWeatherCommand(connectionString);weatherCommand.Execute();
DailyWeatherControl weatherControl =
(DailyWeatherControl)Page.LoadControl("~/_controltemplates/Neimke/WebParts/DailyWeatherControl.ascx"); this.Controls.Add(weatherControl); weatherControl.Model = new DailyWeatherViewModel(weatherCommand.Result);} }
Note:What is architecture?
If you are developing solutions for SharePoint then you should also read my other SharePoint development articles and, in particular my article about using your build server to help make the process of deploying your customizations much nicer.
Note:Why is architecture important?
Fowler suggests architecture is the things that the senior developers on the team agree are probably important, and are hard to change. Re: the house, the architecture might be the direction it points, and whether it is one storey or two. The organization of the room is just code that's easily changed.
I never told many people about this but, last year I got pretty anxious for a while about the informal way that personal data had becoming readily available through social networking sites such as Facebook, LinkedIn and Twitter. This was reinforced to me when rich clients such as TweetDeck and Fishbowl started coming out and I could see the real power of the API’s of these sites in full view. Even more when I decided to go and take a peek at the API’s that Facebook makes available to developers and started to understand that I might be sharing personal information about my relationships or my location without even being fully aware who I was giving it to.
I remember at the time being able to completely visualize what sort of tools the bad guys would be capable of creating if they really put their minds to it. Not to belittle the efforts of the people who wrote TweetDeck and Fishbowl, but it’s really getting easy to build very rich dashboards to represent social graphs and with a little additional logic, I could see that you could pivot around on this data in some really interesting ways.
Fast forward 8 or 9 months and the game just keeps getting a whole lot more interesting with people such as Twitter allowing applications to store the geolocation along with the other bits of the tweeted data. This technical shift opens the door for new innovations to rise up in how we visualize information based on the location when it was being created. The following image shows a picture of Bing’s new Twitter Map tool:
As you can see from this picture, I can see location-based tweets over time (past 7 days) and then I can use filters to isolate certain data (e.g.: view only tweets made by a single user). Couple that with tools like the new Silverlight 4 Client for Facebook and you start to understand how much intelligence you could build around this stuff:
Couple that with the potential reach that you get across a social graph from deploying Facebook applications and you could build a very interesting, location based “listener”. Pictures, events, places, comments, and times.
Using technology for good
OK, so that’s enough paranoia, let’s look at what I think needs to happen to balance the scales a bit. We know that technology can be a terrific aid in helping to uphold safety, just as it can be used for bad stuff. Here is a link to the text from Steve Ballmer’s recent speech at the Worldwide Public Safety Symposium.
In and of itself, Bing Twitter Maps is not massively useful right now. For example a relatively minor number people are producing geo-coded tweets and so what you see when you look at this tool is a demonstration of capability. But think about how useful tools such as this could be in a crisis sometime in the not too distant future. A tool such as this could help somebody who was in distress to get a message out. It could be used to monitor activity near the scene of a crime – such as a burglary – and it could help groups of people who are often in disparate locations to understand when they were located near other members of the group.
For some of these types of scenarios to play out, I believe that we need more metadata so that different classes of information could be visualized in better ways. Consider what could be done if there was a metadata standard for Twitter which was the equivalent of a 911 or emergency message. Metadata such as this would allow individuals to send out distress signals and to perhaps have them acted upon.
Similarly, what if there was the ability for certain agencies to annotate their data with certain information which carried special weight with regards to public interest? Fire departments or local councils could start to create messages which plugged in to the raft of tools that are starting to emerge. Imagine a social network dashboard which was able to interrupt you with an important announcement about an event which was occurring nearby to you.
I think that as more standards start to emerge in the way that these types of information are transmitted, we will start to see some really amazing experiences being built and some which carry tremendous social responsibility messages to us.
Until that day arrives, maybe we will be dazzled by new rich renditions of information, but whether it has great application in our lives might be debatable. With the current tools the way they are, I think that there’s more on offer for petty stalkers than there is for seriously digital communities, groups, and individuals.
public ActionResult Index()
{
if (RoleEnvironment.IsAvailable)
{
ViewData["Message"] = "Welcome to the Cloud!"; } else {
ViewData["Message"] = "Welcome to ASP.NET MVC!"; }
return View();
}xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="HelloCloudServiceWebRole">
<InputEndpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" />
</InputEndpoints>
</WebRole>
</ServiceDefinition>/role:HelloCloudServiceWebRole;"D:\Sandboxes\2010Wave\HelloCloudService\HelloCloudService" /generateConfigurationFile:"D:\Sandboxes\2010Wave\HelloCloudService\HelloCloudServicePackage\HelloCloudService.cscfg" /out:"D:\Sandboxes\2010Wave\HelloCloudService\HelloCloudServicePackage" /copyOnly
csrun /run:"D:\Sandboxes\2010Wave\HelloCloudService\HelloCloudServicePackage"; "D:\Sandboxes\2010Wave\HelloCloudService\HelloCloudServicePackage\HelloCloudService.cscfg" /launchbrowser
As per the documentation for CSPack, the syntax for using this tool to create a package is:
And the options that we are interested in are:CSPack <service-definition-file> [options]
| Argument | Description |
| /out: <file | directory> | This option indicates the output format and location for the role binaries. |
| /role:<rolename>;<role-binaries-directory>; | This option specifies the directory where the binaries for a role reside and the DLL where the entry point of the role is defined. The command line may include one /role option for each role in the service definition file. |
cspack \ServiceDefinition.csdef /role:AmbientPlacesWebRole;\CloudService.WebRole /out:AmbientPlaces.cspkg
Except that, instead of using WSPBuilder.exe, we would use CSPack.exe in those places.
http://blogs.msdn.com/domgreen/archive/2009/09/29/deploying-to-the-cloud-as-part-of-your-daily-build.aspxAnother option that is available is to use the Windows Azure PowerShell Cmdlets to customize your deployment process:
http://blogs.msdn.com/chabrook/archive/2009/10/26/azure-powershell-cmdlets-announced.aspx
Back in 2004 I was lucky enough to rewarded for a bunch of community activity that I’d been doing with my first MVP award. At the time this meant a lot of forums activity on ASP Messageboard and the newer ASP.NET forums and I was also developing and managing quite a few open source software projects. I’ve been re-awarded every year since then – up until this year that is. For the last couple of years I’ve focused more and more on my management and hockey coaching skills and this has meant no time for “giving” to the community – unless a couple of thousand tweets per year counts So now I am no longer an MVP for the first time in 6 years.
I’ve reflected on the MVP program many times before but my opinion still has not swayed significantly from what I wrote here back in July 2006 – and yes giving up the MSDN subscription is going to have a pretty hard impact I expect. I also agree strongly with what @davidlem wrote back in his post back in January of that same year.
During my time as an MVP I was lucky enough to work for employers who supported me and this allowed me to travel to Seattle on several occasions to attend MVP Summits. And I have great memories of those! Meeting with real Redmondites and making a personal connection with so many of them has really helped me in my career and made it fun along the way too. Justin Rogers, Doug Seven, Kent Sharkey, Duncan MacKenzie, Jonathon DeHalleux… the list goes on. Meeting and getting to talk with people such as Anders Heilberg, Paul Vick, and Don Box and being able to attend keynotes delivered by both Steve Ballmer and Bill Gates were standout highlights. Of course meeting and making relationships with community leaders (and there are too many for me to start naming them) was also an enriching experience.
So if you are an MVP now, my advice is to use the program as a tool and take the opportunity to attend these conferences because they are truly unique opportunities and you won’t regret it. And while there, go out of your way to say “hi” to people. Get to know some of them. Read their blogs, chat with them, have a beer with them.
There are changes that I think could be made to improve the program but they are largely encapsulated in the previous blog posts that I linked to. Given the chance to make any single change, probably upping the churn factor would be the thing that I’d like to see. To give more people opportunity and to force others to cherish their moments in the program while they have them – to take advantage of that time.
So where to now? Who knows… I’m yet to fully decide how much time to take from business and sporting interests to channel back into technical community activity. I’d love to, but you’ve got to do things that make you happy for the right reasons. But I am grateful for what I’ve had and I’d love to personally thank all those who have supported me over that time.
public class PageHeadContentControl : Control
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("<script type="text/javascript" src="/_layouts/1033/jquery-1.2.6.min.js"></script>") ;
}
} var scriptPath = "/_layouts/1033/YourFeatureName/YourScriptFileName.js";
var scriptKey = "YourFeatureNameScriptIncludeKey" ;
var type = this.GetType() ;
var cs = Page.ClientScript;
if (!cs.IsClientScriptIncludeRegistered(type, scriptKey))
{
cs.RegisterClientScriptInclude(cstype, scriptKey, scriptPath);
} WSPBuilder documentationWhen using WSPBuilder you do not need to know about the second grouping of objects that were created in the article which I referenced earlier. Namely, you will not need to create a Manifest.xml, a DDF file, or the custom MSBuild task to call makecab.exe.
<PropertyGroup> <Root>$(MSBuildStartupDirectory)</Root> <WSPBuilderPath>c:\Program Files (x86)\WSPTools\WSPBuilderExtensions</WSPBuilderPath> <WSPSolutionPath>$(Root)\$(build_branch_name)\MySharePointProject\My.SharePoint.FrontEnd</WSPSolutionPath> </PropertyGroup>
<ItemGroup> <ProjectToBuild Include="$(Root)\$(build_branch_name)\MySharePointProject\My.SharePoint.sln" /> </ItemGroup> <MSBuild Projects="@(ProjectToBuild)" Targets="Build"> <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> </MSBuild>
<Exec Command='"$(WSPBuilderPath)\WSPBuilder.exe" -SolutionPath "$(WSPSolutionPath)" -12Path "$(WSPSolutionPath)\12" -GACPath "$(WSPSolutionPath)\GAC"' ContinueOnError='false' />
xcopy "$(OutputDir)*.dll" "$(SolutionDir)My.SharePoint.FrontEnd\GAC\" /Y /R
<MakeDir Directories="$(deploy_path)\$(build_number)" Condition="!Exists('$(deploy_path)\$(build_number)')" />
<ItemGroup>
<WSPSourceFiles Include="$(MSBuildProjectDirectory)\My.SharePoint.FrontEnd.wsp; $(WSPSolutionPath)\Deploy\*" />
</ItemGroup>
<Copy
SourceFiles="@(WSPSourceFiles)"
DestinationFolder="$(deploy_path)\$(build_number)"
/>