<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-378368163516701468</id><updated>2026-05-04T21:30:27.987+01:00</updated><category term=".Net"/><category term="Unit testing"/><category term="Open source"/><category term="Software development"/><category term="AngularJS"/><category term="JavaScript"/><category term="ServiceStack"/><category term="ASP.NET MVC"/><category term="Entity Framework"/><category term="Node.js"/><category term="Mocking"/><category term="Performance"/><category term="SharePoint"/><category term="T4"/><category term="ES6"/><category term="Karma"/><category term="MongoDB"/><category term="PhoneGap"/><category term="PostgreSQL"/><category term="Protractor"/><category term="Underscore.js"/><category term="XAML"/><title type='text'>Alex Pop&#39;s technical trail</title><subtitle type='html'>Various articles about software development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-2113108262000851232</id><published>2015-10-08T01:09:00.002+01:00</published><updated>2015-10-08T10:21:23.183+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ES6"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="PostgreSQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Underscore.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Announcing my upcoming book &quot;Learning Underscore.js&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
&amp;nbsp; After a period of silent and sustained effort I am happy to anounce that my newest book &quot;Learning Underscore.js&quot; has entered its production stage and it is available to pre-order&amp;nbsp;on my &lt;a href=&quot;http://bit.ly/1JwvBOO&quot; target=&quot;_blank&quot;&gt;publisher&lt;/a&gt; website or on the&amp;nbsp;&lt;a href=&quot;http://amzn.to/1Lm325M&quot; target=&quot;_blank&quot;&gt;Amazon.com&lt;/a&gt;&amp;nbsp;website with delivery in a couple of weeks.&lt;/div&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; In our ever changing software development landscape 2015 seems to be a great year for JavaScript. A couple of major events raised the profile of JavaScript for me: the release of its final specification ECMAScript 2015 (ES6), the stable release of Node.js 4 that reconciled the stagnant versions 0.1x with the effervescent io.js fork, the widespread adoption of the Babel.js library to facilitate ES6 adoption, and the public availability of the React Native framework that uses JavaScript for native mobile development. What better way for me to mark this year than to release a book about one of the most popular JavaScript libraries.&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; The book discusses most of the Underscore.js library features in the first part and the second part takes this library in a journey as an exploration vehicle to look at: different programming paradigms, how it can be used in server side and database environments, how it compares with related and alternative libraries, and how to use it in the context of ECMAScript 2015 (ES6). The last chapter discusses build automation and code reusability between client and server environments, while making the final point that Underscore.js and JavaScript can be used in any environment, employing a modular and clean development approach in the process. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;All the book examples are hosted on GitHub and I have created an examples index page at &lt;a href=&quot;http://bit.ly/1D7NFiz&quot; target=&quot;_blank&quot;&gt;https://github.com/popalexandruvasile/underscorejs-examples&lt;/a&gt;&amp;nbsp;that should reveal more about the kind of content covered in the book.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;I am also including an extract from the book preface that contains chapter details and who the target audience is.&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
What the book covers&lt;/h3&gt;
&lt;div&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-GB&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;JA&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:EnableOpenTypeKerning/&gt;
   &lt;w:DontFlipMirrorIndents/&gt;
   &lt;w:OverrideTableStyleHps/&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val=&quot;Cambria Math&quot;/&gt;
   &lt;m:brkBin m:val=&quot;before&quot;/&gt;
   &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot;/&gt;
   &lt;m:smallFrac m:val=&quot;off&quot;/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val=&quot;0&quot;/&gt;
   &lt;m:rMargin m:val=&quot;0&quot;/&gt;
   &lt;m:defJc m:val=&quot;centerGroup&quot;/&gt;
   &lt;m:wrapIndent m:val=&quot;1440&quot;/&gt;
   &lt;m:intLim m:val=&quot;subSup&quot;/&gt;
   &lt;m:naryLim m:val=&quot;undOvr&quot;/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;
  DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;
  LatentStyleCount=&quot;276&quot;&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; Name=&quot;annotation text&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; Name=&quot;annotation reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot;/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;

&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:Calibri;}
&lt;/style&gt;
&lt;![endif]--&gt;



&lt;!--StartFragment--&gt;

&lt;br /&gt;
&lt;div class=&quot;NormalPACKT&quot;&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;&lt;i&gt;Getting Started with Underscore.js&lt;/i&gt;&lt;/span&gt;,
introduces the reader to Underscore and explains the main problems addressed by
the library together with a quick introduction to functional programming. The
chapter describes some of the concepts and patterns that are used by Underscore
or are helpful when using Underscore. The final part is a walkthrough to setup
the development environment used throughout the book with a starter example.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;&lt;i&gt;Using Underscore.js with collections&lt;/i&gt;&lt;/span&gt;,
explores the Underscore functionality for collections by example and explains
some of the concepts related to these area: scope resolution and execution
context, map/reduce, functional programming concepts.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;&lt;i&gt;Using Underscore.js with arrays,
functions and objects&lt;/i&gt;&lt;/span&gt;, looks at functionality for arrays, functions and
objects, and builds upon concepts and functions introduced in the previous
chapter. In the functions section the reader will learn how to manipulate
function scope and arguments and why this is an important aspect of JavaScript
programming in general.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 4&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;i&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;Programming paradigms with Underscore.js&lt;/span&gt;&lt;/i&gt;,
expands on the concepts and practices of functional programming to solve common
programming problems. The chapter starts with a differentiation between object
oriented programming and functional programming. It continues with exploring
examples of functional programming with Underscore.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 5&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;i&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;Using Underscore.js in the browser, on the
server and with the database&lt;/span&gt;&lt;/i&gt;, is about using Underscore in specific
contexts starting with the browser environment, closely followed by Node.js
server side applications or libraries. The reader will then learn how to use
Underscore with databases like MongoDB and PostgreSQL that can execute
JavaScript to query data.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 6&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;i&gt;, &amp;nbsp;&lt;span class=&quot;ItalicsPACKT&quot;&gt;Related
Underscore.js libraries and ECMAScript standards&lt;/span&gt;&lt;/i&gt;, discusses advanced
topics like the link between Underscore and JavaScript standards, libraries
that augment or can even replace Underscore, with a focus on taking advantage
of the new ECMAScript 2015 (ES6) features.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;ChapterrefPACKT&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;b&gt;Chapter 7&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;i&gt;, &lt;span class=&quot;ItalicsPACKT&quot;&gt;Underscore.js build automation and code
reusability&lt;/span&gt;&lt;/i&gt;, introduces a build automation solution together with strategies
to reuse Underscore based code between different application hosts.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Who this book is for&lt;/h2&gt;
&lt;div&gt;
The book is for developers with fundamental JavaScript knowledge that want to use modern JavaScript libraries to advance their programming skills. Underscore is one of the most important libraries you should be familiar with and the book will help you achieve this goal by going through its fundamentals and using it in a wide variety of contexts. The book should be relevant to anyone who:&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Is interested in building web applications, single page web applications or JavaScript based desktop mobile, or embedded applications;&lt;/li&gt;
&lt;li&gt;Wants to use Node.js to build web applications or web services;&lt;/li&gt;
&lt;li&gt;Wants to work with databases like MongoDB or PostgreSQL and leverage their JavaScript support.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/2113108262000851232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/2113108262000851232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/2113108262000851232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/2113108262000851232'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2015/10/announcing-my-upcoming-book-learning.html' title='Announcing my upcoming book &quot;Learning Underscore.js&quot;'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-1677215585969528489</id><published>2015-02-01T11:03:00.001+00:00</published><updated>2015-02-16T09:56:54.453+00:00</updated><title type='text'>Free e-book giveaway on 9th of February 2015</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Please answer a short survey &lt;a href=&quot;https://docs.google.com/forms/d/1AsBmMxAf9M-sflCI3zKFySabYwlhMVEkuUxaoKY_mNw/viewform?usp=send_form&quot;&gt;here&lt;/a&gt; and qualify to win a free e-book copy of my &quot;Learning AngularJS for .NET Developers&quot; book on 9th of February 2015﻿.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/1677215585969528489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/1677215585969528489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1677215585969528489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1677215585969528489'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2015/02/free-e-book-giveaway-on-9th-of-february.html' title='Free e-book giveaway on 9th of February 2015'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-1197588976645804187</id><published>2014-07-25T08:34:00.000+01:00</published><updated>2015-10-08T10:22:33.623+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="Karma"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="Protractor"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Free sample chapter &quot;Testing and Debugging AngularJS Applications&quot; from my recently launched book &quot;Learning AngularJS for .NET developers&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp; My book&amp;nbsp;&lt;a href=&quot;http://bit.ly/1sUFzQj&quot; target=&quot;_blank&quot;&gt;Learning AngularJS for .NET Developers&lt;/a&gt;&amp;nbsp;(&lt;a href=&quot;http://alexvpop.blogspot.com/2014/06/announcing-learning-angularjs-dotnet.html&quot; target=&quot;_blank&quot;&gt;announced here&lt;/a&gt;) was published today and it offers a free chapter called &quot;Testing and Debugging AngularJS Applications&quot; available &lt;a href=&quot;http://bit.ly/1sUFITV&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&amp;nbsp; This chapter showcases some of the first examples available of integrating Karma and Protractor test runners for AngularJS in Visual Studio through Node.js Tools for Visual Studio.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;div&gt;
&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://karma-runner.github.io/&quot; target=&quot;_blank&quot;&gt;Karma&lt;/a&gt; and &lt;a href=&quot;https://github.com/angular/protractor&quot; target=&quot;_blank&quot;&gt;Protractor&lt;/a&gt; are test runners that were built specifically for testing AngularJS applications. Both can be also be used to test non-AngularJS applications while they have AngularJS specific functionality that is explored in the chapter.&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; Getting Karma and Protractor configured in Visual Studio was the essential step that allowed me to properly introduce AngularJS testing for the main sample application of the book. By using Node.js Tools for Visual Studio available at&amp;nbsp;&lt;a href=&quot;https://nodejstools.codeplex.com/&quot; target=&quot;_blank&quot;&gt;nodejstools.codeplex.com&lt;/a&gt;&amp;nbsp;I was able to integrate the Node.js testing pipeline with the JavaScript files of my sample AngularJS ASP.NET MVC application. Of course all the tests can also be executed via the command line even if you don&#39;t have Node.js Tools for Visual Studio installed.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; I was also able to use a Visual Studio extension&amp;nbsp;&lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/bfe6feb7-7ec4-4e8e-9d90-cf6ea2cd2169&quot; target=&quot;_blank&quot;&gt;VS Adapter for Google&#39;s Karma Test Runner&lt;/a&gt;&amp;nbsp;that displayed Karma tests results in the Visual Studio Test Explorer which is another nice integration with the Node.js ecosystem.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; The second part of the chapter tackles testing ServiceStack web services via the&amp;nbsp;&lt;a href=&quot;http://xbehave.github.io/&quot;&gt;xBehave.net&lt;/a&gt;&amp;nbsp;test framework &amp;nbsp;and examples of unit testing classes using both &lt;a href=&quot;https://github.com/xunit/xunit&quot; target=&quot;_blank&quot;&gt;xUnit.net&lt;/a&gt; and xBehave.net. As xBehave.net is built on top of xUnit.net you can switch between different styles of testing easily as showcased in the examples.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;The chapter ends with the topics of debugging AngularJS application and ensuring Internet Explorer 8 and 9 compatibility. The examples index for&amp;nbsp;&quot;Chapter 5: Testing and Debugging AngularJS Applications&quot;&amp;nbsp;can be found on the main sample application repository wiki&amp;nbsp;at&amp;nbsp;&lt;a href=&quot;https://github.com/popalexandruvasile/rentthatbike/wiki&quot; target=&quot;_blank&quot;&gt;github.com/popalexandruvasile/rentthatbike/wiki&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can find the list of headings for the free sample chapter below under &quot;Chapter 5: Testing and Debugging AngularJS Applications&quot;. Here is the full table of contents of the book:&lt;/div&gt;
&lt;div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 1: Introducing AngularJS&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Presenting AngularJS with examples&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;A jQuery example&lt;/li&gt;
&lt;li&gt;An AngularJS example&lt;/li&gt;
&lt;li&gt;Introducing the AngularJS controller&lt;/li&gt;
&lt;li&gt;An overview of the AngularJS architecture&lt;/li&gt;
&lt;li&gt;The Model-View-Controller pattern&lt;/li&gt;
&lt;li&gt;The structure of an AngularJS application&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrapping an AngularJS application&lt;/li&gt;
&lt;li&gt;Defining module dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;The JavaScript patterns and practices used in AngularJS applications&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Immediately-invoked Function Expression&lt;/li&gt;
&lt;li&gt;The revealing module pattern&lt;/li&gt;
&lt;li&gt;The strict mode of JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Dependency injection&lt;/li&gt;
&lt;li&gt;Introducing AngularJS services&lt;/li&gt;
&lt;li&gt;Directives&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The ngRepeat directive&lt;/li&gt;
&lt;li&gt;The ngInclude directive&lt;/li&gt;
&lt;li&gt;Creating a custom directive&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 2: Creating an AngularJS Client-side Application  in Visual Studio&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Using Visual Studio with NuGet to manage AngularJS  and related libraries&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Introducing NuGet&lt;/li&gt;
&lt;li&gt;Using Visual Studio extensions for AngularJS&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Prototyping client-side components&lt;/li&gt;
&lt;li&gt;Organizing client-side code&lt;/li&gt;
&lt;li&gt;Integrating AngularJS with JavaScript libraries&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Native JavaScript libraries and AngularJS&lt;/li&gt;
&lt;li&gt;Third-party user interface libraries and AngularJS&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Creating a bicycle rental management application&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Creating the application layout&lt;/li&gt;
&lt;li&gt;Implementing the Bicycles views&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The Bicycles index view&lt;/li&gt;
&lt;li&gt;The Bicycles new view&lt;/li&gt;
&lt;li&gt;The Bicycles edit view&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Implementing the Customers views&lt;/li&gt;
&lt;li&gt;Implementing the Rentals views&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 3: Creating .NET Web Services for AngularJS&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;RESTful web services&lt;/li&gt;
&lt;li&gt;Choosing a RESTful web services framework&lt;/li&gt;
&lt;li&gt;Why ServiceStack is a great fit for AngularJS&lt;/li&gt;
&lt;li&gt;ServiceStack overview&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Setting up the ServiceStack starter project&lt;/li&gt;
&lt;li&gt;Creating ServiceStack web services&lt;/li&gt;
&lt;li&gt;Using the ServiceStack C# client&lt;/li&gt;
&lt;li&gt;The ServiceStack infrastructure&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;li&gt;Request and response filters&lt;/li&gt;
&lt;li&gt;Dependency injection&lt;/li&gt;
&lt;li&gt;Automatic validation&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;Creating web service methods for the sample application&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;ServiceStack project structure&lt;/li&gt;
&lt;li&gt;Implementing Bicycles-related web services&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The GET web service methods&lt;/li&gt;
&lt;li&gt;The POST web service method&lt;/li&gt;
&lt;li&gt;The PUT web service method&lt;/li&gt;
&lt;li&gt;Merging PUT and POST request DTOs&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;Calling RESTful web services in AngularJS using the ngResource module&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Using the $resource service&lt;/li&gt;
&lt;li&gt;Resource class methods&lt;/li&gt;
&lt;li&gt;Resource instance methods&lt;/li&gt;
&lt;li&gt;Custom resource methods&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 4: Creating an AngularJS, ASP.NET MVC, ServiceStack Application&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Using ASP.NET MVC as the application backbone&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Why you should use ASP.NET MVC&lt;/li&gt;
&lt;li&gt;Adding ASP.NET MVC to the main sample application&lt;/li&gt;
&lt;li&gt;Integrating ASP.NET MVC with ServiceStack&lt;/li&gt;
&lt;li&gt;Routing considerations for ASP.NET MVC and AngularJS&lt;/li&gt;
&lt;li&gt;Using ASP.NET bundling and minification features for AngularJS files&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Securing the AngularJS application&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Using the ServiceStack.Mvc library&lt;/li&gt;
&lt;li&gt;The building blocks of the ServiceStack security infrastructure&lt;/li&gt;
&lt;li&gt;Introducing the AuthFeature plugin&lt;/li&gt;
&lt;li&gt;Implementing authentication for web services&lt;/li&gt;
&lt;li&gt;Implementing authentication for ASP.NET MVC controllers&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Pushing initial data from the server-side application to the AngularJS application&lt;/li&gt;
&lt;li&gt;How to ensure that AngularJS works well with the backend&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Handling the waiting time for long operations&lt;/li&gt;
&lt;li&gt;Handling exceptions and implementing generic animations&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Adding a $http interceptor&lt;/li&gt;
&lt;li&gt;Implementing spinner animations for all web service calls&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;Adding database persistence&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Adding database persistence to the AuthFeature plugin&lt;/li&gt;
&lt;li&gt;Adding database persistence for web services&lt;/li&gt;
&lt;li&gt;Persisting the Bicycle class&lt;/li&gt;
&lt;li&gt;Changing BicycleRepository to use the OrmLite API&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 5: Testing and Debugging AngularJS Applications&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Overview of testing AngularJS applications&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Introducing Node.js&lt;/li&gt;
&lt;li&gt;Setting up the Node.js environment&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Unit testing AngularJS components&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Installing Karma&lt;/li&gt;
&lt;li&gt;Configuring Karma&lt;/li&gt;
&lt;li&gt;Creating AngularJS unit tests with Jasmine&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Jasmine essentials&lt;/li&gt;
&lt;li&gt;Using the ngMock module for the first test&lt;/li&gt;
&lt;li&gt;Mocking remote server calls with $httpBackend&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;Testing an AngularJS application end to end&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Installing Protractor&lt;/li&gt;
&lt;li&gt;Configuring Protractor&lt;/li&gt;
&lt;li&gt;Writing Protractor tests&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Testing web service endpoints&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Configuring self-hosted ServiceStack web services&lt;/li&gt;
&lt;li&gt;Adding BDD tests with xBehave.net&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Unit testing .NET code&lt;/li&gt;
&lt;li&gt;Techniques to debug AngularJS applications&lt;/li&gt;
&lt;li&gt;Support for HTML5 validation and older browsers such as Internet Explorer 8 and 9&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chapter 6: Advanced AngularJS Topics&lt;/h2&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Internationalization and localization&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Using the ngLocale module&lt;/li&gt;
&lt;li&gt;Using the angular-dynamic-locale module&lt;/li&gt;
&lt;li&gt;Other internationalization-related topics&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Using AngularJS animations&lt;/li&gt;
&lt;li&gt;Working with remote web services&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Using JSONP&lt;/li&gt;
&lt;li&gt;Using CORS&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Template caching&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/1197588976645804187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/1197588976645804187' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1197588976645804187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1197588976645804187'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2014/07/free-sample-chapter-testing-angularjs.html' title='Free sample chapter &quot;Testing and Debugging AngularJS Applications&quot; from my recently launched book &quot;Learning AngularJS for .NET developers&quot;'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-8930253341375414434</id><published>2014-06-16T22:32:00.000+01:00</published><updated>2014-09-22T11:34:07.313+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="ServiceStack"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Announcing my upcoming book &quot;Learning AngularJS for .NET developers&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
UPDATE: The book was launched on 25/07/2014 and it has a free chapter &quot;Testing and debugging AngularJS applications&quot; that is described&amp;nbsp;&lt;a href=&quot;http://alexvpop.blogspot.com/2014/07/free-sample-chapter-testing-angularjs.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
My blog was a bit quiet in the past 6 months and I had a good reason for this. Since February I am working on a book called &lt;a href=&quot;http://bit.ly/1sUFzQj&quot; target=&quot;_blank&quot;&gt;&quot;Learning AngularJS for .NET developers&quot;&lt;/a&gt; covering the intersection between AngularJS, ServiceStack, ASP.NET MVC and ... Node.js. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;The book is an expansion of my previous blog post&amp;nbsp;&lt;a href=&quot;http://alexvpop.blogspot.co.uk/2013/12/angularjs-servicestack.html&quot; target=&quot;_blank&quot;&gt;Using AngularJS with ServiceStack while keeping ASP.NET MVC in the background&lt;/a&gt;&amp;nbsp;and is a concentrated introduction for building single page web applications with AngularJS and .NET.&lt;br /&gt;
The content is divided in three main sections:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;An introduction to AngularJS the popular JavaScript MVC framework originally designed to develop testable web applications faster. This section finishes with building a sample client side application in Visual Studio;&lt;/li&gt;
&lt;li&gt;A section about creating web services using ServiceStack. It highlights features that make this process very efficient with minimal code required;&lt;/li&gt;
&lt;li&gt;A final section about integrating AngularJS, ServiceStack, ASP.NET MVC and securing the sample application. The section continues with adding data persistence support with the micro-ORM ServiceStack.OrmLite framework. There is a chapter on testing where I can use Node.js to test the AngularJS application thanks to the recent beta release of &quot;Node.js Tools for Visual Studio&quot;. I am using Karma and Protractor with Jasmine to define and run the JavaScript and end to end tests. For&amp;nbsp;.NET integration and unit tests&amp;nbsp;I am using the xBehave.net&amp;nbsp;BDD test framework. The section end with a chapter on advanced topics like internationalisation, using animations and working with remote web services.&lt;/li&gt;
&lt;/ul&gt;
The book is focused on a modern web development workflow meant to improve developer productivity within the context of Visual Studio. This workflow should give you great results when integrating AngularJS with .NET web applications and one of its highlights is the integration with Node.js based test runners for user interface tests.&lt;br /&gt;
All the examples from this book do not require a commercial license for Visual Studio or for any of the frameworks or libraries that were used. The minimum requirement is the free Visual Studio 2013 Express for Web that supports &quot;Node.js Tools for Visual Studio&quot; and Web Essentials 2013.&lt;br /&gt;
I provided some of the AngularJS examples on &lt;a href=&quot;http://plnkr.co/tags/angularjs-dotnet-book&quot;&gt;plnkr.co/tags/angularjs-dotnet-book&lt;/a&gt;&amp;nbsp;and all the examples from this book are on GitHub so anyone can clone the book examples repositories. The examples are split in two repositories:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;One covering examples for specific concepts around client side and server side development hosted at&amp;nbsp;&lt;a href=&quot;https://github.com/popalexandruvasile/angularjs-dotnet-book&quot; target=&quot;_blank&quot;&gt;github.com/popalexandruvasile/angularjs-dotnet-book&lt;/a&gt;&amp;nbsp;and at&amp;nbsp;&lt;a href=&quot;http://plnkr.co/tags/angularjs-dotnet-book&quot; target=&quot;_blank&quot;&gt;plnkr.co/tags/angularjs-dotnet-book&lt;/a&gt;&amp;nbsp;so they can be executed directly. You can find the example index on the repository home page;&lt;/li&gt;
&lt;li&gt;One representing the main sample application built incrementally throughout the book at&amp;nbsp;&lt;a href=&quot;https://github.com/popalexandruvasile/rentthatbike&quot; target=&quot;_blank&quot;&gt;github.com/popalexandruvasile/rentthatbike&lt;/a&gt;. All chapters examples are found as branches for this repository. You cand find the example index on repository wiki homepage at &lt;a href=&quot;https://github.com/popalexandruvasile/rentthatbike/wiki&quot; target=&quot;_blank&quot;&gt;github.com/popalexandruvasile/rentthatbike/wiki&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/8930253341375414434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/8930253341375414434' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8930253341375414434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8930253341375414434'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2014/06/announcing-learning-angularjs-dotnet.html' title='Announcing my upcoming book &quot;Learning AngularJS for .NET developers&quot;'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-6458259934728824978</id><published>2013-12-12T08:12:00.000+00:00</published><updated>2014-08-13T15:21:53.096+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="ServiceStack"/><title type='text'>Using AngularJS with ServiceStack while keeping ASP.NET MVC in the background </title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
UPDATE: This post is now only valid for ServiceStack v3. ServiceStack v4 has now built in support for a Windows Authentication Provider:&amp;nbsp;&lt;a href=&quot;https://github.com/ServiceStack/ServiceStack/blob/master/release-notes.md#windows-auth-provider-for-aspnet&quot;&gt;https://github.com/ServiceStack/ServiceStack/blob/master/release-notes.md#windows-auth-provider-for-aspnet&lt;/a&gt;&amp;nbsp;. &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; I mentioned in a &lt;a href=&quot;http://alexvpop.blogspot.com/2013/08/whyservicestack.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;&amp;nbsp;the productivity gains on the server side front when using the excellent ServiceStack framework. In this post I want to present a starter application that relies on AngularJS and ServiceStack to provide almost all its functionality while using ASP.NET MVC for very few and specific features.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; Soon after ServiceStack has introduced support for the Razor view engine I started to question why would you use ASP.NET Web Forms or ASP.NET MVC features when similar functionality is now available in ServiceStack? Especially if you use a client side JavaScript framework like Backbone.js, AngularJS or Ember.js - you can now use ServiceStack on its own with no dependencies on ASP.NET.&lt;br /&gt;
&amp;nbsp; However there are some constraints that you need to factor in when you design a web application that needs to integrate with existing systems. I think you cannot rule out completely the ASP.NET Web Forms and ASP.NET MVC frameworks if you answer yes to any of this questions:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;do you need to use Windows authentication?&lt;/li&gt;
&lt;li&gt;do you need to expose/reuse &quot;.asmx&quot; web services or WCF endpoints?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&amp;nbsp; For my application the answer was yes to all questions and I decided to use the ServiceStack framework in combination with ASP.NET MVC. This allowed me to rely on the built in Windows authentication provided by ASP.NET MVC without having to write any code to support it and to be able to use almost any .NET server side endpoint.&lt;br /&gt;
&amp;nbsp; The application structure has only one server side view created as a result of a default controller action and this view provides just two functions: build the application HTML skeleton by loading the layout file and initiate a single page JavaScript application powered by AngularJS.&lt;br /&gt;
&amp;nbsp; All the application data is loaded by AngularJS resource objects from ServiceStack powered webservices that are secured by the existing ASP.NET authenticated session. With this structure I can create new controller actions, WCF services or even ASP.NET Web Forms pages and use the built in ServiceStack inversion of control container to instantiate any of its registered dependencies.&lt;br /&gt;
&amp;nbsp; One of the highlights of this setup apart from using AngularJS was how easy and seamless I could test all my ServiceStack endpoints using the friendly &lt;a href=&quot;http://xbehave.github.io/&quot; target=&quot;_blank&quot;&gt;xBehave.net&lt;/a&gt; testing framework and the indispensable test data generation framework &lt;a href=&quot;https://github.com/AutoFixture/AutoFixture&quot; target=&quot;_blank&quot;&gt;AutoFixture&lt;/a&gt;.&lt;br /&gt;
&amp;nbsp; Setting this all up was relatively straightforward thanks to many community contributions and the very good ServiceStack documentation. However in order to speed up the process for anyone looking for a similar solution I created a starter project that has all the features I mentioned above. I began with a simple ASP.NET MVC project and I tried to ensure all my subsequent commits are organised in logical steps so you can see how everything was put together.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; The next steps for this project are to add some tests that exemplify how easy is to test ServiceStack endpoints, upgrade to ASP.NET MVC 5 and ServiceStack 4, create a similar project that can be used as an &quot;app for SharePoint&quot; web application.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;NOTES:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;the starter project can be found &lt;a href=&quot;https://github.com/popalexandruvasile/AngularJS-ServiceStack-Starter&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;a key part of this project around sharing the ASP.NET session with ServiceStack was taken from a &lt;a href=&quot;http://stackoverflow.com/a/9193782/523296&quot; target=&quot;_blank&quot;&gt;StackOverflow answer&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/6458259934728824978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/6458259934728824978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/6458259934728824978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/6458259934728824978'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2013/12/angularjs-servicestack.html' title='Using AngularJS with ServiceStack while keeping ASP.NET MVC in the background '/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-8646301214650283555</id><published>2013-10-11T21:00:00.000+01:00</published><updated>2013-12-21T20:43:31.347+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="ServiceStack"/><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint"/><title type='text'>Apps for SharePoint and modern web applications</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; In a previous &lt;a href=&quot;http://alexvpop.blogspot.co.uk/2013/03/sharepoint-2013-starts-to-embraces-open.html&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt; I mentioned &amp;nbsp;a couple of improvements that the new &quot;apps for SharePoint&quot; model brings for the wider web development community. After developing a couple of web applications using this model I want to elaborate on the new technologies and practices that it made possible.&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; First a quick overview of the new development model. This model does not use the SharePoint server side libraries and it does not require to develop your application on a computer with SharePoint installed. It introduces two new types of applications for SharePoint:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;one is a collection of web pages with no server-side code behind. You can only use HTML, CSS and JavaScript to build your user interface and for application logic. This application will be deployed directly to and hosted by SharePoint.&lt;/li&gt;
&lt;li&gt;one is a standalone web application that can use any technology(client or server side) to render the user interface and provide functionality. You have to handle the deployment of the web application alongside SharePoint or a standalone/remote server if you use the &quot;provider-hosted&quot; option. You can also deploy to Windows Azure if you use the &quot;auto-hosted&quot; option.&lt;/li&gt;
&lt;/ul&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; Both types of applications can expose &quot;app parts&quot; for SharePoint which are similar with classic SharePoint web parts and/or provide an immersive experience where it builds all the user interface. I will only discuss about the &quot;provider-hosted&quot; web application in its incarnation as a .NET implementation.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; In Visual Studio 2012 the &quot;app for SharePoint&quot; project wizard creates an ASP.NET Web Forms application and adds a reference to the &quot;App for SharePoint Web Toolkit&quot; package that is responsible for integration with SharePoint.&amp;nbsp;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; You can change the default behaviour and switch to ASP.NET MVC by adding the relevant packages and slightly modifying the project structure(in Visual Studio 2013 you can create an ASP.NET MVC application from the project wizard). At this point your SharePoint application has become an ASP.NET MVC application that is easier to test and closer to a web application rather than a web site.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; Speaking of testability you can now move all the interactions with SharePoint behind an interface making these easier to mock or simulate. You can debug and test your application without any SharePoint server available which is a useful and important change from the previous development model.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; I was able to move one step further than ASP.NET MVC and use a JavaScript client-side framework for buiding most of the user interface. The main driver for this was the need to be able to build &quot;SharePoint-hosted&quot; applications which have a requirement for HTML, CSS and JavaScript.&lt;br /&gt;
&amp;nbsp; For my first project I used a JavaScript framework based on the MVVM pattern but I soon discovered its limitations like verbose code for databinding, proliferation of string based html templates and making it too easy to mix application logic code with user interface generation code.&lt;br /&gt;
&amp;nbsp; In my next project I used &lt;a href=&quot;http://angularjs.org/&quot; target=&quot;_blank&quot;&gt;AngularJS&lt;/a&gt; as my client side framework and this helped me to:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;reduce the JavaScript code size dramatically;&lt;/li&gt;
&lt;li&gt;keep all user interface code in clean, nicely formatted and easy to read html files;&lt;/li&gt;
&lt;li&gt;have a very clear separation between user interface code and the rest of the code;&lt;/li&gt;
&lt;li&gt;test JavaScript code a lot easier.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp; I have extensively used its companion libraries from the&amp;nbsp;&lt;a href=&quot;http://angular-ui.github.io/&quot; target=&quot;_blank&quot;&gt;AngularUI&lt;/a&gt;&amp;nbsp;project and I was able to employ native Bootstrap directives and simplify all the user interface building tasks. AngularJS has great support for RESTful web services and this plained nicely with my server side code. I was very impressed with the power of this framework and it saved a lot of time and effort overall.&lt;br /&gt;
&amp;nbsp;The user interface has built using a single ASP.NET MVC view to render a web page skeleton and handle the CSS and Javascript assets. It allowed AngularJS to take over and render the main content of the page and handle all navigation events. I hope to cover this aspects on a separate blog post soon.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; On the server side I have used the ServiceStack web services framework to create RESTful endpoints and this allowed me to reduce a lot of my development costs compared to ASP.NET Web Api. As ServiceStack it is very testable I had a good coverage for my server side code(see my previous&amp;nbsp;&lt;a href=&quot;http://alexvpop.blogspot.co.uk/2013/08/whyservicestack.html&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt;&amp;nbsp;for a brief overview of ServiceStack).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Switching to the &quot;apps for SharePoint&quot; application model allowed me to used modern web frameworks, build more testable and tested code and reuse a lot of tools and techniques employed for standalone web applications. It made it easy to introduce web developers to this type of applications as now the main requirement is a good command of modern web development technologies: HTML, CSS, JavaScript and RESTful web services.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
NOTES:&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;My presentation slides on this subject can be found &lt;a href=&quot;http://www.slideshare.net/AlexPop2/apps-for-share-point-2013-25233270&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Further details on the &quot;apps for SharePoint&quot; model can be found &lt;a href=&quot;http://msdn.microsoft.com/library/office/apps/fp179930(v=office.15)&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/8646301214650283555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/8646301214650283555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8646301214650283555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8646301214650283555'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2013/10/appsforsharepoint-modernweb.html' title='Apps for SharePoint and modern web applications'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-219113294922057651</id><published>2013-08-20T22:59:00.000+01:00</published><updated>2015-12-09T13:59:27.691+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="ServiceStack"/><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><title type='text'>Productivity gains with the ServiceStack web framework</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I am using the ServiceStack web framework with great success for almost a year and I want to expand &amp;nbsp;on why I have chosen it, its benefits and why it should be an essential part of &amp;nbsp;your software toolbox.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; Building modern web applications is challenging due to the rapid rate of innovation within the industry. JavaScript frameworks have gained momentum and a significant number of client side web frameworks are now replacing or at least complementing established server side web frameworks. The number of devices that connect to a web application is increasing together with the display form factors and input interface types.&lt;br /&gt;
&amp;nbsp; A good server side web framework should help in building a rich and versatile API, support the modern web and enforce a clean application architecture. It is a strategic asset and it should be chosen carefully.&lt;br /&gt;
&amp;nbsp;Fortunately there are quite a few .NET web frameworks that match these requirements - all open source and accepting community contributions:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;community based - ServiceStack, OpenRasta, Simple.Web, NancyFx, FubuMVC, Oak;&lt;/li&gt;
&lt;li&gt;provided by Microsoft - ASP.NET Web Api and ASP.NET MVC(with some extra components on top).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp; At the time of my initial experiments with these frameworks(second half of 2012) I quickly found out that ASP.NET Web Api was missing important functionality out of the box: &lt;a href=&quot;http://en.wikipedia.org/wiki/JSONP&quot; target=&quot;_blank&quot;&gt;JSONP&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;http://en.wikipedia.org/wiki/Cross-origin_resource_sharing&quot; target=&quot;_blank&quot;&gt;CORS&lt;/a&gt;&amp;nbsp;support, had only a handful of media formatters. You could either dig up some blog entries that provided some of the missing pieces or you could implement them yourself. The same thing was true for ASP.NET MVC: it needed open source components like &lt;a href=&quot;http://restfulrouting.com/&quot; target=&quot;_blank&quot;&gt;Restful Routing&lt;/a&gt; to facilitate a resource oriented architecture and content negotiation.&lt;br /&gt;
&amp;nbsp; If I had to rely on open source community contributions and also spend development time to compensate for missing features shouldn&#39;t I check if one of the alternative web frameworks is a better choice? At this point I already looked at code samples and read blog entries for many of the web frameworks out there but getting code to work was the only way to do a proper assessment.&lt;br /&gt;
&amp;nbsp;All of the community based frameworks that I looked into were interesting and their authors invested a lot of effort and some even had a lot of community contributions. I think any of them could easily replace/complement the Microsoft ones, but in the end the ServiceStack framework came on top due to many factors that outweighed the benefits of the other frameworks:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Maturity - was around for a couple of years with consistent and frequent commits from its authors and its contributors;&lt;/li&gt;
&lt;li&gt;Community involvement - over 200 contributors with a very active discussion group and lot of samples - I think it is the .NET project that has the biggest community involvement;&lt;/li&gt;
&lt;li&gt;Excellent documentation: a very well written and thorough wiki, lots of blog entries, podcasts and screencasts;&lt;/li&gt;
&lt;li&gt;Message based architecture - an interesting approach that contrasted with the rest of the frameworks;&lt;/li&gt;
&lt;li&gt;One stop framework - covers all development needs while allowing to replace/enhance its parts. It embeds popular and fast open source components like Funq, MiniProfiler, FluentValidation and it also provides its own excellent components: serializers, cache clients, authentication, authorization, ORM.&lt;/li&gt;
&lt;li&gt;Commercial support is on the way - this is a unique feature for ServiceStask and it is very useful if you need guaranteed support.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp; Everything looks good on paper until you use it in anger. After implementing a couple of projects with ServiceStack I can now look back and report that:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;I didn&#39;t had any problems/bugs: everything just worked really well;&lt;/li&gt;
&lt;li&gt;It stayed out of my way: I was able to concentrate and work on application code with minimal infrastructure code required;&lt;/li&gt;
&lt;li&gt;It works very well alongside ASP.NET and ASP.NET MVC: I was able to use ASP.NET for windows authentication and as an application shell while relying on ServiceStack for API functionality;&lt;/li&gt;
&lt;li&gt;Very useful for building resource oriented applications: the message based architecture really shines by helping you to think in terms of routes and data transfer objects for each request and response;&lt;/li&gt;
&lt;li&gt;It works very well with JavaScript applications and AngularJS: if your API is resource oriented than it will work seamlessly with the AngularJS ngResource component;&lt;/li&gt;
&lt;li&gt;The one stop framework is the biggest productivity gain: rather than chasing libraries and best practices you can use the built in functionality. The whole framework is based on programming best practices and proven design patterns and if you grow out of something you can easily replace it;&lt;/li&gt;
&lt;li&gt;It helps build testable applications: I found the message based architecture a great benefit for creating outside-in tests. You can start by defining a request and a response class and build your test method starting with just that. You can then write your assertions and start making your test gradually pass by implementing the rest of the functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp; By using a framework that does what described on its wiki I could get my code delivered as expected - no hidden surprises. Thanks to the work of its authors and its contributors ServiceStack is a feature rich and a reliable modern web framework. It is a benchmark for all the other frameworks and if you want to build modern web applications with minimal effort you should give it a try.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;NOTES:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;You can find more about the open source .NET web frameworks and libraries available here: &lt;a href=&quot;http://www.asp.net/mvc/open-source&quot;&gt;http://www.asp.net/mvc/open-source&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;You can find more about ServiceStack here: &lt;a href=&quot;http://www.servicestack.net/&quot;&gt;http://www.servicestack.net/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/219113294922057651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/219113294922057651' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/219113294922057651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/219113294922057651'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2013/08/whyservicestack.html' title='Productivity gains with the ServiceStack web framework'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-2275773641664042810</id><published>2013-06-08T14:23:00.000+01:00</published><updated>2013-08-20T22:55:01.929+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Automated testing as a return on investment proposition</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp;A while ago I presented an automated testing overview which was geared towards developers at first. Following initial feedback I realized that I needed to provide a wider context where I explain the immediate business benefits that automated testing brings to the table. This post is a long delayed accompanying note for the first part of my original presentation.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; There is lot of published literature, together with many blog entries and tutorials around the topic of automated software testing &amp;nbsp;in general. The content is mainly targeted at developers and this allowed this topic to become well known and understood by many.&lt;br /&gt;
&amp;nbsp; I also have encountered situations where developers met resistance from management when they tried to introduce automated testing. I think to overcome this resistance automated testing should be presented slightly different to a non-developer audience: with a stronger emphasis on the business costs and benefits rather than on pure technical merits. &lt;br /&gt;
&amp;nbsp; A distinction is made between functional, integration and unit testing but I prefer to refer to all these types of tests as automated testing. This name helps me to capture two facts:&lt;br /&gt;
- they are coded tests;&lt;br /&gt;
- they can run unattended and on a schedule.&lt;br /&gt;
I think this name also makes the concept simpler to non-developers.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; I have seen teams of developers that wanted to implement automated testing but faced a couple of difficult technical challenges:&lt;br /&gt;
- the third party frameworks used were not testable;&lt;br /&gt;
- their own code was not testable.&lt;br /&gt;
&amp;nbsp; These challenges meant that in order to introduce unit testing or integration testing they had to start a refactoring exercise that had to be included in their planning schedule. Even if the effort was thinned out throughout many development cycles there were a couple of bigger refactorings that had to be undertaken, one at a time. Needless to say these couple of &quot;extra tasks&quot; caused heated discussions between developers, testers and managers leading to long delays in the introduction of automated testing for a particular software product.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; In order to analyze the effort required to introduce automated testing a distinction needs to be made between:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;automated tests that target the product endpoints: (web) service methods, web pages and the user interface in general;&lt;/li&gt;
&lt;li&gt;automated&amp;nbsp;tests that target the product internals: specific classes, integration points.&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp; Usually the refactoring exercise is associated with the effort to test the product internals and these tests interests developers most because they increase the velocity of the development cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; But I think the biggest business value comes from implementing the endpoint tests first. This also follows the principles of outside-in testing and produces test results that can be understood by non-developers.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; A key asset are the quality assurance testing plans that in theory should already describe the manual steps required to test all product endpoints. Having this asset allows you to present the automated testing as a return in investment proposition and the following points become relevant:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Implementing automated testing allows the team to lower the costs associated with tedious manual testing over time.&lt;/li&gt;
&lt;li&gt;By planning the effort to automate the manual test plans you can easily contrast its cost with the total manual testing cost over the lifetime of the product(or a product version).&lt;/li&gt;
&lt;li&gt;Reducing the cost of manual testing does not mean you can also reduce the size of the test team: you &amp;nbsp;allocate more time for exploratory testing which is engaging and will add more value to the software product. Testers are more creative in their explorations, the overall work satisfaction increases and testers will work more with developers to enhance existing tests or discuss new scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp; A successful delivery of this initial effort paves the way for expanding automated testing for the product internals. The key asset here is the analysis of the current velocity for enhancing parts of the product. Having this asset allows to predict and measure the velocity gained after the introduction of automated tests for a specific part of the product.&lt;br /&gt;
&amp;nbsp; Associating a saving cost with each refactoring exercise makes the process measurable and easy to understand by all product stakeholders.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;NOTES&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;My initial presentation slides can be found here: &lt;a href=&quot;http://www.slideshare.net/AlexPop2/automated-testing-overview-25233738&quot; target=&quot;_blank&quot;&gt;Automated testing overview&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;The code used in the presentation demos can be found here: &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/tree/master/UnitTestingOverview&quot; target=&quot;_blank&quot;&gt;Unit testing overview&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;To implement outside-in testing I have successfully used a BDD framework based on xUnit :&amp;nbsp;&lt;a href=&quot;http://xbehave.github.io/&quot; target=&quot;_blank&quot;&gt;xBehave.net&lt;/a&gt;&amp;nbsp;and&amp;nbsp;I strongly recommend it.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/2275773641664042810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/2275773641664042810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/2275773641664042810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/2275773641664042810'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2013/06/automated-testing-as-return-on.html' title='Automated testing as a return on investment proposition'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-1846626989807768018</id><published>2013-03-03T21:23:00.000+00:00</published><updated>2013-08-16T11:24:57.354+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Open source"/><category scheme="http://www.blogger.com/atom/ns#" term="SharePoint"/><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><title type='text'>SharePoint 2013 supports open source / non-Microsoft platforms</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; &amp;nbsp; At this point in time (early 2013) almost all the Microsoft web frameworks and libraries are distributed as open source software: ASP.NET MVC, ASP.NET Web Api, Entity Framework, Reactive Extensions, SignalR. You can contribute back to the original source or you can fork it and start developing and distributing your own flavour.&lt;br /&gt;
If you are a .NET web developer you are now using an open source development stack.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; On the application server front Windows Azure can boot up Linux instances on demand and it can host Node.js, PHP and Java aplications. You can also deploy your Java application to Windows Azure directly from Eclipse. No, this does not mean that the hell has frozen over, it just shows that .NET is not the one and only development framework supported by Microsoft after it has consistently and strategically invested in support for open source software in the last couple of years.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; SharePoint is one of the most profitable products for Microsoft and has recently got a new version &amp;nbsp;SharePoint 2013 that will further strengthen Microsoft&#39;s support for the open source software ecosystem. It introduces a new application model called &quot;Apps for SharePoint&quot; that allows for web content to be delivered/hosted in SharePoint from any web application regardless of its language or its host operating system. If your web framework of choice can output HTML it can become an &quot;App for SharePoint&quot;. The main vehicle to accomplish all these new possibilities is the improved SharePoint 2013 REST api.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; New scenarios are now made possible:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;As a software vendor you can now create or repackage your ASP.NET MVC or Ruby on Rails web applications as &quot;App for SharePoint&quot; applications.&lt;/li&gt;
&lt;li&gt;As an organisation with many internal web based systems you can now gather and expose them under the same SharePoint roof leveraging a single point of entry for authentication and application discovery.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;As an employer of software developers you can now recruit from a larger pool of people as you are no longer constrained by a single language and software framework. You can now experiment and pilot different languages and tools in the eternal quest for the software platform that will reduce development time and effort.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;Microsoft has recognized and adapted to the emerging trends in the software industry and this change&amp;nbsp;will ripple through to all web based enterprise software products that target SharePoint.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot;&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;If you are web developer regardles of your programming language and web framework of choice you now have a new delivery platform with SharePoint 2013.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/1846626989807768018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/1846626989807768018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1846626989807768018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1846626989807768018'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2013/03/sharepoint-2013-starts-to-embraces-open.html' title='SharePoint 2013 supports open source / non-Microsoft platforms'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-4314460924504195893</id><published>2012-10-23T23:53:00.000+01:00</published><updated>2013-08-16T11:26:18.900+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Entity Framework 5 performance improvements for testable applications</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp; &amp;nbsp; Earlier this year I wrote a series of &lt;a href=&quot;http://alexvpop.blogspot.co.uk/2012/02/automate-entity-framework-41-mocking.html&quot; target=&quot;_blank&quot;&gt;posts&lt;/a&gt; about how to automate Entity Framework(EF) testing but since then a lot of things happened: EF 5 was released, it was made open source and Microsoft has published an in-depth &lt;a href=&quot;http://msdn.microsoft.com/en-us/data/hh949853&quot; target=&quot;_blank&quot;&gt;article&lt;/a&gt; about performance tweaks for older versions of EF and performance improvements in EF 5. Following these events I can now expand my previous &lt;a href=&quot;http://alexvpop.blogspot.co.uk/2012/03/automate-entity-framework-41-mocking.html&quot; target=&quot;_blank&quot;&gt;post&lt;/a&gt; and address an important performance consideration around the EF testable interface that I described earlier.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; A common and ugly sight for any application that uses EF in production is the explosion of horrendous CompiledQuery static code constructs: for any Linq to EF query that is called often within your application you have to create a Compiled Query instance to ensure its query plan is cached and to benefit from the extra performance that comes with this change. But CompileQuery objects are suited for the old style EF context class ObjectContext - they are not available for the new DbContext EF context class introduced in EF 4.1.&amp;nbsp;This means that if your application has a lot of chatty database calls you are stuck with ObjectContext because you really need to use those CompiledQuery instances. And this also means you cannot actually do unit testing in this scenario... at least not until EF 5 was released.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; With EF 5 and .NET 4.5 you benefit from automatic compilation of Linq to EF queries. This brings a major &lt;a href=&quot;http://blogs.msdn.com/b/adonet/archive/2012/02/14/sneak-preview-entity-framework-5-0-performance-improvements.aspx&quot; target=&quot;_blank&quot;&gt;boost in performance&lt;/a&gt; for all EF models, removes the need for all those ugly CompiledQuery instances and makes the DbContext class (finally) a worthy replacement for the old ObjectContext class. And yes it means that you can use the &lt;a href=&quot;http://blogs.clariusconsulting.net/kzu/how-to-design-a-unit-testable-domain-model-with-entity-framework-code-first/&quot; target=&quot;_blank&quot;&gt;IDbContext interface&lt;/a&gt; and benefit from unit testing the EF model if this is what your application needs.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/4314460924504195893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/4314460924504195893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4314460924504195893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4314460924504195893'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/10/entity-framework-5-performance.html' title='Entity Framework 5 performance improvements for testable applications'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-1951845223974255991</id><published>2012-10-18T00:59:00.000+01:00</published><updated>2013-08-16T11:26:33.479+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><category scheme="http://www.blogger.com/atom/ns#" term="XAML"/><title type='text'>Post-Silverlight remarks</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp; &amp;nbsp; After spending a year and a half in XAML land using Silverlight extensively I leave with pleasant memories but also with a bitter feeling.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; The main strength of&amp;nbsp;Silverlight&amp;nbsp;is creating complex applications for Windows/Mac OS X with ease while maintaining a low deployment footprint. Silverlight XAML is almost identical with WPF XAML minus a couple of features and this versatility seems to make Silverlight an essential tool for the enterprise application developer. But since Microsoft&amp;nbsp;abruptly&amp;nbsp;shifted focus from Silverlight to HTML5 in 2011 the Silverlight open source ecosystem has imploded rapidly.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Recently&amp;nbsp;&lt;a href=&quot;http://www.automapper.org/&quot; target=&quot;_blank&quot;&gt;AutoMapper&amp;nbsp;&lt;/a&gt;has dropped support for Silverlight (version 2.0 is the last version that supports Silverlight) and I took this rather lightly to begin with knowing that the library is mature and &amp;nbsp;very popular. But soon I discovered that when open source libraries like&amp;nbsp;AutoMapper&amp;nbsp;abandon Silverlight it affects other open source projects too.&amp;nbsp;I found this worrying fact when I was working on adding&amp;nbsp;&lt;a href=&quot;https://github.com/AutoFixture/AutoFixture&quot; target=&quot;_blank&quot;&gt;AutoFixture&lt;/a&gt;&amp;nbsp;support for Silverlight 4. Thanks to some previous attempts to accomplish the same feature I was able to modify and compile the &lt;a href=&quot;https://github.com/popalexandruvasile/AutoFixture&quot; target=&quot;_blank&quot;&gt;AutoFixture assembly for Silverligh&lt;/a&gt;t. But when I tried to make the tests pass for the new assembly(and after getting Resharper to run the xUnit tests for Silverlight) I discovered that some tests were failing. The failed tests were for a bit of code that I had to change to cater for .NET&amp;nbsp;classes&amp;nbsp;and methods that are not available in Silverlight. And this bit of code was originally taken from the AutoMapper source code which now has dropped support for Silverlight:&amp;nbsp;I have problems modifying an open source library to support Silverlight while the other open source library that tried to address similar problems has dropped support for Silverlight.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; I can investigate other solutions - maybe the Moonlight project(Silverlight for Linux) could offer some relief ... but this project was recently abandoned as well. I should continue looking to find an open source project that tries to solve a similar issue but it feels like I am trying to build on an eroding&amp;nbsp;structure. I think this also affects commercial projects as open source projects are facilitating or providing missing features for the Silverlight toolchain - xUnit, ReSharper unit testing, REST clients.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Other parting thoughts are that&amp;nbsp;Silverlight done properly via MVVM and unit testing offers a good model for the emerging enterprise applications that are based on JavaScript, HTML and CSS. It is a very good benchmark for any framework that aims to replace it and it helped me grasp how a rich and complex JavaScript web application should be like. &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/1951845223974255991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/1951845223974255991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1951845223974255991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1951845223974255991'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/10/post-silverlight-impressions.html' title='Post-Silverlight remarks'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-1161736205309322883</id><published>2012-09-18T00:03:00.001+01:00</published><updated>2013-08-16T11:28:30.976+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="PhoneGap"/><title type='text'>Using a desktop shim with a PhoneGap app</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp; I wanted to look at some sample PhoneGap apps code but the cost of setting up an Android/iOS shell project seemed a bit high.&amp;nbsp;Sure it is worth for a real app but if you just want to play around with code and after you paid it a couple of times you start to think &quot;it has to be a better way&quot;. And ... wait for it ... there is.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; The key was the search for &quot;phonegap shim&quot;. This brings back a couple of GitHub repos but some of them look stale. One that looks fresh and juicy is &amp;nbsp;&lt;a href=&quot;https://github.com/jxp/phonegap-desktop&quot; target=&quot;_blank&quot;&gt;jxp/phonegap-desktop&lt;/a&gt;&amp;nbsp;- it even has a wiki. Yay.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; The PhoneGap code that I wanted to poke around was for a jQuery Mobile sample app&amp;nbsp;&lt;a href=&quot;https://github.com/ccoenraets/EmployeeDirectory&quot;&gt;EmployeeDirectory&lt;/a&gt;&amp;nbsp;created by&amp;nbsp;&lt;a href=&quot;http://coenraets.org/blog/&quot; target=&quot;_blank&quot;&gt;Christophe Coenraets&lt;/a&gt;. The intended use of this app is within an Android/iOS project that has the PhoneGap integration already configured. But what happens if I drop the phonegap-desktop folder in the app folder and replace the phonegap.js link in the index.html with a link to&amp;nbsp;phonegap-desktop.js? ... suspense, gasps of awe ... and (some) results.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Not all the way there yet : an error occurs when you try to access resources that are referenced with the &quot;file://&quot; scheme rather than the &quot;http://&quot; one. You can fix this by either serving all resources through a web server(... remember we are on a time budget here) or temporary enable an interesting command line switch in Chrome called allow-file-access-from-file(unsecure and dangerous and totally unrecommended ... but solves my problem fast and cheap).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; After these tweaks I was able to run the EmpployeeDirectory app on my desktop with minimal configuration while modifying and viewing my changes very quickly - no emulators hurt or used in the process.&lt;br /&gt;
&amp;nbsp; Of course all this can be found in my fork of the EmployeeDirectory app &lt;a href=&quot;https://github.com/popalexandruvasile/EmployeeDirectory&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; .&lt;br /&gt;
You just need to open index.html in Chrome and the app will be alive.&lt;br /&gt;
Kudos to &lt;a href=&quot;https://github.com/jxp&quot; target=&quot;_blank&quot;&gt;jxp&lt;/a&gt; and &lt;a href=&quot;https://github.com/ccoenraets&quot; target=&quot;_blank&quot;&gt;ccoenraets&lt;/a&gt; that made this possible.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
NOTES:&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;alternatives for &quot;phonegap-shim&quot; are : &lt;a href=&quot;https://github.com/tigbro/phonegap-proxy&quot;&gt;phonegap-proxy&lt;/a&gt; which comes with some dependencies and&amp;nbsp;&lt;a href=&quot;http://ripple.tinyhippos.com/&quot;&gt;Ripple&lt;/a&gt;&amp;nbsp;which is more of a browser based emulator.&lt;/li&gt;
&lt;li&gt;The command line for the Google Chrome switch is &quot;Chrome --allow-file-access-from-files&quot; for Windows and &quot;/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files&quot; for Mac.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/1161736205309322883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/1161736205309322883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1161736205309322883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/1161736205309322883'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/09/using-desktop-shim-with-phonegap-app.html' title='Using a desktop shim with a PhoneGap app'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-4629991236430007313</id><published>2012-04-20T01:30:00.000+01:00</published><updated>2013-08-22T10:55:00.540+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Performance"/><title type='text'>Load testing .NET applications is (still) expensive</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&amp;nbsp; Performance analysis is&amp;nbsp;usually a late activity in the software development process but a vital one if you have to deploy your application in production.&lt;br /&gt;
After an intense performance analysis session during load testing I decided to share my experience &amp;nbsp;about the tools that I used.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&amp;nbsp; Redgate&#39;s ANTS Performance Profiler(RAPP) is the best tool for performance analysis when you are dealing with small scale application usage scenarios. Very easy to get it up and running and intuitive to use and read the profiling results.&lt;br /&gt;
&amp;nbsp; Visual Studio 2010 Performance Profiler(VSPP) is a good tool as well but is less intuitive to use (you need to spend some time reading about the various configuration options). It is a lot more expensive being part of Visual Studio 2010 Premium Edition which is a couple of thousand $/£/€ more compared to a couple of hundred for RAPP. For small scale usage scenario analysis I would use RAPP exclusively given its price and usability.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; The situation is different when you need to do load testing for a large number of users and when you want to reach the absolute limits of how much load your application can take.&amp;nbsp;RAPP has a bigger overhead than VSPP and makes the load testing process very slow overall - I don&#39;t think RAPP is even meant to be used in this scenario.&amp;nbsp;VSPP has a very small overhead and you can undertake performance analysis while&amp;nbsp;bombarding&amp;nbsp;your application with a lot of requests.&amp;nbsp;It is like this tool has used a back door into the operating system and it just gets the data that it needs.&amp;nbsp;You can download VSPP as &amp;nbsp;command line tool so you can use it on a computer that does not have Visual Studio installed. Although you can gather the test results for free in order to read the final report you need to have at least Visual Studio Premium edition. If you can generate the load test manually or using a third party tool your expenses stop here but if you want to use Visual Studio to generate the load test you have to buy Visual Studio Ultimate edition (which is a lot more expensive than the price of Visual Studio Premium).&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; There&amp;nbsp;is a lot more to be said on this subject but the takeaway is that if you your application needs support a couple of thousand users that perform frequent writes be prepared to invest a lot of many and a reasonable development effort or less money and a considerable amount of effort - load testing in .NET is not cheap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/4629991236430007313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/4629991236430007313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4629991236430007313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4629991236430007313'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/04/load-testing-for-net-applications-is.html' title='Load testing .NET applications is (still) expensive'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-8956827743953959953</id><published>2012-03-10T16:32:00.004+00:00</published><updated>2013-10-12T08:19:09.779+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Mocking"/><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><category scheme="http://www.blogger.com/atom/ns#" term="T4"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Automate Entity Framework 4.x mocking using T4 templates - part 2</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp; In my &lt;a href=&quot;http://alexvpop.blogspot.com/2012/02/automate-entity-framework-41-mocking.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt; I described how to use T4 templates to customize the Entity Framework(EF) code generation in order to introduce EF testability. My test code sample showed a very simple way to inject data and test the business logic without using a physical database. However the code that injects the test data could do with a bit of automation itself. &lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp; I need a helper class that :&lt;/div&gt;&lt;ul dir=&quot;ltr&quot;&gt;&lt;li&gt; &lt;div style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;allows me to easily add test data;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;can create a simple stub for the IDbContext interface – similar with the initial test example;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;can create a mock with some default behaviour already specified - e.g. I need to check that the IDbContext.Delete method is called exactly 3 times for a specific entity but I don’t care about the IDbContext.Add method.&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&amp;nbsp; By using another T4 &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/blob/master/AutomateEntityFrameworkMocking/AutomateEntityFrameworkMocking/Tests/Northwind.TestDbContextBuilder.tt#L43-120&quot; target=&quot;_blank&quot;&gt;template&lt;/a&gt;&amp;nbsp;the helper class is now &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/blob/master/AutomateEntityFrameworkMocking/AutomateEntityFrameworkMocking/Tests/Northwind.TestDbContextBuilder.cs&quot; target=&quot;_blank&quot;&gt;created&lt;/a&gt;. This allows me to refactor the initial test into:&lt;/div&gt;&lt;script src=&quot;https://gist.github.com/popalexandruvasile/2011887.js&quot;&gt;
 
&lt;/script&gt; &lt;br /&gt;
&amp;nbsp; I still have some noise from the data creation code. In a lot of cases I don’t really care about the content of my data, except for a couple of fields or foreign keys. Ideally I should be able to generate objects with default data and set only the bits I need. Fortunately I can use an excellent library called &lt;a href=&quot;http://autofixture.codeplex.com/&quot; target=&quot;_blank&quot;&gt;AutoFixture&lt;/a&gt; to accomplish all this. AutoFixture will populate any new class instances with sensible defaults and supports a lot of customisations that allow you to skip properties and override default values. It is easily extensible and it has become an indispensible tool for all my unit testing needs.&lt;br /&gt;
&amp;nbsp; Using AutoFixture my test is now a lot shorter:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/popalexandruvasile/2011915.js&quot;&gt;
 
&lt;/script&gt; &lt;br /&gt;
&amp;nbsp; At this point unit testing Entity Framework is production ready and the helper class described here should allow me to easily create test data, freeing me from the physical database dependency.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/8956827743953959953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/8956827743953959953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8956827743953959953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8956827743953959953'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/03/automate-entity-framework-41-mocking.html' title='Automate Entity Framework 4.x mocking using T4 templates - part 2'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-4221000865914770437</id><published>2012-02-20T23:18:00.000+00:00</published><updated>2013-10-12T08:18:15.965+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Mocking"/><category scheme="http://www.blogger.com/atom/ns#" term="T4"/><category scheme="http://www.blogger.com/atom/ns#" term="Unit testing"/><title type='text'>Automate Entity Framework 4.x mocking using T4 templates - part 1</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;
&amp;nbsp; Every time I read about a new Entity Framework (EF) release I am hoping to find better support for mocking the physical database. I would like an in memory data provider for Entity Framework - thank you very much. It should enable seamless unit testing with a lot of benefits: fast tests, zero environment configuration, no database setup and tear down, &lt;strike&gt;happy&lt;/strike&gt; less grumpy developers. Until this happens the story of building a testable software product with EF will involve some degree of pain.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&amp;nbsp; If you use the code first model with EF 4.1 you experience the least amount of pain - as you build your classes representing entities you can gradually build an EF abstraction that allows unit testing.&amp;nbsp; An approach using the repository and unit of work patterns is covered thoroughly in the article &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff714955.aspx&quot; target=&quot;_blank&quot;&gt;Testability and Entity Framework 4.0 &lt;/a&gt;by Scott Allen. A lighter approach using a simple interface for the DbContext class is presented in this blog post &lt;a href=&quot;http://blogs.clariusconsulting.net/kzu/how-to-design-a-unit-testable-domain-model-with-entity-framework-code-first/&quot; target=&quot;_blank&quot;&gt;How to design a unit testable domain model with Entity Framework code first&lt;/a&gt; by Daniel Cazzulino. Both articles give a lot of context for exploring testability with EF. I prefer the lighter approach because it has minimal code noise and it behaves like the missing interface for the DbContext class. &amp;nbsp; This interface makes your EF model abstraction look like a POCO: elegant, minimalistic and unit testing friendly.&lt;br /&gt;
&amp;nbsp; In the original Daniel&#39;s article this interface is called IDomainContext - however due to the fact that it should have been part of the EF code I will rename it to IDbContext in my sample.&lt;br /&gt;
&amp;nbsp; I wanted to use this interface in a project that was using a database first model rather than a code first model. I found out that I could easily do this by using the &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/7812b04c-db36-4817-8a84-e73c452410a2&quot; target=&quot;_blank&quot;&gt;DbContext generator T4 templates&lt;/a&gt;. These templates are created and provided by Microsoft. One template will create the DbContext derived class and the second template will create the POCO entity classes for your EF model.&amp;nbsp; Looking at the first template file I could see an &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/blob/master/AutomateEntityFrameworkMocking/AutomateEntityFrameworkMocking/Domain/Northwind.IDbContext.tt#L53-75&quot; target=&quot;_blank&quot;&gt;easy tweak&lt;/a&gt; that allows me to generate the required DbContext interface. Soon I had a nice looking interface that was ready for unit testing:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/popalexandruvasile/1847828.js&quot;&gt;
 
&lt;/script&gt;  &amp;nbsp; From now on every time I modify the .edmx file the interface class is updated automatically.&lt;br /&gt;
The next step is to &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/blob/master/AutomateEntityFrameworkMocking/AutomateEntityFrameworkMocking/Data/Northwind.DbContext.tt#L58&quot; target=&quot;_blank&quot;&gt;modify&lt;/a&gt; the T4 template that generates the DbContext derived class to ensure it implements the IDbContext interface. Some of the methods from the IDbContext interface are implemented in a &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/blob/master/AutomateEntityFrameworkMocking/AutomateEntityFrameworkMocking/Data/Northwind.DbContext.Extended.cs#L14-64&quot; target=&quot;_blank&quot;&gt;partial class&lt;/a&gt; for convenience, but they can be easily embedded in the T4 template.&lt;br /&gt;
At this point I can create unit tests against the IDbContext interface by leveraginq &lt;a href=&quot;http://code.google.com/p/moq/&quot; target=&quot;_blank&quot;&gt;Moq&lt;/a&gt; as a convenient mocking framework.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; Without the EF model abstraction a test method would look like this:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/popalexandruvasile/1894961.js&quot;&gt;
&lt;/script&gt;  &amp;nbsp; Every time I run this test the physical database is hit. For this type of test I need to maintain configuration strings, database state, database backups and restores, clean up and setup scripts. This slows me down in scenarios where I just need to test the business logic code and I don&#39;t care about database roundtrips or I don&#39;t have the development budget to maintain the database infrastructure.&amp;nbsp; &lt;br /&gt;
&amp;nbsp; But thanks to the IDbContext interface I can forget all about these issues and do this:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/popalexandruvasile/1895033.js&quot;&gt;
 
&lt;/script&gt;  &amp;nbsp; I am creating the test data manually and then I am injecting it into my business logic class. From now on I am freed from the concrete EF model and the physical database and I can continue writing unit tests that are cheap to run and mantain.&lt;br /&gt;
&amp;nbsp; The code that creates the test data looks a bit clunky and repetitive: in &lt;a href=&quot;http://alexvpop.blogspot.co.uk/2012/03/automate-entity-framework-41-mocking.html&quot; target=&quot;_blank&quot;&gt;my next blog post&lt;/a&gt; I will present a T4 template that creates a unit testing helper&amp;nbsp; class and I will create a new version of the unit test that looks more efficient.&lt;br /&gt;
&lt;br /&gt;
The full source code for this series of posts is already available on &lt;a href=&quot;https://github.com/popalexandruvasile/Blog-samples/tree/master/AutomateEntityFrameworkMocking&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Scott Allen has recently done a &lt;a href=&quot;http://www.infoq.com/presentations/Testability-and-the-Entity-Framework&quot; target=&quot;_blank&quot;&gt;presentation&lt;/a&gt; where he demoes an EF interface that is similar with Daniel Cazzulino.&lt;/li&gt;
&lt;li&gt;Daniel Cazzulino has packaged up his interface and can be used as part of the open source NetFx NuGet library:&amp;nbsp; &lt;a href=&quot;http://nuget.org/packages/netfx-Patterns.DomainContext.EF&quot; target=&quot;_blank&quot;&gt;NETFx Patterns: Domain Context for Entity Framework&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/4221000865914770437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/4221000865914770437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4221000865914770437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/4221000865914770437'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2012/02/automate-entity-framework-41-mocking.html' title='Automate Entity Framework 4.x mocking using T4 templates - part 1'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-378368163516701468.post-8660530374844659064</id><published>2012-02-12T22:23:00.000+00:00</published><updated>2012-02-20T23:21:40.585+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software development"/><title type='text'>Hello world</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;I recently achieved a professional milestone: a round number of years working as a (.NET) software developer. The number does not mean a lot in itself apart from the fact that it made me think a bit more about my past and current experience.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;This in turn helped me realise a couple of things: &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;I still want to find answers to some of the questions I accumulated so far.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;I learned so much from the software community and it is great to be part of this unprecedented sharing of software knowledge. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;And as a conclusion to my retrospective I want to try and give something back to the community.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;I hope that starting this blog will help me accomplish that. &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alexvpop.blogspot.com/feeds/8660530374844659064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/378368163516701468/8660530374844659064' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8660530374844659064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/378368163516701468/posts/default/8660530374844659064'/><link rel='alternate' type='text/html' href='http://alexvpop.blogspot.com/2011/10/hello-world.html' title='Hello world'/><author><name>Alex Pop</name><uri>http://www.blogger.com/profile/02330146400558070311</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>