Why Clydesdale?
Expertise
Strategic Partners
Blog
Contact
Home
Clydesdale Software Logo

Clydesdale Software, Inc.

355 South Teller St.

Suite 200

Lakewood, CO 80226

info@ClydesdaleSoftware.com


Follow Us: Twitter RSS



  • Stop the Chaos: The Gold Build

    Delivering great software is not a race to the finish line (by finish line I mean deployment to production).  Instead mark your acceptable builds as Gold Builds and when the business is ready to have it deployed, deploy the latest gold build.

     

    There will always be a push to get more done with less.  Using gold builds will alleviate the stress of trying to hit a deadline and having the go no go call the day before go live.  Another very important side effect of managing builds and deployment this way is the number of bugs released into production goes down.  Most likely this is due to the decrease in stress and increase in time to make sure the pinned gold build is truly the one to go live.

     

    Sounds easy but it is hard because setting the expectations with the business, sales, marketing even IT can be hard if the expectations are left uncontrolled.

    Full story

    Comments (0)

  • Little Bits of JavaScript – YUI Library

    Just wanted to share something I ran across the other day.  If you are looking for a great set of utilities and controls, written with JavaScript and CSS then check out YUI Library.

    Full story

    Comments (0)

  • Turning Internal Wants into External Needs

    Everyone hears it all the time, an internal staff member saying they want something.  There is nothing wrong with this but put the time in to do the research to make sure the internal want really has an external need.

     

    Just for clarification, external need = customer need.

    This can be as simple as a conversation of how the internal want will make your customers lives easier but it could very well uncover something bigger.  Or, it may uncover that the internal want has no validity at all.

    Full story

    Comments (0)

  • Simple Tip #27: Trade Show Basics

    Here are some quick tips to make your next trade show a great one!

     

    Good Booth:  Don't need to spend a lot of money but do need to stand out.  Practice setting up prior to shipping to the show.  Be sure to allow plenty of time for shipping to eliminate stress.

     

    Booth Location: Helpful if you sponsor

     

    Food:  Key in drawing people in - sparkling wine and sandwiches

     

    Hostess:  Necessary for an international trade show

     

    Speak at every show:  Almost the most important part.  Traffic really picks up after a speech.

     

    Sponsor:  Great advertising, excellent opportunity to getting a good spot.

     

    Cocktail party:  Invite only but have invites at the booth for impromptu invite.

     

    Systematically capture all leads:  Wordpress has a plugin for SalesForce

     

    Follow up on all leads:  Analyze all leads and identify who should follow up and how.  Needs to be timely.

    Full story

    Comments (0)

  • Tie Your Business Strategies Back To Your Customers

    It is much easier to think about yourself than to think about others.  Believe it or not this is what most companies do, they think of themselves when making decisions and never tie it back to their customers.

     

    So take a moment to step back and ask “How does this affect our customers?”

    Full story

    Comments (0)

  • QA Needs to Step Up

    I’m really tired of hearing tales of QA departments waiting on development and being a second class citizen in the software development process.  QA needs to mean quality assurance not testers.

     

    I would love to see the day when QA steps up and drives the software development process instead of development.  Developers should be going to QA to ask questions of how something should work.  QA should be working on tests before development even starts on a feature.

     

    You can probably pick up on my disgust on this.  I truly believe the roles of QA and development need to be reversed and Quality Assurance should drive software development.  Obviously both QA and development are always a part of the bigger picture with business stakeholders driving the direction of product and company.

    Full story

    Comments (0)

  • IIS 6 + .NET 4.0 + aspnet_regiis –i -enable

    I have used aspnet_regiis for some time but I learned something new the other day.  After installing the .NET 4.0 framework on a Windows 2003 Server box and running aspnet_regiis –i –enable I found that it changed all the sites to use the 4.0 framework.  Not an issue if I wanted all of them to run under .NET 4.0 but I only wanted one to run under the 4.0 framework so I had to change the others back to use the 2.0 framework.

    Full story

    Comments (0)

  • Start Out Slow with Social Networking

    Social Networking is a great tool to connect people with your business and it is easy to use.  When starting with social networking keep in mind it is much easier to add then to take away so start slow.  Maybe start with a blog, then add twitter.  After that consider a facebook group and a linkedin group.  After that you may be able to add specialized blogs and/or twitter feeds.

     

    Before getting caught up on driving traffic your direction and being fixated on page rankings focus on bringing value to your customers and potential customers.  Remember that climbing high in search results is about providing information that people care about.  You can have six different blogs trying to astroturf your way to the top but at the end of the day if you do not provide value, i.e. you do not provide information people care about then no one will link to your information thus resulting in lower search rankings.

     

    Starting out too fast will create a burden of providing consistent content to many different sources, sources you do not want to go stale.

     

    Bottom line, focus on providing value first through social networking and start about slow. 

    Full story

    Comments (0)

  • Beware of Robots!

    For some time now I have noticed errors happening on a number of websites Clydesdale Software host’s.  The errors all involve .axd pages.  After some investigation and looking up the ip addresses that were causing the errors I found they were robots crawling the site.

     

    To fix the issue quickly I disallowed the .axd pages the crawlers were hitting by adding to the Robots.txt:

     

    Disallow: /WebResource.axd
    Disallow: /DXR.axd
    Disallow: /ScriptResource.axd

     

    This cleared up the errors and now i can see through the forest so any real errors can be detected.

    Full story

    Comments (0)

  • Simple Tip #458: Vendors are There to Make Your Job Easier

    Simple yet true, vendors should make your job easier.  If every day is a battle with a vendor it is time to find a new vendor.

     

    In this economy there are plenty of vendor choices that want to help you succeed.

    Full story

    Comments (0)

  • Launch Your New Product Features!

    Let customers know about the new great features that are being released.  Yes it is easier to just release software but if no one knows about it then it does not matter what was released.

     

    Tie your marketing efforts to your software releases and set goals for the customers you are trying to reach.  This will raise the visibility of what you are doing and will bring value to your software product.

     

    A simple approach can be a monthly news letters with links to youtube videos that showcase the features.  After a short time you will have a library of help videos.  It is not always wise to include everyone in your crm system with these monthly newsletter.  Instead try to target specific market segments that make sense, measure, then try again.

     

    This all goes back to my theory of running everything as an experiment.  The key is to define first what you are going to measure, run the experiment, then actually measure.

    Full story

    Comments (0)

  • Consider A Multi Year Budget

    The beginning of a new year has many looking at budgets.  Many times these budgets revolve around one year.  Service providers out there have caught onto this and have pricing set around an annual budget. 

     

    I took a good hard look at continuing to use an offsite dedicated server (or EC2) and compared it to the cost of getting purchasing a server and having Clydesdale Software host it using Comcast Business Class internet.  Of course these are not mission critical internet based services I’m speaking of, they are my operational in nature to Clydesdale Software.

     

    The first thing to consider is does the company have the expertise and resources internally to take ownership over it?  I’m not just talking about IT stuff, same thing could be said about accounting.

     

    In  Clydesdale Software’s case the answer was yes, the expertise is there.  So the way the savings break down is the first year looks the same as having a dedicated server offsite but then every year after that there is a significant saving providing that the in house server that was purchased is still going strong.

     

    This is just one example of how looking at a longer term for budgets can provide saving.

    Full story

    Comments (0)

  • Import Your Old Blog to a Sitefinity Blog

    So you want to move your blog into Sitefinity, first you need to get your old blog data into a usable format.  If by chance your old blog data was exported to the movable type format here is something that can be of help.

     

    After using the movable type parser you can now import data into the blog.  Next step is create a page that resides under the sitefinity/admin directory, call it something like BlogImporter.aspx.

     

    In the newly created page in the Page_Load method handle the blog import.  Yes this is not fancy or very reusable or dynamic but how many times are you going to import a blog?

     

       15 protected void Page_Load(object sender, EventArgs e)

       16 {

       17     var fileContents = File.ReadAllText(@"C:\OldBlogDump\OldBlogExport.txt");

       18 

       19     var oldPosts = MovableTypeParser.ParseMovableTypeContent(fileContents);

       20 

       21     // create new instance of BlogManager

       22     var blogManager = new BlogManager();

       23     // get all blogs

       24     var listOfAllBlogs = blogManager.GetBlogs();

       25     if (listOfAllBlogs.Count > 0)

       26     {

       27         // get the first blog item

       28         var firstBlog = blogManager.GetBlog(((IBlog)listOfAllBlogs[0]).ID);

       29 

       30         foreach (OldPost oldPost in oldPosts)

       31         {

       32             // create a blog post by calling the CreateContent method of the

       33             // ContentManager class through the BlogManager class

       34             var postContent = blogManager.Content.CreateContent("text/html");

       35 

       36             // set the parent of the post item to be firstBlog

       37             postContent.ParentID = firstBlog.ID;

       38 

       39             // save the Content property value and the Title meta key

       40             postContent.Content = oldPost.Body;

       41             postContent.SetMetaData("Title", oldPost.Title);

       42             postContent.SetMetaData("Publication_Date", oldPost.Date);

       43             //save the Content item through the BlogManager

       44             blogManager.Content.SaveContent(postContent);

       45         }

       46     }

       47 

       48     Response.Write("Import Finished!");

       49 }

     

    The import turned out to be pretty simple once I found everything I needed in documentation and other sources around the internet.

    Full story

    Comments (0)

  • Toshiba E205 First Impressions

    This a a Best Buy Blue Label Notebook.   This means it was created from feedback of best buy customers and comes with some extra warranty and geek squad stuff.  Honestly the whole Blue Label thing did not influence my decision to purchase one of these. When I first saw the laptop in Best Buy I was very impressed with the look, very sleek.  I had been pricing out a Lenovo T410 and this coming in at over $1000 less I had to give it a try.

     

    The Good

    The 14” screen is the perfect size.  I’m coming from a Dell m4400 which had a 15” screen which I felt was a bit too big for travel.  The backlight keyboard is a welcome surprise on a laptop at this price level.  The keyboard is a little soft for my taste but is easily adapted to quickly.  There external connection options are all there and it even has an eSata port.

     

    After putting in a 256GB SSD and 8GB of good ram this laptop really flies.  I do work on VMs a lot so I was a bit worried how this would handle it but it is doing very well after my upgrades.

     

    The price is hard to beat, at $900 including the wireless push2tv netgear hardware there are very few other choices in this category.

     

    The Bad

    The keyboard could be a bit stiffer.  Upgrading the hard drive and memory involves taking out every screw that is holding the laptop together.  Toshiba obviously did not intend for users to upgrade these things.  Out of the box the computer felt slow with the bloatware that was installed.  The factory memory is slow, I would highly recommend upgrading it.  It does not come with a recovery cd or driver cd.

     

    The Intel HD graphics are ok but if you do anything that is graphics intensive you will want a dedicated graphics card.

     

    Bottom Line

    While I really did like this laptop I ended up returning it.  I need something I was going to be confident would last a couple of years which this did not fall in that category.

     

    I ended up getting a Lenovo T410 which just arrived to today and so far is very nice.

    Full story

    Comments (0)

  • iPad Books from Penguin

    I saw this on Engadget and the video is really cool.

    Full story

    Comments (0)

  • Simple Tip #743: Find the Right Images for Your Website

    I have found Fotolia to be a great resource when looking for the perfect image for a website.  Easy to search and a ton of pictures at an affordable price.

     

    Go Check it out!

    Full story

    Comments (0)

  • Japanese Email Encoding

    If you are going to be sending emails to Japan you need to use iso-2022-jp encoding for the body and subject.  This does not mean you have to store information in this format as the encoding can be done before the email is sent in code.

     

    Here is a quick example of how this can be done.

      582 var japeneseEncoding = Encoding.GetEncoding(LanguageEncodingConstants.JapaneseEncoding);

      583 

      584 // Encode Body

      585 message.Body = LanguageEncodeString(message.Body, japeneseEncoding);

      586 message.BodyEncoding = japeneseEncoding;

      587 

      588 // Encode subject

      589 message.Subject = LanguageEncodeString(message.Subject, japeneseEncoding);

      590 message.SubjectEncoding = japeneseEncoding;

    Note in the above that the body and subject encoding on the message is also set.

    And the method that does the encoding.

      597 private static string LanguageEncodeString(string stringToEncode, Encoding newEncoding)

      598 {

      599     var stringBytes = Encoding.UTF8.GetBytes(stringToEncode);

      600     var translatedBytes = Encoding.Convert(Encoding.UTF8, newEncoding, stringBytes);

      601 

      602     var translatedString = newEncoding.GetString(translatedBytes);

      603 

      604     return translatedString;

      605 }

    Full story

    Comments (0)

  • CNAME’s and SPN’s: Access Denied Error

    In a previous post I talked about adding a registry key to disable strict name checking which was more of reminder than anything else for when the error “A Duplicate Name Exists”.  On a previous server this was all that needed to be done but on a new server with Windows Server 2008 R2 I found I also needed to add a spn using setspn.  I first received and error of a domain trust failure when trying to access a cname’d network share but then when I did a net view I received an access denied error.

     

    To register the SPN for the DNS alias (CNAME) records, use the Setspn tool with the following syntax:

    setspn -A host/your_ALIAS_name computername

    setspn -A host/your_ALIAS_name.company.com computername

     

    After registering the spn everything is working fine.

     

    From Karan’s Blog:

    You must register the Kerberos service principal names (SPNs), the host name, and the fully-qualified domain name (FQDN) for all the new DNS alias (CNAME) records. If you do not do this, a Kerberos ticket request for a DNS alias (CNAME) record may fail and return the error code KDC_ERR_S_SPRINCIPAL_UNKNOWN.

    Full story

    Comments (0)

  • Simple Movable Type Parser

    Recently I moved my blog from one provider to Sitefinity.  My old provider had an export to the MovableType format, once I had that I need to parse the file and get into some objects that I could work with.

     

    First off I defined the classes to hold the MovableType data.

      122 public class OldPost

      123 {

      124     private List<OldPostComment> comments = new List<OldPostComment>();

      125 

      126     #region Properties

      127 

      128     public bool AllowComments { get; set; }

      129     public string Author { get; set; }

      130 

      131     public string Body { get; set; }

      132     public DateTime Date { get; set; }

      133 

      134     public string Status { get; set; }

      135     public string Title { get; set; }

      136 

      137     public List<OldPostComment> Comments

      138     {

      139         get { return comments; }

      140     }

      141 

      142     #endregion

      143 }

      144 

      145 public class OldPostComment

      146 {

      147     public string Comment { get; set; }

      148     public string Author { get; set; }

      149     public string Email { get; set; }

      150     public DateTime Date { get; set; }

      151 }

     

    Next I needed to parse the file and fill up these objects.  The parser leverages regular expression to get through the data fast.

     

      55 public static class MovableTypeParser

       56 {

       57     #region Fields

       58 

       59     private const string Movabeltype_BlogPost_Regex = @"AUTHOR:(.|\s)*?(?=(--------))";

       60 

       61     private const string Movabletype_AllowComments_Regex = "(?<=ALLOW COMMENTS: ).*";

       62     private const string Movabletype_Author_Regex = "(?<=AUTHOR: ).*";

       63     private const string Movabletype_Email_Regex = "(?<=EMAIL: ).*";

       64     private const string Movabletype_Body_Regex = @"(?<=BODY:)(.|\s)*?(?=(-----))";

       65     private const string Movabletype_Comment_Regex = @"(?<=COMMENT:)(.|\s)*?(?=(-----))";

       66     private const string Movabletype_Date_Regex = "(?<=DATE: ).*";

       67     private const string Movabletype_Status_Regex = "(?<=STATUS: ).*";

       68     private const string Movabletype_Title_Regex = "(?<=TITLE: ).*";

       69 

       70     #endregion

       71 

       72     #region Static Methods

       73 

       74     public static List<OldPost> ParseMovableTypeContent(string fileContents)

       75     {

       76         var oldPosts = new List<OldPost>();

       77 

       78         try

       79         {

       80             //match each blog post

       81             var postMatches = Regex.Matches(fileContents, Movabeltype_BlogPost_Regex);

       82             foreach (Match postMatch in postMatches)

       83             {

       84                 var post = new OldPost();

       85                 post.Author = Regex.Match(postMatch.Value, Movabletype_Author_Regex).Value;

       86                 post.Title = Regex.Match(postMatch.Value, Movabletype_Title_Regex).Value;

       87                 post.Status = Regex.Match(postMatch.Value, Movabletype_Status_Regex).Value;

       88                 var stringAllowComments = Regex.Match(postMatch.Value, Movabletype_AllowComments_Regex).Value;

       89                 post.AllowComments = stringAllowComments == "1" ? true : false;

       90                 var stringDate = Regex.Match(postMatch.Value, Movabletype_Date_Regex).Value;

       91                 post.Date = DateTime.Parse(stringDate);

       92                 post.Body = Regex.Match(postMatch.Value, Movabletype_Body_Regex).Value;

       93 

       94                 var commentMatches = Regex.Matches(postMatch.Value, Movabletype_Comment_Regex);

       95                 foreach (Match commentMatch in commentMatches)

       96                 {

       97                     var comment = new OldPostComment();

       98                     comment.Author = Regex.Match(commentMatch.Value, Movabletype_Author_Regex).Value;

       99                     var commentStringDate = Regex.Match(commentMatch.Value, Movabletype_Date_Regex).Value;

      100                     comment.Date = DateTime.Parse(commentStringDate);

      101                     var emailMatch = Regex.Match(commentMatch.Value, Movabletype_Email_Regex);

      102                     comment.Email = emailMatch.Success == true ? emailMatch.Value : string.Empty;

      103                     comment.Comment = Regex.Match(commentMatch.Value, Movabletype_Comment_Regex).Value;

      104 

      105                     post.Comments.Add(comment);

      106                 }

      107 

      108                 oldPosts.Add(post);

      109             }

      110         }

      111         catch (Exception ex)

      112         {

      113             HttpContext.Current.Response.Write(ex.ToString());

      114         }

      115 

      116         return oldPosts;

      117     }

      118 

      119     #endregion

      120 }

     

    It is that simple, just read the contents of your MovableType file then call MovableTypeParser.ParseMovableTypeContent passing in the file contents.  One thing to note is I had to change to encoding on the file to utf-8 for everything to be parsed correctly.

     

    In my next post I will show how I used this to import the blog posts into Sitefinity.

    Full story

    Comments (0)

  • SOLVED: DevExpress + IIS 7 Integrated Mode = Javascript Errors

    After looking through the devexpress online support and following the links I finally found the solutions for running devexpress controls on IIS 7 in integrated mode.  DevExpress’s response to others with this same issue was that it must be something else causing the issue, not very helpful if you ask me.

    So the solution for me (and I’m guessing a majority of developers out there) was to add the attribute runAllManagedModulesForAllRequests="true" to the element modules in the web.config like below.

      185   <system.webServer>

      186     <validation validateIntegratedModeConfiguration="false" />

      187     <modules runAllManagedModulesForAllRequests="true">

      188       <remove name="ScriptModule" />

      189       <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

      190       <add name="ASPxHttpHandlerModule" type="DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v9.3, Version=9.3.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" preCondition="managedHandler" />

      191     </modules>

      192     <handlers>

      193       <remove name="WebServiceHandlerFactory-Integrated" />

      194       <remove name="ScriptHandlerFactory" />

      195       <remove name="ScriptHandlerFactoryAppServices" />

      196       <remove name="ScriptResource" />

      197       <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

      198       <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

      199       <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

      200     </handlers>

      201     <urlCompression doDynamicCompression="true" />

      202   </system.webServer>

    Full story

    Comments (0)

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. Next page