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

<channel>
	<title>flex.mentalaxis.com</title>
	<atom:link href="http://flex.mentalaxis.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://flex.mentalaxis.com</link>
	<description>Some serious Flex™</description>
	<lastBuildDate>Fri, 22 Jan 2010 22:10:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flex4 Arc class (for Beta 2)</title>
		<link>http://flex.mentalaxis.com/2009/12/18/flex4-arc-class-for-beta-2/</link>
		<comments>http://flex.mentalaxis.com/2009/12/18/flex4-arc-class-for-beta-2/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 22:27:35 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=94</guid>
		<description><![CDATA[The Wedge FilledElement for Flex4 previously posted is not compatible with Flex4 Beta2.

The updated class (called Arc) is as follows.




package 
{
	import flash.display.Graphics;
	
	import spark.primitives.Ellipse;
	
	public class Arc extends Ellipse
	{
		public function Arc()
		{
			super();
		}
		
		private var _angle:Number = 0;
		
		[Inspectable(category=&#34;General&#34;)]
		/**
		 * Start angle for the wedge, in degrees. Zero degrees is 3 O'clock, or East.
		 */
		public function get angle():Number
		{
			return _angle;
		}
		
		public function set [...]]]></description>
			<content:encoded><![CDATA[<p>The Wedge FilledElement for Flex4 previously posted is not compatible with Flex4 Beta2.</p>

<p>The updated class (called Arc) is as follows.</p>



<pre name="code" class="javascript" >
package 
{
	import flash.display.Graphics;
	
	import spark.primitives.Ellipse;
	
	public class Arc extends Ellipse
	{
		public function Arc()
		{
			super();
		}
		
		private var _angle:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Start angle for the wedge, in degrees. Zero degrees is 3 O'clock, or East.
		 */
		public function get angle():Number
		{
			return _angle;
		}
		
		public function set angle(value:Number):void
		{
			if (value != _angle)
			{
				_angle = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		private var _arc:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Arc angle for the wedge, in degrees.
		 */
		public function get arc():Number
		{
			return _arc;
		}
		
		public function set arc(value:Number):void
		{
			if (value != _arc)
			{
				_arc = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		private var _thickness:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Thickness of the wedge, measured inward from radius. 
		 */
		public function get thickness():Number
		{
			return _thickness;
		}
		
		public function set thickness(value:Number):void
		{
			if (value != _thickness)
			{
				_thickness = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		private var _radius:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Exterior radius of the wedge
		 */
		public function get radius():Number
		{
			return _radius;
		}
		
		public function set radius(value:Number):void
		{
			if (value != _radius)
			{
				_radius = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		
		override protected function draw(g:Graphics):void
		{
			var xo:Number = drawX + (width/2);
			var yo:Number = drawY + (width/2);
			
			var workingArc:Number = _arc;
			// limit sweep to reasonable numbers
			if (Math.abs(workingArc) &gt; 360)
				workingArc = 360;
			
			// Flash uses 8 segments per circle, to match that, we draw in a maximum
			// of 45 degree segments. First we calculate how many segments are needed
			// for our arc.
			var segs:Number = Math.ceil(Math.abs(workingArc) / 45);
			
			// Now calculate the sweep of each segment.
			var segAngle_a:Number = workingArc / segs
			var segAngle_b:Number = -workingArc / segs;
			
			// The math requires radians rather than degrees. To convert from degrees
			// use the formula (degrees/180)*Math.PI to get radians.
			var theta_a:Number = -(segAngle_a / 180) * Math.PI;
			var theta_b:Number = -(segAngle_b / 180) * Math.PI;
			
			// convert angle workingAngle to radians
			var workingAngle:Number = _angle;
			var angle:Number = -(workingAngle / 180) * Math.PI;
			
			// draw the curve in segments no larger than 45 degrees.
			if (segs &gt; 0)
			{
				// draw a line from the end of the interior curve to the start of the exterior curve
				var workingRadius:Number = _radius;
				var ax:Number = xo + Math.cos(workingAngle / 180 * Math.PI) * workingRadius;
				var ay:Number = yo + Math.sin(-workingAngle / 180 * Math.PI) * workingRadius;
				g.moveTo(ax, ay);
				
				// Loop for drawing exterior  curve segments
				for (var i:int = 0; i &lt; segs; i++)
				{
					angle += theta_a;
					var angleMid:Number;
					angleMid = angle - (theta_a / 2);
					var bx:Number = xo + Math.cos(angle) * workingRadius;
					var by:Number = yo + Math.sin(angle) * workingRadius;
					var cx:Number = xo + Math.cos(angleMid) * (workingRadius / Math.cos(theta_a / 2));
					var cy:Number = yo + Math.sin(angleMid) * (workingRadius / Math.cos(theta_a / 2));
					g.curveTo(cx, cy, bx, by);
				}
				
				// draw a line from the end of the exterior curve to the start of the interior curve
				workingAngle += workingArc;
				angle = -(workingAngle / 180) * Math.PI;
				
				// draw the interior (subtractive) wedge
				// draw a line from the center to the start of the interior curve
				var interiorRadius:Number = workingRadius - _thickness;
				var dx:Number = xo + Math.cos(workingAngle / 180 * Math.PI) * interiorRadius;
				var dy:Number = yo + Math.sin(-workingAngle / 180 * Math.PI) * interiorRadius;
				g.lineTo(dx, dy);
				
				// Loop for drawing interior curve segments
				for (i = 0; i &lt; segs; i++)
				{
					angle += theta_b;
					angleMid = angle - (theta_b / 2);
					bx = xo + Math.cos(angle) * interiorRadius;
					by = yo + Math.sin(angle) * interiorRadius;
					cx = xo + Math.cos(angleMid) * (interiorRadius / Math.cos(theta_b / 2));
					cy = yo + Math.sin(angleMid) * (interiorRadius / Math.cos(theta_b / 2));
					g.curveTo(cx, cy, bx, by);
				}
				g.lineTo(ax, ay);
			}
		}
		
	}
}
</pre>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/12/18/flex4-arc-class-for-beta-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Re-Blog: You don&#8217;t know jack about software maintenance.</title>
		<link>http://flex.mentalaxis.com/2009/11/19/re-blog-you-dont-know-jack-about-software-maintenance/</link>
		<comments>http://flex.mentalaxis.com/2009/11/19/re-blog-you-dont-know-jack-about-software-maintenance/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 21:18:01 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[maintenance software quality development reblog]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/2009/11/19/re-blog-you-dont-know-jack-about-software-maintenance/</guid>
		<description><![CDATA[I strikes me that, while not 100% relevant to Flex/RIA development, much of what Paul Stachour &#038; David Collier-Brown dig up here from the history of software development, is little known to the current breed of web and Flex developers, I am sure though, that all understand the problem of software maintenance first hand&#8230;

Link to [...]]]></description>
			<content:encoded><![CDATA[<p>I strikes me that, while not 100% relevant to Flex/RIA development, much of what Paul Stachour &#038; David Collier-Brown dig up here from the history of software development, is little known to the current breed of web and Flex developers, I am sure though, that all understand the problem of software maintenance first hand&#8230;</p>

<p><a href="http://cacm.acm.org/magazines/2009/11/48444-you-dont-know-jack-about-software-maintenance/fulltext">Link to full article&#8230;</a></p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/11/19/re-blog-you-dont-know-jack-about-software-maintenance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flex 4 Wedge</title>
		<link>http://flex.mentalaxis.com/2009/09/18/flex-4-wedge/</link>
		<comments>http://flex.mentalaxis.com/2009/09/18/flex-4-wedge/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 16:20:47 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=83</guid>
		<description><![CDATA[I&#8217;ve created a wedge element for Flex4 which you may like to use for your projects, it&#8217;s a subclass of FilledElement from the new Spark framework, which already provides Ellipse and Rect primitives. The wedge will draw pie wedges of any radius, arc and start angle, you can also set thickness to create ring wedges, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve created a wedge element for Flex4 which you may like to use for your projects, it&#8217;s a subclass of FilledElement from the new Spark framework, which already provides Ellipse and Rect primitives. The wedge will draw pie wedges of any radius, arc and start angle, you can also set thickness to create ring wedges, as you can see here.</p>

<p><a href="http://mentalaxis.com/wedgedemo/" target="_blank"><img src="http://imgur.com/Go6nd.jpg" alt="Wedge Demo screen" /></a></p>

<div style="clear:both;"></div>

<p>You can <a href="http://mentalaxis.com/wedgedemo/" target="_blank">download the code and the wedge demo application from the View Source panel on the demo page.</a></p>

<p>The Wedge class code is as follows.</p>



<pre name="code" class="javascript" >
package com.mentalaxis.view.draw
{
	
	import flash.display.Graphics;
	import flash.geom.Matrix;
	import flash.geom.Point;
	
	import mx.utils.MatrixUtil;
	
	import spark.primitives.supportClasses.FilledElement;
	
	/**
	 * &lt;p&gt;Draws a wedge shape using these parameters&lt;/p&gt; 
	 * 
	 * &lt;li&gt;angle (degrees, 0 = 3O'Clock or Compass East)&lt;/li&gt; 
	 * &lt;li&gt;arc (degrees)&lt;/li&gt;
	 * &lt;li&gt;thickness (pixels)&lt;/li&gt;
	 * &lt;li&gt;radius (pixels)&lt;/li&gt;
	 * 
	 * &lt;p&gt;position, width and height determine the bounding area of the wedge 
	 * the wedge radius is measured from the center of this bounding area.&lt;/p&gt; 
	 */
	public class Wedge extends FilledElement
	{
		
		//--------------------------------------------------------------------------
		//
		//  Constructor
		//
		//--------------------------------------------------------------------------
		
		/**
		 *  Wedge Constructor
		 *
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion Flex 4
		 */
		public function Wedge()
		{
			super();
		}
		
		//--------------------------------------------------------------------------
		//
		//  Properties
		//
		//--------------------------------------------------------------------------
		private var _angle:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Start angle for the wedge, in degrees. Zero degrees is 3 O'clock, or East.
		 */
		public function get angle():Number
		{
			return _angle;
		}
		
		public function set angle(value:Number):void
		{
			if (value != _angle)
			{
				_angle = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		private var _arc:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Arc angle for the wedge, in degrees.
		 */
		public function get arc():Number
		{
			return _arc;
		}
		
		public function set arc(value:Number):void
		{
			if (value != _arc)
			{
				_arc = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		private var _thickness:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Thickness of the wedge, measured inward from radius. 
		 */
		public function get thickness():Number
		{
			return _thickness;
		}
		
		public function set thickness(value:Number):void
		{
			if (value != _thickness)
			{
				_thickness = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		private var _radius:Number = 0;
		
		[Inspectable(category=&quot;General&quot;)]
		/**
		 * Exterior radius of the wedge
		 */
		public function get radius():Number
		{
			return _radius;
		}
		
		public function set radius(value:Number):void
		{
			if (value != _radius)
			{
				_radius = value;
				invalidateSize();
				invalidateDisplayList();
				invalidateParentSizeAndDisplayList();
			}
		}
		
		//--------------------------------------------------------------------------
		//
		//  Overridden methods
		//
		//--------------------------------------------------------------------------
		
		/**
		 *  @private
		 */
		override protected function transformWidthForLayout(width:Number, height:Number, postLayoutTransform:Boolean = true):Number
		{
			if (postLayoutTransform)
			{
				var m:Matrix = computeMatrix();
				if (m)
					width = MatrixUtil.getEllipseBoundingBox(width / 2, height / 2, width / 2, height / 2, m).width;
			}
			
			// Take stroke into account
			return width + getStrokeExtents().x;
		}
		
		/**
		 *  @private
		 */
		override protected function transformHeightForLayout(width:Number, height:Number, postLayoutTransform:Boolean = true):Number
		{
			if (postLayoutTransform)
			{
				var m:Matrix = computeMatrix();
				if (m)
					height = MatrixUtil.getEllipseBoundingBox(width / 2, height / 2, width / 2, height / 2, m).height;
			}
			
			// Take stroke into account
			return height + getStrokeExtents().y;
		}
		
		/**
		 *  @inheritDoc
		 *
		 *  @langversion 3.0
		 *  @playerversion Flash 9
		 *  @playerversion AIR 1.1
		 *  @productversion Flex 3
		 */
		override public function getBoundsXAtSize(width:Number, height:Number, postLayoutTransform:Boolean = true):Number
		{
			var strokeExtents:Point = getStrokeExtents(postLayoutTransform);
			var m:Matrix = postLayoutTransform ? computeMatrix() : null;
			if (!m)
				return strokeExtents.x * -0.5 + this.x;
			
			if (!isNaN(width))
				width -= strokeExtents.x;
			if (!isNaN(height))
				height -= strokeExtents.y;
			
			// Calculate the width and height pre-transform:
			var newSize:Point = MatrixUtil.fitBounds(width, height, m, preferredWidthPreTransform(), preferredHeightPreTransform(), minWidth, minHeight, maxWidth, maxHeight);
			if (!newSize)
				newSize = new Point(minWidth, minHeight);
			
			return strokeExtents.x * -0.5 + MatrixUtil.getEllipseBoundingBox(newSize.x / 2, newSize.y / 2, newSize.x / 2, newSize.y / 2, m).x;
		}
		
		/**
		 *  @inheritDoc
		 *
		 *  @langversion 3.0
		 *  @playerversion Flash 9
		 *  @playerversion AIR 1.1
		 *  @productversion Flex 3
		 */
		override public function getBoundsYAtSize(width:Number, height:Number, postLayoutTransform:Boolean = true):Number
		{
			var strokeExtents:Point = getStrokeExtents(postLayoutTransform);
			var m:Matrix = postLayoutTransform ? computeMatrix() : null;
			if (!m)
				return strokeExtents.y * -0.5 + this.y;
			
			if (!isNaN(width))
				width -= strokeExtents.x;
			if (!isNaN(height))
				height -= strokeExtents.y;
			
			// Calculate the width and height pre-transform:
			var newSize:Point = MatrixUtil.fitBounds(width, height, m, preferredWidthPreTransform(), preferredHeightPreTransform(), minWidth, minHeight, maxWidth, maxHeight);
			if (!newSize)
				newSize = new Point(minWidth, minHeight);
			
			return strokeExtents.y * -0.5 + MatrixUtil.getEllipseBoundingBox(newSize.x / 2, newSize.y / 2, newSize.x / 2, newSize.y / 2, m).y;
		}
		
		/**
		 *  @private
		 */
		override public function getLayoutBoundsX(postLayoutTransform:Boolean = true):Number
		{
			var stroke:Number = -getStrokeExtents(postLayoutTransform).x * 0.5;
			
			if (postLayoutTransform)
			{
				var m:Matrix = computeMatrix();
				if (m)
					return stroke + MatrixUtil.getEllipseBoundingBox(width / 2, height / 2, width / 2, height / 2, m).x;
			}
			
			return stroke + this.x;
		}
		
		/**
		 *  @private
		 */
		override public function getLayoutBoundsY(postLayoutTransform:Boolean = true):Number
		{
			var stroke:Number = -getStrokeExtents(postLayoutTransform).y * 0.5;
			
			if (postLayoutTransform)
			{
				var m:Matrix = computeMatrix();
				if (m)
					return stroke + MatrixUtil.getEllipseBoundingBox(width / 2, height / 2, width / 2, height / 2, m).y;
			}
			
			return stroke + this.y;
		}
		
		/**
		 * @private 
		 */
		override protected function drawElement(g:Graphics):void
		{
			var xo:Number = drawX + (width/2);
			var yo:Number = drawY + (width/2);
			
			var workingArc:Number = _arc;
			// limit sweep to reasonable numbers
			if (Math.abs(workingArc) &gt; 360)
				workingArc = 360;
			
			// Flash uses 8 segments per circle, to match that, we draw in a maximum
			// of 45 degree segments. First we calculate how many segments are needed
			// for our arc.
			var segs:Number = Math.ceil(Math.abs(workingArc) / 45);
			
			// Now calculate the sweep of each segment.
			var segAngle_a:Number = workingArc / segs
			var segAngle_b:Number = -workingArc / segs;
			
			// The math requires radians rather than degrees. To convert from degrees
			// use the formula (degrees/180)*Math.PI to get radians.
			var theta_a:Number = -(segAngle_a / 180) * Math.PI;
			var theta_b:Number = -(segAngle_b / 180) * Math.PI;
			
			// convert angle workingAngle to radians
			var workingAngle:Number = _angle;
			var angle:Number = -(workingAngle / 180) * Math.PI;
			
			// draw the curve in segments no larger than 45 degrees.
			if (segs &gt; 0)
			{
				// draw a line from the end of the interior curve to the start of the exterior curve
				var workingRadius:Number = _radius;
				var ax:Number = xo + Math.cos(workingAngle / 180 * Math.PI) * workingRadius;
				var ay:Number = yo + Math.sin(-workingAngle / 180 * Math.PI) * workingRadius;
				g.moveTo(ax, ay);
				
				// Loop for drawing exterior  curve segments
				for (var i:int = 0; i &lt; segs; i++)
				{
					angle += theta_a;
					var angleMid:Number;
					angleMid = angle - (theta_a / 2);
					var bx:Number = xo + Math.cos(angle) * workingRadius;
					var by:Number = yo + Math.sin(angle) * workingRadius;
					var cx:Number = xo + Math.cos(angleMid) * (workingRadius / Math.cos(theta_a / 2));
					var cy:Number = yo + Math.sin(angleMid) * (workingRadius / Math.cos(theta_a / 2));
					g.curveTo(cx, cy, bx, by);
				}
				
				// draw a line from the end of the exterior curve to the start of the interior curve
				workingAngle += workingArc;
				angle = -(workingAngle / 180) * Math.PI;
				
				// draw the interior (subtractive) wedge
				// draw a line from the center to the start of the interior curve
				var interiorRadius:Number = workingRadius - _thickness;
				var dx:Number = xo + Math.cos(workingAngle / 180 * Math.PI) * interiorRadius;
				var dy:Number = yo + Math.sin(-workingAngle / 180 * Math.PI) * interiorRadius;
				g.lineTo(dx, dy);
				
				// Loop for drawing interior curve segments
				for (i = 0; i &lt; segs; i++)
				{
					angle += theta_b;
					angleMid = angle - (theta_b / 2);
					bx = xo + Math.cos(angle) * interiorRadius;
					by = yo + Math.sin(angle) * interiorRadius;
					cx = xo + Math.cos(angleMid) * (interiorRadius / Math.cos(theta_b / 2));
					cy = yo + Math.sin(angleMid) * (interiorRadius / Math.cos(theta_b / 2));
					g.curveTo(cx, cy, bx, by);
				}
				g.lineTo(ax, ay);
			}
		}
	}
}
</pre>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/09/18/flex-4-wedge/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ocodo&#8217;s™ happy happy™ brainwash machine™</title>
		<link>http://flex.mentalaxis.com/2009/08/24/ocodos%e2%84%a2-happy-happy%e2%84%a2-brainwash-machine%e2%84%a2/</link>
		<comments>http://flex.mentalaxis.com/2009/08/24/ocodos%e2%84%a2-happy-happy%e2%84%a2-brainwash-machine%e2%84%a2/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 23:44:03 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=80</guid>
		<description><![CDATA[The happy happy brainwash machine. - http://ocodo.id.au/screensaver/lab]]></description>
			<content:encoded><![CDATA[<p>The happy happy brainwash machine. - <a href="http://ocodo.id.au/screensaver/lab">http://ocodo.id.au/screensaver/lab</a></p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/08/24/ocodos%e2%84%a2-happy-happy%e2%84%a2-brainwash-machine%e2%84%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Formatter Update available.</title>
		<link>http://flex.mentalaxis.com/2009/07/09/flex-formatter-update-available/</link>
		<comments>http://flex.mentalaxis.com/2009/07/09/flex-formatter-update-available/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 02:48:51 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[flex]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[formatting]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[mxml]]></category>
		<category><![CDATA[prettyprint]]></category>
		<category><![CDATA[sourcetools]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/2009/07/09/flex-formatter-update-available/</guid>
		<description><![CDATA[Flex Formatter Version 0.6.24 is now available. http://sourceforge.net/projects/flexformatter/]]></description>
			<content:encoded><![CDATA[<p>Flex Formatter Version 0.6.24 is now available. <a href="http://sourceforge.net/projects/flexformatter/">http://sourceforge.net/projects/flexformatter/</a></p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/07/09/flex-formatter-update-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Tools on Del.icio.us</title>
		<link>http://flex.mentalaxis.com/2009/07/06/flex-tools-on-del-icio-us/</link>
		<comments>http://flex.mentalaxis.com/2009/07/06/flex-tools-on-del-icio-us/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 07:58:09 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[as3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=73</guid>
		<description><![CDATA[I&#8217;m collecting useful links for flex developers on del.icio.us/flextools

If you want to send any useful flex development tools or info to the list, add them with your own del.icio.us account and tag them with for:flextools (and anything else useful.)

Thanks.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m collecting useful links for flex developers on <a href="http://del.icio.us/flextools">del.icio.us/flextools</a></p>

<p>If you want to send any useful flex development tools or info to the list, add them with your own del.icio.us account and tag them with <code>for:flextools</code> (and anything else useful.)</p>

<p>Thanks.</p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/07/06/flex-tools-on-del-icio-us/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlexFormatter</title>
		<link>http://flex.mentalaxis.com/2009/07/04/flexformatter/</link>
		<comments>http://flex.mentalaxis.com/2009/07/04/flexformatter/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 14:44:12 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[as3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/2009/07/04/flexformatter/</guid>
		<description><![CDATA[If you are looking for code formatting tools for Flex Builder, scoot over to https://sourceforge.net/projects/flexformatter/ Ernest Pasour has built an excellent set of source code tools for Flex Builder.


	Code Formatter
	Auto Commenting
	Source Code Reordering


The downloaded zip file can be extracted into the eclipse/dropins folder, and it&#8217;ll just work when you restart eclipse. Ernest was also kind [...]]]></description>
			<content:encoded><![CDATA[<p>If you are looking for code formatting tools for Flex Builder, scoot over to <a href="https://sourceforge.net/projects/flexformatter/">https://sourceforge.net/projects/flexformatter/</a> Ernest Pasour has built an excellent set of source code tools for Flex Builder.</p>

<ul>
	<li>Code Formatter</li>
	<li>Auto Commenting</li>
	<li>Source Code Reordering</li>
</ul>

<p>The downloaded zip file can be extracted into the eclipse/dropins folder, and it&#8217;ll just work when you restart eclipse. Ernest was also kind enough to provide instructions for source formatting from the command line, so you can format a whole tree of source code at once.</p>

<p>Great for getting your code painlessly adhering to the Flex Coding Conventions.</p>

<p>FlexFormatter also provides a tool for adding asdoc stub comments, (much like my as3dac tool) and should be easy to use for anyone, (admittedly my scripts aren&#8217;t for the faint hearted.)</p>

<p>The source code re-ordering tool allows you to re sort the appearance of various parts of a class automatically, constant, constructor, class fields, accessors, mutators and methods all sorted for you effortlessly.</p>

<p>It&#8217;s some really great work, and a useful addition to your flex tool set.</p>

<p>(Ernest&#8217;s Flex Formatting <a href="https://sourceforge.net/docman/display_doc.php?docid=138558&amp;group_id=248408">command line usage guide is here</a>)</p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/07/04/flexformatter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AS3 Documentation, Auto Commenting</title>
		<link>http://flex.mentalaxis.com/2009/06/29/as3-documentation-auto-commenting/</link>
		<comments>http://flex.mentalaxis.com/2009/06/29/as3-documentation-auto-commenting/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 11:31:38 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[as3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=29</guid>
		<description><![CDATA[Some time ago I scripted an auto commenting system for ActionScript 2.0, I&#8217;d long planned to upgrade it to ActionScript 3.0, but things tended to get in the way of that, and I kept putting it off.

I began working on a project recently which needed half a dozen AS3 class libraries to be documented, as [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago I scripted an auto commenting system for ActionScript 2.0, I&#8217;d long planned to upgrade it to ActionScript 3.0, but things tended to get in the way of that, and I kept putting it off.</p>

<p>I began working on a project recently which needed half a dozen <span class="caps">AS3 </span>class libraries to be documented, as luck would have it. So I spent some time updating the scripts from <span class="caps">AS2 </span>with NaturalDocs &amp; Doxygen to <span class="caps">AS3 </span>with AsDoc.</p>

<p>In a nutshell, the script will parse an <span class="caps">AS3 </span>class or interface file and add asdoc comment blocks, it will also adhere to the Flex <span class="caps">SDK </span>coding conventions, where there are special cases for doc comments.</p>

<a href=" http://as3dac.googlecode.com">Go over to the google code page http://as3dac.googlecode.com and check it out. </a><br />
<p style="clear:both;"></p>

<a title="AS3dac homepage on google code" href="http://as3dac.googlecode.com" target="_blank"><img title="as3dac-pageview" src="http://flex.mentalaxis.com/wp-content/uploads/2009/06/as3dac-pageview.png" alt="as3dac-pageview" width="400" height="292" /></a>
<p style="clear:both;"></p>

<p>If you are using Windows, you&#8217;ll need to install Cygwin (with Perl.) You should be able to get going on a Mac, Linux or other *nix. See the code project page for details.</p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/06/29/as3-documentation-auto-commenting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Coding Conventions</title>
		<link>http://flex.mentalaxis.com/2009/06/29/flex-coding-conventions/</link>
		<comments>http://flex.mentalaxis.com/2009/06/29/flex-coding-conventions/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 01:27:36 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[as3]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=19</guid>
		<description><![CDATA[Back in April last year I blogged about coding standards in AS3, I wrote a protracted post covering just naming conventions, and of course there have been numerous posts covering this topic, unfortunately the community rarely agrees on such things, and in particular the genetic strain that builds Flash coders seems to be of a [...]]]></description>
			<content:encoded><![CDATA[<p>Back in<a title="as3 naming conventions" href="/2008/04/10/actionscript-30-naming-conventions/" target="_self"> April last year I blogged about coding standards in <span class="caps">AS3</span></a>, I wrote a protracted post covering just naming conventions, and of course there have been numerous posts covering this topic, unfortunately the community rarely agrees on such things, and in particular the genetic strain that builds Flash coders seems to be of a particularly stubborn variety. Of course, I&#8217;m just kidding, all developers are stubborn.</p>

<p>Finally, (well back in March, it seems I&#8217;m fashionably late to this party.) The <a title="Flex SDK Coding Standards." href="http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions" target="_blank">Adobe Flex team introduced a set of standards that should be adhered to for contributions to the Flex <span class="caps">SDK</span></a>.</p>

<p>There are a few points which will make widespread adoption of the standards (for use in general.) a little problematic for some developers. The 2 most significant points are these.</p>

<h2>The odd Inconsistency.</h2>

<p>For a one line <strong>if</strong> statement, the guidelines stipulate that the following line, after the <strong>if</strong>, <strong>else</strong>, <strong>elseif</strong>, should not be enclosed in 
<strong>{ </strong>..<strong> }</strong> - see below.</p>



<pre name="code" class="javascript">
// Single command if
if (myCondition)
    trace(myCondition);

// if else with 1 and 2 line commands
if (myCondition)
{
    trace(myCondition);
}
else
{
    i++;
    trace(myCondition);
}

// Single command for loop
for (var i:int = 0; i &amp;lt; n; i++)
{
    trace(i);
}

// Single command while loop
while ( !flag )
{
    trace(flag);
}
</pre>



<p>Since this pattern doesn&#8217;t apply to any other structure, (e.g. <strong>for</strong>, <strong>while</strong> etc.) and since it is inconsistency we are fighting when we use code standards, this really shouldn&#8217;t be a convention.</p>

<h2>Brace wars&#8230;</h2>

<p>The strategy that must be followed for bracing blocks is aligned braces. For example&#8230;</p>



<pre name="code" class="javascript">
for (var i:int = 0; i &amp;lt; n; i++)
{
    trace(i);
}
</pre>



<p>This strategy has caused a few <span class="caps">AS3 </span>developers to turn a slight shade of blue, I won&#8217;t repeat the complaints, they are, I&#8217;m sorry to say, redundant. The braces war has raged for far longer than the history of actionscript, and there isn&#8217;t a true and right way, both methods have benefits. The Flex team has chosen this strategy, as a professional developer, you should, no, actually, you must follow it.</p>

<p>Just incase you need a bit of rationale, (and trust me, I generally adopted the compressed format prior to the standards announcement.) The opened brace format or <span class="caps">BSD </span>style, is beneficial for the following reasons.</p>

<ul>
	<li>Generally improved readability due to the additional white space.</li>
	<li>Block start and end points, are specifically easier to see due to the uniform alignment of braces with their partner.</li>
</ul>

<p>There are other benefits but these are the primary ones. Of course you may have contrary opinions about brace style, and of course, so could I, but so what? Follow the standard kiddo.</p>

<h2>Notable omission.</h2>

<p>There is only one omission that I can think is worth mentioning, it also covers a variety of cases, this is the stipulation that 80 columns should be the maximum line length, it creates a few situations where we have to line break a single statement. The conventions supply a solution to object and array assignment. However, there are a couple of other cases where this could be a problem, <strong>method signatures</strong> and <strong>complex conditional expressions</strong>. Without an adequate strategy to cover these cases, we have to rely on the Java standard, which has strategies for handling these cases. It would be better for the Flex conventions to provide a solution.</p>

<h2>In conclusion.</h2>

<p>The release of a set of comprehensive standards is a necessary move by Adobe, and long overdue, adoption for the wider community is of course not mandatory, but I would expect developers who consider themselves professional to understand the value of adhering to the standards on all but the most trivial of code.</p>

<p>For the developers who wish to contribute to the Flex <span class="caps">SDK, </span>it is of course mandatory to follow the standards of the project. I hope that work continues on them at some pace, and that we have a complete and clear set of standards to adhere to in the professional development community.</p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/06/29/flex-coding-conventions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Issue tracking for better projects</title>
		<link>http://flex.mentalaxis.com/2009/02/03/issue-tracking-for-better-projects/</link>
		<comments>http://flex.mentalaxis.com/2009/02/03/issue-tracking-for-better-projects/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 10:12:27 +0000</pubDate>
		<dc:creator>Jason Milkins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bugtracking]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[help]]></category>
		<category><![CDATA[issuetracking]]></category>
		<category><![CDATA[jira]]></category>
		<category><![CDATA[projectmanagement]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://flex.mentalaxis.com/?p=7</guid>
		<description><![CDATA[It doesn&#8217;t really matter how small your projects are, they are probably going to get bigger than you think, and soon enough, another project will come along and you&#8217;ll need to look after that one&#8230;

And then what happens? Maybe another project, and another&#8230; and pretty soon things get forgotten and then where are you? In [...]]]></description>
			<content:encoded><![CDATA[<p>It doesn&#8217;t really matter how small your projects are, they are probably going to get bigger than you think, and soon enough, another project will come along and you&#8217;ll need to look after that one&#8230;</p>

<p>And then what happens? Maybe another project, and another&#8230; and pretty soon things get forgotten and then where are you? In trouble probably&#8230;</p>

<p>It&#8217;s a common topic, productivity boosting, you may have heard of Getting Things Done&#8230; you may have some sort of system that you can personally rely on to manage your time and make sure that you and perhaps your whole team, or maybe your organisation can co-operate efficiently and simply.</p>

<p>Or then again, maybe, like many people and organisations you and your colleagues are working on a patchwork of systems, some of which are&#8230; hmm&#8230; let&#8217;s say, not so much, no&#8230; not good.</p>

<p>I&#8217;ve encouraged development teams to use one sort of issue tracking package or another over the last few years, Bugzilla, Jira, Trac and more recently Redmine. Redmine is a fairly new kid on the block compared to the other products, but it&#8217;s looking very promising.</p>

<p>It doesn&#8217;t really matter what you use, because it&#8217;s really about how well you can engineer (socially and technically) the product you decide to use. If you have a strong Eclipse / Flex Builder presence in your team then Trac, Bugzilla and Jira are all very nice due to the Mylyn integration. Mylyn is a sweet Eclipse plugin which really helps to keep developers linked up to the project tracking system, updates and new issues assigned to a developer will pop up as small notifications, and updating an issue is linked directly from the Eclipse platform. Perhaps I&#8217;ll post some more info on mylyn another time.</p>

<p>Sadly, Redmine doesn&#8217;t have much in the way of external interfacing to assist in workflow, but because of it&#8217;s slick interface and very rich feature set, it&#8217;s a very compelling choice too. However if you really need integration through Email or Mylyn or another external tool then go with Trac, Jira or maybe Bugzilla - I suggest you keep your eyes on Redmine too, because there&#8217;s a lot of development happening.</p>

<p>If you have yet to get up and running with a project tracker, it&#8217;s worth your while getting a <a href="http://redmine.org">Redmine</a> installation up  and running and giving it a try. (I&#8217;d recommend the stable.0.7 branch) - but check the Redmine site for the latest development info.</p>]]></content:encoded>
			<wfw:commentRss>http://flex.mentalaxis.com/2009/02/03/issue-tracking-for-better-projects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
