<?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>Ashley Ross • 27.am</title>
	<atom:link href="http://27.am/feed" rel="self" type="application/rss+xml" />
	<link>http://27.am</link>
	<description></description>
	<lastBuildDate>Tue, 13 Mar 2012 12:34:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>How to download .NET Reflector 6 for free</title>
		<link>http://27.am/posts/how-to-download-net-reflector-6-for-free</link>
		<comments>http://27.am/posts/how-to-download-net-reflector-6-for-free#comments</comments>
		<pubDate>Sun, 11 Mar 2012 11:37:38 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[.NET Reflector]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://27.am/?p=232</guid>
		<description><![CDATA[<p>If you like, you can skip the introduction and jump to Downloading .NET Reflector. A brief history of .NET Reflector In the beginning In case you somehow missed it, .NET Reflector is a class browser, analyzer, and decompiler for .NET &#8230; <a href="http://27.am/posts/how-to-download-net-reflector-6-for-free">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>If you like, you can <a href="#code">skip the introduction and jump to <i>Downloading .NET Reflector</i></a>.</p>
<h2>A brief history of .NET Reflector</h2>
<h3>In the beginning</h3>
<p>In case you somehow missed it, <a href="https://en.wikipedia.org/wiki/.NET_Reflector">.NET Reflector</a> is a class browser, analyzer, and decompiler for .NET assemblies. Originally created by Lutz Roeder, it proved to be an extremely useful tool, making lists such as MSDN&#8217;s <a href="http://msdn.microsoft.com/en-us/magazine/cc300497.aspx#S8">Ten Must-Have .NET Tools Every Developer Should Download Now</a>. Best of all, .NET Reflector was released to the community for free, with Roeder developing and supporting the tool for over 8 years.</p>
<h3>The downfall</h3>
<p>However, in August 2008, Red Gate Software bought .NET Reflector. At the time, Roeder was told that <q><a href="http://blog.lutzroeder.com/2008/08/future-of-net-reflector.html">Red Gate will continue to provide the free community version</a></q>. Red Gate themselves stated that <q><a href="http://www.simple-talk.com/opinion/opinion-pieces/the-future-of-reflector-/">The first thing we are doing is continuing to offer the software to the community for free downloading.</a></q> It didn&#8217;t stay that way. In February 2011, Red Gate <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13011">announced</a> that from version 7, .NET Reflector would no longer be free.</p>
<p>This might have been acceptable, but for the fact that free copies .NET Reflector <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=11047">expired after several months</a>. Upon expiry, users were prompted to update to the latest version; if they declined, .NET Reflector would simply exit, although some versions contained a time-bomb that completely deleted .NET Reflector if it was too old. Effectively, all existing free users of .NET Reflector would be forced to either stop using .NET Reflector, or pay for version 7. <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13221">The</a> <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13977">community</a> <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13883">backlash</a> <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13202">was</a> <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13287">immediate</a>.</p>
<h3>Scorched earth</h3>
<p>After two months, Red Gate finally <a href="http://www.reflector.net/2011/04/why-we-reversed-some-of-our-reflector-decision/">relented</a>, partially reversing their decision to disable the free version of .NET Reflector. However, rather than once more releasing a free community edition, they instead only enabled existing free versions of .NET Reflector to <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13384">update to a version that does not expire</a>. For those users who had a self-deleting version, Red Gate offered <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13309">no</a> <a href="http://www.red-gate.com/messageboard/viewtopic.php?t=13309">help</a>. They also offered no way for new users to download the free version of .NET Reflector.</p>
<p>To date, Red Gate&#8217;s promise of maintaining a free community version remains broken. It has been more than a year since they first announced that they were going back on their word, but nothing has changed. While there are now more alternatives to .NET Reflector than ever, it is unfortunate that this whole situation came about in the first place.</p>
<h2>A brief history of LookingGlass</h2>
<p>Like most things developers create, LookingGlass was born out of curiosity. The question: Is it possible to download .NET Reflector from Red Gate without already having a copy? After all, old versions need a way to download updates somehow. Updating an old copy of .NET Reflector while running <a href="https://www.wireshark.org/">Wireshark</a> quickly provided the answer: .NET Reflector makes two HTTP requests to Red Gate&#8217;s servers, the first to determine the URL of the update, and the second to actually download it.</p>
<p>LookingGlass is a small program that reproduces .NET Reflector&#8217;s requests to Red Gate&#8217;s servers and saves the result to a file. A few hacks were necessary to perfectly emulate how .NET Reflector makes its HTTP requests (See line 87), including not reusing the HTTP connection despite the Keep-Alive headers (.NET Reflector&#8217;s built-in updater launches as a separate process). From Red Gate&#8217;s side, it should be impossible to tell the difference between the two.</p>
<h2>Downloading .NET Reflector<a name="code"></a></h2>
<p>Simply save the below code as a file (For example, <i>LookingGlass.cs</i>), compile it and run the resulting program. It will save the downloaded file to the same directory as the program itself. If necessary, you can download <a href="https://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express">Visual C# Express</a> for free, or use the <a href="http://msdn.microsoft.com/en-us/library/78f4aasd.aspx">C# compiler (csc.exe)</a> that is included with every version of the .NET framework to compile this code. LookingGlass should work perfectly on .NET 2.0 and above.</p>
<p></p><pre class="crayon-plain-tag">using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Reflection;

namespace LookingGlass
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                QueryDownloadUrl(@&quot;http://reflector.red-gate.com/Reflector.version&quot;);
            else
                Download(args[0]);
        }

        static void QueryDownloadUrl(string versionUrl)
        {
            Console.WriteLine(&quot;Phase 1: Getting download URL...&quot;);

            HttpWebRequest request = GetHttpWebRequest(versionUrl);
            string downloadUrl = null;
            string data;

            using (WebResponse response = request.GetResponse())
            {
                data = ReadResponse(response);

                foreach (string line in data.Split('\n'))
                {
                    if (line.StartsWith(&quot;http&quot;, StringComparison.OrdinalIgnoreCase))
                    {
                        // If this version number stops working, search for other known .NET Reflector version numbers; Red Gate's own forums mention a few
                        downloadUrl = line.Trim('\r').Replace(&quot;{Client}&quot;, &quot;Reflector&quot;).Replace(&quot;{Version}&quot;, &quot;6.1.0.11&quot;);
                        break;
                    }
                }
            }

            if (downloadUrl == null)
            {
                Console.WriteLine(&quot;Failed to find download URL. Returned data was:&quot;);
                Console.WriteLine(data);
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine(&quot;Launching download process...&quot;);
                Process.Start(Process.GetCurrentProcess().MainModule.FileName, downloadUrl);
                Console.WriteLine(&quot;Phase 1 complete.&quot;);
            }
        }

        static void Download(string downloadUrl)
        {
            Console.WriteLine(&quot;Phase 2: Downloading...&quot;);

            HttpWebRequest request = GetHttpWebRequest(downloadUrl);
            string path;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                path = GetDownloadFilename(response);

                if (response.StatusCode == HttpStatusCode.OK &amp;&amp; !string.IsNullOrEmpty(path))
                {
                    Console.WriteLine(&quot;Saving to {0}...&quot;, path);
                    SaveResponse(response, path);
                    Console.WriteLine(&quot;Done!&quot;);
                }
                else
                {
                    Console.WriteLine(&quot;Download failed; server returned status code {0}. Returned data was:&quot;, response.StatusCode);
                    Console.WriteLine(ReadResponse(response));
                    Console.ReadLine();
                }
            }
        }

        static HttpWebRequest GetHttpWebRequest(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add(&quot;Cache-Control: no-cache, no-store, max-age=0&quot;);
            // Emulate the manner in which the headers are handled
            FieldInfo usesProxySemantics = typeof(ServicePoint).GetField(&quot;m_ProxyServicePoint&quot;, BindingFlags.NonPublic | BindingFlags.Instance);
            usesProxySemantics.SetValue(request.ServicePoint, true);
            return request;
        }

        static string GetDownloadFilename(HttpWebResponse response)
        {
            string contentDisposition = response.Headers[&quot;content-disposition&quot;];

            if (string.IsNullOrEmpty(contentDisposition))
                return null;

            string filenameField = &quot;filename=&quot;;
            int index = contentDisposition.IndexOf(filenameField, StringComparison.CurrentCultureIgnoreCase);

            if (index &lt; 0)
                return null;

            return contentDisposition.Substring(index + filenameField.Length).Trim('&quot;');
        }

        static string ReadResponse(WebResponse response)
        {
            using (Stream netStream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(netStream))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        static void SaveResponse(WebResponse response, string path)
        {
            byte[] buffer = new byte[4 * 1024];
            int bytesRead;

            using (Stream netStream = response.GetResponseStream())
            {
                if (File.Exists(path))
                    File.Delete(path);

                using (FileStream fileStream = File.Create(path))
                {
                    while ((bytesRead = netStream.Read(buffer, 0, buffer.Length)) &gt; 0)
                    {
                        Console.Write(&quot;.&quot;);
                        fileStream.Write(buffer, 0, bytesRead);
                    }
                }
            }

            Console.WriteLine();
        }
    }
}</pre><p></p>
<h2>Where to from here?</h2>
<p>Once you have .NET Reflector up and running, be sure to try out some of the many free community add-ins available on <a href="http://www.reflector.net/add-ins/">.NET Reflector&#8217;s site</a> and <a href="https://reflectoraddins.codeplex.com/">Codeplex</a>. Tell your friends about it. And above all, don&#8217;t always believe a company when they tell you they&#8217;ll keep a product free.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/how-to-download-net-reflector-6-for-free/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gmail From Sorter 1.6 unleashed</title>
		<link>http://27.am/posts/gfs-1-6-unleashed</link>
		<comments>http://27.am/posts/gfs-1-6-unleashed#comments</comments>
		<pubDate>Tue, 21 Feb 2012 11:07:00 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[GFS]]></category>
		<category><![CDATA[Greasemonkey]]></category>

		<guid isPermaLink="false">http://27.am/?p=234</guid>
		<description><![CDATA[<p>Having released Gmail From Sorter 1.4 the other day, I continued fiddling with it based Robert&#8217;s feedback. One thing I hadn&#8217;t realized was that, as a user of Google Multiple Sign-In, the URLs I see differ slightly from the URLs &#8230; <a href="http://27.am/posts/gfs-1-6-unleashed">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Having released <a href="http://27.am/posts/gfs-1-4-released">Gmail From Sorter 1.4</a> the other day, I continued fiddling with it based Robert&#8217;s feedback.</p>
<p>One thing I hadn&#8217;t realized was that, as a user of <a href="http://support.google.com/accounts/bin/answer.py?hl=en&#038;answer=1721977&#038;topic=28867&#038;ctx=topic">Google Multiple Sign-In</a>, the URLs I see differ slightly from the URLs non-Multiple Sign-In users see. To fix that, I simply relaxed the Greasemonkey @include scope from <i>http://mail.google.com/mail/u/*</i> to <i>http://mail.google.com/mail/*</i>.</p>
<p>I also played around with different methods of hooking into Gmail. Gmail loads in From address fields dynamically, which GFS historically handled by looking for them on the <i>mousedown</i> event. This seemed horrible, so I investigated using other events, such as <i>DOMNodeInserted</i>, <i>DOMContentLoaded</i> and other <i>DOM*</i> events. While some of these events worked, the performance impact they had was horrendous; they caused Gmail to become noticably laggy. Turns out, these <a href="http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents">DOM mutation events are deprecated</a> for this very reason. I decided to stick with <i>mousedown</i>, and added the <i>keydown</i> event to support those that use Gmail keyboard shortcuts.</p>
<p>In the pursuit of efficiency, I changed the initial Gmail hook-in from using an interval-based check to using the <i>load</i> event, which Firefox dutifully fired. The only problem is that Chrome seems to execute Greasemonkey scripts after the <i>load</i> event has fired, rendering the approach useless. Naturally, there&#8217;s always more than one way to do it, but the interval-based approach isn&#8217;t that bad, so GFS 1.6 reverted the hook-in changes introduced in GFS 1.5.</p>
<p>Finally, I found out that Opera is also capable of running Greasemonkey scripts, although the <a href="http://my.opera.com/Contrid/blog/2007/02/11/how-to-greasemonkey-in-opera">installation process</a> is not as seamless as that of Firefox or Chrome. After correctly configuring everything, I tested GFS on Opera and it works just fine. I also updated the <a href="https://userscripts.org/scripts/show/99830">GFS Userscripts.org page</a> to include installation instructions for all three supported browsers.</p>
<p>As always, you can download version 1.6 from the <a href="https://userscripts.org/scripts/show/99830">Gmail From Sorter Userscripts.org page</a>. Hopefully I don&#8217;t need to fiddle with it again for at least another 6 months. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/gfs-1-6-unleashed/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gmail From Sorter 1.4 released</title>
		<link>http://27.am/posts/gfs-1-4-released</link>
		<comments>http://27.am/posts/gfs-1-4-released#comments</comments>
		<pubDate>Thu, 16 Feb 2012 21:31:20 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[GFS]]></category>
		<category><![CDATA[Greasemonkey]]></category>

		<guid isPermaLink="false">http://27.am/?p=222</guid>
		<description><![CDATA[<p>I recently noticed that my Gmail From Sorter Greasemonkey script stopped working, but as usual &#8220;out of sight, out of mind&#8221;; having sent the email, I promptly forgot about the problem. I was reminded again tonight when Robert emailed me &#8230; <a href="http://27.am/posts/gfs-1-4-released">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>I recently noticed that my <a href="http://27.am/projects/gfs">Gmail From Sorter</a> Greasemonkey script stopped working, but as usual <i>&#8220;out of sight, out of mind&#8221;</i>; having sent the email, I promptly forgot about the problem. I was reminded again tonight when Robert emailed me about the issue, so I set about correcting it.</p>
<p>A few hours later, and GFS 1.4 resolves the problem. You can download it from the <a href="http://userscripts.org/scripts/show/99830">Gmail From Sorter Userscripts.org page</a>, or you can wait for the auto-updater to kick in, which should take a week at most. Thanks Robert!</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/gfs-1-4-released/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Legend of FinkyPieheimer@zoobatz.com</title>
		<link>http://27.am/posts/the-legend-of-finkypieheimerzoobatz-com</link>
		<comments>http://27.am/posts/the-legend-of-finkypieheimerzoobatz-com#comments</comments>
		<pubDate>Thu, 29 Sep 2011 12:56:02 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://27.am/?p=190</guid>
		<description><![CDATA[<p>Occasionally, you want a quick disposable email address for registering on suspicious websites, or in my case, for testing your own website&#8217;s registration system. While there are several options, I use Mailinator because you don&#8217;t need to set up anything &#8230; <a href="http://27.am/posts/the-legend-of-finkypieheimerzoobatz-com">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Occasionally, you want a quick disposable email address for registering on suspicious websites, or in my case, for testing your own website&#8217;s registration system. While there are several options, I use <a href="http://mailinator.com/">Mailinator</a> because you don&#8217;t need to set up anything first. You just enter whatever you want, followed by <i>@mailinator.com</i> as your email address, and it just works.</p>
<p>This is what I was doing last week when I noticed that all the email sent by my website&#8217;s registration system was apparently from <i>FinkyPieheimer@zoobatz.com</i>. That&#8217;s definitely not what I set, and I confirmed that a valid from address was being used. The only recent change was that a friendly display name was now being included, instead of just the email address by itself. So what gives?</p>
<p>Upon examining the raw email (When viewing an email in Mailinator, click the <i>Text View</i> button), I noticed a linebreak in the <i>From</i> header.</p>
<p></p><pre class="crayon-plain-tag">...
MIME-Version: 1.0
From: &quot;Quux Baz&quot;
 &lt;noreply@foo.bar&gt;
To: test@mailinator.com
...</pre><p></p>
<p>While that&#8217;s unusual, other email programs and systems handle it just fine. Mailinator, however, doesn&#8217;t like it one bit. It seems to regard it as invalid, and as such, replaces the field with <i>FinkyPieheimer@zoobatz.com</i> as a sort of placeholder.</p>
<p>So what can you do about it? If you&#8217;re just registering on a website, don&#8217;t worry about it. If you&#8217;re working on your own website, see if you can change how the <i>From</i> email address is set.</p>
<p>In my case, I was using .NET&#8217;s SmtpClient, MailMessage and MailAddress classes. I found a <a href="http://stackoverflow.com/questions/5137321/net-or-mssmtp-adding-a-line-break-in-the-from-header"</a>StackOverflow question</a> about the strange carriage return &amp; line feed, which only appears when you set the <i>DisplayName</i> property of a MailAddress instance. This only happens under .NET 4.0, and you can see the hardcoded &#8220;\r\n &#8221; are the end of the <a href="http://typedescriptor.net/name/members/086C4827B03BC13039391486C79CB0C0-System.Net.Mail.MailAddress.Encode%28Int32%29">MailAddress.Encode(Int32) method</a>. To resolve this, either convert the project to .NET 3.5, remove the display name, or, if you have an intermediate delivery system, add a processing step to fix this after it leaves the .NET SmtpClient.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/the-legend-of-finkypieheimerzoobatz-com/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Getting to the (Reparse) Point: Notes</title>
		<link>http://27.am/posts/getting-to-the-reparse-point-notes</link>
		<comments>http://27.am/posts/getting-to-the-reparse-point-notes#comments</comments>
		<pubDate>Thu, 18 Aug 2011 09:08:30 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[Manta]]></category>

		<guid isPermaLink="false">http://27.am/?p=147</guid>
		<description><![CDATA[<p>These are the links, notes and resources for my presentation Getting to the (Reparse) Point, which I&#8217;ll be giving at Microsoft Devs4Devs on Saturday, 20 August 2011 at 09:30. Code Manta, my open source .NET library with functionality for managing &#8230; <a href="http://27.am/posts/getting-to-the-reparse-point-notes">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>These are the links, notes and resources for my presentation <i>Getting to the (Reparse) Point</i>, which I&#8217;ll be giving at Microsoft Devs4Devs on Saturday, 20 August 2011 at 09:30.</p>
<h4>Code</h4>
<ul>
<li><a href="http://27.am/projects/manta">Manta, my open source .NET library with functionality for managing hardlinks, reparse points, junctions and symbolic links</a></li>
</ul>
<h4>Applications</h4>
<ul>
<li><a href="http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html"><b>Recommended:</b> Link Shell Extension &#8211; Explorer extension to manage hardlinks, symbolic links, junctions and mount points (2000+)</a></li>
<li><a href="http://technet.microsoft.com/en-us/library/cc753059.aspx">fsutil &#8211; View and delete reparse points (XP+)</a></li>
<li><a href="http://technet.microsoft.com/en-us/library/cc753194.aspx">mklink &#8211; Create hardlinks, symbolic links and junctions (Vista+)</a></li>
<li><a href="http://technet.microsoft.com/en-us/sysinternals/bb896768">junction- Create and delete junctions (2000+)</a></li>
<li><a href="http://support.microsoft.com/kb/205524">linkd, mountvol &amp; delrp &#8211; Junction, mount point and reparse point management (2000+)</a></li>
</ul>
<h4>Documentation</h4>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/aa365006.aspx">Hard Links and Junctions</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa365503.aspx">Reparse Points</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa365680.aspx">Symbolic Links</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/getting-to-the-reparse-point-notes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing Manta</title>
		<link>http://27.am/posts/announcing-manta</link>
		<comments>http://27.am/posts/announcing-manta#comments</comments>
		<pubDate>Thu, 18 Aug 2011 09:05:13 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Manta]]></category>

		<guid isPermaLink="false">http://27.am/?p=166</guid>
		<description><![CDATA[<p>It&#8217;s taken much too long, but I&#8217;ve finally created an online project for Manta, which until recently didn&#8217;t even have an official name. Manta is an open source .NET library that currently features a variety of I/O- and web-related classes &#8230; <a href="http://27.am/posts/announcing-manta">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s taken much too long, but I&#8217;ve finally created an online project for Manta, which until recently didn&#8217;t even have an official name. Manta is an open source .NET library that currently features a variety of I/O- and web-related classes that simplify and ease solving hard problems.</p>
<p>On the I/O side, Manta offers support for managing hardlinks, reparse points, junctions, symbolic links. It also comes with unit tests and documented methods and classes.</p>
<p>On the web side, Manta enables easy manipulation of URLs, RSS feeds and phpBB posts. It too features unit tests and documentation.</p>
<p>You can <a href="http://27.am/projects/manta">find out more about Manta</a> or <a href="http://mantalib.codeplex.com">download it from CodePlex</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/announcing-manta/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buying a Dremel in South Africa</title>
		<link>http://27.am/posts/buying-a-dremel-in-south-africa</link>
		<comments>http://27.am/posts/buying-a-dremel-in-south-africa#comments</comments>
		<pubDate>Mon, 30 Aug 2010 19:01:22 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Dremel]]></category>

		<guid isPermaLink="false">http://27.am/?p=71</guid>
		<description><![CDATA[<p>I&#8217;d been wanting to get myself a Dremel rotary tool for ages, but only started looking into it recently. Immediately, I was overwhelmed by the variety of options thrown at me &#8211; do I get the tool by itself and &#8230; <a href="http://27.am/posts/buying-a-dremel-in-south-africa">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>I&#8217;d been wanting to get myself a Dremel rotary tool for ages, but only started looking into it recently. Immediately, I was overwhelmed by the variety of options thrown at me &#8211; do I get the tool by itself and then buy the accessories separately, or do I go for one of the kits? Which option is the cheapest?</p>
<p>Firstly, kit codes appear to be in the format of <i>&lt;Tool series&gt;-&lt;Number of attachments&gt;/&lt;Number of accessories&gt;</i>. As far as I can tell, there are four kits available in South Africa, although I could only find information on Dremel&#8217;s website about the 300-1/55, the 4000-1/45 and the 4000-4/65; the fourth kit, which I saw in Builder&#8217;s Warehouse, is a 300-2/40 and contains a Dremel 300 bundled with various accessories and a mini-workbench.</p>
<p>To help myself decide what to go for, I went through Dremel&#8217;s website and put together a spreadsheet detailing the accessories each kit contains. You can view the <a href="https://spreadsheets.google.com/pub?key=0Ar6d_4IFd5andF9JX0dXLVJ3d1FyZ1pKVWNrWEE4TGc&#038;authkey=CKrLwpYE&#038;hl=en&#038;single=true&#038;gid=0&#038;output=html&#038;widget=true">spreadsheet online</a>. Note that the total accessories count is less than the number the kit code indicates; this is probably due to inaccuracies on Dremel&#8217;s website, as the kit I got included the correct number of accessories.
<p>Hopefully, this spreadsheet will help your decision. In the end, I went for the 300-1/55; the value it gives at its price-point bested the Dremel 4000 kits easily.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/buying-a-dremel-in-south-africa/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Your iPhone &amp; its dock: Disabling the mute feature</title>
		<link>http://27.am/posts/your-iphone-its-dock-disabling-the-mute-feature</link>
		<comments>http://27.am/posts/your-iphone-its-dock-disabling-the-mute-feature#comments</comments>
		<pubDate>Thu, 24 Dec 2009 16:32:38 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://27.am/?p=59</guid>
		<description><![CDATA[<p>I recently purchased a dock for my iPhone from a guy on Ebay. It&#8217;s not an official Apple product, because $5 is a far better price than the $29 Apple wants for a piece of plastic. All-in-all, its a great &#8230; <a href="http://27.am/posts/your-iphone-its-dock-disabling-the-mute-feature">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p><img src="http://27.am/files/2009/12/dock1.jpg" alt="iPhone dock with Line Out port" title="iPhone dock" width="500" height="415" class="alignnone size-full wp-image-57" /></p>
<p>I recently purchased a dock for my iPhone from <a href="http://myworld.ebay.com/forsmarter">a guy on Ebay</a>. It&#8217;s not an official Apple product, because $5 is a far better price than the $29 Apple wants for a piece of plastic. All-in-all, its a great little product, and it would be perfect but for one thing; every time I plug my iPhone 3G into it, it mutes the sound.</p>
<p>Of course, given that this dock has a Line Out jack on the back, it makes sense that it would disable my iPhone&#8217;s built-in speakers. After all, why would you want your iPhone&#8217;s tinny sound tarnishing whatever you plug in the back? However, seeing as I&#8217;m using it as a bed-side stand, there will never be a speaker system to tarnish. Here&#8217;s how to prevent it from muting your iPhone.</p>
<p>Step 1: Open it up. You&#8217;ll need a small phillips screwdriver, about 2.5mm in diameter. Just stab it through the rubber layer on the bottom and unscrew.</p>
<p><img src="http://27.am/files/2009/12/dock2.jpg" alt="Location of the screws on the bottom of the iPhone dock" title="iPhone dock screws location" width="500" height="319" class="alignnone size-full wp-image-58" /></p>
<p>Step 2: Using a soldering iron, remove the tiny resistor (Pictured to the right) from the marked location on the PCB.</p>
<p><img src="http://27.am/files/2009/12/dock3.jpg" alt="Location of the resistor to remove on the iPhone dock PCB" title="iPhone dock PCB" width="500" height="277" class="alignnone size-full wp-image-56" /></p>
<p>Step 3: Reassemble and enjoy. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/your-iphone-its-dock-disabling-the-mute-feature/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Restoring iPhone USB access under iTunes 9</title>
		<link>http://27.am/posts/restoring-iphone-usb-access-under-itunes-9</link>
		<comments>http://27.am/posts/restoring-iphone-usb-access-under-itunes-9#comments</comments>
		<pubDate>Thu, 24 Dec 2009 15:03:40 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>

		<guid isPermaLink="false">http://27.am/?p=52</guid>
		<description><![CDATA[<p>Like many jailbreak iPhone users, I prefer to SSH to my iPhone 3G via the USB cable instead of over my wifi network. Since upgrading to iPhone OS 3.1.2 and iTunes 9.0.2 (Specifically 9.0.2.25), however, I&#8217;ve discovered that the tool &#8230; <a href="http://27.am/posts/restoring-iphone-usb-access-under-itunes-9">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>Like many jailbreak iPhone users, I prefer to SSH to my iPhone 3G via the USB cable instead of over my wifi network. Since upgrading to iPhone OS 3.1.2 and iTunes 9.0.2 (Specifically 9.0.2.25), however, I&#8217;ve discovered that the tool I used, iphone_tunnel.exe, no longer works. Instead, every time I try to connect with Putty or WinSCP, the error message iphone_tunnel gives me is:</p>
<blockquote><p>new connection !<br />
AMDeviceNotificationSubscribe = 0<br />
iPhone attached !<br />
AMDeviceConnect = 0<br />
AMDeviceIsPaired = 1<br />
AMDeviceValidatePairing = 0<br />
AMDeviceStartSession = 0<br />
MobileDevice: _send_message: Could not encode message as XML<br />
AMDeviceStartService = 0<br />
AFCConnectionOpen = 0</p></blockquote>
<p>My initial search results lead me to downgrade the &#8220;Apple Mobile Device Support&#8221; component to the version used in iTunes 8.2.1.6, but this did not work. After a lot more searching, I discovered a slightly different tool, itunnel, which I originally discounted as just another name for iphone_tunnel. It is actually a modified version of iphone_tunnel, presumably for iTunes 9 compatibility. It works fine on my iPhone 3G, and I imagine the same would go for the iPhone 3GS.</p>
<p>You can download it from <a href="http://www.mediafire.com/?2q1fzowoy12">MediaFire (623.55 KiB)</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/restoring-iphone-usb-access-under-itunes-9/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>The legal risks of buying a US iTunes voucher/gift card</title>
		<link>http://27.am/posts/the-legal-risks-of-buying-a-us-itunes-vouchergift-card</link>
		<comments>http://27.am/posts/the-legal-risks-of-buying-a-us-itunes-vouchergift-card#comments</comments>
		<pubDate>Fri, 02 Oct 2009 17:17:19 +0000</pubDate>
		<dc:creator>Ashley Ross</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>

		<guid isPermaLink="false">http://27.am/?p=46</guid>
		<description><![CDATA[<p>My experience with safely buying a US iTunes voucher was entirely positive, but being scammed isn&#8217;t the only way things can go wrong for a South African iTunes user. I recently came across a post discussing the legality of using &#8230; <a href="http://27.am/posts/the-legal-risks-of-buying-a-us-itunes-vouchergift-card">Continue reading <span class="meta-nav">&#8594;</span></a></p>
 ]]></description>
			<content:encoded><![CDATA[<p>My experience with <a href="http://27.am/posts/40/buying-itunes-vouchersgift-cards-online">safely buying</a> a US iTunes voucher was entirely positive, but being scammed isn&#8217;t the only way things can go wrong for a South African iTunes user.</p>
<p>I recently came across a post discussing the <a href="http://webtechlaw.com/legalities-us-itunes-store-vouchers-south-africa">legality of using US iTunes gift cards</a> in South Africa. In short, redeeming the voucher as a South African is a breach of contract, as you are breaking Apple&#8217;s terms and conditions on voucher redemption. The article goes on to cover why Apple includes these terms, and why breaking them may also lead you to break content copyrights.</p>
<p>So what does this mean for us? Effectively, Apple are entitled to terminate offending iTunes accounts on the basis that their terms of service were breached, which may well result in the account owners losing access to any purchased content.</p>
<p>Thus far, Apple have not enforced this, and I&#8217;m hoping they never do. Currently, it&#8217;s in their financial interest to turn a blind eye in favour of increased iTunes voucher sales, but if the content providers push hard enough, Apple&#8217;s stance may change and then we all lose out.</p>
]]></content:encoded>
			<wfw:commentRss>http://27.am/posts/the-legal-risks-of-buying-a-us-itunes-vouchergift-card/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

