<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex James Brown</title>
	<atom:link href="http://www.alexjamesbrown.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexjamesbrown.com</link>
	<description>My Words. By Me.</description>
	<lastBuildDate>Sun, 28 Feb 2010 14:46:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facebook notification spam &#8211; someone &#8221;likes&#8221; your photo</title>
		<link>http://www.alexjamesbrown.com/geek/web/facebook-notification-spam-someone-likes-your-photo/</link>
		<comments>http://www.alexjamesbrown.com/geek/web/facebook-notification-spam-someone-likes-your-photo/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 14:46:37 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/web/facebook-notification-spam-someone-likes-your-photo/</guid>
		<description><![CDATA[Recently, a lot of people have&#160; been “liking” my photos.
Unfortunately, the notifications are sent out by various versions of a new form of Facebook spam application.

Clicking on “your photo” – in a hope to see which photo this person liked, takes you to a page where you’re asked to allow an application access to various [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, a lot of people have&#160; been “liking” my photos.</p>
<p>Unfortunately, the notifications are sent out by various versions of a new form of Facebook spam application.</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.alexjamesbrown.com/wp-content/uploads/Facebooknotificationspamsomeonelikesyour_CF58/image.png" width="475" height="86" /></p>
<p>Clicking on “your photo” – in a hope to see which photo this person liked, takes you to a page where you’re asked to allow an application access to various parts&#160; of your profile:</p>
<blockquote><p>“Allowing Lika access will let it access your Profile information, photos, your friends&#8217; info and other content that it requires to work”</p>
</blockquote>
<p>This is the important part of this application – clicking on “allow” will enable the app to get access to all the information on your profile.    <br />It then sends out notifications to ALL your friends, that you “liked” one of their photos.</p>
<p>Presumably, it is also sending all your information to the developer. This could be anything from your profile – work information, contact info, address, photos – anything.</p>
<p>One way to check if a notification you have received is genuine is to hover over “your photo”</p>
<p> <a href="http://www.alexjamesbrown.com/wp-content/uploads/Facebooknotificationspamsomeonelikesyour_CF58/scr.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Hover over &quot;your photo&quot; and check the link location" border="0" alt="Hover over &quot;your photo&quot; and check the link location" src="http://www.alexjamesbrown.com/wp-content/uploads/Facebooknotificationspamsomeonelikesyour_CF58/scr_thumb.png" width="488" height="480" /></a>
<p>Unless the link is something similar to: <a href="http://www.facebook.com/photo.php?pid=12345">http://www.facebook.com/photo.php?pid=12345</a> then it’s a fake.</p>
<p>The names are usually something like “Like” or “Lika” or something along those lines, to fool you into thinking they are genuine, Facebook features.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/web/facebook-notification-spam-someone-likes-your-photo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Implementing DataCash 3D Secure with ASP.net</title>
		<link>http://www.alexjamesbrown.com/geek/implementing-datacash-3d-secure-with-asp-net/</link>
		<comments>http://www.alexjamesbrown.com/geek/implementing-datacash-3d-secure-with-asp-net/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 13:04:50 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geek Speak]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[datacash]]></category>
		<category><![CDATA[payment processing]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/?p=446</guid>
		<description><![CDATA[This is an article I’ve been meaning to write for a while now…
Mainly, to help others out, who are struggling with the near non-existent documentation provided by Datacash, when trying to plug 3D Secure into my ASP.net application.
I’m sure you’re already familiar with what 3D Secure is, so I won’t go in to too much [...]]]></description>
			<content:encoded><![CDATA[<p>This is an article I’ve been meaning to write for a while now…</p>
<p>Mainly, to help others out, who are struggling with the near non-existent documentation provided by Datacash, when trying to plug 3D Secure into my ASP.net application.</p>
<p>I’m sure you’re already familiar with what 3D Secure is, so I won’t go in to too much detail, nor will I go into much detail with regards to the process.</p>
<p>The purpose of this article is to get you familiar with <em>how</em> to send the details to the DataCash MPI, receive a response, and display and use the 3D Secure window in an iFrame (or framed window for that matter)</p>
<p><strong>Please note:</strong>     <br /><small>This code is for tutorial purposes only. It’s dirty, crude, buggy, and not refactored in any way shape or form.      <br />I simplified the code down to bare bones, in order to better explain each element.       <br />Obviously, it comes without warranty… it <em>should</em> work as expected, but has no logging, error trapping or any of that good stuff… and when dealing with online payments, you really should take more care!</small></p>
<h3>Download</h3>
<p><small><a href="http://www.alexjamesbrown.com/wp-content/uploads/datacash-3d-secure-aspnet.zip" target="_blank"><img style="border-right-width: 0px; margin: 0px 20px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="zip-icon" border="0" alt="zip-icon" align="left" src="http://www.alexjamesbrown.com/wp-content/uploads/zipicon.png" width="64" height="64" /></a></small></p>
<p>I’ve made the entire source code for this tutorial available for download.    <br /><strong>You will need to edit the web.config to add your own VTID and Password</strong></p>
<p>&#160; </p>
<p>&#160;</p>
<h3>Donate</h3>
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=MVCXSJJ3QU4QJ"><img style="border-right-width: 0px; margin: 0px 25px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="btn_donate_SM" border="0" alt="btn_donate_SM" align="left" src="http://www.alexjamesbrown.com/wp-content/uploads/btn_donate_SM.gif" width="74" height="21" /></a>I don’t normally do this, but this article took me literally months to pull together, so any small contribution would be gratefully received!</p>
<hr />
<h3>Payment Page</h3>
<p>This is the functionality that processes payment – for example, allows the customer to enter their credit card details etc…</p>
<p>The mark-up is fairly straight forward.</p>
<p>Two things to note are the body, and the form tag:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:7d75b244-4982-4b8d-8e96-3252c9ba47d4" class="wlWriterEditableSmartContent">
<pre class="brush: html;gutter:false;">&lt;body id="myBody" runat="server"&gt;</pre>
</div>
<p>Note that the body tag is runat server</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:ac099dd2-16bb-4b04-876a-bbab2120f540" class="wlWriterEditableSmartContent">
<pre class="brush: html;">&lt;form id="MainForm" runat="server"&gt;</pre>
</div>
<p>Note that&#160; the name is “MainForm” – we will need this later.</p>
<p>Since in this tutorial, I’m showing how to use an iFrame, I have this bit of code, below the payBtn:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:96b8b4de-8ed1-466e-a96a-eae91bbac7c0" class="wlWriterEditableSmartContent">
<pre class="brush: html;">&lt;asp:Panel ID="ACSFramePanel" runat="server" Visible="false"&gt;
    Please verify.....&lt;br /&gt;
    &lt;br /&gt;
    &lt;iframe src="" name="ACSFrame" width="450" height="400" frameborder="0" /&gt;
&lt;/asp:Panel&gt;</pre>
</div>
<p>Line 4 of the above is basically where the 3D Secure frame will appear. </p>
<p>I wrapped it in a Panel, so that we can hide it, while the customer enters their card details etc…</p>
<p>Now, let’s look at some of the code-behind:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:9d579870-6811-41e9-84cd-cfa0b002c557" class="wlWriterEditableSmartContent">
<pre class="brush: c#;gutter:false;">private Config config;
private Agent agent;

//this would be our order id / reference in production
private string ourReference = Guid.NewGuid().ToString("n").Substring(0, 8);

protected void Page_Load(object sender, EventArgs e)
{
    config = new Config(AppDomain.CurrentDomain.BaseDirectory + "datacash.conf"); // would probably need to come from web.config
    agent = new Agent(config);
}</pre>
</div>
<p>In the above code, Config and Agent are both DataCash objects.</p>
<p>In the Page_Load event, we basically set these two objects up. </p>
<p><strong>config</strong> is set from an xml file (located in the project root) called datacash.conf – this can of course be located anywhere you like (and called anything you like)</p>
<p><strong>agent </strong>is then set using the defined config object.</p>
<p>The config file looks like this:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:7a7934e7-9600-4fd7-855e-b419ce39b6e1" class="wlWriterEditableSmartContent">
<pre class="brush: xml;">&lt;Configuration&gt;
  &lt;logfile&gt;datacash.log&lt;/logfile&gt;
  &lt;logging&gt;5&lt;/logging&gt;
  &lt;Obscure&gt;
    &lt;element&gt;Transaction.CardTxn.Card.pan&lt;/element&gt;
    &lt;element&gt;Authentication.password&lt;/element&gt;
    &lt;element&gt;Transaction.CardTxn.Card.Cv2Avs.cv2&lt;/element&gt;
  &lt;/Obscure&gt;

  &lt;!--this would be for the live server--&gt;
  &lt;!--&lt;host&gt;https://mars.transaction.datacash.com/Transaction&lt;/host&gt;--&gt;

  &lt;host&gt;https://testserver.datacash.com/Transaction&lt;/host&gt;
  &lt;port&gt;443&lt;/port&gt;
  &lt;timeout&gt;90&lt;/timeout&gt;
  &lt;setstrict&gt;true&lt;/setstrict&gt;
&lt;/Configuration&gt;</pre>
</div>
<p>Of course, this doesn’t <em>have</em> to be done in Page_Load – in “the real world” this would all be part of a payment helper class. But for demo purposes, it’s fine in the Page_Load – just means we have to repeat ourselves on other pages…</p>
<p>Next, we assume the user fills out the form, and presses the Pay button.</p>
<h3>Sending the request to DataCash</h3>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:70927f2e-1586-44d7-b726-492244b19839" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">protected void payBtn_Click(object sender, EventArgs e)
{
    //so they don't press the button twice.
    payBtn.Enabled = false;

    //get browser info (for 3d secure stuff)
    var browser = Request.Browser.Browser;

    var request = buildAuthDataCashDocument(
        ourReference,
        cardNumber.Text,
        expiryMonth.Text,
        expiryYear.Text,
        startMonth.Text,
        startYear.Text,
        issueNumber.Text,
        secCode.Text,
        billingAddress1.Text,
        billingAddress2.Text,
        billingAddress3.Text,
        billingAddress4.Text,
        billingAddressPostCode.Text,
        browser);

    //send the request document to the agent.
    //todo: could implement some kind of error trapping / retry here
    var authResponse = agent.send(request);

    //get the datacash transaction reference (just in case we need to try authorizing the payment without 3D Secure)
    var datacashRef = authResponse.get("Response.datacash_reference");

    //get the response code
    var responseCode = authResponse.get("Response.status");</pre>
</div>
<p>This code basically generates a XML document with the payment authorisation request, and submits it to DataCash.</p>
<p>I refactored buildAuthDataCashDocument as it was pretty large, and made the code a bit <em>too</em> dirty, even for this demo!</p>
<p>Couple of bits of note within buildAuthDataCashDocument are:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:92195863-b627-45d8-8274-dcdd31f2f398" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">request.set("Request.Authentication.client", ConfigurationManager.AppSettings["DataCashVtid"]);
request.set("Request.Authentication.password", ConfigurationManager.AppSettings["DataCashPassword"]);</pre>
</div>
<p>This basically sets the VTID and Password from config (in our case, web.config) which looks like:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:743dd9b9-cb9e-45f3-9bba-b8dbdacea55b" class="wlWriterEditableSmartContent">
<pre class="brush: xml;gutter:false;auto-links:false;toolbar:false;">&lt;appSettings&gt;
   &lt;add key="DataCashVtid" value="99******"/&gt;
   &lt;add key="DataCashPassword" value="bK*******"/&gt;
&lt;/appSettings&gt;</pre>
</div>
<p>Also, within buildAuthDataCashDocument is:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:ba0eea11-83e7-4a76-a8b2-ea01e37e0a16" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">request.set("Request.Transaction.TxnDetails.ThreeDSecure.verify", "yes");
request.set("Request.Transaction.TxnDetails.ThreeDSecure.merchant_url", "www.crocus.co.uk"); //or whatever brand??
request.set("Request.Transaction.TxnDetails.ThreeDSecure.purchase_desc", "Items from Crocus"); //or some other short sumary
request.set("Request.Transaction.TxnDetails.ThreeDSecure.purchase_datetime", DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));</pre>
</div>
<p>This is important, for 3D Secure – Fairly self explanatory.</p>
<p>After building our request Document, we need to send it to DataCash, and get another Document back – as a response.</p>
<p>To do that, it’s as simple as:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:3b400216-b10c-4c70-9f9e-70de0fb42ed8" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">var authResponse = agent.send(request);</pre>
</div>
<p>This sets authResponse to the response Document.</p>
<p>We can then use the .get() method on authResponse to retrieve elements from it.</p>
<p>We are most interested in <strong>Response.datacash_reference</strong> and <strong>Response.status</strong></p>
<p>The datacash_reference is unique to each and every transaction processed, so it is useful for later things like refunds, reporting etc…</p>
<p><strong>Response.status</strong> is the DataCash status code for this transaction.</p>
<p>It’s from this, that we determine how to proceed.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:f4723877-35f9-4bdd-8302-1063ae5132ef" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">switch (responseCode)
{
    //handle 3DS error responses....`
    //Basically, if it's one of these, the transaction is screwed, and shouldn't proceed....
    case "151": 		//	3DS Invalid Transaction type
    case "152": 		//	3DS Manual Authorization not supported
    case "153": 		//	3DS verify element missing
    case "154": 		//	3DS Invalid verify value
    case "155": 		//	3DS field missing
    case "156": 		//	3DS Invalid Browser.device_category
    case "157": 		//	3DS Merchant not enabled
    case "159": 		//	3DS No VERes from DS
    case "160": 		//	3DS Invalid VERes from DS
    case "161": 		//	3DS call auth centre

        //log the error here
        break; //- throw them out of transaction process. Should redirec

    case "56": //speed limit - too many transactions on that card number in short space of time
        break;

    //3ds payer verification required....
    case "60":
    case "150":
        show3DSIframe(authResponse);
        Response.Clear();
        break;
}</pre>
</div>
<p>I won’t go in to too much detail, as the comments kind of speak for themselves… </p>
<p>Basically, if you get a <strong>60</strong> or <strong>150</strong> then the transaction requires you to show the 3D Secure window.</p>
<h3>Showing the 3D Secure iFrame</h3>
<p>I’ll spend a bit of time on show3DSIframe, as this is the part that caused me the most hassle – How to actually display the ACS in an iFrame, especially in ASP.net</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:9e0de2a7-e98d-4c1f-a437-543c2c652fee" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">private void show3DSIframe(Document doc)
{
    ACSFramePanel.Visible = true;

    //this is the data cash reference number for this transaction
    var dataCashReference = doc.get("Response.datacash_reference");

    //this is the url of the ACS - the page generated by the bank, that contains the
    //boxes where the customer enters information etc...
    var acsUrl = doc.get("Response.CardTxn.ThreeDSecure.acs_url");

    //this is a long message / code that is generated for the transaction
    var pareq = doc.get("Response.CardTxn.ThreeDSecure.pareq_message");</pre>
</div>
<p>Ok, so in the markup from Part 1, you may remember I wrapped the iFrame in a Panel, called ACSFRamePanel. Now, we need to set the visibility to true.</p>
<p>These first few lines are self explanatory – we need to get the <strong>dataCashReference</strong>, <strong>acsUrl</strong> (the URL of the 3D Secure page – this is usually returned by the customers issuing bank) and the <strong>pareq</strong> – this is a long string, that&#8217;s a bit like a password for the transaction.</p>
<p>These elements are retrieved from the passed in DataCash Document.</p>
<p>We then need to create our Term URL – This is basically a URL that the 3D Secure window POSTs back to:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:46726e71-84a2-4bfc-9dff-92a39d65f426" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">var termUrlPrefix = Request.ServerVariables["HTTPS"] == "ON" ? "https://" : "http://";

//termUrl is where the ACS page posts back to.
var termUrl = string.Format("{0}{1}",
    termUrlPrefix,
    Request.Url.Authority + "/3DSResponse.aspx");</pre>
</div>
<p>In our demo case, it’s just on our local host machine – this could however, for example, be something like <em>www.myUrl.com/checkout/3DSresponse.aspx</em></p>
<p>This next part is the important part.</p>
<p>This set’s the required hidden fields (PaReq and TermUrl) on our form. </p>
<p>We then register another hidden form &#8211; “MD” – This is <strong>our</strong> order number / reference for this transaction – so we can retrieve it from our database, and update the status when we come out the other side of 3D Secure.</p>
<p>The next line generates a little bit of JavaScript that basically causes this form to submit itself to the acs url.</p>
<p>The result of this, is then output to the target (parameter 3 in our string.format) – ACSFrame.</p>
<p><small><strong>Remember we called our form “MainForm”</strong></small> <img src='http://www.alexjamesbrown.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Then, myBody.Attributes.Add inserts the resulting JavaScript to the onLoad function of our body tag. </p>
<p><small><strong>Remember we made runat server earlier</strong></small></p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:d448a460-0b9a-4864-a1b7-a74bfee554e9" class="wlWriterEditableSmartContent">
<pre class="brush: c#;">//ClientScript.RegisterHiddenField adds a hidden field to the form...
ClientScript.RegisterHiddenField("PaReq", pareq);
ClientScript.RegisterHiddenField("TermUrl", termUrl);

//this is the data cash reference, and our reference -
//so we can update the order on the other side of the verification (paid, failed etc...)
ClientScript.RegisterHiddenField("MD", dataCashReference + "|" + ourReference);

var js = string.Format("javascript: document.{0}.action='{1}'; document.{2}.target=\"{3}\"; document.{4}.submit();",
    MainForm.ID,
    acsUrl,
    MainForm.ID,
    "ACSFrame",
    MainForm.ID
);

//since the body tag of this page is called myBody, and is runat=server, we can access
//it here, and inject our javascript.
myBody.Attributes.Add("onLoad", js);</pre>
</div>
<p>And there we have it – the 3D Secure window is displayed in an iFrame</p>
<p>I’ll edit this post with a link to 3DSResponse.aspx when I finish that article…</p>
<p>Hope this helps! Feel free to <img src='http://www.alexjamesbrown.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  </p>
<p><img style="border-right-width: 0px; margin: 0px 25px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="btn_donate_SM" border="0" alt="btn_donate_SM" src="http://www.alexjamesbrown.com/wp-content/uploads/btn_donate_SM1.gif" width="74" height="21" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/implementing-datacash-3d-secure-with-asp-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Outlook &#8211; Error with PDF Preview Handler for Vista</title>
		<link>http://www.alexjamesbrown.com/geek/software/outlook-error-with-pdf-preview-handler-for-vista/</link>
		<comments>http://www.alexjamesbrown.com/geek/software/outlook-error-with-pdf-preview-handler-for-vista/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 23:32:27 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[outlook]]></category>
		<category><![CDATA[windows 7]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/software/outlook-error-with-pdf-preview-handler-for-vista/</guid>
		<description><![CDATA[Up until a few moments ago, I was unable to preview PDF files in emails in Outlook using Windows 7 64bit.
The problem is that Adobe have not updated their installer of Adobe PDF reader to allow the correct values to be set in the registry.
However, there is a fix.
I came across this:
http://www.pretentiousname.com/adobe_pdf_x64_fix/index.html
 It worked great!
]]></description>
			<content:encoded><![CDATA[<p>Up until a few moments ago, I was unable to preview PDF files in emails in Outlook using Windows 7 64bit.</p>
<p>The problem is that Adobe have not updated their installer of Adobe PDF reader to allow the correct values to be set in the registry.</p>
<p>However, there is a fix.</p>
<p>I came across this:</p>
<p><a title="http://www.pretentiousname.com/adobe_pdf_x64_fix/index.html" href="http://www.pretentiousname.com/adobe_pdf_x64_fix/index.html">http://www.pretentiousname.com/adobe_pdf_x64_fix/index.html</a></p>
<p> It worked great!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/software/outlook-error-with-pdf-preview-handler-for-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to view Experts Exchange answers</title>
		<link>http://www.alexjamesbrown.com/geek/web/how-to-view-experts-exchange-answers/</link>
		<comments>http://www.alexjamesbrown.com/geek/web/how-to-view-experts-exchange-answers/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 10:27:45 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[forums]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/web/how-to-view-experts-exchange-answers/</guid>
		<description><![CDATA[I’m sure anyone that’s searched for solutions in Google, has fallen victim to the search engine reuslt pollution Experts Exchange employs…
They always seem to title their results, with EXACTLY what you are looking for.
When you click on it, you’re told that to view the solution, you need to sign up. Which costs money…   [...]]]></description>
			<content:encoded><![CDATA[<p>I’m sure anyone that’s searched for solutions in Google, has fallen victim to the search engine reuslt pollution Experts Exchange employs…</p>
<p>They <em>always </em>seem to title their results, with EXACTLY what you are looking for.</p>
<p>When you click on it, you’re told that to view the solution, you need to sign up. Which costs money…   <br />Sure, there is a free trial available… but who really wants that?</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="experts-exchange-google-search" border="0" alt="experts-exchange-google-search" src="http://www.alexjamesbrown.com/wp-content/uploads/expertsexchangegooglesearch.png" width="480" height="412" /> </p>
<p>Well… the answers are indeed, freely available.</p>
<p>This is a condition of appearing in Google search results.   <br />However, a slight black-hat trick is, that they’re not visible to Joe Public. Only to search engines…</p>
<p>You can fool the site into thinking you are a search engine, by simply copying the full experts-exchange URL from your browser, for example:</p>
<p><a title="http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_22634999.html" href="http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_22634999.html">http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_22634999.html</a></p>
<p>And pasting that into the Google search box:</p>
<p>  <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="google-search-experts-exchange-url" border="0" alt="google-search-experts-exchange-url" src="http://www.alexjamesbrown.com/wp-content/uploads/googlesearchexpertsexchangeurl.png" width="481" height="186" />
</p>
<p>The first search result, will be a link to that URL, via Google.</p>
<p>Click that, and it will show you the answers! Nothing illegal, just exposing Experts Exchange black hat techniques <img src='http://www.alexjamesbrown.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/web/how-to-view-experts-exchange-answers/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fixing &#8211; Log Reader Performance : Critical (Seen in SQL Replication Monitor)</title>
		<link>http://www.alexjamesbrown.com/geek/databases/sql/sql-replication-monitor-performance-critical/</link>
		<comments>http://www.alexjamesbrown.com/geek/databases/sql/sql-replication-monitor-performance-critical/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 23:49:51 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL replication]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/databases/sql/sql-replication-monitor-performance-critical/</guid>
		<description><![CDATA[I ran into a problem with a Transactional Publication today.
I’d moved the database from old hardware, to newer hardware, and in the process, restored the SQL 2000 database onto SQL 2008 (running in SQL 2000 compatibility mode)
I’d re-created the publication, and initialized it.
After about half an hour, I checked the Replication Monitor, and noticed that [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into a problem with a Transactional Publication today.</p>
<p>I’d moved the database from old hardware, to newer hardware, and in the process, restored the SQL 2000 database onto SQL 2008 (running in SQL 2000 compatibility mode)</p>
<p>I’d re-created the publication, and initialized it.</p>
<p>After about half an hour, I checked the Replication Monitor, and noticed that it said:</p>
<blockquote><p>Performance : Critical</p>
</blockquote>
<p><font size="1">Unfortunately, I don’t have a screenshot <img src='http://www.alexjamesbrown.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </font></p>
<p>Latency was also somewhere in the mid 40’s</p>
<p>I noticed that my recovery mode was FULL.</p>
<p>I changed this to BULK LOGGED, re-initialized replication, and this dramatically reduced the latency – down to 0.0 in fact!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/databases/sql/sql-replication-monitor-performance-critical/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP Virtual Machine &#8211; no network adapter / missing driver?</title>
		<link>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver-2/</link>
		<comments>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver-2/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 15:28:03 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geek Speak]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/?p=433</guid>
		<description><![CDATA[After creating a new Windows XP Virtual Machine, on VMWare Server, I noticed it had no network adapter.
It was an “unknown device” in Device Manager!
I installed VMWare tools, to no avail.
After painstaikingly thrashing about with my settings in VMWare Server, I took a look at my vmx file (located in the same directory as my [...]]]></description>
			<content:encoded><![CDATA[<p>After creating a new Windows XP Virtual Machine, on VMWare Server, I noticed it had no network adapter.<br />
It was an “unknown device” in Device Manager!</p>
<p>I installed VMWare tools, to no avail.</p>
<p>After painstaikingly thrashing about with my settings in VMWare Server, I took a look at my vmx file (located in the same directory as my virtual hard disks etc…)</p>
<p>It appears I had set the guest OS as Windows XP x64, when in actual fact, I had installed x32 version.</p>
<p>I changed this in my vmx file, and after reading <a href="http://communities.vmware.com/thread/105104" target="_blank">this forum thread</a>, deleted the following line:</p>
<blockquote><p>ethernet0.virtualDev = &#8220;e1000&#8243;</p></blockquote>
<p>Voila! It worked!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP Virtual Machine &#8211; no network adapter / missing driver?</title>
		<link>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver/</link>
		<comments>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 15:24:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Geek Speak]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver/</guid>
		<description><![CDATA[After creating a new Windows XP Virtual Machine, on VMWare Server, I noticed it had no network adapter.    It was an “unknown device” in Device Manager!
I installed VMWare tools, to no avail.
After painstaikingly thrashing about with my settings in VMWare Server, I took a look at my vmx file (located in the [...]]]></description>
			<content:encoded><![CDATA[<p>After creating a new Windows XP Virtual Machine, on VMWare Server, I noticed it had no network adapter.    <br />It was an “unknown device” in Device Manager!</p>
<p>I installed VMWare tools, to no avail.</p>
<p>After painstaikingly thrashing about with my settings in VMWare Server, I took a look at my vmx file (located in the same directory as my virtual hard disks etc…)</p>
<p>It appears I had set the guest OS as Windows XP x64, when in actual fact, I had installed x32 version.</p>
<p>I changed this in my vmx file, and after reading <a href="http://communities.vmware.com/thread/105104" target="_blank">this forum thread</a>, deleted the following line:</p>
<blockquote><p>ethernet0.virtualDev = &quot;e1000&quot;</p>
</blockquote>
<p>Voila! It worked!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/windows-xp-virtual-machine-no-network-adapter-missing-driver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixing  &#8216;Windows Could not determine if this computer contains a valid system volume&#8217; when installing Windows 2008</title>
		<link>http://www.alexjamesbrown.com/geek/windows/fixing-windows-could-not-determine-if-this-computer-contains-a-valid-system-volume-when-installing-windows-2008/</link>
		<comments>http://www.alexjamesbrown.com/geek/windows/fixing-windows-could-not-determine-if-this-computer-contains-a-valid-system-volume-when-installing-windows-2008/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 12:40:25 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[Windows Server 2008]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/windows/fixing-windows-could-not-determine-if-this-computer-contains-a-valid-system-volume-when-installing-windows-2008/</guid>
		<description><![CDATA[I was trying to install Windows Server 2008 Standard x64 on one of our servers, intended to be an internal SQL database server.    It’s equipped with a 3Ware 9650SE 8LPML RAID controller. It has 8x 250gb hard drives.     I’d set up 2 units:

RAID 0 (Stripe) – For the [...]]]></description>
			<content:encoded><![CDATA[<p>I was trying to install Windows Server 2008 Standard x64 on one of our servers, intended to be an internal SQL database server.    <br />It’s equipped with a 3Ware 9650SE 8LPML RAID controller. It has 8x 250gb hard drives.     <br />I’d set up 2 units:</p>
<ul>
<li>RAID 0 (Stripe) – For the OS (2 drives) </li>
<li>RAID 10 (6 drives) </li>
</ul>
<p>I downloaded the drivers from the <a href="http://www.3ware.com/support/download.asp" target="_blank">3Ware website</a>, and put them on a USB flash drive.     <br />I should point out at this point, that the download is circa 50mb – the actual drivers are only about 150kb… the rest is a .exe file used for upgrading drivers on an existing system.</p>
<p>You then go through the setup screens, and clicked Load Drivers where you are supposed to select a drive to install on. It finds the USB drive, select the drive… all seems ok so far.</p>
<p>Upon selecting the smaller of the 2 units (my RAID 0 stripe) and pressing next, I got a screen saying:</p>
<blockquote><h5>Windows Could not determine if this computer contains a valid system volume</h5>
</blockquote>
<p>Uh oh!</p>
<p>After much <a href="http://www.google.co.uk/search?q=Windows+Could+not+determine+if+this+computer+contains+a+valid+system+volume" target="_blank">Googling</a>, I found the problem was in the BIOS – and that the USB drive should be de-selected as a boot device.</p>
<p>I restarted, pressed F2 to get into the BIOS setting, and de-activated the USB drive. </p>
<p>However – this did not work! I still had the same error!</p>
<p>Here are the steps that I used to <em>finally </em>get it to work:</p>
<ol>
<li>Put driver files on USB floppy drive (not sure if this is significant, but it worked for me)      <br />Remember, the actual driver files are &lt; 200kb – it’s just the EXE file that’s large </li>
<li>Restart machine, leaving USB (floppy) plugged in </li>
<li>Enter BIOS setup – Boot sequence. </li>
<li>Deactivate USB&#160; from the Boot sequence </li>
<li>Make the 3ware RAID controller #1 in the sequence </li>
<li>Save &amp; Exit </li>
<li>Enter Windows 2008 setup again, this time, it should work </li>
</ol>
<p><font style="background-color: #fafafa">I think the key is point #5 – You MUST make the RAID controller the first in the boot sequence.</font></p>
<p><font style="background-color: #fafafa">What effect using the floppy drive had, I’m unsure. Probably nothing.</font></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/windows/fixing-windows-could-not-determine-if-this-computer-contains-a-valid-system-volume-when-installing-windows-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ass-Kissing Blog Comment Spam</title>
		<link>http://www.alexjamesbrown.com/geek/web/blogging/ass-kissing-blog-comment-spam/</link>
		<comments>http://www.alexjamesbrown.com/geek/web/blogging/ass-kissing-blog-comment-spam/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 13:20:54 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Blogging spam]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/geek/web/blogging/ass-kissing-blog-comment-spam/</guid>
		<description><![CDATA[Recently, I have been receiving a large amount of a different kind of comment spam on my Wordpress blog.
In an effort to get around the Akismet spam protection, they have created several variations of the same kind of poor English, brown nosing comments… that effectively mean nothing.
The whole point of them, is to allow their [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I have been receiving a large amount of a different kind of comment spam on my Wordpress blog.</p>
<p>In an effort to get around the <a href="http://akismet.com/" target="_blank">Akismet</a> spam protection, they have created several variations of the same kind of poor English, brown nosing comments… that effectively mean nothing.</p>
<p>The whole point of them, is to allow their URL to be posted in the “Website” field of the comment.</p>
<p>I recently had one on <a href="http://www.alexjamesbrown.com/gadgets/fitting-a-backlit-keyboard-to-a-dell-e6400/#comment-3200" target="_blank">this post</a>, to which I approved the comment, and later realised it was actually spam – so simply edited the comment, removed the URL, and left a reply underneath.</p>
<p>Here are the kind of comments (complete with spelling errors and bad English)</p>
<p>I’ll edit this post when I come across some more…</p>
<blockquote><p>Advantageously, the post is really the freshest on this laudable topic. I fit in with your conclusions and will thirstily look forward to your incoming updates. Just saying thanks will not just be sufficient, for the exceptional lucidity in your writing. I will at once grab your rss feed to stay privy of any updates. Admirable work and much success in your business enterprise!</p>
</blockquote>
<blockquote><p>Considerably, the article is in reality the freshest on this worthw hile topic. I fit in with your conclusions and will eagerly look forward to your next updates. Saying thanks will not just be enough, for the great lucidity in your writing. I will right away grab your rss feed to stay privy of any updates. Fabulous work and much success in your business endeavors!</p>
</blockquote>
<blockquote><p>Comfortably, the post is really the sweetest on this noteworthy topic. I fit in with your conclusions and will eagerly look forward to your approaching updates. Just saying thanks will not just be adequate, for the wonderful lucidity in your writing. I will at once grab your rss feed to stay informed of any updates. De lightful work and much success in your business efforts!</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/web/blogging/ass-kissing-blog-comment-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter User underdog100 gets 300% increase in followers &#8211; in 10 minutes</title>
		<link>http://www.alexjamesbrown.com/geek/web-20/twitter-user-underdog100-gets-300-increase-in-followers-in-10-minutes/</link>
		<comments>http://www.alexjamesbrown.com/geek/web-20/twitter-user-underdog100-gets-300-increase-in-followers-in-10-minutes/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 23:36:37 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.alexjamesbrown.com/?p=421</guid>
		<description><![CDATA[At 23:00, Jo Combs (twitter.com/underdog100) had just 37 followers
5 minutes later, Graham Norton had featured her tweets on his show, albeit poking fun at them, but, now, her followers had swelled to 110!

Every time I hit F5, her number of followers increases
By 23:10 the count had grown to 130&#8230; around a 300% increase in 10 [...]]]></description>
			<content:encoded><![CDATA[<p>At 23:00, Jo Combs (twitter.com/underdog100) had just 37 followers<br />
5 minutes later, Graham Norton had featured her tweets on his show, albeit poking fun at them, but, now, her followers had swelled to 110!</p>
<p><a href="http://www.twitter.com/underdog100"><img title="underDog100_avatar" src="../wp-content/uploads/underDog100_avatar.jpg" alt="underDog100_avatar" width="62" height="96" /></a></p>
<p>Every time I hit F5, her number of followers increases</p>
<p>By 23:10 the count had grown to 130&#8230; around a 300% increase in 10 minutes!</p>
<p>I got bored at about 23:20, but by then, the follower count had grown to 140!<br />
Not bad!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexjamesbrown.com/geek/web-20/twitter-user-underdog100-gets-300-increase-in-followers-in-10-minutes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
