Wednesday, June 24, 2009

Goodbye, Blogger.com

Due to the amount of spam this blog is collecting, and the lack of tools to mitigate it effectively, I'm shutting this sucker down. I have migrated everything to a new Wordpress blog at http://blog.nthsense.net. I've updated Feedburner to point to the new blog, so hopefully my subscribers won't be inconvenienced.

It has been a long time since I posted anything here. My focus on this blog has been to share fringe development techniques and hard-to-find workarounds for odd behavior in Flash, JavaScript, and CSS. My interests have evolved somewhat - I'm now working with almost 100% Flex at my job, so I have less to talk about on the HTML/CSS/JavaScript side of things. There are plenty of workarounds I could be sharing on the Flex side, but Adobe evolves the framework quickly enough that my workarounds are obsolete in a fairly short time.

Also, I'm focusing a lot more on iPhone development, which is a totally new area for me. It is going to take some time to build expertise in XCode/Objective C, so I won't have much to share apart from the basics, which there are plenty of resources for.

All that said, big things are coming... so stay tuned.

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Wednesday, February 04, 2009

SWF Scale-Nine Skin Sizing Issue

I beat my brains out over this one for 3 hours the other day. I was skinning a Flex component with a SWF library asset (a MovieClip) that used nine slice scaling. There was a visual gap between the right and bottom sides of the skinned component and its parent. For a while, I thought that this was due to some padding or something being applied to the parent.




To resolve this issue, I did two things in Flash:

1) I converted my border from lines to fills, by going to Modify > Shape > Convert Lines to Fills
2) I made sure to register the upper-left corner of the shape at 0,0.

Easy, but yet so difficult.

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Thursday, July 17, 2008

Awesome - Flash IDE video

Don't know how I missed this, but here it is:

http://www.youtube.com/watch?v=vqMI480D668

Demoing live video, inverse kinematics, and a new tweening model in the upcoming version of the Flash IDE. Enjoy.

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Monday, June 16, 2008

AJAX in ASP .Net - Missing Sys.WebForms.*

So - don't ask me why, but I've been dabbling with AJAX & .Net 2.0. Oh, the shame of it. I just spent two days trying to figure out why my UpdatePanel controls were doing a full refresh of the page instead of only updating the area they encapsulate. It turns out that the required script libraries (.axd files) were not all being rendered into the page. In particular, I was missing Sys.WebForms.PageRequestManager. It took a further two hours to find the following (seemingly irrelevant) blog post:

http://blogs.technet.com/stefan_gossner/archive/2006/01/24/418005.aspx

In a fit of desperation, I tried his suggestion for fixing a completely unrelated problem, and lo, it worketh. Just comment the following out of your web.config:

<xhtmlConformance mode="Legacy" />

Enjoy.

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Wednesday, May 21, 2008

Everything that's new in the Flash Player 10 beta docs

Adobe has released the docs for the Player 10 beta. I went through and made a list that shows you the classes, properties, methods, events, and constants that are new to Flash Player 10.

Enjoy.

adobe.utils.package: MMEndCommand()

Top-Level:
Vector


flash.utils.ByteArray: inflate(), deflate()
flash.ui.MouseCursor
flash.ui.ContextMenuClipboardItems
flash.ui.ContextMenu: clipboardItems, clipboardMenu, link
flash.text.engine.*
flash.system.Capabilities: hasColorCorrection
flash.system.Capabilities: domainMemory, MIN_DOMAIN_MEMORY_LENGTH
flash.net.NetStreamPlayTransitions
flash.net.NetStreamPlayOptions
flash.net.NetStreamInfo
flash.net.NetConnection: farID, farNonce, maxPeerConnections, nearID, nearNonce, protocol, unconnectedPeerStreams
flash.net.FileReference: data, load(), save()
flash.media.SoundCodec
flash.media.Sound: extract(), sampleData
flash.media.Microphone: codec, encodeQuality, framesPerPacket
flash.geom.Vector3D
flash.geom.Utils3D
flash.geom.Transform: matrix3D, perspectiveProjection, getRelativeMatrix3D()
flash.geom.PerspectiveProjection
flash.geom.Orientation3D
flash.geom.Matrix3D
flash.filters.ShaderFilter
flash.events.ShaderEvent
flash.events.Event: CLEAR, COPY, CUT, PASTE, SAMPLE_DATA, SELECT_ALL
flash.display.Stage: enableColorCorrection
flash.display.ShaderPrecision
flash.display.ShaderParameterType
flash.display.ShaderParameter
flash.display.ShaderJob
flash.display.ShaderInput
flash.display.ShaderData
flash.display.Shader
flash.display.MovieClip: currentFrameLabel
flash.display.InteractiveObject: clear (event), copy (event), cut (event), paste (event), selectAll (event)
flash.display.Graphics: beginShaderFill()
flash.display.DisplayObject: blendShader, rotationX, rotationY, rotationZ, z, globalToLocal3D(), local3DToGlobal()
flash.display.BlendMode: SHADER
flash.display.BitmapData: histogram
flash.desktop.ClipboardTransferMode
flash.desktop.ClipboardFormats
flash.desktop.Clipboard

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Thursday, April 17, 2008

Here's a New One

This was emitted from a Flex swf I was working on today:


Error: The SystemManager constructor was called when the currentFrame was at 2 Please add this SWF to bug 129782.
at mx.managers::SystemManager()
at _EmbeddingImagesScale9_mx_managers_SystemManager()



Never seen that before. Good times.

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.

Wednesday, April 16, 2008

Adobe's Coding Conventions Leave Me Asking "Why??"

I just took a quick first pass through Adobe's newly-published Flex Coding Conventions, and while I agree with much of what is in there, a few items leave me scratching my head. I think it would have been useful for them to offer some sort of rationale behind the recommendations, not just "do this, not that" mandates. By way of a few examples:

Use Array literals rather than new Array().

Isn't "new Array()" more consistent with the way every other kind of object is instantiated? "[]" is a shorthand syntax - I have found shorthand generally to be something to be avoided, because it requires a deeper familiarity with a language than a generalist programmer would possess. I raise the same objection to the recommendations for using Object literals, RegExp literals, and so forth. Consistency is key.

Don't use unnecessary parentheses with common operators such as +, -, *, /, &&, ||, <, <=, >, >=, ==, and !=.

I favor explicit groups, not implicit ones. In my opinion, this: var e:Number = (a * b) / (c + d); is better than this: var e:Number = a * b / (c + d); because it removes ambiguity over whether b is divided by (c + d) or a * b is divided by (c + d).

If the various branches of an if/else statement involve single statements, don't make them into blocks.

This just makes your code less readable, and introduces an inconsistency in the way the syntax is written. Why have a special case for branches that contain a single statement? This feels more like the personal preference of an experienced developer than a bona fide "best practice" for teams. Indeed, the recommendation for "while" statements is exactly the opposite.

Use int for integers, even if they can't be negative. Use uint only for RGB colors, bit masks, and other non-numeric values.

Why???? What's the point in having a uint if you're only going to use it for things other than unsigned integers?




These are just a few that jumped out at me, because they seemed arbitrary exceptions to the norm. "Best practices" should promote a coding standard that favors minimal variation in syntax over quick coding time, easy understanding over minor performance gains, etc. Overall, I think they're on the right track - but if they're going to create all kinds of exceptions to their own rules, they should provide more explanation.

One more - this is just whack:

var a:Array /* of String */ = [];

The language does not support typed arrays. If you need a typed array, extend ArrayCollection and add your own type-checking. Cluttering up your code with comments like this doesn't offer any compile-time type-checking, and is much less readable than var a:MovieClipArray = new MovieClipArray();

Was this post helpful to you? If so, please consider making a small donation to keep this blog going.