mo.notono.us

Tuesday, January 11, 2011

"Microsoft has completely lost the web development community."

Last year Mark Pilgrim released a free e-book/site called “Dive Into Html5” (http://diveintohtml5.org/).  The site/book has served as a valuable resource on a recent Html5 project we’re working on here at AIS, and I have frequently gone back for details on topics such as local storage and canvas.  It is an excellent book for any bleeding edge web developer.  It is so choice. If you have the means, I highly recommend picking one up.

This week, Mark posted his observations on how publishing a free e-book (which is also purchasable in print format) works well for him, and that it gives great insight into what parts of the book are being read, and by whom. He then makes the following observation:

6% of visitors used some version of Internet Explorer. That is not a typo. The site works fine in Internet Explorer — the site practices what it preaches, and the live examples use a variety of fallbacks for legacy browsers — so this is entirely due to the subject matter. Microsoft has completely lost the web development community. (emphasis mine)

I forwarded this internally within AIS, and a nice debate ensued.  One common complaint was the hyperbole of the statement, and I agree; a more accurate line would likely be "Microsoft as a browser vendor has lost significant mindshare in the bleeding edge web development community."

Personally one of the things I love about Html5 (using the term the way the hypers would – to mean modern web development with client-driven UI interactions using JavaScript, CSS(3) and some HTML5 semantics) is that it has in some ways unified the web development community:  The debate a few years ago was about JSP vs .NET vs PHP vs Python vs Rails vs someotherservertechnology.  Folks from different camps seldom interacted and learned from each other.  With Html5, the backend processes are completely irrelevant, as long as they don’t muck with the Html (ASP.NET webforms is still a major sinner here, unfortunately) and developers using all sorts of backend software and operating systems are now adding to the collective knowledge, mostly working towards the common goal of getting as much functionality as possible, pushed to end users through mostly standards compliant browsers. 

For instance, our Html5 app is backed by ASP.NET MVC 2 and SQL server.  We do all our development on Windows, in Visual Studio – we’re looking to deploy to Azure.  Clearly we’re MS developers.  But we could just as well have done the app in Php against MySql running on linux and apache, and we’re taking cues from folks using python, java, Rails, Node.js, php and God knows what on the backend.

At the same time I haven’t used IE by choice for about 5 years, maybe more…

I was asked what I thought MS could do to gain back some developer mindshare – so here goes:

  • My thoughts are that if Html5 and the set of bleeding edge technologists that go with it are any kind of priority for MS,  they need to do some or all of the following:
  • Find a way to upgrade the legions of IE 6, 7  and 8 users to IE9.  This will obviously not be easy,  but they could do something similar to what Google did with Chrome frame (i.e. make IE9 a plugin for the older browsers),  or they could do something like the makers of the “IE Tab” Chrome and Firefox extensions do,  allow IE to be hosted inside Chrome,  and only activate it for certain sites.  Or let users install IE9 side by side with the older versions.   All of these would have as goal to encourage end users to use the latest possible browser for the task they need it for,  and to make them install IE9 instead of Chrome or Firefox.
  • Make IE9 the paragon of standards compliance.   (They are actually getting close to this...)
  • Bring IE9 to WP7 and whatever tablet software they're coming out with.
  • Reduce the focus of Silverlight as a browser plugin,  and make it more about web-deployed desktop apps.
  • Drastically improve the support for css and javascript in Visual Studio, including debugging and unit testing.   And give this toolset away in the form of VS Express.
  • Evolve the Dev tools in IE9 to become better than Chrome's inspector and the Firebug plugin.
  • Separate the IE development from Windows to allow quicker iterations
  • Do more things like the jQuery deal. The world of CSS is a mess (we desperately need mixins and code forks like those provided by media queries), MS could take the lead here…

The point is, whether Mark’s browser percentages are statistically valid as an indication of web developer’s preferences, or to what degree Microsoft is lagging/losing developer mindshare; these are not the pertinent questions.  The fact is that Microsoft is now not a leader in emerging web development areas – maybe they never were – but should they want to be, they need to take action. IE9 is shaping up to be a great browser, and they need to push it aggressively.

Labels: , , , , , , , , , , , , , , , , , , ,

Tuesday, August 17, 2010

The Squrl Lives!

squrlI gave up on my homegrown url-shortening exercise, squrl.us, about a year and a half ago – it started as an experiment in MVC, which I tried to port to server side js, but lack of time and interest got the better of it.  So I shut it down.

Now, thanks to bit.ly Pro, squrl.us is back!  Just too bad I can’t get the cool logo Sean made for me up on the site… :-(

Labels: , , ,

Monday, July 06, 2009

Testing gist.github.com as a blog code pastebin

I’m new to github, so therefore I’m also new to gist.  At first I couldn’t figure out what they were, but then I watched this great intro video by ByanL which explains it all quite well.

Github seems a bit too command line focused for my taste, but Gist looks useful by itself.

Below I’m going to embed the source for my Twitter Conversations test page, which I copied into my very first Gist – whoa! it loads immediately in the edit panel in Live Writer, nicely color-coded and everything.  Nice!

Thanks to Rob Conery for moving Subsonic 3 to github, which made me look in the first place.  I’ll be using this.

Labels: , , , ,

Thursday, January 15, 2009

I like Balsamiq

I’ve been using the free version of Balsamiq Mockups to create some application page mockups.  It’s not quite as fast as pen and paper, but sure as hell beats doing it in something like Visio.  I really like it*. 

The application is available both online and in an Adobe Air version that can be downloaded and run from the desktop – I’ve used both and probably will continue to use both, the differences between the two versions are marginal. 

Balsamiq Mockups comes in a free trial version as well as a paid for version ($79).  As far as I have experienced, also the only differences between the free version and the paid version ($79) are that 1) the free version nags you every 5 minutes, and 2) you can actually save your files with the paid version, and also 3) print the mockup.  To make the free version useful, Balsamiq does allow you to export the markup as XML (and re-import the xml to re-create the drawing.)

Below is a screenshot of a markup I did of mo.notono.us – took all of 10 minutes:

mo.notono.us balsamiq markup

*… in the interest of full disclosure I fully intend to email Mariah to see if I can get myself a free license….

Labels: , , , , ,

Monday, December 15, 2008

Re-Professing My Love of WSPBuilder

Say what you will about SharePoint as an application development platform; it adds a significant crapwork overhead to your everyday asp.net development.  Especially when it comes to organizing folder structures, creating xml files that point to other xml files, the lovely ddf syntax, etc.

WSPBuilder on the other hand…

To create a new artifact:

CropperCapture[15]

To deploy your solution (even includes an MSI installer in the Deployment Folder):

CropperCapture[18]

Labels: , , ,

Tuesday, November 25, 2008

TypeMock offers Unit Testing Framework for SharePoint

First a disclosure:  This is a blatantly self-serving post: I want to be one of 50 recipients of a free copy of “Isolator for SharePoint”.

Mandatory statement:

Typemock are offering their new product for unit testing SharePoint called Isolator For SharePoint, for a special introduction price. it is the only tool that allows you to unit test SharePoint without a SharePoint server. To learn more click here.

The first 50 bloggers who blog this text in their blog and tell us about it, will get a Full Isolator license, Free. for rules and info click here.

But that said, I am intrigued by two things:  Roy Osherove is now doing SharePoint development?  That can’t hurt the community.  Second, I heard rumors this will work on a non-SharePoint server.  Could my VPC days be coming to an end?  (Couldn’t come fast enough…)

Labels: , , , , , ,

Friday, November 07, 2008

Papercut

This looks like a really handy little utility for  testing stuff like workflow: the utility allows your program to connect to the SMTP server and “send”, but doesn’t actually send the message anywhere – it just gets added to the papercut app, which lets you see the raw, body and html view of the email.

via Scott Watermasysk

Labels: , , ,

Thursday, October 09, 2008

Zemanta – more trouble than it’s worth.

Image representing Zemanta as depicted in Crun...

Image by Zemanta via CrunchBase

I’ve been using Zemanta for some time now to add some image and related content-flair to my posts.  It works… –ok.  But I have also had image placement issues, javascript errors, (I believe) related Windows Live Writer crashes, and annoyingly, on our internal blog, the Zemanta icon is http sourced, while the rest of the blog is under SSL, bringing up the annoying Mixed Content warning.

So, all in all I just don’t get enough value from this tool to deal with the minor headaches.  This is my last Zemanta-augmented post, but I will try to use more images to spruce up what’s otherwise quite dull reading.

Reblog this post [with Zemanta]

Labels: , , , ,

Wednesday, August 20, 2008

MS Office: Make the Ribbon Behave

It’s been, what, 2 years or so? since I started using Office 2007 and I STILL have trouble finding some of the more obscure features in the Ribbon interface.

I’d heard of PSchmid making a "Classic UI" add-in that would create a Ribbon tab containing all the familiar classic menus, but I was always too cheap to pay the $30 license cost. Well, now there’s a free version, and it does exactly what I need, for Word, Excel and PowerPoint:

CropperCapture[22]

Labels: , , ,

Wednesday, August 13, 2008

Testing Zemanta Plugin for Windows Live Writer

20px|Windows Live Logo Windows Live Writer

Image via Wikipedia

I just installed the Zemanta plugin for Windows Live Writer, and so far, so good (with the exception of a js error at startup each time - see below).  It's supposed to search the context of your blog post and suggest related images, links and articles.  This is a test post - the image top-left is one of its suggestions (I picked that over the geisha typing on a laptop), and the links to Zemanta and WLW above were auto-applied by the plug-in.

The "related articles" below are also a handful of the ones it decided matched the content of this post:

JS error:

image

Reblog this post [with Zemanta]

Labels: , , , , ,

Monday, July 28, 2008

Another Way to Google Yourself

...err - search for yourself, I mean:  Cuil.com has launched and has some interesting results.

Not sure how the Cuil index works, but the top listings for "oskar austegard" are a bunch of public pages for services I no longer use.  Contrast that with Google, whose top results are my blog, my LinkedIn profile, my Facebook profile, my Yahoo profile, etc.

Less narcissistic searches render similarly strange results - a search for Microsoft on Google gets you the main page, the download center, help and support and the wikipedia page, etc.  The same search on Cuil gets you Microsoft Office, Help and Support, more Office, MS UK, and Quick Basic - Quick Basic???

I don't think Google has to worry quite yet.

Labels: , , ,

Tuesday, July 22, 2008

C#: String.Inject() - Format strings by key tokens

I generally prefer to use String.Format() instead of doing a bunch of string additions, but constantly find myself splitting the code onto multiple lines with an appended comment to keep track of the indices:

string myString = string.Format("{0} is {1} and {2} is {3}",
  o.foo, //0
  o.bar, //1
  o.yadi, //2
  o.yada //3
);

Wouldn't it be nice you could instead write something like this?:

string myString = "{foo} is {bar} and {yadi} is {yada}".Inject(o);

Well, now you can - see the string extension method Inject below; it accepts an object, IDictionary or HashTable and replaces the property name/key tokens with the instance values.  Since it uses string.Format internally, it also supports string.Format-like custom formatting:

   1:  using System;
   2:  using System.Text.RegularExpressions;
   3:  using System.Collections;
   4:  using System.Globalization;
   5:  using System.ComponentModel;
   6:   
   7:  [assembly: CLSCompliant(true)]
   8:  namespace StringInject
   9:  {
  10:    public static class StringInjectExtension
  11:    {
  12:      /// <summary>
  13:      /// Extension method that replaces keys in a string with the values of matching object properties.
  14:      /// <remarks>Uses <see cref="String.Format()"/> internally; custom formats should match those used for that method.</remarks>
  15:      /// </summary>
  16:      /// <param name="formatString">The format string, containing keys like {foo} and {foo:SomeFormat}.</param>
  17:      /// <param name="injectionObject">The object whose properties should be injected in the string</param>
  18:      /// <returns>A version of the formatString string with keys replaced by (formatted) key values.</returns>
  19:      public static string Inject(this string formatString, object injectionObject)
  20:      {
  21:        return formatString.Inject(GetPropertyHash(injectionObject));
  22:      }
  23:   
  24:      /// <summary>
  25:      /// Extension method that replaces keys in a string with the values of matching dictionary entries.
  26:      /// <remarks>Uses <see cref="String.Format()"/> internally; custom formats should match those used for that method.</remarks>
  27:      /// </summary>
  28:      /// <param name="formatString">The format string, containing keys like {foo} and {foo:SomeFormat}.</param>
  29:      /// <param name="dictionary">An <see cref="IDictionary"/> with keys and values to inject into the string</param>
  30:      /// <returns>A version of the formatString string with dictionary keys replaced by (formatted) key values.</returns>
  31:      public static string Inject(this string formatString, IDictionary dictionary)
  32:      {
  33:        return formatString.Inject(new Hashtable(dictionary));
  34:      }
  35:   
  36:      /// <summary>
  37:      /// Extension method that replaces keys in a string with the values of matching hashtable entries.
  38:      /// <remarks>Uses <see cref="String.Format()"/> internally; custom formats should match those used for that method.</remarks>
  39:      /// </summary>
  40:      /// <param name="formatString">The format string, containing keys like {foo} and {foo:SomeFormat}.</param>
  41:      /// <param name="attributes">A <see cref="Hashtable"/> with keys and values to inject into the string</param>
  42:      /// <returns>A version of the formatString string with hastable keys replaced by (formatted) key values.</returns>
  43:      public static string Inject(this string formatString, Hashtable attributes)
  44:      {
  45:        string result = formatString;
  46:        if (attributes == null || formatString == null)
  47:          return result;
  48:   
  49:        foreach (string attributeKey in attributes.Keys)
  50:        {
  51:          result = result.InjectSingleValue(attributeKey, attributes[attributeKey]);
  52:        }
  53:        return result;
  54:      }
  55:   
  56:      /// <summary>
  57:      /// Replaces all instances of a 'key' (e.g. {foo} or {foo:SomeFormat}) in a string with an optionally formatted value, and returns the result.
  58:      /// </summary>
  59:      /// <param name="formatString">The string containing the key; unformatted ({foo}), or formatted ({foo:SomeFormat})</param>
  60:      /// <param name="key">The key name (foo)</param>
  61:      /// <param name="replacementValue">The replacement value; if null is replaced with an empty string</param>
  62:      /// <returns>The input string with any instances of the key replaced with the replacement value</returns>
  63:      public static string InjectSingleValue(this string formatString, string key, object replacementValue)
  64:      {
  65:        string result = formatString;
  66:        //regex replacement of key with value, where the generic key format is:
  67:        //Regex foo = new Regex("{(foo)(?:}|(?::(.[^}]*)}))");
  68:        Regex attributeRegex = new Regex("{(" + key + ")(?:}|(?::(.[^}]*)}))");  //for key = foo, matches {foo} and {foo:SomeFormat}
  69:        
  70:        //loop through matches, since each key may be used more than once (and with a different format string)
  71:        foreach (Match m in attributeRegex.Matches(formatString))
  72:        {
  73:          string replacement = m.ToString();
  74:          if (m.Groups[2].Length > 0) //matched {foo:SomeFormat}
  75:          {
  76:            //do a double string.Format - first to build the proper format string, and then to format the replacement value
  77:            string attributeFormatString = string.Format(CultureInfo.InvariantCulture, "{{0:{0}}}", m.Groups[2]);
  78:            replacement = string.Format(CultureInfo.CurrentCulture, attributeFormatString, replacementValue);
  79:          }
  80:          else //matched {foo}
  81:          {
  82:            replacement = (replacementValue ?? string.Empty).ToString();
  83:          }
  84:          //perform replacements, one match at a time
  85:          result = result.Replace(m.ToString(), replacement);  //attributeRegex.Replace(result, replacement, 1);
  86:        }
  87:        return result;
  88:   
  89:      }
  90:   
  91:   
  92:      /// <summary>
  93:      /// Creates a HashTable based on current object state.
  94:      /// <remarks>Copied from the MVCToolkit HtmlExtensionUtility class</remarks>
  95:      /// </summary>
  96:      /// <param name="properties">The object from which to get the properties</param>
  97:      /// <returns>A <see cref="Hashtable"/> containing the object instance's property names and their values</returns>
  98:      private static Hashtable GetPropertyHash(object properties)
  99:      {
 100:        Hashtable values = null;
 101:        if (properties != null)
 102:        {
 103:          values = new Hashtable();
 104:          PropertyDescriptorCollection props = TypeDescriptor.GetProperties(properties);
 105:          foreach (PropertyDescriptor prop in props)
 106:          {
 107:            values.Add(prop.Name, prop.GetValue(properties));
 108:          }
 109:        }
 110:        return values;
 111:      }
 112:   
 113:    }
 114:  }

File downloads:

Labels: , , , , , , , , ,

Monday, October 08, 2007

Announcing squrl.us

Squrl.us (Short, Quick URLs) is a side project I've been putting together over some weekends and weeknights lately.  Essentially it is a tinyurl clone, but with added functionality, and a cuter look.

It's all really quite simple:  You enter a long and unruly url, press the Scurry button, and in return get a number of short, quick urls that are easy to remember, jot down, or communicate verbally.

For example, the url http://www.spiegel.de/panorama/leute/0,1518,510187,00.html is converted to

The squrl is just a redirection to the original link, the mobile link uses Skweezer.net to render a mobile-friendly version, the cache link goes to the Google cache for the url, and the translated link is to Google's automatic translation service (note this only works for non-English pages).

The whole thing is running on ASP.NET 3.5 with C# 3.0 and Linq (for the heck of it), and SQL Server Express 2005 (this may be migrated to MySQL 5.0 due to server constraints).

Go try it out!

Labels: , , , , ,

Tuesday, August 21, 2007

MOSS: My new favorite MOSS Utility: SharePoint Manager 2007

While I've been enjoying using echo's SharePoint Spy for a while now, and how it lets me easily view MOSS object properties and schemas, I have been lately wishing for a tool that would let me UPDATE the properties, not just read them.  Do stuff like turning a view from hidden to visible, unsealing fields, modifying a field’s ShowInXXXForm settings, etc, etc.

Turns out that tool has been available since January: SharePoint Manager 2007.

Make sure you Use the “View – Object Model – Full” option to get to the nitty gritty useful stuff.

Labels: , , ,

Tuesday, April 10, 2007

SubSonic 2.0 goes Beta

Looks like v.2.0 of Rob Conery's (et. al.) excellent SubSonic has reached Beta status.  I used an early alpha build on a project a few months back, and though I'm normally a CodeSmith devotee, the simplicity of SubSonic was refreshing. 

(The use of a build provider to generate the DAL at run time is interesting, but unfortunately conflicts with ReSharper; I ended up using SubCommander and the web based dev tools instead.) 

Labels: , ,

Tuesday, November 28, 2006

Testing Google Docs as a Blogging Tool

Grade: C-:  Ok editor, but fails to post to a blog hosted by Google.

So I was going to write this post in WritelyGoogle Docs, to test out its new blog publishing feature, but got the following error:

Instead I had to resort to type this in Live Writer.  Hmmm, let's see: Google can't post to its own blog, but I can save the page as a webpage, then use Microsoft's extension to the Firefox browser to open Live Writer and post a link to the intended post's webpage:

Link to Testing Google Docs as a Blogging Tool

 

del.icio.us tags: , , , ,

Labels: , , ,

Wednesday, November 08, 2006

CodeSmith 4.0 Released

Eric and his team at CodeSmith Tools have released version 4.0 of the popular CodeSmith.

CodeSmith 4.0 has been released today at the Dev Connections conference in Las Vegas. Here are just a few the new capabilities in CodeSmith 4.0:

  • CodeSmith Projects (.csp) - This feature makes automating your code generation process really easy and consistent whether you are working from inside of Visual Studio 2005, MSBuild, Windows Explorer, a command line / batch file, or CodeSmith itself.
  • ActiveSnippets - Imagine Visual Studio 2005 snippets, but with the full power of CodeSmith available to execute any logic or access any complex metadata (including database schema and xml data) to control the output of your snippets.
  • CodeSmith Maps (.csmap) - This feature will allow you to create dictionary style maps of things like SQL to C# data type mappings.
  • .netTiers 2.0 - The .netTiers templates have been greatly enhanced and included with CodeSmith 4.0.
  • Extended Property Management - You can now edit and add new schema extended properties inside of CodeSmith Studio.
  • Property Persistence - CodeSmith now remembers the property values from the last time you executed a template.

Official Press Release

Personally I have enjoyed great productivity increases using versions 2 and 3 of CodeSmith, and hope to garner even greater benefits in version 4. Especially the CodeSmith Projects and the ActiveSnippets will be very useful to me. Couple that with partial classes in .NET 2 (and 3) and we're looking at a killer featre set.

Labels: , ,

Thursday, October 19, 2006

CodeSmith 4.0 Public Beta released

Eric J. Smith and his team at CodeSmith Tools has released a public beta of CodeSmith 4.0. Full set of changes are here. If you ever do anything repetitive in C#, VB.NET, HTML, SQL, JavaScript, XML - in short, any ASCI based language, and your repetiveness is based on data from a table or an xml document, then CodeSmith can help you get your work done in a fraction of the time spent before. I highly recommend it.

Labels: ,

Friday, September 22, 2006

Testing Word 12 as a Blog Editor

So I'm typing this in Word 12 B2TR after having added mo.notono.us as a blog account.

Benefits:

  • You can publish to multiple types of blogs, including SharePoint (2007 – I don't know what other blog clients can publish to SharePoint).
  • It's sort-of WYSIWYG (see concern below).
  • UPDATE: It does a good job of keeping the HTML clean.
  • UPDATE: It's easy to edit prior posts
  • UPDATE: You can do all sorts of fancy formatting quite easily – (duh – it's Word).

Concerns:

  • Windows Live Writer does a much better job of WYSIWYG – Word doesn't pull in any of the blog's styles.
  • You can't tab from the Title to the body

In general, other than that Word is a familiar interface, and there's some benefit to having a blog editor "right there", I don't see this as an attractive option to LiveWriter, or your blog's default editor. Good for quick notes, though, or for publishing something you already have in Word format.

I see where this has its place. I think I'll still use LiveWriter for most of my posts, but if I'm already in Word and want to jot a quick note, or I have something complex I want to put up, then this is a good tool to use. And I WILL use it with SharePoint.

Labels: ,

Sunday, September 17, 2006

Testing Frank's Technorati Tag Live Writer Plugin

UPDATE (09/19/06): Frank updated his plugin, and addressed two of my three issues.  As for the third, let me quote Frank:

The first time I went to enter "Richmond, VA" into the text box; I realized that using comma's as a field delimiter has certain drawbacks.

Hence, I made semi-colon the delimiter.

I guess that's fair - I'll deal with it.

----

Frank La Vigne, one of my new coworkers at AIS wrote a Live Writer plugin that allows you to tag your posts with Technorati tags.  So naturally I decided to try it out.   Below are some comments:

The Good:

  • It works (as is evident by this post.)
  • It's convenient, with a simple pop-up available form both the Insert menu and the Insert action pane group
  • Easy to install, just download, and extract into the plugin folder

The Bad:

  • You have to enter the tags separated with a semicolon.  Why semicolon?  I can understand not using space (though I'm used to that from del.icio.us), but why not comma?
  • There's no icon for the menu item

The Ugly:

  • The dialogs title says Insert Hello World.  Uhm - how about Insert Tags?

All in all a good job, just in need of some simple polishing.

Via Russ Stalters' BetterECM.

Tags:

Labels: ,