Displaying Syndicated Content

RssFeed: An Open-source Control for Adding RSS Feeds to Your Site

asp:cover story

LANGUAGES: C#

ASP.NET VERSIONS: 1.0 | 1.1 | 2.0

 

Displaying Syndicated Content

RssFeed: An Open-source Control for Adding RSS Feeds to Your Site

 

By Scott Mitchell

 

As the quantity of information on the Internet has exponentially expanded year after year, staying current with the latest news and information has become more time consuming. To help aggregate constantly evolving information, there exist numerous Web sites that do nothing but collect the data, categorize it, and present it. Sites like Google News (http://news.google.com), and portals like Yahoo! and Lycos, provide a composite of the latest news, weather, sports scores, and breaking headlines.

 

Although these aggregation Web sites are a great one-stop place for a variety of information, it requires that you take the time to load your browser, visit the site, and peruse the information. Rather than having to periodically check the Web site to get the information, many users would like the information delivered to them as it happens. Many Web sites provide such functionality. CNN.com, for example, has a "breaking news" e-mail service, sending e-mails out to subscribers when breaking news unfolds. Many news Web sites also have a daily or weekly newsletter that highlights the day's or week's top news stories.

 

These e-mail-based techniques are adequate for pushing content to human readers, but what if you want also to provide this content in a form that computer programs can easily parse? There are many potential solutions; however, an easy, platform-neutral one to implement is to provide the content in an XML-formatted file. XML is the ideal choice for a variety of reasons. First, XML data is represented as text, not binary data. Since different computer architectures can represent binary data in different formats, using a text format removes the need for knowing what format the binary data is stored in, and - potentially - performing conversions. Second, there exist XML parsers for virtually every programming language and platform. Third, XML offers a high degree of flexibility in how data can be marked up, providing more freedom when deciding how to syndicate the content.

 

RSS: The Standard for Web Content Syndication

Over the past five years developers have worked on creating a standard XML structure for specifying syndicated content. The first such syndication format was formulated in 1999 by Netscape and called RDF Site Summary, abbreviated RSS. (RDF is a standard for providing information in a machine-readable, XML format. See http://www.w3.org/RDF for more information.) The RSS 0.9 specification then forked into two diverging paths: RSS 1.0 updated the RSS 0.9 spec adhering to the RDF spec as well; RSS 0.91, which today is at version 2.0, dropped support for RDF and changed the acronym's meaning from RDF Site Summary to Really Simple Syndication. The RSS 1.0 specification can be found at http://web.resource.org/rss/1.0/spec; the RSS 2.0 specification is available at http://blogs.law.harvard.edu/tech/rss.

 

More and more Web sites today use either RSS 1.0 or RSS 2.0 to syndicate their content. For example, Slashdot.org uses RSS 1.0 to syndicate their latest stories. CNet's News.com Web and Microsoft's MSDN Web site both use RSS 2.0 to syndicate their latest articles. Virtually all personal blogs provide syndication through RSS 2.0, as well. These Web sites provide this syndication data at a specified URL. Slashdot.org's RSS 1.0 feed, for example, is available at http://slashdot.org/index.rss. The RSS feed for MSDN's latest articles is at http://msdn.microsoft.com/rss.xml.

 

Data syndicated with RSS is typically consumed by RSS aggregators. An RSS aggregator is a program that periodically checks RSS feeds from a number of Web sites and, if any new content is found, saves or displays the new content for viewing. There are a number of standalone desktop RSS aggregators, such as FeedDemon (http://www.bradsoft.com/feeddemon), SharpReader (http://www.sharpreader.net), and RssBandit (http://www.rssbandit.org). To use these RSS aggregators you simply indicate which RSS feeds interest you. The RSS aggregator then periodically checks the list of RSS feeds and downloads any new content. You can then, at your leisure, browse through the headlines or articles for each site. There are also RSS aggregators that operate inside of Outlook, like NewsGator (http://www.newsgator.com), as well as online RSS aggregators, such as BlogLines (http://www.bloglines.com).

 

RSS syndicated data can also be displayed on a Web page. For example, if you run a Web site with information on building Web applications using ASP.NET, you might want to provide links to Microsoft's latest articles that appeared in the ASP.NET Developer Center on MSDN. Rather than having to periodically check Microsoft's site and manually add links, a simpler approach would be to simply display the articles syndicated in the ASP.NET Developer Center's RSS feed.

 

In this article we're going to look at the RSS 2.0 specification in detail. We'll examine how to read an RSS feed and display the contents in an ASP.NET Web page. We will also take a look at a free, open-source ASP.NET control I created, RssFeed. Using RssFeed you'll be able to quickly add professional-looking syndicated content to your Web site with only having to write two lines of code!

 

Learn the RSS 2.0 Specification

The RSS 2.0 specification was designed as a syndication format for Web sites that publish new content on a regular basis. News sites, blogs, weather sites, or sites that publish articles or other content often, can benefit by syndicating their content online with RSS. Content is syndicated using an XML document (see Figure 1). The root element is , followed immediately by a element. The element contains information about the site syndicating the content, as well as the syndicated content itself.

 

  

    4GuysFromRolla.com Headlines

    http://www.4GuysFromRolla.com/

    The latest headlines from

                        4GuysFromRolla.com

    Copyright 2004 Jupitermedia

              Corporation All Rights Reserved.

    

      Using Menus in an ASP.NET Application

      http://4guysfromrolla.com/012804-1.aspx

      

        This article examines skmMenu, an open-source menu

        control.

      

      Tue, 28 Jan 2004 08:32:00 GMT

    

    

      How ASP.NET and IIS Work

      http://4guysfromrolla.com/011204-1.aspx

      

        This article looks at how ASP.NET Web pages are

        Handled by the IIS Web server.

      

      Mon, 12 Jan 2004 06:15:00 GMT

    

    

      Working with XML

      http://4guysfromrolla.com/010704-1.aspx

      

        Have you ever wondered how you can work with XML

        data in an ASP.NET Web page?   This article, by

        Jisun Lee, examines the XML classes in the .NET

        Framework.   Read on to learn more!

      

      Wed, 07 Jan 2004 12:09:00 GMT

    

  

Figure 1: An RSS 2.0 syndication feed contains an element for each of the site's recent content items. Elements preceding the elements provide information about the Web site.

 

Some of the elements that provide information about the site syndicating the content are shown in Figure 2. There are other elements available; refer to the specification for a complete list. The , <link>, and <description> elements are required; all other elements are optional.</p> <p>   </p> <table border="1" cellspacing="0" cellpadding="0"><tr><td width="92" valign="top"> <p> <b>Element</b></p> </td> <td width="248" valign="top"> <p> <b>Description</b></p> </td> </tr><tr><td width="92" valign="top"> <p> <title></p> </td> <td width="248" valign="top"> <p> Name of the channel. For example, the <title> for the ASP.NET Developer Center on MSDN is "MSDN: ASP.NET".</p> </td> </tr><tr><td width="92" valign="top"> <p> <link></p> </td> <td width="248" valign="top"> <p> URL of the site syndicating the content.</p> </td> </tr><tr><td width="92" valign="top"> <p> <description></p> </td> <td width="248" valign="top"> <p> Description of the site.</p> </td> </tr><tr><td width="92" valign="top"> <p> <copyright></p> </td> <td width="248" valign="top"> <p> Copyright notice.</p> </td> </tr><tr><td width="92" valign="top"> <p> <ttl></p> </td> <td width="248" valign="top"> <p> "Time to live;" value represents the number of minutes an RSS aggregator should cache the syndicated content before checking to see if there is new content.</p> </td> </tr></table><p><b>Figure 2:</b> Selected RSS <channel> elements.</p> <p>   </p> <p> The <item> element is used to provide information about a single piece of syndicated data. Depending on your Web site, this might be a news headline, a sports score, an article, an online tutorial, an FAQ, or any other discrete bit of content. The <item> element can contain a number of subelements that describe the content item in more detail. The germane ones are shown in Figure 3. Again, there are other elements that can appear in the <item> element. The <item> element must contain at least a <title> or <description> element - all other elements are optional.</p> <p>   </p> <table border="1" cellspacing="0" cellpadding="0"><tr><td width="87" valign="top"> <p> <b>Element</b></p> </td> <td width="248" valign="top"> <p> <b>Description</b></p> </td> </tr><tr><td width="87" valign="top"> <p> <title></p> </td> <td width="248" valign="top"> <p> Title of the content item. This might be the news headline or the name of the article.</p> </td> </tr><tr><td width="87" valign="top"> <p> <link></p> </td> <td width="248" valign="top"> <p> URL of the content item.</p> </td> </tr><tr><td width="87" valign="top"> <p> <description></p> </td> <td width="248" valign="top"> <p> Description of the content item.</p> </td> </tr><tr><td width="87" valign="top"> <p> <author></p> </td> <td width="248" valign="top"> <p> E-mail address of individual who authored the content item.</p> </td> </tr><tr><td width="87" valign="top"> <p> <pubDate></p> </td> <td width="248" valign="top"> <p> Date and time the content item was published. The date and time must conform to the format outlined by RFC #822.</p> </td> </tr></table><p><b>Figure 3:</b> Selected RSS <item> elements.</p> <p>   </p> <p> For each content item you want to syndicate, add an <item> element. Realize that RSS is designed to syndicate <i>recent</i> content. That is, you don't want to have an <item> tag for every single news story or article on your Web site. Rather, use RSS to syndicate the 25 latest news stories, or the 10 most recent articles.</p> <p>   </p> <p>Consume RSS in an ASP.NET Web Page</p> <p> Although RSS syndication feeds are typically used to display content in a desktop application, RSS feeds can also be tapped by ASP.NET Web pages, thereby showing the latest headlines in a Web page. Typically sites that syndicate their content only provide the headline and a brief description of the news item or article. We can consume this RSS feed and display the headlines on our site as hyperlinks pointing back to the content item on the site from where the syndication comes. Syndicated-related content in your Web site offers two advantages:</p> <ol><li>Your users benefit because your Web site now has information available. </li> <li>You, as the developer maintaining the Web site, benefit because the syndicated content is automatically pulled down. That is, you don't have to go find the latest articles and manually add them to your site. </li> </ol><p>   </p> <p> The first challenge in displaying syndicated content in an ASP.NET Web page is somehow accessing the RSS feed's XML data from the Web site from where the content is being syndicated. Fortunately, the .NET Framework's classes that work with XML can easily slurp XML content from a remote URL.</p> <p>   </p> <p> The next challenge is deciding how to display the XML content. There are two basic approaches that can be used: one is to use an XSLT stylesheet to translate the RSS XML into HTML. Another approach is to iterate through the XML data and build up the proper markup for rendering the syndicated content.</p> <p>   </p> <p> For this article, let's examine how to render the content by building up the HTML content ourselves, iteratively. We're going to head down this path because our goal is to build a reusable, custom server control that displays content from an RSS feed. This custom, compiled control we'll be creating will iteratively build up its content based on the specified RSS feed, just like a DataGrid, DataList, or Repeater iteratively builds itself from the specified DataSource.</p> <p>   </p> <p>Load the XML and Iterate through the <item> Elements</p> <p> There are myriad classes in the .NET Framework for working with XML documents, each offering tradeoffs of functionality versus performance. The <b>XmlTextReader</b> class, for example, provides the most efficient access to reading an XML document, but is read-only and cannot navigate the document using XPath expressions. (XPath is a syntax for referencing particular elements in an XML document.) The <b>XmlDocument</b> class provides read/write access and XPath expressions, but is the least efficient of the XML-related classes. If you need read-only access with XPath expression capabilities, the <b>XPathDocument</b> class is the best choice, since it offers better performance than the <b>XmlDocument</b> class. (For a more thorough discussion on techniques for accessing XML data, be sure to read Aaron Skonnard's article ".NET XML Best Practices" at <a href="http://support.softartisans.com/kbview.aspx?ID=673">http://support.softartisans.com/kbview.aspx?ID=673</a>.)</p> <p>   </p> <p> Let's create an ASP.NET Web page that allows the visitor to enter the URL to an RSS feed, and then displays the results of the feed in an HTML <table>. Our first steps are to create the page's user interface elements. Start by adding a TextBox Web control with an ID property of <b>txtRSSURL</b>, and a Button Web control. The user will enter the RSS feed URL in the TextBox, and then click the Button to view its information. Beneath the Button, place a Table Web control with an ID of <b>tblFeedOutput</b> (see Figure 4). Once the user clicks the Button, we'll programmatically build up the Table Web control based on the contents of the specified RSS feed.</p> <p>   </p> <p><img width="333" height="259" src="/content/legacy/images/asp200407sm_f_image002.jpg" class="old-inline-image"><br><b>Figure 4:</b> Create an ASP.NET Web page with TextBox, Button, and Table Web controls. The visitor will be able to specify an RSS feed URL, click the Button, and have the feed's content displayed in the Table.</p> <p>   </p> <p> Once you've created the UI elements, double-click on the Button Web control to create an event handler for the Button's Click event. In the click event handler, create an <b>XPathDocument</b> object that retrieves the XML data from the RSS feed URL specified by the visitor. Next, create an <b>XPathIterator</b> and iterate through the <item> elements. This is accomplished by building an <b>XPathExpression</b> object using the XPath query /rss/channel/item. While looping through each <item> element, pick out the value of the <title>, <link>, and <description> elements.</p> <p>   </p> <p> With each <item> element encountered, create new TableRow and TableCell objects. The TableCell will contain the value of the content item's <title> element, rendered as a hyperlink if a <link> element is provided. Finally, the <description> element's value should be displayed (see Figure 5).</p> <p>   </p> <p>private void btnDispRSS_Click(object sender, EventArgs e)</p> <p>{</p> <p>  // Get the RSS feed.</p> <p>  XPathDocument xpDoc = new XPathDocument(txtRSSURL.Text);</p> <p>  XPathNavigator xpNav = xpDoc.CreateNavigator();</p> <p>  XPathExpression expr =</p> <p>    xpNav.Compile("/rss/channel/item");</p> <p>  // Compile the XPath expressions.</p> <p>  XPathExpression titleExpr =</p> <p>    xpNav.Compile("string(title/text())");</p> <p>  XPathExpression linkExpr =</p> <p>    xpNav.Compile("string(link/text())");</p> <p>  XPathExpression descExpr =</p> <p>    xpNav.Compile("string(description/text())");</p> <p>  XPathNodeIterator iter = xpNav.Select(expr);</p> <p>  // Iterate through the <items>.</p> <p>  while (iter.MoveNext())</p> <p>  {</p> <p>    // Get the title/link/description values.</p> <p>    string title =</p> <p>       (string)iter.Current.Evaluate(titleExpr);</p> <p>    string link = (string)iter.Current.Evaluate(linkExpr);</p> <p>    string desc = (string)iter.Current.Evaluate(descExpr);</p> <p>    // Create a TableRow and TableCell.</p> <p>    TableRow tr = new TableRow();</p> <p>    TableCell tc = new TableCell();</p> <p>    // Create a HyperLink.</p> <p>    HyperLink hl = new HyperLink();</p> <p>    if (title.Length > 0)</p> <p>      hl.Text = title;</p> <p>    else</p> <p>      hl.Text = desc;</p> <p>    if (link.Length > 0)</p> <p>      hl.NavigateUrl = link;</p> <p>    tc.Controls.Add(hl);</p> <p>    if (desc.Length > 0)</p> <p>      tc.Controls.Add(new LiteralControl("<br />" + desc));</p> <p>    tr.Cells.Add(tc);    // Add the cell to the row.</p> <p>    // Add the row to the table.</p> <p>    tblFeedOutput.Rows.Add(tr);</p> <p>  }</p> <p>}</p> <p> <b>Figure 5:</b> A Table Web control is constructed as the RSS feed is iterated.</p> <p>   </p> <p> Notice that the URL the user specified in the <b>txtRSSURL</b> TextBox Web control is passed into the <b>XPathDocument</b> constructor. This is one way to load an external XML file into an <b>XPathDocument</b>. Once the <b>XPathDocument</b> has been created, we create an <b>XPathNavigator</b> object using the <b>CreateNavigator</b> method of the <b>XPathDocument</b> class. An <b>XPathNavigator</b> can be used to iterate through the elements that result in an XPath expression.</p> <p>   </p> <p> To iterate through a set of elements, we first need to define the XPath expressions, which is done through the <b>XPathExpression</b> object. Here we create four <b>XPathExpression</b> objects: one for the XPath expression to iterate through the <item> elements (/rss/channel/item), and three to get the string value from the <title>, <link>, and <description> elements inside a particular <item> element.</p> <p>   </p> <p> Once we have created these <b>XPathExpression</b> objects we can use them in a couple of ways. The <b>XPathNavigator</b> class provides a <b>Select</b> method that takes an <b>XPathExpression</b> object as input and returns an <b>XPathNodeIterator</b> for iterating over the elements selected by the XPath query. We use this method to iterate through the <item> elements. The <b>XPathNavigator</b> also contains an <b>Evaluate</b> method that can be used to obtain the result of an XPath query. We use <b>Evaluate</b> to get the text content from the <title>, <link>, and <description> elements. (Note that the <b>Evaluate</b> method isn't called from the <b>XPathNavigator</b> created from the <b>XPathDocument</b>, but rather from the current <item> element - <b>iter.Current</b>.)</p> <p>   </p> <p> After retrieving title, link, and description values from the current <item> element, TableRow and TableCell objects are created. The TableCell has a HyperLink and LiteralControl added to its <b>Controls</b> collection, displaying a hyperlink with the <item> element's <title> and <link> element values, as well as the <description> element value. Next, this TableCell is added to the TableRow's <b>Cells</b> collection. Finally, the TableRow is added to the <b>tblFeedOutput</b> Table's <b>Rows</b> collection.</p> <p>   </p> <p> When a user visits this ASP.NET Web page and enters a URL to a valid RSS feed, they will see the contents of the RSS feed as an HTML <table>. The appearance of the RSS feed items can be configured by tweaking the Table Web control's style properties (see Figure 6). (Typically you won't want to require that your visitors enter the URL of an RSS feed to view. Rather, you will have a predefined list of RSS feeds whose syndicated content complements your Web site.)</p> <p>   </p> <p> <img width="333" height="295" src="/content/legacy/images/asp200407sm_f_image004.jpg" class="old-inline-image"><br><b>Figure 6:</b> The latest articles from Microsoft's MSDN Web site are displayed.</p> <p>   </p> <p>Create a Custom ASP.NET Server Control</p> <p> While the code examined in Figure 5 adequately displays the contents of an RSS feed, it's lacking in a few areas:</p> <ul><li>The code, in its current state, isn't apt for reuse. Right now, you'd have to copy and paste code from one page to another to display an RSS feed in a different page. </li> <li>Customizing the appearance of the rendered RSS feed requires that you manually adjust the style of the Table Web control. </li> <li>Rearranging the Table's contents - perhaps not showing the <description> element's value, or displaying it italicized - requires that the source code be edited and the project rebuilt. </li> </ul><p>   </p> <p> We can surmount all these issues by creating a custom ASP.NET server control designed to display RSS feed content. I have created such a control, called RssFeed, which is freely available with complete source code from the RssFeed GotDotNet workspace (<a href="http://workspaces.gotdotnet.com/RssFeed">http://workspaces.GotDotNet.com/RssFeed</a>).</p> <p>   </p> <p> In addition to overcoming the shortcomings previously listed, RssFeed offers the following features:</p> <ul><li>Works with both RSS 1.0 and RSS 2.0 feeds. </li> <li>For RSS 2.0 feeds, reads in the <author>, <category>, and <pubDate> elements as well as the <title>, <link>, and <description>. </li> <li>Reads in the <channel> element's <title> and <link> elements. </li> <li>Provides <b>AlternatingItemStyle</b> and <b>ItemStyle</b> properties, just like the DataGrid and DataList. </li> <li>Allows page developers to customize the appearance of the syndicated data through the use of templates. </li> </ul><p>   </p> <p> A thorough examination of RssFeed is far beyond the scope of this article. However, I do invite you to download RssFeed, use it on your Web sites, and study its code. You can find more information about RssFeed, including extensive documentation, getting started articles, the complete source code, and live demos, at <a href="http://scottonwriting.net/sowblog/RssFeed.htm">http://scottonwriting.net/sowblog/RssFeed.htm</a>.</p> <p>   </p> <p> Happy Programming!</p> <p>   </p> <p> The sample code in this article is available for <a href="/content/legacy/downloads/asp200407sm_f.zip">download</a>.</p> <p>   </p> <p>Speaker, author, and teacher, <b>Scott Mitchell</b> is the editor and founder of 4GuysFromRolla.com, one of the largest ASP resource sites on the Web. He has been avidly using and writing about Active Server Pages since January 1998. He's authored several hundred ASP-related articles on 4Guys along with numerous beginner- and advanced-level books on Active Server Pages and ASP.NET. Scott can be reached at <a href="mailto:mitchell@4guysfromrolla.com">mailto:mitchell@4guysfromrolla.com</a>. You can find his weblog at <a href="http://scottonwriting.net/">http://ScottOnWriting.NET</a>.</p> <p>   </p> <p>   </p> <p>   </p> </div> <div class="secondary-tags"> TAGS: <a href="/software-development" class="secondary-tag">Software Development</a> </div> <div class="comments-wrapper" id="comments-3917"> <div class="comments"> <a href="javascript:void(0)" class="comments--show hidden">0 comments</a> </div> <div class="comments-container"> <div class="fill-comments"> <div class="comments-header"><span class="comments--hide">Hide comments</span></div> <form class="comment-form" action="/comment/reply/3917" method="post" id="comment-form" accept-charset="UTF-8"><div><div class="user-comment-body"> <div class="user-comment-field"> <div class="user-photo"> <img class="user-thumb-img" src="https://www.itprotoday.com/sites/all/themes/penton_core_theme/images/account-default-image.png" alt="" /> </div> <div class="user-content"> <div class="user-name"> <a href="/" class="js-penton-user-url-profile"></a> </div> <div class="user-comment"> <div class="field-type-text-long field-name-comment-body field-widget-text-textarea form-wrapper" id="comment_body"><div id="comment-body-add-more-wrapper"><div class="text-format-wrapper"><div class="form-item form-type-textarea form-item-comment-body-und-0-value"> <label class="element-invisible" for="edit-comment-body-3917">Comment <span class="form-required" title="This field is required.">*</span></label> <div class="form-textarea-wrapper resizable"><textarea class="text-full ckeditor-mod form-textarea required" placeholder="Be the first to comment..." id="edit-comment-body-3917" name="comment_body[und][0][value]" cols="60" rows="5"></textarea></div> </div> <fieldset class="filter-wrapper element-invisible form-wrapper" id="edit-comment-body-und-0-format"><div class="fieldset-wrapper"><div class="filter-help form-wrapper" id="edit-comment-body-und-0-format-help"><p><a href="/filter/tips" target="_blank">More information about text formats</a></p></div><div class="form-item form-type-select form-item-comment-body-und-0-format"> <label for="edit-comment-body-und-0-format--2">Text format </label> <select class="filter-list form-select" id="edit-comment-body-und-0-format--2" name="comment_body[und][0][format]"><option value="comments" selected="selected">Comments</option><option value="plain_text">Plain text</option></select> </div> <div class="filter-guidelines form-wrapper" id="edit-comment-body-und-0-format-guidelines"><div class="filter-guidelines-item filter-guidelines-comments"><h3>Comments</h3><ul class="tips"><li>Allowed HTML tags: <em> <strong> <blockquote> <br> <p></li></ul></div><div class="filter-guidelines-item filter-guidelines-plain_text"><h3>Plain text</h3><ul class="tips"><li>No HTML tags allowed.</li><li>Web page addresses and e-mail addresses turn into links automatically.</li><li>Lines and paragraphs break automatically.</li></ul></div></div></div></fieldset> </div> <a href="#" class="element-invisible publish js-publish user-comment__publishbtn">Publish</a><span class='comment-error'><a href="/penton_modal/nojs/login" class="ctools-use-modal ctools-modal-modal-popup-login" rel="nofollow">Log in or register to comment</a></span></div></div> </div> </div> </div> </div> <input type="hidden" name="cid" value="" /> <input type="hidden" name="pid" value="" /> <input type="hidden" name="form_build_id" value="form-6KImr1CONNq1g0iy1zK2R8v1whFIUB3ibGDYEwlExPI" /> <input type="hidden" name="form_id" value="comment_node_article_form" /> <input type="hidden" name="honeypot_time" value="1537876008|r2fDfgH7aGsNDY8FIMis5P7C0oBFLMazTYQIkoRcFn4" /> <input type="hidden" name="captcha_sid" value="44608569" /> <input type="hidden" name="captcha_token" value="d5303d6832d22a044bc104024251c77b" /> <div class="element-invisible"><div class="form-actions form-wrapper" id="edit-actions"><button id="edit-submit-3917" name="op" value="Save" class="form-submit">Save</button> </div></div><div class="url-textfield"><div class="form-item form-type-textfield form-item-url"> <label for="edit-url">Leave this field blank </label> <input autocomplete="off" type="text" id="edit-url" name="url" value="" size="20" maxlength="128" class="form-text" /> </div> </div></div></form> <div class="comments-inner-container"> </div> </div> </div> </div> </div> <div class="row related-articles-row"> <div class="related-articles-heading">Related</div><div class="related-articles-wrapper"><a href="/web-development/devoptics-enables-companies-track-progress-toward-devops-model" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/Screen%20Shot%202018-07-23%20at%207.42.33%20PM_2.png?itok=DPlRcI8Z" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/Screen%20Shot%202018-07-23%20at%207.42.33%20PM_2.png?itok=xX0ghDSH" width="90" height="83" alt="Gears" /></div><div class="small-article__inner"><div class="small-article__inner-title">DevOptics Enables Companies to Track Progress Toward DevOps Model</div><span>Jul 24, 2018</span></div></article></a><a href="/web-development/open-source-licensing-why-gpls-heyday-over" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/Screen%20Shot%202018-07-22%20at%208.37.04%20PM_0.png?itok=Haxkpklg" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/Screen%20Shot%202018-07-22%20at%208.37.04%20PM_0.png?itok=O_HZkx1D" width="90" height="83" alt="code" /></div><div class="small-article__inner"><div class="small-article__inner-title">Open Source Licensing: Why the GPL's Heyday Is Over</div><span>Jul 23, 2018</span></div></article></a><article class="dfp-ad-hideempty hidden n_hidden small-article" data-dfp-position="native_related"></article><a href="/web-development/twitter-beats-back-group-bias-lawsuit-female-engineer" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/twitter.jpg?itok=aeLuPtlp" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/twitter.jpg?itok=C8FRdHdV" width="90" height="83" alt="twitter" /></div><div class="small-article__inner"><div class="small-article__inner-title">Twitter Beats Back Group-Bias Lawsuit by Female Engineer</div><span>Jul 04, 2018</span></div></article></a><a href="/web-development/apple-merge-ios-mac-apps-make-developer-work-go-further" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/GettyImages-846148982.jpg?itok=IOvbsBKM" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/GettyImages-846148982.jpg?itok=52JLdsju" width="90" height="83" alt="Apple Holds Product Launch Event At New Campus In Cupertino" /></div><div class="small-article__inner"><div class="small-article__inner-title">Apple to Merge iOS, Mac Apps to Make Developer Work Go Further</div><span>Jun 05, 2018</span></div></article></a></div> </div> <div class="item-list"><ul class="lazy-pagination"><li class="read-more pagination-read-more next first last"><a href="/premisecloud/microsoft-learn-and-role-based-certifications-announced?parent=3917&infscr=1" rel="nofollow">Load More</a></li> </ul></div> </article> </section> </div> </div> </div> </div> <div class="banner-bottom-wrapper"> <div id="banner-bottom" class="dfp-ad-hideempty hidden"> <div data-dfp-position="bottom_banner"></div> </div> </div> <!-- /Main Content Area --> <!-- Footer --> <!-- Check to see if we are in the store --> <footer class="l-footer l-footer-min "> <div class="l-footer-inner"> <div class="l-footer-info"> <div class="footer-logo-min"> <a href="/"><img class="footer-logo-min__site_logo" src="https://www.itprotoday.com/sites/all/themes/penton_subtheme_itprotoday/images/logos/footer.png" alt="Logo" /></a> <div class="small-12 medium-5 columns"> <div class="footer-links"> <a href="https://informa.com/"><img src="/sites/all/themes/penton_core_theme/images/powered_by_informa_businessline.png" alt="Powered by Informa" /></a> </div> </div> </div> <ul class="footer-min-col"> <li class="footer-min-col__item"> <a href="/about-us" class="footer-min-col-link">About</a> </li> <li class="footer-min-col__item"> <a href="https://www.itprotoday.com/advertise-itprotodaycom" class="footer-min-col-link">Advertise</a> </li> <li class="footer-min-col__item"> <a href="/contact-us" class="footer-min-col-link">Contact Us</a> </li> <li class="footer-min-col__item"> <a href="/sitemap" class="footer-min-col-link">Sitemap</a> </li> </ul> <ul class="footer-min-col no-margin"> <li class="footer-min-col__item"> <a href="http://www.penton.com/privacy-policy#ThirdPartyAdvertisingTech" class="footer-min-col-link">Ad Choices</a> </li> <li class="footer-min-col__item"> <a href="http://engage.informa.com/privacy-statement" class="footer-min-col-link">Privacy Policy</a> </li> <li class="footer-min-col__item"> <a href="http://engage.informa.com/terms-of-service" class="footer-min-col-link">Terms of Service</a> </li> <li class="footer-min-col__item"> <a href="https://engage.informa.com/cp/cookie-policy/" class="footer-min-col-link">Cookie Policy</a> </li> </ul> <div class="social-min-col"> <p class="social-min-col__label">Follow us:</p> <div class="social-icons"><a href="https://www.facebook.com/ITProToday/" title="" class="social-icons__link"><i class="social-icons__icon fa fa-facebook"></i></a><a href="https://twitter.com/ITProToday" title="" class="social-icons__link"><i class="social-icons__icon fa fa-twitter"></i></a><a href="https://plus.google.com/115563256559407060026 " title="" class="social-icons__link"><i class="social-icons__icon fa fa-google-plus"></i></a><a href="https://www.linkedin.com/groups/1163947" title="" class="social-icons__link"><i class="social-icons__icon fa fa-linkedin"></i></a></div></div> </div> <div class="l-footer-rights"> <span class="copyrights"> © 2018 Informa USA, Inc., All Rights Reserved </span> </div> </div> </footer> <!-- /Footer --> </div> </div> </div> </main> <!-- /Page --> <div id="hidden-dfp" class="dfp-ad-hideempty hidden"> <div data-dfp-position="hidden" class="hidden-for-ads"></div> </div> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_KUtWmy_QP6atnDjXwpDAH183eelDuv-2PY5ksEFKvNQ.js"></script> <script type="text/javascript" src="https://www.googletagservices.com/tag/js/gpt.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_s3L_uC35AiN5EGYY533su-jccnLRp2aKpOnjgPLbo34.js"></script> <script type="text/javascript" src="//assets.adobedtm.com/2ebe67d2ca0193084439038012c34f9112a85c00/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_eOe-hGqK6-bRjj7DQYO_Y-oCu3MIoF2vYxLUbQbtu4I.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_2h17_kRDS97bAi9pF-W7es7DLWc108u3KeFxWQr035M.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- window.CKEDITOR_BASEPATH = "/sites/all/modules/contrib/ckeditor/ckeditor/" //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_FloLC-L2hL--gn7qKaXXBNWxL6qI_-SL4q2_WBFL5X4.js"></script> <script type="text/javascript" src="//video.limelight.com/player/embed.js"></script> <script type="text/javascript" src="https://embed.calculoid.com/scripts/combined.min.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_uk9tggR7LUt24uKijCBrSJ5qhPl8YykfBihM_uf9QrE.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_custom_dfp = {"dfp_tags":{"everywhere":[],"article":{"right_rail_rect":[{"disabled":false,"api_version":1,"machinename":"_article_right_rail_rect","slot":"[article] [article] Right rail rect","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"right_rail_rect","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"inarticle1":[{"disabled":false,"api_version":1,"machinename":"article_300_1_rht_infinite","slot":"[article] Rectangle Inline 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle1","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"inarticle2":[{"disabled":false,"api_version":1,"machinename":"article_300_2_rht_infinite","slot":"[article] Rectangle Inline 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle2","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"inarticle3":[{"disabled":false,"api_version":1,"machinename":"article_300_3_rht_infinite","slot":"[article] Rectangle Inline 3","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle3","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"inarticle4":[{"disabled":false,"api_version":1,"machinename":"article_300_4_rht_infinite","slot":"[article] Rectangle Inline 4","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle4","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"left_rail_rect":[{"disabled":false,"api_version":1,"machinename":"article_300_x_lft","slot":"[article] Left rail 300_x_lft","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[300,250],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"left_rail_rect","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_lft"}],"breakpoints":[{"browser_size":"779x0","ad_sizes":"300x250"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"jumbotron":[{"disabled":false,"api_version":1,"machinename":"article_300_x_rht","slot":"[article] Rectangle Inline and Jumbotron","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"jumbotron","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"top_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_1_a","slot":"[article] Leaderboard 728_1_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[970,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"top_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_1_a"},{"target":"program","value":"[node:program_without_space_specialchars]"},{"target":"ptype","value":"[node:field_penton_article_type]"},{"target":"nid","value":"[node:nid]"},{"target":"pterm","value":"[node:pterm_without_space_specialchars]"},{"target":"sterm","value":"[node:sterm_without_space_specialchars]"},{"target":"author","value":"[node:author_without_space_specialchars]"},{"target":"combo","value":"wrap"},{"target":"content","value":"[node:program_without_space_specialchars]"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"970x90,728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[[970,90],[728,90]],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_1_a"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"bottom_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_footer","slot":"[article] Leaderboard 728_10_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"bottom_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_10_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_10_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"hidden":[{"disabled":false,"api_version":1,"machinename":"article_canopy","slot":"[article] Canopy","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"adhesion"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"adhesion"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_footnote_floor","slot":"[article] Footnote_Floor","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"footnote"},{"target":"gdpr_banner","value":"off"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"footnote"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_oop","slot":"[article] Out of Page","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[0,0],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"oop_a"},{"target":"gdpr_banner","value":"off"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"oop_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_pagewrap","slot":"[article] PageWrap","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"}],"breakpoints":[{"browser_size":"1500x0","ad_sizes":"1x1"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[1,1],"browser_size":[1500,0]}],"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_header":[{"disabled":false,"api_version":1,"machinename":"article_ccc_header","slot":"[article] Article CCC header","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[160,65],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_header","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_resources":[{"disabled":false,"api_version":1,"machinename":"article_ccc_resources","slot":"[article] Article CCC resources","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[160,65],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_resources","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo2"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo2"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"inarticlevid":[{"disabled":false,"api_version":1,"machinename":"article_in_article_video_ad","slot":"[article] In-Article Video Ad","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticlevid","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"infinitescroll":[{"disabled":false,"api_version":1,"machinename":"article_interscroller_728_x_a","slot":"[article] Interscroller\/Leaderboard 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"infinitescroll","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_2_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_2_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo","slot":"[article] Sponsored Logo","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"sponsoredlogo"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo_weather":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo_weather","slot":"[article] Sponsored Logo Weather","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo_weather","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo_weather"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"sponsoredlogo_weather"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"3917"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"software_development"},{"target":"author","value":"scott_mitchell"},{"target":"reg","value":"anonymous"}]}]}},"current_type":"article","default_adunit":"\/3834\/itprotoday.home","async_rendering":1,"single_request":0,"collapse_empty_divs":"1","viewport":1,"lifetime_banner":"2000","do_byline":0,"enable_sticky":1,"enable_cb_refresh":0,"cb_refresh_interval":"15","is_blocked_ip":false,"uip":"54.225.59.14"}; //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_m0Qm7ZLBa0Us5bK_pvZ1T3hMtRZOtWiklopETCWH6Qk.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_eloqua_api = {"fields":["nl","utm_rid"]}; //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_2QLg0QavkHsRBi6FWUcTxM-mYPG7L5TNgt9uS3ypY4Q.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_C3Oq_2WmTdDwWwi0aeViDSNHfrYR_mwn7Gj89E6Ojx0.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_KIwLxGMqoJtHLuCU1tBsjwRtZcXqJAAPjkc5R7V3izE.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"penton_subtheme_itprotoday","theme_token":"DKiZ8UfBRZcx8PhAWQl7suPPHHA769hNkpwCtlRtRzA","jquery_version":"1.10","js":{"sites\/all\/modules\/custom\/penton_gdpr\/js\/penton_gdpr.js":1,"sites\/all\/modules\/contrib\/ckeditor\/includes\/ckeditor.utils.js":1,"sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/ckeditor.js":1,"sites\/all\/modules\/custom\/penton_adobe_dtm\/js\/penton_adobe_dtm.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery\/1.10\/jquery.min.js":1,"misc\/jquery.once.js":1,"https:\/\/www.googletagservices.com\/tag\/js\/gpt.js":1,"misc\/drupal.js":1,"\/\/assets.adobedtm.com\/2ebe67d2ca0193084439038012c34f9112a85c00\/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/ui\/minified\/jquery.ui.core.min.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/external\/jquery.cookie.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery.form\/4\/jquery.form.min.js":1,"misc\/form.js":1,"misc\/ajax.js":1,"sites\/all\/modules\/contrib\/jquery_update\/js\/jquery_update.js":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_user_registration.js":1,"sites\/all\/modules\/custom\/penton_user_register\/js\/penton_user_register.js":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.js":1,"0":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_popup.js":1,"\/\/video.limelight.com\/player\/embed.js":1,"https:\/\/embed.calculoid.com\/scripts\/combined.min.js":1,"sites\/all\/modules\/contrib\/authcache\/authcache.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/data-render.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/viewport.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.dom.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.iframe.js":1,"1":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.sticky.js":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/eloqua_tracking.js":1,"2":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/cookies.helper.js":1,"misc\/progress.js":1,"sites\/all\/modules\/contrib\/ctools\/js\/modal.js":1,"sites\/all\/modules\/custom\/penton_social\/js\/penton_social.js":1,"sites\/all\/modules\/contrib\/prevent_js_alerts\/prevent_js_alerts.js":1,"sites\/all\/modules\/contrib\/captcha\/captcha.js":1,"sites\/all\/modules\/custom\/penton_comment\/scripts\/comments.js":1,"sites\/all\/modules\/contrib\/service_links\/js\/pinterest_button.js":1,"misc\/textarea.js":1,"modules\/filter\/filter.js":1,"sites\/all\/themes\/penton_core_theme\/public\/scripts.js":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/client.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/alert.js":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"modules\/system\/system.theme.css":1,"misc\/ui\/jquery.ui.core.css":1,"misc\/ui\/jquery.ui.theme.css":1,"modules\/book\/book.css":1,"modules\/comment\/comment.css":1,"sites\/all\/modules\/contrib\/date\/date_api\/date.css":1,"modules\/field\/theme\/field.css":1,"sites\/all\/modules\/contrib\/logintoboggan\/logintoboggan.css":1,"modules\/node\/node.css":1,"modules\/search\/search.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_order\/uc_order.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_product\/uc_product.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_store\/uc_store.css":1,"modules\/user\/user.css":1,"sites\/all\/modules\/contrib\/views\/css\/views.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css":1,"sites\/all\/modules\/features\/penton_people_search\/penton_people_search.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/ctools.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/modal.css":1,"sites\/all\/modules\/contrib\/forward\/forward.css":1,"sites\/all\/modules\/contrib\/print\/print_ui\/css\/print_ui.theme.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.editor.css":1,"modules\/filter\/filter.css":1,"sites\/itprotoday.com\/files\/honeypot\/honeypot.css":1,"sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/user.css":1,"sites\/all\/themes\/penton_core_theme\/public\/style.ie9.css":1,"https:\/\/embed.calculoid.com\/styles\/main.css":1}},"authcache":{"q":"node\/3917","cp":{"path":"\/","domain":".www.itprotoday.com","secure":true},"cl":390},"typekitId":"njq2hxj","adunit":"\/3834\/itprotoday.home","polar_property_id":"NA-ITPRCOM-11238907","is_new_welcome_ad":1,"is_new_article_view":false,"penton_eloqua_api":{"eloqua_site_id":null,"tracking_enabled":null},"CToolsModal":{"loadingText":"Loading...","closeText":"Close Window","closeImage":"\u003Cimg src=\u0022https:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/icon-close-window.png\u0022 alt=\u0022Close window\u0022 title=\u0022Close window\u0022 \/\u003E","throbber":"\u003Cimg src=\u0022https:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/throbber.gif\u0022 alt=\u0022Loading\u0022 title=\u0022Loading...\u0022 \/\u003E"},"modal-popup-small":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-medium":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-large":{"modalSize":{"type":"scale","width":0.8,"height":0.8},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-x-large":{"modalSize":{"type":"scale","width":1100,"height":850},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupXLarge"},"modal-popup-basic":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasic"},"modal-popup-basic-email":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasicEmail"},"modal-popup-advanced":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupAdvanced"},"modal-popup-login":{"modalSize":{"type":"fixed","width":545,"height":485},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupLogin"},"modal-popup-legal-comm":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupLegalComm"},"modal-popup-validation-prompt":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupValidationPrompt"},"gdpr_countries":[],"prevent_js_alerts":{"module_path":"sites\/all\/modules\/contrib\/prevent_js_alerts"},"ws_pb":{"countlayout":"horizontal"},"penton_adobe_dtm":{"user":{"profile":{"profileInfo":{"profileID":"null"}},"segment":{"loginStatus":"unreg","permission":"anonymous"}},"page":{"pageInfo":{"pageName":"Displaying Syndicated Content","pageID":"3920983d-b913-452c-8c22-a8833816d21e","author":"Scott Mitchell","issueDate":"Oct 30, 2009"},"destinationURL":"https:\/\/www.itprotoday.com\/web-development\/displaying-syndicated-content","category":{"pageType":"article","primaryCategory":"Software Development \u003E Web Development"},"attributes":{"taxonomy":"Web Development|Software Development","permission":"public","subType1":"Article","subType2":"","visibility":"visible","programs":"","scrollCount":"10","scrollPosition":"1_of_10","countsTowardGoal":""}}},"penton_adobe_dtm_events":[],"penton_gdpr":{"banner":"\u003Cdiv\u003E\n \u003Cdiv class=\u0022gdpr-popup-border\u0022\u003E\n \u003Cdiv class=\u0022gdrp-popup-content\u0022\u003E\n \u003Cdiv id=\u0022popup-text\u0022\u003E\n This website uses cookies, including third party ones, to allow for analysis of how people use our website in order to improve your experience and our services. By continuing to use our website, you agree to the use of such cookies. Click here for more information on our \u003Ca href=\u0022http:\/\/corporate.knect365.com\/privacy-centre\/our-cookie-policy\/\u0022 target=\u0022_blank\u0022\u003ECookie Policy\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/knect365.com\/privacy-policy\u0022 target=\u0022_blank\u0022\u003EPrivacy Policy\u003C\/a\u003E.\u200b \u003C\/div\u003E\n \u003Cdiv id=\u0022popup-buttons\u0022\u003E\n \u003Cspan class=\u0022close-button\u0022\u003E\u0026times;\u003C\/span\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n\u003C\/div\u003E\n"},"ckeditor":{"input_formats":{"comments":{"customConfig":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.config.js?","defaultLanguage":"en","toolbar":"[\n [\u0027Bold\u0027,\u0027Italic\u0027,\u0027Blockquote\u0027]\n]","enterMode":1,"shiftEnterMode":2,"toolbarStartupExpanded":true,"width":"100%","skin":"bootstrapck","format_tags":"p;div;pre;address;h1;h2;h3;h4;h5;h6","show_toggle":"f","default":"f","ss":2,"loadPlugins":[],"entities":false,"entities_greek":false,"entities_latin":false,"scayt_autoStartup":false,"language":"en","scayt_sLang":"en_US","js_conf":{"extraPlugins":"\u0027autogrow\u0027","autoGrow_minHeight":"100","autoGrow_maxHeight":"600","fullPage":true},"stylesCombo_stylesSet":"drupal:\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.styles.js","contentsCss":["\/sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css?pexrkw","\/sites\/all\/themes\/penton_core_theme\/public\/vendor.css?pexrkw","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css?pexrkw","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css?pexrkw","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css?pexrkw","\/sites\/all\/themes\/penton_core_theme\/public\/override\/user.css?pexrkw","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?pexrkw","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?pexrkw"]}},"plugins":[],"textarea_default_format":{"edit-comment-body-3917":"comments"},"module_path":"\/sites\/all\/modules\/contrib\/ckeditor","editor_path":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/","ajaxToken":"aP39SAxviS5-vzP1X4m9lyFTkzLGWLjR4QagtBpcCF8","xss_url":"\/ckeditor\/xss","theme":"penton_subtheme_itprotoday","elements":{"edit-comment-body-3917":"comments"},"scayt_language":"en_US"},"ajax":{"edit-submit-3917":{"callback":"penton_comment_comment_add","event":"mousedown","keypress":true,"prevent":"click","url":"\/system\/ajax","submit":{"_triggering_element_name":"op","_triggering_element_value":"Save"}}},"urlIsAjaxTrusted":{"\/system\/ajax":true,"\/comment\/reply\/3917":true}}); //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_39wR4vuLCUZcIK_NsEhVLhl6834Dd3heLLFQ5DLVNsc.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/all/modules/contrib/ckeditor/ckeditor/ckeditor.js?pexrkw"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_hTvEvnr-CSP0ayePYXq_lDVR4Xlir2rUBDh7jP_21fI.js"></script> </div> </body> </html>