<?xml version="1.0"?>
<News hasArchived="true" page="8466" pageCount="10726" pageSize="10" timestamp="Thu, 16 Jul 2026 21:09:39 -0400" url="https://my3.my.umbc.edu/posts.xml?page=8466">
<NewsItem contentIssues="true" id="33438" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33438">
<Title>Create an HTML newsletter</Title>
<Body>
<![CDATA[
    <div class="html-content">Daniel Bramhall explains how to better engage potential customers with your newsletters, and looks at why outdated solutions are still so often used these days<br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcreate-html-newsletter&amp;t=Create+an+HTML+newsletter" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcreate-html-newsletter&amp;t=Create+an+HTML+newsletter" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcreate-html-newsletter&amp;t=Create+an+HTML+newsletter" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcreate-html-newsletter&amp;t=Create+an+HTML+newsletter" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.netmagazine.com%2Ftutorials%2Fcreate-html-newsletter&amp;t=Create+an+HTML+newsletter" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/172487609149/u/49/f/502346/c/32632/s/2f6dc7c7/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/172487609149/u/49/f/502346/c/32632/s/2f6dc7c7/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>Daniel Bramhall explains how to better engage potential customers with your newsletters, and looks at why outdated solutions are still so often used these days      </Summary>
<Website>http://feedproxy.google.com/~r/net/topstories/~3/voC6lwgD154/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33438/guest@my.umbc.edu/963f13fe5c7ff838c30a47b03365f2db/api/pixel</TrackingUrl>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>net</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 01 Aug 2013 06:21:17 -0400</PostedAt>
<EditAt>Thu, 01 Aug 2013 06:21:17 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="33437" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33437">
<Title>Do business and religion mix?</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p><img alt="thumbnail" src="http://netdna.webdesignerdepot.com/uploads/2013/08/thumbnail.jpg" width="200" height="160" style="max-width: 100%; height: auto;">I’m a little choosy about who I follow back on Twitter. As with my other opt-in social sites, I’m not into quantity but quality. Having the right connections are good for business and, after all, business is why we network, in most cases.</p> <p>When I go through my daily Twitter followers, I click the email notification and read the new follower’s profile description to learn a bit about them. Are they in my industry, have they actually tweeted, do they only tweet quotes from dead poets and crazy people (which is redundant if you know any poets)? Are all their tweets saying “thank you!” to someone and nothing else? Is there nothing but links to diet pills? It’s a telling tale if the language they use for tweets can’t be translated by Google and do they include religious beliefs or odd hobbies in their profile description?</p> <p>As attested by the plastic, metallic ink <a href="http://sandboxtests.blogspot.com/2008/01/what-would-flying-spaghetti-monster-do.html" rel="nofollow external" class="bo">Flying Spaghetti Monster</a> badge on the back of my minivan, I respect everyone’s right to believe in anything they choose. So, why publish your belief system to the world? I would understand if Twitter was a dating site but what are you telling <em>me</em> when you state your religion? Are you not willing to connect with me if I don’t follow the same beliefs? Your belief system makes you more reliable of a connection or professional than other belief systems? In business, there is only the belief that you can deliver your services at the highest level possible.</p> <p>At a business-networking event, I was speaking to a young lady who, from out of the blue mentioned she would only use suppliers of her religious belief because, “they don’t steal”.</p> <p>I was shocked. I hadn’t mentioned my religious beliefs and didn’t know if she was assuming I wasn’t a follower of her beliefs or wanted me to affirm I was also a follower. What could I say to her except, “yeah, there’s no (insert religion here) in prison!” She turned away and so did I. To me it was the loss of a possible client, to her, the loss of a reliable vendor.</p> <p>In business, we cannot be separated or grouped by culture, nationality, color, sexual preference, gender or creed and anyone who does, faces a diminished group of prospective clients. In a global economy, there will be players of all different kinds of beliefs and the only consideration should be, who will best solve my design needs to increase my business.</p> <p> </p> <h1>Does a religious identity help your business?</h1> <p>It’s hard to know what people want to see… and don’t. The recent U.S. elections had, more so than ever — at least in my lifetime — brought out candidates with religious proclamations as part of their platforms for serving one of the most diverse nations on this Earth.</p> <p>As with any personal information, you need to ask yourself several questions when considering what to put out there for possible connections and prospective clients:</p> <ul> <li>By voicing my political/religious opinion in my social networking or marketing, am I creating professional trust with those whom I want to connect?</li> <li>Will I lose followers, friends and potential business? Do the positive returns outweigh the negative?</li> <li>Is this something that holds potential to jeopardize future opportunities? Am I putting too much information out there for everyone to see?</li> <li>Are my opinions and beliefs creating so much of a distraction that people forget what my business is about?</li> <li>Is this what I want to be known for over all other things? Do the pros outweigh the cons?</li> <li>Does this align with my brand, my style, and my messages I want people to remember?</li> <li>How important is it people know this information?</li> </ul> <p>A hiring manager warns about any information that is too personal, showing up on your profile that will show up on web searches.</p> <p>“Even though the First Amendment protects your speech as a private citizen on matters of public concern, such speech may fall outside of First Amendment protection if it impedes your employer’s effectiveness or efficiency, or otherwise disrupts the workplace.”</p> <p> </p> <h1>Dog is God spelled backwards?</h1> <p>While sitting in a reception area, awaiting an interview, I was greeted by a big, friendly, black Labrador Retriever with a wagging tail and a slobbering tongue. As I love dogs and miss my late dog, I started petting him maniacally and when the person who was to interview me finally came out to the reception area, she found me sitting on the floor, playing with the dog. Actually, I think I was lying on the floor, playing with the dog.</p> <p>“WOW! She exclaimed. “You just passed the first test of getting hired!” Yes, the office dog loved me and that was a huge step in the interviewing process. While chatting with the hiring manager, she let down her guard and told me how she passed over people whose web searches either showed no love for dogs or identified them as “cat lovers”.</p> <p>While I think that may be illegal, it just serves to show how something so small can stand against you in the business world. Even hobbies can destroy your chances of professional work.</p> <p>While searching for an assistant at one of my positions, I stopped and wondered why one applicant would list his hobbies of martial arts, cage fighting, weapons, survival techniques and conspiracy theories, but when I saw he was an avid Pokémon collector, I got scared and skipped to the next résumé.</p> <p>This is why many experts will tell you <em>not</em> to include hobbies or too much personal information on your résumé. The same goes for your profile in the digital age.</p> <p>“I live with my wife, five year-old daughter, two dogs and love spending weekends working in my garden.”</p> <p>Seems innocuous, right? Maybe you think it shows you are a reliable family man and stable? Some employers might think that a five year-old daughter means days off when she’s sick or having to take time off for school functions. They may not like dogs and if you love working in your garden, then you aren’t going to be happy spending weekends in the office. It would be better to end your résumé with, “I have no life”.</p> <p> </p> <h1>Down to Earth faith</h1> <p>We are all human and with that, as certain religious scholars would argue, we are born into sin. All one has to do is witness the contents of a used diaper to know babies are foul, evil beasts! As we grow, we fill our brains with preconceived notions about other humans, measured by our personal likes, dislikes and playground traumas. As my basic distrust of humans and paranoid behavior is one of the major pillars of my schadenfreude religion, I quickly judge people once I’ve cross-referenced them through the internet.</p> <p>I’m not the only cyber-stalker out there. When you apply for a job, the employer will Google the hell out of your name to find out who you really are. Your posts on Facebook, blog rantings, Disqus comments, Yahoo comments, comments on major news sources, photos, tweets and everything else you’ve put on the web is there for anyone to see. If you use online dating sites, the same thing applies for you to see who the sweet, kind and sensitive pathological psychopath is that you are considering falling asleep next to, naked.</p> <p>My eldest son came home from school one day, upset that an obnoxious schoolmate had threatened to Google my name and find an embarrassing photo of me he could plaster across the school. I laughed and told him this kid wouldn’t find anything because I use the nicknames I’ve received through life for all of my online inputs. Sure enough, the kid couldn’t find a single thing. Likewise, an employer or stalker would have to dig twenty-seven pages into Google to even find my real name as people with the same name have done things like become famous actors, discovered devices for heart replacement surgery, saved thousands of children in Africa, solved life’s mysteries and other stuff that trumps working at MAD Magazine, if you can believe that.</p> <p>Still, going by nicknames throughout my life, due to a family that couldn’t remember my real name, calling me by my cousin’s or uncle’s name or, as in the case with my parents… the family dog’s name, has been a blessing. After years of therapy for all of that, I realize, in the age of the internet, they did me a favor. Anonymity on the web saved my son embarrassment at school. The other kid wasn’t so lucky when his father’s name was Googled. Those who live by the search engine, die by the search engine!</p> <p>The family dog’s name can be found on the first three pages of a Google search. As for me, you won’t find much and that’s the way I like it.</p> <p> </p> <p><em><strong>Do you list your religious/political/sporting affiliations on your social media profiles? Has personal information ever stopped you getting work? Let us know in the comments.</strong></em></p> <p><em>Featured image/thumbnail, <a href="http://www.shutterstock.com/pic-90734320/stock-photo-stained-glass-in-a-cathedral.html" rel="nofollow external" class="bo">stained glass image</a> via Shutterstock.</em></p> <p><br><br> </p>
    <table width="100%"> <tbody>
    <tr> <td> <a href="http://www.mightydeals.com/deal/creativo-wordpress-theme.html?ref=inwidget" rel="nofollow external" class="bo"><strong>Creativo: A Responsive WordPress Theme – only $17!</strong></a> </td> <td> <a href="http://www.mightydeals.com/?ref=inwidget" rel="nofollow external" class="bo"><br> <img src="http://mightydeals.com/web/images/widget-logo.png" height="40" width="90" alt="Do business and religion mix?" style="max-width: 100%; height: auto;"><br> </a> </td> </tr> </tbody>
    </table> <p><br> </p> <a href="http://www.webdesignerdepot.com/2013/08/do-business-and-religion-mix/" rel="nofollow external" class="bo">Source</a> <br><div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F08%2Fdo-business-and-religion-mix%2F&amp;t=Do+business+and+religion+mix%3F" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F08%2Fdo-business-and-religion-mix%2F&amp;t=Do+business+and+religion+mix%3F" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F08%2Fdo-business-and-religion-mix%2F&amp;t=Do+business+and+religion+mix%3F" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F08%2Fdo-business-and-religion-mix%2F&amp;t=Do+business+and+religion+mix%3F" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.webdesignerdepot.com%2F2013%2F08%2Fdo-business-and-religion-mix%2F&amp;t=Do+business+and+religion+mix%3F" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    <br><br><a href="http://da.feedsportal.com/r/172487603886/u/49/f/661066/c/35285/s/2f6c885f/a2.htm" rel="nofollow external" class="bo"><img src="http://da.feedsportal.com/r/172487603886/u/49/f/661066/c/35285/s/2f6c885f/a2.img" style="max-width: 100%; height: auto;"></a>
    </div>
]]>
</Body>
<Summary>I’m a little choosy about who I follow back on Twitter. As with my other opt-in social sites, I’m not into quantity but quality. Having the right connections are good for business and, after all,...</Summary>
<Website>http://rss.feedsportal.com/c/35285/f/661066/s/2f6c885f/sc/4/l/0L0Swebdesignerdepot0N0C20A130C0A80Cdo0Ebusiness0Eand0Ereligion0Emix0C/story01.htm</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33437/guest@my.umbc.edu/c28a265f87d8b054f3a9d538fdc257c6/api/pixel</TrackingUrl>
<Tag>art</Tag>
<Tag>bad-resumes</Tag>
<Tag>business</Tag>
<Tag>clients</Tag>
<Tag>css</Tag>
<Tag>cyber-stalking</Tag>
<Tag>design</Tag>
<Tag>development</Tag>
<Tag>freelancing</Tag>
<Tag>graphic-design</Tag>
<Tag>html</Tag>
<Tag>html5</Tag>
<Tag>illustrator</Tag>
<Tag>inspiration</Tag>
<Tag>javascript</Tag>
<Tag>mysql</Tag>
<Tag>oracle</Tag>
<Tag>personal-information</Tag>
<Tag>photoshop</Tag>
<Tag>php</Tag>
<Tag>social-media</Tag>
<Tag>social-media-ethics</Tag>
<Tag>sql</Tag>
<Tag>twitter</Tag>
<Tag>web-designers</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 01 Aug 2013 05:15:17 -0400</PostedAt>
<EditAt>Thu, 01 Aug 2013 05:15:17 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="33478" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33478">
<Title>Feeling Left Out Can Lead to Risky Financial Decisions, Research Finds</Title>
<Body>
<![CDATA[
    <div class="html-content">Social isolation may make some people more susceptible to unfair marketing practices</div>
]]>
</Body>
<Summary>Social isolation may make some people more susceptible to unfair marketing practices</Summary>
<Website>http://www.apa.org/news/press/releases/2013/08/financial-decisions.aspx</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33478/guest@my.umbc.edu/70fdd7cff831c9c37cf6cffaebbdfdd2/api/pixel</TrackingUrl>
<Group token="retired-230">Psychology Student Association @ USG</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-230</GroupUrl>
<AvatarUrl>https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/xsmall.png?1359246046</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/original.jpg?1359246046</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/xxlarge.png?1359246046</AvatarUrl>
<AvatarUrl size="xlarge">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/xlarge.png?1359246046</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/large.png?1359246046</AvatarUrl>
<AvatarUrl size="medium">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/medium.png?1359246046</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/small.png?1359246046</AvatarUrl>
<AvatarUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/xsmall.png?1359246046</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/230/b64bd4b2d025a7635eabf84b086f65fe/xxsmall.png?1359246046</AvatarUrl>
<Sponsor>Psychology Student Association @ USG</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 01 Aug 2013 01:00:00 -0400</PostedAt>
<EditAt>Thu, 01 Aug 2013 01:00:00 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="false" id="33435" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33435">
<Title>Belkin Gadget Will Reveal How Much Energy Your Devices Use</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <p>A project at Belkin could lead to itemized electric bills—showing how much juice your toaster or hair dryer uses.</p>
    <p>If you use a credit card or a cell phone, chances are you get a monthly statement detailing each purchase or call. This may soon expand to your utility bills, too: a project in the works at electronics company <a href="http://www.belkin.com" rel="nofollow external" class="bo">Belkin</a> makes it possible to see how much electricity you’re spending on everything from the TV in your living room to the washing machine in your basement.</p>
    </div>
]]>
</Body>
<Summary>A project at Belkin could lead to itemized electric bills—showing how much juice your toaster or hair dryer uses.  If you use a credit card or a cell phone, chances are you get a monthly statement...</Summary>
<Website>http://www.technologyreview.com/news/517671/belkin-gadget-will-reveal-how-much-energy-your-devices-use/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33435/guest@my.umbc.edu/b67b83c2e3a386eeb3d312fd47c1dc99/api/pixel</TrackingUrl>
<Tag>development</Tag>
<Tag>internet</Tag>
<Tag>mit</Tag>
<Tag>technology</Tag>
<Tag>web</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Thu, 01 Aug 2013 00:00:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="33431" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33431">
<Title>Bloggers Have an Alternative to WordPress by Agora Publishing</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Bloggers searching for an easy way to develop their websites now have an alternative CMS over WordPress being delivered by Agora Publishing and loaded with features and customization options.</p></div>
]]>
</Body>
<Summary>Bloggers searching for an easy way to develop their websites now have an alternative CMS over WordPress being delivered by Agora Publishing and loaded with features and customization options.</Summary>
<Website>http://www.htmlgoodies.com/daily_news/bloggers-have-an-alternative-to-wordpress-by-agora-publishing.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33431/guest@my.umbc.edu/4d78114928072c652d8ebbd193ff564e/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 21:01:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="33432" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33432">
<Title>Secure128 Launches Revamped Partner Program for SSL WordPress Certificate Resellers</Title>
<Body>
<![CDATA[
    <div class="html-content"><p>Secure128 builds on their robust portfolio of SSL delivery and management options. Included are a new WHMCS module release, Wordpress powered white label storefront, updated reseller portal, and API integration assistance.</p></div>
]]>
</Body>
<Summary>Secure128 builds on their robust portfolio of SSL delivery and management options. Included are a new WHMCS module release, Wordpress powered white label storefront, updated reseller portal, and...</Summary>
<Website>http://www.htmlgoodies.com/daily_news/secure128-launches-revamped-partner-program-for-ssl-wordpress-certificate-resellers.html</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33432/guest@my.umbc.edu/26d318e5a08393186bdf3614bd3fa59c/api/pixel</TrackingUrl>
<Tag>html</Tag>
<Tag>htmlgoodies</Tag>
<Tag>learning</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 20:34:00 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="true" id="33433" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33433">
<Title>New Tools for Keeping the Lights On</Title>
<Body>
<![CDATA[
    <div class="html-content">A decade after a record blackout crippled the Northeast, engineers are installing new devices that could stop future breakdowns.<div><table border="0"><tbody><tr><td>
    <a href="http://share.feedsportal.com/share/twitter/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F08%2F01%2Fbusiness%2Fnew-tools-for-keeping-the-lights-on.html%3Fpartner%3Drss%26emc%3Drss&amp;t=New+Tools+for+Keeping+the+Lights+On" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/twitter.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/facebook/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F08%2F01%2Fbusiness%2Fnew-tools-for-keeping-the-lights-on.html%3Fpartner%3Drss%26emc%3Drss&amp;t=New+Tools+for+Keeping+the+Lights+On" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/facebook.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/linkedin/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F08%2F01%2Fbusiness%2Fnew-tools-for-keeping-the-lights-on.html%3Fpartner%3Drss%26emc%3Drss&amp;t=New+Tools+for+Keeping+the+Lights+On" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/linkedin.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/gplus/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F08%2F01%2Fbusiness%2Fnew-tools-for-keeping-the-lights-on.html%3Fpartner%3Drss%26emc%3Drss&amp;t=New+Tools+for+Keeping+the+Lights+On" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/googleplus.png" style="max-width: 100%; height: auto;"></a> <a href="http://share.feedsportal.com/share/email/?u=http%3A%2F%2Fwww.nytimes.com%2F2013%2F08%2F01%2Fbusiness%2Fnew-tools-for-keeping-the-lights-on.html%3Fpartner%3Drss%26emc%3Drss&amp;t=New+Tools+for+Keeping+the+Lights+On" rel="nofollow external" class="bo"><img src="http://res3.feedsportal.com/social/email.png" style="max-width: 100%; height: auto;"></a>
    </td></tr></tbody></table></div>
    </div>
]]>
</Body>
<Summary>A decade after a record blackout crippled the Northeast, engineers are installing new devices that could stop future breakdowns.     </Summary>
<Website>http://www.nytimes.com/2013/08/01/business/new-tools-for-keeping-the-lights-on.html?partner=rss&amp;emc=rss</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33433/guest@my.umbc.edu/2d3f56fbdfc3dad52b9d607f3d1333ef/api/pixel</TrackingUrl>
<Tag>computers-and-the-internet</Tag>
<Tag>electric-light-and-power</Tag>
<Tag>energy-department</Tag>
<Tag>engineering-and-engineers</Tag>
<Tag>new</Tag>
<Tag>new-york-state</Tag>
<Tag>power-outages-and-blackouts</Tag>
<Tag>states-us</Tag>
<Tag>technology</Tag>
<Tag>york</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 20:27:47 -0400</PostedAt>
<EditAt>Wed, 31 Jul 2013 20:27:47 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="123162" important="false" status="posted" url="https://my3.my.umbc.edu/posts/123162">
<Title>Lax Alumni Invited to U.S. National Team Tryouts</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <img width="150" height="150" src="https://umbc.edu/wp-content/uploads/2013/07/5168-150x150.jpg" alt="" style="max-width: 100%; height: auto;"><a href="/wp-content/uploads/2013/07/5168.jpg" rel="nofollow external" class="bo"><img alt="5168" src="/wp-content/uploads/2013/07/5168.jpg?w=300" width="300" height="200" style="max-width: 100%; height: auto;"></a>Peet Poillon ’10
    <p>Four UMBC alumni are among the 98 invitees for the 2014 Federation of International Lacrosse (FIL) World Championships, where the U.S. men seek to defend their title in Denver, Colorado on July 10-19, 2014.</p>
    <p>Attackmen <strong>Brendan Mundorf ’07</strong> and <strong>Drew Westervelt ’07</strong> will attempt to earn their second consecutive team selection. They were both members of the 2010 squad that won gold with a 12-10 victory over Canada in Manchester, England.</p>
    <p>Midfielders <strong>Terry Kimener ’08</strong> and <strong>Peet Poillon ’10</strong> are embarking on their first journeys to the championships.</p>
    <p>Mundorf is seeking his third appearance on the world stage, as he debuted with Team Australia in the 2006 championships. He has spent his entire MLL career with the Denver Outlaws and was the 2012 Bud Light MLL Season Most Valuable Player. The Mount St. Joseph product earned All-America honors for UMBC in 2005 and 2006 and was the America East Player of the Year in both of those campaigns.</p>
    <p>Westervelt is third in scoring at UMBC, racking up 112 goals and 94 assists for 206 points from 2004-07. He capped his career with an All-American selection in 2007. The Bel Air, Md. native has spent seven seasons in the MLL, with Denver and Chesapeake and has earned five All-Star selections.</p>
    <p>Both Mundorf and Westervelt have spent multiple seasons competing in the National Lacrosse League (indoors).</p>
    <p>Kimener is a six-year MLL veteran, who is in his third year in Denver. He scored a career-high 17 goals for the Outlaws in 2012 and has 14 goals and 10 assists in 2013. The Oakton, Va. native earned All-America honors for UMBC in 2007 and 2008 and was tabbed the 2008 America East Player of the Year.</p>
    <p>Poillon is a four-time MLL All-Star, who is now competing for the Charlotte Hounds. He was the 2010 MLL Most Improved Player when he helped the Chesapeake Bayhawks win the league title. The Cranberry Township, Pa. native earned All-America honors for UMBC in 2009.</p>
    <p>Tryouts will be held August 30-September 1 at Goucher College in Baltimore, after which the roster will be cut to 40. That group will then begin preparing for the Federation of International Lacrosse (FIL) World Championships, where the U.S. Men seek to defend their title on July 10-19, 2014.</p>
    <p><em><a href="http://www.umbcretrievers.com/sports/mlacrosse/release.asp?RELEASE_ID=8066" rel="nofollow external" class="bo">This article first appeared on UMBC Retrievers.com.</a></em></p>
    </div>
]]>
</Body>
<Summary>Peet Poillon ’10  Four UMBC alumni are among the 98 invitees for the 2014 Federation of International Lacrosse (FIL) World Championships, where the U.S. men seek to defend their title in Denver,...</Summary>
<Website>https://umbc.edu/stories/lax-alumni-invited-to-u-s-national-team-tryouts/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/123162/guest@my.umbc.edu/0a5c1d8bc1492e96429934d03d706acf/api/pixel</TrackingUrl>
<Tag>alumni</Tag>
<Group token="umbc-news-magazine">UMBC News &amp;amp; Magazine</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/umbc-news-magazine</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/original.png?1748556657</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xlarge.png?1748556657</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/large.png?1748556657</AvatarUrl>
<AvatarUrl size="medium">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/medium.png?1748556657</AvatarUrl>
<AvatarUrl size="small">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/small.png?1748556657</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xsmall.png?1748556657</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/001/943/24435aa6207c452e7bc15cc74b42c7bb/xxsmall.png?1748556657</AvatarUrl>
<Sponsor>UMBC News &amp; Magazine</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>false</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 20:17:06 -0400</PostedAt>
</NewsItem>

<NewsItem contentIssues="false" id="33428" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33428">
<Title>Congratulations to the 2013 Authors!</Title>
<Tagline>Last year's researchers make this year's edition</Tagline>
<Body>
<![CDATA[
    <div class="html-content">The 14th edition of <em>The UMBC Review</em> was published in April 2013, and we would like to congratulate the authors whose submissions were accepted and printed.  They are as follows, representing various disciplines and three different scholar programs at UMBC:<div><br></div>
    <div>Andes, Peter</div>
    <div>Brewster, Matthew</div>
    <div>Brown, Wallace</div>
    <div>Collazos, Juan</div>
    <div>Daniels, Kimberly</div>
    <div>Jannotta, Eva</div>
    <div>Mavronis, Stefanie</div>
    <div>Meisel, Jacquelyn</div>
    <div>Morrow, Alexander</div>
    <div>Sabel, Kenneth</div>
    <div>Thompson, Victor K.</div>
    <div>
    <div><br></div>
    <div>These undergraduates produced excellent papers by performing amazing research, just like you might be doing this summer!<span>  If you would like <a href="http://www.umbc.edu/undergrad_ed/research/review/guidelines.html" rel="nofollow external" class="bo">to submit a paper</a> to the 15th edition, we will be accepting submissions this summer until the September 13th deadline.  Also, v</span><span>isit the Office of Undergraduate Education if you wish to receive a free copy of the 14th edition.</span>
    </div>
    </div>
    <div><span><br></span></div>
    <div>Give another hand for these eleven high-achieving students!</div>
    </div>
]]>
</Body>
<Summary>The 14th edition of The UMBC Review was published in April 2013, and we would like to congratulate the authors whose submissions were accepted and printed.  They are as follows, representing...</Summary>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33428/guest@my.umbc.edu/a9c4b6cd34211aedf54d0f67e3207cfa/api/pixel</TrackingUrl>
<Tag>achievement</Tag>
<Tag>authors</Tag>
<Tag>paper</Tag>
<Tag>research</Tag>
<Tag>review</Tag>
<Tag>submit</Tag>
<Tag>wale</Tag>
<Group token="review">The UMBC Review Team</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/review</GroupUrl>
<AvatarUrl>https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/xsmall.png?1661869148</AvatarUrl>
<AvatarUrl size="original">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/original.png?1661869148</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/xxlarge.png?1661869148</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/xlarge.png?1661869148</AvatarUrl>
<AvatarUrl size="large">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/large.png?1661869148</AvatarUrl>
<AvatarUrl size="medium">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/medium.png?1661869148</AvatarUrl>
<AvatarUrl size="small">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/small.png?1661869148</AvatarUrl>
<AvatarUrl size="xsmall">https://assets1-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/xsmall.png?1661869148</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets2-my.umbc.edu/system/shared/avatars/groups/000/000/642/9d52ae76df058b0454f754705cd92888/xxsmall.png?1661869148</AvatarUrl>
<Sponsor>The UMBC Review Team</Sponsor>
<ThumbnailUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/xxlarge.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="xlarge">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/xlarge.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="large">https://assets3-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/large.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="medium">https://assets1-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/medium.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="small">https://assets2-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/small.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="xsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/xsmall.jpg?1375314276</ThumbnailUrl>
<ThumbnailUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/thumbnails/news/000/033/428/a9eea24ba5eb9664c1341d21cf78476e/xxsmall.jpg?1375314276</ThumbnailUrl>
<ThumbnailAltText>A close-up picture of a page out of a dictionary</ThumbnailAltText>
<PawCount>15</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 19:51:42 -0400</PostedAt>
<EditAt>Fri, 25 Jul 2025 10:41:22 -0400</EditAt>
</NewsItem>

<NewsItem contentIssues="true" id="33427" important="false" status="posted" url="https://my3.my.umbc.edu/posts/33427">
<Title>Integrating a JS Build Process Into MSBuild in Visual Studio 2012 Express</Title>
<Body>
<![CDATA[
    <div class="html-content">
    <a href="http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=33539&amp;c=1174944125" rel="nofollow external" class="bo"><img src="http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=33539&amp;c=1174944125" alt="" style="max-width: 100%; height: auto;"></a><p> I’ve been working with ASP and ASP.NET for about ten years now, starting with ASP classic and settling on .NET 2.0 as my favorite. My new year resolution this year (2013) was to upgrade my .NET work to .NET 4.0 using Visual Studio 2012 Express and really get to grips with MSBuild, so that I can concatenate and minify my JavaScript files as part of the normal build process of a .NET project, in Visual Studio.</p>
    <p>My first love is to use Ant in NetBeans with a PHP or JSP platform for this kind of work, but my company’s main website runs on a .NET platform and it’s time to update it, so I decided to bite the bullet and dive back in to some serious study of creating a fully integrated build process using MSBuild.</p>
    <p>This tutorial will show you how to edit your Visual Studio 2012 Express project file to include your own separate build file which will perform the now widely familiar process of concatenating and minifying a set of JavaScript modules into one file ready for deployment.</p>
    <p></p>
    <hr>
    <h2>Software Requirements</h2>
    <p>I wanted a non-trivial project to demonstrate this process, because I find the devil is in the details. I have often faithfully followed an overly-simple tutorial or introduction to an unfamiliar subject, then discovered that the tutorial did not prepare me for when you want to do something even slightly difficult. So, in this tutorial we’ll be attempting to marry Knockout.js and jQuery UI.  We will also be using a <a href="http://json.org/" rel="nofollow external" class="bo">JSON</a> file with a hierarchy of data to define a menu. We will use a <a href="http://knockoutjs.com" rel="nofollow external" class="bo">Knockout.js</a> template with a <code>foreach</code> binding which loops through the JSON data to emit a hierarchy of <code>ul</code> elements to act as the HTML markup for a menubar compatible with <a href="http://jqueryui.com" rel="nofollow external" class="bo">jQuery UI</a>.</p>
    <p>Sadly, the menubar is not yet available (versions 1.9 or 1.10) bundled with jQuery UI, so you need to download the menubar files from the <a href="https://github.com/jquery/jquery-ui/tree/menubar" rel="nofollow external" class="bo">Menubar</a> branch of jQuery UI.  You also need the <a href="https://github.com/yui/yuicompressor/downloads" rel="nofollow external" class="bo">YUI Compressor</a> for minifying your JavaScript source files. For this tutorial, you will need <a href="http://www.microsoft.com/visualstudio/eng/downloads" rel="nofollow external" class="bo">Visual Studio 2012 Express for Web</a> installed. You will also need to download:</p>
    <ul>
    <li>
    <a href="http://knockoutjs.com/downloads/index.html" rel="nofollow external" class="bo">Knockout.js</a>.</li>
    <li>
    <a href="http://jquery.com/download/" rel="nofollow external" class="bo">jQuery</a>.</li>
    <li>
    <a href="http://jqueryui.com" rel="nofollow external" class="bo">jQuery UI</a>.</li>
    <li>The <a href="https://github.com/jquery/jquery-ui/tree/menubar" rel="nofollow external" class="bo">Menubar</a> branch of the jQuery UI project.</li>
    <li>The <a href="https://github.com/yui/yuicompressor/downloads" rel="nofollow external" class="bo">YUI Compressor.</a> I’m using version 2.4.7.</li>
    </ul>
    <p> If you’re not used to JSON, it’s a good idea to visit the <a href="http://json.org/" rel="nofollow external" class="bo">JSON</a> website.</p>
    <hr>
    <h2>Why MSBuild and Not NAnt?</h2>
    <p> If you read my last tutorial <a href="http://net.tutsplus.com/tutorials/javascript-ajax/using-ant-to-build-a-javascript-library/" rel="nofollow external" class="bo">Using Ant to Build a JavaScript Library</a>, you might be wondering why this tutorial is not about NAnt. Well, with my shiny new installation of Visual Studio 2012 Express, I would like to try to bring my development under one roof. My absolute favorite IDE for C# Assembly development, for many years, was <a href="http://www.icsharpcode.net/" rel="nofollow external" class="bo">SharpDevelop</a>. They moved some years ago from NAnt to MSBuild for SharpDevelop version three. It’s finally time for me to follow suit.</p>
    <blockquote><p> We are no longer using NAnt in our build process, we switched entirely to MSBuild / CruiseControl.NET. And we don’t view the ability to depend on the dominant operating system as a step back: it helps reduce the number of moving parts, the different configurations, different user setups.<br> <br> <a href="http://community.sharpdevelop.net/forums/p/4925/16264.aspx" rel="nofollow external" class="bo">#D 3.0 – Dropping NAnt Support: Why?<br> </a></p></blockquote>
    <h2>
    <span>Rationale:</span> Why Integrate the JavaScript Build Into the .NET Build?</h2>
    <p> For years, for my .NET development, I’ve worked with three different IDEs simultaneously:</p>
    <ol>
    <li>Sharp Develop for my C# assembly development, but I also shoe-horned the JavaScript and CSS concatenate and minify build process into that environment with a specially installed copy of NAnt.</li>
    <li>Visual Studio (2005 etc) for the master pages, content pages.</li>
    <li>An external editor like Aptana to handle JavaScript development.</li>
    </ol>
    <p> Using three IDEs like this was exhausting (and surprisingly taxing for my CPU and RAM), so another new year’s resolution is to bring everything together into Visual Studio. Hence the need to understand how to integrate my JavaScript build process into the overall project build.</p>
    <blockquote><p> One of the major draws of MSBuild for me (on Windows platforms) is that it comes as part of .NET itself. That means that any Windows machine that is up-to-date with Windows Update will have MSBuild available.<br> <br> <a href="http://stackoverflow.com/questions/476163/nant-or-msbuild-which-one-to-choose-and-when" rel="nofollow external" class="bo">Comparison of NAnt and MSBuild on StackOverflow.<br> </a></p></blockquote>
    <h2>Setting Up Your Environment</h2>
    <p> Open a new project in Visual Studio 2012 Express.  I’ve called it <code>NetTutsMSBuildJs</code> and I’ve created it inside my <code>NetTuts</code> folder here: <code>C:\NetTuts\MSBuildJs</code>.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/New-Project-Dialog-Box.gif" alt="New Project Dialog Box" width="556" height="354" style="max-width: 100%; height: auto;"><br> <p> As you can see in the screenshot, I have created a number of folders as follows:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/js_folders.png" alt="js_folders" width="294" height="390" style="max-width: 100%; height: auto;"><br> <table><tbody>
    <tr>
    <td> <strong>Folder</strong>
    </td>
    <td> <strong>Contents</strong>
    </td>
    </tr>
    <tr>
    <td> css</td>
    <td> Production release versions of jQuery UI CSS files. For this tutorial, we’re using the smoothness theme.</td>
    </tr>
    <tr>
    <td> debug</td>
    <td> Various versions of the <code>Default.aspx</code> web form page for debugging purposes.</td>
    </tr>
    <tr>
    <td> debug-js</td>
    <td> Three folders: <code>concat</code>, <code>min</code> and <code>src</code>.</td>
    </tr>
    <tr>
    <td> js</td>
    <td> Production release versions of jQuery, jQuery UI and Knockout.</td>
    </tr>
    <tr>
    <td> jsbuild</td>
    <td> An XML build file with all the tasks needed for the JavaScript build and a copy of the YUI compressor.</td>
    </tr>
    <tr>
    <td> json</td>
    <td> The key JSON file <code>menubar-data.json</code> which has the data needed to build the menubar. Also the JSON files used to populate the page according to the user’s menu choices.</td>
    </tr>
    </tbody></table>
    <p> Notice some of the folders are greyed out. This is because I’ve excluded them from the project. You can toggle this setting from the context menu:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/exclude_from_project.png" alt="exclude_from_project" width="368" height="370" style="max-width: 100%; height: auto;"><br> <p> It’s easy to delete and create directories during the build process, but there’s no way to include or exclude items programmatically from the project.  The concat and min folders in <code>debug-js</code> are disposable, generated automatically by the build process from whatever you’ve created in the <code>src</code> folder, so it’s appropriate to exclude them from the project. Note, you can’t exclude the <code>debug</code> folder from the project because it contains .NET web form pages that have code-behind files. If you exclude the folder, the  web form pages throw errors saying that the classes defined in the code-behind files can’t be found.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/show_all_files.png" alt="show_all_files" width="285" height="168" style="max-width: 100%; height: auto;"><br> <p> You can toggle whether these excluded objects should be shown by going to the <strong>Show All Files</strong> icon at the top of the Solution Explorer and clicking. I always want to be able to see them.</p>
    <p> There’s one more key piece of configuration we need for this project. IIS and the built-in IIS Express don’t include a JSON mime type by default, and we will be using JSON files extensively to deliver content, so we have to add that to the <code>Web.config</code> file. Within the <code>configuration</code> element add a <code>system.webServer</code> element like this:</p>
    <pre>    &lt;system.webServer&gt;&#x000A;            &lt;staticContent&gt;&#x000A;                &lt;mimeMap fileExtension=".json" mimeType="application/json" /&gt;&#x000A;            &lt;/staticContent&gt;&#x000A;        &lt;/system.webServer&gt;&#x000A;    </pre>
    <hr>
    <h2>
    <span>The JavaScript Project: </span>Building a Menubar Using JSON, Knockout and jQuery UI</h2>
    <p> The focus of this tutorial is on how to build a JavaScript project within a .NET project, but we can’t go any further until we have something to build, so now let me explain the slightly ambitious project I have in mind.</p>
    <p> Here’s a UML component diagram showing all the pieces that the project will need. Please note this is a comprehensive component diagram from a developer’s point of view showing all sorts of disposable artifacts that are only important, for instance, for debugging. It’s not a component diagram of only the key artifacts needed for the target system.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/Component-Diagram.png" alt="Component Diagram" width="500" height="435" style="max-width: 100%; height: auto;"><br> <blockquote><p> A component diagram defines the composition of components and artifacts in the system.<br> <a href="http://publib.boulder.ibm.com/infocenter/rsdvhelp/v6r0m1/index.jsp?topic=%2Fcom.ibm.xtools.modeler.doc%2Ftopics%2Fccompd.html" rel="nofollow external" class="bo">IBM: Component Diagrams</a></p></blockquote>
    <p> In UML 2.0, “component” is used to describe a more abstract idea: autonomous, encapsulated units; “artifact” is used to describe what I’m showing in this diagram: files and libraries. It’s an ideal diagram to show how the various files depend on each other. For instance, all the web form pages depend on the Main master page.  The <code>js.build</code> file won’t work if the compressor jar file is not present. The project file and the <code>js.build</code> file are, annoyingly, mutually dependent. If the <code>js.build</code> file is not present, the project will not load; <code>js.build</code> can’t run alone, the tasks defined there are triggered  by the AfterBuild event in the overall  project build.</p>
    <p> For this tutorial, I want to display a horizontal menubar using the menubar branch of jQuery UI. To do that, I have a JSON file with the hierarchical data for the menu and a Knockout.js template looping through this data to render the<br> HTML markup needed by jQuery menubar. I’ve added a callback function <code>renderMenu</code> which is fired by the <code>afterRender</code> event in the Knockout template. <code>renderMenu</code> then simply makes a call to <code>menubar</code> to finally render the menubar with all the lovely jQuery UI shiny features.</p>
    <hr>
    <h2>
    <span>Step 1: </span>The Production Release Files</h2>
    <h3>CSS</h3>
    <p> Download the full bundle from <a href="http://jqueryui.com/download/" rel="nofollow external" class="bo">jQuery UI</a> including a theme of your choice. After unzipping your download, drill down to the folder called <code>css</code> where you’ll find a folder with the name of your chosen theme. In my case, I’ve chosen smoothness. Open that folder and you should see the files you need:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/jquery_ui_css.png" alt="jquery_ui_css" width="499" height="453" style="max-width: 100%; height: auto;"><br> <p> Copy the whole theme folder (smoothness) and paste it into your <code>css</code> folder in the project. Come back to Visual Studio, click the <strong>refresh icon</strong> at the top of the Solution Explorer and the smoothness folder should appear in the <code>css</code> folder. You should include the folder in the project as well.</p>
    <p> In addition to jQuery UI and a specific theme, you also need the small CSS file specifically for the menubar. After downloading the <a href="https://github.com/jquery/jquery-ui/tree/menubar" rel="nofollow external" class="bo">menubar project from github</a>, drill down to the <code>jquery.ui.menubar.css</code> file following this path: <code>\jquery-ui-menubar\themes\base\jquery.ui.menubar.css</code>. Copy that to the <code>css</code> folder of your project.</p>
    <h3> JavaScript<br>
    </h3>
    <p> Download up-to-date versions of production releases of jQuery, jQuery UI and Knockout. I’m using 1.8.2 for jQuery, 1.9.2 for jQuery UI and 2.1.0 for Knockout. Copy them to the <code>js</code> folder in your project.</p>
    <p> You’ll also need the latest, uncompressed release of <code>jquery.ui.menubar.js</code>, downloaded from the <a href="https://github.com/jquery/jquery-ui/tree/menubar" rel="nofollow external" class="bo">Menubar</a> branch of the jQuery UI project. Copy that to the <code>debug-js\src</code> folder in your project.</p>
    <h3> The Main Master Page<br>
    </h3>
    <p> We’re creating several versions of the same page to help debug and test our JavaScript. The master page can of course help to prevent duplication of code.  Call this master page <code>Main.Master</code>.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/add_new_master_page.png" alt="add_new_master_page" width="500" height="318" style="max-width: 100%; height: auto;"><br> <p> Leave the title element blank (we’ll define the title for each page that uses this master) and link to all the stylesheets we need for jQuery UI and the menubar:</p>
    <pre>&lt;title&gt;&lt;/title&gt;&#x000A;    &lt;link rel="stylesheet" type="text/css" href="/css/smoothness/jquery-ui-1.9.2.custom.css"&gt;&#x000A;    &lt;link rel="stylesheet" type="text/css" href="/css/smoothness/jquery-ui-1.9.2.custom.min.css"&gt;&#x000A;    &lt;link rel="stylesheet" type="text/css" href="/css/jquery.ui.menubar.css"&gt;&#x000A;    </pre>
    <p> Add a <code>ContentPlaceHolder</code> just before the end of the body where each page will link to the relevant JavaScript files</p>
    <pre>    &lt;asp:ContentPlaceHolder ID="JsScripts" runat="server"/&gt;&#x000A;    </pre>
    <hr>
    <h2>
    <span>Step 2: </span>The JSON Definition of the Data Needed for the Menubar</h2>
    <p> Here is the JSON object defining a menubar that we might use for an English Instructors’ website. Create a JSON file called <code>menubar-data.json</code> in the <code>json</code> folder and populate it with the following JSON.</p>
    <pre>{&#x000A;        "nodes":[{&#x000A;            "text": "For Students", &#x000A;            "nodes": [&#x000A;    &#x000A;            {&#x000A;                "text": "Listening Practice", &#x000A;                "url":"listening-practice.json"&#x000A;            },&#x000A;            {&#x000A;                "text": "Grammar", &#x000A;                "url":"grammar.json",&#x000A;                "nodes": [&#x000A;    &#x000A;                {&#x000A;                    "text": "Verb Forms", &#x000A;                    "url":"verb-forms.json",&#x000A;                    "nodes": [&#x000A;    &#x000A;                    {&#x000A;                        "text": "Verb Tense and Aspect",&#x000A;                        "url":"verb-tense-and-aspect.json"&#x000A;                    },&#x000A;                    {&#x000A;                        "text": "Modal Auxiliary Verbs",&#x000A;                        "url":"modal-auxiliary-verbs.json"&#x000A;                    }&#x000A;                    ]&#x000A;                },&#x000A;                {&#x000A;                    "text": "Verb Patterns",&#x000A;                    "url":"verb-patterns.json"&#x000A;                },&#x000A;                {&#x000A;                    "text": "Noun phrases",&#x000A;                    "url":"noun-phrases.json"&#x000A;                },&#x000A;                {&#x000A;                    "text": "Complex sentences",&#x000A;                    "url":"complex-sentences.json"&#x000A;                }&#x000A;                ]&#x000A;            }&#x000A;            ]&#x000A;        },&#x000A;        {&#x000A;            "text": "For Teachers", &#x000A;            "nodes": [&#x000A;            {&#x000A;                "text": "Teaching Materials",&#x000A;                "url":"teaching-materials.json"&#x000A;            },&#x000A;            {&#x000A;                "text": "Tests and evaluation grids",&#x000A;                "url":"tests-and-evaluation.json"&#x000A;            },&#x000A;            {&#x000A;                "text": "Media",&#x000A;                "url":"media.json"&#x000A;            }&#x000A;            ]&#x000A;        }&#x000A;        ]&#x000A;    }&#x000A;    </pre>
    <p> Top-level nodes have no URL property defined, so when clicked, they will just display sub-menu items. The sub-menus contain nodes with the URL property defined. When you click one of these nodes, the system will retrieve the JSON data from the file at that URL.</p>
    <p> Each JSON file linked to, in the menubar, contains some content in a simple structure defining a header and some text:</p>
    <pre>{&#x000A;        "header": "Grammar", &#x000A;        "text": "A series of exercises helping you to improve your grammar."&#x000A;    }&#x000A;    </pre>
    <hr>
    <h2>
    <span>Step 3: </span>The Knockout Template for the Menubar</h2>
    <p> We define this in <code>Main.Master</code>.  There is no obvious way of minifying or improving on it for deployment so I want to re-use it with every version of the pages that link to the master page.</p>
    <p> I wanted to have just one Knockout template to render the HTML markup (a set of nested <code>ul</code> elements) for the menubar, but not surprisingly the <code>afterRender</code> event associated with the <code>foreach</code> binding fires with every loop, not at the end of the whole rendering process. So, I needed to create an <code>observableArray</code> with only one <code>ul</code> element, bind that to a Menu template which renders the outermost <code>ul</code> element, and nest the menubar template inside it. I can then handle that single <code>foreach</code> event with my function <code>renderMenu</code>, which calls the jQuery menubar constructor and renders the menubar in all its glory. I got a lot of help on this from this thread: <a href="http://stackoverflow.com/questions/7313554/nested-templates-with-knockoutjs-and-mvc-3-0" rel="nofollow external" class="bo">nested-templates-with-knockoutjs-and-mvc-3-0</a>.</p>
    <p>Here is the menu template:</p>
    <pre>        &lt;script type="text/html" id="MenuTemplate"&gt;&#x000A;                &lt;ul class="ui-widget-header" id="menu" data-bind="template: { name: 'MenuNodeTemplate', foreach: $data.root.nodes}"&gt;&lt;/ul&gt;&#x000A;            &lt;/script&gt;&#x000A;    &#x000A;    </pre>
    <p> And here’s the node template for each node of the menubar:</p>
    <pre>        &lt;script id="MenuNodeTemplate" type="text/html"&gt;&#x000A;                &lt;li data-bind="addData: $data.url"&gt;&#x000A;                    &lt;a data-bind="attr: {href: ('#' + $data.url)}"&gt;&lt;span data-bind="text: $data.text"&gt;&lt;/span&gt;&lt;/a&gt;&#x000A;                    &lt;!-- ko if: $data.nodes --&gt;&#x000A;                    &lt;ul data-bind="template: { name: 'MenuNodeTemplate', foreach: $data.nodes}"&gt;&lt;/ul&gt;&#x000A;                    &lt;!-- /ko --&gt;&#x000A;                &lt;/li&gt;&#x000A;            &lt;/script&gt;&#x000A;    </pre>
    <p> You then need a <code>div</code> element which you bind to MenuTemplate:</p>
    <pre>            &lt;div data-bind="template: {name: 'MenuTemplate' , foreach: masters, afterRender: renderMenu}"&gt;&lt;/div&gt;&#x000A;    </pre>
    <p> Notice that the node template uses <a href="http://knockoutjs.com/documentation/foreach-binding.html" rel="nofollow external" class="bo"> containerless control flow syntax</a>, which is based on comment tags.  There are a few things going on here, so let me explain</p>
    <p>In the fully rendered jQuery menubar, I want to attach a handler to the <code>select</code> event. The handler has the signature <code>event, ui</code>. When you click a menubar item, the handler is passed the event object and a jQuery object representing the item.  To get the text from the <code>ui</code> object, we can call the text method ( <code>ui.item.text()</code> ). But how do we get the <code>url</code> property from the underlying JSON? That is a little bit trickier and I explain it later when we look at the select function triggered by the click event on each sub-menu item and the custom binding <code>addData</code> attached to the <code>li</code> element in the Knockout template.</p>
    <p> Finally you just need a <code>div</code> element where we can display the content retrieved from the JSON data files:</p>
    <pre>        &lt;div id="show-result" class="ui-widget"&gt;&#x000A;                &lt;h1 data-bind="text: header" class="ui-widget-header ui-corner-all"&gt;&lt;/h1&gt;&#x000A;                &lt;div data-bind="html: text" class="ui-widget-content ui-corner-all"&gt;&lt;/div&gt;&#x000A;            &lt;/div&gt;&#x000A;    </pre>
    <hr>
    <h2>
    <span>Step 4: </span>Creating the Web Form Pages That Depend on the Main.Master File</h2>
    <h3> Default-src.aspx<br>
    </h3>
    <p> Create a Web Form using Master Page in the debug folder called <code>Default-src.aspx</code>.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/add_page_using_master_page.png" alt="add_page_using_master_page" width="500" height="318" style="max-width: 100%; height: auto;"><br> <p> This turns out to be a mercifully short file. This is one of the great advantages of the .NET approach to Master pages. There are only two ContentPlaceHolders in the master page. Add the links to your JavaScript files as follows to the Content element linked to the JsScripts ContentPlaceHolder:</p>
    <pre>&lt;%@ Page Title="Default src" Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeBehind="Default-src.aspx.cs" Inherits="NetTutsMsBuildJs.debug.Default_src" %&gt;&#x000A;    &lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    &lt;asp:Content ID="Content2" ContentPlaceHolderID="JsScripts" runat="server"&gt;&#x000A;        &lt;script src="/js/jquery-1.8.2.min.js"&gt;&lt;/script&gt;&#x000A;        &lt;script src="/js/jquery-ui-1.9.2.custom.min.js"&gt;&lt;/script&gt;&#x000A;        &lt;script src="/debug-js/src/jquery.ui.menubar.js"&gt;&lt;/script&gt;&#x000A;        &lt;script src="/js/knockout-2.1.0.js"&gt;&lt;/script&gt;&#x000A;        &lt;script src="/debug-js/src/default-src.js"&gt;&lt;/script&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    </pre>
    <p> Create a new JavaScript file called <code>default-src.js</code> in the <code>debug-js\src folder</code>.</p>
    <p>We enclose everything in a call to the usual jQuery <code>$</code> function that makes sure the page is fully loaded, before running anything.</p>
    <pre>        $(function () {&#x000A;            &#x000A;            });&#x000A;    </pre>
    <blockquote><p> As of jQuery 1.4, if the JSON file contains a syntax error, the request will usually fail silently. See: <a href="http://api.jquery.com/jQuery.getJSON/" rel="nofollow external" class="bo">jQuery.getJSON()</a>.</p></blockquote>
    <p> We need three main pieces of functionality here:</p>
    <ol>
    <li> A call to the jQuery <code>getJSON</code> method to retrieve the JSON data for the menubar. If that succeeds, we create a Knockout view model and call <code>ko.applyBindings(viewModel) </code> to activate it.</li>
    <li> A <code>renderMenu</code> function which will be called by the afterRender event of the MenuTemplate. This function calls the <code>menubar</code> constructor to render the menubar.</li>
    <li> A <code>select</code> function which is called when the user clicks a menubar item. This function retrieves the JSON data from the relevant content file and displays it on the page.</li>
    </ol>
    <p> Notice that the select function needs to be able to retrieve the URL from the underlying JSON data. This is the trickiest part of marrying the jQuery menubar functionality with the Knockout template. jQuery allows you to add data to and retrieve data from an HTML element.  To add data from within our Knockout template, we need to use a custom binding, which has access to the HTML element it is bound to. The binding I have created is called <code>addData</code> and is simply attached to <code>ko.bindingHandlers</code> in the <a href="http://knockoutjs.com/documentation/custom-bindings.html" rel="nofollow external" class="bo">usual Knockout way</a> with an <code>init</code> method and an <code>update</code> method.</p>
    <pre>    ko.bindingHandlers.addData = {&#x000A;            init: function (element, valueAccessor) {&#x000A;                var value = ko.utils.unwrapObservable(valueAccessor());&#x000A;                if (value) {&#x000A;                    $.data(element, "url", value);&#x000A;                }&#x000A;            },&#x000A;            update: function (element, valueAccessor) {&#x000A;                var value = ko.utils.unwrapObservable(valueAccessor());&#x000A;                if (value) {&#x000A;                    $.data(element, "url", value);&#x000A;                }&#x000A;            }&#x000A;        };&#x000A;    </pre>
    <p> Perhaps the node template makes more sense now.  The jQuery object passed as ui in the <code>select</code> handler represents the topmost <code>li</code> element of each menubar item, so we add the custom binding to that list item element: <code>data-bind="addData: $data.url"</code>. Now that each element has some data attached to it, we can retrieve it from the <code>select</code> handler with this syntax: <code>ui.item.data("url")</code>, using the jQuery <code>data</code> method.</p>
    <p> The link element is more straightforward and just uses the standard <code>attr</code> and <code>text</code> bindings:</p>
    <pre>        &lt;a data-bind="attr: {href: ('#' + $data.url)}"&gt;&#x000A;                &lt;span data-bind="text: $data.text"&gt;&lt;/span&gt;&#x000A;            &lt;/a&gt;&#x000A;    </pre>
    <p> Just note that I’ve prefixed the href with a hash symbol. That way when you click on the menubar item, you don’t follow a link to another page. Instead, the <code>select</code> event is fired and the handler, sorry, handles it.</p>
    <p> Here’s the full select function using this approach to retrieve the data from the jQuery object representing the element rendered by Knockout:</p>
    <pre>    function select(event, ui) {&#x000A;            var url = "/json/" + ui.item.data("url");&#x000A;            $.getJSON(url, function (data) {&#x000A;                viewModel.header(data.header);&#x000A;                viewModel.text(data.text);&#x000A;            })&#x000A;            .error(function (errorData) {&#x000A;                viewModel.header("Error");&#x000A;                if (errorData.status === 404) {&#x000A;                    viewModel.text("Could not find " + ui.item.text() + " at " + url);&#x000A;                } else {&#x000A;                    viewModel.text("There has been an error, probably a JSON syntax error. Check the JSON syntax in the file &lt;code&gt;" + url + "&lt;/code&gt;");&#x000A;                    console.log(errorData);&#x000A;                }&#x000A;            });&#x000A;        }&#x000A;    </pre>
    <p> I added the extra error trap because jQuery now remains silent about JSON syntax errors. I don’t want the user to be burdened with the details of JSON syntax errors, but I want to give some clue about what might have gone wrong.</p>
    <p> Here’s the Knockout view model defined in the function attached to the <code>getJSON()</code> method:</p>
    <pre>    $.getJSON('/json/menubar-data.json', function (data) {&#x000A;            viewModel = {&#x000A;                header: ko.observable(),&#x000A;                text: ko.observable(),&#x000A;                masters: ko.observableArray([&#x000A;                {&#x000A;                    name: "Master1",&#x000A;                    root: data&#x000A;                }&#x000A;                ]),&#x000A;                renderMenu: function () {&#x000A;                    $("#menu").menubar({&#x000A;                        autoExpand: true,&#x000A;                        menuIcon: true,&#x000A;                        buttons: true,&#x000A;                        select: select&#x000A;                    });&#x000A;                }&#x000A;            };&#x000A;            ko.applyBindings(viewModel);&#x000A;            viewModel.header("Welcome");&#x000A;            viewModel.text("The English Resource Page");&#x000A;    &#x000A;        })&#x000A;        .error(function (errorData) {&#x000A;            console.log({ "errorData": errorData });&#x000A;            console.log(errorData.error());&#x000A;        });&#x000A;    </pre>
    <hr>
    <h2>
    <span>Step 5: </span>Run the Project in Debug Mode.</h2>
    <p> With <code>Default-src.aspx</code> open in the IDE window, click run (the green arrow just under the menu of the IDE) in Debug mode.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/debug.png" alt="debug" width="554" height="111" style="max-width: 100%; height: auto;"><br> <p> After the build process, the <code>Default-src.aspx</code> should appear in your browser’s window. The IDE runs an Express version of the IIS web server in the background. In my case, the project uses port 54713 on localhost to run the page: </p>
    <p><code><a href="http://localhost:54713/debug/Default-src.aspx">http://localhost:54713/debug/Default-src.aspx</a></code></p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/Default-src.png" alt="Default-src" width="500" height="260" style="max-width: 100%; height: auto;"><br> <p> We’re now ready to work on the JavaScript build process.</p>
    <hr>
    <h2>Integrating the JavaScript Build Process Into MSBuild</h2>
    <p> This project will automate the two key steps we need to build a complex JavaScript project:</p>
    <ul>
    <li> <strong>Concatenate: </strong>Collect all the source files you need for a particular page and concatenate them together into one file. MSBuild doesn’t have a built-in Concat task like Ant or NAnt so we’ll have to roll our own based on this excellent blog <a href="http://blogs.msdn.com/b/msbuild/archive/2005/09/29/475046.aspx" rel="nofollow external" class="bo">How To: Concatenate files using MSBuild tasks</a>.</li>
    <li> <strong>Minify: </strong>Minify our own source files and concatenate them with production release files, like the jQuery file, into one compressed file.</li>
    </ul>
    <hr>
    <h2>
    <span>Step 1:</span> Toggle Between the Project and Editing the Project Build File</h2>
    <p> The folder where you created your .NET project will include files that look like these:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/project_file.png" alt="project_file" width="600" height="359" style="max-width: 100%; height: auto;"><br> <p> The <code>NetTutsMSBuildJs.csproj</code> file is just an XML file specially configured to handle the MSBuild process for this project. It is perfectly legitimate to create one of these manually or edit it to suit your project. Obviously, for purely .NET purposes it’s much better to use the Visual Studio GUI to configure this file automatically for you, but the point of this tutorial is to show you how to add in a JavaScript build, which is not part of the standard .NET build.</p>
    <p>In Visual Studio, you can’t edit this project file unless you unload the project, and you can’t load the project if there is a syntax error in the file!  So, practice unloading and loading the project so that you can edit this key file. To unload the project, <strong>right-click</strong> the project and click the <strong>Unload Project</strong> item.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/unload_project.png" alt="unload_project" width="422" height="594" style="max-width: 100%; height: auto;"><br> <p> After unloading the project, all the folders and files disappear and you’re left with just the solutions and projects in the Solution Explorer. <strong>Right-click</strong> the project and this time the context menu is very short. Choose <strong>Edit NetTutsMSBuildJs.csproj</strong> and the project configuration file opens.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/edit_proj_file.png" alt="edit_proj_file" width="490" height="244" style="max-width: 100%; height: auto;"><br> <p> Now, just to build your confidence and get used to dealing with those times when you can’t load the project because of a syntax error in the project files, type a deliberate mistake near the beginning of the project file: just type a letter before the first tag outside the XML document structure. Save and close the file.  Try to load the project from the context menu and you will get an error message saying the project can’t be loaded. Yes, Visual Studio is very strict like this.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/project_load_error.png" alt="project_load_error" width="476" height="184" style="max-width: 100%; height: auto;"><br> <p> Re-open the project file, correct the error, save and close again. When you re-load the project, it should load smoothly. Now it’s time to edit for real. We will only manually change one thing in the project file, and that will be to add an Import element which will import a file to perform the JavaScript build.</p>
    <hr>
    <h2>
    <span>Step 2:</span> Create a Build File for the JavaScript Build and Import It Into the Project File.</h2>
    <p> If you add an Import element to the project file for a file which doesn’t exist, you won’t be able to load the project, so create a new text file called <code>js.build</code> in the jsbuild folder.  After you enter the necessary XML code, the IDE will recognise this file as an XML file. There will be no need to actually associate the <code>.build</code> extension with the XML editor. Enter this starting code into <code>jsbuild\js.build</code>, save and close.</p>
    <pre>&lt;Project ToolsVersion="4.0" xmlns="<a href="http://schemas.microsoft.com/developer/msbuild/2003%22&amp;gt">http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt</a>;&#x000A;    &lt;/Project&gt;&#x000A;    </pre>
    <p> Now, unload the project and edit the project file by adding this line to the end of the file just before the closing tag.</p>
    <pre>&lt;Import Project="jsbuild\js.build" /&gt;&#x000A;    </pre>
    <p>You should now be able to re-load the project.</p>
    <hr>
    <h2>
    <span>Step 3: </span>Hello Discworld!!!!!</h2>
    <blockquote><p> Five exclamation marks, the sure sign of an insane mind. – Terry Pratchett, Reaper Man</p></blockquote>
    <p> I am a bit bored with saying “Hello World” at the beginning of every new IT tutorial. So this time, I’m going to say hello to Terry Pratchett’s amazing Discworld.</p>
    <p> Open <code>js.build</code>. The IDE should automatically notice that it is an XML file. If not, perhaps you have invalid XML.  After adding the following code to set up a Hello Discworld message, the IDE should finally realise this is XML. Make sure the <code>js.build</code> file now contains the following XML.  Don’t forget the five exclamation marks to get the right flavour of insanity for the Discworld!!!!!</p>
    <pre>&lt;Project ToolsVersion="4.0" xmlns="<a href="http://schemas.microsoft.com/developer/msbuild/2003%22&amp;gt">http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt</a>;&#x000A;      &lt;Target Name="HelloDiscworld"&gt;&#x000A;        &lt;Message Text="Hello Discworld!!!!!" Importance="high"&gt;&lt;/Message&gt;&#x000A;      &lt;/&lt;Target&gt;&#x000A;      &lt;Target Name="AfterBuild"&gt;&#x000A;        &lt;CallTarget Targets="HelloDiscworld"&gt;&lt;/CallTarget&gt;&#x000A;      &lt;Target&gt;&#x000A;    &lt;/Project&gt;&#x000A;    </pre>
    <p> When you <strong>right click</strong> on the project and run build, you should see the message in the output window.</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/hello_discworld.png" alt="hello_discworld" width="560" height="238" style="max-width: 100%; height: auto;"><br> <p> Like Ant, MSBuild uses the idea of targets to perform groups of tasks.  The AfterBuild target is run automatically by MSBuild after everything else has been successfully built. I’m tacking the JavaScript build onto the end of the .NET build so the AfterBuild extension point seems the best place to put this. Notice how AfterBuild is run automatically and within AfterBuild we call our Target HelloDiscworld. I’ve set the Importance of the message to high because otherwise it might not appear in the output window.</p>
    <hr>
    <h2>
    <span>Step 4: </span>Sort Out Paths</h2>
    <p> Right.  We went a little bit mad in the Discworld with too many exclamation marks, but at least our JavaScript build file seems to be working! OK. Joking aside, we now have to get the most crucial thing in a build routine right: paths.</p>
    <p> As with Ant, I have always had trouble understanding absolute and relative paths in these configuration files, so I want to tread carefully. Add a PropertyGroup element to the top of the <code>js.build</code> file, just below the Project tag and add two properties like this.</p>
    <pre>  &lt;PropertyGroup&gt;&#x000A;        &lt;ConcatDir&gt;debug-js\concat&lt;/ConcatDir&gt;&#x000A;        &lt;MinDir&gt;debug-js\min&lt;/MinDir&gt;&#x000A;      &lt;/PropertyGroup&gt;&#x000A;    </pre>
    <p> Now, alter the message so we can see what these properties contain:</p>
    <pre>&lt;Message Text="Hello Discworld!!!!! from $(ConcatDir)" Importance="high"&gt;&lt;/Message&gt;&#x000A;    </pre>
    <p> Now clean and build the project again or just choose rebuild. The message appears in the output like this:</p>
    <p> <code>Hello Discworld!!!!! from debug-js\concat</code></p>
    <hr>
    <h2>
    <span>Step 5: </span>Create Clean and Init Targets</h2>
    <p> Lovely.  We’ve got our environment, our source files and we’ve got properties in the build file containing relative paths pointing to the directories we need to work with. Now we can add a CleanJs Target and an InitJs Target to Remove and Make the concat and min directories. I have a habit of putting little “hello” messages in to these targets when developing these files just to re-assure myself they’re actually running or checking property values. I find increasing the output verbosity in MSBuild tends to give me a flood of information that I don’t need, though it’s great when I can’t figure out where I’ve made a mistake.</p>
    <blockquote><p> MSBuild uses simple relative paths from the root folder of the whole project. If you have a folder called js in your project, you can use the value <code>js</code> in a named Property within a PropertyGroup without further complication.</p></blockquote>
    <pre>  &lt;Target Name="CleanJs"&gt;&#x000A;        &lt;Message Text="Hello from CleanJs" Importance="high"&gt;&lt;/Message&gt;&#x000A;        &lt;RemoveDir Directories="$(ConcatDir)" Condition="Exists('$(ConcatDir)')"&gt;&#x000A;          &lt;Output PropertyName="ConcatDirRemoved" TaskParameter="RemovedDirectories"/&gt;&#x000A;        &lt;/RemoveDir&gt;&#x000A;        &lt;RemoveDir Directories="$(MinDir)" Condition="Exists('$(MinDir)')"&gt;&lt;/RemoveDir&gt;&#x000A;        &lt;Message Text="Hello from removed dirs $(ConcatDirRemoved)" Importance="high"&gt;&lt;/Message&gt;&#x000A;      &lt;/Target&gt;&#x000A;      &lt;Target Name="InitJs"&gt;&#x000A;        &lt;MakeDir Directories="$(ConcatDir)" Condition="!Exists('$(ConcatDir)')"&gt;&lt;/MakeDir&gt;&#x000A;        &lt;MakeDir Directories="$(MinDir)" Condition="!Exists('$(MinDir)')"&gt;&lt;/MakeDir&gt;&#x000A;      &lt;/Target&gt;&#x000A;    </pre>
    <p> To run these targets add <code>CallTarget</code> elements to the <code>AfterBuild</code> target.</p>
    <pre>    &lt;CallTarget Targets="CleanJs"&gt;&lt;/CallTarget&gt;&#x000A;        &lt;CallTarget Targets="InitJs"&gt;&lt;/CallTarget&gt;&#x000A;    </pre>
    <hr>
    <h2>
    <span>Step 6:</span> Concatenating the Files</h2>
    <p> You’re probably getting used to editing the <code>js.build</code> file by now.  You may have noticed an annoying error message linked to text underlined with wiggly blue lines, like this:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/invalid_child_element.png" alt="invalid_child_element" width="310" height="82" style="max-width: 100%; height: auto;"><br> <p> This is an annoying bug in Visual Studio which has been there for quite a while. PropertyGroup elements and ItemGroup elements can be populated with any value you like. The problem is Visual Studio wrongly reports an error for the first Property or Item you define in one of these groups. As you’ve seen, ConcatDir works when you build the project, and there is no problem loading the project. Just ignore these distracting invalid child element errors.</p>
    <p> At last, some real build work.  We add a new target to concatenate the files we want. Unlike Ant and NAnt, there is no built-in Concat task, so we have to roll our own with the ReadLinesFromFile task</p>
    <pre>  &lt;Target Name="ConcatenateJsFiles"&gt;&#x000A;        &lt;ItemGroup&gt;&#x000A;        &lt;ConcatFiles Include="&#x000A;                     js\jquery-1.8.2.min.js;&#x000A;                     js\jquery-ui-1.9.2.custom.min.js;&#x000A;                     debug-js\src\jquery.ui.menubar.js;&#x000A;                     js\knockout-2.1.0.js;&#x000A;                     debug-js\src\default-src.js&#x000A;                     "/&gt;&#x000A;        &lt;/ItemGroup&gt;&#x000A;        &lt;ReadLinesFromFile File="%(ConcatFiles.Identity)"&gt;&#x000A;          &lt;Output TaskParameter="Lines" ItemName="ConcatLines"/&gt;&#x000A;        &lt;/ReadLinesFromFile&gt;&#x000A;        &lt;WriteLinesToFile File="debug-js\concat\default-concat.js" Lines="@(ConcatLines)" Overwrite="true" /&gt;&#x000A;      &lt;/Target&gt;&#x000A;    </pre>
    <p> Add a new <code>CallTarget</code> element to the <code>AfterBuild</code> target in <code>js.build</code> calling <code>ConcatenateJsFiles</code>. Rebuild the project as usual and lo and behold, a file called <code>default-concat.js</code> magically gets created in the <code>debug-js\concat</code> directory. You will probably have to refresh the Solution Explorer to see it.</p>
    <p> Now add a new Web form page called <code>Default-concat.aspx</code> to the <code>debug</code> folder, linking it to the <code>Main.Master</code> page. This is very short and slightly different from the <code>Default-src.aspx</code> page. This time, all the JavaScript we need has been concatenated into one file, so you only need one script tag link to <code>default-concat.js</code>.</p>
    <pre>&lt;%@ Page Title="Default concat" Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeBehind="Default-src.aspx.cs" Inherits="NetTutsMsBuildJs.debug.Default_src" %&gt;&#x000A;    &lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    &lt;asp:Content ID="Content2" ContentPlaceHolderID="JsScripts" runat="server"&gt;&#x000A;        &lt;script src="/debug-js/concat/default-concat.js"&gt;&lt;/script&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    </pre>
    <p> To try this out, open the <code>Default-concat.aspx</code> page in the IDE window and run the project again in Debug mode. You should see the fully functioning menubar in your browser with the title Debug concat appearing in the title bar of the browser.</p>
    <hr>
    <h2>
    <span>Step 7:</span> Final Stage – Minifying</h2>
    <blockquote><p> The final target, target!!!!!</p></blockquote>
    <p> Our menubar seems to be working and when we concatenate the files we seem to have got the right order and everything’s going smoothly in the <code>Debug-concat.aspx</code> page.  It’s now finally time to minify the source files <code>default-src.js</code> and <code>jquery.ui.menubar.js</code> and concatenate them with the professional release files in the correct order. This is slightly more complicated because now we need to bring in an external dependency which, so far, we haven’t needed: the YUI compressor.  There is a <a href="http://yuicompressor.codeplex.com/" rel="nofollow external" class="bo">.NET port</a> of this being developed but I’m so used to the Java version, I prefer to use my old favorite. Create a new target called MinifyJsFiles like this:</p>
    <pre>  &lt;Target Name="MinifyJsFiles"&gt;&#x000A;        &lt;ItemGroup&gt;&#x000A;          &lt;MinFiles Include="&#x000A;                     debug-js\src\jquery.ui.menubar.js;&#x000A;                     debug-js\src\default-src.js&#x000A;               "/&gt;&#x000A;          &lt;Compressor Include="jsbuild\yuicompressor-2.4.7.jar"&gt;&lt;/Compressor&gt;&#x000A;        &lt;/ItemGroup&gt;&#x000A;        &lt;Message Text="Hello Compressor.Fullpath: %(Compressor.Fullpath)" Importance="high"&gt;&lt;/Message&gt;&#x000A;        &lt;Exec Command="java -jar %(Compressor.Fullpath) debug-js\src\default-src.js --type js -o debug-js\min\default-min.js"/&gt;&#x000A;        &lt;Exec Command="java -jar %(Compressor.Fullpath) debug-js\src\jquery.ui.menubar.js --type js -o debug-js\min\jquery.ui.menubar-min.js"/&gt;&#x000A;    &#x000A;      &lt;/Target&gt;&#x000A;    </pre>
    <p> Notice the property Compressor.  Here you just have to define the relative path from the <code>project</code> folder, but the jar file, run by the Java process, will need the full path.  Luckily, MSBuild provides an easy way to convert a relative path into a full path.  You use the <code>%</code> syntax and invoke the Fullpath property.  This is an example of <a href="http://msdn.microsoft.com/en-us/library/ms164313.aspx" rel="nofollow external" class="bo">MSBuild Well-known Item Metadata</a>.</p>
    <p> Add yet another <code>CallTarget</code> element to the <code>AfterBuild</code> element to call the <code>MinifyJsFiles</code> target.</p>
    <p> Now our final target, target. We have to take all the professional release files and concatenate them with the minified version of our sources and concatenate them into one file.</p>
    <pre>  &lt;Target Name="ConcatenateMinFiles"&gt;&#x000A;        &lt;ItemGroup&gt;&#x000A;        &lt;ConcatMinFiles Include="&#x000A;                          js\jquery-1.8.2.min.js;&#x000A;                          js\jquery-ui-1.9.0.custom.min.js;&#x000A;                          debug-js\min\jquery.ui.menubar-min.js;&#x000A;                          js\knockout-2.1.0.js;  &#x000A;                          debug-js\min\default-min.js&#x000A;                          "/&gt;              &#x000A;        &lt;/ItemGroup&gt;&#x000A;        &lt;ReadLinesFromFile File="%(ConcatMinFiles.Identity)" &gt;&#x000A;          &lt;Output TaskParameter="Lines" ItemName="ConcatMinFilesLines"/&gt;&#x000A;        &lt;/ReadLinesFromFile&gt;&#x000A;        &lt;Message Text="We are concatenating these minified files %(ConcatMinFiles.Identity)" Importance="high"&gt;&lt;/Message&gt;&#x000A;        &lt;WriteLinesToFile File="debug-js\min\default.js" Lines="@(ConcatMinFilesLines)" Overwrite="true" /&gt;&#x000A;       &lt;/Target&gt;&#x000A;    </pre>
    <p> You have to be careful with this ItemName property in the build files.  Property and item instances are stored in a global context in MSBuild. If you use the same name for <code>ItemName</code> in two different concatenated targets, you end up concatenating all the files from both targets.</p>
    <p> Rebuild the project and you should now see two new files in the <code>debug-js\min</code> folder: <code>default-min.js</code> and <code>jquery.ui.menubar-min.js</code>. The <code>debug-js</code> folder should now look like this after re-building and refreshing the Solution Explorer:</p>  <img src="http://cdn.tutsplus.com/net.tutsplus.com/uploads/2013/07/debug-js.png" alt="debug-js" width="284" height="224" style="max-width: 100%; height: auto;"><br> <p> Create a new Web form page called <code>Default-min.aspx</code> linked to the <code>Main.Master</code> page and put it into the <code>debug</code> folder.</p>
    <pre>&lt;%@ Page Title="Default min" Language="C#" MasterPageFile="~/Main.Master" AutoEventWireup="true" CodeBehind="Default-src.aspx.cs" Inherits="NetTutsMsBuildJs.debug.Default_src" %&gt;&#x000A;    &lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    &lt;asp:Content ID="Content2" ContentPlaceHolderID="JsScripts" runat="server"&gt;&#x000A;        &lt;script src="/debug-js/min/default-min.js"&gt;&lt;/script&gt;&#x000A;    &lt;/asp:Content&gt;&#x000A;    </pre>
    <hr>
    <h2>Conclusion</h2>
    <blockquote><p> We walked through the steps required in Visual Studio Express 2012 for Web, to create a JavaScript project that marries Knockout with jQuery UI to create a menubar and then integrate a JavaScript build into the overall project build in Visual Studio.</p></blockquote>
    <p> In this tutorial we walked through the steps required in Visual Studio Express 2012 for Web, to create a JavaScript project that marries Knockout with jQuery UI to create a menubar from a JSON definition file and then integrate a JavaScript build of the source files into the .NET MSBuild process. The final result was that we had a web page with only one script tag containing all the complex JavaScript needed to run the page.</p>
    <p>I think you can see how easy it would be to adapt this example to a very large, complex JavaScript library running in a .NET project. It should also be reasonably straightforward to develop these ideas to include tasks suitable for a release version. The obvious next step is to copy the fully minified and concatenated <code>default.js</code> file to the <code>js</code> folder, then include that in a definitive <code>Default.aspx</code> file in the root directory. With this example as a starting point, you should be able to explore the MSBuild documentation and develop a fully working build file to automate every part of your build process.</p>
    <p>I also use this kind of approach for CSS files. In this particular case, the jQuery UI CSS files are so well optimized it hardly seemed worth minifying them, but in other projects it might be important for performance. A more sophisticated next step for you <a href="http://gruntjs.com/" rel="nofollow external" class="bo">grunt</a>ers out there would be to create a <code>js.build</code> file that runs a grunt file with an MSBuild Exec task. That way, you could easily include linting and testing to the build process.</p>
    <h3>Further reading</h3>
    <p> For further reading about Visual Studio, this excellent Nettuts+ <a href="http://net.tutsplus.com/articles/general/visual-studio-web-dev-bliss/" rel="nofollow external" class="bo">Visual Studio: Web Dev Bliss</a> will guide you on how to integrate Web Essentials and add code checking to your build process, but unfortunately, Web Essentials is not available for the Express edition. See Mads Kristensen’s answer <a href="http://madskristensen.net/post/The-road-to-Web-Essentials-2012.aspx" rel="nofollow external" class="bo">here</a>:  “…unfortunately Express doesn’t allow third party extensions to be installed”. This tutorial is aimed at users of the Express edition and I hope it has given you a starting point for creating your own integrated JavaScript build, all within the Visual Studio Express environment.</p>
    </div>
]]>
</Body>
<Summary>I’ve been working with ASP and ASP.NET for about ten years now, starting with ASP classic and settling on .NET 2.0 as my favorite. My new year resolution this year (2013) was to upgrade my .NET...</Summary>
<Website>http://feedproxy.google.com/~r/nettuts/~3/uTLxLuhOLg4/</Website>
<TrackingUrl>https://my3.my.umbc.edu/api/v0/pixel/news/33427/guest@my.umbc.edu/ad3294d595bc14222a9c2c3cd34da396/api/pixel</TrackingUrl>
<Tag>asp-net</Tag>
<Tag>css</Tag>
<Tag>development</Tag>
<Tag>html</Tag>
<Tag>javascript</Tag>
<Tag>javascript-and-ajax</Tag>
<Tag>javascript-build-process</Tag>
<Tag>msbuild</Tag>
<Tag>mysql</Tag>
<Tag>php</Tag>
<Tag>sql</Tag>
<Tag>tutorials</Tag>
<Tag>visual-studio</Tag>
<Tag>wed</Tag>
<Group token="retired-583">Web Developer - Build Group</Group>
<GroupUrl>https://my3.my.umbc.edu/groups/retired-583</GroupUrl>
<AvatarUrl>https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="original">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/original.jpg?1363101197</AvatarUrl>
<AvatarUrl size="xxlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="xlarge">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xlarge.png?1363101197</AvatarUrl>
<AvatarUrl size="large">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/large.png?1363101197</AvatarUrl>
<AvatarUrl size="medium">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/medium.png?1363101197</AvatarUrl>
<AvatarUrl size="small">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/small.png?1363101197</AvatarUrl>
<AvatarUrl size="xsmall">https://assets3-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xsmall.png?1363101197</AvatarUrl>
<AvatarUrl size="xxsmall">https://assets4-my.umbc.edu/system/shared/avatars/groups/000/000/583/fc60f5d7abc2e080599bb6dc465db54d/xxsmall.png?1363101197</AvatarUrl>
<Sponsor>Web Developer - Build Group</Sponsor>
<PawCount>0</PawCount>
<CommentCount>0</CommentCount>
<CommentsAllowed>true</CommentsAllowed>
<PostedAt>Wed, 31 Jul 2013 19:07:03 -0400</PostedAt>
<EditAt>Wed, 31 Jul 2013 19:07:03 -0400</EditAt>
</NewsItem>

</News>
