<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8613785</id><updated>2025-06-18T04:46:32.657+01:00</updated><category term=".NET"/><category term="ASP.NET"/><category term="C#"/><category term="GIS"/><title type='text'>Rupert Rawnsley&#39;s WebLog</title><subtitle type='html'>I&#39;ve started so I&#39;ll finish.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>213</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8613785.post-3731704637204311487</id><published>2020-03-19T12:15:00.000+00:00</published><updated>2020-03-19T12:15:48.825+00:00</updated><title type='text'>The Annotated URL (aURL)</title><content type='html'>Here is a modest proposal for a URL annotation scheme that is useful when downloading static resources via URLs and offers a robust alternative to HTTP &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control&quot;&gt;Cache-Control&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
We have used this system for many years to reliably transfer terrabytes of data to hundreds of thousands of devices around the world. It could also be integrated into web browsers to significantly reduce the number of HTTP requests.&lt;br /&gt;
&lt;h2&gt;
Specification&lt;/h2&gt;
Annotated URL (aURL) parameters let you check cached files without making a new web request:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;url&amp;gt;?date=&amp;lt;unixtime&amp;gt;&amp;amp;size=&amp;lt;bytes&amp;gt;&amp;amp;md5=&amp;lt;hash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; https://www.google.com/favicon.ico?date=1481158857&amp;amp;size=5430&amp;amp;md5=f3418a443e7d841097c714d69ec4bcb8&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&amp;amp;date&lt;/b&gt; lets you check if the remote file is newer than the local cached file and needs to be downloaded again.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;amp;size&lt;/b&gt; gives a trivial check of file integrity without needing to hash the file and tells you the size before the request begins.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;amp;md5&lt;/b&gt; is between 1 and 32 hex nybbles of the MD5 file hash where increasing character count gives increasing confidence of integrity.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
All aURL parameters are optional, but all three are recommended because URL characters are cheap and web requests are expensive.&lt;br /&gt;
&lt;br /&gt;
aURLs can also be used to verify the integrity of a newly downloaded file with no additional information.&lt;br /&gt;
&lt;br /&gt;
aURLs are CDN friendly because they naturally force the edge nodes to fetch modified resources.&lt;br /&gt;
&lt;br /&gt;
aURLs could be generated automatically by publishing platforms like WordPress.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/3731704637204311487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/3731704637204311487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3731704637204311487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3731704637204311487'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2020/03/annotated-url-aurl.html' title='The Annotated URL (aURL)'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-8514783698226965626</id><published>2013-03-29T21:40:00.001+00:00</published><updated>2023-03-27T10:38:02.105+01:00</updated><title type='text'>Love and the Singularity</title><content type='html'>One of the milestones of &lt;a href=&quot;http://en.wikipedia.org/wiki/Technological_singularity&quot;&gt;the singularity&lt;/a&gt; is a computer capable of passing the &lt;a href=&quot;http://en.wikipedia.org/wiki/Turing_test&quot;&gt;Turing test&lt;/a&gt;: &lt;i&gt;can you tell the difference between a computer and a real human using only text messages?&lt;/i&gt; It manages to be both subjective and&amp;nbsp;definitive in that you cannot continue to maintain you prefer humans to machines if you can no longer tell them apart, much like the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pepsi_Challenge&quot;&gt;Pepsi Challenge&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In the context of the singularity, the Turing test is a canary in the coalmine. It is not practical as such, instead it signifies that computers have stormed the last fortress of human uniqueness (interestingly a synonym of singularity), and that they are now likely to be capable of our most precious gift: original thought.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
But where is love? That most powerful part of the human experience and the driver for so much of what we do (both good and bad). A computer may become powerful and creative enough to cure malaria, but what is its motivation to do so? A human scientist does so for a mixture of love for his fellow humans, a love of the terrible beauty of biology, and a love of doing something he or she is good at. I expect all of these things are an important part of the creative process, possibly even essential, but I am not suggesting the capacity for love is somehow uniquely human and that this will prevent the singularity - it&#39;s not that kind of essay - I&#39;m simply pointing out that&amp;nbsp;truly&amp;nbsp;intelligent computers may require the capability for love. Personally I find it harder to imagine a computer writing an ode than one beating me at chess; a feat already achieved by my treacherous cell phone.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If computers could love humans, or even if they couldn&#39;t, could we love them? This has significant consequences and shares some of the traits of the Turing test: love is the ultimate subjective emotion, but loving a computer would be a&amp;nbsp;definitive&amp;nbsp;step and a harbinger of societal change. It is hard to feel that computers are&amp;nbsp;soulless&amp;nbsp;automatons bent on destroying humanity if you are in love with one.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There are many types of love of course. Some of us already love our computers as we might love a treasured slide rule or sports car. It is not hard to imagine loving a computer as we love a pet: a&amp;nbsp;condescending&amp;nbsp;love of unequals. It is&amp;nbsp;conceivable&amp;nbsp;that we could love one as we love a colleague possessed of great insight and ability. But could we love a computer as we love a friend, a child, or a partner? If a computer were both lovable and orders or magnitude superior to us, would we not love them as gods? Each of these represents a different level of acceptance of the singularity and they represent increasing levels of disruption.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It is argued that a great disparity between human and machine will not arise because humans will be augmenting their own capabilities to match those of the artificial&amp;nbsp;intelligences, and for the individual this may be viable, but no man is an island. For instance, a good marriage depends on growing together, but if your wife suddenly became a million times smarter than you, it&#39;s a good bet you would struggle with pillow talk. So do you only &quot;upgrade&quot; together? What about your children and your friends? These are complicated questions that could cause real pain during the constant revolution the singularity promises, but without love at the heart of it, it would truly be post-human.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;i&gt;If I speak in the tongues of men or of angels, but do not have love, I am only a resounding gong or a clanging cymbal. If I have the gift of prophecy and can fathom all mysteries and all knowledge, and if I have a faith that can move mountains, but do not have love, I am nothing. If I give all I possess to the poor and give over my body to hardship that I may boast, but do not have love, I gain nothing.&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/8514783698226965626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/8514783698226965626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8514783698226965626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8514783698226965626'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2013/03/love-and-singularity.html' title='Love and the Singularity'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-85372730319245807</id><published>2012-03-23T11:26:00.000+00:00</published><updated>2012-03-23T11:26:43.470+00:00</updated><title type='text'>Android Emulation on x86 Machines</title><content type='html'>It was news to me that Android doesn&#39;t just work on ARM processors, but apparently it has been running on x86 machines &lt;a href=&quot;http://software.intel.com/en-us/articles/alternate-method-installing-the-intel-atom-android-x86-emulator-image-manually/&quot;&gt;for a while&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://software.intel.com/en-us/articles/alternate-method-installing-the-intel-atom-android-x86-emulator-image-manually/&quot;&gt;Now&lt;/a&gt; thanks to some wizardry from Intel, the performance has been significantly improved by taking advantage of &lt;a href=&quot;http://en.wikipedia.org/wiki/X86_virtualization&quot;&gt;virtualization&lt;/a&gt;.

Although x86-based Android devices aren&#39;t going to take over the world anytime soon, this does mean that we now have a viable Android emulator to use on the desktop.&lt;br /&gt;
&lt;h2&gt;

&lt;b&gt;Installation&lt;/b&gt;&lt;/h2&gt;
The instructions are &lt;a href=&quot;http://developer.android.com/guide/developing/devices/emulator.html#accel-vm&quot;&gt;here&lt;/a&gt; and I suggest you &lt;i&gt;follow them all&lt;/i&gt;. The only sticking point is if your machine supports Virtualization Technology or not. You can find that out by &lt;a href=&quot;http://ark.intel.com/VTList.aspx&quot;&gt;checking Intel&#39;s list&lt;/a&gt; or running their &lt;a href=&quot;http://downloadcenter.intel.com/Detail_Desc.aspx?ProductID=1881&amp;amp;DwnldID=7838&quot;&gt;processor information tool&lt;/a&gt;. Even my budget ACER i3 laptop has it:

&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivDNDK7h8yfN6c0FogRZloP0aVpebAaDT1PNVFP8fbPLB0G9yndWtWCNVwra3uuNZGD7A-hKE-s4zTPU_ixevkJiIZR91qxFmU4gi4h0k_nc9aVRIb5RNilNld7dBpz8SQkaD6Cg/s1600/Intel.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;314&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivDNDK7h8yfN6c0FogRZloP0aVpebAaDT1PNVFP8fbPLB0G9yndWtWCNVwra3uuNZGD7A-hKE-s4zTPU_ixevkJiIZR91qxFmU4gi4h0k_nc9aVRIb5RNilNld7dBpz8SQkaD6Cg/s400/Intel.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Then you need to run the Android SDK Manager and download version 17 of Android SDK Tools and the x86 system image:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI6K6USTuDv3xYOrTCf9_kHQ848yStjvINHnuDIhtX4xXCJYTsWZ3EOJQ1l77lXPsOSZMRFOh_u2Fx4IWW55HZZzp2u3vsjUC0AByrnQaLFdkgadZfE14s0-5Gg2LZ3ffcMcArDQ/s1600/SDK.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;264&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI6K6USTuDv3xYOrTCf9_kHQ848yStjvINHnuDIhtX4xXCJYTsWZ3EOJQ1l77lXPsOSZMRFOh_u2Fx4IWW55HZZzp2u3vsjUC0AByrnQaLFdkgadZfE14s0-5Gg2LZ3ffcMcArDQ/s320/SDK.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
One limitation is that the only AVD image available at the moment is for Android 2.3.3, but (depressingly perhaps) that covers &lt;a href=&quot;http://developer.android.com/resources/dashboard/platform-versions.html&quot;&gt;95% the devices out there&lt;/a&gt;. There is also an Intel configuration tool (in the Extras section) that you must install and run (see the &lt;a href=&quot;http://developer.android.com/guide/developing/devices/emulator.html#vm-windows&quot;&gt;aforementioned instructions&lt;/a&gt;). Note that the virtualization manager is memory hungry (I recommend a 2GB allocation), but RAM is so cheap that maxing out my laptop to 8GB only cost about £30 (it&#39;s the best investment you can make).&lt;br /&gt;
&lt;br /&gt;
When you next open Android AVD Manager, you should be able to create a new x86-based VM:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn_T0Zh8XRv4KUQPcIE2qMYKggSMAmV6EFSy8_tUPaE-PDUHNN9hZNxuuYSHncyQ1EJy5EKRhmAvYvWYtvP6hmCTFVkW0Y-Th4EX5e6dzDIkbPfdYARrbqUIY-VMq0XBM5XYVcPw/s1600/AVD.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn_T0Zh8XRv4KUQPcIE2qMYKggSMAmV6EFSy8_tUPaE-PDUHNN9hZNxuuYSHncyQ1EJy5EKRhmAvYvWYtvP6hmCTFVkW0Y-Th4EX5e6dzDIkbPfdYARrbqUIY-VMq0XBM5XYVcPw/s320/AVD.png&quot; width=&quot;234&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Configure to your hearts content and launch...&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTrOjDyE8psE6nIsNfpKNf0QGjYgFxuy4cMlveKgOTpk7Dp4LIC2OIibjvgDjf-xDsbtNAmN2J7MsTVn551hWkyAdJAW2Z8ppCXVfwZk2ogaULubTYH9UVc5z8EIEIbDWTTKSqA/s1600/Emulator.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTrOjDyE8psE6nIsNfpKNf0QGjYgFxuy4cMlveKgOTpk7Dp4LIC2OIibjvgDjf-xDsbtNAmN2J7MsTVn551hWkyAdJAW2Z8ppCXVfwZk2ogaULubTYH9UVc5z8EIEIbDWTTKSqA/s320/Emulator.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You should find it a much faster experience than the ARM emulator and identical for Java-based applications. I&#39;m not sure if NDK applications would work the same - comments welcome!&lt;br /&gt;
&lt;br /&gt;
The possibility of developing applications completely on one machine really lowers the barrier to entry.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/85372730319245807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/85372730319245807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/85372730319245807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/85372730319245807'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2012/03/android-emulation-on-x86-machines.html' title='Android Emulation on x86 Machines'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivDNDK7h8yfN6c0FogRZloP0aVpebAaDT1PNVFP8fbPLB0G9yndWtWCNVwra3uuNZGD7A-hKE-s4zTPU_ixevkJiIZR91qxFmU4gi4h0k_nc9aVRIb5RNilNld7dBpz8SQkaD6Cg/s72-c/Intel.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-2190656196197224341</id><published>2011-11-29T11:22:00.001+00:00</published><updated>2011-11-29T12:32:21.657+00:00</updated><title type='text'>Android Permissions - Protection Levels</title><content type='html'>&lt;p&gt;Android applications declare the permissions they are likely to require in their manifest (a short file that describes the contents of the &#39;package&#39;). This allows the system to sandbox them from critical resources and gives the user some indication of what havoc they might reap. That&#39;s the theory at least, but the first time I installed an application and read the permissions page I had no idea what they were on about! Clearly this system needs to be changed, but that is not what I want to talk about today.
&lt;/p&gt;
&lt;p&gt;
As an application writer I need to know the &lt;a href=&quot;http://developer.android.com/reference/android/R.styleable.html#AndroidManifestPermission_protectionLevel&quot;&gt;protection level&lt;/a&gt; of these permissions, i.e. which of these permissions are &lt;b&gt;normal&lt;/b&gt; (can cause the user no real harm), &lt;b&gt;dangerous&lt;/b&gt; (might require a greater level of trust, such as the ability to read SMS messages), &lt;b&gt;signature&lt;/b&gt; (only granted to applications that are signed by the people who built the OS), &lt;b&gt;signatureOrSystem&lt;/b&gt; (like signature, but also allowed if they have been pre-installed in a system folder). I was surprised to find no easy reference for this &lt;a href=&quot;http://developer.android.com/reference/android/Manifest.permission.html&quot;&gt;in the documentation&lt;/a&gt;, but I did find the relevant information &lt;a href=&quot;http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/res/AndroidManifest.xml&quot;&gt;in the source&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
You can of course probe the android package itself for this information, which is useful if you don&#39;t have access to the particular version of Android you are running. Here is some code that does just that:
&lt;/p&gt;
&lt;div align=&quot;left&quot; class=&quot;java&quot; style=&quot;font-size: 100%;&quot;&gt;
&lt;table bgcolor=&quot;#ffffff&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;
   &lt;tbody&gt;
&lt;tr&gt;
   &lt;td align=&quot;left&quot; nowrap=&quot;nowrap&quot; valign=&quot;top&quot;&gt;&lt;code&gt;
&lt;span style=&quot;color: #3f7f5f;&quot;&gt;//&amp;nbsp;Get&amp;nbsp;the&amp;nbsp;permissions&amp;nbsp;for&amp;nbsp;the&amp;nbsp;core&amp;nbsp;android&amp;nbsp;package&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;PackageInfo&amp;nbsp;packageInfo&amp;nbsp;=&amp;nbsp;getPackageManager&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;.getPackageInfo&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;android&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;,&amp;nbsp;PackageManager.GET_PERMISSIONS&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;packageInfo.permissions&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;//&amp;nbsp;For&amp;nbsp;each&amp;nbsp;defined&amp;nbsp;permission&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;for&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;PermissionInfo&amp;nbsp;permission&amp;nbsp;:&amp;nbsp;packageInfo.permissions&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;//&amp;nbsp;Dump&amp;nbsp;permission&amp;nbsp;info&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;String&amp;nbsp;protectionLevel;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;permission.protectionLevel&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;case&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;PermissionInfo.PROTECTION_NORMAL&amp;nbsp;:&amp;nbsp;protectionLevel&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;normal&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;case&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;PermissionInfo.PROTECTION_DANGEROUS&amp;nbsp;:&amp;nbsp;protectionLevel&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;dangerous&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;case&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;PermissionInfo.PROTECTION_SIGNATURE&amp;nbsp;:&amp;nbsp;protectionLevel&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;signature&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;case&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM&amp;nbsp;:&amp;nbsp;protectionLevel&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;signatureOrSystem&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;default&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;:&amp;nbsp;protectionLevel&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&amp;lt;unknown&amp;gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;Log.i&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;PermissionCheck&quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;,&amp;nbsp;permission.name&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&amp;nbsp;&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;+&amp;nbsp;protectionLevel&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: white;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt;
&lt;/span&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  
   &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;
...and here are the results in case you need to know them at a glance...
&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th style=&quot;text-align:left;&quot;&gt;Permission&lt;/th&gt;&lt;th style=&quot;text-align:left;&quot;&gt;Protection Level&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_CACHE_FILESYSTEM&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_CHECKIN_PROPERTIES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_COARSE_LOCATION&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_FINE_LOCATION&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_LOCATION_EXTRA_COMMANDS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_MOCK_LOCATION&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_NETWORK_STATE&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_SURFACE_FLINGER&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCESS_WIFI_STATE&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ACCOUNT_MANAGER&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ASEC_ACCESS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ASEC_CREATE&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ASEC_DESTROY&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ASEC_MOUNT_UNMOUNT&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.ASEC_RENAME&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.AUTHENTICATE_ACCOUNTS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BACKUP&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BATTERY_STATS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BIND_APPWIDGET&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BIND_DEVICE_ADMIN&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BIND_INPUT_METHOD&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BIND_WALLPAPER&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BLUETOOTH&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BLUETOOTH_ADMIN&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BRICK&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BROADCAST_PACKAGE_REMOVED&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BROADCAST_SMS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BROADCAST_STICKY&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.BROADCAST_WAP_PUSH&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CALL_PHONE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CALL_PRIVILEGED&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CAMERA&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_BACKGROUND_DATA_SETTING&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_COMPONENT_ENABLED_STATE&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_CONFIGURATION&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_NETWORK_STATE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_WIFI_MULTICAST_STATE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CHANGE_WIFI_STATE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CLEAR_APP_CACHE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CLEAR_APP_USER_DATA&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.CONTROL_LOCATION_UPDATES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.COPY_PROTECTED_DATA&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DELETE_CACHE_FILES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DELETE_PACKAGES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DEVICE_POWER&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DIAGNOSTIC&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DISABLE_KEYGUARD&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.DUMP&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.EXPAND_STATUS_BAR&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.FACTORY_TEST&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.FLASHLIGHT&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.FORCE_BACK&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.FORCE_STOP_PACKAGES&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.GET_ACCOUNTS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.GET_PACKAGE_SIZE&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.GET_TASKS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.GLOBAL_SEARCH&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.GLOBAL_SEARCH_CONTROL&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.HARDWARE_TEST&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.INJECT_EVENTS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.INSTALL_LOCATION_PROVIDER&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.INSTALL_PACKAGES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.INTERNAL_SYSTEM_WINDOW&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.INTERNET&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.KILL_BACKGROUND_PROCESSES&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MANAGE_ACCOUNTS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MANAGE_APP_TOKENS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MASTER_CLEAR&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MODIFY_AUDIO_SETTINGS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MODIFY_PHONE_STATE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MOUNT_FORMAT_FILESYSTEMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MOUNT_UNMOUNT_FILESYSTEMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.MOVE_PACKAGE&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.PACKAGE_USAGE_STATS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.PERFORM_CDMA_PROVISIONING&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.PERSISTENT_ACTIVITY&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.PROCESS_OUTGOING_CALLS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_CALENDAR&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_CONTACTS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_FRAME_BUFFER&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_INPUT_STATE&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_LOGS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_OWNER_DATA&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_PHONE_STATE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_SMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_SYNC_SETTINGS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_SYNC_STATS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.READ_USER_DICTIONARY&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.REBOOT&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RECEIVE_BOOT_COMPLETED&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RECEIVE_MMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RECEIVE_SMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RECEIVE_WAP_PUSH&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RECORD_AUDIO&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.REORDER_TASKS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.RESTART_PACKAGES&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SEND_SMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_ACTIVITY_WATCHER&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_ALWAYS_FINISH&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_ANIMATION_SCALE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_DEBUG_APP&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_ORIENTATION&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_PREFERRED_APPLICATIONS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_PROCESS_LIMIT&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_TIME&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_TIME_ZONE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_WALLPAPER&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_WALLPAPER_COMPONENT&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SET_WALLPAPER_HINTS&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SHUTDOWN&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SIGNAL_PERSISTENT_PROCESSES&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.STATUS_BAR&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.STOP_APP_SWITCHES&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SUBSCRIBED_FEEDS_READ&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SUBSCRIBED_FEEDS_WRITE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.SYSTEM_ALERT_WINDOW&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.UPDATE_DEVICE_STATS&lt;/td&gt;&lt;td&gt;signature&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.USE_CREDENTIALS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.VIBRATE&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WAKE_LOCK&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_APN_SETTINGS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_CALENDAR&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_CONTACTS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_EXTERNAL_STORAGE&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_GSERVICES&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_OWNER_DATA&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_SECURE_SETTINGS&lt;/td&gt;&lt;td&gt;signatureOrSystem&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_SETTINGS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_SMS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_SYNC_SETTINGS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;android.permission.WRITE_USER_DICTIONARY&lt;/td&gt;&lt;td&gt;normal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;com.android.browser.permission.READ_HISTORY_BOOKMARKS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;com.android.browser.permission.WRITE_HISTORY_BOOKMARKS&lt;/td&gt;&lt;td&gt;dangerous&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/2190656196197224341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/2190656196197224341' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2190656196197224341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2190656196197224341'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/11/android-permissions-protection-levels.html' title='Android Permissions - Protection Levels'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-400166069812905174</id><published>2011-06-30T13:24:00.005+01:00</published><updated>2011-09-09T15:05:52.537+01:00</updated><title type='text'>Cloud Production</title><content type='html'>&lt;a href=&quot;http://www.etsy.com/listing/61272731/miniature-cloud-factory&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img style=&quot;float:right; margin:0 0px 10px 10px;cursor:pointer; cursor:hand;width: 310px; height: 310px;&quot; src=&quot;http://ny-image2.etsy.com/il_570xN.183507402.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;I&#39;ve always been fascinated by &lt;a href=&quot;http://en.wikipedia.org/wiki/3D_printing&quot;&gt;3D printers&lt;/a&gt; and recently ordered one from the &lt;a href=&quot;http://www.indiegogo.com/eMAKER-Huxley-3D-printer-kits&quot;&gt;crowd-funded Huxley project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This project has raised far more than the initial expectation, and has forced the company &lt;a href=&quot;http://www.emakershop.com/&quot;&gt;that runs it&lt;/a&gt; to increase it&#39;s production capabilities by an order of magnitude. Now because these printers can print parts for themselves, &lt;a href=&quot;http://www.emakershop.com/blog/emaker-huxley-crowd-funding-success&quot;&gt;eMaker are reaching out&lt;/a&gt; to other 3D printer owners to help them cope with the demand.&lt;br /&gt;&lt;br /&gt;Imagine a future where you order something online and rather than coming from a local warehouse it is &lt;b&gt;manufactured&lt;/b&gt; in a local facility that can make anything. As long as the quality is acceptable you don&#39;t have to know or care where it came from. The benefits of this from a production and supply chain point of view are enormous and efficiencies in the supply chain would mean cheaper goods for consumers. Couple this with the environmental benefits (less transportation and waste) and you have a game-changing technology: &lt;b&gt;Cloud Production&lt;/b&gt;.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/400166069812905174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/400166069812905174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/400166069812905174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/400166069812905174'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/06/cloud-production.html' title='Cloud Production'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-5529270486229960260</id><published>2011-05-27T14:42:00.003+01:00</published><updated>2011-05-27T15:31:07.698+01:00</updated><title type='text'>Passpack - Online password management</title><content type='html'>Did I bore you about Passpack yet? If not read on...&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 51px;&quot; src=&quot;https://static.passpack.com/images/logo.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Passpack is a website that manages your passwords and other login details. It is simple to use and allows you to share passwords with colleagues and family members.&lt;br /&gt;&lt;br /&gt;For instance, if you add a link to the login page for the site, it will auto-complete the login fields (using a &lt;a href=&quot;http://en.wikipedia.org/wiki/Bookmarklet&quot;&gt;bookmarklet&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I can also recommend the automatic password generation, which helps you avoid &lt;a href=&quot;http://xkcd.com/792/&quot;&gt;principal danger of password reuse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It has a neat system whereby the passwords are decrypted locally in the browser using your security pass-phrase. This means that even the Passpack folks can&#39;t see your passwords. Of course this means you should keep you pass-phrase written down somewhere - I recommend keeping it with your will :-)&lt;br /&gt;&lt;br /&gt;For extra simplicity, you can login with your ID from Google, Facebook, Twitter, or and OpenID provider. This doesn&#39;t help with the pass-phrase, but it stops you needing two passwords: one to login and one to decrypt your data.&lt;br /&gt;&lt;br /&gt;Until true &lt;a href=&quot;http://en.wikipedia.org/wiki/Single_sign-on&quot;&gt;SSO&lt;/a&gt; is a reality, this makes identity management much simpler.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/5529270486229960260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/5529270486229960260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5529270486229960260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5529270486229960260'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/05/passpack-online-password-management.html' title='Passpack - Online password management'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-6251609929547202557</id><published>2011-05-05T11:48:00.004+01:00</published><updated>2011-05-05T11:52:48.518+01:00</updated><title type='text'>ShareSafe.TV</title><content type='html'>I often want to share YouTube videos with my kids, but they are surrounded by links to other videos, which can often be unsuitable. &lt;a href=&quot;http://www.safeshare.tv/&quot;&gt;ShareSafe.TV&lt;/a&gt; displays only the video you want to show and nothing else. Use their link generator or just add v/&amp;lt;video id&amp;gt; to the end of their URL.&lt;br /&gt;&lt;br /&gt;Here is an example: &lt;a href=&quot;http://www.safeshare.tv/v/YXM3wrIhcwY&quot;&gt;http://www.safeshare.tv/v/YXM3wrIhcwY&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/6251609929547202557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/6251609929547202557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/6251609929547202557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/6251609929547202557'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/05/sharesafetv.html' title='ShareSafe.TV'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-1487375792282119934</id><published>2011-04-20T10:44:00.015+01:00</published><updated>2011-04-22T12:35:41.811+01:00</updated><title type='text'>MSTest and 64bit</title><content type='html'>This post is about running MSTest for applications that target mixed platforms.&lt;br /&gt;&lt;br /&gt;If you are lucky enough to be able to write your applications in pure .NET, then you may never encounter 32bit/64bit platform issues. However, if any dependent library or plug-in is compiled for a specific architecture, then your whole application must be run in that mode. This is why the default Window&#39;s Internet Explorer is still 32bit despite the 64bit version shipping since Vista: it has to be the same architecture as any legacy plug-ins. By contrast, Notepad doesn&#39;t have any plug-ins, so it can get away with being 64bit only.&lt;br /&gt;&lt;br /&gt;My companies applications rely on many native libraries, which are obviously compiled for specific architectures (x86 and x64). Deploying an application for multiple target processors is a complex subject in itself that can be solved with a range of strategies from dynamic library linking to processor-specific installers, but however you deploy, your application will behave differently in these two different modes so they must both be tested.&lt;br /&gt;&lt;br /&gt;For better or for worse, we use MSTest to control application quality. Since the release of Visual Studio 2010 this has been able to &lt;a href=&quot;http://blogs.msdn.com/b/lkruger/archive/2009/06/08/visual-studio-team-test-load-agent-goes-64-bit.aspx&quot;&gt;run in 64-bit mode&lt;/a&gt; as well as 32-bit mode, but there are certain subtleties that complicate the practical aspects of administering your tests.&lt;br /&gt;&lt;br /&gt;To understand the problem, consider the way MSTest works: Testing is done using two programs &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms182489.aspx&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest.exe&lt;/span&gt;&lt;/a&gt; and &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent32.exe&lt;/span&gt;. &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; is told what assemblies to load and it scans those assemblies (using reflection) to find any classes and methods annotated as tests using the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.testclassattribute.aspx&quot;&gt;various test attributes&lt;/a&gt;. To do this it must be able to load the assembly and all its dependent assemblies and because &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; is a 32bit process, none of these assemblies can be exclusively 64bit. Once loaded, &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; instructs &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent32&lt;/span&gt; to run these tests, which means &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent32&lt;/span&gt; must load the assemblies itself and execute the test methods, but because it is also a 32bit process it cannot load 64bit assemblies either.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Visual Studio 2010 a new version of &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent32&lt;/span&gt; was added called &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent.exe&lt;/span&gt;, which can run 64bit assemblies. This means that even though &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; is still 32bit, &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent&lt;/span&gt; can execute in full 64bit mode so that pure .NET assemblies can now be tested in 32bit and 64bit mode. However, it still doesn&#39;t easily allow applications with mixed-mode assemblies to be tested in 64bit mode because they cannot be loaded by MSTest in the first place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One interesting solution to this is to &lt;a href=&quot;http://blogs.msdn.com/b/danielvl/archive/2009/03/28/run-mstest-exe-as-native-64-bit-process.aspx&quot;&gt;force MSTest.exe to be a 64bit application&lt;/a&gt;. This implies that &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; is actually pure .NET code anyway, but has been forced to run in x86 mode. If you are going down this road, note that &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; relies on various registry entries (&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:small;font-family: &#39;courier new&#39;; &quot;&gt;HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\EnterpriseTools\QualityTools\TestType&lt;/span&gt; and &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size:small;font-family: &#39;courier new&#39;; &quot;&gt;HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\Licenses&lt;/span&gt;) to decide which extensions it can handle and what features are licensed for use, and that these are installed by default to the &lt;a href=&quot;http://en.wikipedia.org/wiki/WoW64&quot;&gt;WOW6432Node registry &quot;shadow&quot; branch&lt;/a&gt;. To run in 64bit mode you must &lt;a href=&quot;http://blog.foxxtrot.net/2010/02/hacking-mstest-out-of-visual-studio.html&quot;&gt;copy some of the registry entries&lt;/a&gt; over as well as editing the binaries themselves.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is an alternative approach that doesn&#39;t involve editing executable files and local machine registry settings (which can be a pain across a large development team). Our application builds for two distinct platform targets x86 and x64 (note however that most assemblies are compiled as &quot;Any CPU&quot; except the ones that contain native code) and test projects are only built in the x86 solution configuration. This ensures that the code in their bin folder is 32bit compatible, and they can therefore be loaded into &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt;. Also, the tests are configured to run against the binaries in the actual application deployment folder rather than running in their binary folder using the new root folder feature of Visual Studio 2010:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbwO4jhhpPp5FP8R-_z3Gg9omgxLf2dFZ4q2zmBNOM3bBeoD88HH18U-jjuYZhsQ6iRdAoJ_1s0gpIRjRzroEhRA2xZPdKF3uaJK0TtVgnXD3Jog5NaW4El3vhjjfSrjK6-P3mw/s1600/VSRootFolder.png&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbwO4jhhpPp5FP8R-_z3Gg9omgxLf2dFZ4q2zmBNOM3bBeoD88HH18U-jjuYZhsQ6iRdAoJ_1s0gpIRjRzroEhRA2xZPdKF3uaJK0TtVgnXD3Jog5NaW4El3vhjjfSrjK6-P3mw/s400/VSRootFolder.png&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5598356499335537906&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;In this case we have used an environment variable that signifies where to find the deployed binaries. Whether you do this or not, it seems to always want a full path for one reason or another, which can make supporting multiple development environments a challenge.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We make one of these test configurations for each target platform, remembering to change the Hosts section that controls 32bit and 64bit execution. Then we can run both configurations from the command line like this:&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;font-size:small;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;mstest /testsettings:WorkStation32.testrunconfig /testmetadata:SOLUTION&lt;solution&gt;.vsmdi&lt;/solution&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;font-size:small;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;mstest /testsettings:WorkStation64.testrunconfig /testmetadata:&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;SOLUTION&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;.vsmdi&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The trick here is that in both cases &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; will load the 32bit binaries to decide what tests to run, but the different configuration files will control if &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent32&lt;/span&gt; or &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;QTAgent&lt;/span&gt; is used. Note that this cannot work with the &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;/noisolation&lt;/span&gt; switch, because &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;courier new&#39;; &quot;&gt;MSTest&lt;/span&gt; cannot host the 64bit binaries.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The disadvantage of running your unit tests against the deployment folder is that your tests are less &quot;clean&quot; and test failures could take longer to diagnose. The advantage is that the tests are being run on code as it will appear in the wild, which can include complex deployment features such as assembly obfuscation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This system will work on development desktops and build servers. It may give the Visual Studio IDE pause for thought occasionally, but it is fundamentally compatible, which is one of the only real advantages of MSTest in the first place.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/1487375792282119934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/1487375792282119934' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/1487375792282119934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/1487375792282119934'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/04/mstest-and-64bit.html' title='MSTest and 64bit'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxbwO4jhhpPp5FP8R-_z3Gg9omgxLf2dFZ4q2zmBNOM3bBeoD88HH18U-jjuYZhsQ6iRdAoJ_1s0gpIRjRzroEhRA2xZPdKF3uaJK0TtVgnXD3Jog5NaW4El3vhjjfSrjK6-P3mw/s72-c/VSRootFolder.png" height="72" width="72"/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-5366091363625501423</id><published>2011-02-18T12:20:00.002+00:00</published><updated>2011-02-18T12:23:25.992+00:00</updated><title type='text'>IBM Watson plays Jeopardy</title><content type='html'>This really changes everything: &lt;a href=&quot;http://www.viddler.com/explore/engadget/videos/2393/&quot;&gt;http://www.viddler.com/explore/engadget/videos/2393/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The most amazing computer demonstration I have ever seen.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/5366091363625501423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/5366091363625501423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5366091363625501423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5366091363625501423'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2011/02/ibm-watson-plays-jeopardy.html' title='IBM Watson plays Jeopardy'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-3982492155828011078</id><published>2010-05-12T14:47:00.003+01:00</published><updated>2010-05-12T14:55:13.474+01:00</updated><title type='text'>Microsoft&#39;s Click-to-Run and Office Automation</title><content type='html'>Today&#39;s lesson: When Office is installed using &lt;a href=&quot;http://blogs.technet.com/office2010/archive/2009/11/06/click-to-run-delivering-office-in-the-21st-century.aspx&quot;&gt;Click-to-Run&lt;/a&gt;, it doesn&#39;t support automation.&lt;br /&gt;&lt;br /&gt;We use Excel automation via C# in our application, and when testing against the new versions of Office we hit a bump in the road. &lt;a href=&quot;http://www.microsoft.com/office/2010/en/home-business-edition/default.aspx&quot;&gt;Office Home and Business 2010&lt;/a&gt; typically installs via Click-to-Run, which is designed to have a small footprint, and as such does not register itself for programmatic automation.&lt;br /&gt;&lt;br /&gt;So when you hear this sound: &lt;i&gt;&quot;Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80040154&quot;&lt;/i&gt; even though Excel is apparently installed, you probably have this issue.&lt;br /&gt;&lt;br /&gt;More here about &lt;a href=&quot;http://support.microsoft.com/kb/292491&quot;&gt;Excel automation and the expected registry keys&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://social.technet.microsoft.com/Forums/en/office2010/thread/1b8dc35b-c5e4-49b0-bf61-a0402898317d&quot;&gt;It is suggested&lt;/a&gt; that there will be an alternative MSI-based installer that presumably will not have this problem.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/3982492155828011078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/3982492155828011078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3982492155828011078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3982492155828011078'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2010/05/microsofts-click-to-run-and-office.html' title='Microsoft&#39;s Click-to-Run and Office Automation'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-2287615007892758303</id><published>2010-02-24T09:58:00.002+00:00</published><updated>2010-02-24T10:00:27.229+00:00</updated><title type='text'>Vertical Alignment in CSS</title><content type='html'>I know I should use CSS, but sometimes I fall off the wagon and use tables instead. This usually happens when I want to vertically align content. Here are some very clear hints and tips about vertical alignment that may help me kick the habit: &lt;a href=&quot;http://phrogz.net/CSS/vertical-align/index.html&quot;&gt;http://phrogz.net/CSS/vertical-align/index.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/2287615007892758303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/2287615007892758303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2287615007892758303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2287615007892758303'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2010/02/vertical-alignment-in-css.html' title='Vertical Alignment in CSS'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-3870136469758298555</id><published>2010-01-03T20:31:00.003+00:00</published><updated>2010-01-03T20:37:03.198+00:00</updated><title type='text'>Content Delivery Networks</title><content type='html'>&lt;p&gt;My company has a very specific requirement: we need to get our application to any desktop in the world in less than three minutes. There are business drivers for this that I shall not go into; basically it is so that potential customers don’t get bored waiting for our application to install and run. We are currently failing to do that for all users, and we suspect we are losing customers because we fall at the first fence. &lt;/p&gt;  &lt;h3&gt;The Problem is Discovered&lt;/h3&gt;  &lt;p&gt;Our installer is about 50MB, which is not huge, but we have been seeing an enormous variation in deployment times to various parts of the world. Currently we use a UK-based hosting service with high symmetric bandwidth, but routine log analysis revealed that the install times for some users exceeded 10 minutes, and many did not complete. A quick web search revealed that this is a well known problem, so well known in fact that there are many commercial solutions that come under the generic title of &lt;a href=&quot;http://en.wikipedia.org/wiki/Content_delivery_network&quot;&gt;Content Delivery Networks&lt;/a&gt; (CDNs). The big players are companies like &lt;a href=&quot;http://www.akamai.com&quot;&gt;Akami&lt;/a&gt; and &lt;a href=&quot;http://limelightnetworks.com&quot;&gt;Limelight&lt;/a&gt;, but I am allergic to companies that won’t tell you the price, and I suspect our needs are too modest to be worth their while addressing. There is however a new class of companies like &lt;a href=&quot;http://www.gogrid.com/&quot;&gt;GoGrid&lt;/a&gt; emerging and there are established hosting players like Amazon (with &lt;a href=&quot;http://aws.amazon.com/cloudfront/&quot;&gt;CloudFront&lt;/a&gt;) and Rackspace (using &lt;a href=&quot;http://www.rackspacecloud.com/cloud_hosting_products/files&quot;&gt;Limelights CDN network&lt;/a&gt;) who are offering CDNs. The new-kid-on-the-block is Microsoft, who beta-launched the &lt;a href=&quot;http://blogs.msdn.com/windowsazure/archive/2009/11/05/introducing-the-windows-azure-content-delivery-network.aspx&quot;&gt;Azure CDN&lt;/a&gt; solution just as my investigations began.&lt;/p&gt;  &lt;p&gt;CDN, like all hosting, is a highly commodified product. There are certainly modest differences in terms of things like upload flexibility (Azure stinks), clever torrent links (Amazon S3 rocks), and general UI friendliness, but there were no showstoppers. The only really important metrics are speed, reliability, and cost. Cost was easy, everyone who didn’t make it clear on their website in the first two minutes was discarded (are you starting to understand our business drivers now?), and the remaining companies were all so cheap that it wasn’t worth worrying about. This is because we are talking about a very small amount of data 50MB x 100 installs per month = 5GB and the pricing is never more than about 25 cents per GB. These businesses are built for large streaming media and Flash media files, not for tiny desktop installers like ours.&lt;/p&gt;  &lt;p&gt;Reliability next: we are not particularly concerned about reliability given that we are statistically unlikely to lose enough business in the difference between four nines and five nines to make it worth basing a decision on. Everybody can do four nines.&lt;/p&gt;  &lt;p&gt;So that left speed, which comes in two flavors: latency and bandwidth. Latency is critical for that snappy website that puts your shop window in front of the customer in less than a few seconds (which is sometimes all you have). Incidentally, I didn’t come across any CDN webhosts, particularly ones that support ASP.NET, but you have to imagine it is coming from Azure. In our case, bandwidth was going to dominate so that is what we needed to know about.&lt;/p&gt;  &lt;p&gt;During my research, I came across &lt;a href=&quot;http://ryankearney.com/2009/12/comparing-cdn-performance&quot;&gt;Ryan Kearney’s comparison&lt;/a&gt; of CDN providers. He gives a great round-up of the price and features of many of the providers, as well as some latency statistics for a handful of international locations. He was kind enough to host a file for my test rig on his Rackspace account, which was much appreciated.&lt;/p&gt;  &lt;p&gt;So there are plenty of CDN providers, but very little information available to allow you to compare them. For instance, India and China are two very important markets for us, but what is the bandwidth to them from each of the providers? Clearly we needed to do some measurements.&lt;/p&gt;  &lt;h3&gt;The Game is Afoot&lt;/h3&gt;  &lt;p&gt;How do you measure the bandwidth of a host to every country in the world? Well, there are many companies that offer website monitoring and will alert you if your website goes down, some of these have international monitoring capabilities, and some of them have page download time statistics. However, to get an accurate picture of download speeds you need a fairly sizable file so that the bandwidth lag dominates other factors such as DNS resolution or server latency. Only one web monitoring service actually downloaded the whole file, allowing us to make an accurate estimate of bandwidth. They are &lt;a href=&quot;http://www.websitepulse.com&quot;&gt;WebSitePulse&lt;/a&gt;, and I could not have done this analysis without them. They have the most monitoring stations in the world, the most detailed statistics, and a 30 day free trial, which I used for this investigation. I highly recommend them to anyone looking for sophisticated, international, web site monitoring.&lt;/p&gt;  &lt;p&gt;We created a test file called &lt;a href=&quot;http://OvertureOnline.com/Data/SpeedTest/Test1MB.zip&quot; rel=&quot;nofollow&quot;&gt;Test1MB.zip&lt;/a&gt;, which was a zip file that was truncated to exactly 1MB. A zip file is largely incompressible and the extension stops most servers from trying (actually few offer HTTP compression, which is a serious omission but beyond the scope of this post). This was mounted on multiple hosts and WebSitePulse was configured to download the files periodically. The WebSitePulse trial limits you to 20 monitor stations at a time (and excludes Auckland and Melbourne), and I didn’t have access to all of the hosts from the beginning, so the statistics are not done to laboratory standards. However, the statistical picture that emerges is reliable enough to allow business decisions to be made.&lt;/p&gt;  &lt;h3&gt;The Runners and Riders&lt;/h3&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;strong&gt;Host&lt;/strong&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;&lt;strong&gt;CDN Capable&lt;/strong&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;100%&quot;&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;http://www.rapidswitch.com/&quot;&gt;RapidSwitch&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;No&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Our current host and representative of good quality hosting in the UK.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/windowsazure/archive/2009/11/05/introducing-the-windows-azure-content-delivery-network.aspx&quot;&gt;Azure CDN&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Yes&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Still in beta, and we literally started using it the day it opened, so there were teething problems. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot; top?=&quot; top??=&quot;top??&quot;&gt;&lt;a href=&quot;http://www.rackspace.com&quot;&gt;Rackspace&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Yes&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Huge player in hosting and cloud computing.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;http://aws.amazon.com/cloudfront/&quot;&gt;Amazon CloudFront&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Yes&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;CDN at the front, Amazon’s S3 at the back. Nominally still in beta, but frankly charging for something means you must be judged as a commercial product.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;http://aws.amazon.com/s3/&quot;&gt;Amazon S3&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;No&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Our S3 hosting is in the US, so this is the standard candle for US-based cloud hosting.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot;&gt;&lt;a href=&quot;http://www.gogrid.com/content-delivery-network/&quot;&gt;GoGrid CDN&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;Yes&lt;/td&gt;        &lt;td valign=&quot;top&quot;&gt;A high number of international points-of-presence, and more on the way.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Very few of the CDN companies offer free trials for some reason, but I think all are pay-as-you-go, which costs pennies for what we want. It took a bit of back-and-forth to get my GoGrid account set up, but their &lt;a href=&quot;http://twitter.com/GoGrid&quot;&gt;Twitter guy&lt;/a&gt; was great at fixing the problem once I made him aware of it. This meant that there are slightly less results for GoGrid. The whole trial ran for the best part of a month with roughly 15 minute poll times for every host. I had to change things around a bit as I went along to stay within the T&amp;amp;C’s of the WebSitePulse trial – you get $1000 to play with in total.&lt;/p&gt;  &lt;p&gt;The following locations were monitored: Amsterdam, Bangalore, Beijing (2 monitors), Boston, Brisbane, Buenos Aires, Chicago, Dusseldorf, Guangzhou, Hong Kong, Houston, London, Los Angeles, Miami, Montreal, Mumbai, Munich, New York, Paris, San Francisco, Sao Paulo, Seattle, Shanghai, Singapore, Stockholm, Sydney (2 monitors), Tokyo, Toronto, Trumbull, Vancouver, Washington&lt;/p&gt;  &lt;h3&gt;The Results&lt;/h3&gt;  &lt;p&gt;The summary of the results is shown below:&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;456&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;&lt;strong&gt;Host&lt;/strong&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;&lt;strong&gt;Uptime&lt;/strong&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;&lt;strong&gt;Average 1MB DL Time (s)&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;GoGrid&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;100.00%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.03&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;Rackspace CDN&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;100.00%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.70&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;Amazon CloudFront&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;100.00%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.46&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;Azure CDN&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;99.52%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.67&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;Amazon S3&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;100.00%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.04&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;146&quot;&gt;RapidSwitch&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;102&quot;&gt;         &lt;p align=&quot;right&quot;&gt;99.98%&lt;/p&gt;       &lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;206&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.43&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Here are the detailed results for all of the monitoring stations and hosts sorted into average download time order:&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;899&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;&amp;#160;&lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;&lt;strong&gt;GoGrid&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;&lt;strong&gt;Rackspace&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;&lt;strong&gt;Amazon CloudFront&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;&lt;strong&gt;Azure CDN&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;&lt;strong&gt;Amazon S3&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;&lt;strong&gt;RapidSwitch&lt;/strong&gt;&lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;&lt;strong&gt;Average&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;New York&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.12&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.19&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.00&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.50&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.39&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.57&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Boston&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.17&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.42&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.06&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.54&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.31&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.62&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Trumbull&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.16&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.39&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.55&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.38&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.50&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.36&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.72&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Washington&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.21&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.36&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.98&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.04&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.34&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.80&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.79&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Houston&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.34&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.30&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.73&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.20&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.20&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.84&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Paris&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.23&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.31&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.39&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.78&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.89&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Dusseldorf&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.20&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.29&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.18&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.08&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.92&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.27&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.99&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Amsterdam&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.16&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.15&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.47&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.43&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.70&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.03&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Chicago&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.05&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.19&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.95&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.02&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.60&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.48&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.05&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;San Francisco&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.30&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.30&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.22&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.58&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.83&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.31&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.09&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;London&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.15&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.37&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.68&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.89&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.18&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.11&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Vancouver&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.15&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.41&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.23&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.57&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.64&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.69&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.12&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Toronto&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.91&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.48&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.58&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.99&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.67&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.34&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Seattle&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.16&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.31&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.21&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.15&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.64&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.66&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.36&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Munich&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.63&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.29&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.31&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.17&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.06&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.67&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.52&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p&gt;Miami&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.35&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.06&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.70&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.72&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.83&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.25&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.65&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Stockholm&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.71&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.20&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.82&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.48&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.82&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.67&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.95&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Los Angeles&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.29&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.39&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.34&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.99&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.81&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.47&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.38&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Sao Paulo&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.53&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.77&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.70&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.79&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.49&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.50&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.96&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Brisbane&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.45&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.42&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.26&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.96&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.00&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.42&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Tokyo&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.00&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.01&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.04&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.35&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.84&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.44&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Sydney&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.17&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.25&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.19&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.15&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.81&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.78&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.56&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p&gt;Bangalore&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.32&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.76&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.75&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.61&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.33&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.66&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.57&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Sydney 2&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;0.18&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.63&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.74&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.07&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.41&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.29&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.39&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Montreal&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.01&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.57&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.46&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;12.44&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.14&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.51&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Mumbai&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.23&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.96&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;2.00&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.87&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.40&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.70&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;4.69&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Buenos Aires&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.80&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.03&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.41&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.60&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.25&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.33&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.40&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Singapore&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.52&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.27&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;3.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;9.66&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.67&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;13.62&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;6.66&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Hong Kong&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.76&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;1.24&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.65&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;9.28&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;26.92&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.02&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Beijing 2&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.72&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.23&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;11.62&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;7.95&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;11.20&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;17.53&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.38&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Guangzhou&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;5.43&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.99&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;19.48&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.23&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.30&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.91&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;10.89&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Beijing&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;8.50&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;14.33&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;23.92&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;13.37&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;16.29&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;71.55&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;24.66&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Shanghai&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;17.32&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;20.56&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;52.27&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;19.37&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;23.83&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;24.16&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;26.25&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td width=&quot;133&quot;&gt;         &lt;p align=&quot;left&quot;&gt;Average&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;96&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;2.03&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;108&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;2.70&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;4.46&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;120&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;4.67&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;117&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;5.04&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;113&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;7.43&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td width=&quot;105&quot;&gt;         &lt;p align=&quot;right&quot;&gt;&lt;strong&gt;4.39&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://OvertureOnline.com/Data/SpeedTest/Graph.png&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://OvertureOnline.com/Data/SpeedTest/Host Comparison.xlsx&quot;&gt;Here are the raw stats&lt;/a&gt; if you would like to do any further analysis of your own.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Conclusions&lt;/h3&gt;  &lt;p&gt;Clearly GoGrid and Rackspace are the best providers from the hosts tested. GoGrid has the best average performance and is unbeaten to almost all of the monitoring stations.&lt;/p&gt;  &lt;p&gt;Asia is very badly served by all the hosts tested. Obviously there are dedicated hosting services for Asia, but the whole point of a CDN is that it is global. I expect partnerships are being drafted as I type.&lt;/p&gt;  &lt;p&gt;Amazon S3 barely outperforms CloudFront on average, but peak download times per city are much better in some cases.&lt;/p&gt;  &lt;p&gt;Montreal did much worse than I expected given that Canada is so well connected to the US.&lt;/p&gt;  &lt;p&gt;Amazon and Azure CDN’s both perform equally well, although the uptime of Azure looks bad. Actually the Azure uptime was only really bad for the first few days, after that it was very good, so it is probably not a fair measure.&lt;/p&gt;  &lt;h3&gt;Did We Win?&lt;/h3&gt;  &lt;p&gt;Our original aim was to move 50MB in less than three minutes. Therefore our target time for 1MB is 180 / 50 = 3.6 seconds. Even with the fastest CDN host, we are still failing to meet this target for several cities. For Shanghai, we are a factor of five off. And of course this is before we get from where the monitoring stations are (which is probably a well connected hub) out to users at the network edge.&lt;/p&gt;  &lt;p&gt;So big-iron can help us make significant improvements for very little effort and cost, but the war goes on. I might tell you how we finally win in a future post. Hint: we make the installer smaller.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/3870136469758298555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/3870136469758298555' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3870136469758298555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3870136469758298555'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2010/01/content-delivery-networks.html' title='Content Delivery Networks'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-5027650804956671328</id><published>2010-01-03T15:30:00.001+00:00</published><updated>2010-01-03T15:30:09.213+00:00</updated><title type='text'>Google AdSense Fraud</title><content type='html'>&lt;p&gt;As I mentioned in my &lt;a href=&quot;http://rupertrawnsley.blogspot.com/2009/12/three-months-with-google-adwords.html&quot;&gt;last post&lt;/a&gt;, we stopped advertising through Google’s Content Network very soon after we started experimenting with AdSense when we thought we had detected significant fraud. Having not spent much money by this time, the amounts involved were relatively small (less than £100), but the fraction was high. We considered at least 1/3 of our clicks to be fraudulent: deliberately, criminally fraudulent.&lt;/p&gt;  &lt;p&gt;Proud of our forensic IT skills, we rushed to Do-No-Evil Google to report our discovery. Our report contained the bare minimum of facts; we were so convinced it screamed fraud we did not bother to go into much more detail than the websites and the Click Through Rates (CTRs). After a week we had a polite and considered response that attempted to persuade us that this was not fraud. Clearly more evidence was required, so we put together a verbose description of the main points that alerted us, and sent it off in expectation of an apology if not a seat on the board for our fraud-busting smarts. &lt;/p&gt;  &lt;p&gt;Sadly they refused / failed to be convinced and eventually we had to agree to disagree. Obviously we will continue to use Google for advertising – what choice is there for an online business? But we firmly believe they need to put their house in order. If 1/3 of their revenue is fraudulent they will lose consumer confidence and possibly face sanctions for complicity.&lt;/p&gt;  &lt;p&gt;Below I have included the email chain. The name of the operative has been removed as the problem is systemic not personal. The key point, and one I should have put front-and-center (in CAPS perhaps?), is under Red Flag 2 – Set 2. Namely that a badly named, unlinked, and parked-domain website achieved ten times the CTR of Google’s own homepage.&lt;/p&gt;  &lt;p&gt;I would very much like to hear from anyone with similar experiences, or from anyone (at Google or otherwise) who disagrees with any of the points we made. Our transaction volume is small and our market is niche, so I am aware we need more data to make a statistically significant conclusion.&lt;/p&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;h2&gt;Initial Inquiry&lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;[From Rupert to Google on 5/11/09]&lt;/p&gt;    &lt;p&gt;Nearly *one third* of all content based CPC placements were obvious click fraud. &lt;/p&gt;    &lt;p&gt;Many of the sites have exactly the same content and have a CTR of 100% (or greater in one case!). &lt;/p&gt;    &lt;p&gt;I find it incredible that the market leader cannot spot something like this automatically. The fraudsters are not even trying to disguise it. &lt;/p&gt;    &lt;p&gt;[Information about the site URLs and the fraud period]&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Google’s Response&lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;Hello Rupert,&lt;/p&gt;    &lt;p&gt;We have received your request for an invalid clicks investigation. Thank you for your patience while we reviewed your account. I apologize for our delayed response. I understand you are concerned about the quality of clicks you have accrued from certain sites in our content network. &lt;/p&gt;    &lt;p&gt;We reviewed your account and can confirm clicks from these sites. However, we found that these clicks are valid, and there is no activity that suggests you have been charged for invalid clicks. The clicks charged fit a pattern of normal user behaviour. As part of our review, the team looked through dozens of data points--including IP addresses, IP blocks, geographic concentrations, network activity, browser patterns, click timings, and any proprietary signals. However, none of those suggest an automated attack, nor collusion from unethical users. The clicks accrued reflect normal user traffic.&lt;/p&gt;    &lt;p&gt;Many of the sites that you listed are parked domain sites. A parked domain site is an undeveloped web page belonging to a domain name registrar or domain name holder. Our AdSense for domains programme places targeted AdWords ads on parked domain sites that are part of the Google Network.&lt;/p&gt;    &lt;p&gt;Users are brought to parked domain sites when they enter the URL of an undeveloped web page in a browser&#39;s address bar. &lt;/p&gt;    &lt;p&gt;We&#39;ve found that AdWords ads displayed on parked domain sites receive clicks from well-qualified leads within the advertisers&#39; markets. In general, we&#39;ve noticed that the return on investment gained on these pages is equal to or better than that gained on other pages in the search and content networks. However, if you aren&#39;t satisfied with the value of the traffic, you can prevent your ads from showing on parked domain sites by using the Site and Category Exclusion tool. Learn how at &lt;a href=&quot;https://adwords.google.com/support/bin/answer.py?answer=86695&amp;amp;hl=en_GB&quot;&gt;https://adwords.google.com/support/bin/answer.py?answer=86695&amp;amp;hl=en_GB&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;I hope that this information helps address your concern. Please let me assure you that your security is a top priority for Google, and we will continue to monitor all clicks on your ads to prevent abuse. Let us know if you have further questions or if we can be of any more assistance. For more information about steps we take to combat invalid click activity, please visit &lt;a href=&quot;https://adwords.google.com/support/bin/answer.py?answer=6114&amp;amp;hl=en_US&quot;&gt;https://adwords.google.com/support/bin/answer.py?answer=6114&amp;amp;hl=en_US&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Sincerely,&lt;/p&gt;    &lt;p&gt;&amp;lt;Google Employee&amp;gt;&lt;/p&gt;    &lt;p&gt;The Ad Traffic Quality Team&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Rupert’s More Detailed Description&lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;Hi &amp;lt;Google Employee&amp;gt;,&lt;/p&gt;    &lt;p&gt;Thank you for getting back to me. I&#39;m afraid I am still doubtful of the validity of these sites. Allow me to illustrate my concerns with some examples:&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Red Flag 1&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;There are 10 sites in the list with a 100% CTR (radiolluvia.com even has 200%):&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;     &lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;         &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;Domain&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;&lt;b&gt;Clicks&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;&lt;b&gt;Impressions&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;&lt;b&gt;CTR&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;radiolluvia.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;2&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;200.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;net-ebooks.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;umtsfree.net&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;littleabout.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;mtncareer.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;jonefm.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;radiobendele.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;iphalloween.info&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;pdfee.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;          &lt;tr&gt;           &lt;td valign=&quot;top&quot; width=&quot;215&quot;&gt;             &lt;p&gt;&lt;b&gt;rf-online.com&lt;/b&gt;&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;48&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;             &lt;p&gt;1&lt;/p&gt;           &lt;/td&gt;            &lt;td valign=&quot;top&quot; width=&quot;64&quot;&gt;             &lt;p&gt;100.00%&lt;/p&gt;           &lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/p&gt;    &lt;p&gt;None of them contain any relevant content (which would be fine - I understand AdSense can never be a science), but most of them consist only of AdSense links. Are you really suggesting that users happen upon a parked domain by typing the URL above into the browser and happen to be in the market for radio planning software (which is what we make)?&lt;/p&gt;    &lt;p&gt;We don’t make a mass-market product so I would never expect a high CTR on content networks even when targeting radio engineers – only a minority of them are even actively seeking our type of tool.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Red Flag 2&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;There are at least three sets of pages that contain practically the same content and come from the same IP subrange.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Set 1&lt;/b&gt;: gsmsandwich.com, jonefm.com, keonong.com, mtncareer.com, rf-indo.com, smsgupsup.com. They all look like this:&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/_qKNTftrZfws/S0C37Y43euI/AAAAAAAAAFM/TSfKysTUy7I/s1600-h/Set1%5B4%5D.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Set1&quot; border=&quot;0&quot; alt=&quot;Set1&quot; src=&quot;http://lh3.ggpht.com/_qKNTftrZfws/S0C39PI2SwI/AAAAAAAAAFQ/3Gocap1Tid8/Set1_thumb%5B2%5D.png?imgmax=800&quot; width=&quot;546&quot; height=&quot;477&quot; /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;b&gt;Set 2&lt;/b&gt;: umtsfree.net, xlgprs.net, xlgprs.com, ir-hot.com. They all look like this:&lt;/p&gt;    &lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Set2&quot; border=&quot;0&quot; alt=&quot;Set2&quot; src=&quot;http://lh5.ggpht.com/_qKNTftrZfws/S0C3-tlu_pI/AAAAAAAAAFU/wb43YZXEO0Q/Set2_thumb%5B8%5D.png?imgmax=800&quot; width=&quot;546&quot; height=&quot;319&quot; /&gt;&lt;/p&gt;    &lt;p&gt;I find it unlikely that in the space of one week, four people were using these sites as some sort of search or index portal (have they not heard of Google? &lt;font face=&quot;Wingdings&quot;&gt;J&lt;/font&gt;) and either searched to or browsed to our advert and found it relevant enough to click on. This was after only 254 impressions. Contrast this with Google’s own sponsored search results, which yielded only three hits for 2,051 impressions during the same period. If you really believe these statistics are true, surely you should buy this company immediately because they are 10 times better at advert placement than you are. Perhaps you should consider a smiling coed on the homepage?&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Set 3&lt;/b&gt;: gamezerm.com, and radiobendele.com both have the same IP and look the same:&lt;/p&gt;    &lt;p&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Set3&quot; border=&quot;0&quot; alt=&quot;Set3&quot; src=&quot;http://lh6.ggpht.com/_qKNTftrZfws/S0C3_wh2PYI/AAAAAAAAAFY/FK4FjAzqyGU/Set3_thumb%5B2%5D.png?imgmax=800&quot; width=&quot;546&quot; height=&quot;384&quot; /&gt;&lt;/p&gt;    &lt;p&gt;Can it be a coincidence that they have high CTR (50% and 100% respectively)?&lt;/p&gt;    &lt;p&gt;In general, all of the sites in these sets have dubious registration details, often using the same registration anonymity service.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Red Flag 3&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;The click-through path is curious for the links from these sites. For instance, the umtsfree.net site links go through five 302 redirects before landing at the intended target. Here is the chain of URLs:&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://umtsfree.net/forward302.aspx?epc=eWpDPeDkCn7%2fPAWjJDHHizukuSQO4Z0sDU8KfdC9FQ%2b5yWjWwcxv5hXcA5nQpS0OqiEn07sYHTHFe%2fX9vFjDwUcSW01%2bS4WPEL0m7%2fX3z100tRxVe1Mg2zzaXK862vPp7hIJBvAoVV9DPRmnuG%2fkV0w5tbowrxB4AbcTtxa0Bsr%2fCztN7vTUOE0hGYneCC9V5jEY3PRhY5SAeWBCuCp7NzUBODKuSrYrmWbY4g3PHs9mBH08pqUSaY75VuOBggtVC6D5WjIQEZuFNJS10GQ6Bu%2f0JpRTb3xpAWZf4bPOguFyT3zwx6udcQe031GVCTob%2bAk5n3HzuAg2AOTMKncWxG%2bPl6vLUW4DWYQil2ZmY2ILRGYWgOHHAfIlNM1AHowYkUvb%2bBrYHbEQgD6PTID5%2fuaj3OsxHAwLVlhrL3uuu1S3zI4g9mOUab2fnM8yr%2brQmzu2a6UmflkA8s6PaAElxBNg9kZnshsusDIleugD02G6c%2bCTybRaQ0D1IYTOcfyeJLFDejgK2GqObGWs9Nm6J32886U0STHIAz75%2f%2b2snbAtAJQT48cwhAH%2fNQ%2fpaJiHkSON1cIxd7oFroekPJ8iyDhbYZ3VP1TJ0Z7HoHj6HKjeDaemj6LFb1Le0uwGKeLe%2bKc6LxdhYBtjD%2bXnGi0LkIajkmbqWe73rvyLNoRhtd1SsqgDT7wxMUBmPIaisppXnfp%2b8%2ftjiL8R9LU6QFh%2f8%2b4aTQGsrMOTyj55aZ4hx8l3UJck6utVoeVax7%2bOQACwyLYoyyvI4ml9DVsz%2f9Mh4WnmfFdVgPEqIxmJ%2bwnNIlKzX31GePRuLmgLHdeItkfnMPnUWIA8FB485RmGfrEwbF07d7v5JLcYuL4V62CKyW8dl3m89EvsbxcbOTOQN85CQsa5fKdgUZaZ2j1kFgi7Oj9J3MJ10oCQ5OjkZnoBWXZPFsfGxQTxg%2fGxh9k18jep%2b5sesYVB1jRYuej3ptGZBGivoDvEkFR%2fpxCbqB494irMYSWLmmx8c%2frOVZYeIe3XV9P7cBJ4da%2bcrLgJneN2nhKCOX0BDZsw%2bR1L93vZ6LgjgvFgolOFTVpkeF12ecpQWJg5jzm0AnoUhGdj%2fXzFJoJbgaxLnvBsFGql9%2f%2bYyJqMr8URZuovttYKmDemHYS0&quot; rel=&quot;nofollow&quot;&gt;http://umtsfree.net/forward302.aspx?epc=eWpDPeDkCn7%2fPAWjJDHHizukuSQO4Z0sDU8KfdC9FQ%2b5yWjWwcxv5hXcA5nQpS0OqiEn07sYHTHFe%2fX9vFjDwUcSW01%2bS4WPEL0m7%2fX3z100tRxVe1Mg2zzaXK862vPp7hIJBvAoVV9DPRmnuG%2fkV0w5tbowrxB4AbcTtxa0Bsr%2fCztN7vTUOE0hGYneCC9V5jEY3PRhY5SAeWBCuCp7NzUBODKuSrYrmWbY4g3PHs9mBH08pqUSaY75VuOBggtVC6D5WjIQEZuFNJS10GQ6Bu%2f0JpRTb3xpAWZf4bPOguFyT3zwx6udcQe031GVCTob%2bAk5n3HzuAg2AOTMKncWxG%2bPl6vLUW4DWYQil2ZmY2ILRGYWgOHHAfIlNM1AHowYkUvb%2bBrYHbEQgD6PTID5%2fuaj3OsxHAwLVlhrL3uuu1S3zI4g9mOUab2fnM8yr%2brQmzu2a6UmflkA8s6PaAElxBNg9kZnshsusDIleugD02G6c%2bCTybRaQ0D1IYTOcfyeJLFDejgK2GqObGWs9Nm6J32886U0STHIAz75%2f%2b2snbAtAJQT48cwhAH%2fNQ%2fpaJiHkSON1cIxd7oFroekPJ8iyDhbYZ3VP1TJ0Z7HoHj6HKjeDaemj6LFb1Le0uwGKeLe%2bKc6LxdhYBtjD%2bXnGi0LkIajkmbqWe73rvyLNoRhtd1SsqgDT7wxMUBmPIaisppXnfp%2b8%2ftjiL8R9LU6QFh%2f8%2b4aTQGsrMOTyj55aZ4hx8l3UJck6utVoeVax7%2bOQACwyLYoyyvI4ml9DVsz%2f9Mh4WnmfFdVgPEqIxmJ%2bwnNIlKzX31GePRuLmgLHdeItkfnMPnUWIA8FB485RmGfrEwbF07d7v5JLcYuL4V62CKyW8dl3m89EvsbxcbOTOQN85CQsa5fKdgUZaZ2j1kFgi7Oj9J3MJ10oCQ5OjkZnoBWXZPFsfGxQTxg%2fGxh9k18jep%2b5sesYVB1jRYuej3ptGZBGivoDvEkFR%2fpxCbqB494irMYSWLmmx8c%2frOVZYeIe3XV9P7cBJ4da%2bcrLgJneN2nhKCOX0BDZsw%2bR1L93vZ6LgjgvFgolOFTVpkeF12ecpQWJg5jzm0AnoUhGdj%2fXzFJoJbgaxLnvBsFGql9%2f%2bYyJqMr8URZuovttYKmDemHYS0&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://rc12.overture.com/d/sr/?xargs=15KPjg141SnJamwr%2DocLXBROWAylwaxca58cluD5l4GtZf5iMxXOV4aaTCm8dxTOVxv1PdzPSW%5FqYSL%5FT5kPOJGweKQVWJGuXpjdLJxYw6Nq2jUNEbsYRzy%2DLvmIZGOX0E2laEOd%2D5mO7acZdRD05mjddAwByR%2D%5Flqw8yzxu4IQevVig0sskqFc5Z17tQp9bnAXOx7TLome97vhXfFfZwQ%2D%2DxDke%2DgSygTLyyj4WYa9VeHJi58obDIYo0L3ZbKzoLLOKeswIYJfRXG%2DYe62VuOrU6t8txuN2zT3r4MzgFZJP%5F%2DIlWJ3Ulvvv%2DbgfDfP4074wP1CfzqVHz3dxM5PXU3E5OufGXnbWw99E%5FOfpRQIMSv2xOO&quot; rel=&quot;nofollow&quot;&gt;http://rc12.overture.com/d/sr/?xargs=15KPjg141SnJamwr%2DocLXBROWAylwaxca58cluD5l4GtZf5iMxXOV4aaTCm8dxTOVxv1PdzPSW%5FqYSL%5FT5kPOJGweKQVWJGuXpjdLJxYw6Nq2jUNEbsYRzy%2DLvmIZGOX0E2laEOd%2D5mO7acZdRD05mjddAwByR%2D%5Flqw8yzxu4IQevVig0sskqFc5Z17tQp9bnAXOx7TLome97vhXfFfZwQ%2D%2DxDke%2DgSygTLyyj4WYa9VeHJi58obDIYo0L3ZbKzoLLOKeswIYJfRXG%2DYe62VuOrU6t8txuN2zT3r4MzgFZJP%5F%2DIlWJ3Ulvvv%2DbgfDfP4074wP1CfzqVHz3dxM5PXU3E5OufGXnbWw99E%5FOfpRQIMSv2xOO&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://clickserve.uk.dartsearch.net/link/click?lid=43000000042332928&amp;amp;ds_s_kwgid=58000000000470369&amp;amp;ds_e_adid=8770229031&amp;amp;ds_e_matchtype=standard&amp;amp;ds_e_kwdid=86608522531&amp;amp;ds_e_kwgid=5777302919&amp;amp;ds_url_v=2&quot; rel=&quot;nofollow&quot;&gt;http://clickserve.uk.dartsearch.net/link/click?lid=43000000042332928&amp;amp;ds_s_kwgid=58000000000470369&amp;amp;ds_e_adid=8770229031&amp;amp;ds_e_matchtype=standard&amp;amp;ds_e_kwdid=86608522531&amp;amp;ds_e_kwgid=5777302919&amp;amp;ds_url_v=2&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://ad-emea.doubleclick.net/clk;160208746;22377034;b;u=ds&amp;amp;sv1=42332928&amp;amp;sv2=2009111264&amp;amp;sv3=84754;%3fhttp:/www.marshallward.co.uk/?aff=yahoo?&amp;amp;affsrc=acquisition&amp;amp;cm_mmc=yahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&quot;&gt;http://ad-emea.doubleclick.net/clk;160208746;22377034;b;u=ds&amp;amp;sv1=42332928&amp;amp;sv2=2009111264&amp;amp;sv3=84754;%3fhttp://www.marshallward.co.uk/?aff=yahoo?&amp;amp;affsrc=acquisition&amp;amp;cm_mmc=yahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://fls.doubleclick.net/act;sit=530730;spot=1529997;~dc_rdr=?http%3A//www.marshallward.co.uk/%3Faff%3Dyahoo%3F%26affsrc%3Dacquisition%26cm_mmc%3Dyahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&quot; rel=&quot;nofollow&quot;&gt;http://fls.doubleclick.net/act;sit=530730;spot=1529997;~dc_rdr=?http%3A//www.marshallward.co.uk/%3Faff%3Dyahoo%3F%26affsrc%3Dacquisition%26cm_mmc%3Dyahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.marshallward.co.uk/?aff=yahoo?&amp;amp;affsrc=acquisition&amp;amp;cm_mmc=yahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&quot; rel=&quot;nofollow&quot;&gt;http://www.marshallward.co.uk/?aff=yahoo?&amp;amp;affsrc=acquisition&amp;amp;cm_mmc=yahoo-_-Generic-_-Generic-Catalogue-Keywords---Broad-_-catalogs&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;This would allow the site operator to monitor clicks, which is a legitimate thing to do. It is also something you would need if you wanted to monitor and reward agents clicking the links for you. I appreciate that this in itself is not a “smoking gun”.&lt;/p&gt;    &lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;    &lt;p&gt;I suggest that at least the sites in these sets are fraudulent. The fact that they evaded the data mining checks you mention suggests to me that they were generated by a network of geographically distributed agents. These might be humans, encouraged by a share of the AdSense revenue or they might be an autonomous bot-net with a smart pattern of click behaviour (chaotic perhaps). Frankly the click-pattern doesn’t seem that smart to me, so I think there is another type of fraudster out there that is much smarter and rarely hits the same advertiser twice, this would prevent detection by the advertiser, and would only be detectable by Google themselves.&lt;/p&gt;    &lt;p&gt;Let me be clear that I have no reason to doubt the validity of sponsored search or Gmail content adverts and I continue to use these networks, but I have serious doubts about the public AdSense network. I also do not argue that it is still good value for money (even if 1/3 of it is click-fraud), but nobody likes to be ripped off and it is in both our interests to fix it.&lt;/p&gt;    &lt;p&gt;What do we expect? We are not looking for refund on these clicks (frankly I have wasted more money typing this email), instead we would like Google to consider my arguments, and if they agree, to improve their detection process. Excluding these sites is a poor option as I will have to spend time every day weeding out spammers from our content network placements. I appreciate that there will always be a number of frauds that are impossible to detect algorithmically, and that you are locked into an arms race with the fraudsters, but there seems to be more you could be doing to improve automatic detection.&lt;/p&gt;    &lt;p&gt;Best regards,&lt;/p&gt;    &lt;p&gt;Rupert Rawnsley.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Google’s Response&lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;Hello Rupert,&lt;/p&gt;    &lt;p&gt;Thank you for your reply and for providing us with the additional information. We appreciate your patience as we work to resolve this issue.&lt;/p&gt;    &lt;p&gt;I can confirm the information you have mentioned. Many of the sites in question seem to have the same templates and show only AdSense ads.&lt;/p&gt;    &lt;p&gt;However, the clicks that you accrued from these sites are valid. As mentioned in our previous email, these sites are a part of the domain park network. The sites in question do not have any specific content, but are simply &amp;quot;parked&amp;quot; for interested users to purchase the site from the domain hosting company. Also, domain parked sites can be former functioning websites whose domain name contracts have expired. Since these sites are largely created for temporary purposes, the template used may be the same across several websites. This is the reason you may find the same images or the same layout across several of these sites. &lt;/p&gt;    &lt;p&gt;Once an interested user purchases the site or renews the domain name registration, the site is automatically removed from the domain parked network by the hosting company. Parked domain sites offer users ads that are relevant to the text they entered. In addition, some parked domain sites include a search box, which allows users to further refine their search. We&#39;ve found that AdWords ads displayed on parked domain sites receive clicks from well-qualified leads within the advertisers&#39; markets.&lt;/p&gt;    &lt;p&gt;In general, we&#39;ve noticed that the return on investment gained on these pages is equal to or better than that gained on other pages in the search and content networks.&lt;/p&gt;    &lt;p&gt;We are sorry to learn that you are disappointed with the quality of clicks you accrued from these sites. Please be assured that the clicks are valid.&lt;/p&gt;    &lt;p&gt;We strongly suggest you consider using the site-and-category exclusion tool to prevent your ads from showing on the domain park network.&lt;/p&gt;    &lt;p&gt;Thank you for your patience and understanding.&lt;/p&gt;    &lt;p&gt;Sincerely,&lt;/p&gt;    &lt;p&gt;&amp;lt;Google Employee&amp;gt;&lt;/p&gt;    &lt;p&gt;The Ad Traffic Quality Team&lt;/p&gt;&lt;/blockquote&gt;  </content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/5027650804956671328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/5027650804956671328' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5027650804956671328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/5027650804956671328'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2010/01/google-adsense-fraud.html' title='Google AdSense Fraud'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_qKNTftrZfws/S0C39PI2SwI/AAAAAAAAAFQ/3Gocap1Tid8/s72-c/Set1_thumb%5B2%5D.png?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-4397486776661842605</id><published>2009-12-16T19:40:00.008+00:00</published><updated>2009-12-16T22:16:57.109+00:00</updated><title type='text'>Three Months With Google AdWords</title><content type='html'>We recently changed our business plan and embraced online selling. We were obviously aware it existed before, we just didn&#39;t have anything that you could effectively sell in that way. Online selling means online advertising, and we all know that means Google. This gave us our first look at &lt;a href=&quot;http://en.wikipedia.org/wiki/AdWords&quot;&gt;AdWords&lt;/a&gt; - Google&#39;s advertising OS - and we were impressed, but we soon discovered some unexpected things that you might find interesting.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;The Anatomy of Google AdWords&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AdWords has two distinct channels: &lt;span style=&quot;font-style:italic;&quot;&gt;search&lt;/span&gt; and &lt;span style=&quot;font-style:italic;&quot;&gt;content network&lt;/span&gt;. Search is the &quot;Sponsored Links&quot; section that you see at the side and top of search results. Content network is everywhere else that Google puts adverts, which is principally the &lt;a href=&quot;http://en.wikipedia.org/wiki/AdSense&quot;&gt;AdSense&lt;/a&gt; network and GMail. By default, adverts are delivered across all channels and there are numerous analyses for seeing how they perform. We have been advertising with a very modest budget to a niche market for three months, but in that time we have had some eye-opening experiences. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;AdWords is Expensive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You don&#39;t pay when Google shows an advert, only when someone clicks on it (a click-through). However, a click-through from the search page costs us £2.50 and from the content network it is about 80p. I assumed it would be much less than this, but then I have led a sheltered life. I am not saying it is not worth the money; it just costs more than I expected.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;You Are Google&#39;s Bitch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As an online business, we rely on people being able to find us online (duh!). Either they are looking for us explicitly or are looking for the type of thing we sell. 70% of people will do this using Google&#39;s &lt;a href=&quot;http://en.wikipedia.org/wiki/Organic_search&quot;&gt;organic search&lt;/a&gt;, so if Google decide your site is suspect or undesirable in some way and decide to de-list you, your market just got a whole lot smaller. There is no discussion process, no independent authority to whom you can appeal, no cost to Google, and no way back. Sites can be demoted or completely blocked erroneously and without warning or explanation just for something as simple as putting light text on a light background (because it looks like you are trying to fool the GoogleBot into promoting your search rank). This is a dangerous monopoly and it needs to be addressed, and I had never really thought about it before, but it is not my central thesis today.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;AdSense is Suspect&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the first week, most of our spending was going into the AdSense network, but when we looked at the target sites were disappointed by the placement choices. More seriously than that, we found strong evidence of click fraud. I don&#39;t want to divert from my central thesis at this point (it&#39;s coming I promise), so this will be the subject of my next posting. I only raise the point now to say that we suspended AdSense adverts, so all &quot;content network&quot; placements were on GMail only.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Search is Irrelevant&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is the really interesting thing: In the three months we have been advertising we have had 20,000 impressions on the search pages but 1,000,000 impressions on GMail. Just 2% of the eye-time that we bought from Google came from search.&lt;br /&gt;&lt;br /&gt;Assuming our figures are typical (and this is by no means certain given the niche nature of our business) it begs the question: why does Google stay in the search game? The most obvious answer is that people think, as we did, that search engines are the primary online advertising platform, so they take their marketing dollars to Google, only to have Google spend them elsewhere. Therefore, Google must maintain their dominance in the search game or companies will move their budgets elsewhere based on the incorrect assumption that less people would see their adverts.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Google is Vulnerable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It also implies Google is vulnerable. Ignoring AdSense for a moment (which is risky, but work with me here), GMail is not the biggest WebMail provider by a long chalk. Plucking the &lt;a href=&quot;http://www.usatoday.com/tech/products/2008-04-15-google-gmail-webmail_N.htm&quot;&gt;first numbers I could find&lt;/a&gt; off the web I see that GMail has about 90m users compared to Microsoft and Yahoo&#39;s 250m apiece (see why Yahoo is still a valuable asset now?).&lt;br /&gt;&lt;br /&gt;It appears to me that in taking Google on at search, Microsoft and Yahoo are charging at the cape rather than the bull. Show people that you are the advertising channels of choice and hit Google where it hurts.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/4397486776661842605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/4397486776661842605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/4397486776661842605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/4397486776661842605'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/12/three-months-with-google-adwords.html' title='Three Months With Google AdWords'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-4128835018312001331</id><published>2009-12-03T12:49:00.004+00:00</published><updated>2009-12-03T13:08:22.171+00:00</updated><title type='text'>Bran Ferren - Leadership</title><content type='html'>&lt;div style=&quot;text-align:center;&quot;&gt;&lt;object width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/GxbB18QoYO4&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/GxbB18QoYO4&amp;hl=en_US&amp;fs=1&amp;color1=0x3a3a3a&amp;color2=0x999999&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;640&quot; height=&quot;505&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bran_Ferren&quot;&gt;Bran Ferren&lt;/a&gt; is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Walt_Disney_Imagineering&quot;&gt;imagineering&lt;/a&gt; alumnus and co-founder of &lt;a href=&quot;http://battellemedia.com/archives/000712.php&quot;&gt;the coolest company&lt;/a&gt; in the world (with the &lt;a href=&quot;http://www.appliedminds.com/&quot;&gt;simplest website&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;At two hours, this lecture is long, but it flies by (and I won&#39;t normally watch anything on the Internet longer than 4 minutes). Bran is so lucid and inspiring that his enthusiasm is infectious.&lt;br /&gt;&lt;br /&gt;I was reminded of some old Feynman lectures I have seen, also to MIT students as I recall. Feynman&#39;s lecture was outside (it was the 60&#39;s) and the questions were about anti-gravity (it was the 60&#39;s), Ferren&#39;s lecture was inside and mentioned business and the military-industrial complex without being heckled (it wasn&#39;t the 60&#39;s). Whether this is progress or not is left as an exercise for the reader.&lt;br /&gt;&lt;br /&gt;I can&#39;t remember who turned me on to this, so apologies for omitting credit. Probably &lt;a href=&quot;http://boingboing.net/&quot;&gt;BoingBoing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;WARNING: Not safe for people with pogonophobia!</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/4128835018312001331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/4128835018312001331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/4128835018312001331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/4128835018312001331'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/12/bran-ferren-leadership.html' title='Bran Ferren - Leadership'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-9070339459535870183</id><published>2009-10-15T14:30:00.010+01:00</published><updated>2010-07-20T10:50:51.655+01:00</updated><title type='text'>ClickOnce Deployment Problems</title><content type='html'>We have recently moved to &lt;a href=&quot;http://en.wikipedia.org/wiki/ClickOnce&quot;&gt;ClickOnce&lt;/a&gt; for all our application deployment needs, and it is fantastic in so many ways, but there are still some scenarios where it fails. I will collect these together in one post and keep it up-to-date as new information becomes available. If anyone else has any ClickOnce war-stories, please add them to the comments.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Useful Links&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms228998.aspx&quot;&gt;MSDN Server and Client Configuration Issues in ClickOnce Deployments&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en-US/winformssetup/threads&quot;&gt;ClickOnce and Setup &amp; Deployment Projects MSDN forum.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://robindotnet.wordpress.com/&quot;&gt;RobinDotNet&#39;s Blog&lt;/a&gt; has some useful tips, including &lt;a href=&quot;http://robindotnet.wordpress.com/2010/05/23/whats-new-in-clickonce-deployment-in-net-4-0/&quot;&gt;.NET 4.0 logging&lt;/a&gt;. Robin is an MVP and ClickOnce forum moderator.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Proxy Servers&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: Thanks to &lt;a href=&quot;http://robindotnet.wordpress.com/&quot;&gt;Robin&lt;/a&gt; for &lt;a href=&quot;http://social.msdn.microsoft.com/Forums/en/winformssetup/thread/3e9cebad-9630-4bbc-a0ca-0d2f20335454&quot;&gt;this link&lt;/a&gt; to a fix for the proxy issue.&lt;br /&gt;&lt;br /&gt;If your customers are behind an authenticated proxy server, ClickOnce may fail to work. This is because the authentication settings are usually stored in Internet Explorer, but the ClickOnce deployment libraries (System.Deployment.Application) do not use them by default. The bug is &lt;a href=&quot;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=115468&amp;wa=wsignin1.0&quot;&gt;documented here&lt;/a&gt;, but opinion varies about whether it should be fixed or not: Microsoft says it shouldn&#39;t, everybody else says it should.&lt;br /&gt;&lt;br /&gt;When it goes wrong a typical error report looks like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;PLATFORM VERSION INFO&lt;br /&gt; Windows    : 5.2.3790.131072 (Win32NT)&lt;br /&gt; Common Language Runtime  : 2.0.50727.3053&lt;br /&gt; System.Deployment.dll   : 2.0.50727.3053 (netfxsp.050727-3000)&lt;br /&gt; mscorwks.dll    : 2.0.50727.3053 (netfxsp.050727-3000)&lt;br /&gt; dfdll.dll    : 2.0.50727.3053 (netfxsp.050727-3000)&lt;br /&gt; dfshim.dll    : 2.0.50727.3053 (netfxsp.050727-3000)&lt;br /&gt;&lt;br /&gt;SOURCES&lt;br /&gt; Deployment url   : http://overtureonline.com/Applications/Keima/Overture/Overture.application&lt;br /&gt;&lt;br /&gt;ERROR SUMMARY&lt;br /&gt; Below is a summary of the errors, details of these errors are listed later in the log.&lt;br /&gt; * Activation of http://OvertureOnline.com/Applications/Keima/Overture/Overture.application resulted in exception. Following failure messages were detected:&lt;br /&gt;  + Downloading http://overtureonline.com/Applications/Keima/Overture/Overture.application did not succeed.&lt;br /&gt;  + The remote server returned an error: (407) Proxy Authentication Required.&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION FAILURE SUMMARY&lt;br /&gt; No transaction error was detected.&lt;br /&gt;&lt;br /&gt;WARNINGS&lt;br /&gt; There were no warnings during this operation.&lt;br /&gt;&lt;br /&gt;OPERATION PROGRESS STATUS&lt;br /&gt; * [25/09/2009 15:59:15] : Activation of http://OvertureOnline.com/Applications/Keima/Overture/Overture.application has started.&lt;br /&gt;&lt;br /&gt;ERROR DETAILS&lt;br /&gt; Following errors were detected during this operation.&lt;br /&gt; * [25/09/2009 15:59:16] System.Deployment.Application.DeploymentDownloadException (Unknown subtype)&lt;br /&gt;  - Downloading http://overtureonline.com/Applications/Keima/Overture/Overture.application did not succeed.&lt;br /&gt;  - Source: System.Deployment&lt;br /&gt;  - Stack trace:&lt;br /&gt;   at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)&lt;br /&gt;   at System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()&lt;br /&gt;   at System.Deployment.Application.FileDownloader.Download(SubscriptionState subState)&lt;br /&gt;   at System.Deployment.Application.DownloadManager.DownloadManifestAsRawFile(Uri&amp; sourceUri, String targetPath, IDownloadNotification notification, DownloadOptions options, ServerInformation&amp; serverInformation)&lt;br /&gt;   at System.Deployment.Application.DownloadManager.DownloadDeploymentManifestDirectBypass(SubscriptionStore subStore, Uri&amp; sourceUri, TempFile&amp; tempFile, SubscriptionState&amp; subState, IDownloadNotification notification, DownloadOptions options, ServerInformation&amp; serverInformation)&lt;br /&gt;   at System.Deployment.Application.DownloadManager.DownloadDeploymentManifestBypass(SubscriptionStore subStore, Uri&amp; sourceUri, TempFile&amp; tempFile, SubscriptionState&amp; subState, IDownloadNotification notification, DownloadOptions options)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String&amp; errorPageUrl)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)&lt;br /&gt;  --- Inner Exception ---&lt;br /&gt;  System.Net.WebException&lt;br /&gt;  - The remote server returned an error: (407) Proxy Authentication Required.&lt;br /&gt;  - Source: System&lt;br /&gt;  - Stack trace:&lt;br /&gt;   at System.Net.HttpWebRequest.GetResponse()&lt;br /&gt;   at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION DETAILS&lt;br /&gt; No transaction information is available.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A smart customer of ours actually found an answer: she ran an &lt;a href=&quot;http://sourceforge.net/projects/ntlmaps/files/ntlmaps/ntlmaps-0.9.9/&quot;&gt;NTLM proxy&lt;/a&gt;, but we shouldn&#39;t expect all our customers to be computer geniuses.&lt;br /&gt;&lt;br /&gt;The recommended solution is for the customer to edit their machine.config file - I can&#39;t see how that could possibly go badly ;-)&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Internet Explorer Security&lt;/h1&gt;&lt;br /&gt;If the Internet Explorer security option &quot;Run components not signed with Authenticode&quot; option is set to &quot;Disable&quot;, then your .application file will not work. The reason why would be clearer if the wording was &quot;Run components not signed with Authenticode &lt;i&gt;certificates that I trust&lt;/i&gt;&quot;, because even if your installer is actually signed, it is not necessarily a trusted publisher on the customers machine.&lt;br /&gt;&lt;br /&gt;The error looks like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;PLATFORM VERSION INFO&lt;br /&gt; Windows    : 6.0.6001.65536 (Win32NT)&lt;br /&gt; Common Language Runtime  : 4.0.20506.1&lt;br /&gt; System.Deployment.dll   : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; clr.dll    : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; dfdll.dll    : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; dfshim.dll    : 4.0.20428.1 (Beta1.020428-0100)&lt;br /&gt;&lt;br /&gt;SOURCES&lt;br /&gt; Deployment url   : http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application&lt;br /&gt;      Server  : Microsoft-IIS/7.0&lt;br /&gt;      X-Powered-By : ASP.NET&lt;br /&gt;&lt;br /&gt;ERROR SUMMARY&lt;br /&gt; Below is a summary of the errors, details of these errors are listed later in the log.&lt;br /&gt; * Activation of http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application resulted in exception. Following failure messages were detected:&lt;br /&gt;  + Your Web browser settings do not allow you to run unsigned applications.&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION FAILURE SUMMARY&lt;br /&gt; No transaction error was detected.&lt;br /&gt;&lt;br /&gt;WARNINGS&lt;br /&gt; There were no warnings during this operation.&lt;br /&gt;&lt;br /&gt;OPERATION PROGRESS STATUS&lt;br /&gt; * [10/15/2009 3:21:06 PM] : Activation of http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application has started.&lt;br /&gt;&lt;br /&gt;ERROR DETAILS&lt;br /&gt; Following errors were detected during this operation.&lt;br /&gt; * [10/15/2009 3:21:06 PM] System.Deployment.Application.InvalidDeploymentException (Manifest)&lt;br /&gt;  - Your Web browser settings do not allow you to run unsigned applications.&lt;br /&gt;  - Source: System.Deployment&lt;br /&gt;  - Stack trace:&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.BrowserSettings.Validate(String manifestPath)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String&amp; errorPageUrl)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION DETAILS&lt;br /&gt; No transaction information is available.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I don&#39;t know of any tidy workaround for this. If the client installs your certificate prior to product installation then it will work, but then it&#39;s no longer Click&lt;i&gt;Once&lt;/i&gt; is it? One might argue that they asked for this by changing the setting, but it is more likely that their IT department did it and they know nothing about it. The irony is that if you run the bootstrap setup.exe, as you must from browsers like Chrome, then it works fine, but this means you are forcing clients to run a full-trust executable instead of a potentially low-trust .application file.&lt;br /&gt;&lt;br /&gt;UPDATE: &lt;a href=&quot;http://robindotnet.wordpress.com/&quot;&gt;Robin&lt;/a&gt; points out in the comments below that this is an IE6 only issue.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Missing Local Files&lt;/h1&gt;&lt;br /&gt;A ClickOnce install puts files in a special folder called Apps (%localappdata%\Apps on Vista at least). I&#39;m not sure the exact purpose of all of the folders and files, but I do know if you delete some of them it can cause web-launch failures. For instance, I installed a simple application, deleted the folder which held the application binary files and then tried to relaunch the application. This failed with the following message:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;PLATFORM VERSION INFO&lt;br /&gt; Windows    : 6.0.6001.65536 (Win32NT)&lt;br /&gt; Common Language Runtime  : 4.0.20506.1&lt;br /&gt; System.Deployment.dll   : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; clr.dll    : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; dfdll.dll    : 4.0.20506.1 (Beta1.020506-0100)&lt;br /&gt; dfshim.dll    : 4.0.20428.1 (Beta1.020428-0100)&lt;br /&gt;&lt;br /&gt;SOURCES&lt;br /&gt; Deployment url   : http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application&lt;br /&gt;      Server  : Microsoft-IIS/7.0&lt;br /&gt;      X-Powered-By : ASP.NET&lt;br /&gt;&lt;br /&gt;IDENTITIES&lt;br /&gt; Deployment Identity  : ConsoleApplicationClickOnce.application, Version=1.0.0.1, Culture=neutral, PublicKeyToken=39bbeb210852ebe6, processorArchitecture=msil&lt;br /&gt;&lt;br /&gt;APPLICATION SUMMARY&lt;br /&gt; * Online only application.&lt;br /&gt;&lt;br /&gt;ERROR SUMMARY&lt;br /&gt; Below is a summary of the errors, details of these errors are listed later in the log.&lt;br /&gt; * Activation of http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application resulted in exception. Following failure messages were detected:&lt;br /&gt;  + The directory name is invalid. (Exception from HRESULT: 0x8007010B)&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION FAILURE SUMMARY&lt;br /&gt; No transaction error was detected.&lt;br /&gt;&lt;br /&gt;WARNINGS&lt;br /&gt; There were no warnings during this operation.&lt;br /&gt;&lt;br /&gt;OPERATION PROGRESS STATUS&lt;br /&gt; * [10/15/2009 3:32:28 PM] : Activation of http://cadenza.keima.co.uk/Applications/Keima/Test/ConsoleApplicationClickOnce/ConsoleApplicationClickOnce.application has started.&lt;br /&gt; * [10/15/2009 3:32:28 PM] : Processing of deployment manifest has successfully completed.&lt;br /&gt;&lt;br /&gt;ERROR DETAILS&lt;br /&gt; Following errors were detected during this operation.&lt;br /&gt; * [10/15/2009 3:32:28 PM] System.Runtime.InteropServices.COMException&lt;br /&gt;  - The directory name is invalid. (Exception from HRESULT: 0x8007010B)&lt;br /&gt;  - Source: System.Deployment&lt;br /&gt;  - Stack trace:&lt;br /&gt;   at System.Deployment.Application.NativeMethods.CorLaunchApplication(UInt32 hostType, String applicationFullName, Int32 manifestPathsCount, String[] manifestPaths, Int32 activationDataCount, String[] activationData, PROCESS_INFORMATION processInformation)&lt;br /&gt;   at System.Deployment.Application.ComponentStore.ActivateApplication(DefinitionAppId appId, String activationParameter, Boolean useActivationParameter)&lt;br /&gt;   at System.Deployment.Application.SubscriptionStore.ActivateApplication(DefinitionAppId appId, String activationParameter, Boolean useActivationParameter)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.Activate(DefinitionAppId appId, AssemblyManifest appManifest, String activationParameter, Boolean useActivationParameter)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String&amp; errorPageUrl)&lt;br /&gt;   at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)&lt;br /&gt;&lt;br /&gt;COMPONENT STORE TRANSACTION DETAILS&lt;br /&gt; * Transaction at [10/15/2009 3:32:28 PM]&lt;br /&gt;  + System.Deployment.Internal.Isolation.StoreOperationSetDeploymentMetadata&lt;br /&gt;   - Status: Set&lt;br /&gt;   - HRESULT: 0x0&lt;br /&gt;  + System.Deployment.Internal.Isolation.StoreTransactionOperationType (27)&lt;br /&gt;   - HRESULT: 0x0&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href=&quot;http://blogs.msdn.com/bimusings/archive/2007/11/27/how-to-really-really-remove-pps-dashboard-designer-and-destroy-your-machine.aspx&quot;&gt;Russell Christopher&lt;/a&gt; for blogging the only solution I have found that works: delete everything in the Apps folder. This should be safe given that ClickOnce applications repair themselves if completely removed. Apart from Start Menu shortcuts, they are completely defined by the files on the disk (I think).&lt;br /&gt;&lt;br /&gt;Obviously this is the clients fault for messing with the files in the first place, but I was surprised it didn&#39;t repair itself.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Plain Text / XML .application File&lt;/h1&gt;&lt;br /&gt;Pathology: When the .application file is clicked, the browser shows the plain text XML file instead of launching the ClickOnce installer.&lt;br /&gt;&lt;br /&gt;I only get this problem with IE6, and in my case it is a MIME issue. My server labels .application files with the generic application/octet-stream MIME types, and IE6 doesn&#39;t do a good job at deducing the correct type by inspecting the content.&lt;br /&gt;&lt;br /&gt;It appears that IE7 and above have more sophisticated ways of resolving the .application file MIME than simply looking at the MIME type that the server reports, which is often difficult or impossible to change for exotic types like application/x-ms-application if you don&#39;t have root access to the server. In this case, you can serve up the EXE bootstrapper instead of the .application file to anyone with IE6.&lt;br /&gt;&lt;br /&gt;Clue 1: Probably a &lt;a href=&quot;http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.windowsforms/topic36519.aspx&quot;&gt;server MIME encoding issue&lt;/a&gt;.&lt;br /&gt;Clue 2: &lt;a href=&quot;http://www.j2fi.net/2009/11/24/clickonce-and-godaddy-servers/&quot;&gt;More evidence&lt;/a&gt; of MIME encoding.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;The ClickOnce Graveyard&lt;/h1&gt;&lt;br /&gt;Here lies all the problems I am currently experiencing for which I do not have a definitive solution. As they are resolved, I will move them up into the body of the main article.&lt;br /&gt;&lt;h2&gt;Setup EXE Bootstrapper Fails to Launch&lt;/h2&gt;&lt;br /&gt;Pathology: On a virgin XP installation, the EXE bootstrapper fails to launch.&lt;br /&gt;&lt;br /&gt;Clues: Saving the bootstrapper and launching it manually throws a dialog with the following example text:&lt;br /&gt;&lt;blockquote style=&quot;font-family:monospace;&quot;&gt;&lt;br /&gt;Unable to satisfy all prerequisites for [Application]. Setup cannot continue until all system components have been successfully installed.&lt;br /&gt;&lt;br /&gt;Prerequisite check for system component .NET Framework 3.5 SP1 failed with the following error message:&lt;br /&gt;&quot;Installation of the .NET Framework 3.5 SP1 requires Windows XP SP2, Windows 2003 SP1, Windows Vista, or later. Contact your application vendor.&quot;&lt;br /&gt;&lt;br /&gt;See the setup log file located at&lt;br /&gt;[Log file location]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This doesn&#39;t happen on XP SP2 or above, but I don&#39;t know how to make this a prerequisite. More to the point, I don&#39;t know how to throw a friendly dialog if this prerequisite is not met.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/9070339459535870183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/9070339459535870183' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/9070339459535870183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/9070339459535870183'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/10/clickonce-deployment-problems.html' title='ClickOnce Deployment Problems'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-3674087307224793714</id><published>2009-10-01T10:29:00.003+01:00</published><updated>2009-10-01T10:32:38.697+01:00</updated><title type='text'>Sinister discovery of the day</title><content type='html'>Whilst researching international post-codes (don&#39;t ask), I happened upon a Wiki page about &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_postal_codes_in_China&quot;&gt;Chinese post-codes&lt;/a&gt; (not a euphemism). Note the codes (000000–009999) reserved for Taiwan.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/3674087307224793714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/3674087307224793714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3674087307224793714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/3674087307224793714'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/10/sinister-discovery-of-day.html' title='Sinister discovery of the day'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-7570720205833718288</id><published>2009-09-11T12:21:00.004+01:00</published><updated>2009-09-11T12:35:54.180+01:00</updated><title type='text'>Apology for Alan Turing</title><content type='html'>The British Government apologised for their persecution of Alan Turning following an online petition. I&#39;m delighted by this for both highlighting the abominable treatment of gay people and for bringing my hero Turing to peoples attention again.&lt;br /&gt;&lt;br /&gt;As a signatory of the online petition, I received a copy of the apology in full in an email (which I thought was a nice touch). Here it is reproduced in full:&lt;br /&gt;&lt;blockquote style=&quot;font-style:italic;margin:1em 2em;text-align:justify;&quot;&gt;&lt;br /&gt;&quot;Thank you for signing this petition. The Prime Minister has written a response. Please read below.&lt;br /&gt;&lt;br /&gt;Prime Minister: 2009 has been a year of deep reflection – a chance for Britain, as a nation, to commemorate the profound debts we owe to those who came before. A unique combination of anniversaries and events have stirred in us that sense of pride and gratitude which characterise the British experience. Earlier this year I stood with Presidents Sarkozy and Obama to honour the service and the sacrifice of the heroes who stormed the beaches of Normandy 65 years ago. And just last week, we marked the 70 years which have passed since the British government declared its willingness to take up arms against Fascism and declared the outbreak of World War Two. So I am both pleased and proud that, thanks to a coalition of computer scientists, historians and LGBT activists, we have this year a chance to mark and celebrate another contribution to Britain’s fight against the darkness of dictatorship; that of code-breaker Alan Turing.&lt;br /&gt;&lt;br /&gt;Turing was a quite brilliant mathematician, most famous for his work on breaking the German Enigma codes. It is no exaggeration to say that, without his outstanding  contribution, the history of World War Two could well have been very different. He truly was one of those individuals we can point to whose unique contribution helped to turn the tide of war. The debt of gratitude he is owed makes it all the more horrifying, therefore, that he was treated so inhumanely. In 1952, he was convicted  of ‘gross indecency’ – in effect, tried for being gay. His sentence – and he was faced with the miserable choice of this or prison - was chemical castration by a series of injections of female hormones. He took his own life just two years later.&lt;br /&gt;&lt;br /&gt;Thousands of people have come together to demand justice for Alan Turing and recognition of the appalling way he was treated. While Turing was dealt with under the law of the time and we can&#39;t put the clock back, his treatment was of course utterly unfair and I am pleased to have the chance to say how deeply sorry I and we all are for what happened to him. Alan and the many thousands of other gay men who were convicted as he was convicted under homophobic laws were treated terribly. Over the years millions more lived in fear of conviction.&lt;br /&gt;&lt;br /&gt;I am proud that those days are gone and that in the last 12 years this government has done so much to make life fairer and more equal for our LGBT community. This recognition of Alan’s status as one of Britain’s most famous victims of homophobia is another step towards equality and long overdue.&lt;br /&gt;&lt;br /&gt;But even more than that, Alan deserves recognition for his contribution to humankind. For those of us born after 1945, into a Europe which is united, democratic and at peace, it is hard to imagine that our continent was once the theatre of mankind’s darkest hour. It is difficult to believe that in living memory, people could become so consumed by hate – by anti-Semitism, by homophobia, by xenophobia and other murderous prejudices – that the gas chambers and crematoria became a piece of the European landscape as surely as the galleries and universities and concert halls which had marked out the European civilisation for hundreds of years. It is thanks to men and women who were totally committed to fighting fascism, people like Alan Turing, that the horrors of the Holocaust and of total war are part of Europe’s history and not Europe’s present.&lt;br /&gt;&lt;br /&gt;So on behalf of the British government, and all those who live freely thanks to Alan’s work I am very proud to say: we’re sorry, you deserved so much better.&lt;br /&gt;&lt;br /&gt;Gordon Brown&lt;br /&gt;&lt;br /&gt;If you would like to help preserve Alan Turing&#39;s memory for future generations, please donate here: http://www.bletchleypark.org.uk/&lt;br /&gt;&lt;br /&gt;Petition information - http://petitions.number10.gov.uk/turing/&quot;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I won&#39;t link to the Downing Street site version because the comments might as well have come from the Daily Mail&#39;s letters page.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/7570720205833718288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/7570720205833718288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/7570720205833718288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/7570720205833718288'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/09/apology-for-alan-turing.html' title='Apology for Alan Turing'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-1417779640080546770</id><published>2009-08-28T12:13:00.002+01:00</published><updated>2009-08-28T12:39:37.631+01:00</updated><title type='text'>BBC News: File-sharers&#39; TV tastes revealed</title><content type='html'>The BBC &lt;a href=&quot;http://news.bbc.co.uk/1/hi/technology/8224869.stm&quot;&gt;have a story&lt;/a&gt; based on some download statistics for TV &amp; film that makes interesting reading. If the TV network executives read this and think &quot;threat&quot; rather than &quot;opportunity&quot; they are missing a trick. What if they uploaded the torrent themselves simultaneously with transmission including the adverts? Nobody is going to bother with an illegal version if this one is available immediately and is of high quality. Only a hardcore pirate would bother with an ad-free version because this would lag slightly behind the official version in terms of time to release, but crucially the number of seeds, and hence the download speed, would be significantly lower.&lt;br /&gt;&lt;br /&gt;Yes people could zap through the ads, but that is no different to &quot;TIVO&quot; on broadcast anyway and only a schmuck watches things live these days anyway. If only 2% of people sat through the ads, that is still 1 million people you don&#39;t have today in a demographic you would normally struggle to reach.&lt;br /&gt;&lt;br /&gt;There is a secret power in &quot;global&quot; as well. Advertisers talk about &quot;playground repeats&quot;, which is when slogans and jingles are repeated in the school yard. If your adverts start to permeate the global culture a synergy emerges where the phrases and concepts become a lingua franca in online conversations.&lt;br /&gt;&lt;br /&gt;Infrastructure requirements: a laptop, a big disk, and a decent uplink; not bad if you want to reach more than 50 million people worldwide. If it really takes off you could even do away with that expensive array of radio towers.&lt;br /&gt;&lt;br /&gt;A halfway solution is no good. Custom players, region and DRM locking, proprietary standards, etc... will always be a niche play against the power of free. Open it up and let the community build the software and hardware to support it. Stick to what you know: making TV shows.&lt;br /&gt;&lt;br /&gt;I don&#39;t pretend that this is a good solution for films, but it is perfect for TV.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/1417779640080546770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/1417779640080546770' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/1417779640080546770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/1417779640080546770'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/08/bbc-news-file-sharers-tv-tastes.html' title='BBC News: File-sharers&#39; TV tastes revealed'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-867336303655802707</id><published>2009-08-21T12:06:00.003+01:00</published><updated>2009-08-21T12:34:40.189+01:00</updated><title type='text'>ASP.NET File Permissions</title><content type='html'>Short Story:&lt;br /&gt;&lt;br /&gt;Use &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx&quot;&gt;Process Monitor&lt;/a&gt; to help resolve ASP.NET file permission problems.&lt;br /&gt;&lt;br /&gt;Long Story:&lt;br /&gt;&lt;br /&gt;I have some files on one machine that I would like to make available through one of our company websites. We use IIS for our hosting, so I created a file share on the machine with the files and linked to it using a &lt;a href=&quot;http://www.netomatix.com/development/IIS7Configuration.aspx&quot;&gt;Virtual Directory&lt;/a&gt;. Now when resources are accessed via IIS they do so as the IUSR account (unless other authentication options are enabled), so I added read permissions for this user to my files security settings and to the sharing permissions (I always forget to do both), but it did not work. There may be some fancy ASP logging that tells you why, but I have always struggled to get the ASP logs to do anything very useful. Several smart people on the Internet recommended using &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx&quot;&gt;Process Monitor&lt;/a&gt; from Microsoft (previously from Sysinternals). Everything that the Sysinternals guys make is made of pure awesome, and this is no exception. It allows you to search for the ACCESS DENIED operation (a CreateFile function call), and this shows all of the relevant details, including the user credentials used. In my case it was IUSR, or actually &lt;DOMAIN&gt;/IUSR_&lt;DOMAINCONTROLLER&gt;, which is some sort of domain equivalent. Exactly the user I had set the permissions for, so why wasn&#39;t it working?&lt;br /&gt;&lt;br /&gt;Running Process Monitor on the file hosting machine instead reveals the problem: the file access was impersonating a different user, namely &lt;DOMAIN&gt;/&lt;IISMACHINE&gt;$. It seems that this is the default behaviour across machine boundaries unless you are explicitly impersonating a designated user, in which case those credentials are passed intact.&lt;br /&gt;&lt;br /&gt;The fix I chose may not be the recommended solution, but it worked for me: explictly impersonate IUSR to force the credentials to be passed across the machine boundary. To do this you need the IUSR password, which can be obtained by following this &lt;a href=&quot;http://support.microsoft.com/default.aspx?scid=kb;en-us;297989#top&quot;&gt;helpful advice&lt;/a&gt;. Whatever you do, don&#39;t change the IUSR password or you may unwittingly open a portal to a new dimension of pain.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/867336303655802707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/867336303655802707' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/867336303655802707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/867336303655802707'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/08/aspnet-file-permissions.html' title='ASP.NET File Permissions'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-2741420919422948592</id><published>2009-07-20T08:57:00.002+01:00</published><updated>2009-07-20T09:05:54.010+01:00</updated><title type='text'>Richard Feynman: The Character of Physical Law</title><content type='html'>Feynman&#39;s incredible lecture series is now freely available on video here: &lt;a href=&quot;http://research.microsoft.com/apps/tools/tuva/index.html&quot;&gt;http://research.microsoft.com/apps/tools/tuva/index.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is wonderfully complete, including the VT header, which I think should begin all videos.&lt;br /&gt;&lt;br /&gt;It&#39;s all made possible by someone called &quot;Gates&quot;.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/2741420919422948592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/2741420919422948592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2741420919422948592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2741420919422948592'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/07/richard-feynman-character-of-physical.html' title='Richard Feynman: The Character of Physical Law'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-8526759118281717214</id><published>2009-05-25T10:04:00.002+01:00</published><updated>2009-05-25T16:04:58.273+01:00</updated><title type='text'>eMail for Kids</title><content type='html'>#1 son is of an age where he would love an email address. There are many pay for services that offer safe kids emails, but it seems like a dumb thing to have to pay for.&lt;br /&gt;&lt;br /&gt;The must have feature is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Whitelist#E-mail_whitelists&quot;&gt;exclusive whitelist&lt;/a&gt;. This means that ONLY people on your contact list can send you emails.&lt;br /&gt;&lt;br /&gt;My beloved GMail don&#39;t offer this service, but Microsoft&#39;s Live Mail does. I will let you know how it works out. It took a while to make sure all the permissions were locked down.&lt;br /&gt;&lt;br /&gt;Incidentally, the default account name for my location is live.co.uk or hotmail.co.uk, which is lame, so I experimented with the URL and found I could trick it into US mode like this: &lt;a href=&quot;https://signup.live.com/signup.aspx?mkt=EN-US&amp;rollrs=12&amp;lic=1&quot;&gt;https://signup.live.com/signup.aspx?mkt=EN-US&amp;rollrs=12&amp;lic=1&lt;/a&gt;. This gives you the option of registering for live.com or hotmail.com addresses.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/8526759118281717214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/8526759118281717214' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8526759118281717214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8526759118281717214'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/05/email-for-kids.html' title='eMail for Kids'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-8424475102014775852</id><published>2009-03-30T10:22:00.002+01:00</published><updated>2009-03-30T11:01:48.243+01:00</updated><title type='text'>Visual Studio 2008 Product Comparison</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;http://www.microsoft.com/visualstudio&quot;&gt;Visual Studio product page&lt;/a&gt; appears to have no comparison chart that spans all product editions. This is quite an omission for a product line that costs anywhere from $0 (for the Express editions) to $10939 (for Team Suite with an MSDN subscription). A range I would also describe as going from &amp;quot;&lt;em&gt;outrageously amazing&lt;/em&gt;&amp;quot; to &amp;quot;&lt;em&gt;poking developers in the eyes with toothpicks&lt;/em&gt;&amp;quot;. If you dig around for a while, there is at least a &lt;a href=&quot;http://www.microsoft.com/visualstudio/en-us/howtobuy/compare-price.mspx&quot;&gt;&lt;strong&gt;price comparison chart&lt;/strong&gt;&lt;/a&gt; on the site. However, you have to venture further afield for a clear &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?FamilyID=727BCFB0-B575-47AB-9FD8-4EE067BB3A37&quot;&gt;&lt;strong&gt;feature comparison chart&lt;/strong&gt;&lt;/a&gt; on the general Microsoft download site.&lt;/p&gt;  &lt;p&gt;One price step that interests me is between Professional and Team System Developer. These are likely to be the two editions most commonly compared by price conscious code shops. If you use Team Foundation Server, you will need to add a Client Access License to Professional, which takes the total to $800 + $500 = $1300. Feature wise Developer edition gives you:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Code Profiling     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Code Analysis (including check-in policies and spell checking)     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Code Coverage&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;With Developer you are also required to buy MSDN Premium, so the total cost is $5469. Professional + CAL + MSDN Premium is $2500. So you have to ask yourself if MSDN Premium is worth it, and if the extra Developer features are then worth doubling your investment.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/8424475102014775852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/8424475102014775852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8424475102014775852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/8424475102014775852'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/03/visual-studio-2008-product-comparison.html' title='Visual Studio 2008 Product Comparison'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-739912738900478836</id><published>2009-03-24T17:00:00.003+00:00</published><updated>2009-03-24T17:07:03.957+00:00</updated><title type='text'>101 LINQ Samples</title><content type='html'>(via &lt;a href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx&quot;&gt;MSDN&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: collapse; color: rgb(0, 0, 0); font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; &quot;&gt;&lt;table class=&quot;multicol&quot; style=&quot;width: 100%; border-collapse: collapse; &quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; class=&quot;innercol&quot;&gt;&lt;div class=&quot;LeftCol&quot; style=&quot;padding-right: 20px; &quot;&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Restriction Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl01&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl01&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336760#WhereSimple1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Where - Simple 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl02&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl02&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336760#WhereSimple2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Where - Simple 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl03&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl03&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336760#WhereSimple3&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Where - Simple 3&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl04&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl04&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336760#WhereDrilldown&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Where - Drilldown&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl05&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl05&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336760#WhereIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Where - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Projection Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl06&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl06&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectSimple1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Simple 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl07&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl07&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectSimple2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Simple 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl08&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl08&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectTransformation&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Transformation&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl09&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl09&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectAnonymousTypes1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Anonymous Types 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl10&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl10&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectAnonymousTypes2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Anonymous Types 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl11&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl11&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectAnonymousTypes3&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Anonymous Types 3&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl12&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl12&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl13&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl13&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectFiltered&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Select - Filtered&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl14&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl14&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyCompoundfrom1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - Compound from 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl15&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl15&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyCompoundfrom2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - Compound from 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl16&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl16&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyCompoundfrom3&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - Compound from 3&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl17&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl17&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyfromAssignment&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - from Assignment&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl18&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl18&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyMultiplefrom&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - Multiple from&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl19&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl19&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SelectMany - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Partitioning Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl20&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl20&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#TakeSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Take - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl21&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl21&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#TakeNested&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Take - Nested&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl22&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl22&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#SkipSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Skip - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl23&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl23&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#SkipNested&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Skip - Nested&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl24&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl24&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#TakeWhileSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;TakeWhile - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl25&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl25&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#SkipWhileSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SkipWhile - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl26&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl26&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336757#SkipWhileIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;SkipWhile - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Ordering Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl27&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl27&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#simple1&quot; style=&quot;text-decoration: none; color: rgb(128, 0, 128); &quot;&gt;OrderBy - Simple 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl28&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl28&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#simple2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderBy - Simple 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl29&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl29&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#simple3&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderBy - Simple 3&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl30&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl30&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#comparer&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderBy - Comparer&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl31&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl31&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#descSimple1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderByDescending - Simple 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl32&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl32&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#descSimple2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderByDescending - Simple 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl33&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl33&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#descComparer&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OrderByDescending - Comparer&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl34&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl34&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#thenBySimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;ThenBy - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl35&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl35&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#thenByComparer&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;ThenBy - Comparer&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl36&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl36&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#thenByDescendingSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;ThenByDescending - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl37&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl37&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#thenByDescComparer&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;ThenByDescending - Comparer&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl38&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl38&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336756#reverse&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Reverse&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; class=&quot;innercol&quot;&gt;&lt;div class=&quot;RightCol&quot; style=&quot;padding-left: 20px; &quot;&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Grouping Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl39&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl39&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#simple1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Simple 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl40&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl40&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#simple2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Simple 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl41&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl41&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#simple3&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Simple 3&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl42&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl42&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#nested&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Nested&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl43&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl43&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#comparer&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Comparer&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl44&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl44&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336754.aspx#comparerMapped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;GroupBy - Comparer, Mapped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Set Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl45&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl45&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#distinct1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Distinct - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl46&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl46&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#distinct2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Distinct - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl47&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl47&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#union1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Union - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl48&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl48&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#union2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Union - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl49&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl49&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Intersect - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl50&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl50&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Intersect - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl51&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl51&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#except1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Except - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl52&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl52&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#except2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Except - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Conversion Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl53&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl53&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336748#ToArray&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;To Array&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl54&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl54&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336748#ToList&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;To List&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl55&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl55&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336748#ToDictionary&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;To Dictionary&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl56&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl56&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336748#OfType&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;OfType&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Element Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl57&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl57&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#FirstSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;First - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl58&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl58&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#FirstIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;First - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl59&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl59&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#FirstOrDefaultSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;FirstOrDefault - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl60&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl60&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#FirstOrDefaultCondition&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;FirstOrDefault - Condition&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl61&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl61&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#FirstOrDefaultIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;FirstOrDefault - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl62&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl62&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336750#aa336750#&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;ElementAt&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Generation Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl63&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl63&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336752.aspx#range&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Range&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl64&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl64&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336752.aspx#repeat&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Repeat&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Quantifiers&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl65&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl65&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#anySimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Any - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl66&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl66&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#anyIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Any - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl67&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl67&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#anyGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Any - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl68&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl68&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#allSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;All - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl69&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl69&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#allIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;All - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl70&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl70&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336759.aspx#allGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;All - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;&lt;div class=&quot;RightCol&quot; style=&quot;padding-left: 20px; &quot;&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Aggregate Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl71&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl71&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#countSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Count - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl72&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl72&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#countConditional&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Count - Conditional&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl73&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl73&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#CountIndexed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Count - Indexed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl74&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl74&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#countNested&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Count - Nested&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl75&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl75&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#countGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Count - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl76&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl76&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#sumSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Sum - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl77&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl77&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#sumProjection&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Sum - Projection&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl78&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl78&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#sumGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Sum - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl79&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl79&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#minSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Min - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl80&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl80&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#minProjection&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Min - Projection&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl81&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl81&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#minGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Min - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl82&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl82&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#minElements&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Min - Elements&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl83&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl83&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Max - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl84&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl84&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxProjection&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Max - Projection&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl85&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl85&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Max - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl86&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl86&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#maxElements&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Max - Elements&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl87&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl87&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#avgSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Average - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl88&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl88&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#avgProjection&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Average - Projection&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl89&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl89&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#avgGrouped&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Average - Grouped&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl90&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl90&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#foldSimple&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Fold - Simple&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl91&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl91&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336747#foldSeed&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Fold - Seed&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Miscellaneous Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl92&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl92&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336755#Concat1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Concat - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl93&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl93&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336755#concat2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Concat - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl94&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl94&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336755#equalAll1&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;EqualAll - 1&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl95&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl95&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336755#equalAll2&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;EqualAll - 2&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Custom Sequence Operators&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl96&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl96&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336749#combine&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Combine&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-weight: 700; font-size: 115%; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; &quot;&gt;Query Execution&lt;/h3&gt;&lt;ul class=&quot;bulletedlist&quot; style=&quot;list-style-position: outside; list-style-type: disc; list-style-image: url(http://i3.msdn.microsoft.com/Platform/MasterPages/MsdnPage/bullet.gif); padding-left: 18px; line-height: 100%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl97&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl97&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336751#Deferred&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Deferred&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl98&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl98&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336751#Immediate&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Immediate&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li style=&quot;padding-left: 0px; line-height: 140%; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; &quot;&gt;&lt;a id=&quot;ctl00_mainContentContainer_ctl99&quot; onclick=&quot;javascript:Track(&#39;ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl99&#39;,this);&quot; href=&quot;http://msdn.microsoft.com/en-us/vcsharp/aa336751#QueryReuse&quot; style=&quot;text-decoration: none; color: rgb(0, 51, 204); &quot;&gt;Query Reuse&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/739912738900478836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/739912738900478836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/739912738900478836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/739912738900478836'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/03/101-linq-samples.html' title='101 LINQ Samples'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8613785.post-2436278228733133910</id><published>2009-03-21T13:59:00.003+00:00</published><updated>2009-03-21T14:20:34.463+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".NET"/><category scheme="http://www.blogger.com/atom/ns#" term="GIS"/><title type='text'>Virtual Earth Silverlight Map Control CTP</title><content type='html'>The long anticipated Silverlight control for Virtual Earth took a step closer yesterday with the release of a very mature CTP. The experience is nearly identical to the old HTML map (which they call the AJAX map), but with the smoothness of Silverlight&#39;s DeepZoom. They also have an interactive SDK, just like the old one, with clear migration hints.&lt;br /&gt;&lt;br /&gt;The really exciting thing about it is the fact that you can render any aribtrary Silverlight XAML on top of the map. This opens up Google Earth quality content in a browser, which raises the stakes yet again in the GIS war. Add this to the &lt;a href=&quot;http://gigaom.com/2009/03/13/at-sxsw-location-awareness-is-the-new-black/&quot;&gt;location awareness zeitgeist&lt;/a&gt; and we have some interesting times ahead.&lt;br /&gt;&lt;br /&gt;I&#39;m still confused about how they plan to maintain both the Silverlight and VE3D platforms. Is the goal ultimately a single platform? Given that one is based on managed DirectX and one is based on the Silverlight XAML subset (which doesn&#39;t do 3D), I can see no technical middle ground. Perhaps they will harmonize the SDK&#39;s to make it easy to write for both, but not knowing which to bet on makes me uncomfortable.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://sharepoint.connect.microsoft.com/silverlightmapcontrolctp/iSDK/default.htm&quot;&gt;Interactive SDK&lt;/a&gt; (you probably need to register with Microsoft Connect)&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/virtualearth/archive/2009/03/20/mix-day-2-the-guys-who-make-virtual-earth-light-up-silver.aspx&quot;&gt;Chris Pendleton @ MIX with the nerds wot wrote it&lt;/a&gt;. Some nice examples of the free-form XAML layering.</content><link rel='replies' type='application/atom+xml' href='http://rupertrawnsley.blogspot.com/feeds/2436278228733133910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8613785/2436278228733133910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2436278228733133910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8613785/posts/default/2436278228733133910'/><link rel='alternate' type='text/html' href='http://rupertrawnsley.blogspot.com/2009/03/virtual-earth-silverlight-map-control.html' title='Virtual Earth Silverlight Map Control CTP'/><author><name>Rupert</name><uri>http://www.blogger.com/profile/07338870148803242763</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzOBdSG6c8CnilebQZJ698D1kjxlo-aoffR-tOgSIBSCGzjVScgu7KRcDWf0bFWu04xYLid_GqiF0rNoIOTBFG6b2FQXd3z6gc0ttEXw0VhV4WqbErQKlYj3kn7gUBfrY/s220/engineer.jpg'/></author><thr:total>0</thr:total></entry></feed>