<?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>ipona</title>
	<atom:link href="http://ipona.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ipona.com</link>
	<description>What in heavens name am I doing?</description>
	<lastBuildDate>Fri, 28 Dec 2012 13:20:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Upgrading jQuery from 1.7.2 to 1.8.3</title>
		<link>http://ipona.com/upgrading-jquery-from-1-7-2-to-1-8-3/</link>
		<comments>http://ipona.com/upgrading-jquery-from-1-7-2-to-1-8-3/#comments</comments>
		<pubDate>Fri, 28 Dec 2012 13:20:17 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=646</guid>
		<description><![CDATA[Last week I had an unfortunate morning of Yak Shaving, all because I wanted to switch some graphs from one graphing framework to another. It was Christmas eve, I&#8217;d had a couple of drinks, so I abandoned it. Today it &#8230; <a href="http://ipona.com/upgrading-jquery-from-1-7-2-to-1-8-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Last week I had an unfortunate morning of <a href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html">Yak Shaving</a>, all because I wanted to switch some graphs from one graphing framework to another. It was Christmas eve, I&#8217;d had a couple of drinks, so I abandoned it. Today it came back to bite me as the actual shaving bit means I have to upgrade jQuery, in a project that is jQuery heavy. The main problem for us is the use of <strong>$.ajax</strong> for posts, where the code uses the success property and expects a JQXHR response object. While the <strong>success</strong> property (and <strong>error</strong>) are now deprecated, they still work, but since I had to modify the code anyway it seemed sensible to move to the new promise format. The second issue is that <strong>isResolved()</strong> is now also deprecated, but is not supported, so needs replacing with an explicit check for the state.</p>
<p>So this:</p>
<pre class="brush: javascript; gutter: true">$.ajax(selectedAction.url(), {
    cache: false,
    dataType: &quot;html&quot;,
    data: data,
    complete: function(jqXHR) {
        var responseText = jqXHR.responseText;
        if (jqXHR.isResolved()) {
            jqXHR.done(function(r) {
                responseText = r;
            });
        }
    },
    error: function(e) {
        self.onError(e);
    }
});</pre>
<p>becomes this:</p>
<pre class="brush: javascript; gutter: true">$.ajax(selectedAction.url(), {
    cache: false,
    dataType: &quot;html&quot;,
    data: data
}).always(function (responseText, statusText, jqXHR) {
    if (jqXHR.state() === &quot;resolved&quot;) {
        jqXHR.done(function (r) {
            responseText = r;
        });
    }
}).fail(function (e) {
    self.onError(e);
});</pre>
<p>Not a huge change, but change enough.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/upgrading-jquery-from-1-7-2-to-1-8-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When software updates fail</title>
		<link>http://ipona.com/when-software-updates-fail/</link>
		<comments>http://ipona.com/when-software-updates-fail/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 10:34:41 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[this sucks]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=644</guid>
		<description><![CDATA[I have an Xbox 360, despite not really being a gamer. I don&#8217;t much patience for games these days, hence the machine doesn&#8217;t get used much. But, I noticed that Xbox Glass was available on my phone (Win7.5) so thought &#8230; <a href="http://ipona.com/when-software-updates-fail/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I have an Xbox 360, despite not really being a gamer. I don&#8217;t much patience for games these days, hence the machine doesn&#8217;t get used much. But, I noticed that Xbox Glass was available on my phone (Win7.5) so thought I&#8217;d give it a spin. Upon turning on the Xbox there was a software update waiting, so I installed it. Well, tried to; it failed with a long string of hex numbers. I tried the update via USB too, but with the same effect.</p>
<p>Digging around online, on the Xbox support site, it states that this error requires a repair. So I try and register my device, but this doesn&#8217;t work as I&#8217;m using Firefox &#8211; the script to pick the states/regions doesn&#8217;t run on FF &#8211; way to go. Switch to IE and I&#8217;m told that my machine is out of warranty (no surprise there, it was bought second had), so they&#8217;ll be a £50 fee. A fee, for a problem caused by a software update? What. The. Fuck. Really Microsoft, you think that&#8217;s acceptable? That you supply a software update that fails, it kills my machine, and you expect me to pay?</p>
<p>I&#8217;ve been told it could be a failed update holding the queue, so clearing the maintenance cache might be an answer, but after trying via USB I can not longer even get to the dashboard. The machine now boots straight into the update, which again fails.</p>
<p>Now given that I rarely use the thing, a fix isn&#8217;t critical, but I&#8217;d possible use it for movies with Smart Glass; that&#8217;s fairly compelling. I&#8217;m now going to look into hard resets; I&#8217;m not that bothered if I have to reset it and lose everything.</p>
<p>Really Microsoft, you could do better here.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/when-software-updates-fail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft LiveID Region Change</title>
		<link>http://ipona.com/microsoft-liveid-region-change/</link>
		<comments>http://ipona.com/microsoft-liveid-region-change/#comments</comments>
		<pubDate>Thu, 11 Oct 2012 15:13:16 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=641</guid>
		<description><![CDATA[Years and years ago, possibly when in Seattle visiting the ASP.NET team, I set up a Windows LiveID account and stupidly set it to the US region. This wasn&#8217;t a problem until two years ago when I got my WP7 &#8230; <a href="http://ipona.com/microsoft-liveid-region-change/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Years and years ago, possibly when in Seattle visiting the ASP.NET team, I set up a Windows LiveID account and stupidly set it to the US region. This wasn&#8217;t a problem until two years ago when I got my WP7 phone, where I couldn&#8217;t sign up for things because my account was US based; I couldn&#8217;t see UK based content and to login to the Zune software I had to set my Windows region to US. Last year (late to the game) I bought an XBox 360 and had the same problem, which because worse when the BBC launched their integrated iPlayer, which didn&#8217;t even appear since the region of my account was checked. I setup a UK based LiveID and the iPlayer appeared. In fact, setting up a new account was the official solution mentioned by a member of the LiveID team on a forum. Not a good solution, especially since I have lots of links setup through my current LiveId.</p>
<p>I worried how this was going to work with Windows 8, given that I now login with my LiveID account (to enable seamless sync between my desktop and laptop). My worries seemed to be surfacing when the music app couldn&#8217;t login; it&#8217;s an XBox app and uses the same ID system checks, telling me that I needed to set my Windows region to the US before I could use it.</p>
<p>Now though, it seems that Microsoft allow account migration between regions, as mentioned in an <a href="http://forums.xbox.com/xbox_forums/xbox_support/f/9/p/353657/1829399.aspx">Xbox forum post</a>. I&#8217;ve just been through the live chat process with support and the migration request has been submitted. The only issue I had was that my original account needed a valid US address and phone number, but luckily I have friends that helped on that (thanks Kendall). How long it&#8217;ll take I&#8217;ve no idea; I have no licensing or payment issues to worry about, so there shouldn&#8217;t be any problems, but I&#8217;m really glad that this is possible now. It&#8217;s been a problem for far too long.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/microsoft-liveid-region-change/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD 10</title>
		<link>http://ipona.com/ddd-10/</link>
		<comments>http://ipona.com/ddd-10/#comments</comments>
		<pubDate>Fri, 14 Sep 2012 11:54:10 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[ddd]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=636</guid>
		<description><![CDATA[So, a couple of weeks after DDD 10 and a bunch of questions have arisen from the feedback. Not enough, since there isn&#8217;t much feedback; if you missed the link, it&#8217;s at the DDD Feedback Page, so go fill it &#8230; <a href="http://ipona.com/ddd-10/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>So, a couple of weeks after <a href="http://developerdeveloperdeveloper.com/ddd10/">DDD 10</a> and a bunch of questions have arisen from the feedback. Not enough, since there isn&#8217;t much feedback; if you missed the link, it&#8217;s at the <a title="DDD feedback page" href="http://developerdeveloperdeveloper.com/ddd10/feedback.aspx">DDD Feedback Page</a>, so go fill it out now. We realise we can&#8217;t please everybody and we do know about some of the issues people have raised; even if they&#8217;ve been raised before, we know and can&#8217;t always do anything about it. So what are the main ones?</p>
<p>Space, not enough of it. This is a simple equation: more space = more money. We&#8217;re lucky at the Reading event because Microsoft host it for us, but that still costs; someone has to pay, for the hire, the staff, security, the food, etc. In this case it&#8217;s another Microsoft business unit that covered most of the costs, and for that we are extremely grateful (and to the other sponsors, whose generosity was very welcome). But the fact is that Microsoft&#8217;s campus isn&#8217;t designed as a conference venue, especially not for 300+ people; even adding the fourth room costs extra because of additional security concerns, the room being in a different building. More rooms just aren&#8217;t available. So we have two options; we keep as we are, or we move venues, which brings additional problems, such as sourcing somewhere suitable. We investigated this i earlier in the year and the figures that came back were well outside any budget we could find. The organisers of other DDDs know this only too well. As yet we don&#8217;t have a solution, but we&#8217;ll continue to look at this.</p>
<p>Next up is registration and the waitlist. Registration fills up quickly and missing the opening time by 10 minutes or so means you&#8217;re on the waitlist; we can&#8217;t help it if you lot are keen, but the waitlist system works. Yes, it may be the night before the event that you get the email letting you know you&#8217;ve a place, but that&#8217;s the system. We&#8217;ve discussed releasing places in batches, but we&#8217;d still have the same problem &#8211; more people want to attend than we have places for. A suggestion that was raised in the feedback is one of fees and it&#8217;s an option we&#8217;ve discussed many times: charge an upfront fee to dissuade those who register but don&#8217;t turn up (we know who you are). But how much? Too low and it&#8217;s disposable and doesn&#8217;t help, too high and we put people off. The middle ground is a hard place to find. Plus DDD has always been free and open; money changes what we&#8217;re trying to do with DDD.</p>
<p>Now to AV. Yes we had some issues, it happens. We weren&#8217;t on the ball enough to check every presenter into their room early enough. Our bad, well sort it next time. Recordings? I&#8217;ve been told that Chicagoe 1 &amp; 2 were recorded, but I&#8217;m not 100% sure; I was away last week and have been too busy to chase this week. If those sessions were recorded, we&#8217;ll make them available when we can.</p>
<p>There are other minor issues, some are website issues (yeah, let&#8217;s not talk about that), but overall the event was a success and the feedback mostly positive. If you&#8217;ve not filled in feedback, then go do so now, or just contact us via twitter, or comment here.</p>
<p>[update: minor correction from "100% sure" to "not 100% sure". It looks like one of the rooms was recorded, but we've yet to get that confirmed]</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/ddd-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NewtonSoft Json Deserialization and inner objects</title>
		<link>http://ipona.com/newtonsoft-json-deserialization-and-inner-objects/</link>
		<comments>http://ipona.com/newtonsoft-json-deserialization-and-inner-objects/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 08:26:22 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[.net]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=633</guid>
		<description><![CDATA[My current project uses SignalR for its network comms, which uses Newtonsoft.Json as its serialiser. After a bit of refactoring, in which everything seemed to work, I suddenly realised I had a couple of failing tests. That&#8217;s right kids, testing &#8230; <a href="http://ipona.com/newtonsoft-json-deserialization-and-inner-objects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>My current project uses <a href="https://github.com/SignalR/SignalR" target="_blank">SignalR</a> for its network comms, which uses <a href="http://james.newtonking.com/pages/json-net.aspx" target="_blank">Newtonsoft.Json</a> as its serialiser. After a bit of refactoring, in which everything seemed to work, I suddenly realised I had a couple of failing tests. That&#8217;s right kids, testing actually works. The problem was that the refactor changed a type from a simple string to a complex object. Well, a simple object, with just two properties. Here&#8217;s what I have:</p>
<pre class="brush: csharp;">public class TopSecretHardware
{
    public int ID { get; set; }
    public string Name { get; set; }
    public IPAddressAndPort IPAddress { get; set; }
}
</pre>
<p>The IPAddress property was previously a string, but now needed to encapsulate the IP address and the port number. Given that this is used elsewhere in the project, I created a separate class to encapsulate the functionality (parsing, validation, etc):</p>
<pre class="brush: csharp;">public class IPAddressAndPort
{
    public string Address { get; private set; }
    public int Port { get; private set; }

    public IPAddressAndPort(string address)
    {
        string[] IPParts = address.Split(new char[] { ':' });
        if (IPParts.Length &gt; 1)
        {
            Address = IPParts[0];
            Port = int.Parse(IPParts[1]);
        }
    }

    public override string ToString()
    {
        return string.Format("{0}:{1}", Address, Port);
    }
}
</pre>
<p>There&#8217;s a little more to the validation, but I&#8217;ve removed it for brevity.</p>
<p>This all seemed fine until my tests pointed out that the IP address and port weren&#8217;t persisting through my application. A simple Console project confirmed that:</p>
<pre class="brush: csharp;">var hardware = new TopSecretHardware()
{
    ID = 1,
    Name = "box 1",
    IPAddress = new IPAddressAndPort("192.168.1.71:123")
};

string json = JsonConvert.SerializeObject(hardware);

Console.WriteLine(json);

TopSecretHardware dehardware = JsonConvert.DeserializeObject&lt;TopSecretHardware&gt;(json);

Console.WriteLine("{0} - {1} - {2}", dehardware.ID, dehardware.Name, dehardware.IPAddress);
</pre>
<p>The output wasn&#8217;t what I expected</p>
<pre>{"ID":1,"Name":"box 1","IPAddress":{"Address":"192.168.1.71","Port":123}}
1 - box 1 - :0
</pre>
<p>The serialization seemed OK, but what was happening when the object was deserialised? A bit of digging leads to some properties you can add to your objects to help with serialization, so I decorate my properties:</p>
<pre class="brush: csharp;">[JsonProperty("Address")]
public string Address { get; private set; }
[JsonProperty("Port")]
public int Port { get; private set; }
</pre>
<p>The output of this is even weirder:</p>
<pre>{"ID":1,"Name":"box 1","IPAddress":{"Address":"192.168.1.71","Port":123}}
1 - box 1 - :123
</pre>
<p>Again the serialisation is fine, but not the reverse. The port number comes across, but no address? Confused I put a breakpoint on the constructor and find that when deserialising, only the address is passed in, not the address and port. Aha. Here we have an object with two properties; how does the serialiser know that these should be combined in &#8220;address:port&#8221; form to pass into the constructor? It doesn&#8217;t, of course. So there are two solutions:</p>
<ol>
<li>Add a default constructor. The serialiser will use that to construct the object, then fill in the properties based upon the <strong>JsonProperty</strong> attribute.
<li>Don&#8217;t use the JsonProperty attributes and create a constructor with a signature that matches the number and type of arguments that are serialised, then decorate it with the <strong>JsonConstructor</strong> attribute. That way the serialiser knows which constructor to use.</li>
</ol>
<p>So my class is now:</p>
<pre class="brush: csharp;">public class IPAddressAndPort
{
    public string Address { get; private set; }
    public int Port { get; private set; }

    public IPAddressAndPort(string address)
    {
        string[] IPParts = address.Split(new char[] { ':' });
        if (IPParts.Length &gt; 1)
        {
            Address = IPParts[0];
            Port = int.Parse(IPParts[1]);
        }
    }

    [JsonConstructor()]
    public IPAddressAndPort(string address, int port)
    {
        Address = address;
        Port = port;
    }

    public override string ToString()
    {
        return string.Format("{0}:{1}", Address, Port);
    }
}
</pre>
<p>And everything works fine. The lesson here is that when using external libraries you have to learn about them, even if they often just work out of the box. In all this took an hour or two to dig into and solve, but I&#8217;m now much more aware of the problems that can arise and that can only be a good thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/newtonsoft-json-deserialization-and-inner-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TreeView as Menu and highlight</title>
		<link>http://ipona.com/treeview-as-menu-and-highlight/</link>
		<comments>http://ipona.com/treeview-as-menu-and-highlight/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 08:11:47 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[webforms]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=631</guid>
		<description><![CDATA[In a follow up to my tab-style menus post along comes a similar query about highlighting the parent path when using a TreeView control as your menu. The TreeView has a similar event to the Menu allowing you to check &#8230; <a href="http://ipona.com/treeview-as-menu-and-highlight/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>In a follow up to <a href="http://ipona.com/asp-net-tab-style-menus-with-parent-highlight/" target="_blank">my tab-style menus post</a> along comes a similar query about highlighting the parent path when using a TreeView control as your menu. The TreeView has a similar event to the Menu allowing you to check each node as it&#8217;s bound with data. So with a UI like:</p>
<pre>&lt;asp:SiteMapDataSource ID="menuData" runat="server" /&gt;
&lt;asp:TreeView ID="tv1" runat="server" 
    DataSourceID="menuData"
    ontreenodedatabound="tv1_TreeNodeDataBound" /&gt;
</pre>
<p>You can have the following event code:</p>
<pre class="brush: csharp;">protected void tv1_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
    SiteMapNode node = e.Node.DataItem as SiteMapNode;

    if (SiteMap.CurrentNode.IsDescendantOf(node))
    {
        e.Node.Text = String.Format("&lt;span class='parentselected'&gt;{0}&lt;/span&gt;", e.Node.Text);
    }

    if (node.Url == SiteMap.CurrentNode.Url)
    {
        e.Node.Text = String.Format("&lt;span class='selected'&gt;{0}&lt;/span&gt;", e.Node.Text);
    }
}
</pre>
<p>Add in the appropriate styles and now not only is the current item highlighted, but the path back to the parent is highlighted too.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/treeview-as-menu-and-highlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Online storage&#8211;do as I say</title>
		<link>http://ipona.com/online-storagedo-as-i-say/</link>
		<comments>http://ipona.com/online-storagedo-as-i-say/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 23:05:24 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[this sucks]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=629</guid>
		<description><![CDATA[I&#8217;m all for online storage; you can never have too many backups. Frankly if you&#8217;re not using some form of online backup you&#8217;re bordering on madness; you can get enough free storage to cover most data scenarios (movies aside), so &#8230; <a href="http://ipona.com/online-storagedo-as-i-say/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m all for online storage; you can never have too many backups. Frankly if you&#8217;re not using some form of online backup you&#8217;re bordering on madness; you can get enough free storage to cover most data scenarios (movies aside), so not taking up the option seems plain stupid to me. I&#8217;ve been using Microsoft mesh (now LiveSync) since it&#8217;s first betas and it&#8217;s been excellent; just select a folder and add it to your Mesh, and you can sync it to the cloud and selected other machines. It&#8217;s a simple sync between me, the cloud and my laptop. I also have a paid <a href="http://mozy.co.uk/" target="_blank">Mozy</a> account because, well, discs are evil and crash when you most need them.</p>
<p>&nbsp;</p>
<p>I&#8217;ve also got a DropBox account, which I setup because a client was using it and it just made things easy to share files. But I hate the central folder – the one true place – that their methodology forces you to adopt. &#8220;Here&#8221;, they say, &#8220;have some free storage, we&#8217;ll synchronise it automatically for you. You want multiple folders? No, sorry, we only support a single folder. Move all of your folders into that one. It&#8217;s free, what more do you want?&#8221; Yeah, right, that&#8217;s what I want, to be forced to organise my files under your folder. I suck it up because that&#8217;s what the client used, and it&#8217;s a great price, but I have my own structure – clients, projects, etc – so now I copy between them, my local folder structure and DropBox, which kinda ruins the seamless experience.</p>
<p>&nbsp;</p>
<p>Now Microsoft release a SkyDrive application, which synchronises with free 25gb of storage online. Ooh, nice; I already use SkyDrive too, so that&#8217;ll fit nicely, thinks I. But no, it&#8217;s the same as the DropBox model, a single folder and one that&#8217;s not even integrated with LiveSync. Really, I just don&#8217;t get it. You&#8217;ve this sweet sync technology that allows you to select folders to synchronise and to which machines and you force me to use a single folder. I&#8217;ve already got a folder structure, neatly set out in my anal OCD way, but no, that&#8217;s not good enough, I now have to have everything I want synchronised under a single folder. Really? A single folder? You didn&#8217;t think that, maybe, I&#8217;d have files and folders scattered around my disc? You didn&#8217;t think that a good way to differentiate yourself is to do something different rather than copy the competition? You&#8217;ve already got a multi-folder sync technology, one that&#8217;s been working happily for years, but no, let&#8217;s not use that, let&#8217;s pick the restrictive way of doing things.</p>
<p>&nbsp;</p>
<p>And while I&#8217;m ranting, why can&#8217;t LiveSync and SkyDrive be combined? I get that SkyDrive is the consumer friendly model, but it seems odd, wasteful even, that you have two technologies providing almost the same features, but not the same enough to combine them. There seems to be a lack of vision here, the view that since people already accept the single folder view, that&#8217;s good enough for everyone.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/online-storagedo-as-i-say/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overriding the universal selector</title>
		<link>http://ipona.com/overriding-the-universal-selector/</link>
		<comments>http://ipona.com/overriding-the-universal-selector/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 07:42:57 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=627</guid>
		<description><![CDATA[Here&#8217;s a weird issue that came up in a forum post, which left me scratching my head. The poster was using themes and had a CSS file in the theme folder, one rule of which was overriding some defaults set &#8230; <a href="http://ipona.com/overriding-the-universal-selector/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Here&#8217;s a weird issue that came up in a <a href="http://forums.asp.net/t/1793895.aspx/1?Overriding+CSS+universal+selector+in+skin+pointing+to+another+CSS" target="_blank">forum post</a>, which left me scratching my head. The poster was using themes and had a CSS file in the theme folder, one rule of which was overriding some defaults set in the universal selector defined in another CSS file. The hierarchy seemed fine; the theme CSS file was loaded after the main one, but something was amiss.</p>
<p>&nbsp;</p>
<p>One of the properties being overridden was the colour of a grid view header; other properties were set fine, but the colour for the header wasn&#8217;t set. Firebug showed the hierarchy was correct too; the colour <strong>was</strong> set – it even had !important – but it just wasn&#8217;t taking effect. This stumped me and a quick search came up with a <a href="http://stackoverflow.com/questions/2649196/how-to-override-universal-selector-font-size-in-ie6" target="_blank">SO post</a> that had a working solution, which is to add the universal selector to the overriding rule. So instead of:</p>
<p>&nbsp;</p>
<pre class="brush: css;">.table_title {
</pre>
<p>&nbsp;</p>
<p>You have:</p>
<p>&nbsp;</p>
<pre class="brush: css;">.table_title * {
</pre>
<p>&nbsp;</p>
<p>The style now takes effect. Weird, huh?</p>
<p>&nbsp;</p>
<p>So the real question is why doesn&#8217;t the overriding take place in the first instance? The answer is that the universal selector bypasses the inheritance chain, so nothing overrides it, unless you actually override the universal selector again. Eric has a <a href="http://meyerweb.com/eric/articles/webrev/200006a.html" target="_blank">full description</a> of the universal selector and a read through shows you how confusing it can be. It&#8217;s powerful, but does lead you to situations like this where the expected rules don&#8217;t work.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/overriding-the-universal-selector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS adapters appear to stop working</title>
		<link>http://ipona.com/css-adapters-appear-to-stop-working/</link>
		<comments>http://ipona.com/css-adapters-appear-to-stop-working/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 13:27:42 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[webforms]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=625</guid>
		<description><![CDATA[This just hit me, remoting in to a client who was remoting in to an end user, setting up a web application I wrote. It&#8217;s an ASP.NET 2.0 application and uses the CSS Friendly Adapters to produce cleaner HTML, but &#8230; <a href="http://ipona.com/css-adapters-appear-to-stop-working/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>This just hit me, remoting in to a client who was remoting in to an end user, setting up a web application I wrote. It&#8217;s an ASP.NET 2.0 application and uses the <a href="http://www.asp.net/cssadapters/" target="_blank">CSS Friendly Adapters</a> to produce cleaner HTML, but it appeared those adapters weren&#8217;t working, first noticed by the menu not rendering. Or rather it was rendering, but the CSS wasn&#8217;t being applied so you couldn&#8217;t see it. Inspecting the page load showed the CSS files were being loaded, but somehow not being applied. A quick search came up with <a href="http://conficient.wordpress.com/2010/05/11/fix-for-precompiled-websites-from-vs2010-on-net-3-5-for-cssfriendly-adapters/" target="_blank">a solution</a>, which is to remove the compiled browser capabilities file and everything appears correctly.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/css-adapters-appear-to-stop-working/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET Tab-Style Menus with parent highlight</title>
		<link>http://ipona.com/asp-net-tab-style-menus-with-parent-highlight/</link>
		<comments>http://ipona.com/asp-net-tab-style-menus-with-parent-highlight/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 08:24:44 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[webforms]]></category>

		<guid isPermaLink="false">http://ipona.com/?p=623</guid>
		<description><![CDATA[A long time ago I posted about tab-style menus, and one thing that I didn&#8217;t talk about, but that is a common request, is how does the parent menu remain highlighted when a child menu is selected. Since these are &#8230; <a href="http://ipona.com/asp-net-tab-style-menus-with-parent-highlight/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A long time ago I <a href="http://ipona.com/tab-style-menus/" target="_blank">posted about tab-style menus</a>, and one thing that I didn&#8217;t talk about, but that is a common request, is how does the parent menu remain highlighted when a child menu is selected. Since these are two separate menus, there&#8217;s no real connection, so you have to drop to a bit of code. The secret is to hook into the <strong>MenuItemDataBound</strong> event of the parent menu, with code like this:</p>
<p>&nbsp;</p>
<pre class="brush: csharp;">protected void topMenu_MenuItemDataBound(object sender, MenuEventArgs e)
{
    SiteMapNode node = e.Item.DataItem as SiteMapNode;

    if (SiteMap.CurrentNode.IsDescendantOf(node))
    {
        e.Item.Text = String.Format("&lt;span class='staticSelectedStyle'&gt;{0}&lt;/span&gt;", e.Item.Text);
    }
}
</pre>
<p>&nbsp;</p>
<p>This simply checks if the current node (ie, the current page) is a descendent of the node being rendered (the parent node). Unfortunately the <strong>MenuItem</strong> doesn&#8217;t expose the attributes, so you can&#8217;t directly modify the style or class, so the rather hacky trick is to add an additional element with the appropriate class set. Doing so might mean you have to change some of the CSS, to ensure that the anchor is full width. I changed the the bottom border of the <strong>staticMenuItemStyle</strong> and changed <strong>staticSelectedStyle</strong> to display as a block element.</p>
]]></content:encoded>
			<wfw:commentRss>http://ipona.com/asp-net-tab-style-menus-with-parent-highlight/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
