<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace V5 Site Server v5.13.159 (http://www.squarespace.com) on Sat, 25 May 2013 00:49:38 GMT--><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>John Liu .NET: Time for Fun in SharePoint</title><link>http://johnliu.net/blog/</link><description></description><lastBuildDate>Tue, 16 Apr 2013 12:57:58 +0000</lastBuildDate><copyright>(c) John Liu</copyright><language>en-US</language><generator>Squarespace V5 Site Server v5.13.159 (http://www.squarespace.com)</generator><item><title>Windows 8 - Export Google Reader OPML for Bing News</title><category>Public Announcement</category><category>rant</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 16 Apr 2013 12:57:58 +0000</pubDate><link>http://johnliu.net/blog/2013/4/16/windows-8-export-google-reader-opml-for-bing-news.html</link><guid isPermaLink="false">358543:3878987:33392808</guid><description><![CDATA[<p>Let the hacks begin!</p>  <p>Windows 8's Bing News app was updated in the last few days and with this new version, an ability was added to allow us to add our own Sources.&#160; RSS sources.</p>  <p>A number of my favourite news sites proceed to discuss this is a good direction to eventually be a viable Google Reader replacement.</p>  <p><a href="http://winsupersite.com/windows-8/windows-8-tip-add-rss-feeds-news-app">http://winsupersite.com/windows-8/windows-8-tip-add-rss-feeds-news-app</a></p>  <p><a href="http://www.liveside.net/2013/04/15/bing-news-app-a-google-reader-replacement-not-yet-but-its-a-start/">http://www.liveside.net/2013/04/15/bing-news-app-a-google-reader-replacement-not-yet-but-its-a-start/</a></p>  <p>&#160;</p>  <p>My lament is that it doesn't seem to accept OPML, a common XML-based description of my RSS feed collection.</p>  <p>&#160;</p>  <h3>Inspiration</h3>  <p>Hmm, I wonder how does Bing News store the RSS feeds that a user has chosen.</p>  <p>&#160;</p>  <h3>Hack</h3>  <p>Windows Apps data are stored within the user's App data.&#160; In my case, it is right here.</p>  <p>C:\Users\John.Liu\AppData\Local\Packages\Microsoft.BingNews_8wekyb3d8bbwe\</p>  <p>Having a quick look around, the custom Source feeds are stored in</p>  <p>\RoamingState\state.json</p>  <p>JSON format is a simple javascript format.&#160; So really, the hack is not even a hack, just converting OPML (XML) to JSON.</p>  <p>A powershell script, <a href="http://johnliu.net/storage/opml-to-bing-news-json.ps1">like this opml-to-bing-news-json.ps1</a>, could do it.</p>  <p>&#160;</p>  <h3>Steps</h3>  <p>&#160;</p>  <ol>   <li>Download your Google Reader files from Google TakeOut.     <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469001" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469002" width="644" height="116" /></a>      <br /></li>    <li>Open the ZIP file and copy the subcriptions.xml file to the same folder as the Powershell script</li>    <li>My region market is &quot;en-au&quot; - check your state.json file to see if you have a different market.&#160; Change it in your powershell script ps1.     <br />      <br />Run it like so...      <br />      <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469003" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469004" width="477" height="50" /></a>      <br /></li>    <li>You should have these files now:     <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469005" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469006" width="596" height="73" /></a>      <br />      <br /></li>    <li>Overwrite the state.json file in AppData with mine...     <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469007" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469009" width="654" height="138" /></a>      <br /></li>    <li>Restart Bing News     <br />      <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469010" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Windows-8---Bing-News-for-Google-Reader_13E8A-?fileId=22469011" width="644" height="366" /></a>      <br /></li>    <li>Bonus.&#160; When I launch my Surface RT, all my feeds are already synchronized there too :-)</li> </ol>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-33392808.xml</wfw:commentRss></item><item><title>Retrospective - Australian SharePoint Conference Sydney 2013</title><category>code</category><category>rant</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Thu, 11 Apr 2013 16:47:17 +0000</pubDate><link>http://johnliu.net/blog/2013/4/11/retrospective-australian-sharepoint-conference-sydney-2013.html</link><guid isPermaLink="false">358543:3878987:33318480</guid><description><![CDATA[<p>I had planned to post this as soon as I finish my session - but you know, conference.&#160; Lots of friends come visit during these events and the evenings do a lot of damage to your hair, and possibly liver.&#160; I don't often get opportunities to chat with so many SharePoint experts in such a short span of time.&#160; Lots of catch up, lots of thoughts, A LOT of ideas.</p>  <p>&#160;</p>  <p>As for my session, Building SharePoint Solutions with Microsoft's TypeScript: how and why.&#160; I think it went well.&#160; I really wanted to thank the audience for being so kind, and stayed awake through the presentation.&#160; As promised, here is my presentation:</p>  <h3>Presentation:</h3> <iframe src="https://skydrive.live.com/embed?cid=28CEFDD8EC195B4A&amp;resid=28CEFDD8EC195B4A%213598&amp;authkey=AKeTg0-1MWTIqPI&amp;em=2" width="402" height="327" frameborder="0" scrolling="no"></iframe> <p>&#160;</p>  <h3>Downloads:</h3>  <ul>   <li><a title="http://sdrv.ms/16VyZyg" href="http://sdrv.ms/16VyZyg">http://sdrv.ms/16VyZyg</a></li>    <li><a title="http://johnliu.net/storage/ts.demo.zip" href="http://johnliu.net/storage/ts.demo.zip">http://johnliu.net/storage/ts.demo.zip</a></li> </ul>  <p>A huge thanks to the organisers, speakers, vendors and attendees for such a fantastic conference.&#160; I hope to see you guys again soon.</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-33318480.xml</wfw:commentRss></item><item><title>InfoPath - reading template.xsd in code for type checking</title><category>InfoPath</category><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Fri, 05 Apr 2013 01:01:32 +0000</pubDate><link>http://johnliu.net/blog/2013/4/5/infopath-reading-templatexsd-in-code-for-type-checking.html</link><guid isPermaLink="false">358543:3878987:33251366</guid><description><![CDATA[<p>InfoPath is the world's most advanced XML-based form system.&#160; Each InfoPath document is a fully structured XML file, and the template contains the XSD schema definition for the XML file.&#160; This includes a bunch of information such as min/max occurrences, as well as the type information for each of the elements.</p>  <p>Because the information for the element's type is stored separately in the xsd file, it isn't possible at runtime to workout what the type of each element is supposed to be.&#160; <br />When we are given:</p>  <ul>   <li>my:value1 </li> </ul>  <p>If we can't read the template.xsd file, we don't know if that's a number, a string, a datetime nor do we know if the field is nillable.&#160; Some fields in InfoPath, such as the boolean and the datetime fields, can't be blank.&#160; They have to be set to nil.</p>  <p>&#160;</p>  <p>Here's how you can read the template.xsd in code</p>  <h3>An InfoPath Form</h3>  <p>&#160;</p>  <p>Here is an InfoPath form with a few fields</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370805" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370809" width="217" height="529" /></a></p>  <p>&#160;</p>  <h3>The XML File Connection</h3>  <p>&#160;</p>  <p>Add a XML File Data Connection to an existing file in the template, I use &quot;template.xml&quot;</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370796" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370797" width="244" height="236" /></a></p>  <p>Save the template, and now drop into the code behind.</p>  <p>&#160;</p>  <h3>Code</h3>  <p>public void InternalStartup()    <br />{     <br />&#160;&#160;&#160; EventManager.FormEvents.Loading += new LoadingEventHandler(FormEvents_Loading);     <br />}</p>  <p>public void FormEvents_Loading(object sender, LoadingEventArgs e)    <br />{     <br /><font style="background-color: #ffff00">&#160;&#160;&#160; FileQueryConnection file = this.DataConnections[&quot;template&quot;] as FileQueryConnection;      <br />&#160;&#160;&#160; file.FileLocation = &quot;template.xsd&quot;;       <br />&#160;&#160;&#160; file.Execute();       <br /></font>&#160;&#160;&#160; XPathNavigator template = this.DataSources[&quot;template&quot;].CreateNavigator();     <br />&#160;&#160;&#160; string notes = &quot;&quot;;</p>  <p>&#160;&#160;&#160; foreach (XPathNavigator nav in this.CreateNavigator().Select(&quot;//*&quot;, this.NamespaceManager))    <br />&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; string localname = nav.LocalName;</p>  <p><font style="background-color: #ffff00">&#160;&#160;&#160;&#160;&#160;&#160;&#160; XPathNavigator element = template.SelectSingleNode(&quot;//*[@name='&quot; + localname + &quot;']&quot;, template);      <br /></font>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (element != null)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; notes += string.Format(&quot;{0} is of type {1} {2}; &quot;, localname, element.GetAttribute(&quot;type&quot;, &quot;&quot;), element.GetAttribute(&quot;nillable&quot;, &quot;&quot;));     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160; this.CreateNavigator().SelectSingleNode(&quot;/my:myFields/my:notes&quot;, this.NamespaceManager).SetValue(notes);    <br />}     <br /></p>  <ul>   <li>The interesting part is at the top, where we bait and switch the FileQueryConnection to read the template.xsd schema file instead.&#160; Because it is a valid XML file, InfoPath will read it happily. </li>    <li>We can then map any field in the main datasource to the corresponding definition in the template, and pull out the additional metadata such as type or nillable. </li> </ul>  <p>&#160;</p>  <h3>Result</h3>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370798" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-ae69d84bff8d_A1B1-?fileId=22370799" width="661" height="359" /></a></p>  <p>&#160;</p>  <h3>Download</h3>  <ul>   <li><a title="http://johnliu.net/storage/TemplateTestForm.xsn" href="http://johnliu.net/storage/TemplateTestForm.xsn">TemplateTestForm.xsn</a></li> </ul>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-33251366.xml</wfw:commentRss></item><item><title>3-step fix Nintex WorkflowDesigner.aspx with your custom system masterpage</title><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Fri, 22 Mar 2013 01:25:12 +0000</pubDate><link>http://johnliu.net/blog/2013/3/22/3-step-fix-nintex-workflowdesigneraspx-with-your-custom-syst.html</link><guid isPermaLink="false">358543:3878987:33093196</guid><description><![CDATA[<h3>Scenario</h3>  <ul>   <li>You have created a wonderful, responsive-design, HTML5 MasterPage for your SharePoint 2010.&#160; It works really well.&#160; </li>    <li>You even did a variation for the system pages.&#160; Those also work very well. </li>    <li>Until you try to use Nintex's Workflow Designer.&#160; That page bombs out.&#160;&#160; Most of the panels don't work, the scrollbars don't work.&#160; The hovers go off screen.&#160; </li>    <li>Your heart sank.</li> </ul>  <p>&#160;</p>  <h3>Your choices</h3>  <ol>   <li>Easiest choice, if you don't have time, is to use v4.master for your system pages.&#160; The biggest problem with this choice is the jarring experience your advanced users will get when they inevitably ends up on a system page and suddenly they are dropped into Vanilla SharePoint zone. </li>    <li>Hardest choice, if you do have the time, is to butt your head against Nintex's WorkflowDesigner page until you win.&#160; I have done this twice in the last two years.&#160; In general, if you start with <a title="http://startermasterpages.codeplex.com/" href="http://startermasterpages.codeplex.com/">http://startermasterpages.codeplex.com/</a> you aren't too bad.&#160; You'll need to pull a few ContentPlaceHolder panels out of hiding, and add a few elements with very specific ID's into your current navigation menu.&#160; <br />This will take you...&#160; about 2 days. I won't go into the details of what you will face.</li> Oh, and God have mercy on your soul.    <br />    <li>This blog entry is about an Interesting third choice.&#160; You can hack Nintex's WorkflowDesigner.aspx file to use v4.master, while all your existing system pages will continue to use your new custom masterpage.</li> </ol>  <p>&#160;</p>  <h3>Consequences</h3>  <ul>   <li>Nintex's WorkflowDesigner.aspx is an application page that resides in _layouts folder on each Web Front End.&#160; You will need to apply this change across all your WFE manually.</li>    <li>When Nintex updates Nintex Workflow, you may need to re-apply this hack.</li>    <li>This hack applies to ALL nintext solutions across the entire WFE.&#160; For all&#160; web applications, site collections.</li> </ul>  <p>&#160;</p>  <h3>How to <em>fix (hack)</em></h3>  <p>   <br />Understand the consequences, the hack is actually REALLY simple</p>  <ol>   <li>Browse to C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\NINTEXWORKFLOW\     <br />Copy this file and make a backup:&#160; WorkflowDesigner.aspx</li>    <li>Open it and find the masterpage reference:&#160; <br />&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;WorkflowDesigner.aspx.cs&quot; Inherits=&quot;Nintex.Workflow.ApplicationPages.WorkflowDesigner,Nintex.Workflow.ApplicationPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=913f6bae0ca5ae12&quot; <font style="background-color: #ffff00">DynamicMasterPageFile=&quot;~masterurl/default.master&quot;</font>&#160; %&gt;      <br /></li>    <li>Change DynamicMasterPageFile to <font style="background-color: #ffff00">MasterPageFile=&quot;../v4.master&quot;       <br /></font>The v4.master sits in \LAYOUTS\v4.master by default making this hack really easy.</li> </ol>  <p>&#160;</p>  <h3>Result</h3>  <ul>   <li>Your custom system masterpage     <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Hacking.aspx-with-your-custom-masterpage_A64B-?fileId=22252603" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Hacking.aspx-with-your-custom-masterpage_A64B-?fileId=22252605" width="244" height="195" /></a>      <br /></li>    <li>Nintex WorkflowDesigner running on v4     <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-Hacking.aspx-with-your-custom-masterpage_A64B-?fileId=22252606" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Hacking.aspx-with-your-custom-masterpage_A64B-?fileId=22252608" width="219" height="244" /></a></li> </ul>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-33093196.xml</wfw:commentRss></item><item><title>Building SharePoint solutions with Microsoft's TypeScript: why and how</title><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Wed, 13 Mar 2013 13:07:56 +0000</pubDate><link>http://johnliu.net/blog/2013/3/13/building-sharepoint-solutions-with-microsofts-typescript-why.html</link><guid isPermaLink="false">358543:3878987:33001463</guid><description><![CDATA[<p>&#160;</p>  <p>I wanted to write up a summary of this presentation that I've had the chance to present at two recent events:&#160; SharePoint Saturday Perth (09/03/2013) and Sydney SharePoint User Group (13/03/2013).</p>  <p>This is a blog post aiming to cover both the feedback I've received, as well as additional notes to the presentation that I may not have covered due to time constraints.</p>  <p>A new and improved version of this entire presentation will be shown at the Australian SharePoint Conference in Sydney, come to my session then!</p>  <h2>Introduction</h2>  <ul>   <li>To cover why, oh why we need another scripting language.&#160; (~15mins).</li>    <li>What is TypeScript</li>    <ul>     <li>TypeScript is free, open source and supported by Microsoft</li>      <li>It is based on ECMA4 standards with ECMA6 proposals.</li>      <li>Created by the father of C# - Anders Hejlsberg</li>      <li>It is a superset of JavaScript</li>   </ul>    <li>Why do we JavaScript+</li>    <ul>     <li>JavaScript: The Good Parts vs. JavaScript: The Definitive Guide</li>      <li>History of JavaScript, but now we use it as a programming language for all sort of things.</li>      <li>JavaScript is not suited for large applications.&#160; </li>      <li>As your JavaScript codebase gets large, it is unwieldy.&#160; </li>   </ul>    <li>JavaScript Problems</li>    <ul>     <li>Untyped variables</li>      <ul>       <li>key: JavaScript is interpreted.&#160; There are no design-time or compile-time assistance to help you point out errors</li>     </ul>      <li>Object-extension based, not class-based inheritance.&#160; </li>      <ul>       <li>Key: although object inheritance is possible, it is too messy, so we learn to live without it.&#160; </li>        <li>This means we are back in an age where we don't define contracts for our code, we don't describe the shape or capabilities of our object upfront, we expect it to all just work at runtime.</li>     </ul>      <li>Parameters - not taken seriously</li>      <ul>       <li>Key: they are sort of like guidelines.&#160; </li>        <li>Caller can still do whatever they want.&#160; Callee has to be defensive and check everything.</li>     </ul>      <li>Scope - while JavaScript shares a similar syntax to C-based languages, it only doe scope at new function levels.</li>      <li>Hoisting</li>      <ul>       <li>Key: an example where JavaScript is so easy to get wrong, with strange weird results.</li>     </ul>      <li>Multiple Files</li>      <ul>       <li>Last problem for today.</li>        <li>JavaScript doesn't understand multiple files.&#160; Visual Studio helps with &lt;reference&gt;, but VS.NET doesn't help you check the correctness of your reference code.</li>     </ul>   </ul> </ul>  <p>&#160;</p>  <h2>Let's look at TypeScript</h2>  <ul>   <li>To ease audience into TypeScript (switch from thinking mode to demo mode ~1min break/reset)</li>    <li>How do you install it?</li>    <ul>     <li>Grab it from <a href="http://typescriptlang.org">http://typescriptlang.org</a> this includes extensions for VS.NET 2012.&#160; </li>      <li>You can do it with VS.NET 2010, but there are manual bits involved.&#160; Installer doesn't help you.</li>   </ul>    <li>First glance</li>    <ul>     <li>Key: a TypeScript function is a JavaScript function with more, optional, bits.</li>   </ul> </ul>  <p>&#160;</p>  <h2>TypeScript Demo</h2>  <ul>   <li>To show simple TypeScript language features (~15min)</li>    <li>Function type checking</li>    <ul>     <li>Intellisense</li>      <li>Generated code</li>      <li>Best way to describe this.&#160; TypeScript is option strict for your JavaScript.</li>   </ul>    <li>Function optional parameters</li>    <li>Module</li>    <ul>     <li>Generated code.&#160; Talk about how JavaScript namespace / scope is possible, but very easy to screw up.</li>   </ul>    <li>Interfaces</li>    <ul>     <li>Defines the shape of an object.&#160; TypeScript works with Shapes.</li>   </ul>    <li>Definition files</li>    <li>jQuery - jQuery methods are smarter with TypeScript.&#160; </li>    <li>SP.UI.ModalDialog.showModalDialog</li>    <ul>     <li>Wrong Url parameter</li>   </ul>    <li>Interfaces are open - so you can extend it</li>    <li>Class-based inheritance</li>    <ul>     <li>Generated code.</li>   </ul>    <li>Export keyword</li> </ul>  <p>&#160;</p>  <h2>New Project - Pinteresp webpart Demo</h2>  <ul>   <li>To show a Complex example of TypeScript and debugging.&#160; (~10min)</li>    <li>Module with:</li>    <ul>     <li>2 interfaces, 3 helper functions, 2 classes and a jQuery ready event handler.</li>      <li>Create a PictureLibrary object.&#160; Call Load()</li>      <li>This populates an Items() array with PictureItem objects.</li>      <li>Call Render() to display to screen.</li>   </ul>    <li>Show how to write the Load method.</li>    <li>Show SourceMap debugging.</li> </ul>  <p>&#160;</p>  <h2>Using TypeScript on your existing projects</h2>  <p>&#160;</p>  <ul>   <li>Discuss strategies to get TypeScript onto an existing project (~10 min)</li>    <li>Get it to work first</li>    <ul>     <li>You don't have to tackle everything at once.&#160; Start with the simple JavaScript file.</li>      <li>Copy everything from JS to TS       <br />The errors that you will see are all related to the fact that TypeScript doesn't know what the objects you are referring to are.</li>   </ul>    <li>Fixing the initial errors</li>    <ol>     <li>Add References</li>      <li>Improve your Definition files</li>      <li>Specify optional parameters</li>      <li>Some specific issues - the main support forum is <a href="http://stackoverflow.com/questions/tagged/typescript">http://stackoverflow.com/questions/tagged/typescript</a>, and they are very responsive.&#160; I blog issues I come across along the way.</li>   </ol>    <li>Refactor - now you can finally clean up that old JavaScript code</li>    <ul>     <li>Here are some things you've ALWAYS wanted to do to that nasty script file but were too afraid to break things.</li>      <li>Move common functions into a shared Utilities module</li>      <ul>       <li>Write detailed jsdoc comments for the functions you use, and you expect your team to use</li>     </ul>      <li>Use rename to fix up the variable names - John's i, j, k, i1, i2 nastiness.</li>      <li>Add more type information to your variable declarations to increase the strictness of your code</li>   </ul> </ul>  <p>&#160;</p>  <h2>History of TypeScript</h2>  <ul>   <li>Release 0.8 to public in 11/2012</li>    <li>0.8.1 added Source Map debugging</li>    <li>0.8.2 added jsdoc</li>    <li>0.8.3 added more debugging options</li>    <li>0.9 scheduled to deliver generics in JavaScript.&#160; So in my example above, I can use an Array of PictureItem objects, and not just an Array of objects with PictureItem in them.</li> </ul>  <p>&#160;</p>  <h2>Summary</h2>  <ul>   <li>The ideal conclusion I want to get to at this point, is that it should be pretty obvious TypeScript is good for your team and your code.</li>    <li>If you plan to read your own significant JavaScript after a 3 month break, you need TypeScript.</li>    <li>If you plan to work on JavaScript with a team, you need TypeScript.</li>    <li>VS.NET development and debugging experience for JavaScript is not bad, but with TypeScript it is awesome.&#160; You need TypeScript.</li> </ul>  <p>&#160;</p>  <h2>The Short Summary</h2>  <ul>   <li>You need TypeScript.</li>    <li>Grab it from <a href="http://typescriptlang.org">http://typescriptlang.org</a>&#160;</li>    <li>See my blog on <a href="http://johnliu.net">http://johnliu.net</a> </li> </ul>  <p>&#160;</p>  <h2>Questions and Comments</h2>  <ul>   <li>CoffeeScript / Dart comparison</li>    <ul>     <li>CoffeeScript is more mature, has more features.</li>      <li>CoffeeScript thinks JavaScript is too broken and needs a new simpler, different syntax to fix it.&#160; TypeScript thinks JavaScript is not broken enough to be replaced.&#160; It just needs to be strengthened.</li>      <li>TypeScript has strong VS.NET integration.</li>   </ul> </ul>  <p>&#160;</p>  <h2>Download Files</h2>  <ul>   <li><a title="http://johnliu.net/storage/TypeScript-SydSPUG.pptx" href="http://johnliu.net/storage/TypeScript-SydSPUG.pptx">http://johnliu.net/storage/TypeScript-SydSPUG.pptx</a></li>    <li><a title="http://johnliu.net/storage/ts.demo.zip" href="http://johnliu.net/storage/ts.demo.zip">http://johnliu.net/storage/ts.demo.zip</a></li> </ul>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-33001463.xml</wfw:commentRss></item><item><title>Making InfoPath 2010 Preview/Debug work again</title><category>InfoPath</category><category>SharePoint</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Mon, 11 Mar 2013 08:42:02 +0000</pubDate><link>http://johnliu.net/blog/2013/3/11/making-infopath-2010-previewdebug-work-again.html</link><guid isPermaLink="false">358543:3878987:32952233</guid><description><![CDATA[<p>Quick blog.&#160; How I fixed InfoPath 2010 Debug/Preview error, after installing Office 2013.</p>  <blockquote>   <p>InfoPath cannot open the selected form because of an error in the form's code.      <br />InfoPath will fail to load this form because Microsoft .NET Framework 3.5 is not installed or is installed incorrectly</p> </blockquote>  <h2>Install .NET Framework 3.5</h2>  <p>First, if you are on Windows 8, you do need to install the .NET Framework 3.5 feature.&#160; Do this via Add Windows Feature control panel.</p>  <p>&#160;</p>  <h2>Reverse the .NET Assembly Binding Redirect Policies</h2>  <p>Fix these two policies that was redirecting v14 references to v15.</p>  <ul>   <li>C:\Windows\assembly\GAC_MSIL\Policy.14.0.Microsoft.Office.InfoPath.Client.Internal.Host\15.0.0.0__71e9bce111e9429c\ Policy.14.0.Microsoft.Office.InfoPath.Client.Internal.Host.config </li>    <li>C:\Windows\assembly\GAC_MSIL\Policy.14.0.Microsoft.Office.InfoPath\15.0.0.0__71e9bce111e9429c\ Policy.14.0.Microsoft.Office.InfoPath.config </li> </ul>  <p>If you just change it to bind to the original version 14: </p>  <ul>   <li>&lt;bindingRedirect oldVersion=&quot;14.0.0.0&quot; newVersion=&quot;1<font style="background-color: #ffff00">4</font>.0.0.0&quot;&gt;&lt;/bindingRedirect&gt; </li> </ul>  <p>&#160;</p>  <h2>Missing IPDMCTRL</h2>  <p>If you see complains about ipdmctrl, copy it from:</p>  <ul>   <li>C:\Program Files (x86)\Microsoft Visual Studio 11.0\Visual Studio Tools for Office\PIA\Common\IPDMCTRL.dll to C:\Program Files\Microsoft Office\Office14\ </li> </ul>  <p>You can find IPDMCTRL in any Visual Studio Tools for Office installation.&#160; Your directory could be different.</p>  <p>&#160;</p>  <h2>Use the Fusion Log Viewer tool</h2>  <p>I figured this out using the fuslogvw tool - which logs .NET assembly loading events, and so I could figure out what it was trying to load when debugging, and failing.</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-dc47101900f8_1114C-?fileId=22148658" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-dc47101900f8_1114C-?fileId=22148660" width="725" height="368" /></a></p>  <p>&#160;</p>  <h2>Pics or it didn't happen</h2>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-dc47101900f8_1114C-?fileId=22148612" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-dc47101900f8_1114C-?fileId=22148613" width="1028" height="556" /></a></p>  <p>&#160;</p>  <p>Here is both VS2012 debugging an InfoPath 2013 form, at the same time as VSTO debugging a separate InfoPath 2010 form.</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32952233.xml</wfw:commentRss></item><item><title>SharePoint Saturday Perth - Building SharePoint solutions with TypeScript: how and why.</title><category>Public Announcement</category><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 05 Mar 2013 13:22:28 +0000</pubDate><link>http://johnliu.net/blog/2013/3/5/sharepoint-saturday-perth-building-sharepoint-solutions-with.html</link><guid isPermaLink="false">358543:3878987:32920459</guid><description><![CDATA[<h2>&#160;</h2>  <p>I'll be presenting a new topic for <a href="http://sharepointsaturday.org/perth/default.aspx">SharePoint Saturday Perth</a> this year, on SharePoint and TypeScript.</p>  <p>While I had begin planning to work with TypeScript since the beginning of the year, I really owe it to <a href="www.chaholl.com/archive/2013/01/03/typescript-in-a-sharepoint-farm-solution.aspx">Charlie Holland's blog post</a> that really got me started.</p>  <p>Anyway, if you see the good parts in my demo, that'd be to his credit.&#160; And if you see the lousy parts?&#160; I'll claim those.</p>  <p>&#160;</p>  <h2>Building SharePoint Solutions with TypeScript</h2>  <p>TypeScript is a new language designed as a superset of JavaScript. Released by Microsoft and designed by the father of C# Anders Hejlsberg. It is designed to ease building large scale applications using JavaScript, and addresses JavaScript shortfalls such as lacking a module system as well as type and compile-time type checking for better error detection and tooling. </p>  <p>SharePoint itself has become increasingly open over the recent versions with numerous new APIs available to client-side scripting, thus allowing more and more complex JavaScript applications. The time seems right that TypeScript will be a great addition to help us envision and attempt even more complex SharePoint solutions. </p>  <p>In this session, we want to tackle the two problems at hand: how do we set up our environment and get started with writing TypeScript with our solutions. And perhaps more importantly, what benefits do we get for choosing to go down this route with TypeScript.</p>  <p>&#160;</p>  <h2>A sneak preview</h2>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-SharePoint-Saturday-Perth---TypeScript_2B1-?fileId=22096580" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-SharePoint-Saturday-Perth---TypeScript_2B1-?fileId=22096582" width="644" height="377" /></a></p>  <p>&#160;</p>  <p>We'll build this Sandbox Webpart with TypeScript.&#160; I'll see (some) of you this Saturday at Perth.</p>  <p>Ticket for <a href="http://sharepointsaturday.org/perth/default.aspx">SPSPER</a> are very low, you'll need to register right away.</p>  <p>:-)</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32920459.xml</wfw:commentRss></item><item><title>TypeScript and SharePoint - definition files</title><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 26 Feb 2013 08:13:16 +0000</pubDate><link>http://johnliu.net/blog/2013/2/26/typescript-and-sharepoint-definition-files.html</link><guid isPermaLink="false">358543:3878987:32873443</guid><description><![CDATA[<p>&#160;</p>  <p>One of TypeScript's strengths is that you can use the ability to define Interfaces to produce Type Definition files for JavaScript.&#160; These interface definitions provides an IDE (like Visual Studio) with a lot more type information at compile time regarding how to use a certain JavaScript object.</p>  <p>A large repository of definition files are at: <a title="https://github.com/borisyankov/DefinitelyTyped" href="https://github.com/borisyankov/DefinitelyTyped">https://github.com/borisyankov/DefinitelyTyped</a></p>  <p>Why is this related to SharePoint?&#160; Well, javascript files provided in SharePoint are actually quite rich in meta data and could potentially be used to reverse engineer the TypeScript Definition Files.&#160; </p>  <p>Without further delay...</p>  <ul>   <li>Here's my TypeScript program </li>    <li>which will generate a JavaScript program </li>    <li>which will parse and read SP's JavaScript objects </li>    <li>which will produce TypeScript definition results </li> </ul>  <p>&#160;</p>  <h2></h2>  <h2>TypeScript code</h2>  <p>&#160;</p>  <p>module tools {    <br /></p>  <p>&#160;&#160;&#160; export function findReturnType(o: any): string {</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // return;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (/return\s*;/gi.test(o)) return &quot;: void&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // no return   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!/return/gi.test(o)) return &quot;: void&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // return 1.1; return 1;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (/return\s*\d+(\.\d+)?;/gi.test(o)) return &quot;: number&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // return &quot;xx&quot;;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (/return\s*&quot;[^&quot;]*?&quot;\s*;/gi.test(o)) return &quot;: string&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // return 'xx';   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (/return\s*'[^']*?'\s*;/gi.test(o)) return &quot;: string&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // return something;   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (/return\s*[^;]+?;/gi.test(o)) return &quot;: any&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; // don't know   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &quot;: any&quot;;    <br />&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160; export function toClass(o: any): string {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var isClass = o[&quot;__class&quot;] == true;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var typeName = o[&quot;__typeName&quot;];</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; var results = &quot;interface &quot; + typeName + &quot;{\n&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var member in o) {</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (member.match(/\$|__/)) continue;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var m = o[member];    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (typeof (m) == &quot;function&quot;) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var match = /function\s*(\(.*?\))/gi.exec(m);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (match) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; results += &quot;function &quot; + member + match[1] + findReturnType(m) + &quot;;\n&quot;;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; results += &quot;&quot; + member + &quot; : &quot; + typeof (m) + &quot;;\n&quot;;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; results += &quot;}\n&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return results;</p>  <p>&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160; export function toEnum(o: any): string {</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; var typeName = o[&quot;__typeName&quot;];    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var results = &quot;interface &quot; + typeName + &quot;{\n&quot;;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var member in o) {</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (member.match(/\$|__/)) continue;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var m = o[member];    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (typeof (m) == &quot;function&quot;) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; continue;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; results += &quot;&quot; + member + &quot; : &quot; + typeof (m) + &quot;;\n&quot;;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; results += &quot;}\n&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return results;     <br />&#160;&#160;&#160; }</p>  <p>&#160;&#160;&#160; export function toTypeScript(o: any): string {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var isClass = o[&quot;__class&quot;] == true;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var isNamespace = o[&quot;__namespace&quot;] == true;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var isEnum = o[&quot;__enum&quot;] == true;</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (isClass) {    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return toClass(o);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (isEnum) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return toEnum(o);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &quot;&quot;;     <br />&#160;&#160;&#160; }     <br />}</p>  <p>&#160;</p>  <h2>What does this do?</h2>  <p>&#160;</p>  <p>When you run this code in the SharePoint browser console, you'd get this:</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-TypeScript-and-SharePoint---definition-f_107F1-?fileId=22028633" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-TypeScript-and-SharePoint---definition-f_107F1-?fileId=22028634" width="569" height="288" /></a></p>  <p>Which is nearly a usable TypeScript definition file.&#160; </p>  <p>There are still a bunch of clean up to do, since this is a really basic list:</p>  <ul>   <li>You will need to clean up the interface name.&#160; </li>    <li>If you want, improve the arguments list, a number of the arguments are actually optional. </li>    <li>Remove zIndexStep and zIndexStart - which are properties in SP.UI.ModalDialog but aren't for public use.</li>    <li>Remove bind function - that's from jQuery </li> </ul>  <p>&#160;</p>  <p>Here's another example, with enum's defined in SP.UI</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-TypeScript-and-SharePoint---definition-f_107F1-?fileId=22028635" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-TypeScript-and-SharePoint---definition-f_107F1-?fileId=22028636" width="325" height="118" /></a></p>  <p>&#160;</p>  <h2>Summary</h2>  <p>In this quick blog article, I talked about using a TypeScript program to read the javascript object, and infer TypeScript definitions.&#160; Since TypeScript contains far more information that isn't available in JavaScript, there will still be need to manually tweak the output.</p>  <p>Eventually, I hope we'll arrive at a place where we have fully documented TypeScript definitions for SharePoint available.&#160; </p>  <p><a href="https://twitter.com/chaholl">Charlie Holland</a> has started such a work, and it is available on <a title="https://github.com/chaholl/TypeScriptDefinitions/" href="https://github.com/chaholl/TypeScriptDefinitions/">https://github.com/chaholl/TypeScriptDefinitions/</a></p>  <p><a title="http://www.chaholl.com/archive/2013/02/18/a-collection-of-typescript-definition-files-for-sharepoint-2013-et-al.aspx" href="http://www.chaholl.com/archive/2013/02/18/a-collection-of-typescript-definition-files-for-sharepoint-2013-et-al.aspx">http://www.chaholl.com/archive/2013/02/18/a-collection-of-typescript-definition-files-for-sharepoint-2013-et-al.aspx</a></p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32873443.xml</wfw:commentRss></item><item><title>Example uses of SPServices, JavaScript and SharePoint</title><category>SharePoint</category><category>code</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Fri, 15 Feb 2013 01:41:36 +0000</pubDate><link>http://johnliu.net/blog/2013/2/15/example-uses-of-spservices-javascript-and-sharepoint.html</link><guid isPermaLink="false">358543:3878987:32811237</guid><description><![CDATA[<p>&#160;</p>  <p>I wanted to write about <a href="http://spservices.codeplex.com">spservices.codeplex.com</a> from <a href="https://twitter.com/sympmarc">Marc D Anderson</a> - we've found ourselves using this really special library time and again across different projects to talk back to SharePoint quickly.</p>  <p>&#160;</p>  <h2>Starting Workflows</h2>  <p>Here's a page from one of our Process Wiki articles.</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934389" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934390" width="644" height="289" /></a></p>    <p>&#160;</p>  <ul>   <li>We have a special &quot;Contributor-only&quot; webpart on the right.&#160; </li>    <li>It shows the various workflow status' on the current page, as traffic light bubbles.&#160; </li>    <li>The &quot;Certify Process Page&quot; calls a javascript function that calls <a href="http://spservices.codeplex.com/wikipage?title=Workflow&amp;referringTitle=%24%28%29.SPServices">StartWorkflow via SPServices</a>.</li>    <li>The workflow is a Nintex workflow and triggers a significant multi-stage approval process.&#160; But you can use StartWorkflow to start SharePoint workflows as well.</li> </ul>  <p>&#160;</p>  <h2>Getting List data, lots of list data</h2>  <p>Here's our task list, represented as a taskboard.</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934391" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934392" width="644" height="369" /></a></p>  <ul>   <li>This one is completely done with <a href="http://spservices.codeplex.com/wikipage?title=GetListItems&amp;referringTitle=Lists">SPServices to get the list items</a></li>    <li>Convert the objects to JSON using <a href="http://spservices.codeplex.com/wikipage?title=%24%28%29.SPXmlToJson">SPServices.SPXmlToJson</a></li>    <li>Then binding the objects to UI via KnockoutJS</li>    <li>There's JQuery UI's drag and drop in play, so we can change the Task's status by dragging the task across a different column.</li>    <li>Update task using <a href="http://spservices.codeplex.com/wikipage?title=UpdateListItems&amp;referringTitle=Lists">SPServices' UpdateItem</a> call.</li>    <li>And some nice CSS.&#160; </li>    <li>This particular page also runs via SharePoint 2010's OData listdata.svc, but is completely viable with SPServices on SP2007 as well.</li> </ul>  <p>&#160;</p>  <h2>Getting User Profiles via Search</h2>  <p>Here's our People page.</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934393" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Various-uses-of-SPServices-in-2012_A70E-?fileId=21934394" width="644" height="358" /></a></p>  <p>&#160;</p>  <ul>   <li>First, get SharePoint to index your people.</li>    <li>Use <a href="http://spservices.codeplex.com/wikipage?title=Search&amp;referringTitle=%24%28%29.SPServices">SPServices to call SharePoint search</a> to return a bunch of people, including their picture (one would say, especially their picture).</li>    <li>Here I use Knockout to render the pictures.&#160; When clicked, each one opens that user's My Site page.</li>    <li>There's a filter box on the top right, as well as &quot;fake&quot; refinements on the left hand side that allows us to re-query SharePoint search for filtered people.</li>    <li>One possible idea here would be to use <a href="http://spservices.codeplex.com/wikipage?title=UserProfileService&amp;referringTitle=%24%28%29.SPServices">SPServices' User Profile Service</a> support and talk directly to the User Profile service, if you want to skip the search service.</li> </ul>  <p>&#160;</p>  <h2>Summary</h2>  <p>A quick post of 3 recent javascript customizations that heavily used SPServices.&#160; Hope that give you guys a lot of ideas.&#160; Let me know what you guys think.</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32811237.xml</wfw:commentRss></item><item><title>InfoPath - Form stuck on Installing, Upgrading or Deleting</title><category>InfoPath</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 08 Jan 2013 01:34:23 +0000</pubDate><link>http://johnliu.net/blog/2013/1/8/infopath-form-stuck-on-installing-upgrading-or-deleting.html</link><guid isPermaLink="false">358543:3878987:32492939</guid><description><![CDATA[<p>When you publish an InfoPath Form through Central Administration, a few things happen:</p>  <ol>   <li>Central Administration creates a WSP package for this form.</li>    <li>Central Administration creates timer jobs to deploy the package to each of the web applications that uses this form (defined by Activate to Site Collection, in Central Administration)</li>    <li>Administration Service on each server then runs the timer job to deploy the form.</li>    <li>The deployment job actually does a bunch of things:</li>    <ol>     <li>Creates a list of upgrade templates in \14\TEMPLATE\FEATURES\FT-01-72d7f7bc-0c6e-ba52-fa91-bb24c0014ed6       <br />Note, for some sites, this list is incredibly long, and can take a long time. I can't think of any good reason why we need all the versions, but may be this can potentially affect form upgrades.</li>      <li>Creates a content type for the form</li>      <li>Copy the form template to %site collection%/Form Templates/template.xsn</li>      <li>(do other stuff)</li>   </ol> </ol>  <p>Review this article from Microsoft: <a title="http://blogs.msdn.com/b/infopath/archive/2006/10/23/behind-the-scenes-of-administrator-approved-form-templates.aspx" href="http://blogs.msdn.com/b/infopath/archive/2006/10/23/behind-the-scenes-of-administrator-approved-form-templates.aspx">http://blogs.msdn.com/b/infopath/archive/2006/10/23/behind-the-scenes-of-administrator-approved-form-templates.aspx</a>&#160;</p>  <h2>So when a form is stuck on &quot;Installing&quot; or &quot;Upgrading&quot;</h2>  <p>&#160;</p>  <ol>   <li>Check timer jobs. If there are jobs that can't start - they will wait</li>    <ol>     <li>Check all administration service are running on both servers</li>      <li>Check timer service is running (timer service calls administration service to deploy)</li>   </ol>    <li>If your administration service is OFF, then you can try using the command line to execute those timer jobs</li>    <ol>     <li>stsadm -o execadmsvcjobs</li>      <li>The benefit is if there's exceptions thrown here you'd see it in the console</li>      <li>Do this on all SharePoint servers. If the administration service is running, then this stsadm command won't do anything.</li>   </ol>    <li>If your job is missing, you can check in Solution Management /_admin/Solutions.aspx</li>    <ol>     <li>Go to Solution Management under Central Administration /_admin/Solutions.aspx</li>      <li>Find the farm solutions that for the form. The name would be form-formname.wsp.</li>      <li>If the solution isn't deployed, you can select deploy - global</li>      <li>If your admin service isn't running, you'll get a warning saying that jobs are scheduled but no admin service means they won't run.</li>      <li>Use stsadm -o execadmsvcjobs</li>   </ol>    <li>If nothing else works, or if we want to do a complete removal.</li>    <ol>     <li>In form templates, select the form template, and hit Remove.</li>   </ol> </ol>  <h2>Form is stuck on &quot;Deleting&quot;</h2>  <ol>   <li>Go to Solution Management under Central Administration /_admin/Solutions.aspx</li>    <li>Find the farm solutions that for the form. The name would be form-formname.wsp.</li>    <li>If the status is Deployed, then retraction hasn't started.</li>    <li>Click the package and select Retract Solution.</li>    <li>If your admin service isn't running, you'll get a warning saying that job is scheduled but no admin service means they won't run.</li>    <li>In command line, stsadm -o execadmsvcjobs, on both servers.     <br />C:\ &gt; stsadm -o execadmsvcjobs      <br />Executing job-application-server-admin-service.      <br />Executing job-password-management.      <br />Executing solution-deployment-form-tradepackageform.wsp-0.      <br />Operation completed successfully.      <br /></li>    <li>You'll see this back on solutions.     <br /></li>    <p>Name:&#160;&#160;&#160; form-packageform.wsp     <br />Type:&#160;&#160;&#160; Core Solution      <br />Contains Web Application Resource:&#160;&#160;&#160; No      <br />Contains Global Assembly:&#160;&#160;&#160; No      <br />Contains Code Access Security Policy:&#160;&#160;&#160; No      <br />Deployment Server Type:&#160;&#160;&#160; Front-end Web server      <br />Deployment Status:&#160;&#160;&#160; Deployed      <br />Deployed To:&#160;&#160;&#160; Globally deployed.      <br />Last Operation Result:&#160;&#160;&#160; The solution was successfully retracted.      <br />Last Operation Details:&#160;&#160;&#160; <br />SRV02 : The solution was successfully retracted.       <br />SRV03 : The solution was successfully retracted.       <br />Last Operation Time:&#160;&#160;&#160; 1/8/2013 11:01 AM      <br /></p>    <li>You can then remove the solution package.</li>    <li>If you go back to Form Template management, the form will be removed from the list, and you can re-upload as usual.</li> </ol>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32492939.xml</wfw:commentRss></item><item><title>Nintex Workflow - using all Regex options in your actions</title><category>SharePoint</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Mon, 17 Dec 2012 05:53:42 +0000</pubDate><link>http://johnliu.net/blog/2012/12/17/nintex-workflow-using-all-regex-options-in-your-actions.html</link><guid isPermaLink="false">358543:3878987:32054238</guid><description><![CDATA[<p>&#160;</p>  <p>Nintex Workflows supports a Regular Expression action.&#160; This action has a very simple configurable UI with only the &quot;Ignore case&quot; option.</p>  <p>But there are a number of other very interesting Regex Options that you may want to use in your pattern.&#160; This blog article is about how to enable them, and what sort of patterns you might use them for.</p>  <p>&#160;</p>  <h3>Regular Expression Options</h3>  <p>Making an educated guess that the Nintex workflows uses the standard .NET Regular Expression (System.Text.RegularExpressions.Regex) rather than implementing their own regex engine.&#160; Here's a list of the Regular Expression Options supported in the .NET Framework.</p>  <p><a title="http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx" href="http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx">http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx</a></p>  <ul>   <li>i = IgnoreCase (this option is available in the Nintex action)</li>    <li>m = Multiline, if enabled, ^ and $ matches beginning and end of each line, rather than the whole block of text</li>    <li>s = Singleline, if enabled, . (period) matches all characters including newline (\n), by default, the period character only matches [^\n] (any character except the newline).</li>    <li>n = ExplicitCapture, don't capture groups</li>    <li>x = IgnorePatternWhitespace, ignore unescaped whitespace, and allow inline # comments</li> </ul>  <p>&#160;</p>  <h3>Using Regex Options within a pattern group</h3>  <p>.NET allows you to use regular expressions with special options within a pattern group.&#160; To do this, the pattern is:</p>  <ul>   <li>(?imnsx-imnsx:pattern)</li> </ul>  <p>You can read up about it here: <a title="http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#group_options" href="http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#group_options">http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#group_options</a></p>  <p>Lets see some examples.</p>  <p>&#160;</p>  <h3>Using the multiline option</h3>  <p>Example, given this block of text:</p>  <blockquote>   <p>Dear John,</p>    <p><font style="background-color: #ffff00">Thanks for the email.</font> </p>    <p>/footer</p> </blockquote>  <p>We want to extract the line that has the word &quot;thanks&quot;.</p>  <p>We can use this expression:</p>  <ul>   <li>(?m:^.*thanks.*$)</li>    <li>multiline match of any line that contains the word thanks.&#160; Match from beginning of line ^ to end of line $.</li> </ul>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286018" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286020" width="726" height="384" /></a></p>  <p>The results in the workflow:</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286021" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286022" width="462" height="58" /></a></p>        <p>&#160;</p>  <h3>Using the singleline option</h3>  <p>Example, given this block of text:</p>  <blockquote>   <p><font style="background-color: #ffff00">Dear John,</font></p>    <p><font style="background-color: #ffff00">Thanks for the email.</font> </p>    <p>/footer</p> </blockquote>  <p>We want to capture everything before the /footer.</p>  <ul>   <li>^(?s:.*)(?=/footer)</li>    <li>use singleline option, match any character (including line breaks).&#160; Use a positive look-ahead match on /footer, but don't actually include it in the pattern match result.</li> </ul>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286023" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286024" width="725" height="351" /></a></p>  <p>The results in the workflow:</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286025" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Nintex---using-Regex-options-in-your-act_CF36-?fileId=21286026" width="483" height="85" /></a></p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-32054238.xml</wfw:commentRss></item><item><title>Removing HomeGroup icon from Windows 8 desktop</title><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 04 Dec 2012 22:41:28 +0000</pubDate><link>http://johnliu.net/blog/2012/12/4/removing-homegroup-icon-from-windows-8-desktop.html</link><guid isPermaLink="false">358543:3878987:31681737</guid><description><![CDATA[<p>This morning, I found a HomeGroup icon in my Windows 8 Deskotp.&#160; I'm not actually sure what happened and how it appeared.&#160; I am pretty sure it wasn't there last night.</p>  <p>To remove it, but not remove it from Explorer, search for &quot;desktop icons&quot;</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Removing-HomeGroup-icon-from-Windows-8-d_86A2-?fileId=21170169" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Removing-HomeGroup-icon-from-Windows-8-d_86A2-?fileId=21170170" width="556" height="161" /></a></p>  <p>&#160;</p>  <p>I toggle the selection for &quot;Network&quot; on, then off again.</p>  <p><a href="http://johnliu.net/resource/Windows-Live-Writer-Removing-HomeGroup-icon-from-Windows-8-d_86A2-?fileId=21170171" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-Removing-HomeGroup-icon-from-Windows-8-d_86A2-?fileId=21170172" width="418" height="466" /></a></p>  <p>OK, and the HomeGroup icon has disappeared from the desktop.</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-31681737.xml</wfw:commentRss></item><item><title>How to create your Windows 8 Start Button with PowerShell</title><category>Public Announcement</category><category>code</category><category>rant</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Tue, 27 Nov 2012 14:50:47 +0000</pubDate><link>http://johnliu.net/blog/2012/11/27/how-to-add-your-windows-8-start-button-if-you-really-want-it.html</link><guid isPermaLink="false">358543:3878987:31394929</guid><description><![CDATA[<p>Before I go on, I have to say I find the Start Menu unnecessary.&#160; There are already many ways to get to your Start Screen:</p>  <ul>   <li>Throw mouse to lower-left corner (with the mouse) </li>    <li>Press the Windows key (on your keyboard) </li>    <li>Swipe in from the left edge (touch screen) </li>    <li>Press the Start button (any device with a hardware start button) </li> </ul>  <p>&#160;</p>  <p>That said, Windows is still about choice.&#160; And here's how you can add your own &quot;Start Menu Button&quot; </p>  <ol>   <li>Create a shortcut. </li>    <li>Type in this:      <br />powershell.exe -Command &quot;Add-Type -AssemblyName System.Windows.Forms; [Windows.Forms.SendKeys]::SendWait('^({ESC})')&quot;       <br />      <br />(all in one line)       <br />This sends the Windows key (CTRL-ESC) via Powershell.       <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089708" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089709" width="630" height="300" /></a>       <br /></li>    <li>Configure the shortcut to run minimized      <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089710" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089711" width="386" height="254" /></a>       <br /></li>    <li>Change the Icon, I select this icon from the bootux.dll file %SystemRoot%\System32\bootux.dll)&#160; <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21170296" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21170297" width="206" height="244" /></a>      <br />(All the icons are white, select them to see what they look like)&#160; <br /></li>    <li>Drag the shortcut and pin it to the task bar, on the far left.      <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089714" rel="lightbox"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21089715" width="176" height="140" /></a>       <br /></li>    <li>Now you have that familiar Start menu button back.&#160; Click it and you'll get the Start Screen to pop up.&#160; <br /><a href="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21170299" rel="lightbox"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://johnliu.net/resource/Windows-Live-Writer-If-you-really-want-your-Win-8-start-menu_16A3-?fileId=21170301" width="216" height="68" /></a> </li> </ol>  <p>&#160;</p>  <h2>Notes</h2>  <ul>   <li>Does not appear to work in Windows RT, but if you have a Surface just hit that start hardware button </li> </ul>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-31394929.xml</wfw:commentRss></item><item><title>SharePoint Saturday Sydney 2012</title><category>SharePoint</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Mon, 29 Oct 2012 00:26:26 +0000</pubDate><link>http://johnliu.net/blog/2012/10/29/sharepoint-saturday-sydney-2012.html</link><guid isPermaLink="false">358543:3878987:30137168</guid><description><![CDATA[<p>Thank you all for attending SharePoint Saturday, giving up your time.&#160; Sydney marks the last of the 6 SharePoint Saturdays that I've had the privilege to present in this year, ticking off:</p>  <ul>   <li>Perth <a title="http://johnliu.net/blog/2012/4/20/spsperth-2012-update.html" href="http://johnliu.net/blog/2012/4/20/spsperth-2012-update.html">http://johnliu.net/blog/2012/4/20/spsperth-2012-update.html</a> </li>    <li>Brisbane <a title="http://johnliu.net/blog/2012/6/4/sharepoint-saturday-brisbane-update.html" href="http://johnliu.net/blog/2012/6/4/sharepoint-saturday-brisbane-update.html">http://johnliu.net/blog/2012/6/4/sharepoint-saturday-brisbane-update.html</a> </li>    <li>Adelaide <a title="http://johnliu.net/blog/2012/6/29/sharepoint-saturday-adelaide-update.html" href="http://johnliu.net/blog/2012/6/29/sharepoint-saturday-adelaide-update.html">http://johnliu.net/blog/2012/6/29/sharepoint-saturday-adelaide-update.html</a> </li>    <li>Melbourne <a title="http://johnliu.net/blog/2012/8/6/sharepoint-saturday-melbourne-2012.html" href="http://johnliu.net/blog/2012/8/6/sharepoint-saturday-melbourne-2012.html">http://johnliu.net/blog/2012/8/6/sharepoint-saturday-melbourne-2012.html</a> </li>    <li>Canberra <a title="http://johnliu.net/blog/2012/9/27/sharepoint-saturday-canberra-2012.html" href="http://johnliu.net/blog/2012/9/27/sharepoint-saturday-canberra-2012.html">http://johnliu.net/blog/2012/9/27/sharepoint-saturday-canberra-2012.html</a> </li>    <li>Sydney - last, my hometown. </li> </ul>  <p>The best part of SharePoint Saturday is just meeting talking to the <strong>enthusiastic SharePoint fans</strong> and hear what people are doing out there.&#160; Honestly, not many people are that crazy to give up a sunny Saturday to learn about SharePoint - you guys are amazing.</p>  <p>The worst part is the travel.&#160; </p>  <p>&#160;</p>  <h3>Sydney SharePoint User Group</h3>  <p>I was honestly surprised almost everybody already know about the Sydney SharePoint User Group.&#160; We meet monthly in the CBD between 6-7pm on the 3rd Tuesday of the Month.&#160; We actually start at 5:30pm to eat up all the pizza first, and for the guys that don't need to head home right away, join us at the pub and geek out.</p>  <p>Sign up here so you can see what topic is coming up next month:</p>  <ul>   <li><a href="http://www.sharepointusers.org.au/Sydney/default.aspx">http://www.sharepointusers.org.au/Sydney/default.aspx</a> </li> </ul>  <h3>&#160;</h3>  <h3>Golf Course</h3>  <p>The User Group gave away a Miniature Golf Course during the event. </p>  <p><img alt="The Miniature Book of Miniature Golf" src="http://g-ecx.images-amazon.com/images/G/01/ciu/82/46/b84fc0a398a09098b8c70210.L._AA300_.jpg" /></p>  <p>If you didn't manage to win one, but is still interested in it, it's here:</p>  <ul>   <li>The Miniature Book of Miniature Golf</li>    <li><a href="http://www.amazon.com/The-Miniature-Book-Golf/dp/0761154132">http://www.amazon.com/The-Miniature-Book-Golf/dp/0761154132</a></li> </ul>  <h3>&#160;</h3>  <h3>Downloads</h3>  <ul>   <li>The demo solution <a href="http://johnliu.net/storage/SPGSvcWp.zip">http://johnliu.net/storage/SPGSvcWp.zip</a> </li>    <li>The PowerPoint <a href="http://johnliu.net/storage/SharePoint%20REST%20and%20jQuery6.pptx">http://johnliu.net/storage/SharePoint%20REST%20and%20jQuery6.pptx</a> </li> </ul>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-30137168.xml</wfw:commentRss></item><item><title>InfoPath form load rules and loading event order</title><category>InfoPath</category><dc:creator>JohnLiu.NET</dc:creator><pubDate>Thu, 27 Sep 2012 06:26:28 +0000</pubDate><link>http://johnliu.net/blog/2012/9/27/infopath-form-load-rules-and-loading-event-order.html</link><guid isPermaLink="false">358543:3878987:29401775</guid><description><![CDATA[<p>&#160;</p>  <p>A strange gotcha in InfoPath concerning which event runs first.</p>  <ul>   <li>Create an InfoPath form, with a field.</li>    <li>Create a Form Load rule, that sets this field to 1.</li>    <li>Add code behind, and create a Form_Loading event, that sets the same field to 2.</li> </ul>  <p>&#160;</p>  <p>In InfoPath rich client form / debugging</p>  <ul>   <li>The result number is 2</li> </ul>  <p>In InfoPath browser form</p>  <ul>   <li>The result number is 1</li> </ul>  <p>&#160;</p>  <p>Keep this order in mind if you use both Form Load rules as well as Form_Loading event.</p>]]></description><wfw:commentRss>http://johnliu.net/blog/rss-comments-entry-29401775.xml</wfw:commentRss></item></channel></rss>