<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" 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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUcBRHY-cSp7ImA9WhBaGEU.&quot;"><id>tag:blogger.com,1999:blog-37338138</id><updated>2013-05-30T11:04:15.859+08:00</updated><category term="mobile" /><category term="xsl" /><category term="warehouse" /><category term="ws" /><category term="smartpart" /><category term="documentation" /><category term="web" /><category term="whatsapp" /><category term="unit" /><category term="legacy" /><category term="vm" /><category term="ipad" /><category term="storage" /><category term="wsdl" /><category term="crm" /><category term="http" /><category term="query" /><category term="leadership" /><category term="motivation" /><category term="pool" /><category term="test" /><category term="sharepoint" /><category term="agile" /><category term="multitask" /><category term="dw" /><category term="tips" /><category term="rss" /><category term="wss" /><category term="servlet" /><category term="uml" /><category term="email" /><category term=".net" /><category term="mindmap" /><category term="devops" /><category term="troubleshoot" /><category term="review" /><category term="database" /><category term="wls" /><category term="xml" /><category term="lean" /><category term="knowledge" /><category term="cvs" /><category term="SDLC" /><category term="java" /><category term="appliance" /><category term="security" /><category term="datastore" /><category term="scm" /><category term="wsi" /><category term="ods" /><category term="cloud" /><category term="thread" /><category term="integration" /><category term="principle" /><category term="report" /><category term="scrum" /><category term="infopath" /><category term="software" /><category term="practices" /><category term="innovation" /><category term="insurance" /><category term="atom" /><category term="design" /><category term="asp.net" /><category term="waterfall" /><category term="architecture" /><category term="management" /><title>SOFTware is HARD</title><subtitle type="html">Developing software is hard; Maintaining systems isn't any easier!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://softwarehard.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>129</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blog/softwareishard" /><feedburner:info uri="blog/softwareishard" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>blog/softwareishard</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CUcBRHY9fyp7ImA9WhBaGEU.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-2995600118919817970</id><published>2013-05-23T16:17:00.001+08:00</published><updated>2013-05-30T11:04:15.867+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-30T11:04:15.867+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="uml" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>Use Case Realisation in UML</title><content type="html">This is a sample of a use case realisation (&lt;strong&gt;&lt;em&gt;design-level&lt;/em&gt;&lt;/strong&gt;) for a use case “&lt;strong&gt;&lt;em&gt;View the Dashboard&lt;/em&gt;&lt;/strong&gt;”.&lt;br /&gt;
The implementation uses ASP.NET MVC and the design is documented in the following UML diagrams.&lt;br /&gt;
This is an &lt;u&gt;experiment&lt;/u&gt; whereby I produced the design in UML for a new developer to implement the use case.&lt;br /&gt;
&lt;br /&gt;
The following &lt;em&gt;&lt;strong&gt;Sequence Diagram&lt;/strong&gt;&lt;/em&gt; documents the initial web request to display the empty Dashboard.&lt;br /&gt;
&lt;a href="http://lh4.ggpht.com/-CpBfYxBLw7g/UZ3qzw9vT0I/AAAAAAAAAZo/XbJOuZRCYbE/s1600-h/Initial%252520Request%25255B8%25255D.png"&gt;&lt;img alt="Initial Request" border="0" height="391" src="http://lh3.ggpht.com/-TcG5rEpORmM/UZ3q0vW_D0I/AAAAAAAAAZw/-4PmA0pBzTM/Initial%252520Request_thumb%25255B6%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Initial Request" width="644" /&gt;&lt;/a&gt;&lt;br /&gt;
The following &lt;em&gt;&lt;strong&gt;Sequence Diagram&lt;/strong&gt;&lt;/em&gt; documents subsequent web requests to display the search result.&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/-XhYwFnu1aZk/UZ3q1Gbx_gI/AAAAAAAAAZ4/NBFXDcwP5Hs/s1600-h/Retrieval%252520Request%25255B7%25255D.png"&gt;&lt;img alt="Retrieval Request" border="0" height="420" src="http://lh5.ggpht.com/-l8cjvhkcwUI/UZ3q2KSzHYI/AAAAAAAAAaA/bjqXakYSUjM/Retrieval%252520Request_thumb%25255B5%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Retrieval Request" width="644" /&gt;&lt;/a&gt;&lt;br /&gt;
The next &lt;em&gt;&lt;strong&gt;Sequence Diagram&lt;/strong&gt;&lt;/em&gt; specifies the implementation of &lt;em&gt;DashBoardCntrl::retrievePlanListFromCache&lt;/em&gt;.&lt;br /&gt;
&lt;a href="http://lh3.ggpht.com/-IHQGrunLB14/UZ3q2w5KWVI/AAAAAAAAAaI/4DW7zWnTFvA/s1600-h/DashBoardCntrl__retrievePlanListFromCache%25255B6%25255D.png"&gt;&lt;img alt="DashBoardCntrl__retrievePlanListFromCache" border="0" height="405" src="http://lh3.ggpht.com/-6hmEv_vBlNs/UZ3q3oQbPaI/AAAAAAAAAaQ/P_B6YNBk5Mw/DashBoardCntrl__retrievePlanListFromCache_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="DashBoardCntrl__retrievePlanListFromCache" width="644" /&gt;&lt;/a&gt;&lt;br /&gt;
The final is the &lt;em&gt;&lt;strong&gt;View-Of-Participating-Class (VOPC) diagram&lt;/strong&gt;&lt;/em&gt; for this use case realisation.&lt;br /&gt;
&lt;a href="http://lh6.ggpht.com/-nhv3oHu1Cws/UZ3q4-Adp2I/AAAAAAAAAaY/e6pPZBoFvuM/s1600-h/VOPC%25255B7%25255D.png"&gt;&lt;img alt="VOPC" border="0" height="484" src="http://lh4.ggpht.com/-Nac4z-rXrSA/UZ3q5z8j6DI/AAAAAAAAAag/-V_wCSyLqUw/VOPC_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="VOPC" width="638" /&gt;&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/4yBpKOuRENE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/2995600118919817970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=2995600118919817970" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2995600118919817970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2995600118919817970?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/4yBpKOuRENE/use-case-realisation-in-uml.html" title="Use Case Realisation in UML" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-TcG5rEpORmM/UZ3q0vW_D0I/AAAAAAAAAZw/-4PmA0pBzTM/s72-c/Initial%252520Request_thumb%25255B6%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/05/use-case-realisation-in-uml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IARHozeip7ImA9WhBbFkw.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4938221669394677024</id><published>2013-05-15T20:05:00.001+08:00</published><updated>2013-05-15T20:05:45.482+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-15T20:05:45.482+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="datastore" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>When is a Sequence Number Not Sequential?</title><content type="html">A sequence number or an identity column guarantees the following:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Number served is unique.&lt;/li&gt;
&lt;li&gt;Number served is sequential (ascending order) - Identity columns guarantees this; sequence number in Oracle RAC mode doesn't, unless ORDER is used.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
However:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;It does not guarantee the sequence is gap-free&lt;/li&gt;
&lt;li&gt;Sequence number/ identity columns do not partake in transactions&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Number loss/ gaps happen due to the following:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Served number does not get utilised (typically due to transaction rollback)&lt;/li&gt;
&lt;li&gt;Server restart/ failures - database servers tend to cache sequences in memory for performance reasons. E.g. Oracle Sequence number set-up to be CACHEd in memory.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Serialization appears to be the only solution. However, serialization would be non-scalable and would incur a huge performance impact.&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/u56IPGf6JPg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4938221669394677024/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4938221669394677024" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4938221669394677024?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4938221669394677024?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/u56IPGf6JPg/when-is-sequence-number-not-sequential.html" title="When is a Sequence Number Not Sequential?" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/05/when-is-sequence-number-not-sequential.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHR3k_cCp7ImA9WhBaEUk.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-8730748926921187058</id><published>2013-05-07T08:22:00.001+08:00</published><updated>2013-05-21T22:43:56.748+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-21T22:43:56.748+08:00</app:edited><title>Psychology Behind Dishonesty</title><content type="html">&lt;p&gt;An appreciation to why people are dishonest.&lt;br&gt;Flash version can be found &lt;a href="http://sites.google.com/site/softwareishard/file-cabinet/flash-content/Psychology%20Behind%20Dishonesty.swf" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-KTIlAupEuhk/UYhJS0EDiRI/AAAAAAAAAXg/8eK-MBZKZ70/s1600-h/Psychology-Behind-Dishonesty8.png"&gt;&lt;img title="Psychology Behind Dishonesty" 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="Psychology Behind Dishonesty" src="http://lh4.ggpht.com/-7LiUOjGCp-E/UYhJTlsVXkI/AAAAAAAAAXo/Knq_re1pHMI/Psychology-Behind-Dishonesty_thumb6.png?imgmax=800" width="692" height="242"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/Qy4ExyS1I7k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/8730748926921187058/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=8730748926921187058" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/8730748926921187058?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/8730748926921187058?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/Qy4ExyS1I7k/psychology-behind-dishonesty.html" title="Psychology Behind Dishonesty" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-7LiUOjGCp-E/UYhJTlsVXkI/AAAAAAAAAXo/Knq_re1pHMI/s72-c/Psychology-Behind-Dishonesty_thumb6.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/05/psychology-behind-dishonesty.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHSX48eip7ImA9WhBaEUk.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4472156086011520060</id><published>2013-04-09T10:35:00.001+08:00</published><updated>2013-05-21T22:43:58.072+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-21T22:43:58.072+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="whatsapp" /><title>How to determine if you've been blocked by a WhatsApp contact</title><content type="html">According to the legal clauses in WhatsApp,&amp;nbsp;such blocks&amp;nbsp;have been made non-deterministic to protect privacy.&lt;br /&gt;
&lt;br /&gt;
However, by experimentation, you'd notice the following when you've been blocked:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;unable to see the "online" or "last seen" of the contact. Described &lt;a href="http://www.whatsapp.com/faq/en/general/20971848" rel="nofollow" target="_blank"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;messages sent to the party does not get delivered -&amp;nbsp;indicated by 1 tick instead of 2&lt;/li&gt;
&lt;li&gt;unable to create a group with the party - An error message appears "Error while adding participant... not authorized to add this contact"&lt;/li&gt;
&lt;/ol&gt;
The first 2 indicators are explained in WhatsApp's &lt;a href="http://www.whatsapp.com/faq/en/general/21092978" rel="nofollow" target="_blank"&gt;FAQ&lt;/a&gt;. Of interest is:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
We have made this intentionally ambiguous in order to protect your privacy when you block someone. Thus, we cannot tell you if you are being blocked by someone else, since this is a violation of that person's privacy&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
However, the 3 indicator above (not mentioned by WhatsApp) appears to be a very strong indicator that you've been blocked by the contact.&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/YhfmFjfnKok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4472156086011520060/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4472156086011520060" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4472156086011520060?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4472156086011520060?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/YhfmFjfnKok/how-to-determine-if-youve-been-blocked.html" title="How to determine if you&amp;#39;ve been blocked by a WhatsApp contact" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/04/how-to-determine-if-youve-been-blocked.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UAQHczeCp7ImA9WhBWFE8.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-1931961886564212200</id><published>2013-04-08T19:38:00.000+08:00</published><updated>2013-04-08T19:40:41.980+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-08T19:40:41.980+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="http" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>HTTP Redirection</title><content type="html">&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
According to the HTTP specs, there are a number of HTTP codes used to redirect browser clients.&lt;/div&gt;
&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
&lt;strong&gt;301 Moved Permanently&lt;/strong&gt;: Permanent redirect. Document has moved permanently, future requests to use the redirected URL instead. Response is cacheable.&amp;nbsp;Modern browsers&amp;nbsp;change the HTTP method to a GET&amp;nbsp;with the exception of IE (which preserves HTTP&amp;nbsp;HEAD, DELETE&amp;nbsp;method).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
&lt;strong&gt;302 Found&lt;/strong&gt;: Temporary redirect. To be superseded by 303 and 307.&amp;nbsp;Response may be cached if headers allow for it. Most modern browsers treat this&amp;nbsp;as 303 with the exception of IE (which treats it as 307).&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
&lt;strong&gt;303 See Other&lt;/strong&gt;: Request should be redirected to a GET regardless of the original request method. The response &lt;strong&gt;&lt;u&gt;must not&lt;/u&gt;&lt;/strong&gt; be cached. Supported by all modern browsers.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
&lt;strong&gt;307 Temporary Redirect&lt;/strong&gt;:&amp;nbsp;Temporary redirect.&amp;nbsp;Request should be redirected to the redirected URL. The original request method is to be preserved and a POST request should be re-posted. Response may be cached if headers allow for it. Supported by all modern browsers except Opera 11.5. If the request method is non-idempotent (e.g. POST, PUT, DELETE), Firefox and Opera would prompt the user for confirmation that the form data would be resent to another location.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
Tests on existing browser found &lt;a href="http://greenbytes.de/tech/tc/httpredirects/" rel="nofollow" target="_blank"&gt;here&lt;/a&gt;.&lt;/div&gt;
&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
Some references: &lt;a href="http://www.ietf.org/rfc/rfc2616.txt" target="_blank"&gt;HTTP specs&lt;/a&gt; &amp;amp;&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/08/19/understanding-the-impact-of-redirect-response-status-codes-on-http-methods-like-head-get-post-and-delete.aspx" target="_blank"&gt;here&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/kiARHF6plIo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/1931961886564212200/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=1931961886564212200" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1931961886564212200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1931961886564212200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/kiARHF6plIo/http-redirection.html" title="HTTP Redirection" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/04/http-redirection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4FRXg9fCp7ImA9WhBWFE8.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-5387599100109057959</id><published>2013-04-08T19:35:00.000+08:00</published><updated>2013-04-08T19:35:14.664+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-08T19:35:14.664+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="practices" /><category scheme="http://www.blogger.com/atom/ns#" term="email" /><title>Valid Email Addresses</title><content type="html">&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
A valid email address as of this form:&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;local-part&amp;nbsp;@ domain-part&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; letter-spacing: normal; margin: 0px; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"&gt;
In particular, the local part is required to be one of the following:&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;dot-atom&lt;/li&gt;
&lt;li&gt;quoted string&lt;/li&gt;
&lt;li&gt;a combination of the above. E.g. my.name.is."Johannes Kuah"@example.com&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&lt;/div&gt;
&lt;h4&gt;
Dot-Atom&lt;/h4&gt;
&lt;div&gt;
A string of ASCII characters &lt;em&gt;excluding&lt;/em&gt; the following &lt;u&gt;special characters&lt;/u&gt;:&amp;nbsp;&lt;em&gt;&lt;strong&gt;whitespace ( ) &amp;lt; &amp;gt; @ , ; : \ " . [ ]&lt;/strong&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;
&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;&lt;/div&gt;
&lt;h4&gt;
Quoted String&lt;/h4&gt;
&lt;div&gt;
A string of ASCII characters &lt;em&gt;including&lt;/em&gt; the above &lt;u&gt;special characters&lt;/u&gt; enclosed within normal ASCII quotation marks ("). However, the backslash \ and quotation mark " must also be preceded by a backslash \&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&lt;/div&gt;
&lt;h4&gt;
References&lt;/h4&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tools.ietf.org/html/rfc2822#section-3.4"&gt;http://tools.ietf.org/html/rfc2822#section-3.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.ietf.org/html/rfc3696#page-5"&gt;http://tools.ietf.org/html/rfc3696#page-5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/0iBwbF8b72o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/5387599100109057959/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=5387599100109057959" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5387599100109057959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5387599100109057959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/0iBwbF8b72o/valid-email-addresses_8.html" title="Valid Email Addresses" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/04/valid-email-addresses_8.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQXs5eCp7ImA9WhBRGUs.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-1521239216448689359</id><published>2013-03-11T10:27:00.000+08:00</published><updated>2013-03-11T10:29:20.520+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-11T10:29:20.520+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="devops" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="troubleshoot" /><title>Performance Counters for .NET</title><content type="html">A little dated by now.&lt;br /&gt;
&lt;br /&gt;
From Windows 2000 Resource Kit:&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/cc938609.aspx"&gt;http://technet.microsoft.com/en-us/library/cc938609.aspx&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/cc940375.aspx"&gt;http://technet.microsoft.com/en-us/library/cc940375.aspx&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/cc938586.aspx"&gt;http://technet.microsoft.com/en-us/library/cc938586.aspx&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/bb734903.aspx"&gt;http://technet.microsoft.com/en-us/library/bb734903.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
For .NET&lt;br /&gt;
&lt;a href="http://www.symantec.com/business/support/index?page=content&amp;amp;id=HOWTO9722"&gt;http://www.symantec.com/business/support/index?page=content&amp;amp;id=HOWTO9722&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
From Windows 2003:&lt;br /&gt;
&lt;a href="http://technet.microsoft.com/en-us/library/cc779038(WS.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc779038(WS.10).aspx&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/CTLOmzIJfqo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/1521239216448689359/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=1521239216448689359" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1521239216448689359?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1521239216448689359?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/CTLOmzIJfqo/performance-counters-for-net.html" title="Performance Counters for .NET" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/03/performance-counters-for-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQXs6fyp7ImA9WhBRGUs.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-1218218113565905970</id><published>2013-03-05T18:32:00.001+08:00</published><updated>2013-03-11T10:29:20.517+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-11T10:29:20.517+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Cookie, Security, OWASP</title><content type="html">&lt;p&gt;We just had a Security Assessment for our web applications. Some points of interest follows:&lt;/p&gt; &lt;h4&gt;Cookie&lt;/h4&gt; &lt;ol&gt; &lt;li&gt;XSS security: Where possible, all cookies should be configured to be &lt;strong&gt;&lt;u&gt;httpOnly&lt;/u&gt;&lt;/strong&gt;. This is to prevent client-side scripts or applets from accessing the cookie. Incidentally, this is the default for ASP.NET session cookie and &lt;em&gt;cannot&lt;/em&gt; be changed via httpCookies element in Web.Config: &lt;em&gt;&lt;strong&gt;&amp;lt;httpCookies httpOnlyCookies="true"/&amp;gt;&lt;/strong&gt;&lt;/em&gt;  &lt;li&gt;Prevent MITM from accessing the session: Ensure that the session cookie is delivered over secured HTTP session (TLS). Setting the cookie as &lt;strong&gt;secure&lt;/strong&gt;d indicates to the &lt;em&gt;browser&lt;/em&gt; that the cookie should only be sent over a secured channel. To configure the httpCookies element: &lt;strong&gt;&lt;em&gt;&amp;lt;httpCookies requireSSL="true" /&amp;gt;&lt;/em&gt;&lt;/strong&gt;  &lt;li&gt;Note that Forms and Session cookies have &lt;a href="http://software-security.sans.org/blog/2009/06/24/session-attacks-and-aspnet-part-2/" target="_blank"&gt;slightly different behaviour&lt;/a&gt; with Forms cookie being more secured and more configurable.  &lt;ol&gt; &lt;li&gt;Interestingly, setting requireSSL to true for Forms cookie &lt;em&gt;mandates&lt;/em&gt; that the communication channel to the web server be secured whereas Session cookie does not. This scenario applies in cases where the SSL terminates at the load balancers (LB) and the channel between the LB and the web server isn’t secured.&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;GA sets several persistent cookies by default. The cookies are well examined &lt;a href="http://www.seotakeaways.com/google-analytics-cookies-ultimate-guide/" target="_blank"&gt;here&lt;/a&gt;. Although the cookies appears to be issued from the same domain (1st party cookie), modifying the httpCookies element (httpOnlyCookies, requireSSL) does not appear to affect GA’s cookies.&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;IIS Server&lt;/h4&gt; &lt;ol&gt; &lt;li&gt;IIS is susceptible to HTTP 1.0 attacks whereby a HTTP 1.0 request without the host header would cause IIS to leak the IP address of the host.  &lt;li&gt;This issue has been discussed &lt;a href="http://blogs.msdn.com/b/jaskis/archive/2008/12/09/iis-7-ip-address-revealed-on-redirection-requests-on-http-1-0-protocol.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/U3nv-8nB6s0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/1218218113565905970/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=1218218113565905970" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1218218113565905970?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/1218218113565905970?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/U3nv-8nB6s0/cookie-security-owasp.html" title="Cookie, Security, OWASP" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/03/cookie-security-owasp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQGRXwzeyp7ImA9WhNaFEo.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4016564190849864802</id><published>2013-01-24T20:19:00.001+08:00</published><updated>2013-01-29T23:28:44.283+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-29T23:28:44.283+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>How to put up Maintenance Page for ASP.NET Web Application in IIS</title><content type="html">&lt;p&gt;Put in a static file named &lt;strong&gt;&lt;em&gt;app_offline.htm&lt;/em&gt;&lt;/strong&gt; in the root of the site. Afterwhich, all requests for that site will be served from this file.&lt;/p&gt; &lt;p&gt;Technically, what happens is that the entire application domain will be stopped and unloaded, all without performing an IIS reset.&lt;/p&gt; &lt;p&gt;Note the following caveats:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Any error in the Web.Config may result in the app_offline.htm page not showing up!&lt;/li&gt; &lt;li&gt;The file (app_offline.htm) must be of at least 512 bytes for it to take effect for IE browser. Otherwise, IE would display a “Friendly Error" message by default.&lt;/li&gt; &lt;li&gt;The effect of this file is that the server will serve out a HTTP response bearing this header: &lt;em&gt;HTTP/1.1 503 Service Unavailable&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/WL7Lc-m6EAg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4016564190849864802/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4016564190849864802" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4016564190849864802?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4016564190849864802?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/WL7Lc-m6EAg/how-to-put-up-maintenance-page-for.html" title="How to put up Maintenance Page for ASP.NET Web Application in IIS" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/01/how-to-put-up-maintenance-page-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQXs5cCp7ImA9WhBRGUs.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-907813153219315200</id><published>2013-01-10T19:12:00.001+08:00</published><updated>2013-03-11T10:29:20.528+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-11T10:29:20.528+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Internet Explorer Compatibility View</title><content type="html">&lt;p&gt;The newer Internet Explorer comes with the &lt;em&gt;F12 Developer Tools &lt;/em&gt;wherein you find the Browser Mode and the Document Mode.&lt;/p&gt; &lt;h4&gt;Difference between the Browser Mode and the Document Mode&lt;/h4&gt; &lt;p&gt;Document Mode is something that the web server can control. By specifying the HTTP header, the HTML meta-tags, or the DocType declaration, the Document Mode changes accordingly. See my &lt;a href="http://softwarehard.blogspot.com/2012/01/html-rendering-with-internet-explorer-8.html" target="_blank"&gt;earlier article&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;However, the Browser Mode cannot be changed by the server.&lt;/p&gt; &lt;p&gt;What really happens when IE Compatibility View is activated? &lt;/p&gt; &lt;p&gt;when IE Compatibility View is activated, the HTTP user-agent header is changed to that of IE7.&lt;/p&gt; &lt;p&gt;The user-agent sent by the browsers follows:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="0" width="581" border="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;&lt;strong&gt;&lt;font size="3"&gt;IE Browser Mode&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt; &lt;td valign="top" width="437"&gt;&lt;strong&gt;&lt;font size="3"&gt;User-Agent&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE10&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;5.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;10.0&lt;/strong&gt;; &lt;br&gt;Windows NT 6.1; Trident/6.0)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE9&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;5.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;9.0&lt;/strong&gt;; &lt;br&gt;Windows NT 6.1; Trident/5.0)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE8&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;4.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;8.0&lt;/strong&gt;; &lt;br&gt;Windows NT 6.1; Trident/4.0)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE7&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;4.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;7.0&lt;/strong&gt;; &lt;br&gt;Windows NT 6.1)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE10 WinPhone&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;5.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;10.0&lt;/strong&gt;; &lt;br&gt;Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch)&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="142"&gt;IE Compatible View&lt;/td&gt; &lt;td valign="top" width="437"&gt;Mozilla/&lt;strong&gt;4.0&lt;/strong&gt; (compatible; MSIE &lt;strong&gt;7.0&lt;/strong&gt;; &lt;br&gt;Windows NT 6.1; Trident/6.0)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Note:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Operating System differences:  &lt;ol&gt; &lt;li&gt;Windows 8 uses NT 6.2  &lt;li&gt;Windows 7 uses NT 6.1  &lt;li&gt;Windows Vista uses NT 6.0&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Layout Engine differences: regardless of Browser Mode in use,  &lt;ol&gt; &lt;li&gt;IE 10 browser uses Trident 6.0  &lt;li&gt;IE 9 browser uses Trident 5.0  &lt;li&gt;IE 8 browser uses Trident 4.0&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/hll2jRff6WI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/907813153219315200/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=907813153219315200" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/907813153219315200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/907813153219315200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/hll2jRff6WI/internet-explorer-compatibility-view.html" title="Internet Explorer Compatibility View" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2013/01/internet-explorer-compatibility-view.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QMQHs9fyp7ImA9WhNVF00.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-7805904315715538332</id><published>2012-12-28T23:34:00.000+08:00</published><updated>2012-12-28T23:43:01.567+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-28T23:43:01.567+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>How to Display/ Load Videos in Browsers</title><content type="html">Here is everything you need to know about videos: &lt;a href="http://diveintohtml5.info/video.html" title="http://diveintohtml5.info/video.html"&gt;http://diveintohtml5.info/video.html&lt;/a&gt;
&lt;br /&gt;
&lt;h2&gt;
Considerations&lt;/h2&gt;
In general, these are the considerations when displaying/ rendering videos over the web:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;where is the video stored/ hosted? – On premise or in the cloud? Cloud-hosting can be a good option for load distribution if the videos are huge.  &lt;/li&gt;
&lt;li&gt;what is the streaming/ downloading protocol? – The trend these days appears to be to stream videos using HTTP rather than specialised (and often expensive) protocols.  &lt;/li&gt;
&lt;li&gt;who is the target audience and what browser/ platform are they using to view these videos?  &lt;ul&gt;
&lt;li&gt;what browser? – Chrome, IE, Firefox, Opera?  &lt;/li&gt;
&lt;li&gt;which version(s)? – still required to support IE6?  &lt;/li&gt;
&lt;li&gt;what operating systems/ environment? – do we have Unix/ Mac users?  &lt;/li&gt;
&lt;li&gt;need to support desktop/ tablet/ mobile? – some or all of these?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
The challenge for the 3rd consideration is to be able to accommodate everyone (from IE6 on a desktop to the iPad safari browser).
To do this, a number of “tricks” need to be employed:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Since Adobe Flash penetration is deep, embed a Flash Video Player (think HTML4):  &lt;ol&gt;
&lt;li&gt;For both commercial/ personal use, try &lt;a href="http://flowplayer.org/" target="_blank"&gt;FlowPlayer&lt;/a&gt; based on GPLv3.  &lt;/li&gt;
&lt;li&gt;Flash version from 9.0.115 allows playing MP4 files on top of SWF&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;HTML5-capable browsers should not be deprived their native/ optimised capabilities  &lt;/li&gt;
&lt;li&gt;Firefox only plays Ogg or WebM (FF4+) for HTML5All these “tricks” are well-documented &lt;a href="http://www.blogger.com/Check%20this:%20http://camendesign.com/code/video_for_everybody" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
Embedding a YouTube Video&lt;/h3&gt;
If you are embedding a YouTube-hosted video, the best is to use an iframe. Using an iframe allows YouTube to determine the best viewing experience based on the client browser’s capabilities.&lt;br /&gt;
There are a number of parameters to configure for the optimum experience.
To embed the iframe, all that is required is to determine the &lt;b&gt;#width#&lt;/b&gt;,&lt;b&gt; #height#&lt;/b&gt; and &lt;b&gt;#videoID#&lt;/b&gt; of the YouTube video.&lt;br /&gt;
The HTML code follows:&lt;br /&gt;
&lt;div class="csharpcode"&gt;
&lt;/div&gt;
&lt;pre class="alt"&gt;&lt;div&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;iframe&lt;/span&gt; &lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;="youtubeplayer"&lt;/span&gt; &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="text/html"&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;  &lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;="#width#"&lt;/span&gt; &lt;span style="color: red;"&gt;height&lt;/span&gt;&lt;span style="color: blue;"&gt;="#height#"&lt;/span&gt; &lt;span style="color: red;"&gt;frameborder&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;  &lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://www.youtube.com/embed/#videoID#"&lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/pre&gt;
YouTube allows passing GET parameters to configure the video player. An example of what I may use to append to the URL could be:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;?autohide=1&amp;amp;fs=0&amp;amp;loop=0&amp;amp;modestbranding=1&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;theme=light&amp;amp;autoplay=0&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
For a complete description of the parameter, see &lt;a href="https://developers.google.com/youtube/player_parameters" target="_blank"&gt;here&lt;/a&gt;.

&lt;br /&gt;
&lt;h3&gt;
Embedding a Video Stored in a Web Server&lt;/h3&gt;
&lt;h4&gt;
Preparing the Files&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Encode &lt;em&gt;at least&lt;/em&gt; 2 video file formats: MP4 and OGG.&lt;em&gt; In case you need to fix the MP4 to correctly support streaming, you may need &lt;/em&gt;&lt;a href="http://rndware.info/products/metadata-mover.html" target="_blank"&gt;&lt;em&gt;this&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;Create a poster image (either JPEG or PNG formats) &lt;/li&gt;
&lt;li&gt;Download the excellent Flash-based &lt;a href="http://flash.flowplayer.org/download/" target="_blank"&gt;FlowPlayer&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
Preparing the Server&lt;/h4&gt;
Store the following files on the web server:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;MP4 (accessible via &lt;b&gt;#http://somewhere.com/VIDEO.mp4#&lt;/b&gt;) and OGG (accessible via &lt;b&gt;#http://somewhere.com/VIDEO.ogg#&lt;/b&gt;) Videos&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Poster (accessible via &lt;b&gt;#http://somewhere.com/POSTER.png#&lt;/b&gt;)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Flash Player files (flowplayer-3.2.15.swf &amp;amp; flowplayer.controls-3.2.14.swf)&lt;/li&gt;
&lt;/ol&gt;
Ensure that the correct mime-types for each file-type is configured correctly.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ogg to be served as video/ogg &lt;/li&gt;
&lt;li&gt;mp4 to be served as video/mp4&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
HTTP Streaming&lt;/h4&gt;
Ideally, the web server should support the HTTP/1.1 “Accept-Range” header to allow HTTP streaming (allows downloading of &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" target="_blank"&gt;partial content&lt;/a&gt; instead of the entire file all-at-once). To confirm if the web server supports the feature, look for &lt;span style="background-color: yellow;"&gt;Accept-Ranges: bytes&lt;/span&gt; in the HTTP header for a HTTP/1.1 GET or HEAD. If the server returns &lt;span style="background-color: yellow;"&gt;Accept-Ranges: none&lt;/span&gt;, the feature isn’t be supported.

To support (random) seeking, disable (gzip) compression for these video files.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
The HTML Page&lt;/h4&gt;
Next, create an HTML page with the following general structure:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Create an HTML5-compatible page&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Use HTML5 video tags (video/ source entities)&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Load the MP4 file first&lt;/li&gt;
&lt;li&gt;Followed by OGG&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Fall-back onto embedded Flash Player to play the MP4 file&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Fall-back further to allow downloading of both the MP4 and OGG files&lt;/li&gt;
&lt;/ol&gt;
An example generated from &lt;a href="http://sandbox.thewikies.com/vfe-generator/" target="_blank"&gt;here&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: maroon;"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: red;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;  &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;meta&lt;/span&gt; &lt;span style="color: red;"&gt;charset&lt;/span&gt;&lt;span style="color: blue;"&gt;="UTF-8"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;head&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;  &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;video&lt;/span&gt; &lt;span style="color: red;"&gt;controls&lt;/span&gt;&lt;span style="color: blue;"&gt;="controls"&lt;/span&gt; &lt;span style="color: red;"&gt;poster&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/POSTER.png#"&lt;/span&gt; &lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;="#width#"&lt;/span&gt; &lt;span style="color: red;"&gt;height&lt;/span&gt;&lt;span style="color: blue;"&gt;="#height#"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;source&lt;/span&gt; &lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/VIDEO.mp4#"&lt;/span&gt; &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="video/mp4"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;source&lt;/span&gt; &lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/VIDEO.ogg#"&lt;/span&gt; &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="video/ogg"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: green;"&gt;&amp;lt;!-- Fallback onto Flash Player --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;object&lt;/span&gt; &lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="application/x-shockwave-flash"&lt;/span&gt; &lt;span style="color: red;"&gt;data&lt;/span&gt;&lt;span style="color: blue;"&gt;="flowplayer-3.2.15.swf"&lt;/span&gt; &lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;="#width#"&lt;/span&gt; &lt;span style="color: red;"&gt;height&lt;/span&gt;&lt;span style="color: blue;"&gt;="#height#"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;param&lt;/span&gt; &lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="movie"&lt;/span&gt; &lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;="flowplayer-3.2.15.swf"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;param&lt;/span&gt; &lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="allowFullScreen"&lt;/span&gt; &lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;="true"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;param&lt;/span&gt; &lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="wmode"&lt;/span&gt; &lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;="transparent"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;param&lt;/span&gt; &lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;="flashVars"&lt;/span&gt; &lt;span style="color: red;"&gt;value&lt;/span&gt;&lt;span style="color: blue;"&gt;="config={'playlist':['#http://somewhere.com/POSTER.png#',{'url':'#http://somewhere.com/VIDEO.mp4#','autoPlay':false}]}"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;        &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: green;"&gt;&amp;lt;!-- Fallback onto download --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;img&lt;/span&gt; &lt;span style="color: red;"&gt;alt&lt;/span&gt;&lt;span style="color: blue;"&gt;="My Video"&lt;/span&gt; &lt;span style="color: red;"&gt;src&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/VIDEO.png#"&lt;/span&gt; &lt;span style="color: red;"&gt;width&lt;/span&gt;&lt;span style="color: blue;"&gt;="768"&lt;/span&gt; &lt;span style="color: red;"&gt;height&lt;/span&gt;&lt;span style="color: blue;"&gt;="432"&lt;/span&gt; &lt;span style="color: red;"&gt;title&lt;/span&gt;&lt;span style="color: blue;"&gt;="No video playback capabilities, please download the video below"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;object&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;video&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;strong&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Download video:&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;strong&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt; &lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/VIDEO.mp4#"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;MP4 format&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; | &lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;      &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt; &lt;span style="color: red;"&gt;href&lt;/span&gt;&lt;span style="color: blue;"&gt;="#http://somewhere.com/VIDEO.ogg#"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Ogg format&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;a&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;p&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;  &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;body&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

&lt;br /&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;html&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;
  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/5ALwA9g9ols" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/7805904315715538332/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=7805904315715538332" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7805904315715538332?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7805904315715538332?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/5ALwA9g9ols/how-to-display-load-videos-in-browsers.html" title="How to Display/ Load Videos in Browsers" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/12/how-to-display-load-videos-in-browsers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQXs5fCp7ImA9WhBRGUs.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4737713198207962802</id><published>2012-12-26T22:34:00.001+08:00</published><updated>2013-03-11T10:29:20.524+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-11T10:29:20.524+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ws" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="wsdl" /><title>2-Way SSL for WCF Web Service Hosted on IIS</title><content type="html">&lt;p&gt;I recently was involved in getting the above to work in our environment. The steps follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Ensure that the SSL certificates are correctly signed  &lt;li&gt;Ensure that the SSL certificate chain is present and valid  &lt;li&gt;Install the certificates in the “Current User” account for validation  &lt;ol&gt; &lt;li&gt;Execute mmc.exe, add “Certificates” snap-in with “My user account”  &lt;li&gt;Install the certificate within “Personal” store  &lt;li&gt;Verify by using Internet Explorer to retrieve the WSDL from the remote web service  &lt;li&gt;If the certificate and chain are correct, Internet Explorer will validate them and report so with “Certificate is OK”&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Install the certificates (and the entire chain) in the “Local Computer” account  &lt;ol&gt; &lt;li&gt;Execute mmc.exe, add “Certificates” snap-in with “Computer account”  &lt;li&gt;Install the certificate within “Personal” store  &lt;li&gt;Note the thumbprint of the certificate&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Configure the WCF web.config to make use of “Client Certificates” by finding the certificate  &lt;ol&gt; &lt;li&gt;within the “LocalMachine”  &lt;li&gt;using the thumbprint (remove the spaces)&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Note the IIS application pool name configured to execute requests to the WCF web service (e.g. web service pool)  &lt;li&gt;Find the certificate in mmc for “Local Computer” account, right-click on the certificate to “Manage Private Keys”  &lt;li&gt;In the Permissions Dialog,  &lt;ol&gt; &lt;li&gt;add the user “IIS AppPool\PoolName” (e.g. IIS App Pool\web service pool)  &lt;li&gt;allow the user “Full Control”&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/-cODiGeb3MU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4737713198207962802/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4737713198207962802" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4737713198207962802?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4737713198207962802?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/-cODiGeb3MU/2-way-ssl-for-wcf-web-service-hosted-on.html" title="2-Way SSL for WCF Web Service Hosted on IIS" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/12/2-way-ssl-for-wcf-web-service-hosted-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cGRnY9fyp7ImA9WhNXFUU.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-5648687168841794643</id><published>2012-12-03T22:36:00.001+08:00</published><updated>2012-12-04T10:43:47.867+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-04T10:43:47.867+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>Microsoft CRM Main Concepts &amp; Relationships</title><content type="html">&lt;p&gt;I came across MS CRM while searching for a solution for leads management. In the process of trying to appreciate the main concepts and relationships as well as a basic gap analysis against our requirements, I created a set of UML class diagrams to document my understanding.&lt;/p&gt; &lt;p&gt;The following are the main concepts (or entities, according to CRM’s nomenclature):&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Main CRM entities  &lt;li&gt;Sales Force entities  &lt;li&gt;Sales Person entities  &lt;li&gt;Activity entities  &lt;li&gt;Teaming entities  &lt;li&gt;Campaign entities&lt;/li&gt;&lt;/ol&gt; &lt;h5&gt;&lt;br&gt;Main CRM entities&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-zRqmpIFCjJA/UL1jU393CRI/AAAAAAAAAUY/T82UMNyAqIo/s1600-h/image%25255B8%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-Z_Ub1ztQNx0/UL1jV71xYyI/AAAAAAAAAUc/STw_-wb-Lvk/image_thumb%25255B5%25255D.png?imgmax=800" width="644" height="279"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;br&gt;Sales Force entities&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-JCMe9bQsVM4/ULy4qlra26I/AAAAAAAAATA/KdeJYiSGdqs/s1600-h/image%25255B22%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-q6FoU-FODJg/ULy4sH-iHGI/AAAAAAAAATI/8smvuKiXJdI/image_thumb%25255B18%25255D.png?imgmax=800" width="507" height="484"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;br&gt;Sales Person entities&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-m7Yp_Hz_OfQ/ULy4tLp9XYI/AAAAAAAAATQ/7XcydPakWdE/s1600-h/image%25255B29%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-8OBoJOBNMzE/ULy4u12uqeI/AAAAAAAAATY/QRrKg9KIgS0/image_thumb%25255B23%25255D.png?imgmax=800" width="581" height="484"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;br&gt;Activity entities&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ZJGhngOr62E/ULy4wShgEDI/AAAAAAAAATg/MqjmG9hEY8U/s1600-h/image%25255B36%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-E_huReaBgBA/ULy4xwTtbuI/AAAAAAAAATo/WIAM7zQvL-A/image_thumb%25255B28%25255D.png?imgmax=800" width="644" height="467"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;br&gt;Teaming entities&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-42ufJs4VyrI/ULy4y2cNmGI/AAAAAAAAATw/CMcgQfkbiXg/s1600-h/image%25255B43%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-k523OY_9M7c/ULy40WD0-YI/AAAAAAAAAT4/nBDwOaw_0VI/image_thumb%25255B33%25255D.png?imgmax=800" width="644" height="477"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;&lt;br&gt;Campaign entities&lt;/h5&gt; &lt;ol&gt;&lt;!--EndFragment--&gt;&lt;/ol&gt; &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-EZbmWlVE9lY/UL1jXJ1F9CI/AAAAAAAAAUo/fxrFhuKrRCk/s1600-h/image%25255B15%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-zQxSFfV51IA/UL1jYAtyW6I/AAAAAAAAAUw/mq_RJkTUd3I/image_thumb%25255B10%25255D.png?imgmax=800" width="621" height="484"&gt;&lt;/a&gt;&lt;/p&gt; &lt;h5&gt;Web References&lt;/h5&gt; &lt;p&gt;Some useful links for read-up:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href="http://crmdynamo.com/2008/06/crm-40-concepts-what-are-leads-contacts-and-opportunities/"&gt;http://crmdynamo.com/2008/06/crm-40-concepts-what-are-leads-contacts-and-opportunities/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/crm/archive/2007/08/27/leads-accounts-contacts-and-opportunities.aspx"&gt;http://blogs.msdn.com/b/crm/archive/2007/08/27/leads-accounts-contacts-and-opportunities.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/-61aY55rtn0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/5648687168841794643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=5648687168841794643" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5648687168841794643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5648687168841794643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/-61aY55rtn0/microsoft-crm-main-concepts.html" title="Microsoft CRM Main Concepts &amp;amp; Relationships" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-Z_Ub1ztQNx0/UL1jV71xYyI/AAAAAAAAAUc/STw_-wb-Lvk/s72-c/image_thumb%25255B5%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/12/microsoft-crm-main-concepts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcHR3g-eCp7ImA9WhJaEkU.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4676022438075969343</id><published>2012-10-02T20:07:00.001+08:00</published><updated>2012-10-04T00:50:36.650+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-04T00:50:36.650+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>HTTP over TLS/ SSL: What is Really Secured?</title><content type="html">&lt;p&gt;HTTP over TLS/ SSL performs encryption of transferred data. However, what is &lt;em&gt;really&lt;/em&gt; encrypted and what isn’t?&lt;/p&gt; &lt;p&gt;Part of the TLS/ SSL negotiation will not be secured. Everything else is securely transmitted.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;What is in the clear/ can be derived will be the destination hostname or IP address and the port (usually 443) &lt;li&gt;URLs for GET/ POST/ HEAD request methods are secured  &lt;ul&gt; &lt;li&gt;GET URL parameters, e.g. ?data=12345678&amp;amp;id=123  &lt;li&gt;POST URL&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;All HTTP headers are secured. These include:  &lt;ul&gt; &lt;li&gt;Cookies  &lt;li&gt;Content-type/ content-length  &lt;li&gt;Cache control  &lt;li&gt;User-agent  &lt;li&gt;Accept (-encoding)&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;HTTP payload is secured. This may be:  &lt;ul&gt; &lt;li&gt;POST parameter  &lt;li&gt;HTML/ XML data&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Does it therefore mean that the GET URL over HTTPS is secured? You decide for yourself….&lt;/p&gt; &lt;ol&gt; &lt;li&gt;As the GET URL method information is secured, any sniffer between the source and destination would not be able to “see” the URL parameters.  &lt;li&gt;However, the web browser would track the full GET URL (including the parameters) in the browsing history. As such, anyone having access to the web browser might be able to view the URL.  &lt;li&gt;Similarly, the access logs in the web server would typically store the full GET URL&lt;/li&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/fF3cj5Y3puE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4676022438075969343/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4676022438075969343" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4676022438075969343?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4676022438075969343?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/fF3cj5Y3puE/http-over-tls-ssl-what-is-really-secured.html" title="HTTP over TLS/ SSL: What is Really Secured?" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/10/http-over-tls-ssl-what-is-really-secured.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AHRH48fSp7ImA9WhJaEUo.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-7936826799068734640</id><published>2012-09-01T02:18:00.001+08:00</published><updated>2012-10-02T20:08:55.075+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-02T20:08:55.075+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>How to Send an iCal File as an Exchange Appointment</title><content type="html">Creating an iCal is rather straightforward, so is sending out an email with the iCal file attached therein. &lt;br&gt;&lt;br&gt;What is required in our case is to automate sending out an appointment thru’ MS Exchange in a way that it behaves as though an appointment has been manually sent by someone thru’ Exchange. &lt;br&gt;This would mean that the appointment has to appear in the Exchange Calendar whether or not the recipient remembers to accept the appointment.&lt;br&gt;This is not possible with a typical iCal sent as an attachment in an email as the recipient would need to open the iCal file and save it before it appears in the Exchange Calendar (sort of an import function).&lt;br&gt;&lt;br&gt;Apart from making use of Exchange API, a &lt;u&gt;much simpler solution&lt;/u&gt; would be to (still) send the iCal as an attachment in an email but “trick” Exchange into recognising the mail as an Exchange appointment.&lt;br&gt;&lt;br&gt;Credits to this &lt;a href="http://www.mavetju.org/programming/outlook-ics.php" target="_blank"&gt;website&lt;/a&gt; for first uncovering the solution.&lt;br&gt;&lt;br&gt;First and foremost, understand the difference between an Appointment and a Meeting Request. The former doesn’t require inviting attendees while the latter infers inviting some attendees.&lt;br&gt;&lt;br&gt;While the iCal file is a standard, the attaching email is special in that:&lt;br&gt; &lt;ol&gt; &lt;li&gt;the email subject becomes the name of the event/ appointment (and supersedes the &lt;em&gt;summary&lt;/em&gt; of the iCal)  &lt;li&gt;it must not contain any attachment  &lt;li&gt;if the email contains a content body, the body will supersede the &lt;em&gt;description&lt;/em&gt; in the iCal  &lt;li&gt;it can only have the view/ part containing the iCal&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The email-sending code looks like the following:&lt;br&gt;&lt;/p&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: MailMessage mm = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MailMessage("&lt;span style="color: #8b0000"&gt;&amp;lt;sender&amp;gt;&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;&amp;lt;recipient&amp;gt;&lt;/span&gt;");&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:  &lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: mm.Subject = "&lt;span style="color: #8b0000"&gt;&amp;lt;The Name of the Appointment&amp;gt;&lt;/span&gt;";&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: mm.Headers.Add("&lt;span style="color: #8b0000"&gt;content-class&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;urn:content-classes:calendarmessage&lt;/span&gt;");&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:  &lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: AlternateView calPart = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AlternateView("&lt;span style="color: #8b0000"&gt;&amp;lt;filepath and name of iCal&amp;gt;&lt;/span&gt;", \&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: 	&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ContentType("&lt;span style="color: #8b0000"&gt;text/calendar; method=REQUEST; name=\"&amp;lt;iCal filename&amp;gt;\"&lt;/span&gt;"));&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:  &lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: calPart.TransferEncoding = TransferEncoding.SevenBit;&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:  &lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11: mm.AlternateViews.Add(calPart);&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12:  &lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13: &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; mm;&lt;/pre&gt;&lt;/pre&gt;&lt;br&gt;In line 7&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br&gt;&lt;br /&gt;&lt;li&gt;the name part of the ContentType is strictly not necessary for Exchange but is required for non-Exchange servers to determine the name of the attachment. &lt;br&gt;&lt;br /&gt;&lt;li&gt;the method depends on whether this is an appointment (method=PUBLISH) or meeting request (method=REQUEST) or a meeting cancellation (method=CANCEL)&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;The attached iCal file looks like the following:&lt;br&gt;&lt;pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: BEGIN:VCALENDAR&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: PRODID:-&lt;span style="color: #008000"&gt;//Microsoft Corporation//Outlook MIMEDIR//EN&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: VERSION:2.0&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: METHOD:REQUEST&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: BEGIN:VTIMEZONE&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: TZID:Singapore Standard Time&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: BEGIN:STANDARD&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8: DTSTART:16010101T000000&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: TZOFFSETFROM:+0800&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10: TZOFFSETTO:+0800&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11: END:STANDARD&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12: END:VTIMEZONE&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13: BEGIN:VEVENT&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14: CATEGORIES:&amp;lt;Category&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15: CLASS:PUBLIC&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16: CREATED:20120831T100824Z&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17: DESCRIPTION:&amp;lt;Content or Agenda of the appointment&amp;gt; \n\n&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18: DTEND;TZID="&lt;span style="color: #8b0000"&gt;Singapore Standard Time&lt;/span&gt;":20120903T160000&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 19: DTSTAMP:20120831T100824Z&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 20: DTSTART;TZID="&lt;span style="color: #8b0000"&gt;Singapore Standard Time&lt;/span&gt;":20120903T140000&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 21: PRIORITY:5&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 22: SEQUENCE:0&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 23: SUMMARY;LANGUAGE=en-us:&amp;lt;Name of the iCal Event&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 24: TRANSP:OPAQUE&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 25: UID:&amp;lt;Some unique GUID e.g. 000012345&amp;gt;&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 26: BEGIN:VALARM&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 27: TRIGGER:-PT15M&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 28: ACTION:DISPLAY&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 29: DESCRIPTION:Reminder&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 30: END:VALARM&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 31: END:VEVENT&lt;br&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 32: END:VCALENDAR&lt;/pre&gt;&lt;/pre&gt;&lt;br&gt;Again in line 4, the method depends on the nature of the message (appointment or meeting request).&lt;br&gt;That is all required for things to work.&lt;br&gt;&lt;br&gt;Some salient references/ websites are:&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br&gt;&lt;br /&gt;&lt;li&gt;Reference for iCal standard &lt;a href="http://www.kanzaki.com/docs/ical/" target="_blank"&gt;here&lt;/a&gt; &lt;br /&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/gg672059(v=exchg.80)" target="_blank"&gt;MSDN&lt;/a&gt; on Exchange Server Protocol (esp. X-) &lt;br /&gt;&lt;li&gt;iCal validation services &lt;a href="http://icalvalid.cloudapp.net/" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://severinghaus.org/projects/icv/" target="_blank"&gt;here&lt;/a&gt; &lt;br /&gt;&lt;li&gt;.NET iCal implementation &lt;a href="http://www.ddaysoftware.com/Pages/Projects/DDay.iCal/" target="_blank"&gt;here&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/VeRl5aRVUME" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/7936826799068734640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=7936826799068734640" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7936826799068734640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7936826799068734640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/VeRl5aRVUME/how-to-send-ical-file-as-exchange.html" title="How to Send an iCal File as an Exchange Appointment" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/09/how-to-send-ical-file-as-exchange.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QFQ3w7fCp7ImA9WhJbEE4.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-2228401832484967600</id><published>2012-08-22T16:16:00.001+08:00</published><updated>2012-09-19T15:21:52.204+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-19T15:21:52.204+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="practices" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>National Do-Not-Call Registry (Singapore)</title><content type="html">Information regarding the proposed National DNC registry can be found &lt;a href="http://www.mica.gov.sg/DNCconsultation/National%20DNC%20Registry%20Public%20Consultation%20Paper%20(extended%20deadline).pdf" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;
The DNC registry allows individuals to opt-out of &lt;em&gt;&lt;strong&gt;marketing messages&lt;/strong&gt;&lt;/em&gt; in the forms of &lt;strike&gt;email&lt;/strike&gt;, SMS/ MMS, faxes, phone-call.&lt;br /&gt;
A message is regarded as a &lt;strong&gt;&lt;em&gt;marketing message&lt;/em&gt;&lt;/strong&gt; as long as it is determined that &lt;u&gt;part of the message has a purpose which is marketing in nature as defined&lt;/u&gt;.&lt;br /&gt;
Messages that are marketing in nature if one of the purposes of the message is:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;to offer to supply, advertise or promote &lt;em&gt;goods or services&lt;/em&gt;, the suppliers or prospective suppliers of goods and services
&lt;li&gt;to supply, advertise or promote land, interests in land, business or investment opportunities&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/E6t-v0q2U9M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/2228401832484967600/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=2228401832484967600" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2228401832484967600?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2228401832484967600?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/E6t-v0q2U9M/national-do-not-call-registry-singapore.html" title="National Do-Not-Call Registry (Singapore)" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/08/national-do-not-call-registry-singapore.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNRn46eyp7ImA9WhJWF0w.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-8411865168311770112</id><published>2012-08-10T14:04:00.000+08:00</published><updated>2012-08-23T16:21:37.013+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-23T16:21:37.013+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Poor Man's SSO with Multiple ASP.NET Web Applications</title><content type="html">It is quite straightforward to have (poor man's) single sign-on for multiple ASP.NET web applications without sourcing for an enterprise solution.&lt;br /&gt;
&lt;br /&gt;
Based on the following premise:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;assuming the web applications are in the same domain&amp;nbsp; &lt;/li&gt;
&lt;li&gt;forms or custom authentication is used for the web application&lt;/li&gt;
&lt;/ol&gt;
In order to have things work, a couple of steps are required, namely:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Enable Forms authentication for the relevant web applications, use:&lt;br /&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;authentication&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;mode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;Forms&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;Ensure that the validationKey and decryptionKey settings (under the machineKey element) are &lt;em&gt;not&lt;/em&gt; auto-generated but are explicitly coded and shared across the relevant web applications (and web farm, if applicable). &lt;ol&gt;
&lt;li&gt;For IIS6, you can use &lt;a href="http://aspnetresources.com/tools/machineKey" rel="nofollow" target="_blank"&gt;this website&lt;/a&gt; to generate the keys &lt;/li&gt;
&lt;li&gt;For IIS7+, you can use &lt;a href="http://blogs.msdn.com/b/vijaysk/archive/2009/05/13/iis-7-tip-10-you-can-generate-machine-keys-from-the-iis-manager.aspx" rel="nofollow" target="_blank"&gt;IIS Manager to do so&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Customise the name of the cookie (instead of the default .ASPXAUTH) but more importantly, set the cookie path to the default root "/" and the domain to a valid one, use: &lt;br /&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;&lt;span style="color: #a31515; font-family: consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;forms&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;".&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;PoorMan.SSO&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"?&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="color: red; font-family: consolas;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;" &lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;requireSSL&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;true|false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;" &lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;timeout&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: blue;"&gt;30&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: red;"&gt;slidingExpiration&lt;/span&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;true|false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red; font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;nbsp;protection&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black; font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;span style="color: blue;"&gt;All&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;"&lt;/span&gt;&lt;/span&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;To determine if the user is authenticated, use: &lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;HttpContext&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;.Current.User.Identity.IsAuthenticated&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: inherit;"&gt;To determine the identity of the authenticated user, use:&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;HttpContext&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;.Current.User.Identity.Name&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;To set the Session cookie after the custom authentication is successful, use: &lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;FormsAuthentication&lt;span style="color: black;"&gt;.RedirectFromLoginPage(username, &lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;&lt;span style="color: blue; font-family: consolas;"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;To log-off the user, use &lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;&lt;span style="color: #2b91af; font-family: consolas;"&gt;FormsAuthentication&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: consolas;"&gt;&lt;span style="font-family: consolas;"&gt;.SignOut();&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Due to &lt;a href="http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770148" rel="nofollow" target="_blank"&gt;breaking changes in .NET 4.0&lt;/a&gt;,&amp;nbsp;for&amp;nbsp;mixed-mode deployment using different CLRs (i.e. CLR 2.0 and CLR 4.0), the machineKey needs to use the same (older) validation algorithm. CLR 2.0 uses HMACSHA1 while CLR 4.0 uses HMACSHA256. Use:&lt;br /&gt;&lt;span style="font-family: Consolas;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;&lt;span style="color: #a31515;"&gt;&lt;span style="color: #a31515;"&gt;machineKey&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style="color: red;"&gt;&lt;span style="color: red;"&gt;validation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;SHA1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;span style="color: black;"&gt;Additional resources (often outdated) can be found:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://weblogs.asp.net/hernandl/archive/2004/06/09/ssoformsauth.aspx" rel="nofollow" target="_blank"&gt;ASP.NET blog&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codeproject.com/Articles/6586/Single-sign-on-across-multiple-applications-in-ASP" rel="nofollow" target="_blank"&gt;CodeProject&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://telligent.com/support/telligent_evolution_platform/community/w/community6/19918.common-things-to-check-when-using-forms-authentication.aspx" rel="nofollow" target="_blank"&gt;Some product support pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/1d3t3c61(v=vs.100)" rel="nofollow" target="_blank"&gt;MSDN site for forms element in Web.config&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/kcb0Vo-kCfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/8411865168311770112/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=8411865168311770112" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/8411865168311770112?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/8411865168311770112?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/kcb0Vo-kCfE/poor-mans-sso-with-multiple-aspnet-web.html" title="Poor Man&amp;#39;s SSO with Multiple ASP.NET Web Applications" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/poor-mans-sso-with-multiple-aspnet-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ANQXo4fyp7ImA9WhJQFEU.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-6887792162541898144</id><published>2012-07-28T23:36:00.000+08:00</published><updated>2012-07-28T23:36:30.437+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-28T23:36:30.437+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="management" /><category scheme="http://www.blogger.com/atom/ns#" term="motivation" /><category scheme="http://www.blogger.com/atom/ns#" term="leadership" /><title>Dealing with Team Member's Performance Issue</title><content type="html">The &lt;strong&gt;CRAM&lt;/strong&gt; model suggests to investigate poor performance in a team member in this &lt;em&gt;top-down order&lt;/em&gt;:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt;onstraints - is the member experiencing certain constraints in his/ her life that limits productivity or effectiveness? For example; married, birth, or death of a close one, debt or addiction issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt;esources - are there resource issues that prevents productive contribution? E.g. lack of test environment, IDE, tools, software licenses, hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;ptitude - is the team member cut-out for the role? Are there other more suitable roles available?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M&lt;/strong&gt;otivation - is the team member motivated to perform the role or is he/ she just passing time? Is it time to change the role or the job?&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/nvkn4RZ72hM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/6887792162541898144/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=6887792162541898144" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/6887792162541898144?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/6887792162541898144?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/nvkn4RZ72hM/dealing-with-team-members-performance.html" title="Dealing with Team Member's Performance Issue" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/dealing-with-team-members-performance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04AQng6fSp7ImA9WhJQEEg.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-5861008604194612720</id><published>2012-07-24T00:12:00.000+08:00</published><updated>2012-07-24T00:12:23.615+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-24T00:12:23.615+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="storage" /><title>SAN or NAS storage systems… How do they affect my applications?</title><content type="html">Here are some salient difference I gathered:&lt;br /&gt;
&lt;table bgcolor="silver" border="1" bordercolor="black" bordercolordark="white" bordercolorlight="white"&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;SAN&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;NAS&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Connection&lt;/td&gt; &lt;td&gt;FC/ SCSI&lt;/td&gt; &lt;td&gt;Ethernet&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Speed&lt;/td&gt; &lt;td&gt;Typically faster (unless over Ethernet like FCoE or iSCSI)&lt;/td&gt; &lt;td&gt;Typically slower&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Cost&lt;/td&gt; &lt;td&gt;Typically higher&lt;/td&gt; &lt;td&gt;Typically lower&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Intrusiveness&lt;/td&gt; &lt;td&gt;Appears like locally attached storage to OS&lt;/td&gt; &lt;td&gt;Remotely accessible filesystem using protocols like: &lt;br /&gt;
NFS (Unix)/ CIFS (Windows)/ AFP (iOS) or even HTTP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Can same unit be shared across different servers?&lt;/td&gt; &lt;td&gt;No – every server mount will have its own exclusive blocks&lt;/td&gt; &lt;td&gt;Yes. Concurrent access and locking is handled by the access protocols&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;Unit of storage&lt;/td&gt; &lt;td&gt;block-level&lt;/td&gt; &lt;td&gt;file-level&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;/td&gt; &lt;td&gt;&lt;/td&gt; &lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/IsPvFEqTs8Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/5861008604194612720/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=5861008604194612720" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5861008604194612720?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5861008604194612720?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/IsPvFEqTs8Y/san-or-nas-storage-systems-how-do-they.html" title="SAN or NAS storage systems… How do they affect my applications?" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/san-or-nas-storage-systems-how-do-they.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQXs5eSp7ImA9WhBRGUs.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-3640501429567547665</id><published>2012-07-17T18:40:00.000+08:00</published><updated>2013-03-11T10:29:20.521+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-11T10:29:20.521+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Issues with IE9 Compatibility</title><content type="html">The following should help:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/04/27/ie9-compat-inspector.aspx" rel="nofollow" target="_blank"&gt;Javascript inspector&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IE9 Compatibility &lt;a href="http://msdn.microsoft.com/en-us/library/ff986083.aspx" rel="nofollow" target="_blank"&gt;Cookbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IE9 Javascript &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx" rel="nofollow" target="_blank"&gt;changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/03/18/preparing-your-site-for-ie9.aspx" rel="nofollow" target="_blank"&gt;Preparing&lt;/a&gt; website for IE9&lt;/li&gt;
&lt;li&gt;IE9 document modes and &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/03/24/ie9-s-document-modes-and-javascript.aspx" rel="nofollow" target="_blank"&gt;Javascript support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Even &lt;a href="http://www.magentolog.com/en/A-single-line-of-code-to-solve-a-variety-of-ie-compatibility-issues-ie6-ie7-ie8-ie9-ie10/" rel="nofollow" target="_blank"&gt;Baidu uses DocType&lt;/a&gt; to resolve issues!&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/_PW9cmxPvls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/3640501429567547665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=3640501429567547665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/3640501429567547665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/3640501429567547665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/_PW9cmxPvls/issues-with-ie9-compatibility.html" title="Issues with IE9 Compatibility" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/issues-with-ie9-compatibility.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MMRn88cCp7ImA9WhJQF0g.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-4029161994619239004</id><published>2012-07-16T09:21:00.001+08:00</published><updated>2012-08-01T00:18:07.178+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-01T00:18:07.178+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>General Flow for Web Access Management</title><content type="html">&lt;p&gt;Three aspects are typically handled by Web Access Management software:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;protect resources  &lt;li&gt;authenticate users  &lt;li&gt;authorise users&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The flow is depicted in the following Activity Diagram:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-J3qqN9j3LJw/UBgFO0opuoI/AAAAAAAAASM/2LqbfCE8TLc/s1600-h/image%25255B9%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-K2UJKwKFF_g/UBgFPlRo6LI/AAAAAAAAASU/FEwn62NOvqM/image_thumb%25255B7%25255D.png?imgmax=800" width="484" height="620"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/gf1dxBdMD18" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/4029161994619239004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=4029161994619239004" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4029161994619239004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/4029161994619239004?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/gf1dxBdMD18/general-flow-for-web-access-management.html" title="General Flow for Web Access Management" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-K2UJKwKFF_g/UBgFPlRo6LI/AAAAAAAAASU/FEwn62NOvqM/s72-c/image_thumb%25255B7%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/general-flow-for-web-access-management.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUMSHgyeCp7ImA9WhJXE0g.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-7938494565461738641</id><published>2012-07-11T23:56:00.001+08:00</published><updated>2012-08-07T23:28:09.690+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-07T23:28:09.690+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="practices" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Personal Data Protection Bill</title><content type="html">&lt;p&gt;Some information regarding the proposed Personal Data Protection Bill 2012 (Singapore):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Covers the regulation pertaining to the collection, use, disclosure, transfer &amp;amp; security of personal data. &lt;li&gt;The PDP Bill consultation paper found &lt;a href="http://www.mica.gov.sg/DPbillconsultation/Consultation_Paper__for_PDP_Bill.pdf" target="_blank"&gt;here&lt;/a&gt;  &lt;li&gt;The proposed PDP Bill found &lt;a href="http://www.mica.gov.sg/DPbillconsultation/Annex%20D_Draft%20PDP%20Bill%20for%20Consultation.pdf" target="_blank"&gt;here&lt;/a&gt;  &lt;li&gt;The Model Data Protection Code for the Private Sector found &lt;a href="http://www.trustsg.com.sg/downloads/Data_Protection_Code_v1.3.pdf" target="_blank"&gt;here&lt;/a&gt;  &lt;li&gt;A subsequent report of the above-mentioned Model Code by the NIAC found &lt;a href="http://www.agc.gov.sg/publications/docs/Model_Data_Protection_Code_Feb_2002.pdf" target="_blank"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The PDP bill interprets “personal data” to refer to data, whether true or not, about an individual who can be identified&lt;/p&gt; &lt;ol&gt; &lt;li&gt;from that data; or  &lt;li&gt;from that data and other information to which the organisation is likely to have access&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The bill does not provide greater clarity to the definition of “personal data” and a prescriptive list of personal data would not be provided. Fortunately, the definition was largely adapted from the Model Code which provided certain implementation &amp;amp; operational guidelines with specific examples.&lt;/p&gt; &lt;p&gt;An excerpt from the Model Code follows:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Persons are identifiable not only by their names but also by their pictures, their telephone numbers, or by some special identification number (e.g. NRIC and Passport numbers), etc..&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;"Personal data" may include an individual’s:&lt;/em&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;name, age, weight, height&lt;/em&gt;  &lt;li&gt;&lt;em&gt;NRIC/FIN number&lt;/em&gt;  &lt;li&gt;&lt;em&gt;medical records&lt;/em&gt;  &lt;li&gt;&lt;em&gt;income, purchases and spending habits&lt;/em&gt;  &lt;li&gt;&lt;em&gt;race, ethnic origin and colour&lt;/em&gt;  &lt;li&gt;&lt;em&gt;blood type, DNA code, fingerprints&lt;/em&gt;  &lt;li&gt;&lt;em&gt;marital status and religion&lt;/em&gt;  &lt;li&gt;&lt;em&gt;education&lt;/em&gt;  &lt;li&gt;&lt;em&gt;home address and phone number&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;While such data taken separately may not identify a person, a conjunction of a number of such data could be sufficient to identify an individual.&lt;/p&gt; &lt;p&gt;For those who are not legally trained (including myself), this should give some ideas to the type of information that needs to be protected with the proposed bill.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/9Q05R7hKBXw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/7938494565461738641/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=7938494565461738641" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7938494565461738641?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7938494565461738641?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/9Q05R7hKBXw/personal-data-protection-bill.html" title="Personal Data Protection Bill" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/personal-data-protection-bill.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEERHY6eSp7ImA9WhJSGEg.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-5585560808057756943</id><published>2012-07-10T01:56:00.001+08:00</published><updated>2012-07-10T01:56:45.811+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-10T01:56:45.811+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><category scheme="http://www.blogger.com/atom/ns#" term="motivation" /><title>Stages in Competency</title><content type="html">&lt;p&gt;Just read about the 4 stages in competence that applies to learning and measuring competencies in new skills. It’s always good to know where one stands for each competency.&lt;/p&gt; &lt;p&gt;From the lowest to the highest, they are:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Unconscious Incompetence&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Individual does not know the required skill/ competence exists, let along the relevance of it.  &lt;li&gt;Individual is incompetence and does not know it  &lt;li&gt;Call this individual &lt;em&gt;ignorant, clueless&lt;/em&gt;  &lt;li&gt;&lt;strong&gt;To do&lt;/strong&gt;: Need guidance to identify deficits  &lt;li&gt;&lt;em&gt;“Don’t know what you don’t know”&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Conscious Incompetence&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Individual recognises deficit in competency/ skill but is not addressing it/ not able to address it  &lt;li&gt;Appreciates the value of the competency/ skill  &lt;li&gt;Call this individual &lt;em&gt;a beginner, a learner&lt;/em&gt;  &lt;li&gt;&lt;strong&gt;To do&lt;/strong&gt;: Offer vast sources of learning resources and even training. Also allow for mistakes.  &lt;li&gt;&lt;em&gt;“Know what you don’t know”&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Conscious Competence&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Individual is able to demonstrate basic competency when required and at will  &lt;li&gt;Takes conscious effort/ concentration to demonstrate competency/ skill  &lt;li&gt;Call this individual &lt;em&gt;an apprentice, a novice&lt;/em&gt;  &lt;li&gt;&lt;strong&gt;To do&lt;/strong&gt;: Offer step-by-step guidelines, reminders and directed sources of information  &lt;li&gt;&lt;em&gt;“Know what you know but requires exertion”&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Unconscious Competence&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;The highest cognitive level where the competency/ skill is “second-nature” or automatic to the individual  &lt;li&gt;Competency/ skill can be performed easily due to much practice  &lt;li&gt;Individual may even be able to multi-task where performing the skill  &lt;li&gt;Individual has achieved mastery  &lt;li&gt;Call this individual &lt;em&gt;an expert, a master&lt;/em&gt;  &lt;li&gt;&lt;strong&gt;To do&lt;/strong&gt;: Having reached a mastery level, have the individual teach/ impart the competency/ skill  &lt;li&gt;&lt;em&gt;“Mastered what you know”&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/FFxY9rG5AhE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/5585560808057756943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=5585560808057756943" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5585560808057756943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/5585560808057756943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/FFxY9rG5AhE/stages-in-competency.html" title="Stages in Competency" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/stages-in-competency.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMRn85fCp7ImA9WhJSGEg.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-7748402676176336427</id><published>2012-07-10T00:44:00.001+08:00</published><updated>2012-07-10T00:44:47.124+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-10T00:44:47.124+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Browser wars</title><content type="html">Around the world, Chrome appears to have overtaken IE for the desktop recently.&lt;br /&gt;
&lt;div height="400" id="browser-ww-monthly-201201-201206" style="height: 400px; width: 600px;" width="600"&gt;
&lt;/div&gt;
Source: &lt;a href="http://gs.statcounter.com/#browser-ww-monthly-201201-201206"&gt;StatCounter Global Stats - Browser Market Share&lt;/a&gt;&lt;br /&gt;
&lt;script src="http://www.statcounter.com/js/FusionCharts.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;script src="http://gs.statcounter.com/chart.php?browser-ww-monthly-201201-201206" type="text/javascript"&gt;
&lt;/script&gt;
&lt;br /&gt;
&lt;br /&gt;
Singapore is heavily dominated by iOS but Android is catching-up fast!&lt;br /&gt;
&lt;div height="400" id="mobile_os-SG-monthly-201201-201206" style="height: 400px; width: 600px;" width="600"&gt;
&lt;/div&gt;
Source: &lt;a href="http://gs.statcounter.com/#mobile_os-SG-monthly-201201-201206"&gt;StatCounter Global Stats - Mobile OS Market Share&lt;/a&gt;&lt;br /&gt;
&lt;script src="http://www.statcounter.com/js/FusionCharts.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;script src="http://gs.statcounter.com/chart.php?mobile_os-SG-monthly-201201-201206" type="text/javascript"&gt;
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/xLIFgQEdG7c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/7748402676176336427/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=7748402676176336427" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7748402676176336427?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/7748402676176336427?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/xLIFgQEdG7c/browser-wars.html" title="Browser wars" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/browser-wars.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMGQHgyfSp7ImA9WhJSEkk.&quot;"><id>tag:blogger.com,1999:blog-37338138.post-2683273370527906846</id><published>2012-07-02T22:47:00.001+08:00</published><updated>2012-07-02T22:47:01.695+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-02T22:47:01.695+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="devops" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Excerpts From “What Can DevOps Learn from Formula 1” Presentation</title><content type="html">&lt;p&gt;Full presentation available &lt;a href="http://www.infoq.com/presentations/What-Can-DevOps-Learn-from-Formula-1" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;A list of salient points follows:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;How to define success?&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Developers want Agility &amp;amp; Change&lt;/li&gt; &lt;li&gt;Operations want Availability &amp;amp; Stability&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;F1 car lifecycle&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Design –&amp;gt; Develop –&amp;gt; Test –&amp;gt; Deploy –&amp;gt; Support&lt;/li&gt; &lt;li&gt;Support (Operations) need to always provide feedback to Design (Development)&lt;/li&gt; &lt;li&gt;Engineers need to work hand-in-hand with Operations&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Success must be measured&lt;/li&gt; &lt;ul&gt; &lt;li&gt;F1: Telemetry and monitoring are required to deliver drivers’ results&lt;/li&gt; &lt;li&gt;IT Systems: Performance data collection and analysis as well as performance monitoring are required to deliver success&lt;/li&gt; &lt;li&gt;Monitoring is critical in managing change&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Need to constantly monitor and manage impact of change. Need to provide feedback for where the car:&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Is fast – where things are done right&lt;/li&gt; &lt;li&gt;Is slow – where to optimise and improve&lt;/li&gt; &lt;li&gt;Failed – where to fix&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Three key aspects that impact application performance&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Concurrency&lt;/li&gt; &lt;li&gt;Data volume&lt;/li&gt; &lt;li&gt;Resources&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Where does one find the real bottlenecks?&lt;/li&gt; &lt;ol&gt; &lt;li&gt;Not often in Development – no issues in concurrency, data volume, resource&lt;/li&gt; &lt;li&gt;Less often in QA/ Test – concurrency issues may likely surface, resource issues may occasionally surface&lt;/li&gt; &lt;li&gt;Often in Production – concurrency, data volume and resource issues become evident&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;  &lt;img src="http://feeds.feedburner.com/~r/blog/softwareishard/~4/2ugzLj5E-Ac" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://softwarehard.blogspot.com/feeds/2683273370527906846/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=37338138&amp;postID=2683273370527906846" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2683273370527906846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37338138/posts/default/2683273370527906846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blog/softwareishard/~3/2ugzLj5E-Ac/excerpts-from-what-can-devops-learn.html" title="Excerpts From “What Can DevOps Learn from Formula 1” Presentation" /><author><name>Johannes Kuah</name><uri>https://plus.google.com/115226266603553731262</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-OA-j3xftxLs/AAAAAAAAAAI/AAAAAAAAAVE/W46XxK7t5Yk/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://softwarehard.blogspot.com/2012/07/excerpts-from-what-can-devops-learn.html</feedburner:origLink></entry></feed>
