<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Web Dev Bros</title>
	
	<link>http://www.webdevbros.net</link>
	<description>hot talk about web development</description>
	<lastBuildDate>Wed, 16 Dec 2009 12:59:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/WebDevBros" /><feedburner:info uri="webdevbros" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Role Based Access Control in ASP.Net MVC</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/20ZzvxSxL20/</link>
		<comments>http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:59:24 +0000</pubDate>
		<dc:creator>Dai Bok</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[general stuff]]></category>
		<category><![CDATA[Access Control]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Bitwise Operations]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=874</guid>
		<description><![CDATA[Currently I am looking at access control systems, and how best to integrate them with ASP.Net MVC framework. While this framework already provides support for role based access control (RBAC), using the membership classes. I need to implement this on a legacy database, and some how integrate the old system with asp.net forms authentication. This [...]]]></description>
			<content:encoded><![CDATA[<p>Currently I am looking at access control systems, and how best to integrate them with ASP.Net MVC framework. While this framework already provides support for role based access control (RBAC), <a href="http://msdn.microsoft.com/en-us/library/system.web.security.membership.aspx">using the membership classes</a>. I need to implement this on a legacy database, and some how integrate the old system with asp.net forms authentication. This post is about how I realised this, and acts a potential solution. If you can think of a better way, of find any devastating flaws, let me know. ;-)</p>
<p>The scenario is simple, we have four roles defined for the system. They are Students, Graduates, Staff and Administrators. Some staff can be graduates, (or even Students). Administrators are, of course staff! So how you model this? We already know of one bitwise <a href="http://www.webdevbros.net/2006/12/02/toggle-states-like-active-deleted-etc-bitwise-negation-in-sql/">trick from Michal’s post</a>, so let us see how we can use bitwise operations to make this a reality!</p>
<p>First let us revise the results of the bitwise AND operations. You can check<a href="http://en.wikipedia.org/wiki/Bitwise_operation"> Wikipedia for full details</a>.</p>
<p align="center">
<table style="border:1px solid black" cellspacing="0">
<tr>
<td>1
<td>&amp;
<td>0
<td>=
<td>0 </tr>
<tr>
<td>0
<td>&amp;
<td>1
<td>=
<td>0 </tr>
<tr>
<td>0
<td>&amp;
<td>0
<td>=
<td>0 </tr>
<tr>
<td>1
<td>&amp;
<td>1
<td>=
<td>1 </tr>
</table>
<p>
</p>
<p>Converting these back to decimal 1001 is 9 and 0101 is 5. So 9 &amp; 5 = 8. If we convert each of these bits to represent a role in our system, we can come up with a table like this. </p>
<p align="center">
<table style="border:1px solid black" cellspacing="0">
<tr>
<td>Bit 1
<td>0 (false)
<td>Student</tr>
<tr>
<td>Bit 2
<td>0 (false)
<td>Graduate</tr>
<tr>
<td>Bit 3
<td>0 (false)
<td>Staff</tr>
<tr>
<td>Bit 4
<td>1 (true)
<td>Admin</tr>
</table>
<p>
</p>
<p>So a user of the system with a role number of 8 is an Admin, but in our case, an Admin is also a member of staff, and in fact, a member of staff could also be a student or a graduate. This is where using bitwise operations can really help model such a situation.  To get it working, a staff member who is a student will have bits 1 and 3 set to true, while a graduate who is also a staff member will have bits 2 and 3 set to true. We can represent these roles in decimal as User(Staff &amp; Graduate) = 6, while User (Staff &amp; Student) = 5. Get the picture?</p>
<p>Let’s look at a simple real world example. First we have a User class, with a Role property of the type int. The reason we use an integer, is that is can be easily stored in the database.</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">User</span> {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">string</span> Name { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">int</span> Role { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">bool</span> IsInRole(<span style="color: #2b91af">Role</span> role) {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green">//todo</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> <span style="color: blue">false</span>;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>
</div>
<p>We also need to create an enumeration, with a Flags attribute. The flags attribute tells the compiler that this enumeration can be treated as a bit field. We then define a value for each role. The reason for using exponents of 2 should become clearer later. </p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; [<span style="color: #2b91af">Flags</span>]</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">enum</span> <span style="color: #2b91af">Role</span> {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Student = 1,&nbsp;&nbsp;&nbsp; <span style="color: green">// 0001</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Employer = 2,&nbsp;&nbsp; <span style="color: green">// 0010</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Staff = 4,&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: green">// 0100</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Admin = 8&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: green">// 1000</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>
</div>
<p>The menu of our website needs to be generated depending on the user role.  The menu selection code below should generate the correct menu depending on the user role.</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: #a31515">div</span> <span style="color: red">class</span><span style="color: blue">=&quot;LeftMenu&quot;&gt;</span>&nbsp; </p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> <span style="color: blue">if</span> (user.IsInRole(<span style="color: #2b91af">Role</span>.Student)) <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> Html.RenderPartial(<span style="color: #a31515">&quot;StudentMenu&quot;</span>); <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> <span style="color: blue">if</span> (user.IsInRole(<span style="color: #2b91af">Role</span>.Graduate)) <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> Html.RenderPartial(<span style="color: #a31515">&quot;GraduateMenu&quot;</span>); <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> <span style="color: blue">if</span> (user.IsInRole(<span style="color: #2b91af">Role</span>.Staff)) <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;10</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> Html.RenderPartial(<span style="color: #a31515">&quot;StaffMenu&quot;</span>); <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;11</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> <span style="color: blue">if</span> (user.IsInRole(<span style="color: #2b91af">Role</span>.Admin)) <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="background: #ffee62">&lt;%</span> Html.RenderPartial(<span style="color: #a31515">&quot;AdminMenu&quot;</span>); <span style="background: #ffee62">%&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;14</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: #a31515">div</span><span style="color: blue">&gt;</span></p>
<p>
</div>
<p>Ok, so let see where the magic happens!  If we <a href="http://msdn.microsoft.com/en-us/library/sbf85k1c.aspx">AND (&amp;)</a> the user assigned role, with the role required, and we compare this result to the role required, we can determine if a user is in the role.  Summarised, the end result of the AND operation needs to equal that of the role required. In user class we have the method:</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">bool</span> IsInRole(<span style="color: #2b91af">Role</span> role) {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af">Role</span> userRole = (<span style="color: #2b91af">Role</span>)<span style="color: blue">this</span>.Role;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> ((userRole &amp; role) == role);</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p>
</div>
<p>Looking at some binary examples, we can see how it works. In the first example, an admin user wants accesses a graduate item. </p>
<p align="center">
<table style="border:1px solid black" cellspacing="0">
<tr>
<td>Role Required
<td style="color:red">Staff(4)
<td>0 1 0 0</tr>
<tr>
<td>User Role
<td style="color:green">Admin (8)
<td>1 0 0 0</tr>
<tr>
<td>Result of &amp;
<td style="color:red"> Access Denied (0)
<td>0 0 0 0</tr>
</table>
<p></br>
</p>
<p>It is clear that we have a problem here, because we said that admin could be both staff, and staff may also be graduates.  What we need to do is add up the roles, so that this user will access both admin and staff content. Assigning the user the role of Admin and Staff is easy. All we do is: </p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af">User</span> user = <span style="color: blue">new</span> <span style="color: #2b91af">User</span>();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; user.Role = (<span style="color: blue">int</span>)<span style="color: #2b91af">Role</span>.Staff;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; user.Role += (<span style="color: blue">int</span>) <span style="color: #2b91af">Role</span>.Admin;</p>
<p>
</div>
<p>And the resulting table is: </p>
<table style="border:1px solid black" cellspacing="0">
<tr>
<td>Role Required
<td style="color:red">Staff(4)
<td>0 1 0 0</tr>
<tr>
<td>User Role
<td style="color:green">Admin  + Staff (12)
<td>1 1 0 0</tr>
<tr>
<td>Result of &amp;
<td style="color:green">Access Granted (4)
<td>0 1 0 0</tr>
</table>
<p>
</p>
<p>Now we can easily draw our menu depending on the roles assigned to a user. Adding or removing roles for a user is also easy, just add it or subtract it. I wrote a little project to go with this so you can test it our your self.  Thanks to Michi for introducing  this, and Dan for helping work it out! </p>
<p>Download the <a href='http://www.webdevbros.net/wp-content/uploads/2009/12/Roles.zip'>Roles sample project </a>  You’ll need to use <a href="http://www.nunit.org/">nUnit to test it</a>. </p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/&amp;t=Role+Based+Access+Control+in+ASP.Net+MVC&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/&amp;title=Role+Based+Access+Control+in+ASP.Net+MVC&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/&amp;title=Role+Based+Access+Control+in+ASP.Net+MVC&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Role+Based+Access+Control+in+ASP.Net+MVC;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/khrhGZnE3LUCuk5T9-5KGyy35NY/0/da"><img src="http://feedads.g.doubleclick.net/~a/khrhGZnE3LUCuk5T9-5KGyy35NY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/khrhGZnE3LUCuk5T9-5KGyy35NY/1/da"><img src="http://feedads.g.doubleclick.net/~a/khrhGZnE3LUCuk5T9-5KGyy35NY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=20ZzvxSxL20:hgKvQTOWfu4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=20ZzvxSxL20:hgKvQTOWfu4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=20ZzvxSxL20:hgKvQTOWfu4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=20ZzvxSxL20:hgKvQTOWfu4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=20ZzvxSxL20:hgKvQTOWfu4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/20ZzvxSxL20" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/12/16/role-based-access-control-in-asp-net-mvc/</feedburner:origLink></item>
		<item>
		<title>FluentNhibernate and Stored Procedures</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/S7gsLIgd6oI/</link>
		<comments>http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 10:59:27 +0000</pubDate>
		<dc:creator>Dai Bok</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[general stuff]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[Fluent NHibernate]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=808</guid>
		<description><![CDATA[I am evaluating FluentNHibernate  (FNH), to see if it is suitable for a project I am working on. Disappointingly, FNH does not support Store procedures of the box. Of course, FNH is under the BSD licence, so I am sure those who are confident enough can implement this for the rest of us! This [...]]]></description>
			<content:encoded><![CDATA[<p>I am evaluating <a href="http://fluentnhibernate.org/">FluentNHibernate </a> (FNH), to see if it is suitable for a project I am working on. Disappointingly, FNH does not support Store procedures of the box. Of course, FNH is under the BSD licence, so I am sure those who are confident enough can implement this for the rest of us! This post will show how I got FNH to work with stored procedures, and can hopefully be followed as a working example.</p>
<p>FNH extends NHibernate, and automagically generates XML mapping files for your objects. Unfortunately, to get stored procedures to work, you need to take a step backwards, and create good old fashioned hbm.xml files, doing the mappings manually.</p>
<p>Firstly , let us look at the results  of the stored procedure that we want to map.</p>
<table border="0" align="center">
<tbody>
<tr>
<td>ID</td>
<td>enDescription</td>
<td>cyDescription</td>
<td>IsActive</td>
</tr>
<tr>
<td>1</td>
<td>Swansea</td>
<td>Abertawe</td>
<td>True</td>
</tr>
<tr>
<td>2</td>
<td>Cardiff</td>
<td>Caerdydd</td>
<td>True</td>
</tr>
<tr>
<td>3</td>
<td>Newport</td>
<td>Cas Newydd</td>
<td>False</td>
</tr>
</tbody>
</table>
<p>The class that will use this data is called lookup.</p>
<p>The code for this class is:</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue">namespace</span> Entities {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">class</span> <span style="color: #2b91af">Lookup</span>&nbsp; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">virtual</span> <span style="color: blue">int</span> Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">virtual</span> <span style="color: blue">string</span> EnDescription { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">virtual</span> <span style="color: blue">string</span> CyDescription { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">public</span> <span style="color: blue">virtual</span> <span style="color: blue">bool</span> IsActive { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;}</p>
</div>
<p>&nbsp; <br />
This object will be used to populate a simple drop down list, so that a user can select their county.</p>
<p>When I started using FluentHNibernate, I wanted to totally avoid using XML mappings, so I skipped<a href="http://www.amazon.co.uk/gp/product/193239415X?ie=UTF8&amp;tag=daisramblin-21&amp;linkCode=as2&amp;camp=1634&amp;creative=19450&amp;creativeASIN=193239415X"> chapters 3 and 6 of Hibernate in Action.</a><img class=" luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs luqmsfcfqseksqyogrfs pcshjncfdcdawbvrvmch pcshjncfdcdawbvrvmch" style="border:none !important;margin:0px !important" src="http://www.assoc-amazon.co.uk/e/ir?t=daisramblin-21&amp;l=as2&amp;o=2&amp;a=193239415X" border="0" alt="" width="1" height="1" /> My first mistake! So for those attempting this, it may be worth your while understanding Hibernate mappings before you proceed. (You may also ask why I have the Java Book and my code is in C#, that is because I am quite used to working in different programming languages, so those who prefer examples in .Net examples check <a href="http://www.amazon.co.uk/gp/product/1932394923?ie=UTF8&amp;tag=daisramblin-21&amp;linkCode=as2&amp;camp=1634&amp;creative=19450&amp;creativeASIN=1932394923">NHibernate in Action</a><img class=" luqmsfcfqseksqyogrfs" style="border:none !important;margin:0px !important" src="http://www.assoc-amazon.co.uk/e/ir?t=daisramblin-21&amp;l=as2&amp;o=2&amp;a=1932394923" border="0" alt="" width="1" height="1" />.)</p>
<p>Let’s move on to creating the mapping file.</p>
<p><em>IMPORTANT:</em> When you add the mapping file to your project, make sure you set the Build Action to Embedded Resource!</p>
<p>I have created a Lookup.hbm.xml file, and the source is below:</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue">&lt;?</span><span style="color: #a31515">xml</span><span style="color: blue"> </span><span style="color: red">version</span><span style="color: blue">=</span>&quot;<span style="color: blue">1.0</span>&quot;<span style="color: blue"> </span><span style="color: red">encoding</span><span style="color: blue">=</span>&quot;<span style="color: blue">utf-8</span>&quot;<span style="color: blue"> ?&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;<span style="color: blue">&lt;</span><span style="color: #a31515">hibernate-mapping</span><span style="color: blue"> </span><span style="color: red">xmlns</span><span style="color: blue">=</span>&quot;<span style="color: blue">urn:nhibernate-mapping-2.2</span>&quot;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="color: red">namespace</span><span style="color: blue">=</span>&quot;<span style="color: blue">Entities</span>&quot;<span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">class</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">Lookup</span>&quot;<span style="color: blue"> </span><span style="color: red">table</span><span style="color: blue">=</span>&quot;<span style="color: blue">dbo.sp_GetLookups</span>&quot;<span style="color: blue"> &gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">id</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">Id</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">Id</span>&quot;<span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">generator</span><span style="color: blue"> </span><span style="color: red">class</span><span style="color: blue">=</span>&quot;<span style="color: blue">native</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">id</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">EnDescription</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">enDescription</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">CyDescription</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">cyDescription</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;10</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">IsActive</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">IsActive</span>&quot;<span style="color: blue"> /&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;11</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">loader</span><span style="color: blue"> </span><span style="color: red">query-ref</span><span style="color: blue">=</span>&quot;<span style="color: blue">dbo.sp_GetLookups</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;12</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">class</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;13</span>&nbsp;</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;14</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">sql-query</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">dbo.sp_GetLookups</span>&quot;<span style="color: blue"> &gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;15</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">return</span><span style="color: blue"> </span><span style="color: red">alias</span><span style="color: blue">=</span>&quot;<span style="color: blue">dbo.sp_GetLookups</span>&quot;<span style="color: blue"> </span><span style="color: red">class</span><span style="color: blue">=</span>&quot;<span style="color: blue">Lookup</span>&quot;<span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;16</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">return-property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">Id</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">Id</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;17</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">return-property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">EnDescription</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">enDescription</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;18</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">return-property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">CyDescription</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">cyDescription</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;19</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">return-property</span><span style="color: blue"> </span><span style="color: red">name</span><span style="color: blue">=</span>&quot;<span style="color: blue">IsActive</span>&quot;<span style="color: blue"> </span><span style="color: red">column</span><span style="color: blue">=</span>&quot;<span style="color: blue">IsActive</span>&quot;<span style="color: blue">/&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;20</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">return</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;21</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exec dbo.sp_GetLookups</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;22</span>&nbsp;<span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">sql-query</span><span style="color: blue">&gt;</span></p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;23</span>&nbsp;<span style="color: blue">&lt;/</span><span style="color: #a31515">hibernate-mapping</span><span style="color: blue">&gt; </span></p>
</div>
<p>&nbsp; </p>
<p>To put it quite simply, lines 5 to 13 map my Lookup class to the columns in the stored procedure, while lines 16 to 20 map the results from the stored procedure my lookup class. Line 22 names the stored procedure. I am not sure if this is the best way to achieve the mappings, so any feedback would be appreciated.</p>
<p>Once your object is nicely  mapped, you then need to update your fluent configuration. All you need to do is tell FNH to load hbmMappings from the current assembly. See the snippet below:</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp; .Mappings(m =&gt; {</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m.HbmMappings.AddFromAssembly(<span style="color: #2b91af">Assembly</span>.GetExecutingAssembly());</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  m.FluentMappings.AddFromAssembly(<span style="color: #2b91af">Assembly</span>.GetExecutingAssembly());</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp; })</p>
</div>
<p> &nbsp; </p>
<p>To retrieve the list of lookups, I do the following, which populates my results variable with a list of all my lookups.</p>
<div style="font-family: Courier New;font-size: 10pt;color: black;background: white">
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> sessionfactory = CreateSessionFactory();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> session = sessionfactory.OpenSession();</p>
<p style="margin: 0px"><span style="color: #2b91af">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp; <span style="color: blue">var</span> results = session.GetNamedQuery(<span style="color: #a31515">&quot;dbo.sp_GetLookups&quot;</span>).List();</p>
</div>
<p> &nbsp; </p>
<p>And that is it, the results variable now contains the list of lookups that I can use to populate my list control.</p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/&amp;t=FluentNhibernate+and+Stored+Procedures&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/&amp;title=FluentNhibernate+and+Stored+Procedures&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/&amp;title=FluentNhibernate+and+Stored+Procedures&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=FluentNhibernate+and+Stored+Procedures;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/HCep-mNg8r8JtPYk8sS-GEJbJtQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/HCep-mNg8r8JtPYk8sS-GEJbJtQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HCep-mNg8r8JtPYk8sS-GEJbJtQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/HCep-mNg8r8JtPYk8sS-GEJbJtQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=S7gsLIgd6oI:w23hn9ZXIvo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=S7gsLIgd6oI:w23hn9ZXIvo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=S7gsLIgd6oI:w23hn9ZXIvo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=S7gsLIgd6oI:w23hn9ZXIvo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=S7gsLIgd6oI:w23hn9ZXIvo:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/S7gsLIgd6oI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/11/25/fluentnhibernate-and-stored-procedures/</feedburner:origLink></item>
		<item>
		<title>Looking for the perfect job? Looking for the best developers?</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/uW2rTOI1cvw/</link>
		<comments>http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 06:54:01 +0000</pubDate>
		<dc:creator>Michal</dc:creator>
				<category><![CDATA[general stuff]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=804</guid>
		<description><![CDATA[
As an active user of Stackoverflow I came across their new career service. It&#8217;s brand new and their vision is to find the perfect employer for each developer. Pretty good idea I think. STO has a lot of bright brains, which can be a huge profit for corporations looking for great staff.
Amongst other job platforms, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://careers.stackoverflow.com/"><img src="http://www.webdevbros.net/wp-content/uploads/2009/10/careersstackoverflow.png" alt="careersstackoverflow" title="careersstackoverflow" width="363" height="64" class="aligncenter size-full wp-image-805" /></a><br />
As an active user of <a href="http://www.stackoverflow.com">Stackoverflow</a> I came across their new career service. It&#8217;s brand new and their vision is to find the perfect employer for each developer. Pretty good idea I think. STO has a lot of bright brains, which can be a huge profit for corporations looking for great staff.</p>
<p>Amongst other job platforms, it stands out by providing developer specific details such as First computer, Favorite technologies, Likes, Dislikes, etc. Currently they&#8217;re offering a 3 year membership for only USD29.00. Once inside, you sit back, drink tea and wait.</p>
<p>Since their launch Stackoverflow provided me a lot of answers to my questions, which no other site achieved so far. That&#8217;s why it&#8217;s time to give back to them. I decided to subscribe for the 3yr membership.</p>
<p>Want to hire me?<br />
<a href="http://careers.stackoverflow.com/michal">http://careers.stackoverflow.com/michal</a></p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/&amp;t=Looking+for+the+perfect+job%3F+Looking+for+the+best+developers%3F&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/&amp;title=Looking+for+the+perfect+job%3F+Looking+for+the+best+developers%3F&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/&amp;title=Looking+for+the+perfect+job%3F+Looking+for+the+best+developers%3F&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Looking+for+the+perfect+job%3F+Looking+for+the+best+developers%3F;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/lHaE3fxnZUr_HBRBmWgvtZu9vAQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/lHaE3fxnZUr_HBRBmWgvtZu9vAQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lHaE3fxnZUr_HBRBmWgvtZu9vAQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/lHaE3fxnZUr_HBRBmWgvtZu9vAQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=uW2rTOI1cvw:lNGbrU564hs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=uW2rTOI1cvw:lNGbrU564hs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=uW2rTOI1cvw:lNGbrU564hs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=uW2rTOI1cvw:lNGbrU564hs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=uW2rTOI1cvw:lNGbrU564hs:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/uW2rTOI1cvw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/10/29/looking-for-the-perfect-job-looking-for-the-best-developers/</feedburner:origLink></item>
		<item>
		<title>Android Gravatar Importer. Update your phone book with caller photos</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/hojtEOe9f4E/</link>
		<comments>http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 09:55:49 +0000</pubDate>
		<dc:creator>Michal</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[caller id]]></category>
		<category><![CDATA[gravatar]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[phone book]]></category>
		<category><![CDATA[sync]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=795</guid>
		<description><![CDATA[I love Gravatar. So does Android now. 
Are you on Android? Do you care of having nice up-to-date photos of your callers? If yes, then you might check out this little new application (Search market for Gravatar Importer) which walks through your contacts and checks if any of them has a Gravatar picture online. Once [...]]]></description>
			<content:encoded><![CDATA[<p><strong>I love Gravatar. So does Android now.</strong> </p>
<p><img src="http://www.webdevbros.net/wp-content/uploads/2009/10/androidgravatar.png" alt="android on gravatar" title="androidgravatar" width="96" height="48" class="alignleft size-full wp-image-796" />Are you on Android? Do you care of having nice up-to-date photos of your callers? If yes, then you might check out this little new application (Search market for Gravatar Importer) which walks through your contacts and checks if any of them has a <a href="http://www.gravatar.com">Gravatar</a> picture online. Once a Gravatar is found, it is added to the respective contact.</p>
<p>Combine this with Facebook Sync and you might end up with a phone book full of beautiful photos. Could life be any simpler? Indeed, it could! Someone needs to come up with an app which combines all of them and keeps automatically updating photos from all kind of sources such as Facebook, Gravatar, LinkedIn, Xing, etc.</p>
<p><a href="http://www.webdevbros.net/wp-content/uploads/2009/10/3.png"><img src="http://www.webdevbros.net/wp-content/uploads/2009/10/3-200x300.png" alt="3" title="3" width="200" height="300" class="alignleft size-medium wp-image-798" /></a><br />
<a href="http://www.webdevbros.net/wp-content/uploads/2009/10/4.png"><img src="http://www.webdevbros.net/wp-content/uploads/2009/10/4-200x300.png" alt="4" title="4" width="200" height="300" class="size-medium wp-image-797" /></a></p>
<p><span id="more-795"></span><br />
I wrote this small app to get started with the Android API and because I fully support the idea of Global Recognized Avatars &#8211; it&#8217;s such a geat thing.<br />
One thing I am missing though, is a Gravatar API to add photos. Just think of the following scenario: I take a picture of someone with my phone and add it to his/her contact. Android automatically assigns it to the respective email and adds it to Gravatar using the non-existing API. Gravatar could now ask for confirmation of the picture and make it available for all of us who are in contact with this person. Not sure, but it sounds cool :)</p>
<p><strong>Important note: </strong> It&#8217;s only an Alpha version yet. Be sure keep the app active while it&#8217;s running. Once it&#8217;s inactive it stops and won&#8217;t continue. Will be fixed in the next release.</p>
<p><a href="http://www.webdevbros.net/2009/08/13/9-free-must-have-apps-to-pimp-your-android-phone/">A list of webdevbros recommended application for your Android</a></p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/&amp;t=Android+Gravatar+Importer.+Update+your+phone+book+with+caller+photos&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/&amp;title=Android+Gravatar+Importer.+Update+your+phone+book+with+caller+photos&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/&amp;title=Android+Gravatar+Importer.+Update+your+phone+book+with+caller+photos&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Android+Gravatar+Importer.+Update+your+phone+book+with+caller+photos;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/TaLDFcnIIVtqWZivVC6tpls2VYw/0/da"><img src="http://feedads.g.doubleclick.net/~a/TaLDFcnIIVtqWZivVC6tpls2VYw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TaLDFcnIIVtqWZivVC6tpls2VYw/1/da"><img src="http://feedads.g.doubleclick.net/~a/TaLDFcnIIVtqWZivVC6tpls2VYw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=hojtEOe9f4E:oAUHoJ0DaSM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=hojtEOe9f4E:oAUHoJ0DaSM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=hojtEOe9f4E:oAUHoJ0DaSM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=hojtEOe9f4E:oAUHoJ0DaSM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=hojtEOe9f4E:oAUHoJ0DaSM:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/hojtEOe9f4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/10/14/android-gravatar-importer-update-your-phone-book-with-caller-photos/</feedburner:origLink></item>
		<item>
		<title>Siam Flex framework | First Beta Released! (0.4.0)</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/HOPaawNLn-Y/</link>
		<comments>http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 05:00:18 +0000</pubDate>
		<dc:creator>julien</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Siam Flex]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=708</guid>
		<description><![CDATA[Long time, no news&#8230;. It&#8217;s been almost 6 weeks since the last update of Siam Flex Framework. But today I am proud to present to you the first beta release of Siam!
I&#8217;ve been spending a lot of time refining the core elements of Siam to ensure that we have the right API going forward.
So what&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Long time, no news&#8230;. It&#8217;s been almost 6 weeks since the last update of Siam Flex Framework. But today I am proud to present to you the first beta release of Siam!</p>
<p>I&#8217;ve been spending a lot of time refining the core elements of Siam to ensure that we have the right API going forward.</p>
<h3>So what&#8217;s new?</h3>
<ul>
<li>Easier configuration with improved syntax and default specification</li>
<li>Editors and validators are now supported</li>
<li>Simpler API using factory and context classes</li>
<li>Structured import for all data representation classes</li>
<li>More control over formatting behavior</li>
</ul>
<h3>Where can I download it?</h3>
<p>The project is hosted at <a href="http://code.google.com/p/siam-flex/" target="_blank">http://code.google.com/p/siam-flex/</a>.</p>
<p>You can try out the latest features with the Siam Flex Explorer:<a style="text-decoration:none;" href="http://siam-flex.googlecode.com/svn/trunk/examples/bin-release/SiamExplorer.html" target="_blank"><br />
<img src="http://www.webdevbros.net/wp-content/uploads/2009/10/SiamExplorer.PNG" alt="Siam Flex Explorer" width="800" /></a><br />
The explorer encapsulate an example of application using all features of Siam and allows you to alter its XML configuration at run-time for demonstration purposes. The embedded example include implementations of a dynamic data grid and form, as wells as an adapted chart component.</p>
<p><em>Details follow below&#8230;</em><span id="more-708"></span></p>
<h3>Structured Imports</h3>
<p>Siam heavily relies on reflection to parse configurations and have to deal with one common Flex issue&#8230; If a class is not initially imported into the application, trying to resolve its class name will always fail. The new API allows you to structure and organize your data representation classes import, as show below. Note: the import setters (e.g. <code>importRenderers</code>&#8230;) are optional and have no effect on the behavior of <code>SiamManager</code>.</p>
<pre class="FlexCode"><span class="MXMLProcessing_Instruction">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="MXMLComponent_Tag">&lt;mx:Application</span><span class="MXMLDefault_Text"> xmlns:mx="</span><span class="MXMLString">http://www.adobe.com/2006/mxml</span><span class="MXMLDefault_Text">"
    xmlns:siam="</span><span class="MXMLString">http://code.google.com/p/siam-flex/</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>

    <span class="MXMLSpecial_Tag">&lt;mx:Script&gt;</span>
        <span class="ActionScriptOperator">&lt;!</span><span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">CDATA</span><span class="ActionScriptBracket/Brace">[</span>
            <span class="ActionScriptReserved">import</span> <span class="ActionScriptDefault_Text">mx</span>.<span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptOperator">*</span>
            <span class="ActionScriptReserved">import</span> <span class="ActionScriptDefault_Text">mx</span>.<span class="ActionScriptDefault_Text">controls</span>.<span class="ActionScriptOperator">*</span>;
            <span class="ActionScriptReserved">import</span> <span class="ActionScriptDefault_Text">mx</span>.<span class="ActionScriptDefault_Text">validators</span>.<span class="ActionScriptOperator">*</span>;

            ...
        <span class="ActionScriptBracket/Brace">]]</span><span class="ActionScriptOperator">&gt;</span>
    <span class="MXMLSpecial_Tag">&lt;/mx:Script&gt;</span>

    <span class="MXMLComponent_Tag">&lt;siam:SiamManager</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">siam</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLSpecial_Tag">&lt;mx:XML</span><span class="MXMLDefault_Text"> source="</span><span class="MXMLString">siam.cfg.xml</span><span class="MXMLDefault_Text">" </span><span class="MXMLSpecial_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;siam:importFormatters&gt;</span>{<span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">DateFormatter</span>,<span class="ActionScriptDefault_Text">NumberFormatter</span>,<span class="ActionScriptDefault_Text">CurrencyFormatter</span>,<span class="ActionScriptDefault_Text">ZipCodeFormatter</span>,<span class="ActionScriptDefault_Text">PhoneFormatter</span><span class="ActionScriptBracket/Brace">]</span>}<span class="MXMLComponent_Tag">&lt;/siam:importFormatters&gt;</span>
        <span class="MXMLComponent_Tag">&lt;siam:importRenderers&gt;</span>{<span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">Label</span>,<span class="ActionScriptDefault_Text">CheckBox</span><span class="ActionScriptBracket/Brace">]}</span><span class="MXMLComponent_Tag">&lt;/siam:importRenderers&gt;</span>
        <span class="MXMLComponent_Tag">&lt;siam:importEditors&gt;</span>{<span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">TextInput</span>, <span class="ActionScriptDefault_Text">NumericStepper</span>, <span class="ActionScriptDefault_Text">CheckBox</span>, <span class="ActionScriptDefault_Text">ComboBox</span>, <span class="ActionScriptDefault_Text">HSlider</span>, <span class="ActionScriptDefault_Text">ColorPicker</span>, <span class="ActionScriptDefault_Text">Image</span><span class="ActionScriptBracket/Brace">]</span>}<span class="MXMLComponent_Tag">&lt;/siam:importEditors&gt;</span>
        <span class="MXMLComponent_Tag">&lt;siam:importValidators&gt;</span>{<span class="ActionScriptBracket/Brace">[</span><span class="ActionScriptDefault_Text">StringValidator</span>,<span class="ActionScriptDefault_Text">EmailValidator</span>,<span class="ActionScriptDefault_Text">RegExpValidator</span><span class="ActionScriptBracket/Brace">]</span>}<span class="MXMLComponent_Tag">&lt;/siam:importValidators&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/siam:SiamManager&gt;</span>

    ...

<span class="MXMLComponent_Tag">&lt;/mx:Application&gt;</span></pre>
<h3>Formatters</h3>
<ul>
<li>standard implementation is now available (missing from SDK). The format function implicitly calls <code>toString()</code> on any given non-null parameter or returns <code>null</code> otherwise (<code>org.siam.impl.data.formatters.StringFormatter</code>)</li>
<li>a default formatter may be configured by simply using keyword <code>default</code> as an id</li>
<li>ability to override  formatting behavior when input is missing or blank (see <code>ifNull</code> and <code>ifEmpty</code>, may be configured for each formatter)</li>
</ul>
<h4>XML Configuration</h4>
<pre class="FlexCode"><span class="MXMLComponent_Tag">&lt;formatters&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">org.siam.impl.data.formatters.StringFormatter</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;formatter</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">default</span><span class="MXMLDefault_Text">" ifNull="</span><span class="MXMLString">n/a</span><span class="MXMLDefault_Text">" ifEmpty="</span><span class="MXMLString">(Blank)</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.formatters.NumberFormatter</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;formatter</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">integer</span><span class="MXMLDefault_Text">" precision="</span><span class="MXMLString">0</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.formatters.CurrencyFormatter</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;formatter</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">money</span><span class="MXMLDefault_Text">" precision="</span><span class="MXMLString">1</span><span class="MXMLDefault_Text">" currencySymbol="</span><span class="MXMLString">$ </span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.formatters.PhoneFormatter</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;formatter</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">phone</span><span class="MXMLDefault_Text">" formatString="</span><span class="MXMLString">(##)###-####</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
<span class="MXMLComponent_Tag">&lt;/formatters&gt;</span></pre>
<h4>API Examples</h4>
<pre class="FlexCode"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">formatters</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IFormattersManager</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">siam</span>.<span class="ActionScriptDefault_Text">formatters</span>;
<span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span>10, <span class="ActionScriptString">"money"</span><span class="ActionScriptBracket/Brace">))</span>;       <span class="ActionScriptComment">// $ 10.0
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"text"</span>, <span class="ActionScriptString">"any"</span><span class="ActionScriptBracket/Brace">))</span>;     <span class="ActionScriptComment">// text
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptReserved">null</span>, <span class="ActionScriptString">"any"</span><span class="ActionScriptBracket/Brace">))</span>;       <span class="ActionScriptComment">// n/a
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">""</span>, <span class="ActionScriptString">"any"</span><span class="ActionScriptBracket/Brace">))</span>;         <span class="ActionScriptComment">// (Blank)
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">formatters</span>.<span class="ActionScriptDefault_Text">has</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"boolean"</span><span class="ActionScriptBracket/Brace">))</span>;            <span class="ActionScriptComment">// false
</span></pre>
<h3>Renderers</h3>
<ul>
<li>each renderer can be described using setters, variables and now style properties</li>
<li>a default renderer may be configured by simply using keyword <code>default</code> as an id. For instance, you might want to center horizontally all your application data renderers (especially useful with data grids)</li>
<li>each renderer can be instantiated through factory pattern which is accessible via <code>IRendererContext</code>.</li>
</ul>
<h4>XML Configuration</h4>
<pre class="FlexCode"><span class="MXMLComponent_Tag">&lt;renderers&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.Label</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;renderer</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">default</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">center</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;renderer</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">number</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">right</span><span class="MXMLDefault_Text">" color="</span><span class="MXMLString">0xFF0000</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.Image</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;renderer</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">image</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.CheckBox</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;renderer</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">boolean</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">center</span><span class="MXMLDefault_Text">" enabled="</span><span class="MXMLString">false</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">custom.GravatarImage</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;renderer</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">gravatar</span><span class="MXMLDefault_Text">" size="</span><span class="MXMLString">60</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
<span class="MXMLComponent_Tag">&lt;/renderers&gt;</span></pre>
<h4>API Examples</h4>
<pre class="FlexCode"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">renderers</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IRenderersManager</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">siam</span>.<span class="ActionScriptDefault_Text">renderers</span>;
<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">renderer</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IRendererContext</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">renderers</span>.<span class="ActionScriptDefault_Text">find</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"fourwd"</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">ObjectUtil</span>.<span class="ActionScriptDefault_Text">toString</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">renderer</span>.<span class="ActionScriptDefault_Text">factory</span><span class="ActionScriptBracket/Brace">))</span>; <span class="ActionScriptComment">/*
(org.siam.utils::UIComponentFactory)#0
  generator = (mx.controls::Label)
  properties = (Object)#1
  styles = (Object)#2
    textAlign = "center"
*/</span></pre>
<h3>Editors</h3>
<ul>
<li>each editor can be described using setters, variables and style properties.</li>
<li>arrays are supported globally and can be useful for enumerations (e.g in a <code>ComboBox</code>)</li>
<li>a default editor may be configured by simply using keyword <code>default</code> as an id (useful with data forms, e.g text inputs).</li>
<li>for each editor, you may specify via <code>dataField</code> the property that returns the new data (for instance needed in Flex DataGrid components).</li>
<li>each editor can be instantiated through factory pattern which is accessible via <code>IEditorContext </code> (along with other metadata)</li>
</ul>
<h4>XML Configuration</h4>
<pre class="FlexCode"><span class="MXMLComponent_Tag">&lt;editors&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.TextInput</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">default</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">right</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">text</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.NumericStepper</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">yearStepper</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">right</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">value</span><span class="MXMLDefault_Text">" minimum="</span><span class="MXMLString">1990</span><span class="MXMLDefault_Text">" maximum="</span><span class="MXMLString">2010</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">priceStepper</span><span class="MXMLDefault_Text">" textAlign="</span><span class="MXMLString">right</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">value</span><span class="MXMLDefault_Text">" minimum="</span><span class="MXMLString">0</span><span class="MXMLDefault_Text">" maximum="</span><span class="MXMLString">50000</span><span class="MXMLDefault_Text">" stepSize="</span><span class="MXMLString">500</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.CheckBox</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">boolean</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">selected</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.ComboBox</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">categories</span><span class="MXMLDefault_Text">" dataProvider="</span><span class="MXMLString">[assets/luxury.jpg,assets/sedan.jpg,assets/suv.jpg,assets/hybrid.jpg]</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">selectedItem</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.HSlider</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">mileageSlider</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">value</span><span class="MXMLDefault_Text">" maximum="</span><span class="MXMLString">150000</span><span class="MXMLDefault_Text">" liveDragging="</span><span class="MXMLString">true</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.controls.ColorPicker</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;editor</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">colorPicker</span><span class="MXMLDefault_Text">" dataField="</span><span class="MXMLString">selectedColor</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
<span class="MXMLComponent_Tag">&lt;/editors&gt;</span></pre>
<h4>API Examples</h4>
<pre class="FlexCode"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">editors</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IEditorsManager</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">siam</span>.<span class="ActionScriptDefault_Text">editors</span>;
<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">editor</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IEditorContext</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">editors</span>.<span class="ActionScriptDefault_Text">find</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"price"</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">editor</span>.<span class="ActionScriptDefault_Text">dataField</span><span class="ActionScriptBracket/Brace">)</span>;    <span class="ActionScriptComment">// text
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">ObjectUtil</span>.<span class="ActionScriptDefault_Text">toString</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">editor</span>.<span class="ActionScriptDefault_Text">factory</span><span class="ActionScriptBracket/Brace">))</span>; <span class="ActionScriptComment">/*
(org.siam.utils::UIComponentFactory)#0
  generator = (mx.controls::TextInput)
  properties = (Object)#1
  styles = (Object)#2
    textAlign = "right"
*/</span></pre>
<h3>Validators</h3>
<ul>
<li>each validator can be described using setters and variables.</li>
<li>regular expressions are supported globally but need to be escaped in the XML configuration file (see <code>mx.validators.RegExpValidator</code>)</li>
<li>a default validator may be configured by simply using keyword <code>default</code> as an id (for instance, all text inputs in your application are by default required).</li>
<li>each validator can be instantiated through factory pattern which is accessible via <code>IValidatorContext</code>.</li>
</ul>
<h4>XML Configuration</h4>
<pre class="FlexCode"><span class="MXMLComponent_Tag">&lt;validators&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.validators.StringValidator</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;validator</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">default</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;validator</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">requiredOnly</span><span class="MXMLDefault_Text">" required="</span><span class="MXMLString">true</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.validators.RegExpValidator</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;validator</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">zipcode</span><span class="MXMLDefault_Text">" expression="</span><span class="MXMLString">^\\d\{</span>2<span class="ActionScriptDefault_Text">\</span><span class="MXMLString">}-\\d\{</span>3<span class="ActionScriptDefault_Text">\</span><span class="MXMLString">}$</span><span class="MXMLDefault_Text">" required="</span><span class="MXMLString">true</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
    <span class="MXMLComponent_Tag">&lt;class</span><span class="MXMLDefault_Text"> name="</span><span class="MXMLString">mx.validators.EmailValidator</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;validator</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">email</span><span class="MXMLDefault_Text">" required="</span><span class="MXMLString">true</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/class&gt;</span>
<span class="MXMLComponent_Tag">&lt;/validators&gt;</span></pre>
<h4>API Examples</h4>
<pre class="FlexCode"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">validators</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IValidatorsManager</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">siam</span>.<span class="ActionScriptDefault_Text">validators</span>;
<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">validator</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">IValidatorContext</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">validators</span>.<span class="ActionScriptDefault_Text">find</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"email"</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">ObjectUtil</span>.<span class="ActionScriptDefault_Text">toString</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">validator</span>.<span class="ActionScriptDefault_Text">factory</span><span class="ActionScriptBracket/Brace">))</span>; <span class="ActionScriptComment">/*
(mx.core::ClassFactory)#0
  generator = (mx.validators::EmailValidator)
  properties = (Object)#1
    required = true
*/</span></pre>
<h3>Schemas</h3>
<ul>
<li>Multiple data model schemas can be described in a Siam XML configuration file.</li>
<li>Each schema property can point to any data representation id (<code>formatter</code>, <code>renderer</code>, <code>editor</code>, <code>validator</code>). If none is specified, it will use the default one (if any).</li>
<li>Any meta-data may be added to the property configuration and retrieve via function <code>findMetadata </code>in <code>ISchemaManager</code>.</li>
</ul>
<h4>XML Configuration</h4>
<pre class="FlexCode"><span class="MXMLComponent_Tag">&lt;schemas&gt;</span>
    <span class="MXMLComponent_Tag">&lt;schema</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">car</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">category</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Category</span><span class="MXMLDefault_Text">" renderer="</span><span class="MXMLString">image</span><span class="MXMLDefault_Text">" editor="</span><span class="MXMLString">categories</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">make</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Make</span><span class="MXMLDefault_Text">" validator="</span><span class="MXMLString">requiredOnly</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">model</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Model</span><span class="MXMLDefault_Text">" validator="</span><span class="MXMLString">requiredOnly</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">year</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Year</span><span class="MXMLDefault_Text">" editor="</span><span class="MXMLString">yearStepper</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">mileage</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Mileage</span><span class="MXMLDefault_Text">" formatter="</span><span class="MXMLString">integer</span><span class="MXMLDefault_Text">" renderer="</span><span class="MXMLString">number</span><span class="MXMLDefault_Text">" editor="</span><span class="MXMLString">mileageSlider</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">price</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Price</span><span class="MXMLDefault_Text">" formatter="</span><span class="MXMLString">money</span><span class="MXMLDefault_Text">" renderer="</span><span class="MXMLString">number</span><span class="MXMLDefault_Text">" editor="</span><span class="MXMLString">priceStepper</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">location</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Location</span><span class="MXMLDefault_Text">" validator="</span><span class="MXMLString">zipcode</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">owner</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Owner</span><span class="MXMLDefault_Text">" renderer="</span><span class="MXMLString">gravatar</span><span class="MXMLDefault_Text">" validator="</span><span class="MXMLString">email</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">contact</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">Contact</span><span class="MXMLDefault_Text">" formatter="</span><span class="MXMLString">phone</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;property</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">fourwd</span><span class="MXMLDefault_Text">" name="</span><span class="MXMLString">4WD</span><span class="MXMLDefault_Text">" renderer="</span><span class="MXMLString">boolean</span><span class="MXMLDefault_Text">" editor="</span><span class="MXMLString">boolean</span><span class="MXMLDefault_Text">" </span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/schema&gt;</span>
<span class="MXMLComponent_Tag">&lt;/schemas&gt;</span></pre>
<h4>API Examples</h4>
<pre class="FlexCode"><span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">car</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">Object</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptBracket/Brace">{</span> <span class="ActionScriptDefault_Text">make</span><span class="ActionScriptOperator">:</span><span class="ActionScriptString">"Land Rover"</span>, <span class="ActionScriptDefault_Text">mileage</span><span class="ActionScriptOperator">:</span><span class="ActionScriptString">"17800"</span> <span class="ActionScriptBracket/Brace">}</span>;
<span class="ActionScriptvar">var</span> <span class="ActionScriptDefault_Text">schema</span><span class="ActionScriptOperator">:</span><span class="ActionScriptDefault_Text">ISchemaManager</span> <span class="ActionScriptOperator">=</span> <span class="ActionScriptDefault_Text">siam</span>.<span class="ActionScriptDefault_Text">manage</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"car"</span><span class="ActionScriptBracket/Brace">)</span>;
<span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">findMetadata</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"name"</span>, <span class="ActionScriptString">"fourwd"</span><span class="ActionScriptBracket/Brace">))</span>;    <span class="ActionScriptComment">// 4WD
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">car</span>, <span class="ActionScriptString">"mileage"</span><span class="ActionScriptBracket/Brace">))</span>;            <span class="ActionScriptComment">// 17,800
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">format</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">car</span>, <span class="ActionScriptString">"year"</span><span class="ActionScriptBracket/Brace">))</span>;               <span class="ActionScriptComment">// n/a
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">findRenderer</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"owner"</span><span class="ActionScriptBracket/Brace">))</span>;             <span class="ActionScriptComment">// [Object IRendererContext]
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">findEditor</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"price"</span><span class="ActionScriptBracket/Brace">))</span>;               <span class="ActionScriptComment">// [Object IEditorContext]
</span><span class="ActionScripttrace">trace</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptDefault_Text">schema</span>.<span class="ActionScriptDefault_Text">findValidator</span><span class="ActionScriptBracket/Brace">(</span><span class="ActionScriptString">"email"</span><span class="ActionScriptBracket/Brace">))</span>;            <span class="ActionScriptComment">// [Object IValidatorContext]
</span></pre>
<h3>Conclusion</h3>
<p>I was able to successfully use this beta version in an application for a customer, dealing with:</p>
<ul>
<li> dynamic data grid and forms for administration purposes</li>
<li>reporting dashboards with pivot tables and charting components</li>
<li>basic OLAP and CRUD operations with lightweight transfer objects and simple data-types</li>
</ul>
<p>All in all, it saved me bunch of times and now maintenance has never been easier&#8230;</p>
<p>Please try it out and let me know if you like it and how it works for your applications. I&#8217;d be very curious to know what limitations exist in other types of applications and architectures (complex TO, web services, &#8230;)</p>
<p>I am looking forward to your feedback.</p>
<p>Julien</p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/&amp;t=Siam+Flex+framework+%7C+First+Beta+Released%21+%280.4.0%29&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/&amp;title=Siam+Flex+framework+%7C+First+Beta+Released%21+%280.4.0%29&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/&amp;title=Siam+Flex+framework+%7C+First+Beta+Released%21+%280.4.0%29&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Siam+Flex+framework+%7C+First+Beta+Released%21+%280.4.0%29;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/FipF3t-aUHUQw7SXuZPdlQ5mALY/0/da"><img src="http://feedads.g.doubleclick.net/~a/FipF3t-aUHUQw7SXuZPdlQ5mALY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FipF3t-aUHUQw7SXuZPdlQ5mALY/1/da"><img src="http://feedads.g.doubleclick.net/~a/FipF3t-aUHUQw7SXuZPdlQ5mALY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=HOPaawNLn-Y:bbNoC3TGO8I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=HOPaawNLn-Y:bbNoC3TGO8I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=HOPaawNLn-Y:bbNoC3TGO8I:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=HOPaawNLn-Y:bbNoC3TGO8I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=HOPaawNLn-Y:bbNoC3TGO8I:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/HOPaawNLn-Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/10/05/siam-flex-framework-first-beta-released-0-4-0/</feedburner:origLink></item>
		<item>
		<title>Are you listening to music while coding? Then try this simple game …</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/6tN1jEXymIA/</link>
		<comments>http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 06:33:23 +0000</pubDate>
		<dc:creator>Michal</dc:creator>
				<category><![CDATA[fun]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=700</guid>
		<description><![CDATA[Lately I&#8217;ve started listening to music on my iPod while coding. Some people love it, some hate it. As with me, I enjoy it so far &#8211; seems to inspire me. Nevertheless, I can&#8217;t do it all the day.
Anyway. Whatever.
If you are not the only one who listens to his iPod in your office, then [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.webdevbros.net/wp-content/uploads/2009/10/iswtichme.png" alt="iswtichme" title="iswtichme" width="300" height="283" class="aligncenter size-full wp-image-704" />Lately I&#8217;ve started listening to music on my iPod while coding. Some people love it, some hate it. As with me, I enjoy it so far &#8211; seems to inspire me. Nevertheless, I can&#8217;t do it all the day.</p>
<p>Anyway. Whatever.</p>
<p>If you are not the only one who listens to his iPod in your office, then try this simple game:</p>
<blockquote><p>
Switch iPods with your colleagues and get a chance to widen your music taste. It&#8217;s interesting. You&#8217;ll be surprised what your mates are listening too.</p></blockquote>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/&amp;t=Are+you+listening+to+music+while+coding%3F+Then+try+this+simple+game+...&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/&amp;title=Are+you+listening+to+music+while+coding%3F+Then+try+this+simple+game+...&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/&amp;title=Are+you+listening+to+music+while+coding%3F+Then+try+this+simple+game+...&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Are+you+listening+to+music+while+coding%3F+Then+try+this+simple+game+...;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/DJbUNfSLTAo8q7nn8cr_aV_FX_A/0/da"><img src="http://feedads.g.doubleclick.net/~a/DJbUNfSLTAo8q7nn8cr_aV_FX_A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/DJbUNfSLTAo8q7nn8cr_aV_FX_A/1/da"><img src="http://feedads.g.doubleclick.net/~a/DJbUNfSLTAo8q7nn8cr_aV_FX_A/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=6tN1jEXymIA:tqloSfG2wMQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=6tN1jEXymIA:tqloSfG2wMQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=6tN1jEXymIA:tqloSfG2wMQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=6tN1jEXymIA:tqloSfG2wMQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=6tN1jEXymIA:tqloSfG2wMQ:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/6tN1jEXymIA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/10/01/are-you-listening-to-music-while-coding-then-try-this-simple-game/</feedburner:origLink></item>
		<item>
		<title>hurl: Simple service to initiate HTTP requests and trace its response</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/g7aNfbcaGEU/</link>
		<comments>http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 09:32:01 +0000</pubDate>
		<dc:creator>Michal</dc:creator>
				<category><![CDATA[tools]]></category>
		<category><![CDATA[follow redirect]]></category>
		<category><![CDATA[format response]]></category>
		<category><![CDATA[http headers]]></category>
		<category><![CDATA[post params]]></category>
		<category><![CDATA[request]]></category>
		<category><![CDATA[response]]></category>
		<category><![CDATA[simulate]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=691</guid>
		<description><![CDATA[ Ever needed  to examine a response for a given request? Here we go! hurl is a neat and simple web based service which allows us to initiate a customized HTTP request and presents the resulting response in a nicely formatted manner. Free, responsive and several configuration options.
This is how Chris and Leah &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/hurl.png" alt="hurl" title="hurl" width="118" height="53" class="alignleft size-full wp-image-692" /> Ever needed  to examine a response for a given request? Here we go! <a href="http://hurl.r09.railsrumble.com/">hurl</a> is a neat and simple web based service which allows us to initiate a customized HTTP request and presents the resulting response in a nicely formatted manner. Free, responsive and several configuration options.</p>
<p>This is how Chris and Leah &#8211; the creators of hurl &#8211; put it:</p>
<blockquote><p>
Hurl makes HTTP requests.</p>
<p>Choose the request method, customize headers and POST parameters, add basic authorization, and even follow redirects. Then view the nicely formatted request and response.</p>
<p>It&#8217;s the perfect tool for testing APIs. Just enter a URL and click send.
</p></blockquote>
<p><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/hurl0.png" alt="hurl0" title="hurl0" width="338" height="200" class="aligncenter size-full wp-image-693" /></p>
<p>Formatted request details (incl. followed redirects!)</p>
<p><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/hurl1.png" alt="hurl1" title="hurl1" width="412" height="284" class="aligncenter size-full wp-image-694" /></p>
<p>Formatted response example</p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/&amp;t=hurl%3A+Simple+service+to+initiate+HTTP+requests+and+trace+its+response+&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/&amp;title=hurl%3A+Simple+service+to+initiate+HTTP+requests+and+trace+its+response+&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/&amp;title=hurl%3A+Simple+service+to+initiate+HTTP+requests+and+trace+its+response+&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=hurl%3A+Simple+service+to+initiate+HTTP+requests+and+trace+its+response+;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/r3XPXzMyGM8HB5R5CIkkTOV7c5o/0/da"><img src="http://feedads.g.doubleclick.net/~a/r3XPXzMyGM8HB5R5CIkkTOV7c5o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/r3XPXzMyGM8HB5R5CIkkTOV7c5o/1/da"><img src="http://feedads.g.doubleclick.net/~a/r3XPXzMyGM8HB5R5CIkkTOV7c5o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=g7aNfbcaGEU:3m7yh6qQeO4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=g7aNfbcaGEU:3m7yh6qQeO4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=g7aNfbcaGEU:3m7yh6qQeO4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=g7aNfbcaGEU:3m7yh6qQeO4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=g7aNfbcaGEU:3m7yh6qQeO4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/g7aNfbcaGEU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/08/26/simple-service-to-initiate-http-requests-and-trace-its-response/</feedburner:origLink></item>
		<item>
		<title>HTC Magic VS HTC Touch HD</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/u0MMx_10oMg/</link>
		<comments>http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 02:58:14 +0000</pubDate>
		<dc:creator>Sarun Sermsuwan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[comparison]]></category>
		<category><![CDATA[htc]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[phone]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[touch hd]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=533</guid>
		<description><![CDATA[I’ve been using my HTC touch HD for almost 2 months now, it’s about the same period of time my friend’s been using his brand new Android powered mobile phone, HTC Magic. Ever since we started using our new phones, we’ve been having several discussions trying to figure out which smartphone is worth the money [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been using my HTC touch HD for almost 2 months now, it’s about the same period of time my friend’s been using his brand new Android powered mobile phone, HTC Magic. Ever since we started using our new phones, we’ve been having several discussions trying to figure out which smartphone is worth the money spent for it.  Many people especially developer or techie might ask “why wasting time comparing these 2 phones?” because they would vote for HTC Magic anyway.  Anyhow, my intention in writing this review is just to provide you with the truth about the phones through my own personal experience. So I decided to make a comparison between these two devices –“HTC touch HD”, one of the most complete multimedia supported phone available in the global market and “HTC Magic”, the one that is expected to be an iPhone killer.    </p>
<div style="text-align: center"><img class="alignnone size-full wp-image-535" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_vs_touchHD.jpg" alt="magic_vs_touchHD" width="474" height="337" />     </div>
<h2>Overview</h2>
<p>If you have owned a Windows Mobile device for the past 4-5 years, then you are familiar with Windows Mobile tab style user interface and its sluggish-paced product development (from Windows Mobile 2003 to Windows Mobile 5 and later on Window Mobile 6)…….<span id="more-533"></span> The Windows Mobile seemed to raise brand and product awareness among current and prospective end users until Apple adapted an idea of touch-screen capability into their groundbreaking product “iPhone”. The launch of Apple’s iPhone attracted a lot of attentions from various group of users, especially from young people because of its stunning display, sleek design, and innovative multitouch user interface. Unfortunately, the advanced technology of iPhone has causing HTC Windows Mobile devices to becomes obsolete. </p>
<p>In order to compete with the iPhone, new HTC models with new user interface were launched. The first one is their self-developed graphical user interface called TouchFlo 3D.  Later on Google was in for the challenge, they cooperated with HTC to develop more powerful OS onto the device called “HTC dream”, which is the first model in android-running mobile phone.  Recently HTC Magic was launched. And now, the story is getting closer to the climax.</p>
<h2>Specification</h2>
<p> </p>
<div style="text-align: center">
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="205" valign="top">Model</td>
<td width="205" valign="top">Touch HD</td>
<td width="205" valign="top">Magic</td>
</tr>
<tr>
<td width="205" valign="top">Manufacturer</td>
<td width="205" valign="top">HTC</td>
<td width="205" valign="top">HTC</td>
</tr>
<tr>
<td width="205" valign="top">Networks</td>
<td width="205" valign="top">850/900/1800/1900 WCDMA 900/2100</td>
<td width="205" valign="top">850/900/1800/1900 WCDMA 900/2100</td>
</tr>
<tr>
<td width="205" valign="top">HSCSD</td>
<td width="205" valign="top">N</td>
<td width="205" valign="top">N</td>
</tr>
<tr>
<td width="205" valign="top">GPRS</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">EDGE</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">UMTS</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">HSDPA</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">WLAN/Wi-Fi</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Weight</td>
<td width="205" valign="top">147</td>
<td width="205" valign="top">119</td>
</tr>
<tr>
<td width="205" valign="top">Size (HxWxD)</td>
<td width="205" valign="top">115&#215;63x12mm</td>
<td width="205" valign="top">113&#215;55x14mm</td>
</tr>
<tr>
<td width="205" valign="top">Battery</td>
<td width="205" valign="top">1350 mAh</td>
<td width="205" valign="top">1340 mAh</td>
</tr>
<tr>
<td width="205" valign="top">Standbytime (m)</td>
<td width="205" valign="top">450</td>
<td width="205" valign="top">420</td>
</tr>
<tr>
<td width="205" valign="top">Talktime (m)</td>
<td width="205" valign="top">390</td>
<td width="205" valign="top">450</td>
</tr>
<tr>
<td width="205" valign="top">SMS</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">MMS</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Email</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Irda</td>
<td width="205" valign="top">N</td>
<td width="205" valign="top">N</td>
</tr>
<tr>
<td width="205" valign="top">Bluetooth</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">USB connectivity</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">GPS</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Java</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">FM radio</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">N</td>
</tr>
<tr>
<td width="205" valign="top">Camera</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Camera resolution</td>
<td width="205" valign="top">5 megapixel, autofocus</td>
<td width="205" valign="top">3.2 megapixel, autofocus</td>
</tr>
<tr>
<td width="205" valign="top">Camera flash</td>
<td width="205" valign="top">N</td>
<td width="205" valign="top">N</td>
</tr>
<tr>
<td width="205" valign="top">Video recording</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Number of colours</td>
<td width="205" valign="top">65,000</td>
<td width="205" valign="top">NA</td>
</tr>
<tr>
<td width="205" valign="top">Display resolution</td>
<td width="205" valign="top">800&#215;480</td>
<td width="205" valign="top">480&#215;320</td>
</tr>
<tr>
<td width="205" valign="top">LCD size</td>
<td width="205" valign="top">3.8 inch</td>
<td width="205" valign="top">3.2 inch</td>
</tr>
<tr>
<td width="205" valign="top">Touchscreen</td>
<td width="205" valign="top">Y</td>
<td width="205" valign="top">Y</td>
</tr>
<tr>
<td width="205" valign="top">Memory</td>
<td width="205" valign="top">288MB, Expandable with microSD card</td>
<td width="205" valign="top">192MB, Expandable with microSD card</td>
</tr>
<tr>
<td width="205" valign="top">Ringtones/Music file format</td>
<td width="205">Polyphonic, •AAC, AAC+, eAAC+, AMR-NB, A</td>
<td width="205">Polyphonic, MP3</td>
</tr>
<tr>
<td width="205" valign="top">CPU</td>
<td width="205" valign="top">Qualcomm MSM7201a 528MHz</td>
<td width="205" valign="top">Qualcomm MSM7201a 528MHz</td>
</tr>
<tr>
<td width="205" valign="top">Operating system</td>
<td width="205" valign="top">Windows Mobile 6.1 professional  HTC TouchFlo 3D</td>
<td width="205" valign="top">Android</td>
</tr>
<tr>
<td width="205" valign="top">Price</td>
<td width="205" valign="top">$940</td>
<td width="205" valign="top">$740</td>
</tr>
</tbody>
</table>
</div>
<p style="text-align: center">** Comparison Chart from Esato, <a href="http://www.esato.com/phones/compare.php?phone=423&amp;cp=456">http://www.esato.com/phones/compare.php?phone=423&amp;cp=456</a></p>
<h2>Exterior</h2>
<p>The Touch HD is well-designed; slim and sexy. The phone perfectly fits in my hand; it has the same size as iPhone 3G. I don’t really agree with the details shown in the comparison chart, I found that, with battery, it is lighter than the HTC Magic. I love its button layout because there are only four of them, and it’s good to see a 5-mega pixel camera on its back as well as the 3.5mm headphone jack at the top. The Touch HD has the widest screen I ever found on mobile phone Windows device; unfortunately it comes only in black color.</p>
<div style="text-align: center"><img class="alignnone size-full wp-image-542" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_exterior01.jpg" alt="touch_hd_exterior01" width="254" height="192" /> <img class="alignnone size-full wp-image-546" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_exterior02.jpg" alt="touch_hd_exterior02" width="258" height="192" /><br />
HTC Touch HD</div>
<p> </p>
<p>The Magic, on the other hand, has the same sleek and attractive design but slimmer and smaller than the HD, it perfectly fits in one hand. The device has a slight raised profile at bottom, which I personally think that the Magic might look better without it. The bottom part has 6 buttons and a track ball in the middle.  The Magic lacks a 3.5mm headphone jack and equipped with only 3.2 mega-pixel camera. It is only available in 3 colors: white, black and red. So for those who are thinking of buying this device can have their options. The question of “Which color suits you?” is just a matter of personal preference.</p>
<div style="text-align: center"><img class="alignnone size-full wp-image-547" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_exterior01.jpg" alt="magic_exterior01" width="229" height="171" /><img class="alignnone size-full wp-image-548" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_exterior02.jpg" alt="magic_exterior02" width="228" height="171" /><br />
HTC Magic</div>
<h2>Interface</h2>
<p>I will start with the interface of the HTC touch HD first. The Touch HD is equipped with an interface called TouchFlo 3D, well- known for touch action, designed to use as an integrated interface for the latest Windows Mobile 6.1 platform. The phone looks pretty amazing at first glance: stylish and elegant which will easily grab attention of regular HTC users like me, even before exploring its functions. As you might have seen one already, it is really slick and shiny, isn’t it? Basically, the HD’s user interface has 11 tabs which include: Home, People, Messages, Mail, Internet, Stock, Photos and Videos, Music, Weather, Settings, and Programs. Navigating through these taps can be done by using either stylus or bare fingers.</p>
<p>Scrolling tab allows users to access most frequently used items for quick and easy text messaging, emailing, etc.  Users can easily flick their finger to move from one tab to the next or even flip up and down through items in particular applications.  Touchflo 3D interface gives you the ability to access specific items without having to go through an applications front door. For example, you can directly open a bookmark in MSIE or play a specific song in your library.</p>
<div style="text-align: center"><img class="alignnone size-full wp-image-549" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_desktop.jpg" alt="touch_hd_desktop" width="146" height="242" /> <img class="alignnone size-full wp-image-550" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_menu.jpg" alt="touch_hd_menu" width="145" height="242" /><br />
The home and menu screens of the Touch HD</div>
<p> </p>
<p>The Magic is a smartphone running on Android (v1.5, a.k.a. Cupcake), a to-die-for google powered OS. Its interface has a sleek, attractive design with vivid color icon display. From my first hand-on experience with the Magic, the phone was really fast and very responsive comparing to other mobile OSes such as Windows Mobile’s OS or even Apple IPhone’s OS. However, in order to control the device, you can use only the trackball or your finger to navigate through the menus. Unlike the Touch HD, you can not use stylus with the HTC Magic because its capacitive screen dose not support multi-touch yet. The heat sensitive screen will only work with your fingertip. If you have a long fingernail, it would become a little bit difficult to control the device by touch. One semi-hidden feature: the home screen is actually three screens wide; sliding a finger left or right will bring up a blank screen for storing more icons and widgets. It’s so cool that you also have copy&amp;paste functionality like in Windows.</p>
<div style="text-align: center"><img class="alignnone size-full wp-image-556" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_desktop.gif" alt="magic_desktop" width="190" height="285" /> <img class="alignnone size-full wp-image-554" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_menu.jpg" alt="magic_menu" width="190" height="285" /><br />
Android’s desktop and its menu</div>
<p> </p>
<p>The panel at the bottom once pulled out displays the menu of all application, while the top panel notifies about events, battery life, signal strength, incoming phone calls and messages. From my point of view, I really like its Gui design in term of user-friendliness, because users can access almost everything right  from the home screen, they don’t have to get into deeper-level menu in order to do operations. </p>
<div style="text-align: center"><img class="alignnone size-full wp-image-558" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_dialer.jpg" alt="magic_dialer" width="171" height="256" /> <img class="alignnone size-full wp-image-557" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_dialer.jpg" alt="touch_hd_dialer" width="154" height="258" /><br />
Android’s smart dialer (left) compared to TouchFlo 3D’s (right)</div>
<p> </p>
<h3>Resolution</h3>
<p>Aimed primarily at entertainment lovers, the Touch HD is actually the first amongst new generation smartphones equipped with a massive 3.8” display screen. It offers WVGA resolution that allows users to watch high bit-rate movies on it.  On the other hand, the HTC Magic with its  3.2” display screen cannot even be compared with the HD, and besides that it only supports QVGA.  All these nice features definitely put the Touch HD to the top of multi-media smartphones over the HTC Magic. </p>
<h3>On-screen keyboard</h3>
<p>One important feature for most touch screen smartphones is certainly the keyboard. Even though both models don’t support a slide-out keyboard, they actually provide on-screen keyboard. Look very nice, isn’t it? The Touch HD’s on-screen keyboard buttons are quite huge and seem to offer a great typing experience. The predictive typing feature is cool for those who always have typos when composing emails or SMS. The best part is that the display is vey sensitive to the touch; only light tapping is required when typing.</p>
<div style="text-align: center"><span style="font-size: medium"><span style="color: #d99594"><span style="font-family: Cambria"><span style="font-size: medium"><span style="color: #d99594"><span style="font-family: Cambria"><img class="alignnone size-full wp-image-563" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_keyboard.jpg" alt="touch_hd_keyboard" width="169" height="281" /><br />
</span></span></span></span></span></span><br />
The virtual keyboard of the Touch HD</div>
<p> </p>
<p>However, the keyboard of the Magic is only half an inch smaller than the Touch HD. But it makes a big difference when using it. Since the Magic has a capacitive touch screen, for those whose fingertips are slightly large or one who has hand-eye coordination problems &#8211; <em>typing speed and accuracy</em>, might find it a bit difficult to work with.</p>
<div style="text-align: center"><img class="aligncenter" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_keyboard.jpg" alt="magic_keyboard" width="212" height="153" /><br />
The virtual keyboard of the HTC Magic</div>
<h2>Application</h2>
<p>The Windows Mobile market share dropped drastically, it’s definitely in need of a major overhaul for the next Windows Mobile OS to survive. According to statistics from a global leading ad network, <span style="text-decoration: underline"><a href="http://metrics.admob.com/wp-content/uploads/2009/07/admob-mobile-metrics-june-09.pdf">admob</a></span>, as that of Android is going with a good prosperity.  The number of android apps currently available in the market might be relatively small, but in two years you might see many of new applications coming out on Android. This will happen once more developers and manufacturers start to work on Android platform.</p>
<p>For Android, there are already a number of applications out there. The Magic is preloaded with YouTube app, Google Latitude, Android Market &amp; Google Talk app. And, if you still want more, it’s amazingly easy to download them through Android Marketplace application which also shows other users’ reviews and ratings. In addition to that, an application is well organized and sorted in categories. Here are some impressive ones I want to show you:</p>
<div style="text-align:center"><span style="font-size: medium"><span style="color: #d99594"><span style="font-family: Cambria"><span style="font-size: medium"><span style="color: #d99594"><span style="font-family: Cambria"><img class="alignnone size-full wp-image-565" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_youtube.jpg" alt="magic_youtube" width="180" height="270" /> <img class="alignnone size-full wp-image-566" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_news_reader.jpg" alt="magic_news_reader" width="180" height="270" /> <img class="alignnone size-full wp-image-567" src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_album.jpg" alt="magic_album" width="179" height="270" /><br />
</span></span></span></span></span></span>YouTube, news reader, and photo album on the HTC Magic</div>
<p> </p>
<div style="text-align:center"><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_satellite.jpg" alt="magic_satellite" width="177" height="265" /> <img src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_google_maps.jpg" alt="magic_google_maps" width="174" height="261" /><br />
Google maps on the HTC magic</div>
<p> </p>
<p style="text-align: left">Windows Mobile might have long been around on the mobile market. However, up until now, you might not see well-developed and powerful applications as you first expected. Also, installing software is a real pain. Many vendors might serve you with .cab files while some others allow installation through your desktop computer. The nice thing is that it’s equipped with a very good navigation system like Garmin Mobile XT.</p>
<div style="text-align: center"><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_photo.jpg" alt="touch_hd_photo" width="162" height="269" /> <img src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_email.jpg" alt="touch_hd_email" width="160" height="269" /> <img src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_garmin.jpg" alt="touch_hd_garmin" width="161" height="270" /><br />
Photos and videos, Mail and Garmin mobile XT on the Touch HD</div>
<p> </p>
<p>Simply speaking, either short term or medium term Android would give you better applications than Windows Mobile in term of its usability and performance. This should be seriously taken into consideration when you plan to get a new mobile phone. So, Magic has got to be winner here.</p>
<h3>Openness</h3>
<p>Surely, openness is the key strength of the HTC Magic, running on Android is what all developers have been waiting for. The ability to access most parts of the OS allows you to have more control over the hardware. For example, users might be able to hook up with its dialer’s api to capture some information of each call or even customize the way its LED displays.</p>
<p>Unlike the Magic, Windows Mobile does not allow you to do so.  Thus you can only do whatever their api provides. Moreover, its interface shell, touchFlo 3D, will not allow you to customize things the way you want them to be.</p>
<h3>Browsing</h3>
<p>The Android is equipped with the webkit browser that serves the basic needs for surfing the internet. You might find that the user interface is smooth and clean. Pages load quickly, and render perfectly with it.  The browser comes with an user-friendly and efficient bookmark system. However, there are a few shortcomings such as lacking flash support and the zoom-in and zoom-out sometimes having problem with texts, etc.</p>
<div style="text-align: center"><img src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_webkit.gif" alt="magic_webkit" width="259" height="173" /> <img src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_page_switch.jpg" alt="magic_page_switch" width="171" height="256" /><br />
Browsing has never been this easy with Android</div>
<p> </p>
<p style="text-align: left">For the good use of HSDPA 3G, HTC Touch HD has bundled Opera web browser which many Windows Mobile users would come to love. It offers great internet experience and with the latest version of Opera, you will be able to play YouTube and Streaming video on the web page. Double-tap the screen is for a quick zoom-in and zoom-out. It seems like HTC tries to obsolete the pocket IE in favor of Opera, as it now serves as the default web browser.</p>
<div style="text-align: center"><img class="aligncenter" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_opera.jpg" alt="touch_hd_opera" width="160" height="266" /><br />
The Touch HD bundled Opera 9.5</div>
<p> </p>
<p style="text-align: left">Overall the Touch HD&#8217;s Opera at this point is very impressive for its rich and satisfying mobile internet experience. On the other hand, the Magic&#8217;s webkit browser also does a very good job when it come to multi-page browsing, rendering speed, and accuracy.</p>
<h3>Multi-Media</h3>
<p><span>The Touch HD is a stellar multi-media phone with HTC’s bundled media player and standard Windows media player. All these enable playing all file formats without any problem. <span> </span>It really provides excellent audio experience. <span> </span>And, watching movie on the device is far more favourable when compared to the other devices I ever tested.</span></p>
<p><span>The Magic, on the other hand, is on par with many other touch-screen phones currently available in the market in term of multimedia capabilities. <span> </span>The only downside is that the Magic is still lacking support for many current standard multi-media file formats. It only supports MP4 and 3GP.</span></p>
<div style="text-align: center"> <img src="http://www.webdevbros.net/wp-content/uploads/2009/08/magic_music_player.jpg" alt="magic_music_player" width="163" height="243" /> <img class="alignnone size-full wp-image-584" src="http://www.webdevbros.net/wp-content/uploads/2009/08/touch_hd_music_player.jpg" alt="touch_hd_music_player" width="146" height="243" /><br />
The music player of the HTC Magic (left) and Touch HD’s (right)</div>
<p> </p>
<h3>Connectivity</h3>
<p>I tested Wifi connectivity on both the Touch HD and the Magic, these two gadgets show a very good performance. Unfortunately, in Thailand where I do this review, 3G network is not available yet, I tested them on existing 2.5 G network.</p>
<p>There is one shortcoming of the Magic; its Wifi won’t always stay connected even if its option has been set to maintain Wifi connection. This only happens when the device is gone into idle mode.</p>
<h2>Conclusion</h2>
<p>To wrap things up, both of them actually consist of advanced features and are great gadgets to use. HTC Magic has a lot of cool features we can talk about such as its full touch-screen support, full customizability and extensive Google integration. Thanks to Google for inventing an awesome OS like Android. For me, HTC Magic is a winner in terms of touch-screen performance, internet device, and hackability.</p>
<p>For the Touch HD, it has become a good choice for smartphones in terms of gateway to multimedia. However, due to its Windows Mobile it has really lagged behind Android, I expect to see major improvement of Windows Mobile in the next 6-8 months, otherwise their market share will climb down significantly.</p>
<p style="text-align: left"><em>Special thanks to Ann and Michal for editing this work.</em></p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/&amp;t=HTC+Magic+VS+HTC+Touch+HD+&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/&amp;title=HTC+Magic+VS+HTC+Touch+HD+&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/&amp;title=HTC+Magic+VS+HTC+Touch+HD+&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=HTC+Magic+VS+HTC+Touch+HD+;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/cP5H61mf-DXOj1X6snEod9SGn6g/0/da"><img src="http://feedads.g.doubleclick.net/~a/cP5H61mf-DXOj1X6snEod9SGn6g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/cP5H61mf-DXOj1X6snEod9SGn6g/1/da"><img src="http://feedads.g.doubleclick.net/~a/cP5H61mf-DXOj1X6snEod9SGn6g/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=u0MMx_10oMg:OjpDR-BpWC4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=u0MMx_10oMg:OjpDR-BpWC4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=u0MMx_10oMg:OjpDR-BpWC4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=u0MMx_10oMg:OjpDR-BpWC4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=u0MMx_10oMg:OjpDR-BpWC4:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/u0MMx_10oMg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/08/21/htc-touch-magic-vs-htc-touch-hd/</feedburner:origLink></item>
		<item>
		<title>Testing code changes, bugfixes, new features, …</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/NOqmzSh78WU/</link>
		<comments>http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 23:00:52 +0000</pubDate>
		<dc:creator>Michal</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[general stuff]]></category>
		<category><![CDATA[programming style]]></category>

		<guid isPermaLink="false">http://fabiankoehler.de/wdb/?p=14</guid>
		<description><![CDATA[When you implement a new feature somewhere, when you change just some bits of your code, when you fix a bug, or you just change a common text in an app&#8230; What do you do afterwards? Do you really check the result or do you trust yourself that it works fine 100%. It is an [...]]]></description>
			<content:encoded><![CDATA[<p>When you implement a new feature somewhere, when you change just some bits of your code, when you fix a bug, or you just change a common text in an app&#8230; What do you do afterwards? Do you really check the result or do you trust yourself that it works fine 100%. It is an interesting thing to talk about…<span id="more-14"></span></p>
<p>I have to be honest and admit that I trusted myself a lot of times in the early days and at least 2 of 10 times I was wrong. If you deal with customers then it&#8217;s two times too much. Especially when you have that guy on the phone and you claim that you did change it, but he is browsing the application and does not see any changes. In that case you&#8217;re really pissed because you haven&#8217;t spent one minute to check the result/consequence of your change.</p>
<p>So that&#8217;s why I always suggest to check EVERYTHING that has been changed. You never know what you forget, but when you get sure that you see the change yourself then you&#8217;re on the safe side. Here is a list what you could not have thought about:</p>
<ul>
<li>you have been working in the wrong file. The file you have been working on was just a backup, in the wrong location, wrong server, etc. Such things happen everyday. </li>
<li>you forgot to refresh/restart some service, application, etc. </li>
<li>forgot to publish the file. This is common but i am sure it happens as well. For instance you forgot to upload the file on the server if its a web app. </li>
<li>forgot to compile. for all out there who need to do this. </li>
<li>last but not least programing failures which you haven&#8217;t thought about (especially when you are changing code of others you should 100% check the effect of the change even if it&#8217;s just a typo): you changed the wrong part of the code. Happens usually when there are duplicate pieces of code, which in turn happens because of bad programming style (think of the DRY principle).
</li>
</ul>
<p>Hence it&#8217;s highly recommended to check EVERY change. You save yourself and others a lot of troubles and iterations of changing and testing. Personally I think that this is a programmers quality characteristic and that it&#8217;s not a tall order to expect a check of the change. In most cases it&#8217;s less than a minute. Don&#8217;t get lazy …. For sure everybody does, but be aware of all the points I mentioned above. </p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/&amp;t=Testing+code+changes%2C+bugfixes%2C+new+features%2C+%E2%80%A6&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/&amp;title=Testing+code+changes%2C+bugfixes%2C+new+features%2C+%E2%80%A6&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/&amp;title=Testing+code+changes%2C+bugfixes%2C+new+features%2C+%E2%80%A6&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Testing+code+changes%2C+bugfixes%2C+new+features%2C+%E2%80%A6;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/SZsIgAG7UsLsyVDvqoFrGuYZ-a0/0/da"><img src="http://feedads.g.doubleclick.net/~a/SZsIgAG7UsLsyVDvqoFrGuYZ-a0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SZsIgAG7UsLsyVDvqoFrGuYZ-a0/1/da"><img src="http://feedads.g.doubleclick.net/~a/SZsIgAG7UsLsyVDvqoFrGuYZ-a0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=NOqmzSh78WU:HGT4FGeFOCo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=NOqmzSh78WU:HGT4FGeFOCo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=NOqmzSh78WU:HGT4FGeFOCo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=NOqmzSh78WU:HGT4FGeFOCo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=NOqmzSh78WU:HGT4FGeFOCo:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/NOqmzSh78WU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/08/20/testing-a-change-bugfix-implemented-feature-%e2%80%a6/</feedburner:origLink></item>
		<item>
		<title>Flex Style Introspection</title>
		<link>http://feedproxy.google.com/~r/WebDevBros/~3/E2CNnA-X7_s/</link>
		<comments>http://www.webdevbros.net/2009/08/16/flex-style-introspection/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 15:31:48 +0000</pubDate>
		<dc:creator>julien</dc:creator>
				<category><![CDATA[general stuff]]></category>

		<guid isPermaLink="false">http://www.webdevbros.net/?p=527</guid>
		<description><![CDATA[If you have ever used the Flex introspection method describeType(), you certainly have noticed it doesn't output any style metadata. The only way I found so far was to instantiate the UIComponent type I'm looking at and call the function regenerateStyleCache(false). The entire list of available styles is then accessible via the properties inheritingStyles and [...]]]></description>
			<content:encoded><![CDATA[<p>If you have ever used the Flex introspection method <code>describeType()</code>, you certainly have noticed it doesn't output any style metadata. The only way I found so far was to instantiate the <code>UIComponent</code> type I'm looking at and call the function <code>regenerateStyleCache(false)</code>. The entire list of available styles is then accessible via the properties <code>inheritingStyles</code> and <code>nonInheritingStyles</code>. Generating the style cache is computation-intensive so like most reflection and introspection operations make effective use of it :)</p>
<p>Some code example after the jump... <span id="more-527"></span></p>
<div class="igBar"><span id="lactionscript-2"><a href="#" onclick="javascript:showCodeTxt('actionscript-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">Actionscript:</span>
<div id="actionscript-2">
<div class="actionscript">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#767676;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> componentClass:<span style="color: #000000; font-weight: bold;">Class</span> = getDefinitionByName<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"mx.controls.CheckBox"</span><span style="color: #66cc66;">&#41;</span> as <span style="color: #000000; font-weight: bold;">Class</span>;</div>
</li>
<li style="font-weight: bold;color:#767676;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">var</span> component:UIComponent = <span style="color: #000000; font-weight: bold;">new</span> componentClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#767676;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">component.<span style="color: #006600;">regenerateStyleCache</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">false</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#767676;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>ObjectUtil.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span>component.<span style="color: #006600;">nonInheritingStyles</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#767676;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>ObjectUtil.<span style="color: #0066CC;">toString</span><span style="color: #66cc66;">&#40;</span>component.<span style="color: #006600;">inheritingStyles</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>will output...</p>
<p><code><br />
(Object)#0<br />
  backgroundAlpha = 1<br />
  backgroundSize = "auto"<br />
  bevel = true<br />
  borderAlpha = 1<br />
  borderCapColor = 9542041<br />
  borderColor = 12040892<br />
  borderSides = "left top right bottom"<br />
  borderSkin = (mx.skins.halo::HaloBorder)<br />
  borderStyle = "inset"<br />
  borderThickness = 1<br />
  buttonColor = 7305079<br />
  closeDuration = 250<br />
  color = 734012<br />
  cornerRadius = 4<br />
  disabledColor = 11187123<br />
  disabledIcon = (null)<br />
  disabledIconColor = 10066329<br />
  disabledSkin = (null)<br />
  downIcon = (null)<br />
  downSkin = (null)<br />
  dropShadowColor = 0<br />
  dropShadowEnabled = false<br />
  embedFonts = false<br />
  errorColor = 16711680<br />
  fillAlphas = (Array)#1<br />
    [0] 0.6<br />
    [1] 0.4<br />
    [2] 0.75<br />
    [3] 0.65<br />
  fillColor = 16777215<br />
  fillColors = (Array)#2<br />
    [0] 16777215<br />
    [1] 13421772<br />
    [2] 16777215<br />
    [3] 15658734<br />
  filled = true<br />
  focusAlpha = 0.4<br />
  focusBlendMode = "normal"<br />
  focusRoundedCorners = "tl tr bl br"<br />
  focusSkin = (mx.skins.halo::HaloFocusRect)<br />
  focusThickness = 2<br />
  fontAntiAliasType = "advanced"<br />
  fontFamily = "Verdana"<br />
  fontGridFitType = "pixel"<br />
  fontSharpness = 0<br />
  fontSize = 10<br />
  fontStyle = "normal"<br />
  fontThickness = 0<br />
  fontWeight = "normal"<br />
  highlightAlphas = (Array)#3<br />
    [0] 0.3<br />
    [1] 0<br />
  horizontalAlign = "left"<br />
  horizontalGap = 5<br />
  horizontalGridLineColor = 16250871<br />
  horizontalGridLines = false<br />
  icon = (mx.skins.halo::CheckBoxIcon)<br />
  iconColor = 2831164<br />
  indentation = 17<br />
  indicatorGap = 14<br />
  kerning = false<br />
  leading = 2<br />
  letterSpacing = 0<br />
  modalTransparency = 0.5<br />
  modalTransparencyBlur = 3<br />
  modalTransparencyColor = 14540253<br />
  modalTransparencyDuration = 100<br />
  openDuration = 250<br />
  overIcon = (null)<br />
  overSkin = (null)<br />
  paddingBottom = 2<br />
  paddingLeft = 0<br />
  paddingRight = 0<br />
  paddingTop = 2<br />
  repeatDelay = 500<br />
  repeatInterval = 35<br />
  roundedBottomCorners = true<br />
  selectedDisabledIcon = (null)<br />
  selectedDisabledSkin = (null)<br />
  selectedDownIcon = (null)<br />
  selectedDownSkin = (null)<br />
  selectedOverIcon = (null)<br />
  selectedOverSkin = (null)<br />
  selectedUpIcon = (null)<br />
  selectedUpSkin = (null)<br />
  selectionDisabledColor = 14540253<br />
  selectionDuration = 250<br />
  shadowCapColor = 14015965<br />
  shadowColor = 15658734<br />
  shadowDirection = "center"<br />
  shadowDistance = 2<br />
  skin = (null)<br />
  stroked = false<br />
  strokeWidth = 1<br />
  textAlign = "left"<br />
  textDecoration = "none"<br />
  textIndent = 0<br />
  textRollOverColor = 2831164<br />
  textSelectedColor = 2831164<br />
  themeColor = 40447<br />
  upIcon = (null)<br />
  upSkin = (null)<br />
  useRollOver = true<br />
  version = "3.0.0"<br />
  verticalAlign = "top"<br />
  verticalGap = 2<br />
  verticalGridLineColor = 14015965<br />
  verticalGridLines = true<br />
(Object)#0<br />
  backgroundAlpha = 1<br />
  backgroundSize = "auto"<br />
  bevel = true<br />
  borderAlpha = 1<br />
  borderCapColor = 9542041<br />
  borderColor = 12040892<br />
  borderSides = "left top right bottom"<br />
  borderSkin = (mx.skins.halo::HaloBorder)<br />
  borderStyle = "inset"<br />
  borderThickness = 1<br />
  buttonColor = 7305079<br />
  closeDuration = 250<br />
  color = 734012<br />
  cornerRadius = 4<br />
  disabledColor = 11187123<br />
  disabledIcon = (null)<br />
  disabledIconColor = 10066329<br />
  disabledSkin = (null)<br />
  downIcon = (null)<br />
  downSkin = (null)<br />
  dropShadowColor = 0<br />
  dropShadowEnabled = false<br />
  embedFonts = false<br />
  errorColor = 16711680<br />
  fillAlphas = (Array)#1<br />
    [0] 0.6<br />
    [1] 0.4<br />
    [2] 0.75<br />
    [3] 0.65<br />
  fillColor = 16777215<br />
  fillColors = (Array)#2<br />
    [0] 16777215<br />
    [1] 13421772<br />
    [2] 16777215<br />
    [3] 15658734<br />
  filled = true<br />
  focusAlpha = 0.4<br />
  focusBlendMode = "normal"<br />
  focusRoundedCorners = "tl tr bl br"<br />
  focusSkin = (mx.skins.halo::HaloFocusRect)<br />
  focusThickness = 2<br />
  fontAntiAliasType = "advanced"<br />
  fontFamily = "Verdana"<br />
  fontGridFitType = "pixel"<br />
  fontSharpness = 0<br />
  fontSize = 10<br />
  fontStyle = "normal"<br />
  fontThickness = 0<br />
  fontWeight = "normal"<br />
  highlightAlphas = (Array)#3<br />
    [0] 0.3<br />
    [1] 0<br />
  horizontalAlign = "left"<br />
  horizontalGap = 5<br />
  horizontalGridLineColor = 16250871<br />
  horizontalGridLines = false<br />
  icon = (mx.skins.halo::CheckBoxIcon)<br />
  iconColor = 2831164<br />
  indentation = 17<br />
  indicatorGap = 14<br />
  kerning = false<br />
  leading = 2<br />
  letterSpacing = 0<br />
  modalTransparency = 0.5<br />
  modalTransparencyBlur = 3<br />
  modalTransparencyColor = 14540253<br />
  modalTransparencyDuration = 100<br />
  openDuration = 250<br />
  overIcon = (null)<br />
  overSkin = (null)<br />
  paddingBottom = 2<br />
  paddingLeft = 0<br />
  paddingRight = 0<br />
  paddingTop = 2<br />
  repeatDelay = 500<br />
  repeatInterval = 35<br />
  roundedBottomCorners = true<br />
  selectedDisabledIcon = (null)<br />
  selectedDisabledSkin = (null)<br />
  selectedDownIcon = (null)<br />
  selectedDownSkin = (null)<br />
  selectedOverIcon = (null)<br />
  selectedOverSkin = (null)<br />
  selectedUpIcon = (null)<br />
  selectedUpSkin = (null)<br />
  selectionDisabledColor = 14540253<br />
  selectionDuration = 250<br />
  shadowCapColor = 14015965<br />
  shadowColor = 15658734<br />
  shadowDirection = "center"<br />
  shadowDistance = 2<br />
  skin = (null)<br />
  stroked = false<br />
  strokeWidth = 1<br />
  textAlign = "left"<br />
  textDecoration = "none"<br />
  textIndent = 0<br />
  textRollOverColor = 2831164<br />
  textSelectedColor = 2831164<br />
  themeColor = 40447<br />
  upIcon = (null)<br />
  upSkin = (null)<br />
  useRollOver = true<br />
  version = "3.0.0"<br />
  verticalAlign = "top"<br />
  verticalGap = 2<br />
  verticalGridLineColor = 14015965<br />
  verticalGridLines = true<br />
</code></p>
<div><table> <td><iframe src='http://digg.com/api/diggthis.php?w=new&amp;u=http://www.webdevbros.net/2009/08/16/flex-style-introspection/&amp;t=Flex+Style+Introspection&amp;s=normal' height='80' width='52' frameborder='0' scrolling='no'></iframe></td> <td><iframe src='http://www.reddit.com/button_content?newwindow=1&amp;url=http://www.webdevbros.net/2009/08/16/flex-style-introspection/&amp;title=Flex+Style+Introspection&amp;t=2 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><iframe src='http://widgets.dzone.com/links/widgets/zoneit.html?url=http://www.webdevbros.net/2009/08/16/flex-style-introspection/&amp;title=Flex+Style+Introspection&amp;t=1 ' height='80' width='52' scrolling='no' frameborder='0' ></iframe></td> <td><script type="text/javascript"><!--yahooBuzzArticleHeadline=Flex+Style+Introspection;//--></script><script type="text/javascript" src="http://d.yimg.com/ds/badge2.js" badgetype=square></script></td> <td><script type="text/javascript">tweetmeme_url='http://www.webdevbros.net/2009/08/16/flex-style-introspection/'; tweetmeme_style = 'normal';; </script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" ></script></td></table></div><!-- This is a HTML comment, it will not display in any page. Feel free to remove this comment if it cause any inconvenient to you.
	Thanks for using digg digg, please visit http://www.mkyong.com/blog/digg-digg-wordpress-plugin for any comments and ideas, 
	
    Author : Yong Mook Kim
    Website : http://www.mkyong.com
	-->
<p><a href="http://feedads.g.doubleclick.net/~a/ccrqx4K2fsc2hJdc5b7vQaNgINU/0/da"><img src="http://feedads.g.doubleclick.net/~a/ccrqx4K2fsc2hJdc5b7vQaNgINU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ccrqx4K2fsc2hJdc5b7vQaNgINU/1/da"><img src="http://feedads.g.doubleclick.net/~a/ccrqx4K2fsc2hJdc5b7vQaNgINU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WebDevBros?a=E2CNnA-X7_s:gNxdY1vlDrE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WebDevBros?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=E2CNnA-X7_s:gNxdY1vlDrE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=E2CNnA-X7_s:gNxdY1vlDrE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WebDevBros?a=E2CNnA-X7_s:gNxdY1vlDrE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WebDevBros?i=E2CNnA-X7_s:gNxdY1vlDrE:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WebDevBros/~4/E2CNnA-X7_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webdevbros.net/2009/08/16/flex-style-introspection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webdevbros.net/2009/08/16/flex-style-introspection/</feedburner:origLink></item>
	</channel>
</rss>
